aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux
diff options
context:
space:
mode:
authorMirko Vogt <mirko@openwrt.org>2009-05-10 23:21:54 +0000
committerMirko Vogt <mirko@openwrt.org>2009-05-10 23:21:54 +0000
commitb84dc68bd51760acaa3f7b2d6431b8ec80a40779 (patch)
tree0491222d79766dc864bdd884e7f550299cd4e0c1 /target/linux
parent82f3878ab7ce677b41f29d1c43f5cda1b9d8400a (diff)
downloadmaster-187ad058-b84dc68bd51760acaa3f7b2d6431b8ec80a40779.tar.gz
master-187ad058-b84dc68bd51760acaa3f7b2d6431b8ec80a40779.tar.bz2
master-187ad058-b84dc68bd51760acaa3f7b2d6431b8ec80a40779.zip
add support for kernel 2.6.29 (rc3) by a patch based on the Openmoko patchset (git rev. f656a97d946a2529630c9770a72c10a24dc397f9) adjusted to work within the OpenWrt environment
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@15764 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux')
-rw-r--r--target/linux/s3c24xx/Makefile2
-rw-r--r--target/linux/s3c24xx/config-2.6.29587
-rw-r--r--target/linux/s3c24xx/patches-2.6.29/000-downgrade-to-rc3.patch170300
-rw-r--r--target/linux/s3c24xx/patches-2.6.29/001-merge-openmoko.patch96426
-rw-r--r--target/linux/s3c24xx/patches-2.6.29/002-call-preinit-instead-of-init.patch10
5 files changed, 267324 insertions, 1 deletions
diff --git a/target/linux/s3c24xx/Makefile b/target/linux/s3c24xx/Makefile
index c5a4a94509..33050cbbc6 100644
--- a/target/linux/s3c24xx/Makefile
+++ b/target/linux/s3c24xx/Makefile
@@ -12,7 +12,7 @@ BOARDNAME:=Samsung S3C24xx
FEATURES:=jffs2
CFLAGS:=-O2 -pipe -march=armv4t -mtune=arm920t -funit-at-a-time
-LINUX_VERSION:=2.6.28.10
+LINUX_VERSION:=2.6.29
DEVICE_TYPE=phone
diff --git a/target/linux/s3c24xx/config-2.6.29 b/target/linux/s3c24xx/config-2.6.29
new file mode 100644
index 0000000000..c4dddb3259
--- /dev/null
+++ b/target/linux/s3c24xx/config-2.6.29
@@ -0,0 +1,587 @@
+# CONFIG_AEABI is not set
+CONFIG_ALIGNMENT_TRAP=y
+CONFIG_APM_EMULATION=y
+CONFIG_APM_POWER=y
+CONFIG_AR6000_WLAN=y
+# CONFIG_AR6000_WLAN_DEBUG is not set
+# CONFIG_AR6000_WLAN_RESET is not set
+# CONFIG_ARCH_AAEC2000 is not set
+# CONFIG_ARCH_AT91 is not set
+# CONFIG_ARCH_BAST is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_DAVINCI is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_EP93XX is not set
+CONFIG_ARCH_FLATMEM_HAS_HOLES=y
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_H1940 is not set
+# CONFIG_ARCH_H720X is not set
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+# CONFIG_ARCH_IMX is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_IOP13XX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_IXP23XX is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_KIRKWOOD is not set
+# CONFIG_ARCH_KS8695 is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_LOKI is not set
+# CONFIG_ARCH_MSM is not set
+# CONFIG_ARCH_MV78XX0 is not set
+# CONFIG_ARCH_MXC is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_NS9XXX is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_ARCH_ORION5X is not set
+# CONFIG_ARCH_PNX4008 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_REALVIEW is not set
+CONFIG_ARCH_REQUIRE_GPIOLIB=y
+# CONFIG_ARCH_RPC is not set
+CONFIG_ARCH_S3C2410=y
+CONFIG_ARCH_S3C2440=y
+# CONFIG_ARCH_S3C64XX is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_SMDK2410 is not set
+# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+# CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_W90X900 is not set
+CONFIG_ARM=y
+CONFIG_ARM_THUMB=y
+# CONFIG_ARPD is not set
+CONFIG_ASHMEM=y
+CONFIG_ATAGS_PROC=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_GENERIC=y
+CONFIG_BACKLIGHT_GTA01=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+# CONFIG_BACKLIGHT_PWM is not set
+CONFIG_BASE_SMALL=0
+CONFIG_BATTERY_BQ27000_HDQ=y
+# CONFIG_BATTERY_BQ27x00 is not set
+# CONFIG_BATTERY_DS2760 is not set
+CONFIG_BATTERY_GTA01=y
+CONFIG_BITREVERSE=y
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BRIDGE_NETFILTER=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_CHARGER_PCF50606=y
+CONFIG_CHARGER_PCF50633=y
+CONFIG_CMDLINE="unused -- bootloader passes ATAG list"
+CONFIG_COMPAT_BRK=y
+CONFIG_COMPAT_NET_DEV_OPS=y
+# CONFIG_CONFIGFS_FS is not set
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_CPU_32=y
+CONFIG_CPU_32v4T=y
+CONFIG_CPU_ABRT_EV4T=y
+CONFIG_CPU_ARM920T=y
+CONFIG_CPU_CACHE_V4WT=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_COPY_V4WB=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+# CONFIG_CPU_ICACHE_DISABLE is not set
+CONFIG_CPU_IDLE=y
+CONFIG_CPU_IDLE_GOV_LADDER=y
+CONFIG_CPU_LLSERIAL_S3C2410=y
+CONFIG_CPU_LLSERIAL_S3C2440=y
+CONFIG_CPU_PABRT_NOIFAR=y
+CONFIG_CPU_S3C2410=y
+CONFIG_CPU_S3C2410_DMA=y
+CONFIG_CPU_S3C2440=y
+CONFIG_CPU_S3C2442=y
+CONFIG_CPU_S3C244X=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CRC16=y
+CONFIG_CRC_CCITT=y
+CONFIG_CRC_T10DIF=y
+# CONFIG_CRYPTO_AEAD is not set
+CONFIG_CRYPTO_AEAD2=y
+CONFIG_CRYPTO_AES=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_ALGAPI2=y
+CONFIG_CRYPTO_ANSI_CPRNG=y
+CONFIG_CRYPTO_ARC4=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_BLKCIPHER2=y
+CONFIG_CRYPTO_CBC=y
+CONFIG_CRYPTO_DES=y
+CONFIG_CRYPTO_ECB=y
+CONFIG_CRYPTO_FIPS=y
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_HASH2=y
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_HW=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_MANAGER2=y
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_RNG=y
+CONFIG_CRYPTO_RNG2=y
+CONFIG_CRYPTO_SHA1=y
+# CONFIG_DCB is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+# CONFIG_DEBUG_FS is not set
+CONFIG_DEBUG_MEMORY_INIT=y
+CONFIG_DEBUG_S3C_UART=2
+# CONFIG_DEBUG_USER is not set
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+CONFIG_DISPLAY_JBT6K74=y
+# CONFIG_DISPLAY_L1K002 is not set
+CONFIG_DISPLAY_SUPPORT=y
+CONFIG_DMADEVICES=y
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_ELF_CORE=y
+# CONFIG_EMBEDDED is not set
+# CONFIG_ENABLE_WARN_DEPRECATED is not set
+CONFIG_FB=y
+# CONFIG_FB_BACKLIGHT is not set
+# CONFIG_FB_BOOT_VESA_SUPPORT is not set
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
+# CONFIG_FB_DDC is not set
+# CONFIG_FB_FOREIGN_ENDIAN is not set
+# CONFIG_FB_MACMODES is not set
+# CONFIG_FB_MB862XX is not set
+# CONFIG_FB_METRONOME is not set
+# CONFIG_FB_MODE_HELPERS is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_S3C2410=y
+# CONFIG_FB_S3C2410_DEBUG is not set
+# CONFIG_FB_SVGALIB is not set
+# CONFIG_FB_SYS_COPYAREA is not set
+# CONFIG_FB_SYS_FILLRECT is not set
+# CONFIG_FB_SYS_FOPS is not set
+# CONFIG_FB_SYS_IMAGEBLIT is not set
+# CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FIND_IRQ_BLOCKERS is not set
+CONFIG_FIQ=y
+# CONFIG_FIRMWARE_EDID is not set
+CONFIG_FONTS=y
+# CONFIG_FONT_10x18 is not set
+CONFIG_FONT_6x11=y
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+# CONFIG_FONT_MINI_4x6 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FPE_FASTFPE is not set
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_NWFPE_XP is not set
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FREEZER=y
+# CONFIG_GENERIC_CLOCKEVENTS is not set
+CONFIG_GENERIC_FIND_LAST_BIT=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
+# CONFIG_GENERIC_TIME is not set
+CONFIG_GPIOLIB=y
+CONFIG_GPIO_DEVICE=y
+CONFIG_GPIO_SYSFS=y
+# CONFIG_GREENASIA_FF is not set
+# CONFIG_HAMRADIO is not set
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_HAS_DMA=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAVE_AOUT=y
+CONFIG_HAVE_ARCH_KGDB=y
+CONFIG_HAVE_CLK=y
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+CONFIG_HAVE_IDE=y
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+CONFIG_HAVE_OPROFILE=y
+CONFIG_HAVE_PWM=y
+# CONFIG_HDQ_GPIO_BITBANG is not set
+CONFIG_HID=y
+CONFIG_HID_A4TECH=y
+CONFIG_HID_APPLE=y
+CONFIG_HID_BELKIN=y
+CONFIG_HID_CHERRY=y
+CONFIG_HID_CHICONY=y
+CONFIG_HID_COMPAT=y
+CONFIG_HID_CYPRESS=y
+CONFIG_HID_EZKEY=y
+CONFIG_HID_GYRATION=y
+CONFIG_HID_LOGITECH=y
+CONFIG_HID_MICROSOFT=y
+CONFIG_HID_MONTEREY=y
+CONFIG_HID_NTRIG=y
+CONFIG_HID_PANTHERLORD=y
+CONFIG_HID_PETALYNX=y
+CONFIG_HID_PID=y
+CONFIG_HID_SAMSUNG=y
+CONFIG_HID_SONY=y
+CONFIG_HID_SUNPLUS=y
+CONFIG_HID_SUPPORT=y
+CONFIG_HID_TOPSEED=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_HW_RANDOM is not set
+CONFIG_HZ=200
+CONFIG_I2C=y
+CONFIG_I2C_BOARDINFO=y
+CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_HELPER_AUTO=y
+CONFIG_I2C_S3C2410=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+CONFIG_INPUT=y
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_GPIO_BUTTONS is not set
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_INPUT_LIS302DL=y
+CONFIG_INPUT_MOUSE=y
+CONFIG_INPUT_MOUSEDEV=y
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=480
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640
+CONFIG_INPUT_PCF50606_PMU=y
+CONFIG_INPUT_PCF50633_PMU=y
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_INPUT_YEALINK is not set
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_DHCP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_IP_ROUTE_MULTIPATH is not set
+# CONFIG_IP_ROUTE_VERBOSE is not set
+# CONFIG_ISDN is not set
+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+CONFIG_KALLSYMS=y
+CONFIG_KEXEC=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# CONFIG_KEYBOARD_GPIO is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+CONFIG_KEYBOARD_NEO1973=y
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+CONFIG_LCD_CLASS_DEVICE=y
+# CONFIG_LCD_ILI9320 is not set
+CONFIG_LCD_LTV350QV=y
+# CONFIG_LCD_PLATFORM is not set
+# CONFIG_LCD_TDO24M is not set
+# CONFIG_LCD_VGG2432A4 is not set
+CONFIG_LEDS_GPIO=y
+# CONFIG_LEDS_LP5521 is not set
+CONFIG_LEDS_NEO1973_GTA02=y
+CONFIG_LEDS_NEO1973_VIBRATOR=y
+CONFIG_LEDS_TRIGGER_BACKLIGHT=y
+# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LOCK_KERNEL=y
+# CONFIG_LOGO is not set
+CONFIG_LOG_BUF_SHIFT=18
+# CONFIG_MACH_AML_M5900 is not set
+# CONFIG_MACH_ANUBIS is not set
+# CONFIG_MACH_AT2440EVB is not set
+# CONFIG_MACH_JIVE is not set
+# CONFIG_MACH_N30 is not set
+CONFIG_MACH_NEO1973=y
+CONFIG_MACH_NEO1973_GTA01=y
+CONFIG_MACH_NEO1973_GTA02=y
+# CONFIG_MACH_NEXCODER_2440 is not set
+# CONFIG_MACH_OSIRIS is not set
+# CONFIG_MACH_OTOM is not set
+# CONFIG_MACH_QT2410 is not set
+# CONFIG_MACH_RX3715 is not set
+CONFIG_MACH_SMDK=y
+# CONFIG_MACH_SMDK2412 is not set
+# CONFIG_MACH_SMDK2413 is not set
+# CONFIG_MACH_SMDK2443 is not set
+# CONFIG_MACH_TCT_HAMMER is not set
+# CONFIG_MACH_VR1000 is not set
+# CONFIG_MACH_VSTMS is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MFD_GLAMO=y
+CONFIG_MFD_GLAMO_FB=y
+# CONFIG_MFD_GLAMO_FB_XGLAMO_WORKAROUND is not set
+CONFIG_MFD_GLAMO_MCI=y
+CONFIG_MFD_GLAMO_SPI_FB=y
+CONFIG_MFD_GLAMO_SPI_GPIO=y
+CONFIG_MFD_PCF50606=y
+CONFIG_MFD_PCF50633=y
+# CONFIG_MFD_T7L66XB is not set
+# CONFIG_MISC_DEVICES is not set
+CONFIG_MISC_FILESYSTEMS=y
+CONFIG_MMC=y
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_BLOCK_BOUNCE=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_S3C=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_S3C=y
+# CONFIG_MMC_SPI is not set
+CONFIG_MMC_UNSAFE_RESUME=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_MOUSE_BCM5974 is not set
+# CONFIG_MOUSE_GPIO is not set
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+CONFIG_MTD_ABSENT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+CONFIG_MTD_CMDLINE_PARTS=y
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+CONFIG_MTD_CONCAT=y
+CONFIG_MTD_NAND=y
+# CONFIG_MTD_NAND_GPIO is not set
+CONFIG_MTD_NAND_S3C2410=y
+# CONFIG_MTD_NAND_S3C2410_CLKSTOP is not set
+# CONFIG_MTD_NAND_S3C2410_DEBUG is not set
+CONFIG_MTD_NAND_S3C2410_HWECC=y
+CONFIG_MTD_NAND_VERIFY_WRITE=y
+CONFIG_MTD_PHYSMAP=y
+# CONFIG_MTD_PHYSMAP_COMPAT is not set
+# CONFIG_MTD_QINFO_PROBE is not set
+CONFIG_MTD_ROM=y
+CONFIG_NAMESPACES=y
+CONFIG_NEO1973_GTA02_2440=y
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETWORK_FILESYSTEMS is not set
+# CONFIG_NET_CLS_ACT is not set
+# CONFIG_NET_ETHERNET is not set
+# CONFIG_NET_NS is not set
+# CONFIG_NET_SCH_DRR is not set
+CONFIG_NF_CONNTRACK=y
+CONFIG_NF_CONNTRACK_IPV4=y
+# CONFIG_NF_CONNTRACK_MARK is not set
+# CONFIG_NF_CONNTRACK_PROC_COMPAT is not set
+CONFIG_NF_DEFRAG_IPV4=y
+CONFIG_NO_IOPORT=y
+CONFIG_NR_TTY_DEVICES=6
+# CONFIG_NVRAM is not set
+# CONFIG_OUTER_CACHE is not set
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_PAGE_OFFSET=0xC0000000
+CONFIG_PCA9632=y
+CONFIG_PCF50606_ADC=y
+CONFIG_PCF50606_GPO=y
+CONFIG_PCF50606_WATCHDOG=y
+CONFIG_PCF50633_ADC=y
+CONFIG_PCF50633_GPIO=y
+# CONFIG_PCI_SYSCALL is not set
+CONFIG_PDA_POWER=y
+# CONFIG_PHYS_ADDR_T_64BIT is not set
+CONFIG_PLAT_S3C=y
+CONFIG_PLAT_S3C24XX=y
+CONFIG_PM=y
+# CONFIG_PM_DEBUG is not set
+CONFIG_PM_SLEEP=y
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PREEMPT=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_REGULATOR=y
+CONFIG_REGULATOR_DEBUG=y
+CONFIG_REGULATOR_PCF50606=y
+CONFIG_REGULATOR_PCF50633=y
+CONFIG_RFKILL=y
+CONFIG_RFKILL_INPUT=y
+CONFIG_RFKILL_LEDS=y
+CONFIG_RTC_CLASS=y
+# CONFIG_RTC_DRV_CMOS is not set
+CONFIG_RTC_DRV_PCF50606=y
+CONFIG_RTC_DRV_PCF50633=y
+CONFIG_RTC_DRV_S3C=y
+CONFIG_S3C2410_CLOCK=y
+CONFIG_S3C2410_DMA=y
+# CONFIG_S3C2410_DMA_DEBUG is not set
+CONFIG_S3C2410_GPIO=y
+CONFIG_S3C2410_PM=y
+# CONFIG_S3C2410_PM_CHECK is not set
+# CONFIG_S3C2410_PM_DEBUG is not set
+CONFIG_S3C2410_WATCHDOG=y
+CONFIG_S3C2440_DMA=y
+# CONFIG_S3C24XX_ADC is not set
+CONFIG_S3C24XX_GPIO_EXTRA=0
+CONFIG_S3C24XX_PWM=y
+# CONFIG_S3C_BOOT_ERROR_RESET is not set
+CONFIG_S3C_BOOT_UART_FORCE_FIFO=y
+# CONFIG_S3C_BOOT_WATCHDOG is not set
+CONFIG_S3C_DEV_USB_HOST=y
+CONFIG_S3C_DMA=y
+CONFIG_S3C_GPIO_SPACE=0
+CONFIG_S3C_GPIO_TRACK=y
+CONFIG_S3C_LOWLEVEL_UART_PORT=2
+CONFIG_S3C_PWM=y
+CONFIG_SCSI=y
+# CONFIG_SCSI_LOWLEVEL is not set
+# CONFIG_SCSI_MULTI_LUN is not set
+# CONFIG_SCSI_PROC_FS is not set
+# CONFIG_SDIO_UART is not set
+# CONFIG_SENSORS_PCF50606 is not set
+# CONFIG_SERIAL_8250 is not set
+CONFIG_SERIAL_S3C2410=y
+CONFIG_SERIAL_S3C2440=y
+CONFIG_SERIAL_SAMSUNG=y
+CONFIG_SERIAL_SAMSUNG_CONSOLE=y
+CONFIG_SERIAL_SAMSUNG_UARTS=3
+CONFIG_SERIO=y
+# CONFIG_SERIO_RAW is not set
+# CONFIG_SERIO_SERPORT is not set
+CONFIG_SMDK2440_CPU2440=y
+CONFIG_SMDK2440_CPU2442=y
+CONFIG_SND=m
+# CONFIG_SND_ARM is not set
+# CONFIG_SND_DRIVERS is not set
+CONFIG_SND_PCM=m
+CONFIG_SND_S3C24XX_SOC=m
+CONFIG_SND_S3C24XX_SOC_I2S=m
+# CONFIG_SND_S3C24XX_SOC_LN2440SBC_ALC650 is not set
+CONFIG_SND_S3C24XX_SOC_NEO1973_GTA02_WM8753=m
+# CONFIG_SND_S3C24XX_SOC_NEO1973_WM8753 is not set
+# CONFIG_SND_S3C24XX_SOC_S3C24XX_UDA134X is not set
+# CONFIG_SND_S3C64XX_SOC_SMDK6410_WM8731 is not set
+CONFIG_SND_SOC=m
+# CONFIG_SND_SOC_ALL_CODECS is not set
+CONFIG_SND_SOC_I2C_AND_SPI=m
+CONFIG_SND_SOC_WM8753=m
+CONFIG_SND_TIMER=m
+# CONFIG_SND_USB is not set
+# CONFIG_SND_VERBOSE_PROCFS is not set
+CONFIG_SOUND=m
+# CONFIG_SOUND_OSS_CORE is not set
+CONFIG_SPI=y
+CONFIG_SPI_BITBANG=y
+# CONFIG_SPI_GPIO is not set
+# CONFIG_SPI_GPIO_OLD is not set
+CONFIG_SPI_MASTER=y
+CONFIG_SPI_S3C24XX=y
+CONFIG_SPI_S3C24XX_GPIO=y
+# CONFIG_SPI_SPIDEV is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_SQUASHFS is not set
+CONFIG_SUSPEND=y
+CONFIG_SUSPEND_FREEZER=y
+# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+CONFIG_SYSFS_DEPRECATED=y
+CONFIG_SYSFS_DEPRECATED_V2=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_TCP_MD5SIG=y
+# CONFIG_TOUCHSCREEN_ADS7846 is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+CONFIG_TOUCHSCREEN_FILTER=y
+CONFIG_TOUCHSCREEN_FILTER_GROUP=y
+CONFIG_TOUCHSCREEN_FILTER_LINEAR=y
+CONFIG_TOUCHSCREEN_FILTER_MEAN=y
+CONFIG_TOUCHSCREEN_FILTER_MEDIAN=y
+# CONFIG_TOUCHSCREEN_FUJITSU is not set
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_INEXIO is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_PCAP7200 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+CONFIG_TOUCHSCREEN_S3C2410=y
+# CONFIG_TOUCHSCREEN_S3C2410_DEBUG is not set
+# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+# CONFIG_TOUCHSCREEN_TSC2007 is not set
+# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
+# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
+CONFIG_UID16=y
+CONFIG_UIO=y
+CONFIG_UIO_PDRV=y
+# CONFIG_UIO_PDRV_GENIRQ is not set
+# CONFIG_UIO_SERCOS3 is not set
+# CONFIG_UIO_SMX is not set
+CONFIG_UNEVICTABLE_LRU=y
+CONFIG_USB=y
+CONFIG_USB_ACM=y
+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+# CONFIG_USB_CDC_COMPOSITE is not set
+# CONFIG_USB_DEVICEFS is not set
+CONFIG_USB_ETH=y
+CONFIG_USB_ETH_RNDIS=y
+# CONFIG_USB_FILE_STORAGE is not set
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGETFS is not set
+# CONFIG_USB_GADGET_AMD5536UDC is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_ATMEL_USBA is not set
+# CONFIG_USB_GADGET_CI13XXX is not set
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_FSL_QE is not set
+# CONFIG_USB_GADGET_FSL_USB2 is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_IMX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_M66592 is not set
+# CONFIG_USB_GADGET_MUSB_HDRC is not set
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_PXA25X is not set
+# CONFIG_USB_GADGET_PXA27X is not set
+CONFIG_USB_GADGET_S3C2410=y
+# CONFIG_USB_GADGET_S3C_OTGD_HS is not set
+CONFIG_USB_GADGET_SELECTED=y
+CONFIG_USB_GADGET_VBUS_DRAW=500
+# CONFIG_USB_G_PRINTER is not set
+# CONFIG_USB_G_SERIAL is not set
+CONFIG_USB_HID=y
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_MUSB_HDRC is not set
+# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
+# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
+CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_S3C2410=y
+# CONFIG_USB_S3C2410_DEBUG is not set
+CONFIG_USB_SERIAL=y
+CONFIG_USB_SERIAL_CONSOLE=y
+# CONFIG_USB_SERIAL_OPTICON is not set
+CONFIG_USB_SERIAL_OPTION=y
+# CONFIG_USB_SERIAL_SIEMENS_MPI is not set
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_SUSPEND=y
+# CONFIG_USB_ZERO is not set
+# CONFIG_USER_NS is not set
+CONFIG_VECTORS_BASE=0xffff0000
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_VIDEO_OUTPUT_CONTROL=y
+# CONFIG_VLAN_8021Q is not set
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_VT_HW_CONSOLE_BINDING=y
+# CONFIG_WIRELESS is not set
+# CONFIG_WLAN_80211 is not set
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZONE_DMA_FLAG=0
diff --git a/target/linux/s3c24xx/patches-2.6.29/000-downgrade-to-rc3.patch b/target/linux/s3c24xx/patches-2.6.29/000-downgrade-to-rc3.patch
new file mode 100644
index 0000000000..c9c8453827
--- /dev/null
+++ b/target/linux/s3c24xx/patches-2.6.29/000-downgrade-to-rc3.patch
@@ -0,0 +1,170300 @@
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/alpha/include/asm/bug.h linux-2.6.29-rc3.owrt/arch/alpha/include/asm/bug.h
+--- linux-2.6.29.owrt/arch/alpha/include/asm/bug.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/alpha/include/asm/bug.h 2009-05-10 23:48:27.000000000 +0200
+@@ -8,12 +8,17 @@
+
+ /* ??? Would be nice to use .gprel32 here, but we can't be sure that the
+ function loaded the GP, so this could fail in modules. */
+-#define BUG() do { \
+- __asm__ __volatile__( \
+- "call_pal %0 # bugchk\n\t" \
+- ".long %1\n\t.8byte %2" \
+- : : "i"(PAL_bugchk), "i"(__LINE__), "i"(__FILE__)); \
+- for ( ; ; ); } while (0)
++static inline void ATTRIB_NORET __BUG(const char *file, int line)
++{
++ __asm__ __volatile__(
++ "call_pal %0 # bugchk\n\t"
++ ".long %1\n\t.8byte %2"
++ : : "i" (PAL_bugchk), "i"(line), "i"(file));
++ for ( ; ; )
++ ;
++}
++
++#define BUG() __BUG(__FILE__, __LINE__)
+
+ #define HAVE_ARCH_BUG
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/alpha/include/asm/dma-mapping.h linux-2.6.29-rc3.owrt/arch/alpha/include/asm/dma-mapping.h
+--- linux-2.6.29.owrt/arch/alpha/include/asm/dma-mapping.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/alpha/include/asm/dma-mapping.h 2009-05-10 23:48:27.000000000 +0200
+@@ -29,8 +29,6 @@
+
+ #else /* no PCI - no IOMMU. */
+
+-#include <asm/io.h> /* for virt_to_phys() */
+-
+ struct scatterlist;
+ void *dma_alloc_coherent(struct device *dev, size_t size,
+ dma_addr_t *dma_handle, gfp_t gfp);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/alpha/Kconfig linux-2.6.29-rc3.owrt/arch/alpha/Kconfig
+--- linux-2.6.29.owrt/arch/alpha/Kconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/alpha/Kconfig 2009-05-10 23:48:27.000000000 +0200
+@@ -8,7 +8,6 @@
+ select HAVE_AOUT
+ select HAVE_IDE
+ select HAVE_OPROFILE
+- select HAVE_SYSCALL_WRAPPERS
+ help
+ The Alpha is a 64-bit general-purpose processor designed and
+ marketed by the Digital Equipment Corporation of blessed memory,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/alpha/kernel/entry.S linux-2.6.29-rc3.owrt/arch/alpha/kernel/entry.S
+--- linux-2.6.29.owrt/arch/alpha/kernel/entry.S 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/alpha/kernel/entry.S 2009-05-10 23:48:27.000000000 +0200
+@@ -933,7 +933,7 @@
+ osf_sigprocmask:
+ .prologue 0
+ mov $sp, $18
+- jmp $31, sys_osf_sigprocmask
++ jmp $31, do_osf_sigprocmask
+ .end osf_sigprocmask
+
+ .align 4
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/alpha/kernel/osf_sys.c linux-2.6.29-rc3.owrt/arch/alpha/kernel/osf_sys.c
+--- linux-2.6.29.owrt/arch/alpha/kernel/osf_sys.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/alpha/kernel/osf_sys.c 2009-05-10 23:48:27.000000000 +0200
+@@ -54,7 +54,8 @@
+ * identical to OSF as we don't return 0 on success, but doing otherwise
+ * would require changes to libc. Hopefully this is good enough.
+ */
+-SYSCALL_DEFINE1(osf_brk, unsigned long, brk)
++asmlinkage unsigned long
++osf_brk(unsigned long brk)
+ {
+ unsigned long retval = sys_brk(brk);
+ if (brk && brk != retval)
+@@ -65,9 +66,9 @@
+ /*
+ * This is pure guess-work..
+ */
+-SYSCALL_DEFINE4(osf_set_program_attributes, unsigned long, text_start,
+- unsigned long, text_len, unsigned long, bss_start,
+- unsigned long, bss_len)
++asmlinkage int
++osf_set_program_attributes(unsigned long text_start, unsigned long text_len,
++ unsigned long bss_start, unsigned long bss_len)
+ {
+ struct mm_struct *mm;
+
+@@ -145,9 +146,9 @@
+ return -EFAULT;
+ }
+
+-SYSCALL_DEFINE4(osf_getdirentries, unsigned int, fd,
+- struct osf_dirent __user *, dirent, unsigned int, count,
+- long __user *, basep)
++asmlinkage int
++osf_getdirentries(unsigned int fd, struct osf_dirent __user *dirent,
++ unsigned int count, long __user *basep)
+ {
+ int error;
+ struct file *file;
+@@ -176,9 +177,9 @@
+
+ #undef NAME_OFFSET
+
+-SYSCALL_DEFINE6(osf_mmap, unsigned long, addr, unsigned long, len,
+- unsigned long, prot, unsigned long, flags, unsigned long, fd,
+- unsigned long, off)
++asmlinkage unsigned long
++osf_mmap(unsigned long addr, unsigned long len, unsigned long prot,
++ unsigned long flags, unsigned long fd, unsigned long off)
+ {
+ struct file *file = NULL;
+ unsigned long ret = -EBADF;
+@@ -253,8 +254,8 @@
+ return error;
+ }
+
+-SYSCALL_DEFINE3(osf_statfs, char __user *, pathname,
+- struct osf_statfs __user *, buffer, unsigned long, bufsiz)
++asmlinkage int
++osf_statfs(char __user *pathname, struct osf_statfs __user *buffer, unsigned long bufsiz)
+ {
+ struct path path;
+ int retval;
+@@ -267,8 +268,8 @@
+ return retval;
+ }
+
+-SYSCALL_DEFINE3(osf_fstatfs, unsigned long, fd,
+- struct osf_statfs __user *, buffer, unsigned long, bufsiz)
++asmlinkage int
++osf_fstatfs(unsigned long fd, struct osf_statfs __user *buffer, unsigned long bufsiz)
+ {
+ struct file *file;
+ int retval;
+@@ -367,8 +368,8 @@
+ return do_mount("", dirname, "proc", flags, NULL);
+ }
+
+-SYSCALL_DEFINE4(osf_mount, unsigned long, typenr, char __user *, path,
+- int, flag, void __user *, data)
++asmlinkage int
++osf_mount(unsigned long typenr, char __user *path, int flag, void __user *data)
+ {
+ int retval = -EINVAL;
+ char *name;
+@@ -398,7 +399,8 @@
+ return retval;
+ }
+
+-SYSCALL_DEFINE1(osf_utsname, char __user *, name)
++asmlinkage int
++osf_utsname(char __user *name)
+ {
+ int error;
+
+@@ -421,12 +423,14 @@
+ return error;
+ }
+
+-SYSCALL_DEFINE0(getpagesize)
++asmlinkage unsigned long
++sys_getpagesize(void)
+ {
+ return PAGE_SIZE;
+ }
+
+-SYSCALL_DEFINE0(getdtablesize)
++asmlinkage unsigned long
++sys_getdtablesize(void)
+ {
+ return sysctl_nr_open;
+ }
+@@ -434,7 +438,8 @@
+ /*
+ * For compatibility with OSF/1 only. Use utsname(2) instead.
+ */
+-SYSCALL_DEFINE2(osf_getdomainname, char __user *, name, int, namelen)
++asmlinkage int
++osf_getdomainname(char __user *name, int namelen)
+ {
+ unsigned len;
+ int i;
+@@ -522,8 +527,8 @@
+ PL_DEL = 5, PL_FDEL = 6
+ };
+
+-SYSCALL_DEFINE2(osf_proplist_syscall, enum pl_code, code,
+- union pl_args __user *, args)
++asmlinkage long
++osf_proplist_syscall(enum pl_code code, union pl_args __user *args)
+ {
+ long error;
+ int __user *min_buf_size_ptr;
+@@ -562,8 +567,8 @@
+ return error;
+ }
+
+-SYSCALL_DEFINE2(osf_sigstack, struct sigstack __user *, uss,
+- struct sigstack __user *, uoss)
++asmlinkage int
++osf_sigstack(struct sigstack __user *uss, struct sigstack __user *uoss)
+ {
+ unsigned long usp = rdusp();
+ unsigned long oss_sp = current->sas_ss_sp + current->sas_ss_size;
+@@ -603,7 +608,8 @@
+ return error;
+ }
+
+-SYSCALL_DEFINE3(osf_sysinfo, int, command, char __user *, buf, long, count)
++asmlinkage long
++osf_sysinfo(int command, char __user *buf, long count)
+ {
+ char *sysinfo_table[] = {
+ utsname()->sysname,
+@@ -641,8 +647,9 @@
+ return err;
+ }
+
+-SYSCALL_DEFINE5(osf_getsysinfo, unsigned long, op, void __user *, buffer,
+- unsigned long, nbytes, int __user *, start, void __user *, arg)
++asmlinkage unsigned long
++osf_getsysinfo(unsigned long op, void __user *buffer, unsigned long nbytes,
++ int __user *start, void __user *arg)
+ {
+ unsigned long w;
+ struct percpu_struct *cpu;
+@@ -698,8 +705,9 @@
+ return -EOPNOTSUPP;
+ }
+
+-SYSCALL_DEFINE5(osf_setsysinfo, unsigned long, op, void __user *, buffer,
+- unsigned long, nbytes, int __user *, start, void __user *, arg)
++asmlinkage unsigned long
++osf_setsysinfo(unsigned long op, void __user *buffer, unsigned long nbytes,
++ int __user *start, void __user *arg)
+ {
+ switch (op) {
+ case SSI_IEEE_FP_CONTROL: {
+@@ -872,8 +880,8 @@
+ value->tv_sec = jiffies / HZ;
+ }
+
+-SYSCALL_DEFINE2(osf_gettimeofday, struct timeval32 __user *, tv,
+- struct timezone __user *, tz)
++asmlinkage int
++osf_gettimeofday(struct timeval32 __user *tv, struct timezone __user *tz)
+ {
+ if (tv) {
+ struct timeval ktv;
+@@ -888,8 +896,8 @@
+ return 0;
+ }
+
+-SYSCALL_DEFINE2(osf_settimeofday, struct timeval32 __user *, tv,
+- struct timezone __user *, tz)
++asmlinkage int
++osf_settimeofday(struct timeval32 __user *tv, struct timezone __user *tz)
+ {
+ struct timespec kts;
+ struct timezone ktz;
+@@ -908,7 +916,8 @@
+ return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL);
+ }
+
+-SYSCALL_DEFINE2(osf_getitimer, int, which, struct itimerval32 __user *, it)
++asmlinkage int
++osf_getitimer(int which, struct itimerval32 __user *it)
+ {
+ struct itimerval kit;
+ int error;
+@@ -920,8 +929,8 @@
+ return error;
+ }
+
+-SYSCALL_DEFINE3(osf_setitimer, int, which, struct itimerval32 __user *, in,
+- struct itimerval32 __user *, out)
++asmlinkage int
++osf_setitimer(int which, struct itimerval32 __user *in, struct itimerval32 __user *out)
+ {
+ struct itimerval kin, kout;
+ int error;
+@@ -943,8 +952,8 @@
+
+ }
+
+-SYSCALL_DEFINE2(osf_utimes, char __user *, filename,
+- struct timeval32 __user *, tvs)
++asmlinkage int
++osf_utimes(char __user *filename, struct timeval32 __user *tvs)
+ {
+ struct timespec tv[2];
+
+@@ -970,8 +979,9 @@
+ #define MAX_SELECT_SECONDS \
+ ((unsigned long) (MAX_SCHEDULE_TIMEOUT / HZ)-1)
+
+-SYSCALL_DEFINE5(osf_select, int, n, fd_set __user *, inp, fd_set __user *, outp,
+- fd_set __user *, exp, struct timeval32 __user *, tvp)
++asmlinkage int
++osf_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp,
++ struct timeval32 __user *tvp)
+ {
+ struct timespec end_time, *to = NULL;
+ if (tvp) {
+@@ -1016,7 +1026,8 @@
+ long ru_nivcsw; /* involuntary " */
+ };
+
+-SYSCALL_DEFINE2(osf_getrusage, int, who, struct rusage32 __user *, ru)
++asmlinkage int
++osf_getrusage(int who, struct rusage32 __user *ru)
+ {
+ struct rusage32 r;
+
+@@ -1042,8 +1053,9 @@
+ return copy_to_user(ru, &r, sizeof(r)) ? -EFAULT : 0;
+ }
+
+-SYSCALL_DEFINE4(osf_wait4, pid_t, pid, int __user *, ustatus, int, options,
+- struct rusage32 __user *, ur)
++asmlinkage long
++osf_wait4(pid_t pid, int __user *ustatus, int options,
++ struct rusage32 __user *ur)
+ {
+ struct rusage r;
+ long ret, err;
+@@ -1089,8 +1101,8 @@
+ * seems to be a timeval pointer, and I suspect the second
+ * one is the time remaining.. Ho humm.. No documentation.
+ */
+-SYSCALL_DEFINE2(osf_usleep_thread, struct timeval32 __user *, sleep,
+- struct timeval32 __user *, remain)
++asmlinkage int
++osf_usleep_thread(struct timeval32 __user *sleep, struct timeval32 __user *remain)
+ {
+ struct timeval tmp;
+ unsigned long ticks;
+@@ -1143,7 +1155,8 @@
+ int :32; int :32; int :32; int :32;
+ };
+
+-SYSCALL_DEFINE1(old_adjtimex, struct timex32 __user *, txc_p)
++asmlinkage int
++sys_old_adjtimex(struct timex32 __user *txc_p)
+ {
+ struct timex txc;
+ int ret;
+@@ -1254,8 +1267,8 @@
+ return 0;
+ }
+
+-SYSCALL_DEFINE3(osf_readv, unsigned long, fd,
+- const struct iovec __user *, vector, unsigned long, count)
++asmlinkage ssize_t
++osf_readv(unsigned long fd, const struct iovec __user * vector, unsigned long count)
+ {
+ if (unlikely(personality(current->personality) == PER_OSF4))
+ if (osf_fix_iov_len(vector, count))
+@@ -1263,8 +1276,8 @@
+ return sys_readv(fd, vector, count);
+ }
+
+-SYSCALL_DEFINE3(osf_writev, unsigned long, fd,
+- const struct iovec __user *, vector, unsigned long, count)
++asmlinkage ssize_t
++osf_writev(unsigned long fd, const struct iovec __user * vector, unsigned long count)
+ {
+ if (unlikely(personality(current->personality) == PER_OSF4))
+ if (osf_fix_iov_len(vector, count))
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/alpha/kernel/pci-noop.c linux-2.6.29-rc3.owrt/arch/alpha/kernel/pci-noop.c
+--- linux-2.6.29.owrt/arch/alpha/kernel/pci-noop.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/alpha/kernel/pci-noop.c 2009-05-10 23:48:27.000000000 +0200
+@@ -109,8 +109,7 @@
+ /* Stubs for the routines in pci_iommu.c: */
+
+ void *
+-__pci_alloc_consistent(struct pci_dev *pdev, size_t size,
+- dma_addr_t *dma_addrp, gfp_t gfp)
++pci_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr_t *dma_addrp)
+ {
+ return NULL;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/alpha/kernel/process.c linux-2.6.29-rc3.owrt/arch/alpha/kernel/process.c
+--- linux-2.6.29.owrt/arch/alpha/kernel/process.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/alpha/kernel/process.c 2009-05-10 23:48:27.000000000 +0200
+@@ -93,8 +93,8 @@
+ if (cpuid != boot_cpuid) {
+ flags |= 0x00040000UL; /* "remain halted" */
+ *pflags = flags;
+- set_cpu_present(cpuid, false);
+- set_cpu_possible(cpuid, false);
++ cpu_clear(cpuid, cpu_present_map);
++ cpu_clear(cpuid, cpu_possible_map);
+ halt();
+ }
+ #endif
+@@ -120,8 +120,8 @@
+
+ #ifdef CONFIG_SMP
+ /* Wait for the secondaries to halt. */
+- set_cpu_present(boot_cpuid, false);
+- set_cpu_possible(boot_cpuid, false);
++ cpu_clear(boot_cpuid, cpu_present_map);
++ cpu_clear(boot_cpuid, cpu_possible_map);
+ while (cpus_weight(cpu_present_map))
+ barrier();
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/alpha/kernel/signal.c linux-2.6.29-rc3.owrt/arch/alpha/kernel/signal.c
+--- linux-2.6.29.owrt/arch/alpha/kernel/signal.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/alpha/kernel/signal.c 2009-05-10 23:48:27.000000000 +0200
+@@ -19,7 +19,6 @@
+ #include <linux/tty.h>
+ #include <linux/binfmts.h>
+ #include <linux/bitops.h>
+-#include <linux/syscalls.h>
+
+ #include <asm/uaccess.h>
+ #include <asm/sigcontext.h>
+@@ -52,8 +51,8 @@
+ * Note that we don't need to acquire the kernel lock for SMP
+ * operation, as all of this is local to this thread.
+ */
+-SYSCALL_DEFINE3(osf_sigprocmask, int, how, unsigned long, newmask,
+- struct pt_regs *, regs)
++asmlinkage unsigned long
++do_osf_sigprocmask(int how, unsigned long newmask, struct pt_regs *regs)
+ {
+ unsigned long oldmask = -EINVAL;
+
+@@ -82,9 +81,9 @@
+ return oldmask;
+ }
+
+-SYSCALL_DEFINE3(osf_sigaction, int, sig,
+- const struct osf_sigaction __user *, act,
+- struct osf_sigaction __user *, oact)
++asmlinkage int
++osf_sigaction(int sig, const struct osf_sigaction __user *act,
++ struct osf_sigaction __user *oact)
+ {
+ struct k_sigaction new_ka, old_ka;
+ int ret;
+@@ -113,9 +112,10 @@
+ return ret;
+ }
+
+-SYSCALL_DEFINE5(rt_sigaction, int, sig, const struct sigaction __user *, act,
+- struct sigaction __user *, oact,
+- size_t, sigsetsize, void __user *, restorer)
++asmlinkage long
++sys_rt_sigaction(int sig, const struct sigaction __user *act,
++ struct sigaction __user *oact,
++ size_t sigsetsize, void __user *restorer)
+ {
+ struct k_sigaction new_ka, old_ka;
+ int ret;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/alpha/kernel/smp.c linux-2.6.29-rc3.owrt/arch/alpha/kernel/smp.c
+--- linux-2.6.29.owrt/arch/alpha/kernel/smp.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/alpha/kernel/smp.c 2009-05-10 23:48:27.000000000 +0200
+@@ -121,11 +121,10 @@
+ {
+ int cpuid = hard_smp_processor_id();
+
+- if (cpu_online(cpuid)) {
++ if (cpu_test_and_set(cpuid, cpu_online_map)) {
+ printk("??, cpu 0x%x already present??\n", cpuid);
+ BUG();
+ }
+- set_cpu_online(cpuid, true);
+
+ /* Turn on machine checks. */
+ wrmces(7);
+@@ -436,8 +435,8 @@
+ ((char *)cpubase + i*hwrpb->processor_size);
+ if ((cpu->flags & 0x1cc) == 0x1cc) {
+ smp_num_probed++;
+- set_cpu_possible(i, true);
+- set_cpu_present(i, true);
++ cpu_set(i, cpu_possible_map);
++ cpu_set(i, cpu_present_map);
+ cpu->pal_revision = boot_cpu_palrev;
+ }
+
+@@ -470,8 +469,8 @@
+
+ /* Nothing to do on a UP box, or when told not to. */
+ if (smp_num_probed == 1 || max_cpus == 0) {
+- init_cpu_possible(cpumask_of(boot_cpuid));
+- init_cpu_present(cpumask_of(boot_cpuid));
++ cpu_possible_map = cpumask_of_cpu(boot_cpuid);
++ cpu_present_map = cpumask_of_cpu(boot_cpuid);
+ printk(KERN_INFO "SMP mode deactivated.\n");
+ return;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/alpha/kernel/systbls.S linux-2.6.29-rc3.owrt/arch/alpha/kernel/systbls.S
+--- linux-2.6.29.owrt/arch/alpha/kernel/systbls.S 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/alpha/kernel/systbls.S 2009-05-10 23:48:27.000000000 +0200
+@@ -17,7 +17,7 @@
+ .quad sys_write
+ .quad alpha_ni_syscall /* 5 */
+ .quad sys_close
+- .quad sys_osf_wait4
++ .quad osf_wait4
+ .quad alpha_ni_syscall
+ .quad sys_link
+ .quad sys_unlink /* 10 */
+@@ -27,11 +27,11 @@
+ .quad sys_mknod
+ .quad sys_chmod /* 15 */
+ .quad sys_chown
+- .quad sys_osf_brk
++ .quad osf_brk
+ .quad alpha_ni_syscall
+ .quad sys_lseek
+ .quad sys_getxpid /* 20 */
+- .quad sys_osf_mount
++ .quad osf_mount
+ .quad sys_umount
+ .quad sys_setuid
+ .quad sys_getxuid
+@@ -53,7 +53,7 @@
+ .quad alpha_ni_syscall /* 40 */
+ .quad sys_dup
+ .quad sys_alpha_pipe
+- .quad sys_osf_set_program_attributes
++ .quad osf_set_program_attributes
+ .quad alpha_ni_syscall
+ .quad sys_open /* 45 */
+ .quad alpha_ni_syscall
+@@ -81,7 +81,7 @@
+ .quad sys_newlstat
+ .quad alpha_ni_syscall
+ .quad alpha_ni_syscall /* 70 */
+- .quad sys_osf_mmap
++ .quad osf_mmap
+ .quad alpha_ni_syscall
+ .quad sys_munmap
+ .quad sys_mprotect
+@@ -94,17 +94,17 @@
+ .quad sys_setgroups /* 80 */
+ .quad alpha_ni_syscall
+ .quad sys_setpgid
+- .quad sys_osf_setitimer
++ .quad osf_setitimer
+ .quad alpha_ni_syscall
+ .quad alpha_ni_syscall /* 85 */
+- .quad sys_osf_getitimer
++ .quad osf_getitimer
+ .quad sys_gethostname
+ .quad sys_sethostname
+ .quad sys_getdtablesize
+ .quad sys_dup2 /* 90 */
+ .quad sys_newfstat
+ .quad sys_fcntl
+- .quad sys_osf_select
++ .quad osf_select
+ .quad sys_poll
+ .quad sys_fsync /* 95 */
+ .quad sys_setpriority
+@@ -123,22 +123,22 @@
+ .quad alpha_ni_syscall
+ .quad alpha_ni_syscall /* 110 */
+ .quad sys_sigsuspend
+- .quad sys_osf_sigstack
++ .quad osf_sigstack
+ .quad sys_recvmsg
+ .quad sys_sendmsg
+ .quad alpha_ni_syscall /* 115 */
+- .quad sys_osf_gettimeofday
+- .quad sys_osf_getrusage
++ .quad osf_gettimeofday
++ .quad osf_getrusage
+ .quad sys_getsockopt
+ .quad alpha_ni_syscall
+ #ifdef CONFIG_OSF4_COMPAT
+- .quad sys_osf_readv /* 120 */
+- .quad sys_osf_writev
++ .quad osf_readv /* 120 */
++ .quad osf_writev
+ #else
+ .quad sys_readv /* 120 */
+ .quad sys_writev
+ #endif
+- .quad sys_osf_settimeofday
++ .quad osf_settimeofday
+ .quad sys_fchown
+ .quad sys_fchmod
+ .quad sys_recvfrom /* 125 */
+@@ -154,7 +154,7 @@
+ .quad sys_socketpair /* 135 */
+ .quad sys_mkdir
+ .quad sys_rmdir
+- .quad sys_osf_utimes
++ .quad osf_utimes
+ .quad alpha_ni_syscall
+ .quad alpha_ni_syscall /* 140 */
+ .quad sys_getpeername
+@@ -172,16 +172,16 @@
+ .quad alpha_ni_syscall
+ .quad alpha_ni_syscall
+ .quad alpha_ni_syscall /* 155 */
+- .quad sys_osf_sigaction
++ .quad osf_sigaction
+ .quad alpha_ni_syscall
+ .quad alpha_ni_syscall
+- .quad sys_osf_getdirentries
+- .quad sys_osf_statfs /* 160 */
+- .quad sys_osf_fstatfs
++ .quad osf_getdirentries
++ .quad osf_statfs /* 160 */
++ .quad osf_fstatfs
+ .quad alpha_ni_syscall
+ .quad alpha_ni_syscall
+ .quad alpha_ni_syscall
+- .quad sys_osf_getdomainname /* 165 */
++ .quad osf_getdomainname /* 165 */
+ .quad sys_setdomainname
+ .quad alpha_ni_syscall
+ .quad alpha_ni_syscall
+@@ -224,7 +224,7 @@
+ .quad sys_semctl
+ .quad sys_semget /* 205 */
+ .quad sys_semop
+- .quad sys_osf_utsname
++ .quad osf_utsname
+ .quad sys_lchown
+ .quad sys_shmat
+ .quad sys_shmctl /* 210 */
+@@ -258,23 +258,23 @@
+ .quad alpha_ni_syscall
+ .quad alpha_ni_syscall
+ .quad alpha_ni_syscall /* 240 */
+- .quad sys_osf_sysinfo
++ .quad osf_sysinfo
+ .quad alpha_ni_syscall
+ .quad alpha_ni_syscall
+- .quad sys_osf_proplist_syscall
++ .quad osf_proplist_syscall
+ .quad alpha_ni_syscall /* 245 */
+ .quad alpha_ni_syscall
+ .quad alpha_ni_syscall
+ .quad alpha_ni_syscall
+ .quad alpha_ni_syscall
+ .quad alpha_ni_syscall /* 250 */
+- .quad sys_osf_usleep_thread
++ .quad osf_usleep_thread
+ .quad alpha_ni_syscall
+ .quad alpha_ni_syscall
+ .quad sys_sysfs
+ .quad alpha_ni_syscall /* 255 */
+- .quad sys_osf_getsysinfo
+- .quad sys_osf_setsysinfo
++ .quad osf_getsysinfo
++ .quad osf_setsysinfo
+ .quad alpha_ni_syscall
+ .quad alpha_ni_syscall
+ .quad alpha_ni_syscall /* 260 */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/configs/at91sam9260ek_defconfig linux-2.6.29-rc3.owrt/arch/arm/configs/at91sam9260ek_defconfig
+--- linux-2.6.29.owrt/arch/arm/configs/at91sam9260ek_defconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/configs/at91sam9260ek_defconfig 2009-05-10 23:48:27.000000000 +0200
+@@ -608,7 +608,7 @@
+ # Watchdog Device Drivers
+ #
+ # CONFIG_SOFT_WATCHDOG is not set
+-CONFIG_AT91SAM9X_WATCHDOG=y
++CONFIG_AT91SAM9_WATCHDOG=y
+
+ #
+ # USB-based Watchdog Cards
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/configs/at91sam9261ek_defconfig linux-2.6.29-rc3.owrt/arch/arm/configs/at91sam9261ek_defconfig
+--- linux-2.6.29.owrt/arch/arm/configs/at91sam9261ek_defconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/configs/at91sam9261ek_defconfig 2009-05-10 23:48:27.000000000 +0200
+@@ -700,7 +700,7 @@
+ # Watchdog Device Drivers
+ #
+ # CONFIG_SOFT_WATCHDOG is not set
+-CONFIG_AT91SAM9X_WATCHDOG=y
++CONFIG_AT91SAM9_WATCHDOG=y
+
+ #
+ # USB-based Watchdog Cards
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/configs/at91sam9263ek_defconfig linux-2.6.29-rc3.owrt/arch/arm/configs/at91sam9263ek_defconfig
+--- linux-2.6.29.owrt/arch/arm/configs/at91sam9263ek_defconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/configs/at91sam9263ek_defconfig 2009-05-10 23:48:27.000000000 +0200
+@@ -710,7 +710,7 @@
+ # Watchdog Device Drivers
+ #
+ # CONFIG_SOFT_WATCHDOG is not set
+-CONFIG_AT91SAM9X_WATCHDOG=y
++CONFIG_AT91SAM9_WATCHDOG=y
+
+ #
+ # USB-based Watchdog Cards
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/configs/at91sam9rlek_defconfig linux-2.6.29-rc3.owrt/arch/arm/configs/at91sam9rlek_defconfig
+--- linux-2.6.29.owrt/arch/arm/configs/at91sam9rlek_defconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/configs/at91sam9rlek_defconfig 2009-05-10 23:48:27.000000000 +0200
+@@ -606,7 +606,7 @@
+ # Watchdog Device Drivers
+ #
+ # CONFIG_SOFT_WATCHDOG is not set
+-CONFIG_AT91SAM9X_WATCHDOG=y
++CONFIG_AT91SAM9_WATCHDOG=y
+
+ #
+ # Sonics Silicon Backplane
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/configs/qil-a9260_defconfig linux-2.6.29-rc3.owrt/arch/arm/configs/qil-a9260_defconfig
+--- linux-2.6.29.owrt/arch/arm/configs/qil-a9260_defconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/configs/qil-a9260_defconfig 2009-05-10 23:48:27.000000000 +0200
+@@ -727,7 +727,7 @@
+ # Watchdog Device Drivers
+ #
+ # CONFIG_SOFT_WATCHDOG is not set
+-# CONFIG_AT91SAM9X_WATCHDOG is not set
++# CONFIG_AT91SAM9_WATCHDOG is not set
+
+ #
+ # USB-based Watchdog Cards
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/kernel/elf.c linux-2.6.29-rc3.owrt/arch/arm/kernel/elf.c
+--- linux-2.6.29.owrt/arch/arm/kernel/elf.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/kernel/elf.c 2009-05-10 23:48:27.000000000 +0200
+@@ -74,9 +74,9 @@
+ */
+ int arm_elf_read_implies_exec(const struct elf32_hdr *x, int executable_stack)
+ {
+- if (executable_stack != EXSTACK_DISABLE_X)
++ if (executable_stack != EXSTACK_ENABLE_X)
+ return 1;
+- if (cpu_architecture() < CPU_ARCH_ARMv6)
++ if (cpu_architecture() <= CPU_ARCH_ARMv6)
+ return 1;
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/kernel/entry-armv.S linux-2.6.29-rc3.owrt/arch/arm/kernel/entry-armv.S
+--- linux-2.6.29.owrt/arch/arm/kernel/entry-armv.S 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/kernel/entry-armv.S 2009-05-10 23:48:27.000000000 +0200
+@@ -650,7 +650,6 @@
+ no_fp: mov pc, lr
+
+ __und_usr_unknown:
+- enable_irq
+ mov r0, sp
+ adr lr, ret_from_exception
+ b do_undefinstr
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/kernel/entry-common.S linux-2.6.29-rc3.owrt/arch/arm/kernel/entry-common.S
+--- linux-2.6.29.owrt/arch/arm/kernel/entry-common.S 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/kernel/entry-common.S 2009-05-10 23:48:27.000000000 +0200
+@@ -111,7 +111,6 @@
+ .globl mcount_call
+ mcount_call:
+ bl ftrace_stub
+- ldr lr, [fp, #-4] @ restore lr
+ ldmia sp!, {r0-r3, pc}
+
+ ENTRY(ftrace_caller)
+@@ -123,7 +122,6 @@
+ .globl ftrace_call
+ ftrace_call:
+ bl ftrace_stub
+- ldr lr, [fp, #-4] @ restore lr
+ ldmia sp!, {r0-r3, pc}
+
+ #else
+@@ -135,16 +133,14 @@
+ adr r0, ftrace_stub
+ cmp r0, r2
+ bne trace
+- ldr lr, [fp, #-4] @ restore lr
+ ldmia sp!, {r0-r3, pc}
+
+ trace:
+- ldr r1, [fp, #-4] @ lr of instrumented routine
++ ldr r1, [fp, #-4]
+ mov r0, lr
+ sub r0, r0, #MCOUNT_INSN_SIZE
+ mov lr, pc
+ mov pc, r2
+- mov lr, r1 @ restore lr
+ ldmia sp!, {r0-r3, pc}
+
+ #endif /* CONFIG_DYNAMIC_FTRACE */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/kernel/fiq.c linux-2.6.29-rc3.owrt/arch/arm/kernel/fiq.c
+--- linux-2.6.29.owrt/arch/arm/kernel/fiq.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/kernel/fiq.c 2009-05-10 23:48:27.000000000 +0200
+@@ -88,7 +88,7 @@
+ * disable irqs for the duration. Note - these functions are almost
+ * entirely coded in assembly.
+ */
+-void __naked set_fiq_regs(struct pt_regs *regs)
++void __attribute__((naked)) set_fiq_regs(struct pt_regs *regs)
+ {
+ register unsigned long tmp;
+ asm volatile (
+@@ -106,7 +106,7 @@
+ : "r" (&regs->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | FIQ_MODE));
+ }
+
+-void __naked get_fiq_regs(struct pt_regs *regs)
++void __attribute__((naked)) get_fiq_regs(struct pt_regs *regs)
+ {
+ register unsigned long tmp;
+ asm volatile (
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/kernel/irq.c linux-2.6.29-rc3.owrt/arch/arm/kernel/irq.c
+--- linux-2.6.29.owrt/arch/arm/kernel/irq.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/kernel/irq.c 2009-05-10 23:48:27.000000000 +0200
+@@ -101,7 +101,7 @@
+ /* Handle bad interrupts */
+ static struct irq_desc bad_irq_desc = {
+ .handle_irq = handle_bad_irq,
+- .lock = __SPIN_LOCK_UNLOCKED(bad_irq_desc.lock),
++ .lock = SPIN_LOCK_UNLOCKED
+ };
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/kernel/machine_kexec.c linux-2.6.29-rc3.owrt/arch/arm/kernel/machine_kexec.c
+--- linux-2.6.29.owrt/arch/arm/kernel/machine_kexec.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/kernel/machine_kexec.c 2009-05-10 23:48:27.000000000 +0200
+@@ -13,8 +13,8 @@
+ #include <asm/cacheflush.h>
+ #include <asm/mach-types.h>
+
+-extern const unsigned char relocate_new_kernel[];
+-extern const unsigned int relocate_new_kernel_size;
++const extern unsigned char relocate_new_kernel[];
++const extern unsigned int relocate_new_kernel_size;
+
+ extern void setup_mm_for_reboot(char mode);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/kernel/setup.c linux-2.6.29-rc3.owrt/arch/arm/kernel/setup.c
+--- linux-2.6.29.owrt/arch/arm/kernel/setup.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/kernel/setup.c 2009-05-10 23:48:27.000000000 +0200
+@@ -233,13 +233,12 @@
+ unsigned int cachetype = read_cpuid_cachetype();
+ unsigned int arch = cpu_architecture();
+
+- if (arch >= CPU_ARCH_ARMv6) {
+- if ((cachetype & (7 << 29)) == 4 << 29) {
+- /* ARMv7 register format */
+- cacheid = CACHEID_VIPT_NONALIASING;
+- if ((cachetype & (3 << 14)) == 1 << 14)
+- cacheid |= CACHEID_ASID_TAGGED;
+- } else if (cachetype & (1 << 23))
++ if (arch >= CPU_ARCH_ARMv7) {
++ cacheid = CACHEID_VIPT_NONALIASING;
++ if ((cachetype & (3 << 14)) == 1 << 14)
++ cacheid |= CACHEID_ASID_TAGGED;
++ } else if (arch >= CPU_ARCH_ARMv6) {
++ if (cachetype & (1 << 23))
+ cacheid = CACHEID_VIPT_ALIASING;
+ else
+ cacheid = CACHEID_VIPT_NONALIASING;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-at91/at91cap9_devices.c linux-2.6.29-rc3.owrt/arch/arm/mach-at91/at91cap9_devices.c
+--- linux-2.6.29.owrt/arch/arm/mach-at91/at91cap9_devices.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-at91/at91cap9_devices.c 2009-05-10 23:48:27.000000000 +0200
+@@ -697,7 +697,7 @@
+ * Watchdog
+ * -------------------------------------------------------------------- */
+
+-#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
++#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
+ static struct platform_device at91cap9_wdt_device = {
+ .name = "at91_wdt",
+ .id = -1,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-at91/at91sam9260_devices.c linux-2.6.29-rc3.owrt/arch/arm/mach-at91/at91sam9260_devices.c
+--- linux-2.6.29.owrt/arch/arm/mach-at91/at91sam9260_devices.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-at91/at91sam9260_devices.c 2009-05-10 23:48:27.000000000 +0200
+@@ -643,7 +643,7 @@
+ * Watchdog
+ * -------------------------------------------------------------------- */
+
+-#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
++#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
+ static struct platform_device at91sam9260_wdt_device = {
+ .name = "at91_wdt",
+ .id = -1,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-at91/at91sam9261_devices.c linux-2.6.29-rc3.owrt/arch/arm/mach-at91/at91sam9261_devices.c
+--- linux-2.6.29.owrt/arch/arm/mach-at91/at91sam9261_devices.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-at91/at91sam9261_devices.c 2009-05-10 23:48:27.000000000 +0200
+@@ -621,7 +621,7 @@
+ * Watchdog
+ * -------------------------------------------------------------------- */
+
+-#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
++#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
+ static struct platform_device at91sam9261_wdt_device = {
+ .name = "at91_wdt",
+ .id = -1,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-at91/at91sam9263_devices.c linux-2.6.29-rc3.owrt/arch/arm/mach-at91/at91sam9263_devices.c
+--- linux-2.6.29.owrt/arch/arm/mach-at91/at91sam9263_devices.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-at91/at91sam9263_devices.c 2009-05-10 23:48:27.000000000 +0200
+@@ -347,111 +347,6 @@
+ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
+ #endif
+
+-/* --------------------------------------------------------------------
+- * Compact Flash (PCMCIA or IDE)
+- * -------------------------------------------------------------------- */
+-
+-#if defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE) || \
+- defined(CONFIG_BLK_DEV_IDE_AT91) || defined(CONFIG_BLK_DEV_IDE_AT91_MODULE)
+-
+-static struct at91_cf_data cf0_data;
+-
+-static struct resource cf0_resources[] = {
+- [0] = {
+- .start = AT91_CHIPSELECT_4,
+- .end = AT91_CHIPSELECT_4 + SZ_256M - 1,
+- .flags = IORESOURCE_MEM | IORESOURCE_MEM_8AND16BIT,
+- }
+-};
+-
+-static struct platform_device cf0_device = {
+- .id = 0,
+- .dev = {
+- .platform_data = &cf0_data,
+- },
+- .resource = cf0_resources,
+- .num_resources = ARRAY_SIZE(cf0_resources),
+-};
+-
+-static struct at91_cf_data cf1_data;
+-
+-static struct resource cf1_resources[] = {
+- [0] = {
+- .start = AT91_CHIPSELECT_5,
+- .end = AT91_CHIPSELECT_5 + SZ_256M - 1,
+- .flags = IORESOURCE_MEM | IORESOURCE_MEM_8AND16BIT,
+- }
+-};
+-
+-static struct platform_device cf1_device = {
+- .id = 1,
+- .dev = {
+- .platform_data = &cf1_data,
+- },
+- .resource = cf1_resources,
+- .num_resources = ARRAY_SIZE(cf1_resources),
+-};
+-
+-void __init at91_add_device_cf(struct at91_cf_data *data)
+-{
+- unsigned long ebi0_csa;
+- struct platform_device *pdev;
+-
+- if (!data)
+- return;
+-
+- /*
+- * assign CS4 or CS5 to SMC with Compact Flash logic support,
+- * we assume SMC timings are configured by board code,
+- * except True IDE where timings are controlled by driver
+- */
+- ebi0_csa = at91_sys_read(AT91_MATRIX_EBI0CSA);
+- switch (data->chipselect) {
+- case 4:
+- at91_set_A_periph(AT91_PIN_PD6, 0); /* EBI0_NCS4/CFCS0 */
+- ebi0_csa |= AT91_MATRIX_EBI0_CS4A_SMC_CF1;
+- cf0_data = *data;
+- pdev = &cf0_device;
+- break;
+- case 5:
+- at91_set_A_periph(AT91_PIN_PD7, 0); /* EBI0_NCS5/CFCS1 */
+- ebi0_csa |= AT91_MATRIX_EBI0_CS5A_SMC_CF2;
+- cf1_data = *data;
+- pdev = &cf1_device;
+- break;
+- default:
+- printk(KERN_ERR "AT91 CF: bad chip-select requested (%u)\n",
+- data->chipselect);
+- return;
+- }
+- at91_sys_write(AT91_MATRIX_EBI0CSA, ebi0_csa);
+-
+- if (data->det_pin) {
+- at91_set_gpio_input(data->det_pin, 1);
+- at91_set_deglitch(data->det_pin, 1);
+- }
+-
+- if (data->irq_pin) {
+- at91_set_gpio_input(data->irq_pin, 1);
+- at91_set_deglitch(data->irq_pin, 1);
+- }
+-
+- if (data->vcc_pin)
+- /* initially off */
+- at91_set_gpio_output(data->vcc_pin, 0);
+-
+- /* enable EBI controlled pins */
+- at91_set_A_periph(AT91_PIN_PD5, 1); /* NWAIT */
+- at91_set_A_periph(AT91_PIN_PD8, 0); /* CFCE1 */
+- at91_set_A_periph(AT91_PIN_PD9, 0); /* CFCE2 */
+- at91_set_A_periph(AT91_PIN_PD14, 0); /* CFNRW */
+-
+- pdev->name = (data->flags & AT91_CF_TRUE_IDE) ? "at91_ide" : "at91_cf";
+- platform_device_register(pdev);
+-}
+-#else
+-void __init at91_add_device_cf(struct at91_cf_data *data) {}
+-#endif
+
+ /* --------------------------------------------------------------------
+ * NAND / SmartMedia
+@@ -959,7 +854,7 @@
+ * Watchdog
+ * -------------------------------------------------------------------- */
+
+-#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
++#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
+ static struct platform_device at91sam9263_wdt_device = {
+ .name = "at91_wdt",
+ .id = -1,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-at91/at91sam9rl_devices.c linux-2.6.29-rc3.owrt/arch/arm/mach-at91/at91sam9rl_devices.c
+--- linux-2.6.29.owrt/arch/arm/mach-at91/at91sam9rl_devices.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-at91/at91sam9rl_devices.c 2009-05-10 23:48:27.000000000 +0200
+@@ -609,7 +609,7 @@
+ * Watchdog
+ * -------------------------------------------------------------------- */
+
+-#if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
++#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
+ static struct platform_device at91sam9rl_wdt_device = {
+ .name = "at91_wdt",
+ .id = -1,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-at91/gpio.c linux-2.6.29-rc3.owrt/arch/arm/mach-at91/gpio.c
+--- linux-2.6.29.owrt/arch/arm/mach-at91/gpio.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-at91/gpio.c 2009-05-10 23:48:27.000000000 +0200
+@@ -490,8 +490,7 @@
+
+ /*--------------------------------------------------------------------------*/
+
+-/*
+- * This lock class tells lockdep that GPIO irqs are in a different
++/* This lock class tells lockdep that GPIO irqs are in a different
+ * category than their parents, so it won't report false recursion.
+ */
+ static struct lock_class_key gpio_lock_class;
+@@ -510,6 +509,9 @@
+ unsigned id = this->id;
+ unsigned i;
+
++ /* enable PIO controller's clock */
++ clk_enable(this->clock);
++
+ __raw_writel(~0, this->regbase + PIO_IDR);
+
+ for (i = 0, pin = this->chipbase; i < 32; i++, pin++) {
+@@ -554,14 +556,7 @@
+ data->chipbase = PIN_BASE + i * 32;
+ data->regbase = data->offset + (void __iomem *)AT91_VA_BASE_SYS;
+
+- /* enable PIO controller's clock */
+- clk_enable(data->clock);
+-
+- /*
+- * Some processors share peripheral ID between multiple GPIO banks.
+- * SAM9263 (PIOC, PIOD, PIOE)
+- * CAP9 (PIOA, PIOB, PIOC, PIOD)
+- */
++ /* AT91SAM9263_ID_PIOCDE groups PIOC, PIOD, PIOE */
+ if (last && last->id == data->id)
+ last->next = data;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-at91/include/mach/board.h linux-2.6.29-rc3.owrt/arch/arm/mach-at91/include/mach/board.h
+--- linux-2.6.29.owrt/arch/arm/mach-at91/include/mach/board.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-at91/include/mach/board.h 2009-05-10 23:48:27.000000000 +0200
+@@ -56,9 +56,6 @@
+ u8 vcc_pin; /* power switching */
+ u8 rst_pin; /* card reset */
+ u8 chipselect; /* EBI Chip Select number */
+- u8 flags;
+-#define AT91_CF_TRUE_IDE 0x01
+-#define AT91_IDE_SWAP_A0_A2 0x02
+ };
+ extern void __init at91_add_device_cf(struct at91_cf_data *data);
+
+@@ -96,7 +93,6 @@
+ u8 enable_pin; /* chip enable */
+ u8 det_pin; /* card detect */
+ u8 rdy_pin; /* ready/busy */
+- u8 rdy_pin_active_low; /* rdy_pin value is inverted */
+ u8 ale; /* address line number connected to ALE */
+ u8 cle; /* address line number connected to CLE */
+ u8 bus_width_16; /* buswidth is 16 bit */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-at91/pm.c linux-2.6.29-rc3.owrt/arch/arm/mach-at91/pm.c
+--- linux-2.6.29.owrt/arch/arm/mach-at91/pm.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-at91/pm.c 2009-05-10 23:48:27.000000000 +0200
+@@ -332,6 +332,7 @@
+ at91_sys_read(AT91_AIC_IPR) & at91_sys_read(AT91_AIC_IMR));
+
+ error:
++ sdram_selfrefresh_disable();
+ target_state = PM_SUSPEND_ON;
+ at91_irq_resume();
+ at91_gpio_resume();
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-davinci/board-evm.c linux-2.6.29-rc3.owrt/arch/arm/mach-davinci/board-evm.c
+--- linux-2.6.29.owrt/arch/arm/mach-davinci/board-evm.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-davinci/board-evm.c 2009-05-10 23:48:27.000000000 +0200
+@@ -311,9 +311,6 @@
+ gpio_request(gpio + 7, "nCF_SEL");
+ gpio_direction_output(gpio + 7, 1);
+
+- /* irlml6401 sustains over 3A, switches 5V in under 8 msec */
+- setup_usb(500, 8);
+-
+ return 0;
+ }
+
+@@ -420,6 +417,9 @@
+ platform_add_devices(davinci_evm_devices,
+ ARRAY_SIZE(davinci_evm_devices));
+ evm_init_i2c();
++
++ /* irlml6401 sustains over 3A, switches 5V in under 8 msec */
++ setup_usb(500, 8);
+ }
+
+ static __init void davinci_evm_irq_init(void)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-davinci/clock.c linux-2.6.29-rc3.owrt/arch/arm/mach-davinci/clock.c
+--- linux-2.6.29.owrt/arch/arm/mach-davinci/clock.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-davinci/clock.c 2009-05-10 23:48:27.000000000 +0200
+@@ -231,11 +231,6 @@
+ .lpsc = DAVINCI_LPSC_GPIO,
+ },
+ {
+- .name = "usb",
+- .rate = &commonrate,
+- .lpsc = DAVINCI_LPSC_USB,
+- },
+- {
+ .name = "AEMIFCLK",
+ .rate = &commonrate,
+ .lpsc = DAVINCI_LPSC_AEMIF,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-davinci/usb.c linux-2.6.29-rc3.owrt/arch/arm/mach-davinci/usb.c
+--- linux-2.6.29.owrt/arch/arm/mach-davinci/usb.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-davinci/usb.c 2009-05-10 23:48:27.000000000 +0200
+@@ -47,7 +47,6 @@
+ #elif defined(CONFIG_USB_MUSB_HOST)
+ .mode = MUSB_HOST,
+ #endif
+- .clock = "usb",
+ .config = &musb_config,
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-ep93xx/include/mach/gesbc9312.h linux-2.6.29-rc3.owrt/arch/arm/mach-ep93xx/include/mach/gesbc9312.h
+--- linux-2.6.29.owrt/arch/arm/mach-ep93xx/include/mach/gesbc9312.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-ep93xx/include/mach/gesbc9312.h 2009-05-10 23:48:27.000000000 +0200
+@@ -0,0 +1,3 @@
++/*
++ * arch/arm/mach-ep93xx/include/mach/gesbc9312.h
++ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-ep93xx/include/mach/hardware.h linux-2.6.29-rc3.owrt/arch/arm/mach-ep93xx/include/mach/hardware.h
+--- linux-2.6.29.owrt/arch/arm/mach-ep93xx/include/mach/hardware.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-ep93xx/include/mach/hardware.h 2009-05-10 23:48:27.000000000 +0200
+@@ -10,6 +10,7 @@
+
+ #include "platform.h"
+
++#include "gesbc9312.h"
+ #include "ts72xx.h"
+
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-ep93xx/include/mach/platform.h linux-2.6.29-rc3.owrt/arch/arm/mach-ep93xx/include/mach/platform.h
+--- linux-2.6.29.owrt/arch/arm/mach-ep93xx/include/mach/platform.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-ep93xx/include/mach/platform.h 2009-05-10 23:48:27.000000000 +0200
+@@ -4,8 +4,6 @@
+
+ #ifndef __ASSEMBLY__
+
+-struct i2c_board_info;
+-
+ struct ep93xx_eth_data
+ {
+ unsigned char dev_addr[6];
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-kirkwood/irq.c linux-2.6.29-rc3.owrt/arch/arm/mach-kirkwood/irq.c
+--- linux-2.6.29.owrt/arch/arm/mach-kirkwood/irq.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-kirkwood/irq.c 2009-05-10 23:48:27.000000000 +0200
+@@ -42,7 +42,7 @@
+ writel(0, GPIO_EDGE_CAUSE(32));
+
+ for (i = IRQ_KIRKWOOD_GPIO_START; i < NR_IRQS; i++) {
+- set_irq_chip(i, &orion_gpio_irq_chip);
++ set_irq_chip(i, &orion_gpio_irq_level_chip);
+ set_irq_handler(i, handle_level_irq);
+ irq_desc[i].status |= IRQ_LEVEL;
+ set_irq_flags(i, IRQF_VALID);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-msm/board-halibut.c linux-2.6.29-rc3.owrt/arch/arm/mach-msm/board-halibut.c
+--- linux-2.6.29.owrt/arch/arm/mach-msm/board-halibut.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-msm/board-halibut.c 2009-05-10 23:48:27.000000000 +0200
+@@ -27,7 +27,6 @@
+ #include <asm/mach/map.h>
+ #include <asm/mach/flash.h>
+
+-#include <mach/irqs.h>
+ #include <mach/board.h>
+ #include <mach/msm_iomap.h>
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-mv78xx0/irq.c linux-2.6.29-rc3.owrt/arch/arm/mach-mv78xx0/irq.c
+--- linux-2.6.29.owrt/arch/arm/mach-mv78xx0/irq.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-mv78xx0/irq.c 2009-05-10 23:48:27.000000000 +0200
+@@ -40,7 +40,7 @@
+ writel(0, GPIO_EDGE_CAUSE(0));
+
+ for (i = IRQ_MV78XX0_GPIO_START; i < NR_IRQS; i++) {
+- set_irq_chip(i, &orion_gpio_irq_chip);
++ set_irq_chip(i, &orion_gpio_irq_level_chip);
+ set_irq_handler(i, handle_level_irq);
+ irq_desc[i].status |= IRQ_LEVEL;
+ set_irq_flags(i, IRQF_VALID);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-mx1/devices.c linux-2.6.29-rc3.owrt/arch/arm/mach-mx1/devices.c
+--- linux-2.6.29.owrt/arch/arm/mach-mx1/devices.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-mx1/devices.c 2009-05-10 23:48:27.000000000 +0200
+@@ -23,8 +23,6 @@
+ #include <linux/init.h>
+ #include <linux/platform_device.h>
+ #include <linux/gpio.h>
+-
+-#include <mach/irqs.h>
+ #include <mach/hardware.h>
+
+ static struct resource imx_csi_resources[] = {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-mx1/mx1ads.c linux-2.6.29-rc3.owrt/arch/arm/mach-mx1/mx1ads.c
+--- linux-2.6.29.owrt/arch/arm/mach-mx1/mx1ads.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-mx1/mx1ads.c 2009-05-10 23:48:27.000000000 +0200
+@@ -21,7 +21,6 @@
+ #include <asm/mach/arch.h>
+ #include <asm/mach/time.h>
+
+-#include <mach/irqs.h>
+ #include <mach/hardware.h>
+ #include <mach/common.h>
+ #include <mach/imx-uart.h>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-omap1/devices.c linux-2.6.29-rc3.owrt/arch/arm/mach-omap1/devices.c
+--- linux-2.6.29.owrt/arch/arm/mach-omap1/devices.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-omap1/devices.c 2009-05-10 23:48:27.000000000 +0200
+@@ -181,7 +181,7 @@
+ }
+ size = OMAP1_MMC_SIZE;
+
+- omap_mmc_add("mmci-omap", i, base, size, irq, mmc_data[i]);
++ omap_mmc_add(i, base, size, irq, mmc_data[i]);
+ };
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-omap1/mcbsp.c linux-2.6.29-rc3.owrt/arch/arm/mach-omap1/mcbsp.c
+--- linux-2.6.29.owrt/arch/arm/mach-omap1/mcbsp.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-omap1/mcbsp.c 2009-05-10 23:48:27.000000000 +0200
+@@ -28,8 +28,81 @@
+ #define DPS_RSTCT2_PER_EN (1 << 0)
+ #define DSP_RSTCT2_WD_PER_EN (1 << 1)
+
++struct mcbsp_internal_clk {
++ struct clk clk;
++ struct clk **childs;
++ int n_childs;
++};
++
+ #if defined(CONFIG_ARCH_OMAP15XX) || defined(CONFIG_ARCH_OMAP16XX)
+-const char *clk_names[] = { "dsp_ck", "api_ck", "dspxor_ck" };
++static void omap_mcbsp_clk_init(struct mcbsp_internal_clk *mclk)
++{
++ const char *clk_names[] = { "dsp_ck", "api_ck", "dspxor_ck" };
++ int i;
++
++ mclk->n_childs = ARRAY_SIZE(clk_names);
++ mclk->childs = kzalloc(mclk->n_childs * sizeof(struct clk *),
++ GFP_KERNEL);
++
++ for (i = 0; i < mclk->n_childs; i++) {
++ /* We fake a platform device to get correct device id */
++ struct platform_device pdev;
++
++ pdev.dev.bus = &platform_bus_type;
++ pdev.id = mclk->clk.id;
++ mclk->childs[i] = clk_get(&pdev.dev, clk_names[i]);
++ if (IS_ERR(mclk->childs[i]))
++ printk(KERN_ERR "Could not get clock %s (%d).\n",
++ clk_names[i], mclk->clk.id);
++ }
++}
++
++static int omap_mcbsp_clk_enable(struct clk *clk)
++{
++ struct mcbsp_internal_clk *mclk = container_of(clk,
++ struct mcbsp_internal_clk, clk);
++ int i;
++
++ for (i = 0; i < mclk->n_childs; i++)
++ clk_enable(mclk->childs[i]);
++ return 0;
++}
++
++static void omap_mcbsp_clk_disable(struct clk *clk)
++{
++ struct mcbsp_internal_clk *mclk = container_of(clk,
++ struct mcbsp_internal_clk, clk);
++ int i;
++
++ for (i = 0; i < mclk->n_childs; i++)
++ clk_disable(mclk->childs[i]);
++}
++
++static struct mcbsp_internal_clk omap_mcbsp_clks[] = {
++ {
++ .clk = {
++ .name = "mcbsp_clk",
++ .id = 1,
++ .enable = omap_mcbsp_clk_enable,
++ .disable = omap_mcbsp_clk_disable,
++ },
++ },
++ {
++ .clk = {
++ .name = "mcbsp_clk",
++ .id = 3,
++ .enable = omap_mcbsp_clk_enable,
++ .disable = omap_mcbsp_clk_disable,
++ },
++ },
++};
++
++#define omap_mcbsp_clks_size ARRAY_SIZE(omap_mcbsp_clks)
++#else
++#define omap_mcbsp_clks_size 0
++static struct mcbsp_internal_clk __initdata *omap_mcbsp_clks;
++static inline void omap_mcbsp_clk_init(struct mcbsp_internal_clk *mclk)
++{ }
+ #endif
+
+ static void omap1_mcbsp_request(unsigned int id)
+@@ -94,9 +167,8 @@
+ .rx_irq = INT_McBSP1RX,
+ .tx_irq = INT_McBSP1TX,
+ .ops = &omap1_mcbsp_ops,
+- .clk_names = clk_names,
+- .num_clks = 3,
+- },
++ .clk_name = "mcbsp_clk",
++ },
+ {
+ .phys_base = OMAP1510_MCBSP2_BASE,
+ .dma_rx_sync = OMAP_DMA_MCBSP2_RX,
+@@ -112,8 +184,7 @@
+ .rx_irq = INT_McBSP3RX,
+ .tx_irq = INT_McBSP3TX,
+ .ops = &omap1_mcbsp_ops,
+- .clk_names = clk_names,
+- .num_clks = 3,
++ .clk_name = "mcbsp_clk",
+ },
+ };
+ #define OMAP15XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap15xx_mcbsp_pdata)
+@@ -131,8 +202,7 @@
+ .rx_irq = INT_McBSP1RX,
+ .tx_irq = INT_McBSP1TX,
+ .ops = &omap1_mcbsp_ops,
+- .clk_names = clk_names,
+- .num_clks = 3,
++ .clk_name = "mcbsp_clk",
+ },
+ {
+ .phys_base = OMAP1610_MCBSP2_BASE,
+@@ -149,8 +219,7 @@
+ .rx_irq = INT_McBSP3RX,
+ .tx_irq = INT_McBSP3TX,
+ .ops = &omap1_mcbsp_ops,
+- .clk_names = clk_names,
+- .num_clks = 3,
++ .clk_name = "mcbsp_clk",
+ },
+ };
+ #define OMAP16XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap16xx_mcbsp_pdata)
+@@ -161,6 +230,15 @@
+
+ int __init omap1_mcbsp_init(void)
+ {
++ int i;
++
++ for (i = 0; i < omap_mcbsp_clks_size; i++) {
++ if (cpu_is_omap15xx() || cpu_is_omap16xx()) {
++ omap_mcbsp_clk_init(&omap_mcbsp_clks[i]);
++ clk_register(&omap_mcbsp_clks[i].clk);
++ }
++ }
++
+ if (cpu_is_omap730())
+ omap_mcbsp_count = OMAP730_MCBSP_PDATA_SZ;
+ if (cpu_is_omap15xx())
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-omap2/board-ldp.c linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/board-ldp.c
+--- linux-2.6.29.owrt/arch/arm/mach-omap2/board-ldp.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/board-ldp.c 2009-05-10 23:48:27.000000000 +0200
+@@ -81,7 +81,7 @@
+ }
+
+ ldp_smc911x_resources[0].start = cs_mem_base + 0x0;
+- ldp_smc911x_resources[0].end = cs_mem_base + 0xff;
++ ldp_smc911x_resources[0].end = cs_mem_base + 0xf;
+ udelay(100);
+
+ eth_gpio = LDP_SMC911X_GPIO;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-omap2/board-omap3beagle.c linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/board-omap3beagle.c
+--- linux-2.6.29.owrt/arch/arm/mach-omap2/board-omap3beagle.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/board-omap3beagle.c 2009-05-10 23:48:27.000000000 +0200
+@@ -178,9 +178,7 @@
+ #ifdef CONFIG_I2C2_OMAP_BEAGLE
+ omap_register_i2c_bus(2, 400, NULL, 0);
+ #endif
+- /* Bus 3 is attached to the DVI port where devices like the pico DLP
+- * projector don't work reliably with 400kHz */
+- omap_register_i2c_bus(3, 100, NULL, 0);
++ omap_register_i2c_bus(3, 400, NULL, 0);
+ return 0;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-omap2/clock.c linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/clock.c
+--- linux-2.6.29.owrt/arch/arm/mach-omap2/clock.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/clock.c 2009-05-10 23:48:27.000000000 +0200
+@@ -565,7 +565,7 @@
+ *
+ * Given a struct clk of a rate-selectable clksel clock, and a clock divisor,
+ * find the corresponding register field value. The return register value is
+- * the value before left-shifting. Returns ~0 on error
++ * the value before left-shifting. Returns 0xffffffff on error
+ */
+ u32 omap2_divisor_to_clksel(struct clk *clk, u32 div)
+ {
+@@ -577,7 +577,7 @@
+
+ clks = omap2_get_clksel_by_parent(clk, clk->parent);
+ if (clks == NULL)
+- return ~0;
++ return 0;
+
+ for (clkr = clks->rates; clkr->div; clkr++) {
+ if ((clkr->flags & cpu_mask) && (clkr->div == div))
+@@ -588,7 +588,7 @@
+ printk(KERN_ERR "clock: Could not find divisor %d for "
+ "clock %s parent %s\n", div, clk->name,
+ clk->parent->name);
+- return ~0;
++ return 0;
+ }
+
+ return clkr->val;
+@@ -708,7 +708,7 @@
+ return 0;
+
+ for (clkr = clks->rates; clkr->div; clkr++) {
+- if (clkr->flags & cpu_mask && clkr->flags & DEFAULT_RATE)
++ if (clkr->flags & (cpu_mask | DEFAULT_RATE))
+ break; /* Found the default rate for this platform */
+ }
+
+@@ -746,7 +746,7 @@
+ return -EINVAL;
+
+ if (clk->usecount > 0)
+- omap2_clk_disable(clk);
++ _omap2_clk_disable(clk);
+
+ /* Set new source value (previous dividers if any in effect) */
+ reg_val = __raw_readl(src_addr) & ~field_mask;
+@@ -759,10 +759,10 @@
+ wmb();
+ }
+
+- clk->parent = new_parent;
+-
+ if (clk->usecount > 0)
+- omap2_clk_enable(clk);
++ _omap2_clk_enable(clk);
++
++ clk->parent = new_parent;
+
+ /* CLKSEL clocks follow their parents' rates, divided by a divisor */
+ clk->rate = new_parent->rate;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-omap2/devices.c linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/devices.c
+--- linux-2.6.29.owrt/arch/arm/mach-omap2/devices.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/devices.c 2009-05-10 23:48:27.000000000 +0200
+@@ -421,7 +421,6 @@
+ int nr_controllers)
+ {
+ int i;
+- char *name;
+
+ for (i = 0; i < nr_controllers; i++) {
+ unsigned long base, size;
+@@ -451,14 +450,12 @@
+ continue;
+ }
+
+- if (cpu_is_omap2420()) {
++ if (cpu_is_omap2420())
+ size = OMAP2420_MMC_SIZE;
+- name = "mmci-omap";
+- } else {
++ else
+ size = HSMMC_SIZE;
+- name = "mmci-omap-hs";
+- }
+- omap_mmc_add(name, i, base, size, irq, mmc_data[i]);
++
++ omap_mmc_add(i, base, size, irq, mmc_data[i]);
+ };
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-omap2/id.c linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/id.c
+--- linux-2.6.29.owrt/arch/arm/mach-omap2/id.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/id.c 2009-05-10 23:48:27.000000000 +0200
+@@ -172,13 +172,9 @@
+ omap_revision = OMAP3430_REV_ES3_0;
+ rev_name = "ES3.0";
+ break;
+- case 4:
+- omap_revision = OMAP3430_REV_ES3_1;
+- rev_name = "ES3.1";
+- break;
+ default:
+ /* Use the latest known revision as default */
+- omap_revision = OMAP3430_REV_ES3_1;
++ omap_revision = OMAP3430_REV_ES3_0;
+ rev_name = "Unknown revision\n";
+ }
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-omap2/irq.c linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/irq.c
+--- linux-2.6.29.owrt/arch/arm/mach-omap2/irq.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/irq.c 2009-05-10 23:48:27.000000000 +0200
+@@ -134,7 +134,6 @@
+ .ack = omap_mask_ack_irq,
+ .mask = omap_mask_irq,
+ .unmask = omap_unmask_irq,
+- .disable = omap_mask_irq,
+ };
+
+ static void __init omap_irq_bank_init_one(struct omap_irq_bank *bank)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-omap2/mcbsp.c linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/mcbsp.c
+--- linux-2.6.29.owrt/arch/arm/mach-omap2/mcbsp.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/mcbsp.c 2009-05-10 23:48:27.000000000 +0200
+@@ -24,7 +24,106 @@
+ #include <mach/cpu.h>
+ #include <mach/mcbsp.h>
+
+-const char *clk_names[] = { "mcbsp_ick", "mcbsp_fck" };
++struct mcbsp_internal_clk {
++ struct clk clk;
++ struct clk **childs;
++ int n_childs;
++};
++
++#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)
++static void omap_mcbsp_clk_init(struct mcbsp_internal_clk *mclk)
++{
++ const char *clk_names[] = { "mcbsp_ick", "mcbsp_fck" };
++ int i;
++
++ mclk->n_childs = ARRAY_SIZE(clk_names);
++ mclk->childs = kzalloc(mclk->n_childs * sizeof(struct clk *),
++ GFP_KERNEL);
++
++ for (i = 0; i < mclk->n_childs; i++) {
++ /* We fake a platform device to get correct device id */
++ struct platform_device pdev;
++
++ pdev.dev.bus = &platform_bus_type;
++ pdev.id = mclk->clk.id;
++ mclk->childs[i] = clk_get(&pdev.dev, clk_names[i]);
++ if (IS_ERR(mclk->childs[i]))
++ printk(KERN_ERR "Could not get clock %s (%d).\n",
++ clk_names[i], mclk->clk.id);
++ }
++}
++
++static int omap_mcbsp_clk_enable(struct clk *clk)
++{
++ struct mcbsp_internal_clk *mclk = container_of(clk,
++ struct mcbsp_internal_clk, clk);
++ int i;
++
++ for (i = 0; i < mclk->n_childs; i++)
++ clk_enable(mclk->childs[i]);
++ return 0;
++}
++
++static void omap_mcbsp_clk_disable(struct clk *clk)
++{
++ struct mcbsp_internal_clk *mclk = container_of(clk,
++ struct mcbsp_internal_clk, clk);
++ int i;
++
++ for (i = 0; i < mclk->n_childs; i++)
++ clk_disable(mclk->childs[i]);
++}
++
++static struct mcbsp_internal_clk omap_mcbsp_clks[] = {
++ {
++ .clk = {
++ .name = "mcbsp_clk",
++ .id = 1,
++ .enable = omap_mcbsp_clk_enable,
++ .disable = omap_mcbsp_clk_disable,
++ },
++ },
++ {
++ .clk = {
++ .name = "mcbsp_clk",
++ .id = 2,
++ .enable = omap_mcbsp_clk_enable,
++ .disable = omap_mcbsp_clk_disable,
++ },
++ },
++ {
++ .clk = {
++ .name = "mcbsp_clk",
++ .id = 3,
++ .enable = omap_mcbsp_clk_enable,
++ .disable = omap_mcbsp_clk_disable,
++ },
++ },
++ {
++ .clk = {
++ .name = "mcbsp_clk",
++ .id = 4,
++ .enable = omap_mcbsp_clk_enable,
++ .disable = omap_mcbsp_clk_disable,
++ },
++ },
++ {
++ .clk = {
++ .name = "mcbsp_clk",
++ .id = 5,
++ .enable = omap_mcbsp_clk_enable,
++ .disable = omap_mcbsp_clk_disable,
++ },
++ },
++};
++
++#define omap_mcbsp_clks_size ARRAY_SIZE(omap_mcbsp_clks)
++#else
++#define omap_mcbsp_clks_size 0
++static struct mcbsp_internal_clk __initdata *omap_mcbsp_clks;
++static inline void omap_mcbsp_clk_init(struct clk *clk)
++{ }
++#endif
+
+ static void omap2_mcbsp2_mux_setup(void)
+ {
+@@ -57,8 +156,7 @@
+ .rx_irq = INT_24XX_MCBSP1_IRQ_RX,
+ .tx_irq = INT_24XX_MCBSP1_IRQ_TX,
+ .ops = &omap2_mcbsp_ops,
+- .clk_names = clk_names,
+- .num_clks = 2,
++ .clk_name = "mcbsp_clk",
+ },
+ {
+ .phys_base = OMAP24XX_MCBSP2_BASE,
+@@ -67,8 +165,7 @@
+ .rx_irq = INT_24XX_MCBSP2_IRQ_RX,
+ .tx_irq = INT_24XX_MCBSP2_IRQ_TX,
+ .ops = &omap2_mcbsp_ops,
+- .clk_names = clk_names,
+- .num_clks = 2,
++ .clk_name = "mcbsp_clk",
+ },
+ };
+ #define OMAP2420_MCBSP_PDATA_SZ ARRAY_SIZE(omap2420_mcbsp_pdata)
+@@ -86,8 +183,7 @@
+ .rx_irq = INT_24XX_MCBSP1_IRQ_RX,
+ .tx_irq = INT_24XX_MCBSP1_IRQ_TX,
+ .ops = &omap2_mcbsp_ops,
+- .clk_names = clk_names,
+- .num_clks = 2,
++ .clk_name = "mcbsp_clk",
+ },
+ {
+ .phys_base = OMAP24XX_MCBSP2_BASE,
+@@ -96,8 +192,7 @@
+ .rx_irq = INT_24XX_MCBSP2_IRQ_RX,
+ .tx_irq = INT_24XX_MCBSP2_IRQ_TX,
+ .ops = &omap2_mcbsp_ops,
+- .clk_names = clk_names,
+- .num_clks = 2,
++ .clk_name = "mcbsp_clk",
+ },
+ {
+ .phys_base = OMAP2430_MCBSP3_BASE,
+@@ -106,8 +201,7 @@
+ .rx_irq = INT_24XX_MCBSP3_IRQ_RX,
+ .tx_irq = INT_24XX_MCBSP3_IRQ_TX,
+ .ops = &omap2_mcbsp_ops,
+- .clk_names = clk_names,
+- .num_clks = 2,
++ .clk_name = "mcbsp_clk",
+ },
+ {
+ .phys_base = OMAP2430_MCBSP4_BASE,
+@@ -116,8 +210,7 @@
+ .rx_irq = INT_24XX_MCBSP4_IRQ_RX,
+ .tx_irq = INT_24XX_MCBSP4_IRQ_TX,
+ .ops = &omap2_mcbsp_ops,
+- .clk_names = clk_names,
+- .num_clks = 2,
++ .clk_name = "mcbsp_clk",
+ },
+ {
+ .phys_base = OMAP2430_MCBSP5_BASE,
+@@ -126,8 +219,7 @@
+ .rx_irq = INT_24XX_MCBSP5_IRQ_RX,
+ .tx_irq = INT_24XX_MCBSP5_IRQ_TX,
+ .ops = &omap2_mcbsp_ops,
+- .clk_names = clk_names,
+- .num_clks = 2,
++ .clk_name = "mcbsp_clk",
+ },
+ };
+ #define OMAP2430_MCBSP_PDATA_SZ ARRAY_SIZE(omap2430_mcbsp_pdata)
+@@ -145,8 +237,7 @@
+ .rx_irq = INT_24XX_MCBSP1_IRQ_RX,
+ .tx_irq = INT_24XX_MCBSP1_IRQ_TX,
+ .ops = &omap2_mcbsp_ops,
+- .clk_names = clk_names,
+- .num_clks = 2,
++ .clk_name = "mcbsp_clk",
+ },
+ {
+ .phys_base = OMAP34XX_MCBSP2_BASE,
+@@ -155,8 +246,7 @@
+ .rx_irq = INT_24XX_MCBSP2_IRQ_RX,
+ .tx_irq = INT_24XX_MCBSP2_IRQ_TX,
+ .ops = &omap2_mcbsp_ops,
+- .clk_names = clk_names,
+- .num_clks = 2,
++ .clk_name = "mcbsp_clk",
+ },
+ {
+ .phys_base = OMAP34XX_MCBSP3_BASE,
+@@ -165,8 +255,7 @@
+ .rx_irq = INT_24XX_MCBSP3_IRQ_RX,
+ .tx_irq = INT_24XX_MCBSP3_IRQ_TX,
+ .ops = &omap2_mcbsp_ops,
+- .clk_names = clk_names,
+- .num_clks = 2,
++ .clk_name = "mcbsp_clk",
+ },
+ {
+ .phys_base = OMAP34XX_MCBSP4_BASE,
+@@ -175,8 +264,7 @@
+ .rx_irq = INT_24XX_MCBSP4_IRQ_RX,
+ .tx_irq = INT_24XX_MCBSP4_IRQ_TX,
+ .ops = &omap2_mcbsp_ops,
+- .clk_names = clk_names,
+- .num_clks = 2,
++ .clk_name = "mcbsp_clk",
+ },
+ {
+ .phys_base = OMAP34XX_MCBSP5_BASE,
+@@ -185,8 +273,7 @@
+ .rx_irq = INT_24XX_MCBSP5_IRQ_RX,
+ .tx_irq = INT_24XX_MCBSP5_IRQ_TX,
+ .ops = &omap2_mcbsp_ops,
+- .clk_names = clk_names,
+- .num_clks = 2,
++ .clk_name = "mcbsp_clk",
+ },
+ };
+ #define OMAP34XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap34xx_mcbsp_pdata)
+@@ -197,6 +284,14 @@
+
+ static int __init omap2_mcbsp_init(void)
+ {
++ int i;
++
++ for (i = 0; i < omap_mcbsp_clks_size; i++) {
++ /* Once we call clk_get inside init, we do not register it */
++ omap_mcbsp_clk_init(&omap_mcbsp_clks[i]);
++ clk_register(&omap_mcbsp_clks[i].clk);
++ }
++
+ if (cpu_is_omap2420())
+ omap_mcbsp_count = OMAP2420_MCBSP_PDATA_SZ;
+ if (cpu_is_omap2430())
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-omap2/sleep24xx.S linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/sleep24xx.S
+--- linux-2.6.29.owrt/arch/arm/mach-omap2/sleep24xx.S 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/sleep24xx.S 2009-05-10 23:48:28.000000000 +0200
+@@ -93,8 +93,9 @@
+ orr r4, r4, #0x40 @ enable self refresh on idle req
+ mov r5, #0x2000 @ set delay (DPLL relock + DLL relock)
+ str r4, [r2] @ make it so
++ mov r2, #0
+ nop
+- mcr p15, 0, r3, c7, c0, 4 @ wait for interrupt
++ mcr p15, 0, r2, c7, c0, 4 @ wait for interrupt
+ nop
+ loop:
+ subs r5, r5, #0x1 @ awake, wait just a bit
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-omap2/timer-gp.c linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/timer-gp.c
+--- linux-2.6.29.owrt/arch/arm/mach-omap2/timer-gp.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-omap2/timer-gp.c 2009-05-10 23:48:28.000000000 +0200
+@@ -118,8 +118,7 @@
+ clockevent_gpt.max_delta_ns =
+ clockevent_delta2ns(0xffffffff, &clockevent_gpt);
+ clockevent_gpt.min_delta_ns =
+- clockevent_delta2ns(3, &clockevent_gpt);
+- /* Timer internal resynch latency. */
++ clockevent_delta2ns(1, &clockevent_gpt);
+
+ clockevent_gpt.cpumask = cpumask_of(0);
+ clockevents_register_device(&clockevent_gpt);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-orion5x/common.c linux-2.6.29-rc3.owrt/arch/arm/mach-orion5x/common.c
+--- linux-2.6.29.owrt/arch/arm/mach-orion5x/common.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-orion5x/common.c 2009-05-10 23:48:28.000000000 +0200
+@@ -431,10 +431,6 @@
+ /*****************************************************************************
+ * XOR engine
+ ****************************************************************************/
+-struct mv_xor_platform_shared_data orion5x_xor_shared_data = {
+- .dram = &orion5x_mbus_dram_info,
+-};
+-
+ static struct resource orion5x_xor_shared_resources[] = {
+ {
+ .name = "xor low",
+@@ -452,9 +448,6 @@
+ static struct platform_device orion5x_xor_shared = {
+ .name = MV_XOR_SHARED_NAME,
+ .id = 0,
+- .dev = {
+- .platform_data = &orion5x_xor_shared_data,
+- },
+ .num_resources = ARRAY_SIZE(orion5x_xor_shared_resources),
+ .resource = orion5x_xor_shared_resources,
+ };
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-orion5x/irq.c linux-2.6.29-rc3.owrt/arch/arm/mach-orion5x/irq.c
+--- linux-2.6.29.owrt/arch/arm/mach-orion5x/irq.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-orion5x/irq.c 2009-05-10 23:48:28.000000000 +0200
+@@ -44,7 +44,7 @@
+ * User can use set_type() if he wants to use edge types handlers.
+ */
+ for (i = IRQ_ORION5X_GPIO_START; i < NR_IRQS; i++) {
+- set_irq_chip(i, &orion_gpio_irq_chip);
++ set_irq_chip(i, &orion_gpio_irq_level_chip);
+ set_irq_handler(i, handle_level_irq);
+ irq_desc[i].status |= IRQ_LEVEL;
+ set_irq_flags(i, IRQF_VALID);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-pxa/dma.c linux-2.6.29-rc3.owrt/arch/arm/mach-pxa/dma.c
+--- linux-2.6.29.owrt/arch/arm/mach-pxa/dma.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-pxa/dma.c 2009-05-10 23:48:28.000000000 +0200
+@@ -121,16 +121,6 @@
+ if (dma_channels == NULL)
+ return -ENOMEM;
+
+- /* dma channel priorities on pxa2xx processors:
+- * ch 0 - 3, 16 - 19 <--> (0) DMA_PRIO_HIGH
+- * ch 4 - 7, 20 - 23 <--> (1) DMA_PRIO_MEDIUM
+- * ch 8 - 15, 24 - 31 <--> (2) DMA_PRIO_LOW
+- */
+- for (i = 0; i < num_ch; i++) {
+- DCSR(i) = 0;
+- dma_channels[i].prio = min((i & 0xf) >> 2, DMA_PRIO_LOW);
+- }
+-
+ ret = request_irq(IRQ_DMA, dma_irq_handler, IRQF_DISABLED, "DMA", NULL);
+ if (ret) {
+ printk (KERN_CRIT "Wow! Can't register IRQ for DMA\n");
+@@ -138,6 +128,14 @@
+ return ret;
+ }
+
++ /* dma channel priorities on pxa2xx processors:
++ * ch 0 - 3, 16 - 19 <--> (0) DMA_PRIO_HIGH
++ * ch 4 - 7, 20 - 23 <--> (1) DMA_PRIO_MEDIUM
++ * ch 8 - 15, 24 - 31 <--> (2) DMA_PRIO_LOW
++ */
++ for (i = 0; i < num_ch; i++)
++ dma_channels[i].prio = min((i & 0xf) >> 2, DMA_PRIO_LOW);
++
+ num_dma_channels = num_ch;
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-pxa/include/mach/regs-ac97.h linux-2.6.29-rc3.owrt/arch/arm/mach-pxa/include/mach/regs-ac97.h
+--- linux-2.6.29.owrt/arch/arm/mach-pxa/include/mach/regs-ac97.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-pxa/include/mach/regs-ac97.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,8 +1,6 @@
+ #ifndef __ASM_ARCH_REGS_AC97_H
+ #define __ASM_ARCH_REGS_AC97_H
+
+-#include <mach/hardware.h>
+-
+ /*
+ * AC97 Controller registers
+ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-pxa/include/mach/regs-ssp.h linux-2.6.29-rc3.owrt/arch/arm/mach-pxa/include/mach/regs-ssp.h
+--- linux-2.6.29.owrt/arch/arm/mach-pxa/include/mach/regs-ssp.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-pxa/include/mach/regs-ssp.h 2009-05-10 23:48:28.000000000 +0200
+@@ -41,9 +41,6 @@
+ #elif defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx)
+ #define SSCR0_SCR (0x000fff00) /* Serial Clock Rate (mask) */
+ #define SSCR0_SerClkDiv(x) (((x) - 1) << 8) /* Divisor [1..4096] */
+-#endif
+-
+-#if defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx)
+ #define SSCR0_EDSS (1 << 20) /* Extended data size select */
+ #define SSCR0_NCS (1 << 21) /* Network clock select */
+ #define SSCR0_RIM (1 << 22) /* Receive FIFO overrrun interrupt mask */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-pxa/pxa300.c linux-2.6.29-rc3.owrt/arch/arm/mach-pxa/pxa300.c
+--- linux-2.6.29.owrt/arch/arm/mach-pxa/pxa300.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-pxa/pxa300.c 2009-05-10 23:48:28.000000000 +0200
+@@ -88,13 +88,13 @@
+ static DEFINE_PXA3_CKEN(common_nand, NAND, 156000000, 0);
+
+ static struct clk_lookup common_clkregs[] = {
+- INIT_CLKREG(&clk_common_nand, "pxa3xx-nand", NULL),
++ INIT_CLKREG(&clk_common_nand, "pxa3xx-nand", "NANDCLK"),
+ };
+
+ static DEFINE_PXA3_CKEN(pxa310_mmc3, MMC3, 19500000, 0);
+
+ static struct clk_lookup pxa310_clkregs[] = {
+- INIT_CLKREG(&clk_pxa310_mmc3, "pxa2xx-mci.2", NULL),
++ INIT_CLKREG(&clk_pxa310_mmc3, "pxa2xx-mci.2", "MMCCLK"),
+ };
+
+ static int __init pxa300_init(void)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-pxa/pxa320.c linux-2.6.29-rc3.owrt/arch/arm/mach-pxa/pxa320.c
+--- linux-2.6.29.owrt/arch/arm/mach-pxa/pxa320.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-pxa/pxa320.c 2009-05-10 23:48:28.000000000 +0200
+@@ -83,7 +83,7 @@
+ static DEFINE_PXA3_CKEN(pxa320_nand, NAND, 104000000, 0);
+
+ static struct clk_lookup pxa320_clkregs[] = {
+- INIT_CLKREG(&clk_pxa320_nand, "pxa3xx-nand", NULL),
++ INIT_CLKREG(&clk_pxa320_nand, "pxa3xx-nand", "NANDCLK"),
+ };
+
+ static int __init pxa320_init(void)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-rpc/riscpc.c linux-2.6.29-rc3.owrt/arch/arm/mach-rpc/riscpc.c
+--- linux-2.6.29.owrt/arch/arm/mach-rpc/riscpc.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-rpc/riscpc.c 2009-05-10 23:48:28.000000000 +0200
+@@ -19,7 +19,6 @@
+ #include <linux/serial_8250.h>
+ #include <linux/ata_platform.h>
+ #include <linux/io.h>
+-#include <linux/i2c.h>
+
+ #include <asm/elf.h>
+ #include <asm/mach-types.h>
+@@ -202,13 +201,8 @@
+ &pata_device,
+ };
+
+-static struct i2c_board_info i2c_rtc = {
+- I2C_BOARD_INFO("pcf8583", 0x50)
+-};
+-
+ static int __init rpc_init(void)
+ {
+- i2c_register_board_info(0, &i2c_rtc, 1);
+ return platform_add_devices(devs, ARRAY_SIZE(devs));
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-s3c6410/mach-smdk6410.c linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6410/mach-smdk6410.c
+--- linux-2.6.29.owrt/arch/arm/mach-s3c6410/mach-smdk6410.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6410/mach-smdk6410.c 2009-05-10 23:48:28.000000000 +0200
+@@ -129,7 +129,7 @@
+ .vidcon1 = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,
+ };
+
+-static struct map_desc smdk6410_iodesc[] = {};
++struct map_desc smdk6410_iodesc[] = {};
+
+ static struct platform_device *smdk6410_devices[] __initdata = {
+ #ifdef CONFIG_SMDK6410_SD_CH0
+@@ -146,7 +146,7 @@
+
+ static struct i2c_board_info i2c_devs0[] __initdata = {
+ { I2C_BOARD_INFO("24c08", 0x50), },
+- { I2C_BOARD_INFO("wm8580", 0x1b), },
++ { I2C_BOARD_INFO("WM8580", 0X1b), },
+ };
+
+ static struct i2c_board_info i2c_devs1[] __initdata = {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mach-sa1100/generic.c linux-2.6.29-rc3.owrt/arch/arm/mach-sa1100/generic.c
+--- linux-2.6.29.owrt/arch/arm/mach-sa1100/generic.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mach-sa1100/generic.c 2009-05-10 23:48:28.000000000 +0200
+@@ -289,7 +289,7 @@
+ };
+
+ static struct platform_device sa11x0mtd_device = {
+- .name = "sa1100-mtd",
++ .name = "flash",
+ .id = -1,
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mm/abort-ev6.S linux-2.6.29-rc3.owrt/arch/arm/mm/abort-ev6.S
+--- linux-2.6.29.owrt/arch/arm/mm/abort-ev6.S 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mm/abort-ev6.S 2009-05-10 23:48:28.000000000 +0200
+@@ -23,8 +23,7 @@
+ #ifdef CONFIG_CPU_32v6K
+ clrex
+ #else
+- sub r1, sp, #4 @ Get unused stack location
+- strex r0, r1, [r1] @ Clear the exclusive monitor
++ strex r0, r1, [sp] @ Clear the exclusive monitor
+ #endif
+ mrc p15, 0, r1, c5, c0, 0 @ get FSR
+ mrc p15, 0, r0, c6, c0, 0 @ get FAR
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mm/copypage-feroceon.c linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-feroceon.c
+--- linux-2.6.29.owrt/arch/arm/mm/copypage-feroceon.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-feroceon.c 2009-05-10 23:48:28.000000000 +0200
+@@ -13,7 +13,7 @@
+ #include <linux/init.h>
+ #include <linux/highmem.h>
+
+-static void __naked
++static void __attribute__((naked))
+ feroceon_copy_user_page(void *kto, const void *kfrom)
+ {
+ asm("\
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mm/copypage-v3.c linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-v3.c
+--- linux-2.6.29.owrt/arch/arm/mm/copypage-v3.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-v3.c 2009-05-10 23:48:28.000000000 +0200
+@@ -15,7 +15,7 @@
+ *
+ * FIXME: do we need to handle cache stuff...
+ */
+-static void __naked
++static void __attribute__((naked))
+ v3_copy_user_page(void *kto, const void *kfrom)
+ {
+ asm("\n\
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mm/copypage-v4mc.c linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-v4mc.c
+--- linux-2.6.29.owrt/arch/arm/mm/copypage-v4mc.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-v4mc.c 2009-05-10 23:48:28.000000000 +0200
+@@ -44,7 +44,7 @@
+ * instruction. If your processor does not supply this, you have to write your
+ * own copy_user_highpage that does the right thing.
+ */
+-static void __naked
++static void __attribute__((naked))
+ mc_copy_user_page(void *from, void *to)
+ {
+ asm volatile(
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mm/copypage-v4wb.c linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-v4wb.c
+--- linux-2.6.29.owrt/arch/arm/mm/copypage-v4wb.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-v4wb.c 2009-05-10 23:48:28.000000000 +0200
+@@ -22,7 +22,7 @@
+ * instruction. If your processor does not supply this, you have to write your
+ * own copy_user_highpage that does the right thing.
+ */
+-static void __naked
++static void __attribute__((naked))
+ v4wb_copy_user_page(void *kto, const void *kfrom)
+ {
+ asm("\
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mm/copypage-v4wt.c linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-v4wt.c
+--- linux-2.6.29.owrt/arch/arm/mm/copypage-v4wt.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-v4wt.c 2009-05-10 23:48:28.000000000 +0200
+@@ -20,7 +20,7 @@
+ * dirty data in the cache. However, we do have to ensure that
+ * subsequent reads are up to date.
+ */
+-static void __naked
++static void __attribute__((naked))
+ v4wt_copy_user_page(void *kto, const void *kfrom)
+ {
+ asm("\
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mm/copypage-xsc3.c linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-xsc3.c
+--- linux-2.6.29.owrt/arch/arm/mm/copypage-xsc3.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-xsc3.c 2009-05-10 23:48:28.000000000 +0200
+@@ -29,7 +29,7 @@
+ * if we eventually end up using our copied page.
+ *
+ */
+-static void __naked
++static void __attribute__((naked))
+ xsc3_mc_copy_user_page(void *kto, const void *kfrom)
+ {
+ asm("\
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mm/copypage-xscale.c linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-xscale.c
+--- linux-2.6.29.owrt/arch/arm/mm/copypage-xscale.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mm/copypage-xscale.c 2009-05-10 23:48:28.000000000 +0200
+@@ -42,7 +42,7 @@
+ * Dcache aliasing issue. The writes will be forwarded to the write buffer,
+ * and merged as appropriate.
+ */
+-static void __naked
++static void __attribute__((naked))
+ mc_copy_user_page(void *from, void *to)
+ {
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mm/dma-mapping.c linux-2.6.29-rc3.owrt/arch/arm/mm/dma-mapping.c
+--- linux-2.6.29.owrt/arch/arm/mm/dma-mapping.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mm/dma-mapping.c 2009-05-10 23:48:28.000000000 +0200
+@@ -490,30 +490,26 @@
+ */
+ void dma_cache_maint(const void *start, size_t size, int direction)
+ {
+- void (*inner_op)(const void *, const void *);
+- void (*outer_op)(unsigned long, unsigned long);
++ const void *end = start + size;
+
+- BUG_ON(!virt_addr_valid(start) || !virt_addr_valid(start + size - 1));
++ BUG_ON(!virt_addr_valid(start) || !virt_addr_valid(end - 1));
+
+ switch (direction) {
+ case DMA_FROM_DEVICE: /* invalidate only */
+- inner_op = dmac_inv_range;
+- outer_op = outer_inv_range;
++ dmac_inv_range(start, end);
++ outer_inv_range(__pa(start), __pa(end));
+ break;
+ case DMA_TO_DEVICE: /* writeback only */
+- inner_op = dmac_clean_range;
+- outer_op = outer_clean_range;
++ dmac_clean_range(start, end);
++ outer_clean_range(__pa(start), __pa(end));
+ break;
+ case DMA_BIDIRECTIONAL: /* writeback and invalidate */
+- inner_op = dmac_flush_range;
+- outer_op = outer_flush_range;
++ dmac_flush_range(start, end);
++ outer_flush_range(__pa(start), __pa(end));
+ break;
+ default:
+ BUG();
+ }
+-
+- inner_op(start, start + size);
+- outer_op(__pa(start), __pa(start) + size);
+ }
+ EXPORT_SYMBOL(dma_cache_maint);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mm/fault-armv.c linux-2.6.29-rc3.owrt/arch/arm/mm/fault-armv.c
+--- linux-2.6.29.owrt/arch/arm/mm/fault-armv.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mm/fault-armv.c 2009-05-10 23:48:28.000000000 +0200
+@@ -66,10 +66,7 @@
+ * fault (ie, is old), we can safely ignore any issues.
+ */
+ if (ret && (pte_val(entry) & L_PTE_MT_MASK) != shared_pte_mask) {
+- unsigned long pfn = pte_pfn(entry);
+- flush_cache_page(vma, address, pfn);
+- outer_flush_range((pfn << PAGE_SHIFT),
+- (pfn << PAGE_SHIFT) + PAGE_SIZE);
++ flush_cache_page(vma, address, pte_pfn(entry));
+ pte_val(entry) &= ~L_PTE_MT_MASK;
+ pte_val(entry) |= shared_pte_mask;
+ set_pte_at(vma->vm_mm, address, pte, entry);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mm/init.c linux-2.6.29-rc3.owrt/arch/arm/mm/init.c
+--- linux-2.6.29.owrt/arch/arm/mm/init.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mm/init.c 2009-05-10 23:48:28.000000000 +0200
+@@ -382,7 +382,7 @@
+ for_each_node(node)
+ bootmem_free_node(node, mi);
+
+- high_memory = __va((memend_pfn << PAGE_SHIFT) - 1) + 1;
++ high_memory = __va(memend_pfn << PAGE_SHIFT);
+
+ /*
+ * This doesn't seem to be used by the Linux memory manager any
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mm/mmap.c linux-2.6.29-rc3.owrt/arch/arm/mm/mmap.c
+--- linux-2.6.29.owrt/arch/arm/mm/mmap.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mm/mmap.c 2009-05-10 23:48:28.000000000 +0200
+@@ -124,7 +124,7 @@
+ {
+ if (addr < PHYS_OFFSET)
+ return 0;
+- if (addr + size >= __pa(high_memory - 1))
++ if (addr + size > __pa(high_memory))
+ return 0;
+
+ return 1;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/mm/mmu.c linux-2.6.29-rc3.owrt/arch/arm/mm/mmu.c
+--- linux-2.6.29.owrt/arch/arm/mm/mmu.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/mm/mmu.c 2009-05-10 23:48:28.000000000 +0200
+@@ -693,8 +693,7 @@
+ * Check whether this memory bank would entirely overlap
+ * the vmalloc area.
+ */
+- if (__va(bank->start) >= VMALLOC_MIN ||
+- __va(bank->start) < PAGE_OFFSET) {
++ if (__va(bank->start) >= VMALLOC_MIN) {
+ printk(KERN_NOTICE "Ignoring RAM at %.8lx-%.8lx "
+ "(vmalloc region overlap).\n",
+ bank->start, bank->start + bank->size - 1);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/plat-mxc/include/mach/mmc.h linux-2.6.29-rc3.owrt/arch/arm/plat-mxc/include/mach/mmc.h
+--- linux-2.6.29.owrt/arch/arm/plat-mxc/include/mach/mmc.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/plat-mxc/include/mach/mmc.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,36 +0,0 @@
+-#ifndef ASMARM_ARCH_MMC_H
+-#define ASMARM_ARCH_MMC_H
+-
+-#include <linux/mmc/host.h>
+-
+-struct device;
+-
+-/* board specific SDHC data, optional.
+- * If not present, a writable card with 3,3V is assumed.
+- */
+-struct imxmmc_platform_data {
+- /* Return values for the get_ro callback should be:
+- * 0 for a read/write card
+- * 1 for a read-only card
+- * -ENOSYS when not supported (equal to NULL callback)
+- * or a negative errno value when something bad happened
+- */
+- int (*get_ro)(struct device *);
+-
+- /* board specific hook to (de)initialize the SD slot.
+- * The board code can call 'handler' on a card detection
+- * change giving data as argument.
+- */
+- int (*init)(struct device *dev, irq_handler_t handler, void *data);
+- void (*exit)(struct device *dev, void *data);
+-
+- /* available voltages. If not given, assume
+- * MMC_VDD_32_33 | MMC_VDD_33_34
+- */
+- unsigned int ocr_avail;
+-
+- /* adjust slot voltage */
+- void (*setpower)(struct device *, unsigned int vdd);
+-};
+-
+-#endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/plat-omap/common.c linux-2.6.29-rc3.owrt/arch/arm/plat-omap/common.c
+--- linux-2.6.29.owrt/arch/arm/plat-omap/common.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/plat-omap/common.c 2009-05-10 23:48:28.000000000 +0200
+@@ -200,16 +200,20 @@
+ };
+
+ /*
++ * Rounds down to nearest nsec.
++ */
++unsigned long long omap_32k_ticks_to_nsecs(unsigned long ticks_32k)
++{
++ return cyc2ns(&clocksource_32k, ticks_32k);
++}
++
++/*
+ * Returns current time from boot in nsecs. It's OK for this to wrap
+ * around for now, as it's just a relative time stamp.
+ */
+ unsigned long long sched_clock(void)
+ {
+- unsigned long long ret;
+-
+- ret = (unsigned long long)omap_32k_read();
+- ret = (ret * clocksource_32k.mult_orig) >> clocksource_32k.shift;
+- return ret;
++ return omap_32k_ticks_to_nsecs(omap_32k_read());
+ }
+
+ static int __init omap_init_clocksource_32k(void)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/plat-omap/devices.c linux-2.6.29-rc3.owrt/arch/arm/plat-omap/devices.c
+--- linux-2.6.29.owrt/arch/arm/plat-omap/devices.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/plat-omap/devices.c 2009-05-10 23:48:28.000000000 +0200
+@@ -200,15 +200,14 @@
+ /*
+ * Register MMC devices. Called from mach-omap1 and mach-omap2 device init.
+ */
+-int __init omap_mmc_add(const char *name, int id, unsigned long base,
+- unsigned long size, unsigned int irq,
+- struct omap_mmc_platform_data *data)
++int __init omap_mmc_add(int id, unsigned long base, unsigned long size,
++ unsigned int irq, struct omap_mmc_platform_data *data)
+ {
+ struct platform_device *pdev;
+ struct resource res[OMAP_MMC_NR_RES];
+ int ret;
+
+- pdev = platform_device_alloc(name, id);
++ pdev = platform_device_alloc("mmci-omap", id);
+ if (!pdev)
+ return -ENOMEM;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/plat-omap/dma.c linux-2.6.29-rc3.owrt/arch/arm/plat-omap/dma.c
+--- linux-2.6.29.owrt/arch/arm/plat-omap/dma.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/plat-omap/dma.c 2009-05-10 23:48:28.000000000 +0200
+@@ -709,7 +709,6 @@
+ chan->dev_name = dev_name;
+ chan->callback = callback;
+ chan->data = data;
+- chan->flags = 0;
+
+ #ifndef CONFIG_ARCH_OMAP1
+ if (cpu_class_is_omap2()) {
+@@ -1889,11 +1888,11 @@
+ status = dma_read(CSR(ch));
+ }
+
+- dma_write(status, CSR(ch));
+-
+ if (likely(dma_chan[ch].callback != NULL))
+ dma_chan[ch].callback(ch, status, dma_chan[ch].data);
+
++ dma_write(status, CSR(ch));
++
+ return 0;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/plat-omap/include/mach/common.h linux-2.6.29-rc3.owrt/arch/arm/plat-omap/include/mach/common.h
+--- linux-2.6.29.owrt/arch/arm/plat-omap/include/mach/common.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/plat-omap/include/mach/common.h 2009-05-10 23:48:28.000000000 +0200
+@@ -35,7 +35,7 @@
+ extern struct sys_timer omap_timer;
+ extern void omap_serial_init(void);
+ extern void omap_serial_enable_clocks(int enable);
+-#if defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE)
++#ifdef CONFIG_I2C_OMAP
+ extern int omap_register_i2c_bus(int bus_id, u32 clkrate,
+ struct i2c_board_info const *info,
+ unsigned len);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/plat-omap/include/mach/cpu.h linux-2.6.29-rc3.owrt/arch/arm/plat-omap/include/mach/cpu.h
+--- linux-2.6.29.owrt/arch/arm/plat-omap/include/mach/cpu.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/plat-omap/include/mach/cpu.h 2009-05-10 23:48:28.000000000 +0200
+@@ -339,7 +339,6 @@
+ #define OMAP3430_REV_ES2_0 0x34301034
+ #define OMAP3430_REV_ES2_1 0x34302034
+ #define OMAP3430_REV_ES3_0 0x34303034
+-#define OMAP3430_REV_ES3_1 0x34304034
+
+ /*
+ * omap_chip bits
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/plat-omap/include/mach/mcbsp.h linux-2.6.29-rc3.owrt/arch/arm/plat-omap/include/mach/mcbsp.h
+--- linux-2.6.29.owrt/arch/arm/plat-omap/include/mach/mcbsp.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/plat-omap/include/mach/mcbsp.h 2009-05-10 23:48:28.000000000 +0200
+@@ -344,8 +344,7 @@
+ u8 dma_rx_sync, dma_tx_sync;
+ u16 rx_irq, tx_irq;
+ struct omap_mcbsp_ops *ops;
+- char const **clk_names;
+- int num_clks;
++ char const *clk_name;
+ };
+
+ struct omap_mcbsp {
+@@ -377,8 +376,7 @@
+ /* Protect the field .free, while checking if the mcbsp is in use */
+ spinlock_t lock;
+ struct omap_mcbsp_platform_data *pdata;
+- struct clk **clks;
+- int num_clks;
++ struct clk *clk;
+ };
+ extern struct omap_mcbsp **mcbsp_ptr;
+ extern int omap_mcbsp_count;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/plat-omap/include/mach/mmc.h linux-2.6.29-rc3.owrt/arch/arm/plat-omap/include/mach/mmc.h
+--- linux-2.6.29.owrt/arch/arm/plat-omap/include/mach/mmc.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/plat-omap/include/mach/mmc.h 2009-05-10 23:48:28.000000000 +0200
+@@ -115,9 +115,8 @@
+ int nr_controllers);
+ void omap2_init_mmc(struct omap_mmc_platform_data **mmc_data,
+ int nr_controllers);
+-int omap_mmc_add(const char *name, int id, unsigned long base,
+- unsigned long size, unsigned int irq,
+- struct omap_mmc_platform_data *data);
++int omap_mmc_add(int id, unsigned long base, unsigned long size,
++ unsigned int irq, struct omap_mmc_platform_data *data);
+ #else
+ static inline void omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,
+ int nr_controllers)
+@@ -127,9 +126,8 @@
+ int nr_controllers)
+ {
+ }
+-static inline int omap_mmc_add(const char *name, int id, unsigned long base,
+- unsigned long size, unsigned int irq,
+- struct omap_mmc_platform_data *data)
++static inline int omap_mmc_add(int id, unsigned long base, unsigned long size,
++ unsigned int irq, struct omap_mmc_platform_data *data)
+ {
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/plat-omap/include/mach/pm.h linux-2.6.29-rc3.owrt/arch/arm/plat-omap/include/mach/pm.h
+--- linux-2.6.29.owrt/arch/arm/plat-omap/include/mach/pm.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/plat-omap/include/mach/pm.h 2009-05-10 23:48:28.000000000 +0200
+@@ -108,7 +108,7 @@
+ !defined(CONFIG_ARCH_OMAP15XX) && \
+ !defined(CONFIG_ARCH_OMAP16XX) && \
+ !defined(CONFIG_ARCH_OMAP24XX)
+-#warning "Power management for this processor not implemented yet"
++#error "Power management for this processor not implemented yet"
+ #endif
+
+ #ifndef __ASSEMBLER__
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/plat-omap/Makefile linux-2.6.29-rc3.owrt/arch/arm/plat-omap/Makefile
+--- linux-2.6.29.owrt/arch/arm/plat-omap/Makefile 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/plat-omap/Makefile 2009-05-10 23:48:28.000000000 +0200
+@@ -18,8 +18,7 @@
+ obj-$(CONFIG_OMAP_DM_TIMER) += dmtimer.o
+ obj-$(CONFIG_OMAP_DEBUG_DEVICES) += debug-devices.o
+ obj-$(CONFIG_OMAP_DEBUG_LEDS) += debug-leds.o
+-i2c-omap-$(CONFIG_I2C_OMAP) := i2c.o
+-obj-y += $(i2c-omap-m) $(i2c-omap-y)
++obj-$(CONFIG_I2C_OMAP) += i2c.o
+
+ # OMAP mailbox framework
+ obj-$(CONFIG_OMAP_MBOX_FWK) += mailbox.o
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/plat-omap/mcbsp.c linux-2.6.29-rc3.owrt/arch/arm/plat-omap/mcbsp.c
+--- linux-2.6.29.owrt/arch/arm/plat-omap/mcbsp.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/plat-omap/mcbsp.c 2009-05-10 23:48:28.000000000 +0200
+@@ -214,7 +214,6 @@
+ int omap_mcbsp_request(unsigned int id)
+ {
+ struct omap_mcbsp *mcbsp;
+- int i;
+ int err;
+
+ if (!omap_mcbsp_check_valid_id(id)) {
+@@ -226,8 +225,7 @@
+ if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->request)
+ mcbsp->pdata->ops->request(id);
+
+- for (i = 0; i < mcbsp->num_clks; i++)
+- clk_enable(mcbsp->clks[i]);
++ clk_enable(mcbsp->clk);
+
+ spin_lock(&mcbsp->lock);
+ if (!mcbsp->free) {
+@@ -278,7 +276,6 @@
+ void omap_mcbsp_free(unsigned int id)
+ {
+ struct omap_mcbsp *mcbsp;
+- int i;
+
+ if (!omap_mcbsp_check_valid_id(id)) {
+ printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
+@@ -289,8 +286,7 @@
+ if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free)
+ mcbsp->pdata->ops->free(id);
+
+- for (i = mcbsp->num_clks - 1; i >= 0; i--)
+- clk_disable(mcbsp->clks[i]);
++ clk_disable(mcbsp->clk);
+
+ spin_lock(&mcbsp->lock);
+ if (mcbsp->free) {
+@@ -876,7 +872,6 @@
+ struct omap_mcbsp_platform_data *pdata = pdev->dev.platform_data;
+ struct omap_mcbsp *mcbsp;
+ int id = pdev->id - 1;
+- int i;
+ int ret = 0;
+
+ if (!pdata) {
+@@ -921,25 +916,14 @@
+ mcbsp->dma_rx_sync = pdata->dma_rx_sync;
+ mcbsp->dma_tx_sync = pdata->dma_tx_sync;
+
+- if (pdata->num_clks) {
+- mcbsp->num_clks = pdata->num_clks;
+- mcbsp->clks = kzalloc(mcbsp->num_clks * sizeof(struct clk *),
+- GFP_KERNEL);
+- if (!mcbsp->clks) {
+- ret = -ENOMEM;
+- goto exit;
+- }
+- for (i = 0; i < mcbsp->num_clks; i++) {
+- mcbsp->clks[i] = clk_get(&pdev->dev, pdata->clk_names[i]);
+- if (IS_ERR(mcbsp->clks[i])) {
+- dev_err(&pdev->dev,
+- "Invalid %s configuration for McBSP%d.\n",
+- pdata->clk_names[i], mcbsp->id);
+- ret = PTR_ERR(mcbsp->clks[i]);
+- goto err_clk;
+- }
+- }
+-
++ if (pdata->clk_name)
++ mcbsp->clk = clk_get(&pdev->dev, pdata->clk_name);
++ if (IS_ERR(mcbsp->clk)) {
++ dev_err(&pdev->dev,
++ "Invalid clock configuration for McBSP%d.\n",
++ mcbsp->id);
++ ret = PTR_ERR(mcbsp->clk);
++ goto err_clk;
+ }
+
+ mcbsp->pdata = pdata;
+@@ -948,9 +932,6 @@
+ return 0;
+
+ err_clk:
+- while (i--)
+- clk_put(mcbsp->clks[i]);
+- kfree(mcbsp->clks);
+ iounmap(mcbsp->io_base);
+ err_ioremap:
+ mcbsp->free = 0;
+@@ -961,7 +942,6 @@
+ static int __devexit omap_mcbsp_remove(struct platform_device *pdev)
+ {
+ struct omap_mcbsp *mcbsp = platform_get_drvdata(pdev);
+- int i;
+
+ platform_set_drvdata(pdev, NULL);
+ if (mcbsp) {
+@@ -970,18 +950,12 @@
+ mcbsp->pdata->ops->free)
+ mcbsp->pdata->ops->free(mcbsp->id);
+
+- for (i = mcbsp->num_clks - 1; i >= 0; i--) {
+- clk_disable(mcbsp->clks[i]);
+- clk_put(mcbsp->clks[i]);
+- }
++ clk_disable(mcbsp->clk);
++ clk_put(mcbsp->clk);
+
+ iounmap(mcbsp->io_base);
+
+- if (mcbsp->num_clks) {
+- kfree(mcbsp->clks);
+- mcbsp->clks = NULL;
+- mcbsp->num_clks = 0;
+- }
++ mcbsp->clk = NULL;
+ mcbsp->free = 0;
+ mcbsp->dev = NULL;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/plat-orion/gpio.c linux-2.6.29-rc3.owrt/arch/arm/plat-orion/gpio.c
+--- linux-2.6.29.owrt/arch/arm/plat-orion/gpio.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/plat-orion/gpio.c 2009-05-10 23:48:28.000000000 +0200
+@@ -265,36 +265,51 @@
+ * polarity LEVEL mask
+ *
+ ****************************************************************************/
++static void gpio_irq_edge_ack(u32 irq)
++{
++ int pin = irq_to_gpio(irq);
++
++ writel(~(1 << (pin & 31)), GPIO_EDGE_CAUSE(pin));
++}
+
+-static void gpio_irq_ack(u32 irq)
++static void gpio_irq_edge_mask(u32 irq)
+ {
+- int type = irq_desc[irq].status & IRQ_TYPE_SENSE_MASK;
+- if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) {
+- int pin = irq_to_gpio(irq);
+- writel(~(1 << (pin & 31)), GPIO_EDGE_CAUSE(pin));
+- }
++ int pin = irq_to_gpio(irq);
++ u32 u;
++
++ u = readl(GPIO_EDGE_MASK(pin));
++ u &= ~(1 << (pin & 31));
++ writel(u, GPIO_EDGE_MASK(pin));
++}
++
++static void gpio_irq_edge_unmask(u32 irq)
++{
++ int pin = irq_to_gpio(irq);
++ u32 u;
++
++ u = readl(GPIO_EDGE_MASK(pin));
++ u |= 1 << (pin & 31);
++ writel(u, GPIO_EDGE_MASK(pin));
+ }
+
+-static void gpio_irq_mask(u32 irq)
++static void gpio_irq_level_mask(u32 irq)
+ {
+ int pin = irq_to_gpio(irq);
+- int type = irq_desc[irq].status & IRQ_TYPE_SENSE_MASK;
+- u32 reg = (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) ?
+- GPIO_EDGE_MASK(pin) : GPIO_LEVEL_MASK(pin);
+- u32 u = readl(reg);
++ u32 u;
++
++ u = readl(GPIO_LEVEL_MASK(pin));
+ u &= ~(1 << (pin & 31));
+- writel(u, reg);
++ writel(u, GPIO_LEVEL_MASK(pin));
+ }
+
+-static void gpio_irq_unmask(u32 irq)
++static void gpio_irq_level_unmask(u32 irq)
+ {
+ int pin = irq_to_gpio(irq);
+- int type = irq_desc[irq].status & IRQ_TYPE_SENSE_MASK;
+- u32 reg = (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) ?
+- GPIO_EDGE_MASK(pin) : GPIO_LEVEL_MASK(pin);
+- u32 u = readl(reg);
++ u32 u;
++
++ u = readl(GPIO_LEVEL_MASK(pin));
+ u |= 1 << (pin & 31);
+- writel(u, reg);
++ writel(u, GPIO_LEVEL_MASK(pin));
+ }
+
+ static int gpio_irq_set_type(u32 irq, u32 type)
+@@ -316,9 +331,9 @@
+ * Set edge/level type.
+ */
+ if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) {
+- desc->handle_irq = handle_edge_irq;
++ desc->chip = &orion_gpio_irq_edge_chip;
+ } else if (type & (IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW)) {
+- desc->handle_irq = handle_level_irq;
++ desc->chip = &orion_gpio_irq_level_chip;
+ } else {
+ printk(KERN_ERR "failed to set irq=%d (type=%d)\n", irq, type);
+ return -EINVAL;
+@@ -356,11 +371,19 @@
+ return 0;
+ }
+
+-struct irq_chip orion_gpio_irq_chip = {
+- .name = "orion_gpio",
+- .ack = gpio_irq_ack,
+- .mask = gpio_irq_mask,
+- .unmask = gpio_irq_unmask,
++struct irq_chip orion_gpio_irq_edge_chip = {
++ .name = "orion_gpio_irq_edge",
++ .ack = gpio_irq_edge_ack,
++ .mask = gpio_irq_edge_mask,
++ .unmask = gpio_irq_edge_unmask,
++ .set_type = gpio_irq_set_type,
++};
++
++struct irq_chip orion_gpio_irq_level_chip = {
++ .name = "orion_gpio_irq_level",
++ .mask = gpio_irq_level_mask,
++ .mask_ack = gpio_irq_level_mask,
++ .unmask = gpio_irq_level_unmask,
+ .set_type = gpio_irq_set_type,
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/plat-orion/include/plat/gpio.h linux-2.6.29-rc3.owrt/arch/arm/plat-orion/include/plat/gpio.h
+--- linux-2.6.29.owrt/arch/arm/plat-orion/include/plat/gpio.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/plat-orion/include/plat/gpio.h 2009-05-10 23:48:28.000000000 +0200
+@@ -31,7 +31,8 @@
+ /*
+ * GPIO interrupt handling.
+ */
+-extern struct irq_chip orion_gpio_irq_chip;
++extern struct irq_chip orion_gpio_irq_edge_chip;
++extern struct irq_chip orion_gpio_irq_level_chip;
+ void orion_gpio_irq_handler(int irqoff);
+
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/plat-s3c64xx/clock.c linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/clock.c
+--- linux-2.6.29.owrt/arch/arm/plat-s3c64xx/clock.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/clock.c 2009-05-10 23:48:28.000000000 +0200
+@@ -248,7 +248,7 @@
+ &clk_48m,
+ };
+
+-void __init s3c64xx_register_clocks(void)
++void s3c64xx_register_clocks(void)
+ {
+ struct clk *clkp;
+ int ret;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/plat-s3c64xx/gpiolib.c linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/gpiolib.c
+--- linux-2.6.29.owrt/arch/arm/plat-s3c64xx/gpiolib.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/gpiolib.c 2009-05-10 23:48:28.000000000 +0200
+@@ -417,4 +417,4 @@
+ return 0;
+ }
+
+-core_initcall(s3c64xx_gpiolib_init);
++arch_initcall(s3c64xx_gpiolib_init);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/plat-s3c64xx/include/plat/irqs.h linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/irqs.h
+--- linux-2.6.29.owrt/arch/arm/plat-s3c64xx/include/plat/irqs.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/irqs.h 2009-05-10 23:48:28.000000000 +0200
+@@ -117,7 +117,7 @@
+ #define IRQ_ONENAND1 S3C64XX_IRQ_VIC1(12)
+ #define IRQ_NFC S3C64XX_IRQ_VIC1(13)
+ #define IRQ_CFCON S3C64XX_IRQ_VIC1(14)
+-#define IRQ_USBH S3C64XX_IRQ_VIC1(15)
++#define IRQ_UHOST S3C64XX_IRQ_VIC1(15)
+ #define IRQ_SPI0 S3C64XX_IRQ_VIC1(16)
+ #define IRQ_SPI1 S3C64XX_IRQ_VIC1(17)
+ #define IRQ_IIC S3C64XX_IRQ_VIC1(18)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/plat-s3c64xx/irq.c linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/irq.c
+--- linux-2.6.29.owrt/arch/arm/plat-s3c64xx/irq.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/irq.c 2009-05-10 23:48:28.000000000 +0200
+@@ -207,7 +207,7 @@
+
+ static void __init s3c64xx_uart_irq(struct uart_irq *uirq)
+ {
+- void __iomem *reg_base = uirq->regs;
++ void *reg_base = uirq->regs;
+ unsigned int irq;
+ int offs;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/plat-s3c64xx/irq-eint.c linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/irq-eint.c
+--- linux-2.6.29.owrt/arch/arm/plat-s3c64xx/irq-eint.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/irq-eint.c 2009-05-10 23:48:28.000000000 +0200
+@@ -14,15 +14,12 @@
+
+ #include <linux/kernel.h>
+ #include <linux/interrupt.h>
+-#include <linux/gpio.h>
+ #include <linux/irq.h>
+ #include <linux/io.h>
+
+ #include <asm/hardware/vic.h>
+
+ #include <plat/regs-irqtype.h>
+-#include <plat/regs-gpio.h>
+-#include <plat/gpio-cfg.h>
+
+ #include <mach/map.h>
+ #include <plat/cpu.h>
+@@ -58,7 +55,7 @@
+ u32 mask;
+
+ mask = __raw_readl(S3C64XX_EINT0MASK);
+- mask &= ~eint_irq_to_bit(irq);
++ mask |= eint_irq_to_bit(irq);
+ __raw_writel(mask, S3C64XX_EINT0MASK);
+ }
+
+@@ -77,7 +74,6 @@
+ static int s3c_irq_eint_set_type(unsigned int irq, unsigned int type)
+ {
+ int offs = eint_offset(irq);
+- int pin;
+ int shift;
+ u32 ctrl, mask;
+ u32 newvalue = 0;
+@@ -129,15 +125,6 @@
+ ctrl |= newvalue << shift;
+ __raw_writel(ctrl, reg);
+
+- /* set the GPIO pin appropriately */
+-
+- if (offs < 23)
+- pin = S3C64XX_GPN(offs);
+- else
+- pin = S3C64XX_GPM(offs - 23);
+-
+- s3c_gpio_cfgpin(pin, S3C_GPIO_SFN(2));
+-
+ return 0;
+ }
+
+@@ -194,7 +181,7 @@
+ s3c_irq_demux_eint(20, 27);
+ }
+
+-static int __init s3c64xx_init_irq_eint(void)
++int __init s3c64xx_init_irq_eint(void)
+ {
+ int irq;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/plat-s3c64xx/s3c6400-clock.c linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/s3c6400-clock.c
+--- linux-2.6.29.owrt/arch/arm/plat-s3c64xx/s3c6400-clock.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/s3c6400-clock.c 2009-05-10 23:48:28.000000000 +0200
+@@ -36,7 +36,7 @@
+ * ext_xtal_mux for want of an actual name from the manual.
+ */
+
+-static struct clk clk_ext_xtal_mux = {
++struct clk clk_ext_xtal_mux = {
+ .name = "ext_xtal",
+ .id = -1,
+ };
+@@ -63,7 +63,7 @@
+ void __iomem *reg_divider;
+ };
+
+-static struct clk clk_fout_apll = {
++struct clk clk_fout_apll = {
+ .name = "fout_apll",
+ .id = -1,
+ };
+@@ -78,7 +78,7 @@
+ .nr_sources = ARRAY_SIZE(clk_src_apll_list),
+ };
+
+-static struct clksrc_clk clk_mout_apll = {
++struct clksrc_clk clk_mout_apll = {
+ .clk = {
+ .name = "mout_apll",
+ .id = -1,
+@@ -88,7 +88,7 @@
+ .sources = &clk_src_apll,
+ };
+
+-static struct clk clk_fout_epll = {
++struct clk clk_fout_epll = {
+ .name = "fout_epll",
+ .id = -1,
+ };
+@@ -103,7 +103,7 @@
+ .nr_sources = ARRAY_SIZE(clk_src_epll_list),
+ };
+
+-static struct clksrc_clk clk_mout_epll = {
++struct clksrc_clk clk_mout_epll = {
+ .clk = {
+ .name = "mout_epll",
+ .id = -1,
+@@ -123,7 +123,7 @@
+ .nr_sources = ARRAY_SIZE(clk_src_mpll_list),
+ };
+
+-static struct clksrc_clk clk_mout_mpll = {
++struct clksrc_clk clk_mout_mpll = {
+ .clk = {
+ .name = "mout_mpll",
+ .id = -1,
+@@ -145,7 +145,7 @@
+ return rate;
+ }
+
+-static struct clk clk_dout_mpll = {
++struct clk clk_dout_mpll = {
+ .name = "dout_mpll",
+ .id = -1,
+ .parent = &clk_mout_mpll.clk,
+@@ -189,10 +189,10 @@
+ };
+
+ static struct clk *clkset_uhost_list[] = {
+- &clk_48m,
+ &clk_mout_epll.clk,
+ &clk_dout_mpll,
+ &clk_fin_epll,
++ &clk_48m,
+ };
+
+ static struct clk_sources clkset_uhost = {
+@@ -239,12 +239,10 @@
+
+ rate = clk_round_rate(clk, rate);
+ div = clk_get_rate(clk->parent) / rate;
+- if (div > 16)
+- return -EINVAL;
+
+ val = __raw_readl(reg);
+- val &= ~(0xf << sclk->shift);
+- val |= (div - 1) << sclk->shift;
++ val &= ~sclk->mask;
++ val |= (rate - 1) << sclk->shift;
+ __raw_writel(val, reg);
+
+ return 0;
+@@ -353,7 +351,7 @@
+
+ static struct clksrc_clk clk_usbhost = {
+ .clk = {
+- .name = "usb-bus-host",
++ .name = "usb-host-bus",
+ .id = -1,
+ .ctrlbit = S3C_CLKCON_SCLK_UHOST,
+ .enable = s3c64xx_sclk_ctrl,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/arm/tools/mach-types linux-2.6.29-rc3.owrt/arch/arm/tools/mach-types
+--- linux-2.6.29.owrt/arch/arm/tools/mach-types 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/arm/tools/mach-types 2009-05-10 23:48:28.000000000 +0200
+@@ -12,7 +12,7 @@
+ #
+ # http://www.arm.linux.org.uk/developer/machines/?action=new
+ #
+-# Last update: Thu Mar 12 18:01:45 2009
++# Last update: Sun Nov 30 16:39:36 2008
+ #
+ # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number
+ #
+@@ -1811,7 +1811,7 @@
+ jade MACH_JADE JADE 1821
+ ks8695_softplc MACH_KS8695_SOFTPLC KS8695_SOFTPLC 1822
+ gprisc3 MACH_GPRISC3 GPRISC3 1823
+-stamp9g20 MACH_STAMP9G20 STAMP9G20 1824
++stamp9260 MACH_STAMP9260 STAMP9260 1824
+ smdk6430 MACH_SMDK6430 SMDK6430 1825
+ smdkc100 MACH_SMDKC100 SMDKC100 1826
+ tavorevb MACH_TAVOREVB TAVOREVB 1827
+@@ -1993,134 +1993,4 @@
+ benzina MACH_BENZINA BENZINA 2003
+ blaze MACH_BLAZE BLAZE 2004
+ linkstation_ls_hgl MACH_LINKSTATION_LS_HGL LINKSTATION_LS_HGL 2005
+-htckovsky MACH_HTCVENUS HTCVENUS 2006
+-sony_prs505 MACH_SONY_PRS505 SONY_PRS505 2007
+-hanlin_v3 MACH_HANLIN_V3 HANLIN_V3 2008
+-sapphira MACH_SAPPHIRA SAPPHIRA 2009
+-dack_sda_01 MACH_DACK_SDA_01 DACK_SDA_01 2010
+-armbox MACH_ARMBOX ARMBOX 2011
+-harris_rvp MACH_HARRIS_RVP HARRIS_RVP 2012
+-ribaldo MACH_RIBALDO RIBALDO 2013
+-agora MACH_AGORA AGORA 2014
+-omap3_mini MACH_OMAP3_MINI OMAP3_MINI 2015
+-a9sam6432_b MACH_A9SAM6432_B A9SAM6432_B 2016
+-usg2410 MACH_USG2410 USG2410 2017
+-pc72052_i10_revb MACH_PC72052_I10_REVB PC72052_I10_REVB 2018
+-mx35_exm32 MACH_MX35_EXM32 MX35_EXM32 2019
+-topas910 MACH_TOPAS910 TOPAS910 2020
+-hyena MACH_HYENA HYENA 2021
+-pospax MACH_POSPAX POSPAX 2022
+-hdl_gx MACH_HDL_GX HDL_GX 2023
+-ctera_4bay MACH_CTERA_4BAY CTERA_4BAY 2024
+-ctera_plug_c MACH_CTERA_PLUG_C CTERA_PLUG_C 2025
+-crwea_plug_i MACH_CRWEA_PLUG_I CRWEA_PLUG_I 2026
+-egauge2 MACH_EGAUGE2 EGAUGE2 2027
+-didj MACH_DIDJ DIDJ 2028
+-m_s3c2443 MACH_MEISTER MEISTER 2029
+-htcblackstone MACH_HTCBLACKSTONE HTCBLACKSTONE 2030
+-cpuat9g20 MACH_CPUAT9G20 CPUAT9G20 2031
+-smdk6440 MACH_SMDK6440 SMDK6440 2032
+-omap_35xx_mvp MACH_OMAP_35XX_MVP OMAP_35XX_MVP 2033
+-ctera_plug_i MACH_CTERA_PLUG_I CTERA_PLUG_I 2034
+-pvg610_100 MACH_PVG610 PVG610 2035
+-hprw6815 MACH_HPRW6815 HPRW6815 2036
+-omap3_oswald MACH_OMAP3_OSWALD OMAP3_OSWALD 2037
+-nas4220b MACH_NAS4220B NAS4220B 2038
+-htcraphael_cdma MACH_HTCRAPHAEL_CDMA HTCRAPHAEL_CDMA 2039
+-htcdiamond_cdma MACH_HTCDIAMOND_CDMA HTCDIAMOND_CDMA 2040
+-scaler MACH_SCALER SCALER 2041
+-zylonite2 MACH_ZYLONITE2 ZYLONITE2 2042
+-aspenite MACH_ASPENITE ASPENITE 2043
+-teton MACH_TETON TETON 2044
+-ttc_dkb MACH_TTC_DKB TTC_DKB 2045
+-bishop2 MACH_BISHOP2 BISHOP2 2046
+-ippv5 MACH_IPPV5 IPPV5 2047
+-farm926 MACH_FARM926 FARM926 2048
+-mmccpu MACH_MMCCPU MMCCPU 2049
+-sgmsfl MACH_SGMSFL SGMSFL 2050
+-tt8000 MACH_TT8000 TT8000 2051
+-zrn4300lp MACH_ZRN4300LP ZRN4300LP 2052
+-mptc MACH_MPTC MPTC 2053
+-h6051 MACH_H6051 H6051 2054
+-pvg610_101 MACH_PVG610_101 PVG610_101 2055
+-stamp9261_pc_evb MACH_STAMP9261_PC_EVB STAMP9261_PC_EVB 2056
+-pelco_odysseus MACH_PELCO_ODYSSEUS PELCO_ODYSSEUS 2057
+-tny_a9260 MACH_TNY_A9260 TNY_A9260 2058
+-tny_a9g20 MACH_TNY_A9G20 TNY_A9G20 2059
+-aesop_mp2530f MACH_AESOP_MP2530F AESOP_MP2530F 2060
+-dx900 MACH_DX900 DX900 2061
+-cpodc2 MACH_CPODC2 CPODC2 2062
+-tilt_8925 MACH_TILT_8925 TILT_8925 2063
+-davinci_dm357_evm MACH_DAVINCI_DM357_EVM DAVINCI_DM357_EVM 2064
+-swordfish MACH_SWORDFISH SWORDFISH 2065
+-corvus MACH_CORVUS CORVUS 2066
+-taurus MACH_TAURUS TAURUS 2067
+-axm MACH_AXM AXM 2068
+-axc MACH_AXC AXC 2069
+-baby MACH_BABY BABY 2070
+-mp200 MACH_MP200 MP200 2071
+-pcm043 MACH_PCM043 PCM043 2072
+-hanlin_v3c MACH_HANLIN_V3C HANLIN_V3C 2073
+-kbk9g20 MACH_KBK9G20 KBK9G20 2074
+-adsturbog5 MACH_ADSTURBOG5 ADSTURBOG5 2075
+-avenger_lite1 MACH_AVENGER_LITE1 AVENGER_LITE1 2076
+-suc82x MACH_SUC SUC 2077
+-at91sam7s256 MACH_AT91SAM7S256 AT91SAM7S256 2078
+-mendoza MACH_MENDOZA MENDOZA 2079
+-kira MACH_KIRA KIRA 2080
+-mx1hbm MACH_MX1HBM MX1HBM 2081
+-quatro43xx MACH_QUATRO43XX QUATRO43XX 2082
+-quatro4230 MACH_QUATRO4230 QUATRO4230 2083
+-nsb400 MACH_NSB400 NSB400 2084
+-drp255 MACH_DRP255 DRP255 2085
+-thoth MACH_THOTH THOTH 2086
+-firestone MACH_FIRESTONE FIRESTONE 2087
+-asusp750 MACH_ASUSP750 ASUSP750 2088
+-ctera_dl MACH_CTERA_DL CTERA_DL 2089
+-socr MACH_SOCR SOCR 2090
+-htcoxygen MACH_HTCOXYGEN HTCOXYGEN 2091
+-heroc MACH_HEROC HEROC 2092
+-zeno6800 MACH_ZENO6800 ZENO6800 2093
+-sc2mcs MACH_SC2MCS SC2MCS 2094
+-gene100 MACH_GENE100 GENE100 2095
+-as353x MACH_AS353X AS353X 2096
+-sheevaplug MACH_SHEEVAPLUG SHEEVAPLUG 2097
+-at91sam9g20 MACH_AT91SAM9G20 AT91SAM9G20 2098
+-mv88f6192gtw_fe MACH_MV88F6192GTW_FE MV88F6192GTW_FE 2099
+-cc9200 MACH_CC9200 CC9200 2100
+-sm9200 MACH_SM9200 SM9200 2101
+-tp9200 MACH_TP9200 TP9200 2102
+-snapperdv MACH_SNAPPERDV SNAPPERDV 2103
+-avengers_lite MACH_AVENGERS_LITE AVENGERS_LITE 2104
+-avengers_lite1 MACH_AVENGERS_LITE1 AVENGERS_LITE1 2105
+-omap3axon MACH_OMAP3AXON OMAP3AXON 2106
+-ma8xx MACH_MA8XX MA8XX 2107
+-mp201ek MACH_MP201EK MP201EK 2108
+-davinci_tux MACH_DAVINCI_TUX DAVINCI_TUX 2109
+-mpa1600 MACH_MPA1600 MPA1600 2110
+-pelco_troy MACH_PELCO_TROY PELCO_TROY 2111
+-nsb667 MACH_NSB667 NSB667 2112
+-rovers5_4mpix MACH_ROVERS5_4MPIX ROVERS5_4MPIX 2113
+-twocom MACH_TWOCOM TWOCOM 2114
+-ubisys_p9_rcu3r2 MACH_UBISYS_P9_RCU3R2 UBISYS_P9_RCU3R2 2115
+-hero_espresso MACH_HERO_ESPRESSO HERO_ESPRESSO 2116
+-afeusb MACH_AFEUSB AFEUSB 2117
+-t830 MACH_T830 T830 2118
+-spd8020_cc MACH_SPD8020_CC SPD8020_CC 2119
+-om_3d7k MACH_OM_3D7K OM_3D7K 2120
+-picocom2 MACH_PICOCOM2 PICOCOM2 2121
+-uwg4mx27 MACH_UWG4MX27 UWG4MX27 2122
+-uwg4mx31 MACH_UWG4MX31 UWG4MX31 2123
+-cherry MACH_CHERRY CHERRY 2124
+-mx51_babbage MACH_MX51_BABBAGE MX51_BABBAGE 2125
+-s3c2440turkiye MACH_S3C2440TURKIYE S3C2440TURKIYE 2126
+-tx37 MACH_TX37 TX37 2127
+-sbc2800_9g20 MACH_SBC2800_9G20 SBC2800_9G20 2128
+-benzglb MACH_BENZGLB BENZGLB 2129
+-benztd MACH_BENZTD BENZTD 2130
+-cartesio_plus MACH_CARTESIO_PLUS CARTESIO_PLUS 2131
+-solrad_g20 MACH_SOLRAD_G20 SOLRAD_G20 2132
+-mx27wallace MACH_MX27WALLACE MX27WALLACE 2133
+-fmzwebmodul MACH_FMZWEBMODUL FMZWEBMODUL 2134
+-rd78x00_masa MACH_RD78X00_MASA RD78X00_MASA 2135
+-smallogger MACH_SMALLOGGER SMALLOGGER 2136
++htcvenus MACH_HTCVENUS HTCVENUS 2006
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/avr32/mach-at32ap/include/mach/board.h linux-2.6.29-rc3.owrt/arch/avr32/mach-at32ap/include/mach/board.h
+--- linux-2.6.29.owrt/arch/avr32/mach-at32ap/include/mach/board.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/avr32/mach-at32ap/include/mach/board.h 2009-05-10 23:48:28.000000000 +0200
+@@ -116,7 +116,6 @@
+ int enable_pin; /* chip enable */
+ int det_pin; /* card detect */
+ int rdy_pin; /* ready/busy */
+- u8 rdy_pin_active_low; /* rdy_pin value is inverted */
+ u8 ale; /* address line number connected to ALE */
+ u8 cle; /* address line number connected to CLE */
+ u8 bus_width_16; /* buswidth is 16 bit */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/configs/BF518F-EZBRD_defconfig linux-2.6.29-rc3.owrt/arch/blackfin/configs/BF518F-EZBRD_defconfig
+--- linux-2.6.29.owrt/arch/blackfin/configs/BF518F-EZBRD_defconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/configs/BF518F-EZBRD_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,6 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.28
+-# Fri Feb 20 10:01:44 2009
++# Linux kernel version: 2.6.28-rc2
+ #
+ # CONFIG_MMU is not set
+ # CONFIG_FPU is not set
+@@ -133,15 +132,10 @@
+ # CONFIG_BF538 is not set
+ # CONFIG_BF539 is not set
+ # CONFIG_BF542 is not set
+-# CONFIG_BF542M is not set
+ # CONFIG_BF544 is not set
+-# CONFIG_BF544M is not set
+ # CONFIG_BF547 is not set
+-# CONFIG_BF547M is not set
+ # CONFIG_BF548 is not set
+-# CONFIG_BF548M is not set
+ # CONFIG_BF549 is not set
+-# CONFIG_BF549M is not set
+ # CONFIG_BF561 is not set
+ CONFIG_BF_REV_MIN=0
+ CONFIG_BF_REV_MAX=2
+@@ -155,7 +149,6 @@
+ # CONFIG_BF_REV_ANY is not set
+ # CONFIG_BF_REV_NONE is not set
+ CONFIG_BF51x=y
+-CONFIG_MEM_MT48LC32M8A2_75=y
+ CONFIG_BFIN518F_EZBRD=y
+
+ #
+@@ -431,17 +424,7 @@
+ # CONFIG_TIPC is not set
+ # CONFIG_ATM is not set
+ # CONFIG_BRIDGE is not set
+-CONFIG_NET_DSA=y
+-# CONFIG_NET_DSA_TAG_DSA is not set
+-# CONFIG_NET_DSA_TAG_EDSA is not set
+-# CONFIG_NET_DSA_TAG_TRAILER is not set
+-CONFIG_NET_DSA_TAG_STPID=y
+-# CONFIG_NET_DSA_MV88E6XXX is not set
+-# CONFIG_NET_DSA_MV88E6060 is not set
+-# CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set
+-# CONFIG_NET_DSA_MV88E6131 is not set
+-# CONFIG_NET_DSA_MV88E6123_61_65 is not set
+-CONFIG_NET_DSA_KSZ8893M=y
++# CONFIG_NET_DSA is not set
+ # CONFIG_VLAN_8021Q is not set
+ # CONFIG_DECNET is not set
+ # CONFIG_LLC2 is not set
+@@ -544,8 +527,6 @@
+ #
+ # Self-contained MTD device drivers
+ #
+-# CONFIG_MTD_DATAFLASH is not set
+-# CONFIG_MTD_M25P80 is not set
+ # CONFIG_MTD_SLRAM is not set
+ # CONFIG_MTD_PHRAM is not set
+ # CONFIG_MTD_MTDRAM is not set
+@@ -578,9 +559,7 @@
+ # CONFIG_BLK_DEV_HD is not set
+ CONFIG_MISC_DEVICES=y
+ # CONFIG_EEPROM_93CX6 is not set
+-# CONFIG_ICS932S401 is not set
+ # CONFIG_ENCLOSURE_SERVICES is not set
+-# CONFIG_C2PORT is not set
+ CONFIG_HAVE_IDE=y
+ # CONFIG_IDE is not set
+
+@@ -619,14 +598,10 @@
+ # CONFIG_MDIO_BITBANG is not set
+ CONFIG_NET_ETHERNET=y
+ CONFIG_MII=y
+-CONFIG_BFIN_MAC=y
+-CONFIG_BFIN_TX_DESC_NUM=10
+-CONFIG_BFIN_RX_DESC_NUM=20
+-# CONFIG_BFIN_MAC_RMII is not set
++# CONFIG_BFIN_MAC is not set
+ # CONFIG_SMC91X is not set
+ # CONFIG_SMSC911X is not set
+ # CONFIG_DM9000 is not set
+-# CONFIG_ENC28J60 is not set
+ # CONFIG_IBM_NEW_EMAC_ZMII is not set
+ # CONFIG_IBM_NEW_EMAC_RGMII is not set
+ # CONFIG_IBM_NEW_EMAC_TAH is not set
+@@ -704,7 +679,7 @@
+ CONFIG_HW_CONSOLE=y
+ # CONFIG_VT_HW_CONSOLE_BINDING is not set
+ # CONFIG_DEVKMEM is not set
+-CONFIG_BFIN_JTAG_COMM=m
++# CONFIG_BFIN_JTAG_COMM is not set
+ # CONFIG_SERIAL_NONSTANDARD is not set
+
+ #
+@@ -784,23 +759,7 @@
+ # CONFIG_I2C_DEBUG_ALGO is not set
+ # CONFIG_I2C_DEBUG_BUS is not set
+ # CONFIG_I2C_DEBUG_CHIP is not set
+-CONFIG_SPI=y
+-# CONFIG_SPI_DEBUG is not set
+-CONFIG_SPI_MASTER=y
+-
+-#
+-# SPI Master Controller Drivers
+-#
+-CONFIG_SPI_BFIN=y
+-# CONFIG_SPI_BFIN_LOCK is not set
+-# CONFIG_SPI_BITBANG is not set
+-
+-#
+-# SPI Protocol Masters
+-#
+-# CONFIG_SPI_AT25 is not set
+-# CONFIG_SPI_SPIDEV is not set
+-# CONFIG_SPI_TLE62X0 is not set
++# CONFIG_SPI is not set
+ CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
+ # CONFIG_GPIOLIB is not set
+ # CONFIG_W1 is not set
+@@ -824,10 +783,8 @@
+ # CONFIG_MFD_SM501 is not set
+ # CONFIG_HTC_PASIC3 is not set
+ # CONFIG_MFD_TMIO is not set
+-# CONFIG_PMIC_DA903X is not set
+ # CONFIG_MFD_WM8400 is not set
+ # CONFIG_MFD_WM8350_I2C is not set
+-# CONFIG_REGULATOR is not set
+
+ #
+ # Multimedia devices
+@@ -899,18 +856,10 @@
+ # CONFIG_RTC_DRV_M41T80 is not set
+ # CONFIG_RTC_DRV_S35390A is not set
+ # CONFIG_RTC_DRV_FM3130 is not set
+-# CONFIG_RTC_DRV_RX8581 is not set
+
+ #
+ # SPI RTC drivers
+ #
+-# CONFIG_RTC_DRV_M41T94 is not set
+-# CONFIG_RTC_DRV_DS1305 is not set
+-# CONFIG_RTC_DRV_DS1390 is not set
+-# CONFIG_RTC_DRV_MAX6902 is not set
+-# CONFIG_RTC_DRV_R9701 is not set
+-# CONFIG_RTC_DRV_RS5C348 is not set
+-# CONFIG_RTC_DRV_DS3234 is not set
+
+ #
+ # Platform RTC drivers
+@@ -1108,20 +1057,12 @@
+ # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+ # CONFIG_FAULT_INJECTION is not set
+ CONFIG_SYSCTL_SYSCALL_CHECK=y
+-
+-#
+-# Tracers
+-#
+-# CONFIG_SCHED_TRACER is not set
+-# CONFIG_CONTEXT_SWITCH_TRACER is not set
+-# CONFIG_BOOT_TRACER is not set
+ # CONFIG_DYNAMIC_PRINTK_DEBUG is not set
+ # CONFIG_SAMPLES is not set
+ CONFIG_HAVE_ARCH_KGDB=y
+ # CONFIG_KGDB is not set
+ # CONFIG_DEBUG_STACKOVERFLOW is not set
+ # CONFIG_DEBUG_STACK_USAGE is not set
+-# CONFIG_KGDB_TESTCASE is not set
+ CONFIG_DEBUG_VERBOSE=y
+ CONFIG_DEBUG_MMRS=y
+ # CONFIG_DEBUG_HWERR is not set
+@@ -1154,7 +1095,6 @@
+ #
+ # CONFIG_CRYPTO_FIPS is not set
+ # CONFIG_CRYPTO_MANAGER is not set
+-# CONFIG_CRYPTO_MANAGER2 is not set
+ # CONFIG_CRYPTO_GF128MUL is not set
+ # CONFIG_CRYPTO_NULL is not set
+ # CONFIG_CRYPTO_CRYPTD is not set
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/configs/BF526-EZBRD_defconfig linux-2.6.29-rc3.owrt/arch/blackfin/configs/BF526-EZBRD_defconfig
+--- linux-2.6.29.owrt/arch/blackfin/configs/BF526-EZBRD_defconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/configs/BF526-EZBRD_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -723,7 +723,7 @@
+ CONFIG_HW_CONSOLE=y
+ # CONFIG_VT_HW_CONSOLE_BINDING is not set
+ # CONFIG_DEVKMEM is not set
+-CONFIG_BFIN_JTAG_COMM=m
++# CONFIG_BFIN_JTAG_COMM is not set
+ # CONFIG_SERIAL_NONSTANDARD is not set
+
+ #
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/configs/BF527-EZKIT_defconfig linux-2.6.29-rc3.owrt/arch/blackfin/configs/BF527-EZKIT_defconfig
+--- linux-2.6.29.owrt/arch/blackfin/configs/BF527-EZKIT_defconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/configs/BF527-EZKIT_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -327,8 +327,8 @@
+ CONFIG_BFIN_DCACHE=y
+ # CONFIG_BFIN_DCACHE_BANKA is not set
+ # CONFIG_BFIN_ICACHE_LOCK is not set
+-CONFIG_BFIN_WB=y
+-# CONFIG_BFIN_WT is not set
++# CONFIG_BFIN_WB is not set
++CONFIG_BFIN_WT=y
+ # CONFIG_MPU is not set
+
+ #
+@@ -767,7 +767,7 @@
+ CONFIG_HW_CONSOLE=y
+ # CONFIG_VT_HW_CONSOLE_BINDING is not set
+ # CONFIG_DEVKMEM is not set
+-CONFIG_BFIN_JTAG_COMM=m
++# CONFIG_BFIN_JTAG_COMM is not set
+ # CONFIG_SERIAL_NONSTANDARD is not set
+
+ #
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/configs/BF533-EZKIT_defconfig linux-2.6.29-rc3.owrt/arch/blackfin/configs/BF533-EZKIT_defconfig
+--- linux-2.6.29.owrt/arch/blackfin/configs/BF533-EZKIT_defconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/configs/BF533-EZKIT_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -290,8 +290,8 @@
+ CONFIG_BFIN_DCACHE=y
+ # CONFIG_BFIN_DCACHE_BANKA is not set
+ # CONFIG_BFIN_ICACHE_LOCK is not set
+-CONFIG_BFIN_WB=y
+-# CONFIG_BFIN_WT is not set
++# CONFIG_BFIN_WB is not set
++CONFIG_BFIN_WT=y
+ # CONFIG_MPU is not set
+
+ #
+@@ -672,7 +672,7 @@
+ CONFIG_SIMPLE_GPIO=m
+ # CONFIG_VT is not set
+ # CONFIG_DEVKMEM is not set
+-CONFIG_BFIN_JTAG_COMM=m
++# CONFIG_BFIN_JTAG_COMM is not set
+ # CONFIG_SERIAL_NONSTANDARD is not set
+
+ #
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/configs/BF533-STAMP_defconfig linux-2.6.29-rc3.owrt/arch/blackfin/configs/BF533-STAMP_defconfig
+--- linux-2.6.29.owrt/arch/blackfin/configs/BF533-STAMP_defconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/configs/BF533-STAMP_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -290,8 +290,8 @@
+ CONFIG_BFIN_DCACHE=y
+ # CONFIG_BFIN_DCACHE_BANKA is not set
+ # CONFIG_BFIN_ICACHE_LOCK is not set
+-CONFIG_BFIN_WB=y
+-# CONFIG_BFIN_WT is not set
++# CONFIG_BFIN_WB is not set
++CONFIG_BFIN_WT=y
+ # CONFIG_MPU is not set
+
+ #
+@@ -679,7 +679,7 @@
+ CONFIG_SIMPLE_GPIO=m
+ # CONFIG_VT is not set
+ # CONFIG_DEVKMEM is not set
+-CONFIG_BFIN_JTAG_COMM=m
++# CONFIG_BFIN_JTAG_COMM is not set
+ # CONFIG_SERIAL_NONSTANDARD is not set
+
+ #
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/configs/BF537-STAMP_defconfig linux-2.6.29-rc3.owrt/arch/blackfin/configs/BF537-STAMP_defconfig
+--- linux-2.6.29.owrt/arch/blackfin/configs/BF537-STAMP_defconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/configs/BF537-STAMP_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -298,8 +298,8 @@
+ CONFIG_BFIN_DCACHE=y
+ # CONFIG_BFIN_DCACHE_BANKA is not set
+ # CONFIG_BFIN_ICACHE_LOCK is not set
+-CONFIG_BFIN_WB=y
+-# CONFIG_BFIN_WT is not set
++# CONFIG_BFIN_WB is not set
++CONFIG_BFIN_WT=y
+ # CONFIG_MPU is not set
+
+ #
+@@ -568,7 +568,15 @@
+ # CONFIG_MTD_DOC2000 is not set
+ # CONFIG_MTD_DOC2001 is not set
+ # CONFIG_MTD_DOC2001PLUS is not set
+-# CONFIG_MTD_NAND is not set
++CONFIG_MTD_NAND=m
++# CONFIG_MTD_NAND_VERIFY_WRITE is not set
++# CONFIG_MTD_NAND_ECC_SMC is not set
++# CONFIG_MTD_NAND_MUSEUM_IDS is not set
++# CONFIG_MTD_NAND_BFIN is not set
++CONFIG_MTD_NAND_IDS=m
++# CONFIG_MTD_NAND_DISKONCHIP is not set
++# CONFIG_MTD_NAND_NANDSIM is not set
++CONFIG_MTD_NAND_PLATFORM=m
+ # CONFIG_MTD_ONENAND is not set
+
+ #
+@@ -714,7 +722,7 @@
+ CONFIG_SIMPLE_GPIO=m
+ # CONFIG_VT is not set
+ # CONFIG_DEVKMEM is not set
+-CONFIG_BFIN_JTAG_COMM=m
++# CONFIG_BFIN_JTAG_COMM is not set
+ # CONFIG_SERIAL_NONSTANDARD is not set
+
+ #
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/configs/BF538-EZKIT_defconfig linux-2.6.29-rc3.owrt/arch/blackfin/configs/BF538-EZKIT_defconfig
+--- linux-2.6.29.owrt/arch/blackfin/configs/BF538-EZKIT_defconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/configs/BF538-EZKIT_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -306,8 +306,8 @@
+ CONFIG_BFIN_DCACHE=y
+ # CONFIG_BFIN_DCACHE_BANKA is not set
+ # CONFIG_BFIN_ICACHE_LOCK is not set
+-CONFIG_BFIN_WB=y
+-# CONFIG_BFIN_WT is not set
++# CONFIG_BFIN_WB is not set
++CONFIG_BFIN_WT=y
+ # CONFIG_MPU is not set
+
+ #
+@@ -726,7 +726,7 @@
+ CONFIG_SIMPLE_GPIO=m
+ # CONFIG_VT is not set
+ # CONFIG_DEVKMEM is not set
+-CONFIG_BFIN_JTAG_COMM=m
++# CONFIG_BFIN_JTAG_COMM is not set
+ # CONFIG_SERIAL_NONSTANDARD is not set
+
+ #
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/configs/BF548-EZKIT_defconfig linux-2.6.29-rc3.owrt/arch/blackfin/configs/BF548-EZKIT_defconfig
+--- linux-2.6.29.owrt/arch/blackfin/configs/BF548-EZKIT_defconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/configs/BF548-EZKIT_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -361,8 +361,8 @@
+ CONFIG_BFIN_DCACHE=y
+ # CONFIG_BFIN_DCACHE_BANKA is not set
+ # CONFIG_BFIN_ICACHE_LOCK is not set
+-CONFIG_BFIN_WB=y
+-# CONFIG_BFIN_WT is not set
++# CONFIG_BFIN_WB is not set
++CONFIG_BFIN_WT=y
+ # CONFIG_BFIN_L2_CACHEABLE is not set
+ # CONFIG_MPU is not set
+
+@@ -680,7 +680,7 @@
+ CONFIG_SCSI_DMA=y
+ # CONFIG_SCSI_TGT is not set
+ # CONFIG_SCSI_NETLINK is not set
+-# CONFIG_SCSI_PROC_FS is not set
++CONFIG_SCSI_PROC_FS=y
+
+ #
+ # SCSI support type (disk, tape, CD-ROM)
+@@ -856,7 +856,7 @@
+ CONFIG_HW_CONSOLE=y
+ # CONFIG_VT_HW_CONSOLE_BINDING is not set
+ # CONFIG_DEVKMEM is not set
+-CONFIG_BFIN_JTAG_COMM=m
++# CONFIG_BFIN_JTAG_COMM is not set
+ # CONFIG_SERIAL_NONSTANDARD is not set
+
+ #
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/configs/BF561-EZKIT_defconfig linux-2.6.29-rc3.owrt/arch/blackfin/configs/BF561-EZKIT_defconfig
+--- linux-2.6.29.owrt/arch/blackfin/configs/BF561-EZKIT_defconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/configs/BF561-EZKIT_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -329,8 +329,8 @@
+ CONFIG_BFIN_DCACHE=y
+ # CONFIG_BFIN_DCACHE_BANKA is not set
+ # CONFIG_BFIN_ICACHE_LOCK is not set
+-CONFIG_BFIN_WB=y
+-# CONFIG_BFIN_WT is not set
++# CONFIG_BFIN_WB is not set
++CONFIG_BFIN_WT=y
+ # CONFIG_BFIN_L2_CACHEABLE is not set
+ # CONFIG_MPU is not set
+
+@@ -709,7 +709,7 @@
+ CONFIG_SIMPLE_GPIO=m
+ # CONFIG_VT is not set
+ # CONFIG_DEVKMEM is not set
+-CONFIG_BFIN_JTAG_COMM=m
++# CONFIG_BFIN_JTAG_COMM is not set
+ # CONFIG_SERIAL_NONSTANDARD is not set
+
+ #
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/configs/BlackStamp_defconfig linux-2.6.29-rc3.owrt/arch/blackfin/configs/BlackStamp_defconfig
+--- linux-2.6.29.owrt/arch/blackfin/configs/BlackStamp_defconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/configs/BlackStamp_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -288,8 +288,8 @@
+ CONFIG_BFIN_DCACHE=y
+ # CONFIG_BFIN_DCACHE_BANKA is not set
+ # CONFIG_BFIN_ICACHE_LOCK is not set
+-CONFIG_BFIN_WB=y
+-# CONFIG_BFIN_WT is not set
++# CONFIG_BFIN_WB is not set
++CONFIG_BFIN_WT=y
+ # CONFIG_MPU is not set
+
+ #
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/configs/CM-BF527_defconfig linux-2.6.29-rc3.owrt/arch/blackfin/configs/CM-BF527_defconfig
+--- linux-2.6.29.owrt/arch/blackfin/configs/CM-BF527_defconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/configs/CM-BF527_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1,6 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.28
++# Linux kernel version: 2.6.24.7
++# Fri Jul 18 18:00:41 2008
+ #
+ # CONFIG_MMU is not set
+ # CONFIG_FPU is not set
+@@ -8,6 +9,7 @@
+ # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+ CONFIG_BLACKFIN=y
+ CONFIG_ZONE_DMA=y
++CONFIG_SEMAPHORE_SLEEPERS=y
+ CONFIG_GENERIC_FIND_NEXT_BIT=y
+ CONFIG_GENERIC_HWEIGHT=y
+ CONFIG_GENERIC_HARDIRQS=y
+@@ -30,16 +32,18 @@
+ # CONFIG_POSIX_MQUEUE is not set
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
+ # CONFIG_AUDIT is not set
+ CONFIG_IKCONFIG=y
+ CONFIG_IKCONFIG_PROC=y
+ CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_CGROUPS is not set
+-# CONFIG_GROUP_SCHED is not set
+-CONFIG_SYSFS_DEPRECATED=y
+-CONFIG_SYSFS_DEPRECATED_V2=y
++CONFIG_FAIR_GROUP_SCHED=y
++CONFIG_FAIR_USER_SCHED=y
++# CONFIG_FAIR_CGROUP_SCHED is not set
++# CONFIG_SYSFS_DEPRECATED is not set
+ # CONFIG_RELAY is not set
+-# CONFIG_NAMESPACES is not set
+ CONFIG_BLK_DEV_INITRD=y
+ CONFIG_INITRAMFS_SOURCE=""
+ # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+@@ -48,35 +52,26 @@
+ CONFIG_UID16=y
+ CONFIG_SYSCTL_SYSCALL=y
+ CONFIG_KALLSYMS=y
+-# CONFIG_KALLSYMS_ALL is not set
+ # CONFIG_KALLSYMS_EXTRA_PASS is not set
+ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ # CONFIG_ELF_CORE is not set
+-CONFIG_COMPAT_BRK=y
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+ CONFIG_EPOLL=y
+ CONFIG_SIGNALFD=y
+-CONFIG_TIMERFD=y
+ CONFIG_EVENTFD=y
+-CONFIG_AIO=y
+ CONFIG_VM_EVENT_COUNTERS=y
+ CONFIG_SLAB=y
+ # CONFIG_SLUB is not set
+ # CONFIG_SLOB is not set
+-# CONFIG_PROFILING is not set
+-# CONFIG_MARKERS is not set
+-CONFIG_HAVE_OPROFILE=y
+-# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ CONFIG_TINY_SHMEM=y
+ CONFIG_BASE_SMALL=0
+ CONFIG_MODULES=y
+-# CONFIG_MODULE_FORCE_LOAD is not set
+ CONFIG_MODULE_UNLOAD=y
+ # CONFIG_MODULE_FORCE_UNLOAD is not set
+ # CONFIG_MODVERSIONS is not set
+@@ -87,7 +82,6 @@
+ # CONFIG_BLK_DEV_IO_TRACE is not set
+ # CONFIG_LSF is not set
+ # CONFIG_BLK_DEV_BSG is not set
+-# CONFIG_BLK_DEV_INTEGRITY is not set
+
+ #
+ # IO Schedulers
+@@ -101,11 +95,9 @@
+ CONFIG_DEFAULT_CFQ=y
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="cfq"
+-CONFIG_CLASSIC_RCU=y
+ # CONFIG_PREEMPT_NONE is not set
+ CONFIG_PREEMPT_VOLUNTARY=y
+ # CONFIG_PREEMPT is not set
+-# CONFIG_FREEZER is not set
+
+ #
+ # Blackfin Processor Options
+@@ -114,10 +106,6 @@
+ #
+ # Processor and Board Settings
+ #
+-# CONFIG_BF512 is not set
+-# CONFIG_BF514 is not set
+-# CONFIG_BF516 is not set
+-# CONFIG_BF518 is not set
+ # CONFIG_BF522 is not set
+ # CONFIG_BF523 is not set
+ # CONFIG_BF524 is not set
+@@ -130,32 +118,48 @@
+ # CONFIG_BF534 is not set
+ # CONFIG_BF536 is not set
+ # CONFIG_BF537 is not set
+-# CONFIG_BF538 is not set
+-# CONFIG_BF539 is not set
+ # CONFIG_BF542 is not set
+-# CONFIG_BF542M is not set
+ # CONFIG_BF544 is not set
+-# CONFIG_BF544M is not set
+ # CONFIG_BF547 is not set
+-# CONFIG_BF547M is not set
+ # CONFIG_BF548 is not set
+-# CONFIG_BF548M is not set
+ # CONFIG_BF549 is not set
+-# CONFIG_BF549M is not set
+ # CONFIG_BF561 is not set
+-CONFIG_BF_REV_MIN=0
+-CONFIG_BF_REV_MAX=2
+ # CONFIG_BF_REV_0_0 is not set
+ CONFIG_BF_REV_0_1=y
+ # CONFIG_BF_REV_0_2 is not set
+ # CONFIG_BF_REV_0_3 is not set
+ # CONFIG_BF_REV_0_4 is not set
+ # CONFIG_BF_REV_0_5 is not set
+-# CONFIG_BF_REV_0_6 is not set
+ # CONFIG_BF_REV_ANY is not set
+ # CONFIG_BF_REV_NONE is not set
+ CONFIG_BF52x=y
+ CONFIG_MEM_MT48LC16M16A2TG_75=y
++# CONFIG_BFIN527_EZKIT is not set
++CONFIG_BFIN527_BLUETECHNIX_CM=y
++
++#
++# BF527 Specific Configuration
++#
++
++#
++# Alternative Multiplexing Scheme
++#
++# CONFIG_BF527_SPORT0_PORTF is not set
++CONFIG_BF527_SPORT0_PORTG=y
++CONFIG_BF527_SPORT0_TSCLK_PG10=y
++# CONFIG_BF527_SPORT0_TSCLK_PG14 is not set
++CONFIG_BF527_UART1_PORTF=y
++# CONFIG_BF527_UART1_PORTG is not set
++# CONFIG_BF527_NAND_D_PORTF is not set
++CONFIG_BF527_NAND_D_PORTH=y
++
++#
++# Interrupt Priority Assignment
++#
++
++#
++# Priority
++#
+ CONFIG_IRQ_PLL_WAKEUP=7
+ CONFIG_IRQ_DMA0_ERROR=7
+ CONFIG_IRQ_DMAR0_BLK=7
+@@ -175,6 +179,7 @@
+ CONFIG_IRQ_SPORT1_RX=9
+ CONFIG_IRQ_SPORT1_TX=9
+ CONFIG_IRQ_TWI=10
++CONFIG_IRQ_SPI=10
+ CONFIG_IRQ_UART0_RX=10
+ CONFIG_IRQ_UART0_TX=10
+ CONFIG_IRQ_UART1_RX=10
+@@ -200,34 +205,6 @@
+ CONFIG_IRQ_WATCH=13
+ CONFIG_IRQ_PORTF_INTA=13
+ CONFIG_IRQ_PORTF_INTB=13
+-# CONFIG_BFIN527_EZKIT is not set
+-CONFIG_BFIN527_BLUETECHNIX_CM=y
+-# CONFIG_BFIN526_EZBRD is not set
+-
+-#
+-# BF527 Specific Configuration
+-#
+-
+-#
+-# Alternative Multiplexing Scheme
+-#
+-# CONFIG_BF527_SPORT0_PORTF is not set
+-CONFIG_BF527_SPORT0_PORTG=y
+-CONFIG_BF527_SPORT0_TSCLK_PG10=y
+-# CONFIG_BF527_SPORT0_TSCLK_PG14 is not set
+-CONFIG_BF527_UART1_PORTF=y
+-# CONFIG_BF527_UART1_PORTG is not set
+-# CONFIG_BF527_NAND_D_PORTF is not set
+-CONFIG_BF527_NAND_D_PORTH=y
+-
+-#
+-# Interrupt Priority Assignment
+-#
+-
+-#
+-# Priority
+-#
+-CONFIG_IRQ_SPI=10
+ CONFIG_IRQ_SPI_ERROR=7
+ CONFIG_IRQ_NFC_ERROR=7
+ CONFIG_IRQ_HDMA_ERROR=7
+@@ -249,6 +226,7 @@
+ #
+ CONFIG_CLKIN_HZ=25000000
+ # CONFIG_BFIN_KERNEL_CLOCK is not set
++CONFIG_MAX_MEM_SIZE=512
+ CONFIG_MAX_VCO_HZ=600000000
+ CONFIG_MIN_VCO_HZ=50000000
+ CONFIG_MAX_SCLK_HZ=133333333
+@@ -262,10 +240,10 @@
+ # CONFIG_HZ_300 is not set
+ # CONFIG_HZ_1000 is not set
+ CONFIG_HZ=250
+-# CONFIG_SCHED_HRTICK is not set
+ CONFIG_GENERIC_TIME=y
+ CONFIG_GENERIC_CLOCKEVENTS=y
+ # CONFIG_CYCLES_CLOCKSOURCE is not set
++# CONFIG_TICK_ONESHOT is not set
+ # CONFIG_NO_HZ is not set
+ # CONFIG_HIGH_RES_TIMERS is not set
+ CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+@@ -299,12 +277,6 @@
+ CONFIG_CACHELINE_ALIGNED_L1=y
+ # CONFIG_SYSCALL_TAB_L1 is not set
+ # CONFIG_CPLB_SWITCH_TAB_L1 is not set
+-CONFIG_APP_STACK_L1=y
+-
+-#
+-# Speed Optimizations
+-#
+-CONFIG_BFIN_INS_LOWOVERHEAD=y
+ CONFIG_RAMKERNEL=y
+ # CONFIG_ROMKERNEL is not set
+ CONFIG_SELECT_MEMORY_MODEL=y
+@@ -313,10 +285,10 @@
+ # CONFIG_SPARSEMEM_MANUAL is not set
+ CONFIG_FLATMEM=y
+ CONFIG_FLAT_NODE_MEM_MAP=y
+-CONFIG_PAGEFLAGS_EXTENDED=y
++# CONFIG_SPARSEMEM_STATIC is not set
++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ # CONFIG_RESOURCES_64BIT is not set
+-# CONFIG_PHYS_ADDR_T_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=1
+ CONFIG_VIRT_TO_BUS=y
+ CONFIG_BFIN_GPTIMERS=y
+@@ -332,8 +304,8 @@
+ CONFIG_BFIN_DCACHE=y
+ # CONFIG_BFIN_DCACHE_BANKA is not set
+ # CONFIG_BFIN_ICACHE_LOCK is not set
+-CONFIG_BFIN_WB=y
+-# CONFIG_BFIN_WT is not set
++# CONFIG_BFIN_WB is not set
++CONFIG_BFIN_WT=y
+ # CONFIG_MPU is not set
+
+ #
+@@ -362,6 +334,7 @@
+ #
+ # Bus options (PCI, PCMCIA, EISA, MCA, ISA)
+ #
++# CONFIG_PCI is not set
+ # CONFIG_ARCH_SUPPORTS_MSI is not set
+ # CONFIG_PCCARD is not set
+
+@@ -372,20 +345,25 @@
+ CONFIG_BINFMT_FLAT=y
+ CONFIG_BINFMT_ZFLAT=y
+ # CONFIG_BINFMT_SHARED_FLAT is not set
+-# CONFIG_HAVE_AOUT is not set
+ # CONFIG_BINFMT_MISC is not set
+
+ #
+ # Power management options
+ #
+ # CONFIG_PM is not set
+-CONFIG_ARCH_SUSPEND_POSSIBLE=y
++CONFIG_SUSPEND_UP_POSSIBLE=y
++# CONFIG_PM_BFIN_SLEEP_DEEPER is not set
++# CONFIG_PM_BFIN_SLEEP is not set
+ # CONFIG_PM_WAKEUP_BY_GPIO is not set
+
+ #
+ # CPU Frequency scaling
+ #
+ # CONFIG_CPU_FREQ is not set
++
++#
++# Networking
++#
+ CONFIG_NET=y
+
+ #
+@@ -398,7 +376,6 @@
+ # CONFIG_XFRM_USER is not set
+ # CONFIG_XFRM_SUB_POLICY is not set
+ # CONFIG_XFRM_MIGRATE is not set
+-# CONFIG_XFRM_STATISTICS is not set
+ # CONFIG_NET_KEY is not set
+ CONFIG_INET=y
+ # CONFIG_IP_MULTICAST is not set
+@@ -428,6 +405,8 @@
+ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_TCP_MD5SIG is not set
+ # CONFIG_IPV6 is not set
++# CONFIG_INET6_XFRM_TUNNEL is not set
++# CONFIG_INET6_TUNNEL is not set
+ # CONFIG_NETLABEL is not set
+ # CONFIG_NETWORK_SECMARK is not set
+ # CONFIG_NETFILTER is not set
+@@ -436,7 +415,6 @@
+ # CONFIG_TIPC is not set
+ # CONFIG_ATM is not set
+ # CONFIG_BRIDGE is not set
+-# CONFIG_NET_DSA is not set
+ # CONFIG_VLAN_8021Q is not set
+ # CONFIG_DECNET is not set
+ # CONFIG_LLC2 is not set
+@@ -453,14 +431,14 @@
+ #
+ # CONFIG_NET_PKTGEN is not set
+ # CONFIG_HAMRADIO is not set
+-# CONFIG_CAN is not set
+ # CONFIG_IRDA is not set
+ # CONFIG_BT is not set
+ # CONFIG_AF_RXRPC is not set
+-# CONFIG_PHONET is not set
+-CONFIG_WIRELESS=y
++
++#
++# Wireless
++#
+ # CONFIG_CFG80211 is not set
+-CONFIG_WIRELESS_OLD_REGULATORY=y
+ # CONFIG_WIRELESS_EXT is not set
+ # CONFIG_MAC80211 is not set
+ # CONFIG_IEEE80211 is not set
+@@ -478,8 +456,6 @@
+ CONFIG_STANDALONE=y
+ CONFIG_PREVENT_FIRMWARE_BUILD=y
+ # CONFIG_FW_LOADER is not set
+-# CONFIG_DEBUG_DRIVER is not set
+-# CONFIG_DEBUG_DEVRES is not set
+ # CONFIG_SYS_HYPERVISOR is not set
+ # CONFIG_CONNECTOR is not set
+ CONFIG_MTD=y
+@@ -488,7 +464,6 @@
+ CONFIG_MTD_PARTITIONS=y
+ # CONFIG_MTD_REDBOOT_PARTS is not set
+ # CONFIG_MTD_CMDLINE_PARTS is not set
+-# CONFIG_MTD_AR7_PARTS is not set
+
+ #
+ # User Modules And Translation Layers
+@@ -532,7 +507,6 @@
+ #
+ CONFIG_MTD_COMPLEX_MAPPINGS=y
+ # CONFIG_MTD_PHYSMAP is not set
+-# CONFIG_MTD_GPIO_ADDR is not set
+ # CONFIG_MTD_UCLINUX is not set
+ # CONFIG_MTD_PLATRAM is not set
+
+@@ -568,12 +542,10 @@
+ CONFIG_BLK_DEV_RAM=y
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=4096
+-# CONFIG_BLK_DEV_XIP is not set
++CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+ # CONFIG_CDROM_PKTCDVD is not set
+ # CONFIG_ATA_OVER_ETH is not set
+-# CONFIG_BLK_DEV_HD is not set
+ # CONFIG_MISC_DEVICES is not set
+-CONFIG_HAVE_IDE=y
+ # CONFIG_IDE is not set
+
+ #
+@@ -586,6 +558,7 @@
+ # CONFIG_ATA is not set
+ # CONFIG_MD is not set
+ CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
+ # CONFIG_DUMMY is not set
+ # CONFIG_BONDING is not set
+ # CONFIG_MACVLAN is not set
+@@ -606,7 +579,6 @@
+ # CONFIG_SMSC_PHY is not set
+ # CONFIG_BROADCOM_PHY is not set
+ # CONFIG_ICPLUS_PHY is not set
+-# CONFIG_REALTEK_PHY is not set
+ # CONFIG_FIXED_PHY is not set
+ # CONFIG_MDIO_BITBANG is not set
+ CONFIG_NET_ETHERNET=y
+@@ -619,14 +591,11 @@
+ # CONFIG_SMC91X is not set
+ # CONFIG_SMSC911X is not set
+ # CONFIG_DM9000 is not set
+-# CONFIG_ENC28J60 is not set
+ # CONFIG_IBM_NEW_EMAC_ZMII is not set
+ # CONFIG_IBM_NEW_EMAC_RGMII is not set
+ # CONFIG_IBM_NEW_EMAC_TAH is not set
+ # CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+-# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
+-# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
+-# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
++# CONFIG_B44 is not set
+ # CONFIG_NETDEV_1000 is not set
+ # CONFIG_NETDEV_10000 is not set
+
+@@ -635,7 +604,6 @@
+ #
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
+-# CONFIG_IWLWIFI_LEDS is not set
+
+ #
+ # USB Network Adapters
+@@ -648,6 +616,7 @@
+ # CONFIG_WAN is not set
+ # CONFIG_PPP is not set
+ # CONFIG_SLIP is not set
++# CONFIG_SHAPER is not set
+ # CONFIG_NETCONSOLE is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+@@ -673,15 +642,14 @@
+ # CONFIG_BF5xx_PPIFCD is not set
+ # CONFIG_BFIN_SIMPLE_TIMER is not set
+ # CONFIG_BF5xx_PPI is not set
+-# CONFIG_BF5xx_EPPI is not set
++CONFIG_BFIN_OTP=y
++# CONFIG_BFIN_OTP_WRITE_ENABLE is not set
+ # CONFIG_BFIN_SPORT is not set
+ # CONFIG_BFIN_TIMER_LATENCY is not set
+ # CONFIG_TWI_LCD is not set
+-CONFIG_BFIN_DMA_INTERFACE=m
+ CONFIG_SIMPLE_GPIO=m
+ # CONFIG_VT is not set
+ # CONFIG_DEVKMEM is not set
+-# CONFIG_BFIN_JTAG_COMM is not set
+ # CONFIG_SERIAL_NONSTANDARD is not set
+
+ #
+@@ -705,8 +673,6 @@
+ # CONFIG_SERIAL_BFIN_SPORT is not set
+ CONFIG_UNIX98_PTYS=y
+ # CONFIG_LEGACY_PTYS is not set
+-CONFIG_BFIN_OTP=y
+-# CONFIG_BFIN_OTP_WRITE_ENABLE is not set
+
+ #
+ # CAN, the car bus and industrial fieldbus
+@@ -714,49 +680,44 @@
+ # CONFIG_CAN4LINUX is not set
+ # CONFIG_IPMI_HANDLER is not set
+ # CONFIG_HW_RANDOM is not set
++# CONFIG_GEN_RTC is not set
+ # CONFIG_R3964 is not set
+ # CONFIG_RAW_DRIVER is not set
+ # CONFIG_TCG_TPM is not set
+ CONFIG_I2C=y
+ CONFIG_I2C_BOARDINFO=y
+ CONFIG_I2C_CHARDEV=m
+-CONFIG_I2C_HELPER_AUTO=y
+
+ #
+-# I2C Hardware Bus support
++# I2C Algorithms
+ #
++# CONFIG_I2C_ALGOBIT is not set
++# CONFIG_I2C_ALGOPCF is not set
++# CONFIG_I2C_ALGOPCA is not set
+
+ #
+-# I2C system bus drivers (mostly embedded / system-on-chip)
++# I2C Hardware Bus support
+ #
+ CONFIG_I2C_BLACKFIN_TWI=m
+ CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ=100
+ # CONFIG_I2C_GPIO is not set
+ # CONFIG_I2C_OCORES is not set
+-# CONFIG_I2C_SIMTEC is not set
+-
+-#
+-# External I2C/SMBus adapter drivers
+-#
+ # CONFIG_I2C_PARPORT_LIGHT is not set
++# CONFIG_I2C_SIMTEC is not set
+ # CONFIG_I2C_TAOS_EVM is not set
+-# CONFIG_I2C_TINY_USB is not set
+-
+-#
+-# Other I2C/SMBus bus drivers
+-#
+-# CONFIG_I2C_PCA_PLATFORM is not set
+ # CONFIG_I2C_STUB is not set
++# CONFIG_I2C_TINY_USB is not set
+
+ #
+ # Miscellaneous I2C Chip support
+ #
++# CONFIG_SENSORS_DS1337 is not set
++# CONFIG_SENSORS_DS1374 is not set
+ # CONFIG_DS1682 is not set
+-# CONFIG_AT24 is not set
+ # CONFIG_SENSORS_AD5252 is not set
+-# CONFIG_SENSORS_EEPROM is not set
++# CONFIG_EEPROM_LEGACY is not set
+ # CONFIG_SENSORS_PCF8574 is not set
+-# CONFIG_PCF8575 is not set
++# CONFIG_SENSORS_PCF8575 is not set
+ # CONFIG_SENSORS_PCA9539 is not set
+ # CONFIG_SENSORS_PCF8591 is not set
+ # CONFIG_SENSORS_MAX6875 is not set
+@@ -765,41 +726,37 @@
+ # CONFIG_I2C_DEBUG_ALGO is not set
+ # CONFIG_I2C_DEBUG_BUS is not set
+ # CONFIG_I2C_DEBUG_CHIP is not set
++
++#
++# SPI support
++#
+ CONFIG_SPI=y
+-# CONFIG_SPI_DEBUG is not set
+ CONFIG_SPI_MASTER=y
+
+ #
+ # SPI Master Controller Drivers
+ #
+ CONFIG_SPI_BFIN=y
+-# CONFIG_SPI_BFIN_LOCK is not set
+ # CONFIG_SPI_BITBANG is not set
+
+ #
+ # SPI Protocol Masters
+ #
+-# CONFIG_SPI_AT25 is not set
++# CONFIG_EEPROM_AT25 is not set
+ # CONFIG_SPI_SPIDEV is not set
+ # CONFIG_SPI_TLE62X0 is not set
+-CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
+-# CONFIG_GPIOLIB is not set
+ # CONFIG_W1 is not set
+ # CONFIG_POWER_SUPPLY is not set
+ CONFIG_HWMON=y
+ # CONFIG_HWMON_VID is not set
+-# CONFIG_SENSORS_AD7414 is not set
+ # CONFIG_SENSORS_AD7418 is not set
+-# CONFIG_SENSORS_ADCXX is not set
+ # CONFIG_SENSORS_ADM1021 is not set
+ # CONFIG_SENSORS_ADM1025 is not set
+ # CONFIG_SENSORS_ADM1026 is not set
+ # CONFIG_SENSORS_ADM1029 is not set
+ # CONFIG_SENSORS_ADM1031 is not set
+ # CONFIG_SENSORS_ADM9240 is not set
+-# CONFIG_SENSORS_ADT7462 is not set
+ # CONFIG_SENSORS_ADT7470 is not set
+-# CONFIG_SENSORS_ADT7473 is not set
+ # CONFIG_SENSORS_ATXP1 is not set
+ # CONFIG_SENSORS_DS1621 is not set
+ # CONFIG_SENSORS_F71805F is not set
+@@ -820,7 +777,6 @@
+ # CONFIG_SENSORS_LM90 is not set
+ # CONFIG_SENSORS_LM92 is not set
+ # CONFIG_SENSORS_LM93 is not set
+-# CONFIG_SENSORS_MAX1111 is not set
+ # CONFIG_SENSORS_MAX1619 is not set
+ # CONFIG_SENSORS_MAX6650 is not set
+ # CONFIG_SENSORS_PC87360 is not set
+@@ -829,7 +785,6 @@
+ # CONFIG_SENSORS_SMSC47M1 is not set
+ # CONFIG_SENSORS_SMSC47M192 is not set
+ # CONFIG_SENSORS_SMSC47B397 is not set
+-# CONFIG_SENSORS_ADS7828 is not set
+ # CONFIG_SENSORS_THMC50 is not set
+ # CONFIG_SENSORS_VT1211 is not set
+ # CONFIG_SENSORS_W83781D is not set
+@@ -837,12 +792,9 @@
+ # CONFIG_SENSORS_W83792D is not set
+ # CONFIG_SENSORS_W83793 is not set
+ # CONFIG_SENSORS_W83L785TS is not set
+-# CONFIG_SENSORS_W83L786NG is not set
+ # CONFIG_SENSORS_W83627HF is not set
+ # CONFIG_SENSORS_W83627EHF is not set
+ # CONFIG_HWMON_DEBUG_CHIP is not set
+-# CONFIG_THERMAL is not set
+-# CONFIG_THERMAL_HWMON is not set
+ CONFIG_WATCHDOG=y
+ # CONFIG_WATCHDOG_NOWAYOUT is not set
+
+@@ -858,31 +810,21 @@
+ # CONFIG_USBPCWATCHDOG is not set
+
+ #
+-# Multifunction device drivers
++# Sonics Silicon Backplane
+ #
+-# CONFIG_MFD_CORE is not set
+-# CONFIG_MFD_SM501 is not set
+-# CONFIG_HTC_PASIC3 is not set
+-# CONFIG_MFD_TMIO is not set
+-# CONFIG_PMIC_DA903X is not set
+-# CONFIG_MFD_WM8400 is not set
+-# CONFIG_MFD_WM8350_I2C is not set
+-# CONFIG_REGULATOR is not set
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB is not set
+
+ #
+-# Multimedia devices
++# Multifunction device drivers
+ #
++# CONFIG_MFD_SM501 is not set
+
+ #
+-# Multimedia core support
++# Multimedia devices
+ #
+ # CONFIG_VIDEO_DEV is not set
+ # CONFIG_DVB_CORE is not set
+-# CONFIG_VIDEO_MEDIA is not set
+-
+-#
+-# Multimedia drivers
+-#
+ # CONFIG_DAB is not set
+
+ #
+@@ -897,6 +839,10 @@
+ # Display device support
+ #
+ # CONFIG_DISPLAY_SUPPORT is not set
++
++#
++# Sound
++#
+ # CONFIG_SOUND is not set
+ CONFIG_USB_SUPPORT=y
+ CONFIG_USB_ARCH_HAS_HCD=y
+@@ -904,7 +850,6 @@
+ # CONFIG_USB_ARCH_HAS_EHCI is not set
+ CONFIG_USB=y
+ # CONFIG_USB_DEBUG is not set
+-# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
+
+ #
+ # Miscellaneous USB options
+@@ -915,48 +860,40 @@
+ # CONFIG_USB_OTG is not set
+ # CONFIG_USB_OTG_WHITELIST is not set
+ CONFIG_USB_OTG_BLACKLIST_HUB=y
+-CONFIG_USB_MON=y
+-# CONFIG_USB_WUSB is not set
+-# CONFIG_USB_WUSB_CBAF is not set
+
+ #
+ # USB Host Controller Drivers
+ #
+-# CONFIG_USB_C67X00_HCD is not set
+ # CONFIG_USB_ISP116X_HCD is not set
+-# CONFIG_USB_ISP1760_HCD is not set
+ # CONFIG_USB_ISP1362_HCD is not set
++# CONFIG_USB_ISP1760_HCD is not set
+ # CONFIG_USB_SL811_HCD is not set
+ # CONFIG_USB_R8A66597_HCD is not set
+-# CONFIG_USB_HWA_HCD is not set
+ CONFIG_USB_MUSB_HDRC=y
+ CONFIG_USB_MUSB_SOC=y
+
+ #
+-# Blackfin high speed USB Support
++# Blackfin high speed USB support
+ #
+ CONFIG_USB_MUSB_HOST=y
+ # CONFIG_USB_MUSB_PERIPHERAL is not set
+ # CONFIG_USB_MUSB_OTG is not set
+ CONFIG_USB_MUSB_HDRC_HCD=y
+ CONFIG_MUSB_PIO_ONLY=y
+-CONFIG_MUSB_DMA_POLL=y
+-# CONFIG_USB_MUSB_DEBUG is not set
++CONFIG_USB_MUSB_LOGLEVEL=0
+
+ #
+ # USB Device Class drivers
+ #
+ # CONFIG_USB_ACM is not set
+ # CONFIG_USB_PRINTER is not set
+-# CONFIG_USB_WDM is not set
+-# CONFIG_USB_TMC is not set
+
+ #
+-# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+
+ #
+-# see USB_STORAGE Help for more information
++# may also be needed; see USB_STORAGE Help for more information
+ #
+ # CONFIG_USB_LIBUSUAL is not set
+
+@@ -964,10 +901,15 @@
+ # USB Imaging devices
+ #
+ # CONFIG_USB_MDC800 is not set
++CONFIG_USB_MON=y
+
+ #
+ # USB port drivers
+ #
++
++#
++# USB Serial Converter support
++#
+ # CONFIG_USB_SERIAL is not set
+
+ #
+@@ -976,7 +918,7 @@
+ # CONFIG_USB_EMI62 is not set
+ # CONFIG_USB_EMI26 is not set
+ # CONFIG_USB_ADUTUX is not set
+-# CONFIG_USB_SEVSEG is not set
++# CONFIG_USB_AUERSWALD is not set
+ # CONFIG_USB_RIO500 is not set
+ # CONFIG_USB_LEGOTOWER is not set
+ # CONFIG_USB_LCD is not set
+@@ -992,13 +934,17 @@
+ # CONFIG_USB_LD is not set
+ # CONFIG_USB_TRANCEVIBRATOR is not set
+ # CONFIG_USB_IOWARRIOR is not set
+-# CONFIG_USB_ISIGHTFW is not set
+-# CONFIG_USB_VST is not set
++
++#
++# USB DSL modem support
++#
++
++#
++# USB Gadget Support
++#
+ # CONFIG_USB_GADGET is not set
+ # CONFIG_MMC is not set
+-# CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS is not set
+-# CONFIG_ACCESSIBILITY is not set
+ CONFIG_RTC_LIB=y
+ CONFIG_RTC_CLASS=y
+ CONFIG_RTC_HCTOSYS=y
+@@ -1027,59 +973,51 @@
+ # CONFIG_RTC_DRV_PCF8563 is not set
+ # CONFIG_RTC_DRV_PCF8583 is not set
+ # CONFIG_RTC_DRV_M41T80 is not set
+-# CONFIG_RTC_DRV_S35390A is not set
+-# CONFIG_RTC_DRV_FM3130 is not set
+-# CONFIG_RTC_DRV_RX8581 is not set
+
+ #
+ # SPI RTC drivers
+ #
+-# CONFIG_RTC_DRV_M41T94 is not set
+-# CONFIG_RTC_DRV_DS1305 is not set
+-# CONFIG_RTC_DRV_DS1390 is not set
+-# CONFIG_RTC_DRV_MAX6902 is not set
+-# CONFIG_RTC_DRV_R9701 is not set
+ # CONFIG_RTC_DRV_RS5C348 is not set
+-# CONFIG_RTC_DRV_DS3234 is not set
++# CONFIG_RTC_DRV_MAX6902 is not set
+
+ #
+ # Platform RTC drivers
+ #
+-# CONFIG_RTC_DRV_DS1286 is not set
+-# CONFIG_RTC_DRV_DS1511 is not set
+ # CONFIG_RTC_DRV_DS1553 is not set
+-# CONFIG_RTC_DRV_DS1742 is not set
+ # CONFIG_RTC_DRV_STK17TA8 is not set
++# CONFIG_RTC_DRV_DS1742 is not set
+ # CONFIG_RTC_DRV_M48T86 is not set
+-# CONFIG_RTC_DRV_M48T35 is not set
+ # CONFIG_RTC_DRV_M48T59 is not set
+-# CONFIG_RTC_DRV_BQ4802 is not set
+ # CONFIG_RTC_DRV_V3020 is not set
+
+ #
+ # on-CPU RTC drivers
+ #
+ CONFIG_RTC_DRV_BFIN=y
+-# CONFIG_DMADEVICES is not set
++
++#
++# Userspace I/O
++#
+ # CONFIG_UIO is not set
+-# CONFIG_STAGING is not set
+
+ #
+ # File systems
+ #
+ # CONFIG_EXT2_FS is not set
+ # CONFIG_EXT3_FS is not set
+-# CONFIG_EXT4_FS is not set
++# CONFIG_EXT4DEV_FS is not set
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
+ # CONFIG_FS_POSIX_ACL is not set
+-CONFIG_FILE_LOCKING=y
+ # CONFIG_XFS_FS is not set
++# CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_DNOTIFY is not set
++# CONFIG_MINIX_FS is not set
++# CONFIG_ROMFS_FS is not set
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+ # CONFIG_QUOTA is not set
++# CONFIG_DNOTIFY is not set
+ # CONFIG_AUTOFS_FS is not set
+ # CONFIG_AUTOFS4_FS is not set
+ # CONFIG_FUSE_FS is not set
+@@ -1121,11 +1059,8 @@
+ # CONFIG_JFFS2_FS is not set
+ # CONFIG_CRAMFS is not set
+ # CONFIG_VXFS_FS is not set
+-# CONFIG_MINIX_FS is not set
+-# CONFIG_OMFS_FS is not set
+ # CONFIG_HPFS_FS is not set
+ # CONFIG_QNX4FS_FS is not set
+-# CONFIG_ROMFS_FS is not set
+ # CONFIG_SYSV_FS is not set
+ # CONFIG_UFS_FS is not set
+ CONFIG_NETWORK_FILESYSTEMS=y
+@@ -1133,12 +1068,13 @@
+ CONFIG_NFS_V3=y
+ # CONFIG_NFS_V3_ACL is not set
+ # CONFIG_NFS_V4 is not set
++# CONFIG_NFS_DIRECTIO is not set
+ # CONFIG_NFSD is not set
+ CONFIG_LOCKD=m
+ CONFIG_LOCKD_V4=y
+ CONFIG_NFS_COMMON=y
+ CONFIG_SUNRPC=m
+-# CONFIG_SUNRPC_REGISTER_V4 is not set
++# CONFIG_SUNRPC_BIND34 is not set
+ # CONFIG_RPCSEC_GSS_KRB5 is not set
+ # CONFIG_RPCSEC_GSS_SPKM3 is not set
+ CONFIG_SMB_FS=m
+@@ -1194,6 +1130,7 @@
+ # CONFIG_NLS_KOI8_U is not set
+ # CONFIG_NLS_UTF8 is not set
+ # CONFIG_DLM is not set
++# CONFIG_INSTRUMENTATION is not set
+
+ #
+ # Kernel hacking
+@@ -1201,61 +1138,14 @@
+ # CONFIG_PRINTK_TIME is not set
+ CONFIG_ENABLE_WARN_DEPRECATED=y
+ CONFIG_ENABLE_MUST_CHECK=y
+-CONFIG_FRAME_WARN=1024
+ # CONFIG_MAGIC_SYSRQ is not set
+ # CONFIG_UNUSED_SYMBOLS is not set
+ CONFIG_DEBUG_FS=y
+ # CONFIG_HEADERS_CHECK is not set
+-CONFIG_DEBUG_KERNEL=y
+-# CONFIG_DEBUG_SHIRQ is not set
+-CONFIG_DETECT_SOFTLOCKUP=y
+-# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+-CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
+-# CONFIG_SCHED_DEBUG is not set
+-# CONFIG_SCHEDSTATS is not set
+-# CONFIG_TIMER_STATS is not set
+-# CONFIG_DEBUG_OBJECTS is not set
+-# CONFIG_DEBUG_SLAB is not set
+-# CONFIG_DEBUG_RT_MUTEXES is not set
+-# CONFIG_RT_MUTEX_TESTER is not set
+-# CONFIG_DEBUG_SPINLOCK is not set
+-# CONFIG_DEBUG_MUTEXES is not set
+-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+-# CONFIG_DEBUG_KOBJECT is not set
++# CONFIG_DEBUG_KERNEL is not set
+ # CONFIG_DEBUG_BUGVERBOSE is not set
+-# CONFIG_DEBUG_INFO is not set
+-# CONFIG_DEBUG_VM is not set
+-# CONFIG_DEBUG_WRITECOUNT is not set
+-# CONFIG_DEBUG_MEMORY_INIT is not set
+-# CONFIG_DEBUG_LIST is not set
+-# CONFIG_DEBUG_SG is not set
+-# CONFIG_FRAME_POINTER is not set
+-# CONFIG_BOOT_PRINTK_DELAY is not set
+-# CONFIG_RCU_TORTURE_TEST is not set
+-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+-# CONFIG_BACKTRACE_SELF_TEST is not set
+-# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+-# CONFIG_FAULT_INJECTION is not set
+-# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+-
+-#
+-# Tracers
+-#
+-# CONFIG_SCHED_TRACER is not set
+-# CONFIG_CONTEXT_SWITCH_TRACER is not set
+-# CONFIG_BOOT_TRACER is not set
+-# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
+ # CONFIG_SAMPLES is not set
+-CONFIG_HAVE_ARCH_KGDB=y
+-# CONFIG_KGDB is not set
+-# CONFIG_DEBUG_STACKOVERFLOW is not set
+-# CONFIG_DEBUG_STACK_USAGE is not set
+-# CONFIG_KGDB_TESTCASE is not set
+-CONFIG_DEBUG_VERBOSE=y
+ CONFIG_DEBUG_MMRS=y
+-# CONFIG_DEBUG_HWERR is not set
+-# CONFIG_DEBUG_DOUBLEFAULT is not set
+ CONFIG_DEBUG_HUNT_FOR_ZERO=y
+ CONFIG_DEBUG_BFIN_HWTRACE_ON=y
+ CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_OFF=y
+@@ -1264,7 +1154,7 @@
+ CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION=0
+ # CONFIG_DEBUG_BFIN_HWTRACE_EXPAND is not set
+ # CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE is not set
+-# CONFIG_EARLY_PRINTK is not set
++CONFIG_EARLY_PRINTK=y
+ # CONFIG_CPLB_INFO is not set
+ CONFIG_ACCESS_CHECK=y
+
+@@ -1273,96 +1163,10 @@
+ #
+ # CONFIG_KEYS is not set
+ CONFIG_SECURITY=y
+-# CONFIG_SECURITYFS is not set
+ # CONFIG_SECURITY_NETWORK is not set
+-# CONFIG_SECURITY_FILE_CAPABILITIES is not set
++# CONFIG_SECURITY_CAPABILITIES is not set
+ # CONFIG_SECURITY_ROOTPLUG is not set
+-CONFIG_SECURITY_DEFAULT_MMAP_MIN_ADDR=0
+-CONFIG_CRYPTO=y
+-
+-#
+-# Crypto core or helper
+-#
+-# CONFIG_CRYPTO_FIPS is not set
+-# CONFIG_CRYPTO_MANAGER is not set
+-# CONFIG_CRYPTO_MANAGER2 is not set
+-# CONFIG_CRYPTO_GF128MUL is not set
+-# CONFIG_CRYPTO_NULL is not set
+-# CONFIG_CRYPTO_CRYPTD is not set
+-# CONFIG_CRYPTO_AUTHENC is not set
+-# CONFIG_CRYPTO_TEST is not set
+-
+-#
+-# Authenticated Encryption with Associated Data
+-#
+-# CONFIG_CRYPTO_CCM is not set
+-# CONFIG_CRYPTO_GCM is not set
+-# CONFIG_CRYPTO_SEQIV is not set
+-
+-#
+-# Block modes
+-#
+-# CONFIG_CRYPTO_CBC is not set
+-# CONFIG_CRYPTO_CTR is not set
+-# CONFIG_CRYPTO_CTS is not set
+-# CONFIG_CRYPTO_ECB is not set
+-# CONFIG_CRYPTO_LRW is not set
+-# CONFIG_CRYPTO_PCBC is not set
+-# CONFIG_CRYPTO_XTS is not set
+-
+-#
+-# Hash modes
+-#
+-# CONFIG_CRYPTO_HMAC is not set
+-# CONFIG_CRYPTO_XCBC is not set
+-
+-#
+-# Digest
+-#
+-# CONFIG_CRYPTO_CRC32C is not set
+-# CONFIG_CRYPTO_MD4 is not set
+-# CONFIG_CRYPTO_MD5 is not set
+-# CONFIG_CRYPTO_MICHAEL_MIC is not set
+-# CONFIG_CRYPTO_RMD128 is not set
+-# CONFIG_CRYPTO_RMD160 is not set
+-# CONFIG_CRYPTO_RMD256 is not set
+-# CONFIG_CRYPTO_RMD320 is not set
+-# CONFIG_CRYPTO_SHA1 is not set
+-# CONFIG_CRYPTO_SHA256 is not set
+-# CONFIG_CRYPTO_SHA512 is not set
+-# CONFIG_CRYPTO_TGR192 is not set
+-# CONFIG_CRYPTO_WP512 is not set
+-
+-#
+-# Ciphers
+-#
+-# CONFIG_CRYPTO_AES is not set
+-# CONFIG_CRYPTO_ANUBIS is not set
+-# CONFIG_CRYPTO_ARC4 is not set
+-# CONFIG_CRYPTO_BLOWFISH is not set
+-# CONFIG_CRYPTO_CAMELLIA is not set
+-# CONFIG_CRYPTO_CAST5 is not set
+-# CONFIG_CRYPTO_CAST6 is not set
+-# CONFIG_CRYPTO_DES is not set
+-# CONFIG_CRYPTO_FCRYPT is not set
+-# CONFIG_CRYPTO_KHAZAD is not set
+-# CONFIG_CRYPTO_SALSA20 is not set
+-# CONFIG_CRYPTO_SEED is not set
+-# CONFIG_CRYPTO_SERPENT is not set
+-# CONFIG_CRYPTO_TEA is not set
+-# CONFIG_CRYPTO_TWOFISH is not set
+-
+-#
+-# Compression
+-#
+-# CONFIG_CRYPTO_DEFLATE is not set
+-# CONFIG_CRYPTO_LZO is not set
+-
+-#
+-# Random Number Generation
+-#
+-# CONFIG_CRYPTO_ANSI_CPRNG is not set
+-CONFIG_CRYPTO_HW=y
++# CONFIG_CRYPTO is not set
+
+ #
+ # Library routines
+@@ -1370,7 +1174,6 @@
+ CONFIG_BITREVERSE=y
+ CONFIG_CRC_CCITT=m
+ # CONFIG_CRC16 is not set
+-# CONFIG_CRC_T10DIF is not set
+ # CONFIG_CRC_ITU_T is not set
+ CONFIG_CRC32=y
+ # CONFIG_CRC7 is not set
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/configs/CM-BF548_defconfig linux-2.6.29-rc3.owrt/arch/blackfin/configs/CM-BF548_defconfig
+--- linux-2.6.29.owrt/arch/blackfin/configs/CM-BF548_defconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/configs/CM-BF548_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -336,8 +336,8 @@
+ CONFIG_BFIN_DCACHE=y
+ # CONFIG_BFIN_DCACHE_BANKA is not set
+ # CONFIG_BFIN_ICACHE_LOCK is not set
+-CONFIG_BFIN_WB=y
+-# CONFIG_BFIN_WT is not set
++# CONFIG_BFIN_WB is not set
++CONFIG_BFIN_WT=y
+ CONFIG_L1_MAX_PIECE=16
+ # CONFIG_MPU is not set
+
+@@ -595,7 +595,7 @@
+ CONFIG_SCSI_DMA=y
+ # CONFIG_SCSI_TGT is not set
+ # CONFIG_SCSI_NETLINK is not set
+-# CONFIG_SCSI_PROC_FS is not set
++CONFIG_SCSI_PROC_FS=y
+
+ #
+ # SCSI support type (disk, tape, CD-ROM)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/configs/IP0X_defconfig linux-2.6.29-rc3.owrt/arch/blackfin/configs/IP0X_defconfig
+--- linux-2.6.29.owrt/arch/blackfin/configs/IP0X_defconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/configs/IP0X_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -612,7 +612,7 @@
+ CONFIG_SCSI=y
+ # CONFIG_SCSI_TGT is not set
+ # CONFIG_SCSI_NETLINK is not set
+-# CONFIG_SCSI_PROC_FS is not set
++CONFIG_SCSI_PROC_FS=y
+
+ #
+ # SCSI support type (disk, tape, CD-ROM)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/configs/SRV1_defconfig linux-2.6.29-rc3.owrt/arch/blackfin/configs/SRV1_defconfig
+--- linux-2.6.29.owrt/arch/blackfin/configs/SRV1_defconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/configs/SRV1_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -282,8 +282,8 @@
+ CONFIG_BFIN_DCACHE=y
+ # CONFIG_BFIN_DCACHE_BANKA is not set
+ # CONFIG_BFIN_ICACHE_LOCK is not set
+-CONFIG_BFIN_WB=y
+-# CONFIG_BFIN_WT is not set
++# CONFIG_BFIN_WB is not set
++CONFIG_BFIN_WT=y
+ CONFIG_L1_MAX_PIECE=16
+
+ #
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/include/asm/bfin_sport.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/bfin_sport.h
+--- linux-2.6.29.owrt/arch/blackfin/include/asm/bfin_sport.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/bfin_sport.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,9 +1,30 @@
+ /*
+- * bfin_sport.h - userspace header for bfin sport driver
++ * File: include/asm-blackfin/bfin_sport.h
++ * Based on:
++ * Author: Roy Huang (roy.huang@analog.com)
+ *
+- * Copyright 2004-2008 Analog Devices Inc.
++ * Created: Thu Aug. 24 2006
++ * Description:
+ *
+- * Licensed under the GPL-2 or later.
++ * Modified:
++ * Copyright 2004-2006 Analog Devices Inc.
++ *
++ * Bugs: Enter bugs at http://blackfin.uclinux.org/
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, see the file COPYING, or write
++ * to the Free Software Foundation, Inc.,
++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ #ifndef __BFIN_SPORT_H__
+@@ -21,10 +42,11 @@
+ #define NORM_FORMAT 0x0
+ #define ALAW_FORMAT 0x2
+ #define ULAW_FORMAT 0x3
++struct sport_register;
+
+ /* Function driver which use sport must initialize the structure */
+ struct sport_config {
+- /* TDM (multichannels), I2S or other mode */
++ /*TDM (multichannels), I2S or other mode */
+ unsigned int mode:3;
+
+ /* if TDM mode is selected, channels must be set */
+@@ -50,18 +72,12 @@
+ int serial_clk;
+ int fsync_clk;
+
+- unsigned int data_format:2; /* Normal, u-law or a-law */
++ unsigned int data_format:2; /*Normal, u-law or a-law */
+
+ int word_len; /* How length of the word in bits, 3-32 bits */
+ int dma_enabled;
+ };
+
+-/* Userspace interface */
+-#define SPORT_IOC_MAGIC 'P'
+-#define SPORT_IOC_CONFIG _IOWR('P', 0x01, struct sport_config)
+-
+-#ifdef __KERNEL__
+-
+ struct sport_register {
+ unsigned short tcr1;
+ unsigned short reserved0;
+@@ -101,6 +117,9 @@
+ unsigned long mrcs3;
+ };
+
++#define SPORT_IOC_MAGIC 'P'
++#define SPORT_IOC_CONFIG _IOWR('P', 0x01, struct sport_config)
++
+ struct sport_dev {
+ struct cdev cdev; /* Char device structure */
+
+@@ -130,8 +149,6 @@
+ struct sport_config config;
+ };
+
+-#endif
+-
+ #define SPORT_TCR1 0
+ #define SPORT_TCR2 1
+ #define SPORT_TCLKDIV 2
+@@ -152,4 +169,4 @@
+ #define SPORT_MRCS2 22
+ #define SPORT_MRCS3 23
+
+-#endif
++#endif /*__BFIN_SPORT_H__*/
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/include/asm/checksum.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/checksum.h
+--- linux-2.6.29.owrt/arch/blackfin/include/asm/checksum.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/checksum.h 2009-05-10 23:48:28.000000000 +0200
+@@ -63,23 +63,23 @@
+ csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len,
+ unsigned short proto, __wsum sum)
+ {
+- unsigned int carry;
+
+- __asm__ ("%0 = %0 + %2;\n\t"
+- "CC = AC0;\n\t"
+- "%1 = CC;\n\t"
+- "%0 = %0 + %1;\n\t"
+- "%0 = %0 + %3;\n\t"
+- "CC = AC0;\n\t"
+- "%1 = CC;\n\t"
+- "%0 = %0 + %1;\n\t"
+- "%0 = %0 + %4;\n\t"
+- "CC = AC0;\n\t"
+- "%1 = CC;\n\t"
+- "%0 = %0 + %1;\n\t"
+- : "=d" (sum), "=&d" (carry)
+- : "d" (daddr), "d" (saddr), "d" ((len + proto) << 8), "0"(sum)
+- : "CC");
++ __asm__ ("%0 = %0 + %1;\n\t"
++ "CC = AC0;\n\t"
++ "if !CC jump 4;\n\t"
++ "%0 = %0 + %4;\n\t"
++ "%0 = %0 + %2;\n\t"
++ "CC = AC0;\n\t"
++ "if !CC jump 4;\n\t"
++ "%0 = %0 + %4;\n\t"
++ "%0 = %0 + %3;\n\t"
++ "CC = AC0;\n\t"
++ "if !CC jump 4;\n\t"
++ "%0 = %0 + %4;\n\t"
++ "NOP;\n\t"
++ : "=d" (sum)
++ : "d" (daddr), "d" (saddr), "d" ((ntohs(len)<<16)+proto*256), "d" (1), "0"(sum)
++ : "CC");
+
+ return (sum);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/include/asm/delay.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/delay.h
+--- linux-2.6.29.owrt/arch/blackfin/include/asm/delay.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/delay.h 2009-05-10 23:48:28.000000000 +0200
+@@ -13,7 +13,29 @@
+
+ static inline void __delay(unsigned long loops)
+ {
+-__asm__ __volatile__ (
++ if (ANOMALY_05000312) {
++ /* Interrupted loads to loop registers -> bad */
++ unsigned long tmp;
++ __asm__ __volatile__(
++ "[--SP] = LC0;"
++ "[--SP] = LT0;"
++ "[--SP] = LB0;"
++ "LSETUP (1f,1f) LC0 = %1;"
++ "1: NOP;"
++ /* We take advantage of the fact that LC0 is 0 at
++ * the end of the loop. Otherwise we'd need some
++ * NOPs after the CLI here.
++ */
++ "CLI %0;"
++ "LB0 = [SP++];"
++ "LT0 = [SP++];"
++ "LC0 = [SP++];"
++ "STI %0;"
++ : "=d" (tmp)
++ : "a" (loops)
++ );
++ } else
++ __asm__ __volatile__ (
+ "LSETUP(1f, 1f) LC0 = %0;"
+ "1: NOP;"
+ :
+@@ -25,15 +47,16 @@
+ #include <linux/param.h> /* needed for HZ */
+
+ /*
+- * close approximation borrowed from m68knommu to avoid 64-bit math
++ * Use only for very small delays ( < 1 msec). Should probably use a
++ * lookup table, really, as the multiplications take much too long with
++ * short delays. This is a "reasonable" implementation, though (and the
++ * first constant multiplications gets optimized away if the delay is
++ * a constant)
+ */
+-
+-#define HZSCALE (268435456 / (1000000/HZ))
+-
+ static inline void udelay(unsigned long usecs)
+ {
+ extern unsigned long loops_per_jiffy;
+- __delay((((usecs * HZSCALE) >> 11) * (loops_per_jiffy >> 11)) >> 6);
++ __delay(usecs * loops_per_jiffy / (1000000 / HZ));
+ }
+
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/include/asm/gpio.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/gpio.h
+--- linux-2.6.29.owrt/arch/blackfin/include/asm/gpio.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/gpio.h 2009-05-10 23:48:28.000000000 +0200
+@@ -27,6 +27,60 @@
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
++/*
++* Number BF537/6/4 BF561 BF533/2/1
++* BF527/5/2
++*
++* GPIO_0 PF0 PF0 PF0
++* GPIO_1 PF1 PF1 PF1
++* GPIO_2 PF2 PF2 PF2
++* GPIO_3 PF3 PF3 PF3
++* GPIO_4 PF4 PF4 PF4
++* GPIO_5 PF5 PF5 PF5
++* GPIO_6 PF6 PF6 PF6
++* GPIO_7 PF7 PF7 PF7
++* GPIO_8 PF8 PF8 PF8
++* GPIO_9 PF9 PF9 PF9
++* GPIO_10 PF10 PF10 PF10
++* GPIO_11 PF11 PF11 PF11
++* GPIO_12 PF12 PF12 PF12
++* GPIO_13 PF13 PF13 PF13
++* GPIO_14 PF14 PF14 PF14
++* GPIO_15 PF15 PF15 PF15
++* GPIO_16 PG0 PF16
++* GPIO_17 PG1 PF17
++* GPIO_18 PG2 PF18
++* GPIO_19 PG3 PF19
++* GPIO_20 PG4 PF20
++* GPIO_21 PG5 PF21
++* GPIO_22 PG6 PF22
++* GPIO_23 PG7 PF23
++* GPIO_24 PG8 PF24
++* GPIO_25 PG9 PF25
++* GPIO_26 PG10 PF26
++* GPIO_27 PG11 PF27
++* GPIO_28 PG12 PF28
++* GPIO_29 PG13 PF29
++* GPIO_30 PG14 PF30
++* GPIO_31 PG15 PF31
++* GPIO_32 PH0 PF32
++* GPIO_33 PH1 PF33
++* GPIO_34 PH2 PF34
++* GPIO_35 PH3 PF35
++* GPIO_36 PH4 PF36
++* GPIO_37 PH5 PF37
++* GPIO_38 PH6 PF38
++* GPIO_39 PH7 PF39
++* GPIO_40 PH8 PF40
++* GPIO_41 PH9 PF41
++* GPIO_42 PH10 PF42
++* GPIO_43 PH11 PF43
++* GPIO_44 PH12 PF44
++* GPIO_45 PH13 PF45
++* GPIO_46 PH14 PF46
++* GPIO_47 PH15 PF47
++*/
++
+ #ifndef __ARCH_BLACKFIN_GPIO_H__
+ #define __ARCH_BLACKFIN_GPIO_H__
+
+@@ -241,6 +295,10 @@
+ int bfin_gpio_get_value(unsigned gpio);
+ void bfin_gpio_set_value(unsigned gpio, int value);
+
++#ifndef BF548_FAMILY
++#define bfin_gpio_set_value(gpio, value) set_gpio_data(gpio, value)
++#endif
++
+ #ifdef CONFIG_GPIOLIB
+ #include <asm-generic/gpio.h> /* cansleep wrappers */
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/include/asm/ipipe_base.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/ipipe_base.h
+--- linux-2.6.29.owrt/arch/blackfin/include/asm/ipipe_base.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/ipipe_base.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,5 +1,5 @@
+ /* -*- linux-c -*-
+- * include/asm-blackfin/ipipe_base.h
++ * include/asm-blackfin/_baseipipe.h
+ *
+ * Copyright (C) 2007 Philippe Gerum.
+ *
+@@ -27,9 +27,8 @@
+ #define IPIPE_NR_XIRQS NR_IRQS
+ #define IPIPE_IRQ_ISHIFT 5 /* 2^5 for 32bits arch. */
+
+-/* Blackfin-specific, per-cpu pipeline status */
+-#define IPIPE_SYNCDEFER_FLAG 15
+-#define IPIPE_SYNCDEFER_MASK (1L << IPIPE_SYNCDEFER_MASK)
++/* Blackfin-specific, global domain flags */
++#define IPIPE_ROOTLOCK_FLAG 1 /* Lock pipeline for root */
+
+ /* Blackfin traps -- i.e. exception vector numbers */
+ #define IPIPE_NR_FAULTS 52 /* We leave a gap after VEC_ILL_RES. */
+@@ -49,6 +48,11 @@
+
+ #ifndef __ASSEMBLY__
+
++#include <linux/bitops.h>
++
++extern int test_bit(int nr, const void *addr);
++
++
+ extern unsigned long __ipipe_root_status; /* Alias to ipipe_root_cpudom_var(status) */
+
+ static inline void __ipipe_stall_root(void)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/include/asm/ipipe.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/ipipe.h
+--- linux-2.6.29.owrt/arch/blackfin/include/asm/ipipe.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/ipipe.h 2009-05-10 23:48:28.000000000 +0200
+@@ -35,9 +35,9 @@
+ #include <asm/atomic.h>
+ #include <asm/traps.h>
+
+-#define IPIPE_ARCH_STRING "1.9-00"
++#define IPIPE_ARCH_STRING "1.8-00"
+ #define IPIPE_MAJOR_NUMBER 1
+-#define IPIPE_MINOR_NUMBER 9
++#define IPIPE_MINOR_NUMBER 8
+ #define IPIPE_PATCH_NUMBER 0
+
+ #ifdef CONFIG_SMP
+@@ -83,9 +83,9 @@
+ "%2 = CYCLES2\n" \
+ "CC = %2 == %0\n" \
+ "if ! CC jump 1b\n" \
+- : "=d,a" (((unsigned long *)&t)[1]), \
+- "=d,a" (((unsigned long *)&t)[0]), \
+- "=d,a" (__cy2) \
++ : "=r" (((unsigned long *)&t)[1]), \
++ "=r" (((unsigned long *)&t)[0]), \
++ "=r" (__cy2) \
+ : /*no input*/ : "CC"); \
+ t; \
+ })
+@@ -118,40 +118,35 @@
+
+ #define __ipipe_disable_irq(irq) (irq_desc[irq].chip->mask(irq))
+
+-static inline int __ipipe_check_tickdev(const char *devname)
+-{
+- return 1;
+-}
++#define __ipipe_lock_root() \
++ set_bit(IPIPE_ROOTLOCK_FLAG, &ipipe_root_domain->flags)
+
+-static inline void __ipipe_lock_root(void)
+-{
+- set_bit(IPIPE_SYNCDEFER_FLAG, &ipipe_root_cpudom_var(status));
+-}
+-
+-static inline void __ipipe_unlock_root(void)
+-{
+- clear_bit(IPIPE_SYNCDEFER_FLAG, &ipipe_root_cpudom_var(status));
+-}
++#define __ipipe_unlock_root() \
++ clear_bit(IPIPE_ROOTLOCK_FLAG, &ipipe_root_domain->flags)
+
+ void __ipipe_enable_pipeline(void);
+
+ #define __ipipe_hook_critical_ipi(ipd) do { } while (0)
+
+-#define __ipipe_sync_pipeline ___ipipe_sync_pipeline
+-void ___ipipe_sync_pipeline(unsigned long syncmask);
++#define __ipipe_sync_pipeline(syncmask) \
++ do { \
++ struct ipipe_domain *ipd = ipipe_current_domain; \
++ if (likely(ipd != ipipe_root_domain || !test_bit(IPIPE_ROOTLOCK_FLAG, &ipd->flags))) \
++ __ipipe_sync_stage(syncmask); \
++ } while (0)
+
+ void __ipipe_handle_irq(unsigned irq, struct pt_regs *regs);
+
+ int __ipipe_get_irq_priority(unsigned irq);
+
++int __ipipe_get_irqthread_priority(unsigned irq);
++
+ void __ipipe_stall_root_raw(void);
+
+ void __ipipe_unstall_root_raw(void);
+
+ void __ipipe_serial_debug(const char *fmt, ...);
+
+-asmlinkage void __ipipe_call_irqtail(unsigned long addr);
+-
+ DECLARE_PER_CPU(struct pt_regs, __ipipe_tick_regs);
+
+ extern unsigned long __ipipe_core_clock;
+@@ -167,25 +162,42 @@
+
+ #define __ipipe_run_irqtail() /* Must be a macro */ \
+ do { \
++ asmlinkage void __ipipe_call_irqtail(void); \
+ unsigned long __pending; \
+- CSYNC(); \
++ CSYNC(); \
+ __pending = bfin_read_IPEND(); \
+ if (__pending & 0x8000) { \
+ __pending &= ~0x8010; \
+ if (__pending && (__pending & (__pending - 1)) == 0) \
+- __ipipe_call_irqtail(__ipipe_irq_tail_hook); \
++ __ipipe_call_irqtail(); \
+ } \
+ } while (0)
+
+ #define __ipipe_run_isr(ipd, irq) \
+ do { \
+ if (ipd == ipipe_root_domain) { \
+- local_irq_enable_hw(); \
+- if (ipipe_virtual_irq_p(irq)) \
++ /* \
++ * Note: the I-pipe implements a threaded interrupt model on \
++ * this arch for Linux external IRQs. The interrupt handler we \
++ * call here only wakes up the associated IRQ thread. \
++ */ \
++ if (ipipe_virtual_irq_p(irq)) { \
++ /* No irqtail here; virtual interrupts have no effect \
++ on IPEND so there is no need for processing \
++ deferral. */ \
++ local_irq_enable_nohead(ipd); \
+ ipd->irqs[irq].handler(irq, ipd->irqs[irq].cookie); \
+- else \
++ local_irq_disable_nohead(ipd); \
++ } else \
++ /* \
++ * No need to run the irqtail here either; \
++ * we can't be preempted by hw IRQs, so \
++ * non-Linux IRQs cannot stack over the short \
++ * thread wakeup code. Which in turn means \
++ * that no irqtail condition could be pending \
++ * for domains above Linux in the pipeline. \
++ */ \
+ ipd->irqs[irq].handler(irq, &__raw_get_cpu_var(__ipipe_tick_regs)); \
+- local_irq_disable_hw(); \
+ } else { \
+ __clear_bit(IPIPE_SYNC_FLAG, &ipipe_cpudom_var(ipd, status)); \
+ local_irq_enable_nohead(ipd); \
+@@ -205,24 +217,42 @@
+
+ int ipipe_start_irq_thread(unsigned irq, struct irq_desc *desc);
+
+-#ifdef CONFIG_GENERIC_CLOCKEVENTS
+-#define IRQ_SYSTMR IRQ_CORETMR
+-#define IRQ_PRIOTMR IRQ_CORETMR
+-#else
++#define IS_SYSIRQ(irq) ((irq) > IRQ_CORETMR && (irq) <= SYS_IRQS)
++#define IS_GPIOIRQ(irq) ((irq) >= GPIO_IRQ_BASE && (irq) < NR_IRQS)
++
+ #define IRQ_SYSTMR IRQ_TIMER0
+ #define IRQ_PRIOTMR CONFIG_IRQ_TIMER0
+-#endif
+
+-#ifdef CONFIG_BF561
++#if defined(CONFIG_BF531) || defined(CONFIG_BF532) || defined(CONFIG_BF533)
++#define PRIO_GPIODEMUX(irq) CONFIG_PFA
++#elif defined(CONFIG_BF534) || defined(CONFIG_BF536) || defined(CONFIG_BF537)
++#define PRIO_GPIODEMUX(irq) CONFIG_IRQ_PROG_INTA
++#elif defined(CONFIG_BF52x)
++#define PRIO_GPIODEMUX(irq) ((irq) == IRQ_PORTF_INTA ? CONFIG_IRQ_PORTF_INTA : \
++ (irq) == IRQ_PORTG_INTA ? CONFIG_IRQ_PORTG_INTA : \
++ (irq) == IRQ_PORTH_INTA ? CONFIG_IRQ_PORTH_INTA : \
++ -1)
++#elif defined(CONFIG_BF561)
++#define PRIO_GPIODEMUX(irq) ((irq) == IRQ_PROG0_INTA ? CONFIG_IRQ_PROG0_INTA : \
++ (irq) == IRQ_PROG1_INTA ? CONFIG_IRQ_PROG1_INTA : \
++ (irq) == IRQ_PROG2_INTA ? CONFIG_IRQ_PROG2_INTA : \
++ -1)
+ #define bfin_write_TIMER_DISABLE(val) bfin_write_TMRS8_DISABLE(val)
+ #define bfin_write_TIMER_ENABLE(val) bfin_write_TMRS8_ENABLE(val)
+ #define bfin_write_TIMER_STATUS(val) bfin_write_TMRS8_STATUS(val)
+ #define bfin_read_TIMER_STATUS() bfin_read_TMRS8_STATUS()
+ #elif defined(CONFIG_BF54x)
++#define PRIO_GPIODEMUX(irq) ((irq) == IRQ_PINT0 ? CONFIG_IRQ_PINT0 : \
++ (irq) == IRQ_PINT1 ? CONFIG_IRQ_PINT1 : \
++ (irq) == IRQ_PINT2 ? CONFIG_IRQ_PINT2 : \
++ (irq) == IRQ_PINT3 ? CONFIG_IRQ_PINT3 : \
++ -1)
+ #define bfin_write_TIMER_DISABLE(val) bfin_write_TIMER_DISABLE0(val)
+ #define bfin_write_TIMER_ENABLE(val) bfin_write_TIMER_ENABLE0(val)
+ #define bfin_write_TIMER_STATUS(val) bfin_write_TIMER_STATUS0(val)
+ #define bfin_read_TIMER_STATUS(val) bfin_read_TIMER_STATUS0(val)
++#else
++# error "no PRIO_GPIODEMUX() for this part"
+ #endif
+
+ #define __ipipe_root_tick_p(regs) ((regs->ipend & 0x10) != 0)
+@@ -245,6 +275,4 @@
+
+ #endif /* !CONFIG_IPIPE */
+
+-#define ipipe_update_tick_evtdev(evtdev) do { } while (0)
+-
+ #endif /* !__ASM_BLACKFIN_IPIPE_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/include/asm/irq.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/irq.h
+--- linux-2.6.29.owrt/arch/blackfin/include/asm/irq.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/irq.h 2009-05-10 23:48:28.000000000 +0200
+@@ -61,38 +61,20 @@
+ #define raw_irqs_disabled_flags(flags) (!irqs_enabled_from_flags_hw(flags))
+ #define local_test_iflag_hw(x) irqs_enabled_from_flags_hw(x)
+
+-#define local_save_flags(x) \
+- do { \
+- (x) = __ipipe_test_root() ? \
+- __all_masked_irq_flags : bfin_irq_flags; \
+- barrier(); \
+- } while (0)
+-
+-#define local_irq_save(x) \
+- do { \
+- (x) = __ipipe_test_and_stall_root() ? \
++#define local_save_flags(x) \
++ do { \
++ (x) = __ipipe_test_root() ? \
+ __all_masked_irq_flags : bfin_irq_flags; \
+- barrier(); \
+ } while (0)
+
+-static inline void local_irq_restore(unsigned long x)
+-{
+- barrier();
+- __ipipe_restore_root(x == __all_masked_irq_flags);
+-}
+-
+-#define local_irq_disable() \
+- do { \
+- __ipipe_stall_root(); \
+- barrier(); \
++#define local_irq_save(x) \
++ do { \
++ (x) = __ipipe_test_and_stall_root(); \
+ } while (0)
+
+-static inline void local_irq_enable(void)
+-{
+- barrier();
+- __ipipe_unstall_root();
+-}
+-
++#define local_irq_restore(x) __ipipe_restore_root(x)
++#define local_irq_disable() __ipipe_stall_root()
++#define local_irq_enable() __ipipe_unstall_root()
+ #define irqs_disabled() __ipipe_test_root()
+
+ #define local_save_flags_hw(x) \
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/include/asm/Kbuild linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/Kbuild
+--- linux-2.6.29.owrt/arch/blackfin/include/asm/Kbuild 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/Kbuild 2009-05-10 23:48:28.000000000 +0200
+@@ -1,4 +1,3 @@
+ include include/asm-generic/Kbuild.asm
+
+-unifdef-y += bfin_sport.h
+ unifdef-y += fixed_code.h
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/include/asm/kgdb.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/kgdb.h
+--- linux-2.6.29.owrt/arch/blackfin/include/asm/kgdb.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/kgdb.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,8 +1,32 @@
+-/* Blackfin KGDB header
++/*
++ * File: include/asm-blackfin/kgdb.h
++ * Based on:
++ * Author: Sonic Zhang
++ *
++ * Created:
++ * Description:
++ *
++ * Rev: $Id: kgdb_bfin_linux-2.6.x.patch 4934 2007-02-13 09:32:11Z sonicz $
++ *
++ * Modified:
++ * Copyright 2005-2006 Analog Devices Inc.
++ *
++ * Bugs: Enter bugs at http://blackfin.uclinux.org/
+ *
+- * Copyright 2005-2009 Analog Devices Inc.
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
+ *
+- * Licensed under the GPL-2 or later.
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, see the file COPYING, or write
++ * to the Free Software Foundation, Inc.,
++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ #ifndef __ASM_BLACKFIN_KGDB_H__
+@@ -13,18 +37,17 @@
+ /* gdb locks */
+ #define KGDB_MAX_NO_CPUS 8
+
+-/*
+- * BUFMAX defines the maximum number of characters in inbound/outbound buffers.
+- * At least NUMREGBYTES*2 are needed for register packets.
+- * Longer buffer is needed to list all threads.
+- */
++/************************************************************************/
++/* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/
++/* at least NUMREGBYTES*2 are needed for register packets */
++/* Longer buffer is needed to list all threads */
+ #define BUFMAX 2048
+
+ /*
+- * Note that this register image is different from
+- * the register image that Linux produces at interrupt time.
+- *
+- * Linux's register image is defined by struct pt_regs in ptrace.h.
++ * Note that this register image is different from
++ * the register image that Linux produces at interrupt time.
++ *
++ * Linux's register image is defined by struct pt_regs in ptrace.h.
+ */
+ enum regnames {
+ /* Core Registers */
+@@ -81,14 +104,14 @@
+ BFIN_RETX,
+ BFIN_RETN,
+ BFIN_RETE,
+-
++
+ /* Pseudo Registers */
+ BFIN_PC,
+ BFIN_CC,
+ BFIN_EXTRA1, /* Address of .text section. */
+ BFIN_EXTRA2, /* Address of .data section. */
+ BFIN_EXTRA3, /* Address of .bss section. */
+- BFIN_FDPIC_EXEC,
++ BFIN_FDPIC_EXEC,
+ BFIN_FDPIC_INTERP,
+
+ /* MMRs */
+@@ -103,7 +126,7 @@
+
+ static inline void arch_kgdb_breakpoint(void)
+ {
+- asm("EXCPT 2;");
++ asm(" EXCPT 2;");
+ }
+ #define BREAK_INSTR_SIZE 2
+ #define CACHE_FLUSH_IS_SAFE 1
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/include/asm/mem_init.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/mem_init.h
+--- linux-2.6.29.owrt/arch/blackfin/include/asm/mem_init.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/mem_init.h 2009-05-10 23:48:28.000000000 +0200
+@@ -115,7 +115,7 @@
+ #define mem_SDRRC (((CONFIG_SCLK_HZ / 1000) * SDRAM_Tref) / SDRAM_NRA) - (SDRAM_tRAS_num + SDRAM_tRP_num)
+
+ /* Enable SCLK Out */
+-#define mem_SDGCTL (SCTLE | SDRAM_CL | SDRAM_tRAS | SDRAM_tRP | SDRAM_tRCD | SDRAM_tWR | PSS)
++#define mem_SDGCTL (0x80000000 | SCTLE | SDRAM_CL | SDRAM_tRAS | SDRAM_tRP | SDRAM_tRCD | SDRAM_tWR | PSS)
+ #else
+ #define mem_SDRRC CONFIG_MEM_SDRRC
+ #define mem_SDGCTL CONFIG_MEM_SDGCTL
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/include/asm/pda.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/pda.h
+--- linux-2.6.29.owrt/arch/blackfin/include/asm/pda.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/pda.h 2009-05-10 23:48:28.000000000 +0200
+@@ -59,7 +59,6 @@
+ unsigned long icplb_fault_addr;
+ unsigned long retx;
+ unsigned long seqstat;
+- unsigned int __nmi_count; /* number of times NMI asserted on this CPU */
+ };
+
+ extern struct blackfin_pda cpu_pda[];
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/include/asm/reboot.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/reboot.h
+--- linux-2.6.29.owrt/arch/blackfin/include/asm/reboot.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/reboot.h 2009-05-10 23:48:28.000000000 +0200
+@@ -15,6 +15,6 @@
+ extern void native_machine_power_off(void);
+
+ /* common reboot workarounds */
+-extern void bfin_reset_boot_spi_cs(unsigned short pin);
++extern void bfin_gpio_reset_spi0_ssel1(void);
+
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/include/asm/thread_info.h linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/thread_info.h
+--- linux-2.6.29.owrt/arch/blackfin/include/asm/thread_info.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/include/asm/thread_info.h 2009-05-10 23:48:28.000000000 +0200
+@@ -122,7 +122,6 @@
+ #define TIF_MEMDIE 4
+ #define TIF_RESTORE_SIGMASK 5 /* restore signal mask in do_signal() */
+ #define TIF_FREEZE 6 /* is freezing for suspend */
+-#define TIF_IRQ_SYNC 7 /* sync pipeline stage */
+
+ /* as above, but as bit values */
+ #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
+@@ -131,7 +130,6 @@
+ #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
+ #define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
+ #define _TIF_FREEZE (1<<TIF_FREEZE)
+-#define _TIF_IRQ_SYNC (1<<TIF_IRQ_SYNC)
+
+ #define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/Kconfig linux-2.6.29-rc3.owrt/arch/blackfin/Kconfig
+--- linux-2.6.29.owrt/arch/blackfin/Kconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -169,51 +169,26 @@
+ help
+ BF542 Processor Support.
+
+-config BF542M
+- bool "BF542m"
+- help
+- BF542 Processor Support.
+-
+ config BF544
+ bool "BF544"
+ help
+ BF544 Processor Support.
+
+-config BF544M
+- bool "BF544m"
+- help
+- BF544 Processor Support.
+-
+ config BF547
+ bool "BF547"
+ help
+ BF547 Processor Support.
+
+-config BF547M
+- bool "BF547m"
+- help
+- BF547 Processor Support.
+-
+ config BF548
+ bool "BF548"
+ help
+ BF548 Processor Support.
+
+-config BF548M
+- bool "BF548m"
+- help
+- BF548 Processor Support.
+-
+ config BF549
+ bool "BF549"
+ help
+ BF549 Processor Support.
+
+-config BF549M
+- bool "BF549m"
+- help
+- BF549 Processor Support.
+-
+ config BF561
+ bool "BF561"
+ help
+@@ -249,39 +224,39 @@
+
+ config BF_REV_MIN
+ int
+- default 0 if (BF51x || BF52x || (BF54x && !BF54xM))
++ default 0 if (BF51x || BF52x || BF54x)
+ default 2 if (BF537 || BF536 || BF534)
+- default 3 if (BF561 || BF533 || BF532 || BF531 || BF54xM)
++ default 3 if (BF561 ||BF533 || BF532 || BF531)
+ default 4 if (BF538 || BF539)
+
+ config BF_REV_MAX
+ int
+- default 2 if (BF51x || BF52x || (BF54x && !BF54xM))
+- default 3 if (BF537 || BF536 || BF534 || BF54xM)
++ default 2 if (BF51x || BF52x || BF54x)
++ default 3 if (BF537 || BF536 || BF534)
+ default 5 if (BF561 || BF538 || BF539)
+ default 6 if (BF533 || BF532 || BF531)
+
+ choice
+ prompt "Silicon Rev"
+- default BF_REV_0_1 if (BF51x || BF52x || (BF54x && !BF54xM))
++ default BF_REV_0_1 if (BF51x || BF52x || BF54x)
+ default BF_REV_0_2 if (BF534 || BF536 || BF537)
+- default BF_REV_0_3 if (BF531 || BF532 || BF533 || BF54xM || BF561)
++ default BF_REV_0_3 if (BF531 || BF532 || BF533 || BF561)
+
+ config BF_REV_0_0
+ bool "0.0"
+- depends on (BF51x || BF52x || (BF54x && !BF54xM))
++ depends on (BF51x || BF52x || BF54x)
+
+ config BF_REV_0_1
+ bool "0.1"
+- depends on (BF52x || (BF54x && !BF54xM))
++ depends on (BF52x || BF54x)
+
+ config BF_REV_0_2
+ bool "0.2"
+- depends on (BF52x || BF537 || BF536 || BF534 || (BF54x && !BF54xM))
++ depends on (BF52x || BF537 || BF536 || BF534 || BF54x)
+
+ config BF_REV_0_3
+ bool "0.3"
+- depends on (BF54xM || BF561 || BF537 || BF536 || BF534 || BF533 || BF532 || BF531)
++ depends on (BF561 || BF537 || BF536 || BF534 || BF533 || BF532 || BF531)
+
+ config BF_REV_0_4
+ bool "0.4"
+@@ -318,14 +293,9 @@
+ depends on (BF531 || BF532 || BF533 || BF534 || BF536 || BF537)
+ default y
+
+-config BF54xM
+- bool
+- depends on (BF542M || BF544M || BF547M || BF548M || BF549M)
+- default y
+-
+ config BF54x
+ bool
+- depends on (BF542 || BF544 || BF547 || BF548 || BF549 || BF54xM)
++ depends on (BF542 || BF544 || BF547 || BF548 || BF549)
+ default y
+
+ config MEM_GENERIC_BOARD
+@@ -1129,7 +1099,6 @@
+
+ config PM_WAKEUP_BY_GPIO
+ bool "Allow Wakeup from Standby by GPIO"
+- depends on PM && !BF54x
+
+ config PM_WAKEUP_GPIO_NUMBER
+ int "GPIO number"
+@@ -1169,12 +1138,6 @@
+ default n
+ help
+ Enable General-Purpose Wake-Up (Voltage Regulator Power-Up)
+- (all processors, except ADSP-BF549). This option sets
+- the general-purpose wake-up enable (GPWE) control bit to enable
+- wake-up upon detection of an active low signal on the /GPW (PH7) pin.
+- On ADSP-BF549 this option enables the the same functionality on the
+- /MRXON pin also PH7.
+-
+ endmenu
+
+ menu "CPU Frequency scaling"
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/Kconfig.debug linux-2.6.29-rc3.owrt/arch/blackfin/Kconfig.debug
+--- linux-2.6.29.owrt/arch/blackfin/Kconfig.debug 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/Kconfig.debug 2009-05-10 23:48:28.000000000 +0200
+@@ -21,6 +21,12 @@
+ config HAVE_ARCH_KGDB
+ def_bool y
+
++config KGDB_TESTCASE
++ tristate "KGDB: for test case in expect"
++ default n
++ help
++ This is a kgdb test case for automated testing.
++
+ config DEBUG_VERBOSE
+ bool "Verbose fault messages"
+ default y
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/kernel/bfin_dma_5xx.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/bfin_dma_5xx.c
+--- linux-2.6.29.owrt/arch/blackfin/kernel/bfin_dma_5xx.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/bfin_dma_5xx.c 2009-05-10 23:48:28.000000000 +0200
+@@ -249,13 +249,6 @@
+
+ spin_lock_irqsave(&mdma_lock, flags);
+
+- /* Force a sync in case a previous config reset on this channel
+- * occurred. This is needed so subsequent writes to DMA registers
+- * are not spuriously lost/corrupted. Do it under irq lock and
+- * without the anomaly version (because we are atomic already).
+- */
+- __builtin_bfin_ssync();
+-
+ if (bfin_read_MDMA_S0_CONFIG())
+ while (!(bfin_read_MDMA_D0_IRQ_STATUS() & DMA_DONE))
+ continue;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/kernel/bfin_gpio.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/bfin_gpio.c
+--- linux-2.6.29.owrt/arch/blackfin/kernel/bfin_gpio.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/bfin_gpio.c 2009-05-10 23:48:28.000000000 +0200
+@@ -27,6 +27,59 @@
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
++/*
++* Number BF537/6/4 BF561 BF533/2/1 BF549/8/4/2
++*
++* GPIO_0 PF0 PF0 PF0 PA0...PJ13
++* GPIO_1 PF1 PF1 PF1
++* GPIO_2 PF2 PF2 PF2
++* GPIO_3 PF3 PF3 PF3
++* GPIO_4 PF4 PF4 PF4
++* GPIO_5 PF5 PF5 PF5
++* GPIO_6 PF6 PF6 PF6
++* GPIO_7 PF7 PF7 PF7
++* GPIO_8 PF8 PF8 PF8
++* GPIO_9 PF9 PF9 PF9
++* GPIO_10 PF10 PF10 PF10
++* GPIO_11 PF11 PF11 PF11
++* GPIO_12 PF12 PF12 PF12
++* GPIO_13 PF13 PF13 PF13
++* GPIO_14 PF14 PF14 PF14
++* GPIO_15 PF15 PF15 PF15
++* GPIO_16 PG0 PF16
++* GPIO_17 PG1 PF17
++* GPIO_18 PG2 PF18
++* GPIO_19 PG3 PF19
++* GPIO_20 PG4 PF20
++* GPIO_21 PG5 PF21
++* GPIO_22 PG6 PF22
++* GPIO_23 PG7 PF23
++* GPIO_24 PG8 PF24
++* GPIO_25 PG9 PF25
++* GPIO_26 PG10 PF26
++* GPIO_27 PG11 PF27
++* GPIO_28 PG12 PF28
++* GPIO_29 PG13 PF29
++* GPIO_30 PG14 PF30
++* GPIO_31 PG15 PF31
++* GPIO_32 PH0 PF32
++* GPIO_33 PH1 PF33
++* GPIO_34 PH2 PF34
++* GPIO_35 PH3 PF35
++* GPIO_36 PH4 PF36
++* GPIO_37 PH5 PF37
++* GPIO_38 PH6 PF38
++* GPIO_39 PH7 PF39
++* GPIO_40 PH8 PF40
++* GPIO_41 PH9 PF41
++* GPIO_42 PH10 PF42
++* GPIO_43 PH11 PF43
++* GPIO_44 PH12 PF44
++* GPIO_45 PH13 PF45
++* GPIO_46 PH14 PF46
++* GPIO_47 PH15 PF47
++*/
++
+ #include <linux/delay.h>
+ #include <linux/module.h>
+ #include <linux/err.h>
+@@ -66,61 +119,62 @@
+ #define AWA_DUMMY_READ(...) do { } while (0)
+ #endif
+
+-static struct gpio_port_t * const gpio_array[] = {
+ #if defined(BF533_FAMILY) || defined(BF538_FAMILY)
++static struct gpio_port_t *gpio_bankb[] = {
+ (struct gpio_port_t *) FIO_FLAG_D,
+-#elif defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY)
++};
++#endif
++
++#if defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY)
++static struct gpio_port_t *gpio_bankb[] = {
+ (struct gpio_port_t *) PORTFIO,
+ (struct gpio_port_t *) PORTGIO,
+ (struct gpio_port_t *) PORTHIO,
+-#elif defined(BF561_FAMILY)
+- (struct gpio_port_t *) FIO0_FLAG_D,
+- (struct gpio_port_t *) FIO1_FLAG_D,
+- (struct gpio_port_t *) FIO2_FLAG_D,
+-#elif defined(BF548_FAMILY)
+- (struct gpio_port_t *)PORTA_FER,
+- (struct gpio_port_t *)PORTB_FER,
+- (struct gpio_port_t *)PORTC_FER,
+- (struct gpio_port_t *)PORTD_FER,
+- (struct gpio_port_t *)PORTE_FER,
+- (struct gpio_port_t *)PORTF_FER,
+- (struct gpio_port_t *)PORTG_FER,
+- (struct gpio_port_t *)PORTH_FER,
+- (struct gpio_port_t *)PORTI_FER,
+- (struct gpio_port_t *)PORTJ_FER,
+-#else
+-# error no gpio arrays defined
+-#endif
+ };
+
+-#if defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY)
+-static unsigned short * const port_fer[] = {
++static unsigned short *port_fer[] = {
+ (unsigned short *) PORTF_FER,
+ (unsigned short *) PORTG_FER,
+ (unsigned short *) PORTH_FER,
+ };
++#endif
+
+-# if !defined(BF537_FAMILY)
+-static unsigned short * const port_mux[] = {
++#if defined(BF527_FAMILY) || defined(BF518_FAMILY)
++static unsigned short *port_mux[] = {
+ (unsigned short *) PORTF_MUX,
+ (unsigned short *) PORTG_MUX,
+ (unsigned short *) PORTH_MUX,
+ };
+
+ static const
+-u8 pmux_offset[][16] = {
+-# if defined(BF527_FAMILY)
+- { 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 4, 6, 8, 8, 10, 10 }, /* PORTF */
+- { 0, 0, 0, 0, 0, 2, 2, 4, 4, 6, 8, 10, 10, 10, 12, 12 }, /* PORTG */
+- { 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 4, 4, 4, 4, 4, 4 }, /* PORTH */
+-# elif defined(BF518_FAMILY)
+- { 0, 2, 2, 2, 2, 2, 2, 4, 6, 6, 6, 8, 8, 8, 8, 10 }, /* PORTF */
+- { 0, 0, 0, 2, 4, 6, 6, 6, 8, 10, 10, 12, 14, 14, 14, 14 }, /* PORTG */
+- { 0, 0, 0, 0, 2, 2, 4, 6, 10, 10, 10, 10, 10, 10, 10, 10 }, /* PORTH */
+-# endif
++u8 pmux_offset[][16] =
++ {{ 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 4, 6, 8, 8, 10, 10 }, /* PORTF */
++ { 0, 0, 0, 0, 0, 2, 2, 4, 4, 6, 8, 10, 10, 10, 12, 12 }, /* PORTG */
++ { 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 4, 4, 4, 4, 4, 4 }, /* PORTH */
++ };
++#endif
++
++#ifdef BF561_FAMILY
++static struct gpio_port_t *gpio_bankb[] = {
++ (struct gpio_port_t *) FIO0_FLAG_D,
++ (struct gpio_port_t *) FIO1_FLAG_D,
++ (struct gpio_port_t *) FIO2_FLAG_D,
+ };
+-# endif
++#endif
+
++#ifdef BF548_FAMILY
++static struct gpio_port_t *gpio_array[] = {
++ (struct gpio_port_t *)PORTA_FER,
++ (struct gpio_port_t *)PORTB_FER,
++ (struct gpio_port_t *)PORTC_FER,
++ (struct gpio_port_t *)PORTD_FER,
++ (struct gpio_port_t *)PORTE_FER,
++ (struct gpio_port_t *)PORTF_FER,
++ (struct gpio_port_t *)PORTG_FER,
++ (struct gpio_port_t *)PORTH_FER,
++ (struct gpio_port_t *)PORTI_FER,
++ (struct gpio_port_t *)PORTJ_FER,
++};
+ #endif
+
+ static unsigned short reserved_gpio_map[GPIO_BANK_NUM];
+@@ -134,9 +188,35 @@
+ } str_ident[MAX_RESOURCES];
+
+ #if defined(CONFIG_PM)
++#if defined(CONFIG_BF54x)
++static struct gpio_port_s gpio_bank_saved[GPIO_BANK_NUM];
++#else
++static unsigned short wakeup_map[GPIO_BANK_NUM];
++static unsigned char wakeup_flags_map[MAX_BLACKFIN_GPIOS];
+ static struct gpio_port_s gpio_bank_saved[GPIO_BANK_NUM];
++
++#ifdef BF533_FAMILY
++static unsigned int sic_iwr_irqs[] = {IRQ_PROG_INTB};
++#endif
++
++#ifdef BF537_FAMILY
++static unsigned int sic_iwr_irqs[] = {IRQ_PROG_INTB, IRQ_PORTG_INTB, IRQ_MAC_TX};
++#endif
++
++#ifdef BF538_FAMILY
++static unsigned int sic_iwr_irqs[] = {IRQ_PORTF_INTB};
+ #endif
+
++#if defined(BF527_FAMILY) || defined(BF518_FAMILY)
++static unsigned int sic_iwr_irqs[] = {IRQ_PORTF_INTB, IRQ_PORTG_INTB, IRQ_PORTH_INTB};
++#endif
++
++#ifdef BF561_FAMILY
++static unsigned int sic_iwr_irqs[] = {IRQ_PROG0_INTB, IRQ_PROG1_INTB, IRQ_PROG2_INTB};
++#endif
++#endif
++#endif /* CONFIG_PM */
++
+ inline int check_gpio(unsigned gpio)
+ {
+ #if defined(BF548_FAMILY)
+@@ -250,10 +330,9 @@
+ {.res = P_SPI0_SSEL3, .offset = 0},
+ };
+
+-static void portmux_setup(unsigned short per)
++static void portmux_setup(unsigned short per, unsigned short function)
+ {
+ u16 y, offset, muxreg;
+- u16 function = P_FUNCT2MUX(per);
+
+ for (y = 0; y < ARRAY_SIZE(port_mux_lut); y++) {
+ if (port_mux_lut[y].res == per) {
+@@ -274,33 +353,30 @@
+ }
+ }
+ #elif defined(BF548_FAMILY)
+-inline void portmux_setup(unsigned short per)
++inline void portmux_setup(unsigned short portno, unsigned short function)
+ {
+ u32 pmux;
+- u16 ident = P_IDENT(per);
+- u16 function = P_FUNCT2MUX(per);
+
+- pmux = gpio_array[gpio_bank(ident)]->port_mux;
++ pmux = gpio_array[gpio_bank(portno)]->port_mux;
+
+- pmux &= ~(0x3 << (2 * gpio_sub_n(ident)));
+- pmux |= (function & 0x3) << (2 * gpio_sub_n(ident));
++ pmux &= ~(0x3 << (2 * gpio_sub_n(portno)));
++ pmux |= (function & 0x3) << (2 * gpio_sub_n(portno));
+
+- gpio_array[gpio_bank(ident)]->port_mux = pmux;
++ gpio_array[gpio_bank(portno)]->port_mux = pmux;
+ }
+
+-inline u16 get_portmux(unsigned short per)
++inline u16 get_portmux(unsigned short portno)
+ {
+ u32 pmux;
+- u16 ident = P_IDENT(per);
+
+- pmux = gpio_array[gpio_bank(ident)]->port_mux;
++ pmux = gpio_array[gpio_bank(portno)]->port_mux;
+
+- return (pmux >> (2 * gpio_sub_n(ident)) & 0x3);
++ return (pmux >> (2 * gpio_sub_n(portno)) & 0x3);
+ }
+ #elif defined(BF527_FAMILY) || defined(BF518_FAMILY)
+-inline void portmux_setup(unsigned short per)
++inline void portmux_setup(unsigned short portno, unsigned short function)
+ {
+- u16 pmux, ident = P_IDENT(per), function = P_FUNCT2MUX(per);
++ u16 pmux, ident = P_IDENT(portno);
+ u8 offset = pmux_offset[gpio_bank(ident)][gpio_sub_n(ident)];
+
+ pmux = *port_mux[gpio_bank(ident)];
+@@ -348,71 +424,90 @@
+ unsigned long flags; \
+ local_irq_save_hw(flags); \
+ if (arg) \
+- gpio_array[gpio_bank(gpio)]->name |= gpio_bit(gpio); \
++ gpio_bankb[gpio_bank(gpio)]->name |= gpio_bit(gpio); \
+ else \
+- gpio_array[gpio_bank(gpio)]->name &= ~gpio_bit(gpio); \
++ gpio_bankb[gpio_bank(gpio)]->name &= ~gpio_bit(gpio); \
+ AWA_DUMMY_READ(name); \
+ local_irq_restore_hw(flags); \
+ } \
+ EXPORT_SYMBOL(set_gpio_ ## name);
+
+-SET_GPIO(dir) /* set_gpio_dir() */
+-SET_GPIO(inen) /* set_gpio_inen() */
+-SET_GPIO(polar) /* set_gpio_polar() */
+-SET_GPIO(edge) /* set_gpio_edge() */
+-SET_GPIO(both) /* set_gpio_both() */
++SET_GPIO(dir)
++SET_GPIO(inen)
++SET_GPIO(polar)
++SET_GPIO(edge)
++SET_GPIO(both)
+
+
++#if ANOMALY_05000311 || ANOMALY_05000323
+ #define SET_GPIO_SC(name) \
+ void set_gpio_ ## name(unsigned gpio, unsigned short arg) \
+ { \
+ unsigned long flags; \
+- if (ANOMALY_05000311 || ANOMALY_05000323) \
+- local_irq_save_hw(flags); \
++ local_irq_save_hw(flags); \
+ if (arg) \
+- gpio_array[gpio_bank(gpio)]->name ## _set = gpio_bit(gpio); \
++ gpio_bankb[gpio_bank(gpio)]->name ## _set = gpio_bit(gpio); \
+ else \
+- gpio_array[gpio_bank(gpio)]->name ## _clear = gpio_bit(gpio); \
+- if (ANOMALY_05000311 || ANOMALY_05000323) { \
+- AWA_DUMMY_READ(name); \
+- local_irq_restore_hw(flags); \
+- } \
++ gpio_bankb[gpio_bank(gpio)]->name ## _clear = gpio_bit(gpio); \
++ AWA_DUMMY_READ(name); \
++ local_irq_restore_hw(flags); \
+ } \
+ EXPORT_SYMBOL(set_gpio_ ## name);
++#else
++#define SET_GPIO_SC(name) \
++void set_gpio_ ## name(unsigned gpio, unsigned short arg) \
++{ \
++ if (arg) \
++ gpio_bankb[gpio_bank(gpio)]->name ## _set = gpio_bit(gpio); \
++ else \
++ gpio_bankb[gpio_bank(gpio)]->name ## _clear = gpio_bit(gpio); \
++} \
++EXPORT_SYMBOL(set_gpio_ ## name);
++#endif
+
+ SET_GPIO_SC(maska)
+ SET_GPIO_SC(maskb)
+ SET_GPIO_SC(data)
+
++#if ANOMALY_05000311 || ANOMALY_05000323
+ void set_gpio_toggle(unsigned gpio)
+ {
+ unsigned long flags;
+- if (ANOMALY_05000311 || ANOMALY_05000323)
+- local_irq_save_hw(flags);
+- gpio_array[gpio_bank(gpio)]->toggle = gpio_bit(gpio);
+- if (ANOMALY_05000311 || ANOMALY_05000323) {
+- AWA_DUMMY_READ(toggle);
+- local_irq_restore_hw(flags);
+- }
++ local_irq_save_hw(flags);
++ gpio_bankb[gpio_bank(gpio)]->toggle = gpio_bit(gpio);
++ AWA_DUMMY_READ(toggle);
++ local_irq_restore_hw(flags);
++}
++#else
++void set_gpio_toggle(unsigned gpio)
++{
++ gpio_bankb[gpio_bank(gpio)]->toggle = gpio_bit(gpio);
+ }
++#endif
+ EXPORT_SYMBOL(set_gpio_toggle);
+
+
+ /*Set current PORT date (16-bit word)*/
+
++#if ANOMALY_05000311 || ANOMALY_05000323
+ #define SET_GPIO_P(name) \
+ void set_gpiop_ ## name(unsigned gpio, unsigned short arg) \
+ { \
+ unsigned long flags; \
+- if (ANOMALY_05000311 || ANOMALY_05000323) \
+- local_irq_save_hw(flags); \
+- gpio_array[gpio_bank(gpio)]->name = arg; \
+- if (ANOMALY_05000311 || ANOMALY_05000323) { \
+- AWA_DUMMY_READ(name); \
+- local_irq_restore_hw(flags); \
+- } \
++ local_irq_save_hw(flags); \
++ gpio_bankb[gpio_bank(gpio)]->name = arg; \
++ AWA_DUMMY_READ(name); \
++ local_irq_restore_hw(flags); \
++} \
++EXPORT_SYMBOL(set_gpiop_ ## name);
++#else
++#define SET_GPIO_P(name) \
++void set_gpiop_ ## name(unsigned gpio, unsigned short arg) \
++{ \
++ gpio_bankb[gpio_bank(gpio)]->name = arg; \
+ } \
+ EXPORT_SYMBOL(set_gpiop_ ## name);
++#endif
+
+ SET_GPIO_P(data)
+ SET_GPIO_P(dir)
+@@ -424,21 +519,27 @@
+ SET_GPIO_P(maskb)
+
+ /* Get a specific bit */
++#if ANOMALY_05000311 || ANOMALY_05000323
+ #define GET_GPIO(name) \
+ unsigned short get_gpio_ ## name(unsigned gpio) \
+ { \
+ unsigned long flags; \
+ unsigned short ret; \
+- if (ANOMALY_05000311 || ANOMALY_05000323) \
+- local_irq_save_hw(flags); \
+- ret = 0x01 & (gpio_array[gpio_bank(gpio)]->name >> gpio_sub_n(gpio)); \
+- if (ANOMALY_05000311 || ANOMALY_05000323) { \
+- AWA_DUMMY_READ(name); \
+- local_irq_restore_hw(flags); \
+- } \
++ local_irq_save_hw(flags); \
++ ret = 0x01 & (gpio_bankb[gpio_bank(gpio)]->name >> gpio_sub_n(gpio)); \
++ AWA_DUMMY_READ(name); \
++ local_irq_restore_hw(flags); \
+ return ret; \
+ } \
+ EXPORT_SYMBOL(get_gpio_ ## name);
++#else
++#define GET_GPIO(name) \
++unsigned short get_gpio_ ## name(unsigned gpio) \
++{ \
++ return (0x01 & (gpio_bankb[gpio_bank(gpio)]->name >> gpio_sub_n(gpio))); \
++} \
++EXPORT_SYMBOL(get_gpio_ ## name);
++#endif
+
+ GET_GPIO(data)
+ GET_GPIO(dir)
+@@ -451,21 +552,27 @@
+
+ /*Get current PORT date (16-bit word)*/
+
++#if ANOMALY_05000311 || ANOMALY_05000323
+ #define GET_GPIO_P(name) \
+ unsigned short get_gpiop_ ## name(unsigned gpio) \
+ { \
+ unsigned long flags; \
+ unsigned short ret; \
+- if (ANOMALY_05000311 || ANOMALY_05000323) \
+- local_irq_save_hw(flags); \
+- ret = (gpio_array[gpio_bank(gpio)]->name); \
+- if (ANOMALY_05000311 || ANOMALY_05000323) { \
+- AWA_DUMMY_READ(name); \
+- local_irq_restore_hw(flags); \
+- } \
++ local_irq_save_hw(flags); \
++ ret = (gpio_bankb[gpio_bank(gpio)]->name); \
++ AWA_DUMMY_READ(name); \
++ local_irq_restore_hw(flags); \
+ return ret; \
+ } \
+ EXPORT_SYMBOL(get_gpiop_ ## name);
++#else
++#define GET_GPIO_P(name) \
++unsigned short get_gpiop_ ## name(unsigned gpio) \
++{ \
++ return (gpio_bankb[gpio_bank(gpio)]->name);\
++} \
++EXPORT_SYMBOL(get_gpiop_ ## name);
++#endif
+
+ GET_GPIO_P(data)
+ GET_GPIO_P(dir)
+@@ -478,26 +585,6 @@
+
+
+ #ifdef CONFIG_PM
+-
+-static unsigned short wakeup_map[GPIO_BANK_NUM];
+-static unsigned char wakeup_flags_map[MAX_BLACKFIN_GPIOS];
+-
+-static const unsigned int sic_iwr_irqs[] = {
+-#if defined(BF533_FAMILY)
+- IRQ_PROG_INTB
+-#elif defined(BF537_FAMILY)
+- IRQ_PROG_INTB, IRQ_PORTG_INTB, IRQ_MAC_TX
+-#elif defined(BF538_FAMILY)
+- IRQ_PORTF_INTB
+-#elif defined(BF527_FAMILY) || defined(BF518_FAMILY)
+- IRQ_PORTF_INTB, IRQ_PORTG_INTB, IRQ_PORTH_INTB
+-#elif defined(BF561_FAMILY)
+- IRQ_PROG0_INTB, IRQ_PROG1_INTB, IRQ_PROG2_INTB
+-#else
+-# error no SIC_IWR defined
+-#endif
+-};
+-
+ /***********************************************************
+ *
+ * FUNCTIONS: Blackfin PM Setup API
+@@ -582,18 +669,18 @@
+ mask = wakeup_map[gpio_bank(i)];
+ bank = gpio_bank(i);
+
+- gpio_bank_saved[bank].maskb = gpio_array[bank]->maskb;
+- gpio_array[bank]->maskb = 0;
++ gpio_bank_saved[bank].maskb = gpio_bankb[bank]->maskb;
++ gpio_bankb[bank]->maskb = 0;
+
+ if (mask) {
+ #if defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY)
+ gpio_bank_saved[bank].fer = *port_fer[bank];
+ #endif
+- gpio_bank_saved[bank].inen = gpio_array[bank]->inen;
+- gpio_bank_saved[bank].polar = gpio_array[bank]->polar;
+- gpio_bank_saved[bank].dir = gpio_array[bank]->dir;
+- gpio_bank_saved[bank].edge = gpio_array[bank]->edge;
+- gpio_bank_saved[bank].both = gpio_array[bank]->both;
++ gpio_bank_saved[bank].inen = gpio_bankb[bank]->inen;
++ gpio_bank_saved[bank].polar = gpio_bankb[bank]->polar;
++ gpio_bank_saved[bank].dir = gpio_bankb[bank]->dir;
++ gpio_bank_saved[bank].edge = gpio_bankb[bank]->edge;
++ gpio_bank_saved[bank].both = gpio_bankb[bank]->both;
+ gpio_bank_saved[bank].reserved =
+ reserved_gpio_map[bank];
+
+@@ -613,7 +700,7 @@
+ }
+
+ bfin_internal_set_wake(sic_iwr_irqs[bank], 1);
+- gpio_array[bank]->maskb_set = wakeup_map[gpio_bank(i)];
++ gpio_bankb[bank]->maskb_set = wakeup_map[gpio_bank(i)];
+ }
+ }
+
+@@ -634,18 +721,18 @@
+ #if defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY)
+ *port_fer[bank] = gpio_bank_saved[bank].fer;
+ #endif
+- gpio_array[bank]->inen = gpio_bank_saved[bank].inen;
+- gpio_array[bank]->dir = gpio_bank_saved[bank].dir;
+- gpio_array[bank]->polar = gpio_bank_saved[bank].polar;
+- gpio_array[bank]->edge = gpio_bank_saved[bank].edge;
+- gpio_array[bank]->both = gpio_bank_saved[bank].both;
++ gpio_bankb[bank]->inen = gpio_bank_saved[bank].inen;
++ gpio_bankb[bank]->dir = gpio_bank_saved[bank].dir;
++ gpio_bankb[bank]->polar = gpio_bank_saved[bank].polar;
++ gpio_bankb[bank]->edge = gpio_bank_saved[bank].edge;
++ gpio_bankb[bank]->both = gpio_bank_saved[bank].both;
+
+ reserved_gpio_map[bank] =
+ gpio_bank_saved[bank].reserved;
+ bfin_internal_set_wake(sic_iwr_irqs[bank], 0);
+ }
+
+- gpio_array[bank]->maskb = gpio_bank_saved[bank].maskb;
++ gpio_bankb[bank]->maskb = gpio_bank_saved[bank].maskb;
+ }
+ AWA_DUMMY_READ(maskb);
+ }
+@@ -658,21 +745,21 @@
+ bank = gpio_bank(i);
+
+ #if defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY)
+- gpio_bank_saved[bank].fer = *port_fer[bank];
++ gpio_bank_saved[bank].fer = *port_fer[bank];
+ #if defined(BF527_FAMILY) || defined(BF518_FAMILY)
+- gpio_bank_saved[bank].mux = *port_mux[bank];
++ gpio_bank_saved[bank].mux = *port_mux[bank];
+ #else
+- if (bank == 0)
+- gpio_bank_saved[bank].mux = bfin_read_PORT_MUX();
++ if (bank == 0)
++ gpio_bank_saved[bank].mux = bfin_read_PORT_MUX();
+ #endif
+ #endif
+- gpio_bank_saved[bank].data = gpio_array[bank]->data;
+- gpio_bank_saved[bank].inen = gpio_array[bank]->inen;
+- gpio_bank_saved[bank].polar = gpio_array[bank]->polar;
+- gpio_bank_saved[bank].dir = gpio_array[bank]->dir;
+- gpio_bank_saved[bank].edge = gpio_array[bank]->edge;
+- gpio_bank_saved[bank].both = gpio_array[bank]->both;
+- gpio_bank_saved[bank].maska = gpio_array[bank]->maska;
++ gpio_bank_saved[bank].data = gpio_bankb[bank]->data;
++ gpio_bank_saved[bank].inen = gpio_bankb[bank]->inen;
++ gpio_bank_saved[bank].polar = gpio_bankb[bank]->polar;
++ gpio_bank_saved[bank].dir = gpio_bankb[bank]->dir;
++ gpio_bank_saved[bank].edge = gpio_bankb[bank]->edge;
++ gpio_bank_saved[bank].both = gpio_bankb[bank]->both;
++ gpio_bank_saved[bank].maska = gpio_bankb[bank]->maska;
+ }
+
+ AWA_DUMMY_READ(maska);
+@@ -683,27 +770,27 @@
+ int i, bank;
+
+ for (i = 0; i < MAX_BLACKFIN_GPIOS; i += GPIO_BANKSIZE) {
+- bank = gpio_bank(i);
++ bank = gpio_bank(i);
+
+ #if defined(BF527_FAMILY) || defined(BF537_FAMILY) || defined(BF518_FAMILY)
+ #if defined(BF527_FAMILY) || defined(BF518_FAMILY)
+- *port_mux[bank] = gpio_bank_saved[bank].mux;
++ *port_mux[bank] = gpio_bank_saved[bank].mux;
+ #else
+- if (bank == 0)
+- bfin_write_PORT_MUX(gpio_bank_saved[bank].mux);
++ if (bank == 0)
++ bfin_write_PORT_MUX(gpio_bank_saved[bank].mux);
+ #endif
+- *port_fer[bank] = gpio_bank_saved[bank].fer;
++ *port_fer[bank] = gpio_bank_saved[bank].fer;
+ #endif
+- gpio_array[bank]->inen = gpio_bank_saved[bank].inen;
+- gpio_array[bank]->dir = gpio_bank_saved[bank].dir;
+- gpio_array[bank]->polar = gpio_bank_saved[bank].polar;
+- gpio_array[bank]->edge = gpio_bank_saved[bank].edge;
+- gpio_array[bank]->both = gpio_bank_saved[bank].both;
++ gpio_bankb[bank]->inen = gpio_bank_saved[bank].inen;
++ gpio_bankb[bank]->dir = gpio_bank_saved[bank].dir;
++ gpio_bankb[bank]->polar = gpio_bank_saved[bank].polar;
++ gpio_bankb[bank]->edge = gpio_bank_saved[bank].edge;
++ gpio_bankb[bank]->both = gpio_bank_saved[bank].both;
+
+- gpio_array[bank]->data_set = gpio_bank_saved[bank].data
+- | gpio_bank_saved[bank].dir;
++ gpio_bankb[bank]->data_set = gpio_bank_saved[bank].data
++ | gpio_bank_saved[bank].dir;
+
+- gpio_array[bank]->maska = gpio_bank_saved[bank].maska;
++ gpio_bankb[bank]->maska = gpio_bank_saved[bank].maska;
+ }
+ AWA_DUMMY_READ(maska);
+ }
+@@ -730,12 +817,12 @@
+ for (i = 0; i < MAX_BLACKFIN_GPIOS; i += GPIO_BANKSIZE) {
+ bank = gpio_bank(i);
+
+- gpio_bank_saved[bank].fer = gpio_array[bank]->port_fer;
+- gpio_bank_saved[bank].mux = gpio_array[bank]->port_mux;
+- gpio_bank_saved[bank].data = gpio_array[bank]->data;
+- gpio_bank_saved[bank].data = gpio_array[bank]->data;
+- gpio_bank_saved[bank].inen = gpio_array[bank]->inen;
+- gpio_bank_saved[bank].dir = gpio_array[bank]->dir_set;
++ gpio_bank_saved[bank].fer = gpio_array[bank]->port_fer;
++ gpio_bank_saved[bank].mux = gpio_array[bank]->port_mux;
++ gpio_bank_saved[bank].data = gpio_array[bank]->port_data;
++ gpio_bank_saved[bank].data = gpio_array[bank]->port_data;
++ gpio_bank_saved[bank].inen = gpio_array[bank]->port_inen;
++ gpio_bank_saved[bank].dir = gpio_array[bank]->port_dir_set;
+ }
+ }
+
+@@ -744,21 +831,21 @@
+ int i, bank;
+
+ for (i = 0; i < MAX_BLACKFIN_GPIOS; i += GPIO_BANKSIZE) {
+- bank = gpio_bank(i);
++ bank = gpio_bank(i);
+
+- gpio_array[bank]->port_mux = gpio_bank_saved[bank].mux;
+- gpio_array[bank]->port_fer = gpio_bank_saved[bank].fer;
+- gpio_array[bank]->inen = gpio_bank_saved[bank].inen;
+- gpio_array[bank]->dir_set = gpio_bank_saved[bank].dir;
+- gpio_array[bank]->data_set = gpio_bank_saved[bank].data
+- | gpio_bank_saved[bank].dir;
++ gpio_array[bank]->port_mux = gpio_bank_saved[bank].mux;
++ gpio_array[bank]->port_fer = gpio_bank_saved[bank].fer;
++ gpio_array[bank]->port_inen = gpio_bank_saved[bank].inen;
++ gpio_array[bank]->port_dir_set = gpio_bank_saved[bank].dir;
++ gpio_array[bank]->port_set = gpio_bank_saved[bank].data
++ | gpio_bank_saved[bank].dir;
+ }
+ }
+ #endif
+
+ unsigned short get_gpio_dir(unsigned gpio)
+ {
+- return (0x01 & (gpio_array[gpio_bank(gpio)]->dir_clear >> gpio_sub_n(gpio)));
++ return (0x01 & (gpio_array[gpio_bank(gpio)]->port_dir_clear >> gpio_sub_n(gpio)));
+ }
+ EXPORT_SYMBOL(get_gpio_dir);
+
+@@ -818,7 +905,9 @@
+ */
+
+ #ifdef BF548_FAMILY
+- if (!((per & P_MAYSHARE) && get_portmux(per) == P_FUNCT2MUX(per))) {
++ u16 funct = get_portmux(ident);
++
++ if (!((per & P_MAYSHARE) && (funct == P_FUNCT2MUX(per)))) {
+ #else
+ if (!(per & P_MAYSHARE)) {
+ #endif
+@@ -842,7 +931,11 @@
+ anyway:
+ reserved_peri_map[gpio_bank(ident)] |= gpio_bit(ident);
+
+- portmux_setup(per);
++#ifdef BF548_FAMILY
++ portmux_setup(ident, P_FUNCT2MUX(per));
++#else
++ portmux_setup(per, P_FUNCT2MUX(per));
++#endif
+ port_setup(ident, PERIPHERAL_USAGE);
+
+ local_irq_restore_hw(flags);
+@@ -884,6 +977,9 @@
+ if (!(per & P_DEFINED))
+ return;
+
++ if (check_gpio(ident) < 0)
++ return;
++
+ local_irq_save_hw(flags);
+
+ if (unlikely(!(reserved_peri_map[gpio_bank(ident)] & gpio_bit(ident)))) {
+@@ -960,15 +1056,9 @@
+ local_irq_restore_hw(flags);
+ return -EBUSY;
+ }
+- if (unlikely(reserved_gpio_irq_map[gpio_bank(gpio)] & gpio_bit(gpio))) {
++ if (unlikely(reserved_gpio_irq_map[gpio_bank(gpio)] & gpio_bit(gpio)))
+ printk(KERN_NOTICE "bfin-gpio: GPIO %d is already reserved as gpio-irq!"
+ " (Documentation/blackfin/bfin-gpio-notes.txt)\n", gpio);
+- }
+-#ifndef BF548_FAMILY
+- else { /* Reset POLAR setting when acquiring a gpio for the first time */
+- set_gpio_polar(gpio, 0);
+- }
+-#endif
+
+ reserved_gpio_map[gpio_bank(gpio)] |= gpio_bit(gpio);
+ set_label(gpio, label);
+@@ -988,8 +1078,6 @@
+ if (check_gpio(gpio) < 0)
+ return;
+
+- might_sleep();
+-
+ local_irq_save_hw(flags);
+
+ if (unlikely(!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio)))) {
+@@ -1070,16 +1158,8 @@
+ local_irq_restore_hw(flags);
+ }
+
+-static inline void __bfin_gpio_direction_input(unsigned gpio)
+-{
+-#ifdef BF548_FAMILY
+- gpio_array[gpio_bank(gpio)]->dir_clear = gpio_bit(gpio);
+-#else
+- gpio_array[gpio_bank(gpio)]->dir &= ~gpio_bit(gpio);
+-#endif
+- gpio_array[gpio_bank(gpio)]->inen |= gpio_bit(gpio);
+-}
+
++#ifdef BF548_FAMILY
+ int bfin_gpio_direction_input(unsigned gpio)
+ {
+ unsigned long flags;
+@@ -1090,85 +1170,125 @@
+ }
+
+ local_irq_save_hw(flags);
+- __bfin_gpio_direction_input(gpio);
+- AWA_DUMMY_READ(inen);
++ gpio_array[gpio_bank(gpio)]->port_dir_clear = gpio_bit(gpio);
++ gpio_array[gpio_bank(gpio)]->port_inen |= gpio_bit(gpio);
+ local_irq_restore_hw(flags);
+
+ return 0;
+ }
+ EXPORT_SYMBOL(bfin_gpio_direction_input);
+
+-void bfin_gpio_irq_prepare(unsigned gpio)
++int bfin_gpio_direction_output(unsigned gpio, int value)
+ {
+-#ifdef BF548_FAMILY
+ unsigned long flags;
+-#endif
+
+- port_setup(gpio, GPIO_USAGE);
++ if (!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio))) {
++ gpio_error(gpio);
++ return -EINVAL;
++ }
+
+-#ifdef BF548_FAMILY
+ local_irq_save_hw(flags);
+- __bfin_gpio_direction_input(gpio);
++ gpio_array[gpio_bank(gpio)]->port_inen &= ~gpio_bit(gpio);
++ gpio_set_value(gpio, value);
++ gpio_array[gpio_bank(gpio)]->port_dir_set = gpio_bit(gpio);
+ local_irq_restore_hw(flags);
+-#endif
++
++ return 0;
+ }
++EXPORT_SYMBOL(bfin_gpio_direction_output);
+
+ void bfin_gpio_set_value(unsigned gpio, int arg)
+ {
+ if (arg)
+- gpio_array[gpio_bank(gpio)]->data_set = gpio_bit(gpio);
++ gpio_array[gpio_bank(gpio)]->port_set = gpio_bit(gpio);
+ else
+- gpio_array[gpio_bank(gpio)]->data_clear = gpio_bit(gpio);
++ gpio_array[gpio_bank(gpio)]->port_clear = gpio_bit(gpio);
+ }
+ EXPORT_SYMBOL(bfin_gpio_set_value);
+
+-int bfin_gpio_direction_output(unsigned gpio, int value)
++int bfin_gpio_get_value(unsigned gpio)
++{
++ return (1 & (gpio_array[gpio_bank(gpio)]->port_data >> gpio_sub_n(gpio)));
++}
++EXPORT_SYMBOL(bfin_gpio_get_value);
++
++void bfin_gpio_irq_prepare(unsigned gpio)
+ {
+ unsigned long flags;
+
+- if (!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio))) {
+- gpio_error(gpio);
+- return -EINVAL;
+- }
++ port_setup(gpio, GPIO_USAGE);
+
+ local_irq_save_hw(flags);
+-
+- gpio_array[gpio_bank(gpio)]->inen &= ~gpio_bit(gpio);
+- gpio_set_value(gpio, value);
+-#ifdef BF548_FAMILY
+- gpio_array[gpio_bank(gpio)]->dir_set = gpio_bit(gpio);
+-#else
+- gpio_array[gpio_bank(gpio)]->dir |= gpio_bit(gpio);
+-#endif
+-
+- AWA_DUMMY_READ(dir);
++ gpio_array[gpio_bank(gpio)]->port_dir_clear = gpio_bit(gpio);
++ gpio_array[gpio_bank(gpio)]->port_inen |= gpio_bit(gpio);
+ local_irq_restore_hw(flags);
+-
+- return 0;
+ }
+-EXPORT_SYMBOL(bfin_gpio_direction_output);
++
++#else
+
+ int bfin_gpio_get_value(unsigned gpio)
+ {
+-#ifdef BF548_FAMILY
+- return (1 & (gpio_array[gpio_bank(gpio)]->data >> gpio_sub_n(gpio)));
+-#else
+ unsigned long flags;
++ int ret;
+
+ if (unlikely(get_gpio_edge(gpio))) {
+- int ret;
+ local_irq_save_hw(flags);
+ set_gpio_edge(gpio, 0);
+ ret = get_gpio_data(gpio);
+ set_gpio_edge(gpio, 1);
+ local_irq_restore_hw(flags);
++
+ return ret;
+ } else
+ return get_gpio_data(gpio);
+-#endif
+ }
+ EXPORT_SYMBOL(bfin_gpio_get_value);
+
++
++int bfin_gpio_direction_input(unsigned gpio)
++{
++ unsigned long flags;
++
++ if (!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio))) {
++ gpio_error(gpio);
++ return -EINVAL;
++ }
++
++ local_irq_save_hw(flags);
++ gpio_bankb[gpio_bank(gpio)]->dir &= ~gpio_bit(gpio);
++ gpio_bankb[gpio_bank(gpio)]->inen |= gpio_bit(gpio);
++ AWA_DUMMY_READ(inen);
++ local_irq_restore_hw(flags);
++
++ return 0;
++}
++EXPORT_SYMBOL(bfin_gpio_direction_input);
++
++int bfin_gpio_direction_output(unsigned gpio, int value)
++{
++ unsigned long flags;
++
++ if (!(reserved_gpio_map[gpio_bank(gpio)] & gpio_bit(gpio))) {
++ gpio_error(gpio);
++ return -EINVAL;
++ }
++
++ local_irq_save_hw(flags);
++ gpio_bankb[gpio_bank(gpio)]->inen &= ~gpio_bit(gpio);
++
++ if (value)
++ gpio_bankb[gpio_bank(gpio)]->data_set = gpio_bit(gpio);
++ else
++ gpio_bankb[gpio_bank(gpio)]->data_clear = gpio_bit(gpio);
++
++ gpio_bankb[gpio_bank(gpio)]->dir |= gpio_bit(gpio);
++ AWA_DUMMY_READ(dir);
++ local_irq_restore_hw(flags);
++
++ return 0;
++}
++EXPORT_SYMBOL(bfin_gpio_direction_output);
++
+ /* If we are booting from SPI and our board lacks a strong enough pull up,
+ * the core can reset and execute the bootrom faster than the resistor can
+ * pull the signal logically high. To work around this (common) error in
+@@ -1179,15 +1299,23 @@
+ * lives here as we need to force all the GPIO states w/out going through
+ * BUG() checks and such.
+ */
+-void bfin_reset_boot_spi_cs(unsigned short pin)
++void bfin_gpio_reset_spi0_ssel1(void)
+ {
+- unsigned short gpio = P_IDENT(pin);
++ u16 gpio = P_IDENT(P_SPI0_SSEL1);
++
+ port_setup(gpio, GPIO_USAGE);
+- gpio_array[gpio_bank(gpio)]->data_set = gpio_bit(gpio);
++ gpio_bankb[gpio_bank(gpio)]->data_set = gpio_bit(gpio);
+ AWA_DUMMY_READ(data_set);
+ udelay(1);
+ }
+
++void bfin_gpio_irq_prepare(unsigned gpio)
++{
++ port_setup(gpio, GPIO_USAGE);
++}
++
++#endif /*BF548_FAMILY */
++
+ #if defined(CONFIG_PROC_FS)
+ static int gpio_proc_read(char *buf, char **start, off_t offset,
+ int len, int *unused_i, void *unused_v)
+@@ -1241,7 +1369,11 @@
+
+ void bfin_gpiolib_set_value(struct gpio_chip *chip, unsigned gpio, int value)
+ {
++#ifdef BF548_FAMILY
+ return bfin_gpio_set_value(gpio, value);
++#else
++ return set_gpio_data(gpio, value);
++#endif
+ }
+
+ int bfin_gpiolib_gpio_request(struct gpio_chip *chip, unsigned gpio)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/kernel/cplb-mpu/cplbinit.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/cplb-mpu/cplbinit.c
+--- linux-2.6.29.owrt/arch/blackfin/kernel/cplb-mpu/cplbinit.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/cplb-mpu/cplbinit.c 2009-05-10 23:48:28.000000000 +0200
+@@ -63,8 +63,10 @@
+ dcplb_tbl[cpu][i_d].addr = 0;
+ dcplb_tbl[cpu][i_d++].data = SDRAM_OOPS | PAGE_SIZE_1KB;
+
++#if 0
+ icplb_tbl[cpu][i_i].addr = 0;
+- icplb_tbl[cpu][i_i++].data = i_cache | CPLB_USER_RD | PAGE_SIZE_1KB;
++ icplb_tbl[cpu][i_i++].data = i_cache | CPLB_USER_RD | PAGE_SIZE_4KB;
++#endif
+
+ /* Cover kernel memory with 4M pages. */
+ addr = 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/kernel/cplb-nompu/cplbinit.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/cplb-nompu/cplbinit.c
+--- linux-2.6.29.owrt/arch/blackfin/kernel/cplb-nompu/cplbinit.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/cplb-nompu/cplbinit.c 2009-05-10 23:48:28.000000000 +0200
+@@ -53,13 +53,9 @@
+
+ i_d = i_i = 0;
+
+-#ifdef CONFIG_DEBUG_HUNT_FOR_ZERO
+ /* Set up the zero page. */
+ d_tbl[i_d].addr = 0;
+ d_tbl[i_d++].data = SDRAM_OOPS | PAGE_SIZE_1KB;
+- i_tbl[i_i].addr = 0;
+- i_tbl[i_i++].data = SDRAM_OOPS | PAGE_SIZE_1KB;
+-#endif
+
+ /* Cover kernel memory with 4M pages. */
+ addr = 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/kernel/cplb-nompu/cplbmgr.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/cplb-nompu/cplbmgr.c
+--- linux-2.6.29.owrt/arch/blackfin/kernel/cplb-nompu/cplbmgr.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/cplb-nompu/cplbmgr.c 2009-05-10 23:48:28.000000000 +0200
+@@ -163,14 +163,12 @@
+ nr_icplb_supv_miss[cpu]++;
+
+ base = 0;
+- idx = 0;
+- do {
++ for (idx = 0; idx < icplb_nr_bounds; idx++) {
+ eaddr = icplb_bounds[idx].eaddr;
+ if (addr < eaddr)
+ break;
+ base = eaddr;
+- } while (++idx < icplb_nr_bounds);
+-
++ }
+ if (unlikely(idx == icplb_nr_bounds))
+ return CPLB_NO_ADDR_MATCH;
+
+@@ -210,14 +208,12 @@
+ nr_dcplb_supv_miss[cpu]++;
+
+ base = 0;
+- idx = 0;
+- do {
++ for (idx = 0; idx < dcplb_nr_bounds; idx++) {
+ eaddr = dcplb_bounds[idx].eaddr;
+ if (addr < eaddr)
+ break;
+ base = eaddr;
+- } while (++idx < dcplb_nr_bounds);
+-
++ }
+ if (unlikely(idx == dcplb_nr_bounds))
+ return CPLB_NO_ADDR_MATCH;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/kernel/ipipe.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/ipipe.c
+--- linux-2.6.29.owrt/arch/blackfin/kernel/ipipe.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/ipipe.c 2009-05-10 23:48:28.000000000 +0200
+@@ -35,8 +35,14 @@
+ #include <asm/atomic.h>
+ #include <asm/io.h>
+
++static int create_irq_threads;
++
+ DEFINE_PER_CPU(struct pt_regs, __ipipe_tick_regs);
+
++static DEFINE_PER_CPU(unsigned long, pending_irqthread_mask);
++
++static DEFINE_PER_CPU(int [IVG13 + 1], pending_irq_count);
++
+ asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs);
+
+ static void __ipipe_no_irqtail(void);
+@@ -87,7 +93,6 @@
+ */
+ void __ipipe_handle_irq(unsigned irq, struct pt_regs *regs)
+ {
+- struct ipipe_percpu_domain_data *p = ipipe_root_cpudom_ptr();
+ struct ipipe_domain *this_domain, *next_domain;
+ struct list_head *head, *pos;
+ int m_ack, s = -1;
+@@ -99,6 +104,7 @@
+ * interrupt.
+ */
+ m_ack = (regs == NULL || irq == IRQ_SYSTMR || irq == IRQ_CORETMR);
++
+ this_domain = ipipe_current_domain;
+
+ if (unlikely(test_bit(IPIPE_STICKY_FLAG, &this_domain->irqs[irq].control)))
+@@ -108,28 +114,49 @@
+ next_domain = list_entry(head, struct ipipe_domain, p_link);
+ if (likely(test_bit(IPIPE_WIRED_FLAG, &next_domain->irqs[irq].control))) {
+ if (!m_ack && next_domain->irqs[irq].acknowledge != NULL)
+- next_domain->irqs[irq].acknowledge(irq, irq_to_desc(irq));
+- if (test_bit(IPIPE_SYNCDEFER_FLAG, &p->status))
+- s = __test_and_set_bit(IPIPE_STALL_FLAG, &p->status);
++ next_domain->irqs[irq].acknowledge(irq, irq_desc + irq);
++ if (test_bit(IPIPE_ROOTLOCK_FLAG, &ipipe_root_domain->flags))
++ s = __test_and_set_bit(IPIPE_STALL_FLAG,
++ &ipipe_root_cpudom_var(status));
+ __ipipe_dispatch_wired(next_domain, irq);
+- goto out;
++ goto finalize;
++ return;
+ }
+ }
+
+ /* Ack the interrupt. */
+
+ pos = head;
++
+ while (pos != &__ipipe_pipeline) {
+ next_domain = list_entry(pos, struct ipipe_domain, p_link);
++ /*
++ * For each domain handling the incoming IRQ, mark it
++ * as pending in its log.
++ */
+ if (test_bit(IPIPE_HANDLE_FLAG, &next_domain->irqs[irq].control)) {
++ /*
++ * Domains that handle this IRQ are polled for
++ * acknowledging it by decreasing priority
++ * order. The interrupt must be made pending
++ * _first_ in the domain's status flags before
++ * the PIC is unlocked.
++ */
+ __ipipe_set_irq_pending(next_domain, irq);
++
+ if (!m_ack && next_domain->irqs[irq].acknowledge != NULL) {
+- next_domain->irqs[irq].acknowledge(irq, irq_to_desc(irq));
++ next_domain->irqs[irq].acknowledge(irq, irq_desc + irq);
+ m_ack = 1;
+ }
+ }
++
++ /*
++ * If the domain does not want the IRQ to be passed
++ * down the interrupt pipe, exit the loop now.
++ */
+ if (!test_bit(IPIPE_PASS_FLAG, &next_domain->irqs[irq].control))
+ break;
++
+ pos = next_domain->p_link.next;
+ }
+
+@@ -139,24 +166,18 @@
+ * immediately to the current domain if the interrupt has been
+ * marked as 'sticky'. This search does not go beyond the
+ * current domain in the pipeline. We also enforce the
+- * additional root stage lock (blackfin-specific).
+- */
+- if (test_bit(IPIPE_SYNCDEFER_FLAG, &p->status))
+- s = __test_and_set_bit(IPIPE_STALL_FLAG, &p->status);
++ * additional root stage lock (blackfin-specific). */
+
+- /*
+- * If the interrupt preempted the head domain, then do not
+- * even try to walk the pipeline, unless an interrupt is
+- * pending for it.
+- */
+- if (test_bit(IPIPE_AHEAD_FLAG, &this_domain->flags) &&
+- ipipe_head_cpudom_var(irqpend_himask) == 0)
+- goto out;
++ if (test_bit(IPIPE_ROOTLOCK_FLAG, &ipipe_root_domain->flags))
++ s = __test_and_set_bit(IPIPE_STALL_FLAG,
++ &ipipe_root_cpudom_var(status));
++finalize:
+
+ __ipipe_walk_pipeline(head);
+-out:
++
+ if (!s)
+- __clear_bit(IPIPE_STALL_FLAG, &p->status);
++ __clear_bit(IPIPE_STALL_FLAG,
++ &ipipe_root_cpudom_var(status));
+ }
+
+ int __ipipe_check_root(void)
+@@ -166,7 +187,7 @@
+
+ void __ipipe_enable_irqdesc(struct ipipe_domain *ipd, unsigned irq)
+ {
+- struct irq_desc *desc = irq_to_desc(irq);
++ struct irq_desc *desc = irq_desc + irq;
+ int prio = desc->ic_prio;
+
+ desc->depth = 0;
+@@ -178,7 +199,7 @@
+
+ void __ipipe_disable_irqdesc(struct ipipe_domain *ipd, unsigned irq)
+ {
+- struct irq_desc *desc = irq_to_desc(irq);
++ struct irq_desc *desc = irq_desc + irq;
+ int prio = desc->ic_prio;
+
+ if (ipd != &ipipe_root &&
+@@ -215,18 +236,15 @@
+ {
+ unsigned long flags;
+
+- /*
+- * We need to run the IRQ tail hook whenever we don't
++ /* We need to run the IRQ tail hook whenever we don't
+ * propagate a syscall to higher domains, because we know that
+ * important operations might be pending there (e.g. Xenomai
+- * deferred rescheduling).
+- */
++ * deferred rescheduling). */
+
+- if (regs->orig_p0 < NR_syscalls) {
++ if (!__ipipe_syscall_watched_p(current, regs->orig_p0)) {
+ void (*hook)(void) = (void (*)(void))__ipipe_irq_tail_hook;
+ hook();
+- if ((current->flags & PF_EVNOTIFY) == 0)
+- return 0;
++ return 0;
+ }
+
+ /*
+@@ -294,46 +312,112 @@
+ {
+ unsigned long flags;
+
+-#ifdef CONFIG_IPIPE_DEBUG
+ if (irq >= IPIPE_NR_IRQS ||
+ (ipipe_virtual_irq_p(irq)
+ && !test_bit(irq - IPIPE_VIRQ_BASE, &__ipipe_virtual_irq_map)))
+ return -EINVAL;
+-#endif
+
+ local_irq_save_hw(flags);
++
+ __ipipe_handle_irq(irq, NULL);
++
+ local_irq_restore_hw(flags);
+
+ return 1;
+ }
+
+-asmlinkage void __ipipe_sync_root(void)
++/* Move Linux IRQ to threads. */
++
++static int do_irqd(void *__desc)
+ {
+- unsigned long flags;
++ struct irq_desc *desc = __desc;
++ unsigned irq = desc - irq_desc;
++ int thrprio = desc->thr_prio;
++ int thrmask = 1 << thrprio;
++ int cpu = smp_processor_id();
++ cpumask_t cpumask;
++
++ sigfillset(&current->blocked);
++ current->flags |= PF_NOFREEZE;
++ cpumask = cpumask_of_cpu(cpu);
++ set_cpus_allowed(current, cpumask);
++ ipipe_setscheduler_root(current, SCHED_FIFO, 50 + thrprio);
++
++ while (!kthread_should_stop()) {
++ local_irq_disable();
++ if (!(desc->status & IRQ_SCHEDULED)) {
++ set_current_state(TASK_INTERRUPTIBLE);
++resched:
++ local_irq_enable();
++ schedule();
++ local_irq_disable();
++ }
++ __set_current_state(TASK_RUNNING);
++ /*
++ * If higher priority interrupt servers are ready to
++ * run, reschedule immediately. We need this for the
++ * GPIO demux IRQ handler to unmask the interrupt line
++ * _last_, after all GPIO IRQs have run.
++ */
++ if (per_cpu(pending_irqthread_mask, cpu) & ~(thrmask|(thrmask-1)))
++ goto resched;
++ if (--per_cpu(pending_irq_count[thrprio], cpu) == 0)
++ per_cpu(pending_irqthread_mask, cpu) &= ~thrmask;
++ desc->status &= ~IRQ_SCHEDULED;
++ desc->thr_handler(irq, &__raw_get_cpu_var(__ipipe_tick_regs));
++ local_irq_enable();
++ }
++ __set_current_state(TASK_RUNNING);
++ return 0;
++}
+
+- BUG_ON(irqs_disabled());
++static void kick_irqd(unsigned irq, void *cookie)
++{
++ struct irq_desc *desc = irq_desc + irq;
++ int thrprio = desc->thr_prio;
++ int thrmask = 1 << thrprio;
++ int cpu = smp_processor_id();
++
++ if (!(desc->status & IRQ_SCHEDULED)) {
++ desc->status |= IRQ_SCHEDULED;
++ per_cpu(pending_irqthread_mask, cpu) |= thrmask;
++ ++per_cpu(pending_irq_count[thrprio], cpu);
++ wake_up_process(desc->thread);
++ }
++}
+
+- local_irq_save_hw(flags);
++int ipipe_start_irq_thread(unsigned irq, struct irq_desc *desc)
++{
++ if (desc->thread || !create_irq_threads)
++ return 0;
+
+- clear_thread_flag(TIF_IRQ_SYNC);
++ desc->thread = kthread_create(do_irqd, desc, "IRQ %d", irq);
++ if (desc->thread == NULL) {
++ printk(KERN_ERR "irqd: could not create IRQ thread %d!\n", irq);
++ return -ENOMEM;
++ }
+
+- if (ipipe_root_cpudom_var(irqpend_himask) != 0)
+- __ipipe_sync_pipeline(IPIPE_IRQMASK_ANY);
++ wake_up_process(desc->thread);
+
+- local_irq_restore_hw(flags);
++ desc->thr_handler = ipipe_root_domain->irqs[irq].handler;
++ ipipe_root_domain->irqs[irq].handler = &kick_irqd;
++
++ return 0;
+ }
+
+-void ___ipipe_sync_pipeline(unsigned long syncmask)
++void __init ipipe_init_irq_threads(void)
+ {
+- struct ipipe_domain *ipd = ipipe_current_domain;
++ unsigned irq;
++ struct irq_desc *desc;
+
+- if (ipd == ipipe_root_domain) {
+- if (test_bit(IPIPE_SYNCDEFER_FLAG, &ipipe_root_cpudom_var(status)))
+- return;
+- }
++ create_irq_threads = 1;
+
+- __ipipe_sync_stage(syncmask);
++ for (irq = 0; irq < NR_IRQS; irq++) {
++ desc = irq_desc + irq;
++ if (desc->action != NULL ||
++ (desc->status & IRQ_NOREQUEST) != 0)
++ ipipe_start_irq_thread(irq, desc);
++ }
+ }
+
+ EXPORT_SYMBOL(show_stack);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/kernel/irqchip.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/irqchip.c
+--- linux-2.6.29.owrt/arch/blackfin/kernel/irqchip.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/irqchip.c 2009-05-10 23:48:28.000000000 +0200
+@@ -35,7 +35,6 @@
+ #include <linux/interrupt.h>
+ #include <linux/irq.h>
+ #include <asm/trace.h>
+-#include <asm/pda.h>
+
+ static atomic_t irq_err_count;
+ static spinlock_t irq_controller_lock;
+@@ -92,13 +91,8 @@
+ seq_putc(p, '\n');
+ skip:
+ spin_unlock_irqrestore(&irq_desc[i].lock, flags);
+- } else if (i == NR_IRQS) {
+- seq_printf(p, "NMI: ");
+- for_each_online_cpu(j)
+- seq_printf(p, "%10u ", cpu_pda[j].__nmi_count);
+- seq_printf(p, " CORE Non Maskable Interrupt\n");
++ } else if (i == NR_IRQS)
+ seq_printf(p, "Err: %10u\n", atomic_read(&irq_err_count));
+- }
+ return 0;
+ }
+
+@@ -144,15 +138,11 @@
+ #endif
+ generic_handle_irq(irq);
+
+-#ifndef CONFIG_IPIPE
+- /*
+- * If we're the only interrupt running (ignoring IRQ15 which
+- * is for syscalls), lower our priority to IRQ14 so that
+- * softirqs run at that level. If there's another,
+- * lower-level interrupt, irq_exit will defer softirqs to
+- * that. If the interrupt pipeline is enabled, we are already
+- * running at IRQ14 priority, so we don't need this code.
+- */
++#ifndef CONFIG_IPIPE /* Useless and bugous over the I-pipe: IRQs are threaded. */
++ /* If we're the only interrupt running (ignoring IRQ15 which is for
++ syscalls), lower our priority to IRQ14 so that softirqs run at
++ that level. If there's another, lower-level interrupt, irq_exit
++ will defer softirqs to that. */
+ CSYNC();
+ pending = bfin_read_IPEND() & ~0x8000;
+ other_ints = pending & (pending - 1);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/kernel/kgdb_test.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/kgdb_test.c
+--- linux-2.6.29.owrt/arch/blackfin/kernel/kgdb_test.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/kgdb_test.c 2009-05-10 23:48:28.000000000 +0200
+@@ -20,7 +20,6 @@
+ static char cmdline[256];
+ static unsigned long len;
+
+-#ifndef CONFIG_SMP
+ static int num1 __attribute__((l1_data));
+
+ void kgdb_l1_test(void) __attribute__((l1_text));
+@@ -33,8 +32,6 @@
+ printk(KERN_ALERT "L1(after change) : data variable addr = 0x%p, data value is %d\n", &num1, num1);
+ return ;
+ }
+-#endif
+-
+ #if L2_LENGTH
+
+ static int num2 __attribute__((l2));
+@@ -62,12 +59,10 @@
+ static int test_proc_output(char *buf)
+ {
+ kgdb_test("hello world!", 12, 0x55, 0x10);
+-#ifndef CONFIG_SMP
+ kgdb_l1_test();
+-#endif
+-#if L2_LENGTH
++ #if L2_LENGTH
+ kgdb_l2_test();
+-#endif
++ #endif
+
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/kernel/Makefile linux-2.6.29-rc3.owrt/arch/blackfin/kernel/Makefile
+--- linux-2.6.29.owrt/arch/blackfin/kernel/Makefile 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/Makefile 2009-05-10 23:48:28.000000000 +0200
+@@ -21,9 +21,5 @@
+ obj-$(CONFIG_CPLB_INFO) += cplbinfo.o
+ obj-$(CONFIG_MODULES) += module.o
+ obj-$(CONFIG_KGDB) += kgdb.o
+-obj-$(CONFIG_KGDB_TESTS) += kgdb_test.o
++obj-$(CONFIG_KGDB_TESTCASE) += kgdb_test.o
+ obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
+-
+-# the kgdb test puts code into L2 and without linker
+-# relaxation, we need to force long calls to/from it
+-CFLAGS_kgdb_test.o := -mlong-calls -O0
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/kernel/ptrace.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/ptrace.c
+--- linux-2.6.29.owrt/arch/blackfin/kernel/ptrace.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/ptrace.c 2009-05-10 23:48:28.000000000 +0200
+@@ -45,7 +45,6 @@
+ #include <asm/asm-offsets.h>
+ #include <asm/dma.h>
+ #include <asm/fixed_code.h>
+-#include <asm/cacheflush.h>
+ #include <asm/mem_map.h>
+
+ #define TEXT_OFFSET 0
+@@ -241,7 +240,7 @@
+
+ } else if (addr >= FIXED_CODE_START
+ && addr + sizeof(tmp) <= FIXED_CODE_END) {
+- copy_from_user_page(0, 0, 0, &tmp, (const void *)(addr), sizeof(tmp));
++ memcpy(&tmp, (const void *)(addr), sizeof(tmp));
+ copied = sizeof(tmp);
+
+ } else
+@@ -321,7 +320,7 @@
+
+ } else if (addr >= FIXED_CODE_START
+ && addr + sizeof(data) <= FIXED_CODE_END) {
+- copy_to_user_page(0, 0, 0, (void *)(addr), &data, sizeof(data));
++ memcpy((void *)(addr), &data, sizeof(data));
+ copied = sizeof(data);
+
+ } else
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/kernel/reboot.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/reboot.c
+--- linux-2.6.29.owrt/arch/blackfin/kernel/reboot.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/reboot.c 2009-05-10 23:48:28.000000000 +0200
+@@ -20,8 +20,8 @@
+ * reset while the Core B bit (on dual core parts) is cleared by
+ * the core reset.
+ */
+-__attribute__ ((__l1_text__, __noreturn__))
+-static void bfin_reset(void)
++__attribute__((l1_text))
++static void _bfin_reset(void)
+ {
+ /* Wait for completion of "system" events such as cache line
+ * line fills so that we avoid infinite stalls later on as
+@@ -30,11 +30,7 @@
+ */
+ __builtin_bfin_ssync();
+
+- /* The bootrom checks to see how it was reset and will
+- * automatically perform a software reset for us when
+- * it starts executing after the core reset.
+- */
+- if (ANOMALY_05000353 || ANOMALY_05000386) {
++ while (1) {
+ /* Initiate System software reset. */
+ bfin_write_SWRST(0x7);
+
+@@ -54,11 +50,6 @@
+ /* Clear System software reset */
+ bfin_write_SWRST(0);
+
+- /* The BF526 ROM will crash during reset */
+-#if defined(__ADSPBF522__) || defined(__ADSPBF524__) || defined(__ADSPBF526__)
+- bfin_read_SWRST();
+-#endif
+-
+ /* Wait for the SWRST write to complete. Cannot rely on SSYNC
+ * though as the System state is all reset now.
+ */
+@@ -69,11 +60,22 @@
+ : "a" (15 * 1)
+ : "LC1", "LB1", "LT1"
+ );
+- }
+
+- while (1)
+ /* Issue core reset */
+ asm("raise 1");
++ }
++}
++
++static void bfin_reset(void)
++{
++ if (ANOMALY_05000353 || ANOMALY_05000386)
++ _bfin_reset();
++ else
++ /* the bootrom checks to see how it was reset and will
++ * automatically perform a software reset for us when
++ * it starts executing boot
++ */
++ asm("raise 1;");
+ }
+
+ __attribute__((weak))
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/kernel/setup.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/setup.c
+--- linux-2.6.29.owrt/arch/blackfin/kernel/setup.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/setup.c 2009-05-10 23:48:28.000000000 +0200
+@@ -60,7 +60,7 @@
+ #define BFIN_MEMMAP_MAX 128 /* number of entries in bfin_memmap */
+ #define BFIN_MEMMAP_RAM 1
+ #define BFIN_MEMMAP_RESERVED 2
+-static struct bfin_memmap {
++struct bfin_memmap {
+ int nr_map;
+ struct bfin_memmap_entry {
+ unsigned long long addr; /* start of memory segment */
+@@ -824,15 +824,7 @@
+ flash_probe();
+ #endif
+
+- printk(KERN_INFO "Boot Mode: %i\n", bfin_read_SYSCR() & 0xF);
+-
+- /* Newer parts mirror SWRST bits in SYSCR */
+-#if defined(CONFIG_BF53x) || defined(CONFIG_BF561) || \
+- defined(CONFIG_BF538) || defined(CONFIG_BF539)
+ _bfin_swrst = bfin_read_SWRST();
+-#else
+- _bfin_swrst = bfin_read_SYSCR();
+-#endif
+
+ #ifdef CONFIG_DEBUG_DOUBLEFAULT_PRINT
+ bfin_write_SWRST(_bfin_swrst & ~DOUBLE_FAULT);
+@@ -861,7 +853,7 @@
+ else if (_bfin_swrst & RESET_SOFTWARE)
+ printk(KERN_NOTICE "Reset caused by Software reset\n");
+
+- printk(KERN_INFO "Blackfin support (C) 2004-2009 Analog Devices, Inc.\n");
++ printk(KERN_INFO "Blackfin support (C) 2004-2008 Analog Devices, Inc.\n");
+ if (bfin_compiled_revid() == 0xffff)
+ printk(KERN_INFO "Compiled for ADSP-%s Rev any\n", CPU);
+ else if (bfin_compiled_revid() == -1)
+@@ -889,10 +881,6 @@
+ CPU, bfin_revid());
+ }
+
+- /* We can't run on BF548-0.1 due to ANOMALY 05000448 */
+- if (bfin_cpuid() == 0x27de && bfin_revid() == 1)
+- panic("You can't run on this processor due to 05000448\n");
+-
+ printk(KERN_INFO "Blackfin Linux support by http://blackfin.uclinux.org/\n");
+
+ printk(KERN_INFO "Processor Speed: %lu MHz core clock and %lu MHz System Clock\n",
+@@ -1145,12 +1133,12 @@
+ icache_size = 0;
+
+ seq_printf(m, "cache size\t: %d KB(L1 icache) "
+- "%d KB(L1 dcache%s) %d KB(L2 cache)\n",
++ "%d KB(L1 dcache-%s) %d KB(L2 cache)\n",
+ icache_size, dcache_size,
+ #if defined CONFIG_BFIN_WB
+- "-wb"
++ "wb"
+ #elif defined CONFIG_BFIN_WT
+- "-wt"
++ "wt"
+ #endif
+ "", 0);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/kernel/time.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/time.c
+--- linux-2.6.29.owrt/arch/blackfin/kernel/time.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/time.c 2009-05-10 23:48:28.000000000 +0200
+@@ -134,10 +134,7 @@
+
+ write_seqlock(&xtime_lock);
+ #if defined(CONFIG_TICK_SOURCE_SYSTMR0) && !defined(CONFIG_IPIPE)
+- /*
+- * TIMIL0 is latched in __ipipe_grab_irq() when the I-Pipe is
+- * enabled.
+- */
++/* FIXME: Here TIMIL0 is not set when IPIPE enabled, why? */
+ if (get_gptimer_status(0) & TIMER_STATUS_TIMIL0) {
+ #endif
+ do_timer(1);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/kernel/traps.c linux-2.6.29-rc3.owrt/arch/blackfin/kernel/traps.c
+--- linux-2.6.29.owrt/arch/blackfin/kernel/traps.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/kernel/traps.c 2009-05-10 23:48:28.000000000 +0200
+@@ -673,14 +673,6 @@
+ verbose_printk("RTI");
+ else if (opcode == 0x0012)
+ verbose_printk("RTX");
+- else if (opcode == 0x0013)
+- verbose_printk("RTN");
+- else if (opcode == 0x0014)
+- verbose_printk("RTE");
+- else if (opcode == 0x0025)
+- verbose_printk("EMUEXCPT");
+- else if (opcode == 0x0040 && opcode <= 0x0047)
+- verbose_printk("STI R%i", opcode & 7);
+ else if (opcode >= 0x0050 && opcode <= 0x0057)
+ verbose_printk("JUMP (P%i)", opcode & 7);
+ else if (opcode >= 0x0060 && opcode <= 0x0067)
+@@ -689,10 +681,6 @@
+ verbose_printk("CALL (PC+P%i)", opcode & 7);
+ else if (opcode >= 0x0080 && opcode <= 0x0087)
+ verbose_printk("JUMP (PC+P%i)", opcode & 7);
+- else if (opcode >= 0x0090 && opcode <= 0x009F)
+- verbose_printk("RAISE 0x%x", opcode & 0xF);
+- else if (opcode >= 0x00A0 && opcode <= 0x00AF)
+- verbose_printk("EXCPT 0x%x", opcode & 0xF);
+ else if ((opcode >= 0x1000 && opcode <= 0x13FF) || (opcode >= 0x1800 && opcode <= 0x1BFF))
+ verbose_printk("IF !CC JUMP");
+ else if ((opcode >= 0x1400 && opcode <= 0x17ff) || (opcode >= 0x1c00 && opcode <= 0x1fff))
+@@ -832,8 +820,11 @@
+ decode_address(buf, (unsigned int)stack);
+ printk(KERN_NOTICE " SP: [0x%p] %s\n", stack, buf);
+
++ addr = (unsigned int *)((unsigned int)stack & ~0x3F);
++
+ /* First thing is to look for a frame pointer */
+- for (addr = (unsigned int *)((unsigned int)stack & ~0xF); addr < endstack; addr++) {
++ for (addr = (unsigned int *)((unsigned int)stack & ~0xF), i = 0;
++ addr < endstack; addr++, i++) {
+ if (*addr & 0x1)
+ continue;
+ ins_addr = (unsigned short *)*addr;
+@@ -843,8 +834,7 @@
+
+ if (fp) {
+ /* Let's check to see if it is a frame pointer */
+- while (fp >= (addr - 1) && fp < endstack
+- && fp && ((unsigned int) fp & 0x3) == 0)
++ while (fp >= (addr - 1) && fp < endstack && fp)
+ fp = (unsigned int *)*fp;
+ if (fp == 0 || fp == endstack) {
+ fp = addr - 1;
+@@ -1062,9 +1052,8 @@
+ char buf [150];
+ struct irqaction *action;
+ unsigned int i;
+- unsigned long flags = 0;
++ unsigned long flags;
+ unsigned int cpu = smp_processor_id();
+- unsigned char in_atomic = (bfin_read_IPEND() & 0x10) || in_atomic();
+
+ verbose_printk(KERN_NOTICE "\n" KERN_NOTICE "SEQUENCER STATUS:\t\t%s\n", print_tainted());
+ verbose_printk(KERN_NOTICE " SEQSTAT: %08lx IPEND: %04lx SYSCFG: %04lx\n",
+@@ -1084,22 +1073,17 @@
+ }
+ verbose_printk(KERN_NOTICE " EXCAUSE : 0x%lx\n",
+ fp->seqstat & SEQSTAT_EXCAUSE);
+- for (i = 2; i <= 15 ; i++) {
++ for (i = 6; i <= 15 ; i++) {
+ if (fp->ipend & (1 << i)) {
+- if (i != 4) {
+- decode_address(buf, bfin_read32(EVT0 + 4*i));
+- verbose_printk(KERN_NOTICE " physical IVG%i asserted : %s\n", i, buf);
+- } else
+- verbose_printk(KERN_NOTICE " interrupts disabled\n");
++ decode_address(buf, bfin_read32(EVT0 + 4*i));
++ verbose_printk(KERN_NOTICE " physical IVG%i asserted : %s\n", i, buf);
+ }
+ }
+
+ /* if no interrupts are going off, don't print this out */
+ if (fp->ipend & ~0x3F) {
+ for (i = 0; i < (NR_IRQS - 1); i++) {
+- if (!in_atomic)
+- spin_lock_irqsave(&irq_desc[i].lock, flags);
+-
++ spin_lock_irqsave(&irq_desc[i].lock, flags);
+ action = irq_desc[i].action;
+ if (!action)
+ goto unlock;
+@@ -1112,8 +1096,7 @@
+ }
+ verbose_printk("\n");
+ unlock:
+- if (!in_atomic)
+- spin_unlock_irqrestore(&irq_desc[i].lock, flags);
++ spin_unlock_irqrestore(&irq_desc[i].lock, flags);
+ }
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf518/boards/ezbrd.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf518/boards/ezbrd.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf518/boards/ezbrd.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf518/boards/ezbrd.c 2009-05-10 23:48:28.000000000 +0200
+@@ -46,7 +46,6 @@
+ #include <asm/dpmc.h>
+ #include <asm/bfin_sdh.h>
+ #include <linux/spi/ad7877.h>
+-#include <net/dsa.h>
+
+ /*
+ * Name the Board for the /proc/cpuinfo
+@@ -105,33 +104,10 @@
+ #endif
+
+ #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
+-static struct platform_device bfin_mii_bus = {
+- .name = "bfin_mii_bus",
+-};
+-
+ static struct platform_device bfin_mac_device = {
+ .name = "bfin_mac",
+- .dev.platform_data = &bfin_mii_bus,
+-};
+-
+-#if defined(CONFIG_NET_DSA_KSZ8893M) || defined(CONFIG_NET_DSA_KSZ8893M_MODULE)
+-static struct dsa_platform_data ksz8893m_switch_data = {
+- .mii_bus = &bfin_mii_bus.dev,
+- .netdev = &bfin_mac_device.dev,
+- .port_names[0] = NULL,
+- .port_names[1] = "eth%d",
+- .port_names[2] = "eth%d",
+- .port_names[3] = "cpu",
+-};
+-
+-static struct platform_device ksz8893m_switch_device = {
+- .name = "dsa",
+- .id = 0,
+- .num_resources = 0,
+- .dev.platform_data = &ksz8893m_switch_data,
+ };
+ #endif
+-#endif
+
+ #if defined(CONFIG_MTD_M25P80) \
+ || defined(CONFIG_MTD_M25P80_MODULE)
+@@ -171,20 +147,9 @@
+ };
+ #endif
+
+-#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
+-#if defined(CONFIG_NET_DSA_KSZ8893M) \
+- || defined(CONFIG_NET_DSA_KSZ8893M_MODULE)
+-/* SPI SWITCH CHIP */
+-static struct bfin5xx_spi_chip spi_switch_info = {
+- .enable_dma = 0,
+- .bits_per_word = 8,
+-};
+-#endif
+-#endif
+-
+-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
+-static struct bfin5xx_spi_chip mmc_spi_chip_info = {
+- .enable_dma = 0,
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
++static struct bfin5xx_spi_chip spi_mmc_chip_info = {
++ .enable_dma = 1,
+ .bits_per_word = 8,
+ };
+ #endif
+@@ -261,28 +226,23 @@
+ },
+ #endif
+
+-#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
+-#if defined(CONFIG_NET_DSA_KSZ8893M) \
+- || defined(CONFIG_NET_DSA_KSZ8893M_MODULE)
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
+ {
+- .modalias = "ksz8893m",
+- .max_speed_hz = 5000000,
++ .modalias = "spi_mmc_dummy",
++ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
+ .bus_num = 0,
+- .chip_select = 1,
++ .chip_select = 0,
+ .platform_data = NULL,
+- .controller_data = &spi_switch_info,
++ .controller_data = &spi_mmc_chip_info,
+ .mode = SPI_MODE_3,
+ },
+-#endif
+-#endif
+-
+-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
+ {
+- .modalias = "mmc_spi",
++ .modalias = "spi_mmc",
+ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
+ .bus_num = 0,
+- .chip_select = 5,
+- .controller_data = &mmc_spi_chip_info,
++ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
++ .platform_data = NULL,
++ .controller_data = &spi_mmc_chip_info,
+ .mode = SPI_MODE_3,
+ },
+ #endif
+@@ -513,6 +473,7 @@
+ };
+ #endif
+
++#ifdef CONFIG_I2C_BOARDINFO
+ static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
+ #if defined(CONFIG_TWI_LCD) || defined(CONFIG_TWI_LCD_MODULE)
+ {
+@@ -526,6 +487,7 @@
+ },
+ #endif
+ };
++#endif
+
+ #if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
+ static struct platform_device bfin_sport0_uart_device = {
+@@ -622,11 +584,7 @@
+ #endif
+
+ #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
+- &bfin_mii_bus,
+ &bfin_mac_device,
+-#if defined(CONFIG_NET_DSA_KSZ8893M) || defined(CONFIG_NET_DSA_KSZ8893M_MODULE)
+- &ksz8893m_switch_device,
+-#endif
+ #endif
+
+ #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
+@@ -674,8 +632,12 @@
+ static int __init ezbrd_init(void)
+ {
+ printk(KERN_INFO "%s(): registering device resources\n", __func__);
++
++#ifdef CONFIG_I2C_BOARDINFO
+ i2c_register_board_info(0, bfin_i2c_board_info,
+ ARRAY_SIZE(bfin_i2c_board_info));
++#endif
++
+ platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
+ spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
+ return 0;
+@@ -687,7 +649,7 @@
+ {
+ /* workaround reboot hang when booting from SPI */
+ if ((bfin_read_SYSCR() & 0x7) == 0x3)
+- bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
++ bfin_gpio_reset_spi0_ssel1();
+ }
+
+ void bfin_get_ether_addr(char *addr)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf518/include/mach/anomaly.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf518/include/mach/anomaly.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf518/include/mach/anomaly.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf518/include/mach/anomaly.h 2009-05-10 23:48:28.000000000 +0200
+@@ -2,12 +2,12 @@
+ * File: include/asm-blackfin/mach-bf518/anomaly.h
+ * Bugs: Enter bugs at http://blackfin.uclinux.org/
+ *
+- * Copyright (C) 2004-2009 Analog Devices Inc.
++ * Copyright (C) 2004-2008 Analog Devices Inc.
+ * Licensed under the GPL-2 or later.
+ */
+
+ /* This file shoule be up to date with:
+- * - Revision B, 02/03/2009; ADSP-BF512/BF514/BF516/BF518 Blackfin Processor Anomaly List
++ * - ????
+ */
+
+ #ifndef _MACH_ANOMALY_H_
+@@ -19,8 +19,6 @@
+ #define ANOMALY_05000122 (1)
+ /* False Hardware Error from an Access in the Shadow of a Conditional Branch */
+ #define ANOMALY_05000245 (1)
+-/* Incorrect Timer Pulse Width in Single-Shot PWM_OUT Mode with External Clock */
+-#define ANOMALY_05000254 (1)
+ /* Sensitivity To Noise with Slow Input Edge Rates on External SPORT TX and RX Clocks */
+ #define ANOMALY_05000265 (1)
+ /* False Hardware Errors Caused by Fetches at the Boundary of Reserved Memory */
+@@ -55,12 +53,6 @@
+ #define ANOMALY_05000443 (1)
+ /* Incorrect L1 Instruction Bank B Memory Map Location */
+ #define ANOMALY_05000444 (1)
+-/* Incorrect Default Hysteresis Setting for RESET, NMI, and BMODE Signals */
+-#define ANOMALY_05000452 (1)
+-/* PWM_TRIPB Signal Not Available on PG10 */
+-#define ANOMALY_05000453 (1)
+-/* PPI_FS3 is Driven One Half Cycle Later Than PPI Data */
+-#define ANOMALY_05000455 (1)
+
+ /* Anomalies that don't exist on this proc */
+ #define ANOMALY_05000125 (0)
+@@ -73,20 +65,15 @@
+ #define ANOMALY_05000263 (0)
+ #define ANOMALY_05000266 (0)
+ #define ANOMALY_05000273 (0)
+-#define ANOMALY_05000278 (0)
+ #define ANOMALY_05000285 (0)
+-#define ANOMALY_05000305 (0)
+ #define ANOMALY_05000307 (0)
+ #define ANOMALY_05000311 (0)
+ #define ANOMALY_05000312 (0)
+ #define ANOMALY_05000323 (0)
+ #define ANOMALY_05000353 (0)
+ #define ANOMALY_05000363 (0)
+-#define ANOMALY_05000380 (0)
+ #define ANOMALY_05000386 (0)
+ #define ANOMALY_05000412 (0)
+ #define ANOMALY_05000432 (0)
+-#define ANOMALY_05000447 (0)
+-#define ANOMALY_05000448 (0)
+
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf518/include/mach/bfin_serial_5xx.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf518/include/mach/bfin_serial_5xx.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf518/include/mach/bfin_serial_5xx.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf518/include/mach/bfin_serial_5xx.h 2009-05-10 23:48:28.000000000 +0200
+@@ -144,7 +144,7 @@
+ CH_UART0_TX,
+ CH_UART0_RX,
+ #endif
+-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
++#ifdef CONFIG_BFIN_UART0_CTSRTS
+ CONFIG_UART0_CTS_PIN,
+ CONFIG_UART0_RTS_PIN,
+ #endif
+@@ -158,7 +158,7 @@
+ CH_UART1_TX,
+ CH_UART1_RX,
+ #endif
+-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
++#ifdef CONFIG_BFIN_UART1_CTSRTS
+ CONFIG_UART1_CTS_PIN,
+ CONFIG_UART1_RTS_PIN,
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf518/include/mach/portmux.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf518/include/mach/portmux.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf518/include/mach/portmux.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf518/include/mach/portmux.h 2009-05-10 23:48:28.000000000 +0200
+@@ -103,8 +103,6 @@
+ #define P_SPI1_SSEL4 (P_DEFINED | P_IDENT(GPIO_PF8) | P_FUNCT(2))
+ #define P_SPI1_SSEL5 (P_DEFINED | P_IDENT(GPIO_PG11) | P_FUNCT(2))
+
+-#define P_DEFAULT_BOOT_SPI_CS P_SPI0_SSEL2
+-
+ /* SPORT Port Mux */
+ #define P_SPORT0_DRPRI (P_DEFINED | P_IDENT(GPIO_PG3) | P_FUNCT(0))
+ #define P_SPORT0_RSCLK (P_DEFINED | P_IDENT(GPIO_PG4) | P_FUNCT(0))
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf527/boards/cm_bf527.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/boards/cm_bf527.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf527/boards/cm_bf527.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/boards/cm_bf527.c 2009-05-10 23:48:28.000000000 +0200
+@@ -403,13 +403,8 @@
+ #endif
+
+ #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
+-static struct platform_device bfin_mii_bus = {
+- .name = "bfin_mii_bus",
+-};
+-
+ static struct platform_device bfin_mac_device = {
+ .name = "bfin_mac",
+- .dev.platform_data = &bfin_mii_bus,
+ };
+ #endif
+
+@@ -487,9 +482,9 @@
+ };
+ #endif
+
+-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
+-static struct bfin5xx_spi_chip mmc_spi_chip_info = {
+- .enable_dma = 0,
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
++static struct bfin5xx_spi_chip spi_mmc_chip_info = {
++ .enable_dma = 1,
+ .bits_per_word = 8,
+ };
+ #endif
+@@ -585,13 +580,23 @@
+ .controller_data = &ad9960_spi_chip_info,
+ },
+ #endif
+-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
+ {
+- .modalias = "mmc_spi",
+- .max_speed_hz = 20000000, /* max spi clock (SCK) speed in HZ */
++ .modalias = "spi_mmc_dummy",
++ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
+ .bus_num = 0,
+- .chip_select = 5,
+- .controller_data = &mmc_spi_chip_info,
++ .chip_select = 0,
++ .platform_data = NULL,
++ .controller_data = &spi_mmc_chip_info,
++ .mode = SPI_MODE_3,
++ },
++ {
++ .modalias = "spi_mmc",
++ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
++ .bus_num = 0,
++ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
++ .platform_data = NULL,
++ .controller_data = &spi_mmc_chip_info,
+ .mode = SPI_MODE_3,
+ },
+ #endif
+@@ -788,6 +793,7 @@
+ };
+ #endif
+
++#ifdef CONFIG_I2C_BOARDINFO
+ static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
+ #if defined(CONFIG_TWI_LCD) || defined(CONFIG_TWI_LCD_MODULE)
+ {
+@@ -803,6 +809,7 @@
+ },
+ #endif
+ };
++#endif
+
+ #if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
+ static struct platform_device bfin_sport0_uart_device = {
+@@ -913,7 +920,6 @@
+ #endif
+
+ #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
+- &bfin_mii_bus,
+ &bfin_mac_device,
+ #endif
+
+@@ -962,23 +968,27 @@
+ &bfin_gpios_device,
+ };
+
+-static int __init cm_init(void)
++static int __init stamp_init(void)
+ {
+ printk(KERN_INFO "%s(): registering device resources\n", __func__);
++
++#ifdef CONFIG_I2C_BOARDINFO
+ i2c_register_board_info(0, bfin_i2c_board_info,
+ ARRAY_SIZE(bfin_i2c_board_info));
++#endif
++
+ platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
+ spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
+ return 0;
+ }
+
+-arch_initcall(cm_init);
++arch_initcall(stamp_init);
+
+ void native_machine_restart(char *cmd)
+ {
+ /* workaround reboot hang when booting from SPI */
+ if ((bfin_read_SYSCR() & 0x7) == 0x3)
+- bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
++ bfin_gpio_reset_spi0_ssel1();
+ }
+
+ void bfin_get_ether_addr(char *addr)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf527/boards/ezbrd.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/boards/ezbrd.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf527/boards/ezbrd.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/boards/ezbrd.c 2009-05-10 23:48:28.000000000 +0200
+@@ -208,13 +208,8 @@
+
+
+ #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
+-static struct platform_device bfin_mii_bus = {
+- .name = "bfin_mii_bus",
+-};
+-
+ static struct platform_device bfin_mac_device = {
+ .name = "bfin_mac",
+- .dev.platform_data = &bfin_mii_bus,
+ };
+ #endif
+
+@@ -256,9 +251,9 @@
+ };
+ #endif
+
+-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
+-static struct bfin5xx_spi_chip mmc_spi_chip_info = {
+- .enable_dma = 0,
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
++static struct bfin5xx_spi_chip spi_mmc_chip_info = {
++ .enable_dma = 1,
+ .bits_per_word = 8,
+ };
+ #endif
+@@ -366,13 +361,23 @@
+ },
+ #endif
+
+-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
+ {
+- .modalias = "mmc_spi",
++ .modalias = "spi_mmc_dummy",
+ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
+ .bus_num = 0,
+- .chip_select = 5,
+- .controller_data = &mmc_spi_chip_info,
++ .chip_select = 0,
++ .platform_data = NULL,
++ .controller_data = &spi_mmc_chip_info,
++ .mode = SPI_MODE_3,
++ },
++ {
++ .modalias = "spi_mmc",
++ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
++ .bus_num = 0,
++ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
++ .platform_data = NULL,
++ .controller_data = &spi_mmc_chip_info,
+ .mode = SPI_MODE_3,
+ },
+ #endif
+@@ -585,6 +590,7 @@
+ };
+ #endif
+
++#ifdef CONFIG_I2C_BOARDINFO
+ static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
+ #if defined(CONFIG_TWI_LCD) || defined(CONFIG_TWI_LCD_MODULE)
+ {
+@@ -598,6 +604,7 @@
+ },
+ #endif
+ };
++#endif
+
+ #if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
+ static struct platform_device bfin_sport0_uart_device = {
+@@ -713,7 +720,6 @@
+ #endif
+
+ #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
+- &bfin_mii_bus,
+ &bfin_mac_device,
+ #endif
+
+@@ -758,23 +764,27 @@
+ &bfin_gpios_device,
+ };
+
+-static int __init ezbrd_init(void)
++static int __init stamp_init(void)
+ {
+ printk(KERN_INFO "%s(): registering device resources\n", __func__);
++
++#ifdef CONFIG_I2C_BOARDINFO
+ i2c_register_board_info(0, bfin_i2c_board_info,
+ ARRAY_SIZE(bfin_i2c_board_info));
++#endif
++
+ platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
+ spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
+ return 0;
+ }
+
+-arch_initcall(ezbrd_init);
++arch_initcall(stamp_init);
+
+ void native_machine_restart(char *cmd)
+ {
+ /* workaround reboot hang when booting from SPI */
+ if ((bfin_read_SYSCR() & 0x7) == 0x3)
+- bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
++ bfin_gpio_reset_spi0_ssel1();
+ }
+
+ void bfin_get_ether_addr(char *addr)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf527/boards/ezkit.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/boards/ezkit.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf527/boards/ezkit.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/boards/ezkit.c 2009-05-10 23:48:28.000000000 +0200
+@@ -425,13 +425,8 @@
+ #endif
+
+ #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
+-static struct platform_device bfin_mii_bus = {
+- .name = "bfin_mii_bus",
+-};
+-
+ static struct platform_device bfin_mac_device = {
+ .name = "bfin_mac",
+- .dev.platform_data = &bfin_mii_bus,
+ };
+ #endif
+
+@@ -835,6 +830,7 @@
+ };
+ #endif
+
++#ifdef CONFIG_I2C_BOARDINFO
+ static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
+ #if defined(CONFIG_TWI_LCD) || defined(CONFIG_TWI_LCD_MODULE)
+ {
+@@ -848,6 +844,7 @@
+ },
+ #endif
+ };
++#endif
+
+ #if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
+ static struct platform_device bfin_sport0_uart_device = {
+@@ -991,7 +988,6 @@
+ #endif
+
+ #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
+- &bfin_mii_bus,
+ &bfin_mac_device,
+ #endif
+
+@@ -1052,23 +1048,27 @@
+ &bfin_gpios_device,
+ };
+
+-static int __init ezkit_init(void)
++static int __init stamp_init(void)
+ {
+ printk(KERN_INFO "%s(): registering device resources\n", __func__);
++
++#ifdef CONFIG_I2C_BOARDINFO
+ i2c_register_board_info(0, bfin_i2c_board_info,
+ ARRAY_SIZE(bfin_i2c_board_info));
++#endif
++
+ platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
+ spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
+ return 0;
+ }
+
+-arch_initcall(ezkit_init);
++arch_initcall(stamp_init);
+
+ void native_machine_restart(char *cmd)
+ {
+ /* workaround reboot hang when booting from SPI */
+ if ((bfin_read_SYSCR() & 0x7) == 0x3)
+- bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
++ bfin_gpio_reset_spi0_ssel1();
+ }
+
+ void bfin_get_ether_addr(char *addr)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf527/include/mach/anomaly.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/include/mach/anomaly.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf527/include/mach/anomaly.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/include/mach/anomaly.h 2009-05-10 23:48:28.000000000 +0200
+@@ -2,7 +2,7 @@
+ * File: include/asm-blackfin/mach-bf527/anomaly.h
+ * Bugs: Enter bugs at http://blackfin.uclinux.org/
+ *
+- * Copyright (C) 2004-2009 Analog Devices Inc.
++ * Copyright (C) 2004-2008 Analog Devices Inc.
+ * Licensed under the GPL-2 or later.
+ */
+
+@@ -167,16 +167,12 @@
+ #define ANOMALY_05000263 (0)
+ #define ANOMALY_05000266 (0)
+ #define ANOMALY_05000273 (0)
+-#define ANOMALY_05000278 (0)
+ #define ANOMALY_05000285 (0)
+-#define ANOMALY_05000305 (0)
+ #define ANOMALY_05000307 (0)
+ #define ANOMALY_05000311 (0)
+ #define ANOMALY_05000312 (0)
+ #define ANOMALY_05000323 (0)
+ #define ANOMALY_05000363 (0)
+ #define ANOMALY_05000412 (0)
+-#define ANOMALY_05000447 (0)
+-#define ANOMALY_05000448 (0)
+
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf527/include/mach/bfin_serial_5xx.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/include/mach/bfin_serial_5xx.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf527/include/mach/bfin_serial_5xx.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/include/mach/bfin_serial_5xx.h 2009-05-10 23:48:28.000000000 +0200
+@@ -144,7 +144,7 @@
+ CH_UART0_TX,
+ CH_UART0_RX,
+ #endif
+-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
++#ifdef CONFIG_BFIN_UART0_CTSRTS
+ CONFIG_UART0_CTS_PIN,
+ CONFIG_UART0_RTS_PIN,
+ #endif
+@@ -158,7 +158,7 @@
+ CH_UART1_TX,
+ CH_UART1_RX,
+ #endif
+-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
++#ifdef CONFIG_BFIN_UART1_CTSRTS
+ CONFIG_UART1_CTS_PIN,
+ CONFIG_UART1_RTS_PIN,
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf527/include/mach/portmux.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/include/mach/portmux.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf527/include/mach/portmux.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf527/include/mach/portmux.h 2009-05-10 23:48:28.000000000 +0200
+@@ -73,8 +73,6 @@
+
+ #define P_HWAIT (P_DONTCARE)
+
+-#define P_DEFAULT_BOOT_SPI_CS P_SPI0_SSEL1
+-
+ #define P_SPI0_SS (P_DEFINED | P_IDENT(GPIO_PG1) | P_FUNCT(0))
+ #define P_SPI0_SSEL1 (P_DEFINED | P_IDENT(GPIO_PG1) | P_FUNCT(2))
+ #define P_SPI0_SCK (P_DEFINED | P_IDENT(GPIO_PG2) | P_FUNCT(2))
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/blackstamp.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/blackstamp.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/blackstamp.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/blackstamp.c 2009-05-10 23:48:28.000000000 +0200
+@@ -101,9 +101,9 @@
+ };
+ #endif
+
+-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
+-static struct bfin5xx_spi_chip mmc_spi_chip_info = {
+- .enable_dma = 0,
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
++static struct bfin5xx_spi_chip spi_mmc_chip_info = {
++ .enable_dma = 1,
+ .bits_per_word = 8,
+ };
+ #endif
+@@ -129,13 +129,23 @@
+ },
+ #endif
+
+-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
++ {
++ .modalias = "spi_mmc_dummy",
++ .max_speed_hz = 20000000, /* max spi clock (SCK) speed in HZ */
++ .bus_num = 0,
++ .chip_select = 0,
++ .platform_data = NULL,
++ .controller_data = &spi_mmc_chip_info,
++ .mode = SPI_MODE_3,
++ },
+ {
+- .modalias = "mmc_spi",
++ .modalias = "spi_mmc",
+ .max_speed_hz = 20000000, /* max spi clock (SCK) speed in HZ */
+ .bus_num = 0,
+- .chip_select = 5,
+- .controller_data = &mmc_spi_chip_info,
++ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
++ .platform_data = NULL,
++ .controller_data = &spi_mmc_chip_info,
+ .mode = SPI_MODE_3,
+ },
+ #endif
+@@ -299,8 +309,10 @@
+ };
+ #endif
+
++#ifdef CONFIG_I2C_BOARDINFO
+ static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
+ };
++#endif
+
+ static const unsigned int cclk_vlev_datasheet[] =
+ {
+@@ -378,8 +390,10 @@
+
+ printk(KERN_INFO "%s(): registering device resources\n", __func__);
+
++#ifdef CONFIG_I2C_BOARDINFO
+ i2c_register_board_info(0, bfin_i2c_board_info,
+ ARRAY_SIZE(bfin_i2c_board_info));
++#endif
+
+ ret = platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
+ if (ret < 0)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/cm_bf533.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/cm_bf533.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/cm_bf533.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/cm_bf533.c 2009-05-10 23:48:28.000000000 +0200
+@@ -96,9 +96,9 @@
+ };
+ #endif
+
+-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
+-static struct bfin5xx_spi_chip mmc_spi_chip_info = {
+- .enable_dma = 0,
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
++static struct bfin5xx_spi_chip spi_mmc_chip_info = {
++ .enable_dma = 1,
+ .bits_per_word = 8,
+ };
+ #endif
+@@ -138,13 +138,23 @@
+ },
+ #endif
+
+-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
+ {
+- .modalias = "mmc_spi",
++ .modalias = "spi_mmc_dummy",
+ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
+ .bus_num = 0,
+- .chip_select = 5,
+- .controller_data = &mmc_spi_chip_info,
++ .chip_select = 0,
++ .platform_data = NULL,
++ .controller_data = &spi_mmc_chip_info,
++ .mode = SPI_MODE_3,
++ },
++ {
++ .modalias = "spi_mmc",
++ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
++ .bus_num = 0,
++ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
++ .platform_data = NULL,
++ .controller_data = &spi_mmc_chip_info,
+ .mode = SPI_MODE_3,
+ },
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/generic_board.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/generic_board.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/generic_board.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/generic_board.c 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,126 @@
++/*
++ * File: arch/blackfin/mach-bf533/generic_board.c
++ * Based on: arch/blackfin/mach-bf533/ezkit.c
++ * Author: Aidan Williams <aidan@nicta.com.au>
++ *
++ * Created: 2005
++ * Description:
++ *
++ * Modified:
++ * Copyright 2005 National ICT Australia (NICTA)
++ * Copyright 2004-2006 Analog Devices Inc.
++ *
++ * Bugs: Enter bugs at http://blackfin.uclinux.org/
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, see the file COPYING, or write
++ * to the Free Software Foundation, Inc.,
++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#include <linux/device.h>
++#include <linux/platform_device.h>
++#include <linux/irq.h>
++
++/*
++ * Name the Board for the /proc/cpuinfo
++ */
++const char bfin_board_name[] = "UNKNOWN BOARD";
++
++#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
++static struct platform_device rtc_device = {
++ .name = "rtc-bfin",
++ .id = -1,
++};
++#endif
++
++/*
++ * Driver needs to know address, irq and flag pin.
++ */
++#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
++static struct resource smc91x_resources[] = {
++ {
++ .start = 0x20300300,
++ .end = 0x20300300 + 16,
++ .flags = IORESOURCE_MEM,
++ }, {
++ .start = IRQ_PROG_INTB,
++ .end = IRQ_PROG_INTB,
++ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
++ }, {
++ .start = IRQ_PF7,
++ .end = IRQ_PF7,
++ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
++ },
++};
++
++static struct platform_device smc91x_device = {
++ .name = "smc91x",
++ .id = 0,
++ .num_resources = ARRAY_SIZE(smc91x_resources),
++ .resource = smc91x_resources,
++};
++#endif
++
++#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
++#ifdef CONFIG_BFIN_SIR0
++static struct resource bfin_sir0_resources[] = {
++ {
++ .start = 0xFFC00400,
++ .end = 0xFFC004FF,
++ .flags = IORESOURCE_MEM,
++ },
++ {
++ .start = IRQ_UART0_RX,
++ .end = IRQ_UART0_RX+1,
++ .flags = IORESOURCE_IRQ,
++ },
++ {
++ .start = CH_UART0_RX,
++ .end = CH_UART0_RX+1,
++ .flags = IORESOURCE_DMA,
++ },
++};
++
++static struct platform_device bfin_sir0_device = {
++ .name = "bfin_sir",
++ .id = 0,
++ .num_resources = ARRAY_SIZE(bfin_sir0_resources),
++ .resource = bfin_sir0_resources,
++};
++#endif
++#endif
++
++static struct platform_device *generic_board_devices[] __initdata = {
++#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
++ &rtc_device,
++#endif
++
++#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
++ &smc91x_device,
++#endif
++
++#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
++#ifdef CONFIG_BFIN_SIR0
++ &bfin_sir0_device,
++#endif
++#endif
++};
++
++static int __init generic_board_init(void)
++{
++ printk(KERN_INFO "%s(): registering device resources\n", __func__);
++ return platform_add_devices(generic_board_devices, ARRAY_SIZE(generic_board_devices));
++}
++
++arch_initcall(generic_board_init);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/ip0x.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/ip0x.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/ip0x.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/ip0x.c 2009-05-10 23:48:28.000000000 +0200
+@@ -127,8 +127,8 @@
+ #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
+ /* all SPI peripherals info goes here */
+
+-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
+-static struct bfin5xx_spi_chip mmc_spi_chip_info = {
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
++static struct bfin5xx_spi_chip spi_mmc_chip_info = {
+ /*
+ * CPOL (Clock Polarity)
+ * 0 - Active high SCK
+@@ -152,13 +152,14 @@
+ /* Notice: for blackfin, the speed_hz is the value of register
+ * SPI_BAUD, not the real baudrate */
+ static struct spi_board_info bfin_spi_board_info[] __initdata = {
+-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
+ {
+- .modalias = "mmc_spi",
++ .modalias = "spi_mmc",
+ .max_speed_hz = 2,
+ .bus_num = 1,
+- .chip_select = 5,
+- .controller_data = &mmc_spi_chip_info,
++ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
++ .platform_data = NULL,
++ .controller_data = &spi_mmc_chip_info,
+ },
+ #endif
+ };
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/Kconfig linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/Kconfig
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/Kconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -38,4 +38,9 @@
+ help
+ Core support for IP04/IP04 open hardware IP-PBX.
+
++config GENERIC_BF533_BOARD
++ bool "Generic"
++ help
++ Generic or Custom board support.
++
+ endchoice
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/Makefile linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/Makefile
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/Makefile 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/Makefile 2009-05-10 23:48:28.000000000 +0200
+@@ -2,6 +2,7 @@
+ # arch/blackfin/mach-bf533/boards/Makefile
+ #
+
++obj-$(CONFIG_GENERIC_BF533_BOARD) += generic_board.o
+ obj-$(CONFIG_BFIN533_STAMP) += stamp.o
+ obj-$(CONFIG_BFIN532_IP0X) += ip0x.o
+ obj-$(CONFIG_BFIN533_EZKIT) += ezkit.o
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/stamp.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/stamp.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf533/boards/stamp.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/boards/stamp.c 2009-05-10 23:48:28.000000000 +0200
+@@ -441,6 +441,7 @@
+ };
+ #endif
+
++#ifdef CONFIG_I2C_BOARDINFO
+ static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
+ #if defined(CONFIG_JOYSTICK_AD7142) || defined(CONFIG_JOYSTICK_AD7142_MODULE)
+ {
+@@ -460,6 +461,7 @@
+ },
+ #endif
+ };
++#endif
+
+ static const unsigned int cclk_vlev_datasheet[] =
+ {
+@@ -548,8 +550,10 @@
+
+ printk(KERN_INFO "%s(): registering device resources\n", __func__);
+
++#ifdef CONFIG_I2C_BOARDINFO
+ i2c_register_board_info(0, bfin_i2c_board_info,
+ ARRAY_SIZE(bfin_i2c_board_info));
++#endif
+
+ ret = platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
+ if (ret < 0)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf533/include/mach/anomaly.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/include/mach/anomaly.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf533/include/mach/anomaly.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/include/mach/anomaly.h 2009-05-10 23:48:28.000000000 +0200
+@@ -2,7 +2,7 @@
+ * File: include/asm-blackfin/mach-bf533/anomaly.h
+ * Bugs: Enter bugs at http://blackfin.uclinux.org/
+ *
+- * Copyright (C) 2004-2009 Analog Devices Inc.
++ * Copyright (C) 2004-2008 Analog Devices Inc.
+ * Licensed under the GPL-2 or later.
+ */
+
+@@ -160,7 +160,7 @@
+ #define ANOMALY_05000301 (__SILICON_REVISION__ < 6)
+ /* SSYNCs After Writes To DMA MMR Registers May Not Be Handled Correctly */
+ #define ANOMALY_05000302 (__SILICON_REVISION__ < 5)
+-/* SPORT_HYS Bit in PLL_CTL Register Is Not Functional */
++/* New Feature: Additional Hysteresis on SPORT Input Pins (Not Available On Older Silicon) */
+ #define ANOMALY_05000305 (__SILICON_REVISION__ < 5)
+ /* New Feature: Additional PPI Frame Sync Sampling Options (Not Available On Older Silicon) */
+ #define ANOMALY_05000306 (__SILICON_REVISION__ < 5)
+@@ -278,12 +278,9 @@
+ #define ANOMALY_05000266 (0)
+ #define ANOMALY_05000323 (0)
+ #define ANOMALY_05000353 (1)
+-#define ANOMALY_05000380 (0)
+ #define ANOMALY_05000386 (1)
+ #define ANOMALY_05000412 (0)
+ #define ANOMALY_05000432 (0)
+ #define ANOMALY_05000435 (0)
+-#define ANOMALY_05000447 (0)
+-#define ANOMALY_05000448 (0)
+
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf533/include/mach/bfin_serial_5xx.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/include/mach/bfin_serial_5xx.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf533/include/mach/bfin_serial_5xx.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/include/mach/bfin_serial_5xx.h 2009-05-10 23:48:28.000000000 +0200
+@@ -134,7 +134,7 @@
+ CH_UART_TX,
+ CH_UART_RX,
+ #endif
+-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
++#ifdef CONFIG_BFIN_UART0_CTSRTS
+ CONFIG_UART0_CTS_PIN,
+ CONFIG_UART0_RTS_PIN,
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf533/include/mach/portmux.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/include/mach/portmux.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf533/include/mach/portmux.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf533/include/mach/portmux.h 2009-05-10 23:48:28.000000000 +0200
+@@ -54,11 +54,14 @@
+ #define P_SPI0_SSEL2 (P_DEFINED | P_IDENT(GPIO_PF2))
+ #define P_SPI0_SSEL1 (P_DEFINED | P_IDENT(GPIO_PF1))
+ #define P_SPI0_SS (P_DEFINED | P_IDENT(GPIO_PF0))
+-#define P_DEFAULT_BOOT_SPI_CS P_SPI0_SSEL2
+
+ #define P_TMR2 (P_DONTCARE)
+ #define P_TMR1 (P_DONTCARE)
+ #define P_TMR0 (P_DONTCARE)
+ #define P_TMRCLK (P_DEFINED | P_IDENT(GPIO_PF1))
+
++
++
++
++
+ #endif /* _MACH_PORTMUX_H_ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/cm_bf537.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/cm_bf537.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/cm_bf537.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/cm_bf537.c 2009-05-10 23:48:28.000000000 +0200
+@@ -108,9 +108,9 @@
+ };
+ #endif
+
+-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
+-static struct bfin5xx_spi_chip mmc_spi_chip_info = {
+- .enable_dma = 0,
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
++static struct bfin5xx_spi_chip spi_mmc_chip_info = {
++ .enable_dma = 1,
+ .bits_per_word = 8,
+ };
+ #endif
+@@ -160,13 +160,23 @@
+ },
+ #endif
+
+-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
+ {
+- .modalias = "mmc_spi",
+- .max_speed_hz = 20000000, /* max spi clock (SCK) speed in HZ */
++ .modalias = "spi_mmc_dummy",
++ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
+ .bus_num = 0,
+- .chip_select = 1,
+- .controller_data = &mmc_spi_chip_info,
++ .chip_select = 7,
++ .platform_data = NULL,
++ .controller_data = &spi_mmc_chip_info,
++ .mode = SPI_MODE_3,
++ },
++ {
++ .modalias = "spi_mmc",
++ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
++ .bus_num = 0,
++ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
++ .platform_data = NULL,
++ .controller_data = &spi_mmc_chip_info,
+ .mode = SPI_MODE_3,
+ },
+ #endif
+@@ -469,13 +479,8 @@
+ #endif
+
+ #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
+-static struct platform_device bfin_mii_bus = {
+- .name = "bfin_mii_bus",
+-};
+-
+ static struct platform_device bfin_mac_device = {
+ .name = "bfin_mac",
+- .dev.platform_data = &bfin_mii_bus,
+ };
+ #endif
+
+@@ -586,7 +591,6 @@
+ #endif
+
+ #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
+- &bfin_mii_bus,
+ &bfin_mac_device,
+ #endif
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/generic_board.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/generic_board.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/generic_board.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/generic_board.c 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,739 @@
++/*
++ * File: arch/blackfin/mach-bf537/boards/generic_board.c
++ * Based on: arch/blackfin/mach-bf533/boards/ezkit.c
++ * Author: Aidan Williams <aidan@nicta.com.au>
++ *
++ * Created:
++ * Description:
++ *
++ * Modified:
++ * Copyright 2005 National ICT Australia (NICTA)
++ * Copyright 2004-2008 Analog Devices Inc.
++ *
++ * Bugs: Enter bugs at http://blackfin.uclinux.org/
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, see the file COPYING, or write
++ * to the Free Software Foundation, Inc.,
++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#include <linux/device.h>
++#include <linux/etherdevice.h>
++#include <linux/platform_device.h>
++#include <linux/mtd/mtd.h>
++#include <linux/mtd/partitions.h>
++#include <linux/spi/spi.h>
++#include <linux/spi/flash.h>
++#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
++#include <linux/usb/isp1362.h>
++#endif
++#include <linux/irq.h>
++#include <linux/interrupt.h>
++#include <linux/usb/sl811.h>
++#include <asm/dma.h>
++#include <asm/bfin5xx_spi.h>
++#include <asm/reboot.h>
++#include <asm/portmux.h>
++#include <linux/spi/ad7877.h>
++
++/*
++ * Name the Board for the /proc/cpuinfo
++ */
++const char bfin_board_name[] = "UNKNOWN BOARD";
++
++/*
++ * Driver needs to know address, irq and flag pin.
++ */
++
++#if defined(CONFIG_USB_ISP1760_HCD) || defined(CONFIG_USB_ISP1760_HCD_MODULE)
++#include <linux/usb/isp1760.h>
++static struct resource bfin_isp1760_resources[] = {
++ [0] = {
++ .start = 0x203C0000,
++ .end = 0x203C0000 + 0x000fffff,
++ .flags = IORESOURCE_MEM,
++ },
++ [1] = {
++ .start = IRQ_PF7,
++ .end = IRQ_PF7,
++ .flags = IORESOURCE_IRQ,
++ },
++};
++
++static struct isp1760_platform_data isp1760_priv = {
++ .is_isp1761 = 0,
++ .port1_disable = 0,
++ .bus_width_16 = 1,
++ .port1_otg = 0,
++ .analog_oc = 0,
++ .dack_polarity_high = 0,
++ .dreq_polarity_high = 0,
++};
++
++static struct platform_device bfin_isp1760_device = {
++ .name = "isp1760-hcd",
++ .id = 0,
++ .dev = {
++ .platform_data = &isp1760_priv,
++ },
++ .num_resources = ARRAY_SIZE(bfin_isp1760_resources),
++ .resource = bfin_isp1760_resources,
++};
++#endif
++
++#if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE)
++static struct resource bfin_pcmcia_cf_resources[] = {
++ {
++ .start = 0x20310000, /* IO PORT */
++ .end = 0x20312000,
++ .flags = IORESOURCE_MEM,
++ }, {
++ .start = 0x20311000, /* Attribute Memory */
++ .end = 0x20311FFF,
++ .flags = IORESOURCE_MEM,
++ }, {
++ .start = IRQ_PF4,
++ .end = IRQ_PF4,
++ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
++ }, {
++ .start = 6, /* Card Detect PF6 */
++ .end = 6,
++ .flags = IORESOURCE_IRQ,
++ },
++};
++
++static struct platform_device bfin_pcmcia_cf_device = {
++ .name = "bfin_cf_pcmcia",
++ .id = -1,
++ .num_resources = ARRAY_SIZE(bfin_pcmcia_cf_resources),
++ .resource = bfin_pcmcia_cf_resources,
++};
++#endif
++
++#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
++static struct platform_device rtc_device = {
++ .name = "rtc-bfin",
++ .id = -1,
++};
++#endif
++
++#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
++static struct resource smc91x_resources[] = {
++ {
++ .name = "smc91x-regs",
++ .start = 0x20300300,
++ .end = 0x20300300 + 16,
++ .flags = IORESOURCE_MEM,
++ }, {
++
++ .start = IRQ_PF7,
++ .end = IRQ_PF7,
++ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
++ },
++};
++static struct platform_device smc91x_device = {
++ .name = "smc91x",
++ .id = 0,
++ .num_resources = ARRAY_SIZE(smc91x_resources),
++ .resource = smc91x_resources,
++};
++#endif
++
++#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
++static struct resource dm9000_resources[] = {
++ [0] = {
++ .start = 0x203FB800,
++ .end = 0x203FB800 + 1,
++ .flags = IORESOURCE_MEM,
++ },
++ [1] = {
++ .start = 0x203FB800 + 4,
++ .end = 0x203FB800 + 5,
++ .flags = IORESOURCE_MEM,
++ },
++ [2] = {
++ .start = IRQ_PF9,
++ .end = IRQ_PF9,
++ .flags = (IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE),
++ },
++};
++
++static struct platform_device dm9000_device = {
++ .name = "dm9000",
++ .id = -1,
++ .num_resources = ARRAY_SIZE(dm9000_resources),
++ .resource = dm9000_resources,
++};
++#endif
++
++#if defined(CONFIG_USB_SL811_HCD) || defined(CONFIG_USB_SL811_HCD_MODULE)
++static struct resource sl811_hcd_resources[] = {
++ {
++ .start = 0x20340000,
++ .end = 0x20340000,
++ .flags = IORESOURCE_MEM,
++ }, {
++ .start = 0x20340004,
++ .end = 0x20340004,
++ .flags = IORESOURCE_MEM,
++ }, {
++ .start = CONFIG_USB_SL811_BFIN_IRQ,
++ .end = CONFIG_USB_SL811_BFIN_IRQ,
++ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
++ },
++};
++
++#if defined(CONFIG_USB_SL811_BFIN_USE_VBUS)
++void sl811_port_power(struct device *dev, int is_on)
++{
++ gpio_request(CONFIG_USB_SL811_BFIN_GPIO_VBUS, "usb:SL811_VBUS");
++ gpio_direction_output(CONFIG_USB_SL811_BFIN_GPIO_VBUS, is_on);
++
++}
++#endif
++
++static struct sl811_platform_data sl811_priv = {
++ .potpg = 10,
++ .power = 250, /* == 500mA */
++#if defined(CONFIG_USB_SL811_BFIN_USE_VBUS)
++ .port_power = &sl811_port_power,
++#endif
++};
++
++static struct platform_device sl811_hcd_device = {
++ .name = "sl811-hcd",
++ .id = 0,
++ .dev = {
++ .platform_data = &sl811_priv,
++ },
++ .num_resources = ARRAY_SIZE(sl811_hcd_resources),
++ .resource = sl811_hcd_resources,
++};
++#endif
++
++#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
++static struct resource isp1362_hcd_resources[] = {
++ {
++ .start = 0x20360000,
++ .end = 0x20360000,
++ .flags = IORESOURCE_MEM,
++ }, {
++ .start = 0x20360004,
++ .end = 0x20360004,
++ .flags = IORESOURCE_MEM,
++ }, {
++ .start = CONFIG_USB_ISP1362_BFIN_GPIO_IRQ,
++ .end = CONFIG_USB_ISP1362_BFIN_GPIO_IRQ,
++ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
++ },
++};
++
++static struct isp1362_platform_data isp1362_priv = {
++ .sel15Kres = 1,
++ .clknotstop = 0,
++ .oc_enable = 0,
++ .int_act_high = 0,
++ .int_edge_triggered = 0,
++ .remote_wakeup_connected = 0,
++ .no_power_switching = 1,
++ .power_switching_mode = 0,
++};
++
++static struct platform_device isp1362_hcd_device = {
++ .name = "isp1362-hcd",
++ .id = 0,
++ .dev = {
++ .platform_data = &isp1362_priv,
++ },
++ .num_resources = ARRAY_SIZE(isp1362_hcd_resources),
++ .resource = isp1362_hcd_resources,
++};
++#endif
++
++#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
++static struct platform_device bfin_mac_device = {
++ .name = "bfin_mac",
++};
++#endif
++
++#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE)
++static struct resource net2272_bfin_resources[] = {
++ {
++ .start = 0x20300000,
++ .end = 0x20300000 + 0x100,
++ .flags = IORESOURCE_MEM,
++ }, {
++ .start = IRQ_PF7,
++ .end = IRQ_PF7,
++ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
++ },
++};
++
++static struct platform_device net2272_bfin_device = {
++ .name = "net2272",
++ .id = -1,
++ .num_resources = ARRAY_SIZE(net2272_bfin_resources),
++ .resource = net2272_bfin_resources,
++};
++#endif
++
++#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
++/* all SPI peripherals info goes here */
++
++#if defined(CONFIG_MTD_M25P80) \
++ || defined(CONFIG_MTD_M25P80_MODULE)
++static struct mtd_partition bfin_spi_flash_partitions[] = {
++ {
++ .name = "bootloader(spi)",
++ .size = 0x00020000,
++ .offset = 0,
++ .mask_flags = MTD_CAP_ROM
++ }, {
++ .name = "linux kernel(spi)",
++ .size = 0xe0000,
++ .offset = 0x20000
++ }, {
++ .name = "file system(spi)",
++ .size = 0x700000,
++ .offset = 0x00100000,
++ }
++};
++
++static struct flash_platform_data bfin_spi_flash_data = {
++ .name = "m25p80",
++ .parts = bfin_spi_flash_partitions,
++ .nr_parts = ARRAY_SIZE(bfin_spi_flash_partitions),
++ .type = "m25p64",
++};
++
++/* SPI flash chip (m25p64) */
++static struct bfin5xx_spi_chip spi_flash_chip_info = {
++ .enable_dma = 0, /* use dma transfer with this chip*/
++ .bits_per_word = 8,
++};
++#endif
++
++#if defined(CONFIG_SPI_ADC_BF533) \
++ || defined(CONFIG_SPI_ADC_BF533_MODULE)
++/* SPI ADC chip */
++static struct bfin5xx_spi_chip spi_adc_chip_info = {
++ .enable_dma = 1, /* use dma transfer with this chip*/
++ .bits_per_word = 16,
++};
++#endif
++
++#if defined(CONFIG_SND_BLACKFIN_AD1836) \
++ || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
++static struct bfin5xx_spi_chip ad1836_spi_chip_info = {
++ .enable_dma = 0,
++ .bits_per_word = 16,
++};
++#endif
++
++#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE)
++static struct bfin5xx_spi_chip ad9960_spi_chip_info = {
++ .enable_dma = 0,
++ .bits_per_word = 16,
++};
++#endif
++
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
++static struct bfin5xx_spi_chip spi_mmc_chip_info = {
++ .enable_dma = 1,
++ .bits_per_word = 8,
++};
++#endif
++
++#if defined(CONFIG_PBX)
++static struct bfin5xx_spi_chip spi_si3xxx_chip_info = {
++ .ctl_reg = 0x4, /* send zero */
++ .enable_dma = 0,
++ .bits_per_word = 8,
++ .cs_change_per_word = 1,
++};
++#endif
++
++#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
++static struct bfin5xx_spi_chip spi_ad7877_chip_info = {
++ .enable_dma = 0,
++ .bits_per_word = 16,
++};
++
++static const struct ad7877_platform_data bfin_ad7877_ts_info = {
++ .model = 7877,
++ .vref_delay_usecs = 50, /* internal, no capacitor */
++ .x_plate_ohms = 419,
++ .y_plate_ohms = 486,
++ .pressure_max = 1000,
++ .pressure_min = 0,
++ .stopacq_polarity = 1,
++ .first_conversion_delay = 3,
++ .acquisition_time = 1,
++ .averaging = 1,
++ .pen_down_acc_interval = 1,
++};
++#endif
++
++static struct spi_board_info bfin_spi_board_info[] __initdata = {
++#if defined(CONFIG_MTD_M25P80) \
++ || defined(CONFIG_MTD_M25P80_MODULE)
++ {
++ /* the modalias must be the same as spi device driver name */
++ .modalias = "m25p80", /* Name of spi_driver for this device */
++ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
++ .bus_num = 0, /* Framework bus number */
++ .chip_select = 1, /* Framework chip select. On STAMP537 it is SPISSEL1*/
++ .platform_data = &bfin_spi_flash_data,
++ .controller_data = &spi_flash_chip_info,
++ .mode = SPI_MODE_3,
++ },
++#endif
++
++#if defined(CONFIG_SPI_ADC_BF533) \
++ || defined(CONFIG_SPI_ADC_BF533_MODULE)
++ {
++ .modalias = "bfin_spi_adc", /* Name of spi_driver for this device */
++ .max_speed_hz = 6250000, /* max spi clock (SCK) speed in HZ */
++ .bus_num = 0, /* Framework bus number */
++ .chip_select = 1, /* Framework chip select. */
++ .platform_data = NULL, /* No spi_driver specific config */
++ .controller_data = &spi_adc_chip_info,
++ },
++#endif
++
++#if defined(CONFIG_SND_BLACKFIN_AD1836) \
++ || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
++ {
++ .modalias = "ad1836-spi",
++ .max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
++ .bus_num = 0,
++ .chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
++ .controller_data = &ad1836_spi_chip_info,
++ },
++#endif
++#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE)
++ {
++ .modalias = "ad9960-spi",
++ .max_speed_hz = 10000000, /* max spi clock (SCK) speed in HZ */
++ .bus_num = 0,
++ .chip_select = 1,
++ .controller_data = &ad9960_spi_chip_info,
++ },
++#endif
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
++ {
++ .modalias = "spi_mmc_dummy",
++ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
++ .bus_num = 0,
++ .chip_select = 0,
++ .platform_data = NULL,
++ .controller_data = &spi_mmc_chip_info,
++ .mode = SPI_MODE_3,
++ },
++ {
++ .modalias = "spi_mmc",
++ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
++ .bus_num = 0,
++ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
++ .platform_data = NULL,
++ .controller_data = &spi_mmc_chip_info,
++ .mode = SPI_MODE_3,
++ },
++#endif
++#if defined(CONFIG_PBX)
++ {
++ .modalias = "fxs-spi",
++ .max_speed_hz = 12500000, /* max spi clock (SCK) speed in HZ */
++ .bus_num = 0,
++ .chip_select = 8 - CONFIG_J11_JUMPER,
++ .controller_data = &spi_si3xxx_chip_info,
++ .mode = SPI_MODE_3,
++ },
++ {
++ .modalias = "fxo-spi",
++ .max_speed_hz = 12500000, /* max spi clock (SCK) speed in HZ */
++ .bus_num = 0,
++ .chip_select = 8 - CONFIG_J19_JUMPER,
++ .controller_data = &spi_si3xxx_chip_info,
++ .mode = SPI_MODE_3,
++ },
++#endif
++#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
++ {
++ .modalias = "ad7877",
++ .platform_data = &bfin_ad7877_ts_info,
++ .irq = IRQ_PF6,
++ .max_speed_hz = 12500000, /* max spi clock (SCK) speed in HZ */
++ .bus_num = 0,
++ .chip_select = 1,
++ .controller_data = &spi_ad7877_chip_info,
++ },
++#endif
++};
++
++/* SPI controller data */
++static struct bfin5xx_spi_master bfin_spi0_info = {
++ .num_chipselect = 8,
++ .enable_dma = 1, /* master has the ability to do dma transfer */
++ .pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0},
++};
++
++/* SPI (0) */
++static struct resource bfin_spi0_resource[] = {
++ [0] = {
++ .start = SPI0_REGBASE,
++ .end = SPI0_REGBASE + 0xFF,
++ .flags = IORESOURCE_MEM,
++ },
++ [1] = {
++ .start = CH_SPI,
++ .end = CH_SPI,
++ .flags = IORESOURCE_IRQ,
++ },
++};
++
++static struct platform_device bfin_spi0_device = {
++ .name = "bfin-spi",
++ .id = 0, /* Bus number */
++ .num_resources = ARRAY_SIZE(bfin_spi0_resource),
++ .resource = bfin_spi0_resource,
++ .dev = {
++ .platform_data = &bfin_spi0_info, /* Passed to driver */
++ },
++};
++#endif /* spi master and devices */
++
++#if defined(CONFIG_FB_BF537_LQ035) || defined(CONFIG_FB_BF537_LQ035_MODULE)
++static struct platform_device bfin_fb_device = {
++ .name = "bf537-lq035",
++};
++#endif
++
++#if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE)
++static struct platform_device bfin_fb_adv7393_device = {
++ .name = "bfin-adv7393",
++};
++#endif
++
++#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
++static struct resource bfin_uart_resources[] = {
++ {
++ .start = 0xFFC00400,
++ .end = 0xFFC004FF,
++ .flags = IORESOURCE_MEM,
++ }, {
++ .start = 0xFFC02000,
++ .end = 0xFFC020FF,
++ .flags = IORESOURCE_MEM,
++ },
++};
++
++static struct platform_device bfin_uart_device = {
++ .name = "bfin-uart",
++ .id = 1,
++ .num_resources = ARRAY_SIZE(bfin_uart_resources),
++ .resource = bfin_uart_resources,
++};
++#endif
++
++#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
++#ifdef CONFIG_BFIN_SIR0
++static struct resource bfin_sir0_resources[] = {
++ {
++ .start = 0xFFC00400,
++ .end = 0xFFC004FF,
++ .flags = IORESOURCE_MEM,
++ },
++ {
++ .start = IRQ_UART0_RX,
++ .end = IRQ_UART0_RX+1,
++ .flags = IORESOURCE_IRQ,
++ },
++ {
++ .start = CH_UART0_RX,
++ .end = CH_UART0_RX+1,
++ .flags = IORESOURCE_DMA,
++ },
++};
++
++static struct platform_device bfin_sir0_device = {
++ .name = "bfin_sir",
++ .id = 0,
++ .num_resources = ARRAY_SIZE(bfin_sir0_resources),
++ .resource = bfin_sir0_resources,
++};
++#endif
++#ifdef CONFIG_BFIN_SIR1
++static struct resource bfin_sir1_resources[] = {
++ {
++ .start = 0xFFC02000,
++ .end = 0xFFC020FF,
++ .flags = IORESOURCE_MEM,
++ },
++ {
++ .start = IRQ_UART1_RX,
++ .end = IRQ_UART1_RX+1,
++ .flags = IORESOURCE_IRQ,
++ },
++ {
++ .start = CH_UART1_RX,
++ .end = CH_UART1_RX+1,
++ .flags = IORESOURCE_DMA,
++ },
++};
++
++static struct platform_device bfin_sir1_device = {
++ .name = "bfin_sir",
++ .id = 1,
++ .num_resources = ARRAY_SIZE(bfin_sir1_resources),
++ .resource = bfin_sir1_resources,
++};
++#endif
++#endif
++
++#if defined(CONFIG_I2C_BLACKFIN_TWI) || defined(CONFIG_I2C_BLACKFIN_TWI_MODULE)
++static struct resource bfin_twi0_resource[] = {
++ [0] = {
++ .start = TWI0_REGBASE,
++ .end = TWI0_REGBASE + 0xFF,
++ .flags = IORESOURCE_MEM,
++ },
++ [1] = {
++ .start = IRQ_TWI,
++ .end = IRQ_TWI,
++ .flags = IORESOURCE_IRQ,
++ },
++};
++
++static struct platform_device i2c_bfin_twi_device = {
++ .name = "i2c-bfin-twi",
++ .id = 0,
++ .num_resources = ARRAY_SIZE(bfin_twi0_resource),
++ .resource = bfin_twi0_resource,
++};
++#endif
++
++#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
++static struct platform_device bfin_sport0_uart_device = {
++ .name = "bfin-sport-uart",
++ .id = 0,
++};
++
++static struct platform_device bfin_sport1_uart_device = {
++ .name = "bfin-sport-uart",
++ .id = 1,
++};
++#endif
++
++static struct platform_device *stamp_devices[] __initdata = {
++#if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE)
++ &bfin_pcmcia_cf_device,
++#endif
++
++#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
++ &rtc_device,
++#endif
++
++#if defined(CONFIG_USB_SL811_HCD) || defined(CONFIG_USB_SL811_HCD_MODULE)
++ &sl811_hcd_device,
++#endif
++
++#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
++ &isp1362_hcd_device,
++#endif
++
++#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
++ &smc91x_device,
++#endif
++
++#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
++ &dm9000_device,
++#endif
++
++#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
++ &bfin_mac_device,
++#endif
++
++#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE)
++ &net2272_bfin_device,
++#endif
++
++#if defined(CONFIG_USB_ISP1760_HCD) || defined(CONFIG_USB_ISP1760_HCD_MODULE)
++ &bfin_isp1760_device,
++#endif
++
++#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
++ &bfin_spi0_device,
++#endif
++
++#if defined(CONFIG_FB_BF537_LQ035) || defined(CONFIG_FB_BF537_LQ035_MODULE)
++ &bfin_fb_device,
++#endif
++
++#if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE)
++ &bfin_fb_adv7393_device,
++#endif
++
++#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
++ &bfin_uart_device,
++#endif
++
++#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
++#ifdef CONFIG_BFIN_SIR0
++ &bfin_sir0_device,
++#endif
++#ifdef CONFIG_BFIN_SIR1
++ &bfin_sir1_device,
++#endif
++#endif
++
++#if defined(CONFIG_I2C_BLACKFIN_TWI) || defined(CONFIG_I2C_BLACKFIN_TWI_MODULE)
++ &i2c_bfin_twi_device,
++#endif
++
++#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
++ &bfin_sport0_uart_device,
++ &bfin_sport1_uart_device,
++#endif
++};
++
++static int __init stamp_init(void)
++{
++ printk(KERN_INFO "%s(): registering device resources\n", __func__);
++ platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
++#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
++ spi_register_board_info(bfin_spi_board_info,
++ ARRAY_SIZE(bfin_spi_board_info));
++#endif
++
++ return 0;
++}
++
++arch_initcall(stamp_init);
++
++void native_machine_restart(char *cmd)
++{
++ /* workaround reboot hang when booting from SPI */
++ if ((bfin_read_SYSCR() & 0x7) == 0x3)
++ bfin_gpio_reset_spi0_ssel1();
++}
++
++#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
++void bfin_get_ether_addr(char *addr)
++{
++ random_ether_addr(addr);
++ printk(KERN_WARNING "%s:%s: Setting Ethernet MAC to a random one\n", __FILE__, __func__);
++}
++EXPORT_SYMBOL(bfin_get_ether_addr);
++#endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/Kconfig linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/Kconfig
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/Kconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -33,4 +33,9 @@
+ help
+ Board supply package for CSP Minotaur
+
++config GENERIC_BF537_BOARD
++ bool "Generic"
++ help
++ Generic or Custom board support.
++
+ endchoice
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/Makefile linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/Makefile
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/Makefile 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/Makefile 2009-05-10 23:48:28.000000000 +0200
+@@ -2,6 +2,7 @@
+ # arch/blackfin/mach-bf537/boards/Makefile
+ #
+
++obj-$(CONFIG_GENERIC_BF537_BOARD) += generic_board.o
+ obj-$(CONFIG_BFIN537_STAMP) += stamp.o
+ obj-$(CONFIG_BFIN537_BLUETECHNIX_CM) += cm_bf537.o
+ obj-$(CONFIG_BFIN537_BLUETECHNIX_TCM) += tcm_bf537.o
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/minotaur.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/minotaur.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/minotaur.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/minotaur.c 2009-05-10 23:48:28.000000000 +0200
+@@ -61,13 +61,8 @@
+ #endif
+
+ #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
+-static struct platform_device bfin_mii_bus = {
+- .name = "bfin_mii_bus",
+-};
+-
+ static struct platform_device bfin_mac_device = {
+ .name = "bfin_mac",
+- .dev.platform_data = &bfin_mii_bus,
+ };
+ #endif
+
+@@ -134,9 +129,9 @@
+ };
+ #endif
+
+-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
+-static struct bfin5xx_spi_chip mmc_spi_chip_info = {
+- .enable_dma = 0,
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
++static struct bfin5xx_spi_chip spi_mmc_chip_info = {
++ .enable_dma = 1,
+ .bits_per_word = 8,
+ };
+ #endif
+@@ -156,13 +151,23 @@
+ },
+ #endif
+
+-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
++ {
++ .modalias = "spi_mmc_dummy",
++ .max_speed_hz = 5000000, /* max spi clock (SCK) speed in HZ */
++ .bus_num = 0,
++ .chip_select = 0,
++ .platform_data = NULL,
++ .controller_data = &spi_mmc_chip_info,
++ .mode = SPI_MODE_3,
++ },
+ {
+- .modalias = "mmc_spi",
++ .modalias = "spi_mmc",
+ .max_speed_hz = 5000000, /* max spi clock (SCK) speed in HZ */
+ .bus_num = 0,
+- .chip_select = 5,
+- .controller_data = &mmc_spi_chip_info,
++ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
++ .platform_data = NULL,
++ .controller_data = &spi_mmc_chip_info,
+ .mode = SPI_MODE_3,
+ },
+ #endif
+@@ -319,7 +324,6 @@
+ #endif
+
+ #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
+- &bfin_mii_bus,
+ &bfin_mac_device,
+ #endif
+
+@@ -373,5 +377,5 @@
+ {
+ /* workaround reboot hang when booting from SPI */
+ if ((bfin_read_SYSCR() & 0x7) == 0x3)
+- bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
++ bfin_gpio_reset_spi0_ssel1();
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/pnav10.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/pnav10.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/pnav10.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/pnav10.c 2009-05-10 23:48:28.000000000 +0200
+@@ -198,13 +198,8 @@
+ #endif
+
+ #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
+-static struct platform_device bfin_mii_bus = {
+- .name = "bfin_mii_bus",
+-};
+-
+ static struct platform_device bfin_mac_device = {
+ .name = "bfin_mac",
+- .dev.platform_data = &bfin_mii_bus,
+ };
+ #endif
+
+@@ -289,9 +284,9 @@
+ };
+ #endif
+
+-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
+-static struct bfin5xx_spi_chip mmc_spi_chip_info = {
+- .enable_dma = 0,
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
++static struct bfin5xx_spi_chip spi_mmc_chip_info = {
++ .enable_dma = 1,
+ .bits_per_word = 8,
+ };
+ #endif
+@@ -364,13 +359,23 @@
+ .controller_data = &ad9960_spi_chip_info,
+ },
+ #endif
+-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
++ {
++ .modalias = "spi_mmc_dummy",
++ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
++ .bus_num = 0,
++ .chip_select = 7,
++ .platform_data = NULL,
++ .controller_data = &spi_mmc_chip_info,
++ .mode = SPI_MODE_3,
++ },
+ {
+- .modalias = "mmc_spi",
++ .modalias = "spi_mmc",
+ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
+ .bus_num = 0,
+- .chip_select = 5,
+- .controller_data = &mmc_spi_chip_info,
++ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
++ .platform_data = NULL,
++ .controller_data = &spi_mmc_chip_info,
+ .mode = SPI_MODE_3,
+ },
+ #endif
+@@ -524,7 +529,6 @@
+ #endif
+
+ #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
+- &bfin_mii_bus,
+ &bfin_mac_device,
+ #endif
+
+@@ -554,7 +558,7 @@
+ #endif
+ };
+
+-static int __init pnav_init(void)
++static int __init stamp_init(void)
+ {
+ printk(KERN_INFO "%s(): registering device resources\n", __func__);
+ platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
+@@ -565,7 +569,7 @@
+ return 0;
+ }
+
+-arch_initcall(pnav_init);
++arch_initcall(stamp_init);
+
+ void bfin_get_ether_addr(char *addr)
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/stamp.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/stamp.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/stamp.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/stamp.c 2009-05-10 23:48:28.000000000 +0200
+@@ -321,13 +321,8 @@
+ #endif
+
+ #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
+-static struct platform_device bfin_mii_bus = {
+- .name = "bfin_mii_bus",
+-};
+-
+ static struct platform_device bfin_mac_device = {
+ .name = "bfin_mac",
+- .dev.platform_data = &bfin_mii_bus,
+ };
+ #endif
+
+@@ -1073,6 +1068,7 @@
+ };
+ #endif
+
++#ifdef CONFIG_I2C_BOARDINFO
+ static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
+ #if defined(CONFIG_JOYSTICK_AD7142) || defined(CONFIG_JOYSTICK_AD7142_MODULE)
+ {
+@@ -1106,6 +1102,7 @@
+ },
+ #endif
+ };
++#endif
+
+ #if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
+ static struct platform_device bfin_sport0_uart_device = {
+@@ -1220,7 +1217,6 @@
+ #endif
+
+ #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
+- &bfin_mii_bus,
+ &bfin_mac_device,
+ #endif
+
+@@ -1288,8 +1284,12 @@
+ static int __init stamp_init(void)
+ {
+ printk(KERN_INFO "%s(): registering device resources\n", __func__);
++
++#ifdef CONFIG_I2C_BOARDINFO
+ i2c_register_board_info(0, bfin_i2c_board_info,
+ ARRAY_SIZE(bfin_i2c_board_info));
++#endif
++
+ bfin_plat_nand_init();
+ platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
+ spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
+@@ -1307,7 +1307,7 @@
+ {
+ /* workaround reboot hang when booting from SPI */
+ if ((bfin_read_SYSCR() & 0x7) == 0x3)
+- bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
++ bfin_gpio_reset_spi0_ssel1();
+ }
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/tcm_bf537.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/tcm_bf537.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf537/boards/tcm_bf537.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/boards/tcm_bf537.c 2009-05-10 23:48:28.000000000 +0200
+@@ -108,9 +108,9 @@
+ };
+ #endif
+
+-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
+-static struct bfin5xx_spi_chip mmc_spi_chip_info = {
+- .enable_dma = 0,
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
++static struct bfin5xx_spi_chip spi_mmc_chip_info = {
++ .enable_dma = 1,
+ .bits_per_word = 8,
+ };
+ #endif
+@@ -160,13 +160,23 @@
+ },
+ #endif
+
+-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
+ {
+- .modalias = "mmc_spi",
++ .modalias = "spi_mmc_dummy",
+ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
+ .bus_num = 0,
+- .chip_select = 5,
+- .controller_data = &mmc_spi_chip_info,
++ .chip_select = 7,
++ .platform_data = NULL,
++ .controller_data = &spi_mmc_chip_info,
++ .mode = SPI_MODE_3,
++ },
++ {
++ .modalias = "spi_mmc",
++ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
++ .bus_num = 0,
++ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
++ .platform_data = NULL,
++ .controller_data = &spi_mmc_chip_info,
+ .mode = SPI_MODE_3,
+ },
+ #endif
+@@ -471,13 +481,8 @@
+ #endif
+
+ #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
+-static struct platform_device bfin_mii_bus = {
+- .name = "bfin_mii_bus",
+-};
+-
+ static struct platform_device bfin_mac_device = {
+ .name = "bfin_mac",
+- .dev.platform_data = &bfin_mii_bus,
+ };
+ #endif
+
+@@ -588,7 +593,6 @@
+ #endif
+
+ #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
+- &bfin_mii_bus,
+ &bfin_mac_device,
+ #endif
+
+@@ -611,7 +615,7 @@
+ &bfin_gpios_device,
+ };
+
+-static int __init tcm_bf537_init(void)
++static int __init cm_bf537_init(void)
+ {
+ printk(KERN_INFO "%s(): registering device resources\n", __func__);
+ platform_add_devices(cm_bf537_devices, ARRAY_SIZE(cm_bf537_devices));
+@@ -625,7 +629,7 @@
+ return 0;
+ }
+
+-arch_initcall(tcm_bf537_init);
++arch_initcall(cm_bf537_init);
+
+ void bfin_get_ether_addr(char *addr)
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf537/include/mach/anomaly.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/include/mach/anomaly.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf537/include/mach/anomaly.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/include/mach/anomaly.h 2009-05-10 23:48:28.000000000 +0200
+@@ -2,7 +2,7 @@
+ * File: include/asm-blackfin/mach-bf537/anomaly.h
+ * Bugs: Enter bugs at http://blackfin.uclinux.org/
+ *
+- * Copyright (C) 2004-2009 Analog Devices Inc.
++ * Copyright (C) 2004-2008 Analog Devices Inc.
+ * Licensed under the GPL-2 or later.
+ */
+
+@@ -110,7 +110,7 @@
+ #define ANOMALY_05000301 (1)
+ /* SSYNCs After Writes To CAN/DMA MMR Registers Are Not Always Handled Correctly */
+ #define ANOMALY_05000304 (__SILICON_REVISION__ < 3)
+-/* SPORT_HYS Bit in PLL_CTL Register Is Not Functional */
++/* New Feature: Additional Hysteresis on SPORT Input Pins (Not Available On Older Silicon) */
+ #define ANOMALY_05000305 (__SILICON_REVISION__ < 3)
+ /* SCKELOW Bit Does Not Maintain State Through Hibernate */
+ #define ANOMALY_05000307 (__SILICON_REVISION__ < 3)
+@@ -168,12 +168,9 @@
+ #define ANOMALY_05000323 (0)
+ #define ANOMALY_05000353 (1)
+ #define ANOMALY_05000363 (0)
+-#define ANOMALY_05000380 (0)
+ #define ANOMALY_05000386 (1)
+ #define ANOMALY_05000412 (0)
+ #define ANOMALY_05000432 (0)
+ #define ANOMALY_05000435 (0)
+-#define ANOMALY_05000447 (0)
+-#define ANOMALY_05000448 (0)
+
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf537/include/mach/bfin_serial_5xx.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/include/mach/bfin_serial_5xx.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf537/include/mach/bfin_serial_5xx.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/include/mach/bfin_serial_5xx.h 2009-05-10 23:48:28.000000000 +0200
+@@ -144,7 +144,7 @@
+ CH_UART0_TX,
+ CH_UART0_RX,
+ #endif
+-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
++#ifdef CONFIG_BFIN_UART0_CTSRTS
+ CONFIG_UART0_CTS_PIN,
+ CONFIG_UART0_RTS_PIN,
+ #endif
+@@ -158,7 +158,7 @@
+ CH_UART1_TX,
+ CH_UART1_RX,
+ #endif
+-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
++#ifdef CONFIG_BFIN_UART1_CTSRTS
+ CONFIG_UART1_CTS_PIN,
+ CONFIG_UART1_RTS_PIN,
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf537/include/mach/portmux.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/include/mach/portmux.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf537/include/mach/portmux.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf537/include/mach/portmux.h 2009-05-10 23:48:28.000000000 +0200
+@@ -31,7 +31,6 @@
+ #define P_PPI0_FS1 (P_DEFINED | P_IDENT(GPIO_PF9) | P_FUNCT(1))
+ #define P_TACLK0 (P_DEFINED | P_IDENT(GPIO_PF14) | P_FUNCT(1))
+ #define P_TMRCLK (P_DEFINED | P_IDENT(GPIO_PF15) | P_FUNCT(1))
+-#define P_DEFAULT_BOOT_SPI_CS P_SPI0_SSEL1
+
+ #define P_PPI0_D0 (P_DEFINED | P_IDENT(GPIO_PG0) | P_FUNCT(0))
+ #define P_PPI0_D1 (P_DEFINED | P_IDENT(GPIO_PG1) | P_FUNCT(0))
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf538/include/mach/anomaly.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf538/include/mach/anomaly.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf538/include/mach/anomaly.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf538/include/mach/anomaly.h 2009-05-10 23:48:28.000000000 +0200
+@@ -2,7 +2,7 @@
+ * File: include/asm-blackfin/mach-bf538/anomaly.h
+ * Bugs: Enter bugs at http://blackfin.uclinux.org/
+ *
+- * Copyright (C) 2004-2009 Analog Devices Inc.
++ * Copyright (C) 2004-2008 Analog Devices Inc.
+ * Licensed under the GPL-2 or later.
+ */
+
+@@ -120,17 +120,13 @@
+ #define ANOMALY_05000198 (0)
+ #define ANOMALY_05000230 (0)
+ #define ANOMALY_05000263 (0)
+-#define ANOMALY_05000305 (0)
+ #define ANOMALY_05000311 (0)
+ #define ANOMALY_05000323 (0)
+ #define ANOMALY_05000353 (1)
+ #define ANOMALY_05000363 (0)
+-#define ANOMALY_05000380 (0)
+ #define ANOMALY_05000386 (1)
+ #define ANOMALY_05000412 (0)
+ #define ANOMALY_05000432 (0)
+ #define ANOMALY_05000435 (0)
+-#define ANOMALY_05000447 (0)
+-#define ANOMALY_05000448 (0)
+
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf538/include/mach/bfin_serial_5xx.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf538/include/mach/bfin_serial_5xx.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf538/include/mach/bfin_serial_5xx.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf538/include/mach/bfin_serial_5xx.h 2009-05-10 23:48:28.000000000 +0200
+@@ -144,7 +144,7 @@
+ CH_UART0_TX,
+ CH_UART0_RX,
+ #endif
+-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
++#ifdef CONFIG_BFIN_UART0_CTSRTS
+ CONFIG_UART0_CTS_PIN,
+ CONFIG_UART0_RTS_PIN,
+ #endif
+@@ -158,7 +158,7 @@
+ CH_UART1_TX,
+ CH_UART1_RX,
+ #endif
+-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
++#ifdef CONFIG_BFIN_UART1_CTSRTS
+ CONFIG_UART1_CTS_PIN,
+ CONFIG_UART1_RTS_PIN,
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf538/include/mach/portmux.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf538/include/mach/portmux.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf538/include/mach/portmux.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf538/include/mach/portmux.h 2009-05-10 23:48:28.000000000 +0200
+@@ -102,6 +102,5 @@
+ #define P_SPI0_SSEL2 (P_DEFINED | P_IDENT(GPIO_PF2))
+ #define P_SPI0_SSEL1 (P_DEFINED | P_IDENT(GPIO_PF1))
+ #define P_SPI0_SS (P_DEFINED | P_IDENT(GPIO_PF0))
+-#define P_DEFAULT_BOOT_SPI_CS P_SPI0_SSEL2
+
+ #endif /* _MACH_PORTMUX_H_ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf548/boards/ezkit.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/boards/ezkit.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf548/boards/ezkit.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/boards/ezkit.c 2009-05-10 23:48:28.000000000 +0200
+@@ -781,6 +781,7 @@
+ #endif
+ #endif
+
++#ifdef CONFIG_I2C_BOARDINFO
+ static struct i2c_board_info __initdata bfin_i2c_board_info0[] = {
+ };
+
+@@ -799,6 +800,7 @@
+ #endif
+ };
+ #endif
++#endif
+
+ #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
+ #include <linux/gpio_keys.h>
+@@ -954,12 +956,14 @@
+ {
+ printk(KERN_INFO "%s(): registering device resources\n", __func__);
+
++#ifdef CONFIG_I2C_BOARDINFO
+ i2c_register_board_info(0, bfin_i2c_board_info0,
+ ARRAY_SIZE(bfin_i2c_board_info0));
+ #if !defined(CONFIG_BF542) /* The BF542 only has 1 TWI */
+ i2c_register_board_info(1, bfin_i2c_board_info1,
+ ARRAY_SIZE(bfin_i2c_board_info1));
+ #endif
++#endif
+
+ platform_add_devices(ezkit_devices, ARRAY_SIZE(ezkit_devices));
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/anomaly.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/anomaly.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/anomaly.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/anomaly.h 2009-05-10 23:48:28.000000000 +0200
+@@ -2,12 +2,12 @@
+ * File: include/asm-blackfin/mach-bf548/anomaly.h
+ * Bugs: Enter bugs at http://blackfin.uclinux.org/
+ *
+- * Copyright (C) 2004-2009 Analog Devices Inc.
++ * Copyright (C) 2004-2008 Analog Devices Inc.
+ * Licensed under the GPL-2 or later.
+ */
+
+ /* This file shoule be up to date with:
+- * - Revision H, 01/16/2009; ADSP-BF542/BF544/BF547/BF548/BF549 Blackfin Processor Anomaly List
++ * - Revision G, 08/07/2008; ADSP-BF542/BF544/BF547/BF548/BF549 Blackfin Processor Anomaly List
+ */
+
+ #ifndef _MACH_ANOMALY_H_
+@@ -91,6 +91,8 @@
+ #define ANOMALY_05000371 (__SILICON_REVISION__ < 2)
+ /* USB DP/DM Data Pins May Lose State When Entering Hibernate */
+ #define ANOMALY_05000372 (__SILICON_REVISION__ < 1)
++/* Mobile DDR Operation Not Functional */
++#define ANOMALY_05000377 (1)
+ /* Security/Authentication Speedpath Causes Authentication To Fail To Initiate */
+ #define ANOMALY_05000378 (__SILICON_REVISION__ < 2)
+ /* 16-Bit NAND FLASH Boot Mode Is Not Functional */
+@@ -155,22 +157,8 @@
+ #define ANOMALY_05000429 (__SILICON_REVISION__ < 2)
+ /* Software System Reset Corrupts PLL_LOCKCNT Register */
+ #define ANOMALY_05000430 (__SILICON_REVISION__ >= 2)
+-/* Incorrect Use of Stack in Lockbox Firmware During Authentication */
+-#define ANOMALY_05000431 (__SILICON_REVISION__ < 3)
+-/* OTP Write Accesses Not Supported */
+-#define ANOMALY_05000442 (__SILICON_REVISION__ < 1)
+ /* IFLUSH Instruction at End of Hardware Loop Causes Infinite Stall */
+ #define ANOMALY_05000443 (1)
+-/* CDMAPRIO and L2DMAPRIO Bits in the SYSCR Register Are Not Functional */
+-#define ANOMALY_05000446 (1)
+-/* UART IrDA Receiver Fails on Extended Bit Pulses */
+-#define ANOMALY_05000447 (1)
+-/* DDR Clock Duty Cycle Spec Violation (tCH, tCL) */
+-#define ANOMALY_05000448 (__SILICON_REVISION__ == 1)
+-/* Reduced Timing Margins on DDR Output Setup and Hold (tDS and tDH) */
+-#define ANOMALY_05000449 (__SILICON_REVISION__ == 1)
+-/* USB DMA Mode 1 Short Packet Data Corruption */
+-#define ANOMALY_05000450 (1
+
+ /* Anomalies that don't exist on this proc */
+ #define ANOMALY_05000125 (0)
+@@ -183,13 +171,10 @@
+ #define ANOMALY_05000263 (0)
+ #define ANOMALY_05000266 (0)
+ #define ANOMALY_05000273 (0)
+-#define ANOMALY_05000278 (0)
+-#define ANOMALY_05000305 (0)
+ #define ANOMALY_05000307 (0)
+ #define ANOMALY_05000311 (0)
+ #define ANOMALY_05000323 (0)
+ #define ANOMALY_05000363 (0)
+-#define ANOMALY_05000380 (0)
+ #define ANOMALY_05000412 (0)
+ #define ANOMALY_05000432 (0)
+ #define ANOMALY_05000435 (0)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/bf548.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/bf548.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/bf548.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/bf548.h 2009-05-10 23:48:28.000000000 +0200
+@@ -104,18 +104,6 @@
+
+ #define AMGCTLVAL (V_AMBEN | V_AMCKEN)
+
+-#if defined(CONFIG_BF542M)
+-# define CONFIG_BF542
+-#elif defined(CONFIG_BF544M)
+-# define CONFIG_BF544
+-#elif defined(CONFIG_BF547M)
+-# define CONFIG_BF547
+-#elif defined(CONFIG_BF548M)
+-# define CONFIG_BF548
+-#elif defined(CONFIG_BF549M)
+-# define CONFIG_BF549
+-#endif
+-
+ #if defined(CONFIG_BF542)
+ # define CPU "BF542"
+ # define CPUID 0x27de
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/bfin_serial_5xx.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/bfin_serial_5xx.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/bfin_serial_5xx.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/bfin_serial_5xx.h 2009-05-10 23:48:28.000000000 +0200
+@@ -63,7 +63,7 @@
+ #define UART_ENABLE_INTS(x, v) UART_SET_IER(x, v)
+ #define UART_DISABLE_INTS(x) UART_CLEAR_IER(x, 0xF)
+
+-#if defined(CONFIG_BFIN_UART0_CTSRTS) || defined(CONFIG_BFIN_UART2_CTSRTS)
++#if defined(CONFIG_BFIN_UART0_CTSRTS) || defined(CONFIG_BFIN_UART1_CTSRTS)
+ # define CONFIG_SERIAL_BFIN_CTSRTS
+
+ # ifndef CONFIG_UART0_CTS_PIN
+@@ -74,12 +74,12 @@
+ # define CONFIG_UART0_RTS_PIN -1
+ # endif
+
+-# ifndef CONFIG_UART2_CTS_PIN
+-# define CONFIG_UART2_CTS_PIN -1
++# ifndef CONFIG_UART1_CTS_PIN
++# define CONFIG_UART1_CTS_PIN -1
+ # endif
+
+-# ifndef CONFIG_UART2_RTS_PIN
+-# define CONFIG_UART2_RTS_PIN -1
++# ifndef CONFIG_UART1_RTS_PIN
++# define CONFIG_UART1_RTS_PIN -1
+ # endif
+ #endif
+
+@@ -130,7 +130,7 @@
+ CH_UART0_TX,
+ CH_UART0_RX,
+ #endif
+-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
++#ifdef CONFIG_BFIN_UART0_CTSRTS
+ CONFIG_UART0_CTS_PIN,
+ CONFIG_UART0_RTS_PIN,
+ #endif
+@@ -144,10 +144,6 @@
+ CH_UART1_TX,
+ CH_UART1_RX,
+ #endif
+-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
+- 0,
+- 0,
+-#endif
+ },
+ #endif
+ #ifdef CONFIG_SERIAL_BFIN_UART2
+@@ -158,7 +154,7 @@
+ CH_UART2_TX,
+ CH_UART2_RX,
+ #endif
+-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
++#ifdef CONFIG_BFIN_UART2_CTSRTS
+ CONFIG_UART2_CTS_PIN,
+ CONFIG_UART2_RTS_PIN,
+ #endif
+@@ -172,10 +168,6 @@
+ CH_UART3_TX,
+ CH_UART3_RX,
+ #endif
+-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
+- 0,
+- 0,
+-#endif
+ },
+ #endif
+ };
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/gpio.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/gpio.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/gpio.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/gpio.h 2009-05-10 23:48:28.000000000 +0200
+@@ -195,17 +195,17 @@
+ struct gpio_port_t {
+ unsigned short port_fer;
+ unsigned short dummy1;
+- unsigned short data;
++ unsigned short port_data;
+ unsigned short dummy2;
+- unsigned short data_set;
++ unsigned short port_set;
+ unsigned short dummy3;
+- unsigned short data_clear;
++ unsigned short port_clear;
+ unsigned short dummy4;
+- unsigned short dir_set;
++ unsigned short port_dir_set;
+ unsigned short dummy5;
+- unsigned short dir_clear;
++ unsigned short port_dir_clear;
+ unsigned short dummy6;
+- unsigned short inen;
++ unsigned short port_inen;
+ unsigned short dummy7;
+ unsigned int port_mux;
+ };
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/irq.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/irq.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/irq.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/irq.h 2009-05-10 23:48:28.000000000 +0200
+@@ -123,8 +123,8 @@
+ #define IRQ_MXVR_ERROR BFIN_IRQ(51) /* MXVR Status (Error) Interrupt */
+ #define IRQ_MXVR_MSG BFIN_IRQ(52) /* MXVR Message Interrupt */
+ #define IRQ_MXVR_PKT BFIN_IRQ(53) /* MXVR Packet Interrupt */
+-#define IRQ_EPPI1_ERROR BFIN_IRQ(54) /* EPPI1 Error Interrupt */
+-#define IRQ_EPPI2_ERROR BFIN_IRQ(55) /* EPPI2 Error Interrupt */
++#define IRQ_EPP1_ERROR BFIN_IRQ(54) /* EPPI1 Error Interrupt */
++#define IRQ_EPP2_ERROR BFIN_IRQ(55) /* EPPI2 Error Interrupt */
+ #define IRQ_UART3_ERROR BFIN_IRQ(56) /* UART3 Status (Error) Interrupt */
+ #define IRQ_HOST_ERROR BFIN_IRQ(57) /* HOST Status (Error) Interrupt */
+ #define IRQ_PIXC_ERROR BFIN_IRQ(59) /* PIXC Status (Error) Interrupt */
+@@ -361,8 +361,8 @@
+ #define IRQ_UART2_ERR IRQ_UART2_ERROR
+ #define IRQ_CAN0_ERR IRQ_CAN0_ERROR
+ #define IRQ_MXVR_ERR IRQ_MXVR_ERROR
+-#define IRQ_EPPI1_ERR IRQ_EPPI1_ERROR
+-#define IRQ_EPPI2_ERR IRQ_EPPI2_ERROR
++#define IRQ_EPP1_ERR IRQ_EPP1_ERROR
++#define IRQ_EPP2_ERR IRQ_EPP2_ERROR
+ #define IRQ_UART3_ERR IRQ_UART3_ERROR
+ #define IRQ_HOST_ERR IRQ_HOST_ERROR
+ #define IRQ_PIXC_ERR IRQ_PIXC_ERROR
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/portmux.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/portmux.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf548/include/mach/portmux.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf548/include/mach/portmux.h 2009-05-10 23:48:28.000000000 +0200
+@@ -125,7 +125,6 @@
+ #define P_KEY_COL2 (P_DEFINED | P_IDENT(GPIO_PD14) | P_FUNCT(3))
+ #define P_KEY_COL3 (P_DEFINED | P_IDENT(GPIO_PD15) | P_FUNCT(3))
+
+-#define P_DEFAULT_BOOT_SPI_CS P_SPI0_SSEL1
+ #define P_SPI0_SCK (P_DEFINED | P_IDENT(GPIO_PE0) | P_FUNCT(0))
+ #define P_SPI0_MISO (P_DEFINED | P_IDENT(GPIO_PE1) | P_FUNCT(0))
+ #define P_SPI0_MOSI (P_DEFINED | P_IDENT(GPIO_PE2) | P_FUNCT(0))
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf561/boards/cm_bf561.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/boards/cm_bf561.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf561/boards/cm_bf561.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/boards/cm_bf561.c 2009-05-10 23:48:28.000000000 +0200
+@@ -105,9 +105,9 @@
+ };
+ #endif
+
+-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
+-static struct bfin5xx_spi_chip mmc_spi_chip_info = {
+- .enable_dma = 0,
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
++static struct bfin5xx_spi_chip spi_mmc_chip_info = {
++ .enable_dma = 1,
+ .bits_per_word = 8,
+ };
+ #endif
+@@ -155,13 +155,14 @@
+ .controller_data = &ad9960_spi_chip_info,
+ },
+ #endif
+-#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
++#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE)
+ {
+- .modalias = "mmc_spi",
++ .modalias = "spi_mmc",
+ .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
+ .bus_num = 0,
+- .chip_select = 5,
+- .controller_data = &mmc_spi_chip_info,
++ .chip_select = CONFIG_SPI_MMC_CS_CHAN,
++ .platform_data = NULL,
++ .controller_data = &spi_mmc_chip_info,
+ .mode = SPI_MODE_3,
+ },
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf561/boards/generic_board.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/boards/generic_board.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf561/boards/generic_board.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/boards/generic_board.c 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,113 @@
++/*
++ * File: arch/blackfin/mach-bf561/generic_board.c
++ * Based on: arch/blackfin/mach-bf533/ezkit.c
++ * Author: Aidan Williams <aidan@nicta.com.au>
++ *
++ * Created:
++ * Description:
++ *
++ * Modified:
++ * Copyright 2005 National ICT Australia (NICTA)
++ * Copyright 2004-2006 Analog Devices Inc.
++ *
++ * Bugs: Enter bugs at http://blackfin.uclinux.org/
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, see the file COPYING, or write
++ * to the Free Software Foundation, Inc.,
++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#include <linux/device.h>
++#include <linux/platform_device.h>
++#include <linux/irq.h>
++
++const char bfin_board_name[] = "UNKNOWN BOARD";
++
++/*
++ * Driver needs to know address, irq and flag pin.
++ */
++#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
++static struct resource smc91x_resources[] = {
++ {
++ .start = 0x2C010300,
++ .end = 0x2C010300 + 16,
++ .flags = IORESOURCE_MEM,
++ }, {
++ .start = IRQ_PROG_INTB,
++ .end = IRQ_PROG_INTB,
++ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
++ }, {
++ .start = IRQ_PF9,
++ .end = IRQ_PF9,
++ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
++ },
++};
++
++static struct platform_device smc91x_device = {
++ .name = "smc91x",
++ .id = 0,
++ .num_resources = ARRAY_SIZE(smc91x_resources),
++ .resource = smc91x_resources,
++};
++#endif
++
++#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
++#ifdef CONFIG_BFIN_SIR0
++static struct resource bfin_sir0_resources[] = {
++ {
++ .start = 0xFFC00400,
++ .end = 0xFFC004FF,
++ .flags = IORESOURCE_MEM,
++ },
++ {
++ .start = IRQ_UART0_RX,
++ .end = IRQ_UART0_RX+1,
++ .flags = IORESOURCE_IRQ,
++ },
++ {
++ .start = CH_UART0_RX,
++ .end = CH_UART0_RX+1,
++ .flags = IORESOURCE_DMA,
++ },
++};
++
++static struct platform_device bfin_sir0_device = {
++ .name = "bfin_sir",
++ .id = 0,
++ .num_resources = ARRAY_SIZE(bfin_sir0_resources),
++ .resource = bfin_sir0_resources,
++};
++#endif
++#endif
++
++static struct platform_device *generic_board_devices[] __initdata = {
++#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
++ &smc91x_device,
++#endif
++
++#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
++#ifdef CONFIG_BFIN_SIR0
++ &bfin_sir0_device,
++#endif
++#endif
++};
++
++static int __init generic_board_init(void)
++{
++ printk(KERN_INFO "%s(): registering device resources\n", __func__);
++ return platform_add_devices(generic_board_devices,
++ ARRAY_SIZE(generic_board_devices));
++}
++
++arch_initcall(generic_board_init);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf561/boards/Kconfig linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/boards/Kconfig
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf561/boards/Kconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/boards/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -19,4 +19,9 @@
+ help
+ CM-BF561 support for EVAL- and DEV-Board.
+
++config GENERIC_BF561_BOARD
++ bool "Generic"
++ help
++ Generic or Custom board support.
++
+ endchoice
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf561/boards/Makefile linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/boards/Makefile
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf561/boards/Makefile 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/boards/Makefile 2009-05-10 23:48:28.000000000 +0200
+@@ -2,6 +2,7 @@
+ # arch/blackfin/mach-bf561/boards/Makefile
+ #
+
++obj-$(CONFIG_GENERIC_BF561_BOARD) += generic_board.o
+ obj-$(CONFIG_BFIN561_BLUETECHNIX_CM) += cm_bf561.o
+ obj-$(CONFIG_BFIN561_EZKIT) += ezkit.o
+ obj-$(CONFIG_BFIN561_TEPLA) += tepla.o
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf561/include/mach/anomaly.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/include/mach/anomaly.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf561/include/mach/anomaly.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/include/mach/anomaly.h 2009-05-10 23:48:28.000000000 +0200
+@@ -2,7 +2,7 @@
+ * File: include/asm-blackfin/mach-bf561/anomaly.h
+ * Bugs: Enter bugs at http://blackfin.uclinux.org/
+ *
+- * Copyright (C) 2004-2009 Analog Devices Inc.
++ * Copyright (C) 2004-2008 Analog Devices Inc.
+ * Licensed under the GPL-2 or later.
+ */
+
+@@ -224,7 +224,7 @@
+ #define ANOMALY_05000301 (1)
+ /* SSYNCs After Writes To DMA MMR Registers May Not Be Handled Correctly */
+ #define ANOMALY_05000302 (1)
+-/* SPORT_HYS Bit in PLL_CTL Register Is Not Functional */
++/* New Feature: Additional Hysteresis on SPORT Input Pins (Not Available On Older Silicon) */
+ #define ANOMALY_05000305 (__SILICON_REVISION__ < 5)
+ /* SCKELOW Bit Does Not Maintain State Through Hibernate */
+ #define ANOMALY_05000307 (__SILICON_REVISION__ < 5)
+@@ -283,11 +283,8 @@
+ #define ANOMALY_05000273 (0)
+ #define ANOMALY_05000311 (0)
+ #define ANOMALY_05000353 (1)
+-#define ANOMALY_05000380 (0)
+ #define ANOMALY_05000386 (1)
+ #define ANOMALY_05000432 (0)
+ #define ANOMALY_05000435 (0)
+-#define ANOMALY_05000447 (0)
+-#define ANOMALY_05000448 (0)
+
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf561/include/mach/bfin_serial_5xx.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/include/mach/bfin_serial_5xx.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf561/include/mach/bfin_serial_5xx.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/include/mach/bfin_serial_5xx.h 2009-05-10 23:48:28.000000000 +0200
+@@ -134,7 +134,7 @@
+ CH_UART_TX,
+ CH_UART_RX,
+ #endif
+-#ifdef CONFIG_SERIAL_BFIN_CTSRTS
++#ifdef CONFIG_BFIN_UART0_CTSRTS
+ CONFIG_UART0_CTS_PIN,
+ CONFIG_UART0_RTS_PIN,
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf561/include/mach/defBF561.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/include/mach/defBF561.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf561/include/mach/defBF561.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/include/mach/defBF561.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1106,8 +1106,6 @@
+ #define DLEN_8 0x0 /* PPI Data Length mask for DLEN=8 */
+ #define DLEN(x) (((x-9) & 0x07) << 11) /* PPI Data Length (only works for x=10-->x=16) */
+ #define POL 0x0000C000 /* PPI Signal Polarities */
+-#define POLC 0x4000 /* PPI Clock Polarity */
+-#define POLS 0x8000 /* PPI Frame Sync Polarity */
+
+ /* PPI_STATUS Masks */
+ #define FLD 0x00000400 /* Field Indicator */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-bf561/include/mach/portmux.h linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/include/mach/portmux.h
+--- linux-2.6.29.owrt/arch/blackfin/mach-bf561/include/mach/portmux.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-bf561/include/mach/portmux.h 2009-05-10 23:48:28.000000000 +0200
+@@ -85,6 +85,5 @@
+ #define P_SPI0_MOSI (P_DONTCARE)
+ #define P_SPI0_MISO (P_DONTCARE)
+ #define P_SPI0_SCK (P_DONTCARE)
+-#define P_DEFAULT_BOOT_SPI_CS P_SPI0_SSEL2
+
+ #endif /* _MACH_PORTMUX_H_ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-common/arch_checks.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/arch_checks.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-common/arch_checks.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/arch_checks.c 2009-05-10 23:48:28.000000000 +0200
+@@ -62,12 +62,3 @@
+ #if (CONFIG_BOOT_LOAD & 0x3)
+ # error "The kernel load address must be 4 byte aligned"
+ #endif
+-
+-/* The entire kernel must be able to make a 24bit pcrel call to start of L1 */
+-#if ((0xffffffff - L1_CODE_START + 1) + CONFIG_BOOT_LOAD) > 0x1000000
+-# error "The kernel load address is too high; keep it below 10meg for safety"
+-#endif
+-
+-#if ANOMALY_05000448
+-# error You are using a part with anomaly 05000448, this issue causes random memory read/write failures - that means random crashes.
+-#endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-common/cache.S linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/cache.S
+--- linux-2.6.29.owrt/arch/blackfin/mach-common/cache.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/cache.S 2009-05-10 23:48:28.000000000 +0200
+@@ -66,33 +66,11 @@
+
+ /* Invalidate all instruction cache lines assocoiated with this memory area */
+ ENTRY(_blackfin_icache_flush_range)
+-/*
+- * Walkaround to avoid loading wrong instruction after invalidating icache
+- * and following sequence is met.
+- *
+- * 1) One instruction address is cached in the instruction cache.
+- * 2) This instruction in SDRAM is changed.
+- * 3) IFLASH[P0] is executed only once in blackfin_icache_flush_range().
+- * 4) This instruction is executed again, but the old one is loaded.
+- */
+- P0 = R0;
+- IFLUSH[P0];
+ do_flush IFLUSH, , nop
+ ENDPROC(_blackfin_icache_flush_range)
+
+ /* Flush all cache lines assocoiated with this area of memory. */
+ ENTRY(_blackfin_icache_dcache_flush_range)
+-/*
+- * Walkaround to avoid loading wrong instruction after invalidating icache
+- * and following sequence is met.
+- *
+- * 1) One instruction address is cached in the instruction cache.
+- * 2) This instruction in SDRAM is changed.
+- * 3) IFLASH[P0] is executed only once in blackfin_icache_flush_range().
+- * 4) This instruction is executed again, but the old one is loaded.
+- */
+- P0 = R0;
+- IFLUSH[P0];
+ do_flush FLUSH, IFLUSH
+ ENDPROC(_blackfin_icache_dcache_flush_range)
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-common/clocks-init.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/clocks-init.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-common/clocks-init.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/clocks-init.c 2009-05-10 23:48:28.000000000 +0200
+@@ -14,10 +14,9 @@
+ #include <asm/clocks.h>
+ #include <asm/mem_init.h>
+
+-#define SDGCTL_WIDTH (1 << 31) /* SDRAM external data path width */
+ #define PLL_CTL_VAL \
+ (((CONFIG_VCO_MULT & 63) << 9) | CLKIN_HALF | \
+- (PLL_BYPASS << 8) | (ANOMALY_05000305 ? 0 : 0x8000))
++ (PLL_BYPASS << 8) | (ANOMALY_05000265 ? 0x8000 : 0))
+
+ __attribute__((l1_text))
+ static void do_sync(void)
+@@ -77,7 +76,7 @@
+ bfin_write_PLL_DIV(CONFIG_CCLK_ACT_DIV | CONFIG_SCLK_DIV);
+ #ifdef EBIU_SDGCTL
+ bfin_write_EBIU_SDRRC(mem_SDRRC);
+- bfin_write_EBIU_SDGCTL((bfin_read_EBIU_SDGCTL() & SDGCTL_WIDTH) | mem_SDGCTL);
++ bfin_write_EBIU_SDGCTL(mem_SDGCTL);
+ #else
+ bfin_write_EBIU_RSTCTL(bfin_read_EBIU_RSTCTL() & ~(SRREQ));
+ do_sync();
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-common/dpmc_modes.S linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/dpmc_modes.S
+--- linux-2.6.29.owrt/arch/blackfin/mach-common/dpmc_modes.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/dpmc_modes.S 2009-05-10 23:48:28.000000000 +0200
+@@ -376,22 +376,10 @@
+ #endif
+
+ #ifdef PINT0_ASSIGN
+- PM_SYS_PUSH(PINT0_MASK_SET)
+- PM_SYS_PUSH(PINT1_MASK_SET)
+- PM_SYS_PUSH(PINT2_MASK_SET)
+- PM_SYS_PUSH(PINT3_MASK_SET)
+ PM_SYS_PUSH(PINT0_ASSIGN)
+ PM_SYS_PUSH(PINT1_ASSIGN)
+ PM_SYS_PUSH(PINT2_ASSIGN)
+ PM_SYS_PUSH(PINT3_ASSIGN)
+- PM_SYS_PUSH(PINT0_INVERT_SET)
+- PM_SYS_PUSH(PINT1_INVERT_SET)
+- PM_SYS_PUSH(PINT2_INVERT_SET)
+- PM_SYS_PUSH(PINT3_INVERT_SET)
+- PM_SYS_PUSH(PINT0_EDGE_SET)
+- PM_SYS_PUSH(PINT1_EDGE_SET)
+- PM_SYS_PUSH(PINT2_EDGE_SET)
+- PM_SYS_PUSH(PINT3_EDGE_SET)
+ #endif
+
+ PM_SYS_PUSH(EBIU_AMBCTL0)
+@@ -726,22 +714,10 @@
+ PM_SYS_POP(EBIU_AMBCTL0)
+
+ #ifdef PINT0_ASSIGN
+- PM_SYS_POP(PINT3_EDGE_SET)
+- PM_SYS_POP(PINT2_EDGE_SET)
+- PM_SYS_POP(PINT1_EDGE_SET)
+- PM_SYS_POP(PINT0_EDGE_SET)
+- PM_SYS_POP(PINT3_INVERT_SET)
+- PM_SYS_POP(PINT2_INVERT_SET)
+- PM_SYS_POP(PINT1_INVERT_SET)
+- PM_SYS_POP(PINT0_INVERT_SET)
+ PM_SYS_POP(PINT3_ASSIGN)
+ PM_SYS_POP(PINT2_ASSIGN)
+ PM_SYS_POP(PINT1_ASSIGN)
+ PM_SYS_POP(PINT0_ASSIGN)
+- PM_SYS_POP(PINT3_MASK_SET)
+- PM_SYS_POP(PINT2_MASK_SET)
+- PM_SYS_POP(PINT1_MASK_SET)
+- PM_SYS_POP(PINT0_MASK_SET)
+ #endif
+
+ #ifdef SICA_IWR1
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-common/entry.S linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/entry.S
+--- linux-2.6.29.owrt/arch/blackfin/mach-common/entry.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/entry.S 2009-05-10 23:48:28.000000000 +0200
+@@ -151,6 +151,13 @@
+ jump.s _bfin_return_from_exception;
+ ENDPROC(_ex_syscall)
+
++ENTRY(_ex_soft_bp)
++ r7 = retx;
++ r7 += -2;
++ retx = r7;
++ jump.s _ex_trap_c;
++ENDPROC(_ex_soft_bp)
++
+ ENTRY(_ex_single_step)
+ /* If we just returned from an interrupt, the single step event is
+ for the RTI instruction. */
+@@ -600,19 +607,6 @@
+ p2 = [p2];
+
+ [p2+(TASK_THREAD+THREAD_KSP)] = sp;
+-#ifdef CONFIG_IPIPE
+- r0 = sp;
+- SP += -12;
+- call ___ipipe_syscall_root;
+- SP += 12;
+- cc = r0 == 1;
+- if cc jump .Lsyscall_really_exit;
+- cc = r0 == -1;
+- if cc jump .Lresume_userspace;
+- r3 = [sp + PT_R3];
+- r4 = [sp + PT_R4];
+- p0 = [sp + PT_ORIG_P0];
+-#endif /* CONFIG_IPIPE */
+
+ /* Check the System Call */
+ r7 = __NR_syscall;
+@@ -667,17 +661,6 @@
+ r7 = r7 & r4;
+
+ .Lsyscall_resched:
+-#ifdef CONFIG_IPIPE
+- cc = BITTST(r7, TIF_IRQ_SYNC);
+- if !cc jump .Lsyscall_no_irqsync;
+- [--sp] = reti;
+- r0 = [sp++];
+- SP += -12;
+- call ___ipipe_sync_root;
+- SP += 12;
+- jump .Lresume_userspace_1;
+-.Lsyscall_no_irqsync:
+-#endif
+ cc = BITTST(r7, TIF_NEED_RESCHED);
+ if !cc jump .Lsyscall_sigpending;
+
+@@ -709,10 +692,6 @@
+ .Lsyscall_really_exit:
+ r5 = [sp + PT_RESERVED];
+ rets = r5;
+-#ifdef CONFIG_IPIPE
+- [--sp] = reti;
+- r5 = [sp++];
+-#endif /* CONFIG_IPIPE */
+ rts;
+ ENDPROC(_system_call)
+
+@@ -799,15 +778,6 @@
+ ENDPROC(_resume)
+
+ ENTRY(_ret_from_exception)
+-#ifdef CONFIG_IPIPE
+- [--sp] = rets;
+- SP += -12;
+- call ___ipipe_check_root
+- SP += 12
+- rets = [sp++];
+- cc = r0 == 0;
+- if cc jump 4f; /* not on behalf of Linux, get out */
+-#endif /* CONFIG_IPIPE */
+ p2.l = lo(IPEND);
+ p2.h = hi(IPEND);
+
+@@ -864,28 +834,6 @@
+ rts;
+ ENDPROC(_ret_from_exception)
+
+-#ifdef CONFIG_IPIPE
+-
+-_sync_root_irqs:
+- [--sp] = reti; /* Reenable interrupts */
+- r0 = [sp++];
+- jump.l ___ipipe_sync_root
+-
+-_resume_kernel_from_int:
+- r0.l = _sync_root_irqs
+- r0.h = _sync_root_irqs
+- [--sp] = rets;
+- [--sp] = ( r7:4, p5:3 );
+- SP += -12;
+- call ___ipipe_call_irqtail
+- SP += 12;
+- ( r7:4, p5:3 ) = [sp++];
+- rets = [sp++];
+- rts
+-#else
+-#define _resume_kernel_from_int 2f
+-#endif
+-
+ ENTRY(_return_from_int)
+ /* If someone else already raised IRQ 15, do nothing. */
+ csync;
+@@ -907,7 +855,7 @@
+ r1 = r0 - r1;
+ r2 = r0 & r1;
+ cc = r2 == 0;
+- if !cc jump _resume_kernel_from_int;
++ if !cc jump 2f;
+
+ /* Lower the interrupt level to 15. */
+ p0.l = lo(EVT15);
+@@ -1139,7 +1087,7 @@
+ * EXCPT instruction can provide 4 bits of EXCAUSE, allowing 16 to be user defined
+ */
+ .long _ex_syscall /* 0x00 - User Defined - Linux Syscall */
+- .long _ex_trap_c /* 0x01 - User Defined - Software breakpoint */
++ .long _ex_soft_bp /* 0x01 - User Defined - Software breakpoint */
+ #ifdef CONFIG_KGDB
+ .long _ex_trap_c /* 0x02 - User Defined - KGDB initial connection
+ and break signal trap */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-common/head.S linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/head.S
+--- linux-2.6.29.owrt/arch/blackfin/mach-common/head.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/head.S 2009-05-10 23:48:28.000000000 +0200
+@@ -17,19 +17,6 @@
+
+ __INIT
+
+-ENTRY(__init_clear_bss)
+- r2 = r2 - r1;
+- cc = r2 == 0;
+- if cc jump .L_bss_done;
+- r2 >>= 2;
+- p1 = r1;
+- p2 = r2;
+- lsetup (1f, 1f) lc0 = p2;
+-1: [p1++] = r0;
+-.L_bss_done:
+- rts;
+-ENDPROC(__init_clear_bss)
+-
+ #define INITIAL_STACK (L1_SCRATCH_START + L1_SCRATCH_LENGTH - 12)
+
+ ENTRY(__start)
+@@ -157,35 +144,6 @@
+ call _init_early_exception_vectors;
+ #endif
+
+- r0 = 0 (x);
+- /* Zero out all of the fun bss regions */
+-#if L1_DATA_A_LENGTH > 0
+- r1.l = __sbss_l1;
+- r1.h = __sbss_l1;
+- r2.l = __ebss_l1;
+- r2.h = __ebss_l1;
+- call __init_clear_bss
+-#endif
+-#if L1_DATA_B_LENGTH > 0
+- r1.l = __sbss_b_l1;
+- r1.h = __sbss_b_l1;
+- r2.l = __ebss_b_l1;
+- r2.h = __ebss_b_l1;
+- call __init_clear_bss
+-#endif
+-#if L2_LENGTH > 0
+- r1.l = __sbss_l2;
+- r1.h = __sbss_l2;
+- r2.l = __ebss_l2;
+- r2.h = __ebss_l2;
+- call __init_clear_bss
+-#endif
+- r1.l = ___bss_start;
+- r1.h = ___bss_start;
+- r2.l = ___bss_stop;
+- r2.h = ___bss_stop;
+- call __init_clear_bss
+-
+ /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */
+ call _bfin_relocate_l1_mem;
+ #ifdef CONFIG_BFIN_KERNEL_CLOCK
+@@ -227,6 +185,19 @@
+ # define WDOG_CTL WDOGA_CTL
+ #endif
+
++ENTRY(__init_clear_bss)
++ r2 = r2 - r1;
++ cc = r2 == 0;
++ if cc jump .L_bss_done;
++ r2 >>= 2;
++ p1 = r1;
++ p2 = r2;
++ lsetup (1f, 1f) lc0 = p2;
++1: [p1++] = r0;
++.L_bss_done:
++ rts;
++ENDPROC(__init_clear_bss)
++
+ ENTRY(_real_start)
+ /* Enable nested interrupts */
+ [--sp] = reti;
+@@ -238,6 +209,35 @@
+ w[p0] = r0;
+ ssync;
+
++ r0 = 0 (x);
++ /* Zero out all of the fun bss regions */
++#if L1_DATA_A_LENGTH > 0
++ r1.l = __sbss_l1;
++ r1.h = __sbss_l1;
++ r2.l = __ebss_l1;
++ r2.h = __ebss_l1;
++ call __init_clear_bss
++#endif
++#if L1_DATA_B_LENGTH > 0
++ r1.l = __sbss_b_l1;
++ r1.h = __sbss_b_l1;
++ r2.l = __ebss_b_l1;
++ r2.h = __ebss_b_l1;
++ call __init_clear_bss
++#endif
++#if L2_LENGTH > 0
++ r1.l = __sbss_l2;
++ r1.h = __sbss_l2;
++ r2.l = __ebss_l2;
++ r2.h = __ebss_l2;
++ call __init_clear_bss
++#endif
++ r1.l = ___bss_start;
++ r1.h = ___bss_start;
++ r2.l = ___bss_stop;
++ r2.h = ___bss_stop;
++ call __init_clear_bss
++
+ /* Pass the u-boot arguments to the global value command line */
+ R0 = R7;
+ call _cmdline_init;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-common/interrupt.S linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/interrupt.S
+--- linux-2.6.29.owrt/arch/blackfin/mach-common/interrupt.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/interrupt.S 2009-05-10 23:48:28.000000000 +0200
+@@ -195,7 +195,7 @@
+ /* Interrupt routine for evt2 (NMI).
+ * We don't actually use this, so just return.
+ * For inner circle type details, please see:
+- * http://docs.blackfin.uclinux.org/doku.php?id=linux-kernel:nmi
++ * http://docs.blackfin.uclinux.org/doku.php?id=linux:nmi
+ */
+ ENTRY(_evt_nmi)
+ .weak _evt_nmi
+@@ -235,7 +235,6 @@
+
+ #ifdef CONFIG_IPIPE
+ ENTRY(___ipipe_call_irqtail)
+- p0 = r0;
+ r0.l = 1f;
+ r0.h = 1f;
+ reti = r0;
+@@ -243,6 +242,9 @@
+ 1:
+ [--sp] = rets;
+ [--sp] = ( r7:4, p5:3 );
++ p0.l = ___ipipe_irq_tail_hook;
++ p0.h = ___ipipe_irq_tail_hook;
++ p0 = [p0];
+ sp += -12;
+ call (p0);
+ sp += 12;
+@@ -257,7 +259,7 @@
+ p0.h = hi(EVT14);
+ [p0] = r0;
+ csync;
+- r0 = 0x401f (z);
++ r0 = 0x401f;
+ sti r0;
+ raise 14;
+ [--sp] = reti; /* IRQs on. */
+@@ -275,7 +277,11 @@
+ p0.h = _bfin_irq_flags;
+ r0 = [p0];
+ sti r0;
++#if 0 /* FIXME: this actually raises scheduling latencies */
++ /* Reenable interrupts */
++ [--sp] = reti;
++ r0 = [sp++];
++#endif
+ rts;
+ ENDPROC(___ipipe_call_irqtail)
+-
+ #endif /* CONFIG_IPIPE */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-common/ints-priority.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/ints-priority.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-common/ints-priority.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/ints-priority.c 2009-05-10 23:48:28.000000000 +0200
+@@ -161,15 +161,11 @@
+
+ static void bfin_internal_mask_irq(unsigned int irq)
+ {
+- unsigned long flags;
+-
+ #ifdef CONFIG_BF53x
+- local_irq_save_hw(flags);
+ bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() &
+ ~(1 << SIC_SYSIRQ(irq)));
+ #else
+ unsigned mask_bank, mask_bit;
+- local_irq_save_hw(flags);
+ mask_bank = SIC_SYSIRQ(irq) / 32;
+ mask_bit = SIC_SYSIRQ(irq) % 32;
+ bfin_write_SIC_IMASK(mask_bank, bfin_read_SIC_IMASK(mask_bank) &
+@@ -179,20 +175,15 @@
+ ~(1 << mask_bit));
+ #endif
+ #endif
+- local_irq_restore_hw(flags);
+ }
+
+ static void bfin_internal_unmask_irq(unsigned int irq)
+ {
+- unsigned long flags;
+-
+ #ifdef CONFIG_BF53x
+- local_irq_save_hw(flags);
+ bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() |
+ (1 << SIC_SYSIRQ(irq)));
+ #else
+ unsigned mask_bank, mask_bit;
+- local_irq_save_hw(flags);
+ mask_bank = SIC_SYSIRQ(irq) / 32;
+ mask_bit = SIC_SYSIRQ(irq) % 32;
+ bfin_write_SIC_IMASK(mask_bank, bfin_read_SIC_IMASK(mask_bank) |
+@@ -202,7 +193,6 @@
+ (1 << mask_bit));
+ #endif
+ #endif
+- local_irq_restore_hw(flags);
+ }
+
+ #ifdef CONFIG_PM
+@@ -400,7 +390,7 @@
+ static inline void bfin_set_irq_handler(unsigned irq, irq_flow_handler_t handle)
+ {
+ #ifdef CONFIG_IPIPE
+- _set_irq_handler(irq, handle_level_irq);
++ _set_irq_handler(irq, handle_edge_irq);
+ #else
+ struct irq_desc *desc = irq_desc + irq;
+ /* May not call generic set_irq_handler() due to spinlock
+@@ -1065,18 +1055,13 @@
+ #endif
+ default:
+ #ifdef CONFIG_IPIPE
+- /*
+- * We want internal interrupt sources to be
+- * masked, because ISRs may trigger interrupts
+- * recursively (e.g. DMA), but interrupts are
+- * _not_ masked at CPU level. So let's handle
+- * most of them as level interrupts, except
+- * the timer interrupt which is special.
+- */
+- if (irq == IRQ_SYSTMR || irq == IRQ_CORETMR)
+- set_irq_handler(irq, handle_simple_irq);
+- else
+- set_irq_handler(irq, handle_level_irq);
++ /*
++ * We want internal interrupt sources to be masked, because
++ * ISRs may trigger interrupts recursively (e.g. DMA), but
++ * interrupts are _not_ masked at CPU level. So let's handle
++ * them as level interrupts.
++ */
++ set_irq_handler(irq, handle_level_irq);
+ #else /* !CONFIG_IPIPE */
+ set_irq_handler(irq, handle_simple_irq);
+ #endif /* !CONFIG_IPIPE */
+@@ -1116,9 +1101,10 @@
+ IMASK_IVG14 | IMASK_IVG13 | IMASK_IVG12 | IMASK_IVG11 |
+ IMASK_IVG10 | IMASK_IVG9 | IMASK_IVG8 | IMASK_IVG7 | IMASK_IVGHW;
+
+-#ifdef SIC_IWR0
++#if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561) \
++ || defined(BF538_FAMILY) || defined(CONFIG_BF51x)
+ bfin_write_SIC_IWR0(IWR_DISABLE_ALL);
+-# ifdef SIC_IWR1
++#if defined(CONFIG_BF52x) || defined(CONFIG_BF51x)
+ /* BF52x/BF51x system reset does not properly reset SIC_IWR1 which
+ * will screw up the bootrom as it relies on MDMA0/1 waking it
+ * up from IDLE instructions. See this report for more info:
+@@ -1128,8 +1114,10 @@
+ bfin_write_SIC_IWR1(IWR_ENABLE(10) | IWR_ENABLE(11));
+ else
+ bfin_write_SIC_IWR1(IWR_DISABLE_ALL);
+-# endif
+-# ifdef SIC_IWR2
++#else
++ bfin_write_SIC_IWR1(IWR_DISABLE_ALL);
++#endif
++# ifdef CONFIG_BF54x
+ bfin_write_SIC_IWR2(IWR_DISABLE_ALL);
+ # endif
+ #else
+@@ -1138,8 +1126,9 @@
+
+ #ifdef CONFIG_IPIPE
+ for (irq = 0; irq < NR_IRQS; irq++) {
+- struct irq_desc *desc = irq_to_desc(irq);
++ struct irq_desc *desc = irq_desc + irq;
+ desc->ic_prio = __ipipe_get_irq_priority(irq);
++ desc->thr_prio = __ipipe_get_irqthread_priority(irq);
+ }
+ #endif /* CONFIG_IPIPE */
+
+@@ -1222,21 +1211,76 @@
+ return IVG15;
+ }
+
++int __ipipe_get_irqthread_priority(unsigned irq)
++{
++ int ient, prio;
++ int demux_irq;
++
++ /* The returned priority value is rescaled to [0..IVG13+1]
++ * with 0 being the lowest effective priority level. */
++
++ if (irq <= IRQ_CORETMR)
++ return IVG13 - irq + 1;
++
++ /* GPIO IRQs are given the priority of the demux
++ * interrupt. */
++ if (IS_GPIOIRQ(irq)) {
++#if defined(CONFIG_BF54x)
++ u32 bank = PINT_2_BANK(irq2pint_lut[irq - SYS_IRQS]);
++ demux_irq = (bank == 0 ? IRQ_PINT0 :
++ bank == 1 ? IRQ_PINT1 :
++ bank == 2 ? IRQ_PINT2 :
++ IRQ_PINT3);
++#elif defined(CONFIG_BF561)
++ demux_irq = (irq >= IRQ_PF32 ? IRQ_PROG2_INTA :
++ irq >= IRQ_PF16 ? IRQ_PROG1_INTA :
++ IRQ_PROG0_INTA);
++#elif defined(CONFIG_BF52x)
++ demux_irq = (irq >= IRQ_PH0 ? IRQ_PORTH_INTA :
++ irq >= IRQ_PG0 ? IRQ_PORTG_INTA :
++ IRQ_PORTF_INTA);
++#else
++ demux_irq = irq;
++#endif
++ return IVG13 - PRIO_GPIODEMUX(demux_irq) + 1;
++ }
++
++ /* The GPIO demux interrupt is given a lower priority
++ * than the GPIO IRQs, so that its threaded handler
++ * unmasks the interrupt line after the decoded IRQs
++ * have been processed. */
++ prio = PRIO_GPIODEMUX(irq);
++ /* demux irq? */
++ if (prio != -1)
++ return IVG13 - prio;
++
++ for (ient = 0; ient < NR_PERI_INTS; ient++) {
++ struct ivgx *ivg = ivg_table + ient;
++ if (ivg->irqno == irq) {
++ for (prio = 0; prio <= IVG13-IVG7; prio++) {
++ if (ivg7_13[prio].ifirst <= ivg &&
++ ivg7_13[prio].istop > ivg)
++ return IVG7 - prio;
++ }
++ }
++ }
++
++ return 0;
++}
++
+ /* Hw interrupts are disabled on entry (check SAVE_CONTEXT). */
+ #ifdef CONFIG_DO_IRQ_L1
+ __attribute__((l1_text))
+ #endif
+ asmlinkage int __ipipe_grab_irq(int vec, struct pt_regs *regs)
+ {
+- struct ipipe_percpu_domain_data *p = ipipe_root_cpudom_ptr();
+- struct ipipe_domain *this_domain = ipipe_current_domain;
+ struct ivgx *ivg_stop = ivg7_13[vec-IVG7].istop;
+ struct ivgx *ivg = ivg7_13[vec-IVG7].ifirst;
+- int irq, s;
++ int irq;
+
+ if (likely(vec == EVT_IVTMR_P)) {
+ irq = IRQ_CORETMR;
+- goto core_tick;
++ goto handle_irq;
+ }
+
+ SSYNC();
+@@ -1278,39 +1322,24 @@
+ irq = ivg->irqno;
+
+ if (irq == IRQ_SYSTMR) {
+-#ifdef CONFIG_GENERIC_CLOCKEVENTS
+-core_tick:
+-#else
+ bfin_write_TIMER_STATUS(1); /* Latch TIMIL0 */
+-#endif
+ /* This is basically what we need from the register frame. */
+ __raw_get_cpu_var(__ipipe_tick_regs).ipend = regs->ipend;
+ __raw_get_cpu_var(__ipipe_tick_regs).pc = regs->pc;
+- if (this_domain != ipipe_root_domain)
+- __raw_get_cpu_var(__ipipe_tick_regs).ipend &= ~0x10;
+- else
++ if (!ipipe_root_domain_p)
+ __raw_get_cpu_var(__ipipe_tick_regs).ipend |= 0x10;
++ else
++ __raw_get_cpu_var(__ipipe_tick_regs).ipend &= ~0x10;
+ }
+
+-#ifndef CONFIG_GENERIC_CLOCKEVENTS
+-core_tick:
+-#endif
+- if (this_domain == ipipe_root_domain) {
+- s = __test_and_set_bit(IPIPE_SYNCDEFER_FLAG, &p->status);
+- barrier();
+- }
++handle_irq:
+
+ ipipe_trace_irq_entry(irq);
+ __ipipe_handle_irq(irq, regs);
+- ipipe_trace_irq_exit(irq);
++ ipipe_trace_irq_exit(irq);
+
+- if (this_domain == ipipe_root_domain) {
+- set_thread_flag(TIF_IRQ_SYNC);
+- if (!s) {
+- __clear_bit(IPIPE_SYNCDEFER_FLAG, &p->status);
+- return !test_bit(IPIPE_STALL_FLAG, &p->status);
+- }
+- }
++ if (ipipe_root_domain_p)
++ return !test_bit(IPIPE_STALL_FLAG, &ipipe_root_cpudom_var(status));
+
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-common/pm.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/pm.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-common/pm.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/pm.c 2009-05-10 23:48:28.000000000 +0200
+@@ -82,9 +82,10 @@
+
+ bfin_pm_standby_restore();
+
+-#ifdef SIC_IWR0
++#if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561) || \
++ defined(CONFIG_BF538) || defined(CONFIG_BF539) || defined(CONFIG_BF51x)
+ bfin_write_SIC_IWR0(IWR_DISABLE_ALL);
+-# ifdef SIC_IWR1
++#if defined(CONFIG_BF52x) || defined(CONFIG_BF51x)
+ /* BF52x system reset does not properly reset SIC_IWR1 which
+ * will screw up the bootrom as it relies on MDMA0/1 waking it
+ * up from IDLE instructions. See this report for more info:
+@@ -94,8 +95,10 @@
+ bfin_write_SIC_IWR1(IWR_ENABLE(10) | IWR_ENABLE(11));
+ else
+ bfin_write_SIC_IWR1(IWR_DISABLE_ALL);
+-# endif
+-# ifdef SIC_IWR2
++#else
++ bfin_write_SIC_IWR1(IWR_DISABLE_ALL);
++#endif
++# ifdef CONFIG_BF54x
+ bfin_write_SIC_IWR2(IWR_DISABLE_ALL);
+ # endif
+ #else
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mach-common/smp.c linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/smp.c
+--- linux-2.6.29.owrt/arch/blackfin/mach-common/smp.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mach-common/smp.c 2009-05-10 23:48:28.000000000 +0200
+@@ -158,14 +158,10 @@
+ kfree(msg);
+ break;
+ case BFIN_IPI_CALL_FUNC:
+- spin_unlock(&msg_queue->lock);
+ ipi_call_function(cpu, msg);
+- spin_lock(&msg_queue->lock);
+ break;
+ case BFIN_IPI_CPU_STOP:
+- spin_unlock(&msg_queue->lock);
+ ipi_cpu_stop(cpu);
+- spin_lock(&msg_queue->lock);
+ kfree(msg);
+ break;
+ default:
+@@ -461,7 +457,7 @@
+ smp_flush_data.start = start;
+ smp_flush_data.end = end;
+
+- if (smp_call_function(&ipi_flush_icache, &smp_flush_data, 0))
++ if (smp_call_function(&ipi_flush_icache, &smp_flush_data, 1))
+ printk(KERN_WARNING "SMP: failed to run I-cache flush request on other CPUs\n");
+ }
+ EXPORT_SYMBOL_GPL(smp_icache_flush_range_others);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/Makefile linux-2.6.29-rc3.owrt/arch/blackfin/Makefile
+--- linux-2.6.29.owrt/arch/blackfin/Makefile 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/Makefile 2009-05-10 23:48:28.000000000 +0200
+@@ -21,67 +21,57 @@
+ KBUILD_DEFCONFIG := BF537-STAMP_defconfig
+
+ # setup the machine name and the machine dependent settings
+-machine-$(CONFIG_BF512) := bf518
+-machine-$(CONFIG_BF514) := bf518
+-machine-$(CONFIG_BF516) := bf518
+-machine-$(CONFIG_BF518) := bf518
+-machine-$(CONFIG_BF522) := bf527
+-machine-$(CONFIG_BF523) := bf527
+-machine-$(CONFIG_BF524) := bf527
+-machine-$(CONFIG_BF525) := bf527
+-machine-$(CONFIG_BF526) := bf527
+-machine-$(CONFIG_BF527) := bf527
+-machine-$(CONFIG_BF531) := bf533
+-machine-$(CONFIG_BF532) := bf533
+-machine-$(CONFIG_BF533) := bf533
+-machine-$(CONFIG_BF534) := bf537
+-machine-$(CONFIG_BF536) := bf537
+-machine-$(CONFIG_BF537) := bf537
+-machine-$(CONFIG_BF538) := bf538
+-machine-$(CONFIG_BF539) := bf538
+-machine-$(CONFIG_BF542) := bf548
+-machine-$(CONFIG_BF542M) := bf548
+-machine-$(CONFIG_BF544) := bf548
+-machine-$(CONFIG_BF544M) := bf548
+-machine-$(CONFIG_BF547) := bf548
+-machine-$(CONFIG_BF547M) := bf548
+-machine-$(CONFIG_BF548) := bf548
+-machine-$(CONFIG_BF548M) := bf548
+-machine-$(CONFIG_BF549) := bf548
+-machine-$(CONFIG_BF549M) := bf548
+-machine-$(CONFIG_BF561) := bf561
++machine-$(CONFIG_BF512) := bf518
++machine-$(CONFIG_BF514) := bf518
++machine-$(CONFIG_BF516) := bf518
++machine-$(CONFIG_BF518) := bf518
++machine-$(CONFIG_BF522) := bf527
++machine-$(CONFIG_BF523) := bf527
++machine-$(CONFIG_BF524) := bf527
++machine-$(CONFIG_BF525) := bf527
++machine-$(CONFIG_BF526) := bf527
++machine-$(CONFIG_BF527) := bf527
++machine-$(CONFIG_BF531) := bf533
++machine-$(CONFIG_BF532) := bf533
++machine-$(CONFIG_BF533) := bf533
++machine-$(CONFIG_BF534) := bf537
++machine-$(CONFIG_BF536) := bf537
++machine-$(CONFIG_BF537) := bf537
++machine-$(CONFIG_BF538) := bf538
++machine-$(CONFIG_BF539) := bf538
++machine-$(CONFIG_BF542) := bf548
++machine-$(CONFIG_BF544) := bf548
++machine-$(CONFIG_BF547) := bf548
++machine-$(CONFIG_BF548) := bf548
++machine-$(CONFIG_BF549) := bf548
++machine-$(CONFIG_BF561) := bf561
+ MACHINE := $(machine-y)
+ export MACHINE
+
+-cpu-$(CONFIG_BF512) := bf512
+-cpu-$(CONFIG_BF514) := bf514
+-cpu-$(CONFIG_BF516) := bf516
+-cpu-$(CONFIG_BF518) := bf518
+-cpu-$(CONFIG_BF522) := bf522
+-cpu-$(CONFIG_BF523) := bf523
+-cpu-$(CONFIG_BF524) := bf524
+-cpu-$(CONFIG_BF525) := bf525
+-cpu-$(CONFIG_BF526) := bf526
+-cpu-$(CONFIG_BF527) := bf527
+-cpu-$(CONFIG_BF531) := bf531
+-cpu-$(CONFIG_BF532) := bf532
+-cpu-$(CONFIG_BF533) := bf533
+-cpu-$(CONFIG_BF534) := bf534
+-cpu-$(CONFIG_BF536) := bf536
+-cpu-$(CONFIG_BF537) := bf537
+-cpu-$(CONFIG_BF538) := bf538
+-cpu-$(CONFIG_BF539) := bf539
+-cpu-$(CONFIG_BF542) := bf542
+-cpu-$(CONFIG_BF542M) := bf542m
+-cpu-$(CONFIG_BF544) := bf544
+-cpu-$(CONFIG_BF544M) := bf544m
+-cpu-$(CONFIG_BF547) := bf547
+-cpu-$(CONFIG_BF547M) := bf547m
+-cpu-$(CONFIG_BF548) := bf548
+-cpu-$(CONFIG_BF548M) := bf548m
+-cpu-$(CONFIG_BF549) := bf549
+-cpu-$(CONFIG_BF549M) := bf549m
+-cpu-$(CONFIG_BF561) := bf561
++cpu-$(CONFIG_BF512) := bf512
++cpu-$(CONFIG_BF514) := bf514
++cpu-$(CONFIG_BF516) := bf516
++cpu-$(CONFIG_BF518) := bf518
++cpu-$(CONFIG_BF522) := bf522
++cpu-$(CONFIG_BF523) := bf523
++cpu-$(CONFIG_BF524) := bf524
++cpu-$(CONFIG_BF525) := bf525
++cpu-$(CONFIG_BF526) := bf526
++cpu-$(CONFIG_BF527) := bf527
++cpu-$(CONFIG_BF531) := bf531
++cpu-$(CONFIG_BF532) := bf532
++cpu-$(CONFIG_BF533) := bf533
++cpu-$(CONFIG_BF534) := bf534
++cpu-$(CONFIG_BF536) := bf536
++cpu-$(CONFIG_BF537) := bf537
++cpu-$(CONFIG_BF538) := bf538
++cpu-$(CONFIG_BF539) := bf539
++cpu-$(CONFIG_BF542) := bf542
++cpu-$(CONFIG_BF544) := bf544
++cpu-$(CONFIG_BF547) := bf547
++cpu-$(CONFIG_BF548) := bf548
++cpu-$(CONFIG_BF549) := bf549
++cpu-$(CONFIG_BF561) := bf561
+
+ rev-$(CONFIG_BF_REV_0_0) := 0.0
+ rev-$(CONFIG_BF_REV_0_1) := 0.1
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/blackfin/mm/init.c linux-2.6.29-rc3.owrt/arch/blackfin/mm/init.c
+--- linux-2.6.29.owrt/arch/blackfin/mm/init.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/blackfin/mm/init.c 2009-05-10 23:48:28.000000000 +0200
+@@ -104,7 +104,7 @@
+ }
+ }
+
+-asmlinkage void __init init_pda(void)
++asmlinkage void init_pda(void)
+ {
+ unsigned int cpu = raw_smp_processor_id();
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/frv/mm/dma-alloc.c linux-2.6.29-rc3.owrt/arch/frv/mm/dma-alloc.c
+--- linux-2.6.29.owrt/arch/frv/mm/dma-alloc.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/frv/mm/dma-alloc.c 2009-05-10 23:48:28.000000000 +0200
+@@ -36,10 +36,10 @@
+ #include <linux/vmalloc.h>
+ #include <linux/init.h>
+ #include <linux/pci.h>
+-#include <linux/hardirq.h>
+
+ #include <asm/pgalloc.h>
+ #include <asm/io.h>
++#include <asm/hardirq.h>
+ #include <asm/mmu_context.h>
+ #include <asm/pgtable.h>
+ #include <asm/mmu.h>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/ia64/configs/xen_domu_defconfig linux-2.6.29-rc3.owrt/arch/ia64/configs/xen_domu_defconfig
+--- linux-2.6.29.owrt/arch/ia64/configs/xen_domu_defconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/ia64/configs/xen_domu_defconfig 1970-01-01 01:00:00.000000000 +0100
+@@ -1,1601 +0,0 @@
+-#
+-# Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-rc1
+-# Fri Jan 16 11:49:59 2009
+-#
+-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+-
+-#
+-# General setup
+-#
+-CONFIG_EXPERIMENTAL=y
+-CONFIG_LOCK_KERNEL=y
+-CONFIG_INIT_ENV_ARG_LIMIT=32
+-CONFIG_LOCALVERSION=""
+-CONFIG_LOCALVERSION_AUTO=y
+-CONFIG_SWAP=y
+-CONFIG_SYSVIPC=y
+-CONFIG_SYSVIPC_SYSCTL=y
+-CONFIG_POSIX_MQUEUE=y
+-# CONFIG_BSD_PROCESS_ACCT is not set
+-# CONFIG_TASKSTATS is not set
+-# CONFIG_AUDIT is not set
+-CONFIG_IKCONFIG=y
+-CONFIG_IKCONFIG_PROC=y
+-CONFIG_LOG_BUF_SHIFT=20
+-CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y
+-# CONFIG_GROUP_SCHED is not set
+-
+-#
+-# Control Group support
+-#
+-# CONFIG_CGROUPS is not set
+-CONFIG_SYSFS_DEPRECATED=y
+-CONFIG_SYSFS_DEPRECATED_V2=y
+-# CONFIG_RELAY is not set
+-CONFIG_NAMESPACES=y
+-# CONFIG_UTS_NS is not set
+-# CONFIG_IPC_NS is not set
+-# CONFIG_USER_NS is not set
+-# CONFIG_PID_NS is not set
+-CONFIG_BLK_DEV_INITRD=y
+-CONFIG_INITRAMFS_SOURCE=""
+-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+-CONFIG_SYSCTL=y
+-# CONFIG_EMBEDDED is not set
+-CONFIG_SYSCTL_SYSCALL=y
+-CONFIG_KALLSYMS=y
+-CONFIG_KALLSYMS_ALL=y
+-CONFIG_KALLSYMS_STRIP_GENERATED=y
+-# CONFIG_KALLSYMS_EXTRA_PASS is not set
+-CONFIG_HOTPLUG=y
+-CONFIG_PRINTK=y
+-CONFIG_BUG=y
+-CONFIG_ELF_CORE=y
+-CONFIG_COMPAT_BRK=y
+-CONFIG_BASE_FULL=y
+-CONFIG_FUTEX=y
+-CONFIG_ANON_INODES=y
+-CONFIG_EPOLL=y
+-CONFIG_SIGNALFD=y
+-CONFIG_TIMERFD=y
+-CONFIG_EVENTFD=y
+-CONFIG_SHMEM=y
+-CONFIG_AIO=y
+-CONFIG_VM_EVENT_COUNTERS=y
+-CONFIG_PCI_QUIRKS=y
+-CONFIG_SLUB_DEBUG=y
+-# CONFIG_SLAB is not set
+-CONFIG_SLUB=y
+-# CONFIG_SLOB is not set
+-# CONFIG_PROFILING is not set
+-CONFIG_HAVE_OPROFILE=y
+-# CONFIG_KPROBES is not set
+-CONFIG_HAVE_KPROBES=y
+-CONFIG_HAVE_KRETPROBES=y
+-CONFIG_HAVE_ARCH_TRACEHOOK=y
+-CONFIG_HAVE_DMA_ATTRS=y
+-CONFIG_USE_GENERIC_SMP_HELPERS=y
+-# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
+-CONFIG_SLABINFO=y
+-CONFIG_RT_MUTEXES=y
+-CONFIG_BASE_SMALL=0
+-CONFIG_MODULES=y
+-# CONFIG_MODULE_FORCE_LOAD is not set
+-CONFIG_MODULE_UNLOAD=y
+-# CONFIG_MODULE_FORCE_UNLOAD is not set
+-CONFIG_MODVERSIONS=y
+-CONFIG_MODULE_SRCVERSION_ALL=y
+-CONFIG_STOP_MACHINE=y
+-CONFIG_BLOCK=y
+-# CONFIG_BLK_DEV_IO_TRACE is not set
+-# CONFIG_BLK_DEV_BSG is not set
+-# CONFIG_BLK_DEV_INTEGRITY is not set
+-
+-#
+-# IO Schedulers
+-#
+-CONFIG_IOSCHED_NOOP=y
+-CONFIG_IOSCHED_AS=y
+-CONFIG_IOSCHED_DEADLINE=y
+-CONFIG_IOSCHED_CFQ=y
+-CONFIG_DEFAULT_AS=y
+-# CONFIG_DEFAULT_DEADLINE is not set
+-# CONFIG_DEFAULT_CFQ is not set
+-# CONFIG_DEFAULT_NOOP is not set
+-CONFIG_DEFAULT_IOSCHED="anticipatory"
+-CONFIG_CLASSIC_RCU=y
+-# CONFIG_TREE_RCU is not set
+-# CONFIG_PREEMPT_RCU is not set
+-# CONFIG_TREE_RCU_TRACE is not set
+-# CONFIG_PREEMPT_RCU_TRACE is not set
+-CONFIG_FREEZER=y
+-
+-#
+-# Processor type and features
+-#
+-CONFIG_IA64=y
+-CONFIG_64BIT=y
+-CONFIG_ZONE_DMA=y
+-CONFIG_QUICKLIST=y
+-CONFIG_MMU=y
+-CONFIG_SWIOTLB=y
+-CONFIG_IOMMU_HELPER=y
+-CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+-CONFIG_HUGETLB_PAGE_SIZE_VARIABLE=y
+-CONFIG_GENERIC_FIND_NEXT_BIT=y
+-CONFIG_GENERIC_CALIBRATE_DELAY=y
+-CONFIG_GENERIC_TIME=y
+-CONFIG_GENERIC_TIME_VSYSCALL=y
+-CONFIG_HAVE_SETUP_PER_CPU_AREA=y
+-CONFIG_DMI=y
+-CONFIG_EFI=y
+-CONFIG_GENERIC_IOMAP=y
+-CONFIG_SCHED_OMIT_FRAME_POINTER=y
+-CONFIG_AUDIT_ARCH=y
+-CONFIG_PARAVIRT_GUEST=y
+-CONFIG_PARAVIRT=y
+-CONFIG_XEN=y
+-CONFIG_XEN_XENCOMM=y
+-CONFIG_NO_IDLE_HZ=y
+-# CONFIG_IA64_GENERIC is not set
+-# CONFIG_IA64_DIG is not set
+-# CONFIG_IA64_DIG_VTD is not set
+-# CONFIG_IA64_HP_ZX1 is not set
+-# CONFIG_IA64_HP_ZX1_SWIOTLB is not set
+-# CONFIG_IA64_SGI_SN2 is not set
+-# CONFIG_IA64_SGI_UV is not set
+-# CONFIG_IA64_HP_SIM is not set
+-CONFIG_IA64_XEN_GUEST=y
+-# CONFIG_ITANIUM is not set
+-CONFIG_MCKINLEY=y
+-# CONFIG_IA64_PAGE_SIZE_4KB is not set
+-# CONFIG_IA64_PAGE_SIZE_8KB is not set
+-CONFIG_IA64_PAGE_SIZE_16KB=y
+-# CONFIG_IA64_PAGE_SIZE_64KB is not set
+-CONFIG_PGTABLE_3=y
+-# CONFIG_PGTABLE_4 is not set
+-CONFIG_HZ=250
+-# CONFIG_HZ_100 is not set
+-CONFIG_HZ_250=y
+-# CONFIG_HZ_300 is not set
+-# CONFIG_HZ_1000 is not set
+-# CONFIG_SCHED_HRTICK is not set
+-CONFIG_IA64_L1_CACHE_SHIFT=7
+-CONFIG_IA64_CYCLONE=y
+-CONFIG_IOSAPIC=y
+-CONFIG_FORCE_MAX_ZONEORDER=17
+-# CONFIG_VIRT_CPU_ACCOUNTING is not set
+-CONFIG_SMP=y
+-CONFIG_NR_CPUS=16
+-CONFIG_HOTPLUG_CPU=y
+-CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+-CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
+-# CONFIG_SCHED_SMT is not set
+-CONFIG_PERMIT_BSP_REMOVE=y
+-CONFIG_FORCE_CPEI_RETARGET=y
+-CONFIG_PREEMPT_NONE=y
+-# CONFIG_PREEMPT_VOLUNTARY is not set
+-# CONFIG_PREEMPT is not set
+-CONFIG_SELECT_MEMORY_MODEL=y
+-CONFIG_FLATMEM_MANUAL=y
+-# CONFIG_DISCONTIGMEM_MANUAL is not set
+-# CONFIG_SPARSEMEM_MANUAL is not set
+-CONFIG_FLATMEM=y
+-CONFIG_FLAT_NODE_MEM_MAP=y
+-CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
+-CONFIG_PAGEFLAGS_EXTENDED=y
+-CONFIG_SPLIT_PTLOCK_CPUS=4
+-CONFIG_MIGRATION=y
+-CONFIG_PHYS_ADDR_T_64BIT=y
+-CONFIG_ZONE_DMA_FLAG=1
+-CONFIG_BOUNCE=y
+-CONFIG_NR_QUICK=1
+-CONFIG_VIRT_TO_BUS=y
+-CONFIG_UNEVICTABLE_LRU=y
+-CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+-CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
+-CONFIG_ARCH_FLATMEM_ENABLE=y
+-CONFIG_ARCH_SPARSEMEM_ENABLE=y
+-CONFIG_ARCH_POPULATES_NODE_MAP=y
+-CONFIG_VIRTUAL_MEM_MAP=y
+-CONFIG_HOLES_IN_ZONE=y
+-# CONFIG_IA32_SUPPORT is not set
+-# CONFIG_COMPAT_FOR_U64_ALIGNMENT is not set
+-CONFIG_IA64_MCA_RECOVERY=y
+-CONFIG_PERFMON=y
+-CONFIG_IA64_PALINFO=y
+-# CONFIG_IA64_MC_ERR_INJECT is not set
+-# CONFIG_IA64_ESI is not set
+-# CONFIG_IA64_HP_AML_NFW is not set
+-CONFIG_KEXEC=y
+-# CONFIG_CRASH_DUMP is not set
+-
+-#
+-# Firmware Drivers
+-#
+-# CONFIG_FIRMWARE_MEMMAP is not set
+-CONFIG_EFI_VARS=y
+-CONFIG_EFI_PCDP=y
+-CONFIG_DMIID=y
+-CONFIG_BINFMT_ELF=y
+-# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+-# CONFIG_HAVE_AOUT is not set
+-CONFIG_BINFMT_MISC=m
+-
+-#
+-# Power management and ACPI options
+-#
+-CONFIG_PM=y
+-# CONFIG_PM_DEBUG is not set
+-CONFIG_PM_SLEEP=y
+-CONFIG_SUSPEND=y
+-CONFIG_SUSPEND_FREEZER=y
+-CONFIG_ACPI=y
+-CONFIG_ACPI_SLEEP=y
+-CONFIG_ACPI_PROCFS=y
+-CONFIG_ACPI_PROCFS_POWER=y
+-CONFIG_ACPI_SYSFS_POWER=y
+-CONFIG_ACPI_PROC_EVENT=y
+-CONFIG_ACPI_BUTTON=m
+-CONFIG_ACPI_FAN=m
+-# CONFIG_ACPI_DOCK is not set
+-CONFIG_ACPI_PROCESSOR=m
+-CONFIG_ACPI_HOTPLUG_CPU=y
+-CONFIG_ACPI_THERMAL=m
+-# CONFIG_ACPI_CUSTOM_DSDT is not set
+-CONFIG_ACPI_BLACKLIST_YEAR=0
+-# CONFIG_ACPI_DEBUG is not set
+-# CONFIG_ACPI_PCI_SLOT is not set
+-CONFIG_ACPI_SYSTEM=y
+-CONFIG_ACPI_CONTAINER=m
+-
+-#
+-# CPU Frequency scaling
+-#
+-# CONFIG_CPU_FREQ is not set
+-
+-#
+-# Bus options (PCI, PCMCIA)
+-#
+-CONFIG_PCI=y
+-CONFIG_PCI_DOMAINS=y
+-CONFIG_PCI_SYSCALL=y
+-# CONFIG_PCIEPORTBUS is not set
+-CONFIG_ARCH_SUPPORTS_MSI=y
+-# CONFIG_PCI_MSI is not set
+-CONFIG_PCI_LEGACY=y
+-# CONFIG_PCI_DEBUG is not set
+-# CONFIG_PCI_STUB is not set
+-CONFIG_HOTPLUG_PCI=m
+-# CONFIG_HOTPLUG_PCI_FAKE is not set
+-CONFIG_HOTPLUG_PCI_ACPI=m
+-# CONFIG_HOTPLUG_PCI_ACPI_IBM is not set
+-# CONFIG_HOTPLUG_PCI_CPCI is not set
+-# CONFIG_HOTPLUG_PCI_SHPC is not set
+-# CONFIG_PCCARD is not set
+-CONFIG_NET=y
+-
+-#
+-# Networking options
+-#
+-# CONFIG_NET_NS is not set
+-CONFIG_COMPAT_NET_DEV_OPS=y
+-CONFIG_PACKET=y
+-# CONFIG_PACKET_MMAP is not set
+-CONFIG_UNIX=y
+-CONFIG_XFRM=y
+-# CONFIG_XFRM_USER is not set
+-# CONFIG_XFRM_SUB_POLICY is not set
+-# CONFIG_XFRM_MIGRATE is not set
+-# CONFIG_XFRM_STATISTICS is not set
+-# CONFIG_NET_KEY is not set
+-CONFIG_INET=y
+-CONFIG_IP_MULTICAST=y
+-# CONFIG_IP_ADVANCED_ROUTER is not set
+-CONFIG_IP_FIB_HASH=y
+-# CONFIG_IP_PNP is not set
+-# CONFIG_NET_IPIP is not set
+-# CONFIG_NET_IPGRE is not set
+-# CONFIG_IP_MROUTE is not set
+-CONFIG_ARPD=y
+-CONFIG_SYN_COOKIES=y
+-# CONFIG_INET_AH is not set
+-# CONFIG_INET_ESP is not set
+-# CONFIG_INET_IPCOMP is not set
+-# CONFIG_INET_XFRM_TUNNEL is not set
+-# CONFIG_INET_TUNNEL is not set
+-CONFIG_INET_XFRM_MODE_TRANSPORT=y
+-CONFIG_INET_XFRM_MODE_TUNNEL=y
+-CONFIG_INET_XFRM_MODE_BEET=y
+-# CONFIG_INET_LRO is not set
+-CONFIG_INET_DIAG=y
+-CONFIG_INET_TCP_DIAG=y
+-# CONFIG_TCP_CONG_ADVANCED is not set
+-CONFIG_TCP_CONG_CUBIC=y
+-CONFIG_DEFAULT_TCP_CONG="cubic"
+-# CONFIG_TCP_MD5SIG is not set
+-# CONFIG_IPV6 is not set
+-# CONFIG_NETWORK_SECMARK is not set
+-# CONFIG_NETFILTER is not set
+-# CONFIG_IP_DCCP is not set
+-# CONFIG_IP_SCTP is not set
+-# CONFIG_TIPC is not set
+-# CONFIG_ATM is not set
+-# CONFIG_BRIDGE is not set
+-# CONFIG_NET_DSA is not set
+-# CONFIG_VLAN_8021Q is not set
+-# CONFIG_DECNET is not set
+-# CONFIG_LLC2 is not set
+-# CONFIG_IPX is not set
+-# CONFIG_ATALK is not set
+-# CONFIG_X25 is not set
+-# CONFIG_LAPB is not set
+-# CONFIG_ECONET is not set
+-# CONFIG_WAN_ROUTER is not set
+-# CONFIG_NET_SCHED is not set
+-# CONFIG_DCB is not set
+-
+-#
+-# Network testing
+-#
+-# CONFIG_NET_PKTGEN is not set
+-# CONFIG_HAMRADIO is not set
+-# CONFIG_CAN is not set
+-# CONFIG_IRDA is not set
+-# CONFIG_BT is not set
+-# CONFIG_AF_RXRPC is not set
+-# CONFIG_PHONET is not set
+-# CONFIG_WIRELESS is not set
+-# CONFIG_WIMAX is not set
+-# CONFIG_RFKILL is not set
+-# CONFIG_NET_9P is not set
+-
+-#
+-# Device Drivers
+-#
+-
+-#
+-# Generic Driver Options
+-#
+-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+-CONFIG_STANDALONE=y
+-CONFIG_PREVENT_FIRMWARE_BUILD=y
+-CONFIG_FW_LOADER=y
+-CONFIG_FIRMWARE_IN_KERNEL=y
+-CONFIG_EXTRA_FIRMWARE=""
+-# CONFIG_DEBUG_DRIVER is not set
+-# CONFIG_DEBUG_DEVRES is not set
+-# CONFIG_SYS_HYPERVISOR is not set
+-# CONFIG_CONNECTOR is not set
+-# CONFIG_MTD is not set
+-# CONFIG_PARPORT is not set
+-CONFIG_PNP=y
+-CONFIG_PNP_DEBUG_MESSAGES=y
+-
+-#
+-# Protocols
+-#
+-CONFIG_PNPACPI=y
+-CONFIG_BLK_DEV=y
+-# CONFIG_BLK_CPQ_DA is not set
+-# CONFIG_BLK_CPQ_CISS_DA is not set
+-# CONFIG_BLK_DEV_DAC960 is not set
+-# CONFIG_BLK_DEV_UMEM is not set
+-# CONFIG_BLK_DEV_COW_COMMON is not set
+-CONFIG_BLK_DEV_LOOP=m
+-CONFIG_BLK_DEV_CRYPTOLOOP=m
+-CONFIG_BLK_DEV_NBD=m
+-# CONFIG_BLK_DEV_SX8 is not set
+-# CONFIG_BLK_DEV_UB is not set
+-CONFIG_BLK_DEV_RAM=y
+-CONFIG_BLK_DEV_RAM_COUNT=16
+-CONFIG_BLK_DEV_RAM_SIZE=4096
+-# CONFIG_BLK_DEV_XIP is not set
+-# CONFIG_CDROM_PKTCDVD is not set
+-# CONFIG_ATA_OVER_ETH is not set
+-CONFIG_XEN_BLKDEV_FRONTEND=y
+-# CONFIG_BLK_DEV_HD is not set
+-CONFIG_MISC_DEVICES=y
+-# CONFIG_PHANTOM is not set
+-# CONFIG_EEPROM_93CX6 is not set
+-# CONFIG_SGI_IOC4 is not set
+-# CONFIG_TIFM_CORE is not set
+-# CONFIG_ICS932S401 is not set
+-# CONFIG_ENCLOSURE_SERVICES is not set
+-# CONFIG_HP_ILO is not set
+-# CONFIG_C2PORT is not set
+-CONFIG_HAVE_IDE=y
+-CONFIG_IDE=y
+-
+-#
+-# Please see Documentation/ide/ide.txt for help/info on IDE drives
+-#
+-CONFIG_IDE_TIMINGS=y
+-CONFIG_IDE_ATAPI=y
+-# CONFIG_BLK_DEV_IDE_SATA is not set
+-CONFIG_IDE_GD=y
+-CONFIG_IDE_GD_ATA=y
+-# CONFIG_IDE_GD_ATAPI is not set
+-CONFIG_BLK_DEV_IDECD=y
+-CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
+-# CONFIG_BLK_DEV_IDETAPE is not set
+-# CONFIG_BLK_DEV_IDEACPI is not set
+-# CONFIG_IDE_TASK_IOCTL is not set
+-CONFIG_IDE_PROC_FS=y
+-
+-#
+-# IDE chipset support/bugfixes
+-#
+-# CONFIG_IDE_GENERIC is not set
+-# CONFIG_BLK_DEV_PLATFORM is not set
+-# CONFIG_BLK_DEV_IDEPNP is not set
+-CONFIG_BLK_DEV_IDEDMA_SFF=y
+-
+-#
+-# PCI IDE chipsets support
+-#
+-CONFIG_BLK_DEV_IDEPCI=y
+-CONFIG_IDEPCI_PCIBUS_ORDER=y
+-# CONFIG_BLK_DEV_OFFBOARD is not set
+-CONFIG_BLK_DEV_GENERIC=y
+-# CONFIG_BLK_DEV_OPTI621 is not set
+-CONFIG_BLK_DEV_IDEDMA_PCI=y
+-# CONFIG_BLK_DEV_AEC62XX is not set
+-# CONFIG_BLK_DEV_ALI15X3 is not set
+-# CONFIG_BLK_DEV_AMD74XX is not set
+-CONFIG_BLK_DEV_CMD64X=y
+-# CONFIG_BLK_DEV_TRIFLEX is not set
+-# CONFIG_BLK_DEV_CS5520 is not set
+-# CONFIG_BLK_DEV_CS5530 is not set
+-# CONFIG_BLK_DEV_HPT366 is not set
+-# CONFIG_BLK_DEV_JMICRON is not set
+-# CONFIG_BLK_DEV_SC1200 is not set
+-CONFIG_BLK_DEV_PIIX=y
+-# CONFIG_BLK_DEV_IT8172 is not set
+-# CONFIG_BLK_DEV_IT8213 is not set
+-# CONFIG_BLK_DEV_IT821X is not set
+-# CONFIG_BLK_DEV_NS87415 is not set
+-# CONFIG_BLK_DEV_PDC202XX_OLD is not set
+-# CONFIG_BLK_DEV_PDC202XX_NEW is not set
+-# CONFIG_BLK_DEV_SVWKS is not set
+-# CONFIG_BLK_DEV_SIIMAGE is not set
+-# CONFIG_BLK_DEV_SLC90E66 is not set
+-# CONFIG_BLK_DEV_TRM290 is not set
+-# CONFIG_BLK_DEV_VIA82CXXX is not set
+-# CONFIG_BLK_DEV_TC86C001 is not set
+-CONFIG_BLK_DEV_IDEDMA=y
+-
+-#
+-# SCSI device support
+-#
+-# CONFIG_RAID_ATTRS is not set
+-CONFIG_SCSI=y
+-CONFIG_SCSI_DMA=y
+-# CONFIG_SCSI_TGT is not set
+-CONFIG_SCSI_NETLINK=y
+-CONFIG_SCSI_PROC_FS=y
+-
+-#
+-# SCSI support type (disk, tape, CD-ROM)
+-#
+-CONFIG_BLK_DEV_SD=y
+-CONFIG_CHR_DEV_ST=m
+-# CONFIG_CHR_DEV_OSST is not set
+-CONFIG_BLK_DEV_SR=m
+-# CONFIG_BLK_DEV_SR_VENDOR is not set
+-CONFIG_CHR_DEV_SG=m
+-# CONFIG_CHR_DEV_SCH is not set
+-
+-#
+-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+-#
+-# CONFIG_SCSI_MULTI_LUN is not set
+-# CONFIG_SCSI_CONSTANTS is not set
+-# CONFIG_SCSI_LOGGING is not set
+-# CONFIG_SCSI_SCAN_ASYNC is not set
+-CONFIG_SCSI_WAIT_SCAN=m
+-
+-#
+-# SCSI Transports
+-#
+-CONFIG_SCSI_SPI_ATTRS=y
+-CONFIG_SCSI_FC_ATTRS=y
+-# CONFIG_SCSI_ISCSI_ATTRS is not set
+-# CONFIG_SCSI_SAS_LIBSAS is not set
+-# CONFIG_SCSI_SRP_ATTRS is not set
+-CONFIG_SCSI_LOWLEVEL=y
+-# CONFIG_ISCSI_TCP is not set
+-# CONFIG_SCSI_CXGB3_ISCSI is not set
+-# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+-# CONFIG_SCSI_3W_9XXX is not set
+-# CONFIG_SCSI_ACARD is not set
+-# CONFIG_SCSI_AACRAID is not set
+-# CONFIG_SCSI_AIC7XXX is not set
+-# CONFIG_SCSI_AIC7XXX_OLD is not set
+-# CONFIG_SCSI_AIC79XX is not set
+-# CONFIG_SCSI_AIC94XX is not set
+-# CONFIG_SCSI_DPT_I2O is not set
+-# CONFIG_SCSI_ADVANSYS is not set
+-# CONFIG_SCSI_ARCMSR is not set
+-# CONFIG_MEGARAID_NEWGEN is not set
+-# CONFIG_MEGARAID_LEGACY is not set
+-# CONFIG_MEGARAID_SAS is not set
+-# CONFIG_SCSI_HPTIOP is not set
+-# CONFIG_LIBFC is not set
+-# CONFIG_FCOE is not set
+-# CONFIG_SCSI_DMX3191D is not set
+-# CONFIG_SCSI_FUTURE_DOMAIN is not set
+-# CONFIG_SCSI_IPS is not set
+-# CONFIG_SCSI_INITIO is not set
+-# CONFIG_SCSI_INIA100 is not set
+-# CONFIG_SCSI_MVSAS is not set
+-# CONFIG_SCSI_STEX is not set
+-CONFIG_SCSI_SYM53C8XX_2=y
+-CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
+-CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
+-CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
+-CONFIG_SCSI_SYM53C8XX_MMIO=y
+-CONFIG_SCSI_QLOGIC_1280=y
+-# CONFIG_SCSI_QLA_FC is not set
+-# CONFIG_SCSI_QLA_ISCSI is not set
+-# CONFIG_SCSI_LPFC is not set
+-# CONFIG_SCSI_DC395x is not set
+-# CONFIG_SCSI_DC390T is not set
+-# CONFIG_SCSI_DEBUG is not set
+-# CONFIG_SCSI_SRP is not set
+-# CONFIG_SCSI_DH is not set
+-# CONFIG_ATA is not set
+-CONFIG_MD=y
+-CONFIG_BLK_DEV_MD=m
+-CONFIG_MD_LINEAR=m
+-CONFIG_MD_RAID0=m
+-CONFIG_MD_RAID1=m
+-# CONFIG_MD_RAID10 is not set
+-# CONFIG_MD_RAID456 is not set
+-CONFIG_MD_MULTIPATH=m
+-# CONFIG_MD_FAULTY is not set
+-CONFIG_BLK_DEV_DM=m
+-# CONFIG_DM_DEBUG is not set
+-CONFIG_DM_CRYPT=m
+-CONFIG_DM_SNAPSHOT=m
+-CONFIG_DM_MIRROR=m
+-CONFIG_DM_ZERO=m
+-# CONFIG_DM_MULTIPATH is not set
+-# CONFIG_DM_DELAY is not set
+-# CONFIG_DM_UEVENT is not set
+-CONFIG_FUSION=y
+-CONFIG_FUSION_SPI=y
+-CONFIG_FUSION_FC=y
+-# CONFIG_FUSION_SAS is not set
+-CONFIG_FUSION_MAX_SGE=128
+-CONFIG_FUSION_CTL=y
+-# CONFIG_FUSION_LOGGING is not set
+-
+-#
+-# IEEE 1394 (FireWire) support
+-#
+-
+-#
+-# Enable only one of the two stacks, unless you know what you are doing
+-#
+-# CONFIG_FIREWIRE is not set
+-# CONFIG_IEEE1394 is not set
+-# CONFIG_I2O is not set
+-CONFIG_NETDEVICES=y
+-CONFIG_DUMMY=m
+-# CONFIG_BONDING is not set
+-# CONFIG_MACVLAN is not set
+-# CONFIG_EQUALIZER is not set
+-# CONFIG_TUN is not set
+-# CONFIG_VETH is not set
+-# CONFIG_NET_SB1000 is not set
+-# CONFIG_ARCNET is not set
+-CONFIG_PHYLIB=y
+-
+-#
+-# MII PHY device drivers
+-#
+-# CONFIG_MARVELL_PHY is not set
+-# CONFIG_DAVICOM_PHY is not set
+-# CONFIG_QSEMI_PHY is not set
+-# CONFIG_LXT_PHY is not set
+-# CONFIG_CICADA_PHY is not set
+-# CONFIG_VITESSE_PHY is not set
+-# CONFIG_SMSC_PHY is not set
+-# CONFIG_BROADCOM_PHY is not set
+-# CONFIG_ICPLUS_PHY is not set
+-# CONFIG_REALTEK_PHY is not set
+-# CONFIG_NATIONAL_PHY is not set
+-# CONFIG_STE10XP is not set
+-# CONFIG_LSI_ET1011C_PHY is not set
+-# CONFIG_FIXED_PHY is not set
+-# CONFIG_MDIO_BITBANG is not set
+-CONFIG_NET_ETHERNET=y
+-CONFIG_MII=m
+-# CONFIG_HAPPYMEAL is not set
+-# CONFIG_SUNGEM is not set
+-# CONFIG_CASSINI is not set
+-# CONFIG_NET_VENDOR_3COM is not set
+-CONFIG_NET_TULIP=y
+-# CONFIG_DE2104X is not set
+-CONFIG_TULIP=m
+-# CONFIG_TULIP_MWI is not set
+-# CONFIG_TULIP_MMIO is not set
+-# CONFIG_TULIP_NAPI is not set
+-# CONFIG_DE4X5 is not set
+-# CONFIG_WINBOND_840 is not set
+-# CONFIG_DM9102 is not set
+-# CONFIG_ULI526X is not set
+-# CONFIG_HP100 is not set
+-# CONFIG_IBM_NEW_EMAC_ZMII is not set
+-# CONFIG_IBM_NEW_EMAC_RGMII is not set
+-# CONFIG_IBM_NEW_EMAC_TAH is not set
+-# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+-# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
+-# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
+-# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
+-CONFIG_NET_PCI=y
+-# CONFIG_PCNET32 is not set
+-# CONFIG_AMD8111_ETH is not set
+-# CONFIG_ADAPTEC_STARFIRE is not set
+-# CONFIG_B44 is not set
+-# CONFIG_FORCEDETH is not set
+-CONFIG_E100=m
+-# CONFIG_FEALNX is not set
+-# CONFIG_NATSEMI is not set
+-# CONFIG_NE2K_PCI is not set
+-# CONFIG_8139CP is not set
+-# CONFIG_8139TOO is not set
+-# CONFIG_R6040 is not set
+-# CONFIG_SIS900 is not set
+-# CONFIG_EPIC100 is not set
+-# CONFIG_SMSC9420 is not set
+-# CONFIG_SUNDANCE is not set
+-# CONFIG_TLAN is not set
+-# CONFIG_VIA_RHINE is not set
+-# CONFIG_SC92031 is not set
+-# CONFIG_ATL2 is not set
+-CONFIG_NETDEV_1000=y
+-# CONFIG_ACENIC is not set
+-# CONFIG_DL2K is not set
+-CONFIG_E1000=y
+-# CONFIG_E1000E is not set
+-# CONFIG_IP1000 is not set
+-# CONFIG_IGB is not set
+-# CONFIG_NS83820 is not set
+-# CONFIG_HAMACHI is not set
+-# CONFIG_YELLOWFIN is not set
+-# CONFIG_R8169 is not set
+-# CONFIG_SIS190 is not set
+-# CONFIG_SKGE is not set
+-# CONFIG_SKY2 is not set
+-# CONFIG_VIA_VELOCITY is not set
+-CONFIG_TIGON3=y
+-# CONFIG_BNX2 is not set
+-# CONFIG_QLA3XXX is not set
+-# CONFIG_ATL1 is not set
+-# CONFIG_ATL1E is not set
+-# CONFIG_JME is not set
+-CONFIG_NETDEV_10000=y
+-# CONFIG_CHELSIO_T1 is not set
+-CONFIG_CHELSIO_T3_DEPENDS=y
+-# CONFIG_CHELSIO_T3 is not set
+-# CONFIG_ENIC is not set
+-# CONFIG_IXGBE is not set
+-# CONFIG_IXGB is not set
+-# CONFIG_S2IO is not set
+-# CONFIG_MYRI10GE is not set
+-# CONFIG_NETXEN_NIC is not set
+-# CONFIG_NIU is not set
+-# CONFIG_MLX4_EN is not set
+-# CONFIG_MLX4_CORE is not set
+-# CONFIG_TEHUTI is not set
+-# CONFIG_BNX2X is not set
+-# CONFIG_QLGE is not set
+-# CONFIG_SFC is not set
+-# CONFIG_TR is not set
+-
+-#
+-# Wireless LAN
+-#
+-# CONFIG_WLAN_PRE80211 is not set
+-# CONFIG_WLAN_80211 is not set
+-# CONFIG_IWLWIFI_LEDS is not set
+-
+-#
+-# Enable WiMAX (Networking options) to see the WiMAX drivers
+-#
+-
+-#
+-# USB Network Adapters
+-#
+-# CONFIG_USB_CATC is not set
+-# CONFIG_USB_KAWETH is not set
+-# CONFIG_USB_PEGASUS is not set
+-# CONFIG_USB_RTL8150 is not set
+-# CONFIG_USB_USBNET is not set
+-# CONFIG_WAN is not set
+-CONFIG_XEN_NETDEV_FRONTEND=y
+-# CONFIG_FDDI is not set
+-# CONFIG_HIPPI is not set
+-# CONFIG_PPP is not set
+-# CONFIG_SLIP is not set
+-# CONFIG_NET_FC is not set
+-CONFIG_NETCONSOLE=y
+-# CONFIG_NETCONSOLE_DYNAMIC is not set
+-CONFIG_NETPOLL=y
+-# CONFIG_NETPOLL_TRAP is not set
+-CONFIG_NET_POLL_CONTROLLER=y
+-# CONFIG_ISDN is not set
+-# CONFIG_PHONE is not set
+-
+-#
+-# Input device support
+-#
+-CONFIG_INPUT=y
+-# CONFIG_INPUT_FF_MEMLESS is not set
+-# CONFIG_INPUT_POLLDEV is not set
+-
+-#
+-# Userland interfaces
+-#
+-CONFIG_INPUT_MOUSEDEV=y
+-CONFIG_INPUT_MOUSEDEV_PSAUX=y
+-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+-# CONFIG_INPUT_JOYDEV is not set
+-# CONFIG_INPUT_EVDEV is not set
+-# CONFIG_INPUT_EVBUG is not set
+-
+-#
+-# Input Device Drivers
+-#
+-CONFIG_INPUT_KEYBOARD=y
+-CONFIG_KEYBOARD_ATKBD=y
+-# CONFIG_KEYBOARD_SUNKBD is not set
+-# CONFIG_KEYBOARD_LKKBD is not set
+-# CONFIG_KEYBOARD_XTKBD is not set
+-# CONFIG_KEYBOARD_NEWTON is not set
+-# CONFIG_KEYBOARD_STOWAWAY is not set
+-CONFIG_INPUT_MOUSE=y
+-CONFIG_MOUSE_PS2=y
+-CONFIG_MOUSE_PS2_ALPS=y
+-CONFIG_MOUSE_PS2_LOGIPS2PP=y
+-CONFIG_MOUSE_PS2_SYNAPTICS=y
+-CONFIG_MOUSE_PS2_LIFEBOOK=y
+-CONFIG_MOUSE_PS2_TRACKPOINT=y
+-# CONFIG_MOUSE_PS2_ELANTECH is not set
+-# CONFIG_MOUSE_PS2_TOUCHKIT is not set
+-# CONFIG_MOUSE_SERIAL is not set
+-# CONFIG_MOUSE_APPLETOUCH is not set
+-# CONFIG_MOUSE_BCM5974 is not set
+-# CONFIG_MOUSE_VSXXXAA is not set
+-# CONFIG_INPUT_JOYSTICK is not set
+-# CONFIG_INPUT_TABLET is not set
+-# CONFIG_INPUT_TOUCHSCREEN is not set
+-# CONFIG_INPUT_MISC is not set
+-
+-#
+-# Hardware I/O ports
+-#
+-CONFIG_SERIO=y
+-CONFIG_SERIO_I8042=y
+-# CONFIG_SERIO_SERPORT is not set
+-# CONFIG_SERIO_PCIPS2 is not set
+-CONFIG_SERIO_LIBPS2=y
+-# CONFIG_SERIO_RAW is not set
+-CONFIG_GAMEPORT=m
+-# CONFIG_GAMEPORT_NS558 is not set
+-# CONFIG_GAMEPORT_L4 is not set
+-# CONFIG_GAMEPORT_EMU10K1 is not set
+-# CONFIG_GAMEPORT_FM801 is not set
+-
+-#
+-# Character devices
+-#
+-CONFIG_VT=y
+-CONFIG_CONSOLE_TRANSLATIONS=y
+-CONFIG_VT_CONSOLE=y
+-CONFIG_HW_CONSOLE=y
+-# CONFIG_VT_HW_CONSOLE_BINDING is not set
+-CONFIG_DEVKMEM=y
+-CONFIG_SERIAL_NONSTANDARD=y
+-# CONFIG_COMPUTONE is not set
+-# CONFIG_ROCKETPORT is not set
+-# CONFIG_CYCLADES is not set
+-# CONFIG_DIGIEPCA is not set
+-# CONFIG_MOXA_INTELLIO is not set
+-# CONFIG_MOXA_SMARTIO is not set
+-# CONFIG_ISI is not set
+-# CONFIG_SYNCLINKMP is not set
+-# CONFIG_SYNCLINK_GT is not set
+-# CONFIG_N_HDLC is not set
+-# CONFIG_RISCOM8 is not set
+-# CONFIG_SPECIALIX is not set
+-# CONFIG_SX is not set
+-# CONFIG_RIO is not set
+-# CONFIG_STALDRV is not set
+-# CONFIG_NOZOMI is not set
+-
+-#
+-# Serial drivers
+-#
+-CONFIG_SERIAL_8250=y
+-CONFIG_SERIAL_8250_CONSOLE=y
+-CONFIG_SERIAL_8250_PCI=y
+-CONFIG_SERIAL_8250_PNP=y
+-CONFIG_SERIAL_8250_NR_UARTS=6
+-CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+-CONFIG_SERIAL_8250_EXTENDED=y
+-CONFIG_SERIAL_8250_SHARE_IRQ=y
+-# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+-# CONFIG_SERIAL_8250_RSA is not set
+-
+-#
+-# Non-8250 serial port support
+-#
+-CONFIG_SERIAL_CORE=y
+-CONFIG_SERIAL_CORE_CONSOLE=y
+-# CONFIG_SERIAL_JSM is not set
+-CONFIG_UNIX98_PTYS=y
+-# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+-CONFIG_LEGACY_PTYS=y
+-CONFIG_LEGACY_PTY_COUNT=256
+-CONFIG_HVC_DRIVER=y
+-CONFIG_HVC_IRQ=y
+-CONFIG_HVC_XEN=y
+-# CONFIG_IPMI_HANDLER is not set
+-# CONFIG_HW_RANDOM is not set
+-CONFIG_EFI_RTC=y
+-# CONFIG_R3964 is not set
+-# CONFIG_APPLICOM is not set
+-CONFIG_RAW_DRIVER=m
+-CONFIG_MAX_RAW_DEVS=256
+-CONFIG_HPET=y
+-CONFIG_HPET_MMAP=y
+-# CONFIG_HANGCHECK_TIMER is not set
+-# CONFIG_TCG_TPM is not set
+-CONFIG_DEVPORT=y
+-CONFIG_I2C=m
+-CONFIG_I2C_BOARDINFO=y
+-# CONFIG_I2C_CHARDEV is not set
+-CONFIG_I2C_HELPER_AUTO=y
+-CONFIG_I2C_ALGOBIT=m
+-
+-#
+-# I2C Hardware Bus support
+-#
+-
+-#
+-# PC SMBus host controller drivers
+-#
+-# CONFIG_I2C_ALI1535 is not set
+-# CONFIG_I2C_ALI1563 is not set
+-# CONFIG_I2C_ALI15X3 is not set
+-# CONFIG_I2C_AMD756 is not set
+-# CONFIG_I2C_AMD8111 is not set
+-# CONFIG_I2C_I801 is not set
+-# CONFIG_I2C_ISCH is not set
+-# CONFIG_I2C_PIIX4 is not set
+-# CONFIG_I2C_NFORCE2 is not set
+-# CONFIG_I2C_SIS5595 is not set
+-# CONFIG_I2C_SIS630 is not set
+-# CONFIG_I2C_SIS96X is not set
+-# CONFIG_I2C_VIA is not set
+-# CONFIG_I2C_VIAPRO is not set
+-
+-#
+-# I2C system bus drivers (mostly embedded / system-on-chip)
+-#
+-# CONFIG_I2C_OCORES is not set
+-# CONFIG_I2C_SIMTEC is not set
+-
+-#
+-# External I2C/SMBus adapter drivers
+-#
+-# CONFIG_I2C_PARPORT_LIGHT is not set
+-# CONFIG_I2C_TAOS_EVM is not set
+-# CONFIG_I2C_TINY_USB is not set
+-
+-#
+-# Graphics adapter I2C/DDC channel drivers
+-#
+-# CONFIG_I2C_VOODOO3 is not set
+-
+-#
+-# Other I2C/SMBus bus drivers
+-#
+-# CONFIG_I2C_PCA_PLATFORM is not set
+-# CONFIG_I2C_STUB is not set
+-
+-#
+-# Miscellaneous I2C Chip support
+-#
+-# CONFIG_DS1682 is not set
+-# CONFIG_AT24 is not set
+-# CONFIG_SENSORS_EEPROM is not set
+-# CONFIG_SENSORS_PCF8574 is not set
+-# CONFIG_PCF8575 is not set
+-# CONFIG_SENSORS_PCA9539 is not set
+-# CONFIG_SENSORS_PCF8591 is not set
+-# CONFIG_SENSORS_MAX6875 is not set
+-# CONFIG_SENSORS_TSL2550 is not set
+-# CONFIG_I2C_DEBUG_CORE is not set
+-# CONFIG_I2C_DEBUG_ALGO is not set
+-# CONFIG_I2C_DEBUG_BUS is not set
+-# CONFIG_I2C_DEBUG_CHIP is not set
+-# CONFIG_SPI is not set
+-# CONFIG_W1 is not set
+-CONFIG_POWER_SUPPLY=y
+-# CONFIG_POWER_SUPPLY_DEBUG is not set
+-# CONFIG_PDA_POWER is not set
+-# CONFIG_BATTERY_DS2760 is not set
+-# CONFIG_BATTERY_BQ27x00 is not set
+-CONFIG_HWMON=y
+-# CONFIG_HWMON_VID is not set
+-# CONFIG_SENSORS_AD7414 is not set
+-# CONFIG_SENSORS_AD7418 is not set
+-# CONFIG_SENSORS_ADM1021 is not set
+-# CONFIG_SENSORS_ADM1025 is not set
+-# CONFIG_SENSORS_ADM1026 is not set
+-# CONFIG_SENSORS_ADM1029 is not set
+-# CONFIG_SENSORS_ADM1031 is not set
+-# CONFIG_SENSORS_ADM9240 is not set
+-# CONFIG_SENSORS_ADT7462 is not set
+-# CONFIG_SENSORS_ADT7470 is not set
+-# CONFIG_SENSORS_ADT7473 is not set
+-# CONFIG_SENSORS_ATXP1 is not set
+-# CONFIG_SENSORS_DS1621 is not set
+-# CONFIG_SENSORS_I5K_AMB is not set
+-# CONFIG_SENSORS_F71805F is not set
+-# CONFIG_SENSORS_F71882FG is not set
+-# CONFIG_SENSORS_F75375S is not set
+-# CONFIG_SENSORS_GL518SM is not set
+-# CONFIG_SENSORS_GL520SM is not set
+-# CONFIG_SENSORS_IT87 is not set
+-# CONFIG_SENSORS_LM63 is not set
+-# CONFIG_SENSORS_LM75 is not set
+-# CONFIG_SENSORS_LM77 is not set
+-# CONFIG_SENSORS_LM78 is not set
+-# CONFIG_SENSORS_LM80 is not set
+-# CONFIG_SENSORS_LM83 is not set
+-# CONFIG_SENSORS_LM85 is not set
+-# CONFIG_SENSORS_LM87 is not set
+-# CONFIG_SENSORS_LM90 is not set
+-# CONFIG_SENSORS_LM92 is not set
+-# CONFIG_SENSORS_LM93 is not set
+-# CONFIG_SENSORS_LTC4245 is not set
+-# CONFIG_SENSORS_MAX1619 is not set
+-# CONFIG_SENSORS_MAX6650 is not set
+-# CONFIG_SENSORS_PC87360 is not set
+-# CONFIG_SENSORS_PC87427 is not set
+-# CONFIG_SENSORS_SIS5595 is not set
+-# CONFIG_SENSORS_DME1737 is not set
+-# CONFIG_SENSORS_SMSC47M1 is not set
+-# CONFIG_SENSORS_SMSC47M192 is not set
+-# CONFIG_SENSORS_SMSC47B397 is not set
+-# CONFIG_SENSORS_ADS7828 is not set
+-# CONFIG_SENSORS_THMC50 is not set
+-# CONFIG_SENSORS_VIA686A is not set
+-# CONFIG_SENSORS_VT1211 is not set
+-# CONFIG_SENSORS_VT8231 is not set
+-# CONFIG_SENSORS_W83781D is not set
+-# CONFIG_SENSORS_W83791D is not set
+-# CONFIG_SENSORS_W83792D is not set
+-# CONFIG_SENSORS_W83793 is not set
+-# CONFIG_SENSORS_W83L785TS is not set
+-# CONFIG_SENSORS_W83L786NG is not set
+-# CONFIG_SENSORS_W83627HF is not set
+-# CONFIG_SENSORS_W83627EHF is not set
+-# CONFIG_SENSORS_LIS3LV02D is not set
+-# CONFIG_HWMON_DEBUG_CHIP is not set
+-CONFIG_THERMAL=m
+-# CONFIG_THERMAL_HWMON is not set
+-# CONFIG_WATCHDOG is not set
+-CONFIG_SSB_POSSIBLE=y
+-
+-#
+-# Sonics Silicon Backplane
+-#
+-# CONFIG_SSB is not set
+-
+-#
+-# Multifunction device drivers
+-#
+-# CONFIG_MFD_CORE is not set
+-# CONFIG_MFD_SM501 is not set
+-# CONFIG_HTC_PASIC3 is not set
+-# CONFIG_MFD_TMIO is not set
+-# CONFIG_MFD_WM8400 is not set
+-# CONFIG_MFD_WM8350_I2C is not set
+-# CONFIG_MFD_PCF50633 is not set
+-# CONFIG_REGULATOR is not set
+-
+-#
+-# Multimedia devices
+-#
+-
+-#
+-# Multimedia core support
+-#
+-# CONFIG_VIDEO_DEV is not set
+-# CONFIG_DVB_CORE is not set
+-# CONFIG_VIDEO_MEDIA is not set
+-
+-#
+-# Multimedia drivers
+-#
+-CONFIG_DAB=y
+-# CONFIG_USB_DABUSB is not set
+-
+-#
+-# Graphics support
+-#
+-CONFIG_AGP=m
+-CONFIG_DRM=m
+-CONFIG_DRM_TDFX=m
+-CONFIG_DRM_R128=m
+-CONFIG_DRM_RADEON=m
+-CONFIG_DRM_MGA=m
+-CONFIG_DRM_SIS=m
+-# CONFIG_DRM_VIA is not set
+-# CONFIG_DRM_SAVAGE is not set
+-# CONFIG_VGASTATE is not set
+-# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+-# CONFIG_FB is not set
+-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+-
+-#
+-# Display device support
+-#
+-# CONFIG_DISPLAY_SUPPORT is not set
+-
+-#
+-# Console display driver support
+-#
+-CONFIG_VGA_CONSOLE=y
+-# CONFIG_VGACON_SOFT_SCROLLBACK is not set
+-CONFIG_DUMMY_CONSOLE=y
+-# CONFIG_SOUND is not set
+-CONFIG_HID_SUPPORT=y
+-CONFIG_HID=y
+-# CONFIG_HID_DEBUG is not set
+-# CONFIG_HIDRAW is not set
+-
+-#
+-# USB Input Devices
+-#
+-CONFIG_USB_HID=y
+-# CONFIG_HID_PID is not set
+-# CONFIG_USB_HIDDEV is not set
+-
+-#
+-# Special HID drivers
+-#
+-CONFIG_HID_COMPAT=y
+-CONFIG_HID_A4TECH=y
+-CONFIG_HID_APPLE=y
+-CONFIG_HID_BELKIN=y
+-CONFIG_HID_CHERRY=y
+-CONFIG_HID_CHICONY=y
+-CONFIG_HID_CYPRESS=y
+-CONFIG_HID_EZKEY=y
+-CONFIG_HID_GYRATION=y
+-CONFIG_HID_LOGITECH=y
+-# CONFIG_LOGITECH_FF is not set
+-# CONFIG_LOGIRUMBLEPAD2_FF is not set
+-CONFIG_HID_MICROSOFT=y
+-CONFIG_HID_MONTEREY=y
+-CONFIG_HID_NTRIG=y
+-CONFIG_HID_PANTHERLORD=y
+-# CONFIG_PANTHERLORD_FF is not set
+-CONFIG_HID_PETALYNX=y
+-CONFIG_HID_SAMSUNG=y
+-CONFIG_HID_SONY=y
+-CONFIG_HID_SUNPLUS=y
+-# CONFIG_GREENASIA_FF is not set
+-CONFIG_HID_TOPSEED=y
+-# CONFIG_THRUSTMASTER_FF is not set
+-# CONFIG_ZEROPLUS_FF is not set
+-CONFIG_USB_SUPPORT=y
+-CONFIG_USB_ARCH_HAS_HCD=y
+-CONFIG_USB_ARCH_HAS_OHCI=y
+-CONFIG_USB_ARCH_HAS_EHCI=y
+-CONFIG_USB=y
+-# CONFIG_USB_DEBUG is not set
+-# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
+-
+-#
+-# Miscellaneous USB options
+-#
+-CONFIG_USB_DEVICEFS=y
+-CONFIG_USB_DEVICE_CLASS=y
+-# CONFIG_USB_DYNAMIC_MINORS is not set
+-# CONFIG_USB_SUSPEND is not set
+-# CONFIG_USB_OTG is not set
+-# CONFIG_USB_MON is not set
+-# CONFIG_USB_WUSB is not set
+-# CONFIG_USB_WUSB_CBAF is not set
+-
+-#
+-# USB Host Controller Drivers
+-#
+-# CONFIG_USB_C67X00_HCD is not set
+-CONFIG_USB_EHCI_HCD=m
+-# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+-# CONFIG_USB_EHCI_TT_NEWSCHED is not set
+-# CONFIG_USB_OXU210HP_HCD is not set
+-# CONFIG_USB_ISP116X_HCD is not set
+-# CONFIG_USB_ISP1760_HCD is not set
+-CONFIG_USB_OHCI_HCD=m
+-# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
+-# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
+-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+-CONFIG_USB_UHCI_HCD=y
+-# CONFIG_USB_SL811_HCD is not set
+-# CONFIG_USB_R8A66597_HCD is not set
+-# CONFIG_USB_WHCI_HCD is not set
+-# CONFIG_USB_HWA_HCD is not set
+-
+-#
+-# USB Device Class drivers
+-#
+-# CONFIG_USB_ACM is not set
+-# CONFIG_USB_PRINTER is not set
+-# CONFIG_USB_WDM is not set
+-# CONFIG_USB_TMC is not set
+-
+-#
+-# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
+-#
+-
+-#
+-# see USB_STORAGE Help for more information
+-#
+-CONFIG_USB_STORAGE=m
+-# CONFIG_USB_STORAGE_DEBUG is not set
+-# CONFIG_USB_STORAGE_DATAFAB is not set
+-# CONFIG_USB_STORAGE_FREECOM is not set
+-# CONFIG_USB_STORAGE_ISD200 is not set
+-# CONFIG_USB_STORAGE_USBAT is not set
+-# CONFIG_USB_STORAGE_SDDR09 is not set
+-# CONFIG_USB_STORAGE_SDDR55 is not set
+-# CONFIG_USB_STORAGE_JUMPSHOT is not set
+-# CONFIG_USB_STORAGE_ALAUDA is not set
+-# CONFIG_USB_STORAGE_ONETOUCH is not set
+-# CONFIG_USB_STORAGE_KARMA is not set
+-# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
+-# CONFIG_USB_LIBUSUAL is not set
+-
+-#
+-# USB Imaging devices
+-#
+-# CONFIG_USB_MDC800 is not set
+-# CONFIG_USB_MICROTEK is not set
+-
+-#
+-# USB port drivers
+-#
+-# CONFIG_USB_SERIAL is not set
+-
+-#
+-# USB Miscellaneous drivers
+-#
+-# CONFIG_USB_EMI62 is not set
+-# CONFIG_USB_EMI26 is not set
+-# CONFIG_USB_ADUTUX is not set
+-# CONFIG_USB_SEVSEG is not set
+-# CONFIG_USB_RIO500 is not set
+-# CONFIG_USB_LEGOTOWER is not set
+-# CONFIG_USB_LCD is not set
+-# CONFIG_USB_BERRY_CHARGE is not set
+-# CONFIG_USB_LED is not set
+-# CONFIG_USB_CYPRESS_CY7C63 is not set
+-# CONFIG_USB_CYTHERM is not set
+-# CONFIG_USB_PHIDGET is not set
+-# CONFIG_USB_IDMOUSE is not set
+-# CONFIG_USB_FTDI_ELAN is not set
+-# CONFIG_USB_APPLEDISPLAY is not set
+-# CONFIG_USB_SISUSBVGA is not set
+-# CONFIG_USB_LD is not set
+-# CONFIG_USB_TRANCEVIBRATOR is not set
+-# CONFIG_USB_IOWARRIOR is not set
+-# CONFIG_USB_TEST is not set
+-# CONFIG_USB_ISIGHTFW is not set
+-# CONFIG_USB_VST is not set
+-# CONFIG_USB_GADGET is not set
+-
+-#
+-# OTG and related infrastructure
+-#
+-# CONFIG_UWB is not set
+-# CONFIG_MMC is not set
+-# CONFIG_MEMSTICK is not set
+-# CONFIG_NEW_LEDS is not set
+-# CONFIG_ACCESSIBILITY is not set
+-# CONFIG_INFINIBAND is not set
+-# CONFIG_RTC_CLASS is not set
+-# CONFIG_DMADEVICES is not set
+-# CONFIG_UIO is not set
+-CONFIG_XEN_BALLOON=y
+-CONFIG_XEN_SCRUB_PAGES=y
+-CONFIG_XENFS=y
+-CONFIG_XEN_COMPAT_XENFS=y
+-# CONFIG_STAGING is not set
+-# CONFIG_MSPEC is not set
+-
+-#
+-# File systems
+-#
+-CONFIG_EXT2_FS=y
+-CONFIG_EXT2_FS_XATTR=y
+-CONFIG_EXT2_FS_POSIX_ACL=y
+-CONFIG_EXT2_FS_SECURITY=y
+-# CONFIG_EXT2_FS_XIP is not set
+-CONFIG_EXT3_FS=y
+-CONFIG_EXT3_FS_XATTR=y
+-CONFIG_EXT3_FS_POSIX_ACL=y
+-CONFIG_EXT3_FS_SECURITY=y
+-# CONFIG_EXT4_FS is not set
+-CONFIG_JBD=y
+-CONFIG_FS_MBCACHE=y
+-CONFIG_REISERFS_FS=y
+-# CONFIG_REISERFS_CHECK is not set
+-# CONFIG_REISERFS_PROC_INFO is not set
+-CONFIG_REISERFS_FS_XATTR=y
+-CONFIG_REISERFS_FS_POSIX_ACL=y
+-CONFIG_REISERFS_FS_SECURITY=y
+-# CONFIG_JFS_FS is not set
+-CONFIG_FS_POSIX_ACL=y
+-CONFIG_FILE_LOCKING=y
+-CONFIG_XFS_FS=y
+-# CONFIG_XFS_QUOTA is not set
+-# CONFIG_XFS_POSIX_ACL is not set
+-# CONFIG_XFS_RT is not set
+-# CONFIG_XFS_DEBUG is not set
+-# CONFIG_GFS2_FS is not set
+-# CONFIG_OCFS2_FS is not set
+-# CONFIG_BTRFS_FS is not set
+-CONFIG_DNOTIFY=y
+-CONFIG_INOTIFY=y
+-CONFIG_INOTIFY_USER=y
+-# CONFIG_QUOTA is not set
+-CONFIG_AUTOFS_FS=y
+-CONFIG_AUTOFS4_FS=y
+-# CONFIG_FUSE_FS is not set
+-
+-#
+-# CD-ROM/DVD Filesystems
+-#
+-CONFIG_ISO9660_FS=m
+-CONFIG_JOLIET=y
+-# CONFIG_ZISOFS is not set
+-CONFIG_UDF_FS=m
+-CONFIG_UDF_NLS=y
+-
+-#
+-# DOS/FAT/NT Filesystems
+-#
+-CONFIG_FAT_FS=y
+-# CONFIG_MSDOS_FS is not set
+-CONFIG_VFAT_FS=y
+-CONFIG_FAT_DEFAULT_CODEPAGE=437
+-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+-CONFIG_NTFS_FS=m
+-# CONFIG_NTFS_DEBUG is not set
+-# CONFIG_NTFS_RW is not set
+-
+-#
+-# Pseudo filesystems
+-#
+-CONFIG_PROC_FS=y
+-CONFIG_PROC_KCORE=y
+-CONFIG_PROC_SYSCTL=y
+-CONFIG_PROC_PAGE_MONITOR=y
+-CONFIG_SYSFS=y
+-CONFIG_TMPFS=y
+-# CONFIG_TMPFS_POSIX_ACL is not set
+-CONFIG_HUGETLBFS=y
+-CONFIG_HUGETLB_PAGE=y
+-# CONFIG_CONFIGFS_FS is not set
+-CONFIG_MISC_FILESYSTEMS=y
+-# CONFIG_ADFS_FS is not set
+-# CONFIG_AFFS_FS is not set
+-# CONFIG_HFS_FS is not set
+-# CONFIG_HFSPLUS_FS is not set
+-# CONFIG_BEFS_FS is not set
+-# CONFIG_BFS_FS is not set
+-# CONFIG_EFS_FS is not set
+-# CONFIG_CRAMFS is not set
+-# CONFIG_SQUASHFS is not set
+-# CONFIG_VXFS_FS is not set
+-# CONFIG_MINIX_FS is not set
+-# CONFIG_OMFS_FS is not set
+-# CONFIG_HPFS_FS is not set
+-# CONFIG_QNX4FS_FS is not set
+-# CONFIG_ROMFS_FS is not set
+-# CONFIG_SYSV_FS is not set
+-# CONFIG_UFS_FS is not set
+-CONFIG_NETWORK_FILESYSTEMS=y
+-CONFIG_NFS_FS=m
+-CONFIG_NFS_V3=y
+-# CONFIG_NFS_V3_ACL is not set
+-CONFIG_NFS_V4=y
+-CONFIG_NFSD=m
+-CONFIG_NFSD_V3=y
+-# CONFIG_NFSD_V3_ACL is not set
+-CONFIG_NFSD_V4=y
+-CONFIG_LOCKD=m
+-CONFIG_LOCKD_V4=y
+-CONFIG_EXPORTFS=m
+-CONFIG_NFS_COMMON=y
+-CONFIG_SUNRPC=m
+-CONFIG_SUNRPC_GSS=m
+-# CONFIG_SUNRPC_REGISTER_V4 is not set
+-CONFIG_RPCSEC_GSS_KRB5=m
+-# CONFIG_RPCSEC_GSS_SPKM3 is not set
+-CONFIG_SMB_FS=m
+-CONFIG_SMB_NLS_DEFAULT=y
+-CONFIG_SMB_NLS_REMOTE="cp437"
+-CONFIG_CIFS=m
+-# CONFIG_CIFS_STATS is not set
+-# CONFIG_CIFS_WEAK_PW_HASH is not set
+-# CONFIG_CIFS_XATTR is not set
+-# CONFIG_CIFS_DEBUG2 is not set
+-# CONFIG_CIFS_EXPERIMENTAL is not set
+-# CONFIG_NCP_FS is not set
+-# CONFIG_CODA_FS is not set
+-# CONFIG_AFS_FS is not set
+-
+-#
+-# Partition Types
+-#
+-CONFIG_PARTITION_ADVANCED=y
+-# CONFIG_ACORN_PARTITION is not set
+-# CONFIG_OSF_PARTITION is not set
+-# CONFIG_AMIGA_PARTITION is not set
+-# CONFIG_ATARI_PARTITION is not set
+-# CONFIG_MAC_PARTITION is not set
+-CONFIG_MSDOS_PARTITION=y
+-# CONFIG_BSD_DISKLABEL is not set
+-# CONFIG_MINIX_SUBPARTITION is not set
+-# CONFIG_SOLARIS_X86_PARTITION is not set
+-# CONFIG_UNIXWARE_DISKLABEL is not set
+-# CONFIG_LDM_PARTITION is not set
+-CONFIG_SGI_PARTITION=y
+-# CONFIG_ULTRIX_PARTITION is not set
+-# CONFIG_SUN_PARTITION is not set
+-# CONFIG_KARMA_PARTITION is not set
+-CONFIG_EFI_PARTITION=y
+-# CONFIG_SYSV68_PARTITION is not set
+-CONFIG_NLS=y
+-CONFIG_NLS_DEFAULT="iso8859-1"
+-CONFIG_NLS_CODEPAGE_437=y
+-CONFIG_NLS_CODEPAGE_737=m
+-CONFIG_NLS_CODEPAGE_775=m
+-CONFIG_NLS_CODEPAGE_850=m
+-CONFIG_NLS_CODEPAGE_852=m
+-CONFIG_NLS_CODEPAGE_855=m
+-CONFIG_NLS_CODEPAGE_857=m
+-CONFIG_NLS_CODEPAGE_860=m
+-CONFIG_NLS_CODEPAGE_861=m
+-CONFIG_NLS_CODEPAGE_862=m
+-CONFIG_NLS_CODEPAGE_863=m
+-CONFIG_NLS_CODEPAGE_864=m
+-CONFIG_NLS_CODEPAGE_865=m
+-CONFIG_NLS_CODEPAGE_866=m
+-CONFIG_NLS_CODEPAGE_869=m
+-CONFIG_NLS_CODEPAGE_936=m
+-CONFIG_NLS_CODEPAGE_950=m
+-CONFIG_NLS_CODEPAGE_932=m
+-CONFIG_NLS_CODEPAGE_949=m
+-CONFIG_NLS_CODEPAGE_874=m
+-CONFIG_NLS_ISO8859_8=m
+-CONFIG_NLS_CODEPAGE_1250=m
+-CONFIG_NLS_CODEPAGE_1251=m
+-# CONFIG_NLS_ASCII is not set
+-CONFIG_NLS_ISO8859_1=y
+-CONFIG_NLS_ISO8859_2=m
+-CONFIG_NLS_ISO8859_3=m
+-CONFIG_NLS_ISO8859_4=m
+-CONFIG_NLS_ISO8859_5=m
+-CONFIG_NLS_ISO8859_6=m
+-CONFIG_NLS_ISO8859_7=m
+-CONFIG_NLS_ISO8859_9=m
+-CONFIG_NLS_ISO8859_13=m
+-CONFIG_NLS_ISO8859_14=m
+-CONFIG_NLS_ISO8859_15=m
+-CONFIG_NLS_KOI8_R=m
+-CONFIG_NLS_KOI8_U=m
+-CONFIG_NLS_UTF8=m
+-# CONFIG_DLM is not set
+-
+-#
+-# Kernel hacking
+-#
+-# CONFIG_PRINTK_TIME is not set
+-CONFIG_ENABLE_WARN_DEPRECATED=y
+-CONFIG_ENABLE_MUST_CHECK=y
+-CONFIG_FRAME_WARN=2048
+-CONFIG_MAGIC_SYSRQ=y
+-# CONFIG_UNUSED_SYMBOLS is not set
+-# CONFIG_DEBUG_FS is not set
+-# CONFIG_HEADERS_CHECK is not set
+-CONFIG_DEBUG_KERNEL=y
+-# CONFIG_DEBUG_SHIRQ is not set
+-CONFIG_DETECT_SOFTLOCKUP=y
+-# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+-CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
+-CONFIG_SCHED_DEBUG=y
+-# CONFIG_SCHEDSTATS is not set
+-# CONFIG_TIMER_STATS is not set
+-# CONFIG_DEBUG_OBJECTS is not set
+-# CONFIG_SLUB_DEBUG_ON is not set
+-# CONFIG_SLUB_STATS is not set
+-# CONFIG_DEBUG_RT_MUTEXES is not set
+-# CONFIG_RT_MUTEX_TESTER is not set
+-# CONFIG_DEBUG_SPINLOCK is not set
+-CONFIG_DEBUG_MUTEXES=y
+-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+-# CONFIG_DEBUG_KOBJECT is not set
+-# CONFIG_DEBUG_INFO is not set
+-# CONFIG_DEBUG_VM is not set
+-# CONFIG_DEBUG_WRITECOUNT is not set
+-CONFIG_DEBUG_MEMORY_INIT=y
+-# CONFIG_DEBUG_LIST is not set
+-# CONFIG_DEBUG_SG is not set
+-# CONFIG_DEBUG_NOTIFIERS is not set
+-# CONFIG_BOOT_PRINTK_DELAY is not set
+-# CONFIG_RCU_TORTURE_TEST is not set
+-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+-# CONFIG_BACKTRACE_SELF_TEST is not set
+-# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+-# CONFIG_FAULT_INJECTION is not set
+-# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+-
+-#
+-# Tracers
+-#
+-# CONFIG_SCHED_TRACER is not set
+-# CONFIG_CONTEXT_SWITCH_TRACER is not set
+-# CONFIG_BOOT_TRACER is not set
+-# CONFIG_TRACE_BRANCH_PROFILING is not set
+-# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
+-# CONFIG_SAMPLES is not set
+-CONFIG_IA64_GRANULE_16MB=y
+-# CONFIG_IA64_GRANULE_64MB is not set
+-# CONFIG_IA64_PRINT_HAZARDS is not set
+-# CONFIG_DISABLE_VHPT is not set
+-# CONFIG_IA64_DEBUG_CMPXCHG is not set
+-# CONFIG_IA64_DEBUG_IRQ is not set
+-
+-#
+-# Security options
+-#
+-# CONFIG_KEYS is not set
+-# CONFIG_SECURITY is not set
+-# CONFIG_SECURITYFS is not set
+-# CONFIG_SECURITY_FILE_CAPABILITIES is not set
+-CONFIG_CRYPTO=y
+-
+-#
+-# Crypto core or helper
+-#
+-# CONFIG_CRYPTO_FIPS is not set
+-CONFIG_CRYPTO_ALGAPI=y
+-CONFIG_CRYPTO_ALGAPI2=y
+-CONFIG_CRYPTO_AEAD2=y
+-CONFIG_CRYPTO_BLKCIPHER=m
+-CONFIG_CRYPTO_BLKCIPHER2=y
+-CONFIG_CRYPTO_HASH=y
+-CONFIG_CRYPTO_HASH2=y
+-CONFIG_CRYPTO_RNG2=y
+-CONFIG_CRYPTO_MANAGER=m
+-CONFIG_CRYPTO_MANAGER2=y
+-# CONFIG_CRYPTO_GF128MUL is not set
+-# CONFIG_CRYPTO_NULL is not set
+-# CONFIG_CRYPTO_CRYPTD is not set
+-# CONFIG_CRYPTO_AUTHENC is not set
+-# CONFIG_CRYPTO_TEST is not set
+-
+-#
+-# Authenticated Encryption with Associated Data
+-#
+-# CONFIG_CRYPTO_CCM is not set
+-# CONFIG_CRYPTO_GCM is not set
+-# CONFIG_CRYPTO_SEQIV is not set
+-
+-#
+-# Block modes
+-#
+-CONFIG_CRYPTO_CBC=m
+-# CONFIG_CRYPTO_CTR is not set
+-# CONFIG_CRYPTO_CTS is not set
+-CONFIG_CRYPTO_ECB=m
+-# CONFIG_CRYPTO_LRW is not set
+-CONFIG_CRYPTO_PCBC=m
+-# CONFIG_CRYPTO_XTS is not set
+-
+-#
+-# Hash modes
+-#
+-# CONFIG_CRYPTO_HMAC is not set
+-# CONFIG_CRYPTO_XCBC is not set
+-
+-#
+-# Digest
+-#
+-# CONFIG_CRYPTO_CRC32C is not set
+-# CONFIG_CRYPTO_MD4 is not set
+-CONFIG_CRYPTO_MD5=y
+-# CONFIG_CRYPTO_MICHAEL_MIC is not set
+-# CONFIG_CRYPTO_RMD128 is not set
+-# CONFIG_CRYPTO_RMD160 is not set
+-# CONFIG_CRYPTO_RMD256 is not set
+-# CONFIG_CRYPTO_RMD320 is not set
+-# CONFIG_CRYPTO_SHA1 is not set
+-# CONFIG_CRYPTO_SHA256 is not set
+-# CONFIG_CRYPTO_SHA512 is not set
+-# CONFIG_CRYPTO_TGR192 is not set
+-# CONFIG_CRYPTO_WP512 is not set
+-
+-#
+-# Ciphers
+-#
+-# CONFIG_CRYPTO_AES is not set
+-# CONFIG_CRYPTO_ANUBIS is not set
+-# CONFIG_CRYPTO_ARC4 is not set
+-# CONFIG_CRYPTO_BLOWFISH is not set
+-# CONFIG_CRYPTO_CAMELLIA is not set
+-# CONFIG_CRYPTO_CAST5 is not set
+-# CONFIG_CRYPTO_CAST6 is not set
+-CONFIG_CRYPTO_DES=m
+-# CONFIG_CRYPTO_FCRYPT is not set
+-# CONFIG_CRYPTO_KHAZAD is not set
+-# CONFIG_CRYPTO_SALSA20 is not set
+-# CONFIG_CRYPTO_SEED is not set
+-# CONFIG_CRYPTO_SERPENT is not set
+-# CONFIG_CRYPTO_TEA is not set
+-# CONFIG_CRYPTO_TWOFISH is not set
+-
+-#
+-# Compression
+-#
+-# CONFIG_CRYPTO_DEFLATE is not set
+-# CONFIG_CRYPTO_LZO is not set
+-
+-#
+-# Random Number Generation
+-#
+-# CONFIG_CRYPTO_ANSI_CPRNG is not set
+-CONFIG_CRYPTO_HW=y
+-# CONFIG_CRYPTO_DEV_HIFN_795X is not set
+-CONFIG_HAVE_KVM=y
+-CONFIG_VIRTUALIZATION=y
+-# CONFIG_KVM is not set
+-# CONFIG_VIRTIO_PCI is not set
+-# CONFIG_VIRTIO_BALLOON is not set
+-
+-#
+-# Library routines
+-#
+-CONFIG_BITREVERSE=y
+-CONFIG_GENERIC_FIND_LAST_BIT=y
+-# CONFIG_CRC_CCITT is not set
+-# CONFIG_CRC16 is not set
+-# CONFIG_CRC_T10DIF is not set
+-CONFIG_CRC_ITU_T=m
+-CONFIG_CRC32=y
+-# CONFIG_CRC7 is not set
+-# CONFIG_LIBCRC32C is not set
+-CONFIG_PLIST=y
+-CONFIG_HAS_IOMEM=y
+-CONFIG_HAS_IOPORT=y
+-CONFIG_HAS_DMA=y
+-CONFIG_GENERIC_HARDIRQS=y
+-CONFIG_GENERIC_IRQ_PROBE=y
+-CONFIG_GENERIC_PENDING_IRQ=y
+-CONFIG_IRQ_PER_CPU=y
+-# CONFIG_IOMMU_API is not set
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/ia64/hp/common/sba_iommu.c linux-2.6.29-rc3.owrt/arch/ia64/hp/common/sba_iommu.c
+--- linux-2.6.29.owrt/arch/ia64/hp/common/sba_iommu.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/ia64/hp/common/sba_iommu.c 2009-05-10 23:48:28.000000000 +0200
+@@ -906,7 +906,7 @@
+ * @dir: R/W or both.
+ * @attrs: optional dma attributes
+ *
+- * See Documentation/PCI/PCI-DMA-mapping.txt
++ * See Documentation/DMA-mapping.txt
+ */
+ dma_addr_t
+ sba_map_single_attrs(struct device *dev, void *addr, size_t size, int dir,
+@@ -1024,7 +1024,7 @@
+ * @dir: R/W or both.
+ * @attrs: optional dma attributes
+ *
+- * See Documentation/PCI/PCI-DMA-mapping.txt
++ * See Documentation/DMA-mapping.txt
+ */
+ void sba_unmap_single_attrs(struct device *dev, dma_addr_t iova, size_t size,
+ int dir, struct dma_attrs *attrs)
+@@ -1102,7 +1102,7 @@
+ * @size: number of bytes mapped in driver buffer.
+ * @dma_handle: IOVA of new buffer.
+ *
+- * See Documentation/PCI/PCI-DMA-mapping.txt
++ * See Documentation/DMA-mapping.txt
+ */
+ void *
+ sba_alloc_coherent (struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flags)
+@@ -1165,7 +1165,7 @@
+ * @vaddr: virtual address IOVA of "consistent" buffer.
+ * @dma_handler: IO virtual address of "consistent" buffer.
+ *
+- * See Documentation/PCI/PCI-DMA-mapping.txt
++ * See Documentation/DMA-mapping.txt
+ */
+ void sba_free_coherent (struct device *dev, size_t size, void *vaddr, dma_addr_t dma_handle)
+ {
+@@ -1420,7 +1420,7 @@
+ * @dir: R/W or both.
+ * @attrs: optional dma attributes
+ *
+- * See Documentation/PCI/PCI-DMA-mapping.txt
++ * See Documentation/DMA-mapping.txt
+ */
+ int sba_map_sg_attrs(struct device *dev, struct scatterlist *sglist, int nents,
+ int dir, struct dma_attrs *attrs)
+@@ -1512,7 +1512,7 @@
+ * @dir: R/W or both.
+ * @attrs: optional dma attributes
+ *
+- * See Documentation/PCI/PCI-DMA-mapping.txt
++ * See Documentation/DMA-mapping.txt
+ */
+ void sba_unmap_sg_attrs(struct device *dev, struct scatterlist *sglist,
+ int nents, int dir, struct dma_attrs *attrs)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/ia64/include/asm/kvm.h linux-2.6.29-rc3.owrt/arch/ia64/include/asm/kvm.h
+--- linux-2.6.29.owrt/arch/ia64/include/asm/kvm.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/ia64/include/asm/kvm.h 2009-05-10 23:48:28.000000000 +0200
+@@ -25,10 +25,6 @@
+
+ #include <linux/ioctl.h>
+
+-/* Select x86 specific features in <linux/kvm.h> */
+-#define __KVM_HAVE_IOAPIC
+-#define __KVM_HAVE_DEVICE_ASSIGNMENT
+-
+ /* Architectural interrupt line count. */
+ #define KVM_NR_INTERRUPTS 256
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/ia64/include/asm/mmzone.h linux-2.6.29-rc3.owrt/arch/ia64/include/asm/mmzone.h
+--- linux-2.6.29.owrt/arch/ia64/include/asm/mmzone.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/ia64/include/asm/mmzone.h 2009-05-10 23:48:28.000000000 +0200
+@@ -31,6 +31,10 @@
+ #endif
+ }
+
++#ifdef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID
++extern int early_pfn_to_nid(unsigned long pfn);
++#endif
++
+ #ifdef CONFIG_IA64_DIG /* DIG systems are small */
+ # define MAX_PHYSNODE_ID 8
+ # define NR_NODE_MEMBLKS (MAX_NUMNODES * 8)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/ia64/include/asm/sn/bte.h linux-2.6.29-rc3.owrt/arch/ia64/include/asm/sn/bte.h
+--- linux-2.6.29.owrt/arch/ia64/include/asm/sn/bte.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/ia64/include/asm/sn/bte.h 2009-05-10 23:48:28.000000000 +0200
+@@ -39,7 +39,7 @@
+ /* BTE status register only supports 16 bits for length field */
+ #define BTE_LEN_BITS (16)
+ #define BTE_LEN_MASK ((1 << BTE_LEN_BITS) - 1)
+-#define BTE_MAX_XFER (BTE_LEN_MASK << L1_CACHE_SHIFT)
++#define BTE_MAX_XFER ((1 << BTE_LEN_BITS) * L1_CACHE_BYTES)
+
+
+ /* Define hardware */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/ia64/Kconfig linux-2.6.29-rc3.owrt/arch/ia64/Kconfig
+--- linux-2.6.29.owrt/arch/ia64/Kconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/ia64/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -221,11 +221,7 @@
+
+ config IA64_XEN_GUEST
+ bool "Xen guest"
+- select SWIOTLB
+ depends on XEN
+- help
+- Build a kernel that runs on Xen guest domain. At this moment only
+- 16KB page size in supported.
+
+ endchoice
+
+@@ -483,7 +479,8 @@
+ default y if VIRTUAL_MEM_MAP
+
+ config HAVE_ARCH_EARLY_PFN_TO_NID
+- def_bool NUMA && SPARSEMEM
++ def_bool y
++ depends on NEED_MULTIPLE_NODES
+
+ config HAVE_ARCH_NODEDATA_EXTENSION
+ def_bool y
+@@ -638,17 +635,6 @@
+ and include PCI device scope covered by these DMA
+ remapping devices.
+
+-config DMAR_DEFAULT_ON
+- def_bool y
+- prompt "Enable DMA Remapping Devices by default"
+- depends on DMAR
+- help
+- Selecting this option will enable a DMAR device at boot time if
+- one is found. If this option is not selected, DMAR support can
+- be enabled by passing intel_iommu=on to the kernel. It is
+- recommended you say N here while the DMAR code remains
+- experimental.
+-
+ endmenu
+
+ endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/ia64/kernel/iosapic.c linux-2.6.29-rc3.owrt/arch/ia64/kernel/iosapic.c
+--- linux-2.6.29.owrt/arch/ia64/kernel/iosapic.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/ia64/kernel/iosapic.c 2009-05-10 23:48:28.000000000 +0200
+@@ -507,7 +507,7 @@
+ if (trigger == IOSAPIC_EDGE)
+ return -EINVAL;
+
+- for (i = 0; i < NR_IRQS; i++) {
++ for (i = 0; i <= NR_IRQS; i++) {
+ info = &iosapic_intr_info[i];
+ if (info->trigger == trigger && info->polarity == pol &&
+ (info->dmode == IOSAPIC_FIXED ||
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/ia64/kernel/smpboot.c linux-2.6.29-rc3.owrt/arch/ia64/kernel/smpboot.c
+--- linux-2.6.29.owrt/arch/ia64/kernel/smpboot.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/ia64/kernel/smpboot.c 2009-05-10 23:48:28.000000000 +0200
+@@ -736,15 +736,14 @@
+ return -EBUSY;
+ }
+
+- cpu_clear(cpu, cpu_online_map);
+-
+ if (migrate_platform_irqs(cpu)) {
+ cpu_set(cpu, cpu_online_map);
+- return -EBUSY;
++ return (-EBUSY);
+ }
+
+ remove_siblinginfo(cpu);
+ fixup_irqs();
++ cpu_clear(cpu, cpu_online_map);
+ local_flush_tlb_all();
+ cpu_clear(cpu, cpu_callin_map);
+ return 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/ia64/kernel/unwind.c linux-2.6.29-rc3.owrt/arch/ia64/kernel/unwind.c
+--- linux-2.6.29.owrt/arch/ia64/kernel/unwind.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/ia64/kernel/unwind.c 2009-05-10 23:48:28.000000000 +0200
+@@ -2149,7 +2149,7 @@
+
+ /* next, remove hash table entries for this table */
+
+- for (index = 0; index < UNW_HASH_SIZE; ++index) {
++ for (index = 0; index <= UNW_HASH_SIZE; ++index) {
+ tmp = unw.cache + unw.hash[index];
+ if (unw.hash[index] >= UNW_CACHE_SIZE
+ || tmp->ip < table->start || tmp->ip >= table->end)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/ia64/kvm/kvm-ia64.c linux-2.6.29-rc3.owrt/arch/ia64/kvm/kvm-ia64.c
+--- linux-2.6.29.owrt/arch/ia64/kvm/kvm-ia64.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/ia64/kvm/kvm-ia64.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1337,10 +1337,6 @@
+ }
+ }
+
+-void kvm_arch_sync_events(struct kvm *kvm)
+-{
+-}
+-
+ void kvm_arch_destroy_vm(struct kvm *kvm)
+ {
+ kvm_iommu_unmap_guest(kvm);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/ia64/kvm/process.c linux-2.6.29-rc3.owrt/arch/ia64/kvm/process.c
+--- linux-2.6.29.owrt/arch/ia64/kvm/process.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/ia64/kvm/process.c 2009-05-10 23:48:28.000000000 +0200
+@@ -455,18 +455,13 @@
+ if (!vmm_fpswa_interface)
+ return (fpswa_ret_t) {-1, 0, 0, 0};
+
+- memset(&fp_state, 0, sizeof(fp_state_t));
+-
+ /*
+- * compute fp_state. only FP registers f6 - f11 are used by the
+- * vmm, so set those bits in the mask and set the low volatile
+- * pointer to point to these registers.
++ * Just let fpswa driver to use hardware fp registers.
++ * No fp register is valid in memory.
+ */
+- fp_state.bitmask_low64 = 0xfc0; /* bit6..bit11 */
+-
+- fp_state.fp_state_low_volatile = (fp_state_low_volatile_t *) &regs->f6;
++ memset(&fp_state, 0, sizeof(fp_state_t));
+
+- /*
++ /*
+ * unsigned long (*EFI_FPSWA) (
+ * unsigned long trap_type,
+ * void *Bundle,
+@@ -550,6 +545,10 @@
+ status = vmm_handle_fpu_swa(0, regs, isr);
+ if (!status)
+ return ;
++ else if (-EAGAIN == status) {
++ vcpu_decrement_iip(vcpu);
++ return ;
++ }
+ break;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/ia64/mm/numa.c linux-2.6.29-rc3.owrt/arch/ia64/mm/numa.c
+--- linux-2.6.29.owrt/arch/ia64/mm/numa.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/ia64/mm/numa.c 2009-05-10 23:48:28.000000000 +0200
+@@ -58,7 +58,7 @@
+ * SPARSEMEM to allocate the SPARSEMEM sectionmap on the NUMA node where
+ * the section resides.
+ */
+-int __meminit __early_pfn_to_nid(unsigned long pfn)
++int early_pfn_to_nid(unsigned long pfn)
+ {
+ int i, section = pfn >> PFN_SECTION_SHIFT, ssec, esec;
+
+@@ -70,7 +70,7 @@
+ return node_memblk[i].nid;
+ }
+
+- return -1;
++ return 0;
+ }
+
+ #ifdef CONFIG_MEMORY_HOTPLUG
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/ia64/sn/kernel/bte.c linux-2.6.29-rc3.owrt/arch/ia64/sn/kernel/bte.c
+--- linux-2.6.29.owrt/arch/ia64/sn/kernel/bte.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/ia64/sn/kernel/bte.c 2009-05-10 23:48:28.000000000 +0200
+@@ -97,10 +97,9 @@
+ return BTE_SUCCESS;
+ }
+
+- BUG_ON(len & L1_CACHE_MASK);
+- BUG_ON(src & L1_CACHE_MASK);
+- BUG_ON(dest & L1_CACHE_MASK);
+- BUG_ON(len > BTE_MAX_XFER);
++ BUG_ON((len & L1_CACHE_MASK) ||
++ (src & L1_CACHE_MASK) || (dest & L1_CACHE_MASK));
++ BUG_ON(!(len < ((BTE_LEN_MASK + 1) << L1_CACHE_SHIFT)));
+
+ /*
+ * Start with interface corresponding to cpu number
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/ia64/sn/kernel/io_acpi_init.c linux-2.6.29-rc3.owrt/arch/ia64/sn/kernel/io_acpi_init.c
+--- linux-2.6.29.owrt/arch/ia64/sn/kernel/io_acpi_init.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/ia64/sn/kernel/io_acpi_init.c 2009-05-10 23:48:28.000000000 +0200
+@@ -443,7 +443,7 @@
+ size = pci_resource_len(dev, PCI_ROM_RESOURCE);
+ addr = ioremap(pcidev_info->pdi_pio_mapped_addr[PCI_ROM_RESOURCE],
+ size);
+- image_size = pci_get_rom_size(dev, addr, size);
++ image_size = pci_get_rom_size(addr, size);
+ dev->resource[PCI_ROM_RESOURCE].start = (unsigned long) addr;
+ dev->resource[PCI_ROM_RESOURCE].end =
+ (unsigned long) addr + image_size - 1;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/ia64/sn/kernel/io_init.c linux-2.6.29-rc3.owrt/arch/ia64/sn/kernel/io_init.c
+--- linux-2.6.29.owrt/arch/ia64/sn/kernel/io_init.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/ia64/sn/kernel/io_init.c 2009-05-10 23:48:28.000000000 +0200
+@@ -269,7 +269,7 @@
+
+ rom = ioremap(pci_resource_start(dev, PCI_ROM_RESOURCE),
+ size + 1);
+- image_size = pci_get_rom_size(dev, rom, size + 1);
++ image_size = pci_get_rom_size(rom, size + 1);
+ dev->resource[PCI_ROM_RESOURCE].end =
+ dev->resource[PCI_ROM_RESOURCE].start +
+ image_size - 1;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/ia64/sn/pci/pcibr/pcibr_dma.c linux-2.6.29-rc3.owrt/arch/ia64/sn/pci/pcibr/pcibr_dma.c
+--- linux-2.6.29.owrt/arch/ia64/sn/pci/pcibr/pcibr_dma.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/ia64/sn/pci/pcibr/pcibr_dma.c 2009-05-10 23:48:28.000000000 +0200
+@@ -135,10 +135,11 @@
+ if (SN_DMA_ADDRTYPE(dma_flags) == SN_DMA_ADDR_PHYS)
+ pci_addr = IS_PIC_SOFT(pcibus_info) ?
+ PHYS_TO_DMA(paddr) :
+- PHYS_TO_TIODMA(paddr);
++ PHYS_TO_TIODMA(paddr) | dma_attributes;
+ else
+- pci_addr = paddr;
+- pci_addr |= dma_attributes;
++ pci_addr = IS_PIC_SOFT(pcibus_info) ?
++ paddr :
++ paddr | dma_attributes;
+
+ /* Handle Bus mode */
+ if (IS_PCIX(pcibus_info))
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/ia64/xen/Kconfig linux-2.6.29-rc3.owrt/arch/ia64/xen/Kconfig
+--- linux-2.6.29.owrt/arch/ia64/xen/Kconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/ia64/xen/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -8,7 +8,8 @@
+ depends on PARAVIRT && MCKINLEY && IA64_PAGE_SIZE_16KB && EXPERIMENTAL
+ select XEN_XENCOMM
+ select NO_IDLE_HZ
+- # followings are required to save/restore.
++
++ # those are required to save/restore.
+ select ARCH_SUSPEND_POSSIBLE
+ select SUSPEND
+ select PM_SLEEP
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/ia64/xen/xen_pv_ops.c linux-2.6.29-rc3.owrt/arch/ia64/xen/xen_pv_ops.c
+--- linux-2.6.29.owrt/arch/ia64/xen/xen_pv_ops.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/ia64/xen/xen_pv_ops.c 2009-05-10 23:48:28.000000000 +0200
+@@ -153,7 +153,7 @@
+ xen_setup_vcpu_info_placement();
+ }
+
+-static const struct pv_init_ops xen_init_ops __initconst = {
++static const struct pv_init_ops xen_init_ops __initdata = {
+ .banner = xen_banner,
+
+ .reserve_memory = xen_reserve_memory,
+@@ -337,7 +337,7 @@
+ HYPERVISOR_physdev_op(PHYSDEVOP_apic_write, &apic_op);
+ }
+
+-static const struct pv_iosapic_ops xen_iosapic_ops __initconst = {
++static const struct pv_iosapic_ops xen_iosapic_ops __initdata = {
+ .pcat_compat_init = xen_pcat_compat_init,
+ .__get_irq_chip = xen_iosapic_get_irq_chip,
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/atari/ataints.c linux-2.6.29-rc3.owrt/arch/m68k/atari/ataints.c
+--- linux-2.6.29.owrt/arch/m68k/atari/ataints.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/m68k/atari/ataints.c 2009-05-10 23:48:28.000000000 +0200
+@@ -187,8 +187,8 @@
+ " jbra ret_from_interrupt\n" \
+ : : "i" (&kstat_cpu(0).irqs[n+8]), "i" (&irq_handler[n+8]), \
+ "n" (PT_OFF_SR), "n" (n), \
+- "i" (n & 8 ? (n & 16 ? &tt_mfp.int_mk_a : &st_mfp.int_mk_a) \
+- : (n & 16 ? &tt_mfp.int_mk_b : &st_mfp.int_mk_b)), \
++ "i" (n & 8 ? (n & 16 ? &tt_mfp.int_mk_a : &mfp.int_mk_a) \
++ : (n & 16 ? &tt_mfp.int_mk_b : &mfp.int_mk_b)), \
+ "m" (preempt_count()), "di" (HARDIRQ_OFFSET) \
+ ); \
+ for (;;); /* fake noreturn */ \
+@@ -366,14 +366,14 @@
+ /* Initialize the MFP(s) */
+
+ #ifdef ATARI_USE_SOFTWARE_EOI
+- st_mfp.vec_adr = 0x48; /* Software EOI-Mode */
++ mfp.vec_adr = 0x48; /* Software EOI-Mode */
+ #else
+- st_mfp.vec_adr = 0x40; /* Automatic EOI-Mode */
++ mfp.vec_adr = 0x40; /* Automatic EOI-Mode */
+ #endif
+- st_mfp.int_en_a = 0x00; /* turn off MFP-Ints */
+- st_mfp.int_en_b = 0x00;
+- st_mfp.int_mk_a = 0xff; /* no Masking */
+- st_mfp.int_mk_b = 0xff;
++ mfp.int_en_a = 0x00; /* turn off MFP-Ints */
++ mfp.int_en_b = 0x00;
++ mfp.int_mk_a = 0xff; /* no Masking */
++ mfp.int_mk_b = 0xff;
+
+ if (ATARIHW_PRESENT(TT_MFP)) {
+ #ifdef ATARI_USE_SOFTWARE_EOI
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/atari/atakeyb.c linux-2.6.29-rc3.owrt/arch/m68k/atari/atakeyb.c
+--- linux-2.6.29.owrt/arch/m68k/atari/atakeyb.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/m68k/atari/atakeyb.c 2009-05-10 23:48:28.000000000 +0200
+@@ -609,10 +609,10 @@
+ ACIA_RHTID : 0);
+
+ /* make sure the interrupt line is up */
+- } while ((st_mfp.par_dt_reg & 0x10) == 0);
++ } while ((mfp.par_dt_reg & 0x10) == 0);
+
+ /* enable ACIA Interrupts */
+- st_mfp.active_edge &= ~0x10;
++ mfp.active_edge &= ~0x10;
+ atari_turnon_irq(IRQ_MFP_ACIA);
+
+ ikbd_self_test = 1;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/atari/config.c linux-2.6.29-rc3.owrt/arch/m68k/atari/config.c
+--- linux-2.6.29.owrt/arch/m68k/atari/config.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/m68k/atari/config.c 2009-05-10 23:48:28.000000000 +0200
+@@ -258,7 +258,7 @@
+ printk("STND_SHIFTER ");
+ }
+ }
+- if (hwreg_present(&st_mfp.par_dt_reg)) {
++ if (hwreg_present(&mfp.par_dt_reg)) {
+ ATARIHW_SET(ST_MFP);
+ printk("ST_MFP ");
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/atari/debug.c linux-2.6.29-rc3.owrt/arch/m68k/atari/debug.c
+--- linux-2.6.29.owrt/arch/m68k/atari/debug.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/m68k/atari/debug.c 2009-05-10 23:48:28.000000000 +0200
+@@ -34,9 +34,9 @@
+
+ static inline void ata_mfp_out(char c)
+ {
+- while (!(st_mfp.trn_stat & 0x80)) /* wait for tx buf empty */
++ while (!(mfp.trn_stat & 0x80)) /* wait for tx buf empty */
+ barrier();
+- st_mfp.usart_dta = c;
++ mfp.usart_dta = c;
+ }
+
+ static void atari_mfp_console_write(struct console *co, const char *str,
+@@ -91,7 +91,7 @@
+ /* This a some-seconds timeout in case no printer is connected */
+ unsigned long i = loops_per_jiffy > 1 ? loops_per_jiffy : 10000000/HZ;
+
+- while ((st_mfp.par_dt_reg & 1) && --i) /* wait for BUSY == L */
++ while ((mfp.par_dt_reg & 1) && --i) /* wait for BUSY == L */
+ ;
+ if (!i)
+ return 0;
+@@ -131,9 +131,9 @@
+ #if 0
+ int atari_mfp_console_wait_key(struct console *co)
+ {
+- while (!(st_mfp.rcv_stat & 0x80)) /* wait for rx buf filled */
++ while (!(mfp.rcv_stat & 0x80)) /* wait for rx buf filled */
+ barrier();
+- return st_mfp.usart_dta;
++ return mfp.usart_dta;
+ }
+
+ int atari_scc_console_wait_key(struct console *co)
+@@ -175,12 +175,12 @@
+ baud = B9600; /* use default 9600bps for non-implemented rates */
+ baud -= B1200; /* baud_table[] starts at 1200bps */
+
+- st_mfp.trn_stat &= ~0x01; /* disable TX */
+- st_mfp.usart_ctr = parity | csize | 0x88; /* 1:16 clk mode, 1 stop bit */
+- st_mfp.tim_ct_cd &= 0x70; /* stop timer D */
+- st_mfp.tim_dt_d = baud_table[baud];
+- st_mfp.tim_ct_cd |= 0x01; /* start timer D, 1:4 */
+- st_mfp.trn_stat |= 0x01; /* enable TX */
++ mfp.trn_stat &= ~0x01; /* disable TX */
++ mfp.usart_ctr = parity | csize | 0x88; /* 1:16 clk mode, 1 stop bit */
++ mfp.tim_ct_cd &= 0x70; /* stop timer D */
++ mfp.tim_dt_d = baud_table[baud];
++ mfp.tim_ct_cd |= 0x01; /* start timer D, 1:4 */
++ mfp.trn_stat |= 0x01; /* enable TX */
+ }
+
+ #define SCC_WRITE(reg, val) \
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/atari/time.c linux-2.6.29-rc3.owrt/arch/m68k/atari/time.c
+--- linux-2.6.29.owrt/arch/m68k/atari/time.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/m68k/atari/time.c 2009-05-10 23:48:28.000000000 +0200
+@@ -27,9 +27,9 @@
+ atari_sched_init(irq_handler_t timer_routine)
+ {
+ /* set Timer C data Register */
+- st_mfp.tim_dt_c = INT_TICKS;
++ mfp.tim_dt_c = INT_TICKS;
+ /* start timer C, div = 1:100 */
+- st_mfp.tim_ct_cd = (st_mfp.tim_ct_cd & 15) | 0x60;
++ mfp.tim_ct_cd = (mfp.tim_ct_cd & 15) | 0x60;
+ /* install interrupt service routine for MFP Timer C */
+ if (request_irq(IRQ_MFP_TIMC, timer_routine, IRQ_TYPE_SLOW,
+ "timer", timer_routine))
+@@ -46,11 +46,11 @@
+ unsigned long ticks, offset = 0;
+
+ /* read MFP timer C current value */
+- ticks = st_mfp.tim_dt_c;
++ ticks = mfp.tim_dt_c;
+ /* The probability of underflow is less than 2% */
+ if (ticks > INT_TICKS - INT_TICKS / 50)
+ /* Check for pending timer interrupt */
+- if (st_mfp.int_pn_b & (1 << 5))
++ if (mfp.int_pn_b & (1 << 5))
+ offset = TICK_SIZE;
+
+ ticks = INT_TICKS - ticks;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/atarihw.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/atarihw.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/atarihw.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/atarihw.h 2009-05-10 23:48:28.000000000 +0200
+@@ -113,7 +113,7 @@
+ * of nops on various machines. Somebody claimed that the tstb takes 600 ns.
+ */
+ #define MFPDELAY() \
+- __asm__ __volatile__ ( "tstb %0" : : "m" (st_mfp.par_dt_reg) : "cc" );
++ __asm__ __volatile__ ( "tstb %0" : : "m" (mfp.par_dt_reg) : "cc" );
+
+ /* Do cache push/invalidate for DMA read/write. This function obeys the
+ * snooping on some machines (Medusa) and processors: The Medusa itself can
+@@ -565,7 +565,7 @@
+ u_char char_dummy23;
+ u_char usart_dta;
+ };
+-# define st_mfp ((*(volatile struct MFP*)MFP_BAS))
++# define mfp ((*(volatile struct MFP*)MFP_BAS))
+
+ /* TT's second MFP */
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/atariints.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/atariints.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/atariints.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/atariints.h 2009-05-10 23:48:28.000000000 +0200
+@@ -113,7 +113,7 @@
+ { unsigned char mask, *reg;
+
+ mask = 1 << (irq & 7);
+- reg = (unsigned char *)&st_mfp.int_en_a + type*4 +
++ reg = (unsigned char *)&mfp.int_en_a + type*4 +
+ ((irq & 8) >> 2) + (((irq-8) & 16) << 3);
+ return( *reg & mask );
+ }
+@@ -123,7 +123,7 @@
+ { unsigned char mask, *reg;
+
+ mask = 1 << (irq & 7);
+- reg = (unsigned char *)&st_mfp.int_en_a + type*4 +
++ reg = (unsigned char *)&mfp.int_en_a + type*4 +
+ ((irq & 8) >> 2) + (((irq-8) & 16) << 3);
+ __asm__ __volatile__ ( "orb %0,%1"
+ : : "di" (mask), "m" (*reg) : "memory" );
+@@ -134,7 +134,7 @@
+ { unsigned char mask, *reg;
+
+ mask = ~(1 << (irq & 7));
+- reg = (unsigned char *)&st_mfp.int_en_a + type*4 +
++ reg = (unsigned char *)&mfp.int_en_a + type*4 +
+ ((irq & 8) >> 2) + (((irq-8) & 16) << 3);
+ if (type == MFP_PENDING || type == MFP_SERVICE)
+ __asm__ __volatile__ ( "moveb %0,%1"
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/param.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/param.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/param.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/param.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,26 +1,5 @@
+-#ifndef _M68K_PARAM_H
+-#define _M68K_PARAM_H
+-
+-#ifdef __KERNEL__
+-# define HZ CONFIG_HZ /* Internal kernel timer frequency */
+-# define USER_HZ 100 /* .. some user interfaces are in "ticks" */
+-# define CLOCKS_PER_SEC (USER_HZ) /* like times() */
+-#endif
+-
+-#ifndef HZ
+-#define HZ 100
+-#endif
+-
+ #ifdef __uClinux__
+-#define EXEC_PAGESIZE 4096
++#include "param_no.h"
+ #else
+-#define EXEC_PAGESIZE 8192
+-#endif
+-
+-#ifndef NOGROUP
+-#define NOGROUP (-1)
++#include "param_mm.h"
+ #endif
+-
+-#define MAXHOSTNAMELEN 64 /* max length of hostname */
+-
+-#endif /* _M68K_PARAM_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/param_mm.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/param_mm.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/param_mm.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/param_mm.h 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,22 @@
++#ifndef _M68K_PARAM_H
++#define _M68K_PARAM_H
++
++#ifdef __KERNEL__
++# define HZ CONFIG_HZ /* Internal kernel timer frequency */
++# define USER_HZ 100 /* .. some user interfaces are in "ticks" */
++# define CLOCKS_PER_SEC (USER_HZ) /* like times() */
++#endif
++
++#ifndef HZ
++#define HZ 100
++#endif
++
++#define EXEC_PAGESIZE 8192
++
++#ifndef NOGROUP
++#define NOGROUP (-1)
++#endif
++
++#define MAXHOSTNAMELEN 64 /* max length of hostname */
++
++#endif /* _M68K_PARAM_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/param_no.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/param_no.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/param_no.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/param_no.h 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,22 @@
++#ifndef _M68KNOMMU_PARAM_H
++#define _M68KNOMMU_PARAM_H
++
++#ifdef __KERNEL__
++#define HZ CONFIG_HZ
++#define USER_HZ HZ
++#define CLOCKS_PER_SEC (USER_HZ)
++#endif
++
++#ifndef HZ
++#define HZ 100
++#endif
++
++#define EXEC_PAGESIZE 4096
++
++#ifndef NOGROUP
++#define NOGROUP (-1)
++#endif
++
++#define MAXHOSTNAMELEN 64 /* max length of hostname */
++
++#endif /* _M68KNOMMU_PARAM_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/ptrace.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/ptrace.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/ptrace.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/ptrace.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,87 +1,5 @@
+-#ifndef _M68K_PTRACE_H
+-#define _M68K_PTRACE_H
+-
+-#define PT_D1 0
+-#define PT_D2 1
+-#define PT_D3 2
+-#define PT_D4 3
+-#define PT_D5 4
+-#define PT_D6 5
+-#define PT_D7 6
+-#define PT_A0 7
+-#define PT_A1 8
+-#define PT_A2 9
+-#define PT_A3 10
+-#define PT_A4 11
+-#define PT_A5 12
+-#define PT_A6 13
+-#define PT_D0 14
+-#define PT_USP 15
+-#define PT_ORIG_D0 16
+-#define PT_SR 17
+-#define PT_PC 18
+-
+-#ifndef __ASSEMBLY__
+-
+-/* this struct defines the way the registers are stored on the
+- stack during a system call. */
+-
+-struct pt_regs {
+- long d1;
+- long d2;
+- long d3;
+- long d4;
+- long d5;
+- long a0;
+- long a1;
+- long a2;
+- long d0;
+- long orig_d0;
+- long stkadj;
+-#ifdef CONFIG_COLDFIRE
+- unsigned format : 4; /* frame format specifier */
+- unsigned vector : 12; /* vector offset */
+- unsigned short sr;
+- unsigned long pc;
++#ifdef __uClinux__
++#include "ptrace_no.h"
+ #else
+- unsigned short sr;
+- unsigned long pc;
+- unsigned format : 4; /* frame format specifier */
+- unsigned vector : 12; /* vector offset */
++#include "ptrace_mm.h"
+ #endif
+-};
+-
+-/*
+- * This is the extended stack used by signal handlers and the context
+- * switcher: it's pushed after the normal "struct pt_regs".
+- */
+-struct switch_stack {
+- unsigned long d6;
+- unsigned long d7;
+- unsigned long a3;
+- unsigned long a4;
+- unsigned long a5;
+- unsigned long a6;
+- unsigned long retpc;
+-};
+-
+-/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */
+-#define PTRACE_GETREGS 12
+-#define PTRACE_SETREGS 13
+-#define PTRACE_GETFPREGS 14
+-#define PTRACE_SETFPREGS 15
+-
+-#ifdef __KERNEL__
+-
+-#ifndef PS_S
+-#define PS_S (0x2000)
+-#define PS_M (0x1000)
+-#endif
+-
+-#define user_mode(regs) (!((regs)->sr & PS_S))
+-#define instruction_pointer(regs) ((regs)->pc)
+-#define profile_pc(regs) instruction_pointer(regs)
+-extern void show_regs(struct pt_regs *);
+-#endif /* __KERNEL__ */
+-#endif /* __ASSEMBLY__ */
+-#endif /* _M68K_PTRACE_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/ptrace_mm.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/ptrace_mm.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/ptrace_mm.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/ptrace_mm.h 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,80 @@
++#ifndef _M68K_PTRACE_H
++#define _M68K_PTRACE_H
++
++#define PT_D1 0
++#define PT_D2 1
++#define PT_D3 2
++#define PT_D4 3
++#define PT_D5 4
++#define PT_D6 5
++#define PT_D7 6
++#define PT_A0 7
++#define PT_A1 8
++#define PT_A2 9
++#define PT_A3 10
++#define PT_A4 11
++#define PT_A5 12
++#define PT_A6 13
++#define PT_D0 14
++#define PT_USP 15
++#define PT_ORIG_D0 16
++#define PT_SR 17
++#define PT_PC 18
++
++#ifndef __ASSEMBLY__
++
++/* this struct defines the way the registers are stored on the
++ stack during a system call. */
++
++struct pt_regs {
++ long d1;
++ long d2;
++ long d3;
++ long d4;
++ long d5;
++ long a0;
++ long a1;
++ long a2;
++ long d0;
++ long orig_d0;
++ long stkadj;
++ unsigned short sr;
++ unsigned long pc;
++ unsigned format : 4; /* frame format specifier */
++ unsigned vector : 12; /* vector offset */
++};
++
++/*
++ * This is the extended stack used by signal handlers and the context
++ * switcher: it's pushed after the normal "struct pt_regs".
++ */
++struct switch_stack {
++ unsigned long d6;
++ unsigned long d7;
++ unsigned long a3;
++ unsigned long a4;
++ unsigned long a5;
++ unsigned long a6;
++ unsigned long retpc;
++};
++
++/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */
++#define PTRACE_GETREGS 12
++#define PTRACE_SETREGS 13
++#define PTRACE_GETFPREGS 14
++#define PTRACE_SETFPREGS 15
++
++#ifdef __KERNEL__
++
++#ifndef PS_S
++#define PS_S (0x2000)
++#define PS_M (0x1000)
++#endif
++
++#define user_mode(regs) (!((regs)->sr & PS_S))
++#define instruction_pointer(regs) ((regs)->pc)
++#define profile_pc(regs) instruction_pointer(regs)
++extern void show_regs(struct pt_regs *);
++#endif /* __KERNEL__ */
++#endif /* __ASSEMBLY__ */
++#endif /* _M68K_PTRACE_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/ptrace_no.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/ptrace_no.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/ptrace_no.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/ptrace_no.h 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,87 @@
++#ifndef _M68K_PTRACE_H
++#define _M68K_PTRACE_H
++
++#define PT_D1 0
++#define PT_D2 1
++#define PT_D3 2
++#define PT_D4 3
++#define PT_D5 4
++#define PT_D6 5
++#define PT_D7 6
++#define PT_A0 7
++#define PT_A1 8
++#define PT_A2 9
++#define PT_A3 10
++#define PT_A4 11
++#define PT_A5 12
++#define PT_A6 13
++#define PT_D0 14
++#define PT_USP 15
++#define PT_ORIG_D0 16
++#define PT_SR 17
++#define PT_PC 18
++
++#ifndef __ASSEMBLY__
++
++/* this struct defines the way the registers are stored on the
++ stack during a system call. */
++
++struct pt_regs {
++ long d1;
++ long d2;
++ long d3;
++ long d4;
++ long d5;
++ long a0;
++ long a1;
++ long a2;
++ long d0;
++ long orig_d0;
++ long stkadj;
++#ifdef CONFIG_COLDFIRE
++ unsigned format : 4; /* frame format specifier */
++ unsigned vector : 12; /* vector offset */
++ unsigned short sr;
++ unsigned long pc;
++#else
++ unsigned short sr;
++ unsigned long pc;
++ unsigned format : 4; /* frame format specifier */
++ unsigned vector : 12; /* vector offset */
++#endif
++};
++
++/*
++ * This is the extended stack used by signal handlers and the context
++ * switcher: it's pushed after the normal "struct pt_regs".
++ */
++struct switch_stack {
++ unsigned long d6;
++ unsigned long d7;
++ unsigned long a3;
++ unsigned long a4;
++ unsigned long a5;
++ unsigned long a6;
++ unsigned long retpc;
++};
++
++/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */
++#define PTRACE_GETREGS 12
++#define PTRACE_SETREGS 13
++#define PTRACE_GETFPREGS 14
++#define PTRACE_SETFPREGS 15
++
++#ifdef __KERNEL__
++
++#ifndef PS_S
++#define PS_S (0x2000)
++#define PS_M (0x1000)
++#endif
++
++#define user_mode(regs) (!((regs)->sr & PS_S))
++#define instruction_pointer(regs) ((regs)->pc)
++#define profile_pc(regs) instruction_pointer(regs)
++extern void show_regs(struct pt_regs *);
++#endif /* __KERNEL__ */
++#endif /* __ASSEMBLY__ */
++#endif /* _M68K_PTRACE_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/setup.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/setup.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/setup.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/setup.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,376 +1,5 @@
+-/*
+-** asm/setup.h -- Definition of the Linux/m68k setup information
+-**
+-** Copyright 1992 by Greg Harp
+-**
+-** 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.
+-**
+-** Created 09/29/92 by Greg Harp
+-**
+-** 5/2/94 Roman Hodek:
+-** Added bi_atari part of the machine dependent union bi_un; for now it
+-** contains just a model field to distinguish between TT and Falcon.
+-** 26/7/96 Roman Zippel:
+-** Renamed to setup.h; added some useful macros to allow gcc some
+-** optimizations if possible.
+-** 5/10/96 Geert Uytterhoeven:
+-** Redesign of the boot information structure; moved boot information
+-** structure to bootinfo.h
+-*/
+-
+-#ifndef _M68K_SETUP_H
+-#define _M68K_SETUP_H
+-
+-
+-
+- /*
+- * Linux/m68k Architectures
+- */
+-
+-#define MACH_AMIGA 1
+-#define MACH_ATARI 2
+-#define MACH_MAC 3
+-#define MACH_APOLLO 4
+-#define MACH_SUN3 5
+-#define MACH_MVME147 6
+-#define MACH_MVME16x 7
+-#define MACH_BVME6000 8
+-#define MACH_HP300 9
+-#define MACH_Q40 10
+-#define MACH_SUN3X 11
+-
+-#define COMMAND_LINE_SIZE 256
+-
+-#ifdef __KERNEL__
+-
+-#define CL_SIZE COMMAND_LINE_SIZE
+-
+-#ifndef __ASSEMBLY__
+-extern unsigned long m68k_machtype;
+-#endif /* !__ASSEMBLY__ */
+-
+-#if !defined(CONFIG_AMIGA)
+-# define MACH_IS_AMIGA (0)
+-#elif defined(CONFIG_ATARI) || defined(CONFIG_MAC) || defined(CONFIG_APOLLO) \
+- || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \
+- || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
+- || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
+-# define MACH_IS_AMIGA (m68k_machtype == MACH_AMIGA)
++#ifdef __uClinux__
++#include "setup_no.h"
+ #else
+-# define MACH_AMIGA_ONLY
+-# define MACH_IS_AMIGA (1)
+-# define MACH_TYPE (MACH_AMIGA)
++#include "setup_mm.h"
+ #endif
+-
+-#if !defined(CONFIG_ATARI)
+-# define MACH_IS_ATARI (0)
+-#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_APOLLO) \
+- || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \
+- || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
+- || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
+-# define MACH_IS_ATARI (m68k_machtype == MACH_ATARI)
+-#else
+-# define MACH_ATARI_ONLY
+-# define MACH_IS_ATARI (1)
+-# define MACH_TYPE (MACH_ATARI)
+-#endif
+-
+-#if !defined(CONFIG_MAC)
+-# define MACH_IS_MAC (0)
+-#elif defined(CONFIG_AMIGA) || defined(CONFIG_ATARI) || defined(CONFIG_APOLLO) \
+- || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \
+- || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
+- || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
+-# define MACH_IS_MAC (m68k_machtype == MACH_MAC)
+-#else
+-# define MACH_MAC_ONLY
+-# define MACH_IS_MAC (1)
+-# define MACH_TYPE (MACH_MAC)
+-#endif
+-
+-#if defined(CONFIG_SUN3)
+-#define MACH_IS_SUN3 (1)
+-#define MACH_SUN3_ONLY (1)
+-#define MACH_TYPE (MACH_SUN3)
+-#else
+-#define MACH_IS_SUN3 (0)
+-#endif
+-
+-#if !defined (CONFIG_APOLLO)
+-# define MACH_IS_APOLLO (0)
+-#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
+- || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \
+- || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
+- || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
+-# define MACH_IS_APOLLO (m68k_machtype == MACH_APOLLO)
+-#else
+-# define MACH_APOLLO_ONLY
+-# define MACH_IS_APOLLO (1)
+-# define MACH_TYPE (MACH_APOLLO)
+-#endif
+-
+-#if !defined (CONFIG_MVME147)
+-# define MACH_IS_MVME147 (0)
+-#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
+- || defined(CONFIG_APOLLO) || defined(CONFIG_BVME6000) \
+- || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
+- || defined(CONFIG_SUN3X) || defined(CONFIG_MVME16x)
+-# define MACH_IS_MVME147 (m68k_machtype == MACH_MVME147)
+-#else
+-# define MACH_MVME147_ONLY
+-# define MACH_IS_MVME147 (1)
+-# define MACH_TYPE (MACH_MVME147)
+-#endif
+-
+-#if !defined (CONFIG_MVME16x)
+-# define MACH_IS_MVME16x (0)
+-#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
+- || defined(CONFIG_APOLLO) || defined(CONFIG_BVME6000) \
+- || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
+- || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
+-# define MACH_IS_MVME16x (m68k_machtype == MACH_MVME16x)
+-#else
+-# define MACH_MVME16x_ONLY
+-# define MACH_IS_MVME16x (1)
+-# define MACH_TYPE (MACH_MVME16x)
+-#endif
+-
+-#if !defined (CONFIG_BVME6000)
+-# define MACH_IS_BVME6000 (0)
+-#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
+- || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \
+- || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
+- || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
+-# define MACH_IS_BVME6000 (m68k_machtype == MACH_BVME6000)
+-#else
+-# define MACH_BVME6000_ONLY
+-# define MACH_IS_BVME6000 (1)
+-# define MACH_TYPE (MACH_BVME6000)
+-#endif
+-
+-#if !defined (CONFIG_HP300)
+-# define MACH_IS_HP300 (0)
+-#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
+- || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \
+- || defined(CONFIG_BVME6000) || defined(CONFIG_Q40) \
+- || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
+-# define MACH_IS_HP300 (m68k_machtype == MACH_HP300)
+-#else
+-# define MACH_HP300_ONLY
+-# define MACH_IS_HP300 (1)
+-# define MACH_TYPE (MACH_HP300)
+-#endif
+-
+-#if !defined (CONFIG_Q40)
+-# define MACH_IS_Q40 (0)
+-#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
+- || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \
+- || defined(CONFIG_BVME6000) || defined(CONFIG_HP300) \
+- || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
+-# define MACH_IS_Q40 (m68k_machtype == MACH_Q40)
+-#else
+-# define MACH_Q40_ONLY
+-# define MACH_IS_Q40 (1)
+-# define MACH_TYPE (MACH_Q40)
+-#endif
+-
+-#if !defined (CONFIG_SUN3X)
+-# define MACH_IS_SUN3X (0)
+-#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
+- || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \
+- || defined(CONFIG_BVME6000) || defined(CONFIG_HP300) \
+- || defined(CONFIG_Q40) || defined(CONFIG_MVME147)
+-# define MACH_IS_SUN3X (m68k_machtype == MACH_SUN3X)
+-#else
+-# define CONFIG_SUN3X_ONLY
+-# define MACH_IS_SUN3X (1)
+-# define MACH_TYPE (MACH_SUN3X)
+-#endif
+-
+-#ifndef MACH_TYPE
+-# define MACH_TYPE (m68k_machtype)
+-#endif
+-
+-#endif /* __KERNEL__ */
+-
+-
+- /*
+- * CPU, FPU and MMU types
+- *
+- * Note: we may rely on the following equalities:
+- *
+- * CPU_68020 == MMU_68851
+- * CPU_68030 == MMU_68030
+- * CPU_68040 == FPU_68040 == MMU_68040
+- * CPU_68060 == FPU_68060 == MMU_68060
+- */
+-
+-#define CPUB_68020 0
+-#define CPUB_68030 1
+-#define CPUB_68040 2
+-#define CPUB_68060 3
+-
+-#define CPU_68020 (1<<CPUB_68020)
+-#define CPU_68030 (1<<CPUB_68030)
+-#define CPU_68040 (1<<CPUB_68040)
+-#define CPU_68060 (1<<CPUB_68060)
+-
+-#define FPUB_68881 0
+-#define FPUB_68882 1
+-#define FPUB_68040 2 /* Internal FPU */
+-#define FPUB_68060 3 /* Internal FPU */
+-#define FPUB_SUNFPA 4 /* Sun-3 FPA */
+-
+-#define FPU_68881 (1<<FPUB_68881)
+-#define FPU_68882 (1<<FPUB_68882)
+-#define FPU_68040 (1<<FPUB_68040)
+-#define FPU_68060 (1<<FPUB_68060)
+-#define FPU_SUNFPA (1<<FPUB_SUNFPA)
+-
+-#define MMUB_68851 0
+-#define MMUB_68030 1 /* Internal MMU */
+-#define MMUB_68040 2 /* Internal MMU */
+-#define MMUB_68060 3 /* Internal MMU */
+-#define MMUB_APOLLO 4 /* Custom Apollo */
+-#define MMUB_SUN3 5 /* Custom Sun-3 */
+-
+-#define MMU_68851 (1<<MMUB_68851)
+-#define MMU_68030 (1<<MMUB_68030)
+-#define MMU_68040 (1<<MMUB_68040)
+-#define MMU_68060 (1<<MMUB_68060)
+-#define MMU_SUN3 (1<<MMUB_SUN3)
+-#define MMU_APOLLO (1<<MMUB_APOLLO)
+-
+-#ifdef __KERNEL__
+-
+-#ifndef __ASSEMBLY__
+-extern unsigned long m68k_cputype;
+-extern unsigned long m68k_fputype;
+-extern unsigned long m68k_mmutype;
+-#ifdef CONFIG_VME
+-extern unsigned long vme_brdtype;
+-#endif
+-
+- /*
+- * m68k_is040or060 is != 0 for a '040 or higher;
+- * used numbers are 4 for 68040 and 6 for 68060.
+- */
+-
+-extern int m68k_is040or060;
+-#endif /* !__ASSEMBLY__ */
+-
+-#if !defined(CONFIG_M68020)
+-# define CPU_IS_020 (0)
+-# define MMU_IS_851 (0)
+-# define MMU_IS_SUN3 (0)
+-#elif defined(CONFIG_M68030) || defined(CONFIG_M68040) || defined(CONFIG_M68060)
+-# define CPU_IS_020 (m68k_cputype & CPU_68020)
+-# define MMU_IS_851 (m68k_mmutype & MMU_68851)
+-# define MMU_IS_SUN3 (0) /* Sun3 not supported with other CPU enabled */
+-#else
+-# define CPU_M68020_ONLY
+-# define CPU_IS_020 (1)
+-#ifdef MACH_SUN3_ONLY
+-# define MMU_IS_SUN3 (1)
+-# define MMU_IS_851 (0)
+-#else
+-# define MMU_IS_SUN3 (0)
+-# define MMU_IS_851 (1)
+-#endif
+-#endif
+-
+-#if !defined(CONFIG_M68030)
+-# define CPU_IS_030 (0)
+-# define MMU_IS_030 (0)
+-#elif defined(CONFIG_M68020) || defined(CONFIG_M68040) || defined(CONFIG_M68060)
+-# define CPU_IS_030 (m68k_cputype & CPU_68030)
+-# define MMU_IS_030 (m68k_mmutype & MMU_68030)
+-#else
+-# define CPU_M68030_ONLY
+-# define CPU_IS_030 (1)
+-# define MMU_IS_030 (1)
+-#endif
+-
+-#if !defined(CONFIG_M68040)
+-# define CPU_IS_040 (0)
+-# define MMU_IS_040 (0)
+-#elif defined(CONFIG_M68020) || defined(CONFIG_M68030) || defined(CONFIG_M68060)
+-# define CPU_IS_040 (m68k_cputype & CPU_68040)
+-# define MMU_IS_040 (m68k_mmutype & MMU_68040)
+-#else
+-# define CPU_M68040_ONLY
+-# define CPU_IS_040 (1)
+-# define MMU_IS_040 (1)
+-#endif
+-
+-#if !defined(CONFIG_M68060)
+-# define CPU_IS_060 (0)
+-# define MMU_IS_060 (0)
+-#elif defined(CONFIG_M68020) || defined(CONFIG_M68030) || defined(CONFIG_M68040)
+-# define CPU_IS_060 (m68k_cputype & CPU_68060)
+-# define MMU_IS_060 (m68k_mmutype & MMU_68060)
+-#else
+-# define CPU_M68060_ONLY
+-# define CPU_IS_060 (1)
+-# define MMU_IS_060 (1)
+-#endif
+-
+-#if !defined(CONFIG_M68020) && !defined(CONFIG_M68030)
+-# define CPU_IS_020_OR_030 (0)
+-#else
+-# define CPU_M68020_OR_M68030
+-# if defined(CONFIG_M68040) || defined(CONFIG_M68060)
+-# define CPU_IS_020_OR_030 (!m68k_is040or060)
+-# else
+-# define CPU_M68020_OR_M68030_ONLY
+-# define CPU_IS_020_OR_030 (1)
+-# endif
+-#endif
+-
+-#if !defined(CONFIG_M68040) && !defined(CONFIG_M68060)
+-# define CPU_IS_040_OR_060 (0)
+-#else
+-# define CPU_M68040_OR_M68060
+-# if defined(CONFIG_M68020) || defined(CONFIG_M68030)
+-# define CPU_IS_040_OR_060 (m68k_is040or060)
+-# else
+-# define CPU_M68040_OR_M68060_ONLY
+-# define CPU_IS_040_OR_060 (1)
+-# endif
+-#endif
+-
+-#define CPU_TYPE (m68k_cputype)
+-
+-#ifdef CONFIG_M68KFPU_EMU
+-# ifdef CONFIG_M68KFPU_EMU_ONLY
+-# define FPU_IS_EMU (1)
+-# else
+-# define FPU_IS_EMU (!m68k_fputype)
+-# endif
+-#else
+-# define FPU_IS_EMU (0)
+-#endif
+-
+-
+- /*
+- * Miscellaneous
+- */
+-
+-#define NUM_MEMINFO 4
+-
+-#ifndef __ASSEMBLY__
+-struct mem_info {
+- unsigned long addr; /* physical address of memory chunk */
+- unsigned long size; /* length of memory chunk (in bytes) */
+-};
+-
+-extern int m68k_num_memory; /* # of memory blocks found (and used) */
+-extern int m68k_realnum_memory; /* real # of memory blocks found */
+-extern struct mem_info m68k_memory[NUM_MEMINFO];/* memory description */
+-#endif
+-
+-#endif /* __KERNEL__ */
+-
+-#endif /* _M68K_SETUP_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/setup_mm.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/setup_mm.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/setup_mm.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/setup_mm.h 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,376 @@
++/*
++** asm/setup.h -- Definition of the Linux/m68k setup information
++**
++** Copyright 1992 by Greg Harp
++**
++** 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.
++**
++** Created 09/29/92 by Greg Harp
++**
++** 5/2/94 Roman Hodek:
++** Added bi_atari part of the machine dependent union bi_un; for now it
++** contains just a model field to distinguish between TT and Falcon.
++** 26/7/96 Roman Zippel:
++** Renamed to setup.h; added some useful macros to allow gcc some
++** optimizations if possible.
++** 5/10/96 Geert Uytterhoeven:
++** Redesign of the boot information structure; moved boot information
++** structure to bootinfo.h
++*/
++
++#ifndef _M68K_SETUP_H
++#define _M68K_SETUP_H
++
++
++
++ /*
++ * Linux/m68k Architectures
++ */
++
++#define MACH_AMIGA 1
++#define MACH_ATARI 2
++#define MACH_MAC 3
++#define MACH_APOLLO 4
++#define MACH_SUN3 5
++#define MACH_MVME147 6
++#define MACH_MVME16x 7
++#define MACH_BVME6000 8
++#define MACH_HP300 9
++#define MACH_Q40 10
++#define MACH_SUN3X 11
++
++#define COMMAND_LINE_SIZE 256
++
++#ifdef __KERNEL__
++
++#define CL_SIZE COMMAND_LINE_SIZE
++
++#ifndef __ASSEMBLY__
++extern unsigned long m68k_machtype;
++#endif /* !__ASSEMBLY__ */
++
++#if !defined(CONFIG_AMIGA)
++# define MACH_IS_AMIGA (0)
++#elif defined(CONFIG_ATARI) || defined(CONFIG_MAC) || defined(CONFIG_APOLLO) \
++ || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \
++ || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
++ || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
++# define MACH_IS_AMIGA (m68k_machtype == MACH_AMIGA)
++#else
++# define MACH_AMIGA_ONLY
++# define MACH_IS_AMIGA (1)
++# define MACH_TYPE (MACH_AMIGA)
++#endif
++
++#if !defined(CONFIG_ATARI)
++# define MACH_IS_ATARI (0)
++#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_APOLLO) \
++ || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \
++ || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
++ || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
++# define MACH_IS_ATARI (m68k_machtype == MACH_ATARI)
++#else
++# define MACH_ATARI_ONLY
++# define MACH_IS_ATARI (1)
++# define MACH_TYPE (MACH_ATARI)
++#endif
++
++#if !defined(CONFIG_MAC)
++# define MACH_IS_MAC (0)
++#elif defined(CONFIG_AMIGA) || defined(CONFIG_ATARI) || defined(CONFIG_APOLLO) \
++ || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \
++ || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
++ || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
++# define MACH_IS_MAC (m68k_machtype == MACH_MAC)
++#else
++# define MACH_MAC_ONLY
++# define MACH_IS_MAC (1)
++# define MACH_TYPE (MACH_MAC)
++#endif
++
++#if defined(CONFIG_SUN3)
++#define MACH_IS_SUN3 (1)
++#define MACH_SUN3_ONLY (1)
++#define MACH_TYPE (MACH_SUN3)
++#else
++#define MACH_IS_SUN3 (0)
++#endif
++
++#if !defined (CONFIG_APOLLO)
++# define MACH_IS_APOLLO (0)
++#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
++ || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) \
++ || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
++ || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
++# define MACH_IS_APOLLO (m68k_machtype == MACH_APOLLO)
++#else
++# define MACH_APOLLO_ONLY
++# define MACH_IS_APOLLO (1)
++# define MACH_TYPE (MACH_APOLLO)
++#endif
++
++#if !defined (CONFIG_MVME147)
++# define MACH_IS_MVME147 (0)
++#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
++ || defined(CONFIG_APOLLO) || defined(CONFIG_BVME6000) \
++ || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
++ || defined(CONFIG_SUN3X) || defined(CONFIG_MVME16x)
++# define MACH_IS_MVME147 (m68k_machtype == MACH_MVME147)
++#else
++# define MACH_MVME147_ONLY
++# define MACH_IS_MVME147 (1)
++# define MACH_TYPE (MACH_MVME147)
++#endif
++
++#if !defined (CONFIG_MVME16x)
++# define MACH_IS_MVME16x (0)
++#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
++ || defined(CONFIG_APOLLO) || defined(CONFIG_BVME6000) \
++ || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
++ || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
++# define MACH_IS_MVME16x (m68k_machtype == MACH_MVME16x)
++#else
++# define MACH_MVME16x_ONLY
++# define MACH_IS_MVME16x (1)
++# define MACH_TYPE (MACH_MVME16x)
++#endif
++
++#if !defined (CONFIG_BVME6000)
++# define MACH_IS_BVME6000 (0)
++#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
++ || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \
++ || defined(CONFIG_HP300) || defined(CONFIG_Q40) \
++ || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
++# define MACH_IS_BVME6000 (m68k_machtype == MACH_BVME6000)
++#else
++# define MACH_BVME6000_ONLY
++# define MACH_IS_BVME6000 (1)
++# define MACH_TYPE (MACH_BVME6000)
++#endif
++
++#if !defined (CONFIG_HP300)
++# define MACH_IS_HP300 (0)
++#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
++ || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \
++ || defined(CONFIG_BVME6000) || defined(CONFIG_Q40) \
++ || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
++# define MACH_IS_HP300 (m68k_machtype == MACH_HP300)
++#else
++# define MACH_HP300_ONLY
++# define MACH_IS_HP300 (1)
++# define MACH_TYPE (MACH_HP300)
++#endif
++
++#if !defined (CONFIG_Q40)
++# define MACH_IS_Q40 (0)
++#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
++ || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \
++ || defined(CONFIG_BVME6000) || defined(CONFIG_HP300) \
++ || defined(CONFIG_SUN3X) || defined(CONFIG_MVME147)
++# define MACH_IS_Q40 (m68k_machtype == MACH_Q40)
++#else
++# define MACH_Q40_ONLY
++# define MACH_IS_Q40 (1)
++# define MACH_TYPE (MACH_Q40)
++#endif
++
++#if !defined (CONFIG_SUN3X)
++# define MACH_IS_SUN3X (0)
++#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \
++ || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \
++ || defined(CONFIG_BVME6000) || defined(CONFIG_HP300) \
++ || defined(CONFIG_Q40) || defined(CONFIG_MVME147)
++# define MACH_IS_SUN3X (m68k_machtype == MACH_SUN3X)
++#else
++# define CONFIG_SUN3X_ONLY
++# define MACH_IS_SUN3X (1)
++# define MACH_TYPE (MACH_SUN3X)
++#endif
++
++#ifndef MACH_TYPE
++# define MACH_TYPE (m68k_machtype)
++#endif
++
++#endif /* __KERNEL__ */
++
++
++ /*
++ * CPU, FPU and MMU types
++ *
++ * Note: we may rely on the following equalities:
++ *
++ * CPU_68020 == MMU_68851
++ * CPU_68030 == MMU_68030
++ * CPU_68040 == FPU_68040 == MMU_68040
++ * CPU_68060 == FPU_68060 == MMU_68060
++ */
++
++#define CPUB_68020 0
++#define CPUB_68030 1
++#define CPUB_68040 2
++#define CPUB_68060 3
++
++#define CPU_68020 (1<<CPUB_68020)
++#define CPU_68030 (1<<CPUB_68030)
++#define CPU_68040 (1<<CPUB_68040)
++#define CPU_68060 (1<<CPUB_68060)
++
++#define FPUB_68881 0
++#define FPUB_68882 1
++#define FPUB_68040 2 /* Internal FPU */
++#define FPUB_68060 3 /* Internal FPU */
++#define FPUB_SUNFPA 4 /* Sun-3 FPA */
++
++#define FPU_68881 (1<<FPUB_68881)
++#define FPU_68882 (1<<FPUB_68882)
++#define FPU_68040 (1<<FPUB_68040)
++#define FPU_68060 (1<<FPUB_68060)
++#define FPU_SUNFPA (1<<FPUB_SUNFPA)
++
++#define MMUB_68851 0
++#define MMUB_68030 1 /* Internal MMU */
++#define MMUB_68040 2 /* Internal MMU */
++#define MMUB_68060 3 /* Internal MMU */
++#define MMUB_APOLLO 4 /* Custom Apollo */
++#define MMUB_SUN3 5 /* Custom Sun-3 */
++
++#define MMU_68851 (1<<MMUB_68851)
++#define MMU_68030 (1<<MMUB_68030)
++#define MMU_68040 (1<<MMUB_68040)
++#define MMU_68060 (1<<MMUB_68060)
++#define MMU_SUN3 (1<<MMUB_SUN3)
++#define MMU_APOLLO (1<<MMUB_APOLLO)
++
++#ifdef __KERNEL__
++
++#ifndef __ASSEMBLY__
++extern unsigned long m68k_cputype;
++extern unsigned long m68k_fputype;
++extern unsigned long m68k_mmutype;
++#ifdef CONFIG_VME
++extern unsigned long vme_brdtype;
++#endif
++
++ /*
++ * m68k_is040or060 is != 0 for a '040 or higher;
++ * used numbers are 4 for 68040 and 6 for 68060.
++ */
++
++extern int m68k_is040or060;
++#endif /* !__ASSEMBLY__ */
++
++#if !defined(CONFIG_M68020)
++# define CPU_IS_020 (0)
++# define MMU_IS_851 (0)
++# define MMU_IS_SUN3 (0)
++#elif defined(CONFIG_M68030) || defined(CONFIG_M68040) || defined(CONFIG_M68060)
++# define CPU_IS_020 (m68k_cputype & CPU_68020)
++# define MMU_IS_851 (m68k_mmutype & MMU_68851)
++# define MMU_IS_SUN3 (0) /* Sun3 not supported with other CPU enabled */
++#else
++# define CPU_M68020_ONLY
++# define CPU_IS_020 (1)
++#ifdef MACH_SUN3_ONLY
++# define MMU_IS_SUN3 (1)
++# define MMU_IS_851 (0)
++#else
++# define MMU_IS_SUN3 (0)
++# define MMU_IS_851 (1)
++#endif
++#endif
++
++#if !defined(CONFIG_M68030)
++# define CPU_IS_030 (0)
++# define MMU_IS_030 (0)
++#elif defined(CONFIG_M68020) || defined(CONFIG_M68040) || defined(CONFIG_M68060)
++# define CPU_IS_030 (m68k_cputype & CPU_68030)
++# define MMU_IS_030 (m68k_mmutype & MMU_68030)
++#else
++# define CPU_M68030_ONLY
++# define CPU_IS_030 (1)
++# define MMU_IS_030 (1)
++#endif
++
++#if !defined(CONFIG_M68040)
++# define CPU_IS_040 (0)
++# define MMU_IS_040 (0)
++#elif defined(CONFIG_M68020) || defined(CONFIG_M68030) || defined(CONFIG_M68060)
++# define CPU_IS_040 (m68k_cputype & CPU_68040)
++# define MMU_IS_040 (m68k_mmutype & MMU_68040)
++#else
++# define CPU_M68040_ONLY
++# define CPU_IS_040 (1)
++# define MMU_IS_040 (1)
++#endif
++
++#if !defined(CONFIG_M68060)
++# define CPU_IS_060 (0)
++# define MMU_IS_060 (0)
++#elif defined(CONFIG_M68020) || defined(CONFIG_M68030) || defined(CONFIG_M68040)
++# define CPU_IS_060 (m68k_cputype & CPU_68060)
++# define MMU_IS_060 (m68k_mmutype & MMU_68060)
++#else
++# define CPU_M68060_ONLY
++# define CPU_IS_060 (1)
++# define MMU_IS_060 (1)
++#endif
++
++#if !defined(CONFIG_M68020) && !defined(CONFIG_M68030)
++# define CPU_IS_020_OR_030 (0)
++#else
++# define CPU_M68020_OR_M68030
++# if defined(CONFIG_M68040) || defined(CONFIG_M68060)
++# define CPU_IS_020_OR_030 (!m68k_is040or060)
++# else
++# define CPU_M68020_OR_M68030_ONLY
++# define CPU_IS_020_OR_030 (1)
++# endif
++#endif
++
++#if !defined(CONFIG_M68040) && !defined(CONFIG_M68060)
++# define CPU_IS_040_OR_060 (0)
++#else
++# define CPU_M68040_OR_M68060
++# if defined(CONFIG_M68020) || defined(CONFIG_M68030)
++# define CPU_IS_040_OR_060 (m68k_is040or060)
++# else
++# define CPU_M68040_OR_M68060_ONLY
++# define CPU_IS_040_OR_060 (1)
++# endif
++#endif
++
++#define CPU_TYPE (m68k_cputype)
++
++#ifdef CONFIG_M68KFPU_EMU
++# ifdef CONFIG_M68KFPU_EMU_ONLY
++# define FPU_IS_EMU (1)
++# else
++# define FPU_IS_EMU (!m68k_fputype)
++# endif
++#else
++# define FPU_IS_EMU (0)
++#endif
++
++
++ /*
++ * Miscellaneous
++ */
++
++#define NUM_MEMINFO 4
++
++#ifndef __ASSEMBLY__
++struct mem_info {
++ unsigned long addr; /* physical address of memory chunk */
++ unsigned long size; /* length of memory chunk (in bytes) */
++};
++
++extern int m68k_num_memory; /* # of memory blocks found (and used) */
++extern int m68k_realnum_memory; /* real # of memory blocks found */
++extern struct mem_info m68k_memory[NUM_MEMINFO];/* memory description */
++#endif
++
++#endif /* __KERNEL__ */
++
++#endif /* _M68K_SETUP_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/setup_no.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/setup_no.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/setup_no.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/setup_no.h 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,10 @@
++#ifdef __KERNEL__
++
++#include <asm/setup_mm.h>
++
++/* We have a bigger command line buffer. */
++#undef COMMAND_LINE_SIZE
++
++#endif /* __KERNEL__ */
++
++#define COMMAND_LINE_SIZE 512
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/sigcontext.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/sigcontext.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/sigcontext.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/sigcontext.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,24 +1,5 @@
+-#ifndef _ASM_M68k_SIGCONTEXT_H
+-#define _ASM_M68k_SIGCONTEXT_H
+-
+-struct sigcontext {
+- unsigned long sc_mask; /* old sigmask */
+- unsigned long sc_usp; /* old user stack pointer */
+- unsigned long sc_d0;
+- unsigned long sc_d1;
+- unsigned long sc_a0;
+- unsigned long sc_a1;
+ #ifdef __uClinux__
+- unsigned long sc_a5;
+-#endif
+- unsigned short sc_sr;
+- unsigned long sc_pc;
+- unsigned short sc_formatvec;
+-#ifndef __uClinux__
+- unsigned long sc_fpregs[2*3]; /* room for two fp registers */
+- unsigned long sc_fpcntl[3];
+- unsigned char sc_fpstate[216];
+-#endif
+-};
+-
++#include "sigcontext_no.h"
++#else
++#include "sigcontext_mm.h"
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/sigcontext_mm.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/sigcontext_mm.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/sigcontext_mm.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/sigcontext_mm.h 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,19 @@
++#ifndef _ASM_M68k_SIGCONTEXT_H
++#define _ASM_M68k_SIGCONTEXT_H
++
++struct sigcontext {
++ unsigned long sc_mask; /* old sigmask */
++ unsigned long sc_usp; /* old user stack pointer */
++ unsigned long sc_d0;
++ unsigned long sc_d1;
++ unsigned long sc_a0;
++ unsigned long sc_a1;
++ unsigned short sc_sr;
++ unsigned long sc_pc;
++ unsigned short sc_formatvec;
++ unsigned long sc_fpregs[2*3]; /* room for two fp registers */
++ unsigned long sc_fpcntl[3];
++ unsigned char sc_fpstate[216];
++};
++
++#endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/sigcontext_no.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/sigcontext_no.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/sigcontext_no.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/sigcontext_no.h 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,17 @@
++#ifndef _ASM_M68KNOMMU_SIGCONTEXT_H
++#define _ASM_M68KNOMMU_SIGCONTEXT_H
++
++struct sigcontext {
++ unsigned long sc_mask; /* old sigmask */
++ unsigned long sc_usp; /* old user stack pointer */
++ unsigned long sc_d0;
++ unsigned long sc_d1;
++ unsigned long sc_a0;
++ unsigned long sc_a1;
++ unsigned long sc_a5;
++ unsigned short sc_sr;
++ unsigned long sc_pc;
++ unsigned short sc_formatvec;
++};
++
++#endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/siginfo.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/siginfo.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/siginfo.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/siginfo.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,97 +1,5 @@
+-#ifndef _M68K_SIGINFO_H
+-#define _M68K_SIGINFO_H
+-
+-#ifndef __uClinux__
+-#define HAVE_ARCH_SIGINFO_T
+-#define HAVE_ARCH_COPY_SIGINFO
+-#endif
+-
+-#include <asm-generic/siginfo.h>
+-
+-#ifndef __uClinux__
+-
+-typedef struct siginfo {
+- int si_signo;
+- int si_errno;
+- int si_code;
+-
+- union {
+- int _pad[SI_PAD_SIZE];
+-
+- /* kill() */
+- struct {
+- __kernel_pid_t _pid; /* sender's pid */
+- __kernel_uid_t _uid; /* backwards compatibility */
+- __kernel_uid32_t _uid32; /* sender's uid */
+- } _kill;
+-
+- /* POSIX.1b timers */
+- struct {
+- timer_t _tid; /* timer id */
+- int _overrun; /* overrun count */
+- char _pad[sizeof( __ARCH_SI_UID_T) - sizeof(int)];
+- sigval_t _sigval; /* same as below */
+- int _sys_private; /* not to be passed to user */
+- } _timer;
+-
+- /* POSIX.1b signals */
+- struct {
+- __kernel_pid_t _pid; /* sender's pid */
+- __kernel_uid_t _uid; /* backwards compatibility */
+- sigval_t _sigval;
+- __kernel_uid32_t _uid32; /* sender's uid */
+- } _rt;
+-
+- /* SIGCHLD */
+- struct {
+- __kernel_pid_t _pid; /* which child */
+- __kernel_uid_t _uid; /* backwards compatibility */
+- int _status; /* exit code */
+- clock_t _utime;
+- clock_t _stime;
+- __kernel_uid32_t _uid32; /* sender's uid */
+- } _sigchld;
+-
+- /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
+- struct {
+- void *_addr; /* faulting insn/memory ref. */
+- } _sigfault;
+-
+- /* SIGPOLL */
+- struct {
+- int _band; /* POLL_IN, POLL_OUT, POLL_MSG */
+- int _fd;
+- } _sigpoll;
+- } _sifields;
+-} siginfo_t;
+-
+-#define UID16_SIGINFO_COMPAT_NEEDED
+-
+-/*
+- * How these fields are to be accessed.
+- */
+-#undef si_uid
+-#ifdef __KERNEL__
+-#define si_uid _sifields._kill._uid32
+-#define si_uid16 _sifields._kill._uid
++#ifdef __uClinux__
++#include "siginfo_no.h"
+ #else
+-#define si_uid _sifields._kill._uid
+-#endif
+-
+-#ifdef __KERNEL__
+-
+-#include <linux/string.h>
+-
+-static inline void copy_siginfo(struct siginfo *to, struct siginfo *from)
+-{
+- if (from->si_code < 0)
+- memcpy(to, from, sizeof(*to));
+- else
+- /* _sigchld is currently the largest know union member */
+- memcpy(to, from, 3*sizeof(int) + sizeof(from->_sifields._sigchld));
+-}
+-
+-#endif /* __KERNEL__ */
+-#endif /* !__uClinux__ */
+-
++#include "siginfo_mm.h"
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/siginfo_mm.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/siginfo_mm.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/siginfo_mm.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/siginfo_mm.h 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,92 @@
++#ifndef _M68K_SIGINFO_H
++#define _M68K_SIGINFO_H
++
++#define HAVE_ARCH_SIGINFO_T
++#define HAVE_ARCH_COPY_SIGINFO
++
++#include <asm-generic/siginfo.h>
++
++typedef struct siginfo {
++ int si_signo;
++ int si_errno;
++ int si_code;
++
++ union {
++ int _pad[SI_PAD_SIZE];
++
++ /* kill() */
++ struct {
++ __kernel_pid_t _pid; /* sender's pid */
++ __kernel_uid_t _uid; /* backwards compatibility */
++ __kernel_uid32_t _uid32; /* sender's uid */
++ } _kill;
++
++ /* POSIX.1b timers */
++ struct {
++ timer_t _tid; /* timer id */
++ int _overrun; /* overrun count */
++ char _pad[sizeof( __ARCH_SI_UID_T) - sizeof(int)];
++ sigval_t _sigval; /* same as below */
++ int _sys_private; /* not to be passed to user */
++ } _timer;
++
++ /* POSIX.1b signals */
++ struct {
++ __kernel_pid_t _pid; /* sender's pid */
++ __kernel_uid_t _uid; /* backwards compatibility */
++ sigval_t _sigval;
++ __kernel_uid32_t _uid32; /* sender's uid */
++ } _rt;
++
++ /* SIGCHLD */
++ struct {
++ __kernel_pid_t _pid; /* which child */
++ __kernel_uid_t _uid; /* backwards compatibility */
++ int _status; /* exit code */
++ clock_t _utime;
++ clock_t _stime;
++ __kernel_uid32_t _uid32; /* sender's uid */
++ } _sigchld;
++
++ /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
++ struct {
++ void *_addr; /* faulting insn/memory ref. */
++ } _sigfault;
++
++ /* SIGPOLL */
++ struct {
++ int _band; /* POLL_IN, POLL_OUT, POLL_MSG */
++ int _fd;
++ } _sigpoll;
++ } _sifields;
++} siginfo_t;
++
++#define UID16_SIGINFO_COMPAT_NEEDED
++
++/*
++ * How these fields are to be accessed.
++ */
++#undef si_uid
++#ifdef __KERNEL__
++#define si_uid _sifields._kill._uid32
++#define si_uid16 _sifields._kill._uid
++#else
++#define si_uid _sifields._kill._uid
++#endif
++
++#ifdef __KERNEL__
++
++#include <linux/string.h>
++
++static inline void copy_siginfo(struct siginfo *to, struct siginfo *from)
++{
++ if (from->si_code < 0)
++ memcpy(to, from, sizeof(*to));
++ else
++ /* _sigchld is currently the largest know union member */
++ memcpy(to, from, 3*sizeof(int) + sizeof(from->_sifields._sigchld));
++}
++
++#endif /* __KERNEL__ */
++
++#endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/siginfo_no.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/siginfo_no.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/siginfo_no.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/siginfo_no.h 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,6 @@
++#ifndef _M68KNOMMU_SIGINFO_H
++#define _M68KNOMMU_SIGINFO_H
++
++#include <asm-generic/siginfo.h>
++
++#endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/signal.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/signal.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/signal.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/signal.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,213 +1,5 @@
+-#ifndef _M68K_SIGNAL_H
+-#define _M68K_SIGNAL_H
+-
+-#include <linux/types.h>
+-
+-/* Avoid too many header ordering problems. */
+-struct siginfo;
+-
+-#ifdef __KERNEL__
+-/* Most things should be clean enough to redefine this at will, if care
+- is taken to make libc match. */
+-
+-#define _NSIG 64
+-#define _NSIG_BPW 32
+-#define _NSIG_WORDS (_NSIG / _NSIG_BPW)
+-
+-typedef unsigned long old_sigset_t; /* at least 32 bits */
+-
+-typedef struct {
+- unsigned long sig[_NSIG_WORDS];
+-} sigset_t;
+-
++#ifdef __uClinux__
++#include "signal_no.h"
+ #else
+-/* Here we must cater to libcs that poke about in kernel headers. */
+-
+-#define NSIG 32
+-typedef unsigned long sigset_t;
+-
+-#endif /* __KERNEL__ */
+-
+-#define SIGHUP 1
+-#define SIGINT 2
+-#define SIGQUIT 3
+-#define SIGILL 4
+-#define SIGTRAP 5
+-#define SIGABRT 6
+-#define SIGIOT 6
+-#define SIGBUS 7
+-#define SIGFPE 8
+-#define SIGKILL 9
+-#define SIGUSR1 10
+-#define SIGSEGV 11
+-#define SIGUSR2 12
+-#define SIGPIPE 13
+-#define SIGALRM 14
+-#define SIGTERM 15
+-#define SIGSTKFLT 16
+-#define SIGCHLD 17
+-#define SIGCONT 18
+-#define SIGSTOP 19
+-#define SIGTSTP 20
+-#define SIGTTIN 21
+-#define SIGTTOU 22
+-#define SIGURG 23
+-#define SIGXCPU 24
+-#define SIGXFSZ 25
+-#define SIGVTALRM 26
+-#define SIGPROF 27
+-#define SIGWINCH 28
+-#define SIGIO 29
+-#define SIGPOLL SIGIO
+-/*
+-#define SIGLOST 29
+-*/
+-#define SIGPWR 30
+-#define SIGSYS 31
+-#define SIGUNUSED 31
+-
+-/* These should not be considered constants from userland. */
+-#define SIGRTMIN 32
+-#define SIGRTMAX _NSIG
+-
+-/*
+- * SA_FLAGS values:
+- *
+- * SA_ONSTACK indicates that a registered stack_t will be used.
+- * SA_RESTART flag to get restarting signals (which were the default long ago)
+- * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop.
+- * SA_RESETHAND clears the handler when the signal is delivered.
+- * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies.
+- * SA_NODEFER prevents the current signal from being masked in the handler.
+- *
+- * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single
+- * Unix names RESETHAND and NODEFER respectively.
+- */
+-#define SA_NOCLDSTOP 0x00000001
+-#define SA_NOCLDWAIT 0x00000002
+-#define SA_SIGINFO 0x00000004
+-#define SA_ONSTACK 0x08000000
+-#define SA_RESTART 0x10000000
+-#define SA_NODEFER 0x40000000
+-#define SA_RESETHAND 0x80000000
+-
+-#define SA_NOMASK SA_NODEFER
+-#define SA_ONESHOT SA_RESETHAND
+-
+-/*
+- * sigaltstack controls
+- */
+-#define SS_ONSTACK 1
+-#define SS_DISABLE 2
+-
+-#define MINSIGSTKSZ 2048
+-#define SIGSTKSZ 8192
+-
+-#include <asm-generic/signal.h>
+-
+-#ifdef __KERNEL__
+-struct old_sigaction {
+- __sighandler_t sa_handler;
+- old_sigset_t sa_mask;
+- unsigned long sa_flags;
+- __sigrestore_t sa_restorer;
+-};
+-
+-struct sigaction {
+- __sighandler_t sa_handler;
+- unsigned long sa_flags;
+- __sigrestore_t sa_restorer;
+- sigset_t sa_mask; /* mask last for extensibility */
+-};
+-
+-struct k_sigaction {
+- struct sigaction sa;
+-};
+-#else
+-/* Here we must cater to libcs that poke about in kernel headers. */
+-
+-struct sigaction {
+- union {
+- __sighandler_t _sa_handler;
+- void (*_sa_sigaction)(int, struct siginfo *, void *);
+- } _u;
+- sigset_t sa_mask;
+- unsigned long sa_flags;
+- void (*sa_restorer)(void);
+-};
+-
+-#define sa_handler _u._sa_handler
+-#define sa_sigaction _u._sa_sigaction
+-
+-#endif /* __KERNEL__ */
+-
+-typedef struct sigaltstack {
+- void __user *ss_sp;
+- int ss_flags;
+- size_t ss_size;
+-} stack_t;
+-
+-#ifdef __KERNEL__
+-#include <asm/sigcontext.h>
+-
+-#ifndef __uClinux__
+-#define __HAVE_ARCH_SIG_BITOPS
+-
+-static inline void sigaddset(sigset_t *set, int _sig)
+-{
+- asm ("bfset %0{%1,#1}"
+- : "+od" (*set)
+- : "id" ((_sig - 1) ^ 31)
+- : "cc");
+-}
+-
+-static inline void sigdelset(sigset_t *set, int _sig)
+-{
+- asm ("bfclr %0{%1,#1}"
+- : "+od" (*set)
+- : "id" ((_sig - 1) ^ 31)
+- : "cc");
+-}
+-
+-static inline int __const_sigismember(sigset_t *set, int _sig)
+-{
+- unsigned long sig = _sig - 1;
+- return 1 & (set->sig[sig / _NSIG_BPW] >> (sig % _NSIG_BPW));
+-}
+-
+-static inline int __gen_sigismember(sigset_t *set, int _sig)
+-{
+- int ret;
+- asm ("bfextu %1{%2,#1},%0"
+- : "=d" (ret)
+- : "od" (*set), "id" ((_sig-1) ^ 31)
+- : "cc");
+- return ret;
+-}
+-
+-#define sigismember(set,sig) \
+- (__builtin_constant_p(sig) ? \
+- __const_sigismember(set,sig) : \
+- __gen_sigismember(set,sig))
+-
+-static inline int sigfindinword(unsigned long word)
+-{
+- asm ("bfffo %1{#0,#0},%0"
+- : "=d" (word)
+- : "d" (word & -word)
+- : "cc");
+- return word ^ 31;
+-}
+-
+-struct pt_regs;
+-extern void ptrace_signal_deliver(struct pt_regs *regs, void *cookie);
+-
+-#else
+-
+-#undef __HAVE_ARCH_SIG_BITOPS
+-#define ptrace_signal_deliver(regs, cookie) do { } while (0)
+-
+-#endif /* __uClinux__ */
+-#endif /* __KERNEL__ */
+-
+-#endif /* _M68K_SIGNAL_H */
++#include "signal_mm.h"
++#endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/signal_mm.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/signal_mm.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/signal_mm.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/signal_mm.h 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,206 @@
++#ifndef _M68K_SIGNAL_H
++#define _M68K_SIGNAL_H
++
++#include <linux/types.h>
++
++/* Avoid too many header ordering problems. */
++struct siginfo;
++
++#ifdef __KERNEL__
++/* Most things should be clean enough to redefine this at will, if care
++ is taken to make libc match. */
++
++#define _NSIG 64
++#define _NSIG_BPW 32
++#define _NSIG_WORDS (_NSIG / _NSIG_BPW)
++
++typedef unsigned long old_sigset_t; /* at least 32 bits */
++
++typedef struct {
++ unsigned long sig[_NSIG_WORDS];
++} sigset_t;
++
++#else
++/* Here we must cater to libcs that poke about in kernel headers. */
++
++#define NSIG 32
++typedef unsigned long sigset_t;
++
++#endif /* __KERNEL__ */
++
++#define SIGHUP 1
++#define SIGINT 2
++#define SIGQUIT 3
++#define SIGILL 4
++#define SIGTRAP 5
++#define SIGABRT 6
++#define SIGIOT 6
++#define SIGBUS 7
++#define SIGFPE 8
++#define SIGKILL 9
++#define SIGUSR1 10
++#define SIGSEGV 11
++#define SIGUSR2 12
++#define SIGPIPE 13
++#define SIGALRM 14
++#define SIGTERM 15
++#define SIGSTKFLT 16
++#define SIGCHLD 17
++#define SIGCONT 18
++#define SIGSTOP 19
++#define SIGTSTP 20
++#define SIGTTIN 21
++#define SIGTTOU 22
++#define SIGURG 23
++#define SIGXCPU 24
++#define SIGXFSZ 25
++#define SIGVTALRM 26
++#define SIGPROF 27
++#define SIGWINCH 28
++#define SIGIO 29
++#define SIGPOLL SIGIO
++/*
++#define SIGLOST 29
++*/
++#define SIGPWR 30
++#define SIGSYS 31
++#define SIGUNUSED 31
++
++/* These should not be considered constants from userland. */
++#define SIGRTMIN 32
++#define SIGRTMAX _NSIG
++
++/*
++ * SA_FLAGS values:
++ *
++ * SA_ONSTACK indicates that a registered stack_t will be used.
++ * SA_RESTART flag to get restarting signals (which were the default long ago)
++ * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop.
++ * SA_RESETHAND clears the handler when the signal is delivered.
++ * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies.
++ * SA_NODEFER prevents the current signal from being masked in the handler.
++ *
++ * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single
++ * Unix names RESETHAND and NODEFER respectively.
++ */
++#define SA_NOCLDSTOP 0x00000001
++#define SA_NOCLDWAIT 0x00000002
++#define SA_SIGINFO 0x00000004
++#define SA_ONSTACK 0x08000000
++#define SA_RESTART 0x10000000
++#define SA_NODEFER 0x40000000
++#define SA_RESETHAND 0x80000000
++
++#define SA_NOMASK SA_NODEFER
++#define SA_ONESHOT SA_RESETHAND
++
++/*
++ * sigaltstack controls
++ */
++#define SS_ONSTACK 1
++#define SS_DISABLE 2
++
++#define MINSIGSTKSZ 2048
++#define SIGSTKSZ 8192
++
++#include <asm-generic/signal.h>
++
++#ifdef __KERNEL__
++struct old_sigaction {
++ __sighandler_t sa_handler;
++ old_sigset_t sa_mask;
++ unsigned long sa_flags;
++ __sigrestore_t sa_restorer;
++};
++
++struct sigaction {
++ __sighandler_t sa_handler;
++ unsigned long sa_flags;
++ __sigrestore_t sa_restorer;
++ sigset_t sa_mask; /* mask last for extensibility */
++};
++
++struct k_sigaction {
++ struct sigaction sa;
++};
++#else
++/* Here we must cater to libcs that poke about in kernel headers. */
++
++struct sigaction {
++ union {
++ __sighandler_t _sa_handler;
++ void (*_sa_sigaction)(int, struct siginfo *, void *);
++ } _u;
++ sigset_t sa_mask;
++ unsigned long sa_flags;
++ void (*sa_restorer)(void);
++};
++
++#define sa_handler _u._sa_handler
++#define sa_sigaction _u._sa_sigaction
++
++#endif /* __KERNEL__ */
++
++typedef struct sigaltstack {
++ void __user *ss_sp;
++ int ss_flags;
++ size_t ss_size;
++} stack_t;
++
++#ifdef __KERNEL__
++#include <asm/sigcontext.h>
++
++#define __HAVE_ARCH_SIG_BITOPS
++
++static inline void sigaddset(sigset_t *set, int _sig)
++{
++ asm ("bfset %0{%1,#1}"
++ : "+od" (*set)
++ : "id" ((_sig - 1) ^ 31)
++ : "cc");
++}
++
++static inline void sigdelset(sigset_t *set, int _sig)
++{
++ asm ("bfclr %0{%1,#1}"
++ : "+od" (*set)
++ : "id" ((_sig - 1) ^ 31)
++ : "cc");
++}
++
++static inline int __const_sigismember(sigset_t *set, int _sig)
++{
++ unsigned long sig = _sig - 1;
++ return 1 & (set->sig[sig / _NSIG_BPW] >> (sig % _NSIG_BPW));
++}
++
++static inline int __gen_sigismember(sigset_t *set, int _sig)
++{
++ int ret;
++ asm ("bfextu %1{%2,#1},%0"
++ : "=d" (ret)
++ : "od" (*set), "id" ((_sig-1) ^ 31)
++ : "cc");
++ return ret;
++}
++
++#define sigismember(set,sig) \
++ (__builtin_constant_p(sig) ? \
++ __const_sigismember(set,sig) : \
++ __gen_sigismember(set,sig))
++
++static inline int sigfindinword(unsigned long word)
++{
++ asm ("bfffo %1{#0,#0},%0"
++ : "=d" (word)
++ : "d" (word & -word)
++ : "cc");
++ return word ^ 31;
++}
++
++struct pt_regs;
++extern void ptrace_signal_deliver(struct pt_regs *regs, void *cookie);
++
++#endif /* __KERNEL__ */
++
++#endif /* _M68K_SIGNAL_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/signal_no.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/signal_no.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/signal_no.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/signal_no.h 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,159 @@
++#ifndef _M68KNOMMU_SIGNAL_H
++#define _M68KNOMMU_SIGNAL_H
++
++#include <linux/types.h>
++
++/* Avoid too many header ordering problems. */
++struct siginfo;
++
++#ifdef __KERNEL__
++/* Most things should be clean enough to redefine this at will, if care
++ is taken to make libc match. */
++
++#define _NSIG 64
++#define _NSIG_BPW 32
++#define _NSIG_WORDS (_NSIG / _NSIG_BPW)
++
++typedef unsigned long old_sigset_t; /* at least 32 bits */
++
++typedef struct {
++ unsigned long sig[_NSIG_WORDS];
++} sigset_t;
++
++#else
++/* Here we must cater to libcs that poke about in kernel headers. */
++
++#define NSIG 32
++typedef unsigned long sigset_t;
++
++#endif /* __KERNEL__ */
++
++#define SIGHUP 1
++#define SIGINT 2
++#define SIGQUIT 3
++#define SIGILL 4
++#define SIGTRAP 5
++#define SIGABRT 6
++#define SIGIOT 6
++#define SIGBUS 7
++#define SIGFPE 8
++#define SIGKILL 9
++#define SIGUSR1 10
++#define SIGSEGV 11
++#define SIGUSR2 12
++#define SIGPIPE 13
++#define SIGALRM 14
++#define SIGTERM 15
++#define SIGSTKFLT 16
++#define SIGCHLD 17
++#define SIGCONT 18
++#define SIGSTOP 19
++#define SIGTSTP 20
++#define SIGTTIN 21
++#define SIGTTOU 22
++#define SIGURG 23
++#define SIGXCPU 24
++#define SIGXFSZ 25
++#define SIGVTALRM 26
++#define SIGPROF 27
++#define SIGWINCH 28
++#define SIGIO 29
++#define SIGPOLL SIGIO
++/*
++#define SIGLOST 29
++*/
++#define SIGPWR 30
++#define SIGSYS 31
++#define SIGUNUSED 31
++
++/* These should not be considered constants from userland. */
++#define SIGRTMIN 32
++#define SIGRTMAX _NSIG
++
++/*
++ * SA_FLAGS values:
++ *
++ * SA_ONSTACK indicates that a registered stack_t will be used.
++ * SA_RESTART flag to get restarting signals (which were the default long ago)
++ * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop.
++ * SA_RESETHAND clears the handler when the signal is delivered.
++ * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies.
++ * SA_NODEFER prevents the current signal from being masked in the handler.
++ *
++ * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single
++ * Unix names RESETHAND and NODEFER respectively.
++ */
++#define SA_NOCLDSTOP 0x00000001
++#define SA_NOCLDWAIT 0x00000002
++#define SA_SIGINFO 0x00000004
++#define SA_ONSTACK 0x08000000
++#define SA_RESTART 0x10000000
++#define SA_NODEFER 0x40000000
++#define SA_RESETHAND 0x80000000
++
++#define SA_NOMASK SA_NODEFER
++#define SA_ONESHOT SA_RESETHAND
++
++/*
++ * sigaltstack controls
++ */
++#define SS_ONSTACK 1
++#define SS_DISABLE 2
++
++#define MINSIGSTKSZ 2048
++#define SIGSTKSZ 8192
++
++#include <asm-generic/signal.h>
++
++#ifdef __KERNEL__
++struct old_sigaction {
++ __sighandler_t sa_handler;
++ old_sigset_t sa_mask;
++ unsigned long sa_flags;
++ void (*sa_restorer)(void);
++};
++
++struct sigaction {
++ __sighandler_t sa_handler;
++ unsigned long sa_flags;
++ void (*sa_restorer)(void);
++ sigset_t sa_mask; /* mask last for extensibility */
++};
++
++struct k_sigaction {
++ struct sigaction sa;
++};
++#else
++/* Here we must cater to libcs that poke about in kernel headers. */
++
++struct sigaction {
++ union {
++ __sighandler_t _sa_handler;
++ void (*_sa_sigaction)(int, struct siginfo *, void *);
++ } _u;
++ sigset_t sa_mask;
++ unsigned long sa_flags;
++ void (*sa_restorer)(void);
++};
++
++#define sa_handler _u._sa_handler
++#define sa_sigaction _u._sa_sigaction
++
++#endif /* __KERNEL__ */
++
++typedef struct sigaltstack {
++ void *ss_sp;
++ int ss_flags;
++ size_t ss_size;
++} stack_t;
++
++#ifdef __KERNEL__
++
++#include <asm/sigcontext.h>
++#undef __HAVE_ARCH_SIG_BITOPS
++
++#define ptrace_signal_deliver(regs, cookie) do { } while (0)
++
++#endif /* __KERNEL__ */
++
++#endif /* _M68KNOMMU_SIGNAL_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/swab.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/swab.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/swab.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/swab.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,27 +1,5 @@
+-#ifndef _M68K_SWAB_H
+-#define _M68K_SWAB_H
+-
+-#include <asm/types.h>
+-#include <linux/compiler.h>
+-
+-#define __SWAB_64_THRU_32__
+-
+-#if defined (__mcfisaaplus__) || defined (__mcfisac__)
+-static inline __attribute_const__ __u32 __arch_swab32(__u32 val)
+-{
+- __asm__("byterev %0" : "=d" (val) : "0" (val));
+- return val;
+-}
+-
+-#define __arch_swab32 __arch_swab32
+-#elif !defined(__uClinux__)
+-
+-static inline __attribute_const__ __u32 __arch_swab32(__u32 val)
+-{
+- __asm__("rolw #8,%0; swap %0; rolw #8,%0" : "=d" (val) : "0" (val));
+- return val;
+-}
+-#define __arch_swab32 __arch_swab32
++#ifdef __uClinux__
++#include "swab_no.h"
++#else
++#include "swab_mm.h"
+ #endif
+-
+-#endif /* _M68K_SWAB_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/swab_mm.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/swab_mm.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/swab_mm.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/swab_mm.h 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,16 @@
++#ifndef _M68K_SWAB_H
++#define _M68K_SWAB_H
++
++#include <asm/types.h>
++#include <linux/compiler.h>
++
++#define __SWAB_64_THRU_32__
++
++static inline __attribute_const__ __u32 __arch_swab32(__u32 val)
++{
++ __asm__("rolw #8,%0; swap %0; rolw #8,%0" : "=d" (val) : "0" (val));
++ return val;
++}
++#define __arch_swab32 __arch_swab32
++
++#endif /* _M68K_SWAB_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/swab_no.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/swab_no.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/swab_no.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/swab_no.h 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,24 @@
++#ifndef _M68KNOMMU_SWAB_H
++#define _M68KNOMMU_SWAB_H
++
++#include <linux/types.h>
++
++#if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__)
++# define __SWAB_64_THRU_32__
++#endif
++
++#if defined (__mcfisaaplus__) || defined (__mcfisac__)
++static inline __attribute_const__ __u32 __arch_swab32(__u32 val)
++{
++ asm(
++ "byterev %0"
++ : "=d" (val)
++ : "0" (val)
++ );
++ return val;
++}
++
++#define __arch_swab32 __arch_swab32
++#endif
++
++#endif /* _M68KNOMMU_SWAB_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/unistd.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/unistd.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/unistd.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/unistd.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,372 +1,5 @@
+-#ifndef _ASM_M68K_UNISTD_H_
+-#define _ASM_M68K_UNISTD_H_
+-
+-/*
+- * This file contains the system call numbers.
+- */
+-
+-#define __NR_restart_syscall 0
+-#define __NR_exit 1
+-#define __NR_fork 2
+-#define __NR_read 3
+-#define __NR_write 4
+-#define __NR_open 5
+-#define __NR_close 6
+-#define __NR_waitpid 7
+-#define __NR_creat 8
+-#define __NR_link 9
+-#define __NR_unlink 10
+-#define __NR_execve 11
+-#define __NR_chdir 12
+-#define __NR_time 13
+-#define __NR_mknod 14
+-#define __NR_chmod 15
+-#define __NR_chown 16
+-#define __NR_break 17
+-#define __NR_oldstat 18
+-#define __NR_lseek 19
+-#define __NR_getpid 20
+-#define __NR_mount 21
+-#define __NR_umount 22
+-#define __NR_setuid 23
+-#define __NR_getuid 24
+-#define __NR_stime 25
+-#define __NR_ptrace 26
+-#define __NR_alarm 27
+-#define __NR_oldfstat 28
+-#define __NR_pause 29
+-#define __NR_utime 30
+-#define __NR_stty 31
+-#define __NR_gtty 32
+-#define __NR_access 33
+-#define __NR_nice 34
+-#define __NR_ftime 35
+-#define __NR_sync 36
+-#define __NR_kill 37
+-#define __NR_rename 38
+-#define __NR_mkdir 39
+-#define __NR_rmdir 40
+-#define __NR_dup 41
+-#define __NR_pipe 42
+-#define __NR_times 43
+-#define __NR_prof 44
+-#define __NR_brk 45
+-#define __NR_setgid 46
+-#define __NR_getgid 47
+-#define __NR_signal 48
+-#define __NR_geteuid 49
+-#define __NR_getegid 50
+-#define __NR_acct 51
+-#define __NR_umount2 52
+-#define __NR_lock 53
+-#define __NR_ioctl 54
+-#define __NR_fcntl 55
+-#define __NR_mpx 56
+-#define __NR_setpgid 57
+-#define __NR_ulimit 58
+-#define __NR_oldolduname 59
+-#define __NR_umask 60
+-#define __NR_chroot 61
+-#define __NR_ustat 62
+-#define __NR_dup2 63
+-#define __NR_getppid 64
+-#define __NR_getpgrp 65
+-#define __NR_setsid 66
+-#define __NR_sigaction 67
+-#define __NR_sgetmask 68
+-#define __NR_ssetmask 69
+-#define __NR_setreuid 70
+-#define __NR_setregid 71
+-#define __NR_sigsuspend 72
+-#define __NR_sigpending 73
+-#define __NR_sethostname 74
+-#define __NR_setrlimit 75
+-#define __NR_getrlimit 76
+-#define __NR_getrusage 77
+-#define __NR_gettimeofday 78
+-#define __NR_settimeofday 79
+-#define __NR_getgroups 80
+-#define __NR_setgroups 81
+-#define __NR_select 82
+-#define __NR_symlink 83
+-#define __NR_oldlstat 84
+-#define __NR_readlink 85
+-#define __NR_uselib 86
+-#define __NR_swapon 87
+-#define __NR_reboot 88
+-#define __NR_readdir 89
+-#define __NR_mmap 90
+-#define __NR_munmap 91
+-#define __NR_truncate 92
+-#define __NR_ftruncate 93
+-#define __NR_fchmod 94
+-#define __NR_fchown 95
+-#define __NR_getpriority 96
+-#define __NR_setpriority 97
+-#define __NR_profil 98
+-#define __NR_statfs 99
+-#define __NR_fstatfs 100
+-#define __NR_ioperm 101
+-#define __NR_socketcall 102
+-#define __NR_syslog 103
+-#define __NR_setitimer 104
+-#define __NR_getitimer 105
+-#define __NR_stat 106
+-#define __NR_lstat 107
+-#define __NR_fstat 108
+-#define __NR_olduname 109
+-#define __NR_iopl /* 110 */ not supported
+-#define __NR_vhangup 111
+-#define __NR_idle /* 112 */ Obsolete
+-#define __NR_vm86 /* 113 */ not supported
+-#define __NR_wait4 114
+-#define __NR_swapoff 115
+-#define __NR_sysinfo 116
+-#define __NR_ipc 117
+-#define __NR_fsync 118
+-#define __NR_sigreturn 119
+-#define __NR_clone 120
+-#define __NR_setdomainname 121
+-#define __NR_uname 122
+-#define __NR_cacheflush 123
+-#define __NR_adjtimex 124
+-#define __NR_mprotect 125
+-#define __NR_sigprocmask 126
+-#define __NR_create_module 127
+-#define __NR_init_module 128
+-#define __NR_delete_module 129
+-#define __NR_get_kernel_syms 130
+-#define __NR_quotactl 131
+-#define __NR_getpgid 132
+-#define __NR_fchdir 133
+-#define __NR_bdflush 134
+-#define __NR_sysfs 135
+-#define __NR_personality 136
+-#define __NR_afs_syscall 137 /* Syscall for Andrew File System */
+-#define __NR_setfsuid 138
+-#define __NR_setfsgid 139
+-#define __NR__llseek 140
+-#define __NR_getdents 141
+-#define __NR__newselect 142
+-#define __NR_flock 143
+-#define __NR_msync 144
+-#define __NR_readv 145
+-#define __NR_writev 146
+-#define __NR_getsid 147
+-#define __NR_fdatasync 148
+-#define __NR__sysctl 149
+-#define __NR_mlock 150
+-#define __NR_munlock 151
+-#define __NR_mlockall 152
+-#define __NR_munlockall 153
+-#define __NR_sched_setparam 154
+-#define __NR_sched_getparam 155
+-#define __NR_sched_setscheduler 156
+-#define __NR_sched_getscheduler 157
+-#define __NR_sched_yield 158
+-#define __NR_sched_get_priority_max 159
+-#define __NR_sched_get_priority_min 160
+-#define __NR_sched_rr_get_interval 161
+-#define __NR_nanosleep 162
+-#define __NR_mremap 163
+-#define __NR_setresuid 164
+-#define __NR_getresuid 165
+-#define __NR_getpagesize 166
+-#define __NR_query_module 167
+-#define __NR_poll 168
+-#define __NR_nfsservctl 169
+-#define __NR_setresgid 170
+-#define __NR_getresgid 171
+-#define __NR_prctl 172
+-#define __NR_rt_sigreturn 173
+-#define __NR_rt_sigaction 174
+-#define __NR_rt_sigprocmask 175
+-#define __NR_rt_sigpending 176
+-#define __NR_rt_sigtimedwait 177
+-#define __NR_rt_sigqueueinfo 178
+-#define __NR_rt_sigsuspend 179
+-#define __NR_pread64 180
+-#define __NR_pwrite64 181
+-#define __NR_lchown 182
+-#define __NR_getcwd 183
+-#define __NR_capget 184
+-#define __NR_capset 185
+-#define __NR_sigaltstack 186
+-#define __NR_sendfile 187
+-#define __NR_getpmsg 188 /* some people actually want streams */
+-#define __NR_putpmsg 189 /* some people actually want streams */
+-#define __NR_vfork 190
+-#define __NR_ugetrlimit 191
+-#define __NR_mmap2 192
+-#define __NR_truncate64 193
+-#define __NR_ftruncate64 194
+-#define __NR_stat64 195
+-#define __NR_lstat64 196
+-#define __NR_fstat64 197
+-#define __NR_chown32 198
+-#define __NR_getuid32 199
+-#define __NR_getgid32 200
+-#define __NR_geteuid32 201
+-#define __NR_getegid32 202
+-#define __NR_setreuid32 203
+-#define __NR_setregid32 204
+-#define __NR_getgroups32 205
+-#define __NR_setgroups32 206
+-#define __NR_fchown32 207
+-#define __NR_setresuid32 208
+-#define __NR_getresuid32 209
+-#define __NR_setresgid32 210
+-#define __NR_getresgid32 211
+-#define __NR_lchown32 212
+-#define __NR_setuid32 213
+-#define __NR_setgid32 214
+-#define __NR_setfsuid32 215
+-#define __NR_setfsgid32 216
+-#define __NR_pivot_root 217
+-#define __NR_getdents64 220
+-#define __NR_gettid 221
+-#define __NR_tkill 222
+-#define __NR_setxattr 223
+-#define __NR_lsetxattr 224
+-#define __NR_fsetxattr 225
+-#define __NR_getxattr 226
+-#define __NR_lgetxattr 227
+-#define __NR_fgetxattr 228
+-#define __NR_listxattr 229
+-#define __NR_llistxattr 230
+-#define __NR_flistxattr 231
+-#define __NR_removexattr 232
+-#define __NR_lremovexattr 233
+-#define __NR_fremovexattr 234
+-#define __NR_futex 235
+-#define __NR_sendfile64 236
+-#define __NR_mincore 237
+-#define __NR_madvise 238
+-#define __NR_fcntl64 239
+-#define __NR_readahead 240
+-#define __NR_io_setup 241
+-#define __NR_io_destroy 242
+-#define __NR_io_getevents 243
+-#define __NR_io_submit 244
+-#define __NR_io_cancel 245
+-#define __NR_fadvise64 246
+-#define __NR_exit_group 247
+-#define __NR_lookup_dcookie 248
+-#define __NR_epoll_create 249
+-#define __NR_epoll_ctl 250
+-#define __NR_epoll_wait 251
+-#define __NR_remap_file_pages 252
+-#define __NR_set_tid_address 253
+-#define __NR_timer_create 254
+-#define __NR_timer_settime 255
+-#define __NR_timer_gettime 256
+-#define __NR_timer_getoverrun 257
+-#define __NR_timer_delete 258
+-#define __NR_clock_settime 259
+-#define __NR_clock_gettime 260
+-#define __NR_clock_getres 261
+-#define __NR_clock_nanosleep 262
+-#define __NR_statfs64 263
+-#define __NR_fstatfs64 264
+-#define __NR_tgkill 265
+-#define __NR_utimes 266
+-#define __NR_fadvise64_64 267
+-#define __NR_mbind 268
+-#define __NR_get_mempolicy 269
+-#define __NR_set_mempolicy 270
+-#define __NR_mq_open 271
+-#define __NR_mq_unlink 272
+-#define __NR_mq_timedsend 273
+-#define __NR_mq_timedreceive 274
+-#define __NR_mq_notify 275
+-#define __NR_mq_getsetattr 276
+-#define __NR_waitid 277
+-#define __NR_vserver 278
+-#define __NR_add_key 279
+-#define __NR_request_key 280
+-#define __NR_keyctl 281
+-#define __NR_ioprio_set 282
+-#define __NR_ioprio_get 283
+-#define __NR_inotify_init 284
+-#define __NR_inotify_add_watch 285
+-#define __NR_inotify_rm_watch 286
+-#define __NR_migrate_pages 287
+-#define __NR_openat 288
+-#define __NR_mkdirat 289
+-#define __NR_mknodat 290
+-#define __NR_fchownat 291
+-#define __NR_futimesat 292
+-#define __NR_fstatat64 293
+-#define __NR_unlinkat 294
+-#define __NR_renameat 295
+-#define __NR_linkat 296
+-#define __NR_symlinkat 297
+-#define __NR_readlinkat 298
+-#define __NR_fchmodat 299
+-#define __NR_faccessat 300
+-#define __NR_pselect6 301
+-#define __NR_ppoll 302
+-#define __NR_unshare 303
+-#define __NR_set_robust_list 304
+-#define __NR_get_robust_list 305
+-#define __NR_splice 306
+-#define __NR_sync_file_range 307
+-#define __NR_tee 308
+-#define __NR_vmsplice 309
+-#define __NR_move_pages 310
+-#define __NR_sched_setaffinity 311
+-#define __NR_sched_getaffinity 312
+-#define __NR_kexec_load 313
+-#define __NR_getcpu 314
+-#define __NR_epoll_pwait 315
+-#define __NR_utimensat 316
+-#define __NR_signalfd 317
+-#define __NR_timerfd_create 318
+-#define __NR_eventfd 319
+-#define __NR_fallocate 320
+-#define __NR_timerfd_settime 321
+-#define __NR_timerfd_gettime 322
+-#define __NR_signalfd4 323
+-#define __NR_eventfd2 324
+-#define __NR_epoll_create1 325
+-#define __NR_dup3 326
+-#define __NR_pipe2 327
+-#define __NR_inotify_init1 328
+-
+-#ifdef __KERNEL__
+-
+-#define NR_syscalls 329
+-
+-#define __ARCH_WANT_IPC_PARSE_VERSION
+-#define __ARCH_WANT_OLD_READDIR
+-#define __ARCH_WANT_OLD_STAT
+-#define __ARCH_WANT_STAT64
+-#define __ARCH_WANT_SYS_ALARM
+-#define __ARCH_WANT_SYS_GETHOSTNAME
+-#define __ARCH_WANT_SYS_PAUSE
+-#define __ARCH_WANT_SYS_SGETMASK
+-#define __ARCH_WANT_SYS_SIGNAL
+-#define __ARCH_WANT_SYS_TIME
+-#define __ARCH_WANT_SYS_UTIME
+-#define __ARCH_WANT_SYS_WAITPID
+-#define __ARCH_WANT_SYS_SOCKETCALL
+-#define __ARCH_WANT_SYS_FADVISE64
+-#define __ARCH_WANT_SYS_GETPGRP
+-#define __ARCH_WANT_SYS_LLSEEK
+-#define __ARCH_WANT_SYS_NICE
+-#define __ARCH_WANT_SYS_OLD_GETRLIMIT
+-#define __ARCH_WANT_SYS_OLDUMOUNT
+-#define __ARCH_WANT_SYS_SIGPENDING
+-#define __ARCH_WANT_SYS_SIGPROCMASK
+-#define __ARCH_WANT_SYS_RT_SIGACTION
+-
+-/*
+- * "Conditional" syscalls
+- *
+- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
+- * but it doesn't work on all toolchains, so we just do it by hand
+- */
+-#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
+-
+-#endif /* __KERNEL__ */
+-#endif /* _ASM_M68K_UNISTD_H_ */
++#ifdef __uClinux__
++#include "unistd_no.h"
++#else
++#include "unistd_mm.h"
++#endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/unistd_mm.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/unistd_mm.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/unistd_mm.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/unistd_mm.h 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,372 @@
++#ifndef _ASM_M68K_UNISTD_H_
++#define _ASM_M68K_UNISTD_H_
++
++/*
++ * This file contains the system call numbers.
++ */
++
++#define __NR_restart_syscall 0
++#define __NR_exit 1
++#define __NR_fork 2
++#define __NR_read 3
++#define __NR_write 4
++#define __NR_open 5
++#define __NR_close 6
++#define __NR_waitpid 7
++#define __NR_creat 8
++#define __NR_link 9
++#define __NR_unlink 10
++#define __NR_execve 11
++#define __NR_chdir 12
++#define __NR_time 13
++#define __NR_mknod 14
++#define __NR_chmod 15
++#define __NR_chown 16
++#define __NR_break 17
++#define __NR_oldstat 18
++#define __NR_lseek 19
++#define __NR_getpid 20
++#define __NR_mount 21
++#define __NR_umount 22
++#define __NR_setuid 23
++#define __NR_getuid 24
++#define __NR_stime 25
++#define __NR_ptrace 26
++#define __NR_alarm 27
++#define __NR_oldfstat 28
++#define __NR_pause 29
++#define __NR_utime 30
++#define __NR_stty 31
++#define __NR_gtty 32
++#define __NR_access 33
++#define __NR_nice 34
++#define __NR_ftime 35
++#define __NR_sync 36
++#define __NR_kill 37
++#define __NR_rename 38
++#define __NR_mkdir 39
++#define __NR_rmdir 40
++#define __NR_dup 41
++#define __NR_pipe 42
++#define __NR_times 43
++#define __NR_prof 44
++#define __NR_brk 45
++#define __NR_setgid 46
++#define __NR_getgid 47
++#define __NR_signal 48
++#define __NR_geteuid 49
++#define __NR_getegid 50
++#define __NR_acct 51
++#define __NR_umount2 52
++#define __NR_lock 53
++#define __NR_ioctl 54
++#define __NR_fcntl 55
++#define __NR_mpx 56
++#define __NR_setpgid 57
++#define __NR_ulimit 58
++#define __NR_oldolduname 59
++#define __NR_umask 60
++#define __NR_chroot 61
++#define __NR_ustat 62
++#define __NR_dup2 63
++#define __NR_getppid 64
++#define __NR_getpgrp 65
++#define __NR_setsid 66
++#define __NR_sigaction 67
++#define __NR_sgetmask 68
++#define __NR_ssetmask 69
++#define __NR_setreuid 70
++#define __NR_setregid 71
++#define __NR_sigsuspend 72
++#define __NR_sigpending 73
++#define __NR_sethostname 74
++#define __NR_setrlimit 75
++#define __NR_getrlimit 76
++#define __NR_getrusage 77
++#define __NR_gettimeofday 78
++#define __NR_settimeofday 79
++#define __NR_getgroups 80
++#define __NR_setgroups 81
++#define __NR_select 82
++#define __NR_symlink 83
++#define __NR_oldlstat 84
++#define __NR_readlink 85
++#define __NR_uselib 86
++#define __NR_swapon 87
++#define __NR_reboot 88
++#define __NR_readdir 89
++#define __NR_mmap 90
++#define __NR_munmap 91
++#define __NR_truncate 92
++#define __NR_ftruncate 93
++#define __NR_fchmod 94
++#define __NR_fchown 95
++#define __NR_getpriority 96
++#define __NR_setpriority 97
++#define __NR_profil 98
++#define __NR_statfs 99
++#define __NR_fstatfs 100
++#define __NR_ioperm 101
++#define __NR_socketcall 102
++#define __NR_syslog 103
++#define __NR_setitimer 104
++#define __NR_getitimer 105
++#define __NR_stat 106
++#define __NR_lstat 107
++#define __NR_fstat 108
++#define __NR_olduname 109
++#define __NR_iopl /* 110 */ not supported
++#define __NR_vhangup 111
++#define __NR_idle /* 112 */ Obsolete
++#define __NR_vm86 /* 113 */ not supported
++#define __NR_wait4 114
++#define __NR_swapoff 115
++#define __NR_sysinfo 116
++#define __NR_ipc 117
++#define __NR_fsync 118
++#define __NR_sigreturn 119
++#define __NR_clone 120
++#define __NR_setdomainname 121
++#define __NR_uname 122
++#define __NR_cacheflush 123
++#define __NR_adjtimex 124
++#define __NR_mprotect 125
++#define __NR_sigprocmask 126
++#define __NR_create_module 127
++#define __NR_init_module 128
++#define __NR_delete_module 129
++#define __NR_get_kernel_syms 130
++#define __NR_quotactl 131
++#define __NR_getpgid 132
++#define __NR_fchdir 133
++#define __NR_bdflush 134
++#define __NR_sysfs 135
++#define __NR_personality 136
++#define __NR_afs_syscall 137 /* Syscall for Andrew File System */
++#define __NR_setfsuid 138
++#define __NR_setfsgid 139
++#define __NR__llseek 140
++#define __NR_getdents 141
++#define __NR__newselect 142
++#define __NR_flock 143
++#define __NR_msync 144
++#define __NR_readv 145
++#define __NR_writev 146
++#define __NR_getsid 147
++#define __NR_fdatasync 148
++#define __NR__sysctl 149
++#define __NR_mlock 150
++#define __NR_munlock 151
++#define __NR_mlockall 152
++#define __NR_munlockall 153
++#define __NR_sched_setparam 154
++#define __NR_sched_getparam 155
++#define __NR_sched_setscheduler 156
++#define __NR_sched_getscheduler 157
++#define __NR_sched_yield 158
++#define __NR_sched_get_priority_max 159
++#define __NR_sched_get_priority_min 160
++#define __NR_sched_rr_get_interval 161
++#define __NR_nanosleep 162
++#define __NR_mremap 163
++#define __NR_setresuid 164
++#define __NR_getresuid 165
++#define __NR_getpagesize 166
++#define __NR_query_module 167
++#define __NR_poll 168
++#define __NR_nfsservctl 169
++#define __NR_setresgid 170
++#define __NR_getresgid 171
++#define __NR_prctl 172
++#define __NR_rt_sigreturn 173
++#define __NR_rt_sigaction 174
++#define __NR_rt_sigprocmask 175
++#define __NR_rt_sigpending 176
++#define __NR_rt_sigtimedwait 177
++#define __NR_rt_sigqueueinfo 178
++#define __NR_rt_sigsuspend 179
++#define __NR_pread64 180
++#define __NR_pwrite64 181
++#define __NR_lchown 182
++#define __NR_getcwd 183
++#define __NR_capget 184
++#define __NR_capset 185
++#define __NR_sigaltstack 186
++#define __NR_sendfile 187
++#define __NR_getpmsg 188 /* some people actually want streams */
++#define __NR_putpmsg 189 /* some people actually want streams */
++#define __NR_vfork 190
++#define __NR_ugetrlimit 191
++#define __NR_mmap2 192
++#define __NR_truncate64 193
++#define __NR_ftruncate64 194
++#define __NR_stat64 195
++#define __NR_lstat64 196
++#define __NR_fstat64 197
++#define __NR_chown32 198
++#define __NR_getuid32 199
++#define __NR_getgid32 200
++#define __NR_geteuid32 201
++#define __NR_getegid32 202
++#define __NR_setreuid32 203
++#define __NR_setregid32 204
++#define __NR_getgroups32 205
++#define __NR_setgroups32 206
++#define __NR_fchown32 207
++#define __NR_setresuid32 208
++#define __NR_getresuid32 209
++#define __NR_setresgid32 210
++#define __NR_getresgid32 211
++#define __NR_lchown32 212
++#define __NR_setuid32 213
++#define __NR_setgid32 214
++#define __NR_setfsuid32 215
++#define __NR_setfsgid32 216
++#define __NR_pivot_root 217
++#define __NR_getdents64 220
++#define __NR_gettid 221
++#define __NR_tkill 222
++#define __NR_setxattr 223
++#define __NR_lsetxattr 224
++#define __NR_fsetxattr 225
++#define __NR_getxattr 226
++#define __NR_lgetxattr 227
++#define __NR_fgetxattr 228
++#define __NR_listxattr 229
++#define __NR_llistxattr 230
++#define __NR_flistxattr 231
++#define __NR_removexattr 232
++#define __NR_lremovexattr 233
++#define __NR_fremovexattr 234
++#define __NR_futex 235
++#define __NR_sendfile64 236
++#define __NR_mincore 237
++#define __NR_madvise 238
++#define __NR_fcntl64 239
++#define __NR_readahead 240
++#define __NR_io_setup 241
++#define __NR_io_destroy 242
++#define __NR_io_getevents 243
++#define __NR_io_submit 244
++#define __NR_io_cancel 245
++#define __NR_fadvise64 246
++#define __NR_exit_group 247
++#define __NR_lookup_dcookie 248
++#define __NR_epoll_create 249
++#define __NR_epoll_ctl 250
++#define __NR_epoll_wait 251
++#define __NR_remap_file_pages 252
++#define __NR_set_tid_address 253
++#define __NR_timer_create 254
++#define __NR_timer_settime 255
++#define __NR_timer_gettime 256
++#define __NR_timer_getoverrun 257
++#define __NR_timer_delete 258
++#define __NR_clock_settime 259
++#define __NR_clock_gettime 260
++#define __NR_clock_getres 261
++#define __NR_clock_nanosleep 262
++#define __NR_statfs64 263
++#define __NR_fstatfs64 264
++#define __NR_tgkill 265
++#define __NR_utimes 266
++#define __NR_fadvise64_64 267
++#define __NR_mbind 268
++#define __NR_get_mempolicy 269
++#define __NR_set_mempolicy 270
++#define __NR_mq_open 271
++#define __NR_mq_unlink 272
++#define __NR_mq_timedsend 273
++#define __NR_mq_timedreceive 274
++#define __NR_mq_notify 275
++#define __NR_mq_getsetattr 276
++#define __NR_waitid 277
++#define __NR_vserver 278
++#define __NR_add_key 279
++#define __NR_request_key 280
++#define __NR_keyctl 281
++#define __NR_ioprio_set 282
++#define __NR_ioprio_get 283
++#define __NR_inotify_init 284
++#define __NR_inotify_add_watch 285
++#define __NR_inotify_rm_watch 286
++#define __NR_migrate_pages 287
++#define __NR_openat 288
++#define __NR_mkdirat 289
++#define __NR_mknodat 290
++#define __NR_fchownat 291
++#define __NR_futimesat 292
++#define __NR_fstatat64 293
++#define __NR_unlinkat 294
++#define __NR_renameat 295
++#define __NR_linkat 296
++#define __NR_symlinkat 297
++#define __NR_readlinkat 298
++#define __NR_fchmodat 299
++#define __NR_faccessat 300
++#define __NR_pselect6 301
++#define __NR_ppoll 302
++#define __NR_unshare 303
++#define __NR_set_robust_list 304
++#define __NR_get_robust_list 305
++#define __NR_splice 306
++#define __NR_sync_file_range 307
++#define __NR_tee 308
++#define __NR_vmsplice 309
++#define __NR_move_pages 310
++#define __NR_sched_setaffinity 311
++#define __NR_sched_getaffinity 312
++#define __NR_kexec_load 313
++#define __NR_getcpu 314
++#define __NR_epoll_pwait 315
++#define __NR_utimensat 316
++#define __NR_signalfd 317
++#define __NR_timerfd_create 318
++#define __NR_eventfd 319
++#define __NR_fallocate 320
++#define __NR_timerfd_settime 321
++#define __NR_timerfd_gettime 322
++#define __NR_signalfd4 323
++#define __NR_eventfd2 324
++#define __NR_epoll_create1 325
++#define __NR_dup3 326
++#define __NR_pipe2 327
++#define __NR_inotify_init1 328
++
++#ifdef __KERNEL__
++
++#define NR_syscalls 329
++
++#define __ARCH_WANT_IPC_PARSE_VERSION
++#define __ARCH_WANT_OLD_READDIR
++#define __ARCH_WANT_OLD_STAT
++#define __ARCH_WANT_STAT64
++#define __ARCH_WANT_SYS_ALARM
++#define __ARCH_WANT_SYS_GETHOSTNAME
++#define __ARCH_WANT_SYS_PAUSE
++#define __ARCH_WANT_SYS_SGETMASK
++#define __ARCH_WANT_SYS_SIGNAL
++#define __ARCH_WANT_SYS_TIME
++#define __ARCH_WANT_SYS_UTIME
++#define __ARCH_WANT_SYS_WAITPID
++#define __ARCH_WANT_SYS_SOCKETCALL
++#define __ARCH_WANT_SYS_FADVISE64
++#define __ARCH_WANT_SYS_GETPGRP
++#define __ARCH_WANT_SYS_LLSEEK
++#define __ARCH_WANT_SYS_NICE
++#define __ARCH_WANT_SYS_OLD_GETRLIMIT
++#define __ARCH_WANT_SYS_OLDUMOUNT
++#define __ARCH_WANT_SYS_SIGPENDING
++#define __ARCH_WANT_SYS_SIGPROCMASK
++#define __ARCH_WANT_SYS_RT_SIGACTION
++
++/*
++ * "Conditional" syscalls
++ *
++ * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
++ * but it doesn't work on all toolchains, so we just do it by hand
++ */
++#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
++
++#endif /* __KERNEL__ */
++#endif /* _ASM_M68K_UNISTD_H_ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68k/include/asm/unistd_no.h linux-2.6.29-rc3.owrt/arch/m68k/include/asm/unistd_no.h
+--- linux-2.6.29.owrt/arch/m68k/include/asm/unistd_no.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/arch/m68k/include/asm/unistd_no.h 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,372 @@
++#ifndef _ASM_M68K_UNISTD_H_
++#define _ASM_M68K_UNISTD_H_
++
++/*
++ * This file contains the system call numbers.
++ */
++
++#define __NR_restart_syscall 0
++#define __NR_exit 1
++#define __NR_fork 2
++#define __NR_read 3
++#define __NR_write 4
++#define __NR_open 5
++#define __NR_close 6
++#define __NR_waitpid 7
++#define __NR_creat 8
++#define __NR_link 9
++#define __NR_unlink 10
++#define __NR_execve 11
++#define __NR_chdir 12
++#define __NR_time 13
++#define __NR_mknod 14
++#define __NR_chmod 15
++#define __NR_chown 16
++#define __NR_break 17
++#define __NR_oldstat 18
++#define __NR_lseek 19
++#define __NR_getpid 20
++#define __NR_mount 21
++#define __NR_umount 22
++#define __NR_setuid 23
++#define __NR_getuid 24
++#define __NR_stime 25
++#define __NR_ptrace 26
++#define __NR_alarm 27
++#define __NR_oldfstat 28
++#define __NR_pause 29
++#define __NR_utime 30
++#define __NR_stty 31
++#define __NR_gtty 32
++#define __NR_access 33
++#define __NR_nice 34
++#define __NR_ftime 35
++#define __NR_sync 36
++#define __NR_kill 37
++#define __NR_rename 38
++#define __NR_mkdir 39
++#define __NR_rmdir 40
++#define __NR_dup 41
++#define __NR_pipe 42
++#define __NR_times 43
++#define __NR_prof 44
++#define __NR_brk 45
++#define __NR_setgid 46
++#define __NR_getgid 47
++#define __NR_signal 48
++#define __NR_geteuid 49
++#define __NR_getegid 50
++#define __NR_acct 51
++#define __NR_umount2 52
++#define __NR_lock 53
++#define __NR_ioctl 54
++#define __NR_fcntl 55
++#define __NR_mpx 56
++#define __NR_setpgid 57
++#define __NR_ulimit 58
++#define __NR_oldolduname 59
++#define __NR_umask 60
++#define __NR_chroot 61
++#define __NR_ustat 62
++#define __NR_dup2 63
++#define __NR_getppid 64
++#define __NR_getpgrp 65
++#define __NR_setsid 66
++#define __NR_sigaction 67
++#define __NR_sgetmask 68
++#define __NR_ssetmask 69
++#define __NR_setreuid 70
++#define __NR_setregid 71
++#define __NR_sigsuspend 72
++#define __NR_sigpending 73
++#define __NR_sethostname 74
++#define __NR_setrlimit 75
++#define __NR_getrlimit 76
++#define __NR_getrusage 77
++#define __NR_gettimeofday 78
++#define __NR_settimeofday 79
++#define __NR_getgroups 80
++#define __NR_setgroups 81
++#define __NR_select 82
++#define __NR_symlink 83
++#define __NR_oldlstat 84
++#define __NR_readlink 85
++#define __NR_uselib 86
++#define __NR_swapon 87
++#define __NR_reboot 88
++#define __NR_readdir 89
++#define __NR_mmap 90
++#define __NR_munmap 91
++#define __NR_truncate 92
++#define __NR_ftruncate 93
++#define __NR_fchmod 94
++#define __NR_fchown 95
++#define __NR_getpriority 96
++#define __NR_setpriority 97
++#define __NR_profil 98
++#define __NR_statfs 99
++#define __NR_fstatfs 100
++#define __NR_ioperm 101
++#define __NR_socketcall 102
++#define __NR_syslog 103
++#define __NR_setitimer 104
++#define __NR_getitimer 105
++#define __NR_stat 106
++#define __NR_lstat 107
++#define __NR_fstat 108
++#define __NR_olduname 109
++#define __NR_iopl /* 110 */ not supported
++#define __NR_vhangup 111
++#define __NR_idle /* 112 */ Obsolete
++#define __NR_vm86 /* 113 */ not supported
++#define __NR_wait4 114
++#define __NR_swapoff 115
++#define __NR_sysinfo 116
++#define __NR_ipc 117
++#define __NR_fsync 118
++#define __NR_sigreturn 119
++#define __NR_clone 120
++#define __NR_setdomainname 121
++#define __NR_uname 122
++#define __NR_cacheflush 123
++#define __NR_adjtimex 124
++#define __NR_mprotect 125
++#define __NR_sigprocmask 126
++#define __NR_create_module 127
++#define __NR_init_module 128
++#define __NR_delete_module 129
++#define __NR_get_kernel_syms 130
++#define __NR_quotactl 131
++#define __NR_getpgid 132
++#define __NR_fchdir 133
++#define __NR_bdflush 134
++#define __NR_sysfs 135
++#define __NR_personality 136
++#define __NR_afs_syscall 137 /* Syscall for Andrew File System */
++#define __NR_setfsuid 138
++#define __NR_setfsgid 139
++#define __NR__llseek 140
++#define __NR_getdents 141
++#define __NR__newselect 142
++#define __NR_flock 143
++#define __NR_msync 144
++#define __NR_readv 145
++#define __NR_writev 146
++#define __NR_getsid 147
++#define __NR_fdatasync 148
++#define __NR__sysctl 149
++#define __NR_mlock 150
++#define __NR_munlock 151
++#define __NR_mlockall 152
++#define __NR_munlockall 153
++#define __NR_sched_setparam 154
++#define __NR_sched_getparam 155
++#define __NR_sched_setscheduler 156
++#define __NR_sched_getscheduler 157
++#define __NR_sched_yield 158
++#define __NR_sched_get_priority_max 159
++#define __NR_sched_get_priority_min 160
++#define __NR_sched_rr_get_interval 161
++#define __NR_nanosleep 162
++#define __NR_mremap 163
++#define __NR_setresuid 164
++#define __NR_getresuid 165
++#define __NR_getpagesize 166
++#define __NR_query_module 167
++#define __NR_poll 168
++#define __NR_nfsservctl 169
++#define __NR_setresgid 170
++#define __NR_getresgid 171
++#define __NR_prctl 172
++#define __NR_rt_sigreturn 173
++#define __NR_rt_sigaction 174
++#define __NR_rt_sigprocmask 175
++#define __NR_rt_sigpending 176
++#define __NR_rt_sigtimedwait 177
++#define __NR_rt_sigqueueinfo 178
++#define __NR_rt_sigsuspend 179
++#define __NR_pread64 180
++#define __NR_pwrite64 181
++#define __NR_lchown 182
++#define __NR_getcwd 183
++#define __NR_capget 184
++#define __NR_capset 185
++#define __NR_sigaltstack 186
++#define __NR_sendfile 187
++#define __NR_getpmsg 188 /* some people actually want streams */
++#define __NR_putpmsg 189 /* some people actually want streams */
++#define __NR_vfork 190
++#define __NR_ugetrlimit 191
++#define __NR_mmap2 192
++#define __NR_truncate64 193
++#define __NR_ftruncate64 194
++#define __NR_stat64 195
++#define __NR_lstat64 196
++#define __NR_fstat64 197
++#define __NR_chown32 198
++#define __NR_getuid32 199
++#define __NR_getgid32 200
++#define __NR_geteuid32 201
++#define __NR_getegid32 202
++#define __NR_setreuid32 203
++#define __NR_setregid32 204
++#define __NR_getgroups32 205
++#define __NR_setgroups32 206
++#define __NR_fchown32 207
++#define __NR_setresuid32 208
++#define __NR_getresuid32 209
++#define __NR_setresgid32 210
++#define __NR_getresgid32 211
++#define __NR_lchown32 212
++#define __NR_setuid32 213
++#define __NR_setgid32 214
++#define __NR_setfsuid32 215
++#define __NR_setfsgid32 216
++#define __NR_pivot_root 217
++#define __NR_getdents64 220
++#define __NR_gettid 221
++#define __NR_tkill 222
++#define __NR_setxattr 223
++#define __NR_lsetxattr 224
++#define __NR_fsetxattr 225
++#define __NR_getxattr 226
++#define __NR_lgetxattr 227
++#define __NR_fgetxattr 228
++#define __NR_listxattr 229
++#define __NR_llistxattr 230
++#define __NR_flistxattr 231
++#define __NR_removexattr 232
++#define __NR_lremovexattr 233
++#define __NR_fremovexattr 234
++#define __NR_futex 235
++#define __NR_sendfile64 236
++#define __NR_mincore 237
++#define __NR_madvise 238
++#define __NR_fcntl64 239
++#define __NR_readahead 240
++#define __NR_io_setup 241
++#define __NR_io_destroy 242
++#define __NR_io_getevents 243
++#define __NR_io_submit 244
++#define __NR_io_cancel 245
++#define __NR_fadvise64 246
++#define __NR_exit_group 247
++#define __NR_lookup_dcookie 248
++#define __NR_epoll_create 249
++#define __NR_epoll_ctl 250
++#define __NR_epoll_wait 251
++#define __NR_remap_file_pages 252
++#define __NR_set_tid_address 253
++#define __NR_timer_create 254
++#define __NR_timer_settime 255
++#define __NR_timer_gettime 256
++#define __NR_timer_getoverrun 257
++#define __NR_timer_delete 258
++#define __NR_clock_settime 259
++#define __NR_clock_gettime 260
++#define __NR_clock_getres 261
++#define __NR_clock_nanosleep 262
++#define __NR_statfs64 263
++#define __NR_fstatfs64 264
++#define __NR_tgkill 265
++#define __NR_utimes 266
++#define __NR_fadvise64_64 267
++#define __NR_mbind 268
++#define __NR_get_mempolicy 269
++#define __NR_set_mempolicy 270
++#define __NR_mq_open 271
++#define __NR_mq_unlink 272
++#define __NR_mq_timedsend 273
++#define __NR_mq_timedreceive 274
++#define __NR_mq_notify 275
++#define __NR_mq_getsetattr 276
++#define __NR_waitid 277
++#define __NR_vserver 278
++#define __NR_add_key 279
++#define __NR_request_key 280
++#define __NR_keyctl 281
++#define __NR_ioprio_set 282
++#define __NR_ioprio_get 283
++#define __NR_inotify_init 284
++#define __NR_inotify_add_watch 285
++#define __NR_inotify_rm_watch 286
++#define __NR_migrate_pages 287
++#define __NR_openat 288
++#define __NR_mkdirat 289
++#define __NR_mknodat 290
++#define __NR_fchownat 291
++#define __NR_futimesat 292
++#define __NR_fstatat64 293
++#define __NR_unlinkat 294
++#define __NR_renameat 295
++#define __NR_linkat 296
++#define __NR_symlinkat 297
++#define __NR_readlinkat 298
++#define __NR_fchmodat 299
++#define __NR_faccessat 300
++#define __NR_pselect6 301
++#define __NR_ppoll 302
++#define __NR_unshare 303
++#define __NR_set_robust_list 304
++#define __NR_get_robust_list 305
++#define __NR_splice 306
++#define __NR_sync_file_range 307
++#define __NR_tee 308
++#define __NR_vmsplice 309
++#define __NR_move_pages 310
++#define __NR_sched_setaffinity 311
++#define __NR_sched_getaffinity 312
++#define __NR_kexec_load 313
++#define __NR_getcpu 314
++#define __NR_epoll_pwait 315
++#define __NR_utimensat 316
++#define __NR_signalfd 317
++#define __NR_timerfd_create 318
++#define __NR_eventfd 319
++#define __NR_fallocate 320
++#define __NR_timerfd_settime 321
++#define __NR_timerfd_gettime 322
++#define __NR_signalfd4 323
++#define __NR_eventfd2 324
++#define __NR_epoll_create1 325
++#define __NR_dup3 326
++#define __NR_pipe2 327
++#define __NR_inotify_init1 328
++
++#ifdef __KERNEL__
++
++#define NR_syscalls 329
++
++#define __ARCH_WANT_IPC_PARSE_VERSION
++#define __ARCH_WANT_OLD_READDIR
++#define __ARCH_WANT_OLD_STAT
++#define __ARCH_WANT_STAT64
++#define __ARCH_WANT_SYS_ALARM
++#define __ARCH_WANT_SYS_GETHOSTNAME
++#define __ARCH_WANT_SYS_PAUSE
++#define __ARCH_WANT_SYS_SGETMASK
++#define __ARCH_WANT_SYS_SIGNAL
++#define __ARCH_WANT_SYS_TIME
++#define __ARCH_WANT_SYS_UTIME
++#define __ARCH_WANT_SYS_WAITPID
++#define __ARCH_WANT_SYS_SOCKETCALL
++#define __ARCH_WANT_SYS_FADVISE64
++#define __ARCH_WANT_SYS_GETPGRP
++#define __ARCH_WANT_SYS_LLSEEK
++#define __ARCH_WANT_SYS_NICE
++#define __ARCH_WANT_SYS_OLD_GETRLIMIT
++#define __ARCH_WANT_SYS_OLDUMOUNT
++#define __ARCH_WANT_SYS_SIGPENDING
++#define __ARCH_WANT_SYS_SIGPROCMASK
++#define __ARCH_WANT_SYS_RT_SIGACTION
++
++/*
++ * "Conditional" syscalls
++ *
++ * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
++ * but it doesn't work on all toolchains, so we just do it by hand
++ */
++#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
++
++#endif /* __KERNEL__ */
++#endif /* _ASM_M68K_UNISTD_H_ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68knommu/platform/5206e/config.c linux-2.6.29-rc3.owrt/arch/m68knommu/platform/5206e/config.c
+--- linux-2.6.29.owrt/arch/m68knommu/platform/5206e/config.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/m68knommu/platform/5206e/config.c 2009-05-10 23:48:28.000000000 +0200
+@@ -17,7 +17,6 @@
+ #include <asm/coldfire.h>
+ #include <asm/mcfsim.h>
+ #include <asm/mcfdma.h>
+-#include <asm/mcfuart.h>
+
+ /***************************************************************************/
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/m68knommu/platform/528x/config.c linux-2.6.29-rc3.owrt/arch/m68knommu/platform/528x/config.c
+--- linux-2.6.29.owrt/arch/m68knommu/platform/528x/config.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/m68knommu/platform/528x/config.c 2009-05-10 23:48:28.000000000 +0200
+@@ -24,6 +24,7 @@
+ #include <asm/coldfire.h>
+ #include <asm/mcfsim.h>
+ #include <asm/mcfuart.h>
++#include <asm/mcfqspi.h>
+
+ #ifdef CONFIG_MTD_PARTITIONS
+ #include <linux/mtd/partitions.h>
+@@ -32,6 +33,233 @@
+ /***************************************************************************/
+
+ void coldfire_reset(void);
++static void coldfire_qspi_cs_control(u8 cs, u8 command);
++
++/***************************************************************************/
++
++#if defined(CONFIG_SPI)
++
++#if defined(CONFIG_WILDFIRE)
++#define SPI_NUM_CHIPSELECTS 0x02
++#define SPI_PAR_VAL 0x07 /* Enable DIN, DOUT, CLK */
++#define SPI_CS_MASK 0x18
++
++#define FLASH_BLOCKSIZE (1024*64)
++#define FLASH_NUMBLOCKS 16
++#define FLASH_TYPE "m25p80"
++
++#define M25P80_CS 0
++#define MMC_CS 1
++
++#ifdef CONFIG_MTD_PARTITIONS
++static struct mtd_partition stm25p_partitions[] = {
++ /* sflash */
++ [0] = {
++ .name = "stm25p80",
++ .offset = 0x00000000,
++ .size = FLASH_BLOCKSIZE * FLASH_NUMBLOCKS,
++ .mask_flags = 0
++ }
++};
++
++#endif
++
++#elif defined(CONFIG_WILDFIREMOD)
++
++#define SPI_NUM_CHIPSELECTS 0x08
++#define SPI_PAR_VAL 0x07 /* Enable DIN, DOUT, CLK */
++#define SPI_CS_MASK 0x78
++
++#define FLASH_BLOCKSIZE (1024*64)
++#define FLASH_NUMBLOCKS 64
++#define FLASH_TYPE "m25p32"
++/* Reserve 1M for the kernel parition */
++#define FLASH_KERNEL_SIZE (1024 * 1024)
++
++#define M25P80_CS 5
++#define MMC_CS 6
++
++#ifdef CONFIG_MTD_PARTITIONS
++static struct mtd_partition stm25p_partitions[] = {
++ /* sflash */
++ [0] = {
++ .name = "kernel",
++ .offset = FLASH_BLOCKSIZE * FLASH_NUMBLOCKS - FLASH_KERNEL_SIZE,
++ .size = FLASH_KERNEL_SIZE,
++ .mask_flags = 0
++ },
++ [1] = {
++ .name = "image",
++ .offset = 0x00000000,
++ .size = FLASH_BLOCKSIZE * FLASH_NUMBLOCKS - FLASH_KERNEL_SIZE,
++ .mask_flags = 0
++ },
++ [2] = {
++ .name = "all",
++ .offset = 0x00000000,
++ .size = FLASH_BLOCKSIZE * FLASH_NUMBLOCKS,
++ .mask_flags = 0
++ }
++};
++#endif
++
++#else
++#define SPI_NUM_CHIPSELECTS 0x04
++#define SPI_PAR_VAL 0x7F /* Enable DIN, DOUT, CLK, CS0 - CS4 */
++#endif
++
++#ifdef MMC_CS
++static struct coldfire_spi_chip flash_chip_info = {
++ .mode = SPI_MODE_0,
++ .bits_per_word = 16,
++ .del_cs_to_clk = 17,
++ .del_after_trans = 1,
++ .void_write_data = 0
++};
++
++static struct coldfire_spi_chip mmc_chip_info = {
++ .mode = SPI_MODE_0,
++ .bits_per_word = 16,
++ .del_cs_to_clk = 17,
++ .del_after_trans = 1,
++ .void_write_data = 0xFFFF
++};
++#endif
++
++#ifdef M25P80_CS
++static struct flash_platform_data stm25p80_platform_data = {
++ .name = "ST M25P80 SPI Flash chip",
++#ifdef CONFIG_MTD_PARTITIONS
++ .parts = stm25p_partitions,
++ .nr_parts = sizeof(stm25p_partitions) / sizeof(*stm25p_partitions),
++#endif
++ .type = FLASH_TYPE
++};
++#endif
++
++static struct spi_board_info spi_board_info[] __initdata = {
++#ifdef M25P80_CS
++ {
++ .modalias = "m25p80",
++ .max_speed_hz = 16000000,
++ .bus_num = 1,
++ .chip_select = M25P80_CS,
++ .platform_data = &stm25p80_platform_data,
++ .controller_data = &flash_chip_info
++ },
++#endif
++#ifdef MMC_CS
++ {
++ .modalias = "mmc_spi",
++ .max_speed_hz = 16000000,
++ .bus_num = 1,
++ .chip_select = MMC_CS,
++ .controller_data = &mmc_chip_info
++ }
++#endif
++};
++
++static struct coldfire_spi_master coldfire_master_info = {
++ .bus_num = 1,
++ .num_chipselect = SPI_NUM_CHIPSELECTS,
++ .irq_source = MCF5282_QSPI_IRQ_SOURCE,
++ .irq_vector = MCF5282_QSPI_IRQ_VECTOR,
++ .irq_mask = ((0x01 << MCF5282_QSPI_IRQ_SOURCE) | 0x01),
++ .irq_lp = 0x2B, /* Level 5 and Priority 3 */
++ .par_val = SPI_PAR_VAL,
++ .cs_control = coldfire_qspi_cs_control,
++};
++
++static struct resource coldfire_spi_resources[] = {
++ [0] = {
++ .name = "qspi-par",
++ .start = MCF5282_QSPI_PAR,
++ .end = MCF5282_QSPI_PAR,
++ .flags = IORESOURCE_MEM
++ },
++
++ [1] = {
++ .name = "qspi-module",
++ .start = MCF5282_QSPI_QMR,
++ .end = MCF5282_QSPI_QMR + 0x18,
++ .flags = IORESOURCE_MEM
++ },
++
++ [2] = {
++ .name = "qspi-int-level",
++ .start = MCF5282_INTC0 + MCFINTC_ICR0 + MCF5282_QSPI_IRQ_SOURCE,
++ .end = MCF5282_INTC0 + MCFINTC_ICR0 + MCF5282_QSPI_IRQ_SOURCE,
++ .flags = IORESOURCE_MEM
++ },
++
++ [3] = {
++ .name = "qspi-int-mask",
++ .start = MCF5282_INTC0 + MCFINTC_IMRL,
++ .end = MCF5282_INTC0 + MCFINTC_IMRL,
++ .flags = IORESOURCE_MEM
++ }
++};
++
++static struct platform_device coldfire_spi = {
++ .name = "spi_coldfire",
++ .id = -1,
++ .resource = coldfire_spi_resources,
++ .num_resources = ARRAY_SIZE(coldfire_spi_resources),
++ .dev = {
++ .platform_data = &coldfire_master_info,
++ }
++};
++
++static void coldfire_qspi_cs_control(u8 cs, u8 command)
++{
++ u8 cs_bit = ((0x01 << cs) << 3) & SPI_CS_MASK;
++
++#if defined(CONFIG_WILDFIRE)
++ u8 cs_mask = ~(((0x01 << cs) << 3) & SPI_CS_MASK);
++#endif
++#if defined(CONFIG_WILDFIREMOD)
++ u8 cs_mask = (cs << 3) & SPI_CS_MASK;
++#endif
++
++ /*
++ * Don't do anything if the chip select is not
++ * one of the port qs pins.
++ */
++ if (command & QSPI_CS_INIT) {
++#if defined(CONFIG_WILDFIRE)
++ MCF5282_GPIO_DDRQS |= cs_bit;
++ MCF5282_GPIO_PQSPAR &= ~cs_bit;
++#endif
++
++#if defined(CONFIG_WILDFIREMOD)
++ MCF5282_GPIO_DDRQS |= SPI_CS_MASK;
++ MCF5282_GPIO_PQSPAR &= ~SPI_CS_MASK;
++#endif
++ }
++
++ if (command & QSPI_CS_ASSERT) {
++ MCF5282_GPIO_PORTQS &= ~SPI_CS_MASK;
++ MCF5282_GPIO_PORTQS |= cs_mask;
++ } else if (command & QSPI_CS_DROP) {
++ MCF5282_GPIO_PORTQS |= SPI_CS_MASK;
++ }
++}
++
++static int __init spi_dev_init(void)
++{
++ int retval;
++
++ retval = platform_device_register(&coldfire_spi);
++ if (retval < 0)
++ return retval;
++
++ if (ARRAY_SIZE(spi_board_info))
++ retval = spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
++
++ return retval;
++}
++
++#endif /* CONFIG_SPI */
+
+ /***************************************************************************/
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/alchemy/common/time.c linux-2.6.29-rc3.owrt/arch/mips/alchemy/common/time.c
+--- linux-2.6.29.owrt/arch/mips/alchemy/common/time.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/alchemy/common/time.c 2009-05-10 23:48:28.000000000 +0200
+@@ -89,7 +89,7 @@
+ .irq = AU1000_RTC_MATCH2_INT,
+ .set_next_event = au1x_rtcmatch2_set_next_event,
+ .set_mode = au1x_rtcmatch2_set_mode,
+- .cpumask = CPU_MASK_ALL_PTR,
++ .cpumask = CPU_MASK_ALL,
+ };
+
+ static struct irqaction au1x_rtcmatch2_irqaction = {
+@@ -118,7 +118,7 @@
+ * setup counter 1 (RTC) to tick at full speed
+ */
+ t = 0xffffff;
+- while ((au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_T1S) && --t)
++ while ((au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_T1S) && t--)
+ asm volatile ("nop");
+ if (!t)
+ goto cntr_err;
+@@ -127,7 +127,7 @@
+ au_sync();
+
+ t = 0xffffff;
+- while ((au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C1S) && --t)
++ while ((au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C1S) && t--)
+ asm volatile ("nop");
+ if (!t)
+ goto cntr_err;
+@@ -135,7 +135,7 @@
+ au_sync();
+
+ t = 0xffffff;
+- while ((au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C1S) && --t)
++ while ((au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C1S) && t--)
+ asm volatile ("nop");
+ if (!t)
+ goto cntr_err;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/cavium-octeon/setup.c linux-2.6.29-rc3.owrt/arch/mips/cavium-octeon/setup.c
+--- linux-2.6.29.owrt/arch/mips/cavium-octeon/setup.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/cavium-octeon/setup.c 2009-05-10 23:48:28.000000000 +0200
+@@ -15,11 +15,13 @@
+ #include <linux/serial.h>
+ #include <linux/types.h>
+ #include <linux/string.h> /* for memset */
++#include <linux/serial.h>
+ #include <linux/tty.h>
+ #include <linux/time.h>
+ #include <linux/platform_device.h>
+ #include <linux/serial_core.h>
+ #include <linux/serial_8250.h>
++#include <linux/string.h>
+
+ #include <asm/processor.h>
+ #include <asm/reboot.h>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/configs/emma2rh_defconfig linux-2.6.29-rc3.owrt/arch/mips/configs/emma2rh_defconfig
+--- linux-2.6.29.owrt/arch/mips/configs/emma2rh_defconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/arch/mips/configs/emma2rh_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,1439 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.20
++# Tue Feb 20 21:47:29 2007
++#
++CONFIG_MIPS=y
++
++#
++# Machine selection
++#
++CONFIG_ZONE_DMA=y
++# CONFIG_MIPS_MTX1 is not set
++# CONFIG_MIPS_BOSPORUS is not set
++# CONFIG_MIPS_PB1000 is not set
++# CONFIG_MIPS_PB1100 is not set
++# CONFIG_MIPS_PB1500 is not set
++# CONFIG_MIPS_PB1550 is not set
++# CONFIG_MIPS_PB1200 is not set
++# CONFIG_MIPS_DB1000 is not set
++# CONFIG_MIPS_DB1100 is not set
++# CONFIG_MIPS_DB1500 is not set
++# CONFIG_MIPS_DB1550 is not set
++# CONFIG_MIPS_DB1200 is not set
++# CONFIG_MIPS_MIRAGE is not set
++# CONFIG_BASLER_EXCITE is not set
++# CONFIG_MIPS_COBALT is not set
++# CONFIG_MACH_DECSTATION is not set
++# CONFIG_MACH_JAZZ is not set
++# CONFIG_MIPS_MALTA is not set
++# CONFIG_WR_PPMC is not set
++# CONFIG_MIPS_SIM is not set
++# CONFIG_MOMENCO_JAGUAR_ATX is not set
++# CONFIG_MIPS_XXS1500 is not set
++# CONFIG_PNX8550_JBS is not set
++# CONFIG_PNX8550_STB810 is not set
++# CONFIG_MACH_VR41XX is not set
++# CONFIG_PMC_YOSEMITE is not set
++CONFIG_MARKEINS=y
++# CONFIG_SGI_IP22 is not set
++# CONFIG_SGI_IP27 is not set
++# CONFIG_SGI_IP32 is not set
++# CONFIG_SIBYTE_BIGSUR is not set
++# CONFIG_SIBYTE_SWARM is not set
++# CONFIG_SIBYTE_SENTOSA is not set
++# CONFIG_SIBYTE_RHONE is not set
++# CONFIG_SIBYTE_CARMEL is not set
++# CONFIG_SIBYTE_LITTLESUR is not set
++# CONFIG_SIBYTE_CRHINE is not set
++# CONFIG_SIBYTE_CRHONE is not set
++# CONFIG_SNI_RM is not set
++# CONFIG_TOSHIBA_JMR3927 is not set
++# CONFIG_TOSHIBA_RBTX4927 is not set
++# CONFIG_TOSHIBA_RBTX4938 is not set
++CONFIG_RWSEM_GENERIC_SPINLOCK=y
++# CONFIG_ARCH_HAS_ILOG2_U32 is not set
++# CONFIG_ARCH_HAS_ILOG2_U64 is not set
++CONFIG_GENERIC_FIND_NEXT_BIT=y
++CONFIG_GENERIC_HWEIGHT=y
++CONFIG_GENERIC_CALIBRATE_DELAY=y
++CONFIG_GENERIC_TIME=y
++CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
++# CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ is not set
++CONFIG_DMA_NONCOHERENT=y
++CONFIG_DMA_NEED_PCI_MAP_STATE=y
++CONFIG_CPU_BIG_ENDIAN=y
++# CONFIG_CPU_LITTLE_ENDIAN is not set
++CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y
++CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y
++CONFIG_IRQ_CPU=y
++CONFIG_SWAP_IO_SPACE=y
++CONFIG_EMMA2RH=y
++CONFIG_MIPS_L1_CACHE_SHIFT=5
++
++#
++# CPU selection
++#
++# CONFIG_CPU_MIPS32_R1 is not set
++# CONFIG_CPU_MIPS32_R2 is not set
++# CONFIG_CPU_MIPS64_R1 is not set
++# CONFIG_CPU_MIPS64_R2 is not set
++# CONFIG_CPU_R3000 is not set
++# CONFIG_CPU_TX39XX is not set
++# CONFIG_CPU_VR41XX is not set
++# CONFIG_CPU_R4300 is not set
++# CONFIG_CPU_R4X00 is not set
++# CONFIG_CPU_TX49XX is not set
++CONFIG_CPU_R5000=y
++# CONFIG_CPU_R5432 is not set
++# CONFIG_CPU_R6000 is not set
++# CONFIG_CPU_NEVADA is not set
++# CONFIG_CPU_R8000 is not set
++# CONFIG_CPU_R10000 is not set
++# CONFIG_CPU_RM7000 is not set
++# CONFIG_CPU_RM9000 is not set
++# CONFIG_CPU_SB1 is not set
++CONFIG_SYS_HAS_CPU_R5000=y
++CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
++CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
++CONFIG_CPU_SUPPORTS_64BIT_KERNEL=y
++
++#
++# Kernel type
++#
++CONFIG_32BIT=y
++# CONFIG_64BIT is not set
++CONFIG_PAGE_SIZE_4KB=y
++# CONFIG_PAGE_SIZE_8KB is not set
++# CONFIG_PAGE_SIZE_16KB is not set
++# CONFIG_PAGE_SIZE_64KB is not set
++CONFIG_MIPS_MT_DISABLED=y
++# CONFIG_MIPS_MT_SMP is not set
++# CONFIG_MIPS_MT_SMTC is not set
++# CONFIG_MIPS_VPE_LOADER is not set
++# CONFIG_64BIT_PHYS_ADDR is not set
++CONFIG_CPU_HAS_LLSC=y
++CONFIG_CPU_HAS_SYNC=y
++CONFIG_GENERIC_HARDIRQS=y
++CONFIG_GENERIC_IRQ_PROBE=y
++CONFIG_ARCH_FLATMEM_ENABLE=y
++CONFIG_SELECT_MEMORY_MODEL=y
++CONFIG_FLATMEM_MANUAL=y
++# CONFIG_DISCONTIGMEM_MANUAL is not set
++# CONFIG_SPARSEMEM_MANUAL is not set
++CONFIG_FLATMEM=y
++CONFIG_FLAT_NODE_MEM_MAP=y
++# CONFIG_SPARSEMEM_STATIC is not set
++CONFIG_SPLIT_PTLOCK_CPUS=4
++# CONFIG_RESOURCES_64BIT is not set
++CONFIG_ZONE_DMA_FLAG=1
++# CONFIG_HZ_48 is not set
++# CONFIG_HZ_100 is not set
++# CONFIG_HZ_128 is not set
++# CONFIG_HZ_250 is not set
++# CONFIG_HZ_256 is not set
++CONFIG_HZ_1000=y
++# CONFIG_HZ_1024 is not set
++CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
++CONFIG_HZ=1000
++# CONFIG_PREEMPT_NONE is not set
++# CONFIG_PREEMPT_VOLUNTARY is not set
++CONFIG_PREEMPT=y
++CONFIG_PREEMPT_BKL=y
++# CONFIG_KEXEC is not set
++CONFIG_LOCKDEP_SUPPORT=y
++CONFIG_STACKTRACE_SUPPORT=y
++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
++
++#
++# Code maturity level options
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_LOCK_KERNEL=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++
++#
++# General setup
++#
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++CONFIG_SWAP=y
++CONFIG_SYSVIPC=y
++# CONFIG_IPC_NS is not set
++CONFIG_SYSVIPC_SYSCTL=y
++CONFIG_POSIX_MQUEUE=y
++CONFIG_BSD_PROCESS_ACCT=y
++# CONFIG_BSD_PROCESS_ACCT_V3 is not set
++# CONFIG_TASKSTATS is not set
++# CONFIG_UTS_NS is not set
++# CONFIG_AUDIT is not set
++CONFIG_IKCONFIG=y
++CONFIG_IKCONFIG_PROC=y
++CONFIG_SYSFS_DEPRECATED=y
++# CONFIG_RELAY is not set
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++CONFIG_SYSCTL=y
++CONFIG_EMBEDDED=y
++CONFIG_SYSCTL_SYSCALL=y
++CONFIG_KALLSYMS=y
++# CONFIG_KALLSYMS_EXTRA_PASS is not set
++CONFIG_HOTPLUG=y
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++CONFIG_ELF_CORE=y
++CONFIG_BASE_FULL=y
++CONFIG_FUTEX=y
++CONFIG_EPOLL=y
++CONFIG_SHMEM=y
++CONFIG_SLAB=y
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
++# CONFIG_SLOB is not set
++
++#
++# Loadable module support
++#
++CONFIG_MODULES=y
++CONFIG_MODULE_UNLOAD=y
++CONFIG_MODULE_FORCE_UNLOAD=y
++CONFIG_MODVERSIONS=y
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++CONFIG_KMOD=y
++
++#
++# Block layer
++#
++CONFIG_BLOCK=y
++CONFIG_LBD=y
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_AS=y
++CONFIG_IOSCHED_DEADLINE=y
++CONFIG_IOSCHED_CFQ=y
++CONFIG_DEFAULT_AS=y
++# CONFIG_DEFAULT_DEADLINE is not set
++# CONFIG_DEFAULT_CFQ is not set
++# CONFIG_DEFAULT_NOOP is not set
++CONFIG_DEFAULT_IOSCHED="anticipatory"
++
++#
++# Bus options (PCI, PCMCIA, EISA, ISA, TC)
++#
++CONFIG_HW_HAS_PCI=y
++CONFIG_PCI=y
++CONFIG_MMU=y
++
++#
++# PCCARD (PCMCIA/CardBus) support
++#
++# CONFIG_PCCARD is not set
++
++#
++# PCI Hotplug Support
++#
++# CONFIG_HOTPLUG_PCI is not set
++
++#
++# Executable file formats
++#
++CONFIG_BINFMT_ELF=y
++# CONFIG_BINFMT_MISC is not set
++CONFIG_TRAD_SIGNALS=y
++
++#
++# Power management options
++#
++CONFIG_PM=y
++# CONFIG_PM_LEGACY is not set
++# CONFIG_PM_DEBUG is not set
++# CONFIG_PM_SYSFS_DEPRECATED is not set
++
++#
++# Networking
++#
++CONFIG_NET=y
++
++#
++# Networking options
++#
++# CONFIG_NETDEBUG is not set
++CONFIG_PACKET=y
++CONFIG_PACKET_MMAP=y
++CONFIG_UNIX=y
++CONFIG_XFRM=y
++# CONFIG_XFRM_USER is not set
++# CONFIG_XFRM_SUB_POLICY is not set
++CONFIG_XFRM_MIGRATE=y
++CONFIG_NET_KEY=y
++CONFIG_NET_KEY_MIGRATE=y
++CONFIG_INET=y
++CONFIG_IP_MULTICAST=y
++CONFIG_IP_ADVANCED_ROUTER=y
++CONFIG_ASK_IP_FIB_HASH=y
++# CONFIG_IP_FIB_TRIE is not set
++CONFIG_IP_FIB_HASH=y
++CONFIG_IP_MULTIPLE_TABLES=y
++CONFIG_IP_ROUTE_MULTIPATH=y
++# CONFIG_IP_ROUTE_MULTIPATH_CACHED is not set
++CONFIG_IP_ROUTE_VERBOSE=y
++CONFIG_IP_PNP=y
++# CONFIG_IP_PNP_DHCP is not set
++CONFIG_IP_PNP_BOOTP=y
++# CONFIG_IP_PNP_RARP is not set
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE is not set
++# CONFIG_IP_MROUTE is not set
++# CONFIG_ARPD is not set
++CONFIG_SYN_COOKIES=y
++# CONFIG_INET_AH is not set
++# CONFIG_INET_ESP is not set
++# CONFIG_INET_IPCOMP is not set
++# CONFIG_INET_XFRM_TUNNEL is not set
++CONFIG_INET_TUNNEL=m
++CONFIG_INET_XFRM_MODE_TRANSPORT=m
++CONFIG_INET_XFRM_MODE_TUNNEL=m
++CONFIG_INET_XFRM_MODE_BEET=m
++CONFIG_INET_DIAG=y
++CONFIG_INET_TCP_DIAG=y
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_CUBIC=y
++CONFIG_DEFAULT_TCP_CONG="cubic"
++CONFIG_TCP_MD5SIG=y
++
++#
++# IP: Virtual Server Configuration
++#
++# CONFIG_IP_VS is not set
++CONFIG_IPV6=m
++# CONFIG_IPV6_PRIVACY is not set
++# CONFIG_IPV6_ROUTER_PREF is not set
++# CONFIG_INET6_AH is not set
++# CONFIG_INET6_ESP is not set
++# CONFIG_INET6_IPCOMP is not set
++CONFIG_IPV6_MIP6=y
++# CONFIG_INET6_XFRM_TUNNEL is not set
++# CONFIG_INET6_TUNNEL is not set
++CONFIG_INET6_XFRM_MODE_TRANSPORT=m
++CONFIG_INET6_XFRM_MODE_TUNNEL=m
++CONFIG_INET6_XFRM_MODE_BEET=m
++CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m
++CONFIG_IPV6_SIT=m
++# CONFIG_IPV6_TUNNEL is not set
++CONFIG_IPV6_MULTIPLE_TABLES=y
++CONFIG_IPV6_SUBTREES=y
++CONFIG_NETWORK_SECMARK=y
++CONFIG_NETFILTER=y
++# CONFIG_NETFILTER_DEBUG is not set
++
++#
++# Core Netfilter Configuration
++#
++# CONFIG_NETFILTER_NETLINK is not set
++CONFIG_NF_CONNTRACK_ENABLED=m
++CONFIG_NF_CONNTRACK_SUPPORT=y
++# CONFIG_IP_NF_CONNTRACK_SUPPORT is not set
++CONFIG_NF_CONNTRACK=m
++CONFIG_NF_CT_ACCT=y
++CONFIG_NF_CONNTRACK_MARK=y
++CONFIG_NF_CONNTRACK_SECMARK=y
++CONFIG_NF_CONNTRACK_EVENTS=y
++CONFIG_NF_CT_PROTO_GRE=m
++CONFIG_NF_CT_PROTO_SCTP=m
++CONFIG_NF_CONNTRACK_AMANDA=m
++CONFIG_NF_CONNTRACK_FTP=m
++CONFIG_NF_CONNTRACK_H323=m
++CONFIG_NF_CONNTRACK_IRC=m
++# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set
++CONFIG_NF_CONNTRACK_PPTP=m
++CONFIG_NF_CONNTRACK_SANE=m
++CONFIG_NF_CONNTRACK_SIP=m
++CONFIG_NF_CONNTRACK_TFTP=m
++CONFIG_NETFILTER_XTABLES=m
++CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
++CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
++CONFIG_NETFILTER_XT_TARGET_DSCP=m
++CONFIG_NETFILTER_XT_TARGET_MARK=m
++CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
++CONFIG_NETFILTER_XT_TARGET_NFLOG=m
++CONFIG_NETFILTER_XT_TARGET_NOTRACK=m
++CONFIG_NETFILTER_XT_TARGET_SECMARK=m
++CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m
++CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
++CONFIG_NETFILTER_XT_MATCH_COMMENT=m
++CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
++CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
++CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
++CONFIG_NETFILTER_XT_MATCH_DCCP=m
++CONFIG_NETFILTER_XT_MATCH_DSCP=m
++CONFIG_NETFILTER_XT_MATCH_ESP=m
++CONFIG_NETFILTER_XT_MATCH_HELPER=m
++CONFIG_NETFILTER_XT_MATCH_LENGTH=m
++CONFIG_NETFILTER_XT_MATCH_LIMIT=m
++CONFIG_NETFILTER_XT_MATCH_MAC=m
++CONFIG_NETFILTER_XT_MATCH_MARK=m
++CONFIG_NETFILTER_XT_MATCH_POLICY=m
++CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
++CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
++CONFIG_NETFILTER_XT_MATCH_QUOTA=m
++CONFIG_NETFILTER_XT_MATCH_REALM=m
++CONFIG_NETFILTER_XT_MATCH_SCTP=m
++CONFIG_NETFILTER_XT_MATCH_STATE=m
++CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
++CONFIG_NETFILTER_XT_MATCH_STRING=m
++CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
++CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
++
++#
++# IP: Netfilter Configuration
++#
++CONFIG_NF_CONNTRACK_IPV4=m
++CONFIG_NF_CONNTRACK_PROC_COMPAT=y
++# CONFIG_IP_NF_QUEUE is not set
++CONFIG_IP_NF_IPTABLES=m
++CONFIG_IP_NF_MATCH_IPRANGE=m
++CONFIG_IP_NF_MATCH_TOS=m
++CONFIG_IP_NF_MATCH_RECENT=m
++CONFIG_IP_NF_MATCH_ECN=m
++CONFIG_IP_NF_MATCH_AH=m
++CONFIG_IP_NF_MATCH_TTL=m
++CONFIG_IP_NF_MATCH_OWNER=m
++CONFIG_IP_NF_MATCH_ADDRTYPE=m
++CONFIG_IP_NF_FILTER=m
++CONFIG_IP_NF_TARGET_REJECT=m
++CONFIG_IP_NF_TARGET_LOG=m
++CONFIG_IP_NF_TARGET_ULOG=m
++CONFIG_NF_NAT=m
++CONFIG_NF_NAT_NEEDED=y
++CONFIG_IP_NF_TARGET_MASQUERADE=m
++CONFIG_IP_NF_TARGET_REDIRECT=m
++CONFIG_IP_NF_TARGET_NETMAP=m
++CONFIG_IP_NF_TARGET_SAME=m
++CONFIG_NF_NAT_SNMP_BASIC=m
++CONFIG_NF_NAT_PROTO_GRE=m
++CONFIG_NF_NAT_FTP=m
++CONFIG_NF_NAT_IRC=m
++CONFIG_NF_NAT_TFTP=m
++CONFIG_NF_NAT_AMANDA=m
++CONFIG_NF_NAT_PPTP=m
++CONFIG_NF_NAT_H323=m
++CONFIG_NF_NAT_SIP=m
++CONFIG_IP_NF_MANGLE=m
++CONFIG_IP_NF_TARGET_TOS=m
++CONFIG_IP_NF_TARGET_ECN=m
++CONFIG_IP_NF_TARGET_TTL=m
++CONFIG_IP_NF_TARGET_CLUSTERIP=m
++CONFIG_IP_NF_RAW=m
++CONFIG_IP_NF_ARPTABLES=m
++CONFIG_IP_NF_ARPFILTER=m
++CONFIG_IP_NF_ARP_MANGLE=m
++
++#
++# IPv6: Netfilter Configuration (EXPERIMENTAL)
++#
++CONFIG_NF_CONNTRACK_IPV6=m
++# CONFIG_IP6_NF_QUEUE is not set
++CONFIG_IP6_NF_IPTABLES=m
++CONFIG_IP6_NF_MATCH_RT=m
++CONFIG_IP6_NF_MATCH_OPTS=m
++CONFIG_IP6_NF_MATCH_FRAG=m
++CONFIG_IP6_NF_MATCH_HL=m
++CONFIG_IP6_NF_MATCH_OWNER=m
++CONFIG_IP6_NF_MATCH_IPV6HEADER=m
++CONFIG_IP6_NF_MATCH_AH=m
++CONFIG_IP6_NF_MATCH_MH=m
++CONFIG_IP6_NF_MATCH_EUI64=m
++CONFIG_IP6_NF_FILTER=m
++CONFIG_IP6_NF_TARGET_LOG=m
++CONFIG_IP6_NF_TARGET_REJECT=m
++CONFIG_IP6_NF_MANGLE=m
++CONFIG_IP6_NF_TARGET_HL=m
++CONFIG_IP6_NF_RAW=m
++
++#
++# DCCP Configuration (EXPERIMENTAL)
++#
++# CONFIG_IP_DCCP is not set
++
++#
++# SCTP Configuration (EXPERIMENTAL)
++#
++CONFIG_IP_SCTP=m
++# CONFIG_SCTP_DBG_MSG is not set
++# CONFIG_SCTP_DBG_OBJCNT is not set
++# CONFIG_SCTP_HMAC_NONE is not set
++# CONFIG_SCTP_HMAC_SHA1 is not set
++CONFIG_SCTP_HMAC_MD5=y
++
++#
++# TIPC Configuration (EXPERIMENTAL)
++#
++# CONFIG_TIPC is not set
++# CONFIG_ATM is not set
++# CONFIG_BRIDGE is not set
++# CONFIG_VLAN_8021Q is not set
++# CONFIG_DECNET is not set
++# CONFIG_LLC2 is not set
++# CONFIG_IPX is not set
++# CONFIG_ATALK is not set
++# CONFIG_X25 is not set
++# CONFIG_LAPB is not set
++# CONFIG_ECONET is not set
++# CONFIG_WAN_ROUTER is not set
++
++#
++# QoS and/or fair queueing
++#
++# CONFIG_NET_SCHED is not set
++CONFIG_NET_CLS_ROUTE=y
++
++#
++# Network testing
++#
++# CONFIG_NET_PKTGEN is not set
++# CONFIG_HAMRADIO is not set
++# CONFIG_IRDA is not set
++# CONFIG_BT is not set
++# CONFIG_IEEE80211 is not set
++CONFIG_FIB_RULES=y
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++CONFIG_STANDALONE=y
++CONFIG_PREVENT_FIRMWARE_BUILD=y
++CONFIG_FW_LOADER=m
++# CONFIG_SYS_HYPERVISOR is not set
++
++#
++# Connector - unified userspace <-> kernelspace linker
++#
++# CONFIG_CONNECTOR is not set
++
++#
++# Memory Technology Devices (MTD)
++#
++CONFIG_MTD=y
++# CONFIG_MTD_DEBUG is not set
++# CONFIG_MTD_CONCAT is not set
++CONFIG_MTD_PARTITIONS=y
++# CONFIG_MTD_REDBOOT_PARTS is not set
++CONFIG_MTD_CMDLINE_PARTS=y
++
++#
++# User Modules And Translation Layers
++#
++CONFIG_MTD_CHAR=y
++CONFIG_MTD_BLKDEVS=y
++CONFIG_MTD_BLOCK=y
++# CONFIG_FTL is not set
++# CONFIG_NFTL is not set
++# CONFIG_INFTL is not set
++# CONFIG_RFD_FTL is not set
++# CONFIG_SSFDC is not set
++
++#
++# RAM/ROM/Flash chip drivers
++#
++CONFIG_MTD_CFI=y
++# CONFIG_MTD_JEDECPROBE is not set
++CONFIG_MTD_GEN_PROBE=y
++# CONFIG_MTD_CFI_ADV_OPTIONS is not set
++CONFIG_MTD_MAP_BANK_WIDTH_1=y
++CONFIG_MTD_MAP_BANK_WIDTH_2=y
++CONFIG_MTD_MAP_BANK_WIDTH_4=y
++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
++CONFIG_MTD_CFI_I1=y
++CONFIG_MTD_CFI_I2=y
++# CONFIG_MTD_CFI_I4 is not set
++# CONFIG_MTD_CFI_I8 is not set
++# CONFIG_MTD_CFI_INTELEXT is not set
++CONFIG_MTD_CFI_AMDSTD=y
++# CONFIG_MTD_CFI_STAA is not set
++CONFIG_MTD_CFI_UTIL=y
++# CONFIG_MTD_RAM is not set
++# CONFIG_MTD_ROM is not set
++# CONFIG_MTD_ABSENT is not set
++# CONFIG_MTD_OBSOLETE_CHIPS is not set
++
++#
++# Mapping drivers for chip access
++#
++# CONFIG_MTD_COMPLEX_MAPPINGS is not set
++CONFIG_MTD_PHYSMAP=y
++CONFIG_MTD_PHYSMAP_START=0x1e000000
++CONFIG_MTD_PHYSMAP_LEN=0x02000000
++CONFIG_MTD_PHYSMAP_BANKWIDTH=2
++# CONFIG_MTD_PLATRAM is not set
++
++#
++# Self-contained MTD device drivers
++#
++# CONFIG_MTD_PMC551 is not set
++# CONFIG_MTD_SLRAM is not set
++# CONFIG_MTD_PHRAM is not set
++# CONFIG_MTD_MTDRAM is not set
++# CONFIG_MTD_BLOCK2MTD is not set
++
++#
++# Disk-On-Chip Device Drivers
++#
++# CONFIG_MTD_DOC2000 is not set
++# CONFIG_MTD_DOC2001 is not set
++# CONFIG_MTD_DOC2001PLUS is not set
++
++#
++# NAND Flash Device Drivers
++#
++# CONFIG_MTD_NAND is not set
++
++#
++# OneNAND Flash Device Drivers
++#
++# CONFIG_MTD_ONENAND is not set
++
++#
++# Parallel port support
++#
++# CONFIG_PARPORT is not set
++
++#
++# Plug and Play support
++#
++# CONFIG_PNPACPI is not set
++
++#
++# Block devices
++#
++# CONFIG_BLK_CPQ_DA is not set
++# CONFIG_BLK_CPQ_CISS_DA is not set
++# CONFIG_BLK_DEV_DAC960 is not set
++# CONFIG_BLK_DEV_UMEM is not set
++# CONFIG_BLK_DEV_COW_COMMON is not set
++CONFIG_BLK_DEV_LOOP=m
++CONFIG_BLK_DEV_CRYPTOLOOP=m
++# CONFIG_BLK_DEV_NBD is not set
++# CONFIG_BLK_DEV_SX8 is not set
++# CONFIG_BLK_DEV_RAM is not set
++# CONFIG_BLK_DEV_INITRD is not set
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++
++#
++# Misc devices
++#
++CONFIG_SGI_IOC4=m
++# CONFIG_TIFM_CORE is not set
++
++#
++# ATA/ATAPI/MFM/RLL support
++#
++# CONFIG_IDE is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++CONFIG_SCSI=m
++CONFIG_SCSI_TGT=m
++# CONFIG_SCSI_NETLINK is not set
++# CONFIG_SCSI_PROC_FS is not set
++
++#
++# SCSI support type (disk, tape, CD-ROM)
++#
++CONFIG_BLK_DEV_SD=m
++# CONFIG_CHR_DEV_ST is not set
++# CONFIG_CHR_DEV_OSST is not set
++# CONFIG_BLK_DEV_SR is not set
++CONFIG_CHR_DEV_SG=m
++# CONFIG_CHR_DEV_SCH is not set
++
++#
++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
++#
++# CONFIG_SCSI_MULTI_LUN is not set
++# CONFIG_SCSI_CONSTANTS is not set
++# CONFIG_SCSI_LOGGING is not set
++CONFIG_SCSI_SCAN_ASYNC=y
++
++#
++# SCSI Transports
++#
++# CONFIG_SCSI_SPI_ATTRS is not set
++# CONFIG_SCSI_FC_ATTRS is not set
++# CONFIG_SCSI_ISCSI_ATTRS is not set
++CONFIG_SCSI_SAS_ATTRS=m
++CONFIG_SCSI_SAS_LIBSAS=m
++# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set
++
++#
++# SCSI low-level drivers
++#
++# CONFIG_ISCSI_TCP is not set
++# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
++# CONFIG_SCSI_3W_9XXX is not set
++# CONFIG_SCSI_ACARD is not set
++# CONFIG_SCSI_AACRAID is not set
++# CONFIG_SCSI_AIC7XXX is not set
++# CONFIG_SCSI_AIC7XXX_OLD is not set
++# CONFIG_SCSI_AIC79XX is not set
++CONFIG_SCSI_AIC94XX=m
++# CONFIG_AIC94XX_DEBUG is not set
++# CONFIG_SCSI_DPT_I2O is not set
++# CONFIG_SCSI_ARCMSR is not set
++# CONFIG_MEGARAID_NEWGEN is not set
++# CONFIG_MEGARAID_LEGACY is not set
++# CONFIG_MEGARAID_SAS is not set
++# CONFIG_SCSI_HPTIOP is not set
++# CONFIG_SCSI_DMX3191D is not set
++# CONFIG_SCSI_FUTURE_DOMAIN is not set
++# CONFIG_SCSI_IPS is not set
++# CONFIG_SCSI_INITIO is not set
++# CONFIG_SCSI_INIA100 is not set
++# CONFIG_SCSI_STEX is not set
++# CONFIG_SCSI_SYM53C8XX_2 is not set
++# CONFIG_SCSI_QLOGIC_1280 is not set
++# CONFIG_SCSI_QLA_FC is not set
++# CONFIG_SCSI_QLA_ISCSI is not set
++# CONFIG_SCSI_LPFC is not set
++# CONFIG_SCSI_DC395x is not set
++# CONFIG_SCSI_DC390T is not set
++# CONFIG_SCSI_NSP32 is not set
++# CONFIG_SCSI_DEBUG is not set
++# CONFIG_SCSI_SRP is not set
++
++#
++# Serial ATA (prod) and Parallel ATA (experimental) drivers
++#
++# CONFIG_ATA is not set
++
++#
++# Multi-device support (RAID and LVM)
++#
++# CONFIG_MD is not set
++
++#
++# Fusion MPT device support
++#
++# CONFIG_FUSION is not set
++# CONFIG_FUSION_SPI is not set
++# CONFIG_FUSION_FC is not set
++# CONFIG_FUSION_SAS is not set
++
++#
++# IEEE 1394 (FireWire) support
++#
++# CONFIG_IEEE1394 is not set
++
++#
++# I2O device support
++#
++# CONFIG_I2O is not set
++
++#
++# Network device support
++#
++CONFIG_NETDEVICES=y
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_EQUALIZER is not set
++CONFIG_TUN=m
++
++#
++# ARCnet devices
++#
++# CONFIG_ARCNET is not set
++
++#
++# PHY device support
++#
++# CONFIG_PHYLIB is not set
++
++#
++# Ethernet (10 or 100Mbit)
++#
++CONFIG_NET_ETHERNET=y
++CONFIG_MII=y
++# CONFIG_HAPPYMEAL is not set
++# CONFIG_SUNGEM is not set
++# CONFIG_CASSINI is not set
++# CONFIG_NET_VENDOR_3COM is not set
++# CONFIG_DM9000 is not set
++
++#
++# Tulip family network device support
++#
++# CONFIG_NET_TULIP is not set
++# CONFIG_HP100 is not set
++CONFIG_NET_PCI=y
++# CONFIG_PCNET32 is not set
++# CONFIG_AMD8111_ETH is not set
++# CONFIG_ADAPTEC_STARFIRE is not set
++# CONFIG_B44 is not set
++# CONFIG_FORCEDETH is not set
++# CONFIG_DGRS is not set
++# CONFIG_EEPRO100 is not set
++# CONFIG_E100 is not set
++# CONFIG_FEALNX is not set
++CONFIG_NATSEMI=y
++# CONFIG_NE2K_PCI is not set
++# CONFIG_8139CP is not set
++# CONFIG_8139TOO is not set
++# CONFIG_SIS900 is not set
++# CONFIG_EPIC100 is not set
++# CONFIG_SUNDANCE is not set
++# CONFIG_TLAN is not set
++# CONFIG_VIA_RHINE is not set
++# CONFIG_SC92031 is not set
++
++#
++# Ethernet (1000 Mbit)
++#
++# CONFIG_ACENIC is not set
++# CONFIG_DL2K is not set
++# CONFIG_E1000 is not set
++# CONFIG_NS83820 is not set
++# CONFIG_HAMACHI is not set
++# CONFIG_YELLOWFIN is not set
++# CONFIG_R8169 is not set
++# CONFIG_SIS190 is not set
++# CONFIG_SKGE is not set
++# CONFIG_SKY2 is not set
++# CONFIG_SK98LIN is not set
++# CONFIG_VIA_VELOCITY is not set
++# CONFIG_TIGON3 is not set
++# CONFIG_BNX2 is not set
++CONFIG_QLA3XXX=m
++# CONFIG_ATL1 is not set
++
++#
++# Ethernet (10000 Mbit)
++#
++# CONFIG_CHELSIO_T1 is not set
++CONFIG_CHELSIO_T3=m
++# CONFIG_IXGB is not set
++# CONFIG_S2IO is not set
++# CONFIG_MYRI10GE is not set
++CONFIG_NETXEN_NIC=m
++
++#
++# Token Ring devices
++#
++# CONFIG_TR is not set
++
++#
++# Wireless LAN (non-hamradio)
++#
++# CONFIG_NET_RADIO is not set
++
++#
++# Wan interfaces
++#
++# CONFIG_WAN is not set
++# CONFIG_FDDI is not set
++# CONFIG_HIPPI is not set
++CONFIG_PPP=m
++# CONFIG_PPP_MULTILINK is not set
++# CONFIG_PPP_FILTER is not set
++CONFIG_PPP_ASYNC=m
++CONFIG_PPP_SYNC_TTY=m
++CONFIG_PPP_DEFLATE=m
++# CONFIG_PPP_BSDCOMP is not set
++# CONFIG_PPP_MPPE is not set
++# CONFIG_PPPOE is not set
++# CONFIG_SLIP is not set
++CONFIG_SLHC=m
++# CONFIG_NET_FC is not set
++# CONFIG_SHAPER is not set
++# CONFIG_NETCONSOLE is not set
++# CONFIG_NETPOLL is not set
++# CONFIG_NET_POLL_CONTROLLER is not set
++
++#
++# ISDN subsystem
++#
++# CONFIG_ISDN is not set
++
++#
++# Telephony Support
++#
++# CONFIG_PHONE is not set
++
++#
++# Input device support
++#
++CONFIG_INPUT=y
++# CONFIG_INPUT_FF_MEMLESS is not set
++
++#
++# Userland interfaces
++#
++# CONFIG_INPUT_MOUSEDEV is not set
++# CONFIG_INPUT_JOYDEV is not set
++# CONFIG_INPUT_TSDEV is not set
++CONFIG_INPUT_EVDEV=m
++# CONFIG_INPUT_EVBUG is not set
++
++#
++# Input Device Drivers
++#
++# CONFIG_INPUT_KEYBOARD is not set
++# CONFIG_INPUT_MOUSE is not set
++# CONFIG_INPUT_JOYSTICK is not set
++# CONFIG_INPUT_TOUCHSCREEN is not set
++# CONFIG_INPUT_MISC is not set
++
++#
++# Hardware I/O ports
++#
++# CONFIG_SERIO is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++# CONFIG_VT is not set
++# CONFIG_SERIAL_NONSTANDARD is not set
++
++#
++# Serial drivers
++#
++CONFIG_SERIAL_8250=y
++CONFIG_SERIAL_8250_CONSOLE=y
++CONFIG_SERIAL_8250_PCI=y
++CONFIG_SERIAL_8250_NR_UARTS=4
++CONFIG_SERIAL_8250_RUNTIME_UARTS=4
++# CONFIG_SERIAL_8250_EXTENDED is not set
++
++#
++# Non-8250 serial port support
++#
++CONFIG_SERIAL_CORE=y
++CONFIG_SERIAL_CORE_CONSOLE=y
++# CONFIG_SERIAL_JSM is not set
++CONFIG_UNIX98_PTYS=y
++CONFIG_LEGACY_PTYS=y
++CONFIG_LEGACY_PTY_COUNT=256
++
++#
++# IPMI
++#
++# CONFIG_IPMI_HANDLER is not set
++
++#
++# Watchdog Cards
++#
++# CONFIG_WATCHDOG is not set
++# CONFIG_HW_RANDOM is not set
++CONFIG_RTC=m
++# CONFIG_GEN_RTC is not set
++# CONFIG_DTLK is not set
++# CONFIG_R3964 is not set
++# CONFIG_APPLICOM is not set
++# CONFIG_DRM is not set
++# CONFIG_RAW_DRIVER is not set
++
++#
++# TPM devices
++#
++# CONFIG_TCG_TPM is not set
++
++#
++# I2C support
++#
++CONFIG_I2C=y
++CONFIG_I2C_CHARDEV=y
++
++#
++# I2C Algorithms
++#
++# CONFIG_I2C_ALGOBIT is not set
++# CONFIG_I2C_ALGOPCF is not set
++# CONFIG_I2C_ALGOPCA is not set
++
++#
++# I2C Hardware Bus support
++#
++# CONFIG_I2C_ALI1535 is not set
++# CONFIG_I2C_ALI1563 is not set
++# CONFIG_I2C_ALI15X3 is not set
++# CONFIG_I2C_AMD756 is not set
++# CONFIG_I2C_AMD8111 is not set
++# CONFIG_I2C_I801 is not set
++# CONFIG_I2C_I810 is not set
++# CONFIG_I2C_PIIX4 is not set
++# CONFIG_I2C_NFORCE2 is not set
++# CONFIG_I2C_OCORES is not set
++# CONFIG_I2C_PARPORT_LIGHT is not set
++# CONFIG_I2C_PASEMI is not set
++# CONFIG_I2C_PROSAVAGE is not set
++# CONFIG_I2C_SAVAGE4 is not set
++# CONFIG_I2C_SIS5595 is not set
++# CONFIG_I2C_SIS630 is not set
++# CONFIG_I2C_SIS96X is not set
++# CONFIG_I2C_STUB is not set
++# CONFIG_I2C_VIA is not set
++# CONFIG_I2C_VIAPRO is not set
++# CONFIG_I2C_VOODOO3 is not set
++# CONFIG_I2C_PCA_ISA is not set
++
++#
++# Miscellaneous I2C Chip support
++#
++# CONFIG_SENSORS_DS1337 is not set
++# CONFIG_SENSORS_DS1374 is not set
++# CONFIG_EEPROM_LEGACY is not set
++# CONFIG_SENSORS_PCF8574 is not set
++# CONFIG_SENSORS_PCA9539 is not set
++# CONFIG_SENSORS_PCF8591 is not set
++# CONFIG_SENSORS_MAX6875 is not set
++CONFIG_I2C_DEBUG_CORE=y
++# CONFIG_I2C_DEBUG_ALGO is not set
++CONFIG_I2C_DEBUG_BUS=y
++# CONFIG_I2C_DEBUG_CHIP is not set
++
++#
++# SPI support
++#
++# CONFIG_SPI is not set
++# CONFIG_SPI_MASTER is not set
++
++#
++# Dallas's 1-wire bus
++#
++# CONFIG_W1 is not set
++
++#
++# Hardware Monitoring support
++#
++CONFIG_HWMON=y
++# CONFIG_HWMON_VID is not set
++# CONFIG_SENSORS_ABITUGURU is not set
++# CONFIG_SENSORS_ADM1021 is not set
++# CONFIG_SENSORS_ADM1025 is not set
++# CONFIG_SENSORS_ADM1026 is not set
++# CONFIG_SENSORS_ADM1029 is not set
++# CONFIG_SENSORS_ADM1031 is not set
++# CONFIG_SENSORS_ADM9240 is not set
++# CONFIG_SENSORS_ASB100 is not set
++# CONFIG_SENSORS_ATXP1 is not set
++# CONFIG_SENSORS_DS1621 is not set
++# CONFIG_SENSORS_F71805F is not set
++# CONFIG_SENSORS_FSCHER is not set
++# CONFIG_SENSORS_FSCPOS is not set
++# CONFIG_SENSORS_GL518SM is not set
++# CONFIG_SENSORS_GL520SM is not set
++# CONFIG_SENSORS_IT87 is not set
++# CONFIG_SENSORS_LM63 is not set
++# CONFIG_SENSORS_LM75 is not set
++# CONFIG_SENSORS_LM77 is not set
++# CONFIG_SENSORS_LM78 is not set
++# CONFIG_SENSORS_LM80 is not set
++# CONFIG_SENSORS_LM83 is not set
++# CONFIG_SENSORS_LM85 is not set
++# CONFIG_SENSORS_LM87 is not set
++# CONFIG_SENSORS_LM90 is not set
++# CONFIG_SENSORS_LM92 is not set
++# CONFIG_SENSORS_MAX1619 is not set
++# CONFIG_SENSORS_PC87360 is not set
++# CONFIG_SENSORS_PC87427 is not set
++# CONFIG_SENSORS_SIS5595 is not set
++# CONFIG_SENSORS_SMSC47M1 is not set
++# CONFIG_SENSORS_SMSC47M192 is not set
++# CONFIG_SENSORS_SMSC47B397 is not set
++# CONFIG_SENSORS_VIA686A is not set
++# CONFIG_SENSORS_VT1211 is not set
++# CONFIG_SENSORS_VT8231 is not set
++# CONFIG_SENSORS_W83781D is not set
++# CONFIG_SENSORS_W83791D is not set
++# CONFIG_SENSORS_W83792D is not set
++# CONFIG_SENSORS_W83793 is not set
++# CONFIG_SENSORS_W83L785TS is not set
++# CONFIG_SENSORS_W83627HF is not set
++# CONFIG_SENSORS_W83627EHF is not set
++# CONFIG_HWMON_DEBUG_CHIP is not set
++
++#
++# Multimedia devices
++#
++# CONFIG_VIDEO_DEV is not set
++
++#
++# Digital Video Broadcasting Devices
++#
++# CONFIG_DVB is not set
++
++#
++# Graphics support
++#
++# CONFIG_FIRMWARE_EDID is not set
++# CONFIG_FB is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Sound
++#
++# CONFIG_SOUND is not set
++
++#
++# HID Devices
++#
++# CONFIG_HID is not set
++
++#
++# USB support
++#
++CONFIG_USB_ARCH_HAS_HCD=y
++CONFIG_USB_ARCH_HAS_OHCI=y
++CONFIG_USB_ARCH_HAS_EHCI=y
++# CONFIG_USB is not set
++
++#
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
++#
++
++#
++# USB Gadget Support
++#
++# CONFIG_USB_GADGET is not set
++
++#
++# MMC/SD Card support
++#
++# CONFIG_MMC is not set
++
++#
++# LED devices
++#
++# CONFIG_NEW_LEDS is not set
++
++#
++# LED drivers
++#
++
++#
++# LED Triggers
++#
++
++#
++# InfiniBand support
++#
++# CONFIG_INFINIBAND is not set
++
++#
++# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
++#
++
++#
++# Real Time Clock
++#
++# CONFIG_RTC_CLASS is not set
++
++#
++# DMA Engine support
++#
++# CONFIG_DMA_ENGINE is not set
++
++#
++# DMA Clients
++#
++
++#
++# DMA Devices
++#
++
++#
++# Auxiliary Display support
++#
++
++#
++# Virtualization
++#
++
++#
++# File systems
++#
++CONFIG_EXT2_FS=y
++CONFIG_EXT2_FS_XATTR=y
++CONFIG_EXT2_FS_POSIX_ACL=y
++CONFIG_EXT2_FS_SECURITY=y
++# CONFIG_EXT2_FS_XIP is not set
++CONFIG_EXT3_FS=m
++CONFIG_EXT3_FS_XATTR=y
++# CONFIG_EXT3_FS_POSIX_ACL is not set
++# CONFIG_EXT3_FS_SECURITY is not set
++# CONFIG_EXT4DEV_FS is not set
++CONFIG_JBD=m
++# CONFIG_JBD_DEBUG is not set
++CONFIG_FS_MBCACHE=y
++# CONFIG_REISERFS_FS is not set
++# CONFIG_JFS_FS is not set
++CONFIG_FS_POSIX_ACL=y
++CONFIG_XFS_FS=m
++# CONFIG_XFS_QUOTA is not set
++# CONFIG_XFS_SECURITY is not set
++# CONFIG_XFS_POSIX_ACL is not set
++# CONFIG_XFS_RT is not set
++# CONFIG_GFS2_FS is not set
++# CONFIG_OCFS2_FS is not set
++# CONFIG_MINIX_FS is not set
++# CONFIG_ROMFS_FS is not set
++CONFIG_INOTIFY=y
++CONFIG_INOTIFY_USER=y
++# CONFIG_QUOTA is not set
++# CONFIG_DNOTIFY is not set
++# CONFIG_AUTOFS_FS is not set
++CONFIG_AUTOFS4_FS=m
++# CONFIG_FUSE_FS is not set
++CONFIG_GENERIC_ACL=y
++
++#
++# CD-ROM/DVD Filesystems
++#
++# CONFIG_ISO9660_FS is not set
++# CONFIG_UDF_FS is not set
++
++#
++# DOS/FAT/NT Filesystems
++#
++CONFIG_FAT_FS=y
++CONFIG_MSDOS_FS=y
++CONFIG_VFAT_FS=y
++CONFIG_FAT_DEFAULT_CODEPAGE=437
++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
++CONFIG_NTFS_FS=m
++# CONFIG_NTFS_DEBUG is not set
++# CONFIG_NTFS_RW is not set
++
++#
++# Pseudo filesystems
++#
++CONFIG_PROC_FS=y
++CONFIG_PROC_KCORE=y
++CONFIG_PROC_SYSCTL=y
++CONFIG_SYSFS=y
++CONFIG_TMPFS=y
++CONFIG_TMPFS_POSIX_ACL=y
++# CONFIG_HUGETLB_PAGE is not set
++CONFIG_RAMFS=y
++CONFIG_CONFIGFS_FS=m
++
++#
++# Miscellaneous filesystems
++#
++# CONFIG_ADFS_FS is not set
++# CONFIG_AFFS_FS is not set
++# CONFIG_HFS_FS is not set
++# CONFIG_HFSPLUS_FS is not set
++# CONFIG_BEFS_FS is not set
++# CONFIG_BFS_FS is not set
++# CONFIG_EFS_FS is not set
++CONFIG_JFFS2_FS=y
++CONFIG_JFFS2_FS_DEBUG=0
++CONFIG_JFFS2_FS_WRITEBUFFER=y
++# CONFIG_JFFS2_SUMMARY is not set
++# CONFIG_JFFS2_FS_XATTR is not set
++CONFIG_JFFS2_COMPRESSION_OPTIONS=y
++CONFIG_JFFS2_ZLIB=y
++CONFIG_JFFS2_RTIME=y
++# CONFIG_JFFS2_RUBIN is not set
++# CONFIG_JFFS2_CMODE_NONE is not set
++CONFIG_JFFS2_CMODE_PRIORITY=y
++# CONFIG_JFFS2_CMODE_SIZE is not set
++CONFIG_CRAMFS=y
++# CONFIG_VXFS_FS is not set
++# CONFIG_HPFS_FS is not set
++# CONFIG_QNX4FS_FS is not set
++# CONFIG_SYSV_FS is not set
++# CONFIG_UFS_FS is not set
++
++#
++# Network File Systems
++#
++CONFIG_NFS_FS=y
++CONFIG_NFS_V3=y
++# CONFIG_NFS_V3_ACL is not set
++CONFIG_NFS_V4=y
++CONFIG_NFS_DIRECTIO=y
++CONFIG_NFSD=m
++CONFIG_NFSD_V3=y
++# CONFIG_NFSD_V3_ACL is not set
++# CONFIG_NFSD_V4 is not set
++CONFIG_NFSD_TCP=y
++CONFIG_ROOT_NFS=y
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_EXPORTFS=m
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++CONFIG_SUNRPC_GSS=y
++CONFIG_RPCSEC_GSS_KRB5=y
++# CONFIG_RPCSEC_GSS_SPKM3 is not set
++CONFIG_SMB_FS=m
++# CONFIG_SMB_NLS_DEFAULT is not set
++# CONFIG_CIFS is not set
++# CONFIG_NCP_FS is not set
++# CONFIG_CODA_FS is not set
++# CONFIG_AFS_FS is not set
++# CONFIG_9P_FS is not set
++
++#
++# Partition Types
++#
++# CONFIG_PARTITION_ADVANCED is not set
++CONFIG_MSDOS_PARTITION=y
++
++#
++# Native Language Support
++#
++CONFIG_NLS=y
++CONFIG_NLS_DEFAULT=""
++CONFIG_NLS_CODEPAGE_437=m
++# CONFIG_NLS_CODEPAGE_737 is not set
++# CONFIG_NLS_CODEPAGE_775 is not set
++# CONFIG_NLS_CODEPAGE_850 is not set
++# CONFIG_NLS_CODEPAGE_852 is not set
++# CONFIG_NLS_CODEPAGE_855 is not set
++# CONFIG_NLS_CODEPAGE_857 is not set
++# CONFIG_NLS_CODEPAGE_860 is not set
++# CONFIG_NLS_CODEPAGE_861 is not set
++# CONFIG_NLS_CODEPAGE_862 is not set
++# CONFIG_NLS_CODEPAGE_863 is not set
++# CONFIG_NLS_CODEPAGE_864 is not set
++# CONFIG_NLS_CODEPAGE_865 is not set
++# CONFIG_NLS_CODEPAGE_866 is not set
++# CONFIG_NLS_CODEPAGE_869 is not set
++# CONFIG_NLS_CODEPAGE_936 is not set
++# CONFIG_NLS_CODEPAGE_950 is not set
++# CONFIG_NLS_CODEPAGE_932 is not set
++# CONFIG_NLS_CODEPAGE_949 is not set
++# CONFIG_NLS_CODEPAGE_874 is not set
++# CONFIG_NLS_ISO8859_8 is not set
++# CONFIG_NLS_CODEPAGE_1250 is not set
++# CONFIG_NLS_CODEPAGE_1251 is not set
++CONFIG_NLS_ASCII=m
++CONFIG_NLS_ISO8859_1=m
++# CONFIG_NLS_ISO8859_2 is not set
++# CONFIG_NLS_ISO8859_3 is not set
++# CONFIG_NLS_ISO8859_4 is not set
++# CONFIG_NLS_ISO8859_5 is not set
++# CONFIG_NLS_ISO8859_6 is not set
++# CONFIG_NLS_ISO8859_7 is not set
++# CONFIG_NLS_ISO8859_9 is not set
++# CONFIG_NLS_ISO8859_13 is not set
++# CONFIG_NLS_ISO8859_14 is not set
++# CONFIG_NLS_ISO8859_15 is not set
++# CONFIG_NLS_KOI8_R is not set
++# CONFIG_NLS_KOI8_U is not set
++CONFIG_NLS_UTF8=m
++
++#
++# Distributed Lock Manager
++#
++CONFIG_DLM=m
++CONFIG_DLM_TCP=y
++# CONFIG_DLM_SCTP is not set
++# CONFIG_DLM_DEBUG is not set
++
++#
++# Profiling support
++#
++# CONFIG_PROFILING is not set
++
++#
++# Kernel hacking
++#
++CONFIG_TRACE_IRQFLAGS_SUPPORT=y
++# CONFIG_PRINTK_TIME is not set
++CONFIG_ENABLE_MUST_CHECK=y
++# CONFIG_MAGIC_SYSRQ is not set
++# CONFIG_UNUSED_SYMBOLS is not set
++# CONFIG_DEBUG_FS is not set
++# CONFIG_HEADERS_CHECK is not set
++# CONFIG_DEBUG_KERNEL is not set
++CONFIG_LOG_BUF_SHIFT=14
++CONFIG_CROSSCOMPILE=y
++CONFIG_CMDLINE="console=ttyS0,115200 mem=192m ip=bootp root=/dev/nfs rw"
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++
++#
++# Cryptographic options
++#
++CONFIG_CRYPTO=y
++CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_BLKCIPHER=y
++CONFIG_CRYPTO_HASH=y
++CONFIG_CRYPTO_MANAGER=y
++CONFIG_CRYPTO_HMAC=y
++CONFIG_CRYPTO_XCBC=m
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_MD4 is not set
++CONFIG_CRYPTO_MD5=y
++# CONFIG_CRYPTO_SHA1 is not set
++# CONFIG_CRYPTO_SHA256 is not set
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_WP512 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++CONFIG_CRYPTO_GF128MUL=m
++CONFIG_CRYPTO_ECB=m
++CONFIG_CRYPTO_CBC=y
++CONFIG_CRYPTO_PCBC=m
++CONFIG_CRYPTO_LRW=m
++CONFIG_CRYPTO_DES=y
++CONFIG_CRYPTO_FCRYPT=m
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_DEFLATE is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_CRC32C is not set
++CONFIG_CRYPTO_CAMELLIA=m
++# CONFIG_CRYPTO_TEST is not set
++
++#
++# Hardware crypto devices
++#
++
++#
++# Library routines
++#
++CONFIG_BITREVERSE=y
++CONFIG_CRC_CCITT=m
++# CONFIG_CRC16 is not set
++CONFIG_CRC32=y
++# CONFIG_LIBCRC32C is not set
++CONFIG_ZLIB_INFLATE=y
++CONFIG_ZLIB_DEFLATE=y
++CONFIG_TEXTSEARCH=y
++CONFIG_TEXTSEARCH_KMP=m
++CONFIG_TEXTSEARCH_BM=m
++CONFIG_TEXTSEARCH_FSM=m
++CONFIG_PLIST=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/configs/ip27_defconfig linux-2.6.29-rc3.owrt/arch/mips/configs/ip27_defconfig
+--- linux-2.6.29.owrt/arch/mips/configs/ip27_defconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/configs/ip27_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -53,7 +53,7 @@
+ CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+ CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
+ CONFIG_ARC=y
+-CONFIG_DMA_COHERENT=y
++CONFIG_DMA_IP27=y
+ CONFIG_EARLY_PRINTK=y
+ CONFIG_SYS_HAS_EARLY_PRINTK=y
+ # CONFIG_NO_IOPORT is not set
+@@ -512,7 +512,7 @@
+ CONFIG_MD_RAID0=y
+ CONFIG_MD_RAID1=y
+ CONFIG_MD_RAID10=m
+-CONFIG_MD_RAID456=y
++CONFIG_MD_RAID456=m
+ CONFIG_MD_RAID5_RESHAPE=y
+ CONFIG_MD_MULTIPATH=m
+ CONFIG_MD_FAULTY=m
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/configs/jmr3927_defconfig linux-2.6.29-rc3.owrt/arch/mips/configs/jmr3927_defconfig
+--- linux-2.6.29.owrt/arch/mips/configs/jmr3927_defconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/configs/jmr3927_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-rc7
+-# Wed Mar 4 23:07:16 2009
++# Linux kernel version: 2.6.26-rc9
++# Fri Jul 11 23:01:36 2008
+ #
+ CONFIG_MIPS=y
+
+@@ -18,10 +18,8 @@
+ # CONFIG_LEMOTE_FULONG is not set
+ # CONFIG_MIPS_MALTA is not set
+ # CONFIG_MIPS_SIM is not set
+-# CONFIG_MACH_EMMA is not set
++# CONFIG_MARKEINS is not set
+ # CONFIG_MACH_VR41XX is not set
+-# CONFIG_NXP_STB220 is not set
+-# CONFIG_NXP_STB225 is not set
+ # CONFIG_PNX8550_JBS is not set
+ # CONFIG_PNX8550_STB810 is not set
+ # CONFIG_PMC_MSP is not set
+@@ -41,11 +39,7 @@
+ # CONFIG_SNI_RM is not set
+ CONFIG_MACH_TX39XX=y
+ # CONFIG_MACH_TX49XX is not set
+-# CONFIG_MIKROTIK_RB532 is not set
+ # CONFIG_WR_PPMC is not set
+-# CONFIG_CAVIUM_OCTEON_SIMULATOR is not set
+-# CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set
+-CONFIG_MACH_TXX9=y
+ CONFIG_TOSHIBA_JMR3927=y
+ CONFIG_SOC_TX3927=y
+ # CONFIG_TOSHIBA_FPCIB0 is not set
+@@ -60,14 +54,12 @@
+ CONFIG_GENERIC_CLOCKEVENTS=y
+ CONFIG_GENERIC_TIME=y
+ CONFIG_GENERIC_CMOS_UPDATE=y
+-CONFIG_SCHED_OMIT_FRAME_POINTER=y
++CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+ CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
+ CONFIG_CEVT_TXX9=y
+ CONFIG_GPIO_TXX9=y
+ CONFIG_DMA_NONCOHERENT=y
+ CONFIG_DMA_NEED_PCI_MAP_STATE=y
+-CONFIG_EARLY_PRINTK=y
+-CONFIG_SYS_HAS_EARLY_PRINTK=y
+ # CONFIG_HOTPLUG_CPU is not set
+ # CONFIG_NO_IOPORT is not set
+ CONFIG_GENERIC_GPIO=y
+@@ -95,7 +87,6 @@
+ # CONFIG_CPU_TX49XX is not set
+ # CONFIG_CPU_R5000 is not set
+ # CONFIG_CPU_R5432 is not set
+-# CONFIG_CPU_R5500 is not set
+ # CONFIG_CPU_R6000 is not set
+ # CONFIG_CPU_NEVADA is not set
+ # CONFIG_CPU_R8000 is not set
+@@ -103,7 +94,6 @@
+ # CONFIG_CPU_RM7000 is not set
+ # CONFIG_CPU_RM9000 is not set
+ # CONFIG_CPU_SB1 is not set
+-# CONFIG_CPU_CAVIUM_OCTEON is not set
+ CONFIG_SYS_HAS_CPU_TX39XX=y
+ CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
+ CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
+@@ -127,12 +117,14 @@
+ CONFIG_ARCH_POPULATES_NODE_MAP=y
+ CONFIG_FLATMEM=y
+ CONFIG_FLAT_NODE_MEM_MAP=y
++# CONFIG_SPARSEMEM_STATIC is not set
++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
+ CONFIG_PAGEFLAGS_EXTENDED=y
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+-# CONFIG_PHYS_ADDR_T_64BIT is not set
++# CONFIG_RESOURCES_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=0
+ CONFIG_VIRT_TO_BUS=y
+-CONFIG_UNEVICTABLE_LRU=y
++# CONFIG_TICK_ONESHOT is not set
+ # CONFIG_NO_HZ is not set
+ # CONFIG_HIGH_RES_TIMERS is not set
+ CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+@@ -167,15 +159,6 @@
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
+ # CONFIG_AUDIT is not set
+-
+-#
+-# RCU Subsystem
+-#
+-CONFIG_CLASSIC_RCU=y
+-# CONFIG_TREE_RCU is not set
+-# CONFIG_PREEMPT_RCU is not set
+-# CONFIG_TREE_RCU_TRACE is not set
+-# CONFIG_PREEMPT_RCU_TRACE is not set
+ # CONFIG_IKCONFIG is not set
+ CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_CGROUPS is not set
+@@ -188,6 +171,7 @@
+ CONFIG_SYSCTL=y
+ CONFIG_EMBEDDED=y
+ CONFIG_SYSCTL_SYSCALL=y
++CONFIG_SYSCTL_SYSCALL_CHECK=y
+ CONFIG_KALLSYMS=y
+ # CONFIG_KALLSYMS_EXTRA_PASS is not set
+ # CONFIG_HOTPLUG is not set
+@@ -204,23 +188,26 @@
+ CONFIG_TIMERFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_SHMEM=y
+-CONFIG_AIO=y
+ CONFIG_VM_EVENT_COUNTERS=y
+-CONFIG_PCI_QUIRKS=y
+ CONFIG_SLAB=y
+ # CONFIG_SLUB is not set
+ # CONFIG_SLOB is not set
+ # CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
+ CONFIG_HAVE_OPROFILE=y
+-# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
++# CONFIG_HAVE_KPROBES is not set
++# CONFIG_HAVE_KRETPROBES is not set
++# CONFIG_HAVE_DMA_ATTRS is not set
++CONFIG_PROC_PAGE_MONITOR=y
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+ # CONFIG_MODULES is not set
+ CONFIG_BLOCK=y
+ # CONFIG_LBD is not set
+ # CONFIG_BLK_DEV_IO_TRACE is not set
+-# CONFIG_BLK_DEV_INTEGRITY is not set
++# CONFIG_LSF is not set
+
+ #
+ # IO Schedulers
+@@ -234,7 +221,7 @@
+ CONFIG_DEFAULT_CFQ=y
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="cfq"
+-# CONFIG_FREEZER is not set
++CONFIG_CLASSIC_RCU=y
+
+ #
+ # Bus options (PCI, PCMCIA, EISA, ISA, TC)
+@@ -244,15 +231,12 @@
+ CONFIG_PCI_DOMAINS=y
+ # CONFIG_ARCH_SUPPORTS_MSI is not set
+ CONFIG_PCI_LEGACY=y
+-# CONFIG_PCI_STUB is not set
+ CONFIG_MMU=y
+
+ #
+ # Executable file formats
+ #
+ CONFIG_BINFMT_ELF=y
+-# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+-# CONFIG_HAVE_AOUT is not set
+ # CONFIG_BINFMT_MISC is not set
+ CONFIG_TRAD_SIGNALS=y
+
+@@ -261,12 +245,15 @@
+ #
+ CONFIG_ARCH_SUSPEND_POSSIBLE=y
+ # CONFIG_PM is not set
++
++#
++# Networking
++#
+ CONFIG_NET=y
+
+ #
+ # Networking options
+ #
+-CONFIG_COMPAT_NET_DEV_OPS=y
+ CONFIG_PACKET=y
+ # CONFIG_PACKET_MMAP is not set
+ CONFIG_UNIX=y
+@@ -306,7 +293,6 @@
+ # CONFIG_IPX is not set
+ # CONFIG_ATALK is not set
+ # CONFIG_NET_SCHED is not set
+-# CONFIG_DCB is not set
+
+ #
+ # Network testing
+@@ -316,9 +302,14 @@
+ # CONFIG_CAN is not set
+ # CONFIG_IRDA is not set
+ # CONFIG_BT is not set
+-# CONFIG_PHONET is not set
+-# CONFIG_WIRELESS is not set
+-# CONFIG_WIMAX is not set
++
++#
++# Wireless
++#
++# CONFIG_CFG80211 is not set
++# CONFIG_WIRELESS_EXT is not set
++# CONFIG_MAC80211 is not set
++# CONFIG_IEEE80211 is not set
+ # CONFIG_RFKILL is not set
+
+ #
+@@ -332,89 +323,7 @@
+ CONFIG_PREVENT_FIRMWARE_BUILD=y
+ # CONFIG_SYS_HYPERVISOR is not set
+ # CONFIG_CONNECTOR is not set
+-CONFIG_MTD=y
+-# CONFIG_MTD_DEBUG is not set
+-# CONFIG_MTD_CONCAT is not set
+-CONFIG_MTD_PARTITIONS=y
+-# CONFIG_MTD_REDBOOT_PARTS is not set
+-CONFIG_MTD_CMDLINE_PARTS=y
+-# CONFIG_MTD_AR7_PARTS is not set
+-
+-#
+-# User Modules And Translation Layers
+-#
+-CONFIG_MTD_CHAR=y
+-# CONFIG_MTD_BLKDEVS is not set
+-# CONFIG_MTD_BLOCK is not set
+-# CONFIG_MTD_BLOCK_RO is not set
+-# CONFIG_FTL is not set
+-# CONFIG_NFTL is not set
+-# CONFIG_INFTL is not set
+-# CONFIG_RFD_FTL is not set
+-# CONFIG_SSFDC is not set
+-# CONFIG_MTD_OOPS is not set
+-
+-#
+-# RAM/ROM/Flash chip drivers
+-#
+-CONFIG_MTD_CFI=y
+-CONFIG_MTD_JEDECPROBE=y
+-CONFIG_MTD_GEN_PROBE=y
+-# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+-CONFIG_MTD_MAP_BANK_WIDTH_1=y
+-CONFIG_MTD_MAP_BANK_WIDTH_2=y
+-CONFIG_MTD_MAP_BANK_WIDTH_4=y
+-# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+-# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+-CONFIG_MTD_CFI_I1=y
+-CONFIG_MTD_CFI_I2=y
+-# CONFIG_MTD_CFI_I4 is not set
+-# CONFIG_MTD_CFI_I8 is not set
+-# CONFIG_MTD_CFI_INTELEXT is not set
+-CONFIG_MTD_CFI_AMDSTD=y
+-# CONFIG_MTD_CFI_STAA is not set
+-CONFIG_MTD_CFI_UTIL=y
+-# CONFIG_MTD_RAM is not set
+-# CONFIG_MTD_ROM is not set
+-# CONFIG_MTD_ABSENT is not set
+-
+-#
+-# Mapping drivers for chip access
+-#
+-# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+-CONFIG_MTD_PHYSMAP=y
+-# CONFIG_MTD_PHYSMAP_COMPAT is not set
+-# CONFIG_MTD_INTEL_VR_NOR is not set
+-# CONFIG_MTD_PLATRAM is not set
+-
+-#
+-# Self-contained MTD device drivers
+-#
+-# CONFIG_MTD_PMC551 is not set
+-# CONFIG_MTD_SLRAM is not set
+-# CONFIG_MTD_PHRAM is not set
+-# CONFIG_MTD_MTDRAM is not set
+-# CONFIG_MTD_BLOCK2MTD is not set
+-
+-#
+-# Disk-On-Chip Device Drivers
+-#
+-# CONFIG_MTD_DOC2000 is not set
+-# CONFIG_MTD_DOC2001 is not set
+-# CONFIG_MTD_DOC2001PLUS is not set
+-# CONFIG_MTD_NAND is not set
+-# CONFIG_MTD_ONENAND is not set
+-
+-#
+-# LPDDR flash memory drivers
+-#
+-# CONFIG_MTD_LPDDR is not set
+-
+-#
+-# UBI - Unsorted block images
+-#
+-# CONFIG_MTD_UBI is not set
++# CONFIG_MTD is not set
+ # CONFIG_PARPORT is not set
+ CONFIG_BLK_DEV=y
+ # CONFIG_BLK_CPQ_DA is not set
+@@ -427,7 +336,6 @@
+ # CONFIG_BLK_DEV_RAM is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+ # CONFIG_ATA_OVER_ETH is not set
+-# CONFIG_BLK_DEV_HD is not set
+ # CONFIG_MISC_DEVICES is not set
+ CONFIG_HAVE_IDE=y
+ # CONFIG_IDE is not set
+@@ -453,6 +361,7 @@
+ # CONFIG_IEEE1394 is not set
+ # CONFIG_I2O is not set
+ CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
+ # CONFIG_DUMMY is not set
+ # CONFIG_BONDING is not set
+ # CONFIG_EQUALIZER is not set
+@@ -474,9 +383,6 @@
+ # CONFIG_BROADCOM_PHY is not set
+ # CONFIG_ICPLUS_PHY is not set
+ # CONFIG_REALTEK_PHY is not set
+-# CONFIG_NATIONAL_PHY is not set
+-# CONFIG_STE10XP is not set
+-# CONFIG_LSI_ET1011C_PHY is not set
+ # CONFIG_FIXED_PHY is not set
+ # CONFIG_MDIO_BITBANG is not set
+ CONFIG_NET_ETHERNET=y
+@@ -486,7 +392,6 @@
+ # CONFIG_SUNGEM is not set
+ # CONFIG_CASSINI is not set
+ # CONFIG_NET_VENDOR_3COM is not set
+-# CONFIG_SMC91X is not set
+ # CONFIG_DM9000 is not set
+ # CONFIG_NET_TULIP is not set
+ # CONFIG_HP100 is not set
+@@ -494,9 +399,6 @@
+ # CONFIG_IBM_NEW_EMAC_RGMII is not set
+ # CONFIG_IBM_NEW_EMAC_TAH is not set
+ # CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+-# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
+-# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
+-# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
+ CONFIG_NET_PCI=y
+ # CONFIG_PCNET32 is not set
+ # CONFIG_AMD8111_ETH is not set
+@@ -504,6 +406,7 @@
+ # CONFIG_B44 is not set
+ # CONFIG_FORCEDETH is not set
+ CONFIG_TC35815=y
++# CONFIG_EEPRO100 is not set
+ # CONFIG_E100 is not set
+ # CONFIG_FEALNX is not set
+ # CONFIG_NATSEMI is not set
+@@ -512,11 +415,9 @@
+ # CONFIG_R6040 is not set
+ # CONFIG_SIS900 is not set
+ # CONFIG_EPIC100 is not set
+-# CONFIG_SMSC9420 is not set
+ # CONFIG_SUNDANCE is not set
+ # CONFIG_TLAN is not set
+ # CONFIG_VIA_RHINE is not set
+-# CONFIG_ATL2 is not set
+ # CONFIG_NETDEV_1000 is not set
+ # CONFIG_NETDEV_10000 is not set
+ # CONFIG_TR is not set
+@@ -527,10 +428,6 @@
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
+ # CONFIG_IWLWIFI_LEDS is not set
+-
+-#
+-# Enable WiMAX (Networking options) to see the WiMAX drivers
+-#
+ # CONFIG_WAN is not set
+ # CONFIG_FDDI is not set
+ # CONFIG_PPP is not set
+@@ -543,7 +440,27 @@
+ #
+ # Input device support
+ #
+-# CONFIG_INPUT is not set
++CONFIG_INPUT=y
++# CONFIG_INPUT_FF_MEMLESS is not set
++# CONFIG_INPUT_POLLDEV is not set
++
++#
++# Userland interfaces
++#
++# CONFIG_INPUT_MOUSEDEV is not set
++# CONFIG_INPUT_JOYDEV is not set
++# CONFIG_INPUT_EVDEV is not set
++# CONFIG_INPUT_EVBUG is not set
++
++#
++# Input Device Drivers
++#
++# CONFIG_INPUT_KEYBOARD is not set
++# CONFIG_INPUT_MOUSE is not set
++# CONFIG_INPUT_JOYSTICK is not set
++# CONFIG_INPUT_TABLET is not set
++# CONFIG_INPUT_TOUCHSCREEN is not set
++# CONFIG_INPUT_MISC is not set
+
+ #
+ # Hardware I/O ports
+@@ -600,11 +517,10 @@
+ CONFIG_DEVPORT=y
+ # CONFIG_I2C is not set
+ # CONFIG_SPI is not set
+-CONFIG_ARCH_REQUIRE_GPIOLIB=y
+-CONFIG_GPIOLIB=y
++CONFIG_HAVE_GPIO_LIB=y
+
+ #
+-# Memory mapped GPIO expanders:
++# GPIO Support
+ #
+
+ #
+@@ -612,11 +528,6 @@
+ #
+
+ #
+-# PCI GPIO expanders:
+-#
+-# CONFIG_GPIO_BT8XX is not set
+-
+-#
+ # SPI GPIO expanders:
+ #
+ # CONFIG_W1 is not set
+@@ -631,7 +542,6 @@
+ # Watchdog Device Drivers
+ #
+ # CONFIG_SOFT_WATCHDOG is not set
+-# CONFIG_ALIM7101_WDT is not set
+ CONFIG_TXX9_WDT=y
+
+ #
+@@ -639,21 +549,18 @@
+ #
+ # CONFIG_PCIPCWATCHDOG is not set
+ # CONFIG_WDTPCI is not set
+-CONFIG_SSB_POSSIBLE=y
+
+ #
+ # Sonics Silicon Backplane
+ #
++CONFIG_SSB_POSSIBLE=y
+ # CONFIG_SSB is not set
+
+ #
+ # Multifunction device drivers
+ #
+-# CONFIG_MFD_CORE is not set
+ # CONFIG_MFD_SM501 is not set
+ # CONFIG_HTC_PASIC3 is not set
+-# CONFIG_MFD_TMIO is not set
+-# CONFIG_REGULATOR is not set
+
+ #
+ # Multimedia devices
+@@ -684,26 +591,16 @@
+ # Display device support
+ #
+ # CONFIG_DISPLAY_SUPPORT is not set
++
++#
++# Sound
++#
+ # CONFIG_SOUND is not set
++# CONFIG_HID_SUPPORT is not set
+ # CONFIG_USB_SUPPORT is not set
+ # CONFIG_MMC is not set
+ # CONFIG_MEMSTICK is not set
+-CONFIG_NEW_LEDS=y
+-CONFIG_LEDS_CLASS=y
+-
+-#
+-# LED drivers
+-#
+-CONFIG_LEDS_GPIO=y
+-
+-#
+-# LED Triggers
+-#
+-CONFIG_LEDS_TRIGGERS=y
+-# CONFIG_LEDS_TRIGGER_TIMER is not set
+-CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+-# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+-# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
++# CONFIG_NEW_LEDS is not set
+ # CONFIG_ACCESSIBILITY is not set
+ # CONFIG_INFINIBAND is not set
+ CONFIG_RTC_LIB=y
+@@ -729,34 +626,27 @@
+ # Platform RTC drivers
+ #
+ # CONFIG_RTC_DRV_CMOS is not set
+-# CONFIG_RTC_DRV_DS1286 is not set
+ # CONFIG_RTC_DRV_DS1511 is not set
+ # CONFIG_RTC_DRV_DS1553 is not set
+ CONFIG_RTC_DRV_DS1742=y
+ # CONFIG_RTC_DRV_STK17TA8 is not set
+ # CONFIG_RTC_DRV_M48T86 is not set
+-# CONFIG_RTC_DRV_M48T35 is not set
+ # CONFIG_RTC_DRV_M48T59 is not set
+-# CONFIG_RTC_DRV_BQ4802 is not set
+ # CONFIG_RTC_DRV_V3020 is not set
+
+ #
+ # on-CPU RTC drivers
+ #
+-# CONFIG_DMADEVICES is not set
+ # CONFIG_UIO is not set
+-# CONFIG_STAGING is not set
+
+ #
+ # File systems
+ #
+ # CONFIG_EXT2_FS is not set
+ # CONFIG_EXT3_FS is not set
+-# CONFIG_EXT4_FS is not set
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
+ # CONFIG_FS_POSIX_ACL is not set
+-CONFIG_FILE_LOCKING=y
+ # CONFIG_XFS_FS is not set
+ # CONFIG_OCFS2_FS is not set
+ CONFIG_DNOTIFY=y
+@@ -786,17 +676,28 @@
+ CONFIG_PROC_FS=y
+ CONFIG_PROC_KCORE=y
+ CONFIG_PROC_SYSCTL=y
+-CONFIG_PROC_PAGE_MONITOR=y
+ CONFIG_SYSFS=y
+ # CONFIG_TMPFS is not set
+ # CONFIG_HUGETLB_PAGE is not set
+ # CONFIG_CONFIGFS_FS is not set
+-# CONFIG_MISC_FILESYSTEMS is not set
++
++#
++# Miscellaneous filesystems
++#
++# CONFIG_HFSPLUS_FS is not set
++# CONFIG_CRAMFS is not set
++# CONFIG_VXFS_FS is not set
++# CONFIG_MINIX_FS is not set
++# CONFIG_HPFS_FS is not set
++# CONFIG_QNX4FS_FS is not set
++# CONFIG_ROMFS_FS is not set
++# CONFIG_SYSV_FS is not set
++# CONFIG_UFS_FS is not set
+ CONFIG_NETWORK_FILESYSTEMS=y
+ CONFIG_NFS_FS=y
+ # CONFIG_NFS_V3 is not set
+-CONFIG_ROOT_NFS=y
+ # CONFIG_NFSD is not set
++CONFIG_ROOT_NFS=y
+ CONFIG_LOCKD=y
+ CONFIG_NFS_COMMON=y
+ CONFIG_SUNRPC=y
+@@ -825,16 +726,7 @@
+ # CONFIG_DEBUG_FS is not set
+ # CONFIG_HEADERS_CHECK is not set
+ # CONFIG_DEBUG_KERNEL is not set
+-# CONFIG_DEBUG_MEMORY_INIT is not set
+-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+-CONFIG_SYSCTL_SYSCALL_CHECK=y
+-
+-#
+-# Tracers
+-#
+-# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
+ # CONFIG_SAMPLES is not set
+-CONFIG_HAVE_ARCH_KGDB=y
+ CONFIG_CMDLINE=""
+
+ #
+@@ -842,18 +734,15 @@
+ #
+ # CONFIG_KEYS is not set
+ # CONFIG_SECURITY is not set
+-# CONFIG_SECURITYFS is not set
+-# CONFIG_SECURITY_FILE_CAPABILITIES is not set
+ # CONFIG_CRYPTO is not set
+
+ #
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
+-CONFIG_GENERIC_FIND_LAST_BIT=y
++# CONFIG_GENERIC_FIND_FIRST_BIT is not set
+ # CONFIG_CRC_CCITT is not set
+ # CONFIG_CRC16 is not set
+-# CONFIG_CRC_T10DIF is not set
+ # CONFIG_CRC_ITU_T is not set
+ CONFIG_CRC32=y
+ # CONFIG_CRC7 is not set
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/configs/markeins_defconfig linux-2.6.29-rc3.owrt/arch/mips/configs/markeins_defconfig
+--- linux-2.6.29.owrt/arch/mips/configs/markeins_defconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/configs/markeins_defconfig 1970-01-01 01:00:00.000000000 +0100
+@@ -1,1439 +0,0 @@
+-#
+-# Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.20
+-# Tue Feb 20 21:47:29 2007
+-#
+-CONFIG_MIPS=y
+-
+-#
+-# Machine selection
+-#
+-CONFIG_ZONE_DMA=y
+-# CONFIG_MIPS_MTX1 is not set
+-# CONFIG_MIPS_BOSPORUS is not set
+-# CONFIG_MIPS_PB1000 is not set
+-# CONFIG_MIPS_PB1100 is not set
+-# CONFIG_MIPS_PB1500 is not set
+-# CONFIG_MIPS_PB1550 is not set
+-# CONFIG_MIPS_PB1200 is not set
+-# CONFIG_MIPS_DB1000 is not set
+-# CONFIG_MIPS_DB1100 is not set
+-# CONFIG_MIPS_DB1500 is not set
+-# CONFIG_MIPS_DB1550 is not set
+-# CONFIG_MIPS_DB1200 is not set
+-# CONFIG_MIPS_MIRAGE is not set
+-# CONFIG_BASLER_EXCITE is not set
+-# CONFIG_MIPS_COBALT is not set
+-# CONFIG_MACH_DECSTATION is not set
+-# CONFIG_MACH_JAZZ is not set
+-# CONFIG_MIPS_MALTA is not set
+-# CONFIG_WR_PPMC is not set
+-# CONFIG_MIPS_SIM is not set
+-# CONFIG_MOMENCO_JAGUAR_ATX is not set
+-# CONFIG_MIPS_XXS1500 is not set
+-# CONFIG_PNX8550_JBS is not set
+-# CONFIG_PNX8550_STB810 is not set
+-# CONFIG_MACH_VR41XX is not set
+-# CONFIG_PMC_YOSEMITE is not set
+-CONFIG_NEC_MARKEINS=y
+-# CONFIG_SGI_IP22 is not set
+-# CONFIG_SGI_IP27 is not set
+-# CONFIG_SGI_IP32 is not set
+-# CONFIG_SIBYTE_BIGSUR is not set
+-# CONFIG_SIBYTE_SWARM is not set
+-# CONFIG_SIBYTE_SENTOSA is not set
+-# CONFIG_SIBYTE_RHONE is not set
+-# CONFIG_SIBYTE_CARMEL is not set
+-# CONFIG_SIBYTE_LITTLESUR is not set
+-# CONFIG_SIBYTE_CRHINE is not set
+-# CONFIG_SIBYTE_CRHONE is not set
+-# CONFIG_SNI_RM is not set
+-# CONFIG_TOSHIBA_JMR3927 is not set
+-# CONFIG_TOSHIBA_RBTX4927 is not set
+-# CONFIG_TOSHIBA_RBTX4938 is not set
+-CONFIG_RWSEM_GENERIC_SPINLOCK=y
+-# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+-# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+-CONFIG_GENERIC_FIND_NEXT_BIT=y
+-CONFIG_GENERIC_HWEIGHT=y
+-CONFIG_GENERIC_CALIBRATE_DELAY=y
+-CONFIG_GENERIC_TIME=y
+-CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+-# CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ is not set
+-CONFIG_DMA_NONCOHERENT=y
+-CONFIG_DMA_NEED_PCI_MAP_STATE=y
+-CONFIG_CPU_BIG_ENDIAN=y
+-# CONFIG_CPU_LITTLE_ENDIAN is not set
+-CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y
+-CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y
+-CONFIG_IRQ_CPU=y
+-CONFIG_SWAP_IO_SPACE=y
+-CONFIG_SOC_EMMA2RH=y
+-CONFIG_MIPS_L1_CACHE_SHIFT=5
+-
+-#
+-# CPU selection
+-#
+-# CONFIG_CPU_MIPS32_R1 is not set
+-# CONFIG_CPU_MIPS32_R2 is not set
+-# CONFIG_CPU_MIPS64_R1 is not set
+-# CONFIG_CPU_MIPS64_R2 is not set
+-# CONFIG_CPU_R3000 is not set
+-# CONFIG_CPU_TX39XX is not set
+-# CONFIG_CPU_VR41XX is not set
+-# CONFIG_CPU_R4300 is not set
+-# CONFIG_CPU_R4X00 is not set
+-# CONFIG_CPU_TX49XX is not set
+-CONFIG_CPU_R5000=y
+-# CONFIG_CPU_R5432 is not set
+-# CONFIG_CPU_R6000 is not set
+-# CONFIG_CPU_NEVADA is not set
+-# CONFIG_CPU_R8000 is not set
+-# CONFIG_CPU_R10000 is not set
+-# CONFIG_CPU_RM7000 is not set
+-# CONFIG_CPU_RM9000 is not set
+-# CONFIG_CPU_SB1 is not set
+-CONFIG_SYS_HAS_CPU_R5000=y
+-CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
+-CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
+-CONFIG_CPU_SUPPORTS_64BIT_KERNEL=y
+-
+-#
+-# Kernel type
+-#
+-CONFIG_32BIT=y
+-# CONFIG_64BIT is not set
+-CONFIG_PAGE_SIZE_4KB=y
+-# CONFIG_PAGE_SIZE_8KB is not set
+-# CONFIG_PAGE_SIZE_16KB is not set
+-# CONFIG_PAGE_SIZE_64KB is not set
+-CONFIG_MIPS_MT_DISABLED=y
+-# CONFIG_MIPS_MT_SMP is not set
+-# CONFIG_MIPS_MT_SMTC is not set
+-# CONFIG_MIPS_VPE_LOADER is not set
+-# CONFIG_64BIT_PHYS_ADDR is not set
+-CONFIG_CPU_HAS_LLSC=y
+-CONFIG_CPU_HAS_SYNC=y
+-CONFIG_GENERIC_HARDIRQS=y
+-CONFIG_GENERIC_IRQ_PROBE=y
+-CONFIG_ARCH_FLATMEM_ENABLE=y
+-CONFIG_SELECT_MEMORY_MODEL=y
+-CONFIG_FLATMEM_MANUAL=y
+-# CONFIG_DISCONTIGMEM_MANUAL is not set
+-# CONFIG_SPARSEMEM_MANUAL is not set
+-CONFIG_FLATMEM=y
+-CONFIG_FLAT_NODE_MEM_MAP=y
+-# CONFIG_SPARSEMEM_STATIC is not set
+-CONFIG_SPLIT_PTLOCK_CPUS=4
+-# CONFIG_RESOURCES_64BIT is not set
+-CONFIG_ZONE_DMA_FLAG=1
+-# CONFIG_HZ_48 is not set
+-# CONFIG_HZ_100 is not set
+-# CONFIG_HZ_128 is not set
+-# CONFIG_HZ_250 is not set
+-# CONFIG_HZ_256 is not set
+-CONFIG_HZ_1000=y
+-# CONFIG_HZ_1024 is not set
+-CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
+-CONFIG_HZ=1000
+-# CONFIG_PREEMPT_NONE is not set
+-# CONFIG_PREEMPT_VOLUNTARY is not set
+-CONFIG_PREEMPT=y
+-CONFIG_PREEMPT_BKL=y
+-# CONFIG_KEXEC is not set
+-CONFIG_LOCKDEP_SUPPORT=y
+-CONFIG_STACKTRACE_SUPPORT=y
+-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+-
+-#
+-# Code maturity level options
+-#
+-CONFIG_EXPERIMENTAL=y
+-CONFIG_BROKEN_ON_SMP=y
+-CONFIG_LOCK_KERNEL=y
+-CONFIG_INIT_ENV_ARG_LIMIT=32
+-
+-#
+-# General setup
+-#
+-CONFIG_LOCALVERSION=""
+-CONFIG_LOCALVERSION_AUTO=y
+-CONFIG_SWAP=y
+-CONFIG_SYSVIPC=y
+-# CONFIG_IPC_NS is not set
+-CONFIG_SYSVIPC_SYSCTL=y
+-CONFIG_POSIX_MQUEUE=y
+-CONFIG_BSD_PROCESS_ACCT=y
+-# CONFIG_BSD_PROCESS_ACCT_V3 is not set
+-# CONFIG_TASKSTATS is not set
+-# CONFIG_UTS_NS is not set
+-# CONFIG_AUDIT is not set
+-CONFIG_IKCONFIG=y
+-CONFIG_IKCONFIG_PROC=y
+-CONFIG_SYSFS_DEPRECATED=y
+-# CONFIG_RELAY is not set
+-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+-CONFIG_SYSCTL=y
+-CONFIG_EMBEDDED=y
+-CONFIG_SYSCTL_SYSCALL=y
+-CONFIG_KALLSYMS=y
+-# CONFIG_KALLSYMS_EXTRA_PASS is not set
+-CONFIG_HOTPLUG=y
+-CONFIG_PRINTK=y
+-CONFIG_BUG=y
+-CONFIG_ELF_CORE=y
+-CONFIG_BASE_FULL=y
+-CONFIG_FUTEX=y
+-CONFIG_EPOLL=y
+-CONFIG_SHMEM=y
+-CONFIG_SLAB=y
+-CONFIG_VM_EVENT_COUNTERS=y
+-CONFIG_RT_MUTEXES=y
+-# CONFIG_TINY_SHMEM is not set
+-CONFIG_BASE_SMALL=0
+-# CONFIG_SLOB is not set
+-
+-#
+-# Loadable module support
+-#
+-CONFIG_MODULES=y
+-CONFIG_MODULE_UNLOAD=y
+-CONFIG_MODULE_FORCE_UNLOAD=y
+-CONFIG_MODVERSIONS=y
+-# CONFIG_MODULE_SRCVERSION_ALL is not set
+-CONFIG_KMOD=y
+-
+-#
+-# Block layer
+-#
+-CONFIG_BLOCK=y
+-CONFIG_LBD=y
+-# CONFIG_BLK_DEV_IO_TRACE is not set
+-# CONFIG_LSF is not set
+-
+-#
+-# IO Schedulers
+-#
+-CONFIG_IOSCHED_NOOP=y
+-CONFIG_IOSCHED_AS=y
+-CONFIG_IOSCHED_DEADLINE=y
+-CONFIG_IOSCHED_CFQ=y
+-CONFIG_DEFAULT_AS=y
+-# CONFIG_DEFAULT_DEADLINE is not set
+-# CONFIG_DEFAULT_CFQ is not set
+-# CONFIG_DEFAULT_NOOP is not set
+-CONFIG_DEFAULT_IOSCHED="anticipatory"
+-
+-#
+-# Bus options (PCI, PCMCIA, EISA, ISA, TC)
+-#
+-CONFIG_HW_HAS_PCI=y
+-CONFIG_PCI=y
+-CONFIG_MMU=y
+-
+-#
+-# PCCARD (PCMCIA/CardBus) support
+-#
+-# CONFIG_PCCARD is not set
+-
+-#
+-# PCI Hotplug Support
+-#
+-# CONFIG_HOTPLUG_PCI is not set
+-
+-#
+-# Executable file formats
+-#
+-CONFIG_BINFMT_ELF=y
+-# CONFIG_BINFMT_MISC is not set
+-CONFIG_TRAD_SIGNALS=y
+-
+-#
+-# Power management options
+-#
+-CONFIG_PM=y
+-# CONFIG_PM_LEGACY is not set
+-# CONFIG_PM_DEBUG is not set
+-# CONFIG_PM_SYSFS_DEPRECATED is not set
+-
+-#
+-# Networking
+-#
+-CONFIG_NET=y
+-
+-#
+-# Networking options
+-#
+-# CONFIG_NETDEBUG is not set
+-CONFIG_PACKET=y
+-CONFIG_PACKET_MMAP=y
+-CONFIG_UNIX=y
+-CONFIG_XFRM=y
+-# CONFIG_XFRM_USER is not set
+-# CONFIG_XFRM_SUB_POLICY is not set
+-CONFIG_XFRM_MIGRATE=y
+-CONFIG_NET_KEY=y
+-CONFIG_NET_KEY_MIGRATE=y
+-CONFIG_INET=y
+-CONFIG_IP_MULTICAST=y
+-CONFIG_IP_ADVANCED_ROUTER=y
+-CONFIG_ASK_IP_FIB_HASH=y
+-# CONFIG_IP_FIB_TRIE is not set
+-CONFIG_IP_FIB_HASH=y
+-CONFIG_IP_MULTIPLE_TABLES=y
+-CONFIG_IP_ROUTE_MULTIPATH=y
+-# CONFIG_IP_ROUTE_MULTIPATH_CACHED is not set
+-CONFIG_IP_ROUTE_VERBOSE=y
+-CONFIG_IP_PNP=y
+-# CONFIG_IP_PNP_DHCP is not set
+-CONFIG_IP_PNP_BOOTP=y
+-# CONFIG_IP_PNP_RARP is not set
+-# CONFIG_NET_IPIP is not set
+-# CONFIG_NET_IPGRE is not set
+-# CONFIG_IP_MROUTE is not set
+-# CONFIG_ARPD is not set
+-CONFIG_SYN_COOKIES=y
+-# CONFIG_INET_AH is not set
+-# CONFIG_INET_ESP is not set
+-# CONFIG_INET_IPCOMP is not set
+-# CONFIG_INET_XFRM_TUNNEL is not set
+-CONFIG_INET_TUNNEL=m
+-CONFIG_INET_XFRM_MODE_TRANSPORT=m
+-CONFIG_INET_XFRM_MODE_TUNNEL=m
+-CONFIG_INET_XFRM_MODE_BEET=m
+-CONFIG_INET_DIAG=y
+-CONFIG_INET_TCP_DIAG=y
+-# CONFIG_TCP_CONG_ADVANCED is not set
+-CONFIG_TCP_CONG_CUBIC=y
+-CONFIG_DEFAULT_TCP_CONG="cubic"
+-CONFIG_TCP_MD5SIG=y
+-
+-#
+-# IP: Virtual Server Configuration
+-#
+-# CONFIG_IP_VS is not set
+-CONFIG_IPV6=m
+-# CONFIG_IPV6_PRIVACY is not set
+-# CONFIG_IPV6_ROUTER_PREF is not set
+-# CONFIG_INET6_AH is not set
+-# CONFIG_INET6_ESP is not set
+-# CONFIG_INET6_IPCOMP is not set
+-CONFIG_IPV6_MIP6=y
+-# CONFIG_INET6_XFRM_TUNNEL is not set
+-# CONFIG_INET6_TUNNEL is not set
+-CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+-CONFIG_INET6_XFRM_MODE_TUNNEL=m
+-CONFIG_INET6_XFRM_MODE_BEET=m
+-CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m
+-CONFIG_IPV6_SIT=m
+-# CONFIG_IPV6_TUNNEL is not set
+-CONFIG_IPV6_MULTIPLE_TABLES=y
+-CONFIG_IPV6_SUBTREES=y
+-CONFIG_NETWORK_SECMARK=y
+-CONFIG_NETFILTER=y
+-# CONFIG_NETFILTER_DEBUG is not set
+-
+-#
+-# Core Netfilter Configuration
+-#
+-# CONFIG_NETFILTER_NETLINK is not set
+-CONFIG_NF_CONNTRACK_ENABLED=m
+-CONFIG_NF_CONNTRACK_SUPPORT=y
+-# CONFIG_IP_NF_CONNTRACK_SUPPORT is not set
+-CONFIG_NF_CONNTRACK=m
+-CONFIG_NF_CT_ACCT=y
+-CONFIG_NF_CONNTRACK_MARK=y
+-CONFIG_NF_CONNTRACK_SECMARK=y
+-CONFIG_NF_CONNTRACK_EVENTS=y
+-CONFIG_NF_CT_PROTO_GRE=m
+-CONFIG_NF_CT_PROTO_SCTP=m
+-CONFIG_NF_CONNTRACK_AMANDA=m
+-CONFIG_NF_CONNTRACK_FTP=m
+-CONFIG_NF_CONNTRACK_H323=m
+-CONFIG_NF_CONNTRACK_IRC=m
+-# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set
+-CONFIG_NF_CONNTRACK_PPTP=m
+-CONFIG_NF_CONNTRACK_SANE=m
+-CONFIG_NF_CONNTRACK_SIP=m
+-CONFIG_NF_CONNTRACK_TFTP=m
+-CONFIG_NETFILTER_XTABLES=m
+-CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
+-CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
+-CONFIG_NETFILTER_XT_TARGET_DSCP=m
+-CONFIG_NETFILTER_XT_TARGET_MARK=m
+-CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
+-CONFIG_NETFILTER_XT_TARGET_NFLOG=m
+-CONFIG_NETFILTER_XT_TARGET_NOTRACK=m
+-CONFIG_NETFILTER_XT_TARGET_SECMARK=m
+-CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m
+-CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
+-CONFIG_NETFILTER_XT_MATCH_COMMENT=m
+-CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
+-CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
+-CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
+-CONFIG_NETFILTER_XT_MATCH_DCCP=m
+-CONFIG_NETFILTER_XT_MATCH_DSCP=m
+-CONFIG_NETFILTER_XT_MATCH_ESP=m
+-CONFIG_NETFILTER_XT_MATCH_HELPER=m
+-CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+-CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+-CONFIG_NETFILTER_XT_MATCH_MAC=m
+-CONFIG_NETFILTER_XT_MATCH_MARK=m
+-CONFIG_NETFILTER_XT_MATCH_POLICY=m
+-CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
+-CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
+-CONFIG_NETFILTER_XT_MATCH_QUOTA=m
+-CONFIG_NETFILTER_XT_MATCH_REALM=m
+-CONFIG_NETFILTER_XT_MATCH_SCTP=m
+-CONFIG_NETFILTER_XT_MATCH_STATE=m
+-CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
+-CONFIG_NETFILTER_XT_MATCH_STRING=m
+-CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
+-CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
+-
+-#
+-# IP: Netfilter Configuration
+-#
+-CONFIG_NF_CONNTRACK_IPV4=m
+-CONFIG_NF_CONNTRACK_PROC_COMPAT=y
+-# CONFIG_IP_NF_QUEUE is not set
+-CONFIG_IP_NF_IPTABLES=m
+-CONFIG_IP_NF_MATCH_IPRANGE=m
+-CONFIG_IP_NF_MATCH_TOS=m
+-CONFIG_IP_NF_MATCH_RECENT=m
+-CONFIG_IP_NF_MATCH_ECN=m
+-CONFIG_IP_NF_MATCH_AH=m
+-CONFIG_IP_NF_MATCH_TTL=m
+-CONFIG_IP_NF_MATCH_OWNER=m
+-CONFIG_IP_NF_MATCH_ADDRTYPE=m
+-CONFIG_IP_NF_FILTER=m
+-CONFIG_IP_NF_TARGET_REJECT=m
+-CONFIG_IP_NF_TARGET_LOG=m
+-CONFIG_IP_NF_TARGET_ULOG=m
+-CONFIG_NF_NAT=m
+-CONFIG_NF_NAT_NEEDED=y
+-CONFIG_IP_NF_TARGET_MASQUERADE=m
+-CONFIG_IP_NF_TARGET_REDIRECT=m
+-CONFIG_IP_NF_TARGET_NETMAP=m
+-CONFIG_IP_NF_TARGET_SAME=m
+-CONFIG_NF_NAT_SNMP_BASIC=m
+-CONFIG_NF_NAT_PROTO_GRE=m
+-CONFIG_NF_NAT_FTP=m
+-CONFIG_NF_NAT_IRC=m
+-CONFIG_NF_NAT_TFTP=m
+-CONFIG_NF_NAT_AMANDA=m
+-CONFIG_NF_NAT_PPTP=m
+-CONFIG_NF_NAT_H323=m
+-CONFIG_NF_NAT_SIP=m
+-CONFIG_IP_NF_MANGLE=m
+-CONFIG_IP_NF_TARGET_TOS=m
+-CONFIG_IP_NF_TARGET_ECN=m
+-CONFIG_IP_NF_TARGET_TTL=m
+-CONFIG_IP_NF_TARGET_CLUSTERIP=m
+-CONFIG_IP_NF_RAW=m
+-CONFIG_IP_NF_ARPTABLES=m
+-CONFIG_IP_NF_ARPFILTER=m
+-CONFIG_IP_NF_ARP_MANGLE=m
+-
+-#
+-# IPv6: Netfilter Configuration (EXPERIMENTAL)
+-#
+-CONFIG_NF_CONNTRACK_IPV6=m
+-# CONFIG_IP6_NF_QUEUE is not set
+-CONFIG_IP6_NF_IPTABLES=m
+-CONFIG_IP6_NF_MATCH_RT=m
+-CONFIG_IP6_NF_MATCH_OPTS=m
+-CONFIG_IP6_NF_MATCH_FRAG=m
+-CONFIG_IP6_NF_MATCH_HL=m
+-CONFIG_IP6_NF_MATCH_OWNER=m
+-CONFIG_IP6_NF_MATCH_IPV6HEADER=m
+-CONFIG_IP6_NF_MATCH_AH=m
+-CONFIG_IP6_NF_MATCH_MH=m
+-CONFIG_IP6_NF_MATCH_EUI64=m
+-CONFIG_IP6_NF_FILTER=m
+-CONFIG_IP6_NF_TARGET_LOG=m
+-CONFIG_IP6_NF_TARGET_REJECT=m
+-CONFIG_IP6_NF_MANGLE=m
+-CONFIG_IP6_NF_TARGET_HL=m
+-CONFIG_IP6_NF_RAW=m
+-
+-#
+-# DCCP Configuration (EXPERIMENTAL)
+-#
+-# CONFIG_IP_DCCP is not set
+-
+-#
+-# SCTP Configuration (EXPERIMENTAL)
+-#
+-CONFIG_IP_SCTP=m
+-# CONFIG_SCTP_DBG_MSG is not set
+-# CONFIG_SCTP_DBG_OBJCNT is not set
+-# CONFIG_SCTP_HMAC_NONE is not set
+-# CONFIG_SCTP_HMAC_SHA1 is not set
+-CONFIG_SCTP_HMAC_MD5=y
+-
+-#
+-# TIPC Configuration (EXPERIMENTAL)
+-#
+-# CONFIG_TIPC is not set
+-# CONFIG_ATM is not set
+-# CONFIG_BRIDGE is not set
+-# CONFIG_VLAN_8021Q is not set
+-# CONFIG_DECNET is not set
+-# CONFIG_LLC2 is not set
+-# CONFIG_IPX is not set
+-# CONFIG_ATALK is not set
+-# CONFIG_X25 is not set
+-# CONFIG_LAPB is not set
+-# CONFIG_ECONET is not set
+-# CONFIG_WAN_ROUTER is not set
+-
+-#
+-# QoS and/or fair queueing
+-#
+-# CONFIG_NET_SCHED is not set
+-CONFIG_NET_CLS_ROUTE=y
+-
+-#
+-# Network testing
+-#
+-# CONFIG_NET_PKTGEN is not set
+-# CONFIG_HAMRADIO is not set
+-# CONFIG_IRDA is not set
+-# CONFIG_BT is not set
+-# CONFIG_IEEE80211 is not set
+-CONFIG_FIB_RULES=y
+-
+-#
+-# Device Drivers
+-#
+-
+-#
+-# Generic Driver Options
+-#
+-CONFIG_STANDALONE=y
+-CONFIG_PREVENT_FIRMWARE_BUILD=y
+-CONFIG_FW_LOADER=m
+-# CONFIG_SYS_HYPERVISOR is not set
+-
+-#
+-# Connector - unified userspace <-> kernelspace linker
+-#
+-# CONFIG_CONNECTOR is not set
+-
+-#
+-# Memory Technology Devices (MTD)
+-#
+-CONFIG_MTD=y
+-# CONFIG_MTD_DEBUG is not set
+-# CONFIG_MTD_CONCAT is not set
+-CONFIG_MTD_PARTITIONS=y
+-# CONFIG_MTD_REDBOOT_PARTS is not set
+-CONFIG_MTD_CMDLINE_PARTS=y
+-
+-#
+-# User Modules And Translation Layers
+-#
+-CONFIG_MTD_CHAR=y
+-CONFIG_MTD_BLKDEVS=y
+-CONFIG_MTD_BLOCK=y
+-# CONFIG_FTL is not set
+-# CONFIG_NFTL is not set
+-# CONFIG_INFTL is not set
+-# CONFIG_RFD_FTL is not set
+-# CONFIG_SSFDC is not set
+-
+-#
+-# RAM/ROM/Flash chip drivers
+-#
+-CONFIG_MTD_CFI=y
+-# CONFIG_MTD_JEDECPROBE is not set
+-CONFIG_MTD_GEN_PROBE=y
+-# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+-CONFIG_MTD_MAP_BANK_WIDTH_1=y
+-CONFIG_MTD_MAP_BANK_WIDTH_2=y
+-CONFIG_MTD_MAP_BANK_WIDTH_4=y
+-# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+-# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+-CONFIG_MTD_CFI_I1=y
+-CONFIG_MTD_CFI_I2=y
+-# CONFIG_MTD_CFI_I4 is not set
+-# CONFIG_MTD_CFI_I8 is not set
+-# CONFIG_MTD_CFI_INTELEXT is not set
+-CONFIG_MTD_CFI_AMDSTD=y
+-# CONFIG_MTD_CFI_STAA is not set
+-CONFIG_MTD_CFI_UTIL=y
+-# CONFIG_MTD_RAM is not set
+-# CONFIG_MTD_ROM is not set
+-# CONFIG_MTD_ABSENT is not set
+-# CONFIG_MTD_OBSOLETE_CHIPS is not set
+-
+-#
+-# Mapping drivers for chip access
+-#
+-# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+-CONFIG_MTD_PHYSMAP=y
+-CONFIG_MTD_PHYSMAP_START=0x0
+-CONFIG_MTD_PHYSMAP_LEN=0x0
+-CONFIG_MTD_PHYSMAP_BANKWIDTH=0
+-# CONFIG_MTD_PLATRAM is not set
+-
+-#
+-# Self-contained MTD device drivers
+-#
+-# CONFIG_MTD_PMC551 is not set
+-# CONFIG_MTD_SLRAM is not set
+-# CONFIG_MTD_PHRAM is not set
+-# CONFIG_MTD_MTDRAM is not set
+-# CONFIG_MTD_BLOCK2MTD is not set
+-
+-#
+-# Disk-On-Chip Device Drivers
+-#
+-# CONFIG_MTD_DOC2000 is not set
+-# CONFIG_MTD_DOC2001 is not set
+-# CONFIG_MTD_DOC2001PLUS is not set
+-
+-#
+-# NAND Flash Device Drivers
+-#
+-# CONFIG_MTD_NAND is not set
+-
+-#
+-# OneNAND Flash Device Drivers
+-#
+-# CONFIG_MTD_ONENAND is not set
+-
+-#
+-# Parallel port support
+-#
+-# CONFIG_PARPORT is not set
+-
+-#
+-# Plug and Play support
+-#
+-# CONFIG_PNPACPI is not set
+-
+-#
+-# Block devices
+-#
+-# CONFIG_BLK_CPQ_DA is not set
+-# CONFIG_BLK_CPQ_CISS_DA is not set
+-# CONFIG_BLK_DEV_DAC960 is not set
+-# CONFIG_BLK_DEV_UMEM is not set
+-# CONFIG_BLK_DEV_COW_COMMON is not set
+-CONFIG_BLK_DEV_LOOP=m
+-CONFIG_BLK_DEV_CRYPTOLOOP=m
+-# CONFIG_BLK_DEV_NBD is not set
+-# CONFIG_BLK_DEV_SX8 is not set
+-# CONFIG_BLK_DEV_RAM is not set
+-# CONFIG_BLK_DEV_INITRD is not set
+-# CONFIG_CDROM_PKTCDVD is not set
+-# CONFIG_ATA_OVER_ETH is not set
+-
+-#
+-# Misc devices
+-#
+-CONFIG_SGI_IOC4=m
+-# CONFIG_TIFM_CORE is not set
+-
+-#
+-# ATA/ATAPI/MFM/RLL support
+-#
+-# CONFIG_IDE is not set
+-
+-#
+-# SCSI device support
+-#
+-# CONFIG_RAID_ATTRS is not set
+-CONFIG_SCSI=m
+-CONFIG_SCSI_TGT=m
+-# CONFIG_SCSI_NETLINK is not set
+-# CONFIG_SCSI_PROC_FS is not set
+-
+-#
+-# SCSI support type (disk, tape, CD-ROM)
+-#
+-CONFIG_BLK_DEV_SD=m
+-# CONFIG_CHR_DEV_ST is not set
+-# CONFIG_CHR_DEV_OSST is not set
+-# CONFIG_BLK_DEV_SR is not set
+-CONFIG_CHR_DEV_SG=m
+-# CONFIG_CHR_DEV_SCH is not set
+-
+-#
+-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+-#
+-# CONFIG_SCSI_MULTI_LUN is not set
+-# CONFIG_SCSI_CONSTANTS is not set
+-# CONFIG_SCSI_LOGGING is not set
+-CONFIG_SCSI_SCAN_ASYNC=y
+-
+-#
+-# SCSI Transports
+-#
+-# CONFIG_SCSI_SPI_ATTRS is not set
+-# CONFIG_SCSI_FC_ATTRS is not set
+-# CONFIG_SCSI_ISCSI_ATTRS is not set
+-CONFIG_SCSI_SAS_ATTRS=m
+-CONFIG_SCSI_SAS_LIBSAS=m
+-# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set
+-
+-#
+-# SCSI low-level drivers
+-#
+-# CONFIG_ISCSI_TCP is not set
+-# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+-# CONFIG_SCSI_3W_9XXX is not set
+-# CONFIG_SCSI_ACARD is not set
+-# CONFIG_SCSI_AACRAID is not set
+-# CONFIG_SCSI_AIC7XXX is not set
+-# CONFIG_SCSI_AIC7XXX_OLD is not set
+-# CONFIG_SCSI_AIC79XX is not set
+-CONFIG_SCSI_AIC94XX=m
+-# CONFIG_AIC94XX_DEBUG is not set
+-# CONFIG_SCSI_DPT_I2O is not set
+-# CONFIG_SCSI_ARCMSR is not set
+-# CONFIG_MEGARAID_NEWGEN is not set
+-# CONFIG_MEGARAID_LEGACY is not set
+-# CONFIG_MEGARAID_SAS is not set
+-# CONFIG_SCSI_HPTIOP is not set
+-# CONFIG_SCSI_DMX3191D is not set
+-# CONFIG_SCSI_FUTURE_DOMAIN is not set
+-# CONFIG_SCSI_IPS is not set
+-# CONFIG_SCSI_INITIO is not set
+-# CONFIG_SCSI_INIA100 is not set
+-# CONFIG_SCSI_STEX is not set
+-# CONFIG_SCSI_SYM53C8XX_2 is not set
+-# CONFIG_SCSI_QLOGIC_1280 is not set
+-# CONFIG_SCSI_QLA_FC is not set
+-# CONFIG_SCSI_QLA_ISCSI is not set
+-# CONFIG_SCSI_LPFC is not set
+-# CONFIG_SCSI_DC395x is not set
+-# CONFIG_SCSI_DC390T is not set
+-# CONFIG_SCSI_NSP32 is not set
+-# CONFIG_SCSI_DEBUG is not set
+-# CONFIG_SCSI_SRP is not set
+-
+-#
+-# Serial ATA (prod) and Parallel ATA (experimental) drivers
+-#
+-# CONFIG_ATA is not set
+-
+-#
+-# Multi-device support (RAID and LVM)
+-#
+-# CONFIG_MD is not set
+-
+-#
+-# Fusion MPT device support
+-#
+-# CONFIG_FUSION is not set
+-# CONFIG_FUSION_SPI is not set
+-# CONFIG_FUSION_FC is not set
+-# CONFIG_FUSION_SAS is not set
+-
+-#
+-# IEEE 1394 (FireWire) support
+-#
+-# CONFIG_IEEE1394 is not set
+-
+-#
+-# I2O device support
+-#
+-# CONFIG_I2O is not set
+-
+-#
+-# Network device support
+-#
+-CONFIG_NETDEVICES=y
+-# CONFIG_DUMMY is not set
+-# CONFIG_BONDING is not set
+-# CONFIG_EQUALIZER is not set
+-CONFIG_TUN=m
+-
+-#
+-# ARCnet devices
+-#
+-# CONFIG_ARCNET is not set
+-
+-#
+-# PHY device support
+-#
+-# CONFIG_PHYLIB is not set
+-
+-#
+-# Ethernet (10 or 100Mbit)
+-#
+-CONFIG_NET_ETHERNET=y
+-CONFIG_MII=y
+-# CONFIG_HAPPYMEAL is not set
+-# CONFIG_SUNGEM is not set
+-# CONFIG_CASSINI is not set
+-# CONFIG_NET_VENDOR_3COM is not set
+-# CONFIG_DM9000 is not set
+-
+-#
+-# Tulip family network device support
+-#
+-# CONFIG_NET_TULIP is not set
+-# CONFIG_HP100 is not set
+-CONFIG_NET_PCI=y
+-# CONFIG_PCNET32 is not set
+-# CONFIG_AMD8111_ETH is not set
+-# CONFIG_ADAPTEC_STARFIRE is not set
+-# CONFIG_B44 is not set
+-# CONFIG_FORCEDETH is not set
+-# CONFIG_DGRS is not set
+-# CONFIG_EEPRO100 is not set
+-# CONFIG_E100 is not set
+-# CONFIG_FEALNX is not set
+-CONFIG_NATSEMI=y
+-# CONFIG_NE2K_PCI is not set
+-# CONFIG_8139CP is not set
+-# CONFIG_8139TOO is not set
+-# CONFIG_SIS900 is not set
+-# CONFIG_EPIC100 is not set
+-# CONFIG_SUNDANCE is not set
+-# CONFIG_TLAN is not set
+-# CONFIG_VIA_RHINE is not set
+-# CONFIG_SC92031 is not set
+-
+-#
+-# Ethernet (1000 Mbit)
+-#
+-# CONFIG_ACENIC is not set
+-# CONFIG_DL2K is not set
+-# CONFIG_E1000 is not set
+-# CONFIG_NS83820 is not set
+-# CONFIG_HAMACHI is not set
+-# CONFIG_YELLOWFIN is not set
+-# CONFIG_R8169 is not set
+-# CONFIG_SIS190 is not set
+-# CONFIG_SKGE is not set
+-# CONFIG_SKY2 is not set
+-# CONFIG_SK98LIN is not set
+-# CONFIG_VIA_VELOCITY is not set
+-# CONFIG_TIGON3 is not set
+-# CONFIG_BNX2 is not set
+-CONFIG_QLA3XXX=m
+-# CONFIG_ATL1 is not set
+-
+-#
+-# Ethernet (10000 Mbit)
+-#
+-# CONFIG_CHELSIO_T1 is not set
+-CONFIG_CHELSIO_T3=m
+-# CONFIG_IXGB is not set
+-# CONFIG_S2IO is not set
+-# CONFIG_MYRI10GE is not set
+-CONFIG_NETXEN_NIC=m
+-
+-#
+-# Token Ring devices
+-#
+-# CONFIG_TR is not set
+-
+-#
+-# Wireless LAN (non-hamradio)
+-#
+-# CONFIG_NET_RADIO is not set
+-
+-#
+-# Wan interfaces
+-#
+-# CONFIG_WAN is not set
+-# CONFIG_FDDI is not set
+-# CONFIG_HIPPI is not set
+-CONFIG_PPP=m
+-# CONFIG_PPP_MULTILINK is not set
+-# CONFIG_PPP_FILTER is not set
+-CONFIG_PPP_ASYNC=m
+-CONFIG_PPP_SYNC_TTY=m
+-CONFIG_PPP_DEFLATE=m
+-# CONFIG_PPP_BSDCOMP is not set
+-# CONFIG_PPP_MPPE is not set
+-# CONFIG_PPPOE is not set
+-# CONFIG_SLIP is not set
+-CONFIG_SLHC=m
+-# CONFIG_NET_FC is not set
+-# CONFIG_SHAPER is not set
+-# CONFIG_NETCONSOLE is not set
+-# CONFIG_NETPOLL is not set
+-# CONFIG_NET_POLL_CONTROLLER is not set
+-
+-#
+-# ISDN subsystem
+-#
+-# CONFIG_ISDN is not set
+-
+-#
+-# Telephony Support
+-#
+-# CONFIG_PHONE is not set
+-
+-#
+-# Input device support
+-#
+-CONFIG_INPUT=y
+-# CONFIG_INPUT_FF_MEMLESS is not set
+-
+-#
+-# Userland interfaces
+-#
+-# CONFIG_INPUT_MOUSEDEV is not set
+-# CONFIG_INPUT_JOYDEV is not set
+-# CONFIG_INPUT_TSDEV is not set
+-CONFIG_INPUT_EVDEV=m
+-# CONFIG_INPUT_EVBUG is not set
+-
+-#
+-# Input Device Drivers
+-#
+-# CONFIG_INPUT_KEYBOARD is not set
+-# CONFIG_INPUT_MOUSE is not set
+-# CONFIG_INPUT_JOYSTICK is not set
+-# CONFIG_INPUT_TOUCHSCREEN is not set
+-# CONFIG_INPUT_MISC is not set
+-
+-#
+-# Hardware I/O ports
+-#
+-# CONFIG_SERIO is not set
+-# CONFIG_GAMEPORT is not set
+-
+-#
+-# Character devices
+-#
+-# CONFIG_VT is not set
+-# CONFIG_SERIAL_NONSTANDARD is not set
+-
+-#
+-# Serial drivers
+-#
+-CONFIG_SERIAL_8250=y
+-CONFIG_SERIAL_8250_CONSOLE=y
+-CONFIG_SERIAL_8250_PCI=y
+-CONFIG_SERIAL_8250_NR_UARTS=4
+-CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+-# CONFIG_SERIAL_8250_EXTENDED is not set
+-
+-#
+-# Non-8250 serial port support
+-#
+-CONFIG_SERIAL_CORE=y
+-CONFIG_SERIAL_CORE_CONSOLE=y
+-# CONFIG_SERIAL_JSM is not set
+-CONFIG_UNIX98_PTYS=y
+-CONFIG_LEGACY_PTYS=y
+-CONFIG_LEGACY_PTY_COUNT=256
+-
+-#
+-# IPMI
+-#
+-# CONFIG_IPMI_HANDLER is not set
+-
+-#
+-# Watchdog Cards
+-#
+-# CONFIG_WATCHDOG is not set
+-# CONFIG_HW_RANDOM is not set
+-CONFIG_RTC=m
+-# CONFIG_GEN_RTC is not set
+-# CONFIG_DTLK is not set
+-# CONFIG_R3964 is not set
+-# CONFIG_APPLICOM is not set
+-# CONFIG_DRM is not set
+-# CONFIG_RAW_DRIVER is not set
+-
+-#
+-# TPM devices
+-#
+-# CONFIG_TCG_TPM is not set
+-
+-#
+-# I2C support
+-#
+-CONFIG_I2C=y
+-CONFIG_I2C_CHARDEV=y
+-
+-#
+-# I2C Algorithms
+-#
+-# CONFIG_I2C_ALGOBIT is not set
+-# CONFIG_I2C_ALGOPCF is not set
+-# CONFIG_I2C_ALGOPCA is not set
+-
+-#
+-# I2C Hardware Bus support
+-#
+-# CONFIG_I2C_ALI1535 is not set
+-# CONFIG_I2C_ALI1563 is not set
+-# CONFIG_I2C_ALI15X3 is not set
+-# CONFIG_I2C_AMD756 is not set
+-# CONFIG_I2C_AMD8111 is not set
+-# CONFIG_I2C_I801 is not set
+-# CONFIG_I2C_I810 is not set
+-# CONFIG_I2C_PIIX4 is not set
+-# CONFIG_I2C_NFORCE2 is not set
+-# CONFIG_I2C_OCORES is not set
+-# CONFIG_I2C_PARPORT_LIGHT is not set
+-# CONFIG_I2C_PASEMI is not set
+-# CONFIG_I2C_PROSAVAGE is not set
+-# CONFIG_I2C_SAVAGE4 is not set
+-# CONFIG_I2C_SIS5595 is not set
+-# CONFIG_I2C_SIS630 is not set
+-# CONFIG_I2C_SIS96X is not set
+-# CONFIG_I2C_STUB is not set
+-# CONFIG_I2C_VIA is not set
+-# CONFIG_I2C_VIAPRO is not set
+-# CONFIG_I2C_VOODOO3 is not set
+-# CONFIG_I2C_PCA_ISA is not set
+-
+-#
+-# Miscellaneous I2C Chip support
+-#
+-# CONFIG_SENSORS_DS1337 is not set
+-# CONFIG_SENSORS_DS1374 is not set
+-# CONFIG_EEPROM_LEGACY is not set
+-# CONFIG_SENSORS_PCF8574 is not set
+-# CONFIG_SENSORS_PCA9539 is not set
+-# CONFIG_SENSORS_PCF8591 is not set
+-# CONFIG_SENSORS_MAX6875 is not set
+-CONFIG_I2C_DEBUG_CORE=y
+-# CONFIG_I2C_DEBUG_ALGO is not set
+-CONFIG_I2C_DEBUG_BUS=y
+-# CONFIG_I2C_DEBUG_CHIP is not set
+-
+-#
+-# SPI support
+-#
+-# CONFIG_SPI is not set
+-# CONFIG_SPI_MASTER is not set
+-
+-#
+-# Dallas's 1-wire bus
+-#
+-# CONFIG_W1 is not set
+-
+-#
+-# Hardware Monitoring support
+-#
+-CONFIG_HWMON=y
+-# CONFIG_HWMON_VID is not set
+-# CONFIG_SENSORS_ABITUGURU is not set
+-# CONFIG_SENSORS_ADM1021 is not set
+-# CONFIG_SENSORS_ADM1025 is not set
+-# CONFIG_SENSORS_ADM1026 is not set
+-# CONFIG_SENSORS_ADM1029 is not set
+-# CONFIG_SENSORS_ADM1031 is not set
+-# CONFIG_SENSORS_ADM9240 is not set
+-# CONFIG_SENSORS_ASB100 is not set
+-# CONFIG_SENSORS_ATXP1 is not set
+-# CONFIG_SENSORS_DS1621 is not set
+-# CONFIG_SENSORS_F71805F is not set
+-# CONFIG_SENSORS_FSCHER is not set
+-# CONFIG_SENSORS_FSCPOS is not set
+-# CONFIG_SENSORS_GL518SM is not set
+-# CONFIG_SENSORS_GL520SM is not set
+-# CONFIG_SENSORS_IT87 is not set
+-# CONFIG_SENSORS_LM63 is not set
+-# CONFIG_SENSORS_LM75 is not set
+-# CONFIG_SENSORS_LM77 is not set
+-# CONFIG_SENSORS_LM78 is not set
+-# CONFIG_SENSORS_LM80 is not set
+-# CONFIG_SENSORS_LM83 is not set
+-# CONFIG_SENSORS_LM85 is not set
+-# CONFIG_SENSORS_LM87 is not set
+-# CONFIG_SENSORS_LM90 is not set
+-# CONFIG_SENSORS_LM92 is not set
+-# CONFIG_SENSORS_MAX1619 is not set
+-# CONFIG_SENSORS_PC87360 is not set
+-# CONFIG_SENSORS_PC87427 is not set
+-# CONFIG_SENSORS_SIS5595 is not set
+-# CONFIG_SENSORS_SMSC47M1 is not set
+-# CONFIG_SENSORS_SMSC47M192 is not set
+-# CONFIG_SENSORS_SMSC47B397 is not set
+-# CONFIG_SENSORS_VIA686A is not set
+-# CONFIG_SENSORS_VT1211 is not set
+-# CONFIG_SENSORS_VT8231 is not set
+-# CONFIG_SENSORS_W83781D is not set
+-# CONFIG_SENSORS_W83791D is not set
+-# CONFIG_SENSORS_W83792D is not set
+-# CONFIG_SENSORS_W83793 is not set
+-# CONFIG_SENSORS_W83L785TS is not set
+-# CONFIG_SENSORS_W83627HF is not set
+-# CONFIG_SENSORS_W83627EHF is not set
+-# CONFIG_HWMON_DEBUG_CHIP is not set
+-
+-#
+-# Multimedia devices
+-#
+-# CONFIG_VIDEO_DEV is not set
+-
+-#
+-# Digital Video Broadcasting Devices
+-#
+-# CONFIG_DVB is not set
+-
+-#
+-# Graphics support
+-#
+-# CONFIG_FIRMWARE_EDID is not set
+-# CONFIG_FB is not set
+-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+-
+-#
+-# Sound
+-#
+-# CONFIG_SOUND is not set
+-
+-#
+-# HID Devices
+-#
+-# CONFIG_HID is not set
+-
+-#
+-# USB support
+-#
+-CONFIG_USB_ARCH_HAS_HCD=y
+-CONFIG_USB_ARCH_HAS_OHCI=y
+-CONFIG_USB_ARCH_HAS_EHCI=y
+-# CONFIG_USB is not set
+-
+-#
+-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+-#
+-
+-#
+-# USB Gadget Support
+-#
+-# CONFIG_USB_GADGET is not set
+-
+-#
+-# MMC/SD Card support
+-#
+-# CONFIG_MMC is not set
+-
+-#
+-# LED devices
+-#
+-# CONFIG_NEW_LEDS is not set
+-
+-#
+-# LED drivers
+-#
+-
+-#
+-# LED Triggers
+-#
+-
+-#
+-# InfiniBand support
+-#
+-# CONFIG_INFINIBAND is not set
+-
+-#
+-# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+-#
+-
+-#
+-# Real Time Clock
+-#
+-# CONFIG_RTC_CLASS is not set
+-
+-#
+-# DMA Engine support
+-#
+-# CONFIG_DMA_ENGINE is not set
+-
+-#
+-# DMA Clients
+-#
+-
+-#
+-# DMA Devices
+-#
+-
+-#
+-# Auxiliary Display support
+-#
+-
+-#
+-# Virtualization
+-#
+-
+-#
+-# File systems
+-#
+-CONFIG_EXT2_FS=y
+-CONFIG_EXT2_FS_XATTR=y
+-CONFIG_EXT2_FS_POSIX_ACL=y
+-CONFIG_EXT2_FS_SECURITY=y
+-# CONFIG_EXT2_FS_XIP is not set
+-CONFIG_EXT3_FS=m
+-CONFIG_EXT3_FS_XATTR=y
+-# CONFIG_EXT3_FS_POSIX_ACL is not set
+-# CONFIG_EXT3_FS_SECURITY is not set
+-# CONFIG_EXT4DEV_FS is not set
+-CONFIG_JBD=m
+-# CONFIG_JBD_DEBUG is not set
+-CONFIG_FS_MBCACHE=y
+-# CONFIG_REISERFS_FS is not set
+-# CONFIG_JFS_FS is not set
+-CONFIG_FS_POSIX_ACL=y
+-CONFIG_XFS_FS=m
+-# CONFIG_XFS_QUOTA is not set
+-# CONFIG_XFS_SECURITY is not set
+-# CONFIG_XFS_POSIX_ACL is not set
+-# CONFIG_XFS_RT is not set
+-# CONFIG_GFS2_FS is not set
+-# CONFIG_OCFS2_FS is not set
+-# CONFIG_MINIX_FS is not set
+-# CONFIG_ROMFS_FS is not set
+-CONFIG_INOTIFY=y
+-CONFIG_INOTIFY_USER=y
+-# CONFIG_QUOTA is not set
+-# CONFIG_DNOTIFY is not set
+-# CONFIG_AUTOFS_FS is not set
+-CONFIG_AUTOFS4_FS=m
+-# CONFIG_FUSE_FS is not set
+-CONFIG_GENERIC_ACL=y
+-
+-#
+-# CD-ROM/DVD Filesystems
+-#
+-# CONFIG_ISO9660_FS is not set
+-# CONFIG_UDF_FS is not set
+-
+-#
+-# DOS/FAT/NT Filesystems
+-#
+-CONFIG_FAT_FS=y
+-CONFIG_MSDOS_FS=y
+-CONFIG_VFAT_FS=y
+-CONFIG_FAT_DEFAULT_CODEPAGE=437
+-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+-CONFIG_NTFS_FS=m
+-# CONFIG_NTFS_DEBUG is not set
+-# CONFIG_NTFS_RW is not set
+-
+-#
+-# Pseudo filesystems
+-#
+-CONFIG_PROC_FS=y
+-CONFIG_PROC_KCORE=y
+-CONFIG_PROC_SYSCTL=y
+-CONFIG_SYSFS=y
+-CONFIG_TMPFS=y
+-CONFIG_TMPFS_POSIX_ACL=y
+-# CONFIG_HUGETLB_PAGE is not set
+-CONFIG_RAMFS=y
+-CONFIG_CONFIGFS_FS=m
+-
+-#
+-# Miscellaneous filesystems
+-#
+-# CONFIG_ADFS_FS is not set
+-# CONFIG_AFFS_FS is not set
+-# CONFIG_HFS_FS is not set
+-# CONFIG_HFSPLUS_FS is not set
+-# CONFIG_BEFS_FS is not set
+-# CONFIG_BFS_FS is not set
+-# CONFIG_EFS_FS is not set
+-CONFIG_JFFS2_FS=y
+-CONFIG_JFFS2_FS_DEBUG=0
+-CONFIG_JFFS2_FS_WRITEBUFFER=y
+-# CONFIG_JFFS2_SUMMARY is not set
+-# CONFIG_JFFS2_FS_XATTR is not set
+-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
+-CONFIG_JFFS2_ZLIB=y
+-CONFIG_JFFS2_RTIME=y
+-# CONFIG_JFFS2_RUBIN is not set
+-# CONFIG_JFFS2_CMODE_NONE is not set
+-CONFIG_JFFS2_CMODE_PRIORITY=y
+-# CONFIG_JFFS2_CMODE_SIZE is not set
+-CONFIG_CRAMFS=y
+-# CONFIG_VXFS_FS is not set
+-# CONFIG_HPFS_FS is not set
+-# CONFIG_QNX4FS_FS is not set
+-# CONFIG_SYSV_FS is not set
+-# CONFIG_UFS_FS is not set
+-
+-#
+-# Network File Systems
+-#
+-CONFIG_NFS_FS=y
+-CONFIG_NFS_V3=y
+-# CONFIG_NFS_V3_ACL is not set
+-CONFIG_NFS_V4=y
+-CONFIG_NFS_DIRECTIO=y
+-CONFIG_NFSD=m
+-CONFIG_NFSD_V3=y
+-# CONFIG_NFSD_V3_ACL is not set
+-# CONFIG_NFSD_V4 is not set
+-CONFIG_NFSD_TCP=y
+-CONFIG_ROOT_NFS=y
+-CONFIG_LOCKD=y
+-CONFIG_LOCKD_V4=y
+-CONFIG_EXPORTFS=m
+-CONFIG_NFS_COMMON=y
+-CONFIG_SUNRPC=y
+-CONFIG_SUNRPC_GSS=y
+-CONFIG_RPCSEC_GSS_KRB5=y
+-# CONFIG_RPCSEC_GSS_SPKM3 is not set
+-CONFIG_SMB_FS=m
+-# CONFIG_SMB_NLS_DEFAULT is not set
+-# CONFIG_CIFS is not set
+-# CONFIG_NCP_FS is not set
+-# CONFIG_CODA_FS is not set
+-# CONFIG_AFS_FS is not set
+-# CONFIG_9P_FS is not set
+-
+-#
+-# Partition Types
+-#
+-# CONFIG_PARTITION_ADVANCED is not set
+-CONFIG_MSDOS_PARTITION=y
+-
+-#
+-# Native Language Support
+-#
+-CONFIG_NLS=y
+-CONFIG_NLS_DEFAULT=""
+-CONFIG_NLS_CODEPAGE_437=m
+-# CONFIG_NLS_CODEPAGE_737 is not set
+-# CONFIG_NLS_CODEPAGE_775 is not set
+-# CONFIG_NLS_CODEPAGE_850 is not set
+-# CONFIG_NLS_CODEPAGE_852 is not set
+-# CONFIG_NLS_CODEPAGE_855 is not set
+-# CONFIG_NLS_CODEPAGE_857 is not set
+-# CONFIG_NLS_CODEPAGE_860 is not set
+-# CONFIG_NLS_CODEPAGE_861 is not set
+-# CONFIG_NLS_CODEPAGE_862 is not set
+-# CONFIG_NLS_CODEPAGE_863 is not set
+-# CONFIG_NLS_CODEPAGE_864 is not set
+-# CONFIG_NLS_CODEPAGE_865 is not set
+-# CONFIG_NLS_CODEPAGE_866 is not set
+-# CONFIG_NLS_CODEPAGE_869 is not set
+-# CONFIG_NLS_CODEPAGE_936 is not set
+-# CONFIG_NLS_CODEPAGE_950 is not set
+-# CONFIG_NLS_CODEPAGE_932 is not set
+-# CONFIG_NLS_CODEPAGE_949 is not set
+-# CONFIG_NLS_CODEPAGE_874 is not set
+-# CONFIG_NLS_ISO8859_8 is not set
+-# CONFIG_NLS_CODEPAGE_1250 is not set
+-# CONFIG_NLS_CODEPAGE_1251 is not set
+-CONFIG_NLS_ASCII=m
+-CONFIG_NLS_ISO8859_1=m
+-# CONFIG_NLS_ISO8859_2 is not set
+-# CONFIG_NLS_ISO8859_3 is not set
+-# CONFIG_NLS_ISO8859_4 is not set
+-# CONFIG_NLS_ISO8859_5 is not set
+-# CONFIG_NLS_ISO8859_6 is not set
+-# CONFIG_NLS_ISO8859_7 is not set
+-# CONFIG_NLS_ISO8859_9 is not set
+-# CONFIG_NLS_ISO8859_13 is not set
+-# CONFIG_NLS_ISO8859_14 is not set
+-# CONFIG_NLS_ISO8859_15 is not set
+-# CONFIG_NLS_KOI8_R is not set
+-# CONFIG_NLS_KOI8_U is not set
+-CONFIG_NLS_UTF8=m
+-
+-#
+-# Distributed Lock Manager
+-#
+-CONFIG_DLM=m
+-CONFIG_DLM_TCP=y
+-# CONFIG_DLM_SCTP is not set
+-# CONFIG_DLM_DEBUG is not set
+-
+-#
+-# Profiling support
+-#
+-# CONFIG_PROFILING is not set
+-
+-#
+-# Kernel hacking
+-#
+-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+-# CONFIG_PRINTK_TIME is not set
+-CONFIG_ENABLE_MUST_CHECK=y
+-# CONFIG_MAGIC_SYSRQ is not set
+-# CONFIG_UNUSED_SYMBOLS is not set
+-# CONFIG_DEBUG_FS is not set
+-# CONFIG_HEADERS_CHECK is not set
+-# CONFIG_DEBUG_KERNEL is not set
+-CONFIG_LOG_BUF_SHIFT=14
+-CONFIG_CROSSCOMPILE=y
+-CONFIG_CMDLINE="console=ttyS0,115200 mem=192m ip=bootp root=/dev/nfs rw"
+-
+-#
+-# Security options
+-#
+-# CONFIG_KEYS is not set
+-# CONFIG_SECURITY is not set
+-
+-#
+-# Cryptographic options
+-#
+-CONFIG_CRYPTO=y
+-CONFIG_CRYPTO_ALGAPI=y
+-CONFIG_CRYPTO_BLKCIPHER=y
+-CONFIG_CRYPTO_HASH=y
+-CONFIG_CRYPTO_MANAGER=y
+-CONFIG_CRYPTO_HMAC=y
+-CONFIG_CRYPTO_XCBC=m
+-# CONFIG_CRYPTO_NULL is not set
+-# CONFIG_CRYPTO_MD4 is not set
+-CONFIG_CRYPTO_MD5=y
+-# CONFIG_CRYPTO_SHA1 is not set
+-# CONFIG_CRYPTO_SHA256 is not set
+-# CONFIG_CRYPTO_SHA512 is not set
+-# CONFIG_CRYPTO_WP512 is not set
+-# CONFIG_CRYPTO_TGR192 is not set
+-CONFIG_CRYPTO_GF128MUL=m
+-CONFIG_CRYPTO_ECB=m
+-CONFIG_CRYPTO_CBC=y
+-CONFIG_CRYPTO_PCBC=m
+-CONFIG_CRYPTO_LRW=m
+-CONFIG_CRYPTO_DES=y
+-CONFIG_CRYPTO_FCRYPT=m
+-# CONFIG_CRYPTO_BLOWFISH is not set
+-# CONFIG_CRYPTO_TWOFISH is not set
+-# CONFIG_CRYPTO_SERPENT is not set
+-# CONFIG_CRYPTO_AES is not set
+-# CONFIG_CRYPTO_CAST5 is not set
+-# CONFIG_CRYPTO_CAST6 is not set
+-# CONFIG_CRYPTO_TEA is not set
+-# CONFIG_CRYPTO_ARC4 is not set
+-# CONFIG_CRYPTO_KHAZAD is not set
+-# CONFIG_CRYPTO_ANUBIS is not set
+-# CONFIG_CRYPTO_DEFLATE is not set
+-# CONFIG_CRYPTO_MICHAEL_MIC is not set
+-# CONFIG_CRYPTO_CRC32C is not set
+-CONFIG_CRYPTO_CAMELLIA=m
+-# CONFIG_CRYPTO_TEST is not set
+-
+-#
+-# Hardware crypto devices
+-#
+-
+-#
+-# Library routines
+-#
+-CONFIG_BITREVERSE=y
+-CONFIG_CRC_CCITT=m
+-# CONFIG_CRC16 is not set
+-CONFIG_CRC32=y
+-# CONFIG_LIBCRC32C is not set
+-CONFIG_ZLIB_INFLATE=y
+-CONFIG_ZLIB_DEFLATE=y
+-CONFIG_TEXTSEARCH=y
+-CONFIG_TEXTSEARCH_KMP=m
+-CONFIG_TEXTSEARCH_BM=m
+-CONFIG_TEXTSEARCH_FSM=m
+-CONFIG_PLIST=y
+-CONFIG_HAS_IOMEM=y
+-CONFIG_HAS_IOPORT=y
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/configs/rbtx49xx_defconfig linux-2.6.29-rc3.owrt/arch/mips/configs/rbtx49xx_defconfig
+--- linux-2.6.29.owrt/arch/mips/configs/rbtx49xx_defconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/configs/rbtx49xx_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-rc7
+-# Wed Mar 4 23:08:06 2009
++# Linux kernel version: 2.6.26-rc9
++# Fri Jul 11 23:03:21 2008
+ #
+ CONFIG_MIPS=y
+
+@@ -18,10 +18,8 @@
+ # CONFIG_LEMOTE_FULONG is not set
+ # CONFIG_MIPS_MALTA is not set
+ # CONFIG_MIPS_SIM is not set
+-# CONFIG_MACH_EMMA is not set
++# CONFIG_MARKEINS is not set
+ # CONFIG_MACH_VR41XX is not set
+-# CONFIG_NXP_STB220 is not set
+-# CONFIG_NXP_STB225 is not set
+ # CONFIG_PNX8550_JBS is not set
+ # CONFIG_PNX8550_STB810 is not set
+ # CONFIG_PMC_MSP is not set
+@@ -41,28 +39,20 @@
+ # CONFIG_SNI_RM is not set
+ # CONFIG_MACH_TX39XX is not set
+ CONFIG_MACH_TX49XX=y
+-# CONFIG_MIKROTIK_RB532 is not set
+ # CONFIG_WR_PPMC is not set
+-# CONFIG_CAVIUM_OCTEON_SIMULATOR is not set
+-# CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set
+-CONFIG_MACH_TXX9=y
+ CONFIG_TOSHIBA_RBTX4927=y
+ CONFIG_TOSHIBA_RBTX4938=y
+-CONFIG_TOSHIBA_RBTX4939=y
+ CONFIG_SOC_TX4927=y
+ CONFIG_SOC_TX4938=y
+-CONFIG_SOC_TX4939=y
+-CONFIG_TXX9_7SEGLED=y
+ # CONFIG_TOSHIBA_FPCIB0 is not set
+ CONFIG_PICMG_PCI_BACKPLANE_DEFAULT=y
+
+ #
+ # Multiplex Pin Select
+ #
+-# CONFIG_TOSHIBA_RBTX4938_MPLEX_PIO58_61 is not set
++CONFIG_TOSHIBA_RBTX4938_MPLEX_PIO58_61=y
+ # CONFIG_TOSHIBA_RBTX4938_MPLEX_NAND is not set
+ # CONFIG_TOSHIBA_RBTX4938_MPLEX_ATA is not set
+-CONFIG_TOSHIBA_RBTX4938_MPLEX_KEEP=y
+ CONFIG_PCI_TX4927=y
+ CONFIG_RWSEM_GENERIC_SPINLOCK=y
+ # CONFIG_ARCH_HAS_ILOG2_U32 is not set
+@@ -74,18 +64,14 @@
+ CONFIG_GENERIC_CLOCKEVENTS=y
+ CONFIG_GENERIC_TIME=y
+ CONFIG_GENERIC_CMOS_UPDATE=y
+-CONFIG_SCHED_OMIT_FRAME_POINTER=y
++CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+ CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
+-CONFIG_CEVT_R4K_LIB=y
+ CONFIG_CEVT_R4K=y
+ CONFIG_CEVT_TXX9=y
+-CONFIG_CSRC_R4K_LIB=y
+ CONFIG_CSRC_R4K=y
+ CONFIG_GPIO_TXX9=y
+ CONFIG_DMA_NONCOHERENT=y
+ CONFIG_DMA_NEED_PCI_MAP_STATE=y
+-CONFIG_EARLY_PRINTK=y
+-CONFIG_SYS_HAS_EARLY_PRINTK=y
+ # CONFIG_HOTPLUG_CPU is not set
+ # CONFIG_NO_IOPORT is not set
+ CONFIG_GENERIC_GPIO=y
+@@ -114,7 +100,6 @@
+ CONFIG_CPU_TX49XX=y
+ # CONFIG_CPU_R5000 is not set
+ # CONFIG_CPU_R5432 is not set
+-# CONFIG_CPU_R5500 is not set
+ # CONFIG_CPU_R6000 is not set
+ # CONFIG_CPU_NEVADA is not set
+ # CONFIG_CPU_R8000 is not set
+@@ -122,7 +107,6 @@
+ # CONFIG_CPU_RM7000 is not set
+ # CONFIG_CPU_RM9000 is not set
+ # CONFIG_CPU_SB1 is not set
+-# CONFIG_CPU_CAVIUM_OCTEON is not set
+ CONFIG_SYS_HAS_CPU_TX49XX=y
+ CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
+ CONFIG_SYS_SUPPORTS_64BIT_KERNEL=y
+@@ -150,12 +134,13 @@
+ CONFIG_ARCH_POPULATES_NODE_MAP=y
+ CONFIG_FLATMEM=y
+ CONFIG_FLAT_NODE_MEM_MAP=y
++# CONFIG_SPARSEMEM_STATIC is not set
++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
+ CONFIG_PAGEFLAGS_EXTENDED=y
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+-# CONFIG_PHYS_ADDR_T_64BIT is not set
++# CONFIG_RESOURCES_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=0
+ CONFIG_VIRT_TO_BUS=y
+-CONFIG_UNEVICTABLE_LRU=y
+ CONFIG_TICK_ONESHOT=y
+ CONFIG_NO_HZ=y
+ CONFIG_HIGH_RES_TIMERS=y
+@@ -191,15 +176,6 @@
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
+ # CONFIG_AUDIT is not set
+-
+-#
+-# RCU Subsystem
+-#
+-CONFIG_CLASSIC_RCU=y
+-# CONFIG_TREE_RCU is not set
+-# CONFIG_PREEMPT_RCU is not set
+-# CONFIG_TREE_RCU_TRACE is not set
+-# CONFIG_PREEMPT_RCU_TRACE is not set
+ CONFIG_IKCONFIG=y
+ CONFIG_IKCONFIG_PROC=y
+ CONFIG_LOG_BUF_SHIFT=14
+@@ -214,6 +190,7 @@
+ CONFIG_SYSCTL=y
+ CONFIG_EMBEDDED=y
+ CONFIG_SYSCTL_SYSCALL=y
++CONFIG_SYSCTL_SYSCALL_CHECK=y
+ CONFIG_KALLSYMS=y
+ # CONFIG_KALLSYMS_EXTRA_PASS is not set
+ # CONFIG_HOTPLUG is not set
+@@ -230,26 +207,30 @@
+ CONFIG_TIMERFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_SHMEM=y
+-CONFIG_AIO=y
+ CONFIG_VM_EVENT_COUNTERS=y
+-CONFIG_PCI_QUIRKS=y
+ CONFIG_SLAB=y
+ # CONFIG_SLUB is not set
+ # CONFIG_SLOB is not set
+ # CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
+ CONFIG_HAVE_OPROFILE=y
+-# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
++# CONFIG_HAVE_KPROBES is not set
++# CONFIG_HAVE_KRETPROBES is not set
++# CONFIG_HAVE_DMA_ATTRS is not set
++CONFIG_PROC_PAGE_MONITOR=y
+ CONFIG_SLABINFO=y
++# CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+ CONFIG_MODULES=y
+ # CONFIG_MODULE_FORCE_LOAD is not set
+-CONFIG_MODULE_UNLOAD=y
++# CONFIG_MODULE_UNLOAD is not set
+ # CONFIG_MODVERSIONS is not set
+ # CONFIG_MODULE_SRCVERSION_ALL is not set
++CONFIG_KMOD=y
+ CONFIG_BLOCK=y
+ # CONFIG_LBD is not set
+ # CONFIG_BLK_DEV_IO_TRACE is not set
+-# CONFIG_BLK_DEV_INTEGRITY is not set
++# CONFIG_LSF is not set
+
+ #
+ # IO Schedulers
+@@ -263,8 +244,7 @@
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
+-# CONFIG_PROBE_INITRD_HEADER is not set
+-# CONFIG_FREEZER is not set
++CONFIG_CLASSIC_RCU=y
+
+ #
+ # Bus options (PCI, PCMCIA, EISA, ISA, TC)
+@@ -274,15 +254,12 @@
+ CONFIG_PCI_DOMAINS=y
+ # CONFIG_ARCH_SUPPORTS_MSI is not set
+ # CONFIG_PCI_LEGACY is not set
+-# CONFIG_PCI_STUB is not set
+ CONFIG_MMU=y
+
+ #
+ # Executable file formats
+ #
+ CONFIG_BINFMT_ELF=y
+-# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+-# CONFIG_HAVE_AOUT is not set
+ # CONFIG_BINFMT_MISC is not set
+ CONFIG_TRAD_SIGNALS=y
+
+@@ -291,12 +268,15 @@
+ #
+ CONFIG_ARCH_SUSPEND_POSSIBLE=y
+ # CONFIG_PM is not set
++
++#
++# Networking
++#
+ CONFIG_NET=y
+
+ #
+ # Networking options
+ #
+-CONFIG_COMPAT_NET_DEV_OPS=y
+ CONFIG_PACKET=y
+ # CONFIG_PACKET_MMAP is not set
+ CONFIG_UNIX=y
+@@ -338,7 +318,6 @@
+ # CONFIG_IPX is not set
+ # CONFIG_ATALK is not set
+ # CONFIG_NET_SCHED is not set
+-# CONFIG_DCB is not set
+
+ #
+ # Network testing
+@@ -348,9 +327,14 @@
+ # CONFIG_CAN is not set
+ # CONFIG_IRDA is not set
+ # CONFIG_BT is not set
+-# CONFIG_PHONET is not set
+-# CONFIG_WIRELESS is not set
+-# CONFIG_WIMAX is not set
++
++#
++# Wireless
++#
++# CONFIG_CFG80211 is not set
++# CONFIG_WIRELESS_EXT is not set
++# CONFIG_MAC80211 is not set
++# CONFIG_IEEE80211 is not set
+ # CONFIG_RFKILL is not set
+
+ #
+@@ -364,90 +348,7 @@
+ CONFIG_PREVENT_FIRMWARE_BUILD=y
+ # CONFIG_SYS_HYPERVISOR is not set
+ # CONFIG_CONNECTOR is not set
+-CONFIG_MTD=y
+-# CONFIG_MTD_DEBUG is not set
+-# CONFIG_MTD_CONCAT is not set
+-CONFIG_MTD_PARTITIONS=y
+-# CONFIG_MTD_TESTS is not set
+-# CONFIG_MTD_REDBOOT_PARTS is not set
+-CONFIG_MTD_CMDLINE_PARTS=y
+-# CONFIG_MTD_AR7_PARTS is not set
+-
+-#
+-# User Modules And Translation Layers
+-#
+-CONFIG_MTD_CHAR=y
+-# CONFIG_MTD_BLKDEVS is not set
+-# CONFIG_MTD_BLOCK is not set
+-# CONFIG_MTD_BLOCK_RO is not set
+-# CONFIG_FTL is not set
+-# CONFIG_NFTL is not set
+-# CONFIG_INFTL is not set
+-# CONFIG_RFD_FTL is not set
+-# CONFIG_SSFDC is not set
+-# CONFIG_MTD_OOPS is not set
+-
+-#
+-# RAM/ROM/Flash chip drivers
+-#
+-CONFIG_MTD_CFI=y
+-CONFIG_MTD_JEDECPROBE=y
+-CONFIG_MTD_GEN_PROBE=y
+-# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+-CONFIG_MTD_MAP_BANK_WIDTH_1=y
+-CONFIG_MTD_MAP_BANK_WIDTH_2=y
+-CONFIG_MTD_MAP_BANK_WIDTH_4=y
+-# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+-# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+-CONFIG_MTD_CFI_I1=y
+-CONFIG_MTD_CFI_I2=y
+-# CONFIG_MTD_CFI_I4 is not set
+-# CONFIG_MTD_CFI_I8 is not set
+-# CONFIG_MTD_CFI_INTELEXT is not set
+-CONFIG_MTD_CFI_AMDSTD=y
+-# CONFIG_MTD_CFI_STAA is not set
+-CONFIG_MTD_CFI_UTIL=y
+-# CONFIG_MTD_RAM is not set
+-# CONFIG_MTD_ROM is not set
+-# CONFIG_MTD_ABSENT is not set
+-
+-#
+-# Mapping drivers for chip access
+-#
+-# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+-CONFIG_MTD_PHYSMAP=y
+-# CONFIG_MTD_PHYSMAP_COMPAT is not set
+-# CONFIG_MTD_INTEL_VR_NOR is not set
+-# CONFIG_MTD_PLATRAM is not set
+-
+-#
+-# Self-contained MTD device drivers
+-#
+-# CONFIG_MTD_PMC551 is not set
+-# CONFIG_MTD_SLRAM is not set
+-# CONFIG_MTD_PHRAM is not set
+-# CONFIG_MTD_MTDRAM is not set
+-# CONFIG_MTD_BLOCK2MTD is not set
+-
+-#
+-# Disk-On-Chip Device Drivers
+-#
+-# CONFIG_MTD_DOC2000 is not set
+-# CONFIG_MTD_DOC2001 is not set
+-# CONFIG_MTD_DOC2001PLUS is not set
+-# CONFIG_MTD_NAND is not set
+-# CONFIG_MTD_ONENAND is not set
+-
+-#
+-# LPDDR flash memory drivers
+-#
+-# CONFIG_MTD_LPDDR is not set
+-
+-#
+-# UBI - Unsorted block images
+-#
+-# CONFIG_MTD_UBI is not set
++# CONFIG_MTD is not set
+ # CONFIG_PARPORT is not set
+ CONFIG_BLK_DEV=y
+ # CONFIG_BLK_CPQ_DA is not set
+@@ -464,60 +365,9 @@
+ # CONFIG_BLK_DEV_XIP is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+ # CONFIG_ATA_OVER_ETH is not set
+-# CONFIG_BLK_DEV_HD is not set
+ # CONFIG_MISC_DEVICES is not set
+ CONFIG_HAVE_IDE=y
+-CONFIG_IDE=y
+-
+-#
+-# Please see Documentation/ide/ide.txt for help/info on IDE drives
+-#
+-CONFIG_IDE_TIMINGS=y
+-# CONFIG_BLK_DEV_IDE_SATA is not set
+-CONFIG_IDE_GD=y
+-CONFIG_IDE_GD_ATA=y
+-# CONFIG_IDE_GD_ATAPI is not set
+-# CONFIG_BLK_DEV_IDECD is not set
+-# CONFIG_BLK_DEV_IDETAPE is not set
+-# CONFIG_IDE_TASK_IOCTL is not set
+-CONFIG_IDE_PROC_FS=y
+-
+-#
+-# IDE chipset support/bugfixes
+-#
+-# CONFIG_IDE_GENERIC is not set
+-# CONFIG_BLK_DEV_PLATFORM is not set
+-CONFIG_BLK_DEV_IDEDMA_SFF=y
+-
+-#
+-# PCI IDE chipsets support
+-#
+-# CONFIG_BLK_DEV_GENERIC is not set
+-# CONFIG_BLK_DEV_AEC62XX is not set
+-# CONFIG_BLK_DEV_ALI15X3 is not set
+-# CONFIG_BLK_DEV_AMD74XX is not set
+-# CONFIG_BLK_DEV_CMD64X is not set
+-# CONFIG_BLK_DEV_TRIFLEX is not set
+-# CONFIG_BLK_DEV_CS5530 is not set
+-# CONFIG_BLK_DEV_HPT366 is not set
+-# CONFIG_BLK_DEV_JMICRON is not set
+-# CONFIG_BLK_DEV_SC1200 is not set
+-# CONFIG_BLK_DEV_PIIX is not set
+-# CONFIG_BLK_DEV_IT8172 is not set
+-# CONFIG_BLK_DEV_IT8213 is not set
+-# CONFIG_BLK_DEV_IT821X is not set
+-# CONFIG_BLK_DEV_NS87415 is not set
+-# CONFIG_BLK_DEV_PDC202XX_OLD is not set
+-# CONFIG_BLK_DEV_PDC202XX_NEW is not set
+-# CONFIG_BLK_DEV_SVWKS is not set
+-# CONFIG_BLK_DEV_SIIMAGE is not set
+-# CONFIG_BLK_DEV_SLC90E66 is not set
+-# CONFIG_BLK_DEV_TRM290 is not set
+-# CONFIG_BLK_DEV_VIA82CXXX is not set
+-# CONFIG_BLK_DEV_TC86C001 is not set
+-CONFIG_BLK_DEV_IDE_TX4938=y
+-CONFIG_BLK_DEV_IDE_TX4939=y
+-CONFIG_BLK_DEV_IDEDMA=y
++# CONFIG_IDE is not set
+
+ #
+ # SCSI device support
+@@ -540,6 +390,7 @@
+ # CONFIG_IEEE1394 is not set
+ # CONFIG_I2O is not set
+ CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
+ # CONFIG_DUMMY is not set
+ # CONFIG_BONDING is not set
+ # CONFIG_EQUALIZER is not set
+@@ -561,19 +412,15 @@
+ # CONFIG_BROADCOM_PHY is not set
+ # CONFIG_ICPLUS_PHY is not set
+ # CONFIG_REALTEK_PHY is not set
+-# CONFIG_NATIONAL_PHY is not set
+-# CONFIG_STE10XP is not set
+-# CONFIG_LSI_ET1011C_PHY is not set
+ # CONFIG_FIXED_PHY is not set
+ # CONFIG_MDIO_BITBANG is not set
+ CONFIG_NET_ETHERNET=y
+-CONFIG_MII=y
++# CONFIG_MII is not set
+ # CONFIG_AX88796 is not set
+ # CONFIG_HAPPYMEAL is not set
+ # CONFIG_SUNGEM is not set
+ # CONFIG_CASSINI is not set
+ # CONFIG_NET_VENDOR_3COM is not set
+-CONFIG_SMC91X=y
+ # CONFIG_DM9000 is not set
+ # CONFIG_NET_TULIP is not set
+ # CONFIG_HP100 is not set
+@@ -582,9 +429,6 @@
+ # CONFIG_IBM_NEW_EMAC_RGMII is not set
+ # CONFIG_IBM_NEW_EMAC_TAH is not set
+ # CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+-# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
+-# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
+-# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
+ CONFIG_NET_PCI=y
+ # CONFIG_PCNET32 is not set
+ # CONFIG_AMD8111_ETH is not set
+@@ -592,6 +436,7 @@
+ # CONFIG_B44 is not set
+ # CONFIG_FORCEDETH is not set
+ CONFIG_TC35815=y
++# CONFIG_EEPRO100 is not set
+ # CONFIG_E100 is not set
+ # CONFIG_FEALNX is not set
+ # CONFIG_NATSEMI is not set
+@@ -600,11 +445,9 @@
+ # CONFIG_R6040 is not set
+ # CONFIG_SIS900 is not set
+ # CONFIG_EPIC100 is not set
+-# CONFIG_SMSC9420 is not set
+ # CONFIG_SUNDANCE is not set
+ # CONFIG_TLAN is not set
+ # CONFIG_VIA_RHINE is not set
+-# CONFIG_ATL2 is not set
+ # CONFIG_NETDEV_1000 is not set
+ # CONFIG_NETDEV_10000 is not set
+ # CONFIG_TR is not set
+@@ -615,10 +458,6 @@
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
+ # CONFIG_IWLWIFI_LEDS is not set
+-
+-#
+-# Enable WiMAX (Networking options) to see the WiMAX drivers
+-#
+ # CONFIG_WAN is not set
+ # CONFIG_FDDI is not set
+ # CONFIG_PPP is not set
+@@ -663,7 +502,6 @@
+ CONFIG_SERIAL_TXX9_STDSERIAL=y
+ # CONFIG_SERIAL_JSM is not set
+ CONFIG_UNIX98_PTYS=y
+-# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+ CONFIG_LEGACY_PTYS=y
+ CONFIG_LEGACY_PTY_COUNT=256
+ # CONFIG_IPMI_HANDLER is not set
+@@ -679,19 +517,17 @@
+ #
+ # SPI Master Controller Drivers
+ #
+-# CONFIG_SPI_BITBANG is not set
+-# CONFIG_SPI_GPIO is not set
+ CONFIG_SPI_TXX9=y
+
+ #
+ # SPI Protocol Masters
+ #
++CONFIG_EEPROM_AT25=y
+ # CONFIG_SPI_TLE62X0 is not set
+-CONFIG_ARCH_REQUIRE_GPIOLIB=y
+-CONFIG_GPIOLIB=y
++CONFIG_HAVE_GPIO_LIB=y
+
+ #
+-# Memory mapped GPIO expanders:
++# GPIO Support
+ #
+
+ #
+@@ -699,14 +535,8 @@
+ #
+
+ #
+-# PCI GPIO expanders:
+-#
+-# CONFIG_GPIO_BT8XX is not set
+-
+-#
+ # SPI GPIO expanders:
+ #
+-# CONFIG_GPIO_MAX7301 is not set
+ # CONFIG_GPIO_MCP23S08 is not set
+ # CONFIG_W1 is not set
+ # CONFIG_POWER_SUPPLY is not set
+@@ -720,7 +550,6 @@
+ # Watchdog Device Drivers
+ #
+ # CONFIG_SOFT_WATCHDOG is not set
+-# CONFIG_ALIM7101_WDT is not set
+ CONFIG_TXX9_WDT=m
+
+ #
+@@ -728,21 +557,18 @@
+ #
+ # CONFIG_PCIPCWATCHDOG is not set
+ # CONFIG_WDTPCI is not set
+-CONFIG_SSB_POSSIBLE=y
+
+ #
+ # Sonics Silicon Backplane
+ #
++CONFIG_SSB_POSSIBLE=y
+ # CONFIG_SSB is not set
+
+ #
+ # Multifunction device drivers
+ #
+-# CONFIG_MFD_CORE is not set
+ # CONFIG_MFD_SM501 is not set
+ # CONFIG_HTC_PASIC3 is not set
+-# CONFIG_MFD_TMIO is not set
+-# CONFIG_REGULATOR is not set
+
+ #
+ # Multimedia devices
+@@ -773,27 +599,15 @@
+ # Display device support
+ #
+ # CONFIG_DISPLAY_SUPPORT is not set
++
++#
++# Sound
++#
+ # CONFIG_SOUND is not set
+ # CONFIG_USB_SUPPORT is not set
+ # CONFIG_MMC is not set
+ # CONFIG_MEMSTICK is not set
+-CONFIG_NEW_LEDS=y
+-CONFIG_LEDS_CLASS=y
+-
+-#
+-# LED drivers
+-#
+-CONFIG_LEDS_GPIO=y
+-
+-#
+-# LED Triggers
+-#
+-CONFIG_LEDS_TRIGGERS=y
+-# CONFIG_LEDS_TRIGGER_TIMER is not set
+-CONFIG_LEDS_TRIGGER_IDE_DISK=y
+-CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+-# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+-# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
++# CONFIG_NEW_LEDS is not set
+ # CONFIG_ACCESSIBILITY is not set
+ # CONFIG_INFINIBAND is not set
+ CONFIG_RTC_LIB=y
+@@ -814,47 +628,35 @@
+ #
+ # SPI RTC drivers
+ #
+-# CONFIG_RTC_DRV_M41T94 is not set
+-# CONFIG_RTC_DRV_DS1305 is not set
+-# CONFIG_RTC_DRV_DS1390 is not set
+ # CONFIG_RTC_DRV_MAX6902 is not set
+ # CONFIG_RTC_DRV_R9701 is not set
+ CONFIG_RTC_DRV_RS5C348=y
+-# CONFIG_RTC_DRV_DS3234 is not set
+
+ #
+ # Platform RTC drivers
+ #
+ # CONFIG_RTC_DRV_CMOS is not set
+-# CONFIG_RTC_DRV_DS1286 is not set
+ # CONFIG_RTC_DRV_DS1511 is not set
+ # CONFIG_RTC_DRV_DS1553 is not set
+ CONFIG_RTC_DRV_DS1742=y
+ # CONFIG_RTC_DRV_STK17TA8 is not set
+ # CONFIG_RTC_DRV_M48T86 is not set
+-# CONFIG_RTC_DRV_M48T35 is not set
+ # CONFIG_RTC_DRV_M48T59 is not set
+-# CONFIG_RTC_DRV_BQ4802 is not set
+ # CONFIG_RTC_DRV_V3020 is not set
+
+ #
+ # on-CPU RTC drivers
+ #
+-CONFIG_RTC_DRV_TX4939=y
+-# CONFIG_DMADEVICES is not set
+ # CONFIG_UIO is not set
+-# CONFIG_STAGING is not set
+
+ #
+ # File systems
+ #
+ # CONFIG_EXT2_FS is not set
+ # CONFIG_EXT3_FS is not set
+-# CONFIG_EXT4_FS is not set
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
+ CONFIG_FS_POSIX_ACL=y
+-CONFIG_FILE_LOCKING=y
+ # CONFIG_XFS_FS is not set
+ # CONFIG_OCFS2_FS is not set
+ # CONFIG_DNOTIFY is not set
+@@ -885,19 +687,30 @@
+ CONFIG_PROC_FS=y
+ # CONFIG_PROC_KCORE is not set
+ CONFIG_PROC_SYSCTL=y
+-CONFIG_PROC_PAGE_MONITOR=y
+ CONFIG_SYSFS=y
+ CONFIG_TMPFS=y
+ CONFIG_TMPFS_POSIX_ACL=y
+ # CONFIG_HUGETLB_PAGE is not set
+ # CONFIG_CONFIGFS_FS is not set
+-# CONFIG_MISC_FILESYSTEMS is not set
++
++#
++# Miscellaneous filesystems
++#
++# CONFIG_HFSPLUS_FS is not set
++# CONFIG_CRAMFS is not set
++# CONFIG_VXFS_FS is not set
++# CONFIG_MINIX_FS is not set
++# CONFIG_HPFS_FS is not set
++# CONFIG_QNX4FS_FS is not set
++# CONFIG_ROMFS_FS is not set
++# CONFIG_SYSV_FS is not set
++# CONFIG_UFS_FS is not set
+ CONFIG_NETWORK_FILESYSTEMS=y
+ CONFIG_NFS_FS=y
+ CONFIG_NFS_V3=y
+ # CONFIG_NFS_V3_ACL is not set
+-CONFIG_ROOT_NFS=y
+ # CONFIG_NFSD is not set
++CONFIG_ROOT_NFS=y
+ CONFIG_LOCKD=y
+ CONFIG_LOCKD_V4=y
+ CONFIG_NFS_COMMON=y
+@@ -927,16 +740,7 @@
+ CONFIG_DEBUG_FS=y
+ # CONFIG_HEADERS_CHECK is not set
+ # CONFIG_DEBUG_KERNEL is not set
+-# CONFIG_DEBUG_MEMORY_INIT is not set
+-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+-CONFIG_SYSCTL_SYSCALL_CHECK=y
+-
+-#
+-# Tracers
+-#
+-# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
+ # CONFIG_SAMPLES is not set
+-CONFIG_HAVE_ARCH_KGDB=y
+ CONFIG_CMDLINE=""
+
+ #
+@@ -944,18 +748,15 @@
+ #
+ # CONFIG_KEYS is not set
+ # CONFIG_SECURITY is not set
+-# CONFIG_SECURITYFS is not set
+-# CONFIG_SECURITY_FILE_CAPABILITIES is not set
+ # CONFIG_CRYPTO is not set
+
+ #
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
+-CONFIG_GENERIC_FIND_LAST_BIT=y
++# CONFIG_GENERIC_FIND_FIRST_BIT is not set
+ # CONFIG_CRC_CCITT is not set
+ # CONFIG_CRC16 is not set
+-# CONFIG_CRC_T10DIF is not set
+ # CONFIG_CRC_ITU_T is not set
+ CONFIG_CRC32=y
+ # CONFIG_CRC7 is not set
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/emma/Kconfig linux-2.6.29-rc3.owrt/arch/mips/emma/Kconfig
+--- linux-2.6.29.owrt/arch/mips/emma/Kconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/arch/mips/emma/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,29 @@
++choice
++ prompt "Machine type"
++ depends on MACH_EMMA
++ default NEC_MARKEINS
++
++config NEC_MARKEINS
++ bool "NEC EMMA2RH Mark-eins board"
++ select SOC_EMMA2RH
++ select HW_HAS_PCI
++ help
++ This enables support for the NEC Electronics Mark-eins boards.
++
++endchoice
++
++config SOC_EMMA2RH
++ bool
++ select SOC_EMMA
++ select SYS_HAS_CPU_R5500
++ select SYS_SUPPORTS_32BIT_KERNEL
++ select SYS_SUPPORTS_64BIT_KERNEL
++
++config SOC_EMMA
++ bool
++ select CEVT_R4K
++ select CSRC_R4K
++ select DMA_NONCOHERENT
++ select IRQ_CPU
++ select SWAP_IO_SPACE
++ select SYS_SUPPORTS_BIG_ENDIAN
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/emma/markeins/platform.c linux-2.6.29-rc3.owrt/arch/mips/emma/markeins/platform.c
+--- linux-2.6.29.owrt/arch/mips/emma/markeins/platform.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/emma/markeins/platform.c 2009-05-10 23:48:28.000000000 +0200
+@@ -141,6 +141,13 @@
+ },
+ };
+
++static struct platform_device *devices[] = {
++ &i2c_emma_devices[0],
++ &i2c_emma_devices[1],
++ &i2c_emma_devices[2],
++ &serial_emma,
++};
++
+ static struct mtd_partition markeins_parts[] = {
+ [0] = {
+ .name = "RootFS",
+@@ -174,39 +181,11 @@
+ },
+ };
+
+-static struct physmap_flash_data markeins_flash_data = {
+- .width = 2,
+- .nr_parts = ARRAY_SIZE(markeins_parts),
+- .parts = markeins_parts
+-};
+-
+-static struct resource markeins_flash_resource = {
+- .start = 0x1e000000,
+- .end = 0x02000000,
+- .flags = IORESOURCE_MEM
+-};
+-
+-static struct platform_device markeins_flash_device = {
+- .name = "physmap-flash",
+- .id = 0,
+- .dev = {
+- .platform_data = &markeins_flash_data,
+- },
+- .num_resources = 1,
+- .resource = &markeins_flash_resource,
+-};
+-
+-static struct platform_device *devices[] = {
+- i2c_emma_devices,
+- i2c_emma_devices + 1,
+- i2c_emma_devices + 2,
+- &serial_emma,
+- &markeins_flash_device,
+-};
+-
+ static int __init platform_devices_setup(void)
+ {
++ physmap_set_partitions(markeins_parts, ARRAY_SIZE(markeins_parts));
+ return platform_add_devices(devices, ARRAY_SIZE(devices));
+ }
+
+ arch_initcall(platform_devices_setup);
++
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/include/asm/atomic.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/atomic.h
+--- linux-2.6.29.owrt/arch/mips/include/asm/atomic.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/atomic.h 2009-05-10 23:48:28.000000000 +0200
+@@ -50,7 +50,7 @@
+ static __inline__ void atomic_add(int i, atomic_t * v)
+ {
+ if (cpu_has_llsc && R10000_LLSC_WAR) {
+- int temp;
++ unsigned long temp;
+
+ __asm__ __volatile__(
+ " .set mips3 \n"
+@@ -62,7 +62,7 @@
+ : "=&r" (temp), "=m" (v->counter)
+ : "Ir" (i), "m" (v->counter));
+ } else if (cpu_has_llsc) {
+- int temp;
++ unsigned long temp;
+
+ __asm__ __volatile__(
+ " .set mips3 \n"
+@@ -95,7 +95,7 @@
+ static __inline__ void atomic_sub(int i, atomic_t * v)
+ {
+ if (cpu_has_llsc && R10000_LLSC_WAR) {
+- int temp;
++ unsigned long temp;
+
+ __asm__ __volatile__(
+ " .set mips3 \n"
+@@ -107,7 +107,7 @@
+ : "=&r" (temp), "=m" (v->counter)
+ : "Ir" (i), "m" (v->counter));
+ } else if (cpu_has_llsc) {
+- int temp;
++ unsigned long temp;
+
+ __asm__ __volatile__(
+ " .set mips3 \n"
+@@ -135,12 +135,12 @@
+ */
+ static __inline__ int atomic_add_return(int i, atomic_t * v)
+ {
+- int result;
++ unsigned long result;
+
+ smp_llsc_mb();
+
+ if (cpu_has_llsc && R10000_LLSC_WAR) {
+- int temp;
++ unsigned long temp;
+
+ __asm__ __volatile__(
+ " .set mips3 \n"
+@@ -154,7 +154,7 @@
+ : "Ir" (i), "m" (v->counter)
+ : "memory");
+ } else if (cpu_has_llsc) {
+- int temp;
++ unsigned long temp;
+
+ __asm__ __volatile__(
+ " .set mips3 \n"
+@@ -187,12 +187,12 @@
+
+ static __inline__ int atomic_sub_return(int i, atomic_t * v)
+ {
+- int result;
++ unsigned long result;
+
+ smp_llsc_mb();
+
+ if (cpu_has_llsc && R10000_LLSC_WAR) {
+- int temp;
++ unsigned long temp;
+
+ __asm__ __volatile__(
+ " .set mips3 \n"
+@@ -206,7 +206,7 @@
+ : "Ir" (i), "m" (v->counter)
+ : "memory");
+ } else if (cpu_has_llsc) {
+- int temp;
++ unsigned long temp;
+
+ __asm__ __volatile__(
+ " .set mips3 \n"
+@@ -247,12 +247,12 @@
+ */
+ static __inline__ int atomic_sub_if_positive(int i, atomic_t * v)
+ {
+- int result;
++ unsigned long result;
+
+ smp_llsc_mb();
+
+ if (cpu_has_llsc && R10000_LLSC_WAR) {
+- int temp;
++ unsigned long temp;
+
+ __asm__ __volatile__(
+ " .set mips3 \n"
+@@ -270,7 +270,7 @@
+ : "Ir" (i), "m" (v->counter)
+ : "memory");
+ } else if (cpu_has_llsc) {
+- int temp;
++ unsigned long temp;
+
+ __asm__ __volatile__(
+ " .set mips3 \n"
+@@ -429,7 +429,7 @@
+ static __inline__ void atomic64_add(long i, atomic64_t * v)
+ {
+ if (cpu_has_llsc && R10000_LLSC_WAR) {
+- long temp;
++ unsigned long temp;
+
+ __asm__ __volatile__(
+ " .set mips3 \n"
+@@ -441,7 +441,7 @@
+ : "=&r" (temp), "=m" (v->counter)
+ : "Ir" (i), "m" (v->counter));
+ } else if (cpu_has_llsc) {
+- long temp;
++ unsigned long temp;
+
+ __asm__ __volatile__(
+ " .set mips3 \n"
+@@ -474,7 +474,7 @@
+ static __inline__ void atomic64_sub(long i, atomic64_t * v)
+ {
+ if (cpu_has_llsc && R10000_LLSC_WAR) {
+- long temp;
++ unsigned long temp;
+
+ __asm__ __volatile__(
+ " .set mips3 \n"
+@@ -486,7 +486,7 @@
+ : "=&r" (temp), "=m" (v->counter)
+ : "Ir" (i), "m" (v->counter));
+ } else if (cpu_has_llsc) {
+- long temp;
++ unsigned long temp;
+
+ __asm__ __volatile__(
+ " .set mips3 \n"
+@@ -514,12 +514,12 @@
+ */
+ static __inline__ long atomic64_add_return(long i, atomic64_t * v)
+ {
+- long result;
++ unsigned long result;
+
+ smp_llsc_mb();
+
+ if (cpu_has_llsc && R10000_LLSC_WAR) {
+- long temp;
++ unsigned long temp;
+
+ __asm__ __volatile__(
+ " .set mips3 \n"
+@@ -533,7 +533,7 @@
+ : "Ir" (i), "m" (v->counter)
+ : "memory");
+ } else if (cpu_has_llsc) {
+- long temp;
++ unsigned long temp;
+
+ __asm__ __volatile__(
+ " .set mips3 \n"
+@@ -566,12 +566,12 @@
+
+ static __inline__ long atomic64_sub_return(long i, atomic64_t * v)
+ {
+- long result;
++ unsigned long result;
+
+ smp_llsc_mb();
+
+ if (cpu_has_llsc && R10000_LLSC_WAR) {
+- long temp;
++ unsigned long temp;
+
+ __asm__ __volatile__(
+ " .set mips3 \n"
+@@ -585,7 +585,7 @@
+ : "Ir" (i), "m" (v->counter)
+ : "memory");
+ } else if (cpu_has_llsc) {
+- long temp;
++ unsigned long temp;
+
+ __asm__ __volatile__(
+ " .set mips3 \n"
+@@ -626,12 +626,12 @@
+ */
+ static __inline__ long atomic64_sub_if_positive(long i, atomic64_t * v)
+ {
+- long result;
++ unsigned long result;
+
+ smp_llsc_mb();
+
+ if (cpu_has_llsc && R10000_LLSC_WAR) {
+- long temp;
++ unsigned long temp;
+
+ __asm__ __volatile__(
+ " .set mips3 \n"
+@@ -649,7 +649,7 @@
+ : "Ir" (i), "m" (v->counter)
+ : "memory");
+ } else if (cpu_has_llsc) {
+- long temp;
++ unsigned long temp;
+
+ __asm__ __volatile__(
+ " .set mips3 \n"
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/include/asm/compat.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/compat.h
+--- linux-2.6.29.owrt/arch/mips/include/asm/compat.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/compat.h 2009-05-10 23:48:28.000000000 +0200
+@@ -3,8 +3,6 @@
+ /*
+ * Architecture specific compatibility types
+ */
+-#include <linux/seccomp.h>
+-#include <linux/thread_info.h>
+ #include <linux/types.h>
+ #include <asm/page.h>
+ #include <asm/ptrace.h>
+@@ -220,9 +218,4 @@
+ compat_ulong_t __unused2;
+ };
+
+-static inline int is_compat_task(void)
+-{
+- return test_thread_flag(TIF_32BIT);
+-}
+-
+ #endif /* _ASM_COMPAT_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/include/asm/hazards.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/hazards.h
+--- linux-2.6.29.owrt/arch/mips/include/asm/hazards.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/hazards.h 2009-05-10 23:48:28.000000000 +0200
+@@ -138,8 +138,7 @@
+ __instruction_hazard(); \
+ } while (0)
+
+-#elif defined(CONFIG_CPU_R10000) || defined(CONFIG_CPU_CAVIUM_OCTEON) || \
+- defined(CONFIG_CPU_R5500)
++#elif defined(CONFIG_CPU_R10000) || defined(CONFIG_CPU_CAVIUM_OCTEON)
+
+ /*
+ * R10000 rocks - all hazards handled in hardware, so this becomes a nobrainer.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/include/asm/mach-rc32434/gpio.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/mach-rc32434/gpio.h
+--- linux-2.6.29.owrt/arch/mips/include/asm/mach-rc32434/gpio.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/mach-rc32434/gpio.h 2009-05-10 23:48:28.000000000 +0200
+@@ -80,8 +80,11 @@
+ /* Compact Flash GPIO pin */
+ #define CF_GPIO_NUM 13
+
++extern void set_434_reg(unsigned reg_offs, unsigned bit, unsigned len, unsigned val);
++extern unsigned get_434_reg(unsigned reg_offs);
++extern void set_latch_u5(unsigned char or_mask, unsigned char nand_mask);
++extern unsigned char get_latch_u5(void);
+ extern void rb532_gpio_set_ilevel(int bit, unsigned gpio);
+ extern void rb532_gpio_set_istat(int bit, unsigned gpio);
+-extern void rb532_gpio_set_func(unsigned gpio);
+
+ #endif /* _RC32434_GPIO_H_ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/include/asm/mach-rc32434/irq.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/mach-rc32434/irq.h
+--- linux-2.6.29.owrt/arch/mips/include/asm/mach-rc32434/irq.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/mach-rc32434/irq.h 2009-05-10 23:48:28.000000000 +0200
+@@ -30,7 +30,4 @@
+ #define ETH0_RX_OVR_IRQ (GROUP3_IRQ_BASE + 9)
+ #define ETH0_TX_UND_IRQ (GROUP3_IRQ_BASE + 10)
+
+-#define GPIO_MAPPED_IRQ_BASE GROUP4_IRQ_BASE
+-#define GPIO_MAPPED_IRQ_GROUP 4
+-
+ #endif /* __ASM_RC32434_IRQ_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/include/asm/mach-rc32434/rb.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/mach-rc32434/rb.h
+--- linux-2.6.29.owrt/arch/mips/include/asm/mach-rc32434/rb.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/mach-rc32434/rb.h 2009-05-10 23:48:28.000000000 +0200
+@@ -83,7 +83,4 @@
+ void __iomem *base;
+ };
+
+-extern void set_latch_u5(unsigned char or_mask, unsigned char nand_mask);
+-extern unsigned char get_latch_u5(void);
+-
+ #endif /* __ASM_RC32434_RB_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/include/asm/prefetch.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/prefetch.h
+--- linux-2.6.29.owrt/arch/mips/include/asm/prefetch.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/prefetch.h 2009-05-10 23:48:28.000000000 +0200
+@@ -26,7 +26,7 @@
+ * Pref_WriteBackInvalidate is a nop and Pref_PrepareForStore is broken in
+ * current versions due to erratum G105.
+ *
+- * VR5500 (including VR5701 and VR7701) only implement load prefetch.
++ * VR7701 only implements the Load prefetch.
+ *
+ * Finally MIPS32 and MIPS64 implement all of the following hints.
+ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/include/asm/ptrace.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/ptrace.h
+--- linux-2.6.29.owrt/arch/mips/include/asm/ptrace.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/ptrace.h 2009-05-10 23:48:28.000000000 +0200
+@@ -105,7 +105,7 @@
+ enum pt_watch_style style;
+ union {
+ struct mips32_watch_regs mips32;
+- struct mips64_watch_regs mips64;
++ struct mips32_watch_regs mips64;
+ };
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/include/asm/seccomp.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/seccomp.h
+--- linux-2.6.29.owrt/arch/mips/include/asm/seccomp.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/seccomp.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,5 +1,6 @@
+ #ifndef __ASM_SECCOMP_H
+
++#include <linux/thread_info.h>
+ #include <linux/unistd.h>
+
+ #define __NR_seccomp_read __NR_read
+@@ -15,6 +16,8 @@
+ */
+ #ifdef CONFIG_MIPS32_O32
+
++#define TIF_32BIT TIF_32BIT_REGS
++
+ #define __NR_seccomp_read_32 4003
+ #define __NR_seccomp_write_32 4004
+ #define __NR_seccomp_exit_32 4001
+@@ -22,6 +25,8 @@
+
+ #elif defined(CONFIG_MIPS32_N32)
+
++#define TIF_32BIT _TIF_32BIT_ADDR
++
+ #define __NR_seccomp_read_32 6000
+ #define __NR_seccomp_write_32 6001
+ #define __NR_seccomp_exit_32 6058
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/include/asm/spinlock.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/spinlock.h
+--- linux-2.6.29.owrt/arch/mips/include/asm/spinlock.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/spinlock.h 2009-05-10 23:48:28.000000000 +0200
+@@ -51,7 +51,6 @@
+
+ return (((counters >> 14) - counters) & 0x1fff) > 1;
+ }
+-#define __raw_spin_is_contended __raw_spin_is_contended
+
+ static inline void __raw_spin_lock(raw_spinlock_t *lock)
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/include/asm/termios.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/termios.h
+--- linux-2.6.29.owrt/arch/mips/include/asm/termios.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/termios.h 2009-05-10 23:48:28.000000000 +0200
+@@ -9,7 +9,6 @@
+ #ifndef _ASM_TERMIOS_H
+ #define _ASM_TERMIOS_H
+
+-#include <linux/errno.h>
+ #include <asm/termbits.h>
+ #include <asm/ioctls.h>
+
+@@ -95,81 +94,38 @@
+ /*
+ * Translate a "termio" structure into a "termios". Ugh.
+ */
+-static inline int user_termio_to_kernel_termios(struct ktermios *termios,
+- struct termio __user *termio)
+-{
+- unsigned short iflag, oflag, cflag, lflag;
+- unsigned int err;
+-
+- if (!access_ok(VERIFY_READ, termio, sizeof(struct termio)))
+- return -EFAULT;
+-
+- err = __get_user(iflag, &termio->c_iflag);
+- termios->c_iflag = (termios->c_iflag & 0xffff0000) | iflag;
+- err |=__get_user(oflag, &termio->c_oflag);
+- termios->c_oflag = (termios->c_oflag & 0xffff0000) | oflag;
+- err |=__get_user(cflag, &termio->c_cflag);
+- termios->c_cflag = (termios->c_cflag & 0xffff0000) | cflag;
+- err |=__get_user(lflag, &termio->c_lflag);
+- termios->c_lflag = (termios->c_lflag & 0xffff0000) | lflag;
+- err |=__get_user(termios->c_line, &termio->c_line);
+- if (err)
+- return -EFAULT;
+-
+- if (__copy_from_user(termios->c_cc, termio->c_cc, NCC))
+- return -EFAULT;
+-
+- return 0;
+-}
++#define user_termio_to_kernel_termios(termios, termio) \
++({ \
++ unsigned short tmp; \
++ get_user(tmp, &(termio)->c_iflag); \
++ (termios)->c_iflag = (0xffff0000 & ((termios)->c_iflag)) | tmp; \
++ get_user(tmp, &(termio)->c_oflag); \
++ (termios)->c_oflag = (0xffff0000 & ((termios)->c_oflag)) | tmp; \
++ get_user(tmp, &(termio)->c_cflag); \
++ (termios)->c_cflag = (0xffff0000 & ((termios)->c_cflag)) | tmp; \
++ get_user(tmp, &(termio)->c_lflag); \
++ (termios)->c_lflag = (0xffff0000 & ((termios)->c_lflag)) | tmp; \
++ get_user((termios)->c_line, &(termio)->c_line); \
++ copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \
++})
+
+ /*
+ * Translate a "termios" structure into a "termio". Ugh.
+ */
+-static inline int kernel_termios_to_user_termio(struct termio __user *termio,
+- struct ktermios *termios)
+-{
+- int err;
+-
+- if (!access_ok(VERIFY_WRITE, termio, sizeof(struct termio)))
+- return -EFAULT;
+-
+- err = __put_user(termios->c_iflag, &termio->c_iflag);
+- err |= __put_user(termios->c_oflag, &termio->c_oflag);
+- err |= __put_user(termios->c_cflag, &termio->c_cflag);
+- err |= __put_user(termios->c_lflag, &termio->c_lflag);
+- err |= __put_user(termios->c_line, &termio->c_line);
+- if (err)
+- return -EFAULT;
+-
+- if (__copy_to_user(termio->c_cc, termios->c_cc, NCC))
+- return -EFAULT;
+-
+- return 0;
+-}
+-
+-static inline int user_termios_to_kernel_termios(struct ktermios __user *k,
+- struct termios2 *u)
+-{
+- return copy_from_user(k, u, sizeof(struct termios2)) ? -EFAULT : 0;
+-}
+-
+-static inline int kernel_termios_to_user_termios(struct termios2 __user *u,
+- struct ktermios *k)
+-{
+- return copy_to_user(u, k, sizeof(struct termios2)) ? -EFAULT : 0;
+-}
+-
+-static inline int user_termios_to_kernel_termios_1(struct ktermios *k,
+- struct termios __user *u)
+-{
+- return copy_from_user(k, u, sizeof(struct termios)) ? -EFAULT : 0;
+-}
+-
+-static inline int kernel_termios_to_user_termios_1(struct termios __user *u,
+- struct ktermios *k)
+-{
+- return copy_to_user(u, k, sizeof(struct termios)) ? -EFAULT : 0;
+-}
++#define kernel_termios_to_user_termio(termio, termios) \
++({ \
++ put_user((termios)->c_iflag, &(termio)->c_iflag); \
++ put_user((termios)->c_oflag, &(termio)->c_oflag); \
++ put_user((termios)->c_cflag, &(termio)->c_cflag); \
++ put_user((termios)->c_lflag, &(termio)->c_lflag); \
++ put_user((termios)->c_line, &(termio)->c_line); \
++ copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \
++})
++
++#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios2))
++#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios2))
++#define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios))
++#define kernel_termios_to_user_termios_1(u, k) copy_to_user(u, k, sizeof(struct termios))
+
+ #endif /* defined(__KERNEL__) */
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/include/asm/thread_info.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/thread_info.h
+--- linux-2.6.29.owrt/arch/mips/include/asm/thread_info.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/thread_info.h 2009-05-10 23:48:28.000000000 +0200
+@@ -127,12 +127,6 @@
+ #define TIF_LOAD_WATCH 25 /* If set, load watch registers */
+ #define TIF_SYSCALL_TRACE 31 /* syscall trace active */
+
+-#ifdef CONFIG_MIPS32_O32
+-#define TIF_32BIT TIF_32BIT_REGS
+-#elif defined(CONFIG_MIPS32_N32)
+-#define TIF_32BIT _TIF_32BIT_ADDR
+-#endif /* CONFIG_MIPS32_O32 */
+-
+ #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
+ #define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
+ #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/include/asm/txx9/tx4939.h linux-2.6.29-rc3.owrt/arch/mips/include/asm/txx9/tx4939.h
+--- linux-2.6.29.owrt/arch/mips/include/asm/txx9/tx4939.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/include/asm/txx9/tx4939.h 2009-05-10 23:48:28.000000000 +0200
+@@ -541,6 +541,5 @@
+ int tx4939_irq(void);
+ void tx4939_mtd_init(int ch);
+ void tx4939_ata_init(void);
+-void tx4939_rtc_init(void);
+
+ #endif /* __ASM_TXX9_TX4939_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/Kconfig linux-2.6.29-rc3.owrt/arch/mips/Kconfig
+--- linux-2.6.29.owrt/arch/mips/Kconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -238,12 +238,8 @@
+ This option enables support for MIPS Technologies MIPSsim software
+ emulator.
+
+-config NEC_MARKEINS
+- bool "NEC EMMA2RH Mark-eins board"
+- select SOC_EMMA2RH
+- select HW_HAS_PCI
+- help
+- This enables support for the NEC Electronics Mark-eins boards.
++config MACH_EMMA
++ bool "NEC EMMA series based machines"
+
+ config MACH_VR41XX
+ bool "NEC VR4100 series based machines"
+@@ -355,7 +351,7 @@
+ select ARC64
+ select BOOT_ELF64
+ select DEFAULT_SGI_PARTITION
+- select DMA_COHERENT
++ select DMA_IP27
+ select SYS_HAS_EARLY_PRINTK
+ select HW_HAS_PCI
+ select NR_CPUS_DEFAULT_64
+@@ -607,7 +603,7 @@
+ select SYS_SUPPORTS_64BIT_KERNEL
+ select SYS_SUPPORTS_BIG_ENDIAN
+ select SYS_SUPPORTS_HIGHMEM
+- select SYS_HAS_CPU_CAVIUM_OCTEON
++ select CPU_CAVIUM_OCTEON
+ help
+ The Octeon simulator is software performance model of the Cavium
+ Octeon Processor. It supports simulating Octeon processors on x86
+@@ -622,7 +618,7 @@
+ select SYS_SUPPORTS_BIG_ENDIAN
+ select SYS_SUPPORTS_HIGHMEM
+ select SYS_HAS_EARLY_PRINTK
+- select SYS_HAS_CPU_CAVIUM_OCTEON
++ select CPU_CAVIUM_OCTEON
+ select SWAP_IO_SPACE
+ help
+ This option supports all of the Octeon reference boards from Cavium
+@@ -641,6 +637,7 @@
+
+ source "arch/mips/alchemy/Kconfig"
+ source "arch/mips/basler/excite/Kconfig"
++source "arch/mips/emma/Kconfig"
+ source "arch/mips/jazz/Kconfig"
+ source "arch/mips/lasat/Kconfig"
+ source "arch/mips/pmc-sierra/Kconfig"
+@@ -764,6 +761,9 @@
+ config DMA_COHERENT
+ bool
+
++config DMA_IP27
++ bool
++
+ config DMA_NONCOHERENT
+ bool
+ select DMA_NEED_PCI_MAP_STATE
+@@ -904,18 +904,6 @@
+ bool
+ select SERIAL_RM9000
+
+-config SOC_EMMA2RH
+- bool
+- select CEVT_R4K
+- select CSRC_R4K
+- select DMA_NONCOHERENT
+- select IRQ_CPU
+- select SWAP_IO_SPACE
+- select SYS_HAS_CPU_R5500
+- select SYS_SUPPORTS_32BIT_KERNEL
+- select SYS_SUPPORTS_64BIT_KERNEL
+- select SYS_SUPPORTS_BIG_ENDIAN
+-
+ config SOC_PNX833X
+ bool
+ select CEVT_R4K
+@@ -951,6 +939,11 @@
+ config SWAP_IO_SPACE
+ bool
+
++config EMMA2RH
++ bool
++ depends on MARKEINS
++ default y
++
+ config SERIAL_RM9000
+ bool
+
+@@ -1250,7 +1243,6 @@
+
+ config CPU_CAVIUM_OCTEON
+ bool "Cavium Octeon processor"
+- depends on SYS_HAS_CPU_CAVIUM_OCTEON
+ select IRQ_CPU
+ select IRQ_CPU_OCTEON
+ select CPU_HAS_PREFETCH
+@@ -1331,9 +1323,6 @@
+ config SYS_HAS_CPU_SB1
+ bool
+
+-config SYS_HAS_CPU_CAVIUM_OCTEON
+- bool
+-
+ #
+ # CPU may reorder R->R, R->W, W->R, W->W
+ # Reordering beyond LL and SC is handled in WEAK_REORDERING_BEYOND_LLSC
+@@ -1385,7 +1374,7 @@
+ #
+ config HARDWARE_WATCHPOINTS
+ bool
+- default y if CPU_MIPSR1 || CPU_MIPSR2
++ default y if CPU_MIPS32 || CPU_MIPS64
+
+ menu "Kernel type"
+
+@@ -1407,7 +1396,6 @@
+ config 64BIT
+ bool "64-bit kernel"
+ depends on CPU_SUPPORTS_64BIT_KERNEL && SYS_SUPPORTS_64BIT_KERNEL
+- select HAVE_SYSCALL_WRAPPERS
+ help
+ Select this option if you want to build a 64-bit kernel.
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/kernel/cpu-probe.c linux-2.6.29-rc3.owrt/arch/mips/kernel/cpu-probe.c
+--- linux-2.6.29.owrt/arch/mips/kernel/cpu-probe.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/kernel/cpu-probe.c 2009-05-10 23:48:28.000000000 +0200
+@@ -149,7 +149,6 @@
+ case CPU_R4650:
+ case CPU_R4700:
+ case CPU_R5000:
+- case CPU_R5500:
+ case CPU_NEVADA:
+ case CPU_4KC:
+ case CPU_4KEC:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/kernel/genex.S linux-2.6.29-rc3.owrt/arch/mips/kernel/genex.S
+--- linux-2.6.29.owrt/arch/mips/kernel/genex.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/kernel/genex.S 2009-05-10 23:48:28.000000000 +0200
+@@ -458,11 +458,7 @@
+ BUILD_HANDLER fpe fpe fpe silent /* #15 */
+ BUILD_HANDLER mdmx mdmx sti silent /* #22 */
+ #ifdef CONFIG_HARDWARE_WATCHPOINTS
+- /*
+- * For watch, interrupts will be enabled after the watch
+- * registers are read.
+- */
+- BUILD_HANDLER watch watch cli silent /* #23 */
++ BUILD_HANDLER watch watch sti silent /* #23 */
+ #else
+ BUILD_HANDLER watch watch sti verbose /* #23 */
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/kernel/irq.c linux-2.6.29-rc3.owrt/arch/mips/kernel/irq.c
+--- linux-2.6.29.owrt/arch/mips/kernel/irq.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/kernel/irq.c 2009-05-10 23:48:28.000000000 +0200
+@@ -111,6 +111,7 @@
+ seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
+ #endif
+ seq_printf(p, " %14s", irq_desc[i].chip->name);
++ seq_printf(p, "-%-8s", irq_desc[i].name);
+ seq_printf(p, " %s", action->name);
+
+ for (action=action->next; action; action = action->next)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/kernel/linux32.c linux-2.6.29-rc3.owrt/arch/mips/kernel/linux32.c
+--- linux-2.6.29.owrt/arch/mips/kernel/linux32.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/kernel/linux32.c 2009-05-10 23:48:28.000000000 +0200
+@@ -32,7 +32,6 @@
+ #include <linux/module.h>
+ #include <linux/binfmts.h>
+ #include <linux/security.h>
+-#include <linux/syscalls.h>
+ #include <linux/compat.h>
+ #include <linux/vfs.h>
+ #include <linux/ipc.h>
+@@ -64,9 +63,9 @@
+ #define merge_64(r1, r2) ((((r2) & 0xffffffffUL) << 32) + ((r1) & 0xffffffffUL))
+ #endif
+
+-SYSCALL_DEFINE6(32_mmap2, unsigned long, addr, unsigned long, len,
+- unsigned long, prot, unsigned long, flags, unsigned long, fd,
+- unsigned long, pgoff)
++asmlinkage unsigned long
++sys32_mmap2(unsigned long addr, unsigned long len, unsigned long prot,
++ unsigned long flags, unsigned long fd, unsigned long pgoff)
+ {
+ struct file * file = NULL;
+ unsigned long error;
+@@ -122,21 +121,21 @@
+ int rlim_max;
+ };
+
+-SYSCALL_DEFINE4(32_truncate64, const char __user *, path,
+- unsigned long, __dummy, unsigned long, a2, unsigned long, a3)
++asmlinkage long sys32_truncate64(const char __user * path,
++ unsigned long __dummy, int a2, int a3)
+ {
+ return sys_truncate(path, merge_64(a2, a3));
+ }
+
+-SYSCALL_DEFINE4(32_ftruncate64, unsigned long, fd, unsigned long, __dummy,
+- unsigned long, a2, unsigned long, a3)
++asmlinkage long sys32_ftruncate64(unsigned int fd, unsigned long __dummy,
++ int a2, int a3)
+ {
+ return sys_ftruncate(fd, merge_64(a2, a3));
+ }
+
+-SYSCALL_DEFINE5(32_llseek, unsigned long, fd, unsigned long, offset_high,
+- unsigned long, offset_low, loff_t __user *, result,
+- unsigned long, origin)
++asmlinkage int sys32_llseek(unsigned int fd, unsigned int offset_high,
++ unsigned int offset_low, loff_t __user * result,
++ unsigned int origin)
+ {
+ return sys_llseek(fd, offset_high, offset_low, result, origin);
+ }
+@@ -145,20 +144,20 @@
+ lseek back to original location. They fail just like lseek does on
+ non-seekable files. */
+
+-SYSCALL_DEFINE6(32_pread, unsigned long, fd, char __user *, buf, size_t, count,
+- unsigned long, unused, unsigned long, a4, unsigned long, a5)
++asmlinkage ssize_t sys32_pread(unsigned int fd, char __user * buf,
++ size_t count, u32 unused, u64 a4, u64 a5)
+ {
+ return sys_pread64(fd, buf, count, merge_64(a4, a5));
+ }
+
+-SYSCALL_DEFINE6(32_pwrite, unsigned int, fd, const char __user *, buf,
+- size_t, count, u32, unused, u64, a4, u64, a5)
++asmlinkage ssize_t sys32_pwrite(unsigned int fd, const char __user * buf,
++ size_t count, u32 unused, u64 a4, u64 a5)
+ {
+ return sys_pwrite64(fd, buf, count, merge_64(a4, a5));
+ }
+
+-SYSCALL_DEFINE2(32_sched_rr_get_interval, compat_pid_t, pid,
+- struct compat_timespec __user *, interval)
++asmlinkage int sys32_sched_rr_get_interval(compat_pid_t pid,
++ struct compat_timespec __user *interval)
+ {
+ struct timespec t;
+ int ret;
+@@ -175,8 +174,8 @@
+
+ #ifdef CONFIG_SYSVIPC
+
+-SYSCALL_DEFINE6(32_ipc, u32, call, long, first, long, second, long, third,
+- unsigned long, ptr, unsigned long, fifth)
++asmlinkage long
++sys32_ipc(u32 call, int first, int second, int third, u32 ptr, u32 fifth)
+ {
+ int version, err;
+
+@@ -234,8 +233,8 @@
+
+ #else
+
+-SYSCALL_DEFINE6(32_ipc, u32, call, int, first, int, second, int, third,
+- u32, ptr, u32, fifth)
++asmlinkage long
++sys32_ipc(u32 call, int first, int second, int third, u32 ptr, u32 fifth)
+ {
+ return -ENOSYS;
+ }
+@@ -243,7 +242,7 @@
+ #endif /* CONFIG_SYSVIPC */
+
+ #ifdef CONFIG_MIPS32_N32
+-SYSCALL_DEFINE4(n32_semctl, int, semid, int, semnum, int, cmd, u32, arg)
++asmlinkage long sysn32_semctl(int semid, int semnum, int cmd, u32 arg)
+ {
+ /* compat_sys_semctl expects a pointer to union semun */
+ u32 __user *uptr = compat_alloc_user_space(sizeof(u32));
+@@ -252,14 +251,13 @@
+ return compat_sys_semctl(semid, semnum, cmd, uptr);
+ }
+
+-SYSCALL_DEFINE4(n32_msgsnd, int, msqid, u32, msgp, unsigned int, msgsz,
+- int, msgflg)
++asmlinkage long sysn32_msgsnd(int msqid, u32 msgp, unsigned msgsz, int msgflg)
+ {
+ return compat_sys_msgsnd(msqid, msgsz, msgflg, compat_ptr(msgp));
+ }
+
+-SYSCALL_DEFINE5(n32_msgrcv, int, msqid, u32, msgp, size_t, msgsz,
+- int, msgtyp, int, msgflg)
++asmlinkage long sysn32_msgrcv(int msqid, u32 msgp, size_t msgsz, int msgtyp,
++ int msgflg)
+ {
+ return compat_sys_msgrcv(msqid, msgsz, msgtyp, msgflg, IPC_64,
+ compat_ptr(msgp));
+@@ -279,7 +277,7 @@
+
+ #ifdef CONFIG_SYSCTL_SYSCALL
+
+-SYSCALL_DEFINE1(32_sysctl, struct sysctl_args32 __user *, args)
++asmlinkage long sys32_sysctl(struct sysctl_args32 __user *args)
+ {
+ struct sysctl_args32 tmp;
+ int error;
+@@ -318,16 +316,9 @@
+ return error;
+ }
+
+-#else
+-
+-SYSCALL_DEFINE1(32_sysctl, struct sysctl_args32 __user *, args)
+-{
+- return -ENOSYS;
+-}
+-
+ #endif /* CONFIG_SYSCTL_SYSCALL */
+
+-SYSCALL_DEFINE1(32_newuname, struct new_utsname __user *, name)
++asmlinkage long sys32_newuname(struct new_utsname __user * name)
+ {
+ int ret = 0;
+
+@@ -343,7 +334,7 @@
+ return ret;
+ }
+
+-SYSCALL_DEFINE1(32_personality, unsigned long, personality)
++asmlinkage int sys32_personality(unsigned long personality)
+ {
+ int ret;
+ personality &= 0xffffffff;
+@@ -366,7 +357,7 @@
+
+ extern asmlinkage long sys_ustat(dev_t dev, struct ustat __user * ubuf);
+
+-SYSCALL_DEFINE2(32_ustat, dev_t, dev, struct ustat32 __user *, ubuf32)
++asmlinkage int sys32_ustat(dev_t dev, struct ustat32 __user * ubuf32)
+ {
+ int err;
+ struct ustat tmp;
+@@ -390,8 +381,8 @@
+ return err;
+ }
+
+-SYSCALL_DEFINE4(32_sendfile, long, out_fd, long, in_fd,
+- compat_off_t __user *, offset, s32, count)
++asmlinkage int sys32_sendfile(int out_fd, int in_fd, compat_off_t __user *offset,
++ s32 count)
+ {
+ mm_segment_t old_fs = get_fs();
+ int ret;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/kernel/mips-mt-fpaff.c linux-2.6.29-rc3.owrt/arch/mips/kernel/mips-mt-fpaff.c
+--- linux-2.6.29.owrt/arch/mips/kernel/mips-mt-fpaff.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/kernel/mips-mt-fpaff.c 2009-05-10 23:48:28.000000000 +0200
+@@ -79,8 +79,7 @@
+
+ euid = current_euid();
+ retval = -EPERM;
+- if (euid != p->cred->euid && euid != p->cred->uid &&
+- !capable(CAP_SYS_NICE)) {
++ if (euid != p->euid && euid != p->uid && !capable(CAP_SYS_NICE)) {
+ read_unlock(&tasklist_lock);
+ goto out_unlock;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/kernel/scall32-o32.S linux-2.6.29-rc3.owrt/arch/mips/kernel/scall32-o32.S
+--- linux-2.6.29.owrt/arch/mips/kernel/scall32-o32.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/kernel/scall32-o32.S 2009-05-10 23:48:28.000000000 +0200
+@@ -399,7 +399,7 @@
+ sys sys_swapon 2
+ sys sys_reboot 3
+ sys sys_old_readdir 3
+- sys sys_mips_mmap 6 /* 4090 */
++ sys old_mmap 6 /* 4090 */
+ sys sys_munmap 2
+ sys sys_truncate 2
+ sys sys_ftruncate 2
+@@ -519,7 +519,7 @@
+ sys sys_sendfile 4
+ sys sys_ni_syscall 0
+ sys sys_ni_syscall 0
+- sys sys_mips_mmap2 6 /* 4210 */
++ sys sys_mmap2 6 /* 4210 */
+ sys sys_truncate64 4
+ sys sys_ftruncate64 4
+ sys sys_stat64 2
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/kernel/scall64-64.S linux-2.6.29-rc3.owrt/arch/mips/kernel/scall64-64.S
+--- linux-2.6.29.owrt/arch/mips/kernel/scall64-64.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/kernel/scall64-64.S 2009-05-10 23:48:28.000000000 +0200
+@@ -207,7 +207,7 @@
+ PTR sys_newlstat
+ PTR sys_poll
+ PTR sys_lseek
+- PTR sys_mips_mmap
++ PTR old_mmap
+ PTR sys_mprotect /* 5010 */
+ PTR sys_munmap
+ PTR sys_brk
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/kernel/scall64-n32.S linux-2.6.29-rc3.owrt/arch/mips/kernel/scall64-n32.S
+--- linux-2.6.29.owrt/arch/mips/kernel/scall64-n32.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/kernel/scall64-n32.S 2009-05-10 23:48:28.000000000 +0200
+@@ -129,12 +129,12 @@
+ PTR sys_newlstat
+ PTR sys_poll
+ PTR sys_lseek
+- PTR sys_mips_mmap
++ PTR old_mmap
+ PTR sys_mprotect /* 6010 */
+ PTR sys_munmap
+ PTR sys_brk
+- PTR sys_32_rt_sigaction
+- PTR sys_32_rt_sigprocmask
++ PTR sys32_rt_sigaction
++ PTR sys32_rt_sigprocmask
+ PTR compat_sys_ioctl /* 6015 */
+ PTR sys_pread64
+ PTR sys_pwrite64
+@@ -159,7 +159,7 @@
+ PTR compat_sys_setitimer
+ PTR sys_alarm
+ PTR sys_getpid
+- PTR sys_32_sendfile
++ PTR sys32_sendfile
+ PTR sys_socket /* 6040 */
+ PTR sys_connect
+ PTR sys_accept
+@@ -181,14 +181,14 @@
+ PTR sys_exit
+ PTR compat_sys_wait4
+ PTR sys_kill /* 6060 */
+- PTR sys_32_newuname
++ PTR sys32_newuname
+ PTR sys_semget
+ PTR sys_semop
+- PTR sys_n32_semctl
++ PTR sysn32_semctl
+ PTR sys_shmdt /* 6065 */
+ PTR sys_msgget
+- PTR sys_n32_msgsnd
+- PTR sys_n32_msgrcv
++ PTR sysn32_msgsnd
++ PTR sysn32_msgrcv
+ PTR compat_sys_msgctl
+ PTR compat_sys_fcntl /* 6070 */
+ PTR sys_flock
+@@ -245,15 +245,15 @@
+ PTR sys_getsid
+ PTR sys_capget
+ PTR sys_capset
+- PTR sys_32_rt_sigpending /* 6125 */
++ PTR sys32_rt_sigpending /* 6125 */
+ PTR compat_sys_rt_sigtimedwait
+- PTR sys_32_rt_sigqueueinfo
++ PTR sys32_rt_sigqueueinfo
+ PTR sysn32_rt_sigsuspend
+ PTR sys32_sigaltstack
+ PTR compat_sys_utime /* 6130 */
+ PTR sys_mknod
+- PTR sys_32_personality
+- PTR sys_32_ustat
++ PTR sys32_personality
++ PTR sys32_ustat
+ PTR compat_sys_statfs
+ PTR compat_sys_fstatfs /* 6135 */
+ PTR sys_sysfs
+@@ -265,14 +265,14 @@
+ PTR sys_sched_getscheduler
+ PTR sys_sched_get_priority_max
+ PTR sys_sched_get_priority_min
+- PTR sys_32_sched_rr_get_interval /* 6145 */
++ PTR sys32_sched_rr_get_interval /* 6145 */
+ PTR sys_mlock
+ PTR sys_munlock
+ PTR sys_mlockall
+ PTR sys_munlockall
+ PTR sys_vhangup /* 6150 */
+ PTR sys_pivot_root
+- PTR sys_32_sysctl
++ PTR sys32_sysctl
+ PTR sys_prctl
+ PTR compat_sys_adjtimex
+ PTR compat_sys_setrlimit /* 6155 */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/kernel/scall64-o32.S linux-2.6.29-rc3.owrt/arch/mips/kernel/scall64-o32.S
+--- linux-2.6.29.owrt/arch/mips/kernel/scall64-o32.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/kernel/scall64-o32.S 2009-05-10 23:48:28.000000000 +0200
+@@ -265,12 +265,12 @@
+ PTR sys_olduname
+ PTR sys_umask /* 4060 */
+ PTR sys_chroot
+- PTR sys_32_ustat
++ PTR sys32_ustat
+ PTR sys_dup2
+ PTR sys_getppid
+ PTR sys_getpgrp /* 4065 */
+ PTR sys_setsid
+- PTR sys_32_sigaction
++ PTR sys32_sigaction
+ PTR sys_sgetmask
+ PTR sys_ssetmask
+ PTR sys_setreuid /* 4070 */
+@@ -293,7 +293,7 @@
+ PTR sys_swapon
+ PTR sys_reboot
+ PTR compat_sys_old_readdir
+- PTR sys_mips_mmap /* 4090 */
++ PTR old_mmap /* 4090 */
+ PTR sys_munmap
+ PTR sys_truncate
+ PTR sys_ftruncate
+@@ -320,12 +320,12 @@
+ PTR compat_sys_wait4
+ PTR sys_swapoff /* 4115 */
+ PTR compat_sys_sysinfo
+- PTR sys_32_ipc
++ PTR sys32_ipc
+ PTR sys_fsync
+ PTR sys32_sigreturn
+ PTR sys32_clone /* 4120 */
+ PTR sys_setdomainname
+- PTR sys_32_newuname
++ PTR sys32_newuname
+ PTR sys_ni_syscall /* sys_modify_ldt */
+ PTR compat_sys_adjtimex
+ PTR sys_mprotect /* 4125 */
+@@ -339,11 +339,11 @@
+ PTR sys_fchdir
+ PTR sys_bdflush
+ PTR sys_sysfs /* 4135 */
+- PTR sys_32_personality
++ PTR sys32_personality
+ PTR sys_ni_syscall /* for afs_syscall */
+ PTR sys_setfsuid
+ PTR sys_setfsgid
+- PTR sys_32_llseek /* 4140 */
++ PTR sys32_llseek /* 4140 */
+ PTR compat_sys_getdents
+ PTR compat_sys_select
+ PTR sys_flock
+@@ -356,7 +356,7 @@
+ PTR sys_ni_syscall /* 4150 */
+ PTR sys_getsid
+ PTR sys_fdatasync
+- PTR sys_32_sysctl
++ PTR sys32_sysctl
+ PTR sys_mlock
+ PTR sys_munlock /* 4155 */
+ PTR sys_mlockall
+@@ -368,7 +368,7 @@
+ PTR sys_sched_yield
+ PTR sys_sched_get_priority_max
+ PTR sys_sched_get_priority_min
+- PTR sys_32_sched_rr_get_interval /* 4165 */
++ PTR sys32_sched_rr_get_interval /* 4165 */
+ PTR compat_sys_nanosleep
+ PTR sys_mremap
+ PTR sys_accept
+@@ -397,25 +397,25 @@
+ PTR sys_getresgid
+ PTR sys_prctl
+ PTR sys32_rt_sigreturn
+- PTR sys_32_rt_sigaction
+- PTR sys_32_rt_sigprocmask /* 4195 */
+- PTR sys_32_rt_sigpending
++ PTR sys32_rt_sigaction
++ PTR sys32_rt_sigprocmask /* 4195 */
++ PTR sys32_rt_sigpending
+ PTR compat_sys_rt_sigtimedwait
+- PTR sys_32_rt_sigqueueinfo
++ PTR sys32_rt_sigqueueinfo
+ PTR sys32_rt_sigsuspend
+- PTR sys_32_pread /* 4200 */
+- PTR sys_32_pwrite
++ PTR sys32_pread /* 4200 */
++ PTR sys32_pwrite
+ PTR sys_chown
+ PTR sys_getcwd
+ PTR sys_capget
+ PTR sys_capset /* 4205 */
+ PTR sys32_sigaltstack
+- PTR sys_32_sendfile
++ PTR sys32_sendfile
+ PTR sys_ni_syscall
+ PTR sys_ni_syscall
+- PTR sys_mips_mmap2 /* 4210 */
+- PTR sys_32_truncate64
+- PTR sys_32_ftruncate64
++ PTR sys32_mmap2 /* 4210 */
++ PTR sys32_truncate64
++ PTR sys32_ftruncate64
+ PTR sys_newstat
+ PTR sys_newlstat
+ PTR sys_newfstat /* 4215 */
+@@ -481,7 +481,7 @@
+ PTR compat_sys_mq_notify /* 4275 */
+ PTR compat_sys_mq_getsetattr
+ PTR sys_ni_syscall /* sys_vserver */
+- PTR sys_32_waitid
++ PTR sys32_waitid
+ PTR sys_ni_syscall /* available, was setaltroot */
+ PTR sys_add_key /* 4280 */
+ PTR sys_request_key
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/kernel/signal32.c linux-2.6.29-rc3.owrt/arch/mips/kernel/signal32.c
+--- linux-2.6.29.owrt/arch/mips/kernel/signal32.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/kernel/signal32.c 2009-05-10 23:48:28.000000000 +0200
+@@ -349,8 +349,8 @@
+ return -ERESTARTNOHAND;
+ }
+
+-SYSCALL_DEFINE3(32_sigaction, long, sig, const struct sigaction32 __user *, act,
+- struct sigaction32 __user *, oact)
++asmlinkage int sys32_sigaction(int sig, const struct sigaction32 __user *act,
++ struct sigaction32 __user *oact)
+ {
+ struct k_sigaction new_ka, old_ka;
+ int ret;
+@@ -704,9 +704,9 @@
+ .restart = __NR_O32_restart_syscall
+ };
+
+-SYSCALL_DEFINE4(32_rt_sigaction, int, sig,
+- const struct sigaction32 __user *, act,
+- struct sigaction32 __user *, oact, unsigned int, sigsetsize)
++asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 __user *act,
++ struct sigaction32 __user *oact,
++ unsigned int sigsetsize)
+ {
+ struct k_sigaction new_sa, old_sa;
+ int ret = -EINVAL;
+@@ -748,8 +748,8 @@
+ return ret;
+ }
+
+-SYSCALL_DEFINE4(32_rt_sigprocmask, int, how, compat_sigset_t __user *, set,
+- compat_sigset_t __user *, oset, unsigned int, sigsetsize)
++asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t __user *set,
++ compat_sigset_t __user *oset, unsigned int sigsetsize)
+ {
+ sigset_t old_set, new_set;
+ int ret;
+@@ -770,8 +770,8 @@
+ return ret;
+ }
+
+-SYSCALL_DEFINE2(32_rt_sigpending, compat_sigset_t __user *, uset,
+- unsigned int, sigsetsize)
++asmlinkage int sys32_rt_sigpending(compat_sigset_t __user *uset,
++ unsigned int sigsetsize)
+ {
+ int ret;
+ sigset_t set;
+@@ -787,8 +787,7 @@
+ return ret;
+ }
+
+-SYSCALL_DEFINE3(32_rt_sigqueueinfo, int, pid, int, sig,
+- compat_siginfo_t __user *, uinfo)
++asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo)
+ {
+ siginfo_t info;
+ int ret;
+@@ -803,9 +802,10 @@
+ return ret;
+ }
+
+-SYSCALL_DEFINE5(32_waitid, int, which, compat_pid_t, pid,
+- compat_siginfo_t __user *, uinfo, int, options,
+- struct compat_rusage __user *, uru)
++asmlinkage long
++sys32_waitid(int which, compat_pid_t pid,
++ compat_siginfo_t __user *uinfo, int options,
++ struct compat_rusage __user *uru)
+ {
+ siginfo_t info;
+ struct rusage ru;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/kernel/signal.c linux-2.6.29-rc3.owrt/arch/mips/kernel/signal.c
+--- linux-2.6.29.owrt/arch/mips/kernel/signal.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/kernel/signal.c 2009-05-10 23:48:28.000000000 +0200
+@@ -19,7 +19,6 @@
+ #include <linux/ptrace.h>
+ #include <linux/unistd.h>
+ #include <linux/compiler.h>
+-#include <linux/syscalls.h>
+ #include <linux/uaccess.h>
+
+ #include <asm/abi.h>
+@@ -339,8 +338,8 @@
+ }
+
+ #ifdef CONFIG_TRAD_SIGNALS
+-SYSCALL_DEFINE3(sigaction, int, sig, const struct sigaction __user *, act,
+- struct sigaction __user *, oact)
++asmlinkage int sys_sigaction(int sig, const struct sigaction __user *act,
++ struct sigaction __user *oact)
+ {
+ struct k_sigaction new_ka, old_ka;
+ int ret;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/kernel/syscall.c linux-2.6.29-rc3.owrt/arch/mips/kernel/syscall.c
+--- linux-2.6.29.owrt/arch/mips/kernel/syscall.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/kernel/syscall.c 2009-05-10 23:48:28.000000000 +0200
+@@ -152,9 +152,9 @@
+ return error;
+ }
+
+-SYSCALL_DEFINE6(mips_mmap, unsigned long, addr, unsigned long, len,
+- unsigned long, prot, unsigned long, flags, unsigned long,
+- fd, off_t, offset)
++asmlinkage unsigned long
++old_mmap(unsigned long addr, unsigned long len, int prot,
++ int flags, int fd, off_t offset)
+ {
+ unsigned long result;
+
+@@ -168,9 +168,9 @@
+ return result;
+ }
+
+-SYSCALL_DEFINE6(mips_mmap2, unsigned long, addr, unsigned long, len,
+- unsigned long, prot, unsigned long, flags, unsigned long, fd,
+- unsigned long, pgoff)
++asmlinkage unsigned long
++sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot,
++ unsigned long flags, unsigned long fd, unsigned long pgoff)
+ {
+ if (pgoff & (~PAGE_MASK >> 12))
+ return -EINVAL;
+@@ -240,7 +240,7 @@
+ /*
+ * Compacrapability ...
+ */
+-SYSCALL_DEFINE1(uname, struct old_utsname __user *, name)
++asmlinkage int sys_uname(struct old_utsname __user * name)
+ {
+ if (name && !copy_to_user(name, utsname(), sizeof (*name)))
+ return 0;
+@@ -250,7 +250,7 @@
+ /*
+ * Compacrapability ...
+ */
+-SYSCALL_DEFINE1(olduname, struct oldold_utsname __user *, name)
++asmlinkage int sys_olduname(struct oldold_utsname __user * name)
+ {
+ int error;
+
+@@ -279,7 +279,7 @@
+ return error;
+ }
+
+-SYSCALL_DEFINE1(set_thread_area, unsigned long, addr)
++asmlinkage int sys_set_thread_area(unsigned long addr)
+ {
+ struct thread_info *ti = task_thread_info(current);
+
+@@ -290,7 +290,7 @@
+ return 0;
+ }
+
+-asmlinkage int _sys_sysmips(long cmd, long arg1, long arg2, long arg3)
++asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3)
+ {
+ switch (cmd) {
+ case MIPS_ATOMIC_SET:
+@@ -325,8 +325,8 @@
+ *
+ * This is really horribly ugly.
+ */
+-SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, int, second,
+- unsigned long, third, void __user *, ptr, long, fifth)
++asmlinkage int sys_ipc(unsigned int call, int first, int second,
++ unsigned long third, void __user *ptr, long fifth)
+ {
+ int version, ret;
+
+@@ -411,7 +411,7 @@
+ /*
+ * No implemented yet ...
+ */
+-SYSCALL_DEFINE3(cachectl, char *, addr, int, nbytes, int, op)
++asmlinkage int sys_cachectl(char *addr, int nbytes, int op)
+ {
+ return -ENOSYS;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/kernel/traps.c linux-2.6.29-rc3.owrt/arch/mips/kernel/traps.c
+--- linux-2.6.29.owrt/arch/mips/kernel/traps.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/kernel/traps.c 2009-05-10 23:48:28.000000000 +0200
+@@ -944,9 +944,6 @@
+ force_sig(SIGILL, current);
+ }
+
+-/*
+- * Called with interrupts disabled.
+- */
+ asmlinkage void do_watch(struct pt_regs *regs)
+ {
+ u32 cause;
+@@ -966,12 +963,9 @@
+ */
+ if (test_tsk_thread_flag(current, TIF_LOAD_WATCH)) {
+ mips_read_watch_registers();
+- local_irq_enable();
+ force_sig(SIGTRAP, current);
+- } else {
++ } else
+ mips_clear_watch_registers();
+- local_irq_enable();
+- }
+ }
+
+ asmlinkage void do_mcheck(struct pt_regs *regs)
+@@ -1588,11 +1582,7 @@
+ static char panic_null_cerr[] __cpuinitdata =
+ "Trying to set NULL cache error exception handler";
+
+-/*
+- * Install uncached CPU exception handler.
+- * This is suitable only for the cache error exception which is the only
+- * exception handler that is being run uncached.
+- */
++/* Install uncached CPU exception handler */
+ void __cpuinit set_uncached_handler(unsigned long offset, void *addr,
+ unsigned long size)
+ {
+@@ -1603,7 +1593,7 @@
+ unsigned long uncached_ebase = TO_UNCAC(ebase);
+ #endif
+ if (cpu_has_mips_r2)
+- uncached_ebase += (read_c0_ebase() & 0x3ffff000);
++ ebase += (read_c0_ebase() & 0x3ffff000);
+
+ if (!addr)
+ panic(panic_null_cerr);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/lib/memcpy-inatomic.S linux-2.6.29-rc3.owrt/arch/mips/lib/memcpy-inatomic.S
+--- linux-2.6.29.owrt/arch/mips/lib/memcpy-inatomic.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/lib/memcpy-inatomic.S 2009-05-10 23:48:28.000000000 +0200
+@@ -21,7 +21,7 @@
+ * end of memory on some systems. It's also a seriously bad idea on non
+ * dma-coherent systems.
+ */
+-#ifdef CONFIG_DMA_NONCOHERENT
++#if !defined(CONFIG_DMA_COHERENT) || !defined(CONFIG_DMA_IP27)
+ #undef CONFIG_CPU_HAS_PREFETCH
+ #endif
+ #ifdef CONFIG_MIPS_MALTA
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/lib/memcpy.S linux-2.6.29-rc3.owrt/arch/mips/lib/memcpy.S
+--- linux-2.6.29.owrt/arch/mips/lib/memcpy.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/lib/memcpy.S 2009-05-10 23:48:28.000000000 +0200
+@@ -21,7 +21,7 @@
+ * end of memory on some systems. It's also a seriously bad idea on non
+ * dma-coherent systems.
+ */
+-#ifdef CONFIG_DMA_NONCOHERENT
++#if !defined(CONFIG_DMA_COHERENT) || !defined(CONFIG_DMA_IP27)
+ #undef CONFIG_CPU_HAS_PREFETCH
+ #endif
+ #ifdef CONFIG_MIPS_MALTA
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/Makefile linux-2.6.29-rc3.owrt/arch/mips/Makefile
+--- linux-2.6.29.owrt/arch/mips/Makefile 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/Makefile 2009-05-10 23:48:28.000000000 +0200
+@@ -416,7 +416,7 @@
+ #
+ # Common NEC EMMAXXX
+ #
+-core-$(CONFIG_SOC_EMMA2RH) += arch/mips/emma/common/
++core-$(CONFIG_SOC_EMMA) += arch/mips/emma/common/
+ cflags-$(CONFIG_SOC_EMMA2RH) += -I$(srctree)/arch/mips/include/asm/mach-emma2rh
+
+ #
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/mm/cache.c linux-2.6.29-rc3.owrt/arch/mips/mm/cache.c
+--- linux-2.6.29.owrt/arch/mips/mm/cache.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/mm/cache.c 2009-05-10 23:48:28.000000000 +0200
+@@ -13,7 +13,6 @@
+ #include <linux/linkage.h>
+ #include <linux/module.h>
+ #include <linux/sched.h>
+-#include <linux/syscalls.h>
+ #include <linux/mm.h>
+
+ #include <asm/cacheflush.h>
+@@ -59,8 +58,8 @@
+ * We could optimize the case where the cache argument is not BCACHE but
+ * that seems very atypical use ...
+ */
+-SYSCALL_DEFINE3(cacheflush, unsigned long, addr, unsigned long, bytes,
+- unsigned int, cache)
++asmlinkage int sys_cacheflush(unsigned long addr,
++ unsigned long bytes, unsigned int cache)
+ {
+ if (bytes == 0)
+ return 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/mm/c-r4k.c linux-2.6.29-rc3.owrt/arch/mips/mm/c-r4k.c
+--- linux-2.6.29.owrt/arch/mips/mm/c-r4k.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/mm/c-r4k.c 2009-05-10 23:48:28.000000000 +0200
+@@ -618,35 +618,15 @@
+ if (cpu_has_inclusive_pcaches) {
+ if (size >= scache_size)
+ r4k_blast_scache();
+- else {
+- unsigned long lsize = cpu_scache_line_size();
+- unsigned long almask = ~(lsize - 1);
+-
+- /*
+- * There is no clearly documented alignment requirement
+- * for the cache instruction on MIPS processors and
+- * some processors, among them the RM5200 and RM7000
+- * QED processors will throw an address error for cache
+- * hit ops with insufficient alignment. Solved by
+- * aligning the address to cache line size.
+- */
+- cache_op(Hit_Writeback_Inv_SD, addr & almask);
+- cache_op(Hit_Writeback_Inv_SD,
+- (addr + size - 1) & almask);
++ else
+ blast_inv_scache_range(addr, addr + size);
+- }
+ return;
+ }
+
+ if (cpu_has_safe_index_cacheops && size >= dcache_size) {
+ r4k_blast_dcache();
+ } else {
+- unsigned long lsize = cpu_dcache_line_size();
+- unsigned long almask = ~(lsize - 1);
+-
+ R4600_HIT_CACHEOP_WAR_IMPL;
+- cache_op(Hit_Writeback_Inv_D, addr & almask);
+- cache_op(Hit_Writeback_Inv_D, (addr + size - 1) & almask);
+ blast_inv_dcache_range(addr, addr + size);
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/mm/fault.c linux-2.6.29-rc3.owrt/arch/mips/mm/fault.c
+--- linux-2.6.29.owrt/arch/mips/mm/fault.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/mm/fault.c 2009-05-10 23:48:28.000000000 +0200
+@@ -97,6 +97,7 @@
+ goto bad_area;
+ }
+
++survive:
+ /*
+ * If for any reason at all we couldn't handle the fault,
+ * make sure we exit gracefully rather than endlessly redo
+@@ -166,13 +167,21 @@
+ field, regs->regs[31]);
+ die("Oops", regs);
+
++/*
++ * We ran out of memory, or some other thing happened to us that made
++ * us unable to handle the page fault gracefully.
++ */
+ out_of_memory:
+- /*
+- * We ran out of memory, call the OOM killer, and return the userspace
+- * (which will retry the fault, or kill us if we got oom-killed).
+- */
+- pagefault_out_of_memory();
+- return;
++ up_read(&mm->mmap_sem);
++ if (is_global_init(tsk)) {
++ yield();
++ down_read(&mm->mmap_sem);
++ goto survive;
++ }
++ printk("VM: killing process %s\n", tsk->comm);
++ if (user_mode(regs))
++ do_group_exit(SIGKILL);
++ goto no_context;
+
+ do_sigbus:
+ up_read(&mm->mmap_sem);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/mm/page.c linux-2.6.29-rc3.owrt/arch/mips/mm/page.c
+--- linux-2.6.29.owrt/arch/mips/mm/page.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/mm/page.c 2009-05-10 23:48:28.000000000 +0200
+@@ -172,9 +172,8 @@
+ */
+ cache_line_size = cpu_dcache_line_size();
+ switch (current_cpu_type()) {
+- case CPU_R5500:
+ case CPU_TX49XX:
+- /* These processors only support the Pref_Load. */
++ /* TX49 supports only Pref_Load */
+ pref_bias_copy_load = 256;
+ break;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/mm/tlbex.c linux-2.6.29-rc3.owrt/arch/mips/mm/tlbex.c
+--- linux-2.6.29.owrt/arch/mips/mm/tlbex.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/mm/tlbex.c 2009-05-10 23:48:28.000000000 +0200
+@@ -318,7 +318,6 @@
+ case CPU_BCM4710:
+ case CPU_LOONGSON2:
+ case CPU_CAVIUM_OCTEON:
+- case CPU_R5500:
+ if (m4kc_tlbp_war())
+ uasm_i_nop(p);
+ tlbw(p);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/pci/pci-rc32434.c linux-2.6.29-rc3.owrt/arch/mips/pci/pci-rc32434.c
+--- linux-2.6.29.owrt/arch/mips/pci/pci-rc32434.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/pci/pci-rc32434.c 2009-05-10 23:48:28.000000000 +0200
+@@ -205,8 +205,6 @@
+
+ static int __init rc32434_pci_init(void)
+ {
+- void __iomem *io_map_base;
+-
+ pr_info("PCI: Initializing PCI\n");
+
+ ioport_resource.start = rc32434_res_pci_io1.start;
+@@ -214,15 +212,6 @@
+
+ rc32434_pcibridge_init();
+
+- io_map_base = ioremap(rc32434_res_pci_io1.start,
+- rc32434_res_pci_io1.end - rc32434_res_pci_io1.start + 1);
+-
+- if (!io_map_base)
+- return -ENOMEM;
+-
+- rc32434_controller.io_map_base =
+- (unsigned long)io_map_base - rc32434_res_pci_io1.start;
+-
+ register_pci_controller(&rc32434_controller);
+ rc32434_sync();
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/rb532/devices.c linux-2.6.29-rc3.owrt/arch/mips/rb532/devices.c
+--- linux-2.6.29.owrt/arch/mips/rb532/devices.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/rb532/devices.c 2009-05-10 23:48:28.000000000 +0200
+@@ -24,7 +24,6 @@
+ #include <linux/mtd/partitions.h>
+ #include <linux/gpio_keys.h>
+ #include <linux/input.h>
+-#include <linux/serial_8250.h>
+
+ #include <asm/bootinfo.h>
+
+@@ -40,29 +39,6 @@
+ #define ETH0_RX_DMA_ADDR (DMA0_BASE_ADDR + 0 * DMA_CHAN_OFFSET)
+ #define ETH0_TX_DMA_ADDR (DMA0_BASE_ADDR + 1 * DMA_CHAN_OFFSET)
+
+-extern unsigned int idt_cpu_freq;
+-
+-static struct mpmc_device dev3;
+-
+-void set_latch_u5(unsigned char or_mask, unsigned char nand_mask)
+-{
+- unsigned long flags;
+-
+- spin_lock_irqsave(&dev3.lock, flags);
+-
+- dev3.state = (dev3.state | or_mask) & ~nand_mask;
+- writeb(dev3.state, dev3.base);
+-
+- spin_unlock_irqrestore(&dev3.lock, flags);
+-}
+-EXPORT_SYMBOL(set_latch_u5);
+-
+-unsigned char get_latch_u5(void)
+-{
+- return dev3.state;
+-}
+-EXPORT_SYMBOL(get_latch_u5);
+-
+ static struct resource korina_dev0_res[] = {
+ {
+ .name = "korina_regs",
+@@ -110,7 +86,7 @@
+ static struct platform_device korina_dev0 = {
+ .id = -1,
+ .name = "korina",
+- .dev.driver_data = &korina_dev0_data,
++ .dev.platform_data = &korina_dev0_data,
+ .resource = korina_dev0_res,
+ .num_resources = ARRAY_SIZE(korina_dev0_res),
+ };
+@@ -238,32 +214,12 @@
+ .num_resources = ARRAY_SIZE(rb532_wdt_res),
+ };
+
+-static struct plat_serial8250_port rb532_uart_res[] = {
+- {
+- .membase = (char *)KSEG1ADDR(REGBASE + UART0BASE),
+- .irq = UART0_IRQ,
+- .regshift = 2,
+- .iotype = UPIO_MEM,
+- .flags = UPF_BOOT_AUTOCONF,
+- },
+- {
+- .flags = 0,
+- }
+-};
+-
+-static struct platform_device rb532_uart = {
+- .name = "serial8250",
+- .id = PLAT8250_DEV_PLATFORM,
+- .dev.platform_data = &rb532_uart_res,
+-};
+-
+ static struct platform_device *rb532_devs[] = {
+ &korina_dev0,
+ &nand_slot0,
+ &cf_slot0,
+ &rb532_led,
+ &rb532_button,
+- &rb532_uart,
+ &rb532_wdt
+ };
+
+@@ -335,20 +291,9 @@
+ nand_slot0_res[0].start = readl(IDT434_REG_BASE + DEV2BASE);
+ nand_slot0_res[0].end = nand_slot0_res[0].start + 0x1000;
+
+- /* Read and map device controller 3 */
+- dev3.base = ioremap_nocache(readl(IDT434_REG_BASE + DEV3BASE), 1);
+-
+- if (!dev3.base) {
+- printk(KERN_ERR "rb532: cannot remap device controller 3\n");
+- return -ENXIO;
+- }
+-
+ /* Initialise the NAND device */
+ rb532_nand_setup();
+
+- /* set the uart clock to the current cpu frequency */
+- rb532_uart_res[0].uartclk = idt_cpu_freq;
+-
+ return platform_add_devices(rb532_devs, ARRAY_SIZE(rb532_devs));
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/rb532/gpio.c linux-2.6.29-rc3.owrt/arch/mips/rb532/gpio.c
+--- linux-2.6.29.owrt/arch/mips/rb532/gpio.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/rb532/gpio.c 2009-05-10 23:48:28.000000000 +0200
+@@ -41,6 +41,8 @@
+ void __iomem *regbase;
+ };
+
++struct mpmc_device dev3;
++
+ static struct resource rb532_gpio_reg0_res[] = {
+ {
+ .name = "gpio_reg0",
+@@ -50,6 +52,61 @@
+ }
+ };
+
++static struct resource rb532_dev3_ctl_res[] = {
++ {
++ .name = "dev3_ctl",
++ .start = REGBASE + DEV3BASE,
++ .end = REGBASE + DEV3BASE + sizeof(struct dev_reg) - 1,
++ .flags = IORESOURCE_MEM,
++ }
++};
++
++void set_434_reg(unsigned reg_offs, unsigned bit, unsigned len, unsigned val)
++{
++ unsigned long flags;
++ unsigned data;
++ unsigned i = 0;
++
++ spin_lock_irqsave(&dev3.lock, flags);
++
++ data = readl(IDT434_REG_BASE + reg_offs);
++ for (i = 0; i != len; ++i) {
++ if (val & (1 << i))
++ data |= (1 << (i + bit));
++ else
++ data &= ~(1 << (i + bit));
++ }
++ writel(data, (IDT434_REG_BASE + reg_offs));
++
++ spin_unlock_irqrestore(&dev3.lock, flags);
++}
++EXPORT_SYMBOL(set_434_reg);
++
++unsigned get_434_reg(unsigned reg_offs)
++{
++ return readl(IDT434_REG_BASE + reg_offs);
++}
++EXPORT_SYMBOL(get_434_reg);
++
++void set_latch_u5(unsigned char or_mask, unsigned char nand_mask)
++{
++ unsigned long flags;
++
++ spin_lock_irqsave(&dev3.lock, flags);
++
++ dev3.state = (dev3.state | or_mask) & ~nand_mask;
++ writel(dev3.state, &dev3.base);
++
++ spin_unlock_irqrestore(&dev3.lock, flags);
++}
++EXPORT_SYMBOL(set_latch_u5);
++
++unsigned char get_latch_u5(void)
++{
++ return dev3.state;
++}
++EXPORT_SYMBOL(get_latch_u5);
++
+ /* rb532_set_bit - sanely set a bit
+ *
+ * bitval: new value for the bit
+@@ -62,11 +119,13 @@
+ unsigned long flags;
+ u32 val;
+
++ bitval = !!bitval; /* map parameter to {0,1} */
++
+ local_irq_save(flags);
+
+ val = readl(ioaddr);
+- val &= ~(!bitval << offset); /* unset bit if bitval == 0 */
+- val |= (!!bitval << offset); /* set bit if bitval == 1 */
++ val &= ~( ~bitval << offset ); /* unset bit if bitval == 0 */
++ val |= ( bitval << offset ); /* set bit if bitval == 1 */
+ writel(val, ioaddr);
+
+ local_irq_restore(flags);
+@@ -112,8 +171,8 @@
+
+ gpch = container_of(chip, struct rb532_gpio_chip, chip);
+
+- /* disable alternate function in case it's set */
+- rb532_set_bit(0, offset, gpch->regbase + GPIOFUNC);
++ if (rb532_get_bit(offset, gpch->regbase + GPIOFUNC))
++ return 1; /* alternate function, GPIOCFG is ignored */
+
+ rb532_set_bit(0, offset, gpch->regbase + GPIOCFG);
+ return 0;
+@@ -129,8 +188,8 @@
+
+ gpch = container_of(chip, struct rb532_gpio_chip, chip);
+
+- /* disable alternate function in case it's set */
+- rb532_set_bit(0, offset, gpch->regbase + GPIOFUNC);
++ if (rb532_get_bit(offset, gpch->regbase + GPIOFUNC))
++ return 1; /* alternate function, GPIOCFG is ignored */
+
+ /* set the initial output value */
+ rb532_set_bit(value, offset, gpch->regbase + GPIOD);
+@@ -174,11 +233,10 @@
+ /*
+ * Configure GPIO alternate function
+ */
+-void rb532_gpio_set_func(unsigned gpio)
++static void rb532_gpio_set_func(int bit, unsigned gpio)
+ {
+- rb532_set_bit(1, gpio, rb532_gpio_chip->regbase + GPIOFUNC);
++ rb532_set_bit(bit, gpio, rb532_gpio_chip->regbase + GPIOFUNC);
+ }
+-EXPORT_SYMBOL(rb532_gpio_set_func);
+
+ int __init rb532_gpio_init(void)
+ {
+@@ -195,6 +253,20 @@
+ /* Register our GPIO chip */
+ gpiochip_add(&rb532_gpio_chip->chip);
+
++ r = rb532_dev3_ctl_res;
++ dev3.base = ioremap_nocache(r->start, r->end - r->start);
++
++ if (!dev3.base) {
++ printk(KERN_ERR "rb532: cannot remap device controller 3\n");
++ return -ENXIO;
++ }
++
++ /* configure CF_GPIO_NUM as CFRDY IRQ source */
++ rb532_gpio_set_func(0, CF_GPIO_NUM);
++ rb532_gpio_direction_input(&rb532_gpio_chip->chip, CF_GPIO_NUM);
++ rb532_gpio_set_ilevel(1, CF_GPIO_NUM);
++ rb532_gpio_set_istat(0, CF_GPIO_NUM);
++
+ return 0;
+ }
+ arch_initcall(rb532_gpio_init);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/rb532/irq.c linux-2.6.29-rc3.owrt/arch/mips/rb532/irq.c
+--- linux-2.6.29.owrt/arch/mips/rb532/irq.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/rb532/irq.c 2009-05-10 23:48:28.000000000 +0200
+@@ -46,7 +46,6 @@
+ #include <asm/system.h>
+
+ #include <asm/mach-rc32434/irq.h>
+-#include <asm/mach-rc32434/gpio.h>
+
+ struct intr_group {
+ u32 mask; /* mask of valid bits in pending/mask registers */
+@@ -151,9 +150,6 @@
+ mask |= intr_bit;
+ WRITE_MASK(addr, mask);
+
+- if (group == GPIO_MAPPED_IRQ_GROUP)
+- rb532_gpio_set_istat(0, irq_nr - GPIO_MAPPED_IRQ_BASE);
+-
+ /*
+ * if there are no more interrupts enabled in this
+ * group, disable corresponding IP
+@@ -169,35 +165,12 @@
+ ack_local_irq(group_to_ip(irq_to_group(irq_nr)));
+ }
+
+-static int rb532_set_type(unsigned int irq_nr, unsigned type)
+-{
+- int gpio = irq_nr - GPIO_MAPPED_IRQ_BASE;
+- int group = irq_to_group(irq_nr);
+-
+- if (group != GPIO_MAPPED_IRQ_GROUP)
+- return (type == IRQ_TYPE_LEVEL_HIGH) ? 0 : -EINVAL;
+-
+- switch (type) {
+- case IRQ_TYPE_LEVEL_HIGH:
+- rb532_gpio_set_ilevel(1, gpio);
+- break;
+- case IRQ_TYPE_LEVEL_LOW:
+- rb532_gpio_set_ilevel(0, gpio);
+- break;
+- default:
+- return -EINVAL;
+- }
+-
+- return 0;
+-}
+-
+ static struct irq_chip rc32434_irq_type = {
+ .name = "RB532",
+ .ack = rb532_disable_irq,
+ .mask = rb532_disable_irq,
+ .mask_ack = rb532_mask_and_ack_irq,
+ .unmask = rb532_enable_irq,
+- .set_type = rb532_set_type,
+ };
+
+ void __init arch_init_irq(void)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/rb532/serial.c linux-2.6.29-rc3.owrt/arch/mips/rb532/serial.c
+--- linux-2.6.29.owrt/arch/mips/rb532/serial.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/rb532/serial.c 2009-05-10 23:48:28.000000000 +0200
+@@ -36,7 +36,7 @@
+ extern unsigned int idt_cpu_freq;
+
+ static struct uart_port rb532_uart = {
+- .flags = UPF_BOOT_AUTOCONF,
++ .type = PORT_16550A,
+ .line = 0,
+ .irq = UART0_IRQ,
+ .iotype = UPIO_MEM,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/txx9/generic/setup_tx4939.c linux-2.6.29-rc3.owrt/arch/mips/txx9/generic/setup_tx4939.c
+--- linux-2.6.29.owrt/arch/mips/txx9/generic/setup_tx4939.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/txx9/generic/setup_tx4939.c 2009-05-10 23:48:28.000000000 +0200
+@@ -435,28 +435,6 @@
+ platform_device_register(&ata1_dev);
+ }
+
+-void __init tx4939_rtc_init(void)
+-{
+- static struct resource res[] = {
+- {
+- .start = TX4939_RTC_REG & 0xfffffffffULL,
+- .end = (TX4939_RTC_REG & 0xfffffffffULL) + 0x100 - 1,
+- .flags = IORESOURCE_MEM,
+- }, {
+- .start = TXX9_IRQ_BASE + TX4939_IR_RTC,
+- .flags = IORESOURCE_IRQ,
+- },
+- };
+- static struct platform_device rtc_dev = {
+- .name = "tx4939rtc",
+- .id = -1,
+- .num_resources = ARRAY_SIZE(res),
+- .resource = res,
+- };
+-
+- platform_device_register(&rtc_dev);
+-}
+-
+ static void __init tx4939_stop_unused_modules(void)
+ {
+ __u64 pcfg, rst = 0, ckd = 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mips/txx9/rbtx4939/setup.c linux-2.6.29-rc3.owrt/arch/mips/txx9/rbtx4939/setup.c
+--- linux-2.6.29.owrt/arch/mips/txx9/rbtx4939/setup.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mips/txx9/rbtx4939/setup.c 2009-05-10 23:48:28.000000000 +0200
+@@ -336,7 +336,6 @@
+ rbtx4939_led_setup();
+ tx4939_wdt_init();
+ tx4939_ata_init();
+- tx4939_rtc_init();
+ }
+
+ static void __init rbtx4939_setup(void)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mn10300/Kconfig linux-2.6.29-rc3.owrt/arch/mn10300/Kconfig
+--- linux-2.6.29.owrt/arch/mn10300/Kconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mn10300/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -7,7 +7,6 @@
+
+ config MN10300
+ def_bool y
+- select HAVE_OPROFILE
+
+ config AM33
+ def_bool y
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/mn10300/unit-asb2305/pci.c linux-2.6.29-rc3.owrt/arch/mn10300/unit-asb2305/pci.c
+--- linux-2.6.29.owrt/arch/mn10300/unit-asb2305/pci.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/mn10300/unit-asb2305/pci.c 2009-05-10 23:48:28.000000000 +0200
+@@ -173,7 +173,7 @@
+ BRIDGEREGB(where) = value;
+ } else {
+ if (bus->number == 0 &&
+- (devfn == PCI_DEVFN(2, 0) || devfn == PCI_DEVFN(3, 0))
++ (devfn == PCI_DEVFN(2, 0) && devfn == PCI_DEVFN(3, 0))
+ )
+ __pcidebug("<= %02x", bus, devfn, where, value);
+ CONFIG_ADDRESS = CONFIG_CMD(bus, devfn, where);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/parisc/configs/712_defconfig linux-2.6.29-rc3.owrt/arch/parisc/configs/712_defconfig
+--- linux-2.6.29.owrt/arch/parisc/configs/712_defconfig 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/parisc/configs/712_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-rc8
+-# Fri Mar 13 01:32:55 2009
++# Linux kernel version: 2.6.23
++# Fri Oct 12 21:00:07 2007
+ #
+ CONFIG_PARISC=y
+ CONFIG_MMU=y
+@@ -33,35 +33,17 @@
+ CONFIG_POSIX_MQUEUE=y
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
++# CONFIG_USER_NS is not set
+ # CONFIG_AUDIT is not set
+-
+-#
+-# RCU Subsystem
+-#
+-CONFIG_CLASSIC_RCU=y
+-# CONFIG_TREE_RCU is not set
+-# CONFIG_PREEMPT_RCU is not set
+-# CONFIG_TREE_RCU_TRACE is not set
+-# CONFIG_PREEMPT_RCU_TRACE is not set
+ CONFIG_IKCONFIG=y
+ CONFIG_IKCONFIG_PROC=y
+ CONFIG_LOG_BUF_SHIFT=16
+-# CONFIG_GROUP_SCHED is not set
+-# CONFIG_CGROUPS is not set
+ CONFIG_SYSFS_DEPRECATED=y
+-CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
+-CONFIG_NAMESPACES=y
+-# CONFIG_UTS_NS is not set
+-# CONFIG_IPC_NS is not set
+-# CONFIG_USER_NS is not set
+-# CONFIG_PID_NS is not set
+-# CONFIG_NET_NS is not set
+ CONFIG_BLK_DEV_INITRD=y
+ CONFIG_INITRAMFS_SOURCE=""
+ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+ CONFIG_SYSCTL=y
+-CONFIG_ANON_INODES=y
+ # CONFIG_EMBEDDED is not set
+ CONFIG_SYSCTL_SYSCALL=y
+ CONFIG_KALLSYMS=y
+@@ -73,38 +55,29 @@
+ CONFIG_ELF_CORE=y
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
++CONFIG_ANON_INODES=y
+ CONFIG_EPOLL=y
+ CONFIG_SIGNALFD=y
+-CONFIG_TIMERFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_SHMEM=y
+-CONFIG_AIO=y
+ CONFIG_VM_EVENT_COUNTERS=y
+-CONFIG_COMPAT_BRK=y
+ CONFIG_SLAB=y
+ # CONFIG_SLUB is not set
+ # CONFIG_SLOB is not set
+-CONFIG_PROFILING=y
+-CONFIG_TRACEPOINTS=y
+-# CONFIG_MARKERS is not set
+-CONFIG_OPROFILE=m
+-CONFIG_HAVE_OPROFILE=y
+-# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
+-CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+ CONFIG_MODULES=y
+-# CONFIG_MODULE_FORCE_LOAD is not set
+ CONFIG_MODULE_UNLOAD=y
+ CONFIG_MODULE_FORCE_UNLOAD=y
+ # CONFIG_MODVERSIONS is not set
+ # CONFIG_MODULE_SRCVERSION_ALL is not set
+-CONFIG_INIT_ALL_POSSIBLE=y
++CONFIG_KMOD=y
+ CONFIG_BLOCK=y
+ # CONFIG_LBD is not set
+ # CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
+ # CONFIG_BLK_DEV_BSG is not set
+-# CONFIG_BLK_DEV_INTEGRITY is not set
+
+ #
+ # IO Schedulers
+@@ -118,7 +91,6 @@
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
+-# CONFIG_FREEZER is not set
+
+ #
+ # Processor type and features
+@@ -142,19 +114,17 @@
+ # CONFIG_HZ_300 is not set
+ # CONFIG_HZ_1000 is not set
+ CONFIG_HZ=250
+-# CONFIG_SCHED_HRTICK is not set
+ CONFIG_SELECT_MEMORY_MODEL=y
+ CONFIG_FLATMEM_MANUAL=y
+ # CONFIG_DISCONTIGMEM_MANUAL is not set
+ # CONFIG_SPARSEMEM_MANUAL is not set
+ CONFIG_FLATMEM=y
+ CONFIG_FLAT_NODE_MEM_MAP=y
+-CONFIG_PAGEFLAGS_EXTENDED=y
++# CONFIG_SPARSEMEM_STATIC is not set
+ CONFIG_SPLIT_PTLOCK_CPUS=4096
+-# CONFIG_PHYS_ADDR_T_64BIT is not set
++# CONFIG_RESOURCES_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=0
+ CONFIG_VIRT_TO_BUS=y
+-CONFIG_UNEVICTABLE_LRU=y
+ # CONFIG_HPUX is not set
+
+ #
+@@ -168,6 +138,10 @@
+ # CONFIG_EISA is not set
+ # CONFIG_PCI is not set
+ # CONFIG_ARCH_SUPPORTS_MSI is not set
++
++#
++# PCCARD (PCMCIA/CardBus) support
++#
+ # CONFIG_PCCARD is not set
+
+ #
+@@ -182,15 +156,16 @@
+ # Executable file formats
+ #
+ CONFIG_BINFMT_ELF=y
+-# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+-# CONFIG_HAVE_AOUT is not set
+ CONFIG_BINFMT_MISC=m
++
++#
++# Networking
++#
+ CONFIG_NET=y
+
+ #
+ # Networking options
+ #
+-CONFIG_COMPAT_NET_DEV_OPS=y
+ CONFIG_PACKET=y
+ CONFIG_PACKET_MMAP=y
+ CONFIG_UNIX=y
+@@ -198,7 +173,6 @@
+ CONFIG_XFRM_USER=m
+ # CONFIG_XFRM_SUB_POLICY is not set
+ # CONFIG_XFRM_MIGRATE is not set
+-# CONFIG_XFRM_STATISTICS is not set
+ CONFIG_NET_KEY=m
+ # CONFIG_NET_KEY_MIGRATE is not set
+ CONFIG_INET=y
+@@ -229,25 +203,25 @@
+ CONFIG_TCP_CONG_CUBIC=y
+ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_TCP_MD5SIG is not set
++# CONFIG_IP_VS is not set
+ # CONFIG_IPV6 is not set
++# CONFIG_INET6_XFRM_TUNNEL is not set
++# CONFIG_INET6_TUNNEL is not set
+ # CONFIG_NETWORK_SECMARK is not set
+ CONFIG_NETFILTER=y
+ # CONFIG_NETFILTER_DEBUG is not set
+-CONFIG_NETFILTER_ADVANCED=y
+
+ #
+ # Core Netfilter Configuration
+ #
+-# CONFIG_NETFILTER_NETLINK_QUEUE is not set
+-# CONFIG_NETFILTER_NETLINK_LOG is not set
++# CONFIG_NETFILTER_NETLINK is not set
++# CONFIG_NF_CONNTRACK_ENABLED is not set
+ # CONFIG_NF_CONNTRACK is not set
+ # CONFIG_NETFILTER_XTABLES is not set
+-# CONFIG_IP_VS is not set
+
+ #
+ # IP: Netfilter Configuration
+ #
+-# CONFIG_NF_DEFRAG_IPV4 is not set
+ CONFIG_IP_NF_QUEUE=m
+ # CONFIG_IP_NF_IPTABLES is not set
+ # CONFIG_IP_NF_ARPTABLES is not set
+@@ -256,7 +230,6 @@
+ # CONFIG_TIPC is not set
+ # CONFIG_ATM is not set
+ # CONFIG_BRIDGE is not set
+-# CONFIG_NET_DSA is not set
+ # CONFIG_VLAN_8021Q is not set
+ # CONFIG_DECNET is not set
+ CONFIG_LLC=m
+@@ -267,26 +240,28 @@
+ # CONFIG_LAPB is not set
+ # CONFIG_ECONET is not set
+ # CONFIG_WAN_ROUTER is not set
++
++#
++# QoS and/or fair queueing
++#
+ # CONFIG_NET_SCHED is not set
+-# CONFIG_DCB is not set
+
+ #
+ # Network testing
+ #
+ CONFIG_NET_PKTGEN=m
+ # CONFIG_HAMRADIO is not set
+-# CONFIG_CAN is not set
+ # CONFIG_IRDA is not set
+ # CONFIG_BT is not set
+ # CONFIG_AF_RXRPC is not set
+-# CONFIG_PHONET is not set
+-CONFIG_WIRELESS=y
++
++#
++# Wireless
++#
+ # CONFIG_CFG80211 is not set
+-CONFIG_WIRELESS_OLD_REGULATORY=y
+ # CONFIG_WIRELESS_EXT is not set
+-# CONFIG_LIB80211 is not set
+ # CONFIG_MAC80211 is not set
+-# CONFIG_WIMAX is not set
++# CONFIG_IEEE80211 is not set
+ # CONFIG_RFKILL is not set
+ # CONFIG_NET_9P is not set
+
+@@ -301,8 +276,6 @@
+ # CONFIG_STANDALONE is not set
+ # CONFIG_PREVENT_FIRMWARE_BUILD is not set
+ CONFIG_FW_LOADER=y
+-CONFIG_FIRMWARE_IN_KERNEL=y
+-CONFIG_EXTRA_FIRMWARE=""
+ # CONFIG_DEBUG_DRIVER is not set
+ # CONFIG_DEBUG_DEVRES is not set
+ # CONFIG_SYS_HYPERVISOR is not set
+@@ -325,19 +298,11 @@
+ CONFIG_BLK_DEV_RAM=y
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=6144
+-# CONFIG_BLK_DEV_XIP is not set
++CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+ # CONFIG_CDROM_PKTCDVD is not set
+ CONFIG_ATA_OVER_ETH=m
+-# CONFIG_BLK_DEV_HD is not set
+ CONFIG_MISC_DEVICES=y
+-# CONFIG_ENCLOSURE_SERVICES is not set
+-# CONFIG_C2PORT is not set
+-
+-#
+-# EEPROM support
+-#
+ # CONFIG_EEPROM_93CX6 is not set
+-CONFIG_HAVE_IDE=y
+ # CONFIG_IDE is not set
+
+ #
+@@ -377,17 +342,14 @@
+ # CONFIG_SCSI_FC_ATTRS is not set
+ CONFIG_SCSI_ISCSI_ATTRS=m
+ # CONFIG_SCSI_SAS_LIBSAS is not set
+-# CONFIG_SCSI_SRP_ATTRS is not set
+ CONFIG_SCSI_LOWLEVEL=y
+ # CONFIG_ISCSI_TCP is not set
+-# CONFIG_LIBFC is not set
+ # CONFIG_SCSI_PPA is not set
+ # CONFIG_SCSI_IMM is not set
+ CONFIG_SCSI_LASI700=y
+ CONFIG_53C700_LE_ON_BE=y
+ # CONFIG_SCSI_ZALON is not set
+ CONFIG_SCSI_DEBUG=m
+-# CONFIG_SCSI_DH is not set
+ # CONFIG_ATA is not set
+ CONFIG_MD=y
+ CONFIG_BLK_DEV_MD=m
+@@ -400,6 +362,7 @@
+ # CONFIG_MD_FAULTY is not set
+ # CONFIG_BLK_DEV_DM is not set
+ CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
+ CONFIG_DUMMY=m
+ CONFIG_BONDING=m
+ # CONFIG_MACVLAN is not set
+@@ -414,9 +377,6 @@
+ # CONFIG_IBM_NEW_EMAC_RGMII is not set
+ # CONFIG_IBM_NEW_EMAC_TAH is not set
+ # CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+-# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
+-# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
+-# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
+ # CONFIG_B44 is not set
+ # CONFIG_NET_POCKET is not set
+ CONFIG_NETDEV_1000=y
+@@ -427,11 +387,6 @@
+ #
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
+-# CONFIG_IWLWIFI_LEDS is not set
+-
+-#
+-# Enable WiMAX (Networking options) to see the WiMAX drivers
+-#
+ # CONFIG_WAN is not set
+ # CONFIG_PLIP is not set
+ CONFIG_PPP=m
+@@ -446,6 +401,7 @@
+ # CONFIG_PPPOL2TP is not set
+ # CONFIG_SLIP is not set
+ CONFIG_SLHC=m
++# CONFIG_SHAPER is not set
+ # CONFIG_NETCONSOLE is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+@@ -467,6 +423,7 @@
+ CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+ # CONFIG_INPUT_JOYDEV is not set
++# CONFIG_INPUT_TSDEV is not set
+ # CONFIG_INPUT_EVDEV is not set
+ # CONFIG_INPUT_EVBUG is not set
+
+@@ -489,8 +446,8 @@
+ CONFIG_MOUSE_PS2_ALPS=y
+ CONFIG_MOUSE_PS2_LOGIPS2PP=y
+ CONFIG_MOUSE_PS2_SYNAPTICS=y
++CONFIG_MOUSE_PS2_LIFEBOOK=y
+ CONFIG_MOUSE_PS2_TRACKPOINT=y
+-# CONFIG_MOUSE_PS2_ELANTECH is not set
+ # CONFIG_MOUSE_PS2_TOUCHKIT is not set
+ CONFIG_MOUSE_SERIAL=m
+ # CONFIG_MOUSE_VSXXXAA is not set
+@@ -517,11 +474,9 @@
+ # Character devices
+ #
+ CONFIG_VT=y
+-CONFIG_CONSOLE_TRANSLATIONS=y
+ CONFIG_VT_CONSOLE=y
+ CONFIG_HW_CONSOLE=y
+ # CONFIG_VT_HW_CONSOLE_BINDING is not set
+-CONFIG_DEVKMEM=y
+ # CONFIG_SERIAL_NONSTANDARD is not set
+
+ #
+@@ -546,76 +501,72 @@
+ CONFIG_SERIAL_CORE=y
+ CONFIG_SERIAL_CORE_CONSOLE=y
+ CONFIG_UNIX98_PTYS=y
+-# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+ CONFIG_LEGACY_PTYS=y
+ CONFIG_LEGACY_PTY_COUNT=64
+ CONFIG_PRINTER=m
+ # CONFIG_LP_CONSOLE is not set
+ CONFIG_PPDEV=m
++# CONFIG_TIPAR is not set
+ # CONFIG_IPMI_HANDLER is not set
++# CONFIG_WATCHDOG is not set
+ # CONFIG_HW_RANDOM is not set
++CONFIG_GEN_RTC=y
++CONFIG_GEN_RTC_X=y
+ # CONFIG_R3964 is not set
+ CONFIG_RAW_DRIVER=y
+ CONFIG_MAX_RAW_DEVS=256
+ # CONFIG_TCG_TPM is not set
+ # CONFIG_I2C is not set
++
++#
++# SPI support
++#
+ # CONFIG_SPI is not set
++# CONFIG_SPI_MASTER is not set
+ # CONFIG_W1 is not set
+ # CONFIG_POWER_SUPPLY is not set
+ # CONFIG_HWMON is not set
+-# CONFIG_THERMAL is not set
+-# CONFIG_THERMAL_HWMON is not set
+-# CONFIG_WATCHDOG is not set
+-CONFIG_SSB_POSSIBLE=y
+
+ #
+ # Sonics Silicon Backplane
+ #
++CONFIG_SSB_POSSIBLE=y
+ # CONFIG_SSB is not set
+
+ #
+ # Multifunction device drivers
+ #
+-# CONFIG_MFD_CORE is not set
+ # CONFIG_MFD_SM501 is not set
+-# CONFIG_HTC_PASIC3 is not set
+-# CONFIG_MFD_TMIO is not set
+-# CONFIG_REGULATOR is not set
+
+ #
+ # Multimedia devices
+ #
+-
+-#
+-# Multimedia core support
+-#
+ # CONFIG_VIDEO_DEV is not set
+ # CONFIG_DVB_CORE is not set
+-# CONFIG_VIDEO_MEDIA is not set
++# CONFIG_DAB is not set
+
+ #
+-# Multimedia drivers
++# Graphics support
+ #
+-# CONFIG_DAB is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+ #
+-# Graphics support
++# Display device support
+ #
++# CONFIG_DISPLAY_SUPPORT is not set
+ # CONFIG_VGASTATE is not set
+ CONFIG_VIDEO_OUTPUT_CONTROL=m
+ CONFIG_FB=y
+ # CONFIG_FIRMWARE_EDID is not set
+ # CONFIG_FB_DDC is not set
+-# CONFIG_FB_BOOT_VESA_SUPPORT is not set
+ CONFIG_FB_CFB_FILLRECT=y
+ CONFIG_FB_CFB_COPYAREA=y
+ CONFIG_FB_CFB_IMAGEBLIT=y
+-# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
+ # CONFIG_FB_SYS_FILLRECT is not set
+ # CONFIG_FB_SYS_COPYAREA is not set
+ # CONFIG_FB_SYS_IMAGEBLIT is not set
+-# CONFIG_FB_FOREIGN_ENDIAN is not set
+ # CONFIG_FB_SYS_FOPS is not set
++CONFIG_FB_DEFERRED_IO=y
+ # CONFIG_FB_SVGALIB is not set
+ # CONFIG_FB_MACMODES is not set
+ # CONFIG_FB_BACKLIGHT is not set
+@@ -628,14 +579,6 @@
+ CONFIG_FB_STI=y
+ # CONFIG_FB_S1D13XXX is not set
+ # CONFIG_FB_VIRTUAL is not set
+-# CONFIG_FB_METRONOME is not set
+-# CONFIG_FB_MB862XX is not set
+-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+-
+-#
+-# Display device support
+-#
+-# CONFIG_DISPLAY_SUPPORT is not set
+
+ #
+ # Console display driver support
+@@ -663,8 +606,15 @@
+ # CONFIG_LOGO_LINUX_VGA16 is not set
+ # CONFIG_LOGO_LINUX_CLUT224 is not set
+ CONFIG_LOGO_PARISC_CLUT224=y
++
++#
++# Sound
++#
+ CONFIG_SOUND=y
+-CONFIG_SOUND_OSS_CORE=y
++
++#
++# Advanced Linux Sound Architecture
++#
+ CONFIG_SND=y
+ CONFIG_SND_TIMER=y
+ CONFIG_SND_PCM=y
+@@ -680,7 +630,10 @@
+ CONFIG_SND_VERBOSE_PROCFS=y
+ # CONFIG_SND_VERBOSE_PRINTK is not set
+ # CONFIG_SND_DEBUG is not set
+-CONFIG_SND_DRIVERS=y
++
++#
++# Generic devices
++#
+ # CONFIG_SND_DUMMY is not set
+ # CONFIG_SND_VIRMIDI is not set
+ # CONFIG_SND_MTPAV is not set
+@@ -688,82 +641,63 @@
+ # CONFIG_SND_SERIAL_U16550 is not set
+ # CONFIG_SND_MPU401 is not set
+ # CONFIG_SND_PORTMAN2X4 is not set
+-CONFIG_SND_GSC=y
++
++#
++# GSC devices
++#
+ CONFIG_SND_HARMONY=y
++
++#
++# System on Chip audio support
++#
+ # CONFIG_SND_SOC is not set
++
++#
++# SoC Audio support for SuperH
++#
++
++#
++# Open Sound System
++#
+ # CONFIG_SOUND_PRIME is not set
+ CONFIG_HID_SUPPORT=y
+ CONFIG_HID=y
+ CONFIG_HID_DEBUG=y
+-# CONFIG_HIDRAW is not set
+-# CONFIG_HID_PID is not set
+-
+-#
+-# Special HID drivers
+-#
+-CONFIG_HID_COMPAT=y
+ CONFIG_USB_SUPPORT=y
+ # CONFIG_USB_ARCH_HAS_HCD is not set
+ # CONFIG_USB_ARCH_HAS_OHCI is not set
+ # CONFIG_USB_ARCH_HAS_EHCI is not set
+
+ #
+-# Enable Host or Gadget support to see Inventra options
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+
+ #
+-# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
++# USB Gadget Support
+ #
+ # CONFIG_USB_GADGET is not set
+-
+-#
+-# OTG and related infrastructure
+-#
+ # CONFIG_MMC is not set
+-# CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS is not set
+-# CONFIG_ACCESSIBILITY is not set
+-CONFIG_RTC_LIB=y
+-CONFIG_RTC_CLASS=y
+-CONFIG_RTC_HCTOSYS=y
+-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+-# CONFIG_RTC_DEBUG is not set
++# CONFIG_RTC_CLASS is not set
+
+ #
+-# RTC interfaces
++# DMA Engine support
+ #
+-CONFIG_RTC_INTF_SYSFS=y
+-CONFIG_RTC_INTF_PROC=y
+-CONFIG_RTC_INTF_DEV=y
+-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+-# CONFIG_RTC_DRV_TEST is not set
++# CONFIG_DMA_ENGINE is not set
+
+ #
+-# SPI RTC drivers
++# DMA Clients
+ #
+
+ #
+-# Platform RTC drivers
++# DMA Devices
+ #
+-# CONFIG_RTC_DRV_DS1286 is not set
+-# CONFIG_RTC_DRV_DS1511 is not set
+-# CONFIG_RTC_DRV_DS1553 is not set
+-# CONFIG_RTC_DRV_DS1742 is not set
+-# CONFIG_RTC_DRV_STK17TA8 is not set
+-# CONFIG_RTC_DRV_M48T86 is not set
+-# CONFIG_RTC_DRV_M48T35 is not set
+-# CONFIG_RTC_DRV_M48T59 is not set
+-# CONFIG_RTC_DRV_BQ4802 is not set
+-# CONFIG_RTC_DRV_V3020 is not set
++# CONFIG_AUXDISPLAY is not set
+
+ #
+-# on-CPU RTC drivers
++# Userspace I/O
+ #
+-CONFIG_RTC_DRV_PARISC=y
+-# CONFIG_DMADEVICES is not set
+-# CONFIG_AUXDISPLAY is not set
+ # CONFIG_UIO is not set
+-# CONFIG_STAGING is not set
+
+ #
+ # File systems
+@@ -773,7 +707,7 @@
+ # CONFIG_EXT2_FS_XIP is not set
+ CONFIG_EXT3_FS=y
+ # CONFIG_EXT3_FS_XATTR is not set
+-# CONFIG_EXT4_FS is not set
++# CONFIG_EXT4DEV_FS is not set
+ CONFIG_JBD=y
+ # CONFIG_JBD_DEBUG is not set
+ # CONFIG_REISERFS_FS is not set
+@@ -783,18 +717,19 @@
+ # CONFIG_JFS_DEBUG is not set
+ # CONFIG_JFS_STATISTICS is not set
+ CONFIG_FS_POSIX_ACL=y
+-CONFIG_FILE_LOCKING=y
+ CONFIG_XFS_FS=m
+ # CONFIG_XFS_QUOTA is not set
++# CONFIG_XFS_SECURITY is not set
+ # CONFIG_XFS_POSIX_ACL is not set
+ # CONFIG_XFS_RT is not set
+-# CONFIG_XFS_DEBUG is not set
++# CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_BTRFS_FS is not set
+-CONFIG_DNOTIFY=y
++# CONFIG_MINIX_FS is not set
++# CONFIG_ROMFS_FS is not set
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+ # CONFIG_QUOTA is not set
++CONFIG_DNOTIFY=y
+ # CONFIG_AUTOFS_FS is not set
+ CONFIG_AUTOFS4_FS=y
+ # CONFIG_FUSE_FS is not set
+@@ -824,13 +759,16 @@
+ CONFIG_PROC_FS=y
+ CONFIG_PROC_KCORE=y
+ CONFIG_PROC_SYSCTL=y
+-CONFIG_PROC_PAGE_MONITOR=y
+ CONFIG_SYSFS=y
+ CONFIG_TMPFS=y
+ # CONFIG_TMPFS_POSIX_ACL is not set
+ # CONFIG_HUGETLB_PAGE is not set
++CONFIG_RAMFS=y
+ # CONFIG_CONFIGFS_FS is not set
+-CONFIG_MISC_FILESYSTEMS=y
++
++#
++# Miscellaneous filesystems
++#
+ # CONFIG_ADFS_FS is not set
+ # CONFIG_AFFS_FS is not set
+ # CONFIG_ECRYPT_FS is not set
+@@ -840,34 +778,35 @@
+ # CONFIG_BFS_FS is not set
+ # CONFIG_EFS_FS is not set
+ # CONFIG_CRAMFS is not set
+-# CONFIG_SQUASHFS is not set
+ # CONFIG_VXFS_FS is not set
+-# CONFIG_MINIX_FS is not set
+-# CONFIG_OMFS_FS is not set
+ # CONFIG_HPFS_FS is not set
+ # CONFIG_QNX4FS_FS is not set
+-# CONFIG_ROMFS_FS is not set
+ # CONFIG_SYSV_FS is not set
+ CONFIG_UFS_FS=m
+ # CONFIG_UFS_FS_WRITE is not set
+ # CONFIG_UFS_DEBUG is not set
+-CONFIG_NETWORK_FILESYSTEMS=y
++
++#
++# Network File Systems
++#
+ CONFIG_NFS_FS=y
+ CONFIG_NFS_V3=y
+ # CONFIG_NFS_V3_ACL is not set
+ CONFIG_NFS_V4=y
+-CONFIG_ROOT_NFS=y
++CONFIG_NFS_DIRECTIO=y
+ CONFIG_NFSD=m
+ CONFIG_NFSD_V3=y
+ # CONFIG_NFSD_V3_ACL is not set
+ CONFIG_NFSD_V4=y
++CONFIG_NFSD_TCP=y
++CONFIG_ROOT_NFS=y
+ CONFIG_LOCKD=y
+ CONFIG_LOCKD_V4=y
+ CONFIG_EXPORTFS=m
+ CONFIG_NFS_COMMON=y
+ CONFIG_SUNRPC=y
+ CONFIG_SUNRPC_GSS=y
+-# CONFIG_SUNRPC_REGISTER_V4 is not set
++# CONFIG_SUNRPC_BIND34 is not set
+ CONFIG_RPCSEC_GSS_KRB5=y
+ CONFIG_RPCSEC_GSS_SPKM3=m
+ CONFIG_SMB_FS=m
+@@ -876,7 +815,6 @@
+ CONFIG_CIFS=m
+ # CONFIG_CIFS_STATS is not set
+ # CONFIG_CIFS_WEAK_PW_HASH is not set
+-# CONFIG_CIFS_UPCALL is not set
+ # CONFIG_CIFS_XATTR is not set
+ # CONFIG_CIFS_DEBUG2 is not set
+ # CONFIG_CIFS_EXPERIMENTAL is not set
+@@ -889,6 +827,10 @@
+ #
+ # CONFIG_PARTITION_ADVANCED is not set
+ CONFIG_MSDOS_PARTITION=y
++
++#
++# Native Language Support
++#
+ CONFIG_NLS=y
+ CONFIG_NLS_DEFAULT="iso8859-1"
+ CONFIG_NLS_CODEPAGE_437=m
+@@ -929,28 +871,33 @@
+ CONFIG_NLS_KOI8_R=m
+ CONFIG_NLS_KOI8_U=m
+ CONFIG_NLS_UTF8=m
++
++#
++# Distributed Lock Manager
++#
+ # CONFIG_DLM is not set
+
+ #
++# Profiling support
++#
++CONFIG_PROFILING=y
++CONFIG_OPROFILE=m
++
++#
+ # Kernel hacking
+ #
+ # CONFIG_PRINTK_TIME is not set
+-CONFIG_ENABLE_WARN_DEPRECATED=y
+ CONFIG_ENABLE_MUST_CHECK=y
+-CONFIG_FRAME_WARN=1024
+ CONFIG_MAGIC_SYSRQ=y
+ # CONFIG_UNUSED_SYMBOLS is not set
+-CONFIG_DEBUG_FS=y
++# CONFIG_DEBUG_FS is not set
+ # CONFIG_HEADERS_CHECK is not set
+ CONFIG_DEBUG_KERNEL=y
+ # CONFIG_DEBUG_SHIRQ is not set
+ CONFIG_DETECT_SOFTLOCKUP=y
+-# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+-CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
+ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS is not set
+-# CONFIG_DEBUG_OBJECTS is not set
+ # CONFIG_DEBUG_SLAB is not set
+ # CONFIG_DEBUG_RT_MUTEXES is not set
+ # CONFIG_RT_MUTEX_TESTER is not set
+@@ -962,32 +909,10 @@
+ CONFIG_DEBUG_BUGVERBOSE=y
+ # CONFIG_DEBUG_INFO is not set
+ # CONFIG_DEBUG_VM is not set
+-# CONFIG_DEBUG_WRITECOUNT is not set
+-CONFIG_DEBUG_MEMORY_INIT=y
+ # CONFIG_DEBUG_LIST is not set
+-# CONFIG_DEBUG_SG is not set
+-# CONFIG_DEBUG_NOTIFIERS is not set
+-# CONFIG_BOOT_PRINTK_DELAY is not set
++CONFIG_FORCED_INLINING=y
+ # CONFIG_RCU_TORTURE_TEST is not set
+-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+-# CONFIG_BACKTRACE_SELF_TEST is not set
+-# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+ # CONFIG_FAULT_INJECTION is not set
+-# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+-CONFIG_NOP_TRACER=y
+-CONFIG_RING_BUFFER=y
+-CONFIG_TRACING=y
+-
+-#
+-# Tracers
+-#
+-# CONFIG_SCHED_TRACER is not set
+-# CONFIG_CONTEXT_SWITCH_TRACER is not set
+-# CONFIG_BOOT_TRACER is not set
+-# CONFIG_TRACE_BRANCH_PROFILING is not set
+-# CONFIG_FTRACE_STARTUP_TEST is not set
+-# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
+-# CONFIG_SAMPLES is not set
+ CONFIG_DEBUG_RODATA=y
+
+ #
+@@ -996,113 +921,57 @@
+ CONFIG_KEYS=y
+ CONFIG_KEYS_DEBUG_PROC_KEYS=y
+ # CONFIG_SECURITY is not set
+-# CONFIG_SECURITYFS is not set
+-# CONFIG_SECURITY_FILE_CAPABILITIES is not set
+ CONFIG_CRYPTO=y
+-
+-#
+-# Crypto core or helper
+-#
+-# CONFIG_CRYPTO_FIPS is not set
+ CONFIG_CRYPTO_ALGAPI=y
+-CONFIG_CRYPTO_ALGAPI2=y
+-CONFIG_CRYPTO_AEAD=m
+-CONFIG_CRYPTO_AEAD2=y
+ CONFIG_CRYPTO_BLKCIPHER=y
+-CONFIG_CRYPTO_BLKCIPHER2=y
+ CONFIG_CRYPTO_HASH=y
+-CONFIG_CRYPTO_HASH2=y
+-CONFIG_CRYPTO_RNG2=y
+ CONFIG_CRYPTO_MANAGER=y
+-CONFIG_CRYPTO_MANAGER2=y
+-# CONFIG_CRYPTO_GF128MUL is not set
+-CONFIG_CRYPTO_NULL=m
+-# CONFIG_CRYPTO_CRYPTD is not set
+-CONFIG_CRYPTO_AUTHENC=m
+-CONFIG_CRYPTO_TEST=m
+-
+-#
+-# Authenticated Encryption with Associated Data
+-#
+-# CONFIG_CRYPTO_CCM is not set
+-# CONFIG_CRYPTO_GCM is not set
+-# CONFIG_CRYPTO_SEQIV is not set
+-
+-#
+-# Block modes
+-#
+-CONFIG_CRYPTO_CBC=y
+-# CONFIG_CRYPTO_CTR is not set
+-# CONFIG_CRYPTO_CTS is not set
+-CONFIG_CRYPTO_ECB=m
+-# CONFIG_CRYPTO_LRW is not set
+-# CONFIG_CRYPTO_PCBC is not set
+-# CONFIG_CRYPTO_XTS is not set
+-
+-#
+-# Hash modes
+-#
+ CONFIG_CRYPTO_HMAC=y
+ # CONFIG_CRYPTO_XCBC is not set
+-
+-#
+-# Digest
+-#
+-CONFIG_CRYPTO_CRC32C=m
++CONFIG_CRYPTO_NULL=m
+ CONFIG_CRYPTO_MD4=m
+ CONFIG_CRYPTO_MD5=y
+-CONFIG_CRYPTO_MICHAEL_MIC=m
+-# CONFIG_CRYPTO_RMD128 is not set
+-# CONFIG_CRYPTO_RMD160 is not set
+-# CONFIG_CRYPTO_RMD256 is not set
+-# CONFIG_CRYPTO_RMD320 is not set
+ CONFIG_CRYPTO_SHA1=m
+ CONFIG_CRYPTO_SHA256=m
+ CONFIG_CRYPTO_SHA512=m
+-CONFIG_CRYPTO_TGR192=m
+ CONFIG_CRYPTO_WP512=m
+-
+-#
+-# Ciphers
+-#
+-CONFIG_CRYPTO_AES=m
+-CONFIG_CRYPTO_ANUBIS=m
+-CONFIG_CRYPTO_ARC4=m
++CONFIG_CRYPTO_TGR192=m
++# CONFIG_CRYPTO_GF128MUL is not set
++CONFIG_CRYPTO_ECB=m
++CONFIG_CRYPTO_CBC=y
++# CONFIG_CRYPTO_PCBC is not set
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_XTS is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_FCRYPT is not set
+ CONFIG_CRYPTO_BLOWFISH=m
+-# CONFIG_CRYPTO_CAMELLIA is not set
++CONFIG_CRYPTO_TWOFISH=m
++CONFIG_CRYPTO_TWOFISH_COMMON=m
++CONFIG_CRYPTO_SERPENT=m
++CONFIG_CRYPTO_AES=m
+ CONFIG_CRYPTO_CAST5=m
+ CONFIG_CRYPTO_CAST6=m
+-CONFIG_CRYPTO_DES=y
+-# CONFIG_CRYPTO_FCRYPT is not set
++CONFIG_CRYPTO_TEA=m
++CONFIG_CRYPTO_ARC4=m
+ CONFIG_CRYPTO_KHAZAD=m
+-# CONFIG_CRYPTO_SALSA20 is not set
++CONFIG_CRYPTO_ANUBIS=m
+ # CONFIG_CRYPTO_SEED is not set
+-CONFIG_CRYPTO_SERPENT=m
+-CONFIG_CRYPTO_TEA=m
+-CONFIG_CRYPTO_TWOFISH=m
+-CONFIG_CRYPTO_TWOFISH_COMMON=m
+-
+-#
+-# Compression
+-#
+ CONFIG_CRYPTO_DEFLATE=m
+-# CONFIG_CRYPTO_LZO is not set
+-
+-#
+-# Random Number Generation
+-#
+-# CONFIG_CRYPTO_ANSI_CPRNG is not set
++CONFIG_CRYPTO_MICHAEL_MIC=m
++CONFIG_CRYPTO_CRC32C=m
++# CONFIG_CRYPTO_CAMELLIA is not set
++CONFIG_CRYPTO_TEST=m
++# CONFIG_CRYPTO_AUTHENC is not set
+ # CONFIG_CRYPTO_HW is not set
+
+ #
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
+-CONFIG_GENERIC_FIND_LAST_BIT=y
+ CONFIG_CRC_CCITT=m
+ # CONFIG_CRC16 is not set
+-# CONFIG_CRC_T10DIF is not set
+-CONFIG_CRC_ITU_T=m
++# CONFIG_CRC_ITU_T is not set
+ CONFIG_CRC32=y
+ # CONFIG_CRC7 is not set
+ CONFIG_LIBCRC32C=m
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/parisc/configs/a500_defconfig linux-2.6.29-rc3.owrt/arch/parisc/configs/a500_defconfig
+--- linux-2.6.29.owrt/arch/parisc/configs/a500_defconfig 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/parisc/configs/a500_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-rc8
+-# Fri Mar 13 01:32:56 2009
++# Linux kernel version: 2.6.23
++# Fri Oct 12 21:12:44 2007
+ #
+ CONFIG_PARISC=y
+ CONFIG_MMU=y
+@@ -34,30 +34,18 @@
+ CONFIG_POSIX_MQUEUE=y
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
++# CONFIG_USER_NS is not set
+ # CONFIG_AUDIT is not set
+-
+-#
+-# RCU Subsystem
+-#
+-CONFIG_CLASSIC_RCU=y
+-# CONFIG_TREE_RCU is not set
+-# CONFIG_PREEMPT_RCU is not set
+-# CONFIG_TREE_RCU_TRACE is not set
+-# CONFIG_PREEMPT_RCU_TRACE is not set
+ CONFIG_IKCONFIG=y
+ CONFIG_IKCONFIG_PROC=y
+ CONFIG_LOG_BUF_SHIFT=16
+-# CONFIG_GROUP_SCHED is not set
+-# CONFIG_CGROUPS is not set
++# CONFIG_CPUSETS is not set
+ CONFIG_SYSFS_DEPRECATED=y
+-CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
+-# CONFIG_NAMESPACES is not set
+ CONFIG_BLK_DEV_INITRD=y
+ CONFIG_INITRAMFS_SOURCE=""
+ # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+ CONFIG_SYSCTL=y
+-CONFIG_ANON_INODES=y
+ CONFIG_EMBEDDED=y
+ CONFIG_SYSCTL_SYSCALL=y
+ CONFIG_KALLSYMS=y
+@@ -69,40 +57,28 @@
+ CONFIG_ELF_CORE=y
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
++CONFIG_ANON_INODES=y
+ CONFIG_EPOLL=y
+ CONFIG_SIGNALFD=y
+-CONFIG_TIMERFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_SHMEM=y
+-CONFIG_AIO=y
+ CONFIG_VM_EVENT_COUNTERS=y
+-CONFIG_PCI_QUIRKS=y
+-CONFIG_COMPAT_BRK=y
+ CONFIG_SLAB=y
+ # CONFIG_SLUB is not set
+ # CONFIG_SLOB is not set
+-CONFIG_PROFILING=y
+-CONFIG_TRACEPOINTS=y
+-# CONFIG_MARKERS is not set
+-CONFIG_OPROFILE=m
+-CONFIG_HAVE_OPROFILE=y
+-CONFIG_USE_GENERIC_SMP_HELPERS=y
+-# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
+-CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+ CONFIG_MODULES=y
+-# CONFIG_MODULE_FORCE_LOAD is not set
+ CONFIG_MODULE_UNLOAD=y
+ CONFIG_MODULE_FORCE_UNLOAD=y
+ # CONFIG_MODVERSIONS is not set
+ # CONFIG_MODULE_SRCVERSION_ALL is not set
+-CONFIG_INIT_ALL_POSSIBLE=y
++CONFIG_KMOD=y
+ CONFIG_STOP_MACHINE=y
+ CONFIG_BLOCK=y
+ # CONFIG_BLK_DEV_IO_TRACE is not set
+ # CONFIG_BLK_DEV_BSG is not set
+-# CONFIG_BLK_DEV_INTEGRITY is not set
+ CONFIG_BLOCK_COMPAT=y
+
+ #
+@@ -117,7 +93,6 @@
+ CONFIG_DEFAULT_CFQ=y
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="cfq"
+-# CONFIG_FREEZER is not set
+
+ #
+ # Processor type and features
+@@ -143,12 +118,12 @@
+ CONFIG_PREEMPT_NONE=y
+ # CONFIG_PREEMPT_VOLUNTARY is not set
+ # CONFIG_PREEMPT is not set
++CONFIG_PREEMPT_BKL=y
+ # CONFIG_HZ_100 is not set
+ CONFIG_HZ_250=y
+ # CONFIG_HZ_300 is not set
+ # CONFIG_HZ_1000 is not set
+ CONFIG_HZ=250
+-# CONFIG_SCHED_HRTICK is not set
+ CONFIG_SELECT_MEMORY_MODEL=y
+ # CONFIG_FLATMEM_MANUAL is not set
+ CONFIG_DISCONTIGMEM_MANUAL=y
+@@ -156,12 +131,11 @@
+ CONFIG_DISCONTIGMEM=y
+ CONFIG_FLAT_NODE_MEM_MAP=y
+ CONFIG_NEED_MULTIPLE_NODES=y
+-CONFIG_PAGEFLAGS_EXTENDED=y
++# CONFIG_SPARSEMEM_STATIC is not set
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+-CONFIG_PHYS_ADDR_T_64BIT=y
++CONFIG_RESOURCES_64BIT=y
+ CONFIG_ZONE_DMA_FLAG=0
+ CONFIG_VIRT_TO_BUS=y
+-CONFIG_UNEVICTABLE_LRU=y
+ CONFIG_COMPAT=y
+ CONFIG_NR_CPUS=8
+
+@@ -171,13 +145,14 @@
+ # CONFIG_GSC is not set
+ CONFIG_PCI=y
+ # CONFIG_ARCH_SUPPORTS_MSI is not set
+-CONFIG_PCI_LEGACY=y
+ # CONFIG_PCI_DEBUG is not set
+-# CONFIG_PCI_STUB is not set
+ CONFIG_PCI_LBA=y
+ CONFIG_IOSAPIC=y
+ CONFIG_IOMMU_SBA=y
+-CONFIG_IOMMU_HELPER=y
++
++#
++# PCCARD (PCMCIA/CardBus) support
++#
+ CONFIG_PCCARD=m
+ # CONFIG_PCMCIA_DEBUG is not set
+ CONFIG_PCMCIA=m
+@@ -212,15 +187,16 @@
+ # Executable file formats
+ #
+ CONFIG_BINFMT_ELF=y
+-# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+-# CONFIG_HAVE_AOUT is not set
+ # CONFIG_BINFMT_MISC is not set
++
++#
++# Networking
++#
+ CONFIG_NET=y
+
+ #
+ # Networking options
+ #
+-CONFIG_COMPAT_NET_DEV_OPS=y
+ CONFIG_PACKET=y
+ CONFIG_PACKET_MMAP=y
+ CONFIG_UNIX=y
+@@ -228,8 +204,6 @@
+ CONFIG_XFRM_USER=m
+ # CONFIG_XFRM_SUB_POLICY is not set
+ # CONFIG_XFRM_MIGRATE is not set
+-# CONFIG_XFRM_STATISTICS is not set
+-CONFIG_XFRM_IPCOMP=m
+ CONFIG_NET_KEY=m
+ # CONFIG_NET_KEY_MIGRATE is not set
+ CONFIG_INET=y
+@@ -260,6 +234,7 @@
+ CONFIG_TCP_CONG_CUBIC=y
+ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_TCP_MD5SIG is not set
++# CONFIG_IP_VS is not set
+ CONFIG_IPV6=m
+ # CONFIG_IPV6_PRIVACY is not set
+ # CONFIG_IPV6_ROUTER_PREF is not set
+@@ -275,72 +250,66 @@
+ CONFIG_INET6_XFRM_MODE_BEET=m
+ # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+ CONFIG_IPV6_SIT=m
+-CONFIG_IPV6_NDISC_NODETYPE=y
+ CONFIG_IPV6_TUNNEL=m
+ # CONFIG_IPV6_MULTIPLE_TABLES is not set
+-# CONFIG_IPV6_MROUTE is not set
+ # CONFIG_NETWORK_SECMARK is not set
+ CONFIG_NETFILTER=y
+ # CONFIG_NETFILTER_DEBUG is not set
+-CONFIG_NETFILTER_ADVANCED=y
+
+ #
+ # Core Netfilter Configuration
+ #
+-# CONFIG_NETFILTER_NETLINK_QUEUE is not set
+-# CONFIG_NETFILTER_NETLINK_LOG is not set
++# CONFIG_NETFILTER_NETLINK is not set
++# CONFIG_NF_CONNTRACK_ENABLED is not set
+ # CONFIG_NF_CONNTRACK is not set
+ CONFIG_NETFILTER_XTABLES=m
+ # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+ # CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+ # CONFIG_NETFILTER_XT_TARGET_MARK is not set
+-# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+ # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+-# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set
++# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+ # CONFIG_NETFILTER_XT_TARGET_TRACE is not set
+ # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+-# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set
+ # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+ # CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+ # CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+ # CONFIG_NETFILTER_XT_MATCH_ESP is not set
+-# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+-# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set
+ # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set
+ # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set
+ # CONFIG_NETFILTER_XT_MATCH_MAC is not set
+ # CONFIG_NETFILTER_XT_MATCH_MARK is not set
+-# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+-# CONFIG_NETFILTER_XT_MATCH_OWNER is not set
+ # CONFIG_NETFILTER_XT_MATCH_POLICY is not set
++# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+ # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+ # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+-# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
+ # CONFIG_NETFILTER_XT_MATCH_REALM is not set
+-# CONFIG_NETFILTER_XT_MATCH_RECENT is not set
+ # CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+ # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+ # CONFIG_NETFILTER_XT_MATCH_STRING is not set
+ # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+ # CONFIG_NETFILTER_XT_MATCH_TIME is not set
+ # CONFIG_NETFILTER_XT_MATCH_U32 is not set
+-# CONFIG_IP_VS is not set
++# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+ #
+ # IP: Netfilter Configuration
+ #
+-# CONFIG_NF_DEFRAG_IPV4 is not set
+ CONFIG_IP_NF_QUEUE=m
+ CONFIG_IP_NF_IPTABLES=m
+-# CONFIG_IP_NF_MATCH_ADDRTYPE is not set
+-# CONFIG_IP_NF_MATCH_AH is not set
++CONFIG_IP_NF_MATCH_IPRANGE=m
++CONFIG_IP_NF_MATCH_TOS=m
++CONFIG_IP_NF_MATCH_RECENT=m
+ CONFIG_IP_NF_MATCH_ECN=m
++# CONFIG_IP_NF_MATCH_AH is not set
+ CONFIG_IP_NF_MATCH_TTL=m
++CONFIG_IP_NF_MATCH_OWNER=m
++# CONFIG_IP_NF_MATCH_ADDRTYPE is not set
+ CONFIG_IP_NF_FILTER=m
+ CONFIG_IP_NF_TARGET_REJECT=m
+ CONFIG_IP_NF_TARGET_LOG=m
+ CONFIG_IP_NF_TARGET_ULOG=m
+ CONFIG_IP_NF_MANGLE=m
++CONFIG_IP_NF_TARGET_TOS=m
+ CONFIG_IP_NF_TARGET_ECN=m
+ # CONFIG_IP_NF_TARGET_TTL is not set
+ CONFIG_IP_NF_RAW=m
+@@ -349,30 +318,33 @@
+ CONFIG_IP_NF_ARP_MANGLE=m
+
+ #
+-# IPv6: Netfilter Configuration
++# IPv6: Netfilter Configuration (EXPERIMENTAL)
+ #
+ # CONFIG_IP6_NF_QUEUE is not set
+ CONFIG_IP6_NF_IPTABLES=m
+-# CONFIG_IP6_NF_MATCH_AH is not set
+-# CONFIG_IP6_NF_MATCH_EUI64 is not set
+-CONFIG_IP6_NF_MATCH_FRAG=m
++CONFIG_IP6_NF_MATCH_RT=m
+ CONFIG_IP6_NF_MATCH_OPTS=m
++CONFIG_IP6_NF_MATCH_FRAG=m
+ CONFIG_IP6_NF_MATCH_HL=m
++# CONFIG_IP6_NF_MATCH_OWNER is not set
+ CONFIG_IP6_NF_MATCH_IPV6HEADER=m
++# CONFIG_IP6_NF_MATCH_AH is not set
+ # CONFIG_IP6_NF_MATCH_MH is not set
+-CONFIG_IP6_NF_MATCH_RT=m
+-CONFIG_IP6_NF_TARGET_LOG=m
++# CONFIG_IP6_NF_MATCH_EUI64 is not set
+ CONFIG_IP6_NF_FILTER=m
++CONFIG_IP6_NF_TARGET_LOG=m
+ CONFIG_IP6_NF_TARGET_REJECT=m
+ CONFIG_IP6_NF_MANGLE=m
+ # CONFIG_IP6_NF_TARGET_HL is not set
+ CONFIG_IP6_NF_RAW=m
+ CONFIG_IP_DCCP=m
+ CONFIG_INET_DCCP_DIAG=m
++CONFIG_IP_DCCP_ACKVEC=y
+
+ #
+ # DCCP CCIDs Configuration (EXPERIMENTAL)
+ #
++CONFIG_IP_DCCP_CCID2=m
+ # CONFIG_IP_DCCP_CCID2_DEBUG is not set
+ # CONFIG_IP_DCCP_CCID3 is not set
+
+@@ -384,7 +356,6 @@
+ # CONFIG_TIPC is not set
+ # CONFIG_ATM is not set
+ # CONFIG_BRIDGE is not set
+-# CONFIG_NET_DSA is not set
+ # CONFIG_VLAN_8021Q is not set
+ # CONFIG_DECNET is not set
+ CONFIG_LLC=m
+@@ -395,26 +366,28 @@
+ # CONFIG_LAPB is not set
+ # CONFIG_ECONET is not set
+ # CONFIG_WAN_ROUTER is not set
++
++#
++# QoS and/or fair queueing
++#
+ # CONFIG_NET_SCHED is not set
+-# CONFIG_DCB is not set
+
+ #
+ # Network testing
+ #
+ CONFIG_NET_PKTGEN=m
+ # CONFIG_HAMRADIO is not set
+-# CONFIG_CAN is not set
+ # CONFIG_IRDA is not set
+ # CONFIG_BT is not set
+ # CONFIG_AF_RXRPC is not set
+-# CONFIG_PHONET is not set
+-CONFIG_WIRELESS=y
++
++#
++# Wireless
++#
+ # CONFIG_CFG80211 is not set
+-CONFIG_WIRELESS_OLD_REGULATORY=y
+ # CONFIG_WIRELESS_EXT is not set
+-# CONFIG_LIB80211 is not set
+ # CONFIG_MAC80211 is not set
+-# CONFIG_WIMAX is not set
++# CONFIG_IEEE80211 is not set
+ # CONFIG_RFKILL is not set
+ # CONFIG_NET_9P is not set
+
+@@ -429,8 +402,6 @@
+ # CONFIG_STANDALONE is not set
+ # CONFIG_PREVENT_FIRMWARE_BUILD is not set
+ CONFIG_FW_LOADER=y
+-CONFIG_FIRMWARE_IN_KERNEL=y
+-CONFIG_EXTRA_FIRMWARE=""
+ # CONFIG_DEBUG_DRIVER is not set
+ # CONFIG_DEBUG_DEVRES is not set
+ # CONFIG_SYS_HYPERVISOR is not set
+@@ -450,23 +421,14 @@
+ CONFIG_BLK_DEV_RAM=y
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=6144
+-# CONFIG_BLK_DEV_XIP is not set
++CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+ # CONFIG_CDROM_PKTCDVD is not set
+ # CONFIG_ATA_OVER_ETH is not set
+-# CONFIG_BLK_DEV_HD is not set
+ CONFIG_MISC_DEVICES=y
+ # CONFIG_PHANTOM is not set
++# CONFIG_EEPROM_93CX6 is not set
+ # CONFIG_SGI_IOC4 is not set
+ # CONFIG_TIFM_CORE is not set
+-# CONFIG_ENCLOSURE_SERVICES is not set
+-# CONFIG_HP_ILO is not set
+-# CONFIG_C2PORT is not set
+-
+-#
+-# EEPROM support
+-#
+-# CONFIG_EEPROM_93CX6 is not set
+-CONFIG_HAVE_IDE=y
+ # CONFIG_IDE is not set
+
+ #
+@@ -506,10 +468,8 @@
+ CONFIG_SCSI_FC_ATTRS=m
+ CONFIG_SCSI_ISCSI_ATTRS=m
+ # CONFIG_SCSI_SAS_LIBSAS is not set
+-# CONFIG_SCSI_SRP_ATTRS is not set
+ CONFIG_SCSI_LOWLEVEL=y
+ # CONFIG_ISCSI_TCP is not set
+-# CONFIG_SCSI_CXGB3_ISCSI is not set
+ # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+ # CONFIG_SCSI_3W_9XXX is not set
+ # CONFIG_SCSI_ACARD is not set
+@@ -518,21 +478,16 @@
+ # CONFIG_SCSI_AIC7XXX_OLD is not set
+ # CONFIG_SCSI_AIC79XX is not set
+ # CONFIG_SCSI_AIC94XX is not set
+-# CONFIG_SCSI_DPT_I2O is not set
+-# CONFIG_SCSI_ADVANSYS is not set
+ # CONFIG_SCSI_ARCMSR is not set
+ # CONFIG_MEGARAID_NEWGEN is not set
+ # CONFIG_MEGARAID_LEGACY is not set
+ # CONFIG_MEGARAID_SAS is not set
+ # CONFIG_SCSI_HPTIOP is not set
+-# CONFIG_LIBFC is not set
+-# CONFIG_FCOE is not set
+ # CONFIG_SCSI_DMX3191D is not set
+ # CONFIG_SCSI_FUTURE_DOMAIN is not set
+ # CONFIG_SCSI_IPS is not set
+ # CONFIG_SCSI_INITIO is not set
+ # CONFIG_SCSI_INIA100 is not set
+-# CONFIG_SCSI_MVSAS is not set
+ # CONFIG_SCSI_STEX is not set
+ CONFIG_SCSI_SYM53C8XX_2=y
+ CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
+@@ -548,11 +503,9 @@
+ CONFIG_SCSI_DEBUG=m
+ # CONFIG_SCSI_SRP is not set
+ # CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
+-# CONFIG_SCSI_DH is not set
+ # CONFIG_ATA is not set
+ CONFIG_MD=y
+ CONFIG_BLK_DEV_MD=y
+-CONFIG_MD_AUTODETECT=y
+ CONFIG_MD_LINEAR=y
+ CONFIG_MD_RAID0=y
+ CONFIG_MD_RAID1=y
+@@ -561,6 +514,10 @@
+ # CONFIG_MD_MULTIPATH is not set
+ # CONFIG_MD_FAULTY is not set
+ # CONFIG_BLK_DEV_DM is not set
++
++#
++# Fusion MPT device support
++#
+ CONFIG_FUSION=y
+ CONFIG_FUSION_SPI=m
+ CONFIG_FUSION_FC=m
+@@ -572,40 +529,20 @@
+ #
+ # IEEE 1394 (FireWire) support
+ #
+-
+-#
+-# Enable only one of the two stacks, unless you know what you are doing
+-#
+ # CONFIG_FIREWIRE is not set
+ # CONFIG_IEEE1394 is not set
+ # CONFIG_I2O is not set
+ CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
+ CONFIG_DUMMY=m
+ CONFIG_BONDING=m
+ # CONFIG_MACVLAN is not set
+ # CONFIG_EQUALIZER is not set
+ CONFIG_TUN=m
+ # CONFIG_VETH is not set
++# CONFIG_IP1000 is not set
+ # CONFIG_ARCNET is not set
+-CONFIG_PHYLIB=m
+-
+-#
+-# MII PHY device drivers
+-#
+-# CONFIG_MARVELL_PHY is not set
+-# CONFIG_DAVICOM_PHY is not set
+-# CONFIG_QSEMI_PHY is not set
+-# CONFIG_LXT_PHY is not set
+-# CONFIG_CICADA_PHY is not set
+-# CONFIG_VITESSE_PHY is not set
+-# CONFIG_SMSC_PHY is not set
+-# CONFIG_BROADCOM_PHY is not set
+-# CONFIG_ICPLUS_PHY is not set
+-# CONFIG_REALTEK_PHY is not set
+-# CONFIG_NATIONAL_PHY is not set
+-# CONFIG_STE10XP is not set
+-# CONFIG_LSI_ET1011C_PHY is not set
+-# CONFIG_MDIO_BITBANG is not set
++# CONFIG_PHYLIB is not set
+ CONFIG_NET_ETHERNET=y
+ CONFIG_MII=m
+ # CONFIG_HAPPYMEAL is not set
+@@ -630,38 +567,33 @@
+ # CONFIG_IBM_NEW_EMAC_RGMII is not set
+ # CONFIG_IBM_NEW_EMAC_TAH is not set
+ # CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+-# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
+-# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
+-# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
+ CONFIG_NET_PCI=y
+ CONFIG_PCNET32=m
++# CONFIG_PCNET32_NAPI is not set
+ # CONFIG_AMD8111_ETH is not set
+ # CONFIG_ADAPTEC_STARFIRE is not set
+ # CONFIG_B44 is not set
+ # CONFIG_FORCEDETH is not set
++# CONFIG_EEPRO100 is not set
+ CONFIG_E100=m
+ # CONFIG_FEALNX is not set
+ # CONFIG_NATSEMI is not set
+ # CONFIG_NE2K_PCI is not set
+ # CONFIG_8139CP is not set
+ # CONFIG_8139TOO is not set
+-# CONFIG_R6040 is not set
+ # CONFIG_SIS900 is not set
+ # CONFIG_EPIC100 is not set
+-# CONFIG_SMSC9420 is not set
+ # CONFIG_SUNDANCE is not set
+-# CONFIG_TLAN is not set
+ # CONFIG_VIA_RHINE is not set
+ # CONFIG_SC92031 is not set
+-# CONFIG_ATL2 is not set
+ CONFIG_NETDEV_1000=y
+ CONFIG_ACENIC=m
+ CONFIG_ACENIC_OMIT_TIGON_I=y
+ # CONFIG_DL2K is not set
+ CONFIG_E1000=m
++CONFIG_E1000_NAPI=y
++# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
+ # CONFIG_E1000E is not set
+-# CONFIG_IP1000 is not set
+-# CONFIG_IGB is not set
+ # CONFIG_NS83820 is not set
+ # CONFIG_HAMACHI is not set
+ # CONFIG_YELLOWFIN is not set
+@@ -669,31 +601,23 @@
+ # CONFIG_SIS190 is not set
+ # CONFIG_SKGE is not set
+ # CONFIG_SKY2 is not set
++# CONFIG_SK98LIN is not set
+ # CONFIG_VIA_VELOCITY is not set
+ CONFIG_TIGON3=m
+ # CONFIG_BNX2 is not set
+ # CONFIG_QLA3XXX is not set
+ # CONFIG_ATL1 is not set
+-# CONFIG_ATL1E is not set
+-# CONFIG_ATL1C is not set
+-# CONFIG_JME is not set
+ CONFIG_NETDEV_10000=y
+ # CONFIG_CHELSIO_T1 is not set
+-CONFIG_CHELSIO_T3_DEPENDS=y
+ # CONFIG_CHELSIO_T3 is not set
+-# CONFIG_ENIC is not set
+ # CONFIG_IXGBE is not set
+ # CONFIG_IXGB is not set
+ # CONFIG_S2IO is not set
+ # CONFIG_MYRI10GE is not set
+ # CONFIG_NETXEN_NIC is not set
+ # CONFIG_NIU is not set
+-# CONFIG_MLX4_EN is not set
+ # CONFIG_MLX4_CORE is not set
+ # CONFIG_TEHUTI is not set
+-# CONFIG_BNX2X is not set
+-# CONFIG_QLGE is not set
+-# CONFIG_SFC is not set
+ # CONFIG_TR is not set
+
+ #
+@@ -701,11 +625,6 @@
+ #
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
+-# CONFIG_IWLWIFI_LEDS is not set
+-
+-#
+-# Enable WiMAX (Networking options) to see the WiMAX drivers
+-#
+ CONFIG_NET_PCMCIA=y
+ CONFIG_PCMCIA_3C589=m
+ CONFIG_PCMCIA_3C574=m
+@@ -731,6 +650,7 @@
+ # CONFIG_SLIP is not set
+ CONFIG_SLHC=m
+ # CONFIG_NET_FC is not set
++# CONFIG_SHAPER is not set
+ # CONFIG_NETCONSOLE is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+@@ -749,6 +669,7 @@
+ #
+ # CONFIG_INPUT_MOUSEDEV is not set
+ # CONFIG_INPUT_JOYDEV is not set
++# CONFIG_INPUT_TSDEV is not set
+ # CONFIG_INPUT_EVDEV is not set
+ # CONFIG_INPUT_EVBUG is not set
+
+@@ -772,13 +693,10 @@
+ # Character devices
+ #
+ CONFIG_VT=y
+-CONFIG_CONSOLE_TRANSLATIONS=y
+ CONFIG_VT_CONSOLE=y
+ CONFIG_HW_CONSOLE=y
+ # CONFIG_VT_HW_CONSOLE_BINDING is not set
+-CONFIG_DEVKMEM=y
+ # CONFIG_SERIAL_NONSTANDARD is not set
+-# CONFIG_NOZOMI is not set
+
+ #
+ # Serial drivers
+@@ -803,12 +721,17 @@
+ CONFIG_SERIAL_CORE_CONSOLE=y
+ # CONFIG_SERIAL_JSM is not set
+ CONFIG_UNIX98_PTYS=y
+-# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+ # CONFIG_LEGACY_PTYS is not set
+ # CONFIG_IPMI_HANDLER is not set
++# CONFIG_WATCHDOG is not set
+ # CONFIG_HW_RANDOM is not set
++CONFIG_GEN_RTC=y
++CONFIG_GEN_RTC_X=y
+ # CONFIG_R3964 is not set
+ # CONFIG_APPLICOM is not set
++CONFIG_AGP=y
++CONFIG_AGP_PARISC=y
++# CONFIG_DRM is not set
+
+ #
+ # PCMCIA character devices
+@@ -816,66 +739,51 @@
+ # CONFIG_SYNCLINK_CS is not set
+ # CONFIG_CARDMAN_4000 is not set
+ # CONFIG_CARDMAN_4040 is not set
+-# CONFIG_IPWIRELESS is not set
+ CONFIG_RAW_DRIVER=y
+ CONFIG_MAX_RAW_DEVS=256
+ # CONFIG_TCG_TPM is not set
+ CONFIG_DEVPORT=y
+ # CONFIG_I2C is not set
++
++#
++# SPI support
++#
+ # CONFIG_SPI is not set
++# CONFIG_SPI_MASTER is not set
+ # CONFIG_W1 is not set
+ # CONFIG_POWER_SUPPLY is not set
+ # CONFIG_HWMON is not set
+-# CONFIG_THERMAL is not set
+-# CONFIG_THERMAL_HWMON is not set
+-# CONFIG_WATCHDOG is not set
+-CONFIG_SSB_POSSIBLE=y
+
+ #
+ # Sonics Silicon Backplane
+ #
++CONFIG_SSB_POSSIBLE=y
+ # CONFIG_SSB is not set
+
+ #
+ # Multifunction device drivers
+ #
+-# CONFIG_MFD_CORE is not set
+ # CONFIG_MFD_SM501 is not set
+-# CONFIG_HTC_PASIC3 is not set
+-# CONFIG_MFD_TMIO is not set
+-# CONFIG_REGULATOR is not set
+
+ #
+ # Multimedia devices
+ #
+-
+-#
+-# Multimedia core support
+-#
+ # CONFIG_VIDEO_DEV is not set
+ # CONFIG_DVB_CORE is not set
+-# CONFIG_VIDEO_MEDIA is not set
+-
+-#
+-# Multimedia drivers
+-#
+ # CONFIG_DAB is not set
+
+ #
+ # Graphics support
+ #
+-CONFIG_AGP=y
+-CONFIG_AGP_PARISC=y
+-# CONFIG_DRM is not set
+-# CONFIG_VGASTATE is not set
+-# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+-# CONFIG_FB is not set
+ # CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+ #
+ # Display device support
+ #
+ # CONFIG_DISPLAY_SUPPORT is not set
++# CONFIG_VGASTATE is not set
++# CONFIG_VIDEO_OUTPUT_CONTROL is not set
++# CONFIG_FB is not set
+
+ #
+ # Console display driver support
+@@ -884,83 +792,50 @@
+ CONFIG_DUMMY_CONSOLE_COLUMNS=160
+ CONFIG_DUMMY_CONSOLE_ROWS=64
+ # CONFIG_STI_CONSOLE is not set
++
++#
++# Sound
++#
+ # CONFIG_SOUND is not set
+ CONFIG_HID_SUPPORT=y
+ CONFIG_HID=y
+ # CONFIG_HID_DEBUG is not set
+-# CONFIG_HIDRAW is not set
+-# CONFIG_HID_PID is not set
+-
+-#
+-# Special HID drivers
+-#
+-CONFIG_HID_COMPAT=y
+ CONFIG_USB_SUPPORT=y
+ CONFIG_USB_ARCH_HAS_HCD=y
+ CONFIG_USB_ARCH_HAS_OHCI=y
+ CONFIG_USB_ARCH_HAS_EHCI=y
+ # CONFIG_USB is not set
+-# CONFIG_USB_OTG_WHITELIST is not set
+-# CONFIG_USB_OTG_BLACKLIST_HUB is not set
+
+ #
+-# Enable Host or Gadget support to see Inventra options
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+
+ #
+-# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
++# USB Gadget Support
+ #
+ # CONFIG_USB_GADGET is not set
+-
+-#
+-# OTG and related infrastructure
+-#
+-# CONFIG_UWB is not set
+ # CONFIG_MMC is not set
+-# CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS is not set
+-# CONFIG_ACCESSIBILITY is not set
+ # CONFIG_INFINIBAND is not set
+-CONFIG_RTC_LIB=y
+-CONFIG_RTC_CLASS=y
+-CONFIG_RTC_HCTOSYS=y
+-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+-# CONFIG_RTC_DEBUG is not set
++# CONFIG_RTC_CLASS is not set
+
+ #
+-# RTC interfaces
++# DMA Engine support
+ #
+-CONFIG_RTC_INTF_SYSFS=y
+-CONFIG_RTC_INTF_PROC=y
+-CONFIG_RTC_INTF_DEV=y
+-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+-# CONFIG_RTC_DRV_TEST is not set
++# CONFIG_DMA_ENGINE is not set
+
+ #
+-# SPI RTC drivers
++# DMA Clients
+ #
+
+ #
+-# Platform RTC drivers
++# DMA Devices
+ #
+-# CONFIG_RTC_DRV_DS1286 is not set
+-# CONFIG_RTC_DRV_DS1511 is not set
+-# CONFIG_RTC_DRV_DS1553 is not set
+-# CONFIG_RTC_DRV_DS1742 is not set
+-# CONFIG_RTC_DRV_STK17TA8 is not set
+-# CONFIG_RTC_DRV_M48T86 is not set
+-# CONFIG_RTC_DRV_M48T35 is not set
+-# CONFIG_RTC_DRV_M48T59 is not set
+-# CONFIG_RTC_DRV_BQ4802 is not set
+-# CONFIG_RTC_DRV_V3020 is not set
+
+ #
+-# on-CPU RTC drivers
++# Userspace I/O
+ #
+-CONFIG_RTC_DRV_PARISC=y
+-# CONFIG_DMADEVICES is not set
+ # CONFIG_UIO is not set
+-# CONFIG_STAGING is not set
+
+ #
+ # File systems
+@@ -970,7 +845,7 @@
+ # CONFIG_EXT2_FS_XIP is not set
+ CONFIG_EXT3_FS=y
+ # CONFIG_EXT3_FS_XATTR is not set
+-# CONFIG_EXT4_FS is not set
++# CONFIG_EXT4DEV_FS is not set
+ CONFIG_JBD=y
+ # CONFIG_JBD_DEBUG is not set
+ # CONFIG_REISERFS_FS is not set
+@@ -980,19 +855,19 @@
+ # CONFIG_JFS_DEBUG is not set
+ # CONFIG_JFS_STATISTICS is not set
+ CONFIG_FS_POSIX_ACL=y
+-CONFIG_FILE_LOCKING=y
+ CONFIG_XFS_FS=m
+ # CONFIG_XFS_QUOTA is not set
++# CONFIG_XFS_SECURITY is not set
+ # CONFIG_XFS_POSIX_ACL is not set
+ # CONFIG_XFS_RT is not set
+-# CONFIG_XFS_DEBUG is not set
+ # CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_BTRFS_FS is not set
+-CONFIG_DNOTIFY=y
++# CONFIG_MINIX_FS is not set
++# CONFIG_ROMFS_FS is not set
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+ # CONFIG_QUOTA is not set
++CONFIG_DNOTIFY=y
+ # CONFIG_AUTOFS_FS is not set
+ CONFIG_AUTOFS4_FS=y
+ # CONFIG_FUSE_FS is not set
+@@ -1022,13 +897,16 @@
+ CONFIG_PROC_FS=y
+ CONFIG_PROC_KCORE=y
+ CONFIG_PROC_SYSCTL=y
+-CONFIG_PROC_PAGE_MONITOR=y
+ CONFIG_SYSFS=y
+ CONFIG_TMPFS=y
+ # CONFIG_TMPFS_POSIX_ACL is not set
+ # CONFIG_HUGETLB_PAGE is not set
++CONFIG_RAMFS=y
+ # CONFIG_CONFIGFS_FS is not set
+-CONFIG_MISC_FILESYSTEMS=y
++
++#
++# Miscellaneous filesystems
++#
+ # CONFIG_ADFS_FS is not set
+ # CONFIG_AFFS_FS is not set
+ # CONFIG_ECRYPT_FS is not set
+@@ -1038,33 +916,34 @@
+ # CONFIG_BFS_FS is not set
+ # CONFIG_EFS_FS is not set
+ # CONFIG_CRAMFS is not set
+-# CONFIG_SQUASHFS is not set
+ # CONFIG_VXFS_FS is not set
+-# CONFIG_MINIX_FS is not set
+-# CONFIG_OMFS_FS is not set
+ # CONFIG_HPFS_FS is not set
+ # CONFIG_QNX4FS_FS is not set
+-# CONFIG_ROMFS_FS is not set
+ # CONFIG_SYSV_FS is not set
+ CONFIG_UFS_FS=m
+ # CONFIG_UFS_FS_WRITE is not set
+ # CONFIG_UFS_DEBUG is not set
+-CONFIG_NETWORK_FILESYSTEMS=y
++
++#
++# Network File Systems
++#
+ CONFIG_NFS_FS=m
+ CONFIG_NFS_V3=y
+ # CONFIG_NFS_V3_ACL is not set
+ CONFIG_NFS_V4=y
++CONFIG_NFS_DIRECTIO=y
+ CONFIG_NFSD=m
+ CONFIG_NFSD_V3=y
+ # CONFIG_NFSD_V3_ACL is not set
+ CONFIG_NFSD_V4=y
++CONFIG_NFSD_TCP=y
+ CONFIG_LOCKD=m
+ CONFIG_LOCKD_V4=y
+ CONFIG_EXPORTFS=m
+ CONFIG_NFS_COMMON=y
+ CONFIG_SUNRPC=m
+ CONFIG_SUNRPC_GSS=m
+-# CONFIG_SUNRPC_REGISTER_V4 is not set
++# CONFIG_SUNRPC_BIND34 is not set
+ CONFIG_RPCSEC_GSS_KRB5=m
+ CONFIG_RPCSEC_GSS_SPKM3=m
+ CONFIG_SMB_FS=m
+@@ -1073,7 +952,6 @@
+ CONFIG_CIFS=m
+ # CONFIG_CIFS_STATS is not set
+ # CONFIG_CIFS_WEAK_PW_HASH is not set
+-# CONFIG_CIFS_UPCALL is not set
+ # CONFIG_CIFS_XATTR is not set
+ # CONFIG_CIFS_DEBUG2 is not set
+ # CONFIG_CIFS_EXPERIMENTAL is not set
+@@ -1086,6 +964,10 @@
+ #
+ # CONFIG_PARTITION_ADVANCED is not set
+ CONFIG_MSDOS_PARTITION=y
++
++#
++# Native Language Support
++#
+ CONFIG_NLS=y
+ CONFIG_NLS_DEFAULT="iso8859-1"
+ CONFIG_NLS_CODEPAGE_437=m
+@@ -1126,28 +1008,33 @@
+ # CONFIG_NLS_KOI8_R is not set
+ # CONFIG_NLS_KOI8_U is not set
+ CONFIG_NLS_UTF8=m
++
++#
++# Distributed Lock Manager
++#
+ # CONFIG_DLM is not set
+
+ #
++# Profiling support
++#
++CONFIG_PROFILING=y
++CONFIG_OPROFILE=m
++
++#
+ # Kernel hacking
+ #
+ # CONFIG_PRINTK_TIME is not set
+-CONFIG_ENABLE_WARN_DEPRECATED=y
+ CONFIG_ENABLE_MUST_CHECK=y
+-CONFIG_FRAME_WARN=2048
+ CONFIG_MAGIC_SYSRQ=y
+ # CONFIG_UNUSED_SYMBOLS is not set
+-CONFIG_DEBUG_FS=y
++# CONFIG_DEBUG_FS is not set
+ CONFIG_HEADERS_CHECK=y
+ CONFIG_DEBUG_KERNEL=y
+ # CONFIG_DEBUG_SHIRQ is not set
+ CONFIG_DETECT_SOFTLOCKUP=y
+-# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+-CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
+ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS is not set
+-# CONFIG_DEBUG_OBJECTS is not set
+ # CONFIG_DEBUG_SLAB is not set
+ # CONFIG_DEBUG_RT_MUTEXES is not set
+ # CONFIG_RT_MUTEX_TESTER is not set
+@@ -1159,33 +1046,10 @@
+ # CONFIG_DEBUG_BUGVERBOSE is not set
+ # CONFIG_DEBUG_INFO is not set
+ # CONFIG_DEBUG_VM is not set
+-# CONFIG_DEBUG_WRITECOUNT is not set
+-# CONFIG_DEBUG_MEMORY_INIT is not set
+ # CONFIG_DEBUG_LIST is not set
+-# CONFIG_DEBUG_SG is not set
+-# CONFIG_DEBUG_NOTIFIERS is not set
+-# CONFIG_BOOT_PRINTK_DELAY is not set
++CONFIG_FORCED_INLINING=y
+ # CONFIG_RCU_TORTURE_TEST is not set
+-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+-# CONFIG_BACKTRACE_SELF_TEST is not set
+-# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+ # CONFIG_FAULT_INJECTION is not set
+-# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+-CONFIG_NOP_TRACER=y
+-CONFIG_RING_BUFFER=y
+-CONFIG_TRACING=y
+-
+-#
+-# Tracers
+-#
+-# CONFIG_SCHED_TRACER is not set
+-# CONFIG_CONTEXT_SWITCH_TRACER is not set
+-# CONFIG_BOOT_TRACER is not set
+-# CONFIG_TRACE_BRANCH_PROFILING is not set
+-# CONFIG_FTRACE_STARTUP_TEST is not set
+-# CONFIG_BUILD_DOCSRC is not set
+-# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
+-# CONFIG_SAMPLES is not set
+ # CONFIG_DEBUG_RODATA is not set
+
+ #
+@@ -1194,112 +1058,56 @@
+ CONFIG_KEYS=y
+ CONFIG_KEYS_DEBUG_PROC_KEYS=y
+ # CONFIG_SECURITY is not set
+-# CONFIG_SECURITYFS is not set
+-# CONFIG_SECURITY_FILE_CAPABILITIES is not set
+ CONFIG_CRYPTO=y
+-
+-#
+-# Crypto core or helper
+-#
+-# CONFIG_CRYPTO_FIPS is not set
+ CONFIG_CRYPTO_ALGAPI=y
+-CONFIG_CRYPTO_ALGAPI2=y
+-CONFIG_CRYPTO_AEAD=m
+-CONFIG_CRYPTO_AEAD2=y
+ CONFIG_CRYPTO_BLKCIPHER=m
+-CONFIG_CRYPTO_BLKCIPHER2=y
+ CONFIG_CRYPTO_HASH=y
+-CONFIG_CRYPTO_HASH2=y
+-CONFIG_CRYPTO_RNG2=y
+ CONFIG_CRYPTO_MANAGER=y
+-CONFIG_CRYPTO_MANAGER2=y
+-# CONFIG_CRYPTO_GF128MUL is not set
+-CONFIG_CRYPTO_NULL=m
+-# CONFIG_CRYPTO_CRYPTD is not set
+-CONFIG_CRYPTO_AUTHENC=m
+-CONFIG_CRYPTO_TEST=m
+-
+-#
+-# Authenticated Encryption with Associated Data
+-#
+-# CONFIG_CRYPTO_CCM is not set
+-# CONFIG_CRYPTO_GCM is not set
+-# CONFIG_CRYPTO_SEQIV is not set
+-
+-#
+-# Block modes
+-#
+-CONFIG_CRYPTO_CBC=m
+-# CONFIG_CRYPTO_CTR is not set
+-# CONFIG_CRYPTO_CTS is not set
+-# CONFIG_CRYPTO_ECB is not set
+-# CONFIG_CRYPTO_LRW is not set
+-# CONFIG_CRYPTO_PCBC is not set
+-# CONFIG_CRYPTO_XTS is not set
+-
+-#
+-# Hash modes
+-#
+ CONFIG_CRYPTO_HMAC=y
+ # CONFIG_CRYPTO_XCBC is not set
+-
+-#
+-# Digest
+-#
+-CONFIG_CRYPTO_CRC32C=m
++CONFIG_CRYPTO_NULL=m
+ # CONFIG_CRYPTO_MD4 is not set
+ CONFIG_CRYPTO_MD5=y
+-# CONFIG_CRYPTO_MICHAEL_MIC is not set
+-# CONFIG_CRYPTO_RMD128 is not set
+-# CONFIG_CRYPTO_RMD160 is not set
+-# CONFIG_CRYPTO_RMD256 is not set
+-# CONFIG_CRYPTO_RMD320 is not set
+ CONFIG_CRYPTO_SHA1=m
+ # CONFIG_CRYPTO_SHA256 is not set
+ # CONFIG_CRYPTO_SHA512 is not set
+-# CONFIG_CRYPTO_TGR192 is not set
+ # CONFIG_CRYPTO_WP512 is not set
+-
+-#
+-# Ciphers
+-#
+-# CONFIG_CRYPTO_AES is not set
+-# CONFIG_CRYPTO_ANUBIS is not set
+-# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_GF128MUL is not set
++# CONFIG_CRYPTO_ECB is not set
++CONFIG_CRYPTO_CBC=m
++# CONFIG_CRYPTO_PCBC is not set
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_XTS is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_DES=m
++# CONFIG_CRYPTO_FCRYPT is not set
+ CONFIG_CRYPTO_BLOWFISH=m
+-# CONFIG_CRYPTO_CAMELLIA is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_AES is not set
+ CONFIG_CRYPTO_CAST5=m
+ # CONFIG_CRYPTO_CAST6 is not set
+-CONFIG_CRYPTO_DES=m
+-# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_ARC4 is not set
+ # CONFIG_CRYPTO_KHAZAD is not set
+-# CONFIG_CRYPTO_SALSA20 is not set
++# CONFIG_CRYPTO_ANUBIS is not set
+ # CONFIG_CRYPTO_SEED is not set
+-# CONFIG_CRYPTO_SERPENT is not set
+-# CONFIG_CRYPTO_TEA is not set
+-# CONFIG_CRYPTO_TWOFISH is not set
+-
+-#
+-# Compression
+-#
+ CONFIG_CRYPTO_DEFLATE=m
+-# CONFIG_CRYPTO_LZO is not set
+-
+-#
+-# Random Number Generation
+-#
+-# CONFIG_CRYPTO_ANSI_CPRNG is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++CONFIG_CRYPTO_CRC32C=m
++# CONFIG_CRYPTO_CAMELLIA is not set
++CONFIG_CRYPTO_TEST=m
++# CONFIG_CRYPTO_AUTHENC is not set
+ # CONFIG_CRYPTO_HW is not set
+
+ #
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
+-CONFIG_GENERIC_FIND_LAST_BIT=y
+ CONFIG_CRC_CCITT=m
+ # CONFIG_CRC16 is not set
+-# CONFIG_CRC_T10DIF is not set
+-CONFIG_CRC_ITU_T=m
++# CONFIG_CRC_ITU_T is not set
+ CONFIG_CRC32=y
+ # CONFIG_CRC7 is not set
+ CONFIG_LIBCRC32C=m
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/parisc/configs/b180_defconfig linux-2.6.29-rc3.owrt/arch/parisc/configs/b180_defconfig
+--- linux-2.6.29.owrt/arch/parisc/configs/b180_defconfig 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/parisc/configs/b180_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-rc8
+-# Fri Mar 13 01:32:57 2009
++# Linux kernel version: 2.6.23
++# Fri Oct 12 21:16:46 2007
+ #
+ CONFIG_PARISC=y
+ CONFIG_MMU=y
+@@ -33,29 +33,13 @@
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
+ # CONFIG_AUDIT is not set
+-
+-#
+-# RCU Subsystem
+-#
+-CONFIG_CLASSIC_RCU=y
+-# CONFIG_TREE_RCU is not set
+-# CONFIG_PREEMPT_RCU is not set
+-# CONFIG_TREE_RCU_TRACE is not set
+-# CONFIG_PREEMPT_RCU_TRACE is not set
+ CONFIG_IKCONFIG=y
+ CONFIG_IKCONFIG_PROC=y
+ CONFIG_LOG_BUF_SHIFT=16
+-# CONFIG_CGROUPS is not set
+ CONFIG_SYSFS_DEPRECATED=y
+-CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
+-CONFIG_NAMESPACES=y
+-# CONFIG_UTS_NS is not set
+-# CONFIG_IPC_NS is not set
+ # CONFIG_BLK_DEV_INITRD is not set
+-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+ CONFIG_SYSCTL=y
+-CONFIG_ANON_INODES=y
+ # CONFIG_EMBEDDED is not set
+ CONFIG_SYSCTL_SYSCALL=y
+ CONFIG_KALLSYMS=y
+@@ -67,34 +51,27 @@
+ CONFIG_ELF_CORE=y
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
++CONFIG_ANON_INODES=y
+ CONFIG_EPOLL=y
+ CONFIG_SIGNALFD=y
+-CONFIG_TIMERFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_SHMEM=y
+-CONFIG_AIO=y
+ CONFIG_VM_EVENT_COUNTERS=y
+-CONFIG_PCI_QUIRKS=y
+-CONFIG_COMPAT_BRK=y
+ CONFIG_SLAB=y
+ # CONFIG_SLUB is not set
+ # CONFIG_SLOB is not set
+-# CONFIG_PROFILING is not set
+-CONFIG_HAVE_OPROFILE=y
+-# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
+-CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+ CONFIG_MODULES=y
+-# CONFIG_MODULE_FORCE_LOAD is not set
+ # CONFIG_MODULE_UNLOAD is not set
+ CONFIG_MODVERSIONS=y
+ # CONFIG_MODULE_SRCVERSION_ALL is not set
+-CONFIG_INIT_ALL_POSSIBLE=y
++# CONFIG_KMOD is not set
+ CONFIG_BLOCK=y
+ # CONFIG_LBD is not set
+ # CONFIG_BLK_DEV_IO_TRACE is not set
+-# CONFIG_BLK_DEV_INTEGRITY is not set
++# CONFIG_LSF is not set
+
+ #
+ # IO Schedulers
+@@ -108,7 +85,6 @@
+ CONFIG_DEFAULT_CFQ=y
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="cfq"
+-# CONFIG_FREEZER is not set
+
+ #
+ # Processor type and features
+@@ -132,15 +108,13 @@
+ # CONFIG_HZ_300 is not set
+ # CONFIG_HZ_1000 is not set
+ CONFIG_HZ=250
+-# CONFIG_SCHED_HRTICK is not set
+ CONFIG_FLATMEM=y
+ CONFIG_FLAT_NODE_MEM_MAP=y
+-CONFIG_PAGEFLAGS_EXTENDED=y
++# CONFIG_SPARSEMEM_STATIC is not set
+ CONFIG_SPLIT_PTLOCK_CPUS=4096
+-# CONFIG_PHYS_ADDR_T_64BIT is not set
++# CONFIG_RESOURCES_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=0
+ CONFIG_VIRT_TO_BUS=y
+-CONFIG_UNEVICTABLE_LRU=y
+ # CONFIG_HPUX is not set
+
+ #
+@@ -156,14 +130,14 @@
+ CONFIG_ISA=y
+ CONFIG_PCI=y
+ # CONFIG_ARCH_SUPPORTS_MSI is not set
+-CONFIG_PCI_LEGACY=y
+ # CONFIG_PCI_DEBUG is not set
+-# CONFIG_PCI_STUB is not set
+ CONFIG_GSC_DINO=y
+ # CONFIG_PCI_LBA is not set
+-CONFIG_IOMMU_HELPER=y
++
++#
++# PCCARD (PCMCIA/CardBus) support
++#
+ # CONFIG_PCCARD is not set
+-# CONFIG_HOTPLUG_PCI is not set
+
+ #
+ # PA-RISC specific drivers
+@@ -177,15 +151,16 @@
+ # Executable file formats
+ #
+ CONFIG_BINFMT_ELF=y
+-# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+-# CONFIG_HAVE_AOUT is not set
+ # CONFIG_BINFMT_MISC is not set
++
++#
++# Networking
++#
+ CONFIG_NET=y
+
+ #
+ # Networking options
+ #
+-CONFIG_COMPAT_NET_DEV_OPS=y
+ CONFIG_PACKET=y
+ CONFIG_PACKET_MMAP=y
+ CONFIG_UNIX=y
+@@ -230,37 +205,36 @@
+ CONFIG_INET6_XFRM_MODE_TUNNEL=y
+ CONFIG_INET6_XFRM_MODE_BEET=y
+ CONFIG_IPV6_SIT=y
+-CONFIG_IPV6_NDISC_NODETYPE=y
+ # CONFIG_IPV6_TUNNEL is not set
+ # CONFIG_NETLABEL is not set
+ # CONFIG_NETWORK_SECMARK is not set
+ # CONFIG_NETFILTER is not set
+-# CONFIG_ATM is not set
+ # CONFIG_BRIDGE is not set
+ # CONFIG_VLAN_8021Q is not set
+ # CONFIG_DECNET is not set
+ # CONFIG_LLC2 is not set
+ # CONFIG_IPX is not set
+ # CONFIG_ATALK is not set
++
++#
++# QoS and/or fair queueing
++#
+ # CONFIG_NET_SCHED is not set
+-# CONFIG_DCB is not set
+
+ #
+ # Network testing
+ #
+ # CONFIG_NET_PKTGEN is not set
+ # CONFIG_HAMRADIO is not set
+-# CONFIG_CAN is not set
+ # CONFIG_IRDA is not set
+ # CONFIG_BT is not set
+-# CONFIG_PHONET is not set
+-CONFIG_WIRELESS=y
++
++#
++# Wireless
++#
+ # CONFIG_CFG80211 is not set
+-CONFIG_WIRELESS_OLD_REGULATORY=y
+ # CONFIG_WIRELESS_EXT is not set
+-# CONFIG_LIB80211 is not set
+-# CONFIG_MAC80211 is not set
+-# CONFIG_WIMAX is not set
++# CONFIG_IEEE80211 is not set
+ # CONFIG_RFKILL is not set
+
+ #
+@@ -273,9 +247,7 @@
+ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+ CONFIG_STANDALONE=y
+ # CONFIG_PREVENT_FIRMWARE_BUILD is not set
+-CONFIG_FW_LOADER=y
+-CONFIG_FIRMWARE_IN_KERNEL=y
+-CONFIG_EXTRA_FIRMWARE=""
++# CONFIG_FW_LOADER is not set
+ # CONFIG_DEBUG_DRIVER is not set
+ # CONFIG_DEBUG_DEVRES is not set
+ # CONFIG_SYS_HYPERVISOR is not set
+@@ -303,18 +275,10 @@
+ CONFIG_CDROM_PKTCDVD=m
+ CONFIG_CDROM_PKTCDVD_BUFFERS=8
+ CONFIG_ATA_OVER_ETH=y
+-# CONFIG_BLK_DEV_HD is not set
+ CONFIG_MISC_DEVICES=y
+ # CONFIG_PHANTOM is not set
+-# CONFIG_SGI_IOC4 is not set
+-# CONFIG_ENCLOSURE_SERVICES is not set
+-# CONFIG_HP_ILO is not set
+-
+-#
+-# EEPROM support
+-#
+ # CONFIG_EEPROM_93CX6 is not set
+-CONFIG_HAVE_IDE=y
++# CONFIG_SGI_IOC4 is not set
+ # CONFIG_IDE is not set
+
+ #
+@@ -353,10 +317,8 @@
+ # CONFIG_SCSI_FC_ATTRS is not set
+ # CONFIG_SCSI_ISCSI_ATTRS is not set
+ # CONFIG_SCSI_SAS_LIBSAS is not set
+-# CONFIG_SCSI_SRP_ATTRS is not set
+ CONFIG_SCSI_LOWLEVEL=y
+ # CONFIG_ISCSI_TCP is not set
+-# CONFIG_SCSI_CXGB3_ISCSI is not set
+ # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+ # CONFIG_SCSI_3W_9XXX is not set
+ # CONFIG_SCSI_ACARD is not set
+@@ -368,15 +330,12 @@
+ # CONFIG_SCSI_AIC79XX is not set
+ # CONFIG_SCSI_AIC94XX is not set
+ # CONFIG_SCSI_DPT_I2O is not set
+-# CONFIG_SCSI_ADVANSYS is not set
+ # CONFIG_SCSI_IN2000 is not set
+ # CONFIG_SCSI_ARCMSR is not set
+ # CONFIG_MEGARAID_NEWGEN is not set
+ # CONFIG_MEGARAID_LEGACY is not set
+ # CONFIG_MEGARAID_SAS is not set
+ # CONFIG_SCSI_HPTIOP is not set
+-# CONFIG_LIBFC is not set
+-# CONFIG_FCOE is not set
+ # CONFIG_SCSI_DMX3191D is not set
+ # CONFIG_SCSI_DTC3280 is not set
+ # CONFIG_SCSI_FUTURE_DOMAIN is not set
+@@ -387,7 +346,6 @@
+ # CONFIG_SCSI_INIA100 is not set
+ # CONFIG_SCSI_PPA is not set
+ # CONFIG_SCSI_IMM is not set
+-# CONFIG_SCSI_MVSAS is not set
+ # CONFIG_SCSI_NCR53C406A is not set
+ CONFIG_SCSI_LASI700=y
+ CONFIG_53C700_LE_ON_BE=y
+@@ -402,6 +360,7 @@
+ CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32
+ CONFIG_SCSI_NCR53C8XX_SYNC=40
+ # CONFIG_SCSI_PAS16 is not set
++# CONFIG_SCSI_PSI240I is not set
+ # CONFIG_SCSI_QLOGIC_FAS is not set
+ # CONFIG_SCSI_QLOGIC_1280 is not set
+ # CONFIG_SCSI_QLA_FC is not set
+@@ -414,11 +373,9 @@
+ # CONFIG_SCSI_NSP32 is not set
+ # CONFIG_SCSI_DEBUG is not set
+ # CONFIG_SCSI_SRP is not set
+-# CONFIG_SCSI_DH is not set
+ # CONFIG_ATA is not set
+ CONFIG_MD=y
+ CONFIG_BLK_DEV_MD=y
+-CONFIG_MD_AUTODETECT=y
+ CONFIG_MD_LINEAR=y
+ CONFIG_MD_RAID0=y
+ CONFIG_MD_RAID1=y
+@@ -426,18 +383,26 @@
+ # CONFIG_MD_MULTIPATH is not set
+ # CONFIG_MD_FAULTY is not set
+ # CONFIG_BLK_DEV_DM is not set
++
++#
++# Fusion MPT device support
++#
+ # CONFIG_FUSION is not set
++# CONFIG_FUSION_SPI is not set
++# CONFIG_FUSION_FC is not set
++# CONFIG_FUSION_SAS is not set
+
+ #
+ # IEEE 1394 (FireWire) support
+ #
+
+ #
+-# A new alternative FireWire stack is available with EXPERIMENTAL=y
++# An alternative FireWire stack is available with EXPERIMENTAL=y
+ #
+ # CONFIG_IEEE1394 is not set
+ # CONFIG_I2O is not set
+ CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
+ # CONFIG_DUMMY is not set
+ # CONFIG_BONDING is not set
+ # CONFIG_EQUALIZER is not set
+@@ -469,49 +434,36 @@
+ # CONFIG_IBM_NEW_EMAC_RGMII is not set
+ # CONFIG_IBM_NEW_EMAC_TAH is not set
+ # CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+-# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
+-# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
+-# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
+ # CONFIG_NET_PCI is not set
+ # CONFIG_B44 is not set
+-# CONFIG_CS89x0 is not set
+ # CONFIG_NET_POCKET is not set
+-# CONFIG_ATL2 is not set
+ CONFIG_NETDEV_1000=y
+ # CONFIG_ACENIC is not set
+ # CONFIG_DL2K is not set
+ # CONFIG_E1000 is not set
+ # CONFIG_E1000E is not set
+-# CONFIG_IGB is not set
+ # CONFIG_NS83820 is not set
+ # CONFIG_HAMACHI is not set
+ # CONFIG_R8169 is not set
+ # CONFIG_SIS190 is not set
+ # CONFIG_SKGE is not set
+ # CONFIG_SKY2 is not set
++# CONFIG_SK98LIN is not set
+ # CONFIG_VIA_VELOCITY is not set
+ # CONFIG_TIGON3 is not set
+ # CONFIG_BNX2 is not set
+ # CONFIG_QLA3XXX is not set
+-# CONFIG_ATL1 is not set
+-# CONFIG_JME is not set
+ CONFIG_NETDEV_10000=y
+ # CONFIG_CHELSIO_T1 is not set
+-CONFIG_CHELSIO_T3_DEPENDS=y
+ # CONFIG_CHELSIO_T3 is not set
+-# CONFIG_ENIC is not set
+ # CONFIG_IXGBE is not set
+ # CONFIG_IXGB is not set
+ # CONFIG_S2IO is not set
+ # CONFIG_MYRI10GE is not set
+ # CONFIG_NETXEN_NIC is not set
+ # CONFIG_NIU is not set
+-# CONFIG_MLX4_EN is not set
+ # CONFIG_MLX4_CORE is not set
+ # CONFIG_TEHUTI is not set
+-# CONFIG_BNX2X is not set
+-# CONFIG_QLGE is not set
+-# CONFIG_SFC is not set
+ # CONFIG_TR is not set
+
+ #
+@@ -519,11 +471,6 @@
+ #
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
+-# CONFIG_IWLWIFI_LEDS is not set
+-
+-#
+-# Enable WiMAX (Networking options) to see the WiMAX drivers
+-#
+ # CONFIG_WAN is not set
+ # CONFIG_FDDI is not set
+ # CONFIG_PLIP is not set
+@@ -556,6 +503,7 @@
+ CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+ # CONFIG_INPUT_JOYDEV is not set
++# CONFIG_INPUT_TSDEV is not set
+ CONFIG_INPUT_EVDEV=y
+ # CONFIG_INPUT_EVBUG is not set
+
+@@ -578,12 +526,11 @@
+ CONFIG_MOUSE_PS2_ALPS=y
+ CONFIG_MOUSE_PS2_LOGIPS2PP=y
+ CONFIG_MOUSE_PS2_SYNAPTICS=y
++CONFIG_MOUSE_PS2_LIFEBOOK=y
+ CONFIG_MOUSE_PS2_TRACKPOINT=y
+-# CONFIG_MOUSE_PS2_ELANTECH is not set
+ # CONFIG_MOUSE_PS2_TOUCHKIT is not set
+ # CONFIG_MOUSE_SERIAL is not set
+ # CONFIG_MOUSE_APPLETOUCH is not set
+-# CONFIG_MOUSE_BCM5974 is not set
+ # CONFIG_MOUSE_INPORT is not set
+ # CONFIG_MOUSE_LOGIBM is not set
+ # CONFIG_MOUSE_PC110PAD is not set
+@@ -617,11 +564,9 @@
+ # Character devices
+ #
+ CONFIG_VT=y
+-CONFIG_CONSOLE_TRANSLATIONS=y
+ CONFIG_VT_CONSOLE=y
+ CONFIG_HW_CONSOLE=y
+ # CONFIG_VT_HW_CONSOLE_BINDING is not set
+-CONFIG_DEVKMEM=y
+ # CONFIG_SERIAL_NONSTANDARD is not set
+
+ #
+@@ -653,79 +598,75 @@
+ CONFIG_SERIAL_CORE_CONSOLE=y
+ # CONFIG_SERIAL_JSM is not set
+ CONFIG_UNIX98_PTYS=y
+-# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+ CONFIG_LEGACY_PTYS=y
+ CONFIG_LEGACY_PTY_COUNT=256
+ CONFIG_PRINTER=y
+ # CONFIG_LP_CONSOLE is not set
+ # CONFIG_PPDEV is not set
++# CONFIG_TIPAR is not set
+ # CONFIG_IPMI_HANDLER is not set
++# CONFIG_WATCHDOG is not set
+ # CONFIG_HW_RANDOM is not set
++CONFIG_GEN_RTC=y
++# CONFIG_GEN_RTC_X is not set
+ # CONFIG_DTLK is not set
+ # CONFIG_R3964 is not set
+ # CONFIG_APPLICOM is not set
++# CONFIG_AGP is not set
++# CONFIG_DRM is not set
+ # CONFIG_RAW_DRIVER is not set
+ CONFIG_DEVPORT=y
+ # CONFIG_I2C is not set
++
++#
++# SPI support
++#
+ # CONFIG_SPI is not set
++# CONFIG_SPI_MASTER is not set
+ # CONFIG_W1 is not set
+ # CONFIG_POWER_SUPPLY is not set
+ # CONFIG_HWMON is not set
+-# CONFIG_THERMAL is not set
+-# CONFIG_THERMAL_HWMON is not set
+-# CONFIG_WATCHDOG is not set
+-CONFIG_SSB_POSSIBLE=y
+
+ #
+ # Sonics Silicon Backplane
+ #
++CONFIG_SSB_POSSIBLE=y
+ # CONFIG_SSB is not set
+
+ #
+ # Multifunction device drivers
+ #
+-# CONFIG_MFD_CORE is not set
+ # CONFIG_MFD_SM501 is not set
+-# CONFIG_HTC_PASIC3 is not set
+-# CONFIG_MFD_TMIO is not set
+-# CONFIG_REGULATOR is not set
+
+ #
+ # Multimedia devices
+ #
+-
+-#
+-# Multimedia core support
+-#
+ # CONFIG_VIDEO_DEV is not set
+ # CONFIG_DVB_CORE is not set
+-# CONFIG_VIDEO_MEDIA is not set
++# CONFIG_DAB is not set
+
+ #
+-# Multimedia drivers
++# Graphics support
+ #
+-# CONFIG_DAB is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+ #
+-# Graphics support
++# Display device support
+ #
+-# CONFIG_AGP is not set
+-# CONFIG_DRM is not set
++# CONFIG_DISPLAY_SUPPORT is not set
+ # CONFIG_VGASTATE is not set
+ CONFIG_VIDEO_OUTPUT_CONTROL=m
+ CONFIG_FB=y
+ # CONFIG_FIRMWARE_EDID is not set
+ # CONFIG_FB_DDC is not set
+-# CONFIG_FB_BOOT_VESA_SUPPORT is not set
+ CONFIG_FB_CFB_FILLRECT=y
+ CONFIG_FB_CFB_COPYAREA=y
+ CONFIG_FB_CFB_IMAGEBLIT=y
+-# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
+ # CONFIG_FB_SYS_FILLRECT is not set
+ # CONFIG_FB_SYS_COPYAREA is not set
+ # CONFIG_FB_SYS_IMAGEBLIT is not set
+-# CONFIG_FB_FOREIGN_ENDIAN is not set
+ # CONFIG_FB_SYS_FOPS is not set
++CONFIG_FB_DEFERRED_IO=y
+ # CONFIG_FB_SVGALIB is not set
+ # CONFIG_FB_MACMODES is not set
+ # CONFIG_FB_BACKLIGHT is not set
+@@ -750,7 +691,6 @@
+ # CONFIG_FB_ATY is not set
+ # CONFIG_FB_S3 is not set
+ # CONFIG_FB_SIS is not set
+-# CONFIG_FB_VIA is not set
+ # CONFIG_FB_NEOMAGIC is not set
+ # CONFIG_FB_KYRO is not set
+ # CONFIG_FB_3DFX is not set
+@@ -758,16 +698,7 @@
+ # CONFIG_FB_VT8623 is not set
+ # CONFIG_FB_TRIDENT is not set
+ # CONFIG_FB_ARK is not set
+-# CONFIG_FB_CARMINE is not set
+ # CONFIG_FB_VIRTUAL is not set
+-# CONFIG_FB_METRONOME is not set
+-# CONFIG_FB_MB862XX is not set
+-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+-
+-#
+-# Display device support
+-#
+-# CONFIG_DISPLAY_SUPPORT is not set
+
+ #
+ # Console display driver support
+@@ -787,8 +718,15 @@
+ CONFIG_LOGO_LINUX_VGA16=y
+ CONFIG_LOGO_LINUX_CLUT224=y
+ CONFIG_LOGO_PARISC_CLUT224=y
++
++#
++# Sound
++#
+ CONFIG_SOUND=y
+-CONFIG_SOUND_OSS_CORE=y
++
++#
++# Advanced Linux Sound Architecture
++#
+ CONFIG_SND=y
+ CONFIG_SND_TIMER=y
+ CONFIG_SND_PCM=y
+@@ -804,7 +742,10 @@
+ CONFIG_SND_VERBOSE_PROCFS=y
+ # CONFIG_SND_VERBOSE_PRINTK is not set
+ # CONFIG_SND_DEBUG is not set
+-CONFIG_SND_DRIVERS=y
++
++#
++# Generic devices
++#
+ # CONFIG_SND_DUMMY is not set
+ # CONFIG_SND_VIRMIDI is not set
+ # CONFIG_SND_MTPAV is not set
+@@ -812,7 +753,10 @@
+ # CONFIG_SND_SERIAL_U16550 is not set
+ # CONFIG_SND_MPU401 is not set
+ # CONFIG_SND_PORTMAN2X4 is not set
+-CONFIG_SND_PCI=y
++
++#
++# PCI devices
++#
+ # CONFIG_SND_AD1889 is not set
+ # CONFIG_SND_ALS300 is not set
+ # CONFIG_SND_ALI5451 is not set
+@@ -821,11 +765,9 @@
+ # CONFIG_SND_AU8810 is not set
+ # CONFIG_SND_AU8820 is not set
+ # CONFIG_SND_AU8830 is not set
+-# CONFIG_SND_AW2 is not set
+ # CONFIG_SND_BT87X is not set
+ # CONFIG_SND_CA0106 is not set
+ # CONFIG_SND_CMIPCI is not set
+-# CONFIG_SND_OXYGEN is not set
+ # CONFIG_SND_CS4281 is not set
+ # CONFIG_SND_CS46XX is not set
+ # CONFIG_SND_DARLA20 is not set
+@@ -850,7 +792,6 @@
+ # CONFIG_SND_HDA_INTEL is not set
+ # CONFIG_SND_HDSP is not set
+ # CONFIG_SND_HDSPM is not set
+-# CONFIG_SND_HIFIER is not set
+ # CONFIG_SND_ICE1712 is not set
+ # CONFIG_SND_ICE1724 is not set
+ # CONFIG_SND_INTEL8X0 is not set
+@@ -868,23 +809,30 @@
+ # CONFIG_SND_TRIDENT is not set
+ # CONFIG_SND_VIA82XX is not set
+ # CONFIG_SND_VIA82XX_MODEM is not set
+-# CONFIG_SND_VIRTUOSO is not set
+ # CONFIG_SND_VX222 is not set
+ # CONFIG_SND_YMFPCI is not set
+-CONFIG_SND_GSC=y
++
++#
++# GSC devices
++#
+ CONFIG_SND_HARMONY=y
++
++#
++# System on Chip audio support
++#
+ # CONFIG_SND_SOC is not set
++
++#
++# SoC Audio support for SuperH
++#
++
++#
++# Open Sound System
++#
+ # CONFIG_SOUND_PRIME is not set
+ CONFIG_HID_SUPPORT=y
+ CONFIG_HID=y
+ CONFIG_HID_DEBUG=y
+-# CONFIG_HIDRAW is not set
+-# CONFIG_HID_PID is not set
+-
+-#
+-# Special HID drivers
+-#
+-CONFIG_HID_COMPAT=y
+ CONFIG_USB_SUPPORT=y
+ CONFIG_USB_ARCH_HAS_HCD=y
+ CONFIG_USB_ARCH_HAS_OHCI=y
+@@ -892,63 +840,36 @@
+ # CONFIG_USB is not set
+
+ #
+-# Enable Host or Gadget support to see Inventra options
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+
+ #
+-# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
++# USB Gadget Support
+ #
+ # CONFIG_USB_GADGET is not set
+-
+-#
+-# OTG and related infrastructure
+-#
+ # CONFIG_MMC is not set
+-# CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS is not set
+-# CONFIG_ACCESSIBILITY is not set
+ # CONFIG_INFINIBAND is not set
+-CONFIG_RTC_LIB=y
+-CONFIG_RTC_CLASS=y
+-CONFIG_RTC_HCTOSYS=y
+-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+-# CONFIG_RTC_DEBUG is not set
++# CONFIG_RTC_CLASS is not set
+
+ #
+-# RTC interfaces
++# DMA Engine support
+ #
+-CONFIG_RTC_INTF_SYSFS=y
+-CONFIG_RTC_INTF_PROC=y
+-CONFIG_RTC_INTF_DEV=y
+-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+-# CONFIG_RTC_DRV_TEST is not set
++# CONFIG_DMA_ENGINE is not set
+
+ #
+-# SPI RTC drivers
++# DMA Clients
+ #
+
+ #
+-# Platform RTC drivers
++# DMA Devices
+ #
+-# CONFIG_RTC_DRV_DS1286 is not set
+-# CONFIG_RTC_DRV_DS1511 is not set
+-# CONFIG_RTC_DRV_DS1553 is not set
+-# CONFIG_RTC_DRV_DS1742 is not set
+-# CONFIG_RTC_DRV_STK17TA8 is not set
+-# CONFIG_RTC_DRV_M48T86 is not set
+-# CONFIG_RTC_DRV_M48T35 is not set
+-# CONFIG_RTC_DRV_M48T59 is not set
+-# CONFIG_RTC_DRV_BQ4802 is not set
+-# CONFIG_RTC_DRV_V3020 is not set
++# CONFIG_AUXDISPLAY is not set
+
+ #
+-# on-CPU RTC drivers
++# Userspace I/O
+ #
+-CONFIG_RTC_DRV_PARISC=y
+-# CONFIG_DMADEVICES is not set
+-# CONFIG_AUXDISPLAY is not set
+ # CONFIG_UIO is not set
+-# CONFIG_STAGING is not set
+
+ #
+ # File systems
+@@ -958,18 +879,19 @@
+ # CONFIG_EXT2_FS_XIP is not set
+ CONFIG_EXT3_FS=y
+ # CONFIG_EXT3_FS_XATTR is not set
+-# CONFIG_EXT4_FS is not set
+ CONFIG_JBD=y
++# CONFIG_JBD_DEBUG is not set
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
+ # CONFIG_FS_POSIX_ACL is not set
+-CONFIG_FILE_LOCKING=y
+ # CONFIG_XFS_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-CONFIG_DNOTIFY=y
++# CONFIG_MINIX_FS is not set
++# CONFIG_ROMFS_FS is not set
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+ # CONFIG_QUOTA is not set
++CONFIG_DNOTIFY=y
+ # CONFIG_AUTOFS_FS is not set
+ CONFIG_AUTOFS4_FS=y
+ # CONFIG_FUSE_FS is not set
+@@ -995,32 +917,35 @@
+ CONFIG_PROC_FS=y
+ CONFIG_PROC_KCORE=y
+ CONFIG_PROC_SYSCTL=y
+-CONFIG_PROC_PAGE_MONITOR=y
+ CONFIG_SYSFS=y
+ CONFIG_TMPFS=y
+ # CONFIG_TMPFS_POSIX_ACL is not set
+ # CONFIG_HUGETLB_PAGE is not set
+-# CONFIG_CONFIGFS_FS is not set
+-CONFIG_MISC_FILESYSTEMS=y
++CONFIG_RAMFS=y
++
++#
++# Miscellaneous filesystems
++#
+ # CONFIG_HFSPLUS_FS is not set
+ # CONFIG_CRAMFS is not set
+-# CONFIG_SQUASHFS is not set
+ # CONFIG_VXFS_FS is not set
+-# CONFIG_MINIX_FS is not set
+-# CONFIG_OMFS_FS is not set
+ # CONFIG_HPFS_FS is not set
+ # CONFIG_QNX4FS_FS is not set
+-# CONFIG_ROMFS_FS is not set
+ # CONFIG_SYSV_FS is not set
+ # CONFIG_UFS_FS is not set
+-CONFIG_NETWORK_FILESYSTEMS=y
++
++#
++# Network File Systems
++#
+ CONFIG_NFS_FS=y
+ CONFIG_NFS_V3=y
+ # CONFIG_NFS_V3_ACL is not set
+-CONFIG_ROOT_NFS=y
++# CONFIG_NFS_DIRECTIO is not set
+ CONFIG_NFSD=y
+ CONFIG_NFSD_V3=y
+ # CONFIG_NFSD_V3_ACL is not set
++CONFIG_NFSD_TCP=y
++CONFIG_ROOT_NFS=y
+ CONFIG_LOCKD=y
+ CONFIG_LOCKD_V4=y
+ CONFIG_EXPORTFS=y
+@@ -1037,6 +962,10 @@
+ #
+ # CONFIG_PARTITION_ADVANCED is not set
+ CONFIG_MSDOS_PARTITION=y
++
++#
++# Native Language Support
++#
+ CONFIG_NLS=y
+ CONFIG_NLS_DEFAULT="iso8859-1"
+ CONFIG_NLS_CODEPAGE_437=m
+@@ -1082,9 +1011,7 @@
+ # Kernel hacking
+ #
+ # CONFIG_PRINTK_TIME is not set
+-CONFIG_ENABLE_WARN_DEPRECATED=y
+ CONFIG_ENABLE_MUST_CHECK=y
+-CONFIG_FRAME_WARN=1024
+ CONFIG_MAGIC_SYSRQ=y
+ # CONFIG_UNUSED_SYMBOLS is not set
+ # CONFIG_DEBUG_FS is not set
+@@ -1092,12 +1019,9 @@
+ CONFIG_DEBUG_KERNEL=y
+ # CONFIG_DEBUG_SHIRQ is not set
+ CONFIG_DETECT_SOFTLOCKUP=y
+-# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+-CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
+ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS is not set
+-# CONFIG_DEBUG_OBJECTS is not set
+ # CONFIG_DEBUG_SLAB is not set
+ # CONFIG_DEBUG_RT_MUTEXES is not set
+ # CONFIG_RT_MUTEX_TESTER is not set
+@@ -1109,29 +1033,10 @@
+ CONFIG_DEBUG_BUGVERBOSE=y
+ # CONFIG_DEBUG_INFO is not set
+ # CONFIG_DEBUG_VM is not set
+-# CONFIG_DEBUG_WRITECOUNT is not set
+-CONFIG_DEBUG_MEMORY_INIT=y
+ # CONFIG_DEBUG_LIST is not set
+-# CONFIG_DEBUG_SG is not set
+-# CONFIG_DEBUG_NOTIFIERS is not set
+-# CONFIG_BOOT_PRINTK_DELAY is not set
++CONFIG_FORCED_INLINING=y
+ # CONFIG_RCU_TORTURE_TEST is not set
+-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+-# CONFIG_BACKTRACE_SELF_TEST is not set
+-# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+ # CONFIG_FAULT_INJECTION is not set
+-# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+-
+-#
+-# Tracers
+-#
+-# CONFIG_SCHED_TRACER is not set
+-# CONFIG_CONTEXT_SWITCH_TRACER is not set
+-# CONFIG_BOOT_TRACER is not set
+-# CONFIG_TRACE_BRANCH_PROFILING is not set
+-# CONFIG_BUILD_DOCSRC is not set
+-# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
+-# CONFIG_SAMPLES is not set
+ # CONFIG_DEBUG_RODATA is not set
+
+ #
+@@ -1139,108 +1044,52 @@
+ #
+ # CONFIG_KEYS is not set
+ CONFIG_SECURITY=y
+-# CONFIG_SECURITYFS is not set
+ # CONFIG_SECURITY_NETWORK is not set
+-# CONFIG_SECURITY_PATH is not set
+-# CONFIG_SECURITY_FILE_CAPABILITIES is not set
+-CONFIG_SECURITY_DEFAULT_MMAP_MIN_ADDR=0
++CONFIG_SECURITY_CAPABILITIES=y
+ CONFIG_CRYPTO=y
+-
+-#
+-# Crypto core or helper
+-#
+-# CONFIG_CRYPTO_FIPS is not set
+ CONFIG_CRYPTO_ALGAPI=y
+-CONFIG_CRYPTO_ALGAPI2=y
+-CONFIG_CRYPTO_AEAD2=y
+ CONFIG_CRYPTO_BLKCIPHER=y
+-CONFIG_CRYPTO_BLKCIPHER2=y
+-CONFIG_CRYPTO_HASH2=y
+-CONFIG_CRYPTO_RNG2=y
+ CONFIG_CRYPTO_MANAGER=y
+-CONFIG_CRYPTO_MANAGER2=y
+-# CONFIG_CRYPTO_NULL is not set
+-# CONFIG_CRYPTO_CRYPTD is not set
+-# CONFIG_CRYPTO_AUTHENC is not set
+-# CONFIG_CRYPTO_TEST is not set
+-
+-#
+-# Authenticated Encryption with Associated Data
+-#
+-# CONFIG_CRYPTO_CCM is not set
+-# CONFIG_CRYPTO_GCM is not set
+-# CONFIG_CRYPTO_SEQIV is not set
+-
+-#
+-# Block modes
+-#
+-CONFIG_CRYPTO_CBC=y
+-# CONFIG_CRYPTO_CTR is not set
+-# CONFIG_CRYPTO_CTS is not set
+-# CONFIG_CRYPTO_ECB is not set
+-# CONFIG_CRYPTO_PCBC is not set
+-
+-#
+-# Hash modes
+-#
+ # CONFIG_CRYPTO_HMAC is not set
+-
+-#
+-# Digest
+-#
+-# CONFIG_CRYPTO_CRC32C is not set
++# CONFIG_CRYPTO_NULL is not set
+ # CONFIG_CRYPTO_MD4 is not set
+ # CONFIG_CRYPTO_MD5 is not set
+-# CONFIG_CRYPTO_MICHAEL_MIC is not set
+-# CONFIG_CRYPTO_RMD128 is not set
+-# CONFIG_CRYPTO_RMD160 is not set
+-# CONFIG_CRYPTO_RMD256 is not set
+-# CONFIG_CRYPTO_RMD320 is not set
+ # CONFIG_CRYPTO_SHA1 is not set
+ # CONFIG_CRYPTO_SHA256 is not set
+ # CONFIG_CRYPTO_SHA512 is not set
+-# CONFIG_CRYPTO_TGR192 is not set
+ # CONFIG_CRYPTO_WP512 is not set
+-
+-#
+-# Ciphers
+-#
+-# CONFIG_CRYPTO_AES is not set
+-# CONFIG_CRYPTO_ANUBIS is not set
+-# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_ECB is not set
++CONFIG_CRYPTO_CBC=y
++# CONFIG_CRYPTO_PCBC is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++# CONFIG_CRYPTO_DES is not set
++# CONFIG_CRYPTO_FCRYPT is not set
+ # CONFIG_CRYPTO_BLOWFISH is not set
+-# CONFIG_CRYPTO_CAMELLIA is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_AES is not set
+ # CONFIG_CRYPTO_CAST5 is not set
+ # CONFIG_CRYPTO_CAST6 is not set
+-# CONFIG_CRYPTO_DES is not set
+-# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_ARC4 is not set
+ # CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_ANUBIS is not set
+ # CONFIG_CRYPTO_SEED is not set
+-# CONFIG_CRYPTO_SERPENT is not set
+-# CONFIG_CRYPTO_TEA is not set
+-# CONFIG_CRYPTO_TWOFISH is not set
+-
+-#
+-# Compression
+-#
+ # CONFIG_CRYPTO_DEFLATE is not set
+-# CONFIG_CRYPTO_LZO is not set
+-
+-#
+-# Random Number Generation
+-#
+-# CONFIG_CRYPTO_ANSI_CPRNG is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_CRC32C is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
++# CONFIG_CRYPTO_TEST is not set
++# CONFIG_CRYPTO_AUTHENC is not set
+ CONFIG_CRYPTO_HW=y
+-# CONFIG_CRYPTO_DEV_HIFN_795X is not set
+
+ #
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
+-CONFIG_GENERIC_FIND_LAST_BIT=y
+ # CONFIG_CRC_CCITT is not set
+ # CONFIG_CRC16 is not set
+-# CONFIG_CRC_T10DIF is not set
+ # CONFIG_CRC_ITU_T is not set
+ CONFIG_CRC32=y
+ # CONFIG_CRC7 is not set
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/parisc/configs/c3000_defconfig linux-2.6.29-rc3.owrt/arch/parisc/configs/c3000_defconfig
+--- linux-2.6.29.owrt/arch/parisc/configs/c3000_defconfig 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/parisc/configs/c3000_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-rc8
+-# Fri Mar 13 01:32:58 2009
++# Linux kernel version: 2.6.23
++# Fri Oct 12 21:24:00 2007
+ #
+ CONFIG_PARISC=y
+ CONFIG_MMU=y
+@@ -33,29 +33,16 @@
+ # CONFIG_POSIX_MQUEUE is not set
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
++# CONFIG_USER_NS is not set
+ # CONFIG_AUDIT is not set
+-
+-#
+-# RCU Subsystem
+-#
+-CONFIG_CLASSIC_RCU=y
+-# CONFIG_TREE_RCU is not set
+-# CONFIG_PREEMPT_RCU is not set
+-# CONFIG_TREE_RCU_TRACE is not set
+-# CONFIG_PREEMPT_RCU_TRACE is not set
+ CONFIG_IKCONFIG=y
+ CONFIG_IKCONFIG_PROC=y
+ CONFIG_LOG_BUF_SHIFT=16
+-# CONFIG_GROUP_SCHED is not set
+-# CONFIG_CGROUPS is not set
+ CONFIG_SYSFS_DEPRECATED=y
+-CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
+-# CONFIG_NAMESPACES is not set
+ # CONFIG_BLK_DEV_INITRD is not set
+ # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+ CONFIG_SYSCTL=y
+-CONFIG_ANON_INODES=y
+ CONFIG_EMBEDDED=y
+ CONFIG_SYSCTL_SYSCALL=y
+ CONFIG_KALLSYMS=y
+@@ -67,39 +54,29 @@
+ CONFIG_ELF_CORE=y
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
++CONFIG_ANON_INODES=y
+ CONFIG_EPOLL=y
+ CONFIG_SIGNALFD=y
+-CONFIG_TIMERFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_SHMEM=y
+-CONFIG_AIO=y
+ CONFIG_VM_EVENT_COUNTERS=y
+-CONFIG_PCI_QUIRKS=y
+-CONFIG_COMPAT_BRK=y
+ CONFIG_SLAB=y
+ # CONFIG_SLUB is not set
+ # CONFIG_SLOB is not set
+-CONFIG_PROFILING=y
+-CONFIG_TRACEPOINTS=y
+-# CONFIG_MARKERS is not set
+-CONFIG_OPROFILE=m
+-CONFIG_HAVE_OPROFILE=y
+-# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
+-CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+ CONFIG_MODULES=y
+-# CONFIG_MODULE_FORCE_LOAD is not set
+ CONFIG_MODULE_UNLOAD=y
+ CONFIG_MODULE_FORCE_UNLOAD=y
+ # CONFIG_MODVERSIONS is not set
+ # CONFIG_MODULE_SRCVERSION_ALL is not set
+-CONFIG_INIT_ALL_POSSIBLE=y
++CONFIG_KMOD=y
+ CONFIG_BLOCK=y
+ # CONFIG_LBD is not set
+ # CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
+ # CONFIG_BLK_DEV_BSG is not set
+-# CONFIG_BLK_DEV_INTEGRITY is not set
+
+ #
+ # IO Schedulers
+@@ -113,7 +90,6 @@
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
+-# CONFIG_FREEZER is not set
+
+ #
+ # Processor type and features
+@@ -139,19 +115,17 @@
+ # CONFIG_HZ_300 is not set
+ # CONFIG_HZ_1000 is not set
+ CONFIG_HZ=250
+-# CONFIG_SCHED_HRTICK is not set
+ CONFIG_SELECT_MEMORY_MODEL=y
+ CONFIG_FLATMEM_MANUAL=y
+ # CONFIG_DISCONTIGMEM_MANUAL is not set
+ # CONFIG_SPARSEMEM_MANUAL is not set
+ CONFIG_FLATMEM=y
+ CONFIG_FLAT_NODE_MEM_MAP=y
+-CONFIG_PAGEFLAGS_EXTENDED=y
++# CONFIG_SPARSEMEM_STATIC is not set
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+-# CONFIG_PHYS_ADDR_T_64BIT is not set
++# CONFIG_RESOURCES_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=0
+ CONFIG_VIRT_TO_BUS=y
+-CONFIG_UNEVICTABLE_LRU=y
+ # CONFIG_HPUX is not set
+
+ #
+@@ -160,13 +134,14 @@
+ # CONFIG_GSC is not set
+ CONFIG_PCI=y
+ # CONFIG_ARCH_SUPPORTS_MSI is not set
+-CONFIG_PCI_LEGACY=y
+ # CONFIG_PCI_DEBUG is not set
+-# CONFIG_PCI_STUB is not set
+ CONFIG_PCI_LBA=y
+ CONFIG_IOSAPIC=y
+ CONFIG_IOMMU_SBA=y
+-CONFIG_IOMMU_HELPER=y
++
++#
++# PCCARD (PCMCIA/CardBus) support
++#
+ # CONFIG_PCCARD is not set
+ # CONFIG_HOTPLUG_PCI is not set
+
+@@ -183,15 +158,16 @@
+ # Executable file formats
+ #
+ CONFIG_BINFMT_ELF=y
+-# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+-# CONFIG_HAVE_AOUT is not set
+ # CONFIG_BINFMT_MISC is not set
++
++#
++# Networking
++#
+ CONFIG_NET=y
+
+ #
+ # Networking options
+ #
+-CONFIG_COMPAT_NET_DEV_OPS=y
+ CONFIG_PACKET=y
+ CONFIG_PACKET_MMAP=y
+ CONFIG_UNIX=y
+@@ -199,8 +175,6 @@
+ CONFIG_XFRM_USER=m
+ # CONFIG_XFRM_SUB_POLICY is not set
+ # CONFIG_XFRM_MIGRATE is not set
+-# CONFIG_XFRM_STATISTICS is not set
+-CONFIG_XFRM_IPCOMP=m
+ CONFIG_NET_KEY=m
+ # CONFIG_NET_KEY_MIGRATE is not set
+ CONFIG_INET=y
+@@ -230,6 +204,7 @@
+ CONFIG_TCP_CONG_CUBIC=y
+ CONFIG_DEFAULT_TCP_CONG="cubic"
+ # CONFIG_TCP_MD5SIG is not set
++# CONFIG_IP_VS is not set
+ CONFIG_IPV6=m
+ # CONFIG_IPV6_PRIVACY is not set
+ # CONFIG_IPV6_ROUTER_PREF is not set
+@@ -245,34 +220,29 @@
+ CONFIG_INET6_XFRM_MODE_BEET=m
+ # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+ CONFIG_IPV6_SIT=m
+-CONFIG_IPV6_NDISC_NODETYPE=y
+ CONFIG_IPV6_TUNNEL=m
+ # CONFIG_IPV6_MULTIPLE_TABLES is not set
+-# CONFIG_IPV6_MROUTE is not set
+ # CONFIG_NETWORK_SECMARK is not set
+ CONFIG_NETFILTER=y
+ CONFIG_NETFILTER_DEBUG=y
+-CONFIG_NETFILTER_ADVANCED=y
+
+ #
+ # Core Netfilter Configuration
+ #
+-# CONFIG_NETFILTER_NETLINK_QUEUE is not set
+-# CONFIG_NETFILTER_NETLINK_LOG is not set
++# CONFIG_NETFILTER_NETLINK is not set
++# CONFIG_NF_CONNTRACK_ENABLED is not set
+ # CONFIG_NF_CONNTRACK is not set
+ # CONFIG_NETFILTER_XTABLES is not set
+-# CONFIG_IP_VS is not set
+
+ #
+ # IP: Netfilter Configuration
+ #
+-# CONFIG_NF_DEFRAG_IPV4 is not set
+ CONFIG_IP_NF_QUEUE=m
+ # CONFIG_IP_NF_IPTABLES is not set
+ # CONFIG_IP_NF_ARPTABLES is not set
+
+ #
+-# IPv6: Netfilter Configuration
++# IPv6: Netfilter Configuration (EXPERIMENTAL)
+ #
+ # CONFIG_IP6_NF_QUEUE is not set
+ # CONFIG_IP6_NF_IPTABLES is not set
+@@ -281,7 +251,6 @@
+ # CONFIG_TIPC is not set
+ # CONFIG_ATM is not set
+ # CONFIG_BRIDGE is not set
+-# CONFIG_NET_DSA is not set
+ # CONFIG_VLAN_8021Q is not set
+ # CONFIG_DECNET is not set
+ # CONFIG_LLC2 is not set
+@@ -291,26 +260,28 @@
+ # CONFIG_LAPB is not set
+ # CONFIG_ECONET is not set
+ # CONFIG_WAN_ROUTER is not set
++
++#
++# QoS and/or fair queueing
++#
+ # CONFIG_NET_SCHED is not set
+-# CONFIG_DCB is not set
+
+ #
+ # Network testing
+ #
+ CONFIG_NET_PKTGEN=m
+ # CONFIG_HAMRADIO is not set
+-# CONFIG_CAN is not set
+ # CONFIG_IRDA is not set
+ # CONFIG_BT is not set
+ # CONFIG_AF_RXRPC is not set
+-# CONFIG_PHONET is not set
+-CONFIG_WIRELESS=y
++
++#
++# Wireless
++#
+ # CONFIG_CFG80211 is not set
+-CONFIG_WIRELESS_OLD_REGULATORY=y
+ # CONFIG_WIRELESS_EXT is not set
+-# CONFIG_LIB80211 is not set
+ # CONFIG_MAC80211 is not set
+-# CONFIG_WIMAX is not set
++# CONFIG_IEEE80211 is not set
+ # CONFIG_RFKILL is not set
+ # CONFIG_NET_9P is not set
+
+@@ -325,8 +296,6 @@
+ # CONFIG_STANDALONE is not set
+ # CONFIG_PREVENT_FIRMWARE_BUILD is not set
+ CONFIG_FW_LOADER=y
+-CONFIG_FIRMWARE_IN_KERNEL=y
+-CONFIG_EXTRA_FIRMWARE=""
+ # CONFIG_DEBUG_DRIVER is not set
+ # CONFIG_DEBUG_DEVRES is not set
+ # CONFIG_SYS_HYPERVISOR is not set
+@@ -347,62 +316,59 @@
+ # CONFIG_BLK_DEV_RAM is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+ # CONFIG_ATA_OVER_ETH is not set
+-# CONFIG_BLK_DEV_HD is not set
+ CONFIG_MISC_DEVICES=y
+ # CONFIG_PHANTOM is not set
++# CONFIG_EEPROM_93CX6 is not set
+ # CONFIG_SGI_IOC4 is not set
+ # CONFIG_TIFM_CORE is not set
+-# CONFIG_ENCLOSURE_SERVICES is not set
+-# CONFIG_HP_ILO is not set
+-# CONFIG_C2PORT is not set
+-
+-#
+-# EEPROM support
+-#
+-# CONFIG_EEPROM_93CX6 is not set
+-CONFIG_HAVE_IDE=y
+ CONFIG_IDE=y
++CONFIG_IDE_MAX_HWIFS=4
++CONFIG_BLK_DEV_IDE=y
+
+ #
+-# Please see Documentation/ide/ide.txt for help/info on IDE drives
++# Please see Documentation/ide.txt for help/info on IDE drives
+ #
+-CONFIG_IDE_ATAPI=y
+ # CONFIG_BLK_DEV_IDE_SATA is not set
+-CONFIG_IDE_GD=y
+-CONFIG_IDE_GD_ATA=y
+-# CONFIG_IDE_GD_ATAPI is not set
++CONFIG_BLK_DEV_IDEDISK=m
++# CONFIG_IDEDISK_MULTI_MODE is not set
+ CONFIG_BLK_DEV_IDECD=y
+-CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
+ # CONFIG_BLK_DEV_IDETAPE is not set
++# CONFIG_BLK_DEV_IDEFLOPPY is not set
++CONFIG_BLK_DEV_IDESCSI=y
+ # CONFIG_IDE_TASK_IOCTL is not set
+ CONFIG_IDE_PROC_FS=y
+
+ #
+ # IDE chipset support/bugfixes
+ #
++CONFIG_IDE_GENERIC=y
+ # CONFIG_BLK_DEV_PLATFORM is not set
+-CONFIG_BLK_DEV_IDEDMA_SFF=y
+
+ #
+ # PCI IDE chipsets support
+ #
+ CONFIG_BLK_DEV_IDEPCI=y
++CONFIG_IDEPCI_SHARE_IRQ=y
+ CONFIG_IDEPCI_PCIBUS_ORDER=y
++# CONFIG_BLK_DEV_OFFBOARD is not set
+ # CONFIG_BLK_DEV_GENERIC is not set
+ # CONFIG_BLK_DEV_OPTI621 is not set
+ CONFIG_BLK_DEV_IDEDMA_PCI=y
++# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
++CONFIG_IDEDMA_ONLYDISK=y
+ # CONFIG_BLK_DEV_AEC62XX is not set
+ # CONFIG_BLK_DEV_ALI15X3 is not set
+ # CONFIG_BLK_DEV_AMD74XX is not set
+ # CONFIG_BLK_DEV_CMD64X is not set
+ # CONFIG_BLK_DEV_TRIFLEX is not set
++# CONFIG_BLK_DEV_CY82C693 is not set
+ # CONFIG_BLK_DEV_CS5520 is not set
+ # CONFIG_BLK_DEV_CS5530 is not set
++# CONFIG_BLK_DEV_HPT34X is not set
+ # CONFIG_BLK_DEV_HPT366 is not set
+ # CONFIG_BLK_DEV_JMICRON is not set
+ # CONFIG_BLK_DEV_SC1200 is not set
+ # CONFIG_BLK_DEV_PIIX is not set
+-# CONFIG_BLK_DEV_IT8172 is not set
+ # CONFIG_BLK_DEV_IT8213 is not set
+ # CONFIG_BLK_DEV_IT821X is not set
+ CONFIG_BLK_DEV_NS87415=y
+@@ -414,7 +380,10 @@
+ # CONFIG_BLK_DEV_TRM290 is not set
+ # CONFIG_BLK_DEV_VIA82CXXX is not set
+ # CONFIG_BLK_DEV_TC86C001 is not set
++# CONFIG_IDE_ARM is not set
+ CONFIG_BLK_DEV_IDEDMA=y
++# CONFIG_IDEDMA_IVB is not set
++# CONFIG_BLK_DEV_HD is not set
+
+ #
+ # SCSI device support
+@@ -453,10 +422,8 @@
+ # CONFIG_SCSI_FC_ATTRS is not set
+ CONFIG_SCSI_ISCSI_ATTRS=m
+ # CONFIG_SCSI_SAS_LIBSAS is not set
+-# CONFIG_SCSI_SRP_ATTRS is not set
+ CONFIG_SCSI_LOWLEVEL=y
+ # CONFIG_ISCSI_TCP is not set
+-# CONFIG_SCSI_CXGB3_ISCSI is not set
+ # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+ # CONFIG_SCSI_3W_9XXX is not set
+ # CONFIG_SCSI_ACARD is not set
+@@ -466,20 +433,16 @@
+ # CONFIG_SCSI_AIC79XX is not set
+ # CONFIG_SCSI_AIC94XX is not set
+ # CONFIG_SCSI_DPT_I2O is not set
+-# CONFIG_SCSI_ADVANSYS is not set
+ # CONFIG_SCSI_ARCMSR is not set
+ # CONFIG_MEGARAID_NEWGEN is not set
+ # CONFIG_MEGARAID_LEGACY is not set
+ # CONFIG_MEGARAID_SAS is not set
+ # CONFIG_SCSI_HPTIOP is not set
+-# CONFIG_LIBFC is not set
+-# CONFIG_FCOE is not set
+ # CONFIG_SCSI_DMX3191D is not set
+ # CONFIG_SCSI_FUTURE_DOMAIN is not set
+ # CONFIG_SCSI_IPS is not set
+ # CONFIG_SCSI_INITIO is not set
+ # CONFIG_SCSI_INIA100 is not set
+-# CONFIG_SCSI_MVSAS is not set
+ # CONFIG_SCSI_STEX is not set
+ CONFIG_SCSI_SYM53C8XX_2=y
+ CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
+@@ -495,11 +458,9 @@
+ # CONFIG_SCSI_NSP32 is not set
+ CONFIG_SCSI_DEBUG=m
+ # CONFIG_SCSI_SRP is not set
+-# CONFIG_SCSI_DH is not set
+ # CONFIG_ATA is not set
+ CONFIG_MD=y
+ CONFIG_BLK_DEV_MD=y
+-CONFIG_MD_AUTODETECT=y
+ CONFIG_MD_LINEAR=y
+ CONFIG_MD_RAID0=y
+ CONFIG_MD_RAID1=y
+@@ -514,8 +475,13 @@
+ CONFIG_DM_MIRROR=m
+ CONFIG_DM_ZERO=m
+ CONFIG_DM_MULTIPATH=m
++# CONFIG_DM_MULTIPATH_EMC is not set
++# CONFIG_DM_MULTIPATH_RDAC is not set
+ # CONFIG_DM_DELAY is not set
+-# CONFIG_DM_UEVENT is not set
++
++#
++# Fusion MPT device support
++#
+ CONFIG_FUSION=y
+ CONFIG_FUSION_SPI=m
+ # CONFIG_FUSION_FC is not set
+@@ -527,40 +493,20 @@
+ #
+ # IEEE 1394 (FireWire) support
+ #
+-
+-#
+-# Enable only one of the two stacks, unless you know what you are doing
+-#
+ # CONFIG_FIREWIRE is not set
+ # CONFIG_IEEE1394 is not set
+ # CONFIG_I2O is not set
+ CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
+ CONFIG_DUMMY=m
+ CONFIG_BONDING=m
+ # CONFIG_MACVLAN is not set
+ # CONFIG_EQUALIZER is not set
+ CONFIG_TUN=m
+ # CONFIG_VETH is not set
++# CONFIG_IP1000 is not set
+ # CONFIG_ARCNET is not set
+-CONFIG_PHYLIB=m
+-
+-#
+-# MII PHY device drivers
+-#
+-# CONFIG_MARVELL_PHY is not set
+-# CONFIG_DAVICOM_PHY is not set
+-# CONFIG_QSEMI_PHY is not set
+-# CONFIG_LXT_PHY is not set
+-# CONFIG_CICADA_PHY is not set
+-# CONFIG_VITESSE_PHY is not set
+-# CONFIG_SMSC_PHY is not set
+-# CONFIG_BROADCOM_PHY is not set
+-# CONFIG_ICPLUS_PHY is not set
+-# CONFIG_REALTEK_PHY is not set
+-# CONFIG_NATIONAL_PHY is not set
+-# CONFIG_STE10XP is not set
+-# CONFIG_LSI_ET1011C_PHY is not set
+-# CONFIG_MDIO_BITBANG is not set
++# CONFIG_PHYLIB is not set
+ CONFIG_NET_ETHERNET=y
+ CONFIG_MII=m
+ # CONFIG_HAPPYMEAL is not set
+@@ -582,38 +528,33 @@
+ # CONFIG_IBM_NEW_EMAC_RGMII is not set
+ # CONFIG_IBM_NEW_EMAC_TAH is not set
+ # CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+-# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
+-# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
+-# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
+ CONFIG_NET_PCI=y
+ # CONFIG_PCNET32 is not set
+ # CONFIG_AMD8111_ETH is not set
+ # CONFIG_ADAPTEC_STARFIRE is not set
+ # CONFIG_B44 is not set
+ # CONFIG_FORCEDETH is not set
++# CONFIG_EEPRO100 is not set
+ CONFIG_E100=m
+ # CONFIG_FEALNX is not set
+ # CONFIG_NATSEMI is not set
+ # CONFIG_NE2K_PCI is not set
+ # CONFIG_8139CP is not set
+ # CONFIG_8139TOO is not set
+-# CONFIG_R6040 is not set
+ # CONFIG_SIS900 is not set
+ # CONFIG_EPIC100 is not set
+-# CONFIG_SMSC9420 is not set
+ # CONFIG_SUNDANCE is not set
+ # CONFIG_TLAN is not set
+ # CONFIG_VIA_RHINE is not set
+ # CONFIG_SC92031 is not set
+-# CONFIG_ATL2 is not set
+ CONFIG_NETDEV_1000=y
+ CONFIG_ACENIC=m
+ # CONFIG_ACENIC_OMIT_TIGON_I is not set
+ # CONFIG_DL2K is not set
+ CONFIG_E1000=m
++# CONFIG_E1000_NAPI is not set
++# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
+ # CONFIG_E1000E is not set
+-# CONFIG_IP1000 is not set
+-# CONFIG_IGB is not set
+ # CONFIG_NS83820 is not set
+ # CONFIG_HAMACHI is not set
+ # CONFIG_YELLOWFIN is not set
+@@ -621,31 +562,23 @@
+ # CONFIG_SIS190 is not set
+ # CONFIG_SKGE is not set
+ # CONFIG_SKY2 is not set
++# CONFIG_SK98LIN is not set
+ # CONFIG_VIA_VELOCITY is not set
+ CONFIG_TIGON3=m
+ # CONFIG_BNX2 is not set
+ # CONFIG_QLA3XXX is not set
+ # CONFIG_ATL1 is not set
+-# CONFIG_ATL1E is not set
+-# CONFIG_ATL1C is not set
+-# CONFIG_JME is not set
+ CONFIG_NETDEV_10000=y
+ # CONFIG_CHELSIO_T1 is not set
+-CONFIG_CHELSIO_T3_DEPENDS=y
+ # CONFIG_CHELSIO_T3 is not set
+-# CONFIG_ENIC is not set
+ # CONFIG_IXGBE is not set
+ # CONFIG_IXGB is not set
+ # CONFIG_S2IO is not set
+ # CONFIG_MYRI10GE is not set
+ # CONFIG_NETXEN_NIC is not set
+ # CONFIG_NIU is not set
+-# CONFIG_MLX4_EN is not set
+ # CONFIG_MLX4_CORE is not set
+ # CONFIG_TEHUTI is not set
+-# CONFIG_BNX2X is not set
+-# CONFIG_QLGE is not set
+-# CONFIG_SFC is not set
+ # CONFIG_TR is not set
+
+ #
+@@ -653,11 +586,6 @@
+ #
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
+-# CONFIG_IWLWIFI_LEDS is not set
+-
+-#
+-# Enable WiMAX (Networking options) to see the WiMAX drivers
+-#
+
+ #
+ # USB Network Adapters
+@@ -666,6 +594,7 @@
+ # CONFIG_USB_KAWETH is not set
+ # CONFIG_USB_PEGASUS is not set
+ # CONFIG_USB_RTL8150 is not set
++# CONFIG_USB_USBNET_MII is not set
+ # CONFIG_USB_USBNET is not set
+ # CONFIG_WAN is not set
+ # CONFIG_FDDI is not set
+@@ -683,6 +612,7 @@
+ # CONFIG_SLIP is not set
+ CONFIG_SLHC=m
+ # CONFIG_NET_FC is not set
++# CONFIG_SHAPER is not set
+ # CONFIG_NETCONSOLE is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+@@ -704,6 +634,7 @@
+ CONFIG_INPUT_MOUSEDEV_SCREEN_X=1600
+ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=1200
+ # CONFIG_INPUT_JOYDEV is not set
++# CONFIG_INPUT_TSDEV is not set
+ # CONFIG_INPUT_EVDEV is not set
+ # CONFIG_INPUT_EVBUG is not set
+
+@@ -721,7 +652,6 @@
+ # CONFIG_MOUSE_PS2 is not set
+ # CONFIG_MOUSE_SERIAL is not set
+ # CONFIG_MOUSE_APPLETOUCH is not set
+-# CONFIG_MOUSE_BCM5974 is not set
+ # CONFIG_MOUSE_VSXXXAA is not set
+ # CONFIG_INPUT_JOYSTICK is not set
+ # CONFIG_INPUT_TABLET is not set
+@@ -742,13 +672,10 @@
+ # Character devices
+ #
+ CONFIG_VT=y
+-CONFIG_CONSOLE_TRANSLATIONS=y
+ CONFIG_VT_CONSOLE=y
+ CONFIG_HW_CONSOLE=y
+ # CONFIG_VT_HW_CONSOLE_BINDING is not set
+-CONFIG_DEVKMEM=y
+ # CONFIG_SERIAL_NONSTANDARD is not set
+-# CONFIG_NOZOMI is not set
+
+ #
+ # Serial drivers
+@@ -772,77 +699,72 @@
+ CONFIG_SERIAL_CORE_CONSOLE=y
+ # CONFIG_SERIAL_JSM is not set
+ CONFIG_UNIX98_PTYS=y
+-# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+ CONFIG_LEGACY_PTYS=y
+ CONFIG_LEGACY_PTY_COUNT=256
+ # CONFIG_IPMI_HANDLER is not set
++# CONFIG_WATCHDOG is not set
+ # CONFIG_HW_RANDOM is not set
++CONFIG_GEN_RTC=y
++CONFIG_GEN_RTC_X=y
+ # CONFIG_R3964 is not set
+ # CONFIG_APPLICOM is not set
++# CONFIG_AGP is not set
++# CONFIG_DRM is not set
+ CONFIG_RAW_DRIVER=y
+ CONFIG_MAX_RAW_DEVS=256
+ # CONFIG_TCG_TPM is not set
+ CONFIG_DEVPORT=y
+ # CONFIG_I2C is not set
++
++#
++# SPI support
++#
+ # CONFIG_SPI is not set
++# CONFIG_SPI_MASTER is not set
+ # CONFIG_W1 is not set
+ # CONFIG_POWER_SUPPLY is not set
+ # CONFIG_HWMON is not set
+-# CONFIG_THERMAL is not set
+-# CONFIG_THERMAL_HWMON is not set
+-# CONFIG_WATCHDOG is not set
+-CONFIG_SSB_POSSIBLE=y
+
+ #
+ # Sonics Silicon Backplane
+ #
++CONFIG_SSB_POSSIBLE=y
+ # CONFIG_SSB is not set
+
+ #
+ # Multifunction device drivers
+ #
+-# CONFIG_MFD_CORE is not set
+ # CONFIG_MFD_SM501 is not set
+-# CONFIG_HTC_PASIC3 is not set
+-# CONFIG_MFD_TMIO is not set
+-# CONFIG_REGULATOR is not set
+
+ #
+ # Multimedia devices
+ #
+-
+-#
+-# Multimedia core support
+-#
+ # CONFIG_VIDEO_DEV is not set
+ # CONFIG_DVB_CORE is not set
+-# CONFIG_VIDEO_MEDIA is not set
++# CONFIG_DAB is not set
+
+ #
+-# Multimedia drivers
++# Graphics support
+ #
+-# CONFIG_DAB is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+ #
+-# Graphics support
++# Display device support
+ #
+-# CONFIG_AGP is not set
+-# CONFIG_DRM is not set
++# CONFIG_DISPLAY_SUPPORT is not set
+ # CONFIG_VGASTATE is not set
+ CONFIG_VIDEO_OUTPUT_CONTROL=m
+ CONFIG_FB=y
+ # CONFIG_FIRMWARE_EDID is not set
+ # CONFIG_FB_DDC is not set
+-# CONFIG_FB_BOOT_VESA_SUPPORT is not set
+ CONFIG_FB_CFB_FILLRECT=y
+ CONFIG_FB_CFB_COPYAREA=y
+ CONFIG_FB_CFB_IMAGEBLIT=y
+-# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
+ # CONFIG_FB_SYS_FILLRECT is not set
+ # CONFIG_FB_SYS_COPYAREA is not set
+ # CONFIG_FB_SYS_IMAGEBLIT is not set
+-# CONFIG_FB_FOREIGN_ENDIAN is not set
+ # CONFIG_FB_SYS_FOPS is not set
++CONFIG_FB_DEFERRED_IO=y
+ # CONFIG_FB_SVGALIB is not set
+ # CONFIG_FB_MACMODES is not set
+ # CONFIG_FB_BACKLIGHT is not set
+@@ -868,7 +790,6 @@
+ # CONFIG_FB_S3 is not set
+ # CONFIG_FB_SAVAGE is not set
+ # CONFIG_FB_SIS is not set
+-# CONFIG_FB_VIA is not set
+ # CONFIG_FB_NEOMAGIC is not set
+ # CONFIG_FB_KYRO is not set
+ # CONFIG_FB_3DFX is not set
+@@ -877,16 +798,7 @@
+ # CONFIG_FB_TRIDENT is not set
+ # CONFIG_FB_ARK is not set
+ # CONFIG_FB_PM3 is not set
+-# CONFIG_FB_CARMINE is not set
+ # CONFIG_FB_VIRTUAL is not set
+-# CONFIG_FB_METRONOME is not set
+-# CONFIG_FB_MB862XX is not set
+-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+-
+-#
+-# Display device support
+-#
+-# CONFIG_DISPLAY_SUPPORT is not set
+
+ #
+ # Console display driver support
+@@ -906,8 +818,15 @@
+ # CONFIG_LOGO_LINUX_VGA16 is not set
+ # CONFIG_LOGO_LINUX_CLUT224 is not set
+ CONFIG_LOGO_PARISC_CLUT224=y
++
++#
++# Sound
++#
+ CONFIG_SOUND=y
+-CONFIG_SOUND_OSS_CORE=y
++
++#
++# Advanced Linux Sound Architecture
++#
+ CONFIG_SND=y
+ CONFIG_SND_TIMER=y
+ CONFIG_SND_PCM=y
+@@ -923,16 +842,20 @@
+ CONFIG_SND_VERBOSE_PROCFS=y
+ # CONFIG_SND_VERBOSE_PRINTK is not set
+ # CONFIG_SND_DEBUG is not set
+-CONFIG_SND_VMASTER=y
++
++#
++# Generic devices
++#
+ CONFIG_SND_AC97_CODEC=y
+-CONFIG_SND_DRIVERS=y
+ # CONFIG_SND_DUMMY is not set
+ # CONFIG_SND_VIRMIDI is not set
+ # CONFIG_SND_MTPAV is not set
+ # CONFIG_SND_SERIAL_U16550 is not set
+ # CONFIG_SND_MPU401 is not set
+-# CONFIG_SND_AC97_POWER_SAVE is not set
+-CONFIG_SND_PCI=y
++
++#
++# PCI devices
++#
+ CONFIG_SND_AD1889=y
+ # CONFIG_SND_ALS300 is not set
+ # CONFIG_SND_ALI5451 is not set
+@@ -941,12 +864,10 @@
+ # CONFIG_SND_AU8810 is not set
+ # CONFIG_SND_AU8820 is not set
+ # CONFIG_SND_AU8830 is not set
+-# CONFIG_SND_AW2 is not set
+ # CONFIG_SND_AZT3328 is not set
+ # CONFIG_SND_BT87X is not set
+ # CONFIG_SND_CA0106 is not set
+ # CONFIG_SND_CMIPCI is not set
+-# CONFIG_SND_OXYGEN is not set
+ # CONFIG_SND_CS4281 is not set
+ # CONFIG_SND_CS46XX is not set
+ # CONFIG_SND_DARLA20 is not set
+@@ -971,7 +892,6 @@
+ # CONFIG_SND_HDA_INTEL is not set
+ # CONFIG_SND_HDSP is not set
+ # CONFIG_SND_HDSPM is not set
+-# CONFIG_SND_HIFIER is not set
+ # CONFIG_SND_ICE1712 is not set
+ # CONFIG_SND_ICE1724 is not set
+ # CONFIG_SND_INTEL8X0 is not set
+@@ -989,59 +909,47 @@
+ # CONFIG_SND_TRIDENT is not set
+ # CONFIG_SND_VIA82XX is not set
+ # CONFIG_SND_VIA82XX_MODEM is not set
+-# CONFIG_SND_VIRTUOSO is not set
+ # CONFIG_SND_VX222 is not set
+ # CONFIG_SND_YMFPCI is not set
+-CONFIG_SND_USB=y
++# CONFIG_SND_AC97_POWER_SAVE is not set
++
++#
++# USB devices
++#
+ # CONFIG_SND_USB_AUDIO is not set
+ # CONFIG_SND_USB_CAIAQ is not set
++
++#
++# System on Chip audio support
++#
+ # CONFIG_SND_SOC is not set
++
++#
++# SoC Audio support for SuperH
++#
++
++#
++# Open Sound System
++#
+ # CONFIG_SOUND_PRIME is not set
+ CONFIG_AC97_BUS=y
+ CONFIG_HID_SUPPORT=y
+ CONFIG_HID=y
+ # CONFIG_HID_DEBUG is not set
+-# CONFIG_HIDRAW is not set
+
+ #
+ # USB Input Devices
+ #
+ CONFIG_USB_HID=y
+-# CONFIG_HID_PID is not set
++# CONFIG_USB_HIDINPUT_POWERBOOK is not set
++# CONFIG_HID_FF is not set
+ CONFIG_USB_HIDDEV=y
+-
+-#
+-# Special HID drivers
+-#
+-CONFIG_HID_COMPAT=y
+-# CONFIG_HID_A4TECH is not set
+-# CONFIG_HID_APPLE is not set
+-# CONFIG_HID_BELKIN is not set
+-# CONFIG_HID_CHERRY is not set
+-# CONFIG_HID_CHICONY is not set
+-# CONFIG_HID_CYPRESS is not set
+-# CONFIG_HID_EZKEY is not set
+-# CONFIG_HID_GYRATION is not set
+-# CONFIG_HID_LOGITECH is not set
+-# CONFIG_HID_MICROSOFT is not set
+-# CONFIG_HID_MONTEREY is not set
+-# CONFIG_HID_NTRIG is not set
+-# CONFIG_HID_PANTHERLORD is not set
+-# CONFIG_HID_PETALYNX is not set
+-# CONFIG_HID_SAMSUNG is not set
+-# CONFIG_HID_SONY is not set
+-# CONFIG_HID_SUNPLUS is not set
+-# CONFIG_GREENASIA_FF is not set
+-# CONFIG_HID_TOPSEED is not set
+-# CONFIG_THRUSTMASTER_FF is not set
+-# CONFIG_ZEROPLUS_FF is not set
+ CONFIG_USB_SUPPORT=y
+ CONFIG_USB_ARCH_HAS_HCD=y
+ CONFIG_USB_ARCH_HAS_OHCI=y
+ CONFIG_USB_ARCH_HAS_EHCI=y
+ CONFIG_USB=y
+ CONFIG_USB_DEBUG=y
+-# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
+
+ #
+ # Miscellaneous USB options
+@@ -1050,20 +958,12 @@
+ CONFIG_USB_DEVICE_CLASS=y
+ # CONFIG_USB_DYNAMIC_MINORS is not set
+ # CONFIG_USB_OTG is not set
+-# CONFIG_USB_OTG_WHITELIST is not set
+-# CONFIG_USB_OTG_BLACKLIST_HUB is not set
+-# CONFIG_USB_MON is not set
+-# CONFIG_USB_WUSB is not set
+-# CONFIG_USB_WUSB_CBAF is not set
+
+ #
+ # USB Host Controller Drivers
+ #
+-# CONFIG_USB_C67X00_HCD is not set
+ # CONFIG_USB_EHCI_HCD is not set
+-# CONFIG_USB_OXU210HP_HCD is not set
+ # CONFIG_USB_ISP116X_HCD is not set
+-# CONFIG_USB_ISP1760_HCD is not set
+ CONFIG_USB_OHCI_HCD=y
+ # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
+ # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
+@@ -1071,37 +971,32 @@
+ # CONFIG_USB_UHCI_HCD is not set
+ # CONFIG_USB_SL811_HCD is not set
+ # CONFIG_USB_R8A66597_HCD is not set
+-# CONFIG_USB_WHCI_HCD is not set
+-# CONFIG_USB_HWA_HCD is not set
+
+ #
+ # USB Device Class drivers
+ #
+ # CONFIG_USB_ACM is not set
+ CONFIG_USB_PRINTER=m
+-# CONFIG_USB_WDM is not set
+-# CONFIG_USB_TMC is not set
+
+ #
+-# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+
+ #
+-# see USB_STORAGE Help for more information
++# may also be needed; see USB_STORAGE Help for more information
+ #
+ CONFIG_USB_STORAGE=m
+ # CONFIG_USB_STORAGE_DEBUG is not set
+ # CONFIG_USB_STORAGE_DATAFAB is not set
+ # CONFIG_USB_STORAGE_FREECOM is not set
+ # CONFIG_USB_STORAGE_ISD200 is not set
++CONFIG_USB_STORAGE_DPCM=y
+ CONFIG_USB_STORAGE_USBAT=y
+ CONFIG_USB_STORAGE_SDDR09=y
+ CONFIG_USB_STORAGE_SDDR55=y
+ CONFIG_USB_STORAGE_JUMPSHOT=y
+ # CONFIG_USB_STORAGE_ALAUDA is not set
+-# CONFIG_USB_STORAGE_ONETOUCH is not set
+ # CONFIG_USB_STORAGE_KARMA is not set
+-# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
+ # CONFIG_USB_LIBUSUAL is not set
+
+ #
+@@ -1109,10 +1004,15 @@
+ #
+ CONFIG_USB_MDC800=m
+ CONFIG_USB_MICROTEK=m
++# CONFIG_USB_MON is not set
+
+ #
+ # USB port drivers
+ #
++
++#
++# USB Serial Converter support
++#
+ # CONFIG_USB_SERIAL is not set
+
+ #
+@@ -1121,7 +1021,7 @@
+ # CONFIG_USB_EMI62 is not set
+ # CONFIG_USB_EMI26 is not set
+ # CONFIG_USB_ADUTUX is not set
+-# CONFIG_USB_SEVSEG is not set
++# CONFIG_USB_AUERSWALD is not set
+ # CONFIG_USB_RIO500 is not set
+ CONFIG_USB_LEGOTOWER=m
+ # CONFIG_USB_LCD is not set
+@@ -1137,59 +1037,37 @@
+ # CONFIG_USB_TRANCEVIBRATOR is not set
+ # CONFIG_USB_IOWARRIOR is not set
+ # CONFIG_USB_TEST is not set
+-# CONFIG_USB_ISIGHTFW is not set
+-# CONFIG_USB_VST is not set
+-# CONFIG_USB_GADGET is not set
+
+ #
+-# OTG and related infrastructure
++# USB DSL modem support
+ #
+-# CONFIG_UWB is not set
++
++#
++# USB Gadget Support
++#
++# CONFIG_USB_GADGET is not set
+ # CONFIG_MMC is not set
+-# CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS is not set
+-# CONFIG_ACCESSIBILITY is not set
+ # CONFIG_INFINIBAND is not set
+-CONFIG_RTC_LIB=y
+-CONFIG_RTC_CLASS=y
+-CONFIG_RTC_HCTOSYS=y
+-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+-# CONFIG_RTC_DEBUG is not set
++# CONFIG_RTC_CLASS is not set
+
+ #
+-# RTC interfaces
++# DMA Engine support
+ #
+-CONFIG_RTC_INTF_SYSFS=y
+-CONFIG_RTC_INTF_PROC=y
+-CONFIG_RTC_INTF_DEV=y
+-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+-# CONFIG_RTC_DRV_TEST is not set
++# CONFIG_DMA_ENGINE is not set
+
+ #
+-# SPI RTC drivers
++# DMA Clients
+ #
+
+ #
+-# Platform RTC drivers
++# DMA Devices
+ #
+-# CONFIG_RTC_DRV_DS1286 is not set
+-# CONFIG_RTC_DRV_DS1511 is not set
+-# CONFIG_RTC_DRV_DS1553 is not set
+-# CONFIG_RTC_DRV_DS1742 is not set
+-# CONFIG_RTC_DRV_STK17TA8 is not set
+-# CONFIG_RTC_DRV_M48T86 is not set
+-# CONFIG_RTC_DRV_M48T35 is not set
+-# CONFIG_RTC_DRV_M48T59 is not set
+-# CONFIG_RTC_DRV_BQ4802 is not set
+-# CONFIG_RTC_DRV_V3020 is not set
+
+ #
+-# on-CPU RTC drivers
++# Userspace I/O
+ #
+-CONFIG_RTC_DRV_PARISC=y
+-# CONFIG_DMADEVICES is not set
+ # CONFIG_UIO is not set
+-# CONFIG_STAGING is not set
+
+ #
+ # File systems
+@@ -1199,24 +1077,25 @@
+ # CONFIG_EXT2_FS_XIP is not set
+ CONFIG_EXT3_FS=y
+ # CONFIG_EXT3_FS_XATTR is not set
+-# CONFIG_EXT4_FS is not set
++# CONFIG_EXT4DEV_FS is not set
+ CONFIG_JBD=y
+ # CONFIG_JBD_DEBUG is not set
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
+ # CONFIG_FS_POSIX_ACL is not set
+-CONFIG_FILE_LOCKING=y
+ CONFIG_XFS_FS=m
+ # CONFIG_XFS_QUOTA is not set
++# CONFIG_XFS_SECURITY is not set
+ # CONFIG_XFS_POSIX_ACL is not set
+ # CONFIG_XFS_RT is not set
+-# CONFIG_XFS_DEBUG is not set
++# CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_BTRFS_FS is not set
+-CONFIG_DNOTIFY=y
++# CONFIG_MINIX_FS is not set
++# CONFIG_ROMFS_FS is not set
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+ # CONFIG_QUOTA is not set
++CONFIG_DNOTIFY=y
+ # CONFIG_AUTOFS_FS is not set
+ CONFIG_AUTOFS4_FS=y
+ # CONFIG_FUSE_FS is not set
+@@ -1245,13 +1124,16 @@
+ CONFIG_PROC_FS=y
+ CONFIG_PROC_KCORE=y
+ CONFIG_PROC_SYSCTL=y
+-CONFIG_PROC_PAGE_MONITOR=y
+ CONFIG_SYSFS=y
+ CONFIG_TMPFS=y
+ # CONFIG_TMPFS_POSIX_ACL is not set
+ # CONFIG_HUGETLB_PAGE is not set
++CONFIG_RAMFS=y
+ # CONFIG_CONFIGFS_FS is not set
+-CONFIG_MISC_FILESYSTEMS=y
++
++#
++# Miscellaneous filesystems
++#
+ # CONFIG_ADFS_FS is not set
+ # CONFIG_AFFS_FS is not set
+ # CONFIG_HFS_FS is not set
+@@ -1260,31 +1142,32 @@
+ # CONFIG_BFS_FS is not set
+ # CONFIG_EFS_FS is not set
+ # CONFIG_CRAMFS is not set
+-# CONFIG_SQUASHFS is not set
+ # CONFIG_VXFS_FS is not set
+-# CONFIG_MINIX_FS is not set
+-# CONFIG_OMFS_FS is not set
+ # CONFIG_HPFS_FS is not set
+ # CONFIG_QNX4FS_FS is not set
+-# CONFIG_ROMFS_FS is not set
+ # CONFIG_SYSV_FS is not set
+ # CONFIG_UFS_FS is not set
+-CONFIG_NETWORK_FILESYSTEMS=y
++
++#
++# Network File Systems
++#
+ CONFIG_NFS_FS=y
+ CONFIG_NFS_V3=y
+ # CONFIG_NFS_V3_ACL is not set
+ # CONFIG_NFS_V4 is not set
+-CONFIG_ROOT_NFS=y
++# CONFIG_NFS_DIRECTIO is not set
+ CONFIG_NFSD=y
+ CONFIG_NFSD_V3=y
+ # CONFIG_NFSD_V3_ACL is not set
+ # CONFIG_NFSD_V4 is not set
++# CONFIG_NFSD_TCP is not set
++CONFIG_ROOT_NFS=y
+ CONFIG_LOCKD=y
+ CONFIG_LOCKD_V4=y
+ CONFIG_EXPORTFS=y
+ CONFIG_NFS_COMMON=y
+ CONFIG_SUNRPC=y
+-# CONFIG_SUNRPC_REGISTER_V4 is not set
++# CONFIG_SUNRPC_BIND34 is not set
+ # CONFIG_RPCSEC_GSS_KRB5 is not set
+ # CONFIG_RPCSEC_GSS_SPKM3 is not set
+ # CONFIG_SMB_FS is not set
+@@ -1298,6 +1181,10 @@
+ #
+ # CONFIG_PARTITION_ADVANCED is not set
+ CONFIG_MSDOS_PARTITION=y
++
++#
++# Native Language Support
++#
+ CONFIG_NLS=y
+ CONFIG_NLS_DEFAULT="iso8859-1"
+ CONFIG_NLS_CODEPAGE_437=m
+@@ -1338,28 +1225,33 @@
+ # CONFIG_NLS_KOI8_R is not set
+ # CONFIG_NLS_KOI8_U is not set
+ CONFIG_NLS_UTF8=m
++
++#
++# Distributed Lock Manager
++#
+ # CONFIG_DLM is not set
+
+ #
++# Profiling support
++#
++CONFIG_PROFILING=y
++CONFIG_OPROFILE=m
++
++#
+ # Kernel hacking
+ #
+ # CONFIG_PRINTK_TIME is not set
+-CONFIG_ENABLE_WARN_DEPRECATED=y
+ CONFIG_ENABLE_MUST_CHECK=y
+-CONFIG_FRAME_WARN=1024
+ CONFIG_MAGIC_SYSRQ=y
+ # CONFIG_UNUSED_SYMBOLS is not set
+-CONFIG_DEBUG_FS=y
++# CONFIG_DEBUG_FS is not set
+ CONFIG_HEADERS_CHECK=y
+ CONFIG_DEBUG_KERNEL=y
+ # CONFIG_DEBUG_SHIRQ is not set
+ CONFIG_DETECT_SOFTLOCKUP=y
+-# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+-CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
+ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS is not set
+-# CONFIG_DEBUG_OBJECTS is not set
+ # CONFIG_DEBUG_SLAB is not set
+ # CONFIG_DEBUG_RT_MUTEXES is not set
+ # CONFIG_RT_MUTEX_TESTER is not set
+@@ -1371,33 +1263,10 @@
+ # CONFIG_DEBUG_BUGVERBOSE is not set
+ # CONFIG_DEBUG_INFO is not set
+ # CONFIG_DEBUG_VM is not set
+-# CONFIG_DEBUG_WRITECOUNT is not set
+-# CONFIG_DEBUG_MEMORY_INIT is not set
+ # CONFIG_DEBUG_LIST is not set
+-# CONFIG_DEBUG_SG is not set
+-# CONFIG_DEBUG_NOTIFIERS is not set
+-# CONFIG_BOOT_PRINTK_DELAY is not set
++CONFIG_FORCED_INLINING=y
+ # CONFIG_RCU_TORTURE_TEST is not set
+-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+-# CONFIG_BACKTRACE_SELF_TEST is not set
+-# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+ # CONFIG_FAULT_INJECTION is not set
+-# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+-CONFIG_NOP_TRACER=y
+-CONFIG_RING_BUFFER=y
+-CONFIG_TRACING=y
+-
+-#
+-# Tracers
+-#
+-# CONFIG_SCHED_TRACER is not set
+-# CONFIG_CONTEXT_SWITCH_TRACER is not set
+-# CONFIG_BOOT_TRACER is not set
+-# CONFIG_TRACE_BRANCH_PROFILING is not set
+-# CONFIG_FTRACE_STARTUP_TEST is not set
+-# CONFIG_BUILD_DOCSRC is not set
+-# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
+-# CONFIG_SAMPLES is not set
+ CONFIG_DEBUG_RODATA=y
+
+ #
+@@ -1405,110 +1274,54 @@
+ #
+ # CONFIG_KEYS is not set
+ # CONFIG_SECURITY is not set
+-# CONFIG_SECURITYFS is not set
+-# CONFIG_SECURITY_FILE_CAPABILITIES is not set
+ CONFIG_CRYPTO=y
+-
+-#
+-# Crypto core or helper
+-#
+-# CONFIG_CRYPTO_FIPS is not set
+ CONFIG_CRYPTO_ALGAPI=m
+-CONFIG_CRYPTO_ALGAPI2=m
+-CONFIG_CRYPTO_AEAD2=m
+ CONFIG_CRYPTO_BLKCIPHER=m
+-CONFIG_CRYPTO_BLKCIPHER2=m
+-CONFIG_CRYPTO_HASH=m
+-CONFIG_CRYPTO_HASH2=m
+-CONFIG_CRYPTO_RNG2=m
+ CONFIG_CRYPTO_MANAGER=m
+-CONFIG_CRYPTO_MANAGER2=m
+-# CONFIG_CRYPTO_GF128MUL is not set
+-CONFIG_CRYPTO_NULL=m
+-# CONFIG_CRYPTO_CRYPTD is not set
+-# CONFIG_CRYPTO_AUTHENC is not set
+-CONFIG_CRYPTO_TEST=m
+-
+-#
+-# Authenticated Encryption with Associated Data
+-#
+-# CONFIG_CRYPTO_CCM is not set
+-# CONFIG_CRYPTO_GCM is not set
+-# CONFIG_CRYPTO_SEQIV is not set
+-
+-#
+-# Block modes
+-#
+-CONFIG_CRYPTO_CBC=m
+-# CONFIG_CRYPTO_CTR is not set
+-# CONFIG_CRYPTO_CTS is not set
+-# CONFIG_CRYPTO_ECB is not set
+-# CONFIG_CRYPTO_LRW is not set
+-# CONFIG_CRYPTO_PCBC is not set
+-# CONFIG_CRYPTO_XTS is not set
+-
+-#
+-# Hash modes
+-#
+ # CONFIG_CRYPTO_HMAC is not set
+ # CONFIG_CRYPTO_XCBC is not set
+-
+-#
+-# Digest
+-#
+-CONFIG_CRYPTO_CRC32C=m
++CONFIG_CRYPTO_NULL=m
+ # CONFIG_CRYPTO_MD4 is not set
+ CONFIG_CRYPTO_MD5=m
+-# CONFIG_CRYPTO_MICHAEL_MIC is not set
+-# CONFIG_CRYPTO_RMD128 is not set
+-# CONFIG_CRYPTO_RMD160 is not set
+-# CONFIG_CRYPTO_RMD256 is not set
+-# CONFIG_CRYPTO_RMD320 is not set
+ # CONFIG_CRYPTO_SHA1 is not set
+ # CONFIG_CRYPTO_SHA256 is not set
+ # CONFIG_CRYPTO_SHA512 is not set
+-# CONFIG_CRYPTO_TGR192 is not set
+ # CONFIG_CRYPTO_WP512 is not set
+-
+-#
+-# Ciphers
+-#
+-# CONFIG_CRYPTO_AES is not set
+-# CONFIG_CRYPTO_ANUBIS is not set
+-# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_GF128MUL is not set
++# CONFIG_CRYPTO_ECB is not set
++CONFIG_CRYPTO_CBC=m
++# CONFIG_CRYPTO_PCBC is not set
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_XTS is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_DES=m
++# CONFIG_CRYPTO_FCRYPT is not set
+ CONFIG_CRYPTO_BLOWFISH=m
+-# CONFIG_CRYPTO_CAMELLIA is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_AES is not set
+ # CONFIG_CRYPTO_CAST5 is not set
+ # CONFIG_CRYPTO_CAST6 is not set
+-CONFIG_CRYPTO_DES=m
+-# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_ARC4 is not set
+ # CONFIG_CRYPTO_KHAZAD is not set
+-# CONFIG_CRYPTO_SALSA20 is not set
++# CONFIG_CRYPTO_ANUBIS is not set
+ # CONFIG_CRYPTO_SEED is not set
+-# CONFIG_CRYPTO_SERPENT is not set
+-# CONFIG_CRYPTO_TEA is not set
+-# CONFIG_CRYPTO_TWOFISH is not set
+-
+-#
+-# Compression
+-#
+ CONFIG_CRYPTO_DEFLATE=m
+-# CONFIG_CRYPTO_LZO is not set
+-
+-#
+-# Random Number Generation
+-#
+-# CONFIG_CRYPTO_ANSI_CPRNG is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++CONFIG_CRYPTO_CRC32C=m
++# CONFIG_CRYPTO_CAMELLIA is not set
++CONFIG_CRYPTO_TEST=m
++# CONFIG_CRYPTO_AUTHENC is not set
+ # CONFIG_CRYPTO_HW is not set
+
+ #
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
+-CONFIG_GENERIC_FIND_LAST_BIT=y
+ CONFIG_CRC_CCITT=m
+ # CONFIG_CRC16 is not set
+-# CONFIG_CRC_T10DIF is not set
+ # CONFIG_CRC_ITU_T is not set
+ CONFIG_CRC32=y
+ # CONFIG_CRC7 is not set
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/parisc/configs/default_defconfig linux-2.6.29-rc3.owrt/arch/parisc/configs/default_defconfig
+--- linux-2.6.29.owrt/arch/parisc/configs/default_defconfig 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/parisc/configs/default_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-rc8
+-# Fri Mar 13 01:32:59 2009
++# Linux kernel version: 2.6.23
++# Fri Oct 12 20:54:57 2007
+ #
+ CONFIG_PARISC=y
+ CONFIG_MMU=y
+@@ -33,35 +33,17 @@
+ CONFIG_POSIX_MQUEUE=y
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
++# CONFIG_USER_NS is not set
+ # CONFIG_AUDIT is not set
+-
+-#
+-# RCU Subsystem
+-#
+-CONFIG_CLASSIC_RCU=y
+-# CONFIG_TREE_RCU is not set
+-# CONFIG_PREEMPT_RCU is not set
+-# CONFIG_TREE_RCU_TRACE is not set
+-# CONFIG_PREEMPT_RCU_TRACE is not set
+ CONFIG_IKCONFIG=y
+ CONFIG_IKCONFIG_PROC=y
+ CONFIG_LOG_BUF_SHIFT=16
+-# CONFIG_GROUP_SCHED is not set
+-# CONFIG_CGROUPS is not set
+ CONFIG_SYSFS_DEPRECATED=y
+-CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
+-CONFIG_NAMESPACES=y
+-# CONFIG_UTS_NS is not set
+-# CONFIG_IPC_NS is not set
+-# CONFIG_USER_NS is not set
+-# CONFIG_PID_NS is not set
+-# CONFIG_NET_NS is not set
+ CONFIG_BLK_DEV_INITRD=y
+ CONFIG_INITRAMFS_SOURCE=""
+ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+ CONFIG_SYSCTL=y
+-CONFIG_ANON_INODES=y
+ # CONFIG_EMBEDDED is not set
+ CONFIG_SYSCTL_SYSCALL=y
+ CONFIG_KALLSYMS=y
+@@ -73,39 +55,29 @@
+ CONFIG_ELF_CORE=y
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
++CONFIG_ANON_INODES=y
+ CONFIG_EPOLL=y
+ CONFIG_SIGNALFD=y
+-CONFIG_TIMERFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_SHMEM=y
+-CONFIG_AIO=y
+ CONFIG_VM_EVENT_COUNTERS=y
+-CONFIG_PCI_QUIRKS=y
+-CONFIG_COMPAT_BRK=y
+ CONFIG_SLAB=y
+ # CONFIG_SLUB is not set
+ # CONFIG_SLOB is not set
+-CONFIG_PROFILING=y
+-CONFIG_TRACEPOINTS=y
+-# CONFIG_MARKERS is not set
+-CONFIG_OPROFILE=m
+-CONFIG_HAVE_OPROFILE=y
+-# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
+-CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+ CONFIG_MODULES=y
+-# CONFIG_MODULE_FORCE_LOAD is not set
+ CONFIG_MODULE_UNLOAD=y
+ CONFIG_MODULE_FORCE_UNLOAD=y
+ # CONFIG_MODVERSIONS is not set
+ # CONFIG_MODULE_SRCVERSION_ALL is not set
+-CONFIG_INIT_ALL_POSSIBLE=y
++CONFIG_KMOD=y
+ CONFIG_BLOCK=y
+ # CONFIG_LBD is not set
+ # CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
+ # CONFIG_BLK_DEV_BSG is not set
+-# CONFIG_BLK_DEV_INTEGRITY is not set
+
+ #
+ # IO Schedulers
+@@ -119,7 +91,6 @@
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
+-# CONFIG_FREEZER is not set
+
+ #
+ # Processor type and features
+@@ -143,19 +114,17 @@
+ # CONFIG_HZ_300 is not set
+ # CONFIG_HZ_1000 is not set
+ CONFIG_HZ=250
+-# CONFIG_SCHED_HRTICK is not set
+ CONFIG_SELECT_MEMORY_MODEL=y
+ CONFIG_FLATMEM_MANUAL=y
+ # CONFIG_DISCONTIGMEM_MANUAL is not set
+ # CONFIG_SPARSEMEM_MANUAL is not set
+ CONFIG_FLATMEM=y
+ CONFIG_FLAT_NODE_MEM_MAP=y
+-CONFIG_PAGEFLAGS_EXTENDED=y
++# CONFIG_SPARSEMEM_STATIC is not set
+ CONFIG_SPLIT_PTLOCK_CPUS=4096
+-# CONFIG_PHYS_ADDR_T_64BIT is not set
++# CONFIG_RESOURCES_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=0
+ CONFIG_VIRT_TO_BUS=y
+-CONFIG_UNEVICTABLE_LRU=y
+ # CONFIG_HPUX is not set
+
+ #
+@@ -171,14 +140,15 @@
+ # CONFIG_ISA is not set
+ CONFIG_PCI=y
+ # CONFIG_ARCH_SUPPORTS_MSI is not set
+-CONFIG_PCI_LEGACY=y
+ # CONFIG_PCI_DEBUG is not set
+-# CONFIG_PCI_STUB is not set
+ CONFIG_GSC_DINO=y
+ CONFIG_PCI_LBA=y
+ CONFIG_IOSAPIC=y
+ CONFIG_IOMMU_SBA=y
+-CONFIG_IOMMU_HELPER=y
++
++#
++# PCCARD (PCMCIA/CardBus) support
++#
+ CONFIG_PCCARD=y
+ # CONFIG_PCMCIA_DEBUG is not set
+ CONFIG_PCMCIA=y
+@@ -213,15 +183,16 @@
+ # Executable file formats
+ #
+ CONFIG_BINFMT_ELF=y
+-# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+-# CONFIG_HAVE_AOUT is not set
+ CONFIG_BINFMT_MISC=m
++
++#
++# Networking
++#
+ CONFIG_NET=y
+
+ #
+ # Networking options
+ #
+-CONFIG_COMPAT_NET_DEV_OPS=y
+ CONFIG_PACKET=y
+ CONFIG_PACKET_MMAP=y
+ CONFIG_UNIX=y
+@@ -229,8 +200,6 @@
+ CONFIG_XFRM_USER=m
+ # CONFIG_XFRM_SUB_POLICY is not set
+ # CONFIG_XFRM_MIGRATE is not set
+-# CONFIG_XFRM_STATISTICS is not set
+-CONFIG_XFRM_IPCOMP=y
+ CONFIG_NET_KEY=m
+ # CONFIG_NET_KEY_MIGRATE is not set
+ CONFIG_INET=y
+@@ -276,10 +245,8 @@
+ CONFIG_INET6_XFRM_MODE_BEET=y
+ # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+ CONFIG_IPV6_SIT=y
+-CONFIG_IPV6_NDISC_NODETYPE=y
+ # CONFIG_IPV6_TUNNEL is not set
+ # CONFIG_IPV6_MULTIPLE_TABLES is not set
+-# CONFIG_IPV6_MROUTE is not set
+ # CONFIG_NETWORK_SECMARK is not set
+ # CONFIG_NETFILTER is not set
+ # CONFIG_IP_DCCP is not set
+@@ -287,7 +254,6 @@
+ # CONFIG_TIPC is not set
+ # CONFIG_ATM is not set
+ # CONFIG_BRIDGE is not set
+-# CONFIG_NET_DSA is not set
+ # CONFIG_VLAN_8021Q is not set
+ # CONFIG_DECNET is not set
+ CONFIG_LLC=m
+@@ -298,26 +264,28 @@
+ # CONFIG_LAPB is not set
+ # CONFIG_ECONET is not set
+ # CONFIG_WAN_ROUTER is not set
++
++#
++# QoS and/or fair queueing
++#
+ # CONFIG_NET_SCHED is not set
+-# CONFIG_DCB is not set
+
+ #
+ # Network testing
+ #
+ # CONFIG_NET_PKTGEN is not set
+ # CONFIG_HAMRADIO is not set
+-# CONFIG_CAN is not set
+ # CONFIG_IRDA is not set
+ # CONFIG_BT is not set
+ # CONFIG_AF_RXRPC is not set
+-# CONFIG_PHONET is not set
+-CONFIG_WIRELESS=y
++
++#
++# Wireless
++#
+ # CONFIG_CFG80211 is not set
+-CONFIG_WIRELESS_OLD_REGULATORY=y
+ # CONFIG_WIRELESS_EXT is not set
+-# CONFIG_LIB80211 is not set
+ # CONFIG_MAC80211 is not set
+-# CONFIG_WIMAX is not set
++# CONFIG_IEEE80211 is not set
+ # CONFIG_RFKILL is not set
+ # CONFIG_NET_9P is not set
+
+@@ -332,8 +300,6 @@
+ # CONFIG_STANDALONE is not set
+ # CONFIG_PREVENT_FIRMWARE_BUILD is not set
+ CONFIG_FW_LOADER=y
+-CONFIG_FIRMWARE_IN_KERNEL=y
+-CONFIG_EXTRA_FIRMWARE=""
+ # CONFIG_DEBUG_DRIVER is not set
+ # CONFIG_DEBUG_DEVRES is not set
+ # CONFIG_SYS_HYPERVISOR is not set
+@@ -364,68 +330,63 @@
+ CONFIG_BLK_DEV_RAM=y
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=6144
+-# CONFIG_BLK_DEV_XIP is not set
++CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+ # CONFIG_CDROM_PKTCDVD is not set
+ # CONFIG_ATA_OVER_ETH is not set
+-# CONFIG_BLK_DEV_HD is not set
+ CONFIG_MISC_DEVICES=y
+ # CONFIG_PHANTOM is not set
++# CONFIG_EEPROM_93CX6 is not set
+ # CONFIG_SGI_IOC4 is not set
+ # CONFIG_TIFM_CORE is not set
+-# CONFIG_ENCLOSURE_SERVICES is not set
+-# CONFIG_HP_ILO is not set
+-# CONFIG_C2PORT is not set
+-
+-#
+-# EEPROM support
+-#
+-# CONFIG_EEPROM_93CX6 is not set
+-CONFIG_HAVE_IDE=y
+ CONFIG_IDE=y
++CONFIG_BLK_DEV_IDE=y
+
+ #
+-# Please see Documentation/ide/ide.txt for help/info on IDE drives
++# Please see Documentation/ide.txt for help/info on IDE drives
+ #
+-CONFIG_IDE_ATAPI=y
+ # CONFIG_BLK_DEV_IDE_SATA is not set
+-CONFIG_IDE_GD=y
+-CONFIG_IDE_GD_ATA=y
+-# CONFIG_IDE_GD_ATAPI is not set
++CONFIG_BLK_DEV_IDEDISK=y
++CONFIG_IDEDISK_MULTI_MODE=y
+ CONFIG_BLK_DEV_IDECS=y
+ # CONFIG_BLK_DEV_DELKIN is not set
+ CONFIG_BLK_DEV_IDECD=y
+-CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
+ # CONFIG_BLK_DEV_IDETAPE is not set
++# CONFIG_BLK_DEV_IDEFLOPPY is not set
++CONFIG_BLK_DEV_IDESCSI=y
+ # CONFIG_IDE_TASK_IOCTL is not set
+ CONFIG_IDE_PROC_FS=y
+
+ #
+ # IDE chipset support/bugfixes
+ #
++CONFIG_IDE_GENERIC=y
+ # CONFIG_BLK_DEV_PLATFORM is not set
+-CONFIG_BLK_DEV_IDEDMA_SFF=y
+
+ #
+ # PCI IDE chipsets support
+ #
+ CONFIG_BLK_DEV_IDEPCI=y
++CONFIG_IDEPCI_SHARE_IRQ=y
+ CONFIG_IDEPCI_PCIBUS_ORDER=y
+ # CONFIG_BLK_DEV_OFFBOARD is not set
+ CONFIG_BLK_DEV_GENERIC=y
+ # CONFIG_BLK_DEV_OPTI621 is not set
+ CONFIG_BLK_DEV_IDEDMA_PCI=y
++# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
++CONFIG_IDEDMA_ONLYDISK=y
+ # CONFIG_BLK_DEV_AEC62XX is not set
+ # CONFIG_BLK_DEV_ALI15X3 is not set
+ # CONFIG_BLK_DEV_AMD74XX is not set
+ # CONFIG_BLK_DEV_CMD64X is not set
+ # CONFIG_BLK_DEV_TRIFLEX is not set
++# CONFIG_BLK_DEV_CY82C693 is not set
+ # CONFIG_BLK_DEV_CS5520 is not set
+ # CONFIG_BLK_DEV_CS5530 is not set
++# CONFIG_BLK_DEV_HPT34X is not set
+ # CONFIG_BLK_DEV_HPT366 is not set
+ # CONFIG_BLK_DEV_JMICRON is not set
+ # CONFIG_BLK_DEV_SC1200 is not set
+ # CONFIG_BLK_DEV_PIIX is not set
+-# CONFIG_BLK_DEV_IT8172 is not set
+ # CONFIG_BLK_DEV_IT8213 is not set
+ # CONFIG_BLK_DEV_IT821X is not set
+ CONFIG_BLK_DEV_NS87415=y
+@@ -437,7 +398,10 @@
+ # CONFIG_BLK_DEV_TRM290 is not set
+ # CONFIG_BLK_DEV_VIA82CXXX is not set
+ # CONFIG_BLK_DEV_TC86C001 is not set
++# CONFIG_IDE_ARM is not set
+ CONFIG_BLK_DEV_IDEDMA=y
++# CONFIG_IDEDMA_IVB is not set
++# CONFIG_BLK_DEV_HD is not set
+
+ #
+ # SCSI device support
+@@ -476,10 +440,8 @@
+ # CONFIG_SCSI_FC_ATTRS is not set
+ # CONFIG_SCSI_ISCSI_ATTRS is not set
+ # CONFIG_SCSI_SAS_LIBSAS is not set
+-# CONFIG_SCSI_SRP_ATTRS is not set
+ CONFIG_SCSI_LOWLEVEL=y
+ # CONFIG_ISCSI_TCP is not set
+-# CONFIG_SCSI_CXGB3_ISCSI is not set
+ # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+ # CONFIG_SCSI_3W_9XXX is not set
+ # CONFIG_SCSI_ACARD is not set
+@@ -490,14 +452,11 @@
+ # CONFIG_SCSI_AIC79XX is not set
+ # CONFIG_SCSI_AIC94XX is not set
+ # CONFIG_SCSI_DPT_I2O is not set
+-# CONFIG_SCSI_ADVANSYS is not set
+ # CONFIG_SCSI_ARCMSR is not set
+ # CONFIG_MEGARAID_NEWGEN is not set
+ # CONFIG_MEGARAID_LEGACY is not set
+ # CONFIG_MEGARAID_SAS is not set
+ # CONFIG_SCSI_HPTIOP is not set
+-# CONFIG_LIBFC is not set
+-# CONFIG_FCOE is not set
+ # CONFIG_SCSI_DMX3191D is not set
+ # CONFIG_SCSI_FUTURE_DOMAIN is not set
+ # CONFIG_SCSI_IPS is not set
+@@ -505,7 +464,6 @@
+ # CONFIG_SCSI_INIA100 is not set
+ # CONFIG_SCSI_PPA is not set
+ # CONFIG_SCSI_IMM is not set
+-# CONFIG_SCSI_MVSAS is not set
+ CONFIG_SCSI_LASI700=y
+ CONFIG_53C700_LE_ON_BE=y
+ # CONFIG_SCSI_STEX is not set
+@@ -529,11 +487,9 @@
+ # CONFIG_SCSI_DEBUG is not set
+ # CONFIG_SCSI_SRP is not set
+ # CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
+-# CONFIG_SCSI_DH is not set
+ # CONFIG_ATA is not set
+ CONFIG_MD=y
+ CONFIG_BLK_DEV_MD=y
+-CONFIG_MD_AUTODETECT=y
+ CONFIG_MD_LINEAR=y
+ CONFIG_MD_RAID0=y
+ CONFIG_MD_RAID1=y
+@@ -549,47 +505,32 @@
+ # CONFIG_DM_ZERO is not set
+ # CONFIG_DM_MULTIPATH is not set
+ # CONFIG_DM_DELAY is not set
+-# CONFIG_DM_UEVENT is not set
+-# CONFIG_FUSION is not set
+
+ #
+-# IEEE 1394 (FireWire) support
++# Fusion MPT device support
+ #
++# CONFIG_FUSION is not set
++# CONFIG_FUSION_SPI is not set
++# CONFIG_FUSION_FC is not set
++# CONFIG_FUSION_SAS is not set
+
+ #
+-# Enable only one of the two stacks, unless you know what you are doing
++# IEEE 1394 (FireWire) support
+ #
+ # CONFIG_FIREWIRE is not set
+ # CONFIG_IEEE1394 is not set
+ # CONFIG_I2O is not set
+ CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
+ CONFIG_DUMMY=m
+ CONFIG_BONDING=m
+ # CONFIG_MACVLAN is not set
+ # CONFIG_EQUALIZER is not set
+ CONFIG_TUN=m
+ # CONFIG_VETH is not set
++# CONFIG_IP1000 is not set
+ # CONFIG_ARCNET is not set
+-CONFIG_PHYLIB=y
+-
+-#
+-# MII PHY device drivers
+-#
+-# CONFIG_MARVELL_PHY is not set
+-# CONFIG_DAVICOM_PHY is not set
+-# CONFIG_QSEMI_PHY is not set
+-# CONFIG_LXT_PHY is not set
+-# CONFIG_CICADA_PHY is not set
+-# CONFIG_VITESSE_PHY is not set
+-# CONFIG_SMSC_PHY is not set
+-# CONFIG_BROADCOM_PHY is not set
+-# CONFIG_ICPLUS_PHY is not set
+-# CONFIG_REALTEK_PHY is not set
+-# CONFIG_NATIONAL_PHY is not set
+-# CONFIG_STE10XP is not set
+-# CONFIG_LSI_ET1011C_PHY is not set
+-# CONFIG_FIXED_PHY is not set
+-# CONFIG_MDIO_BITBANG is not set
++# CONFIG_PHYLIB is not set
+ CONFIG_NET_ETHERNET=y
+ CONFIG_MII=m
+ CONFIG_LASI_82596=y
+@@ -609,15 +550,13 @@
+ # CONFIG_DM9102 is not set
+ # CONFIG_ULI526X is not set
+ # CONFIG_PCMCIA_XIRCOM is not set
++# CONFIG_PCMCIA_XIRTULIP is not set
+ # CONFIG_DEPCA is not set
+ # CONFIG_HP100 is not set
+ # CONFIG_IBM_NEW_EMAC_ZMII is not set
+ # CONFIG_IBM_NEW_EMAC_RGMII is not set
+ # CONFIG_IBM_NEW_EMAC_TAH is not set
+ # CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+-# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
+-# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
+-# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
+ CONFIG_NET_PCI=y
+ # CONFIG_PCNET32 is not set
+ # CONFIG_AMD8111_ETH is not set
+@@ -625,7 +564,7 @@
+ # CONFIG_AC3200 is not set
+ # CONFIG_B44 is not set
+ # CONFIG_FORCEDETH is not set
+-# CONFIG_CS89x0 is not set
++# CONFIG_EEPRO100 is not set
+ # CONFIG_E100 is not set
+ # CONFIG_LNE390 is not set
+ # CONFIG_FEALNX is not set
+@@ -635,24 +574,19 @@
+ # CONFIG_ES3210 is not set
+ # CONFIG_8139CP is not set
+ # CONFIG_8139TOO is not set
+-# CONFIG_R6040 is not set
+ # CONFIG_SIS900 is not set
+ # CONFIG_EPIC100 is not set
+-# CONFIG_SMSC9420 is not set
+ # CONFIG_SUNDANCE is not set
+ # CONFIG_TLAN is not set
+ # CONFIG_VIA_RHINE is not set
+ # CONFIG_SC92031 is not set
+ # CONFIG_NET_POCKET is not set
+-# CONFIG_ATL2 is not set
+ CONFIG_NETDEV_1000=y
+ CONFIG_ACENIC=y
+ # CONFIG_ACENIC_OMIT_TIGON_I is not set
+ # CONFIG_DL2K is not set
+ # CONFIG_E1000 is not set
+ # CONFIG_E1000E is not set
+-# CONFIG_IP1000 is not set
+-# CONFIG_IGB is not set
+ # CONFIG_NS83820 is not set
+ # CONFIG_HAMACHI is not set
+ # CONFIG_YELLOWFIN is not set
+@@ -660,31 +594,23 @@
+ # CONFIG_SIS190 is not set
+ # CONFIG_SKGE is not set
+ # CONFIG_SKY2 is not set
++# CONFIG_SK98LIN is not set
+ # CONFIG_VIA_VELOCITY is not set
+ CONFIG_TIGON3=y
+ # CONFIG_BNX2 is not set
+ # CONFIG_QLA3XXX is not set
+ # CONFIG_ATL1 is not set
+-# CONFIG_ATL1E is not set
+-# CONFIG_ATL1C is not set
+-# CONFIG_JME is not set
+ CONFIG_NETDEV_10000=y
+ # CONFIG_CHELSIO_T1 is not set
+-CONFIG_CHELSIO_T3_DEPENDS=y
+ # CONFIG_CHELSIO_T3 is not set
+-# CONFIG_ENIC is not set
+ # CONFIG_IXGBE is not set
+ # CONFIG_IXGB is not set
+ # CONFIG_S2IO is not set
+ # CONFIG_MYRI10GE is not set
+ # CONFIG_NETXEN_NIC is not set
+ # CONFIG_NIU is not set
+-# CONFIG_MLX4_EN is not set
+ # CONFIG_MLX4_CORE is not set
+ # CONFIG_TEHUTI is not set
+-# CONFIG_BNX2X is not set
+-# CONFIG_QLGE is not set
+-# CONFIG_SFC is not set
+ # CONFIG_TR is not set
+
+ #
+@@ -692,11 +618,6 @@
+ #
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
+-# CONFIG_IWLWIFI_LEDS is not set
+-
+-#
+-# Enable WiMAX (Networking options) to see the WiMAX drivers
+-#
+
+ #
+ # USB Network Adapters
+@@ -705,6 +626,7 @@
+ # CONFIG_USB_KAWETH is not set
+ # CONFIG_USB_PEGASUS is not set
+ # CONFIG_USB_RTL8150 is not set
++# CONFIG_USB_USBNET_MII is not set
+ # CONFIG_USB_USBNET is not set
+ CONFIG_NET_PCMCIA=y
+ # CONFIG_PCMCIA_3C589 is not set
+@@ -732,6 +654,7 @@
+ # CONFIG_SLIP is not set
+ CONFIG_SLHC=m
+ # CONFIG_NET_FC is not set
++# CONFIG_SHAPER is not set
+ # CONFIG_NETCONSOLE is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+@@ -753,6 +676,7 @@
+ CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+ # CONFIG_INPUT_JOYDEV is not set
++# CONFIG_INPUT_TSDEV is not set
+ # CONFIG_INPUT_EVDEV is not set
+ # CONFIG_INPUT_EVBUG is not set
+
+@@ -775,12 +699,11 @@
+ CONFIG_MOUSE_PS2_ALPS=y
+ CONFIG_MOUSE_PS2_LOGIPS2PP=y
+ CONFIG_MOUSE_PS2_SYNAPTICS=y
++CONFIG_MOUSE_PS2_LIFEBOOK=y
+ CONFIG_MOUSE_PS2_TRACKPOINT=y
+-# CONFIG_MOUSE_PS2_ELANTECH is not set
+ # CONFIG_MOUSE_PS2_TOUCHKIT is not set
+ CONFIG_MOUSE_SERIAL=y
+ # CONFIG_MOUSE_APPLETOUCH is not set
+-# CONFIG_MOUSE_BCM5974 is not set
+ # CONFIG_MOUSE_VSXXXAA is not set
+ CONFIG_MOUSE_HIL=y
+ # CONFIG_INPUT_JOYSTICK is not set
+@@ -806,13 +729,10 @@
+ # Character devices
+ #
+ CONFIG_VT=y
+-CONFIG_CONSOLE_TRANSLATIONS=y
+ CONFIG_VT_CONSOLE=y
+ CONFIG_HW_CONSOLE=y
+ # CONFIG_VT_HW_CONSOLE_BINDING is not set
+-CONFIG_DEVKMEM=y
+ # CONFIG_SERIAL_NONSTANDARD is not set
+-# CONFIG_NOZOMI is not set
+
+ #
+ # Serial drivers
+@@ -839,16 +759,21 @@
+ CONFIG_SERIAL_CORE_CONSOLE=y
+ # CONFIG_SERIAL_JSM is not set
+ CONFIG_UNIX98_PTYS=y
+-# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+ CONFIG_LEGACY_PTYS=y
+ CONFIG_LEGACY_PTY_COUNT=64
+ CONFIG_PRINTER=m
+ # CONFIG_LP_CONSOLE is not set
+ CONFIG_PPDEV=m
++# CONFIG_TIPAR is not set
+ # CONFIG_IPMI_HANDLER is not set
++# CONFIG_WATCHDOG is not set
+ # CONFIG_HW_RANDOM is not set
++CONFIG_GEN_RTC=y
++CONFIG_GEN_RTC_X=y
+ # CONFIG_R3964 is not set
+ # CONFIG_APPLICOM is not set
++# CONFIG_AGP is not set
++# CONFIG_DRM is not set
+
+ #
+ # PCMCIA character devices
+@@ -856,70 +781,60 @@
+ # CONFIG_SYNCLINK_CS is not set
+ # CONFIG_CARDMAN_4000 is not set
+ # CONFIG_CARDMAN_4040 is not set
+-# CONFIG_IPWIRELESS is not set
+ # CONFIG_RAW_DRIVER is not set
+ # CONFIG_TCG_TPM is not set
+ CONFIG_DEVPORT=y
+ # CONFIG_I2C is not set
++
++#
++# SPI support
++#
+ # CONFIG_SPI is not set
++# CONFIG_SPI_MASTER is not set
+ # CONFIG_W1 is not set
+ # CONFIG_POWER_SUPPLY is not set
+ # CONFIG_HWMON is not set
+-# CONFIG_THERMAL is not set
+-# CONFIG_THERMAL_HWMON is not set
+-# CONFIG_WATCHDOG is not set
+-CONFIG_SSB_POSSIBLE=y
+
+ #
+ # Sonics Silicon Backplane
+ #
++CONFIG_SSB_POSSIBLE=y
+ # CONFIG_SSB is not set
+
+ #
+ # Multifunction device drivers
+ #
+-# CONFIG_MFD_CORE is not set
+ # CONFIG_MFD_SM501 is not set
+-# CONFIG_HTC_PASIC3 is not set
+-# CONFIG_MFD_TMIO is not set
+-# CONFIG_REGULATOR is not set
+
+ #
+ # Multimedia devices
+ #
+-
+-#
+-# Multimedia core support
+-#
+ # CONFIG_VIDEO_DEV is not set
+ # CONFIG_DVB_CORE is not set
+-# CONFIG_VIDEO_MEDIA is not set
++# CONFIG_DAB is not set
+
+ #
+-# Multimedia drivers
++# Graphics support
+ #
+-# CONFIG_DAB is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+ #
+-# Graphics support
++# Display device support
+ #
+-# CONFIG_AGP is not set
+-# CONFIG_DRM is not set
++# CONFIG_DISPLAY_SUPPORT is not set
+ # CONFIG_VGASTATE is not set
+ CONFIG_VIDEO_OUTPUT_CONTROL=m
+ CONFIG_FB=y
+ # CONFIG_FIRMWARE_EDID is not set
+ # CONFIG_FB_DDC is not set
+-# CONFIG_FB_BOOT_VESA_SUPPORT is not set
+ CONFIG_FB_CFB_FILLRECT=y
+ CONFIG_FB_CFB_COPYAREA=y
+ CONFIG_FB_CFB_IMAGEBLIT=y
+-# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
+ # CONFIG_FB_SYS_FILLRECT is not set
+ # CONFIG_FB_SYS_COPYAREA is not set
+ # CONFIG_FB_SYS_IMAGEBLIT is not set
+-# CONFIG_FB_FOREIGN_ENDIAN is not set
+ # CONFIG_FB_SYS_FOPS is not set
++CONFIG_FB_DEFERRED_IO=y
+ # CONFIG_FB_SVGALIB is not set
+ # CONFIG_FB_MACMODES is not set
+ # CONFIG_FB_BACKLIGHT is not set
+@@ -945,7 +860,6 @@
+ # CONFIG_FB_S3 is not set
+ # CONFIG_FB_SAVAGE is not set
+ # CONFIG_FB_SIS is not set
+-# CONFIG_FB_VIA is not set
+ # CONFIG_FB_NEOMAGIC is not set
+ # CONFIG_FB_KYRO is not set
+ # CONFIG_FB_3DFX is not set
+@@ -954,16 +868,7 @@
+ # CONFIG_FB_TRIDENT is not set
+ # CONFIG_FB_ARK is not set
+ # CONFIG_FB_PM3 is not set
+-# CONFIG_FB_CARMINE is not set
+ # CONFIG_FB_VIRTUAL is not set
+-# CONFIG_FB_METRONOME is not set
+-# CONFIG_FB_MB862XX is not set
+-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+-
+-#
+-# Display device support
+-#
+-# CONFIG_DISPLAY_SUPPORT is not set
+
+ #
+ # Console display driver support
+@@ -991,8 +896,15 @@
+ # CONFIG_LOGO_LINUX_VGA16 is not set
+ # CONFIG_LOGO_LINUX_CLUT224 is not set
+ CONFIG_LOGO_PARISC_CLUT224=y
++
++#
++# Sound
++#
+ CONFIG_SOUND=y
+-CONFIG_SOUND_OSS_CORE=y
++
++#
++# Advanced Linux Sound Architecture
++#
+ CONFIG_SND=y
+ CONFIG_SND_TIMER=y
+ CONFIG_SND_PCM=y
+@@ -1008,9 +920,11 @@
+ CONFIG_SND_VERBOSE_PROCFS=y
+ # CONFIG_SND_VERBOSE_PRINTK is not set
+ # CONFIG_SND_DEBUG is not set
+-CONFIG_SND_VMASTER=y
++
++#
++# Generic devices
++#
+ CONFIG_SND_AC97_CODEC=y
+-CONFIG_SND_DRIVERS=y
+ # CONFIG_SND_DUMMY is not set
+ # CONFIG_SND_VIRMIDI is not set
+ # CONFIG_SND_MTPAV is not set
+@@ -1018,8 +932,10 @@
+ # CONFIG_SND_SERIAL_U16550 is not set
+ # CONFIG_SND_MPU401 is not set
+ # CONFIG_SND_PORTMAN2X4 is not set
+-# CONFIG_SND_AC97_POWER_SAVE is not set
+-CONFIG_SND_PCI=y
++
++#
++# PCI devices
++#
+ CONFIG_SND_AD1889=y
+ # CONFIG_SND_ALS300 is not set
+ # CONFIG_SND_ALI5451 is not set
+@@ -1028,12 +944,10 @@
+ # CONFIG_SND_AU8810 is not set
+ # CONFIG_SND_AU8820 is not set
+ # CONFIG_SND_AU8830 is not set
+-# CONFIG_SND_AW2 is not set
+ # CONFIG_SND_AZT3328 is not set
+ # CONFIG_SND_BT87X is not set
+ # CONFIG_SND_CA0106 is not set
+ # CONFIG_SND_CMIPCI is not set
+-# CONFIG_SND_OXYGEN is not set
+ # CONFIG_SND_CS4281 is not set
+ # CONFIG_SND_CS46XX is not set
+ # CONFIG_SND_DARLA20 is not set
+@@ -1058,7 +972,6 @@
+ # CONFIG_SND_HDA_INTEL is not set
+ # CONFIG_SND_HDSP is not set
+ # CONFIG_SND_HDSPM is not set
+-# CONFIG_SND_HIFIER is not set
+ # CONFIG_SND_ICE1712 is not set
+ # CONFIG_SND_ICE1724 is not set
+ # CONFIG_SND_INTEL8X0 is not set
+@@ -1076,67 +989,58 @@
+ # CONFIG_SND_TRIDENT is not set
+ # CONFIG_SND_VIA82XX is not set
+ # CONFIG_SND_VIA82XX_MODEM is not set
+-# CONFIG_SND_VIRTUOSO is not set
+ # CONFIG_SND_VX222 is not set
+ # CONFIG_SND_YMFPCI is not set
+-CONFIG_SND_USB=y
++# CONFIG_SND_AC97_POWER_SAVE is not set
++
++#
++# USB devices
++#
+ # CONFIG_SND_USB_AUDIO is not set
+ # CONFIG_SND_USB_CAIAQ is not set
+-CONFIG_SND_PCMCIA=y
++
++#
++# PCMCIA devices
++#
+ # CONFIG_SND_VXPOCKET is not set
+ # CONFIG_SND_PDAUDIOCF is not set
+-CONFIG_SND_GSC=y
++
++#
++# GSC devices
++#
+ CONFIG_SND_HARMONY=y
++
++#
++# System on Chip audio support
++#
+ # CONFIG_SND_SOC is not set
++
++#
++# SoC Audio support for SuperH
++#
++
++#
++# Open Sound System
++#
+ # CONFIG_SOUND_PRIME is not set
+ CONFIG_AC97_BUS=y
+ CONFIG_HID_SUPPORT=y
+ CONFIG_HID=y
+ CONFIG_HID_DEBUG=y
+-# CONFIG_HIDRAW is not set
+
+ #
+ # USB Input Devices
+ #
+ CONFIG_USB_HID=y
+-# CONFIG_HID_PID is not set
++# CONFIG_USB_HIDINPUT_POWERBOOK is not set
++# CONFIG_HID_FF is not set
+ # CONFIG_USB_HIDDEV is not set
+-
+-#
+-# Special HID drivers
+-#
+-CONFIG_HID_COMPAT=y
+-CONFIG_HID_A4TECH=y
+-CONFIG_HID_APPLE=y
+-CONFIG_HID_BELKIN=y
+-CONFIG_HID_CHERRY=y
+-CONFIG_HID_CHICONY=y
+-CONFIG_HID_CYPRESS=y
+-CONFIG_HID_EZKEY=y
+-CONFIG_HID_GYRATION=y
+-CONFIG_HID_LOGITECH=y
+-# CONFIG_LOGITECH_FF is not set
+-# CONFIG_LOGIRUMBLEPAD2_FF is not set
+-CONFIG_HID_MICROSOFT=y
+-CONFIG_HID_MONTEREY=y
+-CONFIG_HID_NTRIG=y
+-CONFIG_HID_PANTHERLORD=y
+-# CONFIG_PANTHERLORD_FF is not set
+-CONFIG_HID_PETALYNX=y
+-CONFIG_HID_SAMSUNG=y
+-CONFIG_HID_SONY=y
+-CONFIG_HID_SUNPLUS=y
+-# CONFIG_GREENASIA_FF is not set
+-CONFIG_HID_TOPSEED=y
+-# CONFIG_THRUSTMASTER_FF is not set
+-# CONFIG_ZEROPLUS_FF is not set
+ CONFIG_USB_SUPPORT=y
+ CONFIG_USB_ARCH_HAS_HCD=y
+ CONFIG_USB_ARCH_HAS_OHCI=y
+ CONFIG_USB_ARCH_HAS_EHCI=y
+ CONFIG_USB=y
+ # CONFIG_USB_DEBUG is not set
+-# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
+
+ #
+ # Miscellaneous USB options
+@@ -1145,18 +1049,12 @@
+ CONFIG_USB_DEVICE_CLASS=y
+ # CONFIG_USB_DYNAMIC_MINORS is not set
+ # CONFIG_USB_OTG is not set
+-CONFIG_USB_MON=y
+-# CONFIG_USB_WUSB is not set
+-# CONFIG_USB_WUSB_CBAF is not set
+
+ #
+ # USB Host Controller Drivers
+ #
+-# CONFIG_USB_C67X00_HCD is not set
+ # CONFIG_USB_EHCI_HCD is not set
+-# CONFIG_USB_OXU210HP_HCD is not set
+ # CONFIG_USB_ISP116X_HCD is not set
+-# CONFIG_USB_ISP1760_HCD is not set
+ CONFIG_USB_OHCI_HCD=y
+ # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
+ # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
+@@ -1164,23 +1062,19 @@
+ CONFIG_USB_UHCI_HCD=y
+ # CONFIG_USB_SL811_HCD is not set
+ # CONFIG_USB_R8A66597_HCD is not set
+-# CONFIG_USB_WHCI_HCD is not set
+-# CONFIG_USB_HWA_HCD is not set
+
+ #
+ # USB Device Class drivers
+ #
+ # CONFIG_USB_ACM is not set
+ # CONFIG_USB_PRINTER is not set
+-# CONFIG_USB_WDM is not set
+-# CONFIG_USB_TMC is not set
+
+ #
+-# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+
+ #
+-# see USB_STORAGE Help for more information
++# may also be needed; see USB_STORAGE Help for more information
+ #
+ # CONFIG_USB_STORAGE is not set
+ # CONFIG_USB_LIBUSUAL is not set
+@@ -1190,11 +1084,16 @@
+ #
+ # CONFIG_USB_MDC800 is not set
+ # CONFIG_USB_MICROTEK is not set
++CONFIG_USB_MON=y
+
+ #
+ # USB port drivers
+ #
+ # CONFIG_USB_USS720 is not set
++
++#
++# USB Serial Converter support
++#
+ # CONFIG_USB_SERIAL is not set
+
+ #
+@@ -1203,7 +1102,7 @@
+ # CONFIG_USB_EMI62 is not set
+ # CONFIG_USB_EMI26 is not set
+ # CONFIG_USB_ADUTUX is not set
+-# CONFIG_USB_SEVSEG is not set
++# CONFIG_USB_AUERSWALD is not set
+ # CONFIG_USB_RIO500 is not set
+ # CONFIG_USB_LEGOTOWER is not set
+ # CONFIG_USB_LCD is not set
+@@ -1219,60 +1118,38 @@
+ # CONFIG_USB_TRANCEVIBRATOR is not set
+ # CONFIG_USB_IOWARRIOR is not set
+ # CONFIG_USB_TEST is not set
+-# CONFIG_USB_ISIGHTFW is not set
+-# CONFIG_USB_VST is not set
+-# CONFIG_USB_GADGET is not set
+
+ #
+-# OTG and related infrastructure
++# USB DSL modem support
++#
++
++#
++# USB Gadget Support
+ #
+-# CONFIG_UWB is not set
++# CONFIG_USB_GADGET is not set
+ # CONFIG_MMC is not set
+-# CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS is not set
+-# CONFIG_ACCESSIBILITY is not set
+ # CONFIG_INFINIBAND is not set
+-CONFIG_RTC_LIB=y
+-CONFIG_RTC_CLASS=y
+-CONFIG_RTC_HCTOSYS=y
+-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+-# CONFIG_RTC_DEBUG is not set
++# CONFIG_RTC_CLASS is not set
+
+ #
+-# RTC interfaces
++# DMA Engine support
+ #
+-CONFIG_RTC_INTF_SYSFS=y
+-CONFIG_RTC_INTF_PROC=y
+-CONFIG_RTC_INTF_DEV=y
+-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+-# CONFIG_RTC_DRV_TEST is not set
++# CONFIG_DMA_ENGINE is not set
+
+ #
+-# SPI RTC drivers
++# DMA Clients
+ #
+
+ #
+-# Platform RTC drivers
++# DMA Devices
+ #
+-# CONFIG_RTC_DRV_DS1286 is not set
+-# CONFIG_RTC_DRV_DS1511 is not set
+-# CONFIG_RTC_DRV_DS1553 is not set
+-# CONFIG_RTC_DRV_DS1742 is not set
+-# CONFIG_RTC_DRV_STK17TA8 is not set
+-# CONFIG_RTC_DRV_M48T86 is not set
+-# CONFIG_RTC_DRV_M48T35 is not set
+-# CONFIG_RTC_DRV_M48T59 is not set
+-# CONFIG_RTC_DRV_BQ4802 is not set
+-# CONFIG_RTC_DRV_V3020 is not set
++# CONFIG_AUXDISPLAY is not set
+
+ #
+-# on-CPU RTC drivers
++# Userspace I/O
+ #
+-CONFIG_RTC_DRV_PARISC=y
+-# CONFIG_DMADEVICES is not set
+-# CONFIG_AUXDISPLAY is not set
+ # CONFIG_UIO is not set
+-# CONFIG_STAGING is not set
+
+ #
+ # File systems
+@@ -1282,20 +1159,21 @@
+ # CONFIG_EXT2_FS_XIP is not set
+ CONFIG_EXT3_FS=y
+ # CONFIG_EXT3_FS_XATTR is not set
+-# CONFIG_EXT4_FS is not set
++# CONFIG_EXT4DEV_FS is not set
+ CONFIG_JBD=y
+ # CONFIG_JBD_DEBUG is not set
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
+ CONFIG_FS_POSIX_ACL=y
+-CONFIG_FILE_LOCKING=y
+ # CONFIG_XFS_FS is not set
++# CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_BTRFS_FS is not set
+-CONFIG_DNOTIFY=y
++# CONFIG_MINIX_FS is not set
++# CONFIG_ROMFS_FS is not set
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+ # CONFIG_QUOTA is not set
++CONFIG_DNOTIFY=y
+ CONFIG_AUTOFS_FS=y
+ # CONFIG_AUTOFS4_FS is not set
+ # CONFIG_FUSE_FS is not set
+@@ -1324,13 +1202,16 @@
+ CONFIG_PROC_FS=y
+ CONFIG_PROC_KCORE=y
+ CONFIG_PROC_SYSCTL=y
+-CONFIG_PROC_PAGE_MONITOR=y
+ CONFIG_SYSFS=y
+ CONFIG_TMPFS=y
+ # CONFIG_TMPFS_POSIX_ACL is not set
+ # CONFIG_HUGETLB_PAGE is not set
++CONFIG_RAMFS=y
+ # CONFIG_CONFIGFS_FS is not set
+-CONFIG_MISC_FILESYSTEMS=y
++
++#
++# Miscellaneous filesystems
++#
+ # CONFIG_ADFS_FS is not set
+ # CONFIG_AFFS_FS is not set
+ # CONFIG_ECRYPT_FS is not set
+@@ -1340,32 +1221,33 @@
+ # CONFIG_BFS_FS is not set
+ # CONFIG_EFS_FS is not set
+ # CONFIG_CRAMFS is not set
+-# CONFIG_SQUASHFS is not set
+ # CONFIG_VXFS_FS is not set
+-# CONFIG_MINIX_FS is not set
+-# CONFIG_OMFS_FS is not set
+ # CONFIG_HPFS_FS is not set
+ # CONFIG_QNX4FS_FS is not set
+-# CONFIG_ROMFS_FS is not set
+ # CONFIG_SYSV_FS is not set
+ # CONFIG_UFS_FS is not set
+-CONFIG_NETWORK_FILESYSTEMS=y
++
++#
++# Network File Systems
++#
+ CONFIG_NFS_FS=y
+ CONFIG_NFS_V3=y
+ # CONFIG_NFS_V3_ACL is not set
+ # CONFIG_NFS_V4 is not set
+-CONFIG_ROOT_NFS=y
++# CONFIG_NFS_DIRECTIO is not set
+ CONFIG_NFSD=y
+ CONFIG_NFSD_V3=y
+ # CONFIG_NFSD_V3_ACL is not set
+ CONFIG_NFSD_V4=y
++CONFIG_NFSD_TCP=y
++CONFIG_ROOT_NFS=y
+ CONFIG_LOCKD=y
+ CONFIG_LOCKD_V4=y
+ CONFIG_EXPORTFS=y
+ CONFIG_NFS_COMMON=y
+ CONFIG_SUNRPC=y
+ CONFIG_SUNRPC_GSS=y
+-# CONFIG_SUNRPC_REGISTER_V4 is not set
++# CONFIG_SUNRPC_BIND34 is not set
+ CONFIG_RPCSEC_GSS_KRB5=y
+ CONFIG_RPCSEC_GSS_SPKM3=m
+ CONFIG_SMB_FS=m
+@@ -1374,7 +1256,6 @@
+ CONFIG_CIFS=m
+ # CONFIG_CIFS_STATS is not set
+ # CONFIG_CIFS_WEAK_PW_HASH is not set
+-# CONFIG_CIFS_UPCALL is not set
+ # CONFIG_CIFS_XATTR is not set
+ # CONFIG_CIFS_DEBUG2 is not set
+ # CONFIG_CIFS_EXPERIMENTAL is not set
+@@ -1387,6 +1268,10 @@
+ #
+ # CONFIG_PARTITION_ADVANCED is not set
+ CONFIG_MSDOS_PARTITION=y
++
++#
++# Native Language Support
++#
+ CONFIG_NLS=y
+ CONFIG_NLS_DEFAULT="iso8859-1"
+ CONFIG_NLS_CODEPAGE_437=y
+@@ -1427,28 +1312,33 @@
+ CONFIG_NLS_KOI8_R=m
+ CONFIG_NLS_KOI8_U=m
+ CONFIG_NLS_UTF8=y
++
++#
++# Distributed Lock Manager
++#
+ # CONFIG_DLM is not set
+
+ #
++# Profiling support
++#
++CONFIG_PROFILING=y
++CONFIG_OPROFILE=m
++
++#
+ # Kernel hacking
+ #
+ # CONFIG_PRINTK_TIME is not set
+-CONFIG_ENABLE_WARN_DEPRECATED=y
+ CONFIG_ENABLE_MUST_CHECK=y
+-CONFIG_FRAME_WARN=1024
+ CONFIG_MAGIC_SYSRQ=y
+ # CONFIG_UNUSED_SYMBOLS is not set
+-CONFIG_DEBUG_FS=y
++# CONFIG_DEBUG_FS is not set
+ CONFIG_HEADERS_CHECK=y
+ CONFIG_DEBUG_KERNEL=y
+ # CONFIG_DEBUG_SHIRQ is not set
+ CONFIG_DETECT_SOFTLOCKUP=y
+-# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+-CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
+ CONFIG_SCHED_DEBUG=y
+ # CONFIG_SCHEDSTATS is not set
+ # CONFIG_TIMER_STATS is not set
+-# CONFIG_DEBUG_OBJECTS is not set
+ # CONFIG_DEBUG_SLAB is not set
+ # CONFIG_DEBUG_RT_MUTEXES is not set
+ # CONFIG_RT_MUTEX_TESTER is not set
+@@ -1460,33 +1350,10 @@
+ CONFIG_DEBUG_BUGVERBOSE=y
+ # CONFIG_DEBUG_INFO is not set
+ # CONFIG_DEBUG_VM is not set
+-# CONFIG_DEBUG_WRITECOUNT is not set
+-CONFIG_DEBUG_MEMORY_INIT=y
+ # CONFIG_DEBUG_LIST is not set
+-# CONFIG_DEBUG_SG is not set
+-# CONFIG_DEBUG_NOTIFIERS is not set
+-# CONFIG_BOOT_PRINTK_DELAY is not set
++CONFIG_FORCED_INLINING=y
+ # CONFIG_RCU_TORTURE_TEST is not set
+-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+-# CONFIG_BACKTRACE_SELF_TEST is not set
+-# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+ # CONFIG_FAULT_INJECTION is not set
+-# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+-CONFIG_NOP_TRACER=y
+-CONFIG_RING_BUFFER=y
+-CONFIG_TRACING=y
+-
+-#
+-# Tracers
+-#
+-# CONFIG_SCHED_TRACER is not set
+-# CONFIG_CONTEXT_SWITCH_TRACER is not set
+-# CONFIG_BOOT_TRACER is not set
+-# CONFIG_TRACE_BRANCH_PROFILING is not set
+-# CONFIG_FTRACE_STARTUP_TEST is not set
+-# CONFIG_BUILD_DOCSRC is not set
+-# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
+-# CONFIG_SAMPLES is not set
+ # CONFIG_DEBUG_RODATA is not set
+
+ #
+@@ -1495,112 +1362,56 @@
+ CONFIG_KEYS=y
+ CONFIG_KEYS_DEBUG_PROC_KEYS=y
+ # CONFIG_SECURITY is not set
+-# CONFIG_SECURITYFS is not set
+-# CONFIG_SECURITY_FILE_CAPABILITIES is not set
+ CONFIG_CRYPTO=y
+-
+-#
+-# Crypto core or helper
+-#
+-# CONFIG_CRYPTO_FIPS is not set
+ CONFIG_CRYPTO_ALGAPI=y
+-CONFIG_CRYPTO_ALGAPI2=y
+-CONFIG_CRYPTO_AEAD=y
+-CONFIG_CRYPTO_AEAD2=y
+ CONFIG_CRYPTO_BLKCIPHER=y
+-CONFIG_CRYPTO_BLKCIPHER2=y
+ CONFIG_CRYPTO_HASH=y
+-CONFIG_CRYPTO_HASH2=y
+-CONFIG_CRYPTO_RNG2=y
+ CONFIG_CRYPTO_MANAGER=y
+-CONFIG_CRYPTO_MANAGER2=y
+-# CONFIG_CRYPTO_GF128MUL is not set
+-CONFIG_CRYPTO_NULL=m
+-# CONFIG_CRYPTO_CRYPTD is not set
+-CONFIG_CRYPTO_AUTHENC=y
+-CONFIG_CRYPTO_TEST=m
+-
+-#
+-# Authenticated Encryption with Associated Data
+-#
+-# CONFIG_CRYPTO_CCM is not set
+-# CONFIG_CRYPTO_GCM is not set
+-# CONFIG_CRYPTO_SEQIV is not set
+-
+-#
+-# Block modes
+-#
+-CONFIG_CRYPTO_CBC=y
+-# CONFIG_CRYPTO_CTR is not set
+-# CONFIG_CRYPTO_CTS is not set
+-# CONFIG_CRYPTO_ECB is not set
+-# CONFIG_CRYPTO_LRW is not set
+-# CONFIG_CRYPTO_PCBC is not set
+-# CONFIG_CRYPTO_XTS is not set
+-
+-#
+-# Hash modes
+-#
+ CONFIG_CRYPTO_HMAC=y
+ # CONFIG_CRYPTO_XCBC is not set
+-
+-#
+-# Digest
+-#
+-CONFIG_CRYPTO_CRC32C=m
++CONFIG_CRYPTO_NULL=m
+ CONFIG_CRYPTO_MD4=m
+ CONFIG_CRYPTO_MD5=y
+-CONFIG_CRYPTO_MICHAEL_MIC=m
+-# CONFIG_CRYPTO_RMD128 is not set
+-# CONFIG_CRYPTO_RMD160 is not set
+-# CONFIG_CRYPTO_RMD256 is not set
+-# CONFIG_CRYPTO_RMD320 is not set
+ CONFIG_CRYPTO_SHA1=y
+ CONFIG_CRYPTO_SHA256=m
+ CONFIG_CRYPTO_SHA512=m
+-CONFIG_CRYPTO_TGR192=m
+ CONFIG_CRYPTO_WP512=m
+-
+-#
+-# Ciphers
+-#
+-CONFIG_CRYPTO_AES=m
+-CONFIG_CRYPTO_ANUBIS=m
+-CONFIG_CRYPTO_ARC4=m
++CONFIG_CRYPTO_TGR192=m
++# CONFIG_CRYPTO_GF128MUL is not set
++# CONFIG_CRYPTO_ECB is not set
++CONFIG_CRYPTO_CBC=y
++# CONFIG_CRYPTO_PCBC is not set
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_XTS is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_FCRYPT is not set
+ CONFIG_CRYPTO_BLOWFISH=m
+-# CONFIG_CRYPTO_CAMELLIA is not set
++CONFIG_CRYPTO_TWOFISH=m
++CONFIG_CRYPTO_TWOFISH_COMMON=m
++CONFIG_CRYPTO_SERPENT=m
++CONFIG_CRYPTO_AES=m
+ CONFIG_CRYPTO_CAST5=m
+ CONFIG_CRYPTO_CAST6=m
+-CONFIG_CRYPTO_DES=y
+-# CONFIG_CRYPTO_FCRYPT is not set
++CONFIG_CRYPTO_TEA=m
++CONFIG_CRYPTO_ARC4=m
+ CONFIG_CRYPTO_KHAZAD=m
+-# CONFIG_CRYPTO_SALSA20 is not set
++CONFIG_CRYPTO_ANUBIS=m
+ # CONFIG_CRYPTO_SEED is not set
+-CONFIG_CRYPTO_SERPENT=m
+-CONFIG_CRYPTO_TEA=m
+-CONFIG_CRYPTO_TWOFISH=m
+-CONFIG_CRYPTO_TWOFISH_COMMON=m
+-
+-#
+-# Compression
+-#
+ CONFIG_CRYPTO_DEFLATE=y
+-# CONFIG_CRYPTO_LZO is not set
+-
+-#
+-# Random Number Generation
+-#
+-# CONFIG_CRYPTO_ANSI_CPRNG is not set
++CONFIG_CRYPTO_MICHAEL_MIC=m
++CONFIG_CRYPTO_CRC32C=m
++# CONFIG_CRYPTO_CAMELLIA is not set
++CONFIG_CRYPTO_TEST=m
++# CONFIG_CRYPTO_AUTHENC is not set
+ # CONFIG_CRYPTO_HW is not set
+
+ #
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
+-CONFIG_GENERIC_FIND_LAST_BIT=y
+ CONFIG_CRC_CCITT=m
+ # CONFIG_CRC16 is not set
+-# CONFIG_CRC_T10DIF is not set
+ # CONFIG_CRC_ITU_T is not set
+ CONFIG_CRC32=y
+ # CONFIG_CRC7 is not set
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/parisc/hpux/fs.c linux-2.6.29-rc3.owrt/arch/parisc/hpux/fs.c
+--- linux-2.6.29.owrt/arch/parisc/hpux/fs.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/parisc/hpux/fs.c 2009-05-10 23:48:28.000000000 +0200
+@@ -137,6 +137,7 @@
+ error = count - buf.count;
+ }
+
++out_putf:
+ fput(file);
+ out:
+ return error;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/parisc/include/asm/assembly.h linux-2.6.29-rc3.owrt/arch/parisc/include/asm/assembly.h
+--- linux-2.6.29.owrt/arch/parisc/include/asm/assembly.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/parisc/include/asm/assembly.h 2009-05-10 23:48:28.000000000 +0200
+@@ -79,7 +79,6 @@
+
+ #include <asm/asm-offsets.h>
+ #include <asm/page.h>
+-#include <asm/types.h>
+
+ #include <asm/asmregs.h>
+
+@@ -130,27 +129,27 @@
+
+ /* Shift Left - note the r and t can NOT be the same! */
+ .macro shl r, sa, t
+- dep,z \r, 31-(\sa), 32-(\sa), \t
++ dep,z \r, 31-\sa, 32-\sa, \t
+ .endm
+
+ /* The PA 2.0 shift left */
+ .macro shlw r, sa, t
+- depw,z \r, 31-(\sa), 32-(\sa), \t
++ depw,z \r, 31-\sa, 32-\sa, \t
+ .endm
+
+ /* And the PA 2.0W shift left */
+ .macro shld r, sa, t
+- depd,z \r, 63-(\sa), 64-(\sa), \t
++ depd,z \r, 63-\sa, 64-\sa, \t
+ .endm
+
+ /* Shift Right - note the r and t can NOT be the same! */
+ .macro shr r, sa, t
+- extru \r, 31-(\sa), 32-(\sa), \t
++ extru \r, 31-\sa, 32-\sa, \t
+ .endm
+
+ /* pa20w version of shift right */
+ .macro shrd r, sa, t
+- extrd,u \r, 63-(\sa), 64-(\sa), \t
++ extrd,u \r, 63-\sa, 64-\sa, \t
+ .endm
+
+ /* load 32-bit 'value' into 'reg' compensating for the ldil
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/parisc/include/asm/dma-mapping.h linux-2.6.29-rc3.owrt/arch/parisc/include/asm/dma-mapping.h
+--- linux-2.6.29.owrt/arch/parisc/include/asm/dma-mapping.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/parisc/include/asm/dma-mapping.h 2009-05-10 23:48:28.000000000 +0200
+@@ -5,7 +5,7 @@
+ #include <asm/cacheflush.h>
+ #include <asm/scatterlist.h>
+
+-/* See Documentation/PCI/PCI-DMA-mapping.txt */
++/* See Documentation/DMA-mapping.txt */
+ struct hppa_dma_ops {
+ int (*dma_supported)(struct device *dev, u64 mask);
+ void *(*alloc_consistent)(struct device *dev, size_t size, dma_addr_t *iova, gfp_t flag);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/parisc/include/asm/io.h linux-2.6.29-rc3.owrt/arch/parisc/include/asm/io.h
+--- linux-2.6.29.owrt/arch/parisc/include/asm/io.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/parisc/include/asm/io.h 2009-05-10 23:48:28.000000000 +0200
+@@ -174,48 +174,15 @@
+ *(volatile unsigned long long __force *) addr = b;
+ }
+
+-static inline unsigned char readb(const volatile void __iomem *addr)
+-{
+- return __raw_readb(addr);
+-}
+-static inline unsigned short readw(const volatile void __iomem *addr)
+-{
+- return le16_to_cpu(__raw_readw(addr));
+-}
+-static inline unsigned int readl(const volatile void __iomem *addr)
+-{
+- return le32_to_cpu(__raw_readl(addr));
+-}
+-static inline unsigned long long readq(const volatile void __iomem *addr)
+-{
+- return le64_to_cpu(__raw_readq(addr));
+-}
+-
+-static inline void writeb(unsigned char b, volatile void __iomem *addr)
+-{
+- __raw_writeb(b, addr);
+-}
+-static inline void writew(unsigned short w, volatile void __iomem *addr)
+-{
+- __raw_writew(cpu_to_le16(w), addr);
+-}
+-static inline void writel(unsigned int l, volatile void __iomem *addr)
+-{
+- __raw_writel(cpu_to_le32(l), addr);
+-}
+-static inline void writeq(unsigned long long q, volatile void __iomem *addr)
+-{
+- __raw_writeq(cpu_to_le64(q), addr);
+-}
+-
+-#define readb readb
+-#define readw readw
+-#define readl readl
+-#define readq readq
+-#define writeb writeb
+-#define writew writew
+-#define writel writel
+-#define writeq writeq
++/* readb can never be const, so use __fswab instead of le*_to_cpu */
++#define readb(addr) __raw_readb(addr)
++#define readw(addr) le16_to_cpu(__raw_readw(addr))
++#define readl(addr) le32_to_cpu(__raw_readl(addr))
++#define readq(addr) le64_to_cpu(__raw_readq(addr))
++#define writeb(b, addr) __raw_writeb(b, addr)
++#define writew(b, addr) __raw_writew(cpu_to_le16(b), addr)
++#define writel(b, addr) __raw_writel(cpu_to_le32(b), addr)
++#define writeq(b, addr) __raw_writeq(cpu_to_le64(b), addr)
+
+ #define readb_relaxed(addr) readb(addr)
+ #define readw_relaxed(addr) readw(addr)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/parisc/include/asm/irq.h linux-2.6.29-rc3.owrt/arch/parisc/include/asm/irq.h
+--- linux-2.6.29.owrt/arch/parisc/include/asm/irq.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/parisc/include/asm/irq.h 2009-05-10 23:48:28.000000000 +0200
+@@ -49,7 +49,7 @@
+ extern unsigned long txn_affinity_addr(unsigned int irq, int cpu);
+
+ extern int cpu_claim_irq(unsigned int irq, struct irq_chip *, void *);
+-extern int cpu_check_affinity(unsigned int irq, const struct cpumask *dest);
++extern int cpu_check_affinity(unsigned int irq, cpumask_t *dest);
+
+ /* soft power switch support (power.c) */
+ extern struct tasklet_struct power_tasklet;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/parisc/include/asm/uaccess.h linux-2.6.29-rc3.owrt/arch/parisc/include/asm/uaccess.h
+--- linux-2.6.29.owrt/arch/parisc/include/asm/uaccess.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/parisc/include/asm/uaccess.h 2009-05-10 23:48:28.000000000 +0200
+@@ -241,7 +241,6 @@
+ #define __copy_to_user_inatomic __copy_to_user
+ #define __copy_from_user_inatomic __copy_from_user
+
+-struct pt_regs;
+ int fixup_exception(struct pt_regs *regs);
+
+ #endif /* __PARISC_UACCESS_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/parisc/kernel/cache.c linux-2.6.29-rc3.owrt/arch/parisc/kernel/cache.c
+--- linux-2.6.29.owrt/arch/parisc/kernel/cache.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/parisc/kernel/cache.c 2009-05-10 23:48:28.000000000 +0200
+@@ -551,7 +551,10 @@
+ {
+ int sr3;
+
+- BUG_ON(!vma->vm_mm->context);
++ if (!vma->vm_mm->context) {
++ BUG();
++ return;
++ }
+
+ sr3 = mfsp(3);
+ if (vma->vm_mm->context == sr3) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/parisc/kernel/entry.S linux-2.6.29-rc3.owrt/arch/parisc/kernel/entry.S
+--- linux-2.6.29.owrt/arch/parisc/kernel/entry.S 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/parisc/kernel/entry.S 2009-05-10 23:48:28.000000000 +0200
+@@ -368,7 +368,7 @@
+ * abstractions for the macros */
+ .macro EXTR reg1,start,length,reg2
+ #ifdef CONFIG_64BIT
+- extrd,u \reg1,32+(\start),\length,\reg2
++ extrd,u \reg1,32+\start,\length,\reg2
+ #else
+ extrw,u \reg1,\start,\length,\reg2
+ #endif
+@@ -376,7 +376,7 @@
+
+ .macro DEP reg1,start,length,reg2
+ #ifdef CONFIG_64BIT
+- depd \reg1,32+(\start),\length,\reg2
++ depd \reg1,32+\start,\length,\reg2
+ #else
+ depw \reg1,\start,\length,\reg2
+ #endif
+@@ -384,7 +384,7 @@
+
+ .macro DEPI val,start,length,reg
+ #ifdef CONFIG_64BIT
+- depdi \val,32+(\start),\length,\reg
++ depdi \val,32+\start,\length,\reg
+ #else
+ depwi \val,\start,\length,\reg
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/parisc/kernel/firmware.c linux-2.6.29-rc3.owrt/arch/parisc/kernel/firmware.c
+--- linux-2.6.29.owrt/arch/parisc/kernel/firmware.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/parisc/kernel/firmware.c 2009-05-10 23:48:28.000000000 +0200
+@@ -151,7 +151,7 @@
+ }
+
+ #ifdef CONFIG_64BIT
+-void __cpuinit set_firmware_width_unlocked(void)
++void __init set_firmware_width_unlocked(void)
+ {
+ int ret;
+
+@@ -168,7 +168,7 @@
+ * This function must be called before any pdc_* function that uses the
+ * convert_to_wide function.
+ */
+-void __cpuinit set_firmware_width(void)
++void __init set_firmware_width(void)
+ {
+ unsigned long flags;
+ spin_lock_irqsave(&pdc_lock, flags);
+@@ -176,11 +176,11 @@
+ spin_unlock_irqrestore(&pdc_lock, flags);
+ }
+ #else
+-void __cpuinit set_firmware_width_unlocked(void) {
++void __init set_firmware_width_unlocked(void) {
+ return;
+ }
+
+-void __cpuinit set_firmware_width(void) {
++void __init set_firmware_width(void) {
+ return;
+ }
+ #endif /*CONFIG_64BIT*/
+@@ -302,7 +302,7 @@
+ return retval;
+ }
+
+-int __cpuinit pdc_coproc_cfg_unlocked(struct pdc_coproc_cfg *pdc_coproc_info)
++int __init pdc_coproc_cfg_unlocked(struct pdc_coproc_cfg *pdc_coproc_info)
+ {
+ int ret;
+
+@@ -323,7 +323,7 @@
+ * This PDC call returns the presence and status of all the coprocessors
+ * attached to the processor.
+ */
+-int __cpuinit pdc_coproc_cfg(struct pdc_coproc_cfg *pdc_coproc_info)
++int __init pdc_coproc_cfg(struct pdc_coproc_cfg *pdc_coproc_info)
+ {
+ int ret;
+ unsigned long flags;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/parisc/kernel/irq.c linux-2.6.29-rc3.owrt/arch/parisc/kernel/irq.c
+--- linux-2.6.29.owrt/arch/parisc/kernel/irq.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/parisc/kernel/irq.c 2009-05-10 23:48:28.000000000 +0200
+@@ -112,7 +112,7 @@
+ }
+
+ #ifdef CONFIG_SMP
+-int cpu_check_affinity(unsigned int irq, const struct cpumask *dest)
++int cpu_check_affinity(unsigned int irq, cpumask_t *dest)
+ {
+ int cpu_dest;
+
+@@ -120,25 +120,23 @@
+ if (CHECK_IRQ_PER_CPU(irq)) {
+ /* Bad linux design decision. The mask has already
+ * been set; we must reset it */
+- cpumask_setall(&irq_desc[irq].affinity);
++ irq_desc[irq].affinity = CPU_MASK_ALL;
+ return -EINVAL;
+ }
+
+ /* whatever mask they set, we just allow one CPU */
+ cpu_dest = first_cpu(*dest);
++ *dest = cpumask_of_cpu(cpu_dest);
+
+- return cpu_dest;
++ return 0;
+ }
+
+ static void cpu_set_affinity_irq(unsigned int irq, const struct cpumask *dest)
+ {
+- int cpu_dest;
+-
+- cpu_dest = cpu_check_affinity(irq, dest);
+- if (cpu_dest < 0)
++ if (cpu_check_affinity(irq, dest))
+ return;
+
+- cpumask_copy(&irq_desc[irq].affinity, &cpumask_of_cpu(cpu_dest));
++ irq_desc[irq].affinity = *dest;
+ }
+ #endif
+
+@@ -297,7 +295,7 @@
+ unsigned long txn_affinity_addr(unsigned int irq, int cpu)
+ {
+ #ifdef CONFIG_SMP
+- cpumask_copy(&irq_desc[irq].affinity, cpumask_of(cpu));
++ irq_desc[irq].affinity = cpumask_of_cpu(cpu);
+ #endif
+
+ return per_cpu(cpu_data, cpu).txn_addr;
+@@ -354,7 +352,7 @@
+ irq = eirr_to_irq(eirr_val);
+
+ #ifdef CONFIG_SMP
+- cpumask_copy(&dest, &irq_desc[irq].affinity);
++ dest = irq_desc[irq].affinity;
+ if (CHECK_IRQ_PER_CPU(irq_desc[irq].status) &&
+ !cpu_isset(smp_processor_id(), dest)) {
+ int cpu = first_cpu(dest);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/parisc/kernel/pci-dma.c linux-2.6.29-rc3.owrt/arch/parisc/kernel/pci-dma.c
+--- linux-2.6.29.owrt/arch/parisc/kernel/pci-dma.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/parisc/kernel/pci-dma.c 2009-05-10 23:48:28.000000000 +0200
+@@ -2,7 +2,7 @@
+ ** PARISC 1.1 Dynamic DMA mapping support.
+ ** This implementation is for PA-RISC platforms that do not support
+ ** I/O TLBs (aka DMA address translation hardware).
+-** See Documentation/PCI/PCI-DMA-mapping.txt for interface definitions.
++** See Documentation/DMA-mapping.txt for interface definitions.
+ **
+ ** (c) Copyright 1999,2000 Hewlett-Packard Company
+ ** (c) Copyright 2000 Grant Grundler
+@@ -447,7 +447,10 @@
+
+ static dma_addr_t pa11_dma_map_single(struct device *dev, void *addr, size_t size, enum dma_data_direction direction)
+ {
+- BUG_ON(direction == DMA_NONE);
++ if (direction == DMA_NONE) {
++ printk(KERN_ERR "pa11_dma_map_single(PCI_DMA_NONE) called by %p\n", __builtin_return_address(0));
++ BUG();
++ }
+
+ flush_kernel_dcache_range((unsigned long) addr, size);
+ return virt_to_phys(addr);
+@@ -455,7 +458,10 @@
+
+ static void pa11_dma_unmap_single(struct device *dev, dma_addr_t dma_handle, size_t size, enum dma_data_direction direction)
+ {
+- BUG_ON(direction == DMA_NONE);
++ if (direction == DMA_NONE) {
++ printk(KERN_ERR "pa11_dma_unmap_single(PCI_DMA_NONE) called by %p\n", __builtin_return_address(0));
++ BUG();
++ }
+
+ if (direction == DMA_TO_DEVICE)
+ return;
+@@ -474,7 +480,8 @@
+ {
+ int i;
+
+- BUG_ON(direction == DMA_NONE);
++ if (direction == DMA_NONE)
++ BUG();
+
+ for (i = 0; i < nents; i++, sglist++ ) {
+ unsigned long vaddr = sg_virt_addr(sglist);
+@@ -489,7 +496,8 @@
+ {
+ int i;
+
+- BUG_ON(direction == DMA_NONE);
++ if (direction == DMA_NONE)
++ BUG();
+
+ if (direction == DMA_TO_DEVICE)
+ return;
+@@ -503,14 +511,16 @@
+
+ static void pa11_dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, unsigned long offset, size_t size, enum dma_data_direction direction)
+ {
+- BUG_ON(direction == DMA_NONE);
++ if (direction == DMA_NONE)
++ BUG();
+
+ flush_kernel_dcache_range((unsigned long) phys_to_virt(dma_handle) + offset, size);
+ }
+
+ static void pa11_dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, unsigned long offset, size_t size, enum dma_data_direction direction)
+ {
+- BUG_ON(direction == DMA_NONE);
++ if (direction == DMA_NONE)
++ BUG();
+
+ flush_kernel_dcache_range((unsigned long) phys_to_virt(dma_handle) + offset, size);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/parisc/mm/init.c linux-2.6.29-rc3.owrt/arch/parisc/mm/init.c
+--- linux-2.6.29.owrt/arch/parisc/mm/init.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/parisc/mm/init.c 2009-05-10 23:48:28.000000000 +0200
+@@ -304,8 +304,10 @@
+ */
+ max_low_pfn = max_pfn;
+
+- /* bootmap sizing messed up? */
+- BUG_ON((bootmap_pfn - bootmap_start_pfn) != bootmap_pages);
++ if ((bootmap_pfn - bootmap_start_pfn) != bootmap_pages) {
++ printk(KERN_WARNING "WARNING! bootmap sizing is messed up!\n");
++ BUG();
++ }
+
+ /* reserve PAGE0 pdc memory, kernel text/data/bss & bootmap */
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/boot/dts/mpc8313erdb.dts linux-2.6.29-rc3.owrt/arch/powerpc/boot/dts/mpc8313erdb.dts
+--- linux-2.6.29.owrt/arch/powerpc/boot/dts/mpc8313erdb.dts 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/boot/dts/mpc8313erdb.dts 2009-05-10 23:48:28.000000000 +0200
+@@ -191,8 +191,7 @@
+ interrupts = <37 0x8 36 0x8 35 0x8>;
+ interrupt-parent = <&ipic>;
+ tbi-handle = < &tbi0 >;
+- /* Vitesse 7385 isn't on the MDIO bus */
+- fixed-link = <1 1 1000 0 0>;
++ phy-handle = < &phy1 >;
+ fsl,magic-packet;
+
+ mdio@24520 {
+@@ -200,6 +199,12 @@
+ #size-cells = <0>;
+ compatible = "fsl,gianfar-mdio";
+ reg = <0x24520 0x20>;
++ phy1: ethernet-phy@1 {
++ interrupt-parent = <&ipic>;
++ interrupts = <19 0x8>;
++ reg = <0x1>;
++ device_type = "ethernet-phy";
++ };
+ phy4: ethernet-phy@4 {
+ interrupt-parent = <&ipic>;
+ interrupts = <20 0x8>;
+@@ -214,8 +219,6 @@
+ };
+
+ enet1: ethernet@25000 {
+- #address-cells = <1>;
+- #size-cells = <1>;
+ cell-index = <1>;
+ device_type = "network";
+ model = "eTSEC";
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/configs/40x/virtex_defconfig linux-2.6.29-rc3.owrt/arch/powerpc/configs/40x/virtex_defconfig
+--- linux-2.6.29.owrt/arch/powerpc/configs/40x/virtex_defconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/configs/40x/virtex_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -686,7 +686,7 @@
+ CONFIG_SERIAL_CORE=y
+ CONFIG_SERIAL_CORE_CONSOLE=y
+ # CONFIG_SERIAL_JSM is not set
+-CONFIG_SERIAL_OF_PLATFORM=y
++# CONFIG_SERIAL_OF_PLATFORM is not set
+ # CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL is not set
+ CONFIG_UNIX98_PTYS=y
+ # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/configs/44x/virtex5_defconfig linux-2.6.29-rc3.owrt/arch/powerpc/configs/44x/virtex5_defconfig
+--- linux-2.6.29.owrt/arch/powerpc/configs/44x/virtex5_defconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/configs/44x/virtex5_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -691,7 +691,7 @@
+ CONFIG_SERIAL_CORE=y
+ CONFIG_SERIAL_CORE_CONSOLE=y
+ # CONFIG_SERIAL_JSM is not set
+-CONFIG_SERIAL_OF_PLATFORM=y
++# CONFIG_SERIAL_OF_PLATFORM is not set
+ # CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL is not set
+ CONFIG_UNIX98_PTYS=y
+ # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/configs/52xx/cm5200_defconfig linux-2.6.29-rc3.owrt/arch/powerpc/configs/52xx/cm5200_defconfig
+--- linux-2.6.29.owrt/arch/powerpc/configs/52xx/cm5200_defconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/configs/52xx/cm5200_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-rc2
+-# Mon Jan 26 21:41:58 2009
++# Linux kernel version: 2.6.28-rc4
++# Thu Nov 13 02:12:40 2008
+ #
+ # CONFIG_PPC64 is not set
+
+@@ -43,7 +43,7 @@
+ CONFIG_PPC=y
+ CONFIG_EARLY_PRINTK=y
+ CONFIG_GENERIC_NVRAM=y
+-CONFIG_SCHED_OMIT_FRAME_POINTER=y
++CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+ CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+ CONFIG_PPC_OF=y
+ CONFIG_OF=y
+@@ -71,23 +71,14 @@
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
+ # CONFIG_AUDIT is not set
+-
+-#
+-# RCU Subsystem
+-#
+-CONFIG_CLASSIC_RCU=y
+-# CONFIG_TREE_RCU is not set
+-# CONFIG_PREEMPT_RCU is not set
+-# CONFIG_TREE_RCU_TRACE is not set
+-# CONFIG_PREEMPT_RCU_TRACE is not set
+ # CONFIG_IKCONFIG is not set
+ CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_CGROUPS is not set
+ CONFIG_GROUP_SCHED=y
+ CONFIG_FAIR_GROUP_SCHED=y
+ # CONFIG_RT_GROUP_SCHED is not set
+ CONFIG_USER_SCHED=y
+ # CONFIG_CGROUP_SCHED is not set
+-# CONFIG_CGROUPS is not set
+ CONFIG_SYSFS_DEPRECATED=y
+ CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
+@@ -119,6 +110,7 @@
+ CONFIG_SLUB=y
+ # CONFIG_SLOB is not set
+ # CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
+ CONFIG_HAVE_OPROFILE=y
+ CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
+ CONFIG_HAVE_IOREMAP_PROT=y
+@@ -129,11 +121,13 @@
+ # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+ # CONFIG_MODULES is not set
+ CONFIG_BLOCK=y
+ # CONFIG_LBD is not set
+ # CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
+ # CONFIG_BLK_DEV_BSG is not set
+ # CONFIG_BLK_DEV_INTEGRITY is not set
+
+@@ -149,6 +143,7 @@
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
++CONFIG_CLASSIC_RCU=y
+ # CONFIG_FREEZER is not set
+
+ #
+@@ -187,8 +182,9 @@
+ # CONFIG_TAU is not set
+ # CONFIG_FSL_ULI1575 is not set
+ CONFIG_PPC_BESTCOMM=y
++# CONFIG_PPC_BESTCOMM_ATA is not set
+ CONFIG_PPC_BESTCOMM_FEC=y
+-# CONFIG_SIMPLE_GPIO is not set
++# CONFIG_PPC_BESTCOMM_GEN_BD is not set
+
+ #
+ # Kernel options
+@@ -215,7 +211,6 @@
+ CONFIG_ARCH_HAS_WALK_MEMORY=y
+ CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
+ # CONFIG_KEXEC is not set
+-# CONFIG_CRASH_DUMP is not set
+ CONFIG_ARCH_FLATMEM_ENABLE=y
+ CONFIG_ARCH_POPULATES_NODE_MAP=y
+ CONFIG_SELECT_MEMORY_MODEL=y
+@@ -227,14 +222,12 @@
+ CONFIG_PAGEFLAGS_EXTENDED=y
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ CONFIG_MIGRATION=y
++# CONFIG_RESOURCES_64BIT is not set
+ # CONFIG_PHYS_ADDR_T_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=1
+ CONFIG_BOUNCE=y
+ CONFIG_VIRT_TO_BUS=y
+ CONFIG_UNEVICTABLE_LRU=y
+-CONFIG_PPC_4K_PAGES=y
+-# CONFIG_PPC_16K_PAGES is not set
+-# CONFIG_PPC_64K_PAGES is not set
+ CONFIG_FORCE_MAX_ZONEORDER=11
+ CONFIG_PROC_DEVICETREE=y
+ # CONFIG_CMDLINE_BOOL is not set
+@@ -275,7 +268,6 @@
+ #
+ # Networking options
+ #
+-CONFIG_COMPAT_NET_DEV_OPS=y
+ CONFIG_PACKET=y
+ # CONFIG_PACKET_MMAP is not set
+ CONFIG_UNIX=y
+@@ -332,7 +324,6 @@
+ # CONFIG_ECONET is not set
+ # CONFIG_WAN_ROUTER is not set
+ # CONFIG_NET_SCHED is not set
+-# CONFIG_DCB is not set
+
+ #
+ # Network testing
+@@ -345,7 +336,6 @@
+ # CONFIG_AF_RXRPC is not set
+ # CONFIG_PHONET is not set
+ # CONFIG_WIRELESS is not set
+-# CONFIG_WIMAX is not set
+ # CONFIG_RFKILL is not set
+ # CONFIG_NET_9P is not set
+
+@@ -437,12 +427,6 @@
+ # CONFIG_MTD_ONENAND is not set
+
+ #
+-# LPDDR flash memory drivers
+-#
+-# CONFIG_MTD_LPDDR is not set
+-# CONFIG_MTD_QINFO_PROBE is not set
+-
+-#
+ # UBI - Unsorted block images
+ #
+ # CONFIG_MTD_UBI is not set
+@@ -530,9 +514,6 @@
+ # CONFIG_BROADCOM_PHY is not set
+ # CONFIG_ICPLUS_PHY is not set
+ # CONFIG_REALTEK_PHY is not set
+-# CONFIG_NATIONAL_PHY is not set
+-# CONFIG_STE10XP is not set
+-# CONFIG_LSI_ET1011C_PHY is not set
+ # CONFIG_FIXED_PHY is not set
+ # CONFIG_MDIO_BITBANG is not set
+ CONFIG_NET_ETHERNET=y
+@@ -558,10 +539,6 @@
+ # CONFIG_IWLWIFI_LEDS is not set
+
+ #
+-# Enable WiMAX (Networking options) to see the WiMAX drivers
+-#
+-
+-#
+ # USB Network Adapters
+ #
+ # CONFIG_USB_CATC is not set
+@@ -611,10 +588,8 @@
+ CONFIG_SERIAL_MPC52xx_CONSOLE=y
+ CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD=57600
+ CONFIG_UNIX98_PTYS=y
+-# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+ CONFIG_LEGACY_PTYS=y
+ CONFIG_LEGACY_PTY_COUNT=256
+-# CONFIG_HVC_UDBG is not set
+ # CONFIG_IPMI_HANDLER is not set
+ # CONFIG_HW_RANDOM is not set
+ # CONFIG_NVRAM is not set
+@@ -654,6 +629,8 @@
+ # Miscellaneous I2C Chip support
+ #
+ # CONFIG_DS1682 is not set
++# CONFIG_EEPROM_AT24 is not set
++# CONFIG_EEPROM_LEGACY is not set
+ # CONFIG_SENSORS_PCF8574 is not set
+ # CONFIG_PCF8575 is not set
+ # CONFIG_SENSORS_PCA9539 is not set
+@@ -698,12 +675,10 @@
+ # CONFIG_MFD_CORE is not set
+ # CONFIG_MFD_SM501 is not set
+ # CONFIG_HTC_PASIC3 is not set
+-# CONFIG_TWL4030_CORE is not set
+ # CONFIG_MFD_TMIO is not set
+ # CONFIG_PMIC_DA903X is not set
+ # CONFIG_MFD_WM8400 is not set
+ # CONFIG_MFD_WM8350_I2C is not set
+-# CONFIG_MFD_PCF50633 is not set
+ # CONFIG_REGULATOR is not set
+
+ #
+@@ -761,7 +736,6 @@
+ # USB Host Controller Drivers
+ #
+ # CONFIG_USB_C67X00_HCD is not set
+-# CONFIG_USB_OXU210HP_HCD is not set
+ # CONFIG_USB_ISP116X_HCD is not set
+ # CONFIG_USB_ISP1760_HCD is not set
+ CONFIG_USB_OHCI_HCD=y
+@@ -786,17 +760,18 @@
+ # CONFIG_USB_TMC is not set
+
+ #
+-# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+
+ #
+-# see USB_STORAGE Help for more information
++# may also be needed; see USB_STORAGE Help for more information
+ #
+ CONFIG_USB_STORAGE=y
+ # CONFIG_USB_STORAGE_DEBUG is not set
+ # CONFIG_USB_STORAGE_DATAFAB is not set
+ # CONFIG_USB_STORAGE_FREECOM is not set
+ # CONFIG_USB_STORAGE_ISD200 is not set
++# CONFIG_USB_STORAGE_DPCM is not set
+ # CONFIG_USB_STORAGE_USBAT is not set
+ # CONFIG_USB_STORAGE_SDDR09 is not set
+ # CONFIG_USB_STORAGE_SDDR55 is not set
+@@ -842,10 +817,6 @@
+ # CONFIG_USB_ISIGHTFW is not set
+ # CONFIG_USB_VST is not set
+ # CONFIG_USB_GADGET is not set
+-
+-#
+-# OTG and related infrastructure
+-#
+ # CONFIG_MMC is not set
+ # CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS is not set
+@@ -855,6 +826,7 @@
+ # CONFIG_DMADEVICES is not set
+ # CONFIG_UIO is not set
+ # CONFIG_STAGING is not set
++CONFIG_STAGING_EXCLUDE_BUILD=y
+
+ #
+ # File systems
+@@ -875,7 +847,6 @@
+ CONFIG_FILE_LOCKING=y
+ # CONFIG_XFS_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_BTRFS_FS is not set
+ CONFIG_DNOTIFY=y
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+@@ -912,7 +883,10 @@
+ # CONFIG_TMPFS_POSIX_ACL is not set
+ # CONFIG_HUGETLB_PAGE is not set
+ # CONFIG_CONFIGFS_FS is not set
+-CONFIG_MISC_FILESYSTEMS=y
++
++#
++# Miscellaneous filesystems
++#
+ # CONFIG_ADFS_FS is not set
+ # CONFIG_AFFS_FS is not set
+ # CONFIG_HFS_FS is not set
+@@ -932,7 +906,6 @@
+ CONFIG_JFFS2_RTIME=y
+ # CONFIG_JFFS2_RUBIN is not set
+ CONFIG_CRAMFS=y
+-# CONFIG_SQUASHFS is not set
+ # CONFIG_VXFS_FS is not set
+ # CONFIG_MINIX_FS is not set
+ # CONFIG_OMFS_FS is not set
+@@ -1029,7 +1002,6 @@
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
+-CONFIG_GENERIC_FIND_LAST_BIT=y
+ # CONFIG_CRC_CCITT is not set
+ # CONFIG_CRC16 is not set
+ # CONFIG_CRC_T10DIF is not set
+@@ -1081,7 +1053,6 @@
+ # CONFIG_DEBUG_MEMORY_INIT is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+-# CONFIG_DEBUG_NOTIFIERS is not set
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
+ # CONFIG_RCU_CPU_STALL_DETECTOR is not set
+@@ -1090,8 +1061,6 @@
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_LATENCYTOP is not set
+ CONFIG_HAVE_FUNCTION_TRACER=y
+-CONFIG_HAVE_DYNAMIC_FTRACE=y
+-CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
+
+ #
+ # Tracers
+@@ -1100,13 +1069,11 @@
+ # CONFIG_SCHED_TRACER is not set
+ # CONFIG_CONTEXT_SWITCH_TRACER is not set
+ # CONFIG_BOOT_TRACER is not set
+-# CONFIG_TRACE_BRANCH_PROFILING is not set
+ # CONFIG_STACK_TRACER is not set
+ # CONFIG_DYNAMIC_PRINTK_DEBUG is not set
+ # CONFIG_SAMPLES is not set
+ CONFIG_HAVE_ARCH_KGDB=y
+ # CONFIG_KGDB is not set
+-CONFIG_PRINT_STACK_DEPTH=64
+ # CONFIG_DEBUG_STACKOVERFLOW is not set
+ # CONFIG_DEBUG_STACK_USAGE is not set
+ # CONFIG_DEBUG_PAGEALLOC is not set
+@@ -1133,15 +1100,11 @@
+ #
+ # CONFIG_CRYPTO_FIPS is not set
+ CONFIG_CRYPTO_ALGAPI=y
+-CONFIG_CRYPTO_ALGAPI2=y
+-CONFIG_CRYPTO_AEAD2=y
++CONFIG_CRYPTO_AEAD=y
+ CONFIG_CRYPTO_BLKCIPHER=y
+-CONFIG_CRYPTO_BLKCIPHER2=y
+ CONFIG_CRYPTO_HASH=y
+-CONFIG_CRYPTO_HASH2=y
+-CONFIG_CRYPTO_RNG2=y
++CONFIG_CRYPTO_RNG=y
+ CONFIG_CRYPTO_MANAGER=y
+-CONFIG_CRYPTO_MANAGER2=y
+ # CONFIG_CRYPTO_GF128MUL is not set
+ # CONFIG_CRYPTO_NULL is not set
+ # CONFIG_CRYPTO_CRYPTD is not set
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/configs/52xx/lite5200b_defconfig linux-2.6.29-rc3.owrt/arch/powerpc/configs/52xx/lite5200b_defconfig
+--- linux-2.6.29.owrt/arch/powerpc/configs/52xx/lite5200b_defconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/configs/52xx/lite5200b_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-rc2
+-# Mon Jan 26 21:41:14 2009
++# Linux kernel version: 2.6.28-rc4
++# Thu Nov 13 02:10:16 2008
+ #
+ # CONFIG_PPC64 is not set
+
+@@ -43,7 +43,7 @@
+ CONFIG_PPC=y
+ CONFIG_EARLY_PRINTK=y
+ CONFIG_GENERIC_NVRAM=y
+-CONFIG_SCHED_OMIT_FRAME_POINTER=y
++CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+ CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+ CONFIG_PPC_OF=y
+ CONFIG_OF=y
+@@ -72,23 +72,14 @@
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
+ # CONFIG_AUDIT is not set
+-
+-#
+-# RCU Subsystem
+-#
+-CONFIG_CLASSIC_RCU=y
+-# CONFIG_TREE_RCU is not set
+-# CONFIG_PREEMPT_RCU is not set
+-# CONFIG_TREE_RCU_TRACE is not set
+-# CONFIG_PREEMPT_RCU_TRACE is not set
+ # CONFIG_IKCONFIG is not set
+ CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_CGROUPS is not set
+ CONFIG_GROUP_SCHED=y
+ # CONFIG_FAIR_GROUP_SCHED is not set
+ # CONFIG_RT_GROUP_SCHED is not set
+ CONFIG_USER_SCHED=y
+ # CONFIG_CGROUP_SCHED is not set
+-# CONFIG_CGROUPS is not set
+ CONFIG_SYSFS_DEPRECATED=y
+ CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
+@@ -121,6 +112,7 @@
+ CONFIG_SLUB=y
+ # CONFIG_SLOB is not set
+ # CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
+ CONFIG_HAVE_OPROFILE=y
+ CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
+ CONFIG_HAVE_IOREMAP_PROT=y
+@@ -131,6 +123,7 @@
+ # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+ CONFIG_MODULES=y
+ # CONFIG_MODULE_FORCE_LOAD is not set
+@@ -138,9 +131,11 @@
+ # CONFIG_MODULE_FORCE_UNLOAD is not set
+ # CONFIG_MODVERSIONS is not set
+ # CONFIG_MODULE_SRCVERSION_ALL is not set
++CONFIG_KMOD=y
+ CONFIG_BLOCK=y
+ # CONFIG_LBD is not set
+ # CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
+ # CONFIG_BLK_DEV_BSG is not set
+ # CONFIG_BLK_DEV_INTEGRITY is not set
+
+@@ -156,6 +151,7 @@
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
++CONFIG_CLASSIC_RCU=y
+ CONFIG_FREEZER=y
+
+ #
+@@ -196,7 +192,7 @@
+ CONFIG_PPC_BESTCOMM=y
+ CONFIG_PPC_BESTCOMM_ATA=y
+ CONFIG_PPC_BESTCOMM_FEC=y
+-# CONFIG_SIMPLE_GPIO is not set
++CONFIG_PPC_BESTCOMM_GEN_BD=y
+
+ #
+ # Kernel options
+@@ -224,7 +220,6 @@
+ CONFIG_ARCH_HAS_WALK_MEMORY=y
+ CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
+ # CONFIG_KEXEC is not set
+-# CONFIG_CRASH_DUMP is not set
+ CONFIG_ARCH_FLATMEM_ENABLE=y
+ CONFIG_ARCH_POPULATES_NODE_MAP=y
+ CONFIG_SELECT_MEMORY_MODEL=y
+@@ -236,14 +231,12 @@
+ CONFIG_PAGEFLAGS_EXTENDED=y
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ CONFIG_MIGRATION=y
++# CONFIG_RESOURCES_64BIT is not set
+ # CONFIG_PHYS_ADDR_T_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=1
+ CONFIG_BOUNCE=y
+ CONFIG_VIRT_TO_BUS=y
+ CONFIG_UNEVICTABLE_LRU=y
+-CONFIG_PPC_4K_PAGES=y
+-# CONFIG_PPC_16K_PAGES is not set
+-# CONFIG_PPC_64K_PAGES is not set
+ CONFIG_FORCE_MAX_ZONEORDER=11
+ CONFIG_PROC_DEVICETREE=y
+ # CONFIG_CMDLINE_BOOL is not set
+@@ -271,7 +264,6 @@
+ # CONFIG_PCI_MSI is not set
+ CONFIG_PCI_LEGACY=y
+ # CONFIG_PCI_DEBUG is not set
+-# CONFIG_PCI_STUB is not set
+ # CONFIG_PCCARD is not set
+ # CONFIG_HOTPLUG_PCI is not set
+ # CONFIG_HAS_RAPIDIO is not set
+@@ -294,7 +286,6 @@
+ #
+ # Networking options
+ #
+-CONFIG_COMPAT_NET_DEV_OPS=y
+ CONFIG_PACKET=y
+ # CONFIG_PACKET_MMAP is not set
+ CONFIG_UNIX=y
+@@ -351,7 +342,6 @@
+ # CONFIG_ECONET is not set
+ # CONFIG_WAN_ROUTER is not set
+ # CONFIG_NET_SCHED is not set
+-# CONFIG_DCB is not set
+
+ #
+ # Network testing
+@@ -364,7 +354,6 @@
+ # CONFIG_AF_RXRPC is not set
+ # CONFIG_PHONET is not set
+ # CONFIG_WIRELESS is not set
+-# CONFIG_WIMAX is not set
+ # CONFIG_RFKILL is not set
+ # CONFIG_NET_9P is not set
+
+@@ -407,19 +396,13 @@
+ # CONFIG_BLK_DEV_HD is not set
+ CONFIG_MISC_DEVICES=y
+ # CONFIG_PHANTOM is not set
++# CONFIG_EEPROM_93CX6 is not set
+ # CONFIG_SGI_IOC4 is not set
+ # CONFIG_TIFM_CORE is not set
+ # CONFIG_ICS932S401 is not set
+ # CONFIG_ENCLOSURE_SERVICES is not set
+ # CONFIG_HP_ILO is not set
+ # CONFIG_C2PORT is not set
+-
+-#
+-# EEPROM support
+-#
+-# CONFIG_EEPROM_AT24 is not set
+-# CONFIG_EEPROM_LEGACY is not set
+-# CONFIG_EEPROM_93CX6 is not set
+ CONFIG_HAVE_IDE=y
+ # CONFIG_IDE is not set
+
+@@ -462,7 +445,6 @@
+ # CONFIG_SCSI_SRP_ATTRS is not set
+ CONFIG_SCSI_LOWLEVEL=y
+ # CONFIG_ISCSI_TCP is not set
+-# CONFIG_SCSI_CXGB3_ISCSI is not set
+ # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+ # CONFIG_SCSI_3W_9XXX is not set
+ # CONFIG_SCSI_ACARD is not set
+@@ -479,8 +461,6 @@
+ # CONFIG_MEGARAID_SAS is not set
+ # CONFIG_SCSI_HPTIOP is not set
+ # CONFIG_SCSI_BUSLOGIC is not set
+-# CONFIG_LIBFC is not set
+-# CONFIG_FCOE is not set
+ # CONFIG_SCSI_DMX3191D is not set
+ # CONFIG_SCSI_EATA is not set
+ # CONFIG_SCSI_FUTURE_DOMAIN is not set
+@@ -600,9 +580,6 @@
+ # CONFIG_BROADCOM_PHY is not set
+ # CONFIG_ICPLUS_PHY is not set
+ # CONFIG_REALTEK_PHY is not set
+-# CONFIG_NATIONAL_PHY is not set
+-# CONFIG_STE10XP is not set
+-# CONFIG_LSI_ET1011C_PHY is not set
+ # CONFIG_FIXED_PHY is not set
+ # CONFIG_MDIO_BITBANG is not set
+ CONFIG_NET_ETHERNET=y
+@@ -649,7 +626,6 @@
+ # CONFIG_JME is not set
+ CONFIG_NETDEV_10000=y
+ # CONFIG_CHELSIO_T1 is not set
+-CONFIG_CHELSIO_T3_DEPENDS=y
+ # CONFIG_CHELSIO_T3 is not set
+ # CONFIG_ENIC is not set
+ # CONFIG_IXGBE is not set
+@@ -672,10 +648,6 @@
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
+ # CONFIG_IWLWIFI_LEDS is not set
+-
+-#
+-# Enable WiMAX (Networking options) to see the WiMAX drivers
+-#
+ # CONFIG_WAN is not set
+ # CONFIG_FDDI is not set
+ # CONFIG_HIPPI is not set
+@@ -723,10 +695,8 @@
+ CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD=115200
+ # CONFIG_SERIAL_JSM is not set
+ CONFIG_UNIX98_PTYS=y
+-# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+ CONFIG_LEGACY_PTYS=y
+ CONFIG_LEGACY_PTY_COUNT=256
+-# CONFIG_HVC_UDBG is not set
+ # CONFIG_IPMI_HANDLER is not set
+ # CONFIG_HW_RANDOM is not set
+ # CONFIG_NVRAM is not set
+@@ -792,6 +762,8 @@
+ # Miscellaneous I2C Chip support
+ #
+ # CONFIG_DS1682 is not set
++# CONFIG_EEPROM_AT24 is not set
++# CONFIG_EEPROM_LEGACY is not set
+ # CONFIG_SENSORS_PCF8574 is not set
+ # CONFIG_PCF8575 is not set
+ # CONFIG_SENSORS_PCA9539 is not set
+@@ -824,12 +796,10 @@
+ # CONFIG_MFD_CORE is not set
+ # CONFIG_MFD_SM501 is not set
+ # CONFIG_HTC_PASIC3 is not set
+-# CONFIG_TWL4030_CORE is not set
+ # CONFIG_MFD_TMIO is not set
+ # CONFIG_PMIC_DA903X is not set
+ # CONFIG_MFD_WM8400 is not set
+ # CONFIG_MFD_WM8350_I2C is not set
+-# CONFIG_MFD_PCF50633 is not set
+ # CONFIG_REGULATOR is not set
+
+ #
+@@ -876,13 +846,9 @@
+ #
+
+ #
+-# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+ # CONFIG_USB_GADGET is not set
+-
+-#
+-# OTG and related infrastructure
+-#
+ # CONFIG_UWB is not set
+ # CONFIG_MMC is not set
+ # CONFIG_MEMSTICK is not set
+@@ -894,6 +860,7 @@
+ # CONFIG_DMADEVICES is not set
+ # CONFIG_UIO is not set
+ # CONFIG_STAGING is not set
++CONFIG_STAGING_EXCLUDE_BUILD=y
+
+ #
+ # File systems
+@@ -914,7 +881,6 @@
+ CONFIG_FILE_LOCKING=y
+ # CONFIG_XFS_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_BTRFS_FS is not set
+ CONFIG_DNOTIFY=y
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+@@ -948,7 +914,10 @@
+ # CONFIG_TMPFS_POSIX_ACL is not set
+ # CONFIG_HUGETLB_PAGE is not set
+ # CONFIG_CONFIGFS_FS is not set
+-CONFIG_MISC_FILESYSTEMS=y
++
++#
++# Miscellaneous filesystems
++#
+ # CONFIG_ADFS_FS is not set
+ # CONFIG_AFFS_FS is not set
+ # CONFIG_HFS_FS is not set
+@@ -957,7 +926,6 @@
+ # CONFIG_BFS_FS is not set
+ # CONFIG_EFS_FS is not set
+ # CONFIG_CRAMFS is not set
+-# CONFIG_SQUASHFS is not set
+ # CONFIG_VXFS_FS is not set
+ # CONFIG_MINIX_FS is not set
+ # CONFIG_OMFS_FS is not set
+@@ -999,7 +967,6 @@
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
+-CONFIG_GENERIC_FIND_LAST_BIT=y
+ # CONFIG_CRC_CCITT is not set
+ # CONFIG_CRC16 is not set
+ # CONFIG_CRC_T10DIF is not set
+@@ -1049,7 +1016,6 @@
+ # CONFIG_DEBUG_MEMORY_INIT is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+-# CONFIG_DEBUG_NOTIFIERS is not set
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
+ # CONFIG_RCU_CPU_STALL_DETECTOR is not set
+@@ -1058,8 +1024,6 @@
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_LATENCYTOP is not set
+ CONFIG_HAVE_FUNCTION_TRACER=y
+-CONFIG_HAVE_DYNAMIC_FTRACE=y
+-CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
+
+ #
+ # Tracers
+@@ -1068,13 +1032,11 @@
+ # CONFIG_SCHED_TRACER is not set
+ # CONFIG_CONTEXT_SWITCH_TRACER is not set
+ # CONFIG_BOOT_TRACER is not set
+-# CONFIG_TRACE_BRANCH_PROFILING is not set
+ # CONFIG_STACK_TRACER is not set
+ # CONFIG_DYNAMIC_PRINTK_DEBUG is not set
+ # CONFIG_SAMPLES is not set
+ CONFIG_HAVE_ARCH_KGDB=y
+ # CONFIG_KGDB is not set
+-CONFIG_PRINT_STACK_DEPTH=64
+ # CONFIG_DEBUG_STACKOVERFLOW is not set
+ # CONFIG_DEBUG_STACK_USAGE is not set
+ # CONFIG_DEBUG_PAGEALLOC is not set
+@@ -1101,15 +1063,11 @@
+ #
+ # CONFIG_CRYPTO_FIPS is not set
+ CONFIG_CRYPTO_ALGAPI=y
+-CONFIG_CRYPTO_ALGAPI2=y
+-CONFIG_CRYPTO_AEAD2=y
++CONFIG_CRYPTO_AEAD=y
+ CONFIG_CRYPTO_BLKCIPHER=y
+-CONFIG_CRYPTO_BLKCIPHER2=y
+ CONFIG_CRYPTO_HASH=y
+-CONFIG_CRYPTO_HASH2=y
+-CONFIG_CRYPTO_RNG2=y
++CONFIG_CRYPTO_RNG=y
+ CONFIG_CRYPTO_MANAGER=y
+-CONFIG_CRYPTO_MANAGER2=y
+ # CONFIG_CRYPTO_GF128MUL is not set
+ # CONFIG_CRYPTO_NULL is not set
+ # CONFIG_CRYPTO_CRYPTD is not set
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/configs/52xx/motionpro_defconfig linux-2.6.29-rc3.owrt/arch/powerpc/configs/52xx/motionpro_defconfig
+--- linux-2.6.29.owrt/arch/powerpc/configs/52xx/motionpro_defconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/configs/52xx/motionpro_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-rc2
+-# Mon Jan 26 21:42:29 2009
++# Linux kernel version: 2.6.28-rc4
++# Thu Nov 13 02:11:02 2008
+ #
+ # CONFIG_PPC64 is not set
+
+@@ -43,7 +43,7 @@
+ CONFIG_PPC=y
+ CONFIG_EARLY_PRINTK=y
+ CONFIG_GENERIC_NVRAM=y
+-CONFIG_SCHED_OMIT_FRAME_POINTER=y
++CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+ CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+ CONFIG_PPC_OF=y
+ CONFIG_OF=y
+@@ -71,23 +71,14 @@
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
+ # CONFIG_AUDIT is not set
+-
+-#
+-# RCU Subsystem
+-#
+-CONFIG_CLASSIC_RCU=y
+-# CONFIG_TREE_RCU is not set
+-# CONFIG_PREEMPT_RCU is not set
+-# CONFIG_TREE_RCU_TRACE is not set
+-# CONFIG_PREEMPT_RCU_TRACE is not set
+ # CONFIG_IKCONFIG is not set
+ CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_CGROUPS is not set
+ CONFIG_GROUP_SCHED=y
+ CONFIG_FAIR_GROUP_SCHED=y
+ # CONFIG_RT_GROUP_SCHED is not set
+ CONFIG_USER_SCHED=y
+ # CONFIG_CGROUP_SCHED is not set
+-# CONFIG_CGROUPS is not set
+ CONFIG_SYSFS_DEPRECATED=y
+ CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
+@@ -119,6 +110,7 @@
+ CONFIG_SLUB=y
+ # CONFIG_SLOB is not set
+ # CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
+ CONFIG_HAVE_OPROFILE=y
+ CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
+ CONFIG_HAVE_IOREMAP_PROT=y
+@@ -129,11 +121,13 @@
+ # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+ # CONFIG_MODULES is not set
+ CONFIG_BLOCK=y
+ # CONFIG_LBD is not set
+ # CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
+ # CONFIG_BLK_DEV_BSG is not set
+ # CONFIG_BLK_DEV_INTEGRITY is not set
+
+@@ -149,6 +143,7 @@
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
++CONFIG_CLASSIC_RCU=y
+ # CONFIG_FREEZER is not set
+
+ #
+@@ -187,9 +182,9 @@
+ # CONFIG_TAU is not set
+ # CONFIG_FSL_ULI1575 is not set
+ CONFIG_PPC_BESTCOMM=y
+-CONFIG_PPC_BESTCOMM_ATA=y
++# CONFIG_PPC_BESTCOMM_ATA is not set
+ CONFIG_PPC_BESTCOMM_FEC=y
+-# CONFIG_SIMPLE_GPIO is not set
++# CONFIG_PPC_BESTCOMM_GEN_BD is not set
+
+ #
+ # Kernel options
+@@ -216,7 +211,6 @@
+ CONFIG_ARCH_HAS_WALK_MEMORY=y
+ CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
+ # CONFIG_KEXEC is not set
+-# CONFIG_CRASH_DUMP is not set
+ CONFIG_ARCH_FLATMEM_ENABLE=y
+ CONFIG_ARCH_POPULATES_NODE_MAP=y
+ CONFIG_SELECT_MEMORY_MODEL=y
+@@ -228,14 +222,12 @@
+ CONFIG_PAGEFLAGS_EXTENDED=y
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ CONFIG_MIGRATION=y
++# CONFIG_RESOURCES_64BIT is not set
+ # CONFIG_PHYS_ADDR_T_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=1
+ CONFIG_BOUNCE=y
+ CONFIG_VIRT_TO_BUS=y
+ CONFIG_UNEVICTABLE_LRU=y
+-CONFIG_PPC_4K_PAGES=y
+-# CONFIG_PPC_16K_PAGES is not set
+-# CONFIG_PPC_64K_PAGES is not set
+ CONFIG_FORCE_MAX_ZONEORDER=11
+ CONFIG_PROC_DEVICETREE=y
+ # CONFIG_CMDLINE_BOOL is not set
+@@ -276,7 +268,6 @@
+ #
+ # Networking options
+ #
+-CONFIG_COMPAT_NET_DEV_OPS=y
+ CONFIG_PACKET=y
+ # CONFIG_PACKET_MMAP is not set
+ CONFIG_UNIX=y
+@@ -333,7 +324,6 @@
+ # CONFIG_ECONET is not set
+ # CONFIG_WAN_ROUTER is not set
+ # CONFIG_NET_SCHED is not set
+-# CONFIG_DCB is not set
+
+ #
+ # Network testing
+@@ -346,7 +336,6 @@
+ # CONFIG_AF_RXRPC is not set
+ # CONFIG_PHONET is not set
+ # CONFIG_WIRELESS is not set
+-# CONFIG_WIMAX is not set
+ # CONFIG_RFKILL is not set
+ # CONFIG_NET_9P is not set
+
+@@ -438,12 +427,6 @@
+ # CONFIG_MTD_ONENAND is not set
+
+ #
+-# LPDDR flash memory drivers
+-#
+-# CONFIG_MTD_LPDDR is not set
+-# CONFIG_MTD_QINFO_PROBE is not set
+-
+-#
+ # UBI - Unsorted block images
+ #
+ # CONFIG_MTD_UBI is not set
+@@ -464,16 +447,10 @@
+ # CONFIG_ATA_OVER_ETH is not set
+ # CONFIG_BLK_DEV_HD is not set
+ CONFIG_MISC_DEVICES=y
++# CONFIG_EEPROM_93CX6 is not set
+ # CONFIG_ICS932S401 is not set
+ # CONFIG_ENCLOSURE_SERVICES is not set
+ # CONFIG_C2PORT is not set
+-
+-#
+-# EEPROM support
+-#
+-# CONFIG_EEPROM_AT24 is not set
+-CONFIG_EEPROM_LEGACY=y
+-# CONFIG_EEPROM_93CX6 is not set
+ CONFIG_HAVE_IDE=y
+ # CONFIG_IDE is not set
+
+@@ -515,7 +492,6 @@
+ # CONFIG_SCSI_SRP_ATTRS is not set
+ CONFIG_SCSI_LOWLEVEL=y
+ # CONFIG_ISCSI_TCP is not set
+-# CONFIG_LIBFC is not set
+ # CONFIG_SCSI_DEBUG is not set
+ # CONFIG_SCSI_DH is not set
+ CONFIG_ATA=y
+@@ -549,9 +525,6 @@
+ CONFIG_BROADCOM_PHY=y
+ CONFIG_ICPLUS_PHY=y
+ # CONFIG_REALTEK_PHY is not set
+-# CONFIG_NATIONAL_PHY is not set
+-# CONFIG_STE10XP is not set
+-# CONFIG_LSI_ET1011C_PHY is not set
+ # CONFIG_FIXED_PHY is not set
+ CONFIG_MDIO_BITBANG=y
+ CONFIG_NET_ETHERNET=y
+@@ -575,10 +548,6 @@
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
+ # CONFIG_IWLWIFI_LEDS is not set
+-
+-#
+-# Enable WiMAX (Networking options) to see the WiMAX drivers
+-#
+ # CONFIG_WAN is not set
+ # CONFIG_PPP is not set
+ # CONFIG_SLIP is not set
+@@ -621,10 +590,8 @@
+ CONFIG_SERIAL_MPC52xx_CONSOLE=y
+ CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD=115200
+ CONFIG_UNIX98_PTYS=y
+-# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+ CONFIG_LEGACY_PTYS=y
+ CONFIG_LEGACY_PTY_COUNT=256
+-# CONFIG_HVC_UDBG is not set
+ # CONFIG_IPMI_HANDLER is not set
+ # CONFIG_HW_RANDOM is not set
+ # CONFIG_NVRAM is not set
+@@ -662,6 +629,8 @@
+ # Miscellaneous I2C Chip support
+ #
+ # CONFIG_DS1682 is not set
++# CONFIG_EEPROM_AT24 is not set
++CONFIG_EEPROM_LEGACY=y
+ # CONFIG_SENSORS_PCF8574 is not set
+ # CONFIG_PCF8575 is not set
+ # CONFIG_SENSORS_PCA9539 is not set
+@@ -690,7 +659,6 @@
+ # CONFIG_SENSORS_ADT7462 is not set
+ # CONFIG_SENSORS_ADT7470 is not set
+ # CONFIG_SENSORS_ADT7473 is not set
+-# CONFIG_SENSORS_ADT7475 is not set
+ # CONFIG_SENSORS_ATXP1 is not set
+ # CONFIG_SENSORS_DS1621 is not set
+ # CONFIG_SENSORS_F71805F is not set
+@@ -710,7 +678,6 @@
+ # CONFIG_SENSORS_LM90 is not set
+ # CONFIG_SENSORS_LM92 is not set
+ # CONFIG_SENSORS_LM93 is not set
+-# CONFIG_SENSORS_LTC4245 is not set
+ # CONFIG_SENSORS_MAX1619 is not set
+ # CONFIG_SENSORS_MAX6650 is not set
+ # CONFIG_SENSORS_PC87360 is not set
+@@ -754,12 +721,10 @@
+ # CONFIG_MFD_CORE is not set
+ # CONFIG_MFD_SM501 is not set
+ # CONFIG_HTC_PASIC3 is not set
+-# CONFIG_TWL4030_CORE is not set
+ # CONFIG_MFD_TMIO is not set
+ # CONFIG_PMIC_DA903X is not set
+ # CONFIG_MFD_WM8400 is not set
+ # CONFIG_MFD_WM8350_I2C is not set
+-# CONFIG_MFD_PCF50633 is not set
+ # CONFIG_REGULATOR is not set
+
+ #
+@@ -870,6 +835,7 @@
+ # CONFIG_DMADEVICES is not set
+ # CONFIG_UIO is not set
+ # CONFIG_STAGING is not set
++CONFIG_STAGING_EXCLUDE_BUILD=y
+
+ #
+ # File systems
+@@ -890,7 +856,6 @@
+ CONFIG_FILE_LOCKING=y
+ # CONFIG_XFS_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_BTRFS_FS is not set
+ CONFIG_DNOTIFY=y
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+@@ -927,7 +892,10 @@
+ # CONFIG_TMPFS_POSIX_ACL is not set
+ # CONFIG_HUGETLB_PAGE is not set
+ # CONFIG_CONFIGFS_FS is not set
+-CONFIG_MISC_FILESYSTEMS=y
++
++#
++# Miscellaneous filesystems
++#
+ # CONFIG_ADFS_FS is not set
+ # CONFIG_AFFS_FS is not set
+ # CONFIG_HFS_FS is not set
+@@ -947,7 +915,6 @@
+ CONFIG_JFFS2_RTIME=y
+ # CONFIG_JFFS2_RUBIN is not set
+ CONFIG_CRAMFS=y
+-# CONFIG_SQUASHFS is not set
+ # CONFIG_VXFS_FS is not set
+ # CONFIG_MINIX_FS is not set
+ # CONFIG_OMFS_FS is not set
+@@ -1044,7 +1011,6 @@
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
+-CONFIG_GENERIC_FIND_LAST_BIT=y
+ # CONFIG_CRC_CCITT is not set
+ # CONFIG_CRC16 is not set
+ # CONFIG_CRC_T10DIF is not set
+@@ -1096,7 +1062,6 @@
+ # CONFIG_DEBUG_MEMORY_INIT is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+-# CONFIG_DEBUG_NOTIFIERS is not set
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
+ # CONFIG_RCU_CPU_STALL_DETECTOR is not set
+@@ -1105,8 +1070,6 @@
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_LATENCYTOP is not set
+ CONFIG_HAVE_FUNCTION_TRACER=y
+-CONFIG_HAVE_DYNAMIC_FTRACE=y
+-CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
+
+ #
+ # Tracers
+@@ -1115,13 +1078,11 @@
+ # CONFIG_SCHED_TRACER is not set
+ # CONFIG_CONTEXT_SWITCH_TRACER is not set
+ # CONFIG_BOOT_TRACER is not set
+-# CONFIG_TRACE_BRANCH_PROFILING is not set
+ # CONFIG_STACK_TRACER is not set
+ # CONFIG_DYNAMIC_PRINTK_DEBUG is not set
+ # CONFIG_SAMPLES is not set
+ CONFIG_HAVE_ARCH_KGDB=y
+ # CONFIG_KGDB is not set
+-CONFIG_PRINT_STACK_DEPTH=64
+ # CONFIG_DEBUG_STACKOVERFLOW is not set
+ # CONFIG_DEBUG_STACK_USAGE is not set
+ # CONFIG_DEBUG_PAGEALLOC is not set
+@@ -1148,15 +1109,11 @@
+ #
+ # CONFIG_CRYPTO_FIPS is not set
+ CONFIG_CRYPTO_ALGAPI=y
+-CONFIG_CRYPTO_ALGAPI2=y
+-CONFIG_CRYPTO_AEAD2=y
++CONFIG_CRYPTO_AEAD=y
+ CONFIG_CRYPTO_BLKCIPHER=y
+-CONFIG_CRYPTO_BLKCIPHER2=y
+ CONFIG_CRYPTO_HASH=y
+-CONFIG_CRYPTO_HASH2=y
+-CONFIG_CRYPTO_RNG2=y
++CONFIG_CRYPTO_RNG=y
+ CONFIG_CRYPTO_MANAGER=y
+-CONFIG_CRYPTO_MANAGER2=y
+ # CONFIG_CRYPTO_GF128MUL is not set
+ # CONFIG_CRYPTO_NULL is not set
+ # CONFIG_CRYPTO_CRYPTD is not set
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/configs/52xx/pcm030_defconfig linux-2.6.29-rc3.owrt/arch/powerpc/configs/52xx/pcm030_defconfig
+--- linux-2.6.29.owrt/arch/powerpc/configs/52xx/pcm030_defconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/configs/52xx/pcm030_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-rc2
+-# Mon Jan 26 21:41:33 2009
++# Linux kernel version: 2.6.28-rc4
++# Thu Nov 13 02:13:16 2008
+ #
+ # CONFIG_PPC64 is not set
+
+@@ -43,7 +43,7 @@
+ CONFIG_PPC=y
+ CONFIG_EARLY_PRINTK=y
+ CONFIG_GENERIC_NVRAM=y
+-CONFIG_SCHED_OMIT_FRAME_POINTER=y
++CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+ CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+ CONFIG_PPC_OF=y
+ CONFIG_OF=y
+@@ -72,24 +72,15 @@
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
+ # CONFIG_AUDIT is not set
+-
+-#
+-# RCU Subsystem
+-#
+-CONFIG_CLASSIC_RCU=y
+-# CONFIG_TREE_RCU is not set
+-# CONFIG_PREEMPT_RCU is not set
+-# CONFIG_TREE_RCU_TRACE is not set
+-# CONFIG_PREEMPT_RCU_TRACE is not set
+ CONFIG_IKCONFIG=y
+ CONFIG_IKCONFIG_PROC=y
+ CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_CGROUPS is not set
+ CONFIG_GROUP_SCHED=y
+ CONFIG_FAIR_GROUP_SCHED=y
+ # CONFIG_RT_GROUP_SCHED is not set
+ CONFIG_USER_SCHED=y
+ # CONFIG_CGROUP_SCHED is not set
+-# CONFIG_CGROUPS is not set
+ CONFIG_SYSFS_DEPRECATED=y
+ CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
+@@ -121,6 +112,7 @@
+ # CONFIG_SLUB is not set
+ # CONFIG_SLOB is not set
+ # CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
+ CONFIG_HAVE_OPROFILE=y
+ # CONFIG_KPROBES is not set
+ CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
+@@ -132,6 +124,7 @@
+ # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+ CONFIG_MODULES=y
+ # CONFIG_MODULE_FORCE_LOAD is not set
+@@ -139,9 +132,11 @@
+ # CONFIG_MODULE_FORCE_UNLOAD is not set
+ # CONFIG_MODVERSIONS is not set
+ # CONFIG_MODULE_SRCVERSION_ALL is not set
++CONFIG_KMOD=y
+ CONFIG_BLOCK=y
+ # CONFIG_LBD is not set
+ # CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
+ # CONFIG_BLK_DEV_BSG is not set
+ # CONFIG_BLK_DEV_INTEGRITY is not set
+
+@@ -157,6 +152,7 @@
+ # CONFIG_DEFAULT_CFQ is not set
+ CONFIG_DEFAULT_NOOP=y
+ CONFIG_DEFAULT_IOSCHED="noop"
++CONFIG_CLASSIC_RCU=y
+ # CONFIG_FREEZER is not set
+
+ #
+@@ -195,9 +191,9 @@
+ # CONFIG_TAU is not set
+ # CONFIG_FSL_ULI1575 is not set
+ CONFIG_PPC_BESTCOMM=y
+-CONFIG_PPC_BESTCOMM_ATA=m
++CONFIG_PPC_BESTCOMM_ATA=y
+ CONFIG_PPC_BESTCOMM_FEC=y
+-# CONFIG_SIMPLE_GPIO is not set
++CONFIG_PPC_BESTCOMM_GEN_BD=y
+
+ #
+ # Kernel options
+@@ -216,6 +212,7 @@
+ # CONFIG_PREEMPT_NONE is not set
+ # CONFIG_PREEMPT_VOLUNTARY is not set
+ CONFIG_PREEMPT=y
++# CONFIG_PREEMPT_RCU is not set
+ CONFIG_BINFMT_ELF=y
+ # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+ # CONFIG_HAVE_AOUT is not set
+@@ -225,7 +222,6 @@
+ CONFIG_ARCH_HAS_WALK_MEMORY=y
+ CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
+ # CONFIG_KEXEC is not set
+-# CONFIG_CRASH_DUMP is not set
+ CONFIG_ARCH_FLATMEM_ENABLE=y
+ CONFIG_ARCH_POPULATES_NODE_MAP=y
+ CONFIG_SELECT_MEMORY_MODEL=y
+@@ -237,14 +233,12 @@
+ CONFIG_PAGEFLAGS_EXTENDED=y
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ CONFIG_MIGRATION=y
++# CONFIG_RESOURCES_64BIT is not set
+ # CONFIG_PHYS_ADDR_T_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=1
+ CONFIG_BOUNCE=y
+ CONFIG_VIRT_TO_BUS=y
+ CONFIG_UNEVICTABLE_LRU=y
+-CONFIG_PPC_4K_PAGES=y
+-# CONFIG_PPC_16K_PAGES is not set
+-# CONFIG_PPC_64K_PAGES is not set
+ CONFIG_FORCE_MAX_ZONEORDER=11
+ CONFIG_PROC_DEVICETREE=y
+ # CONFIG_CMDLINE_BOOL is not set
+@@ -267,7 +261,6 @@
+ CONFIG_ARCH_SUPPORTS_MSI=y
+ # CONFIG_PCI_MSI is not set
+ CONFIG_PCI_LEGACY=y
+-# CONFIG_PCI_STUB is not set
+ # CONFIG_PCCARD is not set
+ # CONFIG_HOTPLUG_PCI is not set
+ # CONFIG_HAS_RAPIDIO is not set
+@@ -290,7 +283,6 @@
+ #
+ # Networking options
+ #
+-CONFIG_COMPAT_NET_DEV_OPS=y
+ CONFIG_PACKET=y
+ # CONFIG_PACKET_MMAP is not set
+ CONFIG_UNIX=y
+@@ -341,7 +333,6 @@
+ # CONFIG_ECONET is not set
+ # CONFIG_WAN_ROUTER is not set
+ # CONFIG_NET_SCHED is not set
+-# CONFIG_DCB is not set
+
+ #
+ # Network testing
+@@ -354,7 +345,6 @@
+ # CONFIG_AF_RXRPC is not set
+ # CONFIG_PHONET is not set
+ # CONFIG_WIRELESS is not set
+-# CONFIG_WIMAX is not set
+ # CONFIG_RFKILL is not set
+ # CONFIG_NET_9P is not set
+
+@@ -375,7 +365,6 @@
+ # CONFIG_MTD_DEBUG is not set
+ # CONFIG_MTD_CONCAT is not set
+ CONFIG_MTD_PARTITIONS=y
+-# CONFIG_MTD_TESTS is not set
+ # CONFIG_MTD_REDBOOT_PARTS is not set
+ CONFIG_MTD_CMDLINE_PARTS=y
+ # CONFIG_MTD_OF_PARTS is not set
+@@ -424,7 +413,9 @@
+ #
+ # CONFIG_MTD_COMPLEX_MAPPINGS is not set
+ CONFIG_MTD_PHYSMAP=y
+-# CONFIG_MTD_PHYSMAP_COMPAT is not set
++CONFIG_MTD_PHYSMAP_START=0x0
++CONFIG_MTD_PHYSMAP_LEN=0x0
++CONFIG_MTD_PHYSMAP_BANKWIDTH=1
+ # CONFIG_MTD_PHYSMAP_OF is not set
+ # CONFIG_MTD_INTEL_VR_NOR is not set
+ # CONFIG_MTD_PLATRAM is not set
+@@ -448,12 +439,6 @@
+ # CONFIG_MTD_ONENAND is not set
+
+ #
+-# LPDDR flash memory drivers
+-#
+-# CONFIG_MTD_LPDDR is not set
+-# CONFIG_MTD_QINFO_PROBE is not set
+-
+-#
+ # UBI - Unsorted block images
+ #
+ # CONFIG_MTD_UBI is not set
+@@ -602,9 +587,6 @@
+ # CONFIG_BROADCOM_PHY is not set
+ # CONFIG_ICPLUS_PHY is not set
+ # CONFIG_REALTEK_PHY is not set
+-# CONFIG_NATIONAL_PHY is not set
+-# CONFIG_STE10XP is not set
+-# CONFIG_LSI_ET1011C_PHY is not set
+ # CONFIG_FIXED_PHY is not set
+ # CONFIG_MDIO_BITBANG is not set
+ CONFIG_NET_ETHERNET=y
+@@ -639,10 +621,6 @@
+ # CONFIG_IWLWIFI_LEDS is not set
+
+ #
+-# Enable WiMAX (Networking options) to see the WiMAX drivers
+-#
+-
+-#
+ # USB Network Adapters
+ #
+ # CONFIG_USB_CATC is not set
+@@ -697,9 +675,7 @@
+ CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD=9600
+ # CONFIG_SERIAL_JSM is not set
+ CONFIG_UNIX98_PTYS=y
+-# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+ # CONFIG_LEGACY_PTYS is not set
+-# CONFIG_HVC_UDBG is not set
+ # CONFIG_IPMI_HANDLER is not set
+ CONFIG_HW_RANDOM=y
+ # CONFIG_NVRAM is not set
+@@ -764,6 +740,8 @@
+ # Miscellaneous I2C Chip support
+ #
+ # CONFIG_DS1682 is not set
++# CONFIG_EEPROM_AT24 is not set
++CONFIG_EEPROM_LEGACY=m
+ # CONFIG_SENSORS_PCF8574 is not set
+ # CONFIG_PCF8575 is not set
+ # CONFIG_SENSORS_PCA9539 is not set
+@@ -796,12 +774,10 @@
+ # CONFIG_MFD_CORE is not set
+ # CONFIG_MFD_SM501 is not set
+ # CONFIG_HTC_PASIC3 is not set
+-# CONFIG_TWL4030_CORE is not set
+ # CONFIG_MFD_TMIO is not set
+ # CONFIG_PMIC_DA903X is not set
+ # CONFIG_MFD_WM8400 is not set
+ # CONFIG_MFD_WM8350_I2C is not set
+-# CONFIG_MFD_PCF50633 is not set
+ # CONFIG_REGULATOR is not set
+
+ #
+@@ -861,7 +837,6 @@
+ #
+ # CONFIG_USB_C67X00_HCD is not set
+ # CONFIG_USB_EHCI_HCD is not set
+-# CONFIG_USB_OXU210HP_HCD is not set
+ # CONFIG_USB_ISP116X_HCD is not set
+ # CONFIG_USB_ISP1760_HCD is not set
+ CONFIG_USB_OHCI_HCD=m
+@@ -889,17 +864,18 @@
+ # CONFIG_USB_TMC is not set
+
+ #
+-# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+
+ #
+-# see USB_STORAGE Help for more information
++# may also be needed; see USB_STORAGE Help for more information
+ #
+ CONFIG_USB_STORAGE=m
+ # CONFIG_USB_STORAGE_DEBUG is not set
+ # CONFIG_USB_STORAGE_DATAFAB is not set
+ # CONFIG_USB_STORAGE_FREECOM is not set
+ # CONFIG_USB_STORAGE_ISD200 is not set
++# CONFIG_USB_STORAGE_DPCM is not set
+ # CONFIG_USB_STORAGE_USBAT is not set
+ # CONFIG_USB_STORAGE_SDDR09 is not set
+ # CONFIG_USB_STORAGE_SDDR55 is not set
+@@ -945,10 +921,6 @@
+ # CONFIG_USB_ISIGHTFW is not set
+ # CONFIG_USB_VST is not set
+ # CONFIG_USB_GADGET is not set
+-
+-#
+-# OTG and related infrastructure
+-#
+ # CONFIG_UWB is not set
+ # CONFIG_MMC is not set
+ # CONFIG_MEMSTICK is not set
+@@ -1011,6 +983,7 @@
+ # CONFIG_DMADEVICES is not set
+ # CONFIG_UIO is not set
+ # CONFIG_STAGING is not set
++CONFIG_STAGING_EXCLUDE_BUILD=y
+
+ #
+ # File systems
+@@ -1031,7 +1004,6 @@
+ CONFIG_FILE_LOCKING=y
+ # CONFIG_XFS_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_BTRFS_FS is not set
+ # CONFIG_DNOTIFY is not set
+ # CONFIG_INOTIFY is not set
+ # CONFIG_QUOTA is not set
+@@ -1067,7 +1039,10 @@
+ # CONFIG_TMPFS_POSIX_ACL is not set
+ # CONFIG_HUGETLB_PAGE is not set
+ # CONFIG_CONFIGFS_FS is not set
+-CONFIG_MISC_FILESYSTEMS=y
++
++#
++# Miscellaneous filesystems
++#
+ # CONFIG_ADFS_FS is not set
+ # CONFIG_AFFS_FS is not set
+ # CONFIG_HFS_FS is not set
+@@ -1087,7 +1062,6 @@
+ CONFIG_JFFS2_RTIME=y
+ # CONFIG_JFFS2_RUBIN is not set
+ # CONFIG_CRAMFS is not set
+-# CONFIG_SQUASHFS is not set
+ # CONFIG_VXFS_FS is not set
+ # CONFIG_MINIX_FS is not set
+ # CONFIG_OMFS_FS is not set
+@@ -1167,7 +1141,6 @@
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
+-CONFIG_GENERIC_FIND_LAST_BIT=y
+ # CONFIG_CRC_CCITT is not set
+ # CONFIG_CRC16 is not set
+ # CONFIG_CRC_T10DIF is not set
+@@ -1200,8 +1173,6 @@
+ # CONFIG_RCU_CPU_STALL_DETECTOR is not set
+ # CONFIG_LATENCYTOP is not set
+ CONFIG_HAVE_FUNCTION_TRACER=y
+-CONFIG_HAVE_DYNAMIC_FTRACE=y
+-CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
+
+ #
+ # Tracers
+@@ -1209,7 +1180,6 @@
+ # CONFIG_DYNAMIC_PRINTK_DEBUG is not set
+ # CONFIG_SAMPLES is not set
+ CONFIG_HAVE_ARCH_KGDB=y
+-CONFIG_PRINT_STACK_DEPTH=64
+ # CONFIG_IRQSTACKS is not set
+ # CONFIG_BOOTX_TEXT is not set
+ # CONFIG_PPC_EARLY_DEBUG is not set
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/configs/52xx/tqm5200_defconfig linux-2.6.29-rc3.owrt/arch/powerpc/configs/52xx/tqm5200_defconfig
+--- linux-2.6.29.owrt/arch/powerpc/configs/52xx/tqm5200_defconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/configs/52xx/tqm5200_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-rc2
+-# Mon Jan 26 21:42:58 2009
++# Linux kernel version: 2.6.28-rc4
++# Thu Nov 13 02:09:30 2008
+ #
+ # CONFIG_PPC64 is not set
+
+@@ -43,7 +43,7 @@
+ CONFIG_PPC=y
+ CONFIG_EARLY_PRINTK=y
+ CONFIG_GENERIC_NVRAM=y
+-CONFIG_SCHED_OMIT_FRAME_POINTER=y
++CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+ CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+ CONFIG_PPC_OF=y
+ CONFIG_OF=y
+@@ -71,23 +71,14 @@
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
+ # CONFIG_AUDIT is not set
+-
+-#
+-# RCU Subsystem
+-#
+-CONFIG_CLASSIC_RCU=y
+-# CONFIG_TREE_RCU is not set
+-# CONFIG_PREEMPT_RCU is not set
+-# CONFIG_TREE_RCU_TRACE is not set
+-# CONFIG_PREEMPT_RCU_TRACE is not set
+ # CONFIG_IKCONFIG is not set
+ CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_CGROUPS is not set
+ CONFIG_GROUP_SCHED=y
+ CONFIG_FAIR_GROUP_SCHED=y
+ # CONFIG_RT_GROUP_SCHED is not set
+ CONFIG_USER_SCHED=y
+ # CONFIG_CGROUP_SCHED is not set
+-# CONFIG_CGROUPS is not set
+ CONFIG_SYSFS_DEPRECATED=y
+ CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
+@@ -119,6 +110,7 @@
+ CONFIG_SLUB=y
+ # CONFIG_SLOB is not set
+ # CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
+ CONFIG_HAVE_OPROFILE=y
+ CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
+ CONFIG_HAVE_IOREMAP_PROT=y
+@@ -129,6 +121,7 @@
+ # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+ CONFIG_MODULES=y
+ # CONFIG_MODULE_FORCE_LOAD is not set
+@@ -136,9 +129,11 @@
+ # CONFIG_MODULE_FORCE_UNLOAD is not set
+ CONFIG_MODVERSIONS=y
+ # CONFIG_MODULE_SRCVERSION_ALL is not set
++CONFIG_KMOD=y
+ CONFIG_BLOCK=y
+ # CONFIG_LBD is not set
+ # CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
+ # CONFIG_BLK_DEV_BSG is not set
+ # CONFIG_BLK_DEV_INTEGRITY is not set
+
+@@ -154,6 +149,7 @@
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
++CONFIG_CLASSIC_RCU=y
+ # CONFIG_FREEZER is not set
+
+ #
+@@ -192,9 +188,9 @@
+ # CONFIG_TAU is not set
+ # CONFIG_FSL_ULI1575 is not set
+ CONFIG_PPC_BESTCOMM=y
+-CONFIG_PPC_BESTCOMM_ATA=y
++# CONFIG_PPC_BESTCOMM_ATA is not set
+ CONFIG_PPC_BESTCOMM_FEC=y
+-# CONFIG_SIMPLE_GPIO is not set
++# CONFIG_PPC_BESTCOMM_GEN_BD is not set
+
+ #
+ # Kernel options
+@@ -221,7 +217,6 @@
+ CONFIG_ARCH_HAS_WALK_MEMORY=y
+ CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
+ # CONFIG_KEXEC is not set
+-# CONFIG_CRASH_DUMP is not set
+ CONFIG_ARCH_FLATMEM_ENABLE=y
+ CONFIG_ARCH_POPULATES_NODE_MAP=y
+ CONFIG_SELECT_MEMORY_MODEL=y
+@@ -233,14 +228,12 @@
+ CONFIG_PAGEFLAGS_EXTENDED=y
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ CONFIG_MIGRATION=y
++# CONFIG_RESOURCES_64BIT is not set
+ # CONFIG_PHYS_ADDR_T_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=1
+ CONFIG_BOUNCE=y
+ CONFIG_VIRT_TO_BUS=y
+ CONFIG_UNEVICTABLE_LRU=y
+-CONFIG_PPC_4K_PAGES=y
+-# CONFIG_PPC_16K_PAGES is not set
+-# CONFIG_PPC_64K_PAGES is not set
+ CONFIG_FORCE_MAX_ZONEORDER=11
+ CONFIG_PROC_DEVICETREE=y
+ # CONFIG_CMDLINE_BOOL is not set
+@@ -281,7 +274,6 @@
+ #
+ # Networking options
+ #
+-CONFIG_COMPAT_NET_DEV_OPS=y
+ CONFIG_PACKET=y
+ # CONFIG_PACKET_MMAP is not set
+ CONFIG_UNIX=y
+@@ -338,7 +330,6 @@
+ # CONFIG_ECONET is not set
+ # CONFIG_WAN_ROUTER is not set
+ # CONFIG_NET_SCHED is not set
+-# CONFIG_DCB is not set
+
+ #
+ # Network testing
+@@ -351,7 +342,6 @@
+ # CONFIG_AF_RXRPC is not set
+ # CONFIG_PHONET is not set
+ # CONFIG_WIRELESS is not set
+-# CONFIG_WIMAX is not set
+ # CONFIG_RFKILL is not set
+ # CONFIG_NET_9P is not set
+
+@@ -374,7 +364,6 @@
+ # CONFIG_MTD_DEBUG is not set
+ CONFIG_MTD_CONCAT=y
+ CONFIG_MTD_PARTITIONS=y
+-# CONFIG_MTD_TESTS is not set
+ # CONFIG_MTD_REDBOOT_PARTS is not set
+ CONFIG_MTD_CMDLINE_PARTS=y
+ # CONFIG_MTD_OF_PARTS is not set
+@@ -444,12 +433,6 @@
+ # CONFIG_MTD_ONENAND is not set
+
+ #
+-# LPDDR flash memory drivers
+-#
+-# CONFIG_MTD_LPDDR is not set
+-# CONFIG_MTD_QINFO_PROBE is not set
+-
+-#
+ # UBI - Unsorted block images
+ #
+ # CONFIG_MTD_UBI is not set
+@@ -513,7 +496,6 @@
+ # CONFIG_SCSI_SRP_ATTRS is not set
+ CONFIG_SCSI_LOWLEVEL=y
+ # CONFIG_ISCSI_TCP is not set
+-# CONFIG_LIBFC is not set
+ # CONFIG_SCSI_DEBUG is not set
+ # CONFIG_SCSI_DH is not set
+ CONFIG_ATA=y
+@@ -548,9 +530,6 @@
+ # CONFIG_BROADCOM_PHY is not set
+ # CONFIG_ICPLUS_PHY is not set
+ # CONFIG_REALTEK_PHY is not set
+-# CONFIG_NATIONAL_PHY is not set
+-# CONFIG_STE10XP is not set
+-# CONFIG_LSI_ET1011C_PHY is not set
+ # CONFIG_FIXED_PHY is not set
+ # CONFIG_MDIO_BITBANG is not set
+ CONFIG_NET_ETHERNET=y
+@@ -576,10 +555,6 @@
+ # CONFIG_IWLWIFI_LEDS is not set
+
+ #
+-# Enable WiMAX (Networking options) to see the WiMAX drivers
+-#
+-
+-#
+ # USB Network Adapters
+ #
+ # CONFIG_USB_CATC is not set
+@@ -629,10 +604,8 @@
+ CONFIG_SERIAL_MPC52xx_CONSOLE=y
+ CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD=115200
+ CONFIG_UNIX98_PTYS=y
+-# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+ CONFIG_LEGACY_PTYS=y
+ CONFIG_LEGACY_PTY_COUNT=256
+-# CONFIG_HVC_UDBG is not set
+ # CONFIG_IPMI_HANDLER is not set
+ # CONFIG_HW_RANDOM is not set
+ # CONFIG_NVRAM is not set
+@@ -672,6 +645,8 @@
+ # Miscellaneous I2C Chip support
+ #
+ # CONFIG_DS1682 is not set
++# CONFIG_EEPROM_AT24 is not set
++# CONFIG_EEPROM_LEGACY is not set
+ # CONFIG_SENSORS_PCF8574 is not set
+ # CONFIG_PCF8575 is not set
+ # CONFIG_SENSORS_PCA9539 is not set
+@@ -700,7 +675,6 @@
+ # CONFIG_SENSORS_ADT7462 is not set
+ # CONFIG_SENSORS_ADT7470 is not set
+ # CONFIG_SENSORS_ADT7473 is not set
+-# CONFIG_SENSORS_ADT7475 is not set
+ # CONFIG_SENSORS_ATXP1 is not set
+ # CONFIG_SENSORS_DS1621 is not set
+ # CONFIG_SENSORS_F71805F is not set
+@@ -720,7 +694,6 @@
+ # CONFIG_SENSORS_LM90 is not set
+ # CONFIG_SENSORS_LM92 is not set
+ # CONFIG_SENSORS_LM93 is not set
+-# CONFIG_SENSORS_LTC4245 is not set
+ # CONFIG_SENSORS_MAX1619 is not set
+ # CONFIG_SENSORS_MAX6650 is not set
+ # CONFIG_SENSORS_PC87360 is not set
+@@ -769,12 +742,10 @@
+ # CONFIG_MFD_CORE is not set
+ # CONFIG_MFD_SM501 is not set
+ # CONFIG_HTC_PASIC3 is not set
+-# CONFIG_TWL4030_CORE is not set
+ # CONFIG_MFD_TMIO is not set
+ # CONFIG_PMIC_DA903X is not set
+ # CONFIG_MFD_WM8400 is not set
+ # CONFIG_MFD_WM8350_I2C is not set
+-# CONFIG_MFD_PCF50633 is not set
+ # CONFIG_REGULATOR is not set
+
+ #
+@@ -832,7 +803,6 @@
+ # USB Host Controller Drivers
+ #
+ # CONFIG_USB_C67X00_HCD is not set
+-# CONFIG_USB_OXU210HP_HCD is not set
+ # CONFIG_USB_ISP116X_HCD is not set
+ # CONFIG_USB_ISP1760_HCD is not set
+ CONFIG_USB_OHCI_HCD=y
+@@ -857,17 +827,18 @@
+ # CONFIG_USB_TMC is not set
+
+ #
+-# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+
+ #
+-# see USB_STORAGE Help for more information
++# may also be needed; see USB_STORAGE Help for more information
+ #
+ CONFIG_USB_STORAGE=y
+ # CONFIG_USB_STORAGE_DEBUG is not set
+ # CONFIG_USB_STORAGE_DATAFAB is not set
+ # CONFIG_USB_STORAGE_FREECOM is not set
+ # CONFIG_USB_STORAGE_ISD200 is not set
++# CONFIG_USB_STORAGE_DPCM is not set
+ # CONFIG_USB_STORAGE_USBAT is not set
+ # CONFIG_USB_STORAGE_SDDR09 is not set
+ # CONFIG_USB_STORAGE_SDDR55 is not set
+@@ -913,10 +884,6 @@
+ # CONFIG_USB_ISIGHTFW is not set
+ # CONFIG_USB_VST is not set
+ # CONFIG_USB_GADGET is not set
+-
+-#
+-# OTG and related infrastructure
+-#
+ # CONFIG_MMC is not set
+ # CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS is not set
+@@ -980,6 +947,7 @@
+ # CONFIG_DMADEVICES is not set
+ # CONFIG_UIO is not set
+ # CONFIG_STAGING is not set
++CONFIG_STAGING_EXCLUDE_BUILD=y
+
+ #
+ # File systems
+@@ -1000,7 +968,6 @@
+ CONFIG_FILE_LOCKING=y
+ # CONFIG_XFS_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_BTRFS_FS is not set
+ CONFIG_DNOTIFY=y
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+@@ -1037,7 +1004,10 @@
+ # CONFIG_TMPFS_POSIX_ACL is not set
+ # CONFIG_HUGETLB_PAGE is not set
+ # CONFIG_CONFIGFS_FS is not set
+-CONFIG_MISC_FILESYSTEMS=y
++
++#
++# Miscellaneous filesystems
++#
+ # CONFIG_ADFS_FS is not set
+ # CONFIG_AFFS_FS is not set
+ # CONFIG_HFS_FS is not set
+@@ -1057,7 +1027,6 @@
+ CONFIG_JFFS2_RTIME=y
+ # CONFIG_JFFS2_RUBIN is not set
+ CONFIG_CRAMFS=y
+-# CONFIG_SQUASHFS is not set
+ # CONFIG_VXFS_FS is not set
+ # CONFIG_MINIX_FS is not set
+ # CONFIG_OMFS_FS is not set
+@@ -1154,7 +1123,6 @@
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
+-CONFIG_GENERIC_FIND_LAST_BIT=y
+ # CONFIG_CRC_CCITT is not set
+ # CONFIG_CRC16 is not set
+ # CONFIG_CRC_T10DIF is not set
+@@ -1206,7 +1174,6 @@
+ # CONFIG_DEBUG_MEMORY_INIT is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+-# CONFIG_DEBUG_NOTIFIERS is not set
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
+ # CONFIG_RCU_CPU_STALL_DETECTOR is not set
+@@ -1215,8 +1182,6 @@
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_LATENCYTOP is not set
+ CONFIG_HAVE_FUNCTION_TRACER=y
+-CONFIG_HAVE_DYNAMIC_FTRACE=y
+-CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
+
+ #
+ # Tracers
+@@ -1225,13 +1190,11 @@
+ # CONFIG_SCHED_TRACER is not set
+ # CONFIG_CONTEXT_SWITCH_TRACER is not set
+ # CONFIG_BOOT_TRACER is not set
+-# CONFIG_TRACE_BRANCH_PROFILING is not set
+ # CONFIG_STACK_TRACER is not set
+ # CONFIG_DYNAMIC_PRINTK_DEBUG is not set
+ # CONFIG_SAMPLES is not set
+ CONFIG_HAVE_ARCH_KGDB=y
+ # CONFIG_KGDB is not set
+-CONFIG_PRINT_STACK_DEPTH=64
+ # CONFIG_DEBUG_STACKOVERFLOW is not set
+ # CONFIG_DEBUG_STACK_USAGE is not set
+ # CONFIG_DEBUG_PAGEALLOC is not set
+@@ -1258,15 +1221,11 @@
+ #
+ # CONFIG_CRYPTO_FIPS is not set
+ CONFIG_CRYPTO_ALGAPI=y
+-CONFIG_CRYPTO_ALGAPI2=y
+-CONFIG_CRYPTO_AEAD2=y
++CONFIG_CRYPTO_AEAD=y
+ CONFIG_CRYPTO_BLKCIPHER=y
+-CONFIG_CRYPTO_BLKCIPHER2=y
+ CONFIG_CRYPTO_HASH=y
+-CONFIG_CRYPTO_HASH2=y
+-CONFIG_CRYPTO_RNG2=y
++CONFIG_CRYPTO_RNG=y
+ CONFIG_CRYPTO_MANAGER=y
+-CONFIG_CRYPTO_MANAGER2=y
+ # CONFIG_CRYPTO_GF128MUL is not set
+ # CONFIG_CRYPTO_NULL is not set
+ # CONFIG_CRYPTO_CRYPTD is not set
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/configs/83xx/mpc8313_rdb_defconfig linux-2.6.29-rc3.owrt/arch/powerpc/configs/83xx/mpc8313_rdb_defconfig
+--- linux-2.6.29.owrt/arch/powerpc/configs/83xx/mpc8313_rdb_defconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/configs/83xx/mpc8313_rdb_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -651,7 +651,7 @@
+ # CONFIG_NATIONAL_PHY is not set
+ # CONFIG_STE10XP is not set
+ # CONFIG_LSI_ET1011C_PHY is not set
+-CONFIG_FIXED_PHY=y
++# CONFIG_FIXED_PHY is not set
+ # CONFIG_MDIO_BITBANG is not set
+ CONFIG_NET_ETHERNET=y
+ CONFIG_MII=y
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/configs/linkstation_defconfig linux-2.6.29-rc3.owrt/arch/powerpc/configs/linkstation_defconfig
+--- linux-2.6.29.owrt/arch/powerpc/configs/linkstation_defconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/configs/linkstation_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-rc6
+-# Fri Mar 6 00:07:38 2009
++# Linux kernel version: 2.6.29-rc2
++# Mon Jan 26 15:35:29 2009
+ #
+ # CONFIG_PPC64 is not set
+
+@@ -71,15 +71,6 @@
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
+ # CONFIG_AUDIT is not set
+-
+-#
+-# RCU Subsystem
+-#
+-CONFIG_CLASSIC_RCU=y
+-# CONFIG_TREE_RCU is not set
+-# CONFIG_PREEMPT_RCU is not set
+-# CONFIG_TREE_RCU_TRACE is not set
+-# CONFIG_PREEMPT_RCU_TRACE is not set
+ CONFIG_IKCONFIG=y
+ CONFIG_IKCONFIG_PROC=y
+ CONFIG_LOG_BUF_SHIFT=14
+@@ -97,7 +88,6 @@
+ # CONFIG_IPC_NS is not set
+ # CONFIG_USER_NS is not set
+ # CONFIG_PID_NS is not set
+-# CONFIG_NET_NS is not set
+ CONFIG_BLK_DEV_INITRD=y
+ CONFIG_INITRAMFS_SOURCE=""
+ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+@@ -163,6 +153,11 @@
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
++CONFIG_CLASSIC_RCU=y
++# CONFIG_TREE_RCU is not set
++# CONFIG_PREEMPT_RCU is not set
++# CONFIG_TREE_RCU_TRACE is not set
++# CONFIG_PREEMPT_RCU_TRACE is not set
+ # CONFIG_FREEZER is not set
+
+ #
+@@ -299,6 +294,7 @@
+ #
+ # Networking options
+ #
++# CONFIG_NET_NS is not set
+ CONFIG_COMPAT_NET_DEV_OPS=y
+ CONFIG_PACKET=y
+ CONFIG_PACKET_MMAP=y
+@@ -512,8 +508,8 @@
+ CONFIG_MTD_PARTITIONS=y
+ # CONFIG_MTD_TESTS is not set
+ # CONFIG_MTD_REDBOOT_PARTS is not set
+-CONFIG_MTD_CMDLINE_PARTS=y
+-CONFIG_MTD_OF_PARTS=y
++# CONFIG_MTD_CMDLINE_PARTS is not set
++# CONFIG_MTD_OF_PARTS is not set
+ # CONFIG_MTD_AR7_PARTS is not set
+
+ #
+@@ -591,6 +587,7 @@
+ # LPDDR flash memory drivers
+ #
+ # CONFIG_MTD_LPDDR is not set
++# CONFIG_MTD_QINFO_PROBE is not set
+
+ #
+ # UBI - Unsorted block images
+@@ -620,19 +617,13 @@
+ # CONFIG_BLK_DEV_HD is not set
+ CONFIG_MISC_DEVICES=y
+ # CONFIG_PHANTOM is not set
++# CONFIG_EEPROM_93CX6 is not set
+ # CONFIG_SGI_IOC4 is not set
+ # CONFIG_TIFM_CORE is not set
+ # CONFIG_ICS932S401 is not set
+ # CONFIG_ENCLOSURE_SERVICES is not set
+ # CONFIG_HP_ILO is not set
+ # CONFIG_C2PORT is not set
+-
+-#
+-# EEPROM support
+-#
+-# CONFIG_EEPROM_AT24 is not set
+-CONFIG_EEPROM_LEGACY=m
+-# CONFIG_EEPROM_93CX6 is not set
+ CONFIG_HAVE_IDE=y
+ # CONFIG_IDE is not set
+
+@@ -848,7 +839,6 @@
+ # CONFIG_QLA3XXX is not set
+ # CONFIG_ATL1 is not set
+ # CONFIG_ATL1E is not set
+-# CONFIG_ATL1C is not set
+ # CONFIG_JME is not set
+ CONFIG_NETDEV_10000=y
+ # CONFIG_CHELSIO_T1 is not set
+@@ -1047,6 +1037,8 @@
+ # Miscellaneous I2C Chip support
+ #
+ # CONFIG_DS1682 is not set
++# CONFIG_EEPROM_AT24 is not set
++CONFIG_EEPROM_LEGACY=m
+ # CONFIG_SENSORS_PCF8574 is not set
+ # CONFIG_PCF8575 is not set
+ # CONFIG_SENSORS_PCA9539 is not set
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/configs/mpc5200_defconfig linux-2.6.29-rc3.owrt/arch/powerpc/configs/mpc5200_defconfig
+--- linux-2.6.29.owrt/arch/powerpc/configs/mpc5200_defconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/configs/mpc5200_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-rc2
+-# Mon Jan 26 21:40:44 2009
++# Linux kernel version: 2.6.28-rc4
++# Thu Nov 13 02:09:07 2008
+ #
+ # CONFIG_PPC64 is not set
+
+@@ -43,7 +43,7 @@
+ CONFIG_PPC=y
+ CONFIG_EARLY_PRINTK=y
+ CONFIG_GENERIC_NVRAM=y
+-CONFIG_SCHED_OMIT_FRAME_POINTER=y
++CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+ CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+ CONFIG_PPC_OF=y
+ CONFIG_OF=y
+@@ -72,19 +72,10 @@
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
+ # CONFIG_AUDIT is not set
+-
+-#
+-# RCU Subsystem
+-#
+-CONFIG_CLASSIC_RCU=y
+-# CONFIG_TREE_RCU is not set
+-# CONFIG_PREEMPT_RCU is not set
+-# CONFIG_TREE_RCU_TRACE is not set
+-# CONFIG_PREEMPT_RCU_TRACE is not set
+ # CONFIG_IKCONFIG is not set
+ CONFIG_LOG_BUF_SHIFT=14
+-# CONFIG_GROUP_SCHED is not set
+ # CONFIG_CGROUPS is not set
++# CONFIG_GROUP_SCHED is not set
+ CONFIG_SYSFS_DEPRECATED=y
+ CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
+@@ -117,6 +108,7 @@
+ CONFIG_SLUB=y
+ # CONFIG_SLOB is not set
+ # CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
+ CONFIG_HAVE_OPROFILE=y
+ CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
+ CONFIG_HAVE_IOREMAP_PROT=y
+@@ -127,6 +119,7 @@
+ # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+ CONFIG_MODULES=y
+ # CONFIG_MODULE_FORCE_LOAD is not set
+@@ -134,9 +127,11 @@
+ # CONFIG_MODULE_FORCE_UNLOAD is not set
+ # CONFIG_MODVERSIONS is not set
+ # CONFIG_MODULE_SRCVERSION_ALL is not set
++CONFIG_KMOD=y
+ CONFIG_BLOCK=y
+ # CONFIG_LBD is not set
+ # CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
+ # CONFIG_BLK_DEV_BSG is not set
+ # CONFIG_BLK_DEV_INTEGRITY is not set
+
+@@ -152,6 +147,7 @@
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
++CONFIG_CLASSIC_RCU=y
+ CONFIG_FREEZER=y
+
+ #
+@@ -196,7 +192,7 @@
+ CONFIG_PPC_BESTCOMM=y
+ CONFIG_PPC_BESTCOMM_ATA=y
+ CONFIG_PPC_BESTCOMM_FEC=y
+-# CONFIG_SIMPLE_GPIO is not set
++CONFIG_PPC_BESTCOMM_GEN_BD=y
+
+ #
+ # Kernel options
+@@ -224,7 +220,6 @@
+ CONFIG_ARCH_HAS_WALK_MEMORY=y
+ CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
+ # CONFIG_KEXEC is not set
+-# CONFIG_CRASH_DUMP is not set
+ CONFIG_ARCH_FLATMEM_ENABLE=y
+ CONFIG_ARCH_POPULATES_NODE_MAP=y
+ CONFIG_SELECT_MEMORY_MODEL=y
+@@ -236,14 +231,12 @@
+ CONFIG_PAGEFLAGS_EXTENDED=y
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ CONFIG_MIGRATION=y
++# CONFIG_RESOURCES_64BIT is not set
+ # CONFIG_PHYS_ADDR_T_64BIT is not set
+ CONFIG_ZONE_DMA_FLAG=1
+ CONFIG_BOUNCE=y
+ CONFIG_VIRT_TO_BUS=y
+ CONFIG_UNEVICTABLE_LRU=y
+-CONFIG_PPC_4K_PAGES=y
+-# CONFIG_PPC_16K_PAGES is not set
+-# CONFIG_PPC_64K_PAGES is not set
+ CONFIG_FORCE_MAX_ZONEORDER=11
+ CONFIG_PROC_DEVICETREE=y
+ # CONFIG_CMDLINE_BOOL is not set
+@@ -271,7 +264,6 @@
+ # CONFIG_PCI_MSI is not set
+ CONFIG_PCI_LEGACY=y
+ # CONFIG_PCI_DEBUG is not set
+-# CONFIG_PCI_STUB is not set
+ # CONFIG_PCCARD is not set
+ # CONFIG_HOTPLUG_PCI is not set
+ # CONFIG_HAS_RAPIDIO is not set
+@@ -294,7 +286,6 @@
+ #
+ # Networking options
+ #
+-CONFIG_COMPAT_NET_DEV_OPS=y
+ CONFIG_PACKET=y
+ # CONFIG_PACKET_MMAP is not set
+ CONFIG_UNIX=y
+@@ -351,7 +342,6 @@
+ # CONFIG_ECONET is not set
+ # CONFIG_WAN_ROUTER is not set
+ # CONFIG_NET_SCHED is not set
+-# CONFIG_DCB is not set
+
+ #
+ # Network testing
+@@ -364,7 +354,6 @@
+ # CONFIG_AF_RXRPC is not set
+ # CONFIG_PHONET is not set
+ # CONFIG_WIRELESS is not set
+-# CONFIG_WIMAX is not set
+ # CONFIG_RFKILL is not set
+ # CONFIG_NET_9P is not set
+
+@@ -387,7 +376,6 @@
+ # CONFIG_MTD_DEBUG is not set
+ CONFIG_MTD_CONCAT=y
+ CONFIG_MTD_PARTITIONS=y
+-# CONFIG_MTD_TESTS is not set
+ # CONFIG_MTD_REDBOOT_PARTS is not set
+ CONFIG_MTD_CMDLINE_PARTS=y
+ # CONFIG_MTD_OF_PARTS is not set
+@@ -459,12 +447,6 @@
+ # CONFIG_MTD_ONENAND is not set
+
+ #
+-# LPDDR flash memory drivers
+-#
+-# CONFIG_MTD_LPDDR is not set
+-# CONFIG_MTD_QINFO_PROBE is not set
+-
+-#
+ # UBI - Unsorted block images
+ #
+ # CONFIG_MTD_UBI is not set
+@@ -492,19 +474,13 @@
+ # CONFIG_BLK_DEV_HD is not set
+ CONFIG_MISC_DEVICES=y
+ # CONFIG_PHANTOM is not set
++# CONFIG_EEPROM_93CX6 is not set
+ # CONFIG_SGI_IOC4 is not set
+ # CONFIG_TIFM_CORE is not set
+ # CONFIG_ICS932S401 is not set
+ # CONFIG_ENCLOSURE_SERVICES is not set
+ # CONFIG_HP_ILO is not set
+ # CONFIG_C2PORT is not set
+-
+-#
+-# EEPROM support
+-#
+-# CONFIG_EEPROM_AT24 is not set
+-# CONFIG_EEPROM_LEGACY is not set
+-# CONFIG_EEPROM_93CX6 is not set
+ CONFIG_HAVE_IDE=y
+ # CONFIG_IDE is not set
+
+@@ -563,8 +539,6 @@
+ # CONFIG_MEGARAID_SAS is not set
+ # CONFIG_SCSI_HPTIOP is not set
+ # CONFIG_SCSI_BUSLOGIC is not set
+-# CONFIG_LIBFC is not set
+-# CONFIG_FCOE is not set
+ # CONFIG_SCSI_DMX3191D is not set
+ # CONFIG_SCSI_EATA is not set
+ # CONFIG_SCSI_FUTURE_DOMAIN is not set
+@@ -685,9 +659,6 @@
+ # CONFIG_BROADCOM_PHY is not set
+ # CONFIG_ICPLUS_PHY is not set
+ # CONFIG_REALTEK_PHY is not set
+-# CONFIG_NATIONAL_PHY is not set
+-# CONFIG_STE10XP is not set
+-# CONFIG_LSI_ET1011C_PHY is not set
+ # CONFIG_FIXED_PHY is not set
+ # CONFIG_MDIO_BITBANG is not set
+ CONFIG_NET_ETHERNET=y
+@@ -722,10 +693,6 @@
+ # CONFIG_IWLWIFI_LEDS is not set
+
+ #
+-# Enable WiMAX (Networking options) to see the WiMAX drivers
+-#
+-
+-#
+ # USB Network Adapters
+ #
+ # CONFIG_USB_CATC is not set
+@@ -807,11 +774,9 @@
+ CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD=115200
+ # CONFIG_SERIAL_JSM is not set
+ CONFIG_UNIX98_PTYS=y
+-# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+ CONFIG_LEGACY_PTYS=y
+ CONFIG_LEGACY_PTY_COUNT=256
+ # CONFIG_HVC_RTAS is not set
+-# CONFIG_HVC_UDBG is not set
+ # CONFIG_IPMI_HANDLER is not set
+ # CONFIG_HW_RANDOM is not set
+ # CONFIG_NVRAM is not set
+@@ -879,6 +844,8 @@
+ # Miscellaneous I2C Chip support
+ #
+ # CONFIG_DS1682 is not set
++# CONFIG_EEPROM_AT24 is not set
++# CONFIG_EEPROM_LEGACY is not set
+ # CONFIG_SENSORS_PCF8574 is not set
+ # CONFIG_PCF8575 is not set
+ # CONFIG_SENSORS_PCA9539 is not set
+@@ -907,7 +874,6 @@
+ # CONFIG_SENSORS_ADT7462 is not set
+ # CONFIG_SENSORS_ADT7470 is not set
+ # CONFIG_SENSORS_ADT7473 is not set
+-# CONFIG_SENSORS_ADT7475 is not set
+ # CONFIG_SENSORS_ATXP1 is not set
+ # CONFIG_SENSORS_DS1621 is not set
+ # CONFIG_SENSORS_I5K_AMB is not set
+@@ -928,7 +894,6 @@
+ # CONFIG_SENSORS_LM90 is not set
+ # CONFIG_SENSORS_LM92 is not set
+ # CONFIG_SENSORS_LM93 is not set
+-# CONFIG_SENSORS_LTC4245 is not set
+ # CONFIG_SENSORS_MAX1619 is not set
+ # CONFIG_SENSORS_MAX6650 is not set
+ # CONFIG_SENSORS_PC87360 is not set
+@@ -988,12 +953,10 @@
+ # CONFIG_MFD_CORE is not set
+ # CONFIG_MFD_SM501 is not set
+ # CONFIG_HTC_PASIC3 is not set
+-# CONFIG_TWL4030_CORE is not set
+ # CONFIG_MFD_TMIO is not set
+ # CONFIG_PMIC_DA903X is not set
+ # CONFIG_MFD_WM8400 is not set
+ # CONFIG_MFD_WM8350_I2C is not set
+-# CONFIG_MFD_PCF50633 is not set
+ # CONFIG_REGULATOR is not set
+
+ #
+@@ -1088,7 +1051,7 @@
+ # CONFIG_LCD_ILI9320 is not set
+ # CONFIG_LCD_PLATFORM is not set
+ CONFIG_BACKLIGHT_CLASS_DEVICE=y
+-CONFIG_BACKLIGHT_GENERIC=y
++# CONFIG_BACKLIGHT_CORGI is not set
+
+ #
+ # Display device support
+@@ -1130,22 +1093,21 @@
+ CONFIG_HID_A4TECH=y
+ # CONFIG_HID_APPLE is not set
+ CONFIG_HID_BELKIN=y
++CONFIG_HID_BRIGHT=y
+ CONFIG_HID_CHERRY=y
+ # CONFIG_HID_CHICONY is not set
+ CONFIG_HID_CYPRESS=y
++CONFIG_HID_DELL=y
+ CONFIG_HID_EZKEY=y
+ # CONFIG_HID_GYRATION is not set
+ # CONFIG_HID_LOGITECH is not set
+ # CONFIG_HID_MICROSOFT is not set
+ # CONFIG_HID_MONTEREY is not set
+-# CONFIG_HID_NTRIG is not set
+ # CONFIG_HID_PANTHERLORD is not set
+ # CONFIG_HID_PETALYNX is not set
+ # CONFIG_HID_SAMSUNG is not set
+ # CONFIG_HID_SONY is not set
+ # CONFIG_HID_SUNPLUS is not set
+-# CONFIG_GREENASIA_FF is not set
+-# CONFIG_HID_TOPSEED is not set
+ # CONFIG_THRUSTMASTER_FF is not set
+ # CONFIG_ZEROPLUS_FF is not set
+ CONFIG_USB_SUPPORT=y
+@@ -1175,7 +1137,6 @@
+ #
+ # CONFIG_USB_C67X00_HCD is not set
+ # CONFIG_USB_EHCI_HCD is not set
+-# CONFIG_USB_OXU210HP_HCD is not set
+ # CONFIG_USB_ISP116X_HCD is not set
+ # CONFIG_USB_ISP1760_HCD is not set
+ CONFIG_USB_OHCI_HCD=y
+@@ -1203,17 +1164,18 @@
+ # CONFIG_USB_TMC is not set
+
+ #
+-# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+
+ #
+-# see USB_STORAGE Help for more information
++# may also be needed; see USB_STORAGE Help for more information
+ #
+ CONFIG_USB_STORAGE=y
+ # CONFIG_USB_STORAGE_DEBUG is not set
+ # CONFIG_USB_STORAGE_DATAFAB is not set
+ # CONFIG_USB_STORAGE_FREECOM is not set
+ # CONFIG_USB_STORAGE_ISD200 is not set
++# CONFIG_USB_STORAGE_DPCM is not set
+ # CONFIG_USB_STORAGE_USBAT is not set
+ # CONFIG_USB_STORAGE_SDDR09 is not set
+ # CONFIG_USB_STORAGE_SDDR55 is not set
+@@ -1260,10 +1222,6 @@
+ # CONFIG_USB_ISIGHTFW is not set
+ # CONFIG_USB_VST is not set
+ # CONFIG_USB_GADGET is not set
+-
+-#
+-# OTG and related infrastructure
+-#
+ # CONFIG_UWB is not set
+ # CONFIG_MMC is not set
+ # CONFIG_MEMSTICK is not set
+@@ -1285,6 +1243,7 @@
+ # CONFIG_DMADEVICES is not set
+ # CONFIG_UIO is not set
+ # CONFIG_STAGING is not set
++CONFIG_STAGING_EXCLUDE_BUILD=y
+
+ #
+ # File systems
+@@ -1305,7 +1264,6 @@
+ CONFIG_FILE_LOCKING=y
+ # CONFIG_XFS_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_BTRFS_FS is not set
+ CONFIG_DNOTIFY=y
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+@@ -1342,7 +1300,10 @@
+ # CONFIG_TMPFS_POSIX_ACL is not set
+ # CONFIG_HUGETLB_PAGE is not set
+ # CONFIG_CONFIGFS_FS is not set
+-CONFIG_MISC_FILESYSTEMS=y
++
++#
++# Miscellaneous filesystems
++#
+ # CONFIG_ADFS_FS is not set
+ # CONFIG_AFFS_FS is not set
+ # CONFIG_HFS_FS is not set
+@@ -1362,7 +1323,6 @@
+ CONFIG_JFFS2_RTIME=y
+ # CONFIG_JFFS2_RUBIN is not set
+ CONFIG_CRAMFS=y
+-# CONFIG_SQUASHFS is not set
+ # CONFIG_VXFS_FS is not set
+ # CONFIG_MINIX_FS is not set
+ # CONFIG_OMFS_FS is not set
+@@ -1443,7 +1403,6 @@
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
+-CONFIG_GENERIC_FIND_LAST_BIT=y
+ # CONFIG_CRC_CCITT is not set
+ # CONFIG_CRC16 is not set
+ # CONFIG_CRC_T10DIF is not set
+@@ -1495,7 +1454,6 @@
+ # CONFIG_DEBUG_MEMORY_INIT is not set
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+-# CONFIG_DEBUG_NOTIFIERS is not set
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
+ # CONFIG_RCU_CPU_STALL_DETECTOR is not set
+@@ -1504,8 +1462,6 @@
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_LATENCYTOP is not set
+ CONFIG_HAVE_FUNCTION_TRACER=y
+-CONFIG_HAVE_DYNAMIC_FTRACE=y
+-CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
+
+ #
+ # Tracers
+@@ -1514,13 +1470,11 @@
+ # CONFIG_SCHED_TRACER is not set
+ # CONFIG_CONTEXT_SWITCH_TRACER is not set
+ # CONFIG_BOOT_TRACER is not set
+-# CONFIG_TRACE_BRANCH_PROFILING is not set
+ # CONFIG_STACK_TRACER is not set
+ # CONFIG_DYNAMIC_PRINTK_DEBUG is not set
+ # CONFIG_SAMPLES is not set
+ CONFIG_HAVE_ARCH_KGDB=y
+ # CONFIG_KGDB is not set
+-CONFIG_PRINT_STACK_DEPTH=64
+ # CONFIG_DEBUG_STACKOVERFLOW is not set
+ # CONFIG_DEBUG_STACK_USAGE is not set
+ # CONFIG_DEBUG_PAGEALLOC is not set
+@@ -1547,15 +1501,11 @@
+ #
+ # CONFIG_CRYPTO_FIPS is not set
+ CONFIG_CRYPTO_ALGAPI=y
+-CONFIG_CRYPTO_ALGAPI2=y
+-CONFIG_CRYPTO_AEAD2=y
++CONFIG_CRYPTO_AEAD=y
+ CONFIG_CRYPTO_BLKCIPHER=y
+-CONFIG_CRYPTO_BLKCIPHER2=y
+ CONFIG_CRYPTO_HASH=y
+-CONFIG_CRYPTO_HASH2=y
+-CONFIG_CRYPTO_RNG2=y
++CONFIG_CRYPTO_RNG=y
+ CONFIG_CRYPTO_MANAGER=y
+-CONFIG_CRYPTO_MANAGER2=y
+ # CONFIG_CRYPTO_GF128MUL is not set
+ # CONFIG_CRYPTO_NULL is not set
+ # CONFIG_CRYPTO_CRYPTD is not set
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/configs/ps3_defconfig linux-2.6.29-rc3.owrt/arch/powerpc/configs/ps3_defconfig
+--- linux-2.6.29.owrt/arch/powerpc/configs/ps3_defconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/configs/ps3_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-rc8
+-# Fri Mar 13 09:28:45 2009
++# Linux kernel version: 2.6.27-rc3
++# Wed Aug 20 08:16:53 2008
+ #
+ CONFIG_PPC64=y
+
+@@ -16,14 +16,13 @@
+ CONFIG_ALTIVEC=y
+ # CONFIG_VSX is not set
+ CONFIG_PPC_STD_MMU=y
+-CONFIG_PPC_STD_MMU_64=y
+ CONFIG_PPC_MM_SLICES=y
+ CONFIG_VIRT_CPU_ACCOUNTING=y
+ CONFIG_SMP=y
+ CONFIG_NR_CPUS=2
+ CONFIG_64BIT=y
+ CONFIG_WORD_SIZE=64
+-CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
++CONFIG_PPC_MERGE=y
+ CONFIG_MMU=y
+ CONFIG_GENERIC_CMOS_UPDATE=y
+ CONFIG_GENERIC_TIME=y
+@@ -47,7 +46,7 @@
+ CONFIG_EARLY_PRINTK=y
+ CONFIG_COMPAT=y
+ CONFIG_SYSVIPC_COMPAT=y
+-CONFIG_SCHED_OMIT_FRAME_POINTER=y
++CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+ CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+ CONFIG_PPC_OF=y
+ CONFIG_OF=y
+@@ -75,19 +74,10 @@
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
+ # CONFIG_AUDIT is not set
+-
+-#
+-# RCU Subsystem
+-#
+-CONFIG_CLASSIC_RCU=y
+-# CONFIG_TREE_RCU is not set
+-# CONFIG_PREEMPT_RCU is not set
+-# CONFIG_TREE_RCU_TRACE is not set
+-# CONFIG_PREEMPT_RCU_TRACE is not set
+ # CONFIG_IKCONFIG is not set
+ CONFIG_LOG_BUF_SHIFT=17
+-# CONFIG_GROUP_SCHED is not set
+ # CONFIG_CGROUPS is not set
++# CONFIG_GROUP_SCHED is not set
+ CONFIG_SYSFS_DEPRECATED=y
+ CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
+@@ -96,13 +86,11 @@
+ # CONFIG_IPC_NS is not set
+ # CONFIG_USER_NS is not set
+ # CONFIG_PID_NS is not set
+-# CONFIG_NET_NS is not set
+ CONFIG_BLK_DEV_INITRD=y
+ CONFIG_INITRAMFS_SOURCE=""
+ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+ CONFIG_SYSCTL=y
+-CONFIG_ANON_INODES=y
+-CONFIG_EMBEDDED=y
++# CONFIG_EMBEDDED is not set
+ CONFIG_SYSCTL_SYSCALL=y
+ CONFIG_KALLSYMS=y
+ CONFIG_KALLSYMS_ALL=y
+@@ -111,36 +99,37 @@
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
++# CONFIG_COMPAT_BRK is not set
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
++CONFIG_ANON_INODES=y
+ CONFIG_EPOLL=y
+ CONFIG_SIGNALFD=y
+ CONFIG_TIMERFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_SHMEM=y
+-CONFIG_AIO=y
+ CONFIG_VM_EVENT_COUNTERS=y
+-# CONFIG_COMPAT_BRK is not set
+ CONFIG_SLAB=y
+ # CONFIG_SLUB is not set
+ # CONFIG_SLOB is not set
+ CONFIG_PROFILING=y
+-CONFIG_TRACEPOINTS=y
+-CONFIG_MARKERS=y
++# CONFIG_MARKERS is not set
+ CONFIG_OPROFILE=m
+ CONFIG_HAVE_OPROFILE=y
+ # CONFIG_KPROBES is not set
+ CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
+-CONFIG_HAVE_SYSCALL_WRAPPERS=y
+ CONFIG_HAVE_IOREMAP_PROT=y
+ CONFIG_HAVE_KPROBES=y
+ CONFIG_HAVE_KRETPROBES=y
+ CONFIG_HAVE_ARCH_TRACEHOOK=y
+ CONFIG_HAVE_DMA_ATTRS=y
+ CONFIG_USE_GENERIC_SMP_HELPERS=y
++# CONFIG_HAVE_CLK is not set
++CONFIG_PROC_PAGE_MONITOR=y
+ # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+ CONFIG_MODULES=y
+ # CONFIG_MODULE_FORCE_LOAD is not set
+@@ -148,6 +137,7 @@
+ # CONFIG_MODULE_FORCE_UNLOAD is not set
+ # CONFIG_MODVERSIONS is not set
+ # CONFIG_MODULE_SRCVERSION_ALL is not set
++CONFIG_KMOD=y
+ CONFIG_STOP_MACHINE=y
+ CONFIG_BLOCK=y
+ # CONFIG_BLK_DEV_IO_TRACE is not set
+@@ -167,7 +157,7 @@
+ # CONFIG_DEFAULT_CFQ is not set
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="anticipatory"
+-# CONFIG_FREEZER is not set
++CONFIG_CLASSIC_RCU=y
+
+ #
+ # Platform support
+@@ -193,20 +183,18 @@
+ CONFIG_PS3_DISK=y
+ CONFIG_PS3_ROM=y
+ CONFIG_PS3_FLASH=y
+-CONFIG_PS3_VRAM=m
++CONFIG_OPROFILE_PS3=y
+ CONFIG_PS3_LPM=m
+ CONFIG_PPC_CELL=y
+ # CONFIG_PPC_CELL_NATIVE is not set
+ # CONFIG_PPC_IBM_CELL_BLADE is not set
+ # CONFIG_PPC_CELLEB is not set
+-# CONFIG_PPC_CELL_QPACE is not set
+
+ #
+ # Cell Broadband Engine options
+ #
+ CONFIG_SPU_FS=y
+ CONFIG_SPU_FS_64K_LS=y
+-# CONFIG_SPU_TRACE is not set
+ CONFIG_SPU_BASE=y
+ # CONFIG_PQ2ADS is not set
+ # CONFIG_IPIC is not set
+@@ -222,7 +210,6 @@
+ # CONFIG_GENERIC_IOMAP is not set
+ # CONFIG_CPU_FREQ is not set
+ # CONFIG_FSL_ULI1575 is not set
+-# CONFIG_SIMPLE_GPIO is not set
+
+ #
+ # Kernel options
+@@ -242,8 +229,6 @@
+ # CONFIG_PREEMPT is not set
+ CONFIG_BINFMT_ELF=y
+ CONFIG_COMPAT_BINFMT_ELF=y
+-# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+-# CONFIG_HAVE_AOUT is not set
+ CONFIG_BINFMT_MISC=y
+ CONFIG_HUGETLB_PAGE_SIZE_VARIABLE=y
+ # CONFIG_IOMMU_VMERGE is not set
+@@ -266,6 +251,7 @@
+ CONFIG_SPARSEMEM_MANUAL=y
+ CONFIG_SPARSEMEM=y
+ CONFIG_HAVE_MEMORY_PRESENT=y
++# CONFIG_SPARSEMEM_STATIC is not set
+ CONFIG_SPARSEMEM_EXTREME=y
+ CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
+ # CONFIG_SPARSEMEM_VMEMMAP is not set
+@@ -275,14 +261,11 @@
+ CONFIG_PAGEFLAGS_EXTENDED=y
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ CONFIG_MIGRATION=y
+-CONFIG_PHYS_ADDR_T_64BIT=y
++CONFIG_RESOURCES_64BIT=y
+ CONFIG_ZONE_DMA_FLAG=1
+ CONFIG_BOUNCE=y
+-CONFIG_UNEVICTABLE_LRU=y
+ CONFIG_ARCH_MEMORY_PROBE=y
+ CONFIG_PPC_HAS_HASH_64K=y
+-CONFIG_PPC_4K_PAGES=y
+-# CONFIG_PPC_16K_PAGES is not set
+ # CONFIG_PPC_64K_PAGES is not set
+ CONFIG_FORCE_MAX_ZONEORDER=13
+ CONFIG_SCHED_SMT=y
+@@ -316,7 +299,6 @@
+ #
+ # Networking options
+ #
+-CONFIG_COMPAT_NET_DEV_OPS=y
+ CONFIG_PACKET=y
+ CONFIG_PACKET_MMAP=y
+ CONFIG_UNIX=y
+@@ -379,7 +361,6 @@
+ # CONFIG_TIPC is not set
+ # CONFIG_ATM is not set
+ # CONFIG_BRIDGE is not set
+-# CONFIG_NET_DSA is not set
+ # CONFIG_VLAN_8021Q is not set
+ # CONFIG_DECNET is not set
+ # CONFIG_LLC2 is not set
+@@ -390,7 +371,6 @@
+ # CONFIG_ECONET is not set
+ # CONFIG_WAN_ROUTER is not set
+ # CONFIG_NET_SCHED is not set
+-# CONFIG_DCB is not set
+
+ #
+ # Network testing
+@@ -412,37 +392,39 @@
+ #
+ # Bluetooth device drivers
+ #
+-CONFIG_BT_HCIBTUSB=m
++CONFIG_BT_HCIUSB=m
++CONFIG_BT_HCIUSB_SCO=y
+ # CONFIG_BT_HCIUART is not set
+ # CONFIG_BT_HCIBCM203X is not set
+ # CONFIG_BT_HCIBPA10X is not set
+ # CONFIG_BT_HCIBFUSB is not set
+ # CONFIG_BT_HCIVHCI is not set
+ # CONFIG_AF_RXRPC is not set
+-# CONFIG_PHONET is not set
+-CONFIG_WIRELESS=y
++
++#
++# Wireless
++#
+ CONFIG_CFG80211=m
+-# CONFIG_CFG80211_REG_DEBUG is not set
+ CONFIG_NL80211=y
+-# CONFIG_WIRELESS_OLD_REGULATORY is not set
+ CONFIG_WIRELESS_EXT=y
+ # CONFIG_WIRELESS_EXT_SYSFS is not set
+-# CONFIG_LIB80211 is not set
+ CONFIG_MAC80211=m
+
+ #
+ # Rate control algorithm selection
+ #
+ CONFIG_MAC80211_RC_PID=y
+-# CONFIG_MAC80211_RC_MINSTREL is not set
+ CONFIG_MAC80211_RC_DEFAULT_PID=y
+-# CONFIG_MAC80211_RC_DEFAULT_MINSTREL is not set
+ CONFIG_MAC80211_RC_DEFAULT="pid"
+ # CONFIG_MAC80211_MESH is not set
+ # CONFIG_MAC80211_LEDS is not set
+ # CONFIG_MAC80211_DEBUGFS is not set
+ # CONFIG_MAC80211_DEBUG_MENU is not set
+-# CONFIG_WIMAX is not set
++CONFIG_IEEE80211=m
++# CONFIG_IEEE80211_DEBUG is not set
++CONFIG_IEEE80211_CRYPT_WEP=m
++CONFIG_IEEE80211_CRYPT_CCMP=m
++CONFIG_IEEE80211_CRYPT_TKIP=m
+ # CONFIG_RFKILL is not set
+ # CONFIG_NET_9P is not set
+
+@@ -468,7 +450,6 @@
+ CONFIG_MTD_DEBUG_VERBOSE=0
+ # CONFIG_MTD_CONCAT is not set
+ # CONFIG_MTD_PARTITIONS is not set
+-# CONFIG_MTD_TESTS is not set
+
+ #
+ # User Modules And Translation Layers
+@@ -513,6 +494,7 @@
+ #
+ # CONFIG_MTD_SLRAM is not set
+ # CONFIG_MTD_PHRAM is not set
++CONFIG_MTD_PS3VRAM=y
+ # CONFIG_MTD_MTDRAM is not set
+ # CONFIG_MTD_BLOCK2MTD is not set
+
+@@ -526,11 +508,6 @@
+ # CONFIG_MTD_ONENAND is not set
+
+ #
+-# LPDDR flash memory drivers
+-#
+-# CONFIG_MTD_LPDDR is not set
+-
+-#
+ # UBI - Unsorted block images
+ #
+ # CONFIG_MTD_UBI is not set
+@@ -551,13 +528,8 @@
+ # CONFIG_ATA_OVER_ETH is not set
+ # CONFIG_BLK_DEV_HD is not set
+ CONFIG_MISC_DEVICES=y
+-# CONFIG_ENCLOSURE_SERVICES is not set
+-# CONFIG_C2PORT is not set
+-
+-#
+-# EEPROM support
+-#
+ # CONFIG_EEPROM_93CX6 is not set
++# CONFIG_ENCLOSURE_SERVICES is not set
+ CONFIG_HAVE_IDE=y
+ # CONFIG_IDE is not set
+
+@@ -603,17 +575,7 @@
+ # CONFIG_SCSI_LOWLEVEL is not set
+ # CONFIG_SCSI_DH is not set
+ # CONFIG_ATA is not set
+-CONFIG_MD=y
+-# CONFIG_BLK_DEV_MD is not set
+-CONFIG_BLK_DEV_DM=m
+-# CONFIG_DM_DEBUG is not set
+-# CONFIG_DM_CRYPT is not set
+-# CONFIG_DM_SNAPSHOT is not set
+-# CONFIG_DM_MIRROR is not set
+-# CONFIG_DM_ZERO is not set
+-# CONFIG_DM_MULTIPATH is not set
+-# CONFIG_DM_DELAY is not set
+-# CONFIG_DM_UEVENT is not set
++# CONFIG_MD is not set
+ # CONFIG_MACINTOSH_DRIVERS is not set
+ CONFIG_NETDEVICES=y
+ # CONFIG_DUMMY is not set
+@@ -629,9 +591,6 @@
+ # CONFIG_IBM_NEW_EMAC_RGMII is not set
+ # CONFIG_IBM_NEW_EMAC_TAH is not set
+ # CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+-# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
+-# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
+-# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
+ # CONFIG_B44 is not set
+ CONFIG_NETDEV_1000=y
+ CONFIG_GELIC_NET=y
+@@ -645,7 +604,6 @@
+ # CONFIG_WLAN_PRE80211 is not set
+ CONFIG_WLAN_80211=y
+ # CONFIG_LIBERTAS is not set
+-# CONFIG_LIBERTAS_THINFIRM is not set
+ # CONFIG_USB_ZD1201 is not set
+ # CONFIG_USB_NET_RNDIS_WLAN is not set
+ # CONFIG_RTL8187 is not set
+@@ -657,11 +615,13 @@
+ # CONFIG_B43LEGACY is not set
+ CONFIG_ZD1211RW=m
+ # CONFIG_ZD1211RW_DEBUG is not set
+-# CONFIG_RT2X00 is not set
+-
+-#
+-# Enable WiMAX (Networking options) to see the WiMAX drivers
+-#
++CONFIG_RT2X00=m
++CONFIG_RT2X00_LIB=m
++CONFIG_RT2X00_LIB_USB=m
++CONFIG_RT2X00_LIB_FIRMWARE=y
++# CONFIG_RT2500USB is not set
++CONFIG_RT73USB=m
++# CONFIG_RT2X00_DEBUG is not set
+
+ #
+ # USB Network Adapters
+@@ -674,7 +634,6 @@
+ CONFIG_USB_NET_AX8817X=m
+ # CONFIG_USB_NET_CDCETHER is not set
+ # CONFIG_USB_NET_DM9601 is not set
+-# CONFIG_USB_NET_SMSC95XX is not set
+ # CONFIG_USB_NET_GL620A is not set
+ # CONFIG_USB_NET_NET1080 is not set
+ # CONFIG_USB_NET_PLUSB is not set
+@@ -705,7 +664,7 @@
+ # Input device support
+ #
+ CONFIG_INPUT=y
+-CONFIG_INPUT_FF_MEMLESS=m
++# CONFIG_INPUT_FF_MEMLESS is not set
+ # CONFIG_INPUT_POLLDEV is not set
+
+ #
+@@ -776,10 +735,8 @@
+ # Non-8250 serial port support
+ #
+ CONFIG_UNIX98_PTYS=y
+-# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+ CONFIG_LEGACY_PTYS=y
+ CONFIG_LEGACY_PTY_COUNT=16
+-# CONFIG_HVC_UDBG is not set
+ # CONFIG_IPMI_HANDLER is not set
+ # CONFIG_HW_RANDOM is not set
+ # CONFIG_R3964 is not set
+@@ -796,11 +753,11 @@
+ # CONFIG_THERMAL is not set
+ # CONFIG_THERMAL_HWMON is not set
+ # CONFIG_WATCHDOG is not set
+-CONFIG_SSB_POSSIBLE=y
+
+ #
+ # Sonics Silicon Backplane
+ #
++CONFIG_SSB_POSSIBLE=y
+ # CONFIG_SSB is not set
+
+ #
+@@ -810,7 +767,6 @@
+ # CONFIG_MFD_SM501 is not set
+ # CONFIG_HTC_PASIC3 is not set
+ # CONFIG_MFD_TMIO is not set
+-# CONFIG_REGULATOR is not set
+
+ #
+ # Multimedia devices
+@@ -836,7 +792,6 @@
+ CONFIG_FB=y
+ # CONFIG_FIRMWARE_EDID is not set
+ # CONFIG_FB_DDC is not set
+-# CONFIG_FB_BOOT_VESA_SUPPORT is not set
+ # CONFIG_FB_CFB_FILLRECT is not set
+ # CONFIG_FB_CFB_COPYAREA is not set
+ # CONFIG_FB_CFB_IMAGEBLIT is not set
+@@ -862,8 +817,6 @@
+ CONFIG_FB_PS3=y
+ CONFIG_FB_PS3_DEFAULT_SIZE_M=9
+ # CONFIG_FB_VIRTUAL is not set
+-# CONFIG_FB_METRONOME is not set
+-# CONFIG_FB_MB862XX is not set
+ # CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+ #
+@@ -888,7 +841,6 @@
+ # CONFIG_LOGO_LINUX_VGA16 is not set
+ CONFIG_LOGO_LINUX_CLUT224=y
+ CONFIG_SOUND=m
+-# CONFIG_SOUND_OSS_CORE is not set
+ CONFIG_SND=m
+ CONFIG_SND_TIMER=m
+ CONFIG_SND_PCM=m
+@@ -897,7 +849,6 @@
+ # CONFIG_SND_SEQUENCER is not set
+ # CONFIG_SND_MIXER_OSS is not set
+ # CONFIG_SND_PCM_OSS is not set
+-# CONFIG_SND_HRTIMER is not set
+ # CONFIG_SND_DYNAMIC_MINORS is not set
+ CONFIG_SND_SUPPORT_OLD_API=y
+ CONFIG_SND_VERBOSE_PROCFS=y
+@@ -922,40 +873,15 @@
+ # USB Input Devices
+ #
+ CONFIG_USB_HID=m
+-# CONFIG_HID_PID is not set
+-CONFIG_USB_HIDDEV=y
++# CONFIG_USB_HIDINPUT_POWERBOOK is not set
++# CONFIG_HID_FF is not set
++# CONFIG_USB_HIDDEV is not set
+
+ #
+ # USB HID Boot Protocol drivers
+ #
+ # CONFIG_USB_KBD is not set
+ # CONFIG_USB_MOUSE is not set
+-
+-#
+-# Special HID drivers
+-#
+-# CONFIG_HID_COMPAT is not set
+-# CONFIG_HID_A4TECH is not set
+-# CONFIG_HID_APPLE is not set
+-# CONFIG_HID_BELKIN is not set
+-# CONFIG_HID_CHERRY is not set
+-# CONFIG_HID_CHICONY is not set
+-# CONFIG_HID_CYPRESS is not set
+-# CONFIG_HID_EZKEY is not set
+-# CONFIG_HID_GYRATION is not set
+-# CONFIG_HID_LOGITECH is not set
+-# CONFIG_HID_MICROSOFT is not set
+-# CONFIG_HID_MONTEREY is not set
+-# CONFIG_HID_NTRIG is not set
+-# CONFIG_HID_PANTHERLORD is not set
+-# CONFIG_HID_PETALYNX is not set
+-# CONFIG_HID_SAMSUNG is not set
+-# CONFIG_HID_SONY is not set
+-# CONFIG_HID_SUNPLUS is not set
+-# CONFIG_GREENASIA_FF is not set
+-# CONFIG_HID_TOPSEED is not set
+-# CONFIG_THRUSTMASTER_FF is not set
+-# CONFIG_ZEROPLUS_FF is not set
+ CONFIG_USB_SUPPORT=y
+ CONFIG_USB_ARCH_HAS_HCD=y
+ CONFIG_USB_ARCH_HAS_OHCI=y
+@@ -972,11 +898,7 @@
+ # CONFIG_USB_DYNAMIC_MINORS is not set
+ CONFIG_USB_SUSPEND=y
+ # CONFIG_USB_OTG is not set
+-# CONFIG_USB_OTG_WHITELIST is not set
+-# CONFIG_USB_OTG_BLACKLIST_HUB is not set
+-CONFIG_USB_MON=m
+-# CONFIG_USB_WUSB is not set
+-# CONFIG_USB_WUSB_CBAF is not set
++CONFIG_USB_MON=y
+
+ #
+ # USB Host Controller Drivers
+@@ -987,7 +909,6 @@
+ # CONFIG_USB_EHCI_TT_NEWSCHED is not set
+ CONFIG_USB_EHCI_BIG_ENDIAN_MMIO=y
+ # CONFIG_USB_EHCI_HCD_PPC_OF is not set
+-# CONFIG_USB_OXU210HP_HCD is not set
+ # CONFIG_USB_ISP116X_HCD is not set
+ # CONFIG_USB_ISP1760_HCD is not set
+ CONFIG_USB_OHCI_HCD=m
+@@ -997,7 +918,6 @@
+ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+ # CONFIG_USB_SL811_HCD is not set
+ # CONFIG_USB_R8A66597_HCD is not set
+-# CONFIG_USB_HWA_HCD is not set
+
+ #
+ # Enable Host or Gadget support to see Inventra options
+@@ -1009,20 +929,20 @@
+ # CONFIG_USB_ACM is not set
+ # CONFIG_USB_PRINTER is not set
+ # CONFIG_USB_WDM is not set
+-# CONFIG_USB_TMC is not set
+
+ #
+-# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+
+ #
+-# see USB_STORAGE Help for more information
++# may also be needed; see USB_STORAGE Help for more information
+ #
+ CONFIG_USB_STORAGE=m
+ # CONFIG_USB_STORAGE_DEBUG is not set
+ # CONFIG_USB_STORAGE_DATAFAB is not set
+ # CONFIG_USB_STORAGE_FREECOM is not set
+ # CONFIG_USB_STORAGE_ISD200 is not set
++# CONFIG_USB_STORAGE_DPCM is not set
+ # CONFIG_USB_STORAGE_USBAT is not set
+ # CONFIG_USB_STORAGE_SDDR09 is not set
+ # CONFIG_USB_STORAGE_SDDR55 is not set
+@@ -1030,6 +950,7 @@
+ # CONFIG_USB_STORAGE_ALAUDA is not set
+ # CONFIG_USB_STORAGE_ONETOUCH is not set
+ # CONFIG_USB_STORAGE_KARMA is not set
++# CONFIG_USB_STORAGE_SIERRA is not set
+ # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
+ # CONFIG_USB_LIBUSUAL is not set
+
+@@ -1050,7 +971,6 @@
+ # CONFIG_USB_EMI62 is not set
+ # CONFIG_USB_EMI26 is not set
+ # CONFIG_USB_ADUTUX is not set
+-# CONFIG_USB_SEVSEG is not set
+ # CONFIG_USB_RIO500 is not set
+ # CONFIG_USB_LEGOTOWER is not set
+ # CONFIG_USB_LCD is not set
+@@ -1068,12 +988,7 @@
+ # CONFIG_USB_IOWARRIOR is not set
+ # CONFIG_USB_TEST is not set
+ # CONFIG_USB_ISIGHTFW is not set
+-# CONFIG_USB_VST is not set
+ # CONFIG_USB_GADGET is not set
+-
+-#
+-# OTG and related infrastructure
+-#
+ # CONFIG_MMC is not set
+ # CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS is not set
+@@ -1099,15 +1014,12 @@
+ # Platform RTC drivers
+ #
+ # CONFIG_RTC_DRV_CMOS is not set
+-# CONFIG_RTC_DRV_DS1286 is not set
+ # CONFIG_RTC_DRV_DS1511 is not set
+ # CONFIG_RTC_DRV_DS1553 is not set
+ # CONFIG_RTC_DRV_DS1742 is not set
+ # CONFIG_RTC_DRV_STK17TA8 is not set
+ # CONFIG_RTC_DRV_M48T86 is not set
+-# CONFIG_RTC_DRV_M48T35 is not set
+ # CONFIG_RTC_DRV_M48T59 is not set
+-# CONFIG_RTC_DRV_BQ4802 is not set
+ # CONFIG_RTC_DRV_V3020 is not set
+
+ #
+@@ -1116,7 +1028,6 @@
+ CONFIG_RTC_DRV_PPC=m
+ # CONFIG_DMADEVICES is not set
+ # CONFIG_UIO is not set
+-# CONFIG_STAGING is not set
+
+ #
+ # File systems
+@@ -1124,35 +1035,26 @@
+ CONFIG_EXT2_FS=m
+ # CONFIG_EXT2_FS_XATTR is not set
+ # CONFIG_EXT2_FS_XIP is not set
+-CONFIG_EXT3_FS=m
++CONFIG_EXT3_FS=y
+ CONFIG_EXT3_FS_XATTR=y
+ # CONFIG_EXT3_FS_POSIX_ACL is not set
+ # CONFIG_EXT3_FS_SECURITY is not set
+-CONFIG_EXT4_FS=y
+-# CONFIG_EXT4DEV_COMPAT is not set
+-CONFIG_EXT4_FS_XATTR=y
+-# CONFIG_EXT4_FS_POSIX_ACL is not set
+-# CONFIG_EXT4_FS_SECURITY is not set
+-CONFIG_JBD=m
++# CONFIG_EXT4DEV_FS is not set
++CONFIG_JBD=y
+ # CONFIG_JBD_DEBUG is not set
+-CONFIG_JBD2=y
+-# CONFIG_JBD2_DEBUG is not set
+ CONFIG_FS_MBCACHE=y
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
+ # CONFIG_FS_POSIX_ACL is not set
+-CONFIG_FILE_LOCKING=y
+ # CONFIG_XFS_FS is not set
+ # CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_BTRFS_FS is not set
+ CONFIG_DNOTIFY=y
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+ CONFIG_QUOTA=y
+ # CONFIG_QUOTA_NETLINK_INTERFACE is not set
+ CONFIG_PRINT_QUOTA_WARNING=y
+-CONFIG_QUOTA_TREE=y
+ # CONFIG_QFMT_V1 is not set
+ CONFIG_QFMT_V2=y
+ CONFIG_QUOTACTL=y
+@@ -1185,14 +1087,16 @@
+ CONFIG_PROC_FS=y
+ CONFIG_PROC_KCORE=y
+ CONFIG_PROC_SYSCTL=y
+-CONFIG_PROC_PAGE_MONITOR=y
+ CONFIG_SYSFS=y
+ CONFIG_TMPFS=y
+ # CONFIG_TMPFS_POSIX_ACL is not set
+ CONFIG_HUGETLBFS=y
+ CONFIG_HUGETLB_PAGE=y
+ # CONFIG_CONFIGFS_FS is not set
+-CONFIG_MISC_FILESYSTEMS=y
++
++#
++# Miscellaneous filesystems
++#
+ # CONFIG_ADFS_FS is not set
+ # CONFIG_AFFS_FS is not set
+ # CONFIG_HFS_FS is not set
+@@ -1202,7 +1106,6 @@
+ # CONFIG_EFS_FS is not set
+ # CONFIG_JFFS2_FS is not set
+ # CONFIG_CRAMFS is not set
+-# CONFIG_SQUASHFS is not set
+ # CONFIG_VXFS_FS is not set
+ # CONFIG_MINIX_FS is not set
+ # CONFIG_OMFS_FS is not set
+@@ -1223,7 +1126,6 @@
+ CONFIG_NFS_COMMON=y
+ CONFIG_SUNRPC=y
+ CONFIG_SUNRPC_GSS=y
+-# CONFIG_SUNRPC_REGISTER_V4 is not set
+ CONFIG_RPCSEC_GSS_KRB5=y
+ # CONFIG_RPCSEC_GSS_SPKM3 is not set
+ # CONFIG_SMB_FS is not set
+@@ -1288,9 +1190,9 @@
+ # Library routines
+ #
+ CONFIG_BITREVERSE=y
+-CONFIG_GENERIC_FIND_LAST_BIT=y
++# CONFIG_GENERIC_FIND_FIRST_BIT is not set
+ CONFIG_CRC_CCITT=m
+-CONFIG_CRC16=y
++# CONFIG_CRC16 is not set
+ CONFIG_CRC_T10DIF=y
+ CONFIG_CRC_ITU_T=m
+ CONFIG_CRC32=y
+@@ -1348,44 +1250,27 @@
+ CONFIG_DEBUG_MEMORY_INIT=y
+ CONFIG_DEBUG_LIST=y
+ # CONFIG_DEBUG_SG is not set
+-# CONFIG_DEBUG_NOTIFIERS is not set
++CONFIG_FRAME_POINTER=y
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
+-# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+ # CONFIG_BACKTRACE_SELF_TEST is not set
+-# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_LATENCYTOP is not set
+ CONFIG_SYSCTL_SYSCALL_CHECK=y
+-CONFIG_NOP_TRACER=y
+-CONFIG_HAVE_FUNCTION_TRACER=y
++CONFIG_HAVE_FTRACE=y
+ CONFIG_HAVE_DYNAMIC_FTRACE=y
+-CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
+-CONFIG_RING_BUFFER=y
+-CONFIG_TRACING=y
+-
+-#
+-# Tracers
+-#
+-# CONFIG_FUNCTION_TRACER is not set
++# CONFIG_FTRACE is not set
+ # CONFIG_IRQSOFF_TRACER is not set
+ # CONFIG_SCHED_TRACER is not set
+ # CONFIG_CONTEXT_SWITCH_TRACER is not set
+-# CONFIG_BOOT_TRACER is not set
+-# CONFIG_TRACE_BRANCH_PROFILING is not set
+-# CONFIG_STACK_TRACER is not set
+-# CONFIG_FTRACE_STARTUP_TEST is not set
+-# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
+ # CONFIG_SAMPLES is not set
+ CONFIG_HAVE_ARCH_KGDB=y
+ # CONFIG_KGDB is not set
+-CONFIG_PRINT_STACK_DEPTH=64
+ CONFIG_DEBUG_STACKOVERFLOW=y
+ # CONFIG_DEBUG_STACK_USAGE is not set
+ # CONFIG_DEBUG_PAGEALLOC is not set
+ # CONFIG_CODE_PATCHING_SELFTEST is not set
+ # CONFIG_FTR_FIXUP_SELFTEST is not set
+-# CONFIG_MSI_BITMAP_SELFTEST is not set
+ # CONFIG_XMON is not set
+ CONFIG_IRQSTACKS=y
+ # CONFIG_VIRQ_DEBUG is not set
+@@ -1397,26 +1282,16 @@
+ #
+ # CONFIG_KEYS is not set
+ # CONFIG_SECURITY is not set
+-# CONFIG_SECURITYFS is not set
+ # CONFIG_SECURITY_FILE_CAPABILITIES is not set
+ CONFIG_CRYPTO=y
+
+ #
+ # Crypto core or helper
+ #
+-# CONFIG_CRYPTO_FIPS is not set
+ CONFIG_CRYPTO_ALGAPI=y
+-CONFIG_CRYPTO_ALGAPI2=y
+ CONFIG_CRYPTO_AEAD=m
+-CONFIG_CRYPTO_AEAD2=y
+ CONFIG_CRYPTO_BLKCIPHER=y
+-CONFIG_CRYPTO_BLKCIPHER2=y
+-CONFIG_CRYPTO_HASH=y
+-CONFIG_CRYPTO_HASH2=y
+-CONFIG_CRYPTO_RNG=m
+-CONFIG_CRYPTO_RNG2=y
+ CONFIG_CRYPTO_MANAGER=y
+-CONFIG_CRYPTO_MANAGER2=y
+ CONFIG_CRYPTO_GF128MUL=m
+ # CONFIG_CRYPTO_NULL is not set
+ # CONFIG_CRYPTO_CRYPTD is not set
+@@ -1488,11 +1363,6 @@
+ #
+ # CONFIG_CRYPTO_DEFLATE is not set
+ CONFIG_CRYPTO_LZO=m
+-
+-#
+-# Random Number Generation
+-#
+-# CONFIG_CRYPTO_ANSI_CPRNG is not set
+ CONFIG_CRYPTO_HW=y
+ # CONFIG_PPC_CLOCK is not set
+ # CONFIG_VIRTUALIZATION is not set
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/configs/storcenter_defconfig linux-2.6.29-rc3.owrt/arch/powerpc/configs/storcenter_defconfig
+--- linux-2.6.29.owrt/arch/powerpc/configs/storcenter_defconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/configs/storcenter_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-rc6
+-# Fri Mar 6 00:09:08 2009
++# Linux kernel version: 2.6.29-rc2
++# Mon Jan 26 15:35:46 2009
+ #
+ # CONFIG_PPC64 is not set
+
+@@ -71,15 +71,6 @@
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
+ # CONFIG_AUDIT is not set
+-
+-#
+-# RCU Subsystem
+-#
+-CONFIG_CLASSIC_RCU=y
+-# CONFIG_TREE_RCU is not set
+-# CONFIG_PREEMPT_RCU is not set
+-# CONFIG_TREE_RCU_TRACE is not set
+-# CONFIG_PREEMPT_RCU_TRACE is not set
+ # CONFIG_IKCONFIG is not set
+ CONFIG_LOG_BUF_SHIFT=14
+ CONFIG_GROUP_SCHED=y
+@@ -153,6 +144,11 @@
+ CONFIG_DEFAULT_CFQ=y
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="cfq"
++CONFIG_CLASSIC_RCU=y
++# CONFIG_TREE_RCU is not set
++# CONFIG_PREEMPT_RCU is not set
++# CONFIG_TREE_RCU_TRACE is not set
++# CONFIG_PREEMPT_RCU_TRACE is not set
+ # CONFIG_FREEZER is not set
+
+ #
+@@ -381,8 +377,8 @@
+ CONFIG_MTD_PARTITIONS=y
+ # CONFIG_MTD_TESTS is not set
+ # CONFIG_MTD_REDBOOT_PARTS is not set
+-CONFIG_MTD_CMDLINE_PARTS=y
+-CONFIG_MTD_OF_PARTS=y
++# CONFIG_MTD_CMDLINE_PARTS is not set
++# CONFIG_MTD_OF_PARTS is not set
+ # CONFIG_MTD_AR7_PARTS is not set
+
+ #
+@@ -456,6 +452,7 @@
+ # LPDDR flash memory drivers
+ #
+ # CONFIG_MTD_LPDDR is not set
++# CONFIG_MTD_QINFO_PROBE is not set
+
+ #
+ # UBI - Unsorted block images
+@@ -481,19 +478,13 @@
+ # CONFIG_BLK_DEV_HD is not set
+ CONFIG_MISC_DEVICES=y
+ # CONFIG_PHANTOM is not set
++# CONFIG_EEPROM_93CX6 is not set
+ # CONFIG_SGI_IOC4 is not set
+ # CONFIG_TIFM_CORE is not set
+ # CONFIG_ICS932S401 is not set
+ # CONFIG_ENCLOSURE_SERVICES is not set
+ # CONFIG_HP_ILO is not set
+ # CONFIG_C2PORT is not set
+-
+-#
+-# EEPROM support
+-#
+-# CONFIG_EEPROM_AT24 is not set
+-# CONFIG_EEPROM_LEGACY is not set
+-# CONFIG_EEPROM_93CX6 is not set
+ CONFIG_HAVE_IDE=y
+ CONFIG_IDE=y
+
+@@ -686,7 +677,6 @@
+ # CONFIG_QLA3XXX is not set
+ # CONFIG_ATL1 is not set
+ # CONFIG_ATL1E is not set
+-# CONFIG_ATL1C is not set
+ # CONFIG_JME is not set
+ # CONFIG_NETDEV_10000 is not set
+ # CONFIG_TR is not set
+@@ -828,6 +818,8 @@
+ # Miscellaneous I2C Chip support
+ #
+ # CONFIG_DS1682 is not set
++# CONFIG_EEPROM_AT24 is not set
++# CONFIG_EEPROM_LEGACY is not set
+ # CONFIG_SENSORS_PCF8574 is not set
+ # CONFIG_PCF8575 is not set
+ # CONFIG_SENSORS_PCA9539 is not set
+@@ -1167,7 +1159,6 @@
+ # CONFIG_SYSV_FS is not set
+ # CONFIG_UFS_FS is not set
+ # CONFIG_NETWORK_FILESYSTEMS is not set
+-CONFIG_EXPORTFS=m
+
+ #
+ # Partition Types
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/include/asm/compat.h linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/compat.h
+--- linux-2.6.29.owrt/arch/powerpc/include/asm/compat.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/compat.h 2009-05-10 23:48:28.000000000 +0200
+@@ -210,10 +210,5 @@
+ compat_ulong_t __unused6;
+ };
+
+-static inline int is_compat_task(void)
+-{
+- return test_thread_flag(TIF_32BIT);
+-}
+-
+ #endif /* __KERNEL__ */
+ #endif /* _ASM_POWERPC_COMPAT_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/include/asm/cputable.h linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/cputable.h
+--- linux-2.6.29.owrt/arch/powerpc/include/asm/cputable.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/cputable.h 2009-05-10 23:48:28.000000000 +0200
+@@ -241,11 +241,9 @@
+ /* We need to mark all pages as being coherent if we're SMP or we have a
+ * 74[45]x and an MPC107 host bridge. Also 83xx and PowerQUICC II
+ * require it for PCI "streaming/prefetch" to work properly.
+- * This is also required by 52xx family.
+ */
+ #if defined(CONFIG_SMP) || defined(CONFIG_MPC10X_BRIDGE) \
+- || defined(CONFIG_PPC_83xx) || defined(CONFIG_8260) \
+- || defined(CONFIG_PPC_MPC52xx)
++ || defined(CONFIG_PPC_83xx) || defined(CONFIG_8260)
+ #define CPU_FTR_COMMON CPU_FTR_NEED_COHERENT
+ #else
+ #define CPU_FTR_COMMON 0
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/include/asm/pgtable-4k.h linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/pgtable-4k.h
+--- linux-2.6.29.owrt/arch/powerpc/include/asm/pgtable-4k.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/pgtable-4k.h 2009-05-10 23:48:28.000000000 +0200
+@@ -60,7 +60,7 @@
+ /* It should be preserving the high 48 bits and then specifically */
+ /* preserving _PAGE_SECONDARY | _PAGE_GROUP_IX */
+ #define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY | \
+- _PAGE_HPTEFLAGS | _PAGE_SPECIAL)
++ _PAGE_HPTEFLAGS)
+
+ /* Bits to mask out from a PMD to get to the PTE page */
+ #define PMD_MASKED_BITS 0
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/include/asm/pgtable-64k.h linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/pgtable-64k.h
+--- linux-2.6.29.owrt/arch/powerpc/include/asm/pgtable-64k.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/pgtable-64k.h 2009-05-10 23:48:28.000000000 +0200
+@@ -114,7 +114,7 @@
+ * pgprot changes
+ */
+ #define _PAGE_CHG_MASK (PTE_RPN_MASK | _PAGE_HPTEFLAGS | _PAGE_DIRTY | \
+- _PAGE_ACCESSED | _PAGE_SPECIAL)
++ _PAGE_ACCESSED)
+
+ /* Bits to mask out from a PMD to get to the PTE page */
+ #define PMD_MASKED_BITS 0x1ff
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/include/asm/pgtable-ppc32.h linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/pgtable-ppc32.h
+--- linux-2.6.29.owrt/arch/powerpc/include/asm/pgtable-ppc32.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/pgtable-ppc32.h 2009-05-10 23:48:28.000000000 +0200
+@@ -429,8 +429,7 @@
+ #define PMD_PAGE_SIZE(pmd) bad_call_to_PMD_PAGE_SIZE()
+ #endif
+
+-#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY | \
+- _PAGE_SPECIAL)
++#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY)
+
+
+ #define PAGE_PROT_BITS (_PAGE_GUARDED | _PAGE_COHERENT | _PAGE_NO_CACHE | \
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/include/asm/seccomp.h linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/seccomp.h
+--- linux-2.6.29.owrt/arch/powerpc/include/asm/seccomp.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/include/asm/seccomp.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,6 +1,10 @@
+ #ifndef _ASM_POWERPC_SECCOMP_H
+ #define _ASM_POWERPC_SECCOMP_H
+
++#ifdef __KERNEL__
++#include <linux/thread_info.h>
++#endif
++
+ #include <linux/unistd.h>
+
+ #define __NR_seccomp_read __NR_read
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/kernel/align.c linux-2.6.29-rc3.owrt/arch/powerpc/kernel/align.c
+--- linux-2.6.29.owrt/arch/powerpc/kernel/align.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/kernel/align.c 2009-05-10 23:48:28.000000000 +0200
+@@ -367,24 +367,27 @@
+ static int emulate_fp_pair(unsigned char __user *addr, unsigned int reg,
+ unsigned int flags)
+ {
+- char *ptr0 = (char *) &current->thread.TS_FPR(reg);
+- char *ptr1 = (char *) &current->thread.TS_FPR(reg+1);
+- int i, ret, sw = 0;
++ char *ptr = (char *) &current->thread.TS_FPR(reg);
++ int i, ret;
+
+ if (!(flags & F))
+ return 0;
+ if (reg & 1)
+ return 0; /* invalid form: FRS/FRT must be even */
+- if (flags & SW)
+- sw = 7;
+- ret = 0;
+- for (i = 0; i < 8; ++i) {
+- if (!(flags & ST)) {
+- ret |= __get_user(ptr0[i^sw], addr + i);
+- ret |= __get_user(ptr1[i^sw], addr + i + 8);
+- } else {
+- ret |= __put_user(ptr0[i^sw], addr + i);
+- ret |= __put_user(ptr1[i^sw], addr + i + 8);
++ if (!(flags & SW)) {
++ /* not byte-swapped - easy */
++ if (!(flags & ST))
++ ret = __copy_from_user(ptr, addr, 16);
++ else
++ ret = __copy_to_user(addr, ptr, 16);
++ } else {
++ /* each FPR value is byte-swapped separately */
++ ret = 0;
++ for (i = 0; i < 16; ++i) {
++ if (!(flags & ST))
++ ret |= __get_user(ptr[i^7], addr + i);
++ else
++ ret |= __put_user(ptr[i^7], addr + i);
+ }
+ }
+ if (ret)
+@@ -643,16 +646,11 @@
+ unsigned int areg, struct pt_regs *regs,
+ unsigned int flags, unsigned int length)
+ {
+- char *ptr;
++ char *ptr = (char *) &current->thread.TS_FPR(reg);
+ int ret = 0;
+
+ flush_vsx_to_thread(current);
+
+- if (reg < 32)
+- ptr = (char *) &current->thread.TS_FPR(reg);
+- else
+- ptr = (char *) &current->thread.vr[reg - 32];
+-
+ if (flags & ST)
+ ret = __copy_to_user(addr, ptr, length);
+ else {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/kernel/ftrace.c linux-2.6.29-rc3.owrt/arch/powerpc/kernel/ftrace.c
+--- linux-2.6.29.owrt/arch/powerpc/kernel/ftrace.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/kernel/ftrace.c 2009-05-10 23:48:28.000000000 +0200
+@@ -195,9 +195,8 @@
+ return -EINVAL;
+ }
+
+- /* The bottom half is signed extended */
+- offset = ((unsigned)((unsigned short)jmp[0]) << 16) +
+- (int)((short)jmp[1]);
++ offset = (unsigned)((unsigned short)jmp[0]) << 16 |
++ (unsigned)((unsigned short)jmp[1]);
+
+ DEBUGP(" %x ", offset);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/kernel/head_32.S linux-2.6.29-rc3.owrt/arch/powerpc/kernel/head_32.S
+--- linux-2.6.29.owrt/arch/powerpc/kernel/head_32.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/kernel/head_32.S 2009-05-10 23:48:28.000000000 +0200
+@@ -511,11 +511,8 @@
+ and r1,r1,r2 /* writable if _RW and _DIRTY */
+ rlwimi r3,r3,32-1,30,30 /* _PAGE_USER -> PP msb */
+ rlwimi r3,r3,32-1,31,31 /* _PAGE_USER -> PP lsb */
+- ori r1,r1,0xe04 /* clear out reserved bits */
++ ori r1,r1,0xe14 /* clear out reserved bits and M */
+ andc r1,r3,r1 /* PP = user? (rw&dirty? 2: 3): 0 */
+-BEGIN_FTR_SECTION
+- rlwinm r1,r1,0,~_PAGE_COHERENT /* clear M (coherence not required) */
+-END_FTR_SECTION_IFCLR(CPU_FTR_NEED_COHERENT)
+ mtspr SPRN_RPA,r1
+ mfspr r3,SPRN_IMISS
+ tlbli r3
+@@ -588,11 +585,8 @@
+ and r1,r1,r2 /* writable if _RW and _DIRTY */
+ rlwimi r3,r3,32-1,30,30 /* _PAGE_USER -> PP msb */
+ rlwimi r3,r3,32-1,31,31 /* _PAGE_USER -> PP lsb */
+- ori r1,r1,0xe04 /* clear out reserved bits */
++ ori r1,r1,0xe14 /* clear out reserved bits and M */
+ andc r1,r3,r1 /* PP = user? (rw&dirty? 2: 3): 0 */
+-BEGIN_FTR_SECTION
+- rlwinm r1,r1,0,~_PAGE_COHERENT /* clear M (coherence not required) */
+-END_FTR_SECTION_IFCLR(CPU_FTR_NEED_COHERENT)
+ mtspr SPRN_RPA,r1
+ mfspr r3,SPRN_DMISS
+ tlbld r3
+@@ -659,11 +653,8 @@
+ stw r3,0(r2) /* update PTE (accessed/dirty bits) */
+ /* Convert linux-style PTE to low word of PPC-style PTE */
+ rlwimi r3,r3,32-1,30,30 /* _PAGE_USER -> PP msb */
+- li r1,0xe05 /* clear out reserved bits & PP lsb */
++ li r1,0xe15 /* clear out reserved bits and M */
+ andc r1,r3,r1 /* PP = user? 2: 0 */
+-BEGIN_FTR_SECTION
+- rlwinm r1,r1,0,~_PAGE_COHERENT /* clear M (coherence not required) */
+-END_FTR_SECTION_IFCLR(CPU_FTR_NEED_COHERENT)
+ mtspr SPRN_RPA,r1
+ mfspr r3,SPRN_DMISS
+ tlbld r3
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/kernel/pci-common.c linux-2.6.29-rc3.owrt/arch/powerpc/kernel/pci-common.c
+--- linux-2.6.29.owrt/arch/powerpc/kernel/pci-common.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/kernel/pci-common.c 2009-05-10 23:48:28.000000000 +0200
+@@ -16,6 +16,8 @@
+ * 2 of the License, or (at your option) any later version.
+ */
+
++#define DEBUG
++
+ #include <linux/kernel.h>
+ #include <linux/pci.h>
+ #include <linux/string.h>
+@@ -256,8 +258,7 @@
+ } else {
+ pr_debug(" Got one, spec %d cells (0x%08x 0x%08x...) on %s\n",
+ oirq.size, oirq.specifier[0], oirq.specifier[1],
+- oirq.controller ? oirq.controller->full_name :
+- "<default>");
++ oirq.controller->full_name);
+
+ virq = irq_create_of_mapping(oirq.controller, oirq.specifier,
+ oirq.size);
+@@ -561,21 +562,8 @@
+ (unsigned long long)(offset + size - 1));
+
+ if (mmap_state == pci_mmap_mem) {
+- /* Hack alert !
+- *
+- * Because X is lame and can fail starting if it gets an error trying
+- * to mmap legacy_mem (instead of just moving on without legacy memory
+- * access) we fake it here by giving it anonymous memory, effectively
+- * behaving just like /dev/zero
+- */
+- if ((offset + size) > hose->isa_mem_size) {
+- printk(KERN_DEBUG
+- "Process %s (pid:%d) mapped non-existing PCI legacy memory for 0%04x:%02x\n",
+- current->comm, current->pid, pci_domain_nr(bus), bus->number);
+- if (vma->vm_flags & VM_SHARED)
+- return shmem_zero_setup(vma);
+- return 0;
+- }
++ if ((offset + size) > hose->isa_mem_size)
++ return -ENXIO;
+ offset += hose->isa_mem_phys;
+ } else {
+ unsigned long io_offset = (unsigned long)hose->io_base_virt - _IO_BASE;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/kvm/powerpc.c linux-2.6.29-rc3.owrt/arch/powerpc/kvm/powerpc.c
+--- linux-2.6.29.owrt/arch/powerpc/kvm/powerpc.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/kvm/powerpc.c 2009-05-10 23:48:28.000000000 +0200
+@@ -125,10 +125,6 @@
+ }
+ }
+
+-void kvm_arch_sync_events(struct kvm *kvm)
+-{
+-}
+-
+ void kvm_arch_destroy_vm(struct kvm *kvm)
+ {
+ kvmppc_free_vcpus(kvm);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/lib/copyuser_64.S linux-2.6.29-rc3.owrt/arch/powerpc/lib/copyuser_64.S
+--- linux-2.6.29.owrt/arch/powerpc/lib/copyuser_64.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/lib/copyuser_64.S 2009-05-10 23:48:28.000000000 +0200
+@@ -62,19 +62,18 @@
+ 72: std r8,8(r3)
+ beq+ 3f
+ addi r3,r3,16
++23: ld r9,8(r4)
+ .Ldo_tail:
+ bf cr7*4+1,1f
+-23: lwz r9,8(r4)
+- addi r4,r4,4
++ rotldi r9,r9,32
+ 73: stw r9,0(r3)
+ addi r3,r3,4
+ 1: bf cr7*4+2,2f
+-44: lhz r9,8(r4)
+- addi r4,r4,2
++ rotldi r9,r9,16
+ 74: sth r9,0(r3)
+ addi r3,r3,2
+ 2: bf cr7*4+3,3f
+-45: lbz r9,8(r4)
++ rotldi r9,r9,8
+ 75: stb r9,0(r3)
+ 3: li r3,0
+ blr
+@@ -142,24 +141,11 @@
+ 6: cmpwi cr1,r5,8
+ addi r3,r3,32
+ sld r9,r9,r10
+- ble cr1,7f
++ ble cr1,.Ldo_tail
+ 34: ld r0,8(r4)
+ srd r7,r0,r11
+ or r9,r7,r9
+-7:
+- bf cr7*4+1,1f
+- rotldi r9,r9,32
+-94: stw r9,0(r3)
+- addi r3,r3,4
+-1: bf cr7*4+2,2f
+- rotldi r9,r9,16
+-95: sth r9,0(r3)
+- addi r3,r3,2
+-2: bf cr7*4+3,3f
+- rotldi r9,r9,8
+-96: stb r9,0(r3)
+-3: li r3,0
+- blr
++ b .Ldo_tail
+
+ .Ldst_unaligned:
+ PPC_MTOCRF 0x01,r6 /* put #bytes to 8B bdry into cr7 */
+@@ -232,6 +218,7 @@
+ 121:
+ 132:
+ addi r3,r3,8
++123:
+ 134:
+ 135:
+ 138:
+@@ -239,9 +226,6 @@
+ 140:
+ 141:
+ 142:
+-123:
+-144:
+-145:
+
+ /*
+ * here we have had a fault on a load and r3 points to the first
+@@ -325,9 +309,6 @@
+ 187:
+ 188:
+ 189:
+-194:
+-195:
+-196:
+ 1:
+ ld r6,-24(r1)
+ ld r5,-8(r1)
+@@ -348,9 +329,7 @@
+ .llong 72b,172b
+ .llong 23b,123b
+ .llong 73b,173b
+- .llong 44b,144b
+ .llong 74b,174b
+- .llong 45b,145b
+ .llong 75b,175b
+ .llong 24b,124b
+ .llong 25b,125b
+@@ -368,9 +347,6 @@
+ .llong 79b,179b
+ .llong 80b,180b
+ .llong 34b,134b
+- .llong 94b,194b
+- .llong 95b,195b
+- .llong 96b,196b
+ .llong 35b,135b
+ .llong 81b,181b
+ .llong 36b,136b
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/lib/memcpy_64.S linux-2.6.29-rc3.owrt/arch/powerpc/lib/memcpy_64.S
+--- linux-2.6.29.owrt/arch/powerpc/lib/memcpy_64.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/lib/memcpy_64.S 2009-05-10 23:48:28.000000000 +0200
+@@ -53,19 +53,18 @@
+ 3: std r8,8(r3)
+ beq 3f
+ addi r3,r3,16
++ ld r9,8(r4)
+ .Ldo_tail:
+ bf cr7*4+1,1f
+- lwz r9,8(r4)
+- addi r4,r4,4
++ rotldi r9,r9,32
+ stw r9,0(r3)
+ addi r3,r3,4
+ 1: bf cr7*4+2,2f
+- lhz r9,8(r4)
+- addi r4,r4,2
++ rotldi r9,r9,16
+ sth r9,0(r3)
+ addi r3,r3,2
+ 2: bf cr7*4+3,3f
+- lbz r9,8(r4)
++ rotldi r9,r9,8
+ stb r9,0(r3)
+ 3: ld r3,48(r1) /* return dest pointer */
+ blr
+@@ -134,24 +133,11 @@
+ cmpwi cr1,r5,8
+ addi r3,r3,32
+ sld r9,r9,r10
+- ble cr1,6f
++ ble cr1,.Ldo_tail
+ ld r0,8(r4)
+ srd r7,r0,r11
+ or r9,r7,r9
+-6:
+- bf cr7*4+1,1f
+- rotldi r9,r9,32
+- stw r9,0(r3)
+- addi r3,r3,4
+-1: bf cr7*4+2,2f
+- rotldi r9,r9,16
+- sth r9,0(r3)
+- addi r3,r3,2
+-2: bf cr7*4+3,3f
+- rotldi r9,r9,8
+- stb r9,0(r3)
+-3: ld r3,48(r1) /* return dest pointer */
+- blr
++ b .Ldo_tail
+
+ .Ldst_unaligned:
+ PPC_MTOCRF 0x01,r6 # put #bytes to 8B bdry into cr7
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/lib/sstep.c linux-2.6.29-rc3.owrt/arch/powerpc/lib/sstep.c
+--- linux-2.6.29.owrt/arch/powerpc/lib/sstep.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/lib/sstep.c 2009-05-10 23:48:28.000000000 +0200
+@@ -172,8 +172,6 @@
+ }
+ break;
+ case 0x378: /* orx */
+- if (instr & 1)
+- break;
+ rs = (instr >> 21) & 0x1f;
+ rb = (instr >> 11) & 0x1f;
+ if (rs == rb) { /* mr */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/mm/fsl_booke_mmu.c linux-2.6.29-rc3.owrt/arch/powerpc/mm/fsl_booke_mmu.c
+--- linux-2.6.29.owrt/arch/powerpc/mm/fsl_booke_mmu.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/mm/fsl_booke_mmu.c 2009-05-10 23:48:28.000000000 +0200
+@@ -73,7 +73,7 @@
+ /*
+ * Return PA for this VA if it is mapped by a CAM, or 0
+ */
+-phys_addr_t v_mapped_by_tlbcam(unsigned long va)
++unsigned long v_mapped_by_tlbcam(unsigned long va)
+ {
+ int b;
+ for (b = 0; b < tlbcam_index; ++b)
+@@ -85,7 +85,7 @@
+ /*
+ * Return VA for a given PA or 0 if not mapped
+ */
+-unsigned long p_mapped_by_tlbcam(phys_addr_t pa)
++unsigned long p_mapped_by_tlbcam(unsigned long pa)
+ {
+ int b;
+ for (b = 0; b < tlbcam_index; ++b)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/mm/hash_low_32.S linux-2.6.29-rc3.owrt/arch/powerpc/mm/hash_low_32.S
+--- linux-2.6.29.owrt/arch/powerpc/mm/hash_low_32.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/mm/hash_low_32.S 2009-05-10 23:48:28.000000000 +0200
+@@ -320,7 +320,7 @@
+ and r8,r8,r0 /* writable if _RW & _DIRTY */
+ rlwimi r5,r5,32-1,30,30 /* _PAGE_USER -> PP msb */
+ rlwimi r5,r5,32-2,31,31 /* _PAGE_USER -> PP lsb */
+- ori r8,r8,0xe04 /* clear out reserved bits */
++ ori r8,r8,0xe14 /* clear out reserved bits and M */
+ andc r8,r5,r8 /* PP = user? (rw&dirty? 2: 3): 0 */
+ BEGIN_FTR_SECTION
+ rlwinm r8,r8,0,~_PAGE_COHERENT /* clear M (coherence not required) */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/mm/numa.c linux-2.6.29-rc3.owrt/arch/powerpc/mm/numa.c
+--- linux-2.6.29.owrt/arch/powerpc/mm/numa.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/mm/numa.c 2009-05-10 23:48:28.000000000 +0200
+@@ -19,7 +19,6 @@
+ #include <linux/notifier.h>
+ #include <linux/lmb.h>
+ #include <linux/of.h>
+-#include <linux/pfn.h>
+ #include <asm/sparsemem.h>
+ #include <asm/prom.h>
+ #include <asm/system.h>
+@@ -883,7 +882,7 @@
+ unsigned long physbase = lmb.reserved.region[i].base;
+ unsigned long size = lmb.reserved.region[i].size;
+ unsigned long start_pfn = physbase >> PAGE_SHIFT;
+- unsigned long end_pfn = PFN_UP(physbase + size);
++ unsigned long end_pfn = ((physbase + size) >> PAGE_SHIFT);
+ struct node_active_region node_ar;
+ unsigned long node_end_pfn = node->node_start_pfn +
+ node->node_spanned_pages;
+@@ -909,7 +908,7 @@
+ */
+ if (end_pfn > node_ar.end_pfn)
+ reserve_size = (node_ar.end_pfn << PAGE_SHIFT)
+- - physbase;
++ - (start_pfn << PAGE_SHIFT);
+ /*
+ * Only worry about *this* node, others may not
+ * yet have valid NODE_DATA().
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/mm/pgtable_32.c linux-2.6.29-rc3.owrt/arch/powerpc/mm/pgtable_32.c
+--- linux-2.6.29.owrt/arch/powerpc/mm/pgtable_32.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/mm/pgtable_32.c 2009-05-10 23:48:28.000000000 +0200
+@@ -61,8 +61,8 @@
+
+ #ifdef HAVE_TLBCAM
+ extern unsigned int tlbcam_index;
+-extern phys_addr_t v_mapped_by_tlbcam(unsigned long va);
+-extern unsigned long p_mapped_by_tlbcam(phys_addr_t pa);
++extern unsigned long v_mapped_by_tlbcam(unsigned long va);
++extern unsigned long p_mapped_by_tlbcam(unsigned long pa);
+ #else /* !HAVE_TLBCAM */
+ #define v_mapped_by_tlbcam(x) (0UL)
+ #define p_mapped_by_tlbcam(x) (0UL)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/oprofile/cell/spu_profiler.c linux-2.6.29-rc3.owrt/arch/powerpc/oprofile/cell/spu_profiler.c
+--- linux-2.6.29.owrt/arch/powerpc/oprofile/cell/spu_profiler.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/oprofile/cell/spu_profiler.c 2009-05-10 23:48:28.000000000 +0200
+@@ -16,7 +16,6 @@
+ #include <linux/smp.h>
+ #include <linux/slab.h>
+ #include <asm/cell-pmu.h>
+-#include <asm/time.h>
+ #include "pr_util.h"
+
+ #define SCALE_SHIFT 14
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/platforms/52xx/mpc52xx_pci.c linux-2.6.29-rc3.owrt/arch/powerpc/platforms/52xx/mpc52xx_pci.c
+--- linux-2.6.29.owrt/arch/powerpc/platforms/52xx/mpc52xx_pci.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/platforms/52xx/mpc52xx_pci.c 2009-05-10 23:48:28.000000000 +0200
+@@ -20,6 +20,14 @@
+
+
+ /* ======================================================================== */
++/* PCI windows config */
++/* ======================================================================== */
++
++#define MPC52xx_PCI_TARGET_IO 0xf0000000
++#define MPC52xx_PCI_TARGET_MEM 0x00000000
++
++
++/* ======================================================================== */
+ /* Structures mapping & Defines for PCI Unit */
+ /* ======================================================================== */
+
+@@ -236,7 +244,7 @@
+
+ static void __init
+ mpc52xx_pci_setup(struct pci_controller *hose,
+- struct mpc52xx_pci __iomem *pci_regs, phys_addr_t pci_phys)
++ struct mpc52xx_pci __iomem *pci_regs)
+ {
+ struct resource *res;
+ u32 tmp;
+@@ -306,14 +314,10 @@
+ /* Set all the IWCR fields at once; they're in the same reg */
+ out_be32(&pci_regs->iwcr, MPC52xx_PCI_IWCR_PACK(iwcr0, iwcr1, iwcr2));
+
+- /* Map IMMR onto PCI bus */
+- pci_phys &= 0xfffc0000; /* bar0 has only 14 significant bits */
+- out_be32(&pci_regs->tbatr0, MPC52xx_PCI_TBATR_ENABLE | pci_phys);
+- out_be32(&pci_regs->bar0, PCI_BASE_ADDRESS_MEM_PREFETCH | pci_phys);
+-
+- /* Map memory onto PCI bus */
+- out_be32(&pci_regs->tbatr1, MPC52xx_PCI_TBATR_ENABLE);
+- out_be32(&pci_regs->bar1, PCI_BASE_ADDRESS_MEM_PREFETCH);
++ out_be32(&pci_regs->tbatr0,
++ MPC52xx_PCI_TBATR_ENABLE | MPC52xx_PCI_TARGET_IO );
++ out_be32(&pci_regs->tbatr1,
++ MPC52xx_PCI_TBATR_ENABLE | MPC52xx_PCI_TARGET_MEM );
+
+ out_be32(&pci_regs->tcr, MPC52xx_PCI_TCR_LD | MPC52xx_PCI_TCR_WCT8);
+
+@@ -410,7 +414,7 @@
+
+ /* Finish setting up PCI using values obtained by
+ * pci_proces_bridge_OF_ranges */
+- mpc52xx_pci_setup(hose, pci_regs, rsrc.start);
++ mpc52xx_pci_setup(hose, pci_regs);
+
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/platforms/82xx/pq2ads-pci-pic.c linux-2.6.29-rc3.owrt/arch/powerpc/platforms/82xx/pq2ads-pci-pic.c
+--- linux-2.6.29.owrt/arch/powerpc/platforms/82xx/pq2ads-pci-pic.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/platforms/82xx/pq2ads-pci-pic.c 2009-05-10 23:48:28.000000000 +0200
+@@ -186,7 +186,7 @@
+ iounmap(priv->regs);
+ out_free_bootmem:
+ free_bootmem((unsigned long)priv,
+- sizeof(struct pq2ads_pci_pic));
++ sizeof(sizeof(struct pq2ads_pci_pic)));
+ of_node_put(np);
+ out_unmap_irq:
+ irq_dispose_mapping(irq);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/platforms/86xx/gef_sbc610.c linux-2.6.29-rc3.owrt/arch/powerpc/platforms/86xx/gef_sbc610.c
+--- linux-2.6.29.owrt/arch/powerpc/platforms/86xx/gef_sbc610.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/platforms/86xx/gef_sbc610.c 2009-05-10 23:48:28.000000000 +0200
+@@ -142,10 +142,6 @@
+ {
+ unsigned int val;
+
+- /* Do not do the fixup on other platforms! */
+- if (!machine_is(gef_sbc610))
+- return;
+-
+ printk(KERN_INFO "Running NEC uPD720101 Fixup\n");
+
+ /* Ensure ports 1, 2, 3, 4 & 5 are enabled */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/platforms/embedded6xx/linkstation.c linux-2.6.29-rc3.owrt/arch/powerpc/platforms/embedded6xx/linkstation.c
+--- linux-2.6.29.owrt/arch/powerpc/platforms/embedded6xx/linkstation.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/platforms/embedded6xx/linkstation.c 2009-05-10 23:48:28.000000000 +0200
+@@ -12,6 +12,7 @@
+
+ #include <linux/kernel.h>
+ #include <linux/initrd.h>
++#include <linux/mtd/physmap.h>
+ #include <linux/of_platform.h>
+
+ #include <asm/time.h>
+@@ -21,6 +22,39 @@
+
+ #include "mpc10x.h"
+
++static struct mtd_partition linkstation_physmap_partitions[] = {
++ {
++ .name = "mtd_firmimg",
++ .offset = 0x000000,
++ .size = 0x300000,
++ },
++ {
++ .name = "mtd_bootcode",
++ .offset = 0x300000,
++ .size = 0x070000,
++ },
++ {
++ .name = "mtd_status",
++ .offset = 0x370000,
++ .size = 0x010000,
++ },
++ {
++ .name = "mtd_conf",
++ .offset = 0x380000,
++ .size = 0x080000,
++ },
++ {
++ .name = "mtd_allflash",
++ .offset = 0x000000,
++ .size = 0x400000,
++ },
++ {
++ .name = "mtd_data",
++ .offset = 0x310000,
++ .size = 0x0f0000,
++ },
++};
++
+ static __initdata struct of_device_id of_bus_ids[] = {
+ { .type = "soc", },
+ { .compatible = "simple-bus", },
+@@ -65,6 +99,10 @@
+ static void __init linkstation_setup_arch(void)
+ {
+ struct device_node *np;
++#ifdef CONFIG_MTD_PHYSMAP
++ physmap_set_partitions(linkstation_physmap_partitions,
++ ARRAY_SIZE(linkstation_physmap_partitions));
++#endif
+
+ /* Lookup PCI host bridges */
+ for_each_compatible_node(np, "pci", "mpc10x-pci")
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/platforms/embedded6xx/storcenter.c linux-2.6.29-rc3.owrt/arch/powerpc/platforms/embedded6xx/storcenter.c
+--- linux-2.6.29.owrt/arch/powerpc/platforms/embedded6xx/storcenter.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/platforms/embedded6xx/storcenter.c 2009-05-10 23:48:28.000000000 +0200
+@@ -14,6 +14,7 @@
+ #include <linux/kernel.h>
+ #include <linux/pci.h>
+ #include <linux/initrd.h>
++#include <linux/mtd/physmap.h>
+ #include <linux/of_platform.h>
+
+ #include <asm/system.h>
+@@ -25,6 +26,32 @@
+ #include "mpc10x.h"
+
+
++#ifdef CONFIG_MTD_PHYSMAP
++static struct mtd_partition storcenter_physmap_partitions[] = {
++ {
++ .name = "kernel",
++ .offset = 0x000000,
++ .size = 0x170000,
++ },
++ {
++ .name = "rootfs",
++ .offset = 0x170000,
++ .size = 0x590000,
++ },
++ {
++ .name = "uboot",
++ .offset = 0x700000,
++ .size = 0x040000,
++ },
++ {
++ .name = "config",
++ .offset = 0x740000,
++ .size = 0x0c0000,
++ },
++};
++#endif
++
++
+ static __initdata struct of_device_id storcenter_of_bus[] = {
+ { .name = "soc", },
+ {},
+@@ -69,6 +96,11 @@
+ {
+ struct device_node *np;
+
++#ifdef CONFIG_MTD_PHYSMAP
++ physmap_set_partitions(storcenter_physmap_partitions,
++ ARRAY_SIZE(storcenter_physmap_partitions));
++#endif
++
+ /* Lookup PCI host bridges */
+ for_each_compatible_node(np, "pci", "mpc10x-pci")
+ storcenter_add_bridge(np);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/platforms/ps3/Kconfig linux-2.6.29-rc3.owrt/arch/powerpc/platforms/ps3/Kconfig
+--- linux-2.6.29.owrt/arch/powerpc/platforms/ps3/Kconfig 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/platforms/ps3/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -128,13 +128,6 @@
+ be disabled on the kernel command line using "ps3flash=off", to
+ not allocate this fixed buffer.
+
+-config PS3_VRAM
+- tristate "PS3 Video RAM Storage Driver"
+- depends on FB_PS3=y && BLOCK && m
+- help
+- This driver allows you to use excess PS3 video RAM as volatile
+- storage or system swap.
+-
+ config PS3_LPM
+ tristate "PS3 Logical Performance Monitor support"
+ depends on PPC_PS3
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/platforms/ps3/mm.c linux-2.6.29-rc3.owrt/arch/powerpc/platforms/ps3/mm.c
+--- linux-2.6.29.owrt/arch/powerpc/platforms/ps3/mm.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/platforms/ps3/mm.c 2009-05-10 23:48:28.000000000 +0200
+@@ -328,7 +328,7 @@
+ return result;
+ }
+
+-device_initcall(ps3_mm_add_memory);
++core_initcall(ps3_mm_add_memory);
+
+ /*============================================================================*/
+ /* dma routines */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/platforms/pseries/hotplug-memory.c linux-2.6.29-rc3.owrt/arch/powerpc/platforms/pseries/hotplug-memory.c
+--- linux-2.6.29.owrt/arch/powerpc/platforms/pseries/hotplug-memory.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/platforms/pseries/hotplug-memory.c 2009-05-10 23:48:28.000000000 +0200
+@@ -14,7 +14,6 @@
+ #include <asm/firmware.h>
+ #include <asm/machdep.h>
+ #include <asm/pSeries_reconfig.h>
+-#include <asm/sparsemem.h>
+
+ static int pseries_remove_lmb(unsigned long base, unsigned int lmb_size)
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/sysdev/cpm2_pic.c linux-2.6.29-rc3.owrt/arch/powerpc/sysdev/cpm2_pic.c
+--- linux-2.6.29.owrt/arch/powerpc/sysdev/cpm2_pic.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/sysdev/cpm2_pic.c 2009-05-10 23:48:28.000000000 +0200
+@@ -165,7 +165,7 @@
+ edibit = (14 - (src - CPM2_IRQ_EXT1));
+ else
+ if (src >= CPM2_IRQ_PORTC15 && src <= CPM2_IRQ_PORTC0)
+- edibit = (31 - (CPM2_IRQ_PORTC0 - src));
++ edibit = (31 - (src - CPM2_IRQ_PORTC15));
+ else
+ return (flow_type & IRQ_TYPE_LEVEL_LOW) ? 0 : -EINVAL;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/sysdev/ipic.c linux-2.6.29-rc3.owrt/arch/powerpc/sysdev/ipic.c
+--- linux-2.6.29.owrt/arch/powerpc/sysdev/ipic.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/sysdev/ipic.c 2009-05-10 23:48:28.000000000 +0200
+@@ -890,7 +890,7 @@
+ return irq_linear_revmap(primary_ipic->irqhost, irq);
+ }
+
+-#ifdef CONFIG_SUSPEND
++#ifdef CONFIG_PM
+ static struct {
+ u32 sicfr;
+ u32 siprr[2];
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/powerpc/sysdev/ppc4xx_pci.c linux-2.6.29-rc3.owrt/arch/powerpc/sysdev/ppc4xx_pci.c
+--- linux-2.6.29.owrt/arch/powerpc/sysdev/ppc4xx_pci.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/powerpc/sysdev/ppc4xx_pci.c 2009-05-10 23:48:28.000000000 +0200
+@@ -204,23 +204,6 @@
+ {
+ u32 ma, pcila, pciha;
+
+- /* Hack warning ! The "old" PCI 2.x cell only let us configure the low
+- * 32-bit of incoming PLB addresses. The top 4 bits of the 36-bit
+- * address are actually hard wired to a value that appears to depend
+- * on the specific SoC. For example, it's 0 on 440EP and 1 on 440EPx.
+- *
+- * The trick here is we just crop those top bits and ignore them when
+- * programming the chip. That means the device-tree has to be right
+- * for the specific part used (we don't print a warning if it's wrong
+- * but on the other hand, you'll crash quickly enough), but at least
+- * this code should work whatever the hard coded value is
+- */
+- plb_addr &= 0xffffffffull;
+-
+- /* Note: Due to the above hack, the test below doesn't actually test
+- * if you address is above 4G, but it tests that address and
+- * (address + size) are both contained in the same 4G
+- */
+ if ((plb_addr + size) > 0xffffffffull || !is_power_of_2(size) ||
+ size < 0x1000 || (plb_addr & (size - 1)) != 0) {
+ printk(KERN_WARNING "%s: Resource out of range\n",
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/s390/crypto/aes_s390.c linux-2.6.29-rc3.owrt/arch/s390/crypto/aes_s390.c
+--- linux-2.6.29.owrt/arch/s390/crypto/aes_s390.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/s390/crypto/aes_s390.c 2009-05-10 23:48:28.000000000 +0200
+@@ -556,7 +556,7 @@
+ module_init(aes_s390_init);
+ module_exit(aes_s390_fini);
+
+-MODULE_ALIAS("aes-all");
++MODULE_ALIAS("aes");
+
+ MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm");
+ MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/s390/defconfig linux-2.6.29-rc3.owrt/arch/s390/defconfig
+--- linux-2.6.29.owrt/arch/s390/defconfig 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/s390/defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-rc4
+-# Wed Feb 11 10:07:16 2009
++# Linux kernel version: 2.6.28-rc6
++# Thu Nov 27 11:00:49 2008
+ #
+ CONFIG_SCHED_MC=y
+ CONFIG_MMU=y
+@@ -14,14 +14,12 @@
+ # CONFIG_ARCH_HAS_ILOG2_U64 is not set
+ CONFIG_GENERIC_HWEIGHT=y
+ CONFIG_GENERIC_TIME=y
+-CONFIG_GENERIC_TIME_VSYSCALL=y
+ CONFIG_GENERIC_CLOCKEVENTS=y
+ CONFIG_GENERIC_BUG=y
+ CONFIG_NO_IOMEM=y
+ CONFIG_NO_DMA=y
+ CONFIG_GENERIC_LOCKBREAK=y
+ CONFIG_PGSTE=y
+-CONFIG_VIRT_CPU_ACCOUNTING=y
+ CONFIG_S390=y
+ CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+@@ -41,29 +39,20 @@
+ # CONFIG_TASKSTATS is not set
+ CONFIG_AUDIT=y
+ # CONFIG_AUDITSYSCALL is not set
+-
+-#
+-# RCU Subsystem
+-#
+-CONFIG_CLASSIC_RCU=y
+-# CONFIG_TREE_RCU is not set
+-# CONFIG_PREEMPT_RCU is not set
+-# CONFIG_TREE_RCU_TRACE is not set
+-# CONFIG_PREEMPT_RCU_TRACE is not set
+ CONFIG_IKCONFIG=y
+ CONFIG_IKCONFIG_PROC=y
+ CONFIG_LOG_BUF_SHIFT=17
+-CONFIG_GROUP_SCHED=y
+-CONFIG_FAIR_GROUP_SCHED=y
+-# CONFIG_RT_GROUP_SCHED is not set
+-CONFIG_USER_SCHED=y
+-# CONFIG_CGROUP_SCHED is not set
+ CONFIG_CGROUPS=y
+ # CONFIG_CGROUP_DEBUG is not set
+ CONFIG_CGROUP_NS=y
+ # CONFIG_CGROUP_FREEZER is not set
+ # CONFIG_CGROUP_DEVICE is not set
+ # CONFIG_CPUSETS is not set
++CONFIG_GROUP_SCHED=y
++CONFIG_FAIR_GROUP_SCHED=y
++# CONFIG_RT_GROUP_SCHED is not set
++CONFIG_USER_SCHED=y
++# CONFIG_CGROUP_SCHED is not set
+ # CONFIG_CGROUP_CPUACCT is not set
+ # CONFIG_RESOURCE_COUNTERS is not set
+ CONFIG_SYSFS_DEPRECATED=y
+@@ -74,7 +63,6 @@
+ CONFIG_IPC_NS=y
+ # CONFIG_USER_NS is not set
+ # CONFIG_PID_NS is not set
+-# CONFIG_NET_NS is not set
+ CONFIG_BLK_DEV_INITRD=y
+ CONFIG_INITRAMFS_SOURCE=""
+ # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+@@ -103,17 +91,17 @@
+ # CONFIG_SLUB is not set
+ # CONFIG_SLOB is not set
+ # CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
+ CONFIG_HAVE_OPROFILE=y
+ CONFIG_KPROBES=y
+-CONFIG_HAVE_SYSCALL_WRAPPERS=y
+ CONFIG_KRETPROBES=y
+ CONFIG_HAVE_KPROBES=y
+ CONFIG_HAVE_KRETPROBES=y
+ CONFIG_HAVE_ARCH_TRACEHOOK=y
+-CONFIG_USE_GENERIC_SMP_HELPERS=y
+ # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+ CONFIG_MODULES=y
+ # CONFIG_MODULE_FORCE_LOAD is not set
+@@ -121,7 +109,7 @@
+ # CONFIG_MODULE_FORCE_UNLOAD is not set
+ CONFIG_MODVERSIONS=y
+ # CONFIG_MODULE_SRCVERSION_ALL is not set
+-CONFIG_INIT_ALL_POSSIBLE=y
++CONFIG_KMOD=y
+ CONFIG_STOP_MACHINE=y
+ CONFIG_BLOCK=y
+ # CONFIG_BLK_DEV_IO_TRACE is not set
+@@ -142,6 +130,7 @@
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="deadline"
+ CONFIG_PREEMPT_NOTIFIERS=y
++CONFIG_CLASSIC_RCU=y
+ # CONFIG_FREEZER is not set
+
+ #
+@@ -172,7 +161,6 @@
+ CONFIG_MARCH_Z900=y
+ # CONFIG_MARCH_Z990 is not set
+ # CONFIG_MARCH_Z9_109 is not set
+-# CONFIG_MARCH_Z10 is not set
+ CONFIG_PACK_STACK=y
+ # CONFIG_SMALL_STACK is not set
+ CONFIG_CHECK_STACK=y
+@@ -186,6 +174,7 @@
+ # CONFIG_PREEMPT_NONE is not set
+ # CONFIG_PREEMPT_VOLUNTARY is not set
+ CONFIG_PREEMPT=y
++# CONFIG_PREEMPT_RCU is not set
+ CONFIG_ARCH_SPARSEMEM_ENABLE=y
+ CONFIG_ARCH_SPARSEMEM_DEFAULT=y
+ CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+@@ -206,6 +195,7 @@
+ CONFIG_PAGEFLAGS_EXTENDED=y
+ CONFIG_SPLIT_PTLOCK_CPUS=4
+ CONFIG_MIGRATION=y
++CONFIG_RESOURCES_64BIT=y
+ CONFIG_PHYS_ADDR_T_64BIT=y
+ CONFIG_ZONE_DMA_FLAG=1
+ CONFIG_BOUNCE=y
+@@ -217,6 +207,7 @@
+ #
+ CONFIG_MACHCHK_WARNING=y
+ CONFIG_QDIO=y
++# CONFIG_QDIO_DEBUG is not set
+ CONFIG_CHSC_SCH=m
+
+ #
+@@ -236,13 +227,15 @@
+ # CONFIG_SHARED_KERNEL is not set
+ # CONFIG_CMM is not set
+ # CONFIG_PAGE_STATES is not set
++CONFIG_VIRT_TIMER=y
++CONFIG_VIRT_CPU_ACCOUNTING=y
+ # CONFIG_APPLDATA_BASE is not set
+ CONFIG_HZ_100=y
+ # CONFIG_HZ_250 is not set
+ # CONFIG_HZ_300 is not set
+ # CONFIG_HZ_1000 is not set
+ CONFIG_HZ=100
+-CONFIG_SCHED_HRTICK=y
++# CONFIG_SCHED_HRTICK is not set
+ CONFIG_S390_HYPFS_FS=y
+ CONFIG_KEXEC=y
+ # CONFIG_ZFCPDUMP is not set
+@@ -252,7 +245,6 @@
+ #
+ # Networking options
+ #
+-CONFIG_COMPAT_NET_DEV_OPS=y
+ CONFIG_PACKET=y
+ # CONFIG_PACKET_MMAP is not set
+ CONFIG_UNIX=y
+@@ -391,7 +383,6 @@
+ CONFIG_NET_SCH_GRED=m
+ CONFIG_NET_SCH_DSMARK=m
+ # CONFIG_NET_SCH_NETEM is not set
+-# CONFIG_NET_SCH_DRR is not set
+ # CONFIG_NET_SCH_INGRESS is not set
+
+ #
+@@ -409,7 +400,6 @@
+ CONFIG_NET_CLS_RSVP=m
+ CONFIG_NET_CLS_RSVP6=m
+ CONFIG_NET_CLS_FLOW=m
+-# CONFIG_NET_CLS_CGROUP is not set
+ # CONFIG_NET_EMATCH is not set
+ CONFIG_NET_CLS_ACT=y
+ CONFIG_NET_ACT_POLICE=y
+@@ -421,7 +411,6 @@
+ # CONFIG_NET_ACT_SKBEDIT is not set
+ # CONFIG_NET_CLS_IND is not set
+ CONFIG_NET_SCH_FIFO=y
+-# CONFIG_DCB is not set
+
+ #
+ # Network testing
+@@ -439,7 +428,6 @@
+ # CONFIG_CAN_DEBUG_DEVICES is not set
+ # CONFIG_AF_RXRPC is not set
+ # CONFIG_PHONET is not set
+-# CONFIG_WIMAX is not set
+ # CONFIG_RFKILL is not set
+ # CONFIG_NET_9P is not set
+ # CONFIG_PCMCIA is not set
+@@ -487,15 +475,11 @@
+ CONFIG_DASD_EER=y
+ CONFIG_VIRTIO_BLK=m
+ CONFIG_MISC_DEVICES=y
++# CONFIG_EEPROM_93CX6 is not set
+ # CONFIG_ENCLOSURE_SERVICES is not set
+ # CONFIG_C2PORT is not set
+
+ #
+-# EEPROM support
+-#
+-# CONFIG_EEPROM_93CX6 is not set
+-
+-#
+ # SCSI device support
+ #
+ # CONFIG_RAID_ATTRS is not set
+@@ -536,7 +520,6 @@
+ # CONFIG_SCSI_SRP_ATTRS is not set
+ CONFIG_SCSI_LOWLEVEL=y
+ # CONFIG_ISCSI_TCP is not set
+-# CONFIG_LIBFC is not set
+ # CONFIG_SCSI_DEBUG is not set
+ CONFIG_ZFCP=y
+ CONFIG_SCSI_DH=m
+@@ -583,10 +566,6 @@
+ CONFIG_NETDEV_1000=y
+ CONFIG_NETDEV_10000=y
+ # CONFIG_TR is not set
+-
+-#
+-# Enable WiMAX (Networking options) to see the WiMAX drivers
+-#
+ # CONFIG_WAN is not set
+
+ #
+@@ -614,11 +593,9 @@
+ #
+ CONFIG_DEVKMEM=y
+ CONFIG_UNIX98_PTYS=y
+-# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+ CONFIG_LEGACY_PTYS=y
+ CONFIG_LEGACY_PTY_COUNT=256
+ CONFIG_HVC_DRIVER=y
+-CONFIG_HVC_IUCV=y
+ CONFIG_VIRTIO_CONSOLE=y
+ CONFIG_HW_RANDOM=m
+ CONFIG_HW_RANDOM_VIRTIO=m
+@@ -668,6 +645,7 @@
+ # CONFIG_NEW_LEDS is not set
+ CONFIG_ACCESSIBILITY=y
+ # CONFIG_STAGING is not set
++CONFIG_STAGING_EXCLUDE_BUILD=y
+
+ #
+ # File systems
+@@ -690,7 +668,6 @@
+ # CONFIG_XFS_FS is not set
+ # CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_BTRFS_FS is not set
+ CONFIG_DNOTIFY=y
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+@@ -726,7 +703,10 @@
+ # CONFIG_HUGETLBFS is not set
+ # CONFIG_HUGETLB_PAGE is not set
+ CONFIG_CONFIGFS_FS=m
+-CONFIG_MISC_FILESYSTEMS=y
++
++#
++# Miscellaneous filesystems
++#
+ # CONFIG_ADFS_FS is not set
+ # CONFIG_AFFS_FS is not set
+ # CONFIG_HFS_FS is not set
+@@ -735,7 +715,6 @@
+ # CONFIG_BFS_FS is not set
+ # CONFIG_EFS_FS is not set
+ # CONFIG_CRAMFS is not set
+-# CONFIG_SQUASHFS is not set
+ # CONFIG_VXFS_FS is not set
+ # CONFIG_MINIX_FS is not set
+ # CONFIG_OMFS_FS is not set
+@@ -829,7 +808,6 @@
+ CONFIG_DEBUG_MEMORY_INIT=y
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+-# CONFIG_DEBUG_NOTIFIERS is not set
+ # CONFIG_FRAME_POINTER is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
+ # CONFIG_RCU_CPU_STALL_DETECTOR is not set
+@@ -840,19 +818,15 @@
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_LATENCYTOP is not set
+ CONFIG_SYSCTL_SYSCALL_CHECK=y
+-CONFIG_HAVE_FUNCTION_TRACER=y
+
+ #
+ # Tracers
+ #
+-# CONFIG_FUNCTION_TRACER is not set
+ # CONFIG_IRQSOFF_TRACER is not set
+ # CONFIG_PREEMPT_TRACER is not set
+ # CONFIG_SCHED_TRACER is not set
+ # CONFIG_CONTEXT_SWITCH_TRACER is not set
+ # CONFIG_BOOT_TRACER is not set
+-# CONFIG_TRACE_BRANCH_PROFILING is not set
+-# CONFIG_STACK_TRACER is not set
+ # CONFIG_DYNAMIC_PRINTK_DEBUG is not set
+ CONFIG_SAMPLES=y
+ # CONFIG_SAMPLE_KOBJECT is not set
+@@ -873,17 +847,11 @@
+ #
+ CONFIG_CRYPTO_FIPS=y
+ CONFIG_CRYPTO_ALGAPI=y
+-CONFIG_CRYPTO_ALGAPI2=y
+-CONFIG_CRYPTO_AEAD=m
+-CONFIG_CRYPTO_AEAD2=y
++CONFIG_CRYPTO_AEAD=y
+ CONFIG_CRYPTO_BLKCIPHER=y
+-CONFIG_CRYPTO_BLKCIPHER2=y
+-CONFIG_CRYPTO_HASH=m
+-CONFIG_CRYPTO_HASH2=y
+-CONFIG_CRYPTO_RNG=m
+-CONFIG_CRYPTO_RNG2=y
++CONFIG_CRYPTO_HASH=y
++CONFIG_CRYPTO_RNG=y
+ CONFIG_CRYPTO_MANAGER=y
+-CONFIG_CRYPTO_MANAGER2=y
+ CONFIG_CRYPTO_GF128MUL=m
+ # CONFIG_CRYPTO_NULL is not set
+ # CONFIG_CRYPTO_CRYPTD is not set
+@@ -917,7 +885,7 @@
+ #
+ # Digest
+ #
+-CONFIG_CRYPTO_CRC32C=m
++# CONFIG_CRYPTO_CRC32C is not set
+ # CONFIG_CRYPTO_MD4 is not set
+ CONFIG_CRYPTO_MD5=m
+ # CONFIG_CRYPTO_MICHAEL_MIC is not set
+@@ -974,7 +942,6 @@
+ # Library routines
+ #
+ CONFIG_BITREVERSE=m
+-CONFIG_GENERIC_FIND_LAST_BIT=y
+ # CONFIG_CRC_CCITT is not set
+ # CONFIG_CRC16 is not set
+ CONFIG_CRC_T10DIF=y
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/s390/include/asm/cputime.h linux-2.6.29-rc3.owrt/arch/s390/include/asm/cputime.h
+--- linux-2.6.29.owrt/arch/s390/include/asm/cputime.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/s390/include/asm/cputime.h 2009-05-10 23:48:28.000000000 +0200
+@@ -145,7 +145,7 @@
+ value->tv_usec = rp.subreg.even / 4096;
+ value->tv_sec = rp.subreg.odd;
+ #else
+- value->tv_usec = (cputime % 4096000000ULL) / 4096;
++ value->tv_usec = cputime % 4096000000ULL;
+ value->tv_sec = cputime / 4096000000ULL;
+ #endif
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/s390/include/asm/lowcore.h linux-2.6.29-rc3.owrt/arch/s390/include/asm/lowcore.h
+--- linux-2.6.29.owrt/arch/s390/include/asm/lowcore.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/s390/include/asm/lowcore.h 2009-05-10 23:48:28.000000000 +0200
+@@ -384,8 +384,8 @@
+ __u32 panic_magic; /* 0xe00 */
+
+ /* Per cpu primary space access list */
+- __u8 pad_0xe04[0xe38-0xe04]; /* 0xe04 */
+- __u64 vdso_per_cpu_data; /* 0xe38 */
++ __u8 pad_0xe04[0xe3c-0xe04]; /* 0xe04 */
++ __u32 vdso_per_cpu_data; /* 0xe3c */
+ __u32 paste[16]; /* 0xe40 */
+
+ __u8 pad13[0x11b8-0xe80]; /* 0xe80 */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/s390/include/asm/mman.h linux-2.6.29-rc3.owrt/arch/s390/include/asm/mman.h
+--- linux-2.6.29.owrt/arch/s390/include/asm/mman.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/s390/include/asm/mman.h 2009-05-10 23:48:28.000000000 +0200
+@@ -22,9 +22,4 @@
+ #define MCL_CURRENT 1 /* lock all current mappings */
+ #define MCL_FUTURE 2 /* lock all future mappings */
+
+-#if defined(__KERNEL__) && !defined(__ASSEMBLY__) && defined(CONFIG_64BIT)
+-int s390_mmap_check(unsigned long addr, unsigned long len);
+-#define arch_mmap_check(addr,len,flags) s390_mmap_check(addr,len)
+-#endif
+-
+ #endif /* __S390_MMAN_H__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/s390/include/asm/processor.h linux-2.6.29-rc3.owrt/arch/s390/include/asm/processor.h
+--- linux-2.6.29.owrt/arch/s390/include/asm/processor.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/s390/include/asm/processor.h 2009-05-10 23:48:28.000000000 +0200
+@@ -61,7 +61,7 @@
+ extern int get_cpu_capability(unsigned int *);
+
+ /*
+- * User space process size: 2GB for 31 bit, 4TB or 8PT for 64 bit.
++ * User space process size: 2GB for 31 bit, 4TB for 64 bit.
+ */
+ #ifndef __s390x__
+
+@@ -70,7 +70,8 @@
+
+ #else /* __s390x__ */
+
+-#define TASK_SIZE_OF(tsk) ((tsk)->mm->context.asce_limit)
++#define TASK_SIZE_OF(tsk) (test_tsk_thread_flag(tsk,TIF_31BIT) ? \
++ (1UL << 31) : (1UL << 53))
+ #define TASK_UNMAPPED_BASE (test_thread_flag(TIF_31BIT) ? \
+ (1UL << 30) : (1UL << 41))
+ #define TASK_SIZE TASK_SIZE_OF(current)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/s390/include/asm/setup.h linux-2.6.29-rc3.owrt/arch/s390/include/asm/setup.h
+--- linux-2.6.29.owrt/arch/s390/include/asm/setup.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/s390/include/asm/setup.h 2009-05-10 23:48:28.000000000 +0200
+@@ -43,8 +43,6 @@
+
+ extern struct mem_chunk memory_chunk[];
+ extern unsigned long real_memory_size;
+-extern int memory_end_set;
+-extern unsigned long memory_end;
+
+ void detect_memory_layout(struct mem_chunk chunk[]);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/s390/include/asm/topology.h linux-2.6.29-rc3.owrt/arch/s390/include/asm/topology.h
+--- linux-2.6.29.owrt/arch/s390/include/asm/topology.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/s390/include/asm/topology.h 2009-05-10 23:48:28.000000000 +0200
+@@ -30,8 +30,6 @@
+ };
+ #endif
+
+-#define SD_MC_INIT SD_CPU_INIT
+-
+ #include <asm-generic/topology.h>
+
+ #endif /* _ASM_S390_TOPOLOGY_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/s390/kernel/irq.c linux-2.6.29-rc3.owrt/arch/s390/kernel/irq.c
+--- linux-2.6.29.owrt/arch/s390/kernel/irq.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/s390/kernel/irq.c 2009-05-10 23:48:28.000000000 +0200
+@@ -95,7 +95,6 @@
+ local_irq_restore(flags);
+ }
+
+-#ifdef CONFIG_PROC_FS
+ void init_irq_proc(void)
+ {
+ struct proc_dir_entry *root_irq_dir;
+@@ -103,4 +102,3 @@
+ root_irq_dir = proc_mkdir("irq", NULL);
+ create_prof_cpu_mask(root_irq_dir);
+ }
+-#endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/s390/kernel/mcount.S linux-2.6.29-rc3.owrt/arch/s390/kernel/mcount.S
+--- linux-2.6.29.owrt/arch/s390/kernel/mcount.S 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/s390/kernel/mcount.S 2009-05-10 23:48:28.000000000 +0200
+@@ -5,8 +5,6 @@
+ *
+ */
+
+-#include <asm/asm-offsets.h>
+-
+ #ifndef CONFIG_64BIT
+ .globl _mcount
+ _mcount:
+@@ -16,7 +14,7 @@
+ ahi %r15,-96
+ l %r3,100(%r15)
+ la %r2,0(%r14)
+- st %r1,__SF_BACKCHAIN(%r15)
++ st %r1,0(%r15)
+ la %r3,0(%r3)
+ bras %r14,0f
+ .long ftrace_trace_function
+@@ -40,7 +38,7 @@
+ stg %r14,112(%r15)
+ lgr %r1,%r15
+ aghi %r15,-160
+- stg %r1,__SF_BACKCHAIN(%r15)
++ stg %r1,0(%r15)
+ lgr %r2,%r14
+ lg %r3,168(%r15)
+ larl %r14,ftrace_trace_function
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/s390/kernel/setup.c linux-2.6.29-rc3.owrt/arch/s390/kernel/setup.c
+--- linux-2.6.29.owrt/arch/s390/kernel/setup.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/s390/kernel/setup.c 2009-05-10 23:48:28.000000000 +0200
+@@ -82,9 +82,7 @@
+
+ struct mem_chunk __initdata memory_chunk[MEMORY_CHUNKS];
+ volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */
+-
+-int __initdata memory_end_set;
+-unsigned long __initdata memory_end;
++static unsigned long __initdata memory_end;
+
+ /*
+ * This is set up by the setup-routine at boot-time
+@@ -283,7 +281,6 @@
+ static int __init early_parse_mem(char *p)
+ {
+ memory_end = memparse(p, &p);
+- memory_end_set = 1;
+ return 0;
+ }
+ early_param("mem", early_parse_mem);
+@@ -511,10 +508,8 @@
+ int i;
+
+ #if defined(CONFIG_ZFCPDUMP) || defined(CONFIG_ZFCPDUMP_MODULE)
+- if (ipl_info.type == IPL_TYPE_FCP_DUMP) {
++ if (ipl_info.type == IPL_TYPE_FCP_DUMP)
+ memory_end = ZFCPDUMP_HSA_SIZE;
+- memory_end_set = 1;
+- }
+ #endif
+ memory_size = 0;
+ memory_end &= PAGE_MASK;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/s390/kvm/kvm-s390.c linux-2.6.29-rc3.owrt/arch/s390/kvm/kvm-s390.c
+--- linux-2.6.29.owrt/arch/s390/kvm/kvm-s390.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/s390/kvm/kvm-s390.c 2009-05-10 23:48:28.000000000 +0200
+@@ -212,10 +212,6 @@
+ }
+ }
+
+-void kvm_arch_sync_events(struct kvm *kvm)
+-{
+-}
+-
+ void kvm_arch_destroy_vm(struct kvm *kvm)
+ {
+ kvm_free_vcpus(kvm);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/s390/lib/div64.c linux-2.6.29-rc3.owrt/arch/s390/lib/div64.c
+--- linux-2.6.29.owrt/arch/s390/lib/div64.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/s390/lib/div64.c 2009-05-10 23:48:28.000000000 +0200
+@@ -61,7 +61,7 @@
+ " clr %0,%3\n"
+ " jl 0f\n"
+ " slr %0,%3\n"
+- " ahi %1,1\n"
++ " alr %1,%2\n"
+ "0:\n"
+ : "+d" (reg2), "+d" (reg3), "=d" (tmp)
+ : "d" (base), "2" (1UL) : "cc" );
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/s390/lib/uaccess_pt.c linux-2.6.29-rc3.owrt/arch/s390/lib/uaccess_pt.c
+--- linux-2.6.29.owrt/arch/s390/lib/uaccess_pt.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/s390/lib/uaccess_pt.c 2009-05-10 23:48:28.000000000 +0200
+@@ -119,6 +119,8 @@
+ goto fault;
+
+ pfn = pte_pfn(*pte);
++ if (!pfn_valid(pfn))
++ goto out;
+
+ offset = uaddr & (PAGE_SIZE - 1);
+ size = min(n - done, PAGE_SIZE - offset);
+@@ -133,6 +135,7 @@
+ done += size;
+ uaddr += size;
+ } while (done < n);
++out:
+ spin_unlock(&mm->page_table_lock);
+ return n - done;
+ fault:
+@@ -160,6 +163,9 @@
+ goto fault;
+
+ pfn = pte_pfn(*pte);
++ if (!pfn_valid(pfn))
++ goto out;
++
+ ret = (pfn << PAGE_SHIFT) + (uaddr & (PAGE_SIZE - 1));
+ out:
+ return ret;
+@@ -238,6 +244,11 @@
+ goto fault;
+
+ pfn = pte_pfn(*pte);
++ if (!pfn_valid(pfn)) {
++ done = -1;
++ goto out;
++ }
++
+ offset = uaddr & (PAGE_SIZE-1);
+ addr = (char *)(pfn << PAGE_SHIFT) + offset;
+ len = min(count - done, PAGE_SIZE - offset);
+@@ -245,6 +256,7 @@
+ done += len_str;
+ uaddr += len_str;
+ } while ((len_str == len) && (done < count));
++out:
+ spin_unlock(&mm->page_table_lock);
+ return done + 1;
+ fault:
+@@ -313,7 +325,12 @@
+ }
+
+ pfn_from = pte_pfn(*pte_from);
++ if (!pfn_valid(pfn_from))
++ goto out;
+ pfn_to = pte_pfn(*pte_to);
++ if (!pfn_valid(pfn_to))
++ goto out;
++
+ offset_from = uaddr_from & (PAGE_SIZE-1);
+ offset_to = uaddr_from & (PAGE_SIZE-1);
+ offset_max = max(offset_from, offset_to);
+@@ -325,6 +342,7 @@
+ uaddr_from += size;
+ uaddr_to += size;
+ } while (done < n);
++out:
+ spin_unlock(&mm->page_table_lock);
+ return n - done;
+ fault:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/s390/mm/mmap.c linux-2.6.29-rc3.owrt/arch/s390/mm/mmap.c
+--- linux-2.6.29.owrt/arch/s390/mm/mmap.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/s390/mm/mmap.c 2009-05-10 23:48:28.000000000 +0200
+@@ -35,7 +35,7 @@
+ * Leave an at least ~128 MB hole.
+ */
+ #define MIN_GAP (128*1024*1024)
+-#define MAX_GAP (STACK_TOP/6*5)
++#define MAX_GAP (TASK_SIZE/6*5)
+
+ static inline unsigned long mmap_base(void)
+ {
+@@ -46,7 +46,7 @@
+ else if (gap > MAX_GAP)
+ gap = MAX_GAP;
+
+- return STACK_TOP - (gap & PAGE_MASK);
++ return TASK_SIZE - (gap & PAGE_MASK);
+ }
+
+ static inline int mmap_is_legacy(void)
+@@ -89,58 +89,42 @@
+
+ #else
+
+-int s390_mmap_check(unsigned long addr, unsigned long len)
+-{
+- if (!test_thread_flag(TIF_31BIT) &&
+- len >= TASK_SIZE && TASK_SIZE < (1UL << 53))
+- return crst_table_upgrade(current->mm, 1UL << 53);
+- return 0;
+-}
+-
+ static unsigned long
+ s390_get_unmapped_area(struct file *filp, unsigned long addr,
+ unsigned long len, unsigned long pgoff, unsigned long flags)
+ {
+ struct mm_struct *mm = current->mm;
+- unsigned long area;
+ int rc;
+
+- area = arch_get_unmapped_area(filp, addr, len, pgoff, flags);
+- if (!(area & ~PAGE_MASK))
+- return area;
+- if (area == -ENOMEM &&
+- !test_thread_flag(TIF_31BIT) && TASK_SIZE < (1UL << 53)) {
+- /* Upgrade the page table to 4 levels and retry. */
+- rc = crst_table_upgrade(mm, 1UL << 53);
++ addr = arch_get_unmapped_area(filp, addr, len, pgoff, flags);
++ if (addr & ~PAGE_MASK)
++ return addr;
++ if (unlikely(mm->context.asce_limit < addr + len)) {
++ rc = crst_table_upgrade(mm, addr + len);
+ if (rc)
+ return (unsigned long) rc;
+- area = arch_get_unmapped_area(filp, addr, len, pgoff, flags);
+ }
+- return area;
++ return addr;
+ }
+
+ static unsigned long
+-s390_get_unmapped_area_topdown(struct file *filp, const unsigned long addr,
++s390_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
+ const unsigned long len, const unsigned long pgoff,
+ const unsigned long flags)
+ {
+ struct mm_struct *mm = current->mm;
+- unsigned long area;
++ unsigned long addr = addr0;
+ int rc;
+
+- area = arch_get_unmapped_area_topdown(filp, addr, len, pgoff, flags);
+- if (!(area & ~PAGE_MASK))
+- return area;
+- if (area == -ENOMEM &&
+- !test_thread_flag(TIF_31BIT) && TASK_SIZE < (1UL << 53)) {
+- /* Upgrade the page table to 4 levels and retry. */
+- rc = crst_table_upgrade(mm, 1UL << 53);
++ addr = arch_get_unmapped_area_topdown(filp, addr, len, pgoff, flags);
++ if (addr & ~PAGE_MASK)
++ return addr;
++ if (unlikely(mm->context.asce_limit < addr + len)) {
++ rc = crst_table_upgrade(mm, addr + len);
+ if (rc)
+ return (unsigned long) rc;
+- area = arch_get_unmapped_area_topdown(filp, addr, len,
+- pgoff, flags);
+ }
+- return area;
++ return addr;
+ }
+ /*
+ * This function, called very early during the creation of a new
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/s390/mm/pgtable.c linux-2.6.29-rc3.owrt/arch/s390/mm/pgtable.c
+--- linux-2.6.29.owrt/arch/s390/mm/pgtable.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/s390/mm/pgtable.c 2009-05-10 23:48:28.000000000 +0200
+@@ -117,7 +117,6 @@
+ crst_table_init(table, entry);
+ pgd_populate(mm, (pgd_t *) table, (pud_t *) pgd);
+ mm->pgd = (pgd_t *) table;
+- mm->task_size = mm->context.asce_limit;
+ table = NULL;
+ }
+ spin_unlock(&mm->page_table_lock);
+@@ -155,7 +154,6 @@
+ BUG();
+ }
+ mm->pgd = (pgd_t *) (pgd_val(*pgd) & _REGION_ENTRY_ORIGIN);
+- mm->task_size = mm->context.asce_limit;
+ crst_table_free(mm, (unsigned long *) pgd);
+ }
+ update_mm(mm, current);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sh/boards/board-ap325rxa.c linux-2.6.29-rc3.owrt/arch/sh/boards/board-ap325rxa.c
+--- linux-2.6.29.owrt/arch/sh/boards/board-ap325rxa.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sh/boards/board-ap325rxa.c 2009-05-10 23:48:28.000000000 +0200
+@@ -22,7 +22,6 @@
+ #include <linux/gpio.h>
+ #include <linux/spi/spi.h>
+ #include <linux/spi/spi_gpio.h>
+-#include <media/soc_camera.h>
+ #include <media/soc_camera_platform.h>
+ #include <media/sh_mobile_ceu.h>
+ #include <video/sh_mobile_lcdc.h>
+@@ -217,12 +216,6 @@
+ },
+ };
+
+-static void camera_power(int val)
+-{
+- gpio_set_value(GPIO_PTZ5, val); /* RST_CAM/RSTB */
+- mdelay(10);
+-}
+-
+ #ifdef CONFIG_I2C
+ static unsigned char camera_ncm03j_magic[] =
+ {
+@@ -252,11 +245,9 @@
+ int ret = 0;
+ int i;
+
+- camera_power(0);
+ if (!enable)
+ return 0; /* no disable for now */
+
+- camera_power(1);
+ for (i = 0; i < ARRAY_SIZE(camera_ncm03j_magic); i += 2) {
+ u_int8_t buf[8];
+
+@@ -435,7 +426,7 @@
+ gpio_request(GPIO_PTZ6, NULL);
+ gpio_direction_output(GPIO_PTZ6, 0); /* STBY_CAM */
+ gpio_request(GPIO_PTZ5, NULL);
+- gpio_direction_output(GPIO_PTZ5, 0); /* RST_CAM */
++ gpio_direction_output(GPIO_PTZ5, 1); /* RST_CAM */
+ gpio_request(GPIO_PTZ4, NULL);
+ gpio_direction_output(GPIO_PTZ4, 0); /* SADDR */
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sh/configs/ap325rxa_defconfig linux-2.6.29-rc3.owrt/arch/sh/configs/ap325rxa_defconfig
+--- linux-2.6.29.owrt/arch/sh/configs/ap325rxa_defconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sh/configs/ap325rxa_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-rc2
+-# Tue Jan 27 11:45:08 2009
++# Linux kernel version: 2.6.28
++# Fri Jan 9 16:54:19 2009
+ #
+ CONFIG_SUPERH=y
+ CONFIG_SUPERH32=y
+@@ -45,12 +45,12 @@
+ # CONFIG_AUDIT is not set
+ # CONFIG_IKCONFIG is not set
+ CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_CGROUPS is not set
+ CONFIG_GROUP_SCHED=y
+ CONFIG_FAIR_GROUP_SCHED=y
+ # CONFIG_RT_GROUP_SCHED is not set
+ CONFIG_USER_SCHED=y
+ # CONFIG_CGROUP_SCHED is not set
+-# CONFIG_CGROUPS is not set
+ CONFIG_SYSFS_DEPRECATED=y
+ CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
+@@ -378,7 +378,6 @@
+ # CONFIG_WIRELESS_EXT is not set
+ # CONFIG_LIB80211 is not set
+ # CONFIG_MAC80211 is not set
+-# CONFIG_WIMAX is not set
+ # CONFIG_RFKILL is not set
+ # CONFIG_NET_9P is not set
+
+@@ -401,7 +400,6 @@
+ # CONFIG_MTD_DEBUG is not set
+ CONFIG_MTD_CONCAT=y
+ CONFIG_MTD_PARTITIONS=y
+-# CONFIG_MTD_TESTS is not set
+ # CONFIG_MTD_REDBOOT_PARTS is not set
+ CONFIG_MTD_CMDLINE_PARTS=y
+ # CONFIG_MTD_AR7_PARTS is not set
+@@ -449,7 +447,9 @@
+ #
+ # CONFIG_MTD_COMPLEX_MAPPINGS is not set
+ CONFIG_MTD_PHYSMAP=y
+-# CONFIG_MTD_PHYSMAP_COMPAT is not set
++CONFIG_MTD_PHYSMAP_START=0xffffffff
++CONFIG_MTD_PHYSMAP_LEN=0
++CONFIG_MTD_PHYSMAP_BANKWIDTH=0
+ # CONFIG_MTD_PLATRAM is not set
+
+ #
+@@ -480,12 +480,6 @@
+ # CONFIG_MTD_ONENAND is not set
+
+ #
+-# LPDDR flash memory drivers
+-#
+-# CONFIG_MTD_LPDDR is not set
+-# CONFIG_MTD_QINFO_PROBE is not set
+-
+-#
+ # UBI - Unsorted block images
+ #
+ CONFIG_MTD_UBI=y
+@@ -613,10 +607,6 @@
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
+ # CONFIG_IWLWIFI_LEDS is not set
+-
+-#
+-# Enable WiMAX (Networking options) to see the WiMAX drivers
+-#
+ # CONFIG_WAN is not set
+ # CONFIG_PPP is not set
+ # CONFIG_SLIP is not set
+@@ -800,7 +790,6 @@
+ # CONFIG_PMIC_DA903X is not set
+ # CONFIG_MFD_WM8400 is not set
+ # CONFIG_MFD_WM8350_I2C is not set
+-# CONFIG_MFD_PCF50633 is not set
+ # CONFIG_REGULATOR is not set
+
+ #
+@@ -848,7 +837,7 @@
+ # CONFIG_SOC_CAMERA_MT9V022 is not set
+ # CONFIG_SOC_CAMERA_TW9910 is not set
+ CONFIG_SOC_CAMERA_PLATFORM=y
+-CONFIG_SOC_CAMERA_OV772X=y
++# CONFIG_SOC_CAMERA_OV772X is not set
+ CONFIG_VIDEO_SH_MOBILE_CEU=y
+ # CONFIG_RADIO_ADAPTERS is not set
+ # CONFIG_DAB is not set
+@@ -1023,7 +1012,6 @@
+ CONFIG_FILE_LOCKING=y
+ # CONFIG_XFS_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_BTRFS_FS is not set
+ CONFIG_DNOTIFY=y
+ CONFIG_INOTIFY=y
+ CONFIG_INOTIFY_USER=y
+@@ -1072,7 +1060,6 @@
+ # CONFIG_JFFS2_FS is not set
+ # CONFIG_UBIFS_FS is not set
+ # CONFIG_CRAMFS is not set
+-# CONFIG_SQUASHFS is not set
+ # CONFIG_VXFS_FS is not set
+ # CONFIG_MINIX_FS is not set
+ # CONFIG_OMFS_FS is not set
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sh/configs/migor_defconfig linux-2.6.29-rc3.owrt/arch/sh/configs/migor_defconfig
+--- linux-2.6.29.owrt/arch/sh/configs/migor_defconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sh/configs/migor_defconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.29-rc1
+-# Thu Jan 22 09:16:16 2009
++# Linux kernel version: 2.6.28
++# Fri Jan 9 17:09:35 2009
+ #
+ CONFIG_SUPERH=y
+ CONFIG_SUPERH32=y
+@@ -45,12 +45,8 @@
+ CONFIG_IKCONFIG=y
+ CONFIG_IKCONFIG_PROC=y
+ CONFIG_LOG_BUF_SHIFT=14
+-# CONFIG_GROUP_SCHED is not set
+-
+-#
+-# Control Group support
+-#
+ # CONFIG_CGROUPS is not set
++# CONFIG_GROUP_SCHED is not set
+ CONFIG_SYSFS_DEPRECATED=y
+ CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
+@@ -393,7 +389,6 @@
+ CONFIG_WIRELESS_EXT_SYSFS=y
+ # CONFIG_LIB80211 is not set
+ # CONFIG_MAC80211 is not set
+-# CONFIG_WIMAX is not set
+ # CONFIG_RFKILL is not set
+ # CONFIG_NET_9P is not set
+
+@@ -416,7 +411,6 @@
+ # CONFIG_MTD_DEBUG is not set
+ CONFIG_MTD_CONCAT=y
+ CONFIG_MTD_PARTITIONS=y
+-# CONFIG_MTD_TESTS is not set
+ # CONFIG_MTD_REDBOOT_PARTS is not set
+ CONFIG_MTD_CMDLINE_PARTS=y
+ # CONFIG_MTD_AR7_PARTS is not set
+@@ -464,7 +458,9 @@
+ #
+ # CONFIG_MTD_COMPLEX_MAPPINGS is not set
+ CONFIG_MTD_PHYSMAP=y
+-# CONFIG_MTD_PHYSMAP_COMPAT is not set
++CONFIG_MTD_PHYSMAP_START=0xffffffff
++CONFIG_MTD_PHYSMAP_LEN=0
++CONFIG_MTD_PHYSMAP_BANKWIDTH=0
+ # CONFIG_MTD_PLATRAM is not set
+
+ #
+@@ -492,12 +488,6 @@
+ # CONFIG_MTD_ONENAND is not set
+
+ #
+-# LPDDR flash memory drivers
+-#
+-# CONFIG_MTD_LPDDR is not set
+-# CONFIG_MTD_QINFO_PROBE is not set
+-
+-#
+ # UBI - Unsorted block images
+ #
+ # CONFIG_MTD_UBI is not set
+@@ -597,10 +587,6 @@
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
+ # CONFIG_IWLWIFI_LEDS is not set
+-
+-#
+-# Enable WiMAX (Networking options) to see the WiMAX drivers
+-#
+ # CONFIG_WAN is not set
+ # CONFIG_PPP is not set
+ # CONFIG_SLIP is not set
+@@ -775,7 +761,6 @@
+ # CONFIG_PMIC_DA903X is not set
+ # CONFIG_MFD_WM8400 is not set
+ # CONFIG_MFD_WM8350_I2C is not set
+-# CONFIG_MFD_PCF50633 is not set
+ # CONFIG_REGULATOR is not set
+
+ #
+@@ -821,9 +806,9 @@
+ # CONFIG_SOC_CAMERA_MT9M111 is not set
+ # CONFIG_SOC_CAMERA_MT9T031 is not set
+ # CONFIG_SOC_CAMERA_MT9V022 is not set
+-CONFIG_SOC_CAMERA_TW9910=y
+-# CONFIG_SOC_CAMERA_PLATFORM is not set
+-CONFIG_SOC_CAMERA_OV772X=y
++# CONFIG_SOC_CAMERA_TW9910 is not set
++CONFIG_SOC_CAMERA_PLATFORM=y
++# CONFIG_SOC_CAMERA_OV772X is not set
+ CONFIG_VIDEO_SH_MOBILE_CEU=y
+ # CONFIG_RADIO_ADAPTERS is not set
+ # CONFIG_DAB is not set
+@@ -881,13 +866,11 @@
+ # CONFIG_USB_GADGET_PXA25X is not set
+ # CONFIG_USB_GADGET_PXA27X is not set
+ # CONFIG_USB_GADGET_S3C2410 is not set
+-# CONFIG_USB_GADGET_IMX is not set
+ CONFIG_USB_GADGET_M66592=y
+ CONFIG_USB_M66592=y
+ CONFIG_SUPERH_BUILT_IN_M66592=y
+ # CONFIG_USB_GADGET_AMD5536UDC is not set
+ # CONFIG_USB_GADGET_FSL_QE is not set
+-# CONFIG_USB_GADGET_CI13XXX is not set
+ # CONFIG_USB_GADGET_NET2280 is not set
+ # CONFIG_USB_GADGET_GOKU is not set
+ # CONFIG_USB_GADGET_DUMMY_HCD is not set
+@@ -900,11 +883,6 @@
+ # CONFIG_USB_MIDI_GADGET is not set
+ # CONFIG_USB_G_PRINTER is not set
+ # CONFIG_USB_CDC_COMPOSITE is not set
+-
+-#
+-# OTG and related infrastructure
+-#
+-# CONFIG_USB_GPIO_VBUS is not set
+ # CONFIG_MMC is not set
+ # CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS is not set
+@@ -983,7 +961,6 @@
+ CONFIG_FILE_LOCKING=y
+ # CONFIG_XFS_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-# CONFIG_BTRFS_FS is not set
+ # CONFIG_DNOTIFY is not set
+ # CONFIG_INOTIFY is not set
+ # CONFIG_QUOTA is not set
+@@ -1027,7 +1004,6 @@
+ # CONFIG_EFS_FS is not set
+ # CONFIG_JFFS2_FS is not set
+ # CONFIG_CRAMFS is not set
+-# CONFIG_SQUASHFS is not set
+ # CONFIG_VXFS_FS is not set
+ # CONFIG_MINIX_FS is not set
+ # CONFIG_OMFS_FS is not set
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sh/include/asm/mutex-llsc.h linux-2.6.29-rc3.owrt/arch/sh/include/asm/mutex-llsc.h
+--- linux-2.6.29.owrt/arch/sh/include/asm/mutex-llsc.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sh/include/asm/mutex-llsc.h 2009-05-10 23:48:28.000000000 +0200
+@@ -21,36 +21,38 @@
+ static inline void
+ __mutex_fastpath_lock(atomic_t *count, void (*fail_fn)(atomic_t *))
+ {
+- int __done, __res;
++ int __ex_flag, __res;
+
+ __asm__ __volatile__ (
+ "movli.l @%2, %0 \n"
+ "add #-1, %0 \n"
+ "movco.l %0, @%2 \n"
+ "movt %1 \n"
+- : "=&z" (__res), "=&r" (__done)
++ : "=&z" (__res), "=&r" (__ex_flag)
+ : "r" (&(count)->counter)
+ : "t");
+
+- if (unlikely(!__done || __res != 0))
++ __res |= !__ex_flag;
++ if (unlikely(__res != 0))
+ fail_fn(count);
+ }
+
+ static inline int
+ __mutex_fastpath_lock_retval(atomic_t *count, int (*fail_fn)(atomic_t *))
+ {
+- int __done, __res;
++ int __ex_flag, __res;
+
+ __asm__ __volatile__ (
+ "movli.l @%2, %0 \n"
+ "add #-1, %0 \n"
+ "movco.l %0, @%2 \n"
+ "movt %1 \n"
+- : "=&z" (__res), "=&r" (__done)
++ : "=&z" (__res), "=&r" (__ex_flag)
+ : "r" (&(count)->counter)
+ : "t");
+
+- if (unlikely(!__done || __res != 0))
++ __res |= !__ex_flag;
++ if (unlikely(__res != 0))
+ __res = fail_fn(count);
+
+ return __res;
+@@ -59,18 +61,19 @@
+ static inline void
+ __mutex_fastpath_unlock(atomic_t *count, void (*fail_fn)(atomic_t *))
+ {
+- int __done, __res;
++ int __ex_flag, __res;
+
+ __asm__ __volatile__ (
+ "movli.l @%2, %0 \n\t"
+ "add #1, %0 \n\t"
+ "movco.l %0, @%2 \n\t"
+ "movt %1 \n\t"
+- : "=&z" (__res), "=&r" (__done)
++ : "=&z" (__res), "=&r" (__ex_flag)
+ : "r" (&(count)->counter)
+ : "t");
+
+- if (unlikely(!__done || __res <= 0))
++ __res |= !__ex_flag;
++ if (unlikely(__res <= 0))
+ fail_fn(count);
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sh/include/asm/syscall_32.h linux-2.6.29-rc3.owrt/arch/sh/include/asm/syscall_32.h
+--- linux-2.6.29.owrt/arch/sh/include/asm/syscall_32.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sh/include/asm/syscall_32.h 2009-05-10 23:48:28.000000000 +0200
+@@ -21,10 +21,23 @@
+ */
+ }
+
++static inline bool syscall_has_error(struct pt_regs *regs)
++{
++ return (regs->sr & 0x1) ? true : false;
++}
++static inline void syscall_set_error(struct pt_regs *regs)
++{
++ regs->sr |= 0x1;
++}
++static inline void syscall_clear_error(struct pt_regs *regs)
++{
++ regs->sr &= ~0x1;
++}
++
+ static inline long syscall_get_error(struct task_struct *task,
+ struct pt_regs *regs)
+ {
+- return IS_ERR_VALUE(regs->regs[0]) ? regs->regs[0] : 0;
++ return syscall_has_error(regs) ? regs->regs[0] : 0;
+ }
+
+ static inline long syscall_get_return_value(struct task_struct *task,
+@@ -37,10 +50,13 @@
+ struct pt_regs *regs,
+ int error, long val)
+ {
+- if (error)
++ if (error) {
++ syscall_set_error(regs);
+ regs->regs[0] = -error;
+- else
++ } else {
++ syscall_clear_error(regs);
+ regs->regs[0] = val;
++ }
+ }
+
+ static inline void syscall_get_arguments(struct task_struct *task,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sh/include/asm/syscall_64.h linux-2.6.29-rc3.owrt/arch/sh/include/asm/syscall_64.h
+--- linux-2.6.29.owrt/arch/sh/include/asm/syscall_64.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sh/include/asm/syscall_64.h 2009-05-10 23:48:28.000000000 +0200
+@@ -21,10 +21,23 @@
+ */
+ }
+
++static inline bool syscall_has_error(struct pt_regs *regs)
++{
++ return (regs->sr & 0x1) ? true : false;
++}
++static inline void syscall_set_error(struct pt_regs *regs)
++{
++ regs->sr |= 0x1;
++}
++static inline void syscall_clear_error(struct pt_regs *regs)
++{
++ regs->sr &= ~0x1;
++}
++
+ static inline long syscall_get_error(struct task_struct *task,
+ struct pt_regs *regs)
+ {
+- return IS_ERR_VALUE(regs->regs[9]) ? regs->regs[9] : 0;
++ return syscall_has_error(regs) ? regs->regs[9] : 0;
+ }
+
+ static inline long syscall_get_return_value(struct task_struct *task,
+@@ -37,10 +50,13 @@
+ struct pt_regs *regs,
+ int error, long val)
+ {
+- if (error)
++ if (error) {
++ syscall_set_error(regs);
+ regs->regs[9] = -error;
+- else
++ } else {
++ syscall_clear_error(regs);
+ regs->regs[9] = val;
++ }
+ }
+
+ static inline void syscall_get_arguments(struct task_struct *task,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sh/kernel/cpu/sh2a/clock-sh7201.c linux-2.6.29-rc3.owrt/arch/sh/kernel/cpu/sh2a/clock-sh7201.c
+--- linux-2.6.29.owrt/arch/sh/kernel/cpu/sh2a/clock-sh7201.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sh/kernel/cpu/sh2a/clock-sh7201.c 2009-05-10 23:48:28.000000000 +0200
+@@ -18,8 +18,8 @@
+ #include <asm/freq.h>
+ #include <asm/io.h>
+
+-static const int pll1rate[]={1,2,3,4,6,8};
+-static const int pfc_divisors[]={1,2,3,4,6,8,12};
++const static int pll1rate[]={1,2,3,4,6,8};
++const static int pfc_divisors[]={1,2,3,4,6,8,12};
+ #define ifc_divisors pfc_divisors
+
+ #if (CONFIG_SH_CLK_MD == 0)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sh/kernel/cpu/sh4/fpu.c linux-2.6.29-rc3.owrt/arch/sh/kernel/cpu/sh4/fpu.c
+--- linux-2.6.29.owrt/arch/sh/kernel/cpu/sh4/fpu.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sh/kernel/cpu/sh4/fpu.c 2009-05-10 23:48:28.000000000 +0200
+@@ -423,7 +423,7 @@
+ int m;
+ unsigned int hx;
+
+- m = (finsn >> 8) & 0x7;
++ m = (finsn >> 9) & 0x7;
+ hx = tsk->thread.fpu.hard.fp_regs[m];
+
+ if ((tsk->thread.fpu.hard.fpscr & FPSCR_CAUSE_ERROR)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sh/kernel/setup.c linux-2.6.29-rc3.owrt/arch/sh/kernel/setup.c
+--- linux-2.6.29.owrt/arch/sh/kernel/setup.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sh/kernel/setup.c 2009-05-10 23:48:28.000000000 +0200
+@@ -262,11 +262,11 @@
+ BOOTMEM_DEFAULT);
+
+ /*
+- * Reserve physical pages below CONFIG_ZERO_PAGE_OFFSET.
++ * reserve physical page 0 - it's a special BIOS page on many boxes,
++ * enabling clean reboots, SMP operation, laptop functions.
+ */
+- if (CONFIG_ZERO_PAGE_OFFSET != 0)
+- reserve_bootmem(__MEMORY_START, CONFIG_ZERO_PAGE_OFFSET,
+- BOOTMEM_DEFAULT);
++ reserve_bootmem(__MEMORY_START, CONFIG_ZERO_PAGE_OFFSET,
++ BOOTMEM_DEFAULT);
+
+ sparse_memory_present_with_active_regions(0);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sh/kernel/signal_32.c linux-2.6.29-rc3.owrt/arch/sh/kernel/signal_32.c
+--- linux-2.6.29.owrt/arch/sh/kernel/signal_32.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sh/kernel/signal_32.c 2009-05-10 23:48:28.000000000 +0200
+@@ -510,6 +510,7 @@
+ case -ERESTARTNOHAND:
+ no_system_call_restart:
+ regs->regs[0] = -EINTR;
++ regs->sr |= 1;
+ break;
+
+ case -ERESTARTSYS:
+@@ -588,7 +589,8 @@
+
+ signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+ if (signr > 0) {
+- handle_syscall_restart(save_r0, regs, &ka.sa);
++ if (regs->sr & 1)
++ handle_syscall_restart(save_r0, regs, &ka.sa);
+
+ /* Whee! Actually deliver the signal. */
+ if (handle_signal(signr, &ka, &info, oldset,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sh/kernel/signal_64.c linux-2.6.29-rc3.owrt/arch/sh/kernel/signal_64.c
+--- linux-2.6.29.owrt/arch/sh/kernel/signal_64.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sh/kernel/signal_64.c 2009-05-10 23:48:28.000000000 +0200
+@@ -60,6 +60,7 @@
+ case -ERESTARTNOHAND:
+ no_system_call_restart:
+ regs->regs[REG_RET] = -EINTR;
++ regs->sr |= 1;
+ break;
+
+ case -ERESTARTSYS:
+@@ -108,7 +109,8 @@
+
+ signr = get_signal_to_deliver(&info, &ka, regs, 0);
+ if (signr > 0) {
+- handle_syscall_restart(regs, &ka.sa);
++ if (regs->sr & 1)
++ handle_syscall_restart(regs, &ka.sa);
+
+ /* Whee! Actually deliver the signal. */
+ if (handle_signal(signr, &info, &ka, oldset, regs) == 0) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sh/lib/checksum.S linux-2.6.29-rc3.owrt/arch/sh/lib/checksum.S
+--- linux-2.6.29.owrt/arch/sh/lib/checksum.S 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sh/lib/checksum.S 2009-05-10 23:48:28.000000000 +0200
+@@ -36,7 +36,8 @@
+ */
+
+ /*
+- * asmlinkage __wsum csum_partial(const void *buf, int len, __wsum sum);
++ * unsigned int csum_partial(const unsigned char *buf, int len,
++ * unsigned int sum);
+ */
+
+ .text
+@@ -48,31 +49,11 @@
+ * Fortunately, it is easy to convert 2-byte alignment to 4-byte
+ * alignment for the unrolled loop.
+ */
++ mov r5, r1
+ mov r4, r0
+- tst #3, r0 ! Check alignment.
+- bt/s 2f ! Jump if alignment is ok.
+- mov r4, r7 ! Keep a copy to check for alignment
++ tst #2, r0 ! Check alignment.
++ bt 2f ! Jump if alignment is ok.
+ !
+- tst #1, r0 ! Check alignment.
+- bt 21f ! Jump if alignment is boundary of 2bytes.
+-
+- ! buf is odd
+- tst r5, r5
+- add #-1, r5
+- bt 9f
+- mov.b @r4+, r0
+- extu.b r0, r0
+- addc r0, r6 ! t=0 from previous tst
+- mov r6, r0
+- shll8 r6
+- shlr16 r0
+- shlr8 r0
+- or r0, r6
+- mov r4, r0
+- tst #2, r0
+- bt 2f
+-21:
+- ! buf is 2 byte aligned (len could be 0)
+ add #-2, r5 ! Alignment uses up two bytes.
+ cmp/pz r5 !
+ bt/s 1f ! Jump if we had at least two bytes.
+@@ -80,17 +61,16 @@
+ bra 6f
+ add #2, r5 ! r5 was < 2. Deal with it.
+ 1:
++ mov r5, r1 ! Save new len for later use.
+ mov.w @r4+, r0
+ extu.w r0, r0
+ addc r0, r6
+ bf 2f
+ add #1, r6
+ 2:
+- ! buf is 4 byte aligned (len could be 0)
+- mov r5, r1
+ mov #-5, r0
+- shld r0, r1
+- tst r1, r1
++ shld r0, r5
++ tst r5, r5
+ bt/s 4f ! if it's =0, go to 4f
+ clrt
+ .align 2
+@@ -112,31 +92,30 @@
+ addc r0, r6
+ addc r2, r6
+ movt r0
+- dt r1
++ dt r5
+ bf/s 3b
+ cmp/eq #1, r0
+- ! here, we know r1==0
+- addc r1, r6 ! add carry to r6
++ ! here, we know r5==0
++ addc r5, r6 ! add carry to r6
+ 4:
+- mov r5, r0
++ mov r1, r0
+ and #0x1c, r0
+ tst r0, r0
+- bt 6f
+- ! 4 bytes or more remaining
+- mov r0, r1
+- shlr2 r1
++ bt/s 6f
++ mov r0, r5
++ shlr2 r5
+ mov #0, r2
+ 5:
+ addc r2, r6
+ mov.l @r4+, r2
+ movt r0
+- dt r1
++ dt r5
+ bf/s 5b
+ cmp/eq #1, r0
+ addc r2, r6
+- addc r1, r6 ! r1==0 here, so it means add carry-bit
++ addc r5, r6 ! r5==0 here, so it means add carry-bit
+ 6:
+- ! 3 bytes or less remaining
++ mov r1, r5
+ mov #3, r0
+ and r0, r5
+ tst r5, r5
+@@ -160,18 +139,8 @@
+ 8:
+ addc r0, r6
+ mov #0, r0
+- addc r0, r6
++ addc r0, r6
+ 9:
+- ! Check if the buffer was misaligned, if so realign sum
+- mov r7, r0
+- tst #1, r0
+- bt 10f
+- mov r6, r0
+- shll8 r6
+- shlr16 r0
+- shlr8 r0
+- or r0, r6
+-10:
+ rts
+ mov r6, r0
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/include/asm/compat.h linux-2.6.29-rc3.owrt/arch/sparc/include/asm/compat.h
+--- linux-2.6.29.owrt/arch/sparc/include/asm/compat.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/include/asm/compat.h 2009-05-10 23:48:28.000000000 +0200
+@@ -240,9 +240,4 @@
+ unsigned int __unused2;
+ };
+
+-static inline int is_compat_task(void)
+-{
+- return test_thread_flag(TIF_32BIT);
+-}
+-
+ #endif /* _ASM_SPARC64_COMPAT_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/include/asm/cpudata_64.h linux-2.6.29-rc3.owrt/arch/sparc/include/asm/cpudata_64.h
+--- linux-2.6.29.owrt/arch/sparc/include/asm/cpudata_64.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/include/asm/cpudata_64.h 2009-05-10 23:48:28.000000000 +0200
+@@ -17,7 +17,7 @@
+ typedef struct {
+ /* Dcache line 1 */
+ unsigned int __softirq_pending; /* must be 1st, see rtrap.S */
+- unsigned int __nmi_count;
++ unsigned int __pad0;
+ unsigned long clock_tick; /* %tick's per second */
+ unsigned long __pad;
+ unsigned int __pad1;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/include/asm/irq_64.h linux-2.6.29-rc3.owrt/arch/sparc/include/asm/irq_64.h
+--- linux-2.6.29.owrt/arch/sparc/include/asm/irq_64.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/include/asm/irq_64.h 2009-05-10 23:48:28.000000000 +0200
+@@ -66,6 +66,9 @@
+ extern void __init init_IRQ(void);
+ extern void fixup_irqs(void);
+
++extern int register_perfctr_intr(void (*handler)(struct pt_regs *));
++extern void release_perfctr_intr(void (*handler)(struct pt_regs *));
++
+ static inline void set_softint(unsigned long bits)
+ {
+ __asm__ __volatile__("wr %0, 0x0, %%set_softint"
+@@ -95,6 +98,5 @@
+ extern void *hardirq_stack[NR_CPUS];
+ extern void *softirq_stack[NR_CPUS];
+ #define __ARCH_HAS_DO_SOFTIRQ
+-#define ARCH_HAS_NMI_WATCHDOG
+
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/include/asm/kdebug_64.h linux-2.6.29-rc3.owrt/arch/sparc/include/asm/kdebug_64.h
+--- linux-2.6.29.owrt/arch/sparc/include/asm/kdebug_64.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/include/asm/kdebug_64.h 2009-05-10 23:48:28.000000000 +0200
+@@ -14,8 +14,6 @@
+ DIE_TRAP,
+ DIE_TRAP_TL1,
+ DIE_CALL,
+- DIE_NMI,
+- DIE_NMIWATCHDOG,
+ };
+
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/include/asm/nmi.h linux-2.6.29-rc3.owrt/arch/sparc/include/asm/nmi.h
+--- linux-2.6.29.owrt/arch/sparc/include/asm/nmi.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/include/asm/nmi.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,10 +0,0 @@
+-#ifndef __NMI_H
+-#define __NMI_H
+-
+-extern int __init nmi_init(void);
+-extern void perfctr_irq(int irq, struct pt_regs *regs);
+-extern void nmi_adjust_hz(unsigned int new_hz);
+-
+-extern int nmi_usable;
+-
+-#endif /* __NMI_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/include/asm/pcr.h linux-2.6.29-rc3.owrt/arch/sparc/include/asm/pcr.h
+--- linux-2.6.29.owrt/arch/sparc/include/asm/pcr.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/include/asm/pcr.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,46 +0,0 @@
+-#ifndef __PCR_H
+-#define __PCR_H
+-
+-struct pcr_ops {
+- u64 (*read)(void);
+- void (*write)(u64);
+-};
+-extern const struct pcr_ops *pcr_ops;
+-
+-extern void deferred_pcr_work_irq(int irq, struct pt_regs *regs);
+-extern void schedule_deferred_pcr_work(void);
+-
+-#define PCR_PIC_PRIV 0x00000001 /* PIC access is privileged */
+-#define PCR_STRACE 0x00000002 /* Trace supervisor events */
+-#define PCR_UTRACE 0x00000004 /* Trace user events */
+-#define PCR_N2_HTRACE 0x00000008 /* Trace hypervisor events */
+-#define PCR_N2_TOE_OV0 0x00000010 /* Trap if PIC 0 overflows */
+-#define PCR_N2_TOE_OV1 0x00000020 /* Trap if PIC 1 overflows */
+-#define PCR_N2_MASK0 0x00003fc0
+-#define PCR_N2_MASK0_SHIFT 6
+-#define PCR_N2_SL0 0x0003c000
+-#define PCR_N2_SL0_SHIFT 14
+-#define PCR_N2_OV0 0x00040000
+-#define PCR_N2_MASK1 0x07f80000
+-#define PCR_N2_MASK1_SHIFT 19
+-#define PCR_N2_SL1 0x78000000
+-#define PCR_N2_SL1_SHIFT 27
+-#define PCR_N2_OV1 0x80000000
+-
+-extern unsigned int picl_shift;
+-
+-/* In order to commonize as much of the implementation as
+- * possible, we use PICH as our counter. Mostly this is
+- * to accomodate Niagara-1 which can only count insn cycles
+- * in PICH.
+- */
+-static inline u64 picl_value(unsigned int nmi_hz)
+-{
+- u32 delta = local_cpu_data().clock_tick / (nmi_hz << picl_shift);
+-
+- return ((u64)((0 - delta) & 0xffffffff)) << 32;
+-}
+-
+-extern u64 pcr_enable;
+-
+-#endif /* __PCR_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/include/asm/pil.h linux-2.6.29-rc3.owrt/arch/sparc/include/asm/pil.h
+--- linux-2.6.29.owrt/arch/sparc/include/asm/pil.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/include/asm/pil.h 2009-05-10 23:48:28.000000000 +0200
+@@ -23,8 +23,6 @@
+ #define PIL_SMP_CTX_NEW_VERSION 4
+ #define PIL_DEVICE_IRQ 5
+ #define PIL_SMP_CALL_FUNC_SNGL 6
+-#define PIL_DEFERRED_PCR_WORK 7
+-#define PIL_KGDB_CAPTURE 8
+ #define PIL_NORMAL_MAX 14
+ #define PIL_NMI 15
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/include/asm/seccomp.h linux-2.6.29-rc3.owrt/arch/sparc/include/asm/seccomp.h
+--- linux-2.6.29.owrt/arch/sparc/include/asm/seccomp.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/include/asm/seccomp.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,5 +1,11 @@
+ #ifndef _ASM_SECCOMP_H
+
++#include <linux/thread_info.h> /* already defines TIF_32BIT */
++
++#ifndef TIF_32BIT
++#error "unexpected TIF_32BIT on sparc64"
++#endif
++
+ #include <linux/unistd.h>
+
+ #define __NR_seccomp_read __NR_read
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/kernel/chmc.c linux-2.6.29-rc3.owrt/arch/sparc/kernel/chmc.c
+--- linux-2.6.29.owrt/arch/sparc/kernel/chmc.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/chmc.c 2009-05-10 23:48:28.000000000 +0200
+@@ -306,7 +306,6 @@
+ buf[1] = '?';
+ buf[2] = '?';
+ buf[3] = '\0';
+- return 0;
+ }
+ p = dp->controller;
+ prop = &p->layout;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/kernel/cpu.c linux-2.6.29-rc3.owrt/arch/sparc/kernel/cpu.c
+--- linux-2.6.29.owrt/arch/sparc/kernel/cpu.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/cpu.c 2009-05-10 23:48:28.000000000 +0200
+@@ -26,7 +26,6 @@
+ struct cpu_info {
+ int psr_vers;
+ const char *name;
+- const char *pmu_name;
+ };
+
+ struct fpu_info {
+@@ -46,9 +45,6 @@
+ #define CPU(ver, _name) \
+ { .psr_vers = ver, .name = _name }
+
+-#define CPU_PMU(ver, _name, _pmu_name) \
+-{ .psr_vers = ver, .name = _name, .pmu_name = _pmu_name }
+-
+ #define FPU(ver, _name) \
+ { .fp_vers = ver, .name = _name }
+
+@@ -187,10 +183,10 @@
+ },{
+ 0x17,
+ .cpu_info = {
+- CPU_PMU(0x10, "TI UltraSparc I (SpitFire)", "ultra12"),
+- CPU_PMU(0x11, "TI UltraSparc II (BlackBird)", "ultra12"),
+- CPU_PMU(0x12, "TI UltraSparc IIi (Sabre)", "ultra12"),
+- CPU_PMU(0x13, "TI UltraSparc IIe (Hummingbird)", "ultra12"),
++ CPU(0x10, "TI UltraSparc I (SpitFire)"),
++ CPU(0x11, "TI UltraSparc II (BlackBird)"),
++ CPU(0x12, "TI UltraSparc IIi (Sabre)"),
++ CPU(0x13, "TI UltraSparc IIe (Hummingbird)"),
+ CPU(-1, NULL)
+ },
+ .fpu_info = {
+@@ -203,7 +199,7 @@
+ },{
+ 0x22,
+ .cpu_info = {
+- CPU_PMU(0x10, "TI UltraSparc I (SpitFire)", "ultra12"),
++ CPU(0x10, "TI UltraSparc I (SpitFire)"),
+ CPU(-1, NULL)
+ },
+ .fpu_info = {
+@@ -213,12 +209,12 @@
+ },{
+ 0x3e,
+ .cpu_info = {
+- CPU_PMU(0x14, "TI UltraSparc III (Cheetah)", "ultra3"),
+- CPU_PMU(0x15, "TI UltraSparc III+ (Cheetah+)", "ultra3+"),
+- CPU_PMU(0x16, "TI UltraSparc IIIi (Jalapeno)", "ultra3i"),
+- CPU_PMU(0x18, "TI UltraSparc IV (Jaguar)", "ultra3+"),
+- CPU_PMU(0x19, "TI UltraSparc IV+ (Panther)", "ultra4+"),
+- CPU_PMU(0x22, "TI UltraSparc IIIi+ (Serrano)", "ultra3i"),
++ CPU(0x14, "TI UltraSparc III (Cheetah)"),
++ CPU(0x15, "TI UltraSparc III+ (Cheetah+)"),
++ CPU(0x16, "TI UltraSparc IIIi (Jalapeno)"),
++ CPU(0x18, "TI UltraSparc IV (Jaguar)"),
++ CPU(0x19, "TI UltraSparc IV+ (Panther)"),
++ CPU(0x22, "TI UltraSparc IIIi+ (Serrano)"),
+ CPU(-1, NULL)
+ },
+ .fpu_info = {
+@@ -238,7 +234,6 @@
+
+ const char *sparc_cpu_type;
+ const char *sparc_fpu_type;
+-const char *sparc_pmu_type;
+
+ unsigned int fsr_storage;
+
+@@ -249,7 +244,6 @@
+
+ sparc_cpu_type = NULL;
+ sparc_fpu_type = NULL;
+- sparc_pmu_type = NULL;
+ manuf = NULL;
+
+ for (i = 0; i < ARRAY_SIZE(manufacturer_info); i++)
+@@ -269,7 +263,6 @@
+ {
+ if (cpu->psr_vers == psr_vers) {
+ sparc_cpu_type = cpu->name;
+- sparc_pmu_type = cpu->pmu_name;
+ sparc_fpu_type = "No FPU";
+ break;
+ }
+@@ -297,8 +290,6 @@
+ psr_impl, fpu_vers);
+ sparc_fpu_type = "Unknown FPU";
+ }
+- if (sparc_pmu_type == NULL)
+- sparc_pmu_type = "Unknown PMU";
+ }
+
+ #ifdef CONFIG_SPARC32
+@@ -324,13 +315,11 @@
+ case SUN4V_CHIP_NIAGARA1:
+ sparc_cpu_type = "UltraSparc T1 (Niagara)";
+ sparc_fpu_type = "UltraSparc T1 integrated FPU";
+- sparc_pmu_type = "niagara";
+ break;
+
+ case SUN4V_CHIP_NIAGARA2:
+ sparc_cpu_type = "UltraSparc T2 (Niagara2)";
+ sparc_fpu_type = "UltraSparc T2 integrated FPU";
+- sparc_pmu_type = "niagara2";
+ break;
+
+ default:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/kernel/head_64.S linux-2.6.29-rc3.owrt/arch/sparc/kernel/head_64.S
+--- linux-2.6.29.owrt/arch/sparc/kernel/head_64.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/head_64.S 2009-05-10 23:48:28.000000000 +0200
+@@ -891,35 +891,10 @@
+ tlb_type: .word 0 /* Must NOT end up in BSS */
+ .section ".fixup",#alloc,#execinstr
+
+- .globl __ret_efault, __retl_efault, __ret_one, __retl_one
+-ENTRY(__ret_efault)
++ .globl __ret_efault, __retl_efault
++__ret_efault:
+ ret
+ restore %g0, -EFAULT, %o0
+-ENDPROC(__ret_efault)
+-
+-ENTRY(__retl_efault)
++__retl_efault:
+ retl
+ mov -EFAULT, %o0
+-ENDPROC(__retl_efault)
+-
+-ENTRY(__retl_one)
+- retl
+- mov 1, %o0
+-ENDPROC(__retl_one)
+-
+-ENTRY(__ret_one_asi)
+- wr %g0, ASI_AIUS, %asi
+- ret
+- restore %g0, 1, %o0
+-ENDPROC(__ret_one_asi)
+-
+-ENTRY(__retl_one_asi)
+- wr %g0, ASI_AIUS, %asi
+- retl
+- mov 1, %o0
+-ENDPROC(__retl_one_asi)
+-
+-ENTRY(__retl_o1)
+- retl
+- mov %o1, %o0
+-ENDPROC(__retl_o1)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/kernel/irq_64.c linux-2.6.29-rc3.owrt/arch/sparc/kernel/irq_64.c
+--- linux-2.6.29.owrt/arch/sparc/kernel/irq_64.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/irq_64.c 2009-05-10 23:48:28.000000000 +0200
+@@ -196,11 +196,6 @@
+ seq_putc(p, '\n');
+ skip:
+ spin_unlock_irqrestore(&irq_desc[i].lock, flags);
+- } else if (i == NR_IRQS) {
+- seq_printf(p, "NMI: ");
+- for_each_online_cpu(j)
+- seq_printf(p, "%10u ", cpu_data(j).__nmi_count);
+- seq_printf(p, " Non-maskable interrupts\n");
+ }
+ return 0;
+ }
+@@ -323,25 +318,17 @@
+ sun4u_irq_enable(virt_irq);
+ }
+
+-/* Don't do anything. The desc->status check for IRQ_DISABLED in
+- * handler_irq() will skip the handler call and that will leave the
+- * interrupt in the sent state. The next ->enable() call will hit the
+- * ICLR register to reset the state machine.
+- *
+- * This scheme is necessary, instead of clearing the Valid bit in the
+- * IMAP register, to handle the case of IMAP registers being shared by
+- * multiple INOs (and thus ICLR registers). Since we use a different
+- * virtual IRQ for each shared IMAP instance, the generic code thinks
+- * there is only one user so it prematurely calls ->disable() on
+- * free_irq().
+- *
+- * We have to provide an explicit ->disable() method instead of using
+- * NULL to get the default. The reason is that if the generic code
+- * sees that, it also hooks up a default ->shutdown method which
+- * invokes ->mask() which we do not want. See irq_chip_set_defaults().
+- */
+ static void sun4u_irq_disable(unsigned int virt_irq)
+ {
++ struct irq_handler_data *data = get_irq_chip_data(virt_irq);
++
++ if (likely(data)) {
++ unsigned long imap = data->imap;
++ unsigned long tmp = upa_readq(imap);
++
++ tmp &= ~IMAP_VALID;
++ upa_writeq(tmp, imap);
++ }
+ }
+
+ static void sun4u_irq_eoi(unsigned int virt_irq)
+@@ -754,8 +741,7 @@
+
+ desc = irq_desc + virt_irq;
+
+- if (!(desc->status & IRQ_DISABLED))
+- desc->handle_irq(virt_irq, desc);
++ desc->handle_irq(virt_irq, desc);
+
+ bucket_pa = next_pa;
+ }
+@@ -792,6 +778,69 @@
+ local_irq_restore(flags);
+ }
+
++static void unhandled_perf_irq(struct pt_regs *regs)
++{
++ unsigned long pcr, pic;
++
++ read_pcr(pcr);
++ read_pic(pic);
++
++ write_pcr(0);
++
++ printk(KERN_EMERG "CPU %d: Got unexpected perf counter IRQ.\n",
++ smp_processor_id());
++ printk(KERN_EMERG "CPU %d: PCR[%016lx] PIC[%016lx]\n",
++ smp_processor_id(), pcr, pic);
++}
++
++/* Almost a direct copy of the powerpc PMC code. */
++static DEFINE_SPINLOCK(perf_irq_lock);
++static void *perf_irq_owner_caller; /* mostly for debugging */
++static void (*perf_irq)(struct pt_regs *regs) = unhandled_perf_irq;
++
++/* Invoked from level 15 PIL handler in trap table. */
++void perfctr_irq(int irq, struct pt_regs *regs)
++{
++ clear_softint(1 << irq);
++ perf_irq(regs);
++}
++
++int register_perfctr_intr(void (*handler)(struct pt_regs *))
++{
++ int ret;
++
++ if (!handler)
++ return -EINVAL;
++
++ spin_lock(&perf_irq_lock);
++ if (perf_irq != unhandled_perf_irq) {
++ printk(KERN_WARNING "register_perfctr_intr: "
++ "perf IRQ busy (reserved by caller %p)\n",
++ perf_irq_owner_caller);
++ ret = -EBUSY;
++ goto out;
++ }
++
++ perf_irq_owner_caller = __builtin_return_address(0);
++ perf_irq = handler;
++
++ ret = 0;
++out:
++ spin_unlock(&perf_irq_lock);
++
++ return ret;
++}
++EXPORT_SYMBOL_GPL(register_perfctr_intr);
++
++void release_perfctr_intr(void (*handler)(struct pt_regs *))
++{
++ spin_lock(&perf_irq_lock);
++ perf_irq_owner_caller = NULL;
++ perf_irq = unhandled_perf_irq;
++ spin_unlock(&perf_irq_lock);
++}
++EXPORT_SYMBOL_GPL(release_perfctr_intr);
++
+ #ifdef CONFIG_HOTPLUG_CPU
+ void fixup_irqs(void)
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/kernel/kernel.h linux-2.6.29-rc3.owrt/arch/sparc/kernel/kernel.h
+--- linux-2.6.29.owrt/arch/sparc/kernel/kernel.h 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/kernel.h 2009-05-10 23:48:28.000000000 +0200
+@@ -5,7 +5,6 @@
+
+ /* cpu.c */
+ extern const char *sparc_cpu_type;
+-extern const char *sparc_pmu_type;
+ extern const char *sparc_fpu_type;
+
+ extern unsigned int fsr_storage;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/kernel/kgdb_64.c linux-2.6.29-rc3.owrt/arch/sparc/kernel/kgdb_64.c
+--- linux-2.6.29.owrt/arch/sparc/kernel/kgdb_64.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/kgdb_64.c 2009-05-10 23:48:28.000000000 +0200
+@@ -108,7 +108,7 @@
+ }
+
+ #ifdef CONFIG_SMP
+-void smp_kgdb_capture_client(int irq, struct pt_regs *regs)
++void smp_kgdb_capture_client(struct pt_regs *regs)
+ {
+ unsigned long flags;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/kernel/Makefile linux-2.6.29-rc3.owrt/arch/sparc/kernel/Makefile
+--- linux-2.6.29.owrt/arch/sparc/kernel/Makefile 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/Makefile 2009-05-10 23:48:28.000000000 +0200
+@@ -52,8 +52,6 @@
+ obj-$(CONFIG_SPARC64) += hvapi.o
+ obj-$(CONFIG_SPARC64) += sstate.o
+ obj-$(CONFIG_SPARC64) += mdesc.o
+-obj-$(CONFIG_SPARC64) += pcr.o
+-obj-$(CONFIG_SPARC64) += nmi.o
+
+ # sparc32 do not use GENERIC_HARDIRQS but uses the generic devres implementation
+ obj-$(CONFIG_SPARC32) += devres.o
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/kernel/nmi.c linux-2.6.29-rc3.owrt/arch/sparc/kernel/nmi.c
+--- linux-2.6.29.owrt/arch/sparc/kernel/nmi.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/nmi.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,225 +0,0 @@
+-/* Pseudo NMI support on sparc64 systems.
+- *
+- * Copyright (C) 2009 David S. Miller <davem@davemloft.net>
+- *
+- * The NMI watchdog support and infrastructure is based almost
+- * entirely upon the x86 NMI support code.
+- */
+-#include <linux/kernel.h>
+-#include <linux/param.h>
+-#include <linux/init.h>
+-#include <linux/percpu.h>
+-#include <linux/nmi.h>
+-#include <linux/module.h>
+-#include <linux/kprobes.h>
+-#include <linux/kernel_stat.h>
+-#include <linux/slab.h>
+-#include <linux/kdebug.h>
+-#include <linux/delay.h>
+-#include <linux/smp.h>
+-
+-#include <asm/ptrace.h>
+-#include <asm/local.h>
+-#include <asm/pcr.h>
+-
+-/* We don't have a real NMI on sparc64, but we can fake one
+- * up using profiling counter overflow interrupts and interrupt
+- * levels.
+- *
+- * The profile overflow interrupts at level 15, so we use
+- * level 14 as our IRQ off level.
+- */
+-
+-static int nmi_watchdog_active;
+-static int panic_on_timeout;
+-
+-int nmi_usable;
+-EXPORT_SYMBOL_GPL(nmi_usable);
+-
+-static unsigned int nmi_hz = HZ;
+-
+-static DEFINE_PER_CPU(unsigned int, last_irq_sum);
+-static DEFINE_PER_CPU(local_t, alert_counter);
+-static DEFINE_PER_CPU(int, nmi_touch);
+-
+-void touch_nmi_watchdog(void)
+-{
+- if (nmi_watchdog_active) {
+- int cpu;
+-
+- for_each_present_cpu(cpu) {
+- if (per_cpu(nmi_touch, cpu) != 1)
+- per_cpu(nmi_touch, cpu) = 1;
+- }
+- }
+-
+- touch_softlockup_watchdog();
+-}
+-EXPORT_SYMBOL(touch_nmi_watchdog);
+-
+-static void die_nmi(const char *str, struct pt_regs *regs, int do_panic)
+-{
+- if (notify_die(DIE_NMIWATCHDOG, str, regs, 0,
+- pt_regs_trap_type(regs), SIGINT) == NOTIFY_STOP)
+- return;
+-
+- console_verbose();
+- bust_spinlocks(1);
+-
+- printk(KERN_EMERG "%s", str);
+- printk(" on CPU%d, ip %08lx, registers:\n",
+- smp_processor_id(), regs->tpc);
+- show_regs(regs);
+- dump_stack();
+-
+- bust_spinlocks(0);
+-
+- if (do_panic || panic_on_oops)
+- panic("Non maskable interrupt");
+-
+- local_irq_enable();
+- do_exit(SIGBUS);
+-}
+-
+-notrace __kprobes void perfctr_irq(int irq, struct pt_regs *regs)
+-{
+- unsigned int sum, touched = 0;
+- int cpu = smp_processor_id();
+-
+- clear_softint(1 << irq);
+- pcr_ops->write(PCR_PIC_PRIV);
+-
+- local_cpu_data().__nmi_count++;
+-
+- if (notify_die(DIE_NMI, "nmi", regs, 0,
+- pt_regs_trap_type(regs), SIGINT) == NOTIFY_STOP)
+- touched = 1;
+-
+- sum = kstat_irqs_cpu(0, cpu);
+- if (__get_cpu_var(nmi_touch)) {
+- __get_cpu_var(nmi_touch) = 0;
+- touched = 1;
+- }
+- if (!touched && __get_cpu_var(last_irq_sum) == sum) {
+- local_inc(&__get_cpu_var(alert_counter));
+- if (local_read(&__get_cpu_var(alert_counter)) == 5 * nmi_hz)
+- die_nmi("BUG: NMI Watchdog detected LOCKUP",
+- regs, panic_on_timeout);
+- } else {
+- __get_cpu_var(last_irq_sum) = sum;
+- local_set(&__get_cpu_var(alert_counter), 0);
+- }
+- if (nmi_usable) {
+- write_pic(picl_value(nmi_hz));
+- pcr_ops->write(pcr_enable);
+- }
+-}
+-
+-static inline unsigned int get_nmi_count(int cpu)
+-{
+- return cpu_data(cpu).__nmi_count;
+-}
+-
+-static int endflag __initdata;
+-
+-static __init void nmi_cpu_busy(void *data)
+-{
+- local_irq_enable_in_hardirq();
+- while (endflag == 0)
+- mb();
+-}
+-
+-static void report_broken_nmi(int cpu, int *prev_nmi_count)
+-{
+- printk(KERN_CONT "\n");
+-
+- printk(KERN_WARNING
+- "WARNING: CPU#%d: NMI appears to be stuck (%d->%d)!\n",
+- cpu, prev_nmi_count[cpu], get_nmi_count(cpu));
+-
+- printk(KERN_WARNING
+- "Please report this to bugzilla.kernel.org,\n");
+- printk(KERN_WARNING
+- "and attach the output of the 'dmesg' command.\n");
+-
+- nmi_usable = 0;
+-}
+-
+-static void stop_watchdog(void *unused)
+-{
+- pcr_ops->write(PCR_PIC_PRIV);
+-}
+-
+-static int __init check_nmi_watchdog(void)
+-{
+- unsigned int *prev_nmi_count;
+- int cpu, err;
+-
+- prev_nmi_count = kmalloc(nr_cpu_ids * sizeof(unsigned int), GFP_KERNEL);
+- if (!prev_nmi_count) {
+- err = -ENOMEM;
+- goto error;
+- }
+-
+- printk(KERN_INFO "Testing NMI watchdog ... ");
+-
+- smp_call_function(nmi_cpu_busy, (void *)&endflag, 0);
+-
+- for_each_possible_cpu(cpu)
+- prev_nmi_count[cpu] = get_nmi_count(cpu);
+- local_irq_enable();
+- mdelay((20 * 1000) / nmi_hz); /* wait 20 ticks */
+-
+- for_each_online_cpu(cpu) {
+- if (get_nmi_count(cpu) - prev_nmi_count[cpu] <= 5)
+- report_broken_nmi(cpu, prev_nmi_count);
+- }
+- endflag = 1;
+- if (!nmi_usable) {
+- kfree(prev_nmi_count);
+- err = -ENODEV;
+- goto error;
+- }
+- printk("OK.\n");
+-
+- nmi_hz = 1;
+-
+- kfree(prev_nmi_count);
+- return 0;
+-error:
+- on_each_cpu(stop_watchdog, NULL, 1);
+- return err;
+-}
+-
+-static void start_watchdog(void *unused)
+-{
+- pcr_ops->write(PCR_PIC_PRIV);
+- write_pic(picl_value(nmi_hz));
+-
+- pcr_ops->write(pcr_enable);
+-}
+-
+-void nmi_adjust_hz(unsigned int new_hz)
+-{
+- nmi_hz = new_hz;
+- on_each_cpu(start_watchdog, NULL, 1);
+-}
+-EXPORT_SYMBOL_GPL(nmi_adjust_hz);
+-
+-int __init nmi_init(void)
+-{
+- nmi_usable = 1;
+-
+- on_each_cpu(start_watchdog, NULL, 1);
+-
+- return check_nmi_watchdog();
+-}
+-
+-static int __init setup_nmi_watchdog(char *str)
+-{
+- if (!strncmp(str, "panic", 5))
+- panic_on_timeout = 1;
+-
+- return 0;
+-}
+-__setup("nmi_watchdog=", setup_nmi_watchdog);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/kernel/pci_common.c linux-2.6.29-rc3.owrt/arch/sparc/kernel/pci_common.c
+--- linux-2.6.29.owrt/arch/sparc/kernel/pci_common.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/pci_common.c 2009-05-10 23:48:28.000000000 +0200
+@@ -368,7 +368,7 @@
+ const u32 *vdma = of_get_property(pbm->op->node, "virtual-dma", NULL);
+
+ if (vdma) {
+- struct resource *rp = kzalloc(sizeof(*rp), GFP_KERNEL);
++ struct resource *rp = kmalloc(sizeof(*rp), GFP_KERNEL);
+
+ if (!rp) {
+ prom_printf("Cannot allocate IOMMU resource.\n");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/kernel/pcr.c linux-2.6.29-rc3.owrt/arch/sparc/kernel/pcr.c
+--- linux-2.6.29.owrt/arch/sparc/kernel/pcr.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/pcr.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,158 +0,0 @@
+-/* pcr.c: Generic sparc64 performance counter infrastructure.
+- *
+- * Copyright (C) 2009 David S. Miller (davem@davemloft.net)
+- */
+-#include <linux/kernel.h>
+-#include <linux/module.h>
+-#include <linux/init.h>
+-#include <linux/irq.h>
+-
+-#include <asm/pil.h>
+-#include <asm/pcr.h>
+-#include <asm/nmi.h>
+-
+-/* This code is shared between various users of the performance
+- * counters. Users will be oprofile, pseudo-NMI watchdog, and the
+- * perf_counter support layer.
+- */
+-
+-#define PCR_SUN4U_ENABLE (PCR_PIC_PRIV | PCR_STRACE | PCR_UTRACE)
+-#define PCR_N2_ENABLE (PCR_PIC_PRIV | PCR_STRACE | PCR_UTRACE | \
+- PCR_N2_TOE_OV1 | \
+- (2 << PCR_N2_SL1_SHIFT) | \
+- (0xff << PCR_N2_MASK1_SHIFT))
+-
+-u64 pcr_enable;
+-unsigned int picl_shift;
+-
+-/* Performance counter interrupts run unmasked at PIL level 15.
+- * Therefore we can't do things like wakeups and other work
+- * that expects IRQ disabling to be adhered to in locking etc.
+- *
+- * Therefore in such situations we defer the work by signalling
+- * a lower level cpu IRQ.
+- */
+-void deferred_pcr_work_irq(int irq, struct pt_regs *regs)
+-{
+- clear_softint(1 << PIL_DEFERRED_PCR_WORK);
+-}
+-
+-void schedule_deferred_pcr_work(void)
+-{
+- set_softint(1 << PIL_DEFERRED_PCR_WORK);
+-}
+-
+-const struct pcr_ops *pcr_ops;
+-EXPORT_SYMBOL_GPL(pcr_ops);
+-
+-static u64 direct_pcr_read(void)
+-{
+- u64 val;
+-
+- read_pcr(val);
+- return val;
+-}
+-
+-static void direct_pcr_write(u64 val)
+-{
+- write_pcr(val);
+-}
+-
+-static const struct pcr_ops direct_pcr_ops = {
+- .read = direct_pcr_read,
+- .write = direct_pcr_write,
+-};
+-
+-static void n2_pcr_write(u64 val)
+-{
+- unsigned long ret;
+-
+- ret = sun4v_niagara2_setperf(HV_N2_PERF_SPARC_CTL, val);
+- if (val != HV_EOK)
+- write_pcr(val);
+-}
+-
+-static const struct pcr_ops n2_pcr_ops = {
+- .read = direct_pcr_read,
+- .write = n2_pcr_write,
+-};
+-
+-static unsigned long perf_hsvc_group;
+-static unsigned long perf_hsvc_major;
+-static unsigned long perf_hsvc_minor;
+-
+-static int __init register_perf_hsvc(void)
+-{
+- if (tlb_type == hypervisor) {
+- switch (sun4v_chip_type) {
+- case SUN4V_CHIP_NIAGARA1:
+- perf_hsvc_group = HV_GRP_NIAG_PERF;
+- break;
+-
+- case SUN4V_CHIP_NIAGARA2:
+- perf_hsvc_group = HV_GRP_N2_CPU;
+- break;
+-
+- default:
+- return -ENODEV;
+- }
+-
+-
+- perf_hsvc_major = 1;
+- perf_hsvc_minor = 0;
+- if (sun4v_hvapi_register(perf_hsvc_group,
+- perf_hsvc_major,
+- &perf_hsvc_minor)) {
+- printk("perfmon: Could not register hvapi.\n");
+- return -ENODEV;
+- }
+- }
+- return 0;
+-}
+-
+-static void __init unregister_perf_hsvc(void)
+-{
+- if (tlb_type != hypervisor)
+- return;
+- sun4v_hvapi_unregister(perf_hsvc_group);
+-}
+-
+-int __init pcr_arch_init(void)
+-{
+- int err = register_perf_hsvc();
+-
+- if (err)
+- return err;
+-
+- switch (tlb_type) {
+- case hypervisor:
+- pcr_ops = &n2_pcr_ops;
+- pcr_enable = PCR_N2_ENABLE;
+- picl_shift = 2;
+- break;
+-
+- case cheetah:
+- case cheetah_plus:
+- pcr_ops = &direct_pcr_ops;
+- pcr_enable = PCR_SUN4U_ENABLE;
+- break;
+-
+- case spitfire:
+- /* UltraSPARC-I/II and derivatives lack a profile
+- * counter overflow interrupt so we can't make use of
+- * their hardware currently.
+- */
+- /* fallthrough */
+- default:
+- err = -ENODEV;
+- goto out_unregister;
+- }
+-
+- return nmi_init();
+-
+-out_unregister:
+- unregister_perf_hsvc();
+- return err;
+-}
+-
+-arch_initcall(pcr_arch_init);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/kernel/process_64.c linux-2.6.29-rc3.owrt/arch/sparc/kernel/process_64.c
+--- linux-2.6.29.owrt/arch/sparc/kernel/process_64.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/process_64.c 2009-05-10 23:48:28.000000000 +0200
+@@ -29,7 +29,6 @@
+ #include <linux/cpu.h>
+ #include <linux/elfcore.h>
+ #include <linux/sysrq.h>
+-#include <linux/nmi.h>
+
+ #include <asm/uaccess.h>
+ #include <asm/system.h>
+@@ -53,10 +52,8 @@
+
+ static void sparc64_yield(int cpu)
+ {
+- if (tlb_type != hypervisor) {
+- touch_nmi_watchdog();
++ if (tlb_type != hypervisor)
+ return;
+- }
+
+ clear_thread_flag(TIF_POLLING_NRFLAG);
+ smp_mb__after_clear_bit();
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/kernel/setup_64.c linux-2.6.29-rc3.owrt/arch/sparc/kernel/setup_64.c
+--- linux-2.6.29.owrt/arch/sparc/kernel/setup_64.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/setup_64.c 2009-05-10 23:48:28.000000000 +0200
+@@ -354,7 +354,6 @@
+ seq_printf(m,
+ "cpu\t\t: %s\n"
+ "fpu\t\t: %s\n"
+- "pmu\t\t: %s\n"
+ "prom\t\t: %s\n"
+ "type\t\t: %s\n"
+ "ncpus probed\t: %d\n"
+@@ -367,7 +366,6 @@
+ ,
+ sparc_cpu_type,
+ sparc_fpu_type,
+- sparc_pmu_type,
+ prom_version,
+ ((tlb_type == hypervisor) ?
+ "sun4v" :
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/kernel/ttable.S linux-2.6.29-rc3.owrt/arch/sparc/kernel/ttable.S
+--- linux-2.6.29.owrt/arch/sparc/kernel/ttable.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/kernel/ttable.S 2009-05-10 23:48:28.000000000 +0200
+@@ -63,13 +63,7 @@
+ #else
+ tl0_irq6: BTRAP(0x46)
+ #endif
+-tl0_irq7: TRAP_IRQ(deferred_pcr_work_irq, 7)
+-#ifdef CONFIG_KGDB
+-tl0_irq8: TRAP_IRQ(smp_kgdb_capture_client, 8)
+-#else
+-tl0_irq8: BTRAP(0x48)
+-#endif
+-tl0_irq9: BTRAP(0x49)
++tl0_irq7: BTRAP(0x47) BTRAP(0x48) BTRAP(0x49)
+ tl0_irq10: BTRAP(0x4a) BTRAP(0x4b) BTRAP(0x4c) BTRAP(0x4d)
+ tl0_irq14: TRAP_IRQ(timer_interrupt, 14)
+ tl0_irq15: TRAP_NMI_IRQ(perfctr_irq, 15)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/lib/bzero.S linux-2.6.29-rc3.owrt/arch/sparc/lib/bzero.S
+--- linux-2.6.29.owrt/arch/sparc/lib/bzero.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/lib/bzero.S 2009-05-10 23:48:28.000000000 +0200
+@@ -88,9 +88,13 @@
+
+ #define EX_ST(x,y) \
+ 98: x,y; \
++ .section .fixup; \
++ .align 4; \
++99: retl; \
++ mov %o1, %o0; \
+ .section __ex_table,"a";\
+ .align 4; \
+- .word 98b, __retl_o1; \
++ .word 98b, 99b; \
+ .text; \
+ .align 4;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/lib/copy_in_user.S linux-2.6.29-rc3.owrt/arch/sparc/lib/copy_in_user.S
+--- linux-2.6.29.owrt/arch/sparc/lib/copy_in_user.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/lib/copy_in_user.S 2009-05-10 23:48:28.000000000 +0200
+@@ -3,16 +3,19 @@
+ * Copyright (C) 1999, 2000, 2004 David S. Miller (davem@redhat.com)
+ */
+
+-#include <linux/linkage.h>
+ #include <asm/asi.h>
+
+ #define XCC xcc
+
+ #define EX(x,y) \
+ 98: x,y; \
++ .section .fixup; \
++ .align 4; \
++99: retl; \
++ mov 1, %o0; \
+ .section __ex_table,"a";\
+ .align 4; \
+- .word 98b, __retl_one; \
++ .word 98b, 99b; \
+ .text; \
+ .align 4;
+
+@@ -28,7 +31,18 @@
+ * to copy register windows around during thread cloning.
+ */
+
+-ENTRY(___copy_in_user) /* %o0=dst, %o1=src, %o2=len */
++ .globl ___copy_in_user
++ .type ___copy_in_user,#function
++___copy_in_user: /* %o0=dst, %o1=src, %o2=len */
++ /* Writing to %asi is _expensive_ so we hardcode it.
++ * Reading %asi to check for KERNEL_DS is comparatively
++ * cheap.
++ */
++ rd %asi, %g1
++ cmp %g1, ASI_AIUS
++ bne,pn %icc, memcpy_user_stub
++ nop
++
+ cmp %o2, 0
+ be,pn %XCC, 85f
+ or %o0, %o1, %o3
+@@ -39,24 +53,22 @@
+ /* 16 < len <= 64 */
+ andcc %o3, 0x7, %g0
+ bne,pn %XCC, 90f
+- nop
++ sub %o0, %o1, %o3
+
+ andn %o2, 0x7, %o4
+ and %o2, 0x7, %o2
+ 1: subcc %o4, 0x8, %o4
+ EX(ldxa [%o1] %asi, %o5)
+- EX(stxa %o5, [%o0] %asi)
+- add %o1, 0x8, %o1
++ EX(stxa %o5, [%o1 + %o3] ASI_AIUS)
+ bgu,pt %XCC, 1b
+- add %o0, 0x8, %o0
++ add %o1, 0x8, %o1
+ andcc %o2, 0x4, %g0
+ be,pt %XCC, 1f
+ nop
+ sub %o2, 0x4, %o2
+ EX(lduwa [%o1] %asi, %o5)
+- EX(stwa %o5, [%o0] %asi)
++ EX(stwa %o5, [%o1 + %o3] ASI_AIUS)
+ add %o1, 0x4, %o1
+- add %o0, 0x4, %o0
+ 1: cmp %o2, 0
+ be,pt %XCC, 85f
+ nop
+@@ -66,15 +78,14 @@
+ 80: /* 0 < len <= 16 */
+ andcc %o3, 0x3, %g0
+ bne,pn %XCC, 90f
+- nop
++ sub %o0, %o1, %o3
+
+ 82:
+ subcc %o2, 4, %o2
+ EX(lduwa [%o1] %asi, %g1)
+- EX(stwa %g1, [%o0] %asi)
+- add %o1, 4, %o1
++ EX(stwa %g1, [%o1 + %o3] ASI_AIUS)
+ bgu,pt %XCC, 82b
+- add %o0, 4, %o0
++ add %o1, 4, %o1
+
+ 85: retl
+ clr %o0
+@@ -83,10 +94,26 @@
+ 90:
+ subcc %o2, 1, %o2
+ EX(lduba [%o1] %asi, %g1)
+- EX(stba %g1, [%o0] %asi)
+- add %o1, 1, %o1
++ EX(stba %g1, [%o1 + %o3] ASI_AIUS)
+ bgu,pt %XCC, 90b
+- add %o0, 1, %o0
++ add %o1, 1, %o1
+ retl
+ clr %o0
+-ENDPROC(___copy_in_user)
++
++ .size ___copy_in_user, .-___copy_in_user
++
++ /* Act like copy_{to,in}_user(), ie. return zero instead
++ * of original destination pointer. This is invoked when
++ * copy_{to,in}_user() finds that %asi is kernel space.
++ */
++ .globl memcpy_user_stub
++ .type memcpy_user_stub,#function
++memcpy_user_stub:
++ save %sp, -192, %sp
++ mov %i0, %o0
++ mov %i1, %o1
++ call memcpy
++ mov %i2, %o2
++ ret
++ restore %g0, %g0, %o0
++ .size memcpy_user_stub, .-memcpy_user_stub
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/lib/GENbzero.S linux-2.6.29-rc3.owrt/arch/sparc/lib/GENbzero.S
+--- linux-2.6.29.owrt/arch/sparc/lib/GENbzero.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/lib/GENbzero.S 2009-05-10 23:48:28.000000000 +0200
+@@ -6,9 +6,13 @@
+
+ #define EX_ST(x,y) \
+ 98: x,y; \
++ .section .fixup; \
++ .align 4; \
++99: retl; \
++ mov %o1, %o0; \
+ .section __ex_table,"a";\
+ .align 4; \
+- .word 98b, __retl_o1; \
++ .word 98b, 99b; \
+ .text; \
+ .align 4;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/lib/GENcopy_from_user.S linux-2.6.29-rc3.owrt/arch/sparc/lib/GENcopy_from_user.S
+--- linux-2.6.29.owrt/arch/sparc/lib/GENcopy_from_user.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/lib/GENcopy_from_user.S 2009-05-10 23:48:28.000000000 +0200
+@@ -5,9 +5,13 @@
+
+ #define EX_LD(x) \
+ 98: x; \
++ .section .fixup; \
++ .align 4; \
++99: retl; \
++ mov 1, %o0; \
+ .section __ex_table,"a";\
+ .align 4; \
+- .word 98b, __retl_one; \
++ .word 98b, 99b; \
+ .text; \
+ .align 4;
+
+@@ -23,7 +27,7 @@
+ #define PREAMBLE \
+ rd %asi, %g1; \
+ cmp %g1, ASI_AIUS; \
+- bne,pn %icc, ___copy_in_user; \
++ bne,pn %icc, memcpy_user_stub; \
+ nop
+ #endif
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/lib/GENcopy_to_user.S linux-2.6.29-rc3.owrt/arch/sparc/lib/GENcopy_to_user.S
+--- linux-2.6.29.owrt/arch/sparc/lib/GENcopy_to_user.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/lib/GENcopy_to_user.S 2009-05-10 23:48:28.000000000 +0200
+@@ -5,9 +5,13 @@
+
+ #define EX_ST(x) \
+ 98: x; \
++ .section .fixup; \
++ .align 4; \
++99: retl; \
++ mov 1, %o0; \
+ .section __ex_table,"a";\
+ .align 4; \
+- .word 98b, __retl_one; \
++ .word 98b, 99b; \
+ .text; \
+ .align 4;
+
+@@ -27,7 +31,7 @@
+ #define PREAMBLE \
+ rd %asi, %g1; \
+ cmp %g1, ASI_AIUS; \
+- bne,pn %icc, ___copy_in_user; \
++ bne,pn %icc, memcpy_user_stub; \
+ nop
+ #endif
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/lib/NG2copy_from_user.S linux-2.6.29-rc3.owrt/arch/sparc/lib/NG2copy_from_user.S
+--- linux-2.6.29.owrt/arch/sparc/lib/NG2copy_from_user.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/lib/NG2copy_from_user.S 2009-05-10 23:48:28.000000000 +0200
+@@ -5,9 +5,14 @@
+
+ #define EX_LD(x) \
+ 98: x; \
++ .section .fixup; \
++ .align 4; \
++99: wr %g0, ASI_AIUS, %asi;\
++ retl; \
++ mov 1, %o0; \
+ .section __ex_table,"a";\
+ .align 4; \
+- .word 98b, __retl_one_asi;\
++ .word 98b, 99b; \
+ .text; \
+ .align 4;
+
+@@ -28,7 +33,7 @@
+ #define PREAMBLE \
+ rd %asi, %g1; \
+ cmp %g1, ASI_AIUS; \
+- bne,pn %icc, ___copy_in_user; \
++ bne,pn %icc, memcpy_user_stub; \
+ nop
+ #endif
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/lib/NG2copy_to_user.S linux-2.6.29-rc3.owrt/arch/sparc/lib/NG2copy_to_user.S
+--- linux-2.6.29.owrt/arch/sparc/lib/NG2copy_to_user.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/lib/NG2copy_to_user.S 2009-05-10 23:48:28.000000000 +0200
+@@ -5,9 +5,14 @@
+
+ #define EX_ST(x) \
+ 98: x; \
++ .section .fixup; \
++ .align 4; \
++99: wr %g0, ASI_AIUS, %asi;\
++ retl; \
++ mov 1, %o0; \
+ .section __ex_table,"a";\
+ .align 4; \
+- .word 98b, __retl_one_asi;\
++ .word 98b, 99b; \
+ .text; \
+ .align 4;
+
+@@ -37,7 +42,7 @@
+ #define PREAMBLE \
+ rd %asi, %g1; \
+ cmp %g1, ASI_AIUS; \
+- bne,pn %icc, ___copy_in_user; \
++ bne,pn %icc, memcpy_user_stub; \
+ nop
+ #endif
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/lib/NGbzero.S linux-2.6.29-rc3.owrt/arch/sparc/lib/NGbzero.S
+--- linux-2.6.29.owrt/arch/sparc/lib/NGbzero.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/lib/NGbzero.S 2009-05-10 23:48:28.000000000 +0200
+@@ -6,9 +6,13 @@
+
+ #define EX_ST(x,y) \
+ 98: x,y; \
++ .section .fixup; \
++ .align 4; \
++99: retl; \
++ mov %o1, %o0; \
+ .section __ex_table,"a";\
+ .align 4; \
+- .word 98b, __retl_o1; \
++ .word 98b, 99b; \
+ .text; \
+ .align 4;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/lib/NGcopy_from_user.S linux-2.6.29-rc3.owrt/arch/sparc/lib/NGcopy_from_user.S
+--- linux-2.6.29.owrt/arch/sparc/lib/NGcopy_from_user.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/lib/NGcopy_from_user.S 2009-05-10 23:48:28.000000000 +0200
+@@ -5,9 +5,14 @@
+
+ #define EX_LD(x) \
+ 98: x; \
++ .section .fixup; \
++ .align 4; \
++99: wr %g0, ASI_AIUS, %asi;\
++ ret; \
++ restore %g0, 1, %o0; \
+ .section __ex_table,"a";\
+ .align 4; \
+- .word 98b, __ret_one_asi;\
++ .word 98b, 99b; \
+ .text; \
+ .align 4;
+
+@@ -25,7 +30,7 @@
+ #define PREAMBLE \
+ rd %asi, %g1; \
+ cmp %g1, ASI_AIUS; \
+- bne,pn %icc, ___copy_in_user; \
++ bne,pn %icc, memcpy_user_stub; \
+ nop
+ #endif
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/lib/NGcopy_to_user.S linux-2.6.29-rc3.owrt/arch/sparc/lib/NGcopy_to_user.S
+--- linux-2.6.29.owrt/arch/sparc/lib/NGcopy_to_user.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/lib/NGcopy_to_user.S 2009-05-10 23:48:28.000000000 +0200
+@@ -5,9 +5,14 @@
+
+ #define EX_ST(x) \
+ 98: x; \
++ .section .fixup; \
++ .align 4; \
++99: wr %g0, ASI_AIUS, %asi;\
++ ret; \
++ restore %g0, 1, %o0; \
+ .section __ex_table,"a";\
+ .align 4; \
+- .word 98b, __ret_one_asi;\
++ .word 98b, 99b; \
+ .text; \
+ .align 4;
+
+@@ -28,7 +33,7 @@
+ #define PREAMBLE \
+ rd %asi, %g1; \
+ cmp %g1, ASI_AIUS; \
+- bne,pn %icc, ___copy_in_user; \
++ bne,pn %icc, memcpy_user_stub; \
+ nop
+ #endif
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/lib/U1copy_from_user.S linux-2.6.29-rc3.owrt/arch/sparc/lib/U1copy_from_user.S
+--- linux-2.6.29.owrt/arch/sparc/lib/U1copy_from_user.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/lib/U1copy_from_user.S 2009-05-10 23:48:28.000000000 +0200
+@@ -5,9 +5,13 @@
+
+ #define EX_LD(x) \
+ 98: x; \
++ .section .fixup; \
++ .align 4; \
++99: retl; \
++ mov 1, %o0; \
+ .section __ex_table,"a";\
+ .align 4; \
+- .word 98b, __retl_one; \
++ .word 98b, 99b; \
+ .text; \
+ .align 4;
+
+@@ -23,7 +27,7 @@
+ #define PREAMBLE \
+ rd %asi, %g1; \
+ cmp %g1, ASI_AIUS; \
+- bne,pn %icc, ___copy_in_user; \
++ bne,pn %icc, memcpy_user_stub; \
+ nop; \
+
+ #include "U1memcpy.S"
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/lib/U1copy_to_user.S linux-2.6.29-rc3.owrt/arch/sparc/lib/U1copy_to_user.S
+--- linux-2.6.29.owrt/arch/sparc/lib/U1copy_to_user.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/lib/U1copy_to_user.S 2009-05-10 23:48:28.000000000 +0200
+@@ -5,9 +5,13 @@
+
+ #define EX_ST(x) \
+ 98: x; \
++ .section .fixup; \
++ .align 4; \
++99: retl; \
++ mov 1, %o0; \
+ .section __ex_table,"a";\
+ .align 4; \
+- .word 98b, __retl_one; \
++ .word 98b, 99b; \
+ .text; \
+ .align 4;
+
+@@ -23,7 +27,7 @@
+ #define PREAMBLE \
+ rd %asi, %g1; \
+ cmp %g1, ASI_AIUS; \
+- bne,pn %icc, ___copy_in_user; \
++ bne,pn %icc, memcpy_user_stub; \
+ nop; \
+
+ #include "U1memcpy.S"
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/lib/U3copy_from_user.S linux-2.6.29-rc3.owrt/arch/sparc/lib/U3copy_from_user.S
+--- linux-2.6.29.owrt/arch/sparc/lib/U3copy_from_user.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/lib/U3copy_from_user.S 2009-05-10 23:48:28.000000000 +0200
+@@ -5,9 +5,13 @@
+
+ #define EX_LD(x) \
+ 98: x; \
++ .section .fixup; \
++ .align 4; \
++99: retl; \
++ mov 1, %o0; \
+ .section __ex_table,"a";\
+ .align 4; \
+- .word 98b, __retl_one; \
++ .word 98b, 99b; \
+ .text; \
+ .align 4;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/lib/U3copy_to_user.S linux-2.6.29-rc3.owrt/arch/sparc/lib/U3copy_to_user.S
+--- linux-2.6.29.owrt/arch/sparc/lib/U3copy_to_user.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/lib/U3copy_to_user.S 2009-05-10 23:48:28.000000000 +0200
+@@ -5,9 +5,13 @@
+
+ #define EX_ST(x) \
+ 98: x; \
++ .section .fixup; \
++ .align 4; \
++99: retl; \
++ mov 1, %o0; \
+ .section __ex_table,"a";\
+ .align 4; \
+- .word 98b, __retl_one; \
++ .word 98b, 99b; \
+ .text; \
+ .align 4;
+
+@@ -23,7 +27,7 @@
+ #define PREAMBLE \
+ rd %asi, %g1; \
+ cmp %g1, ASI_AIUS; \
+- bne,pn %icc, ___copy_in_user; \
++ bne,pn %icc, memcpy_user_stub; \
+ nop; \
+
+ #include "U3memcpy.S"
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/mm/fault_64.c linux-2.6.29-rc3.owrt/arch/sparc/mm/fault_64.c
+--- linux-2.6.29.owrt/arch/sparc/mm/fault_64.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/mm/fault_64.c 2009-05-10 23:48:28.000000000 +0200
+@@ -19,7 +19,6 @@
+ #include <linux/interrupt.h>
+ #include <linux/kprobes.h>
+ #include <linux/kdebug.h>
+-#include <linux/percpu.h>
+
+ #include <asm/page.h>
+ #include <asm/pgtable.h>
+@@ -225,30 +224,6 @@
+ unhandled_fault (address, current, regs);
+ }
+
+-static void noinline bogus_32bit_fault_tpc(struct pt_regs *regs)
+-{
+- static int times;
+-
+- if (times++ < 10)
+- printk(KERN_ERR "FAULT[%s:%d]: 32-bit process reports "
+- "64-bit TPC [%lx]\n",
+- current->comm, current->pid,
+- regs->tpc);
+- show_regs(regs);
+-}
+-
+-static void noinline bogus_32bit_fault_address(struct pt_regs *regs,
+- unsigned long addr)
+-{
+- static int times;
+-
+- if (times++ < 10)
+- printk(KERN_ERR "FAULT[%s:%d]: 32-bit process "
+- "reports 64-bit fault address [%lx]\n",
+- current->comm, current->pid, addr);
+- show_regs(regs);
+-}
+-
+ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs)
+ {
+ struct mm_struct *mm = current->mm;
+@@ -269,19 +244,6 @@
+ (fault_code & FAULT_CODE_DTLB))
+ BUG();
+
+- if (test_thread_flag(TIF_32BIT)) {
+- if (!(regs->tstate & TSTATE_PRIV)) {
+- if (unlikely((regs->tpc >> 32) != 0)) {
+- bogus_32bit_fault_tpc(regs);
+- goto intr_or_no_mm;
+- }
+- }
+- if (unlikely((address >> 32) != 0)) {
+- bogus_32bit_fault_address(regs, address);
+- goto intr_or_no_mm;
+- }
+- }
+-
+ if (regs->tstate & TSTATE_PRIV) {
+ unsigned long tpc = regs->tpc;
+
+@@ -302,6 +264,12 @@
+ if (in_atomic() || !mm)
+ goto intr_or_no_mm;
+
++ if (test_thread_flag(TIF_32BIT)) {
++ if (!(regs->tstate & TSTATE_PRIV))
++ regs->tpc &= 0xffffffff;
++ address &= 0xffffffff;
++ }
++
+ if (!down_read_trylock(&mm->mmap_sem)) {
+ if ((regs->tstate & TSTATE_PRIV) &&
+ !search_exception_tables(regs->tpc)) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/mm/ultra.S linux-2.6.29-rc3.owrt/arch/sparc/mm/ultra.S
+--- linux-2.6.29.owrt/arch/sparc/mm/ultra.S 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/mm/ultra.S 2009-05-10 23:48:28.000000000 +0200
+@@ -679,8 +679,28 @@
+ #ifdef CONFIG_KGDB
+ .globl xcall_kgdb_capture
+ xcall_kgdb_capture:
+- wr %g0, (1 << PIL_KGDB_CAPTURE), %set_softint
+- retry
++661: rdpr %pstate, %g2
++ wrpr %g2, PSTATE_IG | PSTATE_AG, %pstate
++ .section .sun4v_2insn_patch, "ax"
++ .word 661b
++ nop
++ nop
++ .previous
++
++ rdpr %pil, %g2
++ wrpr %g0, PIL_NORMAL_MAX, %pil
++ sethi %hi(109f), %g7
++ ba,pt %xcc, etrap_irq
++109: or %g7, %lo(109b), %g7
++#ifdef CONFIG_TRACE_IRQFLAGS
++ call trace_hardirqs_off
++ nop
++#endif
++ call smp_kgdb_capture_client
++ add %sp, PTREGS_OFF, %o0
++ /* Has to be a non-v9 branch due to the large distance. */
++ ba rtrap_xcall
++ ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
+ #endif
+
+ #endif /* CONFIG_SMP */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/sparc/oprofile/init.c linux-2.6.29-rc3.owrt/arch/sparc/oprofile/init.c
+--- linux-2.6.29.owrt/arch/sparc/oprofile/init.c 2009-05-10 22:04:40.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/sparc/oprofile/init.c 2009-05-10 23:48:28.000000000 +0200
+@@ -13,57 +13,217 @@
+ #include <linux/init.h>
+
+ #ifdef CONFIG_SPARC64
+-#include <linux/notifier.h>
+-#include <linux/rcupdate.h>
+-#include <linux/kdebug.h>
+-#include <asm/nmi.h>
+-
+-static int profile_timer_exceptions_notify(struct notifier_block *self,
+- unsigned long val, void *data)
+-{
+- struct die_args *args = (struct die_args *)data;
+- int ret = NOTIFY_DONE;
+-
+- switch (val) {
+- case DIE_NMI:
+- oprofile_add_sample(args->regs, 0);
+- ret = NOTIFY_STOP;
+- break;
+- default:
+- break;
+- }
+- return ret;
++#include <asm/hypervisor.h>
++#include <asm/spitfire.h>
++#include <asm/cpudata.h>
++#include <asm/irq.h>
++
++static int nmi_enabled;
++
++struct pcr_ops {
++ u64 (*read)(void);
++ void (*write)(u64);
++};
++static const struct pcr_ops *pcr_ops;
++
++static u64 direct_pcr_read(void)
++{
++ u64 val;
++
++ read_pcr(val);
++ return val;
++}
++
++static void direct_pcr_write(u64 val)
++{
++ write_pcr(val);
+ }
+
+-static struct notifier_block profile_timer_exceptions_nb = {
+- .notifier_call = profile_timer_exceptions_notify,
++static const struct pcr_ops direct_pcr_ops = {
++ .read = direct_pcr_read,
++ .write = direct_pcr_write,
+ };
+
+-static int timer_start(void)
++static void n2_pcr_write(u64 val)
+ {
+- if (register_die_notifier(&profile_timer_exceptions_nb))
+- return 1;
+- nmi_adjust_hz(HZ);
+- return 0;
++ unsigned long ret;
++
++ ret = sun4v_niagara2_setperf(HV_N2_PERF_SPARC_CTL, val);
++ if (val != HV_EOK)
++ write_pcr(val);
+ }
+
++static const struct pcr_ops n2_pcr_ops = {
++ .read = direct_pcr_read,
++ .write = n2_pcr_write,
++};
+
+-static void timer_stop(void)
++/* In order to commonize as much of the implementation as
++ * possible, we use PICH as our counter. Mostly this is
++ * to accomodate Niagara-1 which can only count insn cycles
++ * in PICH.
++ */
++static u64 picl_value(void)
++{
++ u32 delta = local_cpu_data().clock_tick / HZ;
++
++ return ((u64)((0 - delta) & 0xffffffff)) << 32;
++}
++
++#define PCR_PIC_PRIV 0x00000001 /* PIC access is privileged */
++#define PCR_STRACE 0x00000002 /* Trace supervisor events */
++#define PCR_UTRACE 0x00000004 /* Trace user events */
++#define PCR_N2_HTRACE 0x00000008 /* Trace hypervisor events */
++#define PCR_N2_TOE_OV0 0x00000010 /* Trap if PIC 0 overflows */
++#define PCR_N2_TOE_OV1 0x00000020 /* Trap if PIC 1 overflows */
++#define PCR_N2_MASK0 0x00003fc0
++#define PCR_N2_MASK0_SHIFT 6
++#define PCR_N2_SL0 0x0003c000
++#define PCR_N2_SL0_SHIFT 14
++#define PCR_N2_OV0 0x00040000
++#define PCR_N2_MASK1 0x07f80000
++#define PCR_N2_MASK1_SHIFT 19
++#define PCR_N2_SL1 0x78000000
++#define PCR_N2_SL1_SHIFT 27
++#define PCR_N2_OV1 0x80000000
++
++#define PCR_SUN4U_ENABLE (PCR_PIC_PRIV | PCR_STRACE | PCR_UTRACE)
++#define PCR_N2_ENABLE (PCR_PIC_PRIV | PCR_STRACE | PCR_UTRACE | \
++ PCR_N2_TOE_OV1 | \
++ (2 << PCR_N2_SL1_SHIFT) | \
++ (0xff << PCR_N2_MASK1_SHIFT))
++
++static u64 pcr_enable = PCR_SUN4U_ENABLE;
++
++static void nmi_handler(struct pt_regs *regs)
+ {
+- nmi_adjust_hz(1);
+- unregister_die_notifier(&profile_timer_exceptions_nb);
+- synchronize_sched(); /* Allow already-started NMIs to complete. */
++ pcr_ops->write(PCR_PIC_PRIV);
++
++ if (nmi_enabled) {
++ oprofile_add_sample(regs, 0);
++
++ write_pic(picl_value());
++ pcr_ops->write(pcr_enable);
++ }
++}
++
++/* We count "clock cycle" events in the lower 32-bit PIC.
++ * Then configure it such that it overflows every HZ, and thus
++ * generates a level 15 interrupt at that frequency.
++ */
++static void cpu_nmi_start(void *_unused)
++{
++ pcr_ops->write(PCR_PIC_PRIV);
++ write_pic(picl_value());
++
++ pcr_ops->write(pcr_enable);
++}
++
++static void cpu_nmi_stop(void *_unused)
++{
++ pcr_ops->write(PCR_PIC_PRIV);
++}
++
++static int nmi_start(void)
++{
++ int err = register_perfctr_intr(nmi_handler);
++
++ if (!err) {
++ nmi_enabled = 1;
++ wmb();
++ err = on_each_cpu(cpu_nmi_start, NULL, 1);
++ if (err) {
++ nmi_enabled = 0;
++ wmb();
++ on_each_cpu(cpu_nmi_stop, NULL, 1);
++ release_perfctr_intr(nmi_handler);
++ }
++ }
++
++ return err;
+ }
+
+-static int op_nmi_timer_init(struct oprofile_operations *ops)
++static void nmi_stop(void)
+ {
+- if (!nmi_usable)
++ nmi_enabled = 0;
++ wmb();
++
++ on_each_cpu(cpu_nmi_stop, NULL, 1);
++ release_perfctr_intr(nmi_handler);
++ synchronize_sched();
++}
++
++static unsigned long perf_hsvc_group;
++static unsigned long perf_hsvc_major;
++static unsigned long perf_hsvc_minor;
++
++static int __init register_perf_hsvc(void)
++{
++ if (tlb_type == hypervisor) {
++ switch (sun4v_chip_type) {
++ case SUN4V_CHIP_NIAGARA1:
++ perf_hsvc_group = HV_GRP_NIAG_PERF;
++ break;
++
++ case SUN4V_CHIP_NIAGARA2:
++ perf_hsvc_group = HV_GRP_N2_CPU;
++ break;
++
++ default:
++ return -ENODEV;
++ }
++
++
++ perf_hsvc_major = 1;
++ perf_hsvc_minor = 0;
++ if (sun4v_hvapi_register(perf_hsvc_group,
++ perf_hsvc_major,
++ &perf_hsvc_minor)) {
++ printk("perfmon: Could not register N2 hvapi.\n");
++ return -ENODEV;
++ }
++ }
++ return 0;
++}
++
++static void unregister_perf_hsvc(void)
++{
++ if (tlb_type != hypervisor)
++ return;
++ sun4v_hvapi_unregister(perf_hsvc_group);
++}
++
++static int oprofile_nmi_init(struct oprofile_operations *ops)
++{
++ int err = register_perf_hsvc();
++
++ if (err)
++ return err;
++
++ switch (tlb_type) {
++ case hypervisor:
++ pcr_ops = &n2_pcr_ops;
++ pcr_enable = PCR_N2_ENABLE;
++ break;
++
++ case cheetah:
++ case cheetah_plus:
++ pcr_ops = &direct_pcr_ops;
++ break;
++
++ default:
+ return -ENODEV;
++ }
+
+- ops->start = timer_start;
+- ops->stop = timer_stop;
++ ops->create_files = NULL;
++ ops->setup = NULL;
++ ops->shutdown = NULL;
++ ops->start = nmi_start;
++ ops->stop = nmi_stop;
+ ops->cpu_type = "timer";
+- printk(KERN_INFO "oprofile: Using perfctr NMI timer interrupt.\n");
++
++ printk(KERN_INFO "oprofile: Using perfctr based NMI timer interrupt.\n");
++
+ return 0;
+ }
+ #endif
+@@ -73,7 +233,7 @@
+ int ret = -ENODEV;
+
+ #ifdef CONFIG_SPARC64
+- ret = op_nmi_timer_init(ops);
++ ret = oprofile_nmi_init(ops);
+ if (!ret)
+ return ret;
+ #endif
+@@ -81,6 +241,10 @@
+ return ret;
+ }
+
++
+ void oprofile_arch_exit(void)
+ {
++#ifdef CONFIG_SPARC64
++ unregister_perf_hsvc();
++#endif
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/um/drivers/vde_user.c linux-2.6.29-rc3.owrt/arch/um/drivers/vde_user.c
+--- linux-2.6.29.owrt/arch/um/drivers/vde_user.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/um/drivers/vde_user.c 2009-05-10 23:48:28.000000000 +0200
+@@ -78,7 +78,7 @@
+ {
+ struct vde_open_args *args;
+
+- vpri->args = uml_kmalloc(sizeof(struct vde_open_args), UM_GFP_KERNEL);
++ vpri->args = kmalloc(sizeof(struct vde_open_args), UM_GFP_KERNEL);
+ if (vpri->args == NULL) {
+ printk(UM_KERN_ERR "vde_init_libstuff - vde_open_args "
+ "allocation failed");
+@@ -91,8 +91,8 @@
+ args->group = init->group;
+ args->mode = init->mode ? init->mode : 0700;
+
+- args->port ? printk("port %d", args->port) :
+- printk("undefined port");
++ args->port ? printk(UM_KERN_INFO "port %d", args->port) :
++ printk(UM_KERN_INFO "undefined port");
+ }
+
+ int vde_user_read(void *conn, void *buf, int len)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/um/kernel/ptrace.c linux-2.6.29-rc3.owrt/arch/um/kernel/ptrace.c
+--- linux-2.6.29.owrt/arch/um/kernel/ptrace.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/um/kernel/ptrace.c 2009-05-10 23:48:28.000000000 +0200
+@@ -64,11 +64,6 @@
+ ret = poke_user(child, addr, data);
+ break;
+
+- case PTRACE_SYSEMU:
+- case PTRACE_SYSEMU_SINGLESTEP:
+- ret = -EIO;
+- break;
+-
+ /* continue and stop at next (return from) syscall */
+ case PTRACE_SYSCALL:
+ /* restart after signal. */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/um/os-Linux/user_syms.c linux-2.6.29-rc3.owrt/arch/um/os-Linux/user_syms.c
+--- linux-2.6.29.owrt/arch/um/os-Linux/user_syms.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/um/os-Linux/user_syms.c 2009-05-10 23:48:28.000000000 +0200
+@@ -14,6 +14,7 @@
+ #undef memset
+
+ extern size_t strlen(const char *);
++extern void *memcpy(void *, const void *, size_t);
+ extern void *memmove(void *, const void *, size_t);
+ extern void *memset(void *, int, size_t);
+ extern int printf(const char *, ...);
+@@ -23,11 +24,7 @@
+ EXPORT_SYMBOL(strstr);
+ #endif
+
+-#ifndef __x86_64__
+-extern void *memcpy(void *, const void *, size_t);
+ EXPORT_SYMBOL(memcpy);
+-#endif
+-
+ EXPORT_SYMBOL(memmove);
+ EXPORT_SYMBOL(memset);
+ EXPORT_SYMBOL(printf);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/boot/video-vesa.c linux-2.6.29-rc3.owrt/arch/x86/boot/video-vesa.c
+--- linux-2.6.29.owrt/arch/x86/boot/video-vesa.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/boot/video-vesa.c 2009-05-10 23:48:28.000000000 +0200
+@@ -269,8 +269,9 @@
+ we genuinely have to assume all registers are destroyed here. */
+
+ asm("pushw %%es; movw %2,%%es; "INT10"; popw %%es"
+- : "+a" (ax), "+b" (bx), "+c" (cx), "+D" (di)
+- : : "esi", "edx");
++ : "+a" (ax), "+b" (bx)
++ : "c" (cx), "D" (di)
++ : "esi");
+
+ if (ax != 0x004f)
+ return; /* No EDID */
+@@ -284,9 +285,9 @@
+ dx = 0; /* EDID block number */
+ di =(size_t) &boot_params.edid_info; /* (ES:)Pointer to block */
+ asm(INT10
+- : "+a" (ax), "+b" (bx), "+d" (dx), "=m" (boot_params.edid_info),
+- "+c" (cx), "+D" (di)
+- : : "esi");
++ : "+a" (ax), "+b" (bx), "+d" (dx), "=m" (boot_params.edid_info)
++ : "c" (cx), "D" (di)
++ : "esi");
+ #endif /* CONFIG_FIRMWARE_EDID */
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/ia32/ia32entry.S linux-2.6.29-rc3.owrt/arch/x86/ia32/ia32entry.S
+--- linux-2.6.29.owrt/arch/x86/ia32/ia32entry.S 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/ia32/ia32entry.S 2009-05-10 23:48:28.000000000 +0200
+@@ -418,9 +418,9 @@
+ orl $TS_COMPAT,TI_status(%r10)
+ testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r10)
+ jnz ia32_tracesys
++ia32_do_syscall:
+ cmpl $(IA32_NR_syscalls-1),%eax
+- ja ia32_badsys
+-ia32_do_call:
++ ja int_ret_from_sys_call /* ia32_tracesys has set RAX(%rsp) */
+ IA32_ARG_FIXUP
+ call *ia32_sys_call_table(,%rax,8) # xxx: rip relative
+ ia32_sysret:
+@@ -435,9 +435,7 @@
+ call syscall_trace_enter
+ LOAD_ARGS32 ARGOFFSET /* reload args from stack in case ptrace changed it */
+ RESTORE_REST
+- cmpl $(IA32_NR_syscalls-1),%eax
+- ja int_ret_from_sys_call /* ia32_tracesys has set RAX(%rsp) */
+- jmp ia32_do_call
++ jmp ia32_do_syscall
+ END(ia32_syscall)
+
+ ia32_badsys:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/a.out-core.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/a.out-core.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/a.out-core.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/a.out-core.h 2009-05-10 23:48:28.000000000 +0200
+@@ -23,6 +23,8 @@
+ */
+ static inline void aout_dump_thread(struct pt_regs *regs, struct user *dump)
+ {
++ u16 gs;
++
+ /* changed the size calculations - should hopefully work better. lbt */
+ dump->magic = CMAGIC;
+ dump->start_code = 0;
+@@ -55,7 +57,7 @@
+ dump->regs.ds = (u16)regs->ds;
+ dump->regs.es = (u16)regs->es;
+ dump->regs.fs = (u16)regs->fs;
+- savesegment(gs, dump->regs.gs);
++ savesegment(gs, gs);
+ dump->regs.orig_ax = regs->orig_ax;
+ dump->regs.ip = regs->ip;
+ dump->regs.cs = (u16)regs->cs;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/cpufeature.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/cpufeature.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/cpufeature.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/cpufeature.h 2009-05-10 23:48:28.000000000 +0200
+@@ -93,7 +93,6 @@
+ #define X86_FEATURE_XTOPOLOGY (3*32+22) /* cpu topology enum extensions */
+ #define X86_FEATURE_TSC_RELIABLE (3*32+23) /* TSC is known to be reliable */
+ #define X86_FEATURE_NONSTOP_TSC (3*32+24) /* TSC does not stop in C states */
+-#define X86_FEATURE_CLFLUSH_MONITOR (3*32+25) /* "" clflush reqd with monitor */
+
+ /* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */
+ #define X86_FEATURE_XMM3 (4*32+ 0) /* "pni" SSE-3 */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/dma-mapping.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/dma-mapping.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/dma-mapping.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/dma-mapping.h 2009-05-10 23:48:28.000000000 +0200
+@@ -2,8 +2,8 @@
+ #define _ASM_X86_DMA_MAPPING_H
+
+ /*
+- * IOMMU interface. See Documentation/PCI/PCI-DMA-mapping.txt and
+- * Documentation/DMA-API.txt for documentation.
++ * IOMMU interface. See Documentation/DMA-mapping.txt and DMA-API.txt for
++ * documentation.
+ */
+
+ #include <linux/scatterlist.h>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/e820.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/e820.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/e820.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/e820.h 2009-05-10 23:48:28.000000000 +0200
+@@ -49,7 +49,6 @@
+ #define E820_RESERVED_KERN 128
+
+ #ifndef __ASSEMBLY__
+-#include <linux/types.h>
+ struct e820entry {
+ __u64 addr; /* start of memory segment */
+ __u64 size; /* size of memory segment */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/efi.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/efi.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/efi.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/efi.h 2009-05-10 23:48:28.000000000 +0200
+@@ -37,6 +37,8 @@
+
+ #else /* !CONFIG_X86_32 */
+
++#define MAX_EFI_IO_PAGES 100
++
+ extern u64 efi_call0(void *fp);
+ extern u64 efi_call1(void *fp, u64 arg1);
+ extern u64 efi_call2(void *fp, u64 arg1, u64 arg2);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/fixmap_64.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/fixmap_64.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/fixmap_64.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/fixmap_64.h 2009-05-10 23:48:28.000000000 +0200
+@@ -16,6 +16,7 @@
+ #include <asm/apicdef.h>
+ #include <asm/page.h>
+ #include <asm/vsyscall.h>
++#include <asm/efi.h>
+
+ /*
+ * Here we define all the compile-time 'special' virtual
+@@ -42,6 +43,9 @@
+ FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */
+ FIX_IO_APIC_BASE_0,
+ FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS - 1,
++ FIX_EFI_IO_MAP_LAST_PAGE,
++ FIX_EFI_IO_MAP_FIRST_PAGE = FIX_EFI_IO_MAP_LAST_PAGE
++ + MAX_EFI_IO_PAGES - 1,
+ #ifdef CONFIG_PARAVIRT
+ FIX_PARAVIRT_BOOTMAP,
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/i387.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/i387.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/i387.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/i387.h 2009-05-10 23:48:28.000000000 +0200
+@@ -172,13 +172,7 @@
+
+ #else /* CONFIG_X86_32 */
+
+-#ifdef CONFIG_MATH_EMULATION
+-extern void finit_task(struct task_struct *tsk);
+-#else
+-static inline void finit_task(struct task_struct *tsk)
+-{
+-}
+-#endif
++extern void finit(void);
+
+ static inline void tolerant_fwait(void)
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/iomap.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/iomap.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/iomap.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/iomap.h 2009-05-10 23:48:28.000000000 +0200
+@@ -23,9 +23,6 @@
+ #include <asm/pgtable.h>
+ #include <asm/tlbflush.h>
+
+-int
+-is_io_mapping_possible(resource_size_t base, unsigned long size);
+-
+ void *
+ iomap_atomic_prot_pfn(unsigned long pfn, enum km_type type, pgprot_t prot);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/kvm.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/kvm.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/kvm.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/kvm.h 2009-05-10 23:48:28.000000000 +0200
+@@ -6,16 +6,9 @@
+ *
+ */
+
+-#include <linux/types.h>
++#include <asm/types.h>
+ #include <linux/ioctl.h>
+
+-/* Select x86 specific features in <linux/kvm.h> */
+-#define __KVM_HAVE_PIT
+-#define __KVM_HAVE_IOAPIC
+-#define __KVM_HAVE_DEVICE_ASSIGNMENT
+-#define __KVM_HAVE_MSI
+-#define __KVM_HAVE_USER_NMI
+-
+ /* Architectural interrupt line count. */
+ #define KVM_NR_INTERRUPTS 256
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/math_emu.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/math_emu.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/math_emu.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/math_emu.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,18 +1,31 @@
+ #ifndef _ASM_X86_MATH_EMU_H
+ #define _ASM_X86_MATH_EMU_H
+
+-#include <asm/ptrace.h>
+-#include <asm/vm86.h>
+-
+ /* This structure matches the layout of the data saved to the stack
+ following a device-not-present interrupt, part of it saved
+ automatically by the 80386/80486.
+ */
+-struct math_emu_info {
++struct info {
+ long ___orig_eip;
+- union {
+- struct pt_regs *regs;
+- struct kernel_vm86_regs *vm86;
+- };
++ long ___ebx;
++ long ___ecx;
++ long ___edx;
++ long ___esi;
++ long ___edi;
++ long ___ebp;
++ long ___eax;
++ long ___ds;
++ long ___es;
++ long ___fs;
++ long ___orig_eax;
++ long ___eip;
++ long ___cs;
++ long ___eflags;
++ long ___esp;
++ long ___ss;
++ long ___vm86_es; /* This and the following only in vm86 mode */
++ long ___vm86_ds;
++ long ___vm86_fs;
++ long ___vm86_gs;
+ };
+ #endif /* _ASM_X86_MATH_EMU_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/mce.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/mce.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/mce.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/mce.h 2009-05-10 23:48:28.000000000 +0200
+@@ -3,8 +3,8 @@
+
+ #ifdef __x86_64__
+
+-#include <linux/types.h>
+ #include <asm/ioctls.h>
++#include <asm/types.h>
+
+ /*
+ * Machine Check support for x86
+@@ -115,6 +115,8 @@
+
+ #endif /* !CONFIG_X86_32 */
+
++
++
+ #ifdef CONFIG_X86_MCE
+ extern void mcheck_init(struct cpuinfo_x86 *c);
+ #else
+@@ -124,4 +126,5 @@
+ extern void restart_mce(void);
+
+ #endif /* __KERNEL__ */
++
+ #endif /* _ASM_X86_MCE_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/mmzone_32.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/mmzone_32.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/mmzone_32.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/mmzone_32.h 2009-05-10 23:48:28.000000000 +0200
+@@ -32,6 +32,8 @@
+ get_memcfg_numa_flat();
+ }
+
++extern int early_pfn_to_nid(unsigned long pfn);
++
+ extern void resume_map_numa_kva(pgd_t *pgd);
+
+ #else /* !CONFIG_NUMA */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/mmzone_64.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/mmzone_64.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/mmzone_64.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/mmzone_64.h 2009-05-10 23:48:28.000000000 +0200
+@@ -40,6 +40,8 @@
+ #define node_end_pfn(nid) (NODE_DATA(nid)->node_start_pfn + \
+ NODE_DATA(nid)->node_spanned_pages)
+
++extern int early_pfn_to_nid(unsigned long pfn);
++
+ #ifdef CONFIG_NUMA_EMU
+ #define FAKE_NODE_MIN_SIZE (64 * 1024 * 1024)
+ #define FAKE_NODE_MIN_HASH_MASK (~(FAKE_NODE_MIN_SIZE - 1UL))
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/mpspec.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/mpspec.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/mpspec.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/mpspec.h 2009-05-10 23:48:28.000000000 +0200
+@@ -60,7 +60,6 @@
+ u32 gsi);
+ extern void mp_config_acpi_legacy_irqs(void);
+ extern int mp_register_gsi(u32 gsi, int edge_level, int active_high_low);
+-extern int acpi_probe_gsi(void);
+ #ifdef CONFIG_X86_IO_APIC
+ extern int mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin,
+ u32 gsi, int triggering, int polarity);
+@@ -72,11 +71,6 @@
+ return 0;
+ }
+ #endif
+-#else /* !CONFIG_ACPI: */
+-static inline int acpi_probe_gsi(void)
+-{
+- return 0;
+-}
+ #endif /* CONFIG_ACPI */
+
+ #define PHYSID_ARRAY_SIZE BITS_TO_LONGS(MAX_APICS)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/mtrr.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/mtrr.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/mtrr.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/mtrr.h 2009-05-10 23:48:28.000000000 +0200
+@@ -23,7 +23,6 @@
+ #ifndef _ASM_X86_MTRR_H
+ #define _ASM_X86_MTRR_H
+
+-#include <linux/types.h>
+ #include <linux/ioctl.h>
+ #include <linux/errno.h>
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/page.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/page.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/page.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/page.h 2009-05-10 23:48:28.000000000 +0200
+@@ -57,6 +57,7 @@
+ typedef struct { pgprotval_t pgprot; } pgprot_t;
+
+ extern int page_is_ram(unsigned long pagenr);
++extern int pagerange_is_ram(unsigned long start, unsigned long end);
+ extern int devmem_is_allowed(unsigned long pagenr);
+ extern void map_devmem(unsigned long pfn, unsigned long size,
+ pgprot_t vma_prot);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/paravirt.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/paravirt.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/paravirt.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/paravirt.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1352,7 +1352,14 @@
+ PVOP_VCALL0(pv_cpu_ops.lazy_mode.leave);
+ }
+
+-void arch_flush_lazy_cpu_mode(void);
++static inline void arch_flush_lazy_cpu_mode(void)
++{
++ if (unlikely(paravirt_get_lazy_mode() == PARAVIRT_LAZY_CPU)) {
++ arch_leave_lazy_cpu_mode();
++ arch_enter_lazy_cpu_mode();
++ }
++}
++
+
+ #define __HAVE_ARCH_ENTER_LAZY_MMU_MODE
+ static inline void arch_enter_lazy_mmu_mode(void)
+@@ -1365,7 +1372,13 @@
+ PVOP_VCALL0(pv_mmu_ops.lazy_mode.leave);
+ }
+
+-void arch_flush_lazy_mmu_mode(void);
++static inline void arch_flush_lazy_mmu_mode(void)
++{
++ if (unlikely(paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU)) {
++ arch_leave_lazy_mmu_mode();
++ arch_enter_lazy_mmu_mode();
++ }
++}
+
+ static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx,
+ unsigned long phys, pgprot_t flags)
+@@ -1389,7 +1402,6 @@
+ {
+ return PVOP_CALL1(int, pv_lock_ops.spin_is_contended, lock);
+ }
+-#define __raw_spin_is_contended __raw_spin_is_contended
+
+ static __always_inline void __raw_spin_lock(struct raw_spinlock *lock)
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/pgtable.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/pgtable.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/pgtable.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/pgtable.h 2009-05-10 23:48:28.000000000 +0200
+@@ -302,30 +302,16 @@
+
+ extern pteval_t __supported_pte_mask;
+
+-/*
+- * Mask out unsupported bits in a present pgprot. Non-present pgprots
+- * can use those bits for other purposes, so leave them be.
+- */
+-static inline pgprotval_t massage_pgprot(pgprot_t pgprot)
+-{
+- pgprotval_t protval = pgprot_val(pgprot);
+-
+- if (protval & _PAGE_PRESENT)
+- protval &= __supported_pte_mask;
+-
+- return protval;
+-}
+-
+ static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot)
+ {
+- return __pte(((phys_addr_t)page_nr << PAGE_SHIFT) |
+- massage_pgprot(pgprot));
++ return __pte((((phys_addr_t)page_nr << PAGE_SHIFT) |
++ pgprot_val(pgprot)) & __supported_pte_mask);
+ }
+
+ static inline pmd_t pfn_pmd(unsigned long page_nr, pgprot_t pgprot)
+ {
+- return __pmd(((phys_addr_t)page_nr << PAGE_SHIFT) |
+- massage_pgprot(pgprot));
++ return __pmd((((phys_addr_t)page_nr << PAGE_SHIFT) |
++ pgprot_val(pgprot)) & __supported_pte_mask);
+ }
+
+ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
+@@ -337,7 +323,7 @@
+ * the newprot (if present):
+ */
+ val &= _PAGE_CHG_MASK;
+- val |= massage_pgprot(newprot) & ~_PAGE_CHG_MASK;
++ val |= pgprot_val(newprot) & (~_PAGE_CHG_MASK) & __supported_pte_mask;
+
+ return __pte(val);
+ }
+@@ -353,7 +339,7 @@
+
+ #define pte_pgprot(x) __pgprot(pte_flags(x) & PTE_FLAGS_MASK)
+
+-#define canon_pgprot(p) __pgprot(massage_pgprot(p))
++#define canon_pgprot(p) __pgprot(pgprot_val(p) & __supported_pte_mask)
+
+ static inline int is_new_memtype_allowed(unsigned long flags,
+ unsigned long new_flags)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/processor.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/processor.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/processor.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/processor.h 2009-05-10 23:48:28.000000000 +0200
+@@ -353,7 +353,7 @@
+ u8 no_update;
+ u8 rm;
+ u8 alimit;
+- struct math_emu_info *info;
++ struct info *info;
+ u32 entry_eip;
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/ptrace-abi.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/ptrace-abi.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/ptrace-abi.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/ptrace-abi.h 2009-05-10 23:48:28.000000000 +0200
+@@ -83,7 +83,7 @@
+ #ifdef CONFIG_X86_PTRACE_BTS
+
+ #ifndef __ASSEMBLY__
+-#include <linux/types.h>
++#include <asm/types.h>
+
+ /* configuration/status structure used in PTRACE_BTS_CONFIG and
+ PTRACE_BTS_STATUS commands.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/seccomp_32.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/seccomp_32.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/seccomp_32.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/seccomp_32.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,6 +1,12 @@
+ #ifndef _ASM_X86_SECCOMP_32_H
+ #define _ASM_X86_SECCOMP_32_H
+
++#include <linux/thread_info.h>
++
++#ifdef TIF_32BIT
++#error "unexpected TIF_32BIT on i386"
++#endif
++
+ #include <linux/unistd.h>
+
+ #define __NR_seccomp_read __NR_read
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/seccomp_64.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/seccomp_64.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/seccomp_64.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/seccomp_64.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,6 +1,14 @@
+ #ifndef _ASM_X86_SECCOMP_64_H
+ #define _ASM_X86_SECCOMP_64_H
+
++#include <linux/thread_info.h>
++
++#ifdef TIF_32BIT
++#error "unexpected TIF_32BIT on x86_64"
++#else
++#define TIF_32BIT TIF_IA32
++#endif
++
+ #include <linux/unistd.h>
+ #include <asm/ia32_unistd.h>
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/sigcontext32.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/sigcontext32.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/sigcontext32.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/sigcontext32.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,8 +1,6 @@
+ #ifndef _ASM_X86_SIGCONTEXT32_H
+ #define _ASM_X86_SIGCONTEXT32_H
+
+-#include <linux/types.h>
+-
+ /* signal context for 32bit programs. */
+
+ #define X86_FXSR_MAGIC 0x0000
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/sigcontext.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/sigcontext.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/sigcontext.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/sigcontext.h 2009-05-10 23:48:28.000000000 +0200
+@@ -2,7 +2,7 @@
+ #define _ASM_X86_SIGCONTEXT_H
+
+ #include <linux/compiler.h>
+-#include <linux/types.h>
++#include <asm/types.h>
+
+ #define FP_XSTATE_MAGIC1 0x46505853U
+ #define FP_XSTATE_MAGIC2 0x46505845U
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/spinlock.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/spinlock.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/spinlock.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/spinlock.h 2009-05-10 23:48:28.000000000 +0200
+@@ -245,7 +245,6 @@
+ {
+ return __ticket_spin_is_contended(lock);
+ }
+-#define __raw_spin_is_contended __raw_spin_is_contended
+
+ static __always_inline void __raw_spin_lock(raw_spinlock_t *lock)
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/swab.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/swab.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/swab.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/swab.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ #ifndef _ASM_X86_SWAB_H
+ #define _ASM_X86_SWAB_H
+
+-#include <linux/types.h>
++#include <asm/types.h>
+ #include <linux/compiler.h>
+
+ static inline __attribute_const__ __u32 __arch_swab32(__u32 val)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/traps.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/traps.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/traps.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/traps.h 2009-05-10 23:48:28.000000000 +0200
+@@ -41,7 +41,7 @@
+ dotraplinkage void do_overflow(struct pt_regs *, long);
+ dotraplinkage void do_bounds(struct pt_regs *, long);
+ dotraplinkage void do_invalid_op(struct pt_regs *, long);
+-dotraplinkage void do_device_not_available(struct pt_regs);
++dotraplinkage void do_device_not_available(struct pt_regs *, long);
+ dotraplinkage void do_coprocessor_segment_overrun(struct pt_regs *, long);
+ dotraplinkage void do_invalid_TSS(struct pt_regs *, long);
+ dotraplinkage void do_segment_not_present(struct pt_regs *, long);
+@@ -77,7 +77,7 @@
+ extern int kstack_depth_to_print;
+
+ void math_error(void __user *);
+-void math_emulate(struct math_emu_info *);
++asmlinkage void math_emulate(long);
+ #ifdef CONFIG_X86_32
+ unsigned long patch_espfix_desc(unsigned long, unsigned long);
+ #else
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/include/asm/xen/page.h linux-2.6.29-rc3.owrt/arch/x86/include/asm/xen/page.h
+--- linux-2.6.29.owrt/arch/x86/include/asm/xen/page.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/include/asm/xen/page.h 2009-05-10 23:48:28.000000000 +0200
+@@ -137,7 +137,7 @@
+ pte_t pte;
+
+ pte.pte = ((phys_addr_t)page_nr << PAGE_SHIFT) |
+- massage_pgprot(pgprot);
++ (pgprot_val(pgprot) & __supported_pte_mask);
+
+ return pte;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/Kconfig linux-2.6.29-rc3.owrt/arch/x86/Kconfig
+--- linux-2.6.29.owrt/arch/x86/Kconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1802,17 +1802,6 @@
+ and include PCI device scope covered by these DMA
+ remapping devices.
+
+-config DMAR_DEFAULT_ON
+- def_bool y
+- prompt "Enable DMA Remapping Devices by default"
+- depends on DMAR
+- help
+- Selecting this option will enable a DMAR device at boot time if
+- one is found. If this option is not selected, DMAR support can
+- be enabled by passing intel_iommu=on to the kernel. It is
+- recommended you say N here while the DMAR code remains
+- experimental.
+-
+ config DMAR_GFX_WA
+ def_bool y
+ prompt "Support for Graphics workaround"
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/Kconfig.cpu linux-2.6.29-rc3.owrt/arch/x86/Kconfig.cpu
+--- linux-2.6.29.owrt/arch/x86/Kconfig.cpu 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/Kconfig.cpu 2009-05-10 23:48:28.000000000 +0200
+@@ -167,9 +167,9 @@
+ config MK8
+ bool "Opteron/Athlon64/Hammer/K8"
+ help
+- Select this for an AMD Opteron or Athlon64 Hammer-family processor.
+- Enables use of some extended instructions, and passes appropriate
+- optimization flags to GCC.
++ Select this for an AMD Opteron or Athlon64 Hammer-family processor. Enables
++ use of some extended instructions, and passes appropriate optimization
++ flags to GCC.
+
+ config MCRUSOE
+ bool "Crusoe"
+@@ -256,11 +256,9 @@
+ config MCORE2
+ bool "Core 2/newer Xeon"
+ help
+-
+- Select this for Intel Core 2 and newer Core 2 Xeons (Xeon 51xx and
+- 53xx) CPUs. You can distinguish newer from older Xeons by the CPU
+- family in /proc/cpuinfo. Newer ones have 6 and older ones 15
+- (not a typo)
++ Select this for Intel Core 2 and newer Core 2 Xeons (Xeon 51xx and 53xx)
++ CPUs. You can distinguish newer from older Xeons by the CPU family
++ in /proc/cpuinfo. Newer ones have 6 and older ones 15 (not a typo)
+
+ config GENERIC_CPU
+ bool "Generic-x86-64"
+@@ -322,14 +320,14 @@
+ bool "PentiumPro memory ordering errata workaround"
+ depends on M686 || M586MMX || M586TSC || M586 || M486 || M386 || MGEODEGX1
+ help
+- Old PentiumPro multiprocessor systems had errata that could cause
+- memory operations to violate the x86 ordering standard in rare cases.
+- Enabling this option will attempt to work around some (but not all)
+- occurances of this problem, at the cost of much heavier spinlock and
+- memory barrier operations.
++ Old PentiumPro multiprocessor systems had errata that could cause memory
++ operations to violate the x86 ordering standard in rare cases. Enabling this
++ option will attempt to work around some (but not all) occurances of
++ this problem, at the cost of much heavier spinlock and memory barrier
++ operations.
+
+- If unsure, say n here. Even distro kernels should think twice before
+- enabling this: there are few systems, and an unlikely bug.
++ If unsure, say n here. Even distro kernels should think twice before enabling
++ this: there are few systems, and an unlikely bug.
+
+ config X86_F00F_BUG
+ def_bool y
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/Kconfig.debug linux-2.6.29-rc3.owrt/arch/x86/Kconfig.debug
+--- linux-2.6.29.owrt/arch/x86/Kconfig.debug 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/Kconfig.debug 2009-05-10 23:48:28.000000000 +0200
+@@ -174,8 +174,28 @@
+ Add a simple leak tracer to the IOMMU code. This is useful when you
+ are debugging a buggy device driver that leaks IOMMU mappings.
+
+-config HAVE_MMIOTRACE_SUPPORT
+- def_bool y
++config MMIOTRACE
++ bool "Memory mapped IO tracing"
++ depends on DEBUG_KERNEL && PCI
++ select TRACING
++ help
++ Mmiotrace traces Memory Mapped I/O access and is meant for
++ debugging and reverse engineering. It is called from the ioremap
++ implementation and works via page faults. Tracing is disabled by
++ default and can be enabled at run-time.
++
++ See Documentation/tracers/mmiotrace.txt.
++ If you are not helping to develop drivers, say N.
++
++config MMIOTRACE_TEST
++ tristate "Test module for mmiotrace"
++ depends on MMIOTRACE && m
++ help
++ This is a dumb module for testing mmiotrace. It is very dangerous
++ as it will write garbage to IO memory starting at a given address.
++ However, it should be safe to use on e.g. unused portion of VRAM.
++
++ Say N, unless you absolutely know what you are doing.
+
+ #
+ # IO delay types:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/acpi/boot.c linux-2.6.29-rc3.owrt/arch/x86/kernel/acpi/boot.c
+--- linux-2.6.29.owrt/arch/x86/kernel/acpi/boot.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/acpi/boot.c 2009-05-10 23:48:28.000000000 +0200
+@@ -973,29 +973,6 @@
+ nr_ioapics++;
+ }
+
+-int __init acpi_probe_gsi(void)
+-{
+- int idx;
+- int gsi;
+- int max_gsi = 0;
+-
+- if (acpi_disabled)
+- return 0;
+-
+- if (!acpi_ioapic)
+- return 0;
+-
+- max_gsi = 0;
+- for (idx = 0; idx < nr_ioapics; idx++) {
+- gsi = mp_ioapic_routing[idx].gsi_end;
+-
+- if (gsi > max_gsi)
+- max_gsi = gsi;
+- }
+-
+- return max_gsi + 1;
+-}
+-
+ static void assign_to_mp_irq(struct mp_config_intsrc *m,
+ struct mp_config_intsrc *mp_irq)
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/acpi/sleep.c linux-2.6.29-rc3.owrt/arch/x86/kernel/acpi/sleep.c
+--- linux-2.6.29.owrt/arch/x86/kernel/acpi/sleep.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/acpi/sleep.c 2009-05-10 23:48:28.000000000 +0200
+@@ -156,11 +156,11 @@
+ #ifdef CONFIG_HIBERNATION
+ if (strncmp(str, "s4_nohwsig", 10) == 0)
+ acpi_no_s4_hw_signature();
+- if (strncmp(str, "s4_nonvs", 8) == 0)
+- acpi_s4_no_nvs();
+ #endif
+ if (strncmp(str, "old_ordering", 12) == 0)
+ acpi_old_suspend_ordering();
++ if (strncmp(str, "s4_nonvs", 8) == 0)
++ acpi_s4_no_nvs();
+ str = strchr(str, ',');
+ if (str != NULL)
+ str += strspn(str, ", \t");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/acpi/wakeup_64.S linux-2.6.29-rc3.owrt/arch/x86/kernel/acpi/wakeup_64.S
+--- linux-2.6.29.owrt/arch/x86/kernel/acpi/wakeup_64.S 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/acpi/wakeup_64.S 2009-05-10 23:48:28.000000000 +0200
+@@ -13,6 +13,7 @@
+ * Hooray, we are in Long 64-bit mode (but still running in low memory)
+ */
+ ENTRY(wakeup_long64)
++wakeup_long64:
+ movq saved_magic, %rax
+ movq $0x123456789abcdef0, %rdx
+ cmpq %rdx, %rax
+@@ -33,12 +34,16 @@
+
+ movq saved_rip, %rax
+ jmp *%rax
+-ENDPROC(wakeup_long64)
+
+ bogus_64_magic:
+ jmp bogus_64_magic
+
+-ENTRY(do_suspend_lowlevel)
++ .align 2
++ .p2align 4,,15
++.globl do_suspend_lowlevel
++ .type do_suspend_lowlevel,@function
++do_suspend_lowlevel:
++.LFB5:
+ subq $8, %rsp
+ xorl %eax, %eax
+ call save_processor_state
+@@ -62,7 +67,7 @@
+ pushfq
+ popq pt_regs_flags(%rax)
+
+- movq $resume_point, saved_rip(%rip)
++ movq $.L97, saved_rip(%rip)
+
+ movq %rsp, saved_rsp
+ movq %rbp, saved_rbp
+@@ -73,12 +78,14 @@
+ addq $8, %rsp
+ movl $3, %edi
+ xorl %eax, %eax
+- call acpi_enter_sleep_state
+- /* in case something went wrong, restore the machine status and go on */
+- jmp resume_point
+-
++ jmp acpi_enter_sleep_state
++.L97:
++ .p2align 4,,7
++.L99:
+ .align 4
+-resume_point:
++ movl $24, %eax
++ movw %ax, %ds
++
+ /* We don't restore %rax, it must be 0 anyway */
+ movq $saved_context, %rax
+ movq saved_context_cr4(%rax), %rbx
+@@ -110,9 +117,12 @@
+ xorl %eax, %eax
+ addq $8, %rsp
+ jmp restore_processor_state
+-ENDPROC(do_suspend_lowlevel)
+-
++.LFE5:
++.Lfe5:
++ .size do_suspend_lowlevel, .Lfe5-do_suspend_lowlevel
++
+ .data
++ALIGN
+ ENTRY(saved_rbp) .quad 0
+ ENTRY(saved_rsi) .quad 0
+ ENTRY(saved_rdi) .quad 0
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/apic.c linux-2.6.29-rc3.owrt/arch/x86/kernel/apic.c
+--- linux-2.6.29.owrt/arch/x86/kernel/apic.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/apic.c 2009-05-10 23:48:28.000000000 +0200
+@@ -862,7 +862,7 @@
+ }
+
+ /* lets not touch this if we didn't frob it */
+-#if defined(CONFIG_X86_MCE_P4THERMAL) || defined(CONFIG_X86_MCE_INTEL)
++#if defined(CONFIG_X86_MCE_P4THERMAL) || defined(X86_MCE_INTEL)
+ if (maxlvt >= 5) {
+ v = apic_read(APIC_LVTTHMR);
+ apic_write(APIC_LVTTHMR, v | APIC_LVT_MASKED);
+@@ -1436,7 +1436,7 @@
+ switch (boot_cpu_data.x86_vendor) {
+ case X86_VENDOR_AMD:
+ if ((boot_cpu_data.x86 == 6 && boot_cpu_data.x86_model > 1) ||
+- (boot_cpu_data.x86 >= 15))
++ (boot_cpu_data.x86 == 15))
+ break;
+ goto no_apic;
+ case X86_VENDOR_INTEL:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/apm_32.c linux-2.6.29-rc3.owrt/arch/x86/kernel/apm_32.c
+--- linux-2.6.29.owrt/arch/x86/kernel/apm_32.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/apm_32.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1192,7 +1192,6 @@
+ device_suspend(PMSG_SUSPEND);
+ local_irq_disable();
+ device_power_down(PMSG_SUSPEND);
+- sysdev_suspend(PMSG_SUSPEND);
+
+ local_irq_enable();
+
+@@ -1209,7 +1208,6 @@
+ if (err != APM_SUCCESS)
+ apm_error("suspend", err);
+ err = (err == APM_SUCCESS) ? 0 : -EIO;
+- sysdev_resume();
+ device_power_up(PMSG_RESUME);
+ local_irq_enable();
+ device_resume(PMSG_RESUME);
+@@ -1230,7 +1228,6 @@
+
+ local_irq_disable();
+ device_power_down(PMSG_SUSPEND);
+- sysdev_suspend(PMSG_SUSPEND);
+ local_irq_enable();
+
+ err = set_system_power_state(APM_STATE_STANDBY);
+@@ -1238,7 +1235,6 @@
+ apm_error("standby", err);
+
+ local_irq_disable();
+- sysdev_resume();
+ device_power_up(PMSG_RESUME);
+ local_irq_enable();
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/cpu/cpufreq/Kconfig linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/cpufreq/Kconfig
+--- linux-2.6.29.owrt/arch/x86/kernel/cpu/cpufreq/Kconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/cpufreq/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -245,6 +245,17 @@
+
+ comment "shared options"
+
++config X86_ACPI_CPUFREQ_PROC_INTF
++ bool "/proc/acpi/processor/../performance interface (deprecated)"
++ depends on PROC_FS
++ depends on X86_ACPI_CPUFREQ || X86_POWERNOW_K7_ACPI || X86_POWERNOW_K8_ACPI
++ help
++ This enables the deprecated /proc/acpi/processor/../performance
++ interface. While it is helpful for debugging, the generic,
++ cross-architecture cpufreq interfaces should be used.
++
++ If in doubt, say N.
++
+ config X86_SPEEDSTEP_LIB
+ tristate
+ default (X86_SPEEDSTEP_ICH || X86_SPEEDSTEP_SMI || X86_P4_CLOCKMOD)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c
+--- linux-2.6.29.owrt/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c 2009-05-10 23:48:28.000000000 +0200
+@@ -277,6 +277,7 @@
+ .name = "p4-clockmod",
+ .owner = THIS_MODULE,
+ .attr = p4clockmod_attr,
++ .hide_interface = 1,
+ };
+
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/cpu/cpufreq/powernow-k8.c linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
+--- linux-2.6.29.owrt/arch/x86/kernel/cpu/cpufreq/powernow-k8.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/cpufreq/powernow-k8.c 2009-05-10 23:48:28.000000000 +0200
+@@ -939,25 +939,10 @@
+ free_cpumask_var(data->acpi_data.shared_cpu_map);
+ }
+
+-static int get_transition_latency(struct powernow_k8_data *data)
+-{
+- int max_latency = 0;
+- int i;
+- for (i = 0; i < data->acpi_data.state_count; i++) {
+- int cur_latency = data->acpi_data.states[i].transition_latency
+- + data->acpi_data.states[i].bus_master_latency;
+- if (cur_latency > max_latency)
+- max_latency = cur_latency;
+- }
+- /* value in usecs, needs to be in nanoseconds */
+- return 1000 * max_latency;
+-}
+-
+ #else
+ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) { return -ENODEV; }
+ static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data) { return; }
+ static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index) { return; }
+-static int get_transition_latency(struct powernow_k8_data *data) { return 0; }
+ #endif /* CONFIG_X86_POWERNOW_K8_ACPI */
+
+ /* Take a frequency, and issue the fid/vid transition command */
+@@ -1157,7 +1142,8 @@
+ data->cpu = pol->cpu;
+ data->currpstate = HW_PSTATE_INVALID;
+
+- if (powernow_k8_cpu_init_acpi(data)) {
++ rc = powernow_k8_cpu_init_acpi(data);
++ if (rc) {
+ /*
+ * Use the PSB BIOS structure. This is only availabe on
+ * an UP version, and is deprecated by AMD.
+@@ -1175,28 +1161,19 @@
+ "ACPI maintainers and complain to your BIOS "
+ "vendor.\n");
+ #endif
+- kfree(data);
+- return -ENODEV;
++ goto err_out;
+ }
+ if (pol->cpu != 0) {
+ printk(KERN_ERR FW_BUG PFX "No ACPI _PSS objects for "
+ "CPU other than CPU0. Complain to your BIOS "
+ "vendor.\n");
+- kfree(data);
+- return -ENODEV;
++ goto err_out;
+ }
+ rc = find_psb_table(data);
+ if (rc) {
+- kfree(data);
+- return -ENODEV;
++ goto err_out;
+ }
+- /* Take a crude guess here.
+- * That guess was in microseconds, so multiply with 1000 */
+- pol->cpuinfo.transition_latency = (
+- ((data->rvo + 8) * data->vstable * VST_UNITS_20US) +
+- ((1 << data->irt) * 30)) * 1000;
+- } else /* ACPI _PSS objects available */
+- pol->cpuinfo.transition_latency = get_transition_latency(data);
++ }
+
+ /* only run on specific CPU from here on */
+ oldmask = current->cpus_allowed;
+@@ -1227,6 +1204,11 @@
+ cpumask_copy(pol->cpus, &per_cpu(cpu_core_map, pol->cpu));
+ data->available_cores = pol->cpus;
+
++ /* Take a crude guess here.
++ * That guess was in microseconds, so multiply with 1000 */
++ pol->cpuinfo.transition_latency = (((data->rvo + 8) * data->vstable * VST_UNITS_20US)
++ + (3 * (1 << data->irt) * 10)) * 1000;
++
+ if (cpu_family == CPU_HW_PSTATE)
+ pol->cur = find_khz_freq_from_pstate(data->powernow_table, data->currpstate);
+ else
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/cpu/intel.c linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/intel.c
+--- linux-2.6.29.owrt/arch/x86/kernel/cpu/intel.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/intel.c 2009-05-10 23:48:28.000000000 +0200
+@@ -30,7 +30,7 @@
+ static void __cpuinit early_init_intel(struct cpuinfo_x86 *c)
+ {
+ /* Unmask CPUID levels if masked: */
+- if (c->x86 > 6 || (c->x86 == 6 && c->x86_model >= 0xd)) {
++ if (c->x86 == 6 && c->x86_model >= 15) {
+ u64 misc_enable;
+
+ rdmsrl(MSR_IA32_MISC_ENABLE, misc_enable);
+@@ -291,9 +291,6 @@
+ ds_init_intel(c);
+ }
+
+- if (c->x86 == 6 && c->x86_model == 29 && cpu_has_clflush)
+- set_cpu_cap(c, X86_FEATURE_CLFLUSH_MONITOR);
+-
+ #ifdef CONFIG_X86_64
+ if (c->x86 == 15)
+ c->x86_cache_alignment = c->x86_clflush_size * 2;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/cpu/intel_cacheinfo.c linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/intel_cacheinfo.c
+--- linux-2.6.29.owrt/arch/x86/kernel/cpu/intel_cacheinfo.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/intel_cacheinfo.c 2009-05-10 23:48:28.000000000 +0200
+@@ -36,11 +36,8 @@
+ {
+ { 0x06, LVL_1_INST, 8 }, /* 4-way set assoc, 32 byte line size */
+ { 0x08, LVL_1_INST, 16 }, /* 4-way set assoc, 32 byte line size */
+- { 0x09, LVL_1_INST, 32 }, /* 4-way set assoc, 64 byte line size */
+ { 0x0a, LVL_1_DATA, 8 }, /* 2 way set assoc, 32 byte line size */
+ { 0x0c, LVL_1_DATA, 16 }, /* 4-way set assoc, 32 byte line size */
+- { 0x0d, LVL_1_DATA, 16 }, /* 4-way set assoc, 64 byte line size */
+- { 0x21, LVL_2, 256 }, /* 8-way set assoc, 64 byte line size */
+ { 0x22, LVL_3, 512 }, /* 4-way set assoc, sectored cache, 64 byte line size */
+ { 0x23, LVL_3, 1024 }, /* 8-way set assoc, sectored cache, 64 byte line size */
+ { 0x25, LVL_3, 2048 }, /* 8-way set assoc, sectored cache, 64 byte line size */
+@@ -88,18 +85,6 @@
+ { 0x85, LVL_2, 2048 }, /* 8-way set assoc, 32 byte line size */
+ { 0x86, LVL_2, 512 }, /* 4-way set assoc, 64 byte line size */
+ { 0x87, LVL_2, 1024 }, /* 8-way set assoc, 64 byte line size */
+- { 0xd0, LVL_3, 512 }, /* 4-way set assoc, 64 byte line size */
+- { 0xd1, LVL_3, 1024 }, /* 4-way set assoc, 64 byte line size */
+- { 0xd2, LVL_3, 2048 }, /* 4-way set assoc, 64 byte line size */
+- { 0xd6, LVL_3, 1024 }, /* 8-way set assoc, 64 byte line size */
+- { 0xd7, LVL_3, 2038 }, /* 8-way set assoc, 64 byte line size */
+- { 0xd8, LVL_3, 4096 }, /* 12-way set assoc, 64 byte line size */
+- { 0xdc, LVL_3, 2048 }, /* 12-way set assoc, 64 byte line size */
+- { 0xdd, LVL_3, 4096 }, /* 12-way set assoc, 64 byte line size */
+- { 0xde, LVL_3, 8192 }, /* 12-way set assoc, 64 byte line size */
+- { 0xe2, LVL_3, 2048 }, /* 16-way set assoc, 64 byte line size */
+- { 0xe3, LVL_3, 4096 }, /* 16-way set assoc, 64 byte line size */
+- { 0xe4, LVL_3, 8192 }, /* 16-way set assoc, 64 byte line size */
+ { 0x00, 0, 0}
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/cpu/mcheck/mce_64.c linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/mcheck/mce_64.c
+--- linux-2.6.29.owrt/arch/x86/kernel/cpu/mcheck/mce_64.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/mcheck/mce_64.c 2009-05-10 23:48:28.000000000 +0200
+@@ -295,11 +295,11 @@
+ * If we know that the error was in user space, send a
+ * SIGBUS. Otherwise, panic if tolerance is low.
+ *
+- * force_sig() takes an awful lot of locks and has a slight
++ * do_exit() takes an awful lot of locks and has a slight
+ * risk of deadlocking.
+ */
+ if (user_space) {
+- force_sig(SIGBUS, current);
++ do_exit(SIGBUS);
+ } else if (panic_on_oops || tolerant < 2) {
+ mce_panic("Uncorrected machine check",
+ &panicm, mcestart);
+@@ -490,7 +490,7 @@
+
+ }
+
+-static void mce_cpu_features(struct cpuinfo_x86 *c)
++static void __cpuinit mce_cpu_features(struct cpuinfo_x86 *c)
+ {
+ switch (c->x86_vendor) {
+ case X86_VENDOR_INTEL:
+@@ -734,7 +734,6 @@
+ static int mce_resume(struct sys_device *dev)
+ {
+ mce_init(NULL);
+- mce_cpu_features(&current_cpu_data);
+ return 0;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/cpu/mcheck/mce_amd_64.c linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/mcheck/mce_amd_64.c
+--- linux-2.6.29.owrt/arch/x86/kernel/cpu/mcheck/mce_amd_64.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/mcheck/mce_amd_64.c 2009-05-10 23:48:28.000000000 +0200
+@@ -121,7 +121,7 @@
+ }
+
+ /* cpu init entry point, called from mce.c with preempt off */
+-void mce_amd_feature_init(struct cpuinfo_x86 *c)
++void __cpuinit mce_amd_feature_init(struct cpuinfo_x86 *c)
+ {
+ unsigned int bank, block;
+ unsigned int cpu = smp_processor_id();
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/cpu/mcheck/mce_intel_64.c linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/mcheck/mce_intel_64.c
+--- linux-2.6.29.owrt/arch/x86/kernel/cpu/mcheck/mce_intel_64.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/mcheck/mce_intel_64.c 2009-05-10 23:48:28.000000000 +0200
+@@ -30,7 +30,7 @@
+ irq_exit();
+ }
+
+-static void intel_init_thermal(struct cpuinfo_x86 *c)
++static void __cpuinit intel_init_thermal(struct cpuinfo_x86 *c)
+ {
+ u32 l, h;
+ int tm2 = 0;
+@@ -84,7 +84,7 @@
+ return;
+ }
+
+-void mce_intel_feature_init(struct cpuinfo_x86 *c)
++void __cpuinit mce_intel_feature_init(struct cpuinfo_x86 *c)
+ {
+ intel_init_thermal(c);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/cpu/mtrr/main.c linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/mtrr/main.c
+--- linux-2.6.29.owrt/arch/x86/kernel/cpu/mtrr/main.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/cpu/mtrr/main.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1594,7 +1594,8 @@
+
+ /* kvm/qemu doesn't have mtrr set right, don't trim them all */
+ if (!highest_pfn) {
+- printk(KERN_INFO "CPU MTRRs all blank - virtualized system.\n");
++ WARN(!kvm_para_available(), KERN_WARNING
++ "WARNING: strange, CPU MTRRs all blank?\n");
+ return 0;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/ds.c linux-2.6.29-rc3.owrt/arch/x86/kernel/ds.c
+--- linux-2.6.29.owrt/arch/x86/kernel/ds.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/ds.c 2009-05-10 23:48:28.000000000 +0200
+@@ -15,8 +15,8 @@
+ * - buffer allocation (memory accounting)
+ *
+ *
+- * Copyright (C) 2007-2009 Intel Corporation.
+- * Markus Metzger <markus.t.metzger@intel.com>, 2007-2009
++ * Copyright (C) 2007-2008 Intel Corporation.
++ * Markus Metzger <markus.t.metzger@intel.com>, 2007-2008
+ */
+
+
+@@ -729,7 +729,7 @@
+
+ spin_unlock_irqrestore(&ds_lock, irq);
+
+- ds_write_config(tracer->ds.context, &tracer->trace.ds, ds_pebs);
++ ds_write_config(tracer->ds.context, &tracer->trace.ds, ds_bts);
+ ds_resume_pebs(tracer);
+
+ return tracer;
+@@ -890,7 +890,7 @@
+ }
+
+ static const struct ds_configuration ds_cfg_netburst = {
+- .name = "Netburst",
++ .name = "netburst",
+ .ctl[dsf_bts] = (1 << 2) | (1 << 3),
+ .ctl[dsf_bts_kernel] = (1 << 5),
+ .ctl[dsf_bts_user] = (1 << 6),
+@@ -904,7 +904,7 @@
+ #endif
+ };
+ static const struct ds_configuration ds_cfg_pentium_m = {
+- .name = "Pentium M",
++ .name = "pentium m",
+ .ctl[dsf_bts] = (1 << 6) | (1 << 7),
+
+ .sizeof_field = sizeof(long),
+@@ -915,8 +915,8 @@
+ .sizeof_rec[ds_pebs] = sizeof(long) * 18,
+ #endif
+ };
+-static const struct ds_configuration ds_cfg_core2_atom = {
+- .name = "Core 2/Atom",
++static const struct ds_configuration ds_cfg_core2 = {
++ .name = "core 2",
+ .ctl[dsf_bts] = (1 << 6) | (1 << 7),
+ .ctl[dsf_bts_kernel] = (1 << 9),
+ .ctl[dsf_bts_user] = (1 << 10),
+@@ -949,22 +949,19 @@
+ switch (c->x86) {
+ case 0x6:
+ switch (c->x86_model) {
+- case 0x9:
+- case 0xd: /* Pentium M */
+- ds_configure(&ds_cfg_pentium_m);
++ case 0 ... 0xC:
++ /* sorry, don't know about them */
+ break;
+- case 0xf:
+- case 0x17: /* Core2 */
+- case 0x1c: /* Atom */
+- ds_configure(&ds_cfg_core2_atom);
++ case 0xD:
++ case 0xE: /* Pentium M */
++ ds_configure(&ds_cfg_pentium_m);
+ break;
+- case 0x1a: /* i7 */
+- default:
+- /* sorry, don't know about them */
++ default: /* Core2, Atom, ... */
++ ds_configure(&ds_cfg_core2);
+ break;
+ }
+ break;
+- case 0xf:
++ case 0xF:
+ switch (c->x86_model) {
+ case 0x0:
+ case 0x1:
+@@ -1029,4 +1026,5 @@
+
+ void ds_exit_thread(struct task_struct *tsk)
+ {
++ WARN_ON(tsk->thread.ds_ctx);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/efi_64.c linux-2.6.29-rc3.owrt/arch/x86/kernel/efi_64.c
+--- linux-2.6.29.owrt/arch/x86/kernel/efi_64.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/efi_64.c 2009-05-10 23:48:28.000000000 +0200
+@@ -99,11 +99,24 @@
+
+ void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size)
+ {
+- unsigned long last_map_pfn;
++ static unsigned pages_mapped __initdata;
++ unsigned i, pages;
++ unsigned long offset;
+
+- last_map_pfn = init_memory_mapping(phys_addr, phys_addr + size);
+- if ((last_map_pfn << PAGE_SHIFT) < phys_addr + size)
++ pages = PFN_UP(phys_addr + size) - PFN_DOWN(phys_addr);
++ offset = phys_addr & ~PAGE_MASK;
++ phys_addr &= PAGE_MASK;
++
++ if (pages_mapped + pages > MAX_EFI_IO_PAGES)
+ return NULL;
+
+- return (void __iomem *)__va(phys_addr);
++ for (i = 0; i < pages; i++) {
++ __set_fixmap(FIX_EFI_IO_MAP_FIRST_PAGE - pages_mapped,
++ phys_addr, PAGE_KERNEL);
++ phys_addr += PAGE_SIZE;
++ pages_mapped++;
++ }
++
++ return (void __iomem *)__fix_to_virt(FIX_EFI_IO_MAP_FIRST_PAGE - \
++ (pages_mapped - pages)) + offset;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/efi.c linux-2.6.29-rc3.owrt/arch/x86/kernel/efi.c
+--- linux-2.6.29.owrt/arch/x86/kernel/efi.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/efi.c 2009-05-10 23:48:28.000000000 +0200
+@@ -467,7 +467,7 @@
+ efi_memory_desc_t *md;
+ efi_status_t status;
+ unsigned long size;
+- u64 end, systab, addr, npages, end_pfn;
++ u64 end, systab, addr, npages;
+ void *p, *va;
+
+ efi.systab = NULL;
+@@ -479,10 +479,7 @@
+ size = md->num_pages << EFI_PAGE_SHIFT;
+ end = md->phys_addr + size;
+
+- end_pfn = PFN_UP(end);
+- if (end_pfn <= max_low_pfn_mapped
+- || (end_pfn > (1UL << (32 - PAGE_SHIFT))
+- && end_pfn <= max_pfn_mapped))
++ if (PFN_UP(end) <= max_low_pfn_mapped)
+ va = __va(md->phys_addr);
+ else
+ va = efi_ioremap(md->phys_addr, size);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/entry_64.S linux-2.6.29-rc3.owrt/arch/x86/kernel/entry_64.S
+--- linux-2.6.29.owrt/arch/x86/kernel/entry_64.S 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/entry_64.S 2009-05-10 23:48:28.000000000 +0200
+@@ -346,7 +346,6 @@
+ popq_cfi %rax /* move return address... */
+ mov %gs:pda_irqstackptr,%rsp
+ EMPTY_FRAME 0
+- pushq_cfi %rbp /* backlink for unwinder */
+ pushq_cfi %rax /* ... to the new stack */
+ /*
+ * We entered an interrupt context - irqs are off:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/ftrace.c linux-2.6.29-rc3.owrt/arch/x86/kernel/ftrace.c
+--- linux-2.6.29.owrt/arch/x86/kernel/ftrace.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/ftrace.c 2009-05-10 23:48:28.000000000 +0200
+@@ -488,21 +488,20 @@
+ * ignore such a protection.
+ */
+ asm volatile(
+- "1: " _ASM_MOV " (%[parent]), %[old]\n"
+- "2: " _ASM_MOV " %[return_hooker], (%[parent])\n"
++ "1: " _ASM_MOV " (%[parent_old]), %[old]\n"
++ "2: " _ASM_MOV " %[return_hooker], (%[parent_replaced])\n"
+ " movl $0, %[faulted]\n"
+- "3:\n"
+
+ ".section .fixup, \"ax\"\n"
+- "4: movl $1, %[faulted]\n"
+- " jmp 3b\n"
++ "3: movl $1, %[faulted]\n"
+ ".previous\n"
+
+- _ASM_EXTABLE(1b, 4b)
+- _ASM_EXTABLE(2b, 4b)
++ _ASM_EXTABLE(1b, 3b)
++ _ASM_EXTABLE(2b, 3b)
+
+- : [old] "=r" (old), [faulted] "=r" (faulted)
+- : [parent] "r" (parent), [return_hooker] "r" (return_hooker)
++ : [parent_replaced] "=r" (parent), [old] "=r" (old),
++ [faulted] "=r" (faulted)
++ : [parent_old] "0" (parent), [return_hooker] "r" (return_hooker)
+ : "memory"
+ );
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/hpet.c linux-2.6.29-rc3.owrt/arch/x86/kernel/hpet.c
+--- linux-2.6.29.owrt/arch/x86/kernel/hpet.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/hpet.c 2009-05-10 23:48:28.000000000 +0200
+@@ -269,8 +269,6 @@
+ now = hpet_readl(HPET_COUNTER);
+ cmp = now + (unsigned long) delta;
+ cfg = hpet_readl(HPET_Tn_CFG(timer));
+- /* Make sure we use edge triggered interrupts */
+- cfg &= ~HPET_TN_LEVEL;
+ cfg |= HPET_TN_ENABLE | HPET_TN_PERIODIC |
+ HPET_TN_SETVAL | HPET_TN_32BIT;
+ hpet_writel(cfg, HPET_Tn_CFG(timer));
+@@ -899,7 +897,7 @@
+ static int hpet_prev_update_sec;
+ static struct rtc_time hpet_alarm_time;
+ static unsigned long hpet_pie_count;
+-static u32 hpet_t1_cmp;
++static unsigned long hpet_t1_cmp;
+ static unsigned long hpet_default_delta;
+ static unsigned long hpet_pie_delta;
+ static unsigned long hpet_pie_limit;
+@@ -907,14 +905,6 @@
+ static rtc_irq_handler irq_handler;
+
+ /*
+- * Check that the hpet counter c1 is ahead of the c2
+- */
+-static inline int hpet_cnt_ahead(u32 c1, u32 c2)
+-{
+- return (s32)(c2 - c1) < 0;
+-}
+-
+-/*
+ * Registers a IRQ handler.
+ */
+ int hpet_register_irq_handler(rtc_irq_handler handler)
+@@ -1085,7 +1075,7 @@
+ hpet_t1_cmp += delta;
+ hpet_writel(hpet_t1_cmp, HPET_T1_CMP);
+ lost_ints++;
+- } while (!hpet_cnt_ahead(hpet_t1_cmp, hpet_readl(HPET_COUNTER)));
++ } while ((long)(hpet_readl(HPET_COUNTER) - hpet_t1_cmp) > 0);
+
+ if (lost_ints) {
+ if (hpet_rtc_flags & RTC_PIE)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/i387.c linux-2.6.29-rc3.owrt/arch/x86/kernel/i387.c
+--- linux-2.6.29.owrt/arch/x86/kernel/i387.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/i387.c 2009-05-10 23:48:28.000000000 +0200
+@@ -136,7 +136,7 @@
+ #ifdef CONFIG_X86_32
+ if (!HAVE_HWFP) {
+ memset(tsk->thread.xstate, 0, xstate_size);
+- finit_task(tsk);
++ finit();
+ set_stopped_child_used_math(tsk);
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/i8237.c linux-2.6.29-rc3.owrt/arch/x86/kernel/i8237.c
+--- linux-2.6.29.owrt/arch/x86/kernel/i8237.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/i8237.c 2009-05-10 23:48:28.000000000 +0200
+@@ -28,10 +28,10 @@
+
+ flags = claim_dma_lock();
+
+- dma_outb(0, DMA1_RESET_REG);
+- dma_outb(0, DMA2_RESET_REG);
++ dma_outb(DMA1_RESET_REG, 0);
++ dma_outb(DMA2_RESET_REG, 0);
+
+- for (i = 0; i < 8; i++) {
++ for (i = 0;i < 8;i++) {
+ set_dma_addr(i, 0x000000);
+ /* DMA count is a bit weird so this is not 0 */
+ set_dma_count(i, 1);
+@@ -51,14 +51,14 @@
+ }
+
+ static struct sysdev_class i8237_sysdev_class = {
+- .name = "i8237",
+- .suspend = i8237A_suspend,
+- .resume = i8237A_resume,
++ .name = "i8237",
++ .suspend = i8237A_suspend,
++ .resume = i8237A_resume,
+ };
+
+ static struct sys_device device_i8237A = {
+- .id = 0,
+- .cls = &i8237_sysdev_class,
++ .id = 0,
++ .cls = &i8237_sysdev_class,
+ };
+
+ static int __init i8237A_init_sysfs(void)
+@@ -68,4 +68,5 @@
+ error = sysdev_register(&device_i8237A);
+ return error;
+ }
++
+ device_initcall(i8237A_init_sysfs);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/io_apic.c linux-2.6.29-rc3.owrt/arch/x86/kernel/io_apic.c
+--- linux-2.6.29.owrt/arch/x86/kernel/io_apic.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/io_apic.c 2009-05-10 23:48:28.000000000 +0200
+@@ -2528,15 +2528,14 @@
+
+ vector = ~get_irq_regs()->orig_ax;
+ me = smp_processor_id();
+-
+- if (vector == cfg->vector && cpumask_test_cpu(me, cfg->domain)) {
+ #ifdef CONFIG_NUMA_MIGRATE_IRQ_DESC
+ *descp = desc = move_irq_desc(desc, me);
+ /* get the new one */
+ cfg = desc->chip_data;
+ #endif
++
++ if (vector == cfg->vector && cpumask_test_cpu(me, cfg->domain))
+ send_cleanup_vector(cfg);
+- }
+ }
+ #else
+ static inline void irq_complete_move(struct irq_desc **descp) {}
+@@ -3841,24 +3840,14 @@
+
+ void __init probe_nr_irqs_gsi(void)
+ {
++ int idx;
+ int nr = 0;
+
+- nr = acpi_probe_gsi();
+- if (nr > nr_irqs_gsi) {
+- nr_irqs_gsi = nr;
+- } else {
+- /* for acpi=off or acpi is not compiled in */
+- int idx;
+-
+- nr = 0;
+- for (idx = 0; idx < nr_ioapics; idx++)
+- nr += io_apic_get_redir_entries(idx) + 1;
+-
+- if (nr > nr_irqs_gsi)
+- nr_irqs_gsi = nr;
+- }
++ for (idx = 0; idx < nr_ioapics; idx++)
++ nr += io_apic_get_redir_entries(idx) + 1;
+
+- printk(KERN_DEBUG "nr_irqs_gsi: %d\n", nr_irqs_gsi);
++ if (nr > nr_irqs_gsi)
++ nr_irqs_gsi = nr;
+ }
+
+ /* --------------------------------------------------------------------------
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/irqinit_32.c linux-2.6.29-rc3.owrt/arch/x86/kernel/irqinit_32.c
+--- linux-2.6.29.owrt/arch/x86/kernel/irqinit_32.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/irqinit_32.c 2009-05-10 23:48:28.000000000 +0200
+@@ -78,6 +78,15 @@
+ }
+ }
+
++/*
++ * IRQ2 is cascade interrupt to second interrupt controller
++ */
++static struct irqaction irq2 = {
++ .handler = no_action,
++ .mask = CPU_MASK_NONE,
++ .name = "cascade",
++};
++
+ DEFINE_PER_CPU(vector_irq_t, vector_irq) = {
+ [0 ... IRQ0_VECTOR - 1] = -1,
+ [IRQ0_VECTOR] = 0,
+@@ -169,6 +178,9 @@
+ alloc_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt);
+ #endif
+
++ if (!acpi_ioapic)
++ setup_irq(2, &irq2);
++
+ /* setup after call gates are initialised (usually add in
+ * the architecture specific gates)
+ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/kprobes.c linux-2.6.29-rc3.owrt/arch/x86/kernel/kprobes.c
+--- linux-2.6.29.owrt/arch/x86/kernel/kprobes.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/kprobes.c 2009-05-10 23:48:28.000000000 +0200
+@@ -193,9 +193,6 @@
+ kprobe_opcode_t opcode;
+ kprobe_opcode_t *orig_opcodes = opcodes;
+
+- if (search_exception_tables(opcodes))
+- return 0; /* Page fault may occur on this address. */
+-
+ retry:
+ if (opcodes - orig_opcodes > MAX_INSN_SIZE - 1)
+ return 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/olpc.c linux-2.6.29-rc3.owrt/arch/x86/kernel/olpc.c
+--- linux-2.6.29.owrt/arch/x86/kernel/olpc.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/olpc.c 2009-05-10 23:48:28.000000000 +0200
+@@ -203,7 +203,7 @@
+ static void __init platform_detect(void)
+ {
+ /* stopgap until OFW support is added to the kernel */
+- olpc_platform_info.boardrev = olpc_board(0xc2);
++ olpc_platform_info.boardrev = 0xc2;
+ }
+ #endif
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/paravirt.c linux-2.6.29-rc3.owrt/arch/x86/kernel/paravirt.c
+--- linux-2.6.29.owrt/arch/x86/kernel/paravirt.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/paravirt.c 2009-05-10 23:48:28.000000000 +0200
+@@ -268,32 +268,6 @@
+ return __get_cpu_var(paravirt_lazy_mode);
+ }
+
+-void arch_flush_lazy_mmu_mode(void)
+-{
+- preempt_disable();
+-
+- if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU) {
+- WARN_ON(preempt_count() == 1);
+- arch_leave_lazy_mmu_mode();
+- arch_enter_lazy_mmu_mode();
+- }
+-
+- preempt_enable();
+-}
+-
+-void arch_flush_lazy_cpu_mode(void)
+-{
+- preempt_disable();
+-
+- if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_CPU) {
+- WARN_ON(preempt_count() == 1);
+- arch_leave_lazy_cpu_mode();
+- arch_enter_lazy_cpu_mode();
+- }
+-
+- preempt_enable();
+-}
+-
+ struct pv_info pv_info = {
+ .name = "bare hardware",
+ .paravirt_enabled = 0,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/pci-gart_64.c linux-2.6.29-rc3.owrt/arch/x86/kernel/pci-gart_64.c
+--- linux-2.6.29.owrt/arch/x86/kernel/pci-gart_64.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/pci-gart_64.c 2009-05-10 23:48:28.000000000 +0200
+@@ -5,7 +5,7 @@
+ * This allows to use PCI devices that only support 32bit addresses on systems
+ * with more than 4GB.
+ *
+- * See Documentation/PCI/PCI-DMA-mapping.txt for the interface specification.
++ * See Documentation/DMA-mapping.txt for the interface specification.
+ *
+ * Copyright 2002 Andi Kleen, SuSE Labs.
+ * Subject to the GNU General Public License v2 only.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/process_32.c linux-2.6.29-rc3.owrt/arch/x86/kernel/process_32.c
+--- linux-2.6.29.owrt/arch/x86/kernel/process_32.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/process_32.c 2009-05-10 23:48:28.000000000 +0200
+@@ -104,6 +104,9 @@
+ check_pgt_cache();
+ rmb();
+
++ if (rcu_pending(cpu))
++ rcu_check_callbacks(cpu, 0);
++
+ if (cpu_is_offline(cpu))
+ play_dead();
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/process_64.c linux-2.6.29-rc3.owrt/arch/x86/kernel/process_64.c
+--- linux-2.6.29.owrt/arch/x86/kernel/process_64.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/process_64.c 2009-05-10 23:48:28.000000000 +0200
+@@ -40,7 +40,6 @@
+ #include <linux/uaccess.h>
+ #include <linux/io.h>
+ #include <linux/ftrace.h>
+-#include <linux/dmi.h>
+
+ #include <asm/pgtable.h>
+ #include <asm/system.h>
+@@ -152,18 +151,14 @@
+ unsigned long d0, d1, d2, d3, d6, d7;
+ unsigned int fsindex, gsindex;
+ unsigned int ds, cs, es;
+- const char *board;
+
+ printk("\n");
+ print_modules();
+- board = dmi_get_system_info(DMI_PRODUCT_NAME);
+- if (!board)
+- board = "";
+- printk(KERN_INFO "Pid: %d, comm: %.20s %s %s %.*s %s\n",
++ printk(KERN_INFO "Pid: %d, comm: %.20s %s %s %.*s\n",
+ current->pid, current->comm, print_tainted(),
+ init_utsname()->release,
+ (int)strcspn(init_utsname()->version, " "),
+- init_utsname()->version, board);
++ init_utsname()->version);
+ printk(KERN_INFO "RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->ip);
+ printk_address(regs->ip, 1);
+ printk(KERN_INFO "RSP: %04lx:%016lx EFLAGS: %08lx\n", regs->ss,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/process.c linux-2.6.29-rc3.owrt/arch/x86/kernel/process.c
+--- linux-2.6.29.owrt/arch/x86/kernel/process.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/process.c 2009-05-10 23:48:28.000000000 +0200
+@@ -180,9 +180,6 @@
+
+ trace_power_start(&it, POWER_CSTATE, (ax>>4)+1);
+ if (!need_resched()) {
+- if (cpu_has(&current_cpu_data, X86_FEATURE_CLFLUSH_MONITOR))
+- clflush((void *)&current_thread_info()->flags);
+-
+ __monitor((void *)&current_thread_info()->flags, 0, 0);
+ smp_mb();
+ if (!need_resched())
+@@ -197,9 +194,6 @@
+ struct power_trace it;
+ if (!need_resched()) {
+ trace_power_start(&it, POWER_CSTATE, 1);
+- if (cpu_has(&current_cpu_data, X86_FEATURE_CLFLUSH_MONITOR))
+- clflush((void *)&current_thread_info()->flags);
+-
+ __monitor((void *)&current_thread_info()->flags, 0, 0);
+ smp_mb();
+ if (!need_resched())
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/ptrace.c linux-2.6.29-rc3.owrt/arch/x86/kernel/ptrace.c
+--- linux-2.6.29.owrt/arch/x86/kernel/ptrace.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/ptrace.c 2009-05-10 23:48:28.000000000 +0200
+@@ -810,16 +810,12 @@
+
+ static void ptrace_bts_detach(struct task_struct *child)
+ {
+- /*
+- * Ptrace_detach() races with ptrace_untrace() in case
+- * the child dies and is reaped by another thread.
+- *
+- * We only do the memory accounting at this point and
+- * leave the buffer deallocation and the bts tracer
+- * release to ptrace_bts_untrace() which will be called
+- * later on with tasklist_lock held.
+- */
+- release_locked_buffer(child->bts_buffer, child->bts_size);
++ if (unlikely(child->bts)) {
++ ds_release_bts(child->bts);
++ child->bts = NULL;
++
++ ptrace_bts_free_buffer(child);
++ }
+ }
+ #else
+ static inline void ptrace_bts_fork(struct task_struct *tsk) {}
+@@ -1388,7 +1384,7 @@
+ #ifdef CONFIG_X86_32
+ # define IS_IA32 1
+ #elif defined CONFIG_IA32_EMULATION
+-# define IS_IA32 is_compat_task()
++# define IS_IA32 test_thread_flag(TIF_IA32)
+ #else
+ # define IS_IA32 0
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/reboot.c linux-2.6.29-rc3.owrt/arch/x86/kernel/reboot.c
+--- linux-2.6.29.owrt/arch/x86/kernel/reboot.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/reboot.c 2009-05-10 23:48:28.000000000 +0200
+@@ -217,14 +217,6 @@
+ DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq"),
+ },
+ },
+- { /* Handle problems with rebooting on Dell XPS710 */
+- .callback = set_bios_reboot,
+- .ident = "Dell XPS710",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+- DMI_MATCH(DMI_PRODUCT_NAME, "Dell XPS710"),
+- },
+- },
+ { }
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/setup.c linux-2.6.29-rc3.owrt/arch/x86/kernel/setup.c
+--- linux-2.6.29.owrt/arch/x86/kernel/setup.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/setup.c 2009-05-10 23:48:28.000000000 +0200
+@@ -607,7 +607,7 @@
+ static int __init dmi_low_memory_corruption(const struct dmi_system_id *d)
+ {
+ printk(KERN_NOTICE
+- "%s detected: BIOS may corrupt low RAM, working around it.\n",
++ "%s detected: BIOS may corrupt low RAM, working it around.\n",
+ d->ident);
+
+ e820_update_range(0, 0x10000, E820_RAM, E820_RESERVED);
+@@ -770,9 +770,6 @@
+
+ finish_e820_parsing();
+
+- if (efi_enabled)
+- efi_init();
+-
+ dmi_scan_machine();
+
+ dmi_check_system(bad_bios_dmi_table);
+@@ -792,6 +789,8 @@
+ insert_resource(&iomem_resource, &data_resource);
+ insert_resource(&iomem_resource, &bss_resource);
+
++ if (efi_enabled)
++ efi_init();
+
+ #ifdef CONFIG_X86_32
+ if (ppro_with_ram_bug()) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/time_64.c linux-2.6.29-rc3.owrt/arch/x86/kernel/time_64.c
+--- linux-2.6.29.owrt/arch/x86/kernel/time_64.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/time_64.c 2009-05-10 23:48:28.000000000 +0200
+@@ -115,7 +115,7 @@
+
+ static struct irqaction irq0 = {
+ .handler = timer_interrupt,
+- .flags = IRQF_DISABLED | IRQF_IRQPOLL | IRQF_NOBALANCING | IRQF_TIMER,
++ .flags = IRQF_DISABLED | IRQF_IRQPOLL | IRQF_NOBALANCING,
+ .mask = CPU_MASK_NONE,
+ .name = "timer"
+ };
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/traps.c linux-2.6.29-rc3.owrt/arch/x86/kernel/traps.c
+--- linux-2.6.29.owrt/arch/x86/kernel/traps.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/traps.c 2009-05-10 23:48:28.000000000 +0200
+@@ -99,12 +99,6 @@
+ local_irq_enable();
+ }
+
+-static inline void conditional_cli(struct pt_regs *regs)
+-{
+- if (regs->flags & X86_EFLAGS_IF)
+- local_irq_disable();
+-}
+-
+ static inline void preempt_conditional_cli(struct pt_regs *regs)
+ {
+ if (regs->flags & X86_EFLAGS_IF)
+@@ -632,10 +626,8 @@
+
+ #ifdef CONFIG_X86_32
+ debug_vm86:
+- /* reenable preemption: handle_vm86_trap() might sleep */
+- dec_preempt_count();
+ handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, 1);
+- conditional_cli(regs);
++ preempt_conditional_cli(regs);
+ return;
+ #endif
+
+@@ -904,7 +896,7 @@
+ EXPORT_SYMBOL_GPL(math_state_restore);
+
+ #ifndef CONFIG_MATH_EMULATION
+-void math_emulate(struct math_emu_info *info)
++asmlinkage void math_emulate(long arg)
+ {
+ printk(KERN_EMERG
+ "math-emulation not enabled and no coprocessor found.\n");
+@@ -914,19 +906,16 @@
+ }
+ #endif /* CONFIG_MATH_EMULATION */
+
+-dotraplinkage void __kprobes do_device_not_available(struct pt_regs regs)
++dotraplinkage void __kprobes
++do_device_not_available(struct pt_regs *regs, long error)
+ {
+ #ifdef CONFIG_X86_32
+ if (read_cr0() & X86_CR0_EM) {
+- struct math_emu_info info = { };
+-
+- conditional_sti(&regs);
+-
+- info.regs = &regs;
+- math_emulate(&info);
++ conditional_sti(regs);
++ math_emulate(0);
+ } else {
+ math_state_restore(); /* interrupts still off */
+- conditional_sti(&regs);
++ conditional_sti(regs);
+ }
+ #else
+ math_state_restore();
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/tsc.c linux-2.6.29-rc3.owrt/arch/x86/kernel/tsc.c
+--- linux-2.6.29.owrt/arch/x86/kernel/tsc.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/tsc.c 2009-05-10 23:48:28.000000000 +0200
+@@ -273,43 +273,30 @@
+ * use the TSC value at the transitions to calculate a pretty
+ * good value for the TSC frequencty.
+ */
+-static inline int pit_expect_msb(unsigned char val, u64 *tscp, unsigned long *deltap)
++static inline int pit_expect_msb(unsigned char val)
+ {
+- int count;
+- u64 tsc = 0;
++ int count = 0;
+
+ for (count = 0; count < 50000; count++) {
+ /* Ignore LSB */
+ inb(0x42);
+ if (inb(0x42) != val)
+ break;
+- tsc = get_cycles();
+ }
+- *deltap = get_cycles() - tsc;
+- *tscp = tsc;
+-
+- /*
+- * We require _some_ success, but the quality control
+- * will be based on the error terms on the TSC values.
+- */
+- return count > 5;
++ return count > 50;
+ }
+
+ /*
+- * How many MSB values do we want to see? We aim for
+- * a maximum error rate of 500ppm (in practice the
+- * real error is much smaller), but refuse to spend
+- * more than 25ms on it.
++ * How many MSB values do we want to see? We aim for a
++ * 15ms calibration, which assuming a 2us counter read
++ * error should give us roughly 150 ppm precision for
++ * the calibration.
+ */
+-#define MAX_QUICK_PIT_MS 25
+-#define MAX_QUICK_PIT_ITERATIONS (MAX_QUICK_PIT_MS * PIT_TICK_RATE / 1000 / 256)
++#define QUICK_PIT_MS 15
++#define QUICK_PIT_ITERATIONS (QUICK_PIT_MS * PIT_TICK_RATE / 1000 / 256)
+
+ static unsigned long quick_pit_calibrate(void)
+ {
+- int i;
+- u64 tsc, delta;
+- unsigned long d1, d2;
+-
+ /* Set the Gate high, disable speaker */
+ outb((inb(0x61) & ~0x02) | 0x01, 0x61);
+
+@@ -328,52 +315,45 @@
+ outb(0xff, 0x42);
+ outb(0xff, 0x42);
+
+- /*
+- * The PIT starts counting at the next edge, so we
+- * need to delay for a microsecond. The easiest way
+- * to do that is to just read back the 16-bit counter
+- * once from the PIT.
+- */
+- inb(0x42);
+- inb(0x42);
+-
+- if (pit_expect_msb(0xff, &tsc, &d1)) {
+- for (i = 1; i <= MAX_QUICK_PIT_ITERATIONS; i++) {
+- if (!pit_expect_msb(0xff-i, &delta, &d2))
+- break;
+-
+- /*
+- * Iterate until the error is less than 500 ppm
+- */
+- delta -= tsc;
+- if (d1+d2 < delta >> 11)
+- goto success;
++ if (pit_expect_msb(0xff)) {
++ int i;
++ u64 t1, t2, delta;
++ unsigned char expect = 0xfe;
++
++ t1 = get_cycles();
++ for (i = 0; i < QUICK_PIT_ITERATIONS; i++, expect--) {
++ if (!pit_expect_msb(expect))
++ goto failed;
+ }
++ t2 = get_cycles();
++
++ /*
++ * Make sure we can rely on the second TSC timestamp:
++ */
++ if (!pit_expect_msb(expect))
++ goto failed;
++
++ /*
++ * Ok, if we get here, then we've seen the
++ * MSB of the PIT decrement QUICK_PIT_ITERATIONS
++ * times, and each MSB had many hits, so we never
++ * had any sudden jumps.
++ *
++ * As a result, we can depend on there not being
++ * any odd delays anywhere, and the TSC reads are
++ * reliable.
++ *
++ * kHz = ticks / time-in-seconds / 1000;
++ * kHz = (t2 - t1) / (QPI * 256 / PIT_TICK_RATE) / 1000
++ * kHz = ((t2 - t1) * PIT_TICK_RATE) / (QPI * 256 * 1000)
++ */
++ delta = (t2 - t1)*PIT_TICK_RATE;
++ do_div(delta, QUICK_PIT_ITERATIONS*256*1000);
++ printk("Fast TSC calibration using PIT\n");
++ return delta;
+ }
+- printk("Fast TSC calibration failed\n");
++failed:
+ return 0;
+-
+-success:
+- /*
+- * Ok, if we get here, then we've seen the
+- * MSB of the PIT decrement 'i' times, and the
+- * error has shrunk to less than 500 ppm.
+- *
+- * As a result, we can depend on there not being
+- * any odd delays anywhere, and the TSC reads are
+- * reliable (within the error). We also adjust the
+- * delta to the middle of the error bars, just
+- * because it looks nicer.
+- *
+- * kHz = ticks / time-in-seconds / 1000;
+- * kHz = (t2 - t1) / (I * 256 / PIT_TICK_RATE) / 1000
+- * kHz = ((t2 - t1) * PIT_TICK_RATE) / (I * 256 * 1000)
+- */
+- delta += (long)(d2 - d1)/2;
+- delta *= PIT_TICK_RATE;
+- do_div(delta, i*256*1000);
+- printk("Fast TSC calibration using PIT\n");
+- return delta;
+ }
+
+ /**
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/vmi_32.c linux-2.6.29-rc3.owrt/arch/x86/kernel/vmi_32.c
+--- linux-2.6.29.owrt/arch/x86/kernel/vmi_32.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/vmi_32.c 2009-05-10 23:48:28.000000000 +0200
+@@ -321,16 +321,6 @@
+ }
+
+ /*
+- * We use the pgd_free hook for releasing the pgd page:
+- */
+-static void vmi_pgd_free(struct mm_struct *mm, pgd_t *pgd)
+-{
+- unsigned long pfn = __pa(pgd) >> PAGE_SHIFT;
+-
+- vmi_ops.release_page(pfn, VMI_PAGE_L2);
+-}
+-
+-/*
+ * Helper macros for MMU update flags. We can defer updates until a flush
+ * or page invalidation only if the update is to the current address space
+ * (otherwise, there is no flush). We must check against init_mm, since
+@@ -772,7 +762,6 @@
+ if (vmi_ops.release_page) {
+ pv_mmu_ops.release_pte = vmi_release_pte;
+ pv_mmu_ops.release_pmd = vmi_release_pmd;
+- pv_mmu_ops.pgd_free = vmi_pgd_free;
+ }
+
+ /* Set linear is needed in all cases */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kernel/vmiclock_32.c linux-2.6.29-rc3.owrt/arch/x86/kernel/vmiclock_32.c
+--- linux-2.6.29.owrt/arch/x86/kernel/vmiclock_32.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kernel/vmiclock_32.c 2009-05-10 23:48:28.000000000 +0200
+@@ -202,7 +202,7 @@
+ static struct irqaction vmi_clock_action = {
+ .name = "vmi-timer",
+ .handler = vmi_timer_interrupt,
+- .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_TIMER,
++ .flags = IRQF_DISABLED | IRQF_NOBALANCING,
+ .mask = CPU_MASK_ALL,
+ };
+
+@@ -283,13 +283,10 @@
+ #endif
+
+ /** vmi clocksource */
+-static struct clocksource clocksource_vmi;
+
+ static cycle_t read_real_cycles(void)
+ {
+- cycle_t ret = (cycle_t)vmi_timer_ops.get_cycle_counter(VMI_CYCLES_REAL);
+- return ret >= clocksource_vmi.cycle_last ?
+- ret : clocksource_vmi.cycle_last;
++ return vmi_timer_ops.get_cycle_counter(VMI_CYCLES_REAL);
+ }
+
+ static struct clocksource clocksource_vmi = {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kvm/i8254.c linux-2.6.29-rc3.owrt/arch/x86/kvm/i8254.c
+--- linux-2.6.29.owrt/arch/x86/kvm/i8254.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kvm/i8254.c 2009-05-10 23:48:28.000000000 +0200
+@@ -207,7 +207,7 @@
+ hrtimer_add_expires_ns(&pt->timer, pt->period);
+ pt->scheduled = hrtimer_get_expires_ns(&pt->timer);
+ if (pt->period)
+- ps->channels[0].count_load_time = ktime_get();
++ ps->channels[0].count_load_time = hrtimer_get_expires(&pt->timer);
+
+ return (pt->period == 0 ? 0 : 1);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kvm/irq.c linux-2.6.29-rc3.owrt/arch/x86/kvm/irq.c
+--- linux-2.6.29.owrt/arch/x86/kvm/irq.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kvm/irq.c 2009-05-10 23:48:28.000000000 +0200
+@@ -87,6 +87,13 @@
+ }
+ EXPORT_SYMBOL_GPL(kvm_inject_pending_timer_irqs);
+
++void kvm_timer_intr_post(struct kvm_vcpu *vcpu, int vec)
++{
++ kvm_apic_timer_intr_post(vcpu, vec);
++ /* TODO: PIT, RTC etc. */
++}
++EXPORT_SYMBOL_GPL(kvm_timer_intr_post);
++
+ void __kvm_migrate_timers(struct kvm_vcpu *vcpu)
+ {
+ __kvm_migrate_apic_timer(vcpu);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kvm/irq.h linux-2.6.29-rc3.owrt/arch/x86/kvm/irq.h
+--- linux-2.6.29.owrt/arch/x86/kvm/irq.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kvm/irq.h 2009-05-10 23:48:28.000000000 +0200
+@@ -89,6 +89,7 @@
+
+ void kvm_pic_reset(struct kvm_kpic_state *s);
+
++void kvm_timer_intr_post(struct kvm_vcpu *vcpu, int vec);
+ void kvm_inject_pending_timer_irqs(struct kvm_vcpu *vcpu);
+ void kvm_inject_apic_timer_irqs(struct kvm_vcpu *vcpu);
+ void kvm_apic_nmi_wd_deliver(struct kvm_vcpu *vcpu);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kvm/lapic.c linux-2.6.29-rc3.owrt/arch/x86/kvm/lapic.c
+--- linux-2.6.29.owrt/arch/x86/kvm/lapic.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kvm/lapic.c 2009-05-10 23:48:28.000000000 +0200
+@@ -35,12 +35,6 @@
+ #include "kvm_cache_regs.h"
+ #include "irq.h"
+
+-#ifndef CONFIG_X86_64
+-#define mod_64(x, y) ((x) - (y) * div64_u64(x, y))
+-#else
+-#define mod_64(x, y) ((x) % (y))
+-#endif
+-
+ #define PRId64 "d"
+ #define PRIx64 "llx"
+ #define PRIu64 "u"
+@@ -517,22 +511,52 @@
+
+ static u32 apic_get_tmcct(struct kvm_lapic *apic)
+ {
+- ktime_t remaining;
+- s64 ns;
++ u64 counter_passed;
++ ktime_t passed, now;
+ u32 tmcct;
+
+ ASSERT(apic != NULL);
+
++ now = apic->timer.dev.base->get_time();
++ tmcct = apic_get_reg(apic, APIC_TMICT);
++
+ /* if initial count is 0, current count should also be 0 */
+- if (apic_get_reg(apic, APIC_TMICT) == 0)
++ if (tmcct == 0)
+ return 0;
+
+- remaining = hrtimer_expires_remaining(&apic->timer.dev);
+- if (ktime_to_ns(remaining) < 0)
+- remaining = ktime_set(0, 0);
+-
+- ns = mod_64(ktime_to_ns(remaining), apic->timer.period);
+- tmcct = div64_u64(ns, (APIC_BUS_CYCLE_NS * apic->timer.divide_count));
++ if (unlikely(ktime_to_ns(now) <=
++ ktime_to_ns(apic->timer.last_update))) {
++ /* Wrap around */
++ passed = ktime_add(( {
++ (ktime_t) {
++ .tv64 = KTIME_MAX -
++ (apic->timer.last_update).tv64}; }
++ ), now);
++ apic_debug("time elapsed\n");
++ } else
++ passed = ktime_sub(now, apic->timer.last_update);
++
++ counter_passed = div64_u64(ktime_to_ns(passed),
++ (APIC_BUS_CYCLE_NS * apic->timer.divide_count));
++
++ if (counter_passed > tmcct) {
++ if (unlikely(!apic_lvtt_period(apic))) {
++ /* one-shot timers stick at 0 until reset */
++ tmcct = 0;
++ } else {
++ /*
++ * periodic timers reset to APIC_TMICT when they
++ * hit 0. The while loop simulates this happening N
++ * times. (counter_passed %= tmcct) would also work,
++ * but might be slower or not work on 32-bit??
++ */
++ while (counter_passed > tmcct)
++ counter_passed -= tmcct;
++ tmcct -= counter_passed;
++ }
++ } else {
++ tmcct -= counter_passed;
++ }
+
+ return tmcct;
+ }
+@@ -629,6 +653,8 @@
+ {
+ ktime_t now = apic->timer.dev.base->get_time();
+
++ apic->timer.last_update = now;
++
+ apic->timer.period = apic_get_reg(apic, APIC_TMICT) *
+ APIC_BUS_CYCLE_NS * apic->timer.divide_count;
+ atomic_set(&apic->timer.pending, 0);
+@@ -1084,6 +1110,16 @@
+ }
+ }
+
++void kvm_apic_timer_intr_post(struct kvm_vcpu *vcpu, int vec)
++{
++ struct kvm_lapic *apic = vcpu->arch.apic;
++
++ if (apic && apic_lvt_vector(apic, APIC_LVTT) == vec)
++ apic->timer.last_update = ktime_add_ns(
++ apic->timer.last_update,
++ apic->timer.period);
++}
++
+ int kvm_get_apic_interrupt(struct kvm_vcpu *vcpu)
+ {
+ int vector = kvm_apic_has_interrupt(vcpu);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kvm/lapic.h linux-2.6.29-rc3.owrt/arch/x86/kvm/lapic.h
+--- linux-2.6.29.owrt/arch/x86/kvm/lapic.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kvm/lapic.h 2009-05-10 23:48:28.000000000 +0200
+@@ -12,6 +12,7 @@
+ atomic_t pending;
+ s64 period; /* unit: ns */
+ u32 divide_count;
++ ktime_t last_update;
+ struct hrtimer dev;
+ } timer;
+ struct kvm_vcpu *vcpu;
+@@ -41,6 +42,7 @@
+ void kvm_apic_post_state_restore(struct kvm_vcpu *vcpu);
+ int kvm_lapic_enabled(struct kvm_vcpu *vcpu);
+ int kvm_lapic_find_highest_irr(struct kvm_vcpu *vcpu);
++void kvm_apic_timer_intr_post(struct kvm_vcpu *vcpu, int vec);
+
+ void kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr);
+ void kvm_lapic_sync_from_vapic(struct kvm_vcpu *vcpu);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kvm/mmu.c linux-2.6.29-rc3.owrt/arch/x86/kvm/mmu.c
+--- linux-2.6.29.owrt/arch/x86/kvm/mmu.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kvm/mmu.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1698,13 +1698,8 @@
+ if (largepage)
+ spte |= PT_PAGE_SIZE_MASK;
+ if (mt_mask) {
+- if (!kvm_is_mmio_pfn(pfn)) {
+- mt_mask = get_memory_type(vcpu, gfn) <<
+- kvm_x86_ops->get_mt_mask_shift();
+- mt_mask |= VMX_EPT_IGMT_BIT;
+- } else
+- mt_mask = MTRR_TYPE_UNCACHABLE <<
+- kvm_x86_ops->get_mt_mask_shift();
++ mt_mask = get_memory_type(vcpu, gfn) <<
++ kvm_x86_ops->get_mt_mask_shift();
+ spte |= mt_mask;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kvm/svm.c linux-2.6.29-rc3.owrt/arch/x86/kvm/svm.c
+--- linux-2.6.29.owrt/arch/x86/kvm/svm.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kvm/svm.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1600,6 +1600,7 @@
+ /* Okay, we can deliver the interrupt: grab it and update PIC state. */
+ intr_vector = kvm_cpu_get_interrupt(vcpu);
+ svm_inject_irq(svm, intr_vector);
++ kvm_timer_intr_post(vcpu, intr_vector);
+ out:
+ update_cr8_intercept(vcpu);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kvm/vmx.c linux-2.6.29-rc3.owrt/arch/x86/kvm/vmx.c
+--- linux-2.6.29.owrt/arch/x86/kvm/vmx.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kvm/vmx.c 2009-05-10 23:48:28.000000000 +0200
+@@ -903,7 +903,6 @@
+ data = vmcs_readl(GUEST_SYSENTER_ESP);
+ break;
+ default:
+- vmx_load_host_state(to_vmx(vcpu));
+ msr = find_msr_entry(to_vmx(vcpu), msr_index);
+ if (msr) {
+ data = msr->data;
+@@ -3286,6 +3285,7 @@
+ }
+ if (vcpu->arch.interrupt.pending) {
+ vmx_inject_irq(vcpu, vcpu->arch.interrupt.nr);
++ kvm_timer_intr_post(vcpu, vcpu->arch.interrupt.nr);
+ if (kvm_cpu_has_interrupt(vcpu))
+ enable_irq_window(vcpu);
+ }
+@@ -3687,7 +3687,8 @@
+ if (vm_need_ept()) {
+ bypass_guest_pf = 0;
+ kvm_mmu_set_base_ptes(VMX_EPT_READABLE_MASK |
+- VMX_EPT_WRITABLE_MASK);
++ VMX_EPT_WRITABLE_MASK |
++ VMX_EPT_IGMT_BIT);
+ kvm_mmu_set_mask_ptes(0ull, 0ull, 0ull, 0ull,
+ VMX_EPT_EXECUTABLE_MASK,
+ VMX_EPT_DEFAULT_MT << VMX_EPT_MT_EPTE_SHIFT);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/kvm/x86.c linux-2.6.29-rc3.owrt/arch/x86/kvm/x86.c
+--- linux-2.6.29.owrt/arch/x86/kvm/x86.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/kvm/x86.c 2009-05-10 23:48:28.000000000 +0200
+@@ -967,6 +967,7 @@
+ case KVM_CAP_MMU_SHADOW_CACHE_CONTROL:
+ case KVM_CAP_SET_TSS_ADDR:
+ case KVM_CAP_EXT_CPUID:
++ case KVM_CAP_CLOCKSOURCE:
+ case KVM_CAP_PIT:
+ case KVM_CAP_NOP_IO_DELAY:
+ case KVM_CAP_MP_STATE:
+@@ -991,9 +992,6 @@
+ case KVM_CAP_IOMMU:
+ r = iommu_found();
+ break;
+- case KVM_CAP_CLOCKSOURCE:
+- r = boot_cpu_has(X86_FEATURE_CONSTANT_TSC);
+- break;
+ default:
+ r = 0;
+ break;
+@@ -4129,13 +4127,9 @@
+
+ }
+
+-void kvm_arch_sync_events(struct kvm *kvm)
+-{
+- kvm_free_all_assigned_devices(kvm);
+-}
+-
+ void kvm_arch_destroy_vm(struct kvm *kvm)
+ {
++ kvm_free_all_assigned_devices(kvm);
+ kvm_iommu_unmap_guest(kvm);
+ kvm_free_pit(kvm);
+ kfree(kvm->arch.vpic);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/lguest/boot.c linux-2.6.29-rc3.owrt/arch/x86/lguest/boot.c
+--- linux-2.6.29.owrt/arch/x86/lguest/boot.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/lguest/boot.c 2009-05-10 23:48:28.000000000 +0200
+@@ -343,11 +343,6 @@
+ * flush_tlb_user() for both user and kernel mappings unless
+ * the Page Global Enable (PGE) feature bit is set. */
+ *dx |= 0x00002000;
+- /* We also lie, and say we're family id 5. 6 or greater
+- * leads to a rdmsr in early_init_intel which we can't handle.
+- * Family ID is returned as bits 8-12 in ax. */
+- *ax &= 0xFFFFF0FF;
+- *ax |= 0x00000500;
+ break;
+ case 0x80000000:
+ /* Futureproof this a little: if they ask how much extended
+@@ -594,21 +589,19 @@
+ /* Some systems map "vectors" to interrupts weirdly. Lguest has
+ * a straightforward 1 to 1 mapping, so force that here. */
+ __get_cpu_var(vector_irq)[vector] = i;
+- if (vector != SYSCALL_VECTOR)
+- set_intr_gate(vector, interrupt[i]);
++ if (vector != SYSCALL_VECTOR) {
++ set_intr_gate(vector,
++ interrupt[vector-FIRST_EXTERNAL_VECTOR]);
++ set_irq_chip_and_handler_name(i, &lguest_irq_controller,
++ handle_level_irq,
++ "level");
++ }
+ }
+ /* This call is required to set up for 4k stacks, where we have
+ * separate stacks for hard and soft interrupts. */
+ irq_ctx_init(smp_processor_id());
+ }
+
+-void lguest_setup_irq(unsigned int irq)
+-{
+- irq_to_desc_alloc_cpu(irq, 0);
+- set_irq_chip_and_handler_name(irq, &lguest_irq_controller,
+- handle_level_irq, "level");
+-}
+-
+ /*
+ * Time.
+ *
+@@ -938,7 +931,7 @@
+ * that we can fit comfortably.
+ *
+ * First we need assembly templates of each of the patchable Guest operations,
+- * and these are in i386_head.S. */
++ * and these are in lguest_asm.S. */
+
+ /*G:060 We construct a table from the assembler templates: */
+ static const struct lguest_insns
+@@ -1100,7 +1093,7 @@
+ acpi_ht = 0;
+ #endif
+
+- /* We set the preferred console to "hvc". This is the "hypervisor
++ /* We set the perferred console to "hvc". This is the "hypervisor
+ * virtual console" driver written by the PowerPC people, which we also
+ * adapted for lguest's use. */
+ add_preferred_console("hvc", 0, NULL);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/mach-default/setup.c linux-2.6.29-rc3.owrt/arch/x86/mach-default/setup.c
+--- linux-2.6.29.owrt/arch/x86/mach-default/setup.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/mach-default/setup.c 2009-05-10 23:48:28.000000000 +0200
+@@ -38,15 +38,6 @@
+ init_ISA_irqs();
+ }
+
+-/*
+- * IRQ2 is cascade interrupt to second interrupt controller
+- */
+-static struct irqaction irq2 = {
+- .handler = no_action,
+- .mask = CPU_MASK_NONE,
+- .name = "cascade",
+-};
+-
+ /**
+ * intr_init_hook - post gate setup interrupt initialisation
+ *
+@@ -62,9 +53,6 @@
+ if (x86_quirks->arch_intr_init())
+ return;
+ }
+- if (!acpi_ioapic)
+- setup_irq(2, &irq2);
+-
+ }
+
+ /**
+@@ -96,7 +84,7 @@
+
+ static struct irqaction irq0 = {
+ .handler = timer_interrupt,
+- .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER,
++ .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL,
+ .mask = CPU_MASK_NONE,
+ .name = "timer"
+ };
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/mach-voyager/setup.c linux-2.6.29-rc3.owrt/arch/x86/mach-voyager/setup.c
+--- linux-2.6.29.owrt/arch/x86/mach-voyager/setup.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/mach-voyager/setup.c 2009-05-10 23:48:28.000000000 +0200
+@@ -33,30 +33,20 @@
+ setup_irq(2, &irq2);
+ }
+
+-static void voyager_disable_tsc(void)
++void __init pre_setup_arch_hook(void)
+ {
+ /* Voyagers run their CPUs from independent clocks, so disable
+ * the TSC code because we can't sync them */
+ setup_clear_cpu_cap(X86_FEATURE_TSC);
+ }
+
+-void __init pre_setup_arch_hook(void)
+-{
+- voyager_disable_tsc();
+-}
+-
+-void __init pre_time_init_hook(void)
+-{
+- voyager_disable_tsc();
+-}
+-
+ void __init trap_init_hook(void)
+ {
+ }
+
+ static struct irqaction irq0 = {
+ .handler = timer_interrupt,
+- .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER,
++ .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL,
+ .mask = CPU_MASK_NONE,
+ .name = "timer"
+ };
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/mach-voyager/voyager_smp.c linux-2.6.29-rc3.owrt/arch/x86/mach-voyager/voyager_smp.c
+--- linux-2.6.29.owrt/arch/x86/mach-voyager/voyager_smp.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/mach-voyager/voyager_smp.c 2009-05-10 23:48:28.000000000 +0200
+@@ -65,7 +65,7 @@
+
+ /* Bitmask of CPUs present in the system - exported by i386_syms.c, used
+ * by scheduler but indexed physically */
+-static cpumask_t voyager_phys_cpu_present_map = CPU_MASK_NONE;
++cpumask_t phys_cpu_present_map = CPU_MASK_NONE;
+
+ /* The internal functions */
+ static void send_CPI(__u32 cpuset, __u8 cpi);
+@@ -81,7 +81,7 @@
+ static void disable_local_vic_irq(unsigned int irq);
+ static void before_handle_vic_irq(unsigned int irq);
+ static void after_handle_vic_irq(unsigned int irq);
+-static void set_vic_irq_affinity(unsigned int irq, const struct cpumask *mask);
++static void set_vic_irq_affinity(unsigned int irq, cpumask_t mask);
+ static void ack_vic_irq(unsigned int irq);
+ static void vic_enable_cpi(void);
+ static void do_boot_cpu(__u8 cpuid);
+@@ -211,6 +211,8 @@
+ static cpumask_t smp_commenced_mask = CPU_MASK_NONE;
+
+ /* This is for the new dynamic CPU boot code */
++cpumask_t cpu_callin_map = CPU_MASK_NONE;
++cpumask_t cpu_callout_map = CPU_MASK_NONE;
+
+ /* The per processor IRQ masks (these are usually kept in sync) */
+ static __u16 vic_irq_mask[NR_CPUS] __cacheline_aligned;
+@@ -366,19 +368,19 @@
+ /* set up everything for just this CPU, we can alter
+ * this as we start the other CPUs later */
+ /* now get the CPU disposition from the extended CMOS */
+- cpus_addr(voyager_phys_cpu_present_map)[0] =
++ cpus_addr(phys_cpu_present_map)[0] =
+ voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK);
+- cpus_addr(voyager_phys_cpu_present_map)[0] |=
++ cpus_addr(phys_cpu_present_map)[0] |=
+ voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK + 1) << 8;
+- cpus_addr(voyager_phys_cpu_present_map)[0] |=
++ cpus_addr(phys_cpu_present_map)[0] |=
+ voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK +
+ 2) << 16;
+- cpus_addr(voyager_phys_cpu_present_map)[0] |=
++ cpus_addr(phys_cpu_present_map)[0] |=
+ voyager_extended_cmos_read(VOYAGER_PROCESSOR_PRESENT_MASK +
+ 3) << 24;
+- init_cpu_possible(&voyager_phys_cpu_present_map);
+- printk("VOYAGER SMP: voyager_phys_cpu_present_map = 0x%lx\n",
+- cpus_addr(voyager_phys_cpu_present_map)[0]);
++ cpu_possible_map = phys_cpu_present_map;
++ printk("VOYAGER SMP: phys_cpu_present_map = 0x%lx\n",
++ cpus_addr(phys_cpu_present_map)[0]);
+ /* Here we set up the VIC to enable SMP */
+ /* enable the CPIs by writing the base vector to their register */
+ outb(VIC_DEFAULT_CPI_BASE, VIC_CPI_BASE_REGISTER);
+@@ -628,15 +630,15 @@
+ /* now that the cat has probed the Voyager System Bus, sanity
+ * check the cpu map */
+ if (((voyager_quad_processors | voyager_extended_vic_processors)
+- & cpus_addr(voyager_phys_cpu_present_map)[0]) !=
+- cpus_addr(voyager_phys_cpu_present_map)[0]) {
++ & cpus_addr(phys_cpu_present_map)[0]) !=
++ cpus_addr(phys_cpu_present_map)[0]) {
+ /* should panic */
+ printk("\n\n***WARNING*** "
+ "Sanity check of CPU present map FAILED\n");
+ }
+ } else if (voyager_level == 4)
+ voyager_extended_vic_processors =
+- cpus_addr(voyager_phys_cpu_present_map)[0];
++ cpus_addr(phys_cpu_present_map)[0];
+
+ /* this sets up the idle task to run on the current cpu */
+ voyager_extended_cpus = 1;
+@@ -670,7 +672,7 @@
+ /* loop over all the extended VIC CPUs and boot them. The
+ * Quad CPUs must be bootstrapped by their extended VIC cpu */
+ for (i = 0; i < nr_cpu_ids; i++) {
+- if (i == boot_cpu_id || !cpu_isset(i, voyager_phys_cpu_present_map))
++ if (i == boot_cpu_id || !cpu_isset(i, phys_cpu_present_map))
+ continue;
+ do_boot_cpu(i);
+ /* This udelay seems to be needed for the Quad boots
+@@ -1597,16 +1599,16 @@
+ * change the mask and then do an interrupt enable CPI to re-enable on
+ * the selected processors */
+
+-void set_vic_irq_affinity(unsigned int irq, const struct cpumask *mask)
++void set_vic_irq_affinity(unsigned int irq, cpumask_t mask)
+ {
+ /* Only extended processors handle interrupts */
+ unsigned long real_mask;
+ unsigned long irq_mask = 1 << irq;
+ int cpu;
+
+- real_mask = cpus_addr(*mask)[0] & voyager_extended_vic_processors;
++ real_mask = cpus_addr(mask)[0] & voyager_extended_vic_processors;
+
+- if (cpus_addr(*mask)[0] == 0)
++ if (cpus_addr(mask)[0] == 0)
+ /* can't have no CPUs to accept the interrupt -- extremely
+ * bad things will happen */
+ return;
+@@ -1748,11 +1750,10 @@
+ init_gdt(smp_processor_id());
+ switch_to_new_gdt();
+
+- cpu_online_map = cpumask_of_cpu(smp_processor_id());
+- cpu_callout_map = cpumask_of_cpu(smp_processor_id());
+- cpu_callin_map = CPU_MASK_NONE;
+- cpu_present_map = cpumask_of_cpu(smp_processor_id());
+-
++ cpu_set(smp_processor_id(), cpu_online_map);
++ cpu_set(smp_processor_id(), cpu_callout_map);
++ cpu_set(smp_processor_id(), cpu_possible_map);
++ cpu_set(smp_processor_id(), cpu_present_map);
+ }
+
+ static int __cpuinit voyager_cpu_up(unsigned int cpu)
+@@ -1782,9 +1783,9 @@
+ x86_write_percpu(cpu_number, hard_smp_processor_id());
+ }
+
+-static void voyager_send_call_func(const struct cpumask *callmask)
++static void voyager_send_call_func(cpumask_t callmask)
+ {
+- __u32 mask = cpus_addr(*callmask)[0] & ~(1 << smp_processor_id());
++ __u32 mask = cpus_addr(callmask)[0] & ~(1 << smp_processor_id());
+ send_CPI(mask, VIC_CALL_FUNCTION_CPI);
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/math-emu/fpu_aux.c linux-2.6.29-rc3.owrt/arch/x86/math-emu/fpu_aux.c
+--- linux-2.6.29.owrt/arch/x86/math-emu/fpu_aux.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/math-emu/fpu_aux.c 2009-05-10 23:48:28.000000000 +0200
+@@ -30,29 +30,20 @@
+ }
+
+ /* Needs to be externally visible */
+-void finit_task(struct task_struct *tsk)
++void finit(void)
+ {
+- struct i387_soft_struct *soft = &tsk->thread.xstate->soft;
+- struct address *oaddr, *iaddr;
+- soft->cwd = 0x037f;
+- soft->swd = 0;
+- soft->ftop = 0; /* We don't keep top in the status word internally. */
+- soft->twd = 0xffff;
++ control_word = 0x037f;
++ partial_status = 0;
++ top = 0; /* We don't keep top in the status word internally. */
++ fpu_tag_word = 0xffff;
+ /* The behaviour is different from that detailed in
+ Section 15.1.6 of the Intel manual */
+- oaddr = (struct address *)&soft->foo;
+- oaddr->offset = 0;
+- oaddr->selector = 0;
+- iaddr = (struct address *)&soft->fip;
+- iaddr->offset = 0;
+- iaddr->selector = 0;
+- iaddr->opcode = 0;
+- soft->no_update = 1;
+-}
+-
+-void finit(void)
+-{
+- finit_task(current);
++ operand_address.offset = 0;
++ operand_address.selector = 0;
++ instruction_address.offset = 0;
++ instruction_address.selector = 0;
++ instruction_address.opcode = 0;
++ no_ip_update = 1;
+ }
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/math-emu/fpu_entry.c linux-2.6.29-rc3.owrt/arch/x86/math-emu/fpu_entry.c
+--- linux-2.6.29.owrt/arch/x86/math-emu/fpu_entry.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/math-emu/fpu_entry.c 2009-05-10 23:48:28.000000000 +0200
+@@ -131,7 +131,7 @@
+ static int valid_prefix(u_char *Byte, u_char __user ** fpu_eip,
+ overrides * override);
+
+-void math_emulate(struct math_emu_info *info)
++asmlinkage void math_emulate(long arg)
+ {
+ u_char FPU_modrm, byte1;
+ unsigned short code;
+@@ -161,7 +161,7 @@
+ RE_ENTRANT_CHECK_ON;
+ #endif /* RE_ENTRANT_CHECKING */
+
+- FPU_info = info;
++ SETUP_DATA_AREA(arg);
+
+ FPU_ORIG_EIP = FPU_EIP;
+
+@@ -659,7 +659,7 @@
+ }
+ }
+
+-void math_abort(struct math_emu_info *info, unsigned int signal)
++void math_abort(struct info *info, unsigned int signal)
+ {
+ FPU_EIP = FPU_ORIG_EIP;
+ current->thread.trap_no = 16;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/math-emu/fpu_proto.h linux-2.6.29-rc3.owrt/arch/x86/math-emu/fpu_proto.h
+--- linux-2.6.29.owrt/arch/x86/math-emu/fpu_proto.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/math-emu/fpu_proto.h 2009-05-10 23:48:28.000000000 +0200
+@@ -51,8 +51,8 @@
+ extern void fst_i_(void);
+ extern void fstp_i(void);
+ /* fpu_entry.c */
+-extern void math_emulate(struct math_emu_info *info);
+-extern void math_abort(struct math_emu_info *info, unsigned int signal);
++asmlinkage extern void math_emulate(long arg);
++extern void math_abort(struct info *info, unsigned int signal);
+ /* fpu_etc.c */
+ extern void FPU_etc(void);
+ /* fpu_tags.c */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/math-emu/fpu_system.h linux-2.6.29-rc3.owrt/arch/x86/math-emu/fpu_system.h
+--- linux-2.6.29.owrt/arch/x86/math-emu/fpu_system.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/math-emu/fpu_system.h 2009-05-10 23:48:28.000000000 +0200
+@@ -16,6 +16,10 @@
+ #include <linux/kernel.h>
+ #include <linux/mm.h>
+
++/* This sets the pointer FPU_info to point to the argument part
++ of the stack frame of math_emulate() */
++#define SETUP_DATA_AREA(arg) FPU_info = (struct info *) &arg
++
+ /* s is always from a cpu register, and the cpu does bounds checking
+ * during register load --> no further bounds checks needed */
+ #define LDT_DESCRIPTOR(s) (((struct desc_struct *)current->mm->context.ldt)[(s) >> 3])
+@@ -34,12 +38,12 @@
+ #define I387 (current->thread.xstate)
+ #define FPU_info (I387->soft.info)
+
+-#define FPU_CS (*(unsigned short *) &(FPU_info->regs->cs))
+-#define FPU_SS (*(unsigned short *) &(FPU_info->regs->ss))
+-#define FPU_DS (*(unsigned short *) &(FPU_info->regs->ds))
+-#define FPU_EAX (FPU_info->regs->ax)
+-#define FPU_EFLAGS (FPU_info->regs->flags)
+-#define FPU_EIP (FPU_info->regs->ip)
++#define FPU_CS (*(unsigned short *) &(FPU_info->___cs))
++#define FPU_SS (*(unsigned short *) &(FPU_info->___ss))
++#define FPU_DS (*(unsigned short *) &(FPU_info->___ds))
++#define FPU_EAX (FPU_info->___eax)
++#define FPU_EFLAGS (FPU_info->___eflags)
++#define FPU_EIP (FPU_info->___eip)
+ #define FPU_ORIG_EIP (FPU_info->___orig_eip)
+
+ #define FPU_lookahead (I387->soft.lookahead)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/math-emu/get_address.c linux-2.6.29-rc3.owrt/arch/x86/math-emu/get_address.c
+--- linux-2.6.29.owrt/arch/x86/math-emu/get_address.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/math-emu/get_address.c 2009-05-10 23:48:28.000000000 +0200
+@@ -29,43 +29,46 @@
+ #define FPU_WRITE_BIT 0x10
+
+ static int reg_offset[] = {
+- offsetof(struct pt_regs, ax),
+- offsetof(struct pt_regs, cx),
+- offsetof(struct pt_regs, dx),
+- offsetof(struct pt_regs, bx),
+- offsetof(struct pt_regs, sp),
+- offsetof(struct pt_regs, bp),
+- offsetof(struct pt_regs, si),
+- offsetof(struct pt_regs, di)
++ offsetof(struct info, ___eax),
++ offsetof(struct info, ___ecx),
++ offsetof(struct info, ___edx),
++ offsetof(struct info, ___ebx),
++ offsetof(struct info, ___esp),
++ offsetof(struct info, ___ebp),
++ offsetof(struct info, ___esi),
++ offsetof(struct info, ___edi)
+ };
+
+-#define REG_(x) (*(long *)(reg_offset[(x)] + (u_char *)FPU_info->regs))
++#define REG_(x) (*(long *)(reg_offset[(x)]+(u_char *) FPU_info))
+
+ static int reg_offset_vm86[] = {
+- offsetof(struct pt_regs, cs),
+- offsetof(struct kernel_vm86_regs, ds),
+- offsetof(struct kernel_vm86_regs, es),
+- offsetof(struct kernel_vm86_regs, fs),
+- offsetof(struct kernel_vm86_regs, gs),
+- offsetof(struct pt_regs, ss),
+- offsetof(struct kernel_vm86_regs, ds)
++ offsetof(struct info, ___cs),
++ offsetof(struct info, ___vm86_ds),
++ offsetof(struct info, ___vm86_es),
++ offsetof(struct info, ___vm86_fs),
++ offsetof(struct info, ___vm86_gs),
++ offsetof(struct info, ___ss),
++ offsetof(struct info, ___vm86_ds)
+ };
+
+ #define VM86_REG_(x) (*(unsigned short *) \
+- (reg_offset_vm86[((unsigned)x)] + (u_char *)FPU_info->regs))
++ (reg_offset_vm86[((unsigned)x)]+(u_char *) FPU_info))
++
++/* This dummy, gs is not saved on the stack. */
++#define ___GS ___ds
+
+ static int reg_offset_pm[] = {
+- offsetof(struct pt_regs, cs),
+- offsetof(struct pt_regs, ds),
+- offsetof(struct pt_regs, es),
+- offsetof(struct pt_regs, fs),
+- offsetof(struct pt_regs, ds), /* dummy, not saved on stack */
+- offsetof(struct pt_regs, ss),
+- offsetof(struct pt_regs, ds)
++ offsetof(struct info, ___cs),
++ offsetof(struct info, ___ds),
++ offsetof(struct info, ___es),
++ offsetof(struct info, ___fs),
++ offsetof(struct info, ___GS),
++ offsetof(struct info, ___ss),
++ offsetof(struct info, ___ds)
+ };
+
+ #define PM_REG_(x) (*(unsigned short *) \
+- (reg_offset_pm[((unsigned)x)] + (u_char *)FPU_info->regs))
++ (reg_offset_pm[((unsigned)x)]+(u_char *) FPU_info))
+
+ /* Decode the SIB byte. This function assumes mod != 0 */
+ static int sib(int mod, unsigned long *fpu_eip)
+@@ -346,34 +349,34 @@
+ }
+ switch (rm) {
+ case 0:
+- address += FPU_info->regs->bx + FPU_info->regs->si;
++ address += FPU_info->___ebx + FPU_info->___esi;
+ break;
+ case 1:
+- address += FPU_info->regs->bx + FPU_info->regs->di;
++ address += FPU_info->___ebx + FPU_info->___edi;
+ break;
+ case 2:
+- address += FPU_info->regs->bp + FPU_info->regs->si;
++ address += FPU_info->___ebp + FPU_info->___esi;
+ if (addr_modes.override.segment == PREFIX_DEFAULT)
+ addr_modes.override.segment = PREFIX_SS_;
+ break;
+ case 3:
+- address += FPU_info->regs->bp + FPU_info->regs->di;
++ address += FPU_info->___ebp + FPU_info->___edi;
+ if (addr_modes.override.segment == PREFIX_DEFAULT)
+ addr_modes.override.segment = PREFIX_SS_;
+ break;
+ case 4:
+- address += FPU_info->regs->si;
++ address += FPU_info->___esi;
+ break;
+ case 5:
+- address += FPU_info->regs->di;
++ address += FPU_info->___edi;
+ break;
+ case 6:
+- address += FPU_info->regs->bp;
++ address += FPU_info->___ebp;
+ if (addr_modes.override.segment == PREFIX_DEFAULT)
+ addr_modes.override.segment = PREFIX_SS_;
+ break;
+ case 7:
+- address += FPU_info->regs->bx;
++ address += FPU_info->___ebx;
+ break;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/mm/fault.c linux-2.6.29-rc3.owrt/arch/x86/mm/fault.c
+--- linux-2.6.29.owrt/arch/x86/mm/fault.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/mm/fault.c 2009-05-10 23:48:28.000000000 +0200
+@@ -603,6 +603,8 @@
+
+ si_code = SEGV_MAPERR;
+
++ if (notify_page_fault(regs))
++ return;
+ if (unlikely(kmmio_fault(regs, address)))
+ return;
+
+@@ -632,9 +634,6 @@
+ if (spurious_fault(address, error_code))
+ return;
+
+- /* kprobes don't want to hook the spurious faults. */
+- if (notify_page_fault(regs))
+- return;
+ /*
+ * Don't take the mm semaphore here. If we fixup a prefetch
+ * fault we could otherwise deadlock.
+@@ -642,9 +641,6 @@
+ goto bad_area_nosemaphore;
+ }
+
+- /* kprobes don't want to hook the spurious faults. */
+- if (notify_page_fault(regs))
+- return;
+
+ /*
+ * It's safe to allow irq's after cr2 has been saved and the
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/mm/init_64.c linux-2.6.29-rc3.owrt/arch/x86/mm/init_64.c
+--- linux-2.6.29.owrt/arch/x86/mm/init_64.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/mm/init_64.c 2009-05-10 23:48:28.000000000 +0200
+@@ -714,8 +714,6 @@
+ pos = start_pfn << PAGE_SHIFT;
+ end_pfn = ((pos + (PMD_SIZE - 1)) >> PMD_SHIFT)
+ << (PMD_SHIFT - PAGE_SHIFT);
+- if (end_pfn > (end >> PAGE_SHIFT))
+- end_pfn = end >> PAGE_SHIFT;
+ if (start_pfn < end_pfn) {
+ nr_range = save_mr(mr, nr_range, start_pfn, end_pfn, 0);
+ pos = end_pfn << PAGE_SHIFT;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/mm/iomap_32.c linux-2.6.29-rc3.owrt/arch/x86/mm/iomap_32.c
+--- linux-2.6.29.owrt/arch/x86/mm/iomap_32.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/mm/iomap_32.c 2009-05-10 23:48:28.000000000 +0200
+@@ -20,17 +20,6 @@
+ #include <asm/pat.h>
+ #include <linux/module.h>
+
+-int is_io_mapping_possible(resource_size_t base, unsigned long size)
+-{
+-#ifndef CONFIG_X86_PAE
+- /* There is no way to map greater than 1 << 32 address without PAE */
+- if (base + size > 0x100000000ULL)
+- return 0;
+-#endif
+- return 1;
+-}
+-EXPORT_SYMBOL_GPL(is_io_mapping_possible);
+-
+ /* Map 'pfn' using fixed map 'type' and protections 'prot'
+ */
+ void *
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/mm/ioremap.c linux-2.6.29-rc3.owrt/arch/x86/mm/ioremap.c
+--- linux-2.6.29.owrt/arch/x86/mm/ioremap.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/mm/ioremap.c 2009-05-10 23:48:28.000000000 +0200
+@@ -134,6 +134,25 @@
+ return 0;
+ }
+
++int pagerange_is_ram(unsigned long start, unsigned long end)
++{
++ int ram_page = 0, not_rampage = 0;
++ unsigned long page_nr;
++
++ for (page_nr = (start >> PAGE_SHIFT); page_nr < (end >> PAGE_SHIFT);
++ ++page_nr) {
++ if (page_is_ram(page_nr))
++ ram_page = 1;
++ else
++ not_rampage = 1;
++
++ if (ram_page == not_rampage)
++ return -1;
++ }
++
++ return ram_page;
++}
++
+ /*
+ * Fix up the linear direct mapping of the kernel to avoid cache attribute
+ * conflicts.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/mm/kmmio.c linux-2.6.29-rc3.owrt/arch/x86/mm/kmmio.c
+--- linux-2.6.29.owrt/arch/x86/mm/kmmio.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/mm/kmmio.c 2009-05-10 23:48:28.000000000 +0200
+@@ -32,14 +32,11 @@
+ struct list_head list;
+ struct kmmio_fault_page *release_next;
+ unsigned long page; /* location of the fault page */
+- bool old_presence; /* page presence prior to arming */
+- bool armed;
+
+ /*
+ * Number of times this page has been registered as a part
+ * of a probe. If zero, page is disarmed and this may be freed.
+- * Used only by writers (RCU) and post_kmmio_handler().
+- * Protected by kmmio_lock, when linked into kmmio_page_table.
++ * Used only by writers (RCU).
+ */
+ int count;
+ };
+@@ -108,85 +105,57 @@
+ return NULL;
+ }
+
+-static void set_pmd_presence(pmd_t *pmd, bool present, bool *old)
+-{
+- pmdval_t v = pmd_val(*pmd);
+- *old = !!(v & _PAGE_PRESENT);
+- v &= ~_PAGE_PRESENT;
+- if (present)
+- v |= _PAGE_PRESENT;
+- set_pmd(pmd, __pmd(v));
+-}
+-
+-static void set_pte_presence(pte_t *pte, bool present, bool *old)
+-{
+- pteval_t v = pte_val(*pte);
+- *old = !!(v & _PAGE_PRESENT);
+- v &= ~_PAGE_PRESENT;
+- if (present)
+- v |= _PAGE_PRESENT;
+- set_pte_atomic(pte, __pte(v));
+-}
+-
+-static int set_page_presence(unsigned long addr, bool present, bool *old)
++static void set_page_present(unsigned long addr, bool present,
++ unsigned int *pglevel)
+ {
++ pteval_t pteval;
++ pmdval_t pmdval;
+ unsigned int level;
++ pmd_t *pmd;
+ pte_t *pte = lookup_address(addr, &level);
+
+ if (!pte) {
+ pr_err("kmmio: no pte for page 0x%08lx\n", addr);
+- return -1;
++ return;
+ }
+
++ if (pglevel)
++ *pglevel = level;
++
+ switch (level) {
+ case PG_LEVEL_2M:
+- set_pmd_presence((pmd_t *)pte, present, old);
++ pmd = (pmd_t *)pte;
++ pmdval = pmd_val(*pmd) & ~_PAGE_PRESENT;
++ if (present)
++ pmdval |= _PAGE_PRESENT;
++ set_pmd(pmd, __pmd(pmdval));
+ break;
++
+ case PG_LEVEL_4K:
+- set_pte_presence(pte, present, old);
++ pteval = pte_val(*pte) & ~_PAGE_PRESENT;
++ if (present)
++ pteval |= _PAGE_PRESENT;
++ set_pte_atomic(pte, __pte(pteval));
+ break;
++
+ default:
+ pr_err("kmmio: unexpected page level 0x%x.\n", level);
+- return -1;
++ return;
+ }
+
+ __flush_tlb_one(addr);
+- return 0;
+ }
+
+-/*
+- * Mark the given page as not present. Access to it will trigger a fault.
+- *
+- * Struct kmmio_fault_page is protected by RCU and kmmio_lock, but the
+- * protection is ignored here. RCU read lock is assumed held, so the struct
+- * will not disappear unexpectedly. Furthermore, the caller must guarantee,
+- * that double arming the same virtual address (page) cannot occur.
+- *
+- * Double disarming on the other hand is allowed, and may occur when a fault
+- * and mmiotrace shutdown happen simultaneously.
+- */
+-static int arm_kmmio_fault_page(struct kmmio_fault_page *f)
++/** Mark the given page as not present. Access to it will trigger a fault. */
++static void arm_kmmio_fault_page(unsigned long page, unsigned int *pglevel)
+ {
+- int ret;
+- WARN_ONCE(f->armed, KERN_ERR "kmmio page already armed.\n");
+- if (f->armed) {
+- pr_warning("kmmio double-arm: page 0x%08lx, ref %d, old %d\n",
+- f->page, f->count, f->old_presence);
+- }
+- ret = set_page_presence(f->page, false, &f->old_presence);
+- WARN_ONCE(ret < 0, KERN_ERR "kmmio arming 0x%08lx failed.\n", f->page);
+- f->armed = true;
+- return ret;
++ set_page_present(page & PAGE_MASK, false, pglevel);
+ }
+
+-/** Restore the given page to saved presence state. */
+-static void disarm_kmmio_fault_page(struct kmmio_fault_page *f)
++/** Mark the given page as present. */
++static void disarm_kmmio_fault_page(unsigned long page, unsigned int *pglevel)
+ {
+- bool tmp;
+- int ret = set_page_presence(f->page, f->old_presence, &tmp);
+- WARN_ONCE(ret < 0,
+- KERN_ERR "kmmio disarming 0x%08lx failed.\n", f->page);
+- f->armed = false;
++ set_page_present(page & PAGE_MASK, true, pglevel);
+ }
+
+ /*
+@@ -233,32 +202,28 @@
+
+ ctx = &get_cpu_var(kmmio_ctx);
+ if (ctx->active) {
++ disarm_kmmio_fault_page(faultpage->page, NULL);
+ if (addr == ctx->addr) {
+ /*
+- * A second fault on the same page means some other
+- * condition needs handling by do_page_fault(), the
+- * page really not being present is the most common.
++ * On SMP we sometimes get recursive probe hits on the
++ * same address. Context is already saved, fall out.
+ */
+- pr_debug("kmmio: secondary hit for 0x%08lx CPU %d.\n",
+- addr, smp_processor_id());
+-
+- if (!faultpage->old_presence)
+- pr_info("kmmio: unexpected secondary hit for "
+- "address 0x%08lx on CPU %d.\n", addr,
+- smp_processor_id());
+- } else {
+- /*
+- * Prevent overwriting already in-flight context.
+- * This should not happen, let's hope disarming at
+- * least prevents a panic.
+- */
+- pr_emerg("kmmio: recursive probe hit on CPU %d, "
++ pr_debug("kmmio: duplicate probe hit on CPU %d, for "
++ "address 0x%08lx.\n",
++ smp_processor_id(), addr);
++ ret = 1;
++ goto no_kmmio_ctx;
++ }
++ /*
++ * Prevent overwriting already in-flight context.
++ * This should not happen, let's hope disarming at least
++ * prevents a panic.
++ */
++ pr_emerg("kmmio: recursive probe hit on CPU %d, "
+ "for address 0x%08lx. Ignoring.\n",
+ smp_processor_id(), addr);
+- pr_emerg("kmmio: previous hit was at 0x%08lx.\n",
+- ctx->addr);
+- disarm_kmmio_fault_page(faultpage);
+- }
++ pr_emerg("kmmio: previous hit was at 0x%08lx.\n",
++ ctx->addr);
+ goto no_kmmio_ctx;
+ }
+ ctx->active++;
+@@ -279,7 +244,7 @@
+ regs->flags &= ~X86_EFLAGS_IF;
+
+ /* Now we set present bit in PTE and single step. */
+- disarm_kmmio_fault_page(ctx->fpage);
++ disarm_kmmio_fault_page(ctx->fpage->page, NULL);
+
+ /*
+ * If another cpu accesses the same page while we are stepping,
+@@ -310,7 +275,7 @@
+ struct kmmio_context *ctx = &get_cpu_var(kmmio_ctx);
+
+ if (!ctx->active) {
+- pr_warning("kmmio: spurious debug trap on CPU %d.\n",
++ pr_debug("kmmio: spurious debug trap on CPU %d.\n",
+ smp_processor_id());
+ goto out;
+ }
+@@ -318,11 +283,7 @@
+ if (ctx->probe && ctx->probe->post_handler)
+ ctx->probe->post_handler(ctx->probe, condition, regs);
+
+- /* Prevent racing against release_kmmio_fault_page(). */
+- spin_lock(&kmmio_lock);
+- if (ctx->fpage->count)
+- arm_kmmio_fault_page(ctx->fpage);
+- spin_unlock(&kmmio_lock);
++ arm_kmmio_fault_page(ctx->fpage->page, NULL);
+
+ regs->flags &= ~X86_EFLAGS_TF;
+ regs->flags |= ctx->saved_flags;
+@@ -354,25 +315,21 @@
+ f = get_kmmio_fault_page(page);
+ if (f) {
+ if (!f->count)
+- arm_kmmio_fault_page(f);
++ arm_kmmio_fault_page(f->page, NULL);
+ f->count++;
+ return 0;
+ }
+
+- f = kzalloc(sizeof(*f), GFP_ATOMIC);
++ f = kmalloc(sizeof(*f), GFP_ATOMIC);
+ if (!f)
+ return -1;
+
+ f->count = 1;
+ f->page = page;
+-
+- if (arm_kmmio_fault_page(f)) {
+- kfree(f);
+- return -1;
+- }
+-
+ list_add_rcu(&f->list, kmmio_page_list(f->page));
+
++ arm_kmmio_fault_page(f->page, NULL);
++
+ return 0;
+ }
+
+@@ -390,7 +347,7 @@
+ f->count--;
+ BUG_ON(f->count < 0);
+ if (!f->count) {
+- disarm_kmmio_fault_page(f);
++ disarm_kmmio_fault_page(f->page, NULL);
+ f->release_next = *release_list;
+ *release_list = f;
+ }
+@@ -451,24 +408,23 @@
+
+ static void remove_kmmio_fault_pages(struct rcu_head *head)
+ {
+- struct kmmio_delayed_release *dr =
+- container_of(head, struct kmmio_delayed_release, rcu);
++ struct kmmio_delayed_release *dr = container_of(
++ head,
++ struct kmmio_delayed_release,
++ rcu);
+ struct kmmio_fault_page *p = dr->release_list;
+ struct kmmio_fault_page **prevp = &dr->release_list;
+ unsigned long flags;
+-
+ spin_lock_irqsave(&kmmio_lock, flags);
+ while (p) {
+- if (!p->count) {
++ if (!p->count)
+ list_del_rcu(&p->list);
+- prevp = &p->release_next;
+- } else {
++ else
+ *prevp = p->release_next;
+- }
++ prevp = &p->release_next;
+ p = p->release_next;
+ }
+ spin_unlock_irqrestore(&kmmio_lock, flags);
+-
+ /* This is the real RCU destroy call. */
+ call_rcu(&dr->rcu, rcu_free_kmmio_fault_pages);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/mm/numa_64.c linux-2.6.29-rc3.owrt/arch/x86/mm/numa_64.c
+--- linux-2.6.29.owrt/arch/x86/mm/numa_64.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/mm/numa_64.c 2009-05-10 23:48:28.000000000 +0200
+@@ -145,7 +145,7 @@
+ return shift;
+ }
+
+-int __meminit __early_pfn_to_nid(unsigned long pfn)
++int early_pfn_to_nid(unsigned long pfn)
+ {
+ return phys_to_nid(pfn << PAGE_SHIFT);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/mm/pageattr.c linux-2.6.29-rc3.owrt/arch/x86/mm/pageattr.c
+--- linux-2.6.29.owrt/arch/x86/mm/pageattr.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/mm/pageattr.c 2009-05-10 23:48:28.000000000 +0200
+@@ -508,24 +508,18 @@
+ #endif
+
+ /*
+- * Install the new, split up pagetable.
++ * Install the new, split up pagetable. Important details here:
+ *
+- * We use the standard kernel pagetable protections for the new
+- * pagetable protections, the actual ptes set above control the
+- * primary protection behavior:
+- */
+- __set_pmd_pte(kpte, address, mk_pte(base, __pgprot(_KERNPG_TABLE)));
+-
+- /*
+- * Intel Atom errata AAH41 workaround.
++ * On Intel the NX bit of all levels must be cleared to make a
++ * page executable. See section 4.13.2 of Intel 64 and IA-32
++ * Architectures Software Developer's Manual).
+ *
+- * The real fix should be in hw or in a microcode update, but
+- * we also probabilistically try to reduce the window of having
+- * a large TLB mixed with 4K TLBs while instruction fetches are
+- * going on.
++ * Mark the entry present. The current mapping might be
++ * set to not present, which we preserved above.
+ */
+- __flush_tlb_all();
+-
++ ref_prot = pte_pgprot(pte_mkexec(pte_clrhuge(*kpte)));
++ pgprot_val(ref_prot) |= _PAGE_PRESENT;
++ __set_pmd_pte(kpte, address, mk_pte(base, ref_prot));
+ base = NULL;
+
+ out_unlock:
+@@ -581,6 +575,7 @@
+ address = cpa->vaddr[cpa->curpage];
+ else
+ address = *cpa->vaddr;
++
+ repeat:
+ kpte = lookup_address(address, &level);
+ if (!kpte)
+@@ -817,13 +812,6 @@
+
+ vm_unmap_aliases();
+
+- /*
+- * If we're called with lazy mmu updates enabled, the
+- * in-memory pte state may be stale. Flush pending updates to
+- * bring them up to date.
+- */
+- arch_flush_lazy_mmu_mode();
+-
+ cpa.vaddr = addr;
+ cpa.numpages = numpages;
+ cpa.mask_set = mask_set;
+@@ -866,13 +854,6 @@
+ } else
+ cpa_flush_all(cache);
+
+- /*
+- * If we've been called with lazy mmu updates enabled, then
+- * make sure that everything gets flushed out before we
+- * return.
+- */
+- arch_flush_lazy_mmu_mode();
+-
+ out:
+ return ret;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/mm/pat.c linux-2.6.29-rc3.owrt/arch/x86/mm/pat.c
+--- linux-2.6.29.owrt/arch/x86/mm/pat.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/mm/pat.c 2009-05-10 23:48:28.000000000 +0200
+@@ -11,7 +11,6 @@
+ #include <linux/bootmem.h>
+ #include <linux/debugfs.h>
+ #include <linux/kernel.h>
+-#include <linux/module.h>
+ #include <linux/gfp.h>
+ #include <linux/mm.h>
+ #include <linux/fs.h>
+@@ -212,33 +211,6 @@
+ static struct memtype *cached_entry;
+ static u64 cached_start;
+
+-static int pat_pagerange_is_ram(unsigned long start, unsigned long end)
+-{
+- int ram_page = 0, not_rampage = 0;
+- unsigned long page_nr;
+-
+- for (page_nr = (start >> PAGE_SHIFT); page_nr < (end >> PAGE_SHIFT);
+- ++page_nr) {
+- /*
+- * For legacy reasons, physical address range in the legacy ISA
+- * region is tracked as non-RAM. This will allow users of
+- * /dev/mem to map portions of legacy ISA region, even when
+- * some of those portions are listed(or not even listed) with
+- * different e820 types(RAM/reserved/..)
+- */
+- if (page_nr >= (ISA_END_ADDRESS >> PAGE_SHIFT) &&
+- page_is_ram(page_nr))
+- ram_page = 1;
+- else
+- not_rampage = 1;
+-
+- if (ram_page == not_rampage)
+- return -1;
+- }
+-
+- return ram_page;
+-}
+-
+ /*
+ * For RAM pages, mark the pages as non WB memory type using
+ * PageNonWB (PG_arch_1). We allow only one set_memory_uc() or
+@@ -364,12 +336,20 @@
+ if (new_type)
+ *new_type = actual_type;
+
+- is_range_ram = pat_pagerange_is_ram(start, end);
+- if (is_range_ram == 1)
+- return reserve_ram_pages_type(start, end, req_type,
+- new_type);
+- else if (is_range_ram < 0)
+- return -EINVAL;
++ /*
++ * For legacy reasons, some parts of the physical address range in the
++ * legacy 1MB region is treated as non-RAM (even when listed as RAM in
++ * the e820 tables). So we will track the memory attributes of this
++ * legacy 1MB region using the linear memtype_list always.
++ */
++ if (end >= ISA_END_ADDRESS) {
++ is_range_ram = pagerange_is_ram(start, end);
++ if (is_range_ram == 1)
++ return reserve_ram_pages_type(start, end, req_type,
++ new_type);
++ else if (is_range_ram < 0)
++ return -EINVAL;
++ }
+
+ new = kmalloc(sizeof(struct memtype), GFP_KERNEL);
+ if (!new)
+@@ -466,11 +446,19 @@
+ if (is_ISA_range(start, end - 1))
+ return 0;
+
+- is_range_ram = pat_pagerange_is_ram(start, end);
+- if (is_range_ram == 1)
+- return free_ram_pages_type(start, end);
+- else if (is_range_ram < 0)
+- return -EINVAL;
++ /*
++ * For legacy reasons, some parts of the physical address range in the
++ * legacy 1MB region is treated as non-RAM (even when listed as RAM in
++ * the e820 tables). So we will track the memory attributes of this
++ * legacy 1MB region using the linear memtype_list always.
++ */
++ if (end >= ISA_END_ADDRESS) {
++ is_range_ram = pagerange_is_ram(start, end);
++ if (is_range_ram == 1)
++ return free_ram_pages_type(start, end);
++ else if (is_range_ram < 0)
++ return -EINVAL;
++ }
+
+ spin_lock(&memtype_lock);
+ list_for_each_entry(entry, &memtype_list, nd) {
+@@ -638,13 +626,17 @@
+ unsigned long flags;
+ unsigned long want_flags = (pgprot_val(*vma_prot) & _PAGE_CACHE_MASK);
+
+- is_ram = pat_pagerange_is_ram(paddr, paddr + size);
++ is_ram = pagerange_is_ram(paddr, paddr + size);
+
+- /*
+- * reserve_pfn_range() doesn't support RAM pages.
+- */
+- if (is_ram != 0)
+- return -EINVAL;
++ if (is_ram != 0) {
++ /*
++ * For mapping RAM pages, drivers need to call
++ * set_memory_[uc|wc|wb] directly, for reserve and free, before
++ * setting up the PTE.
++ */
++ WARN_ON_ONCE(1);
++ return 0;
++ }
+
+ ret = reserve_memtype(paddr, paddr + size, want_flags, &flags);
+ if (ret)
+@@ -701,7 +693,7 @@
+ {
+ int is_ram;
+
+- is_ram = pat_pagerange_is_ram(paddr, paddr + size);
++ is_ram = pagerange_is_ram(paddr, paddr + size);
+ if (is_ram == 0)
+ free_memtype(paddr, paddr + size);
+ }
+@@ -869,7 +861,6 @@
+ else
+ return pgprot_noncached(prot);
+ }
+-EXPORT_SYMBOL_GPL(pgprot_writecombine);
+
+ #if defined(CONFIG_DEBUG_FS) && defined(CONFIG_X86_PAT)
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/mm/testmmiotrace.c linux-2.6.29-rc3.owrt/arch/x86/mm/testmmiotrace.c
+--- linux-2.6.29.owrt/arch/x86/mm/testmmiotrace.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/mm/testmmiotrace.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1,5 +1,5 @@
+ /*
+- * Written by Pekka Paalanen, 2008-2009 <pq@iki.fi>
++ * Written by Pekka Paalanen, 2008 <pq@iki.fi>
+ */
+ #include <linux/module.h>
+ #include <linux/io.h>
+@@ -9,74 +9,35 @@
+
+ static unsigned long mmio_address;
+ module_param(mmio_address, ulong, 0);
+-MODULE_PARM_DESC(mmio_address, " Start address of the mapping of 16 kB "
+- "(or 8 MB if read_far is non-zero).");
+-
+-static unsigned long read_far = 0x400100;
+-module_param(read_far, ulong, 0);
+-MODULE_PARM_DESC(read_far, " Offset of a 32-bit read within 8 MB "
+- "(default: 0x400100).");
+-
+-static unsigned v16(unsigned i)
+-{
+- return i * 12 + 7;
+-}
+-
+-static unsigned v32(unsigned i)
+-{
+- return i * 212371 + 13;
+-}
++MODULE_PARM_DESC(mmio_address, "Start address of the mapping of 16 kB.");
+
+ static void do_write_test(void __iomem *p)
+ {
+ unsigned int i;
+- pr_info(MODULE_NAME ": write test.\n");
+ mmiotrace_printk("Write test.\n");
+-
+ for (i = 0; i < 256; i++)
+ iowrite8(i, p + i);
+-
+ for (i = 1024; i < (5 * 1024); i += 2)
+- iowrite16(v16(i), p + i);
+-
++ iowrite16(i * 12 + 7, p + i);
+ for (i = (5 * 1024); i < (16 * 1024); i += 4)
+- iowrite32(v32(i), p + i);
++ iowrite32(i * 212371 + 13, p + i);
+ }
+
+ static void do_read_test(void __iomem *p)
+ {
+ unsigned int i;
+- unsigned errs[3] = { 0 };
+- pr_info(MODULE_NAME ": read test.\n");
+ mmiotrace_printk("Read test.\n");
+-
+ for (i = 0; i < 256; i++)
+- if (ioread8(p + i) != i)
+- ++errs[0];
+-
++ ioread8(p + i);
+ for (i = 1024; i < (5 * 1024); i += 2)
+- if (ioread16(p + i) != v16(i))
+- ++errs[1];
+-
++ ioread16(p + i);
+ for (i = (5 * 1024); i < (16 * 1024); i += 4)
+- if (ioread32(p + i) != v32(i))
+- ++errs[2];
+-
+- mmiotrace_printk("Read errors: 8-bit %d, 16-bit %d, 32-bit %d.\n",
+- errs[0], errs[1], errs[2]);
++ ioread32(p + i);
+ }
+
+-static void do_read_far_test(void __iomem *p)
++static void do_test(void)
+ {
+- pr_info(MODULE_NAME ": read far test.\n");
+- mmiotrace_printk("Read far test.\n");
+-
+- ioread32(p + read_far);
+-}
+-
+-static void do_test(unsigned long size)
+-{
+- void __iomem *p = ioremap_nocache(mmio_address, size);
++ void __iomem *p = ioremap_nocache(mmio_address, 0x4000);
+ if (!p) {
+ pr_err(MODULE_NAME ": could not ioremap, aborting.\n");
+ return;
+@@ -84,15 +45,11 @@
+ mmiotrace_printk("ioremap returned %p.\n", p);
+ do_write_test(p);
+ do_read_test(p);
+- if (read_far && read_far < size - 4)
+- do_read_far_test(p);
+ iounmap(p);
+ }
+
+ static int __init init(void)
+ {
+- unsigned long size = (read_far) ? (8 << 20) : (16 << 10);
+-
+ if (mmio_address == 0) {
+ pr_err(MODULE_NAME ": you have to use the module argument "
+ "mmio_address.\n");
+@@ -101,11 +58,10 @@
+ return -ENXIO;
+ }
+
+- pr_warning(MODULE_NAME ": WARNING: mapping %lu kB @ 0x%08lx in PCI "
+- "address space, and writing 16 kB of rubbish in there.\n",
+- size >> 10, mmio_address);
+- do_test(size);
+- pr_info(MODULE_NAME ": All done.\n");
++ pr_warning(MODULE_NAME ": WARNING: mapping 16 kB @ 0x%08lx "
++ "in PCI address space, and writing "
++ "rubbish in there.\n", mmio_address);
++ do_test();
+ return 0;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/oprofile/op_model_ppro.c linux-2.6.29-rc3.owrt/arch/x86/oprofile/op_model_ppro.c
+--- linux-2.6.29.owrt/arch/x86/oprofile/op_model_ppro.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/oprofile/op_model_ppro.c 2009-05-10 23:48:28.000000000 +0200
+@@ -78,18 +78,8 @@
+ if (cpu_has_arch_perfmon) {
+ union cpuid10_eax eax;
+ eax.full = cpuid_eax(0xa);
+-
+- /*
+- * For Core2 (family 6, model 15), don't reset the
+- * counter width:
+- */
+- if (!(eax.split.version_id == 0 &&
+- current_cpu_data.x86 == 6 &&
+- current_cpu_data.x86_model == 15)) {
+-
+- if (counter_width < eax.split.bit_width)
+- counter_width = eax.split.bit_width;
+- }
++ if (counter_width < eax.split.bit_width)
++ counter_width = eax.split.bit_width;
+ }
+
+ /* clear all counters */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/pci/irq.c linux-2.6.29-rc3.owrt/arch/x86/pci/irq.c
+--- linux-2.6.29.owrt/arch/x86/pci/irq.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/pci/irq.c 2009-05-10 23:48:28.000000000 +0200
+@@ -572,7 +572,6 @@
+ case PCI_DEVICE_ID_INTEL_ICH7_1:
+ case PCI_DEVICE_ID_INTEL_ICH7_30:
+ case PCI_DEVICE_ID_INTEL_ICH7_31:
+- case PCI_DEVICE_ID_INTEL_TGP_LPC:
+ case PCI_DEVICE_ID_INTEL_ESB2_0:
+ case PCI_DEVICE_ID_INTEL_ICH8_0:
+ case PCI_DEVICE_ID_INTEL_ICH8_1:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/xen/enlighten.c linux-2.6.29-rc3.owrt/arch/x86/xen/enlighten.c
+--- linux-2.6.29.owrt/arch/x86/xen/enlighten.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/xen/enlighten.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1672,9 +1672,6 @@
+ possible map and a non-dummy shared_info. */
+ per_cpu(xen_vcpu, 0) = &HYPERVISOR_shared_info->vcpu_info[0];
+
+- local_irq_disable();
+- early_boot_irqs_off();
+-
+ xen_raw_console_write("mapping kernel into physical memory\n");
+ pgd = xen_setup_kernel_pagetable(pgd, xen_start_info->nr_pages);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/x86/xen/multicalls.h linux-2.6.29-rc3.owrt/arch/x86/xen/multicalls.h
+--- linux-2.6.29.owrt/arch/x86/xen/multicalls.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/x86/xen/multicalls.h 2009-05-10 23:48:28.000000000 +0200
+@@ -19,10 +19,8 @@
+ paired with xen_mc_issue() */
+ static inline void xen_mc_batch(void)
+ {
+- unsigned long flags;
+ /* need to disable interrupts until this entry is complete */
+- local_irq_save(flags);
+- __get_cpu_var(xen_mc_irq_flags) = flags;
++ local_irq_save(__get_cpu_var(xen_mc_irq_flags));
+ }
+
+ static inline struct multicall_space xen_mc_entry(size_t args)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/xtensa/Kconfig linux-2.6.29-rc3.owrt/arch/xtensa/Kconfig
+--- linux-2.6.29.owrt/arch/xtensa/Kconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/xtensa/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -103,6 +103,9 @@
+ help
+ Can we use information of configuration file?
+
++config HIGHMEM
++ bool "High memory support"
++
+ endmenu
+
+ menu "Platform options"
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/xtensa/kernel/setup.c linux-2.6.29-rc3.owrt/arch/xtensa/kernel/setup.c
+--- linux-2.6.29.owrt/arch/xtensa/kernel/setup.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/xtensa/kernel/setup.c 2009-05-10 23:48:28.000000000 +0200
+@@ -44,8 +44,6 @@
+ #include <asm/setup.h>
+ #include <asm/param.h>
+
+-#include <platform/hardware.h>
+-
+ #if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_DUMMY_CONSOLE)
+ struct screen_info screen_info = { 0, 24, 0, 0, 0, 80, 0, 0, 0, 24, 1, 16};
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/xtensa/kernel/traps.c linux-2.6.29-rc3.owrt/arch/xtensa/kernel/traps.c
+--- linux-2.6.29.owrt/arch/xtensa/kernel/traps.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/xtensa/kernel/traps.c 2009-05-10 23:48:28.000000000 +0200
+@@ -30,7 +30,6 @@
+ #include <linux/stringify.h>
+ #include <linux/kallsyms.h>
+ #include <linux/delay.h>
+-#include <linux/hardirq.h>
+
+ #include <asm/ptrace.h>
+ #include <asm/timex.h>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/xtensa/mm/fault.c linux-2.6.29-rc3.owrt/arch/xtensa/mm/fault.c
+--- linux-2.6.29.owrt/arch/xtensa/mm/fault.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/xtensa/mm/fault.c 2009-05-10 23:48:28.000000000 +0200
+@@ -14,7 +14,6 @@
+
+ #include <linux/mm.h>
+ #include <linux/module.h>
+-#include <linux/hardirq.h>
+ #include <asm/mmu_context.h>
+ #include <asm/cacheflush.h>
+ #include <asm/hardirq.h>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/arch/xtensa/platforms/iss/console.c linux-2.6.29-rc3.owrt/arch/xtensa/platforms/iss/console.c
+--- linux-2.6.29.owrt/arch/xtensa/platforms/iss/console.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/arch/xtensa/platforms/iss/console.c 2009-05-10 23:48:28.000000000 +0200
+@@ -140,14 +140,16 @@
+ }
+
+
+-static int rs_put_char(struct tty_struct *tty, unsigned char ch)
++static void rs_put_char(struct tty_struct *tty, unsigned char ch)
+ {
+ char buf[2];
+
++ if (!tty)
++ return;
++
+ buf[0] = ch;
+ buf[1] = '\0'; /* Is this NULL necessary? */
+ __simc (SYS_write, 1, (unsigned long) buf, 1, 0, 0);
+- return 1;
+ }
+
+ static void rs_flush_chars(struct tty_struct *tty)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/block/blk-barrier.c linux-2.6.29-rc3.owrt/block/blk-barrier.c
+--- linux-2.6.29.owrt/block/blk-barrier.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/block/blk-barrier.c 2009-05-10 23:48:28.000000000 +0200
+@@ -302,7 +302,7 @@
+ * Description:
+ * Issue a flush for the block device in question. Caller can supply
+ * room for storing the error offset in case of a flush error, if they
+- * wish to.
++ * wish to. Caller must run wait_for_completion() on its own.
+ */
+ int blkdev_issue_flush(struct block_device *bdev, sector_t *error_sector)
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/block/blk-core.c linux-2.6.29-rc3.owrt/block/blk-core.c
+--- linux-2.6.29.owrt/block/blk-core.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/block/blk-core.c 2009-05-10 23:48:28.000000000 +0200
+@@ -64,12 +64,11 @@
+
+ static void drive_stat_acct(struct request *rq, int new_io)
+ {
+- struct gendisk *disk = rq->rq_disk;
+ struct hd_struct *part;
+ int rw = rq_data_dir(rq);
+ int cpu;
+
+- if (!blk_fs_request(rq) || !disk || !blk_do_io_stat(disk->queue))
++ if (!blk_fs_request(rq) || !rq->rq_disk)
+ return;
+
+ cpu = part_stat_lock();
+@@ -600,7 +599,8 @@
+ q->request_fn = rfn;
+ q->prep_rq_fn = NULL;
+ q->unplug_fn = generic_unplug_device;
+- q->queue_flags = QUEUE_FLAG_DEFAULT;
++ q->queue_flags = (1 << QUEUE_FLAG_CLUSTER |
++ 1 << QUEUE_FLAG_STACKABLE);
+ q->queue_lock = lock;
+
+ blk_queue_segment_boundary(q, BLK_SEG_BOUNDARY_MASK);
+@@ -1125,8 +1125,6 @@
+
+ if (bio_sync(bio))
+ req->cmd_flags |= REQ_RW_SYNC;
+- if (bio_unplug(bio))
+- req->cmd_flags |= REQ_UNPLUG;
+ if (bio_rw_meta(bio))
+ req->cmd_flags |= REQ_RW_META;
+
+@@ -1143,7 +1141,6 @@
+ int el_ret, nr_sectors;
+ const unsigned short prio = bio_prio(bio);
+ const int sync = bio_sync(bio);
+- const int unplug = bio_unplug(bio);
+ int rw_flags;
+
+ nr_sectors = bio_sectors(bio);
+@@ -1247,7 +1244,7 @@
+ blk_plug_device(q);
+ add_request(q, req);
+ out:
+- if (unplug || blk_queue_nonrot(q))
++ if (sync || blk_queue_nonrot(q))
+ __generic_unplug_device(q);
+ spin_unlock_irq(q->queue_lock);
+ return 0;
+@@ -1451,11 +1448,6 @@
+ err = -EOPNOTSUPP;
+ goto end_io;
+ }
+- if (bio_barrier(bio) && bio_has_data(bio) &&
+- (q->next_ordered == QUEUE_ORDERED_NONE)) {
+- err = -EOPNOTSUPP;
+- goto end_io;
+- }
+
+ ret = q->make_request_fn(q, bio);
+ } while (ret);
+@@ -1663,55 +1655,6 @@
+ }
+ EXPORT_SYMBOL(blkdev_dequeue_request);
+
+-static void blk_account_io_completion(struct request *req, unsigned int bytes)
+-{
+- struct gendisk *disk = req->rq_disk;
+-
+- if (!disk || !blk_do_io_stat(disk->queue))
+- return;
+-
+- if (blk_fs_request(req)) {
+- const int rw = rq_data_dir(req);
+- struct hd_struct *part;
+- int cpu;
+-
+- cpu = part_stat_lock();
+- part = disk_map_sector_rcu(req->rq_disk, req->sector);
+- part_stat_add(cpu, part, sectors[rw], bytes >> 9);
+- part_stat_unlock();
+- }
+-}
+-
+-static void blk_account_io_done(struct request *req)
+-{
+- struct gendisk *disk = req->rq_disk;
+-
+- if (!disk || !blk_do_io_stat(disk->queue))
+- return;
+-
+- /*
+- * Account IO completion. bar_rq isn't accounted as a normal
+- * IO on queueing nor completion. Accounting the containing
+- * request is enough.
+- */
+- if (blk_fs_request(req) && req != &req->q->bar_rq) {
+- unsigned long duration = jiffies - req->start_time;
+- const int rw = rq_data_dir(req);
+- struct hd_struct *part;
+- int cpu;
+-
+- cpu = part_stat_lock();
+- part = disk_map_sector_rcu(disk, req->sector);
+-
+- part_stat_inc(cpu, part, ios[rw]);
+- part_stat_add(cpu, part, ticks[rw], duration);
+- part_round_stats(cpu, part);
+- part_dec_in_flight(part);
+-
+- part_stat_unlock();
+- }
+-}
+-
+ /**
+ * __end_that_request_first - end I/O on a request
+ * @req: the request being processed
+@@ -1747,7 +1690,16 @@
+ (unsigned long long)req->sector);
+ }
+
+- blk_account_io_completion(req, nr_bytes);
++ if (blk_fs_request(req) && req->rq_disk) {
++ const int rw = rq_data_dir(req);
++ struct hd_struct *part;
++ int cpu;
++
++ cpu = part_stat_lock();
++ part = disk_map_sector_rcu(req->rq_disk, req->sector);
++ part_stat_add(cpu, part, sectors[rw], nr_bytes >> 9);
++ part_stat_unlock();
++ }
+
+ total_bytes = bio_nbytes = 0;
+ while ((bio = req->bio) != NULL) {
+@@ -1827,6 +1779,8 @@
+ */
+ static void end_that_request_last(struct request *req, int error)
+ {
++ struct gendisk *disk = req->rq_disk;
++
+ if (blk_rq_tagged(req))
+ blk_queue_end_tag(req->q, req);
+
+@@ -1838,7 +1792,27 @@
+
+ blk_delete_timer(req);
+
+- blk_account_io_done(req);
++ /*
++ * Account IO completion. bar_rq isn't accounted as a normal
++ * IO on queueing nor completion. Accounting the containing
++ * request is enough.
++ */
++ if (disk && blk_fs_request(req) && req != &req->q->bar_rq) {
++ unsigned long duration = jiffies - req->start_time;
++ const int rw = rq_data_dir(req);
++ struct hd_struct *part;
++ int cpu;
++
++ cpu = part_stat_lock();
++ part = disk_map_sector_rcu(disk, req->sector);
++
++ part_stat_inc(cpu, part, ios[rw]);
++ part_stat_add(cpu, part, ticks[rw], duration);
++ part_round_stats(cpu, part);
++ part_dec_in_flight(part);
++
++ part_stat_unlock();
++ }
+
+ if (req->end_io)
+ req->end_io(req, error);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/block/blk.h linux-2.6.29-rc3.owrt/block/blk.h
+--- linux-2.6.29.owrt/block/blk.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/block/blk.h 2009-05-10 23:48:28.000000000 +0200
+@@ -108,12 +108,4 @@
+ #endif
+ }
+
+-static inline int blk_do_io_stat(struct request_queue *q)
+-{
+- if (q)
+- return blk_queue_io_stat(q);
+-
+- return 0;
+-}
+-
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/block/blk-integrity.c linux-2.6.29-rc3.owrt/block/blk-integrity.c
+--- linux-2.6.29.owrt/block/blk-integrity.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/block/blk-integrity.c 2009-05-10 23:48:28.000000000 +0200
+@@ -309,24 +309,24 @@
+ /**
+ * blk_integrity_register - Register a gendisk as being integrity-capable
+ * @disk: struct gendisk pointer to make integrity-aware
+- * @template: optional integrity profile to register
++ * @template: integrity profile
+ *
+ * Description: When a device needs to advertise itself as being able
+ * to send/receive integrity metadata it must use this function to
+ * register the capability with the block layer. The template is a
+ * blk_integrity struct with values appropriate for the underlying
+- * hardware. If template is NULL the new profile is allocated but
+- * not filled out. See Documentation/block/data-integrity.txt.
++ * hardware. See Documentation/block/data-integrity.txt.
+ */
+ int blk_integrity_register(struct gendisk *disk, struct blk_integrity *template)
+ {
+ struct blk_integrity *bi;
+
+ BUG_ON(disk == NULL);
++ BUG_ON(template == NULL);
+
+ if (disk->integrity == NULL) {
+ bi = kmem_cache_alloc(integrity_cachep,
+- GFP_KERNEL | __GFP_ZERO);
++ GFP_KERNEL | __GFP_ZERO);
+ if (!bi)
+ return -1;
+
+@@ -346,16 +346,13 @@
+ bi = disk->integrity;
+
+ /* Use the provided profile as template */
+- if (template != NULL) {
+- bi->name = template->name;
+- bi->generate_fn = template->generate_fn;
+- bi->verify_fn = template->verify_fn;
+- bi->tuple_size = template->tuple_size;
+- bi->set_tag_fn = template->set_tag_fn;
+- bi->get_tag_fn = template->get_tag_fn;
+- bi->tag_size = template->tag_size;
+- } else
+- bi->name = "unsupported";
++ bi->name = template->name;
++ bi->generate_fn = template->generate_fn;
++ bi->verify_fn = template->verify_fn;
++ bi->tuple_size = template->tuple_size;
++ bi->set_tag_fn = template->set_tag_fn;
++ bi->get_tag_fn = template->get_tag_fn;
++ bi->tag_size = template->tag_size;
+
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/block/blk-merge.c linux-2.6.29-rc3.owrt/block/blk-merge.c
+--- linux-2.6.29.owrt/block/blk-merge.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/block/blk-merge.c 2009-05-10 23:48:28.000000000 +0200
+@@ -38,77 +38,72 @@
+ }
+ }
+
+-static unsigned int __blk_recalc_rq_segments(struct request_queue *q,
+- struct bio *bio)
++void blk_recalc_rq_segments(struct request *rq)
+ {
++ int nr_phys_segs;
+ unsigned int phys_size;
+ struct bio_vec *bv, *bvprv = NULL;
+- int cluster, i, high, highprv = 1;
+- unsigned int seg_size, nr_phys_segs;
+- struct bio *fbio, *bbio;
++ int seg_size;
++ int cluster;
++ struct req_iterator iter;
++ int high, highprv = 1;
++ struct request_queue *q = rq->q;
+
+- if (!bio)
+- return 0;
++ if (!rq->bio)
++ return;
+
+- fbio = bio;
+ cluster = test_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags);
+ seg_size = 0;
+ phys_size = nr_phys_segs = 0;
+- for_each_bio(bio) {
+- bio_for_each_segment(bv, bio, i) {
+- /*
+- * the trick here is making sure that a high page is
+- * never considered part of another segment, since that
+- * might change with the bounce page.
+- */
+- high = page_to_pfn(bv->bv_page) > q->bounce_pfn;
+- if (high || highprv)
++ rq_for_each_segment(bv, rq, iter) {
++ /*
++ * the trick here is making sure that a high page is never
++ * considered part of another segment, since that might
++ * change with the bounce page.
++ */
++ high = page_to_pfn(bv->bv_page) > q->bounce_pfn;
++ if (high || highprv)
++ goto new_segment;
++ if (cluster) {
++ if (seg_size + bv->bv_len > q->max_segment_size)
++ goto new_segment;
++ if (!BIOVEC_PHYS_MERGEABLE(bvprv, bv))
++ goto new_segment;
++ if (!BIOVEC_SEG_BOUNDARY(q, bvprv, bv))
+ goto new_segment;
+- if (cluster) {
+- if (seg_size + bv->bv_len > q->max_segment_size)
+- goto new_segment;
+- if (!BIOVEC_PHYS_MERGEABLE(bvprv, bv))
+- goto new_segment;
+- if (!BIOVEC_SEG_BOUNDARY(q, bvprv, bv))
+- goto new_segment;
+-
+- seg_size += bv->bv_len;
+- bvprv = bv;
+- continue;
+- }
+-new_segment:
+- if (nr_phys_segs == 1 && seg_size >
+- fbio->bi_seg_front_size)
+- fbio->bi_seg_front_size = seg_size;
+
+- nr_phys_segs++;
++ seg_size += bv->bv_len;
+ bvprv = bv;
+- seg_size = bv->bv_len;
+- highprv = high;
++ continue;
+ }
+- bbio = bio;
++new_segment:
++ if (nr_phys_segs == 1 && seg_size > rq->bio->bi_seg_front_size)
++ rq->bio->bi_seg_front_size = seg_size;
++
++ nr_phys_segs++;
++ bvprv = bv;
++ seg_size = bv->bv_len;
++ highprv = high;
+ }
+
+- if (nr_phys_segs == 1 && seg_size > fbio->bi_seg_front_size)
+- fbio->bi_seg_front_size = seg_size;
+- if (seg_size > bbio->bi_seg_back_size)
+- bbio->bi_seg_back_size = seg_size;
++ if (nr_phys_segs == 1 && seg_size > rq->bio->bi_seg_front_size)
++ rq->bio->bi_seg_front_size = seg_size;
++ if (seg_size > rq->biotail->bi_seg_back_size)
++ rq->biotail->bi_seg_back_size = seg_size;
+
+- return nr_phys_segs;
+-}
+-
+-void blk_recalc_rq_segments(struct request *rq)
+-{
+- rq->nr_phys_segments = __blk_recalc_rq_segments(rq->q, rq->bio);
++ rq->nr_phys_segments = nr_phys_segs;
+ }
+
+ void blk_recount_segments(struct request_queue *q, struct bio *bio)
+ {
++ struct request rq;
+ struct bio *nxt = bio->bi_next;
+-
++ rq.q = q;
++ rq.bio = rq.biotail = bio;
+ bio->bi_next = NULL;
+- bio->bi_phys_segments = __blk_recalc_rq_segments(q, bio);
++ blk_recalc_rq_segments(&rq);
+ bio->bi_next = nxt;
++ bio->bi_phys_segments = rq.nr_phys_segments;
+ bio->bi_flags |= (1 << BIO_SEG_VALID);
+ }
+ EXPORT_SYMBOL(blk_recount_segments);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/block/blk-sysfs.c linux-2.6.29-rc3.owrt/block/blk-sysfs.c
+--- linux-2.6.29.owrt/block/blk-sysfs.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/block/blk-sysfs.c 2009-05-10 23:48:28.000000000 +0200
+@@ -130,27 +130,6 @@
+ return queue_var_show(max_hw_sectors_kb, (page));
+ }
+
+-static ssize_t queue_nonrot_show(struct request_queue *q, char *page)
+-{
+- return queue_var_show(!blk_queue_nonrot(q), page);
+-}
+-
+-static ssize_t queue_nonrot_store(struct request_queue *q, const char *page,
+- size_t count)
+-{
+- unsigned long nm;
+- ssize_t ret = queue_var_store(&nm, page, count);
+-
+- spin_lock_irq(q->queue_lock);
+- if (nm)
+- queue_flag_clear(QUEUE_FLAG_NONROT, q);
+- else
+- queue_flag_set(QUEUE_FLAG_NONROT, q);
+- spin_unlock_irq(q->queue_lock);
+-
+- return ret;
+-}
+-
+ static ssize_t queue_nomerges_show(struct request_queue *q, char *page)
+ {
+ return queue_var_show(blk_queue_nomerges(q), page);
+@@ -167,8 +146,8 @@
+ queue_flag_set(QUEUE_FLAG_NOMERGES, q);
+ else
+ queue_flag_clear(QUEUE_FLAG_NOMERGES, q);
+- spin_unlock_irq(q->queue_lock);
+
++ spin_unlock_irq(q->queue_lock);
+ return ret;
+ }
+
+@@ -197,27 +176,6 @@
+ return ret;
+ }
+
+-static ssize_t queue_iostats_show(struct request_queue *q, char *page)
+-{
+- return queue_var_show(blk_queue_io_stat(q), page);
+-}
+-
+-static ssize_t queue_iostats_store(struct request_queue *q, const char *page,
+- size_t count)
+-{
+- unsigned long stats;
+- ssize_t ret = queue_var_store(&stats, page, count);
+-
+- spin_lock_irq(q->queue_lock);
+- if (stats)
+- queue_flag_set(QUEUE_FLAG_IO_STAT, q);
+- else
+- queue_flag_clear(QUEUE_FLAG_IO_STAT, q);
+- spin_unlock_irq(q->queue_lock);
+-
+- return ret;
+-}
+-
+ static struct queue_sysfs_entry queue_requests_entry = {
+ .attr = {.name = "nr_requests", .mode = S_IRUGO | S_IWUSR },
+ .show = queue_requests_show,
+@@ -252,12 +210,6 @@
+ .show = queue_hw_sector_size_show,
+ };
+
+-static struct queue_sysfs_entry queue_nonrot_entry = {
+- .attr = {.name = "rotational", .mode = S_IRUGO | S_IWUSR },
+- .show = queue_nonrot_show,
+- .store = queue_nonrot_store,
+-};
+-
+ static struct queue_sysfs_entry queue_nomerges_entry = {
+ .attr = {.name = "nomerges", .mode = S_IRUGO | S_IWUSR },
+ .show = queue_nomerges_show,
+@@ -270,12 +222,6 @@
+ .store = queue_rq_affinity_store,
+ };
+
+-static struct queue_sysfs_entry queue_iostats_entry = {
+- .attr = {.name = "iostats", .mode = S_IRUGO | S_IWUSR },
+- .show = queue_iostats_show,
+- .store = queue_iostats_store,
+-};
+-
+ static struct attribute *default_attrs[] = {
+ &queue_requests_entry.attr,
+ &queue_ra_entry.attr,
+@@ -283,10 +229,8 @@
+ &queue_max_sectors_entry.attr,
+ &queue_iosched_entry.attr,
+ &queue_hw_sector_size_entry.attr,
+- &queue_nonrot_entry.attr,
+ &queue_nomerges_entry.attr,
+ &queue_rq_affinity_entry.attr,
+- &queue_iostats_entry.attr,
+ NULL,
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/block/blk-timeout.c linux-2.6.29-rc3.owrt/block/blk-timeout.c
+--- linux-2.6.29.owrt/block/blk-timeout.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/block/blk-timeout.c 2009-05-10 23:48:28.000000000 +0200
+@@ -209,19 +209,12 @@
+ {
+ unsigned long flags;
+ struct request *rq, *tmp;
+- LIST_HEAD(list);
+
+ spin_lock_irqsave(q->queue_lock, flags);
+
+ elv_abort_queue(q);
+
+- /*
+- * Splice entries to local list, to avoid deadlocking if entries
+- * get readded to the timeout list by error handling
+- */
+- list_splice_init(&q->timeout_list, &list);
+-
+- list_for_each_entry_safe(rq, tmp, &list, timeout_list)
++ list_for_each_entry_safe(rq, tmp, &q->timeout_list, timeout_list)
+ blk_abort_request(rq);
+
+ spin_unlock_irqrestore(q->queue_lock, flags);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/block/blktrace.c linux-2.6.29-rc3.owrt/block/blktrace.c
+--- linux-2.6.29.owrt/block/blktrace.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/block/blktrace.c 2009-05-10 23:48:28.000000000 +0200
+@@ -142,7 +142,7 @@
+
+ what |= ddir_act[rw & WRITE];
+ what |= MASK_TC_BIT(rw, BARRIER);
+- what |= MASK_TC_BIT(rw, SYNCIO);
++ what |= MASK_TC_BIT(rw, SYNC);
+ what |= MASK_TC_BIT(rw, AHEAD);
+ what |= MASK_TC_BIT(rw, META);
+ what |= MASK_TC_BIT(rw, DISCARD);
+@@ -187,12 +187,59 @@
+
+ static struct dentry *blk_tree_root;
+ static DEFINE_MUTEX(blk_tree_mutex);
++static unsigned int root_users;
++
++static inline void blk_remove_root(void)
++{
++ if (blk_tree_root) {
++ debugfs_remove(blk_tree_root);
++ blk_tree_root = NULL;
++ }
++}
++
++static void blk_remove_tree(struct dentry *dir)
++{
++ mutex_lock(&blk_tree_mutex);
++ debugfs_remove(dir);
++ if (--root_users == 0)
++ blk_remove_root();
++ mutex_unlock(&blk_tree_mutex);
++}
++
++static struct dentry *blk_create_tree(const char *blk_name)
++{
++ struct dentry *dir = NULL;
++ int created = 0;
++
++ mutex_lock(&blk_tree_mutex);
++
++ if (!blk_tree_root) {
++ blk_tree_root = debugfs_create_dir("block", NULL);
++ if (!blk_tree_root)
++ goto err;
++ created = 1;
++ }
++
++ dir = debugfs_create_dir(blk_name, blk_tree_root);
++ if (dir)
++ root_users++;
++ else {
++ /* Delete root only if we created it */
++ if (created)
++ blk_remove_root();
++ }
++
++err:
++ mutex_unlock(&blk_tree_mutex);
++ return dir;
++}
+
+ static void blk_trace_cleanup(struct blk_trace *bt)
+ {
++ relay_close(bt->rchan);
+ debugfs_remove(bt->msg_file);
+ debugfs_remove(bt->dropped_file);
+- relay_close(bt->rchan);
++ blk_remove_tree(bt->dir);
+ free_percpu(bt->sequence);
+ free_percpu(bt->msg_data);
+ kfree(bt);
+@@ -299,18 +346,7 @@
+
+ static int blk_remove_buf_file_callback(struct dentry *dentry)
+ {
+- struct dentry *parent = dentry->d_parent;
+ debugfs_remove(dentry);
+-
+- /*
+- * this will fail for all but the last file, but that is ok. what we
+- * care about is the top level buts->name directory going away, when
+- * the last trace file is gone. Then we don't have to rmdir() that
+- * manually on trace stop, so it nicely solves the issue with
+- * force killing of running traces.
+- */
+-
+- debugfs_remove(parent);
+ return 0;
+ }
+
+@@ -368,15 +404,7 @@
+ goto err;
+
+ ret = -ENOENT;
+-
+- if (!blk_tree_root) {
+- blk_tree_root = debugfs_create_dir("block", NULL);
+- if (!blk_tree_root)
+- return -ENOMEM;
+- }
+-
+- dir = debugfs_create_dir(buts->name, blk_tree_root);
+-
++ dir = blk_create_tree(buts->name);
+ if (!dir)
+ goto err;
+
+@@ -430,6 +458,8 @@
+ atomic_dec(&blk_probes_ref);
+ mutex_unlock(&blk_probe_mutex);
+ err:
++ if (dir)
++ blk_remove_tree(dir);
+ if (bt) {
+ if (bt->msg_file)
+ debugfs_remove(bt->msg_file);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/block/bsg.c linux-2.6.29-rc3.owrt/block/bsg.c
+--- linux-2.6.29.owrt/block/bsg.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/block/bsg.c 2009-05-10 23:48:28.000000000 +0200
+@@ -244,8 +244,7 @@
+ * map sg_io_v4 to a request.
+ */
+ static struct request *
+-bsg_map_hdr(struct bsg_device *bd, struct sg_io_v4 *hdr, fmode_t has_write_perm,
+- u8 *sense)
++bsg_map_hdr(struct bsg_device *bd, struct sg_io_v4 *hdr, fmode_t has_write_perm)
+ {
+ struct request_queue *q = bd->queue;
+ struct request *rq, *next_rq = NULL;
+@@ -307,10 +306,6 @@
+ if (ret)
+ goto out;
+ }
+-
+- rq->sense = sense;
+- rq->sense_len = 0;
+-
+ return rq;
+ out:
+ if (rq->cmd != rq->__cmd)
+@@ -353,6 +348,9 @@
+ static void bsg_add_command(struct bsg_device *bd, struct request_queue *q,
+ struct bsg_command *bc, struct request *rq)
+ {
++ rq->sense = bc->sense;
++ rq->sense_len = 0;
++
+ /*
+ * add bc command to busy queue and submit rq for io
+ */
+@@ -421,7 +419,7 @@
+ {
+ int ret = 0;
+
+- dprintk("rq %p bio %p 0x%x\n", rq, bio, rq->errors);
++ dprintk("rq %p bio %p %u\n", rq, bio, rq->errors);
+ /*
+ * fill in all the output members
+ */
+@@ -637,7 +635,7 @@
+ /*
+ * get a request, fill in the blanks, and add to request queue
+ */
+- rq = bsg_map_hdr(bd, &bc->hdr, has_write_perm, bc->sense);
++ rq = bsg_map_hdr(bd, &bc->hdr, has_write_perm);
+ if (IS_ERR(rq)) {
+ ret = PTR_ERR(rq);
+ rq = NULL;
+@@ -924,12 +922,11 @@
+ struct request *rq;
+ struct bio *bio, *bidi_bio = NULL;
+ struct sg_io_v4 hdr;
+- u8 sense[SCSI_SENSE_BUFFERSIZE];
+
+ if (copy_from_user(&hdr, uarg, sizeof(hdr)))
+ return -EFAULT;
+
+- rq = bsg_map_hdr(bd, &hdr, file->f_mode & FMODE_WRITE, sense);
++ rq = bsg_map_hdr(bd, &hdr, file->f_mode & FMODE_WRITE);
+ if (IS_ERR(rq))
+ return PTR_ERR(rq);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/block/cfq-iosched.c linux-2.6.29-rc3.owrt/block/cfq-iosched.c
+--- linux-2.6.29.owrt/block/cfq-iosched.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/block/cfq-iosched.c 2009-05-10 23:48:28.000000000 +0200
+@@ -84,11 +84,6 @@
+ */
+ struct cfq_rb_root service_tree;
+ unsigned int busy_queues;
+- /*
+- * Used to track any pending rt requests so we can pre-empt current
+- * non-RT cfqq in service when this value is non-zero.
+- */
+- unsigned int busy_rt_queues;
+
+ int rq_in_driver;
+ int sync_flight;
+@@ -567,8 +562,6 @@
+ BUG_ON(cfq_cfqq_on_rr(cfqq));
+ cfq_mark_cfqq_on_rr(cfqq);
+ cfqd->busy_queues++;
+- if (cfq_class_rt(cfqq))
+- cfqd->busy_rt_queues++;
+
+ cfq_resort_rr_list(cfqd, cfqq);
+ }
+@@ -588,8 +581,6 @@
+
+ BUG_ON(!cfqd->busy_queues);
+ cfqd->busy_queues--;
+- if (cfq_class_rt(cfqq))
+- cfqd->busy_rt_queues--;
+ }
+
+ /*
+@@ -1014,20 +1005,6 @@
+ goto expire;
+
+ /*
+- * If we have a RT cfqq waiting, then we pre-empt the current non-rt
+- * cfqq.
+- */
+- if (!cfq_class_rt(cfqq) && cfqd->busy_rt_queues) {
+- /*
+- * We simulate this as cfqq timed out so that it gets to bank
+- * the remaining of its time slice.
+- */
+- cfq_log_cfqq(cfqd, cfqq, "preempt");
+- cfq_slice_expired(cfqd, 1);
+- goto new_queue;
+- }
+-
+- /*
+ * The active queue has requests and isn't expired, allow it to
+ * dispatch.
+ */
+@@ -1090,13 +1067,6 @@
+ if (RB_EMPTY_ROOT(&cfqq->sort_list))
+ break;
+
+- /*
+- * If there is a non-empty RT cfqq waiting for current
+- * cfqq's timeslice to complete, pre-empt this cfqq
+- */
+- if (!cfq_class_rt(cfqq) && cfqd->busy_rt_queues)
+- break;
+-
+ } while (dispatched < max_dispatch);
+
+ /*
+@@ -1831,12 +1801,6 @@
+ if (rq_is_meta(rq) && !cfqq->meta_pending)
+ return 1;
+
+- /*
+- * Allow an RT request to pre-empt an ongoing non-RT cfqq timeslice.
+- */
+- if (cfq_class_rt(new_cfqq) && !cfq_class_rt(cfqq))
+- return 1;
+-
+ if (!cfqd->active_cic || !cfq_cfqq_wait_request(cfqq))
+ return 0;
+
+@@ -1906,8 +1870,7 @@
+ /*
+ * not the active queue - expire current slice if it is
+ * idle and has expired it's mean thinktime or this new queue
+- * has some old slice time left and is of higher priority or
+- * this new queue is RT and the current one is BE
++ * has some old slice time left and is of higher priority
+ */
+ cfq_preempt_queue(cfqd, cfqq);
+ cfq_mark_cfqq_must_dispatch(cfqq);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/block/genhd.c linux-2.6.29-rc3.owrt/block/genhd.c
+--- linux-2.6.29.owrt/block/genhd.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/block/genhd.c 2009-05-10 23:48:28.000000000 +0200
+@@ -256,22 +256,6 @@
+ }
+ #endif /* CONFIG_PROC_FS */
+
+-/**
+- * register_blkdev - register a new block device
+- *
+- * @major: the requested major device number [1..255]. If @major=0, try to
+- * allocate any unused major number.
+- * @name: the name of the new block device as a zero terminated string
+- *
+- * The @name must be unique within the system.
+- *
+- * The return value depends on the @major input parameter.
+- * - if a major device number was requested in range [1..255] then the
+- * function returns zero on success, or a negative error code
+- * - if any unused major number was requested with @major=0 parameter
+- * then the return value is the allocated major number in range
+- * [1..255] or a negative error code otherwise
+- */
+ int register_blkdev(unsigned int major, const char *name)
+ {
+ struct blk_major_name **n, *p;
+@@ -1103,14 +1087,6 @@
+ if (strcmp(dev_name(dev), name))
+ continue;
+
+- if (partno < disk->minors) {
+- /* We need to return the right devno, even
+- * if the partition doesn't exist yet.
+- */
+- devt = MKDEV(MAJOR(dev->devt),
+- MINOR(dev->devt) + partno);
+- break;
+- }
+ part = disk_get_part(disk, partno);
+ if (part) {
+ devt = part_devt(part);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/CREDITS linux-2.6.29-rc3.owrt/CREDITS
+--- linux-2.6.29.owrt/CREDITS 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/CREDITS 2009-05-10 23:48:28.000000000 +0200
+@@ -2166,6 +2166,7 @@
+
+ N: Pavel Machek
+ E: pavel@ucw.cz
++E: pavel@suse.cz
+ D: Softcursor for vga, hypertech cdrom support, vcsa bugfix, nbd
+ D: sun4/330 port, capabilities for elf, speedup for rm on ext2, USB,
+ D: work on suspend-to-ram/disk, killing duplicates from ioctl32
+@@ -3738,7 +3739,7 @@
+ S: Germany
+
+ N: Gertjan van Wingerde
+-E: gwingerde@gmail.com
++E: gwingerde@home.nl
+ D: Ralink rt2x00 WLAN driver
+ D: Minix V2 file-system
+ D: Misc fixes
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/crypto/ahash.c linux-2.6.29-rc3.owrt/crypto/ahash.c
+--- linux-2.6.29.owrt/crypto/ahash.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/crypto/ahash.c 2009-05-10 23:48:28.000000000 +0200
+@@ -214,7 +214,7 @@
+ seq_printf(m, "async : %s\n", alg->cra_flags & CRYPTO_ALG_ASYNC ?
+ "yes" : "no");
+ seq_printf(m, "blocksize : %u\n", alg->cra_blocksize);
+- seq_printf(m, "digestsize : %u\n", alg->cra_ahash.digestsize);
++ seq_printf(m, "digestsize : %u\n", alg->cra_hash.digestsize);
+ }
+
+ const struct crypto_type crypto_ahash_type = {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/crypto/algapi.c linux-2.6.29-rc3.owrt/crypto/algapi.c
+--- linux-2.6.29.owrt/crypto/algapi.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/crypto/algapi.c 2009-05-10 23:48:28.000000000 +0200
+@@ -149,9 +149,6 @@
+ if (q == alg)
+ goto err;
+
+- if (crypto_is_moribund(q))
+- continue;
+-
+ if (crypto_is_larval(q)) {
+ if (!strcmp(alg->cra_driver_name, q->cra_driver_name))
+ goto err;
+@@ -200,7 +197,7 @@
+
+ down_write(&crypto_alg_sem);
+ list_for_each_entry(q, &crypto_alg_list, cra_list) {
+- if (crypto_is_moribund(q) || !crypto_is_larval(q))
++ if (!crypto_is_larval(q))
+ continue;
+
+ test = (struct crypto_larval *)q;
+@@ -213,7 +210,6 @@
+ goto unlock;
+
+ found:
+- q->cra_flags |= CRYPTO_ALG_DEAD;
+ alg = test->adult;
+ if (err || list_empty(&alg->cra_list))
+ goto complete;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/crypto/api.c linux-2.6.29-rc3.owrt/crypto/api.c
+--- linux-2.6.29.owrt/crypto/api.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/crypto/api.c 2009-05-10 23:48:28.000000000 +0200
+@@ -215,19 +215,8 @@
+ mask &= ~(CRYPTO_ALG_LARVAL | CRYPTO_ALG_DEAD);
+ type &= mask;
+
+- alg = crypto_alg_lookup(name, type, mask);
+- if (!alg) {
+- char tmp[CRYPTO_MAX_ALG_NAME];
+-
+- request_module(name);
+-
+- if (!((type ^ CRYPTO_ALG_NEED_FALLBACK) & mask) &&
+- snprintf(tmp, sizeof(tmp), "%s-all", name) < sizeof(tmp))
+- request_module(tmp);
+-
+- alg = crypto_alg_lookup(name, type, mask);
+- }
+-
++ alg = try_then_request_module(crypto_alg_lookup(name, type, mask),
++ name);
+ if (alg)
+ return crypto_is_larval(alg) ? crypto_larval_wait(alg) : alg;
+
+@@ -568,34 +557,34 @@
+ return ERR_PTR(err);
+ }
+ EXPORT_SYMBOL_GPL(crypto_alloc_tfm);
+-
++
+ /*
+- * crypto_destroy_tfm - Free crypto transform
+- * @mem: Start of tfm slab
++ * crypto_free_tfm - Free crypto transform
+ * @tfm: Transform to free
+ *
+- * This function frees up the transform and any associated resources,
++ * crypto_free_tfm() frees up the transform and any associated resources,
+ * then drops the refcount on the associated algorithm.
+ */
+-void crypto_destroy_tfm(void *mem, struct crypto_tfm *tfm)
++void crypto_free_tfm(struct crypto_tfm *tfm)
+ {
+ struct crypto_alg *alg;
+ int size;
+
+- if (unlikely(!mem))
++ if (unlikely(!tfm))
+ return;
+
+ alg = tfm->__crt_alg;
+- size = ksize(mem);
++ size = sizeof(*tfm) + alg->cra_ctxsize;
+
+ if (!tfm->exit && alg->cra_exit)
+ alg->cra_exit(tfm);
+ crypto_exit_ops(tfm);
+ crypto_mod_put(alg);
+- memset(mem, 0, size);
+- kfree(mem);
++ memset(tfm, 0, size);
++ kfree(tfm);
+ }
+-EXPORT_SYMBOL_GPL(crypto_destroy_tfm);
++
++EXPORT_SYMBOL_GPL(crypto_free_tfm);
+
+ int crypto_has_alg(const char *name, u32 type, u32 mask)
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/crypto/lrw.c linux-2.6.29-rc3.owrt/crypto/lrw.c
+--- linux-2.6.29.owrt/crypto/lrw.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/crypto/lrw.c 2009-05-10 23:48:28.000000000 +0200
+@@ -45,13 +45,7 @@
+
+ static inline void setbit128_bbe(void *b, int bit)
+ {
+- __set_bit(bit ^ (0x80 -
+-#ifdef __BIG_ENDIAN
+- BITS_PER_LONG
+-#else
+- BITS_PER_BYTE
+-#endif
+- ), b);
++ __set_bit(bit ^ 0x78, b);
+ }
+
+ static int setkey(struct crypto_tfm *parent, const u8 *key,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/crypto/scatterwalk.c linux-2.6.29-rc3.owrt/crypto/scatterwalk.c
+--- linux-2.6.29.owrt/crypto/scatterwalk.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/crypto/scatterwalk.c 2009-05-10 23:48:28.000000000 +0200
+@@ -54,8 +54,7 @@
+ struct page *page;
+
+ page = sg_page(walk->sg) + ((walk->offset - 1) >> PAGE_SHIFT);
+- if (!PageSlab(page))
+- flush_dcache_page(page);
++ flush_dcache_page(page);
+ }
+
+ if (more) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/crypto/shash.c linux-2.6.29-rc3.owrt/crypto/shash.c
+--- linux-2.6.29.owrt/crypto/shash.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/crypto/shash.c 2009-05-10 23:48:28.000000000 +0200
+@@ -388,15 +388,10 @@
+ struct shash_desc *desc = crypto_tfm_ctx(tfm);
+ struct crypto_shash *shash;
+
+- if (!crypto_mod_get(calg))
+- return -EAGAIN;
+-
+ shash = __crypto_shash_cast(crypto_create_tfm(
+ calg, &crypto_shash_type));
+- if (IS_ERR(shash)) {
+- crypto_mod_put(calg);
++ if (IS_ERR(shash))
+ return PTR_ERR(shash);
+- }
+
+ desc->tfm = shash;
+ tfm->exit = crypto_exit_shash_ops_compat;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/ABI/testing/sysfs-bus-pci linux-2.6.29-rc3.owrt/Documentation/ABI/testing/sysfs-bus-pci
+--- linux-2.6.29.owrt/Documentation/ABI/testing/sysfs-bus-pci 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/ABI/testing/sysfs-bus-pci 2009-05-10 23:48:28.000000000 +0200
+@@ -1,46 +1,3 @@
+-What: /sys/bus/pci/drivers/.../bind
+-Date: December 2003
+-Contact: linux-pci@vger.kernel.org
+-Description:
+- Writing a device location to this file will cause
+- the driver to attempt to bind to the device found at
+- this location. This is useful for overriding default
+- bindings. The format for the location is: DDDD:BB:DD.F.
+- That is Domain:Bus:Device.Function and is the same as
+- found in /sys/bus/pci/devices/. For example:
+- # echo 0000:00:19.0 > /sys/bus/pci/drivers/foo/bind
+- (Note: kernels before 2.6.28 may require echo -n).
+-
+-What: /sys/bus/pci/drivers/.../unbind
+-Date: December 2003
+-Contact: linux-pci@vger.kernel.org
+-Description:
+- Writing a device location to this file will cause the
+- driver to attempt to unbind from the device found at
+- this location. This may be useful when overriding default
+- bindings. The format for the location is: DDDD:BB:DD.F.
+- That is Domain:Bus:Device.Function and is the same as
+- found in /sys/bus/pci/devices/. For example:
+- # echo 0000:00:19.0 > /sys/bus/pci/drivers/foo/unbind
+- (Note: kernels before 2.6.28 may require echo -n).
+-
+-What: /sys/bus/pci/drivers/.../new_id
+-Date: December 2003
+-Contact: linux-pci@vger.kernel.org
+-Description:
+- Writing a device ID to this file will attempt to
+- dynamically add a new device ID to a PCI device driver.
+- This may allow the driver to support more hardware than
+- was included in the driver's static device ID support
+- table at compile time. The format for the device ID is:
+- VVVV DDDD SVVV SDDD CCCC MMMM PPPP. That is Vendor ID,
+- Device ID, Subsystem Vendor ID, Subsystem Device ID,
+- Class, Class Mask, and Private Driver Data. The Vendor ID
+- and Device ID fields are required, the rest are optional.
+- Upon successfully adding an ID, the driver will probe
+- for the device and attempt to bind to it. For example:
+- # echo "8086 10f5" > /sys/bus/pci/drivers/foo/new_id
+-
+ What: /sys/bus/pci/devices/.../vpd
+ Date: February 2008
+ Contact: Ben Hutchings <bhutchings@solarflare.com>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/ABI/testing/sysfs-firmware-memmap linux-2.6.29-rc3.owrt/Documentation/ABI/testing/sysfs-firmware-memmap
+--- linux-2.6.29.owrt/Documentation/ABI/testing/sysfs-firmware-memmap 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/ABI/testing/sysfs-firmware-memmap 2009-05-10 23:48:28.000000000 +0200
+@@ -1,6 +1,6 @@
+ What: /sys/firmware/memmap/
+ Date: June 2008
+-Contact: Bernhard Walle <bernhard.walle@gmx.de>
++Contact: Bernhard Walle <bwalle@suse.de>
+ Description:
+ On all platforms, the firmware provides a memory map which the
+ kernel reads. The resources from that memory map are registered
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/block/biodoc.txt linux-2.6.29-rc3.owrt/Documentation/block/biodoc.txt
+--- linux-2.6.29.owrt/Documentation/block/biodoc.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/block/biodoc.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -186,9 +186,8 @@
+ do not have a corresponding kernel virtual address space mapping) and
+ low-memory pages.
+
+-Note: Please refer to Documentation/PCI/PCI-DMA-mapping.txt for a discussion
+-on PCI high mem DMA aspects and mapping of scatter gather lists, and support
+-for 64 bit PCI.
++Note: Please refer to DMA-mapping.txt for a discussion on PCI high mem DMA
++aspects and mapping of scatter gather lists, and support for 64 bit PCI.
+
+ Special handling is required only for cases where i/o needs to happen on
+ pages at physical memory addresses beyond what the device can support. In these
+@@ -954,14 +953,14 @@
+ results in some sort of conflict internally,
+ this hook allows it to do that.
+
+-elevator_dispatch_fn* fills the dispatch queue with ready requests.
++elevator_dispatch_fn fills the dispatch queue with ready requests.
+ I/O schedulers are free to postpone requests by
+ not filling the dispatch queue unless @force
+ is non-zero. Once dispatched, I/O schedulers
+ are not allowed to manipulate the requests -
+ they belong to generic dispatch queue.
+
+-elevator_add_req_fn* called to add a new request into the scheduler
++elevator_add_req_fn called to add a new request into the scheduler
+
+ elevator_queue_empty_fn returns true if the merge queue is empty.
+ Drivers shouldn't use this, but rather check
+@@ -991,7 +990,7 @@
+ elevator_deactivate_req_fn Called when device driver decides to delay
+ a request by requeueing it.
+
+-elevator_init_fn*
++elevator_init_fn
+ elevator_exit_fn Allocate and free any elevator specific storage
+ for a queue.
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/block/queue-sysfs.txt linux-2.6.29-rc3.owrt/Documentation/block/queue-sysfs.txt
+--- linux-2.6.29.owrt/Documentation/block/queue-sysfs.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/block/queue-sysfs.txt 1970-01-01 01:00:00.000000000 +0100
+@@ -1,63 +0,0 @@
+-Queue sysfs files
+-=================
+-
+-This text file will detail the queue files that are located in the sysfs tree
+-for each block device. Note that stacked devices typically do not export
+-any settings, since their queue merely functions are a remapping target.
+-These files are the ones found in the /sys/block/xxx/queue/ directory.
+-
+-Files denoted with a RO postfix are readonly and the RW postfix means
+-read-write.
+-
+-hw_sector_size (RO)
+--------------------
+-This is the hardware sector size of the device, in bytes.
+-
+-max_hw_sectors_kb (RO)
+-----------------------
+-This is the maximum number of kilobytes supported in a single data transfer.
+-
+-max_sectors_kb (RW)
+--------------------
+-This is the maximum number of kilobytes that the block layer will allow
+-for a filesystem request. Must be smaller than or equal to the maximum
+-size allowed by the hardware.
+-
+-nomerges (RW)
+--------------
+-This enables the user to disable the lookup logic involved with IO merging
+-requests in the block layer. Merging may still occur through a direct
+-1-hit cache, since that comes for (almost) free. The IO scheduler will not
+-waste cycles doing tree/hash lookups for merges if nomerges is 1. Defaults
+-to 0, enabling all merges.
+-
+-nr_requests (RW)
+-----------------
+-This controls how many requests may be allocated in the block layer for
+-read or write requests. Note that the total allocated number may be twice
+-this amount, since it applies only to reads or writes (not the accumulated
+-sum).
+-
+-read_ahead_kb (RW)
+-------------------
+-Maximum number of kilobytes to read-ahead for filesystems on this block
+-device.
+-
+-rq_affinity (RW)
+-----------------
+-If this option is enabled, the block layer will migrate request completions
+-to the CPU that originally submitted the request. For some workloads
+-this provides a significant reduction in CPU cycles due to caching effects.
+-
+-scheduler (RW)
+---------------
+-When read, this file will display the current and available IO schedulers
+-for this block device. The currently active IO scheduler will be enclosed
+-in [] brackets. Writing an IO scheduler name to this file will switch
+-control of this block device to that new IO scheduler. Note that writing
+-an IO scheduler name to this file will attempt to load that IO scheduler
+-module, if it isn't already present in the system.
+-
+-
+-
+-Jens Axboe <jens.axboe@oracle.com>, February 2009
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/cgroups/cgroups.txt linux-2.6.29-rc3.owrt/Documentation/cgroups/cgroups.txt
+--- linux-2.6.29.owrt/Documentation/cgroups/cgroups.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/cgroups/cgroups.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -252,8 +252,10 @@
+ When a task is moved from one cgroup to another, it gets a new
+ css_set pointer - if there's an already existing css_set with the
+ desired collection of cgroups then that group is reused, else a new
+-css_set is allocated. The appropriate existing css_set is located by
+-looking into a hash table.
++css_set is allocated. Note that the current implementation uses a
++linear search to locate an appropriate existing css_set, so isn't
++very efficient. A future version will use a hash table for better
++performance.
+
+ To allow access from a cgroup to the css_sets (and hence tasks)
+ that comprise it, a set of cg_cgroup_link objects form a lattice;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/cgroups/cpusets.txt linux-2.6.29-rc3.owrt/Documentation/cgroups/cpusets.txt
+--- linux-2.6.29.owrt/Documentation/cgroups/cpusets.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/cgroups/cpusets.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -142,7 +142,7 @@
+ - in fork and exit, to attach and detach a task from its cpuset.
+ - in sched_setaffinity, to mask the requested CPUs by what's
+ allowed in that tasks cpuset.
+- - in sched.c migrate_live_tasks(), to keep migrating tasks within
++ - in sched.c migrate_all_tasks(), to keep migrating tasks within
+ the CPUs allowed by their cpuset, if possible.
+ - in the mbind and set_mempolicy system calls, to mask the requested
+ Memory Nodes by what's allowed in that tasks cpuset.
+@@ -175,10 +175,6 @@
+ - mem_exclusive flag: is memory placement exclusive?
+ - mem_hardwall flag: is memory allocation hardwalled
+ - memory_pressure: measure of how much paging pressure in cpuset
+- - memory_spread_page flag: if set, spread page cache evenly on allowed nodes
+- - memory_spread_slab flag: if set, spread slab cache evenly on allowed nodes
+- - sched_load_balance flag: if set, load balance within CPUs on that cpuset
+- - sched_relax_domain_level: the searching range when migrating tasks
+
+ In addition, the root cpuset only has the following file:
+ - memory_pressure_enabled flag: compute memory_pressure?
+@@ -256,7 +252,7 @@
+
+ This is useful both on tightly managed systems running a wide mix of
+ submitted jobs, which may choose to terminate or re-prioritize jobs that
+-are trying to use more memory than allowed on the nodes assigned to them,
++are trying to use more memory than allowed on the nodes assigned them,
+ and with tightly coupled, long running, massively parallel scientific
+ computing jobs that will dramatically fail to meet required performance
+ goals if they start to use more memory than allowed to them.
+@@ -382,7 +378,7 @@
+ The algorithmic cost of load balancing and its impact on key shared
+ kernel data structures such as the task list increases more than
+ linearly with the number of CPUs being balanced. So the scheduler
+-has support to partition the systems CPUs into a number of sched
++has support to partition the systems CPUs into a number of sched
+ domains such that it only load balances within each sched domain.
+ Each sched domain covers some subset of the CPUs in the system;
+ no two sched domains overlap; some CPUs might not be in any sched
+@@ -489,22 +485,17 @@
+ The internal kernel cpuset to scheduler interface passes from the
+ cpuset code to the scheduler code a partition of the load balanced
+ CPUs in the system. This partition is a set of subsets (represented
+-as an array of struct cpumask) of CPUs, pairwise disjoint, that cover
+-all the CPUs that must be load balanced.
++as an array of cpumask_t) of CPUs, pairwise disjoint, that cover all
++the CPUs that must be load balanced.
+
+-The cpuset code builds a new such partition and passes it to the
+-scheduler sched domain setup code, to have the sched domains rebuilt
+-as necessary, whenever:
+- - the 'sched_load_balance' flag of a cpuset with non-empty CPUs changes,
+- - or CPUs come or go from a cpuset with this flag enabled,
+- - or 'sched_relax_domain_level' value of a cpuset with non-empty CPUs
+- and with this flag enabled changes,
+- - or a cpuset with non-empty CPUs and with this flag enabled is removed,
+- - or a cpu is offlined/onlined.
++Whenever the 'sched_load_balance' flag changes, or CPUs come or go
++from a cpuset with this flag enabled, or a cpuset with this flag
++enabled is removed, the cpuset code builds a new such partition and
++passes it to the scheduler sched domain setup code, to have the sched
++domains rebuilt as necessary.
+
+ This partition exactly defines what sched domains the scheduler should
+-setup - one sched domain for each element (struct cpumask) in the
+-partition.
++setup - one sched domain for each element (cpumask_t) in the partition.
+
+ The scheduler remembers the currently active sched domain partitions.
+ When the scheduler routine partition_sched_domains() is invoked from
+@@ -568,7 +559,7 @@
+ requests 0 and others are -1 then 0 is used.
+
+ Note that modifying this file will have both good and bad effects,
+-and whether it is acceptable or not depends on your situation.
++and whether it is acceptable or not will be depend on your situation.
+ Don't modify this file if you are not sure.
+
+ If your situation is:
+@@ -609,15 +600,19 @@
+
+ If a cpuset has its 'cpus' modified, then each task in that cpuset
+ will have its allowed CPU placement changed immediately. Similarly,
+-if a tasks pid is written to another cpusets 'tasks' file, then its
+-allowed CPU placement is changed immediately. If such a task had been
+-bound to some subset of its cpuset using the sched_setaffinity() call,
+-the task will be allowed to run on any CPU allowed in its new cpuset,
+-negating the effect of the prior sched_setaffinity() call.
++if a tasks pid is written to a cpusets 'tasks' file, in either its
++current cpuset or another cpuset, then its allowed CPU placement is
++changed immediately. If such a task had been bound to some subset
++of its cpuset using the sched_setaffinity() call, the task will be
++allowed to run on any CPU allowed in its new cpuset, negating the
++affect of the prior sched_setaffinity() call.
+
+ In summary, the memory placement of a task whose cpuset is changed is
+ updated by the kernel, on the next allocation of a page for that task,
+-and the processor placement is updated immediately.
++but the processor placement is not updated, until that tasks pid is
++rewritten to the 'tasks' file of its cpuset. This is done to avoid
++impacting the scheduler code in the kernel with a check for changes
++in a tasks processor placement.
+
+ Normally, once a page is allocated (given a physical page
+ of main memory) then that page stays on whatever node it
+@@ -686,14 +681,10 @@
+ # The next line should display '/Charlie'
+ cat /proc/self/cpuset
+
+-There are ways to query or modify cpusets:
+- - via the cpuset file system directly, using the various cd, mkdir, echo,
+- cat, rmdir commands from the shell, or their equivalent from C.
+- - via the C library libcpuset.
+- - via the C library libcgroup.
+- (http://sourceforge.net/proects/libcg/)
+- - via the python application cset.
+- (http://developer.novell.com/wiki/index.php/Cpuset)
++In the future, a C library interface to cpusets will likely be
++available. For now, the only way to query or modify cpusets is
++via the cpuset file system, using the various cd, mkdir, echo, cat,
++rmdir commands from the shell, or their equivalent from C.
+
+ The sched_setaffinity calls can also be done at the shell prompt using
+ SGI's runon or Robert Love's taskset. The mbind and set_mempolicy
+@@ -765,7 +756,7 @@
+
+ is equivalent to
+
+-mount -t cgroup -ocpuset,noprefix X /dev/cpuset
++mount -t cgroup -ocpuset X /dev/cpuset
+ echo "/sbin/cpuset_release_agent" > /dev/cpuset/release_agent
+
+ 2.2 Adding/removing cpus
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/cgroups/memcg_test.txt linux-2.6.29-rc3.owrt/Documentation/cgroups/memcg_test.txt
+--- linux-2.6.29.owrt/Documentation/cgroups/memcg_test.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/cgroups/memcg_test.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -1,6 +1,6 @@
+ Memory Resource Controller(Memcg) Implementation Memo.
+-Last Updated: 2009/1/19
+-Base Kernel Version: based on 2.6.29-rc2.
++Last Updated: 2008/12/15
++Base Kernel Version: based on 2.6.28-rc8-mm.
+
+ Because VM is getting complex (one of reasons is memcg...), memcg's behavior
+ is complex. This is a document for memcg's internal behavior.
+@@ -340,23 +340,3 @@
+ # mount -t cgroup none /cgroup -t cpuset,memory,cpu,devices
+
+ and do task move, mkdir, rmdir etc...under this.
+-
+- 9.7 swapoff.
+- Besides management of swap is one of complicated parts of memcg,
+- call path of swap-in at swapoff is not same as usual swap-in path..
+- It's worth to be tested explicitly.
+-
+- For example, test like following is good.
+- (Shell-A)
+- # mount -t cgroup none /cgroup -t memory
+- # mkdir /cgroup/test
+- # echo 40M > /cgroup/test/memory.limit_in_bytes
+- # echo 0 > /cgroup/test/tasks
+- Run malloc(100M) program under this. You'll see 60M of swaps.
+- (Shell-B)
+- # move all tasks in /cgroup/test to /cgroup
+- # /sbin/swapoff -a
+- # rmdir /test/cgroup
+- # kill malloc task.
+-
+- Of course, tmpfs v.s. swapoff test should be tested, too.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/Changes linux-2.6.29-rc3.owrt/Documentation/Changes
+--- linux-2.6.29.owrt/Documentation/Changes 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/Changes 2009-05-10 23:48:28.000000000 +0200
+@@ -33,12 +33,10 @@
+ o binutils 2.12 # ld -v
+ o util-linux 2.10o # fdformat --version
+ o module-init-tools 0.9.10 # depmod -V
+-o e2fsprogs 1.41.4 # e2fsck -V
++o e2fsprogs 1.29 # tune2fs
+ o jfsutils 1.1.3 # fsck.jfs -V
+ o reiserfsprogs 3.6.3 # reiserfsck -V 2>&1|grep reiserfsprogs
+ o xfsprogs 2.6.0 # xfs_db -V
+-o squashfs-tools 4.0 # mksquashfs -version
+-o btrfs-progs 0.18 # btrfsck
+ o pcmciautils 004 # pccardctl -V
+ o quota-tools 3.09 # quota -V
+ o PPP 2.4.0 # pppd --version
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/CodingStyle linux-2.6.29-rc3.owrt/Documentation/CodingStyle
+--- linux-2.6.29.owrt/Documentation/CodingStyle 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/CodingStyle 2009-05-10 23:48:28.000000000 +0200
+@@ -483,25 +483,17 @@
+ (* (max steps 1)
+ c-basic-offset)))
+
+-(add-hook 'c-mode-common-hook
+- (lambda ()
+- ;; Add kernel style
+- (c-add-style
+- "linux-tabs-only"
+- '("linux" (c-offsets-alist
+- (arglist-cont-nonempty
+- c-lineup-gcc-asm-reg
+- c-lineup-arglist-tabs-only))))))
+-
+ (add-hook 'c-mode-hook
+ (lambda ()
+ (let ((filename (buffer-file-name)))
+ ;; Enable kernel mode for the appropriate files
+ (when (and filename
+- (string-match (expand-file-name "~/src/linux-trees")
+- filename))
++ (string-match "~/src/linux-trees" filename))
+ (setq indent-tabs-mode t)
+- (c-set-style "linux-tabs-only")))))
++ (c-set-style "linux")
++ (c-set-offset 'arglist-cont-nonempty
++ '(c-lineup-gcc-asm-reg
++ c-lineup-arglist-tabs-only))))))
+
+ This will make emacs go better with the kernel coding style for C
+ files below ~/src/linux-trees.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/connector/cn_test.c linux-2.6.29-rc3.owrt/Documentation/connector/cn_test.c
+--- linux-2.6.29.owrt/Documentation/connector/cn_test.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/connector/cn_test.c 2009-05-10 23:48:28.000000000 +0200
+@@ -137,7 +137,7 @@
+
+ memcpy(m + 1, data, m->len);
+
+- cn_netlink_send(m, 0, GFP_ATOMIC);
++ cn_netlink_send(m, 0, gfp_any());
+ kfree(m);
+ }
+
+@@ -160,8 +160,10 @@
+ goto err_out;
+ }
+
+- setup_timer(&cn_test_timer, cn_test_timer_func, 0);
++ init_timer(&cn_test_timer);
++ cn_test_timer.function = cn_test_timer_func;
+ cn_test_timer.expires = jiffies + HZ;
++ cn_test_timer.data = 0;
+ add_timer(&cn_test_timer);
+
+ return 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/cpu-freq/user-guide.txt linux-2.6.29-rc3.owrt/Documentation/cpu-freq/user-guide.txt
+--- linux-2.6.29.owrt/Documentation/cpu-freq/user-guide.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/cpu-freq/user-guide.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -195,3 +195,19 @@
+ you can change the speed of the CPU,
+ but only within the limits of
+ scaling_min_freq and scaling_max_freq.
++
++
++3.2 Deprecated Interfaces
++-------------------------
++
++Depending on your kernel configuration, you might find the following
++cpufreq-related files:
++/proc/cpufreq
++/proc/sys/cpu/*/speed
++/proc/sys/cpu/*/speed-min
++/proc/sys/cpu/*/speed-max
++
++These are files for deprecated interfaces to cpufreq, which offer far
++less functionality. Because of this, these interfaces aren't described
++here.
++
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/DMA-API.txt linux-2.6.29-rc3.owrt/Documentation/DMA-API.txt
+--- linux-2.6.29.owrt/Documentation/DMA-API.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/DMA-API.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -5,7 +5,7 @@
+
+ This document describes the DMA API. For a more gentle introduction
+ phrased in terms of the pci_ equivalents (and actual examples) see
+-Documentation/PCI/PCI-DMA-mapping.txt.
++DMA-mapping.txt
+
+ This API is split into two pieces. Part I describes the API and the
+ corresponding pci_ API. Part II describes the extensions to the API
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/DocBook/device-drivers.tmpl linux-2.6.29-rc3.owrt/Documentation/DocBook/device-drivers.tmpl
+--- linux-2.6.29.owrt/Documentation/DocBook/device-drivers.tmpl 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/DocBook/device-drivers.tmpl 1970-01-01 01:00:00.000000000 +0100
+@@ -1,418 +0,0 @@
+-<?xml version="1.0" encoding="UTF-8"?>
+-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+- "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
+-
+-<book id="LinuxDriversAPI">
+- <bookinfo>
+- <title>Linux Device Drivers</title>
+-
+- <legalnotice>
+- <para>
+- This documentation is free software; you can redistribute
+- it and/or modify it under the terms of the GNU General Public
+- License as published by the Free Software Foundation; either
+- version 2 of the License, or (at your option) any later
+- version.
+- </para>
+-
+- <para>
+- This program is distributed in the hope that it will be
+- useful, but WITHOUT ANY WARRANTY; without even the implied
+- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+- See the GNU General Public License for more details.
+- </para>
+-
+- <para>
+- You should have received a copy of the GNU General Public
+- License along with this program; if not, write to the Free
+- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+- MA 02111-1307 USA
+- </para>
+-
+- <para>
+- For more details see the file COPYING in the source
+- distribution of Linux.
+- </para>
+- </legalnotice>
+- </bookinfo>
+-
+-<toc></toc>
+-
+- <chapter id="Basics">
+- <title>Driver Basics</title>
+- <sect1><title>Driver Entry and Exit points</title>
+-!Iinclude/linux/init.h
+- </sect1>
+-
+- <sect1><title>Atomic and pointer manipulation</title>
+-!Iarch/x86/include/asm/atomic_32.h
+-!Iarch/x86/include/asm/unaligned.h
+- </sect1>
+-
+- <sect1><title>Delaying, scheduling, and timer routines</title>
+-!Iinclude/linux/sched.h
+-!Ekernel/sched.c
+-!Ekernel/timer.c
+- </sect1>
+- <sect1><title>High-resolution timers</title>
+-!Iinclude/linux/ktime.h
+-!Iinclude/linux/hrtimer.h
+-!Ekernel/hrtimer.c
+- </sect1>
+- <sect1><title>Workqueues and Kevents</title>
+-!Ekernel/workqueue.c
+- </sect1>
+- <sect1><title>Internal Functions</title>
+-!Ikernel/exit.c
+-!Ikernel/signal.c
+-!Iinclude/linux/kthread.h
+-!Ekernel/kthread.c
+- </sect1>
+-
+- <sect1><title>Kernel objects manipulation</title>
+-<!--
+-X!Iinclude/linux/kobject.h
+--->
+-!Elib/kobject.c
+- </sect1>
+-
+- <sect1><title>Kernel utility functions</title>
+-!Iinclude/linux/kernel.h
+-!Ekernel/printk.c
+-!Ekernel/panic.c
+-!Ekernel/sys.c
+-!Ekernel/rcupdate.c
+- </sect1>
+-
+- <sect1><title>Device Resource Management</title>
+-!Edrivers/base/devres.c
+- </sect1>
+-
+- </chapter>
+-
+- <chapter id="devdrivers">
+- <title>Device drivers infrastructure</title>
+- <sect1><title>Device Drivers Base</title>
+-<!--
+-X!Iinclude/linux/device.h
+--->
+-!Edrivers/base/driver.c
+-!Edrivers/base/core.c
+-!Edrivers/base/class.c
+-!Edrivers/base/firmware_class.c
+-!Edrivers/base/transport_class.c
+-<!-- Cannot be included, because
+- attribute_container_add_class_device_adapter
+- and attribute_container_classdev_to_container
+- exceed allowed 44 characters maximum
+-X!Edrivers/base/attribute_container.c
+--->
+-!Edrivers/base/sys.c
+-<!--
+-X!Edrivers/base/interface.c
+--->
+-!Edrivers/base/platform.c
+-!Edrivers/base/bus.c
+- </sect1>
+- <sect1><title>Device Drivers Power Management</title>
+-!Edrivers/base/power/main.c
+- </sect1>
+- <sect1><title>Device Drivers ACPI Support</title>
+-<!-- Internal functions only
+-X!Edrivers/acpi/sleep/main.c
+-X!Edrivers/acpi/sleep/wakeup.c
+-X!Edrivers/acpi/motherboard.c
+-X!Edrivers/acpi/bus.c
+--->
+-!Edrivers/acpi/scan.c
+-!Idrivers/acpi/scan.c
+-<!-- No correct structured comments
+-X!Edrivers/acpi/pci_bind.c
+--->
+- </sect1>
+- <sect1><title>Device drivers PnP support</title>
+-!Idrivers/pnp/core.c
+-<!-- No correct structured comments
+-X!Edrivers/pnp/system.c
+- -->
+-!Edrivers/pnp/card.c
+-!Idrivers/pnp/driver.c
+-!Edrivers/pnp/manager.c
+-!Edrivers/pnp/support.c
+- </sect1>
+- <sect1><title>Userspace IO devices</title>
+-!Edrivers/uio/uio.c
+-!Iinclude/linux/uio_driver.h
+- </sect1>
+- </chapter>
+-
+- <chapter id="parportdev">
+- <title>Parallel Port Devices</title>
+-!Iinclude/linux/parport.h
+-!Edrivers/parport/ieee1284.c
+-!Edrivers/parport/share.c
+-!Idrivers/parport/daisy.c
+- </chapter>
+-
+- <chapter id="message_devices">
+- <title>Message-based devices</title>
+- <sect1><title>Fusion message devices</title>
+-!Edrivers/message/fusion/mptbase.c
+-!Idrivers/message/fusion/mptbase.c
+-!Edrivers/message/fusion/mptscsih.c
+-!Idrivers/message/fusion/mptscsih.c
+-!Idrivers/message/fusion/mptctl.c
+-!Idrivers/message/fusion/mptspi.c
+-!Idrivers/message/fusion/mptfc.c
+-!Idrivers/message/fusion/mptlan.c
+- </sect1>
+- <sect1><title>I2O message devices</title>
+-!Iinclude/linux/i2o.h
+-!Idrivers/message/i2o/core.h
+-!Edrivers/message/i2o/iop.c
+-!Idrivers/message/i2o/iop.c
+-!Idrivers/message/i2o/config-osm.c
+-!Edrivers/message/i2o/exec-osm.c
+-!Idrivers/message/i2o/exec-osm.c
+-!Idrivers/message/i2o/bus-osm.c
+-!Edrivers/message/i2o/device.c
+-!Idrivers/message/i2o/device.c
+-!Idrivers/message/i2o/driver.c
+-!Idrivers/message/i2o/pci.c
+-!Idrivers/message/i2o/i2o_block.c
+-!Idrivers/message/i2o/i2o_scsi.c
+-!Idrivers/message/i2o/i2o_proc.c
+- </sect1>
+- </chapter>
+-
+- <chapter id="snddev">
+- <title>Sound Devices</title>
+-!Iinclude/sound/core.h
+-!Esound/sound_core.c
+-!Iinclude/sound/pcm.h
+-!Esound/core/pcm.c
+-!Esound/core/device.c
+-!Esound/core/info.c
+-!Esound/core/rawmidi.c
+-!Esound/core/sound.c
+-!Esound/core/memory.c
+-!Esound/core/pcm_memory.c
+-!Esound/core/init.c
+-!Esound/core/isadma.c
+-!Esound/core/control.c
+-!Esound/core/pcm_lib.c
+-!Esound/core/hwdep.c
+-!Esound/core/pcm_native.c
+-!Esound/core/memalloc.c
+-<!-- FIXME: Removed for now since no structured comments in source
+-X!Isound/sound_firmware.c
+--->
+- </chapter>
+-
+- <chapter id="uart16x50">
+- <title>16x50 UART Driver</title>
+-!Iinclude/linux/serial_core.h
+-!Edrivers/serial/serial_core.c
+-!Edrivers/serial/8250.c
+- </chapter>
+-
+- <chapter id="fbdev">
+- <title>Frame Buffer Library</title>
+-
+- <para>
+- The frame buffer drivers depend heavily on four data structures.
+- These structures are declared in include/linux/fb.h. They are
+- fb_info, fb_var_screeninfo, fb_fix_screeninfo and fb_monospecs.
+- The last three can be made available to and from userland.
+- </para>
+-
+- <para>
+- fb_info defines the current state of a particular video card.
+- Inside fb_info, there exists a fb_ops structure which is a
+- collection of needed functions to make fbdev and fbcon work.
+- fb_info is only visible to the kernel.
+- </para>
+-
+- <para>
+- fb_var_screeninfo is used to describe the features of a video card
+- that are user defined. With fb_var_screeninfo, things such as
+- depth and the resolution may be defined.
+- </para>
+-
+- <para>
+- The next structure is fb_fix_screeninfo. This defines the
+- properties of a card that are created when a mode is set and can't
+- be changed otherwise. A good example of this is the start of the
+- frame buffer memory. This "locks" the address of the frame buffer
+- memory, so that it cannot be changed or moved.
+- </para>
+-
+- <para>
+- The last structure is fb_monospecs. In the old API, there was
+- little importance for fb_monospecs. This allowed for forbidden things
+- such as setting a mode of 800x600 on a fix frequency monitor. With
+- the new API, fb_monospecs prevents such things, and if used
+- correctly, can prevent a monitor from being cooked. fb_monospecs
+- will not be useful until kernels 2.5.x.
+- </para>
+-
+- <sect1><title>Frame Buffer Memory</title>
+-!Edrivers/video/fbmem.c
+- </sect1>
+-<!--
+- <sect1><title>Frame Buffer Console</title>
+-X!Edrivers/video/console/fbcon.c
+- </sect1>
+--->
+- <sect1><title>Frame Buffer Colormap</title>
+-!Edrivers/video/fbcmap.c
+- </sect1>
+-<!-- FIXME:
+- drivers/video/fbgen.c has no docs, which stuffs up the sgml. Comment
+- out until somebody adds docs. KAO
+- <sect1><title>Frame Buffer Generic Functions</title>
+-X!Idrivers/video/fbgen.c
+- </sect1>
+-KAO -->
+- <sect1><title>Frame Buffer Video Mode Database</title>
+-!Idrivers/video/modedb.c
+-!Edrivers/video/modedb.c
+- </sect1>
+- <sect1><title>Frame Buffer Macintosh Video Mode Database</title>
+-!Edrivers/video/macmodes.c
+- </sect1>
+- <sect1><title>Frame Buffer Fonts</title>
+- <para>
+- Refer to the file drivers/video/console/fonts.c for more information.
+- </para>
+-<!-- FIXME: Removed for now since no structured comments in source
+-X!Idrivers/video/console/fonts.c
+--->
+- </sect1>
+- </chapter>
+-
+- <chapter id="input_subsystem">
+- <title>Input Subsystem</title>
+-!Iinclude/linux/input.h
+-!Edrivers/input/input.c
+-!Edrivers/input/ff-core.c
+-!Edrivers/input/ff-memless.c
+- </chapter>
+-
+- <chapter id="spi">
+- <title>Serial Peripheral Interface (SPI)</title>
+- <para>
+- SPI is the "Serial Peripheral Interface", widely used with
+- embedded systems because it is a simple and efficient
+- interface: basically a multiplexed shift register.
+- Its three signal wires hold a clock (SCK, often in the range
+- of 1-20 MHz), a "Master Out, Slave In" (MOSI) data line, and
+- a "Master In, Slave Out" (MISO) data line.
+- SPI is a full duplex protocol; for each bit shifted out the
+- MOSI line (one per clock) another is shifted in on the MISO line.
+- Those bits are assembled into words of various sizes on the
+- way to and from system memory.
+- An additional chipselect line is usually active-low (nCS);
+- four signals are normally used for each peripheral, plus
+- sometimes an interrupt.
+- </para>
+- <para>
+- The SPI bus facilities listed here provide a generalized
+- interface to declare SPI busses and devices, manage them
+- according to the standard Linux driver model, and perform
+- input/output operations.
+- At this time, only "master" side interfaces are supported,
+- where Linux talks to SPI peripherals and does not implement
+- such a peripheral itself.
+- (Interfaces to support implementing SPI slaves would
+- necessarily look different.)
+- </para>
+- <para>
+- The programming interface is structured around two kinds of driver,
+- and two kinds of device.
+- A "Controller Driver" abstracts the controller hardware, which may
+- be as simple as a set of GPIO pins or as complex as a pair of FIFOs
+- connected to dual DMA engines on the other side of the SPI shift
+- register (maximizing throughput). Such drivers bridge between
+- whatever bus they sit on (often the platform bus) and SPI, and
+- expose the SPI side of their device as a
+- <structname>struct spi_master</structname>.
+- SPI devices are children of that master, represented as a
+- <structname>struct spi_device</structname> and manufactured from
+- <structname>struct spi_board_info</structname> descriptors which
+- are usually provided by board-specific initialization code.
+- A <structname>struct spi_driver</structname> is called a
+- "Protocol Driver", and is bound to a spi_device using normal
+- driver model calls.
+- </para>
+- <para>
+- The I/O model is a set of queued messages. Protocol drivers
+- submit one or more <structname>struct spi_message</structname>
+- objects, which are processed and completed asynchronously.
+- (There are synchronous wrappers, however.) Messages are
+- built from one or more <structname>struct spi_transfer</structname>
+- objects, each of which wraps a full duplex SPI transfer.
+- A variety of protocol tweaking options are needed, because
+- different chips adopt very different policies for how they
+- use the bits transferred with SPI.
+- </para>
+-!Iinclude/linux/spi/spi.h
+-!Fdrivers/spi/spi.c spi_register_board_info
+-!Edrivers/spi/spi.c
+- </chapter>
+-
+- <chapter id="i2c">
+- <title>I<superscript>2</superscript>C and SMBus Subsystem</title>
+-
+- <para>
+- I<superscript>2</superscript>C (or without fancy typography, "I2C")
+- is an acronym for the "Inter-IC" bus, a simple bus protocol which is
+- widely used where low data rate communications suffice.
+- Since it's also a licensed trademark, some vendors use another
+- name (such as "Two-Wire Interface", TWI) for the same bus.
+- I2C only needs two signals (SCL for clock, SDA for data), conserving
+- board real estate and minimizing signal quality issues.
+- Most I2C devices use seven bit addresses, and bus speeds of up
+- to 400 kHz; there's a high speed extension (3.4 MHz) that's not yet
+- found wide use.
+- I2C is a multi-master bus; open drain signaling is used to
+- arbitrate between masters, as well as to handshake and to
+- synchronize clocks from slower clients.
+- </para>
+-
+- <para>
+- The Linux I2C programming interfaces support only the master
+- side of bus interactions, not the slave side.
+- The programming interface is structured around two kinds of driver,
+- and two kinds of device.
+- An I2C "Adapter Driver" abstracts the controller hardware; it binds
+- to a physical device (perhaps a PCI device or platform_device) and
+- exposes a <structname>struct i2c_adapter</structname> representing
+- each I2C bus segment it manages.
+- On each I2C bus segment will be I2C devices represented by a
+- <structname>struct i2c_client</structname>. Those devices will
+- be bound to a <structname>struct i2c_driver</structname>,
+- which should follow the standard Linux driver model.
+- (At this writing, a legacy model is more widely used.)
+- There are functions to perform various I2C protocol operations; at
+- this writing all such functions are usable only from task context.
+- </para>
+-
+- <para>
+- The System Management Bus (SMBus) is a sibling protocol. Most SMBus
+- systems are also I2C conformant. The electrical constraints are
+- tighter for SMBus, and it standardizes particular protocol messages
+- and idioms. Controllers that support I2C can also support most
+- SMBus operations, but SMBus controllers don't support all the protocol
+- options that an I2C controller will.
+- There are functions to perform various SMBus protocol operations,
+- either using I2C primitives or by issuing SMBus commands to
+- i2c_adapter devices which don't support those I2C operations.
+- </para>
+-
+-!Iinclude/linux/i2c.h
+-!Fdrivers/i2c/i2c-boardinfo.c i2c_register_board_info
+-!Edrivers/i2c/i2c-core.c
+- </chapter>
+-
+-</book>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/DocBook/kernel-api.tmpl linux-2.6.29-rc3.owrt/Documentation/DocBook/kernel-api.tmpl
+--- linux-2.6.29.owrt/Documentation/DocBook/kernel-api.tmpl 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/DocBook/kernel-api.tmpl 2009-05-10 23:48:28.000000000 +0200
+@@ -38,6 +38,58 @@
+
+ <toc></toc>
+
++ <chapter id="Basics">
++ <title>Driver Basics</title>
++ <sect1><title>Driver Entry and Exit points</title>
++!Iinclude/linux/init.h
++ </sect1>
++
++ <sect1><title>Atomic and pointer manipulation</title>
++!Iarch/x86/include/asm/atomic_32.h
++!Iarch/x86/include/asm/unaligned.h
++ </sect1>
++
++ <sect1><title>Delaying, scheduling, and timer routines</title>
++!Iinclude/linux/sched.h
++!Ekernel/sched.c
++!Ekernel/timer.c
++ </sect1>
++ <sect1><title>High-resolution timers</title>
++!Iinclude/linux/ktime.h
++!Iinclude/linux/hrtimer.h
++!Ekernel/hrtimer.c
++ </sect1>
++ <sect1><title>Workqueues and Kevents</title>
++!Ekernel/workqueue.c
++ </sect1>
++ <sect1><title>Internal Functions</title>
++!Ikernel/exit.c
++!Ikernel/signal.c
++!Iinclude/linux/kthread.h
++!Ekernel/kthread.c
++ </sect1>
++
++ <sect1><title>Kernel objects manipulation</title>
++<!--
++X!Iinclude/linux/kobject.h
++-->
++!Elib/kobject.c
++ </sect1>
++
++ <sect1><title>Kernel utility functions</title>
++!Iinclude/linux/kernel.h
++!Ekernel/printk.c
++!Ekernel/panic.c
++!Ekernel/sys.c
++!Ekernel/rcupdate.c
++ </sect1>
++
++ <sect1><title>Device Resource Management</title>
++!Edrivers/base/devres.c
++ </sect1>
++
++ </chapter>
++
+ <chapter id="adt">
+ <title>Data Types</title>
+ <sect1><title>Doubly Linked Lists</title>
+@@ -246,6 +298,62 @@
+ !Ikernel/acct.c
+ </chapter>
+
++ <chapter id="devdrivers">
++ <title>Device drivers infrastructure</title>
++ <sect1><title>Device Drivers Base</title>
++<!--
++X!Iinclude/linux/device.h
++-->
++!Edrivers/base/driver.c
++!Edrivers/base/core.c
++!Edrivers/base/class.c
++!Edrivers/base/firmware_class.c
++!Edrivers/base/transport_class.c
++<!-- Cannot be included, because
++ attribute_container_add_class_device_adapter
++ and attribute_container_classdev_to_container
++ exceed allowed 44 characters maximum
++X!Edrivers/base/attribute_container.c
++-->
++!Edrivers/base/sys.c
++<!--
++X!Edrivers/base/interface.c
++-->
++!Edrivers/base/platform.c
++!Edrivers/base/bus.c
++ </sect1>
++ <sect1><title>Device Drivers Power Management</title>
++!Edrivers/base/power/main.c
++ </sect1>
++ <sect1><title>Device Drivers ACPI Support</title>
++<!-- Internal functions only
++X!Edrivers/acpi/sleep/main.c
++X!Edrivers/acpi/sleep/wakeup.c
++X!Edrivers/acpi/motherboard.c
++X!Edrivers/acpi/bus.c
++-->
++!Edrivers/acpi/scan.c
++!Idrivers/acpi/scan.c
++<!-- No correct structured comments
++X!Edrivers/acpi/pci_bind.c
++-->
++ </sect1>
++ <sect1><title>Device drivers PnP support</title>
++!Idrivers/pnp/core.c
++<!-- No correct structured comments
++X!Edrivers/pnp/system.c
++ -->
++!Edrivers/pnp/card.c
++!Idrivers/pnp/driver.c
++!Edrivers/pnp/manager.c
++!Edrivers/pnp/support.c
++ </sect1>
++ <sect1><title>Userspace IO devices</title>
++!Edrivers/uio/uio.c
++!Iinclude/linux/uio_driver.h
++ </sect1>
++ </chapter>
++
+ <chapter id="blkdev">
+ <title>Block Devices</title>
+ !Eblock/blk-core.c
+@@ -273,6 +381,275 @@
+ !Edrivers/char/misc.c
+ </chapter>
+
++ <chapter id="parportdev">
++ <title>Parallel Port Devices</title>
++!Iinclude/linux/parport.h
++!Edrivers/parport/ieee1284.c
++!Edrivers/parport/share.c
++!Idrivers/parport/daisy.c
++ </chapter>
++
++ <chapter id="message_devices">
++ <title>Message-based devices</title>
++ <sect1><title>Fusion message devices</title>
++!Edrivers/message/fusion/mptbase.c
++!Idrivers/message/fusion/mptbase.c
++!Edrivers/message/fusion/mptscsih.c
++!Idrivers/message/fusion/mptscsih.c
++!Idrivers/message/fusion/mptctl.c
++!Idrivers/message/fusion/mptspi.c
++!Idrivers/message/fusion/mptfc.c
++!Idrivers/message/fusion/mptlan.c
++ </sect1>
++ <sect1><title>I2O message devices</title>
++!Iinclude/linux/i2o.h
++!Idrivers/message/i2o/core.h
++!Edrivers/message/i2o/iop.c
++!Idrivers/message/i2o/iop.c
++!Idrivers/message/i2o/config-osm.c
++!Edrivers/message/i2o/exec-osm.c
++!Idrivers/message/i2o/exec-osm.c
++!Idrivers/message/i2o/bus-osm.c
++!Edrivers/message/i2o/device.c
++!Idrivers/message/i2o/device.c
++!Idrivers/message/i2o/driver.c
++!Idrivers/message/i2o/pci.c
++!Idrivers/message/i2o/i2o_block.c
++!Idrivers/message/i2o/i2o_scsi.c
++!Idrivers/message/i2o/i2o_proc.c
++ </sect1>
++ </chapter>
++
++ <chapter id="snddev">
++ <title>Sound Devices</title>
++!Iinclude/sound/core.h
++!Esound/sound_core.c
++!Iinclude/sound/pcm.h
++!Esound/core/pcm.c
++!Esound/core/device.c
++!Esound/core/info.c
++!Esound/core/rawmidi.c
++!Esound/core/sound.c
++!Esound/core/memory.c
++!Esound/core/pcm_memory.c
++!Esound/core/init.c
++!Esound/core/isadma.c
++!Esound/core/control.c
++!Esound/core/pcm_lib.c
++!Esound/core/hwdep.c
++!Esound/core/pcm_native.c
++!Esound/core/memalloc.c
++<!-- FIXME: Removed for now since no structured comments in source
++X!Isound/sound_firmware.c
++-->
++ </chapter>
++
++ <chapter id="uart16x50">
++ <title>16x50 UART Driver</title>
++!Iinclude/linux/serial_core.h
++!Edrivers/serial/serial_core.c
++!Edrivers/serial/8250.c
++ </chapter>
++
++ <chapter id="fbdev">
++ <title>Frame Buffer Library</title>
++
++ <para>
++ The frame buffer drivers depend heavily on four data structures.
++ These structures are declared in include/linux/fb.h. They are
++ fb_info, fb_var_screeninfo, fb_fix_screeninfo and fb_monospecs.
++ The last three can be made available to and from userland.
++ </para>
++
++ <para>
++ fb_info defines the current state of a particular video card.
++ Inside fb_info, there exists a fb_ops structure which is a
++ collection of needed functions to make fbdev and fbcon work.
++ fb_info is only visible to the kernel.
++ </para>
++
++ <para>
++ fb_var_screeninfo is used to describe the features of a video card
++ that are user defined. With fb_var_screeninfo, things such as
++ depth and the resolution may be defined.
++ </para>
++
++ <para>
++ The next structure is fb_fix_screeninfo. This defines the
++ properties of a card that are created when a mode is set and can't
++ be changed otherwise. A good example of this is the start of the
++ frame buffer memory. This "locks" the address of the frame buffer
++ memory, so that it cannot be changed or moved.
++ </para>
++
++ <para>
++ The last structure is fb_monospecs. In the old API, there was
++ little importance for fb_monospecs. This allowed for forbidden things
++ such as setting a mode of 800x600 on a fix frequency monitor. With
++ the new API, fb_monospecs prevents such things, and if used
++ correctly, can prevent a monitor from being cooked. fb_monospecs
++ will not be useful until kernels 2.5.x.
++ </para>
++
++ <sect1><title>Frame Buffer Memory</title>
++!Edrivers/video/fbmem.c
++ </sect1>
++<!--
++ <sect1><title>Frame Buffer Console</title>
++X!Edrivers/video/console/fbcon.c
++ </sect1>
++-->
++ <sect1><title>Frame Buffer Colormap</title>
++!Edrivers/video/fbcmap.c
++ </sect1>
++<!-- FIXME:
++ drivers/video/fbgen.c has no docs, which stuffs up the sgml. Comment
++ out until somebody adds docs. KAO
++ <sect1><title>Frame Buffer Generic Functions</title>
++X!Idrivers/video/fbgen.c
++ </sect1>
++KAO -->
++ <sect1><title>Frame Buffer Video Mode Database</title>
++!Idrivers/video/modedb.c
++!Edrivers/video/modedb.c
++ </sect1>
++ <sect1><title>Frame Buffer Macintosh Video Mode Database</title>
++!Edrivers/video/macmodes.c
++ </sect1>
++ <sect1><title>Frame Buffer Fonts</title>
++ <para>
++ Refer to the file drivers/video/console/fonts.c for more information.
++ </para>
++<!-- FIXME: Removed for now since no structured comments in source
++X!Idrivers/video/console/fonts.c
++-->
++ </sect1>
++ </chapter>
++
++ <chapter id="input_subsystem">
++ <title>Input Subsystem</title>
++!Iinclude/linux/input.h
++!Edrivers/input/input.c
++!Edrivers/input/ff-core.c
++!Edrivers/input/ff-memless.c
++ </chapter>
++
++ <chapter id="spi">
++ <title>Serial Peripheral Interface (SPI)</title>
++ <para>
++ SPI is the "Serial Peripheral Interface", widely used with
++ embedded systems because it is a simple and efficient
++ interface: basically a multiplexed shift register.
++ Its three signal wires hold a clock (SCK, often in the range
++ of 1-20 MHz), a "Master Out, Slave In" (MOSI) data line, and
++ a "Master In, Slave Out" (MISO) data line.
++ SPI is a full duplex protocol; for each bit shifted out the
++ MOSI line (one per clock) another is shifted in on the MISO line.
++ Those bits are assembled into words of various sizes on the
++ way to and from system memory.
++ An additional chipselect line is usually active-low (nCS);
++ four signals are normally used for each peripheral, plus
++ sometimes an interrupt.
++ </para>
++ <para>
++ The SPI bus facilities listed here provide a generalized
++ interface to declare SPI busses and devices, manage them
++ according to the standard Linux driver model, and perform
++ input/output operations.
++ At this time, only "master" side interfaces are supported,
++ where Linux talks to SPI peripherals and does not implement
++ such a peripheral itself.
++ (Interfaces to support implementing SPI slaves would
++ necessarily look different.)
++ </para>
++ <para>
++ The programming interface is structured around two kinds of driver,
++ and two kinds of device.
++ A "Controller Driver" abstracts the controller hardware, which may
++ be as simple as a set of GPIO pins or as complex as a pair of FIFOs
++ connected to dual DMA engines on the other side of the SPI shift
++ register (maximizing throughput). Such drivers bridge between
++ whatever bus they sit on (often the platform bus) and SPI, and
++ expose the SPI side of their device as a
++ <structname>struct spi_master</structname>.
++ SPI devices are children of that master, represented as a
++ <structname>struct spi_device</structname> and manufactured from
++ <structname>struct spi_board_info</structname> descriptors which
++ are usually provided by board-specific initialization code.
++ A <structname>struct spi_driver</structname> is called a
++ "Protocol Driver", and is bound to a spi_device using normal
++ driver model calls.
++ </para>
++ <para>
++ The I/O model is a set of queued messages. Protocol drivers
++ submit one or more <structname>struct spi_message</structname>
++ objects, which are processed and completed asynchronously.
++ (There are synchronous wrappers, however.) Messages are
++ built from one or more <structname>struct spi_transfer</structname>
++ objects, each of which wraps a full duplex SPI transfer.
++ A variety of protocol tweaking options are needed, because
++ different chips adopt very different policies for how they
++ use the bits transferred with SPI.
++ </para>
++!Iinclude/linux/spi/spi.h
++!Fdrivers/spi/spi.c spi_register_board_info
++!Edrivers/spi/spi.c
++ </chapter>
++
++ <chapter id="i2c">
++ <title>I<superscript>2</superscript>C and SMBus Subsystem</title>
++
++ <para>
++ I<superscript>2</superscript>C (or without fancy typography, "I2C")
++ is an acronym for the "Inter-IC" bus, a simple bus protocol which is
++ widely used where low data rate communications suffice.
++ Since it's also a licensed trademark, some vendors use another
++ name (such as "Two-Wire Interface", TWI) for the same bus.
++ I2C only needs two signals (SCL for clock, SDA for data), conserving
++ board real estate and minimizing signal quality issues.
++ Most I2C devices use seven bit addresses, and bus speeds of up
++ to 400 kHz; there's a high speed extension (3.4 MHz) that's not yet
++ found wide use.
++ I2C is a multi-master bus; open drain signaling is used to
++ arbitrate between masters, as well as to handshake and to
++ synchronize clocks from slower clients.
++ </para>
++
++ <para>
++ The Linux I2C programming interfaces support only the master
++ side of bus interactions, not the slave side.
++ The programming interface is structured around two kinds of driver,
++ and two kinds of device.
++ An I2C "Adapter Driver" abstracts the controller hardware; it binds
++ to a physical device (perhaps a PCI device or platform_device) and
++ exposes a <structname>struct i2c_adapter</structname> representing
++ each I2C bus segment it manages.
++ On each I2C bus segment will be I2C devices represented by a
++ <structname>struct i2c_client</structname>. Those devices will
++ be bound to a <structname>struct i2c_driver</structname>,
++ which should follow the standard Linux driver model.
++ (At this writing, a legacy model is more widely used.)
++ There are functions to perform various I2C protocol operations; at
++ this writing all such functions are usable only from task context.
++ </para>
++
++ <para>
++ The System Management Bus (SMBus) is a sibling protocol. Most SMBus
++ systems are also I2C conformant. The electrical constraints are
++ tighter for SMBus, and it standardizes particular protocol messages
++ and idioms. Controllers that support I2C can also support most
++ SMBus operations, but SMBus controllers don't support all the protocol
++ options that an I2C controller will.
++ There are functions to perform various SMBus protocol operations,
++ either using I2C primitives or by issuing SMBus commands to
++ i2c_adapter devices which don't support those I2C operations.
++ </para>
++
++!Iinclude/linux/i2c.h
++!Fdrivers/i2c/i2c-boardinfo.c i2c_register_board_info
++!Edrivers/i2c/i2c-core.c
++ </chapter>
++
+ <chapter id="clk">
+ <title>Clock Framework</title>
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/DocBook/Makefile linux-2.6.29-rc3.owrt/Documentation/DocBook/Makefile
+--- linux-2.6.29.owrt/Documentation/DocBook/Makefile 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/DocBook/Makefile 2009-05-10 23:48:28.000000000 +0200
+@@ -6,7 +6,7 @@
+ # To add a new book the only step required is to add the book to the
+ # list of DOCBOOKS.
+
+-DOCBOOKS := z8530book.xml mcabook.xml device-drivers.xml \
++DOCBOOKS := z8530book.xml mcabook.xml \
+ kernel-hacking.xml kernel-locking.xml deviceiobook.xml \
+ procfs-guide.xml writing_usb_driver.xml networking.xml \
+ kernel-api.xml filesystems.xml lsm.xml usb.xml kgdb.xml \
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/DocBook/uio-howto.tmpl linux-2.6.29-rc3.owrt/Documentation/DocBook/uio-howto.tmpl
+--- linux-2.6.29.owrt/Documentation/DocBook/uio-howto.tmpl 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/DocBook/uio-howto.tmpl 2009-05-10 23:48:28.000000000 +0200
+@@ -42,12 +42,6 @@
+
+ <revhistory>
+ <revision>
+- <revnumber>0.7</revnumber>
+- <date>2008-12-23</date>
+- <authorinitials>hjk</authorinitials>
+- <revremark>Added generic platform drivers and offset attribute.</revremark>
+- </revision>
+- <revision>
+ <revnumber>0.6</revnumber>
+ <date>2008-12-05</date>
+ <authorinitials>hjk</authorinitials>
+@@ -318,16 +312,6 @@
+ pointed to by addr.
+ </para>
+ </listitem>
+-<listitem>
+- <para>
+- <filename>offset</filename>: The offset, in bytes, that has to be
+- added to the pointer returned by <function>mmap()</function> to get
+- to the actual device memory. This is important if the device's memory
+- is not page aligned. Remember that pointers returned by
+- <function>mmap()</function> are always page aligned, so it is good
+- style to always add this offset.
+- </para>
+-</listitem>
+ </itemizedlist>
+
+ <para>
+@@ -610,78 +594,6 @@
+ </para>
+ </sect1>
+
+-<sect1 id="using_uio_pdrv">
+-<title>Using uio_pdrv for platform devices</title>
+- <para>
+- In many cases, UIO drivers for platform devices can be handled in a
+- generic way. In the same place where you define your
+- <varname>struct platform_device</varname>, you simply also implement
+- your interrupt handler and fill your
+- <varname>struct uio_info</varname>. A pointer to this
+- <varname>struct uio_info</varname> is then used as
+- <varname>platform_data</varname> for your platform device.
+- </para>
+- <para>
+- You also need to set up an array of <varname>struct resource</varname>
+- containing addresses and sizes of your memory mappings. This
+- information is passed to the driver using the
+- <varname>.resource</varname> and <varname>.num_resources</varname>
+- elements of <varname>struct platform_device</varname>.
+- </para>
+- <para>
+- You now have to set the <varname>.name</varname> element of
+- <varname>struct platform_device</varname> to
+- <varname>"uio_pdrv"</varname> to use the generic UIO platform device
+- driver. This driver will fill the <varname>mem[]</varname> array
+- according to the resources given, and register the device.
+- </para>
+- <para>
+- The advantage of this approach is that you only have to edit a file
+- you need to edit anyway. You do not have to create an extra driver.
+- </para>
+-</sect1>
+-
+-<sect1 id="using_uio_pdrv_genirq">
+-<title>Using uio_pdrv_genirq for platform devices</title>
+- <para>
+- Especially in embedded devices, you frequently find chips where the
+- irq pin is tied to its own dedicated interrupt line. In such cases,
+- where you can be really sure the interrupt is not shared, we can take
+- the concept of <varname>uio_pdrv</varname> one step further and use a
+- generic interrupt handler. That's what
+- <varname>uio_pdrv_genirq</varname> does.
+- </para>
+- <para>
+- The setup for this driver is the same as described above for
+- <varname>uio_pdrv</varname>, except that you do not implement an
+- interrupt handler. The <varname>.handler</varname> element of
+- <varname>struct uio_info</varname> must remain
+- <varname>NULL</varname>. The <varname>.irq_flags</varname> element
+- must not contain <varname>IRQF_SHARED</varname>.
+- </para>
+- <para>
+- You will set the <varname>.name</varname> element of
+- <varname>struct platform_device</varname> to
+- <varname>"uio_pdrv_genirq"</varname> to use this driver.
+- </para>
+- <para>
+- The generic interrupt handler of <varname>uio_pdrv_genirq</varname>
+- will simply disable the interrupt line using
+- <function>disable_irq_nosync()</function>. After doing its work,
+- userspace can reenable the interrupt by writing 0x00000001 to the UIO
+- device file. The driver already implements an
+- <function>irq_control()</function> to make this possible, you must not
+- implement your own.
+- </para>
+- <para>
+- Using <varname>uio_pdrv_genirq</varname> not only saves a few lines of
+- interrupt handler code. You also do not need to know anything about
+- the chip's internal registers to create the kernel part of the driver.
+- All you need to know is the irq number of the pin the chip is
+- connected to.
+- </para>
+-</sect1>
+-
+ </chapter>
+
+ <chapter id="userspace_driver" xreflabel="Writing a driver in user space">
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/driver-model/device.txt linux-2.6.29-rc3.owrt/Documentation/driver-model/device.txt
+--- linux-2.6.29.owrt/Documentation/driver-model/device.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/driver-model/device.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -127,11 +127,9 @@
+ Attributes
+ ~~~~~~~~~~
+ struct device_attribute {
+- struct attribute attr;
+- ssize_t (*show)(struct device *dev, struct device_attribute *attr,
+- char *buf);
+- ssize_t (*store)(struct device *dev, struct device_attribute *attr,
+- const char *buf, size_t count);
++ struct attribute attr;
++ ssize_t (*show)(struct device * dev, char * buf, size_t count, loff_t off);
++ ssize_t (*store)(struct device * dev, const char * buf, size_t count, loff_t off);
+ };
+
+ Attributes of devices can be exported via drivers using a simple
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/dvb/README.flexcop linux-2.6.29-rc3.owrt/Documentation/dvb/README.flexcop
+--- linux-2.6.29.owrt/Documentation/dvb/README.flexcop 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/Documentation/dvb/README.flexcop 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,205 @@
++This README escorted the skystar2-driver rewriting procedure. It describes the
++state of the new flexcop-driver set and some internals are written down here
++too.
++
++This document hopefully describes things about the flexcop and its
++device-offsprings. Goal was to write an easy-to-write and easy-to-read set of
++drivers based on the skystar2.c and other information.
++
++Remark: flexcop-pci.c was a copy of skystar2.c, but every line has been
++touched and rewritten.
++
++History & News
++==============
++ 2005-04-01 - correct USB ISOC transfers (thanks to Vadim Catana)
++
++
++
++
++General coding processing
++=========================
++
++We should proceed as follows (as long as no one complains):
++
++0) Think before start writing code!
++
++1) rewriting the skystar2.c with the help of the flexcop register descriptions
++and splitting up the files to a pci-bus-part and a flexcop-part.
++The new driver will be called b2c2-flexcop-pci.ko/b2c2-flexcop-usb.ko for the
++device-specific part and b2c2-flexcop.ko for the common flexcop-functions.
++
++2) Search for errors in the leftover of flexcop-pci.c (compare with pluto2.c
++and other pci drivers)
++
++3) make some beautification (see 'Improvements when rewriting (refactoring) is
++done')
++
++4) Testing the new driver and maybe substitute the skystar2.c with it, to reach
++a wider tester audience.
++
++5) creating an usb-bus-part using the already written flexcop code for the pci
++card.
++
++Idea: create a kernel-object for the flexcop and export all important
++functions. This option saves kernel-memory, but maybe a lot of functions have
++to be exported to kernel namespace.
++
++
++Current situation
++=================
++
++0) Done :)
++1) Done (some minor issues left)
++2) Done
++3) Not ready yet, more information is necessary
++4) next to be done (see the table below)
++5) USB driver is working (yes, there are some minor issues)
++
++What seems to be ready?
++-----------------------
++
++1) Rewriting
++1a) i2c is cut off from the flexcop-pci.c and seems to work
++1b) moved tuner and demod stuff from flexcop-pci.c to flexcop-tuner-fe.c
++1c) moved lnb and diseqc stuff from flexcop-pci.c to flexcop-tuner-fe.c
++1e) eeprom (reading MAC address)
++1d) sram (no dynamic sll size detection (commented out) (using default as JJ told me))
++1f) misc. register accesses for reading parameters (e.g. resetting, revision)
++1g) pid/mac filter (flexcop-hw-filter.c)
++1i) dvb-stuff initialization in flexcop.c (done)
++1h) dma stuff (now just using the size-irq, instead of all-together, to be done)
++1j) remove flexcop initialization from flexcop-pci.c completely (done)
++1l) use a well working dma IRQ method (done, see 'Known bugs and problems and TODO')
++1k) cleanup flexcop-files (remove unused EXPORT_SYMBOLs, make static from
++non-static where possible, moved code to proper places)
++
++2) Search for errors in the leftover of flexcop-pci.c (partially done)
++5a) add MAC address reading
++5c) feeding of ISOC data to the software demux (format of the isochronous data
++and speed optimization, no real error) (thanks to Vadim Catana)
++
++What to do in the near future?
++--------------------------------------
++(no special order here)
++
++5) USB driver
++5b) optimize isoc-transfer (submitting/killing isoc URBs when transfer is starting)
++
++Testing changes
++---------------
++
++O = item is working
++P = item is partially working
++X = item is not working
++N = item does not apply here
++<empty field> = item need to be examined
++
++ | PCI | USB
++item | mt352 | nxt2002 | stv0299 | mt312 | mt352 | nxt2002 | stv0299 | mt312
++-------+-------+---------+---------+-------+-------+---------+---------+-------
++1a) | O | | | | N | N | N | N
++1b) | O | | | | | | O |
++1c) | N | N | | | N | N | O |
++1d) | O | O
++1e) | O | O
++1f) | P
++1g) | O
++1h) | P |
++1i) | O | N
++1j) | O | N
++1l) | O | N
++2) | O | N
++5a) | N | O
++5b)* | N |
++5c) | N | O
++
++* - not done yet
++
++Known bugs and problems and TODO
++--------------------------------
++
++1g/h/l) when pid filtering is enabled on the pci card
++
++DMA usage currently:
++ The DMA is splitted in 2 equal-sized subbuffers. The Flexcop writes to first
++ address and triggers an IRQ when it's full and starts writing to the second
++ address. When the second address is full, the IRQ is triggered again, and
++ the flexcop writes to first address again, and so on.
++ The buffersize of each address is currently 640*188 bytes.
++
++ Problem is, when using hw-pid-filtering and doing some low-bandwidth
++ operation (like scanning) the buffers won't be filled enough to trigger
++ the IRQ. That's why:
++
++ When PID filtering is activated, the timer IRQ is used. Every 1.97 ms the IRQ
++ is triggered. Is the current write address of DMA1 different to the one
++ during the last IRQ, then the data is passed to the demuxer.
++
++ There is an additional DMA-IRQ-method: packet count IRQ. This isn't
++ implemented correctly yet.
++
++ The solution is to disable HW PID filtering, but I don't know how the DVB
++ API software demux behaves on slow systems with 45MBit/s TS.
++
++Solved bugs :)
++--------------
++1g) pid-filtering (somehow pid index 4 and 5 (EMM_PID and ECM_PID) aren't
++working)
++SOLUTION: also index 0 was affected, because net_translation is done for
++these indexes by default
++
++5b) isochronous transfer does only work in the first attempt (for the Sky2PC
++USB, Air2PC is working) SOLUTION: the flexcop was going asleep and never really
++woke up again (don't know if this need fixes, see
++flexcop-fe-tuner.c:flexcop_sleep)
++
++NEWS: when the driver is loaded and unloaded and loaded again (w/o doing
++anything in the while the driver is loaded the first time), no transfers take
++place anymore.
++
++Improvements when rewriting (refactoring) is done
++=================================================
++
++- split sleeping of the flexcop (misc_204.ACPI3_sig = 1;) from lnb_control
++ (enable sleeping for other demods than dvb-s)
++- add support for CableStar (stv0297 Microtune 203x/ALPS) (almost done, incompatibilities with the Nexus-CA)
++
++Debugging
++---------
++- add verbose debugging to skystar2.c (dump the reg_dw_data) and compare it
++ with this flexcop, this is important, because i2c is now using the
++ flexcop_ibi_value union from flexcop-reg.h (do you have a better idea for
++ that, please tell us so).
++
++Everything which is identical in the following table, can be put into a common
++flexcop-module.
++
++ PCI USB
++-------------------------------------------------------------------------------
++Different:
++Register access: accessing IO memory USB control message
++I2C bus: I2C bus of the FC USB control message
++Data transfer: DMA isochronous transfer
++EEPROM transfer: through i2c bus not clear yet
++
++Identical:
++Streaming: accessing registers
++PID Filtering: accessing registers
++Sram destinations: accessing registers
++Tuner/Demod: I2C bus
++DVB-stuff: can be written for common use
++
++Acknowledgements (just for the rewriting part)
++================
++
++Bjarne Steinsbo thought a lot in the first place of the pci part for this code
++sharing idea.
++
++Andreas Oberritter for providing a recent PCI initialization template
++(pluto2.c).
++
++Boleslaw Ciesielski for pointing out a problem with firmware loader.
++
++Vadim Catana for correcting the USB transfer.
++
++comments, critics and ideas to linux-dvb@linuxtv.org.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/dvb/technisat.txt linux-2.6.29-rc3.owrt/Documentation/dvb/technisat.txt
+--- linux-2.6.29.owrt/Documentation/dvb/technisat.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/dvb/technisat.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -1,5 +1,5 @@
+-How to set up the Technisat/B2C2 Flexcop devices
+-================================================
++How to set up the Technisat devices
++===================================
+
+ 1) Find out what device you have
+ ================================
+@@ -16,60 +16,54 @@
+
+ If the Technisat is the only TV device in your box get rid of unnecessary modules and check this one:
+ "Multimedia devices" => "Customise analog and hybrid tuner modules to build"
+-In this directory uncheck every driver which is activated there (except "Simple tuner support" for case 9 only).
++In this directory uncheck every driver which is activated there.
+
+ Then please activate:
+ 2a) Main module part:
+
+ a.)"Multimedia devices" => "DVB/ATSC adapters" => "Technisat/B2C2 FlexcopII(b) and FlexCopIII adapters"
+-b.)"Multimedia devices" => "DVB/ATSC adapters" => "Technisat/B2C2 FlexcopII(b) and FlexCopIII adapters" => "Technisat/B2C2 Air/Sky/Cable2PC PCI" in case of a PCI card
+-OR
++b.)"Multimedia devices" => "DVB/ATSC adapters" => "Technisat/B2C2 FlexcopII(b) and FlexCopIII adapters" => "Technisat/B2C2 Air/Sky/Cable2PC PCI" in case of a PCI card OR
+ c.)"Multimedia devices" => "DVB/ATSC adapters" => "Technisat/B2C2 FlexcopII(b) and FlexCopIII adapters" => "Technisat/B2C2 Air/Sky/Cable2PC USB" in case of an USB 1.1 adapter
+ d.)"Multimedia devices" => "DVB/ATSC adapters" => "Technisat/B2C2 FlexcopII(b) and FlexCopIII adapters" => "Enable debug for the B2C2 FlexCop drivers"
+ Notice: d.) is helpful for troubleshooting
+
+ 2b) Frontend module part:
+
+-1.) SkyStar DVB-S Revision 2.3:
++1.) Revision 2.3:
+ a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
+ b.)"Multimedia devices" => "Customise DVB frontends" => "Zarlink VP310/MT312/ZL10313 based"
+
+-2.) SkyStar DVB-S Revision 2.6:
++2.) Revision 2.6:
+ a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
+ b.)"Multimedia devices" => "Customise DVB frontends" => "ST STV0299 based"
+
+-3.) SkyStar DVB-S Revision 2.7:
++3.) Revision 2.7:
+ a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
+ b.)"Multimedia devices" => "Customise DVB frontends" => "Samsung S5H1420 based"
+ c.)"Multimedia devices" => "Customise DVB frontends" => "Integrant ITD1000 Zero IF tuner for DVB-S/DSS"
+ d.)"Multimedia devices" => "Customise DVB frontends" => "ISL6421 SEC controller"
+
+-4.) SkyStar DVB-S Revision 2.8:
++4.) Revision 2.8:
+ a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
+ b.)"Multimedia devices" => "Customise DVB frontends" => "Conexant CX24113/CX24128 tuner for DVB-S/DSS"
+ c.)"Multimedia devices" => "Customise DVB frontends" => "Conexant CX24123 based"
+ d.)"Multimedia devices" => "Customise DVB frontends" => "ISL6421 SEC controller"
+
+-5.) AirStar DVB-T card:
++5.) DVB-T card:
+ a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
+ b.)"Multimedia devices" => "Customise DVB frontends" => "Zarlink MT352 based"
+
+-6.) CableStar DVB-C card:
++6.) DVB-C card:
+ a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
+ b.)"Multimedia devices" => "Customise DVB frontends" => "ST STV0297 based"
+
+-7.) AirStar ATSC card 1st generation:
++7.) ATSC card 1st generation:
+ a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
+ b.)"Multimedia devices" => "Customise DVB frontends" => "Broadcom BCM3510"
+
+-8.) AirStar ATSC card 2nd generation:
++8.) ATSC card 2nd generation:
+ a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
+ b.)"Multimedia devices" => "Customise DVB frontends" => "NxtWave Communications NXT2002/NXT2004 based"
+-c.)"Multimedia devices" => "Customise DVB frontends" => "Generic I2C PLL based tuners"
++c.)"Multimedia devices" => "Customise DVB frontends" => "LG Electronics LGDT3302/LGDT3303 based"
+
+-9.) AirStar ATSC card 3rd generation:
+-a.)"Multimedia devices" => "Customise DVB frontends" => "Customise the frontend modules to build"
+-b.)"Multimedia devices" => "Customise DVB frontends" => "LG Electronics LGDT3302/LGDT3303 based"
+-c.)"Multimedia devices" => "Customise analog and hybrid tuner modules to build" => "Simple tuner support"
+-
+-Author: Uwe Bugla <uwe.bugla@gmx.de> February 2009
++Author: Uwe Bugla <uwe.bugla@gmx.de> December 2008
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/feature-removal-schedule.txt linux-2.6.29-rc3.owrt/Documentation/feature-removal-schedule.txt
+--- linux-2.6.29.owrt/Documentation/feature-removal-schedule.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/feature-removal-schedule.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -335,12 +335,3 @@
+ Secmark, it is time to deprecate the older mechanism and start the
+ process of removing the old code.
+ Who: Paul Moore <paul.moore@hp.com>
+----------------------------
+-
+-What: sysfs ui for changing p4-clockmod parameters
+-When: September 2009
+-Why: See commits 129f8ae9b1b5be94517da76009ea956e89104ce8 and
+- e088e4c9cdb618675874becb91b2fd581ee707e6.
+- Removal is subject to fixing any remaining bugs in ACPI which may
+- cause the thermal throttling not to happen at the right time.
+-Who: Dave Jones <davej@redhat.com>, Matthew Garrett <mjg@redhat.com>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/filesystems/ext2.txt linux-2.6.29-rc3.owrt/Documentation/filesystems/ext2.txt
+--- linux-2.6.29.owrt/Documentation/filesystems/ext2.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/filesystems/ext2.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -373,11 +373,10 @@
+ Compression (*) http://e2compr.sourceforge.net/
+
+ Implementations for:
+-Windows 95/98/NT/2000 http://www.chrysocome.net/explore2fs
+-Windows 95 (*) http://www.yipton.net/content.html#FSDEXT2
++Windows 95/98/NT/2000 http://uranus.it.swin.edu.au/~jn/linux/Explore2fs.htm
++Windows 95 (*) http://www.yipton.demon.co.uk/content.html#FSDEXT2
+ DOS client (*) ftp://metalab.unc.edu/pub/Linux/system/filesystems/ext2/
+-OS/2 (+) ftp://metalab.unc.edu/pub/Linux/system/filesystems/ext2/
+-RISC OS client http://www.esw-heim.tu-clausthal.de/~marco/smorbrod/IscaFS/
++OS/2 http://perso.wanadoo.fr/matthieu.willm/ext2-os2/
++RISC OS client ftp://ftp.barnet.ac.uk/pub/acorn/armlinux/iscafs/
+
+ (*) no longer actively developed/supported (as of Apr 2001)
+-(+) no longer actively developed/supported (as of Mar 2009)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/filesystems/ext3.txt linux-2.6.29-rc3.owrt/Documentation/filesystems/ext3.txt
+--- linux-2.6.29.owrt/Documentation/filesystems/ext3.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/filesystems/ext3.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -198,5 +198,5 @@
+ programs: http://e2fsprogs.sourceforge.net/
+ http://ext2resize.sourceforge.net
+
+-useful links: http://www.ibm.com/developerworks/library/l-fs7.html
+- http://www.ibm.com/developerworks/library/l-fs8.html
++useful links: http://www-106.ibm.com/developerworks/linux/library/l-fs7/
++ http://www-106.ibm.com/developerworks/linux/library/l-fs8/
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/filesystems/proc.txt linux-2.6.29-rc3.owrt/Documentation/filesystems/proc.txt
+--- linux-2.6.29.owrt/Documentation/filesystems/proc.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/filesystems/proc.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -1478,13 +1478,6 @@
+ this should be enabled, but if the problem persists the messages can be
+ disabled.
+
+-netdev_budget
+--------------
+-
+-Maximum number of packets taken from all interfaces in one polling cycle (NAPI
+-poll). In one polling cycle interfaces which are registered to polling are
+-probed in a round-robin manner. The limit of packets in one such probe can be
+-set per-device via sysfs class/net/<device>/weight .
+
+ netdev_max_backlog
+ ------------------
+@@ -2034,34 +2027,6 @@
+ values are in the range -16 to +15, plus the special value -17, which disables
+ oom-killing altogether for this process.
+
+-The process to be killed in an out-of-memory situation is selected among all others
+-based on its badness score. This value equals the original memory size of the process
+-and is then updated according to its CPU time (utime + stime) and the
+-run time (uptime - start time). The longer it runs the smaller is the score.
+-Badness score is divided by the square root of the CPU time and then by
+-the double square root of the run time.
+-
+-Swapped out tasks are killed first. Half of each child's memory size is added to
+-the parent's score if they do not share the same memory. Thus forking servers
+-are the prime candidates to be killed. Having only one 'hungry' child will make
+-parent less preferable than the child.
+-
+-/proc/<pid>/oom_score shows process' current badness score.
+-
+-The following heuristics are then applied:
+- * if the task was reniced, its score doubles
+- * superuser or direct hardware access tasks (CAP_SYS_ADMIN, CAP_SYS_RESOURCE
+- or CAP_SYS_RAWIO) have their score divided by 4
+- * if oom condition happened in one cpuset and checked task does not belong
+- to it, its score is divided by 8
+- * the resulting score is multiplied by two to the power of oom_adj, i.e.
+- points <<= oom_adj when it is positive and
+- points >>= -(oom_adj) otherwise
+-
+-The task with the highest badness score is then selected and its children
+-are killed, process itself will be killed in an OOM situation when it does
+-not have children or some of them disabled oom like described above.
+-
+ 2.13 /proc/<pid>/oom_score - Display current oom-killer score
+ -------------------------------------------------------------
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/filesystems/squashfs.txt linux-2.6.29-rc3.owrt/Documentation/filesystems/squashfs.txt
+--- linux-2.6.29.owrt/Documentation/filesystems/squashfs.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/filesystems/squashfs.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -22,7 +22,7 @@
+
+ Squashfs Cramfs
+
+-Max filesystem size: 2^64 256 MiB
++Max filesystem size: 2^64 16 MiB
+ Max file size: ~ 2 TiB 16 MiB
+ Max files: unlimited unlimited
+ Max directories: unlimited unlimited
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/filesystems/sysfs-pci.txt linux-2.6.29-rc3.owrt/Documentation/filesystems/sysfs-pci.txt
+--- linux-2.6.29.owrt/Documentation/filesystems/sysfs-pci.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/filesystems/sysfs-pci.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -9,7 +9,6 @@
+ | |-- class
+ | |-- config
+ | |-- device
+- | |-- enable
+ | |-- irq
+ | |-- local_cpus
+ | |-- resource
+@@ -33,7 +32,6 @@
+ class PCI class (ascii, ro)
+ config PCI config space (binary, rw)
+ device PCI device (ascii, ro)
+- enable Whether the device is enabled (ascii, rw)
+ irq IRQ number (ascii, ro)
+ local_cpus nearby CPU mask (cpumask, ro)
+ resource PCI resource host addresses (ascii, ro)
+@@ -59,19 +57,10 @@
+ don't support mmapping of certain resources, so be sure to check the return
+ value from any attempted mmap.
+
+-The 'enable' file provides a counter that indicates how many times the device
+-has been enabled. If the 'enable' file currently returns '4', and a '1' is
+-echoed into it, it will then return '5'. Echoing a '0' into it will decrease
+-the count. Even when it returns to 0, though, some of the initialisation
+-may not be reversed.
+-
+ The 'rom' file is special in that it provides read-only access to the device's
+ ROM file, if available. It's disabled by default, however, so applications
+ should write the string "1" to the file to enable it before attempting a read
+-call, and disable it following the access by writing "0" to the file. Note
+-that the device must be enabled for a rom read to return data succesfully.
+-In the event a driver is not bound to the device, it can be enabled using the
+-'enable' file, documented above.
++call, and disable it following the access by writing "0" to the file.
+
+ Accessing legacy resources through sysfs
+ ----------------------------------------
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/filesystems/sysfs.txt linux-2.6.29-rc3.owrt/Documentation/filesystems/sysfs.txt
+--- linux-2.6.29.owrt/Documentation/filesystems/sysfs.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/filesystems/sysfs.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -2,10 +2,8 @@
+ sysfs - _The_ filesystem for exporting kernel objects.
+
+ Patrick Mochel <mochel@osdl.org>
+-Mike Murphy <mamurph@cs.clemson.edu>
+
+-Revised: 22 February 2009
+-Original: 10 January 2003
++10 January 2003
+
+
+ What it is:
+@@ -66,13 +64,12 @@
+
+ struct attribute {
+ char * name;
+- struct module *owner;
+ mode_t mode;
+ };
+
+
+-int sysfs_create_file(struct kobject * kobj, const struct attribute * attr);
+-void sysfs_remove_file(struct kobject * kobj, const struct attribute * attr);
++int sysfs_create_file(struct kobject * kobj, struct attribute * attr);
++void sysfs_remove_file(struct kobject * kobj, struct attribute * attr);
+
+
+ A bare attribute contains no means to read or write the value of the
+@@ -83,11 +80,9 @@
+ For example, the driver model defines struct device_attribute like:
+
+ struct device_attribute {
+- struct attribute attr;
+- ssize_t (*show)(struct device *dev, struct device_attribute *attr,
+- char *buf);
+- ssize_t (*store)(struct device *dev, struct device_attribute *attr,
+- const char *buf, size_t count);
++ struct attribute attr;
++ ssize_t (*show)(struct device * dev, char * buf);
++ ssize_t (*store)(struct device * dev, const char * buf);
+ };
+
+ int device_create_file(struct device *, struct device_attribute *);
+@@ -95,8 +90,12 @@
+
+ It also defines this helper for defining device attributes:
+
+-#define DEVICE_ATTR(_name, _mode, _show, _store) \
+-struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)
++#define DEVICE_ATTR(_name, _mode, _show, _store) \
++struct device_attribute dev_attr_##_name = { \
++ .attr = {.name = __stringify(_name) , .mode = _mode }, \
++ .show = _show, \
++ .store = _store, \
++};
+
+ For example, declaring
+
+@@ -108,9 +107,9 @@
+ .attr = {
+ .name = "foo",
+ .mode = S_IWUSR | S_IRUGO,
+- .show = show_foo,
+- .store = store_foo,
+ },
++ .show = show_foo,
++ .store = store_foo,
+ };
+
+
+@@ -162,12 +161,10 @@
+ specified when declaring the attribute. The method types should be as
+ simple as those defined for device attributes:
+
+-ssize_t (*show)(struct device * dev, struct device_attribute * attr,
+- char * buf);
+-ssize_t (*store)(struct device * dev, struct device_attribute * attr,
+- const char * buf);
++ ssize_t (*show)(struct device * dev, char * buf);
++ ssize_t (*store)(struct device * dev, const char * buf);
+
+-IOW, they should take only an object, an attribute, and a buffer as parameters.
++IOW, they should take only an object and a buffer as parameters.
+
+
+ sysfs allocates a buffer of size (PAGE_SIZE) and passes it to the
+@@ -302,16 +299,14 @@
+ Structure:
+
+ struct device_attribute {
+- struct attribute attr;
+- ssize_t (*show)(struct device *dev, struct device_attribute *attr,
+- char *buf);
+- ssize_t (*store)(struct device *dev, struct device_attribute *attr,
+- const char *buf, size_t count);
++ struct attribute attr;
++ ssize_t (*show)(struct device * dev, char * buf);
++ ssize_t (*store)(struct device * dev, const char * buf);
+ };
+
+ Declaring:
+
+-DEVICE_ATTR(_name, _mode, _show, _store);
++DEVICE_ATTR(_name, _str, _mode, _show, _store);
+
+ Creation/Removal:
+
+@@ -347,8 +342,7 @@
+ struct driver_attribute {
+ struct attribute attr;
+ ssize_t (*show)(struct device_driver *, char * buf);
+- ssize_t (*store)(struct device_driver *, const char * buf,
+- size_t count);
++ ssize_t (*store)(struct device_driver *, const char * buf);
+ };
+
+ Declaring:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/filesystems/ubifs.txt linux-2.6.29-rc3.owrt/Documentation/filesystems/ubifs.txt
+--- linux-2.6.29.owrt/Documentation/filesystems/ubifs.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/filesystems/ubifs.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -79,6 +79,13 @@
+
+ (*) == default.
+
++norm_unmount (*) commit on unmount; the journal is committed
++ when the file-system is unmounted so that the
++ next mount does not have to replay the journal
++ and it becomes very fast;
++fast_unmount do not commit on unmount; this option makes
++ unmount faster, but the next mount slower
++ because of the need to replay the journal.
+ bulk_read read more in one go to take advantage of flash
+ media that read faster sequentially
+ no_bulk_read (*) do not bulk-read
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/hwmon/hpfall.c linux-2.6.29-rc3.owrt/Documentation/hwmon/hpfall.c
+--- linux-2.6.29.owrt/Documentation/hwmon/hpfall.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/hwmon/hpfall.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,101 +0,0 @@
+-/* Disk protection for HP machines.
+- *
+- * Copyright 2008 Eric Piel
+- * Copyright 2009 Pavel Machek <pavel@suse.cz>
+- *
+- * GPLv2.
+- */
+-
+-#include <stdio.h>
+-#include <stdlib.h>
+-#include <unistd.h>
+-#include <fcntl.h>
+-#include <sys/stat.h>
+-#include <sys/types.h>
+-#include <string.h>
+-#include <stdint.h>
+-#include <errno.h>
+-#include <signal.h>
+-
+-void write_int(char *path, int i)
+-{
+- char buf[1024];
+- int fd = open(path, O_RDWR);
+- if (fd < 0) {
+- perror("open");
+- exit(1);
+- }
+- sprintf(buf, "%d", i);
+- if (write(fd, buf, strlen(buf)) != strlen(buf)) {
+- perror("write");
+- exit(1);
+- }
+- close(fd);
+-}
+-
+-void set_led(int on)
+-{
+- write_int("/sys/class/leds/hp::hddprotect/brightness", on);
+-}
+-
+-void protect(int seconds)
+-{
+- write_int("/sys/block/sda/device/unload_heads", seconds*1000);
+-}
+-
+-int on_ac(void)
+-{
+-// /sys/class/power_supply/AC0/online
+-}
+-
+-int lid_open(void)
+-{
+-// /proc/acpi/button/lid/LID/state
+-}
+-
+-void ignore_me(void)
+-{
+- protect(0);
+- set_led(0);
+-
+-}
+-
+-int main(int argc, char* argv[])
+-{
+- int fd, ret;
+-
+- fd = open("/dev/freefall", O_RDONLY);
+- if (fd < 0) {
+- perror("open");
+- return EXIT_FAILURE;
+- }
+-
+- signal(SIGALRM, ignore_me);
+-
+- for (;;) {
+- unsigned char count;
+-
+- ret = read(fd, &count, sizeof(count));
+- alarm(0);
+- if ((ret == -1) && (errno == EINTR)) {
+- /* Alarm expired, time to unpark the heads */
+- continue;
+- }
+-
+- if (ret != sizeof(count)) {
+- perror("read");
+- break;
+- }
+-
+- protect(21);
+- set_led(1);
+- if (1 || on_ac() || lid_open()) {
+- alarm(2);
+- } else {
+- alarm(20);
+- }
+- }
+-
+- close(fd);
+- return EXIT_SUCCESS;
+-}
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/hwmon/lis3lv02d linux-2.6.29-rc3.owrt/Documentation/hwmon/lis3lv02d
+--- linux-2.6.29.owrt/Documentation/hwmon/lis3lv02d 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/hwmon/lis3lv02d 2009-05-10 23:48:28.000000000 +0200
+@@ -33,14 +33,6 @@
+ This driver also provides an absolute input class device, allowing
+ the laptop to act as a pinball machine-esque joystick.
+
+-Another feature of the driver is misc device called "freefall" that
+-acts similar to /dev/rtc and reacts on free-fall interrupts received
+-from the device. It supports blocking operations, poll/select and
+-fasync operation modes. You must read 1 bytes from the device. The
+-result is number of free-fall interrupts since the last successful
+-read (or 255 if number of interrupts would not fit).
+-
+-
+ Axes orientation
+ ----------------
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/hwmon/lm90 linux-2.6.29-rc3.owrt/Documentation/hwmon/lm90
+--- linux-2.6.29.owrt/Documentation/hwmon/lm90 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/hwmon/lm90 2009-05-10 23:48:28.000000000 +0200
+@@ -42,11 +42,6 @@
+ Addresses scanned: I2C 0x4e
+ Datasheet: Publicly available at the Maxim website
+ http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3497
+- * Maxim MAX6648
+- Prefix: 'max6646'
+- Addresses scanned: I2C 0x4c
+- Datasheet: Publicly available at the Maxim website
+- http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3500
+ * Maxim MAX6649
+ Prefix: 'max6646'
+ Addresses scanned: I2C 0x4c
+@@ -79,11 +74,6 @@
+ 0x4c, 0x4d and 0x4e
+ Datasheet: Publicly available at the Maxim website
+ http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3370
+- * Maxim MAX6692
+- Prefix: 'max6646'
+- Addresses scanned: I2C 0x4c
+- Datasheet: Publicly available at the Maxim website
+- http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3500
+
+
+ Author: Jean Delvare <khali@linux-fr.org>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/IO-mapping.txt linux-2.6.29-rc3.owrt/Documentation/IO-mapping.txt
+--- linux-2.6.29.owrt/Documentation/IO-mapping.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/IO-mapping.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -1,6 +1,6 @@
+ [ NOTE: The virt_to_bus() and bus_to_virt() functions have been
+- superseded by the functionality provided by the PCI DMA interface
+- (see Documentation/PCI/PCI-DMA-mapping.txt). They continue
++ superseded by the functionality provided by the PCI DMA
++ interface (see Documentation/DMA-mapping.txt). They continue
+ to be documented below for historical purposes, but new code
+ must not use them. --davidm 00/12/12 ]
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/ja_JP/stable_kernel_rules.txt linux-2.6.29-rc3.owrt/Documentation/ja_JP/stable_kernel_rules.txt
+--- linux-2.6.29.owrt/Documentation/ja_JP/stable_kernel_rules.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/ja_JP/stable_kernel_rules.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -12,11 +12,11 @@
+
+ ==================================
+ ã“ã‚Œã¯ã€
+-linux-2.6.29/Documentation/stable_kernel_rules.txt
++linux-2.6.24/Documentation/stable_kernel_rules.txt
+ ã®å’Œè¨³ã§ã™ã€‚
+
+ 翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ >
+-翻訳日: 2009/1/14
++翻訳日: 2007/12/30
+ 翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com>
+ 校正者: 武井伸光ã•ã‚“ã€<takei at webmasters dot gr dot jp>
+ ã‹ã­ã“ã•ã‚“ (Seiji Kaneko) <skaneko at a2 dot mbn dot or dot jp>
+@@ -38,15 +38,12 @@
+ - ビルドエラー(CONFIG_BROKENã«ãªã£ã¦ã„ã‚‹ã‚‚ã®ã‚’除ã), oops, ãƒãƒ³ã‚°ã€ãƒ‡ãƒ¼
+ タ破壊ã€ç¾å®Ÿã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£å•é¡Œã€ãã®ä»– "ã‚ã‚ã€ã“ã‚Œã¯ãƒ€ãƒ¡ã ã­"ã¨ã„ã†
+ よã†ãªã‚‚ã®ã‚’修正ã—ãªã‘ã‚Œã°ãªã‚‰ãªã„。短ã言ãˆã°ã€é‡å¤§ãªå•é¡Œã€‚
+- - æ–°ã—ã„ device ID ã¨ã‚¯ã‚ªãƒ¼ã‚¯ã‚‚å—ã‘入れられる。
+ - ã©ã®ã‚ˆã†ã«ç«¶åˆçŠ¶æ…‹ãŒç™ºç”Ÿã™ã‚‹ã‹ã®èª¬æ˜Žã‚‚一緒ã«æ›¸ã‹ã‚Œã¦ã„ãªã„é™ã‚Šã€
+ "ç†è«–çš„ã«ã¯ç«¶åˆçŠ¶æ…‹ã«ãªã‚‹"よã†ãªã‚‚ã®ã¯ä¸å¯ã€‚
+ - ã„ã‹ãªã‚‹äº›ç´°ãªä¿®æ­£ã‚‚å«ã‚ã‚‹ã“ã¨ã¯ã§ããªã„。(スペルã®ä¿®æ­£ã€ç©ºç™½ã®ã‚¯ãƒªãƒ¼
+ ンアップãªã©)
++ - 対応ã™ã‚‹ã‚µãƒ–システムメンテナãŒå—ã‘入れãŸã‚‚ã®ã§ãªã‘ã‚Œã°ãªã‚‰ãªã„。
+ - Documentation/SubmittingPatches ã®è¦å‰‡ã«å¾“ã£ãŸã‚‚ã®ã§ãªã‘ã‚Œã°ãªã‚‰ãªã„。
+- - パッãƒè‡ªä½“ã‹åŒç­‰ã®ä¿®æ­£ãŒ Linus ã®ãƒ„リーã«æ—¢ã«å­˜åœ¨ã—ãªã‘ã‚Œã°ãªã‚‰ãªã„。
+-  Linus ã®ãƒ„リーã§ã®ã‚³ãƒŸãƒƒãƒˆID ã‚’ -stable ã¸ã®ãƒ‘ッãƒæŠ•ç¨¿ã®éš›ã«å¼•ç”¨ã™
+- ã‚‹ã“ã¨ã€‚
+
+ -stable ツリーã«ãƒ‘ッãƒã‚’é€ä»˜ã™ã‚‹æ‰‹ç¶šã-
+
+@@ -55,10 +52,8 @@
+ - é€ä¿¡è€…ã¯ãƒ‘ッãƒãŒã‚­ãƒ¥ãƒ¼ã«å—ã‘付ã‘られãŸéš›ã«ã¯ ACK ã‚’ã€å´ä¸‹ã•ã‚ŒãŸå ´åˆ
+ ã«ã¯ NAK ã‚’å—ã‘å–る。ã“ã®åå¿œã¯é–‹ç™ºè€…ãŸã¡ã®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã«ã‚ˆã£ã¦ã€æ•°
+ æ—¥ã‹ã‹ã‚‹å ´åˆãŒã‚る。
+- - ã‚‚ã—å—ã‘å–られãŸã‚‰ã€ãƒ‘ッãƒã¯ä»–ã®é–‹ç™ºè€…ãŸã¡ã¨é–¢é€£ã™ã‚‹ã‚µãƒ–システムã®
+- メンテナーã«ã‚ˆã‚‹ãƒ¬ãƒ“ューã®ãŸã‚ã« -stable キューã«è¿½åŠ ã•ã‚Œã‚‹ã€‚
+- - パッãƒã« stable@kernel.org ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒä»˜åŠ ã•ã‚Œã¦ã„ã‚‹ã¨ãã«ã¯ã€ãã‚Œ
+- ㌠Linus ã®ãƒ„リーã«å…¥ã‚‹æ™‚ã«è‡ªå‹•çš„ã« stable ãƒãƒ¼ãƒ ã« email ã•ã‚Œã‚‹ã€‚
++ - ã‚‚ã—å—ã‘å–られãŸã‚‰ã€ãƒ‘ッãƒã¯ä»–ã®é–‹ç™ºè€…ãŸã¡ã®ãƒ¬ãƒ“ューã®ãŸã‚ã«
++ -stable キューã«è¿½åŠ ã•ã‚Œã‚‹ã€‚
+ - セキュリティパッãƒã¯ã“ã®ã‚¨ã‚¤ãƒªã‚¢ã‚¹ (stable@kernel.org) ã«é€ã‚‰ã‚Œã‚‹ã¹
+ ãã§ã¯ãªãã€ä»£ã‚ã‚Šã« security@kernel.org ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã«é€ã‚‰ã‚Œã‚‹ã€‚
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/kernel-doc-nano-HOWTO.txt linux-2.6.29-rc3.owrt/Documentation/kernel-doc-nano-HOWTO.txt
+--- linux-2.6.29.owrt/Documentation/kernel-doc-nano-HOWTO.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/kernel-doc-nano-HOWTO.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -43,8 +43,7 @@
+ and any comment so marked must be in kernel-doc format. Do not use
+ "/**" to be begin a comment block unless the comment block contains
+ kernel-doc formatted comments. The closing comment marker for
+-kernel-doc comments can be either "*/" or "**/", but "*/" is
+-preferred in the Linux kernel tree.
++kernel-doc comments can be either "*/" or "**/".
+
+ Kernel-doc comments should be placed just before the function
+ or data structure being described.
+@@ -64,7 +63,7 @@
+ * comment lines.
+ *
+ * The longer description can have multiple paragraphs.
+- */
++ **/
+
+ The first line, with the short description, must be on a single line.
+
+@@ -86,7 +85,7 @@
+ * perhaps with more lines and words.
+ *
+ * Longer description of this structure.
+- */
++ **/
+
+ The kernel-doc function comments describe each parameter to the
+ function, in order, with the @name lines.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/kernel-parameters.txt linux-2.6.29-rc3.owrt/Documentation/kernel-parameters.txt
+--- linux-2.6.29.owrt/Documentation/kernel-parameters.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/kernel-parameters.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -114,7 +114,7 @@
+ Parameters denoted with BOOT are actually interpreted by the boot
+ loader, and have no meaning to the kernel directly.
+ Do not modify the syntax of boot loader parameters without extreme
+-need or coordination with <Documentation/x86/boot.txt>.
++need or coordination with <Documentation/x86/i386/boot.txt>.
+
+ There are also arch-specific kernel-parameters not documented here.
+ See for example <Documentation/x86/x86_64/boot-options.txt>.
+@@ -134,7 +134,7 @@
+
+ acpi= [HW,ACPI,X86-64,i386]
+ Advanced Configuration and Power Interface
+- Format: { force | off | ht | strict | noirq | rsdt }
++ Format: { force | off | ht | strict | noirq }
+ force -- enable ACPI if default was off
+ off -- disable ACPI if default was on
+ noirq -- do not use ACPI for IRQ routing
+@@ -868,10 +868,8 @@
+ icn= [HW,ISDN]
+ Format: <io>[,<membase>[,<icn_id>[,<icn_id2>]]]
+
+- ide-core.nodma= [HW] (E)IDE subsystem
+- Format: =0.0 to prevent dma on hda, =0.1 hdb =1.0 hdc
+- .vlb_clock .pci_clock .noflush .noprobe .nowerr .cdrom
+- .chs .ignore_cable are additional options
++ ide= [HW] (E)IDE subsystem
++ Format: ide=nodma or ide=doubler
+ See Documentation/ide/ide.txt.
+
+ idebus= [HW] (E)IDE subsystem - VLB/PCI bus speed
+@@ -939,8 +937,6 @@
+
+
+ intel_iommu= [DMAR] Intel IOMMU driver (DMAR) option
+- on
+- Enable intel iommu driver.
+ off
+ Disable intel iommu driver.
+ igfx_off [Default Off]
+@@ -2451,7 +2447,7 @@
+ See Documentation/fb/modedb.txt.
+
+ vga= [BOOT,X86-32] Select a particular video mode
+- See Documentation/x86/boot.txt and
++ See Documentation/x86/i386/boot.txt and
+ Documentation/svga.txt.
+ Use vga=ask for menu.
+ This is actually a boot loader parameter; the value is
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/lguest/Makefile linux-2.6.29-rc3.owrt/Documentation/lguest/Makefile
+--- linux-2.6.29.owrt/Documentation/lguest/Makefile 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/lguest/Makefile 2009-05-10 23:48:28.000000000 +0200
+@@ -1,5 +1,5 @@
+ # This creates the demonstration utility "lguest" which runs a Linux guest.
+-CFLAGS:=-Wall -Wmissing-declarations -Wmissing-prototypes -O3 -I../../include -I../../arch/x86/include -U_FORTIFY_SOURCE
++CFLAGS:=-Wall -Wmissing-declarations -Wmissing-prototypes -O3 -I../../include -I../../arch/x86/include
+ LDLIBS:=-lz
+
+ all: lguest
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/logo.svg linux-2.6.29-rc3.owrt/Documentation/logo.svg
+--- linux-2.6.29.owrt/Documentation/logo.svg 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/logo.svg 1970-01-01 01:00:00.000000000 +0100
+@@ -1,2911 +0,0 @@
+-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+-<!-- Created with Inkscape (http://www.inkscape.org/) -->
+-<svg
+- xmlns:dc="http://purl.org/dc/elements/1.1/"
+- xmlns:cc="http://creativecommons.org/ns#"
+- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+- xmlns:svg="http://www.w3.org/2000/svg"
+- xmlns="http://www.w3.org/2000/svg"
+- xmlns:xlink="http://www.w3.org/1999/xlink"
+- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+- width="1771.6534"
+- height="1417.3228"
+- id="svg2"
+- sodipodi:version="0.32"
+- inkscape:version="0.46"
+- sodipodi:docname="tuz.svg"
+- inkscape:output_extension="org.inkscape.output.svg.inkscape"
+- version="1.0"
+- style="display:inline;enable-background:new"
+- inkscape:export-filename="/home/cheeseness/Documents/LCA09/mascot/tuz_final.png"
+- inkscape:export-xdpi="100.03588"
+- inkscape:export-ydpi="100.03588">
+- <sodipodi:namedview
+- id="base"
+- pagecolor="#ffffff"
+- bordercolor="#666666"
+- borderopacity="1.0"
+- gridtolerance="10000"
+- guidetolerance="10"
+- objecttolerance="10"
+- inkscape:pageopacity="0.0"
+- inkscape:pageshadow="2"
+- inkscape:zoom="0.25"
+- inkscape:cx="-174.7931"
+- inkscape:cy="784.26325"
+- inkscape:document-units="px"
+- inkscape:current-layer="svg2"
+- showgrid="false"
+- inkscape:window-width="1280"
+- inkscape:window-height="823"
+- inkscape:window-x="-4"
+- inkscape:window-y="25"
+- showguides="true"
+- inkscape:guide-bbox="true"
+- units="mm" />
+- <defs
+- id="defs4">
+- <filter
+- inkscape:collect="always"
+- x="-0.084654994"
+- width="1.16931"
+- y="-0.36592469"
+- height="1.7318494"
+- id="filter11361">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="4.5740586"
+- id="feGaussianBlur11363" />
+- </filter>
+- <inkscape:perspective
+- sodipodi:type="inkscape:persp3d"
+- inkscape:vp_x="0 : 564.0976 : 1"
+- inkscape:vp_y="0 : 1000 : 0"
+- inkscape:vp_z="1445.8591 : 564.0976 : 1"
+- inkscape:persp3d-origin="722.92957 : 376.06506 : 1"
+- id="perspective8145" />
+- <linearGradient
+- id="linearGradient7622">
+- <stop
+- style="stop-color:#ffffff;stop-opacity:1;"
+- offset="0"
+- id="stop7624" />
+- <stop
+- style="stop-color:#ffffff;stop-opacity:0;"
+- offset="1"
+- id="stop7626" />
+- </linearGradient>
+- <linearGradient
+- id="linearGradient4113">
+- <stop
+- style="stop-color:#000000;stop-opacity:0;"
+- offset="0"
+- id="stop4115" />
+- <stop
+- style="stop-color:#000000;stop-opacity:1;"
+- offset="1"
+- id="stop4117" />
+- </linearGradient>
+- <linearGradient
+- inkscape:collect="always"
+- id="linearGradient3660">
+- <stop
+- style="stop-color:#ffffff;stop-opacity:1;"
+- offset="0"
+- id="stop3662" />
+- <stop
+- style="stop-color:#ffffff;stop-opacity:0;"
+- offset="1"
+- id="stop3664" />
+- </linearGradient>
+- <linearGradient
+- id="linearGradient3627">
+- <stop
+- style="stop-color:#ffffff;stop-opacity:1;"
+- offset="0"
+- id="stop3629" />
+- <stop
+- style="stop-color:#000000;stop-opacity:1;"
+- offset="1"
+- id="stop3631" />
+- </linearGradient>
+- <linearGradient
+- id="linearGradient2843">
+- <stop
+- id="stop2845"
+- offset="0"
+- style="stop-color:#000000;stop-opacity:1;" />
+- <stop
+- style="stop-color:#000000;stop-opacity:1;"
+- offset="0.02188784"
+- id="stop2847" />
+- <stop
+- style="stop-color:#000000;stop-opacity:1;"
+- offset="0.75866222"
+- id="stop2849" />
+- <stop
+- id="stop2851"
+- offset="0.88508981"
+- style="stop-color:#232323;stop-opacity:1;" />
+- <stop
+- id="stop2853"
+- offset="1"
+- style="stop-color:#595959;stop-opacity:1;" />
+- </linearGradient>
+- <linearGradient
+- inkscape:collect="always"
+- id="linearGradient8964">
+- <stop
+- style="stop-color:#1a1a1a;stop-opacity:1;"
+- offset="0"
+- id="stop8966" />
+- <stop
+- style="stop-color:#1a1a1a;stop-opacity:0;"
+- offset="1"
+- id="stop8968" />
+- </linearGradient>
+- <linearGradient
+- id="linearGradient8952">
+- <stop
+- style="stop-color:#0a0c0c;stop-opacity:1;"
+- offset="0"
+- id="stop8954" />
+- <stop
+- style="stop-color:#1f2727;stop-opacity:0;"
+- offset="1"
+- id="stop8956" />
+- </linearGradient>
+- <linearGradient
+- id="linearGradient8430">
+- <stop
+- style="stop-color:#1e2323;stop-opacity:1;"
+- offset="0"
+- id="stop8432" />
+- <stop
+- id="stop8438"
+- offset="0.55992389"
+- style="stop-color:#181d1d;stop-opacity:1;" />
+- <stop
+- style="stop-color:#000000;stop-opacity:1;"
+- offset="1"
+- id="stop8434" />
+- </linearGradient>
+- <linearGradient
+- id="linearGradient8398">
+- <stop
+- style="stop-color:#283131;stop-opacity:0;"
+- offset="0"
+- id="stop8400" />
+- <stop
+- id="stop8402"
+- offset="0.5125587"
+- style="stop-color:#1e2424;stop-opacity:0;" />
+- <stop
+- style="stop-color:#000000;stop-opacity:1;"
+- offset="1"
+- id="stop8404" />
+- </linearGradient>
+- <linearGradient
+- inkscape:collect="always"
+- id="linearGradient4870">
+- <stop
+- style="stop-color:#c7bd80;stop-opacity:1;"
+- offset="0"
+- id="stop4872" />
+- <stop
+- style="stop-color:#c7bd80;stop-opacity:0;"
+- offset="1"
+- id="stop4874" />
+- </linearGradient>
+- <linearGradient
+- inkscape:collect="always"
+- id="linearGradient4862">
+- <stop
+- style="stop-color:#e2e2e2;stop-opacity:1;"
+- offset="0"
+- id="stop4864" />
+- <stop
+- style="stop-color:#e2e2e2;stop-opacity:0;"
+- offset="1"
+- id="stop4866" />
+- </linearGradient>
+- <linearGradient
+- id="linearGradient4478">
+- <stop
+- style="stop-color:#f9eed3;stop-opacity:1;"
+- offset="0"
+- id="stop4480" />
+- <stop
+- style="stop-color:#000000;stop-opacity:0;"
+- offset="1"
+- id="stop4482" />
+- </linearGradient>
+- <linearGradient
+- id="linearGradient4106">
+- <stop
+- style="stop-color:#d9e002;stop-opacity:1;"
+- offset="0"
+- id="stop4108" />
+- <stop
+- id="stop4114"
+- offset="0.5"
+- style="stop-color:#a9ae01;stop-opacity:1;" />
+- <stop
+- style="stop-color:#717501;stop-opacity:1;"
+- offset="1"
+- id="stop4110" />
+- </linearGradient>
+- <linearGradient
+- id="linearGradient4084">
+- <stop
+- style="stop-color:#7d7d00;stop-opacity:1;"
+- offset="0"
+- id="stop4086" />
+- <stop
+- id="stop4088"
+- offset="0.3636601"
+- style="stop-color:#c6c700;stop-opacity:1;" />
+- <stop
+- style="stop-color:#f6f800;stop-opacity:1;"
+- offset="1"
+- id="stop4090" />
+- </linearGradient>
+- <linearGradient
+- id="linearGradient4041">
+- <stop
+- id="stop4043"
+- offset="0"
+- style="stop-color:#ffff00;stop-opacity:1;" />
+- <stop
+- id="stop4045"
+- offset="1"
+- style="stop-color:#ffff00;stop-opacity:0;" />
+- </linearGradient>
+- <linearGradient
+- id="linearGradient4025">
+- <stop
+- style="stop-color:#ffffff;stop-opacity:1;"
+- offset="0"
+- id="stop4027" />
+- <stop
+- style="stop-color:#ffffff;stop-opacity:0;"
+- offset="1"
+- id="stop4031" />
+- </linearGradient>
+- <linearGradient
+- id="linearGradient4013">
+- <stop
+- style="stop-color:#ffff00;stop-opacity:1;"
+- offset="0"
+- id="stop4015" />
+- <stop
+- style="stop-color:#b2b200;stop-opacity:1;"
+- offset="1"
+- id="stop4017" />
+- </linearGradient>
+- <linearGradient
+- id="linearGradient3985">
+- <stop
+- style="stop-color:#000000;stop-opacity:1;"
+- offset="0"
+- id="stop3987" />
+- <stop
+- style="stop-color:#1d1d1d;stop-opacity:1;"
+- offset="1"
+- id="stop3989" />
+- </linearGradient>
+- <linearGradient
+- id="linearGradient3961">
+- <stop
+- style="stop-color:#283131;stop-opacity:0;"
+- offset="0"
+- id="stop3963" />
+- <stop
+- id="stop3965"
+- offset="0.5"
+- style="stop-color:#1e2424;stop-opacity:1;" />
+- <stop
+- style="stop-color:#000000;stop-opacity:1;"
+- offset="1"
+- id="stop3967" />
+- </linearGradient>
+- <linearGradient
+- id="linearGradient3951">
+- <stop
+- id="stop3953"
+- offset="0"
+- style="stop-color:#344040;stop-opacity:1;" />
+- <stop
+- style="stop-color:#222929;stop-opacity:1;"
+- offset="0.5"
+- id="stop3955" />
+- <stop
+- id="stop3957"
+- offset="1"
+- style="stop-color:#000000;stop-opacity:1;" />
+- </linearGradient>
+- <linearGradient
+- id="linearGradient3909">
+- <stop
+- style="stop-color:#283131;stop-opacity:1;"
+- offset="0"
+- id="stop3911" />
+- <stop
+- id="stop3917"
+- offset="0.5"
+- style="stop-color:#1e2424;stop-opacity:1;" />
+- <stop
+- style="stop-color:#000000;stop-opacity:1;"
+- offset="1"
+- id="stop3913" />
+- </linearGradient>
+- <linearGradient
+- id="linearGradient3537">
+- <stop
+- style="stop-color:#ada469;stop-opacity:1;"
+- offset="0"
+- id="stop3539" />
+- <stop
+- id="stop3545"
+- offset="0.81132078"
+- style="stop-color:#ada469;stop-opacity:1;" />
+- <stop
+- style="stop-color:#ffffff;stop-opacity:1;"
+- offset="1"
+- id="stop3541" />
+- </linearGradient>
+- <linearGradient
+- id="linearGradient3317">
+- <stop
+- style="stop-color:#cfc690;stop-opacity:1"
+- offset="0"
+- id="stop3319" />
+- <stop
+- id="stop3321"
+- offset="0.21161865"
+- style="stop-color:#afa775;stop-opacity:1;" />
+- <stop
+- id="stop3323"
+- offset="0.53408515"
+- style="stop-color:#615c3a;stop-opacity:1;" />
+- <stop
+- style="stop-color:#000000;stop-opacity:1;"
+- offset="0.76504093"
+- id="stop3325" />
+- <stop
+- id="stop3327"
+- offset="1"
+- style="stop-color:#403518;stop-opacity:1;" />
+- </linearGradient>
+- <linearGradient
+- id="linearGradient3239">
+- <stop
+- id="stop3251"
+- offset="0"
+- style="stop-color:#cfc690;stop-opacity:1;" />
+- <stop
+- style="stop-color:#afa775;stop-opacity:1;"
+- offset="0.21161865"
+- id="stop3267" />
+- <stop
+- style="stop-color:#615c3a;stop-opacity:1;"
+- offset="0.53408515"
+- id="stop3261" />
+- <stop
+- id="stop3265"
+- offset="0.76504093"
+- style="stop-color:#000000;stop-opacity:1;" />
+- <stop
+- style="stop-color:#403518;stop-opacity:1;"
+- offset="1"
+- id="stop3243" />
+- </linearGradient>
+- <radialGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient3239"
+- id="radialGradient3281"
+- gradientUnits="userSpaceOnUse"
+- gradientTransform="matrix(1.5480423,1.7414304,-1.9683515,1.7497638,-1130.5586,-1872.5121)"
+- spreadMethod="pad"
+- cx="806.52582"
+- cy="212.68117"
+- fx="806.52582"
+- fy="212.68117"
+- r="48.363216" />
+- <radialGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient3317"
+- id="radialGradient3315"
+- cx="543.6698"
+- cy="147.3131"
+- fx="543.6698"
+- fy="147.3131"
+- r="47.863216"
+- gradientTransform="matrix(2.1382256,0,0,2.3382884,-77.03847,-101.68704)"
+- gradientUnits="userSpaceOnUse" />
+- <radialGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient3537"
+- id="radialGradient3543"
+- cx="385"
+- cy="237.00504"
+- fx="385"
+- fy="237.00504"
+- r="86.928574"
+- gradientTransform="matrix(1,0,0,0.8562038,0,34.080427)"
+- gradientUnits="userSpaceOnUse" />
+- <radialGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient3909"
+- id="radialGradient3915"
+- cx="418.30365"
+- cy="342.47794"
+- fx="418.30365"
+- fy="342.47794"
+- r="131.4509"
+- gradientTransform="matrix(1.3957347,0.6211056,-0.4244067,0.9537174,-15.061913,-227.96711)"
+- gradientUnits="userSpaceOnUse" />
+- <radialGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient3951"
+- id="radialGradient3933"
+- cx="397.16388"
+- cy="336.95245"
+- fx="397.16388"
+- fy="336.95245"
+- r="36.75"
+- gradientUnits="userSpaceOnUse"
+- gradientTransform="matrix(1.9449972,2.4894837e-7,-2.4894833e-7,1.9449969,-375.31868,-318.41912)" />
+- <linearGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient3961"
+- id="linearGradient3959"
+- x1="398.21429"
+- y1="343.52289"
+- x2="379.28571"
+- y2="265.30862"
+- gradientUnits="userSpaceOnUse"
+- gradientTransform="translate(450.03125,73.843964)" />
+- <filter
+- inkscape:collect="always"
+- id="filter3981"
+- x="-0.30000001"
+- width="1.6"
+- y="-0.30000001"
+- height="1.6">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="2"
+- id="feGaussianBlur3983" />
+- </filter>
+- <radialGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient3985"
+- id="radialGradient3991"
+- cx="402.48898"
+- cy="317.23578"
+- fx="402.48898"
+- fy="317.23578"
+- r="23.714285"
+- gradientUnits="userSpaceOnUse"
+- gradientTransform="matrix(4.3776616,0,0,4.3776616,-1358.3025,-1070.7357)" />
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath3999">
+- <path
+- style="opacity:1;fill:#f5ff04;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:20.79999924;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+- d="M 179.64286,267.36218 C 157.23242,307.0651 119.02676,383.14247 110.35715,417.00504 C 101.70994,450.78014 101.58516,483.42158 110,503.43362 C 118.3602,523.31575 136.16398,539.06642 150.71428,544.86218 C 150.1179,530.48631 165.08723,501.57635 223.57143,472.36218 C 282.1977,443.07704 301.95306,445.23132 327.14285,425.21932 C 352.77291,404.85756 339.75316,358.17469 330.35714,331.29075 C 320.9229,304.29747 295.38973,272.16627 263.92857,261.6479 C 232.8953,251.27258 198.91081,256.79953 179.64286,267.36218 z"
+- id="path4001"
+- sodipodi:nodetypes="czzczzzzc" />
+- </clipPath>
+- <radialGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient4013"
+- id="radialGradient4056"
+- gradientUnits="userSpaceOnUse"
+- gradientTransform="matrix(1.1323239,0.7659488,-1.4550286,2.1510098,588.75376,-711.79716)"
+- cx="228.81355"
+- cy="440.26971"
+- fx="228.81355"
+- fy="440.26971"
+- r="119.17509" />
+- <radialGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient4041"
+- id="radialGradient4060"
+- gradientUnits="userSpaceOnUse"
+- gradientTransform="matrix(5.911206e-2,2.6869855,-0.7234268,1.5914947e-2,408.72779,-424.56452)"
+- cx="275.4422"
+- cy="335.34866"
+- fx="275.4422"
+- fy="335.34866"
+- r="36.75" />
+- <radialGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient4025"
+- id="radialGradient4062"
+- gradientUnits="userSpaceOnUse"
+- gradientTransform="matrix(5.911206e-2,2.6869855,-0.7234268,1.5914947e-2,408.72779,-424.56452)"
+- cx="275.4422"
+- cy="335.34866"
+- fx="275.4422"
+- fy="335.34866"
+- r="36.75" />
+- <linearGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient4084"
+- id="linearGradient4082"
+- gradientUnits="userSpaceOnUse"
+- x1="182.35046"
+- y1="256.11136"
+- x2="145.53348"
+- y2="542.20502" />
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath4100">
+- <path
+- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.9000755px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+- d="M 265.93541,126.68393 L 247.1682,295.54701 L 421.27363,222.42633 L 483.22803,311.08516 L 541.11243,279.09486 L 503.57801,99.035183 L 265.93541,126.68393 z"
+- id="path4102"
+- sodipodi:nodetypes="ccccccc" />
+- </clipPath>
+- <radialGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient4106"
+- id="radialGradient4112"
+- cx="250.22678"
+- cy="475.09763"
+- fx="250.22678"
+- fy="475.09763"
+- r="95.98877"
+- gradientTransform="matrix(1.2259004,-0.7077739,0.1413989,0.2449102,322.22326,608.91815)"
+- gradientUnits="userSpaceOnUse" />
+- <linearGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient4478"
+- id="linearGradient4484"
+- x1="412.08926"
+- y1="404.91574"
+- x2="417.375"
+- y2="401.82648"
+- gradientUnits="userSpaceOnUse" />
+- <linearGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient4478"
+- id="linearGradient4486"
+- x1="411.91071"
+- y1="404.91577"
+- x2="417.375"
+- y2="401.82648"
+- gradientUnits="userSpaceOnUse" />
+- <linearGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient4478"
+- id="linearGradient4488"
+- x1="411.91071"
+- y1="405.54077"
+- x2="417.375"
+- y2="401.82648"
+- gradientUnits="userSpaceOnUse" />
+- <linearGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient4478"
+- id="linearGradient4490"
+- x1="412.08926"
+- y1="405.54077"
+- x2="417.375"
+- y2="401.82648"
+- gradientUnits="userSpaceOnUse" />
+- <linearGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient4478"
+- id="linearGradient4492"
+- x1="411.73212"
+- y1="405.54077"
+- x2="417.375"
+- y2="401.82648"
+- gradientUnits="userSpaceOnUse" />
+- <radialGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient4862"
+- id="radialGradient4868"
+- cx="429.56738"
+- cy="377.42877"
+- fx="429.56738"
+- fy="377.42877"
+- r="72.079735"
+- gradientTransform="matrix(1,0,0,0.618034,0,144.16496)"
+- gradientUnits="userSpaceOnUse" />
+- <radialGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient4870"
+- id="radialGradient4876"
+- cx="437.6991"
+- cy="391.21735"
+- fx="437.6991"
+- fy="391.21735"
+- r="36.611931"
+- gradientTransform="matrix(1,0,0,0.618034,0,149.43174)"
+- gradientUnits="userSpaceOnUse" />
+- <radialGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient4013"
+- id="radialGradient3585"
+- gradientUnits="userSpaceOnUse"
+- gradientTransform="matrix(1.1323239,0.7659488,-1.4550286,2.1510098,588.75376,-711.79716)"
+- cx="228.81355"
+- cy="440.26971"
+- fx="228.81355"
+- fy="440.26971"
+- r="119.17509" />
+- <linearGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient4084"
+- id="linearGradient3587"
+- gradientUnits="userSpaceOnUse"
+- x1="182.35046"
+- y1="256.11136"
+- x2="145.53348"
+- y2="542.20502" />
+- <radialGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient3317"
+- id="radialGradient8410"
+- gradientUnits="userSpaceOnUse"
+- gradientTransform="matrix(1.0036478,-1.0345492e-7,1.7124628e-7,1.6613125,-753.99632,-302.76972)"
+- cx="317.78754"
+- cy="129.65378"
+- fx="317.78754"
+- fy="129.65378"
+- r="47.863216" />
+- <radialGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient8398"
+- id="radialGradient8412"
+- gradientUnits="userSpaceOnUse"
+- gradientTransform="matrix(2.0747661,-0.1577957,0.2382425,3.1325183,-1144.2358,-272.29325)"
+- cx="325.30847"
+- cy="80.909554"
+- fx="325.30847"
+- fy="80.909554"
+- r="26.937988" />
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath8514">
+- <path
+- style="opacity:1;fill:#262f2f;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 352.24553,211.99185 C 348.4411,186.72762 335.43581,161.35383 335.08873,136.46662 C 334.90247,123.1111 338.36158,109.89571 348.84426,96.912574 C 385.19128,31.616739 465.78517,12.217889 534.77892,5.447147 C 621.70131,-5.569654 719.69159,23.387219 768.15026,100.84843 C 822.27428,176.58173 824.82502,273.38755 848.7623,360.37638 C 878.20009,487.50398 903.54144,616.59052 909.15454,747.22673 C 906.09106,825.40858 900.7282,912.41088 848.65133,975.36086 C 800.62479,1025.7183 725.86486,1025.4139 661.58145,1034.3632 C 571.02606,1039.0182 477.22992,1018.2174 399.79755,970.16496 C 335.02191,932.22495 304.06736,856.68633 302.51815,784.14538 C 294.12898,704.27022 328.90967,630.33687 354.13855,556.98577 C 361.60916,474.2247 363.55141,390.73802 363.79189,307.60093 C 362.95507,275.40549 356.70236,243.7836 352.24553,211.99185 z"
+- id="path8516"
+- sodipodi:nodetypes="cscccccccccccc" />
+- </clipPath>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath8604">
+- <path
+- style="opacity:1;fill:#262f2f;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 352.24553,211.99185 C 348.4411,186.72762 335.43581,161.35383 335.08873,136.46662 C 334.90247,123.1111 338.36158,109.89571 348.84426,96.912574 C 385.19128,31.616739 465.78517,12.217889 534.77892,5.447147 C 621.70131,-5.569654 719.69159,23.387219 768.15026,100.84843 C 822.27428,176.58173 824.82502,273.38755 848.7623,360.37638 C 878.20009,487.50398 903.54144,616.59052 909.15454,747.22673 C 906.09106,825.40858 900.7282,912.41088 848.65133,975.36086 C 800.62479,1025.7183 725.86486,1025.4139 661.58145,1034.3632 C 571.02606,1039.0182 477.22992,1018.2174 399.79755,970.16496 C 335.02191,932.22495 304.06736,856.68633 302.51815,784.14538 C 294.12898,704.27022 328.90967,630.33687 354.13855,556.98577 C 361.60916,474.2247 363.55141,390.73802 363.79189,307.60093 C 362.95507,275.40549 356.70236,243.7836 352.24553,211.99185 z"
+- id="path8606"
+- sodipodi:nodetypes="cscccccccccccc" />
+- </clipPath>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath8610">
+- <path
+- style="opacity:1;fill:#262f2f;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 352.24553,211.99185 C 348.4411,186.72762 335.43581,161.35383 335.08873,136.46662 C 334.90247,123.1111 338.36158,109.89571 348.84426,96.912574 C 385.19128,31.616739 465.78517,12.217889 534.77892,5.447147 C 621.70131,-5.569654 719.69159,23.387219 768.15026,100.84843 C 822.27428,176.58173 824.82502,273.38755 848.7623,360.37638 C 878.20009,487.50398 903.54144,616.59052 909.15454,747.22673 C 906.09106,825.40858 900.7282,912.41088 848.65133,975.36086 C 800.62479,1025.7183 725.86486,1025.4139 661.58145,1034.3632 C 571.02606,1039.0182 477.22992,1018.2174 399.79755,970.16496 C 335.02191,932.22495 304.06736,856.68633 302.51815,784.14538 C 294.12898,704.27022 328.90967,630.33687 354.13855,556.98577 C 361.60916,474.2247 363.55141,390.73802 363.79189,307.60093 C 362.95507,275.40549 356.70236,243.7836 352.24553,211.99185 z"
+- id="path8612"
+- sodipodi:nodetypes="cscccccccccccc" />
+- </clipPath>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath8616">
+- <path
+- style="opacity:1;fill:#262f2f;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 352.24553,211.99185 C 348.4411,186.72762 335.43581,161.35383 335.08873,136.46662 C 334.90247,123.1111 338.36158,109.89571 348.84426,96.912574 C 385.19128,31.616739 465.78517,12.217889 534.77892,5.447147 C 621.70131,-5.569654 719.69159,23.387219 768.15026,100.84843 C 822.27428,176.58173 824.82502,273.38755 848.7623,360.37638 C 878.20009,487.50398 903.54144,616.59052 909.15454,747.22673 C 906.09106,825.40858 900.7282,912.41088 848.65133,975.36086 C 800.62479,1025.7183 725.86486,1025.4139 661.58145,1034.3632 C 571.02606,1039.0182 477.22992,1018.2174 399.79755,970.16496 C 335.02191,932.22495 304.06736,856.68633 302.51815,784.14538 C 294.12898,704.27022 328.90967,630.33687 354.13855,556.98577 C 361.60916,474.2247 363.55141,390.73802 363.79189,307.60093 C 362.95507,275.40549 356.70236,243.7836 352.24553,211.99185 z"
+- id="path8618"
+- sodipodi:nodetypes="cscccccccccccc" />
+- </clipPath>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath8622">
+- <path
+- style="opacity:1;fill:#202020;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- d="M 821.64329,477.88997 C 821.64329,477.88997 844.26276,471.38316 857.38604,472.01724 C 870.50932,472.65133 888.02762,473.95586 901.09489,484.20343 C 914.16216,494.45099 926.16263,511.3435 935.20728,542.57308 C 944.25193,573.80266 936.9056,641.82509 929.03125,685.92043 C 921.1569,730.01577 900.76615,792.03341 884.03125,825.92043 C 867.29635,859.80745 834.23354,903.41563 823.46182,915.79659 C 812.0976,928.85856 767.25593,952.22276 744.03125,958.06326 C 749.33455,947.45666 792.93101,907.47442 779.03125,897.349 C 765.01228,887.13674 733.27116,943.33136 694.7381,926.38217 C 716.12041,913.25005 736.5175,875.19611 728.77871,859.78772 C 720.93846,844.17733 698.07378,908.54529 635.24317,896.8006 C 665.29521,869.27394 690.65023,825.89659 676.50587,813.8209 C 662.09071,801.51403 616.04412,868.11405 616.04412,868.11405 C 616.04412,868.11405 613.22222,826.41287 629.81732,799.50673 C 646.45667,772.52886 709.47029,717.89146 729.37045,687.80331 C 749.2706,657.71517 762.98301,621.79429 771.50587,595.28537 C 780.02873,568.77645 787.30681,518.18583 787.30681,518.18583"
+- id="path8624"
+- sodipodi:nodetypes="czzzzzzczczczczzzc" />
+- </clipPath>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath8642">
+- <path
+- style="opacity:1;fill:#0f0f0f;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 366.88839,504.13471 C 366.88839,504.13471 337.33433,544.70776 319.03125,578.42042 C 300.72816,612.13309 260.41016,704.77736 248.67411,749.49185 C 236.91471,794.29529 186.17411,873.06329 186.17411,873.06329 L 262.24554,891.27757 C 262.24554,891.27757 274.05266,878.45422 293.31696,845.20614 C 312.58126,811.95806 353.67411,706.63471 353.67411,706.63471 L 366.88839,504.13471 z"
+- id="path8644"
+- sodipodi:nodetypes="czzcczcc" />
+- </clipPath>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath8658">
+- <path
+- style="opacity:1;fill:#0b0b0b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 569.03125,1018.7776 C 564.74554,1019.4919 541.4031,1022.3957 511.17411,1028.7776 C 480.94512,1035.1595 411.39918,1054.7395 368.31696,1064.4919 C 325.23474,1074.2443 251.05253,1099.3079 211.40434,1091.7573 C 171.75616,1084.2067 121.88839,1027.349 121.88839,1027.349 L 126.17411,933.06329 C 126.17411,933.06329 212.05962,916.86235 238.31696,899.49186 C 264.57431,882.12137 283.89934,849.82588 297.60268,828.06329 C 311.30602,806.3007 330.45982,756.63471 330.45982,756.63471 L 569.03125,1018.7776 z"
+- id="path8660"
+- sodipodi:nodetypes="czzzcczzcc" />
+- </clipPath>
+- <filter
+- inkscape:collect="always"
+- id="filter8802"
+- x="-0.35311759"
+- width="1.7062352"
+- y="-0.1817714"
+- height="1.3635428">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="48.038491"
+- id="feGaussianBlur8804" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter8806"
+- x="-0.61142862"
+- width="2.2228572"
+- y="-0.14930232"
+- height="1.2986046">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="37.830213"
+- id="feGaussianBlur8808" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter8810"
+- x="-0.23519406"
+- width="1.4703881"
+- y="-0.24500646"
+- height="1.4900129">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="58.328041"
+- id="feGaussianBlur8812" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter8814"
+- x="-0.20466694"
+- width="1.4093339"
+- y="-0.29007819"
+- height="1.5801564">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="22.300169"
+- id="feGaussianBlur8816" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter8818"
+- x="-0.34381232"
+- width="1.6876246"
+- y="-0.18433961"
+- height="1.3686792">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="34.542167"
+- id="feGaussianBlur8820" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter8822"
+- x="-0.2742857"
+- width="1.5485713"
+- y="-0.21333334"
+- height="1.4266667">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="11.313708"
+- id="feGaussianBlur8824" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter8826"
+- x="-0.25894088"
+- width="1.5178818"
+- y="-0.2236412"
+- height="1.4472824">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="19.631544"
+- id="feGaussianBlur8828" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter8856"
+- x="-0.3253231"
+- width="1.6506462"
+- y="-0.19013336"
+- height="1.3802667">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="28.712591"
+- id="feGaussianBlur8858" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter8860"
+- x="-0.38093024"
+- width="1.7618605"
+- y="-0.17518716"
+- height="1.3503743">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="19.304015"
+- id="feGaussianBlur8862" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter8888"
+- x="-0.2112188"
+- width="1.4224375"
+- y="-0.16808605"
+- height="1.3361721">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="8.3693583"
+- id="feGaussianBlur8890" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter8892"
+- x="-0.18692794"
+- width="1.3738559"
+- y="-0.23646873"
+- height="1.4729375">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="31.21228"
+- id="feGaussianBlur8894" />
+- </filter>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath8906">
+- <path
+- style="opacity:1;fill:#262f2f;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 352.24553,211.99185 C 348.4411,186.72762 335.43581,161.35383 335.08873,136.46662 C 334.90247,123.1111 338.36158,109.89571 348.84426,96.912574 C 385.19128,31.616739 465.78517,12.217889 534.77892,5.447147 C 621.70131,-5.569654 719.69159,23.387219 768.15026,100.84843 C 822.27428,176.58173 824.82502,273.38755 848.7623,360.37638 C 878.20009,487.50398 903.54144,616.59052 909.15454,747.22673 C 906.09106,825.40858 900.7282,912.41088 848.65133,975.36086 C 800.62479,1025.7183 725.86486,1025.4139 661.58145,1034.3632 C 571.02606,1039.0182 477.22992,1018.2174 399.79755,970.16496 C 335.02191,932.22495 304.06736,856.68633 302.51815,784.14538 C 294.12898,704.27022 328.90967,630.33687 354.13855,556.98577 C 361.60916,474.2247 363.55141,390.73802 363.79189,307.60093 C 362.95507,275.40549 356.70236,243.7836 352.24553,211.99185 z"
+- id="path8908"
+- sodipodi:nodetypes="cscccccccccccc" />
+- </clipPath>
+- <filter
+- inkscape:collect="always"
+- id="filter8940"
+- x="-0.25152978"
+- width="1.5030596"
+- y="-0.053035267"
+- height="1.1060705">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="13.024603"
+- id="feGaussianBlur8942" />
+- </filter>
+- <linearGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient8952"
+- id="linearGradient8958"
+- x1="609.31244"
+- y1="239.46866"
+- x2="560.83142"
+- y2="262.86206"
+- gradientUnits="userSpaceOnUse"
+- gradientTransform="translate(450.03125,73.843964)" />
+- <linearGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient8964"
+- id="linearGradient8970"
+- x1="603.84064"
+- y1="627.85303"
+- x2="616.24396"
+- y2="585.42664"
+- gradientUnits="userSpaceOnUse"
+- gradientTransform="translate(450.03125,73.843964)" />
+- <filter
+- inkscape:collect="always"
+- id="filter9020"
+- x="-0.32861114"
+- width="1.6572223"
+- y="-0.182"
+- height="1.364">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="20.912684"
+- id="feGaussianBlur9022" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter9024"
+- x="-0.55453134"
+- width="2.1090627"
+- y="-0.51434779"
+- height="2.0286956">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="20.912684"
+- id="feGaussianBlur9026" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter9044"
+- x="-0.32631579"
+- width="1.6526316"
+- y="-0.84545463"
+- height="2.6909094">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="21.92031"
+- id="feGaussianBlur9046" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter9048"
+- x="-0.40879121"
+- width="1.8175824"
+- y="-0.71538466"
+- height="2.4307692">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="21.92031"
+- id="feGaussianBlur9050" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter3587"
+- x="-0.1">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="8.881432"
+- id="feGaussianBlur3589" />
+- </filter>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath3602">
+- <path
+- sodipodi:nodetypes="czzzzzzczczczczzzc"
+- id="path3604"
+- d="M 647.61204,540.04601 C 647.61204,540.04601 670.23151,533.5392 683.35479,534.17328 C 696.47807,534.80737 713.99637,536.1119 727.06364,546.35947 C 740.13091,556.60703 752.13138,573.49954 761.17603,604.72912 C 770.22068,635.9587 762.87435,703.98113 755,748.07647 C 747.12565,792.17181 726.7349,854.18945 710,888.07647 C 693.2651,921.96349 660.20229,965.57167 649.43057,977.95263 C 638.06635,991.0146 593.22468,1014.3788 570,1020.2193 C 575.3033,1009.6127 618.89976,969.63046 605,959.50504 C 590.98103,949.29278 559.23991,1005.4874 520.70685,988.53821 C 542.08916,975.40609 562.48625,937.35215 554.74746,921.94376 C 546.90721,906.33337 524.04253,970.70133 461.21192,958.95664 C 491.26396,931.42998 516.61898,888.05263 502.47462,875.97694 C 488.05946,863.67007 442.01287,930.27009 442.01287,930.27009 C 442.01287,930.27009 439.19097,888.56891 455.78607,861.66277 C 472.42542,834.6849 535.43904,780.0475 555.3392,749.95935 C 575.23935,719.87121 588.95176,683.95033 597.47462,657.44141 C 605.99748,630.93249 613.27556,580.34187 613.27556,580.34187"
+- style="opacity:1;fill:#202020;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- </clipPath>
+- <filter
+- inkscape:collect="always"
+- id="filter4120"
+- x="-0.2770822"
+- width="1.5541644"
+- y="-0.32482043"
+- height="1.6496409">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="19.956289"
+- id="feGaussianBlur4122" />
+- </filter>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath3631">
+- <path
+- style="opacity:1;fill:#ada469;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- d="M 760.16396,935.83377 C 766.95806,954.73656 770.65765,969.13346 772.05426,987.04566 C 773.45088,1004.958 768.27158,1038.8465 769.1538,1057.7018 C 770.03555,1076.547 777.28749,1097.8008 796.49843,1106.6707 C 815.9173,1115.6365 845.81767,1116.882 870.61827,1103.5251 C 895.41887,1090.1681 928.01929,1033.1996 941.59253,1006.2164 C 955.21638,979.13246 980.3536,891.71903 986.25333,856.44781 C 992.15306,821.1766 988.80387,815.14704 981.63585,807.39232 C 984.27615,779.55217 980.13613,752.45689 994.74554,720.20614 C 964.49653,732.03184 957.36325,760.36684 946.42665,785.71122 C 938.42574,734.77829 946.63581,714.43803 949.74554,684.49186 C 920.68078,699.26977 906.88403,731.60588 904.74554,777.349 C 893.82159,776.0448 883.3541,772.91477 871.17411,776.63471 C 870.91007,730.61137 869.71055,699.7453 880.08474,662.42822 C 826.82927,683.45508 817.13746,769.02232 824.03125,775.20614 C 813.14843,775.74114 802.66017,773.90884 791.17411,778.06329 C 791.81303,735.49194 790.91365,693.15468 761.17411,655.20614 C 761.17411,655.20614 730.21605,736.12848 729.74554,758.77757 C 729.27503,781.42666 739.19713,798.94345 739.19713,798.94345 C 739.19713,798.94345 730.62906,835.68396 732.89854,857.17568 C 735.19439,878.91714 753.34144,916.85185 760.16396,935.83377 z"
+- id="path3633"
+- sodipodi:nodetypes="czzzzzzcccccccccczczz" />
+- </clipPath>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath3665">
+- <path
+- sodipodi:nodetypes="czzcczcc"
+- id="path3667"
+- d="M 366.88839,504.13471 C 366.88839,504.13471 337.33433,544.70776 319.03125,578.42042 C 300.72816,612.13309 260.41016,704.77736 248.67411,749.49185 C 236.91471,794.29529 186.17411,873.06329 186.17411,873.06329 L 262.24554,891.27757 C 262.24554,891.27757 274.05266,878.45422 293.31696,845.20614 C 312.58126,811.95806 353.67411,706.63471 353.67411,706.63471 L 366.88839,504.13471 z"
+- style="opacity:1;fill:#0f0f0f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+- </clipPath>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath3677">
+- <path
+- style="opacity:1;fill:#ada469;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- d="M 586.13271,997.98981 C 592.92681,1016.8926 596.6264,1031.2895 598.02301,1049.2017 C 599.41963,1067.114 594.24033,1101.0025 595.12255,1119.8578 C 596.0043,1138.703 603.25624,1159.9568 622.46718,1168.8267 C 641.88605,1177.7925 671.78642,1179.038 696.58702,1165.6811 C 721.38762,1152.3241 753.98804,1095.3556 767.56128,1068.3724 C 781.18513,1041.2885 806.32235,953.87507 812.22208,918.60385 C 818.12181,883.33264 814.77262,877.30308 807.6046,869.54836 C 810.2449,841.70821 806.10488,814.61293 820.71429,782.36218 C 790.46528,794.18788 783.332,822.52288 772.3954,847.86726 C 764.39449,796.93433 772.60456,776.59407 775.71429,746.6479 C 746.64953,761.42581 732.85278,793.76192 730.71429,839.50504 C 719.79034,838.20084 709.32285,835.07081 697.14286,838.79075 C 696.87882,792.76741 695.6793,761.90134 706.05349,724.58426 C 652.79802,745.61112 643.10621,831.17836 650,837.36218 C 639.11718,837.89718 628.62892,836.06488 617.14286,840.21933 C 617.78178,797.64798 616.8824,755.31072 587.14286,717.36218 C 587.14286,717.36218 556.1848,798.28452 555.71429,820.93361 C 555.24378,843.5827 565.16588,861.09949 565.16588,861.09949 C 565.16588,861.09949 556.59781,897.84 558.86729,919.33172 C 561.16314,941.07318 579.31019,979.00789 586.13271,997.98981 z"
+- id="path3679"
+- sodipodi:nodetypes="czzzzzzcccccccccczczz" />
+- </clipPath>
+- <filter
+- inkscape:collect="always"
+- id="filter3898">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="10.892985"
+- id="feGaussianBlur3900" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter4130"
+- x="-0.49509686"
+- width="1.9901937"
+- y="-0.26708817"
+- height="1.5341763">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="10.730622"
+- id="feGaussianBlur4132" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter4141"
+- x="-0.40611032"
+- width="1.8122206"
+- y="-0.30260596"
+- height="1.6052119">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="9.8586086"
+- id="feGaussianBlur4143" />
+- </filter>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath4177">
+- <path
+- sodipodi:nodetypes="czzzzzzcccccccccczczz"
+- id="path4179"
+- d="M 586.13271,997.98981 C 592.92681,1016.8926 596.6264,1031.2895 598.02301,1049.2017 C 599.41963,1067.114 594.24033,1101.0025 595.12255,1119.8578 C 596.0043,1138.703 603.25624,1159.9568 622.46718,1168.8267 C 641.88605,1177.7925 671.78642,1179.038 696.58702,1165.6811 C 721.38762,1152.3241 753.98804,1095.3556 767.56128,1068.3724 C 781.18513,1041.2885 806.32235,953.87507 812.22208,918.60385 C 818.12181,883.33264 814.77262,877.30308 807.6046,869.54836 C 810.2449,841.70821 806.10488,814.61293 820.71429,782.36218 C 790.46528,794.18788 783.332,822.52288 772.3954,847.86726 C 764.39449,796.93433 772.60456,776.59407 775.71429,746.6479 C 746.64953,761.42581 732.85278,793.76192 730.71429,839.50504 C 719.79034,838.20084 709.32285,835.07081 697.14286,838.79075 C 696.87882,792.76741 695.6793,761.90134 706.05349,724.58426 C 652.79802,745.61112 643.10621,831.17836 650,837.36218 C 639.11718,837.89718 628.62892,836.06488 617.14286,840.21933 C 617.78178,797.64798 616.8824,755.31072 587.14286,717.36218 C 587.14286,717.36218 556.1848,798.28452 555.71429,820.93361 C 555.24378,843.5827 565.16588,861.09949 565.16588,861.09949 C 565.16588,861.09949 556.59781,897.84 558.86729,919.33172 C 561.16314,941.07318 579.31019,979.00789 586.13271,997.98981 z"
+- style="opacity:1;fill:#ada469;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- </clipPath>
+- <filter
+- inkscape:collect="always"
+- id="filter4185">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="3.6164709"
+- id="feGaussianBlur4187" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter4105">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="3.8640966"
+- id="feGaussianBlur4107" />
+- </filter>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath2833">
+- <path
+- style="opacity:1;fill:#292929;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 569.03125,1018.7776 C 564.74554,1019.4919 541.4031,1022.3957 511.17411,1028.7776 C 480.94512,1035.1595 453.86016,1033.7437 375.38803,1046.1072 C 295.53625,1058.688 281.32367,1088.6495 267.26578,1093.1715 C 252.56564,1097.9001 121.88839,1027.349 121.88839,1027.349 L 126.17411,933.06329 C 126.17411,933.06329 212.05962,916.86235 238.31696,899.49186 C 264.57431,882.12137 283.89934,849.82588 297.60268,828.06329 C 311.30602,806.3007 330.45982,756.63471 330.45982,756.63471 L 569.03125,1018.7776 z"
+- id="path2835"
+- sodipodi:nodetypes="czzzcczzcc" />
+- </clipPath>
+- <linearGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient2843"
+- id="linearGradient2841"
+- gradientUnits="userSpaceOnUse"
+- x1="347.89655"
+- y1="1070.2124"
+- x2="275.58191"
+- y2="867.97992" />
+- <linearGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient3627"
+- id="linearGradient3688"
+- gradientUnits="userSpaceOnUse"
+- x1="699.32867"
+- y1="269.76755"
+- x2="698.97504"
+- y2="346.1351" />
+- <mask
+- maskUnits="userSpaceOnUse"
+- id="mask3684">
+- <path
+- sodipodi:type="arc"
+- style="opacity:1;fill:url(#linearGradient3688);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.43724918px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- id="path3686"
+- sodipodi:cx="579.474"
+- sodipodi:cy="260.57516"
+- sodipodi:rx="192.6866"
+- sodipodi:ry="164.04877"
+- d="M 772.1606,260.57516 A 192.6866,164.04877 0 1 1 386.7874,260.57516 A 192.6866,164.04877 0 1 1 772.1606,260.57516 z"
+- transform="translate(-174.03125,62.156036)" />
+- </mask>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath3622">
+- <path
+- style="opacity:1;fill:#ada469;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- d="M 266.27183,924.57186 C 264.86456,943.37307 265.12693,957.32289 268.35357,973.87514 C 271.58022,990.42748 284.75965,1019.7825 288.68797,1037.0589 C 292.61419,1054.326 291.3821,1075.3685 276.22853,1088.2071 C 260.91092,1101.1845 234.17726,1109.806 208.39623,1103.9409 C 182.61517,1098.0756 138.84716,1054.7175 119.80604,1033.7126 C 100.6939,1012.6293 56.045183,939.86194 41.867508,909.43681 C 27.689836,879.01169 29.207903,872.71824 33.747793,863.90708 C 24.381071,839.38658 21.334081,813.84027 0.035335518,788.33044 C 30.360815,791.44488 43.915625,815.28677 60.161025,835.47019 C 54.631129,787.39416 42.10631,771.05369 31.787073,744.74589 C 61.781368,750.82755 82.366433,776.61829 95.766856,817.45839 C 105.32101,813.54048 114.00462,808.08545 125.95427,808.39719 C 114.65677,766.70139 108.00481,738.48135 89.267015,707.32725 C 142.70898,712.99758 172.92404,787.96657 168.23844,795.28805 C 178.21641,793.04406 187.24409,788.75767 198.67497,789.63638 C 187.42601,751.28936 177.62716,712.76848 195.01526,670.9882 C 195.01526,670.9882 243.30204,736.42507 249.40492,756.79397 C 255.50779,777.16288 250.92373,795.49449 250.92373,795.49449 C 250.92373,795.49449 267.8833,826.57978 271.21765,846.58862 C 274.59075,866.82997 267.68496,905.69194 266.27183,924.57186 z"
+- id="path3624"
+- sodipodi:nodetypes="czzzzzzcccccccccczczz" />
+- </clipPath>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath3636">
+- <path
+- style="opacity:1;fill:#ada469;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- d="M 760.16396,935.83377 C 766.95806,954.73656 770.65765,969.13346 772.05426,987.04566 C 773.45088,1004.958 768.27158,1038.8465 769.1538,1057.7018 C 770.03555,1076.547 777.28749,1097.8008 796.49843,1106.6707 C 815.9173,1115.6365 845.81767,1116.882 870.61827,1103.5251 C 895.41887,1090.1681 928.01929,1033.1996 941.59253,1006.2164 C 955.21638,979.13246 980.3536,891.71903 986.25333,856.44781 C 992.15306,821.1766 988.80387,815.14704 981.63585,807.39232 C 984.27615,779.55217 980.13613,752.45689 994.74554,720.20614 C 964.49653,732.03184 957.36325,760.36684 946.42665,785.71122 C 938.42574,734.77829 946.63581,714.43803 949.74554,684.49186 C 920.68078,699.26977 906.88403,731.60588 904.74554,777.349 C 893.82159,776.0448 883.3541,772.91477 871.17411,776.63471 C 870.91007,730.61137 869.71055,699.7453 880.08474,662.42822 C 826.82927,683.45508 817.13746,769.02232 824.03125,775.20614 C 813.14843,775.74114 802.66017,773.90884 791.17411,778.06329 C 791.81303,735.49194 790.91365,693.15468 761.17411,655.20614 C 761.17411,655.20614 730.21605,736.12848 729.74554,758.77757 C 729.27503,781.42666 739.19713,798.94345 739.19713,798.94345 C 739.19713,798.94345 730.62906,835.68396 732.89854,857.17568 C 735.19439,878.91714 753.34144,916.85185 760.16396,935.83377 z"
+- id="path3638"
+- sodipodi:nodetypes="czzzzzzcccccccccczczz" />
+- </clipPath>
+- <linearGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient3660"
+- id="linearGradient3666"
+- x1="1255.7386"
+- y1="667.09216"
+- x2="893.69995"
+- y2="858.01099"
+- gradientUnits="userSpaceOnUse" />
+- <filter
+- inkscape:collect="always"
+- id="filter3779"
+- x="-0.087980822"
+- width="1.1759616"
+- y="-0.17728332"
+- height="1.3545666">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="16.340344"
+- id="feGaussianBlur3781" />
+- </filter>
+- <filter
+- id="filter3785"
+- inkscape:label="White Fur">
+- <feTurbulence
+- id="feTurbulence3787"
+- in="SourceAlpha"
+- type="fractalNoise"
+- baseFrequency="0.24044943820224721"
+- numOctaves="10"
+- seed="655"
+- result="result0" />
+- <feDisplacementMap
+- id="feDisplacementMap3789"
+- in="SourceGraphic"
+- in2="result0"
+- scale="62"
+- xChannelSelector="B"
+- yChannelSelector="G" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter3677">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="2.0397518"
+- id="feGaussianBlur3679" />
+- </filter>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath3722">
+- <path
+- style="opacity:1;fill:#121212;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 709.28572,844.50504 C 763.57143,843.07647 835.32072,829.45305 879.28572,817.71932 C 923.33843,805.96218 1005.172,781.37208 1054.6428,759.86218 C 1103.9821,738.40946 1168.2465,700.58058 1208.9286,667.71933 C 1249.4367,634.99864 1261.3185,611.89952 1269.6429,634.1479 C 1278.012,656.51569 1253.2359,690.47352 1231.7857,715.21933 C 1210.1816,740.14273 1179.0544,767.92466 1132.8571,804.50504 C 1086.6598,841.08542 976.77458,906.08967 920,933.07647 C 862.93394,960.20183 791.79666,991.31489 747.85714,1005.5765 C 703.91762,1019.8381 616.42857,1036.6479 616.42857,1036.6479 L 709.28572,844.50504 z"
+- id="path3724"
+- sodipodi:nodetypes="czzzzzzzzcc" />
+- </clipPath>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath3986">
+- <path
+- style="opacity:1;fill:#121212;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 709.28572,844.50504 C 763.57143,843.07647 835.32072,829.45305 879.28572,817.71932 C 923.33843,805.96218 1005.172,781.37208 1054.6428,759.86218 C 1103.9821,738.40946 1168.2465,700.58058 1208.9286,667.71933 C 1249.4367,634.99864 1261.3185,611.89952 1269.6429,634.1479 C 1278.012,656.51569 1253.2359,690.47352 1231.7857,715.21933 C 1210.1816,740.14273 1179.0544,767.92466 1132.8571,804.50504 C 1086.6598,841.08542 976.77458,906.08967 920,933.07647 C 862.93394,960.20183 791.79666,991.31489 747.85714,1005.5765 C 703.91762,1019.8381 616.42857,1036.6479 616.42857,1036.6479 L 709.28572,844.50504 z"
+- id="path3988"
+- sodipodi:nodetypes="czzzzzzzzcc" />
+- </clipPath>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath3992">
+- <path
+- style="opacity:1;fill:#121212;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 709.28572,844.50504 C 763.57143,843.07647 835.32072,829.45305 879.28572,817.71932 C 923.33843,805.96218 1005.172,781.37208 1054.6428,759.86218 C 1103.9821,738.40946 1168.2465,700.58058 1208.9286,667.71933 C 1249.4367,634.99864 1261.3185,611.89952 1269.6429,634.1479 C 1278.012,656.51569 1253.2359,690.47352 1231.7857,715.21933 C 1210.1816,740.14273 1179.0544,767.92466 1132.8571,804.50504 C 1086.6598,841.08542 976.77458,906.08967 920,933.07647 C 862.93394,960.20183 791.79666,991.31489 747.85714,1005.5765 C 703.91762,1019.8381 616.42857,1036.6479 616.42857,1036.6479 L 709.28572,844.50504 z"
+- id="path3994"
+- sodipodi:nodetypes="czzzzzzzzcc" />
+- </clipPath>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath3998">
+- <path
+- style="opacity:1;fill:#262f2f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 178.21428,274.14789 C 174.40985,248.88366 161.40456,223.50987 161.05748,198.62266 C 160.87122,185.26714 164.33033,172.05175 174.81301,159.06861 C 211.16003,93.772775 291.75392,74.373925 360.74767,67.603183 C 447.67006,56.586382 545.66034,85.543255 594.11901,163.00447 C 648.24303,238.73777 650.79377,335.54359 674.73105,422.53242 C 704.16884,549.66002 729.51019,678.74656 735.12329,809.38277 C 732.05981,887.56462 726.69695,974.56692 674.62008,1037.5169 C 626.59354,1087.8743 551.83361,1087.5699 487.5502,1096.5192 C 396.99481,1101.1742 303.19867,1080.3734 225.7663,1032.321 C 160.99066,994.38099 130.03611,918.84237 128.4869,846.30142 C 120.09773,766.42626 154.87842,692.49291 180.1073,619.14181 C 187.57791,536.38074 189.52016,452.89406 189.76064,369.75697 C 188.92382,337.56153 182.67111,305.93964 178.21428,274.14789 z"
+- id="path4000"
+- sodipodi:nodetypes="cscccccccccccc" />
+- </clipPath>
+- <filter
+- inkscape:collect="always"
+- id="filter4002"
+- x="-0.24334238"
+- width="1.4866848"
+- y="-0.39104807"
+- height="1.7820961">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="14.589518"
+- id="feGaussianBlur4004" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter4010"
+- x="-0.14577261"
+- width="1.2915452"
+- y="-0.23523259"
+- height="1.4704652">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="4.4442907"
+- id="feGaussianBlur4012" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter4053">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="0.6062947"
+- id="feGaussianBlur4055" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter4079">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="6.5887624"
+- id="feGaussianBlur4081" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter4083">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="1.5052066"
+- id="feGaussianBlur4085" />
+- </filter>
+- <radialGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient4113"
+- id="radialGradient4119"
+- cx="296.33783"
+- cy="427.17749"
+- fx="296.33783"
+- fy="427.17749"
+- r="19.704132"
+- gradientUnits="userSpaceOnUse"
+- gradientTransform="matrix(2.9797125,0,0,2.9797125,-599.28727,-827.0855)" />
+- <filter
+- inkscape:collect="always"
+- id="filter6949"
+- x="-0.10294895"
+- width="1.2058979"
+- y="-0.34224695"
+- height="1.6844939">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="1.1675612"
+- id="feGaussianBlur6951" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter6953"
+- x="-0.098320946"
+- width="1.1966419"
+- y="-0.19750816"
+- height="1.3950163">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="1.1675612"
+- id="feGaussianBlur6955" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter6957"
+- x="-0.098213427"
+- width="1.1964267"
+- y="-0.19838208"
+- height="1.3967642">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="1.1675612"
+- id="feGaussianBlur6959" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter6961"
+- x="-0.09919104"
+- width="1.1983821"
+- y="-0.22643611"
+- height="1.4528722">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="1.1675612"
+- id="feGaussianBlur6963" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter6965"
+- x="-0.099081434"
+- width="1.1981629"
+- y="-0.22529824"
+- height="1.4505965">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="1.1675612"
+- id="feGaussianBlur6967" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter6969"
+- x="-0.10450897"
+- width="1.2090179"
+- y="-0.40468886"
+- height="1.8093777">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="1.1675612"
+- id="feGaussianBlur6971" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter6973"
+- x="-0.10330495"
+- width="1.2066098"
+- y="-0.36439717"
+- height="1.7287945">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="1.1675612"
+- id="feGaussianBlur6975" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter6977"
+- x="-0.10224481"
+- width="1.2044896"
+- y="-0.32371372"
+- height="1.6474274">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="1.1675612"
+- id="feGaussianBlur6979" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter6981"
+- x="-0.10052545"
+- width="1.2010509"
+- y="-0.2742162"
+- height="1.5484324">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="1.1675612"
+- id="feGaussianBlur6983" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter6985"
+- x="-0.098428868"
+- width="1.1968577"
+- y="-0.20853186"
+- height="1.4170637">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="1.1675612"
+- id="feGaussianBlur6987" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter6989"
+- x="-0.098428868"
+- width="1.1968577"
+- y="-0.20287035"
+- height="1.4057407">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="1.1675612"
+- id="feGaussianBlur6991" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter6993"
+- x="-0.098213255"
+- width="1.1964265"
+- y="-0.19838208"
+- height="1.3967642">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="1.1675612"
+- id="feGaussianBlur6995" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter6997">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="1.1675612"
+- id="feGaussianBlur6999" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter7001">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="1.1675612"
+- id="feGaussianBlur7003" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter7285"
+- x="-0.030884685"
+- width="1.0617694"
+- y="-0.10267408"
+- height="1.2053483">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="0.35026836"
+- id="feGaussianBlur7287" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter7289">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="0.35026836"
+- id="feGaussianBlur7291" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter7293">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="0.35026836"
+- id="feGaussianBlur7295" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter7297">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="0.35026836"
+- id="feGaussianBlur7299" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter7301">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="0.35026836"
+- id="feGaussianBlur7303" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter7305">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="0.35026836"
+- id="feGaussianBlur7307" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter7309">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="0.35026836"
+- id="feGaussianBlur7311" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter7313">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="0.35026836"
+- id="feGaussianBlur7315" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter7317">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="0.35026836"
+- id="feGaussianBlur7319" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter7321">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="0.35026836"
+- id="feGaussianBlur7323" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter7325"
+- x="-0.031352691"
+- width="1.0627054"
+- y="-0.12140666"
+- height="1.2428133">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="0.35026836"
+- id="feGaussianBlur7327" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter7329"
+- x="-0.030991485"
+- width="1.061983"
+- y="-0.10931916"
+- height="1.2186383">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="0.35026836"
+- id="feGaussianBlur7331" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter7333">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="0.35026836"
+- id="feGaussianBlur7335" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter7337">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="0.35026836"
+- id="feGaussianBlur7339" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter7345">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="1.7233839"
+- id="feGaussianBlur7347" />
+- </filter>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath7421">
+- <path
+- sodipodi:type="inkscape:offset"
+- inkscape:radius="0"
+- inkscape:original="M 1111.4062 -285.9375 L 1107.4688 -284.0625 C 1107.4283 -284.05228 1107.3692 -284.04201 1107.3438 -284.03125 C 1106.925 -283.8184 1107.1791 -283.93067 1106.6875 -283.71875 C 1106.2014 -283.50919 1104.9499 -283.13456 1102.5938 -282.25 C 1099.2626 -280.99942 1096.7895 -280.10016 1095.5938 -279.1875 C 1094.0576 -279.16623 1091.8733 -278.95419 1089.9375 -278.46875 C 1086.956 -277.72108 1085.0823 -277.29474 1083.1875 -276.875 C 1081.2927 -276.45527 1081.512 -276.23281 1080.3125 -276 C 1079.0159 -275.74833 1078.5911 -276.00899 1074.875 -275.21875 C 1071.3851 -274.4766 1065.9802 -273.28768 1064.7188 -272.53125 C 1063.1348 -272.71203 1060.8513 -272.85303 1058.875 -272.5625 C 1055.8346 -272.11554 1053.9588 -271.88974 1052.0312 -271.65625 C 1051.3758 -271.57687 1050.9902 -271.45547 1050.6875 -271.375 C 1050.2613 -271.24334 1050.0017 -271.11498 1049.3125 -271.03125 C 1048.0009 -270.87188 1047.5503 -271.18808 1043.7812 -270.75 C 1040.2273 -270.33691 1034.7758 -269.47718 1033.5312 -268.8125 C 1031.9322 -269.10979 1029.6735 -269.34669 1027.6875 -269.15625 C 1024.6287 -268.86293 1022.7155 -268.67226 1020.7812 -268.5 C 1018.847 -268.32773 1019.0926 -268.07763 1017.875 -267.96875 C 1016.5588 -267.85105 1016.1152 -268.13238 1012.3438 -267.71875 C 1008.8017 -267.3303 1003.3359 -266.50948 1002.0625 -265.84375 C 1000.4636 -266.13844 998.1753 -266.35076 996.1875 -266.15625 C 993.12921 -265.857 991.2463 -265.67601 989.3125 -265.5 C 988.65501 -265.44015 988.27245 -265.32144 987.96875 -265.25 C 987.54105 -265.13104 987.28525 -265.03193 986.59375 -264.96875 C 985.27775 -264.84849 984.834 -265.16363 981.0625 -264.75 C 977.50631 -264.35998 972.0569 -263.51084 970.8125 -262.84375 C 969.21381 -263.13793 966.95265 -263.36747 964.96875 -263.15625 C 961.91305 -262.83092 959.9947 -262.63001 958.0625 -262.4375 C 956.13031 -262.24499 956.37275 -261.99662 955.15625 -261.875 C 953.84137 -261.74353 953.3932 -262.03954 949.625 -261.59375 C 946.08611 -261.17509 940.6473 -260.30158 939.375 -259.625 C 937.77741 -259.90604 935.51505 -260.04543 933.53125 -259.8125 C 930.47927 -259.45413 928.58625 -259.24464 926.65625 -259.03125 C 926.00007 -258.95869 925.6156 -258.85856 925.3125 -258.78125 C 924.88571 -258.65402 924.6276 -258.51405 923.9375 -258.4375 C 922.62411 -258.29181 922.17015 -258.61152 918.40625 -258.125 C 914.85737 -257.66624 909.4276 -256.70598 908.1875 -256 C 906.59441 -256.24424 904.3537 -256.38135 902.375 -256.125 C 899.32741 -255.73018 897.4243 -255.47655 895.5 -255.21875 C 893.57571 -254.96096 893.7739 -254.72522 892.5625 -254.5625 C 891.25301 -254.3866 890.8153 -254.66688 887.0625 -254.09375 C 883.53821 -253.55551 878.1393 -252.39458 876.875 -251.65625 C 875.28751 -251.85979 873.0295 -251.91098 871.0625 -251.5625 C 868.03631 -251.02638 866.1636 -250.70081 864.25 -250.375 C 863.59941 -250.26423 863.2363 -250.10406 862.9375 -250 C 862.51681 -249.83512 862.27405 -249.6687 861.59375 -249.53125 C 860.29905 -249.26966 859.86665 -249.53745 856.15625 -248.71875 C 852.65777 -247.9468 847.31035 -246.33582 846.09375 -245.5 C 844.53085 -245.57745 842.33625 -245.41472 840.40625 -244.90625 C 837.43387 -244.12312 835.58855 -243.67416 833.71875 -243.15625 C 831.84875 -242.63835 832.0521 -242.38897 830.875 -242.0625 C 829.60251 -241.7096 829.17795 -241.95541 825.53125 -240.875 C 822.10657 -239.86037 816.88185 -237.94183 815.65625 -237.03125 C 814.11747 -237.01851 811.93645 -236.75903 810.03125 -236.15625 C 807.10027 -235.22891 805.2809 -234.69783 803.4375 -234.09375 C 802.81071 -233.88837 802.44585 -233.70117 802.15625 -233.5625 C 801.74867 -233.34889 801.50295 -233.15375 800.84375 -232.9375 C 799.58925 -232.52596 799.1576 -232.74846 795.5625 -231.5 C 792.17261 -230.32283 786.96755 -228.2863 785.78125 -227.34375 C 784.25737 -227.28408 782.1312 -226.94888 780.25 -226.28125 C 777.35261 -225.25296 775.55095 -224.60577 773.71875 -223.96875 C 771.88655 -223.33174 772.0909 -223.12021 770.9375 -222.71875 C 769.69071 -222.28479 769.27395 -222.51903 765.71875 -221.15625 C 762.38005 -219.87645 757.23165 -217.6737 756.03125 -216.6875 C 754.52407 -216.57981 752.39555 -216.1887 750.53125 -215.46875 C 747.66307 -214.36115 745.90735 -213.68719 744.09375 -213 C 743.47705 -212.76637 743.0973 -212.55797 742.8125 -212.40625 C 742.81251 -212.40625 742.8125 -212.37673 742.8125 -212.375 L 734.8125 -209.1875 L 736.625 -194.46875 C 736.36701 -194.52956 742.8125 -191.15625 742.8125 -191.15625 C 743.03891 -191.30093 743.26145 -191.42886 743.53125 -191.53125 C 744.61177 -191.94123 745.70285 -191.74702 749.53125 -193.21875 C 753.35977 -194.69049 754.7553 -195.22373 755.4375 -195.625 C 756.11711 -196.02478 757.04925 -196.50437 757.65625 -197.15625 C 759.48317 -197.294 761.22705 -197.64948 762.59375 -198.15625 C 765.56175 -199.25677 767.4691 -199.96244 769.375 -200.625 C 771.28081 -201.28754 771.72915 -202.03987 772.78125 -202.40625 C 773.87287 -202.78636 774.97635 -202.57163 778.84375 -203.9375 C 782.71115 -205.30336 784.1269 -205.76458 784.8125 -206.15625 C 785.51361 -206.55677 786.5133 -207.08923 787.125 -207.75 C 789.09581 -207.80466 790.94195 -208.13463 792.40625 -208.625 C 795.40777 -209.63008 797.3324 -210.24671 799.25 -210.875 C 800.78861 -211.3791 801.42415 -211.92177 802.15625 -212.3125 C 802.38647 -212.44681 802.63215 -212.56623 802.90625 -212.65625 C 804.00457 -213.01673 805.0877 -212.73762 809 -213.96875 C 812.91231 -215.19988 814.366 -215.6417 815.0625 -216 C 815.75641 -216.35697 816.6926 -216.79261 817.3125 -217.40625 C 819.17771 -217.42891 820.94835 -217.67308 822.34375 -218.09375 C 825.37415 -219.00729 827.33615 -219.52385 829.28125 -220.0625 C 831.22637 -220.60114 831.70745 -221.32702 832.78125 -221.625 C 833.89527 -221.93415 835.00125 -221.61761 838.96875 -222.65625 C 842.93625 -223.69488 844.38625 -224.08898 845.09375 -224.40625 C 845.82855 -224.73584 846.90765 -225.15997 847.53125 -225.78125 C 849.52907 -225.66525 851.3887 -225.80134 852.875 -226.15625 C 855.95311 -226.89125 857.9584 -227.25719 859.9375 -227.65625 C 861.52541 -227.97643 862.1818 -228.4468 862.9375 -228.75 C 863.17501 -228.8568 863.4044 -228.94276 863.6875 -229 C 864.82091 -229.22919 865.99215 -228.79107 870.03125 -229.5 C 874.07067 -230.20893 875.5315 -230.42709 876.25 -230.6875 C 876.96581 -230.94694 877.95435 -231.25474 878.59375 -231.78125 C 880.51795 -231.54176 882.34165 -231.55672 883.78125 -231.78125 C 886.90767 -232.26887 888.9358 -232.48192 890.9375 -232.75 C 892.93921 -233.01807 893.42625 -233.69514 894.53125 -233.84375 C 895.67767 -233.99793 896.8071 -233.54218 900.875 -234.0625 C 904.94281 -234.58282 906.43525 -234.75823 907.15625 -235 C 907.89337 -235.24714 908.95435 -235.58623 909.59375 -236.125 C 911.64375 -235.78947 913.56745 -235.72704 915.09375 -235.90625 C 918.23595 -236.27521 920.27375 -236.46561 922.28125 -236.6875 C 923.89207 -236.86552 924.5459 -237.2957 925.3125 -237.53125 C 925.55341 -237.61677 925.80655 -237.68685 926.09375 -237.71875 C 927.24345 -237.84647 928.39505 -237.3721 932.46875 -237.84375 C 936.54245 -238.3154 938.0278 -238.45435 938.75 -238.6875 C 939.46941 -238.91977 940.45025 -239.16096 941.09375 -239.65625 C 943.03005 -239.32279 944.8638 -239.25201 946.3125 -239.40625 C 949.45851 -239.7412 951.49 -239.92484 953.5 -240.125 C 955.50991 -240.32514 955.98415 -240.95139 957.09375 -241.0625 C 958.24485 -241.17778 959.39025 -240.69744 963.46875 -241.125 C 967.54725 -241.55256 969.05765 -241.68709 969.78125 -241.90625 C 970.52047 -242.13011 971.57685 -242.4195 972.21875 -242.9375 C 974.27575 -242.53883 976.2206 -242.4441 977.75 -242.59375 C 980.89871 -242.90185 982.9258 -243.067 984.9375 -243.25 C 986.55151 -243.39682 987.20055 -243.81055 987.96875 -244.03125 C 988.21005 -244.11211 988.4623 -244.16116 988.75 -244.1875 C 989.90211 -244.29295 991.0429 -243.79475 995.125 -244.1875 C 999.20711 -244.58025 1000.7139 -244.71834 1001.4375 -244.9375 C 1002.1584 -245.15583 1003.1371 -245.3852 1003.7812 -245.875 C 1005.7193 -245.52501 1007.5501 -245.42062 1009 -245.5625 C 1012.1487 -245.8706 1014.1758 -246.03575 1016.1875 -246.21875 C 1018.1991 -246.40174 1018.7017 -247.05677 1019.8125 -247.15625 C 1020.9648 -247.25948 1022.1047 -246.77142 1026.1875 -247.15625 C 1030.2704 -247.54107 1031.7762 -247.65725 1032.5 -247.875 C 1033.2393 -248.09743 1034.2956 -248.38949 1034.9375 -248.90625 C 1036.9949 -248.50448 1038.9404 -248.40292 1040.4688 -248.5625 C 1043.6153 -248.89102 1045.6458 -249.0852 1047.6562 -249.28125 C 1049.2692 -249.43854 1049.9219 -249.91273 1050.6875 -250.15625 C 1050.9282 -250.24429 1051.1507 -250.27762 1051.4375 -250.3125 C 1052.5858 -250.4522 1053.7542 -249.97259 1057.8125 -250.5625 C 1061.8708 -251.15242 1063.3743 -251.33964 1064.0938 -251.59375 C 1064.8104 -251.84691 1065.7684 -252.15182 1066.4062 -252.6875 C 1068.3259 -252.47556 1070.1262 -252.53609 1071.5625 -252.78125 C 1074.6816 -253.31365 1076.6741 -253.70986 1078.6562 -254.09375 C 1080.6383 -254.47762 1081.1305 -255.1334 1082.2188 -255.375 C 1083.3475 -255.62566 1084.489 -255.25871 1088.4688 -256.25 C 1092.4483 -257.24127 1093.8983 -257.6693 1094.5938 -258.03125 C 1095.316 -258.40725 1096.3555 -258.90183 1096.9688 -259.5625 C 1098.9317 -259.57454 1100.7625 -259.85355 1102.1875 -260.40625 C 1105.1387 -261.55085 1107.0607 -262.27567 1108.875 -263.15625 C 1110.3307 -263.86277 1111.1941 -264.85828 1111.4062 -265.15625 C 1111.6185 -265.4542 1111.5051 -265.8848 1111.5312 -265.90625 C 1111.5742 -265.94148 1111.8716 -266.00028 1112.0312 -266.34375 C 1112.8902 -268.19082 1114.3544 -271.97139 1114.4688 -272.65625 C 1114.5825 -273.33839 1114.6368 -274.00902 1114.6875 -274.40625 C 1114.7169 -274.63575 1114.5404 -275.28515 1114.5625 -275.34375 C 1114.5934 -275.42579 1114.8508 -275.59432 1114.9062 -275.84375 C 1115.1725 -277.04206 1114.9953 -278.05111 1114.7812 -279.46875 C 1114.5673 -280.88638 1113.8096 -284.08338 1113.1562 -284.9375 C 1112.4973 -285.79922 1111.9314 -285.94801 1111.4062 -285.9375 z "
+- style="fill:#bcb786;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- id="path7423"
+- d="M 1111.4062,-285.9375 L 1107.4688,-284.0625 C 1107.4283,-284.05228 1107.3692,-284.04201 1107.3438,-284.03125 C 1106.925,-283.8184 1107.1791,-283.93067 1106.6875,-283.71875 C 1106.2014,-283.50919 1104.9499,-283.13456 1102.5938,-282.25 C 1099.2626,-280.99942 1096.7895,-280.10016 1095.5938,-279.1875 C 1094.0576,-279.16623 1091.8733,-278.95419 1089.9375,-278.46875 C 1086.956,-277.72108 1085.0823,-277.29474 1083.1875,-276.875 C 1081.2927,-276.45527 1081.512,-276.23281 1080.3125,-276 C 1079.0159,-275.74833 1078.5911,-276.00899 1074.875,-275.21875 C 1071.3851,-274.4766 1065.9802,-273.28768 1064.7188,-272.53125 C 1063.1348,-272.71203 1060.8513,-272.85303 1058.875,-272.5625 C 1055.8346,-272.11554 1053.9588,-271.88974 1052.0312,-271.65625 C 1051.3758,-271.57687 1050.9902,-271.45547 1050.6875,-271.375 C 1050.2613,-271.24334 1050.0017,-271.11498 1049.3125,-271.03125 C 1048.0009,-270.87188 1047.5503,-271.18808 1043.7812,-270.75 C 1040.2273,-270.33691 1034.7758,-269.47718 1033.5312,-268.8125 C 1031.9322,-269.10979 1029.6735,-269.34669 1027.6875,-269.15625 C 1024.6287,-268.86293 1022.7155,-268.67226 1020.7812,-268.5 C 1018.847,-268.32773 1019.0926,-268.07763 1017.875,-267.96875 C 1016.5588,-267.85105 1016.1152,-268.13238 1012.3438,-267.71875 C 1008.8017,-267.3303 1003.3359,-266.50948 1002.0625,-265.84375 C 1000.4636,-266.13844 998.1753,-266.35076 996.1875,-266.15625 C 993.12921,-265.857 991.2463,-265.67601 989.3125,-265.5 C 988.65501,-265.44015 988.27245,-265.32144 987.96875,-265.25 C 987.54105,-265.13104 987.28525,-265.03193 986.59375,-264.96875 C 985.27775,-264.84849 984.834,-265.16363 981.0625,-264.75 C 977.50631,-264.35998 972.0569,-263.51084 970.8125,-262.84375 C 969.21381,-263.13793 966.95265,-263.36747 964.96875,-263.15625 C 961.91305,-262.83092 959.9947,-262.63001 958.0625,-262.4375 C 956.13031,-262.24499 956.37275,-261.99662 955.15625,-261.875 C 953.84137,-261.74353 953.3932,-262.03954 949.625,-261.59375 C 946.08611,-261.17509 940.6473,-260.30158 939.375,-259.625 C 937.77741,-259.90604 935.51505,-260.04543 933.53125,-259.8125 C 930.47927,-259.45413 928.58625,-259.24464 926.65625,-259.03125 C 926.00007,-258.95869 925.6156,-258.85856 925.3125,-258.78125 C 924.88571,-258.65402 924.6276,-258.51405 923.9375,-258.4375 C 922.62411,-258.29181 922.17015,-258.61152 918.40625,-258.125 C 914.85737,-257.66624 909.4276,-256.70598 908.1875,-256 C 906.59441,-256.24424 904.3537,-256.38135 902.375,-256.125 C 899.32741,-255.73018 897.4243,-255.47655 895.5,-255.21875 C 893.57571,-254.96096 893.7739,-254.72522 892.5625,-254.5625 C 891.25301,-254.3866 890.8153,-254.66688 887.0625,-254.09375 C 883.53821,-253.55551 878.1393,-252.39458 876.875,-251.65625 C 875.28751,-251.85979 873.0295,-251.91098 871.0625,-251.5625 C 868.03631,-251.02638 866.1636,-250.70081 864.25,-250.375 C 863.59941,-250.26423 863.2363,-250.10406 862.9375,-250 C 862.51681,-249.83512 862.27405,-249.6687 861.59375,-249.53125 C 860.29905,-249.26966 859.86665,-249.53745 856.15625,-248.71875 C 852.65777,-247.9468 847.31035,-246.33582 846.09375,-245.5 C 844.53085,-245.57745 842.33625,-245.41472 840.40625,-244.90625 C 837.43387,-244.12312 835.58855,-243.67416 833.71875,-243.15625 C 831.84875,-242.63835 832.0521,-242.38897 830.875,-242.0625 C 829.60251,-241.7096 829.17795,-241.95541 825.53125,-240.875 C 822.10657,-239.86037 816.88185,-237.94183 815.65625,-237.03125 C 814.11747,-237.01851 811.93645,-236.75903 810.03125,-236.15625 C 807.10027,-235.22891 805.2809,-234.69783 803.4375,-234.09375 C 802.81071,-233.88837 802.44585,-233.70117 802.15625,-233.5625 C 801.74867,-233.34889 801.50295,-233.15375 800.84375,-232.9375 C 799.58925,-232.52596 799.1576,-232.74846 795.5625,-231.5 C 792.17261,-230.32283 786.96755,-228.2863 785.78125,-227.34375 C 784.25737,-227.28408 782.1312,-226.94888 780.25,-226.28125 C 777.35261,-225.25296 775.55095,-224.60577 773.71875,-223.96875 C 771.88655,-223.33174 772.0909,-223.12021 770.9375,-222.71875 C 769.69071,-222.28479 769.27395,-222.51903 765.71875,-221.15625 C 762.38005,-219.87645 757.23165,-217.6737 756.03125,-216.6875 C 754.52407,-216.57981 752.39555,-216.1887 750.53125,-215.46875 C 747.66307,-214.36115 745.90735,-213.68719 744.09375,-213 C 743.47705,-212.76637 743.0973,-212.55797 742.8125,-212.40625 C 742.81251,-212.40625 742.8125,-212.37673 742.8125,-212.375 L 734.8125,-209.1875 L 736.625,-194.46875 C 736.36701,-194.52956 742.8125,-191.15625 742.8125,-191.15625 C 743.03891,-191.30093 743.26145,-191.42886 743.53125,-191.53125 C 744.61177,-191.94123 745.70285,-191.74702 749.53125,-193.21875 C 753.35977,-194.69049 754.7553,-195.22373 755.4375,-195.625 C 756.11711,-196.02478 757.04925,-196.50437 757.65625,-197.15625 C 759.48317,-197.294 761.22705,-197.64948 762.59375,-198.15625 C 765.56175,-199.25677 767.4691,-199.96244 769.375,-200.625 C 771.28081,-201.28754 771.72915,-202.03987 772.78125,-202.40625 C 773.87287,-202.78636 774.97635,-202.57163 778.84375,-203.9375 C 782.71115,-205.30336 784.1269,-205.76458 784.8125,-206.15625 C 785.51361,-206.55677 786.5133,-207.08923 787.125,-207.75 C 789.09581,-207.80466 790.94195,-208.13463 792.40625,-208.625 C 795.40777,-209.63008 797.3324,-210.24671 799.25,-210.875 C 800.78861,-211.3791 801.42415,-211.92177 802.15625,-212.3125 C 802.38647,-212.44681 802.63215,-212.56623 802.90625,-212.65625 C 804.00457,-213.01673 805.0877,-212.73762 809,-213.96875 C 812.91231,-215.19988 814.366,-215.6417 815.0625,-216 C 815.75641,-216.35697 816.6926,-216.79261 817.3125,-217.40625 C 819.17771,-217.42891 820.94835,-217.67308 822.34375,-218.09375 C 825.37415,-219.00729 827.33615,-219.52385 829.28125,-220.0625 C 831.22637,-220.60114 831.70745,-221.32702 832.78125,-221.625 C 833.89527,-221.93415 835.00125,-221.61761 838.96875,-222.65625 C 842.93625,-223.69488 844.38625,-224.08898 845.09375,-224.40625 C 845.82855,-224.73584 846.90765,-225.15997 847.53125,-225.78125 C 849.52907,-225.66525 851.3887,-225.80134 852.875,-226.15625 C 855.95311,-226.89125 857.9584,-227.25719 859.9375,-227.65625 C 861.52541,-227.97643 862.1818,-228.4468 862.9375,-228.75 C 863.17501,-228.8568 863.4044,-228.94276 863.6875,-229 C 864.82091,-229.22919 865.99215,-228.79107 870.03125,-229.5 C 874.07067,-230.20893 875.5315,-230.42709 876.25,-230.6875 C 876.96581,-230.94694 877.95435,-231.25474 878.59375,-231.78125 C 880.51795,-231.54176 882.34165,-231.55672 883.78125,-231.78125 C 886.90767,-232.26887 888.9358,-232.48192 890.9375,-232.75 C 892.93921,-233.01807 893.42625,-233.69514 894.53125,-233.84375 C 895.67767,-233.99793 896.8071,-233.54218 900.875,-234.0625 C 904.94281,-234.58282 906.43525,-234.75823 907.15625,-235 C 907.89337,-235.24714 908.95435,-235.58623 909.59375,-236.125 C 911.64375,-235.78947 913.56745,-235.72704 915.09375,-235.90625 C 918.23595,-236.27521 920.27375,-236.46561 922.28125,-236.6875 C 923.89207,-236.86552 924.5459,-237.2957 925.3125,-237.53125 C 925.55341,-237.61677 925.80655,-237.68685 926.09375,-237.71875 C 927.24345,-237.84647 928.39505,-237.3721 932.46875,-237.84375 C 936.54245,-238.3154 938.0278,-238.45435 938.75,-238.6875 C 939.46941,-238.91977 940.45025,-239.16096 941.09375,-239.65625 C 943.03005,-239.32279 944.8638,-239.25201 946.3125,-239.40625 C 949.45851,-239.7412 951.49,-239.92484 953.5,-240.125 C 955.50991,-240.32514 955.98415,-240.95139 957.09375,-241.0625 C 958.24485,-241.17778 959.39025,-240.69744 963.46875,-241.125 C 967.54725,-241.55256 969.05765,-241.68709 969.78125,-241.90625 C 970.52047,-242.13011 971.57685,-242.4195 972.21875,-242.9375 C 974.27575,-242.53883 976.2206,-242.4441 977.75,-242.59375 C 980.89871,-242.90185 982.9258,-243.067 984.9375,-243.25 C 986.55151,-243.39682 987.20055,-243.81055 987.96875,-244.03125 C 988.21005,-244.11211 988.4623,-244.16116 988.75,-244.1875 C 989.90211,-244.29295 991.0429,-243.79475 995.125,-244.1875 C 999.20711,-244.58025 1000.7139,-244.71834 1001.4375,-244.9375 C 1002.1584,-245.15583 1003.1371,-245.3852 1003.7812,-245.875 C 1005.7193,-245.52501 1007.5501,-245.42062 1009,-245.5625 C 1012.1487,-245.8706 1014.1758,-246.03575 1016.1875,-246.21875 C 1018.1991,-246.40174 1018.7017,-247.05677 1019.8125,-247.15625 C 1020.9648,-247.25948 1022.1047,-246.77142 1026.1875,-247.15625 C 1030.2704,-247.54107 1031.7762,-247.65725 1032.5,-247.875 C 1033.2393,-248.09743 1034.2956,-248.38949 1034.9375,-248.90625 C 1036.9949,-248.50448 1038.9404,-248.40292 1040.4688,-248.5625 C 1043.6153,-248.89102 1045.6458,-249.0852 1047.6562,-249.28125 C 1049.2692,-249.43854 1049.9219,-249.91273 1050.6875,-250.15625 C 1050.9282,-250.24429 1051.1507,-250.27762 1051.4375,-250.3125 C 1052.5858,-250.4522 1053.7542,-249.97259 1057.8125,-250.5625 C 1061.8708,-251.15242 1063.3743,-251.33964 1064.0938,-251.59375 C 1064.8104,-251.84691 1065.7684,-252.15182 1066.4062,-252.6875 C 1068.3259,-252.47556 1070.1262,-252.53609 1071.5625,-252.78125 C 1074.6816,-253.31365 1076.6741,-253.70986 1078.6562,-254.09375 C 1080.6383,-254.47762 1081.1305,-255.1334 1082.2188,-255.375 C 1083.3475,-255.62566 1084.489,-255.25871 1088.4688,-256.25 C 1092.4483,-257.24127 1093.8983,-257.6693 1094.5938,-258.03125 C 1095.316,-258.40725 1096.3555,-258.90183 1096.9688,-259.5625 C 1098.9317,-259.57454 1100.7625,-259.85355 1102.1875,-260.40625 C 1105.1387,-261.55085 1107.0607,-262.27567 1108.875,-263.15625 C 1110.3307,-263.86277 1111.1941,-264.85828 1111.4062,-265.15625 C 1111.6185,-265.4542 1111.5051,-265.8848 1111.5312,-265.90625 C 1111.5742,-265.94148 1111.8716,-266.00028 1112.0312,-266.34375 C 1112.8902,-268.19082 1114.3544,-271.97139 1114.4688,-272.65625 C 1114.5825,-273.33839 1114.6368,-274.00902 1114.6875,-274.40625 C 1114.7169,-274.63575 1114.5404,-275.28515 1114.5625,-275.34375 C 1114.5934,-275.42579 1114.8508,-275.59432 1114.9062,-275.84375 C 1115.1725,-277.04206 1114.9953,-278.05111 1114.7812,-279.46875 C 1114.5673,-280.88638 1113.8096,-284.08338 1113.1562,-284.9375 C 1112.4973,-285.79922 1111.9314,-285.94801 1111.4062,-285.9375 z"
+- transform="translate(8.0045714e-2,-3.125e-2)" />
+- </clipPath>
+- <filter
+- inkscape:collect="always"
+- id="filter7578"
+- x="-0.08160872"
+- width="1.1632174"
+- y="-0.22659944"
+- height="1.4531989">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="2.437399"
+- id="feGaussianBlur7580" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter7594"
+- x="-0.040804356"
+- width="1.0816087"
+- y="-0.11329972"
+- height="1.2265995">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="1.2186995"
+- id="feGaussianBlur7596" />
+- </filter>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath7606">
+- <path
+- id="path7608"
+- d="M 1049.205,-282.26672 L 1049.1152,-282.25891 C 1047.7278,-281.37446 1042.5119,-280.65171 1042.4862,-272.73547 C 1042.462,-265.31022 1057.4991,-255.64401 1059.6425,-254.64172 C 1061.3727,-253.83263 1063.2341,-253.23296 1065.0488,-252.92297 L 1066.4862,-252.70422 C 1068.4059,-252.49228 1070.2062,-252.55281 1071.6425,-252.79797 C 1074.7616,-253.33037 1076.7541,-253.72658 1078.7362,-254.11047 C 1080.7183,-254.49434 1081.2105,-255.15012 1082.2988,-255.39172 C 1083.4275,-255.64238 1084.569,-255.27543 1088.5488,-256.26672 C 1092.5283,-257.258 1093.9782,-257.68602 1094.6738,-258.04797 C 1095.396,-258.42398 1096.4355,-258.91855 1097.0488,-259.57922 C 1099.0117,-259.59127 1100.8425,-259.87027 1102.2675,-260.42297 C 1105.2187,-261.56758 1107.1407,-262.29239 1108.955,-263.17297 C 1110.4107,-263.8795 1111.2741,-264.875 1111.4862,-265.17297 C 1111.6985,-265.47093 1111.5852,-265.90152 1111.6112,-265.92297 C 1111.6542,-265.95821 1111.9517,-266.017 1112.1112,-266.36047 C 1112.9702,-268.20755 1114.4344,-271.98811 1114.5488,-272.67297 C 1114.6625,-273.35512 1114.7168,-274.02574 1114.7675,-274.42297 C 1114.7969,-274.65248 1114.6204,-275.30187 1114.6425,-275.36047 C 1114.6734,-275.44252 1114.9308,-275.61104 1114.9862,-275.86047 C 1115.2525,-277.05879 1115.0754,-278.06783 1114.8612,-279.48547 C 1114.6473,-280.90311 1113.8896,-284.1001 1113.2362,-284.95422 C 1112.8168,-285.50279 1112.4369,-285.74672 1112.08,-285.86047 C 1112.0129,-285.87776 1111.9561,-285.90721 1111.8925,-285.92297 C 1111.8715,-285.92695 1111.8508,-285.91983 1111.83,-285.92297 C 1111.5184,-285.99847 1111.2215,-286.08164 1110.6738,-286.14172 C 1109.6883,-286.24984 1108.2491,-286.40112 1106.705,-286.39172 C 1106.1903,-286.38859 1105.6679,-286.34408 1105.1425,-286.29797 C 1101.5836,-285.98569 1096.1327,-285.30689 1094.9238,-284.67297 C 1093.2907,-285.00699 1090.9756,-285.2852 1088.9862,-285.14172 C 1085.9222,-284.92075 1084.0185,-284.79953 1082.08,-284.67297 C 1080.1416,-284.54642 1080.3939,-284.28433 1079.1738,-284.20422 C 1077.8547,-284.11762 1077.3869,-284.42747 1073.6112,-284.11047 C 1070.0655,-283.81275 1064.6306,-283.1173 1063.3925,-282.48547 C 1061.7591,-282.81998 1059.4466,-283.09786 1057.455,-282.95422 C 1054.3908,-282.73324 1052.4872,-282.58078 1050.5488,-282.45422 C 1049.8896,-282.41119 1049.5064,-282.33029 1049.205,-282.26672 z"
+- style="opacity:0.82448976;fill:#bcb786;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- </clipPath>
+- <filter
+- inkscape:collect="always"
+- id="filter7610"
+- x="-0.021942979"
+- width="1.0438859"
+- y="-0.10017137"
+- height="1.2003427">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="0.57530213"
+- id="feGaussianBlur7612" />
+- </filter>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath7616">
+- <path
+- id="path7618"
+- d="M 205.47016,-408.97318 L 205.38003,-408.97164 C 203.9344,-408.18598 198.68082,-407.82829 198.10378,-399.93307 C 197.56244,-392.52754 211.88973,-381.83741 213.95811,-380.68826 C 215.62775,-379.76062 217.44286,-379.03275 219.23156,-378.59711 L 220.65023,-378.27877 C 222.5505,-377.93363 224.35065,-377.86862 225.80054,-378.01314 C 228.94914,-378.32698 230.9644,-378.58345 232.96843,-378.82834 C 234.97245,-379.07322 235.50913,-379.69312 236.61162,-379.85833 C 237.75504,-380.02976 238.86821,-379.58419 242.90739,-380.29586 C 246.94627,-381.00755 248.42246,-381.33354 249.14158,-381.64616 C 249.88822,-381.97095 250.95964,-382.39191 251.61747,-383.00826 C 253.57644,-382.88355 255.42223,-383.03435 256.88227,-383.48645 C 259.90603,-384.42272 261.87384,-385.01189 263.74507,-385.76396 C 265.24645,-386.36738 266.17709,-387.30032 266.40943,-387.58279 C 266.64197,-387.86524 266.55894,-388.30268 266.58637,-388.32227 C 266.63172,-388.35443 266.93259,-388.39235 267.11563,-388.72388 C 268.1012,-390.50664 269.82518,-394.17603 269.987,-394.85126 C 270.14794,-395.52383 270.24882,-396.18904 270.32707,-396.58177 C 270.37238,-396.80868 270.24154,-397.46878 270.26767,-397.5257 C 270.30421,-397.6054 270.57272,-397.75558 270.64536,-398.00055 C 270.99449,-399.17741 270.8881,-400.19633 270.77316,-401.62545 C 270.65853,-403.05454 270.12535,-406.29655 269.53303,-407.1941 C 269.15286,-407.77056 268.79088,-408.04035 268.44277,-408.17869 C 268.37703,-408.20061 268.32242,-408.23394 268.26007,-408.2541 C 268.2394,-408.25953 268.21826,-408.25387 268.19773,-408.25845 C 267.89214,-408.35547 267.60176,-408.45912 267.05957,-408.5572 C 266.084,-408.7337 264.65883,-408.98486 263.11782,-409.08304 C 262.60416,-409.11577 262.07992,-409.10775 261.55259,-409.09835 C 257.98058,-409.03472 252.49564,-408.73725 251.24552,-408.18907 C 249.63965,-408.63604 247.34955,-409.07483 245.35499,-409.07027 C 242.28304,-409.06325 240.37552,-409.07493 238.43292,-409.0837 C 236.49041,-409.09248 236.72384,-408.81345 235.50112,-408.81852 C 234.1792,-408.82401 233.73411,-409.16569 229.9455,-409.11245 C 226.38768,-409.06243 220.91754,-408.74723 219.63844,-408.20318 C 218.0323,-408.65065 215.74477,-409.08893 213.74801,-409.08436 C 210.67586,-409.07735 208.76626,-409.05786 206.82375,-409.06662 C 206.16316,-409.06961 205.77525,-409.0156 205.47016,-408.97318 z"
+- style="opacity:0.82448976;fill:#bcb786;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- </clipPath>
+- <linearGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient7622"
+- id="linearGradient7708"
+- gradientUnits="userSpaceOnUse"
+- gradientTransform="translate(-19.091883,4.2426407)"
+- x1="774.97668"
+- y1="-211.87105"
+- x2="755.11584"
+- y2="-202.67865" />
+- <mask
+- maskUnits="userSpaceOnUse"
+- id="mask7704">
+- <path
+- style="fill:url(#linearGradient7708);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+- d="M 718.40812,-224.31217 L 751.65812,-168.31217 L 1027.6581,-192.31217 L 1187.1581,-240.56217 L 1120.6581,-323.31217 L 718.40812,-224.31217 z"
+- id="path7706" />
+- </mask>
+- <radialGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient8430"
+- id="radialGradient7904"
+- gradientUnits="userSpaceOnUse"
+- gradientTransform="matrix(-0.3324832,0.9022288,-0.9582407,-0.3531242,305.29227,19.909497)"
+- cx="142.95833"
+- cy="107.09234"
+- fx="142.95833"
+- fy="107.09234"
+- r="66.981766" />
+- <radialGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient3317"
+- id="radialGradient7906"
+- gradientUnits="userSpaceOnUse"
+- gradientTransform="matrix(1.0036478,-1.0345492e-7,1.7124628e-7,1.6613125,-160.53487,-96.205369)"
+- cx="317.78754"
+- cy="129.65378"
+- fx="317.78754"
+- fy="129.65378"
+- r="47.863216" />
+- <radialGradient
+- inkscape:collect="always"
+- xlink:href="#linearGradient8398"
+- id="radialGradient7908"
+- gradientUnits="userSpaceOnUse"
+- gradientTransform="matrix(2.0747661,-0.1577957,0.2382425,3.1325183,-550.77432,-65.728909)"
+- cx="325.30847"
+- cy="80.909554"
+- fx="325.30847"
+- fy="80.909554"
+- r="26.937988" />
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath8209">
+- <path
+- sodipodi:nodetypes="czcc"
+- id="path8211"
+- d="M 734.03125,519.49186 C 734.03125,519.49186 750.78638,556.50992 762.73266,573.44581 C 774.67895,590.3817 815.45982,629.49186 815.45982,629.49186 L 816.05699,490.90211"
+- style="opacity:1;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+- </clipPath>
+- <filter
+- inkscape:collect="always"
+- id="filter8225">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="10.661912"
+- id="feGaussianBlur8227" />
+- </filter>
+- <filter
+- inkscape:collect="always"
+- id="filter8333">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="7.18"
+- id="feGaussianBlur8335" />
+- </filter>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath8338">
+- <path
+- sodipodi:nodetypes="czzzzzzcccccccccczczz"
+- id="path8340"
+- d="M 266.27183,924.57185 C 264.86456,943.37307 265.12693,957.32289 268.35357,973.87513 C 271.58023,990.42751 284.75966,1019.7825 288.68798,1037.0589 C 292.61419,1054.326 291.38211,1075.3686 276.22854,1088.2071 C 260.91093,1101.1846 234.17727,1109.8061 208.39624,1103.9409 C 182.61518,1098.0756 138.84716,1054.7175 119.80605,1033.7126 C 100.6939,1012.6293 56.045182,939.86193 41.867507,909.4368 C 27.689835,879.01168 29.207902,872.71823 33.747792,863.90708 C 24.38107,839.38658 21.33408,813.84026 0.035334479,788.33044 C 30.360814,791.44487 43.915624,815.28676 60.161024,835.47019 C 54.631128,787.39416 42.106309,771.05368 31.787072,744.74589 C 61.781367,750.82754 82.366432,776.61828 95.766855,817.45839 C 105.32101,813.54047 114.00462,808.08545 125.95427,808.39719 C 114.65677,766.70139 108.0048,738.48134 89.267014,707.32725 C 142.70898,712.99757 172.92404,787.96657 168.23844,795.28805 C 178.21641,793.04406 187.24409,788.75767 198.67497,789.63638 C 187.426,751.28935 177.62715,712.76848 195.01526,670.98819 C 195.01526,670.98819 243.30204,736.42507 249.40491,756.79397 C 255.50779,777.16287 250.92373,795.49448 250.92373,795.49448 C 250.92373,795.49448 267.8833,826.57978 271.21765,846.58862 C 274.59075,866.82996 267.68496,905.69193 266.27183,924.57185 z"
+- style="opacity:1;fill:#ada469;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- </clipPath>
+- <filter
+- inkscape:collect="always"
+- id="filter8354">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="6.82"
+- id="feGaussianBlur8356" />
+- </filter>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath8359">
+- <path
+- sodipodi:nodetypes="czzzzzzcccccccccczczz"
+- id="path8361"
+- d="M 266.27183,924.57185 C 264.86456,943.37307 265.12693,957.32289 268.35357,973.87513 C 271.58023,990.42751 284.75966,1019.7825 288.68798,1037.0589 C 292.61419,1054.326 291.38211,1075.3686 276.22854,1088.2071 C 260.91093,1101.1846 234.17727,1109.8061 208.39624,1103.9409 C 182.61518,1098.0756 138.84716,1054.7175 119.80605,1033.7126 C 100.6939,1012.6293 56.045182,939.86193 41.867507,909.4368 C 27.689835,879.01168 29.207902,872.71823 33.747792,863.90708 C 24.38107,839.38658 21.33408,813.84026 0.035334479,788.33044 C 30.360814,791.44487 43.915624,815.28676 60.161024,835.47019 C 54.631128,787.39416 42.106309,771.05368 31.787072,744.74589 C 61.781367,750.82754 82.366432,776.61828 95.766855,817.45839 C 105.32101,813.54047 114.00462,808.08545 125.95427,808.39719 C 114.65677,766.70139 108.0048,738.48134 89.267014,707.32725 C 142.70898,712.99757 172.92404,787.96657 168.23844,795.28805 C 178.21641,793.04406 187.24409,788.75767 198.67497,789.63638 C 187.426,751.28935 177.62715,712.76848 195.01526,670.98819 C 195.01526,670.98819 243.30204,736.42507 249.40491,756.79397 C 255.50779,777.16287 250.92373,795.49448 250.92373,795.49448 C 250.92373,795.49448 267.8833,826.57978 271.21765,846.58862 C 274.59075,866.82996 267.68496,905.69193 266.27183,924.57185 z"
+- style="opacity:1;fill:#ada469;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- </clipPath>
+- <filter
+- inkscape:collect="always"
+- id="filter8379"
+- x="-0.14413793"
+- width="1.288276"
+- y="-0.10278689"
+- height="1.2055738">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="7.389266"
+- id="feGaussianBlur8381" />
+- </filter>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath8392">
+- <path
+- sodipodi:nodetypes="czzzzzzcccccccccczczz"
+- id="path8394"
+- d="M 760.16396,935.83377 C 766.95806,954.73656 770.65765,969.13346 772.05426,987.04566 C 773.45088,1004.958 768.27158,1038.8465 769.1538,1057.7018 C 770.03555,1076.547 777.28749,1097.8008 796.49843,1106.6707 C 815.9173,1115.6365 845.81767,1116.882 870.61827,1103.5251 C 895.41887,1090.1681 928.01929,1033.1996 941.59253,1006.2164 C 955.21638,979.13246 980.3536,891.71903 986.25333,856.44781 C 992.15306,821.1766 988.80387,815.14704 981.63585,807.39232 C 984.27615,779.55217 980.13613,752.45689 994.74554,720.20614 C 964.49653,732.03184 957.36325,760.36684 946.42665,785.71122 C 938.42574,734.77829 946.63581,714.43803 949.74554,684.49186 C 920.68078,699.26977 906.88403,731.60588 904.74554,777.349 C 893.82159,776.0448 883.3541,772.91477 871.17411,776.63471 C 870.91007,730.61137 869.71055,699.7453 880.08474,662.42822 C 826.82927,683.45508 817.13746,769.02232 824.03125,775.20614 C 813.14843,775.74114 802.66017,773.90884 791.17411,778.06329 C 791.81303,735.49194 790.91365,693.15468 761.17411,655.20614 C 761.17411,655.20614 730.21605,736.12848 729.74554,758.77757 C 729.27503,781.42666 739.19713,798.94345 739.19713,798.94345 C 739.19713,798.94345 730.62906,835.68396 732.89854,857.17568 C 735.19439,878.91714 753.34144,916.85185 760.16396,935.83377 z"
+- style="opacity:1;fill:#ada469;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- </clipPath>
+- <filter
+- inkscape:collect="always"
+- id="filter8404"
+- x="-0.090268657"
+- width="1.1805373"
+- y="-0.10250848"
+- height="1.205017">
+- <feGaussianBlur
+- inkscape:collect="always"
+- stdDeviation="5.3457272"
+- id="feGaussianBlur8406" />
+- </filter>
+- <clipPath
+- clipPathUnits="userSpaceOnUse"
+- id="clipPath8417">
+- <path
+- sodipodi:nodetypes="czzzzzzcccccccccczczz"
+- id="path8419"
+- d="M 760.16396,935.83377 C 766.95806,954.73656 770.65765,969.13346 772.05426,987.04566 C 773.45088,1004.958 768.27158,1038.8465 769.1538,1057.7018 C 770.03555,1076.547 777.28749,1097.8008 796.49843,1106.6707 C 815.9173,1115.6365 845.81767,1116.882 870.61827,1103.5251 C 895.41887,1090.1681 928.01929,1033.1996 941.59253,1006.2164 C 955.21638,979.13246 980.3536,891.71903 986.25333,856.44781 C 992.15306,821.1766 988.80387,815.14704 981.63585,807.39232 C 984.27615,779.55217 980.13613,752.45689 994.74554,720.20614 C 964.49653,732.03184 957.36325,760.36684 946.42665,785.71122 C 938.42574,734.77829 946.63581,714.43803 949.74554,684.49186 C 920.68078,699.26977 906.88403,731.60588 904.74554,777.349 C 893.82159,776.0448 883.3541,772.91477 871.17411,776.63471 C 870.91007,730.61137 869.71055,699.7453 880.08474,662.42822 C 826.82927,683.45508 817.13746,769.02232 824.03125,775.20614 C 813.14843,775.74114 802.66017,773.90884 791.17411,778.06329 C 791.81303,735.49194 790.91365,693.15468 761.17411,655.20614 C 761.17411,655.20614 730.21605,736.12848 729.74554,758.77757 C 729.27503,781.42666 739.19713,798.94345 739.19713,798.94345 C 739.19713,798.94345 730.62906,835.68396 732.89854,857.17568 C 735.19439,878.91714 753.34144,916.85185 760.16396,935.83377 z"
+- style="opacity:1;fill:#ada469;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- </clipPath>
+- </defs>
+- <metadata
+- id="metadata7">
+- <rdf:RDF>
+- <cc:Work
+- rdf:about="">
+- <dc:format>image/svg+xml</dc:format>
+- <dc:type
+- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+- </cc:Work>
+- </rdf:RDF>
+- </metadata>
+- <g
+- inkscape:groupmode="layer"
+- id="layer1"
+- inkscape:label="Shadow">
+- <path
+- style="opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter11361);enable-background:new"
+- d="M 304.64285,526.6479 C 294.64285,527.00505 286.42857,529.50504 286.42857,529.50504 L 293.92857,535.57647 L 304.28571,539.1479 L 320.35714,539.50504 L 342.85714,534.1479 L 350.71428,535.21933 L 371.07143,533.07647 L 360.71428,539.86219 C 366.17351,538.83858 378.10757,543.4313 370.35714,545.21933 C 368.61714,545.62075 384.28571,540.57648 384.28571,540.57648 L 386.78571,535.93361 L 390.35714,526.6479 L 401.78571,526.6479 L 419.99999,522.00504 L 423.57143,517.00505 L 407.49999,518.07647 L 395.35714,520.21933 L 380.71428,515.21933 L 310.02218,531.92707 L 304.64285,526.6479 z"
+- id="path10326"
+- sodipodi:nodetypes="cccccccccsccccccccccc"
+- transform="matrix(10.726753,0,0,10.726753,-2882.1235,-4565.4583)"
+- inkscape:export-filename="/home/cheeseness/Documents/LCA09/mascot/tuz_new.png"
+- inkscape:export-xdpi="142.10527"
+- inkscape:export-ydpi="142.10527" />
+- </g>
+- <g
+- inkscape:groupmode="layer"
+- id="layer20"
+- inkscape:label="New Ear">
+- <g
+- style="opacity:1;display:inline;enable-background:new"
+- id="g7882"
+- transform="matrix(0.71084,-0.1937433,0.262963,0.9648058,503.68027,136.48399)">
+- <path
+- sodipodi:nodetypes="czzzzcc"
+- id="path7876"
+- d="M 245.12255,100.05344 C 245.12255,100.05344 197.99444,68.406519 177.9079,64.252501 C 157.86998,60.108538 139.435,60.934923 125.97426,77.859824 C 112.51352,94.784725 113.89687,139.12502 112.43872,164.82937 C 110.98057,190.53372 114.98817,235.00638 130.04332,253.49489 C 145.09848,271.98339 175.92966,267.07991 179.97027,274.90859 C 182.1831,279.19595 245.12255,100.05344 245.12255,100.05344 z"
+- style="opacity:1;fill:url(#radialGradient7904);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+- <path
+- sodipodi:nodetypes="czzzzzc"
+- id="path7878"
+- d="M 135.37935,82.017807 C 135.37935,82.017807 161.7229,83.95659 173.01242,95.920995 C 184.42736,108.01833 186.74699,117.25251 188.30828,133.65558 C 189.87165,150.08057 187.45871,162.0737 180.49446,169.69292 C 173.53021,177.31214 179.49017,189.27624 154.57841,181.76399 C 129.66665,174.25174 127.54617,153.98101 128.06318,135.45924 C 128.58039,116.93026 135.37935,82.017807 135.37935,82.017807 z"
+- style="opacity:1;fill:url(#radialGradient7906);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+- <path
+- sodipodi:nodetypes="czccssc"
+- id="path7880"
+- d="M 135.648,81.927211 C 135.648,81.927211 131.00335,98.292286 136.23625,110.49031 C 141.72419,123.28285 163.4605,154.75038 163.4605,165.14596 L 186.11675,160.14596 C 188.65893,153.17952 189.32727,144.3939 188.30425,133.64596 C 186.74296,117.24289 184.43795,108.02455 173.023,95.927211 C 163.36812,85.695164 141.42989,82.552354 135.648,81.927211 z"
+- style="opacity:1;fill:url(#radialGradient7908);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- </g>
+- </g>
+- <g
+- inkscape:groupmode="layer"
+- id="layer21"
+- inkscape:label="Rendered2"
+- style="display:inline">
+- <path
+- style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 845.03125,1154.7776 C 840.74554,1155.4919 817.4031,1158.3957 787.17411,1164.7776 C 756.94512,1171.1595 729.86016,1169.7437 651.38803,1182.1072 C 571.53625,1194.688 557.32367,1224.6495 543.26578,1229.1715 C 528.56564,1233.9001 397.88839,1163.349 397.88839,1163.349 L 402.17411,1069.0633 C 402.17411,1069.0633 488.05962,1052.8624 514.31696,1035.4919 C 540.57431,1018.1214 559.89934,985.82588 573.60268,964.06329 C 587.30602,942.3007 606.45982,892.63471 606.45982,892.63471 L 845.03125,1154.7776 z"
+- id="path7917"
+- sodipodi:nodetypes="czzzcczzcc" />
+- <path
+- style="opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8888);enable-background:accumulate"
+- d="M 332.34019,898.38549 L 299.60838,837.08593 L 261.99104,882.19239 C 264.16779,883.5095 267.76529,861.33636 307.59144,817.77531 L 332.34019,898.38549 z"
+- id="path7919"
+- clip-path="url(#clipPath8658)"
+- sodipodi:nodetypes="ccccc"
+- transform="translate(276,136)" />
+- <path
+- style="opacity:1;fill:url(#linearGradient2841);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8892);enable-background:accumulate"
+- d="M 200.81833,863.03015 L 347.18943,811.41136 L 591.14127,1037.6855 L 349.31075,1177.6927 L 168.29141,1090.0114 L 200.81833,863.03015 z"
+- id="path7923"
+- clip-path="url(#clipPath2833)"
+- sodipodi:nodetypes="cccccc"
+- transform="translate(276,136)" />
+- <path
+- style="opacity:1;fill:#0f0f0f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 642.88839,640.13471 C 642.88839,640.13471 613.33433,680.70776 595.03125,714.42042 C 576.72816,748.13309 536.41016,840.77736 524.67411,885.49185 C 512.91471,930.29529 462.17411,1009.0633 462.17411,1009.0633 L 538.24554,1027.2776 C 538.24554,1027.2776 550.05266,1014.4542 569.31696,981.20614 C 588.58126,947.95806 629.67411,842.63471 629.67411,842.63471 L 642.88839,640.13471 z"
+- id="path7921"
+- sodipodi:nodetypes="czzcczcc" />
+- <path
+- style="opacity:0.4;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8856);enable-background:accumulate"
+- d="M 430.28131,381.94122 C 423.21025,384.76965 194.10007,414.09303 194.10007,414.09303 L 154.46046,773.92607 L 244.65895,866.56568 L 296.98485,752.01438 L 397.45289,565.62246 L 430.28131,381.94122 z"
+- id="path7925"
+- sodipodi:nodetypes="ccccccc"
+- clip-path="url(#clipPath3665)"
+- transform="translate(276,136)" />
+- <path
+- style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 969.67051,1164.0346 C 969.67051,1164.0346 992.92679,1175.4283 1005.7383,1184.5107 C 1018.4357,1193.5122 1035.2107,1209.1598 1047.4307,1221.8712 C 1059.7362,1234.6714 1067.5434,1244.4699 1088.9634,1246.032 C 1110.3956,1247.5949 1142.2458,1237.2444 1162.2594,1221.3678 C 1182.2729,1205.4912 1207.9063,1152.135 1207.9063,1152.135 L 1080.7455,1009.0633"
+- id="path7927"
+- sodipodi:nodetypes="czzzzcc" />
+- <path
+- style="opacity:0.75;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8860);enable-background:accumulate"
+- d="M 331.34019,641.50471 L 216.17367,835.36467 L 260.2153,925.96265 L 357.79603,732.21539 L 331.34019,641.50471 z"
+- id="path7929"
+- clip-path="url(#clipPath8642)"
+- sodipodi:nodetypes="ccccc"
+- transform="translate(276,136)" />
+- <g
+- style="opacity:1;display:inline;enable-background:new"
+- id="g7931"
+- transform="matrix(0.9934486,0.1142802,-0.1142802,0.9934486,-9.24324,588.09054)"
+- inkscape:transform-center-x="-347.89063"
+- inkscape:transform-center-y="-28.255779">
+- <path
+- style="opacity:1;fill:#bcb786;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- d="M 1049.205,-282.26672 L 1049.1152,-282.25891 C 1047.7278,-281.37446 1042.5119,-280.65171 1042.4862,-272.73547 C 1042.462,-265.31022 1057.4991,-255.64401 1059.6425,-254.64172 C 1061.3727,-253.83263 1063.2341,-253.23296 1065.0488,-252.92297 L 1066.4862,-252.70422 C 1068.4059,-252.49228 1070.2062,-252.55281 1071.6425,-252.79797 C 1074.7616,-253.33037 1076.7541,-253.72658 1078.7362,-254.11047 C 1080.7183,-254.49434 1081.2105,-255.15012 1082.2988,-255.39172 C 1083.4275,-255.64238 1084.569,-255.27543 1088.5488,-256.26672 C 1092.5283,-257.258 1093.9782,-257.68602 1094.6738,-258.04797 C 1095.396,-258.42398 1096.4355,-258.91855 1097.0488,-259.57922 C 1099.0117,-259.59127 1100.8425,-259.87027 1102.2675,-260.42297 C 1105.2187,-261.56758 1107.1407,-262.29239 1108.955,-263.17297 C 1110.4107,-263.8795 1111.2741,-264.875 1111.4862,-265.17297 C 1111.6985,-265.47093 1111.5852,-265.90152 1111.6112,-265.92297 C 1111.6542,-265.95821 1111.9517,-266.017 1112.1112,-266.36047 C 1112.9702,-268.20755 1114.4344,-271.98811 1114.5488,-272.67297 C 1114.6625,-273.35512 1114.7168,-274.02574 1114.7675,-274.42297 C 1114.7969,-274.65248 1114.6204,-275.30187 1114.6425,-275.36047 C 1114.6734,-275.44252 1114.9308,-275.61104 1114.9862,-275.86047 C 1115.2525,-277.05879 1115.0754,-278.06783 1114.8612,-279.48547 C 1114.6473,-280.90311 1113.8896,-284.1001 1113.2362,-284.95422 C 1112.8168,-285.50279 1112.4369,-285.74672 1112.08,-285.86047 C 1112.0129,-285.87776 1111.9561,-285.90721 1111.8925,-285.92297 C 1111.8715,-285.92695 1111.8508,-285.91983 1111.83,-285.92297 C 1111.5184,-285.99847 1111.2215,-286.08164 1110.6738,-286.14172 C 1109.6883,-286.24984 1108.2491,-286.40112 1106.705,-286.39172 C 1106.1903,-286.38859 1105.6679,-286.34408 1105.1425,-286.29797 C 1101.5836,-285.98569 1096.1327,-285.30689 1094.9238,-284.67297 C 1093.2907,-285.00699 1090.9756,-285.2852 1088.9862,-285.14172 C 1085.9222,-284.92075 1084.0185,-284.79953 1082.08,-284.67297 C 1080.1416,-284.54642 1080.3939,-284.28433 1079.1738,-284.20422 C 1077.8547,-284.11762 1077.3869,-284.42747 1073.6112,-284.11047 C 1070.0655,-283.81275 1064.6306,-283.1173 1063.3925,-282.48547 C 1061.7591,-282.81998 1059.4466,-283.09786 1057.455,-282.95422 C 1054.3908,-282.73324 1052.4872,-282.58078 1050.5488,-282.45422 C 1049.8896,-282.41119 1049.5064,-282.33029 1049.205,-282.26672 z"
+- id="path7933" />
+- <g
+- clip-path="url(#clipPath7616)"
+- style="display:inline;filter:url(#filter7610);enable-background:new"
+- id="g7935"
+- transform="matrix(0.9975712,-6.9654277e-2,6.9654277e-2,0.9975712,872.72062,140.02502)">
+- <path
+- sodipodi:nodetypes="ccssscsssscscsscsssccscssccsscssscc"
+- id="path7937"
+- d="M 229.94262,-409.12268 C 226.38481,-409.07267 220.91842,-408.76259 219.63928,-408.21854 C 218.03319,-408.66601 215.73612,-409.09985 213.73933,-409.09528 C 210.66734,-409.08826 208.77464,-409.08651 206.83206,-409.09528 C 206.17159,-409.09827 205.78447,-409.02811 205.47939,-408.98569 C 205.47939,-408.98569 205.47939,-407.88976 205.47939,-407.88976 C 205.59911,-408.06923 205.87191,-408.58022 206.42914,-408.65691 C 207.17672,-408.7598 211.59842,-408.80814 213.73933,-408.76651 C 215.51393,-408.73198 218.19456,-408.49224 220.12854,-407.80756 C 220.44994,-407.69378 220.74779,-407.53378 221.02073,-407.39659 C 222.98415,-406.40966 228.96409,-403.09505 228.96409,-403.09505 C 228.96409,-403.09505 222.33134,-407.04273 221.48122,-407.53358 C 221.27791,-407.65097 220.90658,-407.79127 220.44513,-407.94456 C 221.66576,-408.39235 225.5211,-408.56427 228.27336,-408.65691 C 231.29786,-408.75873 231.62112,-408.7465 233.68405,-408.46512 C 235.81336,-408.17469 237.02256,-407.86236 237.02256,-407.86236 C 237.02255,-407.86236 236.9442,-408.50354 238.05865,-408.65691 C 238.80622,-408.7598 243.22794,-408.80814 245.36884,-408.76651 C 247.43834,-408.72625 250.73489,-408.35935 252.65024,-407.39659 C 253.65356,-406.89226 255.68588,-405.82796 257.44559,-404.86088 L 257.5412,-404.88031 C 257.5412,-404.88031 253.96086,-407.04273 253.11073,-407.53358 C 252.90742,-407.65097 252.5361,-407.79127 252.07464,-407.94456 C 253.29526,-408.39235 257.12183,-408.56427 259.87409,-408.65691 C 262.89859,-408.75873 263.22184,-408.7465 265.28478,-408.46512 C 267.23794,-408.19872 268.2977,-407.93506 268.47939,-407.88976 C 268.47939,-407.88976 268.4523,-408.20122 268.4523,-408.20122 C 268.04327,-408.33767 267.73806,-408.43457 267.05192,-408.5587 C 265.75111,-408.79403 263.6528,-409.16026 261.54335,-409.12268 C 257.9714,-409.05904 252.49007,-408.76672 251.24001,-408.21854 C 249.63418,-408.66549 247.36339,-409.09984 245.36884,-409.09528 C 242.29685,-409.08826 240.37536,-409.08651 238.43279,-409.09528 C 236.49023,-409.10406 236.72011,-408.81621 235.49721,-408.8213 C 234.1753,-408.8268 233.73109,-409.17593 229.94262,-409.12268 C 229.94262,-409.12268 229.94262,-409.12268 229.94262,-409.12268"
+- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- id="path7939"
+- d="M 206.1989,-407.47878 C 208.11911,-406.66172 210.77605,-405.28595 212.35787,-404.08139 C 213.93971,-402.87683 215.26544,-402.30771 217.91246,-400.16344 C 218.79803,-399.44606 219.66111,-398.81359 220.50439,-398.2417 L 221.04496,-398.43181 C 220.33173,-398.9152 219.5772,-399.45212 218.77587,-400.05384 C 215.95364,-402.17305 215.14932,-402.86357 212.7608,-404.32798 C 210.37226,-405.79238 208.66132,-406.69374 206.1989,-407.47878 C 206.1989,-407.47878 206.1989,-407.47878 206.1989,-407.47878"
+- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- sodipodi:nodetypes="cssccsscc" />
+- <path
+- id="path7941"
+- d="M 237.79963,-407.47878 C 239.71984,-406.66172 242.40557,-405.28595 243.98738,-404.08139 C 244.80045,-403.46223 245.54587,-403.01097 246.43784,-402.42738 L 247.08684,-402.54404 C 246.28853,-403.12041 245.51507,-403.63839 244.39031,-404.32798 C 242.00177,-405.79238 240.26205,-406.69374 237.79963,-407.47878 C 237.79963,-407.47878 237.79963,-407.47878 237.79963,-407.47878"
+- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- sodipodi:nodetypes="csccscc" />
+- </g>
+- <g
+- clip-path="url(#clipPath7606)"
+- id="g7943">
+- <path
+- style="opacity:0.75;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7578);enable-background:new"
+- d="M 1056.25,-278.80481 C 1060.3946,-280.28358 1066.25,-275.67981 1066.25,-275.67981 C 1067.149,-275.39889 1068.9751,-276.57428 1068.8743,-277.36595 C 1068.8743,-277.36595 1067.324,-279.22657 1068.5,-280.30481 C 1069.676,-281.38305 1073.796,-278.79743 1076,-278.67981 C 1078.204,-278.56219 1081.5621,-278.90922 1083,-279.42981 C 1084.4379,-279.9504 1084.1129,-280.8544 1085.625,-281.17981 C 1087.1371,-281.50522 1090.7439,-280.14227 1092.6855,-280.01098 C 1094.6271,-279.87969 1097.3336,-279.67671 1098.5,-280.17981 C 1099.6664,-280.68291 1098.6782,-281.33902 1100.375,-282.05481 C 1102.0718,-282.7706 1108.1352,-283.01143 1110,-282.17981 C 1111.8648,-281.34819 1111.8099,-281.66061 1112.625,-279.17981 C 1113.4401,-276.69901 1120.0648,-274.01696 1111.5,-265.80481 C 1102.9352,-257.59266 1052.1221,-252.01887 1045.875,-263.05481 C 1039.6279,-274.09075 1052.1054,-277.32604 1056.25,-278.80481 z"
+- id="path7945"
+- sodipodi:nodetypes="czzzzzzzzzzzzzz" />
+- <path
+- style="opacity:0.75;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7594);enable-background:new"
+- d="M 1058.5,-275.42981 C 1062.6446,-276.90858 1068.5,-272.30481 1068.5,-272.30481 C 1069.399,-272.02389 1071.2251,-273.19928 1071.1243,-273.99095 C 1071.1243,-273.99095 1069.574,-275.85157 1070.75,-276.92981 C 1071.926,-278.00805 1076.046,-275.42243 1078.25,-275.30481 C 1080.454,-275.18719 1083.8121,-275.53422 1085.25,-276.05481 C 1086.6879,-276.5754 1086.3629,-277.4794 1087.875,-277.80481 C 1089.3871,-278.13022 1092.9939,-276.76727 1094.9355,-276.63598 C 1096.8771,-276.50469 1099.5836,-276.30171 1100.75,-276.80481 C 1101.9164,-277.30791 1100.9282,-277.96402 1102.625,-278.67981 C 1104.3218,-279.3956 1110.3852,-279.63643 1112.25,-278.80481 C 1114.1148,-277.97319 1114.0599,-278.28561 1114.875,-275.80481 C 1115.6901,-273.32401 1122.3148,-270.64196 1113.75,-262.42981 C 1105.1852,-254.21766 1054.3721,-248.64387 1048.125,-259.67981 C 1041.8779,-270.71575 1054.3554,-273.95104 1058.5,-275.42981 z"
+- id="path7947"
+- sodipodi:nodetypes="czzzzzzzzzzzzzz" />
+- </g>
+- </g>
+- <path
+- style="opacity:1;fill:#101414;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 628.24553,347.99185 C 624.4411,322.72762 611.43581,297.35383 611.08873,272.46662 C 610.90247,259.1111 614.36158,245.89571 624.84426,232.91257 C 661.19128,167.61674 741.78517,148.21789 810.77892,141.44715 C 897.70131,130.43035 995.69159,159.38722 1044.1503,236.84843 C 1098.2743,312.58173 1100.825,409.38755 1124.7623,496.37638 C 1154.2001,623.50398 1179.5414,752.59052 1185.1545,883.22673 C 1182.0911,961.40858 1176.7282,1048.4109 1124.6513,1111.3609 C 1076.6248,1161.7183 1001.8649,1161.4139 937.58145,1170.3632 C 847.02606,1175.0182 753.22992,1154.2174 675.79755,1106.165 C 611.02191,1068.225 580.06736,992.68633 578.51815,920.14538 C 570.12898,840.27022 604.90967,766.33687 630.13855,692.98577 C 637.60916,610.2247 639.55141,526.73802 639.79189,443.60093 C 638.95507,411.40549 632.70236,379.7836 628.24553,347.99185 z"
+- id="path7949"
+- sodipodi:nodetypes="cscccccccccccc" />
+- <path
+- style="opacity:0.25;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8940);enable-background:accumulate"
+- d="M 311.83409,415.43155 L 321.73359,537.05392 L 261.62951,673.52553 L 277.18586,848.1809 C 292.79912,910.0601 309.37131,946.84995 351.56201,965.23473 C 355.88112,928.99475 312.95049,822.27485 312.31937,776.11489 C 311.68792,729.93044 323.14971,667.50703 342.99704,617.81842 C 363.04539,567.62654 379.89378,572.972 385.12193,525.22549 C 390.35008,477.47898 367.69553,375.83357 367.69553,375.83357 L 311.83409,415.43155 z"
+- id="path7951"
+- sodipodi:nodetypes="ccccczzzcc"
+- clip-path="url(#clipPath8616)"
+- transform="translate(276,136)" />
+- <path
+- style="opacity:1;fill:url(#linearGradient8970);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 1010.0312,655.49186 C 1010.0312,655.49186 1026.7864,692.50992 1038.7327,709.44581 C 1050.6789,726.3817 1091.4598,765.49186 1091.4598,765.49186 L 1144.057,637.90211"
+- id="path7953"
+- sodipodi:nodetypes="czcc" />
+- <path
+- style="opacity:0.07999998;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8822);enable-background:accumulate"
+- d="M 730.31998,536.56864 C 730.31998,545.05392 772.86772,595.03667 772.86772,595.03667 L 785.47431,566.26713 L 730.31998,536.56864 z"
+- id="path7955"
+- sodipodi:nodetypes="cccc"
+- clip-path="url(#clipPath8209)"
+- transform="translate(276,136)" />
+- <g
+- transform="translate(450.03125,73.843964)"
+- style="opacity:1;display:inline;enable-background:new"
+- id="g7957"
+- clip-path="url(#clipPath3998)">
+- <g
+- transform="translate(-174.03125,62.156036)"
+- style="filter:url(#filter3677)"
+- id="g7959">
+- <g
+- id="g7961"
+- style="filter:url(#filter3785)">
+- <path
+- sodipodi:nodetypes="czzzzzzzzzz"
+- id="path7963"
+- d="M 425.88244,476.99186 C 436.68787,475.5132 450.62645,480.34637 470.5253,480.20614 C 490.42415,480.06591 527.97852,463.29492 552.66815,463.06328 C 577.35778,462.83164 615.41985,475.34734 631.95387,478.06328 C 648.48789,480.77922 654.80219,477.90476 659.45386,485.92043 C 664.10553,493.9361 661.38057,496.66767 649.09672,506.63472 C 636.81287,516.60177 608.30704,519.27104 583.02529,519.49186 C 557.74295,519.71268 512.644,526.57038 487.66815,523.42042 C 462.6923,520.27046 430.73059,515.59775 418.73958,505.56328 C 406.74857,495.52881 398.88874,488.83146 401.23958,481.63471 C 403.59042,474.43796 415.07701,478.47052 425.88244,476.99186 z"
+- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <rect
+- y="412.60312"
+- x="343.6539"
+- height="181.01935"
+- width="381.83765"
+- id="rect7965"
+- style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+- </g>
+- <g
+- id="g7967"
+- style="filter:url(#filter3785)">
+- <path
+- sodipodi:nodetypes="czzzcc"
+- id="path7969"
+- d="M 687.14286,452.36218 C 676.68117,462.07661 600.16326,471.36732 586.42857,481.6479 C 572.69388,491.92848 571.67605,494.53616 574.28571,501.6479 C 576.89537,508.75964 580.83098,511.05362 600,510.21932 C 619.16902,509.38502 698.57143,482.5976 698.57143,488.79075 L 687.14286,452.36218 z"
+- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- transform="translate(174.03125,-62.156036)" />
+- <rect
+- y="344.82138"
+- x="702.86414"
+- height="162.63455"
+- width="207.8894"
+- id="rect7971"
+- style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+- </g>
+- </g>
+- <g
+- transform="translate(-174.03125,62.156036)"
+- style="opacity:0.18000004;display:inline;enable-background:new"
+- id="g7973">
+- <g
+- id="g7975"
+- style="filter:url(#filter3785)">
+- <path
+- sodipodi:nodetypes="czzzzzzzzzz"
+- id="path7977"
+- d="M 425.88244,476.99186 C 436.68787,475.5132 450.62645,480.34637 470.5253,480.20614 C 490.42415,480.06591 527.97852,463.29492 552.66815,463.06328 C 577.35778,462.83164 615.41985,475.34734 631.95387,478.06328 C 648.48789,480.77922 654.80219,477.90476 659.45386,485.92043 C 664.10553,493.9361 661.38057,496.66767 649.09672,506.63472 C 636.81287,516.60177 608.30704,519.27104 583.02529,519.49186 C 557.74295,519.71268 512.644,526.57038 487.66815,523.42042 C 462.6923,520.27046 430.73059,515.59775 418.73958,505.56328 C 406.74857,495.52881 398.88874,488.83146 401.23958,481.63471 C 403.59042,474.43796 415.07701,478.47052 425.88244,476.99186 z"
+- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <rect
+- y="412.60312"
+- x="343.6539"
+- height="181.01935"
+- width="381.83765"
+- id="rect7979"
+- style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+- </g>
+- <g
+- id="g7981"
+- style="filter:url(#filter3785)">
+- <path
+- sodipodi:nodetypes="czzzcc"
+- id="path7983"
+- d="M 687.14286,452.36218 C 676.68117,462.07661 600.16326,471.36732 586.42857,481.6479 C 572.69388,491.92848 571.67605,494.53616 574.28571,501.6479 C 576.89537,508.75964 580.83098,511.05362 600,510.21932 C 619.16902,509.38502 698.57143,482.5976 698.57143,488.79075 L 687.14286,452.36218 z"
+- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- transform="translate(174.03125,-62.156036)" />
+- <rect
+- y="344.82138"
+- x="702.86414"
+- height="162.63455"
+- width="207.8894"
+- id="rect7985"
+- style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+- </g>
+- </g>
+- </g>
+- <path
+- style="opacity:0.75;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8802);enable-background:accumulate"
+- d="M 582.65599,-7.4183011 L 695.79307,78.848726 L 804.68752,337.64981 L 842.87128,545.5392 L 963.07944,637.46308 C 963.07944,637.46308 950.35151,350.37773 943.28044,323.50767 C 936.20938,296.63761 793.37381,-69.643698 793.37381,-69.643698 L 582.65599,-7.4183011 z"
+- id="path7987"
+- clip-path="url(#clipPath8604)"
+- sodipodi:nodetypes="cccccscc"
+- transform="translate(276,136)" />
+- <path
+- style="opacity:1;fill:url(#linearGradient8958);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 964.13839,239.599 C 964.13839,239.599 972.81571,250.49562 988.24554,251.56328 C 1003.6754,252.63094 1037.9672,211.61061 1058.4241,199.42043 C 1078.9034,187.2169 1105.4705,172.81818 1122.3527,179.06329 C 1139.2348,185.30839 1144.5105,205.49938 1150.2098,227.099 C 1155.9092,248.69861 1156.9284,288.91289 1147.5313,319.95615 C 1138.1341,350.9994 1097.028,393.0599 1082.1741,423.349 C 1067.3202,453.6381 1070.567,463.17043 1070.567,463.17043"
+- id="path7989"
+- sodipodi:nodetypes="czzzzzzc" />
+- <path
+- style="opacity:1;fill:url(#radialGradient3315);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- d="M 1124.4955,207.63471 C 1108.6027,206.74185 1074.7767,219.74054 1058.4241,231.92043 C 1041.9855,244.16433 1029.2032,256.03483 1029.1384,284.06328 C 1029.0732,312.26932 1042.2575,323.13969 1058.2455,331.02757 C 1074.2335,338.91546 1091.9317,338.14685 1110.2098,319.24186 C 1128.488,300.33686 1124.4955,207.63471 1124.4955,207.63471 z"
+- id="path7991"
+- sodipodi:nodetypes="czzzzc" />
+- <path
+- sodipodi:type="arc"
+- style="opacity:0.75;fill:url(#radialGradient3543);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4120);enable-background:accumulate"
+- id="path7993"
+- sodipodi:cx="385"
+- sodipodi:cy="237.00504"
+- sodipodi:rx="86.428574"
+- sodipodi:ry="73.928574"
+- d="M 471.42857,237.00504 A 86.428574,73.928574 0 1 1 298.57143,237.00504 A 86.428574,73.928574 0 1 1 471.42857,237.00504 z"
+- transform="matrix(0.9434749,-0.1239943,0.1440089,1.0957669,451.94827,134.5988)"
+- clip-path="url(#clipPath4100)" />
+- <path
+- transform="translate(450.03125,73.843964)"
+- style="opacity:1;fill:url(#radialGradient3915);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 527.60588,407.44884 C 527.60588,407.44884 405.56444,445.85232 340.09154,417.08065 C 274.61865,388.30899 265.71429,292.36218 265.71429,292.36218 C 265.71429,292.36218 339.09587,211.85825 395.63507,208.74742 C 451.46212,205.67578 486.20893,228.89074 510.50508,274.59913 C 534.85708,320.41261 527.60588,407.44884 527.60588,407.44884 z"
+- id="path7995"
+- sodipodi:nodetypes="csczzc"
+- mask="url(#mask3684)" />
+- <path
+- style="opacity:1;fill:url(#linearGradient3959);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 772.17411,393.349 C 772.17411,393.349 808.39165,365.96653 823.78125,357.45614 C 838.95859,349.06313 849.49553,345.849 859.6741,345.849 L 844.13839,412.81328"
+- id="path7997"
+- sodipodi:nodetypes="czcc" />
+- <path
+- sodipodi:type="arc"
+- style="opacity:1;fill:url(#radialGradient3933);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- id="path7999"
+- sodipodi:cx="409.28571"
+- sodipodi:cy="306.64789"
+- sodipodi:rx="36.25"
+- sodipodi:ry="36.25"
+- d="M 445.53571,306.64789 A 36.25,36.25 0 1 1 373.03571,306.64789 A 36.25,36.25 0 1 1 445.53571,306.64789 z"
+- transform="translate(449.49554,74.915393)" />
+- <path
+- style="opacity:0.3;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8806);enable-background:accumulate"
+- d="M 311.83409,415.43155 L 321.73359,537.05392 L 261.62951,673.52553 L 277.18586,848.1809 C 292.79912,910.0601 309.37131,946.84995 351.56201,965.23473 C 355.88112,928.99475 360.24362,892.86709 320.31937,742.11489 L 337.99704,672.81842 L 410.12193,534.22549 L 367.69553,375.83357 L 311.83409,415.43155 z"
+- id="path8001"
+- sodipodi:nodetypes="cccccccccc"
+- clip-path="url(#clipPath8616)"
+- transform="translate(276,136)" />
+- <path
+- style="opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8826);enable-background:accumulate"
+- d="M 635.21025,581.13004 C 621.06811,593.85796 674.44372,615.71019 711.57778,605.17167 C 748.71184,594.63315 816.22265,569.6073 814.81537,525.97571 C 813.40809,482.34413 738.44784,397.28228 738.44784,397.28228 L 635.21025,581.13004 z"
+- id="path8003"
+- sodipodi:nodetypes="czzcc" />
+- <path
+- sodipodi:type="arc"
+- style="opacity:1;fill:url(#radialGradient3991);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- id="path8005"
+- sodipodi:cx="410"
+- sodipodi:cy="306.64789"
+- sodipodi:rx="23.214285"
+- sodipodi:ry="23.214285"
+- d="M 433.21428,306.64789 A 23.214285,23.214285 0 1 1 386.78572,306.64789 A 23.214285,23.214285 0 1 1 433.21428,306.64789 z"
+- transform="translate(449.67411,74.915393)" />
+- <path
+- sodipodi:type="arc"
+- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter3981);enable-background:accumulate"
+- id="path8007"
+- sodipodi:cx="414.28571"
+- sodipodi:cy="303.07648"
+- sodipodi:rx="7.5"
+- sodipodi:ry="7.5"
+- d="M 421.78571,303.07648 A 7.5,7.5 0 1 1 406.78571,303.07648 A 7.5,7.5 0 1 1 421.78571,303.07648 z"
+- transform="translate(451.99554,73.486821)" />
+- <path
+- style="opacity:1;fill:url(#radialGradient4112);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 789.31696,478.349 C 789.31696,478.349 796.33977,497.91759 788.24553,513.349 C 780.15129,528.78041 745.92236,552.33722 720.74554,563.349 C 695.43582,574.41891 635.27254,596.31293 618.95982,605.31328 C 602.49834,614.39571 600.74554,617.99185 600.74554,617.99185 C 600.74554,617.99185 593.59861,598.92744 629.49553,566.20615 C 665.66764,533.23401 771.52265,518.15665 789.31696,478.349 z"
+- id="path8009"
+- sodipodi:nodetypes="czzzczc" />
+- <g
+- style="opacity:1;display:inline;enable-background:new"
+- id="g8011"
+- transform="translate(780.74553,74.55825)">
+- <path
+- transform="translate(-329.81481,0)"
+- clip-path="url(#clipPath3999)"
+- sodipodi:nodetypes="czzczzzszc"
+- id="path8013"
+- d="M 179.64286,267.36218 C 157.23242,307.0651 119.02676,383.14247 110.35715,417.00504 C 101.70994,450.78014 101.58516,483.42158 110,503.43362 C 118.3602,523.31575 136.16398,539.06642 150.71428,544.86218 C 150.1179,530.48631 165.08723,501.57635 223.57143,472.36218 C 282.1977,443.07704 301.95306,445.23132 327.14285,425.21932 C 352.77291,404.85756 335.34872,345.57268 330.35714,331.29075 C 325.36556,317.00882 329.12051,327.91101 328.41112,326.19774 C 317.72184,300.38182 294.1968,271.76744 263.92857,261.6479 C 233.66034,251.52836 198.91081,256.79953 179.64286,267.36218 z"
+- style="opacity:1;fill:url(#radialGradient3585);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:20.79999924;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
+- <path
+- transform="matrix(0.8823874,0.4705236,-0.4705236,0.8823874,-166.62245,2.387362)"
+- d="M 248.28731,338.07648 A 64.715881,134.00607 0 1 1 118.85555,338.07648 A 64.715881,134.00607 0 1 1 248.28731,338.07648 z"
+- sodipodi:ry="134.00607"
+- sodipodi:rx="64.715881"
+- sodipodi:cy="338.07648"
+- sodipodi:cx="183.57143"
+- id="path8015"
+- style="opacity:1;fill:url(#radialGradient4060);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:20.79999924;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- sodipodi:type="arc" />
+- <path
+- transform="matrix(0.8823874,0.4705236,-0.4705236,0.8823874,-162.19388,-18.755495)"
+- d="M 248.28731,338.07648 A 64.715881,134.00607 0 1 1 118.85555,338.07648 A 64.715881,134.00607 0 1 1 248.28731,338.07648 z"
+- sodipodi:ry="134.00607"
+- sodipodi:rx="64.715881"
+- sodipodi:cy="338.07648"
+- sodipodi:cx="183.57143"
+- id="path8017"
+- style="opacity:1;fill:url(#radialGradient4062);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:20.79999924;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- sodipodi:type="arc" />
+- <path
+- transform="translate(-329.81481,3e-7)"
+- clip-path="url(#clipPath3999)"
+- sodipodi:nodetypes="czzczzzszc"
+- id="path8019"
+- d="M 179.64286,267.36218 C 157.23242,307.0651 119.02676,383.14247 110.35715,417.00504 C 101.70994,450.78014 101.58516,483.42158 110,503.43362 C 118.3602,523.31575 136.16398,539.06642 150.71428,544.86218 C 150.1179,530.48631 165.08723,501.57635 223.57143,472.36218 C 282.1977,443.07704 301.95306,445.23132 327.14285,425.21932 C 352.77291,404.85756 335.34872,345.57268 330.35714,331.29075 C 325.36556,317.00882 329.12051,327.91101 328.41112,326.19774 C 317.72184,300.38182 294.1968,271.76744 263.92857,261.6479 C 233.66034,251.52836 198.91081,256.79953 179.64286,267.36218 z"
+- style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3587);stroke-width:20.79999924;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;filter:url(#filter4079);enable-background:new" />
+- </g>
+- <path
+- sodipodi:type="arc"
+- style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- id="path8021"
+- sodipodi:cx="310.71429"
+- sodipodi:cy="398.07648"
+- sodipodi:rx="19.704132"
+- sodipodi:ry="19.704132"
+- d="M 330.41843,398.07648 A 19.704132,19.704132 0 1 1 291.01016,398.07648 A 19.704132,19.704132 0 1 1 330.41843,398.07648 z"
+- transform="translate(452.55663,72.581273)" />
+- <path
+- sodipodi:type="arc"
+- style="opacity:1;fill:url(#radialGradient4056);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4082);stroke-width:20.79999924;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4083);enable-background:accumulate"
+- id="path8023"
+- sodipodi:cx="310.71429"
+- sodipodi:cy="398.07648"
+- sodipodi:rx="19.704132"
+- sodipodi:ry="19.704132"
+- d="M 330.41843,398.07648 A 19.704132,19.704132 0 1 1 291.01016,398.07648 A 19.704132,19.704132 0 1 1 330.41843,398.07648 z"
+- transform="translate(450.55663,72.581273)" />
+- <path
+- sodipodi:type="arc"
+- style="opacity:1;fill:url(#radialGradient4119);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- id="path8025"
+- sodipodi:cx="310.71429"
+- sodipodi:cy="398.07648"
+- sodipodi:rx="19.704132"
+- sodipodi:ry="19.704132"
+- d="M 330.41843,398.07648 A 19.704132,19.704132 0 1 1 291.01016,398.07648 A 19.704132,19.704132 0 1 1 330.41843,398.07648 z"
+- transform="translate(450.55663,72.581273)" />
+- <path
+- sodipodi:type="arc"
+- style="opacity:1;fill:url(#radialGradient4868);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4002);enable-background:accumulate"
+- id="path8027"
+- sodipodi:cx="429.56738"
+- sodipodi:cy="377.42877"
+- sodipodi:rx="72.079735"
+- sodipodi:ry="44.547726"
+- d="M 501.64712,377.42877 A 72.079735,44.547726 0 1 1 357.48765,377.42877 A 72.079735,44.547726 0 1 1 501.64712,377.42877 z"
+- transform="matrix(0.9969564,-7.7961675e-2,7.7961675e-2,0.9969564,436.61877,125.29509)"
+- inkscape:transform-center-x="-47.231976"
+- inkscape:transform-center-y="-3.6935079" />
+- <path
+- sodipodi:type="arc"
+- style="opacity:1;fill:url(#radialGradient4876);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4010);enable-background:accumulate"
+- id="path8029"
+- sodipodi:cx="437.6991"
+- sodipodi:cy="391.21735"
+- sodipodi:rx="36.611931"
+- sodipodi:ry="22.627417"
+- d="M 474.31103,391.21735 A 36.611931,22.627417 0 1 1 401.08717,391.21735 A 36.611931,22.627417 0 1 1 474.31103,391.21735 z"
+- transform="matrix(1.4357951,-6.9991037e-2,6.9991037e-2,1.4357951,235.18065,-63.86546)"
+- inkscape:transform-center-x="-20.955902"
+- inkscape:transform-center-y="-13.056625" />
+- <g
+- transform="translate(450.03125,73.843964)"
+- id="g8031"
+- style="opacity:1;display:inline;filter:url(#filter4053);enable-background:new">
+- <path
+- d="M 416.87499,401.82648 A 3.2142856,3.2142856 0 1 1 410.44642,401.82648 A 3.2142856,3.2142856 0 1 1 416.87499,401.82648 z"
+- sodipodi:ry="3.2142856"
+- sodipodi:rx="3.2142856"
+- sodipodi:cy="401.82648"
+- sodipodi:cx="413.66071"
+- id="path8033"
+- style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4484);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- sodipodi:type="arc" />
+- <path
+- transform="translate(13.125009,8.1249913)"
+- d="M 416.87499,401.82648 A 3.2142856,3.2142856 0 1 1 410.44642,401.82648 A 3.2142856,3.2142856 0 1 1 416.87499,401.82648 z"
+- sodipodi:ry="3.2142856"
+- sodipodi:rx="3.2142856"
+- sodipodi:cy="401.82648"
+- sodipodi:cx="413.66071"
+- id="path8035"
+- style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4486);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- sodipodi:type="arc" />
+- <path
+- transform="translate(32.946437,7.4999913)"
+- d="M 416.87499,401.82648 A 3.2142856,3.2142856 0 1 1 410.44642,401.82648 A 3.2142856,3.2142856 0 1 1 416.87499,401.82648 z"
+- sodipodi:ry="3.2142856"
+- sodipodi:rx="3.2142856"
+- sodipodi:cy="401.82648"
+- sodipodi:cx="413.66071"
+- id="path8037"
+- style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4488);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- sodipodi:type="arc" />
+- <path
+- transform="translate(24.910723,-10.267866)"
+- d="M 416.87499,401.82648 A 3.2142856,3.2142856 0 1 1 410.44642,401.82648 A 3.2142856,3.2142856 0 1 1 416.87499,401.82648 z"
+- sodipodi:ry="3.2142856"
+- sodipodi:rx="3.2142856"
+- sodipodi:cy="401.82648"
+- sodipodi:cx="413.66071"
+- id="path8039"
+- style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4490);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- sodipodi:type="arc" />
+- <path
+- transform="translate(47.589294,-0.6250087)"
+- d="M 416.87499,401.82648 A 3.2142856,3.2142856 0 1 1 410.44642,401.82648 A 3.2142856,3.2142856 0 1 1 416.87499,401.82648 z"
+- sodipodi:ry="3.2142856"
+- sodipodi:rx="3.2142856"
+- sodipodi:cy="401.82648"
+- sodipodi:cx="413.66071"
+- id="path8041"
+- style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4492);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- sodipodi:type="arc" />
+- </g>
+- <path
+- style="opacity:1;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- d="M 896.20301,482.92837 C 897.1881,487.27845 900.74008,489.10785 903.58974,490.82019 C 908.05042,493.33311 910.1099,492.3423 912.74425,490.06258 C 914.3462,488.14141 923.42736,485.36393 928.33848,482.99151 C 932.66809,481.5326 937.24178,477.63278 941.723,474.65775 C 945.11814,473.03051 947.06964,475.01239 949.55168,475.6679 C 952.4958,476.38451 953.96285,477.83965 955.6126,479.20344 C 958.00876,480.37863 954.6847,482.34657 958.8956,483.49658 C 960.08651,483.71452 961.31255,484.07303 962.17859,482.99151"
+- id="path8043"
+- sodipodi:nodetypes="ccccccccc" />
+- <path
+- style="opacity:1;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- d="M 910.85021,475.35223 C 913.16515,475.32025 914.02799,475.99476 916.34292,474.53148 C 919.79856,471.45035 921.74546,471.38671 924.29787,470.11206 C 927.32444,468.79683 930.83357,478.26375 934.3994,479.96105 C 936.79449,479.13963 935.68854,481.75484 935.85149,482.6127 C 935.90862,485.25954 938.65843,486.29076 940.20777,488.04227 C 943.52381,490.29776 947.583,494.33773 951.31945,493.34557 C 957.7647,490.4145 961.59867,492.06411 967.60816,485.95883 C 968.31221,484.77749 967.02391,479.06423 970.70175,478.76149 C 973.22574,479.01487 974.86842,478.81164 976.76267,479.32971 C 982.20367,481.4469 984.50045,485.77971 991.47301,487.28466 C 997.65591,488.25105 999.08565,491.07892 1005.3626,492.33542"
+- id="path8045"
+- sodipodi:nodetypes="cccccccccccc" />
+- <path
+- style="opacity:1;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- d="M 876.98133,483.52197 C 879.37991,482.72817 883.08746,487.71407 885.15446,490.56765 C 885.74727,493.24717 886.30823,496.0541 885.91207,502.68948 C 886.6972,505.10702 888.59256,505.72043 890.7103,505.97248 C 893.82775,505.4357 896.58699,504.64818 898.0339,502.94202 C 899.9055,501.00035 903.34643,505.33596 906.11512,506.98263 C 909.72521,508.89472 913.8889,508.96149 917.98442,509.25547 C 919.688,509.02483 920.35482,513.77062 921.26741,517.3367 C 921.65155,521.71476 920.38197,524.23239 919.49965,527.18568 C 919.20535,529.68223 922.48815,530.71542 925.8131,531.73137 C 928.99554,532.47261 932.35734,533.39321 934.90447,533.49914 C 940.04633,534.37405 942.99321,536.18966 947.0263,537.53975 C 949.26544,538.3563 950.28649,539.78191 951.57199,541.07528"
+- id="path8047"
+- sodipodi:nodetypes="ccccccccccccc" />
+- <path
+- style="opacity:0.25;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter8814);enable-background:new"
+- d="M 332,187.69519 C 332,187.69519 389.5,162.19519 389.5,159.69519 C 389.5,157.19519 395,107.69519 395,107.69519 C 395,107.69519 486,59.195189 486.5,57.195189 C 487,55.195189 572.5,-4.8048114 572.5,-4.8048114 L 386.5,17.195189 L 311,123.19519 L 332,187.69519 z"
+- id="path8049"
+- clip-path="url(#clipPath8514)"
+- transform="translate(276,136)" />
+- <path
+- style="opacity:0.25;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 1697.2846,722.5514 C 1697.2846,722.5514 1581.3191,796.0905 1574.2481,800.33314 C 1567.177,804.57578 1343.7312,937.51186 1343.7312,937.51186 L 1347.9739,977.10984 L 1564.3486,876.70067 L 1681.7283,774.8773 L 1697.2846,722.5514 z"
+- id="path8051" />
+- <path
+- style="opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8810);enable-background:accumulate"
+- d="M 528.91587,556.85291 C 523.25902,555.4387 347.89654,631.80623 347.89654,631.80623 L 313.95541,812.82557 L 365.05087,1006.7738 L 622.25397,1074.4551 C 622.25397,1074.4551 828.72915,1227.1901 834.386,1222.9475 C 840.04286,1218.7049 1002.6774,1029.2002 1002.6774,1029.2002 L 842.87128,845.35248 L 796.20224,667.16157 L 528.91587,556.85291 z"
+- id="path8053"
+- clip-path="url(#clipPath8610)"
+- sodipodi:nodetypes="cccccscccc"
+- transform="translate(276,136)" />
+- <path
+- style="opacity:1;fill:#0c0c0c;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- d="M 1097.6433,613.88997 C 1097.6433,613.88997 1120.2628,607.38316 1133.386,608.01724 C 1146.5093,608.65133 1164.0276,609.95586 1177.0949,620.20343 C 1190.1622,630.45099 1202.1626,647.3435 1211.2073,678.57308 C 1220.2519,709.80266 1212.9056,777.82509 1205.0312,821.92043 C 1197.1569,866.01577 1176.7661,928.03341 1160.0312,961.92043 C 1143.2964,995.80745 1110.2335,1039.4156 1099.4618,1051.7966 C 1088.0976,1064.8586 1043.2559,1088.2228 1020.0312,1094.0633 C 1025.3346,1083.4567 1068.931,1043.4744 1055.0312,1033.349 C 1041.0123,1023.1367 1009.2712,1079.3314 970.7381,1062.3822 C 992.12041,1049.2501 1012.5175,1011.1961 1004.7787,995.78772 C 996.93846,980.17733 974.07378,1044.5453 911.24317,1032.8006 C 941.29521,1005.2739 966.65023,961.89659 952.50587,949.8209 C 938.09071,937.51403 892.04412,1004.1141 892.04412,1004.1141 C 892.04412,1004.1141 889.22222,962.41287 905.81732,935.50673 C 922.45667,908.52886 985.47029,853.89146 1005.3704,823.80331 C 1025.2706,793.71517 1038.983,757.79429 1047.5059,731.28537 C 1056.0287,704.77645 1063.3068,654.18583 1063.3068,654.18583"
+- id="path8055"
+- sodipodi:nodetypes="czzzzzzczczczczzzc" />
+- <path
+- style="opacity:0.25;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8818);enable-background:accumulate"
+- d="M 770.74639,609.17881 L 719.8347,706.75955 L 639.93163,817.77531 L 674.57987,889.19309 L 717.00628,968.38906 L 789.13117,923.13422 L 803.27331,730.80117 L 824.48651,592.20825 L 810.34437,502.05213 L 770.74639,609.17881 z"
+- id="path8057"
+- clip-path="url(#clipPath8622)"
+- sodipodi:nodetypes="cccccccccc"
+- transform="translate(276,136)" />
+- <path
+- style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8810);enable-background:accumulate"
+- d="M 295,846.19519 L 301.64488,777.27234 C 301.64488,777.27234 391.96439,866.27691 464,900.19519 C 536.03561,934.11347 772,962.19519 772,962.19519 L 926,936.19519 L 890,1098.1952 L 604,1124.1952 L 306,1035.1952 L 295,846.19519 z"
+- id="path8059"
+- clip-path="url(#clipPath8906)"
+- sodipodi:nodetypes="cczcccccc"
+- transform="translate(276,136)" />
+- <path
+- transform="translate(450.03125,73.843964)"
+- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter3587);enable-background:new"
+- d="M 405.79629,845.99023 L 480.74961,911.04406 L 483.24924,927.92446 L 502.6526,938.08337 L 509.14464,961.13446 L 540.85369,952.76336 L 555.70293,1000.8466 C 567.95945,1013.5745 645.49637,887.7369 611.56436,1039.0304 L 550.75318,1055.2939 L 461.55026,960.60104 L 398.72523,906.80141 L 405.79629,845.99023 z"
+- id="path8061"
+- sodipodi:nodetypes="cccccccccccc"
+- clip-path="url(#clipPath3602)" />
+- <path
+- style="opacity:1;fill:#121212;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+- d="M 1159.317,918.349 C 1213.6027,916.92043 1285.352,903.29701 1329.317,891.56328 C 1373.3697,879.80614 1455.2033,855.21604 1504.674,833.70614 C 1554.0133,812.25342 1618.2778,774.42454 1658.9599,741.56329 C 1699.468,708.8426 1711.3498,685.74348 1719.6741,707.99186 C 1728.0432,730.35965 1703.2672,764.31748 1681.817,789.06329 C 1660.2128,813.98669 1629.0856,841.76862 1582.8883,878.349 C 1536.691,914.92938 1426.8058,979.93363 1370.0312,1006.9204 C 1312.9652,1034.0458 1241.8279,1065.1589 1197.8884,1079.4205 C 1153.9489,1093.6821 1066.4598,1110.4919 1066.4598,1110.4919 L 1159.317,918.349 z"
+- id="path8063"
+- sodipodi:nodetypes="czzzzzzzzcc" />
+- <path
+- transform="translate(450.03125,73.843964)"
+- style="opacity:0.5;fill:url(#linearGradient3666);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter3779);enable-background:accumulate"
+- d="M 1241.5965,652.95007 C 1241.5965,652.95007 1176.875,707.28713 1095.9326,751.94501 C 1013.9082,797.19985 811.67556,845.28311 811.67556,845.28311 C 811.67556,845.28311 796.57419,866.33507 856.93045,873.56739 C 917.28671,880.79971 1081.0124,820.2667 1135.5306,777.40085 C 1190.0488,734.535 1255.7387,665.67799 1255.7387,665.67799 L 1241.5965,652.95007 z"
+- id="path8065"
+- sodipodi:nodetypes="czczzcc"
+- clip-path="url(#clipPath3992)" />
+- <g
+- transform="translate(450.03125,73.843964)"
+- style="opacity:1;display:inline;enable-background:new"
+- id="g8067"
+- clip-path="url(#clipPath3986)">
+- <g
+- transform="translate(-174.03125,62.156036)"
+- style="filter:url(#filter3677)"
+- id="g8069">
+- <g
+- style="filter:url(#filter3785)"
+- id="g8071">
+- <path
+- sodipodi:nodetypes="czzccccc"
+- id="path8073"
+- d="M 1094.2857,725.93361 C 1094.2857,725.93361 1093.9896,752.09452 1098.9285,763.79076 C 1103.8674,775.487 1118.9666,790.27741 1127.5,795.21933 C 1136.0334,800.16125 1146.4286,803.79075 1146.4286,803.79075 L 1264.2857,688.79075 L 1282.1429,613.07647 L 1185.7143,651.6479 L 1094.2857,725.93361 z"
+- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- transform="translate(174.03125,-62.156036)" />
+- <rect
+- y="486.14224"
+- x="1197.8389"
+- height="309.71277"
+- width="333.75412"
+- id="rect8075"
+- style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+- </g>
+- </g>
+- <g
+- transform="translate(-174.03125,62.156036)"
+- style="opacity:0.18000004;display:inline;enable-background:new"
+- id="g8077">
+- <g
+- style="filter:url(#filter3785)"
+- id="g8079">
+- <path
+- sodipodi:nodetypes="czzccccc"
+- id="path8081"
+- d="M 1094.2857,725.93361 C 1094.2857,725.93361 1093.9896,752.09452 1098.9285,763.79076 C 1103.8674,775.487 1118.9666,790.27741 1127.5,795.21933 C 1136.0334,800.16125 1146.4286,803.79075 1146.4286,803.79075 L 1264.2857,688.79075 L 1282.1429,613.07647 L 1185.7143,651.6479 L 1094.2857,725.93361 z"
+- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- transform="translate(174.03125,-62.156036)" />
+- <rect
+- y="486.14224"
+- x="1197.8389"
+- height="309.71277"
+- width="333.75412"
+- id="rect8083"
+- style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+- </g>
+- </g>
+- </g>
+- <path
+- transform="translate(450.03125,73.843964)"
+- style="opacity:0.83300003;fill:#050505;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:15;stroke-linecap:butt;stroke-linejoin:miter;marker:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8225);enable-background:accumulate"
+- d="M 1264.1875,605 C 1259.6964,605.73268 1256.0305,608.45509 1252.25,611.40625 C 1242.1687,619.27601 1224.0805,645.83149 1204.2188,661.875 C 1164.3514,694.07816 1100.2228,731.85201 1051.6562,752.96875 C 1003.0422,774.10613 921.11498,798.78676 877.34375,810.46875 C 833.94554,822.05121 762.29972,835.59982 709.09375,837 L 704.53125,837.125 L 702.53125,841.25 L 609.6875,1033.375 L 603.1875,1046.8438 L 617.84375,1044 C 617.84375,1044 705.11343,1027.3486 750.1875,1012.7188 C 794.9127,998.20213 865.97836,967.05197 923.21875,939.84375 C 980.82199,912.46306 1090.1551,847.86412 1137.5,810.375 C 1183.8608,773.66518 1215.3049,745.65818 1237.4375,720.125 C 1248.3386,707.549 1260.1823,692.59356 1268.4688,677.375 C 1276.7552,662.15644 1287.6285,633.15692 1282.1562,618.53125 C 1280.9385,615.27651 1279.6048,612.46995 1277.5625,610.03125 C 1275.5202,607.59255 1269.0878,608.45926 1269,605 C 1268.7902,596.73518 1265.6845,604.75577 1264.1875,605 z M 1266.3438,620.21875 C 1266.7586,620.80449 1267.3749,621.77641 1268.125,623.78125 C 1271.0218,631.52338 1266.6843,655.68 1259.3125,669.21875 C 1251.9407,682.7575 1236.6741,698.14269 1226.125,710.3125 C 1205.0496,734.62606 1174.2213,762.17406 1128.1875,798.625 C 1083.1379,834.29659 972.72717,899.71959 916.78125,926.3125 C 859.88952,953.35499 788.68509,984.4309 745.53125,998.4375 C 709.16634,1010.2406 649.68654,1022.2713 629.8125,1026.2188 L 714.09375,851.75 C 768.80066,849.7007 837.88634,836.53365 881.21875,824.96875 C 925.55297,813.1365 1007.2974,788.63242 1057.625,766.75 C 1107.737,744.96129 1170.1594,705.58184 1211.6562,672.0625 C 1232.3026,655.38529 1253.4011,629.51662 1261.4688,623.21875 C 1263.9058,621.31633 1265.5494,620.58295 1266.3438,620.21875 z"
+- id="path8085"
+- clip-path="url(#clipPath3722)"
+- sodipodi:nodetypes="cssssccccccssssssssccssssssccssssc" />
+- <g
+- style="opacity:1;display:inline;enable-background:new"
+- id="g8087"
+- mask="url(#mask7704)"
+- transform="matrix(0.9934486,0.1142802,-0.1142802,0.9934486,-9.24324,588.09054)"
+- inkscape:transform-center-x="-185.09603"
+- inkscape:transform-center-y="-12.859654">
+- <path
+- transform="translate(8.0045714e-2,-3.125e-2)"
+- style="fill:#bcb786;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- d="M 1111.4062,-285.9375 L 1107.4688,-284.0625 C 1107.4283,-284.05228 1107.3692,-284.04201 1107.3438,-284.03125 C 1106.925,-283.8184 1107.1791,-283.93067 1106.6875,-283.71875 C 1106.2014,-283.50919 1104.9499,-283.13456 1102.5938,-282.25 C 1099.2626,-280.99942 1096.7895,-280.10016 1095.5938,-279.1875 C 1094.0576,-279.16623 1091.8733,-278.95419 1089.9375,-278.46875 C 1086.956,-277.72108 1085.0823,-277.29474 1083.1875,-276.875 C 1081.2927,-276.45527 1081.512,-276.23281 1080.3125,-276 C 1079.0159,-275.74833 1078.5911,-276.00899 1074.875,-275.21875 C 1071.3851,-274.4766 1065.9802,-273.28768 1064.7188,-272.53125 C 1063.1348,-272.71203 1060.8513,-272.85303 1058.875,-272.5625 C 1055.8346,-272.11554 1053.9588,-271.88974 1052.0312,-271.65625 C 1051.3758,-271.57687 1050.9902,-271.45547 1050.6875,-271.375 C 1050.2613,-271.24334 1050.0017,-271.11498 1049.3125,-271.03125 C 1048.0009,-270.87188 1047.5503,-271.18808 1043.7812,-270.75 C 1040.2273,-270.33691 1034.7758,-269.47718 1033.5312,-268.8125 C 1031.9322,-269.10979 1029.6735,-269.34669 1027.6875,-269.15625 C 1024.6287,-268.86293 1022.7155,-268.67226 1020.7812,-268.5 C 1018.847,-268.32773 1019.0926,-268.07763 1017.875,-267.96875 C 1016.5588,-267.85105 1016.1152,-268.13238 1012.3438,-267.71875 C 1008.8017,-267.3303 1003.3359,-266.50948 1002.0625,-265.84375 C 1000.4636,-266.13844 998.1753,-266.35076 996.1875,-266.15625 C 993.12921,-265.857 991.2463,-265.67601 989.3125,-265.5 C 988.65501,-265.44015 988.27245,-265.32144 987.96875,-265.25 C 987.54105,-265.13104 987.28525,-265.03193 986.59375,-264.96875 C 985.27775,-264.84849 984.834,-265.16363 981.0625,-264.75 C 977.50631,-264.35998 972.0569,-263.51084 970.8125,-262.84375 C 969.21381,-263.13793 966.95265,-263.36747 964.96875,-263.15625 C 961.91305,-262.83092 959.9947,-262.63001 958.0625,-262.4375 C 956.13031,-262.24499 956.37275,-261.99662 955.15625,-261.875 C 953.84137,-261.74353 953.3932,-262.03954 949.625,-261.59375 C 946.08611,-261.17509 940.6473,-260.30158 939.375,-259.625 C 937.77741,-259.90604 935.51505,-260.04543 933.53125,-259.8125 C 930.47927,-259.45413 928.58625,-259.24464 926.65625,-259.03125 C 926.00007,-258.95869 925.6156,-258.85856 925.3125,-258.78125 C 924.88571,-258.65402 924.6276,-258.51405 923.9375,-258.4375 C 922.62411,-258.29181 922.17015,-258.61152 918.40625,-258.125 C 914.85737,-257.66624 909.4276,-256.70598 908.1875,-256 C 906.59441,-256.24424 904.3537,-256.38135 902.375,-256.125 C 899.32741,-255.73018 897.4243,-255.47655 895.5,-255.21875 C 893.57571,-254.96096 893.7739,-254.72522 892.5625,-254.5625 C 891.25301,-254.3866 890.8153,-254.66688 887.0625,-254.09375 C 883.53821,-253.55551 878.1393,-252.39458 876.875,-251.65625 C 875.28751,-251.85979 873.0295,-251.91098 871.0625,-251.5625 C 868.03631,-251.02638 866.1636,-250.70081 864.25,-250.375 C 863.59941,-250.26423 863.2363,-250.10406 862.9375,-250 C 862.51681,-249.83512 862.27405,-249.6687 861.59375,-249.53125 C 860.29905,-249.26966 859.86665,-249.53745 856.15625,-248.71875 C 852.65777,-247.9468 847.31035,-246.33582 846.09375,-245.5 C 844.53085,-245.57745 842.33625,-245.41472 840.40625,-244.90625 C 837.43387,-244.12312 835.58855,-243.67416 833.71875,-243.15625 C 831.84875,-242.63835 832.0521,-242.38897 830.875,-242.0625 C 829.60251,-241.7096 829.17795,-241.95541 825.53125,-240.875 C 822.10657,-239.86037 816.88185,-237.94183 815.65625,-237.03125 C 814.11747,-237.01851 811.93645,-236.75903 810.03125,-236.15625 C 807.10027,-235.22891 805.2809,-234.69783 803.4375,-234.09375 C 802.81071,-233.88837 802.44585,-233.70117 802.15625,-233.5625 C 801.74867,-233.34889 801.50295,-233.15375 800.84375,-232.9375 C 799.58925,-232.52596 799.1576,-232.74846 795.5625,-231.5 C 792.17261,-230.32283 786.96755,-228.2863 785.78125,-227.34375 C 784.25737,-227.28408 782.1312,-226.94888 780.25,-226.28125 C 777.35261,-225.25296 775.55095,-224.60577 773.71875,-223.96875 C 771.88655,-223.33174 772.0909,-223.12021 770.9375,-222.71875 C 769.69071,-222.28479 769.27395,-222.51903 765.71875,-221.15625 C 762.38005,-219.87645 757.23165,-217.6737 756.03125,-216.6875 C 754.52407,-216.57981 752.39555,-216.1887 750.53125,-215.46875 C 747.66307,-214.36115 745.90735,-213.68719 744.09375,-213 C 743.47705,-212.76637 743.0973,-212.55797 742.8125,-212.40625 C 742.81251,-212.40625 742.8125,-212.37673 742.8125,-212.375 L 734.8125,-209.1875 L 722.3366,-205.69561 L 730.26626,-186.41789 C 729.67463,-184.44432 742.8125,-191.15625 742.8125,-191.15625 C 743.03891,-191.30093 743.26145,-191.42886 743.53125,-191.53125 C 744.61177,-191.94123 745.70285,-191.74702 749.53125,-193.21875 C 753.35977,-194.69049 754.7553,-195.22373 755.4375,-195.625 C 756.11711,-196.02478 757.04925,-196.50437 757.65625,-197.15625 C 759.48317,-197.294 761.22705,-197.64948 762.59375,-198.15625 C 765.56175,-199.25677 767.4691,-199.96244 769.375,-200.625 C 771.28081,-201.28754 771.72915,-202.03987 772.78125,-202.40625 C 773.87287,-202.78636 774.97635,-202.57163 778.84375,-203.9375 C 782.71115,-205.30336 784.1269,-205.76458 784.8125,-206.15625 C 785.51361,-206.55677 786.5133,-207.08923 787.125,-207.75 C 789.09581,-207.80466 790.94195,-208.13463 792.40625,-208.625 C 795.40777,-209.63008 797.3324,-210.24671 799.25,-210.875 C 800.78861,-211.3791 801.42415,-211.92177 802.15625,-212.3125 C 802.38647,-212.44681 802.63215,-212.56623 802.90625,-212.65625 C 804.00457,-213.01673 805.0877,-212.73762 809,-213.96875 C 812.91231,-215.19988 814.366,-215.6417 815.0625,-216 C 815.75641,-216.35697 816.6926,-216.79261 817.3125,-217.40625 C 819.17771,-217.42891 820.94835,-217.67308 822.34375,-218.09375 C 825.37415,-219.00729 827.33615,-219.52385 829.28125,-220.0625 C 831.22637,-220.60114 831.70745,-221.32702 832.78125,-221.625 C 833.89527,-221.93415 835.00125,-221.61761 838.96875,-222.65625 C 842.93625,-223.69488 844.38625,-224.08898 845.09375,-224.40625 C 845.82855,-224.73584 846.90765,-225.15997 847.53125,-225.78125 C 849.52907,-225.66525 851.3887,-225.80134 852.875,-226.15625 C 855.95311,-226.89125 857.9584,-227.25719 859.9375,-227.65625 C 861.52541,-227.97643 862.1818,-228.4468 862.9375,-228.75 C 863.17501,-228.8568 863.4044,-228.94276 863.6875,-229 C 864.82091,-229.22919 865.99215,-228.79107 870.03125,-229.5 C 874.07067,-230.20893 875.5315,-230.42709 876.25,-230.6875 C 876.96581,-230.94694 877.95435,-231.25474 878.59375,-231.78125 C 880.51795,-231.54176 882.34165,-231.55672 883.78125,-231.78125 C 886.90767,-232.26887 888.9358,-232.48192 890.9375,-232.75 C 892.93921,-233.01807 893.42625,-233.69514 894.53125,-233.84375 C 895.67767,-233.99793 896.8071,-233.54218 900.875,-234.0625 C 904.94281,-234.58282 906.43525,-234.75823 907.15625,-235 C 907.89337,-235.24714 908.95435,-235.58623 909.59375,-236.125 C 911.64375,-235.78947 913.56745,-235.72704 915.09375,-235.90625 C 918.23595,-236.27521 920.27375,-236.46561 922.28125,-236.6875 C 923.89207,-236.86552 924.5459,-237.2957 925.3125,-237.53125 C 925.55341,-237.61677 925.80655,-237.68685 926.09375,-237.71875 C 927.24345,-237.84647 928.39505,-237.3721 932.46875,-237.84375 C 936.54245,-238.3154 938.0278,-238.45435 938.75,-238.6875 C 939.46941,-238.91977 940.45025,-239.16096 941.09375,-239.65625 C 943.03005,-239.32279 944.8638,-239.25201 946.3125,-239.40625 C 949.45851,-239.7412 951.49,-239.92484 953.5,-240.125 C 955.50991,-240.32514 955.98415,-240.95139 957.09375,-241.0625 C 958.24485,-241.17778 959.39025,-240.69744 963.46875,-241.125 C 967.54725,-241.55256 969.05765,-241.68709 969.78125,-241.90625 C 970.52047,-242.13011 971.57685,-242.4195 972.21875,-242.9375 C 974.27575,-242.53883 976.2206,-242.4441 977.75,-242.59375 C 980.89871,-242.90185 982.9258,-243.067 984.9375,-243.25 C 986.55151,-243.39682 987.20055,-243.81055 987.96875,-244.03125 C 988.21005,-244.11211 988.4623,-244.16116 988.75,-244.1875 C 989.90211,-244.29295 991.0429,-243.79475 995.125,-244.1875 C 999.20711,-244.58025 1000.7139,-244.71834 1001.4375,-244.9375 C 1002.1584,-245.15583 1003.1371,-245.3852 1003.7812,-245.875 C 1005.7193,-245.52501 1007.5501,-245.42062 1009,-245.5625 C 1012.1487,-245.8706 1014.1758,-246.03575 1016.1875,-246.21875 C 1018.1991,-246.40174 1018.7017,-247.05677 1019.8125,-247.15625 C 1020.9648,-247.25948 1022.1047,-246.77142 1026.1875,-247.15625 C 1030.2704,-247.54107 1031.7762,-247.65725 1032.5,-247.875 C 1033.2393,-248.09743 1034.2956,-248.38949 1034.9375,-248.90625 C 1036.9949,-248.50448 1038.9404,-248.40292 1040.4688,-248.5625 C 1043.6153,-248.89102 1045.6458,-249.0852 1047.6562,-249.28125 C 1049.2692,-249.43854 1049.9219,-249.91273 1050.6875,-250.15625 C 1050.9282,-250.24429 1051.1507,-250.27762 1051.4375,-250.3125 C 1052.5858,-250.4522 1053.7542,-249.97259 1057.8125,-250.5625 C 1061.8708,-251.15242 1063.3743,-251.33964 1064.0938,-251.59375 C 1064.8104,-251.84691 1065.7684,-252.15182 1066.4062,-252.6875 C 1068.3259,-252.47556 1070.1262,-252.53609 1071.5625,-252.78125 C 1074.6816,-253.31365 1076.6741,-253.70986 1078.6562,-254.09375 C 1080.6383,-254.47762 1081.1305,-255.1334 1082.2188,-255.375 C 1083.3475,-255.62566 1084.489,-255.25871 1088.4688,-256.25 C 1092.4483,-257.24127 1093.8983,-257.6693 1094.5938,-258.03125 C 1095.316,-258.40725 1096.3555,-258.90183 1096.9688,-259.5625 C 1098.9317,-259.57454 1100.7625,-259.85355 1102.1875,-260.40625 C 1105.1387,-261.55085 1107.0607,-262.27567 1108.875,-263.15625 C 1110.3307,-263.86277 1111.1941,-264.85828 1111.4062,-265.15625 C 1111.6185,-265.4542 1111.5051,-265.8848 1111.5312,-265.90625 C 1111.5742,-265.94148 1111.8716,-266.00028 1112.0312,-266.34375 C 1112.8902,-268.19082 1114.3544,-271.97139 1114.4688,-272.65625 C 1114.5825,-273.33839 1114.6368,-274.00902 1114.6875,-274.40625 C 1114.7169,-274.63575 1114.5404,-275.28515 1114.5625,-275.34375 C 1114.5934,-275.42579 1114.8508,-275.59432 1114.9062,-275.84375 C 1115.1725,-277.04206 1114.9953,-278.05111 1114.7812,-279.46875 C 1114.5673,-280.88638 1113.8096,-284.08338 1113.1562,-284.9375 C 1112.4973,-285.79922 1111.9314,-285.94801 1111.4062,-285.9375 z"
+- id="path8089"
+- sodipodi:nodetypes="ccssscsssscssssscsssscssssscsssscssssscsssscssssscsssscssssscsssscssscccccssscssssscsssssscssssscsssssscssssscsssssscssssscsssssscssssscsssssscssssscsssssssssssc" />
+- <g
+- clip-path="url(#clipPath7421)"
+- id="g8091">
+- <path
+- id="path8093"
+- d="M 1107.409,-284.04961 C 1106.9903,-283.83678 1107.2534,-283.95572 1106.7618,-283.7438 C 1106.2757,-283.53426 1105.0384,-283.16941 1102.6822,-282.28485 C 1099.3511,-281.03428 1096.852,-280.13141 1095.6563,-279.21875 C 1094.1202,-279.19749 1091.9358,-278.98544 1090,-278.5 C 1087.0185,-277.75234 1085.1448,-277.32599 1083.25,-276.90625 C 1081.3552,-276.48653 1081.5745,-276.26406 1080.375,-276.03125 C 1079.0784,-275.77959 1078.6536,-276.04024 1074.9375,-275.25 C 1071.4476,-274.50786 1066.0427,-273.31893 1064.7813,-272.5625 C 1063.1974,-272.74329 1060.9138,-272.88428 1058.9375,-272.59375 C 1055.8971,-272.1468 1054.0213,-271.92099 1052.0938,-271.6875 C 1051.4384,-271.60813 1051.0527,-271.48672 1050.75,-271.40625 C 1050.3238,-271.2746 1050.0642,-271.14623 1049.375,-271.0625 C 1048.0634,-270.90314 1047.6128,-271.21933 1043.8438,-270.78125 C 1040.2899,-270.36817 1034.8384,-269.50843 1033.5938,-268.84375 C 1031.9948,-269.14105 1029.736,-269.37794 1027.75,-269.1875 C 1024.6912,-268.89419 1022.778,-268.70351 1020.8438,-268.53125 C 1018.9095,-268.35899 1019.1551,-268.10888 1017.9375,-268 C 1016.6213,-267.88231 1016.1777,-268.16363 1012.4063,-267.75 C 1008.8644,-267.36156 1003.3984,-266.54073 1002.125,-265.875 C 1000.5261,-266.1697 998.23783,-266.38201 996.25,-266.1875 C 993.19176,-265.88826 991.30887,-265.70726 989.375,-265.53125 C 988.71751,-265.47141 988.33496,-265.35269 988.03125,-265.28125 C 987.6036,-265.1623 987.34774,-265.06318 986.65625,-265 C 985.34029,-264.87975 984.89649,-265.19488 981.125,-264.78125 C 977.56886,-264.39124 972.11946,-263.54209 970.875,-262.875 C 969.27637,-263.16919 967.01516,-263.39872 965.03125,-263.1875 C 961.97565,-262.86218 960.05721,-262.66126 958.125,-262.46875 C 956.19279,-262.27625 956.43513,-262.02787 955.21875,-261.90625 C 953.90387,-261.77479 953.45577,-262.07079 949.6875,-261.625 C 946.14863,-261.20635 940.70982,-260.33283 939.4375,-259.65625 C 937.83995,-259.9373 935.57754,-260.07668 933.59375,-259.84375 C 930.54177,-259.48539 928.64867,-259.27589 926.71875,-259.0625 C 926.06255,-258.98995 925.67809,-258.88981 925.375,-258.8125 C 924.94823,-258.68528 924.69009,-258.5453 924,-258.46875 C 922.68667,-258.32307 922.23254,-258.64277 918.46875,-258.15625 C 914.91986,-257.6975 909.49012,-256.73723 908.25,-256.03125 C 906.65695,-256.27549 904.41619,-256.4126 902.4375,-256.15625 C 899.38991,-255.76144 897.48679,-255.5078 895.5625,-255.25 C 893.63822,-254.99221 893.83639,-254.75647 892.625,-254.59375 C 891.31554,-254.41785 890.87781,-254.69813 887.125,-254.125 C 883.60071,-253.58676 878.20185,-252.42583 876.9375,-251.6875 C 875.35,-251.89104 873.092,-251.94223 871.125,-251.59375 C 868.09883,-251.05763 866.22611,-250.73206 864.3125,-250.40625 C 863.66189,-250.29548 863.29879,-250.13531 863,-250.03125 C 862.57933,-249.86637 862.33655,-249.69995 861.65625,-249.5625 C 860.3616,-249.30091 859.92913,-249.5687 856.21875,-248.75 C 852.72022,-247.97805 847.3728,-246.36707 846.15625,-245.53125 C 844.59347,-245.6087 842.39867,-245.44597 840.46875,-244.9375 C 837.49631,-244.15437 835.65114,-243.70541 833.78125,-243.1875 C 831.91137,-242.6696 832.11465,-242.42022 830.9375,-242.09375 C 829.66504,-241.74085 829.24047,-241.98666 825.59375,-240.90625 C 822.16905,-239.89162 816.94431,-237.97308 815.71875,-237.0625 C 814.17992,-237.04976 811.99892,-236.79028 810.09375,-236.1875 C 807.16269,-235.26016 805.34344,-234.72908 803.5,-234.125 C 802.87324,-233.91962 802.50827,-233.73242 802.21875,-233.59375 C 801.81112,-233.38014 801.56541,-233.185 800.90625,-232.96875 C 799.65179,-232.55721 799.22014,-232.77971 795.625,-231.53125 C 792.23515,-230.35408 787.03002,-228.31755 785.84375,-227.375 C 784.31986,-227.31533 782.1937,-226.98013 780.3125,-226.3125 C 777.41511,-225.28421 775.61342,-224.63702 773.78125,-224 C 771.94908,-223.36299 772.1534,-223.15146 771,-222.75 C 769.75322,-222.31604 769.33639,-222.55028 765.78125,-221.1875 C 762.44258,-219.9077 757.2941,-217.70495 756.09375,-216.71875 C 754.58657,-216.61106 752.45806,-216.21995 750.59375,-215.5 C 747.72557,-214.3924 745.96995,-213.71844 744.15625,-213.03125 C 743.53959,-212.79762 743.15984,-212.58922 742.875,-212.4375 C 742.875,-212.4375 742.875,-211.34375 742.875,-211.34375 C 742.98678,-211.56611 743.26099,-212.16118 743.78125,-212.4375 C 744.47922,-212.80822 748.59488,-214.43087 750.59375,-215.15625 C 752.25061,-215.7575 754.74764,-216.48493 756.5625,-216.46875 C 756.86412,-216.46606 757.15012,-216.41785 757.40625,-216.375 C 759.24874,-216.06675 764.875,-214.8125 764.875,-214.8125 C 764.87499,-214.8125 758.64151,-216.45925 757.84375,-216.65625 C 757.65296,-216.70336 757.30803,-216.72497 756.875,-216.71875 C 758.02046,-217.58846 761.636,-219.11226 764.21875,-220.15625 C 767.05697,-221.30352 767.33556,-221.40807 769.28125,-221.8125 C 771.28955,-222.22994 772.4375,-222.3125 772.4375,-222.3125 C 772.4375,-222.31249 772.35514,-222.91364 773.40625,-223.4375 C 774.11135,-223.78891 778.29327,-225.3299 780.3125,-226 C 782.2644,-226.64773 785.3699,-227.3585 787.1875,-227 C 789.05073,-226.6325 794.71875,-225.1875 794.71875,-225.1875 C 794.71876,-225.1875 788.43175,-227.05861 787.625,-227.28125 C 787.43208,-227.3345 787.09416,-227.36729 786.65625,-227.375 C 787.81459,-228.20788 791.45069,-229.57032 794.0625,-230.53125 C 796.93266,-231.58726 797.22984,-231.69305 799.1875,-232.0625 C 801.04099,-232.41229 802.04634,-232.48798 802.21875,-232.5 C 802.33235,-232.71724 802.5962,-233.31002 803.125,-233.5625 C 803.83444,-233.90124 808.05107,-235.27525 810.09375,-235.875 C 811.78692,-236.37211 814.33452,-236.91177 816.1875,-236.78125 C 816.49545,-236.75957 816.80099,-236.68399 817.0625,-236.625 C 818.94368,-236.20068 824.65625,-234.59375 824.65625,-234.59375 C 824.65626,-234.59375 818.31451,-236.659 817.5,-236.90625 C 817.30521,-236.96539 816.94212,-237.01019 816.5,-237.03125 C 817.66949,-237.8288 821.36302,-239.08747 824,-239.96875 C 826.89781,-240.93722 827.23301,-240.97207 829.21875,-241.25 C 831.2684,-241.53689 832.40625,-241.5625 832.40625,-241.5625 C 832.40623,-241.5625 832.3335,-242.16947 833.40625,-242.625 C 834.12585,-242.93057 838.39723,-244.12575 840.46875,-244.625 C 842.47119,-245.10758 845.66724,-245.55329 847.53125,-245.03125 C 849.44203,-244.4961 855.25,-242.53125 855.25,-242.53125 C 855.25,-242.53125 848.82734,-244.95476 848,-245.25 C 847.80216,-245.32061 847.41784,-245.39039 846.96875,-245.4375 C 848.15665,-246.16615 851.88402,-247.21158 854.5625,-247.9375 C 857.50592,-248.73525 857.85458,-248.70833 859.875,-248.84375 C 861.78789,-248.97198 862.82205,-248.91484 863,-248.90625 C 863.11728,-249.10991 863.39176,-249.68573 863.9375,-249.875 C 864.66969,-250.12894 869.01602,-250.92289 871.125,-251.25 C 872.87313,-251.52111 875.52588,-251.7347 877.4375,-251.34375 C 877.75516,-251.27879 878.04272,-251.15824 878.3125,-251.0625 C 880.25324,-250.37377 886.15625,-247.96875 886.15625,-247.96875 C 886.15626,-247.96875 879.62154,-250.91952 878.78125,-251.28125 C 878.58028,-251.36776 878.20612,-251.44804 877.75,-251.53125 C 878.9565,-252.16443 882.77956,-252.92685 885.5,-253.4375 C 888.48953,-253.99869 888.80023,-253.96704 890.84375,-253.96875 C 892.95301,-253.97052 894.15625,-253.84375 894.15625,-253.84375 C 894.15625,-253.84374 894.08354,-254.47494 895.1875,-254.78125 C 895.92802,-254.98672 900.31362,-255.61512 902.4375,-255.84375 C 904.49052,-256.06474 907.75613,-256.09597 909.65625,-255.375 C 911.60404,-254.63593 917.5,-252 917.5,-252 C 917.50002,-252 910.93712,-255.17897 910.09375,-255.5625 C 909.89207,-255.65423 909.55154,-255.74871 909.09375,-255.84375 C 910.30467,-256.44563 914.07817,-257.09259 916.8125,-257.5 C 919.8173,-257.94772 920.13801,-257.9517 922.1875,-257.90625 C 924.12795,-257.86323 925.19449,-257.71202 925.375,-257.6875 C 925.49392,-257.88066 925.7589,-258.45333 926.3125,-258.59375 C 927.05521,-258.78213 931.46679,-259.32803 933.59375,-259.53125 C 935.35678,-259.69967 938.01384,-259.76554 939.9375,-259.28125 C 940.25718,-259.20077 940.54101,-259.07766 940.8125,-258.96875 C 942.76543,-258.18526 948.71875,-255.5 948.71875,-255.5 C 948.71873,-255.5 942.12684,-258.75348 941.28125,-259.15625 C 941.07903,-259.25257 940.70899,-259.36328 940.25,-259.46875 C 941.46414,-260.04302 945.29366,-260.59094 948.03125,-260.96875 C 951.03963,-261.38395 951.35432,-261.41138 953.40625,-261.34375 C 955.52423,-261.27394 956.71875,-261.09375 956.71875,-261.09375 C 956.71873,-261.09375 956.6415,-261.73116 957.75,-262 C 958.49362,-262.18035 962.90176,-262.66355 965.03125,-262.84375 C 967.08972,-263.01792 970.37449,-262.96807 972.28125,-262.1875 C 974.23584,-261.38734 980.15625,-258.65625 980.15625,-258.65625 C 980.15623,-258.65625 973.59632,-261.96501 972.75,-262.375 C 972.54763,-262.47305 972.17814,-262.5781 971.71875,-262.6875 C 972.93392,-263.2514 976.72883,-263.8018 979.46875,-264.15625 C 982.47966,-264.54577 982.79006,-264.5539 984.84375,-264.46875 C 986.78814,-264.38815 987.85038,-264.21551 988.03125,-264.1875 C 988.15041,-264.37836 988.41402,-264.93281 988.96875,-265.0625 C 989.71301,-265.2365 994.11868,-265.71297 996.25,-265.875 C 998.01662,-266.00927 1000.6997,-266.00071 1002.625,-265.5 C 1002.945,-265.41679 1003.2283,-265.29873 1003.5,-265.1875 C 1005.4546,-264.38734 1011.4063,-261.625 1011.4063,-261.625 C 1011.4062,-261.625 1004.8151,-264.96501 1003.9688,-265.375 C 1003.7664,-265.47305 1003.3969,-265.57811 1002.9375,-265.6875 C 1004.1526,-266.2514 1007.9788,-266.77056 1010.7188,-267.125 C 1013.7297,-267.51453 1014.0713,-267.5539 1016.125,-267.46875 C 1018.2447,-267.38087 1019.4375,-267.15625 1019.4375,-267.15625 C 1019.4375,-267.15625 1019.3591,-267.80527 1020.4688,-268.0625 C 1021.2131,-268.23506 1025.6183,-268.68586 1027.75,-268.84375 C 1029.8106,-268.99635 1033.0929,-268.94052 1035,-268.15625 C 1036.955,-267.3523 1042.875,-264.65625 1042.875,-264.65625 C 1042.875,-264.65625 1036.3152,-267.93212 1035.4688,-268.34375 C 1035.2663,-268.44219 1034.897,-268.54597 1034.4375,-268.65625 C 1035.6529,-269.21779 1039.4494,-269.78403 1042.1875,-270.15625 C 1045.1965,-270.5653 1045.5102,-270.57183 1047.5625,-270.5 C 1049.5056,-270.43201 1050.5697,-270.33515 1050.75,-270.3125 C 1050.8688,-270.5069 1051.1346,-271.04131 1051.6875,-271.1875 C 1052.4293,-271.38362 1056.8186,-272.01628 1058.9375,-272.28125 C 1060.6939,-272.50086 1063.3428,-272.61356 1065.25,-272.25 C 1065.5669,-272.18959 1065.8558,-272.06062 1066.125,-271.96875 C 1068.0612,-271.30783 1073.9688,-269.03125 1073.9688,-269.03125 C 1073.9687,-269.03125 1067.4321,-271.8378 1066.5938,-272.1875 C 1066.3933,-272.27113 1066.0176,-272.36083 1065.5625,-272.4375 C 1066.7662,-273.08796 1070.5816,-273.80945 1073.2813,-274.4375 C 1076.248,-275.1277 1076.5702,-275.19257 1078.5938,-275.3125 C 1080.6824,-275.4363 1081.875,-275.34375 1081.875,-275.34375 C 1081.875,-275.34374 1081.788,-275.9758 1082.875,-276.375 C 1083.6042,-276.6428 1087.9222,-277.71297 1090,-278.1875 C 1092.0085,-278.64619 1095.1679,-279.2168 1097,-278.8125 C 1098.8781,-278.39804 1110.5782,-275.79687 1110.5782,-275.79687 C 1110.5782,-275.79687 1098.2507,-278.81953 1097.4375,-279.0625 C 1097.243,-279.12062 1096.8789,-279.16876 1096.4375,-279.1875 C 1097.6051,-279.99119 1099.9517,-280.8748 1102.5469,-281.89062 C 1104.2283,-282.5488 1103.4706,-282.26721 1105.3228,-282.89422 C 1107.0764,-283.48788 1107.8082,-283.90493 1107.9532,-284.00721 C 1108.2993,-284.21372 1107.5972,-284.12909 1107.409,-284.04961 z"
+- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7001);enable-background:new"
+- sodipodi:nodetypes="czscsssscssssscsssscssssscsssscssssscsssscssssscsssscssssscsssscssccsssscscsscssscscsscsssscscsscssscscsscsssscscsscssscscsscsssscscsscssscscsscsssscscsscssscscsscsssscscsscssscscsscc" />
+- <path
+- id="path8095"
+- d="M 1082.625,-275.125 C 1084.498,-274.73152 1087.1211,-273.97945 1088.6563,-273.15625 C 1090.1915,-272.33306 1091.4785,-272.10025 1094.0313,-270.65625 C 1096.5579,-269.22699 1098.8271,-268.64929 1101,-268.125 C 1103.3476,-267.55858 1106.4354,-267.40977 1109.8438,-266.9375 C 1108.7549,-267.77725 1103.2364,-268.10995 1101.4375,-268.5 C 1099.6386,-268.89006 1097.5434,-269.51616 1094.8438,-270.8125 C 1092.1441,-272.10884 1091.3494,-272.61146 1089.0313,-273.5 C 1086.7131,-274.38854 1085.0269,-274.88314 1082.625,-275.125 z"
+- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6949);enable-background:new" />
+- <path
+- id="path8097"
+- d="M 1051.4688,-270 C 1053.3741,-269.42241 1055.9969,-268.38428 1057.5625,-267.40625 C 1059.1281,-266.42823 1060.4427,-266.04644 1063.0625,-264.28125 C 1065.6555,-262.53409 1068.0484,-261.57198 1070.3125,-260.6875 C 1072.7586,-259.73193 1075.9951,-259.03037 1079.7188,-257.625 C 1078.5292,-258.76284 1072.6557,-260.31175 1070.7813,-261 C 1068.9068,-261.68825 1066.6995,-262.5662 1063.9063,-264.28125 C 1061.113,-265.99629 1060.3327,-266.56515 1057.9688,-267.6875 C 1055.6047,-268.80984 1053.9121,-269.52205 1051.4688,-270 z"
+- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6961);enable-background:new" />
+- <path
+- id="path8099"
+- d="M 1020.2188,-266.84375 C 1022.1307,-266.20564 1024.8,-265.08839 1026.375,-264.03125 C 1027.9501,-262.9741 1029.2706,-262.52258 1031.9063,-260.625 C 1034.5149,-258.74679 1036.9347,-257.59497 1039.2188,-256.5625 C 1041.6865,-255.44705 1044.9833,-254.3892 1048.75,-252.71875 C 1047.5467,-253.94128 1041.5472,-256.03298 1039.6563,-256.84375 C 1037.7653,-257.65452 1035.5914,-258.73754 1032.7813,-260.59375 C 1029.9711,-262.44995 1029.1595,-263.07068 1026.7813,-264.3125 C 1024.403,-265.5543 1022.6706,-266.28819 1020.2188,-266.84375 z"
+- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6957);enable-background:new" />
+- <path
+- id="path8101"
+- d="M 1110.1719,-266.89063 C 1110.3227,-266.84207 1110.8599,-266.25963 1110.2813,-265.40625 C 1109.4712,-264.21166 1104.5764,-262.08196 1101.7188,-261.28125 C 1098.8739,-260.48413 1095.4287,-260.30351 1091.1563,-261.65625 C 1086.8547,-263.0182 1085.6866,-264.12497 1080.5,-265.96875 C 1085.164,-263.85358 1086.6953,-262.01642 1090.625,-260.625 C 1092.2457,-260.05113 1093.9921,-259.6854 1095.6875,-259.59375 C 1095.2424,-259.26812 1094.1572,-258.61045 1092.125,-258 C 1089.3295,-257.16031 1085.4759,-256.46622 1083.875,-256.375 C 1082.3604,-256.28868 1080.733,-256.88749 1080.4375,-257 C 1080.6042,-256.89692 1080.8107,-256.62266 1080.1875,-255.96875 C 1079.2882,-255.02512 1074.0401,-254.04575 1071.0625,-253.71875 C 1068.0982,-253.3932 1064.5409,-253.73471 1060.1563,-255.625 C 1056.1783,-257.33997 1054.8173,-258.54036 1050.75,-260.375 C 1050.75,-260.375 1050.75,-260.21875 1050.75,-260.21875 C 1054.3931,-258.12346 1056.034,-256.33548 1059.625,-254.65625 C 1061.3552,-253.84716 1063.2167,-253.24749 1065.0313,-252.9375 C 1064.4964,-252.65074 1063.4735,-252.22599 1061.5938,-251.90625 C 1058.7248,-251.41829 1054.7848,-251.09011 1053.1563,-251.15625 C 1052.3056,-251.19079 1051.4277,-251.34062 1050.75,-251.5625 C 1050.0652,-251.77738 1049.5603,-252.00717 1049.4375,-252.0625 C 1049.6069,-251.95529 1049.8686,-251.65962 1049.2188,-251.03125 C 1048.3091,-250.15163 1042.9727,-249.69487 1039.9688,-249.5625 C 1036.9783,-249.43071 1033.3799,-250.01313 1028.9688,-252.125 C 1024.5276,-254.25126 1023.3273,-255.5266 1018.0625,-257.90625 C 1022.7968,-255.30921 1024.349,-253.27715 1028.4063,-251.1875 C 1030.0796,-250.32565 1031.8915,-249.69325 1033.6563,-249.25 C 1033.193,-249.01668 1032.0669,-248.56186 1029.9688,-248.3125 C 1027.0825,-247.96952 1023.1342,-247.81962 1021.5,-247.9375 C 1019.9538,-248.049 1018.2688,-248.79446 1017.9688,-248.9375 C 1018.1379,-248.81721 1018.3826,-248.52702 1017.75,-247.9375 C 1016.8372,-247.08677 1011.5059,-246.67538 1008.5,-246.5625 C 1005.5075,-246.45013 1001.9103,-247.05293 997.5,-249.15625 C 993.49875,-251.06448 992.11197,-252.29408 988.03125,-254.25 C 988.03122,-254.25 988.03125,-254.09375 988.03125,-254.09375 C 991.68631,-251.88983 993.32546,-250.0412 996.9375,-248.1875 C 998.67779,-247.29435 1000.5745,-246.65923 1002.4063,-246.21875 C 1001.8663,-245.97045 1000.8282,-245.60342 998.9375,-245.375 C 996.05182,-245.02642 992.07145,-244.85405 990.4375,-244.96875 C 989.58405,-245.02865 988.71119,-245.22666 988.03125,-245.46875 C 987.34415,-245.70405 986.8419,-245.94101 986.71875,-246 C 986.88873,-245.88773 987.18323,-245.57775 986.53125,-244.96875 C 985.6186,-244.11625 980.25592,-243.67538 977.25,-243.5625 C 974.25754,-243.45013 970.65654,-244.09055 966.25,-246.15625 C 961.81347,-248.23603 960.60312,-249.48796 955.34375,-251.8125 C 960.07313,-249.26501 961.63449,-247.2347 965.6875,-245.1875 C 967.35905,-244.34317 969.17304,-243.72107 970.9375,-243.28125 C 970.47427,-243.04703 969.3478,-242.59718 967.25,-242.34375 C 964.36431,-241.99517 960.4138,-241.77423 958.78125,-241.875 C 957.23669,-241.97032 955.58094,-242.70385 955.28125,-242.84375 C 955.45024,-242.72522 955.66317,-242.4399 955.03125,-241.84375 C 954.11939,-240.98347 948.7846,-240.5135 945.78125,-240.375 C 942.7913,-240.2371 939.2138,-240.82568 934.8125,-242.84375 C 930.81942,-244.67464 929.44739,-245.87295 925.375,-247.75 C 925.37498,-247.75 925.375,-247.59375 925.375,-247.59375 C 929.02261,-245.46048 930.64533,-243.65888 934.25,-241.875 C 935.98675,-241.01549 937.85727,-240.42486 939.6875,-240 C 939.14803,-239.7471 938.13687,-239.35871 936.25,-239.09375 C 933.37022,-238.68939 929.41187,-238.44813 927.78125,-238.53125 C 926.92953,-238.57466 926.05355,-238.7398 925.375,-238.96875 C 924.68931,-239.19076 924.1854,-239.41214 924.0625,-239.46875 C 924.23209,-239.35976 924.4944,-239.0591 923.84375,-238.4375 C 922.93296,-237.56736 917.59354,-237.04598 914.59375,-236.875 C 911.60742,-236.70479 908.01994,-237.19077 903.625,-239.15625 C 899.20011,-241.13513 898.01904,-242.38444 892.78125,-244.53125 C 897.49122,-242.14358 899.05142,-240.14252 903.09375,-238.1875 C 904.7609,-237.38119 906.55418,-236.79092 908.3125,-236.40625 C 907.85087,-236.15755 906.7155,-235.694 904.625,-235.375 C 901.7494,-234.93624 897.8446,-234.6419 896.21875,-234.6875 C 894.68052,-234.73062 892.98595,-235.43272 892.6875,-235.5625 C 892.85583,-235.44968 893.09807,-235.14875 892.46875,-234.53125 C 891.56063,-233.64015 886.2658,-233.003 883.28125,-232.71875 C 880.31007,-232.43577 876.70783,-232.89455 872.34375,-234.65625 C 868.38441,-236.25456 867.0146,-237.45112 863,-238.96875 C 863.00003,-238.96875 863,-238.8125 863,-238.8125 C 866.5959,-237.00115 868.23831,-235.23017 871.8125,-233.65625 C 873.53457,-232.8979 875.39998,-232.3673 877.21875,-232.03125 C 876.68266,-231.75217 875.65217,-231.34362 873.78125,-230.96875 C 870.92586,-230.39665 866.99183,-229.94936 865.375,-229.9375 C 864.53049,-229.93129 863.66892,-230.01844 863,-230.1875 C 862.32409,-230.34901 861.83991,-230.51673 861.71875,-230.5625 C 861.88597,-230.46848 862.14142,-230.17902 861.5,-229.5 C 860.60213,-228.54948 855.31352,-227.58292 852.375,-227.0625 C 849.44966,-226.54441 845.94285,-226.68826 841.65625,-228.09375 C 837.34045,-229.50882 836.18348,-230.62369 831.09375,-232.0625 C 835.6706,-230.31149 837.1823,-228.50244 841.125,-227.0625 C 842.75108,-226.46861 844.49385,-226.10685 846.21875,-225.90625 C 845.7659,-225.60923 844.66397,-225.02286 842.625,-224.4375 C 839.82028,-223.63233 835.98614,-222.86167 834.40625,-222.6875 C 832.9115,-222.5227 831.29002,-223.00431 831,-223.09375 C 831.16356,-223.00368 831.39278,-222.73382 830.78125,-222.03125 C 829.89878,-221.0174 824.73673,-219.6596 821.84375,-218.96875 C 818.96373,-218.28097 815.50815,-218.20873 811.28125,-219.40625 C 807.4464,-220.4927 806.10867,-221.47862 802.21875,-222.53125 C 802.21874,-222.53125 802.21875,-222.375 802.21875,-222.375 C 805.70293,-220.98015 807.28816,-219.4556 810.75,-218.34375 C 812.41793,-217.80803 814.20578,-217.55701 815.96875,-217.46875 C 815.44911,-217.11663 814.46836,-216.55423 812.65625,-215.9375 C 809.89059,-214.99625 806.06601,-214.00213 804.5,-213.78125 C 803.68206,-213.66586 802.8669,-213.65842 802.21875,-213.75 C 801.56379,-213.83321 801.08615,-213.96827 800.96875,-214 C 801.13079,-213.92536 801.40274,-213.65956 800.78125,-212.90625 C 799.91125,-211.85172 794.77162,-210.247 791.90625,-209.46875 C 789.05372,-208.69399 785.64713,-208.51055 781.46875,-209.5625 C 777.26192,-210.62163 776.11206,-211.60416 771.125,-212.71875 C 775.60954,-211.25929 777.09435,-209.58352 780.9375,-208.46875 C 782.52254,-208.00898 784.22429,-207.8305 785.90625,-207.78125 C 785.46468,-207.44449 784.39374,-206.75352 782.40625,-206 C 779.67232,-204.96351 775.95427,-203.83731 774.40625,-203.5625 C 772.94163,-203.30248 771.34667,-203.67904 771.0625,-203.75 C 771.22275,-203.67035 771.44294,-203.42902 770.84375,-202.6875 C 769.97909,-201.61744 764.92723,-199.86935 762.09375,-199 C 759.27295,-198.13453 755.88625,-197.84369 751.75,-198.78125 C 747.99741,-199.63186 746.70215,-200.49772 742.875,-201.375 C 742.875,-201.375 742.875,-201.21875 742.875,-201.21875 C 746.30296,-199.98096 747.86241,-198.58645 751.25,-197.6875 C 752.88216,-197.25436 754.61704,-197.10449 756.34375,-197.125 C 755.83482,-196.74083 754.867,-196.10318 753.09375,-195.375 C 750.38741,-194.26366 746.65742,-193.06719 745.125,-192.75 C 744.3246,-192.58431 743.51269,-192.53138 742.875,-192.59375 C 742.875,-192.59375 742.875,-192.07823 742.875,-191.67146 C 742.875,-191.40639 742.875,-191.1875 742.875,-191.1875 C 743.10145,-191.33218 743.32391,-191.46011 743.59375,-191.5625 C 744.67427,-191.97248 745.76536,-191.77827 749.59375,-193.25 C 753.42218,-194.72174 754.81787,-195.25498 755.5,-195.65625 C 756.1796,-196.05603 757.11165,-196.53562 757.71875,-197.1875 C 759.5456,-197.32525 761.2895,-197.68073 762.65625,-198.1875 C 765.62437,-199.28802 767.53162,-199.99369 769.4375,-200.65625 C 771.34336,-201.31879 771.79159,-202.07112 772.84375,-202.4375 C 773.9353,-202.81761 775.03886,-202.60288 778.90625,-203.96875 C 782.7737,-205.33461 784.18941,-205.79583 784.875,-206.1875 C 785.57609,-206.58802 786.57581,-207.12048 787.1875,-207.78125 C 789.1583,-207.83591 791.00435,-208.16588 792.46875,-208.65625 C 795.47023,-209.66133 797.3949,-210.27796 799.3125,-210.90625 C 800.8511,-211.41035 801.48652,-211.95302 802.21875,-212.34375 C 802.44891,-212.47806 802.69449,-212.59748 802.96875,-212.6875 C 804.06698,-213.04798 805.1502,-212.76887 809.0625,-214 C 812.97483,-215.23113 814.42855,-215.67295 815.125,-216.03125 C 815.81888,-216.38822 816.75515,-216.82386 817.375,-217.4375 C 819.24021,-217.46016 821.01081,-217.70433 822.40625,-218.125 C 825.43668,-219.03854 827.39863,-219.5551 829.34375,-220.09375 C 831.28886,-220.63239 831.76993,-221.35827 832.84375,-221.65625 C 833.95776,-221.9654 835.06369,-221.64886 839.03125,-222.6875 C 842.99886,-223.72613 844.44883,-224.12023 845.15625,-224.4375 C 845.89112,-224.76709 846.97008,-225.19122 847.59375,-225.8125 C 849.59149,-225.6965 851.45118,-225.83259 852.9375,-226.1875 C 856.01561,-226.9225 858.02094,-227.28844 860,-227.6875 C 861.58792,-228.00768 862.24429,-228.47805 863,-228.78125 C 863.23757,-228.88805 863.46695,-228.97401 863.75,-229.03125 C 864.88347,-229.26044 866.05448,-228.82232 870.09375,-229.53125 C 874.13308,-230.24018 875.594,-230.45834 876.3125,-230.71875 C 877.02836,-230.97819 878.01678,-231.28599 878.65625,-231.8125 C 880.58052,-231.57301 882.40413,-231.58797 883.84375,-231.8125 C 886.97008,-232.30012 888.9983,-232.51317 891,-232.78125 C 893.00171,-233.04932 893.48869,-233.72639 894.59375,-233.875 C 895.74014,-234.02918 896.86967,-233.57343 900.9375,-234.09375 C 905.00534,-234.61407 906.49763,-234.78948 907.21875,-235.03125 C 907.95585,-235.27839 909.01684,-235.61748 909.65625,-236.15625 C 911.70632,-235.82072 913.63003,-235.75829 915.15625,-235.9375 C 918.29856,-236.30646 920.33619,-236.49686 922.34375,-236.71875 C 923.95451,-236.89677 924.60842,-237.32695 925.375,-237.5625 C 925.61594,-237.64802 925.86912,-237.7181 926.15625,-237.75 C 927.30603,-237.87772 928.45754,-237.40335 932.53125,-237.875 C 936.60499,-238.34665 938.09034,-238.4856 938.8125,-238.71875 C 939.53196,-238.95102 940.51274,-239.19221 941.15625,-239.6875 C 943.09262,-239.35404 944.92631,-239.28326 946.375,-239.4375 C 949.52102,-239.77245 951.55256,-239.95609 953.5625,-240.15625 C 955.57246,-240.35639 956.04664,-240.98264 957.15625,-241.09375 C 958.30739,-241.20903 959.45268,-240.72869 963.53125,-241.15625 C 967.60986,-241.58381 969.12011,-241.71834 969.84375,-241.9375 C 970.5829,-242.16136 971.63947,-242.45075 972.28125,-242.96875 C 974.33835,-242.57008 976.28312,-242.47535 977.8125,-242.625 C 980.96123,-242.9331 982.98834,-243.09825 985,-243.28125 C 986.61407,-243.42807 987.2631,-243.8418 988.03125,-244.0625 C 988.27267,-244.14336 988.52478,-244.19241 988.8125,-244.21875 C 989.96461,-244.3242 991.10546,-243.826 995.1875,-244.21875 C 999.26958,-244.6115 1000.7764,-244.74959 1001.5,-244.96875 C 1002.2209,-245.18708 1003.1997,-245.41645 1003.8438,-245.90625 C 1005.7818,-245.55626 1007.6126,-245.45187 1009.0625,-245.59375 C 1012.2112,-245.90185 1014.2383,-246.067 1016.25,-246.25 C 1018.2616,-246.43299 1018.7642,-247.08802 1019.875,-247.1875 C 1021.0273,-247.29073 1022.1672,-246.80267 1026.25,-247.1875 C 1030.3329,-247.57232 1031.8387,-247.6885 1032.5625,-247.90625 C 1033.3018,-248.12868 1034.3581,-248.42074 1035,-248.9375 C 1037.0574,-248.53573 1039.0029,-248.43417 1040.5313,-248.59375 C 1043.6779,-248.92227 1045.7084,-249.11645 1047.7188,-249.3125 C 1049.3318,-249.46979 1049.9844,-249.94398 1050.75,-250.1875 C 1050.9907,-250.27554 1051.2132,-250.30887 1051.5,-250.34375 C 1052.6483,-250.48345 1053.8167,-250.00384 1057.875,-250.59375 C 1061.9333,-251.18367 1063.4368,-251.37089 1064.1563,-251.625 C 1064.873,-251.87816 1065.8308,-252.18307 1066.4688,-252.71875 C 1068.3885,-252.50681 1070.1887,-252.56734 1071.625,-252.8125 C 1074.7441,-253.3449 1076.7366,-253.74111 1078.7188,-254.125 C 1080.7009,-254.50887 1081.1931,-255.16465 1082.2813,-255.40625 C 1083.4101,-255.65691 1084.5516,-255.28996 1088.5313,-256.28125 C 1092.5109,-257.27253 1093.9609,-257.70055 1094.6563,-258.0625 C 1095.3786,-258.43851 1096.4182,-258.93308 1097.0313,-259.59375 C 1098.9943,-259.6058 1100.825,-259.8848 1102.25,-260.4375 C 1105.2012,-261.58211 1107.1232,-262.30692 1108.9375,-263.1875 C 1110.3932,-263.89403 1111.2723,-264.87391 1111.4844,-265.17188 C 1111.6966,-265.46984 1111.5962,-265.91718 1111.6223,-265.93863 C 1111.6652,-265.97387 1111.9416,-266.0236 1112.1013,-266.36707 C 1112.9602,-268.21415 1114.4223,-272.01166 1114.5365,-272.69652 C 1114.6502,-273.37868 1114.7003,-274.04426 1114.751,-274.44149 C 1114.7804,-274.67101 1114.6043,-275.30693 1114.6264,-275.36553 C 1114.6573,-275.44759 1114.9309,-275.63081 1114.9863,-275.88024 C 1115.2526,-277.07857 1115.0752,-278.07153 1114.8612,-279.48917 C 1114.6472,-280.90681 1113.8775,-284.11131 1113.2243,-284.96543 C 1112.5654,-285.82715 1112.0014,-285.9766 1111.4764,-285.96609 C 1111.2678,-285.69633 1111.6132,-285.703 1111.639,-285.65348 C 1112.3196,-285.60269 1112.573,-285.28484 1113.0582,-284.75686 C 1113.5434,-284.22888 1114.501,-280.8173 1114.6376,-279.36691 C 1114.7742,-277.91652 1114.8276,-276.50671 1114.5496,-275.89827 C 1114.2715,-275.28982 1113.6054,-275.46963 1113.313,-275.40375 C 1113.844,-275.21786 1114.2038,-275.19053 1114.2654,-274.34607 C 1114.3247,-273.53269 1114.1322,-272.70638 1113.7456,-271.54045 C 1113.3544,-270.36044 1111.9004,-267.19047 1111.4599,-266.94168 C 1111.0076,-266.68617 1110.5075,-266.75969 1110.1719,-266.89063 z"
+- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6997);enable-background:new"
+- sodipodi:nodetypes="cssscscsscsssccscssssssscscsscsssscscssssssscscsscsssscscssssssscscsscsssscscssssssscscsscsssscscssssssscscsscsssccscsscscssscssssscsssssscssssscsssssscssssscsssssscssssscsssssscssssscsssssscssssscsszsszssszzcczzzczzzc" />
+- <path
+- id="path8103"
+- d="M 988.75,-263.84375 C 990.66161,-263.20935 993.30027,-262.08534 994.875,-261.03125 C 996.44977,-259.97716 997.7711,-259.54873 1000.4063,-257.65625 C 1003.0145,-255.78311 1005.4332,-254.64103 1007.7188,-253.59375 C 1010.1881,-252.46228 1013.4709,-251.43901 1017.25,-249.65625 C 1016.0428,-250.91465 1010.111,-253.0207 1008.2188,-253.84375 C 1006.3266,-254.66679 1004.0908,-255.77424 1001.2813,-257.625 C 998.47169,-259.47575 997.65906,-260.10654 995.28125,-261.34375 C 992.90343,-262.58094 991.20137,-263.29295 988.75,-263.84375 z"
+- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6953);enable-background:new" />
+- <path
+- id="path8105"
+- d="M 957.5,-260.78125 C 959.41,-260.16315 962.08288,-259.07191 963.65625,-258.03125 C 965.22964,-256.99059 966.55233,-256.54873 969.1875,-254.65625 C 971.79573,-252.7831 974.21442,-251.64104 976.5,-250.59375 C 978.96931,-249.46228 982.25213,-248.439 986.03125,-246.65625 C 984.82397,-247.91465 978.82971,-250.05195 976.9375,-250.875 C 975.04533,-251.69804 972.84084,-252.8055 970.03125,-254.65625 C 967.22167,-256.507 966.4383,-257.09557 964.0625,-258.3125 C 961.68672,-259.52941 959.94929,-260.25135 957.5,-260.78125 z"
+- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6993);enable-background:new" />
+- <path
+- id="path8107"
+- d="M 926.09375,-257.375 C 928.00147,-256.77755 930.64723,-255.71116 932.21875,-254.6875 C 933.79025,-253.66385 935.08897,-253.24779 937.71875,-251.40625 C 940.32166,-249.58352 942.74762,-248.43405 945.03125,-247.40625 C 947.49845,-246.29584 950.7866,-245.31302 954.5625,-243.5625 C 953.35627,-244.8106 947.3906,-246.88059 945.5,-247.6875 C 943.60942,-248.4944 941.39758,-249.57854 938.59375,-251.375 C 935.7899,-253.17144 934.96671,-253.77751 932.59375,-254.96875 C 930.22078,-256.15999 928.54013,-256.87158 926.09375,-257.375 z"
+- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6989);enable-background:new" />
+- <path
+- id="path8109"
+- d="M 894.90625,-253.5625 C 896.80838,-253.00895 899.49326,-251.97363 901.0625,-250.96875 C 902.63173,-249.96388 903.93651,-249.56011 906.5625,-247.75 C 909.16162,-245.95836 911.56284,-244.87811 913.84375,-243.875 C 916.30803,-242.79126 919.60359,-241.83471 923.375,-240.125 C 922.1702,-241.36007 916.20084,-243.36978 914.3125,-244.15625 C 912.42418,-244.94272 910.2373,-245.98705 907.4375,-247.75 C 904.63773,-249.51294 903.83831,-250.11836 901.46875,-251.28125 C 899.09918,-252.44413 897.3455,-253.11537 894.90625,-253.5625 z"
+- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6985);enable-background:new" />
+- <path
+- id="path8111"
+- d="M 863.71875,-248.65625 C 865.59937,-248.22716 868.22302,-247.27587 869.78125,-246.34375 C 871.33948,-245.41164 872.63358,-245.08599 875.25,-243.34375 C 877.83971,-241.61931 880.23067,-240.63573 882.5,-239.71875 C 884.95176,-238.72806 888.23959,-237.84168 892,-236.21875 C 890.79869,-237.42609 884.84751,-239.28484 882.96875,-240 C 881.09,-240.71517 878.88335,-241.68442 876.09375,-243.375 C 873.30412,-245.06557 872.50914,-245.60322 870.15625,-246.65625 C 867.80333,-247.70926 866.13041,-248.36873 863.71875,-248.65625 z"
+- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6965);enable-background:new" />
+- <path
+- id="path8113"
+- d="M 833.15625,-241.375 C 835.00461,-241.07856 837.6257,-240.39868 839.15625,-239.59375 C 840.68683,-238.78882 841.96999,-238.53802 844.53125,-237.0625 C 847.06629,-235.60204 849.42193,-234.73741 851.65625,-234 C 854.07024,-233.20332 857.31336,-232.53311 861.03125,-231.15625 C 859.84354,-232.28498 853.94353,-233.746 852.09375,-234.3125 C 850.24398,-234.879 848.09033,-235.68642 845.34375,-237.15625 C 842.59718,-238.62608 841.84239,-239.07653 839.53125,-239.9375 C 837.2201,-240.79845 835.52654,-241.25759 833.15625,-241.375 z"
+- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6981);enable-background:new" />
+- <path
+- id="path8115"
+- d="M 802.90625,-232.3125 C 804.72845,-232.10123 807.27201,-231.51193 808.78125,-230.78125 C 810.2905,-230.05059 811.53693,-229.85127 814.0625,-228.5 C 816.56226,-227.16254 818.89404,-226.45157 821.09375,-225.84375 C 823.47028,-225.18708 826.65839,-224.77087 830.3125,-223.65625 C 829.14515,-224.70121 823.38362,-225.75954 821.5625,-226.21875 C 819.74139,-226.67796 817.61025,-227.34571 814.90625,-228.65625 C 812.20222,-229.96677 811.43519,-230.37615 809.15625,-231.125 C 806.8773,-231.87383 805.243,-232.30431 802.90625,-232.3125 z"
+- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6977);enable-background:new" />
+- <path
+- id="path8117"
+- d="M 773.1875,-222.1875 C 774.99859,-222.0088 777.50809,-221.52244 779,-220.84375 C 780.49194,-220.16506 781.7534,-220.04553 784.25,-218.78125 C 786.72107,-217.52987 789.04005,-216.88511 791.21875,-216.34375 C 793.57262,-215.75887 796.71009,-215.44623 800.3125,-214.5 C 799.16166,-215.49116 793.45999,-216.2833 791.65625,-216.6875 C 789.85253,-217.0917 787.74072,-217.70866 785.0625,-218.9375 C 782.38432,-220.16634 781.65905,-220.54839 779.40625,-221.21875 C 777.15346,-221.88909 775.50998,-222.22107 773.1875,-222.1875 z"
+- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6973);enable-background:new" />
+- <path
+- id="path8119"
+- d="M 743.5625,-211.1875 C 745.35531,-211.05839 747.83563,-210.63785 749.3125,-210 C 750.7894,-209.36215 752.0286,-209.25844 754.5,-208.0625 C 756.94618,-206.87878 759.22054,-206.31584 761.375,-205.84375 C 763.70267,-205.33372 766.7946,-205.16311 770.375,-204.28125 C 769.23121,-205.25185 763.62741,-205.8719 761.84375,-206.21875 C 760.06008,-206.56559 757.9609,-207.10631 755.3125,-208.25 C 752.66409,-209.39368 751.91755,-209.76631 749.6875,-210.375 C 747.45742,-210.98368 745.86156,-211.28466 743.5625,-211.1875 z"
+- style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6969);enable-background:new" />
+- <g
+- id="g8121"
+- style="fill:#ffffff;fill-opacity:1;filter:url(#filter7345)">
+- <path
+- sodipodi:nodetypes="czzzczzc"
+- id="path8123"
+- d="M 744.9375,-212.11731 C 744.9375,-212.11731 752.15979,-215.34049 754,-215.61731 C 755.84021,-215.89413 757.35225,-215.62054 760,-215.05481 C 762.64775,-214.48908 768.7357,-212.83963 771.1875,-211.67981 C 773.6393,-210.51999 776.5,-208.11731 776.5,-208.11731 C 776.5,-208.11731 769.35356,-210.8975 766.3125,-211.67981 C 763.27144,-212.46212 758.66789,-213.76355 755.9375,-213.99231 C 753.20711,-214.22107 744.9375,-212.11731 744.9375,-212.11731 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+- <path
+- sodipodi:nodetypes="czzzczzc"
+- id="path8125"
+- d="M 735.46875,-206.95416 C 735.46875,-206.95416 739.12854,-209.17734 740.96875,-209.45416 C 742.80896,-209.73098 744.6335,-209.20739 747.28125,-208.64166 C 749.929,-208.07593 756.01695,-206.42648 758.46875,-205.26666 C 760.92055,-204.10684 765.03125,-203.14166 765.03125,-203.14166 C 765.03125,-203.14166 756.63481,-204.48435 753.59375,-205.26666 C 750.55269,-206.04897 745.63664,-207.6004 742.90625,-207.82916 C 740.17586,-208.05792 735.46875,-206.95416 735.46875,-206.95416 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- sodipodi:nodetypes="czzzczzc"
+- id="path8127"
+- d="M 759.85042,-217.61116 C 759.85042,-217.61116 768.39412,-220.90973 770.2482,-221.06902 C 772.10229,-221.22832 773.88986,-220.58982 776.4963,-219.85694 C 779.10274,-219.12406 785.07354,-217.091 787.44666,-215.77769 C 789.81978,-214.46438 793.86083,-213.23987 793.86083,-213.23987 C 793.86083,-213.23987 785.5667,-215.11352 782.58152,-216.08754 C 779.59633,-217.06156 774.78883,-218.92232 772.0785,-219.32416 C 769.36817,-219.726 759.85042,-217.61116 759.85042,-217.61116 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- sodipodi:nodetypes="czzzczzc"
+- id="path8129"
+- d="M 775.19813,-223.2266 C 775.19813,-223.2266 782.96946,-226.00904 784.82644,-226.13009 C 786.68341,-226.25113 788.45744,-225.57592 791.04822,-224.78947 C 793.63899,-224.00302 799.56662,-221.8473 801.91216,-220.48535 C 804.25771,-219.1234 808.27265,-217.81585 808.27265,-217.81585 C 808.27265,-217.81585 800.01892,-219.86008 797.05444,-220.89543 C 794.08997,-221.93078 789.32185,-223.89024 786.62038,-224.34786 C 783.91891,-224.80549 775.19813,-223.2266 775.19813,-223.2266 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- inkscape:transform-center-y="-4.3190906"
+- inkscape:transform-center-x="13.852145"
+- sodipodi:nodetypes="czzzczzc"
+- id="path8131"
+- d="M 789.64298,-227.95417 C 789.64298,-227.95417 798.32554,-231.47448 800.18452,-231.55952 C 802.04349,-231.64455 803.8041,-230.9351 806.37915,-230.09859 C 808.9542,-229.2621 814.83894,-226.99193 817.15766,-225.58479 C 819.47638,-224.17764 823.46523,-222.79255 823.46523,-222.79255 C 823.46523,-222.79255 815.25266,-224.99632 812.3088,-226.08891 C 809.36494,-227.1815 804.63568,-229.23299 801.94358,-229.74288 C 799.25149,-230.25276 789.64298,-227.95417 789.64298,-227.95417 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- inkscape:transform-center-y="-4.3190906"
+- inkscape:transform-center-x="13.852145"
+- sodipodi:nodetypes="czzzczzc"
+- id="path8133"
+- d="M 804.49513,-233.32948 C 804.49513,-233.32948 812.30269,-235.91229 814.16167,-235.99733 C 816.02064,-236.08236 817.78125,-235.37291 820.3563,-234.5364 C 822.93135,-233.69991 828.81609,-231.42974 831.13481,-230.0226 C 833.45353,-228.61545 837.44238,-227.23036 837.44238,-227.23036 C 837.44238,-227.23036 829.22981,-229.43413 826.28595,-230.52672 C 823.34209,-231.61931 818.61283,-233.6708 815.92073,-234.18069 C 813.22864,-234.69057 804.49513,-233.32948 804.49513,-233.32948 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- inkscape:transform-center-y="-4.3190906"
+- inkscape:transform-center-x="13.852145"
+- sodipodi:nodetypes="czzzczzc"
+- id="path8135"
+- d="M 819.55763,-237.57948 C 819.55763,-237.57948 828.11519,-240.16229 829.97417,-240.24733 C 831.83314,-240.33236 833.59375,-239.62291 836.1688,-238.7864 C 838.74385,-237.94991 844.62859,-235.67974 846.94731,-234.2726 C 849.26603,-232.86545 853.25488,-231.48036 853.25488,-231.48036 C 853.25488,-231.48036 845.04231,-233.68413 842.09845,-234.77672 C 839.15459,-235.86931 834.42533,-237.9208 831.73323,-238.43069 C 829.04114,-238.94057 819.55763,-237.57948 819.55763,-237.57948 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- inkscape:transform-center-y="-4.9269042"
+- inkscape:transform-center-x="13.64141"
+- sodipodi:nodetypes="czzzczzc"
+- id="path8137"
+- d="M 836.23395,-242.60125 C 836.23395,-242.60125 843.20097,-244.58848 845.06179,-244.56882 C 846.9226,-244.54915 848.64052,-243.7418 851.16444,-242.76177 C 853.68837,-241.78177 859.4361,-239.18419 861.672,-237.64886 C 863.9079,-236.11351 867.81253,-234.50625 867.81253,-234.50625 C 867.81253,-234.50625 859.73692,-237.16847 856.85917,-238.42491 C 853.98143,-239.68136 849.37505,-241.99561 846.71589,-242.65612 C 844.05674,-243.31661 836.23395,-242.60125 836.23395,-242.60125 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- inkscape:transform-center-y="-5.1542119"
+- inkscape:transform-center-x="13.55068"
+- sodipodi:nodetypes="czzzczzc"
+- id="path8139"
+- d="M 850.73028,-246.00461 C 850.73028,-246.00461 858.41812,-248.03229 860.2781,-247.97315 C 862.13807,-247.914 863.83848,-247.07036 866.34103,-246.03699 C 868.84358,-245.00365 874.5349,-242.28467 876.73771,-240.70224 C 878.94053,-239.11979 882.81016,-237.43004 882.81016,-237.43004 C 882.81016,-237.43004 874.79287,-240.26302 871.94244,-241.58026 C 869.09201,-242.89749 864.53578,-245.30898 861.89124,-246.02576 C 859.2467,-246.74254 850.73028,-246.00461 850.73028,-246.00461 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- inkscape:transform-center-y="-5.4740887"
+- inkscape:transform-center-x="13.41151"
+- sodipodi:nodetypes="czzzczzc"
+- id="path8141"
+- d="M 864.82496,-249.21081 C 864.82496,-249.21081 872.99448,-251.17987 874.85184,-251.06477 C 876.70919,-250.94965 878.38342,-250.05521 880.85374,-248.94698 C 883.32405,-247.83877 888.93094,-244.94971 891.08512,-243.30167 C 893.2393,-241.65363 897.05632,-239.84815 897.05632,-239.84815 C 897.05632,-239.84815 889.12793,-242.92121 886.31845,-244.32365 C 883.50896,-245.72609 879.02739,-248.27364 876.40562,-249.06971 C 873.78386,-249.86577 864.82496,-249.21081 864.82496,-249.21081 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- inkscape:transform-center-y="-5.79376"
+- inkscape:transform-center-x="13.258805"
+- sodipodi:nodetypes="czzzczzc"
+- id="path8143"
+- d="M 881.38485,-251.60282 C 881.38485,-251.60282 889.47021,-253.51091 891.32322,-253.33946 C 893.17622,-253.16799 894.82252,-252.22313 897.25804,-251.04038 C 899.69357,-249.85767 905.21013,-246.79968 907.31327,-245.08699 C 909.41641,-243.37429 913.17684,-241.45373 913.17684,-241.45373 C 913.17684,-241.45373 905.34544,-244.76613 902.57984,-246.25323 C 899.81423,-247.74035 895.41209,-250.42282 892.8157,-251.29814 C 890.21933,-252.17345 881.38485,-251.60282 881.38485,-251.60282 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- inkscape:transform-center-y="-5.7433893"
+- inkscape:transform-center-x="13.28378"
+- sodipodi:nodetypes="czzzczzc"
+- id="path8145"
+- d="M 896.58415,-254.34724 C 896.58415,-254.34724 904.22581,-255.77494 906.07962,-255.61239 C 907.93342,-255.44983 909.58424,-254.51289 912.02541,-253.34186 C 914.46659,-252.17086 919.99779,-249.1394 922.10913,-247.43684 C 924.22047,-245.73426 927.99009,-243.83179 927.99009,-243.83179 C 927.99009,-243.83179 920.14286,-247.10653 917.37014,-248.58034 C 914.59743,-250.05414 910.18245,-252.71543 907.58189,-253.57827 C 904.98134,-254.44109 896.58415,-254.34724 896.58415,-254.34724 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- inkscape:transform-center-y="-5.7433893"
+- inkscape:transform-center-x="13.28378"
+- sodipodi:nodetypes="czzzczzc"
+- id="path8147"
+- d="M 911.45328,-255.98544 C 911.45328,-255.98544 920.09494,-257.53814 921.94875,-257.37559 C 923.80255,-257.21303 925.45337,-256.27609 927.89454,-255.10506 C 930.33572,-253.93406 935.86692,-250.9026 937.97826,-249.20004 C 940.0896,-247.49746 943.85922,-245.59499 943.85922,-245.59499 C 943.85922,-245.59499 936.01199,-248.86973 933.23927,-250.34354 C 930.46656,-251.81734 926.05158,-254.47863 923.45102,-255.34147 C 920.85047,-256.20429 911.45328,-255.98544 911.45328,-255.98544 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- inkscape:transform-center-y="-5.7433893"
+- inkscape:transform-center-x="13.28378"
+- sodipodi:nodetypes="czzzczzc"
+- id="path8149"
+- d="M 927.70328,-258.29794 C 927.70328,-258.29794 935.34494,-259.16314 937.19875,-259.00059 C 939.05255,-258.83803 940.70337,-257.90109 943.14454,-256.73006 C 945.58572,-255.55906 951.11692,-252.5276 953.22826,-250.82504 C 955.3396,-249.12246 959.10922,-247.21999 959.10922,-247.21999 C 959.10922,-247.21999 951.26199,-250.49473 948.48927,-251.96854 C 945.71656,-253.44234 941.30158,-256.10363 938.70102,-256.96647 C 936.10047,-257.82929 927.70328,-258.29794 927.70328,-258.29794 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- inkscape:transform-center-y="-5.7433893"
+- inkscape:transform-center-x="13.28378"
+- sodipodi:nodetypes="czzzczzc"
+- id="path8151"
+- d="M 942.82828,-259.48544 C 942.82828,-259.48544 951.40744,-260.97564 953.26125,-260.81309 C 955.11505,-260.65053 956.76587,-259.71359 959.20704,-258.54256 C 961.64822,-257.37156 967.17942,-254.3401 969.29076,-252.63754 C 971.4021,-250.93496 975.17172,-249.03249 975.17172,-249.03249 C 975.17172,-249.03249 967.32449,-252.30723 964.55177,-253.78104 C 961.77906,-255.25484 957.36408,-257.91613 954.76352,-258.77897 C 952.16297,-259.64179 942.82828,-259.48544 942.82828,-259.48544 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- inkscape:transform-center-y="-5.7433893"
+- inkscape:transform-center-x="13.28378"
+- sodipodi:nodetypes="czzzczzc"
+- id="path8153"
+- d="M 959.07828,-261.54794 C 959.07828,-261.54794 966.90744,-262.35064 968.76125,-262.18809 C 970.61505,-262.02553 972.26587,-261.08859 974.70704,-259.91756 C 977.14822,-258.74656 982.67942,-255.7151 984.79076,-254.01254 C 986.9021,-252.30996 990.67172,-250.40749 990.67172,-250.40749 C 990.67172,-250.40749 982.82449,-253.68223 980.05177,-255.15604 C 977.27906,-256.62984 972.86408,-259.29113 970.26352,-260.15397 C 967.66297,-261.01679 959.07828,-261.54794 959.07828,-261.54794 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- inkscape:transform-center-y="-5.7433893"
+- inkscape:transform-center-x="13.28378"
+- sodipodi:nodetypes="czzzczzc"
+- id="path8155"
+- d="M 974.45328,-262.79794 C 974.45328,-262.79794 982.84494,-263.97564 984.69875,-263.81309 C 986.55255,-263.65053 988.20337,-262.71359 990.64454,-261.54256 C 993.08572,-260.37156 998.61692,-257.3401 1000.7283,-255.63754 C 1002.8396,-253.93496 1006.6092,-252.03249 1006.6092,-252.03249 C 1006.6092,-252.03249 998.76199,-255.30723 995.98927,-256.78104 C 993.21656,-258.25484 988.80158,-260.91613 986.20102,-261.77897 C 983.60047,-262.64179 974.45328,-262.79794 974.45328,-262.79794 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- inkscape:transform-center-y="-5.7433893"
+- inkscape:transform-center-x="13.28378"
+- sodipodi:nodetypes="czzzczzc"
+- id="path8157"
+- d="M 990.64078,-264.86044 C 990.64078,-264.86044 997.53244,-265.85064 999.38625,-265.68809 C 1001.2401,-265.52553 1002.8909,-264.58859 1005.332,-263.41756 C 1007.7732,-262.24656 1013.3044,-259.2151 1015.4158,-257.51254 C 1017.5271,-255.80996 1021.2967,-253.90749 1021.2967,-253.90749 C 1021.2967,-253.90749 1013.4495,-257.18223 1010.6768,-258.65604 C 1007.9041,-260.12984 1003.4891,-262.79113 1000.8885,-263.65397 C 998.28797,-264.51679 990.64078,-264.86044 990.64078,-264.86044 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- inkscape:transform-center-y="-5.7433893"
+- inkscape:transform-center-x="13.28378"
+- sodipodi:nodetypes="czzzczzc"
+- id="path8159"
+- d="M 1007.7658,-265.79794 C 1007.7658,-265.79794 1014.5949,-266.97564 1016.4488,-266.81309 C 1018.3026,-266.65053 1019.9534,-265.71359 1022.3945,-264.54256 C 1024.8357,-263.37156 1030.3669,-260.3401 1032.4783,-258.63754 C 1034.5896,-256.93496 1038.3592,-255.03249 1038.3592,-255.03249 C 1038.3592,-255.03249 1030.512,-258.30723 1027.7393,-259.78104 C 1024.9666,-261.25484 1020.5516,-263.91613 1017.951,-264.77897 C 1015.3505,-265.64179 1007.7658,-265.79794 1007.7658,-265.79794 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- inkscape:transform-center-y="-5.7433893"
+- inkscape:transform-center-x="13.28378"
+- sodipodi:nodetypes="czzzczzc"
+- id="path8161"
+- d="M 1023.8908,-267.79794 C 1023.8908,-267.79794 1029.9699,-268.22564 1031.8238,-268.06309 C 1033.6776,-267.90053 1035.3284,-266.96359 1037.7695,-265.79256 C 1040.2107,-264.62156 1045.7419,-261.5901 1047.8533,-259.88754 C 1049.9646,-258.18496 1053.7342,-256.28249 1053.7342,-256.28249 C 1053.7342,-256.28249 1045.887,-259.55723 1043.1143,-261.03104 C 1040.3416,-262.50484 1035.9266,-265.16613 1033.326,-266.02897 C 1030.7255,-266.89179 1023.8908,-267.79794 1023.8908,-267.79794 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- inkscape:transform-center-y="-5.7433893"
+- inkscape:transform-center-x="13.28378"
+- sodipodi:nodetypes="czzzczzc"
+- id="path8163"
+- d="M 1039.7033,-269.17294 C 1039.7033,-269.17294 1046.1574,-269.85064 1048.0113,-269.68809 C 1049.8651,-269.52553 1051.5159,-268.58859 1053.957,-267.41756 C 1056.3982,-266.24656 1061.9294,-263.2151 1064.0408,-261.51254 C 1066.1521,-259.80996 1069.9217,-257.90749 1069.9217,-257.90749 C 1069.9217,-257.90749 1062.0745,-261.18223 1059.3018,-262.65604 C 1056.5291,-264.12984 1052.1141,-266.79113 1049.5135,-267.65397 C 1046.913,-268.51679 1039.7033,-269.17294 1039.7033,-269.17294 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- inkscape:transform-center-y="-5.1360724"
+- inkscape:transform-center-x="13.55813"
+- sodipodi:nodetypes="czzzczzc"
+- id="path8165"
+- d="M 1055.2718,-271.03319 C 1055.2718,-271.03319 1060.7694,-271.94264 1062.6296,-271.88667 C 1064.4897,-271.83067 1066.1915,-270.98993 1068.6957,-269.96081 C 1071.2001,-268.93171 1076.896,-266.22241 1079.1015,-264.64372 C 1081.307,-263.06501 1085.1795,-261.38182 1085.1795,-261.38182 C 1085.1795,-261.38182 1077.1575,-264.20121 1074.3047,-265.5136 C 1071.4521,-266.82598 1066.8918,-269.22973 1064.246,-269.94203 C 1061.6003,-270.65431 1055.2718,-271.03319 1055.2718,-271.03319 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- inkscape:transform-center-y="-4.6370147"
+- inkscape:transform-center-x="13.74758"
+- sodipodi:nodetypes="czzzczzc"
+- id="path8167"
+- d="M 1072.7007,-273.48537 C 1072.7007,-273.48537 1077.2479,-274.64118 1079.1087,-274.67158 C 1080.9694,-274.70196 1082.7083,-273.94109 1085.2576,-273.02927 C 1087.807,-272.1175 1093.6225,-269.67541 1095.899,-268.20077 C 1098.1753,-266.72609 1102.1217,-265.22441 1102.1217,-265.22441 C 1102.1217,-265.22441 1093.9775,-267.66852 1091.067,-268.84713 C 1088.1565,-270.02573 1083.4896,-272.21528 1080.8136,-272.80404 C 1078.1377,-273.39279 1072.7007,-273.48537 1072.7007,-273.48537 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- inkscape:transform-center-y="-4.4842392"
+- inkscape:transform-center-x="13.79933"
+- sodipodi:nodetypes="czzzczzc"
+- id="path8169"
+- d="M 1087.1585,-276.5244 C 1087.1585,-276.5244 1093.1185,-278.29795 1094.9787,-278.35464 C 1096.8387,-278.41131 1098.5883,-277.67509 1101.1502,-276.79939 C 1103.7122,-275.92373 1103.6728,-275.94226 1106.4837,-275.30924 C 1109.2806,-274.67938 1113.5604,-273.79611 1113.5604,-273.79611 C 1113.5604,-273.79611 1109.9449,-273.81239 1106.7681,-274.26225 C 1103.6526,-274.70344 1099.3938,-275.9605 1096.7097,-276.51138 C 1094.0258,-277.06226 1087.1585,-276.5244 1087.1585,-276.5244 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" />
+- <path
+- sodipodi:nodetypes="czczc"
+- id="path8171"
+- d="M 1099.25,-279.92981 C 1099.4112,-279.66119 1110.4581,-284.53027 1111.4375,-284.61731 C 1112.4169,-284.70435 1113.4375,-281.49231 1113.4375,-281.49231 C 1113.4375,-281.49231 1112.6624,-282.99665 1110.5625,-282.55481 C 1108.4626,-282.11297 1099.2616,-279.8834 1099.25,-279.92981 z"
+- style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+- </g>
+- <path
+- id="path8173"
+- d="M 1107.4532,-284.0938 C 1107.0345,-283.88097 1107.2976,-283.99991 1106.806,-283.78799 C 1106.3199,-283.57845 1105.0826,-283.2136 1102.7264,-282.32904 C 1099.3953,-281.07847 1096.8962,-280.1756 1095.7005,-279.26294 C 1094.1644,-279.24168 1091.98,-279.02963 1090.0442,-278.54419 C 1087.0627,-277.79653 1085.189,-277.37018 1083.2942,-276.95044 C 1081.3994,-276.53072 1081.6187,-276.30825 1080.4192,-276.07544 C 1079.1226,-275.82378 1078.6978,-276.08443 1074.9817,-275.29419 C 1071.4918,-274.55205 1066.0869,-273.36312 1064.8255,-272.60669 C 1063.2416,-272.78748 1060.958,-272.92847 1058.9817,-272.63794 C 1055.9413,-272.19099 1054.0655,-271.96518 1052.138,-271.73169 C 1051.4826,-271.65232 1051.0969,-271.53091 1050.7942,-271.45044 C 1050.368,-271.31879 1050.1084,-271.19042 1049.4192,-271.10669 C 1048.1076,-270.94733 1047.657,-271.26352 1043.888,-270.82544 C 1040.3341,-270.41236 1034.8826,-269.55262 1033.638,-268.88794 C 1032.039,-269.18524 1029.7802,-269.42213 1027.7942,-269.23169 C 1024.7354,-268.93838 1022.8222,-268.7477 1020.888,-268.57544 C 1018.9537,-268.40318 1019.1993,-268.15307 1017.9817,-268.04419 C 1016.6655,-267.9265 1016.2219,-268.20782 1012.4505,-267.79419 C 1008.9086,-267.40575 1003.4426,-266.58492 1002.1692,-265.91919 C 1000.5703,-266.21389 998.28202,-266.4262 996.29419,-266.23169 C 993.23595,-265.93245 991.35306,-265.75145 989.41919,-265.57544 C 988.7617,-265.5156 988.37915,-265.39688 988.07544,-265.32544 C 987.64779,-265.20649 987.39193,-265.10737 986.70044,-265.04419 C 985.38448,-264.92394 984.94068,-265.23907 981.16919,-264.82544 C 977.61305,-264.43543 972.16365,-263.58628 970.91919,-262.91919 C 969.32056,-263.21338 967.05935,-263.44291 965.07544,-263.23169 C 962.01984,-262.90637 960.1014,-262.70545 958.16919,-262.51294 C 956.23698,-262.32044 956.47932,-262.07206 955.26294,-261.95044 C 953.94806,-261.81898 953.49996,-262.11498 949.73169,-261.66919 C 946.19282,-261.25054 940.75401,-260.37702 939.48169,-259.70044 C 937.88414,-259.98149 935.62173,-260.12087 933.63794,-259.88794 C 930.58596,-259.52958 928.69286,-259.32008 926.76294,-259.10669 C 926.10674,-259.03414 925.72228,-258.934 925.41919,-258.85669 C 924.99242,-258.72947 924.73428,-258.58949 924.04419,-258.51294 C 922.73086,-258.36726 922.27673,-258.68696 918.51294,-258.20044 C 914.96405,-257.74169 909.53431,-256.78142 908.29419,-256.07544 C 906.70114,-256.31968 904.46038,-256.45679 902.48169,-256.20044 C 899.4341,-255.80563 897.53098,-255.55199 895.60669,-255.29419 C 893.68241,-255.0364 893.88058,-254.80066 892.66919,-254.63794 C 891.35973,-254.46204 890.922,-254.74232 887.16919,-254.16919 C 883.6449,-253.63095 878.24604,-252.47002 876.98169,-251.73169 C 875.39419,-251.93523 873.13619,-251.98642 871.16919,-251.63794 C 868.14302,-251.10182 866.2703,-250.77625 864.35669,-250.45044 C 863.70608,-250.33967 863.34298,-250.1795 863.04419,-250.07544 C 862.62352,-249.91056 862.38074,-249.74414 861.70044,-249.60669 C 860.40579,-249.3451 859.97332,-249.61289 856.26294,-248.79419 C 852.76441,-248.02224 847.41699,-246.41126 846.20044,-245.57544 C 844.63766,-245.65289 842.44286,-245.49016 840.51294,-244.98169 C 837.5405,-244.19856 835.69533,-243.7496 833.82544,-243.23169 C 831.95556,-242.71379 832.15884,-242.46441 830.98169,-242.13794 C 829.70923,-241.78504 829.28466,-242.03085 825.63794,-240.95044 C 822.21324,-239.93581 816.9885,-238.01727 815.76294,-237.10669 C 814.22411,-237.09395 812.04311,-236.83447 810.13794,-236.23169 C 807.20688,-235.30435 805.38763,-234.77327 803.54419,-234.16919 C 802.91743,-233.96381 802.55246,-233.77661 802.26294,-233.63794 C 801.85531,-233.42433 801.6096,-233.22919 800.95044,-233.01294 C 799.69598,-232.6014 799.26433,-232.8239 795.66919,-231.57544 C 792.27934,-230.39827 787.07421,-228.36174 785.88794,-227.41919 C 784.36405,-227.35952 782.23789,-227.02432 780.35669,-226.35669 C 777.4593,-225.3284 775.65761,-224.68121 773.82544,-224.04419 C 771.99327,-223.40718 772.19759,-223.19565 771.04419,-222.79419 C 769.79741,-222.36023 769.38058,-222.59447 765.82544,-221.23169 C 762.48677,-219.95189 757.33829,-217.74914 756.13794,-216.76294 C 754.63076,-216.65525 752.50225,-216.26414 750.63794,-215.54419 C 747.76976,-214.43659 746.01414,-213.76263 744.20044,-213.07544 C 743.58378,-212.84181 743.20403,-212.63341 742.91919,-212.48169 C 742.91919,-212.48169 742.91919,-211.38794 742.91919,-211.38794 C 743.03097,-211.6103 743.30518,-212.20537 743.82544,-212.48169 C 744.52341,-212.85241 748.63907,-214.47506 750.63794,-215.20044 C 752.2948,-215.80169 754.79183,-216.52912 756.60669,-216.51294 C 756.90831,-216.51025 757.19431,-216.46204 757.45044,-216.41919 C 759.29293,-216.11094 764.91919,-214.85669 764.91919,-214.85669 C 764.91918,-214.85669 758.6857,-216.50344 757.88794,-216.70044 C 757.69715,-216.74755 757.35222,-216.76916 756.91919,-216.76294 C 758.06465,-217.63265 761.68019,-219.15645 764.26294,-220.20044 C 767.10116,-221.34771 767.37975,-221.45226 769.32544,-221.85669 C 771.33374,-222.27413 772.48169,-222.35669 772.48169,-222.35669 C 772.48169,-222.35668 772.39933,-222.95783 773.45044,-223.48169 C 774.15554,-223.8331 778.33746,-225.37409 780.35669,-226.04419 C 782.30859,-226.69192 785.41409,-227.40269 787.23169,-227.04419 C 789.09492,-226.67669 794.76294,-225.23169 794.76294,-225.23169 C 794.76295,-225.23169 788.47594,-227.1028 787.66919,-227.32544 C 787.47627,-227.37869 787.13835,-227.41148 786.70044,-227.41919 C 787.85878,-228.25207 791.49488,-229.61451 794.10669,-230.57544 C 796.97685,-231.63145 797.27403,-231.73724 799.23169,-232.10669 C 801.08518,-232.45648 802.09053,-232.53217 802.26294,-232.54419 C 802.37654,-232.76143 802.64039,-233.35421 803.16919,-233.60669 C 803.87863,-233.94543 808.09526,-235.31944 810.13794,-235.91919 C 811.83111,-236.4163 814.37871,-236.95596 816.23169,-236.82544 C 816.53964,-236.80376 816.84518,-236.72818 817.10669,-236.66919 C 818.98787,-236.24487 824.70044,-234.63794 824.70044,-234.63794 C 824.70045,-234.63794 818.3587,-236.70319 817.54419,-236.95044 C 817.3494,-237.00958 816.98631,-237.05438 816.54419,-237.07544 C 817.71368,-237.87299 821.40721,-239.13166 824.04419,-240.01294 C 826.942,-240.98141 827.2772,-241.01626 829.26294,-241.29419 C 831.31259,-241.58108 832.45044,-241.60669 832.45044,-241.60669 C 832.45042,-241.60669 832.37769,-242.21366 833.45044,-242.66919 C 834.17004,-242.97476 838.44142,-244.16994 840.51294,-244.66919 C 842.51538,-245.15177 845.71143,-245.59748 847.57544,-245.07544 C 849.48622,-244.54029 855.29419,-242.57544 855.29419,-242.57544 C 855.29419,-242.57544 848.87153,-244.99895 848.04419,-245.29419 C 847.84635,-245.3648 847.46203,-245.43458 847.01294,-245.48169 C 848.20084,-246.21034 851.92821,-247.25577 854.60669,-247.98169 C 857.55011,-248.77944 857.89877,-248.75252 859.91919,-248.88794 C 861.83208,-249.01617 862.86624,-248.95903 863.04419,-248.95044 C 863.16147,-249.1541 863.43595,-249.72992 863.98169,-249.91919 C 864.71388,-250.17313 869.06021,-250.96708 871.16919,-251.29419 C 872.91732,-251.5653 875.57007,-251.77889 877.48169,-251.38794 C 877.79935,-251.32298 878.08691,-251.20243 878.35669,-251.10669 C 880.29743,-250.41796 886.20044,-248.01294 886.20044,-248.01294 C 886.20045,-248.01294 879.66573,-250.96371 878.82544,-251.32544 C 878.62447,-251.41195 878.25031,-251.49223 877.79419,-251.57544 C 879.00069,-252.20862 882.82375,-252.97104 885.54419,-253.48169 C 888.53372,-254.04288 888.84442,-254.01123 890.88794,-254.01294 C 892.9972,-254.01471 894.20044,-253.88794 894.20044,-253.88794 C 894.20044,-253.88793 894.12773,-254.51913 895.23169,-254.82544 C 895.97221,-255.03091 900.35781,-255.65931 902.48169,-255.88794 C 904.53471,-256.10893 907.80032,-256.14016 909.70044,-255.41919 C 911.64823,-254.68012 917.54419,-252.04419 917.54419,-252.04419 C 917.54421,-252.04419 910.98131,-255.22316 910.13794,-255.60669 C 909.93626,-255.69842 909.59573,-255.7929 909.13794,-255.88794 C 910.34886,-256.48982 914.12236,-257.13678 916.85669,-257.54419 C 919.86149,-257.99191 920.1822,-257.99589 922.23169,-257.95044 C 924.17214,-257.90742 925.23868,-257.75621 925.41919,-257.73169 C 925.53811,-257.92485 925.80309,-258.49752 926.35669,-258.63794 C 927.0994,-258.82632 931.51098,-259.37222 933.63794,-259.57544 C 935.40097,-259.74386 938.05803,-259.80973 939.98169,-259.32544 C 940.30137,-259.24496 940.5852,-259.12185 940.85669,-259.01294 C 942.80962,-258.22945 948.76294,-255.54419 948.76294,-255.54419 C 948.76292,-255.54419 942.17103,-258.79767 941.32544,-259.20044 C 941.12322,-259.29676 940.75318,-259.40747 940.29419,-259.51294 C 941.50833,-260.08721 945.33785,-260.63513 948.07544,-261.01294 C 951.08382,-261.42814 951.39851,-261.45557 953.45044,-261.38794 C 955.56842,-261.31813 956.76294,-261.13794 956.76294,-261.13794 C 956.76292,-261.13794 956.68569,-261.77535 957.79419,-262.04419 C 958.53781,-262.22454 962.94595,-262.70774 965.07544,-262.88794 C 967.13391,-263.06211 970.41868,-263.01226 972.32544,-262.23169 C 974.28003,-261.43153 980.20044,-258.70044 980.20044,-258.70044 C 980.20042,-258.70044 973.64051,-262.0092 972.79419,-262.41919 C 972.59182,-262.51724 972.22233,-262.62229 971.76294,-262.73169 C 972.97811,-263.29559 976.77302,-263.84599 979.51294,-264.20044 C 982.52385,-264.58996 982.83425,-264.59809 984.88794,-264.51294 C 986.83233,-264.43234 987.89457,-264.2597 988.07544,-264.23169 C 988.1946,-264.42255 988.45821,-264.977 989.01294,-265.10669 C 989.7572,-265.28069 994.16287,-265.75716 996.29419,-265.91919 C 998.06081,-266.05346 1000.7439,-266.0449 1002.6692,-265.54419 C 1002.9892,-265.46098 1003.2725,-265.34292 1003.5442,-265.23169 C 1005.4988,-264.43153 1011.4505,-261.66919 1011.4505,-261.66919 C 1011.4504,-261.66919 1004.8593,-265.0092 1004.013,-265.41919 C 1003.8106,-265.51724 1003.4411,-265.6223 1002.9817,-265.73169 C 1004.1968,-266.29559 1008.023,-266.81475 1010.763,-267.16919 C 1013.7739,-267.55872 1014.1155,-267.59809 1016.1692,-267.51294 C 1018.2889,-267.42506 1019.4817,-267.20044 1019.4817,-267.20044 C 1019.4817,-267.20044 1019.4033,-267.84946 1020.513,-268.10669 C 1021.2573,-268.27925 1025.6625,-268.73005 1027.7942,-268.88794 C 1029.8548,-269.04054 1033.1371,-268.98471 1035.0442,-268.20044 C 1036.9992,-267.39649 1042.9192,-264.70044 1042.9192,-264.70044 C 1042.9192,-264.70044 1036.3594,-267.97631 1035.513,-268.38794 C 1035.3105,-268.48638 1034.9412,-268.59016 1034.4817,-268.70044 C 1035.6971,-269.26198 1039.4936,-269.82822 1042.2317,-270.20044 C 1045.2407,-270.60949 1045.5544,-270.61602 1047.6067,-270.54419 C 1049.5498,-270.4762 1050.6139,-270.37934 1050.7942,-270.35669 C 1050.913,-270.55109 1051.1788,-271.0855 1051.7317,-271.23169 C 1052.4735,-271.42781 1056.8628,-272.06047 1058.9817,-272.32544 C 1060.7381,-272.54505 1063.387,-272.65775 1065.2942,-272.29419 C 1065.6111,-272.23378 1065.9,-272.10481 1066.1692,-272.01294 C 1068.1054,-271.35202 1074.013,-269.07544 1074.013,-269.07544 C 1074.0129,-269.07544 1067.4763,-271.88199 1066.638,-272.23169 C 1066.4375,-272.31532 1066.0618,-272.40502 1065.6067,-272.48169 C 1066.8104,-273.13215 1070.6258,-273.85364 1073.3255,-274.48169 C 1076.2922,-275.17189 1076.6144,-275.23676 1078.638,-275.35669 C 1080.7266,-275.48049 1081.9192,-275.38794 1081.9192,-275.38794 C 1081.9192,-275.38793 1081.8322,-276.01999 1082.9192,-276.41919 C 1083.6484,-276.68699 1087.9664,-277.75716 1090.0442,-278.23169 C 1092.0527,-278.69038 1095.2121,-279.26099 1097.0442,-278.85669 C 1098.9223,-278.44223 1110.6224,-275.84106 1110.6224,-275.84106 C 1110.6224,-275.84106 1098.2949,-278.86372 1097.4817,-279.10669 C 1097.2872,-279.16481 1096.9231,-279.21295 1096.4817,-279.23169 C 1097.6493,-280.03538 1099.9959,-280.91899 1102.5911,-281.93481 C 1104.2725,-282.59299 1103.5148,-282.3114 1105.367,-282.93841 C 1107.1206,-283.53207 1107.8524,-283.94912 1107.9974,-284.0514 C 1108.3435,-284.25791 1107.6414,-284.17328 1107.4532,-284.0938 z"
+- style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7333);enable-background:new"
+- sodipodi:nodetypes="czscsssscssssscsssscssssscsssscssssscsssscssssscsssscssssscsssscssccsssscscsscssscscsscsssscscsscssscscsscsssscscsscssscscsscsssscscsscssscscsscsssscscsscssscscsscsssscscsscssscscsscc" />
+- <path
+- id="path8175"
+- d="M 1082.625,-275.125 C 1084.498,-274.73152 1087.1211,-273.97945 1088.6563,-273.15625 C 1090.1915,-272.33306 1091.4785,-272.10025 1094.0313,-270.65625 C 1096.5579,-269.22699 1098.8271,-268.64929 1101,-268.125 C 1103.3476,-267.55858 1106.4354,-267.40977 1109.8438,-266.9375 C 1108.7549,-267.77725 1103.2364,-268.10995 1101.4375,-268.5 C 1099.6386,-268.89006 1097.5434,-269.51616 1094.8438,-270.8125 C 1092.1441,-272.10884 1091.3494,-272.61146 1089.0313,-273.5 C 1086.7131,-274.38854 1085.0269,-274.88314 1082.625,-275.125 z"
+- style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7285);enable-background:new" />
+- <path
+- id="path8177"
+- d="M 1051.4688,-270 C 1053.3741,-269.42241 1055.9969,-268.38428 1057.5625,-267.40625 C 1059.1281,-266.42823 1060.4427,-266.04644 1063.0625,-264.28125 C 1065.6555,-262.53409 1068.0484,-261.57198 1070.3125,-260.6875 C 1072.7586,-259.73193 1075.9951,-259.03037 1079.7188,-257.625 C 1078.5292,-258.76284 1072.6557,-260.31175 1070.7813,-261 C 1068.9068,-261.68825 1066.6995,-262.5662 1063.9063,-264.28125 C 1061.113,-265.99629 1060.3327,-266.56515 1057.9688,-267.6875 C 1055.6047,-268.80984 1053.9121,-269.52205 1051.4688,-270 z"
+- style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7289);enable-background:new" />
+- <path
+- id="path8179"
+- d="M 1020.2188,-266.84375 C 1022.1307,-266.20564 1024.8,-265.08839 1026.375,-264.03125 C 1027.9501,-262.9741 1029.2706,-262.52258 1031.9063,-260.625 C 1034.5149,-258.74679 1036.9347,-257.59497 1039.2188,-256.5625 C 1041.6865,-255.44705 1044.9833,-254.3892 1048.75,-252.71875 C 1047.5467,-253.94128 1041.5472,-256.03298 1039.6563,-256.84375 C 1037.7653,-257.65452 1035.5914,-258.73754 1032.7813,-260.59375 C 1029.9711,-262.44995 1029.1595,-263.07068 1026.7813,-264.3125 C 1024.403,-265.5543 1022.6706,-266.28819 1020.2188,-266.84375 z"
+- style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7293);enable-background:new" />
+- <path
+- id="path8181"
+- d="M 1110.1719,-266.89063 C 1110.3227,-266.84207 1110.8599,-266.25963 1110.2813,-265.40625 C 1109.4712,-264.21166 1104.5764,-262.08196 1101.7188,-261.28125 C 1098.8739,-260.48413 1095.4287,-260.30351 1091.1563,-261.65625 C 1086.8547,-263.0182 1085.6866,-264.12497 1080.5,-265.96875 C 1085.164,-263.85358 1086.6953,-262.01642 1090.625,-260.625 C 1092.2457,-260.05113 1093.9921,-259.6854 1095.6875,-259.59375 C 1095.2424,-259.26812 1094.1572,-258.61045 1092.125,-258 C 1089.3295,-257.16031 1085.4759,-256.46622 1083.875,-256.375 C 1082.3604,-256.28868 1080.733,-256.88749 1080.4375,-257 C 1080.6042,-256.89692 1080.8107,-256.62266 1080.1875,-255.96875 C 1079.2882,-255.02512 1074.0401,-254.04575 1071.0625,-253.71875 C 1068.0982,-253.3932 1064.5409,-253.73471 1060.1563,-255.625 C 1056.1783,-257.33997 1054.8173,-258.54036 1050.75,-260.375 C 1050.75,-260.375 1050.75,-260.21875 1050.75,-260.21875 C 1054.3931,-258.12346 1056.034,-256.33548 1059.625,-254.65625 C 1061.3552,-253.84716 1063.2167,-253.24749 1065.0313,-252.9375 C 1064.4964,-252.65074 1063.4735,-252.22599 1061.5938,-251.90625 C 1058.7248,-251.41829 1054.7848,-251.09011 1053.1563,-251.15625 C 1052.3056,-251.19079 1051.4277,-251.34062 1050.75,-251.5625 C 1050.0652,-251.77738 1049.5603,-252.00717 1049.4375,-252.0625 C 1049.6069,-251.95529 1049.8686,-251.65962 1049.2188,-251.03125 C 1048.3091,-250.15163 1042.9727,-249.69487 1039.9688,-249.5625 C 1036.9783,-249.43071 1033.3799,-250.01313 1028.9688,-252.125 C 1024.5276,-254.25126 1023.3273,-255.5266 1018.0625,-257.90625 C 1022.7968,-255.30921 1024.349,-253.27715 1028.4063,-251.1875 C 1030.0796,-250.32565 1031.8915,-249.69325 1033.6563,-249.25 C 1033.193,-249.01668 1032.0669,-248.56186 1029.9688,-248.3125 C 1027.0825,-247.96952 1023.1342,-247.81962 1021.5,-247.9375 C 1019.9538,-248.049 1018.2688,-248.79446 1017.9688,-248.9375 C 1018.1379,-248.81721 1018.3826,-248.52702 1017.75,-247.9375 C 1016.8372,-247.08677 1011.5059,-246.67538 1008.5,-246.5625 C 1005.5075,-246.45013 1001.9103,-247.05293 997.5,-249.15625 C 993.49875,-251.06448 992.11197,-252.29408 988.03125,-254.25 C 988.03122,-254.25 988.03125,-254.09375 988.03125,-254.09375 C 991.68631,-251.88983 993.32546,-250.0412 996.9375,-248.1875 C 998.67779,-247.29435 1000.5745,-246.65923 1002.4063,-246.21875 C 1001.8663,-245.97045 1000.8282,-245.60342 998.9375,-245.375 C 996.05182,-245.02642 992.07145,-244.85405 990.4375,-244.96875 C 989.58405,-245.02865 988.71119,-245.22666 988.03125,-245.46875 C 987.34415,-245.70405 986.8419,-245.94101 986.71875,-246 C 986.88873,-245.88773 987.18323,-245.57775 986.53125,-244.96875 C 985.6186,-244.11625 980.25592,-243.67538 977.25,-243.5625 C 974.25754,-243.45013 970.65654,-244.09055 966.25,-246.15625 C 961.81347,-248.23603 960.60312,-249.48796 955.34375,-251.8125 C 960.07313,-249.26501 961.63449,-247.2347 965.6875,-245.1875 C 967.35905,-244.34317 969.17304,-243.72107 970.9375,-243.28125 C 970.47427,-243.04703 969.3478,-242.59718 967.25,-242.34375 C 964.36431,-241.99517 960.4138,-241.77423 958.78125,-241.875 C 957.23669,-241.97032 955.58094,-242.70385 955.28125,-242.84375 C 955.45024,-242.72522 955.66317,-242.4399 955.03125,-241.84375 C 954.11939,-240.98347 948.7846,-240.5135 945.78125,-240.375 C 942.7913,-240.2371 939.2138,-240.82568 934.8125,-242.84375 C 930.81942,-244.67464 929.44739,-245.87295 925.375,-247.75 C 925.37498,-247.75 925.375,-247.59375 925.375,-247.59375 C 929.02261,-245.46048 930.64533,-243.65888 934.25,-241.875 C 935.98675,-241.01549 937.85727,-240.42486 939.6875,-240 C 939.14803,-239.7471 938.13687,-239.35871 936.25,-239.09375 C 933.37022,-238.68939 929.41187,-238.44813 927.78125,-238.53125 C 926.92953,-238.57466 926.05355,-238.7398 925.375,-238.96875 C 924.68931,-239.19076 924.1854,-239.41214 924.0625,-239.46875 C 924.23209,-239.35976 924.4944,-239.0591 923.84375,-238.4375 C 922.93296,-237.56736 917.59354,-237.04598 914.59375,-236.875 C 911.60742,-236.70479 908.01994,-237.19077 903.625,-239.15625 C 899.20011,-241.13513 898.01904,-242.38444 892.78125,-244.53125 C 897.49122,-242.14358 899.05142,-240.14252 903.09375,-238.1875 C 904.7609,-237.38119 906.55418,-236.79092 908.3125,-236.40625 C 907.85087,-236.15755 906.7155,-235.694 904.625,-235.375 C 901.7494,-234.93624 897.8446,-234.6419 896.21875,-234.6875 C 894.68052,-234.73062 892.98595,-235.43272 892.6875,-235.5625 C 892.85583,-235.44968 893.09807,-235.14875 892.46875,-234.53125 C 891.56063,-233.64015 886.2658,-233.003 883.28125,-232.71875 C 880.31007,-232.43577 876.70783,-232.89455 872.34375,-234.65625 C 868.38441,-236.25456 867.0146,-237.45112 863,-238.96875 C 863.00003,-238.96875 863,-238.8125 863,-238.8125 C 866.5959,-237.00115 868.23831,-235.23017 871.8125,-233.65625 C 873.53457,-232.8979 875.39998,-232.3673 877.21875,-232.03125 C 876.68266,-231.75217 875.65217,-231.34362 873.78125,-230.96875 C 870.92586,-230.39665 866.99183,-229.94936 865.375,-229.9375 C 864.53049,-229.93129 863.66892,-230.01844 863,-230.1875 C 862.32409,-230.34901 861.83991,-230.51673 861.71875,-230.5625 C 861.88597,-230.46848 862.14142,-230.17902 861.5,-229.5 C 860.60213,-228.54948 855.31352,-227.58292 852.375,-227.0625 C 849.44966,-226.54441 845.94285,-226.68826 841.65625,-228.09375 C 837.34045,-229.50882 836.18348,-230.62369 831.09375,-232.0625 C 835.6706,-230.31149 837.1823,-228.50244 841.125,-227.0625 C 842.75108,-226.46861 844.49385,-226.10685 846.21875,-225.90625 C 845.7659,-225.60923 844.66397,-225.02286 842.625,-224.4375 C 839.82028,-223.63233 835.98614,-222.86167 834.40625,-222.6875 C 832.9115,-222.5227 831.29002,-223.00431 831,-223.09375 C 831.16356,-223.00368 831.39278,-222.73382 830.78125,-222.03125 C 829.89878,-221.0174 824.73673,-219.6596 821.84375,-218.96875 C 818.96373,-218.28097 815.50815,-218.20873 811.28125,-219.40625 C 807.4464,-220.4927 806.10867,-221.47862 802.21875,-222.53125 C 802.21874,-222.53125 802.21875,-222.375 802.21875,-222.375 C 805.70293,-220.98015 807.28816,-219.4556 810.75,-218.34375 C 812.41793,-217.80803 814.20578,-217.55701 815.96875,-217.46875 C 815.44911,-217.11663 814.46836,-216.55423 812.65625,-215.9375 C 809.89059,-214.99625 806.06601,-214.00213 804.5,-213.78125 C 803.68206,-213.66586 802.8669,-213.65842 802.21875,-213.75 C 801.56379,-213.83321 801.08615,-213.96827 800.96875,-214 C 801.13079,-213.92536 801.40274,-213.65956 800.78125,-212.90625 C 799.91125,-211.85172 794.77162,-210.247 791.90625,-209.46875 C 789.05372,-208.69399 785.64713,-208.51055 781.46875,-209.5625 C 777.26192,-210.62163 776.11206,-211.60416 771.125,-212.71875 C 775.60954,-211.25929 777.09435,-209.58352 780.9375,-208.46875 C 782.52254,-208.00898 784.22429,-207.8305 785.90625,-207.78125 C 785.46468,-207.44449 784.39374,-206.75352 782.40625,-206 C 779.67232,-204.96351 775.95427,-203.83731 774.40625,-203.5625 C 772.94163,-203.30248 771.34667,-203.67904 771.0625,-203.75 C 771.22275,-203.67035 771.44294,-203.42902 770.84375,-202.6875 C 769.97909,-201.61744 764.92723,-199.86935 762.09375,-199 C 759.27295,-198.13453 755.88625,-197.84369 751.75,-198.78125 C 747.99741,-199.63186 746.70215,-200.49772 742.875,-201.375 C 742.875,-201.375 742.875,-201.21875 742.875,-201.21875 C 746.30296,-199.98096 747.86241,-198.58645 751.25,-197.6875 C 752.88216,-197.25436 754.61704,-197.10449 756.34375,-197.125 C 755.83482,-196.74083 754.867,-196.10318 753.09375,-195.375 C 750.38741,-194.26366 746.65742,-193.06719 745.125,-192.75 C 744.3246,-192.58431 743.51269,-192.53138 742.875,-192.59375 C 742.875,-192.59375 742.875,-192.07823 742.875,-191.67146 C 742.875,-191.40639 742.875,-191.1875 742.875,-191.1875 C 743.10145,-191.33218 743.32391,-191.46011 743.59375,-191.5625 C 744.67427,-191.97248 745.76536,-191.77827 749.59375,-193.25 C 753.42218,-194.72174 754.81787,-195.25498 755.5,-195.65625 C 756.1796,-196.05603 757.11165,-196.53562 757.71875,-197.1875 C 759.5456,-197.32525 761.2895,-197.68073 762.65625,-198.1875 C 765.62437,-199.28802 767.53162,-199.99369 769.4375,-200.65625 C 771.34336,-201.31879 771.79159,-202.07112 772.84375,-202.4375 C 773.9353,-202.81761 775.03886,-202.60288 778.90625,-203.96875 C 782.7737,-205.33461 784.18941,-205.79583 784.875,-206.1875 C 785.57609,-206.58802 786.57581,-207.12048 787.1875,-207.78125 C 789.1583,-207.83591 791.00435,-208.16588 792.46875,-208.65625 C 795.47023,-209.66133 797.3949,-210.27796 799.3125,-210.90625 C 800.8511,-211.41035 801.48652,-211.95302 802.21875,-212.34375 C 802.44891,-212.47806 802.69449,-212.59748 802.96875,-212.6875 C 804.06698,-213.04798 805.1502,-212.76887 809.0625,-214 C 812.97483,-215.23113 814.42855,-215.67295 815.125,-216.03125 C 815.81888,-216.38822 816.75515,-216.82386 817.375,-217.4375 C 819.24021,-217.46016 821.01081,-217.70433 822.40625,-218.125 C 825.43668,-219.03854 827.39863,-219.5551 829.34375,-220.09375 C 831.28886,-220.63239 831.76993,-221.35827 832.84375,-221.65625 C 833.95776,-221.9654 835.06369,-221.64886 839.03125,-222.6875 C 842.99886,-223.72613 844.44883,-224.12023 845.15625,-224.4375 C 845.89112,-224.76709 846.97008,-225.19122 847.59375,-225.8125 C 849.59149,-225.6965 851.45118,-225.83259 852.9375,-226.1875 C 856.01561,-226.9225 858.02094,-227.28844 860,-227.6875 C 861.58792,-228.00768 862.24429,-228.47805 863,-228.78125 C 863.23757,-228.88805 863.46695,-228.97401 863.75,-229.03125 C 864.88347,-229.26044 866.05448,-228.82232 870.09375,-229.53125 C 874.13308,-230.24018 875.594,-230.45834 876.3125,-230.71875 C 877.02836,-230.97819 878.01678,-231.28599 878.65625,-231.8125 C 880.58052,-231.57301 882.40413,-231.58797 883.84375,-231.8125 C 886.97008,-232.30012 888.9983,-232.51317 891,-232.78125 C 893.00171,-233.04932 893.48869,-233.72639 894.59375,-233.875 C 895.74014,-234.02918 896.86967,-233.57343 900.9375,-234.09375 C 905.00534,-234.61407 906.49763,-234.78948 907.21875,-235.03125 C 907.95585,-235.27839 909.01684,-235.61748 909.65625,-236.15625 C 911.70632,-235.82072 913.63003,-235.75829 915.15625,-235.9375 C 918.29856,-236.30646 920.33619,-236.49686 922.34375,-236.71875 C 923.95451,-236.89677 924.60842,-237.32695 925.375,-237.5625 C 925.61594,-237.64802 925.86912,-237.7181 926.15625,-237.75 C 927.30603,-237.87772 928.45754,-237.40335 932.53125,-237.875 C 936.60499,-238.34665 938.09034,-238.4856 938.8125,-238.71875 C 939.53196,-238.95102 940.51274,-239.19221 941.15625,-239.6875 C 943.09262,-239.35404 944.92631,-239.28326 946.375,-239.4375 C 949.52102,-239.77245 951.55256,-239.95609 953.5625,-240.15625 C 955.57246,-240.35639 956.04664,-240.98264 957.15625,-241.09375 C 958.30739,-241.20903 959.45268,-240.72869 963.53125,-241.15625 C 967.60986,-241.58381 969.12011,-241.71834 969.84375,-241.9375 C 970.5829,-242.16136 971.63947,-242.45075 972.28125,-242.96875 C 974.33835,-242.57008 976.28312,-242.47535 977.8125,-242.625 C 980.96123,-242.9331 982.98834,-243.09825 985,-243.28125 C 986.61407,-243.42807 987.2631,-243.8418 988.03125,-244.0625 C 988.27267,-244.14336 988.52478,-244.19241 988.8125,-244.21875 C 989.96461,-244.3242 991.10546,-243.826 995.1875,-244.21875 C 999.26958,-244.6115 1000.7764,-244.74959 1001.5,-244.96875 C 1002.2209,-245.18708 1003.1997,-245.41645 1003.8438,-245.90625 C 1005.7818,-245.55626 1007.6126,-245.45187 1009.0625,-245.59375 C 1012.2112,-245.90185 1014.2383,-246.067 1016.25,-246.25 C 1018.2616,-246.43299 1018.7642,-247.08802 1019.875,-247.1875 C 1021.0273,-247.29073 1022.1672,-246.80267 1026.25,-247.1875 C 1030.3329,-247.57232 1031.8387,-247.6885 1032.5625,-247.90625 C 1033.3018,-248.12868 1034.3581,-248.42074 1035,-248.9375 C 1037.0574,-248.53573 1039.0029,-248.43417 1040.5313,-248.59375 C 1043.6779,-248.92227 1045.7084,-249.11645 1047.7188,-249.3125 C 1049.3318,-249.46979 1049.9844,-249.94398 1050.75,-250.1875 C 1050.9907,-250.27554 1051.2132,-250.30887 1051.5,-250.34375 C 1052.6483,-250.48345 1053.8167,-250.00384 1057.875,-250.59375 C 1061.9333,-251.18367 1063.4368,-251.37089 1064.1563,-251.625 C 1064.873,-251.87816 1065.8308,-252.18307 1066.4688,-252.71875 C 1068.3885,-252.50681 1070.1887,-252.56734 1071.625,-252.8125 C 1074.7441,-253.3449 1076.7366,-253.74111 1078.7188,-254.125 C 1080.7009,-254.50887 1081.1931,-255.16465 1082.2813,-255.40625 C 1083.4101,-255.65691 1084.5516,-255.28996 1088.5313,-256.28125 C 1092.5109,-257.27253 1093.9609,-257.70055 1094.6563,-258.0625 C 1095.3786,-258.43851 1096.4182,-258.93308 1097.0313,-259.59375 C 1098.9943,-259.6058 1100.825,-259.8848 1102.25,-260.4375 C 1105.2012,-261.58211 1107.1232,-262.30692 1108.9375,-263.1875 C 1110.3932,-263.89403 1111.2723,-264.87391 1111.4844,-265.17188 C 1111.6966,-265.46984 1111.5962,-265.91718 1111.6223,-265.93863 C 1111.6652,-265.97387 1111.9416,-266.0236 1112.1013,-266.36707 C 1112.9602,-268.21415 1114.4223,-272.01166 1114.5365,-272.69652 C 1114.6502,-273.37868 1114.7003,-274.04426 1114.751,-274.44149 C 1114.7804,-274.67101 1114.6043,-275.30693 1114.6264,-275.36553 C 1114.6573,-275.44759 1114.9309,-275.63081 1114.9863,-275.88024 C 1115.2526,-277.07857 1115.0752,-278.07153 1114.8612,-279.48917 C 1114.6472,-280.90681 1113.8775,-284.11131 1113.2243,-284.96543 C 1112.5654,-285.82715 1112.0014,-285.9766 1111.4764,-285.96609 C 1111.2678,-285.69633 1111.6132,-285.703 1111.639,-285.65348 C 1112.3196,-285.60269 1112.573,-285.28484 1113.0582,-284.75686 C 1113.5434,-284.22888 1114.28,-280.90569 1114.4166,-279.4553 C 1114.5532,-278.00491 1114.6066,-276.5951 1114.3286,-275.98666 C 1114.0505,-275.37821 1113.6054,-275.46963 1113.313,-275.40375 C 1113.844,-275.21786 1113.9828,-275.27892 1114.0444,-274.43446 C 1114.1037,-273.62108 1113.9112,-272.79477 1113.5246,-271.62884 C 1113.1334,-270.44883 1111.6794,-267.27886 1111.2389,-267.03007 C 1110.7866,-266.77456 1110.5075,-266.75969 1110.1719,-266.89063 z"
+- style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7337);enable-background:new"
+- sodipodi:nodetypes="cssscscsscsssccscssssssscscsscsssscscssssssscscsscsssscscssssssscscsscsssscscssssssscscsscsssscscssssssscscsscsssccscsscscssscssssscsssssscssssscsssssscssssscsssssscssssscsssssscssssscsssssscssssscsszsszssszzcczzzczzzc" />
+- <path
+- id="path8183"
+- d="M 988.75,-263.84375 C 990.66161,-263.20935 993.30027,-262.08534 994.875,-261.03125 C 996.44977,-259.97716 997.7711,-259.54873 1000.4063,-257.65625 C 1003.0145,-255.78311 1005.4332,-254.64103 1007.7188,-253.59375 C 1010.1881,-252.46228 1013.4709,-251.43901 1017.25,-249.65625 C 1016.0428,-250.91465 1010.111,-253.0207 1008.2188,-253.84375 C 1006.3266,-254.66679 1004.0908,-255.77424 1001.2813,-257.625 C 998.47169,-259.47575 997.65906,-260.10654 995.28125,-261.34375 C 992.90343,-262.58094 991.20137,-263.29295 988.75,-263.84375 z"
+- style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7297);enable-background:new" />
+- <path
+- id="path8185"
+- d="M 957.5,-260.78125 C 959.41,-260.16315 962.08288,-259.07191 963.65625,-258.03125 C 965.22964,-256.99059 966.55233,-256.54873 969.1875,-254.65625 C 971.79573,-252.7831 974.21442,-251.64104 976.5,-250.59375 C 978.96931,-249.46228 982.25213,-248.439 986.03125,-246.65625 C 984.82397,-247.91465 978.82971,-250.05195 976.9375,-250.875 C 975.04533,-251.69804 972.84084,-252.8055 970.03125,-254.65625 C 967.22167,-256.507 966.4383,-257.09557 964.0625,-258.3125 C 961.68672,-259.52941 959.94929,-260.25135 957.5,-260.78125 z"
+- style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7301);enable-background:new" />
+- <path
+- id="path8187"
+- d="M 926.09375,-257.375 C 928.00147,-256.77755 930.64723,-255.71116 932.21875,-254.6875 C 933.79025,-253.66385 935.08897,-253.24779 937.71875,-251.40625 C 940.32166,-249.58352 942.74762,-248.43405 945.03125,-247.40625 C 947.49845,-246.29584 950.7866,-245.31302 954.5625,-243.5625 C 953.35627,-244.8106 947.3906,-246.88059 945.5,-247.6875 C 943.60942,-248.4944 941.39758,-249.57854 938.59375,-251.375 C 935.7899,-253.17144 934.96671,-253.77751 932.59375,-254.96875 C 930.22078,-256.15999 928.54013,-256.87158 926.09375,-257.375 z"
+- style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7305);enable-background:new" />
+- <path
+- id="path8189"
+- d="M 894.90625,-253.5625 C 896.80838,-253.00895 899.49326,-251.97363 901.0625,-250.96875 C 902.63173,-249.96388 903.93651,-249.56011 906.5625,-247.75 C 909.16162,-245.95836 911.56284,-244.87811 913.84375,-243.875 C 916.30803,-242.79126 919.60359,-241.83471 923.375,-240.125 C 922.1702,-241.36007 916.20084,-243.36978 914.3125,-244.15625 C 912.42418,-244.94272 910.2373,-245.98705 907.4375,-247.75 C 904.63773,-249.51294 903.83831,-250.11836 901.46875,-251.28125 C 899.09918,-252.44413 897.3455,-253.11537 894.90625,-253.5625 z"
+- style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7309);enable-background:new" />
+- <path
+- id="path8191"
+- d="M 863.71875,-248.65625 C 865.59937,-248.22716 868.22302,-247.27587 869.78125,-246.34375 C 871.33948,-245.41164 872.63358,-245.08599 875.25,-243.34375 C 877.83971,-241.61931 880.23067,-240.63573 882.5,-239.71875 C 884.95176,-238.72806 888.23959,-237.84168 892,-236.21875 C 890.79869,-237.42609 884.84751,-239.28484 882.96875,-240 C 881.09,-240.71517 878.88335,-241.68442 876.09375,-243.375 C 873.30412,-245.06557 872.50914,-245.60322 870.15625,-246.65625 C 867.80333,-247.70926 866.13041,-248.36873 863.71875,-248.65625 z"
+- style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7313);enable-background:new" />
+- <path
+- id="path8193"
+- d="M 833.15625,-241.375 C 835.00461,-241.07856 837.6257,-240.39868 839.15625,-239.59375 C 840.68683,-238.78882 841.96999,-238.53802 844.53125,-237.0625 C 847.06629,-235.60204 849.42193,-234.73741 851.65625,-234 C 854.07024,-233.20332 857.31336,-232.53311 861.03125,-231.15625 C 859.84354,-232.28498 853.94353,-233.746 852.09375,-234.3125 C 850.24398,-234.879 848.09033,-235.68642 845.34375,-237.15625 C 842.59718,-238.62608 841.84239,-239.07653 839.53125,-239.9375 C 837.2201,-240.79845 835.52654,-241.25759 833.15625,-241.375 z"
+- style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7317);enable-background:new" />
+- <path
+- id="path8195"
+- d="M 802.90625,-232.3125 C 804.72845,-232.10123 807.27201,-231.51193 808.78125,-230.78125 C 810.2905,-230.05059 811.53693,-229.85127 814.0625,-228.5 C 816.56226,-227.16254 818.89404,-226.45157 821.09375,-225.84375 C 823.47028,-225.18708 826.65839,-224.77087 830.3125,-223.65625 C 829.14515,-224.70121 823.38362,-225.75954 821.5625,-226.21875 C 819.74139,-226.67796 817.61025,-227.34571 814.90625,-228.65625 C 812.20222,-229.96677 811.43519,-230.37615 809.15625,-231.125 C 806.8773,-231.87383 805.243,-232.30431 802.90625,-232.3125 z"
+- style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7321);enable-background:new" />
+- <path
+- id="path8197"
+- d="M 773.1875,-222.1875 C 774.99859,-222.0088 777.50809,-221.52244 779,-220.84375 C 780.49194,-220.16506 781.7534,-220.04553 784.25,-218.78125 C 786.72107,-217.52987 789.04005,-216.88511 791.21875,-216.34375 C 793.57262,-215.75887 796.71009,-215.44623 800.3125,-214.5 C 799.16166,-215.49116 793.45999,-216.2833 791.65625,-216.6875 C 789.85253,-217.0917 787.74072,-217.70866 785.0625,-218.9375 C 782.38432,-220.16634 781.65905,-220.54839 779.40625,-221.21875 C 777.15346,-221.88909 775.50998,-222.22107 773.1875,-222.1875 z"
+- style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7329);enable-background:new" />
+- <path
+- id="path8199"
+- d="M 743.5625,-211.1875 C 745.35531,-211.05839 747.83563,-210.63785 749.3125,-210 C 750.7894,-209.36215 752.0286,-209.25844 754.5,-208.0625 C 756.94618,-206.87878 759.22054,-206.31584 761.375,-205.84375 C 763.70267,-205.33372 766.7946,-205.16311 770.375,-204.28125 C 769.23121,-205.25185 763.62741,-205.8719 761.84375,-206.21875 C 760.06008,-206.56559 757.9609,-207.10631 755.3125,-208.25 C 752.66409,-209.39368 751.91755,-209.76631 749.6875,-210.375 C 747.45742,-210.98368 745.86156,-211.28466 743.5625,-211.1875 z"
+- style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7325);enable-background:new" />
+- </g>
+- </g>
+- <path
+- style="opacity:1;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- d="M 863.87812,475.6679 C 865.52024,472.4499 867.39593,469.93261 868.73948,465.81892 C 869.5382,462.16103 872.05152,463.78819 875.99995,457.42202 C 877.40188,455.18252 881.47648,457.81338 884.96505,455.02291 C 886.23577,454.21972 887.84993,454.6186 889.44761,454.95978 C 893.213,456.27874 895.27337,458.66333 897.78137,460.76815 C 903.92043,466.73838 918.31551,468.71142 921.26741,467.08161 C 922.70146,464.17687 929.14869,461.67273 933.64178,455.96993 C 934.38989,454.84726 945.37114,447.22547 948.28899,449.40394"
+- id="path8201"
+- sodipodi:nodetypes="ccccccccc" />
+- <path
+- style="opacity:1;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- d="M 888.50059,465.25071 C 895.864,462.01774 902.31149,456.34231 909.20872,451.86619 C 912.51929,449.89665 916.07855,455.0822 920.00472,455.46485 C 922.30245,455.24672 923.71762,456.66744 925.68683,457.10635 C 930.84319,458.42414 928.08476,460.97123 935.66209,463.54607 C 941.8177,465.26647 944.56949,456.7476 950.56184,456.22247 C 955.43923,455.71948 958.66076,455.90644 962.17859,455.96993 C 966.10555,456.10882 966.25714,452.47233 968.23951,450.66663 C 971.22007,447.86141 975.39512,448.81691 978.38436,445.92573 C 979.4019,444.54105 980.33894,442.91488 981.11895,440.81764 C 982.00096,438.8173 984.15901,441.12362 985.91718,442.08033"
+- id="path8203"
+- sodipodi:nodetypes="ccccccccccc" />
+- </g>
+- <g
+- inkscape:groupmode="layer"
+- id="layer15"
+- inkscape:label="Feet"
+- style="display:inline">
+- <path
+- style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter9048);enable-background:accumulate"
+- d="M 403.27922,1056.3058 L 459.84776,1013.8794 L 531.97265,1028.0215 L 485.30361,1080.3474 L 431.56349,1087.4185 L 403.27922,1056.3058 z"
+- id="path8994" />
+- <path
+- style="opacity:1;fill:#ada469;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- d="M 542.27183,1060.5719 C 540.86456,1079.3731 541.12693,1093.3229 544.35357,1109.8752 C 547.58023,1126.4275 560.75966,1155.7825 564.68798,1173.0589 C 568.61419,1190.326 567.38211,1211.3686 552.22854,1224.2072 C 536.91093,1237.1846 510.17726,1245.8061 484.39623,1239.9409 C 458.61518,1234.0757 414.84716,1190.7175 395.80604,1169.7126 C 376.6939,1148.6293 332.04518,1075.862 317.86751,1045.4368 C 303.68984,1015.0117 305.2079,1008.7182 309.74779,999.90708 C 300.38107,975.38658 297.33408,949.84027 276.03534,924.33044 C 306.36081,927.44488 319.91562,951.28677 336.16102,971.47019 C 330.63113,923.39416 318.10631,907.05369 307.78707,880.74589 C 337.78137,886.82754 358.36643,912.61828 371.76686,953.45839 C 381.32101,949.54048 390.00462,944.08545 401.95427,944.39719 C 390.65677,902.70139 384.00481,874.48135 365.26702,843.32725 C 418.70898,848.99758 448.92404,923.96657 444.23844,931.28805 C 454.21641,929.04406 463.24409,924.75767 474.67497,925.63638 C 463.426,887.28936 453.62716,848.76848 471.01526,806.98819 C 471.01526,806.98819 519.30204,872.42507 525.40492,892.79397 C 531.50779,913.16287 526.92373,931.49448 526.92373,931.49448 C 526.92373,931.49448 543.8833,962.57978 547.21765,982.58862 C 550.59075,1002.83 543.68496,1041.6919 542.27183,1060.5719 z"
+- id="path4189"
+- sodipodi:nodetypes="czzzzzzcccccccccczczz" />
+- <path
+- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter3587);enable-background:accumulate"
+- d="M 719.5,738.69519 L 737.81177,754.12715 L 782.2228,738.73894 L 805.5,713.19519 L 816.96397,732.41584 L 847.63558,745.19938 L 872.73295,750.92775 L 892,723.19519 L 908.02309,747.02126 L 947,752.19519 L 957.24541,745.99667 L 964.00012,754.69487 L 989.5,765.69519 L 991.5,725.19519 L 955.94866,710.6576 L 923.45591,689.1305 L 883.0038,677.66492 L 861.69668,662.13148 L 840,685.19519 L 755.02878,638.61208 L 722,676.69519 L 719.5,738.69519 z"
+- id="path4191"
+- sodipodi:nodetypes="cccccccccccccccccccccc"
+- clip-path="url(#clipPath3631)"
+- transform="matrix(-0.9045327,0.2506626,0.2506626,0.9045327,995.28646,23.53493)" />
+- <path
+- style="opacity:0.58775509;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:20.79999924;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;filter:url(#filter3898);enable-background:new"
+- d="M 584,696.5 L 577.4375,713.65625 C 577.4375,713.65625 569.62598,734.02113 561.75,757.3125 C 557.81201,768.95818 553.86698,781.35395 550.8125,792.4375 C 547.75802,803.52105 545.47664,812.81736 545.3125,820.71875 C 544.91443,839.88071 551.05903,855.60705 554.25,862.46875 C 553.47847,866.02398 552.25863,871.92307 550.90625,880.5625 C 548.98583,892.83071 547.18798,907.71691 548.53125,920.4375 C 549.91334,933.52585 555.34347,948.62515 561.125,963.46875 C 566.90653,978.31235 573.17935,992.69586 576.34375,1001.5 C 582.97581,1019.9519 586.33671,1033.0763 587.65625,1050 C 588.2376,1057.4561 587.41398,1070.336 586.40625,1083.375 C 585.39852,1096.414 584.21964,1109.6764 584.71875,1120.3438 C 585.70786,1141.4836 594.04673,1167.1785 618.09375,1178.2812 C 640.86858,1188.7966 673.42057,1189.9834 701.53125,1174.8438 C 717.69117,1166.1404 731.60759,1147.7462 744.90625,1127.9375 C 758.20491,1108.1288 769.87542,1086.8841 776.84375,1073.0312 C 792.19667,1042.51 816.23728,957.56702 822.46875,920.3125 C 825.48734,902.26597 826.39041,891.24695 825.09375,882.28125 C 824.11522,875.51521 821.26556,870.13385 818.21875,866.0625 C 820.26149,838.55459 817.48668,814.69372 830.1875,786.65625 L 840.75,763.375 L 816.9375,772.6875 C 799.44775,779.52503 788.03586,791.73286 780.34375,804.75 C 780.02124,805.29577 779.78061,805.85776 779.46875,806.40625 C 779.69078,783.89104 783.87659,768.76866 786.0625,747.71875 L 788.03125,728.71875 L 771,737.375 C 740.40551,752.93071 725.30511,785.56821 721.28125,827.59375 C 717.03593,826.96828 712.44985,826.5741 707.46875,826.75 C 707.17726,787.56964 707.07246,759.71315 716.0625,727.375 L 721.65625,707.25 L 702.21875,714.90625 C 671.30938,727.11019 654.35921,756.83698 645.59375,783.28125 C 641.21102,796.50339 638.84793,809.08246 638,819.21875 C 637.76797,821.99248 637.68894,824.53007 637.6875,826.9375 C 634.44563,826.90109 631.26698,827.07339 627.625,827.4375 C 627.66662,788.43277 624.14076,747.68335 595.34375,710.9375 L 584,696.5 z M 589.8125,740.3125 C 606.61941,770.95633 607.28701,804.27978 606.75,840.0625 L 606.53125,855.125 L 618.56618,848.58579 C 627.22823,845.45277 638.12676,848.35827 650.5,847.75 L 665.17465,857.1066 L 658.84375,831.3125 C 658.7541,831.08253 658.62329,830.89581 658.59375,830.59375 C 658.39424,828.55389 658.37143,825.12068 658.71875,820.96875 C 659.41339,812.66489 661.50832,801.38351 665.34375,789.8125 C 670.49907,774.25956 678.83176,758.62002 690.46875,747.28125 C 685.78494,775.91923 687.25316,807.54059 687.45711,843.08639 L 684.69118,856.34803 L 700.1875,848.75 C 709.2169,845.99229 717.37647,848.40004 729.46875,849.84375 L 742.71507,859.28798 L 741.09375,840 C 742.54168,809.02823 749.31524,786.32192 761.8125,771.125 C 758.82562,790.90384 756.38207,812.9098 762.125,849.46875 L 763.19052,855.84193 L 760.25237,867.35878 L 770.86948,859.1906 L 780.05921,869.41258 L 778.51093,858.94898 L 781.9375,852 C 787.63852,838.78851 792.11032,825.78663 798.28125,815.34375 C 799.24111,813.71941 800.31278,812.27939 801.34375,810.78125 C 797.66309,831.9366 798.91659,850.9894 797.25,868.5625 L 792.56986,876.36948 L 799.96875,876.59375 C 803.1888,880.07736 803.83625,880.44443 804.53125,885.25 C 805.22625,890.05557 804.84987,899.65035 801.96875,916.875 C 796.40076,950.16292 770.12313,994.71481 758.22835,1018.3614 C 751.62344,1031.4918 739.70002,1075.8473 727.105,1094.6079 C 714.50998,1113.3684 698.57363,1134.3752 689.93296,1139.0288 C 668.44244,1150.603 645.37702,1164.5347 629.31407,1157.1183 C 614.93921,1150.4813 606.27438,1135.9256 605.5,1119.375 C 605.11689,1111.187 606.11279,1098.0658 607.125,1084.9688 C 608.13721,1071.8717 618.41391,1062.398 622.54839,1048.4062 C 627.92068,1030.2254 621.10152,1011.8118 610.04839,994.46875 C 603.56184,984.29097 586.07159,970.21085 580.5,955.90625 C 574.92841,941.60165 570.13249,926.9031 569.21875,918.25 C 568.29254,909.47887 569.64125,895.22498 571.4375,883.75 C 573.23375,872.27503 575.28125,863.46875 575.28125,863.46875 L 584.70403,859.85355 L 574.21875,855.96875 C 574.21875,855.96875 565.71986,840.65865 566.125,821.15625 C 566.19611,817.73309 567.96126,808.4282 570.84375,797.96875 C 573.72624,787.5093 577.60841,775.41604 581.46875,764 C 584.51314,754.99692 587.24938,747.39655 589.8125,740.3125 z"
+- id="path4193"
+- clip-path="url(#clipPath3677)"
+- sodipodi:nodetypes="ccssscsssssssssssssccccscccccccccsscccccccccccssscccccccccccccccsccccssssssssssssscccsssc"
+- transform="matrix(-0.9045327,0.2506626,0.2506626,0.9045327,822.28931,10.93589)" />
+- <g
+- id="g3617"
+- clip-path="url(#clipPath3622)"
+- transform="translate(276,136)">
+- <path
+- transform="matrix(-0.9045327,0.2506626,0.2506626,0.9045327,-52.200498,74.09707)"
+- id="path4195"
+- d="M -15.66751,843.48852 L -65.16499,827.93217 L -92.03504,880.25807 L -51.02285,925.51291 L -1.52538,887.32914 L -15.66751,843.48852 z"
+- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter9024);enable-background:accumulate" />
+- <path
+- sodipodi:nodetypes="ccccccccccccc"
+- transform="matrix(-0.9045327,0.2506626,0.2506626,0.9045327,-46.92842,75.511284)"
+- id="path4197"
+- d="M 118.70648,859.93048 L 63.552152,813.26144 L 19.711532,850.03099 L 53.652662,903.7711 L 40.055848,989.23313 L 0.61048221,1017.5253 L -40.401718,1028.839 L -43.230138,1075.508 L 13.338402,1100.9639 L 32.282389,1031.3139 L 55.738939,972.45727 L 102.08648,899.84236 L 118.70648,859.93048 z"
+- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter9020);enable-background:accumulate" />
+- </g>
+- <path
+- style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter9044);enable-background:accumulate"
+- d="M -70.82184,932.58397 L -10.01066,905.71392 L 90.3985,936.82662 L 26.75889,967.93931 L -55.26549,950.96875 L -70.82184,932.58397 z"
+- id="path4199"
+- transform="matrix(-0.9045327,0.2506626,0.2506626,0.9045327,229.07158,211.51128)" />
+- <path
+- style="opacity:0.58775509;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:20.79999924;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;filter:url(#filter4105);enable-background:new"
+- d="M 583.0625,715.75 C 570.95641,750.19974 556.348,784.28333 551.3125,820.59375 C 550.48042,835.52242 555.90165,849.75318 560.15625,863.65625 C 554.24001,890.85751 550.01944,920.5562 561.3125,946.78125 C 574.82967,984.9421 596.31397,1022.4634 593.73529,1064.2495 C 592.78699,1093.5437 584.72085,1125.2436 599.125,1152.5312 C 609.32364,1171.866 632.26456,1179.8429 653.09285,1180.1988 C 680.95504,1181.3729 709.55546,1168.5772 725.09375,1144.9375 C 747.68924,1115.5658 766.89426,1083.4402 780.3324,1048.8777 C 797.22293,1003.3717 810.0042,956.31698 818.26642,908.4788 C 820.09082,895.53774 821.3675,881.00895 813.6875,869.65625 C 810.25635,862.31993 813.72957,854.09611 813.00293,846.34648 C 813.67693,821.35182 817.01525,795.68272 829.65625,773.75 C 811.92312,780.1946 794.58357,790.30971 785.65318,807.61425 C 781.7181,814.3238 778.04836,821.18838 774.28125,828 C 770.73126,797.98592 778.00088,768.35172 781.0625,738.71875 C 760.89646,747.77338 744.18578,764.37397 736.88755,785.40075 C 730.58292,800.98078 728.08533,817.71793 726.625,834.4375 C 718.37166,832.91825 709.94053,832.33595 701.5625,832.9375 C 700.59942,794.23963 701.09554,753.53035 712.53125,717.03125 C 693.85012,723.24901 677.36504,735.76676 666.90322,752.41848 C 653.05068,773.29827 645.64182,798.17243 643.84375,823.03125 C 644.42909,827.35579 643.78249,834.87134 637.5,832.90625 C 632.16882,832.9238 626.87092,833.58508 621.5625,834 C 622.71034,794.61852 618.22106,752.3718 594.5,719.78125 C 591.43929,716.14408 588.86315,712.09687 585.875,708.4375 C 584.9375,710.875 584,713.3125 583.0625,715.75 z M 590.8125,729.59375 C 609.37777,758.89004 613.295,794.41387 612.9375,828.46875 C 613.14159,833.64401 612.42094,840.29795 613.0625,844.53125 C 625.38106,838.4285 639.80162,842.09135 652.84375,842.34375 C 655.16087,843.567 656.03585,843.99618 654.75,840.9375 C 650.58545,826.98465 652.90172,812.3245 656.55504,798.52986 C 662.92191,772.23922 677.18332,747.44188 699.375,731.5 C 690.75791,768.73706 693.65842,808.06161 693.28125,845.46875 C 705.53469,838.55885 720.56004,842.02262 733.3125,845.21875 C 736.70472,848.75355 735.60185,844.48927 735.5,841.40625 C 735.01691,820.03567 739.63133,798.33662 749.1875,779.25 C 755.15016,768.56273 763.43088,759.44621 771.625,750.375 C 763.75344,784.2131 762.4221,819.71093 768.90625,853.875 C 770.6311,852.46382 773.51306,853.42086 774.5625,853.5 C 784.24619,832.26318 790.91362,808.11938 809.45266,792.75815 C 811.32595,792.38693 808.00448,801.2831 807.96875,804.65625 C 804.43387,826.50206 800.79359,848.79859 799.18454,870.87536 C 790.40075,873.21707 802.03289,873.1989 802.65329,874.93786 C 810.5764,885.50366 807.31628,899.34258 806.28494,911.2912 C 799.22089,956.32475 784.14263,998.65314 770.33139,1041.971 C 758.25663,1074.9203 742.95719,1100.8235 722.44331,1129.1725 C 711.49074,1142.7239 699.19859,1157.0238 681.59956,1161.6725 C 661.44355,1167.9138 637.3928,1172.5494 619,1161.7188 C 601.71034,1149.3774 597.97607,1126.0099 599.73774,1106.0324 C 599.78653,1090.2062 604.6766,1077.5203 604.14834,1062.5406 C 603.6101,1047.2777 601.85699,1031.9759 597.60573,1015.6743 C 593.35447,999.37268 588.56248,990.75636 581.48667,974.10092 C 574.24556,957.05636 566.41652,937.35229 563.28125,917.8125 C 561.53177,899.18536 566.17296,880.68988 569.0625,862.5625 C 572.35873,859.72554 567.46451,857.36591 566.75,854.375 C 559.14887,837.35992 558.34253,817.6001 564.00766,799.81502 C 571.13786,774.74272 579.76853,750.18261 588.6875,725.6875 C 589.39583,726.98958 590.10417,728.29167 590.8125,729.59375 z"
+- id="path4201"
+- sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccccczzzcccccc"
+- clip-path="url(#clipPath4177)"
+- transform="matrix(-0.9045327,0.2506626,0.2506626,0.9045327,822.28931,10.93589)" />
+- <path
+- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4130);enable-background:accumulate"
+- d="M 735.05635,733.03834 L 737.81177,754.12715 L 782.2228,738.73894 L 787.07343,716.34919 L 783.13726,694.29697 L 760.68563,657.70396 L 752.40559,688.0089 L 735.05635,733.03834 z"
+- id="path4203"
+- sodipodi:nodetypes="cccccccc"
+- clip-path="url(#clipPath3631)"
+- transform="matrix(-0.9045327,0.2506626,0.2506626,0.9045327,995.28646,23.53493)" />
+- <path
+- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4141);enable-background:accumulate"
+- d="M 831.81321,730.29452 L 847.63558,745.19938 L 868.49031,748.09932 L 866.90002,708.17334 L 875.22563,677.66492 L 868.06064,671.32386 L 846.36395,692.26626 L 831.81321,730.29452 z"
+- id="path4205"
+- sodipodi:nodetypes="cccccccc"
+- clip-path="url(#clipPath3631)"
+- transform="matrix(-0.9045327,0.2506626,0.2506626,0.9045327,995.28646,23.53493)" />
+- <g
+- id="g8317"
+- style="filter:url(#filter8333)"
+- clip-path="url(#clipPath8338)"
+- transform="translate(276,136)">
+- <path
+- transform="matrix(-0.9045327,0.2506626,0.2506626,0.9045327,719.28646,-112.46507)"
+- clip-path="none"
+- sodipodi:nodetypes="ccccc"
+- id="path4209"
+- d="M 964.00012,754.69487 L 982.42893,762.15966 L 991.5,725.19519 L 976.62969,730.03405 L 964.00012,754.69487 z"
+- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+- <rect
+- y="757.19519"
+- x="-55"
+- height="177"
+- width="182"
+- id="rect8315"
+- style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:25;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+- </g>
+- <g
+- id="g8346"
+- style="filter:url(#filter8354)"
+- clip-path="url(#clipPath8359)"
+- transform="translate(276,136)">
+- <path
+- transform="matrix(-0.9045327,0.2506626,0.2506626,0.9045327,719.28646,-112.46507)"
+- clip-path="none"
+- sodipodi:nodetypes="ccccccc"
+- id="path4207"
+- d="M 910.14441,746.31415 L 942.75736,751.48808 L 942.39617,727.61189 L 949.5847,697.92968 L 941.13358,692.66603 L 919.31164,719.1768 L 910.14441,746.31415 z"
+- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+- <rect
+- y="696.19519"
+- x="-22"
+- height="176"
+- width="165"
+- id="rect8344"
+- style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:25;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+- </g>
+- </g>
+- <g
+- inkscape:groupmode="layer"
+- id="layer16"
+- inkscape:label="Left Foot"
+- style="display:inline">
+- <path
+- style="opacity:1;fill:#ada469;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new"
+- d="M 1036.164,1071.8338 C 1042.9581,1090.7366 1046.6577,1105.1335 1048.0543,1123.0457 C 1049.4509,1140.958 1044.2716,1174.8465 1045.1538,1193.7018 C 1046.0356,1212.547 1053.2875,1233.8008 1072.4984,1242.6707 C 1091.9173,1251.6365 1121.8177,1252.882 1146.6183,1239.5251 C 1171.4189,1226.1681 1204.0193,1169.1996 1217.5925,1142.2164 C 1231.2164,1115.1325 1256.3536,1027.719 1262.2533,992.44781 C 1268.1531,957.1766 1264.8039,951.14704 1257.6359,943.39232 C 1260.2762,915.55217 1256.1361,888.45689 1270.7455,856.20614 C 1240.4965,868.03184 1233.3632,896.36684 1222.4266,921.71122 C 1214.4257,870.77829 1222.6358,850.43803 1225.7455,820.49186 C 1196.6808,835.26977 1182.884,867.60588 1180.7455,913.349 C 1169.8216,912.0448 1159.3541,908.91477 1147.1741,912.63471 C 1146.9101,866.61137 1145.7106,835.7453 1156.0847,798.42822 C 1102.8293,819.45508 1093.1375,905.02232 1100.0312,911.20614 C 1089.1484,911.74114 1078.6602,909.90884 1067.1741,914.06329 C 1067.813,871.49194 1066.9136,829.15468 1037.1741,791.20614 C 1037.1741,791.20614 1006.2161,872.12848 1005.7455,894.77757 C 1005.275,917.42666 1015.1971,934.94345 1015.1971,934.94345 C 1015.1971,934.94345 1006.6291,971.68396 1008.8985,993.17568 C 1011.1944,1014.9171 1029.3414,1052.8519 1036.164,1071.8338 z"
+- id="path8848"
+- sodipodi:nodetypes="czzzzzzcccccccccczczz" />
+- <path
+- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter3587);enable-background:accumulate"
+- d="M 719.5,738.69519 L 737.81177,754.12715 L 782.2228,738.73894 L 805.5,713.19519 L 816.96397,732.41584 L 847.63558,745.19938 L 872.73295,750.92775 L 892,723.19519 L 908.02309,747.02126 L 947,752.19519 L 957.24541,745.99667 L 964.00012,754.69487 L 989.5,765.69519 L 991.5,725.19519 L 955.94866,710.6576 L 923.45591,689.1305 L 883.0038,677.66492 L 861.69668,662.13148 L 840,685.19519 L 755.02878,638.61208 L 722,676.69519 L 719.5,738.69519 z"
+- id="path3635"
+- sodipodi:nodetypes="cccccccccccccccccccccc"
+- clip-path="url(#clipPath3631)"
+- transform="translate(276,136)" />
+- <path
+- transform="translate(450.03125,73.843964)"
+- style="opacity:0.58775509;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:20.79999924;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;filter:url(#filter3898);enable-background:new"
+- d="M 584,696.5 L 577.4375,713.65625 C 577.4375,713.65625 569.62598,734.02113 561.75,757.3125 C 557.81201,768.95818 553.86698,781.35395 550.8125,792.4375 C 547.75802,803.52105 545.47664,812.81736 545.3125,820.71875 C 544.91443,839.88071 551.05903,855.60705 554.25,862.46875 C 553.47847,866.02398 552.25863,871.92307 550.90625,880.5625 C 548.98583,892.83071 547.18798,907.71691 548.53125,920.4375 C 549.91334,933.52585 555.34347,948.62515 561.125,963.46875 C 566.90653,978.31235 573.17935,992.69586 576.34375,1001.5 C 582.97581,1019.9519 586.33671,1033.0763 587.65625,1050 C 588.2376,1057.4561 587.41398,1070.336 586.40625,1083.375 C 585.39852,1096.414 584.21964,1109.6764 584.71875,1120.3438 C 585.70786,1141.4836 594.04673,1167.1785 618.09375,1178.2812 C 640.86858,1188.7966 673.42057,1189.9834 701.53125,1174.8438 C 717.69117,1166.1404 731.60759,1147.7462 744.90625,1127.9375 C 758.20491,1108.1288 769.87542,1086.8841 776.84375,1073.0312 C 792.19667,1042.51 816.23728,957.56702 822.46875,920.3125 C 825.48734,902.26597 826.39041,891.24695 825.09375,882.28125 C 824.11522,875.51521 821.26556,870.13385 818.21875,866.0625 C 820.26149,838.55459 817.48668,814.69372 830.1875,786.65625 L 840.75,763.375 L 816.9375,772.6875 C 799.44775,779.52503 788.03586,791.73286 780.34375,804.75 C 780.02124,805.29577 779.78061,805.85776 779.46875,806.40625 C 779.69078,783.89104 783.87659,768.76866 786.0625,747.71875 L 788.03125,728.71875 L 771,737.375 C 740.40551,752.93071 725.30511,785.56821 721.28125,827.59375 C 717.03593,826.96828 712.44985,826.5741 707.46875,826.75 C 707.17726,787.56964 707.07246,759.71315 716.0625,727.375 L 721.65625,707.25 L 702.21875,714.90625 C 671.30938,727.11019 654.35921,756.83698 645.59375,783.28125 C 641.21102,796.50339 638.84793,809.08246 638,819.21875 C 637.76797,821.99248 637.68894,824.53007 637.6875,826.9375 C 634.44563,826.90109 631.26698,827.07339 627.625,827.4375 C 627.66662,788.43277 624.14076,747.68335 595.34375,710.9375 L 584,696.5 z M 589.8125,740.3125 C 606.61941,770.95633 607.28701,804.27978 606.75,840.0625 L 606.53125,855.125 L 618.56618,848.58579 C 627.22823,845.45277 638.12676,848.35827 650.5,847.75 L 665.17465,857.1066 L 658.84375,831.3125 C 658.7541,831.08253 658.62329,830.89581 658.59375,830.59375 C 658.39424,828.55389 658.37143,825.12068 658.71875,820.96875 C 659.41339,812.66489 661.50832,801.38351 665.34375,789.8125 C 670.49907,774.25956 678.83176,758.62002 690.46875,747.28125 C 685.78494,775.91923 687.25316,807.54059 687.45711,843.08639 L 684.69118,856.34803 L 700.1875,848.75 C 709.2169,845.99229 717.37647,848.40004 729.46875,849.84375 L 742.71507,859.28798 L 741.09375,840 C 742.54168,809.02823 749.31524,786.32192 761.8125,771.125 C 758.82562,790.90384 756.38207,812.9098 762.125,849.46875 L 763.19052,855.84193 L 760.25237,867.35878 L 770.86948,859.1906 L 780.05921,869.41258 L 778.51093,858.94898 L 781.9375,852 C 787.63852,838.78851 792.11032,825.78663 798.28125,815.34375 C 799.24111,813.71941 800.31278,812.27939 801.34375,810.78125 C 797.66309,831.9366 798.91659,850.9894 797.25,868.5625 L 792.56986,876.36948 L 799.96875,876.59375 C 803.1888,880.07736 803.83625,880.44443 804.53125,885.25 C 805.22625,890.05557 804.84987,899.65035 801.96875,916.875 C 796.40076,950.16292 770.17603,1040.0409 758.28125,1063.6875 C 751.67634,1076.8179 740.25127,1097.5832 727.65625,1116.3438 C 715.06123,1135.1043 700.29692,1151.8776 691.65625,1156.5312 C 670.16573,1168.1054 642.87545,1166.7914 626.8125,1159.375 C 612.43764,1152.738 606.27438,1135.9256 605.5,1119.375 C 605.11689,1111.187 606.11279,1098.0658 607.125,1084.9688 C 608.13721,1071.8717 618.41391,1062.398 622.54839,1048.4062 C 627.92068,1030.2254 621.10152,1011.8118 610.04839,994.46875 C 603.56184,984.29097 586.07159,970.21085 580.5,955.90625 C 574.92841,941.60165 570.13249,926.9031 569.21875,918.25 C 568.29254,909.47887 569.64125,895.22498 571.4375,883.75 C 573.23375,872.27503 575.28125,863.46875 575.28125,863.46875 L 584.70403,859.85355 L 574.21875,855.96875 C 574.21875,855.96875 565.71986,840.65865 566.125,821.15625 C 566.19611,817.73309 567.96126,808.4282 570.84375,797.96875 C 573.72624,787.5093 577.60841,775.41604 581.46875,764 C 584.51314,754.99692 587.24938,747.39655 589.8125,740.3125 z"
+- id="path3669"
+- clip-path="url(#clipPath3677)"
+- sodipodi:nodetypes="ccssscsssssssssssssccccscccccccccsscccccccccccssscccccccccccccccsccccssssssssssssscccsssc" />
+- <g
+- id="g3628"
+- clip-path="url(#clipPath3636)"
+- transform="translate(276,136)">
+- <path
+- id="path8988"
+- d="M 824.48651,818.48242 L 774.98903,802.92607 L 748.11898,855.25197 L 789.13117,900.50681 L 838.62864,862.32304 L 824.48651,818.48242 z"
+- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter9024);enable-background:accumulate" />
+- <path
+- id="path8990"
+- d="M 964.49365,855.25197 L 909.33932,808.58293 L 865.4987,845.35248 L 899.43983,899.09259 L 906.51089,965.56063 L 855.59921,1000.916 L 814.58701,1012.2297 L 811.75859,1058.8987 L 868.32713,1084.3546 L 931.96674,1007.987 L 956.00837,913.23473 L 964.49365,855.25197 z"
+- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter9020);enable-background:accumulate" />
+- </g>
+- <path
+- style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter9044);enable-background:accumulate"
+- d="M 1045.3322,1043.5779 L 1106.1434,1016.7078 L 1206.5525,1047.8205 L 1142.9129,1078.9332 L 1060.8885,1061.9626 L 1045.3322,1043.5779 z"
+- id="path8992" />
+- <path
+- transform="translate(450.03125,73.843964)"
+- style="opacity:0.58775509;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:20.79999924;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;filter:url(#filter4185);enable-background:new"
+- d="M 583.0625,715.75 C 570.95641,750.19974 556.348,784.28333 551.3125,820.59375 C 550.48042,835.52242 555.90165,849.75318 560.15625,863.65625 C 554.24001,890.85751 550.01944,920.5562 561.3125,946.78125 C 574.82967,984.9421 596.31397,1022.4634 593.73529,1064.2495 C 592.78699,1093.5437 584.72085,1125.2436 599.125,1152.5312 C 609.32364,1171.866 632.26456,1179.8429 653.09285,1180.1988 C 680.95504,1181.3729 709.55546,1168.5772 725.09375,1144.9375 C 747.68924,1115.5658 766.89426,1083.4402 780.3324,1048.8777 C 797.22293,1003.3717 810.0042,956.31698 818.26642,908.4788 C 820.09082,895.53774 821.3675,881.00895 813.6875,869.65625 C 810.25635,862.31993 813.72957,854.09611 813.00293,846.34648 C 813.67693,821.35182 817.01525,795.68272 829.65625,773.75 C 811.92312,780.1946 794.58357,790.30971 785.65318,807.61425 C 781.7181,814.3238 778.04836,821.18838 774.28125,828 C 770.73126,797.98592 778.00088,768.35172 781.0625,738.71875 C 760.89646,747.77338 744.18578,764.37397 736.88755,785.40075 C 730.58292,800.98078 728.08533,817.71793 726.625,834.4375 C 718.37166,832.91825 709.94053,832.33595 701.5625,832.9375 C 700.59942,794.23963 701.09554,753.53035 712.53125,717.03125 C 693.85012,723.24901 677.36504,735.76676 666.90322,752.41848 C 653.05068,773.29827 645.64182,798.17243 643.84375,823.03125 C 644.42909,827.35579 643.78249,834.87134 637.5,832.90625 C 632.16882,832.9238 626.87092,833.58508 621.5625,834 C 622.71034,794.61852 618.22106,752.3718 594.5,719.78125 C 591.43929,716.14408 588.86315,712.09687 585.875,708.4375 C 584.9375,710.875 584,713.3125 583.0625,715.75 z M 590.8125,729.59375 C 609.37777,758.89004 613.295,794.41387 612.9375,828.46875 C 613.14159,833.64401 612.42094,840.29795 613.0625,844.53125 C 625.38106,838.4285 639.80162,842.09135 652.84375,842.34375 C 655.16087,843.567 656.03585,843.99618 654.75,840.9375 C 650.58545,826.98465 652.90172,812.3245 656.55504,798.52986 C 662.92191,772.23922 677.18332,747.44188 699.375,731.5 C 690.75791,768.73706 693.65842,808.06161 693.28125,845.46875 C 705.53469,838.55885 720.56004,842.02262 733.3125,845.21875 C 736.70472,848.75355 735.60185,844.48927 735.5,841.40625 C 735.01691,820.03567 739.63133,798.33662 749.1875,779.25 C 755.15016,768.56273 763.43088,759.44621 771.625,750.375 C 763.75344,784.2131 762.4221,819.71093 768.90625,853.875 C 770.6311,852.46382 773.51306,853.42086 774.5625,853.5 C 784.24619,832.26318 790.91362,808.11938 809.45266,792.75815 C 811.32595,792.38693 808.00448,801.2831 807.96875,804.65625 C 804.43387,826.50206 804.67155,848.82948 803.0625,870.90625 C 801.75012,872.28304 805.91085,873.22979 806.53125,874.96875 C 814.45436,885.53455 809.65419,899.80024 808.62285,911.74886 C 801.5588,956.78241 786.85732,1000.1282 773.04608,1043.446 C 760.97132,1076.3953 742.32638,1106.526 721.8125,1134.875 C 710.85993,1148.4264 698.56778,1162.7263 680.96875,1167.375 C 660.81274,1173.6163 637.3928,1172.5494 619,1161.7188 C 601.71034,1149.3774 597.97607,1126.0099 599.73774,1106.0324 C 599.78653,1090.2062 602.10985,1078.2316 607.65521,1063.2271 C 613.20056,1048.2226 610.12626,1031.8954 605.875,1015.5938 C 601.62374,999.2922 593.69597,989.33378 584.05342,973.38963 C 574.41087,957.44548 566.41652,937.35229 563.28125,917.8125 C 561.53177,899.18536 566.17296,880.68988 569.0625,862.5625 C 572.35873,859.72554 567.46451,857.36591 566.75,854.375 C 559.14887,837.35992 558.34253,817.6001 564.00766,799.81502 C 571.13786,774.74272 579.76853,750.18261 588.6875,725.6875 C 589.39583,726.98958 590.10417,728.29167 590.8125,729.59375 z"
+- id="path4149"
+- sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccccczzzcccccc"
+- clip-path="url(#clipPath4177)" />
+- <path
+- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4130);enable-background:accumulate"
+- d="M 735.05635,733.03834 L 737.81177,754.12715 L 782.2228,738.73894 L 787.07343,716.34919 L 783.13726,694.29697 L 760.68563,657.70396 L 752.40559,688.0089 L 735.05635,733.03834 z"
+- id="path3902"
+- sodipodi:nodetypes="cccccccc"
+- clip-path="url(#clipPath3631)"
+- transform="translate(276,136)" />
+- <path
+- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4141);enable-background:accumulate"
+- d="M 831.81321,730.29452 L 847.63558,745.19938 L 868.49031,748.09932 L 866.90002,708.17334 L 875.22563,677.66492 L 868.06064,671.32386 L 846.36395,692.26626 L 831.81321,730.29452 z"
+- id="path4135"
+- sodipodi:nodetypes="cccccccc"
+- clip-path="url(#clipPath3631)"
+- transform="translate(276,136)" />
+- <g
+- id="g8367"
+- style="filter:url(#filter8379)"
+- clip-path="url(#clipPath8392)"
+- transform="translate(276,136)">
+- <path
+- clip-path="none"
+- sodipodi:nodetypes="ccccccc"
+- id="path4145"
+- d="M 910.14441,746.31415 L 942.75736,751.48808 L 942.39617,727.61189 L 949.5847,697.92968 L 941.13358,692.66603 L 919.31164,719.1768 L 910.14441,746.31415 z"
+- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+- <rect
+- y="650.19098"
+- x="877.51953"
+- height="172.53406"
+- width="123.03658"
+- id="rect8365"
+- style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:25;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+- </g>
+- <g
+- id="g8400"
+- style="filter:url(#filter8404)"
+- clip-path="url(#clipPath8417)"
+- transform="translate(276,136)">
+- <path
+- clip-path="none"
+- sodipodi:nodetypes="ccccc"
+- id="path4147"
+- d="M 964.00012,754.69487 L 982.42893,762.15966 L 991.5,725.19519 L 976.62969,730.03405 L 964.00012,754.69487 z"
+- style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+- <rect
+- y="677.06104"
+- x="924.89569"
+- height="125.1579"
+- width="142.12846"
+- id="rect8398"
+- style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:25;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+- </g>
+- </g>
+-</svg>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/logo.txt linux-2.6.29-rc3.owrt/Documentation/logo.txt
+--- linux-2.6.29.owrt/Documentation/logo.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/logo.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -1,4 +1,13 @@
+-Tux is taking a three month sabbatical to work as a barber, so Tuz is
+-standing in. He's taken pains to ensure you'll hardly notice.
++This is the full-colour version of the currently unofficial Linux logo
++("currently unofficial" just means that there has been no paperwork and
++that I have not really announced it yet). It was created by Larry Ewing,
++and is freely usable as long as you acknowledge Larry as the original
++artist.
++
++Note that there are black-and-white versions of this available that
++scale down to smaller sizes and are better for letterheads or whatever
++you want to use it for: for the full range of logos take a look at
++Larry's web-page:
++
++ http://www.isc.tamu.edu/~lewing/linux/
+
+-Image by Andrew McGown and Josh Bush. Image is licensed CC BY-SA.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/networking/alias.txt linux-2.6.29-rc3.owrt/Documentation/networking/alias.txt
+--- linux-2.6.29.owrt/Documentation/networking/alias.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/networking/alias.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -2,14 +2,14 @@
+ IP-Aliasing:
+ ============
+
+-IP-aliases are an obsolete way to manage multiple IP-addresses/masks
+-per interface. Newer tools such as iproute2 support multiple
+-address/prefixes per interface, but aliases are still supported
+-for backwards compatibility.
+-
+-An alias is formed by adding a colon and a string when running ifconfig.
++IP-aliases are additional IP-addresses/masks hooked up to a base
++interface by adding a colon and a string when running ifconfig.
+ This string is usually numeric, but this is not a must.
+
++IP-Aliases are avail if CONFIG_INET (`standard' IPv4 networking)
++is configured in the kernel.
++
++
+ o Alias creation.
+ Alias creation is done by 'magic' interface naming: eg. to create a
+ 200.1.1.1 alias for eth0 ...
+@@ -38,3 +38,16 @@
+
+ If the base device is shut down the added aliases will be deleted
+ too.
++
++
++Contact
++-------
++Please finger or e-mail me:
++ Juan Jose Ciarlante <jjciarla@raiz.uncu.edu.ar>
++
++Updated by Erik Schoenfelder <schoenfr@gaertner.DE>
++
++; local variables:
++; mode: indented-text
++; mode: auto-fill
++; end:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/networking/ipv6.txt linux-2.6.29-rc3.owrt/Documentation/networking/ipv6.txt
+--- linux-2.6.29.owrt/Documentation/networking/ipv6.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/networking/ipv6.txt 1970-01-01 01:00:00.000000000 +0100
+@@ -1,35 +0,0 @@
+-
+-Options for the ipv6 module are supplied as parameters at load time.
+-
+-Module options may be given as command line arguments to the insmod
+-or modprobe command, but are usually specified in either the
+-/etc/modules.conf or /etc/modprobe.conf configuration file, or in a
+-distro-specific configuration file.
+-
+-The available ipv6 module parameters are listed below. If a parameter
+-is not specified the default value is used.
+-
+-The parameters are as follows:
+-
+-disable
+-
+- Specifies whether to load the IPv6 module, but disable all
+- its functionality. This might be used when another module
+- has a dependency on the IPv6 module being loaded, but no
+- IPv6 addresses or operations are desired.
+-
+- The possible values and their effects are:
+-
+- 0
+- IPv6 is enabled.
+-
+- This is the default value.
+-
+- 1
+- IPv6 is disabled.
+-
+- No IPv6 addresses will be added to interfaces, and
+- it will not be possible to open an IPv6 socket.
+-
+- A reboot is required to enable IPv6.
+-
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/PCI/PCIEBUS-HOWTO.txt linux-2.6.29-rc3.owrt/Documentation/PCI/PCIEBUS-HOWTO.txt
+--- linux-2.6.29.owrt/Documentation/PCI/PCIEBUS-HOWTO.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/PCI/PCIEBUS-HOWTO.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -93,7 +93,7 @@
+
+ int pcie_port_service_register(struct pcie_port_service_driver *new)
+
+-This API replaces the Linux Driver Model's pci_register_driver API. A
++This API replaces the Linux Driver Model's pci_module_init API. A
+ service driver should always calls pcie_port_service_register at
+ module init. Note that after service driver being loaded, calls
+ such as pci_enable_device(dev) and pci_set_master(dev) are no longer
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/powerpc/dts-bindings/fsl/mpc5200.txt linux-2.6.29-rc3.owrt/Documentation/powerpc/dts-bindings/fsl/mpc5200.txt
+--- linux-2.6.29.owrt/Documentation/powerpc/dts-bindings/fsl/mpc5200.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/powerpc/dts-bindings/fsl/mpc5200.txt 1970-01-01 01:00:00.000000000 +0100
+@@ -1,180 +0,0 @@
+-MPC5200 Device Tree Bindings
+-----------------------------
+-
+-(c) 2006-2009 Secret Lab Technologies Ltd
+-Grant Likely <grant.likely@secretlab.ca>
+-
+-Naming conventions
+-------------------
+-For mpc5200 on-chip devices, the format for each compatible value is
+-<chip>-<device>[-<mode>]. The OS should be able to match a device driver
+-to the device based solely on the compatible value. If two drivers
+-match on the compatible list; the 'most compatible' driver should be
+-selected.
+-
+-The split between the MPC5200 and the MPC5200B leaves a bit of a
+-conundrum. How should the compatible property be set up to provide
+-maximum compatibility information; but still accurately describe the
+-chip? For the MPC5200; the answer is easy. Most of the SoC devices
+-originally appeared on the MPC5200. Since they didn't exist anywhere
+-else; the 5200 compatible properties will contain only one item;
+-"fsl,mpc5200-<device>".
+-
+-The 5200B is almost the same as the 5200, but not quite. It fixes
+-silicon bugs and it adds a small number of enhancements. Most of the
+-devices either provide exactly the same interface as on the 5200. A few
+-devices have extra functions but still have a backwards compatible mode.
+-To express this information as completely as possible, 5200B device trees
+-should have two items in the compatible list:
+- compatible = "fsl,mpc5200b-<device>","fsl,mpc5200-<device>";
+-
+-It is *strongly* recommended that 5200B device trees follow this convention
+-(instead of only listing the base mpc5200 item).
+-
+-ie. ethernet on mpc5200: compatible = "fsl,mpc5200-fec";
+- ethernet on mpc5200b: compatible = "fsl,mpc5200b-fec", "fsl,mpc5200-fec";
+-
+-Modal devices, like PSCs, also append the configured function to the
+-end of the compatible field. ie. A PSC in i2s mode would specify
+-"fsl,mpc5200-psc-i2s", not "fsl,mpc5200-i2s". This convention is chosen to
+-avoid naming conflicts with non-psc devices providing the same
+-function. For example, "fsl,mpc5200-spi" and "fsl,mpc5200-psc-spi" describe
+-the mpc5200 simple spi device and a PSC spi mode respectively.
+-
+-At the time of writing, exact chip may be either 'fsl,mpc5200' or
+-'fsl,mpc5200b'.
+-
+-The soc node
+-------------
+-This node describes the on chip SOC peripherals. Every mpc5200 based
+-board will have this node, and as such there is a common naming
+-convention for SOC devices.
+-
+-Required properties:
+-name description
+----- -----------
+-ranges Memory range of the internal memory mapped registers.
+- Should be <0 [baseaddr] 0xc000>
+-reg Should be <[baseaddr] 0x100>
+-compatible mpc5200: "fsl,mpc5200-immr"
+- mpc5200b: "fsl,mpc5200b-immr"
+-system-frequency 'fsystem' frequency in Hz; XLB, IPB, USB and PCI
+- clocks are derived from the fsystem clock.
+-bus-frequency IPB bus frequency in Hz. Clock rate
+- used by most of the soc devices.
+-
+-soc child nodes
+----------------
+-Any on chip SOC devices available to Linux must appear as soc5200 child nodes.
+-
+-Note: The tables below show the value for the mpc5200. A mpc5200b device
+-tree should use the "fsl,mpc5200b-<device>","fsl,mpc5200-<device>" form.
+-
+-Required soc5200 child nodes:
+-name compatible Description
+----- ---------- -----------
+-cdm@<addr> fsl,mpc5200-cdm Clock Distribution
+-interrupt-controller@<addr> fsl,mpc5200-pic need an interrupt
+- controller to boot
+-bestcomm@<addr> fsl,mpc5200-bestcomm Bestcomm DMA controller
+-
+-Recommended soc5200 child nodes; populate as needed for your board
+-name compatible Description
+----- ---------- -----------
+-timer@<addr> fsl,mpc5200-gpt General purpose timers
+-gpio@<addr> fsl,mpc5200-gpio MPC5200 simple gpio controller
+-gpio@<addr> fsl,mpc5200-gpio-wkup MPC5200 wakeup gpio controller
+-rtc@<addr> fsl,mpc5200-rtc Real time clock
+-mscan@<addr> fsl,mpc5200-mscan CAN bus controller
+-pci@<addr> fsl,mpc5200-pci PCI bridge
+-serial@<addr> fsl,mpc5200-psc-uart PSC in serial mode
+-i2s@<addr> fsl,mpc5200-psc-i2s PSC in i2s mode
+-ac97@<addr> fsl,mpc5200-psc-ac97 PSC in ac97 mode
+-spi@<addr> fsl,mpc5200-psc-spi PSC in spi mode
+-irda@<addr> fsl,mpc5200-psc-irda PSC in IrDA mode
+-spi@<addr> fsl,mpc5200-spi MPC5200 spi device
+-ethernet@<addr> fsl,mpc5200-fec MPC5200 ethernet device
+-ata@<addr> fsl,mpc5200-ata IDE ATA interface
+-i2c@<addr> fsl,mpc5200-i2c I2C controller
+-usb@<addr> fsl,mpc5200-ohci,ohci-be USB controller
+-xlb@<addr> fsl,mpc5200-xlb XLB arbitrator
+-
+-fsl,mpc5200-gpt nodes
+----------------------
+-On the mpc5200 and 5200b, GPT0 has a watchdog timer function. If the board
+-design supports the internal wdt, then the device node for GPT0 should
+-include the empty property 'fsl,has-wdt'.
+-
+-An mpc5200-gpt can be used as a single line GPIO controller. To do so,
+-add the following properties to the gpt node:
+- gpio-controller;
+- #gpio-cells = <2>;
+-When referencing the GPIO line from another node, the first cell must always
+-be zero and the second cell represents the gpio flags and described in the
+-gpio device tree binding.
+-
+-An mpc5200-gpt can be used as a single line edge sensitive interrupt
+-controller. To do so, add the following properties to the gpt node:
+- interrupt-controller;
+- #interrupt-cells = <1>;
+-When referencing the IRQ line from another node, the cell represents the
+-sense mode; 1 for edge rising, 2 for edge falling.
+-
+-fsl,mpc5200-psc nodes
+----------------------
+-The PSCs should include a cell-index which is the index of the PSC in
+-hardware. cell-index is used to determine which shared SoC registers to
+-use when setting up PSC clocking. cell-index number starts at '0'. ie:
+- PSC1 has 'cell-index = <0>'
+- PSC4 has 'cell-index = <3>'
+-
+-PSC in i2s mode: The mpc5200 and mpc5200b PSCs are not compatible when in
+-i2s mode. An 'mpc5200b-psc-i2s' node cannot include 'mpc5200-psc-i2s' in the
+-compatible field.
+-
+-
+-fsl,mpc5200-gpio and fsl,mpc5200-gpio-wkup nodes
+-------------------------------------------------
+-Each GPIO controller node should have the empty property gpio-controller and
+-#gpio-cells set to 2. First cell is the GPIO number which is interpreted
+-according to the bit numbers in the GPIO control registers. The second cell
+-is for flags which is currently unused.
+-
+-fsl,mpc5200-fec nodes
+----------------------
+-The FEC node can specify one of the following properties to configure
+-the MII link:
+-- fsl,7-wire-mode - An empty property that specifies the link uses 7-wire
+- mode instead of MII
+-- current-speed - Specifies that the MII should be configured for a fixed
+- speed. This property should contain two cells. The
+- first cell specifies the speed in Mbps and the second
+- should be '0' for half duplex and '1' for full duplex
+-- phy-handle - Contains a phandle to an Ethernet PHY.
+-
+-Interrupt controller (fsl,mpc5200-pic) node
+--------------------------------------------
+-The mpc5200 pic binding splits hardware IRQ numbers into two levels. The
+-split reflects the layout of the PIC hardware itself, which groups
+-interrupts into one of three groups; CRIT, MAIN or PERP. Also, the
+-Bestcomm dma engine has it's own set of interrupt sources which are
+-cascaded off of peripheral interrupt 0, which the driver interprets as a
+-fourth group, SDMA.
+-
+-The interrupts property for device nodes using the mpc5200 pic consists
+-of three cells; <L1 L2 level>
+-
+- L1 := [CRIT=0, MAIN=1, PERP=2, SDMA=3]
+- L2 := interrupt number; directly mapped from the value in the
+- "ICTL PerStat, MainStat, CritStat Encoded Register"
+- level := [LEVEL_HIGH=0, EDGE_RISING=1, EDGE_FALLING=2, LEVEL_LOW=3]
+-
+-For external IRQs, use the following interrupt property values (how to
+-specify external interrupts is a frequently asked question):
+-External interrupts:
+- external irq0: interrupts = <0 0 n>;
+- external irq1: interrupts = <1 1 n>;
+- external irq2: interrupts = <1 2 n>;
+- external irq3: interrupts = <1 3 n>;
+-'n' is sense (0: level high, 1: edge rising, 2: edge falling 3: level low)
+-
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/powerpc/mpc52xx-device-tree-bindings.txt linux-2.6.29-rc3.owrt/Documentation/powerpc/mpc52xx-device-tree-bindings.txt
+--- linux-2.6.29.owrt/Documentation/powerpc/mpc52xx-device-tree-bindings.txt 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/Documentation/powerpc/mpc52xx-device-tree-bindings.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,277 @@
++MPC5200 Device Tree Bindings
++----------------------------
++
++(c) 2006-2007 Secret Lab Technologies Ltd
++Grant Likely <grant.likely at secretlab.ca>
++
++********** DRAFT ***********
++* WARNING: Do not depend on the stability of these bindings just yet.
++* The MPC5200 device tree conventions are still in flux
++* Keep an eye on the linuxppc-dev mailing list for more details
++********** DRAFT ***********
++
++I - Introduction
++================
++Boards supported by the arch/powerpc architecture require device tree be
++passed by the boot loader to the kernel at boot time. The device tree
++describes what devices are present on the board and how they are
++connected. The device tree can either be passed as a binary blob (as
++described in Documentation/powerpc/booting-without-of.txt), or passed
++by Open Firmware (IEEE 1275) compatible firmware using an OF compatible
++client interface API.
++
++This document specifies the requirements on the device-tree for mpc5200
++based boards. These requirements are above and beyond the details
++specified in either the Open Firmware spec or booting-without-of.txt
++
++All new mpc5200-based boards are expected to match this document. In
++cases where this document is not sufficient to support a new board port,
++this document should be updated as part of adding the new board support.
++
++II - Philosophy
++===============
++The core of this document is naming convention. The whole point of
++defining this convention is to reduce or eliminate the number of
++special cases required to support a 5200 board. If all 5200 boards
++follow the same convention, then generic 5200 support code will work
++rather than coding special cases for each new board.
++
++This section tries to capture the thought process behind why the naming
++convention is what it is.
++
++1. names
++---------
++There is strong convention/requirements already established for children
++of the root node. 'cpus' describes the processor cores, 'memory'
++describes memory, and 'chosen' provides boot configuration. Other nodes
++are added to describe devices attached to the processor local bus.
++
++Following convention already established with other system-on-chip
++processors, 5200 device trees should use the name 'soc5200' for the
++parent node of on chip devices, and the root node should be its parent.
++
++Child nodes are typically named after the configured function. ie.
++the FEC node is named 'ethernet', and a PSC in uart mode is named 'serial'.
++
++2. device_type property
++-----------------------
++similar to the node name convention above; the device_type reflects the
++configured function of a device. ie. 'serial' for a uart and 'spi' for
++an spi controller. However, while node names *should* reflect the
++configured function, device_type *must* match the configured function
++exactly.
++
++3. compatible property
++----------------------
++Since device_type isn't enough to match devices to drivers, there also
++needs to be a naming convention for the compatible property. Compatible
++is an list of device descriptions sorted from specific to generic. For
++the mpc5200, the required format for each compatible value is
++<chip>-<device>[-<mode>]. The OS should be able to match a device driver
++to the device based solely on the compatible value. If two drivers
++match on the compatible list; the 'most compatible' driver should be
++selected.
++
++The split between the MPC5200 and the MPC5200B leaves a bit of a
++conundrum. How should the compatible property be set up to provide
++maximum compatibility information; but still accurately describe the
++chip? For the MPC5200; the answer is easy. Most of the SoC devices
++originally appeared on the MPC5200. Since they didn't exist anywhere
++else; the 5200 compatible properties will contain only one item;
++"mpc5200-<device>".
++
++The 5200B is almost the same as the 5200, but not quite. It fixes
++silicon bugs and it adds a small number of enhancements. Most of the
++devices either provide exactly the same interface as on the 5200. A few
++devices have extra functions but still have a backwards compatible mode.
++To express this information as completely as possible, 5200B device trees
++should have two items in the compatible list;
++"mpc5200b-<device>\0mpc5200-<device>". It is *strongly* recommended
++that 5200B device trees follow this convention (instead of only listing
++the base mpc5200 item).
++
++If another chip appear on the market with one of the mpc5200 SoC
++devices, then the compatible list should include mpc5200-<device>.
++
++ie. ethernet on mpc5200: compatible = "mpc5200-ethernet"
++ ethernet on mpc5200b: compatible = "mpc5200b-ethernet\0mpc5200-ethernet"
++
++Modal devices, like PSCs, also append the configured function to the
++end of the compatible field. ie. A PSC in i2s mode would specify
++"mpc5200-psc-i2s", not "mpc5200-i2s". This convention is chosen to
++avoid naming conflicts with non-psc devices providing the same
++function. For example, "mpc5200-spi" and "mpc5200-psc-spi" describe
++the mpc5200 simple spi device and a PSC spi mode respectively.
++
++If the soc device is more generic and present on other SOCs, the
++compatible property can specify the more generic device type also.
++
++ie. mscan: compatible = "mpc5200-mscan\0fsl,mscan";
++
++At the time of writing, exact chip may be either 'mpc5200' or
++'mpc5200b'.
++
++Device drivers should always try to match as generically as possible.
++
++III - Structure
++===============
++The device tree for an mpc5200 board follows the structure defined in
++booting-without-of.txt with the following additional notes:
++
++0) the root node
++----------------
++Typical root description node; see booting-without-of
++
++1) The cpus node
++----------------
++The cpus node follows the basic layout described in booting-without-of.
++The bus-frequency property holds the XLB bus frequency
++The clock-frequency property holds the core frequency
++
++2) The memory node
++------------------
++Typical memory description node; see booting-without-of.
++
++3) The soc5200 node
++-------------------
++This node describes the on chip SOC peripherals. Every mpc5200 based
++board will have this node, and as such there is a common naming
++convention for SOC devices.
++
++Required properties:
++name type description
++---- ---- -----------
++device_type string must be "soc"
++ranges int should be <0 baseaddr baseaddr+10000>
++reg int must be <baseaddr 10000>
++compatible string mpc5200: "mpc5200-soc"
++ mpc5200b: "mpc5200b-soc\0mpc5200-soc"
++system-frequency int Fsystem frequency; source of all
++ other clocks.
++bus-frequency int IPB bus frequency in HZ. Clock rate
++ used by most of the soc devices.
++#interrupt-cells int must be <3>.
++
++Recommended properties:
++name type description
++---- ---- -----------
++model string Exact model of the chip;
++ ie: model="fsl,mpc5200"
++revision string Silicon revision of chip
++ ie: revision="M08A"
++
++The 'model' and 'revision' properties are *strongly* recommended. Having
++them presence acts as a bit of a safety net for working around as yet
++undiscovered bugs on one version of silicon. For example, device drivers
++can use the model and revision properties to decide if a bug fix should
++be turned on.
++
++4) soc5200 child nodes
++----------------------
++Any on chip SOC devices available to Linux must appear as soc5200 child nodes.
++
++Note: The tables below show the value for the mpc5200. A mpc5200b device
++tree should use the "mpc5200b-<device>\0mpc5200-<device> form.
++
++Required soc5200 child nodes:
++name device_type compatible Description
++---- ----------- ---------- -----------
++cdm@<addr> cdm mpc5200-cmd Clock Distribution
++pic@<addr> interrupt-controller mpc5200-pic need an interrupt
++ controller to boot
++bestcomm@<addr> dma-controller mpc5200-bestcomm 5200 pic also requires
++ the bestcomm device
++
++Recommended soc5200 child nodes; populate as needed for your board
++name device_type compatible Description
++---- ----------- ---------- -----------
++gpt@<addr> gpt fsl,mpc5200-gpt General purpose timers
++gpt@<addr> gpt fsl,mpc5200-gpt-gpio General purpose
++ timers in GPIO mode
++gpio@<addr> fsl,mpc5200-gpio MPC5200 simple gpio
++ controller
++gpio@<addr> fsl,mpc5200-gpio-wkup MPC5200 wakeup gpio
++ controller
++rtc@<addr> rtc mpc5200-rtc Real time clock
++mscan@<addr> mscan mpc5200-mscan CAN bus controller
++pci@<addr> pci mpc5200-pci PCI bridge
++serial@<addr> serial mpc5200-psc-uart PSC in serial mode
++i2s@<addr> sound mpc5200-psc-i2s PSC in i2s mode
++ac97@<addr> sound mpc5200-psc-ac97 PSC in ac97 mode
++spi@<addr> spi mpc5200-psc-spi PSC in spi mode
++irda@<addr> irda mpc5200-psc-irda PSC in IrDA mode
++spi@<addr> spi mpc5200-spi MPC5200 spi device
++ethernet@<addr> network mpc5200-fec MPC5200 ethernet device
++ata@<addr> ata mpc5200-ata IDE ATA interface
++i2c@<addr> i2c mpc5200-i2c I2C controller
++usb@<addr> usb-ohci-be mpc5200-ohci,ohci-be USB controller
++xlb@<addr> xlb mpc5200-xlb XLB arbitrator
++
++Important child node properties
++name type description
++---- ---- -----------
++cell-index int When multiple devices are present, is the
++ index of the device in the hardware (ie. There
++ are 6 PSC on the 5200 numbered PSC1 to PSC6)
++ PSC1 has 'cell-index = <0>'
++ PSC4 has 'cell-index = <3>'
++
++5) General Purpose Timer nodes (child of soc5200 node)
++On the mpc5200 and 5200b, GPT0 has a watchdog timer function. If the board
++design supports the internal wdt, then the device node for GPT0 should
++include the empty property 'fsl,has-wdt'.
++
++6) PSC nodes (child of soc5200 node)
++PSC nodes can define the optional 'port-number' property to force assignment
++order of serial ports. For example, PSC5 might be physically connected to
++the port labeled 'COM1' and PSC1 wired to 'COM1'. In this case, PSC5 would
++have a "port-number = <0>" property, and PSC1 would have "port-number = <1>".
++
++PSC in i2s mode: The mpc5200 and mpc5200b PSCs are not compatible when in
++i2s mode. An 'mpc5200b-psc-i2s' node cannot include 'mpc5200-psc-i2s' in the
++compatible field.
++
++7) GPIO controller nodes
++Each GPIO controller node should have the empty property gpio-controller and
++#gpio-cells set to 2. First cell is the GPIO number which is interpreted
++according to the bit numbers in the GPIO control registers. The second cell
++is for flags which is currently unsused.
++
++8) FEC nodes
++The FEC node can specify one of the following properties to configure
++the MII link:
++"fsl,7-wire-mode" - An empty property that specifies the link uses 7-wire
++ mode instead of MII
++"current-speed" - Specifies that the MII should be configured for a fixed
++ speed. This property should contain two cells. The
++ first cell specifies the speed in Mbps and the second
++ should be '0' for half duplex and '1' for full duplex
++"phy-handle" - Contains a phandle to an Ethernet PHY.
++
++IV - Extra Notes
++================
++
++1. Interrupt mapping
++--------------------
++The mpc5200 pic driver splits hardware IRQ numbers into two levels. The
++split reflects the layout of the PIC hardware itself, which groups
++interrupts into one of three groups; CRIT, MAIN or PERP. Also, the
++Bestcomm dma engine has it's own set of interrupt sources which are
++cascaded off of peripheral interrupt 0, which the driver interprets as a
++fourth group, SDMA.
++
++The interrupts property for device nodes using the mpc5200 pic consists
++of three cells; <L1 L2 level>
++
++ L1 := [CRIT=0, MAIN=1, PERP=2, SDMA=3]
++ L2 := interrupt number; directly mapped from the value in the
++ "ICTL PerStat, MainStat, CritStat Encoded Register"
++ level := [LEVEL_HIGH=0, EDGE_RISING=1, EDGE_FALLING=2, LEVEL_LOW=3]
++
++2. Shared registers
++-------------------
++Some SoC devices share registers between them. ie. the i2c devices use
++a single clock control register, and almost all device are affected by
++the port_config register. Devices which need to manipulate shared regs
++should look to the parent SoC node. The soc node is responsible
++for arbitrating all shared register access.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/RCU/checklist.txt linux-2.6.29-rc3.owrt/Documentation/RCU/checklist.txt
+--- linux-2.6.29.owrt/Documentation/RCU/checklist.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/RCU/checklist.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -298,15 +298,3 @@
+
+ Note that, rcu_assign_pointer() and rcu_dereference() relate to
+ SRCU just as they do to other forms of RCU.
+-
+-15. The whole point of call_rcu(), synchronize_rcu(), and friends
+- is to wait until all pre-existing readers have finished before
+- carrying out some otherwise-destructive operation. It is
+- therefore critically important to -first- remove any path
+- that readers can follow that could be affected by the
+- destructive operation, and -only- -then- invoke call_rcu(),
+- synchronize_rcu(), or friends.
+-
+- Because these primitives only wait for pre-existing readers,
+- it is the caller's responsibility to guarantee safety to
+- any subsequent readers.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/scsi/cxgb3i.txt linux-2.6.29-rc3.owrt/Documentation/scsi/cxgb3i.txt
+--- linux-2.6.29.owrt/Documentation/scsi/cxgb3i.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/scsi/cxgb3i.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -4,7 +4,7 @@
+ ============
+
+ The Chelsio T3 ASIC based Adapters (S310, S320, S302, S304, Mezz cards, etc.
+-series of products) support iSCSI acceleration and iSCSI Direct Data Placement
++series of products) supports iSCSI acceleration and iSCSI Direct Data Placement
+ (DDP) where the hardware handles the expensive byte touching operations, such
+ as CRC computation and verification, and direct DMA to the final host memory
+ destination:
+@@ -31,9 +31,9 @@
+ the TCP segments onto the wire. It handles TCP retransmission if
+ needed.
+
+- On receiving, S3 h/w recovers the iSCSI PDU by reassembling TCP
++ On receving, S3 h/w recovers the iSCSI PDU by reassembling TCP
+ segments, separating the header and data, calculating and verifying
+- the digests, then forwarding the header to the host. The payload data,
++ the digests, then forwards the header to the host. The payload data,
+ if possible, will be directly placed into the pre-posted host DDP
+ buffer. Otherwise, the payload data will be sent to the host too.
+
+@@ -68,8 +68,9 @@
+ sure the ip address is unique in the network.
+
+ 3. edit /etc/iscsi/iscsid.conf
+- The default setting for MaxRecvDataSegmentLength (131072) is too big;
+- replace with a value no bigger than 15360 (for example 8192):
++ The default setting for MaxRecvDataSegmentLength (131072) is too big,
++ replace "node.conn[0].iscsi.MaxRecvDataSegmentLength" to be a value no
++ bigger than 15360 (for example 8192):
+
+ node.conn[0].iscsi.MaxRecvDataSegmentLength = 8192
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/tracers/mmiotrace.txt linux-2.6.29-rc3.owrt/Documentation/tracers/mmiotrace.txt
+--- linux-2.6.29.owrt/Documentation/tracers/mmiotrace.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/tracers/mmiotrace.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -78,10 +78,12 @@
+ events were lost, the trace is incomplete. You should enlarge the buffers and
+ try again. Buffers are enlarged by first seeing how large the current buffers
+ are:
+-$ cat /debug/tracing/buffer_size_kb
++$ cat /debug/tracing/trace_entries
+ gives you a number. Approximately double this number and write it back, for
+ instance:
+-$ echo 128000 > /debug/tracing/buffer_size_kb
++$ echo 0 > /debug/tracing/tracing_enabled
++$ echo 128000 > /debug/tracing/trace_entries
++$ echo 1 > /debug/tracing/tracing_enabled
+ Then start again from the top.
+
+ If you are doing a trace for a driver project, e.g. Nouveau, you should also
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/usb/dma.txt linux-2.6.29-rc3.owrt/Documentation/usb/dma.txt
+--- linux-2.6.29.owrt/Documentation/usb/dma.txt 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/usb/dma.txt 2009-05-10 23:48:28.000000000 +0200
+@@ -6,9 +6,8 @@
+ API OVERVIEW
+
+ The big picture is that USB drivers can continue to ignore most DMA issues,
+-though they still must provide DMA-ready buffers (see
+-Documentation/PCI/PCI-DMA-mapping.txt). That's how they've worked through
+-the 2.4 (and earlier) kernels.
++though they still must provide DMA-ready buffers (see DMA-mapping.txt).
++That's how they've worked through the 2.4 (and earlier) kernels.
+
+ OR: they can now be DMA-aware.
+
+@@ -63,8 +62,8 @@
+ force a consistent memory access ordering by using memory barriers. It's
+ not using a streaming DMA mapping, so it's good for small transfers on
+ systems where the I/O would otherwise thrash an IOMMU mapping. (See
+- Documentation/PCI/PCI-DMA-mapping.txt for definitions of "coherent" and
+- "streaming" DMA mappings.)
++ Documentation/DMA-mapping.txt for definitions of "coherent" and "streaming"
++ DMA mappings.)
+
+ Asking for 1/Nth of a page (as well as asking for N pages) is reasonably
+ space-efficient.
+@@ -94,7 +93,7 @@
+ Existing buffers aren't usable for DMA without first being mapped into the
+ DMA address space of the device. However, most buffers passed to your
+ driver can safely be used with such DMA mapping. (See the first section
+-of Documentation/PCI/PCI-DMA-mapping.txt, titled "What memory is DMA-able?")
++of DMA-mapping.txt, titled "What memory is DMA-able?")
+
+ - When you're using scatterlists, you can map everything at once. On some
+ systems, this kicks in an IOMMU and turns the scatterlists into single
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Documentation/video4linux/v4lgrab.c linux-2.6.29-rc3.owrt/Documentation/video4linux/v4lgrab.c
+--- linux-2.6.29.owrt/Documentation/video4linux/v4lgrab.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Documentation/video4linux/v4lgrab.c 2009-05-10 23:48:28.000000000 +0200
+@@ -4,21 +4,12 @@
+ *
+ * Compile with:
+ * gcc -s -Wall -Wstrict-prototypes v4lgrab.c -o v4lgrab
+- * Use as:
+- * v4lgrab >image.ppm
++ * Use as:
++ * v4lgrab >image.ppm
+ *
+ * Copyright (C) 1998-05-03, Phil Blundell <philb@gnu.org>
+- * Copied from http://www.tazenda.demon.co.uk/phil/vgrabber.c
+- * with minor modifications (Dave Forrest, drf5n@virginia.edu).
+- *
+- *
+- * For some cameras you may need to pre-load libv4l to perform
+- * the necessary decompression, e.g.:
+- *
+- * export LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so
+- * ./v4lgrab >image.ppm
+- *
+- * see http://hansdegoede.livejournal.com/3636.html for details.
++ * Copied from http://www.tazenda.demon.co.uk/phil/vgrabber.c
++ * with minor modifications (Dave Forrest, drf5n@virginia.edu).
+ *
+ */
+
+@@ -33,7 +24,7 @@
+ #include <linux/types.h>
+ #include <linux/videodev.h>
+
+-#define VIDEO_DEV "/dev/video0"
++#define FILE "/dev/video0"
+
+ /* Stole this from tvset.c */
+
+@@ -99,7 +90,7 @@
+
+ int main(int argc, char ** argv)
+ {
+- int fd = open(VIDEO_DEV, O_RDONLY), f;
++ int fd = open(FILE, O_RDONLY), f;
+ struct video_capability cap;
+ struct video_window win;
+ struct video_picture vpic;
+@@ -109,13 +100,13 @@
+ unsigned int i, src_depth;
+
+ if (fd < 0) {
+- perror(VIDEO_DEV);
++ perror(FILE);
+ exit(1);
+ }
+
+ if (ioctl(fd, VIDIOCGCAP, &cap) < 0) {
+ perror("VIDIOGCAP");
+- fprintf(stderr, "(" VIDEO_DEV " not a video4linux device?)\n");
++ fprintf(stderr, "(" FILE " not a video4linux device?)\n");
+ close(fd);
+ exit(1);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/acpi/acpica/tbutils.c linux-2.6.29-rc3.owrt/drivers/acpi/acpica/tbutils.c
+--- linux-2.6.29.owrt/drivers/acpi/acpica/tbutils.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/acpi/acpica/tbutils.c 2009-05-10 23:48:28.000000000 +0200
+@@ -538,9 +538,10 @@
+ if (ACPI_FAILURE(status)) {
+ ACPI_WARNING((AE_INFO,
+ "Truncating %u table entries!",
+- (unsigned) (table_count -
+- (acpi_gbl_root_table_list.
+- count - 2))));
++ (unsigned)
++ (acpi_gbl_root_table_list.size -
++ acpi_gbl_root_table_list.
++ count)));
+ break;
+ }
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/acpi/acpica/uteval.c linux-2.6.29-rc3.owrt/drivers/acpi/acpica/uteval.c
+--- linux-2.6.29.owrt/drivers/acpi/acpica/uteval.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/acpi/acpica/uteval.c 2009-05-10 23:48:28.000000000 +0200
+@@ -116,9 +116,9 @@
+ return_ACPI_STATUS(AE_NO_MEMORY);
+ }
+
+- /* Default return value is 0, NOT-SUPPORTED */
++ /* Default return value is SUPPORTED */
+
+- return_desc->integer.value = 0;
++ return_desc->integer.value = ACPI_UINT32_MAX;
+ walk_state->return_desc = return_desc;
+
+ /* Compare input string to static table of supported interfaces */
+@@ -127,8 +127,10 @@
+ if (!ACPI_STRCMP
+ (string_desc->string.pointer,
+ acpi_interfaces_supported[i])) {
+- return_desc->integer.value = ACPI_UINT32_MAX;
+- goto done;
++
++ /* The interface is supported */
++
++ return_ACPI_STATUS(AE_OK);
+ }
+ }
+
+@@ -139,14 +141,15 @@
+ */
+ status = acpi_os_validate_interface(string_desc->string.pointer);
+ if (ACPI_SUCCESS(status)) {
+- return_desc->integer.value = ACPI_UINT32_MAX;
++
++ /* The interface is supported */
++
++ return_ACPI_STATUS(AE_OK);
+ }
+
+-done:
+- ACPI_DEBUG_PRINT_RAW((ACPI_DB_INFO, "ACPI: BIOS _OSI(%s) %ssupported\n",
+- string_desc->string.pointer,
+- return_desc->integer.value == 0 ? "not-" : ""));
++ /* The interface is not supported */
+
++ return_desc->integer.value = 0;
+ return_ACPI_STATUS(AE_OK);
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/acpi/battery.c linux-2.6.29-rc3.owrt/drivers/acpi/battery.c
+--- linux-2.6.29.owrt/drivers/acpi/battery.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/acpi/battery.c 2009-05-10 23:48:28.000000000 +0200
+@@ -138,29 +138,6 @@
+
+ static int acpi_battery_get_state(struct acpi_battery *battery);
+
+-static int acpi_battery_is_charged(struct acpi_battery *battery)
+-{
+- /* either charging or discharging */
+- if (battery->state != 0)
+- return 0;
+-
+- /* battery not reporting charge */
+- if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN ||
+- battery->capacity_now == 0)
+- return 0;
+-
+- /* good batteries update full_charge as the batteries degrade */
+- if (battery->full_charge_capacity == battery->capacity_now)
+- return 1;
+-
+- /* fallback to using design values for broken batteries */
+- if (battery->design_capacity == battery->capacity_now)
+- return 1;
+-
+- /* we don't do any sort of metric based on percentages */
+- return 0;
+-}
+-
+ static int acpi_battery_get_property(struct power_supply *psy,
+ enum power_supply_property psp,
+ union power_supply_propval *val)
+@@ -178,7 +155,7 @@
+ val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
+ else if (battery->state & 0x02)
+ val->intval = POWER_SUPPLY_STATUS_CHARGING;
+- else if (acpi_battery_is_charged(battery))
++ else if (battery->state == 0)
+ val->intval = POWER_SUPPLY_STATUS_FULL;
+ else
+ val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/acpi/bus.c linux-2.6.29-rc3.owrt/drivers/acpi/bus.c
+--- linux-2.6.29.owrt/drivers/acpi/bus.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/acpi/bus.c 2009-05-10 23:48:28.000000000 +0200
+@@ -758,7 +758,8 @@
+ acpi_status status = AE_OK;
+ extern acpi_status acpi_os_initialize1(void);
+
+- acpi_os_initialize1();
++
++ status = acpi_os_initialize1();
+
+ status =
+ acpi_enable_subsystem(ACPI_NO_HARDWARE_INIT | ACPI_NO_ACPI_ENABLE);
+@@ -768,6 +769,12 @@
+ goto error1;
+ }
+
++ if (ACPI_FAILURE(status)) {
++ printk(KERN_ERR PREFIX
++ "Unable to initialize ACPI OS objects\n");
++ goto error1;
++ }
++
+ /*
+ * ACPI 2.0 requires the EC driver to be loaded and work before
+ * the EC device is found in the namespace (i.e. before acpi_initialize_objects()
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/acpi/container.c linux-2.6.29-rc3.owrt/drivers/acpi/container.c
+--- linux-2.6.29.owrt/drivers/acpi/container.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/acpi/container.c 2009-05-10 23:48:28.000000000 +0200
+@@ -163,7 +163,7 @@
+ case ACPI_NOTIFY_BUS_CHECK:
+ /* Fall through */
+ case ACPI_NOTIFY_DEVICE_CHECK:
+- printk(KERN_WARNING "Container driver received %s event\n",
++ printk("Container driver received %s event\n",
+ (type == ACPI_NOTIFY_BUS_CHECK) ?
+ "ACPI_NOTIFY_BUS_CHECK" : "ACPI_NOTIFY_DEVICE_CHECK");
+ status = acpi_bus_get_device(handle, &device);
+@@ -174,8 +174,7 @@
+ kobject_uevent(&device->dev.kobj,
+ KOBJ_ONLINE);
+ else
+- printk(KERN_WARNING
+- "Failed to add container\n");
++ printk("Failed to add container\n");
+ }
+ } else {
+ if (ACPI_SUCCESS(status)) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/acpi/dock.c linux-2.6.29-rc3.owrt/drivers/acpi/dock.c
+--- linux-2.6.29.owrt/drivers/acpi/dock.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/acpi/dock.c 2009-05-10 23:48:28.000000000 +0200
+@@ -855,14 +855,10 @@
+ static ssize_t show_docked(struct device *dev,
+ struct device_attribute *attr, char *buf)
+ {
+- struct acpi_device *tmp;
+-
+ struct dock_station *dock_station = *((struct dock_station **)
+ dev->platform_data);
++ return snprintf(buf, PAGE_SIZE, "%d\n", dock_present(dock_station));
+
+- if (ACPI_SUCCESS(acpi_bus_get_device(dock_station->handle, &tmp)))
+- return snprintf(buf, PAGE_SIZE, "1\n");
+- return snprintf(buf, PAGE_SIZE, "0\n");
+ }
+ static DEVICE_ATTR(docked, S_IRUGO, show_docked, NULL);
+
+@@ -988,7 +984,7 @@
+
+ ret = device_create_file(&dock_device->dev, &dev_attr_docked);
+ if (ret) {
+- printk(KERN_ERR "Error %d adding sysfs file\n", ret);
++ printk("Error %d adding sysfs file\n", ret);
+ platform_device_unregister(dock_device);
+ kfree(dock_station);
+ dock_station = NULL;
+@@ -996,7 +992,7 @@
+ }
+ ret = device_create_file(&dock_device->dev, &dev_attr_undock);
+ if (ret) {
+- printk(KERN_ERR "Error %d adding sysfs file\n", ret);
++ printk("Error %d adding sysfs file\n", ret);
+ device_remove_file(&dock_device->dev, &dev_attr_docked);
+ platform_device_unregister(dock_device);
+ kfree(dock_station);
+@@ -1005,7 +1001,7 @@
+ }
+ ret = device_create_file(&dock_device->dev, &dev_attr_uid);
+ if (ret) {
+- printk(KERN_ERR "Error %d adding sysfs file\n", ret);
++ printk("Error %d adding sysfs file\n", ret);
+ device_remove_file(&dock_device->dev, &dev_attr_docked);
+ device_remove_file(&dock_device->dev, &dev_attr_undock);
+ platform_device_unregister(dock_device);
+@@ -1015,7 +1011,7 @@
+ }
+ ret = device_create_file(&dock_device->dev, &dev_attr_flags);
+ if (ret) {
+- printk(KERN_ERR "Error %d adding sysfs file\n", ret);
++ printk("Error %d adding sysfs file\n", ret);
+ device_remove_file(&dock_device->dev, &dev_attr_docked);
+ device_remove_file(&dock_device->dev, &dev_attr_undock);
+ device_remove_file(&dock_device->dev, &dev_attr_uid);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/acpi/ec.c linux-2.6.29-rc3.owrt/drivers/acpi/ec.c
+--- linux-2.6.29.owrt/drivers/acpi/ec.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/acpi/ec.c 2009-05-10 23:48:28.000000000 +0200
+@@ -120,8 +120,6 @@
+ spinlock_t curr_lock;
+ } *boot_ec, *first_ec;
+
+-static int EC_FLAGS_MSI; /* Out-of-spec MSI controller */
+-
+ /* --------------------------------------------------------------------------
+ Transaction Management
+ -------------------------------------------------------------------------- */
+@@ -261,8 +259,6 @@
+ clear_bit(EC_FLAGS_GPE_MODE, &ec->flags);
+ acpi_disable_gpe(NULL, ec->gpe);
+ }
+- if (EC_FLAGS_MSI)
+- udelay(ACPI_EC_DELAY);
+ /* start transaction */
+ spin_lock_irqsave(&ec->curr_lock, tmp);
+ /* following two actions should be kept atomic */
+@@ -971,11 +967,6 @@
+ /*
+ * Generate a boot ec context
+ */
+- if (dmi_name_in_vendors("Micro-Star") ||
+- dmi_name_in_vendors("Notebook")) {
+- pr_info(PREFIX "Enabling special treatment for EC from MSI.\n");
+- EC_FLAGS_MSI = 1;
+- }
+ status = acpi_get_table(ACPI_SIG_ECDT, 1,
+ (struct acpi_table_header **)&ecdt_ptr);
+ if (ACPI_SUCCESS(status)) {
+@@ -991,7 +982,7 @@
+ saved_ec = kmalloc(sizeof(struct acpi_ec), GFP_KERNEL);
+ if (!saved_ec)
+ return -ENOMEM;
+- memcpy(saved_ec, boot_ec, sizeof(*saved_ec));
++ memcpy(&saved_ec, boot_ec, sizeof(saved_ec));
+ /* fall through */
+ }
+ /* This workaround is needed only on some broken machines,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/acpi/glue.c linux-2.6.29-rc3.owrt/drivers/acpi/glue.c
+--- linux-2.6.29.owrt/drivers/acpi/glue.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/acpi/glue.c 2009-05-10 23:48:28.000000000 +0200
+@@ -255,12 +255,12 @@
+ }
+ type = acpi_get_bus_type(dev->bus);
+ if (!type) {
+- DBG("No ACPI bus support for %s\n", dev_name(dev));
++ DBG("No ACPI bus support for %s\n", dev->bus_id);
+ ret = -EINVAL;
+ goto end;
+ }
+ if ((ret = type->find_device(dev, &handle)) != 0)
+- DBG("Can't get handler for %s\n", dev_name(dev));
++ DBG("Can't get handler for %s\n", dev->bus_id);
+ end:
+ if (!ret)
+ acpi_bind_one(dev, handle);
+@@ -271,10 +271,10 @@
+
+ acpi_get_name(dev->archdata.acpi_handle,
+ ACPI_FULL_PATHNAME, &buffer);
+- DBG("Device %s -> %s\n", dev_name(dev), (char *)buffer.pointer);
++ DBG("Device %s -> %s\n", dev->bus_id, (char *)buffer.pointer);
+ kfree(buffer.pointer);
+ } else
+- DBG("Device %s -> No ACPI support\n", dev_name(dev));
++ DBG("Device %s -> No ACPI support\n", dev->bus_id);
+ #endif
+
+ return ret;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/acpi/Kconfig linux-2.6.29-rc3.owrt/drivers/acpi/Kconfig
+--- linux-2.6.29.owrt/drivers/acpi/Kconfig 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/acpi/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -9,7 +9,6 @@
+ depends on PCI
+ depends on PM
+ select PNP
+- select CPU_IDLE
+ default y
+ ---help---
+ Advanced Configuration and Power Interface (ACPI) support for
+@@ -254,6 +253,13 @@
+ help you correlate PCI bus addresses with the physical geography
+ of your slots. If you are unsure, say N.
+
++config ACPI_SYSTEM
++ bool
++ default y
++ help
++ This driver will enable your system to shut down using ACPI, and
++ dump your ACPI DSDT table using /proc/acpi/dsdt.
++
+ config X86_PM_TIMER
+ bool "Power Management Timer Support" if EMBEDDED
+ depends on X86
+@@ -281,7 +287,7 @@
+ support physical cpu/memory hot-plug.
+
+ If one selects "m", this driver can be loaded with
+- "modprobe container".
++ "modprobe acpi_container".
+
+ config ACPI_HOTPLUG_MEMORY
+ tristate "Memory Hotplug"
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/acpi/Makefile linux-2.6.29-rc3.owrt/drivers/acpi/Makefile
+--- linux-2.6.29.owrt/drivers/acpi/Makefile 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/acpi/Makefile 2009-05-10 23:48:28.000000000 +0200
+@@ -52,7 +52,7 @@
+ obj-$(CONFIG_ACPI_CONTAINER) += container.o
+ obj-$(CONFIG_ACPI_THERMAL) += thermal.o
+ obj-y += power.o
+-obj-y += system.o event.o
++obj-$(CONFIG_ACPI_SYSTEM) += system.o event.o
+ obj-$(CONFIG_ACPI_DEBUG) += debug.o
+ obj-$(CONFIG_ACPI_NUMA) += numa.o
+ obj-$(CONFIG_ACPI_HOTPLUG_MEMORY) += acpi_memhotplug.o
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/acpi/numa.c linux-2.6.29-rc3.owrt/drivers/acpi/numa.c
+--- linux-2.6.29.owrt/drivers/acpi/numa.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/acpi/numa.c 2009-05-10 23:48:28.000000000 +0200
+@@ -277,7 +277,7 @@
+ int pxm, node = -1;
+
+ pxm = acpi_get_pxm(handle);
+- if (pxm >= 0 && pxm < MAX_PXM_DOMAINS)
++ if (pxm >= 0)
+ node = acpi_map_pxm_to_node(pxm);
+
+ return node;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/acpi/osl.c linux-2.6.29-rc3.owrt/drivers/acpi/osl.c
+--- linux-2.6.29.owrt/drivers/acpi/osl.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/acpi/osl.c 2009-05-10 23:48:28.000000000 +0200
+@@ -228,10 +228,10 @@
+ if (acpi_in_debugger) {
+ kdb_printf("%s", buffer);
+ } else {
+- printk(KERN_CONT "%s", buffer);
++ printk("%s", buffer);
+ }
+ #else
+- printk(KERN_CONT "%s", buffer);
++ printk("%s", buffer);
+ #endif
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/acpi/pci_link.c linux-2.6.29-rc3.owrt/drivers/acpi/pci_link.c
+--- linux-2.6.29.owrt/drivers/acpi/pci_link.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/acpi/pci_link.c 2009-05-10 23:48:28.000000000 +0200
+@@ -593,7 +593,7 @@
+ return -ENODEV;
+ } else {
+ acpi_irq_penalty[link->irq.active] += PIRQ_PENALTY_PCI_USING;
+- printk(KERN_WARNING PREFIX "%s [%s] enabled at IRQ %d\n",
++ printk(PREFIX "%s [%s] enabled at IRQ %d\n",
+ acpi_device_name(link->device),
+ acpi_device_bid(link->device), link->irq.active);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/acpi/processor_idle.c linux-2.6.29-rc3.owrt/drivers/acpi/processor_idle.c
+--- linux-2.6.29.owrt/drivers/acpi/processor_idle.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/acpi/processor_idle.c 2009-05-10 23:48:28.000000000 +0200
+@@ -66,17 +66,43 @@
+ #define ACPI_PROCESSOR_FILE_POWER "power"
+ #define US_TO_PM_TIMER_TICKS(t) ((t * (PM_TIMER_FREQUENCY/1000)) / 1000)
+ #define PM_TIMER_TICK_NS (1000000000ULL/PM_TIMER_FREQUENCY)
++#ifndef CONFIG_CPU_IDLE
++#define C2_OVERHEAD 4 /* 1us (3.579 ticks per us) */
++#define C3_OVERHEAD 4 /* 1us (3.579 ticks per us) */
++static void (*pm_idle_save) (void) __read_mostly;
++#else
+ #define C2_OVERHEAD 1 /* 1us */
+ #define C3_OVERHEAD 1 /* 1us */
++#endif
+ #define PM_TIMER_TICKS_TO_US(p) (((p) * 1000)/(PM_TIMER_FREQUENCY/1000))
+
+ static unsigned int max_cstate __read_mostly = ACPI_PROCESSOR_MAX_POWER;
++#ifdef CONFIG_CPU_IDLE
+ module_param(max_cstate, uint, 0000);
++#else
++module_param(max_cstate, uint, 0644);
++#endif
+ static unsigned int nocst __read_mostly;
+ module_param(nocst, uint, 0000);
+
++#ifndef CONFIG_CPU_IDLE
++/*
++ * bm_history -- bit-mask with a bit per jiffy of bus-master activity
++ * 1000 HZ: 0xFFFFFFFF: 32 jiffies = 32ms
++ * 800 HZ: 0xFFFFFFFF: 32 jiffies = 40ms
++ * 100 HZ: 0x0000000F: 4 jiffies = 40ms
++ * reduce history for more aggressive entry into C3
++ */
++static unsigned int bm_history __read_mostly =
++ (HZ >= 800 ? 0xFFFFFFFF : ((1U << (HZ / 25)) - 1));
++module_param(bm_history, uint, 0644);
++
++static int acpi_processor_set_power_policy(struct acpi_processor *pr);
++
++#else /* CONFIG_CPU_IDLE */
+ static unsigned int latency_factor __read_mostly = 2;
+ module_param(latency_factor, uint, 0644);
++#endif
+
+ /*
+ * IBM ThinkPad R40e crashes mysteriously when going into C2 or C3.
+@@ -198,6 +224,71 @@
+ current_thread_info()->status |= TS_POLLING;
+ }
+
++#ifndef CONFIG_CPU_IDLE
++
++static void
++acpi_processor_power_activate(struct acpi_processor *pr,
++ struct acpi_processor_cx *new)
++{
++ struct acpi_processor_cx *old;
++
++ if (!pr || !new)
++ return;
++
++ old = pr->power.state;
++
++ if (old)
++ old->promotion.count = 0;
++ new->demotion.count = 0;
++
++ /* Cleanup from old state. */
++ if (old) {
++ switch (old->type) {
++ case ACPI_STATE_C3:
++ /* Disable bus master reload */
++ if (new->type != ACPI_STATE_C3 && pr->flags.bm_check)
++ acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0);
++ break;
++ }
++ }
++
++ /* Prepare to use new state. */
++ switch (new->type) {
++ case ACPI_STATE_C3:
++ /* Enable bus master reload */
++ if (old->type != ACPI_STATE_C3 && pr->flags.bm_check)
++ acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 1);
++ break;
++ }
++
++ pr->power.state = new;
++
++ return;
++}
++
++static atomic_t c3_cpu_count;
++
++/* Common C-state entry for C2, C3, .. */
++static void acpi_cstate_enter(struct acpi_processor_cx *cstate)
++{
++ /* Don't trace irqs off for idle */
++ stop_critical_timings();
++ if (cstate->entry_method == ACPI_CSTATE_FFH) {
++ /* Call into architectural FFH based C-state */
++ acpi_processor_ffh_cstate_enter(cstate);
++ } else {
++ int unused;
++ /* IO port based C-state */
++ inb(cstate->address);
++ /* Dummy wait op - must do something useless after P_LVL2 read
++ because chipsets cannot guarantee that STPCLK# signal
++ gets asserted in time to freeze execution properly. */
++ unused = inl(acpi_gbl_FADT.xpm_timer_block.address);
++ }
++ start_critical_timings();
++}
++#endif /* !CONFIG_CPU_IDLE */
++
+ #ifdef ARCH_APICTIMER_STOPS_ON_C3
+
+ /*
+@@ -299,6 +390,421 @@
+ }
+ #endif
+
++#ifndef CONFIG_CPU_IDLE
++static void acpi_processor_idle(void)
++{
++ struct acpi_processor *pr = NULL;
++ struct acpi_processor_cx *cx = NULL;
++ struct acpi_processor_cx *next_state = NULL;
++ int sleep_ticks = 0;
++ u32 t1, t2 = 0;
++
++ /*
++ * Interrupts must be disabled during bus mastering calculations and
++ * for C2/C3 transitions.
++ */
++ local_irq_disable();
++
++ pr = __get_cpu_var(processors);
++ if (!pr) {
++ local_irq_enable();
++ return;
++ }
++
++ /*
++ * Check whether we truly need to go idle, or should
++ * reschedule:
++ */
++ if (unlikely(need_resched())) {
++ local_irq_enable();
++ return;
++ }
++
++ cx = pr->power.state;
++ if (!cx || acpi_idle_suspend) {
++ if (pm_idle_save) {
++ pm_idle_save(); /* enables IRQs */
++ } else {
++ acpi_safe_halt();
++ local_irq_enable();
++ }
++
++ return;
++ }
++
++ /*
++ * Check BM Activity
++ * -----------------
++ * Check for bus mastering activity (if required), record, and check
++ * for demotion.
++ */
++ if (pr->flags.bm_check) {
++ u32 bm_status = 0;
++ unsigned long diff = jiffies - pr->power.bm_check_timestamp;
++
++ if (diff > 31)
++ diff = 31;
++
++ pr->power.bm_activity <<= diff;
++
++ acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS, &bm_status);
++ if (bm_status) {
++ pr->power.bm_activity |= 0x1;
++ acpi_set_register(ACPI_BITREG_BUS_MASTER_STATUS, 1);
++ }
++ /*
++ * PIIX4 Erratum #18: Note that BM_STS doesn't always reflect
++ * the true state of bus mastering activity; forcing us to
++ * manually check the BMIDEA bit of each IDE channel.
++ */
++ else if (errata.piix4.bmisx) {
++ if ((inb_p(errata.piix4.bmisx + 0x02) & 0x01)
++ || (inb_p(errata.piix4.bmisx + 0x0A) & 0x01))
++ pr->power.bm_activity |= 0x1;
++ }
++
++ pr->power.bm_check_timestamp = jiffies;
++
++ /*
++ * If bus mastering is or was active this jiffy, demote
++ * to avoid a faulty transition. Note that the processor
++ * won't enter a low-power state during this call (to this
++ * function) but should upon the next.
++ *
++ * TBD: A better policy might be to fallback to the demotion
++ * state (use it for this quantum only) istead of
++ * demoting -- and rely on duration as our sole demotion
++ * qualification. This may, however, introduce DMA
++ * issues (e.g. floppy DMA transfer overrun/underrun).
++ */
++ if ((pr->power.bm_activity & 0x1) &&
++ cx->demotion.threshold.bm) {
++ local_irq_enable();
++ next_state = cx->demotion.state;
++ goto end;
++ }
++ }
++
++#ifdef CONFIG_HOTPLUG_CPU
++ /*
++ * Check for P_LVL2_UP flag before entering C2 and above on
++ * an SMP system. We do it here instead of doing it at _CST/P_LVL
++ * detection phase, to work cleanly with logical CPU hotplug.
++ */
++ if ((cx->type != ACPI_STATE_C1) && (num_online_cpus() > 1) &&
++ !pr->flags.has_cst && !(acpi_gbl_FADT.flags & ACPI_FADT_C2_MP_SUPPORTED))
++ cx = &pr->power.states[ACPI_STATE_C1];
++#endif
++
++ /*
++ * Sleep:
++ * ------
++ * Invoke the current Cx state to put the processor to sleep.
++ */
++ if (cx->type == ACPI_STATE_C2 || cx->type == ACPI_STATE_C3) {
++ current_thread_info()->status &= ~TS_POLLING;
++ /*
++ * TS_POLLING-cleared state must be visible before we
++ * test NEED_RESCHED:
++ */
++ smp_mb();
++ if (need_resched()) {
++ current_thread_info()->status |= TS_POLLING;
++ local_irq_enable();
++ return;
++ }
++ }
++
++ switch (cx->type) {
++
++ case ACPI_STATE_C1:
++ /*
++ * Invoke C1.
++ * Use the appropriate idle routine, the one that would
++ * be used without acpi C-states.
++ */
++ if (pm_idle_save) {
++ pm_idle_save(); /* enables IRQs */
++ } else {
++ acpi_safe_halt();
++ local_irq_enable();
++ }
++
++ /*
++ * TBD: Can't get time duration while in C1, as resumes
++ * go to an ISR rather than here. Need to instrument
++ * base interrupt handler.
++ *
++ * Note: the TSC better not stop in C1, sched_clock() will
++ * skew otherwise.
++ */
++ sleep_ticks = 0xFFFFFFFF;
++
++ break;
++
++ case ACPI_STATE_C2:
++ /* Get start time (ticks) */
++ t1 = inl(acpi_gbl_FADT.xpm_timer_block.address);
++ /* Tell the scheduler that we are going deep-idle: */
++ sched_clock_idle_sleep_event();
++ /* Invoke C2 */
++ acpi_state_timer_broadcast(pr, cx, 1);
++ acpi_cstate_enter(cx);
++ /* Get end time (ticks) */
++ t2 = inl(acpi_gbl_FADT.xpm_timer_block.address);
++
++#if defined (CONFIG_GENERIC_TIME) && defined (CONFIG_X86)
++ /* TSC halts in C2, so notify users */
++ if (tsc_halts_in_c(ACPI_STATE_C2))
++ mark_tsc_unstable("possible TSC halt in C2");
++#endif
++ /* Compute time (ticks) that we were actually asleep */
++ sleep_ticks = ticks_elapsed(t1, t2);
++
++ /* Tell the scheduler how much we idled: */
++ sched_clock_idle_wakeup_event(sleep_ticks*PM_TIMER_TICK_NS);
++
++ /* Re-enable interrupts */
++ local_irq_enable();
++ /* Do not account our idle-switching overhead: */
++ sleep_ticks -= cx->latency_ticks + C2_OVERHEAD;
++
++ current_thread_info()->status |= TS_POLLING;
++ acpi_state_timer_broadcast(pr, cx, 0);
++ break;
++
++ case ACPI_STATE_C3:
++ acpi_unlazy_tlb(smp_processor_id());
++ /*
++ * Must be done before busmaster disable as we might
++ * need to access HPET !
++ */
++ acpi_state_timer_broadcast(pr, cx, 1);
++ /*
++ * disable bus master
++ * bm_check implies we need ARB_DIS
++ * !bm_check implies we need cache flush
++ * bm_control implies whether we can do ARB_DIS
++ *
++ * That leaves a case where bm_check is set and bm_control is
++ * not set. In that case we cannot do much, we enter C3
++ * without doing anything.
++ */
++ if (pr->flags.bm_check && pr->flags.bm_control) {
++ if (atomic_inc_return(&c3_cpu_count) ==
++ num_online_cpus()) {
++ /*
++ * All CPUs are trying to go to C3
++ * Disable bus master arbitration
++ */
++ acpi_set_register(ACPI_BITREG_ARB_DISABLE, 1);
++ }
++ } else if (!pr->flags.bm_check) {
++ /* SMP with no shared cache... Invalidate cache */
++ ACPI_FLUSH_CPU_CACHE();
++ }
++
++ /* Get start time (ticks) */
++ t1 = inl(acpi_gbl_FADT.xpm_timer_block.address);
++ /* Invoke C3 */
++ /* Tell the scheduler that we are going deep-idle: */
++ sched_clock_idle_sleep_event();
++ acpi_cstate_enter(cx);
++ /* Get end time (ticks) */
++ t2 = inl(acpi_gbl_FADT.xpm_timer_block.address);
++ if (pr->flags.bm_check && pr->flags.bm_control) {
++ /* Enable bus master arbitration */
++ atomic_dec(&c3_cpu_count);
++ acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0);
++ }
++
++#if defined (CONFIG_GENERIC_TIME) && defined (CONFIG_X86)
++ /* TSC halts in C3, so notify users */
++ if (tsc_halts_in_c(ACPI_STATE_C3))
++ mark_tsc_unstable("TSC halts in C3");
++#endif
++ /* Compute time (ticks) that we were actually asleep */
++ sleep_ticks = ticks_elapsed(t1, t2);
++ /* Tell the scheduler how much we idled: */
++ sched_clock_idle_wakeup_event(sleep_ticks*PM_TIMER_TICK_NS);
++
++ /* Re-enable interrupts */
++ local_irq_enable();
++ /* Do not account our idle-switching overhead: */
++ sleep_ticks -= cx->latency_ticks + C3_OVERHEAD;
++
++ current_thread_info()->status |= TS_POLLING;
++ acpi_state_timer_broadcast(pr, cx, 0);
++ break;
++
++ default:
++ local_irq_enable();
++ return;
++ }
++ cx->usage++;
++ if ((cx->type != ACPI_STATE_C1) && (sleep_ticks > 0))
++ cx->time += sleep_ticks;
++
++ next_state = pr->power.state;
++
++#ifdef CONFIG_HOTPLUG_CPU
++ /* Don't do promotion/demotion */
++ if ((cx->type == ACPI_STATE_C1) && (num_online_cpus() > 1) &&
++ !pr->flags.has_cst && !(acpi_gbl_FADT.flags & ACPI_FADT_C2_MP_SUPPORTED)) {
++ next_state = cx;
++ goto end;
++ }
++#endif
++
++ /*
++ * Promotion?
++ * ----------
++ * Track the number of longs (time asleep is greater than threshold)
++ * and promote when the count threshold is reached. Note that bus
++ * mastering activity may prevent promotions.
++ * Do not promote above max_cstate.
++ */
++ if (cx->promotion.state &&
++ ((cx->promotion.state - pr->power.states) <= max_cstate)) {
++ if (sleep_ticks > cx->promotion.threshold.ticks &&
++ cx->promotion.state->latency <=
++ pm_qos_requirement(PM_QOS_CPU_DMA_LATENCY)) {
++ cx->promotion.count++;
++ cx->demotion.count = 0;
++ if (cx->promotion.count >=
++ cx->promotion.threshold.count) {
++ if (pr->flags.bm_check) {
++ if (!
++ (pr->power.bm_activity & cx->
++ promotion.threshold.bm)) {
++ next_state =
++ cx->promotion.state;
++ goto end;
++ }
++ } else {
++ next_state = cx->promotion.state;
++ goto end;
++ }
++ }
++ }
++ }
++
++ /*
++ * Demotion?
++ * ---------
++ * Track the number of shorts (time asleep is less than time threshold)
++ * and demote when the usage threshold is reached.
++ */
++ if (cx->demotion.state) {
++ if (sleep_ticks < cx->demotion.threshold.ticks) {
++ cx->demotion.count++;
++ cx->promotion.count = 0;
++ if (cx->demotion.count >= cx->demotion.threshold.count) {
++ next_state = cx->demotion.state;
++ goto end;
++ }
++ }
++ }
++
++ end:
++ /*
++ * Demote if current state exceeds max_cstate
++ * or if the latency of the current state is unacceptable
++ */
++ if ((pr->power.state - pr->power.states) > max_cstate ||
++ pr->power.state->latency >
++ pm_qos_requirement(PM_QOS_CPU_DMA_LATENCY)) {
++ if (cx->demotion.state)
++ next_state = cx->demotion.state;
++ }
++
++ /*
++ * New Cx State?
++ * -------------
++ * If we're going to start using a new Cx state we must clean up
++ * from the previous and prepare to use the new.
++ */
++ if (next_state != pr->power.state)
++ acpi_processor_power_activate(pr, next_state);
++}
++
++static int acpi_processor_set_power_policy(struct acpi_processor *pr)
++{
++ unsigned int i;
++ unsigned int state_is_set = 0;
++ struct acpi_processor_cx *lower = NULL;
++ struct acpi_processor_cx *higher = NULL;
++ struct acpi_processor_cx *cx;
++
++
++ if (!pr)
++ return -EINVAL;
++
++ /*
++ * This function sets the default Cx state policy (OS idle handler).
++ * Our scheme is to promote quickly to C2 but more conservatively
++ * to C3. We're favoring C2 for its characteristics of low latency
++ * (quick response), good power savings, and ability to allow bus
++ * mastering activity. Note that the Cx state policy is completely
++ * customizable and can be altered dynamically.
++ */
++
++ /* startup state */
++ for (i = 1; i < ACPI_PROCESSOR_MAX_POWER; i++) {
++ cx = &pr->power.states[i];
++ if (!cx->valid)
++ continue;
++
++ if (!state_is_set)
++ pr->power.state = cx;
++ state_is_set++;
++ break;
++ }
++
++ if (!state_is_set)
++ return -ENODEV;
++
++ /* demotion */
++ for (i = 1; i < ACPI_PROCESSOR_MAX_POWER; i++) {
++ cx = &pr->power.states[i];
++ if (!cx->valid)
++ continue;
++
++ if (lower) {
++ cx->demotion.state = lower;
++ cx->demotion.threshold.ticks = cx->latency_ticks;
++ cx->demotion.threshold.count = 1;
++ if (cx->type == ACPI_STATE_C3)
++ cx->demotion.threshold.bm = bm_history;
++ }
++
++ lower = cx;
++ }
++
++ /* promotion */
++ for (i = (ACPI_PROCESSOR_MAX_POWER - 1); i > 0; i--) {
++ cx = &pr->power.states[i];
++ if (!cx->valid)
++ continue;
++
++ if (higher) {
++ cx->promotion.state = higher;
++ cx->promotion.threshold.ticks = cx->latency_ticks;
++ if (cx->type >= ACPI_STATE_C2)
++ cx->promotion.threshold.count = 4;
++ else
++ cx->promotion.threshold.count = 10;
++ if (higher->type == ACPI_STATE_C3)
++ cx->promotion.threshold.bm = bm_history;
++ }
++
++ higher = cx;
++ }
++
++ return 0;
++}
++#endif /* !CONFIG_CPU_IDLE */
++
+ static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)
+ {
+
+@@ -541,7 +1047,11 @@
+ */
+ cx->valid = 1;
+
++#ifndef CONFIG_CPU_IDLE
++ cx->latency_ticks = US_TO_PM_TIMER_TICKS(cx->latency);
++#else
+ cx->latency_ticks = cx->latency;
++#endif
+
+ return;
+ }
+@@ -611,6 +1121,7 @@
+ " for C3 to be enabled on SMP systems\n"));
+ return;
+ }
++ acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0);
+ }
+
+ /*
+@@ -621,16 +1132,11 @@
+ */
+ cx->valid = 1;
+
++#ifndef CONFIG_CPU_IDLE
++ cx->latency_ticks = US_TO_PM_TIMER_TICKS(cx->latency);
++#else
+ cx->latency_ticks = cx->latency;
+- /*
+- * On older chipsets, BM_RLD needs to be set
+- * in order for Bus Master activity to wake the
+- * system from C3. Newer chipsets handle DMA
+- * during C3 automatically and BM_RLD is a NOP.
+- * In either case, the proper way to
+- * handle BM_RLD is to set it and leave it set.
+- */
+- acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 1);
++#endif
+
+ return;
+ }
+@@ -695,6 +1201,20 @@
+
+ pr->power.count = acpi_processor_power_verify(pr);
+
++#ifndef CONFIG_CPU_IDLE
++ /*
++ * Set Default Policy
++ * ------------------
++ * Now that we know which states are supported, set the default
++ * policy. Note that this policy can be changed dynamically
++ * (e.g. encourage deeper sleeps to conserve battery life when
++ * not on AC).
++ */
++ result = acpi_processor_set_power_policy(pr);
++ if (result)
++ return result;
++#endif
++
+ /*
+ * if one state of type C2 or C3 is available, mark this
+ * CPU as being "idle manageable"
+@@ -792,6 +1312,69 @@
+ .release = single_release,
+ };
+
++#ifndef CONFIG_CPU_IDLE
++
++int acpi_processor_cst_has_changed(struct acpi_processor *pr)
++{
++ int result = 0;
++
++ if (boot_option_idle_override)
++ return 0;
++
++ if (!pr)
++ return -EINVAL;
++
++ if (nocst) {
++ return -ENODEV;
++ }
++
++ if (!pr->flags.power_setup_done)
++ return -ENODEV;
++
++ /*
++ * Fall back to the default idle loop, when pm_idle_save had
++ * been initialized.
++ */
++ if (pm_idle_save) {
++ pm_idle = pm_idle_save;
++ /* Relies on interrupts forcing exit from idle. */
++ synchronize_sched();
++ }
++
++ pr->flags.power = 0;
++ result = acpi_processor_get_power_info(pr);
++ if ((pr->flags.power == 1) && (pr->flags.power_setup_done))
++ pm_idle = acpi_processor_idle;
++
++ return result;
++}
++
++#ifdef CONFIG_SMP
++static void smp_callback(void *v)
++{
++ /* we already woke the CPU up, nothing more to do */
++}
++
++/*
++ * This function gets called when a part of the kernel has a new latency
++ * requirement. This means we need to get all processors out of their C-state,
++ * and then recalculate a new suitable C-state. Just do a cross-cpu IPI; that
++ * wakes them all right up.
++ */
++static int acpi_processor_latency_notify(struct notifier_block *b,
++ unsigned long l, void *v)
++{
++ smp_call_function(smp_callback, NULL, 1);
++ return NOTIFY_OK;
++}
++
++static struct notifier_block acpi_processor_latency_notifier = {
++ .notifier_call = acpi_processor_latency_notify,
++};
++
++#endif
++
++#else /* CONFIG_CPU_IDLE */
+
+ /**
+ * acpi_idle_bm_check - checks if bus master activity was detected
+@@ -800,7 +1383,7 @@
+ {
+ u32 bm_status = 0;
+
+- acpi_get_register_unlocked(ACPI_BITREG_BUS_MASTER_STATUS, &bm_status);
++ acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS, &bm_status);
+ if (bm_status)
+ acpi_set_register(ACPI_BITREG_BUS_MASTER_STATUS, 1);
+ /*
+@@ -817,6 +1400,25 @@
+ }
+
+ /**
++ * acpi_idle_update_bm_rld - updates the BM_RLD bit depending on target state
++ * @pr: the processor
++ * @target: the new target state
++ */
++static inline void acpi_idle_update_bm_rld(struct acpi_processor *pr,
++ struct acpi_processor_cx *target)
++{
++ if (pr->flags.bm_rld_set && target->type != ACPI_STATE_C3) {
++ acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0);
++ pr->flags.bm_rld_set = 0;
++ }
++
++ if (!pr->flags.bm_rld_set && target->type == ACPI_STATE_C3) {
++ acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 1);
++ pr->flags.bm_rld_set = 1;
++ }
++}
++
++/**
+ * acpi_idle_do_entry - a helper function that does C2 and C3 type entry
+ * @cx: cstate data
+ *
+@@ -871,6 +1473,9 @@
+ return 0;
+ }
+
++ if (pr->flags.bm_check)
++ acpi_idle_update_bm_rld(pr, cx);
++
+ t1 = inl(acpi_gbl_FADT.xpm_timer_block.address);
+ acpi_idle_do_entry(cx);
+ t2 = inl(acpi_gbl_FADT.xpm_timer_block.address);
+@@ -922,6 +1527,9 @@
+ */
+ acpi_state_timer_broadcast(pr, cx, 1);
+
++ if (pr->flags.bm_check)
++ acpi_idle_update_bm_rld(pr, cx);
++
+ if (cx->type == ACPI_STATE_C3)
+ ACPI_FLUSH_CPU_CACHE();
+
+@@ -1013,6 +1621,8 @@
+ */
+ acpi_state_timer_broadcast(pr, cx, 1);
+
++ acpi_idle_update_bm_rld(pr, cx);
++
+ /*
+ * disable bus master
+ * bm_check implies we need ARB_DIS
+@@ -1185,6 +1795,8 @@
+ return ret;
+ }
+
++#endif /* CONFIG_CPU_IDLE */
++
+ int __cpuinit acpi_processor_power_init(struct acpi_processor *pr,
+ struct acpi_device *device)
+ {
+@@ -1213,6 +1825,10 @@
+ "ACPI: processor limited to max C-state %d\n",
+ max_cstate);
+ first_run++;
++#if !defined(CONFIG_CPU_IDLE) && defined(CONFIG_SMP)
++ pm_qos_add_notifier(PM_QOS_CPU_DMA_LATENCY,
++ &acpi_processor_latency_notifier);
++#endif
+ }
+
+ if (!pr)
+@@ -1236,9 +1852,11 @@
+ * platforms that only support C1.
+ */
+ if (pr->flags.power) {
++#ifdef CONFIG_CPU_IDLE
+ acpi_processor_setup_cpuidle(pr);
+ if (cpuidle_register_device(&pr->power.dev))
+ return -EIO;
++#endif
+
+ printk(KERN_INFO PREFIX "CPU%d (power states:", pr->id);
+ for (i = 1; i <= pr->power.count; i++)
+@@ -1246,6 +1864,13 @@
+ printk(" C%d[C%d]", i,
+ pr->power.states[i].type);
+ printk(")\n");
++
++#ifndef CONFIG_CPU_IDLE
++ if (pr->id == 0) {
++ pm_idle_save = pm_idle;
++ pm_idle = acpi_processor_idle;
++ }
++#endif
+ }
+
+ /* 'power' [R] */
+@@ -1264,12 +1889,34 @@
+ if (boot_option_idle_override)
+ return 0;
+
++#ifdef CONFIG_CPU_IDLE
+ cpuidle_unregister_device(&pr->power.dev);
++#endif
+ pr->flags.power_setup_done = 0;
+
+ if (acpi_device_dir(device))
+ remove_proc_entry(ACPI_PROCESSOR_FILE_POWER,
+ acpi_device_dir(device));
+
++#ifndef CONFIG_CPU_IDLE
++
++ /* Unregister the idle handler when processor #0 is removed. */
++ if (pr->id == 0) {
++ if (pm_idle_save)
++ pm_idle = pm_idle_save;
++
++ /*
++ * We are about to unload the current idle thread pm callback
++ * (pm_idle), Wait for all processors to update cached/local
++ * copies of pm_idle before proceeding.
++ */
++ cpu_idle_wait();
++#ifdef CONFIG_SMP
++ pm_qos_remove_notifier(PM_QOS_CPU_DMA_LATENCY,
++ &acpi_processor_latency_notifier);
++#endif
++ }
++#endif
++
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/acpi/processor_perflib.c linux-2.6.29-rc3.owrt/drivers/acpi/processor_perflib.c
+--- linux-2.6.29.owrt/drivers/acpi/processor_perflib.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/acpi/processor_perflib.c 2009-05-10 23:48:28.000000000 +0200
+@@ -31,6 +31,14 @@
+ #include <linux/init.h>
+ #include <linux/cpufreq.h>
+
++#ifdef CONFIG_X86_ACPI_CPUFREQ_PROC_INTF
++#include <linux/proc_fs.h>
++#include <linux/seq_file.h>
++#include <linux/mutex.h>
++
++#include <asm/uaccess.h>
++#endif
++
+ #ifdef CONFIG_X86
+ #include <asm/cpufeature.h>
+ #endif
+@@ -426,6 +434,96 @@
+
+ EXPORT_SYMBOL(acpi_processor_notify_smm);
+
++#ifdef CONFIG_X86_ACPI_CPUFREQ_PROC_INTF
++/* /proc/acpi/processor/../performance interface (DEPRECATED) */
++
++static int acpi_processor_perf_open_fs(struct inode *inode, struct file *file);
++static struct file_operations acpi_processor_perf_fops = {
++ .owner = THIS_MODULE,
++ .open = acpi_processor_perf_open_fs,
++ .read = seq_read,
++ .llseek = seq_lseek,
++ .release = single_release,
++};
++
++static int acpi_processor_perf_seq_show(struct seq_file *seq, void *offset)
++{
++ struct acpi_processor *pr = seq->private;
++ int i;
++
++
++ if (!pr)
++ goto end;
++
++ if (!pr->performance) {
++ seq_puts(seq, "<not supported>\n");
++ goto end;
++ }
++
++ seq_printf(seq, "state count: %d\n"
++ "active state: P%d\n",
++ pr->performance->state_count, pr->performance->state);
++
++ seq_puts(seq, "states:\n");
++ for (i = 0; i < pr->performance->state_count; i++)
++ seq_printf(seq,
++ " %cP%d: %d MHz, %d mW, %d uS\n",
++ (i == pr->performance->state ? '*' : ' '), i,
++ (u32) pr->performance->states[i].core_frequency,
++ (u32) pr->performance->states[i].power,
++ (u32) pr->performance->states[i].transition_latency);
++
++ end:
++ return 0;
++}
++
++static int acpi_processor_perf_open_fs(struct inode *inode, struct file *file)
++{
++ return single_open(file, acpi_processor_perf_seq_show,
++ PDE(inode)->data);
++}
++
++static void acpi_cpufreq_add_file(struct acpi_processor *pr)
++{
++ struct acpi_device *device = NULL;
++
++
++ if (acpi_bus_get_device(pr->handle, &device))
++ return;
++
++ /* add file 'performance' [R/W] */
++ proc_create_data(ACPI_PROCESSOR_FILE_PERFORMANCE, S_IFREG | S_IRUGO,
++ acpi_device_dir(device),
++ &acpi_processor_perf_fops, acpi_driver_data(device));
++ return;
++}
++
++static void acpi_cpufreq_remove_file(struct acpi_processor *pr)
++{
++ struct acpi_device *device = NULL;
++
++
++ if (acpi_bus_get_device(pr->handle, &device))
++ return;
++
++ /* remove file 'performance' */
++ remove_proc_entry(ACPI_PROCESSOR_FILE_PERFORMANCE,
++ acpi_device_dir(device));
++
++ return;
++}
++
++#else
++static void acpi_cpufreq_add_file(struct acpi_processor *pr)
++{
++ return;
++}
++static void acpi_cpufreq_remove_file(struct acpi_processor *pr)
++{
++ return;
++}
++#endif /* CONFIG_X86_ACPI_CPUFREQ_PROC_INTF */
++
+ static int acpi_processor_get_psd(struct acpi_processor *pr)
+ {
+ int result = 0;
+@@ -649,12 +747,14 @@
+ }
+ EXPORT_SYMBOL(acpi_processor_preregister_performance);
+
++
+ int
+ acpi_processor_register_performance(struct acpi_processor_performance
+ *performance, unsigned int cpu)
+ {
+ struct acpi_processor *pr;
+
++
+ if (!(acpi_processor_ppc_status & PPC_REGISTERED))
+ return -EINVAL;
+
+@@ -681,6 +781,8 @@
+ return -EIO;
+ }
+
++ acpi_cpufreq_add_file(pr);
++
+ mutex_unlock(&performance_mutex);
+ return 0;
+ }
+@@ -693,6 +795,7 @@
+ {
+ struct acpi_processor *pr;
+
++
+ mutex_lock(&performance_mutex);
+
+ pr = per_cpu(processors, cpu);
+@@ -705,6 +808,8 @@
+ kfree(pr->performance->states);
+ pr->performance = NULL;
+
++ acpi_cpufreq_remove_file(pr);
++
+ mutex_unlock(&performance_mutex);
+
+ return;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/acpi/sleep.c linux-2.6.29-rc3.owrt/drivers/acpi/sleep.c
+--- linux-2.6.29.owrt/drivers/acpi/sleep.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/acpi/sleep.c 2009-05-10 23:48:28.000000000 +0200
+@@ -90,6 +90,31 @@
+ old_suspend_ordering = true;
+ }
+
++/*
++ * According to the ACPI specification the BIOS should make sure that ACPI is
++ * enabled and SCI_EN bit is set on wake-up from S1 - S3 sleep states. Still,
++ * some BIOSes don't do that and therefore we use acpi_enable() to enable ACPI
++ * on such systems during resume. Unfortunately that doesn't help in
++ * particularly pathological cases in which SCI_EN has to be set directly on
++ * resume, although the specification states very clearly that this flag is
++ * owned by the hardware. The set_sci_en_on_resume variable will be set in such
++ * cases.
++ */
++static bool set_sci_en_on_resume;
++/*
++ * The ACPI specification wants us to save NVS memory regions during hibernation
++ * and to restore them during the subsequent resume. However, it is not certain
++ * if this mechanism is going to work on all machines, so we allow the user to
++ * disable this mechanism using the 'acpi_sleep=s4_nonvs' kernel command line
++ * option.
++ */
++static bool s4_no_nvs;
++
++void __init acpi_s4_no_nvs(void)
++{
++ s4_no_nvs = true;
++}
++
+ /**
+ * acpi_pm_disable_gpes - Disable the GPEs.
+ */
+@@ -168,18 +193,6 @@
+ #endif /* CONFIG_ACPI_SLEEP */
+
+ #ifdef CONFIG_SUSPEND
+-/*
+- * According to the ACPI specification the BIOS should make sure that ACPI is
+- * enabled and SCI_EN bit is set on wake-up from S1 - S3 sleep states. Still,
+- * some BIOSes don't do that and therefore we use acpi_enable() to enable ACPI
+- * on such systems during resume. Unfortunately that doesn't help in
+- * particularly pathological cases in which SCI_EN has to be set directly on
+- * resume, although the specification states very clearly that this flag is
+- * owned by the hardware. The set_sci_en_on_resume variable will be set in such
+- * cases.
+- */
+-static bool set_sci_en_on_resume;
+-
+ extern void do_suspend_lowlevel(void);
+
+ static u32 acpi_suspend_states[] = {
+@@ -378,41 +391,11 @@
+ DMI_MATCH(DMI_PRODUCT_NAME, "Macmini1,1"),
+ },
+ },
+- {
+- .callback = init_old_suspend_ordering,
+- .ident = "Asus Pundit P1-AH2 (M2N8L motherboard)",
+- .matches = {
+- DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTek Computer INC."),
+- DMI_MATCH(DMI_BOARD_NAME, "M2N8L"),
+- },
+- },
+- {
+- .callback = init_set_sci_en_on_resume,
+- .ident = "Toshiba Satellite L300",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
+- DMI_MATCH(DMI_PRODUCT_NAME, "Satellite L300"),
+- },
+- },
+ {},
+ };
+ #endif /* CONFIG_SUSPEND */
+
+ #ifdef CONFIG_HIBERNATION
+-/*
+- * The ACPI specification wants us to save NVS memory regions during hibernation
+- * and to restore them during the subsequent resume. However, it is not certain
+- * if this mechanism is going to work on all machines, so we allow the user to
+- * disable this mechanism using the 'acpi_sleep=s4_nonvs' kernel command line
+- * option.
+- */
+-static bool s4_no_nvs;
+-
+-void __init acpi_s4_no_nvs(void)
+-{
+- s4_no_nvs = true;
+-}
+-
+ static unsigned long s4_hardware_signature;
+ static struct acpi_table_facs *facs;
+ static bool nosigcheck;
+@@ -696,7 +679,7 @@
+ static void acpi_power_off(void)
+ {
+ /* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */
+- printk(KERN_DEBUG "%s called\n", __func__);
++ printk("%s called\n", __func__);
+ local_irq_disable();
+ acpi_enable_wakeup_device(ACPI_STATE_S5);
+ acpi_enter_sleep_state(ACPI_STATE_S5);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/acpi/tables.c linux-2.6.29-rc3.owrt/drivers/acpi/tables.c
+--- linux-2.6.29.owrt/drivers/acpi/tables.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/acpi/tables.c 2009-05-10 23:48:28.000000000 +0200
+@@ -293,12 +293,7 @@
+
+ int __init acpi_table_init(void)
+ {
+- acpi_status status;
+-
+- status = acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0);
+- if (ACPI_FAILURE(status))
+- return 1;
+-
++ acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0);
+ check_multiple_madt();
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/acpi/video.c linux-2.6.29-rc3.owrt/drivers/acpi/video.c
+--- linux-2.6.29.owrt/drivers/acpi/video.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/acpi/video.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1020,7 +1020,7 @@
+ }
+
+ seq_printf(seq, "levels: ");
+- for (i = 2; i < dev->brightness->count; i++)
++ for (i = 0; i < dev->brightness->count; i++)
+ seq_printf(seq, " %d", dev->brightness->levels[i]);
+ seq_printf(seq, "\ncurrent: %d\n", dev->brightness->curr);
+
+@@ -1059,7 +1059,7 @@
+ return -EFAULT;
+
+ /* validate through the list of available levels */
+- for (i = 2; i < dev->brightness->count; i++)
++ for (i = 0; i < dev->brightness->count; i++)
+ if (level == dev->brightness->levels[i]) {
+ if (ACPI_SUCCESS
+ (acpi_video_device_lcd_set_level(dev, level)))
+@@ -1260,7 +1260,7 @@
+ printk(KERN_WARNING PREFIX
+ "This indicates a BIOS bug. Please contact the manufacturer.\n");
+ }
+- printk(KERN_WARNING "%llx\n", options);
++ printk("%llx\n", options);
+ seq_printf(seq, "can POST: <integrated video>");
+ if (options & 2)
+ seq_printf(seq, " <PCI video>");
+@@ -1712,7 +1712,7 @@
+ max = max_below = 0;
+ min = min_above = 255;
+ /* Find closest level to level_current */
+- for (i = 2; i < device->brightness->count; i++) {
++ for (i = 0; i < device->brightness->count; i++) {
+ l = device->brightness->levels[i];
+ if (abs(l - level_current) < abs(delta)) {
+ delta = l - level_current;
+@@ -1722,7 +1722,7 @@
+ }
+ /* Ajust level_current to closest available level */
+ level_current += delta;
+- for (i = 2; i < device->brightness->count; i++) {
++ for (i = 0; i < device->brightness->count; i++) {
+ l = device->brightness->levels[i];
+ if (l < min)
+ min = l;
+@@ -2006,12 +2006,6 @@
+ device->pnp.bus_id[3] = '0' + instance;
+ instance ++;
+ }
+- /* a hack to fix the duplicate name "VGA" problem on Pa 3553 */
+- if (!strcmp(device->pnp.bus_id, "VGA")) {
+- if (instance)
+- device->pnp.bus_id[3] = '0' + instance;
+- instance++;
+- }
+
+ video->device = device;
+ strcpy(acpi_device_name(device), ACPI_VIDEO_BUS_NAME);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ata/ahci.c linux-2.6.29-rc3.owrt/drivers/ata/ahci.c
+--- linux-2.6.29.owrt/drivers/ata/ahci.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ata/ahci.c 2009-05-10 23:48:28.000000000 +0200
+@@ -61,14 +61,9 @@
+ #define EM_MSG_LED_VALUE_ON 0x00010000
+
+ static int ahci_skip_host_reset;
+-static int ahci_ignore_sss;
+-
+ module_param_named(skip_host_reset, ahci_skip_host_reset, int, 0444);
+ MODULE_PARM_DESC(skip_host_reset, "skip global host reset (0=don't skip, 1=skip)");
+
+-module_param_named(ignore_sss, ahci_ignore_sss, int, 0444);
+-MODULE_PARM_DESC(ignore_sss, "Ignore staggered spinup flag (0=don't ignore, 1=ignore)");
+-
+ static int ahci_enable_alpm(struct ata_port *ap,
+ enum link_pm policy);
+ static void ahci_disable_alpm(struct ata_port *ap);
+@@ -582,18 +577,18 @@
+ { PCI_VDEVICE(NVIDIA, 0x0abd), board_ahci }, /* MCP79 */
+ { PCI_VDEVICE(NVIDIA, 0x0abe), board_ahci }, /* MCP79 */
+ { PCI_VDEVICE(NVIDIA, 0x0abf), board_ahci }, /* MCP79 */
+- { PCI_VDEVICE(NVIDIA, 0x0d84), board_ahci }, /* MCP89 */
+- { PCI_VDEVICE(NVIDIA, 0x0d85), board_ahci }, /* MCP89 */
+- { PCI_VDEVICE(NVIDIA, 0x0d86), board_ahci }, /* MCP89 */
+- { PCI_VDEVICE(NVIDIA, 0x0d87), board_ahci }, /* MCP89 */
+- { PCI_VDEVICE(NVIDIA, 0x0d88), board_ahci }, /* MCP89 */
+- { PCI_VDEVICE(NVIDIA, 0x0d89), board_ahci }, /* MCP89 */
+- { PCI_VDEVICE(NVIDIA, 0x0d8a), board_ahci }, /* MCP89 */
+- { PCI_VDEVICE(NVIDIA, 0x0d8b), board_ahci }, /* MCP89 */
+- { PCI_VDEVICE(NVIDIA, 0x0d8c), board_ahci }, /* MCP89 */
+- { PCI_VDEVICE(NVIDIA, 0x0d8d), board_ahci }, /* MCP89 */
+- { PCI_VDEVICE(NVIDIA, 0x0d8e), board_ahci }, /* MCP89 */
+- { PCI_VDEVICE(NVIDIA, 0x0d8f), board_ahci }, /* MCP89 */
++ { PCI_VDEVICE(NVIDIA, 0x0bc8), board_ahci }, /* MCP7B */
++ { PCI_VDEVICE(NVIDIA, 0x0bc9), board_ahci }, /* MCP7B */
++ { PCI_VDEVICE(NVIDIA, 0x0bca), board_ahci }, /* MCP7B */
++ { PCI_VDEVICE(NVIDIA, 0x0bcb), board_ahci }, /* MCP7B */
++ { PCI_VDEVICE(NVIDIA, 0x0bcc), board_ahci }, /* MCP7B */
++ { PCI_VDEVICE(NVIDIA, 0x0bcd), board_ahci }, /* MCP7B */
++ { PCI_VDEVICE(NVIDIA, 0x0bce), board_ahci }, /* MCP7B */
++ { PCI_VDEVICE(NVIDIA, 0x0bcf), board_ahci }, /* MCP7B */
++ { PCI_VDEVICE(NVIDIA, 0x0bc4), board_ahci }, /* MCP7B */
++ { PCI_VDEVICE(NVIDIA, 0x0bc5), board_ahci }, /* MCP7B */
++ { PCI_VDEVICE(NVIDIA, 0x0bc6), board_ahci }, /* MCP7B */
++ { PCI_VDEVICE(NVIDIA, 0x0bc7), board_ahci }, /* MCP7B */
+
+ /* SiS */
+ { PCI_VDEVICE(SI, 0x1184), board_ahci }, /* SiS 966 */
+@@ -2697,10 +2692,8 @@
+ host->iomap = pcim_iomap_table(pdev);
+ host->private_data = hpriv;
+
+- if (!(hpriv->cap & HOST_CAP_SSS) || ahci_ignore_sss)
++ if (!(hpriv->cap & HOST_CAP_SSS))
+ host->flags |= ATA_HOST_PARALLEL_SCAN;
+- else
+- printk(KERN_INFO "ahci: SSS flag set, parallel bus scan disabled\n");
+
+ if (pi.flags & ATA_FLAG_EM)
+ ahci_reset_em(host);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ata/ata_piix.c linux-2.6.29-rc3.owrt/drivers/ata/ata_piix.c
+--- linux-2.6.29.owrt/drivers/ata/ata_piix.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ata/ata_piix.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1289,39 +1289,6 @@
+ return map;
+ }
+
+-static bool piix_no_sidpr(struct ata_host *host)
+-{
+- struct pci_dev *pdev = to_pci_dev(host->dev);
+-
+- /*
+- * Samsung DB-P70 only has three ATA ports exposed and
+- * curiously the unconnected first port reports link online
+- * while not responding to SRST protocol causing excessive
+- * detection delay.
+- *
+- * Unfortunately, the system doesn't carry enough DMI
+- * information to identify the machine but does have subsystem
+- * vendor and device set. As it's unclear whether the
+- * subsystem vendor/device is used only for this specific
+- * board, the port can't be disabled solely with the
+- * information; however, turning off SIDPR access works around
+- * the problem. Turn it off.
+- *
+- * This problem is reported in bnc#441240.
+- *
+- * https://bugzilla.novell.com/show_bug.cgi?id=441420
+- */
+- if (pdev->vendor == PCI_VENDOR_ID_INTEL && pdev->device == 0x2920 &&
+- pdev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG &&
+- pdev->subsystem_device == 0xb049) {
+- dev_printk(KERN_WARNING, host->dev,
+- "Samsung DB-P70 detected, disabling SIDPR\n");
+- return true;
+- }
+-
+- return false;
+-}
+-
+ static int __devinit piix_init_sidpr(struct ata_host *host)
+ {
+ struct pci_dev *pdev = to_pci_dev(host->dev);
+@@ -1335,10 +1302,6 @@
+ if (hpriv->map[i] == IDE)
+ return 0;
+
+- /* is it blacklisted? */
+- if (piix_no_sidpr(host))
+- return 0;
+-
+ if (!(host->ports[0]->flags & PIIX_FLAG_SIDPR))
+ return 0;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ata/libata-core.c linux-2.6.29-rc3.owrt/drivers/ata/libata-core.c
+--- linux-2.6.29.owrt/drivers/ata/libata-core.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ata/libata-core.c 2009-05-10 23:48:28.000000000 +0200
+@@ -164,11 +164,6 @@
+ MODULE_VERSION(DRV_VERSION);
+
+
+-static bool ata_sstatus_online(u32 sstatus)
+-{
+- return (sstatus & 0xf) == 0x3;
+-}
+-
+ /**
+ * ata_link_next - link iteration helper
+ * @link: the previous link, NULL to start
+@@ -1020,6 +1015,18 @@
+ return spd_str[spd - 1];
+ }
+
++void ata_dev_disable(struct ata_device *dev)
++{
++ if (ata_dev_enabled(dev)) {
++ if (ata_msg_drv(dev->link->ap))
++ ata_dev_printk(dev, KERN_WARNING, "disabled\n");
++ ata_acpi_on_disable(dev);
++ ata_down_xfermask_limit(dev, ATA_DNXFER_FORCE_PIO0 |
++ ATA_DNXFER_QUIET);
++ dev->class++;
++ }
++}
++
+ static int ata_dev_set_dipm(struct ata_device *dev, enum link_pm policy)
+ {
+ struct ata_link *link = dev->link;
+@@ -1322,16 +1329,14 @@
+ {
+ if (ata_id_has_lba(id)) {
+ if (ata_id_has_lba48(id))
+- return ata_id_u64(id, ATA_ID_LBA_CAPACITY_2);
++ return ata_id_u64(id, 100);
+ else
+- return ata_id_u32(id, ATA_ID_LBA_CAPACITY);
++ return ata_id_u32(id, 60);
+ } else {
+ if (ata_id_current_chs_valid(id))
+- return id[ATA_ID_CUR_CYLS] * id[ATA_ID_CUR_HEADS] *
+- id[ATA_ID_CUR_SECTORS];
++ return ata_id_u32(id, 57);
+ else
+- return id[ATA_ID_CYLS] * id[ATA_ID_HEADS] *
+- id[ATA_ID_SECTORS];
++ return id[1] * id[3] * id[6];
+ }
+ }
+
+@@ -2234,40 +2239,6 @@
+ return rc;
+ }
+
+-static int ata_do_link_spd_horkage(struct ata_device *dev)
+-{
+- struct ata_link *plink = ata_dev_phys_link(dev);
+- u32 target, target_limit;
+-
+- if (!sata_scr_valid(plink))
+- return 0;
+-
+- if (dev->horkage & ATA_HORKAGE_1_5_GBPS)
+- target = 1;
+- else
+- return 0;
+-
+- target_limit = (1 << target) - 1;
+-
+- /* if already on stricter limit, no need to push further */
+- if (plink->sata_spd_limit <= target_limit)
+- return 0;
+-
+- plink->sata_spd_limit = target_limit;
+-
+- /* Request another EH round by returning -EAGAIN if link is
+- * going faster than the target speed. Forward progress is
+- * guaranteed by setting sata_spd_limit to target_limit above.
+- */
+- if (plink->sata_spd > target) {
+- ata_dev_printk(dev, KERN_INFO,
+- "applying link speed limit horkage to %s\n",
+- sata_spd_string(target));
+- return -EAGAIN;
+- }
+- return 0;
+-}
+-
+ static inline u8 ata_dev_knobble(struct ata_device *dev)
+ {
+ struct ata_port *ap = dev->link->ap;
+@@ -2358,10 +2329,6 @@
+ return 0;
+ }
+
+- rc = ata_do_link_spd_horkage(dev);
+- if (rc)
+- return rc;
+-
+ /* let ACPI work its magic */
+ rc = ata_acpi_on_devcfg(dev);
+ if (rc)
+@@ -2817,7 +2784,7 @@
+ /* This is the last chance, better to slow
+ * down than lose it.
+ */
+- sata_down_spd_limit(&ap->link, 0);
++ sata_down_spd_limit(&ap->link);
+ ata_down_xfermask_limit(dev, ATA_DNXFER_PIO);
+ }
+ }
+@@ -2913,27 +2880,21 @@
+ /**
+ * sata_down_spd_limit - adjust SATA spd limit downward
+ * @link: Link to adjust SATA spd limit for
+- * @spd_limit: Additional limit
+ *
+ * Adjust SATA spd limit of @link downward. Note that this
+ * function only adjusts the limit. The change must be applied
+ * using sata_set_spd().
+ *
+- * If @spd_limit is non-zero, the speed is limited to equal to or
+- * lower than @spd_limit if such speed is supported. If
+- * @spd_limit is slower than any supported speed, only the lowest
+- * supported speed is allowed.
+- *
+ * LOCKING:
+ * Inherited from caller.
+ *
+ * RETURNS:
+ * 0 on success, negative errno on failure
+ */
+-int sata_down_spd_limit(struct ata_link *link, u32 spd_limit)
++int sata_down_spd_limit(struct ata_link *link)
+ {
+ u32 sstatus, spd, mask;
+- int rc, bit;
++ int rc, highbit;
+
+ if (!sata_scr_valid(link))
+ return -EOPNOTSUPP;
+@@ -2942,7 +2903,7 @@
+ * If not, use cached value in link->sata_spd.
+ */
+ rc = sata_scr_read(link, SCR_STATUS, &sstatus);
+- if (rc == 0 && ata_sstatus_online(sstatus))
++ if (rc == 0)
+ spd = (sstatus >> 4) & 0xf;
+ else
+ spd = link->sata_spd;
+@@ -2952,8 +2913,8 @@
+ return -EINVAL;
+
+ /* unconditionally mask off the highest bit */
+- bit = fls(mask) - 1;
+- mask &= ~(1 << bit);
++ highbit = fls(mask) - 1;
++ mask &= ~(1 << highbit);
+
+ /* Mask off all speeds higher than or equal to the current
+ * one. Force 1.5Gbps if current SPD is not available.
+@@ -2967,15 +2928,6 @@
+ if (!mask)
+ return -EINVAL;
+
+- if (spd_limit) {
+- if (mask & ((1 << spd_limit) - 1))
+- mask &= (1 << spd_limit) - 1;
+- else {
+- bit = ffs(mask) - 1;
+- mask = 1 << bit;
+- }
+- }
+-
+ link->sata_spd_limit = mask;
+
+ ata_link_printk(link, KERN_WARNING, "limiting SATA link speed to %s\n",
+@@ -4263,9 +4215,6 @@
+ /* Devices that do not need bridging limits applied */
+ { "MTRON MSP-SATA*", NULL, ATA_HORKAGE_BRIDGE_OK, },
+
+- /* Devices which aren't very happy with higher link speeds */
+- { "WD My Book", NULL, ATA_HORKAGE_1_5_GBPS, },
+-
+ /* End Marker */
+ { }
+ };
+@@ -4614,7 +4563,7 @@
+ VPRINTK("unmapping %u sg elements\n", qc->n_elem);
+
+ if (qc->n_elem)
+- dma_unmap_sg(ap->dev, sg, qc->orig_n_elem, dir);
++ dma_unmap_sg(ap->dev, sg, qc->n_elem, dir);
+
+ qc->flags &= ~ATA_QCFLAG_DMAMAP;
+ qc->sg = NULL;
+@@ -4729,7 +4678,7 @@
+ return -1;
+
+ DPRINTK("%d sg elements mapped\n", n_elem);
+- qc->orig_n_elem = qc->n_elem;
++
+ qc->n_elem = n_elem;
+ qc->flags |= ATA_QCFLAG_DMAMAP;
+
+@@ -4760,7 +4709,8 @@
+
+ /**
+ * ata_qc_new - Request an available ATA command, for queueing
+- * @ap: target port
++ * @ap: Port associated with device @dev
++ * @dev: Device from whom we request an available command structure
+ *
+ * LOCKING:
+ * None.
+@@ -5225,7 +5175,7 @@
+ u32 sstatus;
+
+ if (sata_scr_read(link, SCR_STATUS, &sstatus) == 0 &&
+- ata_sstatus_online(sstatus))
++ (sstatus & 0xf) == 0x3)
+ return true;
+ return false;
+ }
+@@ -5249,7 +5199,7 @@
+ u32 sstatus;
+
+ if (sata_scr_read(link, SCR_STATUS, &sstatus) == 0 &&
+- !ata_sstatus_online(sstatus))
++ (sstatus & 0xf) != 0x3)
+ return true;
+ return false;
+ }
+@@ -5462,8 +5412,8 @@
+ dev->horkage = 0;
+ spin_unlock_irqrestore(ap->lock, flags);
+
+- memset((void *)dev + ATA_DEVICE_CLEAR_BEGIN, 0,
+- ATA_DEVICE_CLEAR_END - ATA_DEVICE_CLEAR_BEGIN);
++ memset((void *)dev + ATA_DEVICE_CLEAR_OFFSET, 0,
++ sizeof(*dev) - ATA_DEVICE_CLEAR_OFFSET);
+ dev->pio_mask = UINT_MAX;
+ dev->mwdma_mask = UINT_MAX;
+ dev->udma_mask = UINT_MAX;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ata/libata-eh.c linux-2.6.29-rc3.owrt/drivers/ata/libata-eh.c
+--- linux-2.6.29.owrt/drivers/ata/libata-eh.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ata/libata-eh.c 2009-05-10 23:48:28.000000000 +0200
+@@ -82,10 +82,6 @@
+ ATA_EH_FASTDRAIN_INTERVAL = 3000,
+
+ ATA_EH_UA_TRIES = 5,
+-
+- /* probe speed down parameters, see ata_eh_schedule_probe() */
+- ATA_EH_PROBE_TRIAL_INTERVAL = 60000, /* 1 min */
+- ATA_EH_PROBE_TRIALS = 2,
+ };
+
+ /* The following table determines how we sequence resets. Each entry
+@@ -1180,32 +1176,6 @@
+ }
+
+ /**
+- * ata_dev_disable - disable ATA device
+- * @dev: ATA device to disable
+- *
+- * Disable @dev.
+- *
+- * Locking:
+- * EH context.
+- */
+-void ata_dev_disable(struct ata_device *dev)
+-{
+- if (!ata_dev_enabled(dev))
+- return;
+-
+- if (ata_msg_drv(dev->link->ap))
+- ata_dev_printk(dev, KERN_WARNING, "disabled\n");
+- ata_acpi_on_disable(dev);
+- ata_down_xfermask_limit(dev, ATA_DNXFER_FORCE_PIO0 | ATA_DNXFER_QUIET);
+- dev->class++;
+-
+- /* From now till the next successful probe, ering is used to
+- * track probe failures. Clear accumulated device error info.
+- */
+- ata_ering_clear(&dev->ering);
+-}
+-
+-/**
+ * ata_eh_detach_dev - detach ATA device
+ * @dev: ATA device to detach
+ *
+@@ -1879,7 +1849,7 @@
+ /* speed down? */
+ if (verdict & ATA_EH_SPDN_SPEED_DOWN) {
+ /* speed down SATA link speed if possible */
+- if (sata_down_spd_limit(link, 0) == 0) {
++ if (sata_down_spd_limit(link) == 0) {
+ action |= ATA_EH_RESET;
+ goto done;
+ }
+@@ -2423,14 +2393,11 @@
+ }
+
+ /* prereset() might have cleared ATA_EH_RESET. If so,
+- * bang classes, thaw and return.
++ * bang classes and return.
+ */
+ if (reset && !(ehc->i.action & ATA_EH_RESET)) {
+ ata_for_each_dev(dev, link, ALL)
+ classes[dev->devno] = ATA_DEV_NONE;
+- if ((ap->pflags & ATA_PFLAG_FROZEN) &&
+- ata_is_host_link(link))
+- ata_eh_thaw_port(ap);
+ rc = 0;
+ goto out;
+ }
+@@ -2634,11 +2601,11 @@
+ }
+
+ if (try == max_tries - 1) {
+- sata_down_spd_limit(link, 0);
++ sata_down_spd_limit(link);
+ if (slave)
+- sata_down_spd_limit(slave, 0);
++ sata_down_spd_limit(slave);
+ } else if (rc == -EPIPE)
+- sata_down_spd_limit(failed_link, 0);
++ sata_down_spd_limit(failed_link);
+
+ if (hardreset)
+ reset = hardreset;
+@@ -2777,8 +2744,6 @@
+ readid_flags, dev->id);
+ switch (rc) {
+ case 0:
+- /* clear error info accumulated during probe */
+- ata_ering_clear(&dev->ering);
+ new_mask |= 1 << dev->devno;
+ break;
+ case -ENOENT:
+@@ -2904,7 +2869,7 @@
+ int i;
+
+ for (i = 0; i < ATA_EH_UA_TRIES; i++) {
+- u8 *sense_buffer = dev->link->ap->sector_buf;
++ u8 sense_buffer[SCSI_SENSE_BUFFERSIZE];
+ u8 sense_key = 0;
+ unsigned int err_mask;
+
+@@ -2982,24 +2947,9 @@
+ return 1;
+ }
+
+-static int ata_count_probe_trials_cb(struct ata_ering_entry *ent, void *void_arg)
+-{
+- u64 interval = msecs_to_jiffies(ATA_EH_PROBE_TRIAL_INTERVAL);
+- u64 now = get_jiffies_64();
+- int *trials = void_arg;
+-
+- if (ent->timestamp < now - min(now, interval))
+- return -1;
+-
+- (*trials)++;
+- return 0;
+-}
+-
+ static int ata_eh_schedule_probe(struct ata_device *dev)
+ {
+ struct ata_eh_context *ehc = &dev->link->eh_context;
+- struct ata_link *link = ata_dev_phys_link(dev);
+- int trials = 0;
+
+ if (!(ehc->i.probe_mask & (1 << dev->devno)) ||
+ (ehc->did_probe_mask & (1 << dev->devno)))
+@@ -3012,25 +2962,6 @@
+ ehc->saved_xfer_mode[dev->devno] = 0;
+ ehc->saved_ncq_enabled &= ~(1 << dev->devno);
+
+- /* Record and count probe trials on the ering. The specific
+- * error mask used is irrelevant. Because a successful device
+- * detection clears the ering, this count accumulates only if
+- * there are consecutive failed probes.
+- *
+- * If the count is equal to or higher than ATA_EH_PROBE_TRIALS
+- * in the last ATA_EH_PROBE_TRIAL_INTERVAL, link speed is
+- * forced to 1.5Gbps.
+- *
+- * This is to work around cases where failed link speed
+- * negotiation results in device misdetection leading to
+- * infinite DEVXCHG or PHRDY CHG events.
+- */
+- ata_ering_record(&dev->ering, 0, AC_ERR_OTHER);
+- ata_ering_map(&dev->ering, ata_count_probe_trials_cb, &trials);
+-
+- if (trials > ATA_EH_PROBE_TRIALS)
+- sata_down_spd_limit(link, 1);
+-
+ return 1;
+ }
+
+@@ -3038,11 +2969,7 @@
+ {
+ struct ata_eh_context *ehc = &dev->link->eh_context;
+
+- /* -EAGAIN from EH routine indicates retry without prejudice.
+- * The requester is responsible for ensuring forward progress.
+- */
+- if (err != -EAGAIN)
+- ehc->tries[dev->devno]--;
++ ehc->tries[dev->devno]--;
+
+ switch (err) {
+ case -ENODEV:
+@@ -3052,13 +2979,12 @@
+ /* give it just one more chance */
+ ehc->tries[dev->devno] = min(ehc->tries[dev->devno], 1);
+ case -EIO:
+- if (ehc->tries[dev->devno] == 1) {
++ if (ehc->tries[dev->devno] == 1 && dev->pio_mode > XFER_PIO_0) {
+ /* This is the last chance, better to slow
+ * down than lose it.
+ */
+- sata_down_spd_limit(ata_dev_phys_link(dev), 0);
+- if (dev->pio_mode > XFER_PIO_0)
+- ata_down_xfermask_limit(dev, ATA_DNXFER_PIO);
++ sata_down_spd_limit(ata_dev_phys_link(dev));
++ ata_down_xfermask_limit(dev, ATA_DNXFER_PIO);
+ }
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ata/libata.h linux-2.6.29-rc3.owrt/drivers/ata/libata.h
+--- linux-2.6.29.owrt/drivers/ata/libata.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ata/libata.h 2009-05-10 23:48:28.000000000 +0200
+@@ -79,6 +79,7 @@
+ u64 block, u32 n_block, unsigned int tf_flags,
+ unsigned int tag);
+ extern u64 ata_tf_read_block(struct ata_taskfile *tf, struct ata_device *dev);
++extern void ata_dev_disable(struct ata_device *dev);
+ extern void ata_pio_queue_task(struct ata_port *ap, void *data,
+ unsigned long delay);
+ extern void ata_port_flush_task(struct ata_port *ap);
+@@ -99,7 +100,7 @@
+ extern int ata_dev_revalidate(struct ata_device *dev, unsigned int new_class,
+ unsigned int readid_flags);
+ extern int ata_dev_configure(struct ata_device *dev);
+-extern int sata_down_spd_limit(struct ata_link *link, u32 spd_limit);
++extern int sata_down_spd_limit(struct ata_link *link);
+ extern int ata_down_xfermask_limit(struct ata_device *dev, unsigned int sel);
+ extern void ata_sg_clean(struct ata_queued_cmd *qc);
+ extern void ata_qc_free(struct ata_queued_cmd *qc);
+@@ -159,7 +160,6 @@
+ extern void ata_port_wait_eh(struct ata_port *ap);
+ extern void ata_eh_fastdrain_timerfn(unsigned long arg);
+ extern void ata_qc_schedule_eh(struct ata_queued_cmd *qc);
+-extern void ata_dev_disable(struct ata_device *dev);
+ extern void ata_eh_detach_dev(struct ata_device *dev);
+ extern void ata_eh_about_to_do(struct ata_link *link, struct ata_device *dev,
+ unsigned int action);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ata/libata-pmp.c linux-2.6.29-rc3.owrt/drivers/ata/libata-pmp.c
+--- linux-2.6.29.owrt/drivers/ata/libata-pmp.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ata/libata-pmp.c 2009-05-10 23:48:28.000000000 +0200
+@@ -729,7 +729,7 @@
+ if (tries) {
+ /* consecutive revalidation failures? speed down */
+ if (reval_failed)
+- sata_down_spd_limit(link, 0);
++ sata_down_spd_limit(link);
+ else
+ reval_failed = 1;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ata/libata-scsi.c linux-2.6.29-rc3.owrt/drivers/ata/libata-scsi.c
+--- linux-2.6.29.owrt/drivers/ata/libata-scsi.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ata/libata-scsi.c 2009-05-10 23:48:28.000000000 +0200
+@@ -415,7 +415,6 @@
+
+ /**
+ * ata_get_identity - Handler for HDIO_GET_IDENTITY ioctl
+- * @ap: target port
+ * @sdev: SCSI device to get identify data for
+ * @arg: User buffer area for identify data
+ *
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ata/libata-sff.c linux-2.6.29-rc3.owrt/drivers/ata/libata-sff.c
+--- linux-2.6.29.owrt/drivers/ata/libata-sff.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ata/libata-sff.c 2009-05-10 23:48:28.000000000 +0200
+@@ -773,32 +773,18 @@
+ else
+ iowrite32_rep(data_addr, buf, words);
+
+- /* Transfer trailing bytes, if any */
+ if (unlikely(slop)) {
+- unsigned char pad[4];
+-
+- /* Point buf to the tail of buffer */
+- buf += buflen - slop;
+-
+- /*
+- * Use io*_rep() accessors here as well to avoid pointlessly
+- * swapping bytes to and fro on the big endian machines...
+- */
++ __le32 pad;
+ if (rw == READ) {
+- if (slop < 3)
+- ioread16_rep(data_addr, pad, 1);
+- else
+- ioread32_rep(data_addr, pad, 1);
+- memcpy(buf, pad, slop);
++ pad = cpu_to_le32(ioread32(ap->ioaddr.data_addr));
++ memcpy(buf + buflen - slop, &pad, slop);
+ } else {
+- memcpy(pad, buf, slop);
+- if (slop < 3)
+- iowrite16_rep(data_addr, pad, 1);
+- else
+- iowrite32_rep(data_addr, pad, 1);
++ memcpy(&pad, buf + buflen - slop, slop);
++ iowrite32(le32_to_cpu(pad), ap->ioaddr.data_addr);
+ }
++ words++;
+ }
+- return (buflen + 1) & ~1;
++ return words << 2;
+ }
+ EXPORT_SYMBOL_GPL(ata_sff_data_xfer32);
+
+@@ -2066,7 +2052,6 @@
+ iowrite8(ap->ctl | ATA_SRST, ioaddr->ctl_addr);
+ udelay(20); /* FIXME: flush */
+ iowrite8(ap->ctl, ioaddr->ctl_addr);
+- ap->last_ctl = ap->ctl;
+
+ /* wait the port to become ready */
+ return ata_sff_wait_after_reset(&ap->link, devmask, deadline);
+@@ -2191,10 +2176,8 @@
+ }
+
+ /* set up device control */
+- if (ap->ioaddr.ctl_addr) {
++ if (ap->ioaddr.ctl_addr)
+ iowrite8(ap->ctl, ap->ioaddr.ctl_addr);
+- ap->last_ctl = ap->ctl;
+- }
+ }
+ EXPORT_SYMBOL_GPL(ata_sff_postreset);
+
+@@ -2537,7 +2520,6 @@
+ if (ap->flags & (ATA_FLAG_SATA_RESET | ATA_FLAG_SRST)) {
+ /* set up device control for ATA_FLAG_SATA_RESET */
+ iowrite8(ap->ctl, ioaddr->ctl_addr);
+- ap->last_ctl = ap->ctl;
+ }
+
+ DPRINTK("EXIT\n");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ata/pata_amd.c linux-2.6.29-rc3.owrt/drivers/ata/pata_amd.c
+--- linux-2.6.29.owrt/drivers/ata/pata_amd.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ata/pata_amd.c 2009-05-10 23:48:28.000000000 +0200
+@@ -24,7 +24,7 @@
+ #include <linux/libata.h>
+
+ #define DRV_NAME "pata_amd"
+-#define DRV_VERSION "0.4.1"
++#define DRV_VERSION "0.3.11"
+
+ /**
+ * timing_setup - shared timing computation and load
+@@ -145,13 +145,6 @@
+ return ata_sff_prereset(link, deadline);
+ }
+
+-/**
+- * amd_cable_detect - report cable type
+- * @ap: port
+- *
+- * AMD controller/BIOS setups record the cable type in word 0x42
+- */
+-
+ static int amd_cable_detect(struct ata_port *ap)
+ {
+ static const u32 bitmask[2] = {0x03, 0x0C};
+@@ -165,40 +158,6 @@
+ }
+
+ /**
+- * amd_fifo_setup - set the PIO FIFO for ATA/ATAPI
+- * @ap: ATA interface
+- * @adev: ATA device
+- *
+- * Set the PCI fifo for this device according to the devices present
+- * on the bus at this point in time. We need to turn the post write buffer
+- * off for ATAPI devices as we may need to issue a word sized write to the
+- * device as the final I/O
+- */
+-
+-static void amd_fifo_setup(struct ata_port *ap)
+-{
+- struct ata_device *adev;
+- struct pci_dev *pdev = to_pci_dev(ap->host->dev);
+- static const u8 fifobit[2] = { 0xC0, 0x30};
+- u8 fifo = fifobit[ap->port_no];
+- u8 r;
+-
+-
+- ata_for_each_dev(adev, &ap->link, ENABLED) {
+- if (adev->class == ATA_DEV_ATAPI)
+- fifo = 0;
+- }
+- if (pdev->device == PCI_DEVICE_ID_AMD_VIPER_7411) /* FIFO is broken */
+- fifo = 0;
+-
+- /* On the later chips the read prefetch bits become no-op bits */
+- pci_read_config_byte(pdev, 0x41, &r);
+- r &= ~fifobit[ap->port_no];
+- r |= fifo;
+- pci_write_config_byte(pdev, 0x41, r);
+-}
+-
+-/**
+ * amd33_set_piomode - set initial PIO mode data
+ * @ap: ATA interface
+ * @adev: ATA device
+@@ -208,25 +167,21 @@
+
+ static void amd33_set_piomode(struct ata_port *ap, struct ata_device *adev)
+ {
+- amd_fifo_setup(ap);
+ timing_setup(ap, adev, 0x40, adev->pio_mode, 1);
+ }
+
+ static void amd66_set_piomode(struct ata_port *ap, struct ata_device *adev)
+ {
+- amd_fifo_setup(ap);
+ timing_setup(ap, adev, 0x40, adev->pio_mode, 2);
+ }
+
+ static void amd100_set_piomode(struct ata_port *ap, struct ata_device *adev)
+ {
+- amd_fifo_setup(ap);
+ timing_setup(ap, adev, 0x40, adev->pio_mode, 3);
+ }
+
+ static void amd133_set_piomode(struct ata_port *ap, struct ata_device *adev)
+ {
+- amd_fifo_setup(ap);
+ timing_setup(ap, adev, 0x40, adev->pio_mode, 4);
+ }
+
+@@ -442,16 +397,6 @@
+ .set_dmamode = nv133_set_dmamode,
+ };
+
+-static void amd_clear_fifo(struct pci_dev *pdev)
+-{
+- u8 fifo;
+- /* Disable the FIFO, the FIFO logic will re-enable it as
+- appropriate */
+- pci_read_config_byte(pdev, 0x41, &fifo);
+- fifo &= 0x0F;
+- pci_write_config_byte(pdev, 0x41, fifo);
+-}
+-
+ static int amd_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
+ {
+ static const struct ata_port_info info[10] = {
+@@ -558,8 +503,14 @@
+
+ if (type < 3)
+ ata_pci_bmdma_clear_simplex(pdev);
+- if (pdev->vendor == PCI_VENDOR_ID_AMD)
+- amd_clear_fifo(pdev);
++
++ /* Check for AMD7411 */
++ if (type == 3)
++ /* FIFO is broken */
++ pci_write_config_byte(pdev, 0x41, fifo & 0x0F);
++ else
++ pci_write_config_byte(pdev, 0x41, fifo | 0xF0);
++
+ /* Cable detection on Nvidia chips doesn't work too well,
+ * cache BIOS programmed UDMA mode.
+ */
+@@ -585,11 +536,18 @@
+ return rc;
+
+ if (pdev->vendor == PCI_VENDOR_ID_AMD) {
+- amd_clear_fifo(pdev);
++ u8 fifo;
++ pci_read_config_byte(pdev, 0x41, &fifo);
++ if (pdev->device == PCI_DEVICE_ID_AMD_VIPER_7411)
++ /* FIFO is broken */
++ pci_write_config_byte(pdev, 0x41, fifo & 0x0F);
++ else
++ pci_write_config_byte(pdev, 0x41, fifo | 0xF0);
+ if (pdev->device == PCI_DEVICE_ID_AMD_VIPER_7409 ||
+ pdev->device == PCI_DEVICE_ID_AMD_COBRA_7401)
+ ata_pci_bmdma_clear_simplex(pdev);
+ }
++
+ ata_host_resume(host);
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ata/pata_it821x.c linux-2.6.29-rc3.owrt/drivers/ata/pata_it821x.c
+--- linux-2.6.29.owrt/drivers/ata/pata_it821x.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ata/pata_it821x.c 2009-05-10 23:48:28.000000000 +0200
+@@ -557,9 +557,6 @@
+ id[83] |= 0x4400; /* Word 83 is valid and LBA48 */
+ id[86] |= 0x0400; /* LBA48 on */
+ id[ATA_ID_MAJOR_VER] |= 0x1F;
+- /* Clear the serial number because it's different each boot
+- which breaks validation on resume */
+- memset(&id[ATA_ID_SERNO], 0x20, ATA_ID_SERNO_LEN);
+ }
+ return err_mask;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ata/pata_legacy.c linux-2.6.29-rc3.owrt/drivers/ata/pata_legacy.c
+--- linux-2.6.29.owrt/drivers/ata/pata_legacy.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ata/pata_legacy.c 2009-05-10 23:48:28.000000000 +0200
+@@ -283,10 +283,9 @@
+ static unsigned int pdc_data_xfer_vlb(struct ata_device *dev,
+ unsigned char *buf, unsigned int buflen, int rw)
+ {
+- int slop = buflen & 3;
+- /* 32bit I/O capable *and* we need to write a whole number of dwords */
+- if (ata_id_has_dword_io(dev->id) && (slop == 0 || slop == 3)) {
++ if (ata_id_has_dword_io(dev->id)) {
+ struct ata_port *ap = dev->link->ap;
++ int slop = buflen & 3;
+ unsigned long flags;
+
+ local_irq_save(flags);
+@@ -736,7 +735,7 @@
+ struct ata_port *ap = adev->link->ap;
+ int slop = buflen & 3;
+
+- if (ata_id_has_dword_io(adev->id) && (slop == 0 || slop == 3)) {
++ if (ata_id_has_dword_io(adev->id)) {
+ if (rw == WRITE)
+ iowrite32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
+ else
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ata/pata_qdi.c linux-2.6.29-rc3.owrt/drivers/ata/pata_qdi.c
+--- linux-2.6.29.owrt/drivers/ata/pata_qdi.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ata/pata_qdi.c 2009-05-10 23:48:28.000000000 +0200
+@@ -12,7 +12,7 @@
+ *
+ * Probe code based on drivers/ide/legacy/qd65xx.c
+ * Rewritten from the work of Colten Edwards <pje120@cs.usask.ca> by
+- * Samuel Thibault <samuel.thibault@ens-lyon.org>
++ * Samuel Thibault <samuel.thibault@fnac.net>
+ */
+
+ #include <linux/kernel.h>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ata/pata_via.c linux-2.6.29-rc3.owrt/drivers/ata/pata_via.c
+--- linux-2.6.29.owrt/drivers/ata/pata_via.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ata/pata_via.c 2009-05-10 23:48:28.000000000 +0200
+@@ -110,8 +110,7 @@
+ { "vt8237s", PCI_DEVICE_ID_VIA_8237S, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
+ { "vt8251", PCI_DEVICE_ID_VIA_8251, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
+ { "cx700", PCI_DEVICE_ID_VIA_CX700, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_SATA_PATA },
+- { "vt6410", PCI_DEVICE_ID_VIA_6410, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES },
+- { "vt6415", PCI_DEVICE_ID_VIA_6415, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES },
++ { "vt6410", PCI_DEVICE_ID_VIA_6410, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES},
+ { "vt8237a", PCI_DEVICE_ID_VIA_8237A, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
+ { "vt8237", PCI_DEVICE_ID_VIA_8237, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
+ { "vt8235", PCI_DEVICE_ID_VIA_8235, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
+@@ -594,7 +593,6 @@
+ #endif
+
+ static const struct pci_device_id via[] = {
+- { PCI_VDEVICE(VIA, 0x0415), },
+ { PCI_VDEVICE(VIA, 0x0571), },
+ { PCI_VDEVICE(VIA, 0x0581), },
+ { PCI_VDEVICE(VIA, 0x1571), },
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ata/sata_mv.c linux-2.6.29-rc3.owrt/drivers/ata/sata_mv.c
+--- linux-2.6.29.owrt/drivers/ata/sata_mv.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ata/sata_mv.c 2009-05-10 23:48:28.000000000 +0200
+@@ -663,8 +663,8 @@
+ { PCI_VDEVICE(MARVELL, 0x5081), chip_508x },
+ /* RocketRAID 1720/174x have different identifiers */
+ { PCI_VDEVICE(TTI, 0x1720), chip_6042 },
+- { PCI_VDEVICE(TTI, 0x1740), chip_6042 },
+- { PCI_VDEVICE(TTI, 0x1742), chip_6042 },
++ { PCI_VDEVICE(TTI, 0x1740), chip_508x },
++ { PCI_VDEVICE(TTI, 0x1742), chip_508x },
+
+ { PCI_VDEVICE(MARVELL, 0x6040), chip_604x },
+ { PCI_VDEVICE(MARVELL, 0x6041), chip_604x },
+@@ -2218,13 +2218,12 @@
+ else
+ handled = mv_host_intr(host, pending_irqs);
+ }
++ spin_unlock(&host->lock);
+
+ /* for MSI: unmask; interrupt cause bits will retrigger now */
+ if (using_msi)
+ writel(hpriv->main_irq_mask, hpriv->main_irq_mask_addr);
+
+- spin_unlock(&host->lock);
+-
+ return IRQ_RETVAL(handled);
+ }
+
+@@ -3115,17 +3114,19 @@
+ writelfl(0, hc_mmio + HC_IRQ_CAUSE_OFS);
+ }
+
+- /* Clear any currently outstanding host interrupt conditions */
+- writelfl(0, mmio + hpriv->irq_cause_ofs);
++ if (!IS_SOC(hpriv)) {
++ /* Clear any currently outstanding host interrupt conditions */
++ writelfl(0, mmio + hpriv->irq_cause_ofs);
+
+- /* and unmask interrupt generation for host regs */
+- writelfl(hpriv->unmask_all_irqs, mmio + hpriv->irq_mask_ofs);
++ /* and unmask interrupt generation for host regs */
++ writelfl(hpriv->unmask_all_irqs, mmio + hpriv->irq_mask_ofs);
+
+- /*
+- * enable only global host interrupts for now.
+- * The per-port interrupts get done later as ports are set up.
+- */
+- mv_set_main_irq_mask(host, 0, PCI_ERR);
++ /*
++ * enable only global host interrupts for now.
++ * The per-port interrupts get done later as ports are set up.
++ */
++ mv_set_main_irq_mask(host, 0, PCI_ERR);
++ }
+ done:
+ return rc;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ata/sata_nv.c linux-2.6.29-rc3.owrt/drivers/ata/sata_nv.c
+--- linux-2.6.29.owrt/drivers/ata/sata_nv.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ata/sata_nv.c 2009-05-10 23:48:28.000000000 +0200
+@@ -421,33 +421,26 @@
+ .hardreset = ATA_OP_NULL,
+ };
+
+-/* nf2 is ripe with hardreset related problems.
+- *
+- * kernel bz#3352 reports nf2/3 controllers can't determine device
+- * signature reliably. The following thread reports detection failure
+- * on cold boot with the standard debouncing timing.
++/* OSDL bz3352 reports that nf2/3 controllers can't determine device
++ * signature reliably. Also, the following thread reports detection
++ * failure on cold boot with the standard debouncing timing.
+ *
+ * http://thread.gmane.org/gmane.linux.ide/34098
+ *
+- * And bz#12176 reports that hardreset simply doesn't work on nf2.
+- * Give up on it and just don't do hardreset.
++ * Debounce with hotplug timing and request follow-up SRST.
+ */
+ static struct ata_port_operations nv_nf2_ops = {
+- .inherits = &nv_generic_ops,
++ .inherits = &nv_common_ops,
+ .freeze = nv_nf2_freeze,
+ .thaw = nv_nf2_thaw,
++ .hardreset = nv_noclassify_hardreset,
+ };
+
+-/* For initial probing after boot and hot plugging, hardreset mostly
+- * works fine on CK804 but curiously, reprobing on the initial port by
+- * rescanning or rmmod/insmod fails to acquire the initial D2H Reg FIS
+- * in somewhat undeterministic way. Use noclassify hardreset.
+- */
++/* CK804 finally gets hardreset right */
+ static struct ata_port_operations nv_ck804_ops = {
+ .inherits = &nv_common_ops,
+ .freeze = nv_ck804_freeze,
+ .thaw = nv_ck804_thaw,
+- .hardreset = nv_noclassify_hardreset,
+ .host_stop = nv_ck804_host_stop,
+ };
+
+@@ -2523,7 +2516,7 @@
+ module_init(nv_init);
+ module_exit(nv_exit);
+ module_param_named(adma, adma_enabled, bool, 0444);
+-MODULE_PARM_DESC(adma, "Enable use of ADMA (Default: false)");
++MODULE_PARM_DESC(adma, "Enable use of ADMA (Default: true)");
+ module_param_named(swncq, swncq_enabled, bool, 0444);
+ MODULE_PARM_DESC(swncq, "Enable use of SWNCQ (Default: true)");
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ata/sata_sil.c linux-2.6.29-rc3.owrt/drivers/ata/sata_sil.c
+--- linux-2.6.29.owrt/drivers/ata/sata_sil.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ata/sata_sil.c 2009-05-10 23:48:28.000000000 +0200
+@@ -44,7 +44,6 @@
+ #include <linux/device.h>
+ #include <scsi/scsi_host.h>
+ #include <linux/libata.h>
+-#include <linux/dmi.h>
+
+ #define DRV_NAME "sata_sil"
+ #define DRV_VERSION "2.4"
+@@ -324,7 +323,7 @@
+
+ prd->addr = cpu_to_le32(addr);
+ prd->flags_len = cpu_to_le32(sg_len);
+- VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", si, addr, sg_len);
++ VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", pi, addr, sg_len);
+
+ last_prd = prd;
+ prd++;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/atm/fore200e.c linux-2.6.29-rc3.owrt/drivers/atm/fore200e.c
+--- linux-2.6.29.owrt/drivers/atm/fore200e.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/atm/fore200e.c 2009-05-10 23:48:28.000000000 +0200
+@@ -2519,8 +2519,8 @@
+ return err;
+
+ sprintf(buf, "%s%s", fore200e->bus->proc_name, FW_EXT);
+- if ((err = request_firmware(&firmware, buf, device)) < 0) {
+- printk(FORE200E "problem loading firmware image %s\n", fore200e->bus->model_name);
++ if (request_firmware(&firmware, buf, device) == 1) {
++ printk(FORE200E "missing %s firmware image\n", fore200e->bus->model_name);
+ return err;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/atm/lanai.c linux-2.6.29-rc3.owrt/drivers/atm/lanai.c
+--- linux-2.6.29.owrt/drivers/atm/lanai.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/atm/lanai.c 2009-05-10 23:48:28.000000000 +0200
+@@ -901,7 +901,7 @@
+ clock_l(); udelay(5);
+ for (i = 128; i != 0; i >>= 1) { /* write command out */
+ tmp = (lanai->conf1 & ~CONFIG1_PROMDATA) |
+- ((data & i) ? CONFIG1_PROMDATA : 0);
++ (data & i) ? CONFIG1_PROMDATA : 0;
+ if (lanai->conf1 != tmp) {
+ set_config1(tmp);
+ udelay(5); /* Let new data settle */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/atm/solos-pci.c linux-2.6.29-rc3.owrt/drivers/atm/solos-pci.c
+--- linux-2.6.29.owrt/drivers/atm/solos-pci.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/atm/solos-pci.c 2009-05-10 23:48:28.000000000 +0200
+@@ -685,7 +685,6 @@
+ out_release_regions:
+ pci_release_regions(dev);
+ out:
+- kfree(card);
+ return err;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/base/base.h linux-2.6.29-rc3.owrt/drivers/base/base.h
+--- linux-2.6.29.owrt/drivers/base/base.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/base/base.h 2009-05-10 23:48:28.000000000 +0200
+@@ -88,6 +88,8 @@
+ extern int driver_probe_device(struct device_driver *drv, struct device *dev);
+
+ extern void sysdev_shutdown(void);
++extern int sysdev_suspend(pm_message_t state);
++extern int sysdev_resume(void);
+
+ extern char *make_class_name(const char *name, struct kobject *kobj);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/base/core.c linux-2.6.29-rc3.owrt/drivers/base/core.c
+--- linux-2.6.29.owrt/drivers/base/core.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/base/core.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1280,7 +1280,7 @@
+
+ /**
+ * root_device_unregister - unregister and free a root device
+- * @dev: device going away
++ * @root: device going away.
+ *
+ * This function unregisters and cleans up a device that was created by
+ * root_device_register().
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/base/dd.c linux-2.6.29-rc3.owrt/drivers/base/dd.c
+--- linux-2.6.29.owrt/drivers/base/dd.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/base/dd.c 2009-05-10 23:48:28.000000000 +0200
+@@ -18,11 +18,9 @@
+ */
+
+ #include <linux/device.h>
+-#include <linux/delay.h>
+ #include <linux/module.h>
+ #include <linux/kthread.h>
+ #include <linux/wait.h>
+-#include <linux/async.h>
+
+ #include "base.h"
+ #include "power/power.h"
+@@ -170,21 +168,6 @@
+ }
+
+ /**
+- * wait_for_device_probe
+- * Wait for device probing to be completed.
+- *
+- * Note: this function polls at 100 msec intervals.
+- */
+-int wait_for_device_probe(void)
+-{
+- /* wait for the known devices to complete their probing */
+- while (driver_probe_done() != 0)
+- msleep(100);
+- async_synchronize_full();
+- return 0;
+-}
+-
+-/**
+ * driver_probe_device - attempt to bind device & driver together
+ * @drv: driver to bind a device to
+ * @dev: device to try to bind to the driver
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/base/node.c linux-2.6.29-rc3.owrt/drivers/base/node.c
+--- linux-2.6.29.owrt/drivers/base/node.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/base/node.c 2009-05-10 23:48:28.000000000 +0200
+@@ -303,7 +303,7 @@
+ sect_start_pfn = section_nr_to_pfn(mem_blk->phys_index);
+ sect_end_pfn = sect_start_pfn + PAGES_PER_SECTION - 1;
+ for (pfn = sect_start_pfn; pfn <= sect_end_pfn; pfn++) {
+- int nid;
++ unsigned int nid;
+
+ nid = get_nid_for_pfn(pfn);
+ if (nid < 0)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/base/power/main.c linux-2.6.29-rc3.owrt/drivers/base/power/main.c
+--- linux-2.6.29.owrt/drivers/base/power/main.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/base/power/main.c 2009-05-10 23:48:28.000000000 +0200
+@@ -333,6 +333,7 @@
+ */
+ void device_power_up(pm_message_t state)
+ {
++ sysdev_resume();
+ dpm_power_up(state);
+ }
+ EXPORT_SYMBOL_GPL(device_power_up);
+@@ -576,6 +577,8 @@
+ }
+ dev->power.status = DPM_OFF_IRQ;
+ }
++ if (!error)
++ error = sysdev_suspend(state);
+ if (error)
+ dpm_power_up(resume_event(state));
+ return error;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/base/sys.c linux-2.6.29-rc3.owrt/drivers/base/sys.c
+--- linux-2.6.29.owrt/drivers/base/sys.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/base/sys.c 2009-05-10 23:48:28.000000000 +0200
+@@ -303,6 +303,7 @@
+ * is guaranteed by virtue of the fact that child devices are registered
+ * after their parents.
+ */
++
+ void sysdev_shutdown(void)
+ {
+ struct sysdev_class * cls;
+@@ -362,6 +363,7 @@
+ * This is only called by the device PM core, so we let them handle
+ * all synchronization.
+ */
++
+ int sysdev_suspend(pm_message_t state)
+ {
+ struct sysdev_class * cls;
+@@ -430,7 +432,7 @@
+ }
+ return ret;
+ }
+-EXPORT_SYMBOL_GPL(sysdev_suspend);
++
+
+ /**
+ * sysdev_resume - Bring system devices back to life.
+@@ -440,6 +442,7 @@
+ *
+ * Note: Interrupts are disabled when called.
+ */
++
+ int sysdev_resume(void)
+ {
+ struct sysdev_class * cls;
+@@ -460,7 +463,7 @@
+ }
+ return 0;
+ }
+-EXPORT_SYMBOL_GPL(sysdev_resume);
++
+
+ int __init system_bus_init(void)
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/block/aoe/aoedev.c linux-2.6.29-rc3.owrt/drivers/block/aoe/aoedev.c
+--- linux-2.6.29.owrt/drivers/block/aoe/aoedev.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/block/aoe/aoedev.c 2009-05-10 23:48:28.000000000 +0200
+@@ -173,7 +173,7 @@
+ return;
+ while (atomic_read(&skb_shinfo(skb)->dataref) != 1 && i-- > 0)
+ msleep(Sms);
+- if (i < 0) {
++ if (i <= 0) {
+ printk(KERN_ERR
+ "aoe: %s holds ref: %s\n",
+ skb->dev ? skb->dev->name : "netif",
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/block/aoe/aoe.h linux-2.6.29-rc3.owrt/drivers/block/aoe/aoe.h
+--- linux-2.6.29.owrt/drivers/block/aoe/aoe.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/block/aoe/aoe.h 2009-05-10 23:48:28.000000000 +0200
+@@ -18,7 +18,6 @@
+ enum {
+ AOECMD_ATA,
+ AOECMD_CFG,
+- AOECMD_VEND_MIN = 0xf0,
+
+ AOEFL_RSP = (1<<3),
+ AOEFL_ERR = (1<<2),
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/block/aoe/aoenet.c linux-2.6.29-rc3.owrt/drivers/block/aoe/aoenet.c
+--- linux-2.6.29.owrt/drivers/block/aoe/aoenet.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/block/aoe/aoenet.c 2009-05-10 23:48:28.000000000 +0200
+@@ -142,8 +142,6 @@
+ aoecmd_cfg_rsp(skb);
+ break;
+ default:
+- if (h->cmd >= AOECMD_VEND_MIN)
+- break; /* don't complain about vendor commands */
+ printk(KERN_INFO "aoe: unknown cmd %d\n", h->cmd);
+ }
+ exit:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/block/ataflop.c linux-2.6.29-rc3.owrt/drivers/block/ataflop.c
+--- linux-2.6.29.owrt/drivers/block/ataflop.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/block/ataflop.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1730,7 +1730,7 @@
+
+ timeout = jiffies + 2*HZ+HZ/2;
+ while (time_before(jiffies, timeout))
+- if (!(st_mfp.par_dt_reg & 0x20))
++ if (!(mfp.par_dt_reg & 0x20))
+ break;
+
+ status = FDC_READ( FDCREG_STATUS );
+@@ -1747,7 +1747,7 @@
+ /* dummy seek command to make WP bit accessible */
+ FDC_WRITE( FDCREG_DATA, 0 );
+ FDC_WRITE( FDCREG_CMD, FDCCMD_SEEK );
+- while( st_mfp.par_dt_reg & 0x20 )
++ while( mfp.par_dt_reg & 0x20 )
+ ;
+ status = FDC_READ( FDCREG_STATUS );
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/block/cciss.c linux-2.6.29-rc3.owrt/drivers/block/cciss.c
+--- linux-2.6.29.owrt/drivers/block/cciss.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/block/cciss.c 2009-05-10 23:48:28.000000000 +0200
+@@ -3390,203 +3390,6 @@
+ kfree(p);
+ }
+
+-/* Send a message CDB to the firmware. */
+-static __devinit int cciss_message(struct pci_dev *pdev, unsigned char opcode, unsigned char type)
+-{
+- typedef struct {
+- CommandListHeader_struct CommandHeader;
+- RequestBlock_struct Request;
+- ErrDescriptor_struct ErrorDescriptor;
+- } Command;
+- static const size_t cmd_sz = sizeof(Command) + sizeof(ErrorInfo_struct);
+- Command *cmd;
+- dma_addr_t paddr64;
+- uint32_t paddr32, tag;
+- void __iomem *vaddr;
+- int i, err;
+-
+- vaddr = ioremap_nocache(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0));
+- if (vaddr == NULL)
+- return -ENOMEM;
+-
+- /* The Inbound Post Queue only accepts 32-bit physical addresses for the
+- CCISS commands, so they must be allocated from the lower 4GiB of
+- memory. */
+- err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+- if (err) {
+- iounmap(vaddr);
+- return -ENOMEM;
+- }
+-
+- cmd = pci_alloc_consistent(pdev, cmd_sz, &paddr64);
+- if (cmd == NULL) {
+- iounmap(vaddr);
+- return -ENOMEM;
+- }
+-
+- /* This must fit, because of the 32-bit consistent DMA mask. Also,
+- although there's no guarantee, we assume that the address is at
+- least 4-byte aligned (most likely, it's page-aligned). */
+- paddr32 = paddr64;
+-
+- cmd->CommandHeader.ReplyQueue = 0;
+- cmd->CommandHeader.SGList = 0;
+- cmd->CommandHeader.SGTotal = 0;
+- cmd->CommandHeader.Tag.lower = paddr32;
+- cmd->CommandHeader.Tag.upper = 0;
+- memset(&cmd->CommandHeader.LUN.LunAddrBytes, 0, 8);
+-
+- cmd->Request.CDBLen = 16;
+- cmd->Request.Type.Type = TYPE_MSG;
+- cmd->Request.Type.Attribute = ATTR_HEADOFQUEUE;
+- cmd->Request.Type.Direction = XFER_NONE;
+- cmd->Request.Timeout = 0; /* Don't time out */
+- cmd->Request.CDB[0] = opcode;
+- cmd->Request.CDB[1] = type;
+- memset(&cmd->Request.CDB[2], 0, 14); /* the rest of the CDB is reserved */
+-
+- cmd->ErrorDescriptor.Addr.lower = paddr32 + sizeof(Command);
+- cmd->ErrorDescriptor.Addr.upper = 0;
+- cmd->ErrorDescriptor.Len = sizeof(ErrorInfo_struct);
+-
+- writel(paddr32, vaddr + SA5_REQUEST_PORT_OFFSET);
+-
+- for (i = 0; i < 10; i++) {
+- tag = readl(vaddr + SA5_REPLY_PORT_OFFSET);
+- if ((tag & ~3) == paddr32)
+- break;
+- schedule_timeout_uninterruptible(HZ);
+- }
+-
+- iounmap(vaddr);
+-
+- /* we leak the DMA buffer here ... no choice since the controller could
+- still complete the command. */
+- if (i == 10) {
+- printk(KERN_ERR "cciss: controller message %02x:%02x timed out\n",
+- opcode, type);
+- return -ETIMEDOUT;
+- }
+-
+- pci_free_consistent(pdev, cmd_sz, cmd, paddr64);
+-
+- if (tag & 2) {
+- printk(KERN_ERR "cciss: controller message %02x:%02x failed\n",
+- opcode, type);
+- return -EIO;
+- }
+-
+- printk(KERN_INFO "cciss: controller message %02x:%02x succeeded\n",
+- opcode, type);
+- return 0;
+-}
+-
+-#define cciss_soft_reset_controller(p) cciss_message(p, 1, 0)
+-#define cciss_noop(p) cciss_message(p, 3, 0)
+-
+-static __devinit int cciss_reset_msi(struct pci_dev *pdev)
+-{
+-/* the #defines are stolen from drivers/pci/msi.h. */
+-#define msi_control_reg(base) (base + PCI_MSI_FLAGS)
+-#define PCI_MSIX_FLAGS_ENABLE (1 << 15)
+-
+- int pos;
+- u16 control = 0;
+-
+- pos = pci_find_capability(pdev, PCI_CAP_ID_MSI);
+- if (pos) {
+- pci_read_config_word(pdev, msi_control_reg(pos), &control);
+- if (control & PCI_MSI_FLAGS_ENABLE) {
+- printk(KERN_INFO "cciss: resetting MSI\n");
+- pci_write_config_word(pdev, msi_control_reg(pos), control & ~PCI_MSI_FLAGS_ENABLE);
+- }
+- }
+-
+- pos = pci_find_capability(pdev, PCI_CAP_ID_MSIX);
+- if (pos) {
+- pci_read_config_word(pdev, msi_control_reg(pos), &control);
+- if (control & PCI_MSIX_FLAGS_ENABLE) {
+- printk(KERN_INFO "cciss: resetting MSI-X\n");
+- pci_write_config_word(pdev, msi_control_reg(pos), control & ~PCI_MSIX_FLAGS_ENABLE);
+- }
+- }
+-
+- return 0;
+-}
+-
+-/* This does a hard reset of the controller using PCI power management
+- * states. */
+-static __devinit int cciss_hard_reset_controller(struct pci_dev *pdev)
+-{
+- u16 pmcsr, saved_config_space[32];
+- int i, pos;
+-
+- printk(KERN_INFO "cciss: using PCI PM to reset controller\n");
+-
+- /* This is very nearly the same thing as
+-
+- pci_save_state(pci_dev);
+- pci_set_power_state(pci_dev, PCI_D3hot);
+- pci_set_power_state(pci_dev, PCI_D0);
+- pci_restore_state(pci_dev);
+-
+- but we can't use these nice canned kernel routines on
+- kexec, because they also check the MSI/MSI-X state in PCI
+- configuration space and do the wrong thing when it is
+- set/cleared. Also, the pci_save/restore_state functions
+- violate the ordering requirements for restoring the
+- configuration space from the CCISS document (see the
+- comment below). So we roll our own .... */
+-
+- for (i = 0; i < 32; i++)
+- pci_read_config_word(pdev, 2*i, &saved_config_space[i]);
+-
+- pos = pci_find_capability(pdev, PCI_CAP_ID_PM);
+- if (pos == 0) {
+- printk(KERN_ERR "cciss_reset_controller: PCI PM not supported\n");
+- return -ENODEV;
+- }
+-
+- /* Quoting from the Open CISS Specification: "The Power
+- * Management Control/Status Register (CSR) controls the power
+- * state of the device. The normal operating state is D0,
+- * CSR=00h. The software off state is D3, CSR=03h. To reset
+- * the controller, place the interface device in D3 then to
+- * D0, this causes a secondary PCI reset which will reset the
+- * controller." */
+-
+- /* enter the D3hot power management state */
+- pci_read_config_word(pdev, pos + PCI_PM_CTRL, &pmcsr);
+- pmcsr &= ~PCI_PM_CTRL_STATE_MASK;
+- pmcsr |= PCI_D3hot;
+- pci_write_config_word(pdev, pos + PCI_PM_CTRL, pmcsr);
+-
+- schedule_timeout_uninterruptible(HZ >> 1);
+-
+- /* enter the D0 power management state */
+- pmcsr &= ~PCI_PM_CTRL_STATE_MASK;
+- pmcsr |= PCI_D0;
+- pci_write_config_word(pdev, pos + PCI_PM_CTRL, pmcsr);
+-
+- schedule_timeout_uninterruptible(HZ >> 1);
+-
+- /* Restore the PCI configuration space. The Open CISS
+- * Specification says, "Restore the PCI Configuration
+- * Registers, offsets 00h through 60h. It is important to
+- * restore the command register, 16-bits at offset 04h,
+- * last. Do not restore the configuration status register,
+- * 16-bits at offset 06h." Note that the offset is 2*i. */
+- for (i = 0; i < 32; i++) {
+- if (i == 2 || i == 3)
+- continue;
+- pci_write_config_word(pdev, 2*i, saved_config_space[i]);
+- }
+- wmb();
+- pci_write_config_word(pdev, 4, saved_config_space[2]);
+-
+- return 0;
+-}
+-
+ /*
+ * This is it. Find all the controllers and register them. I really hate
+ * stealing all these major device numbers.
+@@ -3601,26 +3404,6 @@
+ int dac, return_code;
+ InquiryData_struct *inq_buff = NULL;
+
+- if (reset_devices) {
+- /* Reset the controller with a PCI power-cycle */
+- if (cciss_hard_reset_controller(pdev) || cciss_reset_msi(pdev))
+- return -ENODEV;
+-
+- /* Now try to get the controller to respond to a no-op. Some
+- devices (notably the HP Smart Array 5i Controller) need
+- up to 30 seconds to respond. */
+- for (i=0; i<30; i++) {
+- if (cciss_noop(pdev) == 0)
+- break;
+-
+- schedule_timeout_uninterruptible(HZ);
+- }
+- if (i == 30) {
+- printk(KERN_ERR "cciss: controller seems dead\n");
+- return -EBUSY;
+- }
+- }
+-
+ i = alloc_cciss_hba();
+ if (i < 0)
+ return -1;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/block/floppy.c linux-2.6.29-rc3.owrt/drivers/block/floppy.c
+--- linux-2.6.29.owrt/drivers/block/floppy.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/block/floppy.c 2009-05-10 23:48:28.000000000 +0200
+@@ -558,8 +558,6 @@
+ static void recalibrate_floppy(void);
+ static void floppy_shutdown(unsigned long);
+
+-static int floppy_request_regions(int);
+-static void floppy_release_regions(int);
+ static int floppy_grab_irq_and_dma(void);
+ static void floppy_release_irq_and_dma(void);
+
+@@ -4276,7 +4274,8 @@
+ FDCS->rawcmd = 2;
+ if (user_reset_fdc(-1, FD_RESET_ALWAYS, 0)) {
+ /* free ioports reserved by floppy_grab_irq_and_dma() */
+- floppy_release_regions(fdc);
++ release_region(FDCS->address + 2, 4);
++ release_region(FDCS->address + 7, 1);
+ FDCS->address = -1;
+ FDCS->version = FDC_NONE;
+ continue;
+@@ -4285,7 +4284,8 @@
+ FDCS->version = get_fdc_version();
+ if (FDCS->version == FDC_NONE) {
+ /* free ioports reserved by floppy_grab_irq_and_dma() */
+- floppy_release_regions(fdc);
++ release_region(FDCS->address + 2, 4);
++ release_region(FDCS->address + 7, 1);
+ FDCS->address = -1;
+ continue;
+ }
+@@ -4358,47 +4358,6 @@
+
+ static DEFINE_SPINLOCK(floppy_usage_lock);
+
+-static const struct io_region {
+- int offset;
+- int size;
+-} io_regions[] = {
+- { 2, 1 },
+- /* address + 3 is sometimes reserved by pnp bios for motherboard */
+- { 4, 2 },
+- /* address + 6 is reserved, and may be taken by IDE.
+- * Unfortunately, Adaptec doesn't know this :-(, */
+- { 7, 1 },
+-};
+-
+-static void floppy_release_allocated_regions(int fdc, const struct io_region *p)
+-{
+- while (p != io_regions) {
+- p--;
+- release_region(FDCS->address + p->offset, p->size);
+- }
+-}
+-
+-#define ARRAY_END(X) (&((X)[ARRAY_SIZE(X)]))
+-
+-static int floppy_request_regions(int fdc)
+-{
+- const struct io_region *p;
+-
+- for (p = io_regions; p < ARRAY_END(io_regions); p++) {
+- if (!request_region(FDCS->address + p->offset, p->size, "floppy")) {
+- DPRINT("Floppy io-port 0x%04lx in use\n", FDCS->address + p->offset);
+- floppy_release_allocated_regions(fdc, p);
+- return -EBUSY;
+- }
+- }
+- return 0;
+-}
+-
+-static void floppy_release_regions(int fdc)
+-{
+- floppy_release_allocated_regions(fdc, ARRAY_END(io_regions));
+-}
+-
+ static int floppy_grab_irq_and_dma(void)
+ {
+ unsigned long flags;
+@@ -4440,8 +4399,18 @@
+
+ for (fdc = 0; fdc < N_FDC; fdc++) {
+ if (FDCS->address != -1) {
+- if (floppy_request_regions(fdc))
+- goto cleanup;
++ if (!request_region(FDCS->address + 2, 4, "floppy")) {
++ DPRINT("Floppy io-port 0x%04lx in use\n",
++ FDCS->address + 2);
++ goto cleanup1;
++ }
++ if (!request_region(FDCS->address + 7, 1, "floppy DIR")) {
++ DPRINT("Floppy io-port 0x%04lx in use\n",
++ FDCS->address + 7);
++ goto cleanup2;
++ }
++ /* address + 6 is reserved, and may be taken by IDE.
++ * Unfortunately, Adaptec doesn't know this :-(, */
+ }
+ }
+ for (fdc = 0; fdc < N_FDC; fdc++) {
+@@ -4463,11 +4432,15 @@
+ fdc = 0;
+ irqdma_allocated = 1;
+ return 0;
+-cleanup:
++cleanup2:
++ release_region(FDCS->address + 2, 4);
++cleanup1:
+ fd_free_irq();
+ fd_free_dma();
+- while (--fdc >= 0)
+- floppy_release_regions(fdc);
++ while (--fdc >= 0) {
++ release_region(FDCS->address + 2, 4);
++ release_region(FDCS->address + 7, 1);
++ }
+ spin_lock_irqsave(&floppy_usage_lock, flags);
+ usage_count--;
+ spin_unlock_irqrestore(&floppy_usage_lock, flags);
+@@ -4528,8 +4501,10 @@
+ #endif
+ old_fdc = fdc;
+ for (fdc = 0; fdc < N_FDC; fdc++)
+- if (FDCS->address != -1)
+- floppy_release_regions(fdc);
++ if (FDCS->address != -1) {
++ release_region(FDCS->address + 2, 4);
++ release_region(FDCS->address + 7, 1);
++ }
+ fdc = old_fdc;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/block/loop.c linux-2.6.29-rc3.owrt/drivers/block/loop.c
+--- linux-2.6.29.owrt/drivers/block/loop.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/block/loop.c 2009-05-10 23:48:28.000000000 +0200
+@@ -392,7 +392,8 @@
+ struct loop_device *lo = p->lo;
+ struct page *page = buf->page;
+ sector_t IV;
+- int size, ret;
++ size_t size;
++ int ret;
+
+ ret = buf->ops->confirm(pipe, buf);
+ if (unlikely(ret))
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/block/Makefile linux-2.6.29-rc3.owrt/drivers/block/Makefile
+--- linux-2.6.29.owrt/drivers/block/Makefile 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/block/Makefile 2009-05-10 23:48:28.000000000 +0200
+@@ -9,7 +9,6 @@
+ obj-$(CONFIG_BLK_DEV_FD) += floppy.o
+ obj-$(CONFIG_AMIGA_FLOPPY) += amiflop.o
+ obj-$(CONFIG_PS3_DISK) += ps3disk.o
+-obj-$(CONFIG_PS3_VRAM) += ps3vram.o
+ obj-$(CONFIG_ATARI_FLOPPY) += ataflop.o
+ obj-$(CONFIG_AMIGA_Z2RAM) += z2ram.o
+ obj-$(CONFIG_BLK_DEV_RAM) += brd.o
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/block/nbd.c linux-2.6.29-rc3.owrt/drivers/block/nbd.c
+--- linux-2.6.29.owrt/drivers/block/nbd.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/block/nbd.c 2009-05-10 23:48:28.000000000 +0200
+@@ -549,15 +549,6 @@
+
+ BUG_ON(lo->magic != LO_MAGIC);
+
+- if (unlikely(!lo->sock)) {
+- printk(KERN_ERR "%s: Attempted send on closed socket\n",
+- lo->disk->disk_name);
+- req->errors++;
+- nbd_end_request(req);
+- spin_lock_irq(q->queue_lock);
+- continue;
+- }
+-
+ spin_lock_irq(&lo->queue_lock);
+ list_add_tail(&req->queuelist, &lo->waiting_queue);
+ spin_unlock_irq(&lo->queue_lock);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/block/paride/pg.c linux-2.6.29-rc3.owrt/drivers/block/paride/pg.c
+--- linux-2.6.29.owrt/drivers/block/paride/pg.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/block/paride/pg.c 2009-05-10 23:48:28.000000000 +0200
+@@ -422,7 +422,7 @@
+
+ for (k = 0; k < len; k++) {
+ char c = *buf++;
+- if (c != ' ' && c != l)
++ if (c != ' ' || c != l)
+ l = *targ++ = c;
+ }
+ if (l == ' ')
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/block/ps3vram.c linux-2.6.29-rc3.owrt/drivers/block/ps3vram.c
+--- linux-2.6.29.owrt/drivers/block/ps3vram.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/block/ps3vram.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,865 +0,0 @@
+-/*
+- * ps3vram - Use extra PS3 video ram as MTD block device.
+- *
+- * Copyright 2009 Sony Corporation
+- *
+- * Based on the MTD ps3vram driver, which is
+- * Copyright (c) 2007-2008 Jim Paris <jim@jtan.com>
+- * Added support RSX DMA Vivien Chappelier <vivien.chappelier@free.fr>
+- */
+-
+-#include <linux/blkdev.h>
+-#include <linux/delay.h>
+-#include <linux/proc_fs.h>
+-#include <linux/seq_file.h>
+-
+-#include <asm/firmware.h>
+-#include <asm/lv1call.h>
+-#include <asm/ps3.h>
+-
+-
+-#define DEVICE_NAME "ps3vram"
+-
+-
+-#define XDR_BUF_SIZE (2 * 1024 * 1024) /* XDR buffer (must be 1MiB aligned) */
+-#define XDR_IOIF 0x0c000000
+-
+-#define FIFO_BASE XDR_IOIF
+-#define FIFO_SIZE (64 * 1024)
+-
+-#define DMA_PAGE_SIZE (4 * 1024)
+-
+-#define CACHE_PAGE_SIZE (256 * 1024)
+-#define CACHE_PAGE_COUNT ((XDR_BUF_SIZE - FIFO_SIZE) / CACHE_PAGE_SIZE)
+-
+-#define CACHE_OFFSET CACHE_PAGE_SIZE
+-#define FIFO_OFFSET 0
+-
+-#define CTRL_PUT 0x10
+-#define CTRL_GET 0x11
+-#define CTRL_TOP 0x15
+-
+-#define UPLOAD_SUBCH 1
+-#define DOWNLOAD_SUBCH 2
+-
+-#define NV_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN 0x0000030c
+-#define NV_MEMORY_TO_MEMORY_FORMAT_NOTIFY 0x00000104
+-
+-#define L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT 0x601
+-
+-#define CACHE_PAGE_PRESENT 1
+-#define CACHE_PAGE_DIRTY 2
+-
+-struct ps3vram_tag {
+- unsigned int address;
+- unsigned int flags;
+-};
+-
+-struct ps3vram_cache {
+- unsigned int page_count;
+- unsigned int page_size;
+- struct ps3vram_tag *tags;
+- unsigned int hit;
+- unsigned int miss;
+-};
+-
+-struct ps3vram_priv {
+- struct request_queue *queue;
+- struct gendisk *gendisk;
+-
+- u64 size;
+-
+- u64 memory_handle;
+- u64 context_handle;
+- u32 *ctrl;
+- u32 *reports;
+- u8 __iomem *ddr_base;
+- u8 *xdr_buf;
+-
+- u32 *fifo_base;
+- u32 *fifo_ptr;
+-
+- struct ps3vram_cache cache;
+-
+- /* Used to serialize cache/DMA operations */
+- struct mutex lock;
+-};
+-
+-
+-static int ps3vram_major;
+-
+-
+-static struct block_device_operations ps3vram_fops = {
+- .owner = THIS_MODULE,
+-};
+-
+-
+-#define DMA_NOTIFIER_HANDLE_BASE 0x66604200 /* first DMA notifier handle */
+-#define DMA_NOTIFIER_OFFSET_BASE 0x1000 /* first DMA notifier offset */
+-#define DMA_NOTIFIER_SIZE 0x40
+-#define NOTIFIER 7 /* notifier used for completion report */
+-
+-static char *size = "256M";
+-module_param(size, charp, 0);
+-MODULE_PARM_DESC(size, "memory size");
+-
+-static u32 *ps3vram_get_notifier(u32 *reports, int notifier)
+-{
+- return (void *)reports + DMA_NOTIFIER_OFFSET_BASE +
+- DMA_NOTIFIER_SIZE * notifier;
+-}
+-
+-static void ps3vram_notifier_reset(struct ps3_system_bus_device *dev)
+-{
+- struct ps3vram_priv *priv = dev->core.driver_data;
+- u32 *notify = ps3vram_get_notifier(priv->reports, NOTIFIER);
+- int i;
+-
+- for (i = 0; i < 4; i++)
+- notify[i] = 0xffffffff;
+-}
+-
+-static int ps3vram_notifier_wait(struct ps3_system_bus_device *dev,
+- unsigned int timeout_ms)
+-{
+- struct ps3vram_priv *priv = dev->core.driver_data;
+- u32 *notify = ps3vram_get_notifier(priv->reports, NOTIFIER);
+- unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);
+-
+- do {
+- if (!notify[3])
+- return 0;
+- msleep(1);
+- } while (time_before(jiffies, timeout));
+-
+- return -ETIMEDOUT;
+-}
+-
+-static void ps3vram_init_ring(struct ps3_system_bus_device *dev)
+-{
+- struct ps3vram_priv *priv = dev->core.driver_data;
+-
+- priv->ctrl[CTRL_PUT] = FIFO_BASE + FIFO_OFFSET;
+- priv->ctrl[CTRL_GET] = FIFO_BASE + FIFO_OFFSET;
+-}
+-
+-static int ps3vram_wait_ring(struct ps3_system_bus_device *dev,
+- unsigned int timeout_ms)
+-{
+- struct ps3vram_priv *priv = dev->core.driver_data;
+- unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);
+-
+- do {
+- if (priv->ctrl[CTRL_PUT] == priv->ctrl[CTRL_GET])
+- return 0;
+- msleep(1);
+- } while (time_before(jiffies, timeout));
+-
+- dev_warn(&dev->core, "FIFO timeout (%08x/%08x/%08x)\n",
+- priv->ctrl[CTRL_PUT], priv->ctrl[CTRL_GET],
+- priv->ctrl[CTRL_TOP]);
+-
+- return -ETIMEDOUT;
+-}
+-
+-static void ps3vram_out_ring(struct ps3vram_priv *priv, u32 data)
+-{
+- *(priv->fifo_ptr)++ = data;
+-}
+-
+-static void ps3vram_begin_ring(struct ps3vram_priv *priv, u32 chan, u32 tag,
+- u32 size)
+-{
+- ps3vram_out_ring(priv, (size << 18) | (chan << 13) | tag);
+-}
+-
+-static void ps3vram_rewind_ring(struct ps3_system_bus_device *dev)
+-{
+- struct ps3vram_priv *priv = dev->core.driver_data;
+- int status;
+-
+- ps3vram_out_ring(priv, 0x20000000 | (FIFO_BASE + FIFO_OFFSET));
+-
+- priv->ctrl[CTRL_PUT] = FIFO_BASE + FIFO_OFFSET;
+-
+- /* asking the HV for a blit will kick the FIFO */
+- status = lv1_gpu_context_attribute(priv->context_handle,
+- L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT, 0,
+- 0, 0, 0);
+- if (status)
+- dev_err(&dev->core,
+- "%s: lv1_gpu_context_attribute failed %d\n", __func__,
+- status);
+-
+- priv->fifo_ptr = priv->fifo_base;
+-}
+-
+-static void ps3vram_fire_ring(struct ps3_system_bus_device *dev)
+-{
+- struct ps3vram_priv *priv = dev->core.driver_data;
+- int status;
+-
+- mutex_lock(&ps3_gpu_mutex);
+-
+- priv->ctrl[CTRL_PUT] = FIFO_BASE + FIFO_OFFSET +
+- (priv->fifo_ptr - priv->fifo_base) * sizeof(u32);
+-
+- /* asking the HV for a blit will kick the FIFO */
+- status = lv1_gpu_context_attribute(priv->context_handle,
+- L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT, 0,
+- 0, 0, 0);
+- if (status)
+- dev_err(&dev->core,
+- "%s: lv1_gpu_context_attribute failed %d\n", __func__,
+- status);
+-
+- if ((priv->fifo_ptr - priv->fifo_base) * sizeof(u32) >
+- FIFO_SIZE - 1024) {
+- dev_dbg(&dev->core, "FIFO full, rewinding\n");
+- ps3vram_wait_ring(dev, 200);
+- ps3vram_rewind_ring(dev);
+- }
+-
+- mutex_unlock(&ps3_gpu_mutex);
+-}
+-
+-static void ps3vram_bind(struct ps3_system_bus_device *dev)
+-{
+- struct ps3vram_priv *priv = dev->core.driver_data;
+-
+- ps3vram_begin_ring(priv, UPLOAD_SUBCH, 0, 1);
+- ps3vram_out_ring(priv, 0x31337303);
+- ps3vram_begin_ring(priv, UPLOAD_SUBCH, 0x180, 3);
+- ps3vram_out_ring(priv, DMA_NOTIFIER_HANDLE_BASE + NOTIFIER);
+- ps3vram_out_ring(priv, 0xfeed0001); /* DMA system RAM instance */
+- ps3vram_out_ring(priv, 0xfeed0000); /* DMA video RAM instance */
+-
+- ps3vram_begin_ring(priv, DOWNLOAD_SUBCH, 0, 1);
+- ps3vram_out_ring(priv, 0x3137c0de);
+- ps3vram_begin_ring(priv, DOWNLOAD_SUBCH, 0x180, 3);
+- ps3vram_out_ring(priv, DMA_NOTIFIER_HANDLE_BASE + NOTIFIER);
+- ps3vram_out_ring(priv, 0xfeed0000); /* DMA video RAM instance */
+- ps3vram_out_ring(priv, 0xfeed0001); /* DMA system RAM instance */
+-
+- ps3vram_fire_ring(dev);
+-}
+-
+-static int ps3vram_upload(struct ps3_system_bus_device *dev,
+- unsigned int src_offset, unsigned int dst_offset,
+- int len, int count)
+-{
+- struct ps3vram_priv *priv = dev->core.driver_data;
+-
+- ps3vram_begin_ring(priv, UPLOAD_SUBCH,
+- NV_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN, 8);
+- ps3vram_out_ring(priv, XDR_IOIF + src_offset);
+- ps3vram_out_ring(priv, dst_offset);
+- ps3vram_out_ring(priv, len);
+- ps3vram_out_ring(priv, len);
+- ps3vram_out_ring(priv, len);
+- ps3vram_out_ring(priv, count);
+- ps3vram_out_ring(priv, (1 << 8) | 1);
+- ps3vram_out_ring(priv, 0);
+-
+- ps3vram_notifier_reset(dev);
+- ps3vram_begin_ring(priv, UPLOAD_SUBCH,
+- NV_MEMORY_TO_MEMORY_FORMAT_NOTIFY, 1);
+- ps3vram_out_ring(priv, 0);
+- ps3vram_begin_ring(priv, UPLOAD_SUBCH, 0x100, 1);
+- ps3vram_out_ring(priv, 0);
+- ps3vram_fire_ring(dev);
+- if (ps3vram_notifier_wait(dev, 200) < 0) {
+- dev_warn(&dev->core, "%s: Notifier timeout\n", __func__);
+- return -1;
+- }
+-
+- return 0;
+-}
+-
+-static int ps3vram_download(struct ps3_system_bus_device *dev,
+- unsigned int src_offset, unsigned int dst_offset,
+- int len, int count)
+-{
+- struct ps3vram_priv *priv = dev->core.driver_data;
+-
+- ps3vram_begin_ring(priv, DOWNLOAD_SUBCH,
+- NV_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN, 8);
+- ps3vram_out_ring(priv, src_offset);
+- ps3vram_out_ring(priv, XDR_IOIF + dst_offset);
+- ps3vram_out_ring(priv, len);
+- ps3vram_out_ring(priv, len);
+- ps3vram_out_ring(priv, len);
+- ps3vram_out_ring(priv, count);
+- ps3vram_out_ring(priv, (1 << 8) | 1);
+- ps3vram_out_ring(priv, 0);
+-
+- ps3vram_notifier_reset(dev);
+- ps3vram_begin_ring(priv, DOWNLOAD_SUBCH,
+- NV_MEMORY_TO_MEMORY_FORMAT_NOTIFY, 1);
+- ps3vram_out_ring(priv, 0);
+- ps3vram_begin_ring(priv, DOWNLOAD_SUBCH, 0x100, 1);
+- ps3vram_out_ring(priv, 0);
+- ps3vram_fire_ring(dev);
+- if (ps3vram_notifier_wait(dev, 200) < 0) {
+- dev_warn(&dev->core, "%s: Notifier timeout\n", __func__);
+- return -1;
+- }
+-
+- return 0;
+-}
+-
+-static void ps3vram_cache_evict(struct ps3_system_bus_device *dev, int entry)
+-{
+- struct ps3vram_priv *priv = dev->core.driver_data;
+- struct ps3vram_cache *cache = &priv->cache;
+-
+- if (!(cache->tags[entry].flags & CACHE_PAGE_DIRTY))
+- return;
+-
+- dev_dbg(&dev->core, "Flushing %d: 0x%08x\n", entry,
+- cache->tags[entry].address);
+- if (ps3vram_upload(dev, CACHE_OFFSET + entry * cache->page_size,
+- cache->tags[entry].address, DMA_PAGE_SIZE,
+- cache->page_size / DMA_PAGE_SIZE) < 0) {
+- dev_err(&dev->core,
+- "Failed to upload from 0x%x to " "0x%x size 0x%x\n",
+- entry * cache->page_size, cache->tags[entry].address,
+- cache->page_size);
+- }
+- cache->tags[entry].flags &= ~CACHE_PAGE_DIRTY;
+-}
+-
+-static void ps3vram_cache_load(struct ps3_system_bus_device *dev, int entry,
+- unsigned int address)
+-{
+- struct ps3vram_priv *priv = dev->core.driver_data;
+- struct ps3vram_cache *cache = &priv->cache;
+-
+- dev_dbg(&dev->core, "Fetching %d: 0x%08x\n", entry, address);
+- if (ps3vram_download(dev, address,
+- CACHE_OFFSET + entry * cache->page_size,
+- DMA_PAGE_SIZE,
+- cache->page_size / DMA_PAGE_SIZE) < 0) {
+- dev_err(&dev->core,
+- "Failed to download from 0x%x to 0x%x size 0x%x\n",
+- address, entry * cache->page_size, cache->page_size);
+- }
+-
+- cache->tags[entry].address = address;
+- cache->tags[entry].flags |= CACHE_PAGE_PRESENT;
+-}
+-
+-
+-static void ps3vram_cache_flush(struct ps3_system_bus_device *dev)
+-{
+- struct ps3vram_priv *priv = dev->core.driver_data;
+- struct ps3vram_cache *cache = &priv->cache;
+- int i;
+-
+- dev_dbg(&dev->core, "FLUSH\n");
+- for (i = 0; i < cache->page_count; i++) {
+- ps3vram_cache_evict(dev, i);
+- cache->tags[i].flags = 0;
+- }
+-}
+-
+-static unsigned int ps3vram_cache_match(struct ps3_system_bus_device *dev,
+- loff_t address)
+-{
+- struct ps3vram_priv *priv = dev->core.driver_data;
+- struct ps3vram_cache *cache = &priv->cache;
+- unsigned int base;
+- unsigned int offset;
+- int i;
+- static int counter;
+-
+- offset = (unsigned int) (address & (cache->page_size - 1));
+- base = (unsigned int) (address - offset);
+-
+- /* fully associative check */
+- for (i = 0; i < cache->page_count; i++) {
+- if ((cache->tags[i].flags & CACHE_PAGE_PRESENT) &&
+- cache->tags[i].address == base) {
+- cache->hit++;
+- dev_dbg(&dev->core, "Found entry %d: 0x%08x\n", i,
+- cache->tags[i].address);
+- return i;
+- }
+- }
+-
+- /* choose a random entry */
+- i = (jiffies + (counter++)) % cache->page_count;
+- dev_dbg(&dev->core, "Using entry %d\n", i);
+-
+- ps3vram_cache_evict(dev, i);
+- ps3vram_cache_load(dev, i, base);
+-
+- cache->miss++;
+- return i;
+-}
+-
+-static int ps3vram_cache_init(struct ps3_system_bus_device *dev)
+-{
+- struct ps3vram_priv *priv = dev->core.driver_data;
+-
+- priv->cache.page_count = CACHE_PAGE_COUNT;
+- priv->cache.page_size = CACHE_PAGE_SIZE;
+- priv->cache.tags = kzalloc(sizeof(struct ps3vram_tag) *
+- CACHE_PAGE_COUNT, GFP_KERNEL);
+- if (priv->cache.tags == NULL) {
+- dev_err(&dev->core, "Could not allocate cache tags\n");
+- return -ENOMEM;
+- }
+-
+- dev_info(&dev->core, "Created ram cache: %d entries, %d KiB each\n",
+- CACHE_PAGE_COUNT, CACHE_PAGE_SIZE / 1024);
+-
+- return 0;
+-}
+-
+-static void ps3vram_cache_cleanup(struct ps3_system_bus_device *dev)
+-{
+- struct ps3vram_priv *priv = dev->core.driver_data;
+-
+- ps3vram_cache_flush(dev);
+- kfree(priv->cache.tags);
+-}
+-
+-static int ps3vram_read(struct ps3_system_bus_device *dev, loff_t from,
+- size_t len, size_t *retlen, u_char *buf)
+-{
+- struct ps3vram_priv *priv = dev->core.driver_data;
+- unsigned int cached, count;
+-
+- dev_dbg(&dev->core, "%s: from=0x%08x len=0x%zx\n", __func__,
+- (unsigned int)from, len);
+-
+- if (from >= priv->size)
+- return -EIO;
+-
+- if (len > priv->size - from)
+- len = priv->size - from;
+-
+- /* Copy from vram to buf */
+- count = len;
+- while (count) {
+- unsigned int offset, avail;
+- unsigned int entry;
+-
+- offset = (unsigned int) (from & (priv->cache.page_size - 1));
+- avail = priv->cache.page_size - offset;
+-
+- mutex_lock(&priv->lock);
+-
+- entry = ps3vram_cache_match(dev, from);
+- cached = CACHE_OFFSET + entry * priv->cache.page_size + offset;
+-
+- dev_dbg(&dev->core, "%s: from=%08x cached=%08x offset=%08x "
+- "avail=%08x count=%08x\n", __func__,
+- (unsigned int)from, cached, offset, avail, count);
+-
+- if (avail > count)
+- avail = count;
+- memcpy(buf, priv->xdr_buf + cached, avail);
+-
+- mutex_unlock(&priv->lock);
+-
+- buf += avail;
+- count -= avail;
+- from += avail;
+- }
+-
+- *retlen = len;
+- return 0;
+-}
+-
+-static int ps3vram_write(struct ps3_system_bus_device *dev, loff_t to,
+- size_t len, size_t *retlen, const u_char *buf)
+-{
+- struct ps3vram_priv *priv = dev->core.driver_data;
+- unsigned int cached, count;
+-
+- if (to >= priv->size)
+- return -EIO;
+-
+- if (len > priv->size - to)
+- len = priv->size - to;
+-
+- /* Copy from buf to vram */
+- count = len;
+- while (count) {
+- unsigned int offset, avail;
+- unsigned int entry;
+-
+- offset = (unsigned int) (to & (priv->cache.page_size - 1));
+- avail = priv->cache.page_size - offset;
+-
+- mutex_lock(&priv->lock);
+-
+- entry = ps3vram_cache_match(dev, to);
+- cached = CACHE_OFFSET + entry * priv->cache.page_size + offset;
+-
+- dev_dbg(&dev->core, "%s: to=%08x cached=%08x offset=%08x "
+- "avail=%08x count=%08x\n", __func__, (unsigned int)to,
+- cached, offset, avail, count);
+-
+- if (avail > count)
+- avail = count;
+- memcpy(priv->xdr_buf + cached, buf, avail);
+-
+- priv->cache.tags[entry].flags |= CACHE_PAGE_DIRTY;
+-
+- mutex_unlock(&priv->lock);
+-
+- buf += avail;
+- count -= avail;
+- to += avail;
+- }
+-
+- *retlen = len;
+- return 0;
+-}
+-
+-static int ps3vram_proc_show(struct seq_file *m, void *v)
+-{
+- struct ps3vram_priv *priv = m->private;
+-
+- seq_printf(m, "hit:%u\nmiss:%u\n", priv->cache.hit, priv->cache.miss);
+- return 0;
+-}
+-
+-static int ps3vram_proc_open(struct inode *inode, struct file *file)
+-{
+- return single_open(file, ps3vram_proc_show, PDE(inode)->data);
+-}
+-
+-static const struct file_operations ps3vram_proc_fops = {
+- .owner = THIS_MODULE,
+- .open = ps3vram_proc_open,
+- .read = seq_read,
+- .llseek = seq_lseek,
+- .release = single_release,
+-};
+-
+-static void __devinit ps3vram_proc_init(struct ps3_system_bus_device *dev)
+-{
+- struct ps3vram_priv *priv = dev->core.driver_data;
+- struct proc_dir_entry *pde;
+-
+- pde = proc_create(DEVICE_NAME, 0444, NULL, &ps3vram_proc_fops);
+- if (!pde) {
+- dev_warn(&dev->core, "failed to create /proc entry\n");
+- return;
+- }
+-
+- pde->owner = THIS_MODULE;
+- pde->data = priv;
+-}
+-
+-static int ps3vram_make_request(struct request_queue *q, struct bio *bio)
+-{
+- struct ps3_system_bus_device *dev = q->queuedata;
+- int write = bio_data_dir(bio) == WRITE;
+- const char *op = write ? "write" : "read";
+- loff_t offset = bio->bi_sector << 9;
+- int error = 0;
+- struct bio_vec *bvec;
+- unsigned int i;
+-
+- dev_dbg(&dev->core, "%s\n", __func__);
+-
+- bio_for_each_segment(bvec, bio, i) {
+- /* PS3 is ppc64, so we don't handle highmem */
+- char *ptr = page_address(bvec->bv_page) + bvec->bv_offset;
+- size_t len = bvec->bv_len, retlen;
+-
+- dev_dbg(&dev->core, " %s %zu bytes at offset %llu\n", op,
+- len, offset);
+- if (write)
+- error = ps3vram_write(dev, offset, len, &retlen, ptr);
+- else
+- error = ps3vram_read(dev, offset, len, &retlen, ptr);
+-
+- if (error) {
+- dev_err(&dev->core, "%s failed\n", op);
+- goto out;
+- }
+-
+- if (retlen != len) {
+- dev_err(&dev->core, "Short %s\n", op);
+- goto out;
+- }
+-
+- offset += len;
+- }
+-
+- dev_dbg(&dev->core, "%s completed\n", op);
+-
+-out:
+- bio_endio(bio, error);
+- return 0;
+-}
+-
+-static int __devinit ps3vram_probe(struct ps3_system_bus_device *dev)
+-{
+- struct ps3vram_priv *priv;
+- int error, status;
+- struct request_queue *queue;
+- struct gendisk *gendisk;
+- u64 ddr_lpar, ctrl_lpar, info_lpar, reports_lpar, ddr_size,
+- reports_size;
+- char *rest;
+-
+- priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+- if (!priv) {
+- error = -ENOMEM;
+- goto fail;
+- }
+-
+- mutex_init(&priv->lock);
+- dev->core.driver_data = priv;
+-
+- priv = dev->core.driver_data;
+-
+- /* Allocate XDR buffer (1MiB aligned) */
+- priv->xdr_buf = (void *)__get_free_pages(GFP_KERNEL,
+- get_order(XDR_BUF_SIZE));
+- if (priv->xdr_buf == NULL) {
+- dev_err(&dev->core, "Could not allocate XDR buffer\n");
+- error = -ENOMEM;
+- goto fail_free_priv;
+- }
+-
+- /* Put FIFO at begginning of XDR buffer */
+- priv->fifo_base = (u32 *) (priv->xdr_buf + FIFO_OFFSET);
+- priv->fifo_ptr = priv->fifo_base;
+-
+- /* XXX: Need to open GPU, in case ps3fb or snd_ps3 aren't loaded */
+- if (ps3_open_hv_device(dev)) {
+- dev_err(&dev->core, "ps3_open_hv_device failed\n");
+- error = -EAGAIN;
+- goto out_close_gpu;
+- }
+-
+- /* Request memory */
+- status = -1;
+- ddr_size = ALIGN(memparse(size, &rest), 1024*1024);
+- if (!ddr_size) {
+- dev_err(&dev->core, "Specified size is too small\n");
+- error = -EINVAL;
+- goto out_close_gpu;
+- }
+-
+- while (ddr_size > 0) {
+- status = lv1_gpu_memory_allocate(ddr_size, 0, 0, 0, 0,
+- &priv->memory_handle,
+- &ddr_lpar);
+- if (!status)
+- break;
+- ddr_size -= 1024*1024;
+- }
+- if (status) {
+- dev_err(&dev->core, "lv1_gpu_memory_allocate failed %d\n",
+- status);
+- error = -ENOMEM;
+- goto out_free_xdr_buf;
+- }
+-
+- /* Request context */
+- status = lv1_gpu_context_allocate(priv->memory_handle, 0,
+- &priv->context_handle, &ctrl_lpar,
+- &info_lpar, &reports_lpar,
+- &reports_size);
+- if (status) {
+- dev_err(&dev->core, "lv1_gpu_context_allocate failed %d\n",
+- status);
+- error = -ENOMEM;
+- goto out_free_memory;
+- }
+-
+- /* Map XDR buffer to RSX */
+- status = lv1_gpu_context_iomap(priv->context_handle, XDR_IOIF,
+- ps3_mm_phys_to_lpar(__pa(priv->xdr_buf)),
+- XDR_BUF_SIZE, 0);
+- if (status) {
+- dev_err(&dev->core, "lv1_gpu_context_iomap failed %d\n",
+- status);
+- error = -ENOMEM;
+- goto out_free_context;
+- }
+-
+- priv->ddr_base = ioremap_flags(ddr_lpar, ddr_size, _PAGE_NO_CACHE);
+-
+- if (!priv->ddr_base) {
+- dev_err(&dev->core, "ioremap DDR failed\n");
+- error = -ENOMEM;
+- goto out_free_context;
+- }
+-
+- priv->ctrl = ioremap(ctrl_lpar, 64 * 1024);
+- if (!priv->ctrl) {
+- dev_err(&dev->core, "ioremap CTRL failed\n");
+- error = -ENOMEM;
+- goto out_unmap_vram;
+- }
+-
+- priv->reports = ioremap(reports_lpar, reports_size);
+- if (!priv->reports) {
+- dev_err(&dev->core, "ioremap REPORTS failed\n");
+- error = -ENOMEM;
+- goto out_unmap_ctrl;
+- }
+-
+- mutex_lock(&ps3_gpu_mutex);
+- ps3vram_init_ring(dev);
+- mutex_unlock(&ps3_gpu_mutex);
+-
+- priv->size = ddr_size;
+-
+- ps3vram_bind(dev);
+-
+- mutex_lock(&ps3_gpu_mutex);
+- error = ps3vram_wait_ring(dev, 100);
+- mutex_unlock(&ps3_gpu_mutex);
+- if (error < 0) {
+- dev_err(&dev->core, "Failed to initialize channels\n");
+- error = -ETIMEDOUT;
+- goto out_unmap_reports;
+- }
+-
+- ps3vram_cache_init(dev);
+- ps3vram_proc_init(dev);
+-
+- queue = blk_alloc_queue(GFP_KERNEL);
+- if (!queue) {
+- dev_err(&dev->core, "blk_alloc_queue failed\n");
+- error = -ENOMEM;
+- goto out_cache_cleanup;
+- }
+-
+- priv->queue = queue;
+- queue->queuedata = dev;
+- blk_queue_make_request(queue, ps3vram_make_request);
+- blk_queue_max_phys_segments(queue, MAX_PHYS_SEGMENTS);
+- blk_queue_max_hw_segments(queue, MAX_HW_SEGMENTS);
+- blk_queue_max_segment_size(queue, MAX_SEGMENT_SIZE);
+- blk_queue_max_sectors(queue, SAFE_MAX_SECTORS);
+-
+- gendisk = alloc_disk(1);
+- if (!gendisk) {
+- dev_err(&dev->core, "alloc_disk failed\n");
+- error = -ENOMEM;
+- goto fail_cleanup_queue;
+- }
+-
+- priv->gendisk = gendisk;
+- gendisk->major = ps3vram_major;
+- gendisk->first_minor = 0;
+- gendisk->fops = &ps3vram_fops;
+- gendisk->queue = queue;
+- gendisk->private_data = dev;
+- gendisk->driverfs_dev = &dev->core;
+- strlcpy(gendisk->disk_name, DEVICE_NAME, sizeof(gendisk->disk_name));
+- set_capacity(gendisk, priv->size >> 9);
+-
+- dev_info(&dev->core, "%s: Using %lu MiB of GPU memory\n",
+- gendisk->disk_name, get_capacity(gendisk) >> 11);
+-
+- add_disk(gendisk);
+- return 0;
+-
+-fail_cleanup_queue:
+- blk_cleanup_queue(queue);
+-out_cache_cleanup:
+- remove_proc_entry(DEVICE_NAME, NULL);
+- ps3vram_cache_cleanup(dev);
+-out_unmap_reports:
+- iounmap(priv->reports);
+-out_unmap_ctrl:
+- iounmap(priv->ctrl);
+-out_unmap_vram:
+- iounmap(priv->ddr_base);
+-out_free_context:
+- lv1_gpu_context_free(priv->context_handle);
+-out_free_memory:
+- lv1_gpu_memory_free(priv->memory_handle);
+-out_close_gpu:
+- ps3_close_hv_device(dev);
+-out_free_xdr_buf:
+- free_pages((unsigned long) priv->xdr_buf, get_order(XDR_BUF_SIZE));
+-fail_free_priv:
+- kfree(priv);
+- dev->core.driver_data = NULL;
+-fail:
+- return error;
+-}
+-
+-static int ps3vram_remove(struct ps3_system_bus_device *dev)
+-{
+- struct ps3vram_priv *priv = dev->core.driver_data;
+-
+- del_gendisk(priv->gendisk);
+- put_disk(priv->gendisk);
+- blk_cleanup_queue(priv->queue);
+- remove_proc_entry(DEVICE_NAME, NULL);
+- ps3vram_cache_cleanup(dev);
+- iounmap(priv->reports);
+- iounmap(priv->ctrl);
+- iounmap(priv->ddr_base);
+- lv1_gpu_context_free(priv->context_handle);
+- lv1_gpu_memory_free(priv->memory_handle);
+- ps3_close_hv_device(dev);
+- free_pages((unsigned long) priv->xdr_buf, get_order(XDR_BUF_SIZE));
+- kfree(priv);
+- dev->core.driver_data = NULL;
+- return 0;
+-}
+-
+-static struct ps3_system_bus_driver ps3vram = {
+- .match_id = PS3_MATCH_ID_GPU,
+- .match_sub_id = PS3_MATCH_SUB_ID_GPU_RAMDISK,
+- .core.name = DEVICE_NAME,
+- .core.owner = THIS_MODULE,
+- .probe = ps3vram_probe,
+- .remove = ps3vram_remove,
+- .shutdown = ps3vram_remove,
+-};
+-
+-
+-static int __init ps3vram_init(void)
+-{
+- int error;
+-
+- if (!firmware_has_feature(FW_FEATURE_PS3_LV1))
+- return -ENODEV;
+-
+- error = register_blkdev(0, DEVICE_NAME);
+- if (error <= 0) {
+- pr_err("%s: register_blkdev failed %d\n", DEVICE_NAME, error);
+- return error;
+- }
+- ps3vram_major = error;
+-
+- pr_info("%s: registered block device major %d\n", DEVICE_NAME,
+- ps3vram_major);
+-
+- error = ps3_system_bus_driver_register(&ps3vram);
+- if (error)
+- unregister_blkdev(ps3vram_major, DEVICE_NAME);
+-
+- return error;
+-}
+-
+-static void __exit ps3vram_exit(void)
+-{
+- ps3_system_bus_driver_unregister(&ps3vram);
+- unregister_blkdev(ps3vram_major, DEVICE_NAME);
+-}
+-
+-module_init(ps3vram_init);
+-module_exit(ps3vram_exit);
+-
+-MODULE_LICENSE("GPL");
+-MODULE_DESCRIPTION("PS3 Video RAM Storage Driver");
+-MODULE_AUTHOR("Sony Corporation");
+-MODULE_ALIAS(PS3_MODULE_ALIAS_GPU_RAMDISK);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/block/xen-blkfront.c linux-2.6.29-rc3.owrt/drivers/block/xen-blkfront.c
+--- linux-2.6.29.owrt/drivers/block/xen-blkfront.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/block/xen-blkfront.c 2009-05-10 23:48:28.000000000 +0200
+@@ -40,7 +40,6 @@
+ #include <linux/hdreg.h>
+ #include <linux/cdrom.h>
+ #include <linux/module.h>
+-#include <linux/scatterlist.h>
+
+ #include <xen/xenbus.h>
+ #include <xen/grant_table.h>
+@@ -83,7 +82,6 @@
+ enum blkif_state connected;
+ int ring_ref;
+ struct blkif_front_ring ring;
+- struct scatterlist sg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
+ unsigned int evtchn, irq;
+ struct request_queue *rq;
+ struct work_struct work;
+@@ -206,11 +204,12 @@
+ struct blkfront_info *info = req->rq_disk->private_data;
+ unsigned long buffer_mfn;
+ struct blkif_request *ring_req;
++ struct req_iterator iter;
++ struct bio_vec *bvec;
+ unsigned long id;
+ unsigned int fsect, lsect;
+- int i, ref;
++ int ref;
+ grant_ref_t gref_head;
+- struct scatterlist *sg;
+
+ if (unlikely(info->connected != BLKIF_STATE_CONNECTED))
+ return 1;
+@@ -239,13 +238,12 @@
+ if (blk_barrier_rq(req))
+ ring_req->operation = BLKIF_OP_WRITE_BARRIER;
+
+- ring_req->nr_segments = blk_rq_map_sg(req->q, req, info->sg);
+- BUG_ON(ring_req->nr_segments > BLKIF_MAX_SEGMENTS_PER_REQUEST);
+-
+- for_each_sg(info->sg, sg, ring_req->nr_segments, i) {
+- buffer_mfn = pfn_to_mfn(page_to_pfn(sg_page(sg)));
+- fsect = sg->offset >> 9;
+- lsect = fsect + (sg->length >> 9) - 1;
++ ring_req->nr_segments = 0;
++ rq_for_each_segment(bvec, req, iter) {
++ BUG_ON(ring_req->nr_segments == BLKIF_MAX_SEGMENTS_PER_REQUEST);
++ buffer_mfn = pfn_to_mfn(page_to_pfn(bvec->bv_page));
++ fsect = bvec->bv_offset >> 9;
++ lsect = fsect + (bvec->bv_len >> 9) - 1;
+ /* install a grant reference. */
+ ref = gnttab_claim_grant_reference(&gref_head);
+ BUG_ON(ref == -ENOSPC);
+@@ -256,12 +254,16 @@
+ buffer_mfn,
+ rq_data_dir(req) );
+
+- info->shadow[id].frame[i] = mfn_to_pfn(buffer_mfn);
+- ring_req->seg[i] =
++ info->shadow[id].frame[ring_req->nr_segments] =
++ mfn_to_pfn(buffer_mfn);
++
++ ring_req->seg[ring_req->nr_segments] =
+ (struct blkif_request_segment) {
+ .gref = ref,
+ .first_sect = fsect,
+ .last_sect = lsect };
++
++ ring_req->nr_segments++;
+ }
+
+ info->ring.req_prod_pvt++;
+@@ -620,8 +622,6 @@
+ SHARED_RING_INIT(sring);
+ FRONT_RING_INIT(&info->ring, sring, PAGE_SIZE);
+
+- sg_init_table(info->sg, BLKIF_MAX_SEGMENTS_PER_REQUEST);
+-
+ err = xenbus_grant_ring(dev, virt_to_mfn(info->ring.sring));
+ if (err < 0) {
+ free_page((unsigned long)sring);
+@@ -977,8 +977,6 @@
+ break;
+
+ case XenbusStateClosing:
+- if (info->gd == NULL)
+- xenbus_dev_fatal(dev, -ENODEV, "gd is NULL");
+ bd = bdget_disk(info->gd, 0);
+ if (bd == NULL)
+ xenbus_dev_fatal(dev, -ENODEV, "bdget failed");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/block/xsysace.c linux-2.6.29-rc3.owrt/drivers/block/xsysace.c
+--- linux-2.6.29.owrt/drivers/block/xsysace.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/block/xsysace.c 2009-05-10 23:48:28.000000000 +0200
+@@ -489,28 +489,6 @@
+ ace->fsm_state, ace->id_req_count);
+ #endif
+
+- /* Verify that there is actually a CF in the slot. If not, then
+- * bail out back to the idle state and wake up all the waiters */
+- status = ace_in32(ace, ACE_STATUS);
+- if ((status & ACE_STATUS_CFDETECT) == 0) {
+- ace->fsm_state = ACE_FSM_STATE_IDLE;
+- ace->media_change = 1;
+- set_capacity(ace->gd, 0);
+- dev_info(ace->dev, "No CF in slot\n");
+-
+- /* Drop all pending requests */
+- while ((req = elv_next_request(ace->queue)) != NULL)
+- end_request(req, 0);
+-
+- /* Drop back to IDLE state and notify waiters */
+- ace->fsm_state = ACE_FSM_STATE_IDLE;
+- ace->id_result = -EIO;
+- while (ace->id_req_count) {
+- complete(&ace->id_completion);
+- ace->id_req_count--;
+- }
+- }
+-
+ switch (ace->fsm_state) {
+ case ACE_FSM_STATE_IDLE:
+ /* See if there is anything to do */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/char/agp/amd64-agp.c linux-2.6.29-rc3.owrt/drivers/char/agp/amd64-agp.c
+--- linux-2.6.29.owrt/drivers/char/agp/amd64-agp.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/char/agp/amd64-agp.c 2009-05-10 23:48:28.000000000 +0200
+@@ -271,15 +271,15 @@
+ nb_order = (nb_order >> 1) & 7;
+ pci_read_config_dword(nb, AMD64_GARTAPERTUREBASE, &nb_base);
+ nb_aper = nb_base << 25;
++ if (agp_aperture_valid(nb_aper, (32*1024*1024)<<nb_order)) {
++ return 0;
++ }
+
+ /* Northbridge seems to contain crap. Try the AGP bridge. */
+
+ pci_read_config_word(agp, cap+0x14, &apsize);
+- if (apsize == 0xffff) {
+- if (agp_aperture_valid(nb_aper, (32*1024*1024)<<nb_order))
+- return 0;
++ if (apsize == 0xffff)
+ return -1;
+- }
+
+ apsize &= 0xfff;
+ /* Some BIOS use weird encodings not in the AGPv3 table. */
+@@ -301,11 +301,6 @@
+ order = nb_order;
+ }
+
+- if (nb_order >= order) {
+- if (agp_aperture_valid(nb_aper, (32*1024*1024)<<nb_order))
+- return 0;
+- }
+-
+ dev_info(&agp->dev, "aperture from AGP @ %Lx size %u MB\n",
+ aper, 32 << order);
+ if (order < 0 || !agp_aperture_valid(aper, (32*1024*1024)<<order))
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/char/agp/intel-agp.c linux-2.6.29-rc3.owrt/drivers/char/agp/intel-agp.c
+--- linux-2.6.29.owrt/drivers/char/agp/intel-agp.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/char/agp/intel-agp.c 2009-05-10 23:48:28.000000000 +0200
+@@ -633,15 +633,13 @@
+ break;
+ }
+ }
+- if (gtt_entries > 0) {
++ if (gtt_entries > 0)
+ dev_info(&agp_bridge->dev->dev, "detected %dK %s memory\n",
+ gtt_entries / KB(1), local ? "local" : "stolen");
+- gtt_entries /= KB(4);
+- } else {
++ else
+ dev_info(&agp_bridge->dev->dev,
+ "no pre-allocated video memory detected\n");
+- gtt_entries = 0;
+- }
++ gtt_entries /= KB(4);
+
+ intel_private.gtt_entries = gtt_entries;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/char/agp/parisc-agp.c linux-2.6.29-rc3.owrt/drivers/char/agp/parisc-agp.c
+--- linux-2.6.29.owrt/drivers/char/agp/parisc-agp.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/char/agp/parisc-agp.c 2009-05-10 23:48:28.000000000 +0200
+@@ -359,16 +359,9 @@
+ return error;
+ }
+
+-static int
+-find_quicksilver(struct device *dev, void *data)
+-{
+- struct parisc_device **lba = data;
+- struct parisc_device *padev = to_parisc_device(dev);
+-
+- if (IS_QUICKSILVER(padev))
+- *lba = padev;
+-
+- return 0;
++static struct device *next_device(struct klist_iter *i) {
++ struct klist_node * n = klist_next(i);
++ return n ? container_of(n, struct device, knode_parent) : NULL;
+ }
+
+ static int
+@@ -379,6 +372,8 @@
+ int err = -1;
+ struct parisc_device *sba = NULL, *lba = NULL;
+ struct lba_device *lbadev = NULL;
++ struct device *dev = NULL;
++ struct klist_iter i;
+
+ if (!sba_list)
+ goto out;
+@@ -391,7 +386,13 @@
+ }
+
+ /* Now search our Pluto for our precious AGP device... */
+- device_for_each_child(&sba->dev, &lba, find_quicksilver);
++ klist_iter_init(&sba->dev.klist_children, &i);
++ while ((dev = next_device(&i))) {
++ struct parisc_device *padev = to_parisc_device(dev);
++ if (IS_QUICKSILVER(padev))
++ lba = padev;
++ }
++ klist_iter_exit(&i);
+
+ if (!lba) {
+ printk(KERN_INFO DRVPFX "No AGP devices found.\n");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/char/hvcs.c linux-2.6.29-rc3.owrt/drivers/char/hvcs.c
+--- linux-2.6.29.owrt/drivers/char/hvcs.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/char/hvcs.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1139,6 +1139,15 @@
+ hvcsd->tty = tty;
+ tty->driver_data = hvcsd;
+
++ /*
++ * Set this driver to low latency so that we actually have a chance at
++ * catching a throttled TTY after we flip_buffer_push. Otherwise the
++ * flush_to_async may not execute until after the kernel_thread has
++ * yielded and resumed the next flip_buffer_push resulting in data
++ * loss.
++ */
++ tty->low_latency = 1;
++
+ memset(&hvcsd->buffer[0], 0x00, HVCS_BUFF_LEN);
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/char/hvsi.c linux-2.6.29-rc3.owrt/drivers/char/hvsi.c
+--- linux-2.6.29.owrt/drivers/char/hvsi.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/char/hvsi.c 2009-05-10 23:48:28.000000000 +0200
+@@ -810,6 +810,7 @@
+ hp = &hvsi_ports[line];
+
+ tty->driver_data = hp;
++ tty->low_latency = 1; /* avoid throttle/tty_flip_buffer_push race */
+
+ mb();
+ if (hp->state == HVSI_FSP_DIED)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/char/Kconfig linux-2.6.29-rc3.owrt/drivers/char/Kconfig
+--- linux-2.6.29.owrt/drivers/char/Kconfig 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/char/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -761,7 +761,7 @@
+
+ config NVRAM
+ tristate "/dev/nvram support"
+- depends on ATARI || X86 || (ARM && RTC_DRV_CMOS) || GENERIC_NVRAM
++ depends on ATARI || X86 || ARM || GENERIC_NVRAM
+ ---help---
+ If you say Y here and create a character special file /dev/nvram
+ with major number 10 and minor number 144 using mknod ("man mknod"),
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/char/scc.h linux-2.6.29-rc3.owrt/drivers/char/scc.h
+--- linux-2.6.29.owrt/drivers/char/scc.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/char/scc.h 2009-05-10 23:48:28.000000000 +0200
+@@ -387,7 +387,7 @@
+ /* The SCC needs 3.5 PCLK cycles recovery time between to register
+ * accesses. PCLK runs with 8 MHz on an Atari, so this delay is 3.5 *
+ * 125 ns = 437.5 ns. This is too short for udelay().
+- * 10/16/95: A tstb st_mfp.par_dt_reg takes 600ns (sure?) and thus should be
++ * 10/16/95: A tstb mfp.par_dt_reg takes 600ns (sure?) and thus should be
+ * quite right
+ */
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/char/selection.c linux-2.6.29-rc3.owrt/drivers/char/selection.c
+--- linux-2.6.29.owrt/drivers/char/selection.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/char/selection.c 2009-05-10 23:48:28.000000000 +0200
+@@ -268,7 +268,7 @@
+
+ /* Allocate a new buffer before freeing the old one ... */
+ multiplier = use_unicode ? 3 : 1; /* chars can take up to 3 bytes */
+- bp = kmalloc(((sel_end-sel_start)/2+1)*multiplier, GFP_KERNEL);
++ bp = kmalloc((sel_end-sel_start)/2*multiplier+1, GFP_KERNEL);
+ if (!bp) {
+ printk(KERN_WARNING "selection: kmalloc() failed\n");
+ clear_selection();
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/char/sx.c linux-2.6.29-rc3.owrt/drivers/char/sx.c
+--- linux-2.6.29.owrt/drivers/char/sx.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/char/sx.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1713,8 +1713,8 @@
+ for (i = 0; i < SX_NBOARDS; i++)
+ sx_dprintk(SX_DEBUG_FIRMWARE, "<%x> ", boards[i].flags);
+ sx_dprintk(SX_DEBUG_FIRMWARE, "\n");
+- rc = -EIO;
+- goto out;
++ unlock_kernel();
++ return -EIO;
+ }
+
+ switch (cmd) {
+@@ -1746,10 +1746,8 @@
+ sx_dprintk(SX_DEBUG_FIRMWARE, "returning type= %ld\n", rc);
+ break;
+ case SXIO_DO_RAMTEST:
+- if (sx_initialized) { /* Already initialized: better not ramtest the board. */
+- rc = -EPERM;
+- break;
+- }
++ if (sx_initialized) /* Already initialized: better not ramtest the board. */
++ return -EPERM;
+ if (IS_SX_BOARD(board)) {
+ rc = do_memtest(board, 0, 0x7000);
+ if (!rc)
+@@ -1789,7 +1787,7 @@
+ nbytes - i : SX_CHUNK_SIZE)) {
+ kfree(tmp);
+ rc = -EFAULT;
+- goto out;
++ break;
+ }
+ memcpy_toio(board->base2 + offset + i, tmp,
+ (i + SX_CHUNK_SIZE > nbytes) ?
+@@ -1846,7 +1844,6 @@
+ rc = -ENOTTY;
+ break;
+ }
+-out:
+ unlock_kernel();
+ func_exit();
+ return rc;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/char/tpm/tpm_infineon.c linux-2.6.29-rc3.owrt/drivers/char/tpm/tpm_infineon.c
+--- linux-2.6.29.owrt/drivers/char/tpm/tpm_infineon.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/char/tpm/tpm_infineon.c 2009-05-10 23:48:28.000000000 +0200
+@@ -4,7 +4,7 @@
+ * SLD 9630 TT 1.1 and SLB 9635 TT 1.2 Trusted Platform Module
+ * Specifications at www.trustedcomputinggroup.org
+ *
+- * Copyright (C) 2005, Marcel Selhorst <m.selhorst@sirrix.com>
++ * Copyright (C) 2005, Marcel Selhorst <selhorst@crypto.rub.de>
+ * Sirrix AG - security technologies, http://www.sirrix.com and
+ * Applied Data Security Group, Ruhr-University Bochum, Germany
+ * Project-Homepage: http://www.prosec.rub.de/tpm
+@@ -636,7 +636,7 @@
+ module_init(init_inf);
+ module_exit(cleanup_inf);
+
+-MODULE_AUTHOR("Marcel Selhorst <m.selhorst@sirrix.com>");
++MODULE_AUTHOR("Marcel Selhorst <selhorst@crypto.rub.de>");
+ MODULE_DESCRIPTION("Driver for Infineon TPM SLD 9630 TT 1.1 / SLB 9635 TT 1.2");
+ MODULE_VERSION("1.9");
+ MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/cpufreq/cpufreq.c linux-2.6.29-rc3.owrt/drivers/cpufreq/cpufreq.c
+--- linux-2.6.29.owrt/drivers/cpufreq/cpufreq.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/cpufreq/cpufreq.c 2009-05-10 23:48:28.000000000 +0200
+@@ -754,6 +754,11 @@
+ .release = cpufreq_sysfs_release,
+ };
+
++static struct kobj_type ktype_empty_cpufreq = {
++ .sysfs_ops = &sysfs_ops,
++ .release = cpufreq_sysfs_release,
++};
++
+
+ /**
+ * cpufreq_add_dev - add a CPU device
+@@ -887,26 +892,36 @@
+ memcpy(&new_policy, policy, sizeof(struct cpufreq_policy));
+
+ /* prepare interface data */
+- ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq, &sys_dev->kobj,
+- "cpufreq");
+- if (ret)
+- goto err_out_driver_exit;
+-
+- /* set up files for this cpu device */
+- drv_attr = cpufreq_driver->attr;
+- while ((drv_attr) && (*drv_attr)) {
+- ret = sysfs_create_file(&policy->kobj, &((*drv_attr)->attr));
++ if (!cpufreq_driver->hide_interface) {
++ ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq,
++ &sys_dev->kobj, "cpufreq");
+ if (ret)
+ goto err_out_driver_exit;
+- drv_attr++;
+- }
+- if (cpufreq_driver->get) {
+- ret = sysfs_create_file(&policy->kobj, &cpuinfo_cur_freq.attr);
+- if (ret)
+- goto err_out_driver_exit;
+- }
+- if (cpufreq_driver->target) {
+- ret = sysfs_create_file(&policy->kobj, &scaling_cur_freq.attr);
++
++ /* set up files for this cpu device */
++ drv_attr = cpufreq_driver->attr;
++ while ((drv_attr) && (*drv_attr)) {
++ ret = sysfs_create_file(&policy->kobj,
++ &((*drv_attr)->attr));
++ if (ret)
++ goto err_out_driver_exit;
++ drv_attr++;
++ }
++ if (cpufreq_driver->get) {
++ ret = sysfs_create_file(&policy->kobj,
++ &cpuinfo_cur_freq.attr);
++ if (ret)
++ goto err_out_driver_exit;
++ }
++ if (cpufreq_driver->target) {
++ ret = sysfs_create_file(&policy->kobj,
++ &scaling_cur_freq.attr);
++ if (ret)
++ goto err_out_driver_exit;
++ }
++ } else {
++ ret = kobject_init_and_add(&policy->kobj, &ktype_empty_cpufreq,
++ &sys_dev->kobj, "cpufreq");
+ if (ret)
+ goto err_out_driver_exit;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/cpufreq/cpufreq_ondemand.c linux-2.6.29-rc3.owrt/drivers/cpufreq/cpufreq_ondemand.c
+--- linux-2.6.29.owrt/drivers/cpufreq/cpufreq_ondemand.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/cpufreq/cpufreq_ondemand.c 2009-05-10 23:48:28.000000000 +0200
+@@ -117,7 +117,11 @@
+ busy_time = cputime64_add(busy_time, kstat_cpu(cpu).cpustat.irq);
+ busy_time = cputime64_add(busy_time, kstat_cpu(cpu).cpustat.softirq);
+ busy_time = cputime64_add(busy_time, kstat_cpu(cpu).cpustat.steal);
+- busy_time = cputime64_add(busy_time, kstat_cpu(cpu).cpustat.nice);
++
++ if (!dbs_tuners_ins.ignore_nice) {
++ busy_time = cputime64_add(busy_time,
++ kstat_cpu(cpu).cpustat.nice);
++ }
+
+ idle_time = cputime64_sub(cur_wall_time, busy_time);
+ if (wall)
+@@ -133,6 +137,23 @@
+ if (idle_time == -1ULL)
+ return get_cpu_idle_time_jiffy(cpu, wall);
+
++ if (dbs_tuners_ins.ignore_nice) {
++ cputime64_t cur_nice;
++ unsigned long cur_nice_jiffies;
++ struct cpu_dbs_info_s *dbs_info;
++
++ dbs_info = &per_cpu(cpu_dbs_info, cpu);
++ cur_nice = cputime64_sub(kstat_cpu(cpu).cpustat.nice,
++ dbs_info->prev_cpu_nice);
++ /*
++ * Assumption: nice time between sampling periods will be
++ * less than 2^32 jiffies for 32 bit sys
++ */
++ cur_nice_jiffies = (unsigned long)
++ cputime64_to_jiffies64(cur_nice);
++ dbs_info->prev_cpu_nice = kstat_cpu(cpu).cpustat.nice;
++ return idle_time + jiffies_to_usecs(cur_nice_jiffies);
++ }
+ return idle_time;
+ }
+
+@@ -298,9 +319,6 @@
+ dbs_info = &per_cpu(cpu_dbs_info, j);
+ dbs_info->prev_cpu_idle = get_cpu_idle_time(j,
+ &dbs_info->prev_cpu_wall);
+- if (dbs_tuners_ins.ignore_nice)
+- dbs_info->prev_cpu_nice = kstat_cpu(j).cpustat.nice;
+-
+ }
+ mutex_unlock(&dbs_mutex);
+
+@@ -401,23 +419,6 @@
+ j_dbs_info->prev_cpu_idle);
+ j_dbs_info->prev_cpu_idle = cur_idle_time;
+
+- if (dbs_tuners_ins.ignore_nice) {
+- cputime64_t cur_nice;
+- unsigned long cur_nice_jiffies;
+-
+- cur_nice = cputime64_sub(kstat_cpu(j).cpustat.nice,
+- j_dbs_info->prev_cpu_nice);
+- /*
+- * Assumption: nice time between sampling periods will
+- * be less than 2^32 jiffies for 32 bit sys
+- */
+- cur_nice_jiffies = (unsigned long)
+- cputime64_to_jiffies64(cur_nice);
+-
+- j_dbs_info->prev_cpu_nice = kstat_cpu(j).cpustat.nice;
+- idle_time += jiffies_to_usecs(cur_nice_jiffies);
+- }
+-
+ if (unlikely(!wall_time || wall_time < idle_time))
+ continue;
+
+@@ -574,10 +575,6 @@
+
+ j_dbs_info->prev_cpu_idle = get_cpu_idle_time(j,
+ &j_dbs_info->prev_cpu_wall);
+- if (dbs_tuners_ins.ignore_nice) {
+- j_dbs_info->prev_cpu_nice =
+- kstat_cpu(j).cpustat.nice;
+- }
+ }
+ this_dbs_info->cpu = cpu;
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/crypto/ixp4xx_crypto.c linux-2.6.29-rc3.owrt/drivers/crypto/ixp4xx_crypto.c
+--- linux-2.6.29.owrt/drivers/crypto/ixp4xx_crypto.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/crypto/ixp4xx_crypto.c 2009-05-10 23:48:28.000000000 +0200
+@@ -457,12 +457,10 @@
+ if (!ctx_pool) {
+ goto err;
+ }
+- ret = qmgr_request_queue(SEND_QID, NPE_QLEN_TOTAL, 0, 0,
+- "ixp_crypto:out", NULL);
++ ret = qmgr_request_queue(SEND_QID, NPE_QLEN_TOTAL, 0, 0);
+ if (ret)
+ goto err;
+- ret = qmgr_request_queue(RECV_QID, NPE_QLEN, 0, 0,
+- "ixp_crypto:in", NULL);
++ ret = qmgr_request_queue(RECV_QID, NPE_QLEN, 0, 0);
+ if (ret) {
+ qmgr_release_queue(SEND_QID);
+ goto err;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/crypto/padlock-aes.c linux-2.6.29-rc3.owrt/drivers/crypto/padlock-aes.c
+--- linux-2.6.29.owrt/drivers/crypto/padlock-aes.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/crypto/padlock-aes.c 2009-05-10 23:48:28.000000000 +0200
+@@ -489,4 +489,4 @@
+ MODULE_LICENSE("GPL");
+ MODULE_AUTHOR("Michal Ludvig");
+
+-MODULE_ALIAS("aes-all");
++MODULE_ALIAS("aes");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/crypto/padlock-sha.c linux-2.6.29-rc3.owrt/drivers/crypto/padlock-sha.c
+--- linux-2.6.29.owrt/drivers/crypto/padlock-sha.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/crypto/padlock-sha.c 2009-05-10 23:48:28.000000000 +0200
+@@ -304,7 +304,7 @@
+ MODULE_LICENSE("GPL");
+ MODULE_AUTHOR("Michal Ludvig");
+
+-MODULE_ALIAS("sha1-all");
+-MODULE_ALIAS("sha256-all");
++MODULE_ALIAS("sha1");
++MODULE_ALIAS("sha256");
+ MODULE_ALIAS("sha1-padlock");
+ MODULE_ALIAS("sha256-padlock");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/dca/dca-core.c linux-2.6.29-rc3.owrt/drivers/dca/dca-core.c
+--- linux-2.6.29.owrt/drivers/dca/dca-core.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/dca/dca-core.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved.
++ * Copyright(c) 2007 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+@@ -28,7 +28,7 @@
+ #include <linux/device.h>
+ #include <linux/dca.h>
+
+-#define DCA_VERSION "1.8"
++#define DCA_VERSION "1.4"
+
+ MODULE_VERSION(DCA_VERSION);
+ MODULE_LICENSE("GPL");
+@@ -60,17 +60,16 @@
+ {
+ struct dca_provider *dca;
+ int err, slot = -ENODEV;
+- unsigned long flags;
+
+ if (!dev)
+ return -EFAULT;
+
+- spin_lock_irqsave(&dca_lock, flags);
++ spin_lock(&dca_lock);
+
+ /* check if the requester has not been added already */
+ dca = dca_find_provider_by_dev(dev);
+ if (dca) {
+- spin_unlock_irqrestore(&dca_lock, flags);
++ spin_unlock(&dca_lock);
+ return -EEXIST;
+ }
+
+@@ -79,21 +78,19 @@
+ if (slot >= 0)
+ break;
+ }
+-
+- spin_unlock_irqrestore(&dca_lock, flags);
+-
+- if (slot < 0)
++ if (slot < 0) {
++ spin_unlock(&dca_lock);
+ return slot;
++ }
+
+ err = dca_sysfs_add_req(dca, dev, slot);
+ if (err) {
+- spin_lock_irqsave(&dca_lock, flags);
+- if (dca == dca_find_provider_by_dev(dev))
+- dca->ops->remove_requester(dca, dev);
+- spin_unlock_irqrestore(&dca_lock, flags);
++ dca->ops->remove_requester(dca, dev);
++ spin_unlock(&dca_lock);
+ return err;
+ }
+
++ spin_unlock(&dca_lock);
+ return 0;
+ }
+ EXPORT_SYMBOL_GPL(dca_add_requester);
+@@ -106,25 +103,25 @@
+ {
+ struct dca_provider *dca;
+ int slot;
+- unsigned long flags;
+
+ if (!dev)
+ return -EFAULT;
+
+- spin_lock_irqsave(&dca_lock, flags);
++ spin_lock(&dca_lock);
+ dca = dca_find_provider_by_dev(dev);
+ if (!dca) {
+- spin_unlock_irqrestore(&dca_lock, flags);
++ spin_unlock(&dca_lock);
+ return -ENODEV;
+ }
+ slot = dca->ops->remove_requester(dca, dev);
+- spin_unlock_irqrestore(&dca_lock, flags);
+-
+- if (slot < 0)
++ if (slot < 0) {
++ spin_unlock(&dca_lock);
+ return slot;
++ }
+
+ dca_sysfs_remove_req(dca, slot);
+
++ spin_unlock(&dca_lock);
+ return 0;
+ }
+ EXPORT_SYMBOL_GPL(dca_remove_requester);
+@@ -138,18 +135,17 @@
+ {
+ struct dca_provider *dca;
+ u8 tag;
+- unsigned long flags;
+
+- spin_lock_irqsave(&dca_lock, flags);
++ spin_lock(&dca_lock);
+
+ dca = dca_find_provider_by_dev(dev);
+ if (!dca) {
+- spin_unlock_irqrestore(&dca_lock, flags);
++ spin_unlock(&dca_lock);
+ return -ENODEV;
+ }
+ tag = dca->ops->get_tag(dca, dev, cpu);
+
+- spin_unlock_irqrestore(&dca_lock, flags);
++ spin_unlock(&dca_lock);
+ return tag;
+ }
+
+@@ -221,16 +217,11 @@
+ int register_dca_provider(struct dca_provider *dca, struct device *dev)
+ {
+ int err;
+- unsigned long flags;
+
+ err = dca_sysfs_add_provider(dca, dev);
+ if (err)
+ return err;
+-
+- spin_lock_irqsave(&dca_lock, flags);
+ list_add(&dca->node, &dca_providers);
+- spin_unlock_irqrestore(&dca_lock, flags);
+-
+ blocking_notifier_call_chain(&dca_provider_chain,
+ DCA_PROVIDER_ADD, NULL);
+ return 0;
+@@ -243,15 +234,9 @@
+ */
+ void unregister_dca_provider(struct dca_provider *dca)
+ {
+- unsigned long flags;
+-
+ blocking_notifier_call_chain(&dca_provider_chain,
+ DCA_PROVIDER_REMOVE, NULL);
+-
+- spin_lock_irqsave(&dca_lock, flags);
+ list_del(&dca->node);
+- spin_unlock_irqrestore(&dca_lock, flags);
+-
+ dca_sysfs_remove_provider(dca);
+ }
+ EXPORT_SYMBOL_GPL(unregister_dca_provider);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/dca/dca-sysfs.c linux-2.6.29-rc3.owrt/drivers/dca/dca-sysfs.c
+--- linux-2.6.29.owrt/drivers/dca/dca-sysfs.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/dca/dca-sysfs.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1,24 +1,3 @@
+-/*
+- * Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved.
+- *
+- * This program is free software; you can redistribute it and/or modify it
+- * under the terms of the GNU General Public License as published by the Free
+- * Software Foundation; either version 2 of the License, or (at your option)
+- * any later version.
+- *
+- * This program is distributed in the hope that it will be useful, but WITHOUT
+- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+- * more details.
+- *
+- * You should have received a copy of the GNU General Public License along with
+- * this program; if not, write to the Free Software Foundation, Inc., 59
+- * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+- *
+- * The full GNU General Public License is included in this distribution in the
+- * file called COPYING.
+- */
+-
+ #include <linux/kernel.h>
+ #include <linux/spinlock.h>
+ #include <linux/device.h>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/dma/dmaengine.c linux-2.6.29-rc3.owrt/drivers/dma/dmaengine.c
+--- linux-2.6.29.owrt/drivers/dma/dmaengine.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/dma/dmaengine.c 2009-05-10 23:48:28.000000000 +0200
+@@ -518,7 +518,6 @@
+ dma_chan_name(chan), err);
+ else
+ break;
+- chan->private = NULL;
+ chan = NULL;
+ }
+ }
+@@ -537,7 +536,6 @@
+ WARN_ONCE(chan->client_count != 1,
+ "chan reference count %d != 1\n", chan->client_count);
+ dma_chan_put(chan);
+- chan->private = NULL;
+ mutex_unlock(&dma_list_mutex);
+ }
+ EXPORT_SYMBOL_GPL(dma_release_channel);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/dma/dmatest.c linux-2.6.29-rc3.owrt/drivers/dma/dmatest.c
+--- linux-2.6.29.owrt/drivers/dma/dmatest.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/dma/dmatest.c 2009-05-10 23:48:28.000000000 +0200
+@@ -430,15 +430,13 @@
+ static void __exit dmatest_exit(void)
+ {
+ struct dmatest_chan *dtc, *_dtc;
+- struct dma_chan *chan;
+
+ list_for_each_entry_safe(dtc, _dtc, &dmatest_channels, node) {
+ list_del(&dtc->node);
+- chan = dtc->chan;
+ dmatest_cleanup_channel(dtc);
+ pr_debug("dmatest: dropped channel %s\n",
+- dma_chan_name(chan));
+- dma_release_channel(chan);
++ dma_chan_name(dtc->chan));
++ dma_release_channel(dtc->chan);
+ }
+ }
+ module_exit(dmatest_exit);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/dma/dw_dmac.c linux-2.6.29-rc3.owrt/drivers/dma/dw_dmac.c
+--- linux-2.6.29.owrt/drivers/dma/dw_dmac.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/dma/dw_dmac.c 2009-05-10 23:48:28.000000000 +0200
+@@ -560,7 +560,7 @@
+ unsigned long flags)
+ {
+ struct dw_dma_chan *dwc = to_dw_dma_chan(chan);
+- struct dw_dma_slave *dws = chan->private;
++ struct dw_dma_slave *dws = dwc->dws;
+ struct dw_desc *prev;
+ struct dw_desc *first;
+ u32 ctllo;
+@@ -790,7 +790,7 @@
+ cfghi = DWC_CFGH_FIFO_MODE;
+ cfglo = 0;
+
+- dws = chan->private;
++ dws = dwc->dws;
+ if (dws) {
+ /*
+ * We need controller-specific data to set up slave
+@@ -866,6 +866,7 @@
+ spin_lock_bh(&dwc->lock);
+ list_splice_init(&dwc->free_list, &list);
+ dwc->descs_allocated = 0;
++ dwc->dws = NULL;
+
+ /* Disable interrupts */
+ channel_clear_bit(dw, MASK.XFER, dwc->mask);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/dma/dw_dmac_regs.h linux-2.6.29-rc3.owrt/drivers/dma/dw_dmac_regs.h
+--- linux-2.6.29.owrt/drivers/dma/dw_dmac_regs.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/dma/dw_dmac_regs.h 2009-05-10 23:48:28.000000000 +0200
+@@ -139,6 +139,8 @@
+ struct list_head queue;
+ struct list_head free_list;
+
++ struct dw_dma_slave *dws;
++
+ unsigned int descs_allocated;
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/dma/fsldma.c linux-2.6.29-rc3.owrt/drivers/dma/fsldma.c
+--- linux-2.6.29.owrt/drivers/dma/fsldma.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/dma/fsldma.c 2009-05-10 23:48:28.000000000 +0200
+@@ -158,8 +158,7 @@
+
+ static void dma_halt(struct fsl_dma_chan *fsl_chan)
+ {
+- int i;
+-
++ int i = 0;
+ DMA_OUT(fsl_chan, &fsl_chan->reg_base->mr,
+ DMA_IN(fsl_chan, &fsl_chan->reg_base->mr, 32) | FSL_DMA_MR_CA,
+ 32);
+@@ -167,11 +166,8 @@
+ DMA_IN(fsl_chan, &fsl_chan->reg_base->mr, 32) & ~(FSL_DMA_MR_CS
+ | FSL_DMA_MR_EMS_EN | FSL_DMA_MR_CA), 32);
+
+- for (i = 0; i < 100; i++) {
+- if (dma_is_idle(fsl_chan))
+- break;
++ while (!dma_is_idle(fsl_chan) && (i++ < 100))
+ udelay(10);
+- }
+ if (i >= 100 && !dma_is_idle(fsl_chan))
+ dev_err(fsl_chan->dev, "DMA halt timeout!\n");
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/dma/ioat.c linux-2.6.29-rc3.owrt/drivers/dma/ioat.c
+--- linux-2.6.29.owrt/drivers/dma/ioat.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/dma/ioat.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1,6 +1,6 @@
+ /*
+ * Intel I/OAT DMA Linux driver
+- * Copyright(c) 2007 - 2009 Intel Corporation.
++ * Copyright(c) 2007 Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/dma/ioat_dca.c linux-2.6.29-rc3.owrt/drivers/dma/ioat_dca.c
+--- linux-2.6.29.owrt/drivers/dma/ioat_dca.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/dma/ioat_dca.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1,6 +1,6 @@
+ /*
+ * Intel I/OAT DMA Linux driver
+- * Copyright(c) 2007 - 2009 Intel Corporation.
++ * Copyright(c) 2007 Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+@@ -49,23 +49,6 @@
+
+ #define DCA_TAG_MAP_MASK 0xDF
+
+-/* expected tag map bytes for I/OAT ver.2 */
+-#define DCA2_TAG_MAP_BYTE0 0x80
+-#define DCA2_TAG_MAP_BYTE1 0x0
+-#define DCA2_TAG_MAP_BYTE2 0x81
+-#define DCA2_TAG_MAP_BYTE3 0x82
+-#define DCA2_TAG_MAP_BYTE4 0x82
+-
+-/* verify if tag map matches expected values */
+-static inline int dca2_tag_map_valid(u8 *tag_map)
+-{
+- return ((tag_map[0] == DCA2_TAG_MAP_BYTE0) &&
+- (tag_map[1] == DCA2_TAG_MAP_BYTE1) &&
+- (tag_map[2] == DCA2_TAG_MAP_BYTE2) &&
+- (tag_map[3] == DCA2_TAG_MAP_BYTE3) &&
+- (tag_map[4] == DCA2_TAG_MAP_BYTE4));
+-}
+-
+ /*
+ * "Legacy" DCA systems do not implement the DCA register set in the
+ * I/OAT device. Software needs direct support for their tag mappings.
+@@ -469,13 +452,6 @@
+ ioatdca->tag_map[i] = 0;
+ }
+
+- if (!dca2_tag_map_valid(ioatdca->tag_map)) {
+- dev_err(&pdev->dev, "APICID_TAG_MAP set incorrectly by BIOS, "
+- "disabling DCA\n");
+- free_dca_provider(dca);
+- return NULL;
+- }
+-
+ err = register_dca_provider(dca, &pdev->dev);
+ if (err) {
+ free_dca_provider(dca);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/dma/ioat_dma.c linux-2.6.29-rc3.owrt/drivers/dma/ioat_dma.c
+--- linux-2.6.29.owrt/drivers/dma/ioat_dma.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/dma/ioat_dma.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1,6 +1,6 @@
+ /*
+ * Intel I/OAT DMA Linux driver
+- * Copyright(c) 2004 - 2009 Intel Corporation.
++ * Copyright(c) 2004 - 2007 Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+@@ -189,13 +189,11 @@
+ ioat_chan->xfercap = xfercap;
+ ioat_chan->desccount = 0;
+ INIT_DELAYED_WORK(&ioat_chan->work, ioat_dma_chan_reset_part2);
+- if (ioat_chan->device->version == IOAT_VER_2_0)
+- writel(IOAT_DCACTRL_CMPL_WRITE_ENABLE |
+- IOAT_DMA_DCA_ANY_CPU,
+- ioat_chan->reg_base + IOAT_DCACTRL_OFFSET);
+- else if (ioat_chan->device->version == IOAT_VER_3_0)
+- writel(IOAT_DMA_DCA_ANY_CPU,
+- ioat_chan->reg_base + IOAT_DCACTRL_OFFSET);
++ if (ioat_chan->device->version != IOAT_VER_1_2) {
++ writel(IOAT_DCACTRL_CMPL_WRITE_ENABLE
++ | IOAT_DMA_DCA_ANY_CPU,
++ ioat_chan->reg_base + IOAT_DCACTRL_OFFSET);
++ }
+ spin_lock_init(&ioat_chan->cleanup_lock);
+ spin_lock_init(&ioat_chan->desc_lock);
+ INIT_LIST_HEAD(&ioat_chan->free_desc);
+@@ -1171,8 +1169,9 @@
+ * up if the client is done with the descriptor
+ */
+ if (async_tx_test_ack(&desc->async_tx)) {
+- list_move_tail(&desc->node,
+- &ioat_chan->free_desc);
++ list_del(&desc->node);
++ list_add_tail(&desc->node,
++ &ioat_chan->free_desc);
+ } else
+ desc->async_tx.cookie = 0;
+ } else {
+@@ -1363,7 +1362,6 @@
+ dma_cookie_t cookie;
+ int err = 0;
+ struct completion cmp;
+- unsigned long tmo;
+
+ src = kzalloc(sizeof(u8) * IOAT_TEST_SIZE, GFP_KERNEL);
+ if (!src)
+@@ -1415,10 +1413,9 @@
+ }
+ device->common.device_issue_pending(dma_chan);
+
+- tmo = wait_for_completion_timeout(&cmp, msecs_to_jiffies(3000));
++ wait_for_completion_timeout(&cmp, msecs_to_jiffies(3000));
+
+- if (tmo == 0 ||
+- device->common.device_is_tx_complete(dma_chan, cookie, NULL, NULL)
++ if (device->common.device_is_tx_complete(dma_chan, cookie, NULL, NULL)
+ != DMA_SUCCESS) {
+ dev_err(&device->pdev->dev,
+ "Self-test copy timed out, disabling\n");
+@@ -1660,13 +1657,6 @@
+ " %d channels, device version 0x%02x, driver version %s\n",
+ device->common.chancnt, device->version, IOAT_DMA_VERSION);
+
+- if (!device->common.chancnt) {
+- dev_err(&device->pdev->dev,
+- "Intel(R) I/OAT DMA Engine problem found: "
+- "zero channels detected\n");
+- goto err_setup_interrupts;
+- }
+-
+ err = ioat_dma_setup_interrupts(device);
+ if (err)
+ goto err_setup_interrupts;
+@@ -1706,9 +1696,6 @@
+ struct dma_chan *chan, *_chan;
+ struct ioat_dma_chan *ioat_chan;
+
+- if (device->version != IOAT_VER_3_0)
+- cancel_delayed_work(&device->work);
+-
+ ioat_dma_remove_interrupts(device);
+
+ dma_async_device_unregister(&device->common);
+@@ -1720,6 +1707,10 @@
+ pci_release_regions(device->pdev);
+ pci_disable_device(device->pdev);
+
++ if (device->version != IOAT_VER_3_0) {
++ cancel_delayed_work(&device->work);
++ }
++
+ list_for_each_entry_safe(chan, _chan,
+ &device->common.channels, device_node) {
+ ioat_chan = to_ioat_chan(chan);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/dma/ioatdma.h linux-2.6.29-rc3.owrt/drivers/dma/ioatdma.h
+--- linux-2.6.29.owrt/drivers/dma/ioatdma.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/dma/ioatdma.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright(c) 2004 - 2009 Intel Corporation. All rights reserved.
++ * Copyright(c) 2004 - 2007 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+@@ -29,7 +29,7 @@
+ #include <linux/pci_ids.h>
+ #include <net/tcp.h>
+
+-#define IOAT_DMA_VERSION "3.64"
++#define IOAT_DMA_VERSION "3.30"
+
+ enum ioat_interrupt {
+ none = 0,
+@@ -135,14 +135,12 @@
+ #ifdef CONFIG_NET_DMA
+ switch (dev->version) {
+ case IOAT_VER_1_2:
++ case IOAT_VER_3_0:
+ sysctl_tcp_dma_copybreak = 4096;
+ break;
+ case IOAT_VER_2_0:
+ sysctl_tcp_dma_copybreak = 2048;
+ break;
+- case IOAT_VER_3_0:
+- sysctl_tcp_dma_copybreak = 262144;
+- break;
+ }
+ #endif
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/dma/ioatdma_hw.h linux-2.6.29-rc3.owrt/drivers/dma/ioatdma_hw.h
+--- linux-2.6.29.owrt/drivers/dma/ioatdma_hw.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/dma/ioatdma_hw.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright(c) 2004 - 2009 Intel Corporation. All rights reserved.
++ * Copyright(c) 2004 - 2007 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/dma/ioatdma_registers.h linux-2.6.29-rc3.owrt/drivers/dma/ioatdma_registers.h
+--- linux-2.6.29.owrt/drivers/dma/ioatdma_registers.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/dma/ioatdma_registers.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright(c) 2004 - 2009 Intel Corporation. All rights reserved.
++ * Copyright(c) 2004 - 2007 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/dma/iop-adma.c linux-2.6.29-rc3.owrt/drivers/dma/iop-adma.c
+--- linux-2.6.29.owrt/drivers/dma/iop-adma.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/dma/iop-adma.c 2009-05-10 23:48:28.000000000 +0200
+@@ -928,19 +928,19 @@
+
+ for (src_idx = 0; src_idx < IOP_ADMA_NUM_SRC_TEST; src_idx++) {
+ xor_srcs[src_idx] = alloc_page(GFP_KERNEL);
+- if (!xor_srcs[src_idx]) {
+- while (src_idx--)
++ if (!xor_srcs[src_idx])
++ while (src_idx--) {
+ __free_page(xor_srcs[src_idx]);
+- return -ENOMEM;
+- }
++ return -ENOMEM;
++ }
+ }
+
+ dest = alloc_page(GFP_KERNEL);
+- if (!dest) {
+- while (src_idx--)
++ if (!dest)
++ while (src_idx--) {
+ __free_page(xor_srcs[src_idx]);
+- return -ENOMEM;
+- }
++ return -ENOMEM;
++ }
+
+ /* Fill in src buffers */
+ for (src_idx = 0; src_idx < IOP_ADMA_NUM_SRC_TEST; src_idx++) {
+@@ -1401,7 +1401,7 @@
+
+ static struct platform_driver iop_adma_driver = {
+ .probe = iop_adma_probe,
+- .remove = __devexit_p(iop_adma_remove),
++ .remove = iop_adma_remove,
+ .driver = {
+ .owner = THIS_MODULE,
+ .name = "iop-adma",
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/dma/ipu/ipu_idmac.c linux-2.6.29-rc3.owrt/drivers/dma/ipu/ipu_idmac.c
+--- linux-2.6.29.owrt/drivers/dma/ipu/ipu_idmac.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/dma/ipu/ipu_idmac.c 2009-05-10 23:48:28.000000000 +0200
+@@ -729,7 +729,7 @@
+
+ ichan->status = IPU_CHANNEL_READY;
+
+- spin_unlock_irqrestore(&ipu->lock, flags);
++ spin_unlock_irqrestore(ipu->lock, flags);
+
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/dma/mv_xor.c linux-2.6.29-rc3.owrt/drivers/dma/mv_xor.c
+--- linux-2.6.29.owrt/drivers/dma/mv_xor.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/dma/mv_xor.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1019,19 +1019,19 @@
+
+ for (src_idx = 0; src_idx < MV_XOR_NUM_SRC_TEST; src_idx++) {
+ xor_srcs[src_idx] = alloc_page(GFP_KERNEL);
+- if (!xor_srcs[src_idx]) {
+- while (src_idx--)
++ if (!xor_srcs[src_idx])
++ while (src_idx--) {
+ __free_page(xor_srcs[src_idx]);
+- return -ENOMEM;
+- }
++ return -ENOMEM;
++ }
+ }
+
+ dest = alloc_page(GFP_KERNEL);
+- if (!dest) {
+- while (src_idx--)
++ if (!dest)
++ while (src_idx--) {
+ __free_page(xor_srcs[src_idx]);
+- return -ENOMEM;
+- }
++ return -ENOMEM;
++ }
+
+ /* Fill in src buffers */
+ for (src_idx = 0; src_idx < MV_XOR_NUM_SRC_TEST; src_idx++) {
+@@ -1287,7 +1287,7 @@
+
+ static struct platform_driver mv_xor_driver = {
+ .probe = mv_xor_probe,
+- .remove = __devexit_p(mv_xor_remove),
++ .remove = mv_xor_remove,
+ .driver = {
+ .owner = THIS_MODULE,
+ .name = MV_XOR_NAME,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/firewire/fw-card.c linux-2.6.29-rc3.owrt/drivers/firewire/fw-card.c
+--- linux-2.6.29.owrt/drivers/firewire/fw-card.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/firewire/fw-card.c 2009-05-10 23:48:28.000000000 +0200
+@@ -232,7 +232,7 @@
+ root_id = root_node->node_id;
+ grace = time_after(jiffies, card->reset_jiffies + DIV_ROUND_UP(HZ, 10));
+
+- if (is_next_generation(generation, card->bm_generation) ||
++ if (card->bm_generation + 1 == generation ||
+ (card->bm_generation != generation && grace)) {
+ /*
+ * This first step is to figure out who is IRM and
+@@ -412,7 +412,6 @@
+ {
+ u32 *config_rom;
+ size_t length;
+- int err;
+
+ card->max_receive = max_receive;
+ card->link_speed = link_speed;
+@@ -423,13 +422,7 @@
+ list_add_tail(&card->link, &card_list);
+ mutex_unlock(&card_mutex);
+
+- err = card->driver->enable(card, config_rom, length);
+- if (err < 0) {
+- mutex_lock(&card_mutex);
+- list_del(&card->link);
+- mutex_unlock(&card_mutex);
+- }
+- return err;
++ return card->driver->enable(card, config_rom, length);
+ }
+ EXPORT_SYMBOL(fw_card_add);
+
+@@ -519,7 +512,7 @@
+ fw_core_initiate_bus_reset(card, 1);
+
+ mutex_lock(&card_mutex);
+- list_del_init(&card->link);
++ list_del(&card->link);
+ mutex_unlock(&card_mutex);
+
+ /* Set up the dummy driver. */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/firewire/fw-device.c linux-2.6.29-rc3.owrt/drivers/firewire/fw-device.c
+--- linux-2.6.29.owrt/drivers/firewire/fw-device.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/firewire/fw-device.c 2009-05-10 23:48:28.000000000 +0200
+@@ -25,7 +25,6 @@
+ #include <linux/device.h>
+ #include <linux/delay.h>
+ #include <linux/idr.h>
+-#include <linux/jiffies.h>
+ #include <linux/string.h>
+ #include <linux/rwsem.h>
+ #include <linux/semaphore.h>
+@@ -635,39 +634,12 @@
+ return device;
+ }
+
+-/*
+- * These defines control the retry behavior for reading the config
+- * rom. It shouldn't be necessary to tweak these; if the device
+- * doesn't respond to a config rom read within 10 seconds, it's not
+- * going to respond at all. As for the initial delay, a lot of
+- * devices will be able to respond within half a second after bus
+- * reset. On the other hand, it's not really worth being more
+- * aggressive than that, since it scales pretty well; if 10 devices
+- * are plugged in, they're all getting read within one second.
+- */
+-
+-#define MAX_RETRIES 10
+-#define RETRY_DELAY (3 * HZ)
+-#define INITIAL_DELAY (HZ / 2)
+-#define SHUTDOWN_DELAY (2 * HZ)
+-
+ static void fw_device_shutdown(struct work_struct *work)
+ {
+ struct fw_device *device =
+ container_of(work, struct fw_device, work.work);
+ int minor = MINOR(device->device.devt);
+
+- if (time_is_after_jiffies(device->card->reset_jiffies + SHUTDOWN_DELAY)
+- && !list_empty(&device->card->link)) {
+- schedule_delayed_work(&device->work, SHUTDOWN_DELAY);
+- return;
+- }
+-
+- if (atomic_cmpxchg(&device->state,
+- FW_DEVICE_GONE,
+- FW_DEVICE_SHUTDOWN) != FW_DEVICE_GONE)
+- return;
+-
+ fw_device_cdev_remove(device);
+ device_for_each_child(&device->device, NULL, shutdown_unit);
+ device_unregister(&device->device);
+@@ -675,7 +647,6 @@
+ down_write(&fw_device_rwsem);
+ idr_remove(&fw_device_idr, minor);
+ up_write(&fw_device_rwsem);
+-
+ fw_device_put(device);
+ }
+
+@@ -683,63 +654,25 @@
+ .release = fw_device_release,
+ };
+
+-static void fw_device_update(struct work_struct *work);
+-
+ /*
+- * If a device was pending for deletion because its node went away but its
+- * bus info block and root directory header matches that of a newly discovered
+- * device, revive the existing fw_device.
+- * The newly allocated fw_device becomes obsolete instead.
++ * These defines control the retry behavior for reading the config
++ * rom. It shouldn't be necessary to tweak these; if the device
++ * doesn't respond to a config rom read within 10 seconds, it's not
++ * going to respond at all. As for the initial delay, a lot of
++ * devices will be able to respond within half a second after bus
++ * reset. On the other hand, it's not really worth being more
++ * aggressive than that, since it scales pretty well; if 10 devices
++ * are plugged in, they're all getting read within one second.
+ */
+-static int lookup_existing_device(struct device *dev, void *data)
+-{
+- struct fw_device *old = fw_device(dev);
+- struct fw_device *new = data;
+- struct fw_card *card = new->card;
+- int match = 0;
+-
+- down_read(&fw_device_rwsem); /* serialize config_rom access */
+- spin_lock_irq(&card->lock); /* serialize node access */
+-
+- if (memcmp(old->config_rom, new->config_rom, 6 * 4) == 0 &&
+- atomic_cmpxchg(&old->state,
+- FW_DEVICE_GONE,
+- FW_DEVICE_RUNNING) == FW_DEVICE_GONE) {
+- struct fw_node *current_node = new->node;
+- struct fw_node *obsolete_node = old->node;
+-
+- new->node = obsolete_node;
+- new->node->data = new;
+- old->node = current_node;
+- old->node->data = old;
+-
+- old->max_speed = new->max_speed;
+- old->node_id = current_node->node_id;
+- smp_wmb(); /* update node_id before generation */
+- old->generation = card->generation;
+- old->config_rom_retries = 0;
+- fw_notify("rediscovered device %s\n", dev_name(dev));
+-
+- PREPARE_DELAYED_WORK(&old->work, fw_device_update);
+- schedule_delayed_work(&old->work, 0);
+-
+- if (current_node == card->root_node)
+- fw_schedule_bm_work(card, 0);
+-
+- match = 1;
+- }
+
+- spin_unlock_irq(&card->lock);
+- up_read(&fw_device_rwsem);
+-
+- return match;
+-}
++#define MAX_RETRIES 10
++#define RETRY_DELAY (3 * HZ)
++#define INITIAL_DELAY (HZ / 2)
+
+ static void fw_device_init(struct work_struct *work)
+ {
+ struct fw_device *device =
+ container_of(work, struct fw_device, work.work);
+- struct device *revived_dev;
+ int minor, err;
+
+ /*
+@@ -763,15 +696,6 @@
+ return;
+ }
+
+- revived_dev = device_find_child(device->card->device,
+- device, lookup_existing_device);
+- if (revived_dev) {
+- put_device(revived_dev);
+- fw_device_release(&device->device);
+-
+- return;
+- }
+-
+ device_initialize(&device->device);
+
+ fw_device_get(device);
+@@ -810,10 +734,9 @@
+ * fw_node_event().
+ */
+ if (atomic_cmpxchg(&device->state,
+- FW_DEVICE_INITIALIZING,
+- FW_DEVICE_RUNNING) == FW_DEVICE_GONE) {
+- PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown);
+- schedule_delayed_work(&device->work, SHUTDOWN_DELAY);
++ FW_DEVICE_INITIALIZING,
++ FW_DEVICE_RUNNING) == FW_DEVICE_SHUTDOWN) {
++ fw_device_shutdown(work);
+ } else {
+ if (device->config_rom_retries)
+ fw_notify("created device %s: GUID %08x%08x, S%d00, "
+@@ -924,8 +847,8 @@
+
+ case REREAD_BIB_UNCHANGED:
+ if (atomic_cmpxchg(&device->state,
+- FW_DEVICE_INITIALIZING,
+- FW_DEVICE_RUNNING) == FW_DEVICE_GONE)
++ FW_DEVICE_INITIALIZING,
++ FW_DEVICE_RUNNING) == FW_DEVICE_SHUTDOWN)
+ goto gone;
+
+ fw_device_update(work);
+@@ -956,8 +879,8 @@
+ create_units(device);
+
+ if (atomic_cmpxchg(&device->state,
+- FW_DEVICE_INITIALIZING,
+- FW_DEVICE_RUNNING) == FW_DEVICE_GONE)
++ FW_DEVICE_INITIALIZING,
++ FW_DEVICE_RUNNING) == FW_DEVICE_SHUTDOWN)
+ goto gone;
+
+ fw_notify("refreshed device %s\n", dev_name(&device->device));
+@@ -967,9 +890,8 @@
+ give_up:
+ fw_notify("giving up on refresh of device %s\n", dev_name(&device->device));
+ gone:
+- atomic_set(&device->state, FW_DEVICE_GONE);
+- PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown);
+- schedule_delayed_work(&device->work, SHUTDOWN_DELAY);
++ atomic_set(&device->state, FW_DEVICE_SHUTDOWN);
++ fw_device_shutdown(work);
+ out:
+ if (node_id == card->root_node->node_id)
+ fw_schedule_bm_work(card, 0);
+@@ -1073,10 +995,9 @@
+ */
+ device = node->data;
+ if (atomic_xchg(&device->state,
+- FW_DEVICE_GONE) == FW_DEVICE_RUNNING) {
++ FW_DEVICE_SHUTDOWN) == FW_DEVICE_RUNNING) {
+ PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown);
+- schedule_delayed_work(&device->work,
+- list_empty(&card->link) ? 0 : SHUTDOWN_DELAY);
++ schedule_delayed_work(&device->work, 0);
+ }
+ break;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/firewire/fw-device.h linux-2.6.29-rc3.owrt/drivers/firewire/fw-device.h
+--- linux-2.6.29.owrt/drivers/firewire/fw-device.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/firewire/fw-device.h 2009-05-10 23:48:28.000000000 +0200
+@@ -28,7 +28,6 @@
+ enum fw_device_state {
+ FW_DEVICE_INITIALIZING,
+ FW_DEVICE_RUNNING,
+- FW_DEVICE_GONE,
+ FW_DEVICE_SHUTDOWN,
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/firewire/fw-ohci.c linux-2.6.29-rc3.owrt/drivers/firewire/fw-ohci.c
+--- linux-2.6.29.owrt/drivers/firewire/fw-ohci.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/firewire/fw-ohci.c 2009-05-10 23:48:28.000000000 +0200
+@@ -226,7 +226,7 @@
+ #define CONTEXT_DEAD 0x0800
+ #define CONTEXT_ACTIVE 0x0400
+
+-#define OHCI1394_MAX_AT_REQ_RETRIES 0xf
++#define OHCI1394_MAX_AT_REQ_RETRIES 0x2
+ #define OHCI1394_MAX_AT_RESP_RETRIES 0x2
+ #define OHCI1394_MAX_PHYS_RESP_RETRIES 0x8
+
+@@ -896,11 +896,11 @@
+ for (i = 0; i < 10; i++) {
+ reg = reg_read(ctx->ohci, CONTROL_SET(ctx->regs));
+ if ((reg & CONTEXT_ACTIVE) == 0)
+- return;
++ break;
+
++ fw_notify("context_stop: still active (0x%08x)\n", reg);
+ mdelay(1);
+ }
+- fw_error("Error: DMA context still active (0x%08x)\n", reg);
+ }
+
+ struct driver_data {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/firewire/fw-sbp2.c linux-2.6.29-rc3.owrt/drivers/firewire/fw-sbp2.c
+--- linux-2.6.29.owrt/drivers/firewire/fw-sbp2.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/firewire/fw-sbp2.c 2009-05-10 23:48:28.000000000 +0200
+@@ -168,7 +168,6 @@
+ int address_high;
+ unsigned int workarounds;
+ unsigned int mgt_orb_timeout;
+- unsigned int max_payload;
+
+ int dont_block; /* counter for each logical unit */
+ int blocked; /* ditto */
+@@ -311,16 +310,14 @@
+ dma_addr_t page_table_bus;
+ };
+
+-#define SBP2_ROM_VALUE_WILDCARD ~0 /* match all */
+-#define SBP2_ROM_VALUE_MISSING 0xff000000 /* not present in the unit dir. */
+-
+ /*
+ * List of devices with known bugs.
+ *
+ * The firmware_revision field, masked with 0xffff00, is the best
+ * indicator for the type of bridge chip of a device. It yields a few
+ * false positives but this did not break correctly behaving devices
+- * so far.
++ * so far. We use ~0 as a wildcard, since the 24 bit values we get
++ * from the config rom can never match that.
+ */
+ static const struct {
+ u32 firmware_revision;
+@@ -342,35 +339,33 @@
+ },
+ /* Initio bridges, actually only needed for some older ones */ {
+ .firmware_revision = 0x000200,
+- .model = SBP2_ROM_VALUE_WILDCARD,
++ .model = ~0,
+ .workarounds = SBP2_WORKAROUND_INQUIRY_36,
+ },
+ /* PL-3507 bridge with Prolific firmware */ {
+ .firmware_revision = 0x012800,
+- .model = SBP2_ROM_VALUE_WILDCARD,
++ .model = ~0,
+ .workarounds = SBP2_WORKAROUND_POWER_CONDITION,
+ },
+ /* Symbios bridge */ {
+ .firmware_revision = 0xa0b800,
+- .model = SBP2_ROM_VALUE_WILDCARD,
++ .model = ~0,
+ .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
+ },
+ /* Datafab MD2-FW2 with Symbios/LSILogic SYM13FW500 bridge */ {
+ .firmware_revision = 0x002600,
+- .model = SBP2_ROM_VALUE_WILDCARD,
++ .model = ~0,
+ .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
+ },
++
+ /*
+- * iPod 2nd generation: needs 128k max transfer size workaround
+- * iPod 3rd generation: needs fix capacity workaround
++ * There are iPods (2nd gen, 3rd gen) with model_id == 0, but
++ * these iPods do not feature the read_capacity bug according
++ * to one report. Read_capacity behaviour as well as model_id
++ * could change due to Apple-supplied firmware updates though.
+ */
+- {
+- .firmware_revision = 0x0a2700,
+- .model = 0x000000,
+- .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS |
+- SBP2_WORKAROUND_FIX_CAPACITY,
+- },
+- /* iPod 4th generation */ {
++
++ /* iPod 4th generation. */ {
+ .firmware_revision = 0x0a2700,
+ .model = 0x000021,
+ .workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
+@@ -1097,7 +1092,7 @@
+ continue;
+
+ if (sbp2_workarounds_table[i].model != model &&
+- sbp2_workarounds_table[i].model != SBP2_ROM_VALUE_WILDCARD)
++ sbp2_workarounds_table[i].model != ~0)
+ continue;
+
+ w |= sbp2_workarounds_table[i].workarounds;
+@@ -1147,28 +1142,20 @@
+ fw_device_get(device);
+ fw_unit_get(unit);
+
++ /* Initialize to values that won't match anything in our table. */
++ firmware_revision = 0xff000000;
++ model = 0xff000000;
++
+ /* implicit directory ID */
+ tgt->directory_id = ((unit->directory - device->config_rom) * 4
+ + CSR_CONFIG_ROM) & 0xffffff;
+
+- firmware_revision = SBP2_ROM_VALUE_MISSING;
+- model = SBP2_ROM_VALUE_MISSING;
+-
+ if (sbp2_scan_unit_dir(tgt, unit->directory, &model,
+ &firmware_revision) < 0)
+ goto fail_tgt_put;
+
+ sbp2_init_workarounds(tgt, model, firmware_revision);
+
+- /*
+- * At S100 we can do 512 bytes per packet, at S200 1024 bytes,
+- * and so on up to 4096 bytes. The SBP-2 max_payload field
+- * specifies the max payload size as 2 ^ (max_payload + 2), so
+- * if we set this to max_speed + 7, we get the right value.
+- */
+- tgt->max_payload = min(device->max_speed + 7, 10U);
+- tgt->max_payload = min(tgt->max_payload, device->card->max_receive - 1);
+-
+ /* Do the login in a workqueue so we can easily reschedule retries. */
+ list_for_each_entry(lu, &tgt->lu_list, link)
+ sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5));
+@@ -1286,19 +1273,6 @@
+ .id_table = sbp2_id_table,
+ };
+
+-static void sbp2_unmap_scatterlist(struct device *card_device,
+- struct sbp2_command_orb *orb)
+-{
+- if (scsi_sg_count(orb->cmd))
+- dma_unmap_sg(card_device, scsi_sglist(orb->cmd),
+- scsi_sg_count(orb->cmd),
+- orb->cmd->sc_data_direction);
+-
+- if (orb->request.misc & cpu_to_be32(COMMAND_ORB_PAGE_TABLE_PRESENT))
+- dma_unmap_single(card_device, orb->page_table_bus,
+- sizeof(orb->page_table), DMA_TO_DEVICE);
+-}
+-
+ static unsigned int
+ sbp2_status_to_sense_data(u8 *sbp2_status, u8 *sense_data)
+ {
+@@ -1378,7 +1352,15 @@
+
+ dma_unmap_single(device->card->device, orb->base.request_bus,
+ sizeof(orb->request), DMA_TO_DEVICE);
+- sbp2_unmap_scatterlist(device->card->device, orb);
++
++ if (scsi_sg_count(orb->cmd) > 0)
++ dma_unmap_sg(device->card->device, scsi_sglist(orb->cmd),
++ scsi_sg_count(orb->cmd),
++ orb->cmd->sc_data_direction);
++
++ if (orb->page_table_bus != 0)
++ dma_unmap_single(device->card->device, orb->page_table_bus,
++ sizeof(orb->page_table), DMA_TO_DEVICE);
+
+ orb->cmd->result = result;
+ orb->done(orb->cmd);
+@@ -1452,6 +1434,7 @@
+ struct sbp2_logical_unit *lu = cmd->device->hostdata;
+ struct fw_device *device = fw_device(lu->tgt->unit->device.parent);
+ struct sbp2_command_orb *orb;
++ unsigned int max_payload;
+ int generation, retval = SCSI_MLQUEUE_HOST_BUSY;
+
+ /*
+@@ -1479,9 +1462,17 @@
+ orb->done = done;
+ orb->cmd = cmd;
+
+- orb->request.next.high = cpu_to_be32(SBP2_ORB_NULL);
++ orb->request.next.high = cpu_to_be32(SBP2_ORB_NULL);
++ /*
++ * At speed 100 we can do 512 bytes per packet, at speed 200,
++ * 1024 bytes per packet etc. The SBP-2 max_payload field
++ * specifies the max payload size as 2 ^ (max_payload + 2), so
++ * if we set this to max_speed + 7, we get the right value.
++ */
++ max_payload = min(device->max_speed + 7,
++ device->card->max_receive - 1);
+ orb->request.misc = cpu_to_be32(
+- COMMAND_ORB_MAX_PAYLOAD(lu->tgt->max_payload) |
++ COMMAND_ORB_MAX_PAYLOAD(max_payload) |
+ COMMAND_ORB_SPEED(device->max_speed) |
+ COMMAND_ORB_NOTIFY);
+
+@@ -1500,10 +1491,8 @@
+ orb->base.request_bus =
+ dma_map_single(device->card->device, &orb->request,
+ sizeof(orb->request), DMA_TO_DEVICE);
+- if (dma_mapping_error(device->card->device, orb->base.request_bus)) {
+- sbp2_unmap_scatterlist(device->card->device, orb);
++ if (dma_mapping_error(device->card->device, orb->base.request_bus))
+ goto out;
+- }
+
+ sbp2_send_orb(&orb->base, lu, lu->tgt->node_id, generation,
+ lu->command_block_agent_address + SBP2_ORB_POINTER);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/firewire/fw-topology.c linux-2.6.29-rc3.owrt/drivers/firewire/fw-topology.c
+--- linux-2.6.29.owrt/drivers/firewire/fw-topology.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/firewire/fw-topology.c 2009-05-10 23:48:28.000000000 +0200
+@@ -518,18 +518,6 @@
+ struct fw_node *local_node;
+ unsigned long flags;
+
+- /*
+- * If the selfID buffer is not the immediate successor of the
+- * previously processed one, we cannot reliably compare the
+- * old and new topologies.
+- */
+- if (!is_next_generation(generation, card->generation) &&
+- card->local_node != NULL) {
+- fw_notify("skipped bus generations, destroying all nodes\n");
+- fw_destroy_nodes(card);
+- card->bm_retries = 0;
+- }
+-
+ spin_lock_irqsave(&card->lock, flags);
+
+ card->node_id = node_id;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/firewire/fw-transaction.h linux-2.6.29-rc3.owrt/drivers/firewire/fw-transaction.h
+--- linux-2.6.29.owrt/drivers/firewire/fw-transaction.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/firewire/fw-transaction.h 2009-05-10 23:48:28.000000000 +0200
+@@ -276,15 +276,6 @@
+ extern void fw_schedule_bm_work(struct fw_card *card, unsigned long delay);
+
+ /*
+- * Check whether new_generation is the immediate successor of old_generation.
+- * Take counter roll-over at 255 (as per to OHCI) into account.
+- */
+-static inline bool is_next_generation(int new_generation, int old_generation)
+-{
+- return (new_generation & 0xff) == ((old_generation + 1) & 0xff);
+-}
+-
+-/*
+ * The iso packet format allows for an immediate header/payload part
+ * stored in 'header' immediately after the packet info plus an
+ * indirect payload part that is pointer to by the 'payload' field.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/firmware/memmap.c linux-2.6.29-rc3.owrt/drivers/firmware/memmap.c
+--- linux-2.6.29.owrt/drivers/firmware/memmap.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/firmware/memmap.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ /*
+ * linux/drivers/firmware/memmap.c
+ * Copyright (C) 2008 SUSE LINUX Products GmbH
+- * by Bernhard Walle <bernhard.walle@gmx.de>
++ * by Bernhard Walle <bwalle@suse.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License v2.0 as published by
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpio/gpiolib.c linux-2.6.29-rc3.owrt/drivers/gpio/gpiolib.c
+--- linux-2.6.29.owrt/drivers/gpio/gpiolib.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpio/gpiolib.c 2009-05-10 23:48:28.000000000 +0200
+@@ -789,7 +789,6 @@
+ } else {
+ status = -EBUSY;
+ module_put(chip->owner);
+- goto done;
+ }
+
+ if (chip->request) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/drm_bufs.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_bufs.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/drm_bufs.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_bufs.c 2009-05-10 23:48:28.000000000 +0200
+@@ -420,7 +420,7 @@
+ dev->sigdata.lock = NULL;
+ master->lock.hw_lock = NULL; /* SHM removed */
+ master->lock.file_priv = NULL;
+- wake_up_interruptible_all(&master->lock.lock_queue);
++ wake_up_interruptible(&master->lock.lock_queue);
+ }
+ break;
+ case _DRM_AGP:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/drm_crtc.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_crtc.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/drm_crtc.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_crtc.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1741,8 +1741,9 @@
+ * RETURNS:
+ * Zero on success, errno on failure.
+ */
+-void drm_fb_release(struct drm_file *priv)
++void drm_fb_release(struct file *filp)
+ {
++ struct drm_file *priv = filp->private_data;
+ struct drm_device *dev = priv->minor->dev;
+ struct drm_framebuffer *fb, *tfb;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/drm_crtc_helper.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_crtc_helper.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/drm_crtc_helper.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_crtc_helper.c 2009-05-10 23:48:28.000000000 +0200
+@@ -452,59 +452,6 @@
+ kfree(modes);
+ kfree(enabled);
+ }
+-
+-/**
+- * drm_encoder_crtc_ok - can a given crtc drive a given encoder?
+- * @encoder: encoder to test
+- * @crtc: crtc to test
+- *
+- * Return false if @encoder can't be driven by @crtc, true otherwise.
+- */
+-static bool drm_encoder_crtc_ok(struct drm_encoder *encoder,
+- struct drm_crtc *crtc)
+-{
+- struct drm_device *dev;
+- struct drm_crtc *tmp;
+- int crtc_mask = 1;
+-
+- WARN(!crtc, "checking null crtc?");
+-
+- dev = crtc->dev;
+-
+- list_for_each_entry(tmp, &dev->mode_config.crtc_list, head) {
+- if (tmp == crtc)
+- break;
+- crtc_mask <<= 1;
+- }
+-
+- if (encoder->possible_crtcs & crtc_mask)
+- return true;
+- return false;
+-}
+-
+-/*
+- * Check the CRTC we're going to map each output to vs. its current
+- * CRTC. If they don't match, we have to disable the output and the CRTC
+- * since the driver will have to re-route things.
+- */
+-static void
+-drm_crtc_prepare_encoders(struct drm_device *dev)
+-{
+- struct drm_encoder_helper_funcs *encoder_funcs;
+- struct drm_encoder *encoder;
+-
+- list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
+- encoder_funcs = encoder->helper_private;
+- /* Disable unused encoders */
+- if (encoder->crtc == NULL)
+- (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF);
+- /* Disable encoders whose CRTC is about to change */
+- if (encoder_funcs->get_crtc &&
+- encoder->crtc != (*encoder_funcs->get_crtc)(encoder))
+- (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF);
+- }
+-}
+-
+ /**
+ * drm_crtc_set_mode - set a mode
+ * @crtc: CRTC to program
+@@ -565,8 +512,8 @@
+ if (drm_mode_equal(&saved_mode, &crtc->mode)) {
+ if (saved_x != crtc->x || saved_y != crtc->y ||
+ depth_changed || bpp_changed) {
+- ret = !crtc_funcs->mode_set_base(crtc, crtc->x, crtc->y,
+- old_fb);
++ crtc_funcs->mode_set_base(crtc, crtc->x, crtc->y,
++ old_fb);
+ goto done;
+ }
+ }
+@@ -600,16 +547,12 @@
+ encoder_funcs->prepare(encoder);
+ }
+
+- drm_crtc_prepare_encoders(dev);
+-
+ crtc_funcs->prepare(crtc);
+
+ /* Set up the DPLL and any encoders state that needs to adjust or depend
+ * on the DPLL.
+ */
+- ret = !crtc_funcs->mode_set(crtc, mode, adjusted_mode, x, y, old_fb);
+- if (!ret)
+- goto done;
++ crtc_funcs->mode_set(crtc, mode, adjusted_mode, x, y, old_fb);
+
+ list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
+
+@@ -672,7 +615,7 @@
+ struct drm_device *dev;
+ struct drm_crtc **save_crtcs, *new_crtc;
+ struct drm_encoder **save_encoders, *new_encoder;
+- struct drm_framebuffer *old_fb = NULL;
++ struct drm_framebuffer *old_fb;
+ bool save_enabled;
+ bool mode_changed = false;
+ bool fb_changed = false;
+@@ -723,10 +666,9 @@
+ * and then just flip_or_move it */
+ if (set->crtc->fb != set->fb) {
+ /* If we have no fb then treat it as a full mode set */
+- if (set->crtc->fb == NULL) {
+- DRM_DEBUG("crtc has no fb, full mode set\n");
++ if (set->crtc->fb == NULL)
+ mode_changed = true;
+- } else if ((set->fb->bits_per_pixel !=
++ else if ((set->fb->bits_per_pixel !=
+ set->crtc->fb->bits_per_pixel) ||
+ set->fb->depth != set->crtc->fb->depth)
+ fb_changed = true;
+@@ -738,7 +680,7 @@
+ fb_changed = true;
+
+ if (set->mode && !drm_mode_equal(set->mode, &set->crtc->mode)) {
+- DRM_DEBUG("modes are different, full mode set\n");
++ DRM_DEBUG("modes are different\n");
+ drm_mode_debug_printmodeline(&set->crtc->mode);
+ drm_mode_debug_printmodeline(set->mode);
+ mode_changed = true;
+@@ -764,7 +706,6 @@
+ }
+
+ if (new_encoder != connector->encoder) {
+- DRM_DEBUG("encoder changed, full mode switch\n");
+ mode_changed = true;
+ connector->encoder = new_encoder;
+ }
+@@ -791,20 +732,10 @@
+ if (set->connectors[ro] == connector)
+ new_crtc = set->crtc;
+ }
+-
+- /* Make sure the new CRTC will work with the encoder */
+- if (new_crtc &&
+- !drm_encoder_crtc_ok(connector->encoder, new_crtc)) {
+- ret = -EINVAL;
+- goto fail_set_mode;
+- }
+ if (new_crtc != connector->encoder->crtc) {
+- DRM_DEBUG("crtc changed, full mode switch\n");
+ mode_changed = true;
+ connector->encoder->crtc = new_crtc;
+ }
+- DRM_DEBUG("setting connector %d crtc to %p\n",
+- connector->base.id, new_crtc);
+ }
+
+ /* mode_set_base is not a required function */
+@@ -821,8 +752,6 @@
+ if (!drm_crtc_helper_set_mode(set->crtc, set->mode,
+ set->x, set->y,
+ old_fb)) {
+- DRM_ERROR("failed to set mode on crtc %p\n",
+- set->crtc);
+ ret = -EINVAL;
+ goto fail_set_mode;
+ }
+@@ -836,10 +765,7 @@
+ old_fb = set->crtc->fb;
+ if (set->crtc->fb != set->fb)
+ set->crtc->fb = set->fb;
+- ret = crtc_funcs->mode_set_base(set->crtc,
+- set->x, set->y, old_fb);
+- if (ret != 0)
+- goto fail_set_mode;
++ crtc_funcs->mode_set_base(set->crtc, set->x, set->y, old_fb);
+ }
+
+ kfree(save_encoders);
+@@ -848,14 +774,9 @@
+
+ fail_set_mode:
+ set->crtc->enabled = save_enabled;
+- set->crtc->fb = old_fb;
+ count = 0;
+- list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+- if (!connector->encoder)
+- continue;
+-
++ list_for_each_entry(connector, &dev->mode_config.connector_list, head)
+ connector->encoder->crtc = save_crtcs[count++];
+- }
+ fail_no_encoder:
+ kfree(save_crtcs);
+ count = 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/drm_edid.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_edid.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/drm_edid.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_edid.c 2009-05-10 23:48:28.000000000 +0200
+@@ -125,7 +125,7 @@
+ DRM_ERROR("EDID has major version %d, instead of 1\n", edid->version);
+ goto bad;
+ }
+- if (edid->revision > 3) {
++ if (edid->revision <= 0 || edid->revision > 3) {
+ DRM_ERROR("EDID has minor version %d, which is not between 0-3\n", edid->revision);
+ goto bad;
+ }
+@@ -320,10 +320,10 @@
+ mode->htotal = mode->hdisplay + ((pt->hblank_hi << 8) | pt->hblank_lo);
+
+ mode->vdisplay = (pt->vactive_hi << 8) | pt->vactive_lo;
+- mode->vsync_start = mode->vdisplay + ((pt->vsync_offset_hi << 4) |
++ mode->vsync_start = mode->vdisplay + ((pt->vsync_offset_hi << 8) |
+ pt->vsync_offset_lo);
+ mode->vsync_end = mode->vsync_start +
+- ((pt->vsync_pulse_width_hi << 4) |
++ ((pt->vsync_pulse_width_hi << 8) |
+ pt->vsync_pulse_width_lo);
+ mode->vtotal = mode->vdisplay + ((pt->vblank_hi << 8) | pt->vblank_lo);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/drm_fops.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_fops.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/drm_fops.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_fops.c 2009-05-10 23:48:28.000000000 +0200
+@@ -457,9 +457,6 @@
+ if (dev->driver->driver_features & DRIVER_GEM)
+ drm_gem_release(dev, file_priv);
+
+- if (dev->driver->driver_features & DRIVER_MODESET)
+- drm_fb_release(file_priv);
+-
+ mutex_lock(&dev->ctxlist_mutex);
+ if (!list_empty(&dev->ctxlist)) {
+ struct drm_ctx_list *pos, *n;
+@@ -484,7 +481,6 @@
+ mutex_lock(&dev->struct_mutex);
+
+ if (file_priv->is_master) {
+- struct drm_master *master = file_priv->master;
+ struct drm_file *temp;
+ list_for_each_entry(temp, &dev->filelist, lhead) {
+ if ((temp->master == file_priv->master) &&
+@@ -492,19 +488,6 @@
+ temp->authenticated = 0;
+ }
+
+- /**
+- * Since the master is disappearing, so is the
+- * possibility to lock.
+- */
+-
+- if (master->lock.hw_lock) {
+- if (dev->sigdata.lock == master->lock.hw_lock)
+- dev->sigdata.lock = NULL;
+- master->lock.hw_lock = NULL;
+- master->lock.file_priv = NULL;
+- wake_up_interruptible_all(&master->lock.lock_queue);
+- }
+-
+ if (file_priv->minor->master == file_priv->master) {
+ /* drop the reference held my the minor */
+ drm_master_put(&file_priv->minor->master);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/drm_gem.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_gem.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/drm_gem.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_gem.c 2009-05-10 23:48:28.000000000 +0200
+@@ -104,8 +104,8 @@
+
+ if (drm_mm_init(&mm->offset_manager, DRM_FILE_PAGE_OFFSET_START,
+ DRM_FILE_PAGE_OFFSET_SIZE)) {
+- drm_ht_remove(&mm->offset_hash);
+ drm_free(mm, sizeof(struct drm_gem_mm), DRM_MEM_MM);
++ drm_ht_remove(&mm->offset_hash);
+ return -ENOMEM;
+ }
+
+@@ -136,7 +136,7 @@
+ obj = kcalloc(1, sizeof(*obj), GFP_KERNEL);
+
+ obj->dev = dev;
+- obj->filp = shmem_file_setup("drm mm object", size, VM_NORESERVE);
++ obj->filp = shmem_file_setup("drm mm object", size, 0);
+ if (IS_ERR(obj->filp)) {
+ kfree(obj);
+ return NULL;
+@@ -295,37 +295,35 @@
+ return -EBADF;
+
+ again:
+- if (idr_pre_get(&dev->object_name_idr, GFP_KERNEL) == 0) {
+- ret = -ENOMEM;
+- goto err;
+- }
++ if (idr_pre_get(&dev->object_name_idr, GFP_KERNEL) == 0)
++ return -ENOMEM;
+
+ spin_lock(&dev->object_name_lock);
+- if (!obj->name) {
+- ret = idr_get_new_above(&dev->object_name_idr, obj, 1,
+- &obj->name);
+- args->name = (uint64_t) obj->name;
++ if (obj->name) {
++ args->name = obj->name;
+ spin_unlock(&dev->object_name_lock);
++ return 0;
++ }
++ ret = idr_get_new_above(&dev->object_name_idr, obj, 1,
++ &obj->name);
++ spin_unlock(&dev->object_name_lock);
++ if (ret == -EAGAIN)
++ goto again;
+
+- if (ret == -EAGAIN)
+- goto again;
+-
+- if (ret != 0)
+- goto err;
+-
+- /* Allocate a reference for the name table. */
+- drm_gem_object_reference(obj);
+- } else {
+- args->name = (uint64_t) obj->name;
+- spin_unlock(&dev->object_name_lock);
+- ret = 0;
++ if (ret != 0) {
++ mutex_lock(&dev->struct_mutex);
++ drm_gem_object_unreference(obj);
++ mutex_unlock(&dev->struct_mutex);
++ return ret;
+ }
+
+-err:
+- mutex_lock(&dev->struct_mutex);
+- drm_gem_object_unreference(obj);
+- mutex_unlock(&dev->struct_mutex);
+- return ret;
++ /*
++ * Leave the reference from the lookup around as the
++ * name table now holds one
++ */
++ args->name = (uint64_t) obj->name;
++
++ return 0;
+ }
+
+ /**
+@@ -450,7 +448,6 @@
+ spin_lock(&dev->object_name_lock);
+ if (obj->name) {
+ idr_remove(&dev->object_name_idr, obj->name);
+- obj->name = 0;
+ spin_unlock(&dev->object_name_lock);
+ /*
+ * The object name held a reference to this object, drop
+@@ -463,26 +460,6 @@
+ }
+ EXPORT_SYMBOL(drm_gem_object_handle_free);
+
+-void drm_gem_vm_open(struct vm_area_struct *vma)
+-{
+- struct drm_gem_object *obj = vma->vm_private_data;
+-
+- drm_gem_object_reference(obj);
+-}
+-EXPORT_SYMBOL(drm_gem_vm_open);
+-
+-void drm_gem_vm_close(struct vm_area_struct *vma)
+-{
+- struct drm_gem_object *obj = vma->vm_private_data;
+- struct drm_device *dev = obj->dev;
+-
+- mutex_lock(&dev->struct_mutex);
+- drm_gem_object_unreference(obj);
+- mutex_unlock(&dev->struct_mutex);
+-}
+-EXPORT_SYMBOL(drm_gem_vm_close);
+-
+-
+ /**
+ * drm_gem_mmap - memory map routine for GEM objects
+ * @filp: DRM file pointer
+@@ -544,14 +521,6 @@
+ #endif
+ vma->vm_page_prot = __pgprot(prot);
+
+- /* Take a ref for this mapping of the object, so that the fault
+- * handler can dereference the mmap offset's pointer to the object.
+- * This reference is cleaned up by the corresponding vm_close
+- * (which should happen whether the vma was created by this call, or
+- * by a vm_open due to mremap or partial unmap or whatever).
+- */
+- drm_gem_object_reference(obj);
+-
+ vma->vm_file = filp; /* Needed for drm_vm_open() */
+ drm_vm_open_locked(vma);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/drm_irq.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_irq.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/drm_irq.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_irq.c 2009-05-10 23:48:28.000000000 +0200
+@@ -276,7 +276,6 @@
+ for (i = 0; i < dev->num_crtcs; i++) {
+ DRM_WAKEUP(&dev->vbl_queue[i]);
+ dev->vblank_enabled[i] = 0;
+- dev->last_vblank[i] = dev->driver->get_vblank_counter(dev, i);
+ }
+ spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
+
+@@ -435,8 +434,6 @@
+ */
+ void drm_vblank_put(struct drm_device *dev, int crtc)
+ {
+- BUG_ON (atomic_read (&dev->vblank_refcount[crtc]) == 0);
+-
+ /* Last user schedules interrupt disable */
+ if (atomic_dec_and_test(&dev->vblank_refcount[crtc]))
+ mod_timer(&dev->vblank_disable_timer, jiffies + 5*DRM_HZ);
+@@ -462,9 +459,8 @@
+ * so that interrupts remain enabled in the interim.
+ */
+ if (!dev->vblank_inmodeset[crtc]) {
+- dev->vblank_inmodeset[crtc] = 0x1;
+- if (drm_vblank_get(dev, crtc) == 0)
+- dev->vblank_inmodeset[crtc] |= 0x2;
++ dev->vblank_inmodeset[crtc] = 1;
++ drm_vblank_get(dev, crtc);
+ }
+ }
+ EXPORT_SYMBOL(drm_vblank_pre_modeset);
+@@ -476,12 +472,9 @@
+ if (dev->vblank_inmodeset[crtc]) {
+ spin_lock_irqsave(&dev->vbl_lock, irqflags);
+ dev->vblank_disable_allowed = 1;
+- spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
+-
+- if (dev->vblank_inmodeset[crtc] & 0x2)
+- drm_vblank_put(dev, crtc);
+-
+ dev->vblank_inmodeset[crtc] = 0;
++ spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
++ drm_vblank_put(dev, crtc);
+ }
+ }
+ EXPORT_SYMBOL(drm_vblank_post_modeset);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/drm_lock.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_lock.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/drm_lock.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_lock.c 2009-05-10 23:48:28.000000000 +0200
+@@ -80,7 +80,6 @@
+ __set_current_state(TASK_INTERRUPTIBLE);
+ if (!master->lock.hw_lock) {
+ /* Device has been unregistered */
+- send_sig(SIGTERM, current, 0);
+ ret = -EINTR;
+ break;
+ }
+@@ -94,7 +93,7 @@
+ /* Contention */
+ schedule();
+ if (signal_pending(current)) {
+- ret = -EINTR;
++ ret = -ERESTARTSYS;
+ break;
+ }
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/drm_memory.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_memory.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/drm_memory.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_memory.c 2009-05-10 23:48:28.000000000 +0200
+@@ -171,14 +171,9 @@
+
+ void drm_core_ioremap_wc(struct drm_map *map, struct drm_device *dev)
+ {
+- if (drm_core_has_AGP(dev) &&
+- dev->agp && dev->agp->cant_use_aperture && map->type == _DRM_AGP)
+- map->handle = agp_remap(map->offset, map->size, dev);
+- else
+- map->handle = ioremap_wc(map->offset, map->size);
++ map->handle = ioremap_wc(map->offset, map->size);
+ }
+ EXPORT_SYMBOL(drm_core_ioremap_wc);
+-
+ void drm_core_ioremapfree(struct drm_map *map, struct drm_device *dev)
+ {
+ if (!map->handle || !map->size)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/drm_stub.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_stub.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/drm_stub.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/drm_stub.c 2009-05-10 23:48:28.000000000 +0200
+@@ -146,6 +146,14 @@
+
+ drm_ht_remove(&master->magiclist);
+
++ if (master->lock.hw_lock) {
++ if (dev->sigdata.lock == master->lock.hw_lock)
++ dev->sigdata.lock = NULL;
++ master->lock.hw_lock = NULL;
++ master->lock.file_priv = NULL;
++ wake_up_interruptible(&master->lock.lock_queue);
++ }
++
+ drm_free(master, sizeof(*master), DRM_MEM_DRIVER);
+ }
+
+@@ -168,7 +176,7 @@
+ file_priv->minor->master != file_priv->master) {
+ mutex_lock(&dev->struct_mutex);
+ file_priv->minor->master = drm_master_get(file_priv->master);
+- mutex_unlock(&dev->struct_mutex);
++ mutex_lock(&dev->struct_mutex);
+ }
+
+ return 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_dma.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_dma.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_dma.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_dma.c 2009-05-10 23:48:28.000000000 +0200
+@@ -202,7 +202,7 @@
+ dev_priv->ring.map.flags = 0;
+ dev_priv->ring.map.mtrr = 0;
+
+- drm_core_ioremap_wc(&dev_priv->ring.map, dev);
++ drm_core_ioremap(&dev_priv->ring.map, dev);
+
+ if (dev_priv->ring.map.handle == NULL) {
+ i915_dma_cleanup(dev);
+@@ -731,11 +731,8 @@
+ case I915_PARAM_HAS_GEM:
+ value = dev_priv->has_gem;
+ break;
+- case I915_PARAM_NUM_FENCES_AVAIL:
+- value = dev_priv->num_fence_regs - dev_priv->fence_reg_start;
+- break;
+ default:
+- DRM_DEBUG("Unknown parameter %d\n", param->param);
++ DRM_ERROR("Unknown parameter %d\n", param->param);
+ return -EINVAL;
+ }
+
+@@ -767,15 +764,8 @@
+ case I915_SETPARAM_ALLOW_BATCHBUFFER:
+ dev_priv->allow_batchbuffer = param->value;
+ break;
+- case I915_SETPARAM_NUM_USED_FENCES:
+- if (param->value > dev_priv->num_fence_regs ||
+- param->value < 0)
+- return -EINVAL;
+- /* Userspace can use first N regs */
+- dev_priv->fence_reg_start = param->value;
+- break;
+ default:
+- DRM_DEBUG("unknown parameter %d\n", param->param);
++ DRM_ERROR("unknown parameter %d\n", param->param);
+ return -EINVAL;
+ }
+
+@@ -811,7 +801,7 @@
+ dev_priv->hws_map.flags = 0;
+ dev_priv->hws_map.mtrr = 0;
+
+- drm_core_ioremap_wc(&dev_priv->hws_map, dev);
++ drm_core_ioremap(&dev_priv->hws_map, dev);
+ if (dev_priv->hws_map.handle == NULL) {
+ i915_dma_cleanup(dev);
+ dev_priv->status_gfx_addr = 0;
+@@ -976,6 +966,10 @@
+ if (ret)
+ goto kfree_devname;
+
++ dev_priv->mm.gtt_mapping =
++ io_mapping_create_wc(dev->agp->base,
++ dev->agp->agp_info.aper_size * 1024*1024);
++
+ /* Allow hardware batchbuffers unless told otherwise.
+ */
+ dev_priv->allow_batchbuffer = 1;
+@@ -1087,28 +1081,6 @@
+ goto free_priv;
+ }
+
+- dev_priv->mm.gtt_mapping =
+- io_mapping_create_wc(dev->agp->base,
+- dev->agp->agp_info.aper_size * 1024*1024);
+- if (dev_priv->mm.gtt_mapping == NULL) {
+- ret = -EIO;
+- goto out_rmmap;
+- }
+-
+- /* Set up a WC MTRR for non-PAT systems. This is more common than
+- * one would think, because the kernel disables PAT on first
+- * generation Core chips because WC PAT gets overridden by a UC
+- * MTRR if present. Even if a UC MTRR isn't present.
+- */
+- dev_priv->mm.gtt_mtrr = mtrr_add(dev->agp->base,
+- dev->agp->agp_info.aper_size *
+- 1024 * 1024,
+- MTRR_TYPE_WRCOMB, 1);
+- if (dev_priv->mm.gtt_mtrr < 0) {
+- DRM_INFO("MTRR allocation failed. Graphics "
+- "performance may suffer.\n");
+- }
+-
+ #ifdef CONFIG_HIGHMEM64G
+ /* don't enable GEM on PAE - needs agp + set_memory_* interface fixes */
+ dev_priv->has_gem = 0;
+@@ -1117,17 +1089,13 @@
+ dev_priv->has_gem = 1;
+ #endif
+
+- dev->driver->get_vblank_counter = i915_get_vblank_counter;
+- if (IS_GM45(dev))
+- dev->driver->get_vblank_counter = gm45_get_vblank_counter;
+-
+ i915_gem_load(dev);
+
+ /* Init HWS */
+ if (!I915_NEED_GFX_HWS(dev)) {
+ ret = i915_init_phys_hws(dev);
+ if (ret != 0)
+- goto out_iomapfree;
++ goto out_rmmap;
+ }
+
+ /* On the 945G/GM, the chipset reports the MSI capability on the
+@@ -1166,8 +1134,6 @@
+
+ return 0;
+
+-out_iomapfree:
+- io_mapping_free(dev_priv->mm.gtt_mapping);
+ out_rmmap:
+ iounmap(dev_priv->regs);
+ free_priv:
+@@ -1179,14 +1145,8 @@
+ {
+ struct drm_i915_private *dev_priv = dev->dev_private;
+
+- io_mapping_free(dev_priv->mm.gtt_mapping);
+- if (dev_priv->mm.gtt_mtrr >= 0) {
+- mtrr_del(dev_priv->mm.gtt_mtrr, dev->agp->base,
+- dev->agp->agp_info.aper_size * 1024 * 1024);
+- dev_priv->mm.gtt_mtrr = -1;
+- }
+-
+ if (drm_core_check_feature(dev, DRIVER_MODESET)) {
++ io_mapping_free(dev_priv->mm.gtt_mapping);
+ drm_irq_uninstall(dev);
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_drv.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_drv.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_drv.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_drv.c 2009-05-10 23:48:28.000000000 +0200
+@@ -27,7 +27,6 @@
+ *
+ */
+
+-#include <linux/device.h>
+ #include "drmP.h"
+ #include "drm.h"
+ #include "i915_drm.h"
+@@ -67,14 +66,6 @@
+
+ i915_save_state(dev);
+
+- /* If KMS is active, we do the leavevt stuff here */
+- if (drm_core_check_feature(dev, DRIVER_MODESET)) {
+- if (i915_gem_idle(dev))
+- dev_err(&dev->pdev->dev,
+- "GEM idle failed, resume may fail\n");
+- drm_irq_uninstall(dev);
+- }
+-
+ intel_opregion_free(dev);
+
+ if (state.event == PM_EVENT_SUSPEND) {
+@@ -88,9 +79,6 @@
+
+ static int i915_resume(struct drm_device *dev)
+ {
+- struct drm_i915_private *dev_priv = dev->dev_private;
+- int ret = 0;
+-
+ pci_set_power_state(dev->pdev, PCI_D0);
+ pci_restore_state(dev->pdev);
+ if (pci_enable_device(dev->pdev))
+@@ -101,26 +89,11 @@
+
+ intel_opregion_init(dev);
+
+- /* KMS EnterVT equivalent */
+- if (drm_core_check_feature(dev, DRIVER_MODESET)) {
+- mutex_lock(&dev->struct_mutex);
+- dev_priv->mm.suspended = 0;
+-
+- ret = i915_gem_init_ringbuffer(dev);
+- if (ret != 0)
+- ret = -1;
+- mutex_unlock(&dev->struct_mutex);
+-
+- drm_irq_install(dev);
+- }
+-
+- return ret;
++ return 0;
+ }
+
+ static struct vm_operations_struct i915_gem_vm_ops = {
+ .fault = i915_gem_fault,
+- .open = drm_gem_vm_open,
+- .close = drm_gem_vm_close,
+ };
+
+ static struct drm_driver driver = {
+@@ -139,6 +112,7 @@
+ .suspend = i915_suspend,
+ .resume = i915_resume,
+ .device_is_agp = i915_driver_device_is_agp,
++ .get_vblank_counter = i915_get_vblank_counter,
+ .enable_vblank = i915_enable_vblank,
+ .disable_vblank = i915_disable_vblank,
+ .irq_preinstall = i915_driver_irq_preinstall,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_drv.h linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_drv.h
+--- linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_drv.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_drv.h 2009-05-10 23:48:28.000000000 +0200
+@@ -184,8 +184,6 @@
+ unsigned int lvds_dither:1;
+ unsigned int lvds_vbt:1;
+ unsigned int int_crt_support:1;
+- unsigned int lvds_use_ssc:1;
+- int lvds_ssc_freq;
+
+ struct drm_i915_fence_reg fence_regs[16]; /* assume 965 */
+ int fence_reg_start; /* 4 if userland hasn't ioctl'd us yet */
+@@ -279,13 +277,13 @@
+ u8 saveAR_INDEX;
+ u8 saveAR[21];
+ u8 saveDACMASK;
++ u8 saveDACDATA[256*3]; /* 256 3-byte colors */
+ u8 saveCR[37];
+
+ struct {
+ struct drm_mm gtt_space;
+
+ struct io_mapping *gtt_mapping;
+- int gtt_mtrr;
+
+ /**
+ * List of objects currently involved in rendering from the
+@@ -456,12 +454,6 @@
+
+ /** for phy allocated objects */
+ struct drm_i915_gem_phys_object *phys_obj;
+-
+- /**
+- * Used for checking the object doesn't appear more than once
+- * in an execbuffer object list.
+- */
+- int in_execbuffer;
+ };
+
+ /**
+@@ -542,7 +534,6 @@
+ extern int i915_enable_vblank(struct drm_device *dev, int crtc);
+ extern void i915_disable_vblank(struct drm_device *dev, int crtc);
+ extern u32 i915_get_vblank_counter(struct drm_device *dev, int crtc);
+-extern u32 gm45_get_vblank_counter(struct drm_device *dev, int crtc);
+ extern int i915_vblank_swap(struct drm_device *dev, void *data,
+ struct drm_file *file_priv);
+ extern void i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask);
+@@ -610,7 +601,6 @@
+ void i915_gem_free_object(struct drm_gem_object *obj);
+ int i915_gem_object_pin(struct drm_gem_object *obj, uint32_t alignment);
+ void i915_gem_object_unpin(struct drm_gem_object *obj);
+-int i915_gem_object_unbind(struct drm_gem_object *obj);
+ void i915_gem_lastclose(struct drm_device *dev);
+ uint32_t i915_get_gem_seqno(struct drm_device *dev);
+ void i915_gem_retire_requests(struct drm_device *dev);
+@@ -623,7 +613,6 @@
+ void i915_gem_cleanup_ringbuffer(struct drm_device *dev);
+ int i915_gem_do_init(struct drm_device *dev, unsigned long start,
+ unsigned long end);
+-int i915_gem_idle(struct drm_device *dev);
+ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf);
+ int i915_gem_object_set_to_gtt_domain(struct drm_gem_object *obj,
+ int write);
+@@ -795,11 +784,6 @@
+ IS_I945GM(dev) || IS_I965GM(dev) || IS_GM45(dev))
+
+ #define I915_NEED_GFX_HWS(dev) (IS_G33(dev) || IS_GM45(dev) || IS_G4X(dev))
+-/* With the 945 and later, Y tiling got adjusted so that it was 32 128-byte
+- * rows, which changed the alignment requirements and fence programming.
+- */
+-#define HAS_128_BYTE_Y_TILING(dev) (IS_I9XX(dev) && !(IS_I915G(dev) || \
+- IS_I915GM(dev)))
+ #define SUPPORTS_INTEGRATED_HDMI(dev) (IS_G4X(dev))
+
+ #define PRIMARY_RINGBUFFER_SIZE (128*1024)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_gem.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_gem.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_gem.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_gem.c 2009-05-10 23:48:28.000000000 +0200
+@@ -34,6 +34,10 @@
+
+ #define I915_GEM_GPU_DOMAINS (~(I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT))
+
++static void
++i915_gem_object_set_to_gpu_domain(struct drm_gem_object *obj,
++ uint32_t read_domains,
++ uint32_t write_domain);
+ static void i915_gem_object_flush_gpu_write_domain(struct drm_gem_object *obj);
+ static void i915_gem_object_flush_gtt_write_domain(struct drm_gem_object *obj);
+ static void i915_gem_object_flush_cpu_write_domain(struct drm_gem_object *obj);
+@@ -48,7 +52,7 @@
+ static int i915_gem_object_wait_rendering(struct drm_gem_object *obj);
+ static int i915_gem_object_bind_to_gtt(struct drm_gem_object *obj,
+ unsigned alignment);
+-static int i915_gem_object_get_fence_reg(struct drm_gem_object *obj, bool write);
++static void i915_gem_object_get_fence_reg(struct drm_gem_object *obj);
+ static void i915_gem_clear_fence_reg(struct drm_gem_object *obj);
+ static int i915_gem_evict_something(struct drm_device *dev);
+ static int i915_gem_phys_pwrite(struct drm_device *dev, struct drm_gem_object *obj,
+@@ -563,7 +567,6 @@
+ pgoff_t page_offset;
+ unsigned long pfn;
+ int ret = 0;
+- bool write = !!(vmf->flags & FAULT_FLAG_WRITE);
+
+ /* We don't use vmf->pgoff since that has the fake offset */
+ page_offset = ((unsigned long)vmf->virtual_address - vma->vm_start) >>
+@@ -582,13 +585,8 @@
+
+ /* Need a new fence register? */
+ if (obj_priv->fence_reg == I915_FENCE_REG_NONE &&
+- obj_priv->tiling_mode != I915_TILING_NONE) {
+- ret = i915_gem_object_get_fence_reg(obj, write);
+- if (ret) {
+- mutex_unlock(&dev->struct_mutex);
+- return VM_FAULT_SIGBUS;
+- }
+- }
++ obj_priv->tiling_mode != I915_TILING_NONE)
++ i915_gem_object_get_fence_reg(obj);
+
+ pfn = ((dev->agp->base + obj_priv->gtt_offset) >> PAGE_SHIFT) +
+ page_offset;
+@@ -603,6 +601,8 @@
+ case -EAGAIN:
+ return VM_FAULT_OOM;
+ case -EFAULT:
++ case -EBUSY:
++ DRM_ERROR("can't insert pfn?? fault or busy...\n");
+ return VM_FAULT_SIGBUS;
+ default:
+ return VM_FAULT_NOPAGE;
+@@ -678,30 +678,6 @@
+ return ret;
+ }
+
+-static void
+-i915_gem_free_mmap_offset(struct drm_gem_object *obj)
+-{
+- struct drm_device *dev = obj->dev;
+- struct drm_i915_gem_object *obj_priv = obj->driver_private;
+- struct drm_gem_mm *mm = dev->mm_private;
+- struct drm_map_list *list;
+-
+- list = &obj->map_list;
+- drm_ht_remove_item(&mm->offset_hash, &list->hash);
+-
+- if (list->file_offset_node) {
+- drm_mm_put_block(list->file_offset_node);
+- list->file_offset_node = NULL;
+- }
+-
+- if (list->map) {
+- drm_free(list->map, sizeof(struct drm_map), DRM_MEM_DRIVER);
+- list->map = NULL;
+- }
+-
+- obj_priv->mmap_offset = 0;
+-}
+-
+ /**
+ * i915_gem_get_gtt_alignment - return required GTT alignment for an object
+ * @obj: object to check
+@@ -776,11 +752,8 @@
+
+ if (!obj_priv->mmap_offset) {
+ ret = i915_gem_create_mmap_offset(obj);
+- if (ret) {
+- drm_gem_object_unreference(obj);
+- mutex_unlock(&dev->struct_mutex);
++ if (ret)
+ return ret;
+- }
+ }
+
+ args->offset = obj_priv->mmap_offset;
+@@ -1051,9 +1024,6 @@
+ drm_i915_private_t *dev_priv = dev->dev_private;
+ uint32_t seqno;
+
+- if (!dev_priv->hw_status_page)
+- return;
+-
+ seqno = i915_get_gem_seqno(dev);
+
+ while (!list_empty(&dev_priv->mm.request_list)) {
+@@ -1241,7 +1211,7 @@
+ /**
+ * Unbinds an object from the GTT aperture.
+ */
+-int
++static int
+ i915_gem_object_unbind(struct drm_gem_object *obj)
+ {
+ struct drm_device *dev = obj->dev;
+@@ -1475,26 +1445,21 @@
+ drm_i915_private_t *dev_priv = dev->dev_private;
+ struct drm_i915_gem_object *obj_priv = obj->driver_private;
+ int regnum = obj_priv->fence_reg;
+- int tile_width;
+- uint32_t fence_reg, val;
++ uint32_t val;
+ uint32_t pitch_val;
+
+ if ((obj_priv->gtt_offset & ~I915_FENCE_START_MASK) ||
+ (obj_priv->gtt_offset & (obj->size - 1))) {
+- WARN(1, "%s: object 0x%08x not 1M or size (0x%zx) aligned\n",
+- __func__, obj_priv->gtt_offset, obj->size);
++ WARN(1, "%s: object not 1M or size aligned\n", __func__);
+ return;
+ }
+
+- if (obj_priv->tiling_mode == I915_TILING_Y &&
+- HAS_128_BYTE_Y_TILING(dev))
+- tile_width = 128;
++ if (obj_priv->tiling_mode == I915_TILING_Y && (IS_I945G(dev) ||
++ IS_I945GM(dev) ||
++ IS_G33(dev)))
++ pitch_val = (obj_priv->stride / 128) - 1;
+ else
+- tile_width = 512;
+-
+- /* Note: pitch better be a power of two tile widths */
+- pitch_val = obj_priv->stride / tile_width;
+- pitch_val = ffs(pitch_val) - 1;
++ pitch_val = (obj_priv->stride / 512) - 1;
+
+ val = obj_priv->gtt_offset;
+ if (obj_priv->tiling_mode == I915_TILING_Y)
+@@ -1503,11 +1468,7 @@
+ val |= pitch_val << I830_FENCE_PITCH_SHIFT;
+ val |= I830_FENCE_REG_VALID;
+
+- if (regnum < 8)
+- fence_reg = FENCE_REG_830_0 + (regnum * 4);
+- else
+- fence_reg = FENCE_REG_945_8 + ((regnum - 8) * 4);
+- I915_WRITE(fence_reg, val);
++ I915_WRITE(FENCE_REG_830_0 + (regnum * 4), val);
+ }
+
+ static void i830_write_fence_reg(struct drm_i915_fence_reg *reg)
+@@ -1522,8 +1483,7 @@
+
+ if ((obj_priv->gtt_offset & ~I915_FENCE_START_MASK) ||
+ (obj_priv->gtt_offset & (obj->size - 1))) {
+- WARN(1, "%s: object 0x%08x not 1M or size aligned\n",
+- __func__, obj_priv->gtt_offset);
++ WARN(1, "%s: object not 1M or size aligned\n", __func__);
+ return;
+ }
+
+@@ -1543,7 +1503,6 @@
+ /**
+ * i915_gem_object_get_fence_reg - set up a fence reg for an object
+ * @obj: object to map through a fence reg
+- * @write: object is about to be written
+ *
+ * When mapping objects through the GTT, userspace wants to be able to write
+ * to them without having to worry about swizzling if the object is tiled.
+@@ -1554,77 +1513,49 @@
+ * It then sets up the reg based on the object's properties: address, pitch
+ * and tiling format.
+ */
+-static int
+-i915_gem_object_get_fence_reg(struct drm_gem_object *obj, bool write)
++static void
++i915_gem_object_get_fence_reg(struct drm_gem_object *obj)
+ {
+ struct drm_device *dev = obj->dev;
+ struct drm_i915_private *dev_priv = dev->dev_private;
+ struct drm_i915_gem_object *obj_priv = obj->driver_private;
+ struct drm_i915_fence_reg *reg = NULL;
+- struct drm_i915_gem_object *old_obj_priv = NULL;
+- int i, ret, avail;
++ int i, ret;
+
+ switch (obj_priv->tiling_mode) {
+ case I915_TILING_NONE:
+ WARN(1, "allocating a fence for non-tiled object?\n");
+ break;
+ case I915_TILING_X:
+- if (!obj_priv->stride)
+- return -EINVAL;
+- WARN((obj_priv->stride & (512 - 1)),
+- "object 0x%08x is X tiled but has non-512B pitch\n",
+- obj_priv->gtt_offset);
++ WARN(obj_priv->stride & (512 - 1),
++ "object is X tiled but has non-512B pitch\n");
+ break;
+ case I915_TILING_Y:
+- if (!obj_priv->stride)
+- return -EINVAL;
+- WARN((obj_priv->stride & (128 - 1)),
+- "object 0x%08x is Y tiled but has non-128B pitch\n",
+- obj_priv->gtt_offset);
++ WARN(obj_priv->stride & (128 - 1),
++ "object is Y tiled but has non-128B pitch\n");
+ break;
+ }
+
+ /* First try to find a free reg */
+-try_again:
+- avail = 0;
+ for (i = dev_priv->fence_reg_start; i < dev_priv->num_fence_regs; i++) {
+ reg = &dev_priv->fence_regs[i];
+ if (!reg->obj)
+ break;
+-
+- old_obj_priv = reg->obj->driver_private;
+- if (!old_obj_priv->pin_count)
+- avail++;
+ }
+
+ /* None available, try to steal one or wait for a user to finish */
+ if (i == dev_priv->num_fence_regs) {
+- uint32_t seqno = dev_priv->mm.next_gem_seqno;
++ struct drm_i915_gem_object *old_obj_priv = NULL;
+ loff_t offset;
+
+- if (avail == 0)
+- return -ENOMEM;
+-
++try_again:
++ /* Could try to use LRU here instead... */
+ for (i = dev_priv->fence_reg_start;
+ i < dev_priv->num_fence_regs; i++) {
+- uint32_t this_seqno;
+-
+ reg = &dev_priv->fence_regs[i];
+ old_obj_priv = reg->obj->driver_private;
+-
+- if (old_obj_priv->pin_count)
+- continue;
+-
+- /* i915 uses fences for GPU access to tiled buffers */
+- if (IS_I965G(dev) || !old_obj_priv->active)
++ if (!old_obj_priv->pin_count)
+ break;
+-
+- /* find the seqno of the first available fence */
+- this_seqno = old_obj_priv->last_rendering_seqno;
+- if (this_seqno != 0 &&
+- reg->obj->write_domain == 0 &&
+- i915_seqno_passed(seqno, this_seqno))
+- seqno = this_seqno;
+ }
+
+ /*
+@@ -1632,25 +1563,14 @@
+ * objects to finish before trying again.
+ */
+ if (i == dev_priv->num_fence_regs) {
+- if (seqno == dev_priv->mm.next_gem_seqno) {
+- i915_gem_flush(dev,
+- I915_GEM_GPU_DOMAINS,
+- I915_GEM_GPU_DOMAINS);
+- seqno = i915_add_request(dev,
+- I915_GEM_GPU_DOMAINS);
+- if (seqno == 0)
+- return -ENOMEM;
++ ret = i915_gem_object_wait_rendering(reg->obj);
++ if (ret) {
++ WARN(ret, "wait_rendering failed: %d\n", ret);
++ return;
+ }
+-
+- ret = i915_wait_request(dev, seqno);
+- if (ret)
+- return ret;
+ goto try_again;
+ }
+
+- BUG_ON(old_obj_priv->active ||
+- (reg->obj->write_domain & I915_GEM_GPU_DOMAINS));
+-
+ /*
+ * Zap this virtual mapping so we can set up a fence again
+ * for this object next time we need it.
+@@ -1671,8 +1591,6 @@
+ i915_write_fence_reg(reg);
+ else
+ i830_write_fence_reg(reg);
+-
+- return 0;
+ }
+
+ /**
+@@ -1691,17 +1609,8 @@
+
+ if (IS_I965G(dev))
+ I915_WRITE64(FENCE_REG_965_0 + (obj_priv->fence_reg * 8), 0);
+- else {
+- uint32_t fence_reg;
+-
+- if (obj_priv->fence_reg < 8)
+- fence_reg = FENCE_REG_830_0 + obj_priv->fence_reg * 4;
+- else
+- fence_reg = FENCE_REG_945_8 + (obj_priv->fence_reg -
+- 8) * 4;
+-
+- I915_WRITE(fence_reg, 0);
+- }
++ else
++ I915_WRITE(FENCE_REG_830_0 + (obj_priv->fence_reg * 4), 0);
+
+ dev_priv->fence_regs[obj_priv->fence_reg].obj = NULL;
+ obj_priv->fence_reg = I915_FENCE_REG_NONE;
+@@ -1722,7 +1631,7 @@
+ if (dev_priv->mm.suspended)
+ return -EBUSY;
+ if (alignment == 0)
+- alignment = i915_gem_get_gtt_alignment(obj);
++ alignment = PAGE_SIZE;
+ if (alignment & (PAGE_SIZE - 1)) {
+ DRM_ERROR("Invalid object alignment requested %u\n", alignment);
+ return -EINVAL;
+@@ -2065,28 +1974,30 @@
+ * drm_agp_chipset_flush
+ */
+ static void
+-i915_gem_object_set_to_gpu_domain(struct drm_gem_object *obj)
++i915_gem_object_set_to_gpu_domain(struct drm_gem_object *obj,
++ uint32_t read_domains,
++ uint32_t write_domain)
+ {
+ struct drm_device *dev = obj->dev;
+ struct drm_i915_gem_object *obj_priv = obj->driver_private;
+ uint32_t invalidate_domains = 0;
+ uint32_t flush_domains = 0;
+
+- BUG_ON(obj->pending_read_domains & I915_GEM_DOMAIN_CPU);
+- BUG_ON(obj->pending_write_domain == I915_GEM_DOMAIN_CPU);
++ BUG_ON(read_domains & I915_GEM_DOMAIN_CPU);
++ BUG_ON(write_domain == I915_GEM_DOMAIN_CPU);
+
+ #if WATCH_BUF
+ DRM_INFO("%s: object %p read %08x -> %08x write %08x -> %08x\n",
+ __func__, obj,
+- obj->read_domains, obj->pending_read_domains,
+- obj->write_domain, obj->pending_write_domain);
++ obj->read_domains, read_domains,
++ obj->write_domain, write_domain);
+ #endif
+ /*
+ * If the object isn't moving to a new write domain,
+ * let the object stay in multiple read domains
+ */
+- if (obj->pending_write_domain == 0)
+- obj->pending_read_domains |= obj->read_domains;
++ if (write_domain == 0)
++ read_domains |= obj->read_domains;
+ else
+ obj_priv->dirty = 1;
+
+@@ -2096,17 +2007,15 @@
+ * any read domains which differ from the old
+ * write domain
+ */
+- if (obj->write_domain &&
+- obj->write_domain != obj->pending_read_domains) {
++ if (obj->write_domain && obj->write_domain != read_domains) {
+ flush_domains |= obj->write_domain;
+- invalidate_domains |=
+- obj->pending_read_domains & ~obj->write_domain;
++ invalidate_domains |= read_domains & ~obj->write_domain;
+ }
+ /*
+ * Invalidate any read caches which may have
+ * stale data. That is, any new read domains.
+ */
+- invalidate_domains |= obj->pending_read_domains & ~obj->read_domains;
++ invalidate_domains |= read_domains & ~obj->read_domains;
+ if ((flush_domains | invalidate_domains) & I915_GEM_DOMAIN_CPU) {
+ #if WATCH_BUF
+ DRM_INFO("%s: CPU domain flush %08x invalidate %08x\n",
+@@ -2115,15 +2024,9 @@
+ i915_gem_clflush_object(obj);
+ }
+
+- /* The actual obj->write_domain will be updated with
+- * pending_write_domain after we emit the accumulated flush for all
+- * of our domain changes in execbuffers (which clears objects'
+- * write_domains). So if we have a current write domain that we
+- * aren't changing, set pending_write_domain to that.
+- */
+- if (flush_domains == 0 && obj->pending_write_domain == 0)
+- obj->pending_write_domain = obj->write_domain;
+- obj->read_domains = obj->pending_read_domains;
++ if ((write_domain | flush_domains) != 0)
++ obj->write_domain = write_domain;
++ obj->read_domains = read_domains;
+
+ dev->invalidate_domains |= invalidate_domains;
+ dev->flush_domains |= flush_domains;
+@@ -2326,8 +2229,6 @@
+ (int) reloc.offset,
+ reloc.read_domains,
+ reloc.write_domain);
+- drm_gem_object_unreference(target_obj);
+- i915_gem_object_unpin(obj);
+ return -EINVAL;
+ }
+
+@@ -2514,7 +2415,6 @@
+ struct drm_i915_gem_exec_object *exec_list = NULL;
+ struct drm_gem_object **object_list = NULL;
+ struct drm_gem_object *batch_obj;
+- struct drm_i915_gem_object *obj_priv;
+ int ret, i, pinned = 0;
+ uint64_t exec_offset;
+ uint32_t seqno, flush_domains;
+@@ -2558,15 +2458,13 @@
+ if (dev_priv->mm.wedged) {
+ DRM_ERROR("Execbuf while wedged\n");
+ mutex_unlock(&dev->struct_mutex);
+- ret = -EIO;
+- goto pre_mutex_err;
++ return -EIO;
+ }
+
+ if (dev_priv->mm.suspended) {
+ DRM_ERROR("Execbuf while VT-switched.\n");
+ mutex_unlock(&dev->struct_mutex);
+- ret = -EBUSY;
+- goto pre_mutex_err;
++ return -EBUSY;
+ }
+
+ /* Look up object handles */
+@@ -2579,15 +2477,6 @@
+ ret = -EBADF;
+ goto err;
+ }
+-
+- obj_priv = object_list[i]->driver_private;
+- if (obj_priv->in_execbuffer) {
+- DRM_ERROR("Object %p appears more than once in object list\n",
+- object_list[i]);
+- ret = -EBADF;
+- goto err;
+- }
+- obj_priv->in_execbuffer = true;
+ }
+
+ /* Pin and relocate */
+@@ -2643,7 +2532,9 @@
+ struct drm_gem_object *obj = object_list[i];
+
+ /* Compute new gpu domains and update invalidate/flush */
+- i915_gem_object_set_to_gpu_domain(obj);
++ i915_gem_object_set_to_gpu_domain(obj,
++ obj->pending_read_domains,
++ obj->pending_write_domain);
+ }
+
+ i915_verify_inactive(dev, __FILE__, __LINE__);
+@@ -2662,12 +2553,6 @@
+ (void)i915_add_request(dev, dev->flush_domains);
+ }
+
+- for (i = 0; i < args->buffer_count; i++) {
+- struct drm_gem_object *obj = object_list[i];
+-
+- obj->write_domain = obj->pending_write_domain;
+- }
+-
+ i915_verify_inactive(dev, __FILE__, __LINE__);
+
+ #if WATCH_COHERENCY
+@@ -2725,32 +2610,24 @@
+
+ i915_verify_inactive(dev, __FILE__, __LINE__);
+
++ /* Copy the new buffer offsets back to the user's exec list. */
++ ret = copy_to_user((struct drm_i915_relocation_entry __user *)
++ (uintptr_t) args->buffers_ptr,
++ exec_list,
++ sizeof(*exec_list) * args->buffer_count);
++ if (ret)
++ DRM_ERROR("failed to copy %d exec entries "
++ "back to user (%d)\n",
++ args->buffer_count, ret);
+ err:
+ for (i = 0; i < pinned; i++)
+ i915_gem_object_unpin(object_list[i]);
+
+- for (i = 0; i < args->buffer_count; i++) {
+- if (object_list[i]) {
+- obj_priv = object_list[i]->driver_private;
+- obj_priv->in_execbuffer = false;
+- }
++ for (i = 0; i < args->buffer_count; i++)
+ drm_gem_object_unreference(object_list[i]);
+- }
+
+ mutex_unlock(&dev->struct_mutex);
+
+- if (!ret) {
+- /* Copy the new buffer offsets back to the user's exec list. */
+- ret = copy_to_user((struct drm_i915_relocation_entry __user *)
+- (uintptr_t) args->buffers_ptr,
+- exec_list,
+- sizeof(*exec_list) * args->buffer_count);
+- if (ret)
+- DRM_ERROR("failed to copy %d exec entries "
+- "back to user (%d)\n",
+- args->buffer_count, ret);
+- }
+-
+ pre_mutex_err:
+ drm_free(object_list, sizeof(*object_list) * args->buffer_count,
+ DRM_MEM_DRIVER);
+@@ -2772,22 +2649,7 @@
+ ret = i915_gem_object_bind_to_gtt(obj, alignment);
+ if (ret != 0) {
+ if (ret != -EBUSY && ret != -ERESTARTSYS)
+- DRM_ERROR("Failure to bind: %d\n", ret);
+- return ret;
+- }
+- }
+- /*
+- * Pre-965 chips need a fence register set up in order to
+- * properly handle tiled surfaces.
+- */
+- if (!IS_I965G(dev) &&
+- obj_priv->fence_reg == I915_FENCE_REG_NONE &&
+- obj_priv->tiling_mode != I915_TILING_NONE) {
+- ret = i915_gem_object_get_fence_reg(obj, true);
+- if (ret != 0) {
+- if (ret != -EBUSY && ret != -ERESTARTSYS)
+- DRM_ERROR("Failure to install fence: %d\n",
+- ret);
++ DRM_ERROR("Failure to bind: %d", ret);
+ return ret;
+ }
+ }
+@@ -2861,7 +2723,6 @@
+ if (obj_priv->pin_filp != NULL && obj_priv->pin_filp != file_priv) {
+ DRM_ERROR("Already pinned in i915_gem_pin_ioctl(): %d\n",
+ args->handle);
+- drm_gem_object_unreference(obj);
+ mutex_unlock(&dev->struct_mutex);
+ return -EINVAL;
+ }
+@@ -2942,13 +2803,6 @@
+ return -EBADF;
+ }
+
+- /* Update the active list for the hardware's current position.
+- * Otherwise this only updates on a delayed timer or when irqs are
+- * actually unmasked, and our working set ends up being larger than
+- * required.
+- */
+- i915_gem_retire_requests(dev);
+-
+ obj_priv = obj->driver_private;
+ /* Don't count being on the flushing list against the object being
+ * done. Otherwise, a buffer left on the flushing list but not getting
+@@ -3001,6 +2855,9 @@
+ void i915_gem_free_object(struct drm_gem_object *obj)
+ {
+ struct drm_device *dev = obj->dev;
++ struct drm_gem_mm *mm = dev->mm_private;
++ struct drm_map_list *list;
++ struct drm_map *map;
+ struct drm_i915_gem_object *obj_priv = obj->driver_private;
+
+ while (obj_priv->pin_count > 0)
+@@ -3011,7 +2868,19 @@
+
+ i915_gem_object_unbind(obj);
+
+- i915_gem_free_mmap_offset(obj);
++ list = &obj->map_list;
++ drm_ht_remove_item(&mm->offset_hash, &list->hash);
++
++ if (list->file_offset_node) {
++ drm_mm_put_block(list->file_offset_node);
++ list->file_offset_node = NULL;
++ }
++
++ map = list->map;
++ if (map) {
++ drm_free(map, sizeof(*map), DRM_MEM_DRIVER);
++ list->map = NULL;
++ }
+
+ drm_free(obj_priv->page_cpu_valid, 1, DRM_MEM_DRIVER);
+ drm_free(obj->driver_private, 1, DRM_MEM_DRIVER);
+@@ -3050,7 +2919,7 @@
+ return 0;
+ }
+
+-int
++static int
+ i915_gem_idle(struct drm_device *dev)
+ {
+ drm_i915_private_t *dev_priv = dev->dev_private;
+@@ -3196,7 +3065,6 @@
+ if (dev_priv->hw_status_page == NULL) {
+ DRM_ERROR("Failed to map status page.\n");
+ memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
+- i915_gem_object_unpin(obj);
+ drm_gem_object_unreference(obj);
+ return -EINVAL;
+ }
+@@ -3209,31 +3077,6 @@
+ return 0;
+ }
+
+-static void
+-i915_gem_cleanup_hws(struct drm_device *dev)
+-{
+- drm_i915_private_t *dev_priv = dev->dev_private;
+- struct drm_gem_object *obj;
+- struct drm_i915_gem_object *obj_priv;
+-
+- if (dev_priv->hws_obj == NULL)
+- return;
+-
+- obj = dev_priv->hws_obj;
+- obj_priv = obj->driver_private;
+-
+- kunmap(obj_priv->page_list[0]);
+- i915_gem_object_unpin(obj);
+- drm_gem_object_unreference(obj);
+- dev_priv->hws_obj = NULL;
+-
+- memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
+- dev_priv->hw_status_page = NULL;
+-
+- /* Write high address into HWS_PGA when disabling. */
+- I915_WRITE(HWS_PGA, 0x1ffff000);
+-}
+-
+ int
+ i915_gem_init_ringbuffer(struct drm_device *dev)
+ {
+@@ -3251,7 +3094,6 @@
+ obj = drm_gem_object_alloc(dev, 128 * 1024);
+ if (obj == NULL) {
+ DRM_ERROR("Failed to allocate ringbuffer\n");
+- i915_gem_cleanup_hws(dev);
+ return -ENOMEM;
+ }
+ obj_priv = obj->driver_private;
+@@ -3259,7 +3101,6 @@
+ ret = i915_gem_object_pin(obj, 4096);
+ if (ret != 0) {
+ drm_gem_object_unreference(obj);
+- i915_gem_cleanup_hws(dev);
+ return ret;
+ }
+
+@@ -3277,9 +3118,7 @@
+ if (ring->map.handle == NULL) {
+ DRM_ERROR("Failed to map ringbuffer.\n");
+ memset(&dev_priv->ring, 0, sizeof(dev_priv->ring));
+- i915_gem_object_unpin(obj);
+ drm_gem_object_unreference(obj);
+- i915_gem_cleanup_hws(dev);
+ return -EINVAL;
+ }
+ ring->ring_obj = obj;
+@@ -3359,7 +3198,20 @@
+ dev_priv->ring.ring_obj = NULL;
+ memset(&dev_priv->ring, 0, sizeof(dev_priv->ring));
+
+- i915_gem_cleanup_hws(dev);
++ if (dev_priv->hws_obj != NULL) {
++ struct drm_gem_object *obj = dev_priv->hws_obj;
++ struct drm_i915_gem_object *obj_priv = obj->driver_private;
++
++ kunmap(obj_priv->page_list[0]);
++ i915_gem_object_unpin(obj);
++ drm_gem_object_unreference(obj);
++ dev_priv->hws_obj = NULL;
++ memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
++ dev_priv->hw_status_page = NULL;
++
++ /* Write high address into HWS_PGA when disabling. */
++ I915_WRITE(HWS_PGA, 0x1ffff000);
++ }
+ }
+
+ int
+@@ -3377,6 +3229,10 @@
+ dev_priv->mm.wedged = 0;
+ }
+
++ dev_priv->mm.gtt_mapping = io_mapping_create_wc(dev->agp->base,
++ dev->agp->agp_info.aper_size
++ * 1024 * 1024);
++
+ mutex_lock(&dev->struct_mutex);
+ dev_priv->mm.suspended = 0;
+
+@@ -3399,6 +3255,7 @@
+ i915_gem_leavevt_ioctl(struct drm_device *dev, void *data,
+ struct drm_file *file_priv)
+ {
++ drm_i915_private_t *dev_priv = dev->dev_private;
+ int ret;
+
+ if (drm_core_check_feature(dev, DRIVER_MODESET))
+@@ -3407,6 +3264,7 @@
+ ret = i915_gem_idle(dev);
+ drm_irq_uninstall(dev);
+
++ io_mapping_free(dev_priv->mm.gtt_mapping);
+ return ret;
+ }
+
+@@ -3415,9 +3273,6 @@
+ {
+ int ret;
+
+- if (drm_core_check_feature(dev, DRIVER_MODESET))
+- return;
+-
+ ret = i915_gem_idle(dev);
+ if (ret)
+ DRM_ERROR("failed to idle hardware: %d\n", ret);
+@@ -3439,7 +3294,7 @@
+ /* Old X drivers will take 0-2 for front, back, depth buffers */
+ dev_priv->fence_reg_start = 3;
+
+- if (IS_I965G(dev) || IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev))
++ if (IS_I965G(dev))
+ dev_priv->num_fence_regs = 16;
+ else
+ dev_priv->num_fence_regs = 8;
+@@ -3615,7 +3470,7 @@
+ user_data = (char __user *) (uintptr_t) args->data_ptr;
+ obj_addr = obj_priv->phys_obj->handle->vaddr + args->offset;
+
+- DRM_DEBUG("obj_addr %p, %lld\n", obj_addr, args->size);
++ DRM_ERROR("obj_addr %p, %lld\n", obj_addr, args->size);
+ ret = copy_from_user(obj_addr, user_data, args->size);
+ if (ret)
+ return -EFAULT;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_gem_tiling.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_gem_tiling.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_gem_tiling.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_gem_tiling.c 2009-05-10 23:48:28.000000000 +0200
+@@ -173,73 +173,6 @@
+ dev_priv->mm.bit_6_swizzle_y = swizzle_y;
+ }
+
+-
+-/**
+- * Returns the size of the fence for a tiled object of the given size.
+- */
+-static int
+-i915_get_fence_size(struct drm_device *dev, int size)
+-{
+- int i;
+- int start;
+-
+- if (IS_I965G(dev)) {
+- /* The 965 can have fences at any page boundary. */
+- return ALIGN(size, 4096);
+- } else {
+- /* Align the size to a power of two greater than the smallest
+- * fence size.
+- */
+- if (IS_I9XX(dev))
+- start = 1024 * 1024;
+- else
+- start = 512 * 1024;
+-
+- for (i = start; i < size; i <<= 1)
+- ;
+-
+- return i;
+- }
+-}
+-
+-/* Check pitch constriants for all chips & tiling formats */
+-static bool
+-i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode)
+-{
+- int tile_width;
+-
+- /* Linear is always fine */
+- if (tiling_mode == I915_TILING_NONE)
+- return true;
+-
+- if (tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev))
+- tile_width = 128;
+- else
+- tile_width = 512;
+-
+- /* 965+ just needs multiples of tile width */
+- if (IS_I965G(dev)) {
+- if (stride & (tile_width - 1))
+- return false;
+- return true;
+- }
+-
+- /* Pre-965 needs power of two tile widths */
+- if (stride < tile_width)
+- return false;
+-
+- if (stride & (stride - 1))
+- return false;
+-
+- /* We don't handle the aperture area covered by the fence being bigger
+- * than the object size.
+- */
+- if (i915_get_fence_size(dev, size) != size)
+- return false;
+-
+- return true;
+-}
+-
+ /**
+ * Sets the tiling mode of an object, returning the required swizzling of
+ * bit 6 of addresses in the object.
+@@ -258,11 +191,6 @@
+ return -EINVAL;
+ obj_priv = obj->driver_private;
+
+- if (!i915_tiling_ok(dev, args->stride, obj->size, args->tiling_mode)) {
+- drm_gem_object_unreference(obj);
+- return -EINVAL;
+- }
+-
+ mutex_lock(&dev->struct_mutex);
+
+ if (args->tiling_mode == I915_TILING_NONE) {
+@@ -279,29 +207,13 @@
+ args->swizzle_mode = I915_BIT_6_SWIZZLE_NONE;
+ }
+ }
+- if (args->tiling_mode != obj_priv->tiling_mode) {
+- int ret;
+-
+- /* Unbind the object, as switching tiling means we're
+- * switching the cache organization due to fencing, probably.
+- */
+- ret = i915_gem_object_unbind(obj);
+- if (ret != 0) {
+- WARN(ret != -ERESTARTSYS,
+- "failed to unbind object for tiling switch");
+- args->tiling_mode = obj_priv->tiling_mode;
+- mutex_unlock(&dev->struct_mutex);
+- drm_gem_object_unreference(obj);
+-
+- return ret;
+- }
+- obj_priv->tiling_mode = args->tiling_mode;
+- }
++ obj_priv->tiling_mode = args->tiling_mode;
+ obj_priv->stride = args->stride;
+
+- drm_gem_object_unreference(obj);
+ mutex_unlock(&dev->struct_mutex);
+
++ drm_gem_object_unreference(obj);
++
+ return 0;
+ }
+
+@@ -339,8 +251,9 @@
+ DRM_ERROR("unknown tiling mode\n");
+ }
+
+- drm_gem_object_unreference(obj);
+ mutex_unlock(&dev->struct_mutex);
+
++ drm_gem_object_unreference(obj);
++
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_irq.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_irq.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_irq.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_irq.c 2009-05-10 23:48:28.000000000 +0200
+@@ -174,19 +174,6 @@
+ return count;
+ }
+
+-u32 gm45_get_vblank_counter(struct drm_device *dev, int pipe)
+-{
+- drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
+- int reg = pipe ? PIPEB_FRMCOUNT_GM45 : PIPEA_FRMCOUNT_GM45;
+-
+- if (!i915_pipe_enabled(dev, pipe)) {
+- DRM_ERROR("trying to get vblank count for disabled pipe %d\n", pipe);
+- return 0;
+- }
+-
+- return I915_READ(reg);
+-}
+-
+ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)
+ {
+ struct drm_device *dev = (struct drm_device *) arg;
+@@ -383,13 +370,12 @@
+ drm_i915_irq_emit_t *emit = data;
+ int result;
+
++ RING_LOCK_TEST_WITH_RETURN(dev, file_priv);
++
+ if (!dev_priv) {
+ DRM_ERROR("called with no initialization\n");
+ return -EINVAL;
+ }
+-
+- RING_LOCK_TEST_WITH_RETURN(dev, file_priv);
+-
+ mutex_lock(&dev->struct_mutex);
+ result = i915_emit_irq(dev);
+ mutex_unlock(&dev->struct_mutex);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_reg.h linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_reg.h
+--- linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_reg.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_reg.h 2009-05-10 23:48:28.000000000 +0200
+@@ -184,15 +184,14 @@
+ * Fence registers
+ */
+ #define FENCE_REG_830_0 0x2000
+-#define FENCE_REG_945_8 0x3000
+ #define I830_FENCE_START_MASK 0x07f80000
+ #define I830_FENCE_TILING_Y_SHIFT 12
+-#define I830_FENCE_SIZE_BITS(size) ((ffs((size) >> 19) - 1) << 8)
++#define I830_FENCE_SIZE_BITS(size) ((get_order(size >> 19) - 1) << 8)
+ #define I830_FENCE_PITCH_SHIFT 4
+ #define I830_FENCE_REG_VALID (1<<0)
+
+ #define I915_FENCE_START_MASK 0x0ff00000
+-#define I915_FENCE_SIZE_BITS(size) ((ffs((size) >> 20) - 1) << 8)
++#define I915_FENCE_SIZE_BITS(size) ((get_order(size >> 20) - 1) << 8)
+
+ #define FENCE_REG_965_0 0x03000
+ #define I965_FENCE_PITCH_SHIFT 2
+@@ -1372,9 +1371,6 @@
+ #define PIPE_FRAME_LOW_SHIFT 24
+ #define PIPE_PIXEL_MASK 0x00ffffff
+ #define PIPE_PIXEL_SHIFT 0
+-/* GM45+ just has to be different */
+-#define PIPEA_FRMCOUNT_GM45 0x70040
+-#define PIPEA_FLIPCOUNT_GM45 0x70044
+
+ /* Cursor A & B regs */
+ #define CURACNTR 0x70080
+@@ -1443,9 +1439,6 @@
+ #define PIPEBSTAT 0x71024
+ #define PIPEBFRAMEHIGH 0x71040
+ #define PIPEBFRAMEPIXEL 0x71044
+-#define PIPEB_FRMCOUNT_GM45 0x71040
+-#define PIPEB_FLIPCOUNT_GM45 0x71044
+-
+
+ /* Display B control */
+ #define DSPBCNTR 0x71180
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_suspend.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_suspend.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/i915/i915_suspend.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/i915_suspend.c 2009-05-10 23:48:28.000000000 +0200
+@@ -119,6 +119,11 @@
+
+ /* VGA color palette registers */
+ dev_priv->saveDACMASK = I915_READ8(VGA_DACMASK);
++ /* DACCRX automatically increments during read */
++ I915_WRITE8(VGA_DACRX, 0);
++ /* Read 3 bytes of color data from each index */
++ for (i = 0; i < 256 * 3; i++)
++ dev_priv->saveDACDATA[i] = I915_READ8(VGA_DACDATA);
+
+ /* MSR bits */
+ dev_priv->saveMSR = I915_READ8(VGA_MSR_READ);
+@@ -220,6 +225,12 @@
+
+ /* VGA color palette registers */
+ I915_WRITE8(VGA_DACMASK, dev_priv->saveDACMASK);
++ /* DACCRX automatically increments during read */
++ I915_WRITE8(VGA_DACWX, 0);
++ /* Read 3 bytes of color data from each index */
++ for (i = 0; i < 256 * 3; i++)
++ I915_WRITE8(VGA_DACDATA, dev_priv->saveDACDATA[i]);
++
+ }
+
+ int i915_save_state(struct drm_device *dev)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_bios.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_bios.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_bios.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_bios.c 2009-05-10 23:48:28.000000000 +0200
+@@ -111,12 +111,6 @@
+ panel_fixed_mode->clock = dvo_timing->clock * 10;
+ panel_fixed_mode->type = DRM_MODE_TYPE_PREFERRED;
+
+- /* Some VBTs have bogus h/vtotal values */
+- if (panel_fixed_mode->hsync_end > panel_fixed_mode->htotal)
+- panel_fixed_mode->htotal = panel_fixed_mode->hsync_end + 1;
+- if (panel_fixed_mode->vsync_end > panel_fixed_mode->vtotal)
+- panel_fixed_mode->vtotal = panel_fixed_mode->vsync_end + 1;
+-
+ drm_mode_set_name(panel_fixed_mode);
+
+ dev_priv->vbt_mode = panel_fixed_mode;
+@@ -141,14 +135,6 @@
+ if (general) {
+ dev_priv->int_tv_support = general->int_tv_support;
+ dev_priv->int_crt_support = general->int_crt_support;
+- dev_priv->lvds_use_ssc = general->enable_ssc;
+-
+- if (dev_priv->lvds_use_ssc) {
+- if (IS_I855(dev_priv->dev))
+- dev_priv->lvds_ssc_freq = general->ssc_freq ? 66 : 48;
+- else
+- dev_priv->lvds_ssc_freq = general->ssc_freq ? 100 : 96;
+- }
+ }
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_display.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_display.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_display.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_display.c 2009-05-10 23:48:28.000000000 +0200
+@@ -90,12 +90,12 @@
+ #define I9XX_DOT_MAX 400000
+ #define I9XX_VCO_MIN 1400000
+ #define I9XX_VCO_MAX 2800000
+-#define I9XX_N_MIN 1
+-#define I9XX_N_MAX 6
++#define I9XX_N_MIN 3
++#define I9XX_N_MAX 8
+ #define I9XX_M_MIN 70
+ #define I9XX_M_MAX 120
+ #define I9XX_M1_MIN 10
+-#define I9XX_M1_MAX 22
++#define I9XX_M1_MAX 20
+ #define I9XX_M2_MIN 5
+ #define I9XX_M2_MAX 9
+ #define I9XX_P_SDVO_DAC_MIN 5
+@@ -189,7 +189,9 @@
+ return limit;
+ }
+
+-static void intel_clock(int refclk, intel_clock_t *clock)
++/** Derive the pixel clock for the given refclk and divisors for 8xx chips. */
++
++static void i8xx_clock(int refclk, intel_clock_t *clock)
+ {
+ clock->m = 5 * (clock->m1 + 2) + (clock->m2 + 2);
+ clock->p = clock->p1 * clock->p2;
+@@ -197,6 +199,25 @@
+ clock->dot = clock->vco / clock->p;
+ }
+
++/** Derive the pixel clock for the given refclk and divisors for 9xx chips. */
++
++static void i9xx_clock(int refclk, intel_clock_t *clock)
++{
++ clock->m = 5 * (clock->m1 + 2) + (clock->m2 + 2);
++ clock->p = clock->p1 * clock->p2;
++ clock->vco = refclk * clock->m / (clock->n + 2);
++ clock->dot = clock->vco / clock->p;
++}
++
++static void intel_clock(struct drm_device *dev, int refclk,
++ intel_clock_t *clock)
++{
++ if (IS_I9XX(dev))
++ i9xx_clock (refclk, clock);
++ else
++ i8xx_clock (refclk, clock);
++}
++
+ /**
+ * Returns whether any output on the specified pipe is of the specified type
+ */
+@@ -217,7 +238,7 @@
+ return false;
+ }
+
+-#define INTELPllInvalid(s) do { /* DRM_DEBUG(s); */ return false; } while (0)
++#define INTELPllInvalid(s) { /* ErrorF (s) */; return false; }
+ /**
+ * Returns whether the given set of divisors are valid for a given refclk with
+ * the given connectors.
+@@ -297,7 +318,7 @@
+ clock.p1 <= limit->p1.max; clock.p1++) {
+ int this_err;
+
+- intel_clock(refclk, &clock);
++ intel_clock(dev, refclk, &clock);
+
+ if (!intel_PLL_is_valid(crtc, &clock))
+ continue;
+@@ -322,7 +343,7 @@
+ udelay(20000);
+ }
+
+-static int
++static void
+ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
+ struct drm_framebuffer *old_fb)
+ {
+@@ -340,21 +361,11 @@
+ int dspstride = (pipe == 0) ? DSPASTRIDE : DSPBSTRIDE;
+ int dspcntr_reg = (pipe == 0) ? DSPACNTR : DSPBCNTR;
+ u32 dspcntr, alignment;
+- int ret;
+
+ /* no fb bound */
+ if (!crtc->fb) {
+ DRM_DEBUG("No FB bound\n");
+- return 0;
+- }
+-
+- switch (pipe) {
+- case 0:
+- case 1:
+- break;
+- default:
+- DRM_ERROR("Can't update pipe %d in SAREA\n", pipe);
+- return -EINVAL;
++ return;
+ }
+
+ intel_fb = to_intel_framebuffer(crtc->fb);
+@@ -366,30 +377,28 @@
+ alignment = 64 * 1024;
+ break;
+ case I915_TILING_X:
+- /* pin() will align the object as required by fence */
+- alignment = 0;
++ if (IS_I9XX(dev))
++ alignment = 1024 * 1024;
++ else
++ alignment = 512 * 1024;
+ break;
+ case I915_TILING_Y:
+ /* FIXME: Is this true? */
+ DRM_ERROR("Y tiled not allowed for scan out buffers\n");
+- return -EINVAL;
++ return;
+ default:
+ BUG();
+ }
+
+- mutex_lock(&dev->struct_mutex);
+- ret = i915_gem_object_pin(intel_fb->obj, alignment);
+- if (ret != 0) {
+- mutex_unlock(&dev->struct_mutex);
+- return ret;
+- }
++ if (i915_gem_object_pin(intel_fb->obj, alignment))
++ return;
+
+- ret = i915_gem_object_set_to_gtt_domain(intel_fb->obj, 1);
+- if (ret != 0) {
+- i915_gem_object_unpin(intel_fb->obj);
+- mutex_unlock(&dev->struct_mutex);
+- return ret;
+- }
++ i915_gem_object_set_to_gtt_domain(intel_fb->obj, 1);
++
++ Start = obj_priv->gtt_offset;
++ Offset = y * crtc->fb->pitch + x * (crtc->fb->bits_per_pixel / 8);
++
++ I915_WRITE(dspstride, crtc->fb->pitch);
+
+ dspcntr = I915_READ(dspcntr_reg);
+ /* Mask out pixel format bits in case we change it */
+@@ -410,17 +419,11 @@
+ break;
+ default:
+ DRM_ERROR("Unknown color depth\n");
+- i915_gem_object_unpin(intel_fb->obj);
+- mutex_unlock(&dev->struct_mutex);
+- return -EINVAL;
++ return;
+ }
+ I915_WRITE(dspcntr_reg, dspcntr);
+
+- Start = obj_priv->gtt_offset;
+- Offset = y * crtc->fb->pitch + x * (crtc->fb->bits_per_pixel / 8);
+-
+ DRM_DEBUG("Writing base %08lX %08lX %d %d\n", Start, Offset, x, y);
+- I915_WRITE(dspstride, crtc->fb->pitch);
+ if (IS_I965G(dev)) {
+ I915_WRITE(dspbase, Offset);
+ I915_READ(dspbase);
+@@ -437,24 +440,27 @@
+ intel_fb = to_intel_framebuffer(old_fb);
+ i915_gem_object_unpin(intel_fb->obj);
+ }
+- mutex_unlock(&dev->struct_mutex);
+
+ if (!dev->primary->master)
+- return 0;
++ return;
+
+ master_priv = dev->primary->master->driver_priv;
+ if (!master_priv->sarea_priv)
+- return 0;
++ return;
+
+- if (pipe) {
+- master_priv->sarea_priv->pipeB_x = x;
+- master_priv->sarea_priv->pipeB_y = y;
+- } else {
++ switch (pipe) {
++ case 0:
+ master_priv->sarea_priv->pipeA_x = x;
+ master_priv->sarea_priv->pipeA_y = y;
++ break;
++ case 1:
++ master_priv->sarea_priv->pipeB_x = x;
++ master_priv->sarea_priv->pipeB_y = y;
++ break;
++ default:
++ DRM_ERROR("Can't update pipe %d in SAREA\n", pipe);
++ break;
+ }
+-
+- return 0;
+ }
+
+
+@@ -702,11 +708,11 @@
+ return 1;
+ }
+
+-static int intel_crtc_mode_set(struct drm_crtc *crtc,
+- struct drm_display_mode *mode,
+- struct drm_display_mode *adjusted_mode,
+- int x, int y,
+- struct drm_framebuffer *old_fb)
++static void intel_crtc_mode_set(struct drm_crtc *crtc,
++ struct drm_display_mode *mode,
++ struct drm_display_mode *adjusted_mode,
++ int x, int y,
++ struct drm_framebuffer *old_fb)
+ {
+ struct drm_device *dev = crtc->dev;
+ struct drm_i915_private *dev_priv = dev->dev_private;
+@@ -726,14 +732,13 @@
+ int dspsize_reg = (pipe == 0) ? DSPASIZE : DSPBSIZE;
+ int dsppos_reg = (pipe == 0) ? DSPAPOS : DSPBPOS;
+ int pipesrc_reg = (pipe == 0) ? PIPEASRC : PIPEBSRC;
+- int refclk, num_outputs = 0;
++ int refclk;
+ intel_clock_t clock;
+ u32 dpll = 0, fp = 0, dspcntr, pipeconf;
+ bool ok, is_sdvo = false, is_dvo = false;
+ bool is_crt = false, is_lvds = false, is_tv = false;
+ struct drm_mode_config *mode_config = &dev->mode_config;
+ struct drm_connector *connector;
+- int ret;
+
+ drm_vblank_pre_modeset(dev, pipe);
+
+@@ -750,8 +755,6 @@
+ case INTEL_OUTPUT_SDVO:
+ case INTEL_OUTPUT_HDMI:
+ is_sdvo = true;
+- if (intel_output->needs_tv_clock)
+- is_tv = true;
+ break;
+ case INTEL_OUTPUT_DVO:
+ is_dvo = true;
+@@ -763,14 +766,9 @@
+ is_crt = true;
+ break;
+ }
+-
+- num_outputs++;
+ }
+
+- if (is_lvds && dev_priv->lvds_use_ssc && num_outputs < 2) {
+- refclk = dev_priv->lvds_ssc_freq * 1000;
+- DRM_DEBUG("using SSC reference clock of %d MHz\n", refclk / 1000);
+- } else if (IS_I9XX(dev)) {
++ if (IS_I9XX(dev)) {
+ refclk = 96000;
+ } else {
+ refclk = 48000;
+@@ -779,7 +777,7 @@
+ ok = intel_find_best_PLL(crtc, adjusted_mode->clock, refclk, &clock);
+ if (!ok) {
+ DRM_ERROR("Couldn't find PLL settings for mode!\n");
+- return -EINVAL;
++ return;
+ }
+
+ fp = clock.n << 16 | clock.m1 << 8 | clock.m2;
+@@ -829,14 +827,11 @@
+ }
+ }
+
+- if (is_sdvo && is_tv)
+- dpll |= PLL_REF_INPUT_TVCLKINBC;
+- else if (is_tv)
++ if (is_tv) {
+ /* XXX: just matching BIOS for now */
+- /* dpll |= PLL_REF_INPUT_TVCLKINBC; */
++/* dpll |= PLL_REF_INPUT_TVCLKINBC; */
+ dpll |= 3;
+- else if (is_lvds && dev_priv->lvds_use_ssc && num_outputs < 2)
+- dpll |= PLLB_REF_INPUT_SPREADSPECTRUMIN;
++ }
+ else
+ dpll |= PLL_REF_INPUT_DREFCLK;
+
+@@ -953,13 +948,9 @@
+ I915_WRITE(dspcntr_reg, dspcntr);
+
+ /* Flush the plane changes */
+- ret = intel_pipe_set_base(crtc, x, y, old_fb);
+- if (ret != 0)
+- return ret;
++ intel_pipe_set_base(crtc, x, y, old_fb);
+
+ drm_vblank_post_modeset(dev, pipe);
+-
+- return 0;
+ }
+
+ /** Loads the palette/gamma unit for the CRTC with the prepared values */
+@@ -1008,7 +999,6 @@
+ temp = CURSOR_MODE_DISABLE;
+ addr = 0;
+ bo = NULL;
+- mutex_lock(&dev->struct_mutex);
+ goto finish;
+ }
+
+@@ -1031,19 +1021,18 @@
+ }
+
+ /* we only need to pin inside GTT if cursor is non-phy */
+- mutex_lock(&dev->struct_mutex);
+ if (!dev_priv->cursor_needs_physical) {
+ ret = i915_gem_object_pin(bo, PAGE_SIZE);
+ if (ret) {
+ DRM_ERROR("failed to pin cursor bo\n");
+- goto fail_locked;
++ goto fail;
+ }
+ addr = obj_priv->gtt_offset;
+ } else {
+ ret = i915_gem_attach_phys_object(dev, bo, (pipe == 0) ? I915_GEM_PHYS_CURSOR_0 : I915_GEM_PHYS_CURSOR_1);
+ if (ret) {
+ DRM_ERROR("failed to attach phys object\n");
+- goto fail_locked;
++ goto fail;
+ }
+ addr = obj_priv->phys_obj->handle->busaddr;
+ }
+@@ -1063,9 +1052,10 @@
+ i915_gem_detach_phys_object(dev, intel_crtc->cursor_bo);
+ } else
+ i915_gem_object_unpin(intel_crtc->cursor_bo);
++ mutex_lock(&dev->struct_mutex);
+ drm_gem_object_unreference(intel_crtc->cursor_bo);
++ mutex_unlock(&dev->struct_mutex);
+ }
+- mutex_unlock(&dev->struct_mutex);
+
+ intel_crtc->cursor_addr = addr;
+ intel_crtc->cursor_bo = bo;
+@@ -1073,7 +1063,6 @@
+ return 0;
+ fail:
+ mutex_lock(&dev->struct_mutex);
+-fail_locked:
+ drm_gem_object_unreference(bo);
+ mutex_unlock(&dev->struct_mutex);
+ return ret;
+@@ -1301,7 +1290,7 @@
+ }
+
+ /* XXX: Handle the 100Mhz refclk */
+- intel_clock(96000, &clock);
++ i9xx_clock(96000, &clock);
+ } else {
+ bool is_lvds = (pipe == 1) && (I915_READ(LVDS) & LVDS_PORT_EN);
+
+@@ -1313,9 +1302,9 @@
+ if ((dpll & PLL_REF_INPUT_MASK) ==
+ PLLB_REF_INPUT_SPREADSPECTRUMIN) {
+ /* XXX: might not be 66MHz */
+- intel_clock(66000, &clock);
++ i8xx_clock(66000, &clock);
+ } else
+- intel_clock(48000, &clock);
++ i8xx_clock(48000, &clock);
+ } else {
+ if (dpll & PLL_P1_DIVIDE_BY_TWO)
+ clock.p1 = 2;
+@@ -1328,7 +1317,7 @@
+ else
+ clock.p2 = 2;
+
+- intel_clock(48000, &clock);
++ i8xx_clock(48000, &clock);
+ }
+ }
+
+@@ -1463,7 +1452,6 @@
+
+ static void intel_setup_outputs(struct drm_device *dev)
+ {
+- struct drm_i915_private *dev_priv = dev->dev_private;
+ struct drm_connector *connector;
+
+ intel_crt_init(dev);
+@@ -1475,16 +1463,13 @@
+ if (IS_I9XX(dev)) {
+ int found;
+
+- if (I915_READ(SDVOB) & SDVO_DETECTED) {
+- found = intel_sdvo_init(dev, SDVOB);
+- if (!found && SUPPORTS_INTEGRATED_HDMI(dev))
+- intel_hdmi_init(dev, SDVOB);
+- }
+- if (!IS_G4X(dev) || (I915_READ(SDVOB) & SDVO_DETECTED)) {
+- found = intel_sdvo_init(dev, SDVOC);
+- if (!found && SUPPORTS_INTEGRATED_HDMI(dev))
+- intel_hdmi_init(dev, SDVOC);
+- }
++ found = intel_sdvo_init(dev, SDVOB);
++ if (!found && SUPPORTS_INTEGRATED_HDMI(dev))
++ intel_hdmi_init(dev, SDVOB);
++
++ found = intel_sdvo_init(dev, SDVOC);
++ if (!found && SUPPORTS_INTEGRATED_HDMI(dev))
++ intel_hdmi_init(dev, SDVOC);
+ } else
+ intel_dvo_init(dev);
+
+@@ -1607,9 +1592,7 @@
+
+ ret = intel_framebuffer_create(dev, mode_cmd, &fb, obj);
+ if (ret) {
+- mutex_lock(&dev->struct_mutex);
+ drm_gem_object_unreference(obj);
+- mutex_unlock(&dev->struct_mutex);
+ return NULL;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_drv.h linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_drv.h
+--- linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_drv.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_drv.h 2009-05-10 23:48:28.000000000 +0200
+@@ -82,7 +82,6 @@
+ struct intel_i2c_chan *i2c_bus; /* for control functions */
+ struct intel_i2c_chan *ddc_bus; /* for DDC only stuff */
+ bool load_detect_temp;
+- bool needs_tv_clock;
+ void *dev_priv;
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_fb.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_fb.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_fb.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_fb.c 2009-05-10 23:48:28.000000000 +0200
+@@ -473,7 +473,7 @@
+ ret = intel_framebuffer_create(dev, &mode_cmd, &fb, fbo);
+ if (ret) {
+ DRM_ERROR("failed to allocate fb.\n");
+- goto out_unpin;
++ goto out_unref;
+ }
+
+ list_add(&fb->filp_head, &dev->mode_config.fb_kernel_list);
+@@ -484,7 +484,7 @@
+ info = framebuffer_alloc(sizeof(struct intelfb_par), device);
+ if (!info) {
+ ret = -ENOMEM;
+- goto out_unpin;
++ goto out_unref;
+ }
+
+ par = info->par;
+@@ -513,7 +513,7 @@
+ size);
+ if (!info->screen_base) {
+ ret = -ENOSPC;
+- goto out_unpin;
++ goto out_unref;
+ }
+ info->screen_size = size;
+
+@@ -608,8 +608,6 @@
+ mutex_unlock(&dev->struct_mutex);
+ return 0;
+
+-out_unpin:
+- i915_gem_object_unpin(fbo);
+ out_unref:
+ drm_gem_object_unreference(fbo);
+ mutex_unlock(&dev->struct_mutex);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_lvds.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_lvds.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_lvds.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_lvds.c 2009-05-10 23:48:28.000000000 +0200
+@@ -27,7 +27,6 @@
+ * Jesse Barnes <jesse.barnes@intel.com>
+ */
+
+-#include <linux/dmi.h>
+ #include <linux/i2c.h>
+ #include "drmP.h"
+ #include "drm.h"
+@@ -312,8 +311,10 @@
+ if (dev_priv->panel_fixed_mode != NULL) {
+ struct drm_display_mode *mode;
+
++ mutex_unlock(&dev->mode_config.mutex);
+ mode = drm_mode_duplicate(dev, dev_priv->panel_fixed_mode);
+ drm_mode_probed_add(connector, mode);
++ mutex_unlock(&dev->mode_config.mutex);
+
+ return 1;
+ }
+@@ -404,16 +405,6 @@
+ u32 lvds;
+ int pipe;
+
+- /* Blacklist machines that we know falsely report LVDS. */
+- /* FIXME: add a check for the Aopen Mini PC */
+-
+- /* Apple Mac Mini Core Duo and Mac Mini Core 2 Duo */
+- if(dmi_match(DMI_PRODUCT_NAME, "Macmini1,1") ||
+- dmi_match(DMI_PRODUCT_NAME, "Macmini2,1")) {
+- DRM_DEBUG("Skipping LVDS initialization for Apple Mac Mini\n");
+- return;
+- }
+-
+ intel_output = kzalloc(sizeof(struct intel_output), GFP_KERNEL);
+ if (!intel_output) {
+ return;
+@@ -467,7 +458,7 @@
+ dev_priv->panel_fixed_mode =
+ drm_mode_duplicate(dev, scan);
+ mutex_unlock(&dev->mode_config.mutex);
+- goto out;
++ goto out; /* FIXME: check for quirks */
+ }
+ mutex_unlock(&dev->mode_config.mutex);
+ }
+@@ -481,6 +472,8 @@
+ if (dev_priv->panel_fixed_mode) {
+ dev_priv->panel_fixed_mode->type |=
+ DRM_MODE_TYPE_PREFERRED;
++ drm_mode_probed_add(connector,
++ dev_priv->panel_fixed_mode);
+ goto out;
+ }
+ }
+@@ -499,7 +492,7 @@
+ if (dev_priv->panel_fixed_mode) {
+ dev_priv->panel_fixed_mode->type |=
+ DRM_MODE_TYPE_PREFERRED;
+- goto out;
++ goto out; /* FIXME: check for quirks */
+ }
+ }
+
+@@ -507,6 +500,38 @@
+ if (!dev_priv->panel_fixed_mode)
+ goto failed;
+
++ /* FIXME: detect aopen & mac mini type stuff automatically? */
++ /*
++ * Blacklist machines with BIOSes that list an LVDS panel without
++ * actually having one.
++ */
++ if (IS_I945GM(dev)) {
++ /* aopen mini pc */
++ if (dev->pdev->subsystem_vendor == 0xa0a0)
++ goto failed;
++
++ if ((dev->pdev->subsystem_vendor == 0x8086) &&
++ (dev->pdev->subsystem_device == 0x7270)) {
++ /* It's a Mac Mini or Macbook Pro.
++ *
++ * Apple hardware is out to get us. The macbook pro
++ * has a real LVDS panel, but the mac mini does not,
++ * and they have the same device IDs. We'll
++ * distinguish by panel size, on the assumption
++ * that Apple isn't about to make any machines with an
++ * 800x600 display.
++ */
++
++ if (dev_priv->panel_fixed_mode != NULL &&
++ dev_priv->panel_fixed_mode->hdisplay == 800 &&
++ dev_priv->panel_fixed_mode->vdisplay == 600) {
++ DRM_DEBUG("Suspected Mac Mini, ignoring the LVDS\n");
++ goto failed;
++ }
++ }
++ }
++
++
+ out:
+ drm_sysfs_connector_add(connector);
+ return;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_sdvo.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_sdvo.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_sdvo.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_sdvo.c 2009-05-10 23:48:28.000000000 +0200
+@@ -40,59 +40,13 @@
+ struct intel_sdvo_priv {
+ struct intel_i2c_chan *i2c_bus;
+ int slaveaddr;
+-
+- /* Register for the SDVO device: SDVOB or SDVOC */
+ int output_device;
+
+- /* Active outputs controlled by this SDVO output */
+- uint16_t controlled_output;
++ u16 active_outputs;
+
+- /*
+- * Capabilities of the SDVO device returned by
+- * i830_sdvo_get_capabilities()
+- */
+ struct intel_sdvo_caps caps;
+-
+- /* Pixel clock limitations reported by the SDVO device, in kHz */
+ int pixel_clock_min, pixel_clock_max;
+
+- /**
+- * This is set if we're going to treat the device as TV-out.
+- *
+- * While we have these nice friendly flags for output types that ought
+- * to decide this for us, the S-Video output on our HDMI+S-Video card
+- * shows up as RGB1 (VGA).
+- */
+- bool is_tv;
+-
+- /**
+- * This is set if we treat the device as HDMI, instead of DVI.
+- */
+- bool is_hdmi;
+-
+- /**
+- * Returned SDTV resolutions allowed for the current format, if the
+- * device reported it.
+- */
+- struct intel_sdvo_sdtv_resolution_reply sdtv_resolutions;
+-
+- /**
+- * Current selected TV format.
+- *
+- * This is stored in the same structure that's passed to the device, for
+- * convenience.
+- */
+- struct intel_sdvo_tv_format tv_format;
+-
+- /*
+- * supported encoding mode, used to determine whether HDMI is
+- * supported
+- */
+- struct intel_sdvo_encode encode;
+-
+- /* DDC bus used by this SDVO output */
+- uint8_t ddc_bus;
+-
+ int save_sdvo_mult;
+ u16 save_active_outputs;
+ struct intel_sdvo_dtd save_input_dtd_1, save_input_dtd_2;
+@@ -193,9 +147,9 @@
+
+ #define SDVO_CMD_NAME_ENTRY(cmd) {cmd, #cmd}
+ /** Mapping of command numbers to names, for debug output */
+-static const struct _sdvo_cmd_name {
+- u8 cmd;
+- char *name;
++const static struct _sdvo_cmd_name {
++ u8 cmd;
++ char *name;
+ } sdvo_cmd_names[] = {
+ SDVO_CMD_NAME_ENTRY(SDVO_CMD_RESET),
+ SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_DEVICE_CAPS),
+@@ -232,35 +186,8 @@
+ SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SUPPORTED_TV_FORMATS),
+ SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_TV_FORMAT),
+ SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_TV_FORMAT),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SUPPORTED_POWER_STATES),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_POWER_STATE),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_ENCODER_POWER_STATE),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_DISPLAY_POWER_STATE),
++ SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_TV_RESOLUTION_SUPPORT),
+ SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_CONTROL_BUS_SWITCH),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SDTV_RESOLUTION_SUPPORT),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SCALED_HDTV_RESOLUTION_SUPPORT),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SUPPORTED_ENHANCEMENTS),
+- /* HDMI op code */
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SUPP_ENCODE),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_ENCODE),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_ENCODE),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_PIXEL_REPLI),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_PIXEL_REPLI),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_COLORIMETRY_CAP),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_COLORIMETRY),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_COLORIMETRY),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_AUDIO_ENCRYPT_PREFER),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_AUDIO_STAT),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_AUDIO_STAT),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HBUF_INDEX),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_HBUF_INDEX),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HBUF_INFO),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HBUF_AV_SPLIT),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_HBUF_AV_SPLIT),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HBUF_TXRATE),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_HBUF_TXRATE),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_HBUF_DATA),
+- SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HBUF_DATA),
+ };
+
+ #define SDVO_NAME(dev_priv) ((dev_priv)->output_device == SDVOB ? "SDVOB" : "SDVOC")
+@@ -579,50 +506,6 @@
+ SDVO_CMD_SET_OUTPUT_TIMINGS_PART1, dtd);
+ }
+
+-static bool
+-intel_sdvo_create_preferred_input_timing(struct intel_output *output,
+- uint16_t clock,
+- uint16_t width,
+- uint16_t height)
+-{
+- struct intel_sdvo_preferred_input_timing_args args;
+- uint8_t status;
+-
+- args.clock = clock;
+- args.width = width;
+- args.height = height;
+- intel_sdvo_write_cmd(output, SDVO_CMD_CREATE_PREFERRED_INPUT_TIMING,
+- &args, sizeof(args));
+- status = intel_sdvo_read_response(output, NULL, 0);
+- if (status != SDVO_CMD_STATUS_SUCCESS)
+- return false;
+-
+- return true;
+-}
+-
+-static bool intel_sdvo_get_preferred_input_timing(struct intel_output *output,
+- struct intel_sdvo_dtd *dtd)
+-{
+- bool status;
+-
+- intel_sdvo_write_cmd(output, SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART1,
+- NULL, 0);
+-
+- status = intel_sdvo_read_response(output, &dtd->part1,
+- sizeof(dtd->part1));
+- if (status != SDVO_CMD_STATUS_SUCCESS)
+- return false;
+-
+- intel_sdvo_write_cmd(output, SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART2,
+- NULL, 0);
+-
+- status = intel_sdvo_read_response(output, &dtd->part2,
+- sizeof(dtd->part2));
+- if (status != SDVO_CMD_STATUS_SUCCESS)
+- return false;
+-
+- return false;
+-}
+
+ static int intel_sdvo_get_clock_rate_mult(struct intel_output *intel_output)
+ {
+@@ -653,12 +536,36 @@
+ return true;
+ }
+
+-static void intel_sdvo_get_dtd_from_mode(struct intel_sdvo_dtd *dtd,
+- struct drm_display_mode *mode)
++static bool intel_sdvo_mode_fixup(struct drm_encoder *encoder,
++ struct drm_display_mode *mode,
++ struct drm_display_mode *adjusted_mode)
+ {
+- uint16_t width, height;
+- uint16_t h_blank_len, h_sync_len, v_blank_len, v_sync_len;
+- uint16_t h_sync_offset, v_sync_offset;
++ /* Make the CRTC code factor in the SDVO pixel multiplier. The SDVO
++ * device will be told of the multiplier during mode_set.
++ */
++ adjusted_mode->clock *= intel_sdvo_get_pixel_multiplier(mode);
++ return true;
++}
++
++static void intel_sdvo_mode_set(struct drm_encoder *encoder,
++ struct drm_display_mode *mode,
++ struct drm_display_mode *adjusted_mode)
++{
++ struct drm_device *dev = encoder->dev;
++ struct drm_i915_private *dev_priv = dev->dev_private;
++ struct drm_crtc *crtc = encoder->crtc;
++ struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
++ struct intel_output *intel_output = enc_to_intel_output(encoder);
++ struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
++ u16 width, height;
++ u16 h_blank_len, h_sync_len, v_blank_len, v_sync_len;
++ u16 h_sync_offset, v_sync_offset;
++ u32 sdvox;
++ struct intel_sdvo_dtd output_dtd;
++ int sdvo_pixel_multiply;
++
++ if (!mode)
++ return;
+
+ width = mode->crtc_hdisplay;
+ height = mode->crtc_vdisplay;
+@@ -673,423 +580,93 @@
+ h_sync_offset = mode->crtc_hsync_start - mode->crtc_hblank_start;
+ v_sync_offset = mode->crtc_vsync_start - mode->crtc_vblank_start;
+
+- dtd->part1.clock = mode->clock / 10;
+- dtd->part1.h_active = width & 0xff;
+- dtd->part1.h_blank = h_blank_len & 0xff;
+- dtd->part1.h_high = (((width >> 8) & 0xf) << 4) |
++ output_dtd.part1.clock = mode->clock / 10;
++ output_dtd.part1.h_active = width & 0xff;
++ output_dtd.part1.h_blank = h_blank_len & 0xff;
++ output_dtd.part1.h_high = (((width >> 8) & 0xf) << 4) |
+ ((h_blank_len >> 8) & 0xf);
+- dtd->part1.v_active = height & 0xff;
+- dtd->part1.v_blank = v_blank_len & 0xff;
+- dtd->part1.v_high = (((height >> 8) & 0xf) << 4) |
++ output_dtd.part1.v_active = height & 0xff;
++ output_dtd.part1.v_blank = v_blank_len & 0xff;
++ output_dtd.part1.v_high = (((height >> 8) & 0xf) << 4) |
+ ((v_blank_len >> 8) & 0xf);
+
+- dtd->part2.h_sync_off = h_sync_offset;
+- dtd->part2.h_sync_width = h_sync_len & 0xff;
+- dtd->part2.v_sync_off_width = (v_sync_offset & 0xf) << 4 |
++ output_dtd.part2.h_sync_off = h_sync_offset;
++ output_dtd.part2.h_sync_width = h_sync_len & 0xff;
++ output_dtd.part2.v_sync_off_width = (v_sync_offset & 0xf) << 4 |
+ (v_sync_len & 0xf);
+- dtd->part2.sync_off_width_high = ((h_sync_offset & 0x300) >> 2) |
++ output_dtd.part2.sync_off_width_high = ((h_sync_offset & 0x300) >> 2) |
+ ((h_sync_len & 0x300) >> 4) | ((v_sync_offset & 0x30) >> 2) |
+ ((v_sync_len & 0x30) >> 4);
+
+- dtd->part2.dtd_flags = 0x18;
++ output_dtd.part2.dtd_flags = 0x18;
+ if (mode->flags & DRM_MODE_FLAG_PHSYNC)
+- dtd->part2.dtd_flags |= 0x2;
++ output_dtd.part2.dtd_flags |= 0x2;
+ if (mode->flags & DRM_MODE_FLAG_PVSYNC)
+- dtd->part2.dtd_flags |= 0x4;
+-
+- dtd->part2.sdvo_flags = 0;
+- dtd->part2.v_sync_off_high = v_sync_offset & 0xc0;
+- dtd->part2.reserved = 0;
+-}
+-
+-static void intel_sdvo_get_mode_from_dtd(struct drm_display_mode * mode,
+- struct intel_sdvo_dtd *dtd)
+-{
+- uint16_t width, height;
+- uint16_t h_blank_len, h_sync_len, v_blank_len, v_sync_len;
+- uint16_t h_sync_offset, v_sync_offset;
+-
+- width = mode->crtc_hdisplay;
+- height = mode->crtc_vdisplay;
+-
+- /* do some mode translations */
+- h_blank_len = mode->crtc_hblank_end - mode->crtc_hblank_start;
+- h_sync_len = mode->crtc_hsync_end - mode->crtc_hsync_start;
+-
+- v_blank_len = mode->crtc_vblank_end - mode->crtc_vblank_start;
+- v_sync_len = mode->crtc_vsync_end - mode->crtc_vsync_start;
+-
+- h_sync_offset = mode->crtc_hsync_start - mode->crtc_hblank_start;
+- v_sync_offset = mode->crtc_vsync_start - mode->crtc_vblank_start;
+-
+- mode->hdisplay = dtd->part1.h_active;
+- mode->hdisplay += ((dtd->part1.h_high >> 4) & 0x0f) << 8;
+- mode->hsync_start = mode->hdisplay + dtd->part2.h_sync_off;
+- mode->hsync_start += (dtd->part2.sync_off_width_high & 0xa0) << 2;
+- mode->hsync_end = mode->hsync_start + dtd->part2.h_sync_width;
+- mode->hsync_end += (dtd->part2.sync_off_width_high & 0x30) << 4;
+- mode->htotal = mode->hdisplay + dtd->part1.h_blank;
+- mode->htotal += (dtd->part1.h_high & 0xf) << 8;
+-
+- mode->vdisplay = dtd->part1.v_active;
+- mode->vdisplay += ((dtd->part1.v_high >> 4) & 0x0f) << 8;
+- mode->vsync_start = mode->vdisplay;
+- mode->vsync_start += (dtd->part2.v_sync_off_width >> 4) & 0xf;
+- mode->vsync_start += (dtd->part2.sync_off_width_high & 0x0a) << 2;
+- mode->vsync_start += dtd->part2.v_sync_off_high & 0xc0;
+- mode->vsync_end = mode->vsync_start +
+- (dtd->part2.v_sync_off_width & 0xf);
+- mode->vsync_end += (dtd->part2.sync_off_width_high & 0x3) << 4;
+- mode->vtotal = mode->vdisplay + dtd->part1.v_blank;
+- mode->vtotal += (dtd->part1.v_high & 0xf) << 8;
+-
+- mode->clock = dtd->part1.clock * 10;
+-
+- mode->flags &= (DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC);
+- if (dtd->part2.dtd_flags & 0x2)
+- mode->flags |= DRM_MODE_FLAG_PHSYNC;
+- if (dtd->part2.dtd_flags & 0x4)
+- mode->flags |= DRM_MODE_FLAG_PVSYNC;
+-}
+-
+-static bool intel_sdvo_get_supp_encode(struct intel_output *output,
+- struct intel_sdvo_encode *encode)
+-{
+- uint8_t status;
+-
+- intel_sdvo_write_cmd(output, SDVO_CMD_GET_SUPP_ENCODE, NULL, 0);
+- status = intel_sdvo_read_response(output, encode, sizeof(*encode));
+- if (status != SDVO_CMD_STATUS_SUCCESS) { /* non-support means DVI */
+- memset(encode, 0, sizeof(*encode));
+- return false;
+- }
+-
+- return true;
+-}
+-
+-static bool intel_sdvo_set_encode(struct intel_output *output, uint8_t mode)
+-{
+- uint8_t status;
+-
+- intel_sdvo_write_cmd(output, SDVO_CMD_SET_ENCODE, &mode, 1);
+- status = intel_sdvo_read_response(output, NULL, 0);
+-
+- return (status == SDVO_CMD_STATUS_SUCCESS);
+-}
+-
+-static bool intel_sdvo_set_colorimetry(struct intel_output *output,
+- uint8_t mode)
+-{
+- uint8_t status;
+-
+- intel_sdvo_write_cmd(output, SDVO_CMD_SET_COLORIMETRY, &mode, 1);
+- status = intel_sdvo_read_response(output, NULL, 0);
+-
+- return (status == SDVO_CMD_STATUS_SUCCESS);
+-}
+-
+-#if 0
+-static void intel_sdvo_dump_hdmi_buf(struct intel_output *output)
+-{
+- int i, j;
+- uint8_t set_buf_index[2];
+- uint8_t av_split;
+- uint8_t buf_size;
+- uint8_t buf[48];
+- uint8_t *pos;
+-
+- intel_sdvo_write_cmd(output, SDVO_CMD_GET_HBUF_AV_SPLIT, NULL, 0);
+- intel_sdvo_read_response(output, &av_split, 1);
+-
+- for (i = 0; i <= av_split; i++) {
+- set_buf_index[0] = i; set_buf_index[1] = 0;
+- intel_sdvo_write_cmd(output, SDVO_CMD_SET_HBUF_INDEX,
+- set_buf_index, 2);
+- intel_sdvo_write_cmd(output, SDVO_CMD_GET_HBUF_INFO, NULL, 0);
+- intel_sdvo_read_response(output, &buf_size, 1);
+-
+- pos = buf;
+- for (j = 0; j <= buf_size; j += 8) {
+- intel_sdvo_write_cmd(output, SDVO_CMD_GET_HBUF_DATA,
+- NULL, 0);
+- intel_sdvo_read_response(output, pos, 8);
+- pos += 8;
+- }
+- }
+-}
+-#endif
+-
+-static void intel_sdvo_set_hdmi_buf(struct intel_output *output, int index,
+- uint8_t *data, int8_t size, uint8_t tx_rate)
+-{
+- uint8_t set_buf_index[2];
+-
+- set_buf_index[0] = index;
+- set_buf_index[1] = 0;
+-
+- intel_sdvo_write_cmd(output, SDVO_CMD_SET_HBUF_INDEX, set_buf_index, 2);
+-
+- for (; size > 0; size -= 8) {
+- intel_sdvo_write_cmd(output, SDVO_CMD_SET_HBUF_DATA, data, 8);
+- data += 8;
+- }
+-
+- intel_sdvo_write_cmd(output, SDVO_CMD_SET_HBUF_TXRATE, &tx_rate, 1);
+-}
+-
+-static uint8_t intel_sdvo_calc_hbuf_csum(uint8_t *data, uint8_t size)
+-{
+- uint8_t csum = 0;
+- int i;
+-
+- for (i = 0; i < size; i++)
+- csum += data[i];
+-
+- return 0x100 - csum;
+-}
+-
+-#define DIP_TYPE_AVI 0x82
+-#define DIP_VERSION_AVI 0x2
+-#define DIP_LEN_AVI 13
+-
+-struct dip_infoframe {
+- uint8_t type;
+- uint8_t version;
+- uint8_t len;
+- uint8_t checksum;
+- union {
+- struct {
+- /* Packet Byte #1 */
+- uint8_t S:2;
+- uint8_t B:2;
+- uint8_t A:1;
+- uint8_t Y:2;
+- uint8_t rsvd1:1;
+- /* Packet Byte #2 */
+- uint8_t R:4;
+- uint8_t M:2;
+- uint8_t C:2;
+- /* Packet Byte #3 */
+- uint8_t SC:2;
+- uint8_t Q:2;
+- uint8_t EC:3;
+- uint8_t ITC:1;
+- /* Packet Byte #4 */
+- uint8_t VIC:7;
+- uint8_t rsvd2:1;
+- /* Packet Byte #5 */
+- uint8_t PR:4;
+- uint8_t rsvd3:4;
+- /* Packet Byte #6~13 */
+- uint16_t top_bar_end;
+- uint16_t bottom_bar_start;
+- uint16_t left_bar_end;
+- uint16_t right_bar_start;
+- } avi;
+- struct {
+- /* Packet Byte #1 */
+- uint8_t channel_count:3;
+- uint8_t rsvd1:1;
+- uint8_t coding_type:4;
+- /* Packet Byte #2 */
+- uint8_t sample_size:2; /* SS0, SS1 */
+- uint8_t sample_frequency:3;
+- uint8_t rsvd2:3;
+- /* Packet Byte #3 */
+- uint8_t coding_type_private:5;
+- uint8_t rsvd3:3;
+- /* Packet Byte #4 */
+- uint8_t channel_allocation;
+- /* Packet Byte #5 */
+- uint8_t rsvd4:3;
+- uint8_t level_shift:4;
+- uint8_t downmix_inhibit:1;
+- } audio;
+- uint8_t payload[28];
+- } __attribute__ ((packed)) u;
+-} __attribute__((packed));
+-
+-static void intel_sdvo_set_avi_infoframe(struct intel_output *output,
+- struct drm_display_mode * mode)
+-{
+- struct dip_infoframe avi_if = {
+- .type = DIP_TYPE_AVI,
+- .version = DIP_VERSION_AVI,
+- .len = DIP_LEN_AVI,
+- };
+-
+- avi_if.checksum = intel_sdvo_calc_hbuf_csum((uint8_t *)&avi_if,
+- 4 + avi_if.len);
+- intel_sdvo_set_hdmi_buf(output, 1, (uint8_t *)&avi_if, 4 + avi_if.len,
+- SDVO_HBUF_TX_VSYNC);
+-}
+-
+-static bool intel_sdvo_mode_fixup(struct drm_encoder *encoder,
+- struct drm_display_mode *mode,
+- struct drm_display_mode *adjusted_mode)
+-{
+- struct intel_output *output = enc_to_intel_output(encoder);
+- struct intel_sdvo_priv *dev_priv = output->dev_priv;
+-
+- if (!dev_priv->is_tv) {
+- /* Make the CRTC code factor in the SDVO pixel multiplier. The
+- * SDVO device will be told of the multiplier during mode_set.
+- */
+- adjusted_mode->clock *= intel_sdvo_get_pixel_multiplier(mode);
+- } else {
+- struct intel_sdvo_dtd output_dtd;
+- bool success;
+-
+- /* We need to construct preferred input timings based on our
+- * output timings. To do that, we have to set the output
+- * timings, even though this isn't really the right place in
+- * the sequence to do it. Oh well.
+- */
+-
+-
+- /* Set output timings */
+- intel_sdvo_get_dtd_from_mode(&output_dtd, mode);
+- intel_sdvo_set_target_output(output,
+- dev_priv->controlled_output);
+- intel_sdvo_set_output_timing(output, &output_dtd);
+-
+- /* Set the input timing to the screen. Assume always input 0. */
+- intel_sdvo_set_target_input(output, true, false);
+-
+-
+- success = intel_sdvo_create_preferred_input_timing(output,
+- mode->clock / 10,
+- mode->hdisplay,
+- mode->vdisplay);
+- if (success) {
+- struct intel_sdvo_dtd input_dtd;
+-
+- intel_sdvo_get_preferred_input_timing(output,
+- &input_dtd);
+- intel_sdvo_get_mode_from_dtd(adjusted_mode, &input_dtd);
+-
+- } else {
+- return false;
+- }
+- }
+- return true;
+-}
+-
+-static void intel_sdvo_mode_set(struct drm_encoder *encoder,
+- struct drm_display_mode *mode,
+- struct drm_display_mode *adjusted_mode)
+-{
+- struct drm_device *dev = encoder->dev;
+- struct drm_i915_private *dev_priv = dev->dev_private;
+- struct drm_crtc *crtc = encoder->crtc;
+- struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+- struct intel_output *output = enc_to_intel_output(encoder);
+- struct intel_sdvo_priv *sdvo_priv = output->dev_priv;
+- u32 sdvox = 0;
+- int sdvo_pixel_multiply;
+- struct intel_sdvo_in_out_map in_out;
+- struct intel_sdvo_dtd input_dtd;
+- u8 status;
+-
+- if (!mode)
+- return;
+-
+- /* First, set the input mapping for the first input to our controlled
+- * output. This is only correct if we're a single-input device, in
+- * which case the first input is the output from the appropriate SDVO
+- * channel on the motherboard. In a two-input device, the first input
+- * will be SDVOB and the second SDVOC.
+- */
+- in_out.in0 = sdvo_priv->controlled_output;
+- in_out.in1 = 0;
+-
+- intel_sdvo_write_cmd(output, SDVO_CMD_SET_IN_OUT_MAP,
+- &in_out, sizeof(in_out));
+- status = intel_sdvo_read_response(output, NULL, 0);
+-
+- if (sdvo_priv->is_hdmi) {
+- intel_sdvo_set_avi_infoframe(output, mode);
+- sdvox |= SDVO_AUDIO_ENABLE;
+- }
+-
+- intel_sdvo_get_dtd_from_mode(&input_dtd, mode);
++ output_dtd.part2.dtd_flags |= 0x4;
+
+- /* If it's a TV, we already set the output timing in mode_fixup.
+- * Otherwise, the output timing is equal to the input timing.
+- */
+- if (!sdvo_priv->is_tv) {
+- /* Set the output timing to the screen */
+- intel_sdvo_set_target_output(output,
+- sdvo_priv->controlled_output);
+- intel_sdvo_set_output_timing(output, &input_dtd);
+- }
++ output_dtd.part2.sdvo_flags = 0;
++ output_dtd.part2.v_sync_off_high = v_sync_offset & 0xc0;
++ output_dtd.part2.reserved = 0;
++
++ /* Set the output timing to the screen */
++ intel_sdvo_set_target_output(intel_output, sdvo_priv->active_outputs);
++ intel_sdvo_set_output_timing(intel_output, &output_dtd);
+
+ /* Set the input timing to the screen. Assume always input 0. */
+- intel_sdvo_set_target_input(output, true, false);
++ intel_sdvo_set_target_input(intel_output, true, false);
+
+- /* We would like to use intel_sdvo_create_preferred_input_timing() to
++ /* We would like to use i830_sdvo_create_preferred_input_timing() to
+ * provide the device with a timing it can support, if it supports that
+ * feature. However, presumably we would need to adjust the CRTC to
+ * output the preferred timing, and we don't support that currently.
+ */
+-#if 0
+- success = intel_sdvo_create_preferred_input_timing(output, clock,
+- width, height);
+- if (success) {
+- struct intel_sdvo_dtd *input_dtd;
+-
+- intel_sdvo_get_preferred_input_timing(output, &input_dtd);
+- intel_sdvo_set_input_timing(output, &input_dtd);
+- }
+-#else
+- intel_sdvo_set_input_timing(output, &input_dtd);
+-#endif
++ intel_sdvo_set_input_timing(intel_output, &output_dtd);
+
+ switch (intel_sdvo_get_pixel_multiplier(mode)) {
+ case 1:
+- intel_sdvo_set_clock_rate_mult(output,
++ intel_sdvo_set_clock_rate_mult(intel_output,
+ SDVO_CLOCK_RATE_MULT_1X);
+ break;
+ case 2:
+- intel_sdvo_set_clock_rate_mult(output,
++ intel_sdvo_set_clock_rate_mult(intel_output,
+ SDVO_CLOCK_RATE_MULT_2X);
+ break;
+ case 4:
+- intel_sdvo_set_clock_rate_mult(output,
++ intel_sdvo_set_clock_rate_mult(intel_output,
+ SDVO_CLOCK_RATE_MULT_4X);
+ break;
+ }
+
+ /* Set the SDVO control regs. */
+- if (IS_I965G(dev)) {
+- sdvox |= SDVO_BORDER_ENABLE |
+- SDVO_VSYNC_ACTIVE_HIGH |
+- SDVO_HSYNC_ACTIVE_HIGH;
+- } else {
+- sdvox |= I915_READ(sdvo_priv->output_device);
+- switch (sdvo_priv->output_device) {
+- case SDVOB:
+- sdvox &= SDVOB_PRESERVE_MASK;
+- break;
+- case SDVOC:
+- sdvox &= SDVOC_PRESERVE_MASK;
+- break;
+- }
+- sdvox |= (9 << 19) | SDVO_BORDER_ENABLE;
+- }
++ if (0/*IS_I965GM(dev)*/) {
++ sdvox = SDVO_BORDER_ENABLE;
++ } else {
++ sdvox = I915_READ(sdvo_priv->output_device);
++ switch (sdvo_priv->output_device) {
++ case SDVOB:
++ sdvox &= SDVOB_PRESERVE_MASK;
++ break;
++ case SDVOC:
++ sdvox &= SDVOC_PRESERVE_MASK;
++ break;
++ }
++ sdvox |= (9 << 19) | SDVO_BORDER_ENABLE;
++ }
+ if (intel_crtc->pipe == 1)
+ sdvox |= SDVO_PIPE_B_SELECT;
+
+ sdvo_pixel_multiply = intel_sdvo_get_pixel_multiplier(mode);
+ if (IS_I965G(dev)) {
+- /* done in crtc_mode_set as the dpll_md reg must be written early */
+- } else if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev)) {
+- /* done in crtc_mode_set as it lives inside the dpll register */
++ /* done in crtc_mode_set as the dpll_md reg must be written
++ early */
++ } else if (IS_I945G(dev) || IS_I945GM(dev)) {
++ /* done in crtc_mode_set as it lives inside the
++ dpll register */
+ } else {
+ sdvox |= (sdvo_pixel_multiply - 1) << SDVO_PORT_MULTIPLY_SHIFT;
+ }
+
+- intel_sdvo_write_sdvox(output, sdvox);
++ intel_sdvo_write_sdvox(intel_output, sdvox);
+ }
+
+ static void intel_sdvo_dpms(struct drm_encoder *encoder, int mode)
+@@ -1137,7 +714,7 @@
+
+ if (0)
+ intel_sdvo_set_encoder_power_state(intel_output, mode);
+- intel_sdvo_set_active_outputs(intel_output, sdvo_priv->controlled_output);
++ intel_sdvo_set_active_outputs(intel_output, sdvo_priv->active_outputs);
+ }
+ return;
+ }
+@@ -1175,9 +752,6 @@
+ &sdvo_priv->save_output_dtd[o]);
+ }
+ }
+- if (sdvo_priv->is_tv) {
+- /* XXX: Save TV format/enhancements. */
+- }
+
+ sdvo_priv->save_SDVOX = I915_READ(sdvo_priv->output_device);
+ }
+@@ -1185,6 +759,7 @@
+ static void intel_sdvo_restore(struct drm_connector *connector)
+ {
+ struct drm_device *dev = connector->dev;
++ struct drm_i915_private *dev_priv = dev->dev_private;
+ struct intel_output *intel_output = to_intel_output(connector);
+ struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
+ int o;
+@@ -1215,11 +790,7 @@
+
+ intel_sdvo_set_clock_rate_mult(intel_output, sdvo_priv->save_sdvo_mult);
+
+- if (sdvo_priv->is_tv) {
+- /* XXX: Restore TV format/enhancements. */
+- }
+-
+- intel_sdvo_write_sdvox(intel_output, sdvo_priv->save_SDVOX);
++ I915_WRITE(sdvo_priv->output_device, sdvo_priv->save_SDVOX);
+
+ if (sdvo_priv->save_SDVOX & SDVO_ENABLE)
+ {
+@@ -1345,173 +916,20 @@
+ status = intel_sdvo_read_response(intel_output, &response, 2);
+
+ DRM_DEBUG("SDVO response %d %d\n", response[0], response[1]);
+-
+- if (status != SDVO_CMD_STATUS_SUCCESS)
+- return connector_status_unknown;
+-
+ if ((response[0] != 0) || (response[1] != 0))
+ return connector_status_connected;
+ else
+ return connector_status_disconnected;
+ }
+
+-static void intel_sdvo_get_ddc_modes(struct drm_connector *connector)
++static int intel_sdvo_get_modes(struct drm_connector *connector)
+ {
+ struct intel_output *intel_output = to_intel_output(connector);
+- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
+
+ /* set the bus switch and get the modes */
+- intel_sdvo_set_control_bus_switch(intel_output, sdvo_priv->ddc_bus);
++ intel_sdvo_set_control_bus_switch(intel_output, SDVO_CONTROL_BUS_DDC2);
+ intel_ddc_get_modes(intel_output);
+
+-#if 0
+- struct drm_device *dev = encoder->dev;
+- struct drm_i915_private *dev_priv = dev->dev_private;
+- /* Mac mini hack. On this device, I get DDC through the analog, which
+- * load-detects as disconnected. I fail to DDC through the SDVO DDC,
+- * but it does load-detect as connected. So, just steal the DDC bits
+- * from analog when we fail at finding it the right way.
+- */
+- crt = xf86_config->output[0];
+- intel_output = crt->driver_private;
+- if (intel_output->type == I830_OUTPUT_ANALOG &&
+- crt->funcs->detect(crt) == XF86OutputStatusDisconnected) {
+- I830I2CInit(pScrn, &intel_output->pDDCBus, GPIOA, "CRTDDC_A");
+- edid_mon = xf86OutputGetEDID(crt, intel_output->pDDCBus);
+- xf86DestroyI2CBusRec(intel_output->pDDCBus, true, true);
+- }
+- if (edid_mon) {
+- xf86OutputSetEDID(output, edid_mon);
+- modes = xf86OutputGetEDIDModes(output);
+- }
+-#endif
+-}
+-
+-/**
+- * This function checks the current TV format, and chooses a default if
+- * it hasn't been set.
+- */
+-static void
+-intel_sdvo_check_tv_format(struct intel_output *output)
+-{
+- struct intel_sdvo_priv *dev_priv = output->dev_priv;
+- struct intel_sdvo_tv_format format, unset;
+- uint8_t status;
+-
+- intel_sdvo_write_cmd(output, SDVO_CMD_GET_TV_FORMAT, NULL, 0);
+- status = intel_sdvo_read_response(output, &format, sizeof(format));
+- if (status != SDVO_CMD_STATUS_SUCCESS)
+- return;
+-
+- memset(&unset, 0, sizeof(unset));
+- if (memcmp(&format, &unset, sizeof(format))) {
+- DRM_DEBUG("%s: Choosing default TV format of NTSC-M\n",
+- SDVO_NAME(dev_priv));
+-
+- format.ntsc_m = true;
+- intel_sdvo_write_cmd(output, SDVO_CMD_SET_TV_FORMAT, NULL, 0);
+- status = intel_sdvo_read_response(output, NULL, 0);
+- }
+-}
+-
+-/*
+- * Set of SDVO TV modes.
+- * Note! This is in reply order (see loop in get_tv_modes).
+- * XXX: all 60Hz refresh?
+- */
+-struct drm_display_mode sdvo_tv_modes[] = {
+- { DRM_MODE("320x200", DRM_MODE_TYPE_DRIVER, 5815680, 321, 384, 416,
+- 200, 0, 232, 201, 233, 4196112, 0,
+- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+- { DRM_MODE("320x240", DRM_MODE_TYPE_DRIVER, 6814080, 321, 384, 416,
+- 240, 0, 272, 241, 273, 4196112, 0,
+- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+- { DRM_MODE("400x300", DRM_MODE_TYPE_DRIVER, 9910080, 401, 464, 496,
+- 300, 0, 332, 301, 333, 4196112, 0,
+- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+- { DRM_MODE("640x350", DRM_MODE_TYPE_DRIVER, 16913280, 641, 704, 736,
+- 350, 0, 382, 351, 383, 4196112, 0,
+- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+- { DRM_MODE("640x400", DRM_MODE_TYPE_DRIVER, 19121280, 641, 704, 736,
+- 400, 0, 432, 401, 433, 4196112, 0,
+- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+- { DRM_MODE("640x400", DRM_MODE_TYPE_DRIVER, 19121280, 641, 704, 736,
+- 400, 0, 432, 401, 433, 4196112, 0,
+- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+- { DRM_MODE("704x480", DRM_MODE_TYPE_DRIVER, 24624000, 705, 768, 800,
+- 480, 0, 512, 481, 513, 4196112, 0,
+- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+- { DRM_MODE("704x576", DRM_MODE_TYPE_DRIVER, 29232000, 705, 768, 800,
+- 576, 0, 608, 577, 609, 4196112, 0,
+- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+- { DRM_MODE("720x350", DRM_MODE_TYPE_DRIVER, 18751680, 721, 784, 816,
+- 350, 0, 382, 351, 383, 4196112, 0,
+- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+- { DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 21199680, 721, 784, 816,
+- 400, 0, 432, 401, 433, 4196112, 0,
+- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+- { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 25116480, 721, 784, 816,
+- 480, 0, 512, 481, 513, 4196112, 0,
+- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+- { DRM_MODE("720x540", DRM_MODE_TYPE_DRIVER, 28054080, 721, 784, 816,
+- 540, 0, 572, 541, 573, 4196112, 0,
+- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+- { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 29816640, 721, 784, 816,
+- 576, 0, 608, 577, 609, 4196112, 0,
+- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+- { DRM_MODE("768x576", DRM_MODE_TYPE_DRIVER, 31570560, 769, 832, 864,
+- 576, 0, 608, 577, 609, 4196112, 0,
+- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+- { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 34030080, 801, 864, 896,
+- 600, 0, 632, 601, 633, 4196112, 0,
+- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+- { DRM_MODE("832x624", DRM_MODE_TYPE_DRIVER, 36581760, 833, 896, 928,
+- 624, 0, 656, 625, 657, 4196112, 0,
+- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+- { DRM_MODE("920x766", DRM_MODE_TYPE_DRIVER, 48707040, 921, 984, 1016,
+- 766, 0, 798, 767, 799, 4196112, 0,
+- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+- { DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 53827200, 1025, 1088, 1120,
+- 768, 0, 800, 769, 801, 4196112, 0,
+- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+- { DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 87265920, 1281, 1344, 1376,
+- 1024, 0, 1056, 1025, 1057, 4196112, 0,
+- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
+-};
+-
+-static void intel_sdvo_get_tv_modes(struct drm_connector *connector)
+-{
+- struct intel_output *output = to_intel_output(connector);
+- uint32_t reply = 0;
+- uint8_t status;
+- int i = 0;
+-
+- intel_sdvo_check_tv_format(output);
+-
+- /* Read the list of supported input resolutions for the selected TV
+- * format.
+- */
+- intel_sdvo_write_cmd(output, SDVO_CMD_GET_SDTV_RESOLUTION_SUPPORT,
+- NULL, 0);
+- status = intel_sdvo_read_response(output, &reply, 3);
+- if (status != SDVO_CMD_STATUS_SUCCESS)
+- return;
+-
+- for (i = 0; i < ARRAY_SIZE(sdvo_tv_modes); i++)
+- if (reply & (1 << i))
+- drm_mode_probed_add(connector, &sdvo_tv_modes[i]);
+-}
+-
+-static int intel_sdvo_get_modes(struct drm_connector *connector)
+-{
+- struct intel_output *output = to_intel_output(connector);
+- struct intel_sdvo_priv *sdvo_priv = output->dev_priv;
+-
+- if (sdvo_priv->is_tv)
+- intel_sdvo_get_tv_modes(connector);
+- else
+- intel_sdvo_get_ddc_modes(connector);
+-
+ if (list_empty(&connector->probed_modes))
+ return 0;
+ return 1;
+@@ -1560,65 +978,6 @@
+ };
+
+
+-/**
+- * Choose the appropriate DDC bus for control bus switch command for this
+- * SDVO output based on the controlled output.
+- *
+- * DDC bus number assignment is in a priority order of RGB outputs, then TMDS
+- * outputs, then LVDS outputs.
+- */
+-static void
+-intel_sdvo_select_ddc_bus(struct intel_sdvo_priv *dev_priv)
+-{
+- uint16_t mask = 0;
+- unsigned int num_bits;
+-
+- /* Make a mask of outputs less than or equal to our own priority in the
+- * list.
+- */
+- switch (dev_priv->controlled_output) {
+- case SDVO_OUTPUT_LVDS1:
+- mask |= SDVO_OUTPUT_LVDS1;
+- case SDVO_OUTPUT_LVDS0:
+- mask |= SDVO_OUTPUT_LVDS0;
+- case SDVO_OUTPUT_TMDS1:
+- mask |= SDVO_OUTPUT_TMDS1;
+- case SDVO_OUTPUT_TMDS0:
+- mask |= SDVO_OUTPUT_TMDS0;
+- case SDVO_OUTPUT_RGB1:
+- mask |= SDVO_OUTPUT_RGB1;
+- case SDVO_OUTPUT_RGB0:
+- mask |= SDVO_OUTPUT_RGB0;
+- break;
+- }
+-
+- /* Count bits to find what number we are in the priority list. */
+- mask &= dev_priv->caps.output_flags;
+- num_bits = hweight16(mask);
+- if (num_bits > 3) {
+- /* if more than 3 outputs, default to DDC bus 3 for now */
+- num_bits = 3;
+- }
+-
+- /* Corresponds to SDVO_CONTROL_BUS_DDCx */
+- dev_priv->ddc_bus = 1 << num_bits;
+-}
+-
+-static bool
+-intel_sdvo_get_digital_encoding_mode(struct intel_output *output)
+-{
+- struct intel_sdvo_priv *sdvo_priv = output->dev_priv;
+- uint8_t status;
+-
+- intel_sdvo_set_target_output(output, sdvo_priv->controlled_output);
+-
+- intel_sdvo_write_cmd(output, SDVO_CMD_GET_ENCODE, NULL, 0);
+- status = intel_sdvo_read_response(output, &sdvo_priv->is_hdmi, 1);
+- if (status != SDVO_CMD_STATUS_SUCCESS)
+- return false;
+- return true;
+-}
+-
+ bool intel_sdvo_init(struct drm_device *dev, int output_device)
+ {
+ struct drm_connector *connector;
+@@ -1681,76 +1040,45 @@
+
+ intel_sdvo_get_capabilities(intel_output, &sdvo_priv->caps);
+
+- if (sdvo_priv->caps.output_flags &
+- (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) {
+- if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_TMDS0)
+- sdvo_priv->controlled_output = SDVO_OUTPUT_TMDS0;
+- else
+- sdvo_priv->controlled_output = SDVO_OUTPUT_TMDS1;
+-
+- connector->display_info.subpixel_order = SubPixelHorizontalRGB;
+- encoder_type = DRM_MODE_ENCODER_TMDS;
+- connector_type = DRM_MODE_CONNECTOR_DVID;
++ memset(&sdvo_priv->active_outputs, 0, sizeof(sdvo_priv->active_outputs));
+
+- if (intel_sdvo_get_supp_encode(intel_output,
+- &sdvo_priv->encode) &&
+- intel_sdvo_get_digital_encoding_mode(intel_output) &&
+- sdvo_priv->is_hdmi) {
+- /* enable hdmi encoding mode if supported */
+- intel_sdvo_set_encode(intel_output, SDVO_ENCODE_HDMI);
+- intel_sdvo_set_colorimetry(intel_output,
+- SDVO_COLORIMETRY_RGB256);
+- connector_type = DRM_MODE_CONNECTOR_HDMIA;
+- }
+- }
+- else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_SVID0)
++ /* TODO, CVBS, SVID, YPRPB & SCART outputs. */
++ if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_RGB0)
+ {
+- sdvo_priv->controlled_output = SDVO_OUTPUT_SVID0;
+- connector->display_info.subpixel_order = SubPixelHorizontalRGB;
+- encoder_type = DRM_MODE_ENCODER_TVDAC;
+- connector_type = DRM_MODE_CONNECTOR_SVIDEO;
+- sdvo_priv->is_tv = true;
+- intel_output->needs_tv_clock = true;
+- }
+- else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_RGB0)
+- {
+- sdvo_priv->controlled_output = SDVO_OUTPUT_RGB0;
++ sdvo_priv->active_outputs = SDVO_OUTPUT_RGB0;
+ connector->display_info.subpixel_order = SubPixelHorizontalRGB;
+ encoder_type = DRM_MODE_ENCODER_DAC;
+ connector_type = DRM_MODE_CONNECTOR_VGA;
+ }
+ else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_RGB1)
+ {
+- sdvo_priv->controlled_output = SDVO_OUTPUT_RGB1;
++ sdvo_priv->active_outputs = SDVO_OUTPUT_RGB1;
+ connector->display_info.subpixel_order = SubPixelHorizontalRGB;
+ encoder_type = DRM_MODE_ENCODER_DAC;
+ connector_type = DRM_MODE_CONNECTOR_VGA;
+ }
+- else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_LVDS0)
++ else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_TMDS0)
+ {
+- sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS0;
++ sdvo_priv->active_outputs = SDVO_OUTPUT_TMDS0;
+ connector->display_info.subpixel_order = SubPixelHorizontalRGB;
+- encoder_type = DRM_MODE_ENCODER_LVDS;
+- connector_type = DRM_MODE_CONNECTOR_LVDS;
++ encoder_type = DRM_MODE_ENCODER_TMDS;
++ connector_type = DRM_MODE_CONNECTOR_DVID;
+ }
+- else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_LVDS1)
++ else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_TMDS1)
+ {
+- sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS1;
++ sdvo_priv->active_outputs = SDVO_OUTPUT_TMDS1;
+ connector->display_info.subpixel_order = SubPixelHorizontalRGB;
+- encoder_type = DRM_MODE_ENCODER_LVDS;
+- connector_type = DRM_MODE_CONNECTOR_LVDS;
++ encoder_type = DRM_MODE_ENCODER_TMDS;
++ connector_type = DRM_MODE_CONNECTOR_DVID;
+ }
+ else
+ {
+ unsigned char bytes[2];
+
+- sdvo_priv->controlled_output = 0;
+ memcpy (bytes, &sdvo_priv->caps.output_flags, 2);
+- DRM_DEBUG("%s: Unknown SDVO output type (0x%02x%02x)\n",
++ DRM_DEBUG("%s: No active RGB or TMDS outputs (0x%02x%02x)\n",
+ SDVO_NAME(sdvo_priv),
+ bytes[0], bytes[1]);
+- encoder_type = DRM_MODE_ENCODER_NONE;
+- connector_type = DRM_MODE_CONNECTOR_Unknown;
+ goto err_i2c;
+ }
+
+@@ -1761,8 +1089,6 @@
+ drm_mode_connector_attach_encoder(&intel_output->base, &intel_output->enc);
+ drm_sysfs_connector_add(connector);
+
+- intel_sdvo_select_ddc_bus(sdvo_priv);
+-
+ /* Set the input timing to the screen. Assume always input 0. */
+ intel_sdvo_set_target_input(intel_output, true, false);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_sdvo_regs.h linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_sdvo_regs.h
+--- linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_sdvo_regs.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_sdvo_regs.h 2009-05-10 23:48:28.000000000 +0200
+@@ -173,9 +173,6 @@
+ * Returns two struct intel_sdvo_output_flags structures.
+ */
+ #define SDVO_CMD_GET_IN_OUT_MAP 0x06
+-struct intel_sdvo_in_out_map {
+- u16 in0, in1;
+-};
+
+ /**
+ * Sets the current mapping of SDVO inputs to outputs on the device.
+@@ -209,8 +206,7 @@
+ struct intel_sdvo_get_interrupt_event_source_response {
+ u16 interrupt_status;
+ unsigned int ambient_light_interrupt:1;
+- unsigned int hdmi_audio_encrypt_change:1;
+- unsigned int pad:6;
++ unsigned int pad:7;
+ } __attribute__((packed));
+
+ /**
+@@ -309,411 +305,23 @@
+ # define SDVO_CLOCK_RATE_MULT_4X (1 << 3)
+
+ #define SDVO_CMD_GET_SUPPORTED_TV_FORMATS 0x27
+-/** 5 bytes of bit flags for TV formats shared by all TV format functions */
+-struct intel_sdvo_tv_format {
+- unsigned int ntsc_m:1;
+- unsigned int ntsc_j:1;
+- unsigned int ntsc_443:1;
+- unsigned int pal_b:1;
+- unsigned int pal_d:1;
+- unsigned int pal_g:1;
+- unsigned int pal_h:1;
+- unsigned int pal_i:1;
+-
+- unsigned int pal_m:1;
+- unsigned int pal_n:1;
+- unsigned int pal_nc:1;
+- unsigned int pal_60:1;
+- unsigned int secam_b:1;
+- unsigned int secam_d:1;
+- unsigned int secam_g:1;
+- unsigned int secam_k:1;
+-
+- unsigned int secam_k1:1;
+- unsigned int secam_l:1;
+- unsigned int secam_60:1;
+- unsigned int hdtv_std_smpte_240m_1080i_59:1;
+- unsigned int hdtv_std_smpte_240m_1080i_60:1;
+- unsigned int hdtv_std_smpte_260m_1080i_59:1;
+- unsigned int hdtv_std_smpte_260m_1080i_60:1;
+- unsigned int hdtv_std_smpte_274m_1080i_50:1;
+-
+- unsigned int hdtv_std_smpte_274m_1080i_59:1;
+- unsigned int hdtv_std_smpte_274m_1080i_60:1;
+- unsigned int hdtv_std_smpte_274m_1080p_23:1;
+- unsigned int hdtv_std_smpte_274m_1080p_24:1;
+- unsigned int hdtv_std_smpte_274m_1080p_25:1;
+- unsigned int hdtv_std_smpte_274m_1080p_29:1;
+- unsigned int hdtv_std_smpte_274m_1080p_30:1;
+- unsigned int hdtv_std_smpte_274m_1080p_50:1;
+-
+- unsigned int hdtv_std_smpte_274m_1080p_59:1;
+- unsigned int hdtv_std_smpte_274m_1080p_60:1;
+- unsigned int hdtv_std_smpte_295m_1080i_50:1;
+- unsigned int hdtv_std_smpte_295m_1080p_50:1;
+- unsigned int hdtv_std_smpte_296m_720p_59:1;
+- unsigned int hdtv_std_smpte_296m_720p_60:1;
+- unsigned int hdtv_std_smpte_296m_720p_50:1;
+- unsigned int hdtv_std_smpte_293m_480p_59:1;
+-
+- unsigned int hdtv_std_smpte_170m_480i_59:1;
+- unsigned int hdtv_std_iturbt601_576i_50:1;
+- unsigned int hdtv_std_iturbt601_576p_50:1;
+- unsigned int hdtv_std_eia_7702a_480i_60:1;
+- unsigned int hdtv_std_eia_7702a_480p_60:1;
+- unsigned int pad:3;
+-} __attribute__((packed));
+
+ #define SDVO_CMD_GET_TV_FORMAT 0x28
+
+ #define SDVO_CMD_SET_TV_FORMAT 0x29
+
+-/** Returns the resolutiosn that can be used with the given TV format */
+-#define SDVO_CMD_GET_SDTV_RESOLUTION_SUPPORT 0x83
+-struct intel_sdvo_sdtv_resolution_request {
+- unsigned int ntsc_m:1;
+- unsigned int ntsc_j:1;
+- unsigned int ntsc_443:1;
+- unsigned int pal_b:1;
+- unsigned int pal_d:1;
+- unsigned int pal_g:1;
+- unsigned int pal_h:1;
+- unsigned int pal_i:1;
+-
+- unsigned int pal_m:1;
+- unsigned int pal_n:1;
+- unsigned int pal_nc:1;
+- unsigned int pal_60:1;
+- unsigned int secam_b:1;
+- unsigned int secam_d:1;
+- unsigned int secam_g:1;
+- unsigned int secam_k:1;
+-
+- unsigned int secam_k1:1;
+- unsigned int secam_l:1;
+- unsigned int secam_60:1;
+- unsigned int pad:5;
+-} __attribute__((packed));
+-
+-struct intel_sdvo_sdtv_resolution_reply {
+- unsigned int res_320x200:1;
+- unsigned int res_320x240:1;
+- unsigned int res_400x300:1;
+- unsigned int res_640x350:1;
+- unsigned int res_640x400:1;
+- unsigned int res_640x480:1;
+- unsigned int res_704x480:1;
+- unsigned int res_704x576:1;
+-
+- unsigned int res_720x350:1;
+- unsigned int res_720x400:1;
+- unsigned int res_720x480:1;
+- unsigned int res_720x540:1;
+- unsigned int res_720x576:1;
+- unsigned int res_768x576:1;
+- unsigned int res_800x600:1;
+- unsigned int res_832x624:1;
+-
+- unsigned int res_920x766:1;
+- unsigned int res_1024x768:1;
+- unsigned int res_1280x1024:1;
+- unsigned int pad:5;
+-} __attribute__((packed));
+-
+-/* Get supported resolution with squire pixel aspect ratio that can be
+- scaled for the requested HDTV format */
+-#define SDVO_CMD_GET_SCALED_HDTV_RESOLUTION_SUPPORT 0x85
+-
+-struct intel_sdvo_hdtv_resolution_request {
+- unsigned int hdtv_std_smpte_240m_1080i_59:1;
+- unsigned int hdtv_std_smpte_240m_1080i_60:1;
+- unsigned int hdtv_std_smpte_260m_1080i_59:1;
+- unsigned int hdtv_std_smpte_260m_1080i_60:1;
+- unsigned int hdtv_std_smpte_274m_1080i_50:1;
+- unsigned int hdtv_std_smpte_274m_1080i_59:1;
+- unsigned int hdtv_std_smpte_274m_1080i_60:1;
+- unsigned int hdtv_std_smpte_274m_1080p_23:1;
+-
+- unsigned int hdtv_std_smpte_274m_1080p_24:1;
+- unsigned int hdtv_std_smpte_274m_1080p_25:1;
+- unsigned int hdtv_std_smpte_274m_1080p_29:1;
+- unsigned int hdtv_std_smpte_274m_1080p_30:1;
+- unsigned int hdtv_std_smpte_274m_1080p_50:1;
+- unsigned int hdtv_std_smpte_274m_1080p_59:1;
+- unsigned int hdtv_std_smpte_274m_1080p_60:1;
+- unsigned int hdtv_std_smpte_295m_1080i_50:1;
+-
+- unsigned int hdtv_std_smpte_295m_1080p_50:1;
+- unsigned int hdtv_std_smpte_296m_720p_59:1;
+- unsigned int hdtv_std_smpte_296m_720p_60:1;
+- unsigned int hdtv_std_smpte_296m_720p_50:1;
+- unsigned int hdtv_std_smpte_293m_480p_59:1;
+- unsigned int hdtv_std_smpte_170m_480i_59:1;
+- unsigned int hdtv_std_iturbt601_576i_50:1;
+- unsigned int hdtv_std_iturbt601_576p_50:1;
+-
+- unsigned int hdtv_std_eia_7702a_480i_60:1;
+- unsigned int hdtv_std_eia_7702a_480p_60:1;
+- unsigned int pad:6;
+-} __attribute__((packed));
+-
+-struct intel_sdvo_hdtv_resolution_reply {
+- unsigned int res_640x480:1;
+- unsigned int res_800x600:1;
+- unsigned int res_1024x768:1;
+- unsigned int res_1280x960:1;
+- unsigned int res_1400x1050:1;
+- unsigned int res_1600x1200:1;
+- unsigned int res_1920x1440:1;
+- unsigned int res_2048x1536:1;
+-
+- unsigned int res_2560x1920:1;
+- unsigned int res_3200x2400:1;
+- unsigned int res_3840x2880:1;
+- unsigned int pad1:5;
+-
+- unsigned int res_848x480:1;
+- unsigned int res_1064x600:1;
+- unsigned int res_1280x720:1;
+- unsigned int res_1360x768:1;
+- unsigned int res_1704x960:1;
+- unsigned int res_1864x1050:1;
+- unsigned int res_1920x1080:1;
+- unsigned int res_2128x1200:1;
+-
+- unsigned int res_2560x1400:1;
+- unsigned int res_2728x1536:1;
+- unsigned int res_3408x1920:1;
+- unsigned int res_4264x2400:1;
+- unsigned int res_5120x2880:1;
+- unsigned int pad2:3;
+-
+- unsigned int res_768x480:1;
+- unsigned int res_960x600:1;
+- unsigned int res_1152x720:1;
+- unsigned int res_1124x768:1;
+- unsigned int res_1536x960:1;
+- unsigned int res_1680x1050:1;
+- unsigned int res_1728x1080:1;
+- unsigned int res_1920x1200:1;
+-
+- unsigned int res_2304x1440:1;
+- unsigned int res_2456x1536:1;
+- unsigned int res_3072x1920:1;
+- unsigned int res_3840x2400:1;
+- unsigned int res_4608x2880:1;
+- unsigned int pad3:3;
+-
+- unsigned int res_1280x1024:1;
+- unsigned int pad4:7;
+-
+- unsigned int res_1280x768:1;
+- unsigned int pad5:7;
+-} __attribute__((packed));
+-
+-/* Get supported power state returns info for encoder and monitor, rely on
+- last SetTargetInput and SetTargetOutput calls */
+ #define SDVO_CMD_GET_SUPPORTED_POWER_STATES 0x2a
+-/* Get power state returns info for encoder and monitor, rely on last
+- SetTargetInput and SetTargetOutput calls */
+-#define SDVO_CMD_GET_POWER_STATE 0x2b
+ #define SDVO_CMD_GET_ENCODER_POWER_STATE 0x2b
+ #define SDVO_CMD_SET_ENCODER_POWER_STATE 0x2c
+ # define SDVO_ENCODER_STATE_ON (1 << 0)
+ # define SDVO_ENCODER_STATE_STANDBY (1 << 1)
+ # define SDVO_ENCODER_STATE_SUSPEND (1 << 2)
+ # define SDVO_ENCODER_STATE_OFF (1 << 3)
+-# define SDVO_MONITOR_STATE_ON (1 << 4)
+-# define SDVO_MONITOR_STATE_STANDBY (1 << 5)
+-# define SDVO_MONITOR_STATE_SUSPEND (1 << 6)
+-# define SDVO_MONITOR_STATE_OFF (1 << 7)
+-
+-#define SDVO_CMD_GET_MAX_PANEL_POWER_SEQUENCING 0x2d
+-#define SDVO_CMD_GET_PANEL_POWER_SEQUENCING 0x2e
+-#define SDVO_CMD_SET_PANEL_POWER_SEQUENCING 0x2f
+-/**
+- * The panel power sequencing parameters are in units of milliseconds.
+- * The high fields are bits 8:9 of the 10-bit values.
+- */
+-struct sdvo_panel_power_sequencing {
+- u8 t0;
+- u8 t1;
+- u8 t2;
+- u8 t3;
+- u8 t4;
+-
+- unsigned int t0_high:2;
+- unsigned int t1_high:2;
+- unsigned int t2_high:2;
+- unsigned int t3_high:2;
+-
+- unsigned int t4_high:2;
+- unsigned int pad:6;
+-} __attribute__((packed));
+-
+-#define SDVO_CMD_GET_MAX_BACKLIGHT_LEVEL 0x30
+-struct sdvo_max_backlight_reply {
+- u8 max_value;
+- u8 default_value;
+-} __attribute__((packed));
+-
+-#define SDVO_CMD_GET_BACKLIGHT_LEVEL 0x31
+-#define SDVO_CMD_SET_BACKLIGHT_LEVEL 0x32
+-
+-#define SDVO_CMD_GET_AMBIENT_LIGHT 0x33
+-struct sdvo_get_ambient_light_reply {
+- u16 trip_low;
+- u16 trip_high;
+- u16 value;
+-} __attribute__((packed));
+-#define SDVO_CMD_SET_AMBIENT_LIGHT 0x34
+-struct sdvo_set_ambient_light_reply {
+- u16 trip_low;
+- u16 trip_high;
+- unsigned int enable:1;
+- unsigned int pad:7;
+-} __attribute__((packed));
+-
+-/* Set display power state */
+-#define SDVO_CMD_SET_DISPLAY_POWER_STATE 0x7d
+-# define SDVO_DISPLAY_STATE_ON (1 << 0)
+-# define SDVO_DISPLAY_STATE_STANDBY (1 << 1)
+-# define SDVO_DISPLAY_STATE_SUSPEND (1 << 2)
+-# define SDVO_DISPLAY_STATE_OFF (1 << 3)
+-
+-#define SDVO_CMD_GET_SUPPORTED_ENHANCEMENTS 0x84
+-struct intel_sdvo_enhancements_reply {
+- unsigned int flicker_filter:1;
+- unsigned int flicker_filter_adaptive:1;
+- unsigned int flicker_filter_2d:1;
+- unsigned int saturation:1;
+- unsigned int hue:1;
+- unsigned int brightness:1;
+- unsigned int contrast:1;
+- unsigned int overscan_h:1;
+-
+- unsigned int overscan_v:1;
+- unsigned int position_h:1;
+- unsigned int position_v:1;
+- unsigned int sharpness:1;
+- unsigned int dot_crawl:1;
+- unsigned int dither:1;
+- unsigned int max_tv_chroma_filter:1;
+- unsigned int max_tv_luma_filter:1;
+-} __attribute__((packed));
+-
+-/* Picture enhancement limits below are dependent on the current TV format,
+- * and thus need to be queried and set after it.
+- */
+-#define SDVO_CMD_GET_MAX_FLICKER_FITER 0x4d
+-#define SDVO_CMD_GET_MAX_ADAPTIVE_FLICKER_FITER 0x7b
+-#define SDVO_CMD_GET_MAX_2D_FLICKER_FITER 0x52
+-#define SDVO_CMD_GET_MAX_SATURATION 0x55
+-#define SDVO_CMD_GET_MAX_HUE 0x58
+-#define SDVO_CMD_GET_MAX_BRIGHTNESS 0x5b
+-#define SDVO_CMD_GET_MAX_CONTRAST 0x5e
+-#define SDVO_CMD_GET_MAX_OVERSCAN_H 0x61
+-#define SDVO_CMD_GET_MAX_OVERSCAN_V 0x64
+-#define SDVO_CMD_GET_MAX_POSITION_H 0x67
+-#define SDVO_CMD_GET_MAX_POSITION_V 0x6a
+-#define SDVO_CMD_GET_MAX_SHARPNESS_V 0x6d
+-#define SDVO_CMD_GET_MAX_TV_CHROMA 0x74
+-#define SDVO_CMD_GET_MAX_TV_LUMA 0x77
+-struct intel_sdvo_enhancement_limits_reply {
+- u16 max_value;
+- u16 default_value;
+-} __attribute__((packed));
+
+-#define SDVO_CMD_GET_LVDS_PANEL_INFORMATION 0x7f
+-#define SDVO_CMD_SET_LVDS_PANEL_INFORMATION 0x80
+-# define SDVO_LVDS_COLOR_DEPTH_18 (0 << 0)
+-# define SDVO_LVDS_COLOR_DEPTH_24 (1 << 0)
+-# define SDVO_LVDS_CONNECTOR_SPWG (0 << 2)
+-# define SDVO_LVDS_CONNECTOR_OPENLDI (1 << 2)
+-# define SDVO_LVDS_SINGLE_CHANNEL (0 << 4)
+-# define SDVO_LVDS_DUAL_CHANNEL (1 << 4)
+-
+-#define SDVO_CMD_GET_FLICKER_FILTER 0x4e
+-#define SDVO_CMD_SET_FLICKER_FILTER 0x4f
+-#define SDVO_CMD_GET_ADAPTIVE_FLICKER_FITER 0x50
+-#define SDVO_CMD_SET_ADAPTIVE_FLICKER_FITER 0x51
+-#define SDVO_CMD_GET_2D_FLICKER_FITER 0x53
+-#define SDVO_CMD_SET_2D_FLICKER_FITER 0x54
+-#define SDVO_CMD_GET_SATURATION 0x56
+-#define SDVO_CMD_SET_SATURATION 0x57
+-#define SDVO_CMD_GET_HUE 0x59
+-#define SDVO_CMD_SET_HUE 0x5a
+-#define SDVO_CMD_GET_BRIGHTNESS 0x5c
+-#define SDVO_CMD_SET_BRIGHTNESS 0x5d
+-#define SDVO_CMD_GET_CONTRAST 0x5f
+-#define SDVO_CMD_SET_CONTRAST 0x60
+-#define SDVO_CMD_GET_OVERSCAN_H 0x62
+-#define SDVO_CMD_SET_OVERSCAN_H 0x63
+-#define SDVO_CMD_GET_OVERSCAN_V 0x65
+-#define SDVO_CMD_SET_OVERSCAN_V 0x66
+-#define SDVO_CMD_GET_POSITION_H 0x68
+-#define SDVO_CMD_SET_POSITION_H 0x69
+-#define SDVO_CMD_GET_POSITION_V 0x6b
+-#define SDVO_CMD_SET_POSITION_V 0x6c
+-#define SDVO_CMD_GET_SHARPNESS 0x6e
+-#define SDVO_CMD_SET_SHARPNESS 0x6f
+-#define SDVO_CMD_GET_TV_CHROMA 0x75
+-#define SDVO_CMD_SET_TV_CHROMA 0x76
+-#define SDVO_CMD_GET_TV_LUMA 0x78
+-#define SDVO_CMD_SET_TV_LUMA 0x79
+-struct intel_sdvo_enhancements_arg {
+- u16 value;
+-}__attribute__((packed));
+-
+-#define SDVO_CMD_GET_DOT_CRAWL 0x70
+-#define SDVO_CMD_SET_DOT_CRAWL 0x71
+-# define SDVO_DOT_CRAWL_ON (1 << 0)
+-# define SDVO_DOT_CRAWL_DEFAULT_ON (1 << 1)
+-
+-#define SDVO_CMD_GET_DITHER 0x72
+-#define SDVO_CMD_SET_DITHER 0x73
+-# define SDVO_DITHER_ON (1 << 0)
+-# define SDVO_DITHER_DEFAULT_ON (1 << 1)
++#define SDVO_CMD_SET_TV_RESOLUTION_SUPPORT 0x93
+
+ #define SDVO_CMD_SET_CONTROL_BUS_SWITCH 0x7a
+-# define SDVO_CONTROL_BUS_PROM (1 << 0)
+-# define SDVO_CONTROL_BUS_DDC1 (1 << 1)
+-# define SDVO_CONTROL_BUS_DDC2 (1 << 2)
+-# define SDVO_CONTROL_BUS_DDC3 (1 << 3)
+-
+-/* HDMI op codes */
+-#define SDVO_CMD_GET_SUPP_ENCODE 0x9d
+-#define SDVO_CMD_GET_ENCODE 0x9e
+-#define SDVO_CMD_SET_ENCODE 0x9f
+- #define SDVO_ENCODE_DVI 0x0
+- #define SDVO_ENCODE_HDMI 0x1
+-#define SDVO_CMD_SET_PIXEL_REPLI 0x8b
+-#define SDVO_CMD_GET_PIXEL_REPLI 0x8c
+-#define SDVO_CMD_GET_COLORIMETRY_CAP 0x8d
+-#define SDVO_CMD_SET_COLORIMETRY 0x8e
+- #define SDVO_COLORIMETRY_RGB256 0x0
+- #define SDVO_COLORIMETRY_RGB220 0x1
+- #define SDVO_COLORIMETRY_YCrCb422 0x3
+- #define SDVO_COLORIMETRY_YCrCb444 0x4
+-#define SDVO_CMD_GET_COLORIMETRY 0x8f
+-#define SDVO_CMD_GET_AUDIO_ENCRYPT_PREFER 0x90
+-#define SDVO_CMD_SET_AUDIO_STAT 0x91
+-#define SDVO_CMD_GET_AUDIO_STAT 0x92
+-#define SDVO_CMD_SET_HBUF_INDEX 0x93
+-#define SDVO_CMD_GET_HBUF_INDEX 0x94
+-#define SDVO_CMD_GET_HBUF_INFO 0x95
+-#define SDVO_CMD_SET_HBUF_AV_SPLIT 0x96
+-#define SDVO_CMD_GET_HBUF_AV_SPLIT 0x97
+-#define SDVO_CMD_SET_HBUF_DATA 0x98
+-#define SDVO_CMD_GET_HBUF_DATA 0x99
+-#define SDVO_CMD_SET_HBUF_TXRATE 0x9a
+-#define SDVO_CMD_GET_HBUF_TXRATE 0x9b
+- #define SDVO_HBUF_TX_DISABLED (0 << 6)
+- #define SDVO_HBUF_TX_ONCE (2 << 6)
+- #define SDVO_HBUF_TX_VSYNC (3 << 6)
+-#define SDVO_CMD_GET_AUDIO_TX_INFO 0x9c
+-
+-struct intel_sdvo_encode{
+- u8 dvi_rev;
+- u8 hdmi_rev;
+-} __attribute__ ((packed));
++# define SDVO_CONTROL_BUS_PROM 0x0
++# define SDVO_CONTROL_BUS_DDC1 0x1
++# define SDVO_CONTROL_BUS_DDC2 0x2
++# define SDVO_CONTROL_BUS_DDC3 0x3
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_tv.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_tv.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/i915/intel_tv.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/i915/intel_tv.c 2009-05-10 23:48:28.000000000 +0200
+@@ -411,7 +411,7 @@
+ * These values account for -1s required.
+ */
+
+-static const struct tv_mode tv_modes[] = {
++const static struct tv_mode tv_modes[] = {
+ {
+ .name = "NTSC-M",
+ .clock = 107520,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/Kconfig linux-2.6.29-rc3.owrt/drivers/gpu/drm/Kconfig
+--- linux-2.6.29.owrt/drivers/gpu/drm/Kconfig 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -70,7 +70,7 @@
+ select FB_CFB_FILLRECT
+ select FB_CFB_COPYAREA
+ select FB_CFB_IMAGEBLIT
+- select FB
++ depends on FB
+ tristate "i915 driver"
+ help
+ Choose this option if you have a system that has Intel 830M, 845G,
+@@ -80,17 +80,18 @@
+ XFree86 4.4 and above. If unsure, build this and i830 as modules and
+ the X server will load the correct one.
+
++endchoice
++
+ config DRM_I915_KMS
+ bool "Enable modesetting on intel by default"
+ depends on DRM_I915
+ help
+- Choose this option if you want kernel modesetting enabled by default,
+- and you have a new enough userspace to support this. Running old
+- userspaces with this enabled will cause pain. Note that this causes
+- the driver to bind to PCI devices, which precludes loading things
+- like intelfb.
++ Choose this option if you want kernel modesetting enabled by default,
++ and you have a new enough userspace to support this. Running old
++ userspaces with this enabled will cause pain. Note that this causes
++ the driver to bind to PCI devices, which precludes loading things
++ like intelfb.
+
+-endchoice
+
+ config DRM_MGA
+ tristate "Matrox g200/g400"
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/gpu/drm/radeon/radeon_cp.c linux-2.6.29-rc3.owrt/drivers/gpu/drm/radeon/radeon_cp.c
+--- linux-2.6.29.owrt/drivers/gpu/drm/radeon/radeon_cp.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/gpu/drm/radeon/radeon_cp.c 2009-05-10 23:48:28.000000000 +0200
+@@ -557,10 +557,8 @@
+ }
+
+ static void radeon_cp_init_ring_buffer(struct drm_device * dev,
+- drm_radeon_private_t *dev_priv,
+- struct drm_file *file_priv)
++ drm_radeon_private_t * dev_priv)
+ {
+- struct drm_radeon_master_private *master_priv;
+ u32 ring_start, cur_read_ptr;
+ u32 tmp;
+
+@@ -679,14 +677,6 @@
+ dev_priv->scratch[2] = 0;
+ RADEON_WRITE(RADEON_LAST_CLEAR_REG, 0);
+
+- /* reset sarea copies of these */
+- master_priv = file_priv->master->driver_priv;
+- if (master_priv->sarea_priv) {
+- master_priv->sarea_priv->last_frame = 0;
+- master_priv->sarea_priv->last_dispatch = 0;
+- master_priv->sarea_priv->last_clear = 0;
+- }
+-
+ radeon_do_wait_for_idle(dev_priv);
+
+ /* Sync everything up */
+@@ -1049,9 +1039,9 @@
+
+ #if __OS_HAS_AGP
+ if (dev_priv->flags & RADEON_IS_AGP) {
+- drm_core_ioremap_wc(dev_priv->cp_ring, dev);
+- drm_core_ioremap_wc(dev_priv->ring_rptr, dev);
+- drm_core_ioremap_wc(dev->agp_buffer_map, dev);
++ drm_core_ioremap(dev_priv->cp_ring, dev);
++ drm_core_ioremap(dev_priv->ring_rptr, dev);
++ drm_core_ioremap(dev->agp_buffer_map, dev);
+ if (!dev_priv->cp_ring->handle ||
+ !dev_priv->ring_rptr->handle ||
+ !dev->agp_buffer_map->handle) {
+@@ -1225,7 +1215,7 @@
+ }
+
+ radeon_cp_load_microcode(dev_priv);
+- radeon_cp_init_ring_buffer(dev, dev_priv, file_priv);
++ radeon_cp_init_ring_buffer(dev, dev_priv);
+
+ dev_priv->last_buf = 0;
+
+@@ -1291,7 +1281,7 @@
+ *
+ * Charl P. Botha <http://cpbotha.net>
+ */
+-static int radeon_do_resume_cp(struct drm_device *dev, struct drm_file *file_priv)
++static int radeon_do_resume_cp(struct drm_device * dev)
+ {
+ drm_radeon_private_t *dev_priv = dev->dev_private;
+
+@@ -1314,7 +1304,7 @@
+ }
+
+ radeon_cp_load_microcode(dev_priv);
+- radeon_cp_init_ring_buffer(dev, dev_priv, file_priv);
++ radeon_cp_init_ring_buffer(dev, dev_priv);
+
+ radeon_do_engine_reset(dev);
+ radeon_irq_set_state(dev, RADEON_SW_INT_ENABLE, 1);
+@@ -1489,7 +1479,8 @@
+ */
+ int radeon_cp_resume(struct drm_device *dev, void *data, struct drm_file *file_priv)
+ {
+- return radeon_do_resume_cp(dev, file_priv);
++
++ return radeon_do_resume_cp(dev);
+ }
+
+ int radeon_engine_reset(struct drm_device *dev, void *data, struct drm_file *file_priv)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/hid/hid-core.c linux-2.6.29-rc3.owrt/drivers/hid/hid-core.c
+--- linux-2.6.29.owrt/drivers/hid/hid-core.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/hid/hid-core.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1218,7 +1218,6 @@
+ }
+ EXPORT_SYMBOL_GPL(hid_connect);
+
+-/* a list of devices for which there is a specialized driver on HID bus */
+ static const struct hid_device_id hid_blacklist[] = {
+ { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) },
+@@ -1300,13 +1299,7 @@
+ { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) },
+- { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb300) },
+- { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb304) },
+- { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb651) },
+- { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) },
+- { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) },
+- { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) },
+
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, 0x030c) },
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) },
+@@ -1483,7 +1476,6 @@
+ .uevent = hid_uevent,
+ };
+
+-/* a list of devices that shouldn't be handled by HID core at all */
+ static const struct hid_device_id hid_ignore_list[] = {
+ { HID_USB_DEVICE(USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_FLAIR) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_302) },
+@@ -1611,14 +1603,15 @@
+ { HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0002) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0003) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0004) },
+- { HID_USB_DEVICE(USB_VENDOR_ID_POWERCOM, USB_DEVICE_ID_POWERCOM_UPS) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_SOUNDGRAPH, USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_SOUNDGRAPH, USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD2) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_SOUNDGRAPH, USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD3) },
+- { HID_USB_DEVICE(USB_VENDOR_ID_SOUNDGRAPH, USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD4) },
+- { HID_USB_DEVICE(USB_VENDOR_ID_SOUNDGRAPH, USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD5) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_TENX, USB_DEVICE_ID_TENX_IBUDDY1) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_TENX, USB_DEVICE_ID_TENX_IBUDDY2) },
++ { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb300) },
++ { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb304) },
++ { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb651) },
++ { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LABPRO) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP) },
+@@ -1629,6 +1622,8 @@
+ { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_8_8_4_IF_KIT) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K) },
++ { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) },
++ { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) },
+ { }
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/hid/hid-ids.h linux-2.6.29-rc3.owrt/drivers/hid/hid-ids.h
+--- linux-2.6.29.owrt/drivers/hid/hid-ids.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/hid/hid-ids.h 2009-05-10 23:48:28.000000000 +0200
+@@ -348,9 +348,6 @@
+ #define USB_VENDOR_ID_PLAYDOTCOM 0x0b43
+ #define USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII 0x0003
+
+-#define USB_VENDOR_ID_POWERCOM 0x0d9f
+-#define USB_DEVICE_ID_POWERCOM_UPS 0x0002
+-
+ #define USB_VENDOR_ID_SAITEK 0x06a3
+ #define USB_DEVICE_ID_SAITEK_RUMBLEPAD 0xff17
+
+@@ -365,8 +362,6 @@
+ #define USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD 0x0038
+ #define USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD2 0x0036
+ #define USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD3 0x0034
+-#define USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD4 0x0044
+-#define USB_DEVICE_ID_SOUNDGRAPH_IMON_LCD5 0x0045
+
+ #define USB_VENDOR_ID_SUN 0x0430
+ #define USB_DEVICE_ID_RARITAN_KVM_DONGLE 0xcdab
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/hid/hid-microsoft.c linux-2.6.29-rc3.owrt/drivers/hid/hid-microsoft.c
+--- linux-2.6.29.owrt/drivers/hid/hid-microsoft.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/hid/hid-microsoft.c 2009-05-10 23:48:28.000000000 +0200
+@@ -30,7 +30,7 @@
+ #define MS_NOGET 0x10
+
+ /*
+- * Microsoft Wireless Desktop Receiver (Model 1028) has
++ * Microsoft Wireless Desktop Receiver (Model 1028) has several
+ * 'Usage Min/Max' where it ought to have 'Physical Min/Max'
+ */
+ static void ms_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+@@ -38,12 +38,17 @@
+ {
+ unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);
+
+- if ((quirks & MS_RDESC) && rsize == 571 && rdesc[557] == 0x19 &&
++ if ((quirks & MS_RDESC) && rsize == 571 && rdesc[284] == 0x19 &&
++ rdesc[286] == 0x2a && rdesc[304] == 0x19 &&
++ rdesc[306] == 0x29 && rdesc[352] == 0x1a &&
++ rdesc[355] == 0x2a && rdesc[557] == 0x19 &&
+ rdesc[559] == 0x29) {
+ dev_info(&hdev->dev, "fixing up Microsoft Wireless Receiver "
+ "Model 1028 report descriptor\n");
+- rdesc[557] = 0x35;
+- rdesc[559] = 0x45;
++ rdesc[284] = rdesc[304] = rdesc[557] = 0x35;
++ rdesc[352] = 0x36;
++ rdesc[286] = rdesc[355] = 0x46;
++ rdesc[306] = rdesc[559] = 0x45;
+ }
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/hid/hidraw.c linux-2.6.29-rc3.owrt/drivers/hid/hidraw.c
+--- linux-2.6.29.owrt/drivers/hid/hidraw.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/hid/hidraw.c 2009-05-10 23:48:28.000000000 +0200
+@@ -267,10 +267,8 @@
+ default:
+ {
+ struct hid_device *hid = dev->hid;
+- if (_IOC_TYPE(cmd) != 'H' || _IOC_DIR(cmd) != _IOC_READ) {
+- ret = -EINVAL;
+- break;
+- }
++ if (_IOC_TYPE(cmd) != 'H' || _IOC_DIR(cmd) != _IOC_READ)
++ return -EINVAL;
+
+ if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWNAME(0))) {
+ int len;
+@@ -279,9 +277,8 @@
+ len = strlen(hid->name) + 1;
+ if (len > _IOC_SIZE(cmd))
+ len = _IOC_SIZE(cmd);
+- ret = copy_to_user(user_arg, hid->name, len) ?
++ return copy_to_user(user_arg, hid->name, len) ?
+ -EFAULT : len;
+- break;
+ }
+
+ if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWPHYS(0))) {
+@@ -291,13 +288,12 @@
+ len = strlen(hid->phys) + 1;
+ if (len > _IOC_SIZE(cmd))
+ len = _IOC_SIZE(cmd);
+- ret = copy_to_user(user_arg, hid->phys, len) ?
++ return copy_to_user(user_arg, hid->phys, len) ?
+ -EFAULT : len;
+- break;
+ }
+ }
+
+- ret = -ENOTTY;
++ ret = -ENOTTY;
+ }
+ unlock_kernel();
+ return ret;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/hid/usbhid/hiddev.c linux-2.6.29-rc3.owrt/drivers/hid/usbhid/hiddev.c
+--- linux-2.6.29.owrt/drivers/hid/usbhid/hiddev.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/hid/usbhid/hiddev.c 2009-05-10 23:48:28.000000000 +0200
+@@ -306,7 +306,7 @@
+ return 0;
+ bail:
+ file->private_data = NULL;
+- kfree(list);
++ kfree(list->hiddev);
+ return res;
+ }
+
+@@ -323,7 +323,7 @@
+ */
+ static ssize_t hiddev_read(struct file * file, char __user * buffer, size_t count, loff_t *ppos)
+ {
+- DEFINE_WAIT(wait);
++ DECLARE_WAITQUEUE(wait, current);
+ struct hiddev_list *list = file->private_data;
+ int event_size;
+ int retval;
+@@ -656,7 +656,7 @@
+
+ case HIDIOCGSTRING:
+ mutex_lock(&hiddev->existancelock);
+- if (hiddev->exist)
++ if (!hiddev->exist)
+ r = hiddev_ioctl_string(hiddev, cmd, user_arg);
+ else
+ r = -ENODEV;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/hwmon/abituguru3.c linux-2.6.29-rc3.owrt/drivers/hwmon/abituguru3.c
+--- linux-2.6.29.owrt/drivers/hwmon/abituguru3.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/hwmon/abituguru3.c 2009-05-10 23:48:28.000000000 +0200
+@@ -760,11 +760,8 @@
+
+ for (i = 0; i < offset_count; i++)
+ if ((x = abituguru3_read(data, bank, offset + i, count,
+- buf + i * count)) != count) {
+- if (x < 0)
+- return x;
+- return i * count + x;
+- }
++ buf + i * count)) != count)
++ return i * count + (i && (x < 0)) ? 0 : x;
+
+ return i * count;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/hwmon/applesmc.c linux-2.6.29-rc3.owrt/drivers/hwmon/applesmc.c
+--- linux-2.6.29.owrt/drivers/hwmon/applesmc.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/hwmon/applesmc.c 2009-05-10 23:48:28.000000000 +0200
+@@ -83,7 +83,7 @@
+ /*
+ * Temperature sensors keys (sp78 - 2 bytes).
+ */
+-static const char *temperature_sensors_sets[][41] = {
++static const char* temperature_sensors_sets[][36] = {
+ /* Set 0: Macbook Pro */
+ { "TA0P", "TB0T", "TC0D", "TC0P", "TG0H", "TG0P", "TG0T", "Th0H",
+ "Th1H", "Tm0P", "Ts0P", "Ts1P", NULL },
+@@ -135,13 +135,6 @@
+ { "TB0T", "TB1S", "TB1T", "TB2S", "TB2T", "TC0D", "TN0D", "TTF0",
+ "TV0P", "TVFP", "TW0P", "Th0P", "Tp0P", "Tp1P", "TpFP", "Ts0P",
+ "Ts0S", NULL },
+-/* Set 16: Mac Pro 3,1 (2 x Quad-Core) */
+- { "TA0P", "TCAG", "TCAH", "TCBG", "TCBH", "TC0C", "TC0D", "TC0P",
+- "TC1C", "TC1D", "TC2C", "TC2D", "TC3C", "TC3D", "TH0P", "TH1P",
+- "TH2P", "TH3P", "TMAP", "TMAS", "TMBS", "TM0P", "TM0S", "TM1P",
+- "TM1S", "TM2P", "TM2S", "TM3S", "TM8P", "TM8S", "TM9P", "TM9S",
+- "TN0C", "TN0D", "TN0H", "TS0C", "Tp0C", "Tp1C", "Tv0S", "Tv1S",
+- NULL },
+ };
+
+ /* List of keys used to read/write fan speeds */
+@@ -1160,16 +1153,6 @@
+ applesmc_show_temperature, NULL, 33);
+ static SENSOR_DEVICE_ATTR(temp35_input, S_IRUGO,
+ applesmc_show_temperature, NULL, 34);
+-static SENSOR_DEVICE_ATTR(temp36_input, S_IRUGO,
+- applesmc_show_temperature, NULL, 35);
+-static SENSOR_DEVICE_ATTR(temp37_input, S_IRUGO,
+- applesmc_show_temperature, NULL, 36);
+-static SENSOR_DEVICE_ATTR(temp38_input, S_IRUGO,
+- applesmc_show_temperature, NULL, 37);
+-static SENSOR_DEVICE_ATTR(temp39_input, S_IRUGO,
+- applesmc_show_temperature, NULL, 38);
+-static SENSOR_DEVICE_ATTR(temp40_input, S_IRUGO,
+- applesmc_show_temperature, NULL, 39);
+
+ static struct attribute *temperature_attributes[] = {
+ &sensor_dev_attr_temp1_input.dev_attr.attr,
+@@ -1207,11 +1190,6 @@
+ &sensor_dev_attr_temp33_input.dev_attr.attr,
+ &sensor_dev_attr_temp34_input.dev_attr.attr,
+ &sensor_dev_attr_temp35_input.dev_attr.attr,
+- &sensor_dev_attr_temp36_input.dev_attr.attr,
+- &sensor_dev_attr_temp37_input.dev_attr.attr,
+- &sensor_dev_attr_temp38_input.dev_attr.attr,
+- &sensor_dev_attr_temp39_input.dev_attr.attr,
+- &sensor_dev_attr_temp40_input.dev_attr.attr,
+ NULL
+ };
+
+@@ -1334,8 +1312,6 @@
+ { .accelerometer = 0, .light = 0, .temperature_set = 14 },
+ /* MacBook Air 2,1: accelerometer, backlight and temperature set 15 */
+ { .accelerometer = 1, .light = 1, .temperature_set = 15 },
+-/* MacPro3,1: temperature set 16 */
+- { .accelerometer = 0, .light = 0, .temperature_set = 16 },
+ };
+
+ /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1".
+@@ -1393,10 +1369,6 @@
+ DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
+ DMI_MATCH(DMI_PRODUCT_NAME,"MacPro2") },
+ &applesmc_dmi_data[4]},
+- { applesmc_dmi_match, "Apple MacPro3", {
+- DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
+- DMI_MATCH(DMI_PRODUCT_NAME, "MacPro3") },
+- &applesmc_dmi_data[16]},
+ { applesmc_dmi_match, "Apple MacPro", {
+ DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "MacPro") },
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/hwmon/f71882fg.c linux-2.6.29-rc3.owrt/drivers/hwmon/f71882fg.c
+--- linux-2.6.29.owrt/drivers/hwmon/f71882fg.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/hwmon/f71882fg.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1872,7 +1872,7 @@
+
+ devid = superio_inw(sioaddr, SIO_REG_MANID);
+ if (devid != SIO_FINTEK_ID) {
+- pr_debug(DRVNAME ": Not a Fintek device\n");
++ printk(KERN_INFO DRVNAME ": Not a Fintek device\n");
+ goto exit;
+ }
+
+@@ -1932,7 +1932,7 @@
+ res.name = f71882fg_pdev->name;
+ err = acpi_check_resource_conflict(&res);
+ if (err)
+- goto exit_device_put;
++ return err;
+
+ err = platform_device_add_resources(f71882fg_pdev, &res, 1);
+ if (err) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/hwmon/f75375s.c linux-2.6.29-rc3.owrt/drivers/hwmon/f75375s.c
+--- linux-2.6.29.owrt/drivers/hwmon/f75375s.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/hwmon/f75375s.c 2009-05-10 23:48:28.000000000 +0200
+@@ -617,7 +617,7 @@
+ static int f75375_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
+ {
+- struct f75375_data *data;
++ struct f75375_data *data = i2c_get_clientdata(client);
+ struct f75375s_platform_data *f75375s_pdata = client->dev.platform_data;
+ int err;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/hwmon/hp_accel.c linux-2.6.29-rc3.owrt/drivers/hwmon/hp_accel.c
+--- linux-2.6.29.owrt/drivers/hwmon/hp_accel.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/hwmon/hp_accel.c 2009-05-10 23:48:28.000000000 +0200
+@@ -153,10 +153,7 @@
+ static struct axis_conversion lis3lv02d_axis_x_inverted = {-1, 2, 3};
+ static struct axis_conversion lis3lv02d_axis_z_inverted = {1, 2, -3};
+ static struct axis_conversion lis3lv02d_axis_xy_rotated_left = {-2, 1, 3};
+-static struct axis_conversion lis3lv02d_axis_xy_rotated_left_usd = {-2, 1, -3};
+ static struct axis_conversion lis3lv02d_axis_xy_swap_inverted = {-2, -1, 3};
+-static struct axis_conversion lis3lv02d_axis_xy_rotated_right = {2, -1, 3};
+-static struct axis_conversion lis3lv02d_axis_xy_swap_yz_inverted = {2, -1, -3};
+
+ #define AXIS_DMI_MATCH(_ident, _name, _axis) { \
+ .ident = _ident, \
+@@ -166,18 +163,6 @@
+ }, \
+ .driver_data = &lis3lv02d_axis_##_axis \
+ }
+-
+-#define AXIS_DMI_MATCH2(_ident, _class1, _name1, \
+- _class2, _name2, \
+- _axis) { \
+- .ident = _ident, \
+- .callback = lis3lv02d_dmi_matched, \
+- .matches = { \
+- DMI_MATCH(DMI_##_class1, _name1), \
+- DMI_MATCH(DMI_##_class2, _name2), \
+- }, \
+- .driver_data = &lis3lv02d_axis_##_axis \
+-}
+ static struct dmi_system_id lis3lv02d_dmi_ids[] = {
+ /* product names are truncated to match all kinds of a same model */
+ AXIS_DMI_MATCH("NC64x0", "HP Compaq nc64", x_inverted),
+@@ -187,22 +172,10 @@
+ AXIS_DMI_MATCH("NC2510", "HP Compaq 2510", y_inverted),
+ AXIS_DMI_MATCH("NC8510", "HP Compaq 8510", xy_swap_inverted),
+ AXIS_DMI_MATCH("HP2133", "HP 2133", xy_rotated_left),
+- AXIS_DMI_MATCH("NC653x", "HP Compaq 653", xy_rotated_left_usd),
+- AXIS_DMI_MATCH("NC673x", "HP Compaq 673", xy_rotated_left_usd),
+- AXIS_DMI_MATCH("NC651xx", "HP Compaq 651", xy_rotated_right),
+- AXIS_DMI_MATCH("NC671xx", "HP Compaq 671", xy_swap_yz_inverted),
+- /* Intel-based HP Pavilion dv5 */
+- AXIS_DMI_MATCH2("HPDV5_I",
+- PRODUCT_NAME, "HP Pavilion dv5",
+- BOARD_NAME, "3603",
+- x_inverted),
+- /* AMD-based HP Pavilion dv5 */
+- AXIS_DMI_MATCH2("HPDV5_A",
+- PRODUCT_NAME, "HP Pavilion dv5",
+- BOARD_NAME, "3600",
+- y_inverted),
+ { NULL, }
+ /* Laptop models without axis info (yet):
++ * "NC651xx" "HP Compaq 651"
++ * "NC671xx" "HP Compaq 671"
+ * "NC6910" "HP Compaq 6910"
+ * HP Compaq 8710x Notebook PC / Mobile Workstation
+ * "NC2400" "HP Compaq nc2400"
+@@ -235,49 +208,9 @@
+ .set_brightness = hpled_set,
+ };
+
+-static acpi_status
+-lis3lv02d_get_resource(struct acpi_resource *resource, void *context)
+-{
+- if (resource->type == ACPI_RESOURCE_TYPE_EXTENDED_IRQ) {
+- struct acpi_resource_extended_irq *irq;
+- u32 *device_irq = context;
+-
+- irq = &resource->data.extended_irq;
+- *device_irq = irq->interrupts[0];
+- }
+-
+- return AE_OK;
+-}
+-
+-static void lis3lv02d_enum_resources(struct acpi_device *device)
+-{
+- acpi_status status;
+-
+- status = acpi_walk_resources(device->handle, METHOD_NAME__CRS,
+- lis3lv02d_get_resource, &adev.irq);
+- if (ACPI_FAILURE(status))
+- printk(KERN_DEBUG DRIVER_NAME ": Error getting resources\n");
+-}
+-
+-static s16 lis3lv02d_read_16(acpi_handle handle, int reg)
+-{
+- u8 lo, hi;
+-
+- adev.read(handle, reg - 1, &lo);
+- adev.read(handle, reg, &hi);
+- /* In "12 bit right justified" mode, bit 6, bit 7, bit 8 = bit 5 */
+- return (s16)((hi << 8) | lo);
+-}
+-
+-static s16 lis3lv02d_read_8(acpi_handle handle, int reg)
+-{
+- s8 lo;
+- adev.read(handle, reg, &lo);
+- return lo;
+-}
+-
+ static int lis3lv02d_add(struct acpi_device *device)
+ {
++ u8 val;
+ int ret;
+
+ if (!device)
+@@ -291,22 +224,10 @@
+ strcpy(acpi_device_class(device), ACPI_MDPS_CLASS);
+ device->driver_data = &adev;
+
+- lis3lv02d_acpi_read(device->handle, WHO_AM_I, &adev.whoami);
+- switch (adev.whoami) {
+- case LIS_DOUBLE_ID:
+- printk(KERN_INFO DRIVER_NAME ": 2-byte sensor found\n");
+- adev.read_data = lis3lv02d_read_16;
+- adev.mdps_max_val = 2048;
+- break;
+- case LIS_SINGLE_ID:
+- printk(KERN_INFO DRIVER_NAME ": 1-byte sensor found\n");
+- adev.read_data = lis3lv02d_read_8;
+- adev.mdps_max_val = 128;
+- break;
+- default:
++ lis3lv02d_acpi_read(device->handle, WHO_AM_I, &val);
++ if ((val != LIS3LV02DL_ID) && (val != LIS302DL_ID)) {
+ printk(KERN_ERR DRIVER_NAME
+- ": unknown sensor type 0x%X\n", adev.whoami);
+- return -EINVAL;
++ ": Accelerometer chip not LIS3LV02D{L,Q}\n");
+ }
+
+ /* If possible use a "standard" axes order */
+@@ -321,9 +242,6 @@
+ if (ret)
+ return ret;
+
+- /* obtain IRQ number of our device from ACPI */
+- lis3lv02d_enum_resources(adev.device);
+-
+ ret = lis3lv02d_init_device(&adev);
+ if (ret) {
+ flush_work(&hpled_led.work);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/hwmon/it87.c linux-2.6.29-rc3.owrt/drivers/hwmon/it87.c
+--- linux-2.6.29.owrt/drivers/hwmon/it87.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/hwmon/it87.c 2009-05-10 23:48:28.000000000 +0200
+@@ -213,7 +213,7 @@
+
+ #define TEMP_TO_REG(val) (SENSORS_LIMIT(((val)<0?(((val)-500)/1000):\
+ ((val)+500)/1000),-128,127))
+-#define TEMP_FROM_REG(val) ((val) * 1000)
++#define TEMP_FROM_REG(val) (((val)>0x80?(val)-0x100:(val))*1000)
+
+ #define PWM_TO_REG(val) ((val) >> 1)
+ #define PWM_FROM_REG(val) (((val)&0x7f) << 1)
+@@ -267,9 +267,9 @@
+ u8 has_fan; /* Bitfield, fans enabled */
+ u16 fan[5]; /* Register values, possibly combined */
+ u16 fan_min[5]; /* Register values, possibly combined */
+- s8 temp[3]; /* Register value */
+- s8 temp_high[3]; /* Register value */
+- s8 temp_low[3]; /* Register value */
++ u8 temp[3]; /* Register value */
++ u8 temp_high[3]; /* Register value */
++ u8 temp_low[3]; /* Register value */
+ u8 sensor; /* Register value */
+ u8 fan_div[3]; /* Register encoding, shifted right */
+ u8 vid; /* Register encoding, combined */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/hwmon/Kconfig linux-2.6.29-rc3.owrt/drivers/hwmon/Kconfig
+--- linux-2.6.29.owrt/drivers/hwmon/Kconfig 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/hwmon/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -543,8 +543,8 @@
+ help
+ If you say yes here you get support for National Semiconductor LM90,
+ LM86, LM89 and LM99, Analog Devices ADM1032 and ADT7461, and Maxim
+- MAX6646, MAX6647, MAX6648, MAX6649, MAX6657, MAX6658, MAX6659,
+- MAX6680, MAX6681 and MAX6692 sensor chips.
++ MAX6646, MAX6647, MAX6649, MAX6657, MAX6658, MAX6659, MAX6680 and
++ MAX6681 sensor chips.
+
+ This driver can also be built as a module. If so, the module
+ will be called lm90.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/hwmon/lis3lv02d.c linux-2.6.29-rc3.owrt/drivers/hwmon/lis3lv02d.c
+--- linux-2.6.29.owrt/drivers/hwmon/lis3lv02d.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/hwmon/lis3lv02d.c 2009-05-10 23:48:28.000000000 +0200
+@@ -3,7 +3,7 @@
+ *
+ * Copyright (C) 2007-2008 Yan Burman
+ * Copyright (C) 2008 Eric Piel
+- * Copyright (C) 2008-2009 Pavel Machek
++ * Copyright (C) 2008 Pavel Machek
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+@@ -35,7 +35,6 @@
+ #include <linux/poll.h>
+ #include <linux/freezer.h>
+ #include <linux/uaccess.h>
+-#include <linux/miscdevice.h>
+ #include <acpi/acpi_drivers.h>
+ #include <asm/atomic.h>
+ #include "lis3lv02d.h"
+@@ -53,14 +52,24 @@
+ * joystick.
+ */
+
+-struct acpi_lis3lv02d adev = {
+- .misc_wait = __WAIT_QUEUE_HEAD_INITIALIZER(adev.misc_wait),
+-};
++/* Maximum value our axis may get for the input device (signed 12 bits) */
++#define MDPS_MAX_VAL 2048
+
++struct acpi_lis3lv02d adev;
+ EXPORT_SYMBOL_GPL(adev);
+
+ static int lis3lv02d_add_fs(struct acpi_device *device);
+
++static s16 lis3lv02d_read_16(acpi_handle handle, int reg)
++{
++ u8 lo, hi;
++
++ adev.read(handle, reg, &lo);
++ adev.read(handle, reg + 1, &hi);
++ /* In "12 bit right justified" mode, bit 6, bit 7, bit 8 = bit 5 */
++ return (s16)((hi << 8) | lo);
++}
++
+ /**
+ * lis3lv02d_get_axis - For the given axis, give the value converted
+ * @axis: 1,2,3 - can also be negative
+@@ -89,9 +98,9 @@
+ {
+ int position[3];
+
+- position[0] = adev.read_data(handle, OUTX);
+- position[1] = adev.read_data(handle, OUTY);
+- position[2] = adev.read_data(handle, OUTZ);
++ position[0] = lis3lv02d_read_16(handle, OUTX_L);
++ position[1] = lis3lv02d_read_16(handle, OUTY_L);
++ position[2] = lis3lv02d_read_16(handle, OUTZ_L);
+
+ *x = lis3lv02d_get_axis(adev.ac.x, position);
+ *y = lis3lv02d_get_axis(adev.ac.y, position);
+@@ -101,13 +110,26 @@
+ void lis3lv02d_poweroff(acpi_handle handle)
+ {
+ adev.is_on = 0;
++ /* disable X,Y,Z axis and power down */
++ adev.write(handle, CTRL_REG1, 0x00);
+ }
+ EXPORT_SYMBOL_GPL(lis3lv02d_poweroff);
+
+ void lis3lv02d_poweron(acpi_handle handle)
+ {
++ u8 val;
++
+ adev.is_on = 1;
+ adev.init(handle);
++ adev.write(handle, FF_WU_CFG, 0);
++ /*
++ * BDU: LSB and MSB values are not updated until both have been read.
++ * So the value read will always be correct.
++ * IEN: Interrupt for free-fall and DD, not for data-ready.
++ */
++ adev.read(handle, CTRL_REG2, &val);
++ val |= CTRL2_BDU | CTRL2_IEN;
++ adev.write(handle, CTRL_REG2, val);
+ }
+ EXPORT_SYMBOL_GPL(lis3lv02d_poweron);
+
+@@ -140,140 +162,6 @@
+ mutex_unlock(&dev->lock);
+ }
+
+-static irqreturn_t lis302dl_interrupt(int irq, void *dummy)
+-{
+- /*
+- * Be careful: on some HP laptops the bios force DD when on battery and
+- * the lid is closed. This leads to interrupts as soon as a little move
+- * is done.
+- */
+- atomic_inc(&adev.count);
+-
+- wake_up_interruptible(&adev.misc_wait);
+- kill_fasync(&adev.async_queue, SIGIO, POLL_IN);
+- return IRQ_HANDLED;
+-}
+-
+-static int lis3lv02d_misc_open(struct inode *inode, struct file *file)
+-{
+- int ret;
+-
+- if (test_and_set_bit(0, &adev.misc_opened))
+- return -EBUSY; /* already open */
+-
+- atomic_set(&adev.count, 0);
+-
+- /*
+- * The sensor can generate interrupts for free-fall and direction
+- * detection (distinguishable with FF_WU_SRC and DD_SRC) but to keep
+- * the things simple and _fast_ we activate it only for free-fall, so
+- * no need to read register (very slow with ACPI). For the same reason,
+- * we forbid shared interrupts.
+- *
+- * IRQF_TRIGGER_RISING seems pointless on HP laptops because the
+- * io-apic is not configurable (and generates a warning) but I keep it
+- * in case of support for other hardware.
+- */
+- ret = request_irq(adev.irq, lis302dl_interrupt, IRQF_TRIGGER_RISING,
+- DRIVER_NAME, &adev);
+-
+- if (ret) {
+- clear_bit(0, &adev.misc_opened);
+- printk(KERN_ERR DRIVER_NAME ": IRQ%d allocation failed\n", adev.irq);
+- return -EBUSY;
+- }
+- lis3lv02d_increase_use(&adev);
+- printk("lis3: registered interrupt %d\n", adev.irq);
+- return 0;
+-}
+-
+-static int lis3lv02d_misc_release(struct inode *inode, struct file *file)
+-{
+- fasync_helper(-1, file, 0, &adev.async_queue);
+- lis3lv02d_decrease_use(&adev);
+- free_irq(adev.irq, &adev);
+- clear_bit(0, &adev.misc_opened); /* release the device */
+- return 0;
+-}
+-
+-static ssize_t lis3lv02d_misc_read(struct file *file, char __user *buf,
+- size_t count, loff_t *pos)
+-{
+- DECLARE_WAITQUEUE(wait, current);
+- u32 data;
+- unsigned char byte_data;
+- ssize_t retval = 1;
+-
+- if (count < 1)
+- return -EINVAL;
+-
+- add_wait_queue(&adev.misc_wait, &wait);
+- while (true) {
+- set_current_state(TASK_INTERRUPTIBLE);
+- data = atomic_xchg(&adev.count, 0);
+- if (data)
+- break;
+-
+- if (file->f_flags & O_NONBLOCK) {
+- retval = -EAGAIN;
+- goto out;
+- }
+-
+- if (signal_pending(current)) {
+- retval = -ERESTARTSYS;
+- goto out;
+- }
+-
+- schedule();
+- }
+-
+- if (data < 255)
+- byte_data = data;
+- else
+- byte_data = 255;
+-
+- /* make sure we are not going into copy_to_user() with
+- * TASK_INTERRUPTIBLE state */
+- set_current_state(TASK_RUNNING);
+- if (copy_to_user(buf, &byte_data, sizeof(byte_data)))
+- retval = -EFAULT;
+-
+-out:
+- __set_current_state(TASK_RUNNING);
+- remove_wait_queue(&adev.misc_wait, &wait);
+-
+- return retval;
+-}
+-
+-static unsigned int lis3lv02d_misc_poll(struct file *file, poll_table *wait)
+-{
+- poll_wait(file, &adev.misc_wait, wait);
+- if (atomic_read(&adev.count))
+- return POLLIN | POLLRDNORM;
+- return 0;
+-}
+-
+-static int lis3lv02d_misc_fasync(int fd, struct file *file, int on)
+-{
+- return fasync_helper(fd, file, on, &adev.async_queue);
+-}
+-
+-static const struct file_operations lis3lv02d_misc_fops = {
+- .owner = THIS_MODULE,
+- .llseek = no_llseek,
+- .read = lis3lv02d_misc_read,
+- .open = lis3lv02d_misc_open,
+- .release = lis3lv02d_misc_release,
+- .poll = lis3lv02d_misc_poll,
+- .fasync = lis3lv02d_misc_fasync,
+-};
+-
+-static struct miscdevice lis3lv02d_misc_device = {
+- .minor = MISC_DYNAMIC_MINOR,
+- .name = "freefall",
+- .fops = &lis3lv02d_misc_fops,
+-};
+-
+ /**
+ * lis3lv02d_joystick_kthread - Kthread polling function
+ * @data: unused - here to conform to threadfn prototype
+@@ -315,6 +203,7 @@
+ lis3lv02d_decrease_use(&adev);
+ }
+
++
+ static inline void lis3lv02d_calibrate_joystick(void)
+ {
+ lis3lv02d_get_xyz(adev.device->handle, &adev.xcalib, &adev.ycalib, &adev.zcalib);
+@@ -342,9 +231,9 @@
+ adev.idev->close = lis3lv02d_joystick_close;
+
+ set_bit(EV_ABS, adev.idev->evbit);
+- input_set_abs_params(adev.idev, ABS_X, -adev.mdps_max_val, adev.mdps_max_val, 3, 3);
+- input_set_abs_params(adev.idev, ABS_Y, -adev.mdps_max_val, adev.mdps_max_val, 3, 3);
+- input_set_abs_params(adev.idev, ABS_Z, -adev.mdps_max_val, adev.mdps_max_val, 3, 3);
++ input_set_abs_params(adev.idev, ABS_X, -MDPS_MAX_VAL, MDPS_MAX_VAL, 3, 3);
++ input_set_abs_params(adev.idev, ABS_Y, -MDPS_MAX_VAL, MDPS_MAX_VAL, 3, 3);
++ input_set_abs_params(adev.idev, ABS_Z, -MDPS_MAX_VAL, MDPS_MAX_VAL, 3, 3);
+
+ err = input_register_device(adev.idev);
+ if (err) {
+@@ -361,7 +250,6 @@
+ if (!adev.idev)
+ return;
+
+- misc_deregister(&lis3lv02d_misc_device);
+ input_unregister_device(adev.idev);
+ adev.idev = NULL;
+ }
+@@ -380,19 +268,6 @@
+ if (lis3lv02d_joystick_enable())
+ printk(KERN_ERR DRIVER_NAME ": joystick initialization failed\n");
+
+- printk("lis3_init_device: irq %d\n", dev->irq);
+-
+- /* if we did not get an IRQ from ACPI - we have nothing more to do */
+- if (!dev->irq) {
+- printk(KERN_ERR DRIVER_NAME
+- ": No IRQ in ACPI. Disabling /dev/freefall\n");
+- goto out;
+- }
+-
+- printk("lis3: registering device\n");
+- if (misc_register(&lis3lv02d_misc_device))
+- printk(KERN_ERR DRIVER_NAME ": misc_register failed\n");
+-out:
+ lis3lv02d_decrease_use(dev);
+ return 0;
+ }
+@@ -476,6 +351,6 @@
+ EXPORT_SYMBOL_GPL(lis3lv02d_remove_fs);
+
+ MODULE_DESCRIPTION("ST LIS3LV02Dx three-axis digital accelerometer driver");
+-MODULE_AUTHOR("Yan Burman, Eric Piel, Pavel Machek");
++MODULE_AUTHOR("Yan Burman and Eric Piel");
+ MODULE_LICENSE("GPL");
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/hwmon/lis3lv02d.h linux-2.6.29-rc3.owrt/drivers/hwmon/lis3lv02d.h
+--- linux-2.6.29.owrt/drivers/hwmon/lis3lv02d.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/hwmon/lis3lv02d.h 2009-05-10 23:48:28.000000000 +0200
+@@ -22,15 +22,12 @@
+ /*
+ * The actual chip is STMicroelectronics LIS3LV02DL or LIS3LV02DQ that seems to
+ * be connected via SPI. There exists also several similar chips (such as LIS302DL or
+- * LIS3L02DQ) and they have slightly different registers, but we can provide a
+- * common interface for all of them.
++ * LIS3L02DQ) but not in the HP laptops and they have slightly different registers.
+ * They can also be connected via I²C.
+ */
+
+-/* 2-byte registers */
+-#define LIS_DOUBLE_ID 0x3A /* LIS3LV02D[LQ] */
+-/* 1-byte registers */
+-#define LIS_SINGLE_ID 0x3B /* LIS[32]02DL and others */
++#define LIS3LV02DL_ID 0x3A /* Also the LIS3LV02DQ */
++#define LIS302DL_ID 0x3B /* Also the LIS202DL! */
+
+ enum lis3lv02d_reg {
+ WHO_AM_I = 0x0F,
+@@ -47,13 +44,10 @@
+ STATUS_REG = 0x27,
+ OUTX_L = 0x28,
+ OUTX_H = 0x29,
+- OUTX = 0x29,
+ OUTY_L = 0x2A,
+ OUTY_H = 0x2B,
+- OUTY = 0x2B,
+ OUTZ_L = 0x2C,
+ OUTZ_H = 0x2D,
+- OUTZ = 0x2D,
+ FF_WU_CFG = 0x30,
+ FF_WU_SRC = 0x31,
+ FF_WU_ACK = 0x32,
+@@ -165,10 +159,6 @@
+ acpi_status (*write) (acpi_handle handle, int reg, u8 val);
+ acpi_status (*read) (acpi_handle handle, int reg, u8 *ret);
+
+- u8 whoami; /* 3Ah: 2-byte registries, 3Bh: 1-byte registries */
+- s16 (*read_data) (acpi_handle handle, int reg);
+- int mdps_max_val;
+-
+ struct input_dev *idev; /* input device */
+ struct task_struct *kthread; /* kthread for input */
+ struct mutex lock;
+@@ -180,11 +170,6 @@
+ unsigned char is_on; /* whether the device is on or off */
+ unsigned char usage; /* usage counter */
+ struct axis_conversion ac; /* hw -> logical axis */
+-
+- u32 irq; /* IRQ number */
+- struct fasync_struct *async_queue; /* queue for the misc device */
+- wait_queue_head_t misc_wait; /* Wait queue for the misc device */
+- unsigned long misc_opened; /* bit0: whether the device is open */
+ };
+
+ int lis3lv02d_init_device(struct acpi_lis3lv02d *dev);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/hwmon/lm85.c linux-2.6.29-rc3.owrt/drivers/hwmon/lm85.c
+--- linux-2.6.29.owrt/drivers/hwmon/lm85.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/hwmon/lm85.c 2009-05-10 23:48:28.000000000 +0200
+@@ -72,7 +72,6 @@
+ #define LM85_COMPANY_SMSC 0x5c
+ #define LM85_VERSTEP_VMASK 0xf0
+ #define LM85_VERSTEP_GENERIC 0x60
+-#define LM85_VERSTEP_GENERIC2 0x70
+ #define LM85_VERSTEP_LM85C 0x60
+ #define LM85_VERSTEP_LM85B 0x62
+ #define LM85_VERSTEP_ADM1027 0x60
+@@ -335,7 +334,6 @@
+ static const struct i2c_device_id lm85_id[] = {
+ { "adm1027", adm1027 },
+ { "adt7463", adt7463 },
+- { "adt7468", adt7468 },
+ { "lm85", any_chip },
+ { "lm85b", lm85b },
+ { "lm85c", lm85c },
+@@ -410,8 +408,7 @@
+ struct lm85_data *data = lm85_update_device(dev);
+ int vid;
+
+- if ((data->type == adt7463 || data->type == adt7468) &&
+- (data->vid & 0x80)) {
++ if (data->type == adt7463 && (data->vid & 0x80)) {
+ /* 6-pin VID (VRM 10) */
+ vid = vid_from_reg(data->vid & 0x3f, data->vrm);
+ } else {
+@@ -1156,8 +1153,7 @@
+ address, company, verstep);
+
+ /* All supported chips have the version in common */
+- if ((verstep & LM85_VERSTEP_VMASK) != LM85_VERSTEP_GENERIC &&
+- (verstep & LM85_VERSTEP_VMASK) != LM85_VERSTEP_GENERIC2) {
++ if ((verstep & LM85_VERSTEP_VMASK) != LM85_VERSTEP_GENERIC) {
+ dev_dbg(&adapter->dev, "Autodetection failed: "
+ "unsupported version\n");
+ return -ENODEV;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/hwmon/lm90.c linux-2.6.29-rc3.owrt/drivers/hwmon/lm90.c
+--- linux-2.6.29.owrt/drivers/hwmon/lm90.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/hwmon/lm90.c 2009-05-10 23:48:28.000000000 +0200
+@@ -32,10 +32,10 @@
+ * supported by this driver. These chips lack the remote temperature
+ * offset feature.
+ *
+- * This driver also supports the MAX6646, MAX6647, MAX6648, MAX6649 and
+- * MAX6692 chips made by Maxim. These are again similar to the LM86,
+- * but they use unsigned temperature values and can report temperatures
+- * from 0 to 145 degrees.
++ * This driver also supports the MAX6646, MAX6647 and MAX6649 chips
++ * made by Maxim. These are again similar to the LM86, but they use
++ * unsigned temperature values and can report temperatures from 0 to
++ * 145 degrees.
+ *
+ * This driver also supports the MAX6680 and MAX6681, two other sensor
+ * chips made by Maxim. These are quite similar to the other Maxim
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/hwmon/vt1211.c linux-2.6.29-rc3.owrt/drivers/hwmon/vt1211.c
+--- linux-2.6.29.owrt/drivers/hwmon/vt1211.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/hwmon/vt1211.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1262,7 +1262,7 @@
+ res.name = pdev->name;
+ err = acpi_check_resource_conflict(&res);
+ if (err)
+- goto EXIT_DEV_PUT;
++ goto EXIT;
+
+ err = platform_device_add_resources(pdev, &res, 1);
+ if (err) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/hwmon/w83627ehf.c linux-2.6.29-rc3.owrt/drivers/hwmon/w83627ehf.c
+--- linux-2.6.29.owrt/drivers/hwmon/w83627ehf.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/hwmon/w83627ehf.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1548,7 +1548,7 @@
+
+ err = acpi_check_resource_conflict(&res);
+ if (err)
+- goto exit_device_put;
++ goto exit;
+
+ err = platform_device_add_resources(pdev, &res, 1);
+ if (err) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/i2c/busses/i2c-acorn.c linux-2.6.29-rc3.owrt/drivers/i2c/busses/i2c-acorn.c
+--- linux-2.6.29.owrt/drivers/i2c/busses/i2c-acorn.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/i2c/busses/i2c-acorn.c 2009-05-10 23:48:28.000000000 +0200
+@@ -79,11 +79,10 @@
+ .getsda = ioc_getsda,
+ .getscl = ioc_getscl,
+ .udelay = 80,
+- .timeout = HZ,
++ .timeout = 100
+ };
+
+ static struct i2c_adapter ioc_ops = {
+- .nr = 0,
+ .algo_data = &ioc_data,
+ };
+
+@@ -91,7 +90,7 @@
+ {
+ force_ones = FORCE_ONES | SCL | SDA;
+
+- return i2c_bit_add_numbered_bus(&ioc_ops);
++ return i2c_bit_add_bus(&ioc_ops);
+ }
+
+ module_init(i2c_ioc_init);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/i2c/busses/i2c-amd8111.c linux-2.6.29-rc3.owrt/drivers/i2c/busses/i2c-amd8111.c
+--- linux-2.6.29.owrt/drivers/i2c/busses/i2c-amd8111.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/i2c/busses/i2c-amd8111.c 2009-05-10 23:48:28.000000000 +0200
+@@ -72,7 +72,7 @@
+ {
+ int timeout = 500;
+
+- while ((inb(smbus->base + AMD_EC_SC) & AMD_EC_SC_IBF) && --timeout)
++ while (timeout-- && (inb(smbus->base + AMD_EC_SC) & AMD_EC_SC_IBF))
+ udelay(1);
+
+ if (!timeout) {
+@@ -88,7 +88,7 @@
+ {
+ int timeout = 500;
+
+- while ((~inb(smbus->base + AMD_EC_SC) & AMD_EC_SC_OBF) && --timeout)
++ while (timeout-- && (~inb(smbus->base + AMD_EC_SC) & AMD_EC_SC_OBF))
+ udelay(1);
+
+ if (!timeout) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/i2c/busses/i2c-ixp2000.c linux-2.6.29-rc3.owrt/drivers/i2c/busses/i2c-ixp2000.c
+--- linux-2.6.29.owrt/drivers/i2c/busses/i2c-ixp2000.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/i2c/busses/i2c-ixp2000.c 2009-05-10 23:48:28.000000000 +0200
+@@ -114,7 +114,7 @@
+ drv_data->algo_data.getsda = ixp2000_bit_getsda;
+ drv_data->algo_data.getscl = ixp2000_bit_getscl;
+ drv_data->algo_data.udelay = 6;
+- drv_data->algo_data.timeout = HZ;
++ drv_data->algo_data.timeout = 100;
+
+ strlcpy(drv_data->adapter.name, plat_dev->dev.driver->name,
+ sizeof(drv_data->adapter.name));
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/i2c/busses/i2c-mv64xxx.c linux-2.6.29-rc3.owrt/drivers/i2c/busses/i2c-mv64xxx.c
+--- linux-2.6.29.owrt/drivers/i2c/busses/i2c-mv64xxx.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/i2c/busses/i2c-mv64xxx.c 2009-05-10 23:48:28.000000000 +0200
+@@ -482,7 +482,7 @@
+ return 0;
+ }
+
+-static void
++static void __devexit
+ mv64xxx_i2c_unmap_regs(struct mv64xxx_i2c_data *drv_data)
+ {
+ if (drv_data->reg_base) {
+@@ -577,7 +577,7 @@
+
+ static struct platform_driver mv64xxx_i2c_driver = {
+ .probe = mv64xxx_i2c_probe,
+- .remove = __devexit_p(mv64xxx_i2c_remove),
++ .remove = mv64xxx_i2c_remove,
+ .driver = {
+ .owner = THIS_MODULE,
+ .name = MV64XXX_I2C_CTLR_NAME,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/i2c/busses/i2c-pxa.c linux-2.6.29-rc3.owrt/drivers/i2c/busses/i2c-pxa.c
+--- linux-2.6.29.owrt/drivers/i2c/busses/i2c-pxa.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/i2c/busses/i2c-pxa.c 2009-05-10 23:48:28.000000000 +0200
+@@ -644,7 +644,7 @@
+
+ i2c_pxa_start_message(i2c);
+
+- while (i2c->msg_num > 0 && --timeout) {
++ while (timeout-- && i2c->msg_num > 0) {
+ i2c_pxa_handler(0, i2c);
+ udelay(10);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/i2c/busses/scx200_i2c.c linux-2.6.29-rc3.owrt/drivers/i2c/busses/scx200_i2c.c
+--- linux-2.6.29.owrt/drivers/i2c/busses/scx200_i2c.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/i2c/busses/scx200_i2c.c 2009-05-10 23:48:28.000000000 +0200
+@@ -76,7 +76,7 @@
+ .getsda = scx200_i2c_getsda,
+ .getscl = scx200_i2c_getscl,
+ .udelay = 10,
+- .timeout = HZ,
++ .timeout = 100,
+ };
+
+ static struct i2c_adapter scx200_i2c_ops = {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/i2c/i2c-core.c linux-2.6.29-rc3.owrt/drivers/i2c/i2c-core.c
+--- linux-2.6.29.owrt/drivers/i2c/i2c-core.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/i2c/i2c-core.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1831,8 +1831,7 @@
+ case I2C_SMBUS_QUICK:
+ msg[0].len = 0;
+ /* Special case: The read/write field is used as data */
+- msg[0].flags = flags | (read_write == I2C_SMBUS_READ ?
+- I2C_M_RD : 0);
++ msg[0].flags = flags | (read_write==I2C_SMBUS_READ)?I2C_M_RD:0;
+ num = 1;
+ break;
+ case I2C_SMBUS_BYTE:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/i2c/i2c-dev.c linux-2.6.29-rc3.owrt/drivers/i2c/i2c-dev.c
+--- linux-2.6.29.owrt/drivers/i2c/i2c-dev.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/i2c/i2c-dev.c 2009-05-10 23:48:28.000000000 +0200
+@@ -35,7 +35,6 @@
+ #include <linux/i2c.h>
+ #include <linux/i2c-dev.h>
+ #include <linux/smp_lock.h>
+-#include <linux/jiffies.h>
+ #include <asm/uaccess.h>
+
+ static struct i2c_driver i2cdev_driver;
+@@ -423,10 +422,7 @@
+ client->adapter->retries = arg;
+ break;
+ case I2C_TIMEOUT:
+- /* For historical reasons, user-space sets the timeout
+- * value in units of 10 ms.
+- */
+- client->adapter->timeout = msecs_to_jiffies(arg * 10);
++ client->adapter->timeout = arg;
+ break;
+ default:
+ /* NOTE: returning a fault code here could cause trouble
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/amd74xx.c linux-2.6.29-rc3.owrt/drivers/ide/amd74xx.c
+--- linux-2.6.29.owrt/drivers/ide/amd74xx.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/amd74xx.c 2009-05-10 23:48:28.000000000 +0200
+@@ -166,7 +166,7 @@
+ * Check for broken FIFO support.
+ */
+ if (dev->vendor == PCI_VENDOR_ID_AMD &&
+- dev->device == PCI_DEVICE_ID_AMD_VIPER_7411)
++ dev->vendor == PCI_DEVICE_ID_AMD_VIPER_7411)
+ t &= 0x0f;
+ else
+ t |= 0xf0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/at91_ide.c linux-2.6.29-rc3.owrt/drivers/ide/at91_ide.c
+--- linux-2.6.29.owrt/drivers/ide/at91_ide.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/at91_ide.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,467 +0,0 @@
+-/*
+- * IDE host driver for AT91 (SAM9, CAP9, AT572D940HF) Static Memory Controller
+- * with Compact Flash True IDE logic
+- *
+- * Copyright (c) 2008, 2009 Kelvatek Ltd.
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+- *
+- */
+-
+-#include <linux/version.h>
+-#include <linux/kernel.h>
+-#include <linux/module.h>
+-#include <linux/clk.h>
+-#include <linux/err.h>
+-#include <linux/ide.h>
+-#include <linux/platform_device.h>
+-
+-#include <mach/board.h>
+-#include <mach/gpio.h>
+-#include <mach/at91sam9263.h>
+-#include <mach/at91sam9_smc.h>
+-#include <mach/at91sam9263_matrix.h>
+-
+-#define DRV_NAME "at91_ide"
+-
+-#define perr(fmt, args...) pr_err(DRV_NAME ": " fmt, ##args)
+-#define pdbg(fmt, args...) pr_debug("%s " fmt, __func__, ##args)
+-
+-/*
+- * Access to IDE device is possible through EBI Static Memory Controller
+- * with Compact Flash logic. For details see EBI and SMC datasheet sections
+- * of any microcontroller from AT91SAM9 family.
+- *
+- * Within SMC chip select address space, lines A[23:21] distinguish Compact
+- * Flash modes (I/O, common memory, attribute memory, True IDE). IDE modes are:
+- * 0x00c0000 - True IDE
+- * 0x00e0000 - Alternate True IDE (Alt Status Register)
+- *
+- * On True IDE mode Task File and Data Register are mapped at the same address.
+- * To distinguish access between these two different bus data width is used:
+- * 8Bit for Task File, 16Bit for Data I/O.
+- *
+- * After initialization we do 8/16 bit flipping (changes in SMC MODE register)
+- * only inside IDE callback routines which are serialized by IDE layer,
+- * so no additional locking needed.
+- */
+-
+-#define TASK_FILE 0x00c00000
+-#define ALT_MODE 0x00e00000
+-#define REGS_SIZE 8
+-
+-#define enter_16bit(cs, mode) do { \
+- mode = at91_sys_read(AT91_SMC_MODE(cs)); \
+- at91_sys_write(AT91_SMC_MODE(cs), mode | AT91_SMC_DBW_16); \
+-} while (0)
+-
+-#define leave_16bit(cs, mode) at91_sys_write(AT91_SMC_MODE(cs), mode);
+-
+-static void set_smc_timings(const u8 chipselect, const u16 cycle,
+- const u16 setup, const u16 pulse,
+- const u16 data_float, int use_iordy)
+-{
+- unsigned long mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE |
+- AT91_SMC_BAT_SELECT;
+-
+- /* disable or enable waiting for IORDY signal */
+- if (use_iordy)
+- mode |= AT91_SMC_EXNWMODE_READY;
+-
+- /* add data float cycles if needed */
+- if (data_float)
+- mode |= AT91_SMC_TDF_(data_float);
+-
+- at91_sys_write(AT91_SMC_MODE(chipselect), mode);
+-
+- /* setup timings in SMC */
+- at91_sys_write(AT91_SMC_SETUP(chipselect), AT91_SMC_NWESETUP_(setup) |
+- AT91_SMC_NCS_WRSETUP_(0) |
+- AT91_SMC_NRDSETUP_(setup) |
+- AT91_SMC_NCS_RDSETUP_(0));
+- at91_sys_write(AT91_SMC_PULSE(chipselect), AT91_SMC_NWEPULSE_(pulse) |
+- AT91_SMC_NCS_WRPULSE_(cycle) |
+- AT91_SMC_NRDPULSE_(pulse) |
+- AT91_SMC_NCS_RDPULSE_(cycle));
+- at91_sys_write(AT91_SMC_CYCLE(chipselect), AT91_SMC_NWECYCLE_(cycle) |
+- AT91_SMC_NRDCYCLE_(cycle));
+-}
+-
+-static unsigned int calc_mck_cycles(unsigned int ns, unsigned int mck_hz)
+-{
+- u64 tmp = ns;
+-
+- tmp *= mck_hz;
+- tmp += 1000*1000*1000 - 1; /* round up */
+- do_div(tmp, 1000*1000*1000);
+- return (unsigned int) tmp;
+-}
+-
+-static void apply_timings(const u8 chipselect, const u8 pio,
+- const struct ide_timing *timing, int use_iordy)
+-{
+- unsigned int t0, t1, t2, t6z;
+- unsigned int cycle, setup, pulse, data_float;
+- unsigned int mck_hz;
+- struct clk *mck;
+-
+- /* see table 22 of Compact Flash standard 4.1 for the meaning,
+- * we do not stretch active (t2) time, so setup (t1) + hold time (th)
+- * assure at least minimal recovery (t2i) time */
+- t0 = timing->cyc8b;
+- t1 = timing->setup;
+- t2 = timing->act8b;
+- t6z = (pio < 5) ? 30 : 20;
+-
+- pdbg("t0=%u t1=%u t2=%u t6z=%u\n", t0, t1, t2, t6z);
+-
+- mck = clk_get(NULL, "mck");
+- BUG_ON(IS_ERR(mck));
+- mck_hz = clk_get_rate(mck);
+- pdbg("mck_hz=%u\n", mck_hz);
+-
+- cycle = calc_mck_cycles(t0, mck_hz);
+- setup = calc_mck_cycles(t1, mck_hz);
+- pulse = calc_mck_cycles(t2, mck_hz);
+- data_float = calc_mck_cycles(t6z, mck_hz);
+-
+- pdbg("cycle=%u setup=%u pulse=%u data_float=%u\n",
+- cycle, setup, pulse, data_float);
+-
+- set_smc_timings(chipselect, cycle, setup, pulse, data_float, use_iordy);
+-}
+-
+-static void at91_ide_input_data(ide_drive_t *drive, struct request *rq,
+- void *buf, unsigned int len)
+-{
+- ide_hwif_t *hwif = drive->hwif;
+- struct ide_io_ports *io_ports = &hwif->io_ports;
+- u8 chipselect = hwif->select_data;
+- unsigned long mode;
+-
+- pdbg("cs %u buf %p len %d\n", chipselect, buf, len);
+-
+- len++;
+-
+- enter_16bit(chipselect, mode);
+- __ide_mm_insw((void __iomem *) io_ports->data_addr, buf, len / 2);
+- leave_16bit(chipselect, mode);
+-}
+-
+-static void at91_ide_output_data(ide_drive_t *drive, struct request *rq,
+- void *buf, unsigned int len)
+-{
+- ide_hwif_t *hwif = drive->hwif;
+- struct ide_io_ports *io_ports = &hwif->io_ports;
+- u8 chipselect = hwif->select_data;
+- unsigned long mode;
+-
+- pdbg("cs %u buf %p len %d\n", chipselect, buf, len);
+-
+- enter_16bit(chipselect, mode);
+- __ide_mm_outsw((void __iomem *) io_ports->data_addr, buf, len / 2);
+- leave_16bit(chipselect, mode);
+-}
+-
+-static u8 ide_mm_inb(unsigned long port)
+-{
+- return readb((void __iomem *) port);
+-}
+-
+-static void ide_mm_outb(u8 value, unsigned long port)
+-{
+- writeb(value, (void __iomem *) port);
+-}
+-
+-static void at91_ide_tf_load(ide_drive_t *drive, ide_task_t *task)
+-{
+- ide_hwif_t *hwif = drive->hwif;
+- struct ide_io_ports *io_ports = &hwif->io_ports;
+- struct ide_taskfile *tf = &task->tf;
+- u8 HIHI = (task->tf_flags & IDE_TFLAG_LBA48) ? 0xE0 : 0xEF;
+-
+- if (task->tf_flags & IDE_TFLAG_FLAGGED)
+- HIHI = 0xFF;
+-
+- if (task->tf_flags & IDE_TFLAG_OUT_DATA) {
+- u16 data = (tf->hob_data << 8) | tf->data;
+-
+- at91_ide_output_data(drive, NULL, &data, 2);
+- }
+-
+- if (task->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE)
+- ide_mm_outb(tf->hob_feature, io_ports->feature_addr);
+- if (task->tf_flags & IDE_TFLAG_OUT_HOB_NSECT)
+- ide_mm_outb(tf->hob_nsect, io_ports->nsect_addr);
+- if (task->tf_flags & IDE_TFLAG_OUT_HOB_LBAL)
+- ide_mm_outb(tf->hob_lbal, io_ports->lbal_addr);
+- if (task->tf_flags & IDE_TFLAG_OUT_HOB_LBAM)
+- ide_mm_outb(tf->hob_lbam, io_ports->lbam_addr);
+- if (task->tf_flags & IDE_TFLAG_OUT_HOB_LBAH)
+- ide_mm_outb(tf->hob_lbah, io_ports->lbah_addr);
+-
+- if (task->tf_flags & IDE_TFLAG_OUT_FEATURE)
+- ide_mm_outb(tf->feature, io_ports->feature_addr);
+- if (task->tf_flags & IDE_TFLAG_OUT_NSECT)
+- ide_mm_outb(tf->nsect, io_ports->nsect_addr);
+- if (task->tf_flags & IDE_TFLAG_OUT_LBAL)
+- ide_mm_outb(tf->lbal, io_ports->lbal_addr);
+- if (task->tf_flags & IDE_TFLAG_OUT_LBAM)
+- ide_mm_outb(tf->lbam, io_ports->lbam_addr);
+- if (task->tf_flags & IDE_TFLAG_OUT_LBAH)
+- ide_mm_outb(tf->lbah, io_ports->lbah_addr);
+-
+- if (task->tf_flags & IDE_TFLAG_OUT_DEVICE)
+- ide_mm_outb((tf->device & HIHI) | drive->select, io_ports->device_addr);
+-}
+-
+-static void at91_ide_tf_read(ide_drive_t *drive, ide_task_t *task)
+-{
+- ide_hwif_t *hwif = drive->hwif;
+- struct ide_io_ports *io_ports = &hwif->io_ports;
+- struct ide_taskfile *tf = &task->tf;
+-
+- if (task->tf_flags & IDE_TFLAG_IN_DATA) {
+- u16 data;
+-
+- at91_ide_input_data(drive, NULL, &data, 2);
+- tf->data = data & 0xff;
+- tf->hob_data = (data >> 8) & 0xff;
+- }
+-
+- /* be sure we're looking at the low order bits */
+- ide_mm_outb(ATA_DEVCTL_OBS & ~0x80, io_ports->ctl_addr);
+-
+- if (task->tf_flags & IDE_TFLAG_IN_FEATURE)
+- tf->feature = ide_mm_inb(io_ports->feature_addr);
+- if (task->tf_flags & IDE_TFLAG_IN_NSECT)
+- tf->nsect = ide_mm_inb(io_ports->nsect_addr);
+- if (task->tf_flags & IDE_TFLAG_IN_LBAL)
+- tf->lbal = ide_mm_inb(io_ports->lbal_addr);
+- if (task->tf_flags & IDE_TFLAG_IN_LBAM)
+- tf->lbam = ide_mm_inb(io_ports->lbam_addr);
+- if (task->tf_flags & IDE_TFLAG_IN_LBAH)
+- tf->lbah = ide_mm_inb(io_ports->lbah_addr);
+- if (task->tf_flags & IDE_TFLAG_IN_DEVICE)
+- tf->device = ide_mm_inb(io_ports->device_addr);
+-
+- if (task->tf_flags & IDE_TFLAG_LBA48) {
+- ide_mm_outb(ATA_DEVCTL_OBS | 0x80, io_ports->ctl_addr);
+-
+- if (task->tf_flags & IDE_TFLAG_IN_HOB_FEATURE)
+- tf->hob_feature = ide_mm_inb(io_ports->feature_addr);
+- if (task->tf_flags & IDE_TFLAG_IN_HOB_NSECT)
+- tf->hob_nsect = ide_mm_inb(io_ports->nsect_addr);
+- if (task->tf_flags & IDE_TFLAG_IN_HOB_LBAL)
+- tf->hob_lbal = ide_mm_inb(io_ports->lbal_addr);
+- if (task->tf_flags & IDE_TFLAG_IN_HOB_LBAM)
+- tf->hob_lbam = ide_mm_inb(io_ports->lbam_addr);
+- if (task->tf_flags & IDE_TFLAG_IN_HOB_LBAH)
+- tf->hob_lbah = ide_mm_inb(io_ports->lbah_addr);
+- }
+-}
+-
+-static void at91_ide_set_pio_mode(ide_drive_t *drive, const u8 pio)
+-{
+- struct ide_timing *timing;
+- u8 chipselect = drive->hwif->select_data;
+- int use_iordy = 0;
+-
+- pdbg("chipselect %u pio %u\n", chipselect, pio);
+-
+- timing = ide_timing_find_mode(XFER_PIO_0 + pio);
+- BUG_ON(!timing);
+-
+- if ((pio > 2 || ata_id_has_iordy(drive->id)) &&
+- !(ata_id_is_cfa(drive->id) && pio > 4))
+- use_iordy = 1;
+-
+- apply_timings(chipselect, pio, timing, use_iordy);
+-}
+-
+-static const struct ide_tp_ops at91_ide_tp_ops = {
+- .exec_command = ide_exec_command,
+- .read_status = ide_read_status,
+- .read_altstatus = ide_read_altstatus,
+- .set_irq = ide_set_irq,
+-
+- .tf_load = at91_ide_tf_load,
+- .tf_read = at91_ide_tf_read,
+-
+- .input_data = at91_ide_input_data,
+- .output_data = at91_ide_output_data,
+-};
+-
+-static const struct ide_port_ops at91_ide_port_ops = {
+- .set_pio_mode = at91_ide_set_pio_mode,
+-};
+-
+-static const struct ide_port_info at91_ide_port_info __initdata = {
+- .port_ops = &at91_ide_port_ops,
+- .tp_ops = &at91_ide_tp_ops,
+- .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA | IDE_HFLAG_SINGLE |
+- IDE_HFLAG_NO_IO_32BIT | IDE_HFLAG_UNMASK_IRQS,
+- .pio_mask = ATA_PIO5,
+-};
+-
+-/*
+- * If interrupt is delivered through GPIO, IRQ are triggered on falling
+- * and rising edge of signal. Whereas IDE device request interrupt on high
+- * level (rising edge in our case). This mean we have fake interrupts, so
+- * we need to check interrupt pin and exit instantly from ISR when line
+- * is on low level.
+- */
+-
+-irqreturn_t at91_irq_handler(int irq, void *dev_id)
+-{
+- int ntries = 8;
+- int pin_val1, pin_val2;
+-
+- /* additional deglitch, line can be noisy in badly designed PCB */
+- do {
+- pin_val1 = at91_get_gpio_value(irq);
+- pin_val2 = at91_get_gpio_value(irq);
+- } while (pin_val1 != pin_val2 && --ntries > 0);
+-
+- if (pin_val1 == 0 || ntries <= 0)
+- return IRQ_HANDLED;
+-
+- return ide_intr(irq, dev_id);
+-}
+-
+-static int __init at91_ide_probe(struct platform_device *pdev)
+-{
+- int ret;
+- hw_regs_t hw;
+- hw_regs_t *hws[] = { &hw, NULL, NULL, NULL };
+- struct ide_host *host;
+- struct resource *res;
+- unsigned long tf_base = 0, ctl_base = 0;
+- struct at91_cf_data *board = pdev->dev.platform_data;
+-
+- if (!board)
+- return -ENODEV;
+-
+- if (board->det_pin && at91_get_gpio_value(board->det_pin) != 0) {
+- perr("no device detected\n");
+- return -ENODEV;
+- }
+-
+- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+- if (!res) {
+- perr("can't get memory resource\n");
+- return -ENODEV;
+- }
+-
+- if (!devm_request_mem_region(&pdev->dev, res->start + TASK_FILE,
+- REGS_SIZE, "ide") ||
+- !devm_request_mem_region(&pdev->dev, res->start + ALT_MODE,
+- REGS_SIZE, "alt")) {
+- perr("memory resources in use\n");
+- return -EBUSY;
+- }
+-
+- pdbg("chipselect %u irq %u res %08lx\n", board->chipselect,
+- board->irq_pin, (unsigned long) res->start);
+-
+- tf_base = (unsigned long) devm_ioremap(&pdev->dev, res->start + TASK_FILE,
+- REGS_SIZE);
+- ctl_base = (unsigned long) devm_ioremap(&pdev->dev, res->start + ALT_MODE,
+- REGS_SIZE);
+- if (!tf_base || !ctl_base) {
+- perr("can't map memory regions\n");
+- return -EBUSY;
+- }
+-
+- memset(&hw, 0, sizeof(hw));
+-
+- if (board->flags & AT91_IDE_SWAP_A0_A2) {
+- /* workaround for stupid hardware bug */
+- hw.io_ports.data_addr = tf_base + 0;
+- hw.io_ports.error_addr = tf_base + 4;
+- hw.io_ports.nsect_addr = tf_base + 2;
+- hw.io_ports.lbal_addr = tf_base + 6;
+- hw.io_ports.lbam_addr = tf_base + 1;
+- hw.io_ports.lbah_addr = tf_base + 5;
+- hw.io_ports.device_addr = tf_base + 3;
+- hw.io_ports.command_addr = tf_base + 7;
+- hw.io_ports.ctl_addr = ctl_base + 3;
+- } else
+- ide_std_init_ports(&hw, tf_base, ctl_base + 6);
+-
+- hw.irq = board->irq_pin;
+- hw.chipset = ide_generic;
+- hw.dev = &pdev->dev;
+-
+- host = ide_host_alloc(&at91_ide_port_info, hws);
+- if (!host) {
+- perr("failed to allocate ide host\n");
+- return -ENOMEM;
+- }
+-
+- /* setup Static Memory Controller - PIO 0 as default */
+- apply_timings(board->chipselect, 0, ide_timing_find_mode(XFER_PIO_0), 0);
+-
+- /* with GPIO interrupt we have to do quirks in handler */
+- if (board->irq_pin >= PIN_BASE)
+- host->irq_handler = at91_irq_handler;
+-
+- host->ports[0]->select_data = board->chipselect;
+-
+- ret = ide_host_register(host, &at91_ide_port_info, hws);
+- if (ret) {
+- perr("failed to register ide host\n");
+- goto err_free_host;
+- }
+- platform_set_drvdata(pdev, host);
+- return 0;
+-
+-err_free_host:
+- ide_host_free(host);
+- return ret;
+-}
+-
+-static int __exit at91_ide_remove(struct platform_device *pdev)
+-{
+- struct ide_host *host = platform_get_drvdata(pdev);
+-
+- ide_host_remove(host);
+- return 0;
+-}
+-
+-static struct platform_driver at91_ide_driver = {
+- .driver = {
+- .name = DRV_NAME,
+- .owner = THIS_MODULE,
+- },
+- .remove = __exit_p(at91_ide_remove),
+-};
+-
+-static int __init at91_ide_init(void)
+-{
+- return platform_driver_probe(&at91_ide_driver, at91_ide_probe);
+-}
+-
+-static void __exit at91_ide_exit(void)
+-{
+- platform_driver_unregister(&at91_ide_driver);
+-}
+-
+-module_init(at91_ide_init);
+-module_exit(at91_ide_exit);
+-
+-MODULE_LICENSE("GPL");
+-MODULE_AUTHOR("Stanislaw Gruszka <stf_xl@wp.pl>");
+-
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/atiixp.c linux-2.6.29-rc3.owrt/drivers/ide/atiixp.c
+--- linux-2.6.29.owrt/drivers/ide/atiixp.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/atiixp.c 2009-05-10 23:48:28.000000000 +0200
+@@ -52,7 +52,7 @@
+ {
+ struct pci_dev *dev = to_pci_dev(drive->hwif->dev);
+ unsigned long flags;
+- int timing_shift = (drive->dn ^ 1) * 8;
++ int timing_shift = (drive->dn & 2) ? 16 : 0 + (drive->dn & 1) ? 0 : 8;
+ u32 pio_timing_data;
+ u16 pio_mode_data;
+
+@@ -85,7 +85,7 @@
+ {
+ struct pci_dev *dev = to_pci_dev(drive->hwif->dev);
+ unsigned long flags;
+- int timing_shift = (drive->dn ^ 1) * 8;
++ int timing_shift = (drive->dn & 2) ? 16 : 0 + (drive->dn & 1) ? 0 : 8;
+ u32 tmp32;
+ u16 tmp16;
+ u16 udma_ctl = 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/cs5536.c linux-2.6.29-rc3.owrt/drivers/ide/cs5536.c
+--- linux-2.6.29.owrt/drivers/ide/cs5536.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/cs5536.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,308 +0,0 @@
+-/*
+- * CS5536 PATA support
+- * (C) 2007 Martin K. Petersen <mkp@mkp.net>
+- * (C) 2009 Bartlomiej Zolnierkiewicz
+- *
+- * 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.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- *
+- * Documentation:
+- * Available from AMD web site.
+- *
+- * The IDE timing registers for the CS5536 live in the Geode Machine
+- * Specific Register file and not PCI config space. Most BIOSes
+- * virtualize the PCI registers so the chip looks like a standard IDE
+- * controller. Unfortunately not all implementations get this right.
+- * In particular some have problems with unaligned accesses to the
+- * virtualized PCI registers. This driver always does full dword
+- * writes to work around the issue. Also, in case of a bad BIOS this
+- * driver can be loaded with the "msr=1" parameter which forces using
+- * the Machine Specific Registers to configure the device.
+- */
+-
+-#include <linux/kernel.h>
+-#include <linux/module.h>
+-#include <linux/pci.h>
+-#include <linux/init.h>
+-#include <linux/ide.h>
+-#include <asm/msr.h>
+-
+-#define DRV_NAME "cs5536"
+-
+-enum {
+- MSR_IDE_CFG = 0x51300010,
+- PCI_IDE_CFG = 0x40,
+-
+- CFG = 0,
+- DTC = 2,
+- CAST = 3,
+- ETC = 4,
+-
+- IDE_CFG_CHANEN = (1 << 1),
+- IDE_CFG_CABLE = (1 << 17) | (1 << 16),
+-
+- IDE_D0_SHIFT = 24,
+- IDE_D1_SHIFT = 16,
+- IDE_DRV_MASK = 0xff,
+-
+- IDE_CAST_D0_SHIFT = 6,
+- IDE_CAST_D1_SHIFT = 4,
+- IDE_CAST_DRV_MASK = 0x3,
+-
+- IDE_CAST_CMD_SHIFT = 24,
+- IDE_CAST_CMD_MASK = 0xff,
+-
+- IDE_ETC_UDMA_MASK = 0xc0,
+-};
+-
+-static int use_msr;
+-
+-static int cs5536_read(struct pci_dev *pdev, int reg, u32 *val)
+-{
+- if (unlikely(use_msr)) {
+- u32 dummy;
+-
+- rdmsr(MSR_IDE_CFG + reg, *val, dummy);
+- return 0;
+- }
+-
+- return pci_read_config_dword(pdev, PCI_IDE_CFG + reg * 4, val);
+-}
+-
+-static int cs5536_write(struct pci_dev *pdev, int reg, int val)
+-{
+- if (unlikely(use_msr)) {
+- wrmsr(MSR_IDE_CFG + reg, val, 0);
+- return 0;
+- }
+-
+- return pci_write_config_dword(pdev, PCI_IDE_CFG + reg * 4, val);
+-}
+-
+-static void cs5536_program_dtc(ide_drive_t *drive, u8 tim)
+-{
+- struct pci_dev *pdev = to_pci_dev(drive->hwif->dev);
+- int dshift = (drive->dn & 1) ? IDE_D1_SHIFT : IDE_D0_SHIFT;
+- u32 dtc;
+-
+- cs5536_read(pdev, DTC, &dtc);
+- dtc &= ~(IDE_DRV_MASK << dshift);
+- dtc |= tim << dshift;
+- cs5536_write(pdev, DTC, dtc);
+-}
+-
+-/**
+- * cs5536_cable_detect - detect cable type
+- * @hwif: Port to detect on
+- *
+- * Perform cable detection for ATA66 capable cable.
+- *
+- * Returns a cable type.
+- */
+-
+-static u8 cs5536_cable_detect(ide_hwif_t *hwif)
+-{
+- struct pci_dev *pdev = to_pci_dev(hwif->dev);
+- u32 cfg;
+-
+- cs5536_read(pdev, CFG, &cfg);
+-
+- if (cfg & IDE_CFG_CABLE)
+- return ATA_CBL_PATA80;
+- else
+- return ATA_CBL_PATA40;
+-}
+-
+-/**
+- * cs5536_set_pio_mode - PIO timing setup
+- * @drive: ATA device
+- * @pio: PIO mode number
+- */
+-
+-static void cs5536_set_pio_mode(ide_drive_t *drive, const u8 pio)
+-{
+- static const u8 drv_timings[5] = {
+- 0x98, 0x55, 0x32, 0x21, 0x20,
+- };
+-
+- static const u8 addr_timings[5] = {
+- 0x2, 0x1, 0x0, 0x0, 0x0,
+- };
+-
+- static const u8 cmd_timings[5] = {
+- 0x99, 0x92, 0x90, 0x22, 0x20,
+- };
+-
+- struct pci_dev *pdev = to_pci_dev(drive->hwif->dev);
+- ide_drive_t *pair = ide_get_pair_dev(drive);
+- int cshift = (drive->dn & 1) ? IDE_CAST_D1_SHIFT : IDE_CAST_D0_SHIFT;
+- u32 cast;
+- u8 cmd_pio = pio;
+-
+- if (pair)
+- cmd_pio = min(pio, ide_get_best_pio_mode(pair, 255, 4));
+-
+- drive->drive_data &= (IDE_DRV_MASK << 8);
+- drive->drive_data |= drv_timings[pio];
+-
+- cs5536_program_dtc(drive, drv_timings[pio]);
+-
+- cs5536_read(pdev, CAST, &cast);
+-
+- cast &= ~(IDE_CAST_DRV_MASK << cshift);
+- cast |= addr_timings[pio] << cshift;
+-
+- cast &= ~(IDE_CAST_CMD_MASK << IDE_CAST_CMD_SHIFT);
+- cast |= cmd_timings[cmd_pio] << IDE_CAST_CMD_SHIFT;
+-
+- cs5536_write(pdev, CAST, cast);
+-}
+-
+-/**
+- * cs5536_set_dma_mode - DMA timing setup
+- * @drive: ATA device
+- * @mode: DMA mode
+- */
+-
+-static void cs5536_set_dma_mode(ide_drive_t *drive, const u8 mode)
+-{
+- static const u8 udma_timings[6] = {
+- 0xc2, 0xc1, 0xc0, 0xc4, 0xc5, 0xc6,
+- };
+-
+- static const u8 mwdma_timings[3] = {
+- 0x67, 0x21, 0x20,
+- };
+-
+- struct pci_dev *pdev = to_pci_dev(drive->hwif->dev);
+- int dshift = (drive->dn & 1) ? IDE_D1_SHIFT : IDE_D0_SHIFT;
+- u32 etc;
+-
+- cs5536_read(pdev, ETC, &etc);
+-
+- if (mode >= XFER_UDMA_0) {
+- etc &= ~(IDE_DRV_MASK << dshift);
+- etc |= udma_timings[mode - XFER_UDMA_0] << dshift;
+- } else { /* MWDMA */
+- etc &= ~(IDE_ETC_UDMA_MASK << dshift);
+- drive->drive_data &= IDE_DRV_MASK;
+- drive->drive_data |= mwdma_timings[mode - XFER_MW_DMA_0] << 8;
+- }
+-
+- cs5536_write(pdev, ETC, etc);
+-}
+-
+-static void cs5536_dma_start(ide_drive_t *drive)
+-{
+- if (drive->current_speed < XFER_UDMA_0 &&
+- (drive->drive_data >> 8) != (drive->drive_data & IDE_DRV_MASK))
+- cs5536_program_dtc(drive, drive->drive_data >> 8);
+-
+- ide_dma_start(drive);
+-}
+-
+-static int cs5536_dma_end(ide_drive_t *drive)
+-{
+- int ret = ide_dma_end(drive);
+-
+- if (drive->current_speed < XFER_UDMA_0 &&
+- (drive->drive_data >> 8) != (drive->drive_data & IDE_DRV_MASK))
+- cs5536_program_dtc(drive, drive->drive_data & IDE_DRV_MASK);
+-
+- return ret;
+-}
+-
+-static const struct ide_port_ops cs5536_port_ops = {
+- .set_pio_mode = cs5536_set_pio_mode,
+- .set_dma_mode = cs5536_set_dma_mode,
+- .cable_detect = cs5536_cable_detect,
+-};
+-
+-static const struct ide_dma_ops cs5536_dma_ops = {
+- .dma_host_set = ide_dma_host_set,
+- .dma_setup = ide_dma_setup,
+- .dma_exec_cmd = ide_dma_exec_cmd,
+- .dma_start = cs5536_dma_start,
+- .dma_end = cs5536_dma_end,
+- .dma_test_irq = ide_dma_test_irq,
+- .dma_lost_irq = ide_dma_lost_irq,
+- .dma_timeout = ide_dma_timeout,
+-};
+-
+-static const struct ide_port_info cs5536_info = {
+- .name = DRV_NAME,
+- .port_ops = &cs5536_port_ops,
+- .dma_ops = &cs5536_dma_ops,
+- .host_flags = IDE_HFLAG_SINGLE,
+- .pio_mask = ATA_PIO4,
+- .mwdma_mask = ATA_MWDMA2,
+- .udma_mask = ATA_UDMA5,
+-};
+-
+-/**
+- * cs5536_init_one
+- * @dev: PCI device
+- * @id: Entry in match table
+- */
+-
+-static int cs5536_init_one(struct pci_dev *dev, const struct pci_device_id *id)
+-{
+- u32 cfg;
+-
+- if (use_msr)
+- printk(KERN_INFO DRV_NAME ": Using MSR regs instead of PCI\n");
+-
+- cs5536_read(dev, CFG, &cfg);
+-
+- if ((cfg & IDE_CFG_CHANEN) == 0) {
+- printk(KERN_ERR DRV_NAME ": disabled by BIOS\n");
+- return -ENODEV;
+- }
+-
+- return ide_pci_init_one(dev, &cs5536_info, NULL);
+-}
+-
+-static const struct pci_device_id cs5536_pci_tbl[] = {
+- { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_CS5536_IDE), },
+- { },
+-};
+-
+-static struct pci_driver cs5536_pci_driver = {
+- .name = DRV_NAME,
+- .id_table = cs5536_pci_tbl,
+- .probe = cs5536_init_one,
+- .remove = ide_pci_remove,
+- .suspend = ide_pci_suspend,
+- .resume = ide_pci_resume,
+-};
+-
+-static int __init cs5536_init(void)
+-{
+- return pci_register_driver(&cs5536_pci_driver);
+-}
+-
+-static void __exit cs5536_exit(void)
+-{
+- pci_unregister_driver(&cs5536_pci_driver);
+-}
+-
+-MODULE_AUTHOR("Martin K. Petersen, Bartlomiej Zolnierkiewicz");
+-MODULE_DESCRIPTION("low-level driver for the CS5536 IDE controller");
+-MODULE_LICENSE("GPL");
+-MODULE_DEVICE_TABLE(pci, cs5536_pci_tbl);
+-
+-module_param_named(msr, use_msr, int, 0644);
+-MODULE_PARM_DESC(msr, "Force using MSR to configure IDE function (Default: 0)");
+-
+-module_init(cs5536_init);
+-module_exit(cs5536_exit);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/icside.c linux-2.6.29-rc3.owrt/drivers/ide/icside.c
+--- linux-2.6.29.owrt/drivers/ide/icside.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/icside.c 2009-05-10 23:48:28.000000000 +0200
+@@ -534,7 +534,7 @@
+ d.dma_ops = NULL;
+ }
+
+- ret = ide_host_register(host, &d, hws);
++ ret = ide_host_register(host, NULL, hws);
+ if (ret)
+ goto err_free;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/ide-acpi.c linux-2.6.29-rc3.owrt/drivers/ide/ide-acpi.c
+--- linux-2.6.29.owrt/drivers/ide/ide-acpi.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/ide-acpi.c 2009-05-10 23:48:28.000000000 +0200
+@@ -282,7 +282,7 @@
+ port = hwif->channel ? drive->dn - 2: drive->dn;
+
+ DEBPRINT("ENTER: %s at %s, port#: %d, hard_port#: %d\n",
+- hwif->name, dev_name(dev), port, hwif->channel);
++ hwif->name, dev->bus_id, port, hwif->channel);
+
+ if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0) {
+ DEBPRINT("%s drive %d:%d not present\n",
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/ide-atapi.c linux-2.6.29-rc3.owrt/drivers/ide/ide-atapi.c
+--- linux-2.6.29.owrt/drivers/ide/ide-atapi.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/ide-atapi.c 2009-05-10 23:48:28.000000000 +0200
+@@ -140,12 +140,6 @@
+ rq->cmd_flags |= REQ_PREEMPT;
+ rq->buffer = (char *)pc;
+ rq->rq_disk = disk;
+-
+- if (pc->req_xfer) {
+- rq->data = pc->buf;
+- rq->data_len = pc->req_xfer;
+- }
+-
+ memcpy(rq->cmd, pc->c, 12);
+ if (drive->media == ide_tape)
+ rq->cmd[13] = REQ_IDETAPE_PC1;
+@@ -165,12 +159,6 @@
+ rq = blk_get_request(drive->queue, READ, __GFP_WAIT);
+ rq->cmd_type = REQ_TYPE_SPECIAL;
+ rq->buffer = (char *)pc;
+-
+- if (pc->req_xfer) {
+- rq->data = pc->buf;
+- rq->data_len = pc->req_xfer;
+- }
+-
+ memcpy(rq->cmd, pc->c, 12);
+ if (drive->media == ide_tape)
+ rq->cmd[13] = REQ_IDETAPE_PC1;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/ide.c linux-2.6.29-rc3.owrt/drivers/ide/ide.c
+--- linux-2.6.29.owrt/drivers/ide/ide.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/ide.c 2009-05-10 23:48:28.000000000 +0200
+@@ -337,7 +337,6 @@
+ int a, b, i, j = 1;
+ unsigned int *dev_param_mask = (unsigned int *)kp->arg;
+
+- /* controller . device (0 or 1) [ : 1 (set) | 0 (clear) ] */
+ if (sscanf(s, "%d.%d:%d", &a, &b, &j) != 3 &&
+ sscanf(s, "%d.%d", &a, &b) != 2)
+ return -EINVAL;
+@@ -350,7 +349,7 @@
+ if (j)
+ *dev_param_mask |= (1 << i);
+ else
+- *dev_param_mask &= ~(1 << i);
++ *dev_param_mask &= (1 << i);
+
+ return 0;
+ }
+@@ -393,8 +392,6 @@
+ {
+ int a, b, c = 0, h = 0, s = 0, i, j = 1;
+
+- /* controller . device (0 or 1) : Cylinders , Heads , Sectors */
+- /* controller . device (0 or 1) : 1 (use CHS) | 0 (ignore CHS) */
+ if (sscanf(str, "%d.%d:%d,%d,%d", &a, &b, &c, &h, &s) != 5 &&
+ sscanf(str, "%d.%d:%d", &a, &b, &j) != 3)
+ return -EINVAL;
+@@ -410,7 +407,7 @@
+ if (j)
+ ide_disks |= (1 << i);
+ else
+- ide_disks &= ~(1 << i);
++ ide_disks &= (1 << i);
+
+ ide_disks_chs[i].cyl = c;
+ ide_disks_chs[i].head = h;
+@@ -472,8 +469,6 @@
+ {
+ int i, j = 1;
+
+- /* controller (ignore) */
+- /* controller : 1 (ignore) | 0 (use) */
+ if (sscanf(s, "%d:%d", &i, &j) != 2 && sscanf(s, "%d", &i) != 1)
+ return -EINVAL;
+
+@@ -483,7 +478,7 @@
+ if (j)
+ ide_ignore_cable |= (1 << i);
+ else
+- ide_ignore_cable &= ~(1 << i);
++ ide_ignore_cable &= (1 << i);
+
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/ide-cd.c linux-2.6.29-rc3.owrt/drivers/ide/ide-cd.c
+--- linux-2.6.29.owrt/drivers/ide/ide-cd.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/ide-cd.c 2009-05-10 23:48:28.000000000 +0200
+@@ -55,7 +55,7 @@
+
+ static DEFINE_MUTEX(idecd_ref_mutex);
+
+-static void ide_cd_release(struct device *);
++static void ide_cd_release(struct kref *);
+
+ static struct cdrom_info *ide_cd_get(struct gendisk *disk)
+ {
+@@ -67,7 +67,7 @@
+ if (ide_device_get(cd->drive))
+ cd = NULL;
+ else
+- get_device(&cd->dev);
++ kref_get(&cd->kref);
+
+ }
+ mutex_unlock(&idecd_ref_mutex);
+@@ -79,7 +79,7 @@
+ ide_drive_t *drive = cd->drive;
+
+ mutex_lock(&idecd_ref_mutex);
+- put_device(&cd->dev);
++ kref_put(&cd->kref, ide_cd_release);
+ ide_device_put(drive);
+ mutex_unlock(&idecd_ref_mutex);
+ }
+@@ -194,14 +194,6 @@
+ bio_sectors = max(bio_sectors(failed_command->bio), 4U);
+ sector &= ~(bio_sectors - 1);
+
+- /*
+- * The SCSI specification allows for the value
+- * returned by READ CAPACITY to be up to 75 2K
+- * sectors past the last readable block.
+- * Therefore, if we hit a medium error within the
+- * last 75 2K sectors, we decrease the saved size
+- * value.
+- */
+ if (sector < get_capacity(info->disk) &&
+ drive->probed_capacity - sector < 4 * 75)
+ set_capacity(info->disk, sector);
+@@ -795,9 +787,6 @@
+ if (blk_fs_request(rq)) {
+ ide_end_request(drive, 1, rq->nr_sectors);
+ return ide_stopped;
+- } else if (rq->cmd_type == REQ_TYPE_ATA_PC && !rq->bio) {
+- ide_end_request(drive, 1, 1);
+- return ide_stopped;
+ }
+ goto end_request;
+ }
+@@ -1798,17 +1787,15 @@
+ ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__);
+
+ ide_proc_unregister_driver(drive, info->driver);
+- device_del(&info->dev);
++
+ del_gendisk(info->disk);
+
+- mutex_lock(&idecd_ref_mutex);
+- put_device(&info->dev);
+- mutex_unlock(&idecd_ref_mutex);
++ ide_cd_put(info);
+ }
+
+-static void ide_cd_release(struct device *dev)
++static void ide_cd_release(struct kref *kref)
+ {
+- struct cdrom_info *info = to_ide_drv(dev, cdrom_info);
++ struct cdrom_info *info = to_ide_drv(kref, cdrom_info);
+ struct cdrom_device_info *devinfo = &info->devinfo;
+ ide_drive_t *drive = info->drive;
+ struct gendisk *g = info->disk;
+@@ -2007,12 +1994,7 @@
+
+ ide_init_disk(g, drive);
+
+- info->dev.parent = &drive->gendev;
+- info->dev.release = ide_cd_release;
+- dev_set_name(&info->dev, dev_name(&drive->gendev));
+-
+- if (device_register(&info->dev))
+- goto out_free_disk;
++ kref_init(&info->kref);
+
+ info->drive = drive;
+ info->driver = &ide_cdrom_driver;
+@@ -2026,7 +2008,7 @@
+ g->driverfs_dev = &drive->gendev;
+ g->flags = GENHD_FL_CD | GENHD_FL_REMOVABLE;
+ if (ide_cdrom_setup(drive)) {
+- put_device(&info->dev);
++ ide_cd_release(&info->kref);
+ goto failed;
+ }
+
+@@ -2036,8 +2018,6 @@
+ add_disk(g);
+ return 0;
+
+-out_free_disk:
+- put_disk(g);
+ out_free_cd:
+ kfree(info);
+ failed:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/ide-cd.h linux-2.6.29-rc3.owrt/drivers/ide/ide-cd.h
+--- linux-2.6.29.owrt/drivers/ide/ide-cd.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/ide-cd.h 2009-05-10 23:48:28.000000000 +0200
+@@ -80,7 +80,7 @@
+ ide_drive_t *drive;
+ struct ide_driver *driver;
+ struct gendisk *disk;
+- struct device dev;
++ struct kref kref;
+
+ /* Buffer for table of contents. NULL if we haven't allocated
+ a TOC buffer for this device yet. */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/ide-disk_proc.c linux-2.6.29-rc3.owrt/drivers/ide/ide-disk_proc.c
+--- linux-2.6.29.owrt/drivers/ide/ide-disk_proc.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/ide-disk_proc.c 2009-05-10 23:48:28.000000000 +0200
+@@ -125,5 +125,5 @@
+ IDE_PROC_DEVSET(multcount, 0, 16),
+ IDE_PROC_DEVSET(nowerr, 0, 1),
+ IDE_PROC_DEVSET(wcache, 0, 1),
+- { NULL },
++ { 0 },
+ };
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/ide-dma.c linux-2.6.29-rc3.owrt/drivers/ide/ide-dma.c
+--- linux-2.6.29.owrt/drivers/ide/ide-dma.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/ide-dma.c 2009-05-10 23:48:28.000000000 +0200
+@@ -128,7 +128,6 @@
+ {
+ ide_hwif_t *hwif = drive->hwif;
+ struct scatterlist *sg = hwif->sg_table;
+- int i;
+
+ ide_map_sg(drive, rq);
+
+@@ -137,13 +136,8 @@
+ else
+ hwif->sg_dma_direction = DMA_TO_DEVICE;
+
+- i = dma_map_sg(hwif->dev, sg, hwif->sg_nents, hwif->sg_dma_direction);
+- if (i) {
+- hwif->orig_sg_nents = hwif->sg_nents;
+- hwif->sg_nents = i;
+- }
+-
+- return i;
++ return dma_map_sg(hwif->dev, sg, hwif->sg_nents,
++ hwif->sg_dma_direction);
+ }
+ EXPORT_SYMBOL_GPL(ide_build_sglist);
+
+@@ -162,7 +156,7 @@
+ {
+ ide_hwif_t *hwif = drive->hwif;
+
+- dma_unmap_sg(hwif->dev, hwif->sg_table, hwif->orig_sg_nents,
++ dma_unmap_sg(hwif->dev, hwif->sg_table, hwif->sg_nents,
+ hwif->sg_dma_direction);
+ }
+ EXPORT_SYMBOL_GPL(ide_destroy_dmatable);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/ide-floppy.c linux-2.6.29-rc3.owrt/drivers/ide/ide-floppy.c
+--- linux-2.6.29.owrt/drivers/ide/ide-floppy.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/ide-floppy.c 2009-05-10 23:48:28.000000000 +0200
+@@ -327,10 +327,8 @@
+ return ide_stopped;
+ }
+
+- if (blk_fs_request(rq) || pc->req_xfer) {
+- ide_init_sg_cmd(drive, rq);
+- ide_map_sg(drive, rq);
+- }
++ ide_init_sg_cmd(drive, rq);
++ ide_map_sg(drive, rq);
+
+ pc->sg = hwif->sg_table;
+ pc->sg_cnt = hwif->sg_nents;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/ide-floppy_proc.c linux-2.6.29-rc3.owrt/drivers/ide/ide-floppy_proc.c
+--- linux-2.6.29.owrt/drivers/ide/ide-floppy_proc.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/ide-floppy_proc.c 2009-05-10 23:48:28.000000000 +0200
+@@ -29,5 +29,5 @@
+ IDE_PROC_DEVSET(bios_head, 0, 255),
+ IDE_PROC_DEVSET(bios_sect, 0, 63),
+ IDE_PROC_DEVSET(ticks, 0, 255),
+- { NULL },
++ { 0 },
+ };
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/ide-gd.c linux-2.6.29-rc3.owrt/drivers/ide/ide-gd.c
+--- linux-2.6.29.owrt/drivers/ide/ide-gd.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/ide-gd.c 2009-05-10 23:48:28.000000000 +0200
+@@ -25,7 +25,7 @@
+
+ static DEFINE_MUTEX(ide_disk_ref_mutex);
+
+-static void ide_disk_release(struct device *);
++static void ide_disk_release(struct kref *);
+
+ static struct ide_disk_obj *ide_disk_get(struct gendisk *disk)
+ {
+@@ -37,7 +37,7 @@
+ if (ide_device_get(idkp->drive))
+ idkp = NULL;
+ else
+- get_device(&idkp->dev);
++ kref_get(&idkp->kref);
+ }
+ mutex_unlock(&ide_disk_ref_mutex);
+ return idkp;
+@@ -48,7 +48,7 @@
+ ide_drive_t *drive = idkp->drive;
+
+ mutex_lock(&ide_disk_ref_mutex);
+- put_device(&idkp->dev);
++ kref_put(&idkp->kref, ide_disk_release);
+ ide_device_put(drive);
+ mutex_unlock(&ide_disk_ref_mutex);
+ }
+@@ -66,18 +66,17 @@
+ struct gendisk *g = idkp->disk;
+
+ ide_proc_unregister_driver(drive, idkp->driver);
+- device_del(&idkp->dev);
++
+ del_gendisk(g);
++
+ drive->disk_ops->flush(drive);
+
+- mutex_lock(&ide_disk_ref_mutex);
+- put_device(&idkp->dev);
+- mutex_unlock(&ide_disk_ref_mutex);
++ ide_disk_put(idkp);
+ }
+
+-static void ide_disk_release(struct device *dev)
++static void ide_disk_release(struct kref *kref)
+ {
+- struct ide_disk_obj *idkp = to_ide_drv(dev, ide_disk_obj);
++ struct ide_disk_obj *idkp = to_ide_drv(kref, ide_disk_obj);
+ ide_drive_t *drive = idkp->drive;
+ struct gendisk *g = idkp->disk;
+
+@@ -349,12 +348,7 @@
+
+ ide_init_disk(g, drive);
+
+- idkp->dev.parent = &drive->gendev;
+- idkp->dev.release = ide_disk_release;
+- dev_set_name(&idkp->dev, dev_name(&drive->gendev));
+-
+- if (device_register(&idkp->dev))
+- goto out_free_disk;
++ kref_init(&idkp->kref);
+
+ idkp->drive = drive;
+ idkp->driver = &ide_gd_driver;
+@@ -379,8 +373,6 @@
+ add_disk(g);
+ return 0;
+
+-out_free_disk:
+- put_disk(g);
+ out_free_idkp:
+ kfree(idkp);
+ failed:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/ide-gd.h linux-2.6.29-rc3.owrt/drivers/ide/ide-gd.h
+--- linux-2.6.29.owrt/drivers/ide/ide-gd.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/ide-gd.h 2009-05-10 23:48:28.000000000 +0200
+@@ -17,7 +17,7 @@
+ ide_drive_t *drive;
+ struct ide_driver *driver;
+ struct gendisk *disk;
+- struct device dev;
++ struct kref kref;
+ unsigned int openers; /* protected by BKL for now */
+
+ /* Last failed packet command */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/ide-io.c linux-2.6.29-rc3.owrt/drivers/ide/ide-io.c
+--- linux-2.6.29.owrt/drivers/ide/ide-io.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/ide-io.c 2009-05-10 23:48:28.000000000 +0200
+@@ -418,14 +418,11 @@
+ ide_hwif_t *hwif = drive->hwif;
+ struct scatterlist *sg = hwif->sg_table;
+
+- if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE) {
++ if (rq->cmd_type != REQ_TYPE_ATA_TASKFILE) {
++ hwif->sg_nents = blk_rq_map_sg(drive->queue, rq, sg);
++ } else {
+ sg_init_one(sg, rq->buffer, rq->nr_sectors * SECTOR_SIZE);
+ hwif->sg_nents = 1;
+- } else if (!rq->bio) {
+- sg_init_one(sg, rq->data, rq->data_len);
+- hwif->sg_nents = 1;
+- } else {
+- hwif->sg_nents = blk_rq_map_sg(drive->queue, rq, sg);
+ }
+ }
+
+@@ -908,7 +905,7 @@
+ ide_drive_t *uninitialized_var(drive);
+ ide_handler_t *handler;
+ unsigned long flags;
+- int wait = -1;
++ unsigned long wait = -1;
+ int plug_device = 0;
+
+ spin_lock_irqsave(&hwif->lock, flags);
+@@ -1162,7 +1159,6 @@
+
+ return irq_ret;
+ }
+-EXPORT_SYMBOL_GPL(ide_intr);
+
+ /**
+ * ide_do_drive_cmd - issue IDE special command
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/ide-iops.c linux-2.6.29-rc3.owrt/drivers/ide/ide-iops.c
+--- linux-2.6.29.owrt/drivers/ide/ide-iops.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/ide-iops.c 2009-05-10 23:48:28.000000000 +0200
+@@ -315,8 +315,6 @@
+ u8 io_32bit = drive->io_32bit;
+ u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0;
+
+- len++;
+-
+ if (io_32bit) {
+ unsigned long uninitialized_var(flags);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/ide-probe.c linux-2.6.29-rc3.owrt/drivers/ide/ide-probe.c
+--- linux-2.6.29.owrt/drivers/ide/ide-probe.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/ide-probe.c 2009-05-10 23:48:28.000000000 +0200
+@@ -950,7 +950,6 @@
+ static int init_irq (ide_hwif_t *hwif)
+ {
+ struct ide_io_ports *io_ports = &hwif->io_ports;
+- irq_handler_t irq_handler;
+ int sa = 0;
+
+ mutex_lock(&ide_cfg_mtx);
+@@ -960,10 +959,6 @@
+ hwif->timer.function = &ide_timer_expiry;
+ hwif->timer.data = (unsigned long)hwif;
+
+- irq_handler = hwif->host->irq_handler;
+- if (irq_handler == NULL)
+- irq_handler = ide_intr;
+-
+ #if defined(__mc68000__)
+ sa = IRQF_SHARED;
+ #endif /* __mc68000__ */
+@@ -974,7 +969,7 @@
+ if (io_ports->ctl_addr)
+ hwif->tp_ops->set_irq(hwif, 1);
+
+- if (request_irq(hwif->irq, irq_handler, sa, hwif->name, hwif))
++ if (request_irq(hwif->irq, &ide_intr, sa, hwif->name, hwif))
+ goto out_up;
+
+ if (!hwif->rqsize) {
+@@ -1472,30 +1467,6 @@
+ }
+ EXPORT_SYMBOL_GPL(ide_host_alloc);
+
+-static void ide_port_free(ide_hwif_t *hwif)
+-{
+- ide_port_free_devices(hwif);
+- ide_free_port_slot(hwif->index);
+- kfree(hwif);
+-}
+-
+-static void ide_disable_port(ide_hwif_t *hwif)
+-{
+- struct ide_host *host = hwif->host;
+- int i;
+-
+- printk(KERN_INFO "%s: disabling port\n", hwif->name);
+-
+- for (i = 0; i < MAX_HOST_PORTS; i++) {
+- if (host->ports[i] == hwif) {
+- host->ports[i] = NULL;
+- host->n_ports--;
+- }
+- }
+-
+- ide_port_free(hwif);
+-}
+-
+ int ide_host_register(struct ide_host *host, const struct ide_port_info *d,
+ hw_regs_t **hws)
+ {
+@@ -1536,12 +1507,8 @@
+ hwif->present = 1;
+
+ if (hwif->chipset != ide_4drives || !hwif->mate ||
+- !hwif->mate->present) {
+- if (ide_register_port(hwif)) {
+- ide_disable_port(hwif);
+- continue;
+- }
+- }
++ !hwif->mate->present)
++ ide_register_port(hwif);
+
+ if (hwif->present)
+ ide_port_tune_devices(hwif);
+@@ -1554,8 +1521,7 @@
+ if (hwif_init(hwif) == 0) {
+ printk(KERN_INFO "%s: failed to initialize IDE "
+ "interface\n", hwif->name);
+- device_unregister(&hwif->gendev);
+- ide_disable_port(hwif);
++ hwif->present = 0;
+ continue;
+ }
+
+@@ -1694,8 +1660,12 @@
+ int i;
+
+ ide_host_for_each_port(i, hwif, host) {
+- if (hwif)
+- ide_port_free(hwif);
++ if (hwif == NULL)
++ continue;
++
++ ide_port_free_devices(hwif);
++ ide_free_port_slot(hwif->index);
++ kfree(hwif);
+ }
+
+ kfree(host);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/ide-proc.c linux-2.6.29-rc3.owrt/drivers/ide/ide-proc.c
+--- linux-2.6.29.owrt/drivers/ide/ide-proc.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/ide-proc.c 2009-05-10 23:48:28.000000000 +0200
+@@ -231,7 +231,7 @@
+ IDE_PROC_DEVSET(pio_mode, 0, 255),
+ IDE_PROC_DEVSET(unmaskirq, 0, 1),
+ IDE_PROC_DEVSET(using_dma, 0, 1),
+- { NULL },
++ { 0 },
+ };
+
+ static void proc_ide_settings_warn(void)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/ide-tape.c linux-2.6.29-rc3.owrt/drivers/ide/ide-tape.c
+--- linux-2.6.29.owrt/drivers/ide/ide-tape.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/ide-tape.c 2009-05-10 23:48:28.000000000 +0200
+@@ -169,7 +169,7 @@
+ ide_drive_t *drive;
+ struct ide_driver *driver;
+ struct gendisk *disk;
+- struct device dev;
++ struct kref kref;
+
+ /*
+ * failed_pc points to the last failed packet command, or contains
+@@ -267,7 +267,7 @@
+
+ static struct class *idetape_sysfs_class;
+
+-static void ide_tape_release(struct device *);
++static void ide_tape_release(struct kref *);
+
+ static struct ide_tape_obj *ide_tape_get(struct gendisk *disk)
+ {
+@@ -279,7 +279,7 @@
+ if (ide_device_get(tape->drive))
+ tape = NULL;
+ else
+- get_device(&tape->dev);
++ kref_get(&tape->kref);
+ }
+ mutex_unlock(&idetape_ref_mutex);
+ return tape;
+@@ -290,7 +290,7 @@
+ ide_drive_t *drive = tape->drive;
+
+ mutex_lock(&idetape_ref_mutex);
+- put_device(&tape->dev);
++ kref_put(&tape->kref, ide_tape_release);
+ ide_device_put(drive);
+ mutex_unlock(&idetape_ref_mutex);
+ }
+@@ -308,7 +308,7 @@
+ mutex_lock(&idetape_ref_mutex);
+ tape = idetape_devs[i];
+ if (tape)
+- get_device(&tape->dev);
++ kref_get(&tape->kref);
+ mutex_unlock(&idetape_ref_mutex);
+ return tape;
+ }
+@@ -2166,7 +2166,7 @@
+ __IDE_PROC_DEVSET(speed, 0, 0xffff, NULL, NULL),
+ __IDE_PROC_DEVSET(tdsc, IDETAPE_DSC_RW_MIN, IDETAPE_DSC_RW_MAX,
+ mulf_tdsc, divf_tdsc),
+- { NULL },
++ { 0 },
+ };
+ #endif
+
+@@ -2256,17 +2256,15 @@
+ idetape_tape_t *tape = drive->driver_data;
+
+ ide_proc_unregister_driver(drive, tape->driver);
+- device_del(&tape->dev);
++
+ ide_unregister_region(tape->disk);
+
+- mutex_lock(&idetape_ref_mutex);
+- put_device(&tape->dev);
+- mutex_unlock(&idetape_ref_mutex);
++ ide_tape_put(tape);
+ }
+
+-static void ide_tape_release(struct device *dev)
++static void ide_tape_release(struct kref *kref)
+ {
+- struct ide_tape_obj *tape = to_ide_drv(dev, ide_tape_obj);
++ struct ide_tape_obj *tape = to_ide_drv(kref, ide_tape_obj);
+ ide_drive_t *drive = tape->drive;
+ struct gendisk *g = tape->disk;
+
+@@ -2409,12 +2407,7 @@
+
+ ide_init_disk(g, drive);
+
+- tape->dev.parent = &drive->gendev;
+- tape->dev.release = ide_tape_release;
+- dev_set_name(&tape->dev, dev_name(&drive->gendev));
+-
+- if (device_register(&tape->dev))
+- goto out_free_disk;
++ kref_init(&tape->kref);
+
+ tape->drive = drive;
+ tape->driver = &idetape_driver;
+@@ -2443,8 +2436,6 @@
+
+ return 0;
+
+-out_free_disk:
+- put_disk(g);
+ out_free_tape:
+ kfree(tape);
+ failed:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/it821x.c linux-2.6.29-rc3.owrt/drivers/ide/it821x.c
+--- linux-2.6.29.owrt/drivers/ide/it821x.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/it821x.c 2009-05-10 23:48:28.000000000 +0200
+@@ -5,8 +5,9 @@
+ * May be copied or modified under the terms of the GNU General Public License
+ * Based in part on the ITE vendor provided SCSI driver.
+ *
+- * Documentation:
+- * Datasheet is freely available, some other documents under NDA.
++ * Documentation available from
++ * http://www.ite.com.tw/pc/IT8212F_V04.pdf
++ * Some other documents are NDA.
+ *
+ * The ITE8212 isn't exactly a standard IDE controller. It has two
+ * modes. In pass through mode then it is an IDE controller. In its smart
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/Kconfig linux-2.6.29-rc3.owrt/drivers/ide/Kconfig
+--- linux-2.6.29.owrt/drivers/ide/Kconfig 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -46,7 +46,7 @@
+ SMART parameters from disk drives.
+
+ To compile this driver as a module, choose M here: the
+- module will be called ide-core.ko.
++ module will be called ide.
+
+ For further information, please read <file:Documentation/ide/ide.txt>.
+
+@@ -465,16 +465,6 @@
+
+ It is safe to say Y to this question.
+
+-config BLK_DEV_CS5536
+- tristate "CS5536 chipset support"
+- depends on X86_32
+- select BLK_DEV_IDEDMA_PCI
+- help
+- This option enables support for the AMD CS5536
+- companion chip used with the Geode LX processor family.
+-
+- If unsure, say N.
+-
+ config BLK_DEV_HPT366
+ tristate "HPT36X/37X chipset support"
+ select BLK_DEV_IDEDMA_PCI
+@@ -721,11 +711,6 @@
+ depends on SOC_TX4939
+ select BLK_DEV_IDEDMA_SFF
+
+-config BLK_DEV_IDE_AT91
+- tristate "Atmel AT91 (SAM9, CAP9, AT572D940HF) IDE support"
+- depends on ARM && ARCH_AT91 && !ARCH_AT91RM9200 && !ARCH_AT91X40
+- select IDE_TIMINGS
+-
+ config IDE_ARM
+ tristate "ARM IDE support"
+ depends on ARM && (ARCH_RPC || ARCH_SHARK)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/Makefile linux-2.6.29-rc3.owrt/drivers/ide/Makefile
+--- linux-2.6.29.owrt/drivers/ide/Makefile 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/Makefile 2009-05-10 23:48:28.000000000 +0200
+@@ -43,7 +43,6 @@
+ obj-$(CONFIG_BLK_DEV_CS5520) += cs5520.o
+ obj-$(CONFIG_BLK_DEV_CS5530) += cs5530.o
+ obj-$(CONFIG_BLK_DEV_CS5535) += cs5535.o
+-obj-$(CONFIG_BLK_DEV_CS5536) += cs5536.o
+ obj-$(CONFIG_BLK_DEV_SC1200) += sc1200.o
+ obj-$(CONFIG_BLK_DEV_CY82C693) += cy82c693.o
+ obj-$(CONFIG_BLK_DEV_DELKIN) += delkin_cb.o
+@@ -116,4 +115,3 @@
+
+ obj-$(CONFIG_BLK_DEV_IDE_TX4938) += tx4938ide.o
+ obj-$(CONFIG_BLK_DEV_IDE_TX4939) += tx4939ide.o
+-obj-$(CONFIG_BLK_DEV_IDE_AT91) += at91_ide.o
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/qd65xx.c linux-2.6.29-rc3.owrt/drivers/ide/qd65xx.c
+--- linux-2.6.29.owrt/drivers/ide/qd65xx.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/qd65xx.c 2009-05-10 23:48:28.000000000 +0200
+@@ -16,7 +16,7 @@
+
+ /*
+ * Rewritten from the work of Colten Edwards <pje120@cs.usask.ca> by
+- * Samuel Thibault <samuel.thibault@ens-lyon.org>
++ * Samuel Thibault <samuel.thibault@fnac.net>
+ */
+
+ #include <linux/module.h>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/qd65xx.h linux-2.6.29-rc3.owrt/drivers/ide/qd65xx.h
+--- linux-2.6.29.owrt/drivers/ide/qd65xx.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/qd65xx.h 2009-05-10 23:48:28.000000000 +0200
+@@ -4,7 +4,7 @@
+
+ /*
+ * Authors: Petr Soucek <petr@ryston.cz>
+- * Samuel Thibault <samuel.thibault@ens-lyon.org>
++ * Samuel Thibault <samuel.thibault@fnac.net>
+ */
+
+ /* truncates a in [b,c] */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/tx4939ide.c linux-2.6.29-rc3.owrt/drivers/ide/tx4939ide.c
+--- linux-2.6.29.owrt/drivers/ide/tx4939ide.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/tx4939ide.c 2009-05-10 23:48:28.000000000 +0200
+@@ -261,9 +261,9 @@
+ bcount = cur_len;
+ /*
+ * This workaround for zero count seems required.
+- * (standard ide_build_dmatable does it too)
++ * (standard ide_build_dmatable do it too)
+ */
+- if (bcount == 0x10000)
++ if ((bcount & 0xffff) == 0x0000)
+ bcount = 0x8000;
+ *table++ = bcount & 0xffff;
+ *table++ = cur_addr;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ide/via82cxxx.c linux-2.6.29-rc3.owrt/drivers/ide/via82cxxx.c
+--- linux-2.6.29.owrt/drivers/ide/via82cxxx.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ide/via82cxxx.c 2009-05-10 23:48:28.000000000 +0200
+@@ -448,11 +448,6 @@
+ d.host_flags |= IDE_HFLAG_FORCE_LEGACY_IRQS;
+ #endif
+
+-#ifdef CONFIG_AMIGAONE
+- if (machine_is(amigaone))
+- d.host_flags |= IDE_HFLAG_FORCE_LEGACY_IRQS;
+-#endif
+-
+ d.udma_mask = via_config->udma_mask;
+
+ vdev = kzalloc(sizeof(*vdev), GFP_KERNEL);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ieee1394/dma.h linux-2.6.29-rc3.owrt/drivers/ieee1394/dma.h
+--- linux-2.6.29.owrt/drivers/ieee1394/dma.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ieee1394/dma.h 2009-05-10 23:48:28.000000000 +0200
+@@ -12,7 +12,6 @@
+
+ #include <asm/types.h>
+
+-struct file;
+ struct pci_dev;
+ struct scatterlist;
+ struct vm_area_struct;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ieee1394/dv1394.c linux-2.6.29-rc3.owrt/drivers/ieee1394/dv1394.c
+--- linux-2.6.29.owrt/drivers/ieee1394/dv1394.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ieee1394/dv1394.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1823,10 +1823,6 @@
+
+ #endif
+
+- printk(KERN_INFO "%s: NOTE, the dv1394 interface is unsupported "
+- "and will not be available in the new firewire driver stack. "
+- "Try libraw1394 based programs instead.\n", current->comm);
+-
+ return 0;
+ }
+
+@@ -2571,6 +2567,10 @@
+ {
+ int ret;
+
++ printk(KERN_WARNING
++ "NOTE: The dv1394 driver is unsupported and may be removed in a "
++ "future Linux release. Use raw1394 instead.\n");
++
+ cdev_init(&dv1394_cdev, &dv1394_fops);
+ dv1394_cdev.owner = THIS_MODULE;
+ ret = cdev_add(&dv1394_cdev, IEEE1394_DV1394_DEV, 16);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ieee1394/ieee1394_core.c linux-2.6.29-rc3.owrt/drivers/ieee1394/ieee1394_core.c
+--- linux-2.6.29.owrt/drivers/ieee1394/ieee1394_core.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ieee1394/ieee1394_core.c 2009-05-10 23:48:28.000000000 +0200
+@@ -338,7 +338,6 @@
+ u8 cldcnt[nodecount];
+ u8 *map = host->speed_map;
+ u8 *speedcap = host->speed;
+- u8 local_link_speed = host->csr.lnk_spd;
+ struct selfid *sid;
+ struct ext_selfid *esid;
+ int i, j, n;
+@@ -374,8 +373,8 @@
+ if (sid->port2 == SELFID_PORT_CHILD) cldcnt[n]++;
+
+ speedcap[n] = sid->speed;
+- if (speedcap[n] > local_link_speed)
+- speedcap[n] = local_link_speed;
++ if (speedcap[n] > host->csr.lnk_spd)
++ speedcap[n] = host->csr.lnk_spd;
+ n--;
+ }
+ }
+@@ -408,11 +407,12 @@
+ }
+ }
+
+- /* assume a maximum speed for 1394b PHYs, nodemgr will correct it */
+- if (local_link_speed > SELFID_SPEED_UNKNOWN)
+- for (i = 0; i < nodecount; i++)
+- if (speedcap[i] == SELFID_SPEED_UNKNOWN)
+- speedcap[i] = local_link_speed;
++#if SELFID_SPEED_UNKNOWN != IEEE1394_SPEED_MAX
++ /* assume maximum speed for 1394b PHYs, nodemgr will correct it */
++ for (n = 0; n < nodecount; n++)
++ if (speedcap[n] == SELFID_SPEED_UNKNOWN)
++ speedcap[n] = IEEE1394_SPEED_MAX;
++#endif
+ }
+
+
+@@ -1275,7 +1275,7 @@
+ unregister_chrdev_region(IEEE1394_CORE_DEV, 256);
+ }
+
+-fs_initcall(ieee1394_init);
++module_init(ieee1394_init);
+ module_exit(ieee1394_cleanup);
+
+ /* Exported symbols */
+@@ -1314,7 +1314,6 @@
+ EXPORT_SYMBOL(hpsb_make_phypacket);
+ EXPORT_SYMBOL(hpsb_read);
+ EXPORT_SYMBOL(hpsb_write);
+-EXPORT_SYMBOL(hpsb_lock);
+ EXPORT_SYMBOL(hpsb_packet_success);
+
+ /** highlevel.c **/
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ieee1394/ieee1394.h linux-2.6.29-rc3.owrt/drivers/ieee1394/ieee1394.h
+--- linux-2.6.29.owrt/drivers/ieee1394/ieee1394.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ieee1394/ieee1394.h 2009-05-10 23:48:28.000000000 +0200
+@@ -54,7 +54,9 @@
+ #define IEEE1394_SPEED_800 0x03
+ #define IEEE1394_SPEED_1600 0x04
+ #define IEEE1394_SPEED_3200 0x05
+-#define IEEE1394_SPEED_MAX IEEE1394_SPEED_3200
++
++/* The current highest tested speed supported by the subsystem */
++#define IEEE1394_SPEED_MAX IEEE1394_SPEED_800
+
+ /* Maps speed values above to a string representation */
+ extern const char *hpsb_speedto_str[];
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ieee1394/ieee1394_transactions.c linux-2.6.29-rc3.owrt/drivers/ieee1394/ieee1394_transactions.c
+--- linux-2.6.29.owrt/drivers/ieee1394/ieee1394_transactions.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ieee1394/ieee1394_transactions.c 2009-05-10 23:48:28.000000000 +0200
+@@ -501,6 +501,8 @@
+ if (length == 0)
+ return -EINVAL;
+
++ BUG_ON(in_interrupt()); // We can't be called in an interrupt, yet
++
+ packet = hpsb_make_readpacket(host, node, addr, length);
+
+ if (!packet) {
+@@ -548,6 +550,8 @@
+ if (length == 0)
+ return -EINVAL;
+
++ BUG_ON(in_interrupt()); // We can't be called in an interrupt, yet
++
+ packet = hpsb_make_writepacket(host, node, addr, buffer, length);
+
+ if (!packet)
+@@ -566,30 +570,3 @@
+
+ return retval;
+ }
+-
+-int hpsb_lock(struct hpsb_host *host, nodeid_t node, unsigned int generation,
+- u64 addr, int extcode, quadlet_t *data, quadlet_t arg)
+-{
+- struct hpsb_packet *packet;
+- int retval = 0;
+-
+- packet = hpsb_make_lockpacket(host, node, addr, extcode, data, arg);
+- if (!packet)
+- return -ENOMEM;
+-
+- packet->generation = generation;
+- retval = hpsb_send_packet_and_wait(packet);
+- if (retval < 0)
+- goto hpsb_lock_fail;
+-
+- retval = hpsb_packet_success(packet);
+-
+- if (retval == 0)
+- *data = packet->data[0];
+-
+-hpsb_lock_fail:
+- hpsb_free_tlabel(packet);
+- hpsb_free_packet(packet);
+-
+- return retval;
+-}
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ieee1394/ieee1394_transactions.h linux-2.6.29-rc3.owrt/drivers/ieee1394/ieee1394_transactions.h
+--- linux-2.6.29.owrt/drivers/ieee1394/ieee1394_transactions.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ieee1394/ieee1394_transactions.h 2009-05-10 23:48:28.000000000 +0200
+@@ -30,8 +30,6 @@
+ u64 addr, quadlet_t *buffer, size_t length);
+ int hpsb_write(struct hpsb_host *host, nodeid_t node, unsigned int generation,
+ u64 addr, quadlet_t *buffer, size_t length);
+-int hpsb_lock(struct hpsb_host *host, nodeid_t node, unsigned int generation,
+- u64 addr, int extcode, quadlet_t *data, quadlet_t arg);
+
+ #ifdef HPSB_DEBUG_TLABELS
+ extern spinlock_t hpsb_tlabel_lock;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ieee1394/iso.h linux-2.6.29-rc3.owrt/drivers/ieee1394/iso.h
+--- linux-2.6.29.owrt/drivers/ieee1394/iso.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ieee1394/iso.h 2009-05-10 23:48:28.000000000 +0200
+@@ -13,7 +13,6 @@
+ #define IEEE1394_ISO_H
+
+ #include <linux/spinlock_types.h>
+-#include <linux/wait.h>
+ #include <asm/atomic.h>
+ #include <asm/types.h>
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ieee1394/nodemgr.c linux-2.6.29-rc3.owrt/drivers/ieee1394/nodemgr.c
+--- linux-2.6.29.owrt/drivers/ieee1394/nodemgr.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ieee1394/nodemgr.c 2009-05-10 23:48:28.000000000 +0200
+@@ -971,9 +971,6 @@
+ ud->ud_kv = ud_kv;
+ ud->id = (*id)++;
+
+- /* inherit vendor_id from root directory if none exists in unit dir */
+- ud->vendor_id = ne->vendor_id;
+-
+ csr1212_for_each_dir_entry(ne->csr, kv, ud_kv, dentry) {
+ switch (kv->key.id) {
+ case CSR1212_KV_ID_VENDOR:
+@@ -1268,8 +1265,7 @@
+ csr1212_destroy_csr(csr);
+ }
+
+- /* Finally, mark the node current */
+- smp_wmb();
++ /* Mark the node current */
+ ne->generation = generation;
+
+ if (ne->in_limbo) {
+@@ -1802,7 +1798,7 @@
+ {
+ packet->host = ne->host;
+ packet->generation = ne->generation;
+- smp_rmb();
++ barrier();
+ packet->node_id = ne->nodeid;
+ }
+
+@@ -1811,7 +1807,7 @@
+ {
+ unsigned int generation = ne->generation;
+
+- smp_rmb();
++ barrier();
+ return hpsb_write(ne->host, ne->nodeid, generation,
+ addr, buffer, length);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ieee1394/nodemgr.h linux-2.6.29-rc3.owrt/drivers/ieee1394/nodemgr.h
+--- linux-2.6.29.owrt/drivers/ieee1394/nodemgr.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ieee1394/nodemgr.h 2009-05-10 23:48:28.000000000 +0200
+@@ -21,11 +21,9 @@
+ #define _IEEE1394_NODEMGR_H
+
+ #include <linux/device.h>
+-#include <asm/system.h>
+ #include <asm/types.h>
+
+ #include "ieee1394_core.h"
+-#include "ieee1394_transactions.h"
+ #include "ieee1394_types.h"
+
+ struct csr1212_csr;
+@@ -156,22 +154,6 @@
+ void hpsb_node_fill_packet(struct node_entry *ne, struct hpsb_packet *packet);
+ int hpsb_node_write(struct node_entry *ne, u64 addr,
+ quadlet_t *buffer, size_t length);
+-static inline int hpsb_node_read(struct node_entry *ne, u64 addr,
+- quadlet_t *buffer, size_t length)
+-{
+- unsigned int g = ne->generation;
+-
+- smp_rmb();
+- return hpsb_read(ne->host, ne->nodeid, g, addr, buffer, length);
+-}
+-static inline int hpsb_node_lock(struct node_entry *ne, u64 addr, int extcode,
+- quadlet_t *buffer, quadlet_t arg)
+-{
+- unsigned int g = ne->generation;
+-
+- smp_rmb();
+- return hpsb_lock(ne->host, ne->nodeid, g, addr, extcode, buffer, arg);
+-}
+ int nodemgr_for_each_host(void *data, int (*cb)(struct hpsb_host *, void *));
+
+ int init_ieee1394_nodemgr(void);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ieee1394/ohci1394.h linux-2.6.29-rc3.owrt/drivers/ieee1394/ohci1394.h
+--- linux-2.6.29.owrt/drivers/ieee1394/ohci1394.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ieee1394/ohci1394.h 2009-05-10 23:48:28.000000000 +0200
+@@ -26,7 +26,7 @@
+
+ #define OHCI1394_DRIVER_NAME "ohci1394"
+
+-#define OHCI1394_MAX_AT_REQ_RETRIES 0xf
++#define OHCI1394_MAX_AT_REQ_RETRIES 0x2
+ #define OHCI1394_MAX_AT_RESP_RETRIES 0x2
+ #define OHCI1394_MAX_PHYS_RESP_RETRIES 0x8
+ #define OHCI1394_MAX_SELF_ID_ERRORS 16
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/ieee1394/sbp2.c linux-2.6.29-rc3.owrt/drivers/ieee1394/sbp2.c
+--- linux-2.6.29.owrt/drivers/ieee1394/sbp2.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/ieee1394/sbp2.c 2009-05-10 23:48:28.000000000 +0200
+@@ -115,8 +115,8 @@
+ */
+ static int sbp2_max_speed = IEEE1394_SPEED_MAX;
+ module_param_named(max_speed, sbp2_max_speed, int, 0644);
+-MODULE_PARM_DESC(max_speed, "Limit data transfer speed (5 <= 3200, "
+- "4 <= 1600, 3 <= 800, 2 <= 400, 1 <= 200, 0 = 100 Mb/s)");
++MODULE_PARM_DESC(max_speed, "Force max speed "
++ "(3 = 800Mb/s, 2 = 400Mb/s, 1 = 200Mb/s, 0 = 100Mb/s)");
+
+ /*
+ * Set serialize_io to 0 or N to use dynamically appended lists of command ORBs.
+@@ -256,7 +256,7 @@
+ static int sbp2_max_speed_and_size(struct sbp2_lu *);
+
+
+-static const u8 sbp2_speedto_max_payload[] = { 0x7, 0x8, 0x9, 0xa, 0xa, 0xa };
++static const u8 sbp2_speedto_max_payload[] = { 0x7, 0x8, 0x9, 0xA, 0xB, 0xC };
+
+ static DEFINE_RWLOCK(sbp2_hi_logical_units_lock);
+
+@@ -347,8 +347,8 @@
+ .sdev_attrs = sbp2_sysfs_sdev_attrs,
+ };
+
+-#define SBP2_ROM_VALUE_WILDCARD ~0 /* match all */
+-#define SBP2_ROM_VALUE_MISSING 0xff000000 /* not present in the unit dir. */
++/* for match-all entries in sbp2_workarounds_table */
++#define SBP2_ROM_VALUE_WILDCARD 0x1000000
+
+ /*
+ * List of devices with known bugs.
+@@ -359,70 +359,60 @@
+ */
+ static const struct {
+ u32 firmware_revision;
+- u32 model;
++ u32 model_id;
+ unsigned workarounds;
+ } sbp2_workarounds_table[] = {
+ /* DViCO Momobay CX-1 with TSB42AA9 bridge */ {
+ .firmware_revision = 0x002800,
+- .model = 0x001010,
++ .model_id = 0x001010,
+ .workarounds = SBP2_WORKAROUND_INQUIRY_36 |
+ SBP2_WORKAROUND_MODE_SENSE_8 |
+ SBP2_WORKAROUND_POWER_CONDITION,
+ },
+ /* DViCO Momobay FX-3A with TSB42AA9A bridge */ {
+ .firmware_revision = 0x002800,
+- .model = 0x000000,
++ .model_id = 0x000000,
+ .workarounds = SBP2_WORKAROUND_DELAY_INQUIRY |
+ SBP2_WORKAROUND_POWER_CONDITION,
+ },
+ /* Initio bridges, actually only needed for some older ones */ {
+ .firmware_revision = 0x000200,
+- .model = SBP2_ROM_VALUE_WILDCARD,
++ .model_id = SBP2_ROM_VALUE_WILDCARD,
+ .workarounds = SBP2_WORKAROUND_INQUIRY_36,
+ },
+ /* PL-3507 bridge with Prolific firmware */ {
+ .firmware_revision = 0x012800,
+- .model = SBP2_ROM_VALUE_WILDCARD,
++ .model_id = SBP2_ROM_VALUE_WILDCARD,
+ .workarounds = SBP2_WORKAROUND_POWER_CONDITION,
+ },
+ /* Symbios bridge */ {
+ .firmware_revision = 0xa0b800,
+- .model = SBP2_ROM_VALUE_WILDCARD,
++ .model_id = SBP2_ROM_VALUE_WILDCARD,
+ .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
+ },
+ /* Datafab MD2-FW2 with Symbios/LSILogic SYM13FW500 bridge */ {
+ .firmware_revision = 0x002600,
+- .model = SBP2_ROM_VALUE_WILDCARD,
++ .model_id = SBP2_ROM_VALUE_WILDCARD,
+ .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
+ },
+- /*
+- * iPod 2nd generation: needs 128k max transfer size workaround
+- * iPod 3rd generation: needs fix capacity workaround
+- */
+- {
+- .firmware_revision = 0x0a2700,
+- .model = 0x000000,
+- .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS |
+- SBP2_WORKAROUND_FIX_CAPACITY,
+- },
+ /* iPod 4th generation */ {
+ .firmware_revision = 0x0a2700,
+- .model = 0x000021,
++ .model_id = 0x000021,
+ .workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
+ },
+ /* iPod mini */ {
+ .firmware_revision = 0x0a2700,
+- .model = 0x000022,
++ .model_id = 0x000022,
+ .workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
+ },
+ /* iPod mini */ {
+ .firmware_revision = 0x0a2700,
+- .model = 0x000023,
++ .model_id = 0x000023,
+ .workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
+ },
+ /* iPod Photo */ {
+ .firmware_revision = 0x0a2700,
+- .model = 0x00007e,
++ .model_id = 0x00007e,
+ .workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
+ }
+ };
+@@ -1351,15 +1341,13 @@
+ struct csr1212_keyval *kv;
+ struct csr1212_dentry *dentry;
+ u64 management_agent_addr;
+- u32 unit_characteristics, firmware_revision, model;
++ u32 unit_characteristics, firmware_revision;
+ unsigned workarounds;
+ int i;
+
+ management_agent_addr = 0;
+ unit_characteristics = 0;
+- firmware_revision = SBP2_ROM_VALUE_MISSING;
+- model = ud->flags & UNIT_DIRECTORY_MODEL_ID ?
+- ud->model_id : SBP2_ROM_VALUE_MISSING;
++ firmware_revision = 0;
+
+ csr1212_for_each_dir_entry(ud->ne->csr, kv, ud->ud_kv, dentry) {
+ switch (kv->key.id) {
+@@ -1400,9 +1388,9 @@
+ sbp2_workarounds_table[i].firmware_revision !=
+ (firmware_revision & 0xffff00))
+ continue;
+- if (sbp2_workarounds_table[i].model !=
++ if (sbp2_workarounds_table[i].model_id !=
+ SBP2_ROM_VALUE_WILDCARD &&
+- sbp2_workarounds_table[i].model != model)
++ sbp2_workarounds_table[i].model_id != ud->model_id)
+ continue;
+ workarounds |= sbp2_workarounds_table[i].workarounds;
+ break;
+@@ -1415,7 +1403,7 @@
+ NODE_BUS_ARGS(ud->ne->host, ud->ne->nodeid),
+ workarounds, firmware_revision,
+ ud->vendor_id ? ud->vendor_id : ud->ne->vendor_id,
+- model);
++ ud->model_id);
+
+ /* We would need one SCSI host template for each target to adjust
+ * max_sectors on the fly, therefore warn only. */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/infiniband/hw/nes/nes_cm.c linux-2.6.29-rc3.owrt/drivers/infiniband/hw/nes/nes_cm.c
+--- linux-2.6.29.owrt/drivers/infiniband/hw/nes/nes_cm.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/infiniband/hw/nes/nes_cm.c 2009-05-10 23:48:28.000000000 +0200
+@@ -2490,14 +2490,12 @@
+ int ret = 0;
+ struct nes_vnic *nesvnic;
+ struct nes_device *nesdev;
+- struct nes_ib_device *nesibdev;
+
+ nesvnic = to_nesvnic(nesqp->ibqp.device);
+ if (!nesvnic)
+ return -EINVAL;
+
+ nesdev = nesvnic->nesdev;
+- nesibdev = nesvnic->nesibdev;
+
+ nes_debug(NES_DBG_CM, "netdev refcnt = %u.\n",
+ atomic_read(&nesvnic->netdev->refcnt));
+@@ -2509,8 +2507,6 @@
+ } else {
+ /* Need to free the Last Streaming Mode Message */
+ if (nesqp->ietf_frame) {
+- if (nesqp->lsmm_mr)
+- nesibdev->ibdev.dereg_mr(nesqp->lsmm_mr);
+ pci_free_consistent(nesdev->pcidev,
+ nesqp->private_data_len+sizeof(struct ietf_mpa_frame),
+ nesqp->ietf_frame, nesqp->ietf_frame_pbase);
+@@ -2547,12 +2543,6 @@
+ u32 crc_value;
+ int ret;
+ int passive_state;
+- struct nes_ib_device *nesibdev;
+- struct ib_mr *ibmr = NULL;
+- struct ib_phys_buf ibphysbuf;
+- struct nes_pd *nespd;
+-
+-
+
+ ibqp = nes_get_qp(cm_id->device, conn_param->qpn);
+ if (!ibqp)
+@@ -2611,26 +2601,6 @@
+ if (cm_id->remote_addr.sin_addr.s_addr !=
+ cm_id->local_addr.sin_addr.s_addr) {
+ u64temp = (unsigned long)nesqp;
+- nesibdev = nesvnic->nesibdev;
+- nespd = nesqp->nespd;
+- ibphysbuf.addr = nesqp->ietf_frame_pbase;
+- ibphysbuf.size = conn_param->private_data_len +
+- sizeof(struct ietf_mpa_frame);
+- ibmr = nesibdev->ibdev.reg_phys_mr((struct ib_pd *)nespd,
+- &ibphysbuf, 1,
+- IB_ACCESS_LOCAL_WRITE,
+- (u64 *)&nesqp->ietf_frame);
+- if (!ibmr) {
+- nes_debug(NES_DBG_CM, "Unable to register memory region"
+- "for lSMM for cm_node = %p \n",
+- cm_node);
+- return -ENOMEM;
+- }
+-
+- ibmr->pd = &nespd->ibpd;
+- ibmr->device = nespd->ibpd.device;
+- nesqp->lsmm_mr = ibmr;
+-
+ u64temp |= NES_SW_CONTEXT_ALIGN>>1;
+ set_wqe_64bit_value(wqe->wqe_words,
+ NES_IWARP_SQ_WQE_COMP_CTX_LOW_IDX,
+@@ -2641,13 +2611,14 @@
+ wqe->wqe_words[NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX] =
+ cpu_to_le32(conn_param->private_data_len +
+ sizeof(struct ietf_mpa_frame));
+- set_wqe_64bit_value(wqe->wqe_words,
+- NES_IWARP_SQ_WQE_FRAG0_LOW_IDX,
+- (u64)nesqp->ietf_frame);
++ wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_LOW_IDX] =
++ cpu_to_le32((u32)nesqp->ietf_frame_pbase);
++ wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_HIGH_IDX] =
++ cpu_to_le32((u32)((u64)nesqp->ietf_frame_pbase >> 32));
+ wqe->wqe_words[NES_IWARP_SQ_WQE_LENGTH0_IDX] =
+ cpu_to_le32(conn_param->private_data_len +
+ sizeof(struct ietf_mpa_frame));
+- wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = ibmr->lkey;
++ wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = 0;
+
+ nesqp->nesqp_context->ird_ord_sizes |=
+ cpu_to_le32(NES_QPCONTEXT_ORDIRD_LSMM_PRESENT |
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/infiniband/hw/nes/nes_verbs.c linux-2.6.29-rc3.owrt/drivers/infiniband/hw/nes/nes_verbs.c
+--- linux-2.6.29.owrt/drivers/infiniband/hw/nes/nes_verbs.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/infiniband/hw/nes/nes_verbs.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1360,10 +1360,8 @@
+ NES_QPCONTEXT_MISC_RQ_SIZE_SHIFT);
+ nesqp->nesqp_context->misc |= cpu_to_le32((u32)nesqp->hwqp.sq_encoded_size <<
+ NES_QPCONTEXT_MISC_SQ_SIZE_SHIFT);
+- if (!udata) {
+ nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_PRIV_EN);
+ nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_FAST_REGISTER_EN);
+- }
+ nesqp->nesqp_context->cqs = cpu_to_le32(nesqp->nesscq->hw_cq.cq_number +
+ ((u32)nesqp->nesrcq->hw_cq.cq_number << 16));
+ u64temp = (u64)nesqp->hwqp.sq_pbase;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/infiniband/hw/nes/nes_verbs.h linux-2.6.29-rc3.owrt/drivers/infiniband/hw/nes/nes_verbs.h
+--- linux-2.6.29.owrt/drivers/infiniband/hw/nes/nes_verbs.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/infiniband/hw/nes/nes_verbs.h 2009-05-10 23:48:28.000000000 +0200
+@@ -134,7 +134,6 @@
+ struct ietf_mpa_frame *ietf_frame;
+ dma_addr_t ietf_frame_pbase;
+ wait_queue_head_t state_waitq;
+- struct ib_mr *lsmm_mr;
+ unsigned long socket;
+ struct nes_hw_qp hwqp;
+ struct work_struct work;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/input/keyboard/atkbd.c linux-2.6.29-rc3.owrt/drivers/input/keyboard/atkbd.c
+--- linux-2.6.29.owrt/drivers/input/keyboard/atkbd.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/input/keyboard/atkbd.c 2009-05-10 23:48:28.000000000 +0200
+@@ -839,7 +839,7 @@
+ */
+ static void atkbd_dell_laptop_keymap_fixup(struct atkbd *atkbd)
+ {
+- static const unsigned int forced_release_keys[] = {
++ const unsigned int forced_release_keys[] = {
+ 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8f, 0x93,
+ };
+ int i;
+@@ -856,7 +856,7 @@
+ */
+ static void atkbd_hp_keymap_fixup(struct atkbd *atkbd)
+ {
+- static const unsigned int forced_release_keys[] = {
++ const unsigned int forced_release_keys[] = {
+ 0x94,
+ };
+ int i;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/input/keyboard/bf54x-keys.c linux-2.6.29-rc3.owrt/drivers/input/keyboard/bf54x-keys.c
+--- linux-2.6.29.owrt/drivers/input/keyboard/bf54x-keys.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/input/keyboard/bf54x-keys.c 2009-05-10 23:48:28.000000000 +0200
+@@ -209,8 +209,8 @@
+ goto out;
+ }
+
+- if (!pdata->debounce_time || pdata->debounce_time > MAX_MULT ||
+- !pdata->coldrive_time || pdata->coldrive_time > MAX_MULT) {
++ if (!pdata->debounce_time || !pdata->debounce_time > MAX_MULT ||
++ !pdata->coldrive_time || !pdata->coldrive_time > MAX_MULT) {
+ printk(KERN_ERR DRV_NAME
+ ": Invalid Debounce/Columdrive Time from pdata\n");
+ bfin_write_KPAD_MSEL(0xFF0); /* Default MSEL */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/input/keyboard/corgikbd.c linux-2.6.29-rc3.owrt/drivers/input/keyboard/corgikbd.c
+--- linux-2.6.29.owrt/drivers/input/keyboard/corgikbd.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/input/keyboard/corgikbd.c 2009-05-10 23:48:28.000000000 +0200
+@@ -288,7 +288,7 @@
+ #define corgikbd_resume NULL
+ #endif
+
+-static int __devinit corgikbd_probe(struct platform_device *pdev)
++static int __init corgikbd_probe(struct platform_device *pdev)
+ {
+ struct corgikbd *corgikbd;
+ struct input_dev *input_dev;
+@@ -368,7 +368,7 @@
+ return err;
+ }
+
+-static int __devexit corgikbd_remove(struct platform_device *pdev)
++static int corgikbd_remove(struct platform_device *pdev)
+ {
+ int i;
+ struct corgikbd *corgikbd = platform_get_drvdata(pdev);
+@@ -388,7 +388,7 @@
+
+ static struct platform_driver corgikbd_driver = {
+ .probe = corgikbd_probe,
+- .remove = __devexit_p(corgikbd_remove),
++ .remove = corgikbd_remove,
+ .suspend = corgikbd_suspend,
+ .resume = corgikbd_resume,
+ .driver = {
+@@ -397,7 +397,7 @@
+ },
+ };
+
+-static int __init corgikbd_init(void)
++static int __devinit corgikbd_init(void)
+ {
+ return platform_driver_register(&corgikbd_driver);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/input/keyboard/omap-keypad.c linux-2.6.29-rc3.owrt/drivers/input/keyboard/omap-keypad.c
+--- linux-2.6.29.owrt/drivers/input/keyboard/omap-keypad.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/input/keyboard/omap-keypad.c 2009-05-10 23:48:28.000000000 +0200
+@@ -279,7 +279,7 @@
+ #define omap_kp_resume NULL
+ #endif
+
+-static int __devinit omap_kp_probe(struct platform_device *pdev)
++static int __init omap_kp_probe(struct platform_device *pdev)
+ {
+ struct omap_kp *omap_kp;
+ struct input_dev *input_dev;
+@@ -422,7 +422,7 @@
+ return -EINVAL;
+ }
+
+-static int __devexit omap_kp_remove(struct platform_device *pdev)
++static int omap_kp_remove(struct platform_device *pdev)
+ {
+ struct omap_kp *omap_kp = platform_get_drvdata(pdev);
+
+@@ -454,7 +454,7 @@
+
+ static struct platform_driver omap_kp_driver = {
+ .probe = omap_kp_probe,
+- .remove = __devexit_p(omap_kp_remove),
++ .remove = omap_kp_remove,
+ .suspend = omap_kp_suspend,
+ .resume = omap_kp_resume,
+ .driver = {
+@@ -463,7 +463,7 @@
+ },
+ };
+
+-static int __init omap_kp_init(void)
++static int __devinit omap_kp_init(void)
+ {
+ printk(KERN_INFO "OMAP Keypad Driver\n");
+ return platform_driver_register(&omap_kp_driver);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/input/keyboard/spitzkbd.c linux-2.6.29-rc3.owrt/drivers/input/keyboard/spitzkbd.c
+--- linux-2.6.29.owrt/drivers/input/keyboard/spitzkbd.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/input/keyboard/spitzkbd.c 2009-05-10 23:48:28.000000000 +0200
+@@ -343,7 +343,7 @@
+ #define spitzkbd_resume NULL
+ #endif
+
+-static int __devinit spitzkbd_probe(struct platform_device *dev)
++static int __init spitzkbd_probe(struct platform_device *dev)
+ {
+ struct spitzkbd *spitzkbd;
+ struct input_dev *input_dev;
+@@ -444,7 +444,7 @@
+ return err;
+ }
+
+-static int __devexit spitzkbd_remove(struct platform_device *dev)
++static int spitzkbd_remove(struct platform_device *dev)
+ {
+ int i;
+ struct spitzkbd *spitzkbd = platform_get_drvdata(dev);
+@@ -470,7 +470,7 @@
+
+ static struct platform_driver spitzkbd_driver = {
+ .probe = spitzkbd_probe,
+- .remove = __devexit_p(spitzkbd_remove),
++ .remove = spitzkbd_remove,
+ .suspend = spitzkbd_suspend,
+ .resume = spitzkbd_resume,
+ .driver = {
+@@ -479,7 +479,7 @@
+ },
+ };
+
+-static int __init spitzkbd_init(void)
++static int __devinit spitzkbd_init(void)
+ {
+ return platform_driver_register(&spitzkbd_driver);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/input/mouse/elantech.c linux-2.6.29-rc3.owrt/drivers/input/mouse/elantech.c
+--- linux-2.6.29.owrt/drivers/input/mouse/elantech.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/input/mouse/elantech.c 2009-05-10 23:48:28.000000000 +0200
+@@ -542,7 +542,7 @@
+ ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
+ ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) ||
+ ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) {
+- pr_debug("elantech.c: sending Elantech magic knock failed.\n");
++ pr_err("elantech.c: sending Elantech magic knock failed.\n");
+ return -1;
+ }
+
+@@ -551,27 +551,8 @@
+ * set of magic numbers
+ */
+ if (param[0] != 0x3c || param[1] != 0x03 || param[2] != 0xc8) {
+- pr_debug("elantech.c: "
+- "unexpected magic knock result 0x%02x, 0x%02x, 0x%02x.\n",
+- param[0], param[1], param[2]);
+- return -1;
+- }
+-
+- /*
+- * Query touchpad's firmware version and see if it reports known
+- * value to avoid mis-detection. Logitech mice are known to respond
+- * to Elantech magic knock and there might be more.
+- */
+- if (synaptics_send_cmd(psmouse, ETP_FW_VERSION_QUERY, param)) {
+- pr_debug("elantech.c: failed to query firmware version.\n");
+- return -1;
+- }
+-
+- pr_debug("elantech.c: Elantech version query result 0x%02x, 0x%02x, 0x%02x.\n",
+- param[0], param[1], param[2]);
+-
+- if (param[0] == 0 || param[1] != 0) {
+- pr_debug("elantech.c: Probably not a real Elantech touchpad. Aborting.\n");
++ pr_info("elantech.c: unexpected magic knock result 0x%02x, 0x%02x, 0x%02x.\n",
++ param[0], param[1], param[2]);
+ return -1;
+ }
+
+@@ -619,7 +600,8 @@
+ int i, error;
+ unsigned char param[3];
+
+- psmouse->private = etd = kzalloc(sizeof(struct elantech_data), GFP_KERNEL);
++ etd = kzalloc(sizeof(struct elantech_data), GFP_KERNEL);
++ psmouse->private = etd;
+ if (!etd)
+ return -1;
+
+@@ -628,12 +610,14 @@
+ etd->parity[i] = etd->parity[i & (i - 1)] ^ 1;
+
+ /*
+- * Do the version query again so we can store the result
++ * Find out what version hardware this is
+ */
+ if (synaptics_send_cmd(psmouse, ETP_FW_VERSION_QUERY, param)) {
+ pr_err("elantech.c: failed to query firmware version.\n");
+ goto init_fail;
+ }
++ pr_info("elantech.c: Elantech version query result 0x%02x, 0x%02x, 0x%02x.\n",
++ param[0], param[1], param[2]);
+ etd->fw_version_maj = param[0];
+ etd->fw_version_min = param[2];
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/input/mouse/Kconfig linux-2.6.29-rc3.owrt/drivers/input/mouse/Kconfig
+--- linux-2.6.29.owrt/drivers/input/mouse/Kconfig 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/input/mouse/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -70,7 +70,7 @@
+ config MOUSE_PS2_LIFEBOOK
+ bool "Fujitsu Lifebook PS/2 mouse protocol extension" if EMBEDDED
+ default y
+- depends on MOUSE_PS2 && X86
++ depends on MOUSE_PS2
+ help
+ Say Y here if you have a Fujitsu B-series Lifebook PS/2
+ TouchScreen connected to your system.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/input/mouse/pxa930_trkball.c linux-2.6.29-rc3.owrt/drivers/input/mouse/pxa930_trkball.c
+--- linux-2.6.29.owrt/drivers/input/mouse/pxa930_trkball.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/input/mouse/pxa930_trkball.c 2009-05-10 23:48:28.000000000 +0200
+@@ -83,7 +83,7 @@
+
+ __raw_writel(v, trkball->mmio_base + TBCR);
+
+- while (--i) {
++ while (i--) {
+ if (__raw_readl(trkball->mmio_base + TBCR) == v)
+ break;
+ msleep(1);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/input/mouse/synaptics.c linux-2.6.29-rc3.owrt/drivers/input/mouse/synaptics.c
+--- linux-2.6.29.owrt/drivers/input/mouse/synaptics.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/input/mouse/synaptics.c 2009-05-10 23:48:28.000000000 +0200
+@@ -182,6 +182,11 @@
+
+ static int synaptics_query_hardware(struct psmouse *psmouse)
+ {
++ int retries = 0;
++
++ while ((retries++ < 3) && psmouse_reset(psmouse))
++ /* empty */;
++
+ if (synaptics_identify(psmouse))
+ return -1;
+ if (synaptics_model_id(psmouse))
+@@ -577,8 +582,6 @@
+ struct synaptics_data *priv = psmouse->private;
+ struct synaptics_data old_priv = *priv;
+
+- psmouse_reset(psmouse);
+-
+ if (synaptics_detect(psmouse, 0))
+ return -1;
+
+@@ -637,8 +640,6 @@
+ if (!priv)
+ return -1;
+
+- psmouse_reset(psmouse);
+-
+ if (synaptics_query_hardware(psmouse)) {
+ printk(KERN_ERR "Unable to query Synaptics hardware.\n");
+ goto init_fail;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/input/serio/ambakmi.c linux-2.6.29-rc3.owrt/drivers/input/serio/ambakmi.c
+--- linux-2.6.29.owrt/drivers/input/serio/ambakmi.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/input/serio/ambakmi.c 2009-05-10 23:48:28.000000000 +0200
+@@ -57,7 +57,7 @@
+ struct amba_kmi_port *kmi = io->port_data;
+ unsigned int timeleft = 10000; /* timeout in 100ms */
+
+- while ((readb(KMISTAT) & KMISTAT_TXEMPTY) == 0 && --timeleft)
++ while ((readb(KMISTAT) & KMISTAT_TXEMPTY) == 0 && timeleft--)
+ udelay(10);
+
+ if (timeleft)
+@@ -129,8 +129,8 @@
+ io->write = amba_kmi_write;
+ io->open = amba_kmi_open;
+ io->close = amba_kmi_close;
+- strlcpy(io->name, dev_name(&dev->dev), sizeof(io->name));
+- strlcpy(io->phys, dev_name(&dev->dev), sizeof(io->phys));
++ strlcpy(io->name, dev->dev.bus_id, sizeof(io->name));
++ strlcpy(io->phys, dev->dev.bus_id, sizeof(io->phys));
+ io->port_data = kmi;
+ io->dev.parent = &dev->dev;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/input/serio/gscps2.c linux-2.6.29-rc3.owrt/drivers/input/serio/gscps2.c
+--- linux-2.6.29.owrt/drivers/input/serio/gscps2.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/input/serio/gscps2.c 2009-05-10 23:48:28.000000000 +0200
+@@ -359,7 +359,7 @@
+
+ snprintf(serio->name, sizeof(serio->name), "GSC PS/2 %s",
+ (ps2port->id == GSC_ID_KEYBOARD) ? "keyboard" : "mouse");
+- strlcpy(serio->phys, dev_name(&dev->dev), sizeof(serio->phys));
++ strlcpy(serio->phys, dev->dev.bus_id, sizeof(serio->phys));
+ serio->id.type = SERIO_8042;
+ serio->write = gscps2_write;
+ serio->open = gscps2_open;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/input/serio/sa1111ps2.c linux-2.6.29-rc3.owrt/drivers/input/serio/sa1111ps2.c
+--- linux-2.6.29.owrt/drivers/input/serio/sa1111ps2.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/input/serio/sa1111ps2.c 2009-05-10 23:48:28.000000000 +0200
+@@ -246,8 +246,8 @@
+ serio->write = ps2_write;
+ serio->open = ps2_open;
+ serio->close = ps2_close;
+- strlcpy(serio->name, dev_name(&dev->dev), sizeof(serio->name));
+- strlcpy(serio->phys, dev_name(&dev->dev), sizeof(serio->phys));
++ strlcpy(serio->name, dev->dev.bus_id, sizeof(serio->name));
++ strlcpy(serio->phys, dev->dev.bus_id, sizeof(serio->phys));
+ serio->port_data = ps2if;
+ serio->dev.parent = &dev->dev;
+ ps2if->io = serio;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/input/touchscreen/atmel_tsadcc.c linux-2.6.29-rc3.owrt/drivers/input/touchscreen/atmel_tsadcc.c
+--- linux-2.6.29.owrt/drivers/input/touchscreen/atmel_tsadcc.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/input/touchscreen/atmel_tsadcc.c 2009-05-10 23:48:28.000000000 +0200
+@@ -236,7 +236,7 @@
+ ts_dev->bufferedmeasure = 0;
+
+ snprintf(ts_dev->phys, sizeof(ts_dev->phys),
+- "%s/input0", dev_name(&pdev->dev));
++ "%s/input0", pdev->dev.bus_id);
+
+ input_dev->name = "atmel touch screen controller";
+ input_dev->phys = ts_dev->phys;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/input/touchscreen/corgi_ts.c linux-2.6.29-rc3.owrt/drivers/input/touchscreen/corgi_ts.c
+--- linux-2.6.29.owrt/drivers/input/touchscreen/corgi_ts.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/input/touchscreen/corgi_ts.c 2009-05-10 23:48:28.000000000 +0200
+@@ -268,7 +268,7 @@
+ #define corgits_resume NULL
+ #endif
+
+-static int __devinit corgits_probe(struct platform_device *pdev)
++static int __init corgits_probe(struct platform_device *pdev)
+ {
+ struct corgi_ts *corgi_ts;
+ struct input_dev *input_dev;
+@@ -343,7 +343,7 @@
+ return err;
+ }
+
+-static int __devexit corgits_remove(struct platform_device *pdev)
++static int corgits_remove(struct platform_device *pdev)
+ {
+ struct corgi_ts *corgi_ts = platform_get_drvdata(pdev);
+
+@@ -352,13 +352,12 @@
+ corgi_ts->machinfo->put_hsync();
+ input_unregister_device(corgi_ts->input);
+ kfree(corgi_ts);
+-
+ return 0;
+ }
+
+ static struct platform_driver corgits_driver = {
+ .probe = corgits_probe,
+- .remove = __devexit_p(corgits_remove),
++ .remove = corgits_remove,
+ .suspend = corgits_suspend,
+ .resume = corgits_resume,
+ .driver = {
+@@ -367,7 +366,7 @@
+ },
+ };
+
+-static int __init corgits_init(void)
++static int __devinit corgits_init(void)
+ {
+ return platform_driver_register(&corgits_driver);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/input/touchscreen/tsc2007.c linux-2.6.29-rc3.owrt/drivers/input/touchscreen/tsc2007.c
+--- linux-2.6.29.owrt/drivers/input/touchscreen/tsc2007.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/input/touchscreen/tsc2007.c 2009-05-10 23:48:28.000000000 +0200
+@@ -289,8 +289,7 @@
+
+ pdata->init_platform_hw();
+
+- snprintf(ts->phys, sizeof(ts->phys),
+- "%s/input0", dev_name(&client->dev));
++ snprintf(ts->phys, sizeof(ts->phys), "%s/input0", client->dev.bus_id);
+
+ input_dev->name = "TSC2007 Touchscreen";
+ input_dev->phys = ts->phys;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/input/touchscreen/usbtouchscreen.c linux-2.6.29-rc3.owrt/drivers/input/touchscreen/usbtouchscreen.c
+--- linux-2.6.29.owrt/drivers/input/touchscreen/usbtouchscreen.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/input/touchscreen/usbtouchscreen.c 2009-05-10 23:48:28.000000000 +0200
+@@ -60,10 +60,6 @@
+ module_param(swap_xy, bool, 0644);
+ MODULE_PARM_DESC(swap_xy, "If set X and Y axes are swapped.");
+
+-static int hwcalib_xy;
+-module_param(hwcalib_xy, bool, 0644);
+-MODULE_PARM_DESC(hwcalib_xy, "If set hw-calibrated X/Y are used if available");
+-
+ /* device specifc data/functions */
+ struct usbtouch_usb;
+ struct usbtouch_device_info {
+@@ -122,7 +118,6 @@
+
+ #define USB_DEVICE_HID_CLASS(vend, prod) \
+ .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS \
+- | USB_DEVICE_ID_MATCH_INT_PROTOCOL \
+ | USB_DEVICE_ID_MATCH_DEVICE, \
+ .idVendor = (vend), \
+ .idProduct = (prod), \
+@@ -265,13 +260,8 @@
+
+ static int mtouch_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
+ {
+- if (hwcalib_xy) {
+- dev->x = (pkt[4] << 8) | pkt[3];
+- dev->y = 0xffff - ((pkt[6] << 8) | pkt[5]);
+- } else {
+- dev->x = (pkt[8] << 8) | pkt[7];
+- dev->y = (pkt[10] << 8) | pkt[9];
+- }
++ dev->x = (pkt[8] << 8) | pkt[7];
++ dev->y = (pkt[10] << 8) | pkt[9];
+ dev->touch = (pkt[2] & 0x40) ? 1 : 0;
+
+ return 1;
+@@ -304,12 +294,6 @@
+ return ret;
+ }
+
+- /* Default min/max xy are the raw values, override if using hw-calib */
+- if (hwcalib_xy) {
+- input_set_abs_params(usbtouch->input, ABS_X, 0, 0xffff, 0, 0);
+- input_set_abs_params(usbtouch->input, ABS_Y, 0, 0xffff, 0, 0);
+- }
+-
+ return 0;
+ }
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/isdn/gigaset/bas-gigaset.c linux-2.6.29-rc3.owrt/drivers/isdn/gigaset/bas-gigaset.c
+--- linux-2.6.29.owrt/drivers/isdn/gigaset/bas-gigaset.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/isdn/gigaset/bas-gigaset.c 2009-05-10 23:48:28.000000000 +0200
+@@ -46,9 +46,6 @@
+ /* length limit according to Siemens 3070usb-protokoll.doc ch. 2.1 */
+ #define IF_WRITEBUF 264
+
+-/* interrupt pipe message size according to ibid. ch. 2.2 */
+-#define IP_MSGSIZE 3
+-
+ /* Values for the Gigaset 307x */
+ #define USB_GIGA_VENDOR_ID 0x0681
+ #define USB_3070_PRODUCT_ID 0x0001
+@@ -113,7 +110,7 @@
+ unsigned char *rcvbuf; /* AT reply receive buffer */
+
+ struct urb *urb_int_in; /* URB for interrupt pipe */
+- unsigned char *int_in_buf;
++ unsigned char int_in_buf[3];
+
+ spinlock_t lock; /* locks all following */
+ int basstate; /* bitmap (BS_*) */
+@@ -660,7 +657,7 @@
+ }
+
+ /* drop incomplete packets even if the missing bytes wouldn't matter */
+- if (unlikely(urb->actual_length < IP_MSGSIZE)) {
++ if (unlikely(urb->actual_length < 3)) {
+ dev_warn(cs->dev, "incomplete interrupt packet (%d bytes)\n",
+ urb->actual_length);
+ goto resubmit;
+@@ -2130,7 +2127,6 @@
+ static void gigaset_freecshw(struct cardstate *cs)
+ {
+ /* timers, URBs and rcvbuf are disposed of in disconnect */
+- kfree(cs->hw.bas->int_in_buf);
+ kfree(cs->hw.bas);
+ cs->hw.bas = NULL;
+ }
+@@ -2144,12 +2140,6 @@
+ pr_err("out of memory\n");
+ return 0;
+ }
+- ucs->int_in_buf = kmalloc(IP_MSGSIZE, GFP_KERNEL);
+- if (!ucs->int_in_buf) {
+- kfree(ucs);
+- pr_err("out of memory\n");
+- return 0;
+- }
+
+ ucs->urb_cmd_in = NULL;
+ ucs->urb_cmd_out = NULL;
+@@ -2302,7 +2292,7 @@
+ usb_fill_int_urb(ucs->urb_int_in, udev,
+ usb_rcvintpipe(udev,
+ (endpoint->bEndpointAddress) & 0x0f),
+- ucs->int_in_buf, IP_MSGSIZE, read_int_callback, cs,
++ ucs->int_in_buf, 3, read_int_callback, cs,
+ endpoint->bInterval);
+ if ((rc = usb_submit_urb(ucs->urb_int_in, GFP_KERNEL)) != 0) {
+ dev_err(cs->dev, "could not submit interrupt URB: %s\n",
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/isdn/hardware/mISDN/hfcmulti.c linux-2.6.29-rc3.owrt/drivers/isdn/hardware/mISDN/hfcmulti.c
+--- linux-2.6.29.owrt/drivers/isdn/hardware/mISDN/hfcmulti.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/isdn/hardware/mISDN/hfcmulti.c 2009-05-10 23:48:28.000000000 +0200
+@@ -4599,7 +4599,6 @@
+ printk(KERN_ERR "%s: no memory for coeffs\n",
+ __func__);
+ ret = -ENOMEM;
+- kfree(bch);
+ goto free_chan;
+ }
+ bch->nr = ch;
+@@ -4768,7 +4767,6 @@
+ printk(KERN_ERR "%s: no memory for coeffs\n",
+ __func__);
+ ret = -ENOMEM;
+- kfree(bch);
+ goto free_chan;
+ }
+ bch->nr = ch + 1;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/isdn/sc/shmem.c linux-2.6.29-rc3.owrt/drivers/isdn/sc/shmem.c
+--- linux-2.6.29.owrt/drivers/isdn/sc/shmem.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/isdn/sc/shmem.c 2009-05-10 23:48:28.000000000 +0200
+@@ -54,7 +54,7 @@
+ spin_unlock_irqrestore(&sc_adapter[card]->lock, flags);
+ pr_debug("%s: set page to %#x\n",sc_adapter[card]->devicename,
+ ((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE)>>14)|0x80);
+- pr_debug("%s: copying %zu bytes from %#lx to %#lx\n",
++ pr_debug("%s: copying %d bytes from %#lx to %#lx\n",
+ sc_adapter[card]->devicename, n,
+ (unsigned long) src,
+ sc_adapter[card]->rambase + ((unsigned long) dest %0x4000));
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/lguest/core.c linux-2.6.29-rc3.owrt/drivers/lguest/core.c
+--- linux-2.6.29.owrt/drivers/lguest/core.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/lguest/core.c 2009-05-10 23:48:28.000000000 +0200
+@@ -224,7 +224,7 @@
+ break;
+
+ /* If the Guest asked to be stopped, we sleep. The Guest's
+- * clock timer or LHREQ_BREAK from the Waker will wake us. */
++ * clock timer or LHCALL_BREAK from the Waker will wake us. */
+ if (cpu->halted) {
+ set_current_state(TASK_INTERRUPTIBLE);
+ schedule();
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/lguest/lguest_device.c linux-2.6.29-rc3.owrt/drivers/lguest/lguest_device.c
+--- linux-2.6.29.owrt/drivers/lguest/lguest_device.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/lguest/lguest_device.c 2009-05-10 23:48:28.000000000 +0200
+@@ -212,9 +212,6 @@
+ hcall(LHCALL_NOTIFY, lvq->config.pfn << PAGE_SHIFT, 0, 0);
+ }
+
+-/* An extern declaration inside a C file is bad form. Don't do it. */
+-extern void lguest_setup_irq(unsigned int irq);
+-
+ /* This routine finds the first virtqueue described in the configuration of
+ * this device and sets it up.
+ *
+@@ -269,9 +266,6 @@
+ goto unmap;
+ }
+
+- /* Make sure the interrupt is allocated. */
+- lguest_setup_irq(lvq->config.irq);
+-
+ /* Tell the interrupt for this virtqueue to go to the virtio_ring
+ * interrupt handler. */
+ /* FIXME: We used to have a flag for the Host to tell us we could use
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/lguest/lguest_user.c linux-2.6.29-rc3.owrt/drivers/lguest/lguest_user.c
+--- linux-2.6.29.owrt/drivers/lguest/lguest_user.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/lguest/lguest_user.c 2009-05-10 23:48:28.000000000 +0200
+@@ -307,8 +307,9 @@
+ * kmalloc()ed string, either of which is ok to hand to kfree(). */
+ if (!IS_ERR(lg->dead))
+ kfree(lg->dead);
+- /* Free the memory allocated to the lguest_struct */
+- kfree(lg);
++ /* We clear the entire structure, which also marks it as free for the
++ * next user. */
++ memset(lg, 0, sizeof(*lg));
+ /* Release lock and exit. */
+ mutex_unlock(&lguest_lock);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/md/dm.c linux-2.6.29-rc3.owrt/drivers/md/dm.c
+--- linux-2.6.29.owrt/drivers/md/dm.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/md/dm.c 2009-05-10 23:48:28.000000000 +0200
+@@ -525,12 +525,9 @@
+ static void dec_pending(struct dm_io *io, int error)
+ {
+ unsigned long flags;
+- int io_error;
+- struct bio *bio;
+- struct mapped_device *md = io->md;
+
+ /* Push-back supersedes any I/O errors */
+- if (error && !(io->error > 0 && __noflush_suspending(md)))
++ if (error && !(io->error > 0 && __noflush_suspending(io->md)))
+ io->error = error;
+
+ if (atomic_dec_and_test(&io->io_count)) {
+@@ -540,27 +537,24 @@
+ * This must be handled before the sleeper on
+ * suspend queue merges the pushback list.
+ */
+- spin_lock_irqsave(&md->pushback_lock, flags);
+- if (__noflush_suspending(md))
+- bio_list_add(&md->pushback, io->bio);
++ spin_lock_irqsave(&io->md->pushback_lock, flags);
++ if (__noflush_suspending(io->md))
++ bio_list_add(&io->md->pushback, io->bio);
+ else
+ /* noflush suspend was interrupted. */
+ io->error = -EIO;
+- spin_unlock_irqrestore(&md->pushback_lock, flags);
++ spin_unlock_irqrestore(&io->md->pushback_lock, flags);
+ }
+
+ end_io_acct(io);
+
+- io_error = io->error;
+- bio = io->bio;
+-
+- free_io(md, io);
++ if (io->error != DM_ENDIO_REQUEUE) {
++ trace_block_bio_complete(io->md->queue, io->bio);
+
+- if (io_error != DM_ENDIO_REQUEUE) {
+- trace_block_bio_complete(md->queue, bio);
+-
+- bio_endio(bio, io_error);
++ bio_endio(io->bio, io->error);
+ }
++
++ free_io(io->md, io);
+ }
+ }
+
+@@ -568,7 +562,6 @@
+ {
+ int r = 0;
+ struct dm_target_io *tio = bio->bi_private;
+- struct dm_io *io = tio->io;
+ struct mapped_device *md = tio->io->md;
+ dm_endio_fn endio = tio->ti->type->end_io;
+
+@@ -592,14 +585,15 @@
+ }
+ }
+
++ dec_pending(tio->io, error);
++
+ /*
+ * Store md for cleanup instead of tio which is about to get freed.
+ */
+ bio->bi_private = md->bs;
+
+- free_tio(md, tio);
+ bio_put(bio);
+- dec_pending(io, error);
++ free_tio(md, tio);
+ }
+
+ static sector_t max_io_len(struct mapped_device *md,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/md/dm-crypt.c linux-2.6.29-rc3.owrt/drivers/md/dm-crypt.c
+--- linux-2.6.29.owrt/drivers/md/dm-crypt.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/md/dm-crypt.c 2009-05-10 23:48:28.000000000 +0200
+@@ -60,7 +60,6 @@
+ };
+
+ struct dm_crypt_request {
+- struct convert_context *ctx;
+ struct scatterlist sg_in;
+ struct scatterlist sg_out;
+ };
+@@ -336,18 +335,6 @@
+ init_completion(&ctx->restart);
+ }
+
+-static struct dm_crypt_request *dmreq_of_req(struct crypt_config *cc,
+- struct ablkcipher_request *req)
+-{
+- return (struct dm_crypt_request *)((char *)req + cc->dmreq_start);
+-}
+-
+-static struct ablkcipher_request *req_of_dmreq(struct crypt_config *cc,
+- struct dm_crypt_request *dmreq)
+-{
+- return (struct ablkcipher_request *)((char *)dmreq - cc->dmreq_start);
+-}
+-
+ static int crypt_convert_block(struct crypt_config *cc,
+ struct convert_context *ctx,
+ struct ablkcipher_request *req)
+@@ -358,11 +345,10 @@
+ u8 *iv;
+ int r = 0;
+
+- dmreq = dmreq_of_req(cc, req);
++ dmreq = (struct dm_crypt_request *)((char *)req + cc->dmreq_start);
+ iv = (u8 *)ALIGN((unsigned long)(dmreq + 1),
+ crypto_ablkcipher_alignmask(cc->tfm) + 1);
+
+- dmreq->ctx = ctx;
+ sg_init_table(&dmreq->sg_in, 1);
+ sg_set_page(&dmreq->sg_in, bv_in->bv_page, 1 << SECTOR_SHIFT,
+ bv_in->bv_offset + ctx->offset_in);
+@@ -409,9 +395,8 @@
+ cc->req = mempool_alloc(cc->req_pool, GFP_NOIO);
+ ablkcipher_request_set_tfm(cc->req, cc->tfm);
+ ablkcipher_request_set_callback(cc->req, CRYPTO_TFM_REQ_MAY_BACKLOG |
+- CRYPTO_TFM_REQ_MAY_SLEEP,
+- kcryptd_async_done,
+- dmreq_of_req(cc, cc->req));
++ CRYPTO_TFM_REQ_MAY_SLEEP,
++ kcryptd_async_done, ctx);
+ }
+
+ /*
+@@ -568,22 +553,19 @@
+ static void crypt_dec_pending(struct dm_crypt_io *io)
+ {
+ struct crypt_config *cc = io->target->private;
+- struct bio *base_bio = io->base_bio;
+- struct dm_crypt_io *base_io = io->base_io;
+- int error = io->error;
+
+ if (!atomic_dec_and_test(&io->pending))
+ return;
+
+- mempool_free(io, cc->io_pool);
+-
+- if (likely(!base_io))
+- bio_endio(base_bio, error);
++ if (likely(!io->base_io))
++ bio_endio(io->base_bio, io->error);
+ else {
+- if (error && !base_io->error)
+- base_io->error = error;
+- crypt_dec_pending(base_io);
++ if (io->error && !io->base_io->error)
++ io->base_io->error = io->error;
++ crypt_dec_pending(io->base_io);
+ }
++
++ mempool_free(io, cc->io_pool);
+ }
+
+ /*
+@@ -839,8 +821,7 @@
+ static void kcryptd_async_done(struct crypto_async_request *async_req,
+ int error)
+ {
+- struct dm_crypt_request *dmreq = async_req->data;
+- struct convert_context *ctx = dmreq->ctx;
++ struct convert_context *ctx = async_req->data;
+ struct dm_crypt_io *io = container_of(ctx, struct dm_crypt_io, ctx);
+ struct crypt_config *cc = io->target->private;
+
+@@ -849,7 +830,7 @@
+ return;
+ }
+
+- mempool_free(req_of_dmreq(cc, dmreq), cc->req_pool);
++ mempool_free(ablkcipher_request_cast(async_req), cc->req_pool);
+
+ if (!atomic_dec_and_test(&ctx->pending))
+ return;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/md/dm-io.c linux-2.6.29-rc3.owrt/drivers/md/dm-io.c
+--- linux-2.6.29.owrt/drivers/md/dm-io.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/md/dm-io.c 2009-05-10 23:48:28.000000000 +0200
+@@ -292,8 +292,6 @@
+ (PAGE_SIZE >> SECTOR_SHIFT));
+ num_bvecs = 1 + min_t(int, bio_get_nr_vecs(where->bdev),
+ num_bvecs);
+- if (unlikely(num_bvecs > BIO_MAX_PAGES))
+- num_bvecs = BIO_MAX_PAGES;
+ bio = bio_alloc_bioset(GFP_NOIO, num_bvecs, io->client->bios);
+ bio->bi_sector = where->sector + (where->count - remaining);
+ bio->bi_bdev = where->bdev;
+@@ -330,7 +328,7 @@
+ struct dpages old_pages = *dp;
+
+ if (sync)
+- rw |= (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG);
++ rw |= (1 << BIO_RW_SYNC);
+
+ /*
+ * For multiple regions we need to be careful to rewind
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/md/dm-ioctl.c linux-2.6.29-rc3.owrt/drivers/md/dm-ioctl.c
+--- linux-2.6.29.owrt/drivers/md/dm-ioctl.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/md/dm-ioctl.c 2009-05-10 23:48:28.000000000 +0200
+@@ -704,8 +704,7 @@
+ char *new_name = (char *) param + param->data_start;
+
+ if (new_name < param->data ||
+- invalid_str(new_name, (void *) param + param_size) ||
+- strlen(new_name) > DM_NAME_LEN - 1) {
++ invalid_str(new_name, (void *) param + param_size)) {
+ DMWARN("Invalid new logical volume name supplied.");
+ return -EINVAL;
+ }
+@@ -1064,7 +1063,7 @@
+
+ r = populate_table(t, param, param_size);
+ if (r) {
+- dm_table_destroy(t);
++ dm_table_put(t);
+ goto out;
+ }
+
+@@ -1072,7 +1071,7 @@
+ hc = dm_get_mdptr(md);
+ if (!hc || hc->md != md) {
+ DMWARN("device has been removed from the dev hash table.");
+- dm_table_destroy(t);
++ dm_table_put(t);
+ up_write(&_hash_lock);
+ r = -ENXIO;
+ goto out;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/md/dm-kcopyd.c linux-2.6.29-rc3.owrt/drivers/md/dm-kcopyd.c
+--- linux-2.6.29.owrt/drivers/md/dm-kcopyd.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/md/dm-kcopyd.c 2009-05-10 23:48:28.000000000 +0200
+@@ -344,7 +344,7 @@
+ {
+ int r;
+ struct dm_io_request io_req = {
+- .bi_rw = job->rw | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG),
++ .bi_rw = job->rw | (1 << BIO_RW_SYNC),
+ .mem.type = DM_IO_PAGE_LIST,
+ .mem.ptr.pl = job->pages,
+ .mem.offset = job->offset,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/md/linear.c linux-2.6.29-rc3.owrt/drivers/md/linear.c
+--- linux-2.6.29.owrt/drivers/md/linear.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/md/linear.c 2009-05-10 23:48:28.000000000 +0200
+@@ -25,13 +25,13 @@
+ {
+ dev_info_t *hash;
+ linear_conf_t *conf = mddev_to_conf(mddev);
+- sector_t idx = sector >> conf->sector_shift;
+
+ /*
+ * sector_div(a,b) returns the remainer and sets a to a/b
+ */
+- (void)sector_div(idx, conf->spacing);
+- hash = conf->hash_table[idx];
++ sector >>= conf->sector_shift;
++ (void)sector_div(sector, conf->spacing);
++ hash = conf->hash_table[sector];
+
+ while (sector >= hash->num_sectors + hash->start_sector)
+ hash++;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/md/md.c linux-2.6.29-rc3.owrt/drivers/md/md.c
+--- linux-2.6.29.owrt/drivers/md/md.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/md/md.c 2009-05-10 23:48:28.000000000 +0200
+@@ -214,7 +214,12 @@
+ return mddev;
+ }
+
+-static void mddev_delayed_delete(struct work_struct *ws);
++static void mddev_delayed_delete(struct work_struct *ws)
++{
++ mddev_t *mddev = container_of(ws, mddev_t, del_work);
++ kobject_del(&mddev->kobj);
++ kobject_put(&mddev->kobj);
++}
+
+ static void mddev_put(mddev_t *mddev)
+ {
+@@ -469,7 +474,7 @@
+ * causes ENOTSUPP, we allocate a spare bio...
+ */
+ struct bio *bio = bio_alloc(GFP_NOIO, 1);
+- int rw = (1<<BIO_RW) | (1<<BIO_RW_SYNCIO) | (1<<BIO_RW_UNPLUG);
++ int rw = (1<<BIO_RW) | (1<<BIO_RW_SYNC);
+
+ bio->bi_bdev = rdev->bdev;
+ bio->bi_sector = sector;
+@@ -526,7 +531,7 @@
+ struct completion event;
+ int ret;
+
+- rw |= (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG);
++ rw |= (1 << BIO_RW_SYNC);
+
+ bio->bi_bdev = bdev;
+ bio->bi_sector = sector;
+@@ -1476,11 +1481,6 @@
+ if (find_rdev_nr(mddev, rdev->desc_nr))
+ return -EBUSY;
+ }
+- if (mddev->max_disks && rdev->desc_nr >= mddev->max_disks) {
+- printk(KERN_WARNING "md: %s: array is limited to %d devices\n",
+- mdname(mddev), mddev->max_disks);
+- return -EBUSY;
+- }
+ bdevname(rdev->bdev,b);
+ while ( (s=strchr(b, '/')) != NULL)
+ *s = '!';
+@@ -2441,15 +2441,6 @@
+
+ i = 0;
+ rdev_for_each(rdev, tmp, mddev) {
+- if (rdev->desc_nr >= mddev->max_disks ||
+- i > mddev->max_disks) {
+- printk(KERN_WARNING
+- "md: %s: %s: only %d devices permitted\n",
+- mdname(mddev), bdevname(rdev->bdev, b),
+- mddev->max_disks);
+- kick_rdev_from_array(rdev);
+- continue;
+- }
+ if (rdev != freshest)
+ if (super_types[mddev->major_version].
+ validate_super(mddev, rdev)) {
+@@ -3537,21 +3528,6 @@
+
+ int mdp_major = 0;
+
+-static void mddev_delayed_delete(struct work_struct *ws)
+-{
+- mddev_t *mddev = container_of(ws, mddev_t, del_work);
+-
+- if (mddev->private == &md_redundancy_group) {
+- sysfs_remove_group(&mddev->kobj, &md_redundancy_group);
+- if (mddev->sysfs_action)
+- sysfs_put(mddev->sysfs_action);
+- mddev->sysfs_action = NULL;
+- mddev->private = NULL;
+- }
+- kobject_del(&mddev->kobj);
+- kobject_put(&mddev->kobj);
+-}
+-
+ static int md_alloc(dev_t dev, char *name)
+ {
+ static DEFINE_MUTEX(disks_mutex);
+@@ -4043,9 +4019,13 @@
+ mddev->queue->merge_bvec_fn = NULL;
+ mddev->queue->unplug_fn = NULL;
+ mddev->queue->backing_dev_info.congested_fn = NULL;
++ if (mddev->pers->sync_request) {
++ sysfs_remove_group(&mddev->kobj, &md_redundancy_group);
++ if (mddev->sysfs_action)
++ sysfs_put(mddev->sysfs_action);
++ mddev->sysfs_action = NULL;
++ }
+ module_put(mddev->pers->owner);
+- if (mddev->pers->sync_request)
+- mddev->private = &md_redundancy_group;
+ mddev->pers = NULL;
+ /* tell userspace to handle 'inactive' */
+ sysfs_notify_dirent(mddev->sysfs_state);
+@@ -4634,6 +4614,13 @@
+ * noticed in interrupt contexts ...
+ */
+
++ if (rdev->desc_nr == mddev->max_disks) {
++ printk(KERN_WARNING "%s: can not hot-add to full array!\n",
++ mdname(mddev));
++ err = -EBUSY;
++ goto abort_unbind_export;
++ }
++
+ rdev->raid_disk = -1;
+
+ md_update_sb(mddev, 1);
+@@ -4647,6 +4634,9 @@
+ md_new_event(mddev);
+ return 0;
+
++abort_unbind_export:
++ unbind_rdev_from_array(rdev);
++
+ abort_export:
+ export_rdev(rdev);
+ return err;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/md/raid10.c linux-2.6.29-rc3.owrt/drivers/md/raid10.c
+--- linux-2.6.29.owrt/drivers/md/raid10.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/md/raid10.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1236,7 +1236,6 @@
+ /* for reconstruct, we always reschedule after a read.
+ * for resync, only after all reads
+ */
+- rdev_dec_pending(conf->mirrors[d].rdev, conf->mddev);
+ if (test_bit(R10BIO_IsRecover, &r10_bio->state) ||
+ atomic_dec_and_test(&r10_bio->remaining)) {
+ /* we have read all the blocks,
+@@ -1244,6 +1243,7 @@
+ */
+ reschedule_retry(r10_bio);
+ }
++ rdev_dec_pending(conf->mirrors[d].rdev, conf->mddev);
+ }
+
+ static void end_sync_write(struct bio *bio, int error)
+@@ -1264,13 +1264,11 @@
+
+ update_head_pos(i, r10_bio);
+
+- rdev_dec_pending(conf->mirrors[d].rdev, mddev);
+ while (atomic_dec_and_test(&r10_bio->remaining)) {
+ if (r10_bio->master_bio == NULL) {
+ /* the primary of several recovery bios */
+- sector_t s = r10_bio->sectors;
++ md_done_sync(mddev, r10_bio->sectors, 1);
+ put_buf(r10_bio);
+- md_done_sync(mddev, s, 1);
+ break;
+ } else {
+ r10bio_t *r10_bio2 = (r10bio_t *)r10_bio->master_bio;
+@@ -1278,6 +1276,7 @@
+ r10_bio = r10_bio2;
+ }
+ }
++ rdev_dec_pending(conf->mirrors[d].rdev, mddev);
+ }
+
+ /*
+@@ -1750,6 +1749,8 @@
+ if (!go_faster && conf->nr_waiting)
+ msleep_interruptible(1000);
+
++ bitmap_cond_end_sync(mddev->bitmap, sector_nr);
++
+ /* Again, very different code for resync and recovery.
+ * Both must result in an r10bio with a list of bios that
+ * have bi_end_io, bi_sector, bi_bdev set,
+@@ -1885,8 +1886,6 @@
+ /* resync. Schedule a read for every block at this virt offset */
+ int count = 0;
+
+- bitmap_cond_end_sync(mddev->bitmap, sector_nr);
+-
+ if (!bitmap_start_sync(mddev->bitmap, sector_nr,
+ &sync_blocks, mddev->degraded) &&
+ !conf->fullsync && !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) {
+@@ -2011,13 +2010,13 @@
+ /* There is nowhere to write, so all non-sync
+ * drives must be failed, so try the next chunk...
+ */
+- if (sector_nr + max_sync < max_sector)
+- max_sector = sector_nr + max_sync;
+-
+- sectors_skipped += (max_sector - sector_nr);
++ {
++ sector_t sec = max_sector - sector_nr;
++ sectors_skipped += sec;
+ chunks_skipped ++;
+ sector_nr = max_sector;
+ goto skipped;
++ }
+ }
+
+ static int run(mddev_t *mddev)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/md/raid1.c linux-2.6.29-rc3.owrt/drivers/md/raid1.c
+--- linux-2.6.29.owrt/drivers/md/raid1.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/md/raid1.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1237,9 +1237,8 @@
+ update_head_pos(mirror, r1_bio);
+
+ if (atomic_dec_and_test(&r1_bio->remaining)) {
+- sector_t s = r1_bio->sectors;
++ md_done_sync(mddev, r1_bio->sectors, uptodate);
+ put_buf(r1_bio);
+- md_done_sync(mddev, s, uptodate);
+ }
+ }
+
+@@ -1641,8 +1640,7 @@
+ }
+
+ bio = r1_bio->bios[r1_bio->read_disk];
+- if ((disk=read_balance(conf, r1_bio)) == -1 ||
+- disk == r1_bio->read_disk) {
++ if ((disk=read_balance(conf, r1_bio)) == -1) {
+ printk(KERN_ALERT "raid1: %s: unrecoverable I/O"
+ " read error for block %llu\n",
+ bdevname(bio->bi_bdev,b),
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/common/saa7146_video.c linux-2.6.29-rc3.owrt/drivers/media/common/saa7146_video.c
+--- linux-2.6.29.owrt/drivers/media/common/saa7146_video.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/common/saa7146_video.c 2009-05-10 23:48:28.000000000 +0200
+@@ -576,7 +576,6 @@
+ vv->vflip = c->value;
+ break;
+ default: {
+- mutex_unlock(&dev->lock);
+ return -EINVAL;
+ }
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/common/tuners/mxl5007t.c linux-2.6.29-rc3.owrt/drivers/media/common/tuners/mxl5007t.c
+--- linux-2.6.29.owrt/drivers/media/common/tuners/mxl5007t.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/common/tuners/mxl5007t.c 2009-05-10 23:48:28.000000000 +0200
+@@ -657,7 +657,7 @@
+ {
+ struct mxl5007t_state *state = fe->tuner_priv;
+ int rf_locked, ref_locked;
+- s32 rf_input_level = 0;
++ s32 rf_input_level;
+ int ret;
+
+ if (fe->ops.i2c_gate_ctrl)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/common/tuners/tuner-simple.c linux-2.6.29-rc3.owrt/drivers/media/common/tuners/tuner-simple.c
+--- linux-2.6.29.owrt/drivers/media/common/tuners/tuner-simple.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/common/tuners/tuner-simple.c 2009-05-10 23:48:28.000000000 +0200
+@@ -318,6 +318,7 @@
+ u8 *config, u8 *cb)
+ {
+ struct tuner_simple_priv *priv = fe->tuner_priv;
++ u8 tuneraddr;
+ int rc;
+
+ /* tv norm specific stuff for multi-norm tuners */
+@@ -386,7 +387,6 @@
+
+ case TUNER_PHILIPS_TUV1236D:
+ {
+- struct tuner_i2c_props i2c = priv->i2c_props;
+ /* 0x40 -> ATSC antenna input 1 */
+ /* 0x48 -> ATSC antenna input 2 */
+ /* 0x00 -> NTSC antenna input 1 */
+@@ -398,15 +398,17 @@
+ buffer[1] = 0x04;
+ }
+ /* set to the correct mode (analog or digital) */
+- i2c.addr = 0x0a;
+- rc = tuner_i2c_xfer_send(&i2c, &buffer[0], 2);
++ tuneraddr = priv->i2c_props.addr;
++ priv->i2c_props.addr = 0x0a;
++ rc = tuner_i2c_xfer_send(&priv->i2c_props, &buffer[0], 2);
+ if (2 != rc)
+ tuner_warn("i2c i/o error: rc == %d "
+ "(should be 2)\n", rc);
+- rc = tuner_i2c_xfer_send(&i2c, &buffer[2], 2);
++ rc = tuner_i2c_xfer_send(&priv->i2c_props, &buffer[2], 2);
+ if (2 != rc)
+ tuner_warn("i2c i/o error: rc == %d "
+ "(should be 2)\n", rc);
++ priv->i2c_props.addr = tuneraddr;
+ break;
+ }
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/b2c2/flexcop.c linux-2.6.29-rc3.owrt/drivers/media/dvb/b2c2/flexcop.c
+--- linux-2.6.29.owrt/drivers/media/dvb/b2c2/flexcop.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/b2c2/flexcop.c 2009-05-10 23:48:28.000000000 +0200
+@@ -212,7 +212,8 @@
+ v210.sw_reset_210.Block_reset_enable = 0xb2;
+
+ fc->write_ibi_reg(fc,sw_reset_210,v210);
+- udelay(1000);
++ msleep(1);
++
+ fc->write_ibi_reg(fc,ctrl_208,v208_save);
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/b2c2/flexcop-hw-filter.c linux-2.6.29-rc3.owrt/drivers/media/dvb/b2c2/flexcop-hw-filter.c
+--- linux-2.6.29.owrt/drivers/media/dvb/b2c2/flexcop-hw-filter.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/b2c2/flexcop-hw-filter.c 2009-05-10 23:48:28.000000000 +0200
+@@ -192,7 +192,6 @@
+
+ return 0;
+ }
+-EXPORT_SYMBOL(flexcop_pid_feed_control);
+
+ void flexcop_hw_filter_init(struct flexcop_device *fc)
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/b2c2/flexcop-pci.c linux-2.6.29-rc3.owrt/drivers/media/dvb/b2c2/flexcop-pci.c
+--- linux-2.6.29.owrt/drivers/media/dvb/b2c2/flexcop-pci.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/b2c2/flexcop-pci.c 2009-05-10 23:48:28.000000000 +0200
+@@ -13,9 +13,9 @@
+ module_param(enable_pid_filtering, int, 0444);
+ MODULE_PARM_DESC(enable_pid_filtering, "enable hardware pid filtering: supported values: 0 (fullts), 1");
+
+-static int irq_chk_intv = 100;
++static int irq_chk_intv;
+ module_param(irq_chk_intv, int, 0644);
+-MODULE_PARM_DESC(irq_chk_intv, "set the interval for IRQ streaming watchdog.");
++MODULE_PARM_DESC(irq_chk_intv, "set the interval for IRQ watchdog (currently just debugging).");
+
+ #ifdef CONFIG_DVB_B2C2_FLEXCOP_DEBUG
+ #define dprintk(level,args...) \
+@@ -34,9 +34,7 @@
+
+ static int debug;
+ module_param(debug, int, 0644);
+-MODULE_PARM_DESC(debug,
+- "set debug level (1=info,2=regs,4=TS,8=irqdma,16=check (|-able))."
+- DEBSTATUS);
++MODULE_PARM_DESC(debug, "set debug level (1=info,2=regs,4=TS,8=irqdma (|-able))." DEBSTATUS);
+
+ #define DRIVER_VERSION "0.1"
+ #define DRIVER_NAME "Technisat/B2C2 FlexCop II/IIb/III Digital TV PCI Driver"
+@@ -60,8 +58,6 @@
+ int active_dma1_addr; /* 0 = addr0 of dma1; 1 = addr1 of dma1 */
+ u32 last_dma1_cur_pos; /* position of the pointer last time the timer/packet irq occured */
+ int count;
+- int count_prev;
+- int stream_problem;
+
+ spinlock_t irq_lock;
+
+@@ -107,32 +103,18 @@
+ container_of(work, struct flexcop_pci, irq_check_work.work);
+ struct flexcop_device *fc = fc_pci->fc_dev;
+
+- if (fc->feedcount) {
++ flexcop_ibi_value v = fc->read_ibi_reg(fc,sram_dest_reg_714);
+
+- if (fc_pci->count == fc_pci->count_prev) {
+- deb_chk("no IRQ since the last check\n");
+- if (fc_pci->stream_problem++ == 3) {
+- struct dvb_demux_feed *feed;
+-
+- spin_lock_irq(&fc->demux.lock);
+- list_for_each_entry(feed, &fc->demux.feed_list,
+- list_head) {
+- flexcop_pid_feed_control(fc, feed, 0);
+- }
+-
+- list_for_each_entry(feed, &fc->demux.feed_list,
+- list_head) {
+- flexcop_pid_feed_control(fc, feed, 1);
+- }
+- spin_unlock_irq(&fc->demux.lock);
+-
+- fc_pci->stream_problem = 0;
+- }
+- } else {
+- fc_pci->stream_problem = 0;
+- fc_pci->count_prev = fc_pci->count;
+- }
+- }
++ flexcop_dump_reg(fc_pci->fc_dev,dma1_000,4);
++
++ if (v.sram_dest_reg_714.net_ovflow_error)
++ deb_chk("sram net_ovflow_error\n");
++ if (v.sram_dest_reg_714.media_ovflow_error)
++ deb_chk("sram media_ovflow_error\n");
++ if (v.sram_dest_reg_714.cai_ovflow_error)
++ deb_chk("sram cai_ovflow_error\n");
++ if (v.sram_dest_reg_714.cai_ovflow_error)
++ deb_chk("sram cai_ovflow_error\n");
+
+ schedule_delayed_work(&fc_pci->irq_check_work,
+ msecs_to_jiffies(irq_chk_intv < 100 ? 100 : irq_chk_intv));
+@@ -234,12 +216,16 @@
+ flexcop_dma_control_timer_irq(fc,FC_DMA_1,1);
+ deb_irq("IRQ enabled\n");
+
+- fc_pci->count_prev = fc_pci->count;
+-
+ // fc_pci->active_dma1_addr = 0;
+ // flexcop_dma_control_size_irq(fc,FC_DMA_1,1);
+
++ if (irq_chk_intv > 0)
++ schedule_delayed_work(&fc_pci->irq_check_work,
++ msecs_to_jiffies(irq_chk_intv < 100 ? 100 : irq_chk_intv));
+ } else {
++ if (irq_chk_intv > 0)
++ cancel_delayed_work(&fc_pci->irq_check_work);
++
+ flexcop_dma_control_timer_irq(fc,FC_DMA_1,0);
+ deb_irq("IRQ disabled\n");
+
+@@ -313,6 +299,8 @@
+ IRQF_SHARED, DRIVER_NAME, fc_pci)) != 0)
+ goto err_pci_iounmap;
+
++
++
+ fc_pci->init_state |= FC_PCI_INIT;
+ return ret;
+
+@@ -387,10 +375,6 @@
+
+ INIT_DELAYED_WORK(&fc_pci->irq_check_work, flexcop_pci_irq_check_work);
+
+- if (irq_chk_intv > 0)
+- schedule_delayed_work(&fc_pci->irq_check_work,
+- msecs_to_jiffies(irq_chk_intv < 100 ? 100 : irq_chk_intv));
+-
+ return ret;
+
+ err_fc_exit:
+@@ -409,9 +393,6 @@
+ {
+ struct flexcop_pci *fc_pci = pci_get_drvdata(pdev);
+
+- if (irq_chk_intv > 0)
+- cancel_delayed_work(&fc_pci->irq_check_work);
+-
+ flexcop_pci_dma_exit(fc_pci);
+ flexcop_device_exit(fc_pci->fc_dev);
+ flexcop_pci_exit(fc_pci);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/bt8xx/dst.c linux-2.6.29-rc3.owrt/drivers/media/dvb/bt8xx/dst.c
+--- linux-2.6.29.owrt/drivers/media/dvb/bt8xx/dst.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/bt8xx/dst.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1683,7 +1683,7 @@
+
+ static int dst_get_tuning_algo(struct dvb_frontend *fe)
+ {
+- return dst_algo ? DVBFE_ALGO_HW : DVBFE_ALGO_SW;
++ return dst_algo;
+ }
+
+ static int dst_get_frontend(struct dvb_frontend *fe, struct dvb_frontend_parameters *p)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/dvb-core/dmxdev.c linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-core/dmxdev.c
+--- linux-2.6.29.owrt/drivers/media/dvb/dvb-core/dmxdev.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-core/dmxdev.c 2009-05-10 23:48:28.000000000 +0200
+@@ -364,15 +364,16 @@
+ enum dmx_success success)
+ {
+ struct dmxdev_filter *dmxdevfilter = filter->priv;
++ unsigned long flags;
+ int ret;
+
+ if (dmxdevfilter->buffer.error) {
+ wake_up(&dmxdevfilter->buffer.queue);
+ return 0;
+ }
+- spin_lock(&dmxdevfilter->dev->lock);
++ spin_lock_irqsave(&dmxdevfilter->dev->lock, flags);
+ if (dmxdevfilter->state != DMXDEV_STATE_GO) {
+- spin_unlock(&dmxdevfilter->dev->lock);
++ spin_unlock_irqrestore(&dmxdevfilter->dev->lock, flags);
+ return 0;
+ }
+ del_timer(&dmxdevfilter->timer);
+@@ -391,7 +392,7 @@
+ }
+ if (dmxdevfilter->params.sec.flags & DMX_ONESHOT)
+ dmxdevfilter->state = DMXDEV_STATE_DONE;
+- spin_unlock(&dmxdevfilter->dev->lock);
++ spin_unlock_irqrestore(&dmxdevfilter->dev->lock, flags);
+ wake_up(&dmxdevfilter->buffer.queue);
+ return 0;
+ }
+@@ -403,11 +404,12 @@
+ {
+ struct dmxdev_filter *dmxdevfilter = feed->priv;
+ struct dvb_ringbuffer *buffer;
++ unsigned long flags;
+ int ret;
+
+- spin_lock(&dmxdevfilter->dev->lock);
++ spin_lock_irqsave(&dmxdevfilter->dev->lock, flags);
+ if (dmxdevfilter->params.pes.output == DMX_OUT_DECODER) {
+- spin_unlock(&dmxdevfilter->dev->lock);
++ spin_unlock_irqrestore(&dmxdevfilter->dev->lock, flags);
+ return 0;
+ }
+
+@@ -417,7 +419,7 @@
+ else
+ buffer = &dmxdevfilter->dev->dvr_buffer;
+ if (buffer->error) {
+- spin_unlock(&dmxdevfilter->dev->lock);
++ spin_unlock_irqrestore(&dmxdevfilter->dev->lock, flags);
+ wake_up(&buffer->queue);
+ return 0;
+ }
+@@ -428,7 +430,7 @@
+ dvb_ringbuffer_flush(buffer);
+ buffer->error = ret;
+ }
+- spin_unlock(&dmxdevfilter->dev->lock);
++ spin_unlock_irqrestore(&dmxdevfilter->dev->lock, flags);
+ wake_up(&buffer->queue);
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/dvb-core/dvb_ca_en50221.c linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-core/dvb_ca_en50221.c
+--- linux-2.6.29.owrt/drivers/media/dvb/dvb-core/dvb_ca_en50221.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-core/dvb_ca_en50221.c 2009-05-10 23:48:28.000000000 +0200
+@@ -93,9 +93,6 @@
+ /* current state of the CAM */
+ int slot_state;
+
+- /* mutex used for serializing access to one CI slot */
+- struct mutex slot_lock;
+-
+ /* Number of CAMCHANGES that have occurred since last processing */
+ atomic_t camchange_count;
+
+@@ -714,20 +711,14 @@
+ dprintk("%s\n", __func__);
+
+
+- /* sanity check */
++ // sanity check
+ if (bytes_write > ca->slot_info[slot].link_buf_size)
+ return -EINVAL;
+
+- /* it is possible we are dealing with a single buffer implementation,
+- thus if there is data available for read or if there is even a read
+- already in progress, we do nothing but awake the kernel thread to
+- process the data if necessary. */
++ /* check if interface is actually waiting for us to read from it, or if a read is in progress */
+ if ((status = ca->pub->read_cam_control(ca->pub, slot, CTRLIF_STATUS)) < 0)
+ goto exitnowrite;
+ if (status & (STATUSREG_DA | STATUSREG_RE)) {
+- if (status & STATUSREG_DA)
+- dvb_ca_en50221_thread_wakeup(ca);
+-
+ status = -EAGAIN;
+ goto exitnowrite;
+ }
+@@ -996,8 +987,6 @@
+ /* go through all the slots processing them */
+ for (slot = 0; slot < ca->slot_count; slot++) {
+
+- mutex_lock(&ca->slot_info[slot].slot_lock);
+-
+ // check the cam status + deal with CAMCHANGEs
+ while (dvb_ca_en50221_check_camstatus(ca, slot)) {
+ /* clear down an old CI slot if necessary */
+@@ -1133,7 +1122,7 @@
+
+ case DVB_CA_SLOTSTATE_RUNNING:
+ if (!ca->open)
+- break;
++ continue;
+
+ // poll slots for data
+ pktcount = 0;
+@@ -1157,8 +1146,6 @@
+ }
+ break;
+ }
+-
+- mutex_unlock(&ca->slot_info[slot].slot_lock);
+ }
+ }
+
+@@ -1194,7 +1181,6 @@
+ switch (cmd) {
+ case CA_RESET:
+ for (slot = 0; slot < ca->slot_count; slot++) {
+- mutex_lock(&ca->slot_info[slot].slot_lock);
+ if (ca->slot_info[slot].slot_state != DVB_CA_SLOTSTATE_NONE) {
+ dvb_ca_en50221_slot_shutdown(ca, slot);
+ if (ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)
+@@ -1202,7 +1188,6 @@
+ slot,
+ DVB_CA_EN50221_CAMCHANGE_INSERTED);
+ }
+- mutex_unlock(&ca->slot_info[slot].slot_lock);
+ }
+ ca->next_read_slot = 0;
+ dvb_ca_en50221_thread_wakeup(ca);
+@@ -1323,9 +1308,7 @@
+ goto exit;
+ }
+
+- mutex_lock(&ca->slot_info[slot].slot_lock);
+ status = dvb_ca_en50221_write_data(ca, slot, fragbuf, fraglen + 2);
+- mutex_unlock(&ca->slot_info[slot].slot_lock);
+ if (status == (fraglen + 2)) {
+ written = 1;
+ break;
+@@ -1681,7 +1664,6 @@
+ ca->slot_info[i].slot_state = DVB_CA_SLOTSTATE_NONE;
+ atomic_set(&ca->slot_info[i].camchange_count, 0);
+ ca->slot_info[i].camchange_type = DVB_CA_EN50221_CAMCHANGE_REMOVED;
+- mutex_init(&ca->slot_info[i].slot_lock);
+ }
+
+ if (signal_pending(current)) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/dvb-core/dvb_ca_en50221.h linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-core/dvb_ca_en50221.h
+--- linux-2.6.29.owrt/drivers/media/dvb/dvb-core/dvb_ca_en50221.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-core/dvb_ca_en50221.h 2009-05-10 23:48:28.000000000 +0200
+@@ -45,10 +45,8 @@
+ /* the module owning this structure */
+ struct module* owner;
+
+- /* NOTE: the read_*, write_* and poll_slot_status functions will be
+- * called for different slots concurrently and need to use locks where
+- * and if appropriate. There will be no concurrent access to one slot.
+- */
++ /* NOTE: the read_*, write_* and poll_slot_status functions must use locks as
++ * they may be called from several threads at once */
+
+ /* functions for accessing attribute memory on the CAM */
+ int (*read_attribute_mem)(struct dvb_ca_en50221* ca, int slot, int address);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/dvb-core/dvb_demux.c linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-core/dvb_demux.c
+--- linux-2.6.29.owrt/drivers/media/dvb/dvb-core/dvb_demux.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-core/dvb_demux.c 2009-05-10 23:48:28.000000000 +0200
+@@ -399,7 +399,9 @@
+ void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf,
+ size_t count)
+ {
+- spin_lock(&demux->lock);
++ unsigned long flags;
++
++ spin_lock_irqsave(&demux->lock, flags);
+
+ while (count--) {
+ if (buf[0] == 0x47)
+@@ -407,16 +409,17 @@
+ buf += 188;
+ }
+
+- spin_unlock(&demux->lock);
++ spin_unlock_irqrestore(&demux->lock, flags);
+ }
+
+ EXPORT_SYMBOL(dvb_dmx_swfilter_packets);
+
+ void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count)
+ {
++ unsigned long flags;
+ int p = 0, i, j;
+
+- spin_lock(&demux->lock);
++ spin_lock_irqsave(&demux->lock, flags);
+
+ if (demux->tsbufp) {
+ i = demux->tsbufp;
+@@ -449,17 +452,18 @@
+ }
+
+ bailout:
+- spin_unlock(&demux->lock);
++ spin_unlock_irqrestore(&demux->lock, flags);
+ }
+
+ EXPORT_SYMBOL(dvb_dmx_swfilter);
+
+ void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, size_t count)
+ {
++ unsigned long flags;
+ int p = 0, i, j;
+ u8 tmppack[188];
+
+- spin_lock(&demux->lock);
++ spin_lock_irqsave(&demux->lock, flags);
+
+ if (demux->tsbufp) {
+ i = demux->tsbufp;
+@@ -500,7 +504,7 @@
+ }
+
+ bailout:
+- spin_unlock(&demux->lock);
++ spin_unlock_irqrestore(&demux->lock, flags);
+ }
+
+ EXPORT_SYMBOL(dvb_dmx_swfilter_204);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/dvb-core/dvb_frontend.c linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-core/dvb_frontend.c
+--- linux-2.6.29.owrt/drivers/media/dvb/dvb-core/dvb_frontend.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-core/dvb_frontend.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1290,6 +1290,9 @@
+ dprintk("%s() Finalised property cache\n", __func__);
+ dtv_property_cache_submit(fe);
+
++ /* Request the search algorithm to search */
++ fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
++
+ r |= dvb_frontend_ioctl_legacy(inode, file, FE_SET_FRONTEND,
+ &fepriv->parameters);
+ break;
+@@ -1714,10 +1717,6 @@
+ fepriv->min_delay = (dvb_override_tune_delay * HZ) / 1000;
+
+ fepriv->state = FESTATE_RETUNE;
+-
+- /* Request the search algorithm to search */
+- fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
+-
+ dvb_frontend_wakeup(fe);
+ dvb_frontend_add_event(fe, 0);
+ fepriv->status = 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/dvb-usb/af9005-fe.c linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-usb/af9005-fe.c
+--- linux-2.6.29.owrt/drivers/media/dvb/dvb-usb/af9005-fe.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-usb/af9005-fe.c 2009-05-10 23:48:28.000000000 +0200
+@@ -220,7 +220,7 @@
+ u16 * abort_count)
+ {
+ u32 loc_cw_count = 0, loc_err_count;
+- u16 loc_abort_count = 0;
++ u16 loc_abort_count;
+ int ret;
+
+ ret =
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/dvb-usb/af9015.c linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-usb/af9015.c
+--- linux-2.6.29.owrt/drivers/media/dvb/dvb-usb/af9015.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-usb/af9015.c 2009-05-10 23:48:28.000000000 +0200
+@@ -694,12 +694,7 @@
+
+ /* IR remote controller */
+ req.addr = AF9015_EEPROM_IR_MODE;
+- /* first message will timeout often due to possible hw bug */
+- for (i = 0; i < 4; i++) {
+- ret = af9015_rw_udev(udev, &req);
+- if (!ret)
+- break;
+- }
++ ret = af9015_rw_udev(udev, &req);
+ if (ret)
+ goto error;
+ deb_info("%s: IR mode:%d\n", __func__, val);
+@@ -840,19 +835,18 @@
+ if (!dvb_usb_af9015_dual_mode)
+ af9015_config.dual_mode = 0;
+
+- /* Set adapter0 buffer size according to USB port speed, adapter1 buffer
+- size can be static because it is enabled only USB2.0 */
++ /* set buffer size according to USB port speed */
+ for (i = 0; i < af9015_properties_count; i++) {
+ /* USB1.1 set smaller buffersize and disable 2nd adapter */
+ if (udev->speed == USB_SPEED_FULL) {
+- af9015_properties[i].adapter[0].stream.u.bulk.buffersize
+- = TS_USB11_MAX_PACKET_SIZE;
++ af9015_properties[i].adapter->stream.u.bulk.buffersize =
++ TS_USB11_MAX_PACKET_SIZE;
+ /* disable 2nd adapter because we don't have
+ PID-filters */
+ af9015_config.dual_mode = 0;
+ } else {
+- af9015_properties[i].adapter[0].stream.u.bulk.buffersize
+- = TS_USB20_MAX_PACKET_SIZE;
++ af9015_properties[i].adapter->stream.u.bulk.buffersize =
++ TS_USB20_MAX_PACKET_SIZE;
+ }
+ }
+
+@@ -1260,12 +1254,6 @@
+ .type = USB_BULK,
+ .count = 6,
+ .endpoint = 0x85,
+- .u = {
+- .bulk = {
+- .buffersize =
+- TS_USB20_MAX_PACKET_SIZE,
+- }
+- }
+ },
+ }
+ },
+@@ -1365,12 +1353,6 @@
+ .type = USB_BULK,
+ .count = 6,
+ .endpoint = 0x85,
+- .u = {
+- .bulk = {
+- .buffersize =
+- TS_USB20_MAX_PACKET_SIZE,
+- }
+- }
+ },
+ }
+ },
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/dvb-usb/dib0700_devices.c linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-usb/dib0700_devices.c
+--- linux-2.6.29.owrt/drivers/media/dvb/dvb-usb/dib0700_devices.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-usb/dib0700_devices.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1393,9 +1393,6 @@
+ { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000H) },
+ /* 40 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV801E) },
+ { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV801E_SE) },
+- { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_EXPRESS) },
+- { USB_DEVICE(USB_VID_TERRATEC,
+- USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2) },
+ { 0 } /* Terminating entry */
+ };
+ MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
+@@ -1540,8 +1537,7 @@
+ { "DiBcom STK7700D reference design",
+ { &dib0700_usb_id_table[14], NULL },
+ { NULL },
+- },
+-
++ }
+ },
+
+ .rc_interval = DEFAULT_RC_INTERVAL,
+@@ -1561,7 +1557,7 @@
+ },
+ },
+
+- .num_device_descs = 3,
++ .num_device_descs = 2,
+ .devices = {
+ { "ASUS My Cinema U3000 Mini DVBT Tuner",
+ { &dib0700_usb_id_table[23], NULL },
+@@ -1570,10 +1566,6 @@
+ { "Yuan EC372S",
+ { &dib0700_usb_id_table[31], NULL },
+ { NULL },
+- },
+- { "Terratec Cinergy T Express",
+- { &dib0700_usb_id_table[42], NULL },
+- { NULL },
+ }
+ },
+
+@@ -1661,7 +1653,7 @@
+ }
+ },
+
+- .num_device_descs = 5,
++ .num_device_descs = 4,
+ .devices = {
+ { "DiBcom STK7070PD reference design",
+ { &dib0700_usb_id_table[17], NULL },
+@@ -1678,10 +1670,6 @@
+ { "Hauppauge Nova-TD-500 (84xxx)",
+ { &dib0700_usb_id_table[36], NULL },
+ { NULL },
+- },
+- { "Terratec Cinergy DT USB XS Diversity",
+- { &dib0700_usb_id_table[43], NULL },
+- { NULL },
+ }
+ }
+ }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/dvb-usb/dvb-usb-ids.h linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
+--- linux-2.6.29.owrt/drivers/media/dvb/dvb-usb/dvb-usb-ids.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/dvb-usb/dvb-usb-ids.h 2009-05-10 23:48:28.000000000 +0200
+@@ -162,10 +162,8 @@
+ #define USB_PID_AVERMEDIA_A309 0xa309
+ #define USB_PID_TECHNOTREND_CONNECT_S2400 0x3006
+ #define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY 0x005a
+-#define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2 0x0081
+ #define USB_PID_TERRATEC_CINERGY_HT_USB_XE 0x0058
+ #define USB_PID_TERRATEC_CINERGY_HT_EXPRESS 0x0060
+-#define USB_PID_TERRATEC_CINERGY_T_EXPRESS 0x0062
+ #define USB_PID_TERRATEC_CINERGY_T_XXS 0x0078
+ #define USB_PID_PINNACLE_EXPRESSCARD_320CX 0x022e
+ #define USB_PID_PINNACLE_PCTV2000E 0x022c
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-1394.c linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-1394.c
+--- linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-1394.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-1394.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,285 +0,0 @@
+-/*
+- * FireDTV driver (formerly known as FireSAT)
+- *
+- * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
+- * Copyright (C) 2007-2008 Ben Backx <ben@bbackx.com>
+- * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
+- *
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU General Public License as
+- * published by the Free Software Foundation; either version 2 of
+- * the License, or (at your option) any later version.
+- */
+-
+-#include <linux/device.h>
+-#include <linux/errno.h>
+-#include <linux/kernel.h>
+-#include <linux/list.h>
+-#include <linux/spinlock.h>
+-#include <linux/types.h>
+-
+-#include <dma.h>
+-#include <csr1212.h>
+-#include <highlevel.h>
+-#include <hosts.h>
+-#include <ieee1394.h>
+-#include <iso.h>
+-#include <nodemgr.h>
+-
+-#include "firedtv.h"
+-
+-static LIST_HEAD(node_list);
+-static DEFINE_SPINLOCK(node_list_lock);
+-
+-#define FIREWIRE_HEADER_SIZE 4
+-#define CIP_HEADER_SIZE 8
+-
+-static void rawiso_activity_cb(struct hpsb_iso *iso)
+-{
+- struct firedtv *f, *fdtv = NULL;
+- unsigned int i, num, packet;
+- unsigned char *buf;
+- unsigned long flags;
+- int count;
+-
+- spin_lock_irqsave(&node_list_lock, flags);
+- list_for_each_entry(f, &node_list, list)
+- if (f->backend_data == iso) {
+- fdtv = f;
+- break;
+- }
+- spin_unlock_irqrestore(&node_list_lock, flags);
+-
+- packet = iso->first_packet;
+- num = hpsb_iso_n_ready(iso);
+-
+- if (!fdtv) {
+- dev_err(fdtv->device, "received at unknown iso channel\n");
+- goto out;
+- }
+-
+- for (i = 0; i < num; i++, packet = (packet + 1) % iso->buf_packets) {
+- buf = dma_region_i(&iso->data_buf, unsigned char,
+- iso->infos[packet].offset + CIP_HEADER_SIZE);
+- count = (iso->infos[packet].len - CIP_HEADER_SIZE) /
+- (188 + FIREWIRE_HEADER_SIZE);
+-
+- /* ignore empty packet */
+- if (iso->infos[packet].len <= CIP_HEADER_SIZE)
+- continue;
+-
+- while (count--) {
+- if (buf[FIREWIRE_HEADER_SIZE] == 0x47)
+- dvb_dmx_swfilter_packets(&fdtv->demux,
+- &buf[FIREWIRE_HEADER_SIZE], 1);
+- else
+- dev_err(fdtv->device,
+- "skipping invalid packet\n");
+- buf += 188 + FIREWIRE_HEADER_SIZE;
+- }
+- }
+-out:
+- hpsb_iso_recv_release_packets(iso, num);
+-}
+-
+-static inline struct node_entry *node_of(struct firedtv *fdtv)
+-{
+- return container_of(fdtv->device, struct unit_directory, device)->ne;
+-}
+-
+-static int node_lock(struct firedtv *fdtv, u64 addr, void *data, __be32 arg)
+-{
+- return hpsb_node_lock(node_of(fdtv), addr, EXTCODE_COMPARE_SWAP, data,
+- (__force quadlet_t)arg);
+-}
+-
+-static int node_read(struct firedtv *fdtv, u64 addr, void *data, size_t len)
+-{
+- return hpsb_node_read(node_of(fdtv), addr, data, len);
+-}
+-
+-static int node_write(struct firedtv *fdtv, u64 addr, void *data, size_t len)
+-{
+- return hpsb_node_write(node_of(fdtv), addr, data, len);
+-}
+-
+-#define FDTV_ISO_BUFFER_PACKETS 256
+-#define FDTV_ISO_BUFFER_SIZE (FDTV_ISO_BUFFER_PACKETS * 200)
+-
+-static int start_iso(struct firedtv *fdtv)
+-{
+- struct hpsb_iso *iso_handle;
+- int ret;
+-
+- iso_handle = hpsb_iso_recv_init(node_of(fdtv)->host,
+- FDTV_ISO_BUFFER_SIZE, FDTV_ISO_BUFFER_PACKETS,
+- fdtv->isochannel, HPSB_ISO_DMA_DEFAULT,
+- -1, /* stat.config.irq_interval */
+- rawiso_activity_cb);
+- if (iso_handle == NULL) {
+- dev_err(fdtv->device, "cannot initialize iso receive\n");
+- return -ENOMEM;
+- }
+- fdtv->backend_data = iso_handle;
+-
+- ret = hpsb_iso_recv_start(iso_handle, -1, -1, 0);
+- if (ret != 0) {
+- dev_err(fdtv->device, "cannot start iso receive\n");
+- hpsb_iso_shutdown(iso_handle);
+- fdtv->backend_data = NULL;
+- }
+- return ret;
+-}
+-
+-static void stop_iso(struct firedtv *fdtv)
+-{
+- struct hpsb_iso *iso_handle = fdtv->backend_data;
+-
+- if (iso_handle != NULL) {
+- hpsb_iso_stop(iso_handle);
+- hpsb_iso_shutdown(iso_handle);
+- }
+- fdtv->backend_data = NULL;
+-}
+-
+-static const struct firedtv_backend fdtv_1394_backend = {
+- .lock = node_lock,
+- .read = node_read,
+- .write = node_write,
+- .start_iso = start_iso,
+- .stop_iso = stop_iso,
+-};
+-
+-static void fcp_request(struct hpsb_host *host, int nodeid, int direction,
+- int cts, u8 *data, size_t length)
+-{
+- struct firedtv *f, *fdtv = NULL;
+- unsigned long flags;
+- int su;
+-
+- if (length == 0 || (data[0] & 0xf0) != 0)
+- return;
+-
+- su = data[1] & 0x7;
+-
+- spin_lock_irqsave(&node_list_lock, flags);
+- list_for_each_entry(f, &node_list, list)
+- if (node_of(f)->host == host &&
+- node_of(f)->nodeid == nodeid &&
+- (f->subunit == su || (f->subunit == 0 && su == 0x7))) {
+- fdtv = f;
+- break;
+- }
+- spin_unlock_irqrestore(&node_list_lock, flags);
+-
+- if (fdtv)
+- avc_recv(fdtv, data, length);
+-}
+-
+-static int node_probe(struct device *dev)
+-{
+- struct unit_directory *ud =
+- container_of(dev, struct unit_directory, device);
+- struct firedtv *fdtv;
+- int kv_len, err;
+- void *kv_str;
+-
+- kv_len = (ud->model_name_kv->value.leaf.len - 2) * sizeof(quadlet_t);
+- kv_str = CSR1212_TEXTUAL_DESCRIPTOR_LEAF_DATA(ud->model_name_kv);
+-
+- fdtv = fdtv_alloc(dev, &fdtv_1394_backend, kv_str, kv_len);
+- if (!fdtv)
+- return -ENOMEM;
+-
+- /*
+- * Work around a bug in udev's path_id script: Use the fw-host's dev
+- * instead of the unit directory's dev as parent of the input device.
+- */
+- err = fdtv_register_rc(fdtv, dev->parent->parent);
+- if (err)
+- goto fail_free;
+-
+- spin_lock_irq(&node_list_lock);
+- list_add_tail(&fdtv->list, &node_list);
+- spin_unlock_irq(&node_list_lock);
+-
+- err = avc_identify_subunit(fdtv);
+- if (err)
+- goto fail;
+-
+- err = fdtv_dvb_register(fdtv);
+- if (err)
+- goto fail;
+-
+- avc_register_remote_control(fdtv);
+- return 0;
+-fail:
+- spin_lock_irq(&node_list_lock);
+- list_del(&fdtv->list);
+- spin_unlock_irq(&node_list_lock);
+- fdtv_unregister_rc(fdtv);
+-fail_free:
+- kfree(fdtv);
+- return err;
+-}
+-
+-static int node_remove(struct device *dev)
+-{
+- struct firedtv *fdtv = dev->driver_data;
+-
+- fdtv_dvb_unregister(fdtv);
+-
+- spin_lock_irq(&node_list_lock);
+- list_del(&fdtv->list);
+- spin_unlock_irq(&node_list_lock);
+-
+- cancel_work_sync(&fdtv->remote_ctrl_work);
+- fdtv_unregister_rc(fdtv);
+-
+- kfree(fdtv);
+- return 0;
+-}
+-
+-static int node_update(struct unit_directory *ud)
+-{
+- struct firedtv *fdtv = ud->device.driver_data;
+-
+- if (fdtv->isochannel >= 0)
+- cmp_establish_pp_connection(fdtv, fdtv->subunit,
+- fdtv->isochannel);
+- return 0;
+-}
+-
+-static struct hpsb_protocol_driver fdtv_driver = {
+- .name = "firedtv",
+- .update = node_update,
+- .driver = {
+- .probe = node_probe,
+- .remove = node_remove,
+- },
+-};
+-
+-static struct hpsb_highlevel fdtv_highlevel = {
+- .name = "firedtv",
+- .fcp_request = fcp_request,
+-};
+-
+-int __init fdtv_1394_init(struct ieee1394_device_id id_table[])
+-{
+- int ret;
+-
+- hpsb_register_highlevel(&fdtv_highlevel);
+- fdtv_driver.id_table = id_table;
+- ret = hpsb_register_protocol(&fdtv_driver);
+- if (ret) {
+- printk(KERN_ERR "firedtv: failed to register protocol\n");
+- hpsb_unregister_highlevel(&fdtv_highlevel);
+- }
+- return ret;
+-}
+-
+-void __exit fdtv_1394_exit(void)
+-{
+- hpsb_unregister_protocol(&fdtv_driver);
+- hpsb_unregister_highlevel(&fdtv_highlevel);
+-}
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-avc.c linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-avc.c
+--- linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-avc.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-avc.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,1315 +0,0 @@
+-/*
+- * FireDTV driver (formerly known as FireSAT)
+- *
+- * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
+- * Copyright (C) 2008 Ben Backx <ben@bbackx.com>
+- * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
+- *
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU General Public License as
+- * published by the Free Software Foundation; either version 2 of
+- * the License, or (at your option) any later version.
+- */
+-
+-#include <linux/bug.h>
+-#include <linux/crc32.h>
+-#include <linux/delay.h>
+-#include <linux/device.h>
+-#include <linux/jiffies.h>
+-#include <linux/kernel.h>
+-#include <linux/moduleparam.h>
+-#include <linux/mutex.h>
+-#include <linux/string.h>
+-#include <linux/stringify.h>
+-#include <linux/wait.h>
+-#include <linux/workqueue.h>
+-
+-#include "firedtv.h"
+-
+-#define FCP_COMMAND_REGISTER 0xfffff0000b00ULL
+-
+-#define AVC_CTYPE_CONTROL 0x0
+-#define AVC_CTYPE_STATUS 0x1
+-#define AVC_CTYPE_NOTIFY 0x3
+-
+-#define AVC_RESPONSE_ACCEPTED 0x9
+-#define AVC_RESPONSE_STABLE 0xc
+-#define AVC_RESPONSE_CHANGED 0xd
+-#define AVC_RESPONSE_INTERIM 0xf
+-
+-#define AVC_SUBUNIT_TYPE_TUNER (0x05 << 3)
+-#define AVC_SUBUNIT_TYPE_UNIT (0x1f << 3)
+-
+-#define AVC_OPCODE_VENDOR 0x00
+-#define AVC_OPCODE_READ_DESCRIPTOR 0x09
+-#define AVC_OPCODE_DSIT 0xc8
+-#define AVC_OPCODE_DSD 0xcb
+-
+-#define DESCRIPTOR_TUNER_STATUS 0x80
+-#define DESCRIPTOR_SUBUNIT_IDENTIFIER 0x00
+-
+-#define SFE_VENDOR_DE_COMPANYID_0 0x00 /* OUI of Digital Everywhere */
+-#define SFE_VENDOR_DE_COMPANYID_1 0x12
+-#define SFE_VENDOR_DE_COMPANYID_2 0x87
+-
+-#define SFE_VENDOR_OPCODE_REGISTER_REMOTE_CONTROL 0x0a
+-#define SFE_VENDOR_OPCODE_LNB_CONTROL 0x52
+-#define SFE_VENDOR_OPCODE_TUNE_QPSK 0x58 /* for DVB-S */
+-
+-#define SFE_VENDOR_OPCODE_GET_FIRMWARE_VERSION 0x00
+-#define SFE_VENDOR_OPCODE_HOST2CA 0x56
+-#define SFE_VENDOR_OPCODE_CA2HOST 0x57
+-#define SFE_VENDOR_OPCODE_CISTATUS 0x59
+-#define SFE_VENDOR_OPCODE_TUNE_QPSK2 0x60 /* for DVB-S2 */
+-
+-#define SFE_VENDOR_TAG_CA_RESET 0x00
+-#define SFE_VENDOR_TAG_CA_APPLICATION_INFO 0x01
+-#define SFE_VENDOR_TAG_CA_PMT 0x02
+-#define SFE_VENDOR_TAG_CA_DATE_TIME 0x04
+-#define SFE_VENDOR_TAG_CA_MMI 0x05
+-#define SFE_VENDOR_TAG_CA_ENTER_MENU 0x07
+-
+-#define EN50221_LIST_MANAGEMENT_ONLY 0x03
+-#define EN50221_TAG_APP_INFO 0x9f8021
+-#define EN50221_TAG_CA_INFO 0x9f8031
+-
+-struct avc_command_frame {
+- int length;
+- u8 ctype;
+- u8 subunit;
+- u8 opcode;
+- u8 operand[509];
+-};
+-
+-struct avc_response_frame {
+- int length;
+- u8 response;
+- u8 subunit;
+- u8 opcode;
+- u8 operand[509];
+-};
+-
+-#define AVC_DEBUG_FCP_SUBACTIONS 1
+-#define AVC_DEBUG_FCP_PAYLOADS 2
+-
+-static int avc_debug;
+-module_param_named(debug, avc_debug, int, 0644);
+-MODULE_PARM_DESC(debug, "Verbose logging (default = 0"
+- ", FCP subactions = " __stringify(AVC_DEBUG_FCP_SUBACTIONS)
+- ", FCP payloads = " __stringify(AVC_DEBUG_FCP_PAYLOADS)
+- ", or all = -1)");
+-
+-static const char *debug_fcp_ctype(unsigned int ctype)
+-{
+- static const char *ctypes[] = {
+- [0x0] = "CONTROL", [0x1] = "STATUS",
+- [0x2] = "SPECIFIC INQUIRY", [0x3] = "NOTIFY",
+- [0x4] = "GENERAL INQUIRY", [0x8] = "NOT IMPLEMENTED",
+- [0x9] = "ACCEPTED", [0xa] = "REJECTED",
+- [0xb] = "IN TRANSITION", [0xc] = "IMPLEMENTED/STABLE",
+- [0xd] = "CHANGED", [0xf] = "INTERIM",
+- };
+- const char *ret = ctype < ARRAY_SIZE(ctypes) ? ctypes[ctype] : NULL;
+-
+- return ret ? ret : "?";
+-}
+-
+-static const char *debug_fcp_opcode(unsigned int opcode,
+- const u8 *data, size_t length)
+-{
+- switch (opcode) {
+- case AVC_OPCODE_VENDOR: break;
+- case AVC_OPCODE_READ_DESCRIPTOR: return "ReadDescriptor";
+- case AVC_OPCODE_DSIT: return "DirectSelectInfo.Type";
+- case AVC_OPCODE_DSD: return "DirectSelectData";
+- default: return "?";
+- }
+-
+- if (length < 7 ||
+- data[3] != SFE_VENDOR_DE_COMPANYID_0 ||
+- data[4] != SFE_VENDOR_DE_COMPANYID_1 ||
+- data[5] != SFE_VENDOR_DE_COMPANYID_2)
+- return "Vendor";
+-
+- switch (data[6]) {
+- case SFE_VENDOR_OPCODE_REGISTER_REMOTE_CONTROL: return "RegisterRC";
+- case SFE_VENDOR_OPCODE_LNB_CONTROL: return "LNBControl";
+- case SFE_VENDOR_OPCODE_TUNE_QPSK: return "TuneQPSK";
+- case SFE_VENDOR_OPCODE_HOST2CA: return "Host2CA";
+- case SFE_VENDOR_OPCODE_CA2HOST: return "CA2Host";
+- }
+- return "Vendor";
+-}
+-
+-static void debug_fcp(const u8 *data, size_t length)
+-{
+- unsigned int subunit_type, subunit_id, op;
+- const char *prefix = data[0] > 7 ? "FCP <- " : "FCP -> ";
+-
+- if (avc_debug & AVC_DEBUG_FCP_SUBACTIONS) {
+- subunit_type = data[1] >> 3;
+- subunit_id = data[1] & 7;
+- op = subunit_type == 0x1e || subunit_id == 5 ? ~0 : data[2];
+- printk(KERN_INFO "%ssu=%x.%x l=%d: %-8s - %s\n",
+- prefix, subunit_type, subunit_id, length,
+- debug_fcp_ctype(data[0]),
+- debug_fcp_opcode(op, data, length));
+- }
+-
+- if (avc_debug & AVC_DEBUG_FCP_PAYLOADS)
+- print_hex_dump(KERN_INFO, prefix, DUMP_PREFIX_NONE, 16, 1,
+- data, length, false);
+-}
+-
+-static int __avc_write(struct firedtv *fdtv,
+- const struct avc_command_frame *c, struct avc_response_frame *r)
+-{
+- int err, retry;
+-
+- if (r)
+- fdtv->avc_reply_received = false;
+-
+- for (retry = 0; retry < 6; retry++) {
+- if (unlikely(avc_debug))
+- debug_fcp(&c->ctype, c->length);
+-
+- err = fdtv->backend->write(fdtv, FCP_COMMAND_REGISTER,
+- (void *)&c->ctype, c->length);
+- if (err) {
+- fdtv->avc_reply_received = true;
+- dev_err(fdtv->device, "FCP command write failed\n");
+- return err;
+- }
+-
+- if (!r)
+- return 0;
+-
+- /*
+- * AV/C specs say that answers should be sent within 150 ms.
+- * Time out after 200 ms.
+- */
+- if (wait_event_timeout(fdtv->avc_wait,
+- fdtv->avc_reply_received,
+- msecs_to_jiffies(200)) != 0) {
+- r->length = fdtv->response_length;
+- memcpy(&r->response, fdtv->response, r->length);
+-
+- return 0;
+- }
+- }
+- dev_err(fdtv->device, "FCP response timed out\n");
+- return -ETIMEDOUT;
+-}
+-
+-static int avc_write(struct firedtv *fdtv,
+- const struct avc_command_frame *c, struct avc_response_frame *r)
+-{
+- int ret;
+-
+- if (mutex_lock_interruptible(&fdtv->avc_mutex))
+- return -EINTR;
+-
+- ret = __avc_write(fdtv, c, r);
+-
+- mutex_unlock(&fdtv->avc_mutex);
+- return ret;
+-}
+-
+-int avc_recv(struct firedtv *fdtv, void *data, size_t length)
+-{
+- struct avc_response_frame *r =
+- data - offsetof(struct avc_response_frame, response);
+-
+- if (unlikely(avc_debug))
+- debug_fcp(data, length);
+-
+- if (length >= 8 &&
+- r->operand[0] == SFE_VENDOR_DE_COMPANYID_0 &&
+- r->operand[1] == SFE_VENDOR_DE_COMPANYID_1 &&
+- r->operand[2] == SFE_VENDOR_DE_COMPANYID_2 &&
+- r->operand[3] == SFE_VENDOR_OPCODE_REGISTER_REMOTE_CONTROL) {
+- if (r->response == AVC_RESPONSE_CHANGED) {
+- fdtv_handle_rc(fdtv,
+- r->operand[4] << 8 | r->operand[5]);
+- schedule_work(&fdtv->remote_ctrl_work);
+- } else if (r->response != AVC_RESPONSE_INTERIM) {
+- dev_info(fdtv->device,
+- "remote control result = %d\n", r->response);
+- }
+- return 0;
+- }
+-
+- if (fdtv->avc_reply_received) {
+- dev_err(fdtv->device, "out-of-order AVC response, ignored\n");
+- return -EIO;
+- }
+-
+- memcpy(fdtv->response, data, length);
+- fdtv->response_length = length;
+-
+- fdtv->avc_reply_received = true;
+- wake_up(&fdtv->avc_wait);
+-
+- return 0;
+-}
+-
+-/*
+- * tuning command for setting the relative LNB frequency
+- * (not supported by the AVC standard)
+- */
+-static void avc_tuner_tuneqpsk(struct firedtv *fdtv,
+- struct dvb_frontend_parameters *params,
+- struct avc_command_frame *c)
+-{
+- c->opcode = AVC_OPCODE_VENDOR;
+-
+- c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
+- c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
+- c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
+- c->operand[3] = SFE_VENDOR_OPCODE_TUNE_QPSK;
+-
+- c->operand[4] = (params->frequency >> 24) & 0xff;
+- c->operand[5] = (params->frequency >> 16) & 0xff;
+- c->operand[6] = (params->frequency >> 8) & 0xff;
+- c->operand[7] = params->frequency & 0xff;
+-
+- c->operand[8] = ((params->u.qpsk.symbol_rate / 1000) >> 8) & 0xff;
+- c->operand[9] = (params->u.qpsk.symbol_rate / 1000) & 0xff;
+-
+- switch (params->u.qpsk.fec_inner) {
+- case FEC_1_2: c->operand[10] = 0x1; break;
+- case FEC_2_3: c->operand[10] = 0x2; break;
+- case FEC_3_4: c->operand[10] = 0x3; break;
+- case FEC_5_6: c->operand[10] = 0x4; break;
+- case FEC_7_8: c->operand[10] = 0x5; break;
+- case FEC_4_5:
+- case FEC_8_9:
+- case FEC_AUTO:
+- default: c->operand[10] = 0x0;
+- }
+-
+- if (fdtv->voltage == 0xff)
+- c->operand[11] = 0xff;
+- else if (fdtv->voltage == SEC_VOLTAGE_18) /* polarisation */
+- c->operand[11] = 0;
+- else
+- c->operand[11] = 1;
+-
+- if (fdtv->tone == 0xff)
+- c->operand[12] = 0xff;
+- else if (fdtv->tone == SEC_TONE_ON) /* band */
+- c->operand[12] = 1;
+- else
+- c->operand[12] = 0;
+-
+- if (fdtv->type == FIREDTV_DVB_S2) {
+- c->operand[13] = 0x1;
+- c->operand[14] = 0xff;
+- c->operand[15] = 0xff;
+- c->length = 20;
+- } else {
+- c->length = 16;
+- }
+-}
+-
+-static void avc_tuner_dsd_dvb_c(struct dvb_frontend_parameters *params,
+- struct avc_command_frame *c)
+-{
+- c->opcode = AVC_OPCODE_DSD;
+-
+- c->operand[0] = 0; /* source plug */
+- c->operand[1] = 0xd2; /* subfunction replace */
+- c->operand[2] = 0x20; /* system id = DVB */
+- c->operand[3] = 0x00; /* antenna number */
+- c->operand[4] = 0x11; /* system_specific_multiplex selection_length */
+-
+- /* multiplex_valid_flags, high byte */
+- c->operand[5] = 0 << 7 /* reserved */
+- | 0 << 6 /* Polarisation */
+- | 0 << 5 /* Orbital_Pos */
+- | 1 << 4 /* Frequency */
+- | 1 << 3 /* Symbol_Rate */
+- | 0 << 2 /* FEC_outer */
+- | (params->u.qam.fec_inner != FEC_AUTO ? 1 << 1 : 0)
+- | (params->u.qam.modulation != QAM_AUTO ? 1 << 0 : 0);
+-
+- /* multiplex_valid_flags, low byte */
+- c->operand[6] = 0 << 7 /* NetworkID */
+- | 0 << 0 /* reserved */ ;
+-
+- c->operand[7] = 0x00;
+- c->operand[8] = 0x00;
+- c->operand[9] = 0x00;
+- c->operand[10] = 0x00;
+-
+- c->operand[11] = (((params->frequency / 4000) >> 16) & 0xff) | (2 << 6);
+- c->operand[12] = ((params->frequency / 4000) >> 8) & 0xff;
+- c->operand[13] = (params->frequency / 4000) & 0xff;
+- c->operand[14] = ((params->u.qpsk.symbol_rate / 1000) >> 12) & 0xff;
+- c->operand[15] = ((params->u.qpsk.symbol_rate / 1000) >> 4) & 0xff;
+- c->operand[16] = ((params->u.qpsk.symbol_rate / 1000) << 4) & 0xf0;
+- c->operand[17] = 0x00;
+-
+- switch (params->u.qpsk.fec_inner) {
+- case FEC_1_2: c->operand[18] = 0x1; break;
+- case FEC_2_3: c->operand[18] = 0x2; break;
+- case FEC_3_4: c->operand[18] = 0x3; break;
+- case FEC_5_6: c->operand[18] = 0x4; break;
+- case FEC_7_8: c->operand[18] = 0x5; break;
+- case FEC_8_9: c->operand[18] = 0x6; break;
+- case FEC_4_5: c->operand[18] = 0x8; break;
+- case FEC_AUTO:
+- default: c->operand[18] = 0x0;
+- }
+-
+- switch (params->u.qam.modulation) {
+- case QAM_16: c->operand[19] = 0x08; break;
+- case QAM_32: c->operand[19] = 0x10; break;
+- case QAM_64: c->operand[19] = 0x18; break;
+- case QAM_128: c->operand[19] = 0x20; break;
+- case QAM_256: c->operand[19] = 0x28; break;
+- case QAM_AUTO:
+- default: c->operand[19] = 0x00;
+- }
+-
+- c->operand[20] = 0x00;
+- c->operand[21] = 0x00;
+- /* Nr_of_dsd_sel_specs = 0 -> no PIDs are transmitted */
+- c->operand[22] = 0x00;
+-
+- c->length = 28;
+-}
+-
+-static void avc_tuner_dsd_dvb_t(struct dvb_frontend_parameters *params,
+- struct avc_command_frame *c)
+-{
+- struct dvb_ofdm_parameters *ofdm = &params->u.ofdm;
+-
+- c->opcode = AVC_OPCODE_DSD;
+-
+- c->operand[0] = 0; /* source plug */
+- c->operand[1] = 0xd2; /* subfunction replace */
+- c->operand[2] = 0x20; /* system id = DVB */
+- c->operand[3] = 0x00; /* antenna number */
+- c->operand[4] = 0x0c; /* system_specific_multiplex selection_length */
+-
+- /* multiplex_valid_flags, high byte */
+- c->operand[5] =
+- 0 << 7 /* reserved */
+- | 1 << 6 /* CenterFrequency */
+- | (ofdm->bandwidth != BANDWIDTH_AUTO ? 1 << 5 : 0)
+- | (ofdm->constellation != QAM_AUTO ? 1 << 4 : 0)
+- | (ofdm->hierarchy_information != HIERARCHY_AUTO ? 1 << 3 : 0)
+- | (ofdm->code_rate_HP != FEC_AUTO ? 1 << 2 : 0)
+- | (ofdm->code_rate_LP != FEC_AUTO ? 1 << 1 : 0)
+- | (ofdm->guard_interval != GUARD_INTERVAL_AUTO ? 1 << 0 : 0);
+-
+- /* multiplex_valid_flags, low byte */
+- c->operand[6] =
+- 0 << 7 /* NetworkID */
+- | (ofdm->transmission_mode != TRANSMISSION_MODE_AUTO ? 1 << 6 : 0)
+- | 0 << 5 /* OtherFrequencyFlag */
+- | 0 << 0 /* reserved */ ;
+-
+- c->operand[7] = 0x0;
+- c->operand[8] = (params->frequency / 10) >> 24;
+- c->operand[9] = ((params->frequency / 10) >> 16) & 0xff;
+- c->operand[10] = ((params->frequency / 10) >> 8) & 0xff;
+- c->operand[11] = (params->frequency / 10) & 0xff;
+-
+- switch (ofdm->bandwidth) {
+- case BANDWIDTH_7_MHZ: c->operand[12] = 0x20; break;
+- case BANDWIDTH_8_MHZ:
+- case BANDWIDTH_6_MHZ: /* not defined by AVC spec */
+- case BANDWIDTH_AUTO:
+- default: c->operand[12] = 0x00;
+- }
+-
+- switch (ofdm->constellation) {
+- case QAM_16: c->operand[13] = 1 << 6; break;
+- case QAM_64: c->operand[13] = 2 << 6; break;
+- case QPSK:
+- default: c->operand[13] = 0x00;
+- }
+-
+- switch (ofdm->hierarchy_information) {
+- case HIERARCHY_1: c->operand[13] |= 1 << 3; break;
+- case HIERARCHY_2: c->operand[13] |= 2 << 3; break;
+- case HIERARCHY_4: c->operand[13] |= 3 << 3; break;
+- case HIERARCHY_AUTO:
+- case HIERARCHY_NONE:
+- default: break;
+- }
+-
+- switch (ofdm->code_rate_HP) {
+- case FEC_2_3: c->operand[13] |= 1; break;
+- case FEC_3_4: c->operand[13] |= 2; break;
+- case FEC_5_6: c->operand[13] |= 3; break;
+- case FEC_7_8: c->operand[13] |= 4; break;
+- case FEC_1_2:
+- default: break;
+- }
+-
+- switch (ofdm->code_rate_LP) {
+- case FEC_2_3: c->operand[14] = 1 << 5; break;
+- case FEC_3_4: c->operand[14] = 2 << 5; break;
+- case FEC_5_6: c->operand[14] = 3 << 5; break;
+- case FEC_7_8: c->operand[14] = 4 << 5; break;
+- case FEC_1_2:
+- default: c->operand[14] = 0x00; break;
+- }
+-
+- switch (ofdm->guard_interval) {
+- case GUARD_INTERVAL_1_16: c->operand[14] |= 1 << 3; break;
+- case GUARD_INTERVAL_1_8: c->operand[14] |= 2 << 3; break;
+- case GUARD_INTERVAL_1_4: c->operand[14] |= 3 << 3; break;
+- case GUARD_INTERVAL_1_32:
+- case GUARD_INTERVAL_AUTO:
+- default: break;
+- }
+-
+- switch (ofdm->transmission_mode) {
+- case TRANSMISSION_MODE_8K: c->operand[14] |= 1 << 1; break;
+- case TRANSMISSION_MODE_2K:
+- case TRANSMISSION_MODE_AUTO:
+- default: break;
+- }
+-
+- c->operand[15] = 0x00; /* network_ID[0] */
+- c->operand[16] = 0x00; /* network_ID[1] */
+- /* Nr_of_dsd_sel_specs = 0 -> no PIDs are transmitted */
+- c->operand[17] = 0x00;
+-
+- c->length = 24;
+-}
+-
+-int avc_tuner_dsd(struct firedtv *fdtv,
+- struct dvb_frontend_parameters *params)
+-{
+- char buffer[sizeof(struct avc_command_frame)];
+- struct avc_command_frame *c = (void *)buffer;
+- struct avc_response_frame *r = (void *)buffer; /* FIXME: unused */
+-
+- memset(c, 0, sizeof(*c));
+-
+- c->ctype = AVC_CTYPE_CONTROL;
+- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
+-
+- switch (fdtv->type) {
+- case FIREDTV_DVB_S:
+- case FIREDTV_DVB_S2: avc_tuner_tuneqpsk(fdtv, params, c); break;
+- case FIREDTV_DVB_C: avc_tuner_dsd_dvb_c(params, c); break;
+- case FIREDTV_DVB_T: avc_tuner_dsd_dvb_t(params, c); break;
+- default:
+- BUG();
+- }
+-
+- if (avc_write(fdtv, c, r) < 0)
+- return -EIO;
+-
+- msleep(500);
+-#if 0
+- /* FIXME: */
+- /* u8 *status was an out-parameter of avc_tuner_dsd, unused by caller */
+- if (status)
+- *status = r->operand[2];
+-#endif
+- return 0;
+-}
+-
+-int avc_tuner_set_pids(struct firedtv *fdtv, unsigned char pidc, u16 pid[])
+-{
+- char buffer[sizeof(struct avc_command_frame)];
+- struct avc_command_frame *c = (void *)buffer;
+- struct avc_response_frame *r = (void *)buffer; /* FIXME: unused */
+- int pos, k;
+-
+- if (pidc > 16 && pidc != 0xff)
+- return -EINVAL;
+-
+- memset(c, 0, sizeof(*c));
+-
+- c->ctype = AVC_CTYPE_CONTROL;
+- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
+- c->opcode = AVC_OPCODE_DSD;
+-
+- c->operand[0] = 0; /* source plug */
+- c->operand[1] = 0xd2; /* subfunction replace */
+- c->operand[2] = 0x20; /* system id = DVB */
+- c->operand[3] = 0x00; /* antenna number */
+- c->operand[4] = 0x00; /* system_specific_multiplex selection_length */
+- c->operand[5] = pidc; /* Nr_of_dsd_sel_specs */
+-
+- pos = 6;
+- if (pidc != 0xff)
+- for (k = 0; k < pidc; k++) {
+- c->operand[pos++] = 0x13; /* flowfunction relay */
+- c->operand[pos++] = 0x80; /* dsd_sel_spec_valid_flags -> PID */
+- c->operand[pos++] = (pid[k] >> 8) & 0x1f;
+- c->operand[pos++] = pid[k] & 0xff;
+- c->operand[pos++] = 0x00; /* tableID */
+- c->operand[pos++] = 0x00; /* filter_length */
+- }
+-
+- c->length = ALIGN(3 + pos, 4);
+-
+- if (avc_write(fdtv, c, r) < 0)
+- return -EIO;
+-
+- msleep(50);
+- return 0;
+-}
+-
+-int avc_tuner_get_ts(struct firedtv *fdtv)
+-{
+- char buffer[sizeof(struct avc_command_frame)];
+- struct avc_command_frame *c = (void *)buffer;
+- struct avc_response_frame *r = (void *)buffer; /* FIXME: unused */
+- int sl;
+-
+- memset(c, 0, sizeof(*c));
+-
+- c->ctype = AVC_CTYPE_CONTROL;
+- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
+- c->opcode = AVC_OPCODE_DSIT;
+-
+- sl = fdtv->type == FIREDTV_DVB_T ? 0x0c : 0x11;
+-
+- c->operand[0] = 0; /* source plug */
+- c->operand[1] = 0xd2; /* subfunction replace */
+- c->operand[2] = 0xff; /* status */
+- c->operand[3] = 0x20; /* system id = DVB */
+- c->operand[4] = 0x00; /* antenna number */
+- c->operand[5] = 0x0; /* system_specific_search_flags */
+- c->operand[6] = sl; /* system_specific_multiplex selection_length */
+- c->operand[7] = 0x00; /* valid_flags [0] */
+- c->operand[8] = 0x00; /* valid_flags [1] */
+- c->operand[7 + sl] = 0x00; /* nr_of_dsit_sel_specs (always 0) */
+-
+- c->length = fdtv->type == FIREDTV_DVB_T ? 24 : 28;
+-
+- if (avc_write(fdtv, c, r) < 0)
+- return -EIO;
+-
+- msleep(250);
+- return 0;
+-}
+-
+-int avc_identify_subunit(struct firedtv *fdtv)
+-{
+- char buffer[sizeof(struct avc_command_frame)];
+- struct avc_command_frame *c = (void *)buffer;
+- struct avc_response_frame *r = (void *)buffer;
+-
+- memset(c, 0, sizeof(*c));
+-
+- c->ctype = AVC_CTYPE_CONTROL;
+- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
+- c->opcode = AVC_OPCODE_READ_DESCRIPTOR;
+-
+- c->operand[0] = DESCRIPTOR_SUBUNIT_IDENTIFIER;
+- c->operand[1] = 0xff;
+- c->operand[2] = 0x00;
+- c->operand[3] = 0x00; /* length highbyte */
+- c->operand[4] = 0x08; /* length lowbyte */
+- c->operand[5] = 0x00; /* offset highbyte */
+- c->operand[6] = 0x0d; /* offset lowbyte */
+-
+- c->length = 12;
+-
+- if (avc_write(fdtv, c, r) < 0)
+- return -EIO;
+-
+- if ((r->response != AVC_RESPONSE_STABLE &&
+- r->response != AVC_RESPONSE_ACCEPTED) ||
+- (r->operand[3] << 8) + r->operand[4] != 8) {
+- dev_err(fdtv->device, "cannot read subunit identifier\n");
+- return -EINVAL;
+- }
+- return 0;
+-}
+-
+-#define SIZEOF_ANTENNA_INPUT_INFO 22
+-
+-int avc_tuner_status(struct firedtv *fdtv, struct firedtv_tuner_status *stat)
+-{
+- char buffer[sizeof(struct avc_command_frame)];
+- struct avc_command_frame *c = (void *)buffer;
+- struct avc_response_frame *r = (void *)buffer;
+- int length;
+-
+- memset(c, 0, sizeof(*c));
+-
+- c->ctype = AVC_CTYPE_CONTROL;
+- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
+- c->opcode = AVC_OPCODE_READ_DESCRIPTOR;
+-
+- c->operand[0] = DESCRIPTOR_TUNER_STATUS;
+- c->operand[1] = 0xff; /* read_result_status */
+- c->operand[2] = 0x00; /* reserved */
+- c->operand[3] = 0; /* SIZEOF_ANTENNA_INPUT_INFO >> 8; */
+- c->operand[4] = 0; /* SIZEOF_ANTENNA_INPUT_INFO & 0xff; */
+- c->operand[5] = 0x00;
+- c->operand[6] = 0x00;
+-
+- c->length = 12;
+-
+- if (avc_write(fdtv, c, r) < 0)
+- return -EIO;
+-
+- if (r->response != AVC_RESPONSE_STABLE &&
+- r->response != AVC_RESPONSE_ACCEPTED) {
+- dev_err(fdtv->device, "cannot read tuner status\n");
+- return -EINVAL;
+- }
+-
+- length = r->operand[9];
+- if (r->operand[1] != 0x10 || length != SIZEOF_ANTENNA_INPUT_INFO) {
+- dev_err(fdtv->device, "got invalid tuner status\n");
+- return -EINVAL;
+- }
+-
+- stat->active_system = r->operand[10];
+- stat->searching = r->operand[11] >> 7 & 1;
+- stat->moving = r->operand[11] >> 6 & 1;
+- stat->no_rf = r->operand[11] >> 5 & 1;
+- stat->input = r->operand[12] >> 7 & 1;
+- stat->selected_antenna = r->operand[12] & 0x7f;
+- stat->ber = r->operand[13] << 24 |
+- r->operand[14] << 16 |
+- r->operand[15] << 8 |
+- r->operand[16];
+- stat->signal_strength = r->operand[17];
+- stat->raster_frequency = r->operand[18] >> 6 & 2;
+- stat->rf_frequency = (r->operand[18] & 0x3f) << 16 |
+- r->operand[19] << 8 |
+- r->operand[20];
+- stat->man_dep_info_length = r->operand[21];
+- stat->front_end_error = r->operand[22] >> 4 & 1;
+- stat->antenna_error = r->operand[22] >> 3 & 1;
+- stat->front_end_power_status = r->operand[22] >> 1 & 1;
+- stat->power_supply = r->operand[22] & 1;
+- stat->carrier_noise_ratio = r->operand[23] << 8 |
+- r->operand[24];
+- stat->power_supply_voltage = r->operand[27];
+- stat->antenna_voltage = r->operand[28];
+- stat->firewire_bus_voltage = r->operand[29];
+- stat->ca_mmi = r->operand[30] & 1;
+- stat->ca_pmt_reply = r->operand[31] >> 7 & 1;
+- stat->ca_date_time_request = r->operand[31] >> 6 & 1;
+- stat->ca_application_info = r->operand[31] >> 5 & 1;
+- stat->ca_module_present_status = r->operand[31] >> 4 & 1;
+- stat->ca_dvb_flag = r->operand[31] >> 3 & 1;
+- stat->ca_error_flag = r->operand[31] >> 2 & 1;
+- stat->ca_initialization_status = r->operand[31] >> 1 & 1;
+-
+- return 0;
+-}
+-
+-int avc_lnb_control(struct firedtv *fdtv, char voltage, char burst,
+- char conttone, char nrdiseq,
+- struct dvb_diseqc_master_cmd *diseqcmd)
+-{
+- char buffer[sizeof(struct avc_command_frame)];
+- struct avc_command_frame *c = (void *)buffer;
+- struct avc_response_frame *r = (void *)buffer;
+- int i, j, k;
+-
+- memset(c, 0, sizeof(*c));
+-
+- c->ctype = AVC_CTYPE_CONTROL;
+- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
+- c->opcode = AVC_OPCODE_VENDOR;
+-
+- c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
+- c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
+- c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
+- c->operand[3] = SFE_VENDOR_OPCODE_LNB_CONTROL;
+-
+- c->operand[4] = voltage;
+- c->operand[5] = nrdiseq;
+-
+- i = 6;
+-
+- for (j = 0; j < nrdiseq; j++) {
+- c->operand[i++] = diseqcmd[j].msg_len;
+-
+- for (k = 0; k < diseqcmd[j].msg_len; k++)
+- c->operand[i++] = diseqcmd[j].msg[k];
+- }
+-
+- c->operand[i++] = burst;
+- c->operand[i++] = conttone;
+-
+- c->length = ALIGN(3 + i, 4);
+-
+- if (avc_write(fdtv, c, r) < 0)
+- return -EIO;
+-
+- if (r->response != AVC_RESPONSE_ACCEPTED) {
+- dev_err(fdtv->device, "LNB control failed\n");
+- return -EINVAL;
+- }
+-
+- return 0;
+-}
+-
+-int avc_register_remote_control(struct firedtv *fdtv)
+-{
+- char buffer[sizeof(struct avc_command_frame)];
+- struct avc_command_frame *c = (void *)buffer;
+-
+- memset(c, 0, sizeof(*c));
+-
+- c->ctype = AVC_CTYPE_NOTIFY;
+- c->subunit = AVC_SUBUNIT_TYPE_UNIT | 7;
+- c->opcode = AVC_OPCODE_VENDOR;
+-
+- c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
+- c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
+- c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
+- c->operand[3] = SFE_VENDOR_OPCODE_REGISTER_REMOTE_CONTROL;
+-
+- c->length = 8;
+-
+- return avc_write(fdtv, c, NULL);
+-}
+-
+-void avc_remote_ctrl_work(struct work_struct *work)
+-{
+- struct firedtv *fdtv =
+- container_of(work, struct firedtv, remote_ctrl_work);
+-
+- /* Should it be rescheduled in failure cases? */
+- avc_register_remote_control(fdtv);
+-}
+-
+-#if 0 /* FIXME: unused */
+-int avc_tuner_host2ca(struct firedtv *fdtv)
+-{
+- char buffer[sizeof(struct avc_command_frame)];
+- struct avc_command_frame *c = (void *)buffer;
+- struct avc_response_frame *r = (void *)buffer; /* FIXME: unused */
+-
+- memset(c, 0, sizeof(*c));
+-
+- c->ctype = AVC_CTYPE_CONTROL;
+- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
+- c->opcode = AVC_OPCODE_VENDOR;
+-
+- c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
+- c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
+- c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
+- c->operand[3] = SFE_VENDOR_OPCODE_HOST2CA;
+- c->operand[4] = 0; /* slot */
+- c->operand[5] = SFE_VENDOR_TAG_CA_APPLICATION_INFO; /* ca tag */
+- c->operand[6] = 0; /* more/last */
+- c->operand[7] = 0; /* length */
+-
+- c->length = 12;
+-
+- if (avc_write(fdtv, c, r) < 0)
+- return -EIO;
+-
+- return 0;
+-}
+-#endif
+-
+-static int get_ca_object_pos(struct avc_response_frame *r)
+-{
+- int length = 1;
+-
+- /* Check length of length field */
+- if (r->operand[7] & 0x80)
+- length = (r->operand[7] & 0x7f) + 1;
+- return length + 7;
+-}
+-
+-static int get_ca_object_length(struct avc_response_frame *r)
+-{
+-#if 0 /* FIXME: unused */
+- int size = 0;
+- int i;
+-
+- if (r->operand[7] & 0x80)
+- for (i = 0; i < (r->operand[7] & 0x7f); i++) {
+- size <<= 8;
+- size += r->operand[8 + i];
+- }
+-#endif
+- return r->operand[7];
+-}
+-
+-int avc_ca_app_info(struct firedtv *fdtv, char *app_info, unsigned int *len)
+-{
+- char buffer[sizeof(struct avc_command_frame)];
+- struct avc_command_frame *c = (void *)buffer;
+- struct avc_response_frame *r = (void *)buffer;
+- int pos;
+-
+- memset(c, 0, sizeof(*c));
+-
+- c->ctype = AVC_CTYPE_STATUS;
+- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
+- c->opcode = AVC_OPCODE_VENDOR;
+-
+- c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
+- c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
+- c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
+- c->operand[3] = SFE_VENDOR_OPCODE_CA2HOST;
+- c->operand[4] = 0; /* slot */
+- c->operand[5] = SFE_VENDOR_TAG_CA_APPLICATION_INFO; /* ca tag */
+-
+- c->length = 12;
+-
+- if (avc_write(fdtv, c, r) < 0)
+- return -EIO;
+-
+- /* FIXME: check response code and validate response data */
+-
+- pos = get_ca_object_pos(r);
+- app_info[0] = (EN50221_TAG_APP_INFO >> 16) & 0xff;
+- app_info[1] = (EN50221_TAG_APP_INFO >> 8) & 0xff;
+- app_info[2] = (EN50221_TAG_APP_INFO >> 0) & 0xff;
+- app_info[3] = 6 + r->operand[pos + 4];
+- app_info[4] = 0x01;
+- memcpy(&app_info[5], &r->operand[pos], 5 + r->operand[pos + 4]);
+- *len = app_info[3] + 4;
+-
+- return 0;
+-}
+-
+-int avc_ca_info(struct firedtv *fdtv, char *app_info, unsigned int *len)
+-{
+- char buffer[sizeof(struct avc_command_frame)];
+- struct avc_command_frame *c = (void *)buffer;
+- struct avc_response_frame *r = (void *)buffer;
+- int pos;
+-
+- memset(c, 0, sizeof(*c));
+-
+- c->ctype = AVC_CTYPE_STATUS;
+- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
+- c->opcode = AVC_OPCODE_VENDOR;
+-
+- c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
+- c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
+- c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
+- c->operand[3] = SFE_VENDOR_OPCODE_CA2HOST;
+- c->operand[4] = 0; /* slot */
+- c->operand[5] = SFE_VENDOR_TAG_CA_APPLICATION_INFO; /* ca tag */
+-
+- c->length = 12;
+-
+- if (avc_write(fdtv, c, r) < 0)
+- return -EIO;
+-
+- pos = get_ca_object_pos(r);
+- app_info[0] = (EN50221_TAG_CA_INFO >> 16) & 0xff;
+- app_info[1] = (EN50221_TAG_CA_INFO >> 8) & 0xff;
+- app_info[2] = (EN50221_TAG_CA_INFO >> 0) & 0xff;
+- app_info[3] = 2;
+- app_info[4] = r->operand[pos + 0];
+- app_info[5] = r->operand[pos + 1];
+- *len = app_info[3] + 4;
+-
+- return 0;
+-}
+-
+-int avc_ca_reset(struct firedtv *fdtv)
+-{
+- char buffer[sizeof(struct avc_command_frame)];
+- struct avc_command_frame *c = (void *)buffer;
+- struct avc_response_frame *r = (void *)buffer; /* FIXME: unused */
+-
+- memset(c, 0, sizeof(*c));
+-
+- c->ctype = AVC_CTYPE_CONTROL;
+- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
+- c->opcode = AVC_OPCODE_VENDOR;
+-
+- c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
+- c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
+- c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
+- c->operand[3] = SFE_VENDOR_OPCODE_HOST2CA;
+- c->operand[4] = 0; /* slot */
+- c->operand[5] = SFE_VENDOR_TAG_CA_RESET; /* ca tag */
+- c->operand[6] = 0; /* more/last */
+- c->operand[7] = 1; /* length */
+- c->operand[8] = 0; /* force hardware reset */
+-
+- c->length = 12;
+-
+- if (avc_write(fdtv, c, r) < 0)
+- return -EIO;
+-
+- return 0;
+-}
+-
+-int avc_ca_pmt(struct firedtv *fdtv, char *msg, int length)
+-{
+- char buffer[sizeof(struct avc_command_frame)];
+- struct avc_command_frame *c = (void *)buffer;
+- struct avc_response_frame *r = (void *)buffer;
+- int list_management;
+- int program_info_length;
+- int pmt_cmd_id;
+- int read_pos;
+- int write_pos;
+- int es_info_length;
+- int crc32_csum;
+-
+- memset(c, 0, sizeof(*c));
+-
+- c->ctype = AVC_CTYPE_CONTROL;
+- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
+- c->opcode = AVC_OPCODE_VENDOR;
+-
+- if (msg[0] != EN50221_LIST_MANAGEMENT_ONLY) {
+- dev_info(fdtv->device, "forcing list_management to ONLY\n");
+- msg[0] = EN50221_LIST_MANAGEMENT_ONLY;
+- }
+- /* We take the cmd_id from the programme level only! */
+- list_management = msg[0];
+- program_info_length = ((msg[4] & 0x0f) << 8) + msg[5];
+- if (program_info_length > 0)
+- program_info_length--; /* Remove pmt_cmd_id */
+- pmt_cmd_id = msg[6];
+-
+- c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
+- c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
+- c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
+- c->operand[3] = SFE_VENDOR_OPCODE_HOST2CA;
+- c->operand[4] = 0; /* slot */
+- c->operand[5] = SFE_VENDOR_TAG_CA_PMT; /* ca tag */
+- c->operand[6] = 0; /* more/last */
+- /* c->operand[7] = XXXprogram_info_length + 17; */ /* length */
+- c->operand[8] = list_management;
+- c->operand[9] = 0x01; /* pmt_cmd=OK_descramble */
+-
+- /* TS program map table */
+-
+- c->operand[10] = 0x02; /* Table id=2 */
+- c->operand[11] = 0x80; /* Section syntax + length */
+- /* c->operand[12] = XXXprogram_info_length + 12; */
+- c->operand[13] = msg[1]; /* Program number */
+- c->operand[14] = msg[2];
+- c->operand[15] = 0x01; /* Version number=0 + current/next=1 */
+- c->operand[16] = 0x00; /* Section number=0 */
+- c->operand[17] = 0x00; /* Last section number=0 */
+- c->operand[18] = 0x1f; /* PCR_PID=1FFF */
+- c->operand[19] = 0xff;
+- c->operand[20] = (program_info_length >> 8); /* Program info length */
+- c->operand[21] = (program_info_length & 0xff);
+-
+- /* CA descriptors at programme level */
+- read_pos = 6;
+- write_pos = 22;
+- if (program_info_length > 0) {
+- pmt_cmd_id = msg[read_pos++];
+- if (pmt_cmd_id != 1 && pmt_cmd_id != 4)
+- dev_err(fdtv->device,
+- "invalid pmt_cmd_id %d\n", pmt_cmd_id);
+-
+- memcpy(&c->operand[write_pos], &msg[read_pos],
+- program_info_length);
+- read_pos += program_info_length;
+- write_pos += program_info_length;
+- }
+- while (read_pos < length) {
+- c->operand[write_pos++] = msg[read_pos++];
+- c->operand[write_pos++] = msg[read_pos++];
+- c->operand[write_pos++] = msg[read_pos++];
+- es_info_length =
+- ((msg[read_pos] & 0x0f) << 8) + msg[read_pos + 1];
+- read_pos += 2;
+- if (es_info_length > 0)
+- es_info_length--; /* Remove pmt_cmd_id */
+- c->operand[write_pos++] = es_info_length >> 8;
+- c->operand[write_pos++] = es_info_length & 0xff;
+- if (es_info_length > 0) {
+- pmt_cmd_id = msg[read_pos++];
+- if (pmt_cmd_id != 1 && pmt_cmd_id != 4)
+- dev_err(fdtv->device, "invalid pmt_cmd_id %d "
+- "at stream level\n", pmt_cmd_id);
+-
+- memcpy(&c->operand[write_pos], &msg[read_pos],
+- es_info_length);
+- read_pos += es_info_length;
+- write_pos += es_info_length;
+- }
+- }
+-
+- /* CRC */
+- c->operand[write_pos++] = 0x00;
+- c->operand[write_pos++] = 0x00;
+- c->operand[write_pos++] = 0x00;
+- c->operand[write_pos++] = 0x00;
+-
+- c->operand[7] = write_pos - 8;
+- c->operand[12] = write_pos - 13;
+-
+- crc32_csum = crc32_be(0, &c->operand[10], c->operand[12] - 1);
+- c->operand[write_pos - 4] = (crc32_csum >> 24) & 0xff;
+- c->operand[write_pos - 3] = (crc32_csum >> 16) & 0xff;
+- c->operand[write_pos - 2] = (crc32_csum >> 8) & 0xff;
+- c->operand[write_pos - 1] = (crc32_csum >> 0) & 0xff;
+-
+- c->length = ALIGN(3 + write_pos, 4);
+-
+- if (avc_write(fdtv, c, r) < 0)
+- return -EIO;
+-
+- if (r->response != AVC_RESPONSE_ACCEPTED) {
+- dev_err(fdtv->device,
+- "CA PMT failed with response 0x%x\n", r->response);
+- return -EFAULT;
+- }
+-
+- return 0;
+-}
+-
+-int avc_ca_get_time_date(struct firedtv *fdtv, int *interval)
+-{
+- char buffer[sizeof(struct avc_command_frame)];
+- struct avc_command_frame *c = (void *)buffer;
+- struct avc_response_frame *r = (void *)buffer;
+-
+- memset(c, 0, sizeof(*c));
+-
+- c->ctype = AVC_CTYPE_STATUS;
+- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
+- c->opcode = AVC_OPCODE_VENDOR;
+-
+- c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
+- c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
+- c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
+- c->operand[3] = SFE_VENDOR_OPCODE_CA2HOST;
+- c->operand[4] = 0; /* slot */
+- c->operand[5] = SFE_VENDOR_TAG_CA_DATE_TIME; /* ca tag */
+- c->operand[6] = 0; /* more/last */
+- c->operand[7] = 0; /* length */
+-
+- c->length = 12;
+-
+- if (avc_write(fdtv, c, r) < 0)
+- return -EIO;
+-
+- /* FIXME: check response code and validate response data */
+-
+- *interval = r->operand[get_ca_object_pos(r)];
+-
+- return 0;
+-}
+-
+-int avc_ca_enter_menu(struct firedtv *fdtv)
+-{
+- char buffer[sizeof(struct avc_command_frame)];
+- struct avc_command_frame *c = (void *)buffer;
+- struct avc_response_frame *r = (void *)buffer; /* FIXME: unused */
+-
+- memset(c, 0, sizeof(*c));
+-
+- c->ctype = AVC_CTYPE_STATUS;
+- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
+- c->opcode = AVC_OPCODE_VENDOR;
+-
+- c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
+- c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
+- c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
+- c->operand[3] = SFE_VENDOR_OPCODE_HOST2CA;
+- c->operand[4] = 0; /* slot */
+- c->operand[5] = SFE_VENDOR_TAG_CA_ENTER_MENU;
+- c->operand[6] = 0; /* more/last */
+- c->operand[7] = 0; /* length */
+-
+- c->length = 12;
+-
+- if (avc_write(fdtv, c, r) < 0)
+- return -EIO;
+-
+- return 0;
+-}
+-
+-int avc_ca_get_mmi(struct firedtv *fdtv, char *mmi_object, unsigned int *len)
+-{
+- char buffer[sizeof(struct avc_command_frame)];
+- struct avc_command_frame *c = (void *)buffer;
+- struct avc_response_frame *r = (void *)buffer;
+-
+- memset(c, 0, sizeof(*c));
+-
+- c->ctype = AVC_CTYPE_STATUS;
+- c->subunit = AVC_SUBUNIT_TYPE_TUNER | fdtv->subunit;
+- c->opcode = AVC_OPCODE_VENDOR;
+-
+- c->operand[0] = SFE_VENDOR_DE_COMPANYID_0;
+- c->operand[1] = SFE_VENDOR_DE_COMPANYID_1;
+- c->operand[2] = SFE_VENDOR_DE_COMPANYID_2;
+- c->operand[3] = SFE_VENDOR_OPCODE_CA2HOST;
+- c->operand[4] = 0; /* slot */
+- c->operand[5] = SFE_VENDOR_TAG_CA_MMI;
+- c->operand[6] = 0; /* more/last */
+- c->operand[7] = 0; /* length */
+-
+- c->length = 12;
+-
+- if (avc_write(fdtv, c, r) < 0)
+- return -EIO;
+-
+- /* FIXME: check response code and validate response data */
+-
+- *len = get_ca_object_length(r);
+- memcpy(mmi_object, &r->operand[get_ca_object_pos(r)], *len);
+-
+- return 0;
+-}
+-
+-#define CMP_OUTPUT_PLUG_CONTROL_REG_0 0xfffff0000904ULL
+-
+-static int cmp_read(struct firedtv *fdtv, void *buf, u64 addr, size_t len)
+-{
+- int ret;
+-
+- if (mutex_lock_interruptible(&fdtv->avc_mutex))
+- return -EINTR;
+-
+- ret = fdtv->backend->read(fdtv, addr, buf, len);
+- if (ret < 0)
+- dev_err(fdtv->device, "CMP: read I/O error\n");
+-
+- mutex_unlock(&fdtv->avc_mutex);
+- return ret;
+-}
+-
+-static int cmp_lock(struct firedtv *fdtv, void *data, u64 addr, __be32 arg)
+-{
+- int ret;
+-
+- if (mutex_lock_interruptible(&fdtv->avc_mutex))
+- return -EINTR;
+-
+- ret = fdtv->backend->lock(fdtv, addr, data, arg);
+- if (ret < 0)
+- dev_err(fdtv->device, "CMP: lock I/O error\n");
+-
+- mutex_unlock(&fdtv->avc_mutex);
+- return ret;
+-}
+-
+-static inline u32 get_opcr(__be32 opcr, u32 mask, u32 shift)
+-{
+- return (be32_to_cpu(opcr) >> shift) & mask;
+-}
+-
+-static inline void set_opcr(__be32 *opcr, u32 value, u32 mask, u32 shift)
+-{
+- *opcr &= ~cpu_to_be32(mask << shift);
+- *opcr |= cpu_to_be32((value & mask) << shift);
+-}
+-
+-#define get_opcr_online(v) get_opcr((v), 0x1, 31)
+-#define get_opcr_p2p_connections(v) get_opcr((v), 0x3f, 24)
+-#define get_opcr_channel(v) get_opcr((v), 0x3f, 16)
+-
+-#define set_opcr_p2p_connections(p, v) set_opcr((p), (v), 0x3f, 24)
+-#define set_opcr_channel(p, v) set_opcr((p), (v), 0x3f, 16)
+-#define set_opcr_data_rate(p, v) set_opcr((p), (v), 0x3, 14)
+-#define set_opcr_overhead_id(p, v) set_opcr((p), (v), 0xf, 10)
+-
+-int cmp_establish_pp_connection(struct firedtv *fdtv, int plug, int channel)
+-{
+- __be32 old_opcr, opcr;
+- u64 opcr_address = CMP_OUTPUT_PLUG_CONTROL_REG_0 + (plug << 2);
+- int attempts = 0;
+- int ret;
+-
+- ret = cmp_read(fdtv, &opcr, opcr_address, 4);
+- if (ret < 0)
+- return ret;
+-
+-repeat:
+- if (!get_opcr_online(opcr)) {
+- dev_err(fdtv->device, "CMP: output offline\n");
+- return -EBUSY;
+- }
+-
+- old_opcr = opcr;
+-
+- if (get_opcr_p2p_connections(opcr)) {
+- if (get_opcr_channel(opcr) != channel) {
+- dev_err(fdtv->device, "CMP: cannot change channel\n");
+- return -EBUSY;
+- }
+- dev_info(fdtv->device, "CMP: overlaying connection\n");
+-
+- /* We don't allocate isochronous resources. */
+- } else {
+- set_opcr_channel(&opcr, channel);
+- set_opcr_data_rate(&opcr, 2); /* S400 */
+-
+- /* FIXME: this is for the worst case - optimize */
+- set_opcr_overhead_id(&opcr, 0);
+-
+- /*
+- * FIXME: allocate isochronous channel and bandwidth at IRM
+- * fdtv->backend->alloc_resources(fdtv, channels_mask, bw);
+- */
+- }
+-
+- set_opcr_p2p_connections(&opcr, get_opcr_p2p_connections(opcr) + 1);
+-
+- ret = cmp_lock(fdtv, &opcr, opcr_address, old_opcr);
+- if (ret < 0)
+- return ret;
+-
+- if (old_opcr != opcr) {
+- /*
+- * FIXME: if old_opcr.P2P_Connections > 0,
+- * deallocate isochronous channel and bandwidth at IRM
+- * if (...)
+- * fdtv->backend->dealloc_resources(fdtv, channel, bw);
+- */
+-
+- if (++attempts < 6) /* arbitrary limit */
+- goto repeat;
+- return -EBUSY;
+- }
+-
+- return 0;
+-}
+-
+-void cmp_break_pp_connection(struct firedtv *fdtv, int plug, int channel)
+-{
+- __be32 old_opcr, opcr;
+- u64 opcr_address = CMP_OUTPUT_PLUG_CONTROL_REG_0 + (plug << 2);
+- int attempts = 0;
+-
+- if (cmp_read(fdtv, &opcr, opcr_address, 4) < 0)
+- return;
+-
+-repeat:
+- if (!get_opcr_online(opcr) || !get_opcr_p2p_connections(opcr) ||
+- get_opcr_channel(opcr) != channel) {
+- dev_err(fdtv->device, "CMP: no connection to break\n");
+- return;
+- }
+-
+- old_opcr = opcr;
+- set_opcr_p2p_connections(&opcr, get_opcr_p2p_connections(opcr) - 1);
+-
+- if (cmp_lock(fdtv, &opcr, opcr_address, old_opcr) < 0)
+- return;
+-
+- if (old_opcr != opcr) {
+- /*
+- * FIXME: if old_opcr.P2P_Connections == 1, i.e. we were last
+- * owner, deallocate isochronous channel and bandwidth at IRM
+- * if (...)
+- * fdtv->backend->dealloc_resources(fdtv, channel, bw);
+- */
+-
+- if (++attempts < 6) /* arbitrary limit */
+- goto repeat;
+- }
+-}
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-ci.c linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-ci.c
+--- linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-ci.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-ci.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,260 +0,0 @@
+-/*
+- * FireDTV driver (formerly known as FireSAT)
+- *
+- * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
+- * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
+- *
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU General Public License as
+- * published by the Free Software Foundation; either version 2 of
+- * the License, or (at your option) any later version.
+- */
+-
+-#include <linux/device.h>
+-#include <linux/dvb/ca.h>
+-#include <linux/fs.h>
+-#include <linux/module.h>
+-
+-#include <dvbdev.h>
+-
+-#include "firedtv.h"
+-
+-#define EN50221_TAG_APP_INFO_ENQUIRY 0x9f8020
+-#define EN50221_TAG_CA_INFO_ENQUIRY 0x9f8030
+-#define EN50221_TAG_CA_PMT 0x9f8032
+-#define EN50221_TAG_ENTER_MENU 0x9f8022
+-
+-static int fdtv_ca_ready(struct firedtv_tuner_status *stat)
+-{
+- return stat->ca_initialization_status == 1 &&
+- stat->ca_error_flag == 0 &&
+- stat->ca_dvb_flag == 1 &&
+- stat->ca_module_present_status == 1;
+-}
+-
+-static int fdtv_get_ca_flags(struct firedtv_tuner_status *stat)
+-{
+- int flags = 0;
+-
+- if (stat->ca_module_present_status == 1)
+- flags |= CA_CI_MODULE_PRESENT;
+- if (stat->ca_initialization_status == 1 &&
+- stat->ca_error_flag == 0 &&
+- stat->ca_dvb_flag == 1)
+- flags |= CA_CI_MODULE_READY;
+- return flags;
+-}
+-
+-static int fdtv_ca_reset(struct firedtv *fdtv)
+-{
+- return avc_ca_reset(fdtv) ? -EFAULT : 0;
+-}
+-
+-static int fdtv_ca_get_caps(void *arg)
+-{
+- struct ca_caps *cap = arg;
+-
+- cap->slot_num = 1;
+- cap->slot_type = CA_CI;
+- cap->descr_num = 1;
+- cap->descr_type = CA_ECD;
+- return 0;
+-}
+-
+-static int fdtv_ca_get_slot_info(struct firedtv *fdtv, void *arg)
+-{
+- struct firedtv_tuner_status stat;
+- struct ca_slot_info *slot = arg;
+-
+- if (avc_tuner_status(fdtv, &stat))
+- return -EFAULT;
+-
+- if (slot->num != 0)
+- return -EFAULT;
+-
+- slot->type = CA_CI;
+- slot->flags = fdtv_get_ca_flags(&stat);
+- return 0;
+-}
+-
+-static int fdtv_ca_app_info(struct firedtv *fdtv, void *arg)
+-{
+- struct ca_msg *reply = arg;
+-
+- return avc_ca_app_info(fdtv, reply->msg, &reply->length) ? -EFAULT : 0;
+-}
+-
+-static int fdtv_ca_info(struct firedtv *fdtv, void *arg)
+-{
+- struct ca_msg *reply = arg;
+-
+- return avc_ca_info(fdtv, reply->msg, &reply->length) ? -EFAULT : 0;
+-}
+-
+-static int fdtv_ca_get_mmi(struct firedtv *fdtv, void *arg)
+-{
+- struct ca_msg *reply = arg;
+-
+- return avc_ca_get_mmi(fdtv, reply->msg, &reply->length) ? -EFAULT : 0;
+-}
+-
+-static int fdtv_ca_get_msg(struct firedtv *fdtv, void *arg)
+-{
+- struct firedtv_tuner_status stat;
+- int err;
+-
+- switch (fdtv->ca_last_command) {
+- case EN50221_TAG_APP_INFO_ENQUIRY:
+- err = fdtv_ca_app_info(fdtv, arg);
+- break;
+- case EN50221_TAG_CA_INFO_ENQUIRY:
+- err = fdtv_ca_info(fdtv, arg);
+- break;
+- default:
+- if (avc_tuner_status(fdtv, &stat))
+- err = -EFAULT;
+- else if (stat.ca_mmi == 1)
+- err = fdtv_ca_get_mmi(fdtv, arg);
+- else {
+- dev_info(fdtv->device, "unhandled CA message 0x%08x\n",
+- fdtv->ca_last_command);
+- err = -EFAULT;
+- }
+- }
+- fdtv->ca_last_command = 0;
+- return err;
+-}
+-
+-static int fdtv_ca_pmt(struct firedtv *fdtv, void *arg)
+-{
+- struct ca_msg *msg = arg;
+- int data_pos;
+- int data_length;
+- int i;
+-
+- data_pos = 4;
+- if (msg->msg[3] & 0x80) {
+- data_length = 0;
+- for (i = 0; i < (msg->msg[3] & 0x7f); i++)
+- data_length = (data_length << 8) + msg->msg[data_pos++];
+- } else {
+- data_length = msg->msg[3];
+- }
+-
+- return avc_ca_pmt(fdtv, &msg->msg[data_pos], data_length) ? -EFAULT : 0;
+-}
+-
+-static int fdtv_ca_send_msg(struct firedtv *fdtv, void *arg)
+-{
+- struct ca_msg *msg = arg;
+- int err;
+-
+- /* Do we need a semaphore for this? */
+- fdtv->ca_last_command =
+- (msg->msg[0] << 16) + (msg->msg[1] << 8) + msg->msg[2];
+- switch (fdtv->ca_last_command) {
+- case EN50221_TAG_CA_PMT:
+- err = fdtv_ca_pmt(fdtv, arg);
+- break;
+- case EN50221_TAG_APP_INFO_ENQUIRY:
+- /* handled in ca_get_msg */
+- err = 0;
+- break;
+- case EN50221_TAG_CA_INFO_ENQUIRY:
+- /* handled in ca_get_msg */
+- err = 0;
+- break;
+- case EN50221_TAG_ENTER_MENU:
+- err = avc_ca_enter_menu(fdtv);
+- break;
+- default:
+- dev_err(fdtv->device, "unhandled CA message 0x%08x\n",
+- fdtv->ca_last_command);
+- err = -EFAULT;
+- }
+- return err;
+-}
+-
+-static int fdtv_ca_ioctl(struct inode *inode, struct file *file,
+- unsigned int cmd, void *arg)
+-{
+- struct dvb_device *dvbdev = file->private_data;
+- struct firedtv *fdtv = dvbdev->priv;
+- struct firedtv_tuner_status stat;
+- int err;
+-
+- switch (cmd) {
+- case CA_RESET:
+- err = fdtv_ca_reset(fdtv);
+- break;
+- case CA_GET_CAP:
+- err = fdtv_ca_get_caps(arg);
+- break;
+- case CA_GET_SLOT_INFO:
+- err = fdtv_ca_get_slot_info(fdtv, arg);
+- break;
+- case CA_GET_MSG:
+- err = fdtv_ca_get_msg(fdtv, arg);
+- break;
+- case CA_SEND_MSG:
+- err = fdtv_ca_send_msg(fdtv, arg);
+- break;
+- default:
+- dev_info(fdtv->device, "unhandled CA ioctl %u\n", cmd);
+- err = -EOPNOTSUPP;
+- }
+-
+- /* FIXME Is this necessary? */
+- avc_tuner_status(fdtv, &stat);
+-
+- return err;
+-}
+-
+-static unsigned int fdtv_ca_io_poll(struct file *file, poll_table *wait)
+-{
+- return POLLIN;
+-}
+-
+-static struct file_operations fdtv_ca_fops = {
+- .owner = THIS_MODULE,
+- .ioctl = dvb_generic_ioctl,
+- .open = dvb_generic_open,
+- .release = dvb_generic_release,
+- .poll = fdtv_ca_io_poll,
+-};
+-
+-static struct dvb_device fdtv_ca = {
+- .users = 1,
+- .readers = 1,
+- .writers = 1,
+- .fops = &fdtv_ca_fops,
+- .kernel_ioctl = fdtv_ca_ioctl,
+-};
+-
+-int fdtv_ca_register(struct firedtv *fdtv)
+-{
+- struct firedtv_tuner_status stat;
+- int err;
+-
+- if (avc_tuner_status(fdtv, &stat))
+- return -EINVAL;
+-
+- if (!fdtv_ca_ready(&stat))
+- return -EFAULT;
+-
+- err = dvb_register_device(&fdtv->adapter, &fdtv->cadev,
+- &fdtv_ca, fdtv, DVB_DEVICE_CA);
+-
+- if (stat.ca_application_info == 0)
+- dev_err(fdtv->device, "CaApplicationInfo is not set\n");
+- if (stat.ca_date_time_request == 1)
+- avc_ca_get_time_date(fdtv, &fdtv->ca_time_interval);
+-
+- return err;
+-}
+-
+-void fdtv_ca_release(struct firedtv *fdtv)
+-{
+- if (fdtv->cadev)
+- dvb_unregister_device(fdtv->cadev);
+-}
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-dvb.c linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-dvb.c
+--- linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-dvb.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-dvb.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,364 +0,0 @@
+-/*
+- * FireDTV driver (formerly known as FireSAT)
+- *
+- * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
+- * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
+- *
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU General Public License as
+- * published by the Free Software Foundation; either version 2 of
+- * the License, or (at your option) any later version.
+- */
+-
+-#include <linux/bitops.h>
+-#include <linux/device.h>
+-#include <linux/errno.h>
+-#include <linux/kernel.h>
+-#include <linux/mod_devicetable.h>
+-#include <linux/module.h>
+-#include <linux/mutex.h>
+-#include <linux/slab.h>
+-#include <linux/string.h>
+-#include <linux/types.h>
+-#include <linux/wait.h>
+-#include <linux/workqueue.h>
+-
+-#include <dmxdev.h>
+-#include <dvb_demux.h>
+-#include <dvbdev.h>
+-#include <dvb_frontend.h>
+-
+-#include "firedtv.h"
+-
+-static int alloc_channel(struct firedtv *fdtv)
+-{
+- int i;
+-
+- for (i = 0; i < 16; i++)
+- if (!__test_and_set_bit(i, &fdtv->channel_active))
+- break;
+- return i;
+-}
+-
+-static void collect_channels(struct firedtv *fdtv, int *pidc, u16 pid[])
+-{
+- int i, n;
+-
+- for (i = 0, n = 0; i < 16; i++)
+- if (test_bit(i, &fdtv->channel_active))
+- pid[n++] = fdtv->channel_pid[i];
+- *pidc = n;
+-}
+-
+-static inline void dealloc_channel(struct firedtv *fdtv, int i)
+-{
+- __clear_bit(i, &fdtv->channel_active);
+-}
+-
+-int fdtv_start_feed(struct dvb_demux_feed *dvbdmxfeed)
+-{
+- struct firedtv *fdtv = dvbdmxfeed->demux->priv;
+- int pidc, c, ret;
+- u16 pids[16];
+-
+- switch (dvbdmxfeed->type) {
+- case DMX_TYPE_TS:
+- case DMX_TYPE_SEC:
+- break;
+- default:
+- dev_err(fdtv->device, "can't start dmx feed: invalid type %u\n",
+- dvbdmxfeed->type);
+- return -EINVAL;
+- }
+-
+- if (mutex_lock_interruptible(&fdtv->demux_mutex))
+- return -EINTR;
+-
+- if (dvbdmxfeed->type == DMX_TYPE_TS) {
+- switch (dvbdmxfeed->pes_type) {
+- case DMX_TS_PES_VIDEO:
+- case DMX_TS_PES_AUDIO:
+- case DMX_TS_PES_TELETEXT:
+- case DMX_TS_PES_PCR:
+- case DMX_TS_PES_OTHER:
+- c = alloc_channel(fdtv);
+- break;
+- default:
+- dev_err(fdtv->device,
+- "can't start dmx feed: invalid pes type %u\n",
+- dvbdmxfeed->pes_type);
+- ret = -EINVAL;
+- goto out;
+- }
+- } else {
+- c = alloc_channel(fdtv);
+- }
+-
+- if (c > 15) {
+- dev_err(fdtv->device, "can't start dmx feed: busy\n");
+- ret = -EBUSY;
+- goto out;
+- }
+-
+- dvbdmxfeed->priv = (typeof(dvbdmxfeed->priv))(unsigned long)c;
+- fdtv->channel_pid[c] = dvbdmxfeed->pid;
+- collect_channels(fdtv, &pidc, pids);
+-
+- if (dvbdmxfeed->pid == 8192) {
+- ret = avc_tuner_get_ts(fdtv);
+- if (ret) {
+- dealloc_channel(fdtv, c);
+- dev_err(fdtv->device, "can't get TS\n");
+- goto out;
+- }
+- } else {
+- ret = avc_tuner_set_pids(fdtv, pidc, pids);
+- if (ret) {
+- dealloc_channel(fdtv, c);
+- dev_err(fdtv->device, "can't set PIDs\n");
+- goto out;
+- }
+- }
+-out:
+- mutex_unlock(&fdtv->demux_mutex);
+-
+- return ret;
+-}
+-
+-int fdtv_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
+-{
+- struct dvb_demux *demux = dvbdmxfeed->demux;
+- struct firedtv *fdtv = demux->priv;
+- int pidc, c, ret;
+- u16 pids[16];
+-
+- if (dvbdmxfeed->type == DMX_TYPE_TS &&
+- !((dvbdmxfeed->ts_type & TS_PACKET) &&
+- (demux->dmx.frontend->source != DMX_MEMORY_FE))) {
+-
+- if (dvbdmxfeed->ts_type & TS_DECODER) {
+- if (dvbdmxfeed->pes_type >= DMX_TS_PES_OTHER ||
+- !demux->pesfilter[dvbdmxfeed->pes_type])
+- return -EINVAL;
+-
+- demux->pids[dvbdmxfeed->pes_type] |= 0x8000;
+- demux->pesfilter[dvbdmxfeed->pes_type] = NULL;
+- }
+-
+- if (!(dvbdmxfeed->ts_type & TS_DECODER &&
+- dvbdmxfeed->pes_type < DMX_TS_PES_OTHER))
+- return 0;
+- }
+-
+- if (mutex_lock_interruptible(&fdtv->demux_mutex))
+- return -EINTR;
+-
+- c = (unsigned long)dvbdmxfeed->priv;
+- dealloc_channel(fdtv, c);
+- collect_channels(fdtv, &pidc, pids);
+-
+- ret = avc_tuner_set_pids(fdtv, pidc, pids);
+-
+- mutex_unlock(&fdtv->demux_mutex);
+-
+- return ret;
+-}
+-
+-DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
+-
+-int fdtv_dvb_register(struct firedtv *fdtv)
+-{
+- int err;
+-
+- err = dvb_register_adapter(&fdtv->adapter, fdtv_model_names[fdtv->type],
+- THIS_MODULE, fdtv->device, adapter_nr);
+- if (err < 0)
+- goto fail_log;
+-
+- /*DMX_TS_FILTERING | DMX_SECTION_FILTERING*/
+- fdtv->demux.dmx.capabilities = 0;
+-
+- fdtv->demux.priv = fdtv;
+- fdtv->demux.filternum = 16;
+- fdtv->demux.feednum = 16;
+- fdtv->demux.start_feed = fdtv_start_feed;
+- fdtv->demux.stop_feed = fdtv_stop_feed;
+- fdtv->demux.write_to_decoder = NULL;
+-
+- err = dvb_dmx_init(&fdtv->demux);
+- if (err)
+- goto fail_unreg_adapter;
+-
+- fdtv->dmxdev.filternum = 16;
+- fdtv->dmxdev.demux = &fdtv->demux.dmx;
+- fdtv->dmxdev.capabilities = 0;
+-
+- err = dvb_dmxdev_init(&fdtv->dmxdev, &fdtv->adapter);
+- if (err)
+- goto fail_dmx_release;
+-
+- fdtv->frontend.source = DMX_FRONTEND_0;
+-
+- err = fdtv->demux.dmx.add_frontend(&fdtv->demux.dmx, &fdtv->frontend);
+- if (err)
+- goto fail_dmxdev_release;
+-
+- err = fdtv->demux.dmx.connect_frontend(&fdtv->demux.dmx,
+- &fdtv->frontend);
+- if (err)
+- goto fail_rem_frontend;
+-
+- dvb_net_init(&fdtv->adapter, &fdtv->dvbnet, &fdtv->demux.dmx);
+-
+- fdtv_frontend_init(fdtv);
+- err = dvb_register_frontend(&fdtv->adapter, &fdtv->fe);
+- if (err)
+- goto fail_net_release;
+-
+- err = fdtv_ca_register(fdtv);
+- if (err)
+- dev_info(fdtv->device,
+- "Conditional Access Module not enabled\n");
+- return 0;
+-
+-fail_net_release:
+- dvb_net_release(&fdtv->dvbnet);
+- fdtv->demux.dmx.close(&fdtv->demux.dmx);
+-fail_rem_frontend:
+- fdtv->demux.dmx.remove_frontend(&fdtv->demux.dmx, &fdtv->frontend);
+-fail_dmxdev_release:
+- dvb_dmxdev_release(&fdtv->dmxdev);
+-fail_dmx_release:
+- dvb_dmx_release(&fdtv->demux);
+-fail_unreg_adapter:
+- dvb_unregister_adapter(&fdtv->adapter);
+-fail_log:
+- dev_err(fdtv->device, "DVB initialization failed\n");
+- return err;
+-}
+-
+-void fdtv_dvb_unregister(struct firedtv *fdtv)
+-{
+- fdtv_ca_release(fdtv);
+- dvb_unregister_frontend(&fdtv->fe);
+- dvb_net_release(&fdtv->dvbnet);
+- fdtv->demux.dmx.close(&fdtv->demux.dmx);
+- fdtv->demux.dmx.remove_frontend(&fdtv->demux.dmx, &fdtv->frontend);
+- dvb_dmxdev_release(&fdtv->dmxdev);
+- dvb_dmx_release(&fdtv->demux);
+- dvb_unregister_adapter(&fdtv->adapter);
+-}
+-
+-const char *fdtv_model_names[] = {
+- [FIREDTV_UNKNOWN] = "unknown type",
+- [FIREDTV_DVB_S] = "FireDTV S/CI",
+- [FIREDTV_DVB_C] = "FireDTV C/CI",
+- [FIREDTV_DVB_T] = "FireDTV T/CI",
+- [FIREDTV_DVB_S2] = "FireDTV S2 ",
+-};
+-
+-struct firedtv *fdtv_alloc(struct device *dev,
+- const struct firedtv_backend *backend,
+- const char *name, size_t name_len)
+-{
+- struct firedtv *fdtv;
+- int i;
+-
+- fdtv = kzalloc(sizeof(*fdtv), GFP_KERNEL);
+- if (!fdtv)
+- return NULL;
+-
+- dev->driver_data = fdtv;
+- fdtv->device = dev;
+- fdtv->isochannel = -1;
+- fdtv->voltage = 0xff;
+- fdtv->tone = 0xff;
+- fdtv->backend = backend;
+-
+- mutex_init(&fdtv->avc_mutex);
+- init_waitqueue_head(&fdtv->avc_wait);
+- fdtv->avc_reply_received = true;
+- mutex_init(&fdtv->demux_mutex);
+- INIT_WORK(&fdtv->remote_ctrl_work, avc_remote_ctrl_work);
+-
+- for (i = ARRAY_SIZE(fdtv_model_names); --i; )
+- if (strlen(fdtv_model_names[i]) <= name_len &&
+- strncmp(name, fdtv_model_names[i], name_len) == 0)
+- break;
+- fdtv->type = i;
+-
+- return fdtv;
+-}
+-
+-#define MATCH_FLAGS (IEEE1394_MATCH_VENDOR_ID | IEEE1394_MATCH_MODEL_ID | \
+- IEEE1394_MATCH_SPECIFIER_ID | IEEE1394_MATCH_VERSION)
+-
+-#define DIGITAL_EVERYWHERE_OUI 0x001287
+-#define AVC_UNIT_SPEC_ID_ENTRY 0x00a02d
+-#define AVC_SW_VERSION_ENTRY 0x010001
+-
+-static struct ieee1394_device_id fdtv_id_table[] = {
+- {
+- /* FloppyDTV S/CI and FloppyDTV S2 */
+- .match_flags = MATCH_FLAGS,
+- .vendor_id = DIGITAL_EVERYWHERE_OUI,
+- .model_id = 0x000024,
+- .specifier_id = AVC_UNIT_SPEC_ID_ENTRY,
+- .version = AVC_SW_VERSION_ENTRY,
+- }, {
+- /* FloppyDTV T/CI */
+- .match_flags = MATCH_FLAGS,
+- .vendor_id = DIGITAL_EVERYWHERE_OUI,
+- .model_id = 0x000025,
+- .specifier_id = AVC_UNIT_SPEC_ID_ENTRY,
+- .version = AVC_SW_VERSION_ENTRY,
+- }, {
+- /* FloppyDTV C/CI */
+- .match_flags = MATCH_FLAGS,
+- .vendor_id = DIGITAL_EVERYWHERE_OUI,
+- .model_id = 0x000026,
+- .specifier_id = AVC_UNIT_SPEC_ID_ENTRY,
+- .version = AVC_SW_VERSION_ENTRY,
+- }, {
+- /* FireDTV S/CI and FloppyDTV S2 */
+- .match_flags = MATCH_FLAGS,
+- .vendor_id = DIGITAL_EVERYWHERE_OUI,
+- .model_id = 0x000034,
+- .specifier_id = AVC_UNIT_SPEC_ID_ENTRY,
+- .version = AVC_SW_VERSION_ENTRY,
+- }, {
+- /* FireDTV T/CI */
+- .match_flags = MATCH_FLAGS,
+- .vendor_id = DIGITAL_EVERYWHERE_OUI,
+- .model_id = 0x000035,
+- .specifier_id = AVC_UNIT_SPEC_ID_ENTRY,
+- .version = AVC_SW_VERSION_ENTRY,
+- }, {
+- /* FireDTV C/CI */
+- .match_flags = MATCH_FLAGS,
+- .vendor_id = DIGITAL_EVERYWHERE_OUI,
+- .model_id = 0x000036,
+- .specifier_id = AVC_UNIT_SPEC_ID_ENTRY,
+- .version = AVC_SW_VERSION_ENTRY,
+- }, {}
+-};
+-MODULE_DEVICE_TABLE(ieee1394, fdtv_id_table);
+-
+-static int __init fdtv_init(void)
+-{
+- return fdtv_1394_init(fdtv_id_table);
+-}
+-
+-static void __exit fdtv_exit(void)
+-{
+- fdtv_1394_exit();
+-}
+-
+-module_init(fdtv_init);
+-module_exit(fdtv_exit);
+-
+-MODULE_AUTHOR("Andreas Monitzer <andy@monitzer.com>");
+-MODULE_AUTHOR("Ben Backx <ben@bbackx.com>");
+-MODULE_DESCRIPTION("FireDTV DVB Driver");
+-MODULE_LICENSE("GPL");
+-MODULE_SUPPORTED_DEVICE("FireDTV DVB");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-fe.c linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-fe.c
+--- linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-fe.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-fe.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,247 +0,0 @@
+-/*
+- * FireDTV driver (formerly known as FireSAT)
+- *
+- * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
+- * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
+- *
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU General Public License as
+- * published by the Free Software Foundation; either version 2 of
+- * the License, or (at your option) any later version.
+- */
+-
+-#include <linux/device.h>
+-#include <linux/errno.h>
+-#include <linux/kernel.h>
+-#include <linux/string.h>
+-#include <linux/types.h>
+-
+-#include <dvb_frontend.h>
+-
+-#include "firedtv.h"
+-
+-static int fdtv_dvb_init(struct dvb_frontend *fe)
+-{
+- struct firedtv *fdtv = fe->sec_priv;
+- int err;
+-
+- /* FIXME - allocate free channel at IRM */
+- fdtv->isochannel = fdtv->adapter.num;
+-
+- err = cmp_establish_pp_connection(fdtv, fdtv->subunit,
+- fdtv->isochannel);
+- if (err) {
+- dev_err(fdtv->device,
+- "could not establish point to point connection\n");
+- return err;
+- }
+-
+- return fdtv->backend->start_iso(fdtv);
+-}
+-
+-static int fdtv_sleep(struct dvb_frontend *fe)
+-{
+- struct firedtv *fdtv = fe->sec_priv;
+-
+- fdtv->backend->stop_iso(fdtv);
+- cmp_break_pp_connection(fdtv, fdtv->subunit, fdtv->isochannel);
+- fdtv->isochannel = -1;
+- return 0;
+-}
+-
+-#define LNBCONTROL_DONTCARE 0xff
+-
+-static int fdtv_diseqc_send_master_cmd(struct dvb_frontend *fe,
+- struct dvb_diseqc_master_cmd *cmd)
+-{
+- struct firedtv *fdtv = fe->sec_priv;
+-
+- return avc_lnb_control(fdtv, LNBCONTROL_DONTCARE, LNBCONTROL_DONTCARE,
+- LNBCONTROL_DONTCARE, 1, cmd);
+-}
+-
+-static int fdtv_diseqc_send_burst(struct dvb_frontend *fe,
+- fe_sec_mini_cmd_t minicmd)
+-{
+- return 0;
+-}
+-
+-static int fdtv_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone)
+-{
+- struct firedtv *fdtv = fe->sec_priv;
+-
+- fdtv->tone = tone;
+- return 0;
+-}
+-
+-static int fdtv_set_voltage(struct dvb_frontend *fe,
+- fe_sec_voltage_t voltage)
+-{
+- struct firedtv *fdtv = fe->sec_priv;
+-
+- fdtv->voltage = voltage;
+- return 0;
+-}
+-
+-static int fdtv_read_status(struct dvb_frontend *fe, fe_status_t *status)
+-{
+- struct firedtv *fdtv = fe->sec_priv;
+- struct firedtv_tuner_status stat;
+-
+- if (avc_tuner_status(fdtv, &stat))
+- return -EINVAL;
+-
+- if (stat.no_rf)
+- *status = 0;
+- else
+- *status = FE_HAS_SIGNAL | FE_HAS_VITERBI | FE_HAS_SYNC |
+- FE_HAS_CARRIER | FE_HAS_LOCK;
+- return 0;
+-}
+-
+-static int fdtv_read_ber(struct dvb_frontend *fe, u32 *ber)
+-{
+- struct firedtv *fdtv = fe->sec_priv;
+- struct firedtv_tuner_status stat;
+-
+- if (avc_tuner_status(fdtv, &stat))
+- return -EINVAL;
+-
+- *ber = stat.ber;
+- return 0;
+-}
+-
+-static int fdtv_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
+-{
+- struct firedtv *fdtv = fe->sec_priv;
+- struct firedtv_tuner_status stat;
+-
+- if (avc_tuner_status(fdtv, &stat))
+- return -EINVAL;
+-
+- *strength = stat.signal_strength << 8;
+- return 0;
+-}
+-
+-static int fdtv_read_snr(struct dvb_frontend *fe, u16 *snr)
+-{
+- struct firedtv *fdtv = fe->sec_priv;
+- struct firedtv_tuner_status stat;
+-
+- if (avc_tuner_status(fdtv, &stat))
+- return -EINVAL;
+-
+- /* C/N[dB] = -10 * log10(snr / 65535) */
+- *snr = stat.carrier_noise_ratio * 257;
+- return 0;
+-}
+-
+-static int fdtv_read_uncorrected_blocks(struct dvb_frontend *fe, u32 *ucblocks)
+-{
+- return -EOPNOTSUPP;
+-}
+-
+-#define ACCEPTED 0x9
+-
+-static int fdtv_set_frontend(struct dvb_frontend *fe,
+- struct dvb_frontend_parameters *params)
+-{
+- struct firedtv *fdtv = fe->sec_priv;
+-
+- /* FIXME: avc_tuner_dsd never returns ACCEPTED. Check status? */
+- if (avc_tuner_dsd(fdtv, params) != ACCEPTED)
+- return -EINVAL;
+- else
+- return 0; /* not sure of this... */
+-}
+-
+-static int fdtv_get_frontend(struct dvb_frontend *fe,
+- struct dvb_frontend_parameters *params)
+-{
+- return -EOPNOTSUPP;
+-}
+-
+-void fdtv_frontend_init(struct firedtv *fdtv)
+-{
+- struct dvb_frontend_ops *ops = &fdtv->fe.ops;
+- struct dvb_frontend_info *fi = &ops->info;
+-
+- ops->init = fdtv_dvb_init;
+- ops->sleep = fdtv_sleep;
+-
+- ops->set_frontend = fdtv_set_frontend;
+- ops->get_frontend = fdtv_get_frontend;
+-
+- ops->read_status = fdtv_read_status;
+- ops->read_ber = fdtv_read_ber;
+- ops->read_signal_strength = fdtv_read_signal_strength;
+- ops->read_snr = fdtv_read_snr;
+- ops->read_ucblocks = fdtv_read_uncorrected_blocks;
+-
+- ops->diseqc_send_master_cmd = fdtv_diseqc_send_master_cmd;
+- ops->diseqc_send_burst = fdtv_diseqc_send_burst;
+- ops->set_tone = fdtv_set_tone;
+- ops->set_voltage = fdtv_set_voltage;
+-
+- switch (fdtv->type) {
+- case FIREDTV_DVB_S:
+- case FIREDTV_DVB_S2:
+- fi->type = FE_QPSK;
+-
+- fi->frequency_min = 950000;
+- fi->frequency_max = 2150000;
+- fi->frequency_stepsize = 125;
+- fi->symbol_rate_min = 1000000;
+- fi->symbol_rate_max = 40000000;
+-
+- fi->caps = FE_CAN_INVERSION_AUTO |
+- FE_CAN_FEC_1_2 |
+- FE_CAN_FEC_2_3 |
+- FE_CAN_FEC_3_4 |
+- FE_CAN_FEC_5_6 |
+- FE_CAN_FEC_7_8 |
+- FE_CAN_FEC_AUTO |
+- FE_CAN_QPSK;
+- break;
+-
+- case FIREDTV_DVB_C:
+- fi->type = FE_QAM;
+-
+- fi->frequency_min = 47000000;
+- fi->frequency_max = 866000000;
+- fi->frequency_stepsize = 62500;
+- fi->symbol_rate_min = 870000;
+- fi->symbol_rate_max = 6900000;
+-
+- fi->caps = FE_CAN_INVERSION_AUTO |
+- FE_CAN_QAM_16 |
+- FE_CAN_QAM_32 |
+- FE_CAN_QAM_64 |
+- FE_CAN_QAM_128 |
+- FE_CAN_QAM_256 |
+- FE_CAN_QAM_AUTO;
+- break;
+-
+- case FIREDTV_DVB_T:
+- fi->type = FE_OFDM;
+-
+- fi->frequency_min = 49000000;
+- fi->frequency_max = 861000000;
+- fi->frequency_stepsize = 62500;
+-
+- fi->caps = FE_CAN_INVERSION_AUTO |
+- FE_CAN_FEC_2_3 |
+- FE_CAN_TRANSMISSION_MODE_AUTO |
+- FE_CAN_GUARD_INTERVAL_AUTO |
+- FE_CAN_HIERARCHY_AUTO;
+- break;
+-
+- default:
+- dev_err(fdtv->device, "no frontend for model type %d\n",
+- fdtv->type);
+- }
+- strcpy(fi->name, fdtv_model_names[fdtv->type]);
+-
+- fdtv->fe.dvb = &fdtv->adapter;
+- fdtv->fe.sec_priv = fdtv;
+-}
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv.h linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv.h
+--- linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,182 +0,0 @@
+-/*
+- * FireDTV driver (formerly known as FireSAT)
+- *
+- * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
+- * Copyright (C) 2008 Henrik Kurelid <henrik@kurelid.se>
+- *
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU General Public License as
+- * published by the Free Software Foundation; either version 2 of
+- * the License, or (at your option) any later version.
+- */
+-
+-#ifndef _FIREDTV_H
+-#define _FIREDTV_H
+-
+-#include <linux/dvb/dmx.h>
+-#include <linux/dvb/frontend.h>
+-#include <linux/list.h>
+-#include <linux/mutex.h>
+-#include <linux/spinlock_types.h>
+-#include <linux/types.h>
+-#include <linux/wait.h>
+-#include <linux/workqueue.h>
+-
+-#include <demux.h>
+-#include <dmxdev.h>
+-#include <dvb_demux.h>
+-#include <dvb_frontend.h>
+-#include <dvb_net.h>
+-#include <dvbdev.h>
+-
+-struct firedtv_tuner_status {
+- unsigned active_system:8;
+- unsigned searching:1;
+- unsigned moving:1;
+- unsigned no_rf:1;
+- unsigned input:1;
+- unsigned selected_antenna:7;
+- unsigned ber:32;
+- unsigned signal_strength:8;
+- unsigned raster_frequency:2;
+- unsigned rf_frequency:22;
+- unsigned man_dep_info_length:8;
+- unsigned front_end_error:1;
+- unsigned antenna_error:1;
+- unsigned front_end_power_status:1;
+- unsigned power_supply:1;
+- unsigned carrier_noise_ratio:16;
+- unsigned power_supply_voltage:8;
+- unsigned antenna_voltage:8;
+- unsigned firewire_bus_voltage:8;
+- unsigned ca_mmi:1;
+- unsigned ca_pmt_reply:1;
+- unsigned ca_date_time_request:1;
+- unsigned ca_application_info:1;
+- unsigned ca_module_present_status:1;
+- unsigned ca_dvb_flag:1;
+- unsigned ca_error_flag:1;
+- unsigned ca_initialization_status:1;
+-};
+-
+-enum model_type {
+- FIREDTV_UNKNOWN = 0,
+- FIREDTV_DVB_S = 1,
+- FIREDTV_DVB_C = 2,
+- FIREDTV_DVB_T = 3,
+- FIREDTV_DVB_S2 = 4,
+-};
+-
+-struct device;
+-struct input_dev;
+-struct firedtv;
+-
+-struct firedtv_backend {
+- int (*lock)(struct firedtv *fdtv, u64 addr, void *data, __be32 arg);
+- int (*read)(struct firedtv *fdtv, u64 addr, void *data, size_t len);
+- int (*write)(struct firedtv *fdtv, u64 addr, void *data, size_t len);
+- int (*start_iso)(struct firedtv *fdtv);
+- void (*stop_iso)(struct firedtv *fdtv);
+-};
+-
+-struct firedtv {
+- struct device *device;
+- struct list_head list;
+-
+- struct dvb_adapter adapter;
+- struct dmxdev dmxdev;
+- struct dvb_demux demux;
+- struct dmx_frontend frontend;
+- struct dvb_net dvbnet;
+- struct dvb_frontend fe;
+-
+- struct dvb_device *cadev;
+- int ca_last_command;
+- int ca_time_interval;
+-
+- struct mutex avc_mutex;
+- wait_queue_head_t avc_wait;
+- bool avc_reply_received;
+- struct work_struct remote_ctrl_work;
+- struct input_dev *remote_ctrl_dev;
+-
+- enum model_type type;
+- char subunit;
+- char isochannel;
+- fe_sec_voltage_t voltage;
+- fe_sec_tone_mode_t tone;
+-
+- const struct firedtv_backend *backend;
+- void *backend_data;
+-
+- struct mutex demux_mutex;
+- unsigned long channel_active;
+- u16 channel_pid[16];
+-
+- size_t response_length;
+- u8 response[512];
+-};
+-
+-/* firedtv-1394.c */
+-#ifdef CONFIG_DVB_FIREDTV_IEEE1394
+-int fdtv_1394_init(struct ieee1394_device_id id_table[]);
+-void fdtv_1394_exit(void);
+-#else
+-static inline int fdtv_1394_init(struct ieee1394_device_id it[]) { return 0; }
+-static inline void fdtv_1394_exit(void) {}
+-#endif
+-
+-/* firedtv-avc.c */
+-int avc_recv(struct firedtv *fdtv, void *data, size_t length);
+-int avc_tuner_status(struct firedtv *fdtv, struct firedtv_tuner_status *stat);
+-struct dvb_frontend_parameters;
+-int avc_tuner_dsd(struct firedtv *fdtv, struct dvb_frontend_parameters *params);
+-int avc_tuner_set_pids(struct firedtv *fdtv, unsigned char pidc, u16 pid[]);
+-int avc_tuner_get_ts(struct firedtv *fdtv);
+-int avc_identify_subunit(struct firedtv *fdtv);
+-struct dvb_diseqc_master_cmd;
+-int avc_lnb_control(struct firedtv *fdtv, char voltage, char burst,
+- char conttone, char nrdiseq,
+- struct dvb_diseqc_master_cmd *diseqcmd);
+-void avc_remote_ctrl_work(struct work_struct *work);
+-int avc_register_remote_control(struct firedtv *fdtv);
+-int avc_ca_app_info(struct firedtv *fdtv, char *app_info, unsigned int *len);
+-int avc_ca_info(struct firedtv *fdtv, char *app_info, unsigned int *len);
+-int avc_ca_reset(struct firedtv *fdtv);
+-int avc_ca_pmt(struct firedtv *fdtv, char *app_info, int length);
+-int avc_ca_get_time_date(struct firedtv *fdtv, int *interval);
+-int avc_ca_enter_menu(struct firedtv *fdtv);
+-int avc_ca_get_mmi(struct firedtv *fdtv, char *mmi_object, unsigned int *len);
+-int cmp_establish_pp_connection(struct firedtv *fdtv, int plug, int channel);
+-void cmp_break_pp_connection(struct firedtv *fdtv, int plug, int channel);
+-
+-/* firedtv-ci.c */
+-int fdtv_ca_register(struct firedtv *fdtv);
+-void fdtv_ca_release(struct firedtv *fdtv);
+-
+-/* firedtv-dvb.c */
+-int fdtv_start_feed(struct dvb_demux_feed *dvbdmxfeed);
+-int fdtv_stop_feed(struct dvb_demux_feed *dvbdmxfeed);
+-int fdtv_dvb_register(struct firedtv *fdtv);
+-void fdtv_dvb_unregister(struct firedtv *fdtv);
+-struct firedtv *fdtv_alloc(struct device *dev,
+- const struct firedtv_backend *backend,
+- const char *name, size_t name_len);
+-extern const char *fdtv_model_names[];
+-
+-/* firedtv-fe.c */
+-void fdtv_frontend_init(struct firedtv *fdtv);
+-
+-/* firedtv-rc.c */
+-#ifdef CONFIG_DVB_FIREDTV_INPUT
+-int fdtv_register_rc(struct firedtv *fdtv, struct device *dev);
+-void fdtv_unregister_rc(struct firedtv *fdtv);
+-void fdtv_handle_rc(struct firedtv *fdtv, unsigned int code);
+-#else
+-static inline int fdtv_register_rc(struct firedtv *fdtv,
+- struct device *dev) { return 0; }
+-static inline void fdtv_unregister_rc(struct firedtv *fdtv) {}
+-static inline void fdtv_handle_rc(struct firedtv *fdtv, unsigned int code) {}
+-#endif
+-
+-#endif /* _FIREDTV_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-rc.c linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-rc.c
+--- linux-2.6.29.owrt/drivers/media/dvb/firewire/firedtv-rc.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/firedtv-rc.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,190 +0,0 @@
+-/*
+- * FireDTV driver (formerly known as FireSAT)
+- *
+- * Copyright (C) 2004 Andreas Monitzer <andy@monitzer.com>
+- *
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU General Public License as
+- * published by the Free Software Foundation; either version 2 of
+- * the License, or (at your option) any later version.
+- */
+-
+-#include <linux/bitops.h>
+-#include <linux/input.h>
+-#include <linux/kernel.h>
+-#include <linux/string.h>
+-#include <linux/types.h>
+-
+-#include "firedtv.h"
+-
+-/* fixed table with older keycodes, geared towards MythTV */
+-const static u16 oldtable[] = {
+-
+- /* code from device: 0x4501...0x451f */
+-
+- KEY_ESC,
+- KEY_F9,
+- KEY_1,
+- KEY_2,
+- KEY_3,
+- KEY_4,
+- KEY_5,
+- KEY_6,
+- KEY_7,
+- KEY_8,
+- KEY_9,
+- KEY_I,
+- KEY_0,
+- KEY_ENTER,
+- KEY_RED,
+- KEY_UP,
+- KEY_GREEN,
+- KEY_F10,
+- KEY_SPACE,
+- KEY_F11,
+- KEY_YELLOW,
+- KEY_DOWN,
+- KEY_BLUE,
+- KEY_Z,
+- KEY_P,
+- KEY_PAGEDOWN,
+- KEY_LEFT,
+- KEY_W,
+- KEY_RIGHT,
+- KEY_P,
+- KEY_M,
+-
+- /* code from device: 0x4540...0x4542 */
+-
+- KEY_R,
+- KEY_V,
+- KEY_C,
+-};
+-
+-/* user-modifiable table for a remote as sold in 2008 */
+-const static u16 keytable[] = {
+-
+- /* code from device: 0x0300...0x031f */
+-
+- [0x00] = KEY_POWER,
+- [0x01] = KEY_SLEEP,
+- [0x02] = KEY_STOP,
+- [0x03] = KEY_OK,
+- [0x04] = KEY_RIGHT,
+- [0x05] = KEY_1,
+- [0x06] = KEY_2,
+- [0x07] = KEY_3,
+- [0x08] = KEY_LEFT,
+- [0x09] = KEY_4,
+- [0x0a] = KEY_5,
+- [0x0b] = KEY_6,
+- [0x0c] = KEY_UP,
+- [0x0d] = KEY_7,
+- [0x0e] = KEY_8,
+- [0x0f] = KEY_9,
+- [0x10] = KEY_DOWN,
+- [0x11] = KEY_TITLE, /* "OSD" - fixme */
+- [0x12] = KEY_0,
+- [0x13] = KEY_F20, /* "16:9" - fixme */
+- [0x14] = KEY_SCREEN, /* "FULL" - fixme */
+- [0x15] = KEY_MUTE,
+- [0x16] = KEY_SUBTITLE,
+- [0x17] = KEY_RECORD,
+- [0x18] = KEY_TEXT,
+- [0x19] = KEY_AUDIO,
+- [0x1a] = KEY_RED,
+- [0x1b] = KEY_PREVIOUS,
+- [0x1c] = KEY_REWIND,
+- [0x1d] = KEY_PLAYPAUSE,
+- [0x1e] = KEY_NEXT,
+- [0x1f] = KEY_VOLUMEUP,
+-
+- /* code from device: 0x0340...0x0354 */
+-
+- [0x20] = KEY_CHANNELUP,
+- [0x21] = KEY_F21, /* "4:3" - fixme */
+- [0x22] = KEY_TV,
+- [0x23] = KEY_DVD,
+- [0x24] = KEY_VCR,
+- [0x25] = KEY_AUX,
+- [0x26] = KEY_GREEN,
+- [0x27] = KEY_YELLOW,
+- [0x28] = KEY_BLUE,
+- [0x29] = KEY_CHANNEL, /* "CH.LIST" */
+- [0x2a] = KEY_VENDOR, /* "CI" - fixme */
+- [0x2b] = KEY_VOLUMEDOWN,
+- [0x2c] = KEY_CHANNELDOWN,
+- [0x2d] = KEY_LAST,
+- [0x2e] = KEY_INFO,
+- [0x2f] = KEY_FORWARD,
+- [0x30] = KEY_LIST,
+- [0x31] = KEY_FAVORITES,
+- [0x32] = KEY_MENU,
+- [0x33] = KEY_EPG,
+- [0x34] = KEY_EXIT,
+-};
+-
+-int fdtv_register_rc(struct firedtv *fdtv, struct device *dev)
+-{
+- struct input_dev *idev;
+- int i, err;
+-
+- idev = input_allocate_device();
+- if (!idev)
+- return -ENOMEM;
+-
+- fdtv->remote_ctrl_dev = idev;
+- idev->name = "FireDTV remote control";
+- idev->dev.parent = dev;
+- idev->evbit[0] = BIT_MASK(EV_KEY);
+- idev->keycode = kmemdup(keytable, sizeof(keytable), GFP_KERNEL);
+- if (!idev->keycode) {
+- err = -ENOMEM;
+- goto fail;
+- }
+- idev->keycodesize = sizeof(keytable[0]);
+- idev->keycodemax = ARRAY_SIZE(keytable);
+-
+- for (i = 0; i < ARRAY_SIZE(keytable); i++)
+- set_bit(keytable[i], idev->keybit);
+-
+- err = input_register_device(idev);
+- if (err)
+- goto fail_free_keymap;
+-
+- return 0;
+-
+-fail_free_keymap:
+- kfree(idev->keycode);
+-fail:
+- input_free_device(idev);
+- return err;
+-}
+-
+-void fdtv_unregister_rc(struct firedtv *fdtv)
+-{
+- kfree(fdtv->remote_ctrl_dev->keycode);
+- input_unregister_device(fdtv->remote_ctrl_dev);
+-}
+-
+-void fdtv_handle_rc(struct firedtv *fdtv, unsigned int code)
+-{
+- u16 *keycode = fdtv->remote_ctrl_dev->keycode;
+-
+- if (code >= 0x0300 && code <= 0x031f)
+- code = keycode[code - 0x0300];
+- else if (code >= 0x0340 && code <= 0x0354)
+- code = keycode[code - 0x0320];
+- else if (code >= 0x4501 && code <= 0x451f)
+- code = oldtable[code - 0x4501];
+- else if (code >= 0x4540 && code <= 0x4542)
+- code = oldtable[code - 0x4521];
+- else {
+- printk(KERN_DEBUG "firedtv: invalid key code 0x%04x "
+- "from remote control\n", code);
+- return;
+- }
+-
+- input_report_key(fdtv->remote_ctrl_dev, code, 1);
+- input_report_key(fdtv->remote_ctrl_dev, code, 0);
+-}
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/firewire/Kconfig linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/Kconfig
+--- linux-2.6.29.owrt/drivers/media/dvb/firewire/Kconfig 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/Kconfig 1970-01-01 01:00:00.000000000 +0100
+@@ -1,22 +0,0 @@
+-config DVB_FIREDTV
+- tristate "FireDTV and FloppyDTV"
+- depends on DVB_CORE && IEEE1394
+- help
+- Support for DVB receivers from Digital Everywhere
+- which are connected via IEEE 1394 (FireWire).
+-
+- These devices don't have an MPEG decoder built in,
+- so you need an external software decoder to watch TV.
+-
+- To compile this driver as a module, say M here:
+- the module will be called firedtv.
+-
+-if DVB_FIREDTV
+-
+-config DVB_FIREDTV_IEEE1394
+- def_bool IEEE1394
+-
+-config DVB_FIREDTV_INPUT
+- def_bool INPUT = y || (INPUT = m && DVB_FIREDTV = m)
+-
+-endif # DVB_FIREDTV
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/firewire/Makefile linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/Makefile
+--- linux-2.6.29.owrt/drivers/media/dvb/firewire/Makefile 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/firewire/Makefile 1970-01-01 01:00:00.000000000 +0100
+@@ -1,8 +0,0 @@
+-obj-$(CONFIG_DVB_FIREDTV) += firedtv.o
+-
+-firedtv-y := firedtv-avc.o firedtv-ci.o firedtv-dvb.o firedtv-fe.o
+-firedtv-$(CONFIG_DVB_FIREDTV_IEEE1394) += firedtv-1394.o
+-firedtv-$(CONFIG_DVB_FIREDTV_INPUT) += firedtv-rc.o
+-
+-ccflags-y += -Idrivers/media/dvb/dvb-core
+-ccflags-$(CONFIG_DVB_FIREDTV_IEEE1394) += -Idrivers/ieee1394
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/frontends/drx397xD.c linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/drx397xD.c
+--- linux-2.6.29.owrt/drivers/media/dvb/frontends/drx397xD.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/drx397xD.c 2009-05-10 23:48:28.000000000 +0200
+@@ -646,7 +646,7 @@
+ u32 edi = 0, ebx = 0, ebp = 0, edx = 0;
+ u16 v20 = 0, v1E = 0, v16 = 0, v14 = 0, v12 = 0, v10 = 0, v0E = 0;
+
+- int rc, df_tuner = 0;
++ int rc, df_tuner;
+ int a, b, c, d;
+ pr_debug("%s %d\n", __func__, s->config.d60);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/frontends/s5h1409.c linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/s5h1409.c
+--- linux-2.6.29.owrt/drivers/media/dvb/frontends/s5h1409.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/s5h1409.c 2009-05-10 23:48:28.000000000 +0200
+@@ -545,6 +545,9 @@
+
+ s5h1409_enable_modulation(fe, p->u.vsb.modulation);
+
++ /* Allow the demod to settle */
++ msleep(100);
++
+ if (fe->ops.tuner_ops.set_params) {
+ if (fe->ops.i2c_gate_ctrl)
+ fe->ops.i2c_gate_ctrl(fe, 1);
+@@ -559,10 +562,6 @@
+ s5h1409_set_qam_interleave_mode(fe);
+ }
+
+- /* Issue a reset to the demod so it knows to resync against the
+- newly tuned frequency */
+- s5h1409_softreset(fe);
+-
+ return 0;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/frontends/stb0899_algo.c linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/stb0899_algo.c
+--- linux-2.6.29.owrt/drivers/media/dvb/frontends/stb0899_algo.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/stb0899_algo.c 2009-05-10 23:48:28.000000000 +0200
+@@ -31,8 +31,6 @@
+ return n;
+ }
+
+-#if 0
+-/* These functions are currently unused */
+ /*
+ * stb0899_calc_srate
+ * Compute symbol rate
+@@ -65,7 +63,6 @@
+
+ return stb0899_calc_srate(internal->master_clk, sfr);
+ }
+-#endif
+
+ /*
+ * stb0899_set_srate
+@@ -156,7 +153,7 @@
+ }
+
+ if (range > 0)
+- internal->sub_range = min(internal->srch_range, range);
++ internal->sub_range = MIN(internal->srch_range, range);
+ else
+ internal->sub_range = 0;
+
+@@ -185,7 +182,7 @@
+ timing = stb0899_read_reg(state, STB0899_RTF);
+
+ if (lock >= 42) {
+- if ((lock > 48) && (abs(timing) >= 110)) {
++ if ((lock > 48) && (ABS(timing) >= 110)) {
+ internal->status = ANALOGCARRIER;
+ dprintk(state->verbose, FE_DEBUG, 1, "-->ANALOG Carrier !");
+ } else {
+@@ -222,7 +219,7 @@
+ index++;
+ derot_freq += index * internal->direction * derot_step; /* next derot zig zag position */
+
+- if (abs(derot_freq) > derot_limit)
++ if (ABS(derot_freq) > derot_limit)
+ next_loop--;
+
+ if (next_loop) {
+@@ -298,7 +295,7 @@
+ last_derot_freq = derot_freq;
+ derot_freq += index * internal->direction * internal->derot_step; /* next zig zag derotator position */
+
+- if(abs(derot_freq) > derot_limit)
++ if(ABS(derot_freq) > derot_limit)
+ next_loop--;
+
+ if (next_loop) {
+@@ -400,7 +397,7 @@
+ if ((internal->status != CARRIEROK) || (stb0899_check_data(state) != DATAOK)) {
+
+ derot_freq += index * internal->direction * derot_step; /* next zig zag derotator position */
+- if (abs(derot_freq) > derot_limit)
++ if (ABS(derot_freq) > derot_limit)
+ next_loop--;
+
+ if (next_loop) {
+@@ -467,7 +464,7 @@
+
+ if (internal->sub_dir > 0) {
+ old_sub_range = internal->sub_range;
+- internal->sub_range = min((internal->srch_range / 2) -
++ internal->sub_range = MIN((internal->srch_range / 2) -
+ (internal->tuner_offst + internal->sub_range / 2),
+ internal->sub_range);
+
+@@ -771,7 +768,7 @@
+ int i;
+
+ i = 0;
+- while ((1 << i) <= abs(number))
++ while ((1 << i) <= ABS(number))
+ i++;
+
+ if (number == 0)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/frontends/stb0899_drv.c linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/stb0899_drv.c
+--- linux-2.6.29.owrt/drivers/media/dvb/frontends/stb0899_drv.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/stb0899_drv.c 2009-05-10 23:48:28.000000000 +0200
+@@ -794,7 +794,7 @@
+ reg = stb0899_read_reg(state, STB0899_DISCNTRL1);
+ old_state = reg;
+ /* set to burst mode */
+- STB0899_SETFIELD_VAL(DISEQCMODE, reg, 0x03);
++ STB0899_SETFIELD_VAL(DISEQCMODE, reg, 0x02);
+ STB0899_SETFIELD_VAL(DISPRECHARGE, reg, 0x01);
+ stb0899_write_reg(state, STB0899_DISCNTRL1, reg);
+ switch (burst) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/frontends/stb0899_priv.h linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/stb0899_priv.h
+--- linux-2.6.29.owrt/drivers/media/dvb/frontends/stb0899_priv.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/stb0899_priv.h 2009-05-10 23:48:28.000000000 +0200
+@@ -59,6 +59,10 @@
+ #define MAKEWORD32(a, b, c, d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
+ #define MAKEWORD16(a, b) (((a) << 8) | (b))
+
++#define MIN(x, y) ((x) <= (y) ? (x) : (y))
++#define MAX(x, y) ((x) >= (y) ? (x) : (y))
++#define ABS(x) ((x) >= 0 ? (x) : -(x))
++
+ #define LSB(x) ((x & 0xff))
+ #define MSB(y) ((y >> 8) & 0xff)
+
+@@ -164,10 +168,10 @@
+ u32 freq; /* Demod internal Frequency */
+ u32 srate; /* Demod internal Symbol rate */
+ enum stb0899_fec fecrate; /* Demod internal FEC rate */
+- s32 srch_range; /* Demod internal Search Range */
+- s32 sub_range; /* Demod current sub range (Hz) */
+- s32 tuner_step; /* Tuner step (Hz) */
+- s32 tuner_offst; /* Relative offset to carrier (Hz) */
++ u32 srch_range; /* Demod internal Search Range */
++ u32 sub_range; /* Demod current sub range (Hz) */
++ u32 tuner_step; /* Tuner step (Hz) */
++ u32 tuner_offst; /* Relative offset to carrier (Hz) */
+ u32 tuner_bw; /* Current bandwidth of the tuner (Hz) */
+
+ s32 mclk; /* Masterclock Divider factor (binary) */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/frontends/stb6100.c linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/stb6100.c
+--- linux-2.6.29.owrt/drivers/media/dvb/frontends/stb6100.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/stb6100.c 2009-05-10 23:48:28.000000000 +0200
+@@ -427,11 +427,11 @@
+ status->refclock = 27000000; /* Hz */
+ status->iqsense = 1;
+ status->bandwidth = 36000; /* kHz */
+- state->bandwidth = status->bandwidth * 1000; /* Hz */
++ state->bandwidth = status->bandwidth * 1000; /* MHz */
+ state->reference = status->refclock / 1000; /* kHz */
+
+ /* Set default bandwidth. */
+- return stb6100_set_bandwidth(fe, state->bandwidth);
++ return stb6100_set_bandwidth(fe, status->bandwidth);
+ }
+
+ static int stb6100_get_state(struct dvb_frontend *fe,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/frontends/zl10353.c linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/zl10353.c
+--- linux-2.6.29.owrt/drivers/media/dvb/frontends/zl10353.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/zl10353.c 2009-05-10 23:48:28.000000000 +0200
+@@ -590,7 +590,7 @@
+ struct zl10353_state *state = fe->demodulator_priv;
+ u8 val = 0x0a;
+
+- if (state->config.disable_i2c_gate_ctrl) {
++ if (state->config.no_tuner) {
+ /* No tuner attached to the internal I2C bus */
+ /* If set enable I2C bridge, the main I2C bus stopped hardly */
+ return 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/frontends/zl10353.h linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/zl10353.h
+--- linux-2.6.29.owrt/drivers/media/dvb/frontends/zl10353.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/frontends/zl10353.h 2009-05-10 23:48:28.000000000 +0200
+@@ -38,9 +38,6 @@
+
+ /* set if parallel ts output is required */
+ int parallel_ts;
+-
+- /* set if i2c_gate_ctrl disable is required */
+- u8 disable_i2c_gate_ctrl:1;
+ };
+
+ #if defined(CONFIG_DVB_ZL10353) || (defined(CONFIG_DVB_ZL10353_MODULE) && defined(MODULE))
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/Kconfig linux-2.6.29-rc3.owrt/drivers/media/dvb/Kconfig
+--- linux-2.6.29.owrt/drivers/media/dvb/Kconfig 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -51,10 +51,6 @@
+ depends on DVB_CORE && PCI && I2C
+ source "drivers/media/dvb/dm1105/Kconfig"
+
+-comment "Supported FireWire (IEEE 1394) Adapters"
+- depends on DVB_CORE && IEEE1394
+-source "drivers/media/dvb/firewire/Kconfig"
+-
+ comment "Supported DVB Frontends"
+ depends on DVB_CORE
+ source "drivers/media/dvb/frontends/Kconfig"
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/Makefile linux-2.6.29-rc3.owrt/drivers/media/dvb/Makefile
+--- linux-2.6.29.owrt/drivers/media/dvb/Makefile 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/Makefile 2009-05-10 23:48:28.000000000 +0200
+@@ -3,5 +3,3 @@
+ #
+
+ obj-y := dvb-core/ frontends/ ttpci/ ttusb-dec/ ttusb-budget/ b2c2/ bt8xx/ dvb-usb/ pluto2/ siano/ dm1105/
+-
+-obj-$(CONFIG_DVB_FIREDTV) += firewire/
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/ttpci/budget.c linux-2.6.29-rc3.owrt/drivers/media/dvb/ttpci/budget.c
+--- linux-2.6.29.owrt/drivers/media/dvb/ttpci/budget.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/ttpci/budget.c 2009-05-10 23:48:28.000000000 +0200
+@@ -470,7 +470,6 @@
+ budget->dvb_frontend = dvb_attach(l64781_attach, &grundig_29504_401_config, &budget->i2c_adap);
+ if (budget->dvb_frontend) {
+ budget->dvb_frontend->ops.tuner_ops.set_params = grundig_29504_401_tuner_set_params;
+- budget->dvb_frontend->tuner_priv = NULL;
+ break;
+ }
+ break;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/dvb/ttusb-dec/ttusb_dec.c linux-2.6.29-rc3.owrt/drivers/media/dvb/ttusb-dec/ttusb_dec.c
+--- linux-2.6.29.owrt/drivers/media/dvb/ttusb-dec/ttusb_dec.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/dvb/ttusb-dec/ttusb_dec.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1384,7 +1384,7 @@
+ static int ttusb_dec_init_stb(struct ttusb_dec *dec)
+ {
+ int result;
+- unsigned int mode = 0, model = 0, version = 0;
++ unsigned int mode, model, version;
+
+ dprintk("%s\n", __func__);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/radio/radio-mr800.c linux-2.6.29-rc3.owrt/drivers/media/radio/radio-mr800.c
+--- linux-2.6.29.owrt/drivers/media/radio/radio-mr800.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/radio/radio-mr800.c 2009-05-10 23:48:28.000000000 +0200
+@@ -194,10 +194,10 @@
+ return retval;
+ }
+
+- radio->muted = 0;
+-
+ mutex_unlock(&radio->lock);
+
++ radio->muted = 0;
++
+ return retval;
+ }
+
+@@ -230,10 +230,10 @@
+ return retval;
+ }
+
+- radio->muted = 1;
+-
+ mutex_unlock(&radio->lock);
+
++ radio->muted = 1;
++
+ return retval;
+ }
+
+@@ -284,10 +284,10 @@
+ return retval;
+ }
+
+- radio->stereo = 0;
+-
+ mutex_unlock(&radio->lock);
+
++ radio->stereo = 0;
++
+ return retval;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/radio/radio-si470x.c linux-2.6.29-rc3.owrt/drivers/media/radio/radio-si470x.c
+--- linux-2.6.29.owrt/drivers/media/radio/radio-si470x.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/radio/radio-si470x.c 2009-05-10 23:48:28.000000000 +0200
+@@ -98,16 +98,11 @@
+ * - blacklisted KWorld radio in hid-core.c and hid-ids.h
+ * 2008-12-03 Mark Lord <mlord@pobox.com>
+ * - add support for DealExtreme USB Radio
+- * 2009-01-31 Bob Ross <pigiron@gmx.com>
+- * - correction of stereo detection/setting
+- * - correction of signal strength indicator scaling
+- * 2009-01-31 Rick Bronson <rick@efn.org>
+- * Tobias Lorenz <tobias.lorenz@gmx.net>
+- * - add LED status output
+ *
+ * ToDo:
+ * - add firmware download/update support
+ * - RDS support: interrupt mode, instead of polling
++ * - add LED status output (check if that's not already done in firmware)
+ */
+
+
+@@ -887,30 +882,6 @@
+
+
+ /**************************************************************************
+- * General Driver Functions - LED_REPORT
+- **************************************************************************/
+-
+-/*
+- * si470x_set_led_state - sets the led state
+- */
+-static int si470x_set_led_state(struct si470x_device *radio,
+- unsigned char led_state)
+-{
+- unsigned char buf[LED_REPORT_SIZE];
+- int retval;
+-
+- buf[0] = LED_REPORT;
+- buf[1] = LED_COMMAND;
+- buf[2] = led_state;
+-
+- retval = si470x_set_report(radio, (void *) &buf, sizeof(buf));
+-
+- return (retval < 0) ? -EINVAL : 0;
+-}
+-
+-
+-
+-/**************************************************************************
+ * RDS Driver Functions
+ **************************************************************************/
+
+@@ -1414,22 +1385,20 @@
+ };
+
+ /* stereo indicator == stereo (instead of mono) */
+- if ((radio->registers[STATUSRSSI] & STATUSRSSI_ST) == 0)
+- tuner->rxsubchans = V4L2_TUNER_SUB_MONO;
+- else
++ if ((radio->registers[STATUSRSSI] & STATUSRSSI_ST) == 1)
+ tuner->rxsubchans = V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO;
++ else
++ tuner->rxsubchans = V4L2_TUNER_SUB_MONO;
+
+ /* mono/stereo selector */
+- if ((radio->registers[POWERCFG] & POWERCFG_MONO) == 0)
+- tuner->audmode = V4L2_TUNER_MODE_STEREO;
+- else
++ if ((radio->registers[POWERCFG] & POWERCFG_MONO) == 1)
+ tuner->audmode = V4L2_TUNER_MODE_MONO;
++ else
++ tuner->audmode = V4L2_TUNER_MODE_STEREO;
+
+ /* min is worst, max is best; signal:0..0xffff; rssi: 0..0xff */
+- /* measured in units of dbµV in 1 db increments (max at ~75 dbµV) */
+- tuner->signal = (radio->registers[STATUSRSSI] & STATUSRSSI_RSSI);
+- /* the ideal factor is 0xffff/75 = 873,8 */
+- tuner->signal = (tuner->signal * 873) + (8 * tuner->signal / 10);
++ tuner->signal = (radio->registers[STATUSRSSI] & STATUSRSSI_RSSI)
++ * 0x0101;
+
+ /* automatic frequency control: -1: freq to low, 1 freq to high */
+ /* AFCRL does only indicate that freq. differs, not if too low/high */
+@@ -1663,9 +1632,6 @@
+ /* set initial frequency */
+ si470x_set_freq(radio, 87.5 * FREQ_MUL); /* available in all regions */
+
+- /* set led to connect state */
+- si470x_set_led_state(radio, BLINK_GREEN_LED);
+-
+ /* rds buffer allocation */
+ radio->buf_size = rds_buf * 3;
+ radio->buffer = kmalloc(radio->buf_size, GFP_KERNEL);
+@@ -1749,9 +1715,6 @@
+ cancel_delayed_work_sync(&radio->work);
+ usb_set_intfdata(intf, NULL);
+ if (radio->users == 0) {
+- /* set led to disconnect state */
+- si470x_set_led_state(radio, BLINK_ORANGE_LED);
+-
+ video_unregister_device(radio->videodev);
+ kfree(radio->buffer);
+ kfree(radio);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/cs5345.c linux-2.6.29-rc3.owrt/drivers/media/video/cs5345.c
+--- linux-2.6.29.owrt/drivers/media/video/cs5345.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/cs5345.c 2009-05-10 23:48:28.000000000 +0200
+@@ -18,6 +18,7 @@
+ */
+
+
++#include <linux/version.h>
+ #include <linux/module.h>
+ #include <linux/kernel.h>
+ #include <linux/i2c.h>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/cx23885/cx23885-417.c linux-2.6.29-rc3.owrt/drivers/media/video/cx23885/cx23885-417.c
+--- linux-2.6.29.owrt/drivers/media/video/cx23885/cx23885-417.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/cx23885/cx23885-417.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1586,8 +1586,7 @@
+ lock_kernel();
+ list_for_each(list, &cx23885_devlist) {
+ h = list_entry(list, struct cx23885_dev, devlist);
+- if (h->v4l_device &&
+- h->v4l_device->minor == minor) {
++ if (h->v4l_device->minor == minor) {
+ dev = h;
+ break;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/cx23885/cx23885-video.c linux-2.6.29-rc3.owrt/drivers/media/video/cx23885/cx23885-video.c
+--- linux-2.6.29.owrt/drivers/media/video/cx23885/cx23885-video.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/cx23885/cx23885-video.c 2009-05-10 23:48:28.000000000 +0200
+@@ -730,13 +730,12 @@
+ lock_kernel();
+ list_for_each(list, &cx23885_devlist) {
+ h = list_entry(list, struct cx23885_dev, devlist);
+- if (h->video_dev &&
+- h->video_dev->minor == minor) {
++ if (h->video_dev->minor == minor) {
+ dev = h;
+ type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ }
+ if (h->vbi_dev &&
+- h->vbi_dev->minor == minor) {
++ h->vbi_dev->minor == minor) {
+ dev = h;
+ type = V4L2_BUF_TYPE_VBI_CAPTURE;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/cx25840/cx25840-core.c linux-2.6.29-rc3.owrt/drivers/media/video/cx25840/cx25840-core.c
+--- linux-2.6.29.owrt/drivers/media/video/cx25840/cx25840-core.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/cx25840/cx25840-core.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1382,14 +1382,6 @@
+
+ static int cx25840_command(struct i2c_client *client, unsigned cmd, void *arg)
+ {
+- /* ignore this command */
+- if (cmd == TUNER_SET_TYPE_ADDR || cmd == TUNER_SET_CONFIG)
+- return 0;
+-
+- /* Old-style drivers rely on initialization on first use, so
+- call the init whenever a command is issued to this driver.
+- New-style drivers using v4l2_subdev should call init explicitly. */
+- cx25840_init(i2c_get_clientdata(client), 0);
+ return v4l2_subdev_command(i2c_get_clientdata(client), cmd, arg);
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/cx88/cx88-dvb.c linux-2.6.29-rc3.owrt/drivers/media/video/cx88/cx88-dvb.c
+--- linux-2.6.29.owrt/drivers/media/video/cx88/cx88-dvb.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/cx88/cx88-dvb.c 2009-05-10 23:48:28.000000000 +0200
+@@ -614,41 +614,34 @@
+ .set_ts_params = cx24116_set_ts_param,
+ };
+
+-static int cx8802_alloc_frontends(struct cx8802_dev *dev)
++static int dvb_register(struct cx8802_dev *dev)
+ {
+ struct cx88_core *core = dev->core;
+- struct videobuf_dvb_frontend *fe = NULL;
++ struct videobuf_dvb_frontend *fe0, *fe1 = NULL;
++ int mfe_shared = 0; /* bus not shared by default */
+ int i;
+
+- mutex_init(&dev->frontends.lock);
+- INIT_LIST_HEAD(&dev->frontends.felist);
++ if (0 != core->i2c_rc) {
++ printk(KERN_ERR "%s/2: no i2c-bus available, cannot attach dvb drivers\n", core->name);
++ goto frontend_detach;
++ }
+
+ if (!core->board.num_frontends)
+- return -ENODEV;
++ return -EINVAL;
++
++ mutex_init(&dev->frontends.lock);
++ INIT_LIST_HEAD(&dev->frontends.felist);
+
+ printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__,
+ core->board.num_frontends);
+ for (i = 1; i <= core->board.num_frontends; i++) {
+- fe = videobuf_dvb_alloc_frontend(&dev->frontends, i);
+- if (!fe) {
++ fe0 = videobuf_dvb_alloc_frontend(&dev->frontends, i);
++ if (!fe0) {
+ printk(KERN_ERR "%s() failed to alloc\n", __func__);
+ videobuf_dvb_dealloc_frontends(&dev->frontends);
+- return -ENOMEM;
++ goto frontend_detach;
+ }
+ }
+- return 0;
+-}
+-
+-static int dvb_register(struct cx8802_dev *dev)
+-{
+- struct cx88_core *core = dev->core;
+- struct videobuf_dvb_frontend *fe0, *fe1 = NULL;
+- int mfe_shared = 0; /* bus not shared by default */
+-
+- if (0 != core->i2c_rc) {
+- printk(KERN_ERR "%s/2: no i2c-bus available, cannot attach dvb drivers\n", core->name);
+- goto frontend_detach;
+- }
+
+ /* Get the first frontend */
+ fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
+@@ -1250,8 +1243,6 @@
+ struct cx88_core *core = drv->core;
+ struct cx8802_dev *dev = drv->core->dvbdev;
+ int err;
+- struct videobuf_dvb_frontend *fe;
+- int i;
+
+ dprintk( 1, "%s\n", __func__);
+ dprintk( 1, " ->being probed by Card=%d Name=%s, PCI %02x:%02x\n",
+@@ -1267,34 +1258,39 @@
+ /* If vp3054 isn't enabled, a stub will just return 0 */
+ err = vp3054_i2c_probe(dev);
+ if (0 != err)
+- goto fail_core;
++ goto fail_probe;
+
+ /* dvb stuff */
+ printk(KERN_INFO "%s/2: cx2388x based DVB/ATSC card\n", core->name);
+ dev->ts_gen_cntrl = 0x0c;
+
+- err = cx8802_alloc_frontends(dev);
+- if (err)
+- goto fail_core;
+-
+ err = -ENODEV;
+- for (i = 1; i <= core->board.num_frontends; i++) {
+- fe = videobuf_dvb_get_frontend(&core->dvbdev->frontends, i);
+- if (fe == NULL) {
+- printk(KERN_ERR "%s() failed to get frontend(%d)\n",
++ if (core->board.num_frontends) {
++ struct videobuf_dvb_frontend *fe;
++ int i;
++
++ for (i = 1; i <= core->board.num_frontends; i++) {
++ fe = videobuf_dvb_get_frontend(&core->dvbdev->frontends, i);
++ if (fe == NULL) {
++ printk(KERN_ERR "%s() failed to get frontend(%d)\n",
+ __func__, i);
+- goto fail_probe;
+- }
+- videobuf_queue_sg_init(&fe->dvb.dvbq, &dvb_qops,
++ goto fail_probe;
++ }
++ videobuf_queue_sg_init(&fe->dvb.dvbq, &dvb_qops,
+ &dev->pci->dev, &dev->slock,
+ V4L2_BUF_TYPE_VIDEO_CAPTURE,
+ V4L2_FIELD_TOP,
+ sizeof(struct cx88_buffer),
+ dev);
+- /* init struct videobuf_dvb */
+- fe->dvb.name = dev->core->name;
++ /* init struct videobuf_dvb */
++ fe->dvb.name = dev->core->name;
++ }
++ } else {
++ /* no frontends allocated */
++ printk(KERN_ERR "%s/2 .num_frontends should be non-zero\n",
++ core->name);
++ goto fail_core;
+ }
+-
+ err = dvb_register(dev);
+ if (err)
+ /* frontends/adapter de-allocated in dvb_register */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/cx88/cx88.h linux-2.6.29-rc3.owrt/drivers/media/video/cx88/cx88.h
+--- linux-2.6.29.owrt/drivers/media/video/cx88/cx88.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/cx88/cx88.h 2009-05-10 23:48:28.000000000 +0200
+@@ -336,8 +336,8 @@
+ /* config info -- dvb */
+ #if defined(CONFIG_VIDEO_CX88_DVB) || defined(CONFIG_VIDEO_CX88_DVB_MODULE)
+ int (*prev_set_voltage)(struct dvb_frontend *fe, fe_sec_voltage_t voltage);
+-#endif
+ void (*gate_ctrl)(struct cx88_core *core, int open);
++#endif
+
+ /* state info */
+ struct task_struct *kthread;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx-audio.c linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx-audio.c
+--- linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx-audio.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx-audio.c 2009-05-10 23:48:28.000000000 +0200
+@@ -62,15 +62,9 @@
+
+ dprintk("Stopping isoc\n");
+ for (i = 0; i < EM28XX_AUDIO_BUFS; i++) {
+- if (!irqs_disabled())
+- usb_kill_urb(dev->adev.urb[i]);
+- else
+- usb_unlink_urb(dev->adev.urb[i]);
++ usb_unlink_urb(dev->adev.urb[i]);
+ usb_free_urb(dev->adev.urb[i]);
+ dev->adev.urb[i] = NULL;
+-
+- kfree(dev->adev.transfer_buffer[i]);
+- dev->adev.transfer_buffer[i] = NULL;
+ }
+
+ return 0;
+@@ -395,15 +389,11 @@
+ static snd_pcm_uframes_t snd_em28xx_capture_pointer(struct snd_pcm_substream
+ *substream)
+ {
+- unsigned long flags;
+-
+ struct em28xx *dev;
+- snd_pcm_uframes_t hwptr_done;
+
++ snd_pcm_uframes_t hwptr_done;
+ dev = snd_pcm_substream_chip(substream);
+- spin_lock_irqsave(&dev->adev.slock, flags);
+ hwptr_done = dev->adev.hwptr_done_capture;
+- spin_unlock_irqrestore(&dev->adev.slock, flags);
+
+ return hwptr_done;
+ }
+@@ -463,8 +453,6 @@
+ pcm->info_flags = 0;
+ pcm->private_data = dev;
+ strcpy(pcm->name, "Empia 28xx Capture");
+-
+- snd_card_set_dev(card, &dev->udev->dev);
+ strcpy(card->driver, "Empia Em28xx Audio");
+ strcpy(card->shortname, "Em28xx Audio");
+ strcpy(card->longname, "Empia Em28xx Audio");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx-cards.c linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx-cards.c
+--- linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx-cards.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx-cards.c 2009-05-10 23:48:28.000000000 +0200
+@@ -102,18 +102,6 @@
+ /* Board - EM2870 Kworld 355u
+ Analog - No input analog */
+
+-static struct em28xx_reg_seq kworld_330u_analog[] = {
+- {EM28XX_R08_GPIO, 0x6d, ~EM_GPIO_4, 10},
+- {EM2880_R04_GPO, 0x00, 0xff, 10},
+- { -1, -1, -1, -1},
+-};
+-
+-static struct em28xx_reg_seq kworld_330u_digital[] = {
+- {EM28XX_R08_GPIO, 0x6e, ~EM_GPIO_4, 10},
+- {EM2880_R04_GPO, 0x08, 0xff, 10},
+- { -1, -1, -1, -1},
+-};
+-
+ /* Callback for the most boards */
+ static struct em28xx_reg_seq default_tuner_gpio[] = {
+ {EM28XX_R08_GPIO, EM_GPIO_4, EM_GPIO_4, 10},
+@@ -1189,33 +1177,29 @@
+ .gpio = hauppauge_wintv_hvr_900_analog,
+ } },
+ },
+- [EM2883_BOARD_KWORLD_HYBRID_330U] = {
++ [EM2883_BOARD_KWORLD_HYBRID_A316] = {
+ .name = "Kworld PlusTV HD Hybrid 330",
+ .tuner_type = TUNER_XC2028,
+ .tuner_gpio = default_tuner_gpio,
+ .decoder = EM28XX_TVP5150,
+ .mts_firmware = 1,
+ .has_dvb = 1,
+- .dvb_gpio = kworld_330u_digital,
+- .xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
+- .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_EEPROM_ON_BOARD | EM28XX_I2C_EEPROM_KEY_VALID,
++ .dvb_gpio = default_digital,
+ .input = { {
+ .type = EM28XX_VMUX_TELEVISION,
+ .vmux = TVP5150_COMPOSITE0,
+ .amux = EM28XX_AMUX_VIDEO,
+- .gpio = kworld_330u_analog,
+- .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
++ .gpio = default_analog,
+ }, {
+ .type = EM28XX_VMUX_COMPOSITE1,
+ .vmux = TVP5150_COMPOSITE1,
+ .amux = EM28XX_AMUX_LINE_IN,
+- .gpio = kworld_330u_analog,
+- .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
++ .gpio = hauppauge_wintv_hvr_900_analog,
+ }, {
+ .type = EM28XX_VMUX_SVIDEO,
+ .vmux = TVP5150_SVIDEO,
+ .amux = EM28XX_AMUX_LINE_IN,
+- .gpio = kworld_330u_analog,
++ .gpio = hauppauge_wintv_hvr_900_analog,
+ } },
+ },
+ [EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = {
+@@ -1265,7 +1249,7 @@
+ { USB_DEVICE(0xeb1a, 0xe310),
+ .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD },
+ { USB_DEVICE(0xeb1a, 0xa316),
+- .driver_info = EM2883_BOARD_KWORLD_HYBRID_330U },
++ .driver_info = EM2883_BOARD_KWORLD_HYBRID_A316 },
+ { USB_DEVICE(0xeb1a, 0xe320),
+ .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II },
+ { USB_DEVICE(0xeb1a, 0xe323),
+@@ -1542,10 +1526,6 @@
+ /* FIXME: Better to specify the needed IF */
+ ctl->demod = XC3028_FE_DEFAULT;
+ break;
+- case EM2883_BOARD_KWORLD_HYBRID_330U:
+- ctl->demod = XC3028_FE_CHINA;
+- ctl->fname = XC2028_DEFAULT_FIRMWARE;
+- break;
+ default:
+ ctl->demod = XC3028_FE_OREN538;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx-core.c linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx-core.c
+--- linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx-core.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx-core.c 2009-05-10 23:48:28.000000000 +0200
+@@ -438,10 +438,6 @@
+ if (dev->audio_mode.ac97 != EM28XX_NO_AC97) {
+ int vol;
+
+- em28xx_write_ac97(dev, AC97_POWER_DOWN_CTRL, 0x4200);
+- em28xx_write_ac97(dev, AC97_EXT_AUD_CTRL, 0x0031);
+- em28xx_write_ac97(dev, AC97_PCM_IN_SRATE, 0xbb80);
+-
+ /* LSB: left channel - both channels with the same level */
+ vol = (0x1f - dev->volume) | ((0x1f - dev->volume) << 8);
+
+@@ -458,15 +454,6 @@
+ em28xx_warn("couldn't setup AC97 register %d\n",
+ outputs[i].reg);
+ }
+-
+- if (dev->ctl_aoutput & EM28XX_AOUT_PCM_IN) {
+- int sel = ac97_return_record_select(dev->ctl_aoutput);
+-
+- /* Use the same input for both left and right channels */
+- sel |= (sel << 8);
+-
+- em28xx_write_ac97(dev, AC97_RECORD_SELECT, sel);
+- }
+ }
+
+ return ret;
+@@ -860,11 +847,8 @@
+ for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
+ urb = dev->isoc_ctl.urb[i];
+ if (urb) {
+- if (!irqs_disabled())
+- usb_kill_urb(urb);
+- else
+- usb_unlink_urb(urb);
+-
++ usb_kill_urb(urb);
++ usb_unlink_urb(urb);
+ if (dev->isoc_ctl.transfer_buffer[i]) {
+ usb_buffer_free(dev->udev,
+ urb->transfer_buffer_length,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx-dvb.c linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx-dvb.c
+--- linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx-dvb.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx-dvb.c 2009-05-10 23:48:28.000000000 +0200
+@@ -28,7 +28,6 @@
+
+ #include "lgdt330x.h"
+ #include "zl10353.h"
+-#include "s5h1409.h"
+ #ifdef EM28XX_DRX397XD_SUPPORT
+ #include "drx397xD.h"
+ #endif
+@@ -233,15 +232,6 @@
+ .if2 = 45600,
+ };
+
+-static struct s5h1409_config em28xx_s5h1409_with_xc3028 = {
+- .demod_address = 0x32 >> 1,
+- .output_mode = S5H1409_PARALLEL_OUTPUT,
+- .gpio = S5H1409_GPIO_OFF,
+- .inversion = S5H1409_INVERSION_OFF,
+- .status_mode = S5H1409_DEMODLOCKING,
+- .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK
+-};
+-
+ #ifdef EM28XX_DRX397XD_SUPPORT
+ /* [TODO] djh - not sure yet what the device config needs to contain */
+ static struct drx397xD_config em28xx_drx397xD_with_xc3028 = {
+@@ -422,6 +412,7 @@
+ case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
+ case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
+ case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
++ case EM2883_BOARD_KWORLD_HYBRID_A316:
+ case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
+ dvb->frontend = dvb_attach(lgdt330x_attach,
+ &em2880_lgdt3303_dev,
+@@ -442,15 +433,6 @@
+ goto out_free;
+ }
+ break;
+- case EM2883_BOARD_KWORLD_HYBRID_330U:
+- dvb->frontend = dvb_attach(s5h1409_attach,
+- &em28xx_s5h1409_with_xc3028,
+- &dev->i2c_adap);
+- if (attach_xc3028(0x61, dev) < 0) {
+- result = -EINVAL;
+- goto out_free;
+- }
+- break;
+ case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
+ #ifdef EM28XX_DRX397XD_SUPPORT
+ /* We don't have the config structure properly populated, so
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx.h linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx.h
+--- linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx.h 2009-05-10 23:48:28.000000000 +0200
+@@ -94,7 +94,7 @@
+ #define EM2882_BOARD_KWORLD_VS_DVBT 54
+ #define EM2882_BOARD_TERRATEC_HYBRID_XS 55
+ #define EM2882_BOARD_PINNACLE_HYBRID_PRO 56
+-#define EM2883_BOARD_KWORLD_HYBRID_330U 57
++#define EM2883_BOARD_KWORLD_HYBRID_A316 57
+ #define EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU 58
+ #define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 60
+ #define EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2 61
+@@ -300,32 +300,13 @@
+ };
+
+ enum em28xx_aout {
+- /* AC97 outputs */
+ EM28XX_AOUT_MASTER = 1 << 0,
+ EM28XX_AOUT_LINE = 1 << 1,
+ EM28XX_AOUT_MONO = 1 << 2,
+ EM28XX_AOUT_LFE = 1 << 3,
+ EM28XX_AOUT_SURR = 1 << 4,
+-
+- /* PCM IN Mixer - used by AC97_RECORD_SELECT register */
+- EM28XX_AOUT_PCM_IN = 1 << 7,
+-
+- /* Bits 10-8 are used to indicate the PCM IN record select */
+- EM28XX_AOUT_PCM_MIC_PCM = 0 << 8,
+- EM28XX_AOUT_PCM_CD = 1 << 8,
+- EM28XX_AOUT_PCM_VIDEO = 2 << 8,
+- EM28XX_AOUT_PCM_AUX = 3 << 8,
+- EM28XX_AOUT_PCM_LINE = 4 << 8,
+- EM28XX_AOUT_PCM_STEREO = 5 << 8,
+- EM28XX_AOUT_PCM_MONO = 6 << 8,
+- EM28XX_AOUT_PCM_PHONE = 7 << 8,
+ };
+
+-static inline int ac97_return_record_select(int a_out)
+-{
+- return (a_out & 0x700) >> 8;
+-}
+-
+ struct em28xx_reg_seq {
+ int reg;
+ unsigned char val, mask;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx-video.c linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx-video.c
+--- linux-2.6.29.owrt/drivers/media/video/em28xx/em28xx-video.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/em28xx/em28xx-video.c 2009-05-10 23:48:28.000000000 +0200
+@@ -886,10 +886,10 @@
+ if (0 == INPUT(i)->type)
+ return -EINVAL;
+
+- dev->ctl_input = i;
+-
+ mutex_lock(&dev->lock);
+- video_mux(dev, dev->ctl_input);
++
++ video_mux(dev, i);
++
+ mutex_unlock(&dev->lock);
+ return 0;
+ }
+@@ -939,12 +939,6 @@
+ struct em28xx_fh *fh = priv;
+ struct em28xx *dev = fh->dev;
+
+-
+- if (a->index >= MAX_EM28XX_INPUT)
+- return -EINVAL;
+- if (0 == INPUT(a->index)->type)
+- return -EINVAL;
+-
+ mutex_lock(&dev->lock);
+
+ dev->ctl_ainput = INPUT(a->index)->amux;
+@@ -1956,7 +1950,6 @@
+
+ int em28xx_register_analog_devices(struct em28xx *dev)
+ {
+- u8 val;
+ int ret;
+
+ printk(KERN_INFO "%s: v4l2 driver version %d.%d.%d\n",
+@@ -1964,34 +1957,34 @@
+ (EM28XX_VERSION_CODE >> 16) & 0xff,
+ (EM28XX_VERSION_CODE >> 8) & 0xff, EM28XX_VERSION_CODE & 0xff);
+
+- /* set default norm */
+- dev->norm = em28xx_video_template.current_norm;
+- dev->width = norm_maxw(dev);
+- dev->height = norm_maxh(dev);
+- dev->interlaced = EM28XX_INTERLACED_DEFAULT;
+- dev->hscale = 0;
+- dev->vscale = 0;
+- dev->ctl_input = 0;
+-
+ /* Analog specific initialization */
+ dev->format = &format[0];
+- video_mux(dev, dev->ctl_input);
+-
+- /* Audio defaults */
+- dev->mute = 1;
+- dev->volume = 0x1f;
++ video_mux(dev, 0);
+
+ /* enable vbi capturing */
+
+ /* em28xx_write_reg(dev, EM28XX_R0E_AUDIOSRC, 0xc0); audio register */
+- val = (u8)em28xx_read_reg(dev, EM28XX_R0F_XCLK);
+- em28xx_write_reg(dev, EM28XX_R0F_XCLK, (EM28XX_XCLK_AUDIO_UNMUTE | val));
++/* em28xx_write_reg(dev, EM28XX_R0F_XCLK, 0x80); clk register */
+ em28xx_write_reg(dev, EM28XX_R11_VINCTRL, 0x51);
+
++ dev->mute = 1; /* maybe not the right place... */
++ dev->volume = 0x1f;
++
+ em28xx_set_outfmt(dev);
+ em28xx_colorlevels_set_default(dev);
+ em28xx_compression_disable(dev);
+
++ /* set default norm */
++ dev->norm = em28xx_video_template.current_norm;
++ dev->width = norm_maxw(dev);
++ dev->height = norm_maxh(dev);
++ dev->interlaced = EM28XX_INTERLACED_DEFAULT;
++ dev->hscale = 0;
++ dev->vscale = 0;
++
++ /* FIXME: This is a very bad hack! Not all devices have TV on input 2 */
++ dev->ctl_input = 2;
++
+ /* allocate and fill video video_device struct */
+ dev->vdev = em28xx_vdev_init(dev, &em28xx_video_template, "video");
+ if (!dev->vdev) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/gspca/gspca.c linux-2.6.29-rc3.owrt/drivers/media/video/gspca/gspca.c
+--- linux-2.6.29.owrt/drivers/media/video/gspca/gspca.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/gspca/gspca.c 2009-05-10 23:48:28.000000000 +0200
+@@ -422,10 +422,8 @@
+ if (urb == NULL)
+ break;
+
+- BUG_ON(!gspca_dev->dev);
+ gspca_dev->urb[i] = NULL;
+- if (!gspca_dev->present)
+- usb_kill_urb(urb);
++ usb_kill_urb(urb);
+ if (urb->transfer_buffer != NULL)
+ usb_buffer_free(gspca_dev->dev,
+ urb->transfer_buffer_length,
+@@ -1951,12 +1949,9 @@
+ {
+ struct gspca_dev *gspca_dev = usb_get_intfdata(intf);
+
+- mutex_lock(&gspca_dev->usb_lock);
+ gspca_dev->present = 0;
+- mutex_unlock(&gspca_dev->usb_lock);
++ gspca_dev->streaming = 0;
+
+- destroy_urbs(gspca_dev);
+- gspca_dev->dev = NULL;
+ usb_set_intfdata(intf, NULL);
+
+ /* release the device */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/gspca/m5602/m5602_s5k4aa.c linux-2.6.29-rc3.owrt/drivers/media/video/gspca/m5602/m5602_s5k4aa.c
+--- linux-2.6.29.owrt/drivers/media/video/gspca/m5602/m5602_s5k4aa.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/gspca/m5602/m5602_s5k4aa.c 2009-05-10 23:48:28.000000000 +0200
+@@ -102,11 +102,7 @@
+ }
+
+ /* Test some registers, but we don't know their exact meaning yet */
+- if (m5602_read_sensor(sd, 0x00, prod_id, 2))
+- return -ENODEV;
+- if (m5602_read_sensor(sd, 0x02, prod_id+2, 2))
+- return -ENODEV;
+- if (m5602_read_sensor(sd, 0x04, prod_id+4, 2))
++ if (m5602_read_sensor(sd, 0x00, prod_id, sizeof(prod_id)))
+ return -ENODEV;
+
+ if (memcmp(prod_id, expected_prod_id, sizeof(prod_id)))
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/ivtv/ivtv-driver.c linux-2.6.29-rc3.owrt/drivers/media/video/ivtv/ivtv-driver.c
+--- linux-2.6.29.owrt/drivers/media/video/ivtv/ivtv-driver.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/ivtv/ivtv-driver.c 2009-05-10 23:48:28.000000000 +0200
+@@ -949,10 +949,8 @@
+ itv->instance = atomic_inc_return(&ivtv_instance) - 1;
+
+ retval = v4l2_device_register(&dev->dev, &itv->device);
+- if (retval) {
+- kfree(itv);
++ if (retval)
+ return retval;
+- }
+ /* "ivtv + PCI ID" is a bit of a mouthful, so use
+ "ivtv + instance" instead. */
+ snprintf(itv->device.name, sizeof(itv->device.name),
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/ivtv/ivtv-ioctl.c linux-2.6.29-rc3.owrt/drivers/media/video/ivtv/ivtv-ioctl.c
+--- linux-2.6.29.owrt/drivers/media/video/ivtv/ivtv-ioctl.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/ivtv/ivtv-ioctl.c 2009-05-10 23:48:28.000000000 +0200
+@@ -393,7 +393,7 @@
+ return 0;
+ }
+
+- v4l2_subdev_call(itv->sd_video, video, g_fmt, fmt);
++ v4l2_subdev_call(itv->sd_video, video, s_fmt, fmt);
+ vbifmt->service_set = ivtv_get_service_set(vbifmt);
+ return 0;
+ }
+@@ -1748,18 +1748,6 @@
+ break;
+ }
+
+- case IVTV_IOC_DMA_FRAME:
+- case VIDEO_GET_PTS:
+- case VIDEO_GET_FRAME_COUNT:
+- case VIDEO_GET_EVENT:
+- case VIDEO_PLAY:
+- case VIDEO_STOP:
+- case VIDEO_FREEZE:
+- case VIDEO_CONTINUE:
+- case VIDEO_COMMAND:
+- case VIDEO_TRY_COMMAND:
+- return ivtv_decoder_ioctls(file, cmd, (void *)arg);
+-
+ default:
+ return -EINVAL;
+ }
+@@ -1802,6 +1790,18 @@
+ ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode);
+ return 0;
+
++ case IVTV_IOC_DMA_FRAME:
++ case VIDEO_GET_PTS:
++ case VIDEO_GET_FRAME_COUNT:
++ case VIDEO_GET_EVENT:
++ case VIDEO_PLAY:
++ case VIDEO_STOP:
++ case VIDEO_FREEZE:
++ case VIDEO_CONTINUE:
++ case VIDEO_COMMAND:
++ case VIDEO_TRY_COMMAND:
++ return ivtv_decoder_ioctls(filp, cmd, (void *)arg);
++
+ default:
+ break;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/pwc/pwc-if.c linux-2.6.29-rc3.owrt/drivers/media/video/pwc/pwc-if.c
+--- linux-2.6.29.owrt/drivers/media/video/pwc/pwc-if.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/pwc/pwc-if.c 2009-05-10 23:48:28.000000000 +0200
+@@ -62,6 +62,7 @@
+ #include <linux/poll.h>
+ #include <linux/slab.h>
+ #include <linux/vmalloc.h>
++#include <linux/version.h>
+ #include <asm/io.h>
+
+ #include "pwc.h"
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/pxa_camera.c linux-2.6.29-rc3.owrt/drivers/media/video/pxa_camera.c
+--- linux-2.6.29.owrt/drivers/media/video/pxa_camera.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/pxa_camera.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1155,24 +1155,24 @@
+ {
+ struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
+ struct pxa_camera_dev *pcdev = ici->priv;
+- const struct soc_camera_data_format *cam_fmt = NULL;
+- const struct soc_camera_format_xlate *xlate = NULL;
++ const struct soc_camera_data_format *host_fmt, *cam_fmt = NULL;
++ const struct soc_camera_format_xlate *xlate;
+ struct soc_camera_sense sense = {
+ .master_clock = pcdev->mclk,
+ .pixel_clock_max = pcdev->ciclk / 4,
+ };
+- int ret;
++ int ret, buswidth;
+
+- if (pixfmt) {
+- xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
+- if (!xlate) {
+- dev_warn(&ici->dev, "Format %x not found\n", pixfmt);
+- return -EINVAL;
+- }
+-
+- cam_fmt = xlate->cam_fmt;
++ xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
++ if (!xlate) {
++ dev_warn(&ici->dev, "Format %x not found\n", pixfmt);
++ return -EINVAL;
+ }
+
++ buswidth = xlate->buswidth;
++ host_fmt = xlate->host_fmt;
++ cam_fmt = xlate->cam_fmt;
++
+ /* If PCLK is used to latch data from the sensor, check sense */
+ if (pcdev->platform_flags & PXA_CAMERA_PCLK_EN)
+ icd->sense = &sense;
+@@ -1201,8 +1201,8 @@
+ }
+
+ if (pixfmt && !ret) {
+- icd->buswidth = xlate->buswidth;
+- icd->current_fmt = xlate->host_fmt;
++ icd->buswidth = buswidth;
++ icd->current_fmt = host_fmt;
+ }
+
+ return ret;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/saa7127.c linux-2.6.29-rc3.owrt/drivers/media/video/saa7127.c
+--- linux-2.6.29.owrt/drivers/media/video/saa7127.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/saa7127.c 2009-05-10 23:48:28.000000000 +0200
+@@ -149,7 +149,7 @@
+ { SAA7127_REG_COPYGEN_0, 0x77 },
+ { SAA7127_REG_COPYGEN_1, 0x41 },
+ { SAA7127_REG_COPYGEN_2, 0x00 }, /* Macrovision enable/disable */
+- { SAA7127_REG_OUTPUT_PORT_CONTROL, 0xbf },
++ { SAA7127_REG_OUTPUT_PORT_CONTROL, 0x9e },
+ { SAA7127_REG_GAIN_LUMINANCE_RGB, 0x00 },
+ { SAA7127_REG_GAIN_COLORDIFF_RGB, 0x00 },
+ { SAA7127_REG_INPUT_PORT_CONTROL_1, 0x80 }, /* for color bars */
+@@ -488,18 +488,12 @@
+ break;
+
+ case SAA7127_OUTPUT_TYPE_COMPOSITE:
+- if (state->ident == V4L2_IDENT_SAA7129)
+- state->reg_2d = 0x20; /* CVBS only */
+- else
+- state->reg_2d = 0x08; /* 00001000 CVBS only, RGB DAC's off (high impedance mode) */
++ state->reg_2d = 0x08; /* 00001000 CVBS only, RGB DAC's off (high impedance mode) */
+ state->reg_3a = 0x13; /* by default switch YUV to RGB-matrix on */
+ break;
+
+ case SAA7127_OUTPUT_TYPE_SVIDEO:
+- if (state->ident == V4L2_IDENT_SAA7129)
+- state->reg_2d = 0x18; /* Y + C */
+- else
+- state->reg_2d = 0xff; /*11111111 croma -> R, luma -> CVBS + G + B */
++ state->reg_2d = 0xff; /* 11111111 croma -> R, luma -> CVBS + G + B */
+ state->reg_3a = 0x13; /* by default switch YUV to RGB-matrix on */
+ break;
+
+@@ -514,10 +508,7 @@
+ break;
+
+ case SAA7127_OUTPUT_TYPE_BOTH:
+- if (state->ident == V4L2_IDENT_SAA7129)
+- state->reg_2d = 0x38;
+- else
+- state->reg_2d = 0xbf;
++ state->reg_2d = 0xbf;
+ state->reg_3a = 0x13; /* by default switch YUV to RGB-matrix on */
+ break;
+
+@@ -740,6 +731,24 @@
+ return -ENODEV;
+ }
+
++ /* Configure Encoder */
++
++ v4l2_dbg(1, debug, sd, "Configuring encoder\n");
++ saa7127_write_inittab(sd, saa7127_init_config_common);
++ saa7127_set_std(sd, V4L2_STD_NTSC);
++ saa7127_set_output_type(sd, SAA7127_OUTPUT_TYPE_BOTH);
++ saa7127_set_vps(sd, &vbi);
++ saa7127_set_wss(sd, &vbi);
++ saa7127_set_cc(sd, &vbi);
++ saa7127_set_xds(sd, &vbi);
++ if (test_image == 1)
++ /* The Encoder has an internal Colorbar generator */
++ /* This can be used for debugging */
++ saa7127_set_input_type(sd, SAA7127_INPUT_TYPE_TEST_IMAGE);
++ else
++ saa7127_set_input_type(sd, SAA7127_INPUT_TYPE_NORMAL);
++ saa7127_set_video_enable(sd, 1);
++
+ if (id->driver_data) { /* Chip type is already known */
+ state->ident = id->driver_data;
+ } else { /* Needs detection */
+@@ -761,23 +770,6 @@
+
+ v4l2_info(sd, "%s found @ 0x%x (%s)\n", client->name,
+ client->addr << 1, client->adapter->name);
+-
+- v4l2_dbg(1, debug, sd, "Configuring encoder\n");
+- saa7127_write_inittab(sd, saa7127_init_config_common);
+- saa7127_set_std(sd, V4L2_STD_NTSC);
+- saa7127_set_output_type(sd, SAA7127_OUTPUT_TYPE_BOTH);
+- saa7127_set_vps(sd, &vbi);
+- saa7127_set_wss(sd, &vbi);
+- saa7127_set_cc(sd, &vbi);
+- saa7127_set_xds(sd, &vbi);
+- if (test_image == 1)
+- /* The Encoder has an internal Colorbar generator */
+- /* This can be used for debugging */
+- saa7127_set_input_type(sd, SAA7127_INPUT_TYPE_TEST_IMAGE);
+- else
+- saa7127_set_input_type(sd, SAA7127_INPUT_TYPE_NORMAL);
+- saa7127_set_video_enable(sd, 1);
+-
+ if (state->ident == V4L2_IDENT_SAA7129)
+ saa7127_write_inittab(sd, saa7129_init_config_extra);
+ return 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/saa7134/saa7134-alsa.c linux-2.6.29-rc3.owrt/drivers/media/video/saa7134/saa7134-alsa.c
+--- linux-2.6.29.owrt/drivers/media/video/saa7134/saa7134-alsa.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/saa7134/saa7134-alsa.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1089,11 +1089,7 @@
+
+ list_for_each(list,&saa7134_devlist) {
+ dev = list_entry(list, struct saa7134_dev, devlist);
+- if (dev->pci->device == PCI_DEVICE_ID_PHILIPS_SAA7130)
+- printk(KERN_INFO "%s/alsa: %s doesn't support digital audio\n",
+- dev->name, saa7134_boards[dev->board].name);
+- else
+- alsa_device_init(dev);
++ alsa_device_init(dev);
+ }
+
+ if (dev == NULL)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/saa7134/saa7134-core.c linux-2.6.29-rc3.owrt/drivers/media/video/saa7134/saa7134-core.c
+--- linux-2.6.29.owrt/drivers/media/video/saa7134/saa7134-core.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/saa7134/saa7134-core.c 2009-05-10 23:48:28.000000000 +0200
+@@ -660,10 +660,6 @@
+
+ saa_writel(SAA7134_IRQ1, 0);
+ saa_writel(SAA7134_IRQ2, 0);
+-
+- /* Clear any stale IRQ reports */
+- saa_writel(SAA7134_IRQ_REPORT, saa_readl(SAA7134_IRQ_REPORT));
+-
+ mutex_init(&dev->lock);
+ spin_lock_init(&dev->slock);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/saa7134/saa7134-dvb.c linux-2.6.29-rc3.owrt/drivers/media/video/saa7134/saa7134-dvb.c
+--- linux-2.6.29.owrt/drivers/media/video/saa7134/saa7134-dvb.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/saa7134/saa7134-dvb.c 2009-05-10 23:48:28.000000000 +0200
+@@ -860,7 +860,6 @@
+ .demod_address = 0x1e>>1,
+ .no_tuner = 1,
+ .parallel_ts = 1,
+- .disable_i2c_gate_ctrl = 1,
+ };
+
+ /* ==================================================================
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/saa717x.c linux-2.6.29-rc3.owrt/drivers/media/video/saa717x.c
+--- linux-2.6.29.owrt/drivers/media/video/saa717x.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/saa717x.c 2009-05-10 23:48:28.000000000 +0200
+@@ -30,6 +30,7 @@
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
++#include <linux/version.h>
+ #include <linux/module.h>
+ #include <linux/kernel.h>
+ #include <linux/sched.h>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/sh_mobile_ceu_camera.c linux-2.6.29-rc3.owrt/drivers/media/video/sh_mobile_ceu_camera.c
+--- linux-2.6.29.owrt/drivers/media/video/sh_mobile_ceu_camera.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/sh_mobile_ceu_camera.c 2009-05-10 23:48:28.000000000 +0200
+@@ -603,18 +603,21 @@
+ const struct soc_camera_format_xlate *xlate;
+ int ret;
+
+- if (!pixfmt)
+- return icd->ops->set_fmt(icd, pixfmt, rect);
+-
+ xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
+ if (!xlate) {
+ dev_warn(&ici->dev, "Format %x not found\n", pixfmt);
+ return -EINVAL;
+ }
+
+- ret = icd->ops->set_fmt(icd, xlate->cam_fmt->fourcc, rect);
++ switch (pixfmt) {
++ case 0: /* Only geometry change */
++ ret = icd->ops->set_fmt(icd, pixfmt, rect);
++ break;
++ default:
++ ret = icd->ops->set_fmt(icd, xlate->cam_fmt->fourcc, rect);
++ }
+
+- if (!ret) {
++ if (pixfmt && !ret) {
+ icd->buswidth = xlate->buswidth;
+ icd->current_fmt = xlate->host_fmt;
+ pcdev->camera_fmt = xlate->cam_fmt;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/tda9875.c linux-2.6.29-rc3.owrt/drivers/media/video/tda9875.c
+--- linux-2.6.29.owrt/drivers/media/video/tda9875.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/tda9875.c 2009-05-10 23:48:28.000000000 +0200
+@@ -242,7 +242,7 @@
+ static int tda9875_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
+ {
+ struct tda9875 *t = to_state(sd);
+- int chvol = 0, volume = 0, balance = 0, left, right;
++ int chvol=0, volume, balance, left, right;
+
+ switch (ctrl->id) {
+ case V4L2_CID_AUDIO_VOLUME:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/tvaudio.c linux-2.6.29-rc3.owrt/drivers/media/video/tvaudio.c
+--- linux-2.6.29.owrt/drivers/media/video/tvaudio.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/tvaudio.c 2009-05-10 23:48:28.000000000 +0200
+@@ -54,7 +54,7 @@
+ /* ---------------------------------------------------------------------- */
+ /* our structs */
+
+-#define MAXREGS 256
++#define MAXREGS 64
+
+ struct CHIPSTATE;
+ typedef int (*getvalue)(int);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/tveeprom.c linux-2.6.29-rc3.owrt/drivers/media/video/tveeprom.c
+--- linux-2.6.29.owrt/drivers/media/video/tveeprom.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/tveeprom.c 2009-05-10 23:48:28.000000000 +0200
+@@ -427,9 +427,6 @@
+ const char *t_fmt_name2[8] = { " none", "", "", "", "", "", "", "" };
+
+ memset(tvee, 0, sizeof(*tvee));
+- tvee->tuner_type = TUNER_ABSENT;
+- tvee->tuner2_type = TUNER_ABSENT;
+-
+ done = len = beenhere = 0;
+
+ /* Different eeprom start offsets for em28xx, cx2388x and cx23418 */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/tvp514x.c linux-2.6.29-rc3.owrt/drivers/media/video/tvp514x.c
+--- linux-2.6.29.owrt/drivers/media/video/tvp514x.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/tvp514x.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1401,7 +1401,7 @@
+
+ decoder->pdata = client->dev.platform_data;
+ if (!decoder->pdata) {
+- v4l_err(client, "No platform data!!\n");
++ v4l_err(client, "No platform data\n!!");
+ return -ENODEV;
+ }
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/upd64031a.c linux-2.6.29-rc3.owrt/drivers/media/video/upd64031a.c
+--- linux-2.6.29.owrt/drivers/media/video/upd64031a.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/upd64031a.c 2009-05-10 23:48:28.000000000 +0200
+@@ -21,6 +21,7 @@
+ */
+
+
++#include <linux/version.h>
+ #include <linux/module.h>
+ #include <linux/kernel.h>
+ #include <linux/i2c.h>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/upd64083.c linux-2.6.29-rc3.owrt/drivers/media/video/upd64083.c
+--- linux-2.6.29.owrt/drivers/media/video/upd64083.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/upd64083.c 2009-05-10 23:48:28.000000000 +0200
+@@ -21,6 +21,7 @@
+ * 02110-1301, USA.
+ */
+
++#include <linux/version.h>
+ #include <linux/module.h>
+ #include <linux/kernel.h>
+ #include <linux/i2c.h>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/usbvision/usbvision-i2c.c linux-2.6.29-rc3.owrt/drivers/media/video/usbvision/usbvision-i2c.c
+--- linux-2.6.29.owrt/drivers/media/video/usbvision/usbvision-i2c.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/usbvision/usbvision-i2c.c 2009-05-10 23:48:28.000000000 +0200
+@@ -157,7 +157,7 @@
+ struct i2c_msg *pmsg;
+ struct usb_usbvision *usbvision;
+ int i, ret;
+- unsigned char addr = 0;
++ unsigned char addr;
+
+ usbvision = (struct usb_usbvision *)i2c_get_adapdata(i2c_adap);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/uvc/uvc_ctrl.c linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_ctrl.c
+--- linux-2.6.29.owrt/drivers/media/video/uvc/uvc_ctrl.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_ctrl.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ /*
+ * uvc_ctrl.c -- USB Video Class driver - Controls
+ *
+- * Copyright (C) 2005-2009
++ * Copyright (C) 2005-2008
+ * Laurent Pinchart (laurent.pinchart@skynet.be)
+ *
+ * This program is free software; you can redistribute it and/or modify
+@@ -12,6 +12,7 @@
+ */
+
+ #include <linux/kernel.h>
++#include <linux/version.h>
+ #include <linux/list.h>
+ #include <linux/module.h>
+ #include <linux/uaccess.h>
+@@ -28,7 +29,7 @@
+ #define UVC_CTRL_DATA_BACKUP 1
+
+ /* ------------------------------------------------------------------------
+- * Controls
++ * Control, formats, ...
+ */
+
+ static struct uvc_control_info uvc_ctrls[] = {
+@@ -634,7 +635,7 @@
+ mask = (1 << bits) - 1;
+ }
+
+- /* Sign-extend the value if needed. */
++ /* Sign-extend the value if needed */
+ if (mapping->data_type == UVC_CTRL_DATA_TYPE_SIGNED)
+ value |= -(value & (1 << (mapping->size - 1)));
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/uvc/uvc_driver.c linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_driver.c
+--- linux-2.6.29.owrt/drivers/media/video/uvc/uvc_driver.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_driver.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ /*
+ * uvc_driver.c -- USB Video Class driver
+ *
+- * Copyright (C) 2005-2009
++ * Copyright (C) 2005-2008
+ * Laurent Pinchart (laurent.pinchart@skynet.be)
+ *
+ * This program is free software; you can redistribute it and/or modify
+@@ -24,6 +24,7 @@
+ */
+
+ #include <linux/kernel.h>
++#include <linux/version.h>
+ #include <linux/list.h>
+ #include <linux/module.h>
+ #include <linux/usb.h>
+@@ -48,7 +49,7 @@
+ unsigned int uvc_trace_param;
+
+ /* ------------------------------------------------------------------------
+- * Video formats
++ * Control, formats, ...
+ */
+
+ static struct uvc_format_desc uvc_fmts[] = {
+@@ -473,7 +474,7 @@
+
+ /* Several UVC chipsets screw up dwMaxVideoFrameBufferSize
+ * completely. Observed behaviours range from setting the
+- * value to 1.1x the actual frame size to hardwiring the
++ * value to 1.1x the actual frame size of hardwiring the
+ * 16 low bits to 0. This results in a higher than necessary
+ * memory usage as well as a wrong image size information. For
+ * uncompressed formats this can be fixed by computing the
+@@ -486,7 +487,7 @@
+ /* Some bogus devices report dwMinFrameInterval equal to
+ * dwMaxFrameInterval and have dwFrameIntervalStep set to
+ * zero. Setting all null intervals to 1 fixes the problem and
+- * some other divisions by zero that could happen.
++ * some other divisions by zero which could happen.
+ */
+ for (i = 0; i < n; ++i) {
+ interval = get_unaligned_le32(&buffer[26+4*i]);
+@@ -1199,13 +1200,13 @@
+ * Scan the UVC descriptors to locate a chain starting at an Output Terminal
+ * and containing the following units:
+ *
+- * - one Output Terminal (USB Streaming or Display)
++ * - a USB Streaming Output Terminal
+ * - zero or one Processing Unit
+ * - zero, one or mode single-input Selector Units
+ * - zero or one multiple-input Selector Units, provided all inputs are
+ * connected to input terminals
+ * - zero, one or mode single-input Extension Units
+- * - one or more Input Terminals (Camera, External or USB Streaming)
++ * - one Camera Input Terminal, or one or more External terminals.
+ *
+ * A side forward scan is made on each detected entity to check for additional
+ * extension units.
+@@ -1530,6 +1531,10 @@
+
+ /* Set the driver data before calling video_register_device, otherwise
+ * uvc_v4l2_open might race us.
++ *
++ * FIXME: usb_set_intfdata hasn't been called so far. Is that a
++ * problem ? Does any function which could be called here get
++ * a pointer to the usb_interface ?
+ */
+ dev->video.vdev = vdev;
+ video_set_drvdata(vdev, &dev->video);
+@@ -1564,7 +1569,7 @@
+ struct uvc_device *dev = container_of(kref, struct uvc_device, kref);
+ struct list_head *p, *n;
+
+- /* Unregister the video device. */
++ /* Unregister the video device */
+ uvc_unregister_video(dev);
+ usb_put_intf(dev->intf);
+ usb_put_dev(dev->udev);
+@@ -1607,7 +1612,7 @@
+ uvc_trace(UVC_TRACE_PROBE, "Probing generic UVC device %s\n",
+ udev->devpath);
+
+- /* Allocate memory for the device and initialize it. */
++ /* Allocate memory for the device and initialize it */
+ if ((dev = kzalloc(sizeof *dev, GFP_KERNEL)) == NULL)
+ return -ENOMEM;
+
+@@ -1628,14 +1633,14 @@
+ le16_to_cpu(udev->descriptor.idVendor),
+ le16_to_cpu(udev->descriptor.idProduct));
+
+- /* Parse the Video Class control descriptor. */
++ /* Parse the Video Class control descriptor */
+ if (uvc_parse_control(dev) < 0) {
+ uvc_trace(UVC_TRACE_PROBE, "Unable to parse UVC "
+ "descriptors.\n");
+ goto error;
+ }
+
+- uvc_printk(KERN_INFO, "Found UVC %u.%02x device %s (%04x:%04x)\n",
++ uvc_printk(KERN_INFO, "Found UVC %u.%02u device %s (%04x:%04x)\n",
+ dev->uvc_version >> 8, dev->uvc_version & 0xff,
+ udev->product ? udev->product : "<unnamed>",
+ le16_to_cpu(udev->descriptor.idVendor),
+@@ -1648,18 +1653,18 @@
+ "linux-uvc-devel mailing list.\n");
+ }
+
+- /* Initialize controls. */
++ /* Initialize controls */
+ if (uvc_ctrl_init_device(dev) < 0)
+ goto error;
+
+- /* Register the video devices. */
++ /* Register the video devices */
+ if (uvc_register_video(dev) < 0)
+ goto error;
+
+- /* Save our data pointer in the interface data. */
++ /* Save our data pointer in the interface data */
+ usb_set_intfdata(intf, dev);
+
+- /* Initialize the interrupt URB. */
++ /* Initialize the interrupt URB */
+ if ((ret = uvc_status_init(dev)) < 0) {
+ uvc_printk(KERN_INFO, "Unable to initialize the status "
+ "endpoint (%d), status interrupt will not be "
+@@ -1834,24 +1839,24 @@
+ .bInterfaceSubClass = 1,
+ .bInterfaceProtocol = 0 },
+ /* Apple Built-In iSight */
+- { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
+ | USB_DEVICE_ID_MATCH_INT_INFO,
+ .idVendor = 0x05ac,
+ .idProduct = 0x8501,
+- .bInterfaceClass = USB_CLASS_VIDEO,
+- .bInterfaceSubClass = 1,
+- .bInterfaceProtocol = 0,
++ .bInterfaceClass = USB_CLASS_VIDEO,
++ .bInterfaceSubClass = 1,
++ .bInterfaceProtocol = 0,
+ .driver_info = UVC_QUIRK_PROBE_MINMAX
+ | UVC_QUIRK_BUILTIN_ISIGHT },
+ /* Genesys Logic USB 2.0 PC Camera */
+- { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
+ | USB_DEVICE_ID_MATCH_INT_INFO,
+- .idVendor = 0x05e3,
+- .idProduct = 0x0505,
+- .bInterfaceClass = USB_CLASS_VIDEO,
+- .bInterfaceSubClass = 1,
+- .bInterfaceProtocol = 0,
+- .driver_info = UVC_QUIRK_STREAM_NO_FID },
++ .idVendor = 0x05e3,
++ .idProduct = 0x0505,
++ .bInterfaceClass = USB_CLASS_VIDEO,
++ .bInterfaceSubClass = 1,
++ .bInterfaceProtocol = 0,
++ .driver_info = UVC_QUIRK_STREAM_NO_FID },
+ /* MT6227 */
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
+ | USB_DEVICE_ID_MATCH_INT_INFO,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/uvc/uvc_isight.c linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_isight.c
+--- linux-2.6.29.owrt/drivers/media/video/uvc/uvc_isight.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_isight.c 2009-05-10 23:48:28.000000000 +0200
+@@ -3,8 +3,6 @@
+ *
+ * Copyright (C) 2006-2007
+ * Ivan N. Zlatev <contact@i-nz.net>
+- * Copyright (C) 2008-2009
+- * Laurent Pinchart <laurent.pinchart@skynet.be>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/uvc/uvc_queue.c linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_queue.c
+--- linux-2.6.29.owrt/drivers/media/video/uvc/uvc_queue.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_queue.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ /*
+ * uvc_queue.c -- USB Video Class driver - Buffers management
+ *
+- * Copyright (C) 2005-2009
++ * Copyright (C) 2005-2008
+ * Laurent Pinchart (laurent.pinchart@skynet.be)
+ *
+ * This program is free software; you can redistribute it and/or modify
+@@ -12,6 +12,7 @@
+ */
+
+ #include <linux/kernel.h>
++#include <linux/version.h>
+ #include <linux/mm.h>
+ #include <linux/list.h>
+ #include <linux/module.h>
+@@ -36,22 +37,22 @@
+ * to user space will return -EBUSY.
+ *
+ * Video buffers are managed using two queues. However, unlike most USB video
+- * drivers that use an in queue and an out queue, we use a main queue to hold
+- * all queued buffers (both 'empty' and 'done' buffers), and an irq queue to
+- * hold empty buffers. This design (copied from video-buf) minimizes locking
+- * in interrupt, as only one queue is shared between interrupt and user
+- * contexts.
++ * drivers which use an in queue and an out queue, we use a main queue which
++ * holds all queued buffers (both 'empty' and 'done' buffers), and an irq
++ * queue which holds empty buffers. This design (copied from video-buf)
++ * minimizes locking in interrupt, as only one queue is shared between
++ * interrupt and user contexts.
+ *
+ * Use cases
+ * ---------
+ *
+- * Unless stated otherwise, all operations that modify the irq buffers queue
++ * Unless stated otherwise, all operations which modify the irq buffers queue
+ * are protected by the irq spinlock.
+ *
+ * 1. The user queues the buffers, starts streaming and dequeues a buffer.
+ *
+ * The buffers are added to the main and irq queues. Both operations are
+- * protected by the queue lock, and the later is protected by the irq
++ * protected by the queue lock, and the latert is protected by the irq
+ * spinlock as well.
+ *
+ * The completion handler fetches a buffer from the irq queue and fills it
+@@ -59,7 +60,7 @@
+ * returns immediately.
+ *
+ * When the buffer is full, the completion handler removes it from the irq
+- * queue, marks it as ready (UVC_BUF_STATE_DONE) and wakes its wait queue.
++ * queue, marks it as ready (UVC_BUF_STATE_DONE) and wake its wait queue.
+ * At that point, any process waiting on the buffer will be woken up. If a
+ * process tries to dequeue a buffer after it has been marked ready, the
+ * dequeing will succeed immediately.
+@@ -90,8 +91,8 @@
+ /*
+ * Allocate the video buffers.
+ *
+- * Pages are reserved to make sure they will not be swapped, as they will be
+- * filled in the URB completion handler.
++ * Pages are reserved to make sure they will not be swaped, as they will be
++ * filled in URB completion handler.
+ *
+ * Buffers will be individually mapped, so they must all be page aligned.
+ */
+@@ -209,8 +210,8 @@
+ __uvc_query_buffer(&queue->buffer[v4l2_buf->index], v4l2_buf);
+
+ done:
+- mutex_unlock(&queue->mutex);
+- return ret;
++ mutex_unlock(&queue->mutex);
++ return ret;
+ }
+
+ /*
+@@ -235,7 +236,7 @@
+ }
+
+ mutex_lock(&queue->mutex);
+- if (v4l2_buf->index >= queue->count) {
++ if (v4l2_buf->index >= queue->count) {
+ uvc_trace(UVC_TRACE_CAPTURE, "[E] Out of range index.\n");
+ ret = -EINVAL;
+ goto done;
+@@ -428,7 +429,7 @@
+ * Cancel the video buffers queue.
+ *
+ * Cancelling the queue marks all buffers on the irq queue as erroneous,
+- * wakes them up and removes them from the queue.
++ * wakes them up and remove them from the queue.
+ *
+ * If the disconnect parameter is set, further calls to uvc_queue_buffer will
+ * fail with -ENODEV.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/uvc/uvc_status.c linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_status.c
+--- linux-2.6.29.owrt/drivers/media/video/uvc/uvc_status.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_status.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ /*
+ * uvc_status.c -- USB Video Class driver - Status endpoint
+ *
+- * Copyright (C) 2007-2009
++ * Copyright (C) 2007-2008
+ * Laurent Pinchart (laurent.pinchart@skynet.be)
+ *
+ * This program is free software; you can redistribute it and/or modify
+@@ -12,6 +12,7 @@
+ */
+
+ #include <linux/kernel.h>
++#include <linux/version.h>
+ #include <linux/input.h>
+ #include <linux/usb.h>
+ #include <linux/usb/input.h>
+@@ -46,8 +47,8 @@
+ usb_to_input_id(udev, &input->id);
+ input->dev.parent = &dev->intf->dev;
+
+- __set_bit(EV_KEY, input->evbit);
+- __set_bit(KEY_CAMERA, input->keybit);
++ set_bit(EV_KEY, input->evbit);
++ set_bit(BTN_0, input->keybit);
+
+ if ((ret = input_register_device(input)) < 0)
+ goto error;
+@@ -70,10 +71,8 @@
+ static void uvc_input_report_key(struct uvc_device *dev, unsigned int code,
+ int value)
+ {
+- if (dev->input) {
++ if (dev->input)
+ input_report_key(dev->input, code, value);
+- input_sync(dev->input);
+- }
+ }
+
+ #else
+@@ -98,7 +97,7 @@
+ return;
+ uvc_trace(UVC_TRACE_STATUS, "Button (intf %u) %s len %d\n",
+ data[1], data[3] ? "pressed" : "released", len);
+- uvc_input_report_key(dev, KEY_CAMERA, data[3]);
++ uvc_input_report_key(dev, BTN_0, data[3]);
+ } else {
+ uvc_trace(UVC_TRACE_STATUS, "Stream %u error event %02x %02x "
+ "len %d.\n", data[1], data[2], data[3], len);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/uvc/uvc_v4l2.c linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_v4l2.c
+--- linux-2.6.29.owrt/drivers/media/video/uvc/uvc_v4l2.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_v4l2.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ /*
+ * uvc_v4l2.c -- USB Video Class driver - V4L2 API
+ *
+- * Copyright (C) 2005-2009
++ * Copyright (C) 2005-2008
+ * Laurent Pinchart (laurent.pinchart@skynet.be)
+ *
+ * This program is free software; you can redistribute it and/or modify
+@@ -37,7 +37,7 @@
+ * must be grouped (for instance the Red Balance, Blue Balance and Do White
+ * Balance V4L2 controls use the White Balance Component UVC control) or
+ * otherwise translated. The approach we take here is to use a translation
+- * table for the controls that can be mapped directly, and handle the others
++ * table for the controls which can be mapped directly, and handle the others
+ * manually.
+ */
+ static int uvc_v4l2_query_menu(struct uvc_video_device *video,
+@@ -189,7 +189,7 @@
+ probe->dwMaxVideoFrameSize =
+ video->streaming->ctrl.dwMaxVideoFrameSize;
+
+- /* Probe the device. */
++ /* Probe the device */
+ if ((ret = uvc_probe_video(video, probe)) < 0)
+ goto done;
+
+@@ -354,11 +354,11 @@
+ *
+ * Each open instance of a UVC device can either be in a privileged or
+ * unprivileged state. Only a single instance can be in a privileged state at
+- * a given time. Trying to perform an operation that requires privileges will
++ * a given time. Trying to perform an operation which requires privileges will
+ * automatically acquire the required privileges if possible, or return -EBUSY
+ * otherwise. Privileges are dismissed when closing the instance.
+ *
+- * Operations that require privileges are:
++ * Operations which require privileges are:
+ *
+ * - VIDIOC_S_INPUT
+ * - VIDIOC_S_PARM
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/uvc/uvc_video.c linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_video.c
+--- linux-2.6.29.owrt/drivers/media/video/uvc/uvc_video.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvc_video.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1,7 +1,7 @@
+ /*
+ * uvc_video.c -- USB Video Class driver - Video handling
+ *
+- * Copyright (C) 2005-2009
++ * Copyright (C) 2005-2008
+ * Laurent Pinchart (laurent.pinchart@skynet.be)
+ *
+ * This program is free software; you can redistribute it and/or modify
+@@ -12,6 +12,7 @@
+ */
+
+ #include <linux/kernel.h>
++#include <linux/version.h>
+ #include <linux/list.h>
+ #include <linux/module.h>
+ #include <linux/usb.h>
+@@ -114,7 +115,7 @@
+ ctrl->wCompQuality = le16_to_cpup((__le16 *)data);
+ ret = 0;
+ goto out;
+- } else if (query == GET_DEF && probe == 1 && ret != size) {
++ } else if (query == GET_DEF && probe == 1) {
+ /* Many cameras don't support the GET_DEF request on their
+ * video probe control. Warn once and return, the caller will
+ * fall back to GET_CUR.
+@@ -159,7 +160,7 @@
+ }
+
+ /* Some broken devices return a null or wrong dwMaxVideoFrameSize.
+- * Try to get the value from the format and frame descriptors.
++ * Try to get the value from the format and frame descriptor.
+ */
+ uvc_fixup_buffer_size(video, ctrl);
+ ret = 0;
+@@ -190,6 +191,9 @@
+ *(__le16 *)&data[12] = cpu_to_le16(ctrl->wCompQuality);
+ *(__le16 *)&data[14] = cpu_to_le16(ctrl->wCompWindowSize);
+ *(__le16 *)&data[16] = cpu_to_le16(ctrl->wDelay);
++ /* Note: Some of the fields below are not required for IN devices (see
++ * UVC spec, 4.3.1.1), but we still copy them in case support for OUT
++ * devices is added in the future. */
+ put_unaligned_le32(ctrl->dwMaxVideoFrameSize, &data[18]);
+ put_unaligned_le32(ctrl->dwMaxPayloadTransferSize, &data[22]);
+
+@@ -396,7 +400,7 @@
+ *
+ * Empty buffers (bytesused == 0) don't trigger end of frame detection
+ * as it doesn't make sense to return an empty buffer. This also
+- * avoids detecting end of frame conditions at FID toggling if the
++ * avoids detecting and of frame conditions at FID toggling if the
+ * previous payload had the EOF bit set.
+ */
+ if (fid != video->last_fid && buf->buf.bytesused != 0) {
+@@ -449,17 +453,6 @@
+ }
+ }
+
+-/* Video payload encoding is handled by uvc_video_encode_header() and
+- * uvc_video_encode_data(). Only bulk transfers are currently supported.
+- *
+- * uvc_video_encode_header is called at the start of a payload. It adds header
+- * data to the transfer buffer and returns the header size. As the only known
+- * UVC output device transfers a whole frame in a single payload, the EOF bit
+- * is always set in the header.
+- *
+- * uvc_video_encode_data is called for every URB and copies the data from the
+- * video buffer to the transfer buffer.
+- */
+ static int uvc_video_encode_header(struct uvc_video_device *video,
+ struct uvc_buffer *buf, __u8 *data, int len)
+ {
+@@ -960,7 +953,7 @@
+ }
+
+ /*
+- * Reconfigure the video interface and restart streaming if it was enabled
++ * Reconfigure the video interface and restart streaming if it was enable
+ * before suspend.
+ *
+ * If an error occurs, disable the video queue. This will wake all pending
+@@ -992,8 +985,8 @@
+ */
+
+ /*
+- * Initialize the UVC video device by switching to alternate setting 0 and
+- * retrieve the default format.
++ * Initialize the UVC video device by retrieving the default format and
++ * committing it.
+ *
+ * Some cameras (namely the Fuji Finepix) set the format and frame
+ * indexes to zero. The UVC standard doesn't clearly make this a spec
+@@ -1021,7 +1014,7 @@
+ */
+ usb_set_interface(video->dev->udev, video->streaming->intfnum, 0);
+
+- /* Some webcams don't suport GET_DEF requests on the probe control. We
++ /* Some webcams don't suport GET_DEF request on the probe control. We
+ * fall back to GET_CUR if GET_DEF fails.
+ */
+ if ((ret = uvc_get_video_ctrl(video, probe, 1, GET_DEF)) < 0 &&
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/uvc/uvcvideo.h linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvcvideo.h
+--- linux-2.6.29.owrt/drivers/media/video/uvc/uvcvideo.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/uvc/uvcvideo.h 2009-05-10 23:48:28.000000000 +0200
+@@ -72,149 +72,149 @@
+ * UVC constants
+ */
+
+-#define SC_UNDEFINED 0x00
+-#define SC_VIDEOCONTROL 0x01
+-#define SC_VIDEOSTREAMING 0x02
+-#define SC_VIDEO_INTERFACE_COLLECTION 0x03
+-
+-#define PC_PROTOCOL_UNDEFINED 0x00
+-
+-#define CS_UNDEFINED 0x20
+-#define CS_DEVICE 0x21
+-#define CS_CONFIGURATION 0x22
+-#define CS_STRING 0x23
+-#define CS_INTERFACE 0x24
+-#define CS_ENDPOINT 0x25
++#define SC_UNDEFINED 0x00
++#define SC_VIDEOCONTROL 0x01
++#define SC_VIDEOSTREAMING 0x02
++#define SC_VIDEO_INTERFACE_COLLECTION 0x03
++
++#define PC_PROTOCOL_UNDEFINED 0x00
++
++#define CS_UNDEFINED 0x20
++#define CS_DEVICE 0x21
++#define CS_CONFIGURATION 0x22
++#define CS_STRING 0x23
++#define CS_INTERFACE 0x24
++#define CS_ENDPOINT 0x25
+
+ /* VideoControl class specific interface descriptor */
+-#define VC_DESCRIPTOR_UNDEFINED 0x00
+-#define VC_HEADER 0x01
+-#define VC_INPUT_TERMINAL 0x02
+-#define VC_OUTPUT_TERMINAL 0x03
+-#define VC_SELECTOR_UNIT 0x04
+-#define VC_PROCESSING_UNIT 0x05
+-#define VC_EXTENSION_UNIT 0x06
++#define VC_DESCRIPTOR_UNDEFINED 0x00
++#define VC_HEADER 0x01
++#define VC_INPUT_TERMINAL 0x02
++#define VC_OUTPUT_TERMINAL 0x03
++#define VC_SELECTOR_UNIT 0x04
++#define VC_PROCESSING_UNIT 0x05
++#define VC_EXTENSION_UNIT 0x06
+
+ /* VideoStreaming class specific interface descriptor */
+-#define VS_UNDEFINED 0x00
+-#define VS_INPUT_HEADER 0x01
+-#define VS_OUTPUT_HEADER 0x02
+-#define VS_STILL_IMAGE_FRAME 0x03
+-#define VS_FORMAT_UNCOMPRESSED 0x04
+-#define VS_FRAME_UNCOMPRESSED 0x05
+-#define VS_FORMAT_MJPEG 0x06
+-#define VS_FRAME_MJPEG 0x07
+-#define VS_FORMAT_MPEG2TS 0x0a
+-#define VS_FORMAT_DV 0x0c
+-#define VS_COLORFORMAT 0x0d
+-#define VS_FORMAT_FRAME_BASED 0x10
+-#define VS_FRAME_FRAME_BASED 0x11
+-#define VS_FORMAT_STREAM_BASED 0x12
++#define VS_UNDEFINED 0x00
++#define VS_INPUT_HEADER 0x01
++#define VS_OUTPUT_HEADER 0x02
++#define VS_STILL_IMAGE_FRAME 0x03
++#define VS_FORMAT_UNCOMPRESSED 0x04
++#define VS_FRAME_UNCOMPRESSED 0x05
++#define VS_FORMAT_MJPEG 0x06
++#define VS_FRAME_MJPEG 0x07
++#define VS_FORMAT_MPEG2TS 0x0a
++#define VS_FORMAT_DV 0x0c
++#define VS_COLORFORMAT 0x0d
++#define VS_FORMAT_FRAME_BASED 0x10
++#define VS_FRAME_FRAME_BASED 0x11
++#define VS_FORMAT_STREAM_BASED 0x12
+
+ /* Endpoint type */
+-#define EP_UNDEFINED 0x00
+-#define EP_GENERAL 0x01
+-#define EP_ENDPOINT 0x02
+-#define EP_INTERRUPT 0x03
++#define EP_UNDEFINED 0x00
++#define EP_GENERAL 0x01
++#define EP_ENDPOINT 0x02
++#define EP_INTERRUPT 0x03
+
+ /* Request codes */
+-#define RC_UNDEFINED 0x00
+-#define SET_CUR 0x01
+-#define GET_CUR 0x81
+-#define GET_MIN 0x82
+-#define GET_MAX 0x83
+-#define GET_RES 0x84
+-#define GET_LEN 0x85
+-#define GET_INFO 0x86
+-#define GET_DEF 0x87
++#define RC_UNDEFINED 0x00
++#define SET_CUR 0x01
++#define GET_CUR 0x81
++#define GET_MIN 0x82
++#define GET_MAX 0x83
++#define GET_RES 0x84
++#define GET_LEN 0x85
++#define GET_INFO 0x86
++#define GET_DEF 0x87
+
+ /* VideoControl interface controls */
+-#define VC_CONTROL_UNDEFINED 0x00
+-#define VC_VIDEO_POWER_MODE_CONTROL 0x01
+-#define VC_REQUEST_ERROR_CODE_CONTROL 0x02
++#define VC_CONTROL_UNDEFINED 0x00
++#define VC_VIDEO_POWER_MODE_CONTROL 0x01
++#define VC_REQUEST_ERROR_CODE_CONTROL 0x02
+
+ /* Terminal controls */
+-#define TE_CONTROL_UNDEFINED 0x00
++#define TE_CONTROL_UNDEFINED 0x00
+
+ /* Selector Unit controls */
+-#define SU_CONTROL_UNDEFINED 0x00
+-#define SU_INPUT_SELECT_CONTROL 0x01
++#define SU_CONTROL_UNDEFINED 0x00
++#define SU_INPUT_SELECT_CONTROL 0x01
+
+ /* Camera Terminal controls */
+-#define CT_CONTROL_UNDEFINED 0x00
+-#define CT_SCANNING_MODE_CONTROL 0x01
+-#define CT_AE_MODE_CONTROL 0x02
+-#define CT_AE_PRIORITY_CONTROL 0x03
+-#define CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04
+-#define CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05
+-#define CT_FOCUS_ABSOLUTE_CONTROL 0x06
+-#define CT_FOCUS_RELATIVE_CONTROL 0x07
+-#define CT_FOCUS_AUTO_CONTROL 0x08
+-#define CT_IRIS_ABSOLUTE_CONTROL 0x09
+-#define CT_IRIS_RELATIVE_CONTROL 0x0a
+-#define CT_ZOOM_ABSOLUTE_CONTROL 0x0b
+-#define CT_ZOOM_RELATIVE_CONTROL 0x0c
+-#define CT_PANTILT_ABSOLUTE_CONTROL 0x0d
+-#define CT_PANTILT_RELATIVE_CONTROL 0x0e
+-#define CT_ROLL_ABSOLUTE_CONTROL 0x0f
+-#define CT_ROLL_RELATIVE_CONTROL 0x10
+-#define CT_PRIVACY_CONTROL 0x11
++#define CT_CONTROL_UNDEFINED 0x00
++#define CT_SCANNING_MODE_CONTROL 0x01
++#define CT_AE_MODE_CONTROL 0x02
++#define CT_AE_PRIORITY_CONTROL 0x03
++#define CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04
++#define CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05
++#define CT_FOCUS_ABSOLUTE_CONTROL 0x06
++#define CT_FOCUS_RELATIVE_CONTROL 0x07
++#define CT_FOCUS_AUTO_CONTROL 0x08
++#define CT_IRIS_ABSOLUTE_CONTROL 0x09
++#define CT_IRIS_RELATIVE_CONTROL 0x0a
++#define CT_ZOOM_ABSOLUTE_CONTROL 0x0b
++#define CT_ZOOM_RELATIVE_CONTROL 0x0c
++#define CT_PANTILT_ABSOLUTE_CONTROL 0x0d
++#define CT_PANTILT_RELATIVE_CONTROL 0x0e
++#define CT_ROLL_ABSOLUTE_CONTROL 0x0f
++#define CT_ROLL_RELATIVE_CONTROL 0x10
++#define CT_PRIVACY_CONTROL 0x11
+
+ /* Processing Unit controls */
+-#define PU_CONTROL_UNDEFINED 0x00
+-#define PU_BACKLIGHT_COMPENSATION_CONTROL 0x01
+-#define PU_BRIGHTNESS_CONTROL 0x02
+-#define PU_CONTRAST_CONTROL 0x03
+-#define PU_GAIN_CONTROL 0x04
+-#define PU_POWER_LINE_FREQUENCY_CONTROL 0x05
+-#define PU_HUE_CONTROL 0x06
+-#define PU_SATURATION_CONTROL 0x07
+-#define PU_SHARPNESS_CONTROL 0x08
+-#define PU_GAMMA_CONTROL 0x09
+-#define PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x0a
+-#define PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0b
+-#define PU_WHITE_BALANCE_COMPONENT_CONTROL 0x0c
+-#define PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x0d
+-#define PU_DIGITAL_MULTIPLIER_CONTROL 0x0e
+-#define PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x0f
+-#define PU_HUE_AUTO_CONTROL 0x10
+-#define PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11
+-#define PU_ANALOG_LOCK_STATUS_CONTROL 0x12
++#define PU_CONTROL_UNDEFINED 0x00
++#define PU_BACKLIGHT_COMPENSATION_CONTROL 0x01
++#define PU_BRIGHTNESS_CONTROL 0x02
++#define PU_CONTRAST_CONTROL 0x03
++#define PU_GAIN_CONTROL 0x04
++#define PU_POWER_LINE_FREQUENCY_CONTROL 0x05
++#define PU_HUE_CONTROL 0x06
++#define PU_SATURATION_CONTROL 0x07
++#define PU_SHARPNESS_CONTROL 0x08
++#define PU_GAMMA_CONTROL 0x09
++#define PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x0a
++#define PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0b
++#define PU_WHITE_BALANCE_COMPONENT_CONTROL 0x0c
++#define PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x0d
++#define PU_DIGITAL_MULTIPLIER_CONTROL 0x0e
++#define PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x0f
++#define PU_HUE_AUTO_CONTROL 0x10
++#define PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11
++#define PU_ANALOG_LOCK_STATUS_CONTROL 0x12
+
+ #define LXU_MOTOR_PANTILT_RELATIVE_CONTROL 0x01
+ #define LXU_MOTOR_PANTILT_RESET_CONTROL 0x02
+ #define LXU_MOTOR_FOCUS_MOTOR_CONTROL 0x03
+
+ /* VideoStreaming interface controls */
+-#define VS_CONTROL_UNDEFINED 0x00
+-#define VS_PROBE_CONTROL 0x01
+-#define VS_COMMIT_CONTROL 0x02
+-#define VS_STILL_PROBE_CONTROL 0x03
+-#define VS_STILL_COMMIT_CONTROL 0x04
+-#define VS_STILL_IMAGE_TRIGGER_CONTROL 0x05
+-#define VS_STREAM_ERROR_CODE_CONTROL 0x06
+-#define VS_GENERATE_KEY_FRAME_CONTROL 0x07
+-#define VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08
+-#define VS_SYNC_DELAY_CONTROL 0x09
++#define VS_CONTROL_UNDEFINED 0x00
++#define VS_PROBE_CONTROL 0x01
++#define VS_COMMIT_CONTROL 0x02
++#define VS_STILL_PROBE_CONTROL 0x03
++#define VS_STILL_COMMIT_CONTROL 0x04
++#define VS_STILL_IMAGE_TRIGGER_CONTROL 0x05
++#define VS_STREAM_ERROR_CODE_CONTROL 0x06
++#define VS_GENERATE_KEY_FRAME_CONTROL 0x07
++#define VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08
++#define VS_SYNC_DELAY_CONTROL 0x09
+
+-#define TT_VENDOR_SPECIFIC 0x0100
+-#define TT_STREAMING 0x0101
++#define TT_VENDOR_SPECIFIC 0x0100
++#define TT_STREAMING 0x0101
+
+ /* Input Terminal types */
+-#define ITT_VENDOR_SPECIFIC 0x0200
+-#define ITT_CAMERA 0x0201
+-#define ITT_MEDIA_TRANSPORT_INPUT 0x0202
++#define ITT_VENDOR_SPECIFIC 0x0200
++#define ITT_CAMERA 0x0201
++#define ITT_MEDIA_TRANSPORT_INPUT 0x0202
+
+ /* Output Terminal types */
+-#define OTT_VENDOR_SPECIFIC 0x0300
+-#define OTT_DISPLAY 0x0301
+-#define OTT_MEDIA_TRANSPORT_OUTPUT 0x0302
++#define OTT_VENDOR_SPECIFIC 0x0300
++#define OTT_DISPLAY 0x0301
++#define OTT_MEDIA_TRANSPORT_OUTPUT 0x0302
+
+ /* External Terminal types */
+-#define EXTERNAL_VENDOR_SPECIFIC 0x0400
+-#define COMPOSITE_CONNECTOR 0x0401
+-#define SVIDEO_CONNECTOR 0x0402
+-#define COMPONENT_CONNECTOR 0x0403
++#define EXTERNAL_VENDOR_SPECIFIC 0x0400
++#define COMPOSITE_CONNECTOR 0x0401
++#define SVIDEO_CONNECTOR 0x0402
++#define COMPONENT_CONNECTOR 0x0403
+
+ #define UVC_TERM_INPUT 0x0000
+ #define UVC_TERM_OUTPUT 0x8000
+@@ -541,11 +541,11 @@
+ };
+
+ enum uvc_buffer_state {
+- UVC_BUF_STATE_IDLE = 0,
+- UVC_BUF_STATE_QUEUED = 1,
+- UVC_BUF_STATE_ACTIVE = 2,
+- UVC_BUF_STATE_DONE = 3,
+- UVC_BUF_STATE_ERROR = 4,
++ UVC_BUF_STATE_IDLE = 0,
++ UVC_BUF_STATE_QUEUED = 1,
++ UVC_BUF_STATE_ACTIVE = 2,
++ UVC_BUF_STATE_DONE = 3,
++ UVC_BUF_STATE_ERROR = 4,
+ };
+
+ struct uvc_buffer {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/v4l2-subdev.c linux-2.6.29-rc3.owrt/drivers/media/video/v4l2-subdev.c
+--- linux-2.6.29.owrt/drivers/media/video/v4l2-subdev.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/v4l2-subdev.c 2009-05-10 23:48:28.000000000 +0200
+@@ -28,13 +28,13 @@
+ {
+ switch (cmd) {
+ case VIDIOC_QUERYCTRL:
+- return v4l2_subdev_call(sd, core, queryctrl, arg);
++ return v4l2_subdev_call(sd, core, querymenu, arg);
+ case VIDIOC_G_CTRL:
+ return v4l2_subdev_call(sd, core, g_ctrl, arg);
+ case VIDIOC_S_CTRL:
+ return v4l2_subdev_call(sd, core, s_ctrl, arg);
+ case VIDIOC_QUERYMENU:
+- return v4l2_subdev_call(sd, core, querymenu, arg);
++ return v4l2_subdev_call(sd, core, queryctrl, arg);
+ case VIDIOC_LOG_STATUS:
+ return v4l2_subdev_call(sd, core, log_status);
+ case VIDIOC_DBG_G_CHIP_IDENT:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/zoran/Kconfig linux-2.6.29-rc3.owrt/drivers/media/video/zoran/Kconfig
+--- linux-2.6.29.owrt/drivers/media/video/zoran/Kconfig 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/zoran/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -68,7 +68,6 @@
+ tristate "AverMedia 6 Eyes support (EXPERIMENTAL)"
+ depends on VIDEO_ZORAN_ZR36060 && EXPERIMENTAL && VIDEO_V4L1
+ select VIDEO_BT856 if VIDEO_HELPER_CHIPS_AUTO
+- select VIDEO_BT866 if VIDEO_HELPER_CHIPS_AUTO
+ select VIDEO_KS0127 if VIDEO_HELPER_CHIPS_AUTO
+ help
+ Support for the AverMedia 6 Eyes video surveillance card.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/zoran/zoran_card.c linux-2.6.29-rc3.owrt/drivers/media/video/zoran/zoran_card.c
+--- linux-2.6.29.owrt/drivers/media/video/zoran/zoran_card.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/zoran/zoran_card.c 2009-05-10 23:48:28.000000000 +0200
+@@ -61,17 +61,17 @@
+
+ extern const struct zoran_format zoran_formats[];
+
+-static int card[BUZ_MAX] = { [0 ... (BUZ_MAX-1)] = -1 };
++static int card[BUZ_MAX] = { -1, -1, -1, -1 };
+ module_param_array(card, int, NULL, 0444);
+-MODULE_PARM_DESC(card, "Card type");
++MODULE_PARM_DESC(card, "The type of card");
+
+-static int encoder[BUZ_MAX] = { [0 ... (BUZ_MAX-1)] = -1 };
++static int encoder[BUZ_MAX] = { -1, -1, -1, -1 };
+ module_param_array(encoder, int, NULL, 0444);
+-MODULE_PARM_DESC(encoder, "Video encoder chip");
++MODULE_PARM_DESC(encoder, "i2c TV encoder");
+
+-static int decoder[BUZ_MAX] = { [0 ... (BUZ_MAX-1)] = -1 };
++static int decoder[BUZ_MAX] = { -1, -1, -1, -1 };
+ module_param_array(decoder, int, NULL, 0444);
+-MODULE_PARM_DESC(decoder, "Video decoder chip");
++MODULE_PARM_DESC(decoder, "i2c TV decoder");
+
+ /*
+ The video mem address of the video card.
+@@ -104,9 +104,9 @@
+ MODULE_PARM_DESC(default_norm, "Default norm (0=PAL, 1=NTSC, 2=SECAM)");
+
+ /* /dev/videoN, -1 for autodetect */
+-static int video_nr[BUZ_MAX] = { [0 ... (BUZ_MAX-1)] = -1 };
++static int video_nr[BUZ_MAX] = {-1, -1, -1, -1};
+ module_param_array(video_nr, int, NULL, 0444);
+-MODULE_PARM_DESC(video_nr, "Video device number (-1=Auto)");
++MODULE_PARM_DESC(video_nr, "video device number (-1=Auto)");
+
+ /*
+ Number and size of grab buffers for Video 4 Linux
+@@ -153,21 +153,9 @@
+ MODULE_AUTHOR("Serguei Miridonov");
+ MODULE_LICENSE("GPL");
+
+-#define ZR_DEVICE(subven, subdev, data) { \
+- .vendor = PCI_VENDOR_ID_ZORAN, .device = PCI_DEVICE_ID_ZORAN_36057, \
+- .subvendor = (subven), .subdevice = (subdev), .driver_data = (data) }
+-
+-static struct pci_device_id zr36067_pci_tbl[] = {
+- ZR_DEVICE(PCI_VENDOR_ID_MIRO, PCI_DEVICE_ID_MIRO_DC10PLUS, DC10plus),
+- ZR_DEVICE(PCI_VENDOR_ID_MIRO, PCI_DEVICE_ID_MIRO_DC30PLUS, DC30plus),
+- ZR_DEVICE(PCI_VENDOR_ID_ELECTRONICDESIGNGMBH, PCI_DEVICE_ID_LML_33R10, LML33R10),
+- ZR_DEVICE(PCI_VENDOR_ID_IOMEGA, PCI_DEVICE_ID_IOMEGA_BUZ, BUZ),
+- ZR_DEVICE(PCI_ANY_ID, PCI_ANY_ID, NUM_CARDS),
+- {0}
+-};
+-MODULE_DEVICE_TABLE(pci, zr36067_pci_tbl);
+
+-static unsigned int zoran_num; /* number of cards found */
++int zoran_num; /* number of Buzs in use */
++struct zoran *zoran[BUZ_MAX];
+
+ /* videocodec bus functions ZR36060 */
+ static u32
+@@ -484,6 +472,8 @@
+ }, {
+ .type = DC10plus,
+ .name = "DC10plus",
++ .vendor_id = PCI_VENDOR_ID_MIRO,
++ .device_id = PCI_DEVICE_ID_MIRO_DC10PLUS,
+ .i2c_decoder = I2C_DRIVERID_SAA7110,
+ .i2c_encoder = I2C_DRIVERID_ADV7175,
+ .video_codec = CODEC_TYPE_ZR36060,
+@@ -541,6 +531,8 @@
+ }, {
+ .type = DC30plus,
+ .name = "DC30plus",
++ .vendor_id = PCI_VENDOR_ID_MIRO,
++ .device_id = PCI_DEVICE_ID_MIRO_DC30PLUS,
+ .i2c_decoder = I2C_DRIVERID_VPX3220,
+ .i2c_encoder = I2C_DRIVERID_ADV7175,
+ .video_codec = CODEC_TYPE_ZR36050,
+@@ -597,6 +589,8 @@
+ }, {
+ .type = LML33R10,
+ .name = "LML33R10",
++ .vendor_id = PCI_VENDOR_ID_ELECTRONICDESIGNGMBH,
++ .device_id = PCI_DEVICE_ID_LML_33R10,
+ .i2c_decoder = I2C_DRIVERID_SAA7114,
+ .i2c_encoder = I2C_DRIVERID_ADV7170,
+ .video_codec = CODEC_TYPE_ZR36060,
+@@ -624,6 +618,8 @@
+ }, {
+ .type = BUZ,
+ .name = "Buz",
++ .vendor_id = PCI_VENDOR_ID_IOMEGA,
++ .device_id = PCI_DEVICE_ID_IOMEGA_BUZ,
+ .i2c_decoder = I2C_DRIVERID_SAA7111A,
+ .i2c_encoder = I2C_DRIVERID_SAA7185B,
+ .video_codec = CODEC_TYPE_ZR36060,
+@@ -653,6 +649,8 @@
+ .name = "6-Eyes",
+ /* AverMedia chose not to brand the 6-Eyes. Thus it
+ can't be autodetected, and requires card=x. */
++ .vendor_id = -1,
++ .device_id = -1,
+ .i2c_decoder = I2C_DRIVERID_KS0127,
+ .i2c_encoder = I2C_DRIVERID_BT866,
+ .video_codec = CODEC_TYPE_ZR36060,
+@@ -1140,8 +1138,7 @@
+ strcpy(zr->video_dev->name, ZR_DEVNAME(zr));
+ err = video_register_device(zr->video_dev, VFL_TYPE_GRABBER, video_nr[zr->id]);
+ if (err < 0)
+- goto exit_free;
+- video_set_drvdata(zr->video_dev, zr);
++ goto exit_unregister;
+
+ zoran_init_hardware(zr);
+ if (zr36067_debug > 2)
+@@ -1156,19 +1153,19 @@
+ zr->initialized = 1;
+ return 0;
+
++exit_unregister:
++ zoran_unregister_i2c(zr);
+ exit_free:
+ kfree(zr->stat_com);
+ kfree(zr->video_dev);
+ return err;
+ }
+
+-static void __devexit zoran_remove(struct pci_dev *pdev)
++static void
++zoran_release (struct zoran *zr)
+ {
+- struct zoran *zr = pci_get_drvdata(pdev);
+-
+ if (!zr->initialized)
+ goto exit_free;
+-
+ /* unregister videocodec bus */
+ if (zr->codec) {
+ struct videocodec_master *master = zr->codec->master_data;
+@@ -1197,7 +1194,6 @@
+ pci_disable_device(zr->pci_dev);
+ video_unregister_device(zr->video_dev);
+ exit_free:
+- pci_set_drvdata(pdev, NULL);
+ kfree(zr);
+ }
+
+@@ -1260,329 +1256,338 @@
+ * Scan for a Buz card (actually for the PCI controller ZR36057),
+ * request the irq and map the io memory
+ */
+-static int __devinit zoran_probe(struct pci_dev *pdev,
+- const struct pci_device_id *ent)
++static int __devinit
++find_zr36057 (void)
+ {
+ unsigned char latency, need_latency;
+ struct zoran *zr;
++ struct pci_dev *dev = NULL;
+ int result;
+ struct videocodec_master *master_vfe = NULL;
+ struct videocodec_master *master_codec = NULL;
+ int card_num;
+ char *i2c_enc_name, *i2c_dec_name, *codec_name, *vfe_name;
+- unsigned int nr;
+-
+-
+- nr = zoran_num++;
+- if (nr >= BUZ_MAX) {
+- dprintk(1,
+- KERN_ERR
+- "%s: driver limited to %d card(s) maximum\n",
+- ZORAN_NAME, BUZ_MAX);
+- return -ENOENT;
+- }
+
+- zr = kzalloc(sizeof(struct zoran), GFP_KERNEL);
+- if (!zr) {
+- dprintk(1,
+- KERN_ERR
+- "%s: find_zr36057() - kzalloc failed\n",
+- ZORAN_NAME);
+- return -ENOMEM;
+- }
+- zr->pci_dev = pdev;
+- zr->id = nr;
+- snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id);
+- spin_lock_init(&zr->spinlock);
+- mutex_init(&zr->resource_lock);
+- if (pci_enable_device(pdev))
+- goto zr_free_mem;
+- pci_read_config_byte(zr->pci_dev, PCI_CLASS_REVISION, &zr->revision);
++ zoran_num = 0;
++ while (zoran_num < BUZ_MAX &&
++ (dev = pci_get_device(PCI_VENDOR_ID_ZORAN, PCI_DEVICE_ID_ZORAN_36057, dev)) != NULL) {
++ card_num = card[zoran_num];
++ zr = kzalloc(sizeof(struct zoran), GFP_KERNEL);
++ if (!zr) {
++ dprintk(1,
++ KERN_ERR
++ "%s: find_zr36057() - kzalloc failed\n",
++ ZORAN_NAME);
++ continue;
++ }
++ zr->pci_dev = dev;
++ //zr->zr36057_mem = NULL;
++ zr->id = zoran_num;
++ snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id);
++ spin_lock_init(&zr->spinlock);
++ mutex_init(&zr->resource_lock);
++ if (pci_enable_device(dev))
++ goto zr_free_mem;
++ zr->zr36057_adr = pci_resource_start(zr->pci_dev, 0);
++ pci_read_config_byte(zr->pci_dev, PCI_CLASS_REVISION,
++ &zr->revision);
++ if (zr->revision < 2) {
++ dprintk(1,
++ KERN_INFO
++ "%s: Zoran ZR36057 (rev %d) irq: %d, memory: 0x%08x.\n",
++ ZR_DEVNAME(zr), zr->revision, zr->pci_dev->irq,
++ zr->zr36057_adr);
+
+- dprintk(1,
+- KERN_INFO
+- "%s: Zoran ZR360%c7 (rev %d), irq: %d, memory: 0x%08llx\n",
+- ZR_DEVNAME(zr), zr->revision < 2 ? '5' : '6', zr->revision,
+- zr->pci_dev->irq, (uint64_t)pci_resource_start(zr->pci_dev, 0));
+- if (zr->revision >= 2) {
+- dprintk(1,
+- KERN_INFO
+- "%s: Subsystem vendor=0x%04x id=0x%04x\n",
+- ZR_DEVNAME(zr), zr->pci_dev->subsystem_vendor,
+- zr->pci_dev->subsystem_device);
+- }
++ if (card_num == -1) {
++ dprintk(1,
++ KERN_ERR
++ "%s: find_zr36057() - no card specified, please use the card=X insmod option\n",
++ ZR_DEVNAME(zr));
++ goto zr_free_mem;
++ }
++ } else {
++ int i;
++ unsigned short ss_vendor, ss_device;
+
+- /* Use auto-detected card type? */
+- if (card[nr] == -1) {
+- if (zr->revision < 2) {
++ ss_vendor = zr->pci_dev->subsystem_vendor;
++ ss_device = zr->pci_dev->subsystem_device;
+ dprintk(1,
+- KERN_ERR
+- "%s: No card type specified, please use the card=X module parameter\n",
+- ZR_DEVNAME(zr));
++ KERN_INFO
++ "%s: Zoran ZR36067 (rev %d) irq: %d, memory: 0x%08x\n",
++ ZR_DEVNAME(zr), zr->revision, zr->pci_dev->irq,
++ zr->zr36057_adr);
+ dprintk(1,
++ KERN_INFO
++ "%s: subsystem vendor=0x%04x id=0x%04x\n",
++ ZR_DEVNAME(zr), ss_vendor, ss_device);
++ if (card_num == -1) {
++ dprintk(3,
++ KERN_DEBUG
++ "%s: find_zr36057() - trying to autodetect card type\n",
++ ZR_DEVNAME(zr));
++ for (i=0;i<NUM_CARDS;i++) {
++ if (ss_vendor == zoran_cards[i].vendor_id &&
++ ss_device == zoran_cards[i].device_id) {
++ dprintk(3,
++ KERN_DEBUG
++ "%s: find_zr36057() - card %s detected\n",
++ ZR_DEVNAME(zr),
++ zoran_cards[i].name);
++ card_num = i;
++ break;
++ }
++ }
++ if (i == NUM_CARDS) {
++ dprintk(1,
++ KERN_ERR
++ "%s: find_zr36057() - unknown card\n",
++ ZR_DEVNAME(zr));
++ goto zr_free_mem;
++ }
++ }
++ }
++
++ if (card_num < 0 || card_num >= NUM_CARDS) {
++ dprintk(2,
+ KERN_ERR
+- "%s: It is not possible to auto-detect ZR36057 based cards\n",
+- ZR_DEVNAME(zr));
++ "%s: find_zr36057() - invalid cardnum %d\n",
++ ZR_DEVNAME(zr), card_num);
+ goto zr_free_mem;
+ }
+
+- card_num = ent->driver_data;
+- if (card_num >= NUM_CARDS) {
++ /* even though we make this a non pointer and thus
++ * theoretically allow for making changes to this struct
++ * on a per-individual card basis at runtime, this is
++ * strongly discouraged. This structure is intended to
++ * keep general card information, no settings or anything */
++ zr->card = zoran_cards[card_num];
++ snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)),
++ "%s[%u]", zr->card.name, zr->id);
++
++ zr->zr36057_mem = ioremap_nocache(zr->zr36057_adr, 0x1000);
++ if (!zr->zr36057_mem) {
+ dprintk(1,
+ KERN_ERR
+- "%s: Unknown card, try specifying card=X module parameter\n",
++ "%s: find_zr36057() - ioremap failed\n",
+ ZR_DEVNAME(zr));
+ goto zr_free_mem;
+ }
+- dprintk(3,
+- KERN_DEBUG
+- "%s: %s() - card %s detected\n",
+- ZR_DEVNAME(zr), __func__, zoran_cards[card_num].name);
+- } else {
+- card_num = card[nr];
+- if (card_num >= NUM_CARDS || card_num < 0) {
+- dprintk(1,
+- KERN_ERR
+- "%s: User specified card type %d out of range (0 .. %d)\n",
+- ZR_DEVNAME(zr), card_num, NUM_CARDS - 1);
+- goto zr_free_mem;
++
++ result = request_irq(zr->pci_dev->irq,
++ zoran_irq,
++ IRQF_SHARED | IRQF_DISABLED,
++ ZR_DEVNAME(zr),
++ (void *) zr);
++ if (result < 0) {
++ if (result == -EINVAL) {
++ dprintk(1,
++ KERN_ERR
++ "%s: find_zr36057() - bad irq number or handler\n",
++ ZR_DEVNAME(zr));
++ } else if (result == -EBUSY) {
++ dprintk(1,
++ KERN_ERR
++ "%s: find_zr36057() - IRQ %d busy, change your PnP config in BIOS\n",
++ ZR_DEVNAME(zr), zr->pci_dev->irq);
++ } else {
++ dprintk(1,
++ KERN_ERR
++ "%s: find_zr36057() - can't assign irq, error code %d\n",
++ ZR_DEVNAME(zr), result);
++ }
++ goto zr_unmap;
+ }
+- }
+
+- /* even though we make this a non pointer and thus
+- * theoretically allow for making changes to this struct
+- * on a per-individual card basis at runtime, this is
+- * strongly discouraged. This structure is intended to
+- * keep general card information, no settings or anything */
+- zr->card = zoran_cards[card_num];
+- snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)),
+- "%s[%u]", zr->card.name, zr->id);
++ /* set PCI latency timer */
++ pci_read_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
++ &latency);
++ need_latency = zr->revision > 1 ? 32 : 48;
++ if (latency != need_latency) {
++ dprintk(2,
++ KERN_INFO
++ "%s: Changing PCI latency from %d to %d.\n",
++ ZR_DEVNAME(zr), latency, need_latency);
++ pci_write_config_byte(zr->pci_dev,
++ PCI_LATENCY_TIMER,
++ need_latency);
++ }
+
+- zr->zr36057_mem = pci_ioremap_bar(zr->pci_dev, 0);
+- if (!zr->zr36057_mem) {
+- dprintk(1,
+- KERN_ERR
+- "%s: %s() - ioremap failed\n",
+- ZR_DEVNAME(zr), __func__);
+- goto zr_free_mem;
+- }
++ zr36057_restart(zr);
++ /* i2c */
++ dprintk(2, KERN_INFO "%s: Initializing i2c bus...\n",
++ ZR_DEVNAME(zr));
+
+- result = request_irq(zr->pci_dev->irq, zoran_irq,
+- IRQF_SHARED | IRQF_DISABLED, ZR_DEVNAME(zr), zr);
+- if (result < 0) {
+- if (result == -EINVAL) {
+- dprintk(1,
+- KERN_ERR
+- "%s: find_zr36057() - bad irq number or handler\n",
+- ZR_DEVNAME(zr));
+- } else if (result == -EBUSY) {
+- dprintk(1,
+- KERN_ERR
+- "%s: find_zr36057() - IRQ %d busy, change your PnP config in BIOS\n",
+- ZR_DEVNAME(zr), zr->pci_dev->irq);
++ /* i2c decoder */
++ if (decoder[zr->id] != -1) {
++ i2c_dec_name = i2cid_to_modulename(decoder[zr->id]);
++ zr->card.i2c_decoder = decoder[zr->id];
++ } else if (zr->card.i2c_decoder != 0) {
++ i2c_dec_name =
++ i2cid_to_modulename(zr->card.i2c_decoder);
+ } else {
+- dprintk(1,
+- KERN_ERR
+- "%s: find_zr36057() - can't assign irq, error code %d\n",
+- ZR_DEVNAME(zr), result);
++ i2c_dec_name = NULL;
+ }
+- goto zr_unmap;
+- }
+
+- /* set PCI latency timer */
+- pci_read_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
+- &latency);
+- need_latency = zr->revision > 1 ? 32 : 48;
+- if (latency != need_latency) {
+- dprintk(2,
+- KERN_INFO
+- "%s: Changing PCI latency from %d to %d\n",
+- ZR_DEVNAME(zr), latency, need_latency);
+- pci_write_config_byte(zr->pci_dev, PCI_LATENCY_TIMER,
+- need_latency);
+- }
+-
+- zr36057_restart(zr);
+- /* i2c */
+- dprintk(2, KERN_INFO "%s: Initializing i2c bus...\n",
+- ZR_DEVNAME(zr));
+-
+- /* i2c decoder */
+- if (decoder[zr->id] != -1) {
+- i2c_dec_name = i2cid_to_modulename(decoder[zr->id]);
+- zr->card.i2c_decoder = decoder[zr->id];
+- } else if (zr->card.i2c_decoder != 0) {
+- i2c_dec_name = i2cid_to_modulename(zr->card.i2c_decoder);
+- } else {
+- i2c_dec_name = NULL;
+- }
++ if (i2c_dec_name) {
++ if ((result = request_module(i2c_dec_name)) < 0) {
++ dprintk(1,
++ KERN_ERR
++ "%s: failed to load module %s: %d\n",
++ ZR_DEVNAME(zr), i2c_dec_name, result);
++ }
++ }
+
+- if (i2c_dec_name) {
+- result = request_module(i2c_dec_name);
+- if (result < 0) {
+- dprintk(1,
+- KERN_ERR
+- "%s: failed to load module %s: %d\n",
+- ZR_DEVNAME(zr), i2c_dec_name, result);
++ /* i2c encoder */
++ if (encoder[zr->id] != -1) {
++ i2c_enc_name = i2cid_to_modulename(encoder[zr->id]);
++ zr->card.i2c_encoder = encoder[zr->id];
++ } else if (zr->card.i2c_encoder != 0) {
++ i2c_enc_name =
++ i2cid_to_modulename(zr->card.i2c_encoder);
++ } else {
++ i2c_enc_name = NULL;
+ }
+- }
+
+- /* i2c encoder */
+- if (encoder[zr->id] != -1) {
+- i2c_enc_name = i2cid_to_modulename(encoder[zr->id]);
+- zr->card.i2c_encoder = encoder[zr->id];
+- } else if (zr->card.i2c_encoder != 0) {
+- i2c_enc_name = i2cid_to_modulename(zr->card.i2c_encoder);
+- } else {
+- i2c_enc_name = NULL;
+- }
++ if (i2c_enc_name) {
++ if ((result = request_module(i2c_enc_name)) < 0) {
++ dprintk(1,
++ KERN_ERR
++ "%s: failed to load module %s: %d\n",
++ ZR_DEVNAME(zr), i2c_enc_name, result);
++ }
++ }
+
+- if (i2c_enc_name) {
+- result = request_module(i2c_enc_name);
+- if (result < 0) {
++ if (zoran_register_i2c(zr) < 0) {
+ dprintk(1,
+ KERN_ERR
+- "%s: failed to load module %s: %d\n",
+- ZR_DEVNAME(zr), i2c_enc_name, result);
++ "%s: find_zr36057() - can't initialize i2c bus\n",
++ ZR_DEVNAME(zr));
++ goto zr_free_irq;
+ }
+- }
+
+- if (zoran_register_i2c(zr) < 0) {
+- dprintk(1,
+- KERN_ERR
+- "%s: find_zr36057() - can't initialize i2c bus\n",
++ dprintk(2,
++ KERN_INFO "%s: Initializing videocodec bus...\n",
+ ZR_DEVNAME(zr));
+- goto zr_free_irq;
+- }
+-
+- dprintk(2,
+- KERN_INFO "%s: Initializing videocodec bus...\n",
+- ZR_DEVNAME(zr));
+
+- if (zr->card.video_codec) {
+- codec_name = codecid_to_modulename(zr->card.video_codec);
+- if (codec_name) {
+- result = request_module(codec_name);
+- if (result) {
++ if (zr->card.video_codec != 0 &&
++ (codec_name =
++ codecid_to_modulename(zr->card.video_codec)) != NULL) {
++ if ((result = request_module(codec_name)) < 0) {
+ dprintk(1,
+ KERN_ERR
+ "%s: failed to load modules %s: %d\n",
+ ZR_DEVNAME(zr), codec_name, result);
+ }
+ }
+- }
+- if (zr->card.video_vfe) {
+- vfe_name = codecid_to_modulename(zr->card.video_vfe);
+- if (vfe_name) {
+- result = request_module(vfe_name);
+- if (result < 0) {
++ if (zr->card.video_vfe != 0 &&
++ (vfe_name =
++ codecid_to_modulename(zr->card.video_vfe)) != NULL) {
++ if ((result = request_module(vfe_name)) < 0) {
+ dprintk(1,
+ KERN_ERR
+ "%s: failed to load modules %s: %d\n",
+ ZR_DEVNAME(zr), vfe_name, result);
+ }
+ }
+- }
+
+- /* reset JPEG codec */
+- jpeg_codec_sleep(zr, 1);
+- jpeg_codec_reset(zr);
+- /* video bus enabled */
+- /* display codec revision */
+- if (zr->card.video_codec != 0) {
+- master_codec = zoran_setup_videocodec(zr, zr->card.video_codec);
+- if (!master_codec)
+- goto zr_unreg_i2c;
+- zr->codec = videocodec_attach(master_codec);
+- if (!zr->codec) {
+- dprintk(1,
+- KERN_ERR
+- "%s: find_zr36057() - no codec found\n",
+- ZR_DEVNAME(zr));
+- goto zr_free_codec;
+- }
+- if (zr->codec->type != zr->card.video_codec) {
+- dprintk(1,
+- KERN_ERR
+- "%s: find_zr36057() - wrong codec\n",
+- ZR_DEVNAME(zr));
+- goto zr_detach_codec;
+- }
+- }
+- if (zr->card.video_vfe != 0) {
+- master_vfe = zoran_setup_videocodec(zr, zr->card.video_vfe);
+- if (!master_vfe)
+- goto zr_detach_codec;
+- zr->vfe = videocodec_attach(master_vfe);
+- if (!zr->vfe) {
+- dprintk(1,
+- KERN_ERR
+- "%s: find_zr36057() - no VFE found\n",
+- ZR_DEVNAME(zr));
+- goto zr_free_vfe;
++ /* reset JPEG codec */
++ jpeg_codec_sleep(zr, 1);
++ jpeg_codec_reset(zr);
++ /* video bus enabled */
++ /* display codec revision */
++ if (zr->card.video_codec != 0) {
++ master_codec = zoran_setup_videocodec(zr,
++ zr->card.video_codec);
++ if (!master_codec)
++ goto zr_unreg_i2c;
++ zr->codec = videocodec_attach(master_codec);
++ if (!zr->codec) {
++ dprintk(1,
++ KERN_ERR
++ "%s: find_zr36057() - no codec found\n",
++ ZR_DEVNAME(zr));
++ goto zr_free_codec;
++ }
++ if (zr->codec->type != zr->card.video_codec) {
++ dprintk(1,
++ KERN_ERR
++ "%s: find_zr36057() - wrong codec\n",
++ ZR_DEVNAME(zr));
++ goto zr_detach_codec;
++ }
+ }
+- if (zr->vfe->type != zr->card.video_vfe) {
+- dprintk(1,
+- KERN_ERR
+- "%s: find_zr36057() = wrong VFE\n",
+- ZR_DEVNAME(zr));
+- goto zr_detach_vfe;
++ if (zr->card.video_vfe != 0) {
++ master_vfe = zoran_setup_videocodec(zr,
++ zr->card.video_vfe);
++ if (!master_vfe)
++ goto zr_detach_codec;
++ zr->vfe = videocodec_attach(master_vfe);
++ if (!zr->vfe) {
++ dprintk(1,
++ KERN_ERR
++ "%s: find_zr36057() - no VFE found\n",
++ ZR_DEVNAME(zr));
++ goto zr_free_vfe;
++ }
++ if (zr->vfe->type != zr->card.video_vfe) {
++ dprintk(1,
++ KERN_ERR
++ "%s: find_zr36057() = wrong VFE\n",
++ ZR_DEVNAME(zr));
++ goto zr_detach_vfe;
++ }
+ }
+- }
+-
+- /* take care of Natoma chipset and a revision 1 zr36057 */
+- if ((pci_pci_problems & PCIPCI_NATOMA) && zr->revision <= 1) {
+- zr->jpg_buffers.need_contiguous = 1;
+- dprintk(1,
+- KERN_INFO
+- "%s: ZR36057/Natoma bug, max. buffer size is 128K\n",
+- ZR_DEVNAME(zr));
+- }
++ /* Success so keep the pci_dev referenced */
++ pci_dev_get(zr->pci_dev);
++ zoran[zoran_num++] = zr;
++ continue;
+
+- if (zr36057_init(zr) < 0)
+- goto zr_detach_vfe;
+-
+- zoran_proc_init(zr);
+-
+- pci_set_drvdata(pdev, zr);
+-
+- return 0;
+-
+-zr_detach_vfe:
+- videocodec_detach(zr->vfe);
+-zr_free_vfe:
+- kfree(master_vfe);
+-zr_detach_codec:
+- videocodec_detach(zr->codec);
+-zr_free_codec:
+- kfree(master_codec);
+-zr_unreg_i2c:
+- zoran_unregister_i2c(zr);
+-zr_free_irq:
+- btwrite(0, ZR36057_SPGPPCR);
+- free_irq(zr->pci_dev->irq, zr);
+-zr_unmap:
+- iounmap(zr->zr36057_mem);
+-zr_free_mem:
+- kfree(zr);
++ // Init errors
++ zr_detach_vfe:
++ videocodec_detach(zr->vfe);
++ zr_free_vfe:
++ kfree(master_vfe);
++ zr_detach_codec:
++ videocodec_detach(zr->codec);
++ zr_free_codec:
++ kfree(master_codec);
++ zr_unreg_i2c:
++ zoran_unregister_i2c(zr);
++ zr_free_irq:
++ btwrite(0, ZR36057_SPGPPCR);
++ free_irq(zr->pci_dev->irq, zr);
++ zr_unmap:
++ iounmap(zr->zr36057_mem);
++ zr_free_mem:
++ kfree(zr);
++ continue;
++ }
++ if (dev) /* Clean up ref count on early exit */
++ pci_dev_put(dev);
+
+- return -ENODEV;
++ if (zoran_num == 0) {
++ dprintk(1, KERN_INFO "No known MJPEG cards found.\n");
++ }
++ return zoran_num;
+ }
+
+-static struct pci_driver zoran_driver = {
+- .name = "zr36067",
+- .id_table = zr36067_pci_tbl,
+- .probe = zoran_probe,
+- .remove = zoran_remove,
+-};
+-
+-static int __init zoran_init(void)
++static int __init
++init_dc10_cards (void)
+ {
+- int res;
++ int i;
+
++ memset(zoran, 0, sizeof(zoran));
+ printk(KERN_INFO "Zoran MJPEG board driver version %d.%d.%d\n",
+ MAJOR_VERSION, MINOR_VERSION, RELEASE_VERSION);
+
++ /* Look for cards */
++ if (find_zr36057() < 0) {
++ return -EIO;
++ }
++ if (zoran_num == 0)
++ return -ENODEV;
++ dprintk(1, KERN_INFO "%s: %d card(s) found\n", ZORAN_NAME,
++ zoran_num);
+ /* check the parameters we have been given, adjust if necessary */
+ if (v4l_nbufs < 2)
+ v4l_nbufs = 2;
+@@ -1624,22 +1629,37 @@
+ ZORAN_NAME);
+ }
+
+- res = pci_register_driver(&zoran_driver);
+- if (res) {
+- dprintk(1,
+- KERN_ERR
+- "%s: Unable to register ZR36057 driver\n",
+- ZORAN_NAME);
+- return res;
++ /* take care of Natoma chipset and a revision 1 zr36057 */
++ for (i = 0; i < zoran_num; i++) {
++ struct zoran *zr = zoran[i];
++
++ if ((pci_pci_problems & PCIPCI_NATOMA) && zr->revision <= 1) {
++ zr->jpg_buffers.need_contiguous = 1;
++ dprintk(1,
++ KERN_INFO
++ "%s: ZR36057/Natoma bug, max. buffer size is 128K\n",
++ ZR_DEVNAME(zr));
++ }
++
++ if (zr36057_init(zr) < 0) {
++ for (i = 0; i < zoran_num; i++)
++ zoran_release(zoran[i]);
++ return -EIO;
++ }
++ zoran_proc_init(zr);
+ }
+
+ return 0;
+ }
+
+-static void __exit zoran_exit(void)
++static void __exit
++unload_dc10_cards (void)
+ {
+- pci_unregister_driver(&zoran_driver);
++ int i;
++
++ for (i = 0; i < zoran_num; i++)
++ zoran_release(zoran[i]);
+ }
+
+-module_init(zoran_init);
+-module_exit(zoran_exit);
++module_init(init_dc10_cards);
++module_exit(unload_dc10_cards);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/zoran/zoran_card.h linux-2.6.29-rc3.owrt/drivers/media/video/zoran/zoran_card.h
+--- linux-2.6.29.owrt/drivers/media/video/zoran/zoran_card.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/zoran/zoran_card.h 2009-05-10 23:48:28.000000000 +0200
+@@ -40,6 +40,8 @@
+
+ /* Anybody who uses more than four? */
+ #define BUZ_MAX 4
++extern int zoran_num;
++extern struct zoran *zoran[BUZ_MAX];
+
+ extern struct video_device zoran_template;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/zoran/zoran_driver.c linux-2.6.29-rc3.owrt/drivers/media/video/zoran/zoran_driver.c
+--- linux-2.6.29.owrt/drivers/media/video/zoran/zoran_driver.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/zoran/zoran_driver.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1196,54 +1196,83 @@
+ * Open a zoran card. Right now the flags stuff is just playing
+ */
+
+-static int zoran_open(struct file *file)
++static int
++zoran_open(struct file *file)
+ {
+- struct zoran *zr = video_drvdata(file);
++ unsigned int minor = video_devdata(file)->minor;
++ struct zoran *zr = NULL;
+ struct zoran_fh *fh;
+- int res, first_open = 0;
+-
+- dprintk(2, KERN_INFO "%s: zoran_open(%s, pid=[%d]), users(-)=%d\n",
+- ZR_DEVNAME(zr), current->comm, task_pid_nr(current), zr->user + 1);
++ int i, res, first_open = 0, have_module_locks = 0;
+
+ lock_kernel();
++ /* find the device */
++ for (i = 0; i < zoran_num; i++) {
++ if (zoran[i]->video_dev->minor == minor) {
++ zr = zoran[i];
++ break;
++ }
++ }
++
++ if (!zr) {
++ dprintk(1, KERN_ERR "%s: device not found!\n", ZORAN_NAME);
++ res = -ENODEV;
++ goto open_unlock_and_return;
++ }
+
+ /* see fs/device.c - the kernel already locks during open(),
+ * so locking ourselves only causes deadlocks */
+ /*mutex_lock(&zr->resource_lock);*/
+
+- if (zr->user >= 2048) {
+- dprintk(1, KERN_ERR "%s: too many users (%d) on device\n",
+- ZR_DEVNAME(zr), zr->user);
+- res = -EBUSY;
+- goto fail_unlock;
+- }
+-
+ if (!zr->decoder) {
+ dprintk(1,
+ KERN_ERR "%s: no TV decoder loaded for device!\n",
+ ZR_DEVNAME(zr));
+ res = -EIO;
+- goto fail_unlock;
++ goto open_unlock_and_return;
+ }
+
++ /* try to grab a module lock */
++ if (!try_module_get(THIS_MODULE)) {
++ dprintk(1,
++ KERN_ERR
++ "%s: failed to acquire my own lock! PANIC!\n",
++ ZR_DEVNAME(zr));
++ res = -ENODEV;
++ goto open_unlock_and_return;
++ }
+ if (!try_module_get(zr->decoder->driver->driver.owner)) {
+ dprintk(1,
+ KERN_ERR
+- "%s: failed to grab ownership of video decoder\n",
++ "%s: failed to grab ownership of i2c decoder\n",
+ ZR_DEVNAME(zr));
+ res = -EIO;
+- goto fail_unlock;
++ module_put(THIS_MODULE);
++ goto open_unlock_and_return;
+ }
+ if (zr->encoder &&
+ !try_module_get(zr->encoder->driver->driver.owner)) {
+ dprintk(1,
+ KERN_ERR
+- "%s: failed to grab ownership of video encoder\n",
++ "%s: failed to grab ownership of i2c encoder\n",
+ ZR_DEVNAME(zr));
+ res = -EIO;
+- goto fail_decoder;
++ module_put(zr->decoder->driver->driver.owner);
++ module_put(THIS_MODULE);
++ goto open_unlock_and_return;
++ }
++
++ have_module_locks = 1;
++
++ if (zr->user >= 2048) {
++ dprintk(1, KERN_ERR "%s: too many users (%d) on device\n",
++ ZR_DEVNAME(zr), zr->user);
++ res = -EBUSY;
++ goto open_unlock_and_return;
+ }
+
++ dprintk(1, KERN_INFO "%s: zoran_open(%s, pid=[%d]), users(-)=%d\n",
++ ZR_DEVNAME(zr), current->comm, task_pid_nr(current), zr->user);
++
+ /* now, create the open()-specific file_ops struct */
+ fh = kzalloc(sizeof(struct zoran_fh), GFP_KERNEL);
+ if (!fh) {
+@@ -1252,7 +1281,7 @@
+ "%s: zoran_open() - allocation of zoran_fh failed\n",
+ ZR_DEVNAME(zr));
+ res = -ENOMEM;
+- goto fail_encoder;
++ goto open_unlock_and_return;
+ }
+ /* used to be BUZ_MAX_WIDTH/HEIGHT, but that gives overflows
+ * on norm-change! */
+@@ -1263,8 +1292,9 @@
+ KERN_ERR
+ "%s: zoran_open() - allocation of overlay_mask failed\n",
+ ZR_DEVNAME(zr));
++ kfree(fh);
+ res = -ENOMEM;
+- goto fail_fh;
++ goto open_unlock_and_return;
+ }
+
+ if (zr->user++ == 0)
+@@ -1289,18 +1319,21 @@
+
+ return 0;
+
+-fail_fh:
+- kfree(fh);
+-fail_encoder:
+- if (zr->encoder)
+- module_put(zr->encoder->driver->driver.owner);
+-fail_decoder:
+- module_put(zr->decoder->driver->driver.owner);
+-fail_unlock:
+- unlock_kernel();
++open_unlock_and_return:
++ /* if we grabbed locks, release them accordingly */
++ if (have_module_locks) {
++ module_put(zr->decoder->driver->driver.owner);
++ if (zr->encoder) {
++ module_put(zr->encoder->driver->driver.owner);
++ }
++ module_put(THIS_MODULE);
++ }
+
+- dprintk(2, KERN_INFO "%s: open failed (%d), users(-)=%d\n",
+- ZR_DEVNAME(zr), res, zr->user);
++ /* if there's no device found, we didn't obtain the lock either */
++ if (zr) {
++ /*mutex_unlock(&zr->resource_lock);*/
++ }
++ unlock_kernel();
+
+ return res;
+ }
+@@ -1311,8 +1344,8 @@
+ struct zoran_fh *fh = file->private_data;
+ struct zoran *zr = fh->zr;
+
+- dprintk(2, KERN_INFO "%s: zoran_close(%s, pid=[%d]), users(+)=%d\n",
+- ZR_DEVNAME(zr), current->comm, task_pid_nr(current), zr->user - 1);
++ dprintk(1, KERN_INFO "%s: zoran_close(%s, pid=[%d]), users(+)=%d\n",
++ ZR_DEVNAME(zr), current->comm, task_pid_nr(current), zr->user);
+
+ /* kernel locks (fs/device.c), so don't do that ourselves
+ * (prevents deadlocks) */
+@@ -1358,8 +1391,10 @@
+
+ /* release locks on the i2c modules */
+ module_put(zr->decoder->driver->driver.owner);
+- if (zr->encoder)
+- module_put(zr->encoder->driver->driver.owner);
++ if (zr->encoder) {
++ module_put(zr->encoder->driver->driver.owner);
++ }
++ module_put(THIS_MODULE);
+
+ /*mutex_unlock(&zr->resource_lock);*/
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/media/video/zoran/zoran.h linux-2.6.29-rc3.owrt/drivers/media/video/zoran/zoran.h
+--- linux-2.6.29.owrt/drivers/media/video/zoran/zoran.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/media/video/zoran/zoran.h 2009-05-10 23:48:28.000000000 +0200
+@@ -349,6 +349,7 @@
+ u16 i2c_decoder, i2c_encoder; /* I2C types */
+ u16 video_vfe, video_codec; /* videocodec types */
+ u16 audio_chip; /* audio type */
++ u16 vendor_id, device_id; /* subsystem vendor/device ID */
+
+ int inputs; /* number of video inputs */
+ struct input {
+@@ -400,6 +401,7 @@
+ char name[32]; /* name of this device */
+ struct pci_dev *pci_dev; /* PCI device */
+ unsigned char revision; /* revision of zr36057 */
++ unsigned int zr36057_adr; /* bus address of IO mem returned by PCI BIOS */
+ unsigned char __iomem *zr36057_mem;/* pointer to mapped IO memory */
+
+ spinlock_t spinlock; /* Spinlock */
+@@ -488,10 +490,16 @@
+ wait_queue_head_t test_q;
+ };
+
+-/* There was something called _ALPHA_BUZ that used the PCI address instead of
+- * the kernel iomapped address for btread/btwrite. */
++/*The following should be done in more portable way. It depends on define
++ of _ALPHA_BUZ in the Makefile.*/
++
++#ifdef _ALPHA_BUZ
++#define btwrite(dat,adr) writel((dat), zr->zr36057_adr+(adr))
++#define btread(adr) readl(zr->zr36057_adr+(adr))
++#else
+ #define btwrite(dat,adr) writel((dat), zr->zr36057_mem+(adr))
+ #define btread(adr) readl(zr->zr36057_mem+(adr))
++#endif
+
+ #define btand(dat,adr) btwrite((dat) & btread(adr), adr)
+ #define btor(dat,adr) btwrite((dat) | btread(adr), adr)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/message/fusion/mptbase.c linux-2.6.29-rc3.owrt/drivers/message/fusion/mptbase.c
+--- linux-2.6.29.owrt/drivers/message/fusion/mptbase.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/message/fusion/mptbase.c 2009-05-10 23:48:28.000000000 +0200
+@@ -91,9 +91,9 @@
+ controllers (default=0)");
+
+ static int mpt_msi_enable_sas;
+-module_param(mpt_msi_enable_sas, int, 0);
++module_param(mpt_msi_enable_sas, int, 1);
+ MODULE_PARM_DESC(mpt_msi_enable_sas, " Enable MSI Support for SAS \
+- controllers (default=0)");
++ controllers (default=1)");
+
+
+ static int mpt_channel_mapping;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mfd/htc-egpio.c linux-2.6.29-rc3.owrt/drivers/mfd/htc-egpio.c
+--- linux-2.6.29.owrt/drivers/mfd/htc-egpio.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mfd/htc-egpio.c 2009-05-10 23:48:28.000000000 +0200
+@@ -286,7 +286,7 @@
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res)
+ goto fail;
+- ei->base_addr = ioremap_nocache(res->start, resource_size(res));
++ ei->base_addr = ioremap_nocache(res->start, res->end - res->start);
+ if (!ei->base_addr)
+ goto fail;
+ pr_debug("EGPIO phys=%08x virt=%p\n", (u32)res->start, ei->base_addr);
+@@ -307,7 +307,7 @@
+
+ ei->nchips = pdata->num_chips;
+ ei->chip = kzalloc(sizeof(struct egpio_chip) * ei->nchips, GFP_KERNEL);
+- if (!ei->chip) {
++ if (!ei) {
+ ret = -ENOMEM;
+ goto fail;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mfd/pcf50633-core.c linux-2.6.29-rc3.owrt/drivers/mfd/pcf50633-core.c
+--- linux-2.6.29.owrt/drivers/mfd/pcf50633-core.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mfd/pcf50633-core.c 2009-05-10 23:48:28.000000000 +0200
+@@ -626,6 +626,7 @@
+ }
+
+ if (client->irq) {
++ set_irq_handler(client->irq, handle_level_irq);
+ ret = request_irq(client->irq, pcf50633_irq,
+ IRQF_TRIGGER_LOW, "pcf50633", pcf);
+
+@@ -678,7 +679,6 @@
+
+ static struct i2c_device_id pcf50633_id_table[] = {
+ {"pcf50633", 0x73},
+- {/* end of list */}
+ };
+
+ static struct i2c_driver pcf50633_driver = {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mfd/sm501.c linux-2.6.29-rc3.owrt/drivers/mfd/sm501.c
+--- linux-2.6.29.owrt/drivers/mfd/sm501.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mfd/sm501.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1050,7 +1050,7 @@
+ return gpiochip_add(gchip);
+ }
+
+-static int __devinit sm501_register_gpio(struct sm501_devdata *sm)
++static int sm501_register_gpio(struct sm501_devdata *sm)
+ {
+ struct sm501_gpio *gpio = &sm->gpio;
+ resource_size_t iobase = sm->io_res->start + SM501_GPIO;
+@@ -1321,7 +1321,7 @@
+ * Common init code for an SM501
+ */
+
+-static int __devinit sm501_init_dev(struct sm501_devdata *sm)
++static int sm501_init_dev(struct sm501_devdata *sm)
+ {
+ struct sm501_initdata *idata;
+ struct sm501_platdata *pdata;
+@@ -1397,7 +1397,7 @@
+ return 0;
+ }
+
+-static int __devinit sm501_plat_probe(struct platform_device *dev)
++static int sm501_plat_probe(struct platform_device *dev)
+ {
+ struct sm501_devdata *sm;
+ int ret;
+@@ -1586,8 +1586,8 @@
+ .gpio_base = -1,
+ };
+
+-static int __devinit sm501_pci_probe(struct pci_dev *dev,
+- const struct pci_device_id *id)
++static int sm501_pci_probe(struct pci_dev *dev,
++ const struct pci_device_id *id)
+ {
+ struct sm501_devdata *sm;
+ int err;
+@@ -1693,7 +1693,7 @@
+ sm501_gpio_remove(sm);
+ }
+
+-static void __devexit sm501_pci_remove(struct pci_dev *dev)
++static void sm501_pci_remove(struct pci_dev *dev)
+ {
+ struct sm501_devdata *sm = pci_get_drvdata(dev);
+
+@@ -1727,16 +1727,16 @@
+
+ MODULE_DEVICE_TABLE(pci, sm501_pci_tbl);
+
+-static struct pci_driver sm501_pci_driver = {
++static struct pci_driver sm501_pci_drv = {
+ .name = "sm501",
+ .id_table = sm501_pci_tbl,
+ .probe = sm501_pci_probe,
+- .remove = __devexit_p(sm501_pci_remove),
++ .remove = sm501_pci_remove,
+ };
+
+ MODULE_ALIAS("platform:sm501");
+
+-static struct platform_driver sm501_plat_driver = {
++static struct platform_driver sm501_plat_drv = {
+ .driver = {
+ .name = "sm501",
+ .owner = THIS_MODULE,
+@@ -1749,14 +1749,14 @@
+
+ static int __init sm501_base_init(void)
+ {
+- platform_driver_register(&sm501_plat_driver);
+- return pci_register_driver(&sm501_pci_driver);
++ platform_driver_register(&sm501_plat_drv);
++ return pci_register_driver(&sm501_pci_drv);
+ }
+
+ static void __exit sm501_base_exit(void)
+ {
+- platform_driver_unregister(&sm501_plat_driver);
+- pci_unregister_driver(&sm501_pci_driver);
++ platform_driver_unregister(&sm501_plat_drv);
++ pci_unregister_driver(&sm501_pci_drv);
+ }
+
+ module_init(sm501_base_init);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mfd/twl4030-core.c linux-2.6.29-rc3.owrt/drivers/mfd/twl4030-core.c
+--- linux-2.6.29.owrt/drivers/mfd/twl4030-core.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mfd/twl4030-core.c 2009-05-10 23:48:28.000000000 +0200
+@@ -38,7 +38,7 @@
+ #include <linux/i2c.h>
+ #include <linux/i2c/twl4030.h>
+
+-#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
++#ifdef CONFIG_ARM
+ #include <mach/cpu.h>
+ #endif
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mfd/wm8350-core.c linux-2.6.29-rc3.owrt/drivers/mfd/wm8350-core.c
+--- linux-2.6.29.owrt/drivers/mfd/wm8350-core.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mfd/wm8350-core.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1111,7 +1111,7 @@
+ do {
+ schedule_timeout_interruptible(1);
+ reg = wm8350_reg_read(wm8350, WM8350_DIGITISER_CONTROL_1);
+- } while (--tries && (reg & WM8350_AUXADC_POLL));
++ } while (tries-- && (reg & WM8350_AUXADC_POLL));
+
+ if (!tries)
+ dev_err(wm8350->dev, "adc chn %d read timeout\n", channel);
+@@ -1297,29 +1297,14 @@
+ int wm8350_device_init(struct wm8350 *wm8350, int irq,
+ struct wm8350_platform_data *pdata)
+ {
+- int ret;
++ int ret = -EINVAL;
+ u16 id1, id2, mask_rev;
+ u16 cust_id, mode, chip_rev;
+
+ /* get WM8350 revision and config mode */
+- ret = wm8350->read_dev(wm8350, WM8350_RESET_ID, sizeof(id1), &id1);
+- if (ret != 0) {
+- dev_err(wm8350->dev, "Failed to read ID: %d\n", ret);
+- goto err;
+- }
+-
+- ret = wm8350->read_dev(wm8350, WM8350_ID, sizeof(id2), &id2);
+- if (ret != 0) {
+- dev_err(wm8350->dev, "Failed to read ID: %d\n", ret);
+- goto err;
+- }
+-
+- ret = wm8350->read_dev(wm8350, WM8350_REVISION, sizeof(mask_rev),
+- &mask_rev);
+- if (ret != 0) {
+- dev_err(wm8350->dev, "Failed to read revision: %d\n", ret);
+- goto err;
+- }
++ wm8350->read_dev(wm8350, WM8350_RESET_ID, sizeof(id1), &id1);
++ wm8350->read_dev(wm8350, WM8350_ID, sizeof(id2), &id2);
++ wm8350->read_dev(wm8350, WM8350_REVISION, sizeof(mask_rev), &mask_rev);
+
+ id1 = be16_to_cpu(id1);
+ id2 = be16_to_cpu(id2);
+@@ -1383,11 +1368,6 @@
+ wm8350->power.rev_g_coeff = 1;
+ break;
+
+- case 1:
+- dev_info(wm8350->dev, "WM8351 Rev B\n");
+- wm8350->power.rev_g_coeff = 1;
+- break;
+-
+ default:
+ dev_err(wm8350->dev, "Unknown WM8351 CHIP_REV\n");
+ ret = -ENODEV;
+@@ -1424,12 +1404,14 @@
+ return ret;
+ }
+
+- wm8350_reg_write(wm8350, WM8350_SYSTEM_INTERRUPTS_MASK, 0xFFFF);
+- wm8350_reg_write(wm8350, WM8350_INT_STATUS_1_MASK, 0xFFFF);
+- wm8350_reg_write(wm8350, WM8350_INT_STATUS_2_MASK, 0xFFFF);
+- wm8350_reg_write(wm8350, WM8350_UNDER_VOLTAGE_INT_STATUS_MASK, 0xFFFF);
+- wm8350_reg_write(wm8350, WM8350_GPIO_INT_STATUS_MASK, 0xFFFF);
+- wm8350_reg_write(wm8350, WM8350_COMPARATOR_INT_STATUS_MASK, 0xFFFF);
++ if (pdata && pdata->init) {
++ ret = pdata->init(wm8350);
++ if (ret != 0) {
++ dev_err(wm8350->dev, "Platform init() failed: %d\n",
++ ret);
++ goto err;
++ }
++ }
+
+ mutex_init(&wm8350->auxadc_mutex);
+ mutex_init(&wm8350->irq_mutex);
+@@ -1448,15 +1430,6 @@
+ }
+ wm8350->chip_irq = irq;
+
+- if (pdata && pdata->init) {
+- ret = pdata->init(wm8350);
+- if (ret != 0) {
+- dev_err(wm8350->dev, "Platform init() failed: %d\n",
+- ret);
+- goto err;
+- }
+- }
+-
+ wm8350_reg_write(wm8350, WM8350_SYSTEM_INTERRUPTS_MASK, 0x0);
+
+ wm8350_client_dev_register(wm8350, "wm8350-codec",
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mfd/wm8350-regmap.c linux-2.6.29-rc3.owrt/drivers/mfd/wm8350-regmap.c
+--- linux-2.6.29.owrt/drivers/mfd/wm8350-regmap.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mfd/wm8350-regmap.c 2009-05-10 23:48:28.000000000 +0200
+@@ -3188,7 +3188,7 @@
+ { 0x7CFF, 0x0C00, 0x7FFF }, /* R1 - ID */
+ { 0x0000, 0x0000, 0x0000 }, /* R2 */
+ { 0xBE3B, 0xBE3B, 0x8000 }, /* R3 - System Control 1 */
+- { 0xFEF7, 0xFEF7, 0xF800 }, /* R4 - System Control 2 */
++ { 0xFCF7, 0xFCF7, 0xF800 }, /* R4 - System Control 2 */
+ { 0x80FF, 0x80FF, 0x8000 }, /* R5 - System Hibernate */
+ { 0xFB0E, 0xFB0E, 0x0000 }, /* R6 - Interface Control */
+ { 0x0000, 0x0000, 0x0000 }, /* R7 */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/misc/atmel-ssc.c linux-2.6.29-rc3.owrt/drivers/misc/atmel-ssc.c
+--- linux-2.6.29.owrt/drivers/misc/atmel-ssc.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/misc/atmel-ssc.c 2009-05-10 23:48:28.000000000 +0200
+@@ -35,7 +35,7 @@
+
+ if (!ssc_valid) {
+ spin_unlock(&user_lock);
+- pr_err("ssc: ssc%d platform device is missing\n", ssc_num);
++ dev_dbg(&ssc->pdev->dev, "could not find requested device\n");
+ return ERR_PTR(-ENODEV);
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/misc/hpilo.c linux-2.6.29-rc3.owrt/drivers/misc/hpilo.c
+--- linux-2.6.29.owrt/drivers/misc/hpilo.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/misc/hpilo.c 2009-05-10 23:48:28.000000000 +0200
+@@ -207,7 +207,7 @@
+ &device_ccb->recv_ctrl);
+
+ /* give iLO some time to process stop request */
+- for (retries = MAX_WAIT; retries > 0; retries--) {
++ for (retries = 1000; retries > 0; retries--) {
+ doorbell_set(driver_ccb);
+ udelay(1);
+ if (!(ioread32(&device_ccb->send_ctrl) & (1 << CTRL_BITPOS_A))
+@@ -309,7 +309,7 @@
+ doorbell_clr(driver_ccb);
+
+ /* make sure iLO is really handling requests */
+- for (i = MAX_WAIT; i > 0; i--) {
++ for (i = 1000; i > 0; i--) {
+ if (ilo_pkt_dequeue(hw, driver_ccb, SENDQ, &pkt_id, NULL, NULL))
+ break;
+ udelay(1);
+@@ -326,7 +326,7 @@
+
+ return 0;
+ free:
+- ilo_ccb_close(pdev, data);
++ pci_free_consistent(pdev, data->dma_size, data->dma_va, data->dma_pa);
+ out:
+ return error;
+ }
+@@ -710,7 +710,6 @@
+
+ static struct pci_device_id ilo_devices[] = {
+ { PCI_DEVICE(PCI_VENDOR_ID_COMPAQ, 0xB204) },
+- { PCI_DEVICE(PCI_VENDOR_ID_HP, 0x3307) },
+ { }
+ };
+ MODULE_DEVICE_TABLE(pci, ilo_devices);
+@@ -759,7 +758,7 @@
+ class_destroy(ilo_class);
+ }
+
+-MODULE_VERSION("1.0");
++MODULE_VERSION("0.05");
+ MODULE_ALIAS(ILO_NAME);
+ MODULE_DESCRIPTION(ILO_NAME);
+ MODULE_AUTHOR("David Altobelli <david.altobelli@hp.com>");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/misc/hpilo.h linux-2.6.29-rc3.owrt/drivers/misc/hpilo.h
+--- linux-2.6.29.owrt/drivers/misc/hpilo.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/misc/hpilo.h 2009-05-10 23:48:28.000000000 +0200
+@@ -19,8 +19,6 @@
+ #define MAX_ILO_DEV 1
+ /* max number of files */
+ #define MAX_OPEN (MAX_CCB * MAX_ILO_DEV)
+-/* spin counter for open/close delay */
+-#define MAX_WAIT 10000
+
+ /*
+ * Per device, used to track global memory allocations.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/misc/Kconfig linux-2.6.29-rc3.owrt/drivers/misc/Kconfig
+--- linux-2.6.29.owrt/drivers/misc/Kconfig 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/misc/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -217,7 +217,6 @@
+ depends on EXPERIMENTAL
+ depends on BACKLIGHT_CLASS_DEVICE
+ depends on RFKILL
+- depends on POWER_SUPPLY
+ default n
+ ---help---
+ This driver adds support for rfkill and backlight control to Dell
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/misc/sgi-xp/xpc_channel.c linux-2.6.29-rc3.owrt/drivers/misc/sgi-xp/xpc_channel.c
+--- linux-2.6.29.owrt/drivers/misc/sgi-xp/xpc_channel.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/misc/sgi-xp/xpc_channel.c 2009-05-10 23:48:28.000000000 +0200
+@@ -49,6 +49,9 @@
+
+ if (ch->flags & (XPC_C_CONNECTED | XPC_C_DISCONNECTING))
+ return;
++
++ DBUG_ON(ch->local_msgqueue == NULL);
++ DBUG_ON(ch->remote_msgqueue == NULL);
+ }
+
+ if (!(ch->flags & XPC_C_OPENREPLY)) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/misc/sgi-xp/xpc.h linux-2.6.29-rc3.owrt/drivers/misc/sgi-xp/xpc.h
+--- linux-2.6.29.owrt/drivers/misc/sgi-xp/xpc.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/misc/sgi-xp/xpc.h 2009-05-10 23:48:28.000000000 +0200
+@@ -3,7 +3,7 @@
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+- * Copyright (c) 2004-2009 Silicon Graphics, Inc. All Rights Reserved.
++ * Copyright (c) 2004-2008 Silicon Graphics, Inc. All Rights Reserved.
+ */
+
+ /*
+@@ -514,8 +514,7 @@
+ /* partition's notify mq */
+
+ struct xpc_send_msg_slot_uv *send_msg_slots;
+- void *recv_msg_slots; /* each slot will hold a xpc_notify_mq_msg_uv */
+- /* structure plus the user's payload */
++ struct xpc_notify_mq_msg_uv *recv_msg_slots;
+
+ struct xpc_fifo_head_uv msg_slot_free_list;
+ struct xpc_fifo_head_uv recv_msg_list; /* deliverable payloads */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/misc/sgi-xp/xpc_sn2.c linux-2.6.29-rc3.owrt/drivers/misc/sgi-xp/xpc_sn2.c
+--- linux-2.6.29.owrt/drivers/misc/sgi-xp/xpc_sn2.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/misc/sgi-xp/xpc_sn2.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1106,6 +1106,8 @@
+ int n_IRQs_expected;
+ int n_IRQs_detected;
+
++ DBUG_ON(xpc_activate_IRQ_rcvd == 0);
++
+ spin_lock_irqsave(&xpc_activate_IRQ_rcvd_lock, irq_flags);
+ n_IRQs_expected = xpc_activate_IRQ_rcvd;
+ xpc_activate_IRQ_rcvd = 0;
+@@ -1724,7 +1726,6 @@
+ msg = (struct xpc_msg_sn2 *)((u64)ch_sn2->local_msgqueue +
+ (get % ch->local_nentries) *
+ ch->entry_size);
+- DBUG_ON(!(msg->flags & XPC_M_SN2_READY));
+ msg->flags = 0;
+ } while (++get < ch_sn2->remote_GP.get);
+ }
+@@ -1739,18 +1740,11 @@
+ struct xpc_msg_sn2 *msg;
+ s64 put;
+
+- /* flags are zeroed when the buffer is allocated */
+- if (ch_sn2->remote_GP.put < ch->remote_nentries)
+- return;
+-
+- put = max(ch_sn2->w_remote_GP.put, ch->remote_nentries);
++ put = ch_sn2->w_remote_GP.put;
+ do {
+ msg = (struct xpc_msg_sn2 *)((u64)ch_sn2->remote_msgqueue +
+ (put % ch->remote_nentries) *
+ ch->entry_size);
+- DBUG_ON(!(msg->flags & XPC_M_SN2_READY));
+- DBUG_ON(!(msg->flags & XPC_M_SN2_DONE));
+- DBUG_ON(msg->number != put - ch->remote_nentries);
+ msg->flags = 0;
+ } while (++put < ch_sn2->remote_GP.put);
+ }
+@@ -1842,7 +1836,6 @@
+ */
+ xpc_clear_remote_msgqueue_flags_sn2(ch);
+
+- smp_wmb(); /* ensure flags have been cleared before bte_copy */
+ ch_sn2->w_remote_GP.put = ch_sn2->remote_GP.put;
+
+ dev_dbg(xpc_chan, "w_remote_GP.put changed to %ld, partid=%d, "
+@@ -1941,7 +1934,7 @@
+ break;
+
+ get = ch_sn2->w_local_GP.get;
+- smp_rmb(); /* guarantee that .get loads before .put */
++ rmb(); /* guarantee that .get loads before .put */
+ if (get == ch_sn2->w_remote_GP.put)
+ break;
+
+@@ -1963,13 +1956,11 @@
+
+ msg = xpc_pull_remote_msg_sn2(ch, get);
+
+- if (msg != NULL) {
+- DBUG_ON(msg->number != get);
+- DBUG_ON(msg->flags & XPC_M_SN2_DONE);
+- DBUG_ON(!(msg->flags & XPC_M_SN2_READY));
++ DBUG_ON(msg != NULL && msg->number != get);
++ DBUG_ON(msg != NULL && (msg->flags & XPC_M_SN2_DONE));
++ DBUG_ON(msg != NULL && !(msg->flags & XPC_M_SN2_READY));
+
+- payload = &msg->payload;
+- }
++ payload = &msg->payload;
+ break;
+ }
+
+@@ -2062,7 +2053,7 @@
+ while (1) {
+
+ put = ch_sn2->w_local_GP.put;
+- smp_rmb(); /* guarantee that .put loads before .get */
++ rmb(); /* guarantee that .put loads before .get */
+ if (put - ch_sn2->w_remote_GP.get < ch->local_nentries) {
+
+ /* There are available message entries. We need to try
+@@ -2195,7 +2186,7 @@
+ * The preceding store of msg->flags must occur before the following
+ * load of local_GP->put.
+ */
+- smp_mb();
++ mb();
+
+ /* see if the message is next in line to be sent, if so send it */
+
+@@ -2286,9 +2277,8 @@
+ dev_dbg(xpc_chan, "msg=0x%p, msg_number=%ld, partid=%d, channel=%d\n",
+ (void *)msg, msg_number, ch->partid, ch->number);
+
+- DBUG_ON((((u64)msg - (u64)ch->sn.sn2.remote_msgqueue) / ch->entry_size) !=
++ DBUG_ON((((u64)msg - (u64)ch->remote_msgqueue) / ch->entry_size) !=
+ msg_number % ch->remote_nentries);
+- DBUG_ON(!(msg->flags & XPC_M_SN2_READY));
+ DBUG_ON(msg->flags & XPC_M_SN2_DONE);
+
+ msg->flags |= XPC_M_SN2_DONE;
+@@ -2297,7 +2287,7 @@
+ * The preceding store of msg->flags must occur before the following
+ * load of local_GP->get.
+ */
+- smp_mb();
++ mb();
+
+ /*
+ * See if this message is next in line to be acknowledged as having
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/misc/sgi-xp/xpc_uv.c linux-2.6.29-rc3.owrt/drivers/misc/sgi-xp/xpc_uv.c
+--- linux-2.6.29.owrt/drivers/misc/sgi-xp/xpc_uv.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/misc/sgi-xp/xpc_uv.c 2009-05-10 23:48:28.000000000 +0200
+@@ -3,7 +3,7 @@
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+- * Copyright (c) 2008-2009 Silicon Graphics, Inc. All Rights Reserved.
++ * Copyright (c) 2008 Silicon Graphics, Inc. All Rights Reserved.
+ */
+
+ /*
+@@ -1010,8 +1010,8 @@
+ continue;
+
+ for (entry = 0; entry < nentries; entry++) {
+- msg_slot = ch_uv->recv_msg_slots +
+- entry * ch->entry_size;
++ msg_slot = ch_uv->recv_msg_slots + entry *
++ ch->entry_size;
+
+ msg_slot->hdr.msg_slot_number = entry;
+ }
+@@ -1308,8 +1308,9 @@
+ /* we're dealing with a normal message sent via the notify_mq */
+ ch_uv = &ch->sn.uv;
+
+- msg_slot = ch_uv->recv_msg_slots +
+- (msg->hdr.msg_slot_number % ch->remote_nentries) * ch->entry_size;
++ msg_slot = (struct xpc_notify_mq_msg_uv *)((u64)ch_uv->recv_msg_slots +
++ (msg->hdr.msg_slot_number % ch->remote_nentries) *
++ ch->entry_size);
+
+ BUG_ON(msg->hdr.msg_slot_number != msg_slot->hdr.msg_slot_number);
+ BUG_ON(msg_slot->hdr.size != 0);
+@@ -1422,7 +1423,7 @@
+ atomic_inc(&ch->n_to_notify);
+
+ msg_slot->key = key;
+- smp_wmb(); /* a non-NULL func must hit memory after the key */
++ wmb(); /* a non-NULL func must hit memory after the key */
+ msg_slot->func = func;
+
+ if (ch->flags & XPC_C_DISCONNECTING) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/misc/sgi-xp/xpnet.c linux-2.6.29-rc3.owrt/drivers/misc/sgi-xp/xpnet.c
+--- linux-2.6.29.owrt/drivers/misc/sgi-xp/xpnet.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/misc/sgi-xp/xpnet.c 2009-05-10 23:48:28.000000000 +0200
+@@ -3,7 +3,7 @@
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+- * Copyright (C) 1999-2009 Silicon Graphics, Inc. All rights reserved.
++ * Copyright (C) 1999-2008 Silicon Graphics, Inc. All rights reserved.
+ */
+
+ /*
+@@ -551,7 +551,6 @@
+
+ netif_carrier_off(xpnet_device);
+
+- xpnet_device->netdev_ops = &xpnet_netdev_ops;
+ xpnet_device->mtu = XPNET_DEF_MTU;
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mmc/card/block.c linux-2.6.29-rc3.owrt/drivers/mmc/card/block.c
+--- linux-2.6.29.owrt/drivers/mmc/card/block.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mmc/card/block.c 2009-05-10 23:48:28.000000000 +0200
+@@ -584,7 +584,7 @@
+ if (err)
+ goto out;
+
+- string_get_size((u64)get_capacity(md->disk) << 9, STRING_UNITS_2,
++ string_get_size(get_capacity(md->disk) << 9, STRING_UNITS_2,
+ cap_str, sizeof(cap_str));
+ printk(KERN_INFO "%s: %s %s %s %s\n",
+ md->disk->disk_name, mmc_card_id(card), mmc_card_name(card),
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mmc/card/mmc_test.c linux-2.6.29-rc3.owrt/drivers/mmc/card/mmc_test.c
+--- linux-2.6.29.owrt/drivers/mmc/card/mmc_test.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mmc/card/mmc_test.c 2009-05-10 23:48:28.000000000 +0200
+@@ -494,7 +494,7 @@
+
+ sg_init_one(&sg, test->buffer, 512);
+
+- ret = mmc_test_simple_transfer(test, &sg, 1, 0, 1, 512, 0);
++ ret = mmc_test_simple_transfer(test, &sg, 1, 0, 1, 512, 1);
+ if (ret)
+ return ret;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mmc/core/mmc_ops.c linux-2.6.29-rc3.owrt/drivers/mmc/core/mmc_ops.c
+--- linux-2.6.29.owrt/drivers/mmc/core/mmc_ops.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mmc/core/mmc_ops.c 2009-05-10 23:48:28.000000000 +0200
+@@ -248,15 +248,12 @@
+
+ sg_init_one(&sg, data_buf, len);
+
+- if (opcode == MMC_SEND_CSD || opcode == MMC_SEND_CID) {
+- /*
+- * The spec states that CSR and CID accesses have a timeout
+- * of 64 clock cycles.
+- */
+- data.timeout_ns = 0;
+- data.timeout_clks = 64;
+- } else
+- mmc_set_data_timeout(&data, card);
++ /*
++ * The spec states that CSR and CID accesses have a timeout
++ * of 64 clock cycles.
++ */
++ data.timeout_ns = 0;
++ data.timeout_clks = 64;
+
+ mmc_wait_for_req(host, &mrq);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mmc/host/atmel-mci.c linux-2.6.29-rc3.owrt/drivers/mmc/host/atmel-mci.c
+--- linux-2.6.29.owrt/drivers/mmc/host/atmel-mci.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mmc/host/atmel-mci.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1548,10 +1548,9 @@
+ {
+ struct dw_dma_slave *dws = slave;
+
+- if (dws->dma_dev == chan->device->dev) {
+- chan->private = dws;
++ if (dws->dma_dev == chan->device->dev)
+ return true;
+- } else
++ else
+ return false;
+ }
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mmc/host/Kconfig linux-2.6.29-rc3.owrt/drivers/mmc/host/Kconfig
+--- linux-2.6.29.owrt/drivers/mmc/host/Kconfig 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mmc/host/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -145,16 +145,6 @@
+
+ If unsure, say N.
+
+-config MMC_MXC
+- tristate "Freescale i.MX2/3 Multimedia Card Interface support"
+- depends on ARCH_MXC
+- help
+- This selects the Freescale i.MX2/3 Multimedia card Interface.
+- If you have a i.MX platform with a Multimedia Card slot,
+- say Y or M here.
+-
+- If unsure, say N.
+-
+ config MMC_TIFM_SD
+ tristate "TI Flash Media MMC/SD Interface support (EXPERIMENTAL)"
+ depends on EXPERIMENTAL && PCI
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mmc/host/Makefile linux-2.6.29-rc3.owrt/drivers/mmc/host/Makefile
+--- linux-2.6.29.owrt/drivers/mmc/host/Makefile 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mmc/host/Makefile 2009-05-10 23:48:28.000000000 +0200
+@@ -9,7 +9,6 @@
+ obj-$(CONFIG_MMC_ARMMMCI) += mmci.o
+ obj-$(CONFIG_MMC_PXA) += pxamci.o
+ obj-$(CONFIG_MMC_IMX) += imxmmc.o
+-obj-$(CONFIG_MMC_MXC) += mxcmmc.o
+ obj-$(CONFIG_MMC_SDHCI) += sdhci.o
+ obj-$(CONFIG_MMC_SDHCI_PCI) += sdhci-pci.o
+ obj-$(CONFIG_MMC_RICOH_MMC) += ricoh_mmc.o
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mmc/host/mmci.c linux-2.6.29-rc3.owrt/drivers/mmc/host/mmci.c
+--- linux-2.6.29.owrt/drivers/mmc/host/mmci.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mmc/host/mmci.c 2009-05-10 23:48:28.000000000 +0200
+@@ -430,8 +430,6 @@
+ clk = 255;
+ host->cclk = host->mclk / (2 * (clk + 1));
+ }
+- if (host->hw_designer == 0x80)
+- clk |= MCI_FCEN; /* Bug fix in ST IP block */
+ clk |= MCI_CLK_ENABLE;
+ }
+
+@@ -442,27 +440,15 @@
+ case MMC_POWER_OFF:
+ break;
+ case MMC_POWER_UP:
+- /* The ST version does not have this, fall through to POWER_ON */
+- if (host->hw_designer != 0x80) {
+- pwr |= MCI_PWR_UP;
+- break;
+- }
++ pwr |= MCI_PWR_UP;
++ break;
+ case MMC_POWER_ON:
+ pwr |= MCI_PWR_ON;
+ break;
+ }
+
+- if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN) {
+- if (host->hw_designer != 0x80)
+- pwr |= MCI_ROD;
+- else {
+- /*
+- * The ST Micro variant use the ROD bit for something
+- * else and only has OD (Open Drain).
+- */
+- pwr |= MCI_OD;
+- }
+- }
++ if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN)
++ pwr |= MCI_ROD;
+
+ writel(clk, host->base + MMCICLOCK);
+
+@@ -514,12 +500,6 @@
+ }
+
+ host = mmc_priv(mmc);
+- /* Bits 12 thru 19 is the designer */
+- host->hw_designer = (dev->periphid >> 12) & 0xff;
+- /* Bits 20 thru 23 is the revison */
+- host->hw_revision = (dev->periphid >> 20) & 0xf;
+- DBG(host, "designer ID = 0x%02x\n", host->hw_designer);
+- DBG(host, "revision = 0x%01x\n", host->hw_revision);
+ host->clk = clk_get(&dev->dev, NULL);
+ if (IS_ERR(host->clk)) {
+ ret = PTR_ERR(host->clk);
+@@ -713,15 +693,6 @@
+ .id = 0x00041181,
+ .mask = 0x000fffff,
+ },
+- /* ST Micro variants */
+- {
+- .id = 0x00180180,
+- .mask = 0x00ffffff,
+- },
+- {
+- .id = 0x00280180,
+- .mask = 0x00ffffff,
+- },
+ { 0, 0 },
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mmc/host/mmci.h linux-2.6.29-rc3.owrt/drivers/mmc/host/mmci.h
+--- linux-2.6.29.owrt/drivers/mmc/host/mmci.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mmc/host/mmci.h 2009-05-10 23:48:28.000000000 +0200
+@@ -11,23 +11,13 @@
+ #define MCI_PWR_OFF 0x00
+ #define MCI_PWR_UP 0x02
+ #define MCI_PWR_ON 0x03
+-#define MCI_DATA2DIREN (1 << 2)
+-#define MCI_CMDDIREN (1 << 3)
+-#define MCI_DATA0DIREN (1 << 4)
+-#define MCI_DATA31DIREN (1 << 5)
+ #define MCI_OD (1 << 6)
+ #define MCI_ROD (1 << 7)
+-/* The ST Micro version does not have ROD */
+-#define MCI_FBCLKEN (1 << 7)
+-#define MCI_DATA74DIREN (1 << 8)
+
+ #define MMCICLOCK 0x004
+ #define MCI_CLK_ENABLE (1 << 8)
+ #define MCI_CLK_PWRSAVE (1 << 9)
+ #define MCI_CLK_BYPASS (1 << 10)
+-#define MCI_WIDE_BUS (1 << 11)
+-/* HW flow control on the ST Micro version */
+-#define MCI_FCEN (1 << 13)
+
+ #define MMCIARGUMENT 0x008
+ #define MMCICOMMAND 0x00c
+@@ -36,10 +26,6 @@
+ #define MCI_CPSM_INTERRUPT (1 << 8)
+ #define MCI_CPSM_PENDING (1 << 9)
+ #define MCI_CPSM_ENABLE (1 << 10)
+-#define MCI_SDIO_SUSP (1 << 11)
+-#define MCI_ENCMD_COMPL (1 << 12)
+-#define MCI_NIEN (1 << 13)
+-#define MCI_CE_ATACMD (1 << 14)
+
+ #define MMCIRESPCMD 0x010
+ #define MMCIRESPONSE0 0x014
+@@ -53,11 +39,6 @@
+ #define MCI_DPSM_DIRECTION (1 << 1)
+ #define MCI_DPSM_MODE (1 << 2)
+ #define MCI_DPSM_DMAENABLE (1 << 3)
+-#define MCI_DPSM_BLOCKSIZE (1 << 4)
+-#define MCI_DPSM_RWSTART (1 << 8)
+-#define MCI_DPSM_RWSTOP (1 << 9)
+-#define MCI_DPSM_RWMOD (1 << 10)
+-#define MCI_DPSM_SDIOEN (1 << 11)
+
+ #define MMCIDATACNT 0x030
+ #define MMCISTATUS 0x034
+@@ -82,8 +63,6 @@
+ #define MCI_RXFIFOEMPTY (1 << 19)
+ #define MCI_TXDATAAVLBL (1 << 20)
+ #define MCI_RXDATAAVLBL (1 << 21)
+-#define MCI_SDIOIT (1 << 22)
+-#define MCI_CEATAEND (1 << 23)
+
+ #define MMCICLEAR 0x038
+ #define MCI_CMDCRCFAILCLR (1 << 0)
+@@ -96,8 +75,6 @@
+ #define MCI_CMDSENTCLR (1 << 7)
+ #define MCI_DATAENDCLR (1 << 8)
+ #define MCI_DATABLOCKENDCLR (1 << 10)
+-#define MCI_SDIOITC (1 << 22)
+-#define MCI_CEATAENDC (1 << 23)
+
+ #define MMCIMASK0 0x03c
+ #define MCI_CMDCRCFAILMASK (1 << 0)
+@@ -121,8 +98,6 @@
+ #define MCI_RXFIFOEMPTYMASK (1 << 19)
+ #define MCI_TXDATAAVLBLMASK (1 << 20)
+ #define MCI_RXDATAAVLBLMASK (1 << 21)
+-#define MCI_SDIOITMASK (1 << 22)
+-#define MCI_CEATAENDMASK (1 << 23)
+
+ #define MMCIMASK1 0x040
+ #define MMCIFIFOCNT 0x048
+@@ -161,9 +136,6 @@
+ u32 pwr;
+ struct mmc_platform_data *plat;
+
+- u8 hw_designer;
+- u8 hw_revision:4;
+-
+ struct timer_list timer;
+ unsigned int oldstat;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mmc/host/mxcmmc.c linux-2.6.29-rc3.owrt/drivers/mmc/host/mxcmmc.c
+--- linux-2.6.29.owrt/drivers/mmc/host/mxcmmc.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mmc/host/mxcmmc.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,880 +0,0 @@
+-/*
+- * linux/drivers/mmc/host/mxcmmc.c - Freescale i.MX MMCI driver
+- *
+- * This is a driver for the SDHC controller found in Freescale MX2/MX3
+- * SoCs. It is basically the same hardware as found on MX1 (imxmmc.c).
+- * Unlike the hardware found on MX1, this hardware just works and does
+- * not need all the quirks found in imxmmc.c, hence the seperate driver.
+- *
+- * Copyright (C) 2008 Sascha Hauer, Pengutronix <s.hauer@pengutronix.de>
+- * Copyright (C) 2006 Pavel Pisa, PiKRON <ppisa@pikron.com>
+- *
+- * derived from pxamci.c by Russell King
+- *
+- * 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.
+- *
+- */
+-
+-#include <linux/module.h>
+-#include <linux/init.h>
+-#include <linux/ioport.h>
+-#include <linux/platform_device.h>
+-#include <linux/interrupt.h>
+-#include <linux/irq.h>
+-#include <linux/blkdev.h>
+-#include <linux/dma-mapping.h>
+-#include <linux/mmc/host.h>
+-#include <linux/mmc/card.h>
+-#include <linux/delay.h>
+-#include <linux/clk.h>
+-#include <linux/io.h>
+-#include <linux/gpio.h>
+-
+-#include <asm/dma.h>
+-#include <asm/irq.h>
+-#include <asm/sizes.h>
+-#include <mach/mmc.h>
+-
+-#ifdef CONFIG_ARCH_MX2
+-#include <mach/dma-mx1-mx2.h>
+-#define HAS_DMA
+-#endif
+-
+-#define DRIVER_NAME "imx-mmc"
+-
+-#define MMC_REG_STR_STP_CLK 0x00
+-#define MMC_REG_STATUS 0x04
+-#define MMC_REG_CLK_RATE 0x08
+-#define MMC_REG_CMD_DAT_CONT 0x0C
+-#define MMC_REG_RES_TO 0x10
+-#define MMC_REG_READ_TO 0x14
+-#define MMC_REG_BLK_LEN 0x18
+-#define MMC_REG_NOB 0x1C
+-#define MMC_REG_REV_NO 0x20
+-#define MMC_REG_INT_CNTR 0x24
+-#define MMC_REG_CMD 0x28
+-#define MMC_REG_ARG 0x2C
+-#define MMC_REG_RES_FIFO 0x34
+-#define MMC_REG_BUFFER_ACCESS 0x38
+-
+-#define STR_STP_CLK_RESET (1 << 3)
+-#define STR_STP_CLK_START_CLK (1 << 1)
+-#define STR_STP_CLK_STOP_CLK (1 << 0)
+-
+-#define STATUS_CARD_INSERTION (1 << 31)
+-#define STATUS_CARD_REMOVAL (1 << 30)
+-#define STATUS_YBUF_EMPTY (1 << 29)
+-#define STATUS_XBUF_EMPTY (1 << 28)
+-#define STATUS_YBUF_FULL (1 << 27)
+-#define STATUS_XBUF_FULL (1 << 26)
+-#define STATUS_BUF_UND_RUN (1 << 25)
+-#define STATUS_BUF_OVFL (1 << 24)
+-#define STATUS_SDIO_INT_ACTIVE (1 << 14)
+-#define STATUS_END_CMD_RESP (1 << 13)
+-#define STATUS_WRITE_OP_DONE (1 << 12)
+-#define STATUS_DATA_TRANS_DONE (1 << 11)
+-#define STATUS_READ_OP_DONE (1 << 11)
+-#define STATUS_WR_CRC_ERROR_CODE_MASK (3 << 10)
+-#define STATUS_CARD_BUS_CLK_RUN (1 << 8)
+-#define STATUS_BUF_READ_RDY (1 << 7)
+-#define STATUS_BUF_WRITE_RDY (1 << 6)
+-#define STATUS_RESP_CRC_ERR (1 << 5)
+-#define STATUS_CRC_READ_ERR (1 << 3)
+-#define STATUS_CRC_WRITE_ERR (1 << 2)
+-#define STATUS_TIME_OUT_RESP (1 << 1)
+-#define STATUS_TIME_OUT_READ (1 << 0)
+-#define STATUS_ERR_MASK 0x2f
+-
+-#define CMD_DAT_CONT_CMD_RESP_LONG_OFF (1 << 12)
+-#define CMD_DAT_CONT_STOP_READWAIT (1 << 11)
+-#define CMD_DAT_CONT_START_READWAIT (1 << 10)
+-#define CMD_DAT_CONT_BUS_WIDTH_4 (2 << 8)
+-#define CMD_DAT_CONT_INIT (1 << 7)
+-#define CMD_DAT_CONT_WRITE (1 << 4)
+-#define CMD_DAT_CONT_DATA_ENABLE (1 << 3)
+-#define CMD_DAT_CONT_RESPONSE_48BIT_CRC (1 << 0)
+-#define CMD_DAT_CONT_RESPONSE_136BIT (2 << 0)
+-#define CMD_DAT_CONT_RESPONSE_48BIT (3 << 0)
+-
+-#define INT_SDIO_INT_WKP_EN (1 << 18)
+-#define INT_CARD_INSERTION_WKP_EN (1 << 17)
+-#define INT_CARD_REMOVAL_WKP_EN (1 << 16)
+-#define INT_CARD_INSERTION_EN (1 << 15)
+-#define INT_CARD_REMOVAL_EN (1 << 14)
+-#define INT_SDIO_IRQ_EN (1 << 13)
+-#define INT_DAT0_EN (1 << 12)
+-#define INT_BUF_READ_EN (1 << 4)
+-#define INT_BUF_WRITE_EN (1 << 3)
+-#define INT_END_CMD_RES_EN (1 << 2)
+-#define INT_WRITE_OP_DONE_EN (1 << 1)
+-#define INT_READ_OP_EN (1 << 0)
+-
+-struct mxcmci_host {
+- struct mmc_host *mmc;
+- struct resource *res;
+- void __iomem *base;
+- int irq;
+- int detect_irq;
+- int dma;
+- int do_dma;
+- unsigned int power_mode;
+- struct imxmmc_platform_data *pdata;
+-
+- struct mmc_request *req;
+- struct mmc_command *cmd;
+- struct mmc_data *data;
+-
+- unsigned int dma_nents;
+- unsigned int datasize;
+- unsigned int dma_dir;
+-
+- u16 rev_no;
+- unsigned int cmdat;
+-
+- struct clk *clk;
+-
+- int clock;
+-
+- struct work_struct datawork;
+-};
+-
+-static inline int mxcmci_use_dma(struct mxcmci_host *host)
+-{
+- return host->do_dma;
+-}
+-
+-static void mxcmci_softreset(struct mxcmci_host *host)
+-{
+- int i;
+-
+- /* reset sequence */
+- writew(STR_STP_CLK_RESET, host->base + MMC_REG_STR_STP_CLK);
+- writew(STR_STP_CLK_RESET | STR_STP_CLK_START_CLK,
+- host->base + MMC_REG_STR_STP_CLK);
+-
+- for (i = 0; i < 8; i++)
+- writew(STR_STP_CLK_START_CLK, host->base + MMC_REG_STR_STP_CLK);
+-
+- writew(0xff, host->base + MMC_REG_RES_TO);
+-}
+-
+-static void mxcmci_setup_data(struct mxcmci_host *host, struct mmc_data *data)
+-{
+- unsigned int nob = data->blocks;
+- unsigned int blksz = data->blksz;
+- unsigned int datasize = nob * blksz;
+-#ifdef HAS_DMA
+- struct scatterlist *sg;
+- int i;
+-#endif
+- if (data->flags & MMC_DATA_STREAM)
+- nob = 0xffff;
+-
+- host->data = data;
+- data->bytes_xfered = 0;
+-
+- writew(nob, host->base + MMC_REG_NOB);
+- writew(blksz, host->base + MMC_REG_BLK_LEN);
+- host->datasize = datasize;
+-
+-#ifdef HAS_DMA
+- for_each_sg(data->sg, sg, data->sg_len, i) {
+- if (sg->offset & 3 || sg->length & 3) {
+- host->do_dma = 0;
+- return;
+- }
+- }
+-
+- if (data->flags & MMC_DATA_READ) {
+- host->dma_dir = DMA_FROM_DEVICE;
+- host->dma_nents = dma_map_sg(mmc_dev(host->mmc), data->sg,
+- data->sg_len, host->dma_dir);
+-
+- imx_dma_setup_sg(host->dma, data->sg, host->dma_nents, datasize,
+- host->res->start + MMC_REG_BUFFER_ACCESS,
+- DMA_MODE_READ);
+- } else {
+- host->dma_dir = DMA_TO_DEVICE;
+- host->dma_nents = dma_map_sg(mmc_dev(host->mmc), data->sg,
+- data->sg_len, host->dma_dir);
+-
+- imx_dma_setup_sg(host->dma, data->sg, host->dma_nents, datasize,
+- host->res->start + MMC_REG_BUFFER_ACCESS,
+- DMA_MODE_WRITE);
+- }
+-
+- wmb();
+-
+- imx_dma_enable(host->dma);
+-#endif /* HAS_DMA */
+-}
+-
+-static int mxcmci_start_cmd(struct mxcmci_host *host, struct mmc_command *cmd,
+- unsigned int cmdat)
+-{
+- WARN_ON(host->cmd != NULL);
+- host->cmd = cmd;
+-
+- switch (mmc_resp_type(cmd)) {
+- case MMC_RSP_R1: /* short CRC, OPCODE */
+- case MMC_RSP_R1B:/* short CRC, OPCODE, BUSY */
+- cmdat |= CMD_DAT_CONT_RESPONSE_48BIT_CRC;
+- break;
+- case MMC_RSP_R2: /* long 136 bit + CRC */
+- cmdat |= CMD_DAT_CONT_RESPONSE_136BIT;
+- break;
+- case MMC_RSP_R3: /* short */
+- cmdat |= CMD_DAT_CONT_RESPONSE_48BIT;
+- break;
+- case MMC_RSP_NONE:
+- break;
+- default:
+- dev_err(mmc_dev(host->mmc), "unhandled response type 0x%x\n",
+- mmc_resp_type(cmd));
+- cmd->error = -EINVAL;
+- return -EINVAL;
+- }
+-
+- if (mxcmci_use_dma(host))
+- writel(INT_READ_OP_EN | INT_WRITE_OP_DONE_EN |
+- INT_END_CMD_RES_EN,
+- host->base + MMC_REG_INT_CNTR);
+- else
+- writel(INT_END_CMD_RES_EN, host->base + MMC_REG_INT_CNTR);
+-
+- writew(cmd->opcode, host->base + MMC_REG_CMD);
+- writel(cmd->arg, host->base + MMC_REG_ARG);
+- writew(cmdat, host->base + MMC_REG_CMD_DAT_CONT);
+-
+- return 0;
+-}
+-
+-static void mxcmci_finish_request(struct mxcmci_host *host,
+- struct mmc_request *req)
+-{
+- writel(0, host->base + MMC_REG_INT_CNTR);
+-
+- host->req = NULL;
+- host->cmd = NULL;
+- host->data = NULL;
+-
+- mmc_request_done(host->mmc, req);
+-}
+-
+-static int mxcmci_finish_data(struct mxcmci_host *host, unsigned int stat)
+-{
+- struct mmc_data *data = host->data;
+- int data_error;
+-
+-#ifdef HAS_DMA
+- if (mxcmci_use_dma(host)) {
+- imx_dma_disable(host->dma);
+- dma_unmap_sg(mmc_dev(host->mmc), data->sg, host->dma_nents,
+- host->dma_dir);
+- }
+-#endif
+-
+- if (stat & STATUS_ERR_MASK) {
+- dev_dbg(mmc_dev(host->mmc), "request failed. status: 0x%08x\n",
+- stat);
+- if (stat & STATUS_CRC_READ_ERR) {
+- data->error = -EILSEQ;
+- } else if (stat & STATUS_CRC_WRITE_ERR) {
+- u32 err_code = (stat >> 9) & 0x3;
+- if (err_code == 2) /* No CRC response */
+- data->error = -ETIMEDOUT;
+- else
+- data->error = -EILSEQ;
+- } else if (stat & STATUS_TIME_OUT_READ) {
+- data->error = -ETIMEDOUT;
+- } else {
+- data->error = -EIO;
+- }
+- } else {
+- data->bytes_xfered = host->datasize;
+- }
+-
+- data_error = data->error;
+-
+- host->data = NULL;
+-
+- return data_error;
+-}
+-
+-static void mxcmci_read_response(struct mxcmci_host *host, unsigned int stat)
+-{
+- struct mmc_command *cmd = host->cmd;
+- int i;
+- u32 a, b, c;
+-
+- if (!cmd)
+- return;
+-
+- if (stat & STATUS_TIME_OUT_RESP) {
+- dev_dbg(mmc_dev(host->mmc), "CMD TIMEOUT\n");
+- cmd->error = -ETIMEDOUT;
+- } else if (stat & STATUS_RESP_CRC_ERR && cmd->flags & MMC_RSP_CRC) {
+- dev_dbg(mmc_dev(host->mmc), "cmd crc error\n");
+- cmd->error = -EILSEQ;
+- }
+-
+- if (cmd->flags & MMC_RSP_PRESENT) {
+- if (cmd->flags & MMC_RSP_136) {
+- for (i = 0; i < 4; i++) {
+- a = readw(host->base + MMC_REG_RES_FIFO);
+- b = readw(host->base + MMC_REG_RES_FIFO);
+- cmd->resp[i] = a << 16 | b;
+- }
+- } else {
+- a = readw(host->base + MMC_REG_RES_FIFO);
+- b = readw(host->base + MMC_REG_RES_FIFO);
+- c = readw(host->base + MMC_REG_RES_FIFO);
+- cmd->resp[0] = a << 24 | b << 8 | c >> 8;
+- }
+- }
+-}
+-
+-static int mxcmci_poll_status(struct mxcmci_host *host, u32 mask)
+-{
+- u32 stat;
+- unsigned long timeout = jiffies + HZ;
+-
+- do {
+- stat = readl(host->base + MMC_REG_STATUS);
+- if (stat & STATUS_ERR_MASK)
+- return stat;
+- if (time_after(jiffies, timeout))
+- return STATUS_TIME_OUT_READ;
+- if (stat & mask)
+- return 0;
+- cpu_relax();
+- } while (1);
+-}
+-
+-static int mxcmci_pull(struct mxcmci_host *host, void *_buf, int bytes)
+-{
+- unsigned int stat;
+- u32 *buf = _buf;
+-
+- while (bytes > 3) {
+- stat = mxcmci_poll_status(host,
+- STATUS_BUF_READ_RDY | STATUS_READ_OP_DONE);
+- if (stat)
+- return stat;
+- *buf++ = readl(host->base + MMC_REG_BUFFER_ACCESS);
+- bytes -= 4;
+- }
+-
+- if (bytes) {
+- u8 *b = (u8 *)buf;
+- u32 tmp;
+-
+- stat = mxcmci_poll_status(host,
+- STATUS_BUF_READ_RDY | STATUS_READ_OP_DONE);
+- if (stat)
+- return stat;
+- tmp = readl(host->base + MMC_REG_BUFFER_ACCESS);
+- memcpy(b, &tmp, bytes);
+- }
+-
+- return 0;
+-}
+-
+-static int mxcmci_push(struct mxcmci_host *host, void *_buf, int bytes)
+-{
+- unsigned int stat;
+- u32 *buf = _buf;
+-
+- while (bytes > 3) {
+- stat = mxcmci_poll_status(host, STATUS_BUF_WRITE_RDY);
+- if (stat)
+- return stat;
+- writel(*buf++, host->base + MMC_REG_BUFFER_ACCESS);
+- bytes -= 4;
+- }
+-
+- if (bytes) {
+- u8 *b = (u8 *)buf;
+- u32 tmp;
+-
+- stat = mxcmci_poll_status(host, STATUS_BUF_WRITE_RDY);
+- if (stat)
+- return stat;
+-
+- memcpy(&tmp, b, bytes);
+- writel(tmp, host->base + MMC_REG_BUFFER_ACCESS);
+- }
+-
+- stat = mxcmci_poll_status(host, STATUS_BUF_WRITE_RDY);
+- if (stat)
+- return stat;
+-
+- return 0;
+-}
+-
+-static int mxcmci_transfer_data(struct mxcmci_host *host)
+-{
+- struct mmc_data *data = host->req->data;
+- struct scatterlist *sg;
+- int stat, i;
+-
+- host->datasize = 0;
+-
+- host->data = data;
+- host->datasize = 0;
+-
+- if (data->flags & MMC_DATA_READ) {
+- for_each_sg(data->sg, sg, data->sg_len, i) {
+- stat = mxcmci_pull(host, sg_virt(sg), sg->length);
+- if (stat)
+- return stat;
+- host->datasize += sg->length;
+- }
+- } else {
+- for_each_sg(data->sg, sg, data->sg_len, i) {
+- stat = mxcmci_push(host, sg_virt(sg), sg->length);
+- if (stat)
+- return stat;
+- host->datasize += sg->length;
+- }
+- stat = mxcmci_poll_status(host, STATUS_WRITE_OP_DONE);
+- if (stat)
+- return stat;
+- }
+- return 0;
+-}
+-
+-static void mxcmci_datawork(struct work_struct *work)
+-{
+- struct mxcmci_host *host = container_of(work, struct mxcmci_host,
+- datawork);
+- int datastat = mxcmci_transfer_data(host);
+- mxcmci_finish_data(host, datastat);
+-
+- if (host->req->stop) {
+- if (mxcmci_start_cmd(host, host->req->stop, 0)) {
+- mxcmci_finish_request(host, host->req);
+- return;
+- }
+- } else {
+- mxcmci_finish_request(host, host->req);
+- }
+-}
+-
+-#ifdef HAS_DMA
+-static void mxcmci_data_done(struct mxcmci_host *host, unsigned int stat)
+-{
+- struct mmc_data *data = host->data;
+- int data_error;
+-
+- if (!data)
+- return;
+-
+- data_error = mxcmci_finish_data(host, stat);
+-
+- mxcmci_read_response(host, stat);
+- host->cmd = NULL;
+-
+- if (host->req->stop) {
+- if (mxcmci_start_cmd(host, host->req->stop, 0)) {
+- mxcmci_finish_request(host, host->req);
+- return;
+- }
+- } else {
+- mxcmci_finish_request(host, host->req);
+- }
+-}
+-#endif /* HAS_DMA */
+-
+-static void mxcmci_cmd_done(struct mxcmci_host *host, unsigned int stat)
+-{
+- mxcmci_read_response(host, stat);
+- host->cmd = NULL;
+-
+- if (!host->data && host->req) {
+- mxcmci_finish_request(host, host->req);
+- return;
+- }
+-
+- /* For the DMA case the DMA engine handles the data transfer
+- * automatically. For non DMA we have to to it ourselves.
+- * Don't do it in interrupt context though.
+- */
+- if (!mxcmci_use_dma(host) && host->data)
+- schedule_work(&host->datawork);
+-
+-}
+-
+-static irqreturn_t mxcmci_irq(int irq, void *devid)
+-{
+- struct mxcmci_host *host = devid;
+- u32 stat;
+-
+- stat = readl(host->base + MMC_REG_STATUS);
+- writel(stat, host->base + MMC_REG_STATUS);
+-
+- dev_dbg(mmc_dev(host->mmc), "%s: 0x%08x\n", __func__, stat);
+-
+- if (stat & STATUS_END_CMD_RESP)
+- mxcmci_cmd_done(host, stat);
+-#ifdef HAS_DMA
+- if (mxcmci_use_dma(host) &&
+- (stat & (STATUS_DATA_TRANS_DONE | STATUS_WRITE_OP_DONE)))
+- mxcmci_data_done(host, stat);
+-#endif
+- return IRQ_HANDLED;
+-}
+-
+-static void mxcmci_request(struct mmc_host *mmc, struct mmc_request *req)
+-{
+- struct mxcmci_host *host = mmc_priv(mmc);
+- unsigned int cmdat = host->cmdat;
+-
+- WARN_ON(host->req != NULL);
+-
+- host->req = req;
+- host->cmdat &= ~CMD_DAT_CONT_INIT;
+-#ifdef HAS_DMA
+- host->do_dma = 1;
+-#endif
+- if (req->data) {
+- mxcmci_setup_data(host, req->data);
+-
+- cmdat |= CMD_DAT_CONT_DATA_ENABLE;
+-
+- if (req->data->flags & MMC_DATA_WRITE)
+- cmdat |= CMD_DAT_CONT_WRITE;
+- }
+-
+- if (mxcmci_start_cmd(host, req->cmd, cmdat))
+- mxcmci_finish_request(host, req);
+-}
+-
+-static void mxcmci_set_clk_rate(struct mxcmci_host *host, unsigned int clk_ios)
+-{
+- unsigned int divider;
+- int prescaler = 0;
+- unsigned int clk_in = clk_get_rate(host->clk);
+-
+- while (prescaler <= 0x800) {
+- for (divider = 1; divider <= 0xF; divider++) {
+- int x;
+-
+- x = (clk_in / (divider + 1));
+-
+- if (prescaler)
+- x /= (prescaler * 2);
+-
+- if (x <= clk_ios)
+- break;
+- }
+- if (divider < 0x10)
+- break;
+-
+- if (prescaler == 0)
+- prescaler = 1;
+- else
+- prescaler <<= 1;
+- }
+-
+- writew((prescaler << 4) | divider, host->base + MMC_REG_CLK_RATE);
+-
+- dev_dbg(mmc_dev(host->mmc), "scaler: %d divider: %d in: %d out: %d\n",
+- prescaler, divider, clk_in, clk_ios);
+-}
+-
+-static void mxcmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
+-{
+- struct mxcmci_host *host = mmc_priv(mmc);
+-#ifdef HAS_DMA
+- unsigned int blen;
+- /*
+- * use burstlen of 64 in 4 bit mode (--> reg value 0)
+- * use burstlen of 16 in 1 bit mode (--> reg value 16)
+- */
+- if (ios->bus_width == MMC_BUS_WIDTH_4)
+- blen = 0;
+- else
+- blen = 16;
+-
+- imx_dma_config_burstlen(host->dma, blen);
+-#endif
+- if (ios->bus_width == MMC_BUS_WIDTH_4)
+- host->cmdat |= CMD_DAT_CONT_BUS_WIDTH_4;
+- else
+- host->cmdat &= ~CMD_DAT_CONT_BUS_WIDTH_4;
+-
+- if (host->power_mode != ios->power_mode) {
+- if (host->pdata && host->pdata->setpower)
+- host->pdata->setpower(mmc_dev(mmc), ios->vdd);
+- host->power_mode = ios->power_mode;
+- if (ios->power_mode == MMC_POWER_ON)
+- host->cmdat |= CMD_DAT_CONT_INIT;
+- }
+-
+- if (ios->clock) {
+- mxcmci_set_clk_rate(host, ios->clock);
+- writew(STR_STP_CLK_START_CLK, host->base + MMC_REG_STR_STP_CLK);
+- } else {
+- writew(STR_STP_CLK_STOP_CLK, host->base + MMC_REG_STR_STP_CLK);
+- }
+-
+- host->clock = ios->clock;
+-}
+-
+-static irqreturn_t mxcmci_detect_irq(int irq, void *data)
+-{
+- struct mmc_host *mmc = data;
+-
+- dev_dbg(mmc_dev(mmc), "%s\n", __func__);
+-
+- mmc_detect_change(mmc, msecs_to_jiffies(250));
+- return IRQ_HANDLED;
+-}
+-
+-static int mxcmci_get_ro(struct mmc_host *mmc)
+-{
+- struct mxcmci_host *host = mmc_priv(mmc);
+-
+- if (host->pdata && host->pdata->get_ro)
+- return !!host->pdata->get_ro(mmc_dev(mmc));
+- /*
+- * Board doesn't support read only detection; let the mmc core
+- * decide what to do.
+- */
+- return -ENOSYS;
+-}
+-
+-
+-static const struct mmc_host_ops mxcmci_ops = {
+- .request = mxcmci_request,
+- .set_ios = mxcmci_set_ios,
+- .get_ro = mxcmci_get_ro,
+-};
+-
+-static int mxcmci_probe(struct platform_device *pdev)
+-{
+- struct mmc_host *mmc;
+- struct mxcmci_host *host = NULL;
+- struct resource *r;
+- int ret = 0, irq;
+-
+- printk(KERN_INFO "i.MX SDHC driver\n");
+-
+- r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+- irq = platform_get_irq(pdev, 0);
+- if (!r || irq < 0)
+- return -EINVAL;
+-
+- r = request_mem_region(r->start, resource_size(r), pdev->name);
+- if (!r)
+- return -EBUSY;
+-
+- mmc = mmc_alloc_host(sizeof(struct mxcmci_host), &pdev->dev);
+- if (!mmc) {
+- ret = -ENOMEM;
+- goto out_release_mem;
+- }
+-
+- mmc->ops = &mxcmci_ops;
+- mmc->caps = MMC_CAP_4_BIT_DATA;
+-
+- /* MMC core transfer sizes tunable parameters */
+- mmc->max_hw_segs = 64;
+- mmc->max_phys_segs = 64;
+- mmc->max_blk_size = 2048;
+- mmc->max_blk_count = 65535;
+- mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count;
+- mmc->max_seg_size = mmc->max_seg_size;
+-
+- host = mmc_priv(mmc);
+- host->base = ioremap(r->start, resource_size(r));
+- if (!host->base) {
+- ret = -ENOMEM;
+- goto out_free;
+- }
+-
+- host->mmc = mmc;
+- host->pdata = pdev->dev.platform_data;
+-
+- if (host->pdata && host->pdata->ocr_avail)
+- mmc->ocr_avail = host->pdata->ocr_avail;
+- else
+- mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
+-
+- host->res = r;
+- host->irq = irq;
+-
+- host->clk = clk_get(&pdev->dev, "sdhc_clk");
+- if (IS_ERR(host->clk)) {
+- ret = PTR_ERR(host->clk);
+- goto out_iounmap;
+- }
+- clk_enable(host->clk);
+-
+- mxcmci_softreset(host);
+-
+- host->rev_no = readw(host->base + MMC_REG_REV_NO);
+- if (host->rev_no != 0x400) {
+- ret = -ENODEV;
+- dev_err(mmc_dev(host->mmc), "wrong rev.no. 0x%08x. aborting.\n",
+- host->rev_no);
+- goto out_clk_put;
+- }
+-
+- mmc->f_min = clk_get_rate(host->clk) >> 7;
+- mmc->f_max = clk_get_rate(host->clk) >> 1;
+-
+- /* recommended in data sheet */
+- writew(0x2db4, host->base + MMC_REG_READ_TO);
+-
+- writel(0, host->base + MMC_REG_INT_CNTR);
+-
+-#ifdef HAS_DMA
+- host->dma = imx_dma_request_by_prio(DRIVER_NAME, DMA_PRIO_LOW);
+- if (host->dma < 0) {
+- dev_err(mmc_dev(host->mmc), "imx_dma_request_by_prio failed\n");
+- ret = -EBUSY;
+- goto out_clk_put;
+- }
+-
+- r = platform_get_resource(pdev, IORESOURCE_DMA, 0);
+- if (!r) {
+- ret = -EINVAL;
+- goto out_free_dma;
+- }
+-
+- ret = imx_dma_config_channel(host->dma,
+- IMX_DMA_MEMSIZE_32 | IMX_DMA_TYPE_FIFO,
+- IMX_DMA_MEMSIZE_32 | IMX_DMA_TYPE_LINEAR,
+- r->start, 0);
+- if (ret) {
+- dev_err(mmc_dev(host->mmc), "failed to config DMA channel\n");
+- goto out_free_dma;
+- }
+-#endif
+- INIT_WORK(&host->datawork, mxcmci_datawork);
+-
+- ret = request_irq(host->irq, mxcmci_irq, 0, DRIVER_NAME, host);
+- if (ret)
+- goto out_free_dma;
+-
+- platform_set_drvdata(pdev, mmc);
+-
+- if (host->pdata && host->pdata->init) {
+- ret = host->pdata->init(&pdev->dev, mxcmci_detect_irq,
+- host->mmc);
+- if (ret)
+- goto out_free_irq;
+- }
+-
+- mmc_add_host(mmc);
+-
+- return 0;
+-
+-out_free_irq:
+- free_irq(host->irq, host);
+-out_free_dma:
+-#ifdef HAS_DMA
+- imx_dma_free(host->dma);
+-#endif
+-out_clk_put:
+- clk_disable(host->clk);
+- clk_put(host->clk);
+-out_iounmap:
+- iounmap(host->base);
+-out_free:
+- mmc_free_host(mmc);
+-out_release_mem:
+- release_mem_region(host->res->start, resource_size(host->res));
+- return ret;
+-}
+-
+-static int mxcmci_remove(struct platform_device *pdev)
+-{
+- struct mmc_host *mmc = platform_get_drvdata(pdev);
+- struct mxcmci_host *host = mmc_priv(mmc);
+-
+- platform_set_drvdata(pdev, NULL);
+-
+- mmc_remove_host(mmc);
+-
+- if (host->pdata && host->pdata->exit)
+- host->pdata->exit(&pdev->dev, mmc);
+-
+- free_irq(host->irq, host);
+- iounmap(host->base);
+-#ifdef HAS_DMA
+- imx_dma_free(host->dma);
+-#endif
+- clk_disable(host->clk);
+- clk_put(host->clk);
+-
+- release_mem_region(host->res->start, resource_size(host->res));
+- release_resource(host->res);
+-
+- mmc_free_host(mmc);
+-
+- return 0;
+-}
+-
+-#ifdef CONFIG_PM
+-static int mxcmci_suspend(struct platform_device *dev, pm_message_t state)
+-{
+- struct mmc_host *mmc = platform_get_drvdata(dev);
+- int ret = 0;
+-
+- if (mmc)
+- ret = mmc_suspend_host(mmc, state);
+-
+- return ret;
+-}
+-
+-static int mxcmci_resume(struct platform_device *dev)
+-{
+- struct mmc_host *mmc = platform_get_drvdata(dev);
+- struct mxcmci_host *host;
+- int ret = 0;
+-
+- if (mmc) {
+- host = mmc_priv(mmc);
+- ret = mmc_resume_host(mmc);
+- }
+-
+- return ret;
+-}
+-#else
+-#define mxcmci_suspend NULL
+-#define mxcmci_resume NULL
+-#endif /* CONFIG_PM */
+-
+-static struct platform_driver mxcmci_driver = {
+- .probe = mxcmci_probe,
+- .remove = mxcmci_remove,
+- .suspend = mxcmci_suspend,
+- .resume = mxcmci_resume,
+- .driver = {
+- .name = DRIVER_NAME,
+- .owner = THIS_MODULE,
+- }
+-};
+-
+-static int __init mxcmci_init(void)
+-{
+- return platform_driver_register(&mxcmci_driver);
+-}
+-
+-static void __exit mxcmci_exit(void)
+-{
+- platform_driver_unregister(&mxcmci_driver);
+-}
+-
+-module_init(mxcmci_init);
+-module_exit(mxcmci_exit);
+-
+-MODULE_DESCRIPTION("i.MX Multimedia Card Interface Driver");
+-MODULE_AUTHOR("Sascha Hauer, Pengutronix");
+-MODULE_LICENSE("GPL");
+-MODULE_ALIAS("platform:imx-mmc");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mmc/host/omap_hsmmc.c linux-2.6.29-rc3.owrt/drivers/mmc/host/omap_hsmmc.c
+--- linux-2.6.29.owrt/drivers/mmc/host/omap_hsmmc.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mmc/host/omap_hsmmc.c 2009-05-10 23:48:28.000000000 +0200
+@@ -55,7 +55,6 @@
+ #define VS30 (1 << 25)
+ #define SDVS18 (0x5 << 9)
+ #define SDVS30 (0x6 << 9)
+-#define SDVS33 (0x7 << 9)
+ #define SDVSCLR 0xFFFFF1FF
+ #define SDVSDET 0x00000400
+ #define AUTOIDLE 0x1
+@@ -376,32 +375,6 @@
+ }
+ #endif /* CONFIG_MMC_DEBUG */
+
+-/*
+- * MMC controller internal state machines reset
+- *
+- * Used to reset command or data internal state machines, using respectively
+- * SRC or SRD bit of SYSCTL register
+- * Can be called from interrupt context
+- */
+-static inline void mmc_omap_reset_controller_fsm(struct mmc_omap_host *host,
+- unsigned long bit)
+-{
+- unsigned long i = 0;
+- unsigned long limit = (loops_per_jiffy *
+- msecs_to_jiffies(MMC_TIMEOUT_MS));
+-
+- OMAP_HSMMC_WRITE(host->base, SYSCTL,
+- OMAP_HSMMC_READ(host->base, SYSCTL) | bit);
+-
+- while ((OMAP_HSMMC_READ(host->base, SYSCTL) & bit) &&
+- (i++ < limit))
+- cpu_relax();
+-
+- if (OMAP_HSMMC_READ(host->base, SYSCTL) & bit)
+- dev_err(mmc_dev(host->mmc),
+- "Timeout waiting on controller reset in %s\n",
+- __func__);
+-}
+
+ /*
+ * MMC controller IRQ handler
+@@ -430,17 +403,21 @@
+ (status & CMD_CRC)) {
+ if (host->cmd) {
+ if (status & CMD_TIMEOUT) {
+- mmc_omap_reset_controller_fsm(host, SRC);
++ OMAP_HSMMC_WRITE(host->base, SYSCTL,
++ OMAP_HSMMC_READ(host->base,
++ SYSCTL) | SRC);
++ while (OMAP_HSMMC_READ(host->base,
++ SYSCTL) & SRC)
++ ;
++
+ host->cmd->error = -ETIMEDOUT;
+ } else {
+ host->cmd->error = -EILSEQ;
+ }
+ end_cmd = 1;
+ }
+- if (host->data) {
++ if (host->data)
+ mmc_dma_cleanup(host);
+- mmc_omap_reset_controller_fsm(host, SRD);
+- }
+ }
+ if ((status & DATA_TIMEOUT) ||
+ (status & DATA_CRC)) {
+@@ -449,7 +426,12 @@
+ mmc_dma_cleanup(host);
+ else
+ host->data->error = -EILSEQ;
+- mmc_omap_reset_controller_fsm(host, SRD);
++ OMAP_HSMMC_WRITE(host->base, SYSCTL,
++ OMAP_HSMMC_READ(host->base,
++ SYSCTL) | SRD);
++ while (OMAP_HSMMC_READ(host->base,
++ SYSCTL) & SRD)
++ ;
+ end_trans = 1;
+ }
+ }
+@@ -474,20 +456,13 @@
+ }
+
+ /*
+- * Switch MMC interface voltage ... only relevant for MMC1.
+- *
+- * MMC2 and MMC3 use fixed 1.8V levels, and maybe a transceiver.
+- * The MMC2 transceiver controls are used instead of DAT4..DAT7.
+- * Some chips, like eMMC ones, use internal transceivers.
++ * Switch MMC operating voltage
+ */
+ static int omap_mmc_switch_opcond(struct mmc_omap_host *host, int vdd)
+ {
+ u32 reg_val = 0;
+ int ret;
+
+- if (host->id != OMAP_MMC1_DEVID)
+- return 0;
+-
+ /* Disable the clocks */
+ clk_disable(host->fclk);
+ clk_disable(host->iclk);
+@@ -510,26 +485,19 @@
+ OMAP_HSMMC_WRITE(host->base, HCTL,
+ OMAP_HSMMC_READ(host->base, HCTL) & SDVSCLR);
+ reg_val = OMAP_HSMMC_READ(host->base, HCTL);
+-
+ /*
+ * If a MMC dual voltage card is detected, the set_ios fn calls
+ * this fn with VDD bit set for 1.8V. Upon card removal from the
+ * slot, omap_mmc_set_ios sets the VDD back to 3V on MMC_POWER_OFF.
+ *
+- * Cope with a bit of slop in the range ... per data sheets:
+- * - "1.8V" for vdds_mmc1/vdds_mmc1a can be up to 2.45V max,
+- * but recommended values are 1.71V to 1.89V
+- * - "3.0V" for vdds_mmc1/vdds_mmc1a can be up to 3.5V max,
+- * but recommended values are 2.7V to 3.3V
+- *
+- * Board setup code shouldn't permit anything very out-of-range.
+- * TWL4030-family VMMC1 and VSIM regulators are fine (avoiding the
+- * middle range) but VSIM can't power DAT4..DAT7 at more than 3V.
++ * Only MMC1 supports 3.0V. MMC2 will not function if SDVS30 is
++ * set in HCTL.
+ */
+- if ((1 << vdd) <= MMC_VDD_23_24)
+- reg_val |= SDVS18;
+- else
++ if (host->id == OMAP_MMC1_DEVID && (((1 << vdd) == MMC_VDD_32_33) ||
++ ((1 << vdd) == MMC_VDD_33_34)))
+ reg_val |= SDVS30;
++ if ((1 << vdd) == MMC_VDD_165_195)
++ reg_val |= SDVS18;
+
+ OMAP_HSMMC_WRITE(host->base, HCTL, reg_val);
+
+@@ -549,15 +517,16 @@
+ {
+ struct mmc_omap_host *host = container_of(work, struct mmc_omap_host,
+ mmc_carddetect_work);
+- struct omap_mmc_slot_data *slot = &mmc_slot(host);
+-
+- host->carddetect = slot->card_detect(slot->card_detect_irq);
+
+ sysfs_notify(&host->mmc->class_dev.kobj, NULL, "cover_switch");
+ if (host->carddetect) {
+ mmc_detect_change(host->mmc, (HZ * 200) / 1000);
+ } else {
+- mmc_omap_reset_controller_fsm(host, SRD);
++ OMAP_HSMMC_WRITE(host->base, SYSCTL,
++ OMAP_HSMMC_READ(host->base, SYSCTL) | SRD);
++ while (OMAP_HSMMC_READ(host->base, SYSCTL) & SRD)
++ ;
++
+ mmc_detect_change(host->mmc, (HZ * 50) / 1000);
+ }
+ }
+@@ -569,6 +538,7 @@
+ {
+ struct mmc_omap_host *host = (struct mmc_omap_host *)dev_id;
+
++ host->carddetect = mmc_slot(host).card_detect(irq);
+ schedule_work(&host->mmc_carddetect_work);
+
+ return IRQ_HANDLED;
+@@ -787,14 +757,10 @@
+ case MMC_POWER_OFF:
+ mmc_slot(host).set_power(host->dev, host->slot_id, 0, 0);
+ /*
+- * Reset interface voltage to 3V if it's 1.8V now;
+- * only relevant on MMC-1, the others always use 1.8V.
+- *
++ * Reset bus voltage to 3V if it got set to 1.8V earlier.
+ * REVISIT: If we are able to detect cards after unplugging
+ * a 1.8V card, this code should not be needed.
+ */
+- if (host->id != OMAP_MMC1_DEVID)
+- break;
+ if (!(OMAP_HSMMC_READ(host->base, HCTL) & SDVSDET)) {
+ int vdd = fls(host->mmc->ocr_avail) - 1;
+ if (omap_mmc_switch_opcond(host, vdd) != 0)
+@@ -818,9 +784,7 @@
+ }
+
+ if (host->id == OMAP_MMC1_DEVID) {
+- /* Only MMC1 can interface at 3V without some flavor
+- * of external transceiver; but they all handle 1.8V.
+- */
++ /* Only MMC1 can operate at 3V/1.8V */
+ if ((OMAP_HSMMC_READ(host->base, HCTL) & SDVSDET) &&
+ (ios->vdd == DUAL_VOLT_OCR_BIT)) {
+ /*
+@@ -1173,9 +1137,7 @@
+ " level suspend\n");
+ }
+
+- if (host->id == OMAP_MMC1_DEVID
+- && !(OMAP_HSMMC_READ(host->base, HCTL)
+- & SDVSDET)) {
++ if (!(OMAP_HSMMC_READ(host->base, HCTL) & SDVSDET)) {
+ OMAP_HSMMC_WRITE(host->base, HCTL,
+ OMAP_HSMMC_READ(host->base, HCTL)
+ & SDVSCLR);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mmc/host/pxamci.c linux-2.6.29-rc3.owrt/drivers/mmc/host/pxamci.c
+--- linux-2.6.29.owrt/drivers/mmc/host/pxamci.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mmc/host/pxamci.c 2009-05-10 23:48:28.000000000 +0200
+@@ -180,15 +180,7 @@
+ else
+ DALGN &= ~(1 << host->dma);
+ DDADR(host->dma) = host->sg_dma;
+-
+- /*
+- * workaround for erratum #91:
+- * only start DMA now if we are doing a read,
+- * otherwise we wait until CMD/RESP has finished
+- * before starting DMA.
+- */
+- if (!cpu_is_pxa27x() || data->flags & MMC_DATA_READ)
+- DCSR(host->dma) = DCSR_RUN;
++ DCSR(host->dma) = DCSR_RUN;
+ }
+
+ static void pxamci_start_cmd(struct pxamci_host *host, struct mmc_command *cmd, unsigned int cmdat)
+@@ -259,28 +251,23 @@
+ if (stat & STAT_TIME_OUT_RESPONSE) {
+ cmd->error = -ETIMEDOUT;
+ } else if (stat & STAT_RES_CRC_ERR && cmd->flags & MMC_RSP_CRC) {
++#ifdef CONFIG_PXA27x
+ /*
+ * workaround for erratum #42:
+ * Intel PXA27x Family Processor Specification Update Rev 001
+ * A bogus CRC error can appear if the msb of a 136 bit
+ * response is a one.
+ */
+- if (cpu_is_pxa27x() &&
+- (cmd->flags & MMC_RSP_136 && cmd->resp[0] & 0x80000000))
++ if (cmd->flags & MMC_RSP_136 && cmd->resp[0] & 0x80000000) {
+ pr_debug("ignoring CRC from command %d - *risky*\n", cmd->opcode);
+- else
+- cmd->error = -EILSEQ;
++ } else
++#endif
++ cmd->error = -EILSEQ;
+ }
+
+ pxamci_disable_irq(host, END_CMD_RES);
+ if (host->data && !cmd->error) {
+ pxamci_enable_irq(host, DATA_TRAN_DONE);
+- /*
+- * workaround for erratum #91, if doing write
+- * enable DMA late
+- */
+- if (cpu_is_pxa27x() && host->data->flags & MMC_DATA_WRITE)
+- DCSR(host->dma) = DCSR_RUN;
+ } else {
+ pxamci_finish_request(host, host->mrq);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mmc/host/ricoh_mmc.c linux-2.6.29-rc3.owrt/drivers/mmc/host/ricoh_mmc.c
+--- linux-2.6.29.owrt/drivers/mmc/host/ricoh_mmc.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mmc/host/ricoh_mmc.c 2009-05-10 23:48:28.000000000 +0200
+@@ -196,7 +196,7 @@
+ pci_set_drvdata(pdev, NULL);
+ }
+
+-static int ricoh_mmc_suspend_late(struct pci_dev *pdev, pm_message_t state)
++static int ricoh_mmc_suspend(struct pci_dev *pdev, pm_message_t state)
+ {
+ struct pci_dev *fw_dev = NULL;
+
+@@ -210,7 +210,7 @@
+ return 0;
+ }
+
+-static int ricoh_mmc_resume_early(struct pci_dev *pdev)
++static int ricoh_mmc_resume(struct pci_dev *pdev)
+ {
+ struct pci_dev *fw_dev = NULL;
+
+@@ -229,8 +229,8 @@
+ .id_table = pci_ids,
+ .probe = ricoh_mmc_probe,
+ .remove = __devexit_p(ricoh_mmc_remove),
+- .suspend_late = ricoh_mmc_suspend_late,
+- .resume_early = ricoh_mmc_resume_early,
++ .suspend = ricoh_mmc_suspend,
++ .resume = ricoh_mmc_resume,
+ };
+
+ /*****************************************************************************\
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mmc/host/s3cmci.c linux-2.6.29-rc3.owrt/drivers/mmc/host/s3cmci.c
+--- linux-2.6.29.owrt/drivers/mmc/host/s3cmci.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mmc/host/s3cmci.c 2009-05-10 23:48:28.000000000 +0200
+@@ -329,7 +329,7 @@
+
+ to_ptr = host->base + host->sdidata;
+
+- while ((fifo = fifo_free(host)) > 3) {
++ while ((fifo = fifo_free(host))) {
+ if (!host->pio_bytes) {
+ res = get_data_buffer(host, &host->pio_bytes,
+ &host->pio_ptr);
+@@ -793,7 +793,8 @@
+ host->mem->start + host->sdidata);
+
+ if (!setup_ok) {
+- s3c2410_dma_config(host->dma, 4, 0);
++ s3c2410_dma_config(host->dma, 4,
++ (S3C2410_DCON_HWTRIG | S3C2410_DCON_CH0_SDI));
+ s3c2410_dma_set_buffdone_fn(host->dma,
+ s3cmci_dma_done_callback);
+ s3c2410_dma_setflags(host->dma, S3C2410_DMAF_AUTOSTART);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mmc/host/sdhci.c linux-2.6.29-rc3.owrt/drivers/mmc/host/sdhci.c
+--- linux-2.6.29.owrt/drivers/mmc/host/sdhci.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mmc/host/sdhci.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1291,11 +1291,8 @@
+ if (host->cmd->data)
+ DBG("Cannot wait for busy signal when also "
+ "doing a data transfer");
+- else if (!(host->quirks & SDHCI_QUIRK_NO_BUSY_IRQ))
++ else
+ return;
+-
+- /* The controller does not support the end-of-busy IRQ,
+- * fall through and take the SDHCI_INT_RESPONSE */
+ }
+
+ if (intmask & SDHCI_INT_RESPONSE)
+@@ -1639,7 +1636,8 @@
+ mmc->f_max = host->max_clk;
+ mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SDIO_IRQ;
+
+- if (caps & SDHCI_CAN_DO_HISPD)
++ if ((caps & SDHCI_CAN_DO_HISPD) ||
++ (host->quirks & SDHCI_QUIRK_FORCE_HIGHSPEED))
+ mmc->caps |= MMC_CAP_SD_HIGHSPEED;
+
+ mmc->ocr_avail = 0;
+@@ -1725,9 +1723,7 @@
+ #endif
+
+ #ifdef SDHCI_USE_LEDS_CLASS
+- snprintf(host->led_name, sizeof(host->led_name),
+- "%s::", mmc_hostname(mmc));
+- host->led.name = host->led_name;
++ host->led.name = mmc_hostname(mmc);
+ host->led.brightness = LED_OFF;
+ host->led.default_trigger = mmc_hostname(mmc);
+ host->led.brightness_set = sdhci_led_control;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mmc/host/sdhci.h linux-2.6.29-rc3.owrt/drivers/mmc/host/sdhci.h
+--- linux-2.6.29.owrt/drivers/mmc/host/sdhci.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mmc/host/sdhci.h 2009-05-10 23:48:28.000000000 +0200
+@@ -208,8 +208,8 @@
+ #define SDHCI_QUIRK_BROKEN_TIMEOUT_VAL (1<<12)
+ /* Controller has an issue with buffer bits for small transfers */
+ #define SDHCI_QUIRK_BROKEN_SMALL_PIO (1<<13)
+-/* Controller does not provide transfer-complete interrupt when not busy */
+-#define SDHCI_QUIRK_NO_BUSY_IRQ (1<<14)
++/* Controller supports high speed but doesn't have the caps bit set */
++#define SDHCI_QUIRK_FORCE_HIGHSPEED (1<<14)
+
+ int irq; /* Device IRQ */
+ void __iomem * ioaddr; /* Mapped address */
+@@ -222,7 +222,6 @@
+
+ #if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE)
+ struct led_classdev led; /* LED control */
+- char led_name[32];
+ #endif
+
+ spinlock_t lock; /* Mutex */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mmc/host/sdhci-pci.c linux-2.6.29-rc3.owrt/drivers/mmc/host/sdhci-pci.c
+--- linux-2.6.29.owrt/drivers/mmc/host/sdhci-pci.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mmc/host/sdhci-pci.c 2009-05-10 23:48:28.000000000 +0200
+@@ -107,7 +107,6 @@
+
+ static const struct sdhci_pci_fixes sdhci_cafe = {
+ .quirks = SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER |
+- SDHCI_QUIRK_NO_BUSY_IRQ |
+ SDHCI_QUIRK_BROKEN_TIMEOUT_VAL,
+ };
+
+@@ -145,7 +144,8 @@
+ SDHCI_QUIRK_32BIT_DMA_SIZE |
+ SDHCI_QUIRK_32BIT_ADMA_SIZE |
+ SDHCI_QUIRK_RESET_AFTER_REQUEST |
+- SDHCI_QUIRK_BROKEN_SMALL_PIO;
++ SDHCI_QUIRK_BROKEN_SMALL_PIO |
++ SDHCI_QUIRK_FORCE_HIGHSPEED;
+ }
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mtd/chips/map_rom.c linux-2.6.29-rc3.owrt/drivers/mtd/chips/map_rom.c
+--- linux-2.6.29.owrt/drivers/mtd/chips/map_rom.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mtd/chips/map_rom.c 2009-05-10 23:48:28.000000000 +0200
+@@ -19,7 +19,6 @@
+ static int maprom_write (struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
+ static void maprom_nop (struct mtd_info *);
+ static struct mtd_info *map_rom_probe(struct map_info *map);
+-static int maprom_erase (struct mtd_info *mtd, struct erase_info *info);
+
+ static struct mtd_chip_driver maprom_chipdrv = {
+ .probe = map_rom_probe,
+@@ -43,7 +42,6 @@
+ mtd->read = maprom_read;
+ mtd->write = maprom_write;
+ mtd->sync = maprom_nop;
+- mtd->erase = maprom_erase;
+ mtd->flags = MTD_CAP_ROM;
+ mtd->erasesize = map->size;
+ mtd->writesize = 1;
+@@ -73,12 +71,6 @@
+ return -EIO;
+ }
+
+-static int maprom_erase (struct mtd_info *mtd, struct erase_info *info)
+-{
+- /* We do our best 8) */
+- return -EROFS;
+-}
+-
+ static int __init map_rom_init(void)
+ {
+ register_mtd_chip_driver(&maprom_chipdrv);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mtd/devices/Kconfig linux-2.6.29-rc3.owrt/drivers/mtd/devices/Kconfig
+--- linux-2.6.29.owrt/drivers/mtd/devices/Kconfig 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mtd/devices/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -120,6 +120,13 @@
+ doesn't have access to, memory beyond the mem=xxx limit, nvram,
+ memory on the video card, etc...
+
++config MTD_PS3VRAM
++ tristate "PS3 video RAM"
++ depends on FB_PS3
++ help
++ This driver allows you to use excess PS3 video RAM as volatile
++ storage or system swap.
++
+ config MTD_LART
+ tristate "28F160xx flash driver for LART"
+ depends on SA1100_LART
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mtd/devices/Makefile linux-2.6.29-rc3.owrt/drivers/mtd/devices/Makefile
+--- linux-2.6.29.owrt/drivers/mtd/devices/Makefile 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mtd/devices/Makefile 2009-05-10 23:48:28.000000000 +0200
+@@ -16,3 +16,4 @@
+ obj-$(CONFIG_MTD_BLOCK2MTD) += block2mtd.o
+ obj-$(CONFIG_MTD_DATAFLASH) += mtd_dataflash.o
+ obj-$(CONFIG_MTD_M25P80) += m25p80.o
++obj-$(CONFIG_MTD_PS3VRAM) += ps3vram.o
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mtd/devices/mtd_dataflash.c linux-2.6.29-rc3.owrt/drivers/mtd/devices/mtd_dataflash.c
+--- linux-2.6.29.owrt/drivers/mtd/devices/mtd_dataflash.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mtd/devices/mtd_dataflash.c 2009-05-10 23:48:28.000000000 +0200
+@@ -821,8 +821,7 @@
+ if (!(info->flags & IS_POW2PS))
+ return info;
+ }
+- } else
+- return info;
++ }
+ }
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mtd/devices/ps3vram.c linux-2.6.29-rc3.owrt/drivers/mtd/devices/ps3vram.c
+--- linux-2.6.29.owrt/drivers/mtd/devices/ps3vram.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/mtd/devices/ps3vram.c 2009-05-10 23:48:28.000000000 +0200
+@@ -0,0 +1,768 @@
++/**
++ * ps3vram - Use extra PS3 video ram as MTD block device.
++ *
++ * Copyright (c) 2007-2008 Jim Paris <jim@jtan.com>
++ * Added support RSX DMA Vivien Chappelier <vivien.chappelier@free.fr>
++ */
++
++#include <linux/io.h>
++#include <linux/mm.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/list.h>
++#include <linux/module.h>
++#include <linux/moduleparam.h>
++#include <linux/slab.h>
++#include <linux/version.h>
++#include <linux/gfp.h>
++#include <linux/delay.h>
++#include <linux/mtd/mtd.h>
++
++#include <asm/lv1call.h>
++#include <asm/ps3.h>
++
++#define DEVICE_NAME "ps3vram"
++
++#define XDR_BUF_SIZE (2 * 1024 * 1024) /* XDR buffer (must be 1MiB aligned) */
++#define XDR_IOIF 0x0c000000
++
++#define FIFO_BASE XDR_IOIF
++#define FIFO_SIZE (64 * 1024)
++
++#define DMA_PAGE_SIZE (4 * 1024)
++
++#define CACHE_PAGE_SIZE (256 * 1024)
++#define CACHE_PAGE_COUNT ((XDR_BUF_SIZE - FIFO_SIZE) / CACHE_PAGE_SIZE)
++
++#define CACHE_OFFSET CACHE_PAGE_SIZE
++#define FIFO_OFFSET 0
++
++#define CTRL_PUT 0x10
++#define CTRL_GET 0x11
++#define CTRL_TOP 0x15
++
++#define UPLOAD_SUBCH 1
++#define DOWNLOAD_SUBCH 2
++
++#define NV_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN 0x0000030c
++#define NV_MEMORY_TO_MEMORY_FORMAT_NOTIFY 0x00000104
++
++#define L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT 0x601
++
++struct mtd_info ps3vram_mtd;
++
++#define CACHE_PAGE_PRESENT 1
++#define CACHE_PAGE_DIRTY 2
++
++struct ps3vram_tag {
++ unsigned int address;
++ unsigned int flags;
++};
++
++struct ps3vram_cache {
++ unsigned int page_count;
++ unsigned int page_size;
++ struct ps3vram_tag *tags;
++};
++
++struct ps3vram_priv {
++ u64 memory_handle;
++ u64 context_handle;
++ u32 *ctrl;
++ u32 *reports;
++ u8 __iomem *ddr_base;
++ u8 *xdr_buf;
++
++ u32 *fifo_base;
++ u32 *fifo_ptr;
++
++ struct device *dev;
++ struct ps3vram_cache cache;
++
++ /* Used to serialize cache/DMA operations */
++ struct mutex lock;
++};
++
++#define DMA_NOTIFIER_HANDLE_BASE 0x66604200 /* first DMA notifier handle */
++#define DMA_NOTIFIER_OFFSET_BASE 0x1000 /* first DMA notifier offset */
++#define DMA_NOTIFIER_SIZE 0x40
++#define NOTIFIER 7 /* notifier used for completion report */
++
++/* A trailing '-' means to subtract off ps3fb_videomemory.size */
++char *size = "256M-";
++module_param(size, charp, 0);
++MODULE_PARM_DESC(size, "memory size");
++
++static u32 *ps3vram_get_notifier(u32 *reports, int notifier)
++{
++ return (void *) reports +
++ DMA_NOTIFIER_OFFSET_BASE +
++ DMA_NOTIFIER_SIZE * notifier;
++}
++
++static void ps3vram_notifier_reset(struct mtd_info *mtd)
++{
++ int i;
++
++ struct ps3vram_priv *priv = mtd->priv;
++ u32 *notify = ps3vram_get_notifier(priv->reports, NOTIFIER);
++ for (i = 0; i < 4; i++)
++ notify[i] = 0xffffffff;
++}
++
++static int ps3vram_notifier_wait(struct mtd_info *mtd, unsigned int timeout_ms)
++{
++ struct ps3vram_priv *priv = mtd->priv;
++ u32 *notify = ps3vram_get_notifier(priv->reports, NOTIFIER);
++ unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);
++
++ do {
++ if (!notify[3])
++ return 0;
++ msleep(1);
++ } while (time_before(jiffies, timeout));
++
++ return -ETIMEDOUT;
++}
++
++static void ps3vram_init_ring(struct mtd_info *mtd)
++{
++ struct ps3vram_priv *priv = mtd->priv;
++
++ priv->ctrl[CTRL_PUT] = FIFO_BASE + FIFO_OFFSET;
++ priv->ctrl[CTRL_GET] = FIFO_BASE + FIFO_OFFSET;
++}
++
++static int ps3vram_wait_ring(struct mtd_info *mtd, unsigned int timeout_ms)
++{
++ struct ps3vram_priv *priv = mtd->priv;
++ unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);
++
++ do {
++ if (priv->ctrl[CTRL_PUT] == priv->ctrl[CTRL_GET])
++ return 0;
++ msleep(1);
++ } while (time_before(jiffies, timeout));
++
++ dev_dbg(priv->dev, "%s:%d: FIFO timeout (%08x/%08x/%08x)\n", __func__,
++ __LINE__, priv->ctrl[CTRL_PUT], priv->ctrl[CTRL_GET],
++ priv->ctrl[CTRL_TOP]);
++
++ return -ETIMEDOUT;
++}
++
++static void ps3vram_out_ring(struct ps3vram_priv *priv, u32 data)
++{
++ *(priv->fifo_ptr)++ = data;
++}
++
++static void ps3vram_begin_ring(struct ps3vram_priv *priv, u32 chan,
++ u32 tag, u32 size)
++{
++ ps3vram_out_ring(priv, (size << 18) | (chan << 13) | tag);
++}
++
++static void ps3vram_rewind_ring(struct mtd_info *mtd)
++{
++ struct ps3vram_priv *priv = mtd->priv;
++ u64 status;
++
++ ps3vram_out_ring(priv, 0x20000000 | (FIFO_BASE + FIFO_OFFSET));
++
++ priv->ctrl[CTRL_PUT] = FIFO_BASE + FIFO_OFFSET;
++
++ /* asking the HV for a blit will kick the fifo */
++ status = lv1_gpu_context_attribute(priv->context_handle,
++ L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT,
++ 0, 0, 0, 0);
++ if (status)
++ dev_err(priv->dev, "%s:%d: lv1_gpu_context_attribute failed\n",
++ __func__, __LINE__);
++
++ priv->fifo_ptr = priv->fifo_base;
++}
++
++static void ps3vram_fire_ring(struct mtd_info *mtd)
++{
++ struct ps3vram_priv *priv = mtd->priv;
++ u64 status;
++
++ mutex_lock(&ps3_gpu_mutex);
++
++ priv->ctrl[CTRL_PUT] = FIFO_BASE + FIFO_OFFSET +
++ (priv->fifo_ptr - priv->fifo_base) * sizeof(u32);
++
++ /* asking the HV for a blit will kick the fifo */
++ status = lv1_gpu_context_attribute(priv->context_handle,
++ L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT,
++ 0, 0, 0, 0);
++ if (status)
++ dev_err(priv->dev, "%s:%d: lv1_gpu_context_attribute failed\n",
++ __func__, __LINE__);
++
++ if ((priv->fifo_ptr - priv->fifo_base) * sizeof(u32) >
++ FIFO_SIZE - 1024) {
++ dev_dbg(priv->dev, "%s:%d: fifo full, rewinding\n", __func__,
++ __LINE__);
++ ps3vram_wait_ring(mtd, 200);
++ ps3vram_rewind_ring(mtd);
++ }
++
++ mutex_unlock(&ps3_gpu_mutex);
++}
++
++static void ps3vram_bind(struct mtd_info *mtd)
++{
++ struct ps3vram_priv *priv = mtd->priv;
++
++ ps3vram_begin_ring(priv, UPLOAD_SUBCH, 0, 1);
++ ps3vram_out_ring(priv, 0x31337303);
++ ps3vram_begin_ring(priv, UPLOAD_SUBCH, 0x180, 3);
++ ps3vram_out_ring(priv, DMA_NOTIFIER_HANDLE_BASE + NOTIFIER);
++ ps3vram_out_ring(priv, 0xfeed0001); /* DMA system RAM instance */
++ ps3vram_out_ring(priv, 0xfeed0000); /* DMA video RAM instance */
++
++ ps3vram_begin_ring(priv, DOWNLOAD_SUBCH, 0, 1);
++ ps3vram_out_ring(priv, 0x3137c0de);
++ ps3vram_begin_ring(priv, DOWNLOAD_SUBCH, 0x180, 3);
++ ps3vram_out_ring(priv, DMA_NOTIFIER_HANDLE_BASE + NOTIFIER);
++ ps3vram_out_ring(priv, 0xfeed0000); /* DMA video RAM instance */
++ ps3vram_out_ring(priv, 0xfeed0001); /* DMA system RAM instance */
++
++ ps3vram_fire_ring(mtd);
++}
++
++static int ps3vram_upload(struct mtd_info *mtd, unsigned int src_offset,
++ unsigned int dst_offset, int len, int count)
++{
++ struct ps3vram_priv *priv = mtd->priv;
++
++ ps3vram_begin_ring(priv, UPLOAD_SUBCH,
++ NV_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN, 8);
++ ps3vram_out_ring(priv, XDR_IOIF + src_offset);
++ ps3vram_out_ring(priv, dst_offset);
++ ps3vram_out_ring(priv, len);
++ ps3vram_out_ring(priv, len);
++ ps3vram_out_ring(priv, len);
++ ps3vram_out_ring(priv, count);
++ ps3vram_out_ring(priv, (1 << 8) | 1);
++ ps3vram_out_ring(priv, 0);
++
++ ps3vram_notifier_reset(mtd);
++ ps3vram_begin_ring(priv, UPLOAD_SUBCH,
++ NV_MEMORY_TO_MEMORY_FORMAT_NOTIFY, 1);
++ ps3vram_out_ring(priv, 0);
++ ps3vram_begin_ring(priv, UPLOAD_SUBCH, 0x100, 1);
++ ps3vram_out_ring(priv, 0);
++ ps3vram_fire_ring(mtd);
++ if (ps3vram_notifier_wait(mtd, 200) < 0) {
++ dev_dbg(priv->dev, "%s:%d: notifier timeout\n", __func__,
++ __LINE__);
++ return -1;
++ }
++
++ return 0;
++}
++
++static int ps3vram_download(struct mtd_info *mtd, unsigned int src_offset,
++ unsigned int dst_offset, int len, int count)
++{
++ struct ps3vram_priv *priv = mtd->priv;
++
++ ps3vram_begin_ring(priv, DOWNLOAD_SUBCH,
++ NV_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN, 8);
++ ps3vram_out_ring(priv, src_offset);
++ ps3vram_out_ring(priv, XDR_IOIF + dst_offset);
++ ps3vram_out_ring(priv, len);
++ ps3vram_out_ring(priv, len);
++ ps3vram_out_ring(priv, len);
++ ps3vram_out_ring(priv, count);
++ ps3vram_out_ring(priv, (1 << 8) | 1);
++ ps3vram_out_ring(priv, 0);
++
++ ps3vram_notifier_reset(mtd);
++ ps3vram_begin_ring(priv, DOWNLOAD_SUBCH,
++ NV_MEMORY_TO_MEMORY_FORMAT_NOTIFY, 1);
++ ps3vram_out_ring(priv, 0);
++ ps3vram_begin_ring(priv, DOWNLOAD_SUBCH, 0x100, 1);
++ ps3vram_out_ring(priv, 0);
++ ps3vram_fire_ring(mtd);
++ if (ps3vram_notifier_wait(mtd, 200) < 0) {
++ dev_dbg(priv->dev, "%s:%d: notifier timeout\n", __func__,
++ __LINE__);
++ return -1;
++ }
++
++ return 0;
++}
++
++static void ps3vram_cache_evict(struct mtd_info *mtd, int entry)
++{
++ struct ps3vram_priv *priv = mtd->priv;
++ struct ps3vram_cache *cache = &priv->cache;
++
++ if (cache->tags[entry].flags & CACHE_PAGE_DIRTY) {
++ dev_dbg(priv->dev, "%s:%d: flushing %d : 0x%08x\n", __func__,
++ __LINE__, entry, cache->tags[entry].address);
++ if (ps3vram_upload(mtd,
++ CACHE_OFFSET + entry * cache->page_size,
++ cache->tags[entry].address,
++ DMA_PAGE_SIZE,
++ cache->page_size / DMA_PAGE_SIZE) < 0) {
++ dev_dbg(priv->dev, "%s:%d: failed to upload from "
++ "0x%x to 0x%x size 0x%x\n", __func__, __LINE__,
++ entry * cache->page_size,
++ cache->tags[entry].address, cache->page_size);
++ }
++ cache->tags[entry].flags &= ~CACHE_PAGE_DIRTY;
++ }
++}
++
++static void ps3vram_cache_load(struct mtd_info *mtd, int entry,
++ unsigned int address)
++{
++ struct ps3vram_priv *priv = mtd->priv;
++ struct ps3vram_cache *cache = &priv->cache;
++
++ dev_dbg(priv->dev, "%s:%d: fetching %d : 0x%08x\n", __func__, __LINE__,
++ entry, address);
++ if (ps3vram_download(mtd,
++ address,
++ CACHE_OFFSET + entry * cache->page_size,
++ DMA_PAGE_SIZE,
++ cache->page_size / DMA_PAGE_SIZE) < 0) {
++ dev_err(priv->dev, "%s:%d: failed to download from "
++ "0x%x to 0x%x size 0x%x\n", __func__, __LINE__, address,
++ entry * cache->page_size, cache->page_size);
++ }
++
++ cache->tags[entry].address = address;
++ cache->tags[entry].flags |= CACHE_PAGE_PRESENT;
++}
++
++
++static void ps3vram_cache_flush(struct mtd_info *mtd)
++{
++ struct ps3vram_priv *priv = mtd->priv;
++ struct ps3vram_cache *cache = &priv->cache;
++ int i;
++
++ dev_dbg(priv->dev, "%s:%d: FLUSH\n", __func__, __LINE__);
++ for (i = 0; i < cache->page_count; i++) {
++ ps3vram_cache_evict(mtd, i);
++ cache->tags[i].flags = 0;
++ }
++}
++
++static unsigned int ps3vram_cache_match(struct mtd_info *mtd, loff_t address)
++{
++ struct ps3vram_priv *priv = mtd->priv;
++ struct ps3vram_cache *cache = &priv->cache;
++ unsigned int base;
++ unsigned int offset;
++ int i;
++ static int counter;
++
++ offset = (unsigned int) (address & (cache->page_size - 1));
++ base = (unsigned int) (address - offset);
++
++ /* fully associative check */
++ for (i = 0; i < cache->page_count; i++) {
++ if ((cache->tags[i].flags & CACHE_PAGE_PRESENT) &&
++ cache->tags[i].address == base) {
++ dev_dbg(priv->dev, "%s:%d: found entry %d : 0x%08x\n",
++ __func__, __LINE__, i, cache->tags[i].address);
++ return i;
++ }
++ }
++
++ /* choose a random entry */
++ i = (jiffies + (counter++)) % cache->page_count;
++ dev_dbg(priv->dev, "%s:%d: using entry %d\n", __func__, __LINE__, i);
++
++ ps3vram_cache_evict(mtd, i);
++ ps3vram_cache_load(mtd, i, base);
++
++ return i;
++}
++
++static int ps3vram_cache_init(struct mtd_info *mtd)
++{
++ struct ps3vram_priv *priv = mtd->priv;
++
++ priv->cache.page_count = CACHE_PAGE_COUNT;
++ priv->cache.page_size = CACHE_PAGE_SIZE;
++ priv->cache.tags = kzalloc(sizeof(struct ps3vram_tag) *
++ CACHE_PAGE_COUNT, GFP_KERNEL);
++ if (priv->cache.tags == NULL) {
++ dev_err(priv->dev, "%s:%d: could not allocate cache tags\n",
++ __func__, __LINE__);
++ return -ENOMEM;
++ }
++
++ dev_info(priv->dev, "created ram cache: %d entries, %d KiB each\n",
++ CACHE_PAGE_COUNT, CACHE_PAGE_SIZE / 1024);
++
++ return 0;
++}
++
++static void ps3vram_cache_cleanup(struct mtd_info *mtd)
++{
++ struct ps3vram_priv *priv = mtd->priv;
++
++ ps3vram_cache_flush(mtd);
++ kfree(priv->cache.tags);
++}
++
++static int ps3vram_erase(struct mtd_info *mtd, struct erase_info *instr)
++{
++ struct ps3vram_priv *priv = mtd->priv;
++
++ if (instr->addr + instr->len > mtd->size)
++ return -EINVAL;
++
++ mutex_lock(&priv->lock);
++
++ ps3vram_cache_flush(mtd);
++
++ /* Set bytes to 0xFF */
++ memset_io(priv->ddr_base + instr->addr, 0xFF, instr->len);
++
++ mutex_unlock(&priv->lock);
++
++ instr->state = MTD_ERASE_DONE;
++ mtd_erase_callback(instr);
++
++ return 0;
++}
++
++static int ps3vram_read(struct mtd_info *mtd, loff_t from, size_t len,
++ size_t *retlen, u_char *buf)
++{
++ struct ps3vram_priv *priv = mtd->priv;
++ unsigned int cached, count;
++
++ dev_dbg(priv->dev, "%s:%d: from=0x%08x len=0x%zx\n", __func__, __LINE__,
++ (unsigned int)from, len);
++
++ if (from >= mtd->size)
++ return -EINVAL;
++
++ if (len > mtd->size - from)
++ len = mtd->size - from;
++
++ /* Copy from vram to buf */
++ count = len;
++ while (count) {
++ unsigned int offset, avail;
++ unsigned int entry;
++
++ offset = (unsigned int) (from & (priv->cache.page_size - 1));
++ avail = priv->cache.page_size - offset;
++
++ mutex_lock(&priv->lock);
++
++ entry = ps3vram_cache_match(mtd, from);
++ cached = CACHE_OFFSET + entry * priv->cache.page_size + offset;
++
++ dev_dbg(priv->dev, "%s:%d: from=%08x cached=%08x offset=%08x "
++ "avail=%08x count=%08x\n", __func__, __LINE__,
++ (unsigned int)from, cached, offset, avail, count);
++
++ if (avail > count)
++ avail = count;
++ memcpy(buf, priv->xdr_buf + cached, avail);
++
++ mutex_unlock(&priv->lock);
++
++ buf += avail;
++ count -= avail;
++ from += avail;
++ }
++
++ *retlen = len;
++ return 0;
++}
++
++static int ps3vram_write(struct mtd_info *mtd, loff_t to, size_t len,
++ size_t *retlen, const u_char *buf)
++{
++ struct ps3vram_priv *priv = mtd->priv;
++ unsigned int cached, count;
++
++ if (to >= mtd->size)
++ return -EINVAL;
++
++ if (len > mtd->size - to)
++ len = mtd->size - to;
++
++ /* Copy from buf to vram */
++ count = len;
++ while (count) {
++ unsigned int offset, avail;
++ unsigned int entry;
++
++ offset = (unsigned int) (to & (priv->cache.page_size - 1));
++ avail = priv->cache.page_size - offset;
++
++ mutex_lock(&priv->lock);
++
++ entry = ps3vram_cache_match(mtd, to);
++ cached = CACHE_OFFSET + entry * priv->cache.page_size + offset;
++
++ dev_dbg(priv->dev, "%s:%d: to=%08x cached=%08x offset=%08x "
++ "avail=%08x count=%08x\n", __func__, __LINE__,
++ (unsigned int)to, cached, offset, avail, count);
++
++ if (avail > count)
++ avail = count;
++ memcpy(priv->xdr_buf + cached, buf, avail);
++
++ priv->cache.tags[entry].flags |= CACHE_PAGE_DIRTY;
++
++ mutex_unlock(&priv->lock);
++
++ buf += avail;
++ count -= avail;
++ to += avail;
++ }
++
++ *retlen = len;
++ return 0;
++}
++
++static int __devinit ps3vram_probe(struct ps3_system_bus_device *dev)
++{
++ struct ps3vram_priv *priv;
++ int status;
++ u64 ddr_lpar;
++ u64 ctrl_lpar;
++ u64 info_lpar;
++ u64 reports_lpar;
++ u64 ddr_size;
++ u64 reports_size;
++ int ret = -ENOMEM;
++ char *rest;
++
++ ret = -EIO;
++ ps3vram_mtd.priv = kzalloc(sizeof(struct ps3vram_priv), GFP_KERNEL);
++ if (!ps3vram_mtd.priv)
++ goto out;
++ priv = ps3vram_mtd.priv;
++
++ mutex_init(&priv->lock);
++ priv->dev = &dev->core;
++
++ /* Allocate XDR buffer (1MiB aligned) */
++ priv->xdr_buf = (void *)__get_free_pages(GFP_KERNEL,
++ get_order(XDR_BUF_SIZE));
++ if (priv->xdr_buf == NULL) {
++ dev_dbg(&dev->core, "%s:%d: could not allocate XDR buffer\n",
++ __func__, __LINE__);
++ ret = -ENOMEM;
++ goto out_free_priv;
++ }
++
++ /* Put FIFO at begginning of XDR buffer */
++ priv->fifo_base = (u32 *) (priv->xdr_buf + FIFO_OFFSET);
++ priv->fifo_ptr = priv->fifo_base;
++
++ /* XXX: Need to open GPU, in case ps3fb or snd_ps3 aren't loaded */
++ if (ps3_open_hv_device(dev)) {
++ dev_err(&dev->core, "%s:%d: ps3_open_hv_device failed\n",
++ __func__, __LINE__);
++ ret = -EAGAIN;
++ goto out_close_gpu;
++ }
++
++ /* Request memory */
++ status = -1;
++ ddr_size = memparse(size, &rest);
++ if (*rest == '-')
++ ddr_size -= ps3fb_videomemory.size;
++ ddr_size = ALIGN(ddr_size, 1024*1024);
++ if (ddr_size <= 0) {
++ dev_err(&dev->core, "%s:%d: specified size is too small\n",
++ __func__, __LINE__);
++ ret = -EINVAL;
++ goto out_close_gpu;
++ }
++
++ while (ddr_size > 0) {
++ status = lv1_gpu_memory_allocate(ddr_size, 0, 0, 0, 0,
++ &priv->memory_handle,
++ &ddr_lpar);
++ if (!status)
++ break;
++ ddr_size -= 1024*1024;
++ }
++ if (status || ddr_size <= 0) {
++ dev_err(&dev->core, "%s:%d: lv1_gpu_memory_allocate failed\n",
++ __func__, __LINE__);
++ ret = -ENOMEM;
++ goto out_free_xdr_buf;
++ }
++
++ /* Request context */
++ status = lv1_gpu_context_allocate(priv->memory_handle,
++ 0,
++ &priv->context_handle,
++ &ctrl_lpar,
++ &info_lpar,
++ &reports_lpar,
++ &reports_size);
++ if (status) {
++ dev_err(&dev->core, "%s:%d: lv1_gpu_context_allocate failed\n",
++ __func__, __LINE__);
++ ret = -ENOMEM;
++ goto out_free_memory;
++ }
++
++ /* Map XDR buffer to RSX */
++ status = lv1_gpu_context_iomap(priv->context_handle, XDR_IOIF,
++ ps3_mm_phys_to_lpar(__pa(priv->xdr_buf)),
++ XDR_BUF_SIZE, 0);
++ if (status) {
++ dev_err(&dev->core, "%s:%d: lv1_gpu_context_iomap failed\n",
++ __func__, __LINE__);
++ ret = -ENOMEM;
++ goto out_free_context;
++ }
++
++ priv->ddr_base = ioremap_flags(ddr_lpar, ddr_size, _PAGE_NO_CACHE);
++
++ if (!priv->ddr_base) {
++ dev_err(&dev->core, "%s:%d: ioremap failed\n", __func__,
++ __LINE__);
++ ret = -ENOMEM;
++ goto out_free_context;
++ }
++
++ priv->ctrl = ioremap(ctrl_lpar, 64 * 1024);
++ if (!priv->ctrl) {
++ dev_err(&dev->core, "%s:%d: ioremap failed\n", __func__,
++ __LINE__);
++ ret = -ENOMEM;
++ goto out_unmap_vram;
++ }
++
++ priv->reports = ioremap(reports_lpar, reports_size);
++ if (!priv->reports) {
++ dev_err(&dev->core, "%s:%d: ioremap failed\n", __func__,
++ __LINE__);
++ ret = -ENOMEM;
++ goto out_unmap_ctrl;
++ }
++
++ mutex_lock(&ps3_gpu_mutex);
++ ps3vram_init_ring(&ps3vram_mtd);
++ mutex_unlock(&ps3_gpu_mutex);
++
++ ps3vram_mtd.name = "ps3vram";
++ ps3vram_mtd.size = ddr_size;
++ ps3vram_mtd.flags = MTD_CAP_RAM;
++ ps3vram_mtd.erase = ps3vram_erase;
++ ps3vram_mtd.point = NULL;
++ ps3vram_mtd.unpoint = NULL;
++ ps3vram_mtd.read = ps3vram_read;
++ ps3vram_mtd.write = ps3vram_write;
++ ps3vram_mtd.owner = THIS_MODULE;
++ ps3vram_mtd.type = MTD_RAM;
++ ps3vram_mtd.erasesize = CACHE_PAGE_SIZE;
++ ps3vram_mtd.writesize = 1;
++
++ ps3vram_bind(&ps3vram_mtd);
++
++ mutex_lock(&ps3_gpu_mutex);
++ ret = ps3vram_wait_ring(&ps3vram_mtd, 100);
++ mutex_unlock(&ps3_gpu_mutex);
++ if (ret < 0) {
++ dev_err(&dev->core, "%s:%d: failed to initialize channels\n",
++ __func__, __LINE__);
++ ret = -ETIMEDOUT;
++ goto out_unmap_reports;
++ }
++
++ ps3vram_cache_init(&ps3vram_mtd);
++
++ if (add_mtd_device(&ps3vram_mtd)) {
++ dev_err(&dev->core, "%s:%d: add_mtd_device failed\n",
++ __func__, __LINE__);
++ ret = -EAGAIN;
++ goto out_cache_cleanup;
++ }
++
++ dev_info(&dev->core, "reserved %u MiB of gpu memory\n",
++ (unsigned int)(ddr_size / 1024 / 1024));
++
++ return 0;
++
++out_cache_cleanup:
++ ps3vram_cache_cleanup(&ps3vram_mtd);
++out_unmap_reports:
++ iounmap(priv->reports);
++out_unmap_ctrl:
++ iounmap(priv->ctrl);
++out_unmap_vram:
++ iounmap(priv->ddr_base);
++out_free_context:
++ lv1_gpu_context_free(priv->context_handle);
++out_free_memory:
++ lv1_gpu_memory_free(priv->memory_handle);
++out_close_gpu:
++ ps3_close_hv_device(dev);
++out_free_xdr_buf:
++ free_pages((unsigned long) priv->xdr_buf, get_order(XDR_BUF_SIZE));
++out_free_priv:
++ kfree(ps3vram_mtd.priv);
++ ps3vram_mtd.priv = NULL;
++out:
++ return ret;
++}
++
++static int ps3vram_shutdown(struct ps3_system_bus_device *dev)
++{
++ struct ps3vram_priv *priv;
++
++ priv = ps3vram_mtd.priv;
++
++ del_mtd_device(&ps3vram_mtd);
++ ps3vram_cache_cleanup(&ps3vram_mtd);
++ iounmap(priv->reports);
++ iounmap(priv->ctrl);
++ iounmap(priv->ddr_base);
++ lv1_gpu_context_free(priv->context_handle);
++ lv1_gpu_memory_free(priv->memory_handle);
++ ps3_close_hv_device(dev);
++ free_pages((unsigned long) priv->xdr_buf, get_order(XDR_BUF_SIZE));
++ kfree(priv);
++ return 0;
++}
++
++static struct ps3_system_bus_driver ps3vram_driver = {
++ .match_id = PS3_MATCH_ID_GPU,
++ .match_sub_id = PS3_MATCH_SUB_ID_GPU_RAMDISK,
++ .core.name = DEVICE_NAME,
++ .core.owner = THIS_MODULE,
++ .probe = ps3vram_probe,
++ .remove = ps3vram_shutdown,
++ .shutdown = ps3vram_shutdown,
++};
++
++static int __init ps3vram_init(void)
++{
++ return ps3_system_bus_driver_register(&ps3vram_driver);
++}
++
++static void __exit ps3vram_exit(void)
++{
++ ps3_system_bus_driver_unregister(&ps3vram_driver);
++}
++
++module_init(ps3vram_init);
++module_exit(ps3vram_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Jim Paris <jim@jtan.com>");
++MODULE_DESCRIPTION("MTD driver for PS3 video RAM");
++MODULE_ALIAS(PS3_MODULE_ALIAS_GPU_RAMDISK);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mtd/devices/slram.c linux-2.6.29-rc3.owrt/drivers/mtd/devices/slram.c
+--- linux-2.6.29.owrt/drivers/mtd/devices/slram.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mtd/devices/slram.c 2009-05-10 23:48:28.000000000 +0200
+@@ -267,28 +267,22 @@
+ if (*(szlength) != '+') {
+ devlength = simple_strtoul(szlength, &buffer, 0);
+ devlength = handle_unit(devlength, buffer) - devstart;
+- if (devlength < devstart)
+- goto err_out;
+-
+- devlength -= devstart;
+ } else {
+ devlength = simple_strtoul(szlength + 1, &buffer, 0);
+ devlength = handle_unit(devlength, buffer);
+ }
+ T("slram: devname=%s, devstart=0x%lx, devlength=0x%lx\n",
+ devname, devstart, devlength);
+- if (devlength % SLRAM_BLK_SZ != 0)
+- goto err_out;
++ if ((devstart < 0) || (devlength < 0) || (devlength % SLRAM_BLK_SZ != 0)) {
++ E("slram: Illegal start / length parameter.\n");
++ return(-EINVAL);
++ }
+
+ if ((devstart = register_device(devname, devstart, devlength))){
+ unregister_devices();
+ return((int)devstart);
+ }
+ return(0);
+-
+-err_out:
+- E("slram: Illegal length parameter.\n");
+- return(-EINVAL);
+ }
+
+ #ifndef MODULE
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mtd/lpddr/Kconfig linux-2.6.29-rc3.owrt/drivers/mtd/lpddr/Kconfig
+--- linux-2.6.29.owrt/drivers/mtd/lpddr/Kconfig 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mtd/lpddr/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -12,7 +12,6 @@
+ DDR memories, intended for battery-operated systems.
+
+ config MTD_QINFO_PROBE
+- depends on MTD_LPDDR
+ tristate "Detect flash chips by QINFO probe"
+ help
+ Device Information for LPDDR chips is offered through the Overlay
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mtd/maps/bfin-async-flash.c linux-2.6.29-rc3.owrt/drivers/mtd/maps/bfin-async-flash.c
+--- linux-2.6.29.owrt/drivers/mtd/maps/bfin-async-flash.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mtd/maps/bfin-async-flash.c 2009-05-10 23:48:28.000000000 +0200
+@@ -152,18 +152,14 @@
+
+ if (gpio_request(state->enet_flash_pin, DRIVER_NAME)) {
+ pr_devinit(KERN_ERR DRIVER_NAME ": Failed to request gpio %d\n", state->enet_flash_pin);
+- kfree(state);
+ return -EBUSY;
+ }
+ gpio_direction_output(state->enet_flash_pin, 1);
+
+ pr_devinit(KERN_NOTICE DRIVER_NAME ": probing %d-bit flash bus\n", state->map.bankwidth * 8);
+ state->mtd = do_map_probe(memory->name, &state->map);
+- if (!state->mtd) {
+- gpio_free(state->enet_flash_pin);
+- kfree(state);
++ if (!state->mtd)
+ return -ENXIO;
+- }
+
+ #ifdef CONFIG_MTD_PARTITIONS
+ ret = parse_mtd_partitions(state->mtd, part_probe_types, &pdata->parts, 0);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mtd/maps/ck804xrom.c linux-2.6.29-rc3.owrt/drivers/mtd/maps/ck804xrom.c
+--- linux-2.6.29.owrt/drivers/mtd/maps/ck804xrom.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mtd/maps/ck804xrom.c 2009-05-10 23:48:28.000000000 +0200
+@@ -342,9 +342,9 @@
+ { 0, }
+ };
+
+-#if 0
+ MODULE_DEVICE_TABLE(pci, ck804xrom_pci_tbl);
+
++#if 0
+ static struct pci_driver ck804xrom_driver = {
+ .name = MOD_NAME,
+ .id_table = ck804xrom_pci_tbl,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mtd/maps/Kconfig linux-2.6.29-rc3.owrt/drivers/mtd/maps/Kconfig
+--- linux-2.6.29.owrt/drivers/mtd/maps/Kconfig 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mtd/maps/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -491,7 +491,7 @@
+
+ config MTD_BFIN_ASYNC
+ tristate "Blackfin BF533-STAMP Flash Chip Support"
+- depends on BFIN533_STAMP && MTD_CFI && MTD_COMPLEX_MAPPINGS
++ depends on BFIN533_STAMP && MTD_CFI
+ select MTD_PARTITIONS
+ default y
+ help
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mtd/maps/physmap.c linux-2.6.29-rc3.owrt/drivers/mtd/maps/physmap.c
+--- linux-2.6.29.owrt/drivers/mtd/maps/physmap.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mtd/maps/physmap.c 2009-05-10 23:48:28.000000000 +0200
+@@ -29,7 +29,6 @@
+ struct map_info map[MAX_RESOURCES];
+ #ifdef CONFIG_MTD_PARTITIONS
+ int nr_parts;
+- struct mtd_partition *parts;
+ #endif
+ };
+
+@@ -46,29 +45,25 @@
+
+ physmap_data = dev->dev.platform_data;
+
+- if (info->cmtd) {
+-#ifdef CONFIG_MTD_PARTITIONS
+- if (info->nr_parts || physmap_data->nr_parts)
+- del_mtd_partitions(info->cmtd);
+- else
+- del_mtd_device(info->cmtd);
+-#else
+- del_mtd_device(info->cmtd);
+-#endif
+- }
+-#ifdef CONFIG_MTD_PARTITIONS
+- if (info->nr_parts)
+- kfree(info->parts);
+-#endif
+-
+ #ifdef CONFIG_MTD_CONCAT
+- if (info->cmtd != info->mtd[0])
++ if (info->cmtd != info->mtd[0]) {
++ del_mtd_device(info->cmtd);
+ mtd_concat_destroy(info->cmtd);
++ }
+ #endif
+
+ for (i = 0; i < MAX_RESOURCES; i++) {
+- if (info->mtd[i] != NULL)
++ if (info->mtd[i] != NULL) {
++#ifdef CONFIG_MTD_PARTITIONS
++ if (info->nr_parts || physmap_data->nr_parts)
++ del_mtd_partitions(info->mtd[i]);
++ else
++ del_mtd_device(info->mtd[i]);
++#else
++ del_mtd_device(info->mtd[i]);
++#endif
+ map_destroy(info->mtd[i]);
++ }
+ }
+ return 0;
+ }
+@@ -91,6 +86,9 @@
+ int err = 0;
+ int i;
+ int devices_found = 0;
++#ifdef CONFIG_MTD_PARTITIONS
++ struct mtd_partition *parts;
++#endif
+
+ physmap_data = dev->dev.platform_data;
+ if (physmap_data == NULL)
+@@ -169,11 +167,10 @@
+ goto err_out;
+
+ #ifdef CONFIG_MTD_PARTITIONS
+- err = parse_mtd_partitions(info->cmtd, part_probe_types,
+- &info->parts, 0);
++ err = parse_mtd_partitions(info->cmtd, part_probe_types, &parts, 0);
+ if (err > 0) {
+- add_mtd_partitions(info->cmtd, info->parts, err);
+- info->nr_parts = err;
++ add_mtd_partitions(info->cmtd, parts, err);
++ kfree(parts);
+ return 0;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mtd/maps/sa1100-flash.c linux-2.6.29-rc3.owrt/drivers/mtd/maps/sa1100-flash.c
+--- linux-2.6.29.owrt/drivers/mtd/maps/sa1100-flash.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mtd/maps/sa1100-flash.c 2009-05-10 23:48:28.000000000 +0200
+@@ -453,7 +453,7 @@
+ .resume = sa1100_mtd_resume,
+ .shutdown = sa1100_mtd_shutdown,
+ .driver = {
+- .name = "sa1100-mtd",
++ .name = "flash",
+ .owner = THIS_MODULE,
+ },
+ };
+@@ -474,4 +474,4 @@
+ MODULE_AUTHOR("Nicolas Pitre");
+ MODULE_DESCRIPTION("SA1100 CFI map driver");
+ MODULE_LICENSE("GPL");
+-MODULE_ALIAS("platform:sa1100-mtd");
++MODULE_ALIAS("platform:flash");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mtd/nand/atmel_nand.c linux-2.6.29-rc3.owrt/drivers/mtd/nand/atmel_nand.c
+--- linux-2.6.29.owrt/drivers/mtd/nand/atmel_nand.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mtd/nand/atmel_nand.c 2009-05-10 23:48:28.000000000 +0200
+@@ -139,8 +139,7 @@
+ struct nand_chip *nand_chip = mtd->priv;
+ struct atmel_nand_host *host = nand_chip->priv;
+
+- return gpio_get_value(host->board->rdy_pin) ^
+- !!host->board->rdy_pin_active_low;
++ return gpio_get_value(host->board->rdy_pin);
+ }
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mtd/nand/orion_nand.c linux-2.6.29-rc3.owrt/drivers/mtd/nand/orion_nand.c
+--- linux-2.6.29.owrt/drivers/mtd/nand/orion_nand.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mtd/nand/orion_nand.c 2009-05-10 23:48:28.000000000 +0200
+@@ -149,7 +149,7 @@
+
+ static struct platform_driver orion_nand_driver = {
+ .probe = orion_nand_probe,
+- .remove = __devexit_p(orion_nand_remove),
++ .remove = orion_nand_remove,
+ .driver = {
+ .name = "orion_nand",
+ .owner = THIS_MODULE,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mtd/ubi/build.c linux-2.6.29-rc3.owrt/drivers/mtd/ubi/build.c
+--- linux-2.6.29.owrt/drivers/mtd/ubi/build.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mtd/ubi/build.c 2009-05-10 23:48:28.000000000 +0200
+@@ -263,12 +263,8 @@
+ return ret;
+ }
+
+-static void dev_release(struct device *dev)
+-{
+- struct ubi_device *ubi = container_of(dev, struct ubi_device, dev);
+-
+- kfree(ubi);
+-}
++/* Fake "release" method for UBI devices */
++static void dev_release(struct device *dev) { }
+
+ /**
+ * ubi_sysfs_init - initialize sysfs for an UBI device.
+@@ -384,7 +380,7 @@
+ */
+ static int uif_init(struct ubi_device *ubi)
+ {
+- int i, err;
++ int i, err, do_free = 0;
+ dev_t dev;
+
+ sprintf(ubi->ubi_name, UBI_NAME_STR "%d", ubi->ubi_num);
+@@ -431,10 +427,13 @@
+
+ out_volumes:
+ kill_volumes(ubi);
++ do_free = 0;
+ out_sysfs:
+ ubi_sysfs_close(ubi);
+ cdev_del(&ubi->cdev);
+ out_unreg:
++ if (do_free)
++ free_user_volumes(ubi);
+ unregister_chrdev_region(ubi->cdev.dev, ubi->vtbl_slots + 1);
+ ubi_err("cannot initialize UBI %s, error %d", ubi->ubi_name, err);
+ return err;
+@@ -948,12 +947,6 @@
+ if (ubi->bgt_thread)
+ kthread_stop(ubi->bgt_thread);
+
+- /*
+- * Get a reference to the device in order to prevent 'dev_release()'
+- * from freeing @ubi object.
+- */
+- get_device(&ubi->dev);
+-
+ uif_close(ubi);
+ ubi_wl_close(ubi);
+ free_internal_volumes(ubi);
+@@ -965,7 +958,7 @@
+ vfree(ubi->dbg_peb_buf);
+ #endif
+ ubi_msg("mtd%d is detached from ubi%d", ubi->mtd->index, ubi->ubi_num);
+- put_device(&ubi->dev);
++ kfree(ubi);
+ return 0;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mtd/ubi/cdev.c linux-2.6.29-rc3.owrt/drivers/mtd/ubi/cdev.c
+--- linux-2.6.29.owrt/drivers/mtd/ubi/cdev.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mtd/ubi/cdev.c 2009-05-10 23:48:28.000000000 +0200
+@@ -40,9 +40,9 @@
+ #include <linux/ioctl.h>
+ #include <linux/capability.h>
+ #include <linux/uaccess.h>
+-#include <linux/compat.h>
+-#include <linux/math64.h>
++#include <linux/smp_lock.h>
+ #include <mtd/ubi-user.h>
++#include <asm/div64.h>
+ #include "ubi.h"
+
+ /**
+@@ -195,6 +195,7 @@
+ int err, lnum, off, len, tbuf_size;
+ size_t count_save = count;
+ void *tbuf;
++ uint64_t tmp;
+
+ dbg_gen("read %zd bytes from offset %lld of volume %d",
+ count, *offp, vol->vol_id);
+@@ -224,7 +225,10 @@
+ return -ENOMEM;
+
+ len = count > tbuf_size ? tbuf_size : count;
+- lnum = div_u64_rem(*offp, vol->usable_leb_size, &off);
++
++ tmp = *offp;
++ off = do_div(tmp, vol->usable_leb_size);
++ lnum = tmp;
+
+ do {
+ cond_resched();
+@@ -259,9 +263,12 @@
+ return err ? err : count_save - count;
+ }
+
++#ifdef CONFIG_MTD_UBI_DEBUG_USERSPACE_IO
++
+ /*
+ * This function allows to directly write to dynamic UBI volumes, without
+- * issuing the volume update operation.
++ * issuing the volume update operation. Available only as a debugging feature.
++ * Very useful for testing UBI.
+ */
+ static ssize_t vol_cdev_direct_write(struct file *file, const char __user *buf,
+ size_t count, loff_t *offp)
+@@ -272,9 +279,7 @@
+ int lnum, off, len, tbuf_size, err = 0;
+ size_t count_save = count;
+ char *tbuf;
+-
+- if (!vol->direct_writes)
+- return -EPERM;
++ uint64_t tmp;
+
+ dbg_gen("requested: write %zd bytes to offset %lld of volume %u",
+ count, *offp, vol->vol_id);
+@@ -282,7 +287,10 @@
+ if (vol->vol_type == UBI_STATIC_VOLUME)
+ return -EROFS;
+
+- lnum = div_u64_rem(*offp, vol->usable_leb_size, &off);
++ tmp = *offp;
++ off = do_div(tmp, vol->usable_leb_size);
++ lnum = tmp;
++
+ if (off & (ubi->min_io_size - 1)) {
+ dbg_err("unaligned position");
+ return -EINVAL;
+@@ -339,6 +347,10 @@
+ return err ? err : count_save - count;
+ }
+
++#else
++#define vol_cdev_direct_write(file, buf, count, offp) (-EPERM)
++#endif /* CONFIG_MTD_UBI_DEBUG_USERSPACE_IO */
++
+ static ssize_t vol_cdev_write(struct file *file, const char __user *buf,
+ size_t count, loff_t *offp)
+ {
+@@ -390,8 +402,8 @@
+ return count;
+ }
+
+-static long vol_cdev_ioctl(struct file *file, unsigned int cmd,
+- unsigned long arg)
++static int vol_cdev_ioctl(struct inode *inode, struct file *file,
++ unsigned int cmd, unsigned long arg)
+ {
+ int err = 0;
+ struct ubi_volume_desc *desc = file->private_data;
+@@ -475,6 +487,7 @@
+ break;
+ }
+
++#ifdef CONFIG_MTD_UBI_DEBUG_USERSPACE_IO
+ /* Logical eraseblock erasure command */
+ case UBI_IOCEBER:
+ {
+@@ -505,77 +518,13 @@
+ err = ubi_wl_flush(ubi);
+ break;
+ }
+-
+- /* Logical eraseblock map command */
+- case UBI_IOCEBMAP:
+- {
+- struct ubi_map_req req;
+-
+- err = copy_from_user(&req, argp, sizeof(struct ubi_map_req));
+- if (err) {
+- err = -EFAULT;
+- break;
+- }
+- err = ubi_leb_map(desc, req.lnum, req.dtype);
+- break;
+- }
+-
+- /* Logical eraseblock un-map command */
+- case UBI_IOCEBUNMAP:
+- {
+- int32_t lnum;
+-
+- err = get_user(lnum, (__user int32_t *)argp);
+- if (err) {
+- err = -EFAULT;
+- break;
+- }
+- err = ubi_leb_unmap(desc, lnum);
+- break;
+- }
+-
+- /* Check if logical eraseblock is mapped command */
+- case UBI_IOCEBISMAP:
+- {
+- int32_t lnum;
+-
+- err = get_user(lnum, (__user int32_t *)argp);
+- if (err) {
+- err = -EFAULT;
+- break;
+- }
+- err = ubi_is_mapped(desc, lnum);
+- break;
+- }
+-
+- /* Set volume property command*/
+- case UBI_IOCSETPROP:
+- {
+- struct ubi_set_prop_req req;
+-
+- err = copy_from_user(&req, argp,
+- sizeof(struct ubi_set_prop_req));
+- if (err) {
+- err = -EFAULT;
+- break;
+- }
+- switch (req.property) {
+- case UBI_PROP_DIRECT_WRITE:
+- mutex_lock(&ubi->volumes_mutex);
+- desc->vol->direct_writes = !!req.value;
+- mutex_unlock(&ubi->volumes_mutex);
+- break;
+- default:
+- err = -EINVAL;
+- break;
+- }
+- break;
+- }
++#endif
+
+ default:
+ err = -ENOTTY;
+ break;
+ }
++
+ return err;
+ }
+
+@@ -813,8 +762,8 @@
+ return err;
+ }
+
+-static long ubi_cdev_ioctl(struct file *file, unsigned int cmd,
+- unsigned long arg)
++static int ubi_cdev_ioctl(struct inode *inode, struct file *file,
++ unsigned int cmd, unsigned long arg)
+ {
+ int err = 0;
+ struct ubi_device *ubi;
+@@ -824,7 +773,7 @@
+ if (!capable(CAP_SYS_RESOURCE))
+ return -EPERM;
+
+- ubi = ubi_get_by_major(imajor(file->f_mapping->host));
++ ubi = ubi_get_by_major(imajor(inode));
+ if (!ubi)
+ return -ENODEV;
+
+@@ -894,6 +843,7 @@
+ case UBI_IOCRSVOL:
+ {
+ int pebs;
++ uint64_t tmp;
+ struct ubi_rsvol_req req;
+
+ dbg_gen("re-size volume");
+@@ -913,8 +863,9 @@
+ break;
+ }
+
+- pebs = div_u64(req.bytes + desc->vol->usable_leb_size - 1,
+- desc->vol->usable_leb_size);
++ tmp = req.bytes;
++ pebs = !!do_div(tmp, desc->vol->usable_leb_size);
++ pebs += tmp;
+
+ mutex_lock(&ubi->volumes_mutex);
+ err = ubi_resize_volume(desc, pebs);
+@@ -958,8 +909,8 @@
+ return err;
+ }
+
+-static long ctrl_cdev_ioctl(struct file *file, unsigned int cmd,
+- unsigned long arg)
++static int ctrl_cdev_ioctl(struct inode *inode, struct file *file,
++ unsigned int cmd, unsigned long arg)
+ {
+ int err = 0;
+ void __user *argp = (void __user *)arg;
+@@ -1035,59 +986,26 @@
+ return err;
+ }
+
+-#ifdef CONFIG_COMPAT
+-static long vol_cdev_compat_ioctl(struct file *file, unsigned int cmd,
+- unsigned long arg)
+-{
+- unsigned long translated_arg = (unsigned long)compat_ptr(arg);
+-
+- return vol_cdev_ioctl(file, cmd, translated_arg);
+-}
+-
+-static long ubi_cdev_compat_ioctl(struct file *file, unsigned int cmd,
+- unsigned long arg)
+-{
+- unsigned long translated_arg = (unsigned long)compat_ptr(arg);
+-
+- return ubi_cdev_ioctl(file, cmd, translated_arg);
+-}
+-
+-static long ctrl_cdev_compat_ioctl(struct file *file, unsigned int cmd,
+- unsigned long arg)
+-{
+- unsigned long translated_arg = (unsigned long)compat_ptr(arg);
+-
+- return ctrl_cdev_ioctl(file, cmd, translated_arg);
+-}
+-#else
+-#define vol_cdev_compat_ioctl NULL
+-#define ubi_cdev_compat_ioctl NULL
+-#define ctrl_cdev_compat_ioctl NULL
+-#endif
+-
+-/* UBI volume character device operations */
+-const struct file_operations ubi_vol_cdev_operations = {
+- .owner = THIS_MODULE,
+- .open = vol_cdev_open,
+- .release = vol_cdev_release,
+- .llseek = vol_cdev_llseek,
+- .read = vol_cdev_read,
+- .write = vol_cdev_write,
+- .unlocked_ioctl = vol_cdev_ioctl,
+- .compat_ioctl = vol_cdev_compat_ioctl,
++/* UBI control character device operations */
++struct file_operations ubi_ctrl_cdev_operations = {
++ .ioctl = ctrl_cdev_ioctl,
++ .owner = THIS_MODULE,
+ };
+
+ /* UBI character device operations */
+-const struct file_operations ubi_cdev_operations = {
+- .owner = THIS_MODULE,
+- .llseek = no_llseek,
+- .unlocked_ioctl = ubi_cdev_ioctl,
+- .compat_ioctl = ubi_cdev_compat_ioctl,
++struct file_operations ubi_cdev_operations = {
++ .owner = THIS_MODULE,
++ .ioctl = ubi_cdev_ioctl,
++ .llseek = no_llseek,
+ };
+
+-/* UBI control character device operations */
+-const struct file_operations ubi_ctrl_cdev_operations = {
+- .owner = THIS_MODULE,
+- .unlocked_ioctl = ctrl_cdev_ioctl,
+- .compat_ioctl = ctrl_cdev_compat_ioctl,
++/* UBI volume character device operations */
++struct file_operations ubi_vol_cdev_operations = {
++ .owner = THIS_MODULE,
++ .open = vol_cdev_open,
++ .release = vol_cdev_release,
++ .llseek = vol_cdev_llseek,
++ .read = vol_cdev_read,
++ .write = vol_cdev_write,
++ .ioctl = vol_cdev_ioctl,
+ };
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mtd/ubi/gluebi.c linux-2.6.29-rc3.owrt/drivers/mtd/ubi/gluebi.c
+--- linux-2.6.29.owrt/drivers/mtd/ubi/gluebi.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mtd/ubi/gluebi.c 2009-05-10 23:48:28.000000000 +0200
+@@ -28,7 +28,7 @@
+ * eraseblock size is equivalent to the logical eraseblock size of the volume.
+ */
+
+-#include <linux/math64.h>
++#include <asm/div64.h>
+ #include "ubi.h"
+
+ /**
+@@ -109,6 +109,7 @@
+ int err = 0, lnum, offs, total_read;
+ struct ubi_volume *vol;
+ struct ubi_device *ubi;
++ uint64_t tmp = from;
+
+ dbg_gen("read %zd bytes from offset %lld", len, from);
+
+@@ -118,7 +119,9 @@
+ vol = container_of(mtd, struct ubi_volume, gluebi_mtd);
+ ubi = vol->ubi;
+
+- lnum = div_u64_rem(from, mtd->erasesize, &offs);
++ offs = do_div(tmp, mtd->erasesize);
++ lnum = tmp;
++
+ total_read = len;
+ while (total_read) {
+ size_t to_read = mtd->erasesize - offs;
+@@ -157,6 +160,7 @@
+ int err = 0, lnum, offs, total_written;
+ struct ubi_volume *vol;
+ struct ubi_device *ubi;
++ uint64_t tmp = to;
+
+ dbg_gen("write %zd bytes to offset %lld", len, to);
+
+@@ -169,7 +173,8 @@
+ if (ubi->ro_mode)
+ return -EROFS;
+
+- lnum = div_u64_rem(to, mtd->erasesize, &offs);
++ offs = do_div(tmp, mtd->erasesize);
++ lnum = tmp;
+
+ if (len % mtd->writesize || offs % mtd->writesize)
+ return -EINVAL;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mtd/ubi/Kconfig.debug linux-2.6.29-rc3.owrt/drivers/mtd/ubi/Kconfig.debug
+--- linux-2.6.29.owrt/drivers/mtd/ubi/Kconfig.debug 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mtd/ubi/Kconfig.debug 2009-05-10 23:48:28.000000000 +0200
+@@ -33,6 +33,16 @@
+ This option switches the background thread off by default. The thread
+ may be also be enabled/disabled via UBI sysfs.
+
++config MTD_UBI_DEBUG_USERSPACE_IO
++ bool "Direct user-space write/erase support"
++ default n
++ depends on MTD_UBI_DEBUG
++ help
++ By default, users cannot directly write and erase individual
++ eraseblocks of dynamic volumes, and have to use update operation
++ instead. This option enables this capability - it is very useful for
++ debugging and testing.
++
+ config MTD_UBI_DEBUG_EMULATE_BITFLIPS
+ bool "Emulate flash bit-flips"
+ depends on MTD_UBI_DEBUG
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mtd/ubi/scan.c linux-2.6.29-rc3.owrt/drivers/mtd/ubi/scan.c
+--- linux-2.6.29.owrt/drivers/mtd/ubi/scan.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mtd/ubi/scan.c 2009-05-10 23:48:28.000000000 +0200
+@@ -42,7 +42,7 @@
+
+ #include <linux/err.h>
+ #include <linux/crc32.h>
+-#include <linux/math64.h>
++#include <asm/div64.h>
+ #include "ubi.h"
+
+ #ifdef CONFIG_MTD_UBI_DEBUG_PARANOID
+@@ -904,8 +904,10 @@
+ dbg_msg("scanning is finished");
+
+ /* Calculate mean erase counter */
+- if (si->ec_count)
+- si->mean_ec = div_u64(si->ec_sum, si->ec_count);
++ if (si->ec_count) {
++ do_div(si->ec_sum, si->ec_count);
++ si->mean_ec = si->ec_sum;
++ }
+
+ if (si->is_empty)
+ ubi_msg("empty MTD device detected");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mtd/ubi/ubi.h linux-2.6.29-rc3.owrt/drivers/mtd/ubi/ubi.h
+--- linux-2.6.29.owrt/drivers/mtd/ubi/ubi.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mtd/ubi/ubi.h 2009-05-10 23:48:28.000000000 +0200
+@@ -206,7 +206,6 @@
+ * @upd_marker: %1 if the update marker is set for this volume
+ * @updating: %1 if the volume is being updated
+ * @changing_leb: %1 if the atomic LEB change ioctl command is in progress
+- * @direct_writes: %1 if direct writes are enabled for this volume
+ *
+ * @gluebi_desc: gluebi UBI volume descriptor
+ * @gluebi_refcount: reference count of the gluebi MTD device
+@@ -254,7 +253,6 @@
+ unsigned int upd_marker:1;
+ unsigned int updating:1;
+ unsigned int changing_leb:1;
+- unsigned int direct_writes:1;
+
+ #ifdef CONFIG_MTD_UBI_GLUEBI
+ /*
+@@ -306,8 +304,7 @@
+ * @vtbl_size: size of the volume table in bytes
+ * @vtbl: in-RAM volume table copy
+ * @volumes_mutex: protects on-flash volume table and serializes volume
+- * changes, like creation, deletion, update, re-size,
+- * re-name and set property
++ * changes, like creation, deletion, update, re-size and re-name
+ *
+ * @max_ec: current highest erase counter value
+ * @mean_ec: current mean erase counter value
+@@ -452,9 +449,9 @@
+ };
+
+ extern struct kmem_cache *ubi_wl_entry_slab;
+-extern const struct file_operations ubi_ctrl_cdev_operations;
+-extern const struct file_operations ubi_cdev_operations;
+-extern const struct file_operations ubi_vol_cdev_operations;
++extern struct file_operations ubi_ctrl_cdev_operations;
++extern struct file_operations ubi_cdev_operations;
++extern struct file_operations ubi_vol_cdev_operations;
+ extern struct class *ubi_class;
+ extern struct mutex ubi_devices_mutex;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mtd/ubi/upd.c linux-2.6.29-rc3.owrt/drivers/mtd/ubi/upd.c
+--- linux-2.6.29.owrt/drivers/mtd/ubi/upd.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mtd/ubi/upd.c 2009-05-10 23:48:28.000000000 +0200
+@@ -40,7 +40,7 @@
+
+ #include <linux/err.h>
+ #include <linux/uaccess.h>
+-#include <linux/math64.h>
++#include <asm/div64.h>
+ #include "ubi.h"
+
+ /**
+@@ -89,6 +89,7 @@
+ long long bytes)
+ {
+ int err;
++ uint64_t tmp;
+ struct ubi_vtbl_record vtbl_rec;
+
+ dbg_gen("clear update marker for volume %d", vol->vol_id);
+@@ -100,9 +101,9 @@
+
+ if (vol->vol_type == UBI_STATIC_VOLUME) {
+ vol->corrupted = 0;
+- vol->used_bytes = bytes;
+- vol->used_ebs = div_u64_rem(bytes, vol->usable_leb_size,
+- &vol->last_eb_bytes);
++ vol->used_bytes = tmp = bytes;
++ vol->last_eb_bytes = do_div(tmp, vol->usable_leb_size);
++ vol->used_ebs = tmp;
+ if (vol->last_eb_bytes)
+ vol->used_ebs += 1;
+ else
+@@ -130,6 +131,7 @@
+ long long bytes)
+ {
+ int i, err;
++ uint64_t tmp;
+
+ dbg_gen("start update of volume %d, %llu bytes", vol->vol_id, bytes);
+ ubi_assert(!vol->updating && !vol->changing_leb);
+@@ -159,8 +161,9 @@
+ if (!vol->upd_buf)
+ return -ENOMEM;
+
+- vol->upd_ebs = div_u64(bytes + vol->usable_leb_size - 1,
+- vol->usable_leb_size);
++ tmp = bytes;
++ vol->upd_ebs = !!do_div(tmp, vol->usable_leb_size);
++ vol->upd_ebs += tmp;
+ vol->upd_bytes = bytes;
+ vol->upd_received = 0;
+ return 0;
+@@ -279,6 +282,7 @@
+ int ubi_more_update_data(struct ubi_device *ubi, struct ubi_volume *vol,
+ const void __user *buf, int count)
+ {
++ uint64_t tmp;
+ int lnum, offs, err = 0, len, to_write = count;
+
+ dbg_gen("write %d of %lld bytes, %lld already passed",
+@@ -287,7 +291,10 @@
+ if (ubi->ro_mode)
+ return -EROFS;
+
+- lnum = div_u64_rem(vol->upd_received, vol->usable_leb_size, &offs);
++ tmp = vol->upd_received;
++ offs = do_div(tmp, vol->usable_leb_size);
++ lnum = tmp;
++
+ if (vol->upd_received + count > vol->upd_bytes)
+ to_write = count = vol->upd_bytes - vol->upd_received;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/mtd/ubi/vmt.c linux-2.6.29-rc3.owrt/drivers/mtd/ubi/vmt.c
+--- linux-2.6.29.owrt/drivers/mtd/ubi/vmt.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/mtd/ubi/vmt.c 2009-05-10 23:48:28.000000000 +0200
+@@ -24,7 +24,7 @@
+ */
+
+ #include <linux/err.h>
+-#include <linux/math64.h>
++#include <asm/div64.h>
+ #include "ubi.h"
+
+ #ifdef CONFIG_MTD_UBI_DEBUG_PARANOID
+@@ -205,6 +205,7 @@
+ int i, err, vol_id = req->vol_id, do_free = 1;
+ struct ubi_volume *vol;
+ struct ubi_vtbl_record vtbl_rec;
++ uint64_t bytes;
+ dev_t dev;
+
+ if (ubi->ro_mode)
+@@ -254,8 +255,10 @@
+
+ /* Calculate how many eraseblocks are requested */
+ vol->usable_leb_size = ubi->leb_size - ubi->leb_size % req->alignment;
+- vol->reserved_pebs += div_u64(req->bytes + vol->usable_leb_size - 1,
+- vol->usable_leb_size);
++ bytes = req->bytes;
++ if (do_div(bytes, vol->usable_leb_size))
++ vol->reserved_pebs = 1;
++ vol->reserved_pebs += bytes;
+
+ /* Reserve physical eraseblocks */
+ if (vol->reserved_pebs > ubi->avail_pebs) {
+@@ -298,10 +301,10 @@
+ vol->used_bytes =
+ (long long)vol->used_ebs * vol->usable_leb_size;
+ } else {
+- vol->used_ebs = div_u64_rem(vol->used_bytes,
+- vol->usable_leb_size,
+- &vol->last_eb_bytes);
+- if (vol->last_eb_bytes != 0)
++ bytes = vol->used_bytes;
++ vol->last_eb_bytes = do_div(bytes, vol->usable_leb_size);
++ vol->used_ebs = bytes;
++ if (vol->last_eb_bytes)
+ vol->used_ebs += 1;
+ else
+ vol->last_eb_bytes = vol->usable_leb_size;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/3c505.c linux-2.6.29-rc3.owrt/drivers/net/3c505.c
+--- linux-2.6.29.owrt/drivers/net/3c505.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/3c505.c 2009-05-10 23:48:28.000000000 +0200
+@@ -493,27 +493,21 @@
+ }
+ /* read the data */
+ spin_lock_irqsave(&adapter->lock, flags);
+- for (i = 0; i < MAX_PCB_DATA; i++) {
+- for (j = 0; j < 20000; j++) {
+- stat = get_status(dev->base_addr);
+- if (stat & ACRF)
+- break;
+- }
+- pcb->data.raw[i] = inb_command(dev->base_addr);
+- if ((stat & ASF_PCB_MASK) == ASF_PCB_END || j >= 20000)
+- break;
+- }
++ i = 0;
++ do {
++ j = 0;
++ while (((stat = get_status(dev->base_addr)) & ACRF) == 0 && j++ < 20000);
++ pcb->data.raw[i++] = inb_command(dev->base_addr);
++ if (i > MAX_PCB_DATA)
++ INVALID_PCB_MSG(i);
++ } while ((stat & ASF_PCB_MASK) != ASF_PCB_END && j < 20000);
+ spin_unlock_irqrestore(&adapter->lock, flags);
+- if (i >= MAX_PCB_DATA) {
+- INVALID_PCB_MSG(i);
+- return false;
+- }
+ if (j >= 20000) {
+ TIMEOUT_MSG(__LINE__);
+ return false;
+ }
+- /* the last "data" byte was really the length! */
+- total_length = pcb->data.raw[i];
++ /* woops, the last "data" byte was really the length! */
++ total_length = pcb->data.raw[--i];
+
+ /* safety check total length vs data length */
+ if (total_length != (pcb->length + 2)) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/3c509.c linux-2.6.29-rc3.owrt/drivers/net/3c509.c
+--- linux-2.6.29.owrt/drivers/net/3c509.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/3c509.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1475,7 +1475,6 @@
+ spin_lock_irqsave(&lp->lock, flags);
+
+ outw(PowerUp, ioaddr + EL3_CMD);
+- EL3WINDOW(0);
+ el3_up(dev);
+
+ if (netif_running(dev))
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/arm/etherh.c linux-2.6.29-rc3.owrt/drivers/net/arm/etherh.c
+--- linux-2.6.29.owrt/drivers/net/arm/etherh.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/arm/etherh.c 2009-05-10 23:48:28.000000000 +0200
+@@ -641,15 +641,15 @@
+ .ndo_open = etherh_open,
+ .ndo_stop = etherh_close,
+ .ndo_set_config = etherh_set_config,
+- .ndo_start_xmit = __ei_start_xmit,
+- .ndo_tx_timeout = __ei_tx_timeout,
+- .ndo_get_stats = __ei_get_stats,
+- .ndo_set_multicast_list = __ei_set_multicast_list,
++ .ndo_start_xmit = ei_start_xmit,
++ .ndo_tx_timeout = ei_tx_timeout,
++ .ndo_get_stats = ei_get_stats,
++ .ndo_set_multicast_list = ei_set_multicast_list,
+ .ndo_validate_addr = eth_validate_addr,
+- .ndo_set_mac_address = eth_mac_addr,
++ .ndo_set_mac_address = eth_set_mac_addr,
+ .ndo_change_mtu = eth_change_mtu,
+ #ifdef CONFIG_NET_POLL_CONTROLLER
+- .ndo_poll_controller = __ei_poll,
++ .ndo_poll_controller = ei_poll,
+ #endif
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/arm/ks8695net.c linux-2.6.29-rc3.owrt/drivers/net/arm/ks8695net.c
+--- linux-2.6.29.owrt/drivers/net/arm/ks8695net.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/arm/ks8695net.c 2009-05-10 23:48:28.000000000 +0200
+@@ -560,7 +560,7 @@
+ msleep(1);
+ }
+
+- if (reset_timeout < 0) {
++ if (reset_timeout == 0) {
+ dev_crit(ksp->dev,
+ "Timeout waiting for DMA engines to reset\n");
+ /* And blithely carry on */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/arm/Makefile linux-2.6.29-rc3.owrt/drivers/net/arm/Makefile
+--- linux-2.6.29.owrt/drivers/net/arm/Makefile 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/arm/Makefile 2009-05-10 23:48:28.000000000 +0200
+@@ -4,7 +4,7 @@
+ #
+
+ obj-$(CONFIG_ARM_AM79C961A) += am79c961a.o
+-obj-$(CONFIG_ARM_ETHERH) += etherh.o
++obj-$(CONFIG_ARM_ETHERH) += etherh.o ../8390.o
+ obj-$(CONFIG_ARM_ETHER3) += ether3.o
+ obj-$(CONFIG_ARM_ETHER1) += ether1.o
+ obj-$(CONFIG_ARM_AT91_ETHER) += at91_ether.o
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/atl1c/atl1c_ethtool.c linux-2.6.29-rc3.owrt/drivers/net/atl1c/atl1c_ethtool.c
+--- linux-2.6.29.owrt/drivers/net/atl1c/atl1c_ethtool.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/atl1c/atl1c_ethtool.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,317 +0,0 @@
+-/*
+- * Copyright(c) 2009 - 2009 Atheros Corporation. All rights reserved.
+- *
+- * Derived from Intel e1000 driver
+- * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
+- *
+- * This program is free software; you can redistribute it and/or modify it
+- * under the terms of the GNU General Public License as published by the Free
+- * Software Foundation; either version 2 of the License, or (at your option)
+- * any later version.
+- *
+- * This program is distributed in the hope that it will be useful, but WITHOUT
+- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+- * more details.
+- *
+- * You should have received a copy of the GNU General Public License along with
+- * this program; if not, write to the Free Software Foundation, Inc., 59
+- * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+- *
+- */
+-
+-#include <linux/netdevice.h>
+-#include <linux/ethtool.h>
+-
+-#include "atl1c.h"
+-
+-static int atl1c_get_settings(struct net_device *netdev,
+- struct ethtool_cmd *ecmd)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+- struct atl1c_hw *hw = &adapter->hw;
+-
+- ecmd->supported = (SUPPORTED_10baseT_Half |
+- SUPPORTED_10baseT_Full |
+- SUPPORTED_100baseT_Half |
+- SUPPORTED_100baseT_Full |
+- SUPPORTED_Autoneg |
+- SUPPORTED_TP);
+- if (hw->ctrl_flags & ATL1C_LINK_CAP_1000M)
+- ecmd->supported |= SUPPORTED_1000baseT_Full;
+-
+- ecmd->advertising = ADVERTISED_TP;
+-
+- ecmd->advertising |= hw->autoneg_advertised;
+-
+- ecmd->port = PORT_TP;
+- ecmd->phy_address = 0;
+- ecmd->transceiver = XCVR_INTERNAL;
+-
+- if (adapter->link_speed != SPEED_0) {
+- ecmd->speed = adapter->link_speed;
+- if (adapter->link_duplex == FULL_DUPLEX)
+- ecmd->duplex = DUPLEX_FULL;
+- else
+- ecmd->duplex = DUPLEX_HALF;
+- } else {
+- ecmd->speed = -1;
+- ecmd->duplex = -1;
+- }
+-
+- ecmd->autoneg = AUTONEG_ENABLE;
+- return 0;
+-}
+-
+-static int atl1c_set_settings(struct net_device *netdev,
+- struct ethtool_cmd *ecmd)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+- struct atl1c_hw *hw = &adapter->hw;
+- u16 autoneg_advertised;
+-
+- while (test_and_set_bit(__AT_RESETTING, &adapter->flags))
+- msleep(1);
+-
+- if (ecmd->autoneg == AUTONEG_ENABLE) {
+- autoneg_advertised = ADVERTISED_Autoneg;
+- } else {
+- if (ecmd->speed == SPEED_1000) {
+- if (ecmd->duplex != DUPLEX_FULL) {
+- if (netif_msg_link(adapter))
+- dev_warn(&adapter->pdev->dev,
+- "1000M half is invalid\n");
+- clear_bit(__AT_RESETTING, &adapter->flags);
+- return -EINVAL;
+- }
+- autoneg_advertised = ADVERTISED_1000baseT_Full;
+- } else if (ecmd->speed == SPEED_100) {
+- if (ecmd->duplex == DUPLEX_FULL)
+- autoneg_advertised = ADVERTISED_100baseT_Full;
+- else
+- autoneg_advertised = ADVERTISED_100baseT_Half;
+- } else {
+- if (ecmd->duplex == DUPLEX_FULL)
+- autoneg_advertised = ADVERTISED_10baseT_Full;
+- else
+- autoneg_advertised = ADVERTISED_10baseT_Half;
+- }
+- }
+-
+- if (hw->autoneg_advertised != autoneg_advertised) {
+- hw->autoneg_advertised = autoneg_advertised;
+- if (atl1c_restart_autoneg(hw) != 0) {
+- if (netif_msg_link(adapter))
+- dev_warn(&adapter->pdev->dev,
+- "ethtool speed/duplex setting failed\n");
+- clear_bit(__AT_RESETTING, &adapter->flags);
+- return -EINVAL;
+- }
+- }
+- clear_bit(__AT_RESETTING, &adapter->flags);
+- return 0;
+-}
+-
+-static u32 atl1c_get_tx_csum(struct net_device *netdev)
+-{
+- return (netdev->features & NETIF_F_HW_CSUM) != 0;
+-}
+-
+-static u32 atl1c_get_msglevel(struct net_device *netdev)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+- return adapter->msg_enable;
+-}
+-
+-static void atl1c_set_msglevel(struct net_device *netdev, u32 data)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+- adapter->msg_enable = data;
+-}
+-
+-static int atl1c_get_regs_len(struct net_device *netdev)
+-{
+- return AT_REGS_LEN;
+-}
+-
+-static void atl1c_get_regs(struct net_device *netdev,
+- struct ethtool_regs *regs, void *p)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+- struct atl1c_hw *hw = &adapter->hw;
+- u32 *regs_buff = p;
+- u16 phy_data;
+-
+- memset(p, 0, AT_REGS_LEN);
+-
+- regs->version = 0;
+- AT_READ_REG(hw, REG_VPD_CAP, p++);
+- AT_READ_REG(hw, REG_PM_CTRL, p++);
+- AT_READ_REG(hw, REG_MAC_HALF_DUPLX_CTRL, p++);
+- AT_READ_REG(hw, REG_TWSI_CTRL, p++);
+- AT_READ_REG(hw, REG_PCIE_DEV_MISC_CTRL, p++);
+- AT_READ_REG(hw, REG_MASTER_CTRL, p++);
+- AT_READ_REG(hw, REG_MANUAL_TIMER_INIT, p++);
+- AT_READ_REG(hw, REG_IRQ_MODRT_TIMER_INIT, p++);
+- AT_READ_REG(hw, REG_GPHY_CTRL, p++);
+- AT_READ_REG(hw, REG_LINK_CTRL, p++);
+- AT_READ_REG(hw, REG_IDLE_STATUS, p++);
+- AT_READ_REG(hw, REG_MDIO_CTRL, p++);
+- AT_READ_REG(hw, REG_SERDES_LOCK, p++);
+- AT_READ_REG(hw, REG_MAC_CTRL, p++);
+- AT_READ_REG(hw, REG_MAC_IPG_IFG, p++);
+- AT_READ_REG(hw, REG_MAC_STA_ADDR, p++);
+- AT_READ_REG(hw, REG_MAC_STA_ADDR+4, p++);
+- AT_READ_REG(hw, REG_RX_HASH_TABLE, p++);
+- AT_READ_REG(hw, REG_RX_HASH_TABLE+4, p++);
+- AT_READ_REG(hw, REG_RXQ_CTRL, p++);
+- AT_READ_REG(hw, REG_TXQ_CTRL, p++);
+- AT_READ_REG(hw, REG_MTU, p++);
+- AT_READ_REG(hw, REG_WOL_CTRL, p++);
+-
+- atl1c_read_phy_reg(hw, MII_BMCR, &phy_data);
+- regs_buff[73] = (u32) phy_data;
+- atl1c_read_phy_reg(hw, MII_BMSR, &phy_data);
+- regs_buff[74] = (u32) phy_data;
+-}
+-
+-static int atl1c_get_eeprom_len(struct net_device *netdev)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+-
+- if (atl1c_check_eeprom_exist(&adapter->hw))
+- return AT_EEPROM_LEN;
+- else
+- return 0;
+-}
+-
+-static int atl1c_get_eeprom(struct net_device *netdev,
+- struct ethtool_eeprom *eeprom, u8 *bytes)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+- struct atl1c_hw *hw = &adapter->hw;
+- u32 *eeprom_buff;
+- int first_dword, last_dword;
+- int ret_val = 0;
+- int i;
+-
+- if (eeprom->len == 0)
+- return -EINVAL;
+-
+- if (!atl1c_check_eeprom_exist(hw)) /* not exist */
+- return -EINVAL;
+-
+- eeprom->magic = adapter->pdev->vendor |
+- (adapter->pdev->device << 16);
+-
+- first_dword = eeprom->offset >> 2;
+- last_dword = (eeprom->offset + eeprom->len - 1) >> 2;
+-
+- eeprom_buff = kmalloc(sizeof(u32) *
+- (last_dword - first_dword + 1), GFP_KERNEL);
+- if (eeprom_buff == NULL)
+- return -ENOMEM;
+-
+- for (i = first_dword; i < last_dword; i++) {
+- if (!atl1c_read_eeprom(hw, i * 4, &(eeprom_buff[i-first_dword]))) {
+- kfree(eeprom_buff);
+- return -EIO;
+- }
+- }
+-
+- memcpy(bytes, (u8 *)eeprom_buff + (eeprom->offset & 3),
+- eeprom->len);
+- kfree(eeprom_buff);
+-
+- return ret_val;
+- return 0;
+-}
+-
+-static void atl1c_get_drvinfo(struct net_device *netdev,
+- struct ethtool_drvinfo *drvinfo)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+-
+- strncpy(drvinfo->driver, atl1c_driver_name, sizeof(drvinfo->driver));
+- strncpy(drvinfo->version, atl1c_driver_version,
+- sizeof(drvinfo->version));
+- strncpy(drvinfo->fw_version, "N/A", sizeof(drvinfo->fw_version));
+- strncpy(drvinfo->bus_info, pci_name(adapter->pdev),
+- sizeof(drvinfo->bus_info));
+- drvinfo->n_stats = 0;
+- drvinfo->testinfo_len = 0;
+- drvinfo->regdump_len = atl1c_get_regs_len(netdev);
+- drvinfo->eedump_len = atl1c_get_eeprom_len(netdev);
+-}
+-
+-static void atl1c_get_wol(struct net_device *netdev,
+- struct ethtool_wolinfo *wol)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+-
+- wol->supported = WAKE_MAGIC | WAKE_PHY;
+- wol->wolopts = 0;
+-
+- if (adapter->wol & AT_WUFC_EX)
+- wol->wolopts |= WAKE_UCAST;
+- if (adapter->wol & AT_WUFC_MC)
+- wol->wolopts |= WAKE_MCAST;
+- if (adapter->wol & AT_WUFC_BC)
+- wol->wolopts |= WAKE_BCAST;
+- if (adapter->wol & AT_WUFC_MAG)
+- wol->wolopts |= WAKE_MAGIC;
+- if (adapter->wol & AT_WUFC_LNKC)
+- wol->wolopts |= WAKE_PHY;
+-
+- return;
+-}
+-
+-static int atl1c_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+-
+- if (wol->wolopts & (WAKE_ARP | WAKE_MAGICSECURE |
+- WAKE_MCAST | WAKE_BCAST | WAKE_MCAST))
+- return -EOPNOTSUPP;
+- /* these settings will always override what we currently have */
+- adapter->wol = 0;
+-
+- if (wol->wolopts & WAKE_MAGIC)
+- adapter->wol |= AT_WUFC_MAG;
+- if (wol->wolopts & WAKE_PHY)
+- adapter->wol |= AT_WUFC_LNKC;
+-
+- return 0;
+-}
+-
+-static int atl1c_nway_reset(struct net_device *netdev)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+- if (netif_running(netdev))
+- atl1c_reinit_locked(adapter);
+- return 0;
+-}
+-
+-static struct ethtool_ops atl1c_ethtool_ops = {
+- .get_settings = atl1c_get_settings,
+- .set_settings = atl1c_set_settings,
+- .get_drvinfo = atl1c_get_drvinfo,
+- .get_regs_len = atl1c_get_regs_len,
+- .get_regs = atl1c_get_regs,
+- .get_wol = atl1c_get_wol,
+- .set_wol = atl1c_set_wol,
+- .get_msglevel = atl1c_get_msglevel,
+- .set_msglevel = atl1c_set_msglevel,
+- .nway_reset = atl1c_nway_reset,
+- .get_link = ethtool_op_get_link,
+- .get_eeprom_len = atl1c_get_eeprom_len,
+- .get_eeprom = atl1c_get_eeprom,
+- .get_tx_csum = atl1c_get_tx_csum,
+- .get_sg = ethtool_op_get_sg,
+- .set_sg = ethtool_op_set_sg,
+-};
+-
+-void atl1c_set_ethtool_ops(struct net_device *netdev)
+-{
+- SET_ETHTOOL_OPS(netdev, &atl1c_ethtool_ops);
+-}
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/atl1c/atl1c.h linux-2.6.29-rc3.owrt/drivers/net/atl1c/atl1c.h
+--- linux-2.6.29.owrt/drivers/net/atl1c/atl1c.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/atl1c/atl1c.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,606 +0,0 @@
+-/*
+- * Copyright(c) 2008 - 2009 Atheros Corporation. All rights reserved.
+- *
+- * Derived from Intel e1000 driver
+- * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
+- *
+- * This program is free software; you can redistribute it and/or modify it
+- * under the terms of the GNU General Public License as published by the Free
+- * Software Foundation; either version 2 of the License, or (at your option)
+- * any later version.
+- *
+- * This program is distributed in the hope that it will be useful, but WITHOUT
+- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+- * more details.
+- *
+- * You should have received a copy of the GNU General Public License along with
+- * this program; if not, write to the Free Software Foundation, Inc., 59
+- * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+- */
+-
+-#ifndef _ATL1C_H_
+-#define _ATL1C_H_
+-
+-#include <linux/version.h>
+-#include <linux/init.h>
+-#include <linux/types.h>
+-#include <linux/errno.h>
+-#include <linux/module.h>
+-#include <linux/pci.h>
+-#include <linux/netdevice.h>
+-#include <linux/etherdevice.h>
+-#include <linux/skbuff.h>
+-#include <linux/ioport.h>
+-#include <linux/slab.h>
+-#include <linux/list.h>
+-#include <linux/delay.h>
+-#include <linux/sched.h>
+-#include <linux/in.h>
+-#include <linux/ip.h>
+-#include <linux/ipv6.h>
+-#include <linux/udp.h>
+-#include <linux/mii.h>
+-#include <linux/io.h>
+-#include <linux/vmalloc.h>
+-#include <linux/pagemap.h>
+-#include <linux/tcp.h>
+-#include <linux/mii.h>
+-#include <linux/ethtool.h>
+-#include <linux/if_vlan.h>
+-#include <linux/workqueue.h>
+-#include <net/checksum.h>
+-#include <net/ip6_checksum.h>
+-
+-#include "atl1c_hw.h"
+-
+-/* Wake Up Filter Control */
+-#define AT_WUFC_LNKC 0x00000001 /* Link Status Change Wakeup Enable */
+-#define AT_WUFC_MAG 0x00000002 /* Magic Packet Wakeup Enable */
+-#define AT_WUFC_EX 0x00000004 /* Directed Exact Wakeup Enable */
+-#define AT_WUFC_MC 0x00000008 /* Multicast Wakeup Enable */
+-#define AT_WUFC_BC 0x00000010 /* Broadcast Wakeup Enable */
+-
+-#define AT_VLAN_TO_TAG(_vlan, _tag) \
+- _tag = ((((_vlan) >> 8) & 0xFF) |\
+- (((_vlan) & 0xFF) << 8))
+-
+-#define AT_TAG_TO_VLAN(_tag, _vlan) \
+- _vlan = ((((_tag) >> 8) & 0xFF) |\
+- (((_tag) & 0xFF) << 8))
+-
+-#define SPEED_0 0xffff
+-#define HALF_DUPLEX 1
+-#define FULL_DUPLEX 2
+-
+-#define AT_RX_BUF_SIZE (ETH_FRAME_LEN + VLAN_HLEN + ETH_FCS_LEN)
+-#define MAX_JUMBO_FRAME_SIZE (9*1024)
+-#define MAX_TX_OFFLOAD_THRESH (9*1024)
+-
+-#define AT_MAX_RECEIVE_QUEUE 4
+-#define AT_DEF_RECEIVE_QUEUE 1
+-#define AT_MAX_TRANSMIT_QUEUE 2
+-
+-#define AT_DMA_HI_ADDR_MASK 0xffffffff00000000ULL
+-#define AT_DMA_LO_ADDR_MASK 0x00000000ffffffffULL
+-
+-#define AT_TX_WATCHDOG (5 * HZ)
+-#define AT_MAX_INT_WORK 5
+-#define AT_TWSI_EEPROM_TIMEOUT 100
+-#define AT_HW_MAX_IDLE_DELAY 10
+-#define AT_SUSPEND_LINK_TIMEOUT 28
+-
+-#define AT_ASPM_L0S_TIMER 6
+-#define AT_ASPM_L1_TIMER 12
+-
+-#define ATL1C_PCIE_L0S_L1_DISABLE 0x01
+-#define ATL1C_PCIE_PHY_RESET 0x02
+-
+-#define ATL1C_ASPM_L0s_ENABLE 0x0001
+-#define ATL1C_ASPM_L1_ENABLE 0x0002
+-
+-#define AT_REGS_LEN (75 * sizeof(u32))
+-#define AT_EEPROM_LEN 512
+-
+-#define ATL1C_GET_DESC(R, i, type) (&(((type *)((R)->desc))[i]))
+-#define ATL1C_RFD_DESC(R, i) ATL1C_GET_DESC(R, i, struct atl1c_rx_free_desc)
+-#define ATL1C_TPD_DESC(R, i) ATL1C_GET_DESC(R, i, struct atl1c_tpd_desc)
+-#define ATL1C_RRD_DESC(R, i) ATL1C_GET_DESC(R, i, struct atl1c_recv_ret_status)
+-
+-/* tpd word 1 bit 0:7 General Checksum task offload */
+-#define TPD_L4HDR_OFFSET_MASK 0x00FF
+-#define TPD_L4HDR_OFFSET_SHIFT 0
+-
+-/* tpd word 1 bit 0:7 Large Send task offload (IPv4/IPV6) */
+-#define TPD_TCPHDR_OFFSET_MASK 0x00FF
+-#define TPD_TCPHDR_OFFSET_SHIFT 0
+-
+-/* tpd word 1 bit 0:7 Custom Checksum task offload */
+-#define TPD_PLOADOFFSET_MASK 0x00FF
+-#define TPD_PLOADOFFSET_SHIFT 0
+-
+-/* tpd word 1 bit 8:17 */
+-#define TPD_CCSUM_EN_MASK 0x0001
+-#define TPD_CCSUM_EN_SHIFT 8
+-#define TPD_IP_CSUM_MASK 0x0001
+-#define TPD_IP_CSUM_SHIFT 9
+-#define TPD_TCP_CSUM_MASK 0x0001
+-#define TPD_TCP_CSUM_SHIFT 10
+-#define TPD_UDP_CSUM_MASK 0x0001
+-#define TPD_UDP_CSUM_SHIFT 11
+-#define TPD_LSO_EN_MASK 0x0001 /* TCP Large Send Offload */
+-#define TPD_LSO_EN_SHIFT 12
+-#define TPD_LSO_VER_MASK 0x0001
+-#define TPD_LSO_VER_SHIFT 13 /* 0 : ipv4; 1 : ipv4/ipv6 */
+-#define TPD_CON_VTAG_MASK 0x0001
+-#define TPD_CON_VTAG_SHIFT 14
+-#define TPD_INS_VTAG_MASK 0x0001
+-#define TPD_INS_VTAG_SHIFT 15
+-#define TPD_IPV4_PACKET_MASK 0x0001 /* valid when LSO VER is 1 */
+-#define TPD_IPV4_PACKET_SHIFT 16
+-#define TPD_ETH_TYPE_MASK 0x0001
+-#define TPD_ETH_TYPE_SHIFT 17 /* 0 : 802.3 frame; 1 : Ethernet */
+-
+-/* tpd word 18:25 Custom Checksum task offload */
+-#define TPD_CCSUM_OFFSET_MASK 0x00FF
+-#define TPD_CCSUM_OFFSET_SHIFT 18
+-#define TPD_CCSUM_EPAD_MASK 0x0001
+-#define TPD_CCSUM_EPAD_SHIFT 30
+-
+-/* tpd word 18:30 Large Send task offload (IPv4/IPV6) */
+-#define TPD_MSS_MASK 0x1FFF
+-#define TPD_MSS_SHIFT 18
+-
+-#define TPD_EOP_MASK 0x0001
+-#define TPD_EOP_SHIFT 31
+-
+-struct atl1c_tpd_desc {
+- __le16 buffer_len; /* include 4-byte CRC */
+- __le16 vlan_tag;
+- __le32 word1;
+- __le64 buffer_addr;
+-};
+-
+-struct atl1c_tpd_ext_desc {
+- u32 reservd_0;
+- __le32 word1;
+- __le32 pkt_len;
+- u32 reservd_1;
+-};
+-/* rrs word 0 bit 0:31 */
+-#define RRS_RX_CSUM_MASK 0xFFFF
+-#define RRS_RX_CSUM_SHIFT 0
+-#define RRS_RX_RFD_CNT_MASK 0x000F
+-#define RRS_RX_RFD_CNT_SHIFT 16
+-#define RRS_RX_RFD_INDEX_MASK 0x0FFF
+-#define RRS_RX_RFD_INDEX_SHIFT 20
+-
+-/* rrs flag bit 0:16 */
+-#define RRS_HEAD_LEN_MASK 0x00FF
+-#define RRS_HEAD_LEN_SHIFT 0
+-#define RRS_HDS_TYPE_MASK 0x0003
+-#define RRS_HDS_TYPE_SHIFT 8
+-#define RRS_CPU_NUM_MASK 0x0003
+-#define RRS_CPU_NUM_SHIFT 10
+-#define RRS_HASH_FLG_MASK 0x000F
+-#define RRS_HASH_FLG_SHIFT 12
+-
+-#define RRS_HDS_TYPE_HEAD 1
+-#define RRS_HDS_TYPE_DATA 2
+-
+-#define RRS_IS_NO_HDS_TYPE(flag) \
+- (((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK == 0)
+-
+-#define RRS_IS_HDS_HEAD(flag) \
+- (((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK == \
+- RRS_HDS_TYPE_HEAD)
+-
+-#define RRS_IS_HDS_DATA(flag) \
+- (((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK == \
+- RRS_HDS_TYPE_DATA)
+-
+-/* rrs word 3 bit 0:31 */
+-#define RRS_PKT_SIZE_MASK 0x3FFF
+-#define RRS_PKT_SIZE_SHIFT 0
+-#define RRS_ERR_L4_CSUM_MASK 0x0001
+-#define RRS_ERR_L4_CSUM_SHIFT 14
+-#define RRS_ERR_IP_CSUM_MASK 0x0001
+-#define RRS_ERR_IP_CSUM_SHIFT 15
+-#define RRS_VLAN_INS_MASK 0x0001
+-#define RRS_VLAN_INS_SHIFT 16
+-#define RRS_PROT_ID_MASK 0x0007
+-#define RRS_PROT_ID_SHIFT 17
+-#define RRS_RX_ERR_SUM_MASK 0x0001
+-#define RRS_RX_ERR_SUM_SHIFT 20
+-#define RRS_RX_ERR_CRC_MASK 0x0001
+-#define RRS_RX_ERR_CRC_SHIFT 21
+-#define RRS_RX_ERR_FAE_MASK 0x0001
+-#define RRS_RX_ERR_FAE_SHIFT 22
+-#define RRS_RX_ERR_TRUNC_MASK 0x0001
+-#define RRS_RX_ERR_TRUNC_SHIFT 23
+-#define RRS_RX_ERR_RUNC_MASK 0x0001
+-#define RRS_RX_ERR_RUNC_SHIFT 24
+-#define RRS_RX_ERR_ICMP_MASK 0x0001
+-#define RRS_RX_ERR_ICMP_SHIFT 25
+-#define RRS_PACKET_BCAST_MASK 0x0001
+-#define RRS_PACKET_BCAST_SHIFT 26
+-#define RRS_PACKET_MCAST_MASK 0x0001
+-#define RRS_PACKET_MCAST_SHIFT 27
+-#define RRS_PACKET_TYPE_MASK 0x0001
+-#define RRS_PACKET_TYPE_SHIFT 28
+-#define RRS_FIFO_FULL_MASK 0x0001
+-#define RRS_FIFO_FULL_SHIFT 29
+-#define RRS_802_3_LEN_ERR_MASK 0x0001
+-#define RRS_802_3_LEN_ERR_SHIFT 30
+-#define RRS_RXD_UPDATED_MASK 0x0001
+-#define RRS_RXD_UPDATED_SHIFT 31
+-
+-#define RRS_ERR_L4_CSUM 0x00004000
+-#define RRS_ERR_IP_CSUM 0x00008000
+-#define RRS_VLAN_INS 0x00010000
+-#define RRS_RX_ERR_SUM 0x00100000
+-#define RRS_RX_ERR_CRC 0x00200000
+-#define RRS_802_3_LEN_ERR 0x40000000
+-#define RRS_RXD_UPDATED 0x80000000
+-
+-#define RRS_PACKET_TYPE_802_3 1
+-#define RRS_PACKET_TYPE_ETH 0
+-#define RRS_PACKET_IS_ETH(word) \
+- (((word) >> RRS_PACKET_TYPE_SHIFT) & RRS_PACKET_TYPE_MASK == \
+- RRS_PACKET_TYPE_ETH)
+-#define RRS_RXD_IS_VALID(word) \
+- ((((word) >> RRS_RXD_UPDATED_SHIFT) & RRS_RXD_UPDATED_MASK) == 1)
+-
+-#define RRS_PACKET_PROT_IS_IPV4_ONLY(word) \
+- ((((word) >> RRS_PROT_ID_SHIFT) & RRS_PROT_ID_MASK) == 1)
+-#define RRS_PACKET_PROT_IS_IPV6_ONLY(word) \
+- ((((word) >> RRS_PROT_ID_SHIFT) & RRS_PROT_ID_MASK) == 6)
+-
+-struct atl1c_recv_ret_status {
+- __le32 word0;
+- __le32 rss_hash;
+- __le16 vlan_tag;
+- __le16 flag;
+- __le32 word3;
+-};
+-
+-/* RFD desciptor */
+-struct atl1c_rx_free_desc {
+- __le64 buffer_addr;
+-};
+-
+-/* DMA Order Settings */
+-enum atl1c_dma_order {
+- atl1c_dma_ord_in = 1,
+- atl1c_dma_ord_enh = 2,
+- atl1c_dma_ord_out = 4
+-};
+-
+-enum atl1c_dma_rcb {
+- atl1c_rcb_64 = 0,
+- atl1c_rcb_128 = 1
+-};
+-
+-enum atl1c_mac_speed {
+- atl1c_mac_speed_0 = 0,
+- atl1c_mac_speed_10_100 = 1,
+- atl1c_mac_speed_1000 = 2
+-};
+-
+-enum atl1c_dma_req_block {
+- atl1c_dma_req_128 = 0,
+- atl1c_dma_req_256 = 1,
+- atl1c_dma_req_512 = 2,
+- atl1c_dma_req_1024 = 3,
+- atl1c_dma_req_2048 = 4,
+- atl1c_dma_req_4096 = 5
+-};
+-
+-enum atl1c_rss_mode {
+- atl1c_rss_mode_disable = 0,
+- atl1c_rss_sig_que = 1,
+- atl1c_rss_mul_que_sig_int = 2,
+- atl1c_rss_mul_que_mul_int = 4,
+-};
+-
+-enum atl1c_rss_type {
+- atl1c_rss_disable = 0,
+- atl1c_rss_ipv4 = 1,
+- atl1c_rss_ipv4_tcp = 2,
+- atl1c_rss_ipv6 = 4,
+- atl1c_rss_ipv6_tcp = 8
+-};
+-
+-enum atl1c_nic_type {
+- athr_l1c = 0,
+- athr_l2c = 1,
+-};
+-
+-enum atl1c_trans_queue {
+- atl1c_trans_normal = 0,
+- atl1c_trans_high = 1
+-};
+-
+-struct atl1c_hw_stats {
+- /* rx */
+- unsigned long rx_ok; /* The number of good packet received. */
+- unsigned long rx_bcast; /* The number of good broadcast packet received. */
+- unsigned long rx_mcast; /* The number of good multicast packet received. */
+- unsigned long rx_pause; /* The number of Pause packet received. */
+- unsigned long rx_ctrl; /* The number of Control packet received other than Pause frame. */
+- unsigned long rx_fcs_err; /* The number of packets with bad FCS. */
+- unsigned long rx_len_err; /* The number of packets with mismatch of length field and actual size. */
+- unsigned long rx_byte_cnt; /* The number of bytes of good packet received. FCS is NOT included. */
+- unsigned long rx_runt; /* The number of packets received that are less than 64 byte long and with good FCS. */
+- unsigned long rx_frag; /* The number of packets received that are less than 64 byte long and with bad FCS. */
+- unsigned long rx_sz_64; /* The number of good and bad packets received that are 64 byte long. */
+- unsigned long rx_sz_65_127; /* The number of good and bad packets received that are between 65 and 127-byte long. */
+- unsigned long rx_sz_128_255; /* The number of good and bad packets received that are between 128 and 255-byte long. */
+- unsigned long rx_sz_256_511; /* The number of good and bad packets received that are between 256 and 511-byte long. */
+- unsigned long rx_sz_512_1023; /* The number of good and bad packets received that are between 512 and 1023-byte long. */
+- unsigned long rx_sz_1024_1518; /* The number of good and bad packets received that are between 1024 and 1518-byte long. */
+- unsigned long rx_sz_1519_max; /* The number of good and bad packets received that are between 1519-byte and MTU. */
+- unsigned long rx_sz_ov; /* The number of good and bad packets received that are more than MTU size truncated by Selene. */
+- unsigned long rx_rxf_ov; /* The number of frame dropped due to occurrence of RX FIFO overflow. */
+- unsigned long rx_rrd_ov; /* The number of frame dropped due to occurrence of RRD overflow. */
+- unsigned long rx_align_err; /* Alignment Error */
+- unsigned long rx_bcast_byte_cnt; /* The byte count of broadcast packet received, excluding FCS. */
+- unsigned long rx_mcast_byte_cnt; /* The byte count of multicast packet received, excluding FCS. */
+- unsigned long rx_err_addr; /* The number of packets dropped due to address filtering. */
+-
+- /* tx */
+- unsigned long tx_ok; /* The number of good packet transmitted. */
+- unsigned long tx_bcast; /* The number of good broadcast packet transmitted. */
+- unsigned long tx_mcast; /* The number of good multicast packet transmitted. */
+- unsigned long tx_pause; /* The number of Pause packet transmitted. */
+- unsigned long tx_exc_defer; /* The number of packets transmitted with excessive deferral. */
+- unsigned long tx_ctrl; /* The number of packets transmitted is a control frame, excluding Pause frame. */
+- unsigned long tx_defer; /* The number of packets transmitted that is deferred. */
+- unsigned long tx_byte_cnt; /* The number of bytes of data transmitted. FCS is NOT included. */
+- unsigned long tx_sz_64; /* The number of good and bad packets transmitted that are 64 byte long. */
+- unsigned long tx_sz_65_127; /* The number of good and bad packets transmitted that are between 65 and 127-byte long. */
+- unsigned long tx_sz_128_255; /* The number of good and bad packets transmitted that are between 128 and 255-byte long. */
+- unsigned long tx_sz_256_511; /* The number of good and bad packets transmitted that are between 256 and 511-byte long. */
+- unsigned long tx_sz_512_1023; /* The number of good and bad packets transmitted that are between 512 and 1023-byte long. */
+- unsigned long tx_sz_1024_1518; /* The number of good and bad packets transmitted that are between 1024 and 1518-byte long. */
+- unsigned long tx_sz_1519_max; /* The number of good and bad packets transmitted that are between 1519-byte and MTU. */
+- unsigned long tx_1_col; /* The number of packets subsequently transmitted successfully with a single prior collision. */
+- unsigned long tx_2_col; /* The number of packets subsequently transmitted successfully with multiple prior collisions. */
+- unsigned long tx_late_col; /* The number of packets transmitted with late collisions. */
+- unsigned long tx_abort_col; /* The number of transmit packets aborted due to excessive collisions. */
+- unsigned long tx_underrun; /* The number of transmit packets aborted due to transmit FIFO underrun, or TRD FIFO underrun */
+- unsigned long tx_rd_eop; /* The number of times that read beyond the EOP into the next frame area when TRD was not written timely */
+- unsigned long tx_len_err; /* The number of transmit packets with length field does NOT match the actual frame size. */
+- unsigned long tx_trunc; /* The number of transmit packets truncated due to size exceeding MTU. */
+- unsigned long tx_bcast_byte; /* The byte count of broadcast packet transmitted, excluding FCS. */
+- unsigned long tx_mcast_byte; /* The byte count of multicast packet transmitted, excluding FCS. */
+-};
+-
+-struct atl1c_hw {
+- u8 __iomem *hw_addr; /* inner register address */
+- struct atl1c_adapter *adapter;
+- enum atl1c_nic_type nic_type;
+- enum atl1c_dma_order dma_order;
+- enum atl1c_dma_rcb rcb_value;
+- enum atl1c_dma_req_block dmar_block;
+- enum atl1c_dma_req_block dmaw_block;
+-
+- u16 device_id;
+- u16 vendor_id;
+- u16 subsystem_id;
+- u16 subsystem_vendor_id;
+- u8 revision_id;
+-
+- u32 intr_mask;
+- u8 dmaw_dly_cnt;
+- u8 dmar_dly_cnt;
+-
+- u8 preamble_len;
+- u16 max_frame_size;
+- u16 min_frame_size;
+-
+- enum atl1c_mac_speed mac_speed;
+- bool mac_duplex;
+- bool hibernate;
+- u16 media_type;
+-#define MEDIA_TYPE_AUTO_SENSOR 0
+-#define MEDIA_TYPE_100M_FULL 1
+-#define MEDIA_TYPE_100M_HALF 2
+-#define MEDIA_TYPE_10M_FULL 3
+-#define MEDIA_TYPE_10M_HALF 4
+-
+- u16 autoneg_advertised;
+- u16 mii_autoneg_adv_reg;
+- u16 mii_1000t_ctrl_reg;
+-
+- u16 tx_imt; /* TX Interrupt Moderator timer ( 2us resolution) */
+- u16 rx_imt; /* RX Interrupt Moderator timer ( 2us resolution) */
+- u16 ict; /* Interrupt Clear timer (2us resolution) */
+- u16 ctrl_flags;
+-#define ATL1C_INTR_CLEAR_ON_READ 0x0001
+-#define ATL1C_INTR_MODRT_ENABLE 0x0002
+-#define ATL1C_CMB_ENABLE 0x0004
+-#define ATL1C_SMB_ENABLE 0x0010
+-#define ATL1C_TXQ_MODE_ENHANCE 0x0020
+-#define ATL1C_RX_IPV6_CHKSUM 0x0040
+-#define ATL1C_ASPM_L0S_SUPPORT 0x0080
+-#define ATL1C_ASPM_L1_SUPPORT 0x0100
+-#define ATL1C_ASPM_CTRL_MON 0x0200
+-#define ATL1C_HIB_DISABLE 0x0400
+-#define ATL1C_LINK_CAP_1000M 0x0800
+-#define ATL1C_FPGA_VERSION 0x8000
+- u16 cmb_tpd;
+- u16 cmb_rrd;
+- u16 cmb_rx_timer; /* 2us resolution */
+- u16 cmb_tx_timer;
+- u32 smb_timer;
+-
+- u16 rrd_thresh; /* Threshold of number of RRD produced to trigger
+- interrupt request */
+- u16 tpd_thresh;
+- u8 tpd_burst; /* Number of TPD to prefetch in cache-aligned burst. */
+- u8 rfd_burst;
+- enum atl1c_rss_type rss_type;
+- enum atl1c_rss_mode rss_mode;
+- u8 rss_hash_bits;
+- u32 base_cpu;
+- u32 indirect_tab;
+- u8 mac_addr[ETH_ALEN];
+- u8 perm_mac_addr[ETH_ALEN];
+-
+- bool phy_configured;
+- bool re_autoneg;
+- bool emi_ca;
+-};
+-
+-/*
+- * atl1c_ring_header represents a single, contiguous block of DMA space
+- * mapped for the three descriptor rings (tpd, rfd, rrd) and the two
+- * message blocks (cmb, smb) described below
+- */
+-struct atl1c_ring_header {
+- void *desc; /* virtual address */
+- dma_addr_t dma; /* physical address*/
+- unsigned int size; /* length in bytes */
+-};
+-
+-/*
+- * atl1c_buffer is wrapper around a pointer to a socket buffer
+- * so a DMA handle can be stored along with the skb
+- */
+-struct atl1c_buffer {
+- struct sk_buff *skb; /* socket buffer */
+- u16 length; /* rx buffer length */
+- u16 state; /* state of buffer */
+-#define ATL1_BUFFER_FREE 0
+-#define ATL1_BUFFER_BUSY 1
+- dma_addr_t dma;
+-};
+-
+-/* transimit packet descriptor (tpd) ring */
+-struct atl1c_tpd_ring {
+- void *desc; /* descriptor ring virtual address */
+- dma_addr_t dma; /* descriptor ring physical address */
+- u16 size; /* descriptor ring length in bytes */
+- u16 count; /* number of descriptors in the ring */
+- u16 next_to_use; /* this is protectd by adapter->tx_lock */
+- atomic_t next_to_clean;
+- struct atl1c_buffer *buffer_info;
+-};
+-
+-/* receive free descriptor (rfd) ring */
+-struct atl1c_rfd_ring {
+- void *desc; /* descriptor ring virtual address */
+- dma_addr_t dma; /* descriptor ring physical address */
+- u16 size; /* descriptor ring length in bytes */
+- u16 count; /* number of descriptors in the ring */
+- u16 next_to_use;
+- u16 next_to_clean;
+- struct atl1c_buffer *buffer_info;
+-};
+-
+-/* receive return desciptor (rrd) ring */
+-struct atl1c_rrd_ring {
+- void *desc; /* descriptor ring virtual address */
+- dma_addr_t dma; /* descriptor ring physical address */
+- u16 size; /* descriptor ring length in bytes */
+- u16 count; /* number of descriptors in the ring */
+- u16 next_to_use;
+- u16 next_to_clean;
+-};
+-
+-struct atl1c_cmb {
+- void *cmb;
+- dma_addr_t dma;
+-};
+-
+-struct atl1c_smb {
+- void *smb;
+- dma_addr_t dma;
+-};
+-
+-/* board specific private data structure */
+-struct atl1c_adapter {
+- struct net_device *netdev;
+- struct pci_dev *pdev;
+- struct vlan_group *vlgrp;
+- struct napi_struct napi;
+- struct atl1c_hw hw;
+- struct atl1c_hw_stats hw_stats;
+- struct net_device_stats net_stats;
+- struct mii_if_info mii; /* MII interface info */
+- u16 rx_buffer_len;
+-
+- unsigned long flags;
+-#define __AT_TESTING 0x0001
+-#define __AT_RESETTING 0x0002
+-#define __AT_DOWN 0x0003
+- u32 msg_enable;
+-
+- bool have_msi;
+- u32 wol;
+- u16 link_speed;
+- u16 link_duplex;
+-
+- spinlock_t mdio_lock;
+- spinlock_t tx_lock;
+- atomic_t irq_sem;
+-
+- struct work_struct reset_task;
+- struct work_struct link_chg_task;
+- struct timer_list watchdog_timer;
+- struct timer_list phy_config_timer;
+-
+- /* All Descriptor memory */
+- struct atl1c_ring_header ring_header;
+- struct atl1c_tpd_ring tpd_ring[AT_MAX_TRANSMIT_QUEUE];
+- struct atl1c_rfd_ring rfd_ring[AT_MAX_RECEIVE_QUEUE];
+- struct atl1c_rrd_ring rrd_ring[AT_MAX_RECEIVE_QUEUE];
+- struct atl1c_cmb cmb;
+- struct atl1c_smb smb;
+- int num_rx_queues;
+- u32 bd_number; /* board number;*/
+-};
+-
+-#define AT_WRITE_REG(a, reg, value) ( \
+- writel((value), ((a)->hw_addr + reg)))
+-
+-#define AT_WRITE_FLUSH(a) (\
+- readl((a)->hw_addr))
+-
+-#define AT_READ_REG(a, reg, pdata) do { \
+- if (unlikely((a)->hibernate)) { \
+- readl((a)->hw_addr + reg); \
+- *(u32 *)pdata = readl((a)->hw_addr + reg); \
+- } else { \
+- *(u32 *)pdata = readl((a)->hw_addr + reg); \
+- } \
+- } while (0)
+-
+-#define AT_WRITE_REGB(a, reg, value) (\
+- writeb((value), ((a)->hw_addr + reg)))
+-
+-#define AT_READ_REGB(a, reg) (\
+- readb((a)->hw_addr + reg))
+-
+-#define AT_WRITE_REGW(a, reg, value) (\
+- writew((value), ((a)->hw_addr + reg)))
+-
+-#define AT_READ_REGW(a, reg) (\
+- readw((a)->hw_addr + reg))
+-
+-#define AT_WRITE_REG_ARRAY(a, reg, offset, value) ( \
+- writel((value), (((a)->hw_addr + reg) + ((offset) << 2))))
+-
+-#define AT_READ_REG_ARRAY(a, reg, offset) ( \
+- readl(((a)->hw_addr + reg) + ((offset) << 2)))
+-
+-extern char atl1c_driver_name[];
+-extern char atl1c_driver_version[];
+-
+-extern int atl1c_up(struct atl1c_adapter *adapter);
+-extern void atl1c_down(struct atl1c_adapter *adapter);
+-extern void atl1c_reinit_locked(struct atl1c_adapter *adapter);
+-extern s32 atl1c_reset_hw(struct atl1c_hw *hw);
+-extern void atl1c_set_ethtool_ops(struct net_device *netdev);
+-#endif /* _ATL1C_H_ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/atl1c/atl1c_hw.c linux-2.6.29-rc3.owrt/drivers/net/atl1c/atl1c_hw.c
+--- linux-2.6.29.owrt/drivers/net/atl1c/atl1c_hw.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/atl1c/atl1c_hw.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,527 +0,0 @@
+-/*
+- * Copyright(c) 2007 Atheros Corporation. All rights reserved.
+- *
+- * Derived from Intel e1000 driver
+- * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
+- *
+- * This program is free software; you can redistribute it and/or modify it
+- * under the terms of the GNU General Public License as published by the Free
+- * Software Foundation; either version 2 of the License, or (at your option)
+- * any later version.
+- *
+- * This program is distributed in the hope that it will be useful, but WITHOUT
+- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+- * more details.
+- *
+- * You should have received a copy of the GNU General Public License along with
+- * this program; if not, write to the Free Software Foundation, Inc., 59
+- * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+- */
+-#include <linux/pci.h>
+-#include <linux/delay.h>
+-#include <linux/mii.h>
+-#include <linux/crc32.h>
+-
+-#include "atl1c.h"
+-
+-/*
+- * check_eeprom_exist
+- * return 1 if eeprom exist
+- */
+-int atl1c_check_eeprom_exist(struct atl1c_hw *hw)
+-{
+- u32 data;
+-
+- AT_READ_REG(hw, REG_TWSI_DEBUG, &data);
+- if (data & TWSI_DEBUG_DEV_EXIST)
+- return 1;
+-
+- return 0;
+-}
+-
+-void atl1c_hw_set_mac_addr(struct atl1c_hw *hw)
+-{
+- u32 value;
+- /*
+- * 00-0B-6A-F6-00-DC
+- * 0: 6AF600DC 1: 000B
+- * low dword
+- */
+- value = (((u32)hw->mac_addr[2]) << 24) |
+- (((u32)hw->mac_addr[3]) << 16) |
+- (((u32)hw->mac_addr[4]) << 8) |
+- (((u32)hw->mac_addr[5])) ;
+- AT_WRITE_REG_ARRAY(hw, REG_MAC_STA_ADDR, 0, value);
+- /* hight dword */
+- value = (((u32)hw->mac_addr[0]) << 8) |
+- (((u32)hw->mac_addr[1])) ;
+- AT_WRITE_REG_ARRAY(hw, REG_MAC_STA_ADDR, 1, value);
+-}
+-
+-/*
+- * atl1c_get_permanent_address
+- * return 0 if get valid mac address,
+- */
+-static int atl1c_get_permanent_address(struct atl1c_hw *hw)
+-{
+- u32 addr[2];
+- u32 i;
+- u32 otp_ctrl_data;
+- u32 twsi_ctrl_data;
+- u8 eth_addr[ETH_ALEN];
+-
+- /* init */
+- addr[0] = addr[1] = 0;
+- AT_READ_REG(hw, REG_OTP_CTRL, &otp_ctrl_data);
+- if (atl1c_check_eeprom_exist(hw)) {
+- /* Enable OTP CLK */
+- if (!(otp_ctrl_data & OTP_CTRL_CLK_EN)) {
+- otp_ctrl_data |= OTP_CTRL_CLK_EN;
+- AT_WRITE_REG(hw, REG_OTP_CTRL, otp_ctrl_data);
+- AT_WRITE_FLUSH(hw);
+- msleep(1);
+- }
+-
+- AT_READ_REG(hw, REG_TWSI_CTRL, &twsi_ctrl_data);
+- twsi_ctrl_data |= TWSI_CTRL_SW_LDSTART;
+- AT_WRITE_REG(hw, REG_TWSI_CTRL, twsi_ctrl_data);
+- for (i = 0; i < AT_TWSI_EEPROM_TIMEOUT; i++) {
+- msleep(10);
+- AT_READ_REG(hw, REG_TWSI_CTRL, &twsi_ctrl_data);
+- if ((twsi_ctrl_data & TWSI_CTRL_SW_LDSTART) == 0)
+- break;
+- }
+- if (i >= AT_TWSI_EEPROM_TIMEOUT)
+- return -1;
+- }
+- /* Disable OTP_CLK */
+- if (otp_ctrl_data & OTP_CTRL_CLK_EN) {
+- otp_ctrl_data &= ~OTP_CTRL_CLK_EN;
+- AT_WRITE_REG(hw, REG_OTP_CTRL, otp_ctrl_data);
+- AT_WRITE_FLUSH(hw);
+- msleep(1);
+- }
+-
+- /* maybe MAC-address is from BIOS */
+- AT_READ_REG(hw, REG_MAC_STA_ADDR, &addr[0]);
+- AT_READ_REG(hw, REG_MAC_STA_ADDR + 4, &addr[1]);
+- *(u32 *) &eth_addr[2] = swab32(addr[0]);
+- *(u16 *) &eth_addr[0] = swab16(*(u16 *)&addr[1]);
+-
+- if (is_valid_ether_addr(eth_addr)) {
+- memcpy(hw->perm_mac_addr, eth_addr, ETH_ALEN);
+- return 0;
+- }
+-
+- return -1;
+-}
+-
+-bool atl1c_read_eeprom(struct atl1c_hw *hw, u32 offset, u32 *p_value)
+-{
+- int i;
+- int ret = false;
+- u32 otp_ctrl_data;
+- u32 control;
+- u32 data;
+-
+- if (offset & 3)
+- return ret; /* address do not align */
+-
+- AT_READ_REG(hw, REG_OTP_CTRL, &otp_ctrl_data);
+- if (!(otp_ctrl_data & OTP_CTRL_CLK_EN))
+- AT_WRITE_REG(hw, REG_OTP_CTRL,
+- (otp_ctrl_data | OTP_CTRL_CLK_EN));
+-
+- AT_WRITE_REG(hw, REG_EEPROM_DATA_LO, 0);
+- control = (offset & EEPROM_CTRL_ADDR_MASK) << EEPROM_CTRL_ADDR_SHIFT;
+- AT_WRITE_REG(hw, REG_EEPROM_CTRL, control);
+-
+- for (i = 0; i < 10; i++) {
+- udelay(100);
+- AT_READ_REG(hw, REG_EEPROM_CTRL, &control);
+- if (control & EEPROM_CTRL_RW)
+- break;
+- }
+- if (control & EEPROM_CTRL_RW) {
+- AT_READ_REG(hw, REG_EEPROM_CTRL, &data);
+- AT_READ_REG(hw, REG_EEPROM_DATA_LO, p_value);
+- data = data & 0xFFFF;
+- *p_value = swab32((data << 16) | (*p_value >> 16));
+- ret = true;
+- }
+- if (!(otp_ctrl_data & OTP_CTRL_CLK_EN))
+- AT_WRITE_REG(hw, REG_OTP_CTRL, otp_ctrl_data);
+-
+- return ret;
+-}
+-/*
+- * Reads the adapter's MAC address from the EEPROM
+- *
+- * hw - Struct containing variables accessed by shared code
+- */
+-int atl1c_read_mac_addr(struct atl1c_hw *hw)
+-{
+- int err = 0;
+-
+- err = atl1c_get_permanent_address(hw);
+- if (err)
+- random_ether_addr(hw->perm_mac_addr);
+-
+- memcpy(hw->mac_addr, hw->perm_mac_addr, sizeof(hw->perm_mac_addr));
+- return 0;
+-}
+-
+-/*
+- * atl1c_hash_mc_addr
+- * purpose
+- * set hash value for a multicast address
+- * hash calcu processing :
+- * 1. calcu 32bit CRC for multicast address
+- * 2. reverse crc with MSB to LSB
+- */
+-u32 atl1c_hash_mc_addr(struct atl1c_hw *hw, u8 *mc_addr)
+-{
+- u32 crc32;
+- u32 value = 0;
+- int i;
+-
+- crc32 = ether_crc_le(6, mc_addr);
+- for (i = 0; i < 32; i++)
+- value |= (((crc32 >> i) & 1) << (31 - i));
+-
+- return value;
+-}
+-
+-/*
+- * Sets the bit in the multicast table corresponding to the hash value.
+- * hw - Struct containing variables accessed by shared code
+- * hash_value - Multicast address hash value
+- */
+-void atl1c_hash_set(struct atl1c_hw *hw, u32 hash_value)
+-{
+- u32 hash_bit, hash_reg;
+- u32 mta;
+-
+- /*
+- * The HASH Table is a register array of 2 32-bit registers.
+- * It is treated like an array of 64 bits. We want to set
+- * bit BitArray[hash_value]. So we figure out what register
+- * the bit is in, read it, OR in the new bit, then write
+- * back the new value. The register is determined by the
+- * upper bit of the hash value and the bit within that
+- * register are determined by the lower 5 bits of the value.
+- */
+- hash_reg = (hash_value >> 31) & 0x1;
+- hash_bit = (hash_value >> 26) & 0x1F;
+-
+- mta = AT_READ_REG_ARRAY(hw, REG_RX_HASH_TABLE, hash_reg);
+-
+- mta |= (1 << hash_bit);
+-
+- AT_WRITE_REG_ARRAY(hw, REG_RX_HASH_TABLE, hash_reg, mta);
+-}
+-
+-/*
+- * Reads the value from a PHY register
+- * hw - Struct containing variables accessed by shared code
+- * reg_addr - address of the PHY register to read
+- */
+-int atl1c_read_phy_reg(struct atl1c_hw *hw, u16 reg_addr, u16 *phy_data)
+-{
+- u32 val;
+- int i;
+-
+- val = ((u32)(reg_addr & MDIO_REG_ADDR_MASK)) << MDIO_REG_ADDR_SHIFT |
+- MDIO_START | MDIO_SUP_PREAMBLE | MDIO_RW |
+- MDIO_CLK_25_4 << MDIO_CLK_SEL_SHIFT;
+-
+- AT_WRITE_REG(hw, REG_MDIO_CTRL, val);
+-
+- for (i = 0; i < MDIO_WAIT_TIMES; i++) {
+- udelay(2);
+- AT_READ_REG(hw, REG_MDIO_CTRL, &val);
+- if (!(val & (MDIO_START | MDIO_BUSY)))
+- break;
+- }
+- if (!(val & (MDIO_START | MDIO_BUSY))) {
+- *phy_data = (u16)val;
+- return 0;
+- }
+-
+- return -1;
+-}
+-
+-/*
+- * Writes a value to a PHY register
+- * hw - Struct containing variables accessed by shared code
+- * reg_addr - address of the PHY register to write
+- * data - data to write to the PHY
+- */
+-int atl1c_write_phy_reg(struct atl1c_hw *hw, u32 reg_addr, u16 phy_data)
+-{
+- int i;
+- u32 val;
+-
+- val = ((u32)(phy_data & MDIO_DATA_MASK)) << MDIO_DATA_SHIFT |
+- (reg_addr & MDIO_REG_ADDR_MASK) << MDIO_REG_ADDR_SHIFT |
+- MDIO_SUP_PREAMBLE | MDIO_START |
+- MDIO_CLK_25_4 << MDIO_CLK_SEL_SHIFT;
+-
+- AT_WRITE_REG(hw, REG_MDIO_CTRL, val);
+-
+- for (i = 0; i < MDIO_WAIT_TIMES; i++) {
+- udelay(2);
+- AT_READ_REG(hw, REG_MDIO_CTRL, &val);
+- if (!(val & (MDIO_START | MDIO_BUSY)))
+- break;
+- }
+-
+- if (!(val & (MDIO_START | MDIO_BUSY)))
+- return 0;
+-
+- return -1;
+-}
+-
+-/*
+- * Configures PHY autoneg and flow control advertisement settings
+- *
+- * hw - Struct containing variables accessed by shared code
+- */
+-static int atl1c_phy_setup_adv(struct atl1c_hw *hw)
+-{
+- u16 mii_adv_data = ADVERTISE_DEFAULT_CAP & ~ADVERTISE_SPEED_MASK;
+- u16 mii_giga_ctrl_data = GIGA_CR_1000T_DEFAULT_CAP &
+- ~GIGA_CR_1000T_SPEED_MASK;
+-
+- if (hw->autoneg_advertised & ADVERTISED_10baseT_Half)
+- mii_adv_data |= ADVERTISE_10HALF;
+- if (hw->autoneg_advertised & ADVERTISED_10baseT_Full)
+- mii_adv_data |= ADVERTISE_10FULL;
+- if (hw->autoneg_advertised & ADVERTISED_100baseT_Half)
+- mii_adv_data |= ADVERTISE_100HALF;
+- if (hw->autoneg_advertised & ADVERTISED_100baseT_Full)
+- mii_adv_data |= ADVERTISE_100FULL;
+-
+- if (hw->autoneg_advertised & ADVERTISED_Autoneg)
+- mii_adv_data |= ADVERTISE_10HALF | ADVERTISE_10FULL |
+- ADVERTISE_100HALF | ADVERTISE_100FULL;
+-
+- if (hw->ctrl_flags & ATL1C_LINK_CAP_1000M) {
+- if (hw->autoneg_advertised & ADVERTISED_1000baseT_Half)
+- mii_giga_ctrl_data |= ADVERTISE_1000HALF;
+- if (hw->autoneg_advertised & ADVERTISED_1000baseT_Full)
+- mii_giga_ctrl_data |= ADVERTISE_1000FULL;
+- if (hw->autoneg_advertised & ADVERTISED_Autoneg)
+- mii_giga_ctrl_data |= ADVERTISE_1000HALF |
+- ADVERTISE_1000FULL;
+- }
+-
+- if (atl1c_write_phy_reg(hw, MII_ADVERTISE, mii_adv_data) != 0 ||
+- atl1c_write_phy_reg(hw, MII_GIGA_CR, mii_giga_ctrl_data) != 0)
+- return -1;
+- return 0;
+-}
+-
+-void atl1c_phy_disable(struct atl1c_hw *hw)
+-{
+- AT_WRITE_REGW(hw, REG_GPHY_CTRL,
+- GPHY_CTRL_PW_WOL_DIS | GPHY_CTRL_EXT_RESET);
+-}
+-
+-static void atl1c_phy_magic_data(struct atl1c_hw *hw)
+-{
+- u16 data;
+-
+- data = ANA_LOOP_SEL_10BT | ANA_EN_MASK_TB | ANA_EN_10BT_IDLE |
+- ((1 & ANA_INTERVAL_SEL_TIMER_MASK) <<
+- ANA_INTERVAL_SEL_TIMER_SHIFT);
+-
+- atl1c_write_phy_reg(hw, MII_DBG_ADDR, MII_ANA_CTRL_18);
+- atl1c_write_phy_reg(hw, MII_DBG_DATA, data);
+-
+- data = (2 & ANA_SERDES_CDR_BW_MASK) | ANA_MS_PAD_DBG |
+- ANA_SERDES_EN_DEEM | ANA_SERDES_SEL_HSP | ANA_SERDES_EN_PLL |
+- ANA_SERDES_EN_LCKDT;
+-
+- atl1c_write_phy_reg(hw, MII_DBG_ADDR, MII_ANA_CTRL_5);
+- atl1c_write_phy_reg(hw, MII_DBG_DATA, data);
+-
+- data = (44 & ANA_LONG_CABLE_TH_100_MASK) |
+- ((33 & ANA_SHORT_CABLE_TH_100_MASK) <<
+- ANA_SHORT_CABLE_TH_100_SHIFT) | ANA_BP_BAD_LINK_ACCUM |
+- ANA_BP_SMALL_BW;
+-
+- atl1c_write_phy_reg(hw, MII_DBG_ADDR, MII_ANA_CTRL_54);
+- atl1c_write_phy_reg(hw, MII_DBG_DATA, data);
+-
+- data = (11 & ANA_IECHO_ADJ_MASK) | ((11 & ANA_IECHO_ADJ_MASK) <<
+- ANA_IECHO_ADJ_2_SHIFT) | ((8 & ANA_IECHO_ADJ_MASK) <<
+- ANA_IECHO_ADJ_1_SHIFT) | ((8 & ANA_IECHO_ADJ_MASK) <<
+- ANA_IECHO_ADJ_0_SHIFT);
+-
+- atl1c_write_phy_reg(hw, MII_DBG_ADDR, MII_ANA_CTRL_4);
+- atl1c_write_phy_reg(hw, MII_DBG_DATA, data);
+-
+- data = ANA_RESTART_CAL | ((7 & ANA_MANUL_SWICH_ON_MASK) <<
+- ANA_MANUL_SWICH_ON_SHIFT) | ANA_MAN_ENABLE |
+- ANA_SEL_HSP | ANA_EN_HB | ANA_OEN_125M;
+-
+- atl1c_write_phy_reg(hw, MII_DBG_ADDR, MII_ANA_CTRL_0);
+- atl1c_write_phy_reg(hw, MII_DBG_DATA, data);
+-
+- if (hw->ctrl_flags & ATL1C_HIB_DISABLE) {
+- atl1c_write_phy_reg(hw, MII_DBG_ADDR, MII_ANA_CTRL_41);
+- if (atl1c_read_phy_reg(hw, MII_DBG_DATA, &data) != 0)
+- return;
+- data &= ~ANA_TOP_PS_EN;
+- atl1c_write_phy_reg(hw, MII_DBG_DATA, data);
+-
+- atl1c_write_phy_reg(hw, MII_DBG_ADDR, MII_ANA_CTRL_11);
+- if (atl1c_read_phy_reg(hw, MII_DBG_DATA, &data) != 0)
+- return;
+- data &= ~ANA_PS_HIB_EN;
+- atl1c_write_phy_reg(hw, MII_DBG_DATA, data);
+- }
+-}
+-
+-int atl1c_phy_reset(struct atl1c_hw *hw)
+-{
+- struct atl1c_adapter *adapter = hw->adapter;
+- struct pci_dev *pdev = adapter->pdev;
+- u32 phy_ctrl_data = GPHY_CTRL_DEFAULT;
+- u32 mii_ier_data = IER_LINK_UP | IER_LINK_DOWN;
+- int err;
+-
+- if (hw->ctrl_flags & ATL1C_HIB_DISABLE)
+- phy_ctrl_data &= ~GPHY_CTRL_HIB_EN;
+-
+- AT_WRITE_REG(hw, REG_GPHY_CTRL, phy_ctrl_data);
+- AT_WRITE_FLUSH(hw);
+- msleep(40);
+- phy_ctrl_data |= GPHY_CTRL_EXT_RESET;
+- AT_WRITE_REG(hw, REG_GPHY_CTRL, phy_ctrl_data);
+- AT_WRITE_FLUSH(hw);
+- msleep(10);
+-
+- /*Enable PHY LinkChange Interrupt */
+- err = atl1c_write_phy_reg(hw, MII_IER, mii_ier_data);
+- if (err) {
+- if (netif_msg_hw(adapter))
+- dev_err(&pdev->dev,
+- "Error enable PHY linkChange Interrupt\n");
+- return err;
+- }
+- if (!(hw->ctrl_flags & ATL1C_FPGA_VERSION))
+- atl1c_phy_magic_data(hw);
+- return 0;
+-}
+-
+-int atl1c_phy_init(struct atl1c_hw *hw)
+-{
+- struct atl1c_adapter *adapter = (struct atl1c_adapter *)hw->adapter;
+- struct pci_dev *pdev = adapter->pdev;
+- int ret_val;
+- u16 mii_bmcr_data = BMCR_RESET;
+- u16 phy_id1, phy_id2;
+-
+- if ((atl1c_read_phy_reg(hw, MII_PHYSID1, &phy_id1) != 0) ||
+- (atl1c_read_phy_reg(hw, MII_PHYSID2, &phy_id2) != 0)) {
+- if (netif_msg_link(adapter))
+- dev_err(&pdev->dev, "Error get phy ID\n");
+- return -1;
+- }
+- switch (hw->media_type) {
+- case MEDIA_TYPE_AUTO_SENSOR:
+- ret_val = atl1c_phy_setup_adv(hw);
+- if (ret_val) {
+- if (netif_msg_link(adapter))
+- dev_err(&pdev->dev,
+- "Error Setting up Auto-Negotiation\n");
+- return ret_val;
+- }
+- mii_bmcr_data |= BMCR_AUTO_NEG_EN | BMCR_RESTART_AUTO_NEG;
+- break;
+- case MEDIA_TYPE_100M_FULL:
+- mii_bmcr_data |= BMCR_SPEED_100 | BMCR_FULL_DUPLEX;
+- break;
+- case MEDIA_TYPE_100M_HALF:
+- mii_bmcr_data |= BMCR_SPEED_100;
+- break;
+- case MEDIA_TYPE_10M_FULL:
+- mii_bmcr_data |= BMCR_SPEED_10 | BMCR_FULL_DUPLEX;
+- break;
+- case MEDIA_TYPE_10M_HALF:
+- mii_bmcr_data |= BMCR_SPEED_10;
+- break;
+- default:
+- if (netif_msg_link(adapter))
+- dev_err(&pdev->dev, "Wrong Media type %d\n",
+- hw->media_type);
+- return -1;
+- break;
+- }
+-
+- ret_val = atl1c_write_phy_reg(hw, MII_BMCR, mii_bmcr_data);
+- if (ret_val)
+- return ret_val;
+- hw->phy_configured = true;
+-
+- return 0;
+-}
+-
+-/*
+- * Detects the current speed and duplex settings of the hardware.
+- *
+- * hw - Struct containing variables accessed by shared code
+- * speed - Speed of the connection
+- * duplex - Duplex setting of the connection
+- */
+-int atl1c_get_speed_and_duplex(struct atl1c_hw *hw, u16 *speed, u16 *duplex)
+-{
+- int err;
+- u16 phy_data;
+-
+- /* Read PHY Specific Status Register (17) */
+- err = atl1c_read_phy_reg(hw, MII_GIGA_PSSR, &phy_data);
+- if (err)
+- return err;
+-
+- if (!(phy_data & GIGA_PSSR_SPD_DPLX_RESOLVED))
+- return -1;
+-
+- switch (phy_data & GIGA_PSSR_SPEED) {
+- case GIGA_PSSR_1000MBS:
+- *speed = SPEED_1000;
+- break;
+- case GIGA_PSSR_100MBS:
+- *speed = SPEED_100;
+- break;
+- case GIGA_PSSR_10MBS:
+- *speed = SPEED_10;
+- break;
+- default:
+- return -1;
+- break;
+- }
+-
+- if (phy_data & GIGA_PSSR_DPLX)
+- *duplex = FULL_DUPLEX;
+- else
+- *duplex = HALF_DUPLEX;
+-
+- return 0;
+-}
+-
+-int atl1c_restart_autoneg(struct atl1c_hw *hw)
+-{
+- int err = 0;
+- u16 mii_bmcr_data = BMCR_RESET;
+-
+- err = atl1c_phy_setup_adv(hw);
+- if (err)
+- return err;
+- mii_bmcr_data |= BMCR_AUTO_NEG_EN | BMCR_RESTART_AUTO_NEG;
+-
+- return atl1c_write_phy_reg(hw, MII_BMCR, mii_bmcr_data);
+-}
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/atl1c/atl1c_hw.h linux-2.6.29-rc3.owrt/drivers/net/atl1c/atl1c_hw.h
+--- linux-2.6.29.owrt/drivers/net/atl1c/atl1c_hw.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/atl1c/atl1c_hw.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,859 +0,0 @@
+-/*
+- * Copyright(c) 2008 - 2009 Atheros Corporation. All rights reserved.
+- *
+- * Derived from Intel e1000 driver
+- * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
+- *
+- * This program is free software; you can redistribute it and/or modify it
+- * under the terms of the GNU General Public License as published by the Free
+- * Software Foundation; either version 2 of the License, or (at your option)
+- * any later version.
+- *
+- * This program is distributed in the hope that it will be useful, but WITHOUT
+- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+- * more details.
+- *
+- * You should have received a copy of the GNU General Public License along with
+- * this program; if not, write to the Free Software Foundation, Inc., 59
+- * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+- */
+-
+-#ifndef _ATL1C_HW_H_
+-#define _ATL1C_HW_H_
+-
+-#include <linux/types.h>
+-#include <linux/mii.h>
+-
+-struct atl1c_adapter;
+-struct atl1c_hw;
+-
+-/* function prototype */
+-void atl1c_phy_disable(struct atl1c_hw *hw);
+-void atl1c_hw_set_mac_addr(struct atl1c_hw *hw);
+-int atl1c_phy_reset(struct atl1c_hw *hw);
+-int atl1c_read_mac_addr(struct atl1c_hw *hw);
+-int atl1c_get_speed_and_duplex(struct atl1c_hw *hw, u16 *speed, u16 *duplex);
+-u32 atl1c_hash_mc_addr(struct atl1c_hw *hw, u8 *mc_addr);
+-void atl1c_hash_set(struct atl1c_hw *hw, u32 hash_value);
+-int atl1c_read_phy_reg(struct atl1c_hw *hw, u16 reg_addr, u16 *phy_data);
+-int atl1c_write_phy_reg(struct atl1c_hw *hw, u32 reg_addr, u16 phy_data);
+-bool atl1c_read_eeprom(struct atl1c_hw *hw, u32 offset, u32 *p_value);
+-int atl1c_phy_init(struct atl1c_hw *hw);
+-int atl1c_check_eeprom_exist(struct atl1c_hw *hw);
+-int atl1c_restart_autoneg(struct atl1c_hw *hw);
+-
+-/* register definition */
+-#define REG_DEVICE_CAP 0x5C
+-#define DEVICE_CAP_MAX_PAYLOAD_MASK 0x7
+-#define DEVICE_CAP_MAX_PAYLOAD_SHIFT 0
+-
+-#define REG_DEVICE_CTRL 0x60
+-#define DEVICE_CTRL_MAX_PAYLOAD_MASK 0x7
+-#define DEVICE_CTRL_MAX_PAYLOAD_SHIFT 5
+-#define DEVICE_CTRL_MAX_RREQ_SZ_MASK 0x7
+-#define DEVICE_CTRL_MAX_RREQ_SZ_SHIFT 12
+-
+-#define REG_LINK_CTRL 0x68
+-#define LINK_CTRL_L0S_EN 0x01
+-#define LINK_CTRL_L1_EN 0x02
+-
+-#define REG_VPD_CAP 0x6C
+-#define VPD_CAP_ID_MASK 0xff
+-#define VPD_CAP_ID_SHIFT 0
+-#define VPD_CAP_NEXT_PTR_MASK 0xFF
+-#define VPD_CAP_NEXT_PTR_SHIFT 8
+-#define VPD_CAP_VPD_ADDR_MASK 0x7FFF
+-#define VPD_CAP_VPD_ADDR_SHIFT 16
+-#define VPD_CAP_VPD_FLAG 0x80000000
+-
+-#define REG_VPD_DATA 0x70
+-
+-#define REG_PCIE_UC_SEVERITY 0x10C
+-#define PCIE_UC_SERVRITY_TRN 0x00000001
+-#define PCIE_UC_SERVRITY_DLP 0x00000010
+-#define PCIE_UC_SERVRITY_PSN_TLP 0x00001000
+-#define PCIE_UC_SERVRITY_FCP 0x00002000
+-#define PCIE_UC_SERVRITY_CPL_TO 0x00004000
+-#define PCIE_UC_SERVRITY_CA 0x00008000
+-#define PCIE_UC_SERVRITY_UC 0x00010000
+-#define PCIE_UC_SERVRITY_ROV 0x00020000
+-#define PCIE_UC_SERVRITY_MLFP 0x00040000
+-#define PCIE_UC_SERVRITY_ECRC 0x00080000
+-#define PCIE_UC_SERVRITY_UR 0x00100000
+-
+-#define REG_DEV_SERIALNUM_CTRL 0x200
+-#define REG_DEV_MAC_SEL_MASK 0x0 /* 0:EUI; 1:MAC */
+-#define REG_DEV_MAC_SEL_SHIFT 0
+-#define REG_DEV_SERIAL_NUM_EN_MASK 0x1
+-#define REG_DEV_SERIAL_NUM_EN_SHIFT 1
+-
+-#define REG_TWSI_CTRL 0x218
+-#define TWSI_CTRL_LD_OFFSET_MASK 0xFF
+-#define TWSI_CTRL_LD_OFFSET_SHIFT 0
+-#define TWSI_CTRL_LD_SLV_ADDR_MASK 0x7
+-#define TWSI_CTRL_LD_SLV_ADDR_SHIFT 8
+-#define TWSI_CTRL_SW_LDSTART 0x800
+-#define TWSI_CTRL_HW_LDSTART 0x1000
+-#define TWSI_CTRL_SMB_SLV_ADDR_MASK 0x7F
+-#define TWSI_CTRL_SMB_SLV_ADDR_SHIFT 15
+-#define TWSI_CTRL_LD_EXIST 0x400000
+-#define TWSI_CTRL_READ_FREQ_SEL_MASK 0x3
+-#define TWSI_CTRL_READ_FREQ_SEL_SHIFT 23
+-#define TWSI_CTRL_FREQ_SEL_100K 0
+-#define TWSI_CTRL_FREQ_SEL_200K 1
+-#define TWSI_CTRL_FREQ_SEL_300K 2
+-#define TWSI_CTRL_FREQ_SEL_400K 3
+-#define TWSI_CTRL_SMB_SLV_ADDR
+-#define TWSI_CTRL_WRITE_FREQ_SEL_MASK 0x3
+-#define TWSI_CTRL_WRITE_FREQ_SEL_SHIFT 24
+-
+-
+-#define REG_PCIE_DEV_MISC_CTRL 0x21C
+-#define PCIE_DEV_MISC_EXT_PIPE 0x2
+-#define PCIE_DEV_MISC_RETRY_BUFDIS 0x1
+-#define PCIE_DEV_MISC_SPIROM_EXIST 0x4
+-#define PCIE_DEV_MISC_SERDES_ENDIAN 0x8
+-#define PCIE_DEV_MISC_SERDES_SEL_DIN 0x10
+-
+-#define REG_PCIE_PHYMISC 0x1000
+-#define PCIE_PHYMISC_FORCE_RCV_DET 0x4
+-
+-#define REG_TWSI_DEBUG 0x1108
+-#define TWSI_DEBUG_DEV_EXIST 0x20000000
+-
+-#define REG_EEPROM_CTRL 0x12C0
+-#define EEPROM_CTRL_DATA_HI_MASK 0xFFFF
+-#define EEPROM_CTRL_DATA_HI_SHIFT 0
+-#define EEPROM_CTRL_ADDR_MASK 0x3FF
+-#define EEPROM_CTRL_ADDR_SHIFT 16
+-#define EEPROM_CTRL_ACK 0x40000000
+-#define EEPROM_CTRL_RW 0x80000000
+-
+-#define REG_EEPROM_DATA_LO 0x12C4
+-
+-#define REG_OTP_CTRL 0x12F0
+-#define OTP_CTRL_CLK_EN 0x0002
+-
+-#define REG_PM_CTRL 0x12F8
+-#define PM_CTRL_SDES_EN 0x00000001
+-#define PM_CTRL_RBER_EN 0x00000002
+-#define PM_CTRL_CLK_REQ_EN 0x00000004
+-#define PM_CTRL_ASPM_L1_EN 0x00000008
+-#define PM_CTRL_SERDES_L1_EN 0x00000010
+-#define PM_CTRL_SERDES_PLL_L1_EN 0x00000020
+-#define PM_CTRL_SERDES_PD_EX_L1 0x00000040
+-#define PM_CTRL_SERDES_BUDS_RX_L1_EN 0x00000080
+-#define PM_CTRL_L0S_ENTRY_TIMER_MASK 0xF
+-#define PM_CTRL_L0S_ENTRY_TIMER_SHIFT 8
+-#define PM_CTRL_ASPM_L0S_EN 0x00001000
+-#define PM_CTRL_CLK_SWH_L1 0x00002000
+-#define PM_CTRL_CLK_PWM_VER1_1 0x00004000
+-#define PM_CTRL_PCIE_RECV 0x00008000
+-#define PM_CTRL_L1_ENTRY_TIMER_MASK 0xF
+-#define PM_CTRL_L1_ENTRY_TIMER_SHIFT 16
+-#define PM_CTRL_PM_REQ_TIMER_MASK 0xF
+-#define PM_CTRL_PM_REQ_TIMER_SHIFT 20
+-#define PM_CTRL_LCKDET_TIMER_MASK 0x3F
+-#define PM_CTRL_LCKDET_TIMER_SHIFT 24
+-#define PM_CTRL_MAC_ASPM_CHK 0x40000000
+-#define PM_CTRL_HOTRST 0x80000000
+-
+-/* Selene Master Control Register */
+-#define REG_MASTER_CTRL 0x1400
+-#define MASTER_CTRL_SOFT_RST 0x1
+-#define MASTER_CTRL_TEST_MODE_MASK 0x3
+-#define MASTER_CTRL_TEST_MODE_SHIFT 2
+-#define MASTER_CTRL_BERT_START 0x10
+-#define MASTER_CTRL_MTIMER_EN 0x100
+-#define MASTER_CTRL_MANUAL_INT 0x200
+-#define MASTER_CTRL_TX_ITIMER_EN 0x400
+-#define MASTER_CTRL_RX_ITIMER_EN 0x800
+-#define MASTER_CTRL_CLK_SEL_DIS 0x1000
+-#define MASTER_CTRL_CLK_SWH_MODE 0x2000
+-#define MASTER_CTRL_INT_RDCLR 0x4000
+-#define MASTER_CTRL_REV_NUM_SHIFT 16
+-#define MASTER_CTRL_REV_NUM_MASK 0xff
+-#define MASTER_CTRL_DEV_ID_SHIFT 24
+-#define MASTER_CTRL_DEV_ID_MASK 0x7f
+-#define MASTER_CTRL_OTP_SEL 0x80000000
+-
+-/* Timer Initial Value Register */
+-#define REG_MANUAL_TIMER_INIT 0x1404
+-
+-/* IRQ ModeratorTimer Initial Value Register */
+-#define REG_IRQ_MODRT_TIMER_INIT 0x1408
+-#define IRQ_MODRT_TIMER_MASK 0xffff
+-#define IRQ_MODRT_TX_TIMER_SHIFT 0
+-#define IRQ_MODRT_RX_TIMER_SHIFT 16
+-
+-#define REG_GPHY_CTRL 0x140C
+-#define GPHY_CTRL_EXT_RESET 0x1
+-#define GPHY_CTRL_RTL_MODE 0x2
+-#define GPHY_CTRL_LED_MODE 0x4
+-#define GPHY_CTRL_ANEG_NOW 0x8
+-#define GPHY_CTRL_REV_ANEG 0x10
+-#define GPHY_CTRL_GATE_25M_EN 0x20
+-#define GPHY_CTRL_LPW_EXIT 0x40
+-#define GPHY_CTRL_PHY_IDDQ 0x80
+-#define GPHY_CTRL_PHY_IDDQ_DIS 0x100
+-#define GPHY_CTRL_GIGA_DIS 0x200
+-#define GPHY_CTRL_HIB_EN 0x400
+-#define GPHY_CTRL_HIB_PULSE 0x800
+-#define GPHY_CTRL_SEL_ANA_RST 0x1000
+-#define GPHY_CTRL_PHY_PLL_ON 0x2000
+-#define GPHY_CTRL_PWDOWN_HW 0x4000
+-#define GPHY_CTRL_PHY_PLL_BYPASS 0x8000
+-
+-#define GPHY_CTRL_DEFAULT ( \
+- GPHY_CTRL_SEL_ANA_RST |\
+- GPHY_CTRL_HIB_PULSE |\
+- GPHY_CTRL_HIB_EN)
+-
+-#define GPHY_CTRL_PW_WOL_DIS ( \
+- GPHY_CTRL_SEL_ANA_RST |\
+- GPHY_CTRL_HIB_PULSE |\
+- GPHY_CTRL_HIB_EN |\
+- GPHY_CTRL_PWDOWN_HW |\
+- GPHY_CTRL_PHY_IDDQ)
+-
+-/* Block IDLE Status Register */
+-#define REG_IDLE_STATUS 0x1410
+-#define IDLE_STATUS_MASK 0x00FF
+-#define IDLE_STATUS_RXMAC_NO_IDLE 0x1
+-#define IDLE_STATUS_TXMAC_NO_IDLE 0x2
+-#define IDLE_STATUS_RXQ_NO_IDLE 0x4
+-#define IDLE_STATUS_TXQ_NO_IDLE 0x8
+-#define IDLE_STATUS_DMAR_NO_IDLE 0x10
+-#define IDLE_STATUS_DMAW_NO_IDLE 0x20
+-#define IDLE_STATUS_SMB_NO_IDLE 0x40
+-#define IDLE_STATUS_CMB_NO_IDLE 0x80
+-
+-/* MDIO Control Register */
+-#define REG_MDIO_CTRL 0x1414
+-#define MDIO_DATA_MASK 0xffff /* On MDIO write, the 16-bit
+- * control data to write to PHY
+- * MII management register */
+-#define MDIO_DATA_SHIFT 0 /* On MDIO read, the 16-bit
+- * status data that was read
+- * from the PHY MII management register */
+-#define MDIO_REG_ADDR_MASK 0x1f /* MDIO register address */
+-#define MDIO_REG_ADDR_SHIFT 16
+-#define MDIO_RW 0x200000 /* 1: read, 0: write */
+-#define MDIO_SUP_PREAMBLE 0x400000 /* Suppress preamble */
+-#define MDIO_START 0x800000 /* Write 1 to initiate the MDIO
+- * master. And this bit is self
+- * cleared after one cycle */
+-#define MDIO_CLK_SEL_SHIFT 24
+-#define MDIO_CLK_25_4 0
+-#define MDIO_CLK_25_6 2
+-#define MDIO_CLK_25_8 3
+-#define MDIO_CLK_25_10 4
+-#define MDIO_CLK_25_14 5
+-#define MDIO_CLK_25_20 6
+-#define MDIO_CLK_25_28 7
+-#define MDIO_BUSY 0x8000000
+-#define MDIO_AP_EN 0x10000000
+-#define MDIO_WAIT_TIMES 10
+-
+-/* MII PHY Status Register */
+-#define REG_PHY_STATUS 0x1418
+-#define PHY_GENERAL_STATUS_MASK 0xFFFF
+-#define PHY_STATUS_RECV_ENABLE 0x0001
+-#define PHY_OE_PWSP_STATUS_MASK 0x07FF
+-#define PHY_OE_PWSP_STATUS_SHIFT 16
+-#define PHY_STATUS_LPW_STATE 0x80000000
+-/* BIST Control and Status Register0 (for the Packet Memory) */
+-#define REG_BIST0_CTRL 0x141c
+-#define BIST0_NOW 0x1
+-#define BIST0_SRAM_FAIL 0x2 /* 1: The SRAM failure is
+- * un-repairable because
+- * it has address decoder
+- * failure or more than 1 cell
+- * stuck-to-x failure */
+-#define BIST0_FUSE_FLAG 0x4
+-
+-/* BIST Control and Status Register1(for the retry buffer of PCI Express) */
+-#define REG_BIST1_CTRL 0x1420
+-#define BIST1_NOW 0x1
+-#define BIST1_SRAM_FAIL 0x2
+-#define BIST1_FUSE_FLAG 0x4
+-
+-/* SerDes Lock Detect Control and Status Register */
+-#define REG_SERDES_LOCK 0x1424
+-#define SERDES_LOCK_DETECT 0x1 /* SerDes lock detected. This signal
+- * comes from Analog SerDes */
+-#define SERDES_LOCK_DETECT_EN 0x2 /* 1: Enable SerDes Lock detect function */
+-
+-/* MAC Control Register */
+-#define REG_MAC_CTRL 0x1480
+-#define MAC_CTRL_TX_EN 0x1
+-#define MAC_CTRL_RX_EN 0x2
+-#define MAC_CTRL_TX_FLOW 0x4
+-#define MAC_CTRL_RX_FLOW 0x8
+-#define MAC_CTRL_LOOPBACK 0x10
+-#define MAC_CTRL_DUPLX 0x20
+-#define MAC_CTRL_ADD_CRC 0x40
+-#define MAC_CTRL_PAD 0x80
+-#define MAC_CTRL_LENCHK 0x100
+-#define MAC_CTRL_HUGE_EN 0x200
+-#define MAC_CTRL_PRMLEN_SHIFT 10
+-#define MAC_CTRL_PRMLEN_MASK 0xf
+-#define MAC_CTRL_RMV_VLAN 0x4000
+-#define MAC_CTRL_PROMIS_EN 0x8000
+-#define MAC_CTRL_TX_PAUSE 0x10000
+-#define MAC_CTRL_SCNT 0x20000
+-#define MAC_CTRL_SRST_TX 0x40000
+-#define MAC_CTRL_TX_SIMURST 0x80000
+-#define MAC_CTRL_SPEED_SHIFT 20
+-#define MAC_CTRL_SPEED_MASK 0x3
+-#define MAC_CTRL_DBG_TX_BKPRESURE 0x400000
+-#define MAC_CTRL_TX_HUGE 0x800000
+-#define MAC_CTRL_RX_CHKSUM_EN 0x1000000
+-#define MAC_CTRL_MC_ALL_EN 0x2000000
+-#define MAC_CTRL_BC_EN 0x4000000
+-#define MAC_CTRL_DBG 0x8000000
+-#define MAC_CTRL_SINGLE_PAUSE_EN 0x10000000
+-
+-/* MAC IPG/IFG Control Register */
+-#define REG_MAC_IPG_IFG 0x1484
+-#define MAC_IPG_IFG_IPGT_SHIFT 0 /* Desired back to back
+- * inter-packet gap. The
+- * default is 96-bit time */
+-#define MAC_IPG_IFG_IPGT_MASK 0x7f
+-#define MAC_IPG_IFG_MIFG_SHIFT 8 /* Minimum number of IFG to
+- * enforce in between RX frames */
+-#define MAC_IPG_IFG_MIFG_MASK 0xff /* Frame gap below such IFP is dropped */
+-#define MAC_IPG_IFG_IPGR1_SHIFT 16 /* 64bit Carrier-Sense window */
+-#define MAC_IPG_IFG_IPGR1_MASK 0x7f
+-#define MAC_IPG_IFG_IPGR2_SHIFT 24 /* 96-bit IPG window */
+-#define MAC_IPG_IFG_IPGR2_MASK 0x7f
+-
+-/* MAC STATION ADDRESS */
+-#define REG_MAC_STA_ADDR 0x1488
+-
+-/* Hash table for multicast address */
+-#define REG_RX_HASH_TABLE 0x1490
+-
+-/* MAC Half-Duplex Control Register */
+-#define REG_MAC_HALF_DUPLX_CTRL 0x1498
+-#define MAC_HALF_DUPLX_CTRL_LCOL_SHIFT 0 /* Collision Window */
+-#define MAC_HALF_DUPLX_CTRL_LCOL_MASK 0x3ff
+-#define MAC_HALF_DUPLX_CTRL_RETRY_SHIFT 12
+-#define MAC_HALF_DUPLX_CTRL_RETRY_MASK 0xf
+-#define MAC_HALF_DUPLX_CTRL_EXC_DEF_EN 0x10000
+-#define MAC_HALF_DUPLX_CTRL_NO_BACK_C 0x20000
+-#define MAC_HALF_DUPLX_CTRL_NO_BACK_P 0x40000 /* No back-off on backpressure,
+- * immediately start the
+- * transmission after back pressure */
+-#define MAC_HALF_DUPLX_CTRL_ABEBE 0x80000 /* 1: Alternative Binary Exponential Back-off Enabled */
+-#define MAC_HALF_DUPLX_CTRL_ABEBT_SHIFT 20 /* Maximum binary exponential number */
+-#define MAC_HALF_DUPLX_CTRL_ABEBT_MASK 0xf
+-#define MAC_HALF_DUPLX_CTRL_JAMIPG_SHIFT 24 /* IPG to start JAM for collision based flow control in half-duplex */
+-#define MAC_HALF_DUPLX_CTRL_JAMIPG_MASK 0xf /* mode. In unit of 8-bit time */
+-
+-/* Maximum Frame Length Control Register */
+-#define REG_MTU 0x149c
+-
+-/* Wake-On-Lan control register */
+-#define REG_WOL_CTRL 0x14a0
+-#define WOL_PATTERN_EN 0x00000001
+-#define WOL_PATTERN_PME_EN 0x00000002
+-#define WOL_MAGIC_EN 0x00000004
+-#define WOL_MAGIC_PME_EN 0x00000008
+-#define WOL_LINK_CHG_EN 0x00000010
+-#define WOL_LINK_CHG_PME_EN 0x00000020
+-#define WOL_PATTERN_ST 0x00000100
+-#define WOL_MAGIC_ST 0x00000200
+-#define WOL_LINKCHG_ST 0x00000400
+-#define WOL_CLK_SWITCH_EN 0x00008000
+-#define WOL_PT0_EN 0x00010000
+-#define WOL_PT1_EN 0x00020000
+-#define WOL_PT2_EN 0x00040000
+-#define WOL_PT3_EN 0x00080000
+-#define WOL_PT4_EN 0x00100000
+-#define WOL_PT5_EN 0x00200000
+-#define WOL_PT6_EN 0x00400000
+-
+-/* WOL Length ( 2 DWORD ) */
+-#define REG_WOL_PATTERN_LEN 0x14a4
+-#define WOL_PT_LEN_MASK 0x7f
+-#define WOL_PT0_LEN_SHIFT 0
+-#define WOL_PT1_LEN_SHIFT 8
+-#define WOL_PT2_LEN_SHIFT 16
+-#define WOL_PT3_LEN_SHIFT 24
+-#define WOL_PT4_LEN_SHIFT 0
+-#define WOL_PT5_LEN_SHIFT 8
+-#define WOL_PT6_LEN_SHIFT 16
+-
+-/* Internal SRAM Partition Register */
+-#define RFDX_HEAD_ADDR_MASK 0x03FF
+-#define RFDX_HARD_ADDR_SHIFT 0
+-#define RFDX_TAIL_ADDR_MASK 0x03FF
+-#define RFDX_TAIL_ADDR_SHIFT 16
+-
+-#define REG_SRAM_RFD0_INFO 0x1500
+-#define REG_SRAM_RFD1_INFO 0x1504
+-#define REG_SRAM_RFD2_INFO 0x1508
+-#define REG_SRAM_RFD3_INFO 0x150C
+-
+-#define REG_RFD_NIC_LEN 0x1510 /* In 8-bytes */
+-#define RFD_NIC_LEN_MASK 0x03FF
+-
+-#define REG_SRAM_TRD_ADDR 0x1518
+-#define TPD_HEAD_ADDR_MASK 0x03FF
+-#define TPD_HEAD_ADDR_SHIFT 0
+-#define TPD_TAIL_ADDR_MASK 0x03FF
+-#define TPD_TAIL_ADDR_SHIFT 16
+-
+-#define REG_SRAM_TRD_LEN 0x151C /* In 8-bytes */
+-#define TPD_NIC_LEN_MASK 0x03FF
+-
+-#define REG_SRAM_RXF_ADDR 0x1520
+-#define REG_SRAM_RXF_LEN 0x1524
+-#define REG_SRAM_TXF_ADDR 0x1528
+-#define REG_SRAM_TXF_LEN 0x152C
+-#define REG_SRAM_TCPH_ADDR 0x1530
+-#define REG_SRAM_PKTH_ADDR 0x1532
+-
+-/*
+- * Load Ptr Register
+- * Software sets this bit after the initialization of the head and tail */
+-#define REG_LOAD_PTR 0x1534
+-
+-/*
+- * addresses of all descriptors, as well as the following descriptor
+- * control register, which triggers each function block to load the head
+- * pointer to prepare for the operation. This bit is then self-cleared
+- * after one cycle.
+- */
+-#define REG_RX_BASE_ADDR_HI 0x1540
+-#define REG_TX_BASE_ADDR_HI 0x1544
+-#define REG_SMB_BASE_ADDR_HI 0x1548
+-#define REG_SMB_BASE_ADDR_LO 0x154C
+-#define REG_RFD0_HEAD_ADDR_LO 0x1550
+-#define REG_RFD1_HEAD_ADDR_LO 0x1554
+-#define REG_RFD2_HEAD_ADDR_LO 0x1558
+-#define REG_RFD3_HEAD_ADDR_LO 0x155C
+-#define REG_RFD_RING_SIZE 0x1560
+-#define RFD_RING_SIZE_MASK 0x0FFF
+-#define REG_RX_BUF_SIZE 0x1564
+-#define RX_BUF_SIZE_MASK 0xFFFF
+-#define REG_RRD0_HEAD_ADDR_LO 0x1568
+-#define REG_RRD1_HEAD_ADDR_LO 0x156C
+-#define REG_RRD2_HEAD_ADDR_LO 0x1570
+-#define REG_RRD3_HEAD_ADDR_LO 0x1574
+-#define REG_RRD_RING_SIZE 0x1578
+-#define RRD_RING_SIZE_MASK 0x0FFF
+-#define REG_HTPD_HEAD_ADDR_LO 0x157C
+-#define REG_NTPD_HEAD_ADDR_LO 0x1580
+-#define REG_TPD_RING_SIZE 0x1584
+-#define TPD_RING_SIZE_MASK 0xFFFF
+-#define REG_CMB_BASE_ADDR_LO 0x1588
+-
+-/* RSS about */
+-#define REG_RSS_KEY0 0x14B0
+-#define REG_RSS_KEY1 0x14B4
+-#define REG_RSS_KEY2 0x14B8
+-#define REG_RSS_KEY3 0x14BC
+-#define REG_RSS_KEY4 0x14C0
+-#define REG_RSS_KEY5 0x14C4
+-#define REG_RSS_KEY6 0x14C8
+-#define REG_RSS_KEY7 0x14CC
+-#define REG_RSS_KEY8 0x14D0
+-#define REG_RSS_KEY9 0x14D4
+-#define REG_IDT_TABLE0 0x14E0
+-#define REG_IDT_TABLE1 0x14E4
+-#define REG_IDT_TABLE2 0x14E8
+-#define REG_IDT_TABLE3 0x14EC
+-#define REG_IDT_TABLE4 0x14F0
+-#define REG_IDT_TABLE5 0x14F4
+-#define REG_IDT_TABLE6 0x14F8
+-#define REG_IDT_TABLE7 0x14FC
+-#define REG_IDT_TABLE REG_IDT_TABLE0
+-#define REG_RSS_HASH_VALUE 0x15B0
+-#define REG_RSS_HASH_FLAG 0x15B4
+-#define REG_BASE_CPU_NUMBER 0x15B8
+-
+-/* TXQ Control Register */
+-#define REG_TXQ_CTRL 0x1590
+-#define TXQ_NUM_TPD_BURST_MASK 0xF
+-#define TXQ_NUM_TPD_BURST_SHIFT 0
+-#define TXQ_CTRL_IP_OPTION_EN 0x10
+-#define TXQ_CTRL_EN 0x20
+-#define TXQ_CTRL_ENH_MODE 0x40
+-#define TXQ_CTRL_LS_8023_EN 0x80
+-#define TXQ_TXF_BURST_NUM_SHIFT 16
+-#define TXQ_TXF_BURST_NUM_MASK 0xFFFF
+-
+-/* Jumbo packet Threshold for task offload */
+-#define REG_TX_TSO_OFFLOAD_THRESH 0x1594 /* In 8-bytes */
+-#define TX_TSO_OFFLOAD_THRESH_MASK 0x07FF
+-
+-#define REG_TXF_WATER_MARK 0x1598 /* In 8-bytes */
+-#define TXF_WATER_MARK_MASK 0x0FFF
+-#define TXF_LOW_WATER_MARK_SHIFT 0
+-#define TXF_HIGH_WATER_MARK_SHIFT 16
+-#define TXQ_CTRL_BURST_MODE_EN 0x80000000
+-
+-#define REG_THRUPUT_MON_CTRL 0x159C
+-#define THRUPUT_MON_RATE_MASK 0x3
+-#define THRUPUT_MON_RATE_SHIFT 0
+-#define THRUPUT_MON_EN 0x80
+-
+-/* RXQ Control Register */
+-#define REG_RXQ_CTRL 0x15A0
+-#define ASPM_THRUPUT_LIMIT_MASK 0x3
+-#define ASPM_THRUPUT_LIMIT_SHIFT 0
+-#define ASPM_THRUPUT_LIMIT_NO 0x00
+-#define ASPM_THRUPUT_LIMIT_1M 0x01
+-#define ASPM_THRUPUT_LIMIT_10M 0x02
+-#define ASPM_THRUPUT_LIMIT_100M 0x04
+-#define RXQ1_CTRL_EN 0x10
+-#define RXQ2_CTRL_EN 0x20
+-#define RXQ3_CTRL_EN 0x40
+-#define IPV6_CHKSUM_CTRL_EN 0x80
+-#define RSS_HASH_BITS_MASK 0x00FF
+-#define RSS_HASH_BITS_SHIFT 8
+-#define RSS_HASH_IPV4 0x10000
+-#define RSS_HASH_IPV4_TCP 0x20000
+-#define RSS_HASH_IPV6 0x40000
+-#define RSS_HASH_IPV6_TCP 0x80000
+-#define RXQ_RFD_BURST_NUM_MASK 0x003F
+-#define RXQ_RFD_BURST_NUM_SHIFT 20
+-#define RSS_MODE_MASK 0x0003
+-#define RSS_MODE_SHIFT 26
+-#define RSS_NIP_QUEUE_SEL_MASK 0x1
+-#define RSS_NIP_QUEUE_SEL_SHIFT 28
+-#define RRS_HASH_CTRL_EN 0x20000000
+-#define RX_CUT_THRU_EN 0x40000000
+-#define RXQ_CTRL_EN 0x80000000
+-
+-#define REG_RFD_FREE_THRESH 0x15A4
+-#define RFD_FREE_THRESH_MASK 0x003F
+-#define RFD_FREE_HI_THRESH_SHIFT 0
+-#define RFD_FREE_LO_THRESH_SHIFT 6
+-
+-/* RXF flow control register */
+-#define REG_RXQ_RXF_PAUSE_THRESH 0x15A8
+-#define RXQ_RXF_PAUSE_TH_HI_SHIFT 0
+-#define RXQ_RXF_PAUSE_TH_HI_MASK 0x0FFF
+-#define RXQ_RXF_PAUSE_TH_LO_SHIFT 16
+-#define RXQ_RXF_PAUSE_TH_LO_MASK 0x0FFF
+-
+-#define REG_RXD_DMA_CTRL 0x15AC
+-#define RXD_DMA_THRESH_MASK 0x0FFF /* In 8-bytes */
+-#define RXD_DMA_THRESH_SHIFT 0
+-#define RXD_DMA_DOWN_TIMER_MASK 0xFFFF
+-#define RXD_DMA_DOWN_TIMER_SHIFT 16
+-
+-/* DMA Engine Control Register */
+-#define REG_DMA_CTRL 0x15C0
+-#define DMA_CTRL_DMAR_IN_ORDER 0x1
+-#define DMA_CTRL_DMAR_ENH_ORDER 0x2
+-#define DMA_CTRL_DMAR_OUT_ORDER 0x4
+-#define DMA_CTRL_RCB_VALUE 0x8
+-#define DMA_CTRL_DMAR_BURST_LEN_MASK 0x0007
+-#define DMA_CTRL_DMAR_BURST_LEN_SHIFT 4
+-#define DMA_CTRL_DMAW_BURST_LEN_MASK 0x0007
+-#define DMA_CTRL_DMAW_BURST_LEN_SHIFT 7
+-#define DMA_CTRL_DMAR_REQ_PRI 0x400
+-#define DMA_CTRL_DMAR_DLY_CNT_MASK 0x001F
+-#define DMA_CTRL_DMAR_DLY_CNT_SHIFT 11
+-#define DMA_CTRL_DMAW_DLY_CNT_MASK 0x000F
+-#define DMA_CTRL_DMAW_DLY_CNT_SHIFT 16
+-#define DMA_CTRL_CMB_EN 0x100000
+-#define DMA_CTRL_SMB_EN 0x200000
+-#define DMA_CTRL_CMB_NOW 0x400000
+-#define MAC_CTRL_SMB_DIS 0x1000000
+-#define DMA_CTRL_SMB_NOW 0x80000000
+-
+-/* CMB/SMB Control Register */
+-#define REG_SMB_STAT_TIMER 0x15C4 /* 2us resolution */
+-#define SMB_STAT_TIMER_MASK 0xFFFFFF
+-#define REG_CMB_TPD_THRESH 0x15C8
+-#define CMB_TPD_THRESH_MASK 0xFFFF
+-#define REG_CMB_TX_TIMER 0x15CC /* 2us resolution */
+-#define CMB_TX_TIMER_MASK 0xFFFF
+-
+-/* Mail box */
+-#define MB_RFDX_PROD_IDX_MASK 0xFFFF
+-#define REG_MB_RFD0_PROD_IDX 0x15E0
+-#define REG_MB_RFD1_PROD_IDX 0x15E4
+-#define REG_MB_RFD2_PROD_IDX 0x15E8
+-#define REG_MB_RFD3_PROD_IDX 0x15EC
+-
+-#define MB_PRIO_PROD_IDX_MASK 0xFFFF
+-#define REG_MB_PRIO_PROD_IDX 0x15F0
+-#define MB_HTPD_PROD_IDX_SHIFT 0
+-#define MB_NTPD_PROD_IDX_SHIFT 16
+-
+-#define MB_PRIO_CONS_IDX_MASK 0xFFFF
+-#define REG_MB_PRIO_CONS_IDX 0x15F4
+-#define MB_HTPD_CONS_IDX_SHIFT 0
+-#define MB_NTPD_CONS_IDX_SHIFT 16
+-
+-#define REG_MB_RFD01_CONS_IDX 0x15F8
+-#define MB_RFD0_CONS_IDX_MASK 0x0000FFFF
+-#define MB_RFD1_CONS_IDX_MASK 0xFFFF0000
+-#define REG_MB_RFD23_CONS_IDX 0x15FC
+-#define MB_RFD2_CONS_IDX_MASK 0x0000FFFF
+-#define MB_RFD3_CONS_IDX_MASK 0xFFFF0000
+-
+-/* Interrupt Status Register */
+-#define REG_ISR 0x1600
+-#define ISR_SMB 0x00000001
+-#define ISR_TIMER 0x00000002
+-/*
+- * Software manual interrupt, for debug. Set when SW_MAN_INT_EN is set
+- * in Table 51 Selene Master Control Register (Offset 0x1400).
+- */
+-#define ISR_MANUAL 0x00000004
+-#define ISR_HW_RXF_OV 0x00000008 /* RXF overflow interrupt */
+-#define ISR_RFD0_UR 0x00000010 /* RFD0 under run */
+-#define ISR_RFD1_UR 0x00000020
+-#define ISR_RFD2_UR 0x00000040
+-#define ISR_RFD3_UR 0x00000080
+-#define ISR_TXF_UR 0x00000100
+-#define ISR_DMAR_TO_RST 0x00000200
+-#define ISR_DMAW_TO_RST 0x00000400
+-#define ISR_TX_CREDIT 0x00000800
+-#define ISR_GPHY 0x00001000
+-/* GPHY low power state interrupt */
+-#define ISR_GPHY_LPW 0x00002000
+-#define ISR_TXQ_TO_RST 0x00004000
+-#define ISR_TX_PKT 0x00008000
+-#define ISR_RX_PKT_0 0x00010000
+-#define ISR_RX_PKT_1 0x00020000
+-#define ISR_RX_PKT_2 0x00040000
+-#define ISR_RX_PKT_3 0x00080000
+-#define ISR_MAC_RX 0x00100000
+-#define ISR_MAC_TX 0x00200000
+-#define ISR_UR_DETECTED 0x00400000
+-#define ISR_FERR_DETECTED 0x00800000
+-#define ISR_NFERR_DETECTED 0x01000000
+-#define ISR_CERR_DETECTED 0x02000000
+-#define ISR_PHY_LINKDOWN 0x04000000
+-#define ISR_DIS_INT 0x80000000
+-
+-/* Interrupt Mask Register */
+-#define REG_IMR 0x1604
+-
+-#define IMR_NORMAL_MASK (\
+- ISR_MANUAL |\
+- ISR_HW_RXF_OV |\
+- ISR_RFD0_UR |\
+- ISR_TXF_UR |\
+- ISR_DMAR_TO_RST |\
+- ISR_TXQ_TO_RST |\
+- ISR_DMAW_TO_RST |\
+- ISR_GPHY |\
+- ISR_TX_PKT |\
+- ISR_RX_PKT_0 |\
+- ISR_GPHY_LPW |\
+- ISR_PHY_LINKDOWN)
+-
+-#define ISR_RX_PKT (\
+- ISR_RX_PKT_0 |\
+- ISR_RX_PKT_1 |\
+- ISR_RX_PKT_2 |\
+- ISR_RX_PKT_3)
+-
+-#define ISR_OVER (\
+- ISR_RFD0_UR |\
+- ISR_RFD1_UR |\
+- ISR_RFD2_UR |\
+- ISR_RFD3_UR |\
+- ISR_HW_RXF_OV |\
+- ISR_TXF_UR)
+-
+-#define ISR_ERROR (\
+- ISR_DMAR_TO_RST |\
+- ISR_TXQ_TO_RST |\
+- ISR_DMAW_TO_RST |\
+- ISR_PHY_LINKDOWN)
+-
+-#define REG_INT_RETRIG_TIMER 0x1608
+-#define INT_RETRIG_TIMER_MASK 0xFFFF
+-
+-#define REG_HDS_CTRL 0x160C
+-#define HDS_CTRL_EN 0x0001
+-#define HDS_CTRL_BACKFILLSIZE_SHIFT 8
+-#define HDS_CTRL_BACKFILLSIZE_MASK 0x0FFF
+-#define HDS_CTRL_MAX_HDRSIZE_SHIFT 20
+-#define HDS_CTRL_MAC_HDRSIZE_MASK 0x0FFF
+-
+-#define REG_MAC_RX_STATUS_BIN 0x1700
+-#define REG_MAC_RX_STATUS_END 0x175c
+-#define REG_MAC_TX_STATUS_BIN 0x1760
+-#define REG_MAC_TX_STATUS_END 0x17c0
+-
+-/* DEBUG ADDR */
+-#define REG_DEBUG_DATA0 0x1900
+-#define REG_DEBUG_DATA1 0x1904
+-
+-/* PHY Control Register */
+-#define MII_BMCR 0x00
+-#define BMCR_SPEED_SELECT_MSB 0x0040 /* bits 6,13: 10=1000, 01=100, 00=10 */
+-#define BMCR_COLL_TEST_ENABLE 0x0080 /* Collision test enable */
+-#define BMCR_FULL_DUPLEX 0x0100 /* FDX =1, half duplex =0 */
+-#define BMCR_RESTART_AUTO_NEG 0x0200 /* Restart auto negotiation */
+-#define BMCR_ISOLATE 0x0400 /* Isolate PHY from MII */
+-#define BMCR_POWER_DOWN 0x0800 /* Power down */
+-#define BMCR_AUTO_NEG_EN 0x1000 /* Auto Neg Enable */
+-#define BMCR_SPEED_SELECT_LSB 0x2000 /* bits 6,13: 10=1000, 01=100, 00=10 */
+-#define BMCR_LOOPBACK 0x4000 /* 0 = normal, 1 = loopback */
+-#define BMCR_RESET 0x8000 /* 0 = normal, 1 = PHY reset */
+-#define BMCR_SPEED_MASK 0x2040
+-#define BMCR_SPEED_1000 0x0040
+-#define BMCR_SPEED_100 0x2000
+-#define BMCR_SPEED_10 0x0000
+-
+-/* PHY Status Register */
+-#define MII_BMSR 0x01
+-#define BMMSR_EXTENDED_CAPS 0x0001 /* Extended register capabilities */
+-#define BMSR_JABBER_DETECT 0x0002 /* Jabber Detected */
+-#define BMSR_LINK_STATUS 0x0004 /* Link Status 1 = link */
+-#define BMSR_AUTONEG_CAPS 0x0008 /* Auto Neg Capable */
+-#define BMSR_REMOTE_FAULT 0x0010 /* Remote Fault Detect */
+-#define BMSR_AUTONEG_COMPLETE 0x0020 /* Auto Neg Complete */
+-#define BMSR_PREAMBLE_SUPPRESS 0x0040 /* Preamble may be suppressed */
+-#define BMSR_EXTENDED_STATUS 0x0100 /* Ext. status info in Reg 0x0F */
+-#define BMSR_100T2_HD_CAPS 0x0200 /* 100T2 Half Duplex Capable */
+-#define BMSR_100T2_FD_CAPS 0x0400 /* 100T2 Full Duplex Capable */
+-#define BMSR_10T_HD_CAPS 0x0800 /* 10T Half Duplex Capable */
+-#define BMSR_10T_FD_CAPS 0x1000 /* 10T Full Duplex Capable */
+-#define BMSR_100X_HD_CAPS 0x2000 /* 100X Half Duplex Capable */
+-#define BMMII_SR_100X_FD_CAPS 0x4000 /* 100X Full Duplex Capable */
+-#define BMMII_SR_100T4_CAPS 0x8000 /* 100T4 Capable */
+-
+-#define MII_PHYSID1 0x02
+-#define MII_PHYSID2 0x03
+-
+-/* Autoneg Advertisement Register */
+-#define MII_ADVERTISE 0x04
+-#define ADVERTISE_SPEED_MASK 0x01E0
+-#define ADVERTISE_DEFAULT_CAP 0x0DE0
+-
+-/* 1000BASE-T Control Register */
+-#define MII_GIGA_CR 0x09
+-#define GIGA_CR_1000T_REPEATER_DTE 0x0400 /* 1=Repeater/switch device port 0=DTE device */
+-
+-#define GIGA_CR_1000T_MS_VALUE 0x0800 /* 1=Configure PHY as Master 0=Configure PHY as Slave */
+-#define GIGA_CR_1000T_MS_ENABLE 0x1000 /* 1=Master/Slave manual config value 0=Automatic Master/Slave config */
+-#define GIGA_CR_1000T_TEST_MODE_NORMAL 0x0000 /* Normal Operation */
+-#define GIGA_CR_1000T_TEST_MODE_1 0x2000 /* Transmit Waveform test */
+-#define GIGA_CR_1000T_TEST_MODE_2 0x4000 /* Master Transmit Jitter test */
+-#define GIGA_CR_1000T_TEST_MODE_3 0x6000 /* Slave Transmit Jitter test */
+-#define GIGA_CR_1000T_TEST_MODE_4 0x8000 /* Transmitter Distortion test */
+-#define GIGA_CR_1000T_SPEED_MASK 0x0300
+-#define GIGA_CR_1000T_DEFAULT_CAP 0x0300
+-
+-/* PHY Specific Status Register */
+-#define MII_GIGA_PSSR 0x11
+-#define GIGA_PSSR_SPD_DPLX_RESOLVED 0x0800 /* 1=Speed & Duplex resolved */
+-#define GIGA_PSSR_DPLX 0x2000 /* 1=Duplex 0=Half Duplex */
+-#define GIGA_PSSR_SPEED 0xC000 /* Speed, bits 14:15 */
+-#define GIGA_PSSR_10MBS 0x0000 /* 00=10Mbs */
+-#define GIGA_PSSR_100MBS 0x4000 /* 01=100Mbs */
+-#define GIGA_PSSR_1000MBS 0x8000 /* 10=1000Mbs */
+-
+-/* PHY Interrupt Enable Register */
+-#define MII_IER 0x12
+-#define IER_LINK_UP 0x0400
+-#define IER_LINK_DOWN 0x0800
+-
+-/* PHY Interrupt Status Register */
+-#define MII_ISR 0x13
+-#define ISR_LINK_UP 0x0400
+-#define ISR_LINK_DOWN 0x0800
+-
+-/* Cable-Detect-Test Control Register */
+-#define MII_CDTC 0x16
+-#define CDTC_EN_OFF 0 /* sc */
+-#define CDTC_EN_BITS 1
+-#define CDTC_PAIR_OFF 8
+-#define CDTC_PAIR_BIT 2
+-
+-/* Cable-Detect-Test Status Register */
+-#define MII_CDTS 0x1C
+-#define CDTS_STATUS_OFF 8
+-#define CDTS_STATUS_BITS 2
+-#define CDTS_STATUS_NORMAL 0
+-#define CDTS_STATUS_SHORT 1
+-#define CDTS_STATUS_OPEN 2
+-#define CDTS_STATUS_INVALID 3
+-
+-#define MII_DBG_ADDR 0x1D
+-#define MII_DBG_DATA 0x1E
+-
+-#define MII_ANA_CTRL_0 0x0
+-#define ANA_RESTART_CAL 0x0001
+-#define ANA_MANUL_SWICH_ON_SHIFT 0x1
+-#define ANA_MANUL_SWICH_ON_MASK 0xF
+-#define ANA_MAN_ENABLE 0x0020
+-#define ANA_SEL_HSP 0x0040
+-#define ANA_EN_HB 0x0080
+-#define ANA_EN_HBIAS 0x0100
+-#define ANA_OEN_125M 0x0200
+-#define ANA_EN_LCKDT 0x0400
+-#define ANA_LCKDT_PHY 0x0800
+-#define ANA_AFE_MODE 0x1000
+-#define ANA_VCO_SLOW 0x2000
+-#define ANA_VCO_FAST 0x4000
+-#define ANA_SEL_CLK125M_DSP 0x8000
+-
+-#define MII_ANA_CTRL_4 0x4
+-#define ANA_IECHO_ADJ_MASK 0xF
+-#define ANA_IECHO_ADJ_3_SHIFT 0
+-#define ANA_IECHO_ADJ_2_SHIFT 4
+-#define ANA_IECHO_ADJ_1_SHIFT 8
+-#define ANA_IECHO_ADJ_0_SHIFT 12
+-
+-#define MII_ANA_CTRL_5 0x5
+-#define ANA_SERDES_CDR_BW_SHIFT 0
+-#define ANA_SERDES_CDR_BW_MASK 0x3
+-#define ANA_MS_PAD_DBG 0x0004
+-#define ANA_SPEEDUP_DBG 0x0008
+-#define ANA_SERDES_TH_LOS_SHIFT 4
+-#define ANA_SERDES_TH_LOS_MASK 0x3
+-#define ANA_SERDES_EN_DEEM 0x0040
+-#define ANA_SERDES_TXELECIDLE 0x0080
+-#define ANA_SERDES_BEACON 0x0100
+-#define ANA_SERDES_HALFTXDR 0x0200
+-#define ANA_SERDES_SEL_HSP 0x0400
+-#define ANA_SERDES_EN_PLL 0x0800
+-#define ANA_SERDES_EN 0x1000
+-#define ANA_SERDES_EN_LCKDT 0x2000
+-
+-#define MII_ANA_CTRL_11 0xB
+-#define ANA_PS_HIB_EN 0x8000
+-
+-#define MII_ANA_CTRL_18 0x12
+-#define ANA_TEST_MODE_10BT_01SHIFT 0
+-#define ANA_TEST_MODE_10BT_01MASK 0x3
+-#define ANA_LOOP_SEL_10BT 0x0004
+-#define ANA_RGMII_MODE_SW 0x0008
+-#define ANA_EN_LONGECABLE 0x0010
+-#define ANA_TEST_MODE_10BT_2 0x0020
+-#define ANA_EN_10BT_IDLE 0x0400
+-#define ANA_EN_MASK_TB 0x0800
+-#define ANA_TRIGGER_SEL_TIMER_SHIFT 12
+-#define ANA_TRIGGER_SEL_TIMER_MASK 0x3
+-#define ANA_INTERVAL_SEL_TIMER_SHIFT 14
+-#define ANA_INTERVAL_SEL_TIMER_MASK 0x3
+-
+-#define MII_ANA_CTRL_41 0x29
+-#define ANA_TOP_PS_EN 0x8000
+-
+-#define MII_ANA_CTRL_54 0x36
+-#define ANA_LONG_CABLE_TH_100_SHIFT 0
+-#define ANA_LONG_CABLE_TH_100_MASK 0x3F
+-#define ANA_DESERVED 0x0040
+-#define ANA_EN_LIT_CH 0x0080
+-#define ANA_SHORT_CABLE_TH_100_SHIFT 8
+-#define ANA_SHORT_CABLE_TH_100_MASK 0x3F
+-#define ANA_BP_BAD_LINK_ACCUM 0x4000
+-#define ANA_BP_SMALL_BW 0x8000
+-
+-#endif /*_ATL1C_HW_H_*/
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/atl1c/atl1c_main.c linux-2.6.29-rc3.owrt/drivers/net/atl1c/atl1c_main.c
+--- linux-2.6.29.owrt/drivers/net/atl1c/atl1c_main.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/atl1c/atl1c_main.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,2797 +0,0 @@
+-/*
+- * Copyright(c) 2008 - 2009 Atheros Corporation. All rights reserved.
+- *
+- * Derived from Intel e1000 driver
+- * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
+- *
+- * This program is free software; you can redistribute it and/or modify it
+- * under the terms of the GNU General Public License as published by the Free
+- * Software Foundation; either version 2 of the License, or (at your option)
+- * any later version.
+- *
+- * This program is distributed in the hope that it will be useful, but WITHOUT
+- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+- * more details.
+- *
+- * You should have received a copy of the GNU General Public License along with
+- * this program; if not, write to the Free Software Foundation, Inc., 59
+- * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+- */
+-
+-#include "atl1c.h"
+-
+-#define ATL1C_DRV_VERSION "1.0.0.1-NAPI"
+-char atl1c_driver_name[] = "atl1c";
+-char atl1c_driver_version[] = ATL1C_DRV_VERSION;
+-#define PCI_DEVICE_ID_ATTANSIC_L2C 0x1062
+-#define PCI_DEVICE_ID_ATTANSIC_L1C 0x1063
+-/*
+- * atl1c_pci_tbl - PCI Device ID Table
+- *
+- * Wildcard entries (PCI_ANY_ID) should come last
+- * Last entry must be all 0s
+- *
+- * { Vendor ID, Device ID, SubVendor ID, SubDevice ID,
+- * Class, Class Mask, private data (not used) }
+- */
+-static struct pci_device_id atl1c_pci_tbl[] = {
+- {PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATTANSIC_L1C)},
+- {PCI_DEVICE(PCI_VENDOR_ID_ATTANSIC, PCI_DEVICE_ID_ATTANSIC_L2C)},
+- /* required last entry */
+- { 0 }
+-};
+-MODULE_DEVICE_TABLE(pci, atl1c_pci_tbl);
+-
+-MODULE_AUTHOR("Jie Yang <jie.yang@atheros.com>");
+-MODULE_DESCRIPTION("Atheros 1000M Ethernet Network Driver");
+-MODULE_LICENSE("GPL");
+-MODULE_VERSION(ATL1C_DRV_VERSION);
+-
+-static int atl1c_stop_mac(struct atl1c_hw *hw);
+-static void atl1c_enable_rx_ctrl(struct atl1c_hw *hw);
+-static void atl1c_enable_tx_ctrl(struct atl1c_hw *hw);
+-static void atl1c_disable_l0s_l1(struct atl1c_hw *hw);
+-static void atl1c_set_aspm(struct atl1c_hw *hw, bool linkup);
+-static void atl1c_setup_mac_ctrl(struct atl1c_adapter *adapter);
+-static void atl1c_clean_rx_irq(struct atl1c_adapter *adapter, u8 que,
+- int *work_done, int work_to_do);
+-
+-static const u16 atl1c_pay_load_size[] = {
+- 128, 256, 512, 1024, 2048, 4096,
+-};
+-
+-static const u16 atl1c_rfd_prod_idx_regs[AT_MAX_RECEIVE_QUEUE] =
+-{
+- REG_MB_RFD0_PROD_IDX,
+- REG_MB_RFD1_PROD_IDX,
+- REG_MB_RFD2_PROD_IDX,
+- REG_MB_RFD3_PROD_IDX
+-};
+-
+-static const u16 atl1c_rfd_addr_lo_regs[AT_MAX_RECEIVE_QUEUE] =
+-{
+- REG_RFD0_HEAD_ADDR_LO,
+- REG_RFD1_HEAD_ADDR_LO,
+- REG_RFD2_HEAD_ADDR_LO,
+- REG_RFD3_HEAD_ADDR_LO
+-};
+-
+-static const u16 atl1c_rrd_addr_lo_regs[AT_MAX_RECEIVE_QUEUE] =
+-{
+- REG_RRD0_HEAD_ADDR_LO,
+- REG_RRD1_HEAD_ADDR_LO,
+- REG_RRD2_HEAD_ADDR_LO,
+- REG_RRD3_HEAD_ADDR_LO
+-};
+-
+-static const u32 atl1c_default_msg = NETIF_MSG_DRV | NETIF_MSG_PROBE |
+- NETIF_MSG_LINK | NETIF_MSG_TIMER | NETIF_MSG_IFDOWN | NETIF_MSG_IFUP;
+-
+-/*
+- * atl1c_init_pcie - init PCIE module
+- */
+-static void atl1c_reset_pcie(struct atl1c_hw *hw, u32 flag)
+-{
+- u32 data;
+- u32 pci_cmd;
+- struct pci_dev *pdev = hw->adapter->pdev;
+-
+- AT_READ_REG(hw, PCI_COMMAND, &pci_cmd);
+- pci_cmd &= ~PCI_COMMAND_INTX_DISABLE;
+- pci_cmd |= (PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER |
+- PCI_COMMAND_IO);
+- AT_WRITE_REG(hw, PCI_COMMAND, pci_cmd);
+-
+- /*
+- * Clear any PowerSaveing Settings
+- */
+- pci_enable_wake(pdev, PCI_D3hot, 0);
+- pci_enable_wake(pdev, PCI_D3cold, 0);
+-
+- /*
+- * Mask some pcie error bits
+- */
+- AT_READ_REG(hw, REG_PCIE_UC_SEVERITY, &data);
+- data &= ~PCIE_UC_SERVRITY_DLP;
+- data &= ~PCIE_UC_SERVRITY_FCP;
+- AT_WRITE_REG(hw, REG_PCIE_UC_SEVERITY, data);
+-
+- if (flag & ATL1C_PCIE_L0S_L1_DISABLE)
+- atl1c_disable_l0s_l1(hw);
+- if (flag & ATL1C_PCIE_PHY_RESET)
+- AT_WRITE_REG(hw, REG_GPHY_CTRL, GPHY_CTRL_DEFAULT);
+- else
+- AT_WRITE_REG(hw, REG_GPHY_CTRL,
+- GPHY_CTRL_DEFAULT | GPHY_CTRL_EXT_RESET);
+-
+- msleep(1);
+-}
+-
+-/*
+- * atl1c_irq_enable - Enable default interrupt generation settings
+- * @adapter: board private structure
+- */
+-static inline void atl1c_irq_enable(struct atl1c_adapter *adapter)
+-{
+- if (likely(atomic_dec_and_test(&adapter->irq_sem))) {
+- AT_WRITE_REG(&adapter->hw, REG_ISR, 0x7FFFFFFF);
+- AT_WRITE_REG(&adapter->hw, REG_IMR, adapter->hw.intr_mask);
+- AT_WRITE_FLUSH(&adapter->hw);
+- }
+-}
+-
+-/*
+- * atl1c_irq_disable - Mask off interrupt generation on the NIC
+- * @adapter: board private structure
+- */
+-static inline void atl1c_irq_disable(struct atl1c_adapter *adapter)
+-{
+- atomic_inc(&adapter->irq_sem);
+- AT_WRITE_REG(&adapter->hw, REG_IMR, 0);
+- AT_WRITE_FLUSH(&adapter->hw);
+- synchronize_irq(adapter->pdev->irq);
+-}
+-
+-/*
+- * atl1c_irq_reset - reset interrupt confiure on the NIC
+- * @adapter: board private structure
+- */
+-static inline void atl1c_irq_reset(struct atl1c_adapter *adapter)
+-{
+- atomic_set(&adapter->irq_sem, 1);
+- atl1c_irq_enable(adapter);
+-}
+-
+-/*
+- * atl1c_phy_config - Timer Call-back
+- * @data: pointer to netdev cast into an unsigned long
+- */
+-static void atl1c_phy_config(unsigned long data)
+-{
+- struct atl1c_adapter *adapter = (struct atl1c_adapter *) data;
+- struct atl1c_hw *hw = &adapter->hw;
+- unsigned long flags;
+-
+- spin_lock_irqsave(&adapter->mdio_lock, flags);
+- atl1c_restart_autoneg(hw);
+- spin_unlock_irqrestore(&adapter->mdio_lock, flags);
+-}
+-
+-void atl1c_reinit_locked(struct atl1c_adapter *adapter)
+-{
+-
+- WARN_ON(in_interrupt());
+- atl1c_down(adapter);
+- atl1c_up(adapter);
+- clear_bit(__AT_RESETTING, &adapter->flags);
+-}
+-
+-static void atl1c_reset_task(struct work_struct *work)
+-{
+- struct atl1c_adapter *adapter;
+- struct net_device *netdev;
+-
+- adapter = container_of(work, struct atl1c_adapter, reset_task);
+- netdev = adapter->netdev;
+-
+- netif_device_detach(netdev);
+- atl1c_down(adapter);
+- atl1c_up(adapter);
+- netif_device_attach(netdev);
+-}
+-
+-static void atl1c_check_link_status(struct atl1c_adapter *adapter)
+-{
+- struct atl1c_hw *hw = &adapter->hw;
+- struct net_device *netdev = adapter->netdev;
+- struct pci_dev *pdev = adapter->pdev;
+- int err;
+- unsigned long flags;
+- u16 speed, duplex, phy_data;
+-
+- spin_lock_irqsave(&adapter->mdio_lock, flags);
+- /* MII_BMSR must read twise */
+- atl1c_read_phy_reg(hw, MII_BMSR, &phy_data);
+- atl1c_read_phy_reg(hw, MII_BMSR, &phy_data);
+- spin_unlock_irqrestore(&adapter->mdio_lock, flags);
+-
+- if ((phy_data & BMSR_LSTATUS) == 0) {
+- /* link down */
+- if (netif_carrier_ok(netdev)) {
+- hw->hibernate = true;
+- atl1c_set_aspm(hw, false);
+- if (atl1c_stop_mac(hw) != 0)
+- if (netif_msg_hw(adapter))
+- dev_warn(&pdev->dev,
+- "stop mac failed\n");
+- }
+- netif_carrier_off(netdev);
+- } else {
+- /* Link Up */
+- hw->hibernate = false;
+- spin_lock_irqsave(&adapter->mdio_lock, flags);
+- err = atl1c_get_speed_and_duplex(hw, &speed, &duplex);
+- spin_unlock_irqrestore(&adapter->mdio_lock, flags);
+- if (unlikely(err))
+- return;
+- /* link result is our setting */
+- if (adapter->link_speed != speed ||
+- adapter->link_duplex != duplex) {
+- adapter->link_speed = speed;
+- adapter->link_duplex = duplex;
+- atl1c_enable_tx_ctrl(hw);
+- atl1c_enable_rx_ctrl(hw);
+- atl1c_setup_mac_ctrl(adapter);
+- atl1c_set_aspm(hw, true);
+- if (netif_msg_link(adapter))
+- dev_info(&pdev->dev,
+- "%s: %s NIC Link is Up<%d Mbps %s>\n",
+- atl1c_driver_name, netdev->name,
+- adapter->link_speed,
+- adapter->link_duplex == FULL_DUPLEX ?
+- "Full Duplex" : "Half Duplex");
+- }
+- if (!netif_carrier_ok(netdev))
+- netif_carrier_on(netdev);
+- }
+-}
+-
+-/*
+- * atl1c_link_chg_task - deal with link change event Out of interrupt context
+- * @netdev: network interface device structure
+- */
+-static void atl1c_link_chg_task(struct work_struct *work)
+-{
+- struct atl1c_adapter *adapter;
+-
+- adapter = container_of(work, struct atl1c_adapter, link_chg_task);
+- atl1c_check_link_status(adapter);
+-}
+-
+-static void atl1c_link_chg_event(struct atl1c_adapter *adapter)
+-{
+- struct net_device *netdev = adapter->netdev;
+- struct pci_dev *pdev = adapter->pdev;
+- u16 phy_data;
+- u16 link_up;
+-
+- spin_lock(&adapter->mdio_lock);
+- atl1c_read_phy_reg(&adapter->hw, MII_BMSR, &phy_data);
+- atl1c_read_phy_reg(&adapter->hw, MII_BMSR, &phy_data);
+- spin_unlock(&adapter->mdio_lock);
+- link_up = phy_data & BMSR_LSTATUS;
+- /* notify upper layer link down ASAP */
+- if (!link_up) {
+- if (netif_carrier_ok(netdev)) {
+- /* old link state: Up */
+- netif_carrier_off(netdev);
+- if (netif_msg_link(adapter))
+- dev_info(&pdev->dev,
+- "%s: %s NIC Link is Down\n",
+- atl1c_driver_name, netdev->name);
+- adapter->link_speed = SPEED_0;
+- }
+- }
+- schedule_work(&adapter->link_chg_task);
+-}
+-
+-static void atl1c_del_timer(struct atl1c_adapter *adapter)
+-{
+- del_timer_sync(&adapter->phy_config_timer);
+-}
+-
+-static void atl1c_cancel_work(struct atl1c_adapter *adapter)
+-{
+- cancel_work_sync(&adapter->reset_task);
+- cancel_work_sync(&adapter->link_chg_task);
+-}
+-
+-/*
+- * atl1c_tx_timeout - Respond to a Tx Hang
+- * @netdev: network interface device structure
+- */
+-static void atl1c_tx_timeout(struct net_device *netdev)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+-
+- /* Do the reset outside of interrupt context */
+- schedule_work(&adapter->reset_task);
+-}
+-
+-/*
+- * atl1c_set_multi - Multicast and Promiscuous mode set
+- * @netdev: network interface device structure
+- *
+- * The set_multi entry point is called whenever the multicast address
+- * list or the network interface flags are updated. This routine is
+- * responsible for configuring the hardware for proper multicast,
+- * promiscuous mode, and all-multi behavior.
+- */
+-static void atl1c_set_multi(struct net_device *netdev)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+- struct atl1c_hw *hw = &adapter->hw;
+- struct dev_mc_list *mc_ptr;
+- u32 mac_ctrl_data;
+- u32 hash_value;
+-
+- /* Check for Promiscuous and All Multicast modes */
+- AT_READ_REG(hw, REG_MAC_CTRL, &mac_ctrl_data);
+-
+- if (netdev->flags & IFF_PROMISC) {
+- mac_ctrl_data |= MAC_CTRL_PROMIS_EN;
+- } else if (netdev->flags & IFF_ALLMULTI) {
+- mac_ctrl_data |= MAC_CTRL_MC_ALL_EN;
+- mac_ctrl_data &= ~MAC_CTRL_PROMIS_EN;
+- } else {
+- mac_ctrl_data &= ~(MAC_CTRL_PROMIS_EN | MAC_CTRL_MC_ALL_EN);
+- }
+-
+- AT_WRITE_REG(hw, REG_MAC_CTRL, mac_ctrl_data);
+-
+- /* clear the old settings from the multicast hash table */
+- AT_WRITE_REG(hw, REG_RX_HASH_TABLE, 0);
+- AT_WRITE_REG_ARRAY(hw, REG_RX_HASH_TABLE, 1, 0);
+-
+- /* comoute mc addresses' hash value ,and put it into hash table */
+- for (mc_ptr = netdev->mc_list; mc_ptr; mc_ptr = mc_ptr->next) {
+- hash_value = atl1c_hash_mc_addr(hw, mc_ptr->dmi_addr);
+- atl1c_hash_set(hw, hash_value);
+- }
+-}
+-
+-static void atl1c_vlan_rx_register(struct net_device *netdev,
+- struct vlan_group *grp)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+- struct pci_dev *pdev = adapter->pdev;
+- u32 mac_ctrl_data = 0;
+-
+- if (netif_msg_pktdata(adapter))
+- dev_dbg(&pdev->dev, "atl1c_vlan_rx_register\n");
+-
+- atl1c_irq_disable(adapter);
+-
+- adapter->vlgrp = grp;
+- AT_READ_REG(&adapter->hw, REG_MAC_CTRL, &mac_ctrl_data);
+-
+- if (grp) {
+- /* enable VLAN tag insert/strip */
+- mac_ctrl_data |= MAC_CTRL_RMV_VLAN;
+- } else {
+- /* disable VLAN tag insert/strip */
+- mac_ctrl_data &= ~MAC_CTRL_RMV_VLAN;
+- }
+-
+- AT_WRITE_REG(&adapter->hw, REG_MAC_CTRL, mac_ctrl_data);
+- atl1c_irq_enable(adapter);
+-}
+-
+-static void atl1c_restore_vlan(struct atl1c_adapter *adapter)
+-{
+- struct pci_dev *pdev = adapter->pdev;
+-
+- if (netif_msg_pktdata(adapter))
+- dev_dbg(&pdev->dev, "atl1c_restore_vlan !");
+- atl1c_vlan_rx_register(adapter->netdev, adapter->vlgrp);
+-}
+-/*
+- * atl1c_set_mac - Change the Ethernet Address of the NIC
+- * @netdev: network interface device structure
+- * @p: pointer to an address structure
+- *
+- * Returns 0 on success, negative on failure
+- */
+-static int atl1c_set_mac_addr(struct net_device *netdev, void *p)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+- struct sockaddr *addr = p;
+-
+- if (!is_valid_ether_addr(addr->sa_data))
+- return -EADDRNOTAVAIL;
+-
+- if (netif_running(netdev))
+- return -EBUSY;
+-
+- memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
+- memcpy(adapter->hw.mac_addr, addr->sa_data, netdev->addr_len);
+-
+- atl1c_hw_set_mac_addr(&adapter->hw);
+-
+- return 0;
+-}
+-
+-static void atl1c_set_rxbufsize(struct atl1c_adapter *adapter,
+- struct net_device *dev)
+-{
+- int mtu = dev->mtu;
+-
+- adapter->rx_buffer_len = mtu > AT_RX_BUF_SIZE ?
+- roundup(mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN, 8) : AT_RX_BUF_SIZE;
+-}
+-/*
+- * atl1c_change_mtu - Change the Maximum Transfer Unit
+- * @netdev: network interface device structure
+- * @new_mtu: new value for maximum frame size
+- *
+- * Returns 0 on success, negative on failure
+- */
+-static int atl1c_change_mtu(struct net_device *netdev, int new_mtu)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+- int old_mtu = netdev->mtu;
+- int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
+-
+- if ((max_frame < ETH_ZLEN + ETH_FCS_LEN) ||
+- (max_frame > MAX_JUMBO_FRAME_SIZE)) {
+- if (netif_msg_link(adapter))
+- dev_warn(&adapter->pdev->dev, "invalid MTU setting\n");
+- return -EINVAL;
+- }
+- /* set MTU */
+- if (old_mtu != new_mtu && netif_running(netdev)) {
+- while (test_and_set_bit(__AT_RESETTING, &adapter->flags))
+- msleep(1);
+- netdev->mtu = new_mtu;
+- adapter->hw.max_frame_size = new_mtu;
+- atl1c_set_rxbufsize(adapter, netdev);
+- atl1c_down(adapter);
+- atl1c_up(adapter);
+- clear_bit(__AT_RESETTING, &adapter->flags);
+- if (adapter->hw.ctrl_flags & ATL1C_FPGA_VERSION) {
+- u32 phy_data;
+-
+- AT_READ_REG(&adapter->hw, 0x1414, &phy_data);
+- phy_data |= 0x10000000;
+- AT_WRITE_REG(&adapter->hw, 0x1414, phy_data);
+- }
+-
+- }
+- return 0;
+-}
+-
+-/*
+- * caller should hold mdio_lock
+- */
+-static int atl1c_mdio_read(struct net_device *netdev, int phy_id, int reg_num)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+- u16 result;
+-
+- atl1c_read_phy_reg(&adapter->hw, reg_num & MDIO_REG_ADDR_MASK, &result);
+- return result;
+-}
+-
+-static void atl1c_mdio_write(struct net_device *netdev, int phy_id,
+- int reg_num, int val)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+-
+- atl1c_write_phy_reg(&adapter->hw, reg_num & MDIO_REG_ADDR_MASK, val);
+-}
+-
+-/*
+- * atl1c_mii_ioctl -
+- * @netdev:
+- * @ifreq:
+- * @cmd:
+- */
+-static int atl1c_mii_ioctl(struct net_device *netdev,
+- struct ifreq *ifr, int cmd)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+- struct pci_dev *pdev = adapter->pdev;
+- struct mii_ioctl_data *data = if_mii(ifr);
+- unsigned long flags;
+- int retval = 0;
+-
+- if (!netif_running(netdev))
+- return -EINVAL;
+-
+- spin_lock_irqsave(&adapter->mdio_lock, flags);
+- switch (cmd) {
+- case SIOCGMIIPHY:
+- data->phy_id = 0;
+- break;
+-
+- case SIOCGMIIREG:
+- if (!capable(CAP_NET_ADMIN)) {
+- retval = -EPERM;
+- goto out;
+- }
+- if (atl1c_read_phy_reg(&adapter->hw, data->reg_num & 0x1F,
+- &data->val_out)) {
+- retval = -EIO;
+- goto out;
+- }
+- break;
+-
+- case SIOCSMIIREG:
+- if (!capable(CAP_NET_ADMIN)) {
+- retval = -EPERM;
+- goto out;
+- }
+- if (data->reg_num & ~(0x1F)) {
+- retval = -EFAULT;
+- goto out;
+- }
+-
+- dev_dbg(&pdev->dev, "<atl1c_mii_ioctl> write %x %x",
+- data->reg_num, data->val_in);
+- if (atl1c_write_phy_reg(&adapter->hw,
+- data->reg_num, data->val_in)) {
+- retval = -EIO;
+- goto out;
+- }
+- break;
+-
+- default:
+- retval = -EOPNOTSUPP;
+- break;
+- }
+-out:
+- spin_unlock_irqrestore(&adapter->mdio_lock, flags);
+- return retval;
+-}
+-
+-/*
+- * atl1c_ioctl -
+- * @netdev:
+- * @ifreq:
+- * @cmd:
+- */
+-static int atl1c_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
+-{
+- switch (cmd) {
+- case SIOCGMIIPHY:
+- case SIOCGMIIREG:
+- case SIOCSMIIREG:
+- return atl1c_mii_ioctl(netdev, ifr, cmd);
+- default:
+- return -EOPNOTSUPP;
+- }
+-}
+-
+-/*
+- * atl1c_alloc_queues - Allocate memory for all rings
+- * @adapter: board private structure to initialize
+- *
+- */
+-static int __devinit atl1c_alloc_queues(struct atl1c_adapter *adapter)
+-{
+- return 0;
+-}
+-
+-static void atl1c_set_mac_type(struct atl1c_hw *hw)
+-{
+- switch (hw->device_id) {
+- case PCI_DEVICE_ID_ATTANSIC_L2C:
+- hw->nic_type = athr_l2c;
+- break;
+-
+- case PCI_DEVICE_ID_ATTANSIC_L1C:
+- hw->nic_type = athr_l1c;
+- break;
+-
+- default:
+- break;
+- }
+-}
+-
+-static int atl1c_setup_mac_funcs(struct atl1c_hw *hw)
+-{
+- u32 phy_status_data;
+- u32 link_ctrl_data;
+-
+- atl1c_set_mac_type(hw);
+- AT_READ_REG(hw, REG_PHY_STATUS, &phy_status_data);
+- AT_READ_REG(hw, REG_LINK_CTRL, &link_ctrl_data);
+-
+- hw->ctrl_flags = ATL1C_INTR_CLEAR_ON_READ |
+- ATL1C_INTR_MODRT_ENABLE |
+- ATL1C_RX_IPV6_CHKSUM |
+- ATL1C_TXQ_MODE_ENHANCE;
+- if (link_ctrl_data & LINK_CTRL_L0S_EN)
+- hw->ctrl_flags |= ATL1C_ASPM_L0S_SUPPORT;
+- if (link_ctrl_data & LINK_CTRL_L1_EN)
+- hw->ctrl_flags |= ATL1C_ASPM_L1_SUPPORT;
+-
+- if (hw->nic_type == athr_l1c) {
+- hw->ctrl_flags |= ATL1C_ASPM_CTRL_MON;
+- hw->ctrl_flags |= ATL1C_LINK_CAP_1000M;
+- }
+- return 0;
+-}
+-/*
+- * atl1c_sw_init - Initialize general software structures (struct atl1c_adapter)
+- * @adapter: board private structure to initialize
+- *
+- * atl1c_sw_init initializes the Adapter private data structure.
+- * Fields are initialized based on PCI device information and
+- * OS network device settings (MTU size).
+- */
+-static int __devinit atl1c_sw_init(struct atl1c_adapter *adapter)
+-{
+- struct atl1c_hw *hw = &adapter->hw;
+- struct pci_dev *pdev = adapter->pdev;
+-
+- adapter->wol = 0;
+- adapter->link_speed = SPEED_0;
+- adapter->link_duplex = FULL_DUPLEX;
+- adapter->num_rx_queues = AT_DEF_RECEIVE_QUEUE;
+- adapter->tpd_ring[0].count = 1024;
+- adapter->rfd_ring[0].count = 512;
+-
+- hw->vendor_id = pdev->vendor;
+- hw->device_id = pdev->device;
+- hw->subsystem_vendor_id = pdev->subsystem_vendor;
+- hw->subsystem_id = pdev->subsystem_device;
+-
+- /* before link up, we assume hibernate is true */
+- hw->hibernate = true;
+- hw->media_type = MEDIA_TYPE_AUTO_SENSOR;
+- if (atl1c_setup_mac_funcs(hw) != 0) {
+- dev_err(&pdev->dev, "set mac function pointers failed\n");
+- return -1;
+- }
+- hw->intr_mask = IMR_NORMAL_MASK;
+- hw->phy_configured = false;
+- hw->preamble_len = 7;
+- hw->max_frame_size = adapter->netdev->mtu;
+- if (adapter->num_rx_queues < 2) {
+- hw->rss_type = atl1c_rss_disable;
+- hw->rss_mode = atl1c_rss_mode_disable;
+- } else {
+- hw->rss_type = atl1c_rss_ipv4;
+- hw->rss_mode = atl1c_rss_mul_que_mul_int;
+- hw->rss_hash_bits = 16;
+- }
+- hw->autoneg_advertised = ADVERTISED_Autoneg;
+- hw->indirect_tab = 0xE4E4E4E4;
+- hw->base_cpu = 0;
+-
+- hw->ict = 50000; /* 100ms */
+- hw->smb_timer = 200000; /* 400ms */
+- hw->cmb_tpd = 4;
+- hw->cmb_tx_timer = 1; /* 2 us */
+- hw->rx_imt = 200;
+- hw->tx_imt = 1000;
+-
+- hw->tpd_burst = 5;
+- hw->rfd_burst = 8;
+- hw->dma_order = atl1c_dma_ord_out;
+- hw->dmar_block = atl1c_dma_req_1024;
+- hw->dmaw_block = atl1c_dma_req_1024;
+- hw->dmar_dly_cnt = 15;
+- hw->dmaw_dly_cnt = 4;
+-
+- if (atl1c_alloc_queues(adapter)) {
+- dev_err(&pdev->dev, "Unable to allocate memory for queues\n");
+- return -ENOMEM;
+- }
+- /* TODO */
+- atl1c_set_rxbufsize(adapter, adapter->netdev);
+- atomic_set(&adapter->irq_sem, 1);
+- spin_lock_init(&adapter->mdio_lock);
+- spin_lock_init(&adapter->tx_lock);
+- set_bit(__AT_DOWN, &adapter->flags);
+-
+- return 0;
+-}
+-
+-/*
+- * atl1c_clean_tx_ring - Free Tx-skb
+- * @adapter: board private structure
+- */
+-static void atl1c_clean_tx_ring(struct atl1c_adapter *adapter,
+- enum atl1c_trans_queue type)
+-{
+- struct atl1c_tpd_ring *tpd_ring = &adapter->tpd_ring[type];
+- struct atl1c_buffer *buffer_info;
+- struct pci_dev *pdev = adapter->pdev;
+- u16 index, ring_count;
+-
+- ring_count = tpd_ring->count;
+- for (index = 0; index < ring_count; index++) {
+- buffer_info = &tpd_ring->buffer_info[index];
+- if (buffer_info->state == ATL1_BUFFER_FREE)
+- continue;
+- if (buffer_info->dma)
+- pci_unmap_single(pdev, buffer_info->dma,
+- buffer_info->length,
+- PCI_DMA_TODEVICE);
+- if (buffer_info->skb)
+- dev_kfree_skb(buffer_info->skb);
+- buffer_info->dma = 0;
+- buffer_info->skb = NULL;
+- buffer_info->state = ATL1_BUFFER_FREE;
+- }
+-
+- /* Zero out Tx-buffers */
+- memset(tpd_ring->desc, 0, sizeof(struct atl1c_tpd_desc) *
+- ring_count);
+- atomic_set(&tpd_ring->next_to_clean, 0);
+- tpd_ring->next_to_use = 0;
+-}
+-
+-/*
+- * atl1c_clean_rx_ring - Free rx-reservation skbs
+- * @adapter: board private structure
+- */
+-static void atl1c_clean_rx_ring(struct atl1c_adapter *adapter)
+-{
+- struct atl1c_rfd_ring *rfd_ring = adapter->rfd_ring;
+- struct atl1c_rrd_ring *rrd_ring = adapter->rrd_ring;
+- struct atl1c_buffer *buffer_info;
+- struct pci_dev *pdev = adapter->pdev;
+- int i, j;
+-
+- for (i = 0; i < adapter->num_rx_queues; i++) {
+- for (j = 0; j < rfd_ring[i].count; j++) {
+- buffer_info = &rfd_ring[i].buffer_info[j];
+- if (buffer_info->state == ATL1_BUFFER_FREE)
+- continue;
+- if (buffer_info->dma)
+- pci_unmap_single(pdev, buffer_info->dma,
+- buffer_info->length,
+- PCI_DMA_FROMDEVICE);
+- if (buffer_info->skb)
+- dev_kfree_skb(buffer_info->skb);
+- buffer_info->state = ATL1_BUFFER_FREE;
+- buffer_info->skb = NULL;
+- }
+- /* zero out the descriptor ring */
+- memset(rfd_ring[i].desc, 0, rfd_ring[i].size);
+- rfd_ring[i].next_to_clean = 0;
+- rfd_ring[i].next_to_use = 0;
+- rrd_ring[i].next_to_use = 0;
+- rrd_ring[i].next_to_clean = 0;
+- }
+-}
+-
+-/*
+- * Read / Write Ptr Initialize:
+- */
+-static void atl1c_init_ring_ptrs(struct atl1c_adapter *adapter)
+-{
+- struct atl1c_tpd_ring *tpd_ring = adapter->tpd_ring;
+- struct atl1c_rfd_ring *rfd_ring = adapter->rfd_ring;
+- struct atl1c_rrd_ring *rrd_ring = adapter->rrd_ring;
+- struct atl1c_buffer *buffer_info;
+- int i, j;
+-
+- for (i = 0; i < AT_MAX_TRANSMIT_QUEUE; i++) {
+- tpd_ring[i].next_to_use = 0;
+- atomic_set(&tpd_ring[i].next_to_clean, 0);
+- buffer_info = tpd_ring[i].buffer_info;
+- for (j = 0; j < tpd_ring->count; j++)
+- buffer_info[i].state = ATL1_BUFFER_FREE;
+- }
+- for (i = 0; i < adapter->num_rx_queues; i++) {
+- rfd_ring[i].next_to_use = 0;
+- rfd_ring[i].next_to_clean = 0;
+- rrd_ring[i].next_to_use = 0;
+- rrd_ring[i].next_to_clean = 0;
+- for (j = 0; j < rfd_ring[i].count; j++) {
+- buffer_info = &rfd_ring[i].buffer_info[j];
+- buffer_info->state = ATL1_BUFFER_FREE;
+- }
+- }
+-}
+-
+-/*
+- * atl1c_free_ring_resources - Free Tx / RX descriptor Resources
+- * @adapter: board private structure
+- *
+- * Free all transmit software resources
+- */
+-static void atl1c_free_ring_resources(struct atl1c_adapter *adapter)
+-{
+- struct pci_dev *pdev = adapter->pdev;
+-
+- pci_free_consistent(pdev, adapter->ring_header.size,
+- adapter->ring_header.desc,
+- adapter->ring_header.dma);
+- adapter->ring_header.desc = NULL;
+-
+- /* Note: just free tdp_ring.buffer_info,
+- * it contain rfd_ring.buffer_info, do not double free */
+- if (adapter->tpd_ring[0].buffer_info) {
+- kfree(adapter->tpd_ring[0].buffer_info);
+- adapter->tpd_ring[0].buffer_info = NULL;
+- }
+-}
+-
+-/*
+- * atl1c_setup_mem_resources - allocate Tx / RX descriptor resources
+- * @adapter: board private structure
+- *
+- * Return 0 on success, negative on failure
+- */
+-static int atl1c_setup_ring_resources(struct atl1c_adapter *adapter)
+-{
+- struct pci_dev *pdev = adapter->pdev;
+- struct atl1c_tpd_ring *tpd_ring = adapter->tpd_ring;
+- struct atl1c_rfd_ring *rfd_ring = adapter->rfd_ring;
+- struct atl1c_rrd_ring *rrd_ring = adapter->rrd_ring;
+- struct atl1c_ring_header *ring_header = &adapter->ring_header;
+- int num_rx_queues = adapter->num_rx_queues;
+- int size;
+- int i;
+- int count = 0;
+- int rx_desc_count = 0;
+- u32 offset = 0;
+-
+- rrd_ring[0].count = rfd_ring[0].count;
+- for (i = 1; i < AT_MAX_TRANSMIT_QUEUE; i++)
+- tpd_ring[i].count = tpd_ring[0].count;
+-
+- for (i = 1; i < adapter->num_rx_queues; i++)
+- rfd_ring[i].count = rrd_ring[i].count = rfd_ring[0].count;
+-
+- /* 2 tpd queue, one high priority queue,
+- * another normal priority queue */
+- size = sizeof(struct atl1c_buffer) * (tpd_ring->count * 2 +
+- rfd_ring->count * num_rx_queues);
+- tpd_ring->buffer_info = kzalloc(size, GFP_KERNEL);
+- if (unlikely(!tpd_ring->buffer_info)) {
+- dev_err(&pdev->dev, "kzalloc failed, size = %d\n",
+- size);
+- goto err_nomem;
+- }
+- for (i = 0; i < AT_MAX_TRANSMIT_QUEUE; i++) {
+- tpd_ring[i].buffer_info =
+- (struct atl1c_buffer *) (tpd_ring->buffer_info + count);
+- count += tpd_ring[i].count;
+- }
+-
+- for (i = 0; i < num_rx_queues; i++) {
+- rfd_ring[i].buffer_info =
+- (struct atl1c_buffer *) (tpd_ring->buffer_info + count);
+- count += rfd_ring[i].count;
+- rx_desc_count += rfd_ring[i].count;
+- }
+- /*
+- * real ring DMA buffer
+- * each ring/block may need up to 8 bytes for alignment, hence the
+- * additional bytes tacked onto the end.
+- */
+- ring_header->size = size =
+- sizeof(struct atl1c_tpd_desc) * tpd_ring->count * 2 +
+- sizeof(struct atl1c_rx_free_desc) * rx_desc_count +
+- sizeof(struct atl1c_recv_ret_status) * rx_desc_count +
+- sizeof(struct atl1c_hw_stats) +
+- 8 * 4 + 8 * 2 * num_rx_queues;
+-
+- ring_header->desc = pci_alloc_consistent(pdev, ring_header->size,
+- &ring_header->dma);
+- if (unlikely(!ring_header->desc)) {
+- dev_err(&pdev->dev, "pci_alloc_consistend failed\n");
+- goto err_nomem;
+- }
+- memset(ring_header->desc, 0, ring_header->size);
+- /* init TPD ring */
+-
+- tpd_ring[0].dma = roundup(ring_header->dma, 8);
+- offset = tpd_ring[0].dma - ring_header->dma;
+- for (i = 0; i < AT_MAX_TRANSMIT_QUEUE; i++) {
+- tpd_ring[i].dma = ring_header->dma + offset;
+- tpd_ring[i].desc = (u8 *) ring_header->desc + offset;
+- tpd_ring[i].size =
+- sizeof(struct atl1c_tpd_desc) * tpd_ring[i].count;
+- offset += roundup(tpd_ring[i].size, 8);
+- }
+- /* init RFD ring */
+- for (i = 0; i < num_rx_queues; i++) {
+- rfd_ring[i].dma = ring_header->dma + offset;
+- rfd_ring[i].desc = (u8 *) ring_header->desc + offset;
+- rfd_ring[i].size = sizeof(struct atl1c_rx_free_desc) *
+- rfd_ring[i].count;
+- offset += roundup(rfd_ring[i].size, 8);
+- }
+-
+- /* init RRD ring */
+- for (i = 0; i < num_rx_queues; i++) {
+- rrd_ring[i].dma = ring_header->dma + offset;
+- rrd_ring[i].desc = (u8 *) ring_header->desc + offset;
+- rrd_ring[i].size = sizeof(struct atl1c_recv_ret_status) *
+- rrd_ring[i].count;
+- offset += roundup(rrd_ring[i].size, 8);
+- }
+-
+- adapter->smb.dma = ring_header->dma + offset;
+- adapter->smb.smb = (u8 *)ring_header->desc + offset;
+- return 0;
+-
+-err_nomem:
+- kfree(tpd_ring->buffer_info);
+- return -ENOMEM;
+-}
+-
+-static void atl1c_configure_des_ring(struct atl1c_adapter *adapter)
+-{
+- struct atl1c_hw *hw = &adapter->hw;
+- struct atl1c_rfd_ring *rfd_ring = (struct atl1c_rfd_ring *)
+- adapter->rfd_ring;
+- struct atl1c_rrd_ring *rrd_ring = (struct atl1c_rrd_ring *)
+- adapter->rrd_ring;
+- struct atl1c_tpd_ring *tpd_ring = (struct atl1c_tpd_ring *)
+- adapter->tpd_ring;
+- struct atl1c_cmb *cmb = (struct atl1c_cmb *) &adapter->cmb;
+- struct atl1c_smb *smb = (struct atl1c_smb *) &adapter->smb;
+- int i;
+-
+- /* TPD */
+- AT_WRITE_REG(hw, REG_TX_BASE_ADDR_HI,
+- (u32)((tpd_ring[atl1c_trans_normal].dma &
+- AT_DMA_HI_ADDR_MASK) >> 32));
+- /* just enable normal priority TX queue */
+- AT_WRITE_REG(hw, REG_NTPD_HEAD_ADDR_LO,
+- (u32)(tpd_ring[atl1c_trans_normal].dma &
+- AT_DMA_LO_ADDR_MASK));
+- AT_WRITE_REG(hw, REG_HTPD_HEAD_ADDR_LO,
+- (u32)(tpd_ring[atl1c_trans_high].dma &
+- AT_DMA_LO_ADDR_MASK));
+- AT_WRITE_REG(hw, REG_TPD_RING_SIZE,
+- (u32)(tpd_ring[0].count & TPD_RING_SIZE_MASK));
+-
+-
+- /* RFD */
+- AT_WRITE_REG(hw, REG_RX_BASE_ADDR_HI,
+- (u32)((rfd_ring[0].dma & AT_DMA_HI_ADDR_MASK) >> 32));
+- for (i = 0; i < adapter->num_rx_queues; i++)
+- AT_WRITE_REG(hw, atl1c_rfd_addr_lo_regs[i],
+- (u32)(rfd_ring[i].dma & AT_DMA_LO_ADDR_MASK));
+-
+- AT_WRITE_REG(hw, REG_RFD_RING_SIZE,
+- rfd_ring[0].count & RFD_RING_SIZE_MASK);
+- AT_WRITE_REG(hw, REG_RX_BUF_SIZE,
+- adapter->rx_buffer_len & RX_BUF_SIZE_MASK);
+-
+- /* RRD */
+- for (i = 0; i < adapter->num_rx_queues; i++)
+- AT_WRITE_REG(hw, atl1c_rrd_addr_lo_regs[i],
+- (u32)(rrd_ring[i].dma & AT_DMA_LO_ADDR_MASK));
+- AT_WRITE_REG(hw, REG_RRD_RING_SIZE,
+- (rrd_ring[0].count & RRD_RING_SIZE_MASK));
+-
+- /* CMB */
+- AT_WRITE_REG(hw, REG_CMB_BASE_ADDR_LO, cmb->dma & AT_DMA_LO_ADDR_MASK);
+-
+- /* SMB */
+- AT_WRITE_REG(hw, REG_SMB_BASE_ADDR_HI,
+- (u32)((smb->dma & AT_DMA_HI_ADDR_MASK) >> 32));
+- AT_WRITE_REG(hw, REG_SMB_BASE_ADDR_LO,
+- (u32)(smb->dma & AT_DMA_LO_ADDR_MASK));
+- /* Load all of base address above */
+- AT_WRITE_REG(hw, REG_LOAD_PTR, 1);
+-}
+-
+-static void atl1c_configure_tx(struct atl1c_adapter *adapter)
+-{
+- struct atl1c_hw *hw = &adapter->hw;
+- u32 dev_ctrl_data;
+- u32 max_pay_load;
+- u16 tx_offload_thresh;
+- u32 txq_ctrl_data;
+- u32 extra_size = 0; /* Jumbo frame threshold in QWORD unit */
+-
+- extra_size = ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN;
+- tx_offload_thresh = MAX_TX_OFFLOAD_THRESH;
+- AT_WRITE_REG(hw, REG_TX_TSO_OFFLOAD_THRESH,
+- (tx_offload_thresh >> 3) & TX_TSO_OFFLOAD_THRESH_MASK);
+- AT_READ_REG(hw, REG_DEVICE_CTRL, &dev_ctrl_data);
+- max_pay_load = (dev_ctrl_data >> DEVICE_CTRL_MAX_PAYLOAD_SHIFT) &
+- DEVICE_CTRL_MAX_PAYLOAD_MASK;
+- hw->dmaw_block = min(max_pay_load, hw->dmaw_block);
+- max_pay_load = (dev_ctrl_data >> DEVICE_CTRL_MAX_RREQ_SZ_SHIFT) &
+- DEVICE_CTRL_MAX_RREQ_SZ_MASK;
+- hw->dmar_block = min(max_pay_load, hw->dmar_block);
+-
+- txq_ctrl_data = (hw->tpd_burst & TXQ_NUM_TPD_BURST_MASK) <<
+- TXQ_NUM_TPD_BURST_SHIFT;
+- if (hw->ctrl_flags & ATL1C_TXQ_MODE_ENHANCE)
+- txq_ctrl_data |= TXQ_CTRL_ENH_MODE;
+- txq_ctrl_data |= (atl1c_pay_load_size[hw->dmar_block] &
+- TXQ_TXF_BURST_NUM_MASK) << TXQ_TXF_BURST_NUM_SHIFT;
+-
+- AT_WRITE_REG(hw, REG_TXQ_CTRL, txq_ctrl_data);
+-}
+-
+-static void atl1c_configure_rx(struct atl1c_adapter *adapter)
+-{
+- struct atl1c_hw *hw = &adapter->hw;
+- u32 rxq_ctrl_data;
+-
+- rxq_ctrl_data = (hw->rfd_burst & RXQ_RFD_BURST_NUM_MASK) <<
+- RXQ_RFD_BURST_NUM_SHIFT;
+-
+- if (hw->ctrl_flags & ATL1C_RX_IPV6_CHKSUM)
+- rxq_ctrl_data |= IPV6_CHKSUM_CTRL_EN;
+- if (hw->rss_type == atl1c_rss_ipv4)
+- rxq_ctrl_data |= RSS_HASH_IPV4;
+- if (hw->rss_type == atl1c_rss_ipv4_tcp)
+- rxq_ctrl_data |= RSS_HASH_IPV4_TCP;
+- if (hw->rss_type == atl1c_rss_ipv6)
+- rxq_ctrl_data |= RSS_HASH_IPV6;
+- if (hw->rss_type == atl1c_rss_ipv6_tcp)
+- rxq_ctrl_data |= RSS_HASH_IPV6_TCP;
+- if (hw->rss_type != atl1c_rss_disable)
+- rxq_ctrl_data |= RRS_HASH_CTRL_EN;
+-
+- rxq_ctrl_data |= (hw->rss_mode & RSS_MODE_MASK) <<
+- RSS_MODE_SHIFT;
+- rxq_ctrl_data |= (hw->rss_hash_bits & RSS_HASH_BITS_MASK) <<
+- RSS_HASH_BITS_SHIFT;
+- if (hw->ctrl_flags & ATL1C_ASPM_CTRL_MON)
+- rxq_ctrl_data |= (ASPM_THRUPUT_LIMIT_100M &
+- ASPM_THRUPUT_LIMIT_MASK) << ASPM_THRUPUT_LIMIT_SHIFT;
+-
+- AT_WRITE_REG(hw, REG_RXQ_CTRL, rxq_ctrl_data);
+-}
+-
+-static void atl1c_configure_rss(struct atl1c_adapter *adapter)
+-{
+- struct atl1c_hw *hw = &adapter->hw;
+-
+- AT_WRITE_REG(hw, REG_IDT_TABLE, hw->indirect_tab);
+- AT_WRITE_REG(hw, REG_BASE_CPU_NUMBER, hw->base_cpu);
+-}
+-
+-static void atl1c_configure_dma(struct atl1c_adapter *adapter)
+-{
+- struct atl1c_hw *hw = &adapter->hw;
+- u32 dma_ctrl_data;
+-
+- dma_ctrl_data = DMA_CTRL_DMAR_REQ_PRI;
+- if (hw->ctrl_flags & ATL1C_CMB_ENABLE)
+- dma_ctrl_data |= DMA_CTRL_CMB_EN;
+- if (hw->ctrl_flags & ATL1C_SMB_ENABLE)
+- dma_ctrl_data |= DMA_CTRL_SMB_EN;
+- else
+- dma_ctrl_data |= MAC_CTRL_SMB_DIS;
+-
+- switch (hw->dma_order) {
+- case atl1c_dma_ord_in:
+- dma_ctrl_data |= DMA_CTRL_DMAR_IN_ORDER;
+- break;
+- case atl1c_dma_ord_enh:
+- dma_ctrl_data |= DMA_CTRL_DMAR_ENH_ORDER;
+- break;
+- case atl1c_dma_ord_out:
+- dma_ctrl_data |= DMA_CTRL_DMAR_OUT_ORDER;
+- break;
+- default:
+- break;
+- }
+-
+- dma_ctrl_data |= (((u32)hw->dmar_block) & DMA_CTRL_DMAR_BURST_LEN_MASK)
+- << DMA_CTRL_DMAR_BURST_LEN_SHIFT;
+- dma_ctrl_data |= (((u32)hw->dmaw_block) & DMA_CTRL_DMAW_BURST_LEN_MASK)
+- << DMA_CTRL_DMAW_BURST_LEN_SHIFT;
+- dma_ctrl_data |= (((u32)hw->dmar_dly_cnt) & DMA_CTRL_DMAR_DLY_CNT_MASK)
+- << DMA_CTRL_DMAR_DLY_CNT_SHIFT;
+- dma_ctrl_data |= (((u32)hw->dmaw_dly_cnt) & DMA_CTRL_DMAW_DLY_CNT_MASK)
+- << DMA_CTRL_DMAW_DLY_CNT_SHIFT;
+-
+- AT_WRITE_REG(hw, REG_DMA_CTRL, dma_ctrl_data);
+-}
+-
+-/*
+- * Stop the mac, transmit and receive units
+- * hw - Struct containing variables accessed by shared code
+- * return : 0 or idle status (if error)
+- */
+-static int atl1c_stop_mac(struct atl1c_hw *hw)
+-{
+- u32 data;
+- int timeout;
+-
+- AT_READ_REG(hw, REG_RXQ_CTRL, &data);
+- data &= ~(RXQ1_CTRL_EN | RXQ2_CTRL_EN |
+- RXQ3_CTRL_EN | RXQ_CTRL_EN);
+- AT_WRITE_REG(hw, REG_RXQ_CTRL, data);
+-
+- AT_READ_REG(hw, REG_TXQ_CTRL, &data);
+- data &= ~TXQ_CTRL_EN;
+- AT_WRITE_REG(hw, REG_TWSI_CTRL, data);
+-
+- for (timeout = 0; timeout < AT_HW_MAX_IDLE_DELAY; timeout++) {
+- AT_READ_REG(hw, REG_IDLE_STATUS, &data);
+- if ((data & (IDLE_STATUS_RXQ_NO_IDLE |
+- IDLE_STATUS_TXQ_NO_IDLE)) == 0)
+- break;
+- msleep(1);
+- }
+-
+- AT_READ_REG(hw, REG_MAC_CTRL, &data);
+- data &= ~(MAC_CTRL_TX_EN | MAC_CTRL_RX_EN);
+- AT_WRITE_REG(hw, REG_MAC_CTRL, data);
+-
+- for (timeout = 0; timeout < AT_HW_MAX_IDLE_DELAY; timeout++) {
+- AT_READ_REG(hw, REG_IDLE_STATUS, &data);
+- if ((data & IDLE_STATUS_MASK) == 0)
+- return 0;
+- msleep(1);
+- }
+- return data;
+-}
+-
+-static void atl1c_enable_rx_ctrl(struct atl1c_hw *hw)
+-{
+- u32 data;
+-
+- AT_READ_REG(hw, REG_RXQ_CTRL, &data);
+- switch (hw->adapter->num_rx_queues) {
+- case 4:
+- data |= (RXQ3_CTRL_EN | RXQ2_CTRL_EN | RXQ1_CTRL_EN);
+- break;
+- case 3:
+- data |= (RXQ2_CTRL_EN | RXQ1_CTRL_EN);
+- break;
+- case 2:
+- data |= RXQ1_CTRL_EN;
+- break;
+- default:
+- break;
+- }
+- data |= RXQ_CTRL_EN;
+- AT_WRITE_REG(hw, REG_RXQ_CTRL, data);
+-}
+-
+-static void atl1c_enable_tx_ctrl(struct atl1c_hw *hw)
+-{
+- u32 data;
+-
+- AT_READ_REG(hw, REG_TXQ_CTRL, &data);
+- data |= TXQ_CTRL_EN;
+- AT_WRITE_REG(hw, REG_TXQ_CTRL, data);
+-}
+-
+-/*
+- * Reset the transmit and receive units; mask and clear all interrupts.
+- * hw - Struct containing variables accessed by shared code
+- * return : 0 or idle status (if error)
+- */
+-static int atl1c_reset_mac(struct atl1c_hw *hw)
+-{
+- struct atl1c_adapter *adapter = (struct atl1c_adapter *)hw->adapter;
+- struct pci_dev *pdev = adapter->pdev;
+- u32 idle_status_data = 0;
+- int timeout = 0;
+- int ret;
+-
+- AT_WRITE_REG(hw, REG_IMR, 0);
+- AT_WRITE_REG(hw, REG_ISR, ISR_DIS_INT);
+-
+- ret = atl1c_stop_mac(hw);
+- if (ret)
+- return ret;
+- /*
+- * Issue Soft Reset to the MAC. This will reset the chip's
+- * transmit, receive, DMA. It will not effect
+- * the current PCI configuration. The global reset bit is self-
+- * clearing, and should clear within a microsecond.
+- */
+- AT_WRITE_REGW(hw, REG_MASTER_CTRL, MASTER_CTRL_SOFT_RST);
+- AT_WRITE_FLUSH(hw);
+- msleep(10);
+- /* Wait at least 10ms for All module to be Idle */
+- for (timeout = 0; timeout < AT_HW_MAX_IDLE_DELAY; timeout++) {
+- AT_READ_REG(hw, REG_IDLE_STATUS, &idle_status_data);
+- if ((idle_status_data & IDLE_STATUS_MASK) == 0)
+- break;
+- msleep(1);
+- }
+- if (timeout >= AT_HW_MAX_IDLE_DELAY) {
+- dev_err(&pdev->dev,
+- "MAC state machine cann't be idle since"
+- " disabled for 10ms second\n");
+- return -1;
+- }
+- return 0;
+-}
+-
+-static void atl1c_disable_l0s_l1(struct atl1c_hw *hw)
+-{
+- u32 pm_ctrl_data;
+-
+- AT_READ_REG(hw, REG_PM_CTRL, &pm_ctrl_data);
+- pm_ctrl_data &= ~(PM_CTRL_L1_ENTRY_TIMER_MASK <<
+- PM_CTRL_L1_ENTRY_TIMER_SHIFT);
+- pm_ctrl_data &= ~PM_CTRL_CLK_SWH_L1;
+- pm_ctrl_data &= ~PM_CTRL_ASPM_L0S_EN;
+- pm_ctrl_data &= ~PM_CTRL_ASPM_L1_EN;
+- pm_ctrl_data &= ~PM_CTRL_MAC_ASPM_CHK;
+- pm_ctrl_data &= ~PM_CTRL_SERDES_PD_EX_L1;
+-
+- pm_ctrl_data |= PM_CTRL_SERDES_BUDS_RX_L1_EN;
+- pm_ctrl_data |= PM_CTRL_SERDES_PLL_L1_EN;
+- pm_ctrl_data |= PM_CTRL_SERDES_L1_EN;
+- AT_WRITE_REG(hw, REG_PM_CTRL, pm_ctrl_data);
+-}
+-
+-/*
+- * Set ASPM state.
+- * Enable/disable L0s/L1 depend on link state.
+- */
+-static void atl1c_set_aspm(struct atl1c_hw *hw, bool linkup)
+-{
+- u32 pm_ctrl_data;
+-
+- AT_READ_REG(hw, REG_PM_CTRL, &pm_ctrl_data);
+-
+- pm_ctrl_data &= PM_CTRL_SERDES_PD_EX_L1;
+- pm_ctrl_data |= ~PM_CTRL_SERDES_BUDS_RX_L1_EN;
+- pm_ctrl_data |= ~PM_CTRL_SERDES_L1_EN;
+- pm_ctrl_data &= ~(PM_CTRL_L1_ENTRY_TIMER_MASK <<
+- PM_CTRL_L1_ENTRY_TIMER_SHIFT);
+-
+- pm_ctrl_data |= PM_CTRL_MAC_ASPM_CHK;
+-
+- if (linkup) {
+- pm_ctrl_data |= PM_CTRL_SERDES_PLL_L1_EN;
+- pm_ctrl_data &= ~PM_CTRL_CLK_SWH_L1;
+-
+- if (hw->ctrl_flags & ATL1C_ASPM_L1_SUPPORT) {
+- pm_ctrl_data |= AT_ASPM_L1_TIMER <<
+- PM_CTRL_L1_ENTRY_TIMER_SHIFT;
+- pm_ctrl_data |= PM_CTRL_ASPM_L1_EN;
+- } else
+- pm_ctrl_data &= ~PM_CTRL_ASPM_L1_EN;
+-
+- if (hw->ctrl_flags & ATL1C_ASPM_L0S_SUPPORT)
+- pm_ctrl_data |= PM_CTRL_ASPM_L0S_EN;
+- else
+- pm_ctrl_data &= ~PM_CTRL_ASPM_L0S_EN;
+-
+- } else {
+- pm_ctrl_data &= ~PM_CTRL_ASPM_L0S_EN;
+- pm_ctrl_data &= ~PM_CTRL_SERDES_PLL_L1_EN;
+-
+- pm_ctrl_data |= PM_CTRL_CLK_SWH_L1;
+-
+- if (hw->ctrl_flags & ATL1C_ASPM_L1_SUPPORT)
+- pm_ctrl_data |= PM_CTRL_ASPM_L1_EN;
+- else
+- pm_ctrl_data &= ~PM_CTRL_ASPM_L1_EN;
+- }
+-
+- AT_WRITE_REG(hw, REG_PM_CTRL, pm_ctrl_data);
+-}
+-
+-static void atl1c_setup_mac_ctrl(struct atl1c_adapter *adapter)
+-{
+- struct atl1c_hw *hw = &adapter->hw;
+- struct net_device *netdev = adapter->netdev;
+- u32 mac_ctrl_data;
+-
+- mac_ctrl_data = MAC_CTRL_TX_EN | MAC_CTRL_RX_EN;
+- mac_ctrl_data |= (MAC_CTRL_TX_FLOW | MAC_CTRL_RX_FLOW);
+-
+- if (adapter->link_duplex == FULL_DUPLEX) {
+- hw->mac_duplex = true;
+- mac_ctrl_data |= MAC_CTRL_DUPLX;
+- }
+-
+- if (adapter->link_speed == SPEED_1000)
+- hw->mac_speed = atl1c_mac_speed_1000;
+- else
+- hw->mac_speed = atl1c_mac_speed_10_100;
+-
+- mac_ctrl_data |= (hw->mac_speed & MAC_CTRL_SPEED_MASK) <<
+- MAC_CTRL_SPEED_SHIFT;
+-
+- mac_ctrl_data |= (MAC_CTRL_ADD_CRC | MAC_CTRL_PAD);
+- mac_ctrl_data |= ((hw->preamble_len & MAC_CTRL_PRMLEN_MASK) <<
+- MAC_CTRL_PRMLEN_SHIFT);
+-
+- if (adapter->vlgrp)
+- mac_ctrl_data |= MAC_CTRL_RMV_VLAN;
+-
+- mac_ctrl_data |= MAC_CTRL_BC_EN;
+- if (netdev->flags & IFF_PROMISC)
+- mac_ctrl_data |= MAC_CTRL_PROMIS_EN;
+- if (netdev->flags & IFF_ALLMULTI)
+- mac_ctrl_data |= MAC_CTRL_MC_ALL_EN;
+-
+- mac_ctrl_data |= MAC_CTRL_SINGLE_PAUSE_EN;
+- AT_WRITE_REG(hw, REG_MAC_CTRL, mac_ctrl_data);
+-}
+-
+-/*
+- * atl1c_configure - Configure Transmit&Receive Unit after Reset
+- * @adapter: board private structure
+- *
+- * Configure the Tx /Rx unit of the MAC after a reset.
+- */
+-static int atl1c_configure(struct atl1c_adapter *adapter)
+-{
+- struct atl1c_hw *hw = &adapter->hw;
+- u32 master_ctrl_data = 0;
+- u32 intr_modrt_data;
+-
+- /* clear interrupt status */
+- AT_WRITE_REG(hw, REG_ISR, 0xFFFFFFFF);
+- /* Clear any WOL status */
+- AT_WRITE_REG(hw, REG_WOL_CTRL, 0);
+- /* set Interrupt Clear Timer
+- * HW will enable self to assert interrupt event to system after
+- * waiting x-time for software to notify it accept interrupt.
+- */
+- AT_WRITE_REG(hw, REG_INT_RETRIG_TIMER,
+- hw->ict & INT_RETRIG_TIMER_MASK);
+-
+- atl1c_configure_des_ring(adapter);
+-
+- if (hw->ctrl_flags & ATL1C_INTR_MODRT_ENABLE) {
+- intr_modrt_data = (hw->tx_imt & IRQ_MODRT_TIMER_MASK) <<
+- IRQ_MODRT_TX_TIMER_SHIFT;
+- intr_modrt_data |= (hw->rx_imt & IRQ_MODRT_TIMER_MASK) <<
+- IRQ_MODRT_RX_TIMER_SHIFT;
+- AT_WRITE_REG(hw, REG_IRQ_MODRT_TIMER_INIT, intr_modrt_data);
+- master_ctrl_data |=
+- MASTER_CTRL_TX_ITIMER_EN | MASTER_CTRL_RX_ITIMER_EN;
+- }
+-
+- if (hw->ctrl_flags & ATL1C_INTR_CLEAR_ON_READ)
+- master_ctrl_data |= MASTER_CTRL_INT_RDCLR;
+-
+- AT_WRITE_REG(hw, REG_MASTER_CTRL, master_ctrl_data);
+-
+- if (hw->ctrl_flags & ATL1C_CMB_ENABLE) {
+- AT_WRITE_REG(hw, REG_CMB_TPD_THRESH,
+- hw->cmb_tpd & CMB_TPD_THRESH_MASK);
+- AT_WRITE_REG(hw, REG_CMB_TX_TIMER,
+- hw->cmb_tx_timer & CMB_TX_TIMER_MASK);
+- }
+-
+- if (hw->ctrl_flags & ATL1C_SMB_ENABLE)
+- AT_WRITE_REG(hw, REG_SMB_STAT_TIMER,
+- hw->smb_timer & SMB_STAT_TIMER_MASK);
+- /* set MTU */
+- AT_WRITE_REG(hw, REG_MTU, hw->max_frame_size + ETH_HLEN +
+- VLAN_HLEN + ETH_FCS_LEN);
+- /* HDS, disable */
+- AT_WRITE_REG(hw, REG_HDS_CTRL, 0);
+-
+- atl1c_configure_tx(adapter);
+- atl1c_configure_rx(adapter);
+- atl1c_configure_rss(adapter);
+- atl1c_configure_dma(adapter);
+-
+- return 0;
+-}
+-
+-static void atl1c_update_hw_stats(struct atl1c_adapter *adapter)
+-{
+- u16 hw_reg_addr = 0;
+- unsigned long *stats_item = NULL;
+- u32 data;
+-
+- /* update rx status */
+- hw_reg_addr = REG_MAC_RX_STATUS_BIN;
+- stats_item = &adapter->hw_stats.rx_ok;
+- while (hw_reg_addr <= REG_MAC_RX_STATUS_END) {
+- AT_READ_REG(&adapter->hw, hw_reg_addr, &data);
+- *stats_item += data;
+- stats_item++;
+- hw_reg_addr += 4;
+- }
+-/* update tx status */
+- hw_reg_addr = REG_MAC_TX_STATUS_BIN;
+- stats_item = &adapter->hw_stats.tx_ok;
+- while (hw_reg_addr <= REG_MAC_TX_STATUS_END) {
+- AT_READ_REG(&adapter->hw, hw_reg_addr, &data);
+- *stats_item += data;
+- stats_item++;
+- hw_reg_addr += 4;
+- }
+-}
+-
+-/*
+- * atl1c_get_stats - Get System Network Statistics
+- * @netdev: network interface device structure
+- *
+- * Returns the address of the device statistics structure.
+- * The statistics are actually updated from the timer callback.
+- */
+-static struct net_device_stats *atl1c_get_stats(struct net_device *netdev)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+- struct atl1c_hw_stats *hw_stats = &adapter->hw_stats;
+- struct net_device_stats *net_stats = &adapter->net_stats;
+-
+- atl1c_update_hw_stats(adapter);
+- net_stats->rx_packets = hw_stats->rx_ok;
+- net_stats->tx_packets = hw_stats->tx_ok;
+- net_stats->rx_bytes = hw_stats->rx_byte_cnt;
+- net_stats->tx_bytes = hw_stats->tx_byte_cnt;
+- net_stats->multicast = hw_stats->rx_mcast;
+- net_stats->collisions = hw_stats->tx_1_col +
+- hw_stats->tx_2_col * 2 +
+- hw_stats->tx_late_col + hw_stats->tx_abort_col;
+- net_stats->rx_errors = hw_stats->rx_frag + hw_stats->rx_fcs_err +
+- hw_stats->rx_len_err + hw_stats->rx_sz_ov +
+- hw_stats->rx_rrd_ov + hw_stats->rx_align_err;
+- net_stats->rx_fifo_errors = hw_stats->rx_rxf_ov;
+- net_stats->rx_length_errors = hw_stats->rx_len_err;
+- net_stats->rx_crc_errors = hw_stats->rx_fcs_err;
+- net_stats->rx_frame_errors = hw_stats->rx_align_err;
+- net_stats->rx_over_errors = hw_stats->rx_rrd_ov + hw_stats->rx_rxf_ov;
+-
+- net_stats->rx_missed_errors = hw_stats->rx_rrd_ov + hw_stats->rx_rxf_ov;
+-
+- net_stats->tx_errors = hw_stats->tx_late_col + hw_stats->tx_abort_col +
+- hw_stats->tx_underrun + hw_stats->tx_trunc;
+- net_stats->tx_fifo_errors = hw_stats->tx_underrun;
+- net_stats->tx_aborted_errors = hw_stats->tx_abort_col;
+- net_stats->tx_window_errors = hw_stats->tx_late_col;
+-
+- return &adapter->net_stats;
+-}
+-
+-static inline void atl1c_clear_phy_int(struct atl1c_adapter *adapter)
+-{
+- u16 phy_data;
+-
+- spin_lock(&adapter->mdio_lock);
+- atl1c_read_phy_reg(&adapter->hw, MII_ISR, &phy_data);
+- spin_unlock(&adapter->mdio_lock);
+-}
+-
+-static bool atl1c_clean_tx_irq(struct atl1c_adapter *adapter,
+- enum atl1c_trans_queue type)
+-{
+- struct atl1c_tpd_ring *tpd_ring = (struct atl1c_tpd_ring *)
+- &adapter->tpd_ring[type];
+- struct atl1c_buffer *buffer_info;
+- u16 next_to_clean = atomic_read(&tpd_ring->next_to_clean);
+- u16 hw_next_to_clean;
+- u16 shift;
+- u32 data;
+-
+- if (type == atl1c_trans_high)
+- shift = MB_HTPD_CONS_IDX_SHIFT;
+- else
+- shift = MB_NTPD_CONS_IDX_SHIFT;
+-
+- AT_READ_REG(&adapter->hw, REG_MB_PRIO_CONS_IDX, &data);
+- hw_next_to_clean = (data >> shift) & MB_PRIO_PROD_IDX_MASK;
+-
+- while (next_to_clean != hw_next_to_clean) {
+- buffer_info = &tpd_ring->buffer_info[next_to_clean];
+- if (buffer_info->state == ATL1_BUFFER_BUSY) {
+- pci_unmap_page(adapter->pdev, buffer_info->dma,
+- buffer_info->length, PCI_DMA_TODEVICE);
+- buffer_info->dma = 0;
+- if (buffer_info->skb) {
+- dev_kfree_skb_irq(buffer_info->skb);
+- buffer_info->skb = NULL;
+- }
+- buffer_info->state = ATL1_BUFFER_FREE;
+- }
+- if (++next_to_clean == tpd_ring->count)
+- next_to_clean = 0;
+- atomic_set(&tpd_ring->next_to_clean, next_to_clean);
+- }
+-
+- if (netif_queue_stopped(adapter->netdev) &&
+- netif_carrier_ok(adapter->netdev)) {
+- netif_wake_queue(adapter->netdev);
+- }
+-
+- return true;
+-}
+-
+-/*
+- * atl1c_intr - Interrupt Handler
+- * @irq: interrupt number
+- * @data: pointer to a network interface device structure
+- * @pt_regs: CPU registers structure
+- */
+-static irqreturn_t atl1c_intr(int irq, void *data)
+-{
+- struct net_device *netdev = data;
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+- struct pci_dev *pdev = adapter->pdev;
+- struct atl1c_hw *hw = &adapter->hw;
+- int max_ints = AT_MAX_INT_WORK;
+- int handled = IRQ_NONE;
+- u32 status;
+- u32 reg_data;
+-
+- do {
+- AT_READ_REG(hw, REG_ISR, &reg_data);
+- status = reg_data & hw->intr_mask;
+-
+- if (status == 0 || (status & ISR_DIS_INT) != 0) {
+- if (max_ints != AT_MAX_INT_WORK)
+- handled = IRQ_HANDLED;
+- break;
+- }
+- /* link event */
+- if (status & ISR_GPHY)
+- atl1c_clear_phy_int(adapter);
+- /* Ack ISR */
+- AT_WRITE_REG(hw, REG_ISR, status | ISR_DIS_INT);
+- if (status & ISR_RX_PKT) {
+- if (likely(napi_schedule_prep(&adapter->napi))) {
+- hw->intr_mask &= ~ISR_RX_PKT;
+- AT_WRITE_REG(hw, REG_IMR, hw->intr_mask);
+- __napi_schedule(&adapter->napi);
+- }
+- }
+- if (status & ISR_TX_PKT)
+- atl1c_clean_tx_irq(adapter, atl1c_trans_normal);
+-
+- handled = IRQ_HANDLED;
+- /* check if PCIE PHY Link down */
+- if (status & ISR_ERROR) {
+- if (netif_msg_hw(adapter))
+- dev_err(&pdev->dev,
+- "atl1c hardware error (status = 0x%x)\n",
+- status & ISR_ERROR);
+- /* reset MAC */
+- hw->intr_mask &= ~ISR_ERROR;
+- AT_WRITE_REG(hw, REG_IMR, hw->intr_mask);
+- schedule_work(&adapter->reset_task);
+- break;
+- }
+-
+- if (status & ISR_OVER)
+- if (netif_msg_intr(adapter))
+- dev_warn(&pdev->dev,
+- "TX/RX over flow (status = 0x%x)\n",
+- status & ISR_OVER);
+-
+- /* link event */
+- if (status & (ISR_GPHY | ISR_MANUAL)) {
+- adapter->net_stats.tx_carrier_errors++;
+- atl1c_link_chg_event(adapter);
+- break;
+- }
+-
+- } while (--max_ints > 0);
+- /* re-enable Interrupt*/
+- AT_WRITE_REG(&adapter->hw, REG_ISR, 0);
+- return handled;
+-}
+-
+-static inline void atl1c_rx_checksum(struct atl1c_adapter *adapter,
+- struct sk_buff *skb, struct atl1c_recv_ret_status *prrs)
+-{
+- /*
+- * The pid field in RRS in not correct sometimes, so we
+- * cannot figure out if the packet is fragmented or not,
+- * so we tell the KERNEL CHECKSUM_NONE
+- */
+- skb->ip_summed = CHECKSUM_NONE;
+-}
+-
+-static int atl1c_alloc_rx_buffer(struct atl1c_adapter *adapter, const int ringid)
+-{
+- struct atl1c_rfd_ring *rfd_ring = &adapter->rfd_ring[ringid];
+- struct pci_dev *pdev = adapter->pdev;
+- struct atl1c_buffer *buffer_info, *next_info;
+- struct sk_buff *skb;
+- void *vir_addr = NULL;
+- u16 num_alloc = 0;
+- u16 rfd_next_to_use, next_next;
+- struct atl1c_rx_free_desc *rfd_desc;
+-
+- next_next = rfd_next_to_use = rfd_ring->next_to_use;
+- if (++next_next == rfd_ring->count)
+- next_next = 0;
+- buffer_info = &rfd_ring->buffer_info[rfd_next_to_use];
+- next_info = &rfd_ring->buffer_info[next_next];
+-
+- while (next_info->state == ATL1_BUFFER_FREE) {
+- rfd_desc = ATL1C_RFD_DESC(rfd_ring, rfd_next_to_use);
+-
+- skb = dev_alloc_skb(adapter->rx_buffer_len);
+- if (unlikely(!skb)) {
+- if (netif_msg_rx_err(adapter))
+- dev_warn(&pdev->dev, "alloc rx buffer failed\n");
+- break;
+- }
+-
+- /*
+- * Make buffer alignment 2 beyond a 16 byte boundary
+- * this will result in a 16 byte aligned IP header after
+- * the 14 byte MAC header is removed
+- */
+- vir_addr = skb->data;
+- buffer_info->state = ATL1_BUFFER_BUSY;
+- buffer_info->skb = skb;
+- buffer_info->length = adapter->rx_buffer_len;
+- buffer_info->dma = pci_map_single(pdev, vir_addr,
+- buffer_info->length,
+- PCI_DMA_FROMDEVICE);
+- rfd_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
+- rfd_next_to_use = next_next;
+- if (++next_next == rfd_ring->count)
+- next_next = 0;
+- buffer_info = &rfd_ring->buffer_info[rfd_next_to_use];
+- next_info = &rfd_ring->buffer_info[next_next];
+- num_alloc++;
+- }
+-
+- if (num_alloc) {
+- /* TODO: update mailbox here */
+- wmb();
+- rfd_ring->next_to_use = rfd_next_to_use;
+- AT_WRITE_REG(&adapter->hw, atl1c_rfd_prod_idx_regs[ringid],
+- rfd_ring->next_to_use & MB_RFDX_PROD_IDX_MASK);
+- }
+-
+- return num_alloc;
+-}
+-
+-static void atl1c_clean_rrd(struct atl1c_rrd_ring *rrd_ring,
+- struct atl1c_recv_ret_status *rrs, u16 num)
+-{
+- u16 i;
+- /* the relationship between rrd and rfd is one map one */
+- for (i = 0; i < num; i++, rrs = ATL1C_RRD_DESC(rrd_ring,
+- rrd_ring->next_to_clean)) {
+- rrs->word3 &= ~RRS_RXD_UPDATED;
+- if (++rrd_ring->next_to_clean == rrd_ring->count)
+- rrd_ring->next_to_clean = 0;
+- }
+-}
+-
+-static void atl1c_clean_rfd(struct atl1c_rfd_ring *rfd_ring,
+- struct atl1c_recv_ret_status *rrs, u16 num)
+-{
+- u16 i;
+- u16 rfd_index;
+- struct atl1c_buffer *buffer_info = rfd_ring->buffer_info;
+-
+- rfd_index = (rrs->word0 >> RRS_RX_RFD_INDEX_SHIFT) &
+- RRS_RX_RFD_INDEX_MASK;
+- for (i = 0; i < num; i++) {
+- buffer_info[rfd_index].skb = NULL;
+- buffer_info[rfd_index].state = ATL1_BUFFER_FREE;
+- if (++rfd_index == rfd_ring->count)
+- rfd_index = 0;
+- }
+- rfd_ring->next_to_clean = rfd_index;
+-}
+-
+-static void atl1c_clean_rx_irq(struct atl1c_adapter *adapter, u8 que,
+- int *work_done, int work_to_do)
+-{
+- u16 rfd_num, rfd_index;
+- u16 count = 0;
+- u16 length;
+- struct pci_dev *pdev = adapter->pdev;
+- struct net_device *netdev = adapter->netdev;
+- struct atl1c_rfd_ring *rfd_ring = &adapter->rfd_ring[que];
+- struct atl1c_rrd_ring *rrd_ring = &adapter->rrd_ring[que];
+- struct sk_buff *skb;
+- struct atl1c_recv_ret_status *rrs;
+- struct atl1c_buffer *buffer_info;
+-
+- while (1) {
+- if (*work_done >= work_to_do)
+- break;
+- rrs = ATL1C_RRD_DESC(rrd_ring, rrd_ring->next_to_clean);
+- if (likely(RRS_RXD_IS_VALID(rrs->word3))) {
+- rfd_num = (rrs->word0 >> RRS_RX_RFD_CNT_SHIFT) &
+- RRS_RX_RFD_CNT_MASK;
+- if (unlikely(rfd_num) != 1)
+- /* TODO support mul rfd*/
+- if (netif_msg_rx_err(adapter))
+- dev_warn(&pdev->dev,
+- "Multi rfd not support yet!\n");
+- goto rrs_checked;
+- } else {
+- break;
+- }
+-rrs_checked:
+- atl1c_clean_rrd(rrd_ring, rrs, rfd_num);
+- if (rrs->word3 & (RRS_RX_ERR_SUM | RRS_802_3_LEN_ERR)) {
+- atl1c_clean_rfd(rfd_ring, rrs, rfd_num);
+- if (netif_msg_rx_err(adapter))
+- dev_warn(&pdev->dev,
+- "wrong packet! rrs word3 is %x\n",
+- rrs->word3);
+- continue;
+- }
+-
+- length = le16_to_cpu((rrs->word3 >> RRS_PKT_SIZE_SHIFT) &
+- RRS_PKT_SIZE_MASK);
+- /* Good Receive */
+- if (likely(rfd_num == 1)) {
+- rfd_index = (rrs->word0 >> RRS_RX_RFD_INDEX_SHIFT) &
+- RRS_RX_RFD_INDEX_MASK;
+- buffer_info = &rfd_ring->buffer_info[rfd_index];
+- pci_unmap_single(pdev, buffer_info->dma,
+- buffer_info->length, PCI_DMA_FROMDEVICE);
+- skb = buffer_info->skb;
+- } else {
+- /* TODO */
+- if (netif_msg_rx_err(adapter))
+- dev_warn(&pdev->dev,
+- "Multi rfd not support yet!\n");
+- break;
+- }
+- atl1c_clean_rfd(rfd_ring, rrs, rfd_num);
+- skb_put(skb, length - ETH_FCS_LEN);
+- skb->protocol = eth_type_trans(skb, netdev);
+- skb->dev = netdev;
+- atl1c_rx_checksum(adapter, skb, rrs);
+- if (unlikely(adapter->vlgrp) && rrs->word3 & RRS_VLAN_INS) {
+- u16 vlan;
+-
+- AT_TAG_TO_VLAN(rrs->vlan_tag, vlan);
+- vlan = le16_to_cpu(vlan);
+- vlan_hwaccel_receive_skb(skb, adapter->vlgrp, vlan);
+- } else
+- netif_receive_skb(skb);
+-
+- netdev->last_rx = jiffies;
+- (*work_done)++;
+- count++;
+- }
+- if (count)
+- atl1c_alloc_rx_buffer(adapter, que);
+-}
+-
+-/*
+- * atl1c_clean - NAPI Rx polling callback
+- * @adapter: board private structure
+- */
+-static int atl1c_clean(struct napi_struct *napi, int budget)
+-{
+- struct atl1c_adapter *adapter =
+- container_of(napi, struct atl1c_adapter, napi);
+- int work_done = 0;
+-
+- /* Keep link state information with original netdev */
+- if (!netif_carrier_ok(adapter->netdev))
+- goto quit_polling;
+- /* just enable one RXQ */
+- atl1c_clean_rx_irq(adapter, 0, &work_done, budget);
+-
+- if (work_done < budget) {
+-quit_polling:
+- napi_complete(napi);
+- adapter->hw.intr_mask |= ISR_RX_PKT;
+- AT_WRITE_REG(&adapter->hw, REG_IMR, adapter->hw.intr_mask);
+- }
+- return work_done;
+-}
+-
+-#ifdef CONFIG_NET_POLL_CONTROLLER
+-
+-/*
+- * Polling 'interrupt' - used by things like netconsole to send skbs
+- * without having to re-enable interrupts. It's not called while
+- * the interrupt routine is executing.
+- */
+-static void atl1c_netpoll(struct net_device *netdev)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+-
+- disable_irq(adapter->pdev->irq);
+- atl1c_intr(adapter->pdev->irq, netdev);
+- enable_irq(adapter->pdev->irq);
+-}
+-#endif
+-
+-static inline u16 atl1c_tpd_avail(struct atl1c_adapter *adapter, enum atl1c_trans_queue type)
+-{
+- struct atl1c_tpd_ring *tpd_ring = &adapter->tpd_ring[type];
+- u16 next_to_use = 0;
+- u16 next_to_clean = 0;
+-
+- next_to_clean = atomic_read(&tpd_ring->next_to_clean);
+- next_to_use = tpd_ring->next_to_use;
+-
+- return (u16)(next_to_clean > next_to_use) ?
+- (next_to_clean - next_to_use - 1) :
+- (tpd_ring->count + next_to_clean - next_to_use - 1);
+-}
+-
+-/*
+- * get next usable tpd
+- * Note: should call atl1c_tdp_avail to make sure
+- * there is enough tpd to use
+- */
+-static struct atl1c_tpd_desc *atl1c_get_tpd(struct atl1c_adapter *adapter,
+- enum atl1c_trans_queue type)
+-{
+- struct atl1c_tpd_ring *tpd_ring = &adapter->tpd_ring[type];
+- struct atl1c_tpd_desc *tpd_desc;
+- u16 next_to_use = 0;
+-
+- next_to_use = tpd_ring->next_to_use;
+- if (++tpd_ring->next_to_use == tpd_ring->count)
+- tpd_ring->next_to_use = 0;
+- tpd_desc = ATL1C_TPD_DESC(tpd_ring, next_to_use);
+- memset(tpd_desc, 0, sizeof(struct atl1c_tpd_desc));
+- return tpd_desc;
+-}
+-
+-static struct atl1c_buffer *
+-atl1c_get_tx_buffer(struct atl1c_adapter *adapter, struct atl1c_tpd_desc *tpd)
+-{
+- struct atl1c_tpd_ring *tpd_ring = adapter->tpd_ring;
+-
+- return &tpd_ring->buffer_info[tpd -
+- (struct atl1c_tpd_desc *)tpd_ring->desc];
+-}
+-
+-/* Calculate the transmit packet descript needed*/
+-static u16 atl1c_cal_tpd_req(const struct sk_buff *skb)
+-{
+- u16 tpd_req;
+- u16 proto_hdr_len = 0;
+-
+- tpd_req = skb_shinfo(skb)->nr_frags + 1;
+-
+- if (skb_is_gso(skb)) {
+- proto_hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
+- if (proto_hdr_len < skb_headlen(skb))
+- tpd_req++;
+- if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6)
+- tpd_req++;
+- }
+- return tpd_req;
+-}
+-
+-static int atl1c_tso_csum(struct atl1c_adapter *adapter,
+- struct sk_buff *skb,
+- struct atl1c_tpd_desc **tpd,
+- enum atl1c_trans_queue type)
+-{
+- struct pci_dev *pdev = adapter->pdev;
+- u8 hdr_len;
+- u32 real_len;
+- unsigned short offload_type;
+- int err;
+-
+- if (skb_is_gso(skb)) {
+- if (skb_header_cloned(skb)) {
+- err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
+- if (unlikely(err))
+- return -1;
+- }
+- offload_type = skb_shinfo(skb)->gso_type;
+-
+- if (offload_type & SKB_GSO_TCPV4) {
+- real_len = (((unsigned char *)ip_hdr(skb) - skb->data)
+- + ntohs(ip_hdr(skb)->tot_len));
+-
+- if (real_len < skb->len)
+- pskb_trim(skb, real_len);
+-
+- hdr_len = (skb_transport_offset(skb) + tcp_hdrlen(skb));
+- if (unlikely(skb->len == hdr_len)) {
+- /* only xsum need */
+- if (netif_msg_tx_queued(adapter))
+- dev_warn(&pdev->dev,
+- "IPV4 tso with zero data??\n");
+- goto check_sum;
+- } else {
+- ip_hdr(skb)->check = 0;
+- tcp_hdr(skb)->check = ~csum_tcpudp_magic(
+- ip_hdr(skb)->saddr,
+- ip_hdr(skb)->daddr,
+- 0, IPPROTO_TCP, 0);
+- (*tpd)->word1 |= 1 << TPD_IPV4_PACKET_SHIFT;
+- }
+- }
+-
+- if (offload_type & SKB_GSO_TCPV6) {
+- struct atl1c_tpd_ext_desc *etpd =
+- *(struct atl1c_tpd_ext_desc **)(tpd);
+-
+- memset(etpd, 0, sizeof(struct atl1c_tpd_ext_desc));
+- *tpd = atl1c_get_tpd(adapter, type);
+- ipv6_hdr(skb)->payload_len = 0;
+- /* check payload == 0 byte ? */
+- hdr_len = (skb_transport_offset(skb) + tcp_hdrlen(skb));
+- if (unlikely(skb->len == hdr_len)) {
+- /* only xsum need */
+- if (netif_msg_tx_queued(adapter))
+- dev_warn(&pdev->dev,
+- "IPV6 tso with zero data??\n");
+- goto check_sum;
+- } else
+- tcp_hdr(skb)->check = ~csum_ipv6_magic(
+- &ipv6_hdr(skb)->saddr,
+- &ipv6_hdr(skb)->daddr,
+- 0, IPPROTO_TCP, 0);
+- etpd->word1 |= 1 << TPD_LSO_EN_SHIFT;
+- etpd->word1 |= 1 << TPD_LSO_VER_SHIFT;
+- etpd->pkt_len = cpu_to_le32(skb->len);
+- (*tpd)->word1 |= 1 << TPD_LSO_VER_SHIFT;
+- }
+-
+- (*tpd)->word1 |= 1 << TPD_LSO_EN_SHIFT;
+- (*tpd)->word1 |= (skb_transport_offset(skb) & TPD_TCPHDR_OFFSET_MASK) <<
+- TPD_TCPHDR_OFFSET_SHIFT;
+- (*tpd)->word1 |= (skb_shinfo(skb)->gso_size & TPD_MSS_MASK) <<
+- TPD_MSS_SHIFT;
+- return 0;
+- }
+-
+-check_sum:
+- if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) {
+- u8 css, cso;
+- cso = skb_transport_offset(skb);
+-
+- if (unlikely(cso & 0x1)) {
+- if (netif_msg_tx_err(adapter))
+- dev_err(&adapter->pdev->dev,
+- "payload offset should not an event number\n");
+- return -1;
+- } else {
+- css = cso + skb->csum_offset;
+-
+- (*tpd)->word1 |= ((cso >> 1) & TPD_PLOADOFFSET_MASK) <<
+- TPD_PLOADOFFSET_SHIFT;
+- (*tpd)->word1 |= ((css >> 1) & TPD_CCSUM_OFFSET_MASK) <<
+- TPD_CCSUM_OFFSET_SHIFT;
+- (*tpd)->word1 |= 1 << TPD_CCSUM_EN_SHIFT;
+- }
+- }
+- return 0;
+-}
+-
+-static void atl1c_tx_map(struct atl1c_adapter *adapter,
+- struct sk_buff *skb, struct atl1c_tpd_desc *tpd,
+- enum atl1c_trans_queue type)
+-{
+- struct atl1c_tpd_desc *use_tpd = NULL;
+- struct atl1c_buffer *buffer_info = NULL;
+- u16 buf_len = skb_headlen(skb);
+- u16 map_len = 0;
+- u16 mapped_len = 0;
+- u16 hdr_len = 0;
+- u16 nr_frags;
+- u16 f;
+- int tso;
+-
+- nr_frags = skb_shinfo(skb)->nr_frags;
+- tso = (tpd->word1 >> TPD_LSO_EN_SHIFT) & TPD_LSO_EN_MASK;
+- if (tso) {
+- /* TSO */
+- map_len = hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
+- use_tpd = tpd;
+-
+- buffer_info = atl1c_get_tx_buffer(adapter, use_tpd);
+- buffer_info->length = map_len;
+- buffer_info->dma = pci_map_single(adapter->pdev,
+- skb->data, hdr_len, PCI_DMA_TODEVICE);
+- buffer_info->state = ATL1_BUFFER_BUSY;
+- mapped_len += map_len;
+- use_tpd->buffer_addr = cpu_to_le64(buffer_info->dma);
+- use_tpd->buffer_len = cpu_to_le16(buffer_info->length);
+- }
+-
+- if (mapped_len < buf_len) {
+- /* mapped_len == 0, means we should use the first tpd,
+- which is given by caller */
+- if (mapped_len == 0)
+- use_tpd = tpd;
+- else {
+- use_tpd = atl1c_get_tpd(adapter, type);
+- memcpy(use_tpd, tpd, sizeof(struct atl1c_tpd_desc));
+- use_tpd = atl1c_get_tpd(adapter, type);
+- memcpy(use_tpd, tpd, sizeof(struct atl1c_tpd_desc));
+- }
+- buffer_info = atl1c_get_tx_buffer(adapter, use_tpd);
+- buffer_info->length = buf_len - mapped_len;
+- buffer_info->dma =
+- pci_map_single(adapter->pdev, skb->data + mapped_len,
+- buffer_info->length, PCI_DMA_TODEVICE);
+- buffer_info->state = ATL1_BUFFER_BUSY;
+-
+- use_tpd->buffer_addr = cpu_to_le64(buffer_info->dma);
+- use_tpd->buffer_len = cpu_to_le16(buffer_info->length);
+- }
+-
+- for (f = 0; f < nr_frags; f++) {
+- struct skb_frag_struct *frag;
+-
+- frag = &skb_shinfo(skb)->frags[f];
+-
+- use_tpd = atl1c_get_tpd(adapter, type);
+- memcpy(use_tpd, tpd, sizeof(struct atl1c_tpd_desc));
+-
+- buffer_info = atl1c_get_tx_buffer(adapter, use_tpd);
+- buffer_info->length = frag->size;
+- buffer_info->dma =
+- pci_map_page(adapter->pdev, frag->page,
+- frag->page_offset,
+- buffer_info->length,
+- PCI_DMA_TODEVICE);
+- buffer_info->state = ATL1_BUFFER_BUSY;
+-
+- use_tpd->buffer_addr = cpu_to_le64(buffer_info->dma);
+- use_tpd->buffer_len = cpu_to_le16(buffer_info->length);
+- }
+-
+- /* The last tpd */
+- use_tpd->word1 |= 1 << TPD_EOP_SHIFT;
+- /* The last buffer info contain the skb address,
+- so it will be free after unmap */
+- buffer_info->skb = skb;
+-}
+-
+-static void atl1c_tx_queue(struct atl1c_adapter *adapter, struct sk_buff *skb,
+- struct atl1c_tpd_desc *tpd, enum atl1c_trans_queue type)
+-{
+- struct atl1c_tpd_ring *tpd_ring = &adapter->tpd_ring[type];
+- u32 prod_data;
+-
+- AT_READ_REG(&adapter->hw, REG_MB_PRIO_PROD_IDX, &prod_data);
+- switch (type) {
+- case atl1c_trans_high:
+- prod_data &= 0xFFFF0000;
+- prod_data |= tpd_ring->next_to_use & 0xFFFF;
+- break;
+- case atl1c_trans_normal:
+- prod_data &= 0x0000FFFF;
+- prod_data |= (tpd_ring->next_to_use & 0xFFFF) << 16;
+- break;
+- default:
+- break;
+- }
+- wmb();
+- AT_WRITE_REG(&adapter->hw, REG_MB_PRIO_PROD_IDX, prod_data);
+-}
+-
+-static int atl1c_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+- unsigned long flags;
+- u16 tpd_req = 1;
+- struct atl1c_tpd_desc *tpd;
+- enum atl1c_trans_queue type = atl1c_trans_normal;
+-
+- if (test_bit(__AT_DOWN, &adapter->flags)) {
+- dev_kfree_skb_any(skb);
+- return NETDEV_TX_OK;
+- }
+-
+- tpd_req = atl1c_cal_tpd_req(skb);
+- if (!spin_trylock_irqsave(&adapter->tx_lock, flags)) {
+- if (netif_msg_pktdata(adapter))
+- dev_info(&adapter->pdev->dev, "tx locked\n");
+- return NETDEV_TX_LOCKED;
+- }
+- if (skb->mark == 0x01)
+- type = atl1c_trans_high;
+- else
+- type = atl1c_trans_normal;
+-
+- if (atl1c_tpd_avail(adapter, type) < tpd_req) {
+- /* no enough descriptor, just stop queue */
+- netif_stop_queue(netdev);
+- spin_unlock_irqrestore(&adapter->tx_lock, flags);
+- return NETDEV_TX_BUSY;
+- }
+-
+- tpd = atl1c_get_tpd(adapter, type);
+-
+- /* do TSO and check sum */
+- if (atl1c_tso_csum(adapter, skb, &tpd, type) != 0) {
+- spin_unlock_irqrestore(&adapter->tx_lock, flags);
+- dev_kfree_skb_any(skb);
+- return NETDEV_TX_OK;
+- }
+-
+- if (unlikely(adapter->vlgrp && vlan_tx_tag_present(skb))) {
+- u16 vlan = vlan_tx_tag_get(skb);
+- __le16 tag;
+-
+- vlan = cpu_to_le16(vlan);
+- AT_VLAN_TO_TAG(vlan, tag);
+- tpd->word1 |= 1 << TPD_INS_VTAG_SHIFT;
+- tpd->vlan_tag = tag;
+- }
+-
+- if (skb_network_offset(skb) != ETH_HLEN)
+- tpd->word1 |= 1 << TPD_ETH_TYPE_SHIFT; /* Ethernet frame */
+-
+- atl1c_tx_map(adapter, skb, tpd, type);
+- atl1c_tx_queue(adapter, skb, tpd, type);
+-
+- netdev->trans_start = jiffies;
+- spin_unlock_irqrestore(&adapter->tx_lock, flags);
+- return NETDEV_TX_OK;
+-}
+-
+-static void atl1c_free_irq(struct atl1c_adapter *adapter)
+-{
+- struct net_device *netdev = adapter->netdev;
+-
+- free_irq(adapter->pdev->irq, netdev);
+-
+- if (adapter->have_msi)
+- pci_disable_msi(adapter->pdev);
+-}
+-
+-static int atl1c_request_irq(struct atl1c_adapter *adapter)
+-{
+- struct pci_dev *pdev = adapter->pdev;
+- struct net_device *netdev = adapter->netdev;
+- int flags = 0;
+- int err = 0;
+-
+- adapter->have_msi = true;
+- err = pci_enable_msi(adapter->pdev);
+- if (err) {
+- if (netif_msg_ifup(adapter))
+- dev_err(&pdev->dev,
+- "Unable to allocate MSI interrupt Error: %d\n",
+- err);
+- adapter->have_msi = false;
+- } else
+- netdev->irq = pdev->irq;
+-
+- if (!adapter->have_msi)
+- flags |= IRQF_SHARED;
+- err = request_irq(adapter->pdev->irq, &atl1c_intr, flags,
+- netdev->name, netdev);
+- if (err) {
+- if (netif_msg_ifup(adapter))
+- dev_err(&pdev->dev,
+- "Unable to allocate interrupt Error: %d\n",
+- err);
+- if (adapter->have_msi)
+- pci_disable_msi(adapter->pdev);
+- return err;
+- }
+- if (netif_msg_ifup(adapter))
+- dev_dbg(&pdev->dev, "atl1c_request_irq OK\n");
+- return err;
+-}
+-
+-int atl1c_up(struct atl1c_adapter *adapter)
+-{
+- struct net_device *netdev = adapter->netdev;
+- int num;
+- int err;
+- int i;
+-
+- netif_carrier_off(netdev);
+- atl1c_init_ring_ptrs(adapter);
+- atl1c_set_multi(netdev);
+- atl1c_restore_vlan(adapter);
+-
+- for (i = 0; i < adapter->num_rx_queues; i++) {
+- num = atl1c_alloc_rx_buffer(adapter, i);
+- if (unlikely(num == 0)) {
+- err = -ENOMEM;
+- goto err_alloc_rx;
+- }
+- }
+-
+- if (atl1c_configure(adapter)) {
+- err = -EIO;
+- goto err_up;
+- }
+-
+- err = atl1c_request_irq(adapter);
+- if (unlikely(err))
+- goto err_up;
+-
+- clear_bit(__AT_DOWN, &adapter->flags);
+- napi_enable(&adapter->napi);
+- atl1c_irq_enable(adapter);
+- atl1c_check_link_status(adapter);
+- netif_start_queue(netdev);
+- return err;
+-
+-err_up:
+-err_alloc_rx:
+- atl1c_clean_rx_ring(adapter);
+- return err;
+-}
+-
+-void atl1c_down(struct atl1c_adapter *adapter)
+-{
+- struct net_device *netdev = adapter->netdev;
+-
+- atl1c_del_timer(adapter);
+- atl1c_cancel_work(adapter);
+-
+- /* signal that we're down so the interrupt handler does not
+- * reschedule our watchdog timer */
+- set_bit(__AT_DOWN, &adapter->flags);
+- netif_carrier_off(netdev);
+- napi_disable(&adapter->napi);
+- atl1c_irq_disable(adapter);
+- atl1c_free_irq(adapter);
+- AT_WRITE_REG(&adapter->hw, REG_ISR, ISR_DIS_INT);
+- /* reset MAC to disable all RX/TX */
+- atl1c_reset_mac(&adapter->hw);
+- msleep(1);
+-
+- adapter->link_speed = SPEED_0;
+- adapter->link_duplex = -1;
+- atl1c_clean_tx_ring(adapter, atl1c_trans_normal);
+- atl1c_clean_tx_ring(adapter, atl1c_trans_high);
+- atl1c_clean_rx_ring(adapter);
+-}
+-
+-/*
+- * atl1c_open - Called when a network interface is made active
+- * @netdev: network interface device structure
+- *
+- * Returns 0 on success, negative value on failure
+- *
+- * The open entry point is called when a network interface is made
+- * active by the system (IFF_UP). At this point all resources needed
+- * for transmit and receive operations are allocated, the interrupt
+- * handler is registered with the OS, the watchdog timer is started,
+- * and the stack is notified that the interface is ready.
+- */
+-static int atl1c_open(struct net_device *netdev)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+- int err;
+-
+- /* disallow open during test */
+- if (test_bit(__AT_TESTING, &adapter->flags))
+- return -EBUSY;
+-
+- /* allocate rx/tx dma buffer & descriptors */
+- err = atl1c_setup_ring_resources(adapter);
+- if (unlikely(err))
+- return err;
+-
+- err = atl1c_up(adapter);
+- if (unlikely(err))
+- goto err_up;
+-
+- if (adapter->hw.ctrl_flags & ATL1C_FPGA_VERSION) {
+- u32 phy_data;
+-
+- AT_READ_REG(&adapter->hw, REG_MDIO_CTRL, &phy_data);
+- phy_data |= MDIO_AP_EN;
+- AT_WRITE_REG(&adapter->hw, REG_MDIO_CTRL, phy_data);
+- }
+- return 0;
+-
+-err_up:
+- atl1c_free_irq(adapter);
+- atl1c_free_ring_resources(adapter);
+- atl1c_reset_mac(&adapter->hw);
+- return err;
+-}
+-
+-/*
+- * atl1c_close - Disables a network interface
+- * @netdev: network interface device structure
+- *
+- * Returns 0, this is not allowed to fail
+- *
+- * The close entry point is called when an interface is de-activated
+- * by the OS. The hardware is still under the drivers control, but
+- * needs to be disabled. A global MAC reset is issued to stop the
+- * hardware, and all transmit and receive resources are freed.
+- */
+-static int atl1c_close(struct net_device *netdev)
+-{
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+-
+- WARN_ON(test_bit(__AT_RESETTING, &adapter->flags));
+- atl1c_down(adapter);
+- atl1c_free_ring_resources(adapter);
+- return 0;
+-}
+-
+-static int atl1c_suspend(struct pci_dev *pdev, pm_message_t state)
+-{
+- struct net_device *netdev = pci_get_drvdata(pdev);
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+- struct atl1c_hw *hw = &adapter->hw;
+- u32 ctrl;
+- u32 mac_ctrl_data;
+- u32 master_ctrl_data;
+- u32 wol_ctrl_data;
+- u16 mii_bmsr_data;
+- u16 save_autoneg_advertised;
+- u16 mii_intr_status_data;
+- u32 wufc = adapter->wol;
+- u32 i;
+- int retval = 0;
+-
+- if (netif_running(netdev)) {
+- WARN_ON(test_bit(__AT_RESETTING, &adapter->flags));
+- atl1c_down(adapter);
+- }
+- netif_device_detach(netdev);
+- atl1c_disable_l0s_l1(hw);
+- retval = pci_save_state(pdev);
+- if (retval)
+- return retval;
+- if (wufc) {
+- AT_READ_REG(hw, REG_MASTER_CTRL, &master_ctrl_data);
+- master_ctrl_data &= ~MASTER_CTRL_CLK_SEL_DIS;
+-
+- /* get link status */
+- atl1c_read_phy_reg(hw, MII_BMSR, (u16 *)&mii_bmsr_data);
+- atl1c_read_phy_reg(hw, MII_BMSR, (u16 *)&mii_bmsr_data);
+- save_autoneg_advertised = hw->autoneg_advertised;
+- hw->autoneg_advertised = ADVERTISED_10baseT_Half;
+- if (atl1c_restart_autoneg(hw) != 0)
+- if (netif_msg_link(adapter))
+- dev_warn(&pdev->dev, "phy autoneg failed\n");
+- hw->phy_configured = false; /* re-init PHY when resume */
+- hw->autoneg_advertised = save_autoneg_advertised;
+- /* turn on magic packet wol */
+- if (wufc & AT_WUFC_MAG)
+- wol_ctrl_data = WOL_MAGIC_EN | WOL_MAGIC_PME_EN;
+-
+- if (wufc & AT_WUFC_LNKC) {
+- for (i = 0; i < AT_SUSPEND_LINK_TIMEOUT; i++) {
+- msleep(100);
+- atl1c_read_phy_reg(hw, MII_BMSR,
+- (u16 *)&mii_bmsr_data);
+- if (mii_bmsr_data & BMSR_LSTATUS)
+- break;
+- }
+- if ((mii_bmsr_data & BMSR_LSTATUS) == 0)
+- if (netif_msg_link(adapter))
+- dev_warn(&pdev->dev,
+- "%s: Link may change"
+- "when suspend\n",
+- atl1c_driver_name);
+- wol_ctrl_data |= WOL_LINK_CHG_EN | WOL_LINK_CHG_PME_EN;
+- /* only link up can wake up */
+- if (atl1c_write_phy_reg(hw, MII_IER, IER_LINK_UP) != 0) {
+- if (netif_msg_link(adapter))
+- dev_err(&pdev->dev,
+- "%s: read write phy "
+- "register failed.\n",
+- atl1c_driver_name);
+- goto wol_dis;
+- }
+- }
+- /* clear phy interrupt */
+- atl1c_read_phy_reg(hw, MII_ISR, &mii_intr_status_data);
+- /* Config MAC Ctrl register */
+- mac_ctrl_data = MAC_CTRL_RX_EN;
+- /* set to 10/100M halt duplex */
+- mac_ctrl_data |= atl1c_mac_speed_10_100 << MAC_CTRL_SPEED_SHIFT;
+- mac_ctrl_data |= (((u32)adapter->hw.preamble_len &
+- MAC_CTRL_PRMLEN_MASK) <<
+- MAC_CTRL_PRMLEN_SHIFT);
+-
+- if (adapter->vlgrp)
+- mac_ctrl_data |= MAC_CTRL_RMV_VLAN;
+-
+- /* magic packet maybe Broadcast&multicast&Unicast frame */
+- if (wufc & AT_WUFC_MAG)
+- mac_ctrl_data |= MAC_CTRL_BC_EN;
+-
+- if (netif_msg_hw(adapter))
+- dev_dbg(&pdev->dev,
+- "%s: suspend MAC=0x%x\n",
+- atl1c_driver_name, mac_ctrl_data);
+- AT_WRITE_REG(hw, REG_MASTER_CTRL, master_ctrl_data);
+- AT_WRITE_REG(hw, REG_WOL_CTRL, wol_ctrl_data);
+- AT_WRITE_REG(hw, REG_MAC_CTRL, mac_ctrl_data);
+-
+- /* pcie patch */
+- AT_READ_REG(hw, REG_PCIE_PHYMISC, &ctrl);
+- ctrl |= PCIE_PHYMISC_FORCE_RCV_DET;
+- AT_WRITE_REG(hw, REG_PCIE_PHYMISC, ctrl);
+-
+- pci_enable_wake(pdev, pci_choose_state(pdev, state), 1);
+- goto suspend_exit;
+- }
+-wol_dis:
+-
+- /* WOL disabled */
+- AT_WRITE_REG(hw, REG_WOL_CTRL, 0);
+-
+- /* pcie patch */
+- AT_READ_REG(hw, REG_PCIE_PHYMISC, &ctrl);
+- ctrl |= PCIE_PHYMISC_FORCE_RCV_DET;
+- AT_WRITE_REG(hw, REG_PCIE_PHYMISC, ctrl);
+-
+- atl1c_phy_disable(hw);
+- hw->phy_configured = false; /* re-init PHY when resume */
+-
+- pci_enable_wake(pdev, pci_choose_state(pdev, state), 0);
+-suspend_exit:
+-
+- pci_disable_device(pdev);
+- pci_set_power_state(pdev, pci_choose_state(pdev, state));
+-
+- return 0;
+-}
+-
+-static int atl1c_resume(struct pci_dev *pdev)
+-{
+- struct net_device *netdev = pci_get_drvdata(pdev);
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+-
+- pci_set_power_state(pdev, PCI_D0);
+- pci_restore_state(pdev);
+- pci_enable_wake(pdev, PCI_D3hot, 0);
+- pci_enable_wake(pdev, PCI_D3cold, 0);
+-
+- AT_WRITE_REG(&adapter->hw, REG_WOL_CTRL, 0);
+-
+- atl1c_phy_reset(&adapter->hw);
+- atl1c_reset_mac(&adapter->hw);
+- netif_device_attach(netdev);
+- if (netif_running(netdev))
+- atl1c_up(adapter);
+-
+- return 0;
+-}
+-
+-static void atl1c_shutdown(struct pci_dev *pdev)
+-{
+- atl1c_suspend(pdev, PMSG_SUSPEND);
+-}
+-
+-static const struct net_device_ops atl1c_netdev_ops = {
+- .ndo_open = atl1c_open,
+- .ndo_stop = atl1c_close,
+- .ndo_validate_addr = eth_validate_addr,
+- .ndo_start_xmit = atl1c_xmit_frame,
+- .ndo_set_mac_address = atl1c_set_mac_addr,
+- .ndo_set_multicast_list = atl1c_set_multi,
+- .ndo_change_mtu = atl1c_change_mtu,
+- .ndo_do_ioctl = atl1c_ioctl,
+- .ndo_tx_timeout = atl1c_tx_timeout,
+- .ndo_get_stats = atl1c_get_stats,
+- .ndo_vlan_rx_register = atl1c_vlan_rx_register,
+-#ifdef CONFIG_NET_POLL_CONTROLLER
+- .ndo_poll_controller = atl1c_netpoll,
+-#endif
+-};
+-
+-static int atl1c_init_netdev(struct net_device *netdev, struct pci_dev *pdev)
+-{
+- SET_NETDEV_DEV(netdev, &pdev->dev);
+- pci_set_drvdata(pdev, netdev);
+-
+- netdev->irq = pdev->irq;
+- netdev->netdev_ops = &atl1c_netdev_ops;
+- netdev->watchdog_timeo = AT_TX_WATCHDOG;
+- atl1c_set_ethtool_ops(netdev);
+-
+- /* TODO: add when ready */
+- netdev->features = NETIF_F_SG |
+- NETIF_F_HW_CSUM |
+- NETIF_F_HW_VLAN_TX |
+- NETIF_F_HW_VLAN_RX |
+- NETIF_F_TSO |
+- NETIF_F_TSO6;
+- return 0;
+-}
+-
+-/*
+- * atl1c_probe - Device Initialization Routine
+- * @pdev: PCI device information struct
+- * @ent: entry in atl1c_pci_tbl
+- *
+- * Returns 0 on success, negative on failure
+- *
+- * atl1c_probe initializes an adapter identified by a pci_dev structure.
+- * The OS initialization, configuring of the adapter private structure,
+- * and a hardware reset occur.
+- */
+-static int __devinit atl1c_probe(struct pci_dev *pdev,
+- const struct pci_device_id *ent)
+-{
+- struct net_device *netdev;
+- struct atl1c_adapter *adapter;
+- static int cards_found;
+-
+- int err = 0;
+-
+- /* enable device (incl. PCI PM wakeup and hotplug setup) */
+- err = pci_enable_device_mem(pdev);
+- if (err) {
+- dev_err(&pdev->dev, "cannot enable PCI device\n");
+- return err;
+- }
+-
+- /*
+- * The atl1c chip can DMA to 64-bit addresses, but it uses a single
+- * shared register for the high 32 bits, so only a single, aligned,
+- * 4 GB physical address range can be used at a time.
+- *
+- * Supporting 64-bit DMA on this hardware is more trouble than it's
+- * worth. It is far easier to limit to 32-bit DMA than update
+- * various kernel subsystems to support the mechanics required by a
+- * fixed-high-32-bit system.
+- */
+- if ((pci_set_dma_mask(pdev, DMA_32BIT_MASK) != 0) ||
+- (pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK) != 0)) {
+- dev_err(&pdev->dev, "No usable DMA configuration,aborting\n");
+- goto err_dma;
+- }
+-
+- err = pci_request_regions(pdev, atl1c_driver_name);
+- if (err) {
+- dev_err(&pdev->dev, "cannot obtain PCI resources\n");
+- goto err_pci_reg;
+- }
+-
+- pci_set_master(pdev);
+-
+- netdev = alloc_etherdev(sizeof(struct atl1c_adapter));
+- if (netdev == NULL) {
+- err = -ENOMEM;
+- dev_err(&pdev->dev, "etherdev alloc failed\n");
+- goto err_alloc_etherdev;
+- }
+-
+- err = atl1c_init_netdev(netdev, pdev);
+- if (err) {
+- dev_err(&pdev->dev, "init netdevice failed\n");
+- goto err_init_netdev;
+- }
+- adapter = netdev_priv(netdev);
+- adapter->bd_number = cards_found;
+- adapter->netdev = netdev;
+- adapter->pdev = pdev;
+- adapter->hw.adapter = adapter;
+- adapter->msg_enable = netif_msg_init(-1, atl1c_default_msg);
+- adapter->hw.hw_addr = ioremap(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0));
+- if (!adapter->hw.hw_addr) {
+- err = -EIO;
+- dev_err(&pdev->dev, "cannot map device registers\n");
+- goto err_ioremap;
+- }
+- netdev->base_addr = (unsigned long)adapter->hw.hw_addr;
+-
+- /* init mii data */
+- adapter->mii.dev = netdev;
+- adapter->mii.mdio_read = atl1c_mdio_read;
+- adapter->mii.mdio_write = atl1c_mdio_write;
+- adapter->mii.phy_id_mask = 0x1f;
+- adapter->mii.reg_num_mask = MDIO_REG_ADDR_MASK;
+- netif_napi_add(netdev, &adapter->napi, atl1c_clean, 64);
+- setup_timer(&adapter->phy_config_timer, atl1c_phy_config,
+- (unsigned long)adapter);
+- /* setup the private structure */
+- err = atl1c_sw_init(adapter);
+- if (err) {
+- dev_err(&pdev->dev, "net device private data init failed\n");
+- goto err_sw_init;
+- }
+- atl1c_reset_pcie(&adapter->hw, ATL1C_PCIE_L0S_L1_DISABLE |
+- ATL1C_PCIE_PHY_RESET);
+-
+- /* Init GPHY as early as possible due to power saving issue */
+- atl1c_phy_reset(&adapter->hw);
+-
+- err = atl1c_reset_mac(&adapter->hw);
+- if (err) {
+- err = -EIO;
+- goto err_reset;
+- }
+-
+- device_init_wakeup(&pdev->dev, 1);
+- /* reset the controller to
+- * put the device in a known good starting state */
+- err = atl1c_phy_init(&adapter->hw);
+- if (err) {
+- err = -EIO;
+- goto err_reset;
+- }
+- if (atl1c_read_mac_addr(&adapter->hw) != 0) {
+- err = -EIO;
+- dev_err(&pdev->dev, "get mac address failed\n");
+- goto err_eeprom;
+- }
+- memcpy(netdev->dev_addr, adapter->hw.mac_addr, netdev->addr_len);
+- memcpy(netdev->perm_addr, adapter->hw.mac_addr, netdev->addr_len);
+- if (netif_msg_probe(adapter))
+- dev_dbg(&pdev->dev,
+- "mac address : %02x-%02x-%02x-%02x-%02x-%02x\n",
+- adapter->hw.mac_addr[0], adapter->hw.mac_addr[1],
+- adapter->hw.mac_addr[2], adapter->hw.mac_addr[3],
+- adapter->hw.mac_addr[4], adapter->hw.mac_addr[5]);
+-
+- atl1c_hw_set_mac_addr(&adapter->hw);
+- INIT_WORK(&adapter->reset_task, atl1c_reset_task);
+- INIT_WORK(&adapter->link_chg_task, atl1c_link_chg_task);
+- err = register_netdev(netdev);
+- if (err) {
+- dev_err(&pdev->dev, "register netdevice failed\n");
+- goto err_register;
+- }
+-
+- if (netif_msg_probe(adapter))
+- dev_info(&pdev->dev, "version %s\n", ATL1C_DRV_VERSION);
+- cards_found++;
+- return 0;
+-
+-err_reset:
+-err_register:
+-err_sw_init:
+-err_eeprom:
+- iounmap(adapter->hw.hw_addr);
+-err_init_netdev:
+-err_ioremap:
+- free_netdev(netdev);
+-err_alloc_etherdev:
+- pci_release_regions(pdev);
+-err_pci_reg:
+-err_dma:
+- pci_disable_device(pdev);
+- return err;
+-}
+-
+-/*
+- * atl1c_remove - Device Removal Routine
+- * @pdev: PCI device information struct
+- *
+- * atl1c_remove is called by the PCI subsystem to alert the driver
+- * that it should release a PCI device. The could be caused by a
+- * Hot-Plug event, or because the driver is going to be removed from
+- * memory.
+- */
+-static void __devexit atl1c_remove(struct pci_dev *pdev)
+-{
+- struct net_device *netdev = pci_get_drvdata(pdev);
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+-
+- unregister_netdev(netdev);
+- atl1c_phy_disable(&adapter->hw);
+-
+- iounmap(adapter->hw.hw_addr);
+-
+- pci_release_regions(pdev);
+- pci_disable_device(pdev);
+- free_netdev(netdev);
+-}
+-
+-/*
+- * atl1c_io_error_detected - called when PCI error is detected
+- * @pdev: Pointer to PCI device
+- * @state: The current pci connection state
+- *
+- * This function is called after a PCI bus error affecting
+- * this device has been detected.
+- */
+-static pci_ers_result_t atl1c_io_error_detected(struct pci_dev *pdev,
+- pci_channel_state_t state)
+-{
+- struct net_device *netdev = pci_get_drvdata(pdev);
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+-
+- netif_device_detach(netdev);
+-
+- if (netif_running(netdev))
+- atl1c_down(adapter);
+-
+- pci_disable_device(pdev);
+-
+- /* Request a slot slot reset. */
+- return PCI_ERS_RESULT_NEED_RESET;
+-}
+-
+-/*
+- * atl1c_io_slot_reset - called after the pci bus has been reset.
+- * @pdev: Pointer to PCI device
+- *
+- * Restart the card from scratch, as if from a cold-boot. Implementation
+- * resembles the first-half of the e1000_resume routine.
+- */
+-static pci_ers_result_t atl1c_io_slot_reset(struct pci_dev *pdev)
+-{
+- struct net_device *netdev = pci_get_drvdata(pdev);
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+-
+- if (pci_enable_device(pdev)) {
+- if (netif_msg_hw(adapter))
+- dev_err(&pdev->dev,
+- "Cannot re-enable PCI device after reset\n");
+- return PCI_ERS_RESULT_DISCONNECT;
+- }
+- pci_set_master(pdev);
+-
+- pci_enable_wake(pdev, PCI_D3hot, 0);
+- pci_enable_wake(pdev, PCI_D3cold, 0);
+-
+- atl1c_reset_mac(&adapter->hw);
+-
+- return PCI_ERS_RESULT_RECOVERED;
+-}
+-
+-/*
+- * atl1c_io_resume - called when traffic can start flowing again.
+- * @pdev: Pointer to PCI device
+- *
+- * This callback is called when the error recovery driver tells us that
+- * its OK to resume normal operation. Implementation resembles the
+- * second-half of the atl1c_resume routine.
+- */
+-static void atl1c_io_resume(struct pci_dev *pdev)
+-{
+- struct net_device *netdev = pci_get_drvdata(pdev);
+- struct atl1c_adapter *adapter = netdev_priv(netdev);
+-
+- if (netif_running(netdev)) {
+- if (atl1c_up(adapter)) {
+- if (netif_msg_hw(adapter))
+- dev_err(&pdev->dev,
+- "Cannot bring device back up after reset\n");
+- return;
+- }
+- }
+-
+- netif_device_attach(netdev);
+-}
+-
+-static struct pci_error_handlers atl1c_err_handler = {
+- .error_detected = atl1c_io_error_detected,
+- .slot_reset = atl1c_io_slot_reset,
+- .resume = atl1c_io_resume,
+-};
+-
+-static struct pci_driver atl1c_driver = {
+- .name = atl1c_driver_name,
+- .id_table = atl1c_pci_tbl,
+- .probe = atl1c_probe,
+- .remove = __devexit_p(atl1c_remove),
+- /* Power Managment Hooks */
+- .suspend = atl1c_suspend,
+- .resume = atl1c_resume,
+- .shutdown = atl1c_shutdown,
+- .err_handler = &atl1c_err_handler
+-};
+-
+-/*
+- * atl1c_init_module - Driver Registration Routine
+- *
+- * atl1c_init_module is the first routine called when the driver is
+- * loaded. All it does is register with the PCI subsystem.
+- */
+-static int __init atl1c_init_module(void)
+-{
+- return pci_register_driver(&atl1c_driver);
+-}
+-
+-/*
+- * atl1c_exit_module - Driver Exit Cleanup Routine
+- *
+- * atl1c_exit_module is called just before the driver is removed
+- * from memory.
+- */
+-static void __exit atl1c_exit_module(void)
+-{
+- pci_unregister_driver(&atl1c_driver);
+-}
+-
+-module_init(atl1c_init_module);
+-module_exit(atl1c_exit_module);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/atl1c/Makefile linux-2.6.29-rc3.owrt/drivers/net/atl1c/Makefile
+--- linux-2.6.29.owrt/drivers/net/atl1c/Makefile 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/atl1c/Makefile 1970-01-01 01:00:00.000000000 +0100
+@@ -1,2 +0,0 @@
+-obj-$(CONFIG_ATL1C) += atl1c.o
+-atl1c-objs := atl1c_main.o atl1c_hw.o atl1c_ethtool.o
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/b44.c linux-2.6.29-rc3.owrt/drivers/net/b44.c
+--- linux-2.6.29.owrt/drivers/net/b44.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/b44.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1264,14 +1264,8 @@
+ static void b44_chip_reset(struct b44 *bp, int reset_kind)
+ {
+ struct ssb_device *sdev = bp->sdev;
+- bool was_enabled;
+
+- was_enabled = ssb_device_is_enabled(bp->sdev);
+-
+- ssb_device_enable(bp->sdev, 0);
+- ssb_pcicore_dev_irqvecs_enable(&sdev->bus->pcicore, sdev);
+-
+- if (was_enabled) {
++ if (ssb_device_is_enabled(bp->sdev)) {
+ bw32(bp, B44_RCV_LAZY, 0);
+ bw32(bp, B44_ENET_CTRL, ENET_CTRL_DISABLE);
+ b44_wait_bit(bp, B44_ENET_CTRL, ENET_CTRL_DISABLE, 200, 1);
+@@ -1283,8 +1277,10 @@
+ }
+ bw32(bp, B44_DMARX_CTRL, 0);
+ bp->rx_prod = bp->rx_cons = 0;
+- }
++ } else
++ ssb_pcicore_dev_irqvecs_enable(&sdev->bus->pcicore, sdev);
+
++ ssb_device_enable(bp->sdev, 0);
+ b44_clear_stats(bp);
+
+ /*
+@@ -2240,7 +2236,6 @@
+ struct net_device *dev = ssb_get_drvdata(sdev);
+
+ unregister_netdev(dev);
+- ssb_device_disable(sdev, 0);
+ ssb_bus_may_powerdown(sdev->bus);
+ free_netdev(dev);
+ ssb_pcihost_set_power_state(sdev, PCI_D3hot);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/benet/be_cmds.c linux-2.6.29-rc3.owrt/drivers/net/benet/be_cmds.c
+--- linux-2.6.29.owrt/drivers/net/benet/be_cmds.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/benet/be_cmds.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,861 +0,0 @@
+-/*
+- * Copyright (C) 2005 - 2009 ServerEngines
+- * All rights reserved.
+- *
+- * 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 full GNU General
+- * Public License is included in this distribution in the file called COPYING.
+- *
+- * Contact Information:
+- * linux-drivers@serverengines.com
+- *
+- * ServerEngines
+- * 209 N. Fair Oaks Ave
+- * Sunnyvale, CA 94085
+- */
+-
+-#include "be.h"
+-
+-static int be_mbox_db_ready_wait(void __iomem *db)
+-{
+- int cnt = 0, wait = 5;
+- u32 ready;
+-
+- do {
+- ready = ioread32(db) & MPU_MAILBOX_DB_RDY_MASK;
+- if (ready)
+- break;
+-
+- if (cnt > 200000) {
+- printk(KERN_WARNING DRV_NAME
+- ": mbox_db poll timed out\n");
+- return -1;
+- }
+-
+- if (cnt > 50)
+- wait = 200;
+- cnt += wait;
+- udelay(wait);
+- } while (true);
+-
+- return 0;
+-}
+-
+-/*
+- * Insert the mailbox address into the doorbell in two steps
+- */
+-static int be_mbox_db_ring(struct be_ctrl_info *ctrl)
+-{
+- int status;
+- u16 compl_status, extd_status;
+- u32 val = 0;
+- void __iomem *db = ctrl->db + MPU_MAILBOX_DB_OFFSET;
+- struct be_dma_mem *mbox_mem = &ctrl->mbox_mem;
+- struct be_mcc_mailbox *mbox = mbox_mem->va;
+- struct be_mcc_cq_entry *cqe = &mbox->cqe;
+-
+- memset(cqe, 0, sizeof(*cqe));
+-
+- val &= ~MPU_MAILBOX_DB_RDY_MASK;
+- val |= MPU_MAILBOX_DB_HI_MASK;
+- /* at bits 2 - 31 place mbox dma addr msb bits 34 - 63 */
+- val |= (upper_32_bits(mbox_mem->dma) >> 2) << 2;
+- iowrite32(val, db);
+-
+- /* wait for ready to be set */
+- status = be_mbox_db_ready_wait(db);
+- if (status != 0)
+- return status;
+-
+- val = 0;
+- val &= ~MPU_MAILBOX_DB_RDY_MASK;
+- val &= ~MPU_MAILBOX_DB_HI_MASK;
+- /* at bits 2 - 31 place mbox dma addr lsb bits 4 - 33 */
+- val |= (u32)(mbox_mem->dma >> 4) << 2;
+- iowrite32(val, db);
+-
+- status = be_mbox_db_ready_wait(db);
+- if (status != 0)
+- return status;
+-
+- /* compl entry has been made now */
+- be_dws_le_to_cpu(cqe, sizeof(*cqe));
+- if (!(cqe->flags & CQE_FLAGS_VALID_MASK)) {
+- printk(KERN_WARNING DRV_NAME ": ERROR invalid mbox compl\n");
+- return -1;
+- }
+-
+- compl_status = (cqe->status >> CQE_STATUS_COMPL_SHIFT) &
+- CQE_STATUS_COMPL_MASK;
+- if (compl_status != MCC_STATUS_SUCCESS) {
+- extd_status = (cqe->status >> CQE_STATUS_EXTD_SHIFT) &
+- CQE_STATUS_EXTD_MASK;
+- printk(KERN_WARNING DRV_NAME
+- ": ERROR in cmd compl. status(compl/extd)=%d/%d\n",
+- compl_status, extd_status);
+- }
+-
+- return compl_status;
+-}
+-
+-static int be_POST_stage_get(struct be_ctrl_info *ctrl, u16 *stage)
+-{
+- u32 sem = ioread32(ctrl->csr + MPU_EP_SEMAPHORE_OFFSET);
+-
+- *stage = sem & EP_SEMAPHORE_POST_STAGE_MASK;
+- if ((sem >> EP_SEMAPHORE_POST_ERR_SHIFT) & EP_SEMAPHORE_POST_ERR_MASK)
+- return -1;
+- else
+- return 0;
+-}
+-
+-static int be_POST_stage_poll(struct be_ctrl_info *ctrl, u16 poll_stage)
+-{
+- u16 stage, cnt, error;
+- for (cnt = 0; cnt < 5000; cnt++) {
+- error = be_POST_stage_get(ctrl, &stage);
+- if (error)
+- return -1;
+-
+- if (stage == poll_stage)
+- break;
+- udelay(1000);
+- }
+- if (stage != poll_stage)
+- return -1;
+- return 0;
+-}
+-
+-
+-int be_cmd_POST(struct be_ctrl_info *ctrl)
+-{
+- u16 stage, error;
+-
+- error = be_POST_stage_get(ctrl, &stage);
+- if (error)
+- goto err;
+-
+- if (stage == POST_STAGE_ARMFW_RDY)
+- return 0;
+-
+- if (stage != POST_STAGE_AWAITING_HOST_RDY)
+- goto err;
+-
+- /* On awaiting host rdy, reset and again poll on awaiting host rdy */
+- iowrite32(POST_STAGE_BE_RESET, ctrl->csr + MPU_EP_SEMAPHORE_OFFSET);
+- error = be_POST_stage_poll(ctrl, POST_STAGE_AWAITING_HOST_RDY);
+- if (error)
+- goto err;
+-
+- /* Now kickoff POST and poll on armfw ready */
+- iowrite32(POST_STAGE_HOST_RDY, ctrl->csr + MPU_EP_SEMAPHORE_OFFSET);
+- error = be_POST_stage_poll(ctrl, POST_STAGE_ARMFW_RDY);
+- if (error)
+- goto err;
+-
+- return 0;
+-err:
+- printk(KERN_WARNING DRV_NAME ": ERROR, stage=%d\n", stage);
+- return -1;
+-}
+-
+-static inline void *embedded_payload(struct be_mcc_wrb *wrb)
+-{
+- return wrb->payload.embedded_payload;
+-}
+-
+-static inline struct be_sge *nonembedded_sgl(struct be_mcc_wrb *wrb)
+-{
+- return &wrb->payload.sgl[0];
+-}
+-
+-/* Don't touch the hdr after it's prepared */
+-static void be_wrb_hdr_prepare(struct be_mcc_wrb *wrb, int payload_len,
+- bool embedded, u8 sge_cnt)
+-{
+- if (embedded)
+- wrb->embedded |= MCC_WRB_EMBEDDED_MASK;
+- else
+- wrb->embedded |= (sge_cnt & MCC_WRB_SGE_CNT_MASK) <<
+- MCC_WRB_SGE_CNT_SHIFT;
+- wrb->payload_length = payload_len;
+- be_dws_cpu_to_le(wrb, 20);
+-}
+-
+-/* Don't touch the hdr after it's prepared */
+-static void be_cmd_hdr_prepare(struct be_cmd_req_hdr *req_hdr,
+- u8 subsystem, u8 opcode, int cmd_len)
+-{
+- req_hdr->opcode = opcode;
+- req_hdr->subsystem = subsystem;
+- req_hdr->request_length = cpu_to_le32(cmd_len - sizeof(*req_hdr));
+-}
+-
+-static void be_cmd_page_addrs_prepare(struct phys_addr *pages, u32 max_pages,
+- struct be_dma_mem *mem)
+-{
+- int i, buf_pages = min(PAGES_4K_SPANNED(mem->va, mem->size), max_pages);
+- u64 dma = (u64)mem->dma;
+-
+- for (i = 0; i < buf_pages; i++) {
+- pages[i].lo = cpu_to_le32(dma & 0xFFFFFFFF);
+- pages[i].hi = cpu_to_le32(upper_32_bits(dma));
+- dma += PAGE_SIZE_4K;
+- }
+-}
+-
+-/* Converts interrupt delay in microseconds to multiplier value */
+-static u32 eq_delay_to_mult(u32 usec_delay)
+-{
+-#define MAX_INTR_RATE 651042
+- const u32 round = 10;
+- u32 multiplier;
+-
+- if (usec_delay == 0)
+- multiplier = 0;
+- else {
+- u32 interrupt_rate = 1000000 / usec_delay;
+- /* Max delay, corresponding to the lowest interrupt rate */
+- if (interrupt_rate == 0)
+- multiplier = 1023;
+- else {
+- multiplier = (MAX_INTR_RATE - interrupt_rate) * round;
+- multiplier /= interrupt_rate;
+- /* Round the multiplier to the closest value.*/
+- multiplier = (multiplier + round/2) / round;
+- multiplier = min(multiplier, (u32)1023);
+- }
+- }
+- return multiplier;
+-}
+-
+-static inline struct be_mcc_wrb *wrb_from_mbox(struct be_dma_mem *mbox_mem)
+-{
+- return &((struct be_mcc_mailbox *)(mbox_mem->va))->wrb;
+-}
+-
+-int be_cmd_eq_create(struct be_ctrl_info *ctrl,
+- struct be_queue_info *eq, int eq_delay)
+-{
+- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
+- struct be_cmd_req_eq_create *req = embedded_payload(wrb);
+- struct be_cmd_resp_eq_create *resp = embedded_payload(wrb);
+- struct be_dma_mem *q_mem = &eq->dma_mem;
+- int status;
+-
+- spin_lock(&ctrl->cmd_lock);
+- memset(wrb, 0, sizeof(*wrb));
+-
+- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
+-
+- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+- OPCODE_COMMON_EQ_CREATE, sizeof(*req));
+-
+- req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
+-
+- AMAP_SET_BITS(struct amap_eq_context, func, req->context,
+- ctrl->pci_func);
+- AMAP_SET_BITS(struct amap_eq_context, valid, req->context, 1);
+- /* 4byte eqe*/
+- AMAP_SET_BITS(struct amap_eq_context, size, req->context, 0);
+- AMAP_SET_BITS(struct amap_eq_context, count, req->context,
+- __ilog2_u32(eq->len/256));
+- AMAP_SET_BITS(struct amap_eq_context, delaymult, req->context,
+- eq_delay_to_mult(eq_delay));
+- be_dws_cpu_to_le(req->context, sizeof(req->context));
+-
+- be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
+-
+- status = be_mbox_db_ring(ctrl);
+- if (!status) {
+- eq->id = le16_to_cpu(resp->eq_id);
+- eq->created = true;
+- }
+- spin_unlock(&ctrl->cmd_lock);
+- return status;
+-}
+-
+-int be_cmd_mac_addr_query(struct be_ctrl_info *ctrl, u8 *mac_addr,
+- u8 type, bool permanent, u32 if_handle)
+-{
+- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
+- struct be_cmd_req_mac_query *req = embedded_payload(wrb);
+- struct be_cmd_resp_mac_query *resp = embedded_payload(wrb);
+- int status;
+-
+- spin_lock(&ctrl->cmd_lock);
+- memset(wrb, 0, sizeof(*wrb));
+-
+- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
+-
+- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+- OPCODE_COMMON_NTWK_MAC_QUERY, sizeof(*req));
+-
+- req->type = type;
+- if (permanent) {
+- req->permanent = 1;
+- } else {
+- req->if_id = cpu_to_le16((u16)if_handle);
+- req->permanent = 0;
+- }
+-
+- status = be_mbox_db_ring(ctrl);
+- if (!status)
+- memcpy(mac_addr, resp->mac.addr, ETH_ALEN);
+-
+- spin_unlock(&ctrl->cmd_lock);
+- return status;
+-}
+-
+-int be_cmd_pmac_add(struct be_ctrl_info *ctrl, u8 *mac_addr,
+- u32 if_id, u32 *pmac_id)
+-{
+- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
+- struct be_cmd_req_pmac_add *req = embedded_payload(wrb);
+- int status;
+-
+- spin_lock(&ctrl->cmd_lock);
+- memset(wrb, 0, sizeof(*wrb));
+-
+- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
+-
+- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+- OPCODE_COMMON_NTWK_PMAC_ADD, sizeof(*req));
+-
+- req->if_id = cpu_to_le32(if_id);
+- memcpy(req->mac_address, mac_addr, ETH_ALEN);
+-
+- status = be_mbox_db_ring(ctrl);
+- if (!status) {
+- struct be_cmd_resp_pmac_add *resp = embedded_payload(wrb);
+- *pmac_id = le32_to_cpu(resp->pmac_id);
+- }
+-
+- spin_unlock(&ctrl->cmd_lock);
+- return status;
+-}
+-
+-int be_cmd_pmac_del(struct be_ctrl_info *ctrl, u32 if_id, u32 pmac_id)
+-{
+- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
+- struct be_cmd_req_pmac_del *req = embedded_payload(wrb);
+- int status;
+-
+- spin_lock(&ctrl->cmd_lock);
+- memset(wrb, 0, sizeof(*wrb));
+-
+- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
+-
+- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+- OPCODE_COMMON_NTWK_PMAC_DEL, sizeof(*req));
+-
+- req->if_id = cpu_to_le32(if_id);
+- req->pmac_id = cpu_to_le32(pmac_id);
+-
+- status = be_mbox_db_ring(ctrl);
+- spin_unlock(&ctrl->cmd_lock);
+-
+- return status;
+-}
+-
+-int be_cmd_cq_create(struct be_ctrl_info *ctrl,
+- struct be_queue_info *cq, struct be_queue_info *eq,
+- bool sol_evts, bool no_delay, int coalesce_wm)
+-{
+- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
+- struct be_cmd_req_cq_create *req = embedded_payload(wrb);
+- struct be_cmd_resp_cq_create *resp = embedded_payload(wrb);
+- struct be_dma_mem *q_mem = &cq->dma_mem;
+- void *ctxt = &req->context;
+- int status;
+-
+- spin_lock(&ctrl->cmd_lock);
+- memset(wrb, 0, sizeof(*wrb));
+-
+- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
+-
+- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+- OPCODE_COMMON_CQ_CREATE, sizeof(*req));
+-
+- req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
+-
+- AMAP_SET_BITS(struct amap_cq_context, coalescwm, ctxt, coalesce_wm);
+- AMAP_SET_BITS(struct amap_cq_context, nodelay, ctxt, no_delay);
+- AMAP_SET_BITS(struct amap_cq_context, count, ctxt,
+- __ilog2_u32(cq->len/256));
+- AMAP_SET_BITS(struct amap_cq_context, valid, ctxt, 1);
+- AMAP_SET_BITS(struct amap_cq_context, solevent, ctxt, sol_evts);
+- AMAP_SET_BITS(struct amap_cq_context, eventable, ctxt, 1);
+- AMAP_SET_BITS(struct amap_cq_context, eqid, ctxt, eq->id);
+- AMAP_SET_BITS(struct amap_cq_context, armed, ctxt, 0);
+- AMAP_SET_BITS(struct amap_cq_context, func, ctxt, ctrl->pci_func);
+- be_dws_cpu_to_le(ctxt, sizeof(req->context));
+-
+- be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
+-
+- status = be_mbox_db_ring(ctrl);
+- if (!status) {
+- cq->id = le16_to_cpu(resp->cq_id);
+- cq->created = true;
+- }
+- spin_unlock(&ctrl->cmd_lock);
+-
+- return status;
+-}
+-
+-int be_cmd_txq_create(struct be_ctrl_info *ctrl,
+- struct be_queue_info *txq,
+- struct be_queue_info *cq)
+-{
+- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
+- struct be_cmd_req_eth_tx_create *req = embedded_payload(wrb);
+- struct be_dma_mem *q_mem = &txq->dma_mem;
+- void *ctxt = &req->context;
+- int status;
+- u32 len_encoded;
+-
+- spin_lock(&ctrl->cmd_lock);
+- memset(wrb, 0, sizeof(*wrb));
+-
+- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
+-
+- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH, OPCODE_ETH_TX_CREATE,
+- sizeof(*req));
+-
+- req->num_pages = PAGES_4K_SPANNED(q_mem->va, q_mem->size);
+- req->ulp_num = BE_ULP1_NUM;
+- req->type = BE_ETH_TX_RING_TYPE_STANDARD;
+-
+- len_encoded = fls(txq->len); /* log2(len) + 1 */
+- if (len_encoded == 16)
+- len_encoded = 0;
+- AMAP_SET_BITS(struct amap_tx_context, tx_ring_size, ctxt, len_encoded);
+- AMAP_SET_BITS(struct amap_tx_context, pci_func_id, ctxt,
+- ctrl->pci_func);
+- AMAP_SET_BITS(struct amap_tx_context, ctx_valid, ctxt, 1);
+- AMAP_SET_BITS(struct amap_tx_context, cq_id_send, ctxt, cq->id);
+-
+- be_dws_cpu_to_le(ctxt, sizeof(req->context));
+-
+- be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
+-
+- status = be_mbox_db_ring(ctrl);
+- if (!status) {
+- struct be_cmd_resp_eth_tx_create *resp = embedded_payload(wrb);
+- txq->id = le16_to_cpu(resp->cid);
+- txq->created = true;
+- }
+- spin_unlock(&ctrl->cmd_lock);
+-
+- return status;
+-}
+-
+-int be_cmd_rxq_create(struct be_ctrl_info *ctrl,
+- struct be_queue_info *rxq, u16 cq_id, u16 frag_size,
+- u16 max_frame_size, u32 if_id, u32 rss)
+-{
+- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
+- struct be_cmd_req_eth_rx_create *req = embedded_payload(wrb);
+- struct be_dma_mem *q_mem = &rxq->dma_mem;
+- int status;
+-
+- spin_lock(&ctrl->cmd_lock);
+- memset(wrb, 0, sizeof(*wrb));
+-
+- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
+-
+- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH, OPCODE_ETH_RX_CREATE,
+- sizeof(*req));
+-
+- req->cq_id = cpu_to_le16(cq_id);
+- req->frag_size = fls(frag_size) - 1;
+- req->num_pages = 2;
+- be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
+- req->interface_id = cpu_to_le32(if_id);
+- req->max_frame_size = cpu_to_le16(max_frame_size);
+- req->rss_queue = cpu_to_le32(rss);
+-
+- status = be_mbox_db_ring(ctrl);
+- if (!status) {
+- struct be_cmd_resp_eth_rx_create *resp = embedded_payload(wrb);
+- rxq->id = le16_to_cpu(resp->id);
+- rxq->created = true;
+- }
+- spin_unlock(&ctrl->cmd_lock);
+-
+- return status;
+-}
+-
+-/* Generic destroyer function for all types of queues */
+-int be_cmd_q_destroy(struct be_ctrl_info *ctrl, struct be_queue_info *q,
+- int queue_type)
+-{
+- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
+- struct be_cmd_req_q_destroy *req = embedded_payload(wrb);
+- u8 subsys = 0, opcode = 0;
+- int status;
+-
+- spin_lock(&ctrl->cmd_lock);
+-
+- memset(wrb, 0, sizeof(*wrb));
+- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
+-
+- switch (queue_type) {
+- case QTYPE_EQ:
+- subsys = CMD_SUBSYSTEM_COMMON;
+- opcode = OPCODE_COMMON_EQ_DESTROY;
+- break;
+- case QTYPE_CQ:
+- subsys = CMD_SUBSYSTEM_COMMON;
+- opcode = OPCODE_COMMON_CQ_DESTROY;
+- break;
+- case QTYPE_TXQ:
+- subsys = CMD_SUBSYSTEM_ETH;
+- opcode = OPCODE_ETH_TX_DESTROY;
+- break;
+- case QTYPE_RXQ:
+- subsys = CMD_SUBSYSTEM_ETH;
+- opcode = OPCODE_ETH_RX_DESTROY;
+- break;
+- default:
+- printk(KERN_WARNING DRV_NAME ":bad Q type in Q destroy cmd\n");
+- status = -1;
+- goto err;
+- }
+- be_cmd_hdr_prepare(&req->hdr, subsys, opcode, sizeof(*req));
+- req->id = cpu_to_le16(q->id);
+-
+- status = be_mbox_db_ring(ctrl);
+-err:
+- spin_unlock(&ctrl->cmd_lock);
+-
+- return status;
+-}
+-
+-/* Create an rx filtering policy configuration on an i/f */
+-int be_cmd_if_create(struct be_ctrl_info *ctrl, u32 flags, u8 *mac,
+- bool pmac_invalid, u32 *if_handle, u32 *pmac_id)
+-{
+- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
+- struct be_cmd_req_if_create *req = embedded_payload(wrb);
+- int status;
+-
+- spin_lock(&ctrl->cmd_lock);
+- memset(wrb, 0, sizeof(*wrb));
+-
+- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
+-
+- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+- OPCODE_COMMON_NTWK_INTERFACE_CREATE, sizeof(*req));
+-
+- req->capability_flags = cpu_to_le32(flags);
+- req->enable_flags = cpu_to_le32(flags);
+- if (!pmac_invalid)
+- memcpy(req->mac_addr, mac, ETH_ALEN);
+-
+- status = be_mbox_db_ring(ctrl);
+- if (!status) {
+- struct be_cmd_resp_if_create *resp = embedded_payload(wrb);
+- *if_handle = le32_to_cpu(resp->interface_id);
+- if (!pmac_invalid)
+- *pmac_id = le32_to_cpu(resp->pmac_id);
+- }
+-
+- spin_unlock(&ctrl->cmd_lock);
+- return status;
+-}
+-
+-int be_cmd_if_destroy(struct be_ctrl_info *ctrl, u32 interface_id)
+-{
+- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
+- struct be_cmd_req_if_destroy *req = embedded_payload(wrb);
+- int status;
+-
+- spin_lock(&ctrl->cmd_lock);
+- memset(wrb, 0, sizeof(*wrb));
+-
+- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
+-
+- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+- OPCODE_COMMON_NTWK_INTERFACE_DESTROY, sizeof(*req));
+-
+- req->interface_id = cpu_to_le32(interface_id);
+- status = be_mbox_db_ring(ctrl);
+-
+- spin_unlock(&ctrl->cmd_lock);
+-
+- return status;
+-}
+-
+-/* Get stats is a non embedded command: the request is not embedded inside
+- * WRB but is a separate dma memory block
+- */
+-int be_cmd_get_stats(struct be_ctrl_info *ctrl, struct be_dma_mem *nonemb_cmd)
+-{
+- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
+- struct be_cmd_req_get_stats *req = nonemb_cmd->va;
+- struct be_sge *sge = nonembedded_sgl(wrb);
+- int status;
+-
+- spin_lock(&ctrl->cmd_lock);
+- memset(wrb, 0, sizeof(*wrb));
+-
+- memset(req, 0, sizeof(*req));
+-
+- be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
+-
+- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
+- OPCODE_ETH_GET_STATISTICS, sizeof(*req));
+- sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
+- sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF);
+- sge->len = cpu_to_le32(nonemb_cmd->size);
+-
+- status = be_mbox_db_ring(ctrl);
+- if (!status) {
+- struct be_cmd_resp_get_stats *resp = nonemb_cmd->va;
+- be_dws_le_to_cpu(&resp->hw_stats, sizeof(resp->hw_stats));
+- }
+-
+- spin_unlock(&ctrl->cmd_lock);
+- return status;
+-}
+-
+-int be_cmd_link_status_query(struct be_ctrl_info *ctrl,
+- struct be_link_info *link)
+-{
+- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
+- struct be_cmd_req_link_status *req = embedded_payload(wrb);
+- int status;
+-
+- spin_lock(&ctrl->cmd_lock);
+- memset(wrb, 0, sizeof(*wrb));
+-
+- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
+-
+- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+- OPCODE_COMMON_NTWK_LINK_STATUS_QUERY, sizeof(*req));
+-
+- status = be_mbox_db_ring(ctrl);
+- if (!status) {
+- struct be_cmd_resp_link_status *resp = embedded_payload(wrb);
+- link->speed = resp->mac_speed;
+- link->duplex = resp->mac_duplex;
+- link->fault = resp->mac_fault;
+- } else {
+- link->speed = PHY_LINK_SPEED_ZERO;
+- }
+-
+- spin_unlock(&ctrl->cmd_lock);
+- return status;
+-}
+-
+-int be_cmd_get_fw_ver(struct be_ctrl_info *ctrl, char *fw_ver)
+-{
+- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
+- struct be_cmd_req_get_fw_version *req = embedded_payload(wrb);
+- int status;
+-
+- spin_lock(&ctrl->cmd_lock);
+- memset(wrb, 0, sizeof(*wrb));
+-
+- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
+-
+- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+- OPCODE_COMMON_GET_FW_VERSION, sizeof(*req));
+-
+- status = be_mbox_db_ring(ctrl);
+- if (!status) {
+- struct be_cmd_resp_get_fw_version *resp = embedded_payload(wrb);
+- strncpy(fw_ver, resp->firmware_version_string, FW_VER_LEN);
+- }
+-
+- spin_unlock(&ctrl->cmd_lock);
+- return status;
+-}
+-
+-/* set the EQ delay interval of an EQ to specified value */
+-int be_cmd_modify_eqd(struct be_ctrl_info *ctrl, u32 eq_id, u32 eqd)
+-{
+- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
+- struct be_cmd_req_modify_eq_delay *req = embedded_payload(wrb);
+- int status;
+-
+- spin_lock(&ctrl->cmd_lock);
+- memset(wrb, 0, sizeof(*wrb));
+-
+- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
+-
+- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+- OPCODE_COMMON_MODIFY_EQ_DELAY, sizeof(*req));
+-
+- req->num_eq = cpu_to_le32(1);
+- req->delay[0].eq_id = cpu_to_le32(eq_id);
+- req->delay[0].phase = 0;
+- req->delay[0].delay_multiplier = cpu_to_le32(eqd);
+-
+- status = be_mbox_db_ring(ctrl);
+-
+- spin_unlock(&ctrl->cmd_lock);
+- return status;
+-}
+-
+-int be_cmd_vlan_config(struct be_ctrl_info *ctrl, u32 if_id, u16 *vtag_array,
+- u32 num, bool untagged, bool promiscuous)
+-{
+- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
+- struct be_cmd_req_vlan_config *req = embedded_payload(wrb);
+- int status;
+-
+- spin_lock(&ctrl->cmd_lock);
+- memset(wrb, 0, sizeof(*wrb));
+-
+- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
+-
+- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+- OPCODE_COMMON_NTWK_VLAN_CONFIG, sizeof(*req));
+-
+- req->interface_id = if_id;
+- req->promiscuous = promiscuous;
+- req->untagged = untagged;
+- req->num_vlan = num;
+- if (!promiscuous) {
+- memcpy(req->normal_vlan, vtag_array,
+- req->num_vlan * sizeof(vtag_array[0]));
+- }
+-
+- status = be_mbox_db_ring(ctrl);
+-
+- spin_unlock(&ctrl->cmd_lock);
+- return status;
+-}
+-
+-int be_cmd_promiscuous_config(struct be_ctrl_info *ctrl, u8 port_num, bool en)
+-{
+- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
+- struct be_cmd_req_promiscuous_config *req = embedded_payload(wrb);
+- int status;
+-
+- spin_lock(&ctrl->cmd_lock);
+- memset(wrb, 0, sizeof(*wrb));
+-
+- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
+-
+- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
+- OPCODE_ETH_PROMISCUOUS, sizeof(*req));
+-
+- if (port_num)
+- req->port1_promiscuous = en;
+- else
+- req->port0_promiscuous = en;
+-
+- status = be_mbox_db_ring(ctrl);
+-
+- spin_unlock(&ctrl->cmd_lock);
+- return status;
+-}
+-
+-int be_cmd_mcast_mac_set(struct be_ctrl_info *ctrl, u32 if_id, u8 *mac_table,
+- u32 num, bool promiscuous)
+-{
+- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
+- struct be_cmd_req_mcast_mac_config *req = embedded_payload(wrb);
+- int status;
+-
+- spin_lock(&ctrl->cmd_lock);
+- memset(wrb, 0, sizeof(*wrb));
+-
+- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
+-
+- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+- OPCODE_COMMON_NTWK_MULTICAST_SET, sizeof(*req));
+-
+- req->interface_id = if_id;
+- req->promiscuous = promiscuous;
+- if (!promiscuous) {
+- req->num_mac = cpu_to_le16(num);
+- if (num)
+- memcpy(req->mac, mac_table, ETH_ALEN * num);
+- }
+-
+- status = be_mbox_db_ring(ctrl);
+-
+- spin_unlock(&ctrl->cmd_lock);
+- return status;
+-}
+-
+-int be_cmd_set_flow_control(struct be_ctrl_info *ctrl, u32 tx_fc, u32 rx_fc)
+-{
+- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
+- struct be_cmd_req_set_flow_control *req = embedded_payload(wrb);
+- int status;
+-
+- spin_lock(&ctrl->cmd_lock);
+-
+- memset(wrb, 0, sizeof(*wrb));
+-
+- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
+-
+- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+- OPCODE_COMMON_SET_FLOW_CONTROL, sizeof(*req));
+-
+- req->tx_flow_control = cpu_to_le16((u16)tx_fc);
+- req->rx_flow_control = cpu_to_le16((u16)rx_fc);
+-
+- status = be_mbox_db_ring(ctrl);
+-
+- spin_unlock(&ctrl->cmd_lock);
+- return status;
+-}
+-
+-int be_cmd_get_flow_control(struct be_ctrl_info *ctrl, u32 *tx_fc, u32 *rx_fc)
+-{
+- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
+- struct be_cmd_req_get_flow_control *req = embedded_payload(wrb);
+- int status;
+-
+- spin_lock(&ctrl->cmd_lock);
+-
+- memset(wrb, 0, sizeof(*wrb));
+-
+- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
+-
+- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+- OPCODE_COMMON_GET_FLOW_CONTROL, sizeof(*req));
+-
+- status = be_mbox_db_ring(ctrl);
+- if (!status) {
+- struct be_cmd_resp_get_flow_control *resp =
+- embedded_payload(wrb);
+- *tx_fc = le16_to_cpu(resp->tx_flow_control);
+- *rx_fc = le16_to_cpu(resp->rx_flow_control);
+- }
+-
+- spin_unlock(&ctrl->cmd_lock);
+- return status;
+-}
+-
+-int be_cmd_query_fw_cfg(struct be_ctrl_info *ctrl, u32 *port_num)
+-{
+- struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
+- struct be_cmd_req_query_fw_cfg *req = embedded_payload(wrb);
+- int status;
+-
+- spin_lock(&ctrl->cmd_lock);
+-
+- memset(wrb, 0, sizeof(*wrb));
+-
+- be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
+-
+- be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
+- OPCODE_COMMON_QUERY_FIRMWARE_CONFIG, sizeof(*req));
+-
+- status = be_mbox_db_ring(ctrl);
+- if (!status) {
+- struct be_cmd_resp_query_fw_cfg *resp = embedded_payload(wrb);
+- *port_num = le32_to_cpu(resp->phys_port);
+- }
+-
+- spin_unlock(&ctrl->cmd_lock);
+- return status;
+-}
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/benet/be_cmds.h linux-2.6.29-rc3.owrt/drivers/net/benet/be_cmds.h
+--- linux-2.6.29.owrt/drivers/net/benet/be_cmds.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/benet/be_cmds.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,688 +0,0 @@
+-/*
+- * Copyright (C) 2005 - 2009 ServerEngines
+- * All rights reserved.
+- *
+- * 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 full GNU General
+- * Public License is included in this distribution in the file called COPYING.
+- *
+- * Contact Information:
+- * linux-drivers@serverengines.com
+- *
+- * ServerEngines
+- * 209 N. Fair Oaks Ave
+- * Sunnyvale, CA 94085
+- */
+-
+-/*
+- * The driver sends configuration and managements command requests to the
+- * firmware in the BE. These requests are communicated to the processor
+- * using Work Request Blocks (WRBs) submitted to the MCC-WRB ring or via one
+- * WRB inside a MAILBOX.
+- * The commands are serviced by the ARM processor in the BladeEngine's MPU.
+- */
+-
+-struct be_sge {
+- u32 pa_lo;
+- u32 pa_hi;
+- u32 len;
+-};
+-
+-#define MCC_WRB_EMBEDDED_MASK 1 /* bit 0 of dword 0*/
+-#define MCC_WRB_SGE_CNT_SHIFT 3 /* bits 3 - 7 of dword 0 */
+-#define MCC_WRB_SGE_CNT_MASK 0x1F /* bits 3 - 7 of dword 0 */
+-struct be_mcc_wrb {
+- u32 embedded; /* dword 0 */
+- u32 payload_length; /* dword 1 */
+- u32 tag0; /* dword 2 */
+- u32 tag1; /* dword 3 */
+- u32 rsvd; /* dword 4 */
+- union {
+- u8 embedded_payload[236]; /* used by embedded cmds */
+- struct be_sge sgl[19]; /* used by non-embedded cmds */
+- } payload;
+-};
+-
+-#define CQE_FLAGS_VALID_MASK (1 << 31)
+-#define CQE_FLAGS_ASYNC_MASK (1 << 30)
+-#define CQE_FLAGS_COMPLETED_MASK (1 << 28)
+-#define CQE_FLAGS_CONSUMED_MASK (1 << 27)
+-
+-/* Completion Status */
+-enum {
+- MCC_STATUS_SUCCESS = 0x0,
+-/* The client does not have sufficient privileges to execute the command */
+- MCC_STATUS_INSUFFICIENT_PRIVILEGES = 0x1,
+-/* A parameter in the command was invalid. */
+- MCC_STATUS_INVALID_PARAMETER = 0x2,
+-/* There are insufficient chip resources to execute the command */
+- MCC_STATUS_INSUFFICIENT_RESOURCES = 0x3,
+-/* The command is completing because the queue was getting flushed */
+- MCC_STATUS_QUEUE_FLUSHING = 0x4,
+-/* The command is completing with a DMA error */
+- MCC_STATUS_DMA_FAILED = 0x5
+-};
+-
+-#define CQE_STATUS_COMPL_MASK 0xFFFF
+-#define CQE_STATUS_COMPL_SHIFT 0 /* bits 0 - 15 */
+-#define CQE_STATUS_EXTD_MASK 0xFFFF
+-#define CQE_STATUS_EXTD_SHIFT 0 /* bits 0 - 15 */
+-
+-struct be_mcc_cq_entry {
+- u32 status; /* dword 0 */
+- u32 tag0; /* dword 1 */
+- u32 tag1; /* dword 2 */
+- u32 flags; /* dword 3 */
+-};
+-
+-struct be_mcc_mailbox {
+- struct be_mcc_wrb wrb;
+- struct be_mcc_cq_entry cqe;
+-};
+-
+-#define CMD_SUBSYSTEM_COMMON 0x1
+-#define CMD_SUBSYSTEM_ETH 0x3
+-
+-#define OPCODE_COMMON_NTWK_MAC_QUERY 1
+-#define OPCODE_COMMON_NTWK_MAC_SET 2
+-#define OPCODE_COMMON_NTWK_MULTICAST_SET 3
+-#define OPCODE_COMMON_NTWK_VLAN_CONFIG 4
+-#define OPCODE_COMMON_NTWK_LINK_STATUS_QUERY 5
+-#define OPCODE_COMMON_CQ_CREATE 12
+-#define OPCODE_COMMON_EQ_CREATE 13
+-#define OPCODE_COMMON_MCC_CREATE 21
+-#define OPCODE_COMMON_NTWK_RX_FILTER 34
+-#define OPCODE_COMMON_GET_FW_VERSION 35
+-#define OPCODE_COMMON_SET_FLOW_CONTROL 36
+-#define OPCODE_COMMON_GET_FLOW_CONTROL 37
+-#define OPCODE_COMMON_SET_FRAME_SIZE 39
+-#define OPCODE_COMMON_MODIFY_EQ_DELAY 41
+-#define OPCODE_COMMON_FIRMWARE_CONFIG 42
+-#define OPCODE_COMMON_NTWK_INTERFACE_CREATE 50
+-#define OPCODE_COMMON_NTWK_INTERFACE_DESTROY 51
+-#define OPCODE_COMMON_CQ_DESTROY 54
+-#define OPCODE_COMMON_EQ_DESTROY 55
+-#define OPCODE_COMMON_QUERY_FIRMWARE_CONFIG 58
+-#define OPCODE_COMMON_NTWK_PMAC_ADD 59
+-#define OPCODE_COMMON_NTWK_PMAC_DEL 60
+-
+-#define OPCODE_ETH_ACPI_CONFIG 2
+-#define OPCODE_ETH_PROMISCUOUS 3
+-#define OPCODE_ETH_GET_STATISTICS 4
+-#define OPCODE_ETH_TX_CREATE 7
+-#define OPCODE_ETH_RX_CREATE 8
+-#define OPCODE_ETH_TX_DESTROY 9
+-#define OPCODE_ETH_RX_DESTROY 10
+-
+-struct be_cmd_req_hdr {
+- u8 opcode; /* dword 0 */
+- u8 subsystem; /* dword 0 */
+- u8 port_number; /* dword 0 */
+- u8 domain; /* dword 0 */
+- u32 timeout; /* dword 1 */
+- u32 request_length; /* dword 2 */
+- u32 rsvd; /* dword 3 */
+-};
+-
+-#define RESP_HDR_INFO_OPCODE_SHIFT 0 /* bits 0 - 7 */
+-#define RESP_HDR_INFO_SUBSYS_SHIFT 8 /* bits 8 - 15 */
+-struct be_cmd_resp_hdr {
+- u32 info; /* dword 0 */
+- u32 status; /* dword 1 */
+- u32 response_length; /* dword 2 */
+- u32 actual_resp_len; /* dword 3 */
+-};
+-
+-struct phys_addr {
+- u32 lo;
+- u32 hi;
+-};
+-
+-/**************************
+- * BE Command definitions *
+- **************************/
+-
+-/* Pseudo amap definition in which each bit of the actual structure is defined
+- * as a byte: used to calculate offset/shift/mask of each field */
+-struct amap_eq_context {
+- u8 cidx[13]; /* dword 0*/
+- u8 rsvd0[3]; /* dword 0*/
+- u8 epidx[13]; /* dword 0*/
+- u8 valid; /* dword 0*/
+- u8 rsvd1; /* dword 0*/
+- u8 size; /* dword 0*/
+- u8 pidx[13]; /* dword 1*/
+- u8 rsvd2[3]; /* dword 1*/
+- u8 pd[10]; /* dword 1*/
+- u8 count[3]; /* dword 1*/
+- u8 solevent; /* dword 1*/
+- u8 stalled; /* dword 1*/
+- u8 armed; /* dword 1*/
+- u8 rsvd3[4]; /* dword 2*/
+- u8 func[8]; /* dword 2*/
+- u8 rsvd4; /* dword 2*/
+- u8 delaymult[10]; /* dword 2*/
+- u8 rsvd5[2]; /* dword 2*/
+- u8 phase[2]; /* dword 2*/
+- u8 nodelay; /* dword 2*/
+- u8 rsvd6[4]; /* dword 2*/
+- u8 rsvd7[32]; /* dword 3*/
+-} __packed;
+-
+-struct be_cmd_req_eq_create {
+- struct be_cmd_req_hdr hdr;
+- u16 num_pages; /* sword */
+- u16 rsvd0; /* sword */
+- u8 context[sizeof(struct amap_eq_context) / 8];
+- struct phys_addr pages[8];
+-} __packed;
+-
+-struct be_cmd_resp_eq_create {
+- struct be_cmd_resp_hdr resp_hdr;
+- u16 eq_id; /* sword */
+- u16 rsvd0; /* sword */
+-} __packed;
+-
+-/******************** Mac query ***************************/
+-enum {
+- MAC_ADDRESS_TYPE_STORAGE = 0x0,
+- MAC_ADDRESS_TYPE_NETWORK = 0x1,
+- MAC_ADDRESS_TYPE_PD = 0x2,
+- MAC_ADDRESS_TYPE_MANAGEMENT = 0x3
+-};
+-
+-struct mac_addr {
+- u16 size_of_struct;
+- u8 addr[ETH_ALEN];
+-} __packed;
+-
+-struct be_cmd_req_mac_query {
+- struct be_cmd_req_hdr hdr;
+- u8 type;
+- u8 permanent;
+- u16 if_id;
+-} __packed;
+-
+-struct be_cmd_resp_mac_query {
+- struct be_cmd_resp_hdr hdr;
+- struct mac_addr mac;
+-};
+-
+-/******************** PMac Add ***************************/
+-struct be_cmd_req_pmac_add {
+- struct be_cmd_req_hdr hdr;
+- u32 if_id;
+- u8 mac_address[ETH_ALEN];
+- u8 rsvd0[2];
+-} __packed;
+-
+-struct be_cmd_resp_pmac_add {
+- struct be_cmd_resp_hdr hdr;
+- u32 pmac_id;
+-};
+-
+-/******************** PMac Del ***************************/
+-struct be_cmd_req_pmac_del {
+- struct be_cmd_req_hdr hdr;
+- u32 if_id;
+- u32 pmac_id;
+-};
+-
+-/******************** Create CQ ***************************/
+-/* Pseudo amap definition in which each bit of the actual structure is defined
+- * as a byte: used to calculate offset/shift/mask of each field */
+-struct amap_cq_context {
+- u8 cidx[11]; /* dword 0*/
+- u8 rsvd0; /* dword 0*/
+- u8 coalescwm[2]; /* dword 0*/
+- u8 nodelay; /* dword 0*/
+- u8 epidx[11]; /* dword 0*/
+- u8 rsvd1; /* dword 0*/
+- u8 count[2]; /* dword 0*/
+- u8 valid; /* dword 0*/
+- u8 solevent; /* dword 0*/
+- u8 eventable; /* dword 0*/
+- u8 pidx[11]; /* dword 1*/
+- u8 rsvd2; /* dword 1*/
+- u8 pd[10]; /* dword 1*/
+- u8 eqid[8]; /* dword 1*/
+- u8 stalled; /* dword 1*/
+- u8 armed; /* dword 1*/
+- u8 rsvd3[4]; /* dword 2*/
+- u8 func[8]; /* dword 2*/
+- u8 rsvd4[20]; /* dword 2*/
+- u8 rsvd5[32]; /* dword 3*/
+-} __packed;
+-
+-struct be_cmd_req_cq_create {
+- struct be_cmd_req_hdr hdr;
+- u16 num_pages;
+- u16 rsvd0;
+- u8 context[sizeof(struct amap_cq_context) / 8];
+- struct phys_addr pages[8];
+-} __packed;
+-
+-struct be_cmd_resp_cq_create {
+- struct be_cmd_resp_hdr hdr;
+- u16 cq_id;
+- u16 rsvd0;
+-} __packed;
+-
+-/******************** Create TxQ ***************************/
+-#define BE_ETH_TX_RING_TYPE_STANDARD 2
+-#define BE_ULP1_NUM 1
+-
+-/* Pseudo amap definition in which each bit of the actual structure is defined
+- * as a byte: used to calculate offset/shift/mask of each field */
+-struct amap_tx_context {
+- u8 rsvd0[16]; /* dword 0 */
+- u8 tx_ring_size[4]; /* dword 0 */
+- u8 rsvd1[26]; /* dword 0 */
+- u8 pci_func_id[8]; /* dword 1 */
+- u8 rsvd2[9]; /* dword 1 */
+- u8 ctx_valid; /* dword 1 */
+- u8 cq_id_send[16]; /* dword 2 */
+- u8 rsvd3[16]; /* dword 2 */
+- u8 rsvd4[32]; /* dword 3 */
+- u8 rsvd5[32]; /* dword 4 */
+- u8 rsvd6[32]; /* dword 5 */
+- u8 rsvd7[32]; /* dword 6 */
+- u8 rsvd8[32]; /* dword 7 */
+- u8 rsvd9[32]; /* dword 8 */
+- u8 rsvd10[32]; /* dword 9 */
+- u8 rsvd11[32]; /* dword 10 */
+- u8 rsvd12[32]; /* dword 11 */
+- u8 rsvd13[32]; /* dword 12 */
+- u8 rsvd14[32]; /* dword 13 */
+- u8 rsvd15[32]; /* dword 14 */
+- u8 rsvd16[32]; /* dword 15 */
+-} __packed;
+-
+-struct be_cmd_req_eth_tx_create {
+- struct be_cmd_req_hdr hdr;
+- u8 num_pages;
+- u8 ulp_num;
+- u8 type;
+- u8 bound_port;
+- u8 context[sizeof(struct amap_tx_context) / 8];
+- struct phys_addr pages[8];
+-} __packed;
+-
+-struct be_cmd_resp_eth_tx_create {
+- struct be_cmd_resp_hdr hdr;
+- u16 cid;
+- u16 rsvd0;
+-} __packed;
+-
+-/******************** Create RxQ ***************************/
+-struct be_cmd_req_eth_rx_create {
+- struct be_cmd_req_hdr hdr;
+- u16 cq_id;
+- u8 frag_size;
+- u8 num_pages;
+- struct phys_addr pages[2];
+- u32 interface_id;
+- u16 max_frame_size;
+- u16 rsvd0;
+- u32 rss_queue;
+-} __packed;
+-
+-struct be_cmd_resp_eth_rx_create {
+- struct be_cmd_resp_hdr hdr;
+- u16 id;
+- u8 cpu_id;
+- u8 rsvd0;
+-} __packed;
+-
+-/******************** Q Destroy ***************************/
+-/* Type of Queue to be destroyed */
+-enum {
+- QTYPE_EQ = 1,
+- QTYPE_CQ,
+- QTYPE_TXQ,
+- QTYPE_RXQ
+-};
+-
+-struct be_cmd_req_q_destroy {
+- struct be_cmd_req_hdr hdr;
+- u16 id;
+- u16 bypass_flush; /* valid only for rx q destroy */
+-} __packed;
+-
+-/************ I/f Create (it's actually I/f Config Create)**********/
+-
+-/* Capability flags for the i/f */
+-enum be_if_flags {
+- BE_IF_FLAGS_RSS = 0x4,
+- BE_IF_FLAGS_PROMISCUOUS = 0x8,
+- BE_IF_FLAGS_BROADCAST = 0x10,
+- BE_IF_FLAGS_UNTAGGED = 0x20,
+- BE_IF_FLAGS_ULP = 0x40,
+- BE_IF_FLAGS_VLAN_PROMISCUOUS = 0x80,
+- BE_IF_FLAGS_VLAN = 0x100,
+- BE_IF_FLAGS_MCAST_PROMISCUOUS = 0x200,
+- BE_IF_FLAGS_PASS_L2_ERRORS = 0x400,
+- BE_IF_FLAGS_PASS_L3L4_ERRORS = 0x800
+-};
+-
+-/* An RX interface is an object with one or more MAC addresses and
+- * filtering capabilities. */
+-struct be_cmd_req_if_create {
+- struct be_cmd_req_hdr hdr;
+- u32 version; /* ignore currntly */
+- u32 capability_flags;
+- u32 enable_flags;
+- u8 mac_addr[ETH_ALEN];
+- u8 rsvd0;
+- u8 pmac_invalid; /* if set, don't attach the mac addr to the i/f */
+- u32 vlan_tag; /* not used currently */
+-} __packed;
+-
+-struct be_cmd_resp_if_create {
+- struct be_cmd_resp_hdr hdr;
+- u32 interface_id;
+- u32 pmac_id;
+-};
+-
+-/****** I/f Destroy(it's actually I/f Config Destroy )**********/
+-struct be_cmd_req_if_destroy {
+- struct be_cmd_req_hdr hdr;
+- u32 interface_id;
+-};
+-
+-/*************** HW Stats Get **********************************/
+-struct be_port_rxf_stats {
+- u32 rx_bytes_lsd; /* dword 0*/
+- u32 rx_bytes_msd; /* dword 1*/
+- u32 rx_total_frames; /* dword 2*/
+- u32 rx_unicast_frames; /* dword 3*/
+- u32 rx_multicast_frames; /* dword 4*/
+- u32 rx_broadcast_frames; /* dword 5*/
+- u32 rx_crc_errors; /* dword 6*/
+- u32 rx_alignment_symbol_errors; /* dword 7*/
+- u32 rx_pause_frames; /* dword 8*/
+- u32 rx_control_frames; /* dword 9*/
+- u32 rx_in_range_errors; /* dword 10*/
+- u32 rx_out_range_errors; /* dword 11*/
+- u32 rx_frame_too_long; /* dword 12*/
+- u32 rx_address_match_errors; /* dword 13*/
+- u32 rx_vlan_mismatch; /* dword 14*/
+- u32 rx_dropped_too_small; /* dword 15*/
+- u32 rx_dropped_too_short; /* dword 16*/
+- u32 rx_dropped_header_too_small; /* dword 17*/
+- u32 rx_dropped_tcp_length; /* dword 18*/
+- u32 rx_dropped_runt; /* dword 19*/
+- u32 rx_64_byte_packets; /* dword 20*/
+- u32 rx_65_127_byte_packets; /* dword 21*/
+- u32 rx_128_256_byte_packets; /* dword 22*/
+- u32 rx_256_511_byte_packets; /* dword 23*/
+- u32 rx_512_1023_byte_packets; /* dword 24*/
+- u32 rx_1024_1518_byte_packets; /* dword 25*/
+- u32 rx_1519_2047_byte_packets; /* dword 26*/
+- u32 rx_2048_4095_byte_packets; /* dword 27*/
+- u32 rx_4096_8191_byte_packets; /* dword 28*/
+- u32 rx_8192_9216_byte_packets; /* dword 29*/
+- u32 rx_ip_checksum_errs; /* dword 30*/
+- u32 rx_tcp_checksum_errs; /* dword 31*/
+- u32 rx_udp_checksum_errs; /* dword 32*/
+- u32 rx_non_rss_packets; /* dword 33*/
+- u32 rx_ipv4_packets; /* dword 34*/
+- u32 rx_ipv6_packets; /* dword 35*/
+- u32 rx_ipv4_bytes_lsd; /* dword 36*/
+- u32 rx_ipv4_bytes_msd; /* dword 37*/
+- u32 rx_ipv6_bytes_lsd; /* dword 38*/
+- u32 rx_ipv6_bytes_msd; /* dword 39*/
+- u32 rx_chute1_packets; /* dword 40*/
+- u32 rx_chute2_packets; /* dword 41*/
+- u32 rx_chute3_packets; /* dword 42*/
+- u32 rx_management_packets; /* dword 43*/
+- u32 rx_switched_unicast_packets; /* dword 44*/
+- u32 rx_switched_multicast_packets; /* dword 45*/
+- u32 rx_switched_broadcast_packets; /* dword 46*/
+- u32 tx_bytes_lsd; /* dword 47*/
+- u32 tx_bytes_msd; /* dword 48*/
+- u32 tx_unicastframes; /* dword 49*/
+- u32 tx_multicastframes; /* dword 50*/
+- u32 tx_broadcastframes; /* dword 51*/
+- u32 tx_pauseframes; /* dword 52*/
+- u32 tx_controlframes; /* dword 53*/
+- u32 tx_64_byte_packets; /* dword 54*/
+- u32 tx_65_127_byte_packets; /* dword 55*/
+- u32 tx_128_256_byte_packets; /* dword 56*/
+- u32 tx_256_511_byte_packets; /* dword 57*/
+- u32 tx_512_1023_byte_packets; /* dword 58*/
+- u32 tx_1024_1518_byte_packets; /* dword 59*/
+- u32 tx_1519_2047_byte_packets; /* dword 60*/
+- u32 tx_2048_4095_byte_packets; /* dword 61*/
+- u32 tx_4096_8191_byte_packets; /* dword 62*/
+- u32 tx_8192_9216_byte_packets; /* dword 63*/
+- u32 rx_fifo_overflow; /* dword 64*/
+- u32 rx_input_fifo_overflow; /* dword 65*/
+-};
+-
+-struct be_rxf_stats {
+- struct be_port_rxf_stats port[2];
+- u32 rx_drops_no_pbuf; /* dword 132*/
+- u32 rx_drops_no_txpb; /* dword 133*/
+- u32 rx_drops_no_erx_descr; /* dword 134*/
+- u32 rx_drops_no_tpre_descr; /* dword 135*/
+- u32 management_rx_port_packets; /* dword 136*/
+- u32 management_rx_port_bytes; /* dword 137*/
+- u32 management_rx_port_pause_frames; /* dword 138*/
+- u32 management_rx_port_errors; /* dword 139*/
+- u32 management_tx_port_packets; /* dword 140*/
+- u32 management_tx_port_bytes; /* dword 141*/
+- u32 management_tx_port_pause; /* dword 142*/
+- u32 management_rx_port_rxfifo_overflow; /* dword 143*/
+- u32 rx_drops_too_many_frags; /* dword 144*/
+- u32 rx_drops_invalid_ring; /* dword 145*/
+- u32 forwarded_packets; /* dword 146*/
+- u32 rx_drops_mtu; /* dword 147*/
+- u32 rsvd0[15];
+-};
+-
+-struct be_erx_stats {
+- u32 rx_drops_no_fragments[44]; /* dwordS 0 to 43*/
+- u32 debug_wdma_sent_hold; /* dword 44*/
+- u32 debug_wdma_pbfree_sent_hold; /* dword 45*/
+- u32 debug_wdma_zerobyte_pbfree_sent_hold; /* dword 46*/
+- u32 debug_pmem_pbuf_dealloc; /* dword 47*/
+-};
+-
+-struct be_hw_stats {
+- struct be_rxf_stats rxf;
+- u32 rsvd[48];
+- struct be_erx_stats erx;
+-};
+-
+-struct be_cmd_req_get_stats {
+- struct be_cmd_req_hdr hdr;
+- u8 rsvd[sizeof(struct be_hw_stats)];
+-};
+-
+-struct be_cmd_resp_get_stats {
+- struct be_cmd_resp_hdr hdr;
+- struct be_hw_stats hw_stats;
+-};
+-
+-struct be_cmd_req_vlan_config {
+- struct be_cmd_req_hdr hdr;
+- u8 interface_id;
+- u8 promiscuous;
+- u8 untagged;
+- u8 num_vlan;
+- u16 normal_vlan[64];
+-} __packed;
+-
+-struct be_cmd_req_promiscuous_config {
+- struct be_cmd_req_hdr hdr;
+- u8 port0_promiscuous;
+- u8 port1_promiscuous;
+- u16 rsvd0;
+-} __packed;
+-
+-struct macaddr {
+- u8 byte[ETH_ALEN];
+-};
+-
+-struct be_cmd_req_mcast_mac_config {
+- struct be_cmd_req_hdr hdr;
+- u16 num_mac;
+- u8 promiscuous;
+- u8 interface_id;
+- struct macaddr mac[32];
+-} __packed;
+-
+-static inline struct be_hw_stats *
+-hw_stats_from_cmd(struct be_cmd_resp_get_stats *cmd)
+-{
+- return &cmd->hw_stats;
+-}
+-
+-/******************** Link Status Query *******************/
+-struct be_cmd_req_link_status {
+- struct be_cmd_req_hdr hdr;
+- u32 rsvd;
+-};
+-
+-struct be_link_info {
+- u8 duplex;
+- u8 speed;
+- u8 fault;
+-};
+-
+-enum {
+- PHY_LINK_DUPLEX_NONE = 0x0,
+- PHY_LINK_DUPLEX_HALF = 0x1,
+- PHY_LINK_DUPLEX_FULL = 0x2
+-};
+-
+-enum {
+- PHY_LINK_SPEED_ZERO = 0x0, /* => No link */
+- PHY_LINK_SPEED_10MBPS = 0x1,
+- PHY_LINK_SPEED_100MBPS = 0x2,
+- PHY_LINK_SPEED_1GBPS = 0x3,
+- PHY_LINK_SPEED_10GBPS = 0x4
+-};
+-
+-struct be_cmd_resp_link_status {
+- struct be_cmd_resp_hdr hdr;
+- u8 physical_port;
+- u8 mac_duplex;
+- u8 mac_speed;
+- u8 mac_fault;
+- u8 mgmt_mac_duplex;
+- u8 mgmt_mac_speed;
+- u16 rsvd0;
+-} __packed;
+-
+-/******************** Get FW Version *******************/
+-#define FW_VER_LEN 32
+-struct be_cmd_req_get_fw_version {
+- struct be_cmd_req_hdr hdr;
+- u8 rsvd0[FW_VER_LEN];
+- u8 rsvd1[FW_VER_LEN];
+-} __packed;
+-
+-struct be_cmd_resp_get_fw_version {
+- struct be_cmd_resp_hdr hdr;
+- u8 firmware_version_string[FW_VER_LEN];
+- u8 fw_on_flash_version_string[FW_VER_LEN];
+-} __packed;
+-
+-/******************** Set Flow Contrl *******************/
+-struct be_cmd_req_set_flow_control {
+- struct be_cmd_req_hdr hdr;
+- u16 tx_flow_control;
+- u16 rx_flow_control;
+-} __packed;
+-
+-/******************** Get Flow Contrl *******************/
+-struct be_cmd_req_get_flow_control {
+- struct be_cmd_req_hdr hdr;
+- u32 rsvd;
+-};
+-
+-struct be_cmd_resp_get_flow_control {
+- struct be_cmd_resp_hdr hdr;
+- u16 tx_flow_control;
+- u16 rx_flow_control;
+-} __packed;
+-
+-/******************** Modify EQ Delay *******************/
+-struct be_cmd_req_modify_eq_delay {
+- struct be_cmd_req_hdr hdr;
+- u32 num_eq;
+- struct {
+- u32 eq_id;
+- u32 phase;
+- u32 delay_multiplier;
+- } delay[8];
+-} __packed;
+-
+-struct be_cmd_resp_modify_eq_delay {
+- struct be_cmd_resp_hdr hdr;
+- u32 rsvd0;
+-} __packed;
+-
+-/******************** Get FW Config *******************/
+-struct be_cmd_req_query_fw_cfg {
+- struct be_cmd_req_hdr hdr;
+- u32 rsvd[30];
+-};
+-
+-struct be_cmd_resp_query_fw_cfg {
+- struct be_cmd_resp_hdr hdr;
+- u32 be_config_number;
+- u32 asic_revision;
+- u32 phys_port;
+- u32 function_mode;
+- u32 rsvd[26];
+-};
+-
+-extern int be_pci_fnum_get(struct be_ctrl_info *ctrl);
+-extern int be_cmd_POST(struct be_ctrl_info *ctrl);
+-extern int be_cmd_mac_addr_query(struct be_ctrl_info *ctrl, u8 *mac_addr,
+- u8 type, bool permanent, u32 if_handle);
+-extern int be_cmd_pmac_add(struct be_ctrl_info *ctrl, u8 *mac_addr,
+- u32 if_id, u32 *pmac_id);
+-extern int be_cmd_pmac_del(struct be_ctrl_info *ctrl, u32 if_id, u32 pmac_id);
+-extern int be_cmd_if_create(struct be_ctrl_info *ctrl, u32 if_flags, u8 *mac,
+- bool pmac_invalid, u32 *if_handle, u32 *pmac_id);
+-extern int be_cmd_if_destroy(struct be_ctrl_info *ctrl, u32 if_handle);
+-extern int be_cmd_eq_create(struct be_ctrl_info *ctrl,
+- struct be_queue_info *eq, int eq_delay);
+-extern int be_cmd_cq_create(struct be_ctrl_info *ctrl,
+- struct be_queue_info *cq, struct be_queue_info *eq,
+- bool sol_evts, bool no_delay,
+- int num_cqe_dma_coalesce);
+-extern int be_cmd_txq_create(struct be_ctrl_info *ctrl,
+- struct be_queue_info *txq,
+- struct be_queue_info *cq);
+-extern int be_cmd_rxq_create(struct be_ctrl_info *ctrl,
+- struct be_queue_info *rxq, u16 cq_id,
+- u16 frag_size, u16 max_frame_size, u32 if_id,
+- u32 rss);
+-extern int be_cmd_q_destroy(struct be_ctrl_info *ctrl, struct be_queue_info *q,
+- int type);
+-extern int be_cmd_link_status_query(struct be_ctrl_info *ctrl,
+- struct be_link_info *link);
+-extern int be_cmd_reset(struct be_ctrl_info *ctrl);
+-extern int be_cmd_get_stats(struct be_ctrl_info *ctrl,
+- struct be_dma_mem *nonemb_cmd);
+-extern int be_cmd_get_fw_ver(struct be_ctrl_info *ctrl, char *fw_ver);
+-
+-extern int be_cmd_modify_eqd(struct be_ctrl_info *ctrl, u32 eq_id, u32 eqd);
+-extern int be_cmd_vlan_config(struct be_ctrl_info *ctrl, u32 if_id,
+- u16 *vtag_array, u32 num, bool untagged,
+- bool promiscuous);
+-extern int be_cmd_promiscuous_config(struct be_ctrl_info *ctrl,
+- u8 port_num, bool en);
+-extern int be_cmd_mcast_mac_set(struct be_ctrl_info *ctrl, u32 if_id,
+- u8 *mac_table, u32 num, bool promiscuous);
+-extern int be_cmd_set_flow_control(struct be_ctrl_info *ctrl,
+- u32 tx_fc, u32 rx_fc);
+-extern int be_cmd_get_flow_control(struct be_ctrl_info *ctrl,
+- u32 *tx_fc, u32 *rx_fc);
+-extern int be_cmd_query_fw_cfg(struct be_ctrl_info *ctrl, u32 *port_num);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/benet/be_ethtool.c linux-2.6.29-rc3.owrt/drivers/net/benet/be_ethtool.c
+--- linux-2.6.29.owrt/drivers/net/benet/be_ethtool.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/benet/be_ethtool.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,362 +0,0 @@
+-/*
+- * Copyright (C) 2005 - 2009 ServerEngines
+- * All rights reserved.
+- *
+- * 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 full GNU General
+- * Public License is included in this distribution in the file called COPYING.
+- *
+- * Contact Information:
+- * linux-drivers@serverengines.com
+- *
+- * ServerEngines
+- * 209 N. Fair Oaks Ave
+- * Sunnyvale, CA 94085
+- */
+-
+-#include "be.h"
+-#include <linux/ethtool.h>
+-
+-struct be_ethtool_stat {
+- char desc[ETH_GSTRING_LEN];
+- int type;
+- int size;
+- int offset;
+-};
+-
+-enum {NETSTAT, PORTSTAT, MISCSTAT, DRVSTAT, ERXSTAT};
+-#define FIELDINFO(_struct, field) FIELD_SIZEOF(_struct, field), \
+- offsetof(_struct, field)
+-#define NETSTAT_INFO(field) #field, NETSTAT,\
+- FIELDINFO(struct net_device_stats,\
+- field)
+-#define DRVSTAT_INFO(field) #field, DRVSTAT,\
+- FIELDINFO(struct be_drvr_stats, field)
+-#define MISCSTAT_INFO(field) #field, MISCSTAT,\
+- FIELDINFO(struct be_rxf_stats, field)
+-#define PORTSTAT_INFO(field) #field, PORTSTAT,\
+- FIELDINFO(struct be_port_rxf_stats, \
+- field)
+-#define ERXSTAT_INFO(field) #field, ERXSTAT,\
+- FIELDINFO(struct be_erx_stats, field)
+-
+-static const struct be_ethtool_stat et_stats[] = {
+- {NETSTAT_INFO(rx_packets)},
+- {NETSTAT_INFO(tx_packets)},
+- {NETSTAT_INFO(rx_bytes)},
+- {NETSTAT_INFO(tx_bytes)},
+- {NETSTAT_INFO(rx_errors)},
+- {NETSTAT_INFO(tx_errors)},
+- {NETSTAT_INFO(rx_dropped)},
+- {NETSTAT_INFO(tx_dropped)},
+- {DRVSTAT_INFO(be_tx_reqs)},
+- {DRVSTAT_INFO(be_tx_stops)},
+- {DRVSTAT_INFO(be_fwd_reqs)},
+- {DRVSTAT_INFO(be_tx_wrbs)},
+- {DRVSTAT_INFO(be_polls)},
+- {DRVSTAT_INFO(be_tx_events)},
+- {DRVSTAT_INFO(be_rx_events)},
+- {DRVSTAT_INFO(be_tx_compl)},
+- {DRVSTAT_INFO(be_rx_compl)},
+- {DRVSTAT_INFO(be_ethrx_post_fail)},
+- {DRVSTAT_INFO(be_802_3_dropped_frames)},
+- {DRVSTAT_INFO(be_802_3_malformed_frames)},
+- {DRVSTAT_INFO(be_tx_rate)},
+- {DRVSTAT_INFO(be_rx_rate)},
+- {PORTSTAT_INFO(rx_unicast_frames)},
+- {PORTSTAT_INFO(rx_multicast_frames)},
+- {PORTSTAT_INFO(rx_broadcast_frames)},
+- {PORTSTAT_INFO(rx_crc_errors)},
+- {PORTSTAT_INFO(rx_alignment_symbol_errors)},
+- {PORTSTAT_INFO(rx_pause_frames)},
+- {PORTSTAT_INFO(rx_control_frames)},
+- {PORTSTAT_INFO(rx_in_range_errors)},
+- {PORTSTAT_INFO(rx_out_range_errors)},
+- {PORTSTAT_INFO(rx_frame_too_long)},
+- {PORTSTAT_INFO(rx_address_match_errors)},
+- {PORTSTAT_INFO(rx_vlan_mismatch)},
+- {PORTSTAT_INFO(rx_dropped_too_small)},
+- {PORTSTAT_INFO(rx_dropped_too_short)},
+- {PORTSTAT_INFO(rx_dropped_header_too_small)},
+- {PORTSTAT_INFO(rx_dropped_tcp_length)},
+- {PORTSTAT_INFO(rx_dropped_runt)},
+- {PORTSTAT_INFO(rx_fifo_overflow)},
+- {PORTSTAT_INFO(rx_input_fifo_overflow)},
+- {PORTSTAT_INFO(rx_ip_checksum_errs)},
+- {PORTSTAT_INFO(rx_tcp_checksum_errs)},
+- {PORTSTAT_INFO(rx_udp_checksum_errs)},
+- {PORTSTAT_INFO(rx_non_rss_packets)},
+- {PORTSTAT_INFO(rx_ipv4_packets)},
+- {PORTSTAT_INFO(rx_ipv6_packets)},
+- {PORTSTAT_INFO(tx_unicastframes)},
+- {PORTSTAT_INFO(tx_multicastframes)},
+- {PORTSTAT_INFO(tx_broadcastframes)},
+- {PORTSTAT_INFO(tx_pauseframes)},
+- {PORTSTAT_INFO(tx_controlframes)},
+- {MISCSTAT_INFO(rx_drops_no_pbuf)},
+- {MISCSTAT_INFO(rx_drops_no_txpb)},
+- {MISCSTAT_INFO(rx_drops_no_erx_descr)},
+- {MISCSTAT_INFO(rx_drops_no_tpre_descr)},
+- {MISCSTAT_INFO(rx_drops_too_many_frags)},
+- {MISCSTAT_INFO(rx_drops_invalid_ring)},
+- {MISCSTAT_INFO(forwarded_packets)},
+- {MISCSTAT_INFO(rx_drops_mtu)},
+- {ERXSTAT_INFO(rx_drops_no_fragments)},
+-};
+-#define ETHTOOL_STATS_NUM ARRAY_SIZE(et_stats)
+-
+-static void
+-be_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo)
+-{
+- struct be_adapter *adapter = netdev_priv(netdev);
+-
+- strcpy(drvinfo->driver, DRV_NAME);
+- strcpy(drvinfo->version, DRV_VER);
+- strncpy(drvinfo->fw_version, adapter->fw_ver, FW_VER_LEN);
+- strcpy(drvinfo->bus_info, pci_name(adapter->pdev));
+- drvinfo->testinfo_len = 0;
+- drvinfo->regdump_len = 0;
+- drvinfo->eedump_len = 0;
+-}
+-
+-static int
+-be_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce)
+-{
+- struct be_adapter *adapter = netdev_priv(netdev);
+- struct be_eq_obj *rx_eq = &adapter->rx_eq;
+- struct be_eq_obj *tx_eq = &adapter->tx_eq;
+-
+- coalesce->rx_max_coalesced_frames = adapter->max_rx_coal;
+-
+- coalesce->rx_coalesce_usecs = rx_eq->cur_eqd;
+- coalesce->rx_coalesce_usecs_high = rx_eq->max_eqd;
+- coalesce->rx_coalesce_usecs_low = rx_eq->min_eqd;
+-
+- coalesce->tx_coalesce_usecs = tx_eq->cur_eqd;
+- coalesce->tx_coalesce_usecs_high = tx_eq->max_eqd;
+- coalesce->tx_coalesce_usecs_low = tx_eq->min_eqd;
+-
+- coalesce->use_adaptive_rx_coalesce = rx_eq->enable_aic;
+- coalesce->use_adaptive_tx_coalesce = tx_eq->enable_aic;
+-
+- return 0;
+-}
+-
+-/*
+- * This routine is used to set interrup coalescing delay *as well as*
+- * the number of pkts to coalesce for LRO.
+- */
+-static int
+-be_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce)
+-{
+- struct be_adapter *adapter = netdev_priv(netdev);
+- struct be_ctrl_info *ctrl = &adapter->ctrl;
+- struct be_eq_obj *rx_eq = &adapter->rx_eq;
+- struct be_eq_obj *tx_eq = &adapter->tx_eq;
+- u32 tx_max, tx_min, tx_cur;
+- u32 rx_max, rx_min, rx_cur;
+- int status = 0;
+-
+- if (coalesce->use_adaptive_tx_coalesce == 1)
+- return -EINVAL;
+-
+- adapter->max_rx_coal = coalesce->rx_max_coalesced_frames;
+- if (adapter->max_rx_coal > MAX_SKB_FRAGS)
+- adapter->max_rx_coal = MAX_SKB_FRAGS - 1;
+-
+- /* if AIC is being turned on now, start with an EQD of 0 */
+- if (rx_eq->enable_aic == 0 &&
+- coalesce->use_adaptive_rx_coalesce == 1) {
+- rx_eq->cur_eqd = 0;
+- }
+- rx_eq->enable_aic = coalesce->use_adaptive_rx_coalesce;
+-
+- rx_max = coalesce->rx_coalesce_usecs_high;
+- rx_min = coalesce->rx_coalesce_usecs_low;
+- rx_cur = coalesce->rx_coalesce_usecs;
+-
+- tx_max = coalesce->tx_coalesce_usecs_high;
+- tx_min = coalesce->tx_coalesce_usecs_low;
+- tx_cur = coalesce->tx_coalesce_usecs;
+-
+- if (tx_cur > BE_MAX_EQD)
+- tx_cur = BE_MAX_EQD;
+- if (tx_eq->cur_eqd != tx_cur) {
+- status = be_cmd_modify_eqd(ctrl, tx_eq->q.id, tx_cur);
+- if (!status)
+- tx_eq->cur_eqd = tx_cur;
+- }
+-
+- if (rx_eq->enable_aic) {
+- if (rx_max > BE_MAX_EQD)
+- rx_max = BE_MAX_EQD;
+- if (rx_min > rx_max)
+- rx_min = rx_max;
+- rx_eq->max_eqd = rx_max;
+- rx_eq->min_eqd = rx_min;
+- if (rx_eq->cur_eqd > rx_max)
+- rx_eq->cur_eqd = rx_max;
+- if (rx_eq->cur_eqd < rx_min)
+- rx_eq->cur_eqd = rx_min;
+- } else {
+- if (rx_cur > BE_MAX_EQD)
+- rx_cur = BE_MAX_EQD;
+- if (rx_eq->cur_eqd != rx_cur) {
+- status = be_cmd_modify_eqd(ctrl, rx_eq->q.id, rx_cur);
+- if (!status)
+- rx_eq->cur_eqd = rx_cur;
+- }
+- }
+- return 0;
+-}
+-
+-static u32 be_get_rx_csum(struct net_device *netdev)
+-{
+- struct be_adapter *adapter = netdev_priv(netdev);
+-
+- return adapter->rx_csum;
+-}
+-
+-static int be_set_rx_csum(struct net_device *netdev, uint32_t data)
+-{
+- struct be_adapter *adapter = netdev_priv(netdev);
+-
+- if (data)
+- adapter->rx_csum = true;
+- else
+- adapter->rx_csum = false;
+-
+- return 0;
+-}
+-
+-static void
+-be_get_ethtool_stats(struct net_device *netdev,
+- struct ethtool_stats *stats, uint64_t *data)
+-{
+- struct be_adapter *adapter = netdev_priv(netdev);
+- struct be_drvr_stats *drvr_stats = &adapter->stats.drvr_stats;
+- struct be_hw_stats *hw_stats = hw_stats_from_cmd(adapter->stats.cmd.va);
+- struct be_rxf_stats *rxf_stats = &hw_stats->rxf;
+- struct be_port_rxf_stats *port_stats =
+- &rxf_stats->port[adapter->port_num];
+- struct net_device_stats *net_stats = &adapter->stats.net_stats;
+- struct be_erx_stats *erx_stats = &hw_stats->erx;
+- void *p = NULL;
+- int i;
+-
+- for (i = 0; i < ETHTOOL_STATS_NUM; i++) {
+- switch (et_stats[i].type) {
+- case NETSTAT:
+- p = net_stats;
+- break;
+- case DRVSTAT:
+- p = drvr_stats;
+- break;
+- case PORTSTAT:
+- p = port_stats;
+- break;
+- case MISCSTAT:
+- p = rxf_stats;
+- break;
+- case ERXSTAT: /* Currently only one ERX stat is provided */
+- p = (u32 *)erx_stats + adapter->rx_obj.q.id;
+- break;
+- }
+-
+- p = (u8 *)p + et_stats[i].offset;
+- data[i] = (et_stats[i].size == sizeof(u64)) ?
+- *(u64 *)p: *(u32 *)p;
+- }
+-
+- return;
+-}
+-
+-static void
+-be_get_stat_strings(struct net_device *netdev, uint32_t stringset,
+- uint8_t *data)
+-{
+- int i;
+- switch (stringset) {
+- case ETH_SS_STATS:
+- for (i = 0; i < ETHTOOL_STATS_NUM; i++) {
+- memcpy(data, et_stats[i].desc, ETH_GSTRING_LEN);
+- data += ETH_GSTRING_LEN;
+- }
+- break;
+- }
+-}
+-
+-static int be_get_stats_count(struct net_device *netdev)
+-{
+- return ETHTOOL_STATS_NUM;
+-}
+-
+-static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
+-{
+- ecmd->speed = SPEED_10000;
+- ecmd->duplex = DUPLEX_FULL;
+- ecmd->autoneg = AUTONEG_DISABLE;
+- return 0;
+-}
+-
+-static void
+-be_get_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring)
+-{
+- struct be_adapter *adapter = netdev_priv(netdev);
+-
+- ring->rx_max_pending = adapter->rx_obj.q.len;
+- ring->tx_max_pending = adapter->tx_obj.q.len;
+-
+- ring->rx_pending = atomic_read(&adapter->rx_obj.q.used);
+- ring->tx_pending = atomic_read(&adapter->tx_obj.q.used);
+-}
+-
+-static void
+-be_get_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *ecmd)
+-{
+- struct be_adapter *adapter = netdev_priv(netdev);
+-
+- be_cmd_get_flow_control(&adapter->ctrl, &ecmd->tx_pause,
+- &ecmd->rx_pause);
+- ecmd->autoneg = AUTONEG_ENABLE;
+-}
+-
+-static int
+-be_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *ecmd)
+-{
+- struct be_adapter *adapter = netdev_priv(netdev);
+- int status;
+-
+- if (ecmd->autoneg != AUTONEG_ENABLE)
+- return -EINVAL;
+-
+- status = be_cmd_set_flow_control(&adapter->ctrl, ecmd->tx_pause,
+- ecmd->rx_pause);
+- if (!status)
+- dev_warn(&adapter->pdev->dev, "Pause param set failed.\n");
+-
+- return status;
+-}
+-
+-struct ethtool_ops be_ethtool_ops = {
+- .get_settings = be_get_settings,
+- .get_drvinfo = be_get_drvinfo,
+- .get_link = ethtool_op_get_link,
+- .get_coalesce = be_get_coalesce,
+- .set_coalesce = be_set_coalesce,
+- .get_ringparam = be_get_ringparam,
+- .get_pauseparam = be_get_pauseparam,
+- .set_pauseparam = be_set_pauseparam,
+- .get_rx_csum = be_get_rx_csum,
+- .set_rx_csum = be_set_rx_csum,
+- .get_tx_csum = ethtool_op_get_tx_csum,
+- .set_tx_csum = ethtool_op_set_tx_csum,
+- .get_sg = ethtool_op_get_sg,
+- .set_sg = ethtool_op_set_sg,
+- .get_tso = ethtool_op_get_tso,
+- .set_tso = ethtool_op_set_tso,
+- .get_strings = be_get_stat_strings,
+- .get_stats_count = be_get_stats_count,
+- .get_ethtool_stats = be_get_ethtool_stats,
+-};
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/benet/be.h linux-2.6.29-rc3.owrt/drivers/net/benet/be.h
+--- linux-2.6.29.owrt/drivers/net/benet/be.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/benet/be.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,328 +0,0 @@
+-/*
+- * Copyright (C) 2005 - 2009 ServerEngines
+- * All rights reserved.
+- *
+- * 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 full GNU General
+- * Public License is included in this distribution in the file called COPYING.
+- *
+- * Contact Information:
+- * linux-drivers@serverengines.com
+- *
+- * ServerEngines
+- * 209 N. Fair Oaks Ave
+- * Sunnyvale, CA 94085
+- */
+-
+-#ifndef BE_H
+-#define BE_H
+-
+-#include <linux/pci.h>
+-#include <linux/etherdevice.h>
+-#include <linux/version.h>
+-#include <linux/delay.h>
+-#include <net/tcp.h>
+-#include <net/ip.h>
+-#include <net/ipv6.h>
+-#include <linux/if_vlan.h>
+-#include <linux/workqueue.h>
+-#include <linux/interrupt.h>
+-#include <linux/inet_lro.h>
+-
+-#include "be_hw.h"
+-
+-#define DRV_VER "2.0.348"
+-#define DRV_NAME "be2net"
+-#define BE_NAME "ServerEngines BladeEngine2 10Gbps NIC"
+-#define DRV_DESC BE_NAME "Driver"
+-
+-/* Number of bytes of an RX frame that are copied to skb->data */
+-#define BE_HDR_LEN 64
+-#define BE_MAX_JUMBO_FRAME_SIZE 9018
+-#define BE_MIN_MTU 256
+-
+-#define BE_NUM_VLANS_SUPPORTED 64
+-#define BE_MAX_EQD 96
+-#define BE_MAX_TX_FRAG_COUNT 30
+-
+-#define EVNT_Q_LEN 1024
+-#define TX_Q_LEN 2048
+-#define TX_CQ_LEN 1024
+-#define RX_Q_LEN 1024 /* Does not support any other value */
+-#define RX_CQ_LEN 1024
+-#define MCC_Q_LEN 64 /* total size not to exceed 8 pages */
+-#define MCC_CQ_LEN 256
+-
+-#define BE_NAPI_WEIGHT 64
+-#define MAX_RX_POST BE_NAPI_WEIGHT /* Frags posted at a time */
+-#define RX_FRAGS_REFILL_WM (RX_Q_LEN - MAX_RX_POST)
+-
+-#define BE_MAX_LRO_DESCRIPTORS 16
+-#define BE_MAX_FRAGS_PER_FRAME 16
+-
+-struct be_dma_mem {
+- void *va;
+- dma_addr_t dma;
+- u32 size;
+-};
+-
+-struct be_queue_info {
+- struct be_dma_mem dma_mem;
+- u16 len;
+- u16 entry_size; /* Size of an element in the queue */
+- u16 id;
+- u16 tail, head;
+- bool created;
+- atomic_t used; /* Number of valid elements in the queue */
+-};
+-
+-struct be_ctrl_info {
+- u8 __iomem *csr;
+- u8 __iomem *db; /* Door Bell */
+- u8 __iomem *pcicfg; /* PCI config space */
+- int pci_func;
+-
+- /* Mbox used for cmd request/response */
+- spinlock_t cmd_lock; /* For serializing cmds to BE card */
+- struct be_dma_mem mbox_mem;
+- /* Mbox mem is adjusted to align to 16 bytes. The allocated addr
+- * is stored for freeing purpose */
+- struct be_dma_mem mbox_mem_alloced;
+-};
+-
+-#include "be_cmds.h"
+-
+-struct be_drvr_stats {
+- u32 be_tx_reqs; /* number of TX requests initiated */
+- u32 be_tx_stops; /* number of times TX Q was stopped */
+- u32 be_fwd_reqs; /* number of send reqs through forwarding i/f */
+- u32 be_tx_wrbs; /* number of tx WRBs used */
+- u32 be_tx_events; /* number of tx completion events */
+- u32 be_tx_compl; /* number of tx completion entries processed */
+- u64 be_tx_jiffies;
+- ulong be_tx_bytes;
+- ulong be_tx_bytes_prev;
+- u32 be_tx_rate;
+-
+- u32 cache_barrier[16];
+-
+- u32 be_ethrx_post_fail;/* number of ethrx buffer alloc failures */
+- u32 be_polls; /* number of times NAPI called poll function */
+- u32 be_rx_events; /* number of ucast rx completion events */
+- u32 be_rx_compl; /* number of rx completion entries processed */
+- u32 be_lro_hgram_data[8]; /* histogram of LRO data packets */
+- u32 be_lro_hgram_ack[8]; /* histogram of LRO ACKs */
+- u64 be_rx_jiffies;
+- ulong be_rx_bytes;
+- ulong be_rx_bytes_prev;
+- u32 be_rx_rate;
+- /* number of non ether type II frames dropped where
+- * frame len > length field of Mac Hdr */
+- u32 be_802_3_dropped_frames;
+- /* number of non ether type II frames malformed where
+- * in frame len < length field of Mac Hdr */
+- u32 be_802_3_malformed_frames;
+- u32 be_rxcp_err; /* Num rx completion entries w/ err set. */
+- ulong rx_fps_jiffies; /* jiffies at last FPS calc */
+- u32 be_rx_frags;
+- u32 be_prev_rx_frags;
+- u32 be_rx_fps; /* Rx frags per second */
+-};
+-
+-struct be_stats_obj {
+- struct be_drvr_stats drvr_stats;
+- struct net_device_stats net_stats;
+- struct be_dma_mem cmd;
+-};
+-
+-struct be_eq_obj {
+- struct be_queue_info q;
+- char desc[32];
+-
+- /* Adaptive interrupt coalescing (AIC) info */
+- bool enable_aic;
+- u16 min_eqd; /* in usecs */
+- u16 max_eqd; /* in usecs */
+- u16 cur_eqd; /* in usecs */
+-
+- struct napi_struct napi;
+-};
+-
+-struct be_tx_obj {
+- struct be_queue_info q;
+- struct be_queue_info cq;
+- /* Remember the skbs that were transmitted */
+- struct sk_buff *sent_skb_list[TX_Q_LEN];
+-};
+-
+-/* Struct to remember the pages posted for rx frags */
+-struct be_rx_page_info {
+- struct page *page;
+- dma_addr_t bus;
+- u16 page_offset;
+- bool last_page_user;
+-};
+-
+-struct be_rx_obj {
+- struct be_queue_info q;
+- struct be_queue_info cq;
+- struct be_rx_page_info page_info_tbl[RX_Q_LEN];
+- struct net_lro_mgr lro_mgr;
+- struct net_lro_desc lro_desc[BE_MAX_LRO_DESCRIPTORS];
+-};
+-
+-#define BE_NUM_MSIX_VECTORS 2 /* 1 each for Tx and Rx */
+-struct be_adapter {
+- struct pci_dev *pdev;
+- struct net_device *netdev;
+-
+- /* Mbox, pci config, csr address information */
+- struct be_ctrl_info ctrl;
+-
+- struct msix_entry msix_entries[BE_NUM_MSIX_VECTORS];
+- bool msix_enabled;
+- bool isr_registered;
+-
+- /* TX Rings */
+- struct be_eq_obj tx_eq;
+- struct be_tx_obj tx_obj;
+-
+- u32 cache_line_break[8];
+-
+- /* Rx rings */
+- struct be_eq_obj rx_eq;
+- struct be_rx_obj rx_obj;
+- u32 big_page_size; /* Compounded page size shared by rx wrbs */
+- bool rx_post_starved; /* Zero rx frags have been posted to BE */
+-
+- struct vlan_group *vlan_grp;
+- u16 num_vlans;
+- u8 vlan_tag[VLAN_GROUP_ARRAY_LEN];
+-
+- struct be_stats_obj stats;
+- /* Work queue used to perform periodic tasks like getting statistics */
+- struct delayed_work work;
+-
+- /* Ethtool knobs and info */
+- bool rx_csum; /* BE card must perform rx-checksumming */
+- u32 max_rx_coal;
+- char fw_ver[FW_VER_LEN];
+- u32 if_handle; /* Used to configure filtering */
+- u32 pmac_id; /* MAC addr handle used by BE card */
+-
+- struct be_link_info link;
+- u32 port_num;
+-};
+-
+-extern struct ethtool_ops be_ethtool_ops;
+-
+-#define drvr_stats(adapter) (&adapter->stats.drvr_stats)
+-
+-#define BE_SET_NETDEV_OPS(netdev, ops) (netdev->netdev_ops = ops)
+-
+-static inline u32 MODULO(u16 val, u16 limit)
+-{
+- BUG_ON(limit & (limit - 1));
+- return val & (limit - 1);
+-}
+-
+-static inline void index_adv(u16 *index, u16 val, u16 limit)
+-{
+- *index = MODULO((*index + val), limit);
+-}
+-
+-static inline void index_inc(u16 *index, u16 limit)
+-{
+- *index = MODULO((*index + 1), limit);
+-}
+-
+-#define PAGE_SHIFT_4K 12
+-#define PAGE_SIZE_4K (1 << PAGE_SHIFT_4K)
+-
+-/* Returns number of pages spanned by the data starting at the given addr */
+-#define PAGES_4K_SPANNED(_address, size) \
+- ((u32)((((size_t)(_address) & (PAGE_SIZE_4K - 1)) + \
+- (size) + (PAGE_SIZE_4K - 1)) >> PAGE_SHIFT_4K))
+-
+-/* Byte offset into the page corresponding to given address */
+-#define OFFSET_IN_PAGE(addr) \
+- ((size_t)(addr) & (PAGE_SIZE_4K-1))
+-
+-/* Returns bit offset within a DWORD of a bitfield */
+-#define AMAP_BIT_OFFSET(_struct, field) \
+- (((size_t)&(((_struct *)0)->field))%32)
+-
+-/* Returns the bit mask of the field that is NOT shifted into location. */
+-static inline u32 amap_mask(u32 bitsize)
+-{
+- return (bitsize == 32 ? 0xFFFFFFFF : (1 << bitsize) - 1);
+-}
+-
+-static inline void
+-amap_set(void *ptr, u32 dw_offset, u32 mask, u32 offset, u32 value)
+-{
+- u32 *dw = (u32 *) ptr + dw_offset;
+- *dw &= ~(mask << offset);
+- *dw |= (mask & value) << offset;
+-}
+-
+-#define AMAP_SET_BITS(_struct, field, ptr, val) \
+- amap_set(ptr, \
+- offsetof(_struct, field)/32, \
+- amap_mask(sizeof(((_struct *)0)->field)), \
+- AMAP_BIT_OFFSET(_struct, field), \
+- val)
+-
+-static inline u32 amap_get(void *ptr, u32 dw_offset, u32 mask, u32 offset)
+-{
+- u32 *dw = (u32 *) ptr;
+- return mask & (*(dw + dw_offset) >> offset);
+-}
+-
+-#define AMAP_GET_BITS(_struct, field, ptr) \
+- amap_get(ptr, \
+- offsetof(_struct, field)/32, \
+- amap_mask(sizeof(((_struct *)0)->field)), \
+- AMAP_BIT_OFFSET(_struct, field))
+-
+-#define be_dws_cpu_to_le(wrb, len) swap_dws(wrb, len)
+-#define be_dws_le_to_cpu(wrb, len) swap_dws(wrb, len)
+-static inline void swap_dws(void *wrb, int len)
+-{
+-#ifdef __BIG_ENDIAN
+- u32 *dw = wrb;
+- BUG_ON(len % 4);
+- do {
+- *dw = cpu_to_le32(*dw);
+- dw++;
+- len -= 4;
+- } while (len);
+-#endif /* __BIG_ENDIAN */
+-}
+-
+-static inline u8 is_tcp_pkt(struct sk_buff *skb)
+-{
+- u8 val = 0;
+-
+- if (ip_hdr(skb)->version == 4)
+- val = (ip_hdr(skb)->protocol == IPPROTO_TCP);
+- else if (ip_hdr(skb)->version == 6)
+- val = (ipv6_hdr(skb)->nexthdr == NEXTHDR_TCP);
+-
+- return val;
+-}
+-
+-static inline u8 is_udp_pkt(struct sk_buff *skb)
+-{
+- u8 val = 0;
+-
+- if (ip_hdr(skb)->version == 4)
+- val = (ip_hdr(skb)->protocol == IPPROTO_UDP);
+- else if (ip_hdr(skb)->version == 6)
+- val = (ipv6_hdr(skb)->nexthdr == NEXTHDR_UDP);
+-
+- return val;
+-}
+-
+-#endif /* BE_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/benet/be_hw.h linux-2.6.29-rc3.owrt/drivers/net/benet/be_hw.h
+--- linux-2.6.29.owrt/drivers/net/benet/be_hw.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/benet/be_hw.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,211 +0,0 @@
+-/*
+- * Copyright (C) 2005 - 2009 ServerEngines
+- * All rights reserved.
+- *
+- * 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 full GNU General
+- * Public License is included in this distribution in the file called COPYING.
+- *
+- * Contact Information:
+- * linux-drivers@serverengines.com
+- *
+- * ServerEngines
+- * 209 N. Fair Oaks Ave
+- * Sunnyvale, CA 94085
+- */
+-
+-/********* Mailbox door bell *************/
+-/* Used for driver communication with the FW.
+- * The software must write this register twice to post any command. First,
+- * it writes the register with hi=1 and the upper bits of the physical address
+- * for the MAILBOX structure. Software must poll the ready bit until this
+- * is acknowledged. Then, sotware writes the register with hi=0 with the lower
+- * bits in the address. It must poll the ready bit until the command is
+- * complete. Upon completion, the MAILBOX will contain a valid completion
+- * queue entry.
+- */
+-#define MPU_MAILBOX_DB_OFFSET 0x160
+-#define MPU_MAILBOX_DB_RDY_MASK 0x1 /* bit 0 */
+-#define MPU_MAILBOX_DB_HI_MASK 0x2 /* bit 1 */
+-
+-#define MPU_EP_CONTROL 0
+-
+-/********** MPU semphore ******************/
+-#define MPU_EP_SEMAPHORE_OFFSET 0xac
+-#define EP_SEMAPHORE_POST_STAGE_MASK 0x0000FFFF
+-#define EP_SEMAPHORE_POST_ERR_MASK 0x1
+-#define EP_SEMAPHORE_POST_ERR_SHIFT 31
+-/* MPU semphore POST stage values */
+-#define POST_STAGE_AWAITING_HOST_RDY 0x1 /* FW awaiting goahead from host */
+-#define POST_STAGE_HOST_RDY 0x2 /* Host has given go-ahed to FW */
+-#define POST_STAGE_BE_RESET 0x3 /* Host wants to reset chip */
+-#define POST_STAGE_ARMFW_RDY 0xc000 /* FW is done with POST */
+-
+-/********* Memory BAR register ************/
+-#define PCICFG_MEMBAR_CTRL_INT_CTRL_OFFSET 0xfc
+-/* Host Interrupt Enable, if set interrupts are enabled although "PCI Interrupt
+- * Disable" may still globally block interrupts in addition to individual
+- * interrupt masks; a mechanism for the device driver to block all interrupts
+- * atomically without having to arbitrate for the PCI Interrupt Disable bit
+- * with the OS.
+- */
+-#define MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK (1 << 29) /* bit 29 */
+-/* PCI physical function number */
+-#define MEMBAR_CTRL_INT_CTRL_PFUNC_MASK 0x7 /* bits 26 - 28 */
+-#define MEMBAR_CTRL_INT_CTRL_PFUNC_SHIFT 26
+-
+-/********* Event Q door bell *************/
+-#define DB_EQ_OFFSET DB_CQ_OFFSET
+-#define DB_EQ_RING_ID_MASK 0x1FF /* bits 0 - 8 */
+-/* Clear the interrupt for this eq */
+-#define DB_EQ_CLR_SHIFT (9) /* bit 9 */
+-/* Must be 1 */
+-#define DB_EQ_EVNT_SHIFT (10) /* bit 10 */
+-/* Number of event entries processed */
+-#define DB_EQ_NUM_POPPED_SHIFT (16) /* bits 16 - 28 */
+-/* Rearm bit */
+-#define DB_EQ_REARM_SHIFT (29) /* bit 29 */
+-
+-/********* Compl Q door bell *************/
+-#define DB_CQ_OFFSET 0x120
+-#define DB_CQ_RING_ID_MASK 0x3FF /* bits 0 - 9 */
+-/* Number of event entries processed */
+-#define DB_CQ_NUM_POPPED_SHIFT (16) /* bits 16 - 28 */
+-/* Rearm bit */
+-#define DB_CQ_REARM_SHIFT (29) /* bit 29 */
+-
+-/********** TX ULP door bell *************/
+-#define DB_TXULP1_OFFSET 0x60
+-#define DB_TXULP_RING_ID_MASK 0x7FF /* bits 0 - 10 */
+-/* Number of tx entries posted */
+-#define DB_TXULP_NUM_POSTED_SHIFT (16) /* bits 16 - 29 */
+-#define DB_TXULP_NUM_POSTED_MASK 0x3FFF /* bits 16 - 29 */
+-
+-/********** RQ(erx) door bell ************/
+-#define DB_RQ_OFFSET 0x100
+-#define DB_RQ_RING_ID_MASK 0x3FF /* bits 0 - 9 */
+-/* Number of rx frags posted */
+-#define DB_RQ_NUM_POSTED_SHIFT (24) /* bits 24 - 31 */
+-
+-/*
+- * BE descriptors: host memory data structures whose formats
+- * are hardwired in BE silicon.
+- */
+-/* Event Queue Descriptor */
+-#define EQ_ENTRY_VALID_MASK 0x1 /* bit 0 */
+-#define EQ_ENTRY_RES_ID_MASK 0xFFFF /* bits 16 - 31 */
+-#define EQ_ENTRY_RES_ID_SHIFT 16
+-struct be_eq_entry {
+- u32 evt;
+-};
+-
+-/* TX Queue Descriptor */
+-#define ETH_WRB_FRAG_LEN_MASK 0xFFFF
+-struct be_eth_wrb {
+- u32 frag_pa_hi; /* dword 0 */
+- u32 frag_pa_lo; /* dword 1 */
+- u32 rsvd0; /* dword 2 */
+- u32 frag_len; /* dword 3: bits 0 - 15 */
+-} __packed;
+-
+-/* Pseudo amap definition for eth_hdr_wrb in which each bit of the
+- * actual structure is defined as a byte : used to calculate
+- * offset/shift/mask of each field */
+-struct amap_eth_hdr_wrb {
+- u8 rsvd0[32]; /* dword 0 */
+- u8 rsvd1[32]; /* dword 1 */
+- u8 complete; /* dword 2 */
+- u8 event;
+- u8 crc;
+- u8 forward;
+- u8 ipsec;
+- u8 mgmt;
+- u8 ipcs;
+- u8 udpcs;
+- u8 tcpcs;
+- u8 lso;
+- u8 vlan;
+- u8 gso[2];
+- u8 num_wrb[5];
+- u8 lso_mss[14];
+- u8 len[16]; /* dword 3 */
+- u8 vlan_tag[16];
+-} __packed;
+-
+-struct be_eth_hdr_wrb {
+- u32 dw[4];
+-};
+-
+-/* TX Compl Queue Descriptor */
+-
+-/* Pseudo amap definition for eth_tx_compl in which each bit of the
+- * actual structure is defined as a byte: used to calculate
+- * offset/shift/mask of each field */
+-struct amap_eth_tx_compl {
+- u8 wrb_index[16]; /* dword 0 */
+- u8 ct[2]; /* dword 0 */
+- u8 port[2]; /* dword 0 */
+- u8 rsvd0[8]; /* dword 0 */
+- u8 status[4]; /* dword 0 */
+- u8 user_bytes[16]; /* dword 1 */
+- u8 nwh_bytes[8]; /* dword 1 */
+- u8 lso; /* dword 1 */
+- u8 cast_enc[2]; /* dword 1 */
+- u8 rsvd1[5]; /* dword 1 */
+- u8 rsvd2[32]; /* dword 2 */
+- u8 pkts[16]; /* dword 3 */
+- u8 ringid[11]; /* dword 3 */
+- u8 hash_val[4]; /* dword 3 */
+- u8 valid; /* dword 3 */
+-} __packed;
+-
+-struct be_eth_tx_compl {
+- u32 dw[4];
+-};
+-
+-/* RX Queue Descriptor */
+-struct be_eth_rx_d {
+- u32 fragpa_hi;
+- u32 fragpa_lo;
+-};
+-
+-/* RX Compl Queue Descriptor */
+-
+-/* Pseudo amap definition for eth_rx_compl in which each bit of the
+- * actual structure is defined as a byte: used to calculate
+- * offset/shift/mask of each field */
+-struct amap_eth_rx_compl {
+- u8 vlan_tag[16]; /* dword 0 */
+- u8 pktsize[14]; /* dword 0 */
+- u8 port; /* dword 0 */
+- u8 ip_opt; /* dword 0 */
+- u8 err; /* dword 1 */
+- u8 rsshp; /* dword 1 */
+- u8 ipf; /* dword 1 */
+- u8 tcpf; /* dword 1 */
+- u8 udpf; /* dword 1 */
+- u8 ipcksm; /* dword 1 */
+- u8 l4_cksm; /* dword 1 */
+- u8 ip_version; /* dword 1 */
+- u8 macdst[6]; /* dword 1 */
+- u8 vtp; /* dword 1 */
+- u8 rsvd0; /* dword 1 */
+- u8 fragndx[10]; /* dword 1 */
+- u8 ct[2]; /* dword 1 */
+- u8 sw; /* dword 1 */
+- u8 numfrags[3]; /* dword 1 */
+- u8 rss_flush; /* dword 2 */
+- u8 cast_enc[2]; /* dword 2 */
+- u8 qnq; /* dword 2 */
+- u8 rss_bank; /* dword 2 */
+- u8 rsvd1[23]; /* dword 2 */
+- u8 lro_pkt; /* dword 2 */
+- u8 rsvd2[2]; /* dword 2 */
+- u8 valid; /* dword 2 */
+- u8 rsshash[32]; /* dword 3 */
+-} __packed;
+-
+-struct be_eth_rx_compl {
+- u32 dw[4];
+-};
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/benet/be_main.c linux-2.6.29-rc3.owrt/drivers/net/benet/be_main.c
+--- linux-2.6.29.owrt/drivers/net/benet/be_main.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/benet/be_main.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,1911 +0,0 @@
+-/*
+- * Copyright (C) 2005 - 2009 ServerEngines
+- * All rights reserved.
+- *
+- * 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 full GNU General
+- * Public License is included in this distribution in the file called COPYING.
+- *
+- * Contact Information:
+- * linux-drivers@serverengines.com
+- *
+- * ServerEngines
+- * 209 N. Fair Oaks Ave
+- * Sunnyvale, CA 94085
+- */
+-
+-#include "be.h"
+-
+-MODULE_VERSION(DRV_VER);
+-MODULE_DEVICE_TABLE(pci, be_dev_ids);
+-MODULE_DESCRIPTION(DRV_DESC " " DRV_VER);
+-MODULE_AUTHOR("ServerEngines Corporation");
+-MODULE_LICENSE("GPL");
+-
+-static unsigned int rx_frag_size = 2048;
+-module_param(rx_frag_size, uint, S_IRUGO);
+-MODULE_PARM_DESC(rx_frag_size, "Size of a fragment that holds rcvd data.");
+-
+-#define BE_VENDOR_ID 0x19a2
+-#define BE2_DEVICE_ID_1 0x0211
+-static DEFINE_PCI_DEVICE_TABLE(be_dev_ids) = {
+- { PCI_DEVICE(BE_VENDOR_ID, BE2_DEVICE_ID_1) },
+- { 0 }
+-};
+-MODULE_DEVICE_TABLE(pci, be_dev_ids);
+-
+-static void be_queue_free(struct be_adapter *adapter, struct be_queue_info *q)
+-{
+- struct be_dma_mem *mem = &q->dma_mem;
+- if (mem->va)
+- pci_free_consistent(adapter->pdev, mem->size,
+- mem->va, mem->dma);
+-}
+-
+-static int be_queue_alloc(struct be_adapter *adapter, struct be_queue_info *q,
+- u16 len, u16 entry_size)
+-{
+- struct be_dma_mem *mem = &q->dma_mem;
+-
+- memset(q, 0, sizeof(*q));
+- q->len = len;
+- q->entry_size = entry_size;
+- mem->size = len * entry_size;
+- mem->va = pci_alloc_consistent(adapter->pdev, mem->size, &mem->dma);
+- if (!mem->va)
+- return -1;
+- memset(mem->va, 0, mem->size);
+- return 0;
+-}
+-
+-static inline void *queue_head_node(struct be_queue_info *q)
+-{
+- return q->dma_mem.va + q->head * q->entry_size;
+-}
+-
+-static inline void *queue_tail_node(struct be_queue_info *q)
+-{
+- return q->dma_mem.va + q->tail * q->entry_size;
+-}
+-
+-static inline void queue_head_inc(struct be_queue_info *q)
+-{
+- index_inc(&q->head, q->len);
+-}
+-
+-static inline void queue_tail_inc(struct be_queue_info *q)
+-{
+- index_inc(&q->tail, q->len);
+-}
+-
+-static void be_intr_set(struct be_ctrl_info *ctrl, bool enable)
+-{
+- u8 __iomem *addr = ctrl->pcicfg + PCICFG_MEMBAR_CTRL_INT_CTRL_OFFSET;
+- u32 reg = ioread32(addr);
+- u32 enabled = reg & MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK;
+- if (!enabled && enable) {
+- reg |= MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK;
+- } else if (enabled && !enable) {
+- reg &= ~MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK;
+- } else {
+- printk(KERN_WARNING DRV_NAME
+- ": bad value in membar_int_ctrl reg=0x%x\n", reg);
+- return;
+- }
+- iowrite32(reg, addr);
+-}
+-
+-static void be_rxq_notify(struct be_ctrl_info *ctrl, u16 qid, u16 posted)
+-{
+- u32 val = 0;
+- val |= qid & DB_RQ_RING_ID_MASK;
+- val |= posted << DB_RQ_NUM_POSTED_SHIFT;
+- iowrite32(val, ctrl->db + DB_RQ_OFFSET);
+-}
+-
+-static void be_txq_notify(struct be_ctrl_info *ctrl, u16 qid, u16 posted)
+-{
+- u32 val = 0;
+- val |= qid & DB_TXULP_RING_ID_MASK;
+- val |= (posted & DB_TXULP_NUM_POSTED_MASK) << DB_TXULP_NUM_POSTED_SHIFT;
+- iowrite32(val, ctrl->db + DB_TXULP1_OFFSET);
+-}
+-
+-static void be_eq_notify(struct be_ctrl_info *ctrl, u16 qid,
+- bool arm, bool clear_int, u16 num_popped)
+-{
+- u32 val = 0;
+- val |= qid & DB_EQ_RING_ID_MASK;
+- if (arm)
+- val |= 1 << DB_EQ_REARM_SHIFT;
+- if (clear_int)
+- val |= 1 << DB_EQ_CLR_SHIFT;
+- val |= 1 << DB_EQ_EVNT_SHIFT;
+- val |= num_popped << DB_EQ_NUM_POPPED_SHIFT;
+- iowrite32(val, ctrl->db + DB_EQ_OFFSET);
+-}
+-
+-static void be_cq_notify(struct be_ctrl_info *ctrl, u16 qid,
+- bool arm, u16 num_popped)
+-{
+- u32 val = 0;
+- val |= qid & DB_CQ_RING_ID_MASK;
+- if (arm)
+- val |= 1 << DB_CQ_REARM_SHIFT;
+- val |= num_popped << DB_CQ_NUM_POPPED_SHIFT;
+- iowrite32(val, ctrl->db + DB_CQ_OFFSET);
+-}
+-
+-
+-static int be_mac_addr_set(struct net_device *netdev, void *p)
+-{
+- struct be_adapter *adapter = netdev_priv(netdev);
+- struct sockaddr *addr = p;
+- int status = 0;
+-
+- if (netif_running(netdev)) {
+- status = be_cmd_pmac_del(&adapter->ctrl, adapter->if_handle,
+- adapter->pmac_id);
+- if (status)
+- return status;
+-
+- status = be_cmd_pmac_add(&adapter->ctrl, (u8 *)addr->sa_data,
+- adapter->if_handle, &adapter->pmac_id);
+- }
+-
+- if (!status)
+- memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
+-
+- return status;
+-}
+-
+-static void netdev_stats_update(struct be_adapter *adapter)
+-{
+- struct be_hw_stats *hw_stats = hw_stats_from_cmd(adapter->stats.cmd.va);
+- struct be_rxf_stats *rxf_stats = &hw_stats->rxf;
+- struct be_port_rxf_stats *port_stats =
+- &rxf_stats->port[adapter->port_num];
+- struct net_device_stats *dev_stats = &adapter->stats.net_stats;
+-
+- dev_stats->rx_packets = port_stats->rx_total_frames;
+- dev_stats->tx_packets = port_stats->tx_unicastframes +
+- port_stats->tx_multicastframes + port_stats->tx_broadcastframes;
+- dev_stats->rx_bytes = (u64) port_stats->rx_bytes_msd << 32 |
+- (u64) port_stats->rx_bytes_lsd;
+- dev_stats->tx_bytes = (u64) port_stats->tx_bytes_msd << 32 |
+- (u64) port_stats->tx_bytes_lsd;
+-
+- /* bad pkts received */
+- dev_stats->rx_errors = port_stats->rx_crc_errors +
+- port_stats->rx_alignment_symbol_errors +
+- port_stats->rx_in_range_errors +
+- port_stats->rx_out_range_errors + port_stats->rx_frame_too_long;
+-
+- /* packet transmit problems */
+- dev_stats->tx_errors = 0;
+-
+- /* no space in linux buffers */
+- dev_stats->rx_dropped = 0;
+-
+- /* no space available in linux */
+- dev_stats->tx_dropped = 0;
+-
+- dev_stats->multicast = port_stats->tx_multicastframes;
+- dev_stats->collisions = 0;
+-
+- /* detailed rx errors */
+- dev_stats->rx_length_errors = port_stats->rx_in_range_errors +
+- port_stats->rx_out_range_errors + port_stats->rx_frame_too_long;
+- /* receive ring buffer overflow */
+- dev_stats->rx_over_errors = 0;
+- dev_stats->rx_crc_errors = port_stats->rx_crc_errors;
+-
+- /* frame alignment errors */
+- dev_stats->rx_frame_errors = port_stats->rx_alignment_symbol_errors;
+- /* receiver fifo overrun */
+- /* drops_no_pbuf is no per i/f, it's per BE card */
+- dev_stats->rx_fifo_errors = port_stats->rx_fifo_overflow +
+- port_stats->rx_input_fifo_overflow +
+- rxf_stats->rx_drops_no_pbuf;
+- /* receiver missed packetd */
+- dev_stats->rx_missed_errors = 0;
+- /* detailed tx_errors */
+- dev_stats->tx_aborted_errors = 0;
+- dev_stats->tx_carrier_errors = 0;
+- dev_stats->tx_fifo_errors = 0;
+- dev_stats->tx_heartbeat_errors = 0;
+- dev_stats->tx_window_errors = 0;
+-}
+-
+-static void be_link_status_update(struct be_adapter *adapter)
+-{
+- struct be_link_info *prev = &adapter->link;
+- struct be_link_info now = { 0 };
+- struct net_device *netdev = adapter->netdev;
+-
+- be_cmd_link_status_query(&adapter->ctrl, &now);
+-
+- /* If link came up or went down */
+- if (now.speed != prev->speed && (now.speed == PHY_LINK_SPEED_ZERO ||
+- prev->speed == PHY_LINK_SPEED_ZERO)) {
+- if (now.speed == PHY_LINK_SPEED_ZERO) {
+- netif_stop_queue(netdev);
+- netif_carrier_off(netdev);
+- printk(KERN_INFO "%s: Link down\n", netdev->name);
+- } else {
+- netif_start_queue(netdev);
+- netif_carrier_on(netdev);
+- printk(KERN_INFO "%s: Link up\n", netdev->name);
+- }
+- }
+- *prev = now;
+-}
+-
+-/* Update the EQ delay n BE based on the RX frags consumed / sec */
+-static void be_rx_eqd_update(struct be_adapter *adapter)
+-{
+- u32 eqd;
+- struct be_ctrl_info *ctrl = &adapter->ctrl;
+- struct be_eq_obj *rx_eq = &adapter->rx_eq;
+- struct be_drvr_stats *stats = &adapter->stats.drvr_stats;
+-
+- /* Update once a second */
+- if (((jiffies - stats->rx_fps_jiffies) < HZ) || rx_eq->enable_aic == 0)
+- return;
+-
+- stats->be_rx_fps = (stats->be_rx_frags - stats->be_prev_rx_frags) /
+- ((jiffies - stats->rx_fps_jiffies) / HZ);
+-
+- stats->rx_fps_jiffies = jiffies;
+- stats->be_prev_rx_frags = stats->be_rx_frags;
+- eqd = stats->be_rx_fps / 110000;
+- eqd = eqd << 3;
+- if (eqd > rx_eq->max_eqd)
+- eqd = rx_eq->max_eqd;
+- if (eqd < rx_eq->min_eqd)
+- eqd = rx_eq->min_eqd;
+- if (eqd < 10)
+- eqd = 0;
+- if (eqd != rx_eq->cur_eqd)
+- be_cmd_modify_eqd(ctrl, rx_eq->q.id, eqd);
+-
+- rx_eq->cur_eqd = eqd;
+-}
+-
+-static struct net_device_stats *be_get_stats(struct net_device *dev)
+-{
+- struct be_adapter *adapter = netdev_priv(dev);
+-
+- return &adapter->stats.net_stats;
+-}
+-
+-static void be_tx_stats_update(struct be_adapter *adapter,
+- u32 wrb_cnt, u32 copied, bool stopped)
+-{
+- struct be_drvr_stats *stats = &adapter->stats.drvr_stats;
+- stats->be_tx_reqs++;
+- stats->be_tx_wrbs += wrb_cnt;
+- stats->be_tx_bytes += copied;
+- if (stopped)
+- stats->be_tx_stops++;
+-
+- /* Update tx rate once in two seconds */
+- if ((jiffies - stats->be_tx_jiffies) > 2 * HZ) {
+- u32 r;
+- r = (stats->be_tx_bytes - stats->be_tx_bytes_prev) /
+- ((u32) (jiffies - stats->be_tx_jiffies) / HZ);
+- r = (r / 1000000); /* M bytes/s */
+- stats->be_tx_rate = (r * 8); /* M bits/s */
+- stats->be_tx_jiffies = jiffies;
+- stats->be_tx_bytes_prev = stats->be_tx_bytes;
+- }
+-}
+-
+-/* Determine number of WRB entries needed to xmit data in an skb */
+-static u32 wrb_cnt_for_skb(struct sk_buff *skb, bool *dummy)
+-{
+- int cnt = 0;
+- while (skb) {
+- if (skb->len > skb->data_len)
+- cnt++;
+- cnt += skb_shinfo(skb)->nr_frags;
+- skb = skb_shinfo(skb)->frag_list;
+- }
+- /* to account for hdr wrb */
+- cnt++;
+- if (cnt & 1) {
+- /* add a dummy to make it an even num */
+- cnt++;
+- *dummy = true;
+- } else
+- *dummy = false;
+- BUG_ON(cnt > BE_MAX_TX_FRAG_COUNT);
+- return cnt;
+-}
+-
+-static inline void wrb_fill(struct be_eth_wrb *wrb, u64 addr, int len)
+-{
+- wrb->frag_pa_hi = upper_32_bits(addr);
+- wrb->frag_pa_lo = addr & 0xFFFFFFFF;
+- wrb->frag_len = len & ETH_WRB_FRAG_LEN_MASK;
+-}
+-
+-static void wrb_fill_hdr(struct be_eth_hdr_wrb *hdr, struct sk_buff *skb,
+- bool vlan, u32 wrb_cnt, u32 len)
+-{
+- memset(hdr, 0, sizeof(*hdr));
+-
+- AMAP_SET_BITS(struct amap_eth_hdr_wrb, crc, hdr, 1);
+-
+- if (skb_shinfo(skb)->gso_segs > 1 && skb_shinfo(skb)->gso_size) {
+- AMAP_SET_BITS(struct amap_eth_hdr_wrb, lso, hdr, 1);
+- AMAP_SET_BITS(struct amap_eth_hdr_wrb, lso_mss,
+- hdr, skb_shinfo(skb)->gso_size);
+- } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
+- if (is_tcp_pkt(skb))
+- AMAP_SET_BITS(struct amap_eth_hdr_wrb, tcpcs, hdr, 1);
+- else if (is_udp_pkt(skb))
+- AMAP_SET_BITS(struct amap_eth_hdr_wrb, udpcs, hdr, 1);
+- }
+-
+- if (vlan && vlan_tx_tag_present(skb)) {
+- AMAP_SET_BITS(struct amap_eth_hdr_wrb, vlan, hdr, 1);
+- AMAP_SET_BITS(struct amap_eth_hdr_wrb, vlan_tag,
+- hdr, vlan_tx_tag_get(skb));
+- }
+-
+- AMAP_SET_BITS(struct amap_eth_hdr_wrb, event, hdr, 1);
+- AMAP_SET_BITS(struct amap_eth_hdr_wrb, complete, hdr, 1);
+- AMAP_SET_BITS(struct amap_eth_hdr_wrb, num_wrb, hdr, wrb_cnt);
+- AMAP_SET_BITS(struct amap_eth_hdr_wrb, len, hdr, len);
+-}
+-
+-
+-static int make_tx_wrbs(struct be_adapter *adapter,
+- struct sk_buff *skb, u32 wrb_cnt, bool dummy_wrb)
+-{
+- u64 busaddr;
+- u32 i, copied = 0;
+- struct pci_dev *pdev = adapter->pdev;
+- struct sk_buff *first_skb = skb;
+- struct be_queue_info *txq = &adapter->tx_obj.q;
+- struct be_eth_wrb *wrb;
+- struct be_eth_hdr_wrb *hdr;
+-
+- atomic_add(wrb_cnt, &txq->used);
+- hdr = queue_head_node(txq);
+- queue_head_inc(txq);
+-
+- while (skb) {
+- if (skb->len > skb->data_len) {
+- int len = skb->len - skb->data_len;
+- busaddr = pci_map_single(pdev, skb->data, len,
+- PCI_DMA_TODEVICE);
+- wrb = queue_head_node(txq);
+- wrb_fill(wrb, busaddr, len);
+- be_dws_cpu_to_le(wrb, sizeof(*wrb));
+- queue_head_inc(txq);
+- copied += len;
+- }
+-
+- for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
+- struct skb_frag_struct *frag =
+- &skb_shinfo(skb)->frags[i];
+- busaddr = pci_map_page(pdev, frag->page,
+- frag->page_offset,
+- frag->size, PCI_DMA_TODEVICE);
+- wrb = queue_head_node(txq);
+- wrb_fill(wrb, busaddr, frag->size);
+- be_dws_cpu_to_le(wrb, sizeof(*wrb));
+- queue_head_inc(txq);
+- copied += frag->size;
+- }
+- skb = skb_shinfo(skb)->frag_list;
+- }
+-
+- if (dummy_wrb) {
+- wrb = queue_head_node(txq);
+- wrb_fill(wrb, 0, 0);
+- be_dws_cpu_to_le(wrb, sizeof(*wrb));
+- queue_head_inc(txq);
+- }
+-
+- wrb_fill_hdr(hdr, first_skb, adapter->vlan_grp ? true : false,
+- wrb_cnt, copied);
+- be_dws_cpu_to_le(hdr, sizeof(*hdr));
+-
+- return copied;
+-}
+-
+-static int be_xmit(struct sk_buff *skb, struct net_device *netdev)
+-{
+- struct be_adapter *adapter = netdev_priv(netdev);
+- struct be_tx_obj *tx_obj = &adapter->tx_obj;
+- struct be_queue_info *txq = &tx_obj->q;
+- u32 wrb_cnt = 0, copied = 0;
+- u32 start = txq->head;
+- bool dummy_wrb, stopped = false;
+-
+- wrb_cnt = wrb_cnt_for_skb(skb, &dummy_wrb);
+-
+- copied = make_tx_wrbs(adapter, skb, wrb_cnt, dummy_wrb);
+-
+- /* record the sent skb in the sent_skb table */
+- BUG_ON(tx_obj->sent_skb_list[start]);
+- tx_obj->sent_skb_list[start] = skb;
+-
+- /* Ensure that txq has space for the next skb; Else stop the queue
+- * *BEFORE* ringing the tx doorbell, so that we serialze the
+- * tx compls of the current transmit which'll wake up the queue
+- */
+- if ((BE_MAX_TX_FRAG_COUNT + atomic_read(&txq->used)) >= txq->len) {
+- netif_stop_queue(netdev);
+- stopped = true;
+- }
+-
+- be_txq_notify(&adapter->ctrl, txq->id, wrb_cnt);
+-
+- netdev->trans_start = jiffies;
+-
+- be_tx_stats_update(adapter, wrb_cnt, copied, stopped);
+- return NETDEV_TX_OK;
+-}
+-
+-static int be_change_mtu(struct net_device *netdev, int new_mtu)
+-{
+- struct be_adapter *adapter = netdev_priv(netdev);
+- if (new_mtu < BE_MIN_MTU ||
+- new_mtu > BE_MAX_JUMBO_FRAME_SIZE) {
+- dev_info(&adapter->pdev->dev,
+- "MTU must be between %d and %d bytes\n",
+- BE_MIN_MTU, BE_MAX_JUMBO_FRAME_SIZE);
+- return -EINVAL;
+- }
+- dev_info(&adapter->pdev->dev, "MTU changed from %d to %d bytes\n",
+- netdev->mtu, new_mtu);
+- netdev->mtu = new_mtu;
+- return 0;
+-}
+-
+-/*
+- * if there are BE_NUM_VLANS_SUPPORTED or lesser number of VLANS configured,
+- * program them in BE. If more than BE_NUM_VLANS_SUPPORTED are configured,
+- * set the BE in promiscuous VLAN mode.
+- */
+-static void be_vid_config(struct net_device *netdev)
+-{
+- struct be_adapter *adapter = netdev_priv(netdev);
+- u16 vtag[BE_NUM_VLANS_SUPPORTED];
+- u16 ntags = 0, i;
+-
+- if (adapter->num_vlans <= BE_NUM_VLANS_SUPPORTED) {
+- /* Construct VLAN Table to give to HW */
+- for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
+- if (adapter->vlan_tag[i]) {
+- vtag[ntags] = cpu_to_le16(i);
+- ntags++;
+- }
+- }
+- be_cmd_vlan_config(&adapter->ctrl, adapter->if_handle,
+- vtag, ntags, 1, 0);
+- } else {
+- be_cmd_vlan_config(&adapter->ctrl, adapter->if_handle,
+- NULL, 0, 1, 1);
+- }
+-}
+-
+-static void be_vlan_register(struct net_device *netdev, struct vlan_group *grp)
+-{
+- struct be_adapter *adapter = netdev_priv(netdev);
+- struct be_eq_obj *rx_eq = &adapter->rx_eq;
+- struct be_eq_obj *tx_eq = &adapter->tx_eq;
+- struct be_ctrl_info *ctrl = &adapter->ctrl;
+-
+- be_eq_notify(ctrl, rx_eq->q.id, false, false, 0);
+- be_eq_notify(ctrl, tx_eq->q.id, false, false, 0);
+- adapter->vlan_grp = grp;
+- be_eq_notify(ctrl, rx_eq->q.id, true, false, 0);
+- be_eq_notify(ctrl, tx_eq->q.id, true, false, 0);
+-}
+-
+-static void be_vlan_add_vid(struct net_device *netdev, u16 vid)
+-{
+- struct be_adapter *adapter = netdev_priv(netdev);
+-
+- adapter->num_vlans++;
+- adapter->vlan_tag[vid] = 1;
+-
+- be_vid_config(netdev);
+-}
+-
+-static void be_vlan_rem_vid(struct net_device *netdev, u16 vid)
+-{
+- struct be_adapter *adapter = netdev_priv(netdev);
+-
+- adapter->num_vlans--;
+- adapter->vlan_tag[vid] = 0;
+-
+- vlan_group_set_device(adapter->vlan_grp, vid, NULL);
+- be_vid_config(netdev);
+-}
+-
+-static void be_set_multicast_filter(struct net_device *netdev)
+-{
+- struct be_adapter *adapter = netdev_priv(netdev);
+- struct dev_mc_list *mc_ptr;
+- u8 mac_addr[32][ETH_ALEN];
+- int i = 0;
+-
+- if (netdev->flags & IFF_ALLMULTI) {
+- /* set BE in Multicast promiscuous */
+- be_cmd_mcast_mac_set(&adapter->ctrl,
+- adapter->if_handle, NULL, 0, true);
+- return;
+- }
+-
+- for (mc_ptr = netdev->mc_list; mc_ptr; mc_ptr = mc_ptr->next) {
+- memcpy(&mac_addr[i][0], mc_ptr->dmi_addr, ETH_ALEN);
+- if (++i >= 32) {
+- be_cmd_mcast_mac_set(&adapter->ctrl,
+- adapter->if_handle, &mac_addr[0][0], i, false);
+- i = 0;
+- }
+-
+- }
+-
+- if (i) {
+- /* reset the promiscuous mode also. */
+- be_cmd_mcast_mac_set(&adapter->ctrl,
+- adapter->if_handle, &mac_addr[0][0], i, false);
+- }
+-}
+-
+-static void be_set_multicast_list(struct net_device *netdev)
+-{
+- struct be_adapter *adapter = netdev_priv(netdev);
+-
+- if (netdev->flags & IFF_PROMISC) {
+- be_cmd_promiscuous_config(&adapter->ctrl, adapter->port_num, 1);
+- } else {
+- be_cmd_promiscuous_config(&adapter->ctrl, adapter->port_num, 0);
+- be_set_multicast_filter(netdev);
+- }
+-}
+-
+-static void be_rx_rate_update(struct be_adapter *adapter, u32 pktsize,
+- u16 numfrags)
+-{
+- struct be_drvr_stats *stats = &adapter->stats.drvr_stats;
+- u32 rate;
+-
+- stats->be_rx_compl++;
+- stats->be_rx_frags += numfrags;
+- stats->be_rx_bytes += pktsize;
+-
+- /* Update the rate once in two seconds */
+- if ((jiffies - stats->be_rx_jiffies) < 2 * HZ)
+- return;
+-
+- rate = (stats->be_rx_bytes - stats->be_rx_bytes_prev) /
+- ((u32) (jiffies - stats->be_rx_jiffies) / HZ);
+- rate = (rate / 1000000); /* MB/Sec */
+- stats->be_rx_rate = (rate * 8); /* Mega Bits/Sec */
+- stats->be_rx_jiffies = jiffies;
+- stats->be_rx_bytes_prev = stats->be_rx_bytes;
+-}
+-
+-static struct be_rx_page_info *
+-get_rx_page_info(struct be_adapter *adapter, u16 frag_idx)
+-{
+- struct be_rx_page_info *rx_page_info;
+- struct be_queue_info *rxq = &adapter->rx_obj.q;
+-
+- rx_page_info = &adapter->rx_obj.page_info_tbl[frag_idx];
+- BUG_ON(!rx_page_info->page);
+-
+- if (rx_page_info->last_page_user)
+- pci_unmap_page(adapter->pdev, pci_unmap_addr(rx_page_info, bus),
+- adapter->big_page_size, PCI_DMA_FROMDEVICE);
+-
+- atomic_dec(&rxq->used);
+- return rx_page_info;
+-}
+-
+-/* Throwaway the data in the Rx completion */
+-static void be_rx_compl_discard(struct be_adapter *adapter,
+- struct be_eth_rx_compl *rxcp)
+-{
+- struct be_queue_info *rxq = &adapter->rx_obj.q;
+- struct be_rx_page_info *page_info;
+- u16 rxq_idx, i, num_rcvd;
+-
+- rxq_idx = AMAP_GET_BITS(struct amap_eth_rx_compl, fragndx, rxcp);
+- num_rcvd = AMAP_GET_BITS(struct amap_eth_rx_compl, numfrags, rxcp);
+-
+- for (i = 0; i < num_rcvd; i++) {
+- page_info = get_rx_page_info(adapter, rxq_idx);
+- put_page(page_info->page);
+- memset(page_info, 0, sizeof(*page_info));
+- index_inc(&rxq_idx, rxq->len);
+- }
+-}
+-
+-/*
+- * skb_fill_rx_data forms a complete skb for an ether frame
+- * indicated by rxcp.
+- */
+-static void skb_fill_rx_data(struct be_adapter *adapter,
+- struct sk_buff *skb, struct be_eth_rx_compl *rxcp)
+-{
+- struct be_queue_info *rxq = &adapter->rx_obj.q;
+- struct be_rx_page_info *page_info;
+- u16 rxq_idx, i, num_rcvd;
+- u32 pktsize, hdr_len, curr_frag_len;
+- u8 *start;
+-
+- rxq_idx = AMAP_GET_BITS(struct amap_eth_rx_compl, fragndx, rxcp);
+- pktsize = AMAP_GET_BITS(struct amap_eth_rx_compl, pktsize, rxcp);
+- num_rcvd = AMAP_GET_BITS(struct amap_eth_rx_compl, numfrags, rxcp);
+-
+- page_info = get_rx_page_info(adapter, rxq_idx);
+-
+- start = page_address(page_info->page) + page_info->page_offset;
+- prefetch(start);
+-
+- /* Copy data in the first descriptor of this completion */
+- curr_frag_len = min(pktsize, rx_frag_size);
+-
+- /* Copy the header portion into skb_data */
+- hdr_len = min((u32)BE_HDR_LEN, curr_frag_len);
+- memcpy(skb->data, start, hdr_len);
+- skb->len = curr_frag_len;
+- if (curr_frag_len <= BE_HDR_LEN) { /* tiny packet */
+- /* Complete packet has now been moved to data */
+- put_page(page_info->page);
+- skb->data_len = 0;
+- skb->tail += curr_frag_len;
+- } else {
+- skb_shinfo(skb)->nr_frags = 1;
+- skb_shinfo(skb)->frags[0].page = page_info->page;
+- skb_shinfo(skb)->frags[0].page_offset =
+- page_info->page_offset + hdr_len;
+- skb_shinfo(skb)->frags[0].size = curr_frag_len - hdr_len;
+- skb->data_len = curr_frag_len - hdr_len;
+- skb->tail += hdr_len;
+- }
+- memset(page_info, 0, sizeof(*page_info));
+-
+- if (pktsize <= rx_frag_size) {
+- BUG_ON(num_rcvd != 1);
+- return;
+- }
+-
+- /* More frags present for this completion */
+- pktsize -= curr_frag_len; /* account for above copied frag */
+- for (i = 1; i < num_rcvd; i++) {
+- index_inc(&rxq_idx, rxq->len);
+- page_info = get_rx_page_info(adapter, rxq_idx);
+-
+- curr_frag_len = min(pktsize, rx_frag_size);
+-
+- skb_shinfo(skb)->frags[i].page = page_info->page;
+- skb_shinfo(skb)->frags[i].page_offset = page_info->page_offset;
+- skb_shinfo(skb)->frags[i].size = curr_frag_len;
+- skb->len += curr_frag_len;
+- skb->data_len += curr_frag_len;
+- skb_shinfo(skb)->nr_frags++;
+- pktsize -= curr_frag_len;
+-
+- memset(page_info, 0, sizeof(*page_info));
+- }
+-
+- be_rx_rate_update(adapter, pktsize, num_rcvd);
+- return;
+-}
+-
+-/* Process the RX completion indicated by rxcp when LRO is disabled */
+-static void be_rx_compl_process(struct be_adapter *adapter,
+- struct be_eth_rx_compl *rxcp)
+-{
+- struct sk_buff *skb;
+- u32 vtp, vid;
+- int l4_cksm;
+-
+- l4_cksm = AMAP_GET_BITS(struct amap_eth_rx_compl, l4_cksm, rxcp);
+- vtp = AMAP_GET_BITS(struct amap_eth_rx_compl, vtp, rxcp);
+-
+- skb = netdev_alloc_skb(adapter->netdev, BE_HDR_LEN + NET_IP_ALIGN);
+- if (!skb) {
+- if (net_ratelimit())
+- dev_warn(&adapter->pdev->dev, "skb alloc failed\n");
+- be_rx_compl_discard(adapter, rxcp);
+- return;
+- }
+-
+- skb_reserve(skb, NET_IP_ALIGN);
+-
+- skb_fill_rx_data(adapter, skb, rxcp);
+-
+- if (l4_cksm && adapter->rx_csum)
+- skb->ip_summed = CHECKSUM_UNNECESSARY;
+- else
+- skb->ip_summed = CHECKSUM_NONE;
+-
+- skb->truesize = skb->len + sizeof(struct sk_buff);
+- skb->protocol = eth_type_trans(skb, adapter->netdev);
+- skb->dev = adapter->netdev;
+-
+- if (vtp) {
+- if (!adapter->vlan_grp || adapter->num_vlans == 0) {
+- kfree_skb(skb);
+- return;
+- }
+- vid = AMAP_GET_BITS(struct amap_eth_rx_compl, vlan_tag, rxcp);
+- vid = be16_to_cpu(vid);
+- vlan_hwaccel_receive_skb(skb, adapter->vlan_grp, vid);
+- } else {
+- netif_receive_skb(skb);
+- }
+-
+- adapter->netdev->last_rx = jiffies;
+-
+- return;
+-}
+-
+-/* Process the RX completion indicated by rxcp when LRO is enabled */
+-static void be_rx_compl_process_lro(struct be_adapter *adapter,
+- struct be_eth_rx_compl *rxcp)
+-{
+- struct be_rx_page_info *page_info;
+- struct skb_frag_struct rx_frags[BE_MAX_FRAGS_PER_FRAME];
+- struct be_queue_info *rxq = &adapter->rx_obj.q;
+- u32 num_rcvd, pkt_size, remaining, vlanf, curr_frag_len;
+- u16 i, rxq_idx = 0, vid;
+-
+- num_rcvd = AMAP_GET_BITS(struct amap_eth_rx_compl, numfrags, rxcp);
+- pkt_size = AMAP_GET_BITS(struct amap_eth_rx_compl, pktsize, rxcp);
+- vlanf = AMAP_GET_BITS(struct amap_eth_rx_compl, vtp, rxcp);
+- rxq_idx = AMAP_GET_BITS(struct amap_eth_rx_compl, fragndx, rxcp);
+-
+- remaining = pkt_size;
+- for (i = 0; i < num_rcvd; i++) {
+- page_info = get_rx_page_info(adapter, rxq_idx);
+-
+- curr_frag_len = min(remaining, rx_frag_size);
+-
+- rx_frags[i].page = page_info->page;
+- rx_frags[i].page_offset = page_info->page_offset;
+- rx_frags[i].size = curr_frag_len;
+- remaining -= curr_frag_len;
+-
+- index_inc(&rxq_idx, rxq->len);
+-
+- memset(page_info, 0, sizeof(*page_info));
+- }
+-
+- if (likely(!vlanf)) {
+- lro_receive_frags(&adapter->rx_obj.lro_mgr, rx_frags, pkt_size,
+- pkt_size, NULL, 0);
+- } else {
+- vid = AMAP_GET_BITS(struct amap_eth_rx_compl, vlan_tag, rxcp);
+- vid = be16_to_cpu(vid);
+-
+- if (!adapter->vlan_grp || adapter->num_vlans == 0)
+- return;
+-
+- lro_vlan_hwaccel_receive_frags(&adapter->rx_obj.lro_mgr,
+- rx_frags, pkt_size, pkt_size, adapter->vlan_grp,
+- vid, NULL, 0);
+- }
+-
+- be_rx_rate_update(adapter, pkt_size, num_rcvd);
+- return;
+-}
+-
+-static struct be_eth_rx_compl *be_rx_compl_get(struct be_adapter *adapter)
+-{
+- struct be_eth_rx_compl *rxcp = queue_tail_node(&adapter->rx_obj.cq);
+-
+- if (rxcp->dw[offsetof(struct amap_eth_rx_compl, valid) / 32] == 0)
+- return NULL;
+-
+- be_dws_le_to_cpu(rxcp, sizeof(*rxcp));
+-
+- rxcp->dw[offsetof(struct amap_eth_rx_compl, valid) / 32] = 0;
+-
+- queue_tail_inc(&adapter->rx_obj.cq);
+- return rxcp;
+-}
+-
+-static inline struct page *be_alloc_pages(u32 size)
+-{
+- gfp_t alloc_flags = GFP_ATOMIC;
+- u32 order = get_order(size);
+- if (order > 0)
+- alloc_flags |= __GFP_COMP;
+- return alloc_pages(alloc_flags, order);
+-}
+-
+-/*
+- * Allocate a page, split it to fragments of size rx_frag_size and post as
+- * receive buffers to BE
+- */
+-static void be_post_rx_frags(struct be_adapter *adapter)
+-{
+- struct be_rx_page_info *page_info_tbl = adapter->rx_obj.page_info_tbl;
+- struct be_rx_page_info *page_info = NULL;
+- struct be_queue_info *rxq = &adapter->rx_obj.q;
+- struct page *pagep = NULL;
+- struct be_eth_rx_d *rxd;
+- u64 page_dmaaddr = 0, frag_dmaaddr;
+- u32 posted, page_offset = 0;
+-
+-
+- page_info = &page_info_tbl[rxq->head];
+- for (posted = 0; posted < MAX_RX_POST && !page_info->page; posted++) {
+- if (!pagep) {
+- pagep = be_alloc_pages(adapter->big_page_size);
+- if (unlikely(!pagep)) {
+- drvr_stats(adapter)->be_ethrx_post_fail++;
+- break;
+- }
+- page_dmaaddr = pci_map_page(adapter->pdev, pagep, 0,
+- adapter->big_page_size,
+- PCI_DMA_FROMDEVICE);
+- page_info->page_offset = 0;
+- } else {
+- get_page(pagep);
+- page_info->page_offset = page_offset + rx_frag_size;
+- }
+- page_offset = page_info->page_offset;
+- page_info->page = pagep;
+- pci_unmap_addr_set(page_info, bus, page_dmaaddr);
+- frag_dmaaddr = page_dmaaddr + page_info->page_offset;
+-
+- rxd = queue_head_node(rxq);
+- rxd->fragpa_lo = cpu_to_le32(frag_dmaaddr & 0xFFFFFFFF);
+- rxd->fragpa_hi = cpu_to_le32(upper_32_bits(frag_dmaaddr));
+- queue_head_inc(rxq);
+-
+- /* Any space left in the current big page for another frag? */
+- if ((page_offset + rx_frag_size + rx_frag_size) >
+- adapter->big_page_size) {
+- pagep = NULL;
+- page_info->last_page_user = true;
+- }
+- page_info = &page_info_tbl[rxq->head];
+- }
+- if (pagep)
+- page_info->last_page_user = true;
+-
+- if (posted) {
+- atomic_add(posted, &rxq->used);
+- be_rxq_notify(&adapter->ctrl, rxq->id, posted);
+- } else if (atomic_read(&rxq->used) == 0) {
+- /* Let be_worker replenish when memory is available */
+- adapter->rx_post_starved = true;
+- }
+-
+- return;
+-}
+-
+-static struct be_eth_tx_compl *
+-be_tx_compl_get(struct be_adapter *adapter)
+-{
+- struct be_queue_info *tx_cq = &adapter->tx_obj.cq;
+- struct be_eth_tx_compl *txcp = queue_tail_node(tx_cq);
+-
+- if (txcp->dw[offsetof(struct amap_eth_tx_compl, valid) / 32] == 0)
+- return NULL;
+-
+- be_dws_le_to_cpu(txcp, sizeof(*txcp));
+-
+- txcp->dw[offsetof(struct amap_eth_tx_compl, valid) / 32] = 0;
+-
+- queue_tail_inc(tx_cq);
+- return txcp;
+-}
+-
+-static void be_tx_compl_process(struct be_adapter *adapter, u16 last_index)
+-{
+- struct be_queue_info *txq = &adapter->tx_obj.q;
+- struct be_eth_wrb *wrb;
+- struct sk_buff **sent_skbs = adapter->tx_obj.sent_skb_list;
+- struct sk_buff *sent_skb;
+- u64 busaddr;
+- u16 cur_index, num_wrbs = 0;
+-
+- cur_index = txq->tail;
+- sent_skb = sent_skbs[cur_index];
+- BUG_ON(!sent_skb);
+- sent_skbs[cur_index] = NULL;
+-
+- do {
+- cur_index = txq->tail;
+- wrb = queue_tail_node(txq);
+- be_dws_le_to_cpu(wrb, sizeof(*wrb));
+- busaddr = ((u64)wrb->frag_pa_hi << 32) | (u64)wrb->frag_pa_lo;
+- if (busaddr != 0) {
+- pci_unmap_single(adapter->pdev, busaddr,
+- wrb->frag_len, PCI_DMA_TODEVICE);
+- }
+- num_wrbs++;
+- queue_tail_inc(txq);
+- } while (cur_index != last_index);
+-
+- atomic_sub(num_wrbs, &txq->used);
+-
+- kfree_skb(sent_skb);
+-}
+-
+-static void be_rx_q_clean(struct be_adapter *adapter)
+-{
+- struct be_rx_page_info *page_info;
+- struct be_queue_info *rxq = &adapter->rx_obj.q;
+- struct be_queue_info *rx_cq = &adapter->rx_obj.cq;
+- struct be_eth_rx_compl *rxcp;
+- u16 tail;
+-
+- /* First cleanup pending rx completions */
+- while ((rxcp = be_rx_compl_get(adapter)) != NULL) {
+- be_rx_compl_discard(adapter, rxcp);
+- be_cq_notify(&adapter->ctrl, rx_cq->id, true, 1);
+- }
+-
+- /* Then free posted rx buffer that were not used */
+- tail = (rxq->head + rxq->len - atomic_read(&rxq->used)) % rxq->len;
+- for (; tail != rxq->head; index_inc(&tail, rxq->len)) {
+- page_info = get_rx_page_info(adapter, tail);
+- put_page(page_info->page);
+- memset(page_info, 0, sizeof(*page_info));
+- }
+- BUG_ON(atomic_read(&rxq->used));
+-}
+-
+-static void be_tx_q_clean(struct be_adapter *adapter)
+-{
+- struct sk_buff **sent_skbs = adapter->tx_obj.sent_skb_list;
+- struct sk_buff *sent_skb;
+- struct be_queue_info *txq = &adapter->tx_obj.q;
+- u16 last_index;
+- bool dummy_wrb;
+-
+- while (atomic_read(&txq->used)) {
+- sent_skb = sent_skbs[txq->tail];
+- last_index = txq->tail;
+- index_adv(&last_index,
+- wrb_cnt_for_skb(sent_skb, &dummy_wrb) - 1, txq->len);
+- be_tx_compl_process(adapter, last_index);
+- }
+-}
+-
+-static void be_tx_queues_destroy(struct be_adapter *adapter)
+-{
+- struct be_queue_info *q;
+-
+- q = &adapter->tx_obj.q;
+- if (q->created)
+- be_cmd_q_destroy(&adapter->ctrl, q, QTYPE_TXQ);
+- be_queue_free(adapter, q);
+-
+- q = &adapter->tx_obj.cq;
+- if (q->created)
+- be_cmd_q_destroy(&adapter->ctrl, q, QTYPE_CQ);
+- be_queue_free(adapter, q);
+-
+- /* No more tx completions can be rcvd now; clean up if there are
+- * any pending completions or pending tx requests */
+- be_tx_q_clean(adapter);
+-
+- q = &adapter->tx_eq.q;
+- if (q->created)
+- be_cmd_q_destroy(&adapter->ctrl, q, QTYPE_EQ);
+- be_queue_free(adapter, q);
+-}
+-
+-static int be_tx_queues_create(struct be_adapter *adapter)
+-{
+- struct be_queue_info *eq, *q, *cq;
+-
+- adapter->tx_eq.max_eqd = 0;
+- adapter->tx_eq.min_eqd = 0;
+- adapter->tx_eq.cur_eqd = 96;
+- adapter->tx_eq.enable_aic = false;
+- /* Alloc Tx Event queue */
+- eq = &adapter->tx_eq.q;
+- if (be_queue_alloc(adapter, eq, EVNT_Q_LEN, sizeof(struct be_eq_entry)))
+- return -1;
+-
+- /* Ask BE to create Tx Event queue */
+- if (be_cmd_eq_create(&adapter->ctrl, eq, adapter->tx_eq.cur_eqd))
+- goto tx_eq_free;
+- /* Alloc TX eth compl queue */
+- cq = &adapter->tx_obj.cq;
+- if (be_queue_alloc(adapter, cq, TX_CQ_LEN,
+- sizeof(struct be_eth_tx_compl)))
+- goto tx_eq_destroy;
+-
+- /* Ask BE to create Tx eth compl queue */
+- if (be_cmd_cq_create(&adapter->ctrl, cq, eq, false, false, 3))
+- goto tx_cq_free;
+-
+- /* Alloc TX eth queue */
+- q = &adapter->tx_obj.q;
+- if (be_queue_alloc(adapter, q, TX_Q_LEN, sizeof(struct be_eth_wrb)))
+- goto tx_cq_destroy;
+-
+- /* Ask BE to create Tx eth queue */
+- if (be_cmd_txq_create(&adapter->ctrl, q, cq))
+- goto tx_q_free;
+- return 0;
+-
+-tx_q_free:
+- be_queue_free(adapter, q);
+-tx_cq_destroy:
+- be_cmd_q_destroy(&adapter->ctrl, cq, QTYPE_CQ);
+-tx_cq_free:
+- be_queue_free(adapter, cq);
+-tx_eq_destroy:
+- be_cmd_q_destroy(&adapter->ctrl, eq, QTYPE_EQ);
+-tx_eq_free:
+- be_queue_free(adapter, eq);
+- return -1;
+-}
+-
+-static void be_rx_queues_destroy(struct be_adapter *adapter)
+-{
+- struct be_queue_info *q;
+-
+- q = &adapter->rx_obj.q;
+- if (q->created) {
+- be_cmd_q_destroy(&adapter->ctrl, q, QTYPE_RXQ);
+- be_rx_q_clean(adapter);
+- }
+- be_queue_free(adapter, q);
+-
+- q = &adapter->rx_obj.cq;
+- if (q->created)
+- be_cmd_q_destroy(&adapter->ctrl, q, QTYPE_CQ);
+- be_queue_free(adapter, q);
+-
+- q = &adapter->rx_eq.q;
+- if (q->created)
+- be_cmd_q_destroy(&adapter->ctrl, q, QTYPE_EQ);
+- be_queue_free(adapter, q);
+-}
+-
+-static int be_rx_queues_create(struct be_adapter *adapter)
+-{
+- struct be_queue_info *eq, *q, *cq;
+- int rc;
+-
+- adapter->max_rx_coal = BE_MAX_FRAGS_PER_FRAME;
+- adapter->big_page_size = (1 << get_order(rx_frag_size)) * PAGE_SIZE;
+- adapter->rx_eq.max_eqd = BE_MAX_EQD;
+- adapter->rx_eq.min_eqd = 0;
+- adapter->rx_eq.cur_eqd = 0;
+- adapter->rx_eq.enable_aic = true;
+-
+- /* Alloc Rx Event queue */
+- eq = &adapter->rx_eq.q;
+- rc = be_queue_alloc(adapter, eq, EVNT_Q_LEN,
+- sizeof(struct be_eq_entry));
+- if (rc)
+- return rc;
+-
+- /* Ask BE to create Rx Event queue */
+- rc = be_cmd_eq_create(&adapter->ctrl, eq, adapter->rx_eq.cur_eqd);
+- if (rc)
+- goto rx_eq_free;
+-
+- /* Alloc RX eth compl queue */
+- cq = &adapter->rx_obj.cq;
+- rc = be_queue_alloc(adapter, cq, RX_CQ_LEN,
+- sizeof(struct be_eth_rx_compl));
+- if (rc)
+- goto rx_eq_destroy;
+-
+- /* Ask BE to create Rx eth compl queue */
+- rc = be_cmd_cq_create(&adapter->ctrl, cq, eq, false, false, 3);
+- if (rc)
+- goto rx_cq_free;
+-
+- /* Alloc RX eth queue */
+- q = &adapter->rx_obj.q;
+- rc = be_queue_alloc(adapter, q, RX_Q_LEN, sizeof(struct be_eth_rx_d));
+- if (rc)
+- goto rx_cq_destroy;
+-
+- /* Ask BE to create Rx eth queue */
+- rc = be_cmd_rxq_create(&adapter->ctrl, q, cq->id, rx_frag_size,
+- BE_MAX_JUMBO_FRAME_SIZE, adapter->if_handle, false);
+- if (rc)
+- goto rx_q_free;
+-
+- return 0;
+-rx_q_free:
+- be_queue_free(adapter, q);
+-rx_cq_destroy:
+- be_cmd_q_destroy(&adapter->ctrl, cq, QTYPE_CQ);
+-rx_cq_free:
+- be_queue_free(adapter, cq);
+-rx_eq_destroy:
+- be_cmd_q_destroy(&adapter->ctrl, eq, QTYPE_EQ);
+-rx_eq_free:
+- be_queue_free(adapter, eq);
+- return rc;
+-}
+-static bool event_get(struct be_eq_obj *eq_obj, u16 *rid)
+-{
+- struct be_eq_entry *entry = queue_tail_node(&eq_obj->q);
+- u32 evt = entry->evt;
+-
+- if (!evt)
+- return false;
+-
+- evt = le32_to_cpu(evt);
+- *rid = (evt >> EQ_ENTRY_RES_ID_SHIFT) & EQ_ENTRY_RES_ID_MASK;
+- entry->evt = 0;
+- queue_tail_inc(&eq_obj->q);
+- return true;
+-}
+-
+-static int event_handle(struct be_ctrl_info *ctrl,
+- struct be_eq_obj *eq_obj)
+-{
+- u16 rid = 0, num = 0;
+-
+- while (event_get(eq_obj, &rid))
+- num++;
+-
+- /* We can see an interrupt and no event */
+- be_eq_notify(ctrl, eq_obj->q.id, true, true, num);
+- if (num)
+- napi_schedule(&eq_obj->napi);
+-
+- return num;
+-}
+-
+-static irqreturn_t be_intx(int irq, void *dev)
+-{
+- struct be_adapter *adapter = dev;
+- struct be_ctrl_info *ctrl = &adapter->ctrl;
+- int rx, tx;
+-
+- tx = event_handle(ctrl, &adapter->tx_eq);
+- rx = event_handle(ctrl, &adapter->rx_eq);
+-
+- if (rx || tx)
+- return IRQ_HANDLED;
+- else
+- return IRQ_NONE;
+-}
+-
+-static irqreturn_t be_msix_rx(int irq, void *dev)
+-{
+- struct be_adapter *adapter = dev;
+-
+- event_handle(&adapter->ctrl, &adapter->rx_eq);
+-
+- return IRQ_HANDLED;
+-}
+-
+-static irqreturn_t be_msix_tx(int irq, void *dev)
+-{
+- struct be_adapter *adapter = dev;
+-
+- event_handle(&adapter->ctrl, &adapter->tx_eq);
+-
+- return IRQ_HANDLED;
+-}
+-
+-static inline bool do_lro(struct be_adapter *adapter,
+- struct be_eth_rx_compl *rxcp)
+-{
+- int err = AMAP_GET_BITS(struct amap_eth_rx_compl, err, rxcp);
+- int tcp_frame = AMAP_GET_BITS(struct amap_eth_rx_compl, tcpf, rxcp);
+-
+- if (err)
+- drvr_stats(adapter)->be_rxcp_err++;
+-
+- return (!tcp_frame || err || (adapter->max_rx_coal <= 1)) ?
+- false : true;
+-}
+-
+-int be_poll_rx(struct napi_struct *napi, int budget)
+-{
+- struct be_eq_obj *rx_eq = container_of(napi, struct be_eq_obj, napi);
+- struct be_adapter *adapter =
+- container_of(rx_eq, struct be_adapter, rx_eq);
+- struct be_queue_info *rx_cq = &adapter->rx_obj.cq;
+- struct be_eth_rx_compl *rxcp;
+- u32 work_done;
+-
+- for (work_done = 0; work_done < budget; work_done++) {
+- rxcp = be_rx_compl_get(adapter);
+- if (!rxcp)
+- break;
+-
+- if (do_lro(adapter, rxcp))
+- be_rx_compl_process_lro(adapter, rxcp);
+- else
+- be_rx_compl_process(adapter, rxcp);
+- }
+-
+- lro_flush_all(&adapter->rx_obj.lro_mgr);
+-
+- /* Refill the queue */
+- if (atomic_read(&adapter->rx_obj.q.used) < RX_FRAGS_REFILL_WM)
+- be_post_rx_frags(adapter);
+-
+- /* All consumed */
+- if (work_done < budget) {
+- napi_complete(napi);
+- be_cq_notify(&adapter->ctrl, rx_cq->id, true, work_done);
+- } else {
+- /* More to be consumed; continue with interrupts disabled */
+- be_cq_notify(&adapter->ctrl, rx_cq->id, false, work_done);
+- }
+- return work_done;
+-}
+-
+-/* For TX we don't honour budget; consume everything */
+-int be_poll_tx(struct napi_struct *napi, int budget)
+-{
+- struct be_eq_obj *tx_eq = container_of(napi, struct be_eq_obj, napi);
+- struct be_adapter *adapter =
+- container_of(tx_eq, struct be_adapter, tx_eq);
+- struct be_tx_obj *tx_obj = &adapter->tx_obj;
+- struct be_queue_info *tx_cq = &tx_obj->cq;
+- struct be_queue_info *txq = &tx_obj->q;
+- struct be_eth_tx_compl *txcp;
+- u32 num_cmpl = 0;
+- u16 end_idx;
+-
+- while ((txcp = be_tx_compl_get(adapter))) {
+- end_idx = AMAP_GET_BITS(struct amap_eth_tx_compl,
+- wrb_index, txcp);
+- be_tx_compl_process(adapter, end_idx);
+- num_cmpl++;
+- }
+-
+- /* As Tx wrbs have been freed up, wake up netdev queue if
+- * it was stopped due to lack of tx wrbs.
+- */
+- if (netif_queue_stopped(adapter->netdev) &&
+- atomic_read(&txq->used) < txq->len / 2) {
+- netif_wake_queue(adapter->netdev);
+- }
+-
+- napi_complete(napi);
+-
+- be_cq_notify(&adapter->ctrl, tx_cq->id, true, num_cmpl);
+-
+- drvr_stats(adapter)->be_tx_events++;
+- drvr_stats(adapter)->be_tx_compl += num_cmpl;
+-
+- return 1;
+-}
+-
+-static void be_worker(struct work_struct *work)
+-{
+- struct be_adapter *adapter =
+- container_of(work, struct be_adapter, work.work);
+- int status;
+-
+- /* Check link */
+- be_link_status_update(adapter);
+-
+- /* Get Stats */
+- status = be_cmd_get_stats(&adapter->ctrl, &adapter->stats.cmd);
+- if (!status)
+- netdev_stats_update(adapter);
+-
+- /* Set EQ delay */
+- be_rx_eqd_update(adapter);
+-
+- if (adapter->rx_post_starved) {
+- adapter->rx_post_starved = false;
+- be_post_rx_frags(adapter);
+- }
+-
+- schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000));
+-}
+-
+-static void be_msix_enable(struct be_adapter *adapter)
+-{
+- int i, status;
+-
+- for (i = 0; i < BE_NUM_MSIX_VECTORS; i++)
+- adapter->msix_entries[i].entry = i;
+-
+- status = pci_enable_msix(adapter->pdev, adapter->msix_entries,
+- BE_NUM_MSIX_VECTORS);
+- if (status == 0)
+- adapter->msix_enabled = true;
+- return;
+-}
+-
+-static inline int be_msix_vec_get(struct be_adapter *adapter, u32 eq_id)
+-{
+- return adapter->msix_entries[eq_id -
+- 8 * adapter->ctrl.pci_func].vector;
+-}
+-
+-static int be_msix_register(struct be_adapter *adapter)
+-{
+- struct net_device *netdev = adapter->netdev;
+- struct be_eq_obj *tx_eq = &adapter->tx_eq;
+- struct be_eq_obj *rx_eq = &adapter->rx_eq;
+- int status, vec;
+-
+- sprintf(tx_eq->desc, "%s-tx", netdev->name);
+- vec = be_msix_vec_get(adapter, tx_eq->q.id);
+- status = request_irq(vec, be_msix_tx, 0, tx_eq->desc, adapter);
+- if (status)
+- goto err;
+-
+- sprintf(rx_eq->desc, "%s-rx", netdev->name);
+- vec = be_msix_vec_get(adapter, rx_eq->q.id);
+- status = request_irq(vec, be_msix_rx, 0, rx_eq->desc, adapter);
+- if (status) { /* Free TX IRQ */
+- vec = be_msix_vec_get(adapter, tx_eq->q.id);
+- free_irq(vec, adapter);
+- goto err;
+- }
+- return 0;
+-err:
+- dev_warn(&adapter->pdev->dev,
+- "MSIX Request IRQ failed - err %d\n", status);
+- pci_disable_msix(adapter->pdev);
+- adapter->msix_enabled = false;
+- return status;
+-}
+-
+-static int be_irq_register(struct be_adapter *adapter)
+-{
+- struct net_device *netdev = adapter->netdev;
+- int status;
+-
+- if (adapter->msix_enabled) {
+- status = be_msix_register(adapter);
+- if (status == 0)
+- goto done;
+- }
+-
+- /* INTx */
+- netdev->irq = adapter->pdev->irq;
+- status = request_irq(netdev->irq, be_intx, IRQF_SHARED, netdev->name,
+- adapter);
+- if (status) {
+- dev_err(&adapter->pdev->dev,
+- "INTx request IRQ failed - err %d\n", status);
+- return status;
+- }
+-done:
+- adapter->isr_registered = true;
+- return 0;
+-}
+-
+-static void be_irq_unregister(struct be_adapter *adapter)
+-{
+- struct net_device *netdev = adapter->netdev;
+- int vec;
+-
+- if (!adapter->isr_registered)
+- return;
+-
+- /* INTx */
+- if (!adapter->msix_enabled) {
+- free_irq(netdev->irq, adapter);
+- goto done;
+- }
+-
+- /* MSIx */
+- vec = be_msix_vec_get(adapter, adapter->tx_eq.q.id);
+- free_irq(vec, adapter);
+- vec = be_msix_vec_get(adapter, adapter->rx_eq.q.id);
+- free_irq(vec, adapter);
+-done:
+- adapter->isr_registered = false;
+- return;
+-}
+-
+-static int be_open(struct net_device *netdev)
+-{
+- struct be_adapter *adapter = netdev_priv(netdev);
+- struct be_ctrl_info *ctrl = &adapter->ctrl;
+- struct be_eq_obj *rx_eq = &adapter->rx_eq;
+- struct be_eq_obj *tx_eq = &adapter->tx_eq;
+- u32 if_flags;
+- int status;
+-
+- if_flags = BE_IF_FLAGS_BROADCAST | BE_IF_FLAGS_PROMISCUOUS |
+- BE_IF_FLAGS_MCAST_PROMISCUOUS | BE_IF_FLAGS_UNTAGGED |
+- BE_IF_FLAGS_PASS_L3L4_ERRORS;
+- status = be_cmd_if_create(ctrl, if_flags, netdev->dev_addr,
+- false/* pmac_invalid */, &adapter->if_handle,
+- &adapter->pmac_id);
+- if (status != 0)
+- goto do_none;
+-
+- be_vid_config(netdev);
+-
+- status = be_cmd_set_flow_control(ctrl, true, true);
+- if (status != 0)
+- goto if_destroy;
+-
+- status = be_tx_queues_create(adapter);
+- if (status != 0)
+- goto if_destroy;
+-
+- status = be_rx_queues_create(adapter);
+- if (status != 0)
+- goto tx_qs_destroy;
+-
+- /* First time posting */
+- be_post_rx_frags(adapter);
+-
+- napi_enable(&rx_eq->napi);
+- napi_enable(&tx_eq->napi);
+-
+- be_irq_register(adapter);
+-
+- be_intr_set(ctrl, true);
+-
+- /* The evt queues are created in the unarmed state; arm them */
+- be_eq_notify(ctrl, rx_eq->q.id, true, false, 0);
+- be_eq_notify(ctrl, tx_eq->q.id, true, false, 0);
+-
+- /* The compl queues are created in the unarmed state; arm them */
+- be_cq_notify(ctrl, adapter->rx_obj.cq.id, true, 0);
+- be_cq_notify(ctrl, adapter->tx_obj.cq.id, true, 0);
+-
+- be_link_status_update(adapter);
+-
+- schedule_delayed_work(&adapter->work, msecs_to_jiffies(100));
+- return 0;
+-
+-tx_qs_destroy:
+- be_tx_queues_destroy(adapter);
+-if_destroy:
+- be_cmd_if_destroy(ctrl, adapter->if_handle);
+-do_none:
+- return status;
+-}
+-
+-static int be_close(struct net_device *netdev)
+-{
+- struct be_adapter *adapter = netdev_priv(netdev);
+- struct be_ctrl_info *ctrl = &adapter->ctrl;
+- struct be_eq_obj *rx_eq = &adapter->rx_eq;
+- struct be_eq_obj *tx_eq = &adapter->tx_eq;
+- int vec;
+-
+- cancel_delayed_work(&adapter->work);
+-
+- netif_stop_queue(netdev);
+- netif_carrier_off(netdev);
+- adapter->link.speed = PHY_LINK_SPEED_ZERO;
+-
+- be_intr_set(ctrl, false);
+-
+- if (adapter->msix_enabled) {
+- vec = be_msix_vec_get(adapter, tx_eq->q.id);
+- synchronize_irq(vec);
+- vec = be_msix_vec_get(adapter, rx_eq->q.id);
+- synchronize_irq(vec);
+- } else {
+- synchronize_irq(netdev->irq);
+- }
+- be_irq_unregister(adapter);
+-
+- napi_disable(&rx_eq->napi);
+- napi_disable(&tx_eq->napi);
+-
+- be_rx_queues_destroy(adapter);
+- be_tx_queues_destroy(adapter);
+-
+- be_cmd_if_destroy(ctrl, adapter->if_handle);
+- return 0;
+-}
+-
+-static int be_get_frag_header(struct skb_frag_struct *frag, void **mac_hdr,
+- void **ip_hdr, void **tcpudp_hdr,
+- u64 *hdr_flags, void *priv)
+-{
+- struct ethhdr *eh;
+- struct vlan_ethhdr *veh;
+- struct iphdr *iph;
+- u8 *va = page_address(frag->page) + frag->page_offset;
+- unsigned long ll_hlen;
+-
+- prefetch(va);
+- eh = (struct ethhdr *)va;
+- *mac_hdr = eh;
+- ll_hlen = ETH_HLEN;
+- if (eh->h_proto != htons(ETH_P_IP)) {
+- if (eh->h_proto == htons(ETH_P_8021Q)) {
+- veh = (struct vlan_ethhdr *)va;
+- if (veh->h_vlan_encapsulated_proto != htons(ETH_P_IP))
+- return -1;
+-
+- ll_hlen += VLAN_HLEN;
+- } else {
+- return -1;
+- }
+- }
+- *hdr_flags = LRO_IPV4;
+- iph = (struct iphdr *)(va + ll_hlen);
+- *ip_hdr = iph;
+- if (iph->protocol != IPPROTO_TCP)
+- return -1;
+- *hdr_flags |= LRO_TCP;
+- *tcpudp_hdr = (u8 *) (*ip_hdr) + (iph->ihl << 2);
+-
+- return 0;
+-}
+-
+-static void be_lro_init(struct be_adapter *adapter, struct net_device *netdev)
+-{
+- struct net_lro_mgr *lro_mgr;
+-
+- lro_mgr = &adapter->rx_obj.lro_mgr;
+- lro_mgr->dev = netdev;
+- lro_mgr->features = LRO_F_NAPI;
+- lro_mgr->ip_summed = CHECKSUM_UNNECESSARY;
+- lro_mgr->ip_summed_aggr = CHECKSUM_UNNECESSARY;
+- lro_mgr->max_desc = BE_MAX_LRO_DESCRIPTORS;
+- lro_mgr->lro_arr = adapter->rx_obj.lro_desc;
+- lro_mgr->get_frag_header = be_get_frag_header;
+- lro_mgr->max_aggr = BE_MAX_FRAGS_PER_FRAME;
+-}
+-
+-static struct net_device_ops be_netdev_ops = {
+- .ndo_open = be_open,
+- .ndo_stop = be_close,
+- .ndo_start_xmit = be_xmit,
+- .ndo_get_stats = be_get_stats,
+- .ndo_set_rx_mode = be_set_multicast_list,
+- .ndo_set_mac_address = be_mac_addr_set,
+- .ndo_change_mtu = be_change_mtu,
+- .ndo_validate_addr = eth_validate_addr,
+- .ndo_vlan_rx_register = be_vlan_register,
+- .ndo_vlan_rx_add_vid = be_vlan_add_vid,
+- .ndo_vlan_rx_kill_vid = be_vlan_rem_vid,
+-};
+-
+-static void be_netdev_init(struct net_device *netdev)
+-{
+- struct be_adapter *adapter = netdev_priv(netdev);
+-
+- netdev->features |= NETIF_F_SG | NETIF_F_HW_VLAN_RX | NETIF_F_TSO |
+- NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_FILTER | NETIF_F_IP_CSUM |
+- NETIF_F_IPV6_CSUM | NETIF_F_TSO6;
+-
+- netdev->flags |= IFF_MULTICAST;
+-
+- BE_SET_NETDEV_OPS(netdev, &be_netdev_ops);
+-
+- SET_ETHTOOL_OPS(netdev, &be_ethtool_ops);
+-
+- be_lro_init(adapter, netdev);
+-
+- netif_napi_add(netdev, &adapter->rx_eq.napi, be_poll_rx,
+- BE_NAPI_WEIGHT);
+- netif_napi_add(netdev, &adapter->tx_eq.napi, be_poll_tx,
+- BE_NAPI_WEIGHT);
+-
+- netif_carrier_off(netdev);
+- netif_stop_queue(netdev);
+-}
+-
+-static void be_unmap_pci_bars(struct be_adapter *adapter)
+-{
+- struct be_ctrl_info *ctrl = &adapter->ctrl;
+- if (ctrl->csr)
+- iounmap(ctrl->csr);
+- if (ctrl->db)
+- iounmap(ctrl->db);
+- if (ctrl->pcicfg)
+- iounmap(ctrl->pcicfg);
+-}
+-
+-static int be_map_pci_bars(struct be_adapter *adapter)
+-{
+- u8 __iomem *addr;
+-
+- addr = ioremap_nocache(pci_resource_start(adapter->pdev, 2),
+- pci_resource_len(adapter->pdev, 2));
+- if (addr == NULL)
+- return -ENOMEM;
+- adapter->ctrl.csr = addr;
+-
+- addr = ioremap_nocache(pci_resource_start(adapter->pdev, 4),
+- 128 * 1024);
+- if (addr == NULL)
+- goto pci_map_err;
+- adapter->ctrl.db = addr;
+-
+- addr = ioremap_nocache(pci_resource_start(adapter->pdev, 1),
+- pci_resource_len(adapter->pdev, 1));
+- if (addr == NULL)
+- goto pci_map_err;
+- adapter->ctrl.pcicfg = addr;
+-
+- return 0;
+-pci_map_err:
+- be_unmap_pci_bars(adapter);
+- return -ENOMEM;
+-}
+-
+-
+-static void be_ctrl_cleanup(struct be_adapter *adapter)
+-{
+- struct be_dma_mem *mem = &adapter->ctrl.mbox_mem_alloced;
+-
+- be_unmap_pci_bars(adapter);
+-
+- if (mem->va)
+- pci_free_consistent(adapter->pdev, mem->size,
+- mem->va, mem->dma);
+-}
+-
+-/* Initialize the mbox required to send cmds to BE */
+-static int be_ctrl_init(struct be_adapter *adapter)
+-{
+- struct be_ctrl_info *ctrl = &adapter->ctrl;
+- struct be_dma_mem *mbox_mem_alloc = &ctrl->mbox_mem_alloced;
+- struct be_dma_mem *mbox_mem_align = &ctrl->mbox_mem;
+- int status;
+- u32 val;
+-
+- status = be_map_pci_bars(adapter);
+- if (status)
+- return status;
+-
+- mbox_mem_alloc->size = sizeof(struct be_mcc_mailbox) + 16;
+- mbox_mem_alloc->va = pci_alloc_consistent(adapter->pdev,
+- mbox_mem_alloc->size, &mbox_mem_alloc->dma);
+- if (!mbox_mem_alloc->va) {
+- be_unmap_pci_bars(adapter);
+- return -1;
+- }
+- mbox_mem_align->size = sizeof(struct be_mcc_mailbox);
+- mbox_mem_align->va = PTR_ALIGN(mbox_mem_alloc->va, 16);
+- mbox_mem_align->dma = PTR_ALIGN(mbox_mem_alloc->dma, 16);
+- memset(mbox_mem_align->va, 0, sizeof(struct be_mcc_mailbox));
+- spin_lock_init(&ctrl->cmd_lock);
+-
+- val = ioread32(ctrl->pcicfg + PCICFG_MEMBAR_CTRL_INT_CTRL_OFFSET);
+- ctrl->pci_func = (val >> MEMBAR_CTRL_INT_CTRL_PFUNC_SHIFT) &
+- MEMBAR_CTRL_INT_CTRL_PFUNC_MASK;
+- return 0;
+-}
+-
+-static void be_stats_cleanup(struct be_adapter *adapter)
+-{
+- struct be_stats_obj *stats = &adapter->stats;
+- struct be_dma_mem *cmd = &stats->cmd;
+-
+- if (cmd->va)
+- pci_free_consistent(adapter->pdev, cmd->size,
+- cmd->va, cmd->dma);
+-}
+-
+-static int be_stats_init(struct be_adapter *adapter)
+-{
+- struct be_stats_obj *stats = &adapter->stats;
+- struct be_dma_mem *cmd = &stats->cmd;
+-
+- cmd->size = sizeof(struct be_cmd_req_get_stats);
+- cmd->va = pci_alloc_consistent(adapter->pdev, cmd->size, &cmd->dma);
+- if (cmd->va == NULL)
+- return -1;
+- return 0;
+-}
+-
+-static void __devexit be_remove(struct pci_dev *pdev)
+-{
+- struct be_adapter *adapter = pci_get_drvdata(pdev);
+- if (!adapter)
+- return;
+-
+- unregister_netdev(adapter->netdev);
+-
+- be_stats_cleanup(adapter);
+-
+- be_ctrl_cleanup(adapter);
+-
+- if (adapter->msix_enabled) {
+- pci_disable_msix(adapter->pdev);
+- adapter->msix_enabled = false;
+- }
+-
+- pci_set_drvdata(pdev, NULL);
+- pci_release_regions(pdev);
+- pci_disable_device(pdev);
+-
+- free_netdev(adapter->netdev);
+-}
+-
+-static int be_hw_up(struct be_adapter *adapter)
+-{
+- struct be_ctrl_info *ctrl = &adapter->ctrl;
+- int status;
+-
+- status = be_cmd_POST(ctrl);
+- if (status)
+- return status;
+-
+- status = be_cmd_get_fw_ver(ctrl, adapter->fw_ver);
+- if (status)
+- return status;
+-
+- status = be_cmd_query_fw_cfg(ctrl, &adapter->port_num);
+- return status;
+-}
+-
+-static int __devinit be_probe(struct pci_dev *pdev,
+- const struct pci_device_id *pdev_id)
+-{
+- int status = 0;
+- struct be_adapter *adapter;
+- struct net_device *netdev;
+- struct be_ctrl_info *ctrl;
+- u8 mac[ETH_ALEN];
+-
+- status = pci_enable_device(pdev);
+- if (status)
+- goto do_none;
+-
+- status = pci_request_regions(pdev, DRV_NAME);
+- if (status)
+- goto disable_dev;
+- pci_set_master(pdev);
+-
+- netdev = alloc_etherdev(sizeof(struct be_adapter));
+- if (netdev == NULL) {
+- status = -ENOMEM;
+- goto rel_reg;
+- }
+- adapter = netdev_priv(netdev);
+- adapter->pdev = pdev;
+- pci_set_drvdata(pdev, adapter);
+- adapter->netdev = netdev;
+-
+- be_msix_enable(adapter);
+-
+- status = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
+- if (!status) {
+- netdev->features |= NETIF_F_HIGHDMA;
+- } else {
+- status = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+- if (status) {
+- dev_err(&pdev->dev, "Could not set PCI DMA Mask\n");
+- goto free_netdev;
+- }
+- }
+-
+- ctrl = &adapter->ctrl;
+- status = be_ctrl_init(adapter);
+- if (status)
+- goto free_netdev;
+-
+- status = be_stats_init(adapter);
+- if (status)
+- goto ctrl_clean;
+-
+- status = be_hw_up(adapter);
+- if (status)
+- goto stats_clean;
+-
+- status = be_cmd_mac_addr_query(ctrl, mac, MAC_ADDRESS_TYPE_NETWORK,
+- true /* permanent */, 0);
+- if (status)
+- goto stats_clean;
+- memcpy(netdev->dev_addr, mac, ETH_ALEN);
+-
+- INIT_DELAYED_WORK(&adapter->work, be_worker);
+- be_netdev_init(netdev);
+- SET_NETDEV_DEV(netdev, &adapter->pdev->dev);
+-
+- status = register_netdev(netdev);
+- if (status != 0)
+- goto stats_clean;
+-
+- dev_info(&pdev->dev, BE_NAME " port %d\n", adapter->port_num);
+- return 0;
+-
+-stats_clean:
+- be_stats_cleanup(adapter);
+-ctrl_clean:
+- be_ctrl_cleanup(adapter);
+-free_netdev:
+- free_netdev(adapter->netdev);
+-rel_reg:
+- pci_release_regions(pdev);
+-disable_dev:
+- pci_disable_device(pdev);
+-do_none:
+- dev_warn(&pdev->dev, BE_NAME " initialization failed\n");
+- return status;
+-}
+-
+-static int be_suspend(struct pci_dev *pdev, pm_message_t state)
+-{
+- struct be_adapter *adapter = pci_get_drvdata(pdev);
+- struct net_device *netdev = adapter->netdev;
+-
+- netif_device_detach(netdev);
+- if (netif_running(netdev)) {
+- rtnl_lock();
+- be_close(netdev);
+- rtnl_unlock();
+- }
+-
+- pci_save_state(pdev);
+- pci_disable_device(pdev);
+- pci_set_power_state(pdev, pci_choose_state(pdev, state));
+- return 0;
+-}
+-
+-static int be_resume(struct pci_dev *pdev)
+-{
+- int status = 0;
+- struct be_adapter *adapter = pci_get_drvdata(pdev);
+- struct net_device *netdev = adapter->netdev;
+-
+- netif_device_detach(netdev);
+-
+- status = pci_enable_device(pdev);
+- if (status)
+- return status;
+-
+- pci_set_power_state(pdev, 0);
+- pci_restore_state(pdev);
+-
+- if (netif_running(netdev)) {
+- rtnl_lock();
+- be_open(netdev);
+- rtnl_unlock();
+- }
+- netif_device_attach(netdev);
+- return 0;
+-}
+-
+-static struct pci_driver be_driver = {
+- .name = DRV_NAME,
+- .id_table = be_dev_ids,
+- .probe = be_probe,
+- .remove = be_remove,
+- .suspend = be_suspend,
+- .resume = be_resume
+-};
+-
+-static int __init be_init_module(void)
+-{
+- if (rx_frag_size != 8192 && rx_frag_size != 4096
+- && rx_frag_size != 2048) {
+- printk(KERN_WARNING DRV_NAME
+- " : Module param rx_frag_size must be 2048/4096/8192."
+- " Using 2048\n");
+- rx_frag_size = 2048;
+- }
+- /* Ensure rx_frag_size is aligned to chache line */
+- if (SKB_DATA_ALIGN(rx_frag_size) != rx_frag_size) {
+- printk(KERN_WARNING DRV_NAME
+- " : Bad module param rx_frag_size. Using 2048\n");
+- rx_frag_size = 2048;
+- }
+-
+- return pci_register_driver(&be_driver);
+-}
+-module_init(be_init_module);
+-
+-static void __exit be_exit_module(void)
+-{
+- pci_unregister_driver(&be_driver);
+-}
+-module_exit(be_exit_module);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/benet/Kconfig linux-2.6.29-rc3.owrt/drivers/net/benet/Kconfig
+--- linux-2.6.29.owrt/drivers/net/benet/Kconfig 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/benet/Kconfig 1970-01-01 01:00:00.000000000 +0100
+@@ -1,7 +0,0 @@
+-config BE2NET
+- tristate "ServerEngines' 10Gbps NIC - BladeEngine 2"
+- depends on PCI && INET
+- select INET_LRO
+- help
+- This driver implements the NIC functionality for ServerEngines'
+- 10Gbps network adapter - BladeEngine 2.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/benet/Makefile linux-2.6.29-rc3.owrt/drivers/net/benet/Makefile
+--- linux-2.6.29.owrt/drivers/net/benet/Makefile 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/benet/Makefile 1970-01-01 01:00:00.000000000 +0100
+@@ -1,7 +0,0 @@
+-#
+-# Makefile to build the network driver for ServerEngine's BladeEngine.
+-#
+-
+-obj-$(CONFIG_BE2NET) += be2net.o
+-
+-be2net-y := be_main.o be_cmds.o be_ethtool.o
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/bnx2.c linux-2.6.29-rc3.owrt/drivers/net/bnx2.c
+--- linux-2.6.29.owrt/drivers/net/bnx2.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/bnx2.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1,6 +1,6 @@
+ /* bnx2.c: Broadcom NX2 network driver.
+ *
+- * Copyright (c) 2004-2009 Broadcom Corporation
++ * Copyright (c) 2004-2008 Broadcom Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+@@ -57,8 +57,8 @@
+
+ #define DRV_MODULE_NAME "bnx2"
+ #define PFX DRV_MODULE_NAME ": "
+-#define DRV_MODULE_VERSION "1.9.3"
+-#define DRV_MODULE_RELDATE "March 17, 2009"
++#define DRV_MODULE_VERSION "1.9.0"
++#define DRV_MODULE_RELDATE "Dec 16, 2008"
+
+ #define RUN_AT(x) (jiffies + (x))
+
+@@ -2910,8 +2910,18 @@
+
+ rx_hdr = (struct l2_fhdr *) skb->data;
+ len = rx_hdr->l2_fhdr_pkt_len;
+- status = rx_hdr->l2_fhdr_status;
+
++ if ((status = rx_hdr->l2_fhdr_status) &
++ (L2_FHDR_ERRORS_BAD_CRC |
++ L2_FHDR_ERRORS_PHY_DECODE |
++ L2_FHDR_ERRORS_ALIGNMENT |
++ L2_FHDR_ERRORS_TOO_SHORT |
++ L2_FHDR_ERRORS_GIANT_FRAME)) {
++
++ bnx2_reuse_rx_skb(bp, rxr, skb, sw_ring_cons,
++ sw_ring_prod);
++ goto next_rx;
++ }
+ hdr_len = 0;
+ if (status & L2_FHDR_STATUS_SPLIT) {
+ hdr_len = rx_hdr->l2_fhdr_ip_xsum;
+@@ -2921,24 +2931,6 @@
+ pg_ring_used = 1;
+ }
+
+- if (unlikely(status & (L2_FHDR_ERRORS_BAD_CRC |
+- L2_FHDR_ERRORS_PHY_DECODE |
+- L2_FHDR_ERRORS_ALIGNMENT |
+- L2_FHDR_ERRORS_TOO_SHORT |
+- L2_FHDR_ERRORS_GIANT_FRAME))) {
+-
+- bnx2_reuse_rx_skb(bp, rxr, skb, sw_ring_cons,
+- sw_ring_prod);
+- if (pg_ring_used) {
+- int pages;
+-
+- pages = PAGE_ALIGN(len - hdr_len) >> PAGE_SHIFT;
+-
+- bnx2_reuse_rx_skb_pages(bp, rxr, NULL, pages);
+- }
+- goto next_rx;
+- }
+-
+ len -= 4;
+
+ if (len <= bp->rx_copy_thresh) {
+@@ -5843,6 +5835,9 @@
+ for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) {
+ msix_ent[i].entry = i;
+ msix_ent[i].vector = 0;
++
++ snprintf(bp->irq_tbl[i].name, len, "%s-%d", dev->name, i);
++ bp->irq_tbl[i].handler = bnx2_msi_1shot;
+ }
+
+ rc = pci_enable_msix(bp->pdev, msix_ent, BNX2_MAX_MSIX_VEC);
+@@ -5851,11 +5846,8 @@
+
+ bp->irq_nvecs = msix_vecs;
+ bp->flags |= BNX2_FLAG_USING_MSIX | BNX2_FLAG_ONE_SHOT_MSI;
+- for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) {
++ for (i = 0; i < BNX2_MAX_MSIX_VEC; i++)
+ bp->irq_tbl[i].vector = msix_ent[i].vector;
+- snprintf(bp->irq_tbl[i].name, len, "%s-%d", dev->name, i);
+- bp->irq_tbl[i].handler = bnx2_msi_1shot;
+- }
+ }
+
+ static void
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/bnx2_fw2.h linux-2.6.29-rc3.owrt/drivers/net/bnx2_fw2.h
+--- linux-2.6.29.owrt/drivers/net/bnx2_fw2.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/bnx2_fw2.h 2009-05-10 23:48:28.000000000 +0200
+@@ -15,847 +15,848 @@
+ */
+
+ static u8 bnx2_COM_b09FwText[] = {
+- 0xcd, 0x7c, 0x7b, 0x6c, 0x5c, 0xd7, 0x99, 0xdf, 0x77, 0xef, 0xcc, 0x90,
+- 0x43, 0x6a, 0x44, 0x5d, 0x32, 0x13, 0x66, 0x1c, 0x33, 0xcd, 0x3c, 0x2e,
+- 0x29, 0xda, 0x64, 0x92, 0x31, 0x77, 0xa4, 0xd0, 0xc9, 0xad, 0x3d, 0x99,
+- 0x19, 0xc9, 0x4c, 0xa8, 0x0d, 0xe8, 0x44, 0x2e, 0x52, 0x54, 0x28, 0xd8,
+- 0x21, 0xe5, 0x28, 0x8b, 0xec, 0xae, 0xf2, 0x28, 0x9a, 0x2e, 0xd2, 0xd5,
+- 0x64, 0x48, 0x29, 0xca, 0x62, 0xc4, 0x19, 0xd3, 0x34, 0x93, 0xa2, 0x01,
+- 0x32, 0x19, 0x92, 0x72, 0x76, 0x31, 0x12, 0x15, 0xdb, 0xcd, 0x1a, 0x41,
+- 0xe2, 0xb0, 0xd4, 0x23, 0xde, 0x20, 0x2d, 0xb4, 0x1b, 0x17, 0x4d, 0xd3,
+- 0x45, 0x21, 0xc8, 0x4e, 0x6c, 0x6c, 0xb3, 0x6d, 0x50, 0x2c, 0x10, 0x77,
+- 0x91, 0x64, 0xfa, 0xfb, 0x9d, 0x73, 0xee, 0x70, 0x44, 0x31, 0x4e, 0xba,
+- 0x7f, 0x95, 0xc0, 0xe0, 0xdc, 0x7b, 0x9e, 0xdf, 0xf9, 0xce, 0xf7, 0x3e,
+- 0xdf, 0xe5, 0x43, 0x22, 0xbd, 0x62, 0xfe, 0xf6, 0xe3, 0x97, 0xf9, 0xfd,
+- 0x3f, 0x9c, 0x7b, 0xe0, 0x9d, 0x87, 0xdf, 0x89, 0xc7, 0x43, 0xf6, 0x81,
+- 0xae, 0x20, 0xeb, 0x03, 0xf8, 0x45, 0xf1, 0x9b, 0x30, 0xcf, 0x7b, 0xfd,
+- 0x39, 0xf8, 0x1d, 0xb6, 0x44, 0x66, 0xff, 0x46, 0xc4, 0xda, 0xd5, 0x16,
+- 0xfe, 0x35, 0x63, 0xde, 0xe8, 0xcf, 0xfe, 0x2d, 0xfb, 0x39, 0xff, 0x80,
+- 0xb9, 0xfd, 0xbf, 0x80, 0x19, 0xbe, 0xdf, 0xfc, 0x24, 0x6c, 0x7b, 0xb7,
+- 0x3e, 0x90, 0x73, 0x25, 0x1c, 0xf0, 0x7e, 0x38, 0x3d, 0xe7, 0x8a, 0x64,
+- 0x9b, 0x63, 0xf1, 0xbc, 0xfc, 0xb2, 0x55, 0x8a, 0x06, 0x85, 0xf5, 0x6f,
+- 0xf3, 0x7e, 0xf1, 0x95, 0x6f, 0xbf, 0x3b, 0xf1, 0xb3, 0x7a, 0x40, 0xc2,
+- 0x8e, 0xf7, 0xba, 0x38, 0x23, 0x12, 0x1e, 0xc2, 0x98, 0x2f, 0x1f, 0x9c,
+- 0xb5, 0xa5, 0xcf, 0x9f, 0xeb, 0xb5, 0xd6, 0xb7, 0x0f, 0x4a, 0xc9, 0xf6,
+- 0x1c, 0xb9, 0xb2, 0x19, 0x95, 0xef, 0x6c, 0x8a, 0x35, 0x93, 0xe9, 0x11,
+- 0x7b, 0xf9, 0xad, 0x92, 0x75, 0x2c, 0x09, 0xb8, 0x5c, 0x27, 0x2e, 0xb9,
+- 0xca, 0x20, 0xde, 0x13, 0x31, 0x91, 0x7f, 0xbe, 0x5f, 0x8f, 0x0d, 0x4b,
+- 0x60, 0x55, 0xc2, 0x5d, 0xde, 0x0b, 0xd3, 0x37, 0x56, 0x62, 0x12, 0x5c,
+- 0x1a, 0x97, 0x72, 0x35, 0x22, 0xa1, 0x55, 0x19, 0x0a, 0xc8, 0x70, 0xec,
+- 0x71, 0xf4, 0x28, 0x34, 0x83, 0x72, 0xa4, 0x69, 0x49, 0xd0, 0x0d, 0x03,
+- 0xb6, 0x08, 0x7e, 0x0e, 0x7e, 0x51, 0xfc, 0x62, 0xf8, 0x9d, 0xc5, 0x3c,
+- 0x43, 0x92, 0x6f, 0x72, 0x4e, 0xac, 0x5b, 0xc5, 0xfa, 0xd5, 0x84, 0x33,
+- 0x8b, 0x79, 0x6f, 0x05, 0x62, 0xf2, 0xed, 0x83, 0x84, 0xcb, 0x21, 0x3c,
+- 0x80, 0x2d, 0x6c, 0xe5, 0x56, 0xe4, 0x74, 0x3e, 0x2d, 0x71, 0xdb, 0xed,
+- 0x95, 0xa2, 0x63, 0xc5, 0xe7, 0x47, 0x07, 0xa4, 0x74, 0x1c, 0xed, 0x55,
+- 0xc9, 0xda, 0x98, 0xbf, 0xe8, 0xc8, 0xac, 0x6e, 0x63, 0xdd, 0x17, 0x41,
+- 0x27, 0x09, 0x87, 0x08, 0xfb, 0x4e, 0xf5, 0x31, 0x3c, 0x73, 0xbe, 0x78,
+- 0x50, 0xc3, 0xbd, 0x8a, 0x77, 0xd6, 0xff, 0x41, 0x44, 0xbf, 0xf3, 0x99,
+- 0x7d, 0xfd, 0x75, 0xfd, 0xfd, 0x72, 0xfd, 0x51, 0xec, 0x99, 0x30, 0xf8,
+- 0x7b, 0x96, 0x52, 0x08, 0xb0, 0x34, 0x56, 0x22, 0xd6, 0xda, 0xca, 0xb8,
+- 0x9c, 0xab, 0x3e, 0x24, 0xb9, 0x74, 0xab, 0x35, 0x97, 0x96, 0xa8, 0x2d,
+- 0xc3, 0x4e, 0x1e, 0x1d, 0xb6, 0x9b, 0x62, 0x35, 0x2a, 0x12, 0xee, 0x06,
+- 0x5e, 0x5e, 0x5d, 0xe1, 0xdc, 0x41, 0xd4, 0x0d, 0xa2, 0x7f, 0x9f, 0xb5,
+- 0xbe, 0x02, 0xf8, 0x3d, 0xe2, 0xa7, 0xd5, 0x5a, 0x4c, 0x0f, 0xc7, 0xe6,
+- 0xb1, 0xe6, 0xd5, 0xe6, 0xf0, 0xe4, 0x6d, 0x71, 0x30, 0xe7, 0x00, 0xfa,
+- 0x10, 0x57, 0x9c, 0x8b, 0x73, 0x72, 0xbe, 0x08, 0xc6, 0x46, 0xd1, 0x46,
+- 0xb8, 0x5a, 0xad, 0x5c, 0xda, 0xe1, 0xbb, 0x6c, 0x01, 0x7f, 0x5b, 0xc4,
+- 0x5f, 0xef, 0x90, 0x7c, 0xb7, 0xc9, 0x35, 0xda, 0xb0, 0x97, 0xba, 0xbc,
+- 0xe7, 0xed, 0xed, 0x0a, 0xcf, 0x2d, 0x2c, 0xef, 0x0b, 0x26, 0x46, 0x4b,
+- 0x8a, 0x4e, 0x66, 0xb1, 0x1f, 0x4b, 0xd1, 0x84, 0x85, 0xe7, 0x64, 0x93,
+- 0xfd, 0x89, 0xeb, 0xb8, 0x2c, 0xe0, 0x5c, 0xcb, 0x2b, 0x25, 0xfb, 0x6a,
+- 0xf3, 0x17, 0xad, 0x9c, 0xbb, 0x68, 0x6f, 0xaf, 0xb3, 0xff, 0x09, 0xf4,
+- 0x0f, 0xca, 0x62, 0xa5, 0x4f, 0x08, 0x93, 0x1e, 0x77, 0x02, 0xe3, 0xc4,
+- 0xb1, 0xbd, 0x73, 0xf6, 0xd5, 0xf5, 0xf3, 0xf6, 0x35, 0x75, 0x6e, 0x58,
+- 0xab, 0x3d, 0x57, 0x27, 0xde, 0xc6, 0xfe, 0x3f, 0xc4, 0x5b, 0x0c, 0xf3,
+- 0x47, 0x51, 0xee, 0xb3, 0x1a, 0xb5, 0x16, 0xd6, 0x8f, 0xe1, 0x79, 0x2f,
+- 0x1c, 0xde, 0x52, 0x74, 0x77, 0x05, 0x74, 0xe7, 0x78, 0x31, 0x79, 0x66,
+- 0x73, 0x08, 0xfb, 0x88, 0xca, 0xd7, 0xc1, 0x17, 0x03, 0x87, 0xf7, 0x49,
+- 0x1e, 0x7c, 0x41, 0x7a, 0x7b, 0x74, 0xf5, 0x9f, 0x49, 0x31, 0x9a, 0x18,
+- 0xa5, 0xfc, 0x48, 0x4e, 0x80, 0x9e, 0x0d, 0x6b, 0xe7, 0x96, 0xb2, 0x29,
+- 0x5b, 0x1e, 0x16, 0xdb, 0xc3, 0xba, 0x99, 0x31, 0xa7, 0x20, 0x41, 0xb4,
+- 0x65, 0x25, 0xe0, 0x45, 0x25, 0xb7, 0xfa, 0x5e, 0x0b, 0x74, 0x19, 0x5f,
+- 0xc0, 0xa0, 0xc0, 0x92, 0x58, 0xb6, 0xdb, 0x25, 0xc5, 0xe3, 0xac, 0x0f,
+- 0x83, 0xc6, 0xc1, 0xb3, 0x2b, 0x07, 0x00, 0x97, 0x0c, 0xdb, 0xc2, 0xba,
+- 0x61, 0xa7, 0x2c, 0x25, 0xb1, 0x2f, 0xff, 0xa1, 0x65, 0x64, 0x9e, 0xc1,
+- 0xef, 0xa8, 0x59, 0xab, 0xcd, 0x87, 0x96, 0xbd, 0x1a, 0xb1, 0x02, 0xab,
+- 0xe3, 0x72, 0x76, 0x0f, 0xbc, 0x36, 0x80, 0x57, 0x7b, 0xc9, 0xe7, 0xd3,
+- 0x20, 0xde, 0x07, 0xd1, 0xb7, 0xcf, 0x0a, 0xae, 0xde, 0x8d, 0xd3, 0xb5,
+- 0xe6, 0x70, 0x7a, 0x1b, 0x38, 0xb5, 0x57, 0x07, 0xd0, 0xe7, 0x6e, 0x9c,
+- 0x36, 0x80, 0x53, 0x7b, 0x55, 0xe3, 0xb3, 0x01, 0x7c, 0xda, 0x4b, 0x51,
+- 0x94, 0xfb, 0x2c, 0x7b, 0x59, 0xe3, 0xb3, 0x61, 0x78, 0xfa, 0x62, 0x93,
+- 0xb0, 0x66, 0x3b, 0x68, 0x2e, 0x4b, 0xda, 0x81, 0x9c, 0x2a, 0xc8, 0x5c,
+- 0xc5, 0x06, 0xbe, 0x82, 0xe2, 0x4e, 0x58, 0x32, 0xa7, 0xda, 0x0a, 0x92,
+- 0x02, 0x0d, 0x95, 0x9c, 0xb1, 0x51, 0x5b, 0x12, 0xf1, 0xac, 0x0d, 0x7c,
+- 0x57, 0x81, 0xf7, 0x2a, 0x70, 0xae, 0x64, 0xc2, 0x8b, 0xe0, 0xd7, 0x38,
+- 0xce, 0x65, 0x77, 0x7d, 0xc2, 0xa9, 0x2b, 0x9e, 0x8d, 0x9b, 0x33, 0x23,
+- 0xed, 0xf3, 0x9c, 0x62, 0x38, 0x2f, 0x75, 0x7e, 0xd6, 0x5f, 0x66, 0xf6,
+- 0x49, 0x6a, 0x39, 0xa0, 0xce, 0x2b, 0xbd, 0xfa, 0xae, 0xf6, 0x79, 0xd9,
+- 0x13, 0x94, 0x65, 0x3c, 0x23, 0x91, 0xd4, 0x12, 0xcf, 0x29, 0x9b, 0x0a,
+- 0x08, 0xcf, 0x2a, 0x24, 0xd9, 0x19, 0x9e, 0x4b, 0x54, 0x92, 0xab, 0x3c,
+- 0xb3, 0x0d, 0x73, 0x5e, 0xfa, 0x9c, 0x92, 0x7b, 0x9c, 0x53, 0xd2, 0x9c,
+- 0xd3, 0x76, 0xf3, 0x8a, 0x39, 0xa7, 0x7f, 0x2b, 0x86, 0xe6, 0xdf, 0x10,
+- 0x07, 0x36, 0x70, 0x10, 0xbc, 0x03, 0x07, 0xdd, 0x6d, 0x1c, 0xc4, 0x6d,
+- 0xec, 0xe1, 0xae, 0xfd, 0x77, 0xd6, 0x75, 0xee, 0x5d, 0x4a, 0x41, 0x4f,
+- 0xac, 0x85, 0x0a, 0xe1, 0x0e, 0x48, 0x71, 0x86, 0x30, 0x52, 0xae, 0x6b,
+- 0x58, 0xf3, 0x2b, 0x94, 0x6d, 0x07, 0x04, 0x34, 0xf1, 0xb6, 0x80, 0x1a,
+- 0x53, 0x92, 0x85, 0x26, 0xdb, 0x4a, 0x92, 0xcb, 0x80, 0x5e, 0x6b, 0xac,
+- 0x03, 0x83, 0x6e, 0x6a, 0x3e, 0xde, 0xd1, 0x07, 0xd1, 0x36, 0x1e, 0xf3,
+- 0x95, 0x38, 0xe4, 0x74, 0x10, 0xe5, 0xd7, 0x50, 0xee, 0xb3, 0x66, 0x6a,
+- 0x7f, 0x65, 0x49, 0x5f, 0x4b, 0x9c, 0x09, 0xee, 0x31, 0x36, 0x9d, 0x73,
+- 0x4b, 0x31, 0x47, 0xde, 0x26, 0xce, 0x3b, 0x43, 0x22, 0x83, 0x09, 0xa7,
+- 0x28, 0xff, 0x05, 0xed, 0x89, 0x58, 0x56, 0xfe, 0xb7, 0x4f, 0xbb, 0xc0,
+- 0x43, 0xcf, 0xeb, 0x59, 0xf5, 0xc4, 0x7a, 0x8e, 0xcb, 0xa0, 0x2e, 0x24,
+- 0xb3, 0xd0, 0x31, 0x05, 0x97, 0xeb, 0x71, 0xfe, 0xf8, 0x2c, 0xd7, 0xcd,
+- 0x37, 0x7d, 0x7d, 0x20, 0xd9, 0x80, 0xc7, 0x36, 0xf2, 0xe5, 0xa4, 0x95,
+- 0x6f, 0x12, 0x57, 0x19, 0x71, 0x9b, 0x1a, 0x66, 0x0d, 0x6b, 0x1b, 0x4e,
+- 0xf0, 0x6b, 0x16, 0x34, 0x49, 0xd8, 0xe2, 0xe0, 0x9b, 0x73, 0x01, 0xff,
+- 0x1c, 0x82, 0xde, 0xa4, 0x2c, 0x42, 0x3f, 0x96, 0x2b, 0x9c, 0xef, 0x33,
+- 0x56, 0xe0, 0xb2, 0x3f, 0x3f, 0xcf, 0x86, 0x73, 0xeb, 0xf9, 0xca, 0xcd,
+- 0xd7, 0x0c, 0xef, 0x2b, 0x3d, 0x88, 0xf9, 0x4a, 0x1d, 0xf3, 0x95, 0xc8,
+- 0xb3, 0x07, 0x94, 0xae, 0x39, 0x4e, 0xfc, 0x9d, 0x47, 0xdb, 0x2d, 0xd0,
+- 0x08, 0xf9, 0x81, 0xfc, 0x41, 0x5e, 0x7d, 0xb7, 0x8d, 0xfd, 0x76, 0xe0,
+- 0x76, 0x06, 0x72, 0x98, 0xbc, 0x11, 0x96, 0x7c, 0x94, 0xf5, 0x8f, 0x1b,
+- 0x98, 0x20, 0x13, 0xd4, 0xfb, 0xf1, 0x1e, 0x5f, 0x3e, 0x82, 0x16, 0x01,
+- 0xdb, 0xf3, 0x6a, 0x8f, 0xb6, 0xe7, 0x01, 0x37, 0x9d, 0x30, 0x72, 0xdf,
+- 0x9e, 0x91, 0xdb, 0x3e, 0xbc, 0x3c, 0x2b, 0xca, 0x55, 0xb1, 0xd6, 0x33,
+- 0x61, 0xc8, 0x70, 0x5b, 0xf2, 0x69, 0xd0, 0x66, 0x3a, 0x60, 0xe4, 0xc3,
+- 0x8b, 0xc6, 0x56, 0xd2, 0x38, 0x0e, 0x2a, 0x3d, 0xbe, 0x88, 0x79, 0x4f,
+- 0x00, 0x46, 0xce, 0x19, 0xb4, 0xd6, 0x2a, 0x11, 0xe8, 0x6c, 0xc0, 0xe6,
+- 0x24, 0xe2, 0x80, 0x09, 0xef, 0x7e, 0x9f, 0x88, 0x2c, 0x6c, 0xfa, 0xeb,
+- 0x2e, 0xb6, 0xf5, 0x45, 0x49, 0xe1, 0xdb, 0x99, 0x0d, 0xec, 0xd0, 0xc6,
+- 0xcc, 0xc9, 0xca, 0x99, 0x96, 0xed, 0x92, 0x06, 0xdd, 0xd1, 0x86, 0x44,
+- 0x26, 0x37, 0x32, 0xef, 0x06, 0xbf, 0xa1, 0x1e, 0x63, 0xca, 0xcd, 0x52,
+- 0xc4, 0x76, 0x5d, 0x94, 0x94, 0x3f, 0x27, 0xba, 0x6f, 0xb8, 0x3e, 0xbd,
+- 0x0c, 0x49, 0xc8, 0x6d, 0xb5, 0x36, 0x70, 0x26, 0x47, 0x9b, 0xbf, 0x6c,
+- 0x7d, 0x35, 0xa8, 0xed, 0x15, 0xdb, 0xfb, 0xa9, 0xa5, 0xd7, 0x8c, 0x4f,
+- 0x27, 0x15, 0x1e, 0x62, 0x5d, 0xfa, 0xdd, 0x35, 0xef, 0xd7, 0x22, 0x46,
+- 0x87, 0x99, 0xf7, 0xf9, 0xa0, 0xb6, 0x7f, 0xc2, 0x3d, 0xe4, 0xa3, 0xa0,
+- 0xe7, 0xf4, 0xe0, 0x9c, 0xc3, 0x21, 0x6f, 0x6a, 0x7c, 0x43, 0xf5, 0x2b,
+- 0x99, 0x7e, 0xd1, 0x6e, 0x3d, 0xee, 0xd4, 0xf4, 0x88, 0xa2, 0xa1, 0x4f,
+- 0x4f, 0x0f, 0xab, 0xf2, 0xb3, 0xd3, 0x29, 0x55, 0x2e, 0x4e, 0xbb, 0xaa,
+- 0x3c, 0xaf, 0xfa, 0x5b, 0xde, 0x90, 0xa9, 0x1f, 0x9d, 0x8e, 0xab, 0x72,
+- 0xdc, 0x94, 0x69, 0x53, 0x66, 0x4c, 0x39, 0x69, 0x4a, 0xcf, 0x94, 0x59,
+- 0x53, 0x16, 0xcc, 0x7c, 0x53, 0xe6, 0xfd, 0x98, 0x29, 0x67, 0x4c, 0x79,
+- 0xdc, 0x94, 0x1f, 0x31, 0xe5, 0x09, 0x03, 0xd7, 0xbc, 0x29, 0x3f, 0x6e,
+- 0xea, 0x4f, 0x1b, 0x38, 0x3f, 0x03, 0x78, 0x1e, 0x09, 0xed, 0xd0, 0xca,
+- 0x69, 0x4d, 0x5f, 0x15, 0x47, 0xca, 0x9b, 0xdc, 0x7f, 0x1c, 0x32, 0x25,
+- 0x88, 0xb3, 0x04, 0xbf, 0x3b, 0xa4, 0x09, 0x17, 0x72, 0x38, 0x88, 0x33,
+- 0xe4, 0xf3, 0x69, 0xf9, 0x53, 0xf4, 0x1d, 0xbd, 0xe0, 0xc8, 0x62, 0x95,
+- 0xfa, 0xf5, 0x5b, 0xf2, 0x6a, 0x85, 0xe7, 0xf1, 0xbc, 0xdc, 0xa8, 0xa4,
+- 0xe2, 0x41, 0x8b, 0x74, 0x94, 0x98, 0x7c, 0x45, 0x12, 0x90, 0xfd, 0x63,
+- 0x71, 0x96, 0xd7, 0xa8, 0x54, 0xd0, 0xef, 0xa0, 0x5a, 0xfb, 0x79, 0x01,
+- 0x4c, 0x72, 0xa5, 0xd2, 0x0d, 0x99, 0xf5, 0x4a, 0x8b, 0x7a, 0xfd, 0xfc,
+- 0xa6, 0xc8, 0xc8, 0x05, 0xe2, 0xf9, 0x5b, 0xb2, 0x51, 0x21, 0xde, 0x9f,
+- 0x87, 0xad, 0x90, 0x4a, 0xbf, 0x28, 0x89, 0xd1, 0x8b, 0xc2, 0xf9, 0xc6,
+- 0xd2, 0x28, 0xe3, 0x65, 0xfc, 0xce, 0x41, 0xde, 0x76, 0x4f, 0xe8, 0xf9,
+- 0x86, 0xcd, 0x7c, 0x2e, 0xec, 0xc2, 0x5b, 0x0e, 0x65, 0xe0, 0x7f, 0xb5,
+- 0xf4, 0x9e, 0xb4, 0x3c, 0xcc, 0x3a, 0x41, 0x96, 0xb6, 0xcf, 0x23, 0xf6,
+- 0xc4, 0xf5, 0x16, 0xe4, 0x31, 0xf9, 0xdf, 0xd4, 0x6d, 0x1b, 0xfe, 0x92,
+- 0x9a, 0xed, 0x81, 0x3e, 0x33, 0xc3, 0x58, 0x83, 0xef, 0x71, 0xd8, 0x9a,
+- 0x52, 0x22, 0x1e, 0x8a, 0x95, 0x5f, 0xb5, 0xb2, 0x41, 0x6d, 0x9f, 0x6a,
+- 0x19, 0xc1, 0x76, 0x4b, 0xf2, 0xe8, 0xbb, 0x60, 0x64, 0x66, 0xa1, 0x79,
+- 0x4b, 0xc9, 0x8d, 0xaf, 0x2b, 0x1a, 0x4e, 0x9c, 0x2f, 0x09, 0x75, 0x86,
+- 0x1d, 0xa0, 0x4c, 0xbb, 0x92, 0xae, 0xb7, 0x16, 0xaa, 0x94, 0xc1, 0xc3,
+- 0x52, 0xac, 0x0d, 0x97, 0x6c, 0x94, 0xa7, 0xeb, 0x31, 0x39, 0x5d, 0xe1,
+- 0x3c, 0xfb, 0xd1, 0xc7, 0x45, 0x1d, 0x18, 0x6b, 0x90, 0xf2, 0x98, 0x6b,
+- 0xbe, 0x6e, 0xe9, 0x35, 0xb1, 0x07, 0x77, 0xcb, 0xfa, 0x44, 0xf3, 0x9a,
+- 0x55, 0xac, 0xd3, 0x4e, 0x42, 0x7d, 0xb3, 0x53, 0x66, 0xfb, 0xf2, 0xfa,
+- 0x79, 0xac, 0x5d, 0xc0, 0x7a, 0x59, 0x25, 0xb3, 0xba, 0x21, 0xf7, 0x7e,
+- 0x52, 0xf9, 0x72, 0xab, 0x5c, 0x1d, 0x95, 0x8b, 0x9b, 0x71, 0x39, 0x52,
+- 0x19, 0x97, 0x8d, 0x4d, 0x4f, 0x0a, 0x95, 0xb4, 0xac, 0xa3, 0x4f, 0xbe,
+- 0x92, 0x91, 0xb5, 0xcd, 0x63, 0xea, 0xac, 0x2f, 0x42, 0x2e, 0x6d, 0xa0,
+- 0x4f, 0x63, 0x73, 0x12, 0x3f, 0xdf, 0x1e, 0x88, 0xa1, 0xdf, 0x10, 0xfa,
+- 0x88, 0xf5, 0xb3, 0xca, 0x3d, 0xc0, 0x21, 0xe6, 0xae, 0xfa, 0xb6, 0xc1,
+- 0xb8, 0x2c, 0x54, 0x79, 0x4e, 0x2f, 0x4c, 0x6f, 0xac, 0xc4, 0xb2, 0xd4,
+- 0x77, 0xa7, 0x9b, 0xc3, 0xe0, 0x53, 0xe8, 0xef, 0x2a, 0x65, 0x42, 0x50,
+- 0x8a, 0x90, 0xb5, 0x0d, 0xc0, 0x46, 0x58, 0x1b, 0xb0, 0xdf, 0x8b, 0xcd,
+- 0x21, 0x94, 0x0e, 0x4a, 0xac, 0x03, 0xd8, 0x8b, 0x4d, 0x17, 0x65, 0x0c,
+- 0xa5, 0xd6, 0xed, 0x27, 0x9b, 0x9c, 0x3f, 0xab, 0x74, 0x90, 0xc6, 0xf1,
+- 0xd4, 0x1d, 0xb6, 0x7a, 0xc0, 0x5b, 0xb4, 0x8a, 0x2b, 0x62, 0xe7, 0xd2,
+- 0x21, 0xfa, 0x0b, 0x90, 0x2b, 0x37, 0x0f, 0x68, 0x58, 0x3e, 0x1b, 0xa0,
+- 0xdc, 0x09, 0xba, 0xe7, 0x81, 0xaf, 0x5e, 0xc9, 0x06, 0x69, 0x73, 0xf1,
+- 0x59, 0x5a, 0x01, 0xcf, 0xa5, 0xad, 0x12, 0x0c, 0x50, 0x5f, 0x45, 0xd9,
+- 0xa7, 0xde, 0xa2, 0x5c, 0xca, 0xd5, 0xb4, 0x6d, 0x5e, 0x6a, 0xdb, 0xe6,
+- 0xeb, 0xa8, 0xb7, 0x20, 0x3b, 0xe0, 0x9b, 0xd4, 0x79, 0x1e, 0x03, 0x98,
+- 0x33, 0x6b, 0x15, 0x2a, 0xfe, 0x79, 0xd6, 0x5b, 0x4f, 0x54, 0x69, 0xaf,
+- 0xd1, 0x6e, 0x53, 0xf2, 0x49, 0x92, 0xcb, 0x71, 0x23, 0x83, 0x23, 0x8a,
+- 0x37, 0x88, 0x83, 0xe4, 0x72, 0xda, 0xd4, 0x75, 0x77, 0xd4, 0xf9, 0xb2,
+- 0xfa, 0x73, 0x80, 0x61, 0x48, 0x9d, 0xad, 0xed, 0x4d, 0x59, 0x39, 0x65,
+- 0x2b, 0xb6, 0x5a, 0x79, 0x37, 0x24, 0xc5, 0xf1, 0x3f, 0xc2, 0x9e, 0xd8,
+- 0x56, 0x72, 0x40, 0x5a, 0xe0, 0xbb, 0xca, 0x07, 0xe6, 0xdc, 0x84, 0xb2,
+- 0xb3, 0x72, 0x15, 0xf8, 0x38, 0x5a, 0xd5, 0x95, 0xfa, 0xa1, 0x87, 0xdc,
+- 0x25, 0xd2, 0x53, 0xbd, 0xb5, 0x0c, 0x9c, 0xce, 0x2c, 0x15, 0xac, 0xe4,
+- 0x12, 0xe8, 0x63, 0x10, 0xb6, 0x87, 0x1b, 0x91, 0xdc, 0x65, 0xd2, 0x11,
+- 0xfb, 0xb0, 0xbe, 0x4b, 0x66, 0xa2, 0xbb, 0x6d, 0x9b, 0x87, 0x0e, 0x68,
+- 0x9d, 0x8f, 0xbe, 0x4b, 0x70, 0xe6, 0x7a, 0xb5, 0x9f, 0x92, 0x5c, 0xa5,
+- 0x9c, 0x2d, 0x40, 0xd7, 0x53, 0xe7, 0xf4, 0xc0, 0x9e, 0x61, 0x3d, 0xe7,
+- 0x44, 0xdb, 0xc5, 0xac, 0x05, 0xfd, 0x66, 0x97, 0x95, 0x8d, 0x3e, 0x89,
+- 0xf2, 0xde, 0x20, 0x6d, 0x5b, 0xea, 0x90, 0xe4, 0xaa, 0x3f, 0x47, 0x27,
+- 0x3e, 0xf6, 0x29, 0x9d, 0x34, 0xe0, 0x0d, 0xa8, 0x79, 0x61, 0x97, 0x58,
+- 0x73, 0x6a, 0xde, 0x58, 0xc7, 0xbc, 0x68, 0xbb, 0xf8, 0xb7, 0x01, 0x3d,
+- 0x0f, 0xf0, 0xac, 0xf6, 0xc4, 0x36, 0x8e, 0x29, 0x58, 0x79, 0xd8, 0x4e,
+- 0x33, 0x69, 0x5b, 0x02, 0x83, 0x7e, 0x5f, 0xbd, 0xaf, 0x02, 0xf6, 0x95,
+- 0xc3, 0xbe, 0xec, 0xc1, 0xdd, 0xfb, 0x2a, 0x05, 0xf4, 0xbe, 0x06, 0x3a,
+- 0x60, 0x8a, 0xee, 0x5a, 0xbf, 0x73, 0x5f, 0x68, 0xbb, 0xb8, 0x7b, 0x8e,
+- 0xc7, 0x06, 0xf4, 0x1c, 0xd1, 0x8e, 0x39, 0x06, 0x77, 0xcd, 0x01, 0x7a,
+- 0x8e, 0x72, 0xfc, 0xe0, 0x1e, 0xe3, 0x5f, 0xef, 0xd5, 0xe3, 0x39, 0xa6,
+- 0x0b, 0x7a, 0x58, 0x9d, 0x75, 0x58, 0xc9, 0xd4, 0xb6, 0xad, 0x76, 0x1a,
+- 0x3a, 0xaf, 0x73, 0xcc, 0x9d, 0x76, 0xa6, 0xad, 0xec, 0xcc, 0x3b, 0xe8,
+- 0xcc, 0x7a, 0x14, 0x3e, 0x73, 0x6a, 0x19, 0xbe, 0x73, 0xe5, 0xed, 0x58,
+- 0xf7, 0xcf, 0xe0, 0x87, 0x42, 0x16, 0x8d, 0xd2, 0x2f, 0x98, 0x14, 0xe5,
+- 0x97, 0x8e, 0xc2, 0xff, 0x75, 0xf6, 0x29, 0x5b, 0xb4, 0x38, 0x3a, 0xee,
+- 0xfb, 0x0b, 0xd6, 0x2c, 0xe4, 0x46, 0x71, 0x14, 0x36, 0x7d, 0x14, 0xf8,
+- 0x72, 0x47, 0x30, 0x8e, 0xf0, 0xbc, 0x3b, 0x44, 0x9f, 0xf5, 0x99, 0xea,
+- 0x2c, 0xde, 0xf7, 0xa1, 0xfd, 0xe7, 0x06, 0xce, 0x3e, 0xf4, 0xf9, 0x57,
+- 0xa8, 0x63, 0x1b, 0xfb, 0x70, 0x8a, 0x1f, 0xe0, 0xfd, 0x41, 0xf4, 0x01,
+- 0x4f, 0x81, 0x53, 0x6c, 0xf7, 0x30, 0x7e, 0x2f, 0xa3, 0xee, 0xdd, 0xa8,
+- 0xbb, 0x8e, 0xba, 0x43, 0x78, 0xff, 0xe1, 0xae, 0x79, 0xdf, 0x81, 0xf7,
+- 0xcf, 0xa1, 0x1d, 0xfb, 0x77, 0x5e, 0x44, 0xfb, 0x83, 0xf8, 0xfd, 0xc5,
+- 0xae, 0x3e, 0x8d, 0x5d, 0xef, 0xbe, 0xbc, 0x79, 0xc9, 0xf0, 0xc0, 0x8e,
+- 0x6f, 0x07, 0xfe, 0xb1, 0xa8, 0x8f, 0x0a, 0x15, 0xca, 0x9b, 0xb0, 0x3c,
+- 0xb2, 0xe2, 0xcb, 0x1c, 0x91, 0x79, 0xc8, 0xfa, 0x42, 0x45, 0xbc, 0x6e,
+- 0x19, 0x9e, 0xfc, 0x31, 0x64, 0xfa, 0x3c, 0xf0, 0x5a, 0x80, 0x7d, 0x71,
+- 0x74, 0x25, 0x8c, 0xe7, 0x21, 0xc8, 0x3b, 0xc9, 0x74, 0x09, 0x79, 0x3e,
+- 0x02, 0xd9, 0xd2, 0x0b, 0x9e, 0x57, 0x3e, 0x88, 0x3c, 0x0e, 0xb9, 0x34,
+- 0x8b, 0xbe, 0xb3, 0xe8, 0xf3, 0xd1, 0xe6, 0xff, 0x31, 0xb4, 0xec, 0xc3,
+- 0xf0, 0xec, 0x2e, 0x18, 0xc2, 0xe2, 0xae, 0x92, 0x1f, 0x5f, 0x98, 0x9e,
+- 0x5b, 0x89, 0xc8, 0xf0, 0xaa, 0x9d, 0xa4, 0xb3, 0x3f, 0xb2, 0xca, 0x98,
+- 0x84, 0x8c, 0x04, 0x85, 0xb2, 0x5f, 0xc6, 0x43, 0xb0, 0xd1, 0x02, 0xde,
+- 0x30, 0x74, 0x94, 0x7a, 0x97, 0x2c, 0x60, 0xcb, 0x36, 0x77, 0x62, 0x13,
+- 0x47, 0xda, 0xb1, 0x89, 0x21, 0xe8, 0x88, 0xd7, 0x83, 0x5a, 0x5e, 0x45,
+- 0x40, 0x27, 0x6f, 0x01, 0xfe, 0x29, 0x5b, 0x42, 0xe0, 0x1f, 0x07, 0xbc,
+- 0xf3, 0x26, 0xda, 0x6f, 0xd4, 0x5b, 0xa0, 0x77, 0xc8, 0x38, 0x9b, 0xf5,
+- 0x2c, 0xd1, 0x96, 0x21, 0x0f, 0xe0, 0xbd, 0xd1, 0xc9, 0x6b, 0xe7, 0xb4,
+- 0x8d, 0x75, 0x97, 0x6f, 0xf3, 0xa0, 0xa3, 0x69, 0x91, 0xf6, 0xfa, 0xe1,
+- 0xd0, 0x9d, 0x7b, 0xfc, 0xa3, 0x5d, 0x7b, 0x0c, 0x4a, 0x72, 0x89, 0xf8,
+- 0x8d, 0xa8, 0xbd, 0xfa, 0xf8, 0x2d, 0x2a, 0x5b, 0x7e, 0x1c, 0x3e, 0x89,
+- 0x40, 0x9a, 0x2b, 0x5b, 0x14, 0x3a, 0xb1, 0x0f, 0xb2, 0x9e, 0x72, 0x9e,
+- 0xf8, 0x0e, 0x03, 0x87, 0x11, 0xfc, 0x1c, 0xfc, 0x76, 0x70, 0x7a, 0xb2,
+- 0xbd, 0x3f, 0x7f, 0x0f, 0xeb, 0x90, 0x55, 0x2c, 0x09, 0x3f, 0xf0, 0x71,
+- 0x91, 0xcf, 0x90, 0xaf, 0x7d, 0x94, 0xb7, 0x3e, 0x4c, 0x8f, 0xed, 0x82,
+- 0x89, 0xb8, 0x21, 0x4c, 0xf5, 0x16, 0x6c, 0x8b, 0x28, 0xa3, 0x60, 0xa7,
+- 0x9b, 0xd4, 0x29, 0x5c, 0x73, 0x92, 0xf6, 0xb6, 0x81, 0x93, 0x7a, 0xc5,
+- 0x93, 0x73, 0x95, 0xb7, 0x1b, 0xb8, 0x78, 0xbe, 0xb0, 0xf9, 0x96, 0xb8,
+- 0x7e, 0x54, 0xe9, 0x1e, 0x0d, 0xd3, 0x6e, 0xfc, 0xd0, 0x3f, 0x27, 0x7e,
+- 0xa8, 0x0f, 0x88, 0x4b, 0xda, 0xd4, 0xc4, 0xe7, 0xef, 0x00, 0x9f, 0xec,
+- 0xeb, 0x1a, 0xdd, 0xf2, 0x2e, 0x03, 0xd7, 0xdd, 0xfa, 0xf8, 0xf4, 0x1d,
+- 0xfa, 0xd8, 0xc7, 0xf1, 0x5e, 0x67, 0xf1, 0xfb, 0x7d, 0xbe, 0xcc, 0x1d,
+- 0x5e, 0xdd, 0xab, 0x7d, 0xd9, 0xb4, 0xb3, 0xad, 0xb3, 0xfe, 0xdb, 0x7d,
+- 0xfe, 0x19, 0x0e, 0x2f, 0xef, 0x6e, 0xeb, 0x3b, 0xb0, 0x33, 0x66, 0xf7,
+- 0x7c, 0x3f, 0xee, 0xdb, 0xdb, 0xaf, 0xdd, 0xf1, 0xeb, 0xe0, 0xab, 0xd8,
+- 0x3b, 0x7b, 0xc9, 0xda, 0xf3, 0xcd, 0x82, 0xad, 0xf7, 0xc2, 0x3e, 0x68,
+- 0x6b, 0x6e, 0xf5, 0x07, 0x95, 0x6e, 0xcc, 0xda, 0xf4, 0x63, 0x4a, 0x6b,
+- 0x7c, 0xbe, 0x07, 0x65, 0xe7, 0xd8, 0x21, 0xf0, 0x40, 0x16, 0x7d, 0x39,
+- 0xc7, 0xee, 0xf1, 0xbe, 0x8d, 0x94, 0x96, 0x85, 0x5a, 0x08, 0xed, 0x89,
+- 0x6c, 0x49, 0x1e, 0x86, 0xaf, 0x98, 0x98, 0xa2, 0xdf, 0x00, 0x7f, 0x79,
+- 0x46, 0xe4, 0x98, 0x94, 0x6b, 0x1f, 0x94, 0x85, 0x95, 0x96, 0xbc, 0x1f,
+- 0x7a, 0xf0, 0xf7, 0xa0, 0x47, 0xe5, 0x12, 0x84, 0xd7, 0x25, 0x1c, 0xc6,
+- 0xa5, 0xa8, 0xd8, 0x4f, 0xc1, 0x96, 0xbf, 0x10, 0x93, 0xe0, 0x05, 0xd2,
+- 0x5e, 0xca, 0x79, 0xbf, 0x48, 0xbf, 0x2d, 0x57, 0xe1, 0x08, 0x25, 0x26,
+- 0xb3, 0x92, 0x82, 0xfd, 0x37, 0xe6, 0x34, 0x50, 0x96, 0x25, 0x35, 0xfa,
+- 0xb4, 0xa0, 0xef, 0x25, 0xf4, 0xc5, 0xb8, 0x9e, 0x8d, 0x38, 0x7e, 0x83,
+- 0xd2, 0xbb, 0x41, 0x18, 0x92, 0xa6, 0x24, 0x2c, 0x3f, 0x6c, 0xd1, 0xd7,
+- 0x7d, 0x66, 0x33, 0x0c, 0xdd, 0x14, 0x97, 0xe7, 0x20, 0x67, 0x9f, 0x55,
+- 0xf1, 0x17, 0xb7, 0xed, 0x8f, 0x3e, 0x7a, 0x18, 0x74, 0xb7, 0x2c, 0xe1,
+- 0xa8, 0xf7, 0x73, 0x59, 0x59, 0x6e, 0xc1, 0xef, 0xa1, 0xac, 0x7f, 0x00,
+- 0xf2, 0x2a, 0xf1, 0xa5, 0x12, 0x6d, 0x49, 0x37, 0x03, 0xd8, 0x4b, 0x32,
+- 0x73, 0xf8, 0x5d, 0x03, 0x9a, 0x3e, 0x8e, 0x49, 0x70, 0xb9, 0x00, 0xfb,
+- 0xf9, 0x8c, 0x2c, 0xa6, 0xe1, 0x9f, 0xda, 0xa5, 0x56, 0xc0, 0x75, 0x63,
+- 0xd0, 0xdb, 0xd0, 0xa7, 0x2b, 0xf4, 0x87, 0xe5, 0xc8, 0x32, 0xfb, 0x9c,
+- 0x01, 0x6d, 0x75, 0x01, 0x77, 0xdd, 0x72, 0x36, 0x9a, 0x28, 0xe5, 0xc1,
+- 0x4f, 0xb6, 0xdb, 0x0f, 0x5e, 0x66, 0x49, 0xfd, 0xf6, 0x34, 0xe8, 0x87,
+- 0xcf, 0x38, 0xce, 0x55, 0xd6, 0x27, 0x51, 0xb2, 0xde, 0x15, 0x7b, 0x29,
+- 0x8c, 0xb9, 0xa0, 0x93, 0x2e, 0x97, 0xe4, 0x6c, 0xe6, 0x98, 0x34, 0x6a,
+- 0xf0, 0xc9, 0x33, 0xb0, 0xa3, 0xea, 0x9e, 0x34, 0x2a, 0xb4, 0x9f, 0x4e,
+- 0x81, 0x1f, 0x5e, 0x41, 0x39, 0x8f, 0xf2, 0x16, 0xca, 0x8f, 0xa3, 0x7c,
+- 0x0d, 0x25, 0x61, 0x3f, 0x25, 0x8d, 0xfa, 0x55, 0xcc, 0xcd, 0x39, 0xa6,
+- 0x0c, 0xcc, 0xf0, 0x21, 0x0f, 0x9f, 0x82, 0x9d, 0xe3, 0xd7, 0x9f, 0x12,
+- 0x69, 0x7c, 0x0c, 0xbf, 0x96, 0x7a, 0xa7, 0x8f, 0xb9, 0x90, 0x99, 0x84,
+- 0xbd, 0x2b, 0xd6, 0xd9, 0xcc, 0xc7, 0xcd, 0x3c, 0x1f, 0xc3, 0x7a, 0xd7,
+- 0xb1, 0x76, 0x18, 0xe7, 0xd9, 0x92, 0x47, 0xd3, 0x67, 0xe4, 0x93, 0xe9,
+- 0x7b, 0x65, 0x62, 0x20, 0x5c, 0x0a, 0x7b, 0xdc, 0x3f, 0xed, 0xda, 0xbd,
+- 0xf6, 0xef, 0xef, 0x9b, 0x7b, 0x8e, 0x60, 0x2f, 0xfb, 0xb5, 0xed, 0x66,
+- 0xff, 0x13, 0xe3, 0x73, 0x58, 0x92, 0x1c, 0xe1, 0x7c, 0x9e, 0x04, 0x96,
+- 0x47, 0x9c, 0x8c, 0x3d, 0x06, 0xeb, 0x3d, 0x85, 0xdf, 0x19, 0xd0, 0x8a,
+- 0x7b, 0x3e, 0x69, 0xff, 0x47, 0xc0, 0x84, 0xb6, 0x06, 0xd7, 0x11, 0x2b,
+- 0x78, 0xe8, 0x26, 0xf6, 0x56, 0x92, 0xee, 0x43, 0x9e, 0xdc, 0x6e, 0xf2,
+- 0x19, 0x92, 0xf2, 0xd2, 0x31, 0xf9, 0x71, 0xed, 0xba, 0x9c, 0xab, 0x1d,
+- 0x93, 0x97, 0x51, 0x2e, 0xd6, 0x4a, 0xc0, 0x23, 0x7d, 0x46, 0xce, 0xd1,
+- 0xc2, 0xb9, 0x50, 0x2e, 0xdf, 0x1f, 0x9b, 0xc7, 0xf9, 0xcd, 0x3a, 0x2d,
+- 0xd9, 0x48, 0x97, 0x64, 0x63, 0x12, 0x63, 0xea, 0x3d, 0x12, 0xfa, 0x2a,
+- 0xf7, 0xdb, 0x27, 0xf9, 0x5a, 0x49, 0x0a, 0x19, 0xfa, 0x34, 0xbd, 0x92,
+- 0x87, 0x4d, 0x0e, 0x3b, 0xe8, 0x8c, 0x8e, 0xb3, 0xb9, 0xb1, 0x22, 0x6c,
+- 0xf8, 0x85, 0xe6, 0xeb, 0x56, 0xa3, 0x6d, 0xff, 0x6f, 0x59, 0xcf, 0xc2,
+- 0x76, 0xfd, 0x0e, 0xe4, 0xc6, 0x73, 0xb0, 0x09, 0x9f, 0xbd, 0x83, 0xc7,
+- 0x48, 0x23, 0xd7, 0xac, 0x46, 0x7d, 0x94, 0x7c, 0x66, 0xf8, 0x01, 0x63,
+- 0xe1, 0xe7, 0x34, 0x6a, 0xb7, 0x0c, 0xfd, 0x29, 0x5b, 0x00, 0xe7, 0x42,
+- 0xbd, 0xf2, 0x77, 0xf0, 0xaf, 0x28, 0x77, 0x7c, 0xbd, 0xaf, 0xfd, 0x86,
+- 0x3a, 0x60, 0xcd, 0x47, 0x13, 0x80, 0x4a, 0xa4, 0x5e, 0x2f, 0x28, 0x5c,
+- 0xb9, 0xcb, 0x43, 0x52, 0xab, 0x12, 0xbf, 0x09, 0xc7, 0xb6, 0x95, 0x5d,
+- 0x0b, 0xbc, 0xba, 0x38, 0x1f, 0xbf, 0x3d, 0x01, 0xff, 0xe1, 0x8c, 0x38,
+- 0x13, 0xbd, 0xd8, 0x13, 0x9f, 0x45, 0x66, 0x2e, 0xff, 0x3a, 0x19, 0xd0,
+- 0x05, 0xbf, 0x3e, 0x84, 0xb3, 0x8c, 0xc8, 0x59, 0xd8, 0xff, 0xe7, 0x40,
+- 0x47, 0x9f, 0xaf, 0x0c, 0xc9, 0xf9, 0x4a, 0x1c, 0xfe, 0x16, 0xed, 0x94,
+- 0xe5, 0xe9, 0xe4, 0x3a, 0xcb, 0x27, 0xa6, 0x53, 0x75, 0x96, 0x5f, 0x32,
+- 0xfe, 0xe2, 0x97, 0x8d, 0x1f, 0xb9, 0x3e, 0xad, 0x7d, 0xb8, 0xaf, 0x4d,
+- 0x8f, 0xaa, 0xb2, 0x39, 0xbd, 0x13, 0x3b, 0x09, 0x1b, 0xbd, 0x9d, 0xa1,
+- 0x7e, 0x06, 0x8c, 0x12, 0x3c, 0x09, 0x7a, 0x9a, 0x87, 0xdc, 0xce, 0xc1,
+- 0xf7, 0x38, 0x0b, 0x1f, 0xa4, 0xd8, 0x84, 0x4c, 0xf0, 0xd2, 0x28, 0xc5,
+- 0xfc, 0xf9, 0x63, 0xbb, 0x18, 0xdf, 0xe4, 0x99, 0x19, 0xff, 0x2b, 0x4d,
+- 0xff, 0xab, 0xf3, 0x8f, 0xf3, 0x81, 0x36, 0xa9, 0x2b, 0x7f, 0x09, 0x9f,
+- 0x51, 0x82, 0xc5, 0x0c, 0xc7, 0xa6, 0xe9, 0xaf, 0xca, 0x36, 0xec, 0x83,
+- 0xb0, 0xf7, 0x3d, 0x09, 0x3f, 0xd5, 0x6a, 0xbd, 0x0a, 0x59, 0x53, 0x82,
+- 0xcf, 0x68, 0x5b, 0xa8, 0x5f, 0x67, 0x1b, 0xe5, 0xc8, 0x98, 0x73, 0x1b,
+- 0x34, 0x97, 0x3d, 0x2e, 0xf2, 0x5d, 0xd4, 0x35, 0x56, 0x78, 0x06, 0xdf,
+- 0xc7, 0x19, 0x98, 0x33, 0x51, 0x75, 0xec, 0x07, 0xfb, 0x3d, 0xca, 0x7d,
+- 0x8c, 0x39, 0xdd, 0x18, 0x5f, 0x5f, 0xe7, 0x98, 0xc4, 0x24, 0xaf, 0x74,
+- 0xbe, 0xbb, 0xae, 0xf7, 0x77, 0x34, 0x33, 0x2a, 0x57, 0x2b, 0x6a, 0x0e,
+- 0xd0, 0xfa, 0xaf, 0x30, 0x66, 0x0b, 0x74, 0xcb, 0x18, 0x95, 0x27, 0x65,
+- 0xe8, 0xa4, 0x72, 0x25, 0x05, 0xda, 0x09, 0xca, 0x6c, 0x8c, 0x60, 0xbb,
+- 0xb2, 0x5d, 0xf9, 0x72, 0x97, 0x8e, 0x8f, 0xf0, 0x19, 0x3a, 0xac, 0x39,
+- 0x23, 0xbc, 0x1b, 0x81, 0x7d, 0x83, 0x3d, 0x75, 0xe2, 0x42, 0xff, 0x15,
+- 0x71, 0x16, 0x66, 0x8f, 0xea, 0x4f, 0xaf, 0x83, 0xf1, 0x66, 0x9d, 0x02,
+- 0x14, 0x77, 0x1e, 0xeb, 0xa7, 0x2e, 0x05, 0x83, 0x8c, 0xa9, 0x27, 0x2f,
+- 0x81, 0xad, 0x3c, 0x83, 0x8b, 0xa6, 0x4f, 0x6b, 0xbe, 0x2f, 0x4a, 0xda,
+- 0x22, 0x0e, 0x12, 0xa5, 0x2d, 0x20, 0x7b, 0xc0, 0xbb, 0x21, 0x1f, 0x5a,
+- 0xd5, 0x7b, 0xb6, 0x2f, 0x0a, 0xef, 0x5b, 0xe4, 0xf6, 0x4a, 0x22, 0x7d,
+- 0x0b, 0xb2, 0x39, 0x1f, 0x4d, 0x83, 0x56, 0x3e, 0xd1, 0x05, 0x9e, 0x9e,
+- 0xcc, 0xda, 0x3f, 0xe8, 0xd2, 0xb6, 0x20, 0x7c, 0x7e, 0xc6, 0x01, 0x2a,
+- 0x59, 0x8c, 0xe9, 0x96, 0x7f, 0x11, 0xc4, 0x73, 0x93, 0xef, 0xb0, 0x73,
+- 0x82, 0x1a, 0xbe, 0xb2, 0xc1, 0x21, 0xfc, 0x04, 0xd1, 0xb1, 0x5c, 0x4b,
+- 0x3e, 0x04, 0x29, 0x2f, 0x98, 0x3f, 0x69, 0xd6, 0x4a, 0x5e, 0x0c, 0xb7,
+- 0x6d, 0xba, 0xd4, 0xaa, 0x07, 0xdb, 0x22, 0x68, 0x7c, 0x22, 0xca, 0x18,
+- 0xd9, 0xc3, 0xa6, 0xee, 0xb4, 0x8f, 0xc3, 0x2a, 0x5e, 0xc7, 0x7b, 0x24,
+- 0xd2, 0xd6, 0x94, 0xa1, 0xad, 0x8f, 0x81, 0xb6, 0x4e, 0x29, 0xda, 0x6a,
+- 0xc9, 0xab, 0xe9, 0xb4, 0x7c, 0x61, 0x4f, 0xfa, 0xda, 0xfd, 0x17, 0x01,
+- 0xbc, 0xfc, 0x0d, 0xca, 0xc2, 0x17, 0xb1, 0x2e, 0xf4, 0x4e, 0xb9, 0x92,
+- 0xc8, 0xce, 0xd2, 0x16, 0x82, 0x1e, 0x29, 0xc3, 0xe7, 0x4a, 0x5e, 0x1a,
+- 0x52, 0x7d, 0x92, 0xd0, 0x29, 0x0d, 0xd0, 0x1b, 0xf1, 0x5b, 0xae, 0x40,
+- 0x0e, 0x5f, 0x0a, 0x41, 0x6f, 0x91, 0x67, 0x65, 0xc0, 0x86, 0x6c, 0x60,
+- 0xff, 0x06, 0x78, 0x27, 0x79, 0x29, 0x82, 0x32, 0xae, 0xe6, 0x6a, 0x54,
+- 0x5c, 0x35, 0xbe, 0x51, 0x19, 0x55, 0xe3, 0x1a, 0xb0, 0x5f, 0x93, 0x97,
+- 0x20, 0xdf, 0x33, 0x69, 0x19, 0xb9, 0x94, 0x91, 0xf8, 0x25, 0x4b, 0x8a,
+- 0x33, 0xad, 0x56, 0x18, 0xb0, 0x8f, 0x5e, 0xea, 0x97, 0x5b, 0x2a, 0xb6,
+- 0x1a, 0x56, 0xf1, 0xd6, 0xc5, 0xcc, 0x0c, 0x78, 0x93, 0xf8, 0xf3, 0x30,
+- 0xa6, 0x00, 0xfd, 0x58, 0x90, 0xb3, 0x2b, 0xc4, 0x0f, 0xe3, 0xe5, 0xdb,
+- 0xb1, 0x80, 0x24, 0x20, 0xcb, 0x8e, 0xcb, 0x7c, 0xad, 0x1b, 0xb2, 0x2c,
+- 0x08, 0x1d, 0xf8, 0x50, 0xb7, 0xf4, 0x0e, 0x93, 0x1e, 0x80, 0x17, 0x0f,
+- 0x73, 0x17, 0x24, 0x8f, 0x31, 0x85, 0x95, 0x9d, 0xfe, 0x45, 0xe9, 0x06,
+- 0x4f, 0x1d, 0x97, 0x93, 0x35, 0xce, 0x13, 0x74, 0xca, 0x72, 0x10, 0x34,
+- 0xe4, 0x3a, 0x47, 0x30, 0x0f, 0xf4, 0x76, 0xc7, 0x1f, 0xf9, 0x2f, 0xfb,
+- 0x06, 0x34, 0xe9, 0xf3, 0x5d, 0xb8, 0xd4, 0xe5, 0xcd, 0x58, 0xdb, 0x19,
+- 0x09, 0xce, 0x65, 0x3e, 0x60, 0x7d, 0x37, 0x93, 0xb1, 0xae, 0x65, 0xb2,
+- 0xd6, 0xf5, 0x4c, 0xc1, 0xba, 0x01, 0xdd, 0xd4, 0xd8, 0x7c, 0x0e, 0xf4,
+- 0x03, 0xdd, 0xcf, 0x98, 0x79, 0xfb, 0x0c, 0xa3, 0x26, 0x66, 0xf0, 0x9a,
+- 0x6c, 0x54, 0x68, 0x3b, 0xb4, 0x1e, 0x9e, 0x4b, 0x97, 0xee, 0x01, 0x7c,
+- 0x80, 0x83, 0xbe, 0xee, 0x8e, 0xee, 0x08, 0x79, 0xa3, 0xb2, 0xa6, 0x74,
+- 0x47, 0x84, 0xba, 0x23, 0x9d, 0x97, 0xfd, 0xb2, 0x5d, 0x03, 0xff, 0x89,
+- 0xb2, 0x83, 0x65, 0xbb, 0x1e, 0x95, 0x2f, 0x54, 0x7d, 0x5a, 0xe2, 0x7e,
+- 0xcb, 0x6f, 0xea, 0x91, 0x80, 0x4c, 0x29, 0x7d, 0xdd, 0x27, 0x57, 0xd7,
+- 0xe1, 0x0f, 0xc1, 0x5a, 0xb0, 0xef, 0x63, 0xac, 0xc0, 0x56, 0xbe, 0xb1,
+- 0xf4, 0xf3, 0xee, 0xea, 0x2c, 0x70, 0xc5, 0xfb, 0x25, 0xec, 0xb3, 0x9f,
+- 0x3b, 0xf2, 0xdf, 0xc7, 0xc1, 0x93, 0x7c, 0xb6, 0x24, 0x0f, 0xbb, 0x91,
+- 0xf7, 0x5c, 0x79, 0xd8, 0x3d, 0xdb, 0x95, 0x31, 0xc0, 0x15, 0x80, 0x4d,
+- 0x1e, 0x06, 0x1c, 0x55, 0xd5, 0xde, 0xed, 0x8a, 0x35, 0x07, 0x3d, 0x5c,
+- 0x54, 0xf7, 0x57, 0x28, 0xd7, 0xf5, 0xda, 0x79, 0xf8, 0xab, 0xc5, 0xf1,
+- 0x1e, 0xea, 0xb7, 0xd1, 0x12, 0xf9, 0x5e, 0xd9, 0xf1, 0x19, 0xf0, 0xdc,
+- 0x57, 0xba, 0xa9, 0xdb, 0x8f, 0xa6, 0x27, 0xe5, 0x46, 0x85, 0xcf, 0x6c,
+- 0x4f, 0xa4, 0x45, 0xc5, 0x8f, 0x2b, 0xd3, 0x8b, 0xee, 0x6b, 0x86, 0xc7,
+- 0x6a, 0xa0, 0xf1, 0x53, 0xf2, 0x8d, 0xcd, 0x79, 0xf9, 0xf7, 0x9b, 0xb3,
+- 0xb0, 0x4f, 0x4e, 0xc0, 0x3e, 0xf9, 0x08, 0x78, 0xf8, 0x38, 0x78, 0xf8,
+- 0xe3, 0xa0, 0xfb, 0x19, 0x15, 0x77, 0xa8, 0x55, 0x12, 0x57, 0x4a, 0x2a,
+- 0xce, 0xfd, 0x1a, 0x68, 0x7e, 0x42, 0x82, 0xab, 0x43, 0xc0, 0x6b, 0xa9,
+- 0x15, 0x75, 0x5b, 0x0f, 0xc3, 0x06, 0xc1, 0x59, 0x97, 0x12, 0x41, 0x45,
+- 0x23, 0xae, 0xf3, 0x69, 0xe0, 0xf2, 0x4d, 0x5e, 0xa2, 0xc6, 0x23, 0xde,
+- 0xa8, 0x8d, 0x4a, 0xf1, 0x32, 0xfa, 0x2f, 0x47, 0x80, 0x37, 0xea, 0xc6,
+- 0xc4, 0xf9, 0xa2, 0x6c, 0x81, 0x2e, 0xb2, 0xc0, 0xcf, 0x3b, 0xa4, 0x1c,
+- 0x4d, 0x7c, 0x4d, 0x64, 0x52, 0x0e, 0x2d, 0x81, 0xa6, 0x97, 0x6c, 0xec,
+- 0x99, 0xb8, 0xc4, 0xf3, 0x65, 0x4f, 0xec, 0x65, 0xca, 0xa2, 0x03, 0xc6,
+- 0x37, 0xd1, 0xfa, 0xbe, 0x2e, 0x5c, 0x97, 0xeb, 0x7d, 0x46, 0xe6, 0xa1,
+- 0x53, 0x61, 0x7f, 0x43, 0x66, 0xbb, 0x31, 0xac, 0x19, 0x9e, 0xbb, 0xec,
+- 0x84, 0xe7, 0x2f, 0x73, 0x9e, 0xb0, 0x04, 0x96, 0x78, 0xb6, 0x9c, 0x07,
+- 0x3c, 0x80, 0xb9, 0x53, 0x4b, 0xc4, 0xdb, 0x18, 0xc6, 0xfd, 0x63, 0xe8,
+- 0x63, 0x4d, 0x57, 0xb9, 0x65, 0x2d, 0x1f, 0x72, 0x8d, 0x4e, 0x9d, 0x88,
+- 0x33, 0x80, 0xfc, 0xc8, 0x36, 0xb4, 0x7e, 0x2b, 0x28, 0xfd, 0xa7, 0x75,
+- 0xdf, 0x71, 0x81, 0x51, 0xd7, 0xeb, 0xaa, 0xfd, 0x04, 0x96, 0xb7, 0xa8,
+- 0xef, 0xb1, 0x06, 0xc7, 0x84, 0x3a, 0xe0, 0xce, 0x40, 0xee, 0xdc, 0x1b,
+- 0x26, 0xee, 0x1f, 0x83, 0x7e, 0x4d, 0x2e, 0xe9, 0x98, 0x7c, 0xf2, 0x72,
+- 0x1a, 0xfb, 0x91, 0x41, 0x46, 0x17, 0x6c, 0xec, 0xe1, 0x7d, 0x4a, 0x7e,
+- 0x4d, 0x40, 0x66, 0x39, 0xb2, 0x7e, 0x90, 0x67, 0x33, 0x28, 0x8d, 0xa7,
+- 0xf9, 0xce, 0x33, 0xe2, 0x79, 0x93, 0x17, 0xa3, 0xd0, 0x2f, 0x38, 0xa7,
+- 0xbe, 0x21, 0xa9, 0x6f, 0xb2, 0x6d, 0x48, 0xd1, 0x72, 0x10, 0x67, 0xb0,
+- 0x58, 0x69, 0x3d, 0x9c, 0x4b, 0x97, 0x40, 0x6d, 0xc4, 0x39, 0xf1, 0x41,
+- 0xbc, 0x8f, 0x03, 0x36, 0xe2, 0xb8, 0x8f, 0xba, 0x18, 0x75, 0xfb, 0xa5,
+- 0x58, 0x23, 0x3d, 0xa3, 0xac, 0xef, 0x37, 0xbe, 0xde, 0x67, 0x78, 0x27,
+- 0x84, 0xbd, 0x6b, 0x3a, 0x2e, 0x80, 0xa6, 0xca, 0xf0, 0xbb, 0xae, 0x2e,
+- 0x49, 0xf8, 0x4d, 0x90, 0xcf, 0x9f, 0xa2, 0x0c, 0x05, 0x7d, 0x95, 0xd7,
+- 0x27, 0x40, 0x6b, 0x7d, 0x90, 0x97, 0xad, 0xd6, 0x71, 0xd8, 0xc9, 0xa7,
+- 0xd3, 0xc4, 0xd1, 0x4d, 0xe0, 0xa8, 0x3b, 0x76, 0x1a, 0xe7, 0xb5, 0xf6,
+- 0xf4, 0x43, 0x4a, 0x5e, 0xc0, 0xd6, 0x51, 0x7a, 0x4b, 0xc7, 0x38, 0xd2,
+- 0xb4, 0x8d, 0x14, 0x0f, 0xe7, 0x5c, 0xca, 0xc3, 0x3c, 0xf0, 0x30, 0xae,
+- 0xe4, 0xb7, 0x96, 0x2d, 0x3d, 0x52, 0x3c, 0x9e, 0xc5, 0x7e, 0x27, 0x77,
+- 0xf5, 0xcb, 0xe0, 0x1d, 0xb6, 0x5f, 0xf3, 0x43, 0x61, 0xc6, 0x43, 0x03,
+- 0xde, 0xa4, 0x6c, 0x1c, 0x9c, 0x92, 0x8b, 0x07, 0x13, 0x93, 0xb3, 0x36,
+- 0x75, 0xc2, 0x94, 0xd4, 0x9f, 0xce, 0xca, 0x5a, 0x55, 0xeb, 0xe6, 0x39,
+- 0x77, 0x52, 0xf2, 0xcd, 0x02, 0xde, 0x3d, 0x94, 0xec, 0xef, 0xcb, 0x5d,
+- 0x7f, 0x4f, 0x39, 0xee, 0x09, 0x32, 0x42, 0xeb, 0x5e, 0xdb, 0xee, 0xc6,
+- 0xf9, 0x50, 0x2e, 0x7c, 0x10, 0xf5, 0x39, 0xc8, 0x36, 0x9e, 0x67, 0x0a,
+- 0x67, 0x77, 0x4a, 0x9d, 0x53, 0x3e, 0x4d, 0x7f, 0x80, 0x63, 0x12, 0xb1,
+- 0x39, 0xd4, 0xcf, 0x08, 0x75, 0x28, 0xf7, 0xe6, 0xcf, 0xe7, 0x19, 0xf8,
+- 0x03, 0x8c, 0x31, 0xe1, 0xef, 0x33, 0x61, 0xf2, 0x64, 0xc0, 0xf5, 0xeb,
+- 0xc7, 0xa0, 0x7f, 0x43, 0x6a, 0x8d, 0x72, 0x95, 0x75, 0x29, 0x87, 0xe3,
+- 0xf3, 0x69, 0xbe, 0x8b, 0x3c, 0x66, 0xfc, 0xf2, 0xe3, 0xf0, 0x5b, 0xf3,
+- 0xcd, 0xae, 0xdf, 0xa0, 0x7f, 0x77, 0x64, 0x9d, 0x96, 0xcb, 0xdb, 0x31,
+- 0xc7, 0xc8, 0xde, 0x93, 0x35, 0xc6, 0xac, 0x2d, 0xe9, 0x82, 0x2c, 0x3d,
+- 0x2a, 0xc3, 0x46, 0x8e, 0x72, 0x3f, 0x7d, 0x4a, 0xd7, 0xe5, 0x67, 0x62,
+- 0x72, 0x6e, 0xed, 0xff, 0x85, 0xae, 0x7f, 0xbd, 0x5d, 0x57, 0xd8, 0xc3,
+- 0xae, 0xbb, 0x79, 0x19, 0xf2, 0xa0, 0x0a, 0x59, 0x51, 0x85, 0xac, 0xa8,
+- 0x42, 0x56, 0x54, 0x21, 0x2b, 0xaa, 0x90, 0x15, 0x55, 0xc8, 0x8a, 0xea,
+- 0x8c, 0xd1, 0x9b, 0xa7, 0x21, 0x73, 0xe9, 0xf3, 0xd0, 0xcf, 0xe9, 0xb4,
+- 0x05, 0xe2, 0x90, 0x25, 0xf4, 0x67, 0x12, 0xa5, 0x5b, 0xc0, 0xcd, 0xd7,
+- 0xd3, 0xf4, 0xb9, 0x5b, 0xf2, 0x57, 0xe9, 0xce, 0xdd, 0xab, 0xf8, 0x86,
+- 0x3c, 0x0a, 0x7c, 0x7d, 0x08, 0xf8, 0xfa, 0xf0, 0x5d, 0x39, 0x16, 0x7e,
+- 0x4c, 0x64, 0xb8, 0x14, 0x80, 0xff, 0x39, 0x73, 0x07, 0xee, 0xe8, 0x7b,
+- 0x63, 0x8d, 0xbb, 0x6c, 0x63, 0xfa, 0xdc, 0xa3, 0xea, 0xde, 0x7c, 0x03,
+- 0x76, 0xf9, 0x8d, 0x74, 0x29, 0x12, 0x50, 0xf7, 0x73, 0x2e, 0x69, 0x67,
+- 0x8f, 0xbf, 0x6f, 0x84, 0xb5, 0x5c, 0xd4, 0x67, 0x9f, 0xcf, 0xf4, 0x81,
+- 0x0f, 0x68, 0xdf, 0xdd, 0x50, 0xf6, 0xdd, 0xd1, 0x74, 0x50, 0xb6, 0xa2,
+- 0xd4, 0xa9, 0x3f, 0x92, 0x93, 0x2b, 0x91, 0x1e, 0xfa, 0xdf, 0x8b, 0xd5,
+- 0x83, 0xb2, 0xad, 0x64, 0xca, 0x07, 0xd1, 0xd7, 0x93, 0x79, 0xd0, 0xc4,
+- 0x11, 0xf8, 0x8e, 0x17, 0x65, 0x2c, 0x76, 0x11, 0x7b, 0xfd, 0x3c, 0xc6,
+- 0xc0, 0x07, 0x68, 0x15, 0x50, 0x77, 0x1d, 0x7e, 0xc6, 0x6d, 0xe1, 0xf3,
+- 0x98, 0x73, 0x1e, 0x88, 0xce, 0x3a, 0x29, 0xe7, 0x35, 0xf1, 0xe9, 0x8c,
+- 0x34, 0xc5, 0xbb, 0xb6, 0x41, 0xc9, 0xaf, 0xd3, 0x2f, 0xeb, 0x03, 0x1f,
+- 0xfe, 0x08, 0x7a, 0x98, 0x6b, 0x50, 0x2e, 0x70, 0x0f, 0xff, 0x0d, 0xf0,
+- 0xc5, 0x67, 0xbb, 0xbd, 0xfb, 0xa1, 0x7b, 0x29, 0xf7, 0xb5, 0xef, 0x94,
+- 0xc7, 0x18, 0xa5, 0x1b, 0xd2, 0xbc, 0x77, 0xe0, 0xfe, 0xfe, 0x18, 0x76,
+- 0x4e, 0x14, 0x74, 0x80, 0xfa, 0x75, 0xdf, 0xce, 0xf5, 0xed, 0x19, 0x1d,
+- 0xeb, 0xbb, 0xa2, 0x6c, 0x9a, 0x1c, 0xf4, 0xd8, 0x31, 0xf4, 0x65, 0xac,
+- 0xbd, 0xd5, 0x3a, 0x95, 0x86, 0xdf, 0xf1, 0x24, 0x65, 0xd9, 0x7d, 0xe0,
+- 0x69, 0xda, 0x45, 0xd4, 0xb9, 0x62, 0xdd, 0xcc, 0x6c, 0x3b, 0x61, 0xe8,
+- 0xcb, 0x19, 0xd0, 0x5c, 0x0e, 0x74, 0x18, 0x78, 0x60, 0x0a, 0xfa, 0x57,
+- 0xc5, 0x9c, 0x41, 0xeb, 0x5c, 0xf7, 0x83, 0xd6, 0x5f, 0x64, 0xc6, 0xa1,
+- 0x8f, 0x1f, 0x82, 0x3e, 0xe6, 0x7d, 0x74, 0x0e, 0x3a, 0x99, 0xfa, 0xd8,
+- 0x91, 0x3f, 0xdd, 0xcc, 0x41, 0x76, 0xdd, 0xd7, 0x43, 0x5e, 0x9b, 0x6a,
+- 0xf3, 0x54, 0xc1, 0xf0, 0xdc, 0x01, 0x13, 0xfb, 0x28, 0x28, 0xde, 0x2c,
+- 0xaf, 0xd3, 0x0e, 0x01, 0x9f, 0xae, 0x53, 0x46, 0xd0, 0xa6, 0xa4, 0xec,
+- 0x80, 0xac, 0x59, 0xff, 0x00, 0xca, 0x29, 0x94, 0xda, 0x56, 0xbb, 0x52,
+- 0x7d, 0x35, 0xec, 0xdf, 0x23, 0xef, 0xd8, 0x6b, 0x75, 0xec, 0xef, 0x18,
+- 0x73, 0x1b, 0x4a, 0xfd, 0xde, 0x47, 0xb0, 0xc7, 0xe3, 0xa0, 0xc1, 0x19,
+- 0xd0, 0xe0, 0x14, 0xf6, 0x7a, 0xde, 0x1a, 0x39, 0x1c, 0x80, 0x3e, 0x3f,
+- 0x23, 0x85, 0x34, 0x64, 0xee, 0x5a, 0xc9, 0x9a, 0x58, 0x12, 0xf5, 0x9e,
+- 0x4f, 0xf3, 0x4e, 0xfd, 0xbd, 0x2a, 0x3e, 0xb8, 0xbc, 0x19, 0x34, 0x71,
+- 0xc4, 0x20, 0xea, 0xa8, 0xc3, 0x21, 0xb3, 0x1c, 0xcc, 0x55, 0xfd, 0x59,
+- 0xaf, 0xf4, 0x62, 0xbe, 0xea, 0x34, 0xde, 0x19, 0x5b, 0x38, 0x66, 0xdd,
+- 0x59, 0xcf, 0xd8, 0x45, 0xc2, 0xc9, 0xc1, 0x17, 0x0d, 0xba, 0x8c, 0x5f,
+- 0xb8, 0x38, 0x9f, 0xac, 0xe4, 0x47, 0x60, 0x93, 0x29, 0x99, 0xdc, 0x6b,
+- 0x64, 0x32, 0xe4, 0x5d, 0xcd, 0x93, 0xb5, 0x4d, 0xda, 0x4e, 0x9e, 0xf2,
+- 0xa7, 0x29, 0xc7, 0x8a, 0x35, 0xd8, 0x3f, 0xe9, 0xdf, 0xb3, 0xb2, 0x6a,
+- 0xce, 0xb0, 0xca, 0xd5, 0x28, 0xad, 0x89, 0xe5, 0x1c, 0xbe, 0x09, 0xff,
+- 0x35, 0x03, 0x1e, 0xf6, 0x20, 0x37, 0x1d, 0xc8, 0x45, 0xea, 0xb5, 0xaf,
+- 0x76, 0x4b, 0x1f, 0xea, 0x2f, 0xc3, 0xe6, 0x79, 0x92, 0x7c, 0x7b, 0x5d,
+- 0xec, 0xc6, 0x1b, 0xc5, 0x47, 0x18, 0x1b, 0x19, 0x32, 0x77, 0xb3, 0xff,
+- 0x0b, 0xf0, 0xea, 0x35, 0x42, 0xb0, 0xeb, 0xaf, 0xd6, 0xf6, 0xc1, 0x47,
+- 0x3c, 0x66, 0xe5, 0xa3, 0xac, 0x2b, 0xc9, 0x7a, 0x86, 0x76, 0x28, 0x63,
+- 0x24, 0x61, 0xd4, 0xef, 0xf6, 0x49, 0xa9, 0xff, 0x9f, 0x53, 0x77, 0x34,
+- 0x0b, 0x4a, 0xee, 0xfa, 0xf1, 0xe5, 0xe7, 0x24, 0xd9, 0xf4, 0xe3, 0x54,
+- 0x5c, 0x7f, 0xcb, 0x2a, 0x36, 0xff, 0x1c, 0xeb, 0x10, 0x06, 0xee, 0x45,
+- 0xaf, 0x63, 0x2f, 0x4f, 0x98, 0x75, 0x1c, 0x2b, 0x74, 0x38, 0x86, 0xfd,
+- 0xec, 0xef, 0x93, 0xbe, 0x00, 0xe4, 0xd9, 0x28, 0x9e, 0x6f, 0xa1, 0x6e,
+- 0xe7, 0xbd, 0x51, 0x15, 0x2b, 0x70, 0x18, 0xde, 0x33, 0xf4, 0x77, 0x03,
+- 0x32, 0xc7, 0x86, 0xfe, 0x6c, 0x54, 0x3f, 0x8e, 0x12, 0xe3, 0x9e, 0xbc,
+- 0x2e, 0x73, 0xda, 0xdf, 0x86, 0x4d, 0x39, 0xac, 0x74, 0xf0, 0x4c, 0x9a,
+- 0xb1, 0x90, 0x33, 0x90, 0x8f, 0xf7, 0xa3, 0x8e, 0x7e, 0x53, 0x49, 0x9c,
+- 0xf7, 0x14, 0x8c, 0xbf, 0xaf, 0xcf, 0x25, 0xa0, 0xf4, 0xf5, 0x0a, 0xce,
+- 0x83, 0x73, 0x50, 0xdf, 0xfd, 0x5c, 0x3e, 0xd5, 0x11, 0x47, 0xc9, 0xd9,
+- 0xed, 0xb8, 0x41, 0x36, 0x0f, 0x1d, 0xbd, 0x56, 0x25, 0x0f, 0x66, 0x70,
+- 0xde, 0x59, 0xf9, 0xda, 0xe6, 0x3d, 0xc0, 0x75, 0x54, 0x02, 0x4f, 0xb5,
+- 0x40, 0x3f, 0xd4, 0x0d, 0x63, 0x90, 0xc9, 0x8e, 0xb1, 0x25, 0xa2, 0x12,
+- 0x7c, 0x6a, 0x48, 0xba, 0x2f, 0xc4, 0xa4, 0xeb, 0x02, 0xf3, 0x4f, 0x52,
+- 0x71, 0xd8, 0xc5, 0xb4, 0x87, 0x78, 0x0f, 0xc9, 0xfb, 0xc3, 0xb8, 0xbe,
+- 0x8f, 0xe4, 0x5d, 0x24, 0xfa, 0xc1, 0x76, 0xef, 0xba, 0xe4, 0x00, 0x3f,
+- 0x7a, 0xce, 0xdd, 0x63, 0xcb, 0x7a, 0x2c, 0xef, 0x31, 0x63, 0x25, 0x49,
+- 0x99, 0x7b, 0xcc, 0x14, 0xc6, 0xa6, 0x26, 0x5f, 0x6e, 0x8f, 0xe7, 0x58,
+- 0xea, 0xc4, 0x28, 0xf8, 0xfb, 0xad, 0xd2, 0xf8, 0x22, 0xf9, 0xdc, 0xbf,
+- 0xeb, 0x1a, 0x32, 0x77, 0x5f, 0xec, 0x13, 0x37, 0xed, 0x49, 0xd3, 0xee,
+- 0x2a, 0x3d, 0x19, 0x6c, 0xc7, 0x5b, 0x78, 0x2f, 0x96, 0x38, 0xcf, 0xe4,
+- 0x11, 0x7d, 0x47, 0x46, 0x5f, 0x0a, 0xbe, 0xc5, 0x93, 0xb0, 0x31, 0xeb,
+- 0x2c, 0x7b, 0xa4, 0x5c, 0x3f, 0x25, 0xb3, 0xea, 0xf9, 0x43, 0xf2, 0xa8,
+- 0x43, 0xdc, 0x9d, 0x91, 0xf4, 0x84, 0xb6, 0xc7, 0xc4, 0xd6, 0xb8, 0xed,
+- 0x76, 0xcf, 0xc8, 0xd1, 0xb4, 0xd2, 0x21, 0xce, 0x23, 0xc0, 0x71, 0xb1,
+- 0xd9, 0x45, 0x7a, 0x07, 0xec, 0x1e, 0x78, 0x2c, 0x2b, 0x17, 0x37, 0xd1,
+- 0x17, 0x67, 0xf5, 0x08, 0xdf, 0xeb, 0xc0, 0x27, 0x63, 0x16, 0x4f, 0x11,
+- 0x9f, 0xdc, 0x3b, 0x75, 0x28, 0x71, 0x4a, 0x1c, 0x50, 0x2f, 0x33, 0xe6,
+- 0x96, 0x98, 0xbc, 0x2d, 0xf4, 0x9b, 0x89, 0x33, 0xce, 0xe3, 0xef, 0x5b,
+- 0x8f, 0xb3, 0x37, 0x06, 0x85, 0xe6, 0x98, 0x7d, 0xc1, 0x11, 0xfb, 0x12,
+- 0xcb, 0x08, 0x4a, 0xb6, 0x01, 0xa4, 0x8d, 0xa4, 0x69, 0x73, 0x51, 0x07,
+- 0x3b, 0xf2, 0x09, 0xf2, 0x96, 0xce, 0xff, 0x4b, 0x8e, 0x4c, 0xca, 0x95,
+- 0xb5, 0xbb, 0xf9, 0x2b, 0x70, 0x41, 0xdb, 0x25, 0x77, 0xf2, 0xd7, 0xe4,
+- 0x3f, 0x80, 0xbf, 0xb8, 0xc6, 0x19, 0x95, 0xbb, 0xf0, 0xa9, 0x68, 0x22,
+- 0x9e, 0xd5, 0xfe, 0x85, 0x93, 0xb2, 0x47, 0xe2, 0xb4, 0x47, 0x1b, 0x4f,
+- 0x8e, 0xe3, 0xdc, 0x5b, 0xf2, 0x44, 0xda, 0xa7, 0x2f, 0xe6, 0xf8, 0xb5,
+- 0xa4, 0x06, 0xfd, 0x5c, 0x76, 0x2d, 0x59, 0x70, 0xcf, 0x28, 0x7b, 0xf2,
+- 0xc3, 0xd1, 0x96, 0x9c, 0x4e, 0xeb, 0xb1, 0x0b, 0x32, 0x62, 0x68, 0x5c,
+- 0xf9, 0x6b, 0x90, 0xbf, 0x3c, 0x2f, 0xbe, 0xdf, 0x23, 0xe9, 0x81, 0x33,
+- 0x92, 0x9c, 0xd8, 0x22, 0xbe, 0x70, 0x0e, 0x94, 0x3b, 0xbf, 0x36, 0x16,
+- 0xa6, 0x72, 0x9e, 0xf2, 0x15, 0xc2, 0xb4, 0x0f, 0x74, 0x9b, 0x85, 0xbf,
+- 0xb4, 0x13, 0x0f, 0x4b, 0x8d, 0x94, 0x5a, 0x21, 0xac, 0x5d, 0x84, 0x3f,
+- 0xf1, 0xe1, 0xa8, 0x1b, 0x1f, 0xb6, 0x47, 0x62, 0x67, 0xa5, 0xa6, 0x60,
+- 0xfd, 0x44, 0x5a, 0xd3, 0xcb, 0x62, 0x66, 0xaf, 0x18, 0x55, 0x67, 0x8c,
+- 0x9a, 0x73, 0x6d, 0x59, 0x9f, 0x6c, 0xea, 0x78, 0xd4, 0x4e, 0x9c, 0x7a,
+- 0x47, 0xe6, 0x04, 0x8d, 0x2c, 0x28, 0xd7, 0xde, 0x25, 0xbe, 0xcc, 0xa9,
+- 0x65, 0x70, 0x56, 0xcb, 0x3c, 0xa3, 0xb8, 0xb9, 0x47, 0x0a, 0x77, 0xd8,
+- 0xca, 0x21, 0xe6, 0xfd, 0xc5, 0xb3, 0xf6, 0x32, 0x64, 0xc3, 0x93, 0x12,
+- 0x72, 0xfd, 0xb9, 0x98, 0xd3, 0x19, 0x33, 0xf7, 0x11, 0xfb, 0x19, 0xb7,
+- 0x42, 0x9f, 0x07, 0xd1, 0x7e, 0x3f, 0xfa, 0x51, 0x57, 0xf2, 0x1e, 0x80,
+- 0x7a, 0x93, 0xb1, 0xf6, 0x01, 0xf4, 0xeb, 0x91, 0x7c, 0x7d, 0xbf, 0xa9,
+- 0xf3, 0xe7, 0x38, 0xdc, 0xd1, 0xdf, 0xaf, 0xd3, 0xf7, 0x07, 0x59, 0x1b,
+- 0x32, 0x7e, 0x99, 0x7d, 0xe3, 0xed, 0x3b, 0x10, 0xbb, 0xf1, 0xa0, 0xa3,
+- 0xc7, 0xb3, 0x1f, 0x65, 0x3e, 0x74, 0x4b, 0x15, 0xfa, 0xa6, 0x3a, 0xc5,
+- 0xbb, 0x40, 0x63, 0x57, 0xcc, 0x9a, 0x7c, 0x16, 0xda, 0x17, 0xaf, 0x19,
+- 0x7d, 0xbb, 0x93, 0x8b, 0x7a, 0x24, 0xe3, 0xe7, 0xf5, 0x30, 0x17, 0x91,
+- 0xeb, 0xf2, 0x3c, 0x40, 0x53, 0x9b, 0xda, 0x96, 0xb6, 0x33, 0x5d, 0xbc,
+- 0x6b, 0x83, 0x7e, 0xd7, 0xfa, 0xbf, 0x01, 0xfd, 0xbf, 0xb1, 0x02, 0x9d,
+- 0xdf, 0x47, 0xdd, 0xaf, 0xf3, 0x4f, 0xec, 0x76, 0xbe, 0x8f, 0x7f, 0x8f,
+- 0xbc, 0xa5, 0xee, 0xf1, 0x7a, 0x3c, 0xca, 0xf4, 0x8c, 0xfc, 0x39, 0x6c,
+- 0xad, 0x67, 0x36, 0x27, 0xb1, 0x5e, 0x1a, 0x7e, 0xdd, 0x38, 0xfc, 0xba,
+- 0x51, 0xf8, 0x75, 0x2e, 0x74, 0xe1, 0x90, 0xca, 0x27, 0xa3, 0xde, 0x9f,
+- 0x38, 0x24, 0xd6, 0xd7, 0x32, 0x62, 0x1d, 0xbc, 0x00, 0x1b, 0x61, 0xe9,
+- 0x25, 0xd0, 0x7f, 0xe2, 0x79, 0x11, 0xf2, 0x04, 0xf9, 0xef, 0x31, 0xc9,
+- 0xc6, 0x86, 0xe4, 0xf3, 0x9b, 0x6c, 0x23, 0x3d, 0x65, 0xe5, 0x15, 0xf7,
+- 0x25, 0xc5, 0x67, 0x17, 0x6b, 0xd7, 0x25, 0xf4, 0x84, 0x96, 0xb5, 0x3f,
+- 0x80, 0x3d, 0xd5, 0x48, 0x6b, 0xda, 0xbb, 0x2d, 0xa4, 0x3d, 0xe8, 0xa7,
+- 0x35, 0xca, 0xd8, 0x9b, 0x12, 0xbd, 0xf0, 0x92, 0xbc, 0xf9, 0x82, 0xab,
+- 0xe2, 0x12, 0x6b, 0x4f, 0x2a, 0xdd, 0x07, 0xb9, 0x16, 0x95, 0xf5, 0xcd,
+- 0xdf, 0x91, 0x4f, 0x39, 0x89, 0x2b, 0x94, 0x99, 0x94, 0x5d, 0x5a, 0xa7,
+- 0x41, 0xc6, 0x56, 0x12, 0xa5, 0x32, 0x6c, 0xef, 0x2b, 0xf6, 0x98, 0x64,
+- 0x83, 0xa5, 0x56, 0x3f, 0xfd, 0x82, 0x9a, 0xeb, 0x24, 0x6d, 0x9e, 0xef,
+- 0xbd, 0xb0, 0xad, 0x13, 0x75, 0x25, 0xa3, 0xa8, 0x27, 0x33, 0xd4, 0x9b,
+- 0xd4, 0x7d, 0xd4, 0x3f, 0x8c, 0x97, 0xe3, 0x79, 0x8d, 0xba, 0xe9, 0xef,
+- 0xd4, 0x9d, 0x67, 0x71, 0xc6, 0x91, 0xfa, 0x1a, 0xe5, 0x13, 0xf4, 0xfc,
+- 0x93, 0xb4, 0x73, 0x45, 0xd1, 0x3f, 0xed, 0xdc, 0x47, 0xc5, 0xb7, 0x71,
+- 0xd9, 0xb6, 0xdb, 0xc6, 0xfd, 0x83, 0x7d, 0xd2, 0x1b, 0x05, 0x7e, 0xc8,
+- 0xff, 0x3b, 0x36, 0x60, 0x2e, 0x73, 0x13, 0xb6, 0x26, 0xf7, 0x61, 0xc9,
+- 0xa0, 0x7b, 0x1d, 0x74, 0xc4, 0xb5, 0x6f, 0xb6, 0x3e, 0x1c, 0xe5, 0x1e,
+- 0x2c, 0x65, 0x23, 0x6c, 0x0f, 0xfe, 0xa6, 0x3b, 0x0a, 0xca, 0x88, 0x7d,
+- 0xb0, 0xcd, 0x6d, 0x43, 0xb3, 0x9f, 0x34, 0xbe, 0x04, 0xf8, 0x79, 0x95,
+- 0x7b, 0x28, 0xf3, 0x4e, 0x04, 0x36, 0xd7, 0x22, 0x63, 0x52, 0x6a, 0xdd,
+- 0xf7, 0x67, 0x22, 0x92, 0xbc, 0xd0, 0x25, 0xa9, 0xa7, 0xec, 0x41, 0x9d,
+- 0xb7, 0xf8, 0x30, 0x74, 0xcf, 0x41, 0xb4, 0x1f, 0x90, 0xb2, 0x13, 0x85,
+- 0x3f, 0x33, 0x2a, 0xe5, 0xd1, 0x30, 0x78, 0xe6, 0x01, 0xde, 0x75, 0x28,
+- 0x38, 0xca, 0xce, 0x30, 0xca, 0x6e, 0x94, 0xf7, 0x48, 0xf9, 0xc9, 0x4b,
+- 0xfb, 0xb4, 0x2d, 0xbb, 0xfb, 0xfd, 0x9f, 0x76, 0xab, 0xd8, 0xb9, 0xf5,
+- 0x8e, 0x88, 0xb9, 0x47, 0xff, 0x2d, 0x60, 0xf7, 0xfb, 0x12, 0x9e, 0x90,
+- 0xb8, 0x4f, 0x44, 0x64, 0x18, 0xb2, 0x77, 0x04, 0x7a, 0xeb, 0xe0, 0x85,
+- 0x21, 0x19, 0xbd, 0x10, 0x97, 0xfb, 0x2e, 0xf8, 0xf6, 0xc0, 0xf2, 0x74,
+- 0xca, 0xc4, 0x71, 0xdd, 0xdf, 0x32, 0x8e, 0x7b, 0x9f, 0x9a, 0x1f, 0x30,
+- 0xae, 0x41, 0x1e, 0x46, 0x3f, 0xa7, 0xec, 0x06, 0x8d, 0xfb, 0x1f, 0xc9,
+- 0x91, 0x95, 0x90, 0x1c, 0x55, 0xbc, 0xe8, 0xdb, 0xf0, 0xff, 0x13, 0xfb,
+- 0x48, 0x80, 0x47, 0x4e, 0x18, 0xbf, 0xb3, 0x17, 0x78, 0x25, 0x0e, 0xa1,
+- 0xeb, 0xe0, 0x8b, 0x32, 0x3f, 0xb5, 0x98, 0xee, 0x1c, 0xcf, 0xb1, 0x3f,
+- 0xc5, 0x98, 0x2c, 0x6c, 0x0b, 0xb6, 0xcb, 0x60, 0x40, 0xf6, 0x6a, 0x7f,
+- 0x1f, 0xda, 0x29, 0x73, 0x8e, 0x42, 0xe6, 0xec, 0x6e, 0xcf, 0xa1, 0x8d,
+- 0xeb, 0xdf, 0x83, 0x75, 0xc9, 0x8f, 0x5c, 0xd7, 0xc7, 0x09, 0xcf, 0x75,
+- 0x10, 0xfe, 0x07, 0xcf, 0xb5, 0x4b, 0x0a, 0x0e, 0x73, 0x37, 0x59, 0xf7,
+- 0x16, 0x73, 0xd6, 0x13, 0xe6, 0xac, 0x05, 0xb6, 0x31, 0xed, 0x2d, 0x9d,
+- 0xaf, 0x50, 0x88, 0x26, 0x4a, 0x22, 0x71, 0x15, 0xbf, 0x5b, 0xaf, 0xf8,
+- 0xf6, 0x49, 0xb6, 0x9f, 0xf7, 0x10, 0x8b, 0x69, 0x15, 0x5b, 0x8b, 0x07,
+- 0x3c, 0xda, 0x37, 0xe9, 0x30, 0xf3, 0x92, 0x1b, 0x2b, 0xbc, 0x93, 0x0c,
+- 0xe0, 0x07, 0x3c, 0x07, 0x2d, 0x71, 0x5c, 0xd6, 0x95, 0xb4, 0x6e, 0x9b,
+- 0x01, 0xff, 0xda, 0xaa, 0x4f, 0x3c, 0x97, 0x1e, 0x34, 0xef, 0x31, 0x59,
+- 0xab, 0xbc, 0x63, 0xc8, 0xf6, 0xfe, 0xf6, 0x9e, 0x5c, 0xa6, 0x9f, 0xf7,
+- 0x49, 0xa8, 0x23, 0x9f, 0xbc, 0xa4, 0x72, 0x15, 0xb5, 0xef, 0x10, 0xe4,
+- 0x3d, 0x24, 0xf6, 0xf9, 0x53, 0xd0, 0xf5, 0xee, 0x3d, 0x77, 0x99, 0x3d,
+- 0x73, 0xbf, 0xc4, 0x37, 0xc7, 0xfb, 0x7a, 0x8e, 0x38, 0x0f, 0x77, 0xf8,
+- 0x1b, 0x91, 0x81, 0x9d, 0xfb, 0x73, 0xca, 0x42, 0xca, 0xbf, 0x49, 0x95,
+- 0xef, 0x72, 0xcb, 0x86, 0x1c, 0xaa, 0x42, 0x2e, 0x55, 0x21, 0x8b, 0xaa,
+- 0x90, 0x45, 0xb0, 0x41, 0x9e, 0x85, 0x5c, 0x7d, 0x06, 0xbe, 0xda, 0xd7,
+- 0xab, 0xbe, 0xfd, 0x9e, 0x85, 0x1c, 0x53, 0x36, 0x1d, 0xed, 0x9f, 0x9a,
+- 0xed, 0x75, 0xff, 0xd6, 0xf9, 0x50, 0x01, 0xcf, 0x1f, 0xd7, 0x2d, 0x45,
+- 0x35, 0x26, 0x2e, 0xf3, 0xcd, 0xbd, 0xfa, 0x72, 0x7f, 0xa1, 0x8e, 0xfd,
+- 0x9a, 0xbb, 0x7e, 0x15, 0x8b, 0xa0, 0x0c, 0xfe, 0x4d, 0x3c, 0xd0, 0x99,
+- 0xa7, 0xc9, 0x33, 0x56, 0x39, 0x42, 0x38, 0x53, 0xe2, 0x9d, 0x76, 0x61,
+- 0x59, 0x16, 0x26, 0x17, 0xa5, 0x3c, 0x69, 0xc9, 0xdc, 0x38, 0xce, 0x68,
+- 0x7c, 0x18, 0x3a, 0x32, 0x0d, 0x5d, 0xbb, 0x80, 0x79, 0xc8, 0x7f, 0x0f,
+- 0xe2, 0x5c, 0x1c, 0x73, 0x27, 0xfe, 0xa5, 0xe9, 0x5c, 0x4d, 0xac, 0x6b,
+- 0x2a, 0x47, 0x7c, 0x79, 0xfa, 0xd5, 0x95, 0x87, 0x61, 0x3f, 0x4d, 0xc8,
+- 0xd5, 0xc9, 0x87, 0x65, 0xfb, 0x8e, 0xf1, 0x38, 0x07, 0xc8, 0xe1, 0xcf,
+- 0x6f, 0xf2, 0x1e, 0xb4, 0x4b, 0x66, 0xa3, 0x8c, 0x81, 0xc1, 0xc6, 0x71,
+- 0xfb, 0x65, 0x5b, 0xf9, 0xa1, 0x07, 0xe4, 0xb6, 0xa2, 0x2d, 0xd6, 0x85,
+- 0x50, 0xa7, 0xed, 0xd1, 0xb5, 0x8a, 0x6f, 0x5b, 0x28, 0x1c, 0x99, 0x98,
+- 0x1f, 0xf5, 0x0d, 0xe3, 0x49, 0x8c, 0x2f, 0xad, 0x45, 0x76, 0x64, 0x01,
+- 0x4b, 0xff, 0x5c, 0x3b, 0xfd, 0xe3, 0xbf, 0x8e, 0xe8, 0x6f, 0x0b, 0xba,
+- 0xa4, 0x1c, 0x2d, 0xb5, 0xca, 0x6e, 0xd0, 0xba, 0xda, 0xce, 0x69, 0xf5,
+- 0xdb, 0x48, 0xcb, 0x36, 0x60, 0x25, 0x1d, 0x24, 0x55, 0xee, 0xce, 0x77,
+- 0xaa, 0x03, 0xfb, 0xf4, 0x37, 0x0a, 0x01, 0x8c, 0xe3, 0xfb, 0x89, 0x88,
+- 0x7e, 0xf7, 0xef, 0xdd, 0xdf, 0x86, 0xbe, 0x31, 0x25, 0xaf, 0xd6, 0x6a,
+- 0x01, 0xf0, 0xf0, 0x20, 0x9e, 0x5f, 0x44, 0x9f, 0x30, 0xce, 0x86, 0xb1,
+- 0xa4, 0xb7, 0xa8, 0xfc, 0x9b, 0x80, 0xeb, 0xe7, 0xf5, 0x52, 0x77, 0xff,
+- 0x67, 0xd5, 0xfe, 0xf4, 0x4a, 0x37, 0xf3, 0x55, 0x51, 0x52, 0xaf, 0xff,
+- 0x0a, 0xbe, 0x56, 0x48, 0xf2, 0x35, 0x17, 0xb6, 0x78, 0x88, 0xf4, 0x8b,
+- 0xfa, 0x7b, 0xa1, 0xa3, 0x04, 0xfc, 0xd4, 0x05, 0xbd, 0xa9, 0x70, 0x0d,
+- 0x4a, 0xa2, 0x4f, 0xef, 0xe7, 0x99, 0x6a, 0x38, 0x42, 0xde, 0xf7, 0x98,
+- 0x6f, 0x10, 0x0e, 0x78, 0x2f, 0x4d, 0xcf, 0x55, 0x68, 0x2b, 0xb5, 0x5a,
+- 0xd0, 0x65, 0xd8, 0xc9, 0xcf, 0x94, 0x5f, 0xb1, 0x2d, 0xda, 0x57, 0x5b,
+- 0x50, 0xf9, 0x96, 0x37, 0xa7, 0x35, 0x8d, 0x74, 0xde, 0x9f, 0xbc, 0xd1,
+- 0xdd, 0x49, 0x58, 0xb6, 0xd3, 0x3d, 0x86, 0x2f, 0xc2, 0xc1, 0x62, 0x25,
+- 0x12, 0x9c, 0x53, 0xf7, 0x5b, 0x5b, 0x26, 0x1f, 0xf3, 0xda, 0x74, 0xaa,
+- 0x19, 0x56, 0xb9, 0x00, 0xbc, 0x4b, 0xc8, 0x57, 0x78, 0x97, 0xa2, 0xdb,
+- 0x53, 0xa6, 0x3d, 0xd9, 0x54, 0x6d, 0x2a, 0xde, 0xc5, 0x18, 0x57, 0x37,
+- 0xca, 0xdb, 0x15, 0xca, 0x07, 0xcc, 0xaf, 0x65, 0x09, 0x60, 0x7f, 0x71,
+- 0x7a, 0x6e, 0x85, 0xf0, 0x7d, 0x7f, 0x3a, 0xb7, 0xc2, 0x1c, 0xc8, 0xff,
+- 0x34, 0x7d, 0x63, 0xc5, 0x92, 0x0d, 0x37, 0xa1, 0xe2, 0x57, 0xeb, 0x8c,
+- 0xb1, 0x72, 0x9c, 0x9a, 0xf3, 0x45, 0x23, 0x93, 0xbf, 0x37, 0x3d, 0xbc,
+- 0x1e, 0x90, 0x73, 0x66, 0x0e, 0xbe, 0xc7, 0xd7, 0xef, 0xa0, 0x6b, 0xd0,
+- 0xca, 0x15, 0xd0, 0x4a, 0x2f, 0x6c, 0x09, 0xd2, 0x37, 0x7d, 0xb2, 0x5e,
+- 0xc8, 0x01, 0xae, 0xf3, 0x8c, 0x5a, 0x27, 0x80, 0x75, 0xe6, 0x54, 0xce,
+- 0x78, 0x80, 0x79, 0xb7, 0xb0, 0x35, 0x61, 0x13, 0xba, 0x8c, 0x59, 0xdb,
+- 0xd8, 0xf3, 0x28, 0xf4, 0x12, 0xf3, 0x3f, 0xfe, 0x7b, 0x64, 0x27, 0x6f,
+- 0xfc, 0x39, 0x33, 0xee, 0x9b, 0x18, 0xc7, 0x33, 0x51, 0xf9, 0xe6, 0x6f,
+- 0xb6, 0x65, 0x58, 0xd9, 0x90, 0x3a, 0x07, 0x89, 0x30, 0xd4, 0xb1, 0x57,
+- 0xea, 0xe2, 0x2e, 0xc9, 0xab, 0x7d, 0x7d, 0x53, 0x8d, 0xb3, 0xbc, 0x6f,
+- 0x00, 0x76, 0xda, 0x25, 0x98, 0xbb, 0xaa, 0xe3, 0x6d, 0x79, 0xc5, 0xd3,
+- 0xe0, 0x91, 0x49, 0x3f, 0x57, 0x4f, 0x8f, 0xf3, 0xfb, 0x27, 0xd7, 0x8f,
+- 0x98, 0x9c, 0x8e, 0xbf, 0x6f, 0x65, 0x8f, 0xf7, 0x2a, 0x1b, 0x6c, 0xe7,
+- 0x9b, 0x08, 0x7f, 0x8c, 0xdf, 0xc7, 0xcf, 0x31, 0x7e, 0x74, 0xff, 0x0e,
+- 0xcc, 0x5b, 0xe6, 0xcc, 0x39, 0x8e, 0xb1, 0x49, 0x95, 0xaf, 0xcb, 0xba,
+- 0xe0, 0x7c, 0x86, 0x73, 0x74, 0xde, 0xf7, 0x8c, 0x83, 0x47, 0xb5, 0xcd,
+- 0x57, 0x82, 0x9d, 0x55, 0x06, 0xbf, 0x04, 0x3c, 0xca, 0xf1, 0x61, 0x13,
+- 0x57, 0x7b, 0xa3, 0x38, 0x1f, 0xef, 0x12, 0xc7, 0x21, 0x7b, 0xfc, 0xf1,
+- 0x3c, 0xc7, 0x6b, 0xd3, 0x37, 0x2a, 0xae, 0x9c, 0xad, 0xea, 0x7c, 0x47,
+- 0x8d, 0x07, 0xc6, 0x6e, 0x78, 0xb6, 0x71, 0x99, 0x73, 0xa9, 0x67, 0xe3,
+- 0xf2, 0x5d, 0xd7, 0x8f, 0xad, 0xf1, 0x7e, 0x0a, 0xfd, 0x61, 0xeb, 0x2d,
+- 0x6c, 0x72, 0xff, 0xdf, 0xc4, 0xfe, 0xe9, 0x53, 0x68, 0x5a, 0x3a, 0x08,
+- 0xb9, 0xf5, 0x1f, 0x82, 0xf0, 0x19, 0xa0, 0xbb, 0x6f, 0x05, 0x3b, 0xf7,
+- 0xe7, 0xeb, 0x6b, 0x4d, 0x97, 0x41, 0xd0, 0xc8, 0x62, 0x1b, 0xef, 0x96,
+- 0x04, 0xde, 0x39, 0x02, 0x1d, 0x64, 0x49, 0x61, 0xdc, 0x8d, 0x2d, 0xf0,
+- 0x6e, 0xc1, 0x19, 0x73, 0x1c, 0x95, 0xc7, 0x16, 0x07, 0xbc, 0x7c, 0xe6,
+- 0xb7, 0x02, 0xcc, 0x39, 0x8b, 0xab, 0x5c, 0xdd, 0x6c, 0xd4, 0x05, 0xbc,
+- 0x8e, 0xb2, 0x4f, 0xb4, 0x5e, 0xfe, 0x97, 0xfb, 0x29, 0x6b, 0xfa, 0x5d,
+- 0xff, 0xec, 0x39, 0xf7, 0x8b, 0x98, 0x3b, 0x60, 0xda, 0x7d, 0x1a, 0x09,
+- 0x30, 0xe5, 0x4d, 0x76, 0xbe, 0x01, 0xf1, 0xe3, 0x7c, 0xec, 0xff, 0x2d,
+- 0x05, 0xcb, 0x1c, 0xf4, 0xd0, 0xbc, 0xda, 0xcf, 0x0b, 0xa0, 0x05, 0xca,
+- 0x15, 0x9f, 0x7e, 0x5f, 0x00, 0xfd, 0xee, 0x63, 0x0a, 0xdf, 0x1e, 0xb4,
+- 0xe6, 0xd3, 0x18, 0xe9, 0x8b, 0xb4, 0xf5, 0x8a, 0xe2, 0xb9, 0x52, 0xfb,
+- 0xdc, 0x29, 0xb3, 0x12, 0x4e, 0xdc, 0xf6, 0xcf, 0x9d, 0xcf, 0x7b, 0xe5,
+- 0xb8, 0xfa, 0xfc, 0x91, 0xf9, 0x07, 0x9c, 0x6d, 0xda, 0x9c, 0x6d, 0xa6,
+- 0xe3, 0x9b, 0x04, 0x7f, 0x3e, 0xfa, 0xfb, 0xd4, 0xaf, 0xbc, 0x0b, 0xe2,
+- 0xf7, 0x12, 0xca, 0x44, 0x90, 0x72, 0x9a, 0x7c, 0x94, 0x8b, 0xf3, 0x3e,
+- 0xe5, 0xa4, 0x04, 0xfa, 0x60, 0xb7, 0x8c, 0x86, 0xc4, 0xff, 0x2e, 0xa9,
+- 0x4b, 0xb6, 0x9c, 0x56, 0xeb, 0x06, 0xef, 0x8d, 0x2b, 0x41, 0xd9, 0x50,
+- 0x77, 0x9f, 0xe0, 0xd1, 0xde, 0xa0, 0x2c, 0xba, 0x6d, 0x3d, 0x27, 0x75,
+- 0xf4, 0x59, 0x43, 0xdb, 0xb9, 0x36, 0x6c, 0xd4, 0x07, 0xb0, 0x21, 0xdd,
+- 0xbf, 0x6f, 0x15, 0xa3, 0x77, 0xf4, 0x35, 0x32, 0x96, 0xb1, 0x47, 0xc6,
+- 0xa7, 0x1d, 0xc9, 0xaf, 0x0f, 0xe0, 0x07, 0x19, 0xaf, 0xe4, 0x02, 0x63,
+- 0x91, 0x8c, 0xe7, 0x96, 0xe0, 0x9f, 0x6a, 0x3f, 0x9f, 0xf6, 0xf6, 0x95,
+- 0xcd, 0x44, 0xa9, 0x24, 0x6e, 0xfc, 0x91, 0xf6, 0x77, 0x3c, 0x7d, 0xa5,
+- 0xb0, 0xd7, 0x19, 0xf3, 0x8d, 0xab, 0xfc, 0xd9, 0x1e, 0x2f, 0x11, 0x3b,
+- 0x05, 0xdf, 0xf5, 0xeb, 0x69, 0xc6, 0x7a, 0xef, 0x23, 0xbe, 0xbf, 0xc4,
+- 0x4d, 0xda, 0x23, 0xe3, 0xe2, 0x5e, 0x72, 0x47, 0x1f, 0x11, 0xfa, 0xa7,
+- 0x89, 0xf8, 0x14, 0xf1, 0xd6, 0xfe, 0xbe, 0x20, 0x68, 0xec, 0xa5, 0x71,
+- 0x19, 0xbe, 0xf4, 0x23, 0x15, 0x63, 0xff, 0x70, 0x7a, 0x37, 0x6d, 0xa8,
+- 0x58, 0xf1, 0x78, 0xbf, 0x0c, 0x8f, 0xae, 0x89, 0x40, 0x5b, 0xf0, 0x7b,
+- 0x03, 0x0b, 0x3e, 0xaa, 0x7a, 0x87, 0xbd, 0x1e, 0x57, 0xdf, 0x5c, 0x65,
+- 0x55, 0xde, 0x23, 0x63, 0xc9, 0x3c, 0xd3, 0x88, 0xca, 0x85, 0x7b, 0x16,
+- 0x67, 0x5b, 0x68, 0xf2, 0x7c, 0x19, 0x57, 0x66, 0xdc, 0x98, 0xb1, 0x65,
+- 0xc6, 0x88, 0xf5, 0xf7, 0x53, 0x47, 0x9a, 0x7b, 0xc5, 0x91, 0x89, 0x8b,
+- 0x51, 0xf3, 0x4d, 0x9a, 0x58, 0xdb, 0xd0, 0xbb, 0xf9, 0x9a, 0xa3, 0xee,
+- 0xfd, 0x8a, 0x4e, 0xbf, 0x9c, 0x1c, 0xed, 0x06, 0xce, 0x07, 0x54, 0x3e,
+- 0xa4, 0xed, 0xbe, 0x07, 0x7e, 0x25, 0xfd, 0x38, 0xea, 0x5b, 0x1f, 0xcf,
+- 0x87, 0x50, 0xf7, 0x0b, 0xe0, 0x9e, 0x75, 0xf0, 0x39, 0x95, 0xee, 0xfd,
+- 0xb4, 0x6c, 0x57, 0x98, 0x9f, 0x5d, 0x3f, 0x90, 0x53, 0xe7, 0xc1, 0x98,
+- 0x8d, 0x2f, 0x9b, 0xfc, 0x5c, 0x35, 0xfa, 0xcc, 0x8e, 0xb9, 0xab, 0x66,
+- 0xcc, 0x66, 0x40, 0x8a, 0xeb, 0x94, 0x3f, 0x96, 0x5a, 0xeb, 0x56, 0xe0,
+- 0xad, 0x52, 0xaa, 0xef, 0x75, 0xef, 0xde, 0x6a, 0x3d, 0x93, 0x56, 0xbe,
+- 0xec, 0xf9, 0x92, 0x39, 0x63, 0xfd, 0x1d, 0x64, 0x70, 0x27, 0x7f, 0x38,
+- 0xaa, 0xe3, 0x09, 0xd9, 0x81, 0x5e, 0xfa, 0x0f, 0x7d, 0x1a, 0xbf, 0xf4,
+- 0x7b, 0x7f, 0x65, 0x6c, 0x51, 0xfa, 0xbc, 0x03, 0x4a, 0x4f, 0xdb, 0x0d,
+- 0x9f, 0x4e, 0x98, 0x73, 0x43, 0x7f, 0xf8, 0xa0, 0x64, 0xeb, 0x90, 0x9b,
+- 0x83, 0x7c, 0x3f, 0x6b, 0xc6, 0xf2, 0xb9, 0x25, 0x47, 0x27, 0x76, 0xdf,
+- 0xa7, 0x4f, 0x6a, 0x3f, 0xbb, 0xd7, 0xbf, 0x53, 0xf7, 0x73, 0x4d, 0x7d,
+- 0x78, 0x15, 0x9c, 0xa0, 0x27, 0x1f, 0x06, 0xbd, 0xd6, 0x11, 0xc0, 0xcb,
+- 0x18, 0xe4, 0x80, 0xcb, 0x5c, 0x9d, 0x80, 0x4c, 0x0c, 0x24, 0x98, 0xc3,
+- 0xa7, 0xe0, 0x69, 0xd4, 0x43, 0x68, 0xf3, 0xe1, 0xd4, 0xfe, 0x79, 0xa3,
+- 0xce, 0xf6, 0x38, 0xd6, 0xea, 0x96, 0x89, 0x41, 0xe2, 0x79, 0x37, 0x1c,
+- 0x03, 0x81, 0xbd, 0x73, 0xd4, 0x1e, 0xec, 0x80, 0xef, 0xee, 0xef, 0x47,
+- 0x73, 0xf0, 0xc3, 0x72, 0x2b, 0x8c, 0x15, 0x10, 0xc6, 0x01, 0xc8, 0x39,
+- 0xec, 0x31, 0xed, 0xe7, 0x0e, 0xfb, 0x78, 0xf1, 0x63, 0x0c, 0x21, 0x45,
+- 0x17, 0x73, 0x19, 0xee, 0x25, 0x64, 0x62, 0x0e, 0x84, 0x2b, 0x61, 0xf2,
+- 0x0f, 0x09, 0x9f, 0x7d, 0x40, 0x9f, 0xff, 0xfd, 0x66, 0xbf, 0x7e, 0xce,
+- 0x22, 0xe7, 0xba, 0x17, 0xe3, 0xbf, 0xd2, 0xc2, 0x5a, 0x34, 0xe8, 0xc0,
+- 0xff, 0xbe, 0xaf, 0x7f, 0xaf, 0x9e, 0xab, 0xd7, 0xff, 0xa6, 0x2f, 0x66,
+- 0xbe, 0xe3, 0x23, 0x9c, 0xe4, 0x2f, 0x1f, 0x87, 0x9c, 0x63, 0xc0, 0xdc,
+- 0x23, 0x10, 0x86, 0x9e, 0x5d, 0x30, 0x24, 0xd2, 0x77, 0xca, 0xb8, 0x43,
+- 0x1d, 0x7b, 0x27, 0xad, 0xf5, 0xc9, 0x42, 0xad, 0x57, 0xca, 0x35, 0xe6,
+- 0x53, 0xf3, 0xfb, 0x32, 0xda, 0x59, 0xe4, 0x4b, 0x95, 0x37, 0x69, 0xf2,
+- 0x15, 0x7d, 0xfe, 0xec, 0x43, 0x3f, 0xea, 0x10, 0x94, 0x75, 0x2d, 0x9f,
+- 0xea, 0x72, 0x77, 0xce, 0xe2, 0x7c, 0x3b, 0x67, 0x51, 0xe7, 0x25, 0x15,
+- 0xdb, 0x79, 0x22, 0xcc, 0x89, 0xeb, 0xcc, 0x41, 0x2a, 0xc9, 0xa3, 0x87,
+- 0x7b, 0x24, 0xb9, 0xdc, 0x6b, 0x68, 0xf4, 0x3d, 0x66, 0x1d, 0xac, 0xb7,
+- 0x34, 0x29, 0xc9, 0xa5, 0x3f, 0x86, 0x6f, 0xaf, 0xf2, 0x22, 0x3b, 0xf2,
+- 0xdb, 0x87, 0xcd, 0xb7, 0x48, 0x59, 0x8b, 0xf9, 0x28, 0xf9, 0x25, 0x9c,
+- 0xd7, 0xe1, 0xc4, 0x68, 0xdc, 0xe6, 0xb7, 0xb8, 0x27, 0x24, 0xb9, 0x3a,
+- 0xa9, 0xbf, 0x89, 0x4b, 0xf3, 0x46, 0x3e, 0xa1, 0xec, 0xe9, 0xd4, 0x65,
+- 0x3d, 0x9f, 0xbb, 0xc4, 0xf6, 0x14, 0x6c, 0x47, 0xb6, 0xe7, 0x63, 0x01,
+- 0x75, 0x6b, 0x7f, 0x3f, 0xe8, 0xa9, 0xcb, 0xd8, 0x03, 0xcc, 0xe9, 0xe4,
+- 0x78, 0xda, 0x1e, 0xa7, 0x71, 0x66, 0xf9, 0xb8, 0x2d, 0x1c, 0xa3, 0xe6,
+- 0xc3, 0xb3, 0x7f, 0x47, 0x44, 0x5c, 0x8f, 0xcb, 0x7a, 0xd3, 0x05, 0x4f,
+- 0xe8, 0x9c, 0xf8, 0x62, 0xdd, 0xcf, 0xe5, 0x7c, 0xb4, 0x9d, 0xcb, 0x49,
+- 0x18, 0x0b, 0x95, 0xdd, 0xb4, 0x77, 0xc8, 0xe4, 0x54, 0xf6, 0xa8, 0xfb,
+- 0xd9, 0x0e, 0xf9, 0x67, 0xfa, 0x3f, 0x73, 0x80, 0x77, 0xf7, 0x22, 0x6c,
+- 0x1f, 0x34, 0xed, 0xb0, 0x8f, 0xa2, 0x51, 0xc5, 0x07, 0xc9, 0x86, 0xdf,
+- 0xef, 0xfa, 0x01, 0x9d, 0x0b, 0x4a, 0x3c, 0x79, 0x06, 0xe6, 0x09, 0xf8,
+- 0xb1, 0xac, 0x3b, 0x88, 0xb1, 0x3c, 0x27, 0x94, 0x8d, 0x83, 0x2a, 0xd7,
+- 0x30, 0xe0, 0x4d, 0x99, 0x7b, 0xc1, 0x41, 0xb5, 0x96, 0xe3, 0x71, 0x7e,
+- 0x5f, 0x36, 0xf4, 0x74, 0xac, 0xbf, 0x1b, 0x5e, 0xc6, 0xe0, 0xfc, 0xdc,
+- 0x51, 0xb6, 0xf3, 0x7d, 0x77, 0x1f, 0x3f, 0x4f, 0x34, 0x6b, 0x05, 0xdb,
+- 0x39, 0xf6, 0xc4, 0x25, 0xef, 0x96, 0x51, 0x5e, 0xf6, 0x00, 0x23, 0x9f,
+- 0x51, 0x9a, 0x6f, 0x07, 0x82, 0x4b, 0xfc, 0xed, 0x9e, 0x27, 0x88, 0xb9,
+- 0x7d, 0x9e, 0xdd, 0x3b, 0xa7, 0xb4, 0xcb, 0x3b, 0x6f, 0x6d, 0x57, 0x98,
+- 0x27, 0x51, 0x92, 0x93, 0x99, 0x3e, 0x99, 0xab, 0xd9, 0xfc, 0xc6, 0x93,
+- 0x31, 0x7a, 0xde, 0x83, 0xcb, 0xbc, 0x92, 0x71, 0x23, 0xc6, 0xe7, 0xee,
+- 0x81, 0x6f, 0x4e, 0x7a, 0x1e, 0x91, 0xf5, 0xfa, 0x4c, 0x47, 0xfe, 0x6d,
+- 0x97, 0xa1, 0xb3, 0x7f, 0x1d, 0x92, 0xde, 0x12, 0x7c, 0x32, 0x9f, 0xa7,
+- 0x47, 0xa4, 0x50, 0xef, 0xbc, 0x3b, 0x63, 0xae, 0x4f, 0xe7, 0x37, 0xb4,
+- 0x4a, 0x0f, 0xd6, 0x4a, 0xb4, 0xab, 0xa2, 0x8c, 0x4b, 0xb0, 0xdf, 0x7e,
+- 0xa3, 0x6f, 0xe1, 0x08, 0xf5, 0xbe, 0xc5, 0x12, 0x97, 0xb0, 0x41, 0x47,
+- 0xa8, 0x75, 0x52, 0x72, 0x34, 0x5a, 0x82, 0x8f, 0x3a, 0x62, 0xd6, 0x7d,
+- 0x3b, 0xde, 0xd9, 0xf7, 0x80, 0x69, 0xbf, 0xd7, 0xbc, 0xf7, 0x9a, 0xf7,
+- 0x00, 0xde, 0xeb, 0xad, 0x5a, 0x95, 0x73, 0xb2, 0xe4, 0xf7, 0x22, 0xbc,
+- 0xdb, 0xf2, 0x24, 0x74, 0x59, 0xa0, 0xa7, 0x7a, 0xe5, 0xf1, 0xba, 0xc2,
+- 0xaf, 0xe5, 0x2e, 0xd1, 0x20, 0xd8, 0x6f, 0x9e, 0xef, 0xe6, 0xc1, 0x4f,
+- 0xde, 0x91, 0x37, 0x3c, 0xec, 0x98, 0xdc, 0xec, 0x0e, 0x78, 0xb3, 0x80,
+- 0xf5, 0xd7, 0xe5, 0x41, 0x51, 0x47, 0x69, 0x5f, 0xb9, 0x50, 0xd1, 0xf9,
+- 0x3e, 0x27, 0x2b, 0x80, 0xb5, 0xf6, 0x3f, 0x0e, 0xe8, 0xdc, 0x14, 0x3f,
+- 0x9f, 0x91, 0xf9, 0xee, 0x23, 0x26, 0x27, 0x82, 0x63, 0x99, 0x57, 0xe9,
+- 0xdf, 0x39, 0x76, 0xda, 0xaa, 0xd4, 0x45, 0xd4, 0x33, 0xfc, 0x6e, 0x25,
+- 0x8d, 0xbe, 0x8b, 0x94, 0x35, 0xd0, 0x53, 0xbe, 0x2d, 0xf1, 0x39, 0xe5,
+- 0x1f, 0x76, 0x7e, 0xf7, 0x73, 0x0e, 0xb0, 0xfe, 0x65, 0x93, 0x71, 0xe1,
+- 0x1e, 0x09, 0x2c, 0xfb, 0x79, 0x50, 0x3c, 0x63, 0xda, 0x61, 0xfc, 0xb6,
+- 0xfa, 0x77, 0x77, 0xc5, 0x8c, 0x7d, 0x5b, 0x81, 0x74, 0x3e, 0xe7, 0x30,
+- 0xc7, 0xd4, 0xf1, 0xfc, 0x38, 0x33, 0x73, 0x6b, 0x68, 0x73, 0x1d, 0x14,
+- 0x5b, 0xc5, 0x8d, 0xd8, 0x56, 0x92, 0xfe, 0xc3, 0xbf, 0x4b, 0xde, 0xf8,
+- 0x47, 0xfc, 0x16, 0x46, 0xe7, 0x79, 0xab, 0x75, 0xa2, 0xda, 0x86, 0xe4,
+- 0x37, 0xda, 0x69, 0xf0, 0xd5, 0xbe, 0x2d, 0x9d, 0xf3, 0x1d, 0xc1, 0x7b,
+- 0x06, 0x74, 0x0c, 0x99, 0x2a, 0xfc, 0x1e, 0x9b, 0x7c, 0xc7, 0xef, 0xb1,
+- 0x3d, 0x95, 0x6f, 0xb2, 0x6d, 0xbe, 0x2f, 0xba, 0xde, 0x0c, 0x8a, 0xbd,
+- 0x34, 0xce, 0x6f, 0xd5, 0xf8, 0x6d, 0x23, 0x6c, 0xb5, 0x38, 0xda, 0x99,
+- 0xc7, 0x36, 0xa4, 0xf2, 0x54, 0xca, 0xcd, 0x8f, 0xa0, 0xfc, 0x34, 0xfc,
+- 0x75, 0x1d, 0x9f, 0x2f, 0x37, 0x99, 0xaf, 0xe2, 0xa8, 0x7b, 0xcf, 0xe4,
+- 0x52, 0x01, 0xeb, 0xf9, 0xdf, 0x3e, 0x47, 0x51, 0x47, 0xf8, 0x4a, 0x86,
+- 0x47, 0xfd, 0x5c, 0x84, 0x0d, 0x87, 0x3a, 0xa1, 0xd4, 0x8c, 0xa8, 0x1c,
+- 0x17, 0x6d, 0x8f, 0xd0, 0xd6, 0x0b, 0xa3, 0x2f, 0xf7, 0xda, 0x4b, 0x7d,
+- 0xd5, 0xa2, 0x4c, 0x4a, 0x61, 0x9d, 0x86, 0xca, 0x0f, 0x24, 0x9e, 0x5d,
+- 0xa7, 0x48, 0x7f, 0x4d, 0xc9, 0xf8, 0xc4, 0xe8, 0xac, 0xe4, 0x9d, 0x10,
+- 0x7c, 0xb1, 0xb2, 0xf2, 0x73, 0x5e, 0x80, 0x0d, 0x1d, 0xd9, 0x0a, 0x78,
+- 0xdc, 0x1b, 0xd7, 0xa6, 0x1f, 0xa2, 0xf7, 0xa3, 0xef, 0x8e, 0xc4, 0x2a,
+- 0xab, 0xef, 0xf5, 0x58, 0xcf, 0x7b, 0x01, 0xff, 0x7b, 0x6c, 0xe6, 0xef,
+- 0xc3, 0x4f, 0x68, 0x4e, 0xc9, 0xd9, 0xca, 0x7e, 0xe6, 0xc6, 0xa7, 0xb7,
+- 0x81, 0xb7, 0x93, 0xed, 0x7c, 0x7d, 0xe6, 0xb0, 0xf9, 0xba, 0x87, 0x67,
+- 0xc5, 0x5c, 0x79, 0xd2, 0x19, 0xf3, 0xe5, 0x69, 0x87, 0x0d, 0xc9, 0xe3,
+- 0x4d, 0x3f, 0x47, 0x7e, 0x2f, 0x3b, 0x9c, 0x34, 0xf8, 0x59, 0xf8, 0x86,
+- 0x7e, 0x2e, 0x24, 0x73, 0x36, 0x5b, 0xad, 0x93, 0x69, 0xde, 0xc7, 0xce,
+- 0x1c, 0x5d, 0xc3, 0x1e, 0xaf, 0xd5, 0x81, 0xc3, 0xe3, 0xac, 0x63, 0xee,
+- 0x56, 0xb7, 0xe4, 0xc6, 0x55, 0xbc, 0xaf, 0x77, 0xcd, 0xdd, 0x2f, 0x57,
+- 0x6b, 0x51, 0x95, 0x87, 0x56, 0x84, 0x9d, 0xdf, 0x90, 0xdb, 0x0e, 0xef,
+- 0xa3, 0x8f, 0xa8, 0xf1, 0x3e, 0xbf, 0x73, 0x9d, 0xa8, 0x1c, 0x59, 0xd7,
+- 0xf2, 0xe4, 0x54, 0x06, 0x76, 0xcb, 0x25, 0xb1, 0x3e, 0x9a, 0x19, 0x82,
+- 0xef, 0xcd, 0xb5, 0x52, 0x18, 0x07, 0xda, 0x89, 0x91, 0xd7, 0x7f, 0xd1,
+- 0x6a, 0x00, 0xde, 0xdb, 0x4d, 0xda, 0xeb, 0xb0, 0xa1, 0x66, 0x38, 0xc6,
+- 0x13, 0xfb, 0x02, 0xfb, 0x0c, 0x80, 0xfe, 0x42, 0xfa, 0x7b, 0xb4, 0xca,
+- 0x01, 0x69, 0x38, 0x6c, 0xe3, 0x73, 0x4c, 0x1a, 0x51, 0xdf, 0x4f, 0xf9,
+- 0x21, 0xf0, 0x17, 0x57, 0x32, 0xc9, 0xbf, 0xc3, 0x67, 0x4e, 0xe9, 0x5c,
+- 0xed, 0x18, 0x78, 0x28, 0x68, 0x6c, 0xb3, 0x20, 0xe6, 0xf8, 0xbe, 0xa3,
+- 0x6d, 0x05, 0xde, 0xf1, 0x6b, 0x5b, 0x44, 0xeb, 0x18, 0xde, 0xfb, 0x05,
+- 0xe1, 0x0b, 0xf8, 0x7c, 0x79, 0xc8, 0xd8, 0x14, 0x9d, 0xbe, 0x7c, 0x2a,
+- 0x76, 0x91, 0xff, 0x0f, 0x62, 0xf3, 0x83, 0x32, 0x0b, 0x98, 0xcf, 0x9b,
+- 0x7d, 0x3e, 0x92, 0x71, 0xe5, 0x56, 0x9d, 0x77, 0xf0, 0x07, 0x51, 0x32,
+- 0xdf, 0x90, 0x30, 0x8f, 0x99, 0x9c, 0x4a, 0x0f, 0x7b, 0x3d, 0x21, 0x2f,
+- 0xc3, 0xbe, 0x7e, 0xa5, 0x92, 0x4a, 0x1f, 0x51, 0x71, 0xe7, 0x44, 0xec,
+- 0xaa, 0x8c, 0xc5, 0xe9, 0x03, 0x96, 0x9c, 0x44, 0xec, 0x16, 0xe8, 0xe1,
+- 0x76, 0xe5, 0x50, 0x3f, 0xff, 0x27, 0x45, 0x03, 0xfa, 0xf0, 0xb6, 0xca,
+- 0x81, 0x49, 0x30, 0x66, 0x82, 0xf7, 0x21, 0x93, 0x87, 0xc3, 0x75, 0xd8,
+- 0x36, 0x24, 0x2f, 0x57, 0xda, 0xfa, 0x97, 0xeb, 0xe8, 0xdc, 0x36, 0xa5,
+- 0x5f, 0x8f, 0xf6, 0x53, 0x0e, 0x71, 0x3d, 0x3d, 0x87, 0xdf, 0x87, 0x78,
+- 0xf5, 0x63, 0x91, 0x8e, 0xfe, 0xbe, 0xc1, 0x62, 0xde, 0x0b, 0xf7, 0xfe,
+- 0x13, 0x47, 0xdb, 0x40, 0x1c, 0x97, 0x72, 0x8e, 0xaa, 0xf9, 0x78, 0xdf,
+- 0x3b, 0x24, 0x3f, 0x6e, 0xfa, 0xf3, 0x30, 0x1f, 0x87, 0x39, 0x3f, 0x94,
+- 0x7d, 0x9d, 0x30, 0x68, 0xfd, 0xff, 0xb2, 0x8a, 0xeb, 0x4d, 0xa2, 0x3f,
+- 0x75, 0x34, 0xe8, 0xa5, 0x1e, 0xd3, 0xff, 0xdf, 0xa1, 0x2d, 0xe3, 0xf8,
+- 0x4c, 0x7c, 0x72, 0x1d, 0xd8, 0xf8, 0x0f, 0x38, 0xa6, 0xdd, 0xb7, 0x4b,
+- 0x87, 0xc0, 0xaf, 0x27, 0xa4, 0xb1, 0x92, 0x8a, 0x3d, 0x2e, 0xfe, 0xbc,
+- 0xad, 0x87, 0x79, 0x2f, 0x56, 0xc8, 0x8c, 0x39, 0x0b, 0x0a, 0x1e, 0xde,
+- 0xdd, 0x26, 0x9c, 0xab, 0x58, 0xaf, 0xd1, 0xdc, 0x1d, 0x7b, 0x48, 0x64,
+- 0xb7, 0x24, 0x95, 0xd6, 0x67, 0x33, 0x22, 0x5b, 0x38, 0x9b, 0x3f, 0x31,
+- 0x67, 0xf3, 0x7e, 0xcc, 0xed, 0x5e, 0x18, 0x97, 0xd4, 0x85, 0x54, 0xfc,
+- 0xbc, 0xf0, 0x8e, 0xf9, 0x00, 0xef, 0x98, 0xad, 0x47, 0x32, 0x71, 0xec,
+- 0x37, 0x81, 0xfd, 0xa2, 0x6c, 0xf2, 0x99, 0xdf, 0xf7, 0xef, 0x23, 0x6f,
+- 0x3f, 0x4c, 0x99, 0x49, 0x5c, 0x14, 0x54, 0x1b, 0xec, 0x93, 0xa7, 0x08,
+- 0xd3, 0xbf, 0xe3, 0xf9, 0xa8, 0x58, 0xe8, 0xad, 0x26, 0xbf, 0x5b, 0xd5,
+- 0xf0, 0xe5, 0x01, 0xdf, 0xbc, 0x86, 0x2f, 0x3e, 0xdb, 0xb6, 0x5d, 0x13,
+- 0xb1, 0xb3, 0x42, 0x7b, 0x89, 0xf6, 0x0b, 0xed, 0xfa, 0xbf, 0xe9, 0xd7,
+- 0xb1, 0x3d, 0xf8, 0xb1, 0x0f, 0x64, 0xdb, 0x7b, 0xef, 0x42, 0xdf, 0x6b,
+- 0x19, 0x95, 0x63, 0xec, 0x4c, 0xc9, 0x7b, 0x25, 0xfb, 0x91, 0x44, 0x3c,
+- 0x6b, 0xb9, 0xc6, 0x06, 0x44, 0x59, 0xe7, 0x33, 0x65, 0xae, 0x6b, 0x6c,
+- 0x0b, 0x9e, 0x4d, 0x06, 0x6b, 0x29, 0xdc, 0xc2, 0x67, 0x1a, 0x02, 0xcd,
+- 0x93, 0xd6, 0xde, 0x05, 0x1e, 0xd2, 0xff, 0x13, 0xe3, 0x2a, 0xf0, 0x58,
+- 0x06, 0x1e, 0x4f, 0xdd, 0x65, 0x83, 0x85, 0xda, 0x36, 0xd8, 0xb6, 0x5a,
+- 0xef, 0x26, 0x60, 0xca, 0x3b, 0xb4, 0xbf, 0xca, 0x6d, 0x5a, 0x21, 0x4c,
+- 0xe3, 0xfc, 0x2e, 0x5b, 0xae, 0x67, 0x78, 0x1e, 0xb0, 0xc1, 0x30, 0xdf,
+- 0xda, 0x0e, 0x2d, 0x61, 0xff, 0x8a, 0x7e, 0x41, 0xbb, 0x09, 0x27, 0x68,
+- 0xf1, 0x2c, 0x38, 0x9f, 0x58, 0x37, 0x00, 0xcb, 0xb6, 0xa2, 0x03, 0x4d,
+- 0x03, 0xdb, 0xf5, 0xde, 0x37, 0xa0, 0x01, 0xee, 0x93, 0xf4, 0xe7, 0xd3,
+- 0x5e, 0xfb, 0xbb, 0x75, 0xf8, 0xb7, 0x25, 0xb9, 0xff, 0x90, 0x27, 0xb9,
+- 0x0b, 0x2d, 0x59, 0x48, 0x8b, 0x35, 0x76, 0x88, 0x34, 0x49, 0x3b, 0x01,
+- 0x36, 0x64, 0x8c, 0x38, 0xd6, 0xf6, 0xe0, 0xec, 0x57, 0xf7, 0xe3, 0xf7,
+- 0x6f, 0xfa, 0x79, 0xbf, 0x94, 0xdb, 0xa0, 0xbc, 0x12, 0xeb, 0xbe, 0x43,
+- 0xda, 0x3f, 0xbc, 0x1d, 0x05, 0xce, 0xd1, 0x9e, 0x7c, 0xa2, 0xcb, 0xc4,
+- 0x51, 0xb5, 0x5e, 0x4e, 0x3e, 0x41, 0xbc, 0xa2, 0xfc, 0xea, 0x4f, 0x1c,
+- 0x3f, 0x27, 0x49, 0xc7, 0x04, 0xc9, 0x17, 0x25, 0x99, 0xcf, 0x30, 0x27,
+- 0xb4, 0x57, 0x8e, 0x40, 0xae, 0x4d, 0x55, 0x26, 0xe5, 0x0b, 0x95, 0x88,
+- 0xb2, 0x1b, 0xfe, 0x2c, 0x9d, 0x8a, 0x8d, 0x5a, 0x2d, 0x79, 0x04, 0xf6,
+- 0xcf, 0xec, 0x50, 0x97, 0xbc, 0x32, 0xae, 0xf3, 0x6f, 0x6f, 0x33, 0xb9,
+- 0xce, 0x61, 0xce, 0x28, 0xf7, 0x03, 0xb9, 0x6f, 0xc1, 0x17, 0xb0, 0xba,
+- 0x65, 0x36, 0x1a, 0x91, 0xe9, 0x34, 0xca, 0x37, 0xa7, 0xd5, 0x37, 0xa4,
+- 0xd9, 0x68, 0xa7, 0x1c, 0x21, 0xcc, 0x2c, 0xdf, 0x62, 0xca, 0x9f, 0xf5,
+- 0x77, 0xc0, 0x62, 0xcd, 0x67, 0x02, 0x6a, 0x7f, 0xe5, 0x3a, 0xe5, 0x1b,
+- 0xc7, 0x40, 0x9e, 0x34, 0x79, 0x0f, 0x59, 0x92, 0x35, 0xc8, 0x97, 0x62,
+- 0x4d, 0xac, 0x8d, 0x0c, 0x2c, 0x6a, 0x57, 0xdb, 0x9f, 0x45, 0xd0, 0xd7,
+- 0x5c, 0x8d, 0xf2, 0x6f, 0x4a, 0xe5, 0x4e, 0xcf, 0xc1, 0xd6, 0x85, 0x4f,
+- 0x3c, 0xdb, 0xed, 0x99, 0x7b, 0xce, 0x5e, 0xc6, 0x43, 0x3a, 0x65, 0x98,
+- 0xff, 0x3f, 0x73, 0x0e, 0x0f, 0x48, 0x5f, 0x09, 0xe7, 0xe2, 0xdb, 0xdc,
+- 0xc0, 0x29, 0xd6, 0xcc, 0xa9, 0x73, 0xf2, 0xcf, 0x84, 0xb2, 0xa7, 0x33,
+- 0x67, 0xdb, 0xb7, 0x39, 0xc8, 0xb3, 0xd4, 0x17, 0x52, 0x0a, 0xc3, 0xa6,
+- 0xed, 0xb9, 0x00, 0xdd, 0x5d, 0xf3, 0x40, 0x2b, 0x93, 0xd0, 0x87, 0x93,
+- 0x52, 0x86, 0xed, 0xf6, 0xd1, 0xf4, 0x67, 0xc5, 0x7e, 0xea, 0xa0, 0xac,
+- 0xd5, 0x7a, 0x80, 0x0f, 0xea, 0x85, 0x90, 0xf2, 0xaf, 0x6f, 0x1f, 0xa7,
+- 0xbe, 0xa3, 0x2e, 0xd1, 0x67, 0xb1, 0x5d, 0xff, 0xc4, 0x80, 0xfe, 0x7e,
+- 0x65, 0xbf, 0x6c, 0xd5, 0x7d, 0x5d, 0x08, 0xff, 0xb0, 0x16, 0x32, 0x7a,
+- 0xb9, 0x17, 0xb2, 0xfb, 0xaf, 0x43, 0x0d, 0xe5, 0xab, 0x73, 0xff, 0xd4,
+- 0x41, 0xea, 0xff, 0x70, 0xf4, 0x36, 0x5c, 0xee, 0xbd, 0x53, 0x07, 0x69,
+- 0xbb, 0xc3, 0x39, 0xcc, 0xf5, 0x78, 0x1f, 0xc7, 0x3d, 0x46, 0x25, 0x74,
+- 0xf1, 0x84, 0xd8, 0xf0, 0x5b, 0x02, 0x4b, 0xb4, 0xf5, 0xee, 0xf4, 0x5d,
+- 0x02, 0x97, 0x6d, 0xf3, 0xad, 0xed, 0xb0, 0xb6, 0x65, 0x32, 0x28, 0x1b,
+- 0xfe, 0xf7, 0xb7, 0xfc, 0xdd, 0xe1, 0xdb, 0x1d, 0x78, 0x03, 0x5d, 0x8a,
+- 0xbf, 0xff, 0x0b, 0xc4, 0xbf, 0x6d, 0x24, 0x80, 0x4a, 0x00, 0x00, 0x00 };
++ 0xcd, 0x7c, 0x7f, 0x6c, 0x5c, 0xd7, 0x75, 0xe6, 0x79, 0x6f, 0xde, 0x90,
++ 0x43, 0x8a, 0xa2, 0x1e, 0x99, 0x31, 0x33, 0x8e, 0xd8, 0x7a, 0x86, 0xf3,
++ 0x48, 0xd1, 0x21, 0xe3, 0x3e, 0x33, 0x63, 0x99, 0x76, 0xa6, 0xd6, 0x64,
++ 0x66, 0x28, 0x2b, 0x0e, 0x69, 0xd0, 0x8e, 0x82, 0x4d, 0x01, 0x03, 0xe5,
++ 0x0e, 0xa9, 0x54, 0xd9, 0xf5, 0x22, 0xda, 0x34, 0x45, 0x8a, 0xa2, 0x88,
++ 0x26, 0x24, 0xe5, 0x2a, 0xcd, 0x88, 0x1c, 0xcb, 0x34, 0x1b, 0x14, 0x5e,
++ 0x64, 0x3c, 0xa4, 0x14, 0xb7, 0x1d, 0x89, 0x72, 0xe2, 0x2d, 0xbc, 0x58,
++ 0x07, 0x66, 0xa9, 0x1f, 0x4e, 0x83, 0x14, 0xf0, 0x2e, 0xbc, 0x68, 0x60,
++ 0xa4, 0x80, 0x20, 0xbb, 0x8d, 0xb3, 0xc8, 0x62, 0x83, 0xdd, 0x00, 0x71,
++ 0x02, 0x27, 0x6f, 0xbf, 0xef, 0xde, 0xfb, 0xc8, 0xd1, 0x88, 0x76, 0xd2,
++ 0xfc, 0xb5, 0x04, 0x06, 0xf7, 0xfd, 0xb8, 0x3f, 0xce, 0x3d, 0xf7, 0xdc,
++ 0x73, 0xbe, 0x73, 0xee, 0x79, 0x7c, 0x40, 0xa4, 0x53, 0xcc, 0xdf, 0x5e,
++ 0xfc, 0x32, 0xff, 0xe1, 0xb3, 0xb3, 0x63, 0x77, 0x65, 0xee, 0xc2, 0xe5,
++ 0x87, 0xed, 0xf7, 0x3b, 0x0e, 0x9f, 0x47, 0xf0, 0x8b, 0xe3, 0x37, 0x66,
++ 0xae, 0x77, 0xfb, 0x73, 0xf1, 0x3b, 0x68, 0x89, 0xcc, 0xfc, 0x4f, 0x11,
++ 0xab, 0xe5, 0x5d, 0xec, 0x5d, 0xda, 0xbc, 0xd7, 0x9f, 0xfd, 0x1b, 0xb4,
++ 0xf9, 0xd7, 0xfe, 0x45, 0x34, 0xd9, 0x6a, 0xde, 0xfc, 0x49, 0xcc, 0xce,
++ 0xce, 0x4c, 0xe6, 0x3d, 0x89, 0x45, 0xb2, 0x47, 0xa7, 0x66, 0x3d, 0x91,
++ 0x5c, 0x63, 0x24, 0x59, 0x90, 0x5f, 0x04, 0xe5, 0xb8, 0x23, 0x7c, 0xfe,
++ 0x5b, 0xd9, 0x77, 0xbe, 0xf6, 0xad, 0x7b, 0x53, 0x3f, 0xae, 0x45, 0x24,
++ 0xe6, 0x66, 0xdf, 0x16, 0x77, 0x48, 0x62, 0xfd, 0x68, 0xf3, 0xcc, 0x81,
++ 0x57, 0x6d, 0xe9, 0x0e, 0xfb, 0x72, 0x67, 0x22, 0x59, 0x99, 0x3e, 0x56,
++ 0x39, 0x19, 0xd8, 0x9e, 0x94, 0x9d, 0xac, 0x37, 0x5c, 0x97, 0xae, 0xf1,
++ 0x73, 0x99, 0x7b, 0x05, 0xf7, 0xd3, 0xc7, 0x1a, 0x31, 0x99, 0x6f, 0x94,
++ 0xbb, 0x6c, 0xcf, 0x43, 0x29, 0xb1, 0xb6, 0xec, 0x62, 0xec, 0x9a, 0xc7,
++ 0xb1, 0xbf, 0x8a, 0xb1, 0xf7, 0x4b, 0xd4, 0x0b, 0x82, 0x73, 0x18, 0xfb,
++ 0x70, 0xe3, 0x17, 0xc1, 0xb3, 0x8e, 0x1e, 0xd7, 0xce, 0x9e, 0x88, 0xb0,
++ 0xb4, 0xb2, 0xb5, 0xc9, 0x81, 0x06, 0xef, 0x8b, 0xed, 0x9a, 0x4e, 0xbf,
++ 0x13, 0x74, 0xc6, 0x9c, 0xec, 0x89, 0xce, 0x45, 0x94, 0xd1, 0x6c, 0x7c,
++ 0xec, 0x9c, 0xaa, 0xb7, 0x6e, 0xea, 0x3d, 0x1e, 0xd5, 0xed, 0xde, 0x9a,
++ 0x1c, 0x6a, 0xb0, 0xfc, 0xc9, 0xe4, 0xa0, 0x2a, 0xdf, 0x99, 0x4c, 0xab,
++ 0x52, 0xa6, 0x06, 0x54, 0xe9, 0x4c, 0x79, 0xaa, 0x7c, 0xc6, 0x3c, 0x7f,
++ 0x6e, 0x32, 0xa9, 0xca, 0x86, 0x29, 0x2f, 0x99, 0xf2, 0x05, 0x53, 0xbe,
++ 0x68, 0xca, 0x97, 0x4c, 0xb9, 0x69, 0xca, 0x2b, 0x93, 0xba, 0x9f, 0x6f,
++ 0x9b, 0xfb, 0xef, 0x9a, 0xf2, 0x55, 0x53, 0xbe, 0x66, 0xca, 0xef, 0x99,
++ 0xf2, 0xfb, 0x86, 0xae, 0xeb, 0xa6, 0x7c, 0xd3, 0x94, 0x3f, 0x32, 0xef,
++ 0x7f, 0x6c, 0xe8, 0x7d, 0x1b, 0x74, 0xfd, 0x49, 0xd4, 0xc8, 0x2a, 0xe6,
++ 0x9d, 0x94, 0xd9, 0x8a, 0x23, 0xf3, 0xcb, 0x11, 0x29, 0xa8, 0x35, 0xfc,
++ 0xca, 0x5e, 0xe9, 0x74, 0x64, 0x61, 0x23, 0x26, 0xd7, 0x95, 0x88, 0xbe,
++ 0x15, 0x7c, 0xeb, 0x80, 0x94, 0xed, 0xac, 0x2b, 0x97, 0x36, 0xe2, 0xf2,
++ 0xf2, 0x86, 0x58, 0xd3, 0x99, 0x0e, 0xb1, 0xcf, 0x7e, 0x40, 0x72, 0xae,
++ 0x25, 0x11, 0xc5, 0xd3, 0xa4, 0xe4, 0x2b, 0x7d, 0xb8, 0x4f, 0x25, 0x44,
++ 0xae, 0xee, 0xd5, 0xeb, 0x17, 0x93, 0xc8, 0x2a, 0xd7, 0xe4, 0xfe, 0xa9,
++ 0x6b, 0x2b, 0x09, 0x71, 0x96, 0x46, 0x31, 0x46, 0x97, 0x44, 0x57, 0xa5,
++ 0x3f, 0x22, 0x83, 0x89, 0x4f, 0xa3, 0x46, 0xb1, 0xe1, 0xc8, 0x44, 0xc3,
++ 0x12, 0xc7, 0x8b, 0x41, 0x3e, 0xba, 0xf0, 0x73, 0xf1, 0x8b, 0xe3, 0x97,
++ 0xc0, 0xef, 0x47, 0xe8, 0xa7, 0x5f, 0x0a, 0x0d, 0xf6, 0x89, 0x71, 0x97,
++ 0x31, 0xfe, 0x72, 0xca, 0x9d, 0x11, 0xd2, 0x95, 0x90, 0x6f, 0x1d, 0x20,
++ 0x5d, 0x2e, 0xe9, 0x01, 0x6d, 0x31, 0x2b, 0xbf, 0x22, 0x27, 0x0a, 0xbe,
++ 0x24, 0x6d, 0xaf, 0x53, 0x4a, 0xae, 0x95, 0x9c, 0x1b, 0xee, 0x95, 0xf2,
++ 0x51, 0xbc, 0x5f, 0x96, 0x9c, 0x8d, 0xfe, 0x4b, 0xae, 0xcc, 0xe8, 0x77,
++ 0x7c, 0xf6, 0x36, 0xf6, 0x6a, 0xca, 0xa5, 0xd0, 0xbe, 0xbc, 0xfc, 0xb7,
++ 0xb8, 0x66, 0x7f, 0x3f, 0x77, 0x34, 0xdd, 0x3f, 0xc5, 0x3d, 0x9f, 0x0f,
++ 0x99, 0x79, 0xf0, 0x9a, 0x75, 0xc3, 0x71, 0xc3, 0xf9, 0x72, 0xfc, 0x61,
++ 0xcc, 0x99, 0x34, 0x84, 0x73, 0x96, 0x72, 0x14, 0xb4, 0xd4, 0x57, 0xba,
++ 0xac, 0xb5, 0x95, 0x51, 0x79, 0x62, 0xf9, 0x01, 0xc9, 0xfb, 0x41, 0x30,
++ 0xeb, 0x4b, 0xdc, 0x96, 0x41, 0xb7, 0x80, 0x0a, 0x5b, 0x0d, 0xb1, 0xea,
++ 0x15, 0x89, 0xb5, 0x83, 0x2f, 0x3f, 0x58, 0x61, 0xdf, 0x0e, 0x9e, 0xf5,
++ 0xa1, 0x7e, 0xb7, 0xb5, 0xbe, 0x02, 0xfa, 0xb3, 0xe4, 0x4f, 0x10, 0x2c,
++ 0xfa, 0x83, 0x89, 0x39, 0x8c, 0x79, 0xb9, 0x31, 0x38, 0x7e, 0x43, 0x5c,
++ 0xf4, 0xd9, 0x8b, 0x3a, 0xe4, 0x15, 0xfb, 0x62, 0x9f, 0xec, 0xaf, 0x0b,
++ 0x6d, 0xe3, 0x78, 0x47, 0xba, 0x82, 0x20, 0xef, 0xbb, 0xbc, 0x97, 0x4d,
++ 0xf0, 0x6f, 0x93, 0xfc, 0xeb, 0xec, 0x97, 0x57, 0x1a, 0x1c, 0x63, 0x37,
++ 0xda, 0x47, 0xfe, 0x3f, 0xa4, 0x3d, 0x81, 0xfe, 0xe3, 0x28, 0xf7, 0x58,
++ 0xf5, 0x6a, 0x80, 0xf1, 0x13, 0xb8, 0xde, 0x6d, 0x1e, 0xd7, 0xd5, 0xda,
++ 0x5f, 0xc2, 0xda, 0xbb, 0xd9, 0xb8, 0x3c, 0xbf, 0xd1, 0x8f, 0x79, 0x24,
++ 0xe4, 0x1b, 0x90, 0xcd, 0x9e, 0x83, 0x7b, 0x24, 0x0d, 0xd9, 0xe4, 0x9a,
++ 0x8f, 0xad, 0xce, 0x49, 0x29, 0x9e, 0x1a, 0xa6, 0x1e, 0xcd, 0x8f, 0xed,
++ 0xc3, 0x7c, 0xb5, 0xb6, 0x1a, 0x58, 0xca, 0xed, 0xb7, 0xe5, 0x90, 0xd8,
++ 0x59, 0x8c, 0x9b, 0x19, 0x01, 0x2d, 0x11, 0xbc, 0x8b, 0x8b, 0xb7, 0x9a,
++ 0xc3, 0xb3, 0x54, 0xa2, 0x04, 0x1a, 0xe7, 0x41, 0x63, 0x49, 0xca, 0x62,
++ 0x5f, 0x7c, 0xce, 0x0a, 0xf7, 0x8a, 0xe6, 0xdd, 0xb0, 0xe9, 0x67, 0x5b,
++ 0xce, 0x2d, 0x7b, 0xb5, 0xcb, 0x8a, 0xac, 0x8e, 0xca, 0xa9, 0x5d, 0x78,
++ 0x56, 0x07, 0xcf, 0xec, 0xa5, 0x70, 0x1f, 0x38, 0xb8, 0xef, 0x43, 0xdd,
++ 0x6e, 0xcb, 0x59, 0xbd, 0x95, 0x5f, 0x6b, 0x8d, 0x41, 0x7f, 0x0b, 0xfc,
++ 0xb2, 0x57, 0x7b, 0x51, 0xe7, 0x56, 0x7e, 0xd5, 0xc1, 0x2f, 0x7b, 0x55,
++ 0xf3, 0xaa, 0x0e, 0x5e, 0xd9, 0x4b, 0x71, 0x94, 0x7b, 0x2c, 0xfb, 0xac,
++ 0xe6, 0x55, 0xdd, 0xec, 0x99, 0xf3, 0x4a, 0x5f, 0xe5, 0x40, 0xab, 0x25,
++ 0x5a, 0x67, 0xe5, 0x84, 0xba, 0x29, 0x92, 0x2d, 0x62, 0xaf, 0xdb, 0xe0,
++ 0x85, 0x23, 0xc5, 0x31, 0x4b, 0x66, 0xd5, 0xbb, 0xa2, 0xa4, 0x1b, 0x1f,
++ 0x00, 0x23, 0x47, 0x86, 0x61, 0x29, 0xca, 0x6d, 0xd9, 0x17, 0xed, 0xad,
++ 0x4a, 0x4c, 0x0a, 0x4e, 0x52, 0xbc, 0x25, 0xa5, 0xc7, 0x9b, 0xfa, 0x99,
++ 0x41, 0x3f, 0xdf, 0x01, 0x3f, 0x2c, 0xe8, 0x56, 0xbe, 0x7b, 0x4c, 0xed,
++ 0xfb, 0xf4, 0xaa, 0x23, 0x83, 0x4b, 0xac, 0x53, 0xb6, 0xaf, 0x34, 0xde,
++ 0x09, 0x74, 0xbf, 0x8f, 0x71, 0x4c, 0xd7, 0xce, 0x2e, 0xda, 0x97, 0xd7,
++ 0x4f, 0xdb, 0x57, 0x1b, 0xe8, 0xb7, 0xc1, 0xb5, 0xc0, 0x5a, 0x2d, 0x63,
++ 0xad, 0x96, 0xb1, 0x6e, 0x66, 0x4f, 0xd7, 0xd4, 0xde, 0x4a, 0x9a, 0x75,
++ 0x25, 0x0d, 0x5c, 0xdb, 0x04, 0xd6, 0x94, 0x6b, 0x2b, 0xd6, 0xab, 0x99,
++ 0x3d, 0x12, 0x39, 0x1b, 0x51, 0x6b, 0xda, 0xb3, 0xfa, 0x91, 0xed, 0x35,
++ 0x1d, 0x68, 0x5a, 0x53, 0xfb, 0x5d, 0xd6, 0xd4, 0xd9, 0x65, 0x4d, 0xb7,
++ 0x1a, 0x3f, 0x31, 0x6b, 0xfa, 0x73, 0x31, 0xb2, 0xff, 0x9e, 0xfc, 0x1a,
++ 0x00, 0xbf, 0xbc, 0x5f, 0x83, 0x5f, 0xce, 0xae, 0xfc, 0xea, 0xb3, 0x5b,
++ 0xf9, 0x15, 0x01, 0xbf, 0xa2, 0xbf, 0x36, 0xbf, 0xc0, 0x87, 0x5d, 0x79,
++ 0x15, 0x83, 0xde, 0x2b, 0x4b, 0x3e, 0x23, 0x92, 0xaf, 0x6a, 0x5d, 0x5d,
++ 0x56, 0x3a, 0x9b, 0xba, 0x2a, 0xd4, 0xd9, 0xd4, 0xd7, 0x6a, 0x9f, 0x58,
++ 0x85, 0x4a, 0x12, 0xba, 0xd4, 0x41, 0xf9, 0x1c, 0xca, 0x3d, 0xd6, 0x74,
++ 0xb5, 0x1f, 0x76, 0x36, 0x10, 0x77, 0x2c, 0xb4, 0x97, 0xe5, 0x84, 0x8b,
++ 0xb5, 0x71, 0xef, 0x8a, 0x8a, 0xf4, 0xa5, 0xc0, 0xa7, 0x14, 0xde, 0xa7,
++ 0x12, 0x39, 0xc9, 0xda, 0x21, 0xae, 0xc9, 0x57, 0x3a, 0xde, 0xce, 0xa9,
++ 0x2b, 0x3e, 0x67, 0xbb, 0x0c, 0x9e, 0x45, 0x65, 0x06, 0x76, 0xa0, 0xe8,
++ 0x71, 0x3c, 0xf6, 0x9f, 0x9c, 0xe1, 0xb8, 0x85, 0x46, 0xa8, 0xb3, 0x25,
++ 0x07, 0x1b, 0x8e, 0x77, 0xdc, 0xb7, 0xe3, 0x56, 0x41, 0xd9, 0xa0, 0x8c,
++ 0x78, 0x8d, 0x66, 0xfb, 0xb2, 0x4d, 0x27, 0xf6, 0x73, 0x0e, 0x72, 0x4d,
++ 0xda, 0x92, 0xd8, 0x7b, 0xc7, 0x22, 0xe1, 0xfa, 0x38, 0xd9, 0x71, 0x81,
++ 0x5d, 0x96, 0xf9, 0x0a, 0xfb, 0xfb, 0x63, 0x2b, 0x72, 0x31, 0xec, 0x9f,
++ 0x7c, 0x64, 0xdf, 0xba, 0xbf, 0xf9, 0xc6, 0x5b, 0x46, 0x37, 0x28, 0x5b,
++ 0x85, 0xfe, 0xca, 0x4d, 0xfd, 0x95, 0xad, 0xc8, 0x92, 0xec, 0x53, 0xf6,
++ 0xe0, 0x28, 0xf9, 0x77, 0x1a, 0xef, 0xae, 0x4b, 0x84, 0x32, 0xa3, 0xf6,
++ 0x18, 0xf7, 0xfb, 0x97, 0x38, 0xdf, 0x26, 0xde, 0x4e, 0xc3, 0xc6, 0x71,
++ 0x7f, 0x61, 0x8d, 0xe3, 0x7c, 0x7e, 0xc8, 0xd0, 0xe4, 0x48, 0x4e, 0xdd,
++ 0x7f, 0x63, 0x4f, 0xa8, 0x3f, 0xb1, 0x9f, 0x41, 0xdb, 0x8b, 0x6a, 0x8e,
++ 0x76, 0x36, 0x0b, 0xde, 0x34, 0xd3, 0xc8, 0x79, 0x67, 0xb1, 0xc6, 0xa1,
++ 0x0e, 0x0b, 0xd7, 0x8a, 0xb8, 0xc6, 0xb1, 0x16, 0x2a, 0x5d, 0xb0, 0x8f,
++ 0x31, 0x63, 0x83, 0xd9, 0x7e, 0x11, 0xed, 0xf9, 0x9c, 0x6d, 0xbb, 0x60,
++ 0x8f, 0xd9, 0x7e, 0xd1, 0xb4, 0xdf, 0xb1, 0xcb, 0xdc, 0x2b, 0xb4, 0xc9,
++ 0x57, 0x32, 0xc0, 0x42, 0x2b, 0xb6, 0x14, 0x7c, 0xe0, 0x1c, 0xbf, 0xdf,
++ 0xec, 0x0b, 0x2d, 0x9b, 0x1f, 0x75, 0x2c, 0x69, 0xf7, 0x76, 0x93, 0xcd,
++ 0x7f, 0xb0, 0xb5, 0xad, 0xdb, 0x91, 0xcd, 0x05, 0xe8, 0xa8, 0x53, 0x90,
++ 0x95, 0xc5, 0xed, 0x7a, 0x94, 0x4b, 0x25, 0xa3, 0x90, 0xcd, 0xd4, 0x38,
++ 0xa7, 0x79, 0xa5, 0xd1, 0x2c, 0xa3, 0x61, 0x1f, 0x31, 0x25, 0x07, 0x7a,
++ 0x9c, 0xc5, 0xa6, 0x71, 0x16, 0x9b, 0xc6, 0x59, 0x32, 0xd8, 0x8e, 0xfd,
++ 0x68, 0xbb, 0x7a, 0xfd, 0x26, 0x7b, 0xce, 0x35, 0xfb, 0x24, 0xf6, 0xa4,
++ 0x96, 0x05, 0x60, 0x35, 0xbd, 0x06, 0x15, 0x57, 0xe6, 0x37, 0x2e, 0x84,
++ 0x7b, 0xb5, 0xdc, 0x8e, 0xe7, 0x3f, 0xc4, 0xf3, 0xe1, 0x33, 0x2e, 0xec,
++ 0x14, 0xb1, 0xda, 0x4b, 0x72, 0xae, 0x42, 0x19, 0x79, 0x11, 0x74, 0xa7,
++ 0xfd, 0x36, 0x8b, 0x7c, 0x4d, 0x0d, 0x9f, 0x97, 0x54, 0x72, 0x5e, 0x46,
++ 0x7c, 0x96, 0x4f, 0x88, 0xc2, 0x58, 0xa2, 0x31, 0xd0, 0x8b, 0x90, 0x3f,
++ 0x91, 0x1f, 0x57, 0xda, 0xc5, 0x1e, 0xfb, 0x61, 0x40, 0x3b, 0x78, 0x7a,
++ 0xa3, 0xb5, 0x1f, 0x91, 0xa1, 0x33, 0xaa, 0x1f, 0xf4, 0x91, 0xf6, 0xbf,
++ 0xad, 0xfa, 0x0b, 0xfb, 0xc2, 0x3c, 0xc7, 0x5a, 0xfb, 0x73, 0xe4, 0xba,
++ 0x6b, 0xa3, 0xbf, 0xb4, 0x99, 0x23, 0xaf, 0x21, 0x23, 0xae, 0x83, 0xf2,
++ 0x61, 0x3b, 0x94, 0x19, 0x7b, 0xec, 0x3b, 0x41, 0x6e, 0x9a, 0x73, 0x2b,
++ 0x99, 0x67, 0xff, 0xc3, 0xc8, 0x9b, 0x54, 0xed, 0x2c, 0x78, 0x96, 0x19,
++ 0xc4, 0x78, 0xbc, 0x4f, 0x02, 0x1f, 0x49, 0x99, 0xf8, 0xac, 0x54, 0xf9,
++ 0x65, 0x90, 0x73, 0x34, 0xa6, 0xd2, 0x6b, 0xcf, 0xf7, 0x96, 0x14, 0x50,
++ 0x77, 0xc1, 0xe8, 0x83, 0x62, 0xe3, 0xba, 0xe2, 0xdf, 0xf3, 0x6a, 0x1f,
++ 0xa5, 0x4e, 0x97, 0xa9, 0x37, 0x36, 0xdc, 0x08, 0xf7, 0xf8, 0x25, 0xff,
++ 0xa5, 0x60, 0x61, 0x39, 0x95, 0x4c, 0xda, 0x83, 0x52, 0xaa, 0x0e, 0x96,
++ 0x6d, 0x94, 0x27, 0x6a, 0x09, 0x39, 0x51, 0x61, 0x3f, 0xfb, 0x51, 0x07,
++ 0x8a, 0xc8, 0xc6, 0x26, 0xef, 0xa3, 0xae, 0xe1, 0x98, 0x6f, 0x5b, 0x7a,
++ 0x4c, 0xcc, 0xc1, 0xdb, 0xb4, 0xfe, 0x63, 0xe3, 0x8a, 0x55, 0xaa, 0x71,
++ 0xfd, 0xf1, 0xbc, 0xd1, 0xac, 0x8f, 0x42, 0x5d, 0xb4, 0x83, 0xc5, 0x22,
++ 0xd9, 0x45, 0xab, 0xb4, 0x22, 0x76, 0xde, 0x8f, 0x12, 0x0f, 0x26, 0x45,
++ 0xee, 0x75, 0xf5, 0x3c, 0x3f, 0x19, 0xa1, 0x1e, 0x74, 0xbc, 0xd3, 0xe8,
++ 0xbb, 0x53, 0x72, 0x0e, 0xd7, 0x9f, 0xd7, 0x12, 0x44, 0xb2, 0x1e, 0x6d,
++ 0xa5, 0x13, 0xc9, 0x3a, 0xd8, 0x63, 0xac, 0xf3, 0x52, 0xc0, 0xbd, 0x90,
++ 0xaf, 0x6a, 0x19, 0x29, 0xef, 0x60, 0x2f, 0xd0, 0x9b, 0x83, 0x8e, 0x11,
++ 0x1b, 0x7b, 0xcc, 0x8d, 0x64, 0xf9, 0x7c, 0x1c, 0xd7, 0x9b, 0xa8, 0x4f,
++ 0x1d, 0x0b, 0x4c, 0x5a, 0x53, 0xbc, 0xc3, 0x58, 0x39, 0xab, 0x58, 0x09,
++ 0x79, 0xf2, 0x52, 0xf0, 0xe4, 0x72, 0x88, 0x11, 0x94, 0x6c, 0xc9, 0xc0,
++ 0xd9, 0xa4, 0xd9, 0xd7, 0x5d, 0xdc, 0x73, 0xe4, 0x3f, 0x9e, 0xf9, 0xe6,
++ 0x59, 0x7b, 0xd3, 0xb3, 0x70, 0xff, 0x7f, 0x09, 0xb4, 0xf5, 0x2b, 0xfe,
++ 0xd8, 0xd9, 0x23, 0x56, 0x5e, 0xe1, 0x93, 0x20, 0x28, 0x78, 0x51, 0x29,
++ 0x8d, 0xfe, 0x09, 0xe6, 0xca, 0x77, 0x65, 0x30, 0x9c, 0x76, 0x63, 0x78,
++ 0x72, 0xd6, 0x4b, 0x29, 0xfb, 0x9f, 0xc7, 0xfe, 0xd3, 0x3a, 0x53, 0xca,
++ 0x3d, 0xa0, 0xdd, 0x5b, 0xe2, 0x9a, 0xbc, 0x14, 0x9c, 0x05, 0x16, 0x9e,
++ 0x5e, 0x2a, 0x5a, 0x03, 0xd8, 0x12, 0x76, 0x9f, 0x05, 0x3e, 0x77, 0x49,
++ 0xfe, 0x22, 0xd7, 0x82, 0x75, 0xf8, 0xbc, 0x4d, 0xa6, 0xe3, 0xad, 0xb6,
++ 0xf2, 0xdc, 0x3e, 0xe9, 0x24, 0xbf, 0x51, 0x77, 0xe9, 0xff, 0x46, 0xb4,
++ 0x5e, 0x76, 0x65, 0x60, 0x95, 0x7c, 0x2f, 0x5a, 0xb3, 0x15, 0xea, 0xb1,
++ 0x0e, 0xd8, 0x47, 0x3e, 0x67, 0x9f, 0x78, 0x77, 0xbe, 0xb5, 0x8f, 0xdf,
++ 0x8b, 0xe8, 0x3e, 0xd8, 0x2e, 0xec, 0xa3, 0x99, 0x1f, 0x7b, 0x94, 0x9e,
++ 0xeb, 0xcd, 0xf6, 0xb6, 0xf4, 0x9b, 0x68, 0xea, 0x17, 0xef, 0xce, 0x7f,
++ 0x37, 0x42, 0x5c, 0xf6, 0xf2, 0x32, 0xf8, 0xac, 0xe6, 0xc4, 0x77, 0x6c,
++ 0x53, 0xb4, 0x0a, 0x4b, 0x41, 0x30, 0xed, 0xdb, 0x12, 0xe9, 0x0b, 0xeb,
++ 0xea, 0x79, 0x15, 0x31, 0xaf, 0x3c, 0xe6, 0x65, 0xf7, 0xb5, 0xd2, 0xf4,
++ 0xfb, 0x86, 0xa6, 0xde, 0x26, 0x9a, 0xe2, 0xef, 0x31, 0xaf, 0xf8, 0x2e,
++ 0xf3, 0x7a, 0xa9, 0x57, 0xf7, 0x11, 0x6f, 0xea, 0xa3, 0xaf, 0xa5, 0x0f,
++ 0xe8, 0xfd, 0x38, 0xdb, 0xf7, 0xed, 0xd2, 0xfe, 0x87, 0x1d, 0xba, 0x3d,
++ 0xdb, 0xb4, 0x41, 0xb7, 0xf7, 0x1b, 0xbd, 0x78, 0xa2, 0x49, 0x97, 0x9d,
++ 0x80, 0x2e, 0x6b, 0x6e, 0xd3, 0x2c, 0xff, 0xa1, 0x8f, 0x44, 0xff, 0x28,
++ 0xc4, 0x8a, 0x1f, 0x50, 0x18, 0x64, 0x07, 0x63, 0xc7, 0x80, 0x47, 0xba,
++ 0x60, 0xff, 0xbb, 0xe9, 0x07, 0x19, 0x4c, 0x48, 0xbf, 0x88, 0x38, 0x50,
++ 0x3c, 0xa0, 0x28, 0xe8, 0x96, 0xc1, 0xc4, 0x31, 0x11, 0xe5, 0x07, 0x11,
++ 0x5f, 0xd3, 0x27, 0xe2, 0x38, 0xf4, 0x89, 0xb8, 0xee, 0xbc, 0x2f, 0x6c,
++ 0xfb, 0x48, 0xfd, 0xd8, 0xf7, 0xc4, 0xc7, 0xdc, 0x33, 0xa1, 0xad, 0x69,
++ 0xd6, 0xa7, 0xbb, 0xd1, 0xd4, 0xdf, 0x42, 0x13, 0x74, 0x12, 0x7c, 0xb3,
++ 0x05, 0xc8, 0x23, 0x30, 0x29, 0x74, 0xe0, 0xfd, 0x53, 0xe7, 0x56, 0x44,
++ 0x4a, 0x0d, 0xda, 0xc7, 0x51, 0x81, 0x5f, 0x05, 0xba, 0xd8, 0xb7, 0xb2,
++ 0x91, 0xd0, 0x4d, 0xdd, 0x39, 0x3b, 0x3b, 0x08, 0x3f, 0xdc, 0x91, 0x39,
++ 0x43, 0xdb, 0x8c, 0xf2, 0xe1, 0xba, 0x50, 0x26, 0x94, 0x5c, 0xcd, 0x80,
++ 0x3e, 0x5e, 0xcf, 0x18, 0xec, 0x7e, 0xac, 0xd1, 0x4a, 0xdb, 0xf7, 0x40,
++ 0x9b, 0x07, 0x1a, 0x92, 0xf2, 0x02, 0xb0, 0xfb, 0x37, 0xd5, 0xbe, 0x0c,
++ 0x75, 0x17, 0x65, 0x29, 0x55, 0x2d, 0xcb, 0x66, 0xb0, 0xb2, 0xcc, 0x7d,
++ 0x4b, 0x1b, 0xde, 0x25, 0x65, 0xac, 0xd7, 0xc0, 0x52, 0x2a, 0x99, 0xb3,
++ 0xc5, 0x7a, 0xdf, 0x41, 0xca, 0xd3, 0xe3, 0x32, 0x70, 0x51, 0x2c, 0x67,
++ 0x09, 0x7b, 0xbd, 0x3b, 0xc4, 0x57, 0x9c, 0xdf, 0x6f, 0x63, 0x7e, 0xe8,
++ 0x7b, 0x39, 0x9c, 0x5f, 0x97, 0x94, 0x56, 0x39, 0xbf, 0xed, 0xb9, 0xc5,
++ 0x19, 0x11, 0xf9, 0x1c, 0xf4, 0x35, 0xe6, 0x08, 0x1a, 0xc7, 0x81, 0x73,
++ 0xef, 0x30, 0x73, 0xea, 0xc2, 0x9c, 0x60, 0xa3, 0x97, 0xd8, 0x1e, 0x74,
++ 0x81, 0xe6, 0x12, 0xea, 0xcd, 0x2f, 0x71, 0xcd, 0x41, 0x2b, 0xd6, 0xbd,
++ 0xd4, 0xe0, 0xda, 0x73, 0x6e, 0xda, 0xae, 0x3b, 0x1e, 0xe7, 0xc7, 0x79,
++ 0x0e, 0x63, 0x5e, 0xac, 0xc3, 0x76, 0xad, 0x32, 0x32, 0xfc, 0x1e, 0xeb,
++ 0xf1, 0xdb, 0x2d, 0xeb, 0x21, 0x66, 0x3d, 0x62, 0xd2, 0xb6, 0xaa, 0xfc,
++ 0x65, 0x45, 0x03, 0x7d, 0x08, 0x07, 0xf4, 0x2f, 0xae, 0xc8, 0x68, 0x54,
++ 0x48, 0x7b, 0x82, 0xcf, 0x32, 0x6d, 0x32, 0xe8, 0x5f, 0x81, 0x5c, 0x95,
++ 0x20, 0x0b, 0xf4, 0x07, 0x5e, 0x5e, 0xd6, 0x6b, 0x51, 0x6a, 0x74, 0xc2,
++ 0x47, 0xe7, 0xf8, 0xe4, 0x37, 0xe7, 0xe6, 0xaa, 0x75, 0x68, 0x5e, 0x97,
++ 0x4f, 0xdf, 0xb2, 0x2e, 0xd4, 0xbb, 0xd4, 0x03, 0xc4, 0x3d, 0xd4, 0x05,
++ 0x61, 0x4c, 0xa0, 0xe6, 0xea, 0xfd, 0x14, 0xda, 0x9f, 0xeb, 0xdb, 0xf8,
++ 0x52, 0xaf, 0x59, 0xc2, 0xc4, 0x05, 0xba, 0xc4, 0x5e, 0xbd, 0x83, 0x7a,
++ 0x1f, 0xf6, 0x27, 0x9c, 0xdf, 0xef, 0xe0, 0x3e, 0x71, 0xd3, 0x7a, 0xd8,
++ 0x98, 0x93, 0xa3, 0xe6, 0xa8, 0xd6, 0x62, 0x5b, 0xe6, 0xe6, 0x1a, 0x7a,
++ 0x5e, 0xce, 0xd2, 0x1e, 0xb3, 0x1e, 0x31, 0x3c, 0xe3, 0xbc, 0x42, 0x9b,
++ 0xc3, 0x79, 0x91, 0x5e, 0xd7, 0xc8, 0x1c, 0xe7, 0xc3, 0xfd, 0xd7, 0x2c,
++ 0x6b, 0x2f, 0x05, 0xd5, 0xe5, 0xa8, 0x9a, 0x7b, 0xde, 0xef, 0x26, 0x46,
++ 0xa3, 0x8e, 0x34, 0xfa, 0x89, 0xcf, 0x69, 0x07, 0xf1, 0x2e, 0x43, 0x19,
++ 0xc2, 0x7d, 0x9d, 0xf7, 0xcd, 0x36, 0xed, 0x79, 0x47, 0xeb, 0x01, 0xc6,
++ 0x9f, 0xde, 0xdb, 0xd6, 0x45, 0xb3, 0x62, 0xad, 0x57, 0xe8, 0x33, 0x07,
++ 0xc0, 0x5d, 0x77, 0x40, 0xaf, 0x1c, 0x92, 0x92, 0x0b, 0x7b, 0x3d, 0x7c,
++ 0x3b, 0xe6, 0x3c, 0x2e, 0x2a, 0xde, 0x30, 0xbc, 0x17, 0xd7, 0x7b, 0x94,
++ 0xef, 0x52, 0x1a, 0xfe, 0x90, 0xe4, 0xa6, 0x69, 0xd3, 0x7e, 0x5f, 0x66,
++ 0x60, 0x5b, 0x4b, 0xc3, 0x77, 0x82, 0x3e, 0xde, 0x43, 0x27, 0x7a, 0x43,
++ 0x8c, 0x51, 0xe0, 0xef, 0x71, 0x13, 0x9b, 0x39, 0x80, 0xfb, 0x3d, 0xa8,
++ 0xf3, 0x49, 0x53, 0xa7, 0x1b, 0x75, 0x06, 0x5b, 0xea, 0x70, 0xbc, 0xfb,
++ 0x50, 0x07, 0xf6, 0x14, 0x56, 0xd2, 0xf6, 0x0e, 0xe2, 0x37, 0x81, 0x67,
++ 0xf7, 0xe2, 0xd9, 0x3d, 0x78, 0x76, 0x0f, 0xee, 0x7f, 0xd7, 0xc4, 0x3c,
++ 0xc2, 0x36, 0xdd, 0xb8, 0xff, 0x12, 0xde, 0x43, 0xc7, 0xb9, 0xdf, 0xc6,
++ 0xfb, 0xfb, 0xf0, 0x1b, 0x6b, 0xa9, 0xe3, 0xb6, 0xdc, 0x9f, 0x76, 0x74,
++ 0x8c, 0x84, 0xcf, 0x82, 0xc8, 0xce, 0xf5, 0x7f, 0x35, 0xcf, 0xbd, 0xa6,
++ 0xf7, 0x1f, 0x37, 0xd7, 0xad, 0xb2, 0x94, 0x86, 0x2c, 0xf1, 0xfd, 0x57,
++ 0xf6, 0xe9, 0xb5, 0xb8, 0x43, 0xc7, 0x1f, 0x6e, 0xc2, 0x1b, 0x4a, 0xfc,
++ 0x71, 0xbd, 0x09, 0x9c, 0x41, 0xec, 0xd1, 0x8c, 0x3b, 0x48, 0x8b, 0xab,
++ 0xe4, 0xf5, 0xe5, 0xe5, 0xd7, 0xba, 0xf5, 0x18, 0x62, 0xd5, 0x21, 0x73,
++ 0x13, 0x2a, 0x16, 0xf1, 0x33, 0xf3, 0xcc, 0xdb, 0xb7, 0xf3, 0x6e, 0xaf,
++ 0x4c, 0x54, 0xff, 0x68, 0xdf, 0x0e, 0x6d, 0x93, 0x4d, 0xd7, 0x3b, 0x98,
++ 0x02, 0xfe, 0x84, 0xbd, 0x83, 0x77, 0x72, 0xf6, 0x5c, 0xa3, 0x68, 0xeb,
++ 0x71, 0x59, 0x07, 0xef, 0x1a, 0x9b, 0x3d, 0x8e, 0x92, 0xfd, 0x9c, 0x4d,
++ 0x5f, 0xa3, 0xbc, 0xc6, 0xeb, 0xdb, 0x51, 0x36, 0xb7, 0xed, 0x87, 0x1e,
++ 0xcf, 0xd9, 0x9a, 0xee, 0xd6, 0xf6, 0xe1, 0xbe, 0xf1, 0x65, 0xa1, 0x0a,
++ 0x99, 0xf3, 0x52, 0xc3, 0x65, 0xac, 0xdd, 0xac, 0x9f, 0x9a, 0xa6, 0x4c,
++ 0xc2, 0x9f, 0xfd, 0x94, 0xc8, 0xa4, 0xcc, 0x57, 0x1f, 0x06, 0xfe, 0x0e,
++ 0xe4, 0x21, 0xe0, 0x8a, 0x7f, 0x0f, 0x5c, 0x52, 0x83, 0xac, 0xd7, 0x1a,
++ 0x1e, 0x7e, 0xfd, 0xf2, 0x57, 0x95, 0x84, 0x3c, 0x07, 0x7f, 0x02, 0xb2,
++ 0x06, 0x3d, 0x9c, 0x76, 0x1f, 0x12, 0xe9, 0xb1, 0xe5, 0xf2, 0xbd, 0xb6,
++ 0x8c, 0x24, 0x07, 0xac, 0x74, 0x02, 0x3f, 0xb7, 0x0d, 0xbf, 0x22, 0x7c,
++ 0xb8, 0xb5, 0x06, 0x63, 0x01, 0x71, 0xf9, 0xeb, 0xf5, 0x24, 0x7e, 0x7d,
++ 0xf2, 0x37, 0xeb, 0x1c, 0x7f, 0xc0, 0x94, 0x6a, 0x1f, 0xc3, 0xe7, 0x28,
++ 0xcb, 0x62, 0x26, 0x21, 0x0b, 0x95, 0xe0, 0xa4, 0xf6, 0x99, 0x3d, 0xf8,
++ 0xc8, 0xdc, 0xb3, 0x2f, 0x60, 0xcf, 0xe2, 0xb9, 0xc2, 0x9e, 0xa1, 0xdd,
++ 0x7b, 0x01, 0x76, 0x2f, 0x5c, 0x23, 0xce, 0xb3, 0x75, 0x7d, 0xd8, 0x2f,
++ 0xd7, 0x88, 0x7a, 0x9d, 0xba, 0x3c, 0x06, 0xfc, 0x10, 0xea, 0x76, 0xea,
++ 0x08, 0x6f, 0xdb, 0x0f, 0x7d, 0xe4, 0x60, 0x17, 0xb0, 0x86, 0xc4, 0xe2,
++ 0xd9, 0x9f, 0xca, 0xca, 0x59, 0xee, 0x1b, 0xda, 0xe3, 0xbb, 0x21, 0x6f,
++ 0xa9, 0xaf, 0x96, 0x89, 0x99, 0xbd, 0x0c, 0xf8, 0x51, 0x96, 0xe9, 0x83,
++ 0xab, 0xbd, 0x5a, 0x4e, 0x26, 0xc5, 0x39, 0xfb, 0x85, 0xa8, 0x74, 0x9f,
++ 0x94, 0x45, 0x1f, 0x7e, 0xa9, 0x5d, 0x0e, 0x22, 0x9e, 0x97, 0x28, 0x28,
++ 0xbf, 0x69, 0x05, 0x74, 0xc6, 0x64, 0xe2, 0x2c, 0xeb, 0x9c, 0x84, 0x8c,
++ 0xb5, 0x81, 0xe6, 0x76, 0x39, 0x15, 0x4f, 0x95, 0x0b, 0xf0, 0xf7, 0x6d,
++ 0xaf, 0x47, 0x06, 0xea, 0x2c, 0x89, 0x41, 0xfe, 0x37, 0xe4, 0x87, 0xd7,
++ 0xf0, 0x03, 0x57, 0xf9, 0x7c, 0x00, 0x25, 0x9f, 0x7b, 0xd0, 0x2f, 0xe4,
++ 0x07, 0x70, 0xc3, 0xc5, 0xb2, 0x9c, 0xca, 0x4c, 0x4a, 0xbd, 0x2a, 0xd6,
++ 0x42, 0x06, 0x7b, 0xa0, 0x96, 0x95, 0x3a, 0x78, 0x51, 0x6a, 0x1c, 0x87,
++ 0xdf, 0xf9, 0x26, 0xca, 0x39, 0x94, 0xd7, 0x51, 0x3e, 0x8e, 0xf2, 0x2d,
++ 0x94, 0xa4, 0xfd, 0xb8, 0xd4, 0x6b, 0x7b, 0xda, 0xa4, 0x93, 0x7d, 0x6c,
++ 0x18, 0x9a, 0xe1, 0x3b, 0x1e, 0x3c, 0x0e, 0x2c, 0x1a, 0x3e, 0x3f, 0x2e,
++ 0x52, 0xff, 0x0c, 0x7e, 0x0f, 0xaa, 0x7b, 0xfa, 0x96, 0x0b, 0x99, 0x71,
++ 0xe0, 0x7a, 0xb1, 0x4e, 0x65, 0x1e, 0x37, 0xfd, 0x7c, 0x06, 0xe3, 0x5d,
++ 0xc5, 0xd8, 0x31, 0xc8, 0x48, 0x20, 0x8f, 0xf8, 0x27, 0xe5, 0x73, 0xfe,
++ 0x7e, 0x19, 0xeb, 0x8d, 0x95, 0x63, 0x59, 0xce, 0x9f, 0x7a, 0x6a, 0xb7,
++ 0xf9, 0x87, 0xf3, 0xe6, 0x9c, 0xa1, 0x5b, 0x97, 0xf6, 0x6a, 0xdc, 0x6d,
++ 0x7f, 0x39, 0xaa, 0x69, 0xb1, 0x64, 0x60, 0x88, 0xfd, 0x65, 0x25, 0x72,
++ 0x76, 0xc8, 0xcd, 0xd8, 0x23, 0xf0, 0x52, 0xd2, 0xf8, 0x9d, 0x84, 0xfc,
++ 0x79, 0xa7, 0x07, 0xec, 0xdb, 0x40, 0x13, 0xde, 0xd5, 0x39, 0x0e, 0xec,
++ 0xe9, 0x3d, 0xaf, 0x62, 0x6e, 0x65, 0x69, 0xbf, 0x27, 0x2b, 0x37, 0x1a,
++ 0xbc, 0x86, 0x3d, 0xba, 0x30, 0x29, 0xff, 0x5c, 0xbd, 0x2a, 0x4f, 0x54,
++ 0x27, 0xe5, 0x0d, 0x94, 0x8b, 0xd5, 0x32, 0xf8, 0xc8, 0x58, 0x3c, 0xfb,
++ 0x08, 0xb0, 0x2e, 0x83, 0xf0, 0x8d, 0x3e, 0x98, 0x98, 0xc3, 0xfa, 0xcd,
++ 0xb8, 0x81, 0x9c, 0xf3, 0xcb, 0x72, 0x6e, 0x1c, 0x6d, 0x6a, 0x1d, 0x12,
++ 0x7d, 0x96, 0xf3, 0xed, 0x96, 0x02, 0x2c, 0x7a, 0x31, 0x43, 0x9d, 0xd9,
++ 0x29, 0x85, 0x5a, 0xab, 0xdc, 0x51, 0xde, 0xde, 0xb6, 0xea, 0xdb, 0x3a,
++ 0x60, 0xd3, 0xfa, 0x66, 0x83, 0x36, 0x78, 0x37, 0x7b, 0xaa, 0xe5, 0xae,
++ 0x5e, 0xa3, 0x4d, 0xdd, 0x91, 0xbd, 0x3a, 0xfc, 0xb9, 0x7a, 0xf5, 0xba,
++ 0x91, 0x3f, 0x25, 0xb7, 0x58, 0x17, 0x62, 0xf1, 0x9f, 0x08, 0xb0, 0x1f,
++ 0x78, 0x14, 0xc6, 0x09, 0xb5, 0x7f, 0x54, 0x03, 0xad, 0x85, 0x38, 0x71,
++ 0x06, 0xac, 0x5b, 0xed, 0x0b, 0x8a, 0x57, 0xde, 0xd9, 0x7e, 0xa9, 0x2e,
++ 0x93, 0xbf, 0x29, 0xd7, 0xb6, 0x95, 0x4f, 0x02, 0xbe, 0x7a, 0x58, 0x9f,
++ 0xf0, 0x7d, 0x0a, 0x7e, 0xd2, 0x49, 0x71, 0xc7, 0x3a, 0x31, 0x27, 0x5e,
++ 0x8b, 0x4c, 0x5f, 0x6c, 0xc5, 0x91, 0xa1, 0x9d, 0x68, 0x83, 0x3f, 0x1e,
++ 0xc5, 0x5a, 0x76, 0xc1, 0x9f, 0x86, 0x9f, 0x0a, 0x39, 0xfa, 0x33, 0x60,
++ 0xaf, 0xd3, 0xca, 0xb7, 0xe6, 0x9e, 0xea, 0x9e, 0x1a, 0x58, 0x67, 0xb9,
++ 0x77, 0x2a, 0x5d, 0x63, 0x19, 0x9f, 0xd2, 0xbe, 0x64, 0x62, 0x4a, 0xc7,
++ 0xed, 0x93, 0x53, 0x07, 0x54, 0xe9, 0x4d, 0x0d, 0xab, 0x72, 0x78, 0x6a,
++ 0x27, 0x66, 0x42, 0x9e, 0x8a, 0x95, 0xcf, 0x64, 0xa4, 0x58, 0x21, 0x8d,
++ 0xe2, 0x1c, 0x83, 0x3c, 0xcd, 0x01, 0xcb, 0xe4, 0x2b, 0xbe, 0x9c, 0xda,
++ 0xc8, 0x82, 0x66, 0xe8, 0x99, 0xac, 0x8f, 0x52, 0xcc, 0x5f, 0xd8, 0xb6,
++ 0x8d, 0x31, 0x32, 0xae, 0x99, 0xf1, 0x33, 0x7d, 0xfa, 0x99, 0xcd, 0x7f,
++ 0xec, 0x0f, 0xb2, 0x49, 0xfb, 0xf9, 0x0b, 0xf8, 0xc6, 0xe2, 0x94, 0x32,
++ 0x6c, 0xeb, 0xc3, 0x07, 0x17, 0xd9, 0x5a, 0x91, 0x58, 0x2c, 0xfb, 0x1d,
++ 0x89, 0x3d, 0x1d, 0x04, 0x3f, 0xf0, 0x53, 0x47, 0xca, 0x02, 0x5e, 0x59,
++ 0x78, 0xbe, 0xce, 0x77, 0xd4, 0x4d, 0x23, 0xee, 0x0d, 0xc8, 0x5c, 0xee,
++ 0xa8, 0xc8, 0x2b, 0x78, 0x56, 0x5f, 0xe1, 0x1a, 0x7c, 0x17, 0x6b, 0x60,
++ 0xd6, 0x44, 0x3d, 0x63, 0x3d, 0xf8, 0x58, 0x71, 0xce, 0x63, 0xc4, 0x6d,
++ 0x47, 0xfb, 0xda, 0x3a, 0xdb, 0xa4, 0xc6, 0x79, 0xe4, 0xf5, 0xca, 0xba,
++ 0x9e, 0xdf, 0xe1, 0xcc, 0xb0, 0x5c, 0xae, 0xa8, 0x3e, 0x20, 0xeb, 0xbf,
++ 0x44, 0x9b, 0x4d, 0xc8, 0x2d, 0x63, 0x53, 0x59, 0x99, 0x07, 0x4e, 0x9b,
++ 0xaf, 0xa4, 0x21, 0x3b, 0x8e, 0xcc, 0x24, 0x48, 0xb6, 0x27, 0x5b, 0x95,
++ 0x37, 0xdb, 0x88, 0x85, 0xf3, 0x1e, 0xaf, 0xc7, 0x51, 0x67, 0x5a, 0x88,
++ 0xb7, 0xf2, 0x19, 0xce, 0xa9, 0x99, 0x17, 0xfa, 0xaf, 0x84, 0xb5, 0x30,
++ 0x73, 0x54, 0x7f, 0x7a, 0x1c, 0xb4, 0x37, 0xe3, 0x14, 0x01, 0x53, 0xe0,
++ 0x6b, 0x4a, 0xfa, 0x82, 0xe3, 0xe4, 0x2b, 0x8e, 0x0c, 0x5c, 0xc0, 0xb6,
++ 0xca, 0x1a, 0x5e, 0x34, 0x42, 0x59, 0x0b, 0x31, 0x10, 0x65, 0x8b, 0x3c,
++ 0x48, 0x95, 0x37, 0xc1, 0xec, 0xde, 0xec, 0x35, 0x79, 0x74, 0x55, 0xcf,
++ 0xd9, 0x3e, 0x2f, 0x3c, 0x0b, 0x91, 0x1b, 0x2b, 0x29, 0xff, 0x3a, 0xf4,
++ 0x7d, 0x21, 0xee, 0x43, 0x56, 0xfe, 0x4b, 0x1b, 0xf6, 0xf4, 0x78, 0xce,
++ 0xde, 0xdf, 0xae, 0x6d, 0xac, 0x83, 0x3d, 0x01, 0xac, 0x59, 0xc9, 0xa1,
++ 0x4d, 0xbb, 0xfc, 0x5b, 0x07, 0xd7, 0xc4, 0x9e, 0x78, 0x66, 0xec, 0x22,
++ 0xae, 0x75, 0x7f, 0xf3, 0x98, 0x87, 0x8e, 0x03, 0x5b, 0xf2, 0x28, 0x2c,
++ 0x88, 0xa0, 0xff, 0x01, 0x33, 0xd6, 0xc0, 0xf9, 0x50, 0x36, 0x40, 0xf7,
++ 0x6a, 0x16, 0xf8, 0xdd, 0x31, 0x7e, 0x2b, 0x75, 0x8c, 0xec, 0xe2, 0xf7,
++ 0x34, 0xc7, 0x5e, 0x63, 0x2a, 0x4e, 0x47, 0x2c, 0x47, 0xd9, 0x3a, 0x62,
++ 0x64, 0xeb, 0x33, 0x90, 0xad, 0xe3, 0x4a, 0xb6, 0x02, 0xf9, 0x81, 0xef,
++ 0xcb, 0x97, 0x77, 0x95, 0xaf, 0xd6, 0xbf, 0x2e, 0xd0, 0xcb, 0x5f, 0x9f,
++ 0x2c, 0xfc, 0x05, 0xc6, 0xbd, 0xe0, 0xe2, 0x3a, 0x95, 0x9b, 0x11, 0xf2,
++ 0x31, 0x81, 0xeb, 0x18, 0xca, 0x7e, 0x55, 0x67, 0xe0, 0x02, 0xec, 0x1a,
++ 0xe4, 0x8d, 0xfc, 0x9d, 0x87, 0x8d, 0x1b, 0xb8, 0x10, 0x85, 0x2d, 0xe4,
++ 0x9e, 0x95, 0x5e, 0x1b, 0xba, 0x81, 0xf5, 0xeb, 0xd8, 0x3b, 0x03, 0x17,
++ 0xba, 0x50, 0x26, 0x55, 0x5f, 0xf5, 0x8a, 0xa7, 0xda, 0xd7, 0x2b, 0xc3,
++ 0xaa, 0x5d, 0xbd, 0x32, 0x8a, 0x12, 0xfa, 0x3d, 0xe3, 0xcb, 0xd0, 0x85,
++ 0x8c, 0x24, 0x2f, 0x58, 0x52, 0x9a, 0x0e, 0x82, 0x18, 0x68, 0x1f, 0xbe,
++ 0xd0, 0x23, 0xd7, 0xa7, 0x39, 0x37, 0xea, 0x62, 0xb1, 0x16, 0x33, 0xd3,
++ 0xd8, 0x9b, 0xe4, 0x1f, 0xb0, 0xfe, 0x85, 0x22, 0x6c, 0x6e, 0x51, 0x4e,
++ 0xad, 0x90, 0x3f, 0x8c, 0xb5, 0x6f, 0x25, 0x22, 0x92, 0x82, 0x2e, 0x3b,
++ 0x2a, 0x73, 0xd5, 0x76, 0xe8, 0x32, 0xc7, 0xad, 0xcb, 0x13, 0x58, 0xa3,
++ 0x41, 0xca, 0x03, 0xf8, 0x92, 0x45, 0xdf, 0x45, 0x29, 0xa0, 0x4d, 0x71,
++ 0x65, 0xa7, 0x7e, 0x49, 0xda, 0xb1, 0xa7, 0x8e, 0xca, 0xb1, 0x2a, 0xfb,
++ 0x71, 0xdc, 0x79, 0x39, 0x00, 0x19, 0xf2, 0xdc, 0x09, 0xf4, 0x03, 0x1b,
++ 0xd9, 0xf4, 0xc7, 0xfd, 0x97, 0x7b, 0x0f, 0x99, 0x0c, 0xf7, 0x5d, 0xac,
++ 0xdc, 0x96, 0x9d, 0xb6, 0xb6, 0x32, 0xe2, 0xcc, 0x66, 0x1e, 0xb2, 0x5e,
++ 0xc9, 0x64, 0xac, 0x2b, 0x99, 0x9c, 0x75, 0x35, 0x53, 0xb4, 0xae, 0xc1,
++ 0x36, 0xd5, 0x37, 0xde, 0x81, 0xfc, 0x00, 0x4f, 0x10, 0x7b, 0x6f, 0xaf,
++ 0x61, 0xdc, 0xf8, 0x39, 0x6f, 0xc9, 0xb9, 0x0a, 0xed, 0x74, 0x70, 0x68,
++ 0xd6, 0x2f, 0xdf, 0x0e, 0xfa, 0x40, 0x07, 0xe3, 0x11, 0x3b, 0xb6, 0x23,
++ 0x9a, 0x1d, 0x06, 0x4e, 0xa0, 0xed, 0xe8, 0xa2, 0xed, 0xf0, 0x0b, 0xb2,
++ 0x57, 0xb6, 0xaa, 0x3a, 0x2e, 0x97, 0x07, 0x6e, 0xda, 0xaa, 0xc5, 0xe5,
++ 0xcb, 0xcb, 0xa1, 0x2c, 0x71, 0xbe, 0xf3, 0xef, 0xeb, 0x90, 0x88, 0x1c,
++ 0x51, 0xf6, 0xba, 0x5b, 0x2e, 0xaf, 0x03, 0xd3, 0x02, 0x81, 0xd8, 0x77,
++ 0x32, 0xce, 0x63, 0xab, 0xf8, 0x85, 0xf4, 0xf0, 0x3c, 0xf0, 0x1f, 0xc0,
++ 0x2b, 0x9e, 0xd9, 0x61, 0x9e, 0x3d, 0x9c, 0x51, 0x78, 0x3f, 0x8a, 0x3d,
++ 0xc9, 0x6b, 0x4b, 0x0a, 0xc0, 0xed, 0x5b, 0x15, 0x96, 0x09, 0x94, 0x26,
++ 0x56, 0x0f, 0x5d, 0x10, 0xc9, 0xfe, 0xa3, 0x7a, 0xdf, 0xee, 0x89, 0x35,
++ 0x0b, 0x3b, 0x5c, 0x5a, 0xa1, 0x4c, 0xa3, 0x5c, 0xd7, 0x63, 0x17, 0x7c,
++ 0x60, 0xe6, 0xd1, 0x0e, 0xda, 0x37, 0xe0, 0x27, 0xec, 0x7b, 0x85, 0xed,
++ 0x33, 0xd8, 0x73, 0x3f, 0x68, 0xa7, 0x6d, 0x3f, 0xec, 0x8f, 0xcb, 0xb5,
++ 0x0a, 0xaf, 0xf9, 0x3e, 0xe5, 0x8b, 0x8a, 0x1b, 0xc7, 0xa6, 0x16, 0x3d,
++ 0xdf, 0xec, 0x31, 0x15, 0xd3, 0xb1, 0x3e, 0x06, 0xcc, 0x38, 0x70, 0xa6,
++ 0x4d, 0xd2, 0x4f, 0xdb, 0x7d, 0xfa, 0x7c, 0xe5, 0x90, 0x14, 0xfd, 0x03,
++ 0x98, 0xc3, 0x3e, 0x99, 0x87, 0x2f, 0xb6, 0xb0, 0x31, 0x2c, 0xf3, 0xc3,
++ 0xf0, 0xb9, 0xdd, 0xbb, 0x89, 0xd5, 0xf0, 0xeb, 0xc0, 0xf3, 0x41, 0x94,
++ 0xed, 0x28, 0x6f, 0x97, 0xf9, 0xa7, 0xba, 0x63, 0xba, 0xbf, 0x68, 0xcb,
++ 0xfd, 0xb3, 0x1c, 0x3b, 0x99, 0xb4, 0x7e, 0x15, 0x2e, 0x6c, 0xc6, 0x84,
++ 0xa4, 0x23, 0x2a, 0xde, 0x93, 0x5d, 0x32, 0x78, 0xc6, 0x95, 0xa1, 0x33,
++ 0x09, 0x39, 0x70, 0xa6, 0x5f, 0x86, 0xcf, 0x24, 0xe5, 0xce, 0x33, 0x21,
++ 0xfe, 0xea, 0x9e, 0x4a, 0x1b, 0x5b, 0xe1, 0xfd, 0x9a, 0xb6, 0xe2, 0xce,
++ 0x86, 0xc6, 0xa8, 0xf3, 0x6b, 0xc4, 0x74, 0xaf, 0x62, 0xef, 0x6e, 0xaa,
++ 0xf3, 0xca, 0x4b, 0x1b, 0x41, 0x70, 0xc9, 0x6f, 0x77, 0xa7, 0x85, 0xfc,
++ 0xce, 0x00, 0x9f, 0xf9, 0xd0, 0x61, 0xa3, 0xd0, 0x61, 0xe3, 0xca, 0x36,
++ 0xd6, 0xbf, 0x2e, 0xd6, 0xb1, 0xcc, 0x03, 0xb2, 0x06, 0xd9, 0x7e, 0xd0,
++ 0x4f, 0x7d, 0x75, 0x53, 0xf1, 0x47, 0x62, 0x3d, 0xd0, 0x67, 0x77, 0xaf,
++ 0xb6, 0xcb, 0x1b, 0xf1, 0x20, 0x38, 0x0b, 0x1d, 0x50, 0xaf, 0x68, 0xf9,
++ 0xcd, 0x7b, 0xd4, 0x05, 0x0f, 0x61, 0xfe, 0xa3, 0x78, 0x96, 0x33, 0xba,
++ 0xbd, 0x43, 0x6e, 0xc4, 0x13, 0xb2, 0x7e, 0x60, 0xbc, 0xa5, 0x5e, 0x06,
++ 0xf7, 0xc0, 0x3d, 0x8d, 0xdf, 0x23, 0xbf, 0xf0, 0xdc, 0x95, 0x73, 0xf0,
++ 0x99, 0xcf, 0x1f, 0x48, 0x8d, 0x27, 0x6d, 0xea, 0xc3, 0xa4, 0xd4, 0xbe,
++ 0x9e, 0x90, 0xb5, 0x65, 0x6d, 0x97, 0x66, 0xbd, 0x71, 0x29, 0x00, 0xfb,
++ 0xae, 0x2d, 0x67, 0x51, 0xb2, 0x7e, 0xa8, 0x73, 0xb4, 0x5c, 0x16, 0x33,
++ 0x79, 0xec, 0x63, 0xee, 0x0f, 0x6d, 0x77, 0x6c, 0xbb, 0x1d, 0x72, 0xc4,
++ 0x3d, 0xf1, 0x30, 0x9e, 0xe7, 0xb1, 0xaf, 0x69, 0xc7, 0xd3, 0x90, 0xaf,
++ 0xcf, 0xc6, 0x28, 0x1f, 0x05, 0x9f, 0xf8, 0x9a, 0x6d, 0x52, 0x89, 0x34,
++ 0x9e, 0x4f, 0x4b, 0x5a, 0x9d, 0x0b, 0xcd, 0xfa, 0x61, 0x7f, 0x59, 0xa3,
++ 0x17, 0x22, 0x8c, 0x81, 0xe1, 0xef, 0x64, 0x8c, 0xf2, 0x18, 0xf1, 0xc2,
++ 0xe7, 0x23, 0xb0, 0x3d, 0x51, 0x35, 0xc6, 0xfc, 0x32, 0x9f, 0xa5, 0x5d,
++ 0xb6, 0x2f, 0xf8, 0xbc, 0x17, 0xf9, 0x44, 0x83, 0xf1, 0x9a, 0x98, 0x3c,
++ 0xda, 0xe8, 0x02, 0xbd, 0x6d, 0xbf, 0xc2, 0xf6, 0xec, 0xec, 0x73, 0x3b,
++ 0xbb, 0x95, 0x70, 0x95, 0x6e, 0xa1, 0x1e, 0xa1, 0x0e, 0x69, 0x17, 0x67,
++ 0x8c, 0xfb, 0x0c, 0x6b, 0xb2, 0x8c, 0x35, 0x5a, 0xc6, 0x1a, 0x2d, 0x63,
++ 0x8d, 0x96, 0xb1, 0x7e, 0xcb, 0xd4, 0x2d, 0x83, 0xd8, 0xcf, 0x39, 0x73,
++ 0x86, 0x40, 0xfd, 0xf2, 0x1c, 0xd6, 0x76, 0x5a, 0xfe, 0x76, 0x63, 0x52,
++ 0xfe, 0xf3, 0xc6, 0x11, 0xe0, 0xee, 0x22, 0xd6, 0x35, 0x87, 0x75, 0xcd,
++ 0x62, 0x5d, 0x8f, 0x62, 0x5d, 0xc7, 0x55, 0xcc, 0xb3, 0x5a, 0x49, 0x5d,
++ 0x2a, 0x2b, 0x8c, 0xff, 0x16, 0xe4, 0x61, 0x4c, 0x9c, 0xd5, 0x7e, 0xe8,
++ 0x8b, 0x72, 0x10, 0xf7, 0x82, 0x43, 0xc0, 0xd6, 0x18, 0xbb, 0x9c, 0x72,
++ 0x94, 0xee, 0xf3, 0xdc, 0xcf, 0x63, 0xaf, 0xbc, 0x2f, 0x9b, 0xaa, 0x52,
++ 0x75, 0x9d, 0xab, 0x0e, 0x4b, 0xe9, 0x22, 0xea, 0x9f, 0xed, 0x02, 0xad,
++ 0xc4, 0x7c, 0xa9, 0xd3, 0x25, 0xd9, 0x84, 0xbe, 0xcb, 0x81, 0xc6, 0x0f,
++ 0xc9, 0x7c, 0x3c, 0xf5, 0x9c, 0xc8, 0xb8, 0xdc, 0x03, 0x3f, 0x9d, 0xf1,
++ 0xcc, 0x9c, 0x8a, 0xb1, 0xe1, 0xfa, 0x62, 0x16, 0xfe, 0x36, 0x6d, 0xec,
++ 0x3e, 0xe3, 0x87, 0x6b, 0x1c, 0x5b, 0x13, 0x8e, 0xcb, 0xf1, 0xfe, 0x58,
++ 0xe6, 0x80, 0x15, 0xe1, 0xeb, 0x03, 0x8b, 0x78, 0x09, 0x8c, 0x19, 0x9b,
++ 0xbd, 0xe8, 0xc6, 0xe6, 0x2e, 0xb2, 0x9f, 0x98, 0x44, 0x96, 0xa8, 0xb3,
++ 0xd8, 0x0f, 0x74, 0x3b, 0xfa, 0x4e, 0xab, 0x33, 0xb3, 0x11, 0xb4, 0xfb,
++ 0x5d, 0xe0, 0x4c, 0xcd, 0xc7, 0xfc, 0x59, 0x6d, 0xf7, 0xf2, 0xf5, 0x66,
++ 0xac, 0x07, 0xdd, 0x02, 0xbb, 0x98, 0xab, 0x6b, 0xdc, 0x56, 0x54, 0xb8,
++ 0x4e, 0x63, 0xba, 0xa3, 0x72, 0xa8, 0x43, 0x3a, 0x3d, 0x35, 0x9f, 0xc8,
++ 0xd9, 0x4d, 0xe2, 0x58, 0x8c, 0xc1, 0x36, 0xd1, 0x26, 0xba, 0x33, 0xb0,
++ 0xa7, 0xb7, 0x77, 0x50, 0x66, 0x3e, 0x09, 0xdc, 0x38, 0xb0, 0xa4, 0xcf,
++ 0x98, 0x06, 0x2e, 0xfa, 0x98, 0x8f, 0xf4, 0x31, 0xb2, 0x69, 0x63, 0x0e,
++ 0x1f, 0x55, 0x76, 0x79, 0x0c, 0xb6, 0xd8, 0x85, 0xac, 0x53, 0xe7, 0xf4,
++ 0x61, 0xff, 0xf0, 0x9e, 0xba, 0x87, 0x7a, 0x8c, 0x32, 0x13, 0x07, 0x6e,
++ 0x82, 0xfe, 0xe9, 0xee, 0x97, 0xda, 0x06, 0xdf, 0xf5, 0x2b, 0x1d, 0xed,
++ 0x60, 0x0d, 0x16, 0x2b, 0xc1, 0xa1, 0xbc, 0x5f, 0x86, 0x16, 0x25, 0xcf,
++ 0xc9, 0x0f, 0xf2, 0x7d, 0x14, 0xb4, 0x91, 0xc7, 0xdd, 0x65, 0x7d, 0x6e,
++ 0xb9, 0x57, 0x4a, 0x55, 0xea, 0x69, 0x94, 0xb5, 0xbd, 0xf0, 0x9d, 0x5c,
++ 0x85, 0x65, 0x73, 0xd3, 0x9c, 0x7b, 0xac, 0xec, 0x42, 0x6e, 0xdd, 0x83,
++ 0x93, 0x2a, 0xa6, 0x72, 0x79, 0x29, 0xe5, 0xd7, 0x6c, 0x8c, 0x09, 0x9d,
++ 0x69, 0x9f, 0x1f, 0x93, 0xb9, 0x95, 0x6e, 0x19, 0x5c, 0xe5, 0xf9, 0xf2,
++ 0x50, 0x4c, 0xba, 0x83, 0xe0, 0x9c, 0x9f, 0x57, 0xb1, 0xc7, 0x81, 0x55,
++ 0x60, 0x82, 0xa3, 0x9a, 0x77, 0x9c, 0x2f, 0x74, 0xc4, 0xbf, 0x82, 0x8f,
++ 0xef, 0x8e, 0x8f, 0x8b, 0xbb, 0xe0, 0xe3, 0x57, 0x2f, 0x42, 0xfe, 0x96,
++ 0x21, 0x9b, 0xcb, 0x90, 0xcd, 0x65, 0xc8, 0xe6, 0x32, 0x64, 0x73, 0x19,
++ 0xb2, 0x89, 0xfd, 0xf3, 0xfc, 0xf2, 0xb8, 0xc1, 0x1f, 0x9f, 0x82, 0x2c,
++ 0x7f, 0xdb, 0xe0, 0x8f, 0x51, 0xc8, 0x70, 0x12, 0xb2, 0xeb, 0x43, 0x6e,
++ 0x87, 0x21, 0xcb, 0x1e, 0x64, 0xb9, 0x1f, 0x72, 0x9c, 0x50, 0xfe, 0xe3,
++ 0x04, 0xb0, 0xe8, 0x83, 0xf0, 0x41, 0xce, 0x57, 0xfb, 0x65, 0x51, 0xd1,
++ 0x12, 0xc8, 0x96, 0xbf, 0x49, 0x1e, 0x62, 0x5f, 0xd0, 0x3f, 0x77, 0xe5,
++ 0xfc, 0x5a, 0x48, 0xdb, 0xab, 0xf2, 0xcd, 0xca, 0x6b, 0xf2, 0x42, 0x85,
++ 0x34, 0xe6, 0x64, 0x11, 0xef, 0xd6, 0x9e, 0xa2, 0x1f, 0xa9, 0xe8, 0x83,
++ 0xcc, 0x9d, 0x94, 0xff, 0x03, 0x5e, 0xae, 0x6f, 0x7c, 0x58, 0x3e, 0xe7,
++ 0x52, 0x86, 0xe3, 0xd0, 0x35, 0xb8, 0x3f, 0x40, 0xbd, 0x04, 0x3f, 0xb4,
++ 0x92, 0x2a, 0x97, 0xa0, 0x27, 0xaa, 0xf6, 0x08, 0x30, 0x58, 0x39, 0xe8,
++ 0xa1, 0x0e, 0xab, 0x7a, 0xee, 0x80, 0x4d, 0xde, 0xec, 0x87, 0xbc, 0xa4,
++ 0xbe, 0x0a, 0xe1, 0xc5, 0x33, 0xda, 0x73, 0x94, 0x35, 0xe8, 0xcf, 0xa7,
++ 0xc8, 0x47, 0xfa, 0xb5, 0xb8, 0x56, 0xba, 0xf7, 0x27, 0x2a, 0x7e, 0x5c,
++ 0x9a, 0x86, 0x2f, 0xbf, 0x46, 0x3e, 0x41, 0x56, 0x9e, 0x22, 0x1f, 0x49,
++ 0x9f, 0xe6, 0xe3, 0x23, 0x12, 0xf2, 0x90, 0xef, 0x5a, 0x79, 0x08, 0x27,
++ 0xaa, 0x33, 0x8e, 0xb9, 0x7f, 0x2d, 0x66, 0x62, 0xc8, 0xc6, 0x26, 0xbf,
++ 0x2a, 0xd3, 0x0d, 0xce, 0xc7, 0x92, 0xdb, 0xbc, 0xab, 0xf0, 0xa9, 0x38,
++ 0xf6, 0xab, 0xc1, 0xa3, 0x71, 0xce, 0x81, 0xeb, 0xba, 0x47, 0xea, 0x7d,
++ 0xbe, 0x89, 0xaf, 0xfc, 0x2a, 0x5b, 0xc4, 0x7a, 0xe0, 0x3b, 0xf4, 0xcb,
++ 0x0b, 0xcb, 0xe0, 0x37, 0xfc, 0xae, 0x6f, 0xc0, 0xef, 0x62, 0x9c, 0x53,
++ 0xaf, 0xcf, 0xb8, 0x89, 0xd9, 0xb6, 0xc6, 0x6a, 0x93, 0x58, 0x23, 0xfa,
++ 0xed, 0xa9, 0xf2, 0x75, 0xe8, 0xc1, 0xe7, 0x7d, 0xc6, 0xf8, 0x02, 0xf9,
++ 0xef, 0x7e, 0xb3, 0xa6, 0x53, 0xf1, 0x6d, 0x79, 0x04, 0xba, 0xf1, 0x51,
++ 0xe8, 0xc6, 0x4f, 0xdc, 0x92, 0xe7, 0x43, 0x79, 0xbb, 0x7f, 0x6a, 0x76,
++ 0x65, 0xb0, 0x1c, 0xb1, 0xfb, 0x31, 0xa7, 0xe6, 0xb6, 0x8c, 0xf1, 0x25,
++ 0x4d, 0x2c, 0xb6, 0x19, 0xb3, 0x86, 0xf1, 0x56, 0xca, 0x74, 0x20, 0xd7,
++ 0xfc, 0x72, 0x57, 0x44, 0x9d, 0x3f, 0x7b, 0xb4, 0x13, 0xbb, 0xfc, 0xbd,
++ 0xd8, 0xa1, 0xed, 0xf3, 0x5b, 0x46, 0xc6, 0x76, 0x72, 0x99, 0x26, 0x32,
++ 0xe1, 0x99, 0x73, 0x37, 0x6c, 0x1e, 0xf7, 0x6d, 0x2a, 0x99, 0xc3, 0xde,
++ 0x9e, 0xdf, 0xa0, 0x5d, 0x20, 0x9e, 0x6c, 0x63, 0x4c, 0x6f, 0xa6, 0x3d,
++ 0xcb, 0xd8, 0x41, 0x37, 0xfc, 0x97, 0xd7, 0xe5, 0xdc, 0xca, 0x3f, 0x75,
++ 0xe8, 0xfd, 0xa4, 0x73, 0xcf, 0xec, 0x8b, 0xad, 0x71, 0x54, 0xbd, 0x46,
++ 0x85, 0x4c, 0x37, 0x30, 0x0c, 0xfd, 0xa5, 0x6b, 0xca, 0x5f, 0x3a, 0xec,
++ 0x3b, 0xb2, 0x19, 0x67, 0x9f, 0xaf, 0xcb, 0xb1, 0x95, 0xe1, 0x4e, 0xc6,
++ 0x2b, 0x17, 0x97, 0x0f, 0xc8, 0x96, 0xd2, 0x65, 0x0f, 0xa3, 0x6e, 0x16,
++ 0x7b, 0x36, 0x08, 0x26, 0xfc, 0xb4, 0x7b, 0x5e, 0x46, 0x12, 0xe7, 0xc1,
++ 0xd3, 0x3f, 0x43, 0x1b, 0xf8, 0xd4, 0x41, 0x11, 0xcf, 0xae, 0xc2, 0x6f,
++ 0xbf, 0x21, 0xbc, 0x1e, 0x71, 0x4f, 0x43, 0x18, 0x72, 0x6e, 0xda, 0x7d,
++ 0x4b, 0x42, 0xdb, 0x45, 0x3b, 0xc5, 0x33, 0xeb, 0x3e, 0x29, 0xac, 0x6b,
++ 0x5a, 0xe7, 0x41, 0xeb, 0xa9, 0x15, 0x8e, 0xc1, 0x79, 0x91, 0xde, 0x7f,
++ 0xe2, 0x19, 0x07, 0xe6, 0xf2, 0x41, 0x60, 0x59, 0xe2, 0x28, 0x1d, 0x8b,
++ 0x28, 0xa0, 0x8d, 0xc2, 0x5a, 0x3e, 0xcf, 0x2b, 0xc9, 0xc7, 0x2f, 0xc2,
++ 0x6f, 0x88, 0x43, 0x8e, 0xf1, 0x7c, 0xbd, 0x39, 0xe6, 0xcb, 0xfa, 0xfa,
++ 0x1c, 0xed, 0x92, 0xf2, 0x11, 0xf2, 0xc0, 0x85, 0x93, 0xa8, 0xcb, 0x78,
++ 0x67, 0x10, 0x1c, 0xf7, 0xe1, 0xc7, 0x3f, 0x45, 0xd9, 0xbb, 0x53, 0x4a,
++ 0xca, 0xe7, 0x20, 0x86, 0x65, 0xfe, 0xc6, 0x96, 0x1b, 0xc3, 0xfe, 0x9c,
++ 0x86, 0x6d, 0xcb, 0xc3, 0xb6, 0x45, 0xee, 0x3e, 0x02, 0x3c, 0xab, 0xce,
++ 0xd9, 0x60, 0x3f, 0x39, 0xee, 0xc3, 0xd6, 0xdf, 0x67, 0x46, 0x81, 0x6f,
++ 0x1f, 0x00, 0xbe, 0x65, 0x1e, 0x59, 0x1e, 0x18, 0x97, 0xf8, 0xd6, 0x95,
++ 0xbf, 0xda, 0xc8, 0x43, 0xb7, 0x4d, 0x74, 0x52, 0x17, 0x1f, 0xd9, 0xb6,
++ 0xd3, 0x45, 0x63, 0xc7, 0xf7, 0x49, 0x41, 0x9d, 0xbb, 0x15, 0x95, 0xbd,
++ 0x9f, 0x5f, 0x27, 0xae, 0x87, 0xed, 0x5f, 0x87, 0xef, 0x57, 0xa1, 0x8f,
++ 0x96, 0xc3, 0xfd, 0x03, 0xb8, 0x7f, 0x08, 0xe5, 0x11, 0x94, 0xda, 0xf7,
++ 0xb9, 0xb4, 0x1c, 0xe9, 0xd4, 0x31, 0xde, 0x44, 0x93, 0xff, 0x43, 0x39,
++ 0x8c, 0x4f, 0xcd, 0x56, 0xc3, 0x38, 0xfd, 0x21, 0x39, 0xee, 0xeb, 0xb3,
++ 0xf5, 0x09, 0xf8, 0xeb, 0x9d, 0xc0, 0x60, 0x0f, 0x3d, 0x0d, 0x9b, 0x71,
++ 0xdf, 0x21, 0xb1, 0xef, 0xb3, 0x64, 0x76, 0x14, 0x74, 0x8f, 0x0e, 0x42,
++ 0x3f, 0xf7, 0xc3, 0xdf, 0x56, 0x7e, 0xb0, 0xc1, 0x9c, 0xd4, 0xfb, 0x71,
++ 0xf9, 0xf3, 0x8d, 0x10, 0x7b, 0xb6, 0x01, 0xa7, 0x32, 0x56, 0x98, 0x54,
++ 0xb8, 0xd9, 0xbe, 0x8d, 0xeb, 0xdf, 0x25, 0xf9, 0xdb, 0xc8, 0x53, 0x3e,
++ 0x03, 0xa6, 0x51, 0xd7, 0x71, 0x49, 0x9f, 0xe1, 0xba, 0xb5, 0x9b, 0x18,
++ 0x2f, 0x6d, 0x06, 0xcb, 0xbf, 0xec, 0xdc, 0xc6, 0x96, 0x8c, 0x01, 0x59,
++ 0xe3, 0x9d, 0x3b, 0x79, 0x69, 0xa1, 0xdc, 0x87, 0xf9, 0x04, 0x94, 0xff,
++ 0x4b, 0xa0, 0x9f, 0xf6, 0x9e, 0xb6, 0xc1, 0xb5, 0xa2, 0x07, 0x89, 0x05,
++ 0x22, 0xd2, 0xe6, 0x71, 0x9f, 0xd2, 0x4e, 0x1d, 0xc1, 0x9c, 0x88, 0x0d,
++ 0x3e, 0xdf, 0x2d, 0xdd, 0xc4, 0x07, 0x49, 0x3c, 0xbb, 0x8e, 0x7a, 0xbc,
++ 0x67, 0x3d, 0xf8, 0x52, 0xcb, 0x62, 0x45, 0x0e, 0xce, 0x41, 0xae, 0x3d,
++ 0x5c, 0x1f, 0x47, 0x39, 0x8c, 0xf2, 0x71, 0x94, 0xd4, 0x4f, 0x57, 0x65,
++ 0x56, 0xc7, 0x7f, 0x14, 0x0e, 0xa1, 0xed, 0x9c, 0xf6, 0xa9, 0x53, 0x4f,
++ 0x8a, 0x3d, 0xf6, 0x41, 0x3c, 0xa3, 0x1f, 0x8f, 0x91, 0xee, 0xff, 0x82,
++ 0x89, 0x3f, 0x6d, 0xc7, 0xac, 0x8c, 0x4e, 0x5e, 0x51, 0x31, 0xfc, 0xf5,
++ 0xa7, 0xe8, 0x23, 0xff, 0x54, 0x1e, 0xbd, 0x29, 0xb6, 0xb7, 0x1d, 0xcb,
++ 0x1a, 0x2f, 0x28, 0x5d, 0x4c, 0x7e, 0x40, 0x0f, 0xbb, 0x19, 0xf9, 0xfa,
++ 0x46, 0x0f, 0xf4, 0x5b, 0x5c, 0xde, 0x58, 0x09, 0x80, 0xd5, 0xb9, 0x37,
++ 0x47, 0x60, 0x33, 0x5d, 0x83, 0x03, 0xe2, 0xf2, 0x2f, 0x90, 0xf3, 0x7f,
++ 0xae, 0x24, 0xe4, 0xcd, 0x4a, 0x10, 0x5c, 0xf3, 0xd3, 0xfe, 0x61, 0x91,
++ 0xbb, 0xdb, 0x74, 0x0e, 0x00, 0x6a, 0xe8, 0x73, 0xfb, 0x79, 0x75, 0x76,
++ 0x8f, 0x7a, 0xd0, 0x3b, 0x6f, 0x36, 0x7e, 0x01, 0xbe, 0xea, 0x3e, 0x5b,
++ 0xdb, 0x6e, 0xe9, 0xb6, 0x3c, 0xfb, 0x4f, 0x6c, 0x4a, 0xda, 0xe4, 0x10,
++ 0xa4, 0xd1, 0x36, 0x3d, 0xbc, 0xb6, 0xdd, 0x9e, 0x6d, 0x33, 0xca, 0x5e,
++ 0x94, 0xd6, 0x7b, 0xa5, 0xfe, 0x17, 0xdc, 0x2b, 0xf0, 0x63, 0xd5, 0x99,
++ 0x11, 0x4b, 0x9e, 0x55, 0xb0, 0x4e, 0xd2, 0xbc, 0x1f, 0x30, 0xef, 0x3d,
++ 0x85, 0x5f, 0x9d, 0xed, 0x18, 0x20, 0x7c, 0xdb, 0xe5, 0xd4, 0x69, 0x65,
++ 0x47, 0x18, 0xb7, 0x5d, 0xa6, 0x7f, 0x4f, 0x5d, 0x3e, 0x69, 0xec, 0x09,
++ 0x7c, 0x8f, 0xda, 0x71, 0x99, 0x51, 0xd7, 0x9f, 0x90, 0x47, 0x5c, 0xf2,
++ 0xee, 0xa4, 0xf8, 0x63, 0x1a, 0x4b, 0x89, 0x89, 0x09, 0x76, 0x78, 0x27,
++ 0xe1, 0x9b, 0x29, 0x7b, 0xec, 0x7e, 0x4c, 0xc8, 0xe3, 0x36, 0xda, 0x8f,
++ 0x9c, 0x6d, 0x01, 0x83, 0x3d, 0x99, 0x91, 0xe7, 0x36, 0x50, 0x17, 0xeb,
++ 0xf5, 0x31, 0xc1, 0xfd, 0xb3, 0xb8, 0x67, 0x1c, 0xed, 0xe9, 0xb8, 0x44,
++ 0x9e, 0xee, 0x97, 0xf6, 0x33, 0xc4, 0x29, 0xe4, 0x69, 0x42, 0xda, 0xce,
++ 0x10, 0x2f, 0x33, 0xb6, 0x9c, 0x1a, 0xbf, 0x21, 0x8c, 0xe5, 0xa4, 0xfc,
++ 0x2b, 0xf8, 0x6d, 0x61, 0xde, 0xed, 0xf0, 0xc3, 0xdb, 0x2e, 0xe8, 0x76,
++ 0xf6, 0xb9, 0x3e, 0x00, 0xc3, 0x98, 0xd8, 0xf0, 0x59, 0xec, 0x0b, 0x2c,
++ 0xbb, 0x50, 0xf2, 0x1d, 0x48, 0x3a, 0x37, 0x60, 0xde, 0x41, 0x37, 0x5e,
++ 0xe0, 0xf8, 0xb0, 0x8f, 0xbe, 0xce, 0x17, 0x1d, 0x18, 0xf2, 0xe5, 0xd2,
++ 0x1a, 0x65, 0x93, 0x71, 0x74, 0x62, 0x97, 0x57, 0xc5, 0x5e, 0xca, 0x48,
++ 0xe4, 0x4c, 0x06, 0x72, 0xe8, 0xc3, 0xee, 0x12, 0xf3, 0xd1, 0xd6, 0xe1,
++ 0x39, 0xf0, 0x56, 0xfd, 0x29, 0xce, 0xe9, 0xaa, 0xd8, 0xf5, 0x5f, 0x65,
++ 0xc3, 0xc2, 0x7d, 0xc1, 0x31, 0x4e, 0xc2, 0xfe, 0x46, 0xe5, 0x73, 0x71,
++ 0xca, 0x8a, 0x96, 0xbd, 0xb4, 0x3d, 0xa4, 0x64, 0xb5, 0x48, 0xbb, 0xfc,
++ 0xd4, 0xed, 0x7b, 0xe0, 0xa7, 0x9d, 0x2e, 0x6f, 0xcb, 0x18, 0xf3, 0x42,
++ 0x03, 0xa9, 0x02, 0xef, 0xcc, 0x7b, 0x96, 0x2c, 0x78, 0x27, 0x15, 0x1e,
++ 0x7c, 0x14, 0xed, 0x4f, 0x98, 0xf6, 0x0b, 0x32, 0x64, 0x64, 0x5d, 0xc5,
++ 0x11, 0xa0, 0xc7, 0xb8, 0x66, 0xbc, 0xff, 0x2d, 0xf1, 0x7b, 0xb9, 0x9e,
++ 0x27, 0x65, 0x60, 0x4c, 0xe3, 0x90, 0x92, 0x4d, 0x1c, 0xf2, 0xae, 0x71,
++ 0x5a, 0x95, 0xcb, 0x57, 0xa8, 0xd0, 0xce, 0xec, 0x85, 0xfc, 0xc2, 0x27,
++ 0xda, 0x08, 0x63, 0xb5, 0x6a, 0x5f, 0x25, 0x06, 0x6c, 0x4b, 0xbc, 0xa1,
++ 0xa1, 0xe1, 0x12, 0xf0, 0xc9, 0x3c, 0x7c, 0x5e, 0xd2, 0xb1, 0x00, 0x3b,
++ 0xb7, 0xe6, 0xff, 0x4b, 0x70, 0x22, 0x9e, 0x3a, 0x3d, 0xf3, 0xae, 0xf1,
++ 0xfb, 0x30, 0x6e, 0xdf, 0x7c, 0x9e, 0xb2, 0x69, 0xfd, 0x61, 0xe3, 0x88,
++ 0xd2, 0x91, 0x37, 0xe3, 0xae, 0x30, 0x7e, 0x3f, 0x7d, 0x53, 0x1c, 0xb5,
++ 0xd4, 0x08, 0x73, 0xf0, 0x42, 0x3d, 0x7f, 0x1a, 0xba, 0x3a, 0x22, 0x37,
++ 0x80, 0x41, 0x27, 0xc0, 0xbb, 0x73, 0x6b, 0x65, 0xeb, 0x4a, 0x45, 0xd4,
++ 0x7d, 0xc1, 0x67, 0x4e, 0xde, 0x47, 0xc0, 0x3b, 0xd8, 0x98, 0x0d, 0xc7,
++ 0x9c, 0x29, 0x39, 0x78, 0x66, 0x2b, 0x9f, 0xb9, 0xa4, 0x74, 0xf3, 0xe1,
++ 0x2e, 0x9e, 0xb9, 0x5c, 0x5a, 0xfe, 0x28, 0xee, 0x79, 0xf6, 0x71, 0xa4,
++ 0xe5, 0xf9, 0x66, 0x4f, 0x54, 0x63, 0x37, 0xf0, 0x5d, 0xf3, 0xcd, 0x01,
++ 0xbf, 0x8b, 0x8c, 0xe7, 0x35, 0x88, 0x83, 0x3b, 0x0d, 0x0e, 0x26, 0xce,
++ 0xc2, 0x7a, 0x6d, 0x30, 0x0e, 0x43, 0xac, 0x15, 0x57, 0x7e, 0xa1, 0xc2,
++ 0x5e, 0xfe, 0x31, 0x93, 0x7f, 0x71, 0xab, 0x5c, 0xcd, 0x56, 0x42, 0x3c,
++ 0xd7, 0x2c, 0x57, 0xee, 0x6f, 0x20, 0x57, 0x13, 0x5d, 0x3a, 0xdf, 0x81,
++ 0x36, 0xcd, 0x92, 0x37, 0xaa, 0x7b, 0x64, 0xab, 0xfa, 0x20, 0x70, 0xb4,
++ 0xca, 0xfb, 0x90, 0x2d, 0xac, 0xc5, 0x83, 0x95, 0x49, 0x99, 0xa8, 0xc6,
++ 0xe4, 0x5a, 0xd5, 0x7e, 0xa0, 0x5d, 0x18, 0x07, 0x27, 0x36, 0xf9, 0x1b,
++ 0xa5, 0xdf, 0x7e, 0xe0, 0xef, 0xb4, 0xe7, 0xb9, 0xca, 0x0d, 0xb4, 0x9f,
++ 0xad, 0xde, 0x2b, 0x25, 0xd5, 0xbe, 0x7e, 0xcb, 0x18, 0x51, 0x33, 0x46,
++ 0xbd, 0x7a, 0x97, 0x89, 0xdf, 0x95, 0xe5, 0x12, 0xb0, 0xaf, 0x7d, 0x96,
++ 0xf3, 0xbd, 0xc3, 0xe4, 0x77, 0xc5, 0x9a, 0xfc, 0x91, 0xa8, 0xf1, 0x47,
++ 0x7e, 0x06, 0x3d, 0xfe, 0x94, 0x44, 0xbd, 0xb0, 0x2f, 0xe6, 0x6a, 0x27,
++ 0x4c, 0x6e, 0xc7, 0x5e, 0xf4, 0x75, 0x10, 0xef, 0xee, 0xc3, 0xef, 0x49,
++ 0xd4, 0xa3, 0xbd, 0xe2, 0xd9, 0x28, 0x31, 0x02, 0xcf, 0xeb, 0x7a, 0x51,
++ 0xaf, 0x03, 0x58, 0x72, 0xbf, 0x79, 0x16, 0xf6, 0x11, 0xd6, 0x0d, 0xef,
++ 0x9b, 0xcf, 0x53, 0x59, 0x2f, 0xd9, 0x74, 0x9e, 0x0a, 0x45, 0xa5, 0xda,
++ 0x86, 0xb6, 0x36, 0xb4, 0x51, 0xc9, 0x26, 0x1b, 0xf5, 0x56, 0x53, 0x9e,
++ 0xa7, 0xc6, 0x61, 0x57, 0x33, 0x9c, 0x6b, 0x5f, 0x53, 0x0e, 0x4a, 0xaa,
++ 0x4c, 0xfb, 0xc8, 0x78, 0xdf, 0x7a, 0x25, 0xb4, 0x1f, 0xb9, 0x1e, 0x9e,
++ 0x5b, 0x2c, 0xfa, 0x2a, 0x16, 0x97, 0x8c, 0x64, 0x69, 0x7f, 0xfc, 0xd8,
++ 0x16, 0x70, 0x65, 0x5d, 0x9d, 0xeb, 0x47, 0xf0, 0x83, 0x5d, 0x76, 0x2c,
++ 0x71, 0x3d, 0x3e, 0x2b, 0x1b, 0xbd, 0x03, 0x5d, 0x6e, 0xab, 0x3a, 0xc9,
++ 0xbc, 0xdf, 0x67, 0xee, 0x13, 0xb2, 0x56, 0xf9, 0x50, 0xbf, 0x9d, 0xfd,
++ 0x5f, 0xb7, 0xe7, 0x33, 0x3d, 0x3c, 0x7f, 0xc2, 0x33, 0xe2, 0xf5, 0xd7,
++ 0x54, 0x4e, 0xa3, 0xc6, 0x46, 0x0e, 0xcf, 0x2f, 0x81, 0x73, 0x7e, 0x04,
++ 0x9e, 0x84, 0xb8, 0xfb, 0x75, 0x99, 0x50, 0x98, 0xaa, 0x0d, 0xb6, 0xd2,
++ 0x60, 0xaa, 0xee, 0x14, 0x30, 0x15, 0xdb, 0xb7, 0xe2, 0x40, 0xbd, 0x97,
++ 0x22, 0x59, 0x1d, 0x57, 0x6d, 0x89, 0x15, 0x5b, 0x8f, 0x64, 0xc4, 0x3a,
++ 0x81, 0x1f, 0x65, 0xd4, 0x5e, 0x7a, 0x4d, 0xbc, 0xa5, 0x54, 0x95, 0xf9,
++ 0xb1, 0x0b, 0x1b, 0x3c, 0xc7, 0x03, 0x16, 0x4b, 0x50, 0x96, 0xf9, 0x6e,
++ 0x1a, 0x63, 0xbc, 0x06, 0xff, 0x73, 0x0f, 0xf8, 0x6d, 0x1b, 0x1e, 0xf9,
++ 0x26, 0x46, 0x11, 0x63, 0x2c, 0x18, 0x7b, 0x71, 0x5e, 0x61, 0x89, 0x52,
++ 0x7c, 0x11, 0xe5, 0x0f, 0x0d, 0x76, 0x78, 0xbd, 0x2b, 0x3c, 0xb7, 0x2f,
++ 0xc5, 0xbf, 0x84, 0xe7, 0xaf, 0xc3, 0x1f, 0x8c, 0x4a, 0x9b, 0x5a, 0xb3,
++ 0x10, 0x3b, 0xff, 0x3d, 0xea, 0x90, 0xfe, 0x3b, 0x4d, 0x7e, 0x0d, 0xf3,
++ 0x06, 0xd8, 0x1f, 0xec, 0x96, 0xca, 0xe1, 0xca, 0xa1, 0x64, 0x3b, 0xb6,
++ 0x79, 0x05, 0x75, 0x73, 0x98, 0x37, 0x9f, 0x4b, 0x5f, 0x44, 0x9a, 0x9f,
++ 0x7f, 0x14, 0xcf, 0x29, 0x87, 0xef, 0x37, 0x72, 0x18, 0xbe, 0xcb, 0x1b,
++ 0x3e, 0xdd, 0x8e, 0x31, 0xc8, 0xab, 0x66, 0xba, 0x38, 0x9f, 0x70, 0xcd,
++ 0xdb, 0x4c, 0xae, 0x01, 0x9f, 0xbd, 0xdf, 0x3c, 0x73, 0xcc, 0x1c, 0x3f,
++ 0xde, 0x65, 0xb0, 0x04, 0x76, 0x7b, 0xb8, 0x1f, 0x49, 0x67, 0xac, 0x09,
++ 0xb3, 0xfe, 0x61, 0xef, 0x4e, 0x1e, 0x26, 0x65, 0xce, 0x53, 0xb1, 0x23,
++ 0xe6, 0x8f, 0xe5, 0x6c, 0x9d, 0xb3, 0xf1, 0x8d, 0x9b, 0xe2, 0xdd, 0x4a,
++ 0xd7, 0xf2, 0x0c, 0xa4, 0x6a, 0x67, 0xdb, 0x7f, 0xed, 0xbc, 0xbb, 0x48,
++ 0x36, 0x6c, 0x07, 0x9c, 0xa6, 0xda, 0x24, 0x65, 0xae, 0xf1, 0x6e, 0x39,
++ 0x7a, 0xca, 0xbf, 0x30, 0x79, 0x10, 0xfb, 0x55, 0x1e, 0x04, 0xf5, 0xe2,
++ 0x5a, 0x35, 0x02, 0x5e, 0xf7, 0x31, 0x37, 0x0a, 0x7e, 0x4c, 0x0c, 0x73,
++ 0x45, 0x5f, 0xf1, 0xf7, 0xab, 0x5c, 0xa9, 0x88, 0x17, 0xe6, 0xf5, 0x72,
++ 0x1f, 0xde, 0xa1, 0xde, 0x7f, 0x7d, 0xa5, 0x9d, 0xf9, 0xaa, 0x28, 0xb9,
++ 0x47, 0x7f, 0x09, 0xfd, 0x18, 0x95, 0x42, 0xd5, 0x03, 0xfe, 0x89, 0x52,
++ 0x2e, 0xf1, 0x7c, 0x3f, 0xfc, 0x61, 0xc1, 0x3e, 0x69, 0x83, 0x6f, 0xa2,
++ 0x7c, 0x1d, 0xcc, 0x68, 0x87, 0x0e, 0x62, 0x70, 0x9d, 0x1f, 0x1a, 0x40,
++ 0x87, 0xcf, 0xcb, 0xda, 0xf8, 0xa2, 0xd4, 0xc7, 0x9b, 0x31, 0x2c, 0x30,
++ 0xaa, 0x5b, 0x0e, 0xea, 0x9e, 0x8a, 0x65, 0x1a, 0xdd, 0x72, 0xc2, 0xe0,
++ 0x4e, 0xae, 0x83, 0x2d, 0x85, 0xd1, 0x05, 0x25, 0x5f, 0x75, 0xb5, 0x1e,
++ 0x8e, 0x75, 0x59, 0xe5, 0xf9, 0x72, 0x0c, 0xe6, 0xfa, 0x46, 0x0c, 0x0e,
++ 0x3b, 0x65, 0xd6, 0xd5, 0xd9, 0x1b, 0xe6, 0xcc, 0x47, 0xb3, 0x87, 0x99,
++ 0xdb, 0x01, 0x6c, 0x3d, 0x3d, 0x35, 0x5b, 0xa1, 0x2d, 0x0c, 0x82, 0xba,
++ 0xbf, 0x89, 0x1e, 0x7f, 0xac, 0x30, 0xe4, 0x96, 0x68, 0xdd, 0xbe, 0xa0,
++ 0x72, 0x66, 0x27, 0xa7, 0xf2, 0x2a, 0x5e, 0xd8, 0x7c, 0x76, 0xf3, 0x5e,
++ 0xe7, 0x36, 0x31, 0xf8, 0xfe, 0x1d, 0x66, 0xfd, 0x63, 0x4e, 0xa9, 0xd2,
++ 0xe5, 0xcc, 0xaa, 0xb3, 0xb5, 0xac, 0xf9, 0x16, 0x27, 0x37, 0x95, 0x6e,
++ 0x7c, 0x76, 0x2f, 0xb1, 0x3e, 0xcf, 0x31, 0x0a, 0x15, 0x9e, 0xe3, 0xe8,
++ 0xf7, 0x69, 0xf3, 0x7e, 0xa0, 0xa1, 0xde, 0xa9, 0x78, 0x23, 0x63, 0x8c,
++ 0xed, 0x28, 0x6f, 0x54, 0xa8, 0x6b, 0xd0, 0x7f, 0x5c, 0xcf, 0x21, 0x92,
++ 0x2d, 0xc2, 0x3f, 0x25, 0x7d, 0x47, 0xa6, 0xf2, 0x2b, 0xcc, 0xdb, 0x7a,
++ 0x68, 0xea, 0x1a, 0xfc, 0xa5, 0x73, 0x9e, 0xce, 0x2b, 0x5f, 0x67, 0x1c,
++ 0x8c, 0xed, 0x54, 0x9f, 0x45, 0x13, 0xab, 0x3d, 0x3c, 0x35, 0xb8, 0x1e,
++ 0x91, 0x27, 0x4c, 0x1f, 0xbc, 0x4f, 0x6e, 0xfb, 0x52, 0x4a, 0xff, 0xc1,
++ 0x3f, 0x18, 0x85, 0x7f, 0xd0, 0x09, 0x5d, 0x4f, 0x3f, 0x83, 0xf8, 0xbb,
++ 0x13, 0x7b, 0x85, 0xe3, 0xdc, 0xa5, 0xc6, 0x89, 0x60, 0x9c, 0x59, 0xf8,
++ 0x38, 0x8c, 0x47, 0xe6, 0x3d, 0x07, 0x58, 0x02, 0xb6, 0xde, 0x63, 0xbc,
++ 0xdc, 0xc6, 0x9c, 0x87, 0xa1, 0x27, 0x98, 0xa3, 0x32, 0x11, 0xe6, 0x0d,
++ 0xa1, 0x9d, 0x6f, 0xda, 0x1d, 0x44, 0x3b, 0xfa, 0x07, 0x6c, 0x2b, 0xb7,
++ 0xd9, 0x32, 0xa8, 0xb0, 0x81, 0xf6, 0x6b, 0x48, 0x43, 0x0d, 0x73, 0xa5,
++ 0x5d, 0xc5, 0x9e, 0x53, 0xf3, 0x3a, 0xa8, 0xda, 0x59, 0xd9, 0x31, 0xd0,
++ 0x4e, 0xfc, 0x87, 0xbe, 0x97, 0x75, 0xbc, 0xb3, 0xa0, 0xe4, 0x08, 0x72,
++ 0x32, 0x1e, 0xe6, 0xbd, 0xe8, 0x76, 0x61, 0xfd, 0x81, 0xf5, 0x86, 0x19,
++ 0xff, 0xe7, 0x41, 0xee, 0x68, 0xa7, 0xf2, 0xad, 0x5f, 0xbe, 0x29, 0x07,
++ 0x8d, 0x6d, 0xc2, 0x3a, 0x91, 0x30, 0x2f, 0xb9, 0x89, 0xe6, 0xac, 0x59,
++ 0x73, 0xb6, 0x63, 0x6c, 0x58, 0xe5, 0xe2, 0xf3, 0x99, 0x33, 0x97, 0x61,
++ 0x1f, 0xcd, 0x67, 0x4d, 0xa3, 0xc0, 0x19, 0xda, 0x86, 0x94, 0x37, 0x3c,
++ 0xd8, 0xeb, 0x36, 0xac, 0x1d, 0x6d, 0xc2, 0xa0, 0xf1, 0x2d, 0xde, 0x2b,
++ 0xce, 0xca, 0x73, 0xcc, 0x51, 0xf8, 0xf5, 0x61, 0x7b, 0xae, 0x63, 0x6e,
++ 0xea, 0x5a, 0xc5, 0x93, 0x53, 0xcb, 0x3a, 0x3f, 0x4c, 0xf3, 0x81, 0x3a,
++ 0x9b, 0x6b, 0x9b, 0x94, 0x59, 0x8f, 0xb1, 0x9c, 0xa4, 0xbc, 0xe2, 0x35,
++ 0xe7, 0x39, 0xa1, 0xfe, 0xc6, 0xa8, 0xc9, 0xc7, 0x3e, 0x88, 0xf9, 0x13,
++ 0x37, 0x6a, 0x59, 0x3a, 0x00, 0x3b, 0xf4, 0x77, 0x0e, 0x70, 0x21, 0xf6,
++ 0xd3, 0x75, 0xa7, 0x79, 0x7e, 0xdb, 0xf9, 0xdf, 0x4a, 0x2e, 0x1d, 0xc8,
++ 0xc8, 0xe2, 0x36, 0xdf, 0xe1, 0xb7, 0xdf, 0x35, 0x04, 0x7d, 0x6f, 0x49,
++ 0x71, 0xd4, 0x4b, 0x2c, 0xf0, 0x5c, 0xc3, 0x1d, 0x01, 0xca, 0xa7, 0x1f,
++ 0x9d, 0x04, 0xbd, 0xbc, 0x1e, 0x04, 0x3e, 0x62, 0x4e, 0x22, 0xee, 0x99,
++ 0x13, 0x18, 0xf7, 0x40, 0xaf, 0xab, 0xce, 0x2b, 0xb4, 0xce, 0xfe, 0xfe,
++ 0x5e, 0xe6, 0xc0, 0xf5, 0x78, 0xe1, 0xda, 0xab, 0xef, 0xda, 0xd0, 0x77,
++ 0xc4, 0xbc, 0x9f, 0xd8, 0xe6, 0xbf, 0xf4, 0xb1, 0xdc, 0xce, 0x35, 0x33,
++ 0xb1, 0x17, 0xd6, 0x1f, 0x57, 0xb4, 0xcc, 0x42, 0x57, 0xcf, 0xa9, 0xf9,
++ 0xdc, 0x0f, 0x59, 0x88, 0xc8, 0xfc, 0xb6, 0xfc, 0xde, 0x0f, 0xf9, 0xdd,
++ 0xc3, 0x14, 0xcf, 0x5d, 0x64, 0x2d, 0x94, 0x31, 0xca, 0x17, 0x65, 0xeb,
++ 0xe3, 0xdd, 0xdc, 0x73, 0xe5, 0xed, 0x75, 0x77, 0x94, 0xcd, 0x4d, 0xda,
++ 0xe1, 0xba, 0xf3, 0x7a, 0xb7, 0xdc, 0xaa, 0x70, 0x7f, 0x64, 0x7e, 0x83,
++ 0xb5, 0xf5, 0xcd, 0xda, 0x66, 0x9a, 0xbe, 0x83, 0x08, 0xfb, 0x63, 0x0c,
++ 0x94, 0x36, 0x88, 0xe7, 0x50, 0xed, 0x52, 0x56, 0x32, 0x68, 0x29, 0x6c,
++ 0x9d, 0x73, 0xf3, 0x49, 0xc6, 0xbc, 0x8f, 0xc9, 0xbf, 0x03, 0xcd, 0xb9,
++ 0xe1, 0xa8, 0xe8, 0xb6, 0x33, 0xe0, 0xf7, 0xa6, 0x0b, 0x7f, 0x90, 0x67,
++ 0xd6, 0x15, 0x47, 0xce, 0xa9, 0x73, 0x57, 0xec, 0xd1, 0x4e, 0x47, 0x16,
++ 0xbd, 0xed, 0x73, 0x78, 0xa9, 0xa1, 0xce, 0x1a, 0xde, 0x3d, 0xb1, 0x4d,
++ 0x1b, 0xfd, 0x09, 0xf8, 0x52, 0xde, 0xcf, 0x83, 0x52, 0xfc, 0xa6, 0xba,
++ 0x46, 0xaf, 0x33, 0x4e, 0xc3, 0xf3, 0x01, 0x57, 0x0a, 0xf0, 0x0b, 0x0b,
++ 0xf0, 0x09, 0x0b, 0x4a, 0x2f, 0x30, 0x6e, 0xc3, 0x18, 0x5b, 0x19, 0x3e,
++ 0x48, 0x39, 0x68, 0xf7, 0x4e, 0xaa, 0x18, 0xe2, 0xa5, 0x8d, 0x54, 0xb9,
++ 0x2c, 0x5e, 0xf2, 0xc1, 0xed, 0x7c, 0xba, 0xee, 0x72, 0x2c, 0xdb, 0x1c,
++ 0x87, 0x4b, 0xaa, 0x5c, 0xb4, 0x0e, 0x60, 0xe4, 0xe3, 0xd0, 0xd5, 0xcf,
++ 0xfb, 0x8c, 0xbf, 0xdd, 0x49, 0x7e, 0x7f, 0x95, 0x93, 0xb4, 0x87, 0x46,
++ 0xc5, 0xbb, 0xe0, 0x0d, 0x3f, 0x28, 0xf4, 0x3f, 0x52, 0xc9, 0x23, 0xe4,
++ 0xdb, 0xf6, 0x37, 0x0d, 0xa1, 0x7d, 0x1d, 0x95, 0xc1, 0x0b, 0xaf, 0xab,
++ 0x33, 0x8e, 0x4f, 0xf8, 0xad, 0xb2, 0xa1, 0xe2, 0x77, 0xa3, 0x3d, 0x32,
++ 0x08, 0xdf, 0x57, 0x60, 0xa1, 0xf8, 0x8d, 0x83, 0x05, 0xdf, 0x43, 0xdd,
++ 0xcb, 0x74, 0x23, 0x69, 0xf2, 0x54, 0x69, 0x5f, 0x19, 0xdf, 0xd3, 0x79,
++ 0x7a, 0xcc, 0x4d, 0x65, 0xfe, 0x64, 0x51, 0xe5, 0xeb, 0x31, 0xd6, 0xc7,
++ 0x58, 0x1e, 0xe3, 0x7d, 0x8c, 0xdb, 0xe9, 0x5c, 0xbd, 0x89, 0xc6, 0x6e,
++ 0xb1, 0xbd, 0x30, 0x5f, 0x52, 0xdb, 0xad, 0xad, 0xcc, 0x3e, 0xd8, 0x3a,
++ 0x57, 0xc5, 0x4e, 0x4a, 0x6e, 0x8f, 0x1c, 0x1b, 0x6e, 0x07, 0xcf, 0x7b,
++ 0x55, 0x3e, 0x9d, 0xed, 0xdd, 0x0f, 0x1c, 0xcb, 0xf8, 0x1c, 0xb1, 0x69,
++ 0xc8, 0xe7, 0x7b, 0xf0, 0xec, 0x1d, 0xf0, 0x9e, 0xcf, 0x80, 0x5b, 0x95,
++ 0x1d, 0xfa, 0xbc, 0x6c, 0x55, 0x98, 0x03, 0x5f, 0xdb, 0x97, 0x57, 0xeb,
++ 0x41, 0xdf, 0x3c, 0xd4, 0x4d, 0x61, 0xfe, 0x28, 0x7d, 0x2a, 0xd7, 0x9c,
++ 0x93, 0xd3, 0x37, 0xef, 0x85, 0xbf, 0x4e, 0xfd, 0x63, 0xa9, 0xb1, 0xae,
++ 0x47, 0x3e, 0x20, 0xe5, 0xda, 0x6e, 0x67, 0xfe, 0x41, 0xf0, 0x0d, 0x5f,
++ 0xe5, 0xac, 0xc2, 0x9f, 0xd4, 0x6b, 0xac, 0xbf, 0x8f, 0x74, 0x76, 0xf2,
++ 0xcb, 0xe3, 0xda, 0x67, 0xcc, 0xf5, 0x02, 0xb3, 0x78, 0xa7, 0xbb, 0x77,
++ 0xb0, 0xf3, 0x2f, 0x0d, 0xae, 0x25, 0x6e, 0xee, 0x55, 0xd8, 0xc0, 0xae,
++ 0x87, 0x72, 0xc2, 0x7c, 0x1f, 0x62, 0xea, 0x03, 0x92, 0xab, 0x41, 0x6f,
++ 0xf6, 0xf1, 0xfe, 0x47, 0xa6, 0x2d, 0xaf, 0x03, 0x39, 0x3c, 0xd6, 0x7a,
++ 0x96, 0x3f, 0xae, 0x71, 0x7d, 0x67, 0x78, 0x9e, 0x1f, 0xe6, 0xbc, 0xdf,
++ 0x94, 0x5b, 0x0b, 0x79, 0x0a, 0x69, 0xd0, 0x63, 0x4d, 0x80, 0xde, 0x7a,
++ 0x35, 0x21, 0xbd, 0x1e, 0xf3, 0x84, 0x22, 0x32, 0xd6, 0x9b, 0x82, 0x13,
++ 0xaf, 0xe9, 0xa9, 0xd7, 0x60, 0xf3, 0xab, 0x21, 0x9d, 0x1a, 0xe3, 0xd7,
++ 0x6b, 0x7c, 0x9f, 0xc4, 0x58, 0xed, 0x32, 0xd6, 0x47, 0x3e, 0xb7, 0xd2,
++ 0x91, 0x34, 0xf9, 0xdc, 0xad, 0xcf, 0xef, 0x6b, 0xa2, 0xef, 0xd6, 0xef,
++ 0x4a, 0xf3, 0x8c, 0x8b, 0xad, 0xd0, 0x3f, 0x21, 0x8d, 0xbd, 0xd0, 0x73,
++ 0x98, 0xa3, 0x1f, 0xfa, 0x1a, 0x21, 0x5f, 0x42, 0x1f, 0x25, 0xaa, 0xe4,
++ 0x62, 0x36, 0xc3, 0xb9, 0x44, 0x8d, 0xcf, 0x42, 0xba, 0x14, 0x6d, 0x11,
++ 0x9e, 0x25, 0x46, 0xbd, 0xcf, 0xec, 0xd3, 0xeb, 0xff, 0xa4, 0x99, 0xaf,
++ 0x6b, 0xea, 0xb0, 0xaf, 0xfd, 0x68, 0xff, 0xb5, 0x00, 0x63, 0x31, 0x08,
++ 0x87, 0xfd, 0x1f, 0x62, 0xf7, 0xfd, 0xba, 0xaf, 0xce, 0x10, 0xbf, 0x87,
++ 0xdf, 0xa1, 0x91, 0x4e, 0xee, 0xaf, 0x90, 0x87, 0xec, 0xa3, 0xd7, 0xc4,
++ 0x5c, 0x49, 0x43, 0x47, 0x0b, 0x0d, 0x29, 0xff, 0x66, 0x1d, 0x77, 0x4f,
++ 0xd3, 0xdc, 0x29, 0x6b, 0xdd, 0xb2, 0x50, 0xed, 0x94, 0xf9, 0xaa, 0xf2,
++ 0x75, 0x86, 0x45, 0x88, 0xed, 0xb8, 0x2f, 0x55, 0x2e, 0xb3, 0xc9, 0x99,
++ 0x0c, 0xf7, 0x67, 0x37, 0xea, 0xd1, 0x86, 0xa0, 0xac, 0x69, 0xfd, 0x54,
++ 0x93, 0x5b, 0xbf, 0xd3, 0x98, 0x6b, 0xb4, 0xe6, 0xe3, 0x5d, 0x6f, 0xca,
++ 0xc7, 0x6b, 0xce, 0x7f, 0x2a, 0xcb, 0x23, 0x07, 0x3b, 0x64, 0xe0, 0x6c,
++ 0xa7, 0x91, 0xd1, 0xfb, 0xcd, 0x38, 0x18, 0x6f, 0x69, 0x5c, 0x06, 0x96,
++ 0xbe, 0x28, 0xa5, 0x69, 0x95, 0xff, 0xde, 0xf4, 0xfd, 0xc3, 0xa0, 0xf9,
++ 0xfe, 0x29, 0x67, 0x31, 0x17, 0xa6, 0xb0, 0x84, 0xf5, 0x3a, 0x98, 0x1a,
++ 0x4e, 0xda, 0xfc, 0x46, 0xf7, 0x31, 0x19, 0x58, 0x1d, 0x97, 0xf4, 0x12,
++ 0x31, 0x03, 0xb3, 0x01, 0x52, 0x2a, 0x2e, 0x9a, 0xbe, 0xa8, 0xfb, 0xf3,
++ 0x96, 0xf8, 0x3e, 0x0d, 0xbc, 0xca, 0xf7, 0x85, 0x44, 0x44, 0x65, 0x0c,
++ 0x7c, 0x10, 0xf2, 0xd4, 0x66, 0xf0, 0x80, 0x23, 0xf9, 0x25, 0xb6, 0x27,
++ 0xf6, 0xf8, 0x47, 0xac, 0x59, 0x21, 0x69, 0x0b, 0xdb, 0xa8, 0xfe, 0x70,
++ 0x1d, 0xc6, 0xd3, 0xc9, 0xeb, 0x51, 0x59, 0x6f, 0x78, 0xd8, 0x13, 0xfa,
++ 0x9b, 0x89, 0x52, 0x2d, 0xcc, 0x27, 0x7d, 0xc4, 0xc4, 0x00, 0x34, 0x8d,
++ 0xc5, 0x4a, 0xab, 0xec, 0x3d, 0x63, 0xbe, 0x9d, 0xe8, 0x50, 0x67, 0x68,
++ 0x4d, 0xfa, 0xcf, 0xd4, 0xbf, 0xdd, 0x65, 0xde, 0x80, 0x08, 0xdf, 0x37,
++ 0xf9, 0x24, 0xf1, 0xb8, 0xda, 0x07, 0x03, 0xf5, 0xb0, 0xde, 0xa8, 0xab,
++ 0x7d, 0x60, 0xf2, 0x29, 0x6b, 0x68, 0x1e, 0x83, 0xcf, 0xc3, 0x67, 0x07,
++ 0xd0, 0x96, 0xeb, 0x84, 0xb2, 0x7e, 0x40, 0xe5, 0x39, 0x46, 0xb2, 0x47,
++ 0xcc, 0x59, 0x5a, 0x9f, 0x1a, 0xcb, 0xcd, 0xb2, 0xff, 0x50, 0x37, 0x74,
++ 0x34, 0x8d, 0xdf, 0x4a, 0x2f, 0x7d, 0xf8, 0x9f, 0x19, 0x79, 0xe1, 0x7b,
++ 0xde, 0xb7, 0xd6, 0xf9, 0xa3, 0x7d, 0xe1, 0x7b, 0x67, 0xfb, 0x1b, 0x0c,
++ 0xf2, 0x92, 0x67, 0x80, 0x28, 0x2f, 0x32, 0x97, 0x9d, 0xd7, 0x28, 0xcd,
++ 0xb7, 0x25, 0xce, 0x12, 0x7f, 0xad, 0xfd, 0x38, 0xe8, 0x3b, 0xdc, 0xb3,
++ 0xbb, 0xe5, 0x06, 0x51, 0x17, 0x9f, 0xb6, 0xb6, 0x2a, 0x8c, 0x5d, 0x94,
++ 0xe5, 0x58, 0xa6, 0x5b, 0x66, 0xab, 0x36, 0xbf, 0x4d, 0x65, 0x2c, 0x96,
++ 0x67, 0x95, 0x32, 0xa7, 0x74, 0xdc, 0x90, 0xe8, 0xef, 0x76, 0x3b, 0xa4,
++ 0xe8, 0x52, 0x9e, 0x87, 0x64, 0xbd, 0x36, 0xdd, 0x94, 0x03, 0xdc, 0x66,
++ 0xe4, 0xec, 0xef, 0xa2, 0xd2, 0xc9, 0x38, 0x52, 0xb8, 0xa7, 0x87, 0xa4,
++ 0x58, 0x6b, 0x3e, 0x67, 0x60, 0x9e, 0x11, 0xe5, 0xb6, 0xbf, 0x69, 0xef,
++ 0x31, 0x57, 0x0f, 0xb8, 0x2a, 0x4e, 0x9f, 0x95, 0xf5, 0xf6, 0x1a, 0x7b,
++ 0xfb, 0x15, 0xac, 0xc7, 0xfb, 0x2d, 0xf1, 0x48, 0x1b, 0x6c, 0x84, 0xc9,
++ 0x35, 0x3e, 0x1c, 0x2f, 0xc3, 0x3f, 0x1b, 0x32, 0xe3, 0xde, 0x81, 0x7b,
++ 0xd6, 0xdd, 0x67, 0xde, 0xef, 0x37, 0xf7, 0x9d, 0xe6, 0x3e, 0x82, 0x7b,
++ 0xe6, 0x8d, 0xb3, 0x4f, 0x96, 0xfc, 0x9e, 0x88, 0xdf, 0xeb, 0x64, 0x25,
++ 0x7a, 0x11, 0xe8, 0xa9, 0xd1, 0x29, 0x9f, 0xae, 0x29, 0xfe, 0x5a, 0xde,
++ 0x12, 0x01, 0xc1, 0x7e, 0x73, 0x7d, 0xeb, 0x1e, 0xfc, 0xdc, 0x4d, 0xdf,
++ 0x4a, 0x55, 0x8c, 0xac, 0x34, 0xd3, 0x9b, 0x03, 0xad, 0xef, 0x96, 0x83,
++ 0x45, 0x1b, 0xa5, 0xfd, 0xc6, 0x62, 0x45, 0xe7, 0x1a, 0x1d, 0x83, 0xdf,
++ 0x78, 0xb8, 0xfa, 0xa8, 0xab, 0xf3, 0x62, 0xc2, 0x5c, 0xca, 0x4e, 0xcc,
++ 0x6b, 0xc8, 0x9c, 0x5b, 0xb3, 0x2d, 0x73, 0x3a, 0xc3, 0xf3, 0x99, 0x66,
++ 0xac, 0x4a, 0x5b, 0x44, 0x3b, 0xc3, 0xef, 0x9a, 0x7c, 0xd4, 0x5d, 0xa4,
++ 0xae, 0x69, 0xca, 0xcd, 0xff, 0x52, 0x4b, 0x6e, 0x3e, 0xbf, 0xfb, 0x16,
++ 0xf9, 0x6f, 0x0d, 0xc6, 0x95, 0x3a, 0x24, 0x72, 0x36, 0xcc, 0xc1, 0xe2,
++ 0x1a, 0x13, 0x87, 0xf1, 0x7b, 0xef, 0xa9, 0x5d, 0x62, 0x4e, 0xa1, 0x9c,
++ 0x7f, 0xc7, 0x65, 0x7e, 0xab, 0x9b, 0x0d, 0xe3, 0x54, 0xcc, 0xeb, 0x21,
++ 0xe6, 0x3a, 0x60, 0x62, 0x0a, 0x7c, 0x57, 0x96, 0x9e, 0x83, 0x53, 0xdc,
++ 0x1b, 0xbf, 0x1d, 0xd9, 0xce, 0xfd, 0x57, 0xe3, 0xc4, 0x35, 0x86, 0xe4,
++ 0x77, 0xe3, 0x3e, 0xf6, 0xd5, 0x9e, 0xcd, 0xf0, 0x9b, 0x8c, 0xcb, 0x8d,
++ 0x8c, 0xfa, 0xf6, 0x83, 0x67, 0x1e, 0x5b, 0x0d, 0xee, 0x3b, 0x7e, 0x23,
++ 0x9e, 0x55, 0x39, 0x01, 0x5b, 0xe6, 0x9b, 0xe7, 0xab, 0x0d, 0xfd, 0x1d,
++ 0xcb, 0xe2, 0xb2, 0xca, 0xcb, 0x07, 0x56, 0x4b, 0xe2, 0x3d, 0x73, 0xe8,
++ 0xfa, 0x55, 0x2e, 0xc1, 0x7c, 0xe3, 0x53, 0x28, 0x3f, 0x2f, 0x6b, 0x15,
++ 0x1d, 0x7f, 0x9d, 0x6f, 0x30, 0xa7, 0xc0, 0x55, 0x67, 0x44, 0x03, 0x4b,
++ 0x45, 0x8c, 0x17, 0x7e, 0xb3, 0x1d, 0xc7, 0x33, 0xd2, 0x57, 0x36, 0x7b,
++ 0x34, 0xcc, 0x05, 0xe9, 0xea, 0xa1, 0x4d, 0x28, 0x37, 0xba, 0x54, 0x1e,
++ 0x82, 0xc6, 0x23, 0xc4, 0x7a, 0x31, 0xd4, 0xe5, 0x5c, 0x3b, 0x69, 0xaf,
++ 0x02, 0xea, 0xa4, 0x34, 0xc6, 0xa9, 0xab, 0xdc, 0x44, 0xf2, 0xd9, 0x73,
++ 0x4b, 0xf4, 0xd7, 0x94, 0x8e, 0x4f, 0x0d, 0xcf, 0x48, 0xc1, 0x8d, 0xc2,
++ 0x17, 0x9b, 0x57, 0x7e, 0xce, 0xfd, 0xc0, 0xd0, 0x5d, 0x9b, 0x91, 0x2c,
++ 0xe7, 0xc6, 0xb1, 0xe9, 0x87, 0xe8, 0xf9, 0xe8, 0x33, 0x02, 0xb1, 0xe6,
++ 0xd5, 0xf7, 0x8f, 0x7c, 0xce, 0x78, 0x6f, 0xf8, 0xcd, 0x90, 0xfe, 0x26,
++ 0x64, 0xa6, 0x71, 0x44, 0x4e, 0x55, 0xf6, 0xf2, 0x5b, 0x09, 0x7f, 0x0b,
++ 0x7c, 0x3b, 0xd6, 0xe8, 0x52, 0xdf, 0xa5, 0xcc, 0x34, 0x98, 0x3f, 0x17,
++ 0xda, 0x1e, 0xae, 0x55, 0xdc, 0x7c, 0x37, 0x91, 0x30, 0xdf, 0x4d, 0xf0,
++ 0xdb, 0x8f, 0x1f, 0xed, 0x0d, 0xf7, 0xfb, 0xad, 0x38, 0x9c, 0x32, 0xf8,
++ 0xa7, 0xf0, 0x0d, 0xc3, 0x3c, 0x4c, 0xe6, 0x8b, 0x06, 0xc1, 0x31, 0x9f,
++ 0xf1, 0xdb, 0xe9, 0xc3, 0x6b, 0x98, 0xe3, 0x95, 0x1a, 0x78, 0x78, 0x94,
++ 0xcf, 0x98, 0x37, 0xd6, 0x2e, 0xf9, 0xd1, 0x76, 0xea, 0xf2, 0xce, 0x35,
++ 0x6f, 0xaf, 0x5c, 0xae, 0xc6, 0x55, 0x0e, 0x5c, 0x09, 0x38, 0xbf, 0x2e,
++ 0x1f, 0xeb, 0xe1, 0xd9, 0xdd, 0x84, 0x6a, 0x1f, 0xee, 0x77, 0x1d, 0x37,
++ 0x98, 0x58, 0xd7, 0xfa, 0xe4, 0x78, 0x06, 0xb8, 0xe5, 0x82, 0x58, 0x7f,
++ 0x90, 0xe9, 0x87, 0xef, 0xcd, 0xb1, 0xd2, 0x68, 0x07, 0xd9, 0x49, 0x70,
++ 0xaf, 0xbf, 0x13, 0xd4, 0x41, 0xef, 0x8d, 0x06, 0xf1, 0x3a, 0x30, 0xd4,
++ 0x34, 0xdb, 0x64, 0xc5, 0x3e, 0xc3, 0x3a, 0xbd, 0x90, 0xbf, 0x28, 0xe6,
++ 0xe3, 0xc0, 0x17, 0xd8, 0x27, 0x75, 0x97, 0xef, 0x1c, 0x7d, 0xa6, 0x12,
++ 0x0f, 0xfd, 0x94, 0xef, 0x81, 0x7f, 0x49, 0xa5, 0x93, 0xc2, 0xf3, 0x4e,
++ 0xe6, 0xb3, 0xce, 0x56, 0x27, 0xb1, 0x87, 0x1c, 0x83, 0xcd, 0x1c, 0xf4,
++ 0xf1, 0xe1, 0x1e, 0x8d, 0x15, 0x78, 0x1e, 0xaa, 0xb1, 0x88, 0xb6, 0x31,
++ 0x3c, 0xdf, 0x71, 0xe0, 0x0b, 0x84, 0xfb, 0xf2, 0x99, 0x7d, 0x37, 0x7f,
++ 0x0b, 0x43, 0x1c, 0x93, 0x4e, 0x9c, 0xe7, 0x79, 0xdc, 0xc6, 0xc3, 0x32,
++ 0x03, 0x9a, 0x4f, 0x9b, 0x79, 0x3e, 0x98, 0xf1, 0xe4, 0x7a, 0x8d, 0xe7,
++ 0x95, 0x07, 0x50, 0x32, 0xd7, 0x91, 0x34, 0x8f, 0x98, 0x7c, 0xce, 0x2c,
++ 0xe6, 0xfa, 0x98, 0xbc, 0x01, 0x7c, 0xfd, 0x66, 0x25, 0xed, 0x4f, 0xa8,
++ 0x3c, 0xa4, 0x54, 0xe2, 0xb2, 0x8c, 0x24, 0xe9, 0x03, 0x96, 0xdd, 0x54,
++ 0xe2, 0x3a, 0xe4, 0xe1, 0x46, 0xe5, 0x99, 0x1e, 0xfe, 0xaf, 0x8a, 0x3a,
++ 0xec, 0xe1, 0x0d, 0x95, 0x83, 0x94, 0x62, 0xcc, 0x04, 0xf7, 0xfd, 0x26,
++ 0x0f, 0x8a, 0xe3, 0xf0, 0x5d, 0xbf, 0xbc, 0x51, 0xd9, 0xb6, 0xbf, 0x1c,
++ 0xc7, 0x7c, 0x03, 0xcf, 0xb1, 0x2e, 0xf4, 0x50, 0x0f, 0x71, 0x3c, 0xdd,
++ 0x47, 0x58, 0x87, 0x7c, 0x0d, 0xe3, 0x9a, 0xea, 0x5b, 0xcb, 0xa4, 0x58,
++ 0x96, 0xb4, 0x79, 0x9c, 0xfb, 0x54, 0x8f, 0xc6, 0x40, 0x6c, 0x97, 0x76,
++ 0x0f, 0xab, 0xfe, 0x78, 0xb6, 0xc7, 0xf3, 0xaf, 0xb0, 0x1f, 0xe6, 0x43,
++ 0x31, 0xe7, 0x8a, 0xba, 0xaf, 0x99, 0x06, 0x6d, 0xff, 0xdf, 0x50, 0xb1,
++ 0xf4, 0x71, 0xd4, 0xa7, 0x8d, 0x86, 0xbc, 0xd4, 0x12, 0xdb, 0xdf, 0x7c,
++ 0x68, 0x5e, 0xf2, 0xfa, 0x99, 0xed, 0x6f, 0x32, 0xec, 0xbb, 0x5d, 0xf3,
++ 0x3e, 0xc4, 0xa5, 0xfd, 0xd8, 0xaf, 0x8f, 0x49, 0x7d, 0x25, 0x9d, 0xf8,
++ 0xb4, 0x84, 0xfd, 0x06, 0x87, 0x78, 0xde, 0x51, 0xcc, 0x8c, 0xb8, 0x0b,
++ 0x8a, 0x9e, 0x54, 0x82, 0x39, 0xc8, 0x97, 0x31, 0x5e, 0xbd, 0xd1, 0x1a,
++ 0x7b, 0x48, 0xe5, 0x36, 0x25, 0xed, 0xeb, 0xb5, 0x19, 0x92, 0x4d, 0xac,
++ 0xcd, 0x9f, 0x9b, 0xb5, 0xf9, 0x18, 0xfa, 0xf6, 0xce, 0x8c, 0x4a, 0xfa,
++ 0x4c, 0x3a, 0x79, 0x5a, 0x78, 0x96, 0xb8, 0x8f, 0x31, 0x2c, 0xeb, 0xc1,
++ 0x4c, 0x12, 0xf3, 0x4d, 0x61, 0xbe, 0x28, 0x1b, 0xbc, 0x1e, 0x81, 0x6f,
++ 0xbe, 0x87, 0x7b, 0xfb, 0x10, 0x75, 0x26, 0x79, 0x51, 0x54, 0xef, 0x80,
++ 0x4f, 0x9e, 0x26, 0x4d, 0x00, 0xca, 0x9d, 0x29, 0x15, 0x07, 0xbc, 0xde,
++ 0xe0, 0xf9, 0xa2, 0xa6, 0xaf, 0x00, 0xfa, 0xe6, 0x34, 0x7d, 0xc9, 0x99,
++ 0x6d, 0xec, 0x9a, 0x4a, 0x9c, 0x12, 0xe2, 0x25, 0xe2, 0x17, 0xe2, 0xfa,
++ 0x47, 0x7a, 0xc3, 0x6f, 0x5a, 0xf2, 0x77, 0xe7, 0xb6, 0xe7, 0xde, 0x86,
++ 0xba, 0x57, 0x32, 0x2a, 0xbf, 0xd9, 0x3d, 0x22, 0x1f, 0x91, 0xdc, 0xa7,
++ 0x52, 0xc9, 0x9c, 0xe5, 0x19, 0x0c, 0x88, 0xb2, 0xc6, 0x6b, 0xea, 0x5c,
++ 0xcf, 0x60, 0x0b, 0xae, 0x4d, 0x06, 0x63, 0x29, 0xde, 0xc2, 0x67, 0xea,
++ 0x87, 0xcc, 0x53, 0xd6, 0x7e, 0x07, 0x7b, 0x48, 0xff, 0x9f, 0x8e, 0xcb,
++ 0xe0, 0xe3, 0x3c, 0xf8, 0x78, 0xfc, 0x16, 0x0c, 0x16, 0xdd, 0xc6, 0x60,
++ 0x5b, 0x6a, 0xbc, 0x7b, 0x41, 0x53, 0xc1, 0x25, 0xfe, 0x9a, 0xdf, 0x96,
++ 0x15, 0xd2, 0x34, 0xca, 0xff, 0xb5, 0x23, 0x57, 0x33, 0x5c, 0x0f, 0x60,
++ 0x30, 0xf4, 0xb7, 0xb6, 0x23, 0x4b, 0x98, 0xbf, 0x92, 0x5f, 0xc8, 0x6e,
++ 0xca, 0x75, 0x2c, 0xae, 0x05, 0xfb, 0x13, 0xeb, 0x1a, 0x68, 0xd9, 0x52,
++ 0x72, 0xa0, 0x65, 0x60, 0xab, 0xd6, 0xf9, 0x1e, 0x32, 0xc0, 0x79, 0x52,
++ 0xfe, 0x42, 0xd9, 0xdb, 0xc9, 0xa7, 0xe8, 0x00, 0x4f, 0x3e, 0x78, 0x4f,
++ 0x56, 0xf2, 0x67, 0x78, 0x16, 0x26, 0xd6, 0xc8, 0x3d, 0x94, 0x49, 0xe2,
++ 0x04, 0x60, 0xc8, 0x04, 0x79, 0xac, 0xf1, 0xe0, 0xcc, 0xb3, 0x7b, 0xf1,
++ 0x7b, 0xb3, 0x87, 0x39, 0x33, 0xf9, 0x73, 0xd4, 0x57, 0x62, 0xdd, 0x79,
++ 0x8f, 0xf6, 0x0f, 0x6f, 0xc4, 0xc1, 0x73, 0xbc, 0x1f, 0x78, 0xb2, 0x0d,
++ 0xfa, 0xca, 0x31, 0xf3, 0xe6, 0x3d, 0xf9, 0x8a, 0xf2, 0xd9, 0x29, 0xa3,
++ 0x03, 0xa8, 0x47, 0xc4, 0xec, 0x8b, 0xb2, 0xcc, 0x31, 0x46, 0x9f, 0xe9,
++ 0x94, 0x09, 0xe8, 0xb5, 0x23, 0x95, 0x71, 0xf9, 0x72, 0xa5, 0x4b, 0xe1,
++ 0x86, 0xbf, 0xf6, 0xd3, 0x89, 0x61, 0x2b, 0x90, 0x07, 0x81, 0x7f, 0x66,
++ 0xfa, 0xdb, 0xe4, 0xcd, 0x51, 0x9d, 0xfb, 0x7b, 0x83, 0xc9, 0x8d, 0x2e,
++ 0xf3, 0x55, 0x39, 0x1f, 0xe8, 0x7d, 0x0b, 0xbe, 0x80, 0xd5, 0x2e, 0x33,
++ 0xf1, 0x2e, 0xf9, 0xb8, 0x8f, 0xf2, 0x36, 0x5f, 0x7d, 0x63, 0x9c, 0x8b,
++ 0x37, 0xeb, 0x91, 0x37, 0xcd, 0xd8, 0x5f, 0x34, 0xe5, 0xbf, 0xe9, 0x6d,
++ 0xa2, 0xc5, 0x9a, 0xcb, 0x44, 0xd4, 0xfc, 0xe6, 0x6b, 0xd4, 0x6f, 0x6c,
++ 0x03, 0x7d, 0xd2, 0xe0, 0x39, 0x51, 0x59, 0xd6, 0xa0, 0x5f, 0x4a, 0x55,
++ 0xb1, 0xce, 0x65, 0x80, 0xa8, 0x3d, 0x8d, 0x3f, 0x4b, 0x90, 0xaf, 0xd9,
++ 0xaa, 0x8a, 0x59, 0xaa, 0xbc, 0xed, 0x59, 0x60, 0x5d, 0xf8, 0xc4, 0xc0,
++ 0x10, 0x26, 0x7f, 0xa5, 0x93, 0xf1, 0x90, 0x66, 0x1d, 0x16, 0xfe, 0x2f,
++ 0x9d, 0xff, 0xd4, 0x2b, 0xdd, 0x65, 0xac, 0x4b, 0x88, 0xb9, 0xc1, 0x53,
++ 0x8c, 0x99, 0x57, 0xeb, 0x14, 0xae, 0x09, 0x75, 0x4f, 0x73, 0xbe, 0x78,
++ 0x88, 0x39, 0xb8, 0x67, 0x69, 0x2f, 0xa4, 0x1c, 0x03, 0xa6, 0xed, 0x38,
++ 0x03, 0xdb, 0x5d, 0xcd, 0x42, 0x56, 0xc6, 0x55, 0xde, 0xe7, 0x3c, 0xb0,
++ 0xdb, 0x1f, 0xf8, 0x7f, 0x2a, 0xf6, 0xd3, 0x07, 0x64, 0xad, 0xda, 0x01,
++ 0x7e, 0xd0, 0x2e, 0x44, 0x95, 0x7f, 0x7d, 0xe3, 0x28, 0xed, 0x1d, 0x6d,
++ 0x89, 0x5e, 0x8b, 0xad, 0xda, 0xf7, 0x7a, 0xf5, 0xb7, 0x33, 0x7b, 0x65,
++ 0xb3, 0x16, 0xda, 0x42, 0xf8, 0x87, 0xd5, 0xa8, 0xb1, 0xcb, 0x9d, 0xd0,
++ 0xdd, 0xdf, 0x8f, 0xd6, 0x95, 0xaf, 0xce, 0xf9, 0xd3, 0x06, 0x45, 0x99,
++ 0x17, 0xd7, 0x59, 0xf7, 0x38, 0xf7, 0x66, 0x1b, 0xa4, 0x71, 0x87, 0x7b,
++ 0x90, 0xe3, 0x31, 0x87, 0x82, 0x73, 0x8c, 0x4b, 0xf4, 0xfc, 0x63, 0x62,
++ 0xc3, 0x6f, 0x89, 0x2c, 0x11, 0xeb, 0xdd, 0xec, 0xbb, 0x44, 0x2e, 0xba,
++ 0xe6, 0x5b, 0xec, 0x41, 0x8d, 0x65, 0x32, 0x28, 0xeb, 0xe1, 0xf7, 0xd9,
++ 0xfc, 0x35, 0xdb, 0xcd, 0xd0, 0xb7, 0xd8, 0xd5, 0x96, 0xe2, 0xef, 0xff,
++ 0x01, 0x37, 0x64, 0x26, 0x2b, 0x1c, 0x4c, 0x00, 0x00, 0x00 };
+
+ static const u32 bnx2_COM_b09FwData[(0x0/4) + 1] = { 0x0 };
+ static const u32 bnx2_COM_b09FwRodata[(0x30/4) + 1] = {
+- 0x80080100, 0x80080080, 0x80080000, 0x80080240, 0x08000ea4, 0x08000efc,
+- 0x08000f40, 0x08000fd4, 0x08001018, 0x80080100, 0x80080080, 0x80080000,
++ 0x80080100, 0x80080080, 0x80080000, 0x80080240, 0x08000e20, 0x08000e78,
++ 0x08000ebc, 0x08000f50, 0x08000f94, 0x80080100, 0x80080080, 0x80080000,
+ 0x00000000 };
+
+ static struct fw_info bnx2_com_fw_09 = {
+- /* Firmware version: 4.6.15 */
++ /* Firmware version: 4.4.23 */
+ .ver_major = 0x4,
+- .ver_minor = 0x6,
+- .ver_fix = 0xf,
++ .ver_minor = 0x4,
++ .ver_fix = 0x17,
+
+ .start_addr = 0x080000f8,
+
+ .text_addr = 0x08000000,
+- .text_len = 0x4a7c,
++ .text_len = 0x4c18,
+ .text_index = 0x0,
+ .gz_text = bnx2_COM_b09FwText,
+ .gz_text_len = sizeof(bnx2_COM_b09FwText),
+@@ -865,1189 +866,1210 @@
+ .data_index = 0x0,
+ .data = bnx2_COM_b09FwData,
+
+- .sbss_addr = 0x08004ae0,
++ .sbss_addr = 0x08004c60,
+ .sbss_len = 0x38,
+ .sbss_index = 0x0,
+
+- .bss_addr = 0x08004b18,
+- .bss_len = 0xc0,
++ .bss_addr = 0x08004c98,
++ .bss_len = 0xbc,
+ .bss_index = 0x0,
+
+- .rodata_addr = 0x08004a7c,
++ .rodata_addr = 0x08004c18,
+ .rodata_len = 0x30,
+ .rodata_index = 0x0,
+ .rodata = bnx2_COM_b09FwRodata,
+ };
+
+ static u8 bnx2_CP_b09FwText[] = {
+- 0xa5, 0xbc, 0x0d, 0x74, 0x1c, 0xe5, 0x95, 0x26, 0xfc, 0x54, 0x75, 0xb7,
+- 0xd4, 0x92, 0x5a, 0x52, 0x49, 0x6e, 0x8b, 0x36, 0x68, 0x70, 0xb5, 0x55,
+- 0x2d, 0x0b, 0x4b, 0x40, 0xb5, 0x24, 0x3b, 0xed, 0x6c, 0x83, 0x3b, 0xb6,
+- 0x6c, 0x64, 0x63, 0x40, 0x36, 0x06, 0xc4, 0xb7, 0xfe, 0x3e, 0x7a, 0xfc,
+- 0x03, 0x86, 0x38, 0x19, 0x91, 0xcd, 0xce, 0x0a, 0xd6, 0x59, 0x55, 0xe4,
+- 0x3f, 0xd9, 0x6e, 0x75, 0x4b, 0x42, 0xfe, 0xe1, 0xec, 0x9c, 0xa5, 0x2d,
+- 0xcb, 0x96, 0x21, 0xad, 0x16, 0x24, 0x6c, 0xc6, 0x39, 0x27, 0x09, 0x1a,
+- 0x63, 0x83, 0x0d, 0x18, 0xc8, 0x24, 0xf9, 0x86, 0xc9, 0xd9, 0x5d, 0x34,
+- 0xc6, 0xfc, 0x19, 0x70, 0x1c, 0x92, 0xc9, 0x9a, 0x19, 0x4c, 0xed, 0x73,
+- 0xab, 0xd5, 0xb6, 0xec, 0x30, 0xc9, 0xcc, 0x59, 0x9d, 0xd3, 0xa7, 0xab,
+- 0xab, 0xde, 0x9f, 0xfb, 0xde, 0xf7, 0xde, 0xe7, 0x3e, 0xf7, 0x7d, 0xdf,
+- 0x92, 0x0e, 0x14, 0x63, 0xf2, 0xaf, 0x94, 0x9f, 0x9b, 0x9a, 0x3b, 0xd6,
+- 0xce, 0x0d, 0xdf, 0x34, 0x4f, 0x7e, 0xbb, 0xcb, 0x0b, 0xdc, 0xf8, 0xb2,
+- 0xbf, 0x28, 0x22, 0x57, 0xdf, 0xd2, 0xbf, 0xb4, 0xe0, 0xbf, 0xf0, 0x17,
+- 0x41, 0x50, 0xe1, 0x57, 0xfd, 0xe4, 0x4f, 0x17, 0xa0, 0xe5, 0xfb, 0x97,
+- 0x0f, 0xbc, 0x6a, 0xd4, 0xb8, 0x77, 0xa1, 0x01, 0xaf, 0x2b, 0xba, 0xaa,
+- 0x7d, 0xad, 0x01, 0xc4, 0x32, 0xf5, 0xfa, 0x22, 0x5c, 0xb4, 0x2d, 0xbf,
+- 0x1b, 0x72, 0xff, 0xcf, 0xa2, 0x9f, 0x3f, 0xf5, 0x93, 0xaf, 0x04, 0xcf,
+- 0xa7, 0x5d, 0xf0, 0x6a, 0x51, 0x0b, 0x5a, 0x2d, 0xbc, 0xd5, 0xac, 0xf3,
+- 0x57, 0xb3, 0xb7, 0xa9, 0x28, 0xcb, 0xb7, 0x15, 0x0c, 0xa4, 0x11, 0xd4,
+- 0x2c, 0x04, 0xeb, 0x2c, 0x20, 0xee, 0x8e, 0x22, 0x5e, 0x18, 0xf5, 0xa2,
+- 0xc0, 0x28, 0x40, 0x5c, 0xeb, 0xd4, 0xb7, 0x34, 0x03, 0x0b, 0x13, 0x5e,
+- 0xfd, 0x74, 0x06, 0x58, 0x9b, 0xf0, 0x62, 0xc2, 0xe5, 0xd3, 0xdf, 0xc9,
+- 0x44, 0xca, 0x72, 0xfa, 0x88, 0xc1, 0x65, 0x20, 0xae, 0x46, 0xe5, 0x3e,
+- 0xf4, 0x45, 0x19, 0xa9, 0x0b, 0x6c, 0x4b, 0x7d, 0x5b, 0x7f, 0x37, 0x11,
+- 0xd4, 0xb6, 0xa1, 0x3e, 0x30, 0x84, 0x42, 0xc4, 0xfd, 0xc1, 0x3a, 0xe0,
+- 0xf3, 0x8b, 0x3b, 0x53, 0x0a, 0x3c, 0xc6, 0x34, 0xb4, 0xec, 0x07, 0x76,
+- 0xa4, 0x82, 0x31, 0x83, 0xc3, 0xeb, 0x19, 0x93, 0xba, 0x41, 0x2d, 0xcd,
+- 0xe7, 0x5b, 0x52, 0xc0, 0xd6, 0xd4, 0x34, 0x6c, 0xeb, 0xb3, 0xf1, 0xa2,
+- 0x59, 0xa3, 0x1d, 0x60, 0x0f, 0xdd, 0xce, 0xf3, 0x69, 0xb0, 0xd2, 0xf2,
+- 0xfc, 0x03, 0xfb, 0x27, 0xb3, 0x35, 0x3c, 0x3b, 0xe6, 0xc7, 0x0b, 0x63,
+- 0x15, 0xd8, 0xd1, 0x57, 0x81, 0xed, 0x7d, 0x75, 0x50, 0x0d, 0x1b, 0x75,
+- 0xe1, 0x3a, 0x14, 0xcc, 0xb7, 0xf1, 0x8e, 0xd9, 0x80, 0xad, 0x6c, 0xf8,
+- 0xcd, 0x86, 0x2a, 0xac, 0xd1, 0xaa, 0xb1, 0xc5, 0xf8, 0x0a, 0x72, 0x63,
+- 0xfd, 0xfc, 0x62, 0x2a, 0x85, 0xb8, 0x27, 0xea, 0x56, 0x55, 0xe3, 0x56,
+- 0x9c, 0xdb, 0x1d, 0xc5, 0x27, 0xbb, 0xb1, 0xba, 0x0c, 0xb6, 0x9d, 0x09,
+- 0x87, 0xda, 0x36, 0x2a, 0x9a, 0xfe, 0x4c, 0x86, 0x02, 0xad, 0x74, 0xb3,
+- 0x3d, 0xe8, 0x43, 0x99, 0xa9, 0x53, 0xc1, 0xfe, 0x52, 0xec, 0x37, 0x25,
+- 0xb2, 0x04, 0xf0, 0x93, 0xd9, 0x7f, 0x41, 0x7b, 0xc8, 0x8d, 0x69, 0x6b,
+- 0xea, 0x2d, 0xca, 0xa4, 0x53, 0x9e, 0x6a, 0xfc, 0x60, 0x2c, 0x80, 0xef,
+- 0x53, 0xb6, 0xe7, 0xc6, 0x44, 0xc6, 0xe0, 0x3e, 0x0b, 0x15, 0x18, 0xee,
+- 0xab, 0xc6, 0xb3, 0x46, 0x03, 0x9e, 0xa3, 0x8c, 0x9b, 0xcd, 0x3a, 0xac,
+- 0x89, 0xdc, 0x4f, 0x79, 0x14, 0xac, 0x6c, 0xf8, 0xf3, 0x49, 0xb9, 0x82,
+- 0x3a, 0x54, 0x15, 0xb1, 0xca, 0x60, 0x9d, 0xae, 0x4a, 0x9b, 0x97, 0xe5,
+- 0xed, 0x4d, 0xc1, 0xf2, 0x46, 0x45, 0xe6, 0x5b, 0x91, 0xa1, 0xbc, 0xdf,
+- 0xdb, 0x1d, 0x32, 0x37, 0xa8, 0x58, 0xee, 0xa3, 0xcc, 0x8f, 0x84, 0x43,
+- 0x91, 0x39, 0x94, 0x79, 0x24, 0xa3, 0x72, 0x3c, 0x7e, 0xfd, 0x10, 0x65,
+- 0x8f, 0xad, 0x54, 0x29, 0x3b, 0x65, 0x49, 0x51, 0x96, 0x14, 0x65, 0x49,
+- 0x51, 0x16, 0x47, 0xee, 0x3a, 0xca, 0x9c, 0x9b, 0xa3, 0xa1, 0xcc, 0x04,
+- 0xe5, 0x9d, 0x2a, 0x67, 0x35, 0x65, 0x47, 0xbc, 0x22, 0xfa, 0x6d, 0xbd,
+- 0x26, 0x49, 0x7d, 0xa7, 0x6c, 0xfb, 0x4d, 0xd3, 0xb6, 0x3f, 0x35, 0x7d,
+- 0xd4, 0x5f, 0x8a, 0x76, 0x90, 0x97, 0x67, 0xa6, 0x55, 0x10, 0x45, 0x0b,
+- 0x4d, 0xd0, 0x3e, 0xde, 0x1c, 0x8a, 0x54, 0x2a, 0x2a, 0xdc, 0x86, 0xa6,
+- 0xcf, 0xce, 0x06, 0x4d, 0xea, 0x47, 0x0f, 0x65, 0xa1, 0x1b, 0x59, 0xb6,
+- 0x75, 0x45, 0xbf, 0x41, 0x6d, 0x1c, 0xd2, 0xaf, 0xce, 0xfe, 0x27, 0x26,
+- 0xe7, 0x4e, 0xda, 0x0f, 0xb0, 0x4f, 0xe9, 0x5f, 0xda, 0xb6, 0xed, 0xdf,
+- 0x98, 0x30, 0x34, 0x84, 0xac, 0x7e, 0xda, 0x9f, 0x2b, 0xaa, 0xe9, 0x1d,
+- 0x19, 0x3e, 0xbf, 0xd4, 0x46, 0x6e, 0x3e, 0xd6, 0x64, 0xf4, 0xc9, 0x31,
+- 0x04, 0x29, 0x82, 0xd8, 0x41, 0x20, 0xee, 0x8b, 0x6a, 0x22, 0x7b, 0xdb,
+- 0xbe, 0xde, 0x2e, 0x7b, 0x86, 0x21, 0xba, 0x32, 0x3a, 0x67, 0xb8, 0x7c,
+- 0x91, 0x73, 0x73, 0x1f, 0xb5, 0x4a, 0x9b, 0xc3, 0x28, 0x36, 0xe0, 0x2b,
+- 0x32, 0xd0, 0x96, 0x1c, 0x2d, 0xb6, 0x4a, 0xa2, 0x3f, 0xbe, 0xbb, 0x77,
+- 0xd4, 0x8b, 0xe2, 0x51, 0x03, 0x45, 0xa3, 0x4f, 0xbb, 0x51, 0xd6, 0x80,
+- 0x5d, 0x63, 0x0f, 0xb9, 0x73, 0x63, 0x5b, 0x32, 0x39, 0x46, 0xc7, 0xf6,
+- 0xbd, 0xef, 0x26, 0xce, 0xdb, 0x05, 0x46, 0xd1, 0x7d, 0xae, 0xa8, 0xa1,
+- 0x1f, 0x02, 0xce, 0xaf, 0x69, 0x5e, 0x84, 0x6e, 0x4d, 0xc1, 0x4c, 0xe3,
+- 0x95, 0x12, 0x94, 0x45, 0x60, 0x8d, 0x55, 0xc5, 0x0b, 0xa2, 0xfe, 0x38,
+- 0xe7, 0x06, 0x2f, 0x27, 0xd2, 0xf0, 0xf4, 0xda, 0xb6, 0x94, 0x7d, 0x07,
+- 0x77, 0xdf, 0xad, 0x46, 0x8f, 0xde, 0xec, 0x41, 0x0b, 0xcb, 0x63, 0xd3,
+- 0x89, 0xe6, 0x4f, 0x15, 0x75, 0x77, 0x1b, 0xac, 0x11, 0x17, 0x62, 0x5a,
+- 0x9c, 0xdf, 0xd7, 0x5f, 0xbf, 0x3c, 0xd2, 0x86, 0xc4, 0xc8, 0x05, 0xde,
+- 0x77, 0xf3, 0x5e, 0x04, 0xc9, 0xd4, 0xf5, 0xd7, 0xdf, 0x11, 0x89, 0xa3,
+- 0x77, 0x44, 0xae, 0xdd, 0x18, 0xaf, 0x88, 0x63, 0xfb, 0x5e, 0x1d, 0xe5,
+- 0x46, 0x1b, 0x52, 0x23, 0x72, 0x6d, 0xdb, 0x67, 0xcc, 0xef, 0x62, 0x5f,
+- 0x03, 0xfd, 0xff, 0x9a, 0x36, 0x6c, 0xdb, 0x6b, 0xa1, 0xd0, 0xb0, 0xa8,
+- 0x7b, 0xc5, 0xfd, 0xf7, 0x0d, 0x0a, 0xf4, 0xbb, 0xe1, 0x2e, 0x30, 0x44,
+- 0x6f, 0x11, 0xf7, 0xfa, 0x44, 0x54, 0x9b, 0x69, 0xd8, 0xf6, 0x90, 0x39,
+- 0x07, 0x0f, 0xb4, 0xad, 0x81, 0x75, 0xc0, 0x07, 0x6b, 0x95, 0x7c, 0xb7,
+- 0x51, 0x87, 0x6b, 0xd0, 0x7d, 0x60, 0x0d, 0x7a, 0x9e, 0xa0, 0xe3, 0x56,
+- 0x68, 0xce, 0x3c, 0xfd, 0x64, 0xb6, 0xc8, 0x24, 0xf2, 0xb5, 0xf3, 0x23,
+- 0xba, 0xfd, 0x4b, 0x7e, 0x4b, 0x99, 0x0b, 0x36, 0xa6, 0x5f, 0x2e, 0xb3,
+- 0x9d, 0x65, 0xb6, 0x5d, 0x51, 0x26, 0x82, 0xa7, 0xc6, 0x44, 0x17, 0xa2,
+- 0xb2, 0x3f, 0xa5, 0x8b, 0x9f, 0xda, 0xdd, 0x7e, 0xd1, 0x85, 0xd5, 0xee,
+- 0x41, 0xb0, 0xed, 0x41, 0xc5, 0x8d, 0xa5, 0xbd, 0x60, 0x1d, 0x3a, 0x41,
+- 0x71, 0x30, 0x56, 0xab, 0x44, 0x51, 0xdc, 0xab, 0x60, 0x69, 0xb8, 0x08,
+- 0x7a, 0x85, 0xb4, 0xf7, 0x4b, 0xdb, 0xd2, 0x44, 0xde, 0x13, 0x28, 0xe1,
+- 0xfd, 0x75, 0xe1, 0x9f, 0x13, 0xcf, 0x44, 0xa6, 0x30, 0xcb, 0xaf, 0xe0,
+- 0xfd, 0x37, 0xa6, 0xfc, 0x96, 0x72, 0xb6, 0xbd, 0x99, 0x3e, 0xdf, 0x43,
+- 0x1b, 0xdf, 0x9e, 0x8a, 0x05, 0xa9, 0x25, 0xcb, 0x13, 0xe5, 0xfd, 0x68,
+- 0xa8, 0xb5, 0x1b, 0xd2, 0x0f, 0x94, 0xe2, 0x28, 0xdc, 0x99, 0xe6, 0x09,
+- 0xef, 0xa9, 0x84, 0xd1, 0xfe, 0x8c, 0xe2, 0xa1, 0xb1, 0x4b, 0x3f, 0x13,
+- 0xde, 0x37, 0x12, 0x0a, 0xde, 0x37, 0x42, 0x1d, 0x67, 0x95, 0x09, 0xef,
+- 0xeb, 0x19, 0x0d, 0x33, 0x7a, 0x83, 0xed, 0x96, 0x12, 0xc1, 0x8f, 0x32,
+- 0x7e, 0x04, 0x7a, 0xa3, 0x38, 0x92, 0x31, 0xf1, 0xf4, 0x15, 0x38, 0xf0,
+- 0xa5, 0x7f, 0x96, 0x8b, 0x63, 0x5f, 0x97, 0xd0, 0xd1, 0x6d, 0x5e, 0xb4,
+- 0x63, 0x1a, 0xe2, 0xe5, 0xd1, 0x09, 0xef, 0x27, 0xbd, 0x50, 0xca, 0xa2,
+- 0x46, 0x20, 0xab, 0xfc, 0x83, 0x1d, 0xf7, 0x4b, 0x31, 0xca, 0xe7, 0x60,
+- 0x59, 0x94, 0x76, 0x47, 0x8c, 0x4a, 0x9d, 0xb7, 0x4b, 0x68, 0xb3, 0x05,
+- 0xd1, 0x6b, 0x31, 0x32, 0x68, 0xe0, 0xe9, 0x84, 0x6d, 0x7f, 0x6c, 0x8e,
+- 0x47, 0x7c, 0x30, 0xda, 0x3e, 0x42, 0x30, 0x36, 0x87, 0x7a, 0x39, 0x91,
+- 0x31, 0x30, 0x9c, 0x88, 0xe2, 0xc5, 0x44, 0x8d, 0xb6, 0x19, 0x4d, 0x88,
+- 0x05, 0x72, 0x31, 0x64, 0x94, 0x72, 0x0f, 0x85, 0xda, 0x50, 0x1e, 0x8d,
+- 0xe0, 0x28, 0xe5, 0x3e, 0x37, 0x57, 0xda, 0x31, 0xf1, 0xfa, 0xbf, 0x42,
+- 0x56, 0xe2, 0x3b, 0x9e, 0xa4, 0xac, 0x91, 0xa6, 0x8b, 0x36, 0xa6, 0x79,
+- 0x71, 0xda, 0xbc, 0x86, 0x76, 0x08, 0xab, 0x28, 0xea, 0x75, 0xf7, 0x24,
+- 0x34, 0x1c, 0xce, 0xf8, 0xdc, 0x9b, 0x13, 0x7e, 0x1c, 0xa0, 0xbf, 0xcd,
+- 0x88, 0xc2, 0x0a, 0xb0, 0xdd, 0x19, 0xc4, 0xb5, 0xec, 0x60, 0x35, 0xc6,
+- 0x06, 0x83, 0xe6, 0x1b, 0x4a, 0x00, 0x87, 0x86, 0xaf, 0xc5, 0xe8, 0xa0,
+- 0x82, 0x91, 0x10, 0x65, 0xe7, 0xf5, 0xf7, 0x06, 0xaf, 0x47, 0x66, 0xd0,
+- 0x85, 0x5d, 0x8e, 0x5e, 0x1d, 0x9c, 0x99, 0xfc, 0xbe, 0x16, 0xe9, 0x61,
+- 0xb8, 0xe7, 0xf4, 0x6a, 0x78, 0x26, 0xe3, 0x76, 0x1b, 0xbd, 0x7e, 0x0c,
+- 0x67, 0x7e, 0xca, 0x79, 0x93, 0xb6, 0x75, 0x0c, 0x25, 0x0e, 0x39, 0x73,
+- 0x58, 0x1e, 0x65, 0x63, 0xb9, 0xf8, 0xca, 0x58, 0xa6, 0x33, 0xce, 0x34,
+- 0x13, 0x87, 0xc4, 0xc7, 0xbd, 0xc4, 0x20, 0xf1, 0xf1, 0xb7, 0x14, 0x94,
+- 0x35, 0x63, 0xf3, 0x58, 0xfe, 0xb9, 0x42, 0xfb, 0x77, 0x63, 0x9d, 0xd6,
+- 0x80, 0x44, 0x4a, 0xec, 0x34, 0x8f, 0xcb, 0x72, 0x2d, 0xf3, 0x5f, 0x0c,
+- 0xeb, 0x60, 0x31, 0x76, 0xd1, 0xc7, 0x76, 0xee, 0x96, 0xfb, 0xb6, 0xfd,
+- 0x50, 0xb8, 0x9c, 0x36, 0x86, 0xc5, 0x45, 0x08, 0x99, 0x1f, 0x38, 0xb2,
+- 0x59, 0x38, 0x94, 0x91, 0x18, 0xaa, 0x33, 0xbe, 0x9d, 0x60, 0x5f, 0xcd,
+- 0xec, 0xc7, 0xc4, 0x4f, 0x39, 0x37, 0x7f, 0x3d, 0x56, 0x87, 0x1f, 0x8e,
+- 0x19, 0xf8, 0xef, 0x63, 0x3a, 0x9e, 0xbf, 0x02, 0xd7, 0xef, 0xa6, 0xae,
+- 0x04, 0xc3, 0x1a, 0xb0, 0x25, 0x55, 0x80, 0x6d, 0x83, 0xc5, 0xd8, 0x3c,
+- 0x58, 0x53, 0xf7, 0x22, 0xf1, 0xf8, 0x87, 0xe6, 0x1d, 0x18, 0xaf, 0x6c,
+- 0x76, 0x7c, 0x66, 0x07, 0xef, 0xef, 0x1c, 0xac, 0xe1, 0x1c, 0xda, 0xb6,
+- 0x1a, 0xae, 0x8f, 0x1c, 0x25, 0xbe, 0x4f, 0xf8, 0x83, 0xfa, 0xb8, 0x1a,
+- 0xd4, 0x63, 0xf0, 0x20, 0xd1, 0xa0, 0xc2, 0x9a, 0x1e, 0x4c, 0xd3, 0x8b,
+- 0xe1, 0x37, 0x1e, 0xe2, 0xd8, 0x82, 0xba, 0xa5, 0x36, 0xd0, 0x7e, 0x19,
+- 0x33, 0x54, 0x93, 0xf8, 0x52, 0x8c, 0x4f, 0x06, 0x83, 0x3d, 0x96, 0xba,
+- 0x02, 0x56, 0xa5, 0x6d, 0x7f, 0x3f, 0x8c, 0x8e, 0x6b, 0xa2, 0x88, 0x4d,
+- 0x67, 0x2c, 0xb8, 0x3e, 0x1a, 0x05, 0xe3, 0x18, 0xce, 0xf5, 0x1a, 0x81,
+- 0xbf, 0x53, 0xee, 0xc6, 0x7f, 0x6c, 0x0b, 0xea, 0xba, 0x5a, 0x6f, 0x1d,
+- 0x50, 0x49, 0x36, 0xaa, 0xa0, 0x07, 0xa2, 0xcb, 0xd0, 0xe9, 0xf0, 0x04,
+- 0x05, 0x9a, 0x61, 0x62, 0x73, 0x8a, 0x95, 0xfc, 0x35, 0xed, 0xfd, 0x6a,
+- 0xcd, 0x05, 0x53, 0x0d, 0x9e, 0x68, 0x53, 0x89, 0xb7, 0x4d, 0xe7, 0x6c,
+- 0xbd, 0xca, 0xb6, 0x1b, 0x9b, 0xa4, 0x4f, 0x1d, 0x95, 0x9c, 0xe7, 0x0a,
+- 0xce, 0x73, 0x63, 0xb6, 0x18, 0x67, 0x07, 0x61, 0x5d, 0x13, 0x0d, 0xb6,
+- 0x3e, 0xa2, 0x16, 0xe3, 0xc3, 0xe1, 0x62, 0xbc, 0x33, 0xe8, 0xc6, 0x07,
+- 0x83, 0xb6, 0xbd, 0xde, 0x2c, 0x47, 0x41, 0x18, 0xd3, 0x0b, 0x10, 0x3a,
+- 0x3f, 0x04, 0x0b, 0x5f, 0xb0, 0xec, 0xef, 0x06, 0x03, 0xf8, 0xc7, 0xc1,
+- 0xaf, 0xe2, 0xf9, 0xca, 0xd8, 0xc9, 0x69, 0x8c, 0x91, 0x17, 0x68, 0x3f,
+- 0xe7, 0x12, 0xc1, 0xf6, 0x19, 0xae, 0x60, 0x27, 0x79, 0xcb, 0x86, 0xc7,
+- 0x94, 0x60, 0xfc, 0x0d, 0x25, 0xa8, 0xf7, 0x2a, 0x7e, 0x7c, 0x44, 0x3b,
+- 0x3d, 0x93, 0xa9, 0x89, 0xfc, 0x9c, 0xfd, 0xff, 0xde, 0xfc, 0xa1, 0x3d,
+- 0x5e, 0x25, 0x3a, 0x14, 0x7d, 0x51, 0xe7, 0x29, 0xea, 0x9c, 0xfe, 0xfb,
+- 0xc3, 0x14, 0x75, 0x4e, 0x79, 0x9e, 0xff, 0x83, 0xf8, 0x25, 0xf3, 0x15,
+- 0xe1, 0x3c, 0x5e, 0x87, 0xff, 0xe2, 0x8c, 0xed, 0xa4, 0xfd, 0x9f, 0xfc,
+- 0x32, 0xbe, 0xcf, 0xfd, 0x39, 0x0c, 0x92, 0x71, 0x9e, 0xb0, 0xe3, 0x9a,
+- 0x8c, 0x51, 0xc6, 0xea, 0xe8, 0x52, 0xef, 0x50, 0x1e, 0x55, 0x51, 0x6c,
+- 0xdb, 0x4f, 0x98, 0x93, 0xcf, 0xfd, 0xf9, 0xb1, 0x7e, 0x95, 0xf7, 0x65,
+- 0xbc, 0x67, 0x5d, 0xa2, 0x7b, 0x5d, 0xbd, 0x89, 0xbf, 0x83, 0x56, 0x0c,
+- 0xa7, 0x0b, 0xf9, 0xbb, 0x2e, 0x76, 0xe9, 0xf7, 0x93, 0xa5, 0x57, 0x3e,
+- 0xa7, 0x9d, 0x3a, 0xfd, 0xdd, 0xcd, 0xdf, 0x32, 0x96, 0x37, 0x69, 0x37,
+- 0x5f, 0x66, 0x27, 0x62, 0x23, 0x75, 0xb4, 0xa7, 0x33, 0x12, 0x57, 0x2c,
+- 0x7f, 0xd4, 0x6b, 0xa9, 0x51, 0xe8, 0x74, 0x7d, 0xaf, 0x12, 0xed, 0x80,
+- 0x9e, 0xb1, 0x70, 0x4f, 0xb3, 0x0b, 0xdf, 0x6a, 0x56, 0x30, 0xcd, 0xe8,
+- 0x40, 0xdf, 0x3c, 0xcb, 0xae, 0x30, 0xf6, 0xab, 0xe2, 0x03, 0x05, 0x49,
+- 0x58, 0xf4, 0x3b, 0x44, 0xc8, 0x95, 0xca, 0xff, 0x9d, 0x82, 0xd3, 0xe1,
+- 0x10, 0x6d, 0x6e, 0x0b, 0x39, 0x15, 0x50, 0x98, 0x84, 0xb7, 0x94, 0xf3,
+- 0x3f, 0xda, 0x0b, 0x6f, 0x31, 0x7d, 0x7f, 0x59, 0x6f, 0x4d, 0xc7, 0x7b,
+- 0xc4, 0x8a, 0xac, 0x12, 0x6c, 0xa7, 0xbe, 0xcd, 0x32, 0x25, 0xd8, 0x7a,
+- 0x3b, 0xf5, 0x5d, 0xab, 0x48, 0x3f, 0x51, 0xd4, 0x65, 0xb6, 0x10, 0x73,
+- 0xe4, 0x3a, 0x02, 0x23, 0xf3, 0xab, 0x49, 0xd9, 0xe1, 0xf5, 0x50, 0x86,
+- 0x83, 0x89, 0x77, 0xed, 0xb4, 0x16, 0xd4, 0xd3, 0xce, 0xef, 0x0d, 0xfc,
+- 0x0d, 0x6f, 0x41, 0x74, 0x23, 0x5e, 0x4a, 0x3c, 0xe5, 0xcf, 0x97, 0xcb,
+- 0xc9, 0x7a, 0xb5, 0x3c, 0xff, 0xd3, 0x8e, 0xf9, 0x73, 0xf2, 0xf8, 0x92,
+- 0x5b, 0x40, 0x8e, 0xe2, 0x2d, 0x64, 0x5f, 0xef, 0x3b, 0xf5, 0x23, 0xac,
+- 0x5f, 0xd3, 0xde, 0xab, 0x04, 0xeb, 0x3e, 0x42, 0xbd, 0xfe, 0x3d, 0x04,
+- 0x5b, 0x8f, 0x92, 0x5b, 0x1a, 0x93, 0xf2, 0x84, 0x32, 0x0e, 0x9f, 0x71,
+- 0xe4, 0x99, 0x95, 0x81, 0xe2, 0xea, 0x85, 0x6f, 0xa6, 0x51, 0x8b, 0x2e,
+- 0x67, 0x4e, 0xa1, 0x04, 0x7a, 0x75, 0x94, 0x91, 0xbf, 0x04, 0x46, 0x81,
+- 0xb1, 0x01, 0x72, 0xb9, 0x70, 0x0d, 0xbe, 0xc9, 0x58, 0x30, 0x83, 0x65,
+- 0x1e, 0xd3, 0x2e, 0xe1, 0x97, 0xd2, 0x93, 0x20, 0xc0, 0x4c, 0xcf, 0xf1,
+- 0xb2, 0xf8, 0xbd, 0x88, 0xc9, 0xbd, 0x27, 0x13, 0x50, 0x52, 0x89, 0xe0,
+- 0x3e, 0xc0, 0x18, 0x0f, 0xbb, 0x62, 0x0f, 0x07, 0xd0, 0x85, 0x73, 0xe1,
+- 0x50, 0x3c, 0xab, 0x84, 0xda, 0x07, 0x14, 0xd3, 0xbb, 0x8b, 0xfd, 0x6d,
+- 0x67, 0x99, 0x1d, 0xfc, 0x9c, 0x35, 0x0c, 0x73, 0x85, 0x12, 0xbb, 0xa1,
+- 0x80, 0x65, 0x6a, 0xc2, 0x21, 0xf2, 0xcc, 0xd0, 0x85, 0x95, 0x30, 0xbd,
+- 0x4f, 0x65, 0xa4, 0xad, 0x88, 0xb2, 0x25, 0xfb, 0xa4, 0x9a, 0xc3, 0xa3,
+- 0xdf, 0x4f, 0xea, 0xec, 0x1d, 0xf9, 0xed, 0xf4, 0xed, 0xee, 0xfd, 0xaf,
+- 0x85, 0x7f, 0x78, 0xef, 0xaf, 0xa7, 0x5d, 0x79, 0xaf, 0x5e, 0x1b, 0xa6,
+- 0xff, 0xb9, 0x8c, 0x22, 0xce, 0x9d, 0xf0, 0xa3, 0x58, 0x9d, 0x07, 0x72,
+- 0xcf, 0x85, 0xb4, 0x3b, 0x16, 0x70, 0xe1, 0x73, 0x3b, 0xb6, 0x4a, 0xee,
+- 0x15, 0x23, 0xde, 0x56, 0x1f, 0x70, 0xa3, 0x3e, 0xb2, 0x95, 0x58, 0x30,
+- 0xb1, 0x6a, 0x21, 0x9f, 0x85, 0xcc, 0x17, 0x51, 0xa3, 0x6f, 0x85, 0x5c,
+- 0x7f, 0x46, 0x9b, 0x5d, 0x28, 0x75, 0x59, 0x26, 0xc7, 0x7d, 0x04, 0x6b,
+- 0xb6, 0x98, 0x36, 0x5e, 0x22, 0x4c, 0x14, 0x46, 0x8f, 0x28, 0xa7, 0x13,
+- 0x5f, 0xd8, 0x31, 0x37, 0x96, 0xd3, 0x2f, 0x4d, 0xea, 0x59, 0xf7, 0x46,
+- 0x43, 0xfa, 0x09, 0x66, 0x0a, 0xae, 0xa8, 0xa5, 0x4c, 0x64, 0xb6, 0x28,
+- 0xef, 0x66, 0x7a, 0x94, 0x33, 0x19, 0xa9, 0x7b, 0x44, 0x79, 0x27, 0x23,
+- 0xf1, 0xb0, 0x5a, 0x3f, 0x4e, 0x7e, 0x43, 0x4e, 0xa5, 0x6e, 0x36, 0xa1,
+- 0x6c, 0x33, 0xcb, 0xc8, 0xf3, 0x8d, 0xba, 0x21, 0xca, 0x7b, 0xb0, 0x19,
+- 0xe6, 0x76, 0xd3, 0x83, 0x09, 0x0d, 0xbe, 0xcd, 0xa6, 0x5b, 0x7e, 0x33,
+- 0x1f, 0x90, 0xba, 0xd5, 0xfa, 0xd6, 0xcc, 0x45, 0xfa, 0x57, 0xee, 0xf7,
+- 0xc1, 0xe6, 0xfc, 0xbd, 0xdf, 0xda, 0xe3, 0xab, 0x54, 0xfe, 0xfe, 0x77,
+- 0x2e, 0x0e, 0x85, 0x75, 0xa7, 0xf2, 0x73, 0xe1, 0x52, 0x2a, 0xf9, 0x63,
+- 0x05, 0x2c, 0x2d, 0x68, 0xa5, 0x99, 0x0e, 0x6d, 0x4e, 0x35, 0xd2, 0xdf,
+- 0x02, 0x8c, 0x95, 0x51, 0xe2, 0x3b, 0x79, 0x2f, 0xfb, 0x2c, 0x30, 0x7c,
+- 0x58, 0x9c, 0xa8, 0x71, 0xe5, 0xf4, 0xa7, 0x12, 0xc3, 0x5c, 0x8c, 0xe9,
+- 0xc2, 0xf1, 0xae, 0xe6, 0xdc, 0xd5, 0xfa, 0x07, 0x94, 0xbb, 0xc8, 0x30,
+- 0xea, 0x8a, 0x94, 0x6a, 0xfd, 0xdd, 0x4c, 0x94, 0x3e, 0xde, 0xce, 0x7e,
+- 0x7d, 0x78, 0x37, 0x51, 0xc6, 0x1c, 0x24, 0x18, 0xb3, 0xd8, 0xe0, 0x92,
+- 0xe6, 0x00, 0xc8, 0xf9, 0xa6, 0xfc, 0xb5, 0x81, 0xf1, 0x5f, 0x62, 0xb4,
+- 0x7a, 0xdb, 0xdc, 0x08, 0x36, 0x64, 0xe0, 0x5e, 0xd7, 0x1c, 0xc5, 0x7a,
+- 0xc6, 0xf6, 0x87, 0x18, 0x2f, 0x37, 0x32, 0x16, 0xee, 0x0a, 0x73, 0x6c,
+- 0x15, 0xb6, 0x5d, 0x68, 0x74, 0x49, 0x3e, 0x83, 0x5e, 0xc6, 0xe2, 0xb5,
+- 0x8c, 0x2f, 0x5b, 0x78, 0x7d, 0x2a, 0xf3, 0xcf, 0xf6, 0x43, 0xcc, 0xa7,
+- 0x5e, 0xba, 0xa2, 0x4d, 0xa8, 0xc3, 0x46, 0x7d, 0xdd, 0x56, 0xc6, 0x62,
+- 0xb6, 0x6b, 0x95, 0x45, 0x6d, 0xfb, 0x86, 0x50, 0x30, 0xe6, 0x51, 0x4c,
+- 0xbc, 0x38, 0x3a, 0x61, 0xeb, 0xd3, 0x25, 0x97, 0xca, 0xc7, 0x41, 0x19,
+- 0xab, 0xe4, 0x08, 0x82, 0x0f, 0x92, 0x27, 0x4c, 0xc5, 0x08, 0x15, 0x4b,
+- 0x06, 0x25, 0x4f, 0x08, 0x60, 0x65, 0xe2, 0xbb, 0x78, 0xb1, 0xc1, 0x8d,
+- 0x56, 0xe6, 0x58, 0xb7, 0x25, 0x7c, 0x58, 0x41, 0x2c, 0x5d, 0x9a, 0x60,
+- 0xee, 0xa4, 0xf9, 0xb1, 0x2c, 0xe1, 0xc6, 0xb1, 0x06, 0xe6, 0x40, 0xfe,
+- 0x42, 0x7c, 0x64, 0xba, 0x70, 0xdc, 0xd4, 0x90, 0x76, 0xfc, 0x61, 0x17,
+- 0x31, 0x90, 0x7a, 0x54, 0x25, 0x77, 0x10, 0x1d, 0xba, 0xa8, 0x4f, 0x15,
+- 0xf1, 0x4b, 0x3a, 0xfc, 0xb2, 0x5c, 0x40, 0xe4, 0x92, 0x7c, 0xe0, 0x37,
+- 0x76, 0x7c, 0xba, 0xd4, 0x87, 0xe5, 0x8b, 0xca, 0x38, 0x84, 0xdf, 0x12,
+- 0x27, 0x47, 0x4d, 0x72, 0xbb, 0xa9, 0x43, 0x3d, 0x4f, 0x6e, 0x5d, 0x8e,
+- 0xb7, 0x0c, 0xe1, 0xd6, 0x6f, 0x42, 0xa3, 0xef, 0xf6, 0x8c, 0x86, 0x3a,
+- 0xce, 0x2b, 0x2e, 0x9c, 0x32, 0xca, 0xc8, 0xfb, 0x38, 0x0f, 0xa3, 0x70,
+- 0x6f, 0x9d, 0x6b, 0x22, 0x39, 0xda, 0x1d, 0x29, 0xe5, 0x78, 0xdd, 0x73,
+- 0x73, 0x9c, 0xe8, 0xeb, 0xd4, 0xed, 0x9a, 0xb0, 0xc3, 0x89, 0x72, 0x7c,
+- 0x40, 0xb3, 0xed, 0x77, 0x0c, 0xd1, 0x33, 0x70, 0x78, 0x52, 0xc7, 0x07,
+- 0x79, 0xdd, 0x33, 0xa9, 0xe3, 0x2d, 0x6c, 0x8f, 0xfe, 0x87, 0x6d, 0x57,
+- 0xf0, 0x18, 0x1d, 0xcc, 0x29, 0xc9, 0x6f, 0x88, 0xc3, 0xc4, 0x95, 0x18,
+- 0x75, 0xfc, 0x72, 0x66, 0x83, 0xe0, 0x36, 0xa7, 0xbb, 0xd1, 0xc1, 0xef,
+- 0x98, 0x7a, 0x98, 0x76, 0x20, 0x7a, 0x78, 0x6b, 0x32, 0xb7, 0xb1, 0xed,
+- 0x01, 0x53, 0x74, 0x9c, 0xcf, 0xcb, 0x44, 0xd7, 0x37, 0x4a, 0x8e, 0xd5,
+- 0x03, 0x7c, 0xc1, 0xb2, 0x2e, 0xe2, 0xee, 0x42, 0xfc, 0xa0, 0x4d, 0x6c,
+- 0xa7, 0xd4, 0x89, 0x95, 0xf3, 0x6b, 0x6d, 0x3b, 0xdc, 0xa4, 0xe3, 0x82,
+- 0x51, 0x1f, 0x69, 0x54, 0x67, 0x51, 0xd6, 0x28, 0xf6, 0x91, 0x0f, 0x74,
+- 0xa7, 0x66, 0x22, 0xe6, 0x17, 0x5b, 0x43, 0x47, 0x41, 0x0e, 0xc3, 0x71,
+- 0x26, 0x61, 0xd4, 0x6d, 0xc3, 0x0c, 0x1c, 0xf0, 0xb7, 0x90, 0xc7, 0xa9,
+- 0x2d, 0x4c, 0xff, 0xc9, 0x9f, 0x0c, 0x6b, 0x07, 0xce, 0xda, 0x69, 0xbf,
+- 0xcd, 0x38, 0x49, 0x18, 0xa0, 0x2e, 0x5f, 0xd1, 0x5c, 0x78, 0xb5, 0xee,
+- 0x9a, 0x49, 0xbe, 0x29, 0x9c, 0xe5, 0x3d, 0xfb, 0x98, 0x5f, 0xfa, 0x62,
+- 0x9e, 0xa7, 0x2e, 0x73, 0x49, 0x1e, 0xe8, 0x36, 0xa4, 0x6d, 0xe6, 0x0b,
+- 0x63, 0x57, 0xcb, 0x30, 0x61, 0x4f, 0xf8, 0x45, 0x86, 0xa0, 0xa6, 0xab,
+- 0x7f, 0x6c, 0x1e, 0xaf, 0xc3, 0xcf, 0x35, 0x37, 0x7c, 0xe4, 0xc5, 0xaf,
+- 0xf9, 0x73, 0x6d, 0xf4, 0x9a, 0xe3, 0x33, 0x4a, 0x1d, 0xac, 0x3c, 0xa2,
+- 0x24, 0x89, 0x0f, 0xe3, 0x1e, 0x68, 0xe5, 0x51, 0xb7, 0xae, 0x11, 0x13,
+- 0x36, 0x13, 0x13, 0x2c, 0x62, 0x42, 0x5f, 0xe6, 0x88, 0x92, 0xca, 0x7c,
+- 0x46, 0x5d, 0x48, 0x1d, 0xb1, 0x9d, 0x2d, 0x94, 0xe5, 0x27, 0x36, 0xaa,
+- 0x44, 0x9e, 0x0b, 0xbc, 0xdf, 0x42, 0x1e, 0x92, 0x97, 0x53, 0x7c, 0x95,
+- 0x10, 0x54, 0x2c, 0xcf, 0x52, 0xb9, 0xdf, 0xaa, 0x5c, 0xcf, 0x70, 0x4b,
+- 0xb9, 0xee, 0xb1, 0xa3, 0x4b, 0xdd, 0x58, 0x80, 0xd9, 0xe1, 0x85, 0x8b,
+- 0x44, 0x17, 0x6a, 0x34, 0xa6, 0x7b, 0x61, 0x55, 0xb9, 0x88, 0xe5, 0xef,
+- 0x35, 0x34, 0x60, 0x11, 0x73, 0xce, 0xb3, 0x04, 0xa7, 0x6e, 0xc3, 0x85,
+- 0x71, 0xea, 0xe7, 0x69, 0x53, 0xd6, 0x1b, 0x6c, 0xdc, 0x16, 0xb6, 0xe2,
+- 0xf4, 0x78, 0xab, 0x94, 0xb6, 0x57, 0x6c, 0x08, 0x4f, 0x28, 0x43, 0x49,
+- 0xd4, 0x5d, 0x77, 0x16, 0x41, 0x73, 0x17, 0x79, 0x92, 0x5e, 0x31, 0x3b,
+- 0xe2, 0xa1, 0xe6, 0x5e, 0x4f, 0x84, 0x22, 0xc7, 0x95, 0x9c, 0x3f, 0xbd,
+- 0x4c, 0xdb, 0x78, 0x2b, 0x61, 0x74, 0x16, 0xba, 0x72, 0xbf, 0xdf, 0x70,
+- 0xf2, 0xd9, 0xbc, 0x3f, 0x05, 0x26, 0x71, 0xc7, 0xeb, 0x3d, 0x93, 0xc0,
+- 0x79, 0xb5, 0x59, 0xf2, 0x5a, 0x9c, 0xdf, 0x6c, 0x8e, 0x2b, 0x1e, 0xa3,
+- 0x8c, 0xfa, 0x10, 0x2c, 0x2e, 0x20, 0xa7, 0x14, 0xee, 0xe0, 0xf5, 0x9e,
+- 0x65, 0x19, 0x72, 0xc2, 0x89, 0xba, 0xf9, 0xf5, 0x11, 0x2f, 0x62, 0x56,
+- 0x21, 0xfd, 0xba, 0x34, 0xea, 0xf7, 0xde, 0x98, 0xb5, 0xaa, 0x7c, 0xf4,
+- 0x8b, 0x12, 0xe6, 0xbb, 0xb3, 0x93, 0x0b, 0xcb, 0x24, 0x57, 0xdc, 0x38,
+- 0xca, 0x91, 0x55, 0xf6, 0x57, 0xa9, 0x51, 0x59, 0xc3, 0xd0, 0xe0, 0xa9,
+- 0xdc, 0x78, 0x8b, 0x1a, 0x9d, 0x40, 0x7b, 0xb3, 0xb7, 0x25, 0x92, 0x85,
+- 0xb7, 0x22, 0xba, 0x09, 0xe1, 0xa4, 0xe4, 0xad, 0x82, 0xb1, 0xb1, 0xad,
+- 0x44, 0xbd, 0xaa, 0xf2, 0x79, 0xf9, 0xb9, 0x82, 0x5a, 0x16, 0x95, 0xfc,
+- 0x55, 0x6f, 0x79, 0xc3, 0xc1, 0x62, 0x8d, 0xf9, 0xc6, 0xaf, 0x02, 0xff,
+- 0x77, 0xf5, 0x5b, 0xdd, 0x32, 0x77, 0x1e, 0x43, 0xbe, 0x65, 0xdd, 0x00,
+- 0x6e, 0x95, 0x58, 0xda, 0x3d, 0xe2, 0x66, 0x7e, 0x26, 0xf3, 0x25, 0xf1,
+- 0xf8, 0xc8, 0xbd, 0x2f, 0xd1, 0xdf, 0x3c, 0xd4, 0xfd, 0x0e, 0xc3, 0x62,
+- 0x98, 0xb0, 0x6d, 0x23, 0x1c, 0x0c, 0x14, 0x28, 0x3a, 0xb6, 0x37, 0xfc,
+- 0x13, 0xed, 0x0b, 0xc4, 0x41, 0x90, 0x98, 0x97, 0x61, 0xcb, 0x48, 0xc1,
+- 0x94, 0x7a, 0x91, 0xfb, 0xf2, 0xf5, 0x7a, 0x0d, 0x2b, 0x2e, 0xf5, 0x86,
+- 0xc3, 0xc1, 0xf6, 0x6d, 0xac, 0xb7, 0x93, 0xf5, 0x62, 0x8c, 0xbd, 0xeb,
+- 0x47, 0x35, 0x27, 0x1f, 0xb4, 0x46, 0x8a, 0xa7, 0xf6, 0x77, 0xa9, 0xde,
+- 0x93, 0x86, 0x35, 0xee, 0xf4, 0xd7, 0x14, 0xec, 0x2c, 0x70, 0xb9, 0x91,
+- 0x64, 0xbd, 0x71, 0xd6, 0x7b, 0x77, 0x54, 0xd6, 0x33, 0x70, 0xcb, 0x48,
+- 0x22, 0x35, 0xe1, 0x32, 0x0c, 0xed, 0x1d, 0xc4, 0x88, 0xd9, 0xce, 0x5c,
+- 0xde, 0x72, 0x28, 0xd3, 0x85, 0xed, 0xc6, 0xd1, 0x70, 0x21, 0xeb, 0x1d,
+- 0x37, 0x8e, 0x06, 0x3c, 0xf4, 0x99, 0x75, 0x6c, 0xaf, 0x9b, 0x79, 0x91,
+- 0x4a, 0x8c, 0xdc, 0x32, 0x22, 0xdc, 0xc1, 0xc4, 0x6c, 0xe6, 0x67, 0x8e,
+- 0x6d, 0xca, 0xda, 0x09, 0x64, 0x4e, 0x65, 0x7c, 0xc1, 0xba, 0x11, 0x67,
+- 0x7c, 0xca, 0x35, 0x87, 0x25, 0x57, 0xae, 0xb0, 0xb0, 0xb9, 0x41, 0xe2,
+- 0xa7, 0x42, 0xec, 0x0e, 0xd6, 0x8d, 0x33, 0x9e, 0x6c, 0x1b, 0xfb, 0x33,
+- 0x8c, 0x6b, 0x95, 0xcc, 0x65, 0x6d, 0xfb, 0x15, 0x63, 0x61, 0x05, 0x43,
+- 0xbc, 0xd7, 0x4b, 0x99, 0xbd, 0xa1, 0x62, 0x89, 0xd3, 0x4e, 0x5b, 0x31,
+- 0x08, 0x3e, 0x29, 0x48, 0x1a, 0xd6, 0x06, 0x91, 0xff, 0x58, 0x38, 0x18,
+- 0x3f, 0xac, 0xd4, 0xb7, 0x6f, 0xc3, 0x3f, 0x11, 0x2f, 0x41, 0xac, 0x9b,
+- 0x89, 0x21, 0x93, 0xd6, 0xd2, 0x66, 0x31, 0x42, 0x4a, 0x8c, 0x77, 0x9f,
+- 0x58, 0xc4, 0x08, 0xe7, 0x46, 0xb0, 0xb3, 0x95, 0xe5, 0x23, 0xb9, 0x75,
+- 0x16, 0x5c, 0x18, 0x0d, 0x32, 0x0e, 0x8b, 0x2e, 0x80, 0xad, 0x99, 0x7c,
+- 0x2c, 0xb0, 0xed, 0x83, 0xa6, 0x6d, 0xbf, 0x64, 0xce, 0xc4, 0x61, 0x33,
+- 0x18, 0x17, 0x1f, 0x78, 0xdf, 0x5c, 0x78, 0x83, 0xe4, 0xc5, 0x80, 0xc8,
+- 0xa6, 0x30, 0x76, 0x29, 0x28, 0xe1, 0x27, 0x10, 0x72, 0xeb, 0x25, 0x8a,
+- 0x0d, 0x6f, 0x53, 0x6d, 0x67, 0x2d, 0xf5, 0x5e, 0x36, 0x5f, 0xc1, 0x27,
+- 0x37, 0x2a, 0x38, 0x7a, 0x63, 0x28, 0x30, 0xa4, 0x94, 0x32, 0x2e, 0x84,
+- 0xda, 0x5a, 0x14, 0xeb, 0x04, 0xeb, 0xc6, 0x1a, 0x5c, 0xc1, 0x00, 0x94,
+- 0x72, 0x62, 0xd6, 0x6c, 0x5d, 0x68, 0x8b, 0xbb, 0x37, 0x14, 0xd8, 0xc9,
+- 0x6f, 0xd7, 0xa8, 0x82, 0x51, 0x23, 0x18, 0x83, 0xd3, 0x3e, 0xfb, 0x66,
+- 0xca, 0x7c, 0x53, 0xc8, 0xb6, 0x4f, 0x86, 0xeb, 0xb5, 0x93, 0x78, 0x9f,
+- 0xb8, 0x2c, 0xfd, 0xe4, 0x65, 0x03, 0xf3, 0x70, 0x23, 0xd6, 0xa2, 0xdc,
+- 0x24, 0xb4, 0x84, 0x71, 0x52, 0x62, 0x79, 0x5e, 0xde, 0x7c, 0x4c, 0xb7,
+- 0xed, 0xf7, 0xcd, 0x5c, 0x5b, 0x5a, 0x73, 0x30, 0x0e, 0xcc, 0xc4, 0x98,
+- 0x11, 0x6c, 0x1d, 0xa7, 0x1e, 0x02, 0xf4, 0xf5, 0x19, 0x46, 0x15, 0x26,
+- 0x3c, 0x41, 0x6d, 0x42, 0x59, 0xf4, 0x99, 0x8a, 0x39, 0x1b, 0x9e, 0x52,
+- 0xea, 0x3b, 0x8a, 0x60, 0x90, 0x9f, 0x5e, 0x23, 0xf3, 0x11, 0xf0, 0x91,
+- 0x0b, 0xae, 0x83, 0xc3, 0x2f, 0x70, 0x7b, 0xc2, 0x1d, 0xbb, 0x80, 0x1a,
+- 0xfa, 0x9d, 0xd1, 0xfe, 0x90, 0x12, 0x64, 0xf2, 0xf2, 0x35, 0x26, 0x38,
+- 0x22, 0x6b, 0x15, 0xe2, 0xf7, 0xd8, 0xf6, 0xc3, 0x94, 0x75, 0x17, 0x65,
+- 0xdd, 0x18, 0xfe, 0xd8, 0xfe, 0x07, 0xa7, 0xcd, 0x5b, 0x31, 0x64, 0x5c,
+- 0xdd, 0xee, 0x47, 0x36, 0xa6, 0x4b, 0xbb, 0x1e, 0x2c, 0x99, 0xce, 0x5c,
+- 0xab, 0x59, 0xf0, 0xaa, 0xd2, 0x43, 0x7c, 0x62, 0x7b, 0x8c, 0x7f, 0xea,
+- 0xd5, 0x1c, 0xc2, 0x05, 0xc6, 0xe6, 0x40, 0x5c, 0x51, 0xab, 0x4b, 0xa0,
+- 0xc1, 0x6b, 0xd8, 0x78, 0x84, 0x7c, 0x27, 0x36, 0xbd, 0x1c, 0xdf, 0xe4,
+- 0x9c, 0x96, 0x86, 0xd4, 0x6b, 0x5d, 0x9c, 0x93, 0xc3, 0x61, 0xf9, 0xed,
+- 0xc1, 0xf8, 0x74, 0x17, 0xba, 0x38, 0xcb, 0x5a, 0x48, 0x9d, 0x21, 0xf7,
+- 0xbd, 0x8d, 0xf2, 0x9b, 0xf2, 0x5f, 0xa3, 0xe0, 0x61, 0x5a, 0xa4, 0x1a,
+- 0xea, 0x0e, 0xc8, 0xfd, 0x56, 0x53, 0x7e, 0x2b, 0xe4, 0x92, 0x6e, 0xce,
+- 0x8b, 0x0d, 0x97, 0x2c, 0x4d, 0x84, 0x78, 0x3f, 0x2c, 0xd7, 0xb1, 0x87,
+- 0x39, 0xee, 0xd8, 0x01, 0x45, 0x30, 0xee, 0x97, 0xf6, 0x2b, 0x8c, 0x81,
+- 0x1a, 0x9f, 0x7f, 0x93, 0x7d, 0x9f, 0x08, 0xbf, 0x64, 0xcf, 0xa8, 0x50,
+- 0x70, 0x32, 0xa2, 0x63, 0xe6, 0x8d, 0xd5, 0x98, 0xb8, 0x5b, 0xc6, 0xac,
+- 0xa0, 0xd4, 0x38, 0xe8, 0x91, 0x1c, 0xb9, 0xcc, 0xb8, 0x06, 0x4b, 0x56,
+- 0xe4, 0xee, 0x15, 0x85, 0x64, 0x8d, 0x53, 0x47, 0xd1, 0x8d, 0x95, 0xd0,
+- 0x27, 0xef, 0x2d, 0x0a, 0xb9, 0xdb, 0x4a, 0x15, 0x43, 0xbb, 0x5d, 0x91,
+- 0xe7, 0xbf, 0x23, 0x2f, 0xb7, 0xed, 0x47, 0x38, 0x5f, 0xb3, 0xc3, 0x3e,
+- 0x9c, 0x63, 0x3f, 0xdd, 0xd4, 0xdf, 0xf2, 0x4b, 0xf3, 0x95, 0xaf, 0xff,
+- 0xa9, 0xad, 0xdf, 0x23, 0x75, 0xa5, 0x8d, 0xda, 0xd6, 0x25, 0xca, 0x03,
+- 0x1e, 0xc9, 0x91, 0x36, 0x86, 0x1d, 0x9d, 0xb1, 0xec, 0x73, 0xce, 0x6f,
+- 0xad, 0xf9, 0xad, 0x4b, 0xeb, 0x75, 0xe7, 0x9d, 0x58, 0xba, 0x70, 0xbe,
+- 0x86, 0x09, 0xbb, 0xa2, 0xd1, 0xd2, 0x0a, 0x21, 0x31, 0xb5, 0xa6, 0xee,
+- 0x39, 0xb6, 0xfb, 0x73, 0x33, 0x17, 0x6f, 0x0f, 0x9a, 0xc1, 0x3e, 0x8b,
+- 0xfe, 0x13, 0x67, 0x8e, 0xdb, 0x22, 0xbc, 0x63, 0xec, 0x16, 0xce, 0xc3,
+- 0x4c, 0x14, 0x36, 0x06, 0x7b, 0x66, 0x31, 0xe7, 0x73, 0x35, 0x4b, 0x9c,
+- 0x96, 0xf9, 0x71, 0xca, 0xb0, 0xaf, 0x22, 0x2c, 0xa2, 0x8c, 0xe1, 0xc6,
+- 0x3f, 0x15, 0xdf, 0xa4, 0x1d, 0xb1, 0xce, 0x60, 0x4f, 0x0c, 0x7f, 0xaa,
+- 0x2c, 0xc8, 0x28, 0x64, 0x2d, 0xcc, 0x7b, 0x4b, 0x3c, 0xa3, 0x92, 0x23,
+- 0x15, 0x68, 0xdd, 0xcd, 0x55, 0xfc, 0xc8, 0x73, 0xf7, 0x2d, 0x6b, 0x32,
+- 0x97, 0xd6, 0x20, 0xd1, 0x67, 0x16, 0x40, 0xbd, 0x49, 0xe2, 0x05, 0x7d,
+- 0x59, 0x93, 0xf1, 0x59, 0xb4, 0x72, 0x59, 0x5f, 0x30, 0x56, 0xad, 0x25,
+- 0x5e, 0xbc, 0xc8, 0x1e, 0x87, 0xc9, 0xc5, 0x2c, 0xc7, 0x33, 0x9c, 0xf8,
+- 0x37, 0x65, 0x4d, 0x52, 0xe2, 0x57, 0x7e, 0x5d, 0xb3, 0x12, 0xfd, 0x7b,
+- 0x57, 0x40, 0xaf, 0xca, 0x61, 0xa0, 0x1a, 0x6d, 0xc2, 0xc2, 0xbe, 0x40,
+- 0x41, 0x2e, 0x7f, 0x28, 0x43, 0xef, 0xde, 0x30, 0xd2, 0xd3, 0x9d, 0xfa,
+- 0xbc, 0xe7, 0x85, 0x60, 0xf4, 0xf6, 0xbd, 0xd7, 0xca, 0x7a, 0x40, 0x40,
+- 0xda, 0x8d, 0xd3, 0x77, 0x54, 0xe3, 0x43, 0xdb, 0xd2, 0xa4, 0xfd, 0xa3,
+- 0x37, 0x10, 0x47, 0xcc, 0xc5, 0xa8, 0x6f, 0x3f, 0x84, 0x33, 0xe4, 0xa4,
+- 0x4e, 0xbe, 0xa4, 0x17, 0x46, 0xc7, 0x1f, 0xf6, 0x20, 0x14, 0x1f, 0x21,
+- 0x0e, 0xf8, 0x46, 0xbd, 0xe4, 0x56, 0x33, 0x9d, 0x75, 0xaf, 0x85, 0xc4,
+- 0x96, 0x38, 0x79, 0xf9, 0xd7, 0xdc, 0x6e, 0xac, 0x25, 0x66, 0x1c, 0x34,
+- 0xea, 0x3b, 0x0e, 0xe1, 0x1f, 0x89, 0xb3, 0x52, 0x5e, 0x65, 0x7f, 0xd2,
+- 0xa6, 0x9b, 0xfd, 0xc1, 0x4b, 0x2e, 0x70, 0x2f, 0xf9, 0xac, 0xdb, 0x63,
+- 0xfc, 0xc4, 0x23, 0xbc, 0x43, 0x78, 0xf7, 0xae, 0xbd, 0x0a, 0x5a, 0xd8,
+- 0xce, 0x4e, 0xda, 0xcc, 0xc3, 0x21, 0xb8, 0x5b, 0x6f, 0x24, 0xbf, 0x02,
+- 0x5d, 0x70, 0xba, 0x0f, 0x3b, 0x46, 0x10, 0xc9, 0x18, 0xe3, 0x33, 0x7c,
+- 0xa8, 0x62, 0x3b, 0x12, 0x53, 0x0a, 0x26, 0xdb, 0x89, 0xdc, 0x77, 0x65,
+- 0x3b, 0x65, 0x78, 0x72, 0xb2, 0x9d, 0x7d, 0x6c, 0xe7, 0xe6, 0xd9, 0x70,
+- 0x97, 0xdd, 0x2c, 0x73, 0xd5, 0x40, 0xff, 0x29, 0x43, 0xca, 0x89, 0x2b,
+- 0xe4, 0xa3, 0x5f, 0x85, 0x62, 0xd4, 0x4a, 0xee, 0x72, 0xd6, 0xa9, 0xb7,
+- 0xb8, 0x61, 0xfc, 0x02, 0x69, 0x91, 0x72, 0x7e, 0xf6, 0x38, 0x1d, 0x35,
+- 0xaf, 0x9b, 0x2a, 0x6c, 0xdd, 0x5b, 0x9c, 0x97, 0x97, 0xfd, 0xe4, 0xfb,
+- 0xa8, 0xe4, 0x3d, 0x3f, 0x76, 0x30, 0x07, 0x5d, 0xcc, 0x7e, 0x0e, 0x9b,
+- 0xc2, 0x23, 0xeb, 0xcd, 0x22, 0x45, 0x72, 0xf2, 0x00, 0x39, 0x45, 0x25,
+- 0x36, 0x3b, 0x71, 0x28, 0xc0, 0xfa, 0x0d, 0x65, 0x39, 0x7e, 0x02, 0xcf,
+- 0x32, 0x96, 0x6d, 0x09, 0xe7, 0xfa, 0x23, 0x0e, 0x33, 0xcf, 0x6d, 0xc4,
+- 0xc1, 0xc1, 0x4b, 0xcf, 0x83, 0x8b, 0x8d, 0xa9, 0xf3, 0x35, 0x1e, 0xf4,
+- 0xa0, 0x8d, 0xdf, 0x05, 0x12, 0x67, 0xae, 0x18, 0xfb, 0x96, 0x91, 0x47,
+- 0xf8, 0x5d, 0x8c, 0xad, 0x23, 0x36, 0xb6, 0x38, 0x39, 0x4e, 0x01, 0xba,
+- 0x1b, 0x04, 0x0f, 0xc5, 0x96, 0xa6, 0x4b, 0xec, 0x88, 0xa4, 0x21, 0xf1,
+- 0x55, 0xec, 0x27, 0xea, 0xd8, 0x8f, 0x4b, 0x99, 0x6a, 0x3f, 0x5d, 0x78,
+- 0xcd, 0x38, 0xba, 0xa2, 0x10, 0x47, 0xef, 0x97, 0xb5, 0xfb, 0x8e, 0x30,
+- 0x8e, 0xdd, 0x46, 0xdf, 0x7c, 0x97, 0xd8, 0xb2, 0x65, 0x36, 0xe3, 0x97,
+- 0x83, 0x59, 0x0a, 0x0a, 0xc9, 0x2b, 0xb6, 0xed, 0x0d, 0xea, 0x05, 0xaa,
+- 0xc6, 0x3e, 0xaf, 0xc6, 0x2e, 0x91, 0xdf, 0x64, 0x9e, 0x7e, 0xf4, 0xb1,
+- 0x42, 0xf8, 0x24, 0x5f, 0x7a, 0xfb, 0x0c, 0xdb, 0x58, 0x6c, 0xe6, 0x75,
+- 0xe5, 0xe8, 0x69, 0xb2, 0x9d, 0x4a, 0x24, 0xf7, 0xe6, 0xeb, 0x2b, 0x38,
+- 0x15, 0x0a, 0x4c, 0xae, 0x9d, 0x57, 0xa2, 0x77, 0xe4, 0xe8, 0x49, 0xf2,
+- 0x1c, 0xc6, 0xa9, 0xa3, 0x9d, 0x01, 0xca, 0x72, 0x3e, 0x9c, 0x9f, 0x53,
+- 0xf1, 0xcd, 0xa9, 0x6d, 0x88, 0xed, 0x42, 0x29, 0xab, 0xc5, 0x96, 0x32,
+- 0xda, 0x68, 0x26, 0x84, 0x78, 0x49, 0xb4, 0x0c, 0x89, 0x11, 0xfa, 0xd6,
+- 0x68, 0x01, 0xdc, 0xf3, 0x24, 0xee, 0x0a, 0xd7, 0x72, 0xdf, 0x72, 0x3a,
+- 0x51, 0x80, 0x07, 0xcc, 0x8b, 0xb6, 0xe0, 0xe2, 0x49, 0x03, 0xd7, 0x15,
+- 0x10, 0x13, 0x6b, 0xc3, 0xa1, 0xd8, 0x3a, 0xe6, 0xb4, 0xc7, 0x1b, 0xdc,
+- 0xb7, 0x7c, 0x90, 0xf9, 0x3d, 0x79, 0xf1, 0xd5, 0xe3, 0x11, 0x7d, 0xe0,
+- 0xc4, 0xd2, 0x90, 0xf4, 0x29, 0xfd, 0xe5, 0x6d, 0x54, 0xfa, 0xb7, 0xed,
+- 0x50, 0xd8, 0xe7, 0xcc, 0x79, 0x7e, 0x0c, 0xef, 0x19, 0xf9, 0x31, 0xf8,
+- 0x9c, 0xf8, 0xcd, 0x1c, 0x98, 0x98, 0x23, 0x79, 0xc1, 0x11, 0xe5, 0xa8,
+- 0x93, 0x03, 0x5b, 0x31, 0xe6, 0xbe, 0x91, 0x9e, 0xc9, 0xdc, 0x77, 0x9c,
+- 0x3c, 0xf7, 0x38, 0x79, 0xee, 0xcb, 0x93, 0xb9, 0xef, 0x8b, 0x19, 0xa9,
+- 0x33, 0xb5, 0x7c, 0x24, 0x26, 0x6b, 0xd6, 0x23, 0x89, 0x50, 0x5d, 0xbe,
+- 0xce, 0xcb, 0x2c, 0x7f, 0xfc, 0x52, 0xf9, 0xd5, 0xcc, 0x57, 0x57, 0x61,
+- 0x5b, 0xaa, 0x04, 0x0f, 0x6a, 0x4e, 0x6e, 0xe9, 0x2d, 0x8c, 0x9e, 0xb8,
+- 0xef, 0x7d, 0x63, 0xbc, 0xce, 0x45, 0x1c, 0x1a, 0xe1, 0xe0, 0x5b, 0x12,
+- 0x0a, 0xfd, 0xce, 0x83, 0x1e, 0xad, 0x1c, 0x6b, 0xcd, 0x7f, 0xb2, 0x1f,
+- 0x5c, 0x25, 0xcf, 0xf2, 0x7b, 0x14, 0x52, 0xfe, 0x35, 0x96, 0x0f, 0x9a,
+- 0x23, 0x93, 0xb9, 0xe0, 0xd1, 0x04, 0xfa, 0x24, 0xcf, 0x5a, 0xd3, 0x1c,
+- 0xd2, 0xbb, 0x9d, 0x75, 0x63, 0x1d, 0xeb, 0x32, 0x3a, 0xd6, 0x53, 0x9e,
+- 0xb4, 0x7b, 0x32, 0x47, 0xca, 0xc5, 0x62, 0x4b, 0x78, 0xe6, 0x22, 0x96,
+- 0xdb, 0x3c, 0x89, 0x33, 0x2d, 0x97, 0x78, 0xae, 0x6d, 0xf7, 0x9b, 0x79,
+- 0xae, 0xcb, 0x58, 0x50, 0x29, 0xb9, 0x35, 0x68, 0x17, 0x15, 0x48, 0xfb,
+- 0x65, 0x4f, 0x66, 0xea, 0x18, 0x11, 0x2b, 0x8c, 0x86, 0xf4, 0xd9, 0xea,
+- 0x54, 0xec, 0x92, 0xb1, 0x0a, 0x6e, 0x59, 0x8e, 0x7e, 0x8e, 0x5d, 0x1a,
+- 0x6f, 0x7d, 0xa1, 0x60, 0xd6, 0xc1, 0x44, 0x77, 0x01, 0x6d, 0x4b, 0x2d,
+- 0x10, 0x7b, 0x40, 0xee, 0x1e, 0xb2, 0xb6, 0xbd, 0xfd, 0x0a, 0xdd, 0x15,
+- 0xc4, 0x98, 0x0a, 0xe0, 0xe9, 0x44, 0x28, 0x76, 0x16, 0x96, 0x72, 0x32,
+- 0xe3, 0xa6, 0xad, 0x4b, 0xbb, 0x5b, 0xd8, 0x5e, 0x8f, 0x72, 0xe2, 0x52,
+- 0x9b, 0x17, 0x2e, 0x6e, 0x76, 0xd6, 0x71, 0xf3, 0xbe, 0xe2, 0xc5, 0x43,
+- 0x7d, 0xf9, 0xbd, 0xc6, 0x18, 0xde, 0x33, 0x05, 0x17, 0xbd, 0xe4, 0x3d,
+- 0xcc, 0xd2, 0x13, 0xdb, 0x90, 0xf3, 0x4b, 0xf9, 0xe4, 0xe7, 0xfd, 0xa0,
+- 0x5b, 0x30, 0xec, 0x27, 0xb3, 0x63, 0x93, 0x6b, 0x2e, 0x7f, 0xac, 0x4c,
+- 0x1e, 0xdb, 0x2f, 0x5c, 0xec, 0x4b, 0x55, 0x4f, 0xc9, 0xb3, 0x69, 0x5f,
+- 0x03, 0xc1, 0x1e, 0x0b, 0x95, 0x6c, 0xc3, 0x8d, 0xbf, 0x65, 0xfc, 0x76,
+- 0x0f, 0x1c, 0xbd, 0x41, 0x52, 0x32, 0xcf, 0xa1, 0x18, 0x36, 0x37, 0x7b,
+- 0xe0, 0x1a, 0xaa, 0x2e, 0xcc, 0xad, 0xf3, 0x91, 0x3c, 0x3b, 0xdf, 0x8a,
+- 0x83, 0xd3, 0x6a, 0x56, 0xf2, 0x6a, 0xd2, 0x88, 0x43, 0xa2, 0xd7, 0x4a,
+- 0x7e, 0x8b, 0x5e, 0xfc, 0xfc, 0x16, 0x1d, 0x55, 0xf1, 0xbb, 0x1c, 0xb1,
+- 0x2a, 0xd9, 0xf3, 0x6a, 0x47, 0x82, 0x98, 0x55, 0x12, 0xed, 0xc4, 0xd7,
+- 0x7b, 0x6d, 0xbb, 0x87, 0x7e, 0x59, 0xc4, 0x18, 0xff, 0x48, 0xa8, 0x3e,
+- 0x32, 0x47, 0x29, 0x20, 0xdf, 0x69, 0x47, 0xcf, 0x48, 0x41, 0xbc, 0x3c,
+- 0x5a, 0xc5, 0x98, 0xae, 0xe1, 0x93, 0xb9, 0x6d, 0xc8, 0x8e, 0x5e, 0xbd,
+- 0x57, 0x36, 0x75, 0x9f, 0x2c, 0xbf, 0x3f, 0x26, 0xe3, 0x11, 0xb9, 0x45,
+- 0xfe, 0x0b, 0x17, 0xb7, 0xa6, 0x44, 0x36, 0x0f, 0x0e, 0xf4, 0x89, 0xbc,
+- 0x36, 0x3a, 0xcc, 0x5b, 0x29, 0x27, 0x91, 0xbe, 0x72, 0xea, 0xfc, 0xe6,
+- 0xdb, 0x91, 0x75, 0xf0, 0x4e, 0x65, 0x98, 0xf3, 0x65, 0xb9, 0x0b, 0xc5,
+- 0xbf, 0x34, 0xe6, 0x15, 0xca, 0x73, 0x19, 0x69, 0xa3, 0x45, 0x19, 0x49,
+- 0x4f, 0xad, 0xd3, 0xa9, 0x1c, 0xca, 0x3c, 0x5c, 0x28, 0x9c, 0xe3, 0xb2,
+- 0x1e, 0xf3, 0x32, 0x90, 0xdc, 0xd2, 0x5e, 0x2a, 0x92, 0xa2, 0x7f, 0xd1,
+- 0x8f, 0x0e, 0x77, 0x96, 0xbf, 0xb3, 0x5f, 0xd6, 0xe7, 0xd5, 0x3e, 0x36,
+- 0xf7, 0x0a, 0x9f, 0x3c, 0x4e, 0x9f, 0x1c, 0xff, 0xa3, 0x3e, 0x39, 0xef,
+- 0x4f, 0x94, 0xcf, 0xaf, 0xb7, 0xda, 0xf6, 0x6e, 0x53, 0xd6, 0xe8, 0x65,
+- 0xdd, 0xb5, 0xe1, 0x4b, 0xf6, 0x5e, 0x65, 0x3d, 0x7e, 0x36, 0xd2, 0x95,
+- 0xc1, 0xb4, 0xac, 0xbf, 0x0c, 0xa4, 0x80, 0x45, 0x49, 0xe9, 0x27, 0x46,
+- 0x7d, 0xa9, 0xb7, 0x32, 0x1a, 0x31, 0x43, 0xe8, 0xc2, 0x19, 0xd3, 0xd8,
+- 0xf7, 0x20, 0x79, 0x77, 0x37, 0x73, 0xd2, 0x83, 0xe6, 0x72, 0xfa, 0x7b,
+- 0x31, 0x36, 0x34, 0xd0, 0x18, 0x57, 0x98, 0xf4, 0x7b, 0xab, 0x9d, 0xae,
+- 0xe8, 0xf5, 0x45, 0xdb, 0x57, 0x25, 0x42, 0xc1, 0xb6, 0x8d, 0xc4, 0xf3,
+- 0xa5, 0xbd, 0x5e, 0xe8, 0x8a, 0xc3, 0x07, 0x5a, 0x7f, 0xa1, 0x0a, 0x46,
+- 0x9d, 0x29, 0xc8, 0xe5, 0xcd, 0xb2, 0xe6, 0x22, 0xfd, 0x2c, 0x67, 0x5e,
+- 0x22, 0x75, 0x75, 0xb4, 0xd7, 0x2a, 0x48, 0xd5, 0x06, 0xfb, 0xe0, 0xb2,
+- 0xed, 0xdf, 0x91, 0x17, 0x8e, 0x3b, 0xb9, 0x7c, 0x7d, 0xdd, 0x6e, 0xf5,
+- 0x7f, 0x10, 0x0b, 0x9d, 0x36, 0x34, 0x59, 0xf3, 0x7f, 0xe1, 0x4f, 0xae,
+- 0x7b, 0x9b, 0x90, 0xbd, 0x89, 0x42, 0x63, 0x89, 0x32, 0xe2, 0xcf, 0x71,
+- 0x8a, 0xdb, 0x06, 0x3e, 0xbf, 0xf8, 0x64, 0x4a, 0xec, 0x1c, 0x55, 0x01,
+- 0x63, 0x06, 0x66, 0x1f, 0x28, 0xc5, 0xb2, 0x01, 0xe1, 0x0a, 0x3e, 0xab,
+- 0x30, 0x1a, 0xc0, 0x9c, 0x03, 0x95, 0x68, 0xd9, 0x23, 0xfb, 0x50, 0x76,
+- 0x57, 0x45, 0x74, 0x35, 0xdc, 0x87, 0x34, 0x3c, 0xb0, 0xc7, 0xb6, 0x67,
+- 0xcd, 0x23, 0xb5, 0x63, 0x4c, 0x7c, 0xb7, 0x69, 0x15, 0x3c, 0xd9, 0x6a,
+- 0x2c, 0x49, 0xd6, 0x39, 0x6b, 0xad, 0x1f, 0x26, 0x5a, 0x5b, 0xce, 0xf5,
+- 0xd6, 0x6e, 0xa8, 0x55, 0x82, 0xe6, 0x29, 0x25, 0x82, 0x82, 0x6c, 0x04,
+- 0xae, 0xa4, 0x82, 0x57, 0x0d, 0x74, 0x95, 0x45, 0xa3, 0x70, 0x65, 0xa3,
+- 0xf0, 0x25, 0xdd, 0x68, 0xa0, 0xbe, 0x4b, 0x38, 0xf7, 0xd3, 0x92, 0xd5,
+- 0x98, 0x96, 0xbd, 0x0e, 0xfa, 0x81, 0x06, 0xfa, 0x48, 0x25, 0xfb, 0xf3,
+- 0xa3, 0x25, 0xd9, 0x86, 0x69, 0x46, 0x33, 0x6d, 0xa3, 0x19, 0x33, 0x93,
+- 0x7e, 0x2c, 0xe0, 0x7c, 0x2c, 0x4e, 0xb6, 0xb2, 0x1f, 0x1f, 0xda, 0x07,
+- 0xee, 0x44, 0x60, 0xc8, 0x8b, 0xf2, 0x01, 0x1d, 0x1f, 0xce, 0xf5, 0xa2,
+- 0x68, 0x28, 0x80, 0xd2, 0xa4, 0xec, 0x8d, 0x21, 0xb6, 0xb1, 0x39, 0x00,
+- 0x5f, 0x16, 0x28, 0x19, 0xb0, 0xf1, 0xad, 0xf0, 0xa8, 0x7a, 0x77, 0xa5,
+- 0x65, 0x4f, 0x73, 0x62, 0x41, 0x6b, 0xfb, 0x16, 0xe3, 0xce, 0x49, 0xbf,
+- 0x77, 0x33, 0xcf, 0x52, 0xc8, 0xd7, 0x25, 0x06, 0xb6, 0xb6, 0x1f, 0x4c,
+- 0xc8, 0xda, 0x46, 0x88, 0x7e, 0xeb, 0x81, 0x77, 0xa8, 0x53, 0xe9, 0xa3,
+- 0xed, 0xa0, 0x40, 0xf4, 0xaf, 0xd2, 0xbf, 0xa0, 0x95, 0xd2, 0xce, 0xb7,
+- 0x66, 0x5a, 0x94, 0x64, 0xba, 0x53, 0xe9, 0xcd, 0x94, 0x78, 0x51, 0x2c,
+- 0xf3, 0xf2, 0x15, 0x8c, 0x36, 0x3c, 0x69, 0xa7, 0x2b, 0x9c, 0xb9, 0xb5,
+- 0x3c, 0x90, 0x9c, 0xdb, 0x5a, 0x15, 0xae, 0x0d, 0x76, 0x56, 0xa8, 0xb2,
+- 0x9f, 0x42, 0x1c, 0x52, 0x72, 0x7d, 0x69, 0x46, 0x12, 0xcf, 0xfa, 0x65,
+- 0x7d, 0x55, 0xe6, 0xbf, 0xb5, 0x3d, 0xd1, 0x7b, 0xe1, 0xa2, 0xcc, 0xe9,
+- 0xc7, 0xb4, 0xc3, 0xdb, 0x93, 0x9f, 0x5f, 0xdc, 0x97, 0x6a, 0x63, 0x9e,
+- 0x66, 0xe2, 0x55, 0xfe, 0x5e, 0xc4, 0x71, 0xbf, 0x98, 0xf1, 0x61, 0x61,
+- 0xb2, 0xd9, 0xd9, 0x8b, 0x5b, 0x96, 0x8c, 0xe0, 0x15, 0x7e, 0xb7, 0x24,
+- 0x57, 0xe1, 0x18, 0xf3, 0xd4, 0x07, 0x92, 0x51, 0xbc, 0x9d, 0x09, 0xe0,
+- 0x7e, 0xea, 0x6f, 0x06, 0xed, 0xf4, 0xae, 0xa4, 0x8e, 0x37, 0x32, 0xc0,
+- 0xcf, 0xfa, 0x6c, 0x84, 0x1a, 0xbf, 0xa3, 0x3e, 0xed, 0xac, 0x8d, 0x35,
+- 0xe3, 0x67, 0x09, 0x13, 0x6f, 0x24, 0x6a, 0xcc, 0x9b, 0xd5, 0xdf, 0x62,
+- 0xdc, 0x9d, 0xa0, 0x4d, 0x9d, 0x47, 0xbc, 0x52, 0xd6, 0xf1, 0x72, 0xf2,
+- 0x77, 0x8f, 0x79, 0x98, 0x63, 0x6d, 0xc0, 0x11, 0xbf, 0xb3, 0x2e, 0x71,
+- 0x85, 0x5c, 0xb2, 0x36, 0xb1, 0x88, 0x72, 0x3d, 0x95, 0x22, 0x57, 0x34,
+- 0xaa, 0x29, 0x8f, 0x17, 0x0b, 0x07, 0xbc, 0xa8, 0xa4, 0x6d, 0x9c, 0x3e,
+- 0x10, 0xc5, 0xce, 0x54, 0x11, 0x5a, 0xfa, 0x03, 0x38, 0xc3, 0xeb, 0xad,
+- 0xb4, 0xf1, 0x1f, 0xb1, 0x6f, 0xa3, 0x49, 0xc3, 0x80, 0x56, 0x84, 0x9e,
+- 0xba, 0x1f, 0x93, 0xef, 0xa9, 0xcc, 0x39, 0x98, 0x1b, 0x18, 0x25, 0xd8,
+- 0xc1, 0xb4, 0xbe, 0xb0, 0x39, 0x88, 0xfe, 0x3a, 0xda, 0x7a, 0x15, 0xe3,
+- 0x87, 0x11, 0x43, 0x39, 0x31, 0x26, 0xc5, 0x5c, 0xb1, 0x30, 0x6a, 0x51,
+- 0x06, 0x15, 0xfb, 0x34, 0x55, 0xd6, 0xe4, 0xf8, 0x2c, 0x80, 0x63, 0x09,
+- 0xd8, 0xc5, 0x51, 0xe3, 0xc2, 0x4e, 0x84, 0x4e, 0xbc, 0xcf, 0xb8, 0xfe,
+- 0xf7, 0x99, 0x12, 0x7c, 0xbf, 0x6f, 0x36, 0xfe, 0x36, 0x2d, 0xeb, 0xbd,
+- 0x3e, 0xac, 0x1f, 0x0c, 0xab, 0xb9, 0xb5, 0x4a, 0x1f, 0x1e, 0x1a, 0x84,
+- 0x35, 0x93, 0xf6, 0xf8, 0xf2, 0x70, 0x19, 0xd6, 0xf4, 0xbd, 0x60, 0x33,
+- 0x77, 0xa6, 0x5d, 0x7b, 0x71, 0x34, 0x2d, 0x32, 0x96, 0x53, 0xc6, 0x22,
+- 0x1c, 0xe3, 0x75, 0x0f, 0x6d, 0xbf, 0xb2, 0xf7, 0xdb, 0xf8, 0x2c, 0x55,
+- 0x53, 0x77, 0xbf, 0xda, 0x8e, 0xe3, 0xce, 0x7e, 0x6c, 0x03, 0xde, 0xa2,
+- 0x1e, 0xcb, 0x77, 0xdb, 0xf6, 0x6f, 0xc2, 0x31, 0xfc, 0x2c, 0x73, 0x2d,
+- 0x8a, 0x78, 0x6d, 0x86, 0x5b, 0xf0, 0x66, 0xa6, 0x1a, 0x65, 0xbd, 0xad,
+- 0x78, 0x9d, 0x9c, 0xbf, 0x74, 0x77, 0x27, 0x4e, 0xb1, 0x7d, 0x5f, 0xbf,
+- 0x17, 0xaf, 0xa5, 0xbd, 0x78, 0xb5, 0xcf, 0xd0, 0xd6, 0x2a, 0x7f, 0xa7,
+- 0xc4, 0x2b, 0x73, 0xfd, 0x0c, 0xa4, 0x72, 0xfa, 0xdc, 0x3e, 0x56, 0x00,
+- 0xc1, 0xf2, 0x43, 0x7e, 0x59, 0xbf, 0x95, 0xf3, 0x31, 0xad, 0xed, 0x5a,
+- 0xf2, 0x77, 0x17, 0x13, 0xd4, 0xe7, 0x9b, 0xa3, 0x01, 0xdc, 0x91, 0x14,
+- 0xdd, 0x7e, 0x7e, 0x71, 0x17, 0xb1, 0xa3, 0x77, 0x34, 0x82, 0x13, 0x09,
+- 0x8f, 0xb3, 0xe7, 0xd8, 0x33, 0x2a, 0xfb, 0xb1, 0xdf, 0xe5, 0xdc, 0x00,
+- 0x6b, 0x47, 0x73, 0x6d, 0x6d, 0x19, 0x2b, 0xa4, 0xee, 0x6e, 0xc7, 0xd3,
+- 0x5a, 0x81, 0xc4, 0xdf, 0x9c, 0x8d, 0x1a, 0x41, 0xda, 0xee, 0x77, 0x9d,
+- 0xf5, 0xbd, 0x81, 0x54, 0xbd, 0x36, 0x0d, 0xf9, 0x79, 0xac, 0xc1, 0x4c,
+- 0xe3, 0xf7, 0xf6, 0x0b, 0x7e, 0x59, 0x77, 0x15, 0xbe, 0xd8, 0xda, 0xbe,
+- 0x36, 0x21, 0xfd, 0xe8, 0xd8, 0x3c, 0x7a, 0xe1, 0x62, 0x3f, 0xf9, 0xfa,
+- 0x12, 0xda, 0xc8, 0xba, 0x90, 0x1f, 0x8b, 0x6b, 0xeb, 0x50, 0x9b, 0x95,
+- 0x35, 0xdd, 0x08, 0x39, 0xab, 0x89, 0x8e, 0x50, 0xd4, 0xd9, 0xd7, 0x82,
+- 0x9a, 0xbf, 0xe7, 0xc5, 0xbb, 0x7f, 0xe0, 0x2b, 0xc0, 0xac, 0x81, 0x36,
+- 0xf6, 0x6b, 0x63, 0x99, 0xf9, 0x0f, 0x76, 0xcb, 0x3d, 0xd2, 0x7f, 0x4d,
+- 0x59, 0xee, 0x19, 0x27, 0xbc, 0x58, 0x7e, 0x37, 0xd1, 0x97, 0x1a, 0x71,
+- 0xd8, 0x2f, 0x3c, 0x43, 0xfc, 0xa0, 0xb5, 0x3d, 0x4c, 0xfb, 0xd9, 0x41,
+- 0x19, 0x56, 0xd0, 0x76, 0x96, 0x11, 0x17, 0xca, 0x8d, 0x0b, 0x17, 0x7b,
+- 0x53, 0x26, 0xe6, 0x8c, 0xfa, 0x68, 0xcb, 0x45, 0xec, 0xaf, 0x19, 0xc6,
+- 0x28, 0x71, 0x84, 0xf6, 0xbd, 0x60, 0xd4, 0x4f, 0x7b, 0xd6, 0x31, 0x7f,
+- 0x54, 0x7c, 0xdc, 0x40, 0x88, 0xb1, 0xac, 0x9d, 0x75, 0x22, 0xa3, 0x15,
+- 0xb8, 0x79, 0xbf, 0x1b, 0x77, 0x26, 0xc3, 0xd4, 0x4f, 0x1d, 0x63, 0xdc,
+- 0x65, 0x7d, 0x6f, 0x1b, 0x9b, 0x85, 0x0a, 0xe3, 0x88, 0xfd, 0x9c, 0x83,
+- 0x61, 0x85, 0x8e, 0x9e, 0x02, 0xec, 0x37, 0x90, 0x82, 0x55, 0xce, 0xf8,
+- 0x72, 0x61, 0xf4, 0xb9, 0x2f, 0xe2, 0xf7, 0x8a, 0x2e, 0xa7, 0x8e, 0x47,
+- 0x30, 0xe5, 0x02, 0xb1, 0x0e, 0x68, 0x7c, 0xc2, 0xc6, 0xe2, 0xc6, 0x8d,
+- 0xca, 0x0f, 0x1c, 0x5b, 0x92, 0x76, 0x85, 0x3b, 0xe4, 0xf5, 0x9f, 0xd7,
+- 0xf9, 0x6f, 0x0a, 0x72, 0x3a, 0xcf, 0x8f, 0x33, 0xb8, 0x4f, 0x70, 0x7a,
+- 0x7d, 0x63, 0x1e, 0xa7, 0xa5, 0xbc, 0xdc, 0x5f, 0x61, 0xf7, 0x6a, 0x70,
+- 0x17, 0x1a, 0x2e, 0x6c, 0xaf, 0x7b, 0x46, 0x99, 0xd0, 0xc4, 0xe7, 0x15,
+- 0x62, 0xc7, 0xed, 0x36, 0xdd, 0x96, 0x76, 0xfd, 0x12, 0xcb, 0x41, 0x29,
+- 0xbc, 0x34, 0x97, 0xc2, 0x3f, 0xba, 0x27, 0xe7, 0x52, 0x78, 0x6f, 0x7e,
+- 0x4c, 0x79, 0x59, 0x23, 0xe4, 0x76, 0x22, 0xaf, 0xd8, 0x86, 0x94, 0x79,
+- 0xb0, 0xc8, 0x59, 0x8f, 0x46, 0xf7, 0x14, 0x7b, 0xc8, 0x73, 0x18, 0xa7,
+- 0x0d, 0x0d, 0x97, 0xec, 0xc1, 0x8d, 0xb6, 0xa4, 0xcc, 0x3b, 0xac, 0x62,
+- 0xea, 0xa1, 0x6d, 0xd4, 0xc3, 0xf9, 0x13, 0x2e, 0xae, 0x62, 0x89, 0xb9,
+- 0x5d, 0x19, 0xf7, 0xef, 0x64, 0x1b, 0x9f, 0x5f, 0x64, 0x1d, 0xde, 0xeb,
+- 0xe5, 0xf5, 0x75, 0xb8, 0x9d, 0x38, 0xba, 0x36, 0x6c, 0x29, 0xb9, 0x73,
+- 0x05, 0x45, 0xb8, 0x71, 0xa0, 0x12, 0x3e, 0x43, 0xd6, 0x2d, 0xfe, 0xb3,
+- 0xe2, 0xab, 0x90, 0xf1, 0x3b, 0x9c, 0x81, 0x76, 0x72, 0x1d, 0x16, 0x0f,
+- 0x30, 0x64, 0x3b, 0x7b, 0x04, 0x0b, 0xf1, 0x74, 0xf3, 0x75, 0x58, 0xea,
+- 0x70, 0x9d, 0x10, 0x6e, 0x1a, 0x12, 0x0c, 0xed, 0x54, 0xfa, 0x89, 0x9d,
+- 0x4c, 0x38, 0xe8, 0xd7, 0x31, 0xa5, 0x8f, 0x98, 0xb9, 0xcf, 0xf1, 0x11,
+- 0x59, 0x2f, 0xee, 0x54, 0x52, 0x99, 0x0a, 0x8e, 0x43, 0x6c, 0xf7, 0xb2,
+- 0x8c, 0x33, 0x29, 0xe3, 0x79, 0x62, 0xd1, 0xfc, 0x49, 0x19, 0x67, 0x37,
+- 0x49, 0x2e, 0x2b, 0x32, 0x16, 0xa1, 0x96, 0x72, 0x54, 0x52, 0x8e, 0x63,
+- 0x66, 0x85, 0x32, 0xa0, 0xe5, 0x64, 0xab, 0x61, 0xff, 0x8c, 0x39, 0x58,
+- 0x63, 0xfa, 0x94, 0x65, 0xce, 0xbd, 0xbc, 0x6c, 0x9f, 0x5f, 0xec, 0x49,
+- 0x7d, 0x61, 0xfb, 0x8c, 0x9c, 0x9c, 0x65, 0xfd, 0x3a, 0x4e, 0xcd, 0xbd,
+- 0x0e, 0xa5, 0xfb, 0x8b, 0xd0, 0x48, 0x5c, 0xaf, 0x1f, 0x30, 0xfa, 0x36,
+- 0x2a, 0x22, 0xab, 0x87, 0xbf, 0x9d, 0x75, 0x03, 0xea, 0xf3, 0xff, 0x2f,
+- 0xbc, 0xd2, 0x8e, 0xdd, 0x58, 0x91, 0xcc, 0xd9, 0xb0, 0xe3, 0xbf, 0xb5,
+- 0x62, 0xbf, 0xb2, 0x46, 0x48, 0x7b, 0xce, 0xb8, 0xb0, 0x84, 0x7d, 0x1f,
+- 0x33, 0x1f, 0x56, 0x2c, 0xed, 0xc2, 0x45, 0xd9, 0xaf, 0x57, 0x29, 0x63,
+- 0x77, 0xfa, 0x3a, 0xdc, 0x31, 0x30, 0x6e, 0x7b, 0x8d, 0x05, 0xc8, 0x84,
+- 0x43, 0xed, 0x3d, 0x8a, 0x17, 0xbb, 0xd2, 0x2e, 0x2c, 0x1a, 0x20, 0x5f,
+- 0x33, 0xe3, 0x4a, 0x6c, 0x7a, 0x8e, 0x87, 0x2f, 0x4c, 0x32, 0x1f, 0xcd,
+- 0x4a, 0x7e, 0xd8, 0xd6, 0xbe, 0x30, 0xf1, 0x80, 0x12, 0xd3, 0x3e, 0xbf,
+- 0x98, 0x4c, 0x1d, 0xfd, 0xae, 0xea, 0xf0, 0x30, 0x1f, 0xde, 0x3c, 0xe8,
+- 0xa3, 0x2f, 0x28, 0xf4, 0x13, 0x3f, 0x7d, 0xbf, 0x01, 0x6f, 0xd3, 0x37,
+- 0xee, 0x67, 0x5c, 0xfc, 0xfb, 0xd1, 0x2a, 0xdc, 0xb6, 0x27, 0x8a, 0x97,
+- 0x0f, 0xfa, 0xd1, 0xbe, 0xe7, 0x56, 0xbc, 0xc5, 0x72, 0x63, 0x8c, 0x07,
+- 0x63, 0xc3, 0x95, 0xfc, 0xf8, 0xf9, 0xa9, 0xe2, 0x67, 0x2d, 0xf1, 0xa8,
+- 0x02, 0x27, 0xf7, 0xbb, 0xd0, 0x32, 0xa0, 0x62, 0xc0, 0x54, 0x70, 0xf7,
+- 0x4d, 0x32, 0x1e, 0x2f, 0xd6, 0xd4, 0x5e, 0xb6, 0x8b, 0x25, 0x49, 0xe1,
+- 0x70, 0x5e, 0xce, 0x93, 0x8e, 0x43, 0xf4, 0xcb, 0xdb, 0xc8, 0xc1, 0x76,
+- 0xf4, 0xb5, 0xd1, 0x8f, 0x6c, 0xcc, 0x0a, 0xff, 0x18, 0x2b, 0xb4, 0x1e,
+- 0xc9, 0x6b, 0x9d, 0x75, 0xfe, 0x14, 0xe7, 0x71, 0xc2, 0x53, 0x6f, 0x4d,
+- 0x43, 0x51, 0x2c, 0x10, 0x0d, 0x69, 0x47, 0xb0, 0x1c, 0x7d, 0x63, 0xd0,
+- 0x64, 0xcd, 0x7f, 0x1b, 0x79, 0xd4, 0x76, 0xf2, 0xa8, 0xee, 0xcc, 0x11,
+- 0xce, 0xb1, 0xcf, 0x2b, 0x7b, 0xdf, 0xdb, 0xa8, 0xbb, 0xc5, 0x0e, 0x27,
+- 0xf2, 0x5a, 0x45, 0x6c, 0xff, 0x38, 0x63, 0xd2, 0x82, 0xfe, 0x1c, 0x6e,
+- 0x7c, 0xd6, 0xf4, 0x3c, 0x8c, 0x69, 0x3d, 0xf4, 0xf9, 0x5c, 0xdb, 0x3b,
+- 0x85, 0x9b, 0x79, 0xca, 0x62, 0x65, 0xd1, 0xd0, 0x86, 0xd7, 0xa9, 0x7c,
+- 0x2f, 0xdb, 0xdc, 0x3a, 0xb9, 0x8f, 0xd0, 0xcb, 0x36, 0x7b, 0x58, 0xb7,
+- 0xbe, 0xdf, 0xe2, 0x5c, 0xba, 0x59, 0x3f, 0x14, 0xd8, 0xa8, 0x98, 0xac,
+- 0xeb, 0xe4, 0x11, 0xa8, 0xd9, 0x7f, 0x79, 0xae, 0xda, 0x88, 0x31, 0xfd,
+- 0x93, 0xfe, 0x7e, 0x7e, 0xf4, 0x3a, 0x84, 0x68, 0x24, 0x4f, 0x9b, 0x9b,
+- 0xa0, 0xd3, 0x66, 0x5d, 0x93, 0x7d, 0x6d, 0x97, 0x71, 0xb8, 0x67, 0xc6,
+- 0x66, 0xb2, 0x8f, 0xbe, 0x4c, 0x48, 0xeb, 0x42, 0xfd, 0x89, 0x69, 0x90,
+- 0x71, 0x48, 0x7f, 0xcb, 0xf1, 0xe4, 0xd8, 0xd5, 0xe3, 0xa8, 0x26, 0x3e,
+- 0x5d, 0x2c, 0x98, 0x3c, 0x33, 0xe7, 0xe4, 0xe2, 0x31, 0xc7, 0xc7, 0x76,
+- 0x38, 0xf2, 0x7b, 0xd8, 0x66, 0x36, 0xb7, 0x07, 0x22, 0x69, 0x95, 0x32,
+- 0xc2, 0x58, 0xd1, 0x96, 0x54, 0x62, 0x15, 0xd1, 0xfa, 0xce, 0x69, 0x08,
+- 0x45, 0x7e, 0xc6, 0xb6, 0xa7, 0xb1, 0xed, 0x67, 0xd9, 0x76, 0x8a, 0x6d,
+- 0x8f, 0xb0, 0xed, 0x1f, 0x5c, 0x6a, 0x5b, 0xc5, 0xfd, 0x7b, 0xf2, 0xb6,
+- 0xe5, 0x46, 0xa4, 0x89, 0x59, 0xdf, 0x34, 0xd9, 0x03, 0xad, 0xe6, 0xdc,
+- 0x8b, 0xee, 0x74, 0xc6, 0xf6, 0x9c, 0xbd, 0x2d, 0x60, 0xec, 0xb9, 0x6b,
+- 0x8f, 0x82, 0xf7, 0xc3, 0xef, 0x63, 0xc2, 0x9f, 0xe3, 0x11, 0x79, 0x1b,
+- 0xd2, 0x68, 0x43, 0x5a, 0xf2, 0x7f, 0xd2, 0xf4, 0xa5, 0x8e, 0xd8, 0x8f,
+- 0xec, 0x3f, 0x90, 0x3f, 0x27, 0x44, 0x1f, 0xbf, 0x23, 0xee, 0x86, 0x4e,
+- 0xbc, 0xc7, 0xd8, 0xf9, 0xa3, 0x8c, 0x07, 0xe9, 0xb4, 0x0f, 0xcf, 0x66,
+- 0x04, 0x1b, 0xdb, 0x88, 0x8d, 0x82, 0xf7, 0xe4, 0x81, 0xc3, 0x47, 0x1f,
+- 0x0b, 0xb0, 0xf2, 0xb3, 0xb4, 0x9f, 0x67, 0x69, 0x3f, 0xcf, 0x0e, 0xfb,
+- 0x70, 0xf3, 0x21, 0x2f, 0xce, 0x11, 0x6b, 0x7a, 0x59, 0x26, 0x91, 0x6a,
+- 0xc0, 0x4d, 0xe4, 0x59, 0x87, 0x7b, 0x19, 0x97, 0x19, 0xff, 0xeb, 0xb2,
+- 0x1a, 0x76, 0xf5, 0x57, 0xa0, 0x7e, 0x48, 0x62, 0x70, 0x05, 0x1e, 0xe9,
+- 0xf3, 0x62, 0xce, 0x7e, 0xd9, 0x87, 0x24, 0x2f, 0xec, 0xbb, 0x13, 0xc3,
+- 0x8e, 0x8f, 0x4f, 0xa3, 0x7f, 0x54, 0xa2, 0x76, 0x48, 0xae, 0xc9, 0x53,
+- 0x68, 0xb3, 0x0b, 0x0e, 0x55, 0x71, 0xbc, 0xb7, 0x62, 0xfe, 0xa1, 0x00,
+- 0xf1, 0xdc, 0x8f, 0x48, 0x76, 0xf9, 0x45, 0xc1, 0xe4, 0xed, 0x63, 0x53,
+- 0x63, 0x9a, 0xf8, 0xa1, 0x83, 0x61, 0x91, 0x3c, 0x86, 0x5d, 0x7e, 0x3e,
+- 0x15, 0x27, 0x7f, 0xcb, 0x67, 0x52, 0x26, 0x1f, 0x7b, 0xa6, 0xe2, 0xe2,
+- 0x65, 0x7c, 0x6a, 0x1c, 0x90, 0x6f, 0x0d, 0xed, 0xf3, 0xc4, 0xd7, 0xaf,
+- 0x43, 0xc4, 0x91, 0xe7, 0xfe, 0x62, 0x96, 0x0b, 0xe4, 0xfc, 0x7d, 0x2a,
+- 0x9e, 0xfb, 0x26, 0xfd, 0xd4, 0x85, 0x58, 0x45, 0x8e, 0x0b, 0xdf, 0xbe,
+- 0xa7, 0x01, 0xbb, 0xa8, 0x8f, 0x56, 0xfa, 0x91, 0x2f, 0x1c, 0xb5, 0xad,
+- 0x0a, 0xc9, 0x5b, 0x2b, 0x71, 0xe7, 0x1e, 0x3f, 0x63, 0xf8, 0xb5, 0x48,
+- 0x0e, 0xcf, 0x66, 0x5b, 0xd5, 0xe8, 0x9d, 0xcc, 0xe7, 0xb7, 0xa7, 0x96,
+- 0xd9, 0x0f, 0x39, 0x7b, 0xf2, 0xb2, 0xf6, 0xff, 0xda, 0x7d, 0xde, 0xd0,
+- 0xb8, 0xce, 0x7c, 0xde, 0x64, 0xce, 0x41, 0x0e, 0x76, 0x02, 0xa1, 0x4a,
+- 0xe6, 0xe7, 0x46, 0x39, 0x16, 0x31, 0x9f, 0x7f, 0xc8, 0x2f, 0xcf, 0x6e,
+- 0x15, 0x59, 0x9c, 0xf2, 0x97, 0xc7, 0xb8, 0x6b, 0xca, 0x18, 0xeb, 0x23,
+- 0xd3, 0x90, 0xe7, 0x63, 0x5f, 0xd8, 0x7f, 0x6f, 0x40, 0xe9, 0x0f, 0xd1,
+- 0x6a, 0x1b, 0x83, 0x7d, 0x0f, 0x29, 0x86, 0xd6, 0xa4, 0x12, 0xba, 0x46,
+- 0xdf, 0xc4, 0x92, 0xec, 0x2f, 0x10, 0xcb, 0xae, 0xf6, 0x8a, 0x2c, 0xf7,
+- 0x67, 0x57, 0x61, 0x9c, 0x73, 0x5c, 0xc4, 0x3a, 0x37, 0xf4, 0xfa, 0x68,
+- 0xa3, 0x50, 0x0e, 0x37, 0xd7, 0xe1, 0x43, 0xf2, 0x9c, 0xb6, 0xe4, 0x9b,
+- 0xd0, 0x18, 0x5f, 0xef, 0x4c, 0xfe, 0x02, 0x65, 0xc4, 0x94, 0x3b, 0x92,
+- 0x5f, 0xd8, 0x23, 0xa1, 0x7d, 0x4e, 0xbd, 0xc2, 0xd1, 0x03, 0x17, 0xfb,
+- 0x2e, 0xc7, 0x27, 0xad, 0xd0, 0x78, 0xe5, 0x2a, 0x3c, 0x6c, 0x68, 0xd9,
+- 0x9c, 0x18, 0xfd, 0x5f, 0x9e, 0xe8, 0xaf, 0x7f, 0xfa, 0xfd, 0xe6, 0x9c,
+- 0x5d, 0xea, 0x99, 0xbb, 0xf0, 0x2d, 0x07, 0x77, 0xd7, 0x6c, 0x74, 0x47,
+- 0x3b, 0x1e, 0x93, 0xb5, 0xd0, 0x35, 0xce, 0x3a, 0x41, 0x3b, 0x76, 0xee,
+- 0x6d, 0xc3, 0xe6, 0xbd, 0x82, 0xad, 0xf5, 0xad, 0x8b, 0x94, 0x19, 0xf4,
+- 0xc3, 0x01, 0x27, 0x97, 0x71, 0x1b, 0x9f, 0xca, 0x9a, 0xab, 0xea, 0x71,
+- 0xf6, 0xc0, 0x74, 0xac, 0x19, 0xcd, 0xb5, 0x35, 0x2b, 0x53, 0x4a, 0xff,
+- 0x8a, 0x22, 0xc9, 0x9c, 0xc5, 0xc7, 0xd8, 0xc9, 0x79, 0xc1, 0xa9, 0x7e,
+- 0x89, 0x3b, 0x0a, 0x7c, 0xf7, 0xc8, 0x5e, 0xe6, 0x32, 0xe4, 0xf9, 0x7a,
+- 0x4c, 0xdb, 0xcc, 0xdf, 0x3b, 0x8a, 0x73, 0x72, 0x6d, 0xbe, 0x8a, 0x17,
+- 0xe5, 0xed, 0x41, 0x74, 0x97, 0xb7, 0xa1, 0x4f, 0x39, 0x06, 0xe6, 0xd8,
+- 0xe4, 0x83, 0x97, 0xfd, 0xf9, 0x8b, 0x22, 0x67, 0x5d, 0x30, 0x3b, 0x35,
+- 0xbe, 0x6f, 0x9f, 0xd4, 0xfd, 0x75, 0xc5, 0xf9, 0xd8, 0x94, 0x93, 0xd7,
+- 0x24, 0x16, 0x5e, 0x83, 0x98, 0x3f, 0xef, 0xff, 0xdf, 0xe4, 0xf3, 0xcd,
+- 0x82, 0x01, 0x93, 0x75, 0xef, 0x2e, 0x41, 0xf1, 0x76, 0x87, 0xc3, 0x5d,
+- 0x6e, 0x9f, 0x64, 0xf8, 0x8a, 0xf6, 0xa7, 0xda, 0xaf, 0xb4, 0x2f, 0x71,
+- 0x5a, 0x74, 0xda, 0xc8, 0xba, 0xa2, 0x3f, 0x07, 0xa3, 0x65, 0x4d, 0x96,
+- 0xdc, 0xad, 0xcd, 0xd9, 0xa7, 0x29, 0x26, 0x6f, 0xee, 0x66, 0x0e, 0x55,
+- 0xb2, 0x9f, 0xd7, 0xe4, 0x3e, 0x4b, 0x07, 0x02, 0x28, 0xda, 0xef, 0x21,
+- 0xae, 0xcf, 0x80, 0x7b, 0x7f, 0x01, 0xed, 0x55, 0x38, 0xc2, 0x6b, 0xf7,
+- 0x6d, 0x31, 0xae, 0x85, 0x6b, 0x7f, 0x21, 0x79, 0xb9, 0x70, 0xbe, 0x13,
+- 0xf7, 0xad, 0x65, 0x1c, 0x57, 0xf7, 0x7b, 0x19, 0x9f, 0xab, 0xe1, 0x61,
+- 0xcc, 0x5b, 0x32, 0xf0, 0x67, 0x28, 0xd8, 0x5f, 0x8c, 0x07, 0x06, 0xae,
+- 0xc7, 0xcc, 0xfd, 0x25, 0xb8, 0x7f, 0x60, 0x26, 0x66, 0xec, 0x97, 0xdc,
+- 0x49, 0x47, 0x60, 0x7f, 0x29, 0x56, 0x0c, 0x04, 0x51, 0xb1, 0xbf, 0x0c,
+- 0x6d, 0x03, 0xb3, 0xa0, 0xed, 0x2f, 0xc7, 0x5d, 0x03, 0x35, 0x28, 0xdf,
+- 0xaf, 0xe1, 0xce, 0x01, 0x03, 0x65, 0xfb, 0x2b, 0x18, 0xd3, 0x42, 0x8c,
+- 0x9d, 0x7e, 0x2c, 0xdf, 0xc3, 0xb9, 0x39, 0x58, 0x45, 0xbf, 0x58, 0x45,
+- 0x4e, 0xbd, 0x1a, 0xfb, 0x52, 0x73, 0x50, 0x72, 0x30, 0x80, 0xa5, 0x7b,
+- 0xc6, 0x35, 0x52, 0x1a, 0x2c, 0x0e, 0x35, 0xa0, 0xe8, 0xa0, 0xe4, 0x7e,
+- 0xc1, 0x13, 0x2d, 0x08, 0x5e, 0x58, 0x84, 0x72, 0xe6, 0xbe, 0xc0, 0x7b,
+- 0x63, 0xc0, 0xec, 0x31, 0x17, 0x8e, 0x68, 0xab, 0xb0, 0x75, 0xec, 0x9b,
+- 0x93, 0x36, 0x2f, 0xfb, 0x47, 0xe5, 0x9c, 0x5f, 0xb9, 0x96, 0x7b, 0xab,
+- 0xd1, 0x33, 0x96, 0x5f, 0x07, 0x0b, 0xf6, 0x6d, 0xa7, 0x06, 0xc7, 0x33,
+- 0xf2, 0x4c, 0x7c, 0x04, 0xb4, 0x6f, 0xa5, 0x5b, 0xce, 0x8f, 0xbb, 0xa2,
+- 0x6a, 0x59, 0x77, 0xf3, 0x86, 0x5b, 0xe2, 0x99, 0x4d, 0xcc, 0xbb, 0x24,
+- 0x87, 0xdd, 0x78, 0xcb, 0x9a, 0xcc, 0x07, 0x97, 0xf6, 0x13, 0xfa, 0xcc,
+- 0x85, 0x01, 0x0d, 0x5f, 0xc3, 0x1a, 0x67, 0x0d, 0x55, 0xe5, 0x9c, 0xc9,
+- 0x79, 0x56, 0xe7, 0x2c, 0x39, 0xed, 0x2c, 0x0e, 0xd3, 0xc1, 0xd4, 0x75,
+- 0xa8, 0xc9, 0x38, 0x6b, 0xb5, 0x75, 0x71, 0xbc, 0xa0, 0xb6, 0x1a, 0xd6,
+- 0xe4, 0xd9, 0x0f, 0x6b, 0xbe, 0x86, 0x98, 0xa9, 0x5d, 0x3a, 0x1f, 0x12,
+- 0xd4, 0x47, 0x10, 0x0c, 0x6c, 0xc3, 0x3a, 0xe7, 0x7c, 0xa0, 0x12, 0x6d,
+- 0x97, 0x73, 0x46, 0xfc, 0x5e, 0x0d, 0x23, 0x93, 0x5f, 0x6b, 0x94, 0xb3,
+- 0xd7, 0xb2, 0x8f, 0x65, 0x33, 0xe7, 0x97, 0x3c, 0xf9, 0x88, 0xa2, 0xf6,
+- 0x3a, 0xeb, 0x63, 0xab, 0x5c, 0x8c, 0x01, 0x2d, 0x0a, 0xe2, 0x45, 0xd1,
+- 0x90, 0xfe, 0xe1, 0xe4, 0xba, 0x83, 0x67, 0x74, 0x8b, 0x52, 0x30, 0xda,
+- 0xa3, 0xb8, 0x47, 0x73, 0xeb, 0x0e, 0x2e, 0xf2, 0xd8, 0x6d, 0xa9, 0x4a,
+- 0x96, 0xd1, 0x30, 0x7b, 0xae, 0x1b, 0xaf, 0x26, 0xca, 0x9c, 0xb3, 0xc7,
+- 0x5b, 0xe7, 0x16, 0xe0, 0x11, 0xda, 0x7e, 0xeb, 0x8d, 0xc7, 0xf0, 0x41,
+- 0x86, 0x5c, 0x23, 0x61, 0x85, 0x87, 0xd9, 0xe7, 0xd1, 0x84, 0x8a, 0x17,
+- 0x07, 0xb7, 0x84, 0x87, 0x9c, 0xfe, 0xbf, 0x8d, 0xcd, 0x23, 0x92, 0x77,
+- 0xb5, 0xd9, 0xdb, 0x53, 0xed, 0xb6, 0xc4, 0xdd, 0x6c, 0xa2, 0x92, 0xb9,
+- 0xb9, 0x86, 0x0f, 0xe6, 0x6e, 0xc0, 0x39, 0x96, 0x19, 0x4d, 0x6c, 0xc4,
+- 0x27, 0xe4, 0x08, 0x99, 0xc4, 0x72, 0xbc, 0xc6, 0x5c, 0xf2, 0x7b, 0x89,
+- 0x56, 0xe6, 0x96, 0xab, 0xf0, 0xca, 0xa0, 0xf0, 0x8f, 0x16, 0x2c, 0x4c,
+- 0x28, 0x58, 0x1a, 0x5a, 0x85, 0x93, 0xc3, 0xcc, 0x29, 0x07, 0xe5, 0xbc,
+- 0xeb, 0x35, 0x58, 0x93, 0x3b, 0x0f, 0xc5, 0xe7, 0x31, 0x3e, 0x5f, 0x89,
+- 0xa3, 0xc3, 0x01, 0x1c, 0x60, 0x0e, 0xf9, 0x0e, 0x31, 0x64, 0x28, 0xd1,
+- 0x80, 0xd3, 0xcc, 0x95, 0x7e, 0x94, 0x88, 0xe0, 0x33, 0xfe, 0x3e, 0x92,
+- 0x90, 0xf5, 0xef, 0x66, 0x5c, 0xc8, 0xfc, 0x18, 0x05, 0xbd, 0x33, 0x70,
+- 0xbc, 0xed, 0x79, 0x52, 0xc9, 0x23, 0xfc, 0xb4, 0xe2, 0xf4, 0x70, 0x2b,
+- 0xce, 0x0c, 0x2e, 0xc3, 0x99, 0xe1, 0x5f, 0xe1, 0x83, 0x41, 0x91, 0x57,
+- 0xce, 0x2c, 0x3a, 0xef, 0x16, 0xb0, 0x5d, 0xe2, 0xd4, 0xf0, 0xbf, 0xa5,
+- 0xed, 0x8f, 0xec, 0xe3, 0xab, 0xa4, 0xdd, 0xe7, 0xff, 0x48, 0xdb, 0xa2,
+- 0x4b, 0x89, 0xf5, 0x5e, 0x9c, 0x4c, 0x78, 0x99, 0x57, 0x8d, 0xdf, 0x50,
+- 0x84, 0xf1, 0xf9, 0xcc, 0x36, 0xb1, 0x3d, 0x53, 0x88, 0x17, 0xfb, 0xdc,
+- 0xe4, 0x8a, 0x5f, 0x25, 0x7e, 0x74, 0xd2, 0x0e, 0x0b, 0x99, 0xbf, 0x79,
+- 0xa9, 0xe3, 0xf9, 0xc4, 0xfb, 0x55, 0xd4, 0x9f, 0x0f, 0xa7, 0x12, 0x7e,
+- 0xbc, 0x9e, 0xa8, 0x8f, 0x67, 0x95, 0x46, 0x58, 0x15, 0xb9, 0xbc, 0xf2,
+- 0x68, 0xa2, 0xc3, 0x91, 0xe9, 0xd5, 0x44, 0x9b, 0xbd, 0x95, 0x3a, 0xee,
+- 0x49, 0x7d, 0xdb, 0x39, 0x6f, 0xf8, 0x4a, 0xe2, 0x82, 0x2d, 0xe7, 0x88,
+- 0x9f, 0xa1, 0x4e, 0x4f, 0x26, 0xe2, 0x28, 0x62, 0x9e, 0x72, 0x2c, 0x31,
+- 0x8e, 0x61, 0xda, 0xe5, 0x3b, 0x7d, 0xc6, 0x89, 0x35, 0xd8, 0x84, 0xcf,
+- 0xd2, 0x85, 0x78, 0x8b, 0x7d, 0x94, 0x37, 0xb9, 0x31, 0xe1, 0xb4, 0xb7,
+- 0x09, 0x9f, 0xf4, 0x29, 0xc8, 0xcc, 0xdd, 0x84, 0x8f, 0xf9, 0xec, 0x0d,
+- 0x5e, 0x9f, 0x0b, 0x53, 0xc2, 0xc9, 0x67, 0x67, 0xfa, 0x54, 0x27, 0x07,
+- 0xee, 0x6e, 0xde, 0x84, 0xd3, 0xe9, 0x8f, 0x71, 0x80, 0xb9, 0xf4, 0x63,
+- 0xe6, 0x34, 0x44, 0xa6, 0x11, 0x70, 0x8d, 0x42, 0x9c, 0xe4, 0xf3, 0x5a,
+- 0x59, 0xef, 0xd1, 0x72, 0xe5, 0x3f, 0xe2, 0x78, 0x1e, 0x61, 0x5b, 0x67,
+- 0xd3, 0xdf, 0x61, 0xbb, 0xc2, 0x39, 0xbf, 0xc3, 0x76, 0x7f, 0x85, 0x91,
+- 0x49, 0x7d, 0x9c, 0x36, 0x65, 0x5c, 0x1b, 0x7c, 0x28, 0xf6, 0x73, 0x1c,
+- 0x0f, 0xf3, 0xbb, 0x03, 0x13, 0x99, 0x9d, 0xfc, 0x7e, 0x0d, 0x87, 0x33,
+- 0x12, 0xdb, 0xf3, 0x67, 0x87, 0x64, 0x7d, 0x4b, 0xfc, 0x47, 0x9f, 0x5c,
+- 0x97, 0x9b, 0x8e, 0x54, 0x7f, 0x59, 0x7c, 0x1a, 0xed, 0xe8, 0x3f, 0xcc,
+- 0x2b, 0xc7, 0x47, 0x61, 0x0b, 0xbb, 0x0e, 0xb8, 0x91, 0xea, 0x25, 0x9f,
+- 0xed, 0xad, 0xc4, 0x53, 0xbb, 0x35, 0x3c, 0xb9, 0xfb, 0x5a, 0x6c, 0xd9,
+- 0x7d, 0x3d, 0xf6, 0xed, 0xae, 0x46, 0x92, 0xb9, 0xf2, 0x27, 0x4d, 0xb6,
+- 0x3d, 0x87, 0x9f, 0x1d, 0xf4, 0x05, 0x2f, 0xbf, 0x5f, 0x0e, 0x8b, 0x9f,
+- 0x18, 0xb8, 0xd1, 0xf1, 0x97, 0x16, 0xdc, 0xe0, 0x7c, 0xc7, 0x30, 0x27,
+- 0xd3, 0x19, 0xde, 0x90, 0xdd, 0x14, 0x7e, 0x28, 0x3b, 0x1d, 0x5b, 0xfb,
+- 0xab, 0xd0, 0xbf, 0xbb, 0x32, 0x5e, 0xc9, 0x7e, 0x56, 0xce, 0xb3, 0x31,
+- 0xc4, 0xba, 0x66, 0x63, 0x4f, 0x78, 0x4d, 0xf6, 0x79, 0xb4, 0x65, 0xfd,
+- 0xd8, 0xdc, 0x1f, 0x60, 0x5f, 0xb2, 0x86, 0xef, 0x3e, 0xf1, 0x20, 0x6c,
+- 0xfb, 0x42, 0xd3, 0x11, 0xc6, 0xb7, 0x1f, 0xa3, 0x9d, 0xcf, 0x92, 0xfd,
+- 0x1b, 0xc8, 0xa9, 0x0a, 0xe2, 0xde, 0xa8, 0x8d, 0x53, 0xe1, 0x71, 0xdc,
+- 0xc1, 0xf6, 0x76, 0xf6, 0x97, 0x51, 0xa6, 0xe2, 0x78, 0x21, 0xef, 0x2d,
+- 0x0d, 0x6f, 0xc4, 0xae, 0x31, 0x59, 0x03, 0x3c, 0x81, 0xa5, 0xe4, 0x2c,
+- 0x15, 0x73, 0x7f, 0x56, 0x82, 0x32, 0xcd, 0x7d, 0xbe, 0x59, 0xec, 0x2f,
+- 0x4e, 0xfb, 0x13, 0xac, 0x5c, 0x87, 0xb5, 0xce, 0xd9, 0xc2, 0x76, 0xbc,
+- 0x94, 0x10, 0x9c, 0x5e, 0x8d, 0x83, 0x89, 0x75, 0xd8, 0x92, 0x92, 0x7d,
+- 0xc0, 0xe5, 0xa8, 0xc9, 0xfe, 0x55, 0x78, 0x3d, 0xe3, 0xa9, 0x2b, 0xfb,
+- 0x3f, 0xb0, 0x38, 0x9b, 0xa6, 0x5c, 0xc3, 0xe1, 0xb5, 0xd9, 0x7d, 0xe1,
+- 0x07, 0xb3, 0xad, 0x98, 0x95, 0x95, 0xf5, 0xb4, 0x36, 0xe2, 0xbb, 0xac,
+- 0xa7, 0x4d, 0x60, 0x61, 0xf6, 0x0c, 0x16, 0x65, 0xdf, 0x62, 0x2c, 0x16,
+- 0xdc, 0x90, 0x75, 0xb6, 0x5f, 0x31, 0x39, 0x91, 0x7d, 0xc3, 0xbf, 0xc4,
+- 0xd6, 0xbd, 0x71, 0xc6, 0xc2, 0x3c, 0x46, 0xd5, 0x6b, 0x07, 0x04, 0x5f,
+- 0xc6, 0x3c, 0x4e, 0x2c, 0xe8, 0x4b, 0xdd, 0x43, 0x7b, 0x54, 0xc9, 0xf3,
+- 0x25, 0xce, 0xac, 0xa3, 0x2f, 0x77, 0x92, 0x9f, 0x4b, 0xfc, 0xbb, 0x6b,
+- 0xf2, 0xbe, 0xf0, 0x3a, 0x89, 0x7d, 0x3a, 0x8e, 0x66, 0x9c, 0xbd, 0x0c,
+- 0xdd, 0x6b, 0xdc, 0xc1, 0x67, 0x52, 0xff, 0x2f, 0x91, 0xdc, 0xbb, 0xca,
+- 0xde, 0xe9, 0xac, 0x19, 0x29, 0x38, 0x1e, 0x62, 0x5f, 0xa4, 0x91, 0x4b,
+- 0xf7, 0xcb, 0x59, 0xce, 0x75, 0x72, 0x96, 0xd3, 0x72, 0x19, 0x6d, 0xf6,
+- 0x96, 0x14, 0x1e, 0x2c, 0x45, 0x00, 0xcb, 0x47, 0x0b, 0x10, 0x3b, 0x58,
+- 0x8c, 0xdb, 0x77, 0xb7, 0xd3, 0x96, 0x2d, 0xda, 0xaf, 0x61, 0xae, 0x55,
+- 0x8a, 0xb1, 0x84, 0xf7, 0x1e, 0xe8, 0x0f, 0xb6, 0x02, 0xa1, 0x13, 0xa7,
+- 0x5d, 0xc5, 0xb8, 0x9f, 0xb1, 0x23, 0x9d, 0x5e, 0x8e, 0xd8, 0xfe, 0xe3,
+- 0xb0, 0xd2, 0xb4, 0xc9, 0x3d, 0xc4, 0x99, 0xbd, 0x6e, 0xa8, 0xd1, 0x5f,
+- 0x61, 0xdf, 0xb0, 0x8a, 0xf2, 0x3d, 0x2f, 0xd8, 0x01, 0x43, 0x31, 0xce,
+- 0x85, 0xb2, 0xe4, 0x40, 0x6e, 0x94, 0x26, 0x5b, 0x30, 0x4a, 0xac, 0xf1,
+- 0x25, 0x63, 0xc8, 0x64, 0xda, 0x90, 0x26, 0x96, 0xa4, 0xc9, 0x9b, 0x4a,
+- 0x92, 0x26, 0x63, 0x79, 0x1d, 0x76, 0xd1, 0x5f, 0x0a, 0x98, 0xcb, 0x6f,
+- 0xcb, 0xdc, 0x0a, 0x6b, 0xf8, 0x4e, 0x6c, 0x1f, 0x6e, 0xe3, 0x87, 0xfc,
+- 0x71, 0xf8, 0xdb, 0x58, 0x38, 0x7a, 0x02, 0x3d, 0x99, 0x38, 0xed, 0xf1,
+- 0x63, 0x6c, 0x4f, 0x1f, 0xc3, 0x53, 0x7d, 0x5d, 0xcc, 0x11, 0x8e, 0xe1,
+- 0x49, 0x5e, 0xf7, 0xf5, 0x19, 0x9d, 0x01, 0xf5, 0x18, 0x52, 0xe9, 0x4d,
+- 0xb8, 0xb3, 0x5f, 0x61, 0x0e, 0xb7, 0x09, 0x77, 0xec, 0xa7, 0x2d, 0x3e,
+- 0xd1, 0x81, 0xd6, 0xd1, 0xd7, 0x90, 0xc8, 0xbc, 0xc4, 0xfc, 0x6a, 0x23,
+- 0x7a, 0x52, 0x1b, 0xc8, 0xbd, 0x9e, 0x67, 0x3b, 0x47, 0xe8, 0xe7, 0x9d,
+- 0x1c, 0xe3, 0xe3, 0xfc, 0x5c, 0xc2, 0x70, 0x4d, 0x57, 0xf2, 0x58, 0x4d,
+- 0xbf, 0x4f, 0x49, 0xee, 0xb0, 0x8e, 0x38, 0x71, 0x6f, 0x29, 0x8a, 0x45,
+- 0xbf, 0xf9, 0x35, 0x69, 0x99, 0x0b, 0xb1, 0x7d, 0x59, 0x9b, 0x76, 0xa3,
+- 0x28, 0x29, 0xeb, 0xd1, 0xe3, 0xc1, 0x22, 0x72, 0x00, 0x6f, 0x52, 0x74,
+- 0xd8, 0x6e, 0x77, 0xa7, 0x04, 0x4b, 0x72, 0xdc, 0xfc, 0xe5, 0xcc, 0xaf,
+- 0xb0, 0x75, 0x70, 0x1a, 0x16, 0xf5, 0x55, 0x23, 0xee, 0xb7, 0xed, 0xe7,
+- 0xe8, 0x6b, 0x09, 0xe6, 0x58, 0xbb, 0xfa, 0x63, 0xc4, 0x94, 0x12, 0xe4,
+- 0x72, 0x3d, 0xd1, 0x4d, 0xd0, 0xd4, 0xaf, 0xd8, 0x23, 0x99, 0xc5, 0x79,
+- 0x13, 0xee, 0x3a, 0x7e, 0x43, 0x29, 0xce, 0x97, 0xe4, 0xd6, 0xc5, 0xff,
+- 0xfc, 0x12, 0xb7, 0xf9, 0xd7, 0x95, 0xbf, 0xff, 0xdf, 0x58, 0x7e, 0x62,
+- 0xca, 0xd9, 0xb5, 0xfc, 0x7b, 0x39, 0x32, 0xd6, 0xeb, 0xe5, 0xdc, 0x9a,
+- 0x25, 0x7c, 0x49, 0xce, 0xdc, 0x1e, 0x4f, 0x14, 0x30, 0x4e, 0xaa, 0x0b,
+- 0x3c, 0x50, 0xfd, 0x1e, 0x14, 0x32, 0x9e, 0x55, 0x61, 0xb3, 0xdf, 0xc6,
+- 0x62, 0xb3, 0x00, 0x87, 0x1b, 0x62, 0x72, 0xce, 0xa2, 0xdd, 0xe3, 0xf0,
+- 0xd1, 0xd5, 0xf7, 0xfc, 0xe1, 0xba, 0xf5, 0x26, 0x72, 0x37, 0x39, 0x5f,
+- 0xd0, 0x86, 0x53, 0x15, 0xf2, 0xae, 0xd0, 0x26, 0xe7, 0xdc, 0x59, 0x51,
+- 0xad, 0xac, 0xa3, 0xe9, 0x38, 0x61, 0xd4, 0xeb, 0x95, 0x2a, 0xe3, 0xb9,
+- 0xf2, 0xae, 0x6d, 0xf9, 0xa3, 0x8c, 0xf5, 0x72, 0x86, 0xe2, 0x5f, 0xda,
+- 0xa7, 0x58, 0x83, 0xed, 0x4f, 0x34, 0x63, 0x62, 0x95, 0xc4, 0xff, 0xff,
+- 0xe6, 0xcb, 0x73, 0xba, 0x6d, 0xa9, 0x1f, 0x96, 0xca, 0xb9, 0x24, 0x69,
+- 0x7b, 0x3b, 0xf3, 0x27, 0x8f, 0x11, 0xc6, 0xbb, 0xc2, 0xd2, 0x9c, 0xfd,
+- 0xa4, 0x1c, 0xa7, 0x28, 0x34, 0xce, 0x4f, 0xbe, 0x3b, 0xf2, 0xd7, 0xa5,
+- 0xc2, 0x0f, 0xb7, 0xa5, 0x36, 0x91, 0x9b, 0x8b, 0x3c, 0xbf, 0xb7, 0xd7,
+- 0xf8, 0x2b, 0x59, 0xf6, 0xee, 0xc9, 0xf6, 0xc4, 0x16, 0xe4, 0x4c, 0x8e,
+- 0xdc, 0x93, 0x3a, 0xa2, 0xb3, 0xa9, 0x75, 0x5c, 0xcc, 0x85, 0x6f, 0xc0,
+- 0xa3, 0xf4, 0xc1, 0x99, 0xc6, 0xeb, 0x76, 0x97, 0x9c, 0x9f, 0xa9, 0xd5,
+- 0xa6, 0xf4, 0xf5, 0x0b, 0x47, 0x96, 0x42, 0xca, 0xd2, 0x9f, 0x92, 0xb3,
+- 0xa8, 0x9f, 0xd9, 0xb5, 0x55, 0xf2, 0xfc, 0xc2, 0x64, 0xfb, 0x35, 0xce,
+- 0xd9, 0xbe, 0x7d, 0xa9, 0xbc, 0xdc, 0xb2, 0xde, 0xea, 0xcf, 0xf7, 0x55,
+- 0x77, 0x79, 0x3c, 0x22, 0x5b, 0xbc, 0xf4, 0x4a, 0x99, 0xe1, 0xcb, 0x9f,
+- 0x59, 0x9d, 0xe1, 0xd4, 0xc9, 0xf7, 0x29, 0x32, 0x6e, 0x62, 0x9e, 0x7a,
+- 0xf5, 0x18, 0xb5, 0x29, 0x63, 0x92, 0x3a, 0x32, 0x2e, 0x6d, 0xd2, 0x0e,
+- 0x4a, 0xcb, 0x50, 0x2c, 0x75, 0x84, 0xbb, 0x6a, 0x0e, 0x07, 0x2f, 0x17,
+- 0x5e, 0x2e, 0xb6, 0x51, 0x66, 0xdb, 0xef, 0x39, 0x31, 0x53, 0xda, 0xe1,
+- 0x38, 0xc6, 0x56, 0xd1, 0xce, 0xed, 0x2e, 0xe2, 0xa7, 0xfd, 0x5e, 0x73,
+- 0x00, 0x5b, 0x13, 0xa2, 0x6b, 0x23, 0x70, 0x88, 0xd8, 0xb1, 0xd9, 0xe1,
+- 0x1b, 0x1e, 0x74, 0xa7, 0xf3, 0xfb, 0xa3, 0x85, 0x72, 0xf6, 0x36, 0x20,
+- 0x3a, 0xef, 0x36, 0xc9, 0xb3, 0xb4, 0x85, 0xba, 0x9b, 0x5c, 0x69, 0x3d,
+- 0xfe, 0x99, 0xf3, 0x2b, 0xe7, 0x8f, 0x73, 0x7b, 0x95, 0x71, 0xda, 0x51,
+- 0x2e, 0x5e, 0x81, 0xf1, 0x9d, 0x3c, 0x69, 0xf2, 0x5c, 0x66, 0x77, 0xe6,
+- 0x9f, 0xed, 0x71, 0xe7, 0x5c, 0xe6, 0xe5, 0x77, 0x3a, 0xd2, 0x9a, 0x6d,
+- 0x1f, 0xe0, 0xb3, 0xcb, 0x67, 0x34, 0x19, 0xd3, 0x0d, 0x39, 0xcb, 0xf9,
+- 0x4f, 0x9c, 0xbb, 0xa9, 0x65, 0xc7, 0x2b, 0x72, 0x67, 0x96, 0x63, 0xea,
+- 0x42, 0x23, 0x8f, 0xab, 0x41, 0xcb, 0x72, 0x70, 0xf5, 0x0e, 0x67, 0x0f,
+- 0x3e, 0x8d, 0x60, 0x6b, 0x1b, 0x2c, 0xbb, 0xd8, 0xc8, 0xe3, 0x80, 0x61,
+- 0xce, 0x51, 0xba, 0x30, 0x3b, 0x5c, 0x2c, 0x1c, 0x3b, 0xe8, 0x8e, 0x06,
+- 0xb5, 0x0f, 0x10, 0xaa, 0x3b, 0xe6, 0xec, 0x95, 0x0a, 0x36, 0x18, 0x58,
+- 0x9f, 0x21, 0xdf, 0x1e, 0x93, 0x77, 0x1d, 0xe5, 0xda, 0x69, 0x9f, 0xd7,
+- 0x82, 0xa5, 0xed, 0xc4, 0x52, 0xeb, 0xcf, 0x3d, 0x4e, 0x7b, 0xc1, 0xf6,
+- 0x61, 0x25, 0xd8, 0xba, 0x51, 0xc9, 0xb7, 0xe7, 0xfb, 0x92, 0xf6, 0xea,
+- 0x58, 0xbf, 0x7a, 0xf2, 0xfd, 0x42, 0x83, 0x6d, 0x5c, 0xbd, 0x9f, 0x3c,
+- 0x3d, 0x2e, 0x7b, 0x51, 0x87, 0x27, 0x39, 0xe1, 0xb1, 0x3f, 0xd8, 0x8b,
+- 0xfa, 0xd2, 0x3e, 0x63, 0xec, 0xb3, 0xb5, 0x58, 0x89, 0x91, 0x31, 0x74,
+- 0xa1, 0x30, 0x1c, 0xaa, 0x7b, 0x19, 0xd0, 0xdd, 0xd1, 0x50, 0x60, 0xd8,
+- 0xd9, 0xd3, 0x35, 0xbd, 0x8b, 0x9c, 0xfa, 0xd5, 0xe4, 0xc5, 0x7f, 0x5c,
+- 0x27, 0x25, 0x86, 0xd1, 0x56, 0xaf, 0xc4, 0xe6, 0x17, 0xb3, 0x9d, 0xba,
+- 0x30, 0xf4, 0x82, 0x68, 0x5e, 0x47, 0xa1, 0xba, 0x0f, 0x38, 0x9f, 0x47,
+- 0x9b, 0x43, 0x81, 0x21, 0xe7, 0x8c, 0xa7, 0xe8, 0xc5, 0xf4, 0xe6, 0xe6,
+- 0x5e, 0x17, 0xbe, 0xcd, 0x7c, 0x32, 0x8e, 0x91, 0x84, 0x97, 0x63, 0xa9,
+- 0xd7, 0xb6, 0xa3, 0x82, 0x36, 0x8e, 0xd8, 0xe6, 0x06, 0xe2, 0x77, 0x02,
+- 0x31, 0xd7, 0x8d, 0xe5, 0x88, 0x93, 0x40, 0xbb, 0x8c, 0x38, 0x39, 0x51,
+- 0x7d, 0xdd, 0x0e, 0xda, 0x6f, 0xda, 0x1f, 0x0c, 0x58, 0x88, 0xe3, 0xc5,
+- 0xc4, 0xc2, 0xff, 0xc7, 0x05, 0xcb, 0x2c, 0x81, 0xbc, 0x5f, 0x90, 0xbe,
+- 0x67, 0x59, 0x28, 0xa8, 0xbf, 0x32, 0xb9, 0x27, 0xdd, 0x9d, 0xf8, 0xad,
+- 0xbc, 0xc7, 0xc4, 0x7a, 0x7f, 0xac, 0x8c, 0xf4, 0xed, 0xc5, 0xa1, 0xbe,
+- 0x3e, 0x6c, 0x79, 0x82, 0x32, 0x1a, 0x36, 0x16, 0x9a, 0x5d, 0xcc, 0xa5,
+- 0x7d, 0x58, 0xa7, 0xcd, 0x8e, 0xa8, 0x2c, 0x37, 0x94, 0xce, 0xad, 0x3b,
+- 0x6e, 0x75, 0xf6, 0xbc, 0x7b, 0x98, 0xa3, 0x38, 0xf1, 0x53, 0xf3, 0x46,
+- 0x63, 0xca, 0xce, 0x4c, 0x8b, 0xb2, 0x23, 0x2d, 0x6d, 0x75, 0x2a, 0x3d,
+- 0x99, 0xbf, 0xa5, 0x4f, 0x58, 0x38, 0x6d, 0xca, 0xbb, 0x39, 0xd2, 0xae,
+- 0x85, 0xe1, 0xe6, 0x7f, 0xcd, 0x3b, 0x3a, 0xa2, 0xd3, 0x4e, 0x6c, 0x1e,
+- 0x7c, 0x1c, 0xdd, 0x83, 0xa7, 0x9c, 0x33, 0x46, 0x1e, 0xc3, 0x6b, 0x5d,
+- 0x1f, 0x0d, 0x1e, 0xb1, 0x90, 0x2d, 0x97, 0xf3, 0xf9, 0x55, 0xd1, 0x13,
+- 0xd8, 0xa9, 0xc9, 0xbb, 0x27, 0x3d, 0xe4, 0x11, 0xb2, 0x6f, 0xbb, 0x1a,
+- 0x5f, 0xef, 0x95, 0x39, 0x2c, 0xb3, 0x0a, 0xa3, 0xc1, 0xd8, 0x3a, 0x67,
+- 0x0e, 0x1b, 0x70, 0x32, 0xfb, 0x38, 0xde, 0xdb, 0xd3, 0x05, 0x35, 0x1c,
+- 0x0c, 0xdc, 0x06, 0xbb, 0xeb, 0xb8, 0x19, 0xb3, 0x3c, 0x08, 0x1e, 0x76,
+- 0xa9, 0xc0, 0x0b, 0x7b, 0xe0, 0x9d, 0xc1, 0xf9, 0x9f, 0xcf, 0x18, 0x5d,
+- 0x6e, 0xd8, 0x0b, 0xfe, 0xb1, 0x29, 0xd8, 0x63, 0xb8, 0xac, 0xbf, 0x99,
+- 0x8e, 0x60, 0x5f, 0x44, 0x35, 0xda, 0xef, 0x52, 0xa1, 0xf8, 0xa2, 0xf2,
+- 0x5e, 0x69, 0x17, 0xee, 0x6c, 0xf4, 0x59, 0xa5, 0xd1, 0x60, 0xdf, 0x29,
+- 0x25, 0x58, 0x67, 0xa9, 0x6d, 0x9c, 0xe7, 0x3a, 0xbc, 0x42, 0x0e, 0xd2,
+- 0xca, 0xd8, 0xbb, 0x34, 0xa9, 0x3b, 0xeb, 0x4c, 0xaa, 0x51, 0x13, 0x29,
+- 0x52, 0x34, 0xdc, 0x96, 0x05, 0x8e, 0xa6, 0x57, 0xe3, 0x9d, 0x3d, 0x26,
+- 0xf3, 0x54, 0x9d, 0xb8, 0xf5, 0xbd, 0x32, 0xc1, 0x80, 0x0e, 0xd3, 0xaa,
+- 0x57, 0x19, 0xfb, 0x3d, 0x2a, 0x16, 0xce, 0x8c, 0x86, 0xc6, 0x17, 0xb8,
+- 0xdc, 0x88, 0x64, 0x65, 0xfd, 0x53, 0x97, 0xb3, 0xc9, 0xb8, 0x2b, 0xe9,
+- 0x25, 0xff, 0xac, 0xc6, 0x6f, 0xc8, 0x83, 0x7f, 0x4d, 0xbe, 0x3b, 0xc1,
+- 0x78, 0x3e, 0x91, 0x29, 0x66, 0xbe, 0xe8, 0x91, 0x1c, 0x78, 0xdc, 0xc3,
+- 0xb9, 0x28, 0x6b, 0xf4, 0xe3, 0xdc, 0xb0, 0x17, 0x77, 0xec, 0x09, 0xee,
+- 0x9b, 0x50, 0xab, 0xf0, 0xc9, 0x70, 0x31, 0x96, 0x0f, 0x78, 0x29, 0x9b,
+- 0x8d, 0x5d, 0xc4, 0xff, 0x8f, 0xf8, 0xac, 0x65, 0x0f, 0x94, 0xcc, 0xdc,
+- 0x59, 0xe4, 0xec, 0x06, 0xeb, 0x97, 0x60, 0xd9, 0x80, 0xf0, 0x34, 0x15,
+- 0x1f, 0x0e, 0x2b, 0xf8, 0x20, 0x6d, 0x62, 0x21, 0xfb, 0xdb, 0x9c, 0x7a,
+- 0xc1, 0xf6, 0xd2, 0xcf, 0xd7, 0x64, 0x4c, 0x3c, 0x98, 0xd6, 0x19, 0x53,
+- 0xde, 0xb6, 0x5d, 0x46, 0x23, 0xde, 0xde, 0x6d, 0x9c, 0x78, 0xd7, 0x15,
+- 0x1a, 0x9f, 0xeb, 0x6a, 0xc4, 0x5b, 0x07, 0x1b, 0xf1, 0xb3, 0xfe, 0x05,
+- 0xb8, 0xb9, 0x31, 0x86, 0xf3, 0x73, 0x1b, 0xf1, 0xe6, 0x7e, 0x1d, 0x3b,
+- 0x52, 0xcd, 0xd0, 0x47, 0xc7, 0xc9, 0x4f, 0x23, 0xa8, 0x67, 0x4e, 0x65,
+- 0xf4, 0xdb, 0x5d, 0x25, 0xd1, 0x2e, 0xec, 0x34, 0xa3, 0x98, 0xb3, 0x5f,
+- 0xf4, 0x60, 0xdb, 0xeb, 0xe6, 0x46, 0xf1, 0x72, 0x9f, 0x41, 0x3f, 0x8d,
+- 0x52, 0x0f, 0x3a, 0x9e, 0x24, 0x36, 0x87, 0x9e, 0x30, 0x2e, 0x1c, 0xe0,
+- 0xef, 0x05, 0x07, 0x9a, 0xd1, 0xce, 0xfe, 0x13, 0xa9, 0x18, 0xf6, 0x8d,
+- 0x36, 0x70, 0xcc, 0x26, 0xc7, 0x5f, 0x63, 0xfd, 0x46, 0x69, 0x41, 0xdf,
+- 0x68, 0x2b, 0xf9, 0x66, 0x17, 0x79, 0x66, 0x2b, 0x7a, 0xd9, 0xd6, 0xd6,
+- 0x94, 0x89, 0x65, 0xc9, 0x56, 0x3c, 0x9d, 0x90, 0x33, 0x8d, 0x46, 0x64,
+- 0x9e, 0x22, 0xef, 0x7d, 0xb5, 0xe2, 0x10, 0x75, 0xb2, 0x70, 0x60, 0x39,
+- 0xed, 0xd0, 0x8b, 0x45, 0x7b, 0x74, 0x3c, 0x95, 0xba, 0x13, 0xef, 0x8c,
+- 0x98, 0x68, 0x4b, 0x8a, 0xbe, 0xe5, 0x5c, 0x4d, 0x1c, 0xc7, 0x19, 0x5b,
+- 0x7e, 0x33, 0x10, 0xfb, 0x1b, 0x4e, 0xf3, 0x49, 0x15, 0xc1, 0xce, 0x19,
+- 0x9c, 0xf0, 0x9b, 0x1a, 0xe5, 0x6c, 0x94, 0x8b, 0xa8, 0x16, 0xb4, 0xca,
+- 0x55, 0x4b, 0xe7, 0x7d, 0xcb, 0xad, 0x6e, 0xc2, 0x37, 0x06, 0xdc, 0xe4,
+- 0xf4, 0x2a, 0x73, 0x11, 0xab, 0x83, 0xb6, 0x61, 0x95, 0xa9, 0xb9, 0x79,
+- 0xdb, 0x2e, 0xef, 0xa1, 0x19, 0x2e, 0xec, 0x32, 0x6b, 0xda, 0x4a, 0x58,
+- 0x6f, 0x69, 0x38, 0x18, 0x2b, 0x52, 0x9b, 0x99, 0x27, 0x3e, 0x8e, 0x75,
+- 0x7b, 0x1e, 0xc7, 0x1a, 0x7e, 0x3a, 0xf6, 0xd8, 0x5d, 0x4b, 0x4c, 0x05,
+- 0x2f, 0x1a, 0x76, 0x57, 0x97, 0x69, 0x70, 0x6e, 0x65, 0x5e, 0x1f, 0x47,
+- 0xe7, 0xa1, 0xc7, 0xf1, 0x28, 0xed, 0xab, 0x92, 0x7e, 0xbc, 0x32, 0x69,
+- 0x77, 0xdd, 0xdc, 0x58, 0x87, 0x4f, 0x9d, 0xfc, 0x43, 0xec, 0x75, 0xab,
+- 0x93, 0x13, 0xa7, 0x55, 0xb9, 0xde, 0xed, 0x5c, 0x5b, 0xea, 0x2b, 0x65,
+- 0xf9, 0xd8, 0xf2, 0x5b, 0xb6, 0xfb, 0xbb, 0x3d, 0xe5, 0x78, 0xa2, 0x52,
+- 0xe2, 0x87, 0xac, 0xed, 0x42, 0x31, 0xe6, 0x32, 0xcf, 0x7a, 0xe2, 0x38,
+- 0xb6, 0x93, 0xb7, 0xf9, 0xc3, 0x92, 0x03, 0xd7, 0x9b, 0x5b, 0xd4, 0x5b,
+- 0x89, 0xed, 0x0a, 0x76, 0xd6, 0xf6, 0xa1, 0x97, 0xbe, 0xba, 0xab, 0x36,
+- 0x18, 0xef, 0x45, 0xd4, 0xde, 0x35, 0xbd, 0xe7, 0xdf, 0xf0, 0x5e, 0x96,
+- 0xbc, 0xb7, 0x9d, 0x7f, 0x37, 0xeb, 0x71, 0x74, 0xed, 0x91, 0xf9, 0x7f,
+- 0x1c, 0x8f, 0x51, 0xfe, 0xce, 0x81, 0xc7, 0xf1, 0x4d, 0xda, 0x4e, 0x45,
+- 0xd3, 0xd1, 0xc7, 0x2a, 0x30, 0xbb, 0xaf, 0x1c, 0xe3, 0x0f, 0x57, 0xca,
+- 0x39, 0x28, 0x62, 0x62, 0xaf, 0xf2, 0x38, 0xd6, 0x0f, 0x1d, 0xa0, 0x2f,
+- 0x3a, 0xfe, 0x47, 0x2c, 0xce, 0xc7, 0xab, 0x00, 0xd6, 0x11, 0x93, 0x73,
+- 0xb8, 0xee, 0xc7, 0x9a, 0xc4, 0x61, 0xc7, 0xf7, 0x0b, 0xa2, 0xab, 0xe8,
+- 0xf7, 0x6d, 0xf4, 0xfb, 0xe5, 0xf4, 0xfb, 0x56, 0xfa, 0x7d, 0x0b, 0xfd,
+- 0x3e, 0x46, 0xbf, 0x8f, 0xd2, 0xef, 0x23, 0xf4, 0xfb, 0x66, 0xfa, 0xbd,
+- 0x49, 0xbf, 0x87, 0x72, 0xa2, 0xf9, 0x38, 0x3c, 0xfd, 0x5e, 0xda, 0x50,
+- 0xee, 0x3d, 0x99, 0x83, 0xc4, 0x9f, 0xd3, 0xe6, 0x9c, 0xc0, 0x62, 0xc6,
+- 0xd5, 0x61, 0x62, 0x44, 0x7a, 0xe4, 0xaf, 0x9c, 0x77, 0x2a, 0xd2, 0xc4,
+- 0xfd, 0x57, 0xa8, 0x8f, 0xa5, 0xe1, 0x1a, 0xf3, 0x69, 0xc6, 0xb0, 0x5f,
+- 0x18, 0xf5, 0x3d, 0x7e, 0x96, 0xf9, 0x41, 0xaa, 0xbe, 0x6f, 0x1a, 0x0c,
+- 0xab, 0x51, 0xdd, 0x0a, 0xac, 0xf4, 0x73, 0xcc, 0x72, 0xde, 0x6e, 0x25,
+- 0x1e, 0x1b, 0x6c, 0xc3, 0x7f, 0x19, 0xd4, 0xa8, 0x8b, 0x9a, 0xf1, 0x5b,
+- 0x5d, 0xf8, 0x71, 0x00, 0x2e, 0xff, 0x35, 0xc0, 0xe7, 0x55, 0x98, 0x73,
+- 0x58, 0xde, 0xef, 0x4b, 0x57, 0xb9, 0x1a, 0x66, 0x42, 0x6c, 0x04, 0x44,
+- 0x6a, 0x17, 0x33, 0xc1, 0x39, 0xce, 0x3b, 0x40, 0xb1, 0x55, 0x82, 0xe9,
+- 0x45, 0xd8, 0x5a, 0xe7, 0xe0, 0xec, 0xb3, 0x72, 0x6e, 0xb0, 0x8a, 0x78,
+- 0xe4, 0x8b, 0xb6, 0x62, 0x5b, 0xaf, 0x75, 0x7f, 0x15, 0x96, 0xa3, 0xa7,
+- 0x37, 0xa7, 0x83, 0x87, 0xc3, 0x1a, 0xa9, 0x42, 0x48, 0x9f, 0xa3, 0xc0,
+- 0xdd, 0xd1, 0x1c, 0xc1, 0x83, 0x99, 0x04, 0xfa, 0x38, 0xc6, 0x0d, 0xf4,
+- 0xb3, 0x75, 0x7f, 0xfa, 0xdd, 0x4e, 0x7c, 0x33, 0xa1, 0xd3, 0xfe, 0x2f,
+- 0xda, 0xe9, 0x8a, 0x39, 0x7d, 0x55, 0x30, 0x3a, 0x57, 0xa8, 0xf3, 0x98,
+- 0xd3, 0x06, 0x8f, 0xc8, 0xc2, 0xf7, 0xf4, 0xa8, 0xd7, 0xaa, 0x20, 0x36,
+- 0xcf, 0x1a, 0x80, 0x32, 0x9c, 0x94, 0xf7, 0x20, 0xba, 0xf0, 0xff, 0x99,
+- 0x6d, 0x8e, 0xfd, 0x8c, 0xbb, 0x34, 0xcc, 0x4c, 0xca, 0x7d, 0x7b, 0xc1,
+- 0x67, 0x4d, 0xc1, 0x3a, 0xdd, 0xb5, 0x81, 0xf7, 0xab, 0xf1, 0x23, 0xc6,
+- 0xd9, 0xc0, 0xc0, 0x02, 0xa8, 0x4d, 0x5e, 0xdc, 0xdd, 0x50, 0x8a, 0xf8,
+- 0x4a, 0xe1, 0xa1, 0x92, 0xef, 0xbb, 0xa9, 0xcf, 0xff, 0x17, 0x0f, 0x99,
+- 0xcf, 0x61, 0xc2, 0x9f, 0x70, 0xf6, 0xdd, 0xd7, 0x99, 0x77, 0x28, 0x16,
+- 0xaf, 0xb7, 0xa5, 0x2c, 0x6c, 0x30, 0x99, 0x0b, 0xdd, 0x53, 0xc9, 0x9c,
+- 0x44, 0xca, 0x4b, 0xbb, 0x5b, 0x9d, 0xf6, 0x0e, 0xa6, 0xe4, 0x7a, 0xf7,
+- 0x64, 0x9f, 0x77, 0x01, 0x95, 0x5e, 0xe2, 0xad, 0x82, 0x33, 0xb5, 0x09,
+- 0xfa, 0x34, 0x7e, 0xec, 0x46, 0x4d, 0xba, 0x5f, 0x75, 0xfd, 0xf8, 0x1a,
+- 0xcc, 0x31, 0x7f, 0xaf, 0xca, 0x7c, 0xc4, 0xf0, 0x54, 0x48, 0x41, 0xa5,
+- 0x61, 0x9c, 0xff, 0x19, 0x7d, 0x6b, 0xc2, 0x95, 0xc0, 0x53, 0x63, 0xa7,
+- 0xec, 0xf1, 0x6b, 0xfc, 0x9c, 0x73, 0xa9, 0xdb, 0x86, 0x0f, 0x06, 0x65,
+- 0xce, 0x64, 0x9d, 0x9f, 0xb1, 0x5d, 0xd5, 0x51, 0xca, 0x7b, 0xa7, 0x87,
+- 0x4d, 0xe6, 0x3a, 0x6d, 0xf8, 0xc7, 0xc1, 0x95, 0xf8, 0xfd, 0x60, 0x4d,
+- 0xdb, 0x7f, 0x52, 0x6d, 0x7b, 0x69, 0xf8, 0x6b, 0xf8, 0x65, 0xa5, 0x86,
+- 0xa7, 0x69, 0x43, 0xbf, 0x4f, 0x58, 0x4b, 0xaf, 0x21, 0x16, 0xfc, 0xef,
+- 0x44, 0xf0, 0xc2, 0x49, 0x67, 0x5f, 0xa9, 0xde, 0xfc, 0xd0, 0x15, 0x8c,
+- 0x9f, 0x51, 0x83, 0xd6, 0x36, 0x65, 0x39, 0xec, 0x4c, 0x2b, 0xce, 0x67,
+- 0xa6, 0xda, 0x42, 0x97, 0x8d, 0x2a, 0xb1, 0x03, 0xb1, 0x07, 0xda, 0x22,
+- 0x73, 0xb9, 0x9f, 0x92, 0x47, 0x77, 0x7f, 0x95, 0xf6, 0x98, 0xa2, 0x3d,
+- 0xa6, 0x68, 0x8f, 0xc4, 0xa4, 0xe7, 0x89, 0x55, 0x3f, 0x48, 0xd1, 0x1e,
+- 0xe9, 0x3f, 0xcf, 0xd1, 0x7f, 0x72, 0x5c, 0xb9, 0xdd, 0x39, 0xb7, 0xf6,
+- 0x06, 0x63, 0x62, 0xe2, 0x09, 0x79, 0x27, 0xad, 0x66, 0x43, 0x16, 0xc1,
+- 0xf6, 0x5e, 0xe5, 0xb3, 0x72, 0x39, 0x67, 0xfb, 0xed, 0x90, 0xf8, 0x40,
+- 0x6e, 0x3f, 0xe0, 0xc8, 0xc8, 0x63, 0x65, 0xf2, 0x7e, 0xd4, 0xc1, 0xbd,
+- 0xff, 0x92, 0xce, 0xfe, 0x3b, 0xe5, 0x10, 0x7d, 0xfd, 0x5b, 0xc7, 0x2e,
+- 0xba, 0xfc, 0x1b, 0xfb, 0x97, 0x55, 0x32, 0xfe, 0x55, 0xf8, 0x62, 0xb0,
+- 0x05, 0xe7, 0x19, 0x7f, 0xdf, 0x6a, 0x1a, 0xef, 0x0c, 0x20, 0xd8, 0x51,
+- 0xae, 0x46, 0x91, 0xcd, 0xb4, 0xe0, 0xb3, 0x44, 0x14, 0x07, 0x12, 0x35,
+- 0xed, 0x35, 0xae, 0xb3, 0x6a, 0x7c, 0x86, 0x58, 0x54, 0x0c, 0x9f, 0x92,
+- 0x5f, 0x2e, 0xac, 0x8d, 0x60, 0x88, 0x6d, 0x7a, 0xa2, 0x1a, 0x46, 0x9a,
+- 0xc5, 0x56, 0x73, 0xef, 0x4e, 0xfd, 0xa9, 0xbf, 0x2e, 0xda, 0xe3, 0x7b,
+- 0x4d, 0x17, 0xed, 0x71, 0xcd, 0x6b, 0x69, 0xf4, 0xe1, 0xd2, 0x3d, 0xf2,
+- 0x6e, 0xa9, 0xf8, 0xb3, 0x82, 0x1f, 0x84, 0xc7, 0xdb, 0xa6, 0x21, 0xf8,
+- 0xec, 0x7d, 0xb4, 0xf5, 0x93, 0x49, 0x59, 0x53, 0x6c, 0xc1, 0xfb, 0x2c,
+- 0xef, 0xa6, 0x5f, 0x9c, 0xcc, 0xb8, 0xdd, 0xbf, 0x4c, 0x2a, 0xcc, 0x4b,
+- 0x97, 0xe3, 0x97, 0x99, 0x37, 0xd5, 0x8f, 0x35, 0x13, 0x67, 0xb2, 0x2b,
+- 0x69, 0x4f, 0x92, 0xff, 0xc7, 0x98, 0xff, 0x07, 0x3b, 0x8f, 0x60, 0x25,
+- 0xca, 0x0f, 0xad, 0x42, 0xd9, 0x1e, 0xe2, 0x67, 0x88, 0xf9, 0x3f, 0xaf,
+- 0x67, 0xec, 0x91, 0xf7, 0x0d, 0xca, 0xed, 0xed, 0xab, 0x44, 0x2f, 0x82,
+- 0x27, 0x7f, 0x57, 0x8e, 0xb2, 0x55, 0xc0, 0x21, 0xa9, 0x67, 0xb0, 0xde,
+- 0x4a, 0x54, 0xee, 0xa9, 0x89, 0x2c, 0x46, 0xcd, 0xf9, 0xdb, 0xd4, 0x95,
+- 0xb8, 0xfe, 0xd0, 0x3f, 0x73, 0x0e, 0xa4, 0x6c, 0x35, 0x9e, 0xa0, 0xdd,
+- 0x16, 0x92, 0x13, 0xb6, 0x24, 0x7f, 0x6d, 0xcf, 0xa4, 0x2f, 0x7e, 0xf6,
+- 0x15, 0x60, 0x5d, 0xd6, 0x60, 0xbc, 0x2b, 0x46, 0x7c, 0xe8, 0x29, 0xbb,
+- 0x3c, 0xea, 0xc6, 0x9a, 0x6c, 0x03, 0x16, 0x0f, 0xd8, 0xf6, 0xb9, 0xb9,
+- 0x31, 0xf8, 0xa2, 0x3e, 0x62, 0x98, 0x0f, 0x8f, 0x26, 0x4b, 0xf8, 0x2d,
+- 0xc7, 0x4f, 0x42, 0xe3, 0xb3, 0x55, 0x63, 0xc3, 0x0c, 0x97, 0xd1, 0x9e,
+- 0x55, 0x24, 0xee, 0xfb, 0xf0, 0x08, 0xe3, 0xf3, 0xd2, 0x64, 0x00, 0xf1,
+- 0xac, 0x6d, 0xbf, 0xd9, 0xec, 0xc7, 0xc3, 0xac, 0xdf, 0x9a, 0xec, 0x41,
+- 0x37, 0xed, 0x22, 0x7e, 0xc8, 0xd0, 0x35, 0xc6, 0xfb, 0x75, 0x59, 0x2f,
+- 0x63, 0x58, 0x25, 0x6e, 0x63, 0x2c, 0x7a, 0x54, 0xce, 0xca, 0xd0, 0x07,
+- 0xdf, 0x31, 0xad, 0x1b, 0x5c, 0x30, 0xd0, 0x99, 0xf5, 0x63, 0x79, 0x32,
+- 0x78, 0x41, 0xde, 0xcd, 0xfb, 0xcc, 0xac, 0xc3, 0xc6, 0x6c, 0x00, 0xb7,
+- 0x27, 0x8f, 0x3e, 0x3a, 0x13, 0xd6, 0x7f, 0x9e, 0x81, 0x06, 0x7c, 0x3d,
+- 0x5b, 0xcd, 0xf6, 0x83, 0x1b, 0xde, 0x50, 0xaa, 0xf1, 0x8d, 0x43, 0x26,
+- 0xdb, 0x57, 0xb1, 0x8c, 0xed, 0x2c, 0x49, 0x5e, 0x8f, 0x47, 0x0e, 0x35,
+- 0xe3, 0xc1, 0x6c, 0x13, 0x16, 0x31, 0x3e, 0x75, 0x30, 0x37, 0xc4, 0xbd,
+- 0xc0, 0xed, 0x03, 0xa2, 0x7b, 0x28, 0x6f, 0x36, 0x8f, 0x33, 0x5f, 0x36,
+- 0x41, 0x43, 0x74, 0xf6, 0x92, 0x77, 0xd2, 0x56, 0x6f, 0xdf, 0xdf, 0x84,
+- 0xa5, 0x03, 0x2a, 0x6a, 0xc2, 0x85, 0x88, 0xb7, 0x29, 0x68, 0x19, 0x90,
+- 0x38, 0x2b, 0xdc, 0xc6, 0x64, 0x5c, 0x0d, 0xb1, 0x0f, 0x93, 0x71, 0x35,
+- 0x77, 0xbf, 0x3b, 0x25, 0x6b, 0x0b, 0x6f, 0x93, 0x2f, 0x85, 0xd1, 0xe2,
+- 0xc4, 0x68, 0x59, 0x13, 0xb7, 0xe0, 0x66, 0xec, 0x0e, 0xd3, 0xc6, 0x17,
+- 0x34, 0x4a, 0xac, 0xd6, 0x9d, 0xbd, 0xa9, 0xb1, 0x7e, 0xa3, 0xe3, 0x82,
+- 0x42, 0xfb, 0xda, 0x2f, 0x31, 0xd1, 0x8f, 0x8d, 0xc9, 0x28, 0xde, 0xe9,
+- 0x63, 0xbc, 0xb9, 0x31, 0xb6, 0xb4, 0x04, 0x86, 0xf9, 0x08, 0x42, 0xd6,
+- 0x49, 0xc6, 0xf6, 0xf3, 0xe9, 0x4a, 0x2c, 0xde, 0x23, 0x65, 0x1a, 0xf1,
+- 0xee, 0xb0, 0xec, 0x4d, 0x6e, 0xc2, 0x53, 0x7d, 0x2e, 0x0c, 0x99, 0x35,
+- 0x3d, 0x2a, 0xe3, 0xe7, 0xfc, 0xc6, 0xa0, 0xf6, 0x23, 0x72, 0xd5, 0x0b,
+- 0x4d, 0x8c, 0xca, 0xd7, 0x34, 0xa3, 0x85, 0x72, 0xb5, 0x18, 0xe2, 0x93,
+- 0x16, 0x1e, 0x6c, 0xde, 0x84, 0x93, 0x7d, 0x86, 0xf5, 0xb4, 0xac, 0x03,
+- 0x34, 0xf2, 0xf9, 0x74, 0x37, 0x36, 0x1b, 0xc2, 0x69, 0x75, 0xfa, 0x16,
+- 0x59, 0xa7, 0xd1, 0x8c, 0x77, 0x68, 0xaf, 0x3d, 0xe9, 0x05, 0x8c, 0xfd,
+- 0x12, 0xf3, 0xbd, 0x56, 0x80, 0xf5, 0xca, 0xbf, 0xa2, 0xe0, 0xf4, 0x01,
+- 0xe1, 0x58, 0x0b, 0x70, 0xff, 0x80, 0xec, 0x0b, 0xa8, 0x98, 0x7f, 0x68,
+- 0x35, 0xce, 0xed, 0xce, 0x71, 0xae, 0x37, 0xc3, 0xd6, 0xd7, 0xc9, 0xb9,
+- 0xda, 0x4b, 0xc9, 0xb9, 0xc8, 0xe5, 0xea, 0x36, 0x2a, 0x6e, 0x84, 0xb2,
+- 0x11, 0xf2, 0x0a, 0xe1, 0x17, 0x01, 0x3c, 0x93, 0x69, 0xc6, 0x6d, 0xc9,
+- 0x6a, 0x8c, 0x90, 0x6f, 0xa5, 0x89, 0x17, 0xe9, 0x0c, 0xe3, 0xca, 0x70,
+- 0x15, 0x3f, 0x3a, 0x3f, 0xb3, 0xf8, 0x31, 0x9c, 0x7b, 0x6b, 0x68, 0xcb,
+- 0xb1, 0x36, 0xc5, 0xd9, 0xdb, 0x18, 0xca, 0x48, 0xac, 0x56, 0x98, 0xb7,
+- 0xde, 0xa5, 0x49, 0x6e, 0x2a, 0xe7, 0x0e, 0x7e, 0xde, 0xa7, 0xe3, 0x5b,
+- 0x8d, 0x3b, 0x95, 0x58, 0xa5, 0xf3, 0x5e, 0x92, 0x55, 0x4c, 0xd9, 0x6e,
+- 0x9b, 0x2b, 0x6b, 0x94, 0x62, 0x97, 0x6c, 0x83, 0x39, 0xfa, 0xc3, 0x66,
+- 0x05, 0xf4, 0x0a, 0x5d, 0xce, 0x50, 0xd2, 0xdf, 0xfd, 0x78, 0x35, 0x11,
+- 0x47, 0x26, 0x51, 0xdf, 0xb3, 0x51, 0x71, 0xc9, 0xd9, 0xf3, 0xba, 0xb8,
+- 0x22, 0x3e, 0x16, 0x87, 0x27, 0xe9, 0xb5, 0xca, 0x59, 0xff, 0x9d, 0xb9,
+- 0x1d, 0x8c, 0x07, 0xf5, 0x9c, 0x62, 0xd5, 0x39, 0x7f, 0x9e, 0x46, 0x07,
+- 0xd6, 0x25, 0x0c, 0xc6, 0xc0, 0xd5, 0x76, 0x37, 0xe7, 0xe1, 0x58, 0xa2,
+- 0x03, 0xf7, 0x27, 0xea, 0xc7, 0x9f, 0xa4, 0x6d, 0xe1, 0xee, 0x0e, 0xb4,
+- 0xf0, 0xd9, 0x50, 0xaa, 0xe6, 0x42, 0x37, 0x75, 0x3d, 0x31, 0xad, 0xce,
+- 0x59, 0x97, 0x77, 0x1b, 0x3a, 0xcb, 0xeb, 0xc4, 0xb3, 0xfa, 0xd8, 0x80,
+- 0xfa, 0xef, 0x15, 0x4c, 0x97, 0x5c, 0x32, 0x82, 0xe3, 0x09, 0x1f, 0xbe,
+- 0x9e, 0xb4, 0xe8, 0x03, 0xc0, 0xfa, 0x6c, 0x33, 0xf3, 0x88, 0xa7, 0xec,
+- 0x0a, 0x87, 0xeb, 0xba, 0x69, 0x83, 0x0b, 0x70, 0x82, 0xb1, 0xb7, 0x66,
+- 0x9e, 0xa1, 0x2d, 0x52, 0xe4, 0x7d, 0xeb, 0x5f, 0xdb, 0xee, 0x68, 0x09,
+- 0x36, 0x0c, 0x85, 0x22, 0x2b, 0x19, 0x67, 0x9f, 0x6a, 0x36, 0xc6, 0x6d,
+- 0xc6, 0xc0, 0x19, 0xd1, 0x04, 0xe7, 0x3a, 0x24, 0xff, 0xaf, 0x03, 0x7f,
+- 0x41, 0x3b, 0xff, 0x24, 0x21, 0x7e, 0x62, 0x10, 0x37, 0xfd, 0xf8, 0x06,
+- 0xed, 0xfc, 0x7c, 0xa2, 0x0e, 0x59, 0xfa, 0x65, 0x07, 0xfd, 0xe3, 0xdd,
+- 0x44, 0x30, 0x7e, 0x93, 0xca, 0x7c, 0x8f, 0xfe, 0xf1, 0x51, 0x22, 0x42,
+- 0xdf, 0xf9, 0x2a, 0x3f, 0x0d, 0xf4, 0x87, 0x3a, 0xd6, 0xd1, 0xe9, 0x07,
+- 0x7e, 0x9c, 0x65, 0xf9, 0x03, 0xa9, 0x9a, 0xd6, 0x15, 0x4a, 0x8d, 0x59,
+- 0xa3, 0x54, 0x30, 0x9f, 0xd5, 0x68, 0xff, 0xb7, 0xe0, 0x43, 0x59, 0x4f,
+- 0x4e, 0x12, 0x8b, 0x92, 0xe8, 0x2f, 0x22, 0x97, 0x5b, 0xe9, 0x9c, 0xe5,
+- 0xaf, 0x3f, 0xf1, 0xa9, 0x12, 0x1c, 0x3f, 0xe3, 0x0a, 0x76, 0xcc, 0x20,
+- 0x8f, 0xfe, 0x0b, 0xfa, 0xc1, 0x37, 0x59, 0xf6, 0x93, 0xbe, 0x62, 0x7c,
+- 0x63, 0x88, 0x31, 0x37, 0x55, 0x80, 0x82, 0x3d, 0x5e, 0x3c, 0x78, 0x48,
+- 0xc7, 0x3e, 0x27, 0x57, 0x17, 0x9d, 0x52, 0x77, 0xc4, 0x88, 0x73, 0x73,
+- 0x81, 0x19, 0x07, 0x56, 0xe3, 0xd4, 0x6e, 0x9d, 0x71, 0x2f, 0x67, 0x27,
+- 0xcf, 0x86, 0x1d, 0x6e, 0x1e, 0x17, 0x6e, 0x5e, 0xc0, 0x71, 0x6d, 0x4d,
+- 0x85, 0xda, 0xb7, 0x51, 0x17, 0xb7, 0x67, 0xc5, 0xfe, 0x22, 0x78, 0x8e,
+- 0x63, 0xeb, 0xa7, 0xad, 0x1c, 0x48, 0x54, 0x33, 0x47, 0xf7, 0xc1, 0xa2,
+- 0xad, 0x58, 0xf2, 0x0e, 0x13, 0x6d, 0xc5, 0xa2, 0xad, 0x58, 0xb4, 0x15,
+- 0x8b, 0xb6, 0x62, 0x65, 0x16, 0xe0, 0x99, 0x3e, 0x03, 0x23, 0xec, 0x73,
+- 0xe7, 0x30, 0x39, 0xbc, 0xf3, 0x3e, 0x50, 0x9d, 0xe4, 0x29, 0xca, 0xc4,
+- 0xdd, 0xb7, 0x60, 0xa8, 0xef, 0x56, 0x7e, 0x14, 0xb4, 0xd2, 0x66, 0x7a,
+- 0xd2, 0x62, 0x83, 0x22, 0x93, 0x17, 0xc3, 0x99, 0x9b, 0x2b, 0x51, 0x2c,
+- 0xf1, 0x5d, 0xc1, 0x0e, 0xe7, 0x7e, 0xde, 0xd6, 0xe4, 0x9e, 0x85, 0x9a,
+- 0x79, 0x9b, 0xf0, 0x48, 0x9f, 0x8a, 0xdb, 0xc2, 0xf2, 0x7f, 0x08, 0x9a,
+- 0x99, 0x0f, 0xc8, 0xfe, 0x7c, 0x82, 0xfe, 0x99, 0xb3, 0x15, 0x19, 0x53,
+- 0xa6, 0x7f, 0x13, 0x4e, 0xf4, 0x1b, 0x8c, 0x59, 0x26, 0x32, 0xe9, 0x04,
+- 0x7d, 0x42, 0xfc, 0xdc, 0xc0, 0x33, 0x6c, 0x6b, 0xf6, 0x80, 0x0b, 0x95,
+- 0x8d, 0x6e, 0x94, 0xd0, 0xdf, 0x6f, 0x4b, 0xd7, 0x04, 0xbe, 0xa5, 0x24,
+- 0x9c, 0xf5, 0xd7, 0x5d, 0x29, 0x8c, 0xcf, 0x34, 0x2a, 0xb1, 0x6f, 0xb0,
+- 0x11, 0x8f, 0xed, 0x76, 0xd1, 0x46, 0xed, 0x05, 0xe5, 0x4d, 0x46, 0xc7,
+- 0x02, 0x97, 0xe0, 0x45, 0x23, 0xbe, 0xc1, 0x1c, 0x60, 0x7d, 0x7f, 0xd0,
+- 0x7c, 0x05, 0x41, 0xf3, 0x24, 0x16, 0xe0, 0x59, 0x93, 0xb8, 0x39, 0xaf,
+- 0x11, 0x1b, 0xf7, 0x1b, 0xb4, 0x29, 0x37, 0xf3, 0x63, 0xf9, 0xbf, 0x37,
+- 0xba, 0xb3, 0xc6, 0xf3, 0x32, 0xe4, 0x9c, 0x43, 0xb3, 0xfc, 0x4f, 0x06,
+- 0xa5, 0x87, 0xf8, 0x34, 0xa3, 0xd7, 0xe0, 0xb8, 0x5f, 0xb0, 0x4b, 0x0d,
+- 0xf9, 0x7f, 0x1c, 0xc4, 0x11, 0x8e, 0xfb, 0xc2, 0xcd, 0x6f, 0xdb, 0x95,
+- 0x86, 0xc4, 0x50, 0xe2, 0x49, 0x5a, 0xfa, 0x8f, 0xed, 0x08, 0x10, 0x3b,
+- 0x3a, 0xfa, 0x8d, 0x78, 0x29, 0x63, 0xd8, 0x46, 0x07, 0x63, 0x04, 0x5f,
+- 0x8c, 0xb6, 0x6f, 0x21, 0xa4, 0xad, 0x20, 0xee, 0x9c, 0xe6, 0x58, 0x7a,
+- 0x52, 0x82, 0x51, 0x3a, 0x8a, 0x7a, 0x63, 0xb8, 0x81, 0x39, 0x63, 0x41,
+- 0x6f, 0x0b, 0x6a, 0x99, 0x3f, 0xba, 0x7b, 0x5b, 0x61, 0x30, 0x97, 0x9c,
+- 0xd9, 0xbb, 0x1c, 0x0b, 0xc6, 0xf2, 0x1c, 0x5a, 0xc7, 0x11, 0x67, 0xdd,
+- 0xea, 0x29, 0x78, 0xee, 0xd3, 0x69, 0x53, 0x72, 0xe6, 0xc5, 0x6b, 0x55,
+- 0x12, 0x37, 0xcf, 0x50, 0xd7, 0xed, 0x03, 0xab, 0xed, 0x81, 0x94, 0xf0,
+- 0xa6, 0x2e, 0x78, 0x9a, 0x24, 0xf7, 0xd1, 0x31, 0x46, 0x8e, 0x3c, 0xcc,
+- 0x1c, 0xec, 0x8d, 0xfd, 0xab, 0x71, 0xff, 0x9e, 0xcb, 0x39, 0x9b, 0xd9,
+- 0x64, 0xfd, 0x7b, 0xda, 0xc5, 0x86, 0x12, 0xda, 0x85, 0x97, 0x76, 0xb1,
+- 0x2b, 0x15, 0x32, 0x0f, 0xd3, 0x2e, 0x6a, 0x89, 0x21, 0x1d, 0xbd, 0x92,
+- 0xef, 0x38, 0xef, 0xed, 0x55, 0x78, 0x10, 0xc0, 0x9b, 0xb4, 0x8f, 0x8d,
+- 0xbd, 0x76, 0x97, 0x9b, 0xb1, 0xa7, 0xa7, 0xb9, 0x1a, 0xaf, 0x65, 0x6e,
+- 0xc5, 0xa3, 0xfd, 0xd5, 0x78, 0x85, 0xb6, 0xf3, 0x76, 0x02, 0xf3, 0x2b,
+- 0xa0, 0xce, 0xac, 0x60, 0xac, 0xbe, 0x4d, 0x09, 0xb5, 0x2e, 0x42, 0xfd,
+- 0xf8, 0xcb, 0x4a, 0xb0, 0x93, 0x9c, 0xe5, 0xc4, 0x05, 0x62, 0xff, 0xeb,
+- 0x19, 0x39, 0x77, 0xe7, 0xc3, 0x38, 0xed, 0x6a, 0x9c, 0xf5, 0xbe, 0xd1,
+- 0x5f, 0xc7, 0x79, 0xf3, 0xa0, 0xd0, 0xf0, 0xe3, 0x14, 0xb1, 0xb4, 0x63,
+- 0x37, 0xc6, 0x03, 0x86, 0x71, 0xa2, 0x55, 0xa9, 0xc2, 0x9b, 0xc3, 0xb7,
+- 0x62, 0x63, 0x7f, 0x50, 0x8f, 0xd1, 0x37, 0x5f, 0xe3, 0xb3, 0xf5, 0xbb,
+- 0x67, 0xe1, 0x38, 0x6d, 0x6f, 0x9c, 0xb6, 0xb7, 0xb6, 0x5f, 0xc5, 0x8b,
+- 0xc3, 0xb7, 0xb0, 0x5f, 0x05, 0xb3, 0x6a, 0x15, 0x27, 0xff, 0xda, 0x91,
+- 0x72, 0xfe, 0x77, 0x81, 0xf3, 0x8e, 0xde, 0x9c, 0x51, 0x13, 0xb3, 0xf7,
+- 0xcb, 0xf8, 0xc8, 0xc3, 0x9c, 0xb5, 0xe9, 0x46, 0xdc, 0xbc, 0xa7, 0x12,
+- 0xe7, 0xf6, 0x1a, 0x56, 0xb9, 0xcb, 0x5e, 0x70, 0x2a, 0x1c, 0xe2, 0x3c,
+- 0x34, 0xa2, 0xe1, 0x50, 0x23, 0x42, 0x03, 0xb9, 0x18, 0xa1, 0x19, 0x0b,
+- 0xf0, 0x3d, 0xce, 0xfb, 0x5a, 0xe6, 0x80, 0x35, 0x43, 0x82, 0xbd, 0x36,
+- 0x73, 0xc5, 0x66, 0x4c, 0x8c, 0x8d, 0x73, 0x6c, 0x11, 0x9c, 0x25, 0xbf,
+- 0x7d, 0x9f, 0x31, 0xe3, 0x43, 0xe6, 0x80, 0x1f, 0x3a, 0x31, 0x43, 0xde,
+- 0xa5, 0xbd, 0x32, 0x6e, 0xec, 0xe2, 0x9c, 0x6e, 0xec, 0x37, 0xea, 0xfa,
+- 0xf8, 0x7b, 0xbd, 0x33, 0xc7, 0x31, 0xe2, 0xb9, 0x60, 0x85, 0xe0, 0x7f,
+- 0x0b, 0x73, 0xde, 0x56, 0x9c, 0xed, 0x0b, 0x99, 0x0b, 0x95, 0x56, 0xbc,
+- 0x47, 0x99, 0xfb, 0x28, 0x5f, 0x92, 0xbc, 0x6c, 0x66, 0xd2, 0x18, 0xff,
+- 0xd0, 0x25, 0x18, 0xd3, 0x8a, 0xf2, 0xec, 0xad, 0x38, 0xd5, 0xbf, 0x1c,
+- 0xa5, 0x43, 0xc2, 0x35, 0xa5, 0x4d, 0x37, 0xb6, 0xee, 0xbe, 0x13, 0xeb,
+- 0x0f, 0xe6, 0x72, 0xbe, 0xf5, 0x89, 0x4d, 0xcc, 0x75, 0x85, 0xbf, 0xd7,
+- 0xe1, 0x50, 0x2a, 0x26, 0x47, 0x42, 0x77, 0x30, 0x9f, 0x8b, 0xac, 0x20,
+- 0x7e, 0x2e, 0x0d, 0x13, 0x63, 0x2b, 0x82, 0x81, 0x97, 0x61, 0xe9, 0xbc,
+- 0x17, 0x58, 0x07, 0xd1, 0x89, 0x85, 0x65, 0x8c, 0x3b, 0xb7, 0xf5, 0xbb,
+- 0x29, 0xbb, 0x3c, 0xaf, 0xc3, 0x8f, 0x52, 0x56, 0x5c, 0x9e, 0x6f, 0x84,
+- 0xf8, 0x8a, 0xe8, 0xc9, 0x05, 0xb3, 0xa9, 0x26, 0xd6, 0x41, 0x8c, 0x2e,
+- 0x0d, 0x07, 0xcd, 0x6f, 0xa0, 0x99, 0x73, 0x2f, 0x32, 0x47, 0xb0, 0xfe,
+- 0x10, 0x9c, 0x7d, 0x7f, 0x79, 0x47, 0xe4, 0x3f, 0xf4, 0xed, 0x76, 0xec,
+- 0x69, 0x7d, 0xe3, 0x65, 0x1b, 0x3c, 0x90, 0xaa, 0xef, 0x74, 0xa1, 0xc6,
+- 0x2a, 0x87, 0x91, 0xee, 0x23, 0x2f, 0x8d, 0x23, 0xd8, 0x13, 0x87, 0xc4,
+- 0x8c, 0x7a, 0x4b, 0x43, 0x35, 0xdb, 0x8e, 0xe0, 0xad, 0x84, 0x4b, 0xb0,
+- 0x09, 0xf2, 0x4f, 0x8a, 0x22, 0xc4, 0xe1, 0x37, 0x12, 0xc5, 0xd0, 0x87,
+- 0x12, 0xce, 0xff, 0x11, 0xba, 0x39, 0x6b, 0x91, 0xaf, 0x2d, 0xc0, 0xab,
+- 0xfd, 0x3e, 0xcc, 0x27, 0x4f, 0xa9, 0x4b, 0x3e, 0x65, 0x97, 0x12, 0x87,
+- 0xeb, 0x87, 0x42, 0x9a, 0x47, 0xb1, 0xed, 0x03, 0x73, 0x7f, 0x6d, 0x4f,
+- 0x8b, 0x4a, 0x59, 0x23, 0xb2, 0x48, 0xfe, 0x9f, 0xd4, 0x3c, 0xa3, 0xf5,
+- 0x2c, 0x7c, 0xb8, 0x81, 0x58, 0x7a, 0xac, 0xb7, 0x12, 0x6f, 0xed, 0xee,
+- 0x91, 0x35, 0x4b, 0x18, 0xfc, 0xfd, 0x5a, 0x6f, 0x00, 0x3a, 0xb1, 0x4c,
+- 0xe7, 0x75, 0x03, 0x31, 0x5a, 0x27, 0x3e, 0xbf, 0xdd, 0x6b, 0x2f, 0xf0,
+- 0x35, 0x59, 0x6c, 0xbd, 0x0e, 0x0b, 0x88, 0xd1, 0x6f, 0xf4, 0x06, 0x4f,
+- 0x2c, 0x51, 0x15, 0x94, 0x34, 0x99, 0xec, 0xdb, 0x87, 0x17, 0x69, 0xdf,
+- 0x4f, 0xa4, 0x8e, 0x7e, 0x6d, 0x06, 0xac, 0xfa, 0x12, 0x04, 0x37, 0x78,
+- 0x14, 0x59, 0xe3, 0x90, 0xd8, 0x56, 0x8d, 0x1b, 0xc9, 0x4d, 0x74, 0xe2,
+- 0x77, 0x4d, 0x56, 0xe2, 0x1c, 0xb0, 0x66, 0x68, 0x35, 0x3e, 0x1c, 0x14,
+- 0x1f, 0xc5, 0x42, 0xb1, 0xff, 0x05, 0xe1, 0x90, 0x79, 0x86, 0xb8, 0x5c,
+- 0x3b, 0x96, 0x20, 0xfe, 0xca, 0xb9, 0x3c, 0x8c, 0xab, 0xc4, 0x81, 0xca,
+- 0x94, 0x60, 0x57, 0x00, 0x8d, 0xcc, 0xf7, 0xca, 0x53, 0xe2, 0x93, 0x96,
+- 0x9c, 0x1b, 0xc1, 0xcd, 0x63, 0x3e, 0xe8, 0x63, 0x1a, 0x3f, 0x7e, 0xe8,
+- 0x23, 0x55, 0xfc, 0x50, 0xd6, 0x91, 0x59, 0xfc, 0x50, 0x56, 0xc6, 0x31,
+- 0x73, 0x44, 0xc1, 0x4d, 0x8e, 0x6d, 0x89, 0x0f, 0x7a, 0xf1, 0xec, 0x28,
+- 0xb0, 0xa1, 0xdf, 0xc4, 0xe1, 0xfd, 0x39, 0x9c, 0xdb, 0xcc, 0x3e, 0x42,
+- 0x03, 0x61, 0xac, 0x4f, 0x8b, 0x7d, 0x36, 0xe2, 0xb7, 0x7b, 0x8d, 0xb6,
+- 0x35, 0x6a, 0x28, 0xb2, 0x9c, 0x18, 0xf6, 0xfe, 0x48, 0x23, 0x3e, 0x7c,
+- 0x62, 0x01, 0x8c, 0x70, 0x23, 0xce, 0x1c, 0xd8, 0x84, 0xf2, 0x27, 0x54,
+- 0xe2, 0x8f, 0x8a, 0xf1, 0xe9, 0x82, 0xed, 0x82, 0xa3, 0x5e, 0xab, 0x8c,
+- 0xb8, 0xb5, 0x8d, 0xb8, 0xf5, 0xb3, 0xb9, 0xe3, 0x98, 0x9f, 0x94, 0x73,
+- 0xad, 0xcc, 0xaf, 0xd4, 0x08, 0x9e, 0x24, 0x6e, 0xed, 0xea, 0x93, 0xf9,
+- 0xe2, 0xdc, 0x12, 0xb3, 0xb6, 0xa6, 0x73, 0x9c, 0xe8, 0x70, 0xbf, 0xa1,
+- 0xb9, 0x68, 0xcb, 0x43, 0x93, 0x78, 0xf5, 0x5b, 0xc6, 0xff, 0x47, 0xe6,
+- 0x45, 0x71, 0x36, 0x2d, 0x7e, 0x25, 0x71, 0x45, 0xc7, 0x87, 0xb4, 0xf1,
+- 0xa5, 0xd4, 0xf5, 0x19, 0xe6, 0x16, 0x2d, 0x8c, 0x73, 0x1f, 0xd3, 0x9e,
+- 0x97, 0x93, 0x3f, 0xbe, 0x97, 0x12, 0x1b, 0x59, 0x8e, 0x25, 0x59, 0xb1,
+- 0x05, 0x67, 0x9d, 0x95, 0xdf, 0x31, 0x9c, 0x4e, 0xfc, 0xb1, 0xb8, 0xb0,
+- 0x12, 0xaf, 0x0e, 0xca, 0x79, 0x17, 0x03, 0xde, 0xde, 0xa0, 0x56, 0xa2,
+- 0xc8, 0x9e, 0x6e, 0x9e, 0xfb, 0x4e, 0x38, 0x39, 0x76, 0x69, 0x34, 0xbf,
+- 0xbf, 0x98, 0xdf, 0x77, 0xb0, 0xf0, 0xfd, 0xb9, 0x01, 0xf2, 0x4f, 0x28,
+- 0x87, 0xe7, 0x16, 0xe0, 0xf6, 0x3d, 0x6d, 0x18, 0xd9, 0xfd, 0x31, 0x8a,
+- 0xfa, 0xd5, 0x7b, 0x7d, 0xa8, 0xa9, 0x7b, 0x48, 0xe9, 0xc2, 0xa2, 0xb0,
+- 0xbc, 0xe7, 0x23, 0x6b, 0xe6, 0x7d, 0xd8, 0x7c, 0x80, 0x79, 0xcc, 0xd8,
+- 0x75, 0x38, 0xaa, 0x31, 0x1e, 0x9a, 0x1f, 0xa3, 0xa0, 0xdf, 0xe3, 0x9c,
+- 0x05, 0x3c, 0x6a, 0x36, 0x61, 0xe5, 0xe4, 0x59, 0x40, 0x54, 0x5d, 0xbd,
+- 0x97, 0x00, 0x5f, 0xe9, 0xe4, 0xff, 0x1f, 0xc8, 0xbd, 0xdb, 0x63, 0xa0,
+- 0x77, 0xf4, 0x7f, 0x95, 0xe7, 0xce, 0x06, 0xfd, 0x6b, 0xca, 0x76, 0xa2,
+- 0x7d, 0xcf, 0xe3, 0x58, 0xb1, 0xe7, 0x3b, 0xb8, 0x73, 0xa0, 0xb6, 0x33,
+- 0xc2, 0x5c, 0xe7, 0x83, 0xf0, 0x38, 0x8e, 0x85, 0x8b, 0x60, 0xf9, 0xc9,
+- 0xb1, 0x6e, 0xfc, 0x8a, 0xbc, 0x4e, 0xca, 0xbf, 0xd3, 0xb6, 0x7e, 0xaf,
+- 0xb4, 0xf7, 0xf6, 0xa4, 0x7f, 0xfd, 0x7c, 0x9a, 0x9c, 0xa7, 0x79, 0x21,
+- 0xf5, 0x2b, 0x5b, 0x77, 0x9e, 0xe7, 0xef, 0xbf, 0x65, 0xc7, 0xfc, 0x72,
+- 0x7f, 0xd6, 0x64, 0xbd, 0xef, 0xe0, 0x01, 0xe6, 0xbf, 0xa7, 0x9b, 0xbe,
+- 0x83, 0x85, 0x43, 0x97, 0xea, 0xa0, 0x68, 0xf7, 0x3a, 0x07, 0xbb, 0xe9,
+- 0x61, 0xe4, 0x48, 0xb2, 0x57, 0x25, 0xfb, 0x27, 0x7f, 0x89, 0xcd, 0x7b,
+- 0x65, 0x6d, 0xd3, 0xb6, 0xd7, 0x1b, 0xb2, 0xc7, 0x97, 0x3f, 0x37, 0x27,
+- 0xed, 0x58, 0x8a, 0x95, 0x91, 0xba, 0x5b, 0x94, 0xbe, 0xcc, 0xd4, 0x31,
+- 0x4d, 0x93, 0xff, 0x97, 0xa7, 0x95, 0x44, 0xa7, 0x8e, 0xad, 0x47, 0xd9,
+- 0x9e, 0x39, 0xa2, 0xec, 0xca, 0x5c, 0xad, 0x8f, 0xe7, 0xec, 0x58, 0x9b,
+- 0xb4, 0x21, 0x32, 0xc1, 0x8f, 0x62, 0x91, 0x2b, 0xff, 0xec, 0x99, 0x49,
+- 0xb9, 0x0b, 0xa1, 0x57, 0xe6, 0xe4, 0xbe, 0x9f, 0x72, 0x9b, 0x4d, 0x31,
+- 0xa8, 0xf3, 0xa6, 0xca, 0x9e, 0x1f, 0xe7, 0x7f, 0xbb, 0xd4, 0x56, 0xae,
+- 0xdc, 0xcd, 0x7e, 0xb1, 0x21, 0x75, 0xde, 0xd4, 0x35, 0xfb, 0x02, 0xe2,
+- 0x47, 0x48, 0xdb, 0x8a, 0x5c, 0xbe, 0xb7, 0xe6, 0xca, 0x7c, 0x4f, 0xb0,
+- 0x0b, 0x23, 0x09, 0x0d, 0xef, 0x99, 0x92, 0xdf, 0xc9, 0xad, 0x28, 0xbe,
+- 0xc7, 0xfc, 0xf1, 0x99, 0x44, 0xb0, 0x75, 0x9d, 0x52, 0x1f, 0x9b, 0xc3,
+- 0x38, 0x87, 0x0a, 0x59, 0x4f, 0x8f, 0x38, 0xff, 0xaf, 0x2a, 0x13, 0x8a,
+- 0x20, 0x43, 0x7f, 0x78, 0x23, 0x11, 0xec, 0x38, 0xa3, 0xe4, 0xfe, 0x0f,
+- 0xd6, 0xeb, 0xce, 0xfb, 0x1c, 0x79, 0xbb, 0x13, 0xce, 0x39, 0x75, 0x3d,
+- 0x57, 0x6c, 0x30, 0xd8, 0x97, 0x46, 0xa5, 0xac, 0x9b, 0x58, 0x16, 0xf3,
+- 0xa1, 0xee, 0x94, 0x15, 0x50, 0xf1, 0x15, 0xc4, 0xfd, 0xb2, 0x47, 0x72,
+- 0xcb, 0xe4, 0xff, 0xa9, 0x11, 0x7e, 0xf4, 0x2f, 0xaf, 0x4f, 0xc9, 0xff,
+- 0x06, 0xca, 0xdb, 0x8b, 0x35, 0x76, 0x3d, 0xd2, 0x9a, 0xac, 0x7d, 0xc0,
+- 0x9a, 0x46, 0x5d, 0xfb, 0x8d, 0x4d, 0x1c, 0xb7, 0x07, 0xd3, 0x99, 0xdb,
+- 0x85, 0x6b, 0xeb, 0xdb, 0x1a, 0xd5, 0x6b, 0x10, 0xab, 0x08, 0x6a, 0x31,
+- 0x72, 0xcd, 0x1e, 0xe7, 0xff, 0xed, 0xc8, 0xb9, 0x14, 0xab, 0xd5, 0x4b,
+- 0x4c, 0x6f, 0x52, 0x14, 0x14, 0x84, 0xe0, 0x7e, 0x28, 0xe3, 0x86, 0x56,
+- 0xfb, 0x5b, 0xfb, 0x17, 0x7e, 0x03, 0xdb, 0xc6, 0x6e, 0xb9, 0xf4, 0xff,
+- 0x87, 0xfe, 0x63, 0xf6, 0xea, 0xec, 0x37, 0xdf, 0xe6, 0xc7, 0x76, 0x6c,
+- 0xba, 0xf4, 0x2d, 0xed, 0xfe, 0x31, 0x59, 0xf3, 0xef, 0x7a, 0xd4, 0xe8,
+- 0x2e, 0x94, 0x63, 0xab, 0xb9, 0xde, 0x2f, 0x67, 0xe5, 0xd6, 0x43, 0xf6,
+- 0xff, 0x65, 0x0e, 0xe4, 0x1d, 0xc3, 0x08, 0xf3, 0x6e, 0xd1, 0x4b, 0x14,
+- 0x0f, 0x66, 0xe4, 0x9d, 0xa0, 0x59, 0x90, 0xff, 0xfb, 0xf5, 0x60, 0x26,
+- 0xa7, 0xbf, 0x47, 0x33, 0x3e, 0xe6, 0x00, 0x3e, 0xda, 0x60, 0x07, 0xf9,
+- 0x0b, 0xf9, 0xd3, 0x25, 0x5d, 0xde, 0xeb, 0x97, 0x75, 0x85, 0xef, 0xd3,
+- 0xa7, 0xdd, 0xb5, 0x72, 0x6d, 0xc9, 0xb9, 0x51, 0x25, 0x77, 0x7d, 0xde,
+- 0x79, 0x37, 0x52, 0x8d, 0xae, 0xc3, 0xc2, 0xc4, 0x34, 0x39, 0x3f, 0x29,
+- 0x6b, 0x36, 0x96, 0x3f, 0x2a, 0xef, 0x61, 0xf8, 0x88, 0xb1, 0x5f, 0xf5,
+- 0x4f, 0xbe, 0x73, 0xd5, 0xba, 0x82, 0x38, 0x36, 0x27, 0x6c, 0xc4, 0x9a,
+- 0x94, 0xa0, 0xbe, 0x52, 0x69, 0x63, 0xbd, 0x3a, 0xf4, 0x64, 0xa5, 0x0d,
+- 0xc5, 0xf9, 0xdf, 0x92, 0x1e, 0xb6, 0x71, 0x30, 0x51, 0xaf, 0x7b, 0xd4,
+- 0x4f, 0x6d, 0xcb, 0x39, 0x03, 0x29, 0xfb, 0xf6, 0x71, 0xbc, 0x94, 0x98,
+- 0x4e, 0x94, 0xba, 0xba, 0xdd, 0x4b, 0xeb, 0xe7, 0x7f, 0xa3, 0x21, 0xc6,
+- 0xb6, 0x82, 0x9d, 0x61, 0x57, 0x70, 0xc3, 0x05, 0xe2, 0x4a, 0x36, 0x6c,
+- 0xc4, 0x7f, 0xc0, 0x3e, 0xfe, 0x56, 0xa9, 0x43, 0x62, 0x4a, 0xfb, 0xb9,
+- 0xb6, 0xea, 0xdb, 0x0b, 0xd4, 0xf3, 0xce, 0xbb, 0xf8, 0xd2, 0xbe, 0x16,
+- 0x5d, 0x0d, 0x2d, 0x69, 0xd9, 0x7e, 0xb6, 0x39, 0x33, 0x1a, 0xdc, 0x57,
+- 0x41, 0x30, 0xfa, 0xb6, 0xda, 0x85, 0x35, 0x72, 0x3c, 0x24, 0x1a, 0xd4,
+- 0x1f, 0xa0, 0x7d, 0x34, 0x3a, 0x6d, 0xc4, 0xea, 0x0a, 0x20, 0x9c, 0xf2,
+- 0x4b, 0xed, 0x84, 0x39, 0x81, 0x70, 0x31, 0x96, 0x73, 0xce, 0x03, 0xc8,
+- 0xb9, 0x49, 0xe6, 0x0d, 0x09, 0xf9, 0xbf, 0x7d, 0x4e, 0x37, 0x93, 0x7b,
+- 0x5a, 0xcc, 0xd7, 0x19, 0xaf, 0xd7, 0xcb, 0xff, 0x48, 0x2a, 0xf6, 0xe1,
+- 0xc1, 0x84, 0xac, 0x81, 0xfc, 0x1f, 0x05, 0x3f, 0x96, 0xb4, 0x1c, 0x54,
+- 0x00, 0x00, 0x00 };
++ 0xad, 0xbc, 0x0b, 0x74, 0x1c, 0xd5, 0x95, 0x2e, 0xfc, 0x55, 0x75, 0xb7,
++ 0xd4, 0x92, 0xda, 0x52, 0x4b, 0x6e, 0xcb, 0x6d, 0xd0, 0xe0, 0x6a, 0xab,
++ 0xda, 0x6a, 0x2c, 0x01, 0xd5, 0xb2, 0x0c, 0x4d, 0xa6, 0xc0, 0x1d, 0x5b,
++ 0x80, 0x0c, 0x26, 0x11, 0xc6, 0xb9, 0x23, 0xe6, 0x7a, 0xfe, 0xf4, 0x18,
++ 0x03, 0x86, 0x90, 0x5c, 0x33, 0x93, 0x9b, 0x71, 0xb8, 0x9e, 0xeb, 0x8a,
++ 0xe4, 0x87, 0xc0, 0xa5, 0xee, 0x96, 0x90, 0x1f, 0xac, 0x35, 0xeb, 0xa7,
++ 0x2d, 0xcb, 0x92, 0x21, 0xad, 0x16, 0x49, 0x98, 0x19, 0xe7, 0xe6, 0x81,
++ 0xc6, 0xd8, 0x60, 0x93, 0xf0, 0xc8, 0x6b, 0xfd, 0x4c, 0xfe, 0xb9, 0x7f,
++ 0x3c, 0xb6, 0x79, 0x83, 0xe3, 0x3c, 0x47, 0x9e, 0xc1, 0xa9, 0xff, 0xdb,
++ 0xd5, 0xdd, 0xb6, 0xec, 0x40, 0x1e, 0xeb, 0x8e, 0xd6, 0xaa, 0xa5, 0xee,
++ 0xaa, 0x73, 0xf6, 0x39, 0x67, 0x9f, 0xbd, 0xbf, 0xfd, 0xed, 0x73, 0x4e,
++ 0xb5, 0x06, 0x54, 0xa3, 0xf4, 0x37, 0x8b, 0xd7, 0xd5, 0x1d, 0x1b, 0xee,
++ 0x5e, 0xdc, 0x7e, 0x75, 0x87, 0x7c, 0xf7, 0xce, 0xf5, 0x7a, 0xf1, 0x61,
++ 0x7f, 0x26, 0x12, 0x97, 0xde, 0xd2, 0x3e, 0xb4, 0xe0, 0x47, 0xfc, 0x25,
++ 0x10, 0x91, 0x7f, 0xad, 0xa5, 0xaf, 0x1e, 0x20, 0x58, 0x6e, 0x5f, 0x2e,
++ 0xf8, 0x55, 0xb3, 0xf3, 0xbf, 0x2e, 0xd3, 0xe1, 0xf7, 0x98, 0x9f, 0xff,
++ 0x8b, 0xbb, 0x75, 0x20, 0x99, 0x6f, 0xd5, 0x96, 0xe3, 0x9c, 0x63, 0x85,
++ 0xbc, 0x90, 0xfb, 0x7f, 0x62, 0x7e, 0xf0, 0xc4, 0xb7, 0xae, 0x8b, 0x9c,
++ 0xc9, 0x79, 0xe0, 0x0f, 0x9a, 0x16, 0x82, 0x0b, 0xe1, 0x6f, 0x62, 0x9d,
++ 0xbf, 0x6b, 0xd9, 0xa6, 0xa2, 0xb6, 0x2c, 0x2b, 0x12, 0xce, 0x21, 0x12,
++ 0xb4, 0x10, 0x89, 0x59, 0x40, 0xca, 0x6b, 0x22, 0x55, 0x69, 0xfa, 0x51,
++ 0xa1, 0x57, 0x20, 0x15, 0xdc, 0xa8, 0x6d, 0xe1, 0x18, 0x97, 0xd9, 0x7e,
++ 0xed, 0x44, 0x1e, 0xb8, 0xdb, 0xf6, 0xe3, 0xb8, 0x27, 0xa0, 0x9d, 0xcc,
++ 0xef, 0xab, 0x2b, 0xea, 0x23, 0x09, 0x8f, 0x8e, 0x94, 0x6a, 0xca, 0x7d,
++ 0x68, 0xcb, 0xf3, 0x48, 0xf9, 0xcc, 0xcf, 0x6b, 0xe3, 0x36, 0xd0, 0x9b,
++ 0x69, 0x36, 0x4e, 0xa0, 0x35, 0x7c, 0x18, 0x95, 0x48, 0x85, 0x22, 0x31,
++ 0xe0, 0x83, 0x73, 0x8f, 0x66, 0x14, 0xf8, 0xf4, 0xd9, 0xe8, 0xdc, 0x0b,
++ 0x3c, 0x92, 0x89, 0x24, 0x75, 0x05, 0xe8, 0x9f, 0x94, 0xba, 0x91, 0x60,
++ 0x8e, 0xcf, 0xb7, 0x64, 0x80, 0xad, 0x99, 0xd9, 0xd8, 0x96, 0x75, 0xf0,
++ 0x9c, 0xd1, 0x1c, 0xdc, 0xc7, 0x16, 0x7a, 0xdd, 0xe7, 0xb3, 0x61, 0xe5,
++ 0xe4, 0xf9, 0x5b, 0xce, 0xb7, 0x5a, 0x82, 0x78, 0x7a, 0x32, 0x84, 0x67,
++ 0x27, 0xeb, 0xf1, 0x48, 0xb6, 0x1e, 0xdb, 0xb3, 0x31, 0xa8, 0xba, 0x83,
++ 0x58, 0x3c, 0x86, 0x8a, 0xeb, 0x1d, 0x9c, 0x34, 0xda, 0xb0, 0x95, 0x82,
++ 0x5f, 0x6d, 0x6b, 0xc4, 0xda, 0x60, 0x13, 0xb6, 0xe8, 0xd7, 0xa1, 0x38,
++ 0xd6, 0x0f, 0xce, 0x65, 0x32, 0xd2, 0x3f, 0xaf, 0xaa, 0xea, 0x37, 0xe2,
++ 0xf4, 0x4e, 0x13, 0xef, 0xef, 0xc4, 0x9a, 0x5a, 0x38, 0x4e, 0x3e, 0x1e,
++ 0xed, 0x7e, 0x50, 0x09, 0x6a, 0x4f, 0xe5, 0xd9, 0xa1, 0x55, 0x5e, 0xca,
++ 0x83, 0x36, 0x92, 0x9f, 0x39, 0x15, 0x6c, 0x2f, 0xc3, 0x76, 0x33, 0xd2,
++ 0x97, 0x30, 0xbe, 0xd5, 0xf2, 0xdf, 0x68, 0x0f, 0xc5, 0x31, 0x6d, 0xcd,
++ 0xbc, 0xc6, 0x3e, 0x69, 0xec, 0x4f, 0x13, 0xbe, 0x36, 0x19, 0xc6, 0x57,
++ 0xd9, 0xb7, 0xaf, 0x4c, 0x4a, 0x1f, 0x23, 0x7b, 0x2c, 0xd4, 0x63, 0x34,
++ 0xdb, 0x84, 0xa7, 0xf5, 0x36, 0x7c, 0x85, 0x7d, 0xec, 0x33, 0x62, 0x58,
++ 0x9b, 0xb8, 0x8b, 0xfd, 0x51, 0xb0, 0xaa, 0xed, 0x2f, 0x4b, 0xfd, 0x8a,
++ 0x68, 0x50, 0x55, 0x24, 0x1b, 0x22, 0x31, 0x4d, 0x15, 0x99, 0x17, 0xfa,
++ 0x3b, 0x90, 0x81, 0xe5, 0x37, 0xa5, 0xcf, 0x37, 0x22, 0xcf, 0xfe, 0x7e,
++ 0x79, 0x67, 0xd4, 0x58, 0xaf, 0x62, 0x65, 0x80, 0x7d, 0x7e, 0x20, 0x1e,
++ 0x4d, 0x2c, 0x62, 0x9f, 0xc7, 0xf3, 0x2a, 0xc7, 0x13, 0xd2, 0xc6, 0xd8,
++ 0xf7, 0xe4, 0x2a, 0x95, 0x7d, 0x67, 0x5f, 0x32, 0xec, 0x4b, 0x86, 0x7d,
++ 0xc9, 0xb0, 0x2f, 0x6e, 0xbf, 0x63, 0xec, 0x73, 0x71, 0x8e, 0x46, 0xf2,
++ 0xc7, 0xd9, 0xdf, 0x99, 0xfd, 0x6c, 0x62, 0xdf, 0x91, 0xaa, 0xe7, 0xbc,
++ 0x35, 0xa7, 0x65, 0xde, 0x1c, 0xe7, 0x55, 0xc3, 0x71, 0x7e, 0x6e, 0x04,
++ 0xa8, 0xbf, 0x0c, 0xed, 0xa0, 0xdc, 0x9f, 0xf9, 0x56, 0x85, 0x89, 0x4e,
++ 0x9a, 0xa0, 0x73, 0xa4, 0x23, 0x9a, 0x68, 0x50, 0x54, 0x78, 0xf5, 0xa0,
++ 0xd6, 0x52, 0x88, 0x18, 0xd4, 0x8f, 0x16, 0x2d, 0x40, 0xd3, 0x0b, 0x94,
++ 0x75, 0x51, 0xbb, 0x91, 0xe0, 0x14, 0xa4, 0x5d, 0x8d, 0xed, 0x1f, 0x2f,
++ 0xcd, 0x9d, 0xc8, 0x0f, 0xb3, 0x4d, 0x69, 0x5f, 0x64, 0x3b, 0xce, 0xcf,
++ 0x0c, 0xe8, 0x41, 0x44, 0xad, 0x41, 0xda, 0x9f, 0xc7, 0x0c, 0x6a, 0x1b,
++ 0xf2, 0x7c, 0x7e, 0x5e, 0x46, 0x71, 0x3e, 0xd6, 0xe6, 0xb5, 0xd2, 0x18,
++ 0x22, 0xec, 0x82, 0xd8, 0x41, 0x38, 0x15, 0x30, 0x83, 0xd2, 0xf7, 0xee,
++ 0x3d, 0x03, 0x9b, 0x9d, 0x79, 0xba, 0xe8, 0x4a, 0xdf, 0x38, 0xcf, 0x13,
++ 0x48, 0x9c, 0x5e, 0xf2, 0x90, 0x35, 0xab, 0x23, 0x8e, 0x6a, 0x1d, 0x81,
++ 0x2a, 0x1d, 0xdd, 0xe9, 0x89, 0x6a, 0xab, 0xc6, 0xfc, 0xe6, 0x9d, 0x03,
++ 0x13, 0x7e, 0x54, 0x4f, 0xe8, 0xa8, 0x9a, 0x78, 0xdc, 0x8b, 0x5a, 0x03,
++ 0x3b, 0x26, 0xff, 0xcc, 0x5b, 0x1c, 0xdb, 0xcd, 0xa5, 0x31, 0xba, 0xb6,
++ 0xef, 0x7f, 0xdd, 0x3e, 0xe3, 0x54, 0xe8, 0x55, 0x7f, 0xe6, 0x31, 0x75,
++ 0x6d, 0x0c, 0x38, 0xb3, 0xb6, 0x63, 0x39, 0x7a, 0x83, 0x0a, 0xe6, 0xeb,
++ 0x7f, 0x32, 0x0b, 0xb5, 0x26, 0xac, 0xc9, 0xc6, 0x54, 0x85, 0x19, 0x4a,
++ 0x71, 0x6e, 0xf0, 0x82, 0x9d, 0x83, 0x6f, 0xc0, 0x71, 0xa4, 0xec, 0x49,
++ 0xdc, 0x79, 0xa7, 0x6a, 0x1e, 0xba, 0xc6, 0x87, 0x4e, 0x96, 0xc7, 0xa6,
++ 0xa3, 0x1d, 0x3f, 0x57, 0xd4, 0x9d, 0xdd, 0xb0, 0xc6, 0x3d, 0x48, 0x06,
++ 0x53, 0xfc, 0x7f, 0xc5, 0x15, 0x2b, 0x13, 0xdd, 0xb0, 0xc7, 0xa7, 0x79,
++ 0xdf, 0xcb, 0x7b, 0x26, 0xd2, 0x99, 0x2b, 0xae, 0xb8, 0x3d, 0x91, 0xc2,
++ 0xc0, 0xb8, 0x7c, 0xf6, 0x62, 0xaa, 0x3e, 0x85, 0xed, 0xbb, 0x35, 0xd4,
++ 0xe9, 0xdd, 0xc8, 0x8c, 0xcb, 0x67, 0xc7, 0x39, 0x65, 0x7c, 0x09, 0x7b,
++ 0xda, 0xe8, 0xff, 0x73, 0xbb, 0xb1, 0x6d, 0xb7, 0x85, 0x4a, 0xdd, 0xa2,
++ 0xee, 0x15, 0xef, 0x3f, 0xb7, 0x29, 0xd0, 0xee, 0x84, 0xb7, 0x42, 0x17,
++ 0xbd, 0x25, 0xbc, 0xf7, 0xd8, 0x66, 0x70, 0xbe, 0xee, 0x38, 0x23, 0xc6,
++ 0x22, 0x7c, 0xba, 0x7b, 0x2d, 0xac, 0x7d, 0x01, 0x58, 0xab, 0xe5, 0x7f,
++ 0x37, 0x75, 0xb8, 0x16, 0xbd, 0xfb, 0xd6, 0xa2, 0xff, 0x31, 0x3a, 0x6e,
++ 0x7d, 0xd0, 0x9d, 0xa7, 0x6f, 0xb5, 0x48, 0x9f, 0xa4, 0x7f, 0x3d, 0xbc,
++ 0x44, 0xb7, 0x5f, 0xe0, 0x7f, 0x29, 0x33, 0xed, 0x60, 0xce, 0x85, 0x32,
++ 0xdb, 0x59, 0x66, 0xdb, 0x45, 0x65, 0x4c, 0x3c, 0x31, 0x29, 0xba, 0x10,
++ 0x95, 0xfd, 0x3e, 0x5d, 0x7c, 0xdb, 0xe9, 0x0d, 0x89, 0x2e, 0xac, 0x1e,
++ 0x1f, 0x22, 0xdd, 0xf7, 0x2a, 0x5e, 0xac, 0x18, 0x00, 0xeb, 0xd0, 0x09,
++ 0xaa, 0x23, 0xc9, 0x85, 0x8a, 0x89, 0xea, 0x01, 0x05, 0x2b, 0xe2, 0x55,
++ 0xd0, 0xea, 0x45, 0xde, 0x8f, 0x1c, 0x2b, 0x28, 0xfd, 0x3d, 0x8a, 0x1a,
++ 0xde, 0x5f, 0x17, 0xff, 0x01, 0xf1, 0x4c, 0xfa, 0x14, 0x67, 0xf9, 0x3b,
++ 0x78, 0xff, 0x95, 0x19, 0xdf, 0xa5, 0x9c, 0xe3, 0xf4, 0x19, 0x06, 0xfa,
++ 0x33, 0x6d, 0xd8, 0x9e, 0x49, 0x46, 0xa8, 0x25, 0xcb, 0x67, 0xf2, 0xbe,
++ 0x19, 0xed, 0xea, 0x85, 0xb4, 0x03, 0xa5, 0xda, 0x84, 0x37, 0xdf, 0x71,
++ 0xdc, 0xff, 0x92, 0xad, 0xf7, 0x3c, 0xa5, 0xf8, 0x68, 0xec, 0xd2, 0xce,
++ 0x71, 0xff, 0x2b, 0xb6, 0x82, 0x37, 0xf5, 0xe8, 0x86, 0x77, 0x94, 0xe3,
++ 0xfe, 0x97, 0xf3, 0x41, 0xcc, 0x1b, 0x88, 0xf4, 0x58, 0x4a, 0x02, 0x5f,
++ 0xcf, 0x87, 0x10, 0x1e, 0x30, 0x71, 0x30, 0x6f, 0xe0, 0xc9, 0x8b, 0x70,
++ 0xe0, 0x43, 0xff, 0x2c, 0x0f, 0xc7, 0xbe, 0xce, 0xd6, 0xd0, 0x6b, 0x9c,
++ 0x73, 0x92, 0x41, 0xa4, 0xea, 0xcc, 0xe3, 0xfe, 0xf7, 0x07, 0xa0, 0xd4,
++ 0x9a, 0x7a, 0xb8, 0xa0, 0xfc, 0xab, 0x93, 0x0a, 0x49, 0x31, 0xf6, 0xcf,
++ 0xc5, 0xb2, 0x24, 0xed, 0xce, 0x20, 0xce, 0x9d, 0x71, 0x6a, 0x68, 0xb3,
++ 0x15, 0xe6, 0x65, 0x18, 0x1f, 0xd6, 0xf1, 0xa4, 0xed, 0x38, 0xef, 0x19,
++ 0x53, 0x89, 0x00, 0xf4, 0xee, 0x77, 0x11, 0x49, 0x2e, 0xa2, 0x5e, 0x8e,
++ 0xe6, 0x75, 0x8c, 0xda, 0x26, 0x9e, 0xb3, 0x9b, 0x83, 0x7d, 0x58, 0x8c,
++ 0x64, 0xb8, 0x18, 0x43, 0x26, 0xd8, 0xef, 0x91, 0x68, 0x37, 0xea, 0xcc,
++ 0x04, 0x0e, 0xb1, 0xdf, 0xa7, 0x97, 0x88, 0x1c, 0x03, 0x2f, 0xff, 0x01,
++ 0x7d, 0x25, 0xbe, 0xe3, 0x71, 0xf6, 0x35, 0xb1, 0xf8, 0x9c, 0x83, 0xd9,
++ 0x7e, 0x9c, 0x30, 0xe6, 0xd2, 0x0e, 0x61, 0x55, 0x99, 0x7e, 0x6f, 0xbf,
++ 0x1d, 0xc4, 0x81, 0x7c, 0xc0, 0xdb, 0x67, 0x87, 0xb0, 0x8f, 0xfe, 0x36,
++ 0x8f, 0xa6, 0x1e, 0xa6, 0xdc, 0x79, 0xc4, 0xb5, 0xc2, 0x70, 0x13, 0x26,
++ 0x87, 0x23, 0xc6, 0x2b, 0x4a, 0x18, 0x63, 0xa3, 0x97, 0x61, 0x62, 0x58,
++ 0xc1, 0x78, 0x94, 0x7d, 0xe7, 0xe7, 0x2f, 0x0f, 0x5f, 0x81, 0xfc, 0xb0,
++ 0x07, 0x3b, 0x5c, 0xbd, 0xba, 0x38, 0x53, 0xfa, 0x7f, 0x19, 0x72, 0xa3,
++ 0xf0, 0x2e, 0x1a, 0x08, 0xe2, 0xa9, 0xbc, 0xd7, 0xab, 0x0f, 0x84, 0x30,
++ 0x9a, 0xff, 0x36, 0xe7, 0x4d, 0x64, 0x6b, 0x18, 0xb1, 0xc7, 0xdc, 0x39,
++ 0xac, 0x33, 0x29, 0xac, 0x18, 0x5f, 0x19, 0xcb, 0x34, 0xc6, 0x99, 0x04,
++ 0x71, 0x48, 0x7c, 0xdc, 0x4f, 0x0c, 0x12, 0x1f, 0x7f, 0x4d, 0x41, 0x6d,
++ 0x02, 0x7d, 0x93, 0xe5, 0xe7, 0x0a, 0xed, 0xdf, 0x8b, 0x75, 0x41, 0x03,
++ 0x76, 0x46, 0xec, 0xb4, 0x8c, 0xcb, 0xf2, 0x59, 0xe6, 0xbf, 0x1a, 0xd6,
++ 0xfe, 0x6a, 0xec, 0xa0, 0x8f, 0x3d, 0xba, 0x53, 0xee, 0x3b, 0xce, 0x7d,
++ 0xf1, 0x3a, 0xda, 0x18, 0x6e, 0xaa, 0x42, 0xd4, 0x78, 0xcb, 0xed, 0x9b,
++ 0x85, 0xb1, 0xbc, 0xc4, 0x50, 0x8d, 0xf1, 0xed, 0x28, 0xdb, 0xea, 0x60,
++ 0x3b, 0x06, 0xbe, 0x3d, 0xd9, 0x86, 0x7f, 0x9c, 0x8c, 0xe1, 0x1f, 0x26,
++ 0x75, 0xfc, 0xfd, 0xa4, 0x86, 0x67, 0x2e, 0xc2, 0xf5, 0x3b, 0xa9, 0x2b,
++ 0xc1, 0x30, 0x03, 0x5b, 0x32, 0x15, 0xd8, 0x36, 0x5c, 0x8d, 0xbe, 0xe1,
++ 0xe6, 0xd8, 0x73, 0xc4, 0xe3, 0x7f, 0x30, 0x6e, 0xc7, 0x54, 0x43, 0x87,
++ 0xeb, 0x33, 0x8f, 0xf0, 0xfe, 0xa3, 0xc3, 0xcd, 0x9c, 0x43, 0xc7, 0x51,
++ 0xe3, 0xad, 0x89, 0x43, 0xc4, 0xf7, 0xe3, 0xa1, 0x88, 0x36, 0xa5, 0x46,
++ 0xb4, 0x24, 0x7c, 0xb0, 0xdb, 0x54, 0x58, 0x73, 0x22, 0x39, 0x7a, 0x31,
++ 0x42, 0xfa, 0x7d, 0x1c, 0x5b, 0x44, 0xb3, 0x54, 0x83, 0xf6, 0xcb, 0x98,
++ 0xa1, 0x76, 0x10, 0x5f, 0xaa, 0xf1, 0xfe, 0x70, 0xa4, 0xdf, 0x52, 0xef,
++ 0x80, 0xd5, 0xe0, 0x38, 0x5f, 0x8d, 0x63, 0xc3, 0x5c, 0x13, 0xc9, 0x39,
++ 0x8c, 0x05, 0x57, 0x98, 0x49, 0x30, 0x8e, 0xe1, 0xf4, 0x80, 0x1e, 0xfe,
++ 0x7f, 0x94, 0x3b, 0xf1, 0xdf, 0xbb, 0x23, 0x9a, 0xa6, 0xb6, 0x5a, 0xfb,
++ 0x54, 0x92, 0x8d, 0x46, 0x68, 0x61, 0xf3, 0x56, 0x6c, 0x74, 0x79, 0x82,
++ 0x82, 0xa0, 0xde, 0x81, 0xbe, 0x0c, 0x2b, 0x85, 0x9a, 0x7b, 0x06, 0xd5,
++ 0xe6, 0x69, 0x43, 0x8d, 0x1c, 0xed, 0x56, 0x89, 0xb7, 0x8b, 0x4f, 0x3b,
++ 0x5a, 0xa3, 0xe3, 0xb4, 0x2f, 0x96, 0x36, 0x35, 0x34, 0x70, 0x9e, 0xeb,
++ 0x39, 0xcf, 0xed, 0x85, 0x6a, 0xbc, 0x33, 0x0c, 0x6b, 0xae, 0x19, 0xe9,
++ 0x7a, 0x40, 0xad, 0xc6, 0xdb, 0xa3, 0xd5, 0x38, 0x39, 0xec, 0xc5, 0x5b,
++ 0xc3, 0x8e, 0x73, 0x8f, 0x51, 0x87, 0x8a, 0x38, 0xe6, 0x54, 0x20, 0x7a,
++ 0x66, 0x04, 0x16, 0x7e, 0xc3, 0xb2, 0xbf, 0x1c, 0x0e, 0xe3, 0x57, 0xc3,
++ 0x1f, 0xc3, 0x33, 0x0d, 0xc9, 0x63, 0xb3, 0x19, 0x23, 0xa7, 0x69, 0x3f,
++ 0xa7, 0xed, 0x48, 0xcf, 0x3c, 0x4f, 0x64, 0x23, 0x79, 0xcb, 0xfa, 0x2f,
++ 0x2a, 0x91, 0xd4, 0x2b, 0x4a, 0x44, 0x1b, 0x50, 0x42, 0x78, 0x97, 0x76,
++ 0x7a, 0x2a, 0xdf, 0x9c, 0xf8, 0x01, 0xdb, 0xff, 0xb5, 0xf1, 0x0f, 0xce,
++ 0x54, 0xa3, 0xe8, 0x50, 0xf4, 0x45, 0x9d, 0xd3, 0x77, 0xff, 0x91, 0x31,
++ 0xea, 0x1f, 0x32, 0xd4, 0x39, 0xfb, 0xf3, 0xcc, 0x6f, 0xc5, 0x2f, 0x99,
++ 0xaf, 0x04, 0xe7, 0xf1, 0x72, 0xfc, 0x4f, 0x77, 0x6c, 0xc7, 0x9c, 0xbf,
++ 0x09, 0xc9, 0xf8, 0x3a, 0x1b, 0x8b, 0x18, 0x24, 0xe3, 0x3c, 0xea, 0xa4,
++ 0x82, 0x32, 0x46, 0x19, 0xab, 0xab, 0x4b, 0x6d, 0x83, 0xf2, 0x90, 0x8a,
++ 0x6a, 0xc7, 0x79, 0xcc, 0x28, 0x3d, 0x0f, 0x95, 0xc7, 0xfa, 0x31, 0xde,
++ 0x97, 0xf1, 0xbe, 0xe3, 0x11, 0xdd, 0x6b, 0xea, 0xd5, 0xfc, 0x1e, 0xb1,
++ 0x92, 0xb8, 0x33, 0xc0, 0xef, 0xb1, 0xe4, 0xf9, 0xef, 0xde, 0xba, 0x8b,
++ 0x9f, 0xd3, 0x4e, 0xdd, 0xf6, 0xee, 0xe4, 0x77, 0x19, 0xcb, 0xab, 0xb4,
++ 0x9b, 0x0f, 0xb3, 0x13, 0xb1, 0x91, 0x18, 0xed, 0xe9, 0x94, 0xc4, 0x15,
++ 0x2b, 0x64, 0xfa, 0x2d, 0xd5, 0x84, 0x46, 0x9c, 0xf0, 0x2b, 0xe6, 0x06,
++ 0x68, 0x79, 0x0b, 0x9f, 0xea, 0xf0, 0xe0, 0xaf, 0x3a, 0x14, 0xcc, 0xd6,
++ 0x37, 0x20, 0x7b, 0xad, 0xe5, 0xd4, 0xeb, 0x7b, 0x55, 0xf1, 0x81, 0x8a,
++ 0x34, 0x2c, 0xfa, 0x1d, 0x12, 0xe4, 0x4a, 0x75, 0x7f, 0xaa, 0xe0, 0x44,
++ 0x3c, 0x4a, 0x9b, 0xdb, 0x82, 0x6d, 0x9c, 0xf3, 0x59, 0x69, 0xf8, 0x03,
++ 0xa6, 0x09, 0x7b, 0x00, 0xfe, 0x2a, 0xfa, 0xfe, 0x95, 0x03, 0xcd, 0x1b,
++ 0xc6, 0x94, 0x48, 0x22, 0xad, 0x44, 0xba, 0xa9, 0x6f, 0xe3, 0xb4, 0x8b,
++ 0x1b, 0x11, 0xad, 0x42, 0x91, 0x76, 0x4c, 0xb4, 0xe4, 0xb7, 0x60, 0x60,
++ 0x52, 0x3e, 0x27, 0xa0, 0xe7, 0x7f, 0x5c, 0xea, 0x3b, 0xfc, 0x3e, 0xf6,
++ 0x61, 0xbf, 0xfd, 0xba, 0x93, 0x0b, 0x46, 0xb4, 0x9c, 0xfb, 0x7d, 0x3d,
++ 0xbf, 0xc3, 0x5f, 0x61, 0x3e, 0x88, 0xe7, 0xed, 0x37, 0xe7, 0x94, 0xcb,
++ 0x15, 0xfb, 0x7a, 0x69, 0x7f, 0xfe, 0xb7, 0x93, 0x0c, 0xb9, 0xfd, 0xf1,
++ 0xd7, 0xb0, 0x8d, 0xcf, 0x0c, 0xb0, 0x8d, 0x4c, 0xb9, 0x3f, 0x40, 0x20,
++ 0x2d, 0x71, 0x38, 0xa2, 0x2d, 0x50, 0x9a, 0x8d, 0x01, 0x25, 0x12, 0xbb,
++ 0x57, 0x69, 0x4d, 0x8c, 0x91, 0x5f, 0x6e, 0x47, 0xb1, 0x4f, 0xd1, 0x7c,
++ 0xb1, 0x3f, 0x0b, 0xf2, 0x50, 0x3c, 0x03, 0x08, 0xcc, 0xd7, 0x17, 0x62,
++ 0xb3, 0x3b, 0xa7, 0x50, 0xc2, 0x03, 0x1a, 0x6a, 0xc9, 0x5f, 0xc2, 0x13,
++ 0xc0, 0xe4, 0x10, 0xb9, 0x5c, 0xbc, 0x19, 0x9f, 0x63, 0x2c, 0x98, 0xc7,
++ 0x32, 0x5f, 0x0c, 0x9e, 0xc7, 0x2f, 0xa5, 0xdf, 0x26, 0xc0, 0xcc, 0x29,
++ 0xf2, 0xb2, 0xd4, 0x7f, 0x41, 0x52, 0xee, 0x3d, 0x6e, 0x43, 0xc9, 0xd8,
++ 0x91, 0x3d, 0x80, 0x3e, 0x15, 0xf7, 0x24, 0xef, 0x0f, 0x63, 0x33, 0x4e,
++ 0xc7, 0xa3, 0xa9, 0x82, 0x12, 0x35, 0x86, 0x14, 0xc3, 0xbf, 0x8d, 0xed,
++ 0xed, 0x60, 0x99, 0xed, 0xbc, 0x1e, 0x88, 0xea, 0x5d, 0x77, 0x28, 0xc9,
++ 0x2b, 0xab, 0x58, 0xe6, 0xa4, 0x11, 0x25, 0xcf, 0x8c, 0x4e, 0xaf, 0x82,
++ 0xe1, 0x7f, 0x22, 0x2f, 0xb2, 0x12, 0xca, 0x96, 0xc2, 0xe3, 0x6a, 0x11,
++ 0x8f, 0x7e, 0x5d, 0xd2, 0xd9, 0x49, 0xf9, 0xee, 0xb6, 0xed, 0x1d, 0x68,
++ 0xaa, 0xf9, 0xed, 0x7b, 0xda, 0x9c, 0x8b, 0xef, 0xb5, 0x06, 0x47, 0xe9,
++ 0x7f, 0x1e, 0xbd, 0x8a, 0x73, 0x27, 0xfc, 0x28, 0x19, 0xf3, 0x41, 0xee,
++ 0x79, 0x90, 0xf3, 0x26, 0xc3, 0x1e, 0x7c, 0xe0, 0x24, 0x57, 0xcb, 0xbd,
++ 0x6a, 0xa4, 0xba, 0x5b, 0xc3, 0x5e, 0xb4, 0x26, 0xb6, 0x12, 0x0b, 0x8e,
++ 0xaf, 0x5e, 0xc6, 0x67, 0x51, 0xe3, 0x39, 0x34, 0x6b, 0x5b, 0x21, 0x9f,
++ 0xcf, 0xd2, 0x66, 0x97, 0x49, 0x5d, 0x96, 0x29, 0x72, 0x1f, 0xc1, 0x9a,
++ 0x2d, 0x86, 0x83, 0xe7, 0x0d, 0x58, 0x95, 0xe6, 0x41, 0xe5, 0x84, 0xfd,
++ 0x1b, 0x27, 0xe9, 0xc5, 0x4a, 0xfa, 0xa5, 0x41, 0xda, 0xab, 0xf9, 0xcd,
++ 0xa8, 0x76, 0x94, 0x99, 0x82, 0xc7, 0xb4, 0x94, 0xe3, 0xf9, 0x2d, 0xca,
++ 0xeb, 0xf9, 0x7e, 0xe5, 0x54, 0x5e, 0xea, 0x1e, 0x54, 0x4e, 0xe6, 0x25,
++ 0x1e, 0x36, 0x69, 0x47, 0xc8, 0x6f, 0xc8, 0xa9, 0xd4, 0x3e, 0x03, 0xca,
++ 0x36, 0xa3, 0x96, 0x3c, 0x5f, 0x8f, 0x8d, 0xb0, 0xbf, 0xfb, 0x3b, 0x60,
++ 0x6c, 0x37, 0x7c, 0x38, 0x1e, 0x44, 0xa0, 0xcf, 0xf0, 0xca, 0x77, 0xe6,
++ 0x03, 0x52, 0xb7, 0x49, 0xdb, 0x9a, 0x3f, 0x47, 0xff, 0x2a, 0x7e, 0xdf,
++ 0xdf, 0x51, 0xbe, 0xf7, 0x0b, 0x67, 0x6a, 0xb5, 0xca, 0xef, 0x7f, 0xea,
++ 0xe1, 0x50, 0x58, 0x77, 0x26, 0x3f, 0x17, 0x2e, 0xa5, 0x92, 0x3f, 0xd6,
++ 0xc3, 0x0a, 0x46, 0xac, 0x1c, 0x73, 0x85, 0xbe, 0x4c, 0x3b, 0xfd, 0x2d,
++ 0xcc, 0x58, 0x99, 0x24, 0xbe, 0x93, 0xf7, 0xb2, 0xcd, 0x0a, 0x3d, 0x80,
++ 0x9b, 0xec, 0x66, 0x4f, 0x51, 0x7f, 0x2a, 0x31, 0xcc, 0xc3, 0x98, 0x2e,
++ 0x1c, 0xef, 0x52, 0xce, 0xdd, 0xa4, 0xbd, 0xc5, 0x7e, 0x57, 0xe9, 0x7a,
++ 0xac, 0x4a, 0x69, 0xd2, 0x5e, 0xcf, 0x27, 0xe9, 0xe3, 0x3d, 0x6c, 0x37,
++ 0x80, 0xd7, 0xed, 0x5a, 0xe6, 0x20, 0x91, 0xa4, 0x45, 0x81, 0x37, 0x77,
++ 0x84, 0x41, 0xce, 0x37, 0xe3, 0xaf, 0x1b, 0x8c, 0xff, 0x12, 0xa3, 0xd5,
++ 0x5b, 0x96, 0x24, 0xb0, 0x3e, 0x0f, 0xef, 0xba, 0x0e, 0x13, 0xf7, 0x30,
++ 0xb6, 0xdf, 0xc7, 0x78, 0xf9, 0x20, 0x63, 0xe1, 0x8e, 0x38, 0xc7, 0x56,
++ 0xef, 0x38, 0x95, 0xfa, 0x66, 0xc9, 0x67, 0x30, 0xc0, 0x58, 0x7c, 0x37,
++ 0xe3, 0xcb, 0x16, 0x7e, 0x7e, 0x29, 0xff, 0x1f, 0xce, 0x7d, 0xcc, 0xa7,
++ 0x9e, 0xbf, 0x48, 0x26, 0xd4, 0x51, 0xbd, 0x35, 0xb6, 0x95, 0xb1, 0x98,
++ 0x72, 0xad, 0x5a, 0xd3, 0x71, 0xae, 0x8c, 0x46, 0x92, 0x3e, 0xc5, 0xc0,
++ 0x73, 0x13, 0xc7, 0x1d, 0x6d, 0x8e, 0xe4, 0x52, 0xe5, 0x38, 0x28, 0x63,
++ 0x95, 0x1c, 0x41, 0xf0, 0x41, 0xf2, 0x84, 0x99, 0x18, 0xa1, 0xe2, 0xe6,
++ 0x61, 0xc9, 0x13, 0xc2, 0x58, 0x65, 0x7f, 0x09, 0xcf, 0xb5, 0x79, 0xd1,
++ 0xc5, 0x1c, 0xeb, 0x16, 0x3b, 0x80, 0x3b, 0x88, 0xa5, 0x2b, 0x6c, 0xe6,
++ 0x4e, 0xc1, 0x10, 0x6e, 0xb5, 0xbd, 0x38, 0xdc, 0xc6, 0x1c, 0x28, 0x54,
++ 0x89, 0x77, 0x0d, 0x0f, 0x8e, 0x18, 0x41, 0xe4, 0x5c, 0x7f, 0xd8, 0x41,
++ 0x0c, 0xa4, 0x1e, 0x55, 0xc9, 0x1d, 0x44, 0x87, 0x1e, 0xea, 0x53, 0x45,
++ 0xea, 0xbc, 0x0e, 0x3f, 0x2c, 0x17, 0x90, 0x7e, 0x49, 0x3e, 0xf0, 0x33,
++ 0x27, 0x35, 0x47, 0xea, 0xc3, 0x0a, 0x98, 0x32, 0x0e, 0xe1, 0xb7, 0x06,
++ 0xfa, 0x26, 0x3a, 0xc8, 0xed, 0x66, 0x0e, 0xf5, 0x0c, 0xb9, 0x75, 0x1d,
++ 0x5e, 0xd3, 0x85, 0x5b, 0xbf, 0x8a, 0x20, 0x7d, 0xb7, 0x7f, 0x22, 0xba,
++ 0xe1, 0x8c, 0xe2, 0xc1, 0x4b, 0x7a, 0x2d, 0x79, 0x9f, 0x89, 0xed, 0x13,
++ 0xf0, 0x6e, 0x5d, 0x62, 0x20, 0x3d, 0xd1, 0x9b, 0x98, 0xc5, 0xb4, 0xd7,
++ 0xbb, 0xa4, 0xc8, 0x89, 0x3e, 0x43, 0xdd, 0xae, 0x8d, 0xbb, 0x9c, 0xa8,
++ 0xc8, 0x07, 0x82, 0x8e, 0x73, 0x52, 0x17, 0x3d, 0x03, 0x07, 0x4a, 0x3a,
++ 0xde, 0xcf, 0xcf, 0xfd, 0x25, 0x1d, 0x6f, 0xa1, 0x3c, 0xfa, 0x1f, 0xb6,
++ 0x5d, 0xc4, 0x63, 0x34, 0x54, 0x9a, 0xc2, 0x6f, 0x88, 0xc3, 0xc4, 0x93,
++ 0x24, 0x75, 0xfc, 0x42, 0x7e, 0xbd, 0xe0, 0x36, 0xa7, 0xbb, 0xdd, 0xc5,
++ 0xef, 0xa4, 0x7a, 0x80, 0x76, 0x20, 0x7a, 0x78, 0xad, 0x94, 0xdb, 0x38,
++ 0xce, 0x90, 0x21, 0x3a, 0x2e, 0xe7, 0x65, 0xa2, 0xeb, 0x36, 0xc9, 0xb1,
++ 0xfa, 0x81, 0xdf, 0xb0, 0xac, 0x87, 0xb8, 0x6b, 0xe2, 0x6b, 0xdd, 0x62,
++ 0x3b, 0xb3, 0xdc, 0x58, 0x79, 0xd5, 0x42, 0xc7, 0xf9, 0x4a, 0x5c, 0xc3,
++ 0x7b, 0x7a, 0x6b, 0xa2, 0x5d, 0x8d, 0xb0, 0xaf, 0x49, 0xd8, 0x93, 0x1d,
++ 0x9c, 0xbb, 0x2b, 0x90, 0x0c, 0x89, 0xad, 0x61, 0x43, 0x45, 0x11, 0xc3,
++ 0x71, 0xca, 0xd6, 0x63, 0xdb, 0x38, 0x67, 0xfb, 0x42, 0x5d, 0xe4, 0x71,
++ 0x6a, 0x27, 0xd3, 0x7f, 0xf2, 0x27, 0xdd, 0x7a, 0x04, 0xef, 0x38, 0xb9,
++ 0x90, 0xc3, 0x38, 0x29, 0xb9, 0xd1, 0x7c, 0x1c, 0x0e, 0x7a, 0xf0, 0x62,
++ 0xac, 0x11, 0xc9, 0x7a, 0x05, 0x35, 0xfa, 0x9b, 0xce, 0x77, 0x42, 0xd2,
++ 0x0e, 0x73, 0x3c, 0xf5, 0x56, 0x8f, 0xe4, 0x80, 0x5e, 0x5d, 0xe4, 0x76,
++ 0x31, 0xc7, 0xbd, 0xb4, 0xfd, 0x7f, 0x75, 0x8e, 0x87, 0xa4, 0xfd, 0x48,
++ 0x50, 0x53, 0x7f, 0xd7, 0x1c, 0x7e, 0xdf, 0xf9, 0x81, 0x2b, 0x33, 0xe3,
++ 0xea, 0x01, 0xaa, 0xc8, 0x23, 0x54, 0x54, 0x8b, 0xcc, 0x72, 0x3b, 0xe2,
++ 0x67, 0x73, 0x79, 0x4f, 0x9e, 0x89, 0x8d, 0x6c, 0x61, 0xbb, 0xcf, 0x39,
++ 0x68, 0x94, 0xef, 0xd3, 0x1e, 0x29, 0x6b, 0x4d, 0x1e, 0x5a, 0xe1, 0xc5,
++ 0x52, 0xb4, 0xc4, 0x97, 0x2d, 0x97, 0xb1, 0xa8, 0x66, 0x52, 0xf3, 0xc3,
++ 0x6a, 0xf4, 0x10, 0x8b, 0xdf, 0x68, 0x6b, 0xc3, 0x72, 0xe6, 0x8c, 0xef,
++ 0x10, 0x5c, 0x7a, 0x75, 0x0f, 0xa6, 0x38, 0xbe, 0x27, 0x0d, 0x59, 0x2f,
++ 0x70, 0x70, 0x4b, 0xdc, 0x4a, 0xd1, 0x63, 0xad, 0x59, 0xb4, 0x9d, 0x6a,
++ 0x5d, 0xe2, 0x7c, 0x2d, 0x6a, 0x4c, 0x6f, 0xec, 0x1d, 0x44, 0x8c, 0x1d,
++ 0xe4, 0x39, 0x5a, 0x7d, 0x4b, 0xc2, 0x47, 0xed, 0xbe, 0x6c, 0x47, 0x13,
++ 0x47, 0x94, 0xa2, 0x3f, 0xbc, 0xc0, 0xb9, 0x7d, 0xcd, 0xd6, 0x37, 0x56,
++ 0x7a, 0x8a, 0xdf, 0x5f, 0x71, 0xf3, 0xd1, 0xb2, 0x3f, 0x84, 0x4b, 0xb8,
++ 0xe1, 0xf7, 0x9f, 0xb2, 0x71, 0x86, 0x54, 0x88, 0x79, 0x29, 0xce, 0xf4,
++ 0x19, 0x53, 0x8a, 0x4f, 0xaf, 0x25, 0xae, 0x0a, 0x96, 0x56, 0x90, 0x13,
++ 0x4a, 0xec, 0xf7, 0xfb, 0xdf, 0x61, 0x19, 0x72, 0xba, 0xe3, 0xb1, 0xeb,
++ 0x5b, 0x13, 0x7e, 0x24, 0xad, 0x4a, 0xfa, 0xe5, 0x2c, 0x33, 0xe4, 0xbf,
++ 0xaa, 0x60, 0x35, 0x06, 0x68, 0xd7, 0x35, 0xcc, 0x57, 0x5b, 0xd2, 0x13,
++ 0x8c, 0xe1, 0x6d, 0x78, 0x70, 0x82, 0x23, 0x6b, 0x18, 0x6c, 0x54, 0x4d,
++ 0x59, 0x83, 0x08, 0xc2, 0xd7, 0xf0, 0xe0, 0x0d, 0xaa, 0x79, 0x1c, 0x3d,
++ 0x1d, 0xfe, 0xce, 0x44, 0x01, 0xfe, 0x7a, 0x73, 0x13, 0xe2, 0x69, 0xc9,
++ 0x3b, 0x05, 0x23, 0x93, 0x5b, 0x89, 0x5a, 0x8d, 0x75, 0xd7, 0x96, 0xf5,
++ 0x0d, 0xb5, 0xd6, 0x94, 0xfc, 0x53, 0xeb, 0x7c, 0xc5, 0xc5, 0xd2, 0x20,
++ 0xf3, 0x85, 0x1f, 0x87, 0xff, 0xcf, 0xea, 0x27, 0x38, 0x27, 0xd2, 0x17,
++ 0xf9, 0x2f, 0x79, 0x3f, 0xbc, 0x2a, 0xb1, 0xb0, 0x77, 0xdc, 0xcb, 0xfc,
++ 0x4a, 0xe6, 0x4c, 0xe2, 0xf1, 0x6b, 0xff, 0xf5, 0x79, 0xfa, 0x8b, 0x8f,
++ 0xba, 0x7f, 0x44, 0xb7, 0x08, 0xf3, 0x8e, 0xa3, 0xc7, 0x23, 0xe1, 0x0a,
++ 0x45, 0xc3, 0xf6, 0xb6, 0x7f, 0xa7, 0x8d, 0x80, 0x38, 0x06, 0x12, 0xeb,
++ 0x5a, 0x6c, 0x19, 0xaf, 0x98, 0x51, 0xaf, 0x67, 0x4d, 0xb9, 0xde, 0x80,
++ 0x6e, 0xa5, 0xa4, 0xde, 0x68, 0x3c, 0xd2, 0xb3, 0x8d, 0xf5, 0x1e, 0x65,
++ 0xbd, 0x24, 0x63, 0xe7, 0x3d, 0x13, 0x41, 0x37, 0x9f, 0xb3, 0xc6, 0xab,
++ 0x67, 0xb6, 0x77, 0xbe, 0xde, 0xe3, 0xba, 0x35, 0xe5, 0xb6, 0xb7, 0x38,
++ 0xb2, 0xb1, 0xc2, 0xe3, 0x45, 0x9a, 0xf5, 0xa6, 0x58, 0xef, 0xf5, 0x09,
++ 0x59, 0x8f, 0xc0, 0x0d, 0xe3, 0x76, 0xe6, 0xb8, 0x47, 0xd7, 0x83, 0x27,
++ 0x91, 0x24, 0xe6, 0xba, 0x73, 0x79, 0xc3, 0x58, 0x7e, 0x33, 0xb6, 0xeb,
++ 0x87, 0xe2, 0x95, 0xac, 0x77, 0x44, 0x3f, 0x14, 0xf6, 0xd1, 0xaf, 0xd6,
++ 0x51, 0x5e, 0x2f, 0xf3, 0x1a, 0x95, 0xfe, 0xb2, 0x65, 0x5c, 0x62, 0xbf,
++ 0x41, 0x5e, 0x12, 0xa2, 0xcd, 0xc9, 0x98, 0xa5, 0x5d, 0x99, 0x53, 0x19,
++ 0x5f, 0x24, 0x36, 0xee, 0x8e, 0x4f, 0x99, 0x7b, 0x40, 0x72, 0xdd, 0x7a,
++ 0x0b, 0x7d, 0x6d, 0x12, 0xff, 0x14, 0x62, 0x6f, 0x03, 0xf3, 0x4f, 0x69,
++ 0x23, 0x84, 0x6d, 0xf4, 0xed, 0xfd, 0x86, 0xe3, 0x3c, 0x6f, 0xcc, 0xc7,
++ 0x01, 0x23, 0x92, 0x12, 0x3b, 0x7c, 0xd3, 0x58, 0x76, 0xa5, 0xe4, 0x96,
++ 0xc0, 0x9f, 0x60, 0x8a, 0xb6, 0x51, 0xa5, 0x8b, 0xbf, 0x29, 0x08, 0x47,
++ 0xbd, 0x5a, 0x8d, 0xe2, 0xc0, 0xbf, 0x78, 0xe1, 0xc6, 0x85, 0x1c, 0x7b,
++ 0xed, 0xf5, 0x0a, 0xde, 0xbf, 0x4a, 0xc1, 0xa1, 0xab, 0xa2, 0xe1, 0x11,
++ 0x65, 0x16, 0xb1, 0x35, 0xda, 0xdd, 0xa9, 0x58, 0x47, 0x59, 0x37, 0xd9,
++ 0xe6, 0x89, 0x84, 0xa1, 0xd4, 0xd1, 0xef, 0x5b, 0x34, 0x09, 0xfd, 0xde,
++ 0x81, 0x68, 0xf8, 0x51, 0xfe, 0xf7, 0x4c, 0x28, 0x98, 0xd0, 0x23, 0x49,
++ 0xb8, 0xf2, 0xd9, 0x36, 0xd3, 0xce, 0xab, 0xa3, 0x8e, 0x73, 0x2c, 0xde,
++ 0x1a, 0x3c, 0x86, 0x37, 0x89, 0x6d, 0xd2, 0x4e, 0x19, 0xeb, 0xc1, 0x5c,
++ 0x56, 0x4f, 0x76, 0x2a, 0x8e, 0x57, 0xf8, 0xc3, 0xfa, 0xbc, 0xc4, 0xc3,
++ 0x72, 0x7f, 0xcb, 0x71, 0xd1, 0x71, 0xde, 0x34, 0x8a, 0xb2, 0x82, 0x1d,
++ 0x91, 0x14, 0x30, 0x1f, 0x93, 0x7a, 0xa4, 0x6b, 0x8a, 0x3a, 0x08, 0xd3,
++ 0xdf, 0xe6, 0xe9, 0x8d, 0x38, 0xee, 0x8b, 0x04, 0x8f, 0x2b, 0xcb, 0xcf,
++ 0xaa, 0x58, 0xb4, 0xfe, 0x09, 0xa5, 0x75, 0x43, 0x15, 0xf4, 0x64, 0x41,
++ 0x99, 0x2b, 0x3a, 0x09, 0x07, 0xc8, 0xa5, 0xd6, 0xc1, 0x8d, 0xd1, 0xb8,
++ 0xcd, 0xf6, 0x26, 0xa7, 0xd1, 0x4c, 0xdb, 0xd7, 0x7b, 0xee, 0x23, 0x0f,
++ 0x04, 0x3e, 0xce, 0x24, 0x41, 0xfa, 0xda, 0x88, 0xd4, 0xa7, 0x1c, 0xe7,
++ 0x7e, 0xf6, 0x75, 0x07, 0xfb, 0xfa, 0x60, 0xfc, 0x3d, 0xe7, 0x5f, 0x5d,
++ 0x99, 0x37, 0x62, 0x44, 0xbf, 0x54, 0xee, 0xbb, 0xcc, 0xf5, 0x45, 0xae,
++ 0x0f, 0x37, 0xcf, 0x61, 0xbe, 0xd2, 0x21, 0xb8, 0x71, 0xd2, 0x4b, 0xdc,
++ 0xa0, 0x3c, 0xc6, 0x10, 0xf5, 0xd2, 0x38, 0xec, 0x01, 0xe3, 0x5b, 0x38,
++ 0xa5, 0xa8, 0x24, 0x42, 0x41, 0xf8, 0x75, 0x07, 0x0f, 0x90, 0x33, 0x24,
++ 0xe7, 0xd4, 0xe1, 0x73, 0x86, 0x1f, 0xb3, 0xa2, 0xea, 0x65, 0x1e, 0xce,
++ 0xc9, 0x81, 0xb8, 0x7c, 0xf7, 0x61, 0x6a, 0x8e, 0x07, 0x9b, 0xc9, 0x25,
++ 0x82, 0x51, 0x75, 0x9e, 0xdc, 0xf7, 0xb7, 0xcb, 0x77, 0xf6, 0x7f, 0xae,
++ 0x82, 0xfb, 0x69, 0x15, 0x6a, 0xb4, 0x37, 0x2c, 0xf7, 0xbb, 0x0c, 0xf9,
++ 0xae, 0xa0, 0x39, 0xee, 0xe5, 0xbc, 0x38, 0xf0, 0x48, 0x7a, 0x1f, 0xe5,
++ 0xfd, 0xb8, 0x7c, 0x4e, 0xde, 0xcf, 0x71, 0x27, 0xf7, 0x29, 0x82, 0x33,
++ 0x3f, 0x72, 0x5e, 0x64, 0x1c, 0x09, 0xf2, 0xf9, 0xe7, 0xd8, 0xf6, 0xd1,
++ 0xf8, 0xf3, 0xce, 0x3c, 0xe2, 0xeb, 0xb1, 0x84, 0x86, 0xf9, 0x57, 0x35,
++ 0xe1, 0xf8, 0x9d, 0x32, 0x66, 0x05, 0xb3, 0xf4, 0x2f, 0xf8, 0x24, 0xcf,
++ 0xac, 0xd5, 0xe7, 0xe2, 0xe6, 0x3b, 0x8a, 0xf7, 0xaa, 0xa2, 0xb2, 0x4e,
++ 0xa8, 0xa1, 0xea, 0xaa, 0x06, 0x68, 0xa5, 0x7b, 0xcb, 0xa3, 0xde, 0xee,
++ 0x59, 0x8a, 0x1e, 0xbc, 0x4d, 0x91, 0xe7, 0xbf, 0x24, 0xb7, 0x75, 0x9c,
++ 0x07, 0x38, 0x5f, 0x2d, 0xf1, 0x00, 0x4e, 0xb3, 0x9d, 0x5e, 0xea, 0x6f,
++ 0xe5, 0xf9, 0xf9, 0x2a, 0xd7, 0xff, 0xb9, 0xa3, 0x7d, 0x4a, 0xea, 0x8a,
++ 0x8c, 0x85, 0x5d, 0x37, 0x2b, 0x1c, 0x50, 0xb5, 0xe8, 0xd9, 0xd5, 0x19,
++ 0xcb, 0xf6, 0xba, 0xdf, 0x83, 0x1d, 0xaf, 0x9d, 0x5f, 0xf3, 0x3a, 0xe3,
++ 0xc6, 0xa3, 0x65, 0xd7, 0x07, 0x71, 0xdc, 0xa9, 0x6f, 0xb7, 0x82, 0x95,
++ 0x90, 0xb8, 0xd4, 0x1c, 0xfb, 0x0a, 0xe5, 0xfe, 0xc0, 0x28, 0xc6, 0xac,
++ 0xfd, 0x46, 0x24, 0x6b, 0xd1, 0x1f, 0x52, 0xcc, 0x13, 0x3b, 0x25, 0x76,
++ 0x4f, 0xd6, 0xfa, 0x50, 0x3b, 0x1f, 0x95, 0xed, 0x91, 0xfe, 0x05, 0xcc,
++ 0x9b, 0x3c, 0x1d, 0x12, 0xeb, 0x64, 0x7e, 0xdc, 0x32, 0x6c, 0xab, 0x0a,
++ 0xcb, 0xd9, 0xc7, 0x78, 0xfb, 0xef, 0x8b, 0x13, 0x22, 0x47, 0xac, 0x33,
++ 0xd2, 0x9f, 0xc4, 0xef, 0x2b, 0x0b, 0x46, 0x65, 0x59, 0x4f, 0xf2, 0xdf,
++ 0x90, 0xca, 0xab, 0xe4, 0x19, 0x15, 0xc1, 0xde, 0x8e, 0x46, 0x5e, 0xf2,
++ 0xdc, 0x7b, 0xc3, 0xda, 0xfc, 0xf9, 0x75, 0x3c, 0x64, 0x8d, 0x0a, 0xa8,
++ 0x57, 0x0b, 0x66, 0x13, 0x7d, 0x83, 0x32, 0x3e, 0x8b, 0x56, 0x2e, 0x39,
++ 0x7a, 0xe7, 0x5d, 0x77, 0xd3, 0x9f, 0x9f, 0x63, 0x8b, 0xa3, 0xe4, 0x33,
++ 0x96, 0xeb, 0x19, 0xe2, 0xeb, 0x33, 0xd7, 0xf5, 0x24, 0x86, 0x94, 0xd7,
++ 0x06, 0x1b, 0x30, 0xb8, 0xfb, 0x0e, 0x68, 0x8d, 0x45, 0x1c, 0x52, 0xcd,
++ 0xc5, 0x58, 0x96, 0x7d, 0xdb, 0x57, 0xe4, 0xe0, 0xb5, 0x18, 0xd8, 0x1d,
++ 0x47, 0x6e, 0x8e, 0x3c, 0x93, 0x7b, 0x7e, 0x08, 0x4e, 0x6e, 0xdf, 0x7d,
++ 0x99, 0xe4, 0xd4, 0x61, 0x91, 0x9b, 0xa2, 0xef, 0xa8, 0xfa, 0xdb, 0x8e,
++ 0x15, 0x14, 0xf9, 0x87, 0xae, 0xf4, 0x52, 0x87, 0x37, 0xa1, 0xb5, 0x67,
++ 0x0c, 0xa7, 0xc8, 0xeb, 0xdc, 0x35, 0x54, 0xad, 0xd2, 0x9c, 0xba, 0xdf,
++ 0x87, 0x68, 0x6a, 0x9c, 0x38, 0x10, 0x98, 0xf0, 0x93, 0x9f, 0xcc, 0x77,
++ 0xd7, 0x8e, 0x96, 0x91, 0x7f, 0xa4, 0xc8, 0x6d, 0x3f, 0xee, 0xf5, 0xe2,
++ 0x6e, 0x62, 0xc6, 0x7e, 0xbd, 0x75, 0xc3, 0x18, 0x7e, 0x45, 0xac, 0x93,
++ 0xf2, 0x3f, 0x60, 0x7b, 0x22, 0xd3, 0xcb, 0xf6, 0xe0, 0xf7, 0x12, 0x8f,
++ 0xc9, 0x09, 0xbd, 0x3e, 0x3d, 0xed, 0x93, 0xf8, 0x2d, 0xdc, 0x75, 0xc7,
++ 0x6e, 0x05, 0x9d, 0x94, 0xf3, 0x28, 0x6d, 0xe6, 0xfe, 0x28, 0xbc, 0x5d,
++ 0x57, 0x91, 0xa3, 0x90, 0xf3, 0x61, 0x4e, 0x00, 0x8f, 0x8c, 0x23, 0x91,
++ 0xd7, 0xa7, 0xe6, 0x05, 0xf0, 0x26, 0xe5, 0x08, 0xae, 0x57, 0x94, 0xe4,
++ 0xf4, 0xac, 0xb9, 0x58, 0x4e, 0x2d, 0x1e, 0x2f, 0xc9, 0xd9, 0x43, 0x39,
++ 0xd7, 0xb4, 0xc0, 0x5b, 0x7b, 0x8d, 0xcc, 0x55, 0x1b, 0xfd, 0xa7, 0x16,
++ 0x19, 0x17, 0xdb, 0xc9, 0xe9, 0x3e, 0x06, 0x45, 0x5f, 0x28, 0xfc, 0xff,
++ 0x1b, 0x6e, 0xbd, 0x9b, 0xda, 0xa6, 0xa6, 0xeb, 0x09, 0x9e, 0x67, 0x5a,
++ 0xa6, 0xe8, 0xa8, 0x65, 0xdd, 0x34, 0x62, 0xeb, 0xee, 0xea, 0x72, 0x7f,
++ 0xd9, 0x4e, 0xb9, 0x8d, 0x06, 0xde, 0x0b, 0xe1, 0x11, 0xe6, 0x71, 0x37,
++ 0xb1, 0x9d, 0x03, 0x86, 0x70, 0xb1, 0x56, 0xa3, 0x4a, 0x91, 0xbc, 0x36,
++ 0xcc, 0xb8, 0xde, 0x80, 0x3e, 0x37, 0x16, 0x84, 0x59, 0x7f, 0x77, 0x5d,
++ 0x91, 0x4f, 0xc0, 0x77, 0x2b, 0xcb, 0x76, 0xc6, 0x8b, 0xed, 0xf9, 0x74,
++ 0xc9, 0x15, 0xdb, 0xb1, 0x7f, 0xf8, 0xfc, 0xf3, 0xc8, 0x4d, 0xfa, 0xcc,
++ 0xf9, 0x9a, 0x8a, 0x10, 0x4b, 0x2b, 0x50, 0x5d, 0x21, 0x58, 0x7f, 0xd1,
++ 0xd8, 0xb7, 0x8c, 0xff, 0x29, 0xef, 0x57, 0x63, 0xeb, 0xb8, 0x83, 0x2d,
++ 0x6e, 0x9e, 0x50, 0x81, 0xde, 0x36, 0xc1, 0x43, 0xb1, 0xa5, 0x39, 0x92,
++ 0x27, 0x25, 0x72, 0x90, 0x18, 0x27, 0xf6, 0xb3, 0xc6, 0xb5, 0x1f, 0x8f,
++ 0x32, 0xd3, 0x7e, 0x36, 0xe3, 0xbb, 0xfa, 0xa1, 0x3b, 0x2a, 0x71, 0xe8,
++ 0x2e, 0x59, 0xff, 0xde, 0x10, 0xc7, 0xe1, 0x5b, 0xe8, 0x9b, 0xaf, 0x13,
++ 0x5b, 0xb6, 0xb4, 0x30, 0x86, 0xb8, 0x98, 0xa5, 0xa0, 0x92, 0xb1, 0x7d,
++ 0xdb, 0x6e, 0xe6, 0xc0, 0x6a, 0x90, 0x6d, 0x5e, 0x8a, 0x5d, 0xd2, 0x7f,
++ 0x83, 0xb9, 0xee, 0xa1, 0x2f, 0x56, 0x22, 0x20, 0x39, 0xc7, 0x4f, 0x4e,
++ 0x51, 0xc6, 0x4d, 0x46, 0x59, 0x57, 0xa2, 0xa7, 0xb2, 0x9c, 0x06, 0xa4,
++ 0x77, 0x97, 0xeb, 0x2b, 0x78, 0x29, 0x1a, 0x2e, 0xad, 0x3f, 0x37, 0x60,
++ 0x60, 0xfc, 0xd0, 0x31, 0x72, 0x0d, 0x27, 0xd1, 0x72, 0x68, 0x63, 0x98,
++ 0x7d, 0x39, 0x13, 0x2f, 0xcf, 0xa9, 0xf8, 0xe6, 0x4c, 0x19, 0x62, 0xbb,
++ 0x50, 0x6a, 0x17, 0x62, 0x4b, 0x2d, 0x6d, 0x34, 0x1f, 0x45, 0xaa, 0xc6,
++ 0xac, 0x85, 0x3d, 0x4e, 0xdf, 0x9a, 0xa8, 0x80, 0xf7, 0x5a, 0x89, 0x7d,
++ 0xc2, 0x77, 0xbc, 0x37, 0x9c, 0xb0, 0x2b, 0xf0, 0x69, 0xe3, 0x9c, 0x23,
++ 0xb8, 0x78, 0x4c, 0xc7, 0xe5, 0x15, 0xc4, 0xc4, 0x85, 0xf1, 0x68, 0x72,
++ 0x1d, 0xf3, 0xc2, 0x23, 0x6d, 0xde, 0x1b, 0xde, 0xca, 0xff, 0x9a, 0xdc,
++ 0xf2, 0xd2, 0xf1, 0x88, 0x3e, 0x70, 0x74, 0x45, 0x54, 0xda, 0x94, 0xf6,
++ 0xca, 0x36, 0x2a, 0xed, 0x3b, 0x4e, 0x34, 0x1e, 0x70, 0xe7, 0xbc, 0x3c,
++ 0x86, 0x37, 0xf4, 0xf2, 0x18, 0x02, 0x8c, 0xa7, 0x49, 0x72, 0x57, 0xe1,
++ 0xd5, 0x7e, 0xe6, 0x91, 0x5e, 0xf2, 0xf1, 0x6e, 0x08, 0xdf, 0x3b, 0x4a,
++ 0x7e, 0xf2, 0xa4, 0x0d, 0xbc, 0x93, 0x75, 0xb0, 0x2c, 0x3e, 0x8b, 0xf8,
++ 0xd2, 0x4f, 0xd9, 0xb2, 0xa6, 0x76, 0x50, 0x19, 0x67, 0xae, 0x79, 0xdc,
++ 0x5b, 0x95, 0x54, 0x99, 0x5b, 0x1e, 0xc8, 0x47, 0xc3, 0x87, 0x98, 0x67,
++ 0xfa, 0x99, 0xeb, 0x72, 0x06, 0x94, 0x27, 0x99, 0x67, 0xee, 0x2b, 0xe5,
++ 0x99, 0x07, 0xf2, 0x01, 0xe4, 0xb3, 0xc4, 0xc6, 0x38, 0xf3, 0x5b, 0x37,
++ 0x4f, 0x0f, 0x60, 0x32, 0xab, 0x32, 0x1f, 0x7f, 0xdf, 0x99, 0xaa, 0x77,
++ 0xf7, 0x0b, 0xf0, 0x75, 0xbb, 0x01, 0x07, 0x87, 0x9b, 0x70, 0x36, 0x3f,
++ 0x45, 0xbb, 0xb8, 0x0c, 0xd3, 0xa3, 0xb5, 0x98, 0x18, 0x7e, 0x95, 0x9f,
++ 0xdb, 0xf0, 0xfe, 0xa8, 0x9b, 0xe3, 0x12, 0x0f, 0xa5, 0x7f, 0x07, 0x95,
++ 0x43, 0x6e, 0x8e, 0x6b, 0x25, 0x99, 0xdb, 0x26, 0xfa, 0x4b, 0xb9, 0xed,
++ 0x14, 0x73, 0xdb, 0x23, 0x6c, 0xf3, 0x85, 0x52, 0x9b, 0xcf, 0xb9, 0xff,
++ 0xa5, 0x2f, 0x52, 0x77, 0x66, 0xbd, 0x44, 0x52, 0xd6, 0xa6, 0xc7, 0xed,
++ 0x68, 0xac, 0x5c, 0xf7, 0x05, 0xd6, 0x3b, 0x72, 0xbe, 0xde, 0x6a, 0x0c,
++ 0x64, 0xd6, 0x90, 0xe7, 0xcb, 0xda, 0xca, 0x7b, 0x6b, 0x6c, 0xea, 0xf2,
++ 0xcb, 0xd1, 0xa9, 0xee, 0x59, 0xa8, 0xc3, 0xfa, 0xb8, 0x70, 0xa2, 0xb7,
++ 0xc8, 0x89, 0x22, 0x89, 0x95, 0x8c, 0x0f, 0x9e, 0x68, 0x84, 0x58, 0x0f,
++ 0x44, 0x27, 0x98, 0x03, 0xe4, 0xeb, 0x70, 0x37, 0x73, 0x31, 0xb5, 0x7e,
++ 0x75, 0x69, 0x0f, 0xab, 0x94, 0xe3, 0x78, 0xd6, 0xa0, 0x6f, 0x52, 0xe4,
++ 0xad, 0x26, 0xbf, 0xae, 0xc1, 0x2d, 0xc5, 0x75, 0x0b, 0xbf, 0x9f, 0xb2,
++ 0xfd, 0xd1, 0xa9, 0x18, 0x5d, 0xc6, 0x38, 0xc0, 0x1b, 0xcf, 0xd9, 0x0a,
++ 0x96, 0xe9, 0x3e, 0xac, 0x0b, 0xd6, 0x61, 0x99, 0xf1, 0xef, 0xce, 0x2d,
++ 0xab, 0xe5, 0xd9, 0x79, 0x1e, 0xe1, 0xaf, 0x64, 0xbb, 0x6f, 0x92, 0x53,
++ 0x8f, 0xf3, 0xcb, 0x54, 0xbe, 0x78, 0xdf, 0xca, 0x53, 0x36, 0xe5, 0x6e,
++ 0xa3, 0xdc, 0x7b, 0x83, 0x6e, 0xbe, 0x5b, 0x2a, 0x37, 0x15, 0xf3, 0x10,
++ 0xd7, 0xa5, 0x6c, 0x27, 0xe5, 0xde, 0x4d, 0xb9, 0xfd, 0x41, 0xe9, 0xdf,
++ 0xbf, 0x3b, 0xf7, 0xae, 0x96, 0x67, 0xe5, 0x7d, 0x13, 0x29, 0xff, 0x9e,
++ 0xc8, 0x35, 0xc6, 0x4b, 0x6d, 0x1d, 0xb2, 0x91, 0x95, 0xdc, 0x6f, 0x6d,
++ 0x47, 0x54, 0xeb, 0x75, 0xd7, 0xb2, 0x35, 0xac, 0xcb, 0x6b, 0xb8, 0x87,
++ 0xba, 0xcb, 0x79, 0xcb, 0x63, 0x72, 0xfb, 0x64, 0x09, 0x77, 0x5e, 0xce,
++ 0x72, 0x7d, 0x25, 0xdc, 0xee, 0xcc, 0x8b, 0x0d, 0xcd, 0xdc, 0x4f, 0x6a,
++ 0x2a, 0xf9, 0xb3, 0x17, 0x4f, 0xdb, 0x1f, 0x9c, 0x1b, 0xcc, 0x48, 0x3c,
++ 0x93, 0xf5, 0x10, 0x0d, 0xd9, 0xfc, 0xe5, 0x68, 0x1e, 0x0a, 0x62, 0xad,
++ 0x31, 0x9b, 0xbe, 0xfe, 0xa5, 0xf3, 0x36, 0x75, 0x80, 0xed, 0xc0, 0xe7,
++ 0x8a, 0x57, 0x9e, 0xce, 0xb7, 0x06, 0x1b, 0x70, 0xe9, 0x1e, 0xd2, 0xfc,
++ 0x64, 0x8d, 0x19, 0xed, 0xfe, 0x0e, 0xe7, 0xae, 0xca, 0xe5, 0xd0, 0x5b,
++ 0x94, 0x1c, 0xe7, 0xef, 0xa9, 0xd2, 0xfc, 0x3d, 0x99, 0xbf, 0xae, 0xb2,
++ 0x88, 0x45, 0x97, 0xa3, 0x65, 0x48, 0xfe, 0x07, 0xf1, 0x46, 0xc7, 0xc7,
++ 0x79, 0xef, 0x72, 0x2c, 0x1c, 0xf9, 0x54, 0x25, 0xb9, 0xb5, 0x51, 0xcc,
++ 0xc1, 0x2f, 0xcd, 0x33, 0x22, 0xfd, 0x16, 0x16, 0xb0, 0x5c, 0x13, 0x75,
++ 0x26, 0x18, 0x28, 0xfd, 0x7a, 0xe4, 0x7c, 0xbf, 0xbe, 0xcc, 0x7e, 0xa5,
++ 0x7c, 0xb2, 0xd6, 0x2a, 0xfd, 0x52, 0x92, 0xb5, 0x66, 0x13, 0xde, 0x1f,
++ 0x40, 0x30, 0x68, 0x46, 0x53, 0x2f, 0xd3, 0xde, 0x27, 0xd8, 0xd7, 0x7a,
++ 0xf4, 0x2b, 0x79, 0x77, 0xaf, 0xea, 0x20, 0xcb, 0xcc, 0x8c, 0xa3, 0xd2,
++ 0x4f, 0xaf, 0xe4, 0x59, 0x3e, 0xd9, 0x67, 0xf2, 0xe9, 0x22, 0xff, 0x6d,
++ 0x72, 0xc5, 0x3e, 0xca, 0x4f, 0x72, 0xfe, 0xfc, 0x6c, 0x03, 0x56, 0xb5,
++ 0xd9, 0xed, 0x72, 0x55, 0x2f, 0xfd, 0x6e, 0x19, 0x6d, 0xea, 0xc9, 0x9c,
++ 0x82, 0x51, 0x2a, 0xfd, 0x68, 0x56, 0xd6, 0x89, 0xc3, 0x38, 0x90, 0xf3,
++ 0xe1, 0x85, 0xec, 0x3c, 0x8c, 0xe7, 0x2a, 0xf0, 0x5c, 0xf6, 0x32, 0xec,
++ 0xcb, 0x11, 0xfd, 0xb2, 0x97, 0x63, 0x24, 0xe7, 0xc7, 0x4f, 0xb2, 0xd4,
++ 0x53, 0xae, 0x0a, 0xff, 0x9c, 0xfd, 0x13, 0x7c, 0x3d, 0x57, 0x8d, 0xd7,
++ 0xb2, 0x57, 0xe0, 0x60, 0xae, 0x06, 0xaf, 0x64, 0xc9, 0x27, 0x73, 0x01,
++ 0xbc, 0x9c, 0xd5, 0x50, 0xc8, 0xcd, 0xc2, 0x4b, 0xd9, 0x08, 0x26, 0x72,
++ 0xb5, 0xf8, 0x6e, 0x76, 0x01, 0xf2, 0xb9, 0x3a, 0x7c, 0x27, 0xdb, 0x8c,
++ 0x2f, 0xe7, 0x82, 0x78, 0x31, 0xab, 0xe3, 0xa9, 0x5c, 0x3d, 0x8e, 0x65,
++ 0xa3, 0x6c, 0x37, 0x84, 0xa3, 0xc3, 0x31, 0x1c, 0x18, 0x6d, 0xc4, 0x0b,
++ 0xc3, 0x8b, 0x30, 0x3e, 0x1a, 0xc6, 0x73, 0xc3, 0x6d, 0xd8, 0x37, 0xfa,
++ 0x6f, 0x15, 0xa2, 0x9f, 0x23, 0xf6, 0xff, 0x38, 0xaf, 0xc7, 0x6d, 0x1f,
++ 0x31, 0xdf, 0xaf, 0xda, 0xa2, 0x37, 0xbf, 0x55, 0xcf, 0x39, 0x7a, 0x3a,
++ 0xef, 0xce, 0x3b, 0xf4, 0x21, 0x77, 0x7f, 0x06, 0x7d, 0xc6, 0x65, 0xcc,
++ 0xd9, 0xfa, 0x25, 0x7e, 0xd0, 0x16, 0x0e, 0x2a, 0xdb, 0x5d, 0x1c, 0xa9,
++ 0x4d, 0xce, 0xa2, 0x2e, 0x39, 0xec, 0x60, 0x0d, 0x7d, 0x32, 0x4b, 0x7f,
++ 0xb6, 0x38, 0xaf, 0x76, 0xfe, 0xa0, 0xb2, 0x83, 0x39, 0xe2, 0x95, 0x43,
++ 0x96, 0x53, 0xed, 0xe2, 0x69, 0x34, 0xb9, 0x88, 0x3e, 0x17, 0x1b, 0x11,
++ 0x7d, 0xde, 0x59, 0x21, 0xfa, 0xac, 0xd0, 0x3f, 0xcc, 0x4e, 0xca, 0x7a,
++ 0x0f, 0x94, 0xec, 0xe1, 0xfb, 0x95, 0xc5, 0xbc, 0xaa, 0x3c, 0xef, 0x8e,
++ 0x33, 0x68, 0x94, 0xe7, 0x9e, 0xfc, 0xaf, 0x41, 0xd6, 0xa4, 0xc0, 0x58,
++ 0x50, 0x8f, 0x5c, 0x48, 0xf2, 0xf5, 0x99, 0x98, 0x81, 0x64, 0xa5, 0x19,
++ 0xd5, 0x5a, 0xd4, 0x99, 0x7c, 0x45, 0xb0, 0x43, 0xe4, 0x5b, 0x2e, 0xee,
++ 0x1c, 0x3e, 0x8f, 0x1f, 0x67, 0x2b, 0x85, 0xa7, 0xec, 0xb7, 0xa5, 0x6f,
++ 0x50, 0x2b, 0xa4, 0xcf, 0x28, 0xde, 0x43, 0xa1, 0xac, 0xaf, 0x99, 0x76,
++ 0xa7, 0x52, 0xb7, 0x62, 0x7b, 0x5e, 0xfa, 0xc2, 0x72, 0x89, 0x7b, 0xec,
++ 0x47, 0x13, 0x5e, 0xb0, 0x8b, 0x7b, 0x33, 0xe3, 0x79, 0xd1, 0xb7, 0x86,
++ 0xad, 0xe4, 0x5e, 0x87, 0x87, 0x15, 0xea, 0xee, 0x2f, 0x51, 0xdc, 0x3f,
++ 0xf2, 0xd2, 0x57, 0xd7, 0xb2, 0x3c, 0x63, 0x7c, 0x61, 0xda, 0xdd, 0x1b,
++ 0xae, 0x73, 0xf3, 0xee, 0x30, 0x0a, 0x03, 0x1f, 0x9c, 0xdb, 0x96, 0xf9,
++ 0xe5, 0xb9, 0x3d, 0x99, 0x68, 0x4a, 0xf6, 0x67, 0xf2, 0x13, 0x3e, 0xe4,
++ 0xf6, 0x06, 0xf0, 0xd4, 0x84, 0x1f, 0x35, 0x69, 0xc9, 0xf3, 0x83, 0x78,
++ 0x6a, 0xff, 0xa1, 0x15, 0x35, 0x68, 0xe0, 0xff, 0x10, 0xaf, 0x46, 0x5e,
++ 0x01, 0x1c, 0x1b, 0xf5, 0xe3, 0x2d, 0x5b, 0x7c, 0x58, 0xfc, 0xa3, 0x8d,
++ 0xd8, 0x1f, 0x60, 0xbc, 0x55, 0x19, 0x47, 0x9a, 0x70, 0x38, 0x1f, 0xc4,
++ 0xf2, 0x6c, 0x3d, 0x9e, 0xcb, 0x25, 0xf1, 0x44, 0xa6, 0x1e, 0x67, 0x1f,
++ 0xf3, 0x63, 0xde, 0x3e, 0xf1, 0x87, 0x06, 0x9c, 0x1e, 0xfc, 0x04, 0x0a,
++ 0x7b, 0x93, 0xb0, 0x33, 0xb3, 0xb1, 0x63, 0xb0, 0x01, 0xdf, 0x61, 0x99,
++ 0x7e, 0xea, 0xa9, 0x7a, 0xa7, 0x89, 0x17, 0x69, 0x43, 0x55, 0x3b, 0x6f,
++ 0xa4, 0xec, 0x30, 0x7c, 0x03, 0x21, 0x1c, 0xc9, 0x7b, 0x85, 0xd7, 0x71,
++ 0x1e, 0x7f, 0x5a, 0x9c, 0x17, 0x08, 0x6f, 0xbd, 0x98, 0x07, 0x1e, 0x3f,
++ 0xcf, 0x03, 0x81, 0x5c, 0x5e, 0xd6, 0x18, 0xdb, 0x3a, 0xfb, 0xec, 0x89,
++ 0xff, 0xcf, 0x6f, 0xfe, 0xf4, 0xdb, 0x15, 0x4b, 0x0c, 0x62, 0x9d, 0x8c,
++ 0x7f, 0xed, 0x83, 0xd5, 0xe6, 0x86, 0x2f, 0xae, 0x58, 0x52, 0x89, 0xfb,
++ 0xdd, 0xf9, 0xea, 0x81, 0xbd, 0xbb, 0x9b, 0xf1, 0xb5, 0xb5, 0x67, 0x40,
++ 0xb9, 0x02, 0xa9, 0xfa, 0x21, 0xde, 0x53, 0x4b, 0x3e, 0x07, 0x55, 0x6c,
++ 0xad, 0x8e, 0xfa, 0x54, 0x0b, 0x1a, 0x4e, 0xd0, 0xc8, 0x6a, 0xd3, 0x11,
++ 0x4c, 0xd5, 0xcb, 0x38, 0x63, 0xcc, 0xb3, 0x3c, 0xb2, 0x77, 0x8d, 0x4f,
++ 0x33, 0xc6, 0x9d, 0x5d, 0xac, 0x20, 0xf1, 0x67, 0xe2, 0x83, 0xb7, 0x96,
++ 0xf6, 0x80, 0x65, 0x3f, 0x4c, 0xe6, 0xad, 0xac, 0xff, 0xbd, 0xb2, 0xee,
++ 0xc9, 0x3f, 0xc1, 0x0a, 0x2f, 0x0e, 0xdb, 0x39, 0xe6, 0x08, 0x32, 0x07,
++ 0x32, 0xa6, 0xed, 0xac, 0x27, 0xe3, 0x92, 0xe7, 0xad, 0x89, 0xfa, 0x8f,
++ 0x1c, 0x97, 0x8c, 0x67, 0xad, 0x1f, 0xd5, 0x32, 0x86, 0xb2, 0x2e, 0xfa,
++ 0x58, 0xf7, 0x51, 0xde, 0x93, 0x7a, 0x8e, 0xb3, 0xfd, 0xa2, 0x98, 0x55,
++ 0x91, 0xac, 0x66, 0xdf, 0x9f, 0xb4, 0xa3, 0xc9, 0x77, 0x88, 0x8b, 0xc7,
++ 0xa8, 0xc3, 0x51, 0x5b, 0xec, 0x6f, 0x0b, 0xed, 0xae, 0x5f, 0x39, 0x7a,
++ 0xde, 0xf6, 0x80, 0x83, 0xb6, 0xcc, 0xaf, 0xf0, 0x29, 0x19, 0xaf, 0x86,
++ 0xe9, 0x89, 0xa0, 0xcb, 0xc7, 0xdf, 0xb6, 0xc5, 0x26, 0x62, 0xcc, 0xcf,
++ 0xa6, 0xcf, 0xf5, 0x66, 0x0c, 0x1c, 0xe3, 0xdc, 0x9e, 0xb6, 0xab, 0x88,
++ 0x37, 0x1d, 0x90, 0xbd, 0xce, 0xf7, 0xed, 0x04, 0x5e, 0x22, 0x66, 0xbd,
++ 0x47, 0x5b, 0xfb, 0x2e, 0x31, 0xec, 0x5d, 0x5b, 0xc7, 0x77, 0x68, 0x7b,
++ 0xef, 0xd8, 0x31, 0xbc, 0x98, 0xaf, 0xc7, 0x51, 0xe2, 0xd0, 0x49, 0x7e,
++ 0x5e, 0x9e, 0xf7, 0xc1, 0x0a, 0xc9, 0xbe, 0xda, 0x1e, 0x3f, 0x6a, 0x7b,
++ 0xd9, 0xe7, 0x48, 0x97, 0x1c, 0x44, 0x79, 0x96, 0xe3, 0xd3, 0x94, 0x32,
++ 0x0f, 0x29, 0xe7, 0x04, 0x49, 0x64, 0x33, 0x33, 0xb1, 0x21, 0xd2, 0x9f,
++ 0xa3, 0xdd, 0xfa, 0xd2, 0xe5, 0x38, 0xc0, 0xd8, 0x59, 0x10, 0xdb, 0xf6,
++ 0xc0, 0x33, 0x24, 0xf6, 0x7f, 0x0d, 0x75, 0x3d, 0x7d, 0x4e, 0xf6, 0xd2,
++ 0x54, 0x7d, 0x8a, 0xfe, 0x5e, 0x85, 0xde, 0xdc, 0xe5, 0xa8, 0x19, 0x5a,
++ 0x8a, 0xfb, 0xe3, 0xe2, 0xf7, 0x7e, 0xf4, 0xe7, 0x3c, 0xa8, 0x1c, 0x22,
++ 0x77, 0x61, 0xd9, 0xa9, 0x50, 0x31, 0x1e, 0xa9, 0x69, 0xc3, 0xf5, 0x83,
++ 0x05, 0x85, 0x0f, 0xce, 0xd9, 0x99, 0x43, 0xf3, 0x54, 0x4c, 0x9f, 0x4b,
++ 0x67, 0x02, 0xe8, 0xa3, 0x4d, 0xab, 0x69, 0x05, 0x75, 0x7a, 0x88, 0xf9,
++ 0x5f, 0x1b, 0x7a, 0xa9, 0x8b, 0xf9, 0xe9, 0x26, 0x3c, 0x31, 0xd1, 0x88,
++ 0x79, 0xbb, 0x4c, 0x3c, 0x4e, 0xdb, 0x0f, 0xef, 0xba, 0x11, 0x7b, 0x58,
++ 0xee, 0x15, 0x3e, 0x7b, 0x65, 0x7f, 0x03, 0xaf, 0x10, 0xaf, 0x46, 0x5e,
++ 0xf5, 0x18, 0xd8, 0xab, 0x97, 0xce, 0x61, 0x78, 0xd0, 0x30, 0x24, 0xf8,
++ 0xa2, 0xe2, 0x8e, 0x76, 0x05, 0xc6, 0xd5, 0x6c, 0x73, 0xe1, 0x87, 0x61,
++ 0x4d, 0xc3, 0x1f, 0xd0, 0xef, 0x1f, 0x38, 0x53, 0xe7, 0xed, 0xc7, 0x0f,
++ 0x6f, 0xfa, 0xfb, 0xae, 0xfd, 0x2c, 0x28, 0x48, 0x3b, 0xef, 0x12, 0x33,
++ 0xc4, 0x86, 0x7e, 0x17, 0x9e, 0x95, 0xf5, 0xfe, 0xdb, 0x67, 0x2b, 0x70,
++ 0xde, 0xbe, 0x2e, 0x5a, 0x77, 0x47, 0x9e, 0x36, 0xb1, 0xc3, 0x3d, 0x3b,
++ 0x22, 0xb9, 0x4e, 0xa4, 0x2b, 0x47, 0xfd, 0xf4, 0x33, 0x87, 0xb9, 0x87,
++ 0x38, 0xb1, 0x3d, 0x13, 0xb1, 0x2c, 0xb6, 0xe5, 0x23, 0x36, 0x3c, 0x30,
++ 0xe8, 0x97, 0xf5, 0x6e, 0xcd, 0xa7, 0xcf, 0xc3, 0x3b, 0x39, 0xb1, 0xf9,
++ 0x2a, 0x1c, 0xce, 0x86, 0x71, 0xca, 0xfd, 0x5c, 0xcd, 0x58, 0xe3, 0xa0,
++ 0xd3, 0x98, 0x85, 0xbe, 0x60, 0x15, 0x06, 0x62, 0x37, 0x22, 0x77, 0x07,
++ 0x73, 0x6c, 0xfa, 0x58, 0xad, 0xee, 0x47, 0x3a, 0x28, 0xf9, 0x8b, 0x07,
++ 0x99, 0xd8, 0xed, 0x38, 0x5e, 0xef, 0xc5, 0x3c, 0x59, 0x6f, 0xe1, 0xb3,
++ 0x3d, 0x41, 0x28, 0xf4, 0xbd, 0xa4, 0x8f, 0xb8, 0x34, 0x6b, 0x00, 0x4e,
++ 0xad, 0xa9, 0xcb, 0x1e, 0x4c, 0xcf, 0x56, 0xe2, 0x52, 0xcd, 0x44, 0x0d,
++ 0xe3, 0x4e, 0x0b, 0xaa, 0xf7, 0xca, 0x5e, 0x40, 0x00, 0xeb, 0x86, 0xaf,
++ 0x95, 0xbd, 0x81, 0x98, 0xa6, 0x04, 0x70, 0xef, 0xb0, 0xc4, 0x8f, 0x35,
++ 0xa8, 0xd8, 0x5f, 0x8b, 0x2f, 0x66, 0xbd, 0xc4, 0x78, 0xe2, 0x0d, 0xcb,
++ 0xed, 0xc9, 0xd4, 0xa1, 0xee, 0xb1, 0x67, 0x9d, 0x30, 0x75, 0x5c, 0xb7,
++ 0x57, 0xb0, 0x88, 0xb6, 0x9b, 0xf9, 0x3c, 0x0a, 0x76, 0x33, 0xe5, 0xf6,
++ 0x70, 0x7c, 0x21, 0xbc, 0x4b, 0xec, 0xaa, 0x99, 0x08, 0xe3, 0x9d, 0xdd,
++ 0x92, 0xab, 0x24, 0xe1, 0x9d, 0xb8, 0x0c, 0x6f, 0xf2, 0xf3, 0x09, 0xa3,
++ 0x13, 0xea, 0x44, 0x13, 0x4e, 0x66, 0xba, 0xe0, 0x99, 0xa8, 0x2d, 0x62,
++ 0xd8, 0x5e, 0x3f, 0xea, 0x06, 0xf5, 0xd8, 0x34, 0xe7, 0xc8, 0xb7, 0x97,
++ 0x04, 0xa7, 0x51, 0xda, 0x3f, 0x6f, 0xdb, 0xc6, 0x85, 0x7d, 0x87, 0xf2,
++ 0xd9, 0x15, 0xb1, 0xef, 0xef, 0x3a, 0x4f, 0x04, 0xd9, 0xbf, 0x8e, 0x08,
++ 0xfa, 0x62, 0xc7, 0x64, 0x3f, 0x9f, 0xe3, 0x4b, 0x72, 0xee, 0x9f, 0x77,
++ 0xe4, 0x5c, 0x88, 0xcf, 0x94, 0x33, 0x19, 0xcf, 0x39, 0xdb, 0x57, 0xcb,
++ 0xfd, 0xdb, 0xab, 0x50, 0xcd, 0xc4, 0xc9, 0x14, 0x99, 0x3b, 0x64, 0x6e,
++ 0x19, 0x75, 0x3e, 0x4c, 0xe6, 0x3f, 0x3a, 0x8f, 0x9f, 0x2f, 0x8f, 0xa0,
++ 0xcf, 0x5d, 0x13, 0xbf, 0xe0, 0xcb, 0x35, 0x9c, 0xbb, 0xf5, 0x25, 0x5f,
++ 0x7e, 0xc7, 0x96, 0xf9, 0x93, 0xf3, 0x4b, 0x01, 0x72, 0x30, 0x03, 0xd5,
++ 0x9c, 0xbb, 0xf7, 0x6d, 0x28, 0xb7, 0x76, 0x74, 0x63, 0xd6, 0x44, 0x80,
++ 0xbe, 0x1e, 0x59, 0x6f, 0xc1, 0x66, 0x5b, 0x1d, 0xa8, 0x62, 0x9d, 0x93,
++ 0xb6, 0x87, 0x7e, 0x9e, 0xe0, 0x98, 0x83, 0x70, 0x5c, 0x5e, 0xbf, 0x1a,
++ 0xf3, 0xa9, 0xa7, 0xb3, 0xb6, 0x89, 0x79, 0xd4, 0xd3, 0xb4, 0xed, 0x25,
++ 0x4e, 0x34, 0x11, 0x0f, 0x34, 0xd4, 0x12, 0x1b, 0x2b, 0x06, 0x1d, 0x1c,
++ 0x32, 0xea, 0xc8, 0xf5, 0xc5, 0x4e, 0x3b, 0x10, 0x1e, 0x30, 0x30, 0x6f,
++ 0xa0, 0x79, 0xe3, 0x3c, 0x8f, 0x07, 0xc7, 0x7d, 0xc5, 0xd8, 0x93, 0x9b,
++ 0x23, 0xfa, 0x91, 0x31, 0xb9, 0xb9, 0xfc, 0x87, 0x60, 0xc0, 0x6a, 0x80,
++ 0xb2, 0x0a, 0xc4, 0x8c, 0xcf, 0xb1, 0xad, 0x37, 0xec, 0x57, 0x71, 0xf3,
++ 0x84, 0xe0, 0xcb, 0x0f, 0xb1, 0x92, 0xfd, 0x78, 0x97, 0xb8, 0x76, 0x5f,
++ 0xf4, 0x1b, 0x1c, 0x6b, 0x13, 0x6e, 0x99, 0x98, 0x3e, 0xd7, 0xe7, 0x8e,
++ 0xb3, 0x9c, 0xff, 0xf9, 0x71, 0x5f, 0xb6, 0x7c, 0x06, 0x2d, 0x49, 0x9f,
++ 0x91, 0x38, 0xe1, 0x87, 0xf8, 0x4d, 0xb7, 0xbd, 0x0d, 0xc5, 0x78, 0x2e,
++ 0x57, 0x59, 0x8f, 0x3b, 0xbd, 0x92, 0x97, 0x17, 0x7d, 0x43, 0xfa, 0xf3,
++ 0xbb, 0xca, 0x14, 0x7d, 0x43, 0xfc, 0xe2, 0xcb, 0xae, 0x7e, 0x85, 0x77,
++ 0x69, 0xb8, 0x6d, 0xe2, 0x97, 0xc4, 0xc7, 0x48, 0x32, 0x47, 0xcc, 0x7e,
++ 0x9d, 0xfa, 0xdd, 0x4e, 0xfd, 0x32, 0x07, 0x60, 0xbc, 0x4a, 0x50, 0x9f,
++ 0x3e, 0x72, 0x15, 0x2f, 0x31, 0xd3, 0xa4, 0x2e, 0x41, 0x0c, 0x64, 0xee,
++ 0x1e, 0x2c, 0x8e, 0x37, 0x77, 0x7e, 0xfe, 0xd8, 0x96, 0x92, 0xc0, 0x09,
++ 0xfb, 0x87, 0x55, 0x72, 0x26, 0xe8, 0xa4, 0xed, 0x3e, 0x97, 0x35, 0xcd,
++ 0x19, 0x65, 0x2e, 0xb4, 0xbd, 0xcf, 0x16, 0xfe, 0x5c, 0x49, 0xbb, 0xd6,
++ 0x28, 0xaf, 0xa6, 0x84, 0xa9, 0x52, 0x57, 0xf6, 0x60, 0xa5, 0xfd, 0x6e,
++ 0xe1, 0x20, 0x78, 0x83, 0x3e, 0x77, 0xc4, 0xa8, 0xc0, 0xa8, 0x3b, 0x17,
++ 0x62, 0x8f, 0xc5, 0x76, 0x2f, 0xd8, 0x4d, 0xba, 0xae, 0x74, 0x1e, 0xab,
++ 0xba, 0xc8, 0xc9, 0x2e, 0x6d, 0xa3, 0xe2, 0x3f, 0xb1, 0x8d, 0x44, 0xa9,
++ 0x8d, 0x8f, 0x3a, 0xe3, 0x06, 0x3c, 0x65, 0x4b, 0xec, 0x97, 0xfd, 0x0f,
++ 0x0d, 0x8b, 0x26, 0x04, 0x5f, 0xe8, 0xbb, 0x03, 0xd3, 0x2e, 0xf7, 0xcf,
++ 0x41, 0xf6, 0xb6, 0x42, 0xf0, 0x45, 0x35, 0x9c, 0xd2, 0x63, 0x58, 0x58,
++ 0x90, 0xfd, 0xa9, 0x7d, 0x75, 0xc2, 0xe1, 0xce, 0xe8, 0xc2, 0x3b, 0x64,
++ 0xbe, 0xca, 0xf7, 0xfc, 0xd8, 0xaf, 0x17, 0xfb, 0x9a, 0x54, 0x8b, 0xdc,
++ 0xd1, 0x43, 0xee, 0xd8, 0x6b, 0xf8, 0x69, 0x97, 0xad, 0xc1, 0xd9, 0xbf,
++ 0x73, 0x2f, 0xab, 0xdc, 0xdf, 0xdf, 0x57, 0xee, 0xc2, 0x7a, 0x5c, 0xf6,
++ 0xa2, 0xfd, 0x21, 0x19, 0xd3, 0x5c, 0xa0, 0x41, 0xe2, 0x55, 0x91, 0xa3,
++ 0x6e, 0x3d, 0x9f, 0xff, 0x58, 0xca, 0x60, 0xfe, 0x31, 0xd4, 0xeb, 0x0b,
++ 0x50, 0xdf, 0x50, 0xc3, 0xb8, 0x1c, 0xed, 0xa2, 0x7b, 0x4b, 0x2c, 0xb3,
++ 0x82, 0xa6, 0xe4, 0xbf, 0xc2, 0x5b, 0xa5, 0xcd, 0x7e, 0xa5, 0xaa, 0x20,
++ 0xed, 0x1e, 0x54, 0xfc, 0x85, 0x0f, 0x6b, 0x5b, 0xce, 0xfb, 0x4d, 0x9f,
++ 0x1b, 0xca, 0x74, 0xbb, 0x7b, 0x8c, 0xcb, 0x86, 0x1c, 0xdc, 0x69, 0x34,
++ 0xe1, 0xee, 0x06, 0x69, 0xa3, 0x98, 0xc3, 0x68, 0xea, 0x34, 0x39, 0xdc,
++ 0x6f, 0x1c, 0x55, 0x97, 0xcf, 0x3e, 0x78, 0x1e, 0xd3, 0xa7, 0xd7, 0x42,
++ 0xc5, 0xd9, 0xeb, 0x24, 0x9f, 0xf1, 0x91, 0x7f, 0x6d, 0xaa, 0x2e, 0xee,
++ 0x2f, 0x8b, 0x1d, 0x4b, 0x3f, 0xfc, 0xf4, 0xb3, 0x0b, 0xfd, 0xd8, 0xf6,
++ 0x07, 0xf5, 0xc3, 0x8f, 0x9b, 0x86, 0x92, 0x18, 0x35, 0x4e, 0x38, 0x56,
++ 0x68, 0x66, 0xdb, 0x3e, 0xac, 0x1c, 0xfa, 0x8d, 0x33, 0xcb, 0x6d, 0x5b,
++ 0x27, 0xa7, 0x52, 0xf1, 0xc0, 0x12, 0x1f, 0x6e, 0x1d, 0x89, 0x62, 0xc5,
++ 0x90, 0x8a, 0xd8, 0x12, 0xe9, 0x43, 0x14, 0x5d, 0x23, 0xbb, 0xbd, 0xc5,
++ 0xf2, 0xc0, 0x2d, 0x1c, 0xc3, 0x1b, 0x46, 0x0d, 0x7e, 0x40, 0x0c, 0xac,
++ 0x75, 0xb9, 0xfd, 0x46, 0x25, 0x23, 0xdc, 0xde, 0xa7, 0x62, 0xb6, 0x8e,
++ 0x60, 0x83, 0x99, 0xa4, 0xee, 0x3a, 0x95, 0xc7, 0x72, 0x1b, 0x95, 0xa1,
++ 0x7c, 0xb9, 0xef, 0x01, 0x7c, 0xa2, 0x10, 0xc4, 0x27, 0xc6, 0x1a, 0x78,
++ 0x85, 0x78, 0x35, 0xf2, 0x7a, 0xf1, 0xfc, 0xb8, 0xca, 0x67, 0x3c, 0x9f,
++ 0x65, 0x4e, 0xb1, 0xcd, 0xf5, 0x4b, 0x89, 0x0b, 0x9a, 0x9c, 0xd5, 0xc1,
++ 0x5b, 0x59, 0xc9, 0x27, 0xb6, 0xd1, 0x86, 0x65, 0x4d, 0xb8, 0x92, 0x39,
++ 0x45, 0x24, 0x36, 0x85, 0xbf, 0xaa, 0x2e, 0xce, 0x7d, 0xd1, 0x86, 0x71,
++ 0xde, 0x86, 0x7d, 0x78, 0x3b, 0xab, 0xa2, 0x25, 0xfe, 0x6f, 0xce, 0xf1,
++ 0xa0, 0xe0, 0xc9, 0xa5, 0xcf, 0xcb, 0x9c, 0x65, 0xfa, 0x5c, 0x36, 0xd3,
++ 0x34, 0x63, 0x5f, 0x56, 0x41, 0xc5, 0x90, 0xf0, 0xf3, 0xeb, 0x5c, 0xbe,
++ 0xf7, 0x7d, 0xc3, 0x07, 0xef, 0xd0, 0xa1, 0x2b, 0xe5, 0x68, 0x93, 0x6f,
++ 0x8c, 0x71, 0xab, 0x83, 0xf3, 0x32, 0xf2, 0xf1, 0x92, 0xce, 0xca, 0xba,
++ 0x50, 0xdc, 0x35, 0x49, 0xd5, 0x8d, 0xe9, 0x41, 0xa8, 0x63, 0xc2, 0x43,
++ 0xc9, 0x0d, 0xc6, 0x24, 0x1f, 0x08, 0xf1, 0xbf, 0xe4, 0x06, 0x8d, 0xfc,
++ 0xcf, 0xc4, 0xa2, 0x51, 0xe2, 0x78, 0x0f, 0xfa, 0x19, 0x9f, 0x2a, 0xa3,
++ 0x3d, 0xd8, 0x3e, 0xfe, 0x61, 0x31, 0xbf, 0x98, 0x63, 0x3d, 0x7b, 0xde,
++ 0xcf, 0xdc, 0x39, 0x62, 0x9f, 0xa6, 0xcf, 0x89, 0xcf, 0xc8, 0x5c, 0xed,
++ 0xcb, 0x4a, 0x1f, 0x1c, 0x6c, 0x30, 0x6e, 0x64, 0xdb, 0x3e, 0xa8, 0x0d,
++ 0x33, 0xb9, 0xe7, 0x79, 0x3e, 0x4d, 0xdd, 0x6d, 0x54, 0x46, 0x39, 0x27,
++ 0x96, 0xb7, 0x52, 0xd6, 0x87, 0x82, 0x15, 0x9c, 0x93, 0xaf, 0xe4, 0x45,
++ 0x46, 0xa7, 0x32, 0x9e, 0x9b, 0x59, 0x67, 0xa3, 0x32, 0x96, 0xff, 0x55,
++ 0xb5, 0xac, 0x99, 0x5f, 0xd0, 0x4d, 0xb9, 0x0f, 0x62, 0x63, 0x1a, 0xea,
++ 0xd3, 0xa2, 0x67, 0x19, 0xb3, 0x06, 0x2f, 0x79, 0x5c, 0x7d, 0xe1, 0x43,
++ 0xdb, 0x6c, 0xac, 0x72, 0xcf, 0x62, 0xc6, 0x18, 0x8b, 0x02, 0x56, 0x25,
++ 0x39, 0x1f, 0x6d, 0x34, 0xe5, 0x33, 0xbb, 0x3a, 0xf7, 0xd9, 0x0b, 0x83,
++ 0x87, 0x4b, 0x6b, 0x11, 0x6b, 0x21, 0xbc, 0x54, 0x71, 0x71, 0xd6, 0xa3,
++ 0x47, 0xb1, 0x9c, 0xb9, 0xee, 0x4d, 0xb9, 0x62, 0x7f, 0xc7, 0xd8, 0xdf,
++ 0x29, 0xd7, 0xf7, 0x92, 0xca, 0x68, 0x5e, 0x75, 0xfb, 0xed, 0x35, 0xa5,
++ 0xbf, 0x52, 0x97, 0xe3, 0xc9, 0xbf, 0x56, 0xca, 0xa9, 0x92, 0x18, 0xcc,
++ 0xcc, 0xf4, 0x61, 0xe9, 0x73, 0x2d, 0xda, 0x86, 0x3e, 0xa0, 0x9f, 0xc9,
++ 0xbc, 0x0a, 0xfe, 0xcc, 0xc3, 0xca, 0x91, 0x59, 0x68, 0x1d, 0x0a, 0xe3,
++ 0xb6, 0x91, 0x06, 0x2c, 0xda, 0xb5, 0x06, 0xd5, 0x63, 0x41, 0x5c, 0xb9,
++ 0x4b, 0xd6, 0xf8, 0x57, 0xa3, 0xb2, 0x70, 0x5b, 0x8d, 0xe4, 0xb8, 0x7a,
++ 0x3a, 0xc1, 0xf9, 0x4b, 0xa0, 0x22, 0x1d, 0x49, 0x24, 0x21, 0x6b, 0xa4,
++ 0x26, 0x2a, 0x0a, 0x26, 0xf9, 0xa4, 0xb3, 0x79, 0xbe, 0xe9, 0x73, 0xcf,
++ 0x9b, 0x2d, 0x2b, 0xd0, 0xe6, 0x39, 0x6e, 0x1f, 0x2f, 0x4f, 0xda, 0x71,
++ 0xce, 0x5e, 0x87, 0xcd, 0x35, 0x66, 0x13, 0x3c, 0x85, 0xcb, 0x91, 0x1c,
++ 0x69, 0xc3, 0xbc, 0x42, 0x03, 0x3a, 0x47, 0x42, 0x88, 0xa5, 0xc5, 0xc7,
++ 0x23, 0x5a, 0x4a, 0xed, 0x80, 0xbf, 0xc0, 0x78, 0x9a, 0xfe, 0x8d, 0xf3,
++ 0x16, 0xed, 0xa0, 0x87, 0xfa, 0xba, 0x26, 0xdd, 0x85, 0xba, 0x42, 0x00,
++ 0x57, 0x0f, 0x7d, 0x02, 0xb5, 0x23, 0x7e, 0xcc, 0x1a, 0xd2, 0x90, 0x5f,
++ 0xe2, 0x47, 0x60, 0x24, 0x8c, 0xea, 0xb4, 0xde, 0x75, 0x9b, 0x82, 0xe4,
++ 0xc2, 0x25, 0x61, 0xb6, 0x4d, 0x7b, 0xa3, 0x7f, 0x8d, 0x90, 0x7f, 0x2d,
++ 0xef, 0x06, 0x36, 0xa7, 0x05, 0x1b, 0x45, 0x27, 0x9f, 0x72, 0xcf, 0x9f,
++ 0xac, 0x4b, 0x7f, 0x18, 0xce, 0x95, 0xed, 0x5b, 0xfc, 0xdc, 0x72, 0xcf,
++ 0xc4, 0x32, 0x07, 0x52, 0xa6, 0x5b, 0xf4, 0xec, 0x3c, 0xde, 0xfb, 0x39,
++ 0xe3, 0xf3, 0x43, 0xe9, 0x80, 0x55, 0x6b, 0x6e, 0xc6, 0x55, 0xed, 0x11,
++ 0xab, 0xa0, 0xbc, 0xca, 0xf1, 0xff, 0x90, 0x41, 0xbb, 0x89, 0xfd, 0xfc,
++ 0x63, 0xe5, 0x5f, 0xba, 0xce, 0xb6, 0xe4, 0xa2, 0xf5, 0xb9, 0x23, 0xcc,
++ 0xe7, 0xa7, 0x2e, 0x5a, 0x9f, 0x13, 0xbc, 0x2f, 0x9f, 0x83, 0x90, 0xb9,
++ 0xd2, 0x66, 0xd8, 0xb7, 0xac, 0x17, 0x09, 0x36, 0xca, 0x7c, 0x95, 0xd7,
++ 0x8b, 0x7c, 0x58, 0x3e, 0x24, 0xb9, 0x92, 0xca, 0x3c, 0xa1, 0x05, 0xc9,
++ 0xd0, 0xa3, 0x9c, 0x03, 0x77, 0x4d, 0x89, 0xf7, 0x06, 0xf8, 0x59, 0xd6,
++ 0x7b, 0x34, 0xe2, 0x8f, 0x56, 0xca, 0x0b, 0xaa, 0x70, 0xeb, 0x50, 0x83,
++ 0xbb, 0x1f, 0xb5, 0x22, 0x7e, 0x39, 0x62, 0xf5, 0x5f, 0x62, 0x99, 0x0b,
++ 0x6b, 0x43, 0x57, 0x31, 0xdf, 0xa8, 0x71, 0xcf, 0x4a, 0x2c, 0xa3, 0xbe,
++ 0x2f, 0x47, 0xdb, 0x48, 0x11, 0xcf, 0x6e, 0x1b, 0x29, 0xe2, 0x56, 0x5a,
++ 0x6c, 0xce, 0x57, 0xb4, 0xb9, 0x2c, 0x6d, 0x2e, 0xa8, 0x77, 0x2a, 0xd9,
++ 0xdc, 0x47, 0xc5, 0x13, 0x04, 0xeb, 0xcc, 0xf2, 0x99, 0x6a, 0x62, 0x5e,
++ 0xfe, 0x48, 0xcd, 0x1f, 0x16, 0x7f, 0x2e, 0xd5, 0xd9, 0xb5, 0x7f, 0xa4,
++ 0xce, 0xca, 0x31, 0xeb, 0x82, 0xce, 0x06, 0x2f, 0xd1, 0xd9, 0x02, 0xea,
++ 0xa0, 0x41, 0x2f, 0xea, 0x6d, 0xb9, 0x71, 0x19, 0x52, 0xae, 0xde, 0xaa,
++ 0x64, 0x6d, 0x8c, 0xf7, 0x04, 0xaf, 0xe7, 0xe0, 0xfb, 0xc1, 0x2f, 0xb9,
++ 0xf7, 0x16, 0x51, 0x27, 0x45, 0x7d, 0x05, 0xa9, 0xaf, 0x0b, 0xb1, 0x00,
++ 0xea, 0x07, 0xcc, 0xa7, 0x8a, 0xb1, 0x40, 0x74, 0xf7, 0xda, 0xa0, 0x86,
++ 0xba, 0xeb, 0x2e, 0xc7, 0x2b, 0x7b, 0xab, 0xd0, 0x3e, 0xe2, 0xa3, 0x7f,
++ 0x49, 0x7c, 0x28, 0xc6, 0xa4, 0xd6, 0x11, 0x77, 0x3f, 0x8a, 0xf8, 0xda,
++ 0x10, 0xf8, 0xc3, 0x63, 0xb0, 0x8c, 0x47, 0xce, 0xe5, 0xc9, 0xb9, 0x39,
++ 0x19, 0x97, 0x3e, 0xc3, 0x16, 0x1c, 0xe7, 0x19, 0xce, 0x77, 0xaa, 0x21,
++ 0x92, 0x95, 0xf5, 0xa6, 0x2c, 0x39, 0x99, 0x27, 0x2d, 0x3a, 0x13, 0xbe,
++ 0xad, 0xde, 0xe8, 0x81, 0xda, 0xe6, 0xc1, 0x66, 0x9c, 0x32, 0xf4, 0xfe,
++ 0x7b, 0xf1, 0x27, 0xe8, 0x0d, 0x39, 0xd8, 0x6f, 0xac, 0x64, 0x3e, 0x51,
++ 0x8d, 0xf5, 0x6d, 0x34, 0xcf, 0x3b, 0x3a, 0x88, 0x09, 0x56, 0x8f, 0x07,
++ 0xb2, 0x9e, 0xbb, 0xf1, 0x2e, 0x3b, 0x1a, 0xe9, 0x7e, 0x50, 0x01, 0x56,
++ 0x0c, 0xf8, 0xa1, 0x29, 0x2e, 0xdf, 0x89, 0x0d, 0xa9, 0xb2, 0xb6, 0xfc,
++ 0x2f, 0x15, 0xc5, 0xb3, 0x10, 0x2a, 0xb4, 0x46, 0x69, 0x67, 0x25, 0xac,
++ 0xc9, 0x0e, 0x17, 0x4f, 0x6a, 0x16, 0x2a, 0xb8, 0x75, 0x61, 0xc4, 0x4a,
++ 0x29, 0x8e, 0xb3, 0x2a, 0xee, 0x75, 0x9f, 0xef, 0x98, 0x6c, 0x4d, 0xdd,
++ 0xa9, 0xfe, 0x8b, 0x63, 0xb9, 0xeb, 0xd9, 0x91, 0x60, 0x52, 0x65, 0x9f,
++ 0x3f, 0xf2, 0xac, 0xa2, 0x8c, 0x93, 0x5c, 0x9c, 0xbc, 0xfb, 0xc9, 0xd2,
++ 0xfa, 0xaf, 0xcf, 0x5c, 0xff, 0x17, 0xfb, 0x75, 0xc9, 0xf7, 0xbe, 0xe4,
++ 0x9e, 0xfb, 0xc8, 0x66, 0x64, 0xfd, 0xf0, 0xe1, 0x00, 0xaa, 0x57, 0xa2,
++ 0x77, 0xf2, 0x3a, 0x4c, 0xb4, 0xfd, 0xab, 0x93, 0x2b, 0xf6, 0x5d, 0xcc,
++ 0xd0, 0x3f, 0xcf, 0xcc, 0xdd, 0x75, 0x7d, 0x4b, 0x84, 0x1c, 0x5c, 0xce,
++ 0x7a, 0x92, 0x0b, 0x2b, 0x45, 0x1e, 0x3e, 0x5f, 0xbf, 0x09, 0xcf, 0x5e,
++ 0x24, 0x53, 0xd6, 0x12, 0xca, 0x32, 0x77, 0x51, 0x9e, 0xc8, 0x65, 0x3c,
++ 0xd0, 0xff, 0xcd, 0x19, 0x09, 0xcd, 0x2c, 0x17, 0xab, 0x2a, 0xc6, 0x2a,
++ 0x29, 0x57, 0x6e, 0xb7, 0x82, 0xf5, 0xde, 0x77, 0x46, 0x2f, 0x2a, 0xf7,
++ 0xd3, 0x52, 0xb9, 0x67, 0x02, 0x72, 0x66, 0x24, 0x9b, 0x11, 0xce, 0x7a,
++ 0xca, 0x19, 0xbb, 0xa8, 0x4c, 0x4b, 0xf5, 0xc5, 0x65, 0x9a, 0x89, 0xd1,
++ 0xff, 0xaf, 0x33, 0x7e, 0x51, 0x99, 0xe4, 0x25, 0x65, 0x16, 0x10, 0x13,
++ 0xbf, 0xef, 0xec, 0xbb, 0xa8, 0x4c, 0xed, 0x25, 0x65, 0x16, 0xd3, 0x1e,
++ 0x9f, 0x71, 0x0e, 0x5c, 0x54, 0x66, 0xcc, 0x7f, 0x71, 0x19, 0xd9, 0xe3,
++ 0x58, 0xff, 0x17, 0x5b, 0xf4, 0x75, 0x25, 0x9f, 0xbb, 0x70, 0xbf, 0x58,
++ 0xfe, 0xf1, 0x4b, 0xfa, 0x1f, 0xb1, 0x64, 0xbe, 0x7d, 0xed, 0xe5, 0xf9,
++ 0x7e, 0xb8, 0x74, 0xff, 0x7b, 0x35, 0x17, 0x97, 0xbb, 0x22, 0x70, 0x69,
++ 0x3b, 0x45, 0x79, 0x47, 0x2f, 0x69, 0xff, 0xe6, 0xca, 0x8b, 0xbf, 0xbf,
++ 0x5d, 0x51, 0xfc, 0x5e, 0xd6, 0xe9, 0xa1, 0x4b, 0x9e, 0xff, 0x7d, 0xc5,
++ 0xc5, 0xdf, 0x37, 0x54, 0x7e, 0x78, 0x3b, 0xb5, 0x97, 0xb4, 0xa3, 0xf4,
++ 0xca, 0xbb, 0x38, 0x1e, 0x53, 0xad, 0xed, 0xed, 0x58, 0x7f, 0x43, 0x2a,
++ 0xbf, 0x89, 0xf6, 0x29, 0xb6, 0xf5, 0xe0, 0x0d, 0x6b, 0xf3, 0x6f, 0xcd,
++ 0xe0, 0xb1, 0xcb, 0xc2, 0x41, 0x7c, 0x1c, 0x6b, 0xdd, 0xbd, 0x34, 0x95,
++ 0x38, 0x69, 0xb9, 0xb6, 0x40, 0x8e, 0xe9, 0x57, 0xcc, 0x14, 0x0c, 0xf7,
++ 0xbc, 0xe5, 0x3a, 0x34, 0xe7, 0xdd, 0x3d, 0xbb, 0x58, 0x0a, 0xcf, 0xaa,
++ 0x5d, 0xba, 0x55, 0x3a, 0x47, 0x67, 0x5d, 0x1f, 0x44, 0x72, 0x66, 0x7e,
++ 0xaa, 0x8d, 0x23, 0x12, 0xde, 0x86, 0x75, 0xee, 0x59, 0x6b, 0xc5, 0xec,
++ 0x29, 0x9d, 0xd7, 0x5c, 0x03, 0x3d, 0x5f, 0xe6, 0x4d, 0xb2, 0x9e, 0x2b,
++ 0xe7, 0x19, 0x1c, 0xfa, 0xa0, 0xc4, 0xf9, 0x83, 0x8a, 0x3a, 0xe0, 0xae,
++ 0x99, 0xae, 0xf6, 0x20, 0x9a, 0xe8, 0x54, 0x90, 0xaa, 0x32, 0xa3, 0xda,
++ 0xdb, 0x25, 0x4c, 0xf3, 0x4d, 0x6c, 0x51, 0x2a, 0x26, 0xfa, 0x15, 0xef,
++ 0x44, 0x11, 0xd3, 0x3c, 0x13, 0xb2, 0xb6, 0xd0, 0xc0, 0x32, 0x41, 0xb4,
++ 0x2c, 0xf1, 0xe2, 0x3b, 0x76, 0xad, 0xfb, 0x1e, 0xc7, 0xd6, 0x25, 0x15,
++ 0x78, 0x20, 0xae, 0xa0, 0xeb, 0xaa, 0xc3, 0x78, 0x2b, 0x2f, 0xeb, 0x6c,
++ 0x56, 0x7c, 0x94, 0x6d, 0x1e, 0xb2, 0x65, 0xbd, 0x74, 0x4b, 0x7c, 0xc4,
++ 0x6d, 0xff, 0xf3, 0xe8, 0x73, 0xf7, 0xad, 0xba, 0x9d, 0xed, 0x99, 0x1e,
++ 0x67, 0x1b, 0x73, 0x8d, 0x82, 0xdd, 0x90, 0xaa, 0x63, 0xfd, 0xb7, 0x96,
++ 0xac, 0xc7, 0x69, 0x96, 0x99, 0xb0, 0x1f, 0xc4, 0xfb, 0xf9, 0x20, 0xf2,
++ 0xf6, 0x4a, 0x7c, 0x37, 0x1f, 0x60, 0xce, 0xd7, 0x85, 0xef, 0xe4, 0x57,
++ 0xe3, 0xc5, 0x61, 0xf7, 0x7d, 0x29, 0x2c, 0xb3, 0x15, 0xac, 0x88, 0xae,
++ 0xc6, 0xb1, 0xd1, 0xd5, 0x38, 0x3c, 0x2c, 0xef, 0x0e, 0xcc, 0x25, 0x8f,
++ 0x2c, 0xda, 0x9b, 0x4a, 0x8c, 0x59, 0x66, 0xaf, 0xc2, 0xa1, 0xd1, 0x30,
++ 0x73, 0x29, 0x03, 0x27, 0xf3, 0x21, 0x8c, 0xd8, 0x6d, 0x38, 0x91, 0x0f,
++ 0xe3, 0xeb, 0x76, 0x02, 0x67, 0xf9, 0xfd, 0xa0, 0x2d, 0x9c, 0xa5, 0x03,
++ 0xd3, 0xf9, 0x6f, 0x32, 0xcf, 0x99, 0x87, 0x23, 0xdd, 0xcf, 0x30, 0x1c,
++ 0x1d, 0xe4, 0xd5, 0x85, 0x13, 0xa3, 0x5d, 0x38, 0x35, 0x7c, 0x2b, 0x4e,
++ 0x8d, 0xfe, 0x18, 0x6f, 0x0d, 0x4b, 0x7f, 0xe5, 0xfc, 0xb7, 0xc8, 0xd5,
++ 0x29, 0x77, 0x35, 0xa6, 0x46, 0xff, 0x18, 0xd9, 0xef, 0x3a, 0x47, 0x56,
++ 0x8b, 0xdc, 0x67, 0x7e, 0x87, 0x6c, 0xd1, 0xa5, 0x60, 0xbf, 0x1f, 0xc7,
++ 0x6c, 0x3f, 0x8e, 0xda, 0x53, 0x57, 0x56, 0x61, 0xea, 0x7a, 0x22, 0x1d,
++ 0xb6, 0xe7, 0x2b, 0xf1, 0x5c, 0x56, 0xd6, 0xd8, 0x3e, 0x86, 0x64, 0x70,
++ 0x23, 0xb6, 0x4e, 0x56, 0xe2, 0x3b, 0x59, 0x3f, 0x75, 0x7c, 0x3d, 0x92,
++ 0xf5, 0xab, 0xa9, 0xbf, 0x00, 0x5e, 0xb2, 0x43, 0x78, 0xd9, 0x6e, 0x4d,
++ 0x15, 0x94, 0x76, 0x58, 0x2e, 0xfe, 0x07, 0xa8, 0xef, 0x0d, 0x6e, 0x9f,
++ 0xbe, 0x63, 0x77, 0x3b, 0x5b, 0xa9, 0xe3, 0xfe, 0xcc, 0xe7, 0xdd, 0xb3,
++ 0xdb, 0x2f, 0xda, 0xd3, 0x8e, 0xbc, 0x93, 0xf1, 0x14, 0x75, 0x7a, 0xcc,
++ 0x4e, 0x91, 0xdb, 0x35, 0x71, 0x8e, 0xa6, 0x30, 0x4a, 0xbb, 0x3c, 0x99,
++ 0xd5, 0x8f, 0xae, 0xc5, 0x26, 0x9c, 0xcd, 0x55, 0xe2, 0x35, 0xb6, 0x51,
++ 0xb7, 0xd8, 0x8b, 0xe3, 0xae, 0xbc, 0x4d, 0x78, 0x3f, 0xab, 0x30, 0xde,
++ 0x6e, 0xc2, 0x7b, 0x7c, 0xf6, 0x0a, 0x3f, 0x9f, 0x8e, 0xb3, 0x87, 0xa5,
++ 0x67, 0xa7, 0xc8, 0xcf, 0x65, 0xcd, 0xa8, 0xb7, 0x63, 0x13, 0x4e, 0xe4,
++ 0xde, 0x23, 0xa7, 0x75, 0xf0, 0x45, 0x63, 0x36, 0x12, 0xb3, 0xc9, 0x9b,
++ 0xf4, 0x4a, 0x1c, 0xe3, 0xf3, 0x85, 0xc4, 0xdf, 0xe2, 0xfa, 0xd9, 0x26,
++ 0xbc, 0xcb, 0xf1, 0x3c, 0x40, 0x59, 0xef, 0xe4, 0xfe, 0x96, 0x72, 0x97,
++ 0x22, 0x1f, 0xff, 0x5b, 0xca, 0xfd, 0x31, 0xc6, 0x4b, 0xfa, 0x38, 0x61,
++ 0xc8, 0xb8, 0xbe, 0x31, 0x0b, 0xd5, 0x21, 0x8e, 0xe3, 0x9b, 0xfc, 0xbf,
++ 0x01, 0xc7, 0xf3, 0xff, 0x9b, 0xff, 0xbf, 0x8b, 0x03, 0x79, 0x59, 0xaf,
++ 0x9e, 0x19, 0x4b, 0xc5, 0x7f, 0xca, 0x1c, 0x64, 0x0e, 0x32, 0x83, 0xb5,
++ 0xa9, 0xd9, 0xb4, 0xa3, 0xbf, 0xbe, 0xb6, 0x0e, 0xef, 0xc6, 0x2d, 0xec,
++ 0xd8, 0xe7, 0x45, 0x86, 0xb8, 0xbb, 0x63, 0xa0, 0x01, 0x4f, 0xec, 0x0c,
++ 0xe2, 0xf1, 0x9d, 0x97, 0x61, 0xcb, 0xce, 0x2b, 0xb0, 0x67, 0x67, 0x13,
++ 0xd2, 0x3b, 0x1d, 0xe7, 0xfd, 0xc5, 0x8e, 0xb3, 0x88, 0xd7, 0x23, 0xf4,
++ 0x05, 0x3f, 0xff, 0xbf, 0x10, 0x17, 0x3f, 0xd1, 0x71, 0x95, 0xeb, 0x2f,
++ 0x9d, 0xb8, 0xd2, 0xfd, 0x9f, 0xc4, 0xa2, 0xfc, 0xc6, 0xf8, 0xfa, 0xc2,
++ 0xa6, 0xf8, 0x7d, 0x85, 0x39, 0xd8, 0x3a, 0xd8, 0x88, 0xc1, 0x9d, 0x0d,
++ 0xa9, 0x06, 0xb6, 0xb3, 0xea, 0x5a, 0xe1, 0x76, 0x8e, 0x63, 0xb4, 0xf7,
++ 0xc7, 0xd7, 0x16, 0x9e, 0x41, 0x77, 0x21, 0x84, 0xbe, 0xc1, 0x30, 0xdb,
++ 0x92, 0xbd, 0x5c, 0xef, 0xd1, 0x7b, 0xe1, 0x38, 0xd3, 0x8b, 0x0f, 0xe2,
++ 0xae, 0xc2, 0x37, 0xc9, 0x1b, 0x43, 0x48, 0x0f, 0xae, 0x47, 0x66, 0xb2,
++ 0x22, 0xe5, 0x37, 0x1d, 0xbc, 0x14, 0x9f, 0xc2, 0xed, 0x94, 0xf7, 0xe8,
++ 0x60, 0x2d, 0xfb, 0x54, 0x9d, 0xaa, 0x34, 0x25, 0x86, 0x3f, 0xc8, 0x18,
++ 0x25, 0xfc, 0xe2, 0x28, 0x56, 0x30, 0xbf, 0xaa, 0x5f, 0xa2, 0xcf, 0x42,
++ 0x6d, 0xd0, 0x7b, 0xa6, 0x43, 0xec, 0x2f, 0x45, 0xfb, 0x93, 0x7d, 0xf5,
++ 0x75, 0xb8, 0xdb, 0x3d, 0xe7, 0xdd, 0x83, 0xe7, 0x6d, 0xc1, 0x9d, 0x35,
++ 0xd8, 0x6f, 0xaf, 0x63, 0xce, 0x25, 0xf1, 0x7a, 0x25, 0x9a, 0x0b, 0x7f,
++ 0x17, 0xbf, 0xa7, 0xb0, 0x9a, 0x7c, 0xf6, 0x5f, 0x70, 0x53, 0x21, 0xc7,
++ 0x7e, 0x8d, 0xc6, 0xef, 0x2e, 0xec, 0x89, 0xdf, 0x5b, 0xe8, 0xc2, 0x02,
++ 0x37, 0xa7, 0x64, 0xfe, 0x55, 0x90, 0x38, 0x77, 0x9c, 0x5c, 0xf8, 0x14,
++ 0x96, 0x17, 0x5e, 0xc3, 0xcd, 0x05, 0xc1, 0x0d, 0x89, 0x7f, 0x2f, 0x7a,
++ 0x51, 0x2d, 0x71, 0xef, 0x0b, 0xd8, 0xba, 0x3b, 0x85, 0xbe, 0xdd, 0x65,
++ 0x8c, 0x6a, 0x0d, 0xee, 0x13, 0x7c, 0x99, 0xf4, 0x95, 0x62, 0xd4, 0xa7,
++ 0x68, 0x8f, 0x2a, 0x63, 0xa3, 0xac, 0xd3, 0xaf, 0xa3, 0x2f, 0x6f, 0x24,
++ 0x66, 0xca, 0x7a, 0xfc, 0x27, 0x4b, 0xf7, 0x25, 0xd6, 0xcb, 0x5a, 0xbc,
++ 0x86, 0x43, 0x79, 0x77, 0x4f, 0x5b, 0xf3, 0xeb, 0xb7, 0xf3, 0x99, 0xd4,
++ 0xff, 0x02, 0xd2, 0xbb, 0x57, 0x3b, 0x8f, 0x66, 0x8a, 0xfb, 0x66, 0x47,
++ 0xa2, 0x6c, 0x6b, 0x9c, 0xb1, 0x7d, 0x2f, 0xfc, 0xb3, 0x38, 0xb6, 0x89,
++ 0x01, 0x58, 0x1e, 0xbd, 0xdb, 0xd9, 0x92, 0xc1, 0xbd, 0xb3, 0x10, 0xc6,
++ 0xca, 0x89, 0x0a, 0x24, 0xf7, 0x57, 0xe3, 0xb6, 0x9d, 0x3d, 0xb4, 0x65,
++ 0x8b, 0xf6, 0xab, 0x1b, 0x77, 0x2b, 0xd5, 0xb8, 0x99, 0xf7, 0x3e, 0x3d,
++ 0x28, 0x6b, 0x58, 0xd1, 0xa3, 0x27, 0x3c, 0xd5, 0xb8, 0x6b, 0xaf, 0x1f,
++ 0xb9, 0xdc, 0x4a, 0x24, 0xf7, 0x1e, 0x81, 0x95, 0xa3, 0x4d, 0xee, 0x22,
++ 0xce, 0x30, 0xcd, 0x51, 0xcd, 0x1f, 0x63, 0xcf, 0xa8, 0x8a, 0xba, 0x5d,
++ 0xb2, 0xfe, 0xa8, 0xe8, 0xa7, 0xa3, 0x05, 0xa4, 0x47, 0xbd, 0x98, 0x95,
++ 0xee, 0xc4, 0x04, 0xb1, 0x26, 0x90, 0x4e, 0x22, 0x9f, 0xef, 0x46, 0x8e,
++ 0x58, 0x92, 0x1b, 0x0d, 0xa0, 0x26, 0x6d, 0x20, 0xa0, 0xc7, 0xb0, 0x83,
++ 0xfe, 0x52, 0x91, 0xd6, 0xb1, 0x2d, 0x7f, 0x23, 0xac, 0xd1, 0x4f, 0x60,
++ 0xfb, 0x68, 0x37, 0x2f, 0x13, 0x7d, 0xa3, 0x9f, 0xc7, 0xb2, 0x89, 0xa3,
++ 0xe8, 0xcf, 0xa7, 0x68, 0x8f, 0xef, 0x61, 0x7b, 0xee, 0x30, 0x9e, 0xc8,
++ 0x6e, 0xc6, 0xd9, 0xc5, 0x87, 0xf1, 0x38, 0x3f, 0x67, 0xb3, 0xfa, 0xc6,
++ 0xb0, 0x7a, 0x18, 0x99, 0xdc, 0x26, 0x7c, 0x62, 0x50, 0xc1, 0x4b, 0xb4,
++ 0xf5, 0xdb, 0xf7, 0xd2, 0x16, 0x1f, 0xdb, 0x80, 0xae, 0x89, 0xef, 0xc2,
++ 0xce, 0x3f, 0x8f, 0x1d, 0xb9, 0x07, 0xd1, 0x9f, 0x59, 0xcf, 0xfc, 0xff,
++ 0x19, 0xca, 0x39, 0x48, 0x3f, 0xdf, 0xc8, 0x31, 0x3e, 0xcc, 0xeb, 0xc2,
++ 0x1a, 0xe3, 0x85, 0x35, 0x39, 0xfa, 0x7d, 0x46, 0x72, 0xcf, 0x75, 0xc4,
++ 0x89, 0x27, 0x6b, 0x65, 0x5d, 0xb2, 0x4a, 0x9f, 0xb9, 0x56, 0x2f, 0xb6,
++ 0x1f, 0x76, 0x73, 0xed, 0xaa, 0xb4, 0xe4, 0x75, 0x53, 0x91, 0x2a, 0x72,
++ 0x0c, 0x7f, 0x5a, 0x74, 0xd8, 0xe3, 0xf4, 0x66, 0x04, 0x4b, 0x64, 0x3e,
++ 0x34, 0xbc, 0x90, 0xff, 0x31, 0xb6, 0x0e, 0xcf, 0xc6, 0xf2, 0x6c, 0x1b,
++ 0x39, 0xa5, 0xe3, 0x7c, 0x85, 0xbe, 0x66, 0x93, 0xeb, 0xec, 0x18, 0x4c,
++ 0x12, 0x53, 0x66, 0x23, 0x39, 0xa7, 0xc8, 0x4f, 0xc2, 0x69, 0x69, 0xcb,
++ 0x57, 0xda, 0xab, 0x9b, 0xba, 0x32, 0xcc, 0x7b, 0x75, 0x69, 0x99, 0xb7,
++ 0x88, 0xa1, 0xb9, 0xfb, 0x69, 0x8e, 0xf3, 0x52, 0xb4, 0xcc, 0x95, 0xa6,
++ 0xae, 0xac, 0xc3, 0x6c, 0x59, 0x77, 0x4d, 0xc8, 0x39, 0xdf, 0x6f, 0xb5,
++ 0x2c, 0xa7, 0xaf, 0x7e, 0x01, 0x03, 0xe3, 0xe5, 0x77, 0x23, 0xff, 0xb3,
++ 0xe4, 0xdd, 0xf5, 0x9f, 0x2c, 0xaf, 0xbc, 0x07, 0x2a, 0xe7, 0x8c, 0xcb,
++ 0xef, 0x50, 0x8a, 0x2e, 0xaf, 0x90, 0xfd, 0x03, 0xab, 0xb8, 0x4f, 0x0a,
++ 0x1c, 0xb1, 0x2b, 0x18, 0x87, 0xd5, 0xa5, 0x64, 0x63, 0x21, 0x1f, 0x2a,
++ 0x19, 0x2f, 0x1b, 0xd1, 0x47, 0xbe, 0x7a, 0x93, 0x51, 0x81, 0x03, 0x6d,
++ 0x49, 0x39, 0xcf, 0xd7, 0xe3, 0x73, 0x79, 0xea, 0xa6, 0x3f, 0xff, 0x6d,
++ 0x9e, 0xba, 0x09, 0xe9, 0x8c, 0x9c, 0x63, 0xeb, 0xc6, 0x4b, 0xf5, 0xf2,
++ 0x5e, 0xe7, 0x26, 0xf7, 0x9c, 0x70, 0xd5, 0x42, 0x62, 0x46, 0x5c, 0xc3,
++ 0x51, 0xbd, 0x55, 0x6b, 0x50, 0x23, 0x06, 0x94, 0xd7, 0x1d, 0x2b, 0x94,
++ 0x44, 0xff, 0xa4, 0x9c, 0xd5, 0xfb, 0xa8, 0x3d, 0x84, 0xb5, 0xd8, 0xfe,
++ 0x58, 0x07, 0x8e, 0xaf, 0x96, 0xb5, 0xbc, 0x9f, 0x95, 0xde, 0xdb, 0x93,
++ 0x3e, 0x46, 0xea, 0xe4, 0x0c, 0xaa, 0xc8, 0xde, 0x9e, 0x51, 0x19, 0x7b,
++ 0xe2, 0x78, 0x3d, 0xe8, 0x8e, 0x37, 0x56, 0x3e, 0x97, 0x59, 0xa9, 0x2f,
++ 0x2f, 0x95, 0x5f, 0x50, 0x27, 0xbc, 0x64, 0x5b, 0x66, 0x13, 0xb9, 0xb6,
++ 0xf4, 0xe7, 0xd7, 0xce, 0xda, 0x50, 0x03, 0xcb, 0x8e, 0x95, 0x9e, 0x8b,
++ 0xad, 0x45, 0x8c, 0x24, 0xe4, 0x9e, 0xd4, 0x11, 0x9d, 0xcd, 0xac, 0xe3,
++ 0x41, 0xbd, 0x7e, 0x25, 0x1e, 0xa2, 0x8f, 0xcf, 0xd7, 0x5f, 0x76, 0x36,
++ 0xcb, 0x39, 0xcd, 0x85, 0xc1, 0x19, 0x6d, 0x2d, 0x75, 0xfb, 0x52, 0xc9,
++ 0xbe, 0x0c, 0x66, 0xe4, 0xbd, 0x81, 0xb3, 0xce, 0xc2, 0x46, 0x79, 0x7e,
++ 0x5b, 0x6d, 0x51, 0x7e, 0xb3, 0x7b, 0x0e, 0x7b, 0x4f, 0xa6, 0xdc, 0x6f,
++ 0x39, 0xe3, 0x1e, 0x2a, 0xb7, 0x15, 0xbb, 0x30, 0x1e, 0xe9, 0xdb, 0xd7,
++ 0x6a, 0x2f, 0xee, 0xf3, 0x9d, 0xb3, 0xca, 0xef, 0x17, 0xcc, 0x73, 0xeb,
++ 0x94, 0xdb, 0x94, 0x3e, 0x6e, 0xc2, 0xe3, 0x93, 0x97, 0x8e, 0xf1, 0xee,
++ 0x19, 0x63, 0x92, 0x3a, 0x32, 0xae, 0x60, 0xc9, 0x0e, 0x36, 0xb2, 0x8c,
++ 0xd4, 0x91, 0x75, 0x82, 0xa0, 0x9b, 0x3f, 0xd4, 0xed, 0x16, 0x79, 0x22,
++ 0xc3, 0x71, 0xde, 0x70, 0x63, 0xf2, 0x02, 0xb7, 0xcc, 0xe0, 0xe4, 0x6a,
++ 0xfa, 0x91, 0xb3, 0x99, 0xf8, 0xec, 0xbc, 0xd1, 0x11, 0xc6, 0x56, 0x5b,
++ 0x74, 0xad, 0x87, 0xc7, 0x88, 0x4d, 0x7d, 0x2e, 0x9f, 0xf1, 0xa1, 0x37,
++ 0x57, 0x3e, 0xeb, 0x52, 0x29, 0x7b, 0x21, 0x61, 0xd1, 0x79, 0xaf, 0x41,
++ 0x1e, 0x17, 0x5c, 0xa6, 0x79, 0xc9, 0xc5, 0xee, 0xc1, 0x7f, 0xc8, 0xfc,
++ 0xc6, 0x7c, 0xa5, 0x75, 0x93, 0x14, 0xed, 0xa8, 0x18, 0x0f, 0x41, 0xfe,
++ 0x40, 0x1e, 0x56, 0x3a, 0x43, 0xdf, 0x9b, 0xff, 0x0f, 0x67, 0xca, 0x3d,
++ 0x43, 0x7f, 0xe1, 0x2c, 0x4a, 0x2e, 0xe8, 0x38, 0xfb, 0xf8, 0xec, 0xc2,
++ 0x79, 0x7a, 0x72, 0x06, 0x5d, 0xce, 0xdd, 0xff, 0x3b, 0xe7, 0x6e, 0x66,
++ 0xd9, 0xa9, 0xfa, 0xe2, 0xfb, 0x25, 0x49, 0x75, 0x99, 0x5e, 0xc6, 0x6d,
++ 0xd9, 0x27, 0x12, 0xdc, 0x3e, 0x58, 0x57, 0x5c, 0x3f, 0x8e, 0x74, 0x75,
++ 0x43, 0xf6, 0xe4, 0xcb, 0x38, 0xa3, 0x1b, 0x8b, 0x94, 0xcd, 0x68, 0x89,
++ 0x57, 0xcb, 0xf9, 0xba, 0x88, 0xd7, 0x8c, 0x04, 0xdf, 0x42, 0x34, 0x76,
++ 0xd8, 0x3d, 0x43, 0x22, 0xd8, 0xa3, 0xe3, 0x9e, 0xbc, 0x4e, 0x9b, 0x95,
++ 0xf7, 0xd2, 0xe5, 0x73, 0xf1, 0xdd, 0xc7, 0x64, 0x5e, 0xb0, 0xba, 0x87,
++ 0x58, 0x6d, 0xfd, 0xa5, 0xcf, 0x95, 0x17, 0xe9, 0x19, 0x55, 0x22, 0x5d,
++ 0x0f, 0x2a, 0x65, 0x79, 0x81, 0x0f, 0x91, 0x17, 0x63, 0x7d, 0xad, 0xf4,
++ 0x2e, 0xb8, 0x4e, 0x19, 0x97, 0x9e, 0x0d, 0x9a, 0x93, 0x92, 0x3c, 0xfa,
++ 0x40, 0x89, 0x73, 0x1e, 0xfe, 0xad, 0x3c, 0xfa, 0x43, 0xdb, 0x4c, 0xb2,
++ 0xcd, 0xae, 0x6a, 0x25, 0x19, 0x97, 0xf7, 0x80, 0x2a, 0xe3, 0xd1, 0xd8,
++ 0x0b, 0x74, 0x72, 0xaf, 0x19, 0x0d, 0x8f, 0xba, 0x67, 0x5d, 0x0c, 0xff,
++ 0xf2, 0x7c, 0xd1, 0x7f, 0xac, 0xc9, 0xdf, 0xad, 0x93, 0x1a, 0x5d, 0xef,
++ 0x6e, 0x55, 0x92, 0xd7, 0x57, 0x53, 0x4e, 0x2c, 0x0e, 0xad, 0xc2, 0x2c,
++ 0xeb, 0x28, 0x1a, 0x7b, 0x8b, 0xf3, 0x79, 0xa8, 0x23, 0x1a, 0x1e, 0x71,
++ 0x73, 0x74, 0xd1, 0x8b, 0xe1, 0x2f, 0xce, 0xbd, 0x2e, 0x7c, 0xde, 0xf2,
++ 0x31, 0x36, 0x8f, 0xdb, 0x7e, 0x8e, 0xa5, 0x35, 0xb8, 0x1d, 0xf5, 0xb4,
++ 0x71, 0x24, 0xfb, 0xda, 0x18, 0x1f, 0x6c, 0x24, 0x3d, 0x57, 0xd5, 0x21,
++ 0x45, 0x82, 0xee, 0xd1, 0x53, 0xe4, 0x5c, 0xad, 0xb1, 0x47, 0x68, 0xbf,
++ 0xb9, 0x50, 0x24, 0x6c, 0x21, 0x85, 0xe7, 0xec, 0x65, 0x7f, 0xee, 0x81,
++ 0x65, 0xd4, 0x70, 0xa2, 0xab, 0xcd, 0xa9, 0x3f, 0xbf, 0x35, 0x1a, 0xd1,
++ 0x5e, 0x2c, 0x9d, 0xd5, 0xe9, 0xb5, 0x7f, 0xe1, 0xee, 0x51, 0x79, 0xf4,
++ 0xdf, 0x55, 0x46, 0xda, 0xf6, 0x63, 0x2c, 0x9b, 0xc5, 0x96, 0xc7, 0xd8,
++ 0x47, 0xdd, 0xc1, 0x32, 0x63, 0x33, 0x96, 0x1b, 0x01, 0xac, 0x0b, 0xb6,
++ 0x24, 0xe4, 0x2c, 0xd2, 0x48, 0xae, 0xb8, 0x36, 0x52, 0x5c, 0x0b, 0xef,
++ 0xc7, 0xa3, 0x19, 0x37, 0x3e, 0x07, 0xfd, 0x66, 0x52, 0x79, 0x34, 0xdf,
++ 0xa9, 0x3c, 0x52, 0x5a, 0x8f, 0xeb, 0xcf, 0xdf, 0x10, 0x44, 0xb5, 0x85,
++ 0x13, 0x86, 0xbc, 0x47, 0x29, 0x72, 0x2d, 0x8c, 0x76, 0xfc, 0x21, 0xef,
++ 0x53, 0x8a, 0x4e, 0x37, 0xa2, 0x6f, 0xf8, 0x61, 0xf4, 0x0e, 0xbf, 0xe4,
++ 0x9e, 0x65, 0xf5, 0xe9, 0x7e, 0xeb, 0x0a, 0x33, 0x72, 0xd0, 0xc2, 0xbc,
++ 0x7a, 0x59, 0x13, 0x6e, 0x34, 0x8f, 0xe2, 0xd1, 0xa0, 0xbc, 0x27, 0xd8,
++ 0x4f, 0x9e, 0x22, 0xef, 0x9c, 0xad, 0xc1, 0x67, 0x06, 0x64, 0x0e, 0x6b,
++ 0xad, 0x4a, 0x33, 0x92, 0x5c, 0xe7, 0xce, 0x61, 0x1b, 0x8e, 0x15, 0x1e,
++ 0xc6, 0x1b, 0xbb, 0x36, 0x43, 0x8d, 0x47, 0xc2, 0xb7, 0xc0, 0xd9, 0x7c,
++ 0xc4, 0x48, 0x5a, 0x3e, 0x44, 0x0e, 0x78, 0x54, 0xe0, 0xd9, 0x5d, 0x92,
++ 0x4f, 0xf7, 0xe0, 0x7a, 0x72, 0x80, 0x3a, 0xdd, 0x59, 0xfa, 0xab, 0xc5,
++ 0x91, 0x7e, 0xdd, 0x63, 0xfd, 0xd3, 0x1c, 0x44, 0xb2, 0x09, 0x55, 0xef,
++ 0xf9, 0xa4, 0x0a, 0x25, 0x60, 0xca, 0x6f, 0x00, 0x6c, 0xc6, 0x27, 0xda,
++ 0x03, 0xd6, 0x2c, 0x33, 0x92, 0x7d, 0x49, 0x89, 0xc4, 0x2c, 0xf5, 0x1b,
++ 0x9c, 0xe7, 0x18, 0x5e, 0x24, 0xc7, 0xe9, 0x62, 0x6c, 0x5f, 0x21, 0x31,
++ 0xdd, 0xc5, 0xbe, 0xe6, 0x44, 0x95, 0x12, 0xc4, 0x2d, 0x05, 0xe0, 0x50,
++ 0x6e, 0x0d, 0x4e, 0xee, 0x32, 0xd0, 0xc9, 0x67, 0x83, 0x19, 0x02, 0x16,
++ 0x31, 0x60, 0x83, 0x61, 0xb5, 0xaa, 0xe4, 0x16, 0x3e, 0x15, 0xcb, 0xe6,
++ 0x9b, 0xd1, 0xa9, 0xa5, 0x1e, 0x2f, 0x12, 0x05, 0x2f, 0xee, 0x60, 0x99,
++ 0xed, 0x8c, 0x0b, 0x9f, 0x4c, 0xfb, 0xc9, 0x6f, 0x9b, 0xf0, 0x33, 0xf2,
++ 0xec, 0x9f, 0x92, 0x4f, 0x1f, 0x27, 0x5f, 0x38, 0x9e, 0xaf, 0x46, 0xf7,
++ 0x90, 0x4f, 0xce, 0x1f, 0x4d, 0xf9, 0x38, 0x17, 0xb5, 0xed, 0x21, 0x9c,
++ 0x1e, 0xf5, 0xe3, 0xf6, 0x5d, 0x91, 0x3d, 0xc7, 0xd5, 0x46, 0xbc, 0x3f,
++ 0x5a, 0x8d, 0x95, 0x43, 0x7e, 0xf6, 0xcd, 0xc1, 0x0e, 0xe2, 0xff, 0xbb,
++ 0x7c, 0xd6, 0xb9, 0x0b, 0x4a, 0x7e, 0xc9, 0x02, 0xe6, 0x04, 0x3a, 0xeb,
++ 0xd7, 0xe0, 0xd6, 0x21, 0xe1, 0x81, 0x2a, 0xde, 0x1e, 0x55, 0xf0, 0x56,
++ 0xce, 0xc0, 0x32, 0xb6, 0xd7, 0x97, 0x79, 0xd6, 0xf1, 0xd3, 0xcf, 0xd7,
++ 0xe6, 0x0d, 0xdc, 0x9b, 0xd3, 0x19, 0x53, 0x7e, 0xe2, 0x78, 0xf4, 0x76,
++ 0xfc, 0x64, 0xa7, 0x7e, 0xf4, 0x75, 0x4f, 0x74, 0x6a, 0x89, 0xa7, 0x1d,
++ 0xaf, 0xed, 0x6f, 0xc7, 0xf7, 0x06, 0x97, 0xe2, 0x9a, 0xf6, 0x24, 0xce,
++ 0x2c, 0x69, 0xc7, 0xab, 0x7b, 0x75, 0x3c, 0x92, 0xe9, 0x80, 0x36, 0x31,
++ 0x45, 0xfe, 0x9b, 0x40, 0xeb, 0x84, 0x09, 0x7d, 0xd0, 0xd9, 0x5c, 0x63,
++ 0x6e, 0xc6, 0xa3, 0x86, 0x89, 0x45, 0x7b, 0x45, 0x0f, 0x8e, 0xb3, 0x6e,
++ 0x89, 0x89, 0x17, 0xb2, 0x3a, 0xfd, 0xd4, 0xa4, 0x1e, 0x74, 0x3c, 0x9e,
++ 0x31, 0x11, 0x7d, 0x4c, 0x9f, 0xde, 0xc7, 0xef, 0x4b, 0xf7, 0x75, 0xa0,
++ 0x87, 0xed, 0xdb, 0xc4, 0xeb, 0x3d, 0x13, 0x6d, 0x1c, 0xb3, 0xc1, 0xf1,
++ 0x37, 0x5b, 0x3f, 0x53, 0x3a, 0x91, 0x9d, 0xe8, 0x22, 0x9f, 0xdd, 0x4c,
++ 0x1e, 0xdb, 0xe5, 0xee, 0xb9, 0x6f, 0xcd, 0x18, 0xb8, 0x35, 0xdd, 0x85,
++ 0x27, 0x6d, 0x39, 0x3b, 0xaf, 0x27, 0xae, 0x55, 0xe4, 0x1d, 0xdd, 0x2e,
++ 0x8c, 0x51, 0x27, 0xcb, 0x86, 0x56, 0xba, 0xe7, 0x9d, 0x96, 0xef, 0xd2,
++ 0xf1, 0x44, 0xe6, 0x13, 0x38, 0x39, 0x6e, 0xa0, 0x3b, 0x2d, 0xfa, 0x96,
++ 0xf3, 0x9b, 0x29, 0x1c, 0x61, 0x6c, 0xf9, 0xd9, 0x50, 0xf2, 0x9f, 0x38,
++ 0xcd, 0xc7, 0x54, 0xc8, 0x7a, 0x89, 0x8a, 0xab, 0xdb, 0xe5, 0x0c, 0xae,
++ 0x87, 0xa8, 0x16, 0xb1, 0xea, 0x54, 0x4b, 0xe3, 0x7d, 0xcb, 0xab, 0x6e,
++ 0xc2, 0x67, 0x87, 0xbc, 0xcc, 0x19, 0x54, 0xe6, 0x3a, 0xd6, 0x06, 0xda,
++ 0x86, 0x55, 0xab, 0x16, 0xe7, 0xcd, 0xdd, 0x63, 0xd0, 0x3d, 0xd8, 0x61,
++ 0x34, 0x77, 0xd7, 0xb0, 0xde, 0x8a, 0x78, 0x24, 0x59, 0xa5, 0x76, 0x30,
++ 0x0f, 0x7d, 0x18, 0xeb, 0x76, 0x3d, 0x8c, 0xb5, 0xbc, 0x36, 0xec, 0x72,
++ 0x36, 0xdf, 0x6c, 0x28, 0x78, 0x4e, 0x77, 0x36, 0x6f, 0x36, 0x74, 0xce,
++ 0xad, 0xcc, 0xeb, 0xc3, 0xd8, 0x38, 0xf6, 0x30, 0x1e, 0xa2, 0x7d, 0x35,
++ 0xd0, 0x8f, 0x57, 0xa5, 0x9d, 0xcd, 0xd7, 0xb4, 0xc7, 0xf0, 0x73, 0x37,
++ 0xbf, 0x11, 0x7b, 0x3d, 0xe3, 0xe6, 0xdc, 0x39, 0xd5, 0xb5, 0xdd, 0xa0,
++ 0x7c, 0xb6, 0xd4, 0x25, 0xc1, 0x72, 0x6c, 0xf9, 0x05, 0xe5, 0xfe, 0x72,
++ 0x57, 0x1d, 0x1e, 0x6b, 0x90, 0xf8, 0xe1, 0xb7, 0xaa, 0x4c, 0x28, 0xfa,
++ 0x12, 0xe6, 0x71, 0x8f, 0x1d, 0xc1, 0x76, 0xf2, 0xc2, 0x50, 0x5c, 0x72,
++ 0xec, 0x56, 0x63, 0x8b, 0x7a, 0x23, 0xb1, 0x5d, 0xc1, 0xa3, 0x0b, 0xb3,
++ 0x18, 0xa0, 0xaf, 0xee, 0x58, 0x18, 0x49, 0x0d, 0xc0, 0x74, 0x76, 0xcc,
++ 0xe9, 0xff, 0x23, 0xde, 0xa1, 0x2d, 0xef, 0x4b, 0xca, 0x7b, 0xb4, 0x0f,
++ 0x63, 0xf3, 0x2e, 0x99, 0xff, 0x87, 0xf1, 0x45, 0xf6, 0x7f, 0xe3, 0xd0,
++ 0xc3, 0xf8, 0x1c, 0x6d, 0xa7, 0x7e, 0xf1, 0xa1, 0x2f, 0xd6, 0xa3, 0x25,
++ 0x5b, 0x87, 0xa9, 0xfb, 0x1b, 0xe4, 0xbc, 0x2d, 0x31, 0x71, 0x40, 0x79,
++ 0x18, 0xf7, 0x8c, 0xd4, 0xd2, 0x17, 0xdd, 0x31, 0x10, 0x8b, 0xcb, 0xf1,
++ 0x2a, 0x8c, 0x75, 0xf9, 0xa6, 0x12, 0xae, 0x87, 0xb0, 0xd6, 0x3e, 0xe0,
++ 0xfa, 0x7e, 0x85, 0xb9, 0x9a, 0x7e, 0xdf, 0x4d, 0xbf, 0x5f, 0x49, 0xbf,
++ 0xef, 0xa2, 0xdf, 0x77, 0xd2, 0xef, 0x93, 0xf4, 0x7b, 0x93, 0x7e, 0x9f,
++ 0xa0, 0xdf, 0x77, 0xd0, 0xef, 0x0d, 0xd9, 0x3b, 0x54, 0x8e, 0x76, 0x1c,
++ 0x81, 0x6f, 0xd0, 0x4f, 0x1b, 0x2a, 0xbe, 0xd3, 0xb8, 0x9f, 0xf8, 0x73,
++ 0xc2, 0x58, 0x14, 0xbe, 0x89, 0xaa, 0x1a, 0x25, 0x46, 0xe4, 0xc6, 0xff,
++ 0xce, 0x7d, 0xff, 0x2d, 0x47, 0xdc, 0x7f, 0x91, 0xfa, 0x58, 0x11, 0x6f,
++ 0x36, 0x9e, 0x64, 0x0c, 0xfb, 0xa1, 0xde, 0xda, 0x1f, 0x62, 0x99, 0xaf,
++ 0x65, 0x5a, 0xb3, 0xb3, 0xa1, 0x5b, 0xed, 0xea, 0x56, 0x60, 0x55, 0x88,
++ 0x63, 0x96, 0x73, 0xdd, 0xab, 0xf0, 0xc5, 0xe1, 0x6e, 0xfc, 0xcf, 0xe1,
++ 0x20, 0x75, 0xd1, 0x3c, 0x75, 0xa3, 0x07, 0xdf, 0x0c, 0xc3, 0x13, 0x9a,
++ 0x0b, 0x7c, 0xd0, 0x88, 0x45, 0x07, 0xe4, 0x5d, 0xec, 0x5c, 0xa3, 0xa7,
++ 0x6d, 0x3e, 0xc4, 0x46, 0x40, 0xa4, 0xf6, 0x30, 0xd3, 0x5c, 0xe4, 0xbe,
++ 0xaf, 0x99, 0x5c, 0x2d, 0x98, 0x5e, 0x85, 0xad, 0x31, 0x17, 0x67, 0x9f,
++ 0x96, 0xf3, 0xe9, 0x8d, 0xc4, 0xa3, 0x80, 0xd9, 0x85, 0x6d, 0x03, 0xd6,
++ 0x5d, 0x8d, 0x58, 0x89, 0xfe, 0x81, 0xa2, 0x0e, 0xee, 0x8f, 0x13, 0xf2,
++ 0xcc, 0xa8, 0xb6, 0x48, 0x81, 0x77, 0x43, 0x47, 0x02, 0xf7, 0xe6, 0x6d,
++ 0x64, 0x39, 0xc6, 0xf5, 0xf4, 0xb3, 0x75, 0xbf, 0xff, 0x3d, 0x7c, 0x7c,
++ 0xce, 0xd6, 0x68, 0xff, 0xe7, 0x9c, 0x5c, 0xfd, 0xa2, 0x6c, 0x23, 0xf4,
++ 0x8d, 0x77, 0xa8, 0xd7, 0x32, 0x67, 0x8e, 0x1c, 0xe4, 0x23, 0x6b, 0x8e,
++ 0x7b, 0x8e, 0xce, 0x8f, 0x05, 0x43, 0x50, 0x46, 0xd3, 0xf2, 0xce, 0xda,
++ 0x66, 0xfc, 0x5f, 0xc6, 0x37, 0x5c, 0x5b, 0x9a, 0xf2, 0xc8, 0x99, 0x16,
++ 0xb9, 0xef, 0x2c, 0x3d, 0xbb, 0x38, 0x12, 0xd3, 0x3c, 0x3f, 0xa8, 0x93,
++ 0xfd, 0x8b, 0xaf, 0x33, 0xce, 0x86, 0x87, 0x96, 0x42, 0x5d, 0xec, 0xc7,
++ 0x9d, 0x6d, 0xb3, 0x90, 0x5a, 0x25, 0x3c, 0xd4, 0xdd, 0x5f, 0xa1, 0x3e,
++ 0xff, 0x02, 0xf7, 0x19, 0x5f, 0xc1, 0xf1, 0x90, 0x8d, 0x21, 0xe2, 0xd7,
++ 0x3a, 0xe3, 0x76, 0xc5, 0xe2, 0x67, 0xe6, 0x44, 0x58, 0x6f, 0x30, 0xd7,
++ 0xfa, 0x54, 0x03, 0x1a, 0x76, 0x49, 0x79, 0x91, 0x7b, 0xc6, 0x95, 0xb7,
++ 0x3f, 0x23, 0x9f, 0x8b, 0x36, 0x3b, 0xe5, 0xf9, 0x24, 0xd0, 0x20, 0xe7,
++ 0x84, 0x15, 0xbc, 0xbd, 0xd0, 0xc6, 0x63, 0x19, 0x7c, 0xb3, 0x0a, 0xcd,
++ 0xb9, 0x41, 0xd5, 0xf3, 0xcd, 0xb9, 0x58, 0x64, 0xfc, 0x5a, 0x95, 0xf9,
++ 0x48, 0xe2, 0xbe, 0x85, 0x72, 0x1e, 0x4d, 0x3f, 0xf3, 0x3d, 0xfa, 0xd6,
++ 0x71, 0xd8, 0xd8, 0x3e, 0xf9, 0x92, 0x33, 0x35, 0x37, 0x84, 0xa7, 0x26,
++ 0xa5, 0x6e, 0x37, 0x4e, 0x70, 0x4e, 0xbe, 0xec, 0xee, 0xe7, 0x45, 0x92,
++ 0x27, 0x54, 0x79, 0xe7, 0xb0, 0x1b, 0x6f, 0x8d, 0x1a, 0xd8, 0xc7, 0x1c,
++ 0xea, 0x57, 0xc3, 0xab, 0xf0, 0xeb, 0xe1, 0x66, 0xed, 0x6f, 0x14, 0x39,
++ 0x03, 0xff, 0x71, 0xfc, 0xa8, 0x21, 0x88, 0x83, 0xb4, 0xa1, 0x69, 0xbb,
++ 0x0b, 0x6f, 0xdb, 0x56, 0x64, 0x2e, 0x22, 0x7b, 0xbc, 0x9e, 0xc8, 0x01,
++ 0x79, 0xcf, 0x79, 0x9d, 0x1a, 0x39, 0xb8, 0x44, 0x89, 0x58, 0x6f, 0xa8,
++ 0x2b, 0xf1, 0x8b, 0x7c, 0x17, 0xce, 0xe4, 0x67, 0xda, 0xc2, 0x66, 0x07,
++ 0x8d, 0x62, 0x07, 0x62, 0x0f, 0xb4, 0x45, 0xe6, 0x8a, 0xdf, 0x26, 0x8f,
++ 0xee, 0xfd, 0x18, 0xed, 0x31, 0x43, 0x7b, 0xcc, 0xd0, 0x1e, 0x89, 0x49,
++ 0xcf, 0x10, 0xab, 0xbe, 0x96, 0xa1, 0x3d, 0xd2, 0x7f, 0xbe, 0x42, 0xff,
++ 0x29, 0x72, 0xe5, 0x1e, 0x77, 0x4d, 0xff, 0x15, 0xc6, 0x44, 0xfb, 0x31,
++ 0x79, 0x7f, 0xb8, 0x79, 0x7d, 0x01, 0x91, 0x9e, 0x01, 0x65, 0x5d, 0xbd,
++ 0xbc, 0xcf, 0xf1, 0xf9, 0xa8, 0xf8, 0x80, 0xbc, 0x7b, 0x46, 0xbf, 0x1a,
++ 0x3f, 0x55, 0x27, 0xef, 0xb2, 0xee, 0xdf, 0xfd, 0x51, 0x3a, 0xfb, 0x7b,
++ 0xf6, 0x43, 0xf4, 0xf5, 0xc7, 0x8e, 0x5d, 0x74, 0xf9, 0x4f, 0xce, 0x8f,
++ 0x1a, 0x65, 0xfc, 0xab, 0xf1, 0xf3, 0xe1, 0x4e, 0x9c, 0x65, 0xfc, 0xfd,
++ 0x74, 0xfb, 0x94, 0x45, 0x9b, 0xdd, 0x68, 0x78, 0x4c, 0x4c, 0xe6, 0x3b,
++ 0x71, 0xda, 0x36, 0x91, 0xb7, 0x9b, 0xd7, 0x7f, 0x57, 0x79, 0x53, 0xcd,
++ 0xcd, 0x2b, 0xf2, 0xf9, 0xdf, 0x90, 0x5f, 0x1e, 0x6a, 0x91, 0xf7, 0x5d,
++ 0x13, 0x18, 0xc9, 0x8b, 0x9d, 0x06, 0x71, 0xd3, 0x12, 0x43, 0xde, 0x11,
++ 0xfb, 0xbd, 0x7f, 0xf7, 0xd9, 0xb2, 0x97, 0x72, 0xce, 0x99, 0x0a, 0xfa,
++ 0xad, 0x20, 0x7d, 0xd8, 0xb3, 0x4b, 0x7e, 0x07, 0x40, 0xfc, 0x59, 0xc1,
++ 0x67, 0x8c, 0x29, 0xad, 0x06, 0x91, 0xa7, 0x77, 0x33, 0x81, 0x7a, 0x2d,
++ 0x2d, 0x67, 0x88, 0x3b, 0xf1, 0x26, 0xcb, 0x57, 0xd1, 0x2f, 0x5e, 0xcb,
++ 0x7b, 0xbd, 0x3f, 0x4a, 0xcb, 0x7b, 0xec, 0x2b, 0xf1, 0xa3, 0xfc, 0xcb,
++ 0xea, 0x2f, 0x82, 0x06, 0xde, 0x2e, 0xac, 0xc2, 0xfc, 0x5d, 0xb2, 0xbe,
++ 0x90, 0xc4, 0x7e, 0x3b, 0x72, 0xf4, 0x59, 0xac, 0xc2, 0xbc, 0xb1, 0xd5,
++ 0xcc, 0xa3, 0x15, 0xbc, 0x17, 0x5d, 0x8d, 0x00, 0x3f, 0xd7, 0xee, 0x72,
++ 0x9c, 0xc3, 0xf1, 0x3a, 0x67, 0xfb, 0x6a, 0x99, 0x3b, 0xc1, 0x93, 0x65,
++ 0xf5, 0xa8, 0x5d, 0x0d, 0x8c, 0x09, 0x57, 0xd1, 0x71, 0xeb, 0xc0, 0x2a,
++ 0x5c, 0xb1, 0xab, 0x39, 0x76, 0x2b, 0x9a, 0xb3, 0x47, 0x3c, 0xab, 0xd0,
++ 0x30, 0x76, 0x2f, 0xe7, 0x40, 0xca, 0x6a, 0xb4, 0x3f, 0x0b, 0x95, 0xe4,
++ 0x84, 0x9d, 0xe9, 0x9f, 0x3a, 0xf3, 0x4d, 0x77, 0x1f, 0x0e, 0xeb, 0x0a,
++ 0x3a, 0xe3, 0x5d, 0x35, 0x52, 0x23, 0x4f, 0x38, 0x75, 0xa6, 0x17, 0x6b,
++ 0x0b, 0x6d, 0xb8, 0x69, 0xc8, 0x71, 0x4e, 0x2f, 0x49, 0x22, 0x60, 0x06,
++ 0x88, 0x61, 0x01, 0x3c, 0x94, 0xae, 0xe1, 0x7f, 0x07, 0x15, 0x8c, 0xc9,
++ 0x2d, 0xaa, 0xbe, 0x7e, 0x9e, 0x47, 0xef, 0x29, 0x28, 0x12, 0xf7, 0x03,
++ 0x78, 0x80, 0xf1, 0x79, 0x45, 0x3a, 0x8c, 0x54, 0xc1, 0x71, 0x5e, 0xed,
++ 0x08, 0xe1, 0x7e, 0xd6, 0xef, 0x4a, 0xf7, 0xa3, 0x97, 0x76, 0x91, 0x1a,
++ 0xd3, 0xb5, 0x20, 0xe3, 0xfd, 0xba, 0x82, 0x9f, 0x31, 0xac, 0x01, 0xb7,
++ 0xec, 0xd2, 0xf0, 0x50, 0x21, 0xc0, 0xf8, 0xe6, 0x2c, 0x3d, 0x69, 0x58,
++ 0x57, 0x7a, 0xa0, 0x63, 0x63, 0x21, 0x84, 0x95, 0xe9, 0xc8, 0xb4, 0xbc,
++ 0x47, 0x7d, 0xd6, 0x88, 0xe1, 0xc1, 0x42, 0x18, 0xb7, 0xa5, 0x0f, 0x3d,
++ 0x34, 0x1f, 0xd6, 0xff, 0x98, 0x87, 0x36, 0x7c, 0xa6, 0xd0, 0x44, 0xf9,
++ 0x91, 0xf5, 0xaf, 0x28, 0x4d, 0xf8, 0xec, 0x98, 0x41, 0xf9, 0x2a, 0x6e,
++ 0xa5, 0x9c, 0x9b, 0xd3, 0x57, 0xe0, 0x81, 0xb1, 0x0e, 0xdc, 0x5b, 0x58,
++ 0x8c, 0xe5, 0x8c, 0x4f, 0x1b, 0x98, 0x1b, 0xe2, 0xbf, 0x00, 0xb7, 0x0d,
++ 0x89, 0xee, 0xa1, 0xbc, 0xda, 0x31, 0xc5, 0x7c, 0xdc, 0x00, 0x0d, 0x91,
++ 0xf7, 0x74, 0x72, 0x30, 0x03, 0xb7, 0xed, 0x5d, 0xec, 0xee, 0xc9, 0x37,
++ 0xc7, 0x2b, 0x91, 0xea, 0x56, 0xd0, 0x39, 0x24, 0x71, 0x56, 0xb8, 0x8d,
++ 0xc1, 0xb8, 0x1a, 0x65, 0x1b, 0x06, 0xe3, 0x6a, 0xf1, 0x7e, 0x6f, 0x46,
++ 0xd6, 0x2e, 0x7e, 0x42, 0xbe, 0x14, 0x47, 0xa7, 0x1b, 0xa3, 0xfd, 0xe4,
++ 0xd7, 0x16, 0xbc, 0x8c, 0xdd, 0x71, 0xda, 0xf8, 0xd2, 0x76, 0x89, 0xd5,
++ 0x3a, 0x06, 0xe8, 0x0f, 0x93, 0x83, 0xfa, 0x86, 0x69, 0xc5, 0x44, 0x61,
++ 0xaf, 0xc4, 0xc4, 0x10, 0x1e, 0x4c, 0x9b, 0x38, 0x29, 0xe7, 0xf8, 0xaf,
++ 0x4a, 0xae, 0xa8, 0x81, 0x6e, 0x3c, 0x80, 0xa8, 0x75, 0x8c, 0xb1, 0xfd,
++ 0x4c, 0xae, 0x01, 0x37, 0xed, 0x92, 0x32, 0xed, 0x78, 0x7d, 0xd4, 0x8b,
++ 0x9b, 0xd2, 0x9b, 0xf0, 0x44, 0xd6, 0x83, 0x11, 0xa3, 0xb9, 0x5f, 0x65,
++ 0xfc, 0xbc, 0xbe, 0x3d, 0x12, 0xfc, 0x3a, 0xb9, 0xea, 0xf4, 0x62, 0x46,
++ 0xe5, 0xb9, 0x1d, 0xe8, 0x64, 0xbf, 0x3a, 0x75, 0xf1, 0x49, 0x0b, 0xf7,
++ 0x76, 0x6c, 0xc2, 0xb1, 0xac, 0x6e, 0x3d, 0x29, 0xeb, 0x0c, 0xed, 0x7c,
++ 0x3e, 0xc7, 0x8b, 0x3e, 0x5d, 0x38, 0xad, 0x4e, 0xdf, 0x22, 0xeb, 0xd4,
++ 0x3b, 0x70, 0x92, 0xf6, 0xda, 0x9f, 0x5b, 0xca, 0xd8, 0x2f, 0x31, 0xdf,
++ 0x6f, 0x85, 0x59, 0xaf, 0xee, 0x3a, 0x05, 0x27, 0xf6, 0x09, 0xc7, 0x5a,
++ 0x8a, 0xbb, 0xa8, 0xa7, 0xce, 0xb4, 0x8a, 0xeb, 0xc7, 0xd6, 0xe0, 0xf4,
++ 0xce, 0x22, 0xe7, 0x7a, 0x35, 0x6e, 0x7d, 0x86, 0x9c, 0xab, 0x67, 0x16,
++ 0x39, 0x17, 0xb9, 0x5c, 0xec, 0x41, 0xc5, 0x8b, 0x68, 0x21, 0x41, 0x5e,
++ 0x21, 0xfc, 0x22, 0x8c, 0xa7, 0xf2, 0x1d, 0xb8, 0x25, 0xdd, 0x84, 0x71,
++ 0xf2, 0xad, 0x1c, 0xf1, 0x22, 0x97, 0x67, 0x5c, 0x19, 0x6d, 0xe4, 0xa5,
++ 0xf1, 0x5a, 0xc0, 0x4b, 0x77, 0xef, 0xad, 0xa5, 0x2d, 0x27, 0xbb, 0x25,
++ 0x4f, 0x23, 0xff, 0xcd, 0x4b, 0xac, 0x56, 0x98, 0xb7, 0xfe, 0xaf, 0x7a,
++ 0xc9, 0x4d, 0x83, 0xba, 0x82, 0xaf, 0x65, 0x35, 0xfc, 0x55, 0xfb, 0x76,
++ 0x25, 0xd9, 0xe0, 0xbe, 0x83, 0x4a, 0xdf, 0xb6, 0x70, 0x92, 0x63, 0xba,
++ 0x37, 0x2b, 0x76, 0x49, 0x19, 0xcc, 0xd1, 0x8f, 0x19, 0xf5, 0xd0, 0xea,
++ 0x35, 0x39, 0xd7, 0xc4, 0xd8, 0xc1, 0xf8, 0x6b, 0xa7, 0xc8, 0xa3, 0x5a,
++ 0xbb, 0x5b, 0x55, 0x8f, 0xbc, 0x9f, 0x67, 0x68, 0xaa, 0xf8, 0x58, 0x0a,
++ 0x15, 0x69, 0xbf, 0x55, 0x27, 0xf5, 0x97, 0x6c, 0x60, 0x3c, 0x68, 0x5d,
++ 0xff, 0xb2, 0xf0, 0xfb, 0x39, 0x11, 0x6d, 0x0a, 0x1b, 0xb0, 0xce, 0xd6,
++ 0x19, 0x03, 0xd7, 0x38, 0xbd, 0x9c, 0x87, 0x51, 0x7b, 0x03, 0xee, 0xb2,
++ 0x5b, 0xa7, 0x1e, 0xa7, 0x6d, 0xe1, 0xce, 0x0d, 0xe8, 0xe4, 0xb3, 0x91,
++ 0x4c, 0xf3, 0x74, 0x2f, 0x75, 0x7d, 0x7c, 0x76, 0xcc, 0x5d, 0xf7, 0x97,
++ 0x33, 0xe4, 0xa3, 0xe4, 0xd7, 0x5f, 0xcd, 0xb4, 0x26, 0x87, 0xd4, 0x1e,
++ 0x05, 0x73, 0x24, 0x97, 0x4c, 0x90, 0x53, 0x05, 0xf0, 0x99, 0xb4, 0x45,
++ 0x1f, 0x00, 0x6d, 0xae, 0x83, 0x79, 0xc5, 0x13, 0x4e, 0xbd, 0x19, 0x35,
++ 0x44, 0x3f, 0xeb, 0x0b, 0x4b, 0xf1, 0x14, 0x63, 0x6f, 0xf3, 0xb5, 0x7a,
++ 0xf0, 0x39, 0x68, 0xf0, 0x99, 0x3f, 0x75, 0x1a, 0xcc, 0x1a, 0x3c, 0x30,
++ 0x12, 0x4d, 0xdc, 0xc4, 0x38, 0xdb, 0x79, 0xad, 0x7e, 0xf4, 0x14, 0x63,
++ 0xe0, 0x7c, 0xd3, 0x96, 0xf3, 0x26, 0xe4, 0x3b, 0x01, 0xd7, 0xce, 0x4f,
++ 0xdb, 0xe2, 0x27, 0x3a, 0x71, 0x33, 0x84, 0xcf, 0xd1, 0xce, 0xdf, 0xb7,
++ 0x63, 0x98, 0x24, 0xdf, 0xf8, 0x2c, 0xfd, 0xe3, 0x8c, 0x1d, 0x49, 0x5d,
++ 0xa3, 0xea, 0xd8, 0x40, 0xff, 0x78, 0xd7, 0x4e, 0xd0, 0x77, 0x3e, 0xc6,
++ 0xab, 0x8d, 0xfe, 0x10, 0x63, 0x1d, 0x8d, 0x7e, 0x10, 0x72, 0xcf, 0x95,
++ 0x8e, 0x65, 0x9a, 0xbb, 0x1f, 0x42, 0x73, 0xec, 0x66, 0xa5, 0x8e, 0x79,
++ 0x6a, 0x10, 0xf7, 0x14, 0x6e, 0xc0, 0x89, 0x6c, 0x64, 0x9a, 0x39, 0xf9,
++ 0xc6, 0xa5, 0x0a, 0xee, 0x20, 0x67, 0x5b, 0x5f, 0xad, 0xb4, 0x4e, 0x3d,
++ 0xa5, 0x44, 0x68, 0x93, 0x8c, 0x97, 0xf4, 0xcf, 0xcf, 0xb2, 0xcc, 0x99,
++ 0x6c, 0x35, 0x36, 0x8c, 0xd8, 0xe8, 0xcf, 0x54, 0xa0, 0x6a, 0xa7, 0x1f,
++ 0xf7, 0x8f, 0xe9, 0xc8, 0x64, 0x64, 0x1d, 0xd9, 0x6f, 0xd5, 0x12, 0x37,
++ 0x46, 0x89, 0x0d, 0x2f, 0x2d, 0x01, 0xa6, 0xf7, 0xae, 0xc1, 0x81, 0x9d,
++ 0x3a, 0xe3, 0x5d, 0xd1, 0x3e, 0x82, 0x71, 0x97, 0x93, 0xa7, 0x84, 0x93,
++ 0x57, 0x99, 0x12, 0xfb, 0xa2, 0x3d, 0x8f, 0x50, 0x07, 0xb7, 0x15, 0xc4,
++ 0xee, 0x12, 0x9c, 0xa3, 0x30, 0x06, 0x69, 0x23, 0xfb, 0xec, 0x26, 0xe6,
++ 0xe6, 0x01, 0x58, 0xb4, 0x11, 0x4b, 0xde, 0x53, 0xa5, 0x8d, 0x58, 0xb4,
++ 0x11, 0x8b, 0x36, 0x62, 0xd1, 0x46, 0xac, 0xfc, 0x52, 0xe6, 0x4c, 0x3a,
++ 0xc6, 0xd9, 0xe6, 0xb6, 0x51, 0x72, 0xf7, 0xa0, 0xd8, 0x4a, 0x0c, 0x5f,
++ 0xcf, 0xf4, 0x2b, 0xda, 0x9d, 0x37, 0x60, 0x24, 0x7b, 0x23, 0x2f, 0x05,
++ 0xb7, 0xd2, 0x56, 0x1e, 0xcd, 0x89, 0xed, 0xe9, 0xee, 0xef, 0xd3, 0x3c,
++ 0x9b, 0xdf, 0x33, 0x1b, 0xd5, 0xe2, 0x03, 0x8c, 0x45, 0xee, 0x7d, 0x39,
++ 0x73, 0xec, 0xc7, 0x68, 0xfe, 0x82, 0x5f, 0x7c, 0x4f, 0xce, 0xab, 0xb4,
++ 0xcb, 0x6f, 0xc5, 0x74, 0x30, 0x0f, 0x90, 0x73, 0xee, 0x32, 0x4e, 0x19,
++ 0x57, 0x71, 0x4c, 0x55, 0x83, 0x9b, 0xf0, 0xf5, 0x41, 0x9d, 0xb1, 0xca,
++ 0xc0, 0x93, 0x39, 0x89, 0xe5, 0xe2, 0xdf, 0x32, 0x0f, 0xe2, 0xeb, 0x1e,
++ 0xd4, 0xb4, 0x7b, 0x11, 0x70, 0xfd, 0xbc, 0x39, 0xbc, 0x43, 0xb1, 0xe9,
++ 0x3b, 0xba, 0x9c, 0x03, 0x9d, 0x0a, 0xeb, 0x0d, 0x38, 0xbd, 0xbb, 0x1d,
++ 0xff, 0x6d, 0xa7, 0x87, 0x3c, 0xc0, 0x59, 0xfa, 0x52, 0x5c, 0x4f, 0x4e,
++ 0x2b, 0xd1, 0xd8, 0x2c, 0xa5, 0x1d, 0xf7, 0x90, 0xfb, 0x6f, 0x18, 0x8c,
++ 0x74, 0x33, 0x66, 0x1b, 0xb7, 0x28, 0x4b, 0x51, 0xc5, 0x1c, 0xa0, 0x8d,
++ 0x39, 0xc0, 0x83, 0xc4, 0x80, 0xaf, 0x66, 0xbc, 0x68, 0x59, 0x2c, 0xbf,
++ 0x4d, 0xa6, 0xbb, 0x6b, 0x3b, 0x2f, 0x90, 0xa3, 0xce, 0x37, 0x3b, 0xe4,
++ 0x2c, 0x8e, 0x72, 0xf6, 0xba, 0x29, 0x24, 0x28, 0x7f, 0xcc, 0xcd, 0x2f,
++ 0x12, 0x38, 0x98, 0x27, 0x6e, 0x70, 0xdc, 0xaf, 0xb4, 0xfd, 0x84, 0xf9,
++ 0xb0, 0x70, 0x7b, 0x13, 0x13, 0x39, 0x97, 0xff, 0x47, 0xea, 0x88, 0x19,
++ 0xd9, 0x41, 0xbd, 0xcb, 0xaf, 0x9a, 0x78, 0x64, 0xaf, 0xf8, 0xb0, 0x89,
++ 0xf6, 0x21, 0x3d, 0x7c, 0x9b, 0x1a, 0x0d, 0xae, 0xe3, 0xb3, 0x05, 0x9c,
++ 0xcf, 0xc7, 0x33, 0x32, 0x8f, 0x1a, 0x5a, 0x18, 0x9b, 0xdf, 0x9c, 0xd0,
++ 0xb1, 0x88, 0x71, 0xfa, 0x9d, 0x89, 0x18, 0x96, 0x32, 0x66, 0x3b, 0xcc,
++ 0x1f, 0x12, 0x19, 0xf1, 0x45, 0xf2, 0x81, 0x09, 0x8d, 0x71, 0x56, 0xd6,
++ 0x87, 0x9e, 0xc0, 0xd8, 0x6a, 0x0d, 0xfb, 0xdc, 0xf3, 0x7c, 0x7e, 0xab,
++ 0x81, 0x58, 0xd9, 0x39, 0xe0, 0xc7, 0xa7, 0x87, 0x36, 0xe3, 0xf5, 0xc5,
++ 0xc2, 0x95, 0xd6, 0x38, 0xa2, 0x9f, 0xc7, 0x29, 0x73, 0x8c, 0xbc, 0x78,
++ 0x94, 0x79, 0xd7, 0xc2, 0x7d, 0x6b, 0xf0, 0xc9, 0x5d, 0x17, 0xf2, 0xb4,
++ 0x33, 0x71, 0xeb, 0x6e, 0xda, 0xc4, 0xfa, 0x00, 0x6d, 0xa2, 0x96, 0x36,
++ 0x61, 0x67, 0xa2, 0xc9, 0x02, 0x6d, 0x22, 0x46, 0xdc, 0xc8, 0x0e, 0x48,
++ 0x39, 0xf7, 0x9d, 0x99, 0xbb, 0xe4, 0xdd, 0x65, 0x83, 0xbe, 0xb3, 0x75,
++ 0xc0, 0xd9, 0xec, 0x65, 0xbc, 0x79, 0xa4, 0xa3, 0x89, 0xd8, 0x72, 0x23,
++ 0xf6, 0x0c, 0x36, 0xa1, 0x85, 0x31, 0x63, 0x61, 0x1a, 0x77, 0x84, 0xa1,
++ 0xce, 0x0f, 0x23, 0xb2, 0xe1, 0x1d, 0x44, 0xa7, 0xef, 0x56, 0x5a, 0x8f,
++ 0xbe, 0xa8, 0x44, 0x36, 0xfe, 0x84, 0x36, 0x7c, 0x56, 0x91, 0xb6, 0x9b,
++ 0x70, 0x35, 0xfd, 0xe4, 0x2a, 0xfa, 0x84, 0xc6, 0x5c, 0x52, 0x63, 0xdd,
++ 0xfe, 0x41, 0x1f, 0xe6, 0x33, 0xd7, 0x93, 0xb3, 0xca, 0xb1, 0x31, 0x2f,
++ 0xb2, 0x3b, 0xf5, 0xa9, 0x47, 0xd0, 0x08, 0x63, 0xec, 0x46, 0x6c, 0x1d,
++ 0xd4, 0x10, 0xe5, 0xbd, 0xbe, 0x9d, 0x0b, 0xd0, 0x4c, 0xfb, 0xd6, 0xe8,
++ 0xa7, 0xbd, 0x83, 0x2a, 0x16, 0x8c, 0xdd, 0x80, 0x1d, 0x83, 0x0a, 0xee,
++ 0x8b, 0x2a, 0x68, 0x19, 0x91, 0x1c, 0x2c, 0x86, 0xa7, 0x32, 0xc2, 0x15,
++ 0xa1, 0xb4, 0x5c, 0x4b, 0x8e, 0x4c, 0xee, 0xf9, 0x93, 0x9c, 0xcc, 0xb9,
++ 0xe8, 0x53, 0x7e, 0x53, 0xa6, 0x1d, 0x9f, 0xdb, 0xd9, 0x80, 0xab, 0x76,
++ 0xeb, 0xd6, 0x69, 0xc5, 0x59, 0x7a, 0x80, 0x7c, 0xde, 0xaf, 0x16, 0xe7,
++ 0xfc, 0xc1, 0xc1, 0x67, 0x19, 0x2f, 0x7e, 0xe2, 0x04, 0xf5, 0xa5, 0xe8,
++ 0x8b, 0x27, 0xb1, 0xb6, 0xa3, 0x1d, 0x6b, 0xf7, 0x8a, 0xbe, 0x1c, 0xe6,
++ 0x87, 0xcc, 0xfd, 0x26, 0xa7, 0xf0, 0x0e, 0xfd, 0x77, 0x11, 0x39, 0xed,
++ 0x52, 0xc6, 0x89, 0x37, 0x16, 0x9b, 0xd4, 0x9f, 0xee, 0x9e, 0xf5, 0x9b,
++ 0x67, 0x9a, 0xa8, 0x1d, 0xd4, 0x19, 0x67, 0x4c, 0xcc, 0xda, 0x2b, 0xed,
++ 0x99, 0xb8, 0x67, 0x50, 0x4f, 0x3d, 0xcd, 0xb9, 0x14, 0xbb, 0x11, 0xcc,
++ 0xae, 0x61, 0xec, 0x3f, 0x39, 0x29, 0x38, 0xd5, 0x89, 0x13, 0xcc, 0x03,
++ 0xde, 0x7c, 0x2c, 0xda, 0xfd, 0x33, 0xe6, 0x74, 0xef, 0x50, 0x46, 0x96,
++ 0xfd, 0x1b, 0xe0, 0xbc, 0x56, 0xa4, 0xf5, 0x8d, 0xff, 0x8c, 0x28, 0xfd,
++ 0xbb, 0x0b, 0xb5, 0xd4, 0xc9, 0x81, 0xc1, 0x95, 0xf0, 0xd3, 0x16, 0x1e,
++ 0xc9, 0x88, 0xdd, 0x10, 0xbf, 0x77, 0x7e, 0x02, 0x5b, 0xf7, 0x17, 0xf3,
++ 0xbc, 0x7b, 0x06, 0x36, 0xd1, 0xc6, 0x85, 0xb3, 0xc7, 0x68, 0xef, 0x98,
++ 0xe7, 0x43, 0xb2, 0x9e, 0x18, 0x91, 0x58, 0x4e, 0xcc, 0x7c, 0xd4, 0x20,
++ 0xae, 0xd6, 0x47, 0xc2, 0x2d, 0xaa, 0x95, 0x60, 0x5e, 0x17, 0xbe, 0x0f,
++ 0xd2, 0xbe, 0x85, 0x75, 0x4b, 0x36, 0x61, 0x4f, 0xd6, 0x8b, 0xaa, 0xc5,
++ 0x1e, 0xe2, 0xb1, 0x60, 0x94, 0x15, 0x94, 0xe7, 0x6b, 0x21, 0x7e, 0x22,
++ 0xf3, 0xeb, 0xc1, 0x99, 0x78, 0xf3, 0x86, 0xac, 0xfc, 0x96, 0x05, 0x73,
++ 0xbe, 0xcf, 0xa2, 0x83, 0x73, 0x2f, 0xfe, 0x98, 0xc0, 0x3d, 0x63, 0xc2,
++ 0xd5, 0xc8, 0xe7, 0x6c, 0x3f, 0xfe, 0x3a, 0x2b, 0x9c, 0x6e, 0x33, 0xee,
++ 0x69, 0x2f, 0xe7, 0x6e, 0x62, 0x77, 0xad, 0xd3, 0x1e, 0x34, 0x93, 0x93,
++ 0xe9, 0xb9, 0xac, 0x1a, 0xb1, 0x52, 0x88, 0xf4, 0xa7, 0x20, 0x71, 0xa2,
++ 0xd5, 0xe2, 0x0c, 0x53, 0x36, 0xb9, 0xa5, 0xed, 0x41, 0x1d, 0x7d, 0x5c,
++ 0x7e, 0x44, 0xae, 0x9d, 0xf6, 0xf3, 0xac, 0x5d, 0x0d, 0xcd, 0xb5, 0x75,
++ 0x2f, 0x96, 0x16, 0x2c, 0xe2, 0xed, 0x52, 0xb4, 0x3d, 0x16, 0xc0, 0x35,
++ 0xe4, 0x26, 0x57, 0xa7, 0x9f, 0x70, 0x66, 0x11, 0x7b, 0xdb, 0x46, 0xa2,
++ 0xc1, 0x23, 0xe4, 0x81, 0x07, 0x96, 0xfc, 0xd4, 0xf1, 0x98, 0xae, 0x5f,
++ 0x68, 0xf4, 0x00, 0xe7, 0x33, 0x1d, 0xfa, 0xd4, 0x0e, 0x04, 0x90, 0x20,
++ 0x7e, 0x5e, 0x99, 0x69, 0x40, 0xfb, 0xee, 0x7e, 0xce, 0x7f, 0x10, 0x57,
++ 0xf2, 0xfb, 0x62, 0xc6, 0x37, 0x8d, 0xd8, 0xaa, 0xc9, 0xe7, 0x82, 0xd8,
++ 0x4b, 0x98, 0x7e, 0xe4, 0x2c, 0xbd, 0xb3, 0xdd, 0xba, 0x63, 0x36, 0xf5,
++ 0xd5, 0x42, 0x5c, 0x5e, 0x9a, 0x89, 0x6c, 0xbc, 0x59, 0x51, 0xb0, 0xb2,
++ 0xdd, 0x60, 0xdb, 0x01, 0xc4, 0x32, 0xb2, 0x36, 0x70, 0xe8, 0xa1, 0x3a,
++ 0x58, 0xad, 0x01, 0xda, 0xe9, 0x11, 0x45, 0xd6, 0x35, 0x44, 0x6f, 0x4d,
++ 0xb8, 0x8a, 0x7c, 0x44, 0x23, 0x66, 0xc7, 0x0a, 0xa2, 0x43, 0x60, 0x6d,
++ 0x6e, 0x0d, 0xf6, 0x0c, 0x8b, 0x7f, 0x0a, 0x76, 0x3a, 0x4e, 0xe5, 0xe2,
++ 0xa8, 0xf1, 0x36, 0x75, 0xf8, 0xc6, 0x84, 0x60, 0x90, 0x82, 0x79, 0xb4,
++ 0x63, 0x55, 0x97, 0x58, 0x2b, 0xb8, 0x15, 0xa6, 0xdf, 0x76, 0xe0, 0xd3,
++ 0x8c, 0x6d, 0xd5, 0x9c, 0x83, 0x55, 0x4b, 0x9a, 0xe8, 0xbf, 0xc4, 0xc9,
++ 0x89, 0x20, 0xaf, 0x10, 0x8e, 0xef, 0x6f, 0xe4, 0xa5, 0xf1, 0x5a, 0xc0,
++ 0x4b, 0xe7, 0x3d, 0x15, 0x67, 0xf6, 0x93, 0x33, 0xed, 0x15, 0x0e, 0x22,
++ 0x3e, 0xe8, 0xc7, 0xd3, 0x13, 0x20, 0x8f, 0x31, 0xc8, 0x43, 0x04, 0xff,
++ 0x64, 0x9e, 0x98, 0xc7, 0x0c, 0xc6, 0x11, 0x1d, 0x29, 0x72, 0x8e, 0x93,
++ 0xc3, 0x7a, 0xcf, 0x5a, 0x44, 0xb5, 0xbf, 0x26, 0x7e, 0x9d, 0x1a, 0x6d,
++ 0xc7, 0x74, 0x96, 0xb8, 0xb5, 0xb8, 0x1d, 0x6f, 0xe7, 0x36, 0xd1, 0xff,
++ 0x55, 0x9c, 0x25, 0x66, 0x69, 0x73, 0x05, 0xd7, 0x05, 0x43, 0xfd, 0xb4,
++ 0xd7, 0x0e, 0x59, 0x03, 0x55, 0xe2, 0xc4, 0xac, 0x6b, 0xd2, 0xcf, 0x3a,
++ 0xb5, 0x3a, 0x73, 0x2a, 0x35, 0x81, 0x0c, 0x31, 0xcb, 0xce, 0xca, 0x7c,
++ 0x6d, 0xc6, 0x56, 0xe2, 0xd5, 0xd6, 0x9c, 0xd8, 0x37, 0x6d, 0x7a, 0x50,
++ 0x0f, 0x16, 0x68, 0xdb, 0xea, 0x5e, 0x91, 0x61, 0xa2, 0x8f, 0xb1, 0xfd,
++ 0x33, 0x1d, 0x26, 0x76, 0xe4, 0x24, 0x0e, 0x0a, 0x07, 0xd3, 0x98, 0x97,
++ 0x24, 0xd1, 0x43, 0x9c, 0x7a, 0xdb, 0xee, 0xc4, 0x0a, 0xe2, 0xd4, 0x2f,
++ 0x98, 0xa7, 0xdc, 0x49, 0x9c, 0x7a, 0xc3, 0x2e, 0xe2, 0xd4, 0xcd, 0x13,
++ 0x62, 0x0b, 0x45, 0x5e, 0x7e, 0xc2, 0x6e, 0x6b, 0x90, 0xdf, 0x39, 0xab,
++ 0x36, 0x7f, 0x57, 0x5c, 0x58, 0x85, 0x97, 0x86, 0xcb, 0x7b, 0xc5, 0x91,
++ 0xe4, 0xed, 0xe4, 0xcc, 0x47, 0x47, 0xcb, 0x9c, 0xf7, 0xb8, 0x9b, 0x5b,
++ 0xcf, 0x32, 0xcb, 0xfb, 0x96, 0xe5, 0xfd, 0x06, 0x0b, 0x5f, 0x5d, 0x22,
++ 0x3c, 0x53, 0xd6, 0x81, 0x2a, 0xc8, 0x27, 0xbb, 0x31, 0xbe, 0xf3, 0x3d,
++ 0x3c, 0x32, 0xa8, 0xde, 0x5c, 0xc3, 0xd8, 0x7a, 0x8b, 0xb2, 0x19, 0x9e,
++ 0xb8, 0xbc, 0x47, 0x2a, 0x6b, 0xe5, 0xcc, 0x5d, 0x26, 0xb3, 0xe8, 0xdb,
++ 0x57, 0x83, 0x43, 0x41, 0xc7, 0x79, 0xda, 0x98, 0x27, 0x3f, 0x13, 0x20,
++ 0xb8, 0x19, 0xa8, 0xa0, 0x2f, 0xdc, 0xfc, 0x5b, 0xbf, 0xdd, 0x58, 0xde,
++ 0x3b, 0xd8, 0x88, 0xbb, 0x76, 0x3d, 0x8c, 0x9e, 0x5d, 0x7f, 0x8b, 0x4f,
++ 0x0e, 0x2d, 0xec, 0x9f, 0xe7, 0x71, 0x9c, 0xab, 0xdb, 0xa7, 0x70, 0x2a,
++ 0xce, 0xd8, 0x18, 0x52, 0xf0, 0xbd, 0xab, 0x16, 0x8a, 0x1c, 0xfe, 0xbd,
++ 0xef, 0x68, 0xae, 0xbc, 0x5b, 0x4b, 0x3e, 0x92, 0x98, 0xc3, 0xf1, 0x53,
++ 0xf6, 0x8a, 0xfa, 0xd2, 0xbb, 0xc2, 0x7f, 0x40, 0x5b, 0x3f, 0x16, 0x19,
++ 0xfc, 0x2b, 0xcb, 0x78, 0xcd, 0x49, 0xae, 0x96, 0x7a, 0x15, 0xa5, 0x36,
++ 0xfe, 0x96, 0x9c, 0x90, 0xbc, 0xd0, 0xe0, 0xff, 0x91, 0xeb, 0x44, 0x3e,
++ 0x9f, 0x95, 0xe5, 0xbf, 0xe4, 0x24, 0xbb, 0xe5, 0xbb, 0x94, 0x59, 0xc7,
++ 0x67, 0x52, 0xae, 0xfc, 0xec, 0xf9, 0x92, 0x9c, 0x4a, 0x68, 0x0d, 0x45,
++ 0x39, 0x9f, 0xa6, 0x9c, 0x33, 0x8b, 0x93, 0x50, 0xaf, 0x9d, 0x29, 0xab,
++ 0xdc, 0xee, 0xff, 0x3a, 0x2f, 0xab, 0x58, 0xee, 0x6f, 0xe6, 0xc8, 0xbe,
++ 0x80, 0x7a, 0xed, 0xcc, 0x75, 0xf2, 0x0a, 0xfa, 0x6f, 0x34, 0xb8, 0xd5,
++ 0x5d, 0x9f, 0x36, 0xb0, 0xf6, 0xe2, 0x1c, 0x4b, 0xb0, 0x03, 0xe3, 0x76,
++ 0xb0, 0x94, 0x53, 0xc9, 0x2d, 0x13, 0x5f, 0x66, 0xce, 0xf6, 0x94, 0x1d,
++ 0xe9, 0x5a, 0xa7, 0xb4, 0x26, 0x17, 0x31, 0xce, 0xa0, 0x5e, 0xd6, 0xb0,
++ 0x13, 0xee, 0xef, 0xf9, 0xe5, 0xa3, 0x09, 0xe4, 0x69, 0x8f, 0xaf, 0xd8,
++ 0x91, 0x0d, 0xa7, 0xdc, 0xfd, 0x3b, 0x13, 0x2f, 0xe7, 0x5f, 0x2d, 0xed,
++ 0x33, 0x95, 0x7f, 0x4f, 0x6c, 0xe6, 0x1a, 0xaa, 0xcc, 0xbf, 0x9c, 0xb1,
++ 0x6e, 0x90, 0xb5, 0x0a, 0xcb, 0xa2, 0x9f, 0xf7, 0x66, 0xac, 0xb0, 0x8a,
++ 0xeb, 0x90, 0x0a, 0xc9, 0xbe, 0xc4, 0xd6, 0xd2, 0x6f, 0x52, 0xb1, 0xde,
++ 0xef, 0x58, 0x13, 0x02, 0x8c, 0xd2, 0x39, 0xb6, 0x18, 0xac, 0xc9, 0x2b,
++ 0xc8, 0xc5, 0x64, 0xbd, 0x01, 0xd6, 0x6c, 0x53, 0x43, 0x48, 0x3f, 0xcc,
++ 0x71, 0xfb, 0x30, 0x87, 0xf9, 0x54, 0x7c, 0x61, 0x6b, 0x77, 0xbb, 0x3a,
++ 0x57, 0x70, 0x36, 0x98, 0x54, 0x63, 0x12, 0x07, 0x50, 0x99, 0x96, 0xb3,
++ 0x26, 0x56, 0x97, 0x9f, 0x98, 0xba, 0x98, 0xd8, 0x52, 0x11, 0x85, 0xf7,
++ 0xbe, 0xbc, 0x17, 0xc1, 0x85, 0xbf, 0x70, 0x7e, 0x18, 0x8a, 0x61, 0xdb,
++ 0x64, 0xb9, 0x0f, 0x06, 0xfe, 0x7b, 0xe1, 0xd2, 0x8c, 0xb3, 0x2c, 0xf3,
++ 0x3d, 0x27, 0x39, 0x47, 0xda, 0x2e, 0xca, 0xfd, 0xe8, 0xbe, 0x4a, 0x1f,
++ 0xa5, 0xaf, 0xcd, 0x1a, 0x51, 0x15, 0x5b, 0x8d, 0x89, 0x39, 0xf2, 0x9b,
++ 0x3f, 0xf7, 0xb8, 0x67, 0xd3, 0x65, 0x0e, 0xe4, 0xfd, 0xf1, 0x04, 0xee,
++ 0x93, 0xf7, 0x30, 0x19, 0xb3, 0xee, 0xcd, 0xbb, 0xef, 0x77, 0x42, 0x7e,
++ 0x17, 0xf1, 0xde, 0x7c, 0x51, 0x7f, 0x0f, 0xe5, 0x03, 0xe4, 0xdd, 0x01,
++ 0xcb, 0x6b, 0x6e, 0x80, 0x4f, 0x97, 0x33, 0x67, 0x65, 0x5d, 0xfe, 0xdf,
++ 0x73, 0x24, 0x97, 0xff, 0x2a, 0xfd, 0xc9, 0xbb, 0x50, 0x3e, 0x5b, 0xf2,
++ 0xae, 0xa2, 0x52, 0xfc, 0x7c, 0xc6, 0x7d, 0xef, 0x5d, 0x35, 0xd7, 0xd1,
++ 0x2f, 0x67, 0xbb, 0xef, 0xeb, 0x89, 0x7e, 0x42, 0xa6, 0xe5, 0xcc, 0xd6,
++ 0x03, 0xb4, 0x91, 0xde, 0x39, 0xa5, 0x77, 0x0f, 0xba, 0xee, 0x20, 0x8e,
++ 0x2c, 0x22, 0xb7, 0x5a, 0xac, 0x44, 0xb4, 0x55, 0x4a, 0x37, 0xeb, 0x51,
++ 0x4f, 0x05, 0x91, 0xa1, 0xb8, 0xbf, 0xbd, 0xeb, 0xa3, 0x8c, 0xfd, 0x76,
++ 0xab, 0xe6, 0x53, 0x7f, 0x5e, 0x3a, 0x7b, 0x2d, 0x7b, 0xf1, 0x29, 0x3c,
++ 0x6f, 0xcf, 0xc1, 0xd4, 0x6f, 0xc9, 0x3d, 0xbf, 0x66, 0xfd, 0x4f, 0x41,
++ 0x62, 0x88, 0x4f, 0x8f, 0x6c, 0x8c, 0x7b, 0x22, 0xeb, 0xa7, 0xe9, 0xd3,
++ 0x85, 0xb8, 0x9e, 0xfa, 0x1a, 0xdb, 0xf8, 0x3e, 0xb9, 0x85, 0x3d, 0x43,
++ 0x7e, 0x51, 0x56, 0x6b, 0x4f, 0x85, 0x7a, 0xc6, 0x29, 0xbe, 0x77, 0x2d,
++ 0xbf, 0xfb, 0xbb, 0x06, 0xc1, 0xb4, 0xe5, 0x84, 0x28, 0x73, 0xbe, 0x19,
++ 0xd9, 0x53, 0xaf, 0xea, 0xd9, 0xcf, 0xab, 0x9b, 0xb1, 0x56, 0x8e, 0x7c,
++ 0x98, 0x11, 0xed, 0xd3, 0xb4, 0x8f, 0x76, 0x57, 0x46, 0x32, 0x56, 0x81,
++ 0x8f, 0x3a, 0xd3, 0xc6, 0xf1, 0x41, 0xd6, 0x28, 0x59, 0xce, 0xdd, 0xe3,
++ 0x97, 0xf7, 0x77, 0x98, 0x63, 0xdb, 0xf2, 0xbb, 0xa6, 0x6e, 0x33, 0xa5,
++ 0x7d, 0x24, 0xe6, 0xc8, 0x8c, 0x97, 0xf7, 0xc8, 0x6f, 0xc8, 0x55, 0x07,
++ 0x70, 0xaf, 0x2d, 0xeb, 0x0e, 0xff, 0x3f, 0x45, 0x18, 0xff, 0x64, 0x3c,
++ 0x59, 0x00, 0x00, 0x00 };
+
+ static const u32 bnx2_CP_b09FwData[(0x84/4) + 1] = {
+ 0x00000000, 0x0000001b, 0x0000000f, 0x0000000a, 0x00000008, 0x00000006,
+@@ -2057,1088 +2079,1076 @@
+ 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002,
+ 0x00000001, 0x00000001, 0x00000001, 0x00000000 };
+ static const u32 bnx2_CP_b09FwRodata[(0x16c/4) + 1] = {
+- 0x80080100, 0x80080080, 0x80080000, 0x08001800, 0x08001800, 0x08001838,
+- 0x08001838, 0x0800184c, 0x0800181c, 0x08001a74, 0x08001a40, 0x08001acc,
+- 0x08001acc, 0x08001b54, 0x08001a84, 0x80080240, 0x080021c4, 0x08002010,
+- 0x080021ec, 0x08002284, 0x080023d4, 0x08002420, 0x08002544, 0x0800244c,
+- 0x080024d0, 0x08002080, 0x080029f8, 0x0800299c, 0x0800202c, 0x0800202c,
+- 0x0800202c, 0x080025b8, 0x080025b8, 0x0800202c, 0x0800202c, 0x08002874,
+- 0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c, 0x080028d4, 0x0800202c,
+- 0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c,
+- 0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c,
+- 0x0800202c, 0x08002440, 0x0800202c, 0x0800202c, 0x08002944, 0x0800202c,
+- 0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c,
+- 0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c,
+- 0x0800202c, 0x0800202c, 0x0800202c, 0x0800202c, 0x08002798, 0x0800202c,
+- 0x0800202c, 0x08002700, 0x0800265c, 0x080037c0, 0x08003794, 0x08003760,
+- 0x08003734, 0x08003714, 0x080036c8, 0x80080100, 0x80080080, 0x80080000,
++ 0x80080100, 0x80080080, 0x80080000, 0x08001744, 0x08001744, 0x0800177c,
++ 0x0800177c, 0x08001790, 0x08001760, 0x080019b8, 0x08001984, 0x08001a10,
++ 0x08001a10, 0x08001a98, 0x080019c8, 0x80080240, 0x08003260, 0x080031cc,
++ 0x08003288, 0x080032b0, 0x080032d8, 0x080032fc, 0x08003344, 0x08003320,
++ 0x08003368, 0x08003234, 0x0800345c, 0x0800344c, 0x080031e8, 0x080031e8,
++ 0x080031e8, 0x080033bc, 0x080033bc, 0x080031e8, 0x080031e8, 0x0800343c,
++ 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, 0x0800342c, 0x080031e8,
++ 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8,
++ 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8,
++ 0x080031e8, 0x0800341c, 0x080031e8, 0x080031e8, 0x0800340c, 0x080031e8,
++ 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8,
++ 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8,
++ 0x080031e8, 0x080031e8, 0x080031e8, 0x080031e8, 0x080033f4, 0x080031e8,
++ 0x080031e8, 0x080033e4, 0x080033d4, 0x08003d6c, 0x08003d40, 0x08003d0c,
++ 0x08003ce0, 0x08003cc0, 0x08003c74, 0x80080100, 0x80080080, 0x80080000,
+ 0x80080080, 0x00000000 };
+
+ static struct fw_info bnx2_cp_fw_09 = {
+- /* Firmware version: 4.6.15 */
++ /* Firmware version: 4.4.23 */
+ .ver_major = 0x4,
+- .ver_minor = 0x6,
+- .ver_fix = 0xf,
++ .ver_minor = 0x4,
++ .ver_fix = 0x17,
+
+ .start_addr = 0x08000080,
+
+ .text_addr = 0x08000000,
+- .text_len = 0x5418,
++ .text_len = 0x5938,
+ .text_index = 0x0,
+ .gz_text = bnx2_CP_b09FwText,
+ .gz_text_len = sizeof(bnx2_CP_b09FwText),
+
+- .data_addr = 0x080055a0,
++ .data_addr = 0x08005ac0,
+ .data_len = 0x84,
+ .data_index = 0x0,
+ .data = bnx2_CP_b09FwData,
+
+- .sbss_addr = 0x08005624,
++ .sbss_addr = 0x08005b44,
+ .sbss_len = 0x91,
+ .sbss_index = 0x0,
+
+- .bss_addr = 0x080056b8,
++ .bss_addr = 0x08005bd8,
+ .bss_len = 0x19c,
+ .bss_index = 0x0,
+
+- .rodata_addr = 0x08005418,
++ .rodata_addr = 0x08005938,
+ .rodata_len = 0x16c,
+ .rodata_index = 0x0,
+ .rodata = bnx2_CP_b09FwRodata,
+ };
+
+ static u8 bnx2_RXP_b09FwText[] = {
+- 0xec, 0x5c, 0x7d, 0x70, 0x1c, 0xe5, 0x79, 0xff, 0xbd, 0x7b, 0x7b, 0xd2,
+- 0x4a, 0x3a, 0x9d, 0x56, 0xa7, 0x93, 0x7c, 0x22, 0x04, 0xef, 0xa2, 0x3d,
+- 0xf9, 0xb0, 0x0c, 0xec, 0x9d, 0x4f, 0xb6, 0xa0, 0xdb, 0xb2, 0x83, 0x0d,
+- 0x11, 0x21, 0x13, 0x84, 0x4d, 0x52, 0x33, 0x49, 0x27, 0x37, 0xc6, 0x18,
+- 0x81, 0x4d, 0x70, 0x0d, 0x6d, 0x55, 0x86, 0x19, 0x6f, 0x2c, 0x7f, 0x01,
+- 0x27, 0x9d, 0x62, 0x64, 0x63, 0xd2, 0x0e, 0x68, 0x6c, 0x59, 0x08, 0x7c,
+- 0xd2, 0x61, 0x20, 0xad, 0xe8, 0x84, 0xfa, 0x26, 0xd8, 0xe0, 0x94, 0xcf,
+- 0x21, 0x0c, 0xc3, 0x1f, 0xcd, 0xa0, 0x62, 0x3e, 0xcc, 0x94, 0xa1, 0x26,
+- 0x38, 0xa9, 0xdd, 0xb8, 0x7e, 0xfb, 0x3c, 0x7b, 0x3a, 0x9b, 0x90, 0x26,
+- 0x9d, 0xfc, 0xd1, 0xff, 0xf6, 0x99, 0xb9, 0xb9, 0xbd, 0x77, 0xdf, 0xf7,
+- 0xf9, 0xfe, 0x7c, 0x3d, 0xf2, 0x5f, 0x47, 0x50, 0x8f, 0x39, 0x68, 0xa4,
+- 0x4f, 0x76, 0xc3, 0xc0, 0xc6, 0xf4, 0x65, 0x4b, 0x2e, 0xa3, 0xc7, 0xee,
+- 0x50, 0x53, 0x8d, 0xca, 0xeb, 0x02, 0x01, 0x04, 0x10, 0x40, 0x00, 0x01,
+- 0x04, 0x10, 0x40, 0x00, 0x01, 0x04, 0x10, 0x40, 0x00, 0x01, 0x04, 0x10,
+- 0x40, 0x00, 0x01, 0x04, 0x10, 0x40, 0x00, 0x01, 0x04, 0x10, 0x40, 0x00,
+- 0x01, 0x04, 0x10, 0x40, 0x00, 0x01, 0x04, 0x10, 0x40, 0x00, 0x01, 0x04,
+- 0x10, 0x40, 0x00, 0x01, 0x04, 0x10, 0x40, 0x00, 0x01, 0x04, 0x10, 0x40,
+- 0x00, 0x01, 0x04, 0x10, 0x40, 0x00, 0x01, 0xfc, 0x7f, 0x40, 0x08, 0xd0,
+- 0xf9, 0xbb, 0x71, 0xee, 0x03, 0x4d, 0x71, 0xdc, 0x7b, 0xaf, 0xb6, 0xa0,
+- 0x85, 0x9c, 0x99, 0x7b, 0x6f, 0xb1, 0x00, 0xb7, 0xd8, 0x65, 0x2c, 0xc3,
+- 0x7f, 0x4b, 0x2f, 0xae, 0x82, 0xd7, 0xbf, 0xea, 0x9c, 0x79, 0xec, 0xf9,
+- 0xa5, 0xe6, 0x89, 0xb1, 0x10, 0x34, 0xdd, 0x79, 0x27, 0xad, 0x77, 0x42,
+- 0xbb, 0x90, 0xce, 0xfc, 0xfd, 0x82, 0x95, 0x31, 0x44, 0xab, 0xb8, 0xe0,
+- 0x29, 0x8e, 0x94, 0xfb, 0x6d, 0x89, 0x17, 0x6d, 0x4f, 0x2c, 0xcb, 0xc2,
+- 0xd3, 0x9c, 0x19, 0x51, 0x37, 0x74, 0x56, 0x1a, 0xe1, 0x0a, 0xe5, 0x35,
+- 0x45, 0x05, 0xaa, 0xa5, 0xe1, 0xd6, 0xf1, 0x7a, 0xac, 0x1d, 0x6b, 0xc0,
+- 0x9a, 0xb1, 0x04, 0x6e, 0x2b, 0x42, 0x0f, 0x39, 0x1a, 0x66, 0x43, 0x33,
+- 0x22, 0x34, 0x85, 0x5c, 0xd8, 0x39, 0x75, 0xc3, 0xde, 0xfc, 0x59, 0xe9,
+- 0xfa, 0x7f, 0x63, 0x52, 0xbe, 0x61, 0xdc, 0x7f, 0x0f, 0x45, 0x75, 0x0e,
+- 0xd3, 0x33, 0xef, 0x3b, 0x75, 0xc3, 0xbe, 0xe2, 0x71, 0xf9, 0xfc, 0x82,
+- 0x38, 0x0e, 0x95, 0x74, 0x3c, 0x55, 0xda, 0x4f, 0x3c, 0x98, 0x9e, 0x07,
+- 0xcd, 0x53, 0x1d, 0x0f, 0x5b, 0xb3, 0x61, 0x4c, 0x8c, 0x9c, 0x95, 0x21,
+- 0xcb, 0x34, 0xa0, 0x58, 0xfa, 0x0b, 0xa0, 0x7d, 0x05, 0xda, 0x57, 0x08,
+- 0x63, 0xef, 0x58, 0x29, 0x86, 0xfa, 0x04, 0x9e, 0x5f, 0xc0, 0xe7, 0xf9,
+- 0x2c, 0xe3, 0x78, 0x3b, 0x5a, 0x3d, 0x5f, 0x43, 0xe7, 0x8f, 0x64, 0x81,
+- 0xf1, 0x91, 0x3e, 0x3a, 0x2a, 0x31, 0x68, 0xd7, 0x62, 0xb5, 0x0e, 0xaf,
+- 0xce, 0x61, 0x5c, 0x55, 0x3c, 0x9e, 0x30, 0xa6, 0x8e, 0x34, 0x55, 0xf0,
+- 0x40, 0x68, 0x16, 0xbc, 0xda, 0x2f, 0xbd, 0x3f, 0x5e, 0xac, 0xbe, 0xdf,
+- 0x41, 0x74, 0x34, 0xd2, 0xc3, 0x06, 0xfc, 0x73, 0xa9, 0x1f, 0xff, 0x50,
+- 0xca, 0xe1, 0xd9, 0x52, 0x1f, 0xd1, 0xbd, 0x87, 0xe8, 0xae, 0xc7, 0x3f,
+- 0x96, 0xd6, 0xe0, 0xc7, 0xa5, 0xef, 0xe2, 0x99, 0xd2, 0x2a, 0x3c, 0x5d,
+- 0xba, 0x09, 0x07, 0x4b, 0x1e, 0xc2, 0xdd, 0x8c, 0x2f, 0x25, 0x3e, 0xcb,
+- 0xd7, 0x11, 0x1f, 0x5b, 0x30, 0x5b, 0x64, 0x79, 0x24, 0x46, 0x6c, 0x73,
+- 0x0c, 0x58, 0x90, 0xa8, 0x81, 0xc0, 0x6a, 0xdb, 0x7c, 0x0a, 0xb8, 0x0d,
+- 0x6e, 0xdc, 0x3c, 0xc1, 0x5a, 0x7a, 0x62, 0xc4, 0x40, 0x98, 0xf8, 0xb5,
+- 0xd2, 0x6d, 0xd8, 0xaa, 0xf7, 0xa1, 0xde, 0x1a, 0xc2, 0x03, 0xbe, 0x8d,
+- 0xa1, 0x45, 0x9c, 0x7f, 0x45, 0x7e, 0x48, 0xe0, 0xc1, 0x24, 0x34, 0x41,
+- 0xcf, 0x5d, 0xc5, 0xbf, 0x6b, 0xa9, 0xd8, 0x8c, 0x78, 0x28, 0x10, 0x5f,
+- 0x05, 0xe2, 0xa3, 0x40, 0xbc, 0x15, 0x88, 0x97, 0x02, 0xf1, 0x57, 0x20,
+- 0x7e, 0x0a, 0xc4, 0x4f, 0x81, 0xf8, 0x29, 0x10, 0xaf, 0x05, 0xd6, 0xf9,
+- 0x00, 0xc9, 0x52, 0xb1, 0x71, 0xab, 0x63, 0x63, 0xac, 0xd4, 0x26, 0xf6,
+- 0xee, 0x56, 0xc5, 0x73, 0xc3, 0x06, 0xe6, 0x3b, 0x88, 0x3c, 0xbd, 0xc4,
+- 0x2a, 0x5f, 0x15, 0xea, 0x9a, 0x49, 0xc0, 0x4d, 0xcf, 0x83, 0x8d, 0x89,
+- 0x92, 0x2a, 0xa6, 0x87, 0xa5, 0x5c, 0x69, 0xbb, 0x68, 0x72, 0xcc, 0x9e,
+- 0x8d, 0x8a, 0xd5, 0xff, 0xba, 0x68, 0xc4, 0x2f, 0x47, 0x7a, 0x31, 0xd6,
+- 0xec, 0xe2, 0x70, 0xd6, 0xc0, 0xb2, 0x8c, 0x82, 0x5c, 0xdc, 0xc3, 0xb6,
+- 0xac, 0x69, 0x7b, 0x18, 0x45, 0x39, 0xce, 0xe7, 0x34, 0xd2, 0xb5, 0x87,
+- 0x64, 0xb7, 0x86, 0xc9, 0x11, 0x17, 0x35, 0xe9, 0x1a, 0x94, 0xfb, 0x58,
+- 0x7f, 0x2a, 0xc9, 0xb4, 0x0f, 0xf5, 0xb1, 0x18, 0x1a, 0xac, 0x4b, 0xd0,
+- 0x10, 0xe3, 0x35, 0x88, 0x56, 0xd2, 0xd5, 0x3c, 0xe7, 0x02, 0xf1, 0xf9,
+- 0xee, 0x28, 0x3e, 0x1d, 0xd5, 0x50, 0xda, 0xa9, 0xe2, 0x1b, 0x19, 0x29,
+- 0xff, 0x2a, 0xa3, 0xf6, 0x7f, 0x2a, 0x1c, 0x4c, 0x95, 0x54, 0x7c, 0x9e,
+- 0x4f, 0xc3, 0x6b, 0xd6, 0xf0, 0x9f, 0x79, 0x0f, 0x21, 0xc2, 0x3b, 0x40,
+- 0x78, 0x6b, 0x17, 0xa7, 0x30, 0x1b, 0x67, 0x71, 0xfa, 0xb0, 0x31, 0xdf,
+- 0xb1, 0x63, 0xa3, 0x52, 0x03, 0xa3, 0x06, 0x64, 0xff, 0x2c, 0x36, 0xe5,
+- 0x3b, 0x8e, 0x6e, 0x52, 0xb6, 0xe0, 0xe2, 0x5a, 0x0d, 0x9b, 0x87, 0x79,
+- 0x6d, 0x39, 0xca, 0x45, 0x41, 0xfe, 0xf0, 0xc7, 0xea, 0x6b, 0x26, 0x42,
+- 0x7e, 0x65, 0xfc, 0xf1, 0x7a, 0x4e, 0x34, 0xa2, 0xde, 0x34, 0xca, 0x58,
+- 0x1f, 0xe7, 0xf3, 0x39, 0xe5, 0x5d, 0xe9, 0xc6, 0x99, 0x0f, 0xcd, 0x0b,
+- 0x91, 0x6e, 0x6e, 0xc9, 0x66, 0xb1, 0x26, 0xdf, 0xa1, 0xaf, 0x51, 0x48,
+- 0xdb, 0x6a, 0xc5, 0xc6, 0x71, 0x07, 0xe9, 0xd1, 0x61, 0x81, 0x91, 0x4e,
+- 0xb6, 0x31, 0xd2, 0x76, 0xd1, 0x8f, 0x09, 0xc3, 0x50, 0x2a, 0x31, 0xf1,
+- 0x58, 0x36, 0x89, 0xb3, 0x0f, 0xf1, 0x6f, 0x15, 0x3f, 0x5b, 0x9a, 0xc4,
+- 0xc7, 0xfb, 0x4a, 0x73, 0x71, 0xfb, 0x68, 0xa4, 0xb2, 0xef, 0x1a, 0xa2,
+- 0xc9, 0x32, 0x32, 0xae, 0xc9, 0x7b, 0x47, 0x3b, 0x6b, 0xe9, 0x77, 0xc5,
+- 0xd6, 0xfd, 0xf9, 0x0e, 0xbb, 0x5f, 0xd1, 0x50, 0x4e, 0x44, 0x48, 0xf7,
+- 0xd0, 0xea, 0x08, 0xff, 0x25, 0x43, 0x67, 0xb0, 0x22, 0x63, 0x4e, 0xf2,
+- 0xdf, 0x80, 0x25, 0x93, 0x15, 0x9a, 0xc9, 0xa2, 0x8d, 0x03, 0x25, 0x1b,
+- 0x77, 0xe4, 0x3b, 0xdc, 0x95, 0x62, 0x16, 0x68, 0x5f, 0x98, 0x9b, 0x54,
+- 0x7e, 0x21, 0xbd, 0x56, 0xa6, 0xb3, 0x10, 0x93, 0xb1, 0x8e, 0x81, 0x49,
+- 0xc5, 0xdc, 0xd3, 0xaf, 0x48, 0xf9, 0xab, 0xb4, 0x82, 0xaf, 0x65, 0xb2,
+- 0x98, 0xd5, 0x75, 0xdc, 0x9c, 0xd1, 0xbc, 0x16, 0xe2, 0x71, 0xc3, 0x12,
+- 0x0d, 0x17, 0xed, 0x74, 0xf1, 0xf6, 0xe2, 0x9f, 0xa3, 0xbc, 0x82, 0x75,
+- 0xcf, 0x7c, 0xb1, 0x1c, 0x09, 0xc4, 0xac, 0x3a, 0xc4, 0xf6, 0x86, 0x31,
+- 0x6f, 0xe7, 0x59, 0x99, 0xb0, 0x78, 0xdd, 0x9a, 0x3c, 0xa5, 0xb0, 0x0c,
+- 0x61, 0xb4, 0xee, 0xbd, 0x82, 0x72, 0x8a, 0x99, 0x02, 0xbe, 0x16, 0xe7,
+- 0xbd, 0x35, 0x56, 0x55, 0x96, 0x08, 0x76, 0xef, 0xac, 0xc8, 0xff, 0x68,
+- 0xb6, 0x07, 0x2f, 0x15, 0xb0, 0xaf, 0x0d, 0x3f, 0xc0, 0xc8, 0x12, 0xce,
+- 0x4f, 0x8c, 0x63, 0x88, 0x64, 0xff, 0xc1, 0x89, 0x70, 0xa6, 0x6a, 0xe3,
+- 0xea, 0x39, 0x81, 0x6f, 0x5e, 0x29, 0xf0, 0x6a, 0x7a, 0x5a, 0x8e, 0xb5,
+- 0x32, 0xbf, 0x0f, 0x37, 0x56, 0xfe, 0x16, 0xae, 0xee, 0x94, 0x8b, 0x36,
+- 0xa2, 0x55, 0xdd, 0xc7, 0x38, 0x2e, 0x69, 0x25, 0xfd, 0xa5, 0x66, 0xf1,
+- 0x5f, 0x11, 0xd4, 0xb3, 0x9d, 0xef, 0x96, 0x46, 0x4b, 0x85, 0xe6, 0xfd,
+- 0x44, 0xb3, 0x63, 0x48, 0xc5, 0xe6, 0x7c, 0xc7, 0xa9, 0xf7, 0x94, 0xef,
+- 0xcb, 0xd9, 0xf9, 0x4c, 0xa7, 0xc3, 0x3e, 0xa6, 0x08, 0xfc, 0x54, 0x35,
+- 0x67, 0x72, 0x48, 0x60, 0xb2, 0x04, 0xaf, 0xdd, 0xd1, 0x29, 0xfe, 0xe3,
+- 0x94, 0x07, 0x0c, 0xd1, 0xf9, 0xb0, 0x8d, 0x85, 0x43, 0xdf, 0x85, 0xb5,
+- 0xcb, 0xc1, 0x4c, 0xc1, 0xc6, 0x54, 0x41, 0xca, 0xed, 0xb6, 0x94, 0xef,
+- 0xda, 0xe6, 0x86, 0xe3, 0x21, 0xb8, 0x97, 0x2f, 0xed, 0x4a, 0xd5, 0x86,
+- 0x54, 0xd6, 0x4d, 0xee, 0x75, 0x91, 0x5c, 0xb5, 0x5f, 0xf4, 0xe2, 0x89,
+- 0x92, 0x81, 0x62, 0x29, 0x85, 0x27, 0x4b, 0xac, 0x7f, 0x8b, 0xbe, 0x17,
+- 0x51, 0x7c, 0x66, 0x29, 0xb7, 0x30, 0xbf, 0x3a, 0xc6, 0x17, 0xd8, 0x98,
+- 0x2c, 0x28, 0x08, 0x91, 0xce, 0x73, 0x3a, 0xed, 0x2f, 0x9c, 0x25, 0xdb,
+- 0x69, 0xe8, 0xf8, 0xa1, 0x8b, 0xdb, 0xed, 0x16, 0x18, 0x37, 0x5a, 0x18,
+- 0x2f, 0x68, 0x94, 0xbb, 0x55, 0xf4, 0xe6, 0xc7, 0x31, 0xaf, 0x39, 0x4e,
+- 0xb1, 0x26, 0xb0, 0x2a, 0x13, 0x01, 0x56, 0xf2, 0xbb, 0x08, 0xda, 0xad,
+- 0x32, 0xda, 0x63, 0x8d, 0x98, 0xbf, 0xf0, 0x9f, 0x30, 0xdb, 0x12, 0x25,
+- 0x1d, 0xd7, 0x93, 0x1e, 0x04, 0x54, 0xb2, 0x53, 0x9b, 0x65, 0x11, 0x4e,
+- 0x01, 0x2b, 0x49, 0x7b, 0x29, 0x7e, 0x13, 0x24, 0x7b, 0x78, 0x69, 0x1c,
+- 0x8f, 0x13, 0xff, 0xa5, 0xbc, 0x94, 0x91, 0xac, 0xb9, 0x61, 0x3b, 0xe5,
+- 0x84, 0xe9, 0x62, 0x0f, 0x4a, 0xa5, 0x6f, 0x62, 0x6a, 0x84, 0xf8, 0xcc,
+- 0x3b, 0xc4, 0x93, 0xaa, 0x17, 0x85, 0xd9, 0xb7, 0x5a, 0x64, 0xf1, 0x24,
+- 0xf9, 0xce, 0x44, 0xc1, 0x34, 0x8e, 0x93, 0x9f, 0xbd, 0x60, 0x37, 0x10,
+- 0x9f, 0x2e, 0xe1, 0x32, 0xf0, 0x5c, 0xbe, 0x00, 0xab, 0x85, 0xed, 0x15,
+- 0xc1, 0xfd, 0x3b, 0xb3, 0x84, 0x13, 0x83, 0x75, 0xf0, 0xa0, 0x2e, 0xf1,
+- 0x4e, 0x6c, 0xb5, 0x87, 0x22, 0x55, 0x1f, 0xaf, 0x27, 0x9a, 0x7d, 0xdd,
+- 0x36, 0x42, 0xc3, 0x3d, 0x84, 0x97, 0xfc, 0x15, 0xb7, 0x92, 0xbf, 0x7a,
+- 0xb8, 0x9c, 0xe2, 0x21, 0xea, 0xec, 0x49, 0xbf, 0x36, 0xe4, 0xc9, 0x5a,
+- 0xcb, 0xea, 0xff, 0x48, 0x6c, 0xc2, 0x27, 0x69, 0xb6, 0x83, 0x4a, 0xf2,
+- 0xea, 0x78, 0x39, 0x3d, 0x82, 0x57, 0x8b, 0x7f, 0x82, 0x5c, 0xb3, 0x99,
+- 0xda, 0x2c, 0xd6, 0x61, 0x66, 0xe4, 0x0a, 0xe0, 0xcf, 0xd9, 0x7e, 0x02,
+- 0xf3, 0xad, 0x75, 0x38, 0x34, 0x76, 0x2f, 0x8e, 0x8c, 0xd6, 0xe3, 0x39,
+- 0x2b, 0x86, 0xf6, 0x89, 0x0a, 0x9d, 0x6b, 0xe6, 0x72, 0x93, 0x9e, 0xa6,
+- 0xe0, 0x6b, 0xe3, 0x98, 0x14, 0xb8, 0x3e, 0xb3, 0x0e, 0x39, 0xdf, 0xcf,
+- 0x3d, 0xac, 0xa1, 0xdc, 0x96, 0xcf, 0xbb, 0x14, 0xd7, 0x75, 0xd8, 0xd9,
+- 0x0c, 0x71, 0x0b, 0xd5, 0x93, 0x3b, 0x29, 0x5e, 0xef, 0x54, 0x62, 0x70,
+- 0x13, 0x2e, 0xd9, 0x55, 0xe0, 0x22, 0xcb, 0xc0, 0x9e, 0x22, 0x70, 0x77,
+- 0x51, 0xc5, 0xdf, 0x14, 0x2f, 0x45, 0xb9, 0x8d, 0xcf, 0x2e, 0x40, 0x79,
+- 0x1e, 0x7f, 0x87, 0x31, 0x16, 0x33, 0x13, 0x20, 0x9d, 0xed, 0x2f, 0xa8,
+- 0xf8, 0xb1, 0xbd, 0xeb, 0xec, 0xd8, 0x0a, 0x53, 0xcf, 0x51, 0xac, 0x85,
+- 0xac, 0xd3, 0xe4, 0x67, 0xfc, 0x0c, 0x7c, 0x3f, 0xff, 0x99, 0xfc, 0xb9,
+- 0x4f, 0x53, 0xc5, 0x6d, 0xf9, 0x8e, 0x81, 0x8f, 0x94, 0x8f, 0xe5, 0xbf,
+- 0x85, 0x19, 0xff, 0x77, 0xa2, 0x15, 0x7f, 0xdd, 0xc3, 0x79, 0xc4, 0xad,
+- 0xf8, 0xed, 0xbc, 0x2f, 0xf8, 0x6d, 0xc5, 0x3f, 0x47, 0xb2, 0xcc, 0x47,
+- 0x35, 0xc6, 0x62, 0xb8, 0x68, 0x22, 0x89, 0xba, 0x9d, 0xfc, 0x9b, 0xd7,
+- 0x05, 0x2e, 0xee, 0xe6, 0xf8, 0x4a, 0x42, 0xd9, 0x7b, 0x2d, 0xe1, 0x63,
+- 0xd9, 0xab, 0xb9, 0xe2, 0x7b, 0x73, 0xf8, 0xcf, 0xe7, 0x98, 0x76, 0xc2,
+- 0xb7, 0x74, 0x29, 0x3f, 0xf3, 0x99, 0x3a, 0xfc, 0x7a, 0xaf, 0x69, 0x97,
+- 0x95, 0xa5, 0x44, 0x93, 0x63, 0x92, 0x63, 0xf3, 0x2f, 0xe6, 0xce, 0x24,
+- 0xc8, 0xce, 0xd3, 0xb2, 0xbc, 0x8a, 0xf1, 0x55, 0xcf, 0x27, 0x11, 0x3a,
+- 0x47, 0x57, 0xc5, 0xea, 0xec, 0x97, 0xe9, 0xda, 0x94, 0xf7, 0x5b, 0xd1,
+- 0xb0, 0xd0, 0x22, 0x3b, 0xb5, 0xa1, 0x91, 0xe2, 0x3a, 0x62, 0xad, 0x92,
+- 0x91, 0x6f, 0xb3, 0x8f, 0x6a, 0x5e, 0xd8, 0xf9, 0x0a, 0x4a, 0x23, 0xcf,
+- 0x93, 0x7d, 0xa3, 0xec, 0x8b, 0x1b, 0x3e, 0x12, 0x5f, 0xc1, 0xf4, 0x98,
+- 0x88, 0xb2, 0xac, 0xab, 0x28, 0xb6, 0xe7, 0x53, 0x7d, 0xf8, 0xe0, 0xe1,
+- 0xbb, 0xe4, 0x58, 0x9f, 0x8e, 0x17, 0xb3, 0x49, 0x5a, 0x67, 0x5f, 0xb2,
+- 0xf1, 0x4c, 0x5e, 0xc3, 0xee, 0xe1, 0x84, 0xef, 0xc7, 0xf7, 0x74, 0xd6,
+- 0x9d, 0x2a, 0x2b, 0x36, 0x9e, 0x25, 0x3f, 0x3c, 0x58, 0x60, 0x1d, 0xab,
+- 0xb8, 0x38, 0xf3, 0x75, 0x59, 0xd3, 0xc6, 0xbe, 0x1d, 0xa1, 0x33, 0x3a,
+- 0xe1, 0x8e, 0x42, 0xb7, 0x96, 0xcb, 0x37, 0x56, 0xf0, 0x73, 0x03, 0xad,
+- 0xb5, 0xd1, 0xf7, 0x12, 0xd9, 0xf8, 0x3b, 0x7c, 0xe8, 0xff, 0x1b, 0x1f,
+- 0xf4, 0x1d, 0xa3, 0x75, 0x90, 0xbf, 0xcc, 0x88, 0xd5, 0x95, 0xfe, 0x46,
+- 0x53, 0xad, 0x19, 0xb1, 0xc6, 0xef, 0x69, 0xfc, 0x34, 0x4e, 0x38, 0x7a,
+- 0xb1, 0x77, 0x54, 0xca, 0x2d, 0x76, 0x3b, 0x5c, 0x3d, 0x86, 0x2d, 0x16,
+- 0xc5, 0xeb, 0x28, 0x9f, 0x91, 0x32, 0x95, 0x5e, 0xd8, 0xa3, 0x8a, 0x16,
+- 0xca, 0x99, 0x9e, 0x58, 0x9b, 0x35, 0xc4, 0x9d, 0xa3, 0x2a, 0xf2, 0x85,
+- 0x0b, 0x28, 0x27, 0x4b, 0xf9, 0x64, 0x1a, 0xee, 0x60, 0xba, 0x01, 0x2f,
+- 0x8f, 0xe9, 0x14, 0x3b, 0x67, 0xe5, 0xf2, 0x64, 0x2f, 0x4a, 0x84, 0xe7,
+- 0xd3, 0x74, 0x57, 0xea, 0xb0, 0x88, 0x60, 0x2c, 0x1e, 0xc1, 0x9e, 0x42,
+- 0x1c, 0x87, 0xc7, 0x23, 0xd8, 0x46, 0xfe, 0xf7, 0xd3, 0x2c, 0xd3, 0x8c,
+- 0x60, 0x73, 0x89, 0x7b, 0x8d, 0x10, 0xe9, 0xc0, 0x13, 0xef, 0xf9, 0x6b,
+- 0x0d, 0x58, 0x3e, 0xc6, 0x7b, 0xcf, 0xca, 0x76, 0xcb, 0xd2, 0xdb, 0x43,
+- 0xd5, 0x7d, 0xef, 0x50, 0x1f, 0x63, 0x50, 0xef, 0x72, 0x21, 0xe5, 0xaa,
+- 0x04, 0xf5, 0x2a, 0x71, 0xea, 0x55, 0xac, 0xb9, 0xfe, 0xcb, 0xa4, 0x48,
+- 0x93, 0xf2, 0x19, 0xca, 0x53, 0x6f, 0xd2, 0xe7, 0xa4, 0x4d, 0xe5, 0x96,
+- 0x64, 0xbc, 0x78, 0x98, 0x65, 0xf4, 0x84, 0xbd, 0x84, 0x3a, 0xce, 0x69,
+- 0xd3, 0x70, 0x95, 0x5f, 0x50, 0x9f, 0x65, 0xa0, 0x63, 0x9a, 0x79, 0x50,
+- 0xb1, 0xb5, 0x00, 0x0c, 0x16, 0xe0, 0x1d, 0xa6, 0xd8, 0x6e, 0x99, 0x88,
+- 0x22, 0x36, 0xa1, 0x23, 0x3c, 0x91, 0xa2, 0xbd, 0x1a, 0xe2, 0xf4, 0xdb,
+- 0xa3, 0xbe, 0xab, 0xc9, 0x69, 0x13, 0x8b, 0x76, 0x9f, 0x91, 0x0f, 0x52,
+- 0xac, 0xdd, 0x91, 0x34, 0x7b, 0x6f, 0x14, 0x70, 0x53, 0x43, 0x52, 0xd6,
+- 0xa6, 0x6b, 0xa9, 0x7e, 0xcb, 0x43, 0x71, 0x92, 0x3d, 0xea, 0xc8, 0x4d,
+- 0xaf, 0x76, 0x5b, 0xf6, 0xab, 0x20, 0xbc, 0x25, 0x3e, 0xc3, 0xeb, 0x9e,
+- 0xf8, 0xac, 0xdb, 0xda, 0xf3, 0x16, 0x3a, 0xb1, 0x78, 0x42, 0x15, 0xbf,
+- 0x1c, 0x5a, 0x84, 0xcc, 0x34, 0xf4, 0x1a, 0xe2, 0xeb, 0xc3, 0x29, 0xe2,
+- 0xbb, 0x40, 0xb2, 0x14, 0x48, 0x96, 0x02, 0xc9, 0x42, 0x7a, 0x39, 0xe8,
+- 0xf7, 0x6d, 0x2c, 0x6b, 0x8a, 0xea, 0xef, 0x3b, 0x7e, 0x6f, 0x79, 0xb0,
+- 0xc4, 0x72, 0x98, 0xae, 0x07, 0x96, 0x9b, 0xe5, 0x94, 0xf2, 0x2d, 0x9b,
+- 0xe5, 0x31, 0x0d, 0x4f, 0x21, 0x6b, 0x4d, 0x1b, 0x48, 0x4d, 0x57, 0xf5,
+- 0x21, 0xe5, 0xe7, 0x36, 0xeb, 0x83, 0x65, 0x94, 0xf2, 0x69, 0x92, 0x69,
+- 0x2b, 0xc9, 0x38, 0x58, 0x90, 0x87, 0x6a, 0x2c, 0xcb, 0x98, 0x20, 0xde,
+- 0x62, 0x24, 0x53, 0x7c, 0x42, 0x23, 0x59, 0x3b, 0xa1, 0x92, 0xac, 0xa1,
+- 0x09, 0xe8, 0x0a, 0xeb, 0x69, 0xfa, 0xff, 0xe2, 0x87, 0xfb, 0x6a, 0x4f,
+- 0x5c, 0x43, 0xfd, 0xb4, 0x4a, 0xfb, 0x07, 0xc9, 0x77, 0x72, 0x2a, 0x8c,
+- 0x5a, 0x4b, 0xa1, 0x3c, 0xac, 0xe1, 0xf1, 0xf1, 0x06, 0x4c, 0x90, 0xdd,
+- 0xc7, 0xc6, 0xa1, 0x87, 0xe9, 0xfd, 0xd6, 0x73, 0xfe, 0x04, 0xf2, 0xa7,
+- 0x0d, 0x18, 0xa7, 0xfc, 0xf3, 0x40, 0x3e, 0x26, 0x26, 0x46, 0x54, 0x6c,
+- 0x29, 0x9c, 0x20, 0xd9, 0x24, 0xe5, 0xd8, 0xcd, 0x09, 0xda, 0x22, 0x36,
+- 0xdb, 0x66, 0x0f, 0x70, 0x05, 0xf9, 0x5a, 0x08, 0x6b, 0x2d, 0xb8, 0xdb,
+- 0xed, 0x2b, 0x30, 0xdb, 0x07, 0x63, 0x87, 0xed, 0xe9, 0x35, 0x30, 0x8f,
+- 0x5e, 0x43, 0xa3, 0xc0, 0xe5, 0x24, 0xc7, 0x80, 0xe5, 0x6d, 0xa0, 0x84,
+- 0x44, 0xf9, 0xdb, 0xec, 0x3f, 0x42, 0x36, 0x28, 0x52, 0x5d, 0x2b, 0x52,
+- 0x0f, 0x78, 0x60, 0xf4, 0x8c, 0xbc, 0x3d, 0x6d, 0xba, 0x49, 0x5a, 0x0b,
+- 0x0f, 0x69, 0xd8, 0x5f, 0xd2, 0x28, 0x5e, 0x4c, 0x1b, 0xe0, 0x98, 0x87,
+- 0x56, 0x4b, 0x3d, 0xda, 0x47, 0xd6, 0xa3, 0xd4, 0x0b, 0x6b, 0xa0, 0x3e,
+- 0x19, 0x57, 0x8f, 0x08, 0xec, 0xa7, 0xf8, 0x9d, 0x5a, 0x64, 0x1e, 0x5d,
+- 0x0d, 0xaf, 0xdc, 0x0e, 0x73, 0xa0, 0x96, 0x18, 0xf9, 0x74, 0xa8, 0x86,
+- 0xfa, 0xc2, 0x4e, 0xfb, 0x35, 0x98, 0xfa, 0xfe, 0xd0, 0xaf, 0xe4, 0x64,
+- 0x1c, 0x17, 0x84, 0x71, 0x52, 0x1a, 0xdf, 0xe2, 0x33, 0x2c, 0xf7, 0x06,
+- 0x6c, 0xcf, 0x42, 0x0b, 0x3b, 0x6a, 0x7a, 0x7f, 0x1e, 0x38, 0x96, 0x37,
+- 0x30, 0xb9, 0xa8, 0x0e, 0x68, 0xee, 0xe8, 0xb9, 0x03, 0xde, 0xaa, 0xb0,
+- 0xdf, 0xe7, 0x6a, 0xe9, 0x3c, 0xf9, 0xc8, 0x7a, 0x21, 0xf0, 0x24, 0xd1,
+- 0x5a, 0x30, 0xc5, 0x7d, 0x89, 0x9a, 0x5e, 0x48, 0x79, 0x76, 0x5b, 0x49,
+- 0xa0, 0xd6, 0x32, 0xf5, 0x59, 0xb0, 0x6e, 0x74, 0xd2, 0xe9, 0x19, 0x89,
+- 0x66, 0x96, 0xdd, 0xcb, 0x91, 0x9c, 0xab, 0xb6, 0x12, 0xff, 0x6b, 0x48,
+- 0xa6, 0xdb, 0x2d, 0xaf, 0x87, 0xb0, 0x52, 0xed, 0x31, 0x13, 0x1f, 0x90,
+- 0xec, 0x6b, 0x29, 0x47, 0x8c, 0x95, 0x86, 0x9b, 0x38, 0x1f, 0x4c, 0x94,
+- 0x78, 0x4e, 0xea, 0xc1, 0xd5, 0xf9, 0x6a, 0x2c, 0xb0, 0xdd, 0xd9, 0xe6,
+- 0x17, 0xfa, 0xf5, 0xfb, 0xa0, 0xef, 0x23, 0xdc, 0x3f, 0xf5, 0x60, 0xb4,
+- 0x53, 0xa1, 0xde, 0x5c, 0xca, 0x15, 0x96, 0x39, 0xc2, 0xf9, 0x99, 0x7c,
+- 0xdd, 0xdd, 0x67, 0x37, 0x51, 0x6c, 0xc2, 0x7b, 0xc2, 0x36, 0x50, 0xe3,
+- 0xb0, 0x4f, 0x34, 0x90, 0x8f, 0x47, 0xb0, 0x9d, 0x7c, 0x44, 0xb3, 0xac,
+- 0x14, 0x35, 0x53, 0xfa, 0xb1, 0x2c, 0xed, 0x2d, 0xc1, 0x28, 0xd9, 0xf5,
+- 0x98, 0x6d, 0x55, 0xd1, 0xec, 0x1c, 0x92, 0x2d, 0xd6, 0x7f, 0x10, 0x7d,
+- 0x4b, 0xbf, 0x1b, 0xab, 0x61, 0xb4, 0x1a, 0x68, 0x70, 0xf8, 0xfd, 0x69,
+- 0x39, 0xdb, 0x1c, 0x21, 0xff, 0xe2, 0x3d, 0x96, 0x77, 0x10, 0xbf, 0x96,
+- 0x88, 0xf1, 0x5e, 0x97, 0xf2, 0x27, 0xc4, 0x0c, 0xd1, 0x42, 0x0b, 0xc7,
+- 0x2d, 0xf7, 0xe7, 0xd6, 0xd1, 0x43, 0x54, 0x53, 0x8c, 0x16, 0x50, 0x2e,
+- 0x55, 0x11, 0x72, 0x2c, 0x7d, 0x1f, 0x8e, 0x92, 0xcd, 0xd9, 0x45, 0x2e,
+- 0x12, 0xd7, 0xed, 0xba, 0x50, 0xf4, 0xee, 0x92, 0xb2, 0x33, 0x0d, 0x9a,
+- 0xc2, 0x92, 0xc6, 0x4b, 0xb4, 0xba, 0x85, 0x7c, 0xbf, 0xd1, 0x89, 0x88,
+- 0xe2, 0x2e, 0xe8, 0x07, 0x6c, 0x8d, 0xf2, 0xae, 0x94, 0xdb, 0xd2, 0x06,
+- 0xa6, 0x6d, 0xea, 0xc7, 0x5b, 0xc3, 0x68, 0xb6, 0xa0, 0xeb, 0x8e, 0x35,
+- 0xf0, 0x14, 0xee, 0x26, 0x3e, 0x11, 0x99, 0x4f, 0x35, 0x90, 0xd6, 0xc4,
+- 0x5e, 0xbb, 0x0e, 0xee, 0x4d, 0x02, 0x11, 0x27, 0x4e, 0xbc, 0xd5, 0x20,
+- 0xe7, 0x3f, 0xb3, 0x8c, 0x70, 0xdf, 0xb7, 0x7f, 0x44, 0xf2, 0x8a, 0xf9,
+- 0xf5, 0x0e, 0xaf, 0x59, 0x76, 0x11, 0xeb, 0xa9, 0xe7, 0xa7, 0x25, 0x7a,
+- 0xbf, 0x85, 0xde, 0x3f, 0x44, 0xb8, 0x73, 0x31, 0x7f, 0xd6, 0x6b, 0x6a,
+- 0x77, 0xac, 0xf2, 0x73, 0x78, 0x90, 0x64, 0xe0, 0xfc, 0xcd, 0x6b, 0xcc,
+- 0xf3, 0x22, 0xe6, 0x99, 0x6a, 0x37, 0xfb, 0x95, 0x8d, 0x8f, 0xf2, 0x77,
+- 0x73, 0x0f, 0xef, 0xee, 0xb0, 0x21, 0x26, 0xec, 0x3d, 0x28, 0xeb, 0x68,
+- 0x8a, 0x3a, 0x56, 0xff, 0x34, 0xa0, 0x44, 0x9c, 0x51, 0x14, 0x9b, 0x81,
+- 0x87, 0x0a, 0x96, 0xb7, 0x51, 0x31, 0x07, 0xe2, 0xd4, 0xf7, 0x9e, 0xfc,
+- 0xa1, 0x8a, 0x9d, 0x9d, 0x65, 0x33, 0x46, 0x46, 0x8f, 0x3a, 0x51, 0xf1,
+- 0xe2, 0x2e, 0x05, 0x0b, 0x96, 0xa8, 0x78, 0x8b, 0x72, 0xc8, 0x36, 0x9a,
+- 0x45, 0xc2, 0x96, 0xda, 0x54, 0xe9, 0x89, 0x7f, 0x5f, 0x3c, 0x9a, 0xa4,
+- 0xb1, 0x6a, 0x4c, 0x5a, 0x7d, 0x07, 0xf0, 0xa8, 0x74, 0x9b, 0xd9, 0x16,
+- 0x11, 0xca, 0xc3, 0xe7, 0xf2, 0x50, 0x6a, 0x8a, 0xf0, 0x0f, 0x76, 0xbf,
+- 0xeb, 0xfb, 0x0c, 0xd9, 0xd2, 0x7d, 0x23, 0x0f, 0xd1, 0x94, 0x71, 0x30,
+- 0xdb, 0xcc, 0x76, 0xe1, 0xf9, 0x99, 0x94, 0x37, 0x4c, 0xc3, 0x47, 0x8b,
+- 0x8a, 0xc5, 0x19, 0x34, 0x29, 0x8e, 0x75, 0x6a, 0x2f, 0xf1, 0xdc, 0xee,
+- 0x34, 0xe1, 0x74, 0x0b, 0xe7, 0xc4, 0xa8, 0xf8, 0xd9, 0xa8, 0xd9, 0x43,
+- 0x3d, 0xee, 0xaa, 0x8d, 0x30, 0xfb, 0xee, 0x11, 0xd4, 0x97, 0x11, 0xef,
+- 0x56, 0x92, 0xf8, 0xb4, 0x55, 0xc4, 0x93, 0x65, 0x33, 0x8e, 0x2a, 0xbf,
+- 0x67, 0x65, 0xcc, 0xb2, 0xbc, 0x98, 0xf2, 0x1b, 0x99, 0xce, 0xb0, 0x8f,
+- 0xdf, 0x85, 0xda, 0x98, 0x40, 0x4d, 0x66, 0xc4, 0xd7, 0x6d, 0x94, 0xec,
+- 0xdd, 0x94, 0x51, 0x89, 0xb6, 0x4a, 0x39, 0x9d, 0x68, 0x2f, 0x1e, 0xa0,
+- 0x9e, 0x85, 0x75, 0xfa, 0x92, 0xcc, 0x7d, 0x9b, 0xe5, 0xbc, 0x65, 0x4e,
+- 0x66, 0xd2, 0x6c, 0x3d, 0xff, 0x96, 0x0d, 0xac, 0xfb, 0x43, 0x94, 0xcf,
+- 0x17, 0x2f, 0xed, 0xda, 0x31, 0xa0, 0x3c, 0x20, 0x8d, 0x15, 0x6c, 0xdb,
+- 0x46, 0x7a, 0xef, 0xdb, 0x9d, 0xfa, 0xa9, 0x77, 0xf0, 0xda, 0x50, 0x54,
+- 0x34, 0xed, 0xf6, 0xfc, 0xda, 0xf9, 0x2a, 0xf1, 0xf5, 0x61, 0x9a, 0xf9,
+- 0xe1, 0x78, 0x7b, 0x07, 0x97, 0x16, 0xff, 0x94, 0xf6, 0x86, 0x88, 0x17,
+- 0x68, 0x31, 0x92, 0x75, 0x05, 0xcd, 0x25, 0x57, 0x67, 0x0e, 0x48, 0x57,
+- 0x67, 0xfc, 0xa4, 0xf7, 0x51, 0xd6, 0x3b, 0xcf, 0x45, 0x55, 0xdd, 0xf3,
+- 0x7e, 0x3e, 0x3f, 0x4c, 0x31, 0xc9, 0xb6, 0x44, 0x53, 0x83, 0xc3, 0xfa,
+- 0x85, 0xa8, 0x73, 0xba, 0x8c, 0x85, 0x62, 0x87, 0xf4, 0xe2, 0xd5, 0x7c,
+- 0x16, 0x15, 0x13, 0xfe, 0x79, 0xa6, 0xfd, 0xe5, 0xf3, 0x6d, 0xe2, 0xd8,
+- 0xc3, 0x54, 0x7c, 0xeb, 0x7d, 0x7f, 0xe9, 0x7d, 0x92, 0xe2, 0x49, 0x73,
+- 0x6e, 0x95, 0xa9, 0x56, 0xf6, 0x37, 0x28, 0x2f, 0xdb, 0xb7, 0xc8, 0x5c,
+- 0x2b, 0xfb, 0x1d, 0xbc, 0x38, 0xe1, 0xd9, 0xb9, 0xfb, 0x3c, 0x1f, 0xd7,
+- 0x74, 0x4a, 0x39, 0x61, 0x5f, 0x45, 0xba, 0x60, 0x3c, 0x55, 0x5d, 0xfc,
+- 0xe5, 0x9c, 0x6e, 0xa8, 0x89, 0xae, 0xaf, 0xd4, 0x2b, 0xce, 0x69, 0x35,
+- 0xce, 0x1b, 0x78, 0x31, 0xaf, 0xb4, 0x85, 0xd1, 0x84, 0x3e, 0x5b, 0xe0,
+- 0xdd, 0x1e, 0x81, 0xd3, 0x97, 0x47, 0x10, 0xba, 0xcc, 0x2a, 0x77, 0x84,
+- 0xfa, 0x25, 0xe6, 0x95, 0xc9, 0x51, 0xce, 0x48, 0xad, 0x53, 0x45, 0xed,
+- 0xa5, 0x5c, 0xa7, 0xd8, 0x0e, 0x0a, 0xfe, 0x85, 0xf6, 0x5d, 0x77, 0xa9,
+- 0x65, 0x74, 0x50, 0x4b, 0xe0, 0xf5, 0x5d, 0x9d, 0x09, 0x9f, 0xf3, 0x43,
+- 0xe6, 0xe1, 0x4a, 0x5f, 0x06, 0xf6, 0xc7, 0xc5, 0x64, 0xc7, 0xdc, 0x0a,
+- 0x05, 0xe9, 0x25, 0xf0, 0x22, 0xf4, 0x7e, 0xdb, 0x2e, 0xf6, 0x85, 0x47,
+- 0x74, 0x9e, 0x09, 0x81, 0xae, 0x84, 0x0e, 0x6b, 0xd5, 0x0b, 0x44, 0x9b,
+- 0xfa, 0x4d, 0xd2, 0x07, 0xd3, 0xaa, 0xe2, 0xa9, 0xe2, 0x88, 0x8a, 0xd3,
+- 0x0f, 0xf3, 0x19, 0x08, 0xd6, 0x51, 0x7a, 0x01, 0xc5, 0x76, 0x46, 0x9d,
+- 0x93, 0x6d, 0x40, 0xaf, 0xf4, 0x61, 0x51, 0x31, 0x35, 0xca, 0xf8, 0x7c,
+- 0x3f, 0x42, 0x91, 0x7d, 0x2b, 0xcd, 0x7b, 0x7e, 0x23, 0x17, 0x64, 0xfe,
+- 0x9d, 0xf6, 0x30, 0xde, 0xa8, 0x38, 0xe2, 0xd3, 0xae, 0xe8, 0x68, 0x8a,
+- 0x74, 0x3d, 0x91, 0xae, 0xe2, 0xd9, 0x48, 0x7b, 0xd8, 0xe7, 0x98, 0x87,
+- 0x5e, 0xf1, 0x78, 0x9e, 0xf2, 0x0a, 0xd5, 0xdc, 0x89, 0xac, 0x62, 0xd5,
+- 0x42, 0x62, 0xb3, 0xad, 0x63, 0x99, 0x5e, 0xa9, 0x57, 0xf7, 0xe7, 0xab,
+- 0xf7, 0x3f, 0xbd, 0xa2, 0x90, 0x57, 0xa8, 0x7f, 0x83, 0x5e, 0xef, 0x28,
+- 0xf7, 0x34, 0x51, 0x2c, 0xbd, 0x46, 0xb5, 0xeb, 0xd5, 0xb1, 0x5e, 0x91,
+- 0xcf, 0xeb, 0x78, 0x65, 0x7c, 0xb9, 0x78, 0x30, 0x6f, 0xe1, 0xe5, 0x62,
+- 0xe5, 0x2e, 0xe8, 0x81, 0xa2, 0x2b, 0xc6, 0xf3, 0xdc, 0xfb, 0x98, 0xa9,
+- 0x32, 0x66, 0xc4, 0x5a, 0xc2, 0x53, 0x56, 0x2f, 0xf4, 0xeb, 0xc8, 0x78,
+- 0xb1, 0x01, 0x93, 0x63, 0x95, 0x7a, 0x77, 0xeb, 0xb9, 0x7a, 0xf7, 0xc5,
+- 0x3b, 0x9d, 0x48, 0x4e, 0x77, 0xd0, 0xd7, 0x38, 0xbc, 0x49, 0x46, 0xad,
+- 0x10, 0xd5, 0x49, 0x2b, 0x37, 0x2d, 0x22, 0x3d, 0x3b, 0xba, 0x99, 0x5f,
+- 0xf4, 0x69, 0xd4, 0x63, 0x4c, 0x14, 0xd9, 0x5f, 0x0d, 0x18, 0xc5, 0x6f,
+- 0xb5, 0x56, 0xec, 0xdc, 0x96, 0xd3, 0x1c, 0xa0, 0x9e, 0xfa, 0x8b, 0x06,
+- 0x9a, 0x0d, 0xea, 0x9c, 0x1b, 0xbd, 0x8e, 0x6e, 0xe4, 0x54, 0xc7, 0xea,
+- 0xb9, 0x5e, 0xac, 0x5c, 0xa9, 0x38, 0xf7, 0xad, 0x0c, 0x4d, 0x1b, 0xc6,
+- 0x16, 0xbf, 0x0e, 0x9d, 0x1c, 0xd8, 0x4f, 0x33, 0x50, 0x0d, 0xcd, 0xa5,
+- 0xef, 0xe9, 0xb8, 0x2f, 0xd4, 0x7d, 0x1f, 0x36, 0xe5, 0x07, 0xf0, 0xb7,
+- 0x79, 0xce, 0x13, 0x3a, 0x1e, 0x63, 0x1e, 0x0a, 0x7c, 0xff, 0x73, 0xb0,
+- 0x85, 0x6b, 0xdf, 0x23, 0x25, 0x8a, 0xc3, 0x21, 0xe4, 0x12, 0x8e, 0x9f,
+- 0x47, 0x12, 0xa7, 0xc4, 0xf9, 0xfd, 0xbf, 0xbb, 0x97, 0xf5, 0x46, 0xfd,
+- 0x1c, 0xcd, 0x4e, 0x4a, 0xf6, 0x4a, 0xbe, 0x7f, 0xf2, 0x03, 0x74, 0x3b,
+- 0xe5, 0x91, 0x0f, 0x6c, 0x13, 0x63, 0x7a, 0xc5, 0x7e, 0xdb, 0x47, 0xb9,
+- 0x1e, 0x7d, 0x42, 0xf5, 0x28, 0x2a, 0xb6, 0xd2, 0x73, 0xa3, 0xf3, 0x4a,
+- 0x7a, 0x8a, 0x78, 0x3f, 0x46, 0x39, 0x26, 0xe1, 0x1c, 0x47, 0xa2, 0xc0,
+- 0xb3, 0xfa, 0x51, 0x9a, 0xd5, 0xcd, 0xdc, 0x32, 0x8a, 0xe7, 0x03, 0x76,
+- 0xd7, 0xc0, 0xa0, 0x30, 0x8f, 0x52, 0x6d, 0x4e, 0x1c, 0xa0, 0xb9, 0x8b,
+- 0xbe, 0x37, 0xb4, 0x87, 0xba, 0xec, 0x75, 0x30, 0xdd, 0x85, 0xc2, 0x34,
+- 0x5e, 0x17, 0xa6, 0x5e, 0x23, 0x58, 0x27, 0x9f, 0x60, 0x91, 0xaf, 0x9b,
+- 0xe3, 0xb0, 0xfc, 0xef, 0x57, 0xd2, 0x1d, 0xfe, 0xf7, 0xd1, 0xf4, 0xc5,
+- 0xe7, 0x7b, 0x0b, 0x77, 0x07, 0xd5, 0xc6, 0x7c, 0x21, 0x83, 0x48, 0x33,
+- 0xd7, 0x8a, 0xa8, 0x38, 0xb0, 0x0b, 0x5a, 0xbd, 0xf3, 0x3e, 0xbe, 0x3e,
+- 0x04, 0x4d, 0x73, 0xa8, 0xd2, 0x12, 0x2f, 0xd4, 0x1b, 0xa4, 0xae, 0x13,
+- 0xdc, 0x0f, 0x74, 0xe5, 0x9e, 0x80, 0xd9, 0x53, 0x43, 0x34, 0x3e, 0x01,
+- 0xe3, 0x7a, 0x1f, 0x49, 0x1f, 0xe7, 0x2c, 0xce, 0xe3, 0x8c, 0x8a, 0xc1,
+- 0xd1, 0xa8, 0xd8, 0x4c, 0xb2, 0xb4, 0x3b, 0x27, 0x71, 0x85, 0xcf, 0xff,
+- 0x2b, 0xc4, 0x3f, 0xe7, 0x9c, 0x13, 0x94, 0x73, 0x18, 0xef, 0xd1, 0x34,
+- 0xe3, 0x1d, 0xa0, 0x3e, 0xf3, 0x7a, 0xdb, 0x4c, 0xf5, 0x84, 0xcc, 0x44,
+- 0x97, 0x30, 0x29, 0xa9, 0xb1, 0x3c, 0x5d, 0xfd, 0x33, 0xe0, 0xb9, 0xd8,
+- 0x97, 0xa9, 0xa7, 0x9e, 0x64, 0x1a, 0x22, 0x7a, 0x1f, 0xfa, 0xf4, 0x4e,
+- 0xce, 0xd1, 0x3b, 0xf1, 0x07, 0x64, 0x52, 0xdd, 0xfb, 0xc9, 0x1e, 0xdb,
+- 0x0a, 0xaf, 0xc8, 0xce, 0xd6, 0x8a, 0x4c, 0x83, 0x3e, 0x2f, 0x3f, 0x49,
+- 0x33, 0x2f, 0x51, 0x67, 0x86, 0xe6, 0x48, 0xa6, 0x6d, 0xae, 0x22, 0xba,
+- 0x44, 0xb3, 0xcb, 0x18, 0x10, 0x66, 0x3f, 0xe9, 0xad, 0x6f, 0xdc, 0xd7,
+- 0xdb, 0x4f, 0xd2, 0x5d, 0x3e, 0xce, 0x19, 0xea, 0x39, 0xbe, 0xe8, 0x93,
+- 0xec, 0x73, 0xd5, 0xbb, 0xca, 0x94, 0x78, 0x8a, 0x7a, 0x97, 0xa7, 0x8a,
+- 0xaa, 0xd8, 0x47, 0xf6, 0x1c, 0xa7, 0xb8, 0x19, 0xf4, 0xef, 0x1f, 0xa9,
+- 0x06, 0x96, 0xbe, 0xd7, 0x3c, 0x97, 0x6f, 0xc8, 0xae, 0x65, 0xb2, 0x6b,
+- 0x27, 0x65, 0x65, 0xee, 0xd9, 0xb8, 0xde, 0x1d, 0xa6, 0x7a, 0x27, 0xf0,
+- 0xa1, 0x9f, 0x63, 0x0f, 0xa3, 0xb3, 0xc8, 0x3d, 0xa1, 0x25, 0x96, 0xe7,
+- 0x8d, 0xdc, 0x7c, 0xc2, 0xfd, 0x7e, 0xa9, 0x92, 0x1f, 0xa9, 0x36, 0xba,
+- 0x21, 0xa7, 0x47, 0xbc, 0x50, 0xe4, 0x9f, 0x54, 0x4c, 0x62, 0xec, 0x5b,
+- 0xae, 0x68, 0xea, 0xf4, 0xd0, 0xde, 0xe9, 0x49, 0xd5, 0xb2, 0xca, 0xef,
+- 0x0b, 0xeb, 0x94, 0x15, 0x72, 0x6f, 0x9f, 0x8f, 0x4d, 0xb8, 0x6c, 0xb1,
+- 0x7b, 0x73, 0x02, 0xfe, 0x4c, 0x6c, 0x50, 0x4c, 0xa2, 0xb7, 0x3b, 0xd9,
+- 0x33, 0x2d, 0x92, 0xd4, 0x43, 0x25, 0xbd, 0x94, 0x48, 0xa6, 0x8e, 0xc3,
+- 0xd6, 0x8e, 0x14, 0x6d, 0xed, 0x8d, 0x62, 0xf5, 0x6e, 0x93, 0xe5, 0x62,
+- 0x5f, 0xe5, 0xf8, 0xb0, 0xdc, 0xfb, 0x29, 0x0f, 0xc1, 0xef, 0x43, 0xe4,
+- 0xa1, 0x46, 0x8a, 0xb1, 0x3b, 0x51, 0x4b, 0x4d, 0xb3, 0xdc, 0xde, 0x44,
+- 0xf3, 0xcf, 0x5d, 0x44, 0xbf, 0xdc, 0x9a, 0x03, 0xd7, 0x93, 0x47, 0xf8,
+- 0xc2, 0xb9, 0x85, 0x79, 0x7a, 0x33, 0x52, 0x91, 0x91, 0xca, 0x70, 0xe5,
+- 0xff, 0x17, 0xd2, 0x1a, 0x28, 0x06, 0xd7, 0x0d, 0x09, 0xea, 0xef, 0x2b,
+- 0xf1, 0xb8, 0x90, 0xef, 0x4e, 0xfd, 0x7b, 0xb3, 0x57, 0x64, 0xa5, 0xde,
+- 0x7f, 0xdc, 0xcc, 0x77, 0x51, 0x8a, 0x33, 0x1c, 0xfb, 0xed, 0xb3, 0x15,
+- 0xdd, 0xf2, 0x1c, 0x7f, 0xa8, 0xe4, 0x8a, 0x6b, 0xf3, 0xd8, 0x40, 0xbd,
+- 0x83, 0x1b, 0x26, 0x1c, 0xd7, 0x16, 0x7b, 0x49, 0x37, 0x96, 0x31, 0x48,
+- 0x44, 0xb7, 0xea, 0x5d, 0xfa, 0x38, 0xf5, 0x5a, 0x84, 0xcb, 0xa0, 0x7e,
+- 0x94, 0x62, 0x7c, 0x1e, 0x76, 0xcc, 0xc5, 0x54, 0xbd, 0xc3, 0x77, 0xbb,
+- 0x03, 0x62, 0xe1, 0x54, 0x25, 0xcd, 0x1f, 0x3a, 0x27, 0xdf, 0x69, 0xb9,
+- 0xfd, 0x26, 0x7e, 0x5f, 0x3f, 0x67, 0x93, 0x2b, 0x99, 0x26, 0xfd, 0x7e,
+- 0x76, 0x8e, 0x87, 0x3f, 0x74, 0xf6, 0x8e, 0xaf, 0xfe, 0xf6, 0x99, 0x59,
+- 0xe2, 0x93, 0x7b, 0x45, 0x78, 0x31, 0x87, 0xfb, 0xc4, 0x0b, 0xe7, 0x7c,
+- 0xe1, 0x52, 0xc2, 0xbd, 0x01, 0x37, 0xd2, 0x7c, 0xd4, 0x49, 0x73, 0x28,
+- 0xcd, 0x2e, 0x48, 0x0d, 0xb3, 0x3e, 0xce, 0x90, 0x3e, 0xd8, 0xe6, 0xa7,
+- 0xc8, 0xe6, 0x1d, 0x39, 0x8a, 0x99, 0xd4, 0x7a, 0x61, 0xf6, 0x92, 0xbf,
+- 0x51, 0xed, 0x32, 0x13, 0x1f, 0xc3, 0x34, 0xd6, 0xfa, 0x3e, 0x7d, 0x66,
+- 0xce, 0xa7, 0x4f, 0xb1, 0x4f, 0xa3, 0x6f, 0x38, 0x04, 0x25, 0xf3, 0x29,
+- 0xe9, 0x8c, 0xe2, 0x4d, 0x30, 0x4e, 0xce, 0x53, 0x67, 0x40, 0xfd, 0xb2,
+- 0x36, 0x9f, 0xf6, 0xc8, 0x42, 0x47, 0xe2, 0x28, 0xf5, 0xdb, 0xfb, 0xc0,
+- 0x25, 0xa3, 0xeb, 0xe8, 0x31, 0x61, 0x96, 0xdf, 0x0b, 0x71, 0x0e, 0x10,
+- 0x68, 0xcc, 0x54, 0xf0, 0x5d, 0x5e, 0x4c, 0x60, 0x47, 0xa9, 0x82, 0xf3,
+- 0x32, 0xf2, 0xe1, 0x31, 0xff, 0x7e, 0x41, 0x81, 0x96, 0x79, 0x9b, 0x6b,
+- 0x33, 0xc1, 0x25, 0x73, 0xf2, 0x7f, 0x67, 0xce, 0x06, 0x6f, 0xce, 0xe9,
+- 0x67, 0x4b, 0x8c, 0x6b, 0x8f, 0x96, 0xe1, 0x7c, 0x0d, 0xb1, 0x26, 0xff,
+- 0x67, 0x54, 0x03, 0x34, 0xea, 0x81, 0xfd, 0xbc, 0x8f, 0x5c, 0x11, 0x94,
+- 0xbf, 0xcb, 0xb5, 0x47, 0xec, 0xf0, 0x5c, 0xfe, 0xfa, 0x06, 0xad, 0xf5,
+- 0xd1, 0x87, 0x75, 0xc6, 0x77, 0x12, 0x37, 0xd1, 0xb3, 0xeb, 0xef, 0xeb,
+- 0xcf, 0xa3, 0xa7, 0x36, 0x4d, 0xfd, 0xad, 0xbf, 0xcf, 0xbf, 0xaf, 0xa0,
+- 0x3d, 0xcb, 0xf9, 0xdd, 0x08, 0xdf, 0xb5, 0xac, 0xce, 0x26, 0x8d, 0xcd,
+- 0x60, 0x3a, 0x06, 0xd6, 0x14, 0x0d, 0xdc, 0x4a, 0x75, 0x61, 0xcc, 0xbf,
+- 0x07, 0x3d, 0x3f, 0xf7, 0x28, 0xb4, 0x6f, 0x19, 0xed, 0x1b, 0xf4, 0xd7,
+- 0x0c, 0x2c, 0x2f, 0x9e, 0x9f, 0xe9, 0x54, 0x3a, 0x77, 0xe8, 0xdc, 0x1c,
+- 0xcb, 0x76, 0x70, 0xc5, 0xce, 0x7c, 0xaf, 0x18, 0xc9, 0x47, 0x89, 0x96,
+- 0x42, 0x19, 0x40, 0xa2, 0x23, 0x73, 0x33, 0xe5, 0x5d, 0x2b, 0xa5, 0x2a,
+- 0x4d, 0x58, 0x9b, 0x22, 0x3f, 0xd6, 0x97, 0xe2, 0x8e, 0x54, 0x0d, 0xf5,
+- 0x34, 0xc3, 0xb8, 0x4d, 0xaf, 0x45, 0x7f, 0xea, 0x52, 0xe0, 0xc6, 0x3a,
+- 0xea, 0x41, 0x06, 0xfc, 0x9e, 0xbe, 0x86, 0xe8, 0xd5, 0x59, 0x4f, 0xe1,
+- 0xf6, 0x73, 0xff, 0xae, 0x42, 0x34, 0x7e, 0xef, 0x3c, 0x77, 0x33, 0xdc,
+- 0xe6, 0x1e, 0xaa, 0x83, 0xdd, 0x58, 0x97, 0x0a, 0x53, 0x6f, 0xcd, 0xf9,
+- 0x61, 0x3e, 0x22, 0xd6, 0x67, 0x72, 0xfd, 0xb9, 0x3e, 0x67, 0x46, 0xcc,
+- 0x90, 0x5c, 0xa8, 0xf5, 0xc4, 0x73, 0x34, 0xbf, 0x65, 0x4a, 0x7c, 0x1f,
+- 0xa5, 0x20, 0x66, 0xf1, 0xcc, 0x48, 0xc3, 0x1f, 0xcd, 0x59, 0xe9, 0xc7,
+- 0xeb, 0x71, 0xd5, 0xbe, 0x06, 0x64, 0xf6, 0xe9, 0xb0, 0x1f, 0xb7, 0x68,
+- 0x2d, 0x45, 0x9f, 0x19, 0xb1, 0xb7, 0xf8, 0x87, 0x68, 0x77, 0x60, 0x8d,
+- 0xfe, 0x3f, 0x95, 0x7d, 0x0b, 0x70, 0x54, 0xe7, 0x95, 0xe6, 0x77, 0xfb,
+- 0x21, 0xb5, 0x9e, 0x5c, 0x09, 0x09, 0x5a, 0x20, 0x9b, 0x6e, 0xf7, 0x6d,
+- 0xa9, 0x8d, 0x3a, 0xe1, 0x36, 0x88, 0xb5, 0x9c, 0xed, 0x2d, 0x1a, 0x2c,
+- 0x8c, 0x08, 0x60, 0xcb, 0xb6, 0x3c, 0x83, 0x77, 0x32, 0x6b, 0xc5, 0x36,
+- 0x18, 0x3f, 0x92, 0x91, 0x09, 0x5b, 0x25, 0x53, 0x53, 0xd1, 0x1d, 0x01,
+- 0x42, 0x40, 0xbf, 0x24, 0xc1, 0x00, 0x33, 0x53, 0xe3, 0x46, 0x0f, 0x20,
+- 0xb8, 0x5b, 0xc2, 0x71, 0x66, 0x4a, 0xc9, 0xd4, 0x56, 0x34, 0x20, 0x0c,
+- 0x04, 0x63, 0x3c, 0x93, 0x99, 0x29, 0xb2, 0xeb, 0x2d, 0x13, 0x1c, 0xc0,
+- 0x0f, 0xfc, 0x4c, 0xb2, 0x16, 0xf1, 0xc4, 0x77, 0xbf, 0x73, 0xbb, 0x1b,
+- 0x04, 0x45, 0x3c, 0x35, 0x54, 0x75, 0xb5, 0x6e, 0xdf, 0xff, 0xfe, 0x8f,
+- 0xf3, 0x9f, 0xf3, 0x9d, 0xef, 0x9c, 0xf3, 0xdf, 0xa2, 0x84, 0xfe, 0xfb,
+- 0xdf, 0xcc, 0x75, 0x8c, 0x4f, 0xdc, 0x0b, 0x69, 0x66, 0xb3, 0x65, 0xbc,
+- 0x0b, 0x5f, 0x0e, 0x24, 0x9c, 0xe8, 0xea, 0x77, 0xe0, 0xda, 0xa2, 0x73,
+- 0xa6, 0x67, 0xf6, 0x8d, 0xfc, 0x4e, 0xc4, 0xe6, 0xc4, 0x33, 0xfd, 0xf2,
+- 0xed, 0x40, 0x60, 0x71, 0x36, 0xe7, 0xba, 0x61, 0xd0, 0x89, 0xa7, 0xd9,
+- 0xf6, 0xa2, 0x6e, 0xcb, 0xed, 0xb1, 0x55, 0x1b, 0xc0, 0x73, 0xfd, 0x8c,
+- 0x6d, 0x34, 0x13, 0xcf, 0x86, 0x8a, 0x71, 0x7f, 0x75, 0x76, 0x1d, 0xc3,
+- 0x5c, 0x87, 0xe1, 0x30, 0x94, 0x4c, 0xa3, 0x13, 0xe5, 0x9c, 0x3f, 0xb9,
+- 0x18, 0x7e, 0x98, 0x29, 0xc1, 0xe8, 0x81, 0x71, 0x25, 0x9d, 0xce, 0xb6,
+- 0x19, 0xb2, 0x62, 0x5a, 0x43, 0x19, 0x6b, 0xb4, 0x61, 0x26, 0xfd, 0xfb,
+- 0x85, 0x8c, 0x03, 0x9f, 0x65, 0x5c, 0xf8, 0x74, 0xa4, 0x18, 0xbf, 0x3e,
+- 0x50, 0xc2, 0x8f, 0x8a, 0x4f, 0x46, 0x34, 0xfe, 0xde, 0xac, 0xbc, 0x12,
+- 0x95, 0xd8, 0x23, 0x80, 0x4f, 0x33, 0xe3, 0xca, 0xd1, 0xaf, 0x5c, 0x6b,
+- 0xc6, 0xfc, 0x8e, 0x6a, 0x70, 0xcc, 0xbf, 0x36, 0xbf, 0x3b, 0x4d, 0xae,
+- 0xd3, 0xc7, 0xaa, 0xd4, 0x4a, 0xf0, 0xd9, 0x01, 0x19, 0x47, 0xfa, 0x6f,
+- 0x56, 0x5e, 0x8d, 0x8a, 0x7c, 0x2b, 0xf1, 0xeb, 0x11, 0x91, 0xe3, 0x27,
+- 0xd4, 0x69, 0xe9, 0x7f, 0x5c, 0x39, 0x9e, 0x7b, 0xe6, 0xe7, 0xdc, 0x8b,
+- 0x8d, 0xa3, 0x0e, 0x90, 0x4c, 0xf0, 0x59, 0x17, 0x5e, 0x38, 0x68, 0x23,
+- 0x27, 0x2e, 0xc6, 0xc6, 0xc1, 0x12, 0xbc, 0x30, 0xa8, 0xa2, 0xe3, 0x60,
+- 0xb3, 0x42, 0xbe, 0xaf, 0xce, 0x20, 0xef, 0xed, 0x18, 0x0d, 0xb0, 0xdd,
+- 0xb8, 0x72, 0x2e, 0xdd, 0x30, 0x33, 0xdb, 0x4f, 0x36, 0xf7, 0x93, 0xe5,
+- 0x31, 0x86, 0xc2, 0x38, 0x8d, 0x5c, 0x72, 0xdf, 0xe6, 0xd7, 0x18, 0x21,
+- 0x3e, 0x9c, 0xb6, 0x53, 0xc7, 0x24, 0x1e, 0x15, 0xbb, 0x4f, 0x6d, 0xbe,
+- 0x12, 0x95, 0xb9, 0x1a, 0xca, 0x91, 0x46, 0x9b, 0xc5, 0xb1, 0x5f, 0x67,
+- 0x5c, 0xb8, 0x82, 0xb6, 0xf2, 0x10, 0xe5, 0xb1, 0x9a, 0xf2, 0x68, 0xa6,
+- 0x3c, 0x5a, 0x39, 0xdf, 0x97, 0xa3, 0x82, 0x93, 0xde, 0x40, 0x44, 0xd1,
+- 0xb0, 0x2a, 0x23, 0x7d, 0x58, 0xe3, 0xb8, 0x1c, 0xe1, 0xbf, 0xd9, 0xbc,
+- 0x35, 0x7a, 0xab, 0x5c, 0xa0, 0x96, 0x87, 0xc5, 0xaf, 0x89, 0x6c, 0x02,
+- 0xe4, 0x50, 0xe3, 0xca, 0xa8, 0x15, 0x23, 0xef, 0xdb, 0xec, 0x49, 0xe5,
+- 0x6d, 0xa7, 0x44, 0xec, 0x53, 0xf2, 0xe1, 0xca, 0x3e, 0x72, 0xb5, 0x1a,
+- 0x2d, 0x7b, 0xff, 0xde, 0x94, 0x7c, 0xa7, 0x36, 0x2f, 0xb4, 0xf0, 0xe6,
+- 0x6f, 0x36, 0x37, 0x5d, 0x5f, 0xd3, 0xb8, 0xf2, 0x36, 0xd7, 0x73, 0x81,
+- 0x7a, 0x7a, 0x92, 0x73, 0x2d, 0x92, 0xbd, 0x4b, 0x73, 0xef, 0x38, 0xd7,
+- 0x4f, 0x87, 0x8b, 0xf1, 0x5e, 0xaa, 0x84, 0x1f, 0xca, 0x76, 0x98, 0x7b,
+- 0x97, 0x6e, 0x56, 0x4e, 0x59, 0xf2, 0x0d, 0xe0, 0x5d, 0x8e, 0x7d, 0xec,
+- 0x7a, 0x1f, 0x59, 0xde, 0x96, 0xad, 0xc3, 0xe5, 0xed, 0x57, 0xf0, 0x54,
+- 0xd6, 0x66, 0x28, 0x91, 0xeb, 0xb5, 0x34, 0xc9, 0x8b, 0x49, 0x7d, 0x91,
+- 0x3e, 0x46, 0x95, 0xfc, 0xa8, 0x42, 0x8c, 0xa1, 0xfe, 0xa9, 0xcb, 0x3c,
+- 0x0e, 0xe2, 0xe2, 0x3a, 0x7c, 0xc1, 0x38, 0x21, 0x42, 0x8b, 0x92, 0xb5,
+- 0x48, 0x8e, 0xb4, 0x50, 0x62, 0x42, 0xeb, 0xdf, 0x20, 0xb9, 0xd4, 0x6b,
+- 0xe4, 0xb9, 0x54, 0x21, 0x74, 0xa7, 0xbf, 0x30, 0x27, 0xaa, 0xe8, 0x57,
+- 0xb5, 0xeb, 0x79, 0x37, 0xae, 0xd9, 0x34, 0x87, 0x78, 0xaf, 0x27, 0x8d,
+- 0xdc, 0x3f, 0x72, 0x2f, 0xf2, 0xdd, 0x27, 0xb5, 0xdf, 0x99, 0x4f, 0xdc,
+- 0xd4, 0x36, 0x8f, 0xe5, 0xf9, 0x78, 0x5f, 0xb0, 0xbc, 0x14, 0x3d, 0xbb,
+- 0xbd, 0xc9, 0x14, 0xaa, 0x90, 0xd4, 0x6c, 0x73, 0x0b, 0x38, 0x3b, 0x3b,
+- 0xbc, 0xbd, 0xcd, 0xb0, 0xf2, 0x20, 0x9e, 0x14, 0xfe, 0x61, 0xa6, 0xd8,
+- 0x8c, 0x53, 0x6b, 0xf0, 0x54, 0xd8, 0x2a, 0x65, 0xee, 0xd6, 0xac, 0xec,
+- 0xfd, 0x45, 0x58, 0x17, 0x2c, 0x42, 0xaa, 0x95, 0x18, 0xd7, 0x6f, 0xb4,
+- 0xb0, 0x7b, 0xf2, 0xa7, 0xc0, 0x8b, 0xdf, 0xf4, 0x0b, 0x1f, 0x03, 0x0a,
+- 0x63, 0x1c, 0x13, 0x39, 0x0c, 0xec, 0xf7, 0x1a, 0x36, 0x9b, 0x3c, 0xff,
+- 0x99, 0x69, 0xb4, 0xc9, 0xb3, 0xd2, 0x47, 0xad, 0xc5, 0x1b, 0x6f, 0xd6,
+- 0x7b, 0x0f, 0xe5, 0xf4, 0xaf, 0x33, 0x25, 0xe7, 0xa8, 0xd6, 0x31, 0xee,
+- 0xe9, 0x97, 0x9a, 0x4d, 0x04, 0xbb, 0xaa, 0x7d, 0x1d, 0xba, 0xad, 0x18,
+- 0x67, 0xbf, 0xf6, 0xdf, 0x88, 0xe9, 0x05, 0x70, 0xd5, 0x01, 0xf7, 0xc5,
+- 0x6d, 0xb0, 0xd5, 0x11, 0xab, 0xa9, 0xd3, 0xcd, 0xa3, 0x36, 0xcc, 0xeb,
+- 0x57, 0xf0, 0x58, 0xd2, 0x86, 0x07, 0x92, 0x76, 0xac, 0x4a, 0xe2, 0xfb,
+- 0xf3, 0x80, 0xc9, 0x1a, 0xf8, 0xdb, 0xa7, 0xe8, 0x9a, 0xcb, 0xe1, 0x6f,
+- 0x8d, 0x91, 0x17, 0xac, 0x62, 0x2c, 0xba, 0x72, 0x94, 0x38, 0xc8, 0xb6,
+- 0xce, 0x3e, 0xea, 0x66, 0x9f, 0x1d, 0x35, 0x7d, 0xb8, 0xb3, 0x10, 0xa0,
+- 0x75, 0xfb, 0xa7, 0xe8, 0x97, 0x2a, 0x1d, 0xf0, 0xd3, 0xaf, 0xf8, 0x3b,
+- 0x6b, 0xec, 0x0c, 0xc4, 0xea, 0xfe, 0xd5, 0xe2, 0xb4, 0x0f, 0xd2, 0x5e,
+- 0xe6, 0xf5, 0xb3, 0x7d, 0x9d, 0x0d, 0x2a, 0xf5, 0xf9, 0x93, 0x3f, 0x96,
+- 0x7c, 0xaf, 0xdc, 0x93, 0xba, 0xab, 0x82, 0xf2, 0x7e, 0x3b, 0xf1, 0xf0,
+- 0x8c, 0x79, 0xb6, 0xda, 0xaa, 0x41, 0xe1, 0x31, 0xce, 0xcd, 0xcd, 0xdf,
+- 0xd4, 0x3a, 0x17, 0x16, 0xdc, 0xa3, 0x62, 0xed, 0xa0, 0xb4, 0x85, 0xd5,
+- 0x8f, 0x93, 0xb8, 0x53, 0xa0, 0x4d, 0x98, 0x07, 0xab, 0xa4, 0xad, 0x8d,
+- 0x6b, 0xb4, 0xa3, 0xa4, 0x1f, 0x58, 0x19, 0xc7, 0xc3, 0xa5, 0xf0, 0x47,
+- 0x64, 0x8e, 0xf5, 0x8b, 0x1d, 0x7c, 0xb6, 0x14, 0x2d, 0xa3, 0xd9, 0xe7,
+- 0x56, 0x8c, 0xbe, 0x37, 0x33, 0x9b, 0xfb, 0xfe, 0xc3, 0x75, 0xe3, 0x2d,
+- 0x8d, 0x7e, 0xac, 0x4b, 0x52, 0xe7, 0x6c, 0x1e, 0x0c, 0xe6, 0x72, 0xd0,
+- 0x4f, 0xa4, 0xbc, 0xd3, 0xea, 0xba, 0x7f, 0x5b, 0x9a, 0xab, 0xf9, 0xd2,
+- 0x8e, 0xa7, 0xd8, 0x8f, 0x65, 0xc3, 0x18, 0x1c, 0x33, 0x11, 0xd5, 0x4d,
+- 0x64, 0xf8, 0x79, 0x43, 0x87, 0x51, 0x42, 0x1b, 0x7f, 0x2a, 0x26, 0x98,
+- 0x97, 0xd5, 0xa4, 0x1f, 0x24, 0x02, 0xca, 0x86, 0x18, 0x70, 0x84, 0xf1,
+- 0xe3, 0x21, 0x7e, 0x86, 0x13, 0x5c, 0x03, 0xe7, 0x6d, 0x23, 0x6e, 0x6c,
+- 0x4b, 0x01, 0x43, 0x09, 0x44, 0xf6, 0x2f, 0x96, 0x58, 0xa6, 0x84, 0xe3,
+- 0x01, 0xe3, 0x6c, 0x93, 0xe6, 0xe7, 0x20, 0x3f, 0x63, 0xdc, 0x53, 0x8e,
+- 0x87, 0x00, 0xf1, 0x30, 0x92, 0xd1, 0x60, 0x64, 0x02, 0x98, 0xa0, 0x6d,
+- 0x5d, 0x1b, 0x56, 0x51, 0x76, 0xa8, 0x12, 0x1f, 0x8d, 0x64, 0x63, 0xa5,
+- 0x75, 0x19, 0xa9, 0x5d, 0xcb, 0xda, 0xa4, 0x7e, 0x2d, 0xb6, 0x54, 0x84,
+- 0x43, 0xc9, 0x4a, 0xab, 0x86, 0xfd, 0x8e, 0xce, 0x7e, 0x55, 0xa9, 0xb1,
+- 0xb6, 0xe2, 0x70, 0xd4, 0xe7, 0xe9, 0xa5, 0xbe, 0x1b, 0x0e, 0xb1, 0xaf,
+- 0x46, 0x1c, 0x89, 0xe6, 0x6b, 0x67, 0xbe, 0x96, 0x9f, 0x49, 0x8e, 0xc8,
+- 0x59, 0x49, 0xd9, 0xca, 0xbd, 0xbc, 0xdf, 0x95, 0xf5, 0x4a, 0x0e, 0x3f,
+- 0xcf, 0x71, 0xa6, 0xff, 0x7e, 0x8a, 0xe3, 0x05, 0x69, 0x07, 0xde, 0xde,
+- 0x14, 0x74, 0xcb, 0x97, 0x8e, 0xd4, 0x7b, 0x93, 0x06, 0x64, 0x6f, 0x1b,
+- 0x39, 0x87, 0xd7, 0xa8, 0xf7, 0x01, 0xca, 0xf9, 0x2f, 0xe8, 0x23, 0x5c,
+- 0x8c, 0x65, 0x2b, 0xb0, 0xab, 0xaf, 0x12, 0x3b, 0xfb, 0x0c, 0xf4, 0x2c,
+- 0x6e, 0xc3, 0xa9, 0xa8, 0x89, 0x75, 0x21, 0x13, 0x2b, 0x19, 0x23, 0xfc,
+- 0x00, 0x0d, 0x4d, 0x87, 0xf1, 0x20, 0x63, 0x65, 0x95, 0xf2, 0xf8, 0x16,
+- 0xde, 0xde, 0xed, 0xc0, 0x7a, 0xfd, 0x8f, 0x68, 0xbf, 0xa6, 0xf9, 0xab,
+- 0x45, 0xb5, 0x18, 0x4c, 0x34, 0xa8, 0xdd, 0x9c, 0x5f, 0xa4, 0x8d, 0xfb,
+- 0x14, 0x74, 0xe0, 0x69, 0xfd, 0xfb, 0x6c, 0xeb, 0xb6, 0x39, 0x34, 0xb9,
+- 0x96, 0xba, 0x96, 0xec, 0xa3, 0x41, 0xdd, 0xca, 0xfb, 0xac, 0x6c, 0xad,
+- 0x74, 0x7d, 0xa3, 0xe4, 0x44, 0x4a, 0x71, 0x92, 0x32, 0x3b, 0x96, 0x8c,
+- 0xd0, 0x55, 0x43, 0x79, 0xba, 0xb1, 0x0b, 0x8f, 0x93, 0x9b, 0xbc, 0x4d,
+- 0xd2, 0x70, 0x6f, 0x5c, 0x41, 0x53, 0xbd, 0x8e, 0xf3, 0xe9, 0x6f, 0xe1,
+- 0xcd, 0xe1, 0x30, 0xde, 0x20, 0x07, 0x58, 0xf0, 0x97, 0xc2, 0xe9, 0x3d,
+- 0x38, 0x9b, 0x0e, 0xe3, 0x4c, 0xd4, 0xdb, 0xfa, 0xbc, 0x52, 0x8b, 0x9f,
+- 0x11, 0xd3, 0xee, 0x8e, 0x03, 0xef, 0xb1, 0x1f, 0x7f, 0xdc, 0x81, 0x4b,
+- 0x69, 0x15, 0x87, 0xb9, 0x37, 0x8e, 0xd0, 0x02, 0x18, 0x6d, 0x1e, 0x1c,
+- 0x1c, 0x78, 0x00, 0x13, 0xa9, 0x07, 0x70, 0x22, 0xf9, 0xb6, 0xe9, 0xd2,
+- 0xa4, 0x06, 0xe6, 0xc2, 0x25, 0x62, 0xea, 0x24, 0xa5, 0x51, 0x7a, 0x4f,
+- 0x2b, 0x71, 0x51, 0x33, 0x44, 0xee, 0x6f, 0xf2, 0xb7, 0x7b, 0xe3, 0x4d,
+- 0xd8, 0x9f, 0xa1, 0x48, 0x13, 0x3a, 0x12, 0x31, 0x19, 0xab, 0x11, 0x31,
+- 0x72, 0xc8, 0x5d, 0x7d, 0xe2, 0x37, 0xef, 0xc6, 0xca, 0x0a, 0x28, 0x2d,
+- 0x75, 0x63, 0xb9, 0x75, 0x34, 0x4d, 0xab, 0x6d, 0x4a, 0xbc, 0x49, 0xb9,
+- 0xf2, 0xb9, 0x1f, 0x26, 0x28, 0xf7, 0x04, 0x65, 0x7b, 0x7d, 0x3f, 0x9a,
+- 0xb8, 0x1f, 0xdf, 0xc2, 0xf9, 0xdd, 0x6d, 0x78, 0x93, 0x58, 0x57, 0xbe,
+- 0xc8, 0xd7, 0xe9, 0xb4, 0x35, 0xb0, 0xef, 0xb4, 0x99, 0xaa, 0x16, 0x99,
+- 0xb6, 0xe1, 0x17, 0x51, 0x91, 0x69, 0x9a, 0xd8, 0xe7, 0xf3, 0xf8, 0xed,
+- 0x23, 0x55, 0xd4, 0x65, 0x5b, 0x77, 0x30, 0x5b, 0xaf, 0x2b, 0xbd, 0xc7,
+- 0x85, 0xcb, 0xd6, 0xdc, 0x64, 0xae, 0x5f, 0x35, 0xbf, 0x5f, 0x98, 0x2b,
+- 0xab, 0x65, 0x7e, 0x86, 0xc9, 0x98, 0x3a, 0xc0, 0x78, 0x91, 0xb6, 0x13,
+- 0x80, 0xe4, 0x9c, 0xeb, 0xe3, 0x5d, 0xb0, 0x87, 0x4a, 0x0d, 0x35, 0xec,
+- 0x9d, 0xea, 0xc0, 0x9b, 0xb8, 0x42, 0x8e, 0x72, 0x57, 0x5c, 0x63, 0x7c,
+- 0x7b, 0x81, 0x63, 0xfd, 0x0b, 0x2e, 0xf2, 0xda, 0x17, 0xcf, 0xda, 0x5a,
+- 0x77, 0x63, 0x1b, 0xee, 0x4b, 0xcb, 0xfa, 0xfe, 0x0b, 0x07, 0xd2, 0x11,
+- 0x49, 0xcb, 0x3a, 0x63, 0xb4, 0x0b, 0x59, 0x67, 0xe5, 0x7f, 0xb0, 0xce,
+- 0x23, 0xec, 0xaf, 0x96, 0x76, 0x94, 0xf7, 0x1b, 0x65, 0x38, 0x98, 0x54,
+- 0x71, 0x52, 0x2f, 0xc5, 0x05, 0x55, 0xf2, 0xf5, 0xd9, 0x5a, 0x66, 0x33,
+- 0xe3, 0xd3, 0x21, 0x7e, 0x9e, 0x62, 0x0c, 0x75, 0x5a, 0x77, 0xe0, 0x84,
+- 0x5e, 0x4b, 0x9c, 0xbf, 0x55, 0x87, 0xe5, 0x1e, 0x03, 0x83, 0x8a, 0x4a,
+- 0x9c, 0x91, 0x9c, 0xaa, 0x75, 0x5f, 0xce, 0x16, 0xb8, 0x20, 0x39, 0x8d,
+- 0x82, 0xd8, 0x6f, 0xcd, 0xcb, 0x16, 0xce, 0xdc, 0x3a, 0xbf, 0x5b, 0xfb,
+- 0x21, 0x55, 0xd0, 0xde, 0x33, 0x9f, 0xad, 0xce, 0xf9, 0x2d, 0x65, 0x47,
+- 0x55, 0x16, 0x2b, 0xc4, 0x87, 0x8d, 0xe7, 0x71, 0x83, 0x7c, 0x7c, 0xdf,
+- 0xa3, 0xf4, 0x41, 0xf4, 0xcf, 0xcd, 0xdf, 0xdb, 0xaa, 0x49, 0x9c, 0x97,
+- 0x7a, 0x74, 0x99, 0x56, 0x00, 0xbb, 0xe5, 0x67, 0x0f, 0x6f, 0xce, 0xf2,
+- 0xf9, 0xf4, 0xe6, 0x6c, 0x8c, 0x7a, 0x74, 0xf3, 0x5d, 0xd6, 0xf7, 0x8f,
+- 0x36, 0xfb, 0x52, 0x37, 0x7c, 0x55, 0x96, 0x2f, 0x5b, 0x67, 0x6d, 0xd0,
+- 0xab, 0x1b, 0xca, 0x8a, 0x46, 0xf1, 0xd7, 0x79, 0x8e, 0x22, 0x6d, 0x02,
+- 0xca, 0x89, 0xa8, 0x61, 0xba, 0xb5, 0x62, 0xfa, 0x7a, 0x28, 0x63, 0x8c,
+- 0xc5, 0xa6, 0xac, 0xba, 0xa7, 0x86, 0x37, 0xd2, 0x12, 0x13, 0x83, 0xfa,
+- 0xfb, 0xbf, 0xb1, 0x6b, 0x37, 0xda, 0x8b, 0x16, 0x93, 0xb3, 0xd3, 0xcf,
+- 0x3d, 0x1b, 0x72, 0xe0, 0xfd, 0x74, 0x76, 0x3d, 0xef, 0x0d, 0x97, 0xe0,
+- 0xdd, 0x94, 0xf8, 0x6b, 0xa8, 0x85, 0xec, 0xf7, 0x64, 0x5a, 0x63, 0x6c,
+- 0x2a, 0xe3, 0xb6, 0x61, 0xdb, 0x98, 0x03, 0xfb, 0xa3, 0x1a, 0x62, 0x89,
+- 0x9f, 0x9a, 0x45, 0x9a, 0x6f, 0xc2, 0x6f, 0x77, 0x60, 0x5f, 0x7a, 0x12,
+- 0x63, 0x7d, 0x1f, 0x9b, 0x76, 0xad, 0x0b, 0x1f, 0x85, 0x26, 0xc9, 0xeb,
+- 0xa4, 0xfe, 0xa9, 0x63, 0xd7, 0x80, 0xc6, 0x58, 0xda, 0x86, 0x9d, 0x8b,
+- 0x5b, 0xb0, 0x6b, 0xac, 0x19, 0xc6, 0x21, 0x0f, 0x76, 0x92, 0xf0, 0x4d,
+- 0x0c, 0x4f, 0xe2, 0x54, 0x52, 0x6b, 0x2a, 0x52, 0x26, 0x71, 0x92, 0xe3,
+- 0x6c, 0x4d, 0xbc, 0x05, 0x83, 0x7d, 0x6c, 0x4b, 0x4a, 0x8e, 0x57, 0xc6,
+- 0x99, 0x44, 0x77, 0xea, 0x76, 0x35, 0x8f, 0x36, 0xec, 0x48, 0x6c, 0x69,
+- 0xcf, 0xd6, 0x3d, 0x88, 0xab, 0x69, 0x4d, 0xe9, 0xe5, 0x1e, 0x1d, 0x4e,
+- 0xe7, 0x6b, 0x20, 0x82, 0xa1, 0x59, 0x3c, 0xdc, 0x96, 0xd6, 0xd1, 0x3b,
+- 0xd0, 0xc2, 0xf6, 0x1a, 0xba, 0x13, 0x52, 0x3f, 0xf6, 0x71, 0x3c, 0x13,
+- 0xef, 0xe9, 0x5e, 0xf7, 0x5d, 0xfc, 0x1e, 0xd1, 0x3b, 0xb1, 0x81, 0xfd,
+- 0x08, 0xe7, 0xd2, 0x14, 0x6f, 0x93, 0x01, 0x3b, 0x7e, 0xa5, 0xdb, 0x61,
+- 0x54, 0xd9, 0x71, 0x44, 0x2f, 0x23, 0x3f, 0xb7, 0xa3, 0x21, 0x44, 0xdf,
+- 0x9c, 0xf3, 0xd5, 0x1f, 0x26, 0x15, 0x3c, 0x40, 0x2c, 0x3d, 0x16, 0x6a,
+- 0x68, 0x5f, 0x2e, 0x6c, 0xf7, 0x80, 0x82, 0x2b, 0xda, 0x35, 0xd3, 0xa0,
+- 0xbf, 0x72, 0xf9, 0xf3, 0x7b, 0xf3, 0x6b, 0x33, 0x5b, 0x03, 0xfe, 0xc2,
+- 0xcc, 0x3f, 0x37, 0xc5, 0xf9, 0x3d, 0xc6, 0xe7, 0xee, 0x5a, 0xd4, 0xd0,
+- 0x29, 0xcf, 0xb9, 0x89, 0xe3, 0xf2, 0x9c, 0xe4, 0xf6, 0x6f, 0x3c, 0xa7,
+- 0x63, 0xdb, 0x40, 0xc4, 0x9a, 0xef, 0xf6, 0x04, 0x16, 0x3a, 0x20, 0x76,
+- 0xd4, 0xa0, 0x5e, 0x02, 0xba, 0x26, 0xf5, 0x19, 0xe4, 0x37, 0xfe, 0xc0,
+- 0x53, 0x10, 0x39, 0x49, 0xbc, 0xf9, 0x16, 0x76, 0x46, 0x87, 0xc1, 0x98,
+- 0x93, 0xf8, 0xe6, 0x5f, 0x3b, 0x84, 0x14, 0x9e, 0x4b, 0xa7, 0xf0, 0xbc,
+- 0x70, 0x6c, 0x2b, 0xc7, 0x96, 0xc6, 0x77, 0xa2, 0x6f, 0x21, 0x66, 0xc5,
+- 0x55, 0x87, 0xf1, 0x44, 0xf4, 0xdd, 0x6a, 0xc9, 0x65, 0x6e, 0x4d, 0x2c,
+- 0x65, 0xff, 0x22, 0x53, 0x6f, 0xab, 0x81, 0x2f, 0xd9, 0xff, 0x52, 0x6c,
+- 0x19, 0x92, 0x9c, 0x90, 0x89, 0xd7, 0xc9, 0xa9, 0xae, 0x50, 0x8f, 0x5a,
+- 0x1a, 0xa5, 0xff, 0x71, 0x45, 0xb3, 0x7c, 0x57, 0x1b, 0xf7, 0x78, 0x16,
+- 0xdc, 0x94, 0x73, 0x59, 0x46, 0x53, 0xee, 0x8a, 0xc9, 0x9e, 0x3b, 0x60,
+- 0xcb, 0x78, 0xf0, 0x18, 0x79, 0x49, 0xe1, 0xc8, 0x8f, 0x14, 0xf1, 0x5f,
+- 0x35, 0xe4, 0xa2, 0xee, 0x03, 0x1e, 0x65, 0xc1, 0x1e, 0x17, 0x1e, 0x88,
+- 0x91, 0xa3, 0xc6, 0x9a, 0xb1, 0x65, 0xaf, 0xc6, 0x36, 0x5e, 0xfd, 0x1c,
+- 0xe3, 0xd6, 0x93, 0xf0, 0x79, 0x86, 0xc8, 0xa5, 0xdc, 0xc4, 0x60, 0xc7,
+- 0x48, 0x39, 0x4a, 0xc8, 0xb3, 0xa5, 0xdc, 0x5c, 0x3a, 0xe2, 0x46, 0x0d,
+- 0xfd, 0x99, 0x3b, 0x73, 0x1e, 0x63, 0x7b, 0xa0, 0x96, 0x84, 0x3f, 0x37,
+- 0x0b, 0x35, 0xa9, 0x57, 0x06, 0x50, 0x9e, 0xd9, 0x84, 0x74, 0x2c, 0x88,
+- 0x52, 0xf2, 0xfb, 0x06, 0x8e, 0x77, 0x7f, 0x4c, 0x63, 0x3f, 0x59, 0x6e,
+- 0xb3, 0x9c, 0xcf, 0xf4, 0x26, 0xbc, 0x6b, 0xa5, 0xde, 0x78, 0x45, 0x7f,
+- 0x0d, 0x45, 0x7d, 0x37, 0xce, 0x9c, 0x69, 0x21, 0xcc, 0x21, 0xf7, 0x68,
+- 0x7d, 0x1a, 0xd9, 0xf3, 0x67, 0x2b, 0x72, 0xeb, 0x09, 0xca, 0x7a, 0x9c,
+- 0x6d, 0xd4, 0x83, 0xd9, 0x98, 0xc1, 0xf5, 0x5c, 0xa4, 0xde, 0xdc, 0xcb,
+- 0xb9, 0x5e, 0x63, 0xec, 0xd0, 0xc9, 0xb5, 0xbc, 0x3f, 0xfc, 0x23, 0xa5,
+- 0x86, 0x6b, 0x99, 0x22, 0x57, 0xfd, 0x38, 0xe5, 0x51, 0x7c, 0x5c, 0xcb,
+- 0x77, 0x79, 0xff, 0x3b, 0x5c, 0xcb, 0xd6, 0xbd, 0xde, 0xd6, 0xe3, 0x8a,
+- 0xb7, 0x7d, 0x8d, 0xe2, 0x53, 0xb7, 0x2a, 0xa5, 0xb8, 0x38, 0x5c, 0x8e,
+- 0x4b, 0xf4, 0xbd, 0xd7, 0x86, 0x2b, 0x71, 0x79, 0xb8, 0x8a, 0x36, 0xa2,
+- 0xb1, 0x0f, 0xd3, 0x2c, 0xd3, 0xdc, 0x98, 0x4a, 0x3f, 0x8f, 0x19, 0xb1,
+- 0x5a, 0x7c, 0x9c, 0xde, 0x80, 0xf2, 0x98, 0xc4, 0x00, 0x1e, 0x7c, 0xc4,
+- 0xfb, 0x1f, 0xa6, 0x47, 0x51, 0xbc, 0xe7, 0x73, 0xb6, 0x31, 0xcd, 0xfb,
+- 0xb9, 0xbe, 0xcb, 0xe9, 0x0e, 0x94, 0xee, 0xd9, 0x08, 0xc7, 0x1e, 0xb3,
+- 0x6b, 0x4b, 0x08, 0x3f, 0xb3, 0x73, 0x2d, 0xdd, 0xba, 0x77, 0xe2, 0x2e,
+- 0x7b, 0x90, 0x7d, 0x8c, 0x2b, 0x0b, 0x32, 0x1b, 0x51, 0xbe, 0xc7, 0x83,
+- 0x67, 0x29, 0xc3, 0x51, 0x68, 0x81, 0x35, 0xca, 0x46, 0x14, 0x8c, 0x64,
+- 0xd7, 0xbf, 0x2e, 0x93, 0xb5, 0x8b, 0xfb, 0x1b, 0xa7, 0xc7, 0x32, 0x6e,
+- 0x8b, 0x77, 0x4f, 0xa6, 0x4b, 0x70, 0x3a, 0x25, 0xf2, 0x81, 0xea, 0x08,
+- 0x8f, 0xa2, 0x70, 0x0f, 0x31, 0x71, 0x58, 0xb7, 0xf8, 0x82, 0xd8, 0xc4,
+- 0x70, 0xfa, 0x76, 0x36, 0x15, 0xc4, 0xce, 0x44, 0x0d, 0xed, 0xa9, 0x16,
+- 0x2b, 0xf7, 0x48, 0x8d, 0x79, 0xe2, 0x5e, 0x17, 0xb5, 0xe8, 0x50, 0xfa,
+- 0x56, 0x7b, 0x6a, 0xa4, 0x6e, 0x0a, 0xb6, 0x9a, 0x98, 0xd4, 0xb3, 0x78,
+- 0x73, 0xcc, 0xaa, 0x61, 0x8b, 0x4d, 0xb6, 0x62, 0xcb, 0x00, 0xda, 0xf7,
+- 0x37, 0x8a, 0x4d, 0x3a, 0x31, 0x44, 0xbe, 0x7f, 0x91, 0xb1, 0xc3, 0x0c,
+- 0xed, 0x73, 0x62, 0x42, 0x01, 0x06, 0x87, 0x5d, 0xf8, 0xf1, 0xb0, 0x07,
+- 0xee, 0x58, 0x31, 0xc6, 0x29, 0xe3, 0x31, 0x72, 0x9c, 0x8f, 0x18, 0x65,
+- 0x8f, 0xd2, 0xa7, 0x7e, 0x18, 0xad, 0x42, 0x26, 0x5d, 0x8b, 0xab, 0xc4,
+- 0x94, 0x34, 0xf7, 0xe3, 0x83, 0x68, 0x00, 0x2f, 0xa7, 0x83, 0x78, 0x3f,
+- 0x2a, 0xd8, 0x13, 0xc4, 0x11, 0xca, 0xaf, 0x28, 0xe6, 0x66, 0xbf, 0x82,
+- 0x43, 0x1e, 0x38, 0x63, 0x9a, 0x67, 0x28, 0xa7, 0x0b, 0x8e, 0x4c, 0x2b,
+- 0xed, 0x46, 0xce, 0x44, 0x88, 0x1f, 0x70, 0xe8, 0x43, 0x8c, 0xb9, 0x07,
+- 0x83, 0xf9, 0xfc, 0xaf, 0xd7, 0x3d, 0x81, 0x99, 0xb4, 0x9d, 0x2f, 0x4d,
+- 0x55, 0x93, 0x98, 0x2a, 0x19, 0xba, 0x12, 0xd5, 0x24, 0x17, 0x48, 0x6c,
+- 0x37, 0x14, 0xe7, 0x62, 0x72, 0x89, 0xaa, 0xad, 0x92, 0x17, 0xe6, 0xfc,
+- 0xe5, 0x6c, 0x99, 0xc9, 0x76, 0x57, 0x31, 0xff, 0xc0, 0xd6, 0x59, 0xb9,
+- 0x1c, 0x93, 0x7a, 0x83, 0xf7, 0xe5, 0x31, 0x5e, 0xe2, 0xb5, 0xdd, 0xa1,
+- 0xd7, 0xa2, 0x7f, 0x3f, 0x4b, 0xea, 0x71, 0xc7, 0x11, 0xa4, 0x4c, 0x6e,
+- 0x17, 0x0f, 0x98, 0x78, 0x93, 0x18, 0x72, 0x39, 0x29, 0xbc, 0x48, 0xf8,
+- 0x50, 0x17, 0x7d, 0x4f, 0x19, 0xf9, 0x80, 0x86, 0x6d, 0xe4, 0xeb, 0xbe,
+- 0xf8, 0x04, 0xe3, 0x91, 0xaf, 0x93, 0x93, 0x95, 0xb3, 0x9b, 0x1f, 0x70,
+- 0xbc, 0x56, 0xec, 0xa4, 0x2d, 0x16, 0x69, 0x77, 0x61, 0x25, 0xf9, 0x8e,
+- 0x43, 0xa3, 0xcb, 0x78, 0x58, 0xfc, 0x86, 0xe4, 0x70, 0x54, 0xa9, 0x95,
+- 0xad, 0x7d, 0x1d, 0xf7, 0xa2, 0xbd, 0xda, 0x05, 0xa9, 0x6f, 0xbd, 0x81,
+- 0x25, 0x48, 0x3d, 0x2a, 0xbe, 0x93, 0x1c, 0x39, 0xac, 0x19, 0xe7, 0x31,
+- 0xcf, 0x62, 0xdd, 0xc5, 0x61, 0x99, 0x4f, 0x15, 0x65, 0xaf, 0xe2, 0x1d,
+- 0xca, 0xf5, 0x52, 0xd4, 0x37, 0x75, 0x1f, 0x1a, 0x4e, 0x5d, 0xb2, 0x4b,
+- 0xed, 0x4f, 0xda, 0x07, 0xa1, 0xb1, 0xbf, 0x4f, 0xa3, 0x21, 0xf4, 0xa9,
+- 0x72, 0x2d, 0xfc, 0xb0, 0x15, 0xdd, 0x43, 0x32, 0x07, 0xd3, 0xac, 0x24,
+- 0x1e, 0x3e, 0x6c, 0x8d, 0x2f, 0x63, 0xdf, 0x1a, 0x5b, 0x78, 0x19, 0x49,
+- 0xe7, 0xe3, 0x8b, 0x49, 0x1c, 0x4e, 0x52, 0xfe, 0x8b, 0xdf, 0xa6, 0x1c,
+- 0x26, 0x31, 0x9c, 0xd2, 0xc8, 0x1d, 0x4b, 0xe0, 0xa9, 0x0e, 0x62, 0x17,
+- 0xfd, 0x75, 0x8c, 0xed, 0xd3, 0xb1, 0x12, 0x18, 0xd5, 0xd9, 0x31, 0xbf,
+- 0x1e, 0xbf, 0x6a, 0x4e, 0x3c, 0x64, 0xc5, 0xa9, 0xbc, 0xfe, 0x1d, 0x9f,
+- 0x99, 0x2d, 0xc7, 0x32, 0xb1, 0x3e, 0x76, 0xd9, 0x9c, 0x68, 0x9d, 0xfe,
+- 0x7b, 0x85, 0x75, 0xa6, 0x2a, 0x62, 0xab, 0xe6, 0x77, 0x56, 0x2e, 0xdd,
+- 0x94, 0xcb, 0x0c, 0xed, 0x2d, 0xf3, 0x41, 0x6b, 0x5e, 0xef, 0xcd, 0x12,
+- 0x2e, 0x5f, 0x17, 0xf7, 0xcc, 0x46, 0x71, 0x15, 0xdb, 0x10, 0x43, 0xc3,
+- 0x5a, 0xd3, 0x29, 0xfc, 0x8b, 0x79, 0xe1, 0xa6, 0x7e, 0x66, 0xf2, 0x9e,
+- 0xf8, 0x9e, 0x0b, 0xb9, 0x9c, 0x8f, 0x3b, 0xc7, 0xf7, 0x27, 0x71, 0x3c,
+- 0x29, 0xd8, 0xef, 0xc1, 0x13, 0x92, 0x9b, 0x52, 0xbd, 0xbd, 0x06, 0x26,
+- 0xc8, 0xf1, 0xde, 0xa6, 0xec, 0x25, 0xff, 0x38, 0x41, 0x9e, 0x37, 0xdd,
+- 0x37, 0x45, 0x90, 0xaa, 0x92, 0x1a, 0x8c, 0xe0, 0xe7, 0x24, 0xb6, 0x27,
+- 0x7f, 0x4a, 0x1c, 0xfb, 0x98, 0xbc, 0xa7, 0x8b, 0x9c, 0x7a, 0x12, 0x5b,
+- 0x52, 0xcd, 0x78, 0x69, 0x6f, 0x0b, 0x71, 0x45, 0xb0, 0xd1, 0x77, 0xea,
+- 0xa2, 0xbd, 0x19, 0xfb, 0x0f, 0xa5, 0x91, 0x1a, 0x11, 0x7f, 0x28, 0x3e,
+- 0x57, 0x7c, 0xa1, 0x86, 0x68, 0xe2, 0x24, 0x0c, 0x7e, 0xef, 0x4c, 0x6c,
+- 0x44, 0x64, 0xe4, 0x2d, 0xf2, 0xf8, 0x49, 0x2c, 0xef, 0xd3, 0xd6, 0x1e,
+- 0xc4, 0x24, 0x56, 0xd1, 0x57, 0x26, 0x13, 0x2d, 0xec, 0xbf, 0x19, 0x3d,
+- 0x7b, 0xbd, 0x56, 0xbe, 0x49, 0x62, 0xf8, 0x6d, 0x63, 0x11, 0x18, 0x43,
+- 0x72, 0x36, 0xc3, 0x85, 0x60, 0xdc, 0xa3, 0x7c, 0x48, 0x3e, 0xdc, 0x10,
+- 0xf7, 0x32, 0x06, 0xf3, 0x1a, 0xab, 0x14, 0x9f, 0xa7, 0xc0, 0x26, 0xb5,
+- 0xc0, 0x19, 0x38, 0xa5, 0x2b, 0x28, 0xba, 0x57, 0x41, 0x88, 0xbe, 0xca,
+- 0x33, 0x8b, 0x3e, 0x64, 0x48, 0x47, 0xcf, 0x00, 0xd7, 0x7b, 0x7d, 0xdf,
+- 0x64, 0xbf, 0x56, 0xb3, 0x3f, 0xd9, 0xbb, 0x16, 0xf4, 0x8c, 0xf9, 0x3a,
+- 0x4e, 0xc1, 0x6d, 0x71, 0xab, 0x9e, 0x81, 0xeb, 0x79, 0x81, 0xd2, 0x8f,
+- 0x1b, 0xbd, 0x81, 0x19, 0x8a, 0xb4, 0xdd, 0x4a, 0xcc, 0x9a, 0xde, 0xde,
+- 0x50, 0x92, 0x8b, 0xc9, 0x3f, 0x6d, 0x62, 0x17, 0xdd, 0x96, 0xbd, 0x88,
+- 0x2c, 0x7a, 0x92, 0x11, 0xea, 0xf4, 0x4f, 0xcc, 0x54, 0x6b, 0x2b, 0xe7,
+- 0xd9, 0x28, 0xb5, 0x31, 0x0b, 0x13, 0xce, 0x4a, 0x2e, 0xce, 0x29, 0x98,
+- 0xd0, 0xdd, 0xee, 0xa2, 0x3e, 0x15, 0x12, 0x97, 0x8a, 0x46, 0x5d, 0x70,
+- 0x1d, 0x2c, 0x41, 0xe1, 0xa0, 0xf0, 0x31, 0xc9, 0x41, 0xa8, 0xb0, 0x8f,
+- 0x96, 0xd2, 0x06, 0xb8, 0x87, 0xa3, 0xb4, 0xb1, 0xa8, 0x1b, 0xf3, 0x46,
+- 0xdd, 0xf8, 0x31, 0x31, 0xa0, 0x66, 0x54, 0xc3, 0x38, 0x31, 0xc0, 0x3d,
+- 0x1a, 0xc0, 0x58, 0x34, 0x88, 0x19, 0xa3, 0xe3, 0xca, 0x1b, 0xe9, 0x66,
+- 0xee, 0xb7, 0x8c, 0x23, 0x32, 0xcc, 0xef, 0xa9, 0xec, 0x67, 0x0b, 0xb1,
+- 0x4e, 0xf6, 0x36, 0x80, 0x1d, 0x03, 0x69, 0x2c, 0xdb, 0x63, 0xe2, 0x9f,
+- 0xf4, 0x06, 0x77, 0x91, 0x22, 0xb1, 0x80, 0x89, 0x34, 0xfd, 0xda, 0x0a,
+- 0xdd, 0xbb, 0x56, 0xce, 0x3b, 0xb7, 0x57, 0x99, 0x28, 0x08, 0x79, 0x75,
+- 0xa2, 0xfb, 0xda, 0x22, 0x45, 0x7c, 0x54, 0x83, 0x67, 0x03, 0xe6, 0x22,
+- 0x5b, 0x57, 0xbc, 0x0f, 0x1b, 0x54, 0x85, 0xb6, 0xd8, 0x82, 0x9d, 0x15,
+- 0x86, 0xeb, 0x4a, 0xa3, 0x69, 0xae, 0x0b, 0xd5, 0xcd, 0xb2, 0x72, 0xd0,
+- 0xb6, 0xf5, 0xfc, 0x6e, 0xe3, 0x9a, 0x65, 0xdd, 0x1d, 0x88, 0xed, 0x56,
+- 0x90, 0xf6, 0x77, 0x20, 0x3a, 0xdc, 0x21, 0xfc, 0x89, 0x78, 0xd0, 0x4b,
+- 0x3c, 0x30, 0xbb, 0x9e, 0x0e, 0x3d, 0x88, 0xcb, 0x96, 0xc7, 0x97, 0x67,
+- 0xbc, 0x01, 0x8f, 0x6d, 0xfa, 0x1e, 0xe8, 0xb3, 0x25, 0xcf, 0x21, 0x76,
+- 0xd3, 0xdc, 0x27, 0xbc, 0xd9, 0xdf, 0xdb, 0xc3, 0xbd, 0x7f, 0xe8, 0x80,
+- 0xf8, 0x17, 0xd3, 0xec, 0x25, 0x2f, 0x45, 0x85, 0xac, 0x41, 0x43, 0x3c,
+- 0x61, 0x7e, 0x5c, 0xa3, 0xf9, 0xa6, 0x76, 0xd1, 0x8f, 0x9f, 0xdf, 0xd3,
+- 0xb0, 0x61, 0x83, 0x70, 0x96, 0x45, 0x1a, 0x63, 0xe9, 0x34, 0xce, 0x8d,
+- 0xcc, 0x47, 0xea, 0x21, 0xae, 0x87, 0xfb, 0xe4, 0x8c, 0x7f, 0xc1, 0x38,
+- 0x43, 0xb0, 0x4f, 0x53, 0x0f, 0x13, 0xf7, 0x6c, 0xa3, 0x7e, 0x6c, 0xa9,
+- 0x80, 0x71, 0xa5, 0x51, 0xc6, 0xbf, 0x3e, 0x7f, 0xae, 0xb7, 0x19, 0xbb,
+- 0xf6, 0x0a, 0xaf, 0x10, 0xfe, 0xe5, 0x33, 0x3e, 0x40, 0x0b, 0x92, 0x63,
+- 0xd9, 0xb1, 0xa2, 0x89, 0x5b, 0xf5, 0x44, 0xf6, 0xfc, 0x24, 0x76, 0x50,
+- 0x27, 0x5d, 0xec, 0x9f, 0x3e, 0x85, 0xfd, 0x69, 0x81, 0x22, 0x19, 0x6f,
+- 0xf4, 0x27, 0xe6, 0xce, 0x6a, 0x91, 0x8d, 0xf4, 0xff, 0x9b, 0x6a, 0xc1,
+- 0x8b, 0x75, 0xa1, 0xaf, 0x5a, 0xeb, 0x15, 0x7e, 0x4b, 0xce, 0x3a, 0x3f,
+- 0x1f, 0x79, 0xe6, 0x76, 0xf3, 0xf9, 0x9c, 0xed, 0x64, 0x4e, 0x1d, 0xd8,
+- 0xb1, 0x1b, 0x46, 0xb1, 0xa6, 0x45, 0xe6, 0x2b, 0x1d, 0xe8, 0xa5, 0x7c,
+- 0xb7, 0x25, 0x3b, 0xb0, 0x9f, 0xf6, 0x3a, 0xa8, 0x1f, 0xab, 0xb1, 0xa1,
+- 0x7e, 0xca, 0x8e, 0x89, 0x7f, 0x94, 0x9a, 0xc5, 0x82, 0x45, 0x7e, 0xda,
+- 0x56, 0x07, 0xe2, 0xa9, 0x73, 0xb3, 0xad, 0x9a, 0xa8, 0x4d, 0x7c, 0x9e,
+- 0xc8, 0xa2, 0x13, 0xc5, 0x7d, 0x27, 0xe1, 0xec, 0xeb, 0x44, 0x91, 0x7f,
+- 0x09, 0x56, 0x84, 0x2e, 0x98, 0x97, 0x35, 0x87, 0xfb, 0x38, 0xe5, 0x73,
+- 0x2c, 0x58, 0xc3, 0x98, 0x91, 0x71, 0xca, 0xd0, 0x1c, 0xda, 0x7d, 0x23,
+- 0x76, 0x8c, 0xc9, 0x59, 0x08, 0x1b, 0x56, 0x2d, 0x96, 0x58, 0x5c, 0xa1,
+- 0x5e, 0xcf, 0x62, 0x3c, 0xa9, 0xa9, 0xcf, 0x59, 0xe7, 0x56, 0xc8, 0xb9,
+- 0xaa, 0x3c, 0x78, 0xd2, 0x3a, 0xaf, 0x21, 0xf7, 0x37, 0x31, 0x0e, 0xd8,
+- 0x84, 0x9a, 0x98, 0x61, 0x8a, 0xbc, 0x8f, 0x23, 0xf2, 0xa2, 0x8d, 0xf3,
+- 0x68, 0x5a, 0xe4, 0xdf, 0x30, 0xa5, 0x88, 0x3e, 0xfb, 0xdb, 0x47, 0x15,
+- 0xdd, 0xb5, 0x3a, 0xa3, 0x20, 0xd0, 0xc7, 0xbe, 0x42, 0x23, 0xb3, 0xb3,
+- 0xb9, 0xf1, 0x3c, 0xbf, 0xdb, 0x44, 0x5e, 0xb0, 0x09, 0x65, 0x31, 0xe1,
+- 0xe4, 0x82, 0x0b, 0x91, 0xa5, 0xe5, 0x7c, 0x3e, 0x1d, 0xf2, 0xb7, 0x96,
+- 0x2a, 0xc2, 0x7d, 0xfc, 0x4d, 0xab, 0x14, 0xe1, 0x2a, 0xf2, 0x9c, 0xee,
+- 0xaa, 0xcf, 0x9c, 0xcf, 0xd5, 0x31, 0x1b, 0x89, 0x0d, 0x72, 0xce, 0x24,
+- 0x7f, 0xd6, 0xea, 0x46, 0xce, 0xda, 0x19, 0x97, 0xd8, 0xe1, 0x68, 0x68,
+- 0x59, 0xb4, 0x89, 0x38, 0x67, 0x2e, 0x39, 0x44, 0xbd, 0xbf, 0x88, 0x2a,
+- 0xfc, 0x73, 0x54, 0x30, 0xcd, 0x83, 0x9f, 0x47, 0x0b, 0x25, 0x26, 0x4e,
+- 0x49, 0x5e, 0xf6, 0x4c, 0xd2, 0x30, 0x29, 0xd7, 0x96, 0x55, 0xd4, 0xa5,
+- 0x40, 0xa8, 0x14, 0xa8, 0xee, 0x7e, 0xd2, 0x69, 0xc5, 0xe8, 0x65, 0xa8,
+- 0x20, 0xfe, 0xf7, 0x0d, 0xfd, 0xa1, 0xf3, 0x0e, 0xc4, 0xe0, 0x62, 0xc9,
+- 0x15, 0xda, 0xb1, 0x2d, 0xf4, 0x1b, 0x33, 0xd5, 0x26, 0xcf, 0xd4, 0xe2,
+- 0xdc, 0x6e, 0xd1, 0xd3, 0x00, 0x0a, 0xe3, 0xe7, 0xa9, 0x93, 0x2a, 0xce,
+- 0x46, 0x7d, 0xfa, 0x1a, 0xdb, 0xb7, 0xa8, 0xff, 0xf3, 0x6e, 0xc2, 0xed,
+- 0x79, 0xda, 0x03, 0x78, 0xdc, 0xc2, 0xed, 0x30, 0xb6, 0xd0, 0x2f, 0x90,
+- 0xb7, 0xed, 0x7b, 0xd2, 0xa6, 0xd2, 0x9f, 0xfb, 0x54, 0x1f, 0x63, 0xea,
+- 0x2d, 0x1c, 0x43, 0xf8, 0xe4, 0x4c, 0xf2, 0xbd, 0xa7, 0xa3, 0x0d, 0x9e,
+- 0x5f, 0xe3, 0x09, 0xda, 0xa3, 0x8c, 0x21, 0x6b, 0xd2, 0x50, 0xca, 0xd8,
+- 0xf1, 0x04, 0xd7, 0xb1, 0xad, 0x22, 0x3b, 0x6e, 0x79, 0xae, 0xef, 0xf8,
+- 0x90, 0xf0, 0xad, 0x7b, 0xb0, 0xc6, 0xea, 0x3b, 0x68, 0xd9, 0xe6, 0xbe,
+- 0xa8, 0x82, 0x19, 0xf5, 0x1a, 0x12, 0xe9, 0x66, 0x6c, 0xac, 0xac, 0xc5,
+- 0xfe, 0xc4, 0x26, 0x2c, 0x24, 0xe7, 0x7d, 0xa4, 0xd2, 0xa0, 0x5f, 0x24,
+- 0x06, 0xc5, 0x35, 0x75, 0xbe, 0xf2, 0x8d, 0x5c, 0xae, 0xba, 0x0a, 0x8e,
+- 0xb8, 0xf8, 0xbb, 0x02, 0xf4, 0xab, 0x73, 0x51, 0x62, 0x9d, 0x81, 0xcc,
+- 0xf6, 0xbd, 0x6b, 0xc8, 0x9b, 0xf3, 0x81, 0x44, 0x8d, 0xb8, 0x75, 0x4e,
+- 0x25, 0xf0, 0x3c, 0x79, 0x44, 0x8a, 0xde, 0xaf, 0x20, 0xac, 0xa5, 0xd6,
+- 0xa3, 0x08, 0xc6, 0x2c, 0xc1, 0x43, 0x79, 0x66, 0xce, 0x2d, 0x73, 0xaa,
+- 0xcc, 0xcd, 0x29, 0x7f, 0xff, 0x34, 0xef, 0x89, 0x6e, 0x09, 0xb7, 0x90,
+- 0xdf, 0x8b, 0xd1, 0x4a, 0x7d, 0xaa, 0xe2, 0x9c, 0x13, 0x09, 0xb9, 0xef,
+- 0xd5, 0x0d, 0x5b, 0x23, 0x3e, 0xdb, 0x93, 0xd5, 0xc1, 0xb5, 0x75, 0xdc,
+- 0xff, 0xf2, 0x46, 0x4c, 0x8d, 0x88, 0x2f, 0xfb, 0xc3, 0x67, 0x50, 0x8c,
+- 0xeb, 0x67, 0x50, 0x44, 0xae, 0xde, 0x53, 0xef, 0xa0, 0x61, 0xe2, 0x31,
+- 0xdb, 0x61, 0x13, 0x33, 0x45, 0xc6, 0x71, 0xb7, 0xc4, 0x9a, 0x36, 0x72,
+- 0x08, 0x23, 0x3d, 0xee, 0x16, 0x3f, 0xe9, 0x88, 0x03, 0xf3, 0xe2, 0x06,
+- 0x0a, 0xc3, 0xda, 0xbe, 0x2b, 0xf6, 0x6b, 0x66, 0xfb, 0xac, 0x39, 0x8c,
+- 0xf9, 0x6e, 0xac, 0xb9, 0x97, 0x73, 0xb7, 0x6b, 0x3f, 0x31, 0xef, 0xab,
+- 0x92, 0x39, 0xfe, 0xd2, 0x9d, 0x3d, 0xfb, 0x70, 0x07, 0xe5, 0x92, 0x97,
+- 0x89, 0x49, 0xfd, 0xf9, 0x2b, 0xf3, 0x9b, 0x37, 0xdd, 0x17, 0x2e, 0x23,
+- 0x7a, 0x3a, 0xfd, 0x3c, 0xa0, 0xe8, 0xac, 0xd4, 0x56, 0x26, 0x71, 0x28,
+- 0x29, 0xba, 0x2b, 0x32, 0x8e, 0xe0, 0x22, 0x79, 0x61, 0x41, 0xff, 0x24,
+- 0x06, 0xc9, 0x0b, 0xed, 0x71, 0xef, 0x3e, 0x4a, 0x12, 0x1b, 0xd5, 0x25,
+- 0xc4, 0xea, 0x32, 0xce, 0x23, 0x3f, 0x87, 0x3a, 0x4b, 0xee, 0xe2, 0x5f,
+- 0x76, 0x72, 0xbd, 0x45, 0xe4, 0x48, 0xcd, 0xb1, 0x42, 0x68, 0x15, 0xe5,
+- 0x28, 0xd5, 0xe4, 0x0c, 0x7c, 0xb6, 0x5d, 0x94, 0x73, 0x29, 0xd1, 0xe6,
+- 0x62, 0x95, 0xd5, 0xd6, 0x63, 0x9d, 0x01, 0xd1, 0x2a, 0xc5, 0xff, 0x8a,
+- 0xcf, 0x25, 0xdf, 0x5e, 0x2c, 0x3e, 0x37, 0xcc, 0xb9, 0xcd, 0xc9, 0xd5,
+- 0x99, 0x56, 0x59, 0xf7, 0xf7, 0x25, 0x2e, 0x7c, 0xd9, 0x9f, 0xf8, 0x3d,
+- 0x9f, 0xe9, 0x80, 0xba, 0xb7, 0x18, 0x0f, 0xfd, 0x65, 0x09, 0xf4, 0xca,
+- 0x6c, 0xae, 0x7c, 0x5e, 0x38, 0x1a, 0x32, 0x13, 0xc2, 0x93, 0xee, 0x84,
+- 0x67, 0xb6, 0x8c, 0x25, 0x18, 0x20, 0x7b, 0x21, 0x7b, 0x27, 0x39, 0xdc,
+- 0xdb, 0xd5, 0x18, 0xbc, 0xea, 0xc4, 0xf5, 0x7d, 0x98, 0x0f, 0xed, 0xe1,
+- 0x2a, 0xae, 0x2d, 0xeb, 0x23, 0x76, 0xd0, 0x47, 0x04, 0xfc, 0x59, 0x0c,
+- 0x93, 0x1a, 0xbd, 0x93, 0x3e, 0x62, 0x84, 0x3e, 0xe2, 0xa2, 0x5e, 0x8e,
+- 0xe5, 0x39, 0x1f, 0xd1, 0x6e, 0xd3, 0xad, 0xfe, 0x9d, 0xda, 0x7d, 0x35,
+- 0xc4, 0x30, 0x8e, 0xf1, 0xb5, 0x9b, 0xb8, 0xd8, 0x4c, 0xed, 0x97, 0xe6,
+- 0x23, 0x55, 0xb2, 0xc6, 0xe6, 0x9a, 0x6c, 0x8e, 0xbc, 0x03, 0xfb, 0x88,
+- 0x8f, 0x35, 0x9a, 0x3c, 0xa3, 0x25, 0x6b, 0xec, 0x1d, 0xe8, 0x67, 0xff,
+- 0x7d, 0xc4, 0xc8, 0x18, 0x31, 0x52, 0x5f, 0x78, 0xec, 0x45, 0x15, 0xf5,
+- 0x1d, 0x64, 0x0f, 0xdf, 0x16, 0x6c, 0x79, 0x99, 0xd8, 0xf2, 0x3c, 0x31,
+- 0x72, 0x67, 0x4a, 0xc6, 0x91, 0xf1, 0xf2, 0xe3, 0x48, 0x9f, 0xff, 0x66,
+- 0xae, 0xaf, 0x92, 0xb9, 0xde, 0x6e, 0x1e, 0xf2, 0xdb, 0x9f, 0xf2, 0xef,
+- 0x62, 0x8b, 0x43, 0xf5, 0x26, 0xa6, 0x9f, 0xa9, 0x98, 0x24, 0xbe, 0x5a,
+- 0x71, 0x00, 0xfd, 0x6b, 0x04, 0x2b, 0x17, 0xab, 0xb8, 0x1c, 0x9d, 0x44,
+- 0xd1, 0x81, 0x3c, 0x16, 0x99, 0x4b, 0x4e, 0x10, 0x87, 0x06, 0x21, 0xd8,
+- 0xd3, 0xc4, 0x3d, 0x30, 0x68, 0x13, 0x65, 0x18, 0x4d, 0xca, 0xd9, 0x0b,
+- 0x13, 0xbb, 0x42, 0x2e, 0x72, 0xd8, 0xee, 0xe3, 0x05, 0x96, 0x4f, 0x28,
+- 0x23, 0x5e, 0xe7, 0xf9, 0xb5, 0x70, 0x6b, 0xc1, 0x1a, 0xc6, 0x11, 0x43,
+- 0x76, 0x14, 0x2c, 0xca, 0xc6, 0x0e, 0xe7, 0xda, 0xa4, 0x5d, 0x2d, 0x06,
+- 0x77, 0x8b, 0xae, 0xf9, 0x50, 0xa3, 0x9d, 0x67, 0x2c, 0x01, 0xbc, 0x1b,
+- 0xb5, 0xdd, 0xe9, 0x22, 0x07, 0xee, 0xd2, 0x17, 0xe3, 0xda, 0xcc, 0x2d,
+- 0xb4, 0x6f, 0x37, 0x7f, 0x9b, 0xc0, 0xc1, 0xa8, 0x0b, 0x05, 0x56, 0x8d,
+- 0xb2, 0x9c, 0xeb, 0xc9, 0xea, 0xcb, 0x36, 0xea, 0x4b, 0x21, 0x63, 0xb3,
+- 0x15, 0x96, 0x5d, 0x4a, 0x3f, 0x93, 0xd6, 0xbb, 0x32, 0xda, 0x62, 0xe1,
+- 0xad, 0x41, 0xfa, 0xc0, 0x32, 0xc4, 0xfb, 0xba, 0x70, 0x36, 0x54, 0x86,
+- 0xd8, 0x01, 0xb1, 0xa7, 0x5a, 0xc1, 0x4d, 0x8e, 0xdb, 0x44, 0xf9, 0xa8,
+- 0xc4, 0x95, 0x86, 0x4e, 0xbb, 0xbd, 0x0c, 0x17, 0x2a, 0x18, 0xaf, 0x5a,
+- 0xef, 0x13, 0xb5, 0x62, 0x7f, 0x6e, 0x8f, 0x54, 0xf2, 0x9b, 0xd6, 0xeb,
+- 0x7c, 0x39, 0xbf, 0x96, 0xbc, 0x7d, 0x66, 0x6b, 0xe4, 0x3d, 0xe4, 0x30,
+- 0x2f, 0x49, 0x3e, 0xc8, 0xe6, 0xa3, 0xdf, 0x60, 0x5c, 0x34, 0x26, 0xb2,
+- 0xce, 0xeb, 0xd6, 0xeb, 0x35, 0xd9, 0x33, 0x3d, 0xf9, 0x3d, 0xc8, 0x5f,
+- 0x6b, 0x6b, 0x8b, 0x95, 0x5f, 0x98, 0xcf, 0x56, 0xcb, 0xfc, 0xae, 0x32,
+- 0x0e, 0xfb, 0x31, 0x7f, 0x5f, 0x86, 0x9e, 0xa1, 0xe9, 0x7e, 0x41, 0x6c,
+- 0xce, 0x73, 0xd3, 0xd9, 0xc3, 0x8a, 0xb8, 0xbc, 0xbf, 0x75, 0x34, 0xf4,
+- 0x24, 0xf7, 0xc1, 0xbf, 0xb0, 0xc1, 0xca, 0xa5, 0x90, 0xe3, 0x32, 0xfe,
+- 0x10, 0x3c, 0x35, 0xe8, 0xcf, 0xcb, 0xf0, 0xb3, 0xa4, 0xf8, 0x57, 0x13,
+- 0x85, 0xa1, 0x12, 0xfa, 0xbb, 0xee, 0xe7, 0x2a, 0x2c, 0xce, 0x5c, 0x86,
+- 0x4a, 0xea, 0x5e, 0xff, 0xd0, 0xed, 0xf4, 0xfc, 0x86, 0x0f, 0x48, 0x87,
+- 0x14, 0x62, 0xc2, 0x6f, 0xcc, 0x5d, 0x8f, 0x66, 0x9f, 0x39, 0x97, 0x74,
+- 0xe1, 0xa3, 0x50, 0x3b, 0x26, 0x2a, 0xc2, 0x18, 0x48, 0x14, 0xa1, 0x7d,
+- 0x56, 0xbd, 0xf5, 0xce, 0x45, 0x4d, 0xdc, 0x83, 0xf3, 0x51, 0x27, 0x9a,
+- 0x66, 0x7b, 0xac, 0x7c, 0x92, 0x8d, 0x76, 0xf1, 0x76, 0x34, 0x42, 0x5f,
+- 0xe0, 0xb9, 0xc9, 0x3f, 0x14, 0x68, 0x8b, 0x70, 0x7f, 0x0e, 0xc3, 0xf7,
+- 0x27, 0x3e, 0x27, 0xc6, 0x94, 0x1b, 0x33, 0xc3, 0x65, 0xb8, 0x7b, 0x40,
+- 0xce, 0x29, 0x48, 0x9d, 0x4a, 0x9b, 0x9a, 0xaf, 0x94, 0x61, 0xc9, 0x90,
+- 0xe0, 0xb9, 0x9c, 0xfd, 0x48, 0x87, 0x5c, 0xb1, 0x36, 0xee, 0x51, 0x27,
+- 0xea, 0xf7, 0x5a, 0x72, 0x55, 0xed, 0x8a, 0xd9, 0x75, 0x49, 0x8f, 0xe8,
+- 0xf4, 0x67, 0x9d, 0xf7, 0x53, 0xef, 0xa7, 0x42, 0xde, 0xf6, 0x99, 0x76,
+- 0xad, 0xe3, 0x57, 0x4a, 0x10, 0xa3, 0x19, 0xa0, 0x6f, 0x24, 0x80, 0x0f,
+- 0x12, 0xc2, 0xed, 0x03, 0x78, 0x7f, 0x2c, 0x88, 0x77, 0xe8, 0x87, 0x8a,
+- 0xe2, 0xde, 0xc8, 0x33, 0x8c, 0xdd, 0xde, 0xe5, 0x75, 0x61, 0x5c, 0xc7,
+- 0x15, 0xca, 0xcf, 0x19, 0x6f, 0xc4, 0xa5, 0xb1, 0x6f, 0xe0, 0xf2, 0x5e,
+- 0x05, 0xc7, 0xb4, 0x6f, 0xe0, 0xe2, 0xa1, 0x4e, 0x2c, 0xda, 0x2b, 0x67,
+- 0xf5, 0x8e, 0x86, 0x54, 0xfa, 0x81, 0x27, 0xeb, 0xcc, 0xae, 0x17, 0xf4,
+- 0x7a, 0x62, 0x86, 0x57, 0x6f, 0x67, 0x6c, 0x24, 0xf8, 0x1d, 0xb1, 0xc9,
+- 0x9e, 0xc9, 0xde, 0x75, 0xe2, 0xb2, 0x85, 0xd9, 0xb7, 0xc7, 0x89, 0x1b,
+- 0x78, 0x2d, 0xe3, 0x88, 0x6d, 0xdf, 0x81, 0x57, 0x19, 0x94, 0x6e, 0x61,
+- 0x3b, 0x17, 0x71, 0xee, 0xe9, 0x68, 0x11, 0x0a, 0xab, 0xcb, 0x2d, 0x7b,
+- 0x2b, 0x8e, 0x07, 0x70, 0x9a, 0xb2, 0x5b, 0x59, 0xed, 0xe5, 0xb5, 0xf8,
+- 0xd8, 0x20, 0xe3, 0x93, 0x99, 0xf8, 0xe0, 0x26, 0xdf, 0xfa, 0xaa, 0x85,
+- 0x0d, 0x0e, 0xed, 0x81, 0x39, 0x59, 0x6c, 0x20, 0xa0, 0x13, 0x93, 0x25,
+- 0x27, 0x58, 0xae, 0x69, 0x1b, 0xbe, 0x4b, 0x1b, 0x4f, 0x87, 0x8e, 0xfd,
+- 0x49, 0x29, 0x39, 0xf0, 0x0b, 0xa1, 0x7a, 0xa3, 0x02, 0x2b, 0x78, 0x7f,
+- 0x62, 0x91, 0x8a, 0x75, 0xfc, 0xf6, 0xb3, 0x5d, 0x90, 0xf3, 0xb8, 0x6a,
+- 0xa6, 0x54, 0x1f, 0xff, 0xae, 0xa5, 0x2f, 0xdf, 0x84, 0xb3, 0xb1, 0x86,
+- 0xf6, 0x11, 0xe5, 0x8a, 0x69, 0x54, 0xd7, 0xf1, 0xb7, 0x2a, 0x9c, 0x8b,
+- 0x7a, 0x27, 0x0e, 0xa1, 0xc1, 0x33, 0xa5, 0xec, 0x37, 0x0d, 0x55, 0xf6,
+- 0x47, 0xd6, 0x2b, 0xcf, 0xdf, 0xc5, 0xfb, 0x17, 0xa6, 0xe9, 0xe1, 0x8d,
+- 0xf8, 0xca, 0x79, 0x5d, 0xff, 0x84, 0x83, 0x98, 0x4b, 0x86, 0xf5, 0x06,
+- 0x75, 0x0b, 0xb1, 0x20, 0xa2, 0xde, 0x4e, 0xff, 0x8a, 0xa8, 0x7f, 0x61,
+- 0xc6, 0x8b, 0x65, 0x50, 0x2d, 0x5f, 0xd4, 0x8a, 0xe4, 0xd0, 0x74, 0x1e,
+- 0x29, 0x7a, 0x97, 0xe5, 0xa4, 0xed, 0x15, 0xdd, 0xc7, 0x9d, 0xf4, 0x87,
+- 0x09, 0x62, 0x78, 0x9c, 0x18, 0x5e, 0x48, 0x0c, 0xbf, 0xba, 0xa7, 0x18,
+- 0x67, 0xf7, 0x34, 0x21, 0x5d, 0x21, 0xcf, 0xd8, 0xe1, 0xe4, 0xea, 0x52,
+- 0x96, 0x6f, 0xb7, 0xa1, 0xa6, 0x7f, 0xa9, 0x9c, 0x75, 0x85, 0xf8, 0xd0,
+- 0x82, 0x38, 0x11, 0xb1, 0xd5, 0x0e, 0x87, 0xf5, 0x7e, 0xc1, 0x8c, 0x9b,
+- 0xf4, 0xcf, 0xa5, 0x15, 0xa2, 0xa5, 0x4a, 0xf0, 0xe1, 0xe2, 0x1c, 0xf1,
+- 0x99, 0x3f, 0xe5, 0x5c, 0x8e, 0x53, 0xa7, 0x9f, 0xd2, 0xef, 0x91, 0x1a,
+- 0x1d, 0xdb, 0xcb, 0x73, 0x12, 0xc3, 0x98, 0xd8, 0x41, 0x0d, 0xab, 0xaf,
+- 0x36, 0x91, 0xd0, 0xc3, 0xf4, 0x4f, 0x21, 0x44, 0x2a, 0x82, 0xf4, 0x4b,
+- 0x72, 0xad, 0xe2, 0x12, 0xe3, 0xaf, 0x4c, 0x50, 0xc1, 0x47, 0x5f, 0x13,
+- 0xbf, 0xef, 0xd7, 0xcf, 0x2a, 0xa7, 0x67, 0x65, 0xdf, 0x6b, 0x10, 0x8c,
+- 0x28, 0xb7, 0x30, 0xa2, 0xd0, 0xe2, 0x40, 0xb3, 0x2d, 0x6c, 0xf1, 0xd8,
+- 0xe4, 0x4c, 0x51, 0x34, 0x74, 0x6f, 0xa2, 0x61, 0xc2, 0x67, 0x27, 0x1f,
+- 0xfb, 0xe3, 0xaf, 0x91, 0x87, 0x59, 0x7c, 0x60, 0xba, 0xdf, 0x69, 0x02,
+- 0xa6, 0xcb, 0x23, 0x7f, 0x76, 0xd9, 0x93, 0xc5, 0xca, 0x72, 0xe1, 0x6d,
+- 0xff, 0xcf, 0x6c, 0xbd, 0x69, 0xfe, 0x79, 0x1c, 0xf9, 0x25, 0xaf, 0xe5,
+- 0x79, 0xb1, 0x3b, 0xea, 0x45, 0xfc, 0x1f, 0xcd, 0xc7, 0x2d, 0xee, 0x76,
+- 0x6c, 0x8e, 0x9c, 0xcb, 0x74, 0xf4, 0xff, 0xfd, 0x1c, 0x79, 0x9f, 0xc1,
+- 0x36, 0x8d, 0x03, 0x64, 0xfd, 0xea, 0x3b, 0xe6, 0x2a, 0x6b, 0xae, 0xa7,
+- 0x73, 0xed, 0x24, 0x56, 0x96, 0xb9, 0x28, 0xf8, 0x81, 0xd6, 0xa0, 0x9e,
+- 0x46, 0xa9, 0xe0, 0x49, 0x44, 0xea, 0x91, 0xc5, 0x9a, 0xcf, 0x7d, 0x90,
+- 0xdf, 0xbb, 0x78, 0xff, 0x35, 0xcd, 0xd1, 0xf4, 0x2c, 0xa4, 0x06, 0x6b,
+- 0xe3, 0x5e, 0x35, 0xb8, 0x4f, 0xc3, 0x1f, 0x29, 0x54, 0xa6, 0xcc, 0xf6,
+- 0x2a, 0x69, 0x93, 0xad, 0xc5, 0x42, 0x39, 0x6f, 0xe5, 0x49, 0xb2, 0x3a,
+- 0x53, 0x4b, 0x9d, 0x11, 0xec, 0x12, 0xde, 0xb1, 0x80, 0x6b, 0x57, 0x31,
+- 0x34, 0x26, 0x1c, 0xc1, 0x65, 0xf1, 0x20, 0xb5, 0xae, 0xce, 0xb3, 0x1e,
+- 0xca, 0x5c, 0x62, 0x2c, 0xb6, 0xea, 0xb8, 0xd3, 0x86, 0xb7, 0xee, 0xb4,
+- 0x85, 0x97, 0xfe, 0xd9, 0xfd, 0x8d, 0x77, 0xcf, 0x95, 0x77, 0x5f, 0xc8,
+- 0xe6, 0x24, 0x2f, 0xeb, 0x96, 0xba, 0xe1, 0x72, 0xf2, 0xaa, 0x41, 0xc6,
+- 0xf2, 0xcb, 0x83, 0xbf, 0x33, 0xbf, 0xed, 0x88, 0x78, 0xec, 0xa8, 0xf3,
+- 0xf4, 0xe0, 0x9a, 0x99, 0xaa, 0xb2, 0xee, 0xcf, 0x95, 0xf7, 0x0d, 0x9c,
+- 0xd2, 0x3f, 0xb9, 0xc8, 0xdd, 0x75, 0x26, 0xe3, 0x64, 0xdb, 0x32, 0x3b,
+- 0xed, 0x82, 0x32, 0x33, 0xeb, 0x67, 0xd5, 0xb9, 0x6d, 0x4a, 0x3d, 0xb5,
+- 0xa3, 0x0a, 0x47, 0xa8, 0xbf, 0x47, 0xc6, 0xc4, 0xff, 0xa9, 0x38, 0x4c,
+- 0x3b, 0x3d, 0x54, 0xef, 0xeb, 0xbc, 0xcc, 0xb8, 0xf1, 0x43, 0xf2, 0xf9,
+- 0x37, 0x34, 0x6f, 0xfb, 0x29, 0xc9, 0x29, 0x86, 0x1c, 0x38, 0x13, 0xbc,
+- 0x66, 0xe5, 0x78, 0x63, 0x07, 0x54, 0x0c, 0x26, 0xb2, 0xf6, 0xfe, 0x0a,
+- 0xed, 0xf8, 0xc6, 0x99, 0x03, 0x1d, 0x5b, 0x06, 0xc4, 0x3e, 0x1a, 0x2d,
+- 0x3b, 0xba, 0x91, 0x13, 0x12, 0xbc, 0x16, 0xbb, 0x78, 0x42, 0x6a, 0x71,
+- 0x46, 0x0a, 0x0e, 0xca, 0x77, 0x39, 0xf9, 0xae, 0xf8, 0xd8, 0x00, 0x63,
+- 0x5b, 0x07, 0xed, 0xe7, 0x14, 0xe3, 0x0c, 0xce, 0x2d, 0x6c, 0x9a, 0xef,
+- 0x30, 0xee, 0x1a, 0x42, 0x83, 0x7a, 0x02, 0x6b, 0xc8, 0x59, 0xc9, 0x67,
+- 0xc6, 0x9a, 0xb1, 0xd3, 0x8a, 0x9b, 0x7c, 0xea, 0x0a, 0x65, 0x21, 0xd7,
+- 0xdf, 0x8c, 0xee, 0x43, 0xb5, 0xe4, 0x35, 0xa6, 0xb9, 0x5a, 0xff, 0x73,
+- 0x54, 0x0e, 0x74, 0x77, 0x56, 0x52, 0x1e, 0x9f, 0x86, 0x8c, 0x0e, 0x62,
+- 0xfa, 0x86, 0x13, 0x4a, 0xc3, 0xda, 0x98, 0xf2, 0x6d, 0xee, 0x87, 0xe4,
+- 0x41, 0x3c, 0x8c, 0xc7, 0x57, 0xd3, 0x9f, 0xfd, 0x0f, 0xec, 0x50, 0x95,
+- 0x25, 0xb6, 0xb0, 0xf0, 0x41, 0xf8, 0xd5, 0xb0, 0x76, 0xea, 0xa2, 0x7d,
+- 0x33, 0xbd, 0x4f, 0x23, 0xef, 0x89, 0x5f, 0x97, 0xb6, 0x72, 0xb6, 0xbe,
+- 0x13, 0xc7, 0xd3, 0xd4, 0xeb, 0x68, 0x2f, 0x4e, 0xa4, 0x65, 0x4c, 0xe1,
+- 0x53, 0x01, 0xc4, 0x06, 0xec, 0x18, 0xd5, 0x7d, 0x91, 0x72, 0xca, 0xa5,
+- 0x38, 0xe4, 0x8d, 0xac, 0x51, 0x02, 0xe4, 0x6d, 0x69, 0x9c, 0xd9, 0xed,
+- 0x6d, 0xaf, 0x67, 0x8c, 0x18, 0x1d, 0x83, 0xfa, 0xcc, 0xe2, 0x34, 0x4e,
+- 0x0f, 0x3f, 0x04, 0xcf, 0x2c, 0xaf, 0x67, 0xb9, 0xd2, 0x82, 0xad, 0x63,
+- 0xff, 0x51, 0x2e, 0xc9, 0xc3, 0xb1, 0x5b, 0x60, 0x50, 0xf6, 0xdb, 0xd1,
+- 0x3f, 0x57, 0x6c, 0xbe, 0x67, 0xac, 0x14, 0xf3, 0xe8, 0x8f, 0x5e, 0xb2,
+- 0xfc, 0x6c, 0xd6, 0x8e, 0x6a, 0xb4, 0x8f, 0xcc, 0xc7, 0x72, 0x3e, 0xfc,
+- 0xab, 0xe5, 0xf5, 0x77, 0x66, 0x44, 0x15, 0x79, 0xc9, 0x73, 0x35, 0x28,
+- 0x62, 0x3f, 0x3b, 0x72, 0xfe, 0xba, 0x42, 0xfb, 0xbf, 0xe6, 0x43, 0x56,
+- 0x1f, 0x4f, 0xcd, 0x95, 0xa0, 0x60, 0x9b, 0x15, 0xd3, 0xcb, 0xba, 0x75,
+- 0x7c, 0x16, 0x95, 0x9c, 0x86, 0x8a, 0x13, 0xba, 0xe0, 0x48, 0x0b, 0x6d,
+- 0xd5, 0x89, 0x0d, 0x41, 0x9a, 0xa3, 0x95, 0xcf, 0x9f, 0xc4, 0xce, 0xe4,
+- 0xbf, 0x9b, 0xcf, 0x51, 0x8f, 0x56, 0x92, 0xc3, 0x78, 0x88, 0x03, 0x4f,
+- 0x85, 0x56, 0x93, 0x73, 0x72, 0xcd, 0x09, 0x07, 0x31, 0x48, 0x41, 0xa2,
+- 0x89, 0xf6, 0x1f, 0x5a, 0x80, 0x09, 0xab, 0x7d, 0xd5, 0xdc, 0x6c, 0x0e,
+- 0xf1, 0x83, 0xb9, 0xd9, 0x38, 0x50, 0xe4, 0xff, 0x9f, 0x91, 0xdf, 0x2b,
+- 0xa6, 0xa7, 0x52, 0xe4, 0xe7, 0x80, 0x9b, 0x7e, 0x6b, 0x1f, 0xdb, 0x9c,
+- 0xdb, 0xed, 0x40, 0xbf, 0xd6, 0x82, 0xfe, 0x31, 0x78, 0x3e, 0x65, 0x9b,
+- 0x7f, 0x1a, 0x1e, 0x98, 0x9b, 0xe5, 0x0a, 0x6f, 0xa1, 0x3b, 0xfa, 0xbc,
+- 0xb9, 0xac, 0x52, 0xd6, 0xeb, 0x84, 0x9b, 0xeb, 0xdd, 0x77, 0x3d, 0x9f,
+- 0xb7, 0xde, 0x7c, 0xd8, 0xf2, 0x13, 0xbb, 0xe7, 0x4a, 0xbd, 0xec, 0xa7,
+- 0x09, 0x13, 0x97, 0xf4, 0xa3, 0x56, 0x1c, 0x2e, 0xd8, 0xd0, 0x93, 0x90,
+- 0xbd, 0x95, 0xb9, 0x6d, 0xcd, 0xc9, 0xe3, 0xff, 0x54, 0xdf, 0x3c, 0xef,
+- 0x65, 0x39, 0x5d, 0x96, 0x5a, 0x75, 0x9e, 0xe3, 0x8b, 0x2e, 0x8b, 0x1e,
+- 0x5b, 0xef, 0xfd, 0x24, 0xe5, 0xfd, 0xd9, 0x27, 0xd4, 0xdf, 0x73, 0x0c,
+- 0xc9, 0xa9, 0xb4, 0xb0, 0x0f, 0xd3, 0x5c, 0xaf, 0x37, 0x78, 0x4e, 0xe0,
+- 0x8f, 0xa8, 0xdb, 0x3a, 0xb6, 0x0f, 0x48, 0xbe, 0xd5, 0xa3, 0x38, 0xf6,
+- 0xac, 0xc1, 0x25, 0xfa, 0xff, 0x9d, 0x96, 0x1e, 0x0a, 0xae, 0xc8, 0x3c,
+- 0x04, 0x5b, 0xda, 0xe8, 0xc7, 0xad, 0xb3, 0x2e, 0x91, 0x9a, 0x70, 0xa7,
+- 0xf2, 0x61, 0x7d, 0x27, 0x8e, 0x86, 0x0c, 0xb3, 0x5c, 0xf3, 0xaf, 0x65,
+- 0xd0, 0x5f, 0x34, 0xd6, 0x58, 0x88, 0xf1, 0x90, 0xf0, 0x47, 0xb8, 0xd2,
+- 0x69, 0xaf, 0x31, 0xc3, 0xae, 0xba, 0x5e, 0x4e, 0xe7, 0xb0, 0xd2, 0xf6,
+- 0xc0, 0x5c, 0x89, 0x97, 0x92, 0x16, 0x8e, 0x7c, 0x1d, 0xf7, 0x59, 0x7b,
+- 0xab, 0xd2, 0x87, 0x4a, 0xbe, 0xf7, 0x68, 0xe8, 0x4a, 0x54, 0x30, 0xc5,
+- 0x5c, 0xd2, 0x1c, 0x6a, 0x50, 0xb7, 0xe3, 0x4e, 0x62, 0xd7, 0x12, 0x9c,
+- 0xd1, 0xa5, 0xae, 0x61, 0x7c, 0xdb, 0x01, 0xa9, 0xc1, 0x1d, 0x0e, 0x6d,
+- 0x8d, 0x2e, 0xc5, 0xbe, 0x01, 0x43, 0x71, 0x86, 0xbd, 0x91, 0x18, 0xb9,
+- 0x10, 0xe3, 0x71, 0x2b, 0xdf, 0x27, 0xf9, 0x84, 0xc1, 0xc6, 0x4e, 0x6c,
+- 0xd7, 0x0b, 0xd1, 0xa3, 0x47, 0x8a, 0xb6, 0x2c, 0xee, 0xc2, 0x7e, 0xbd,
+- 0xd4, 0x98, 0x17, 0x36, 0x88, 0xe9, 0xda, 0x86, 0x24, 0xfc, 0x2d, 0x17,
+- 0xc9, 0x39, 0x8e, 0xc3, 0xdb, 0xb1, 0xc4, 0x4e, 0xcc, 0xbd, 0xc7, 0xe1,
+- 0x8a, 0x65, 0x9a, 0x90, 0x18, 0xab, 0x72, 0xed, 0xc8, 0x04, 0x11, 0x1f,
+- 0xe3, 0x7e, 0x33, 0xae, 0x75, 0x64, 0x96, 0x92, 0x83, 0x8a, 0x1c, 0xed,
+- 0xd4, 0xc5, 0x7a, 0x3c, 0xd3, 0x7a, 0xc1, 0x7c, 0xd2, 0x2f, 0xf8, 0x59,
+- 0x8b, 0x67, 0x55, 0x9f, 0xc5, 0x29, 0x23, 0xb6, 0xaf, 0xb2, 0x0f, 0x3b,
+- 0x75, 0xee, 0x55, 0xd3, 0xf3, 0xa8, 0xc8, 0x8d, 0xc1, 0x56, 0xf1, 0x6a,
+- 0xe2, 0xa7, 0xfc, 0x2d, 0xb2, 0x13, 0x19, 0x9a, 0x58, 0xa7, 0x4b, 0x2e,
+- 0xaf, 0x91, 0x36, 0xe3, 0xc6, 0xdb, 0xea, 0x8d, 0x7d, 0x78, 0x5a, 0xf7,
+- 0xe9, 0x87, 0x20, 0x39, 0xbc, 0xff, 0xce, 0xe7, 0x24, 0xdf, 0xd2, 0x84,
+- 0x17, 0x2b, 0xb2, 0xf1, 0x87, 0xc7, 0x56, 0x42, 0xdc, 0xcd, 0xfb, 0x11,
+- 0xb9, 0xef, 0x4d, 0x46, 0xa8, 0xa7, 0x1b, 0x83, 0x53, 0x66, 0xa4, 0xd2,
+- 0xe8, 0x94, 0xb3, 0x28, 0xee, 0xf0, 0xea, 0x17, 0xdd, 0xf5, 0xde, 0x8e,
+- 0x29, 0x05, 0x38, 0x13, 0xa3, 0x1f, 0xb6, 0xfe, 0xbb, 0x47, 0xe9, 0xdb,
+- 0x89, 0xa1, 0xe0, 0x1d, 0x68, 0x6f, 0x93, 0xb1, 0x9a, 0xd1, 0xbb, 0xd7,
+- 0x34, 0x4b, 0x43, 0x3e, 0x35, 0x0d, 0x27, 0x56, 0x04, 0xed, 0xb8, 0xa0,
+- 0x9a, 0x70, 0x84, 0xfe, 0xdd, 0xcc, 0xd0, 0x3f, 0x0e, 0xd3, 0x4e, 0x76,
+- 0x50, 0xc7, 0xe4, 0x5d, 0x28, 0x3f, 0xed, 0x24, 0x4e, 0x3b, 0x39, 0x13,
+- 0x9a, 0x9f, 0x7b, 0x57, 0x52, 0x23, 0xaf, 0x98, 0xc4, 0x92, 0x01, 0x15,
+- 0x9f, 0xde, 0x33, 0x89, 0xd0, 0x50, 0x7e, 0xee, 0x62, 0x97, 0xf9, 0xf9,
+- 0x4b, 0x6d, 0x50, 0xe6, 0x2e, 0x73, 0x94, 0xb5, 0xc8, 0xdf, 0xf9, 0x7b,
+- 0xf9, 0xdf, 0xc4, 0xcf, 0x3a, 0xd1, 0x6a, 0xad, 0xed, 0x2f, 0x6a, 0xb2,
+- 0x98, 0x91, 0x5f, 0x93, 0xeb, 0x96, 0xeb, 0x4b, 0xb7, 0x5c, 0x3f, 0xee,
+- 0xbe, 0xf9, 0x7a, 0xfb, 0x9c, 0x9b, 0xaf, 0xf3, 0x36, 0x71, 0x43, 0xae,
+- 0x1d, 0xba, 0x6f, 0xe2, 0x28, 0xd7, 0x3a, 0x63, 0xc1, 0x21, 0xf3, 0x42,
+- 0x85, 0xcc, 0x45, 0x62, 0xd6, 0xec, 0x5c, 0x97, 0x65, 0xa6, 0xcf, 0xf5,
+- 0xcd, 0x5c, 0x6d, 0xc0, 0x3a, 0xf7, 0x4b, 0xbb, 0xd1, 0xe4, 0x1d, 0xdf,
+- 0xdc, 0x3b, 0x74, 0xd9, 0xb3, 0x88, 0xa5, 0xe1, 0x80, 0xd2, 0x1b, 0x33,
+- 0xcc, 0x19, 0x5a, 0xb1, 0x21, 0xef, 0x4a, 0xa9, 0x7e, 0x03, 0x25, 0x7e,
+- 0x6d, 0xc3, 0x0c, 0x5b, 0x17, 0x9c, 0x0b, 0xb5, 0x8e, 0x3f, 0x53, 0x92,
+- 0x88, 0x67, 0xbc, 0x81, 0x43, 0x94, 0x55, 0x2c, 0x73, 0x95, 0x71, 0x75,
+- 0x17, 0x9e, 0x09, 0x39, 0x8c, 0xe2, 0xb0, 0xd7, 0x3d, 0x5f, 0x59, 0x86,
+- 0xed, 0x43, 0x7f, 0x8e, 0xf5, 0x49, 0xe1, 0xf8, 0xb5, 0xd8, 0x32, 0x66,
+- 0xc3, 0x31, 0xea, 0x77, 0x2f, 0xc7, 0x21, 0xfe, 0xb9, 0x53, 0x90, 0xb3,
+- 0x79, 0x8d, 0x8c, 0x91, 0x75, 0xeb, 0xb3, 0x75, 0xe8, 0x75, 0xac, 0x8f,
+- 0x9a, 0xf8, 0x54, 0xa7, 0xef, 0xd1, 0x64, 0x7e, 0x12, 0x3b, 0xb7, 0x5a,
+- 0x58, 0xfa, 0x48, 0x9c, 0xfb, 0x39, 0x4b, 0x6c, 0x75, 0x29, 0x6d, 0x56,
+- 0xc1, 0x67, 0x52, 0x77, 0xac, 0xe4, 0x9c, 0xc9, 0x0d, 0xc7, 0xa3, 0x9b,
+- 0x30, 0x1c, 0x35, 0xe4, 0x7d, 0xc0, 0xde, 0x1a, 0x7b, 0xe4, 0x85, 0x0a,
+- 0xf2, 0xec, 0x84, 0xee, 0x6f, 0x3f, 0xa7, 0xc0, 0x53, 0x16, 0xf6, 0xd3,
+- 0xcf, 0x7c, 0x89, 0xdf, 0xea, 0x92, 0x4f, 0xd3, 0x5d, 0xab, 0xa8, 0xef,
+- 0x7b, 0x86, 0x02, 0x56, 0x7e, 0xe0, 0xef, 0x6e, 0x9b, 0xbf, 0x90, 0x1a,
+- 0xb3, 0x9e, 0xcb, 0x35, 0xbe, 0x8e, 0x83, 0x69, 0x17, 0x1e, 0x8b, 0x7b,
+- 0x94, 0x79, 0x7b, 0x54, 0xdc, 0x1f, 0xf7, 0x4e, 0x2c, 0xb1, 0x93, 0x7f,
+- 0x2c, 0x9a, 0xc1, 0xfe, 0x14, 0xfc, 0x68, 0xa1, 0xf8, 0x82, 0xff, 0x0a,
+- 0x63, 0x56, 0x84, 0x7d, 0xa2, 0xb4, 0x60, 0xb1, 0x57, 0x3d, 0x68, 0xf3,
+- 0xb9, 0x7f, 0x8b, 0xad, 0xb0, 0x67, 0x56, 0xa3, 0x9b, 0xf3, 0x5f, 0x19,
+- 0x97, 0x9a, 0x55, 0x03, 0x50, 0xd1, 0x8c, 0x1d, 0x87, 0xc4, 0x36, 0xe5,
+- 0x9d, 0x75, 0x78, 0xaa, 0xc2, 0x2d, 0x77, 0xa0, 0xf8, 0x4b, 0x72, 0xed,
+- 0x49, 0x89, 0x3f, 0x37, 0x94, 0xdb, 0x4c, 0xc6, 0x2f, 0xf3, 0x73, 0x35,
+- 0x89, 0xa5, 0xd8, 0x3a, 0x20, 0xf9, 0x76, 0xe2, 0xb6, 0xce, 0x38, 0xa8,
+- 0x42, 0x0b, 0x3c, 0x65, 0x93, 0x3a, 0xd0, 0x26, 0xf8, 0x62, 0x9b, 0x10,
+- 0x88, 0x89, 0xcd, 0x6a, 0x6a, 0x07, 0x22, 0xa7, 0x25, 0xcf, 0x37, 0x2f,
+- 0xe4, 0xe7, 0xbc, 0xfc, 0xbd, 0x55, 0x76, 0xdd, 0xf5, 0xca, 0xa8, 0x8a,
+- 0x09, 0x35, 0x1b, 0x47, 0x1e, 0x4a, 0x6a, 0x6b, 0x0b, 0x6d, 0x72, 0x26,
+- 0xe2, 0xb2, 0x19, 0xb1, 0xfa, 0x55, 0x6a, 0x51, 0xde, 0x8c, 0xbe, 0xbd,
+- 0xef, 0xd2, 0x07, 0xc9, 0x18, 0xbf, 0x37, 0x9d, 0xd4, 0xcb, 0xe5, 0x6d,
+- 0x1e, 0xdc, 0x17, 0x97, 0x3c, 0x69, 0x4f, 0x75, 0xf6, 0x4c, 0x87, 0x5c,
+- 0x3b, 0xd0, 0xa1, 0x13, 0x64, 0x67, 0x7d, 0x61, 0x56, 0x59, 0x71, 0xe9,
+- 0x97, 0x59, 0x9d, 0x49, 0xdc, 0x7d, 0x87, 0xd8, 0x78, 0xcf, 0x58, 0x83,
+- 0x3b, 0xab, 0x77, 0x4d, 0xbc, 0x96, 0xbe, 0xb4, 0x7d, 0x9b, 0xe4, 0x34,
+- 0x2e, 0xf9, 0xcc, 0x23, 0xa3, 0xd3, 0xdb, 0xe7, 0x73, 0x30, 0x55, 0x39,
+- 0x4e, 0x95, 0xd7, 0x37, 0xa9, 0xf5, 0x45, 0x94, 0x87, 0xa3, 0x2d, 0xca,
+- 0xaa, 0xa8, 0xd4, 0xfb, 0x6c, 0xd1, 0x12, 0xeb, 0x5c, 0xab, 0x89, 0xef,
+- 0x85, 0xc6, 0x95, 0x6d, 0xd6, 0x99, 0x59, 0x43, 0x49, 0x36, 0x02, 0x95,
+- 0xa3, 0xcd, 0xca, 0xf6, 0xe8, 0x27, 0xe6, 0x53, 0x56, 0x5d, 0x7d, 0xa6,
+- 0x75, 0xbe, 0xa6, 0x70, 0xd4, 0x85, 0x8a, 0x83, 0x25, 0x28, 0x18, 0xd4,
+- 0x30, 0x73, 0xf4, 0x41, 0xf2, 0x56, 0xe1, 0x3a, 0x46, 0x8b, 0xc3, 0x3a,
+- 0xa3, 0xf6, 0xfa, 0xf5, 0x33, 0x6a, 0x0e, 0xe2, 0x82, 0x01, 0xeb, 0x1f,
+- 0x63, 0xa5, 0xc3, 0x8c, 0x95, 0xcc, 0x25, 0xdf, 0x0b, 0x19, 0x3b, 0x66,
+- 0xc2, 0x1b, 0xa8, 0xb4, 0x19, 0xa6, 0xe4, 0x6e, 0x5e, 0x21, 0x61, 0x5c,
+- 0x53, 0x67, 0x60, 0x45, 0x9d, 0xbc, 0x9b, 0xe9, 0x30, 0xec, 0xe1, 0x2e,
+- 0x1c, 0x0e, 0x75, 0xe1, 0x3d, 0xbd, 0x0b, 0x3b, 0xf5, 0x62, 0xa3, 0x3c,
+- 0x5c, 0x2a, 0x67, 0xd9, 0x27, 0xa2, 0xd0, 0xf4, 0xb4, 0xa2, 0x9d, 0xba,
+- 0x0a, 0xef, 0x3e, 0x9f, 0xe2, 0x35, 0x96, 0x29, 0x1a, 0x2e, 0x67, 0xbc,
+- 0x53, 0xe5, 0xb4, 0x81, 0x6b, 0x99, 0x00, 0xa6, 0x88, 0xab, 0xc9, 0x31,
+- 0x39, 0x4f, 0x52, 0x8b, 0x81, 0xb1, 0xff, 0x29, 0xdc, 0xc0, 0x20, 0x26,
+- 0x59, 0x67, 0x2a, 0x9f, 0x93, 0x5a, 0xa6, 0x33, 0x98, 0xe3, 0x30, 0x86,
+- 0xb2, 0xae, 0xb1, 0x0c, 0xd7, 0xe8, 0x9d, 0x7e, 0x98, 0xee, 0x64, 0x3c,
+- 0x87, 0xd7, 0x6a, 0x60, 0xff, 0xbe, 0x1b, 0xf5, 0xc9, 0x19, 0x38, 0x56,
+- 0x5f, 0x89, 0x02, 0x1c, 0x1d, 0xee, 0x20, 0xc7, 0xef, 0x6e, 0x2f, 0x67,
+- 0x7c, 0x3a, 0x3a, 0xec, 0x44, 0x2a, 0x25, 0x39, 0x07, 0xab, 0x36, 0x39,
+- 0xe9, 0xa0, 0x2d, 0xed, 0x4a, 0xa0, 0xbe, 0x26, 0xec, 0x4f, 0xd6, 0xd8,
+- 0x55, 0xf6, 0x51, 0x85, 0x54, 0x5a, 0xe3, 0x27, 0xc0, 0x4f, 0x90, 0x9f,
+- 0x26, 0x7c, 0x8f, 0x36, 0x5b, 0x41, 0xbc, 0x7d, 0x35, 0x5d, 0x86, 0x4f,
+- 0x92, 0x5a, 0x40, 0xa7, 0x1e, 0x0c, 0x33, 0x46, 0x30, 0x2c, 0x39, 0x95,
+- 0xe1, 0x2a, 0xed, 0xf4, 0xa5, 0x50, 0x19, 0xcc, 0xd4, 0xed, 0x62, 0x42,
+- 0x79, 0xff, 0x25, 0x7f, 0x0e, 0x33, 0x5b, 0x5f, 0x3d, 0x92, 0x81, 0xf2,
+- 0x78, 0x9d, 0x41, 0x7d, 0x61, 0x0c, 0xbb, 0x48, 0x6a, 0x29, 0x5a, 0xe7,
+- 0x25, 0x7b, 0xb1, 0x51, 0x13, 0xf6, 0x7a, 0x6a, 0xec, 0x1a, 0xce, 0xa5,
+- 0x27, 0x11, 0x4f, 0xca, 0xbb, 0x6d, 0xa2, 0xc7, 0xef, 0x9b, 0x46, 0x85,
+- 0x9c, 0xc9, 0xe8, 0x44, 0x5c, 0xab, 0x64, 0x1c, 0x24, 0xef, 0x3e, 0x1e,
+- 0x0e, 0x45, 0x63, 0xa5, 0xf2, 0x9e, 0xf0, 0x92, 0x97, 0x43, 0xde, 0x96,
+- 0x7e, 0xc5, 0x78, 0xa8, 0xc4, 0x7a, 0xaf, 0xa3, 0x8b, 0x58, 0xac, 0xa9,
+- 0x4e, 0xc5, 0xdb, 0xb4, 0x05, 0x01, 0x1c, 0x4b, 0x8b, 0xdc, 0x28, 0xa7,
+- 0xb1, 0xac, 0xdc, 0x6e, 0x9c, 0x9d, 0xce, 0xea, 0xc1, 0xc6, 0xa8, 0x83,
+- 0xdf, 0xb2, 0xf7, 0x72, 0xae, 0x95, 0x3e, 0xc2, 0xda, 0xff, 0x9f, 0xdf,
+- 0x91, 0x3b, 0xbf, 0xda, 0x5e, 0x19, 0x76, 0x05, 0x97, 0xc7, 0xed, 0x9f,
+- 0xc8, 0xfb, 0xc8, 0x4f, 0x34, 0xca, 0x7b, 0x6b, 0xae, 0xe0, 0xe3, 0xa3,
+- 0xae, 0xe0, 0xda, 0xf8, 0x51, 0x85, 0xf2, 0xda, 0x57, 0x63, 0x77, 0x05,
+- 0x1f, 0xb9, 0xd1, 0x9e, 0xfb, 0xde, 0x85, 0xb1, 0x50, 0xb1, 0xa1, 0x86,
+- 0xc5, 0xa7, 0x7b, 0x03, 0x9f, 0x28, 0x96, 0x2f, 0x37, 0x4a, 0xe8, 0x63,
+- 0x9f, 0xcf, 0x8c, 0x9b, 0xed, 0xb3, 0x04, 0xab, 0xec, 0x1c, 0xeb, 0x2a,
+- 0x5e, 0x49, 0xdd, 0x78, 0xae, 0x85, 0xcf, 0x15, 0xf3, 0xb9, 0x92, 0xb0,
+- 0xc4, 0x8d, 0x5e, 0x7d, 0x95, 0xa2, 0x79, 0x8a, 0x14, 0xa9, 0x87, 0x69,
+- 0xf8, 0x55, 0xfa, 0x9f, 0xef, 0x90, 0x78, 0xb7, 0x67, 0xac, 0x12, 0x6b,
+- 0x76, 0x9b, 0x4b, 0xe6, 0x2d, 0x34, 0x97, 0xa4, 0x43, 0x31, 0xf3, 0xa5,
+- 0x6a, 0xd9, 0x4f, 0xa9, 0xf1, 0xc9, 0x33, 0x9a, 0xea, 0x63, 0x9c, 0xf9,
+- 0x4d, 0x7d, 0xbb, 0xbc, 0xa3, 0x07, 0x79, 0x7f, 0xa9, 0x90, 0x63, 0x9c,
+- 0x4c, 0x89, 0x8e, 0x6c, 0x6d, 0x77, 0x31, 0x16, 0x95, 0x77, 0x67, 0x0f,
+- 0x73, 0xef, 0x0f, 0xa6, 0xfe, 0xd7, 0x1d, 0x72, 0x76, 0x5d, 0xce, 0x06,
+- 0x00, 0xff, 0x1f, 0x17, 0x23, 0xca, 0x76, 0xf8, 0x78, 0x00, 0x00, 0x00 };
++ 0xec, 0x5c, 0x7f, 0x70, 0x1c, 0xd5, 0x7d, 0xff, 0xbc, 0xbd, 0xbd, 0xbb,
++ 0x95, 0x74, 0x3e, 0xed, 0x9d, 0x4e, 0xb2, 0x04, 0x06, 0xef, 0xa2, 0x95,
++ 0x74, 0x58, 0xc6, 0xec, 0x9d, 0x4e, 0xb6, 0x48, 0xb7, 0xc9, 0xd5, 0x36,
++ 0x20, 0x17, 0x52, 0x84, 0xa1, 0xc1, 0xcc, 0x30, 0x9d, 0x1b, 0x63, 0x8c,
++ 0xb0, 0x1d, 0xa2, 0x00, 0x33, 0xc8, 0x29, 0x13, 0x16, 0xfc, 0xb3, 0xf8,
++ 0xa4, 0x93, 0x8d, 0x8c, 0xc9, 0xf4, 0xd7, 0x21, 0xcb, 0x8a, 0x81, 0x93,
++ 0xce, 0x04, 0xda, 0x98, 0x69, 0xa8, 0x15, 0x6c, 0x53, 0x87, 0x5f, 0x21,
++ 0x19, 0x68, 0x4d, 0x9b, 0x99, 0xa8, 0x06, 0x1c, 0xd3, 0xa6, 0xd4, 0xb4,
++ 0x0e, 0xb5, 0x8b, 0xeb, 0xd7, 0xef, 0x77, 0x4f, 0x97, 0x50, 0x42, 0xcb,
++ 0x64, 0xa6, 0x7f, 0xee, 0x77, 0xe6, 0xe6, 0xf6, 0xde, 0xfb, 0xbe, 0xef,
++ 0x7b, 0xdf, 0xdf, 0x9f, 0xb7, 0x1a, 0xfb, 0xbe, 0x08, 0x6a, 0x31, 0x4b,
++ 0x73, 0xe8, 0x93, 0x19, 0x18, 0xbc, 0x27, 0xbd, 0x28, 0xb3, 0x88, 0x1e,
++ 0xbb, 0x02, 0x73, 0x55, 0x95, 0xc7, 0x05, 0x7c, 0xf2, 0xc9, 0x27, 0x9f,
++ 0x7c, 0xf2, 0xc9, 0x27, 0x9f, 0x7c, 0xf2, 0xc9, 0x27, 0x9f, 0x7c, 0xf2,
++ 0xc9, 0x27, 0x9f, 0x7c, 0xf2, 0xc9, 0x27, 0x9f, 0x7c, 0xf2, 0xc9, 0x27,
++ 0x9f, 0x7c, 0xf2, 0xc9, 0x27, 0x9f, 0x7c, 0xf2, 0xc9, 0x27, 0x9f, 0x7c,
++ 0xf2, 0xc9, 0x27, 0x9f, 0x7c, 0xf2, 0xc9, 0x27, 0x9f, 0x7c, 0xf2, 0xc9,
++ 0x27, 0x9f, 0x7c, 0xf2, 0xc9, 0x27, 0x9f, 0x7c, 0xfa, 0xff, 0xa4, 0x00,
++ 0xa0, 0xf3, 0xf7, 0x9c, 0xd9, 0x0f, 0x34, 0xc5, 0x71, 0x37, 0x2e, 0xb5,
++ 0xa0, 0x05, 0x9c, 0x33, 0x1b, 0x6f, 0xb7, 0x80, 0x6c, 0xa9, 0xd3, 0x58,
++ 0x86, 0xff, 0x92, 0x6e, 0x42, 0x05, 0x8f, 0x5f, 0xe2, 0x9c, 0xff, 0xf3,
++ 0x17, 0x96, 0x98, 0xa7, 0x8b, 0x01, 0x68, 0xba, 0xf3, 0x46, 0x4a, 0x6f,
++ 0x87, 0x36, 0x8f, 0xd6, 0xfc, 0x49, 0xc7, 0x95, 0x71, 0x44, 0xab, 0xb2,
++ 0xe0, 0x2a, 0x8e, 0x94, 0xfb, 0x6c, 0x89, 0x97, 0x6c, 0x57, 0xf4, 0x66,
++ 0xe0, 0x06, 0x9c, 0x83, 0xe2, 0xae, 0xfc, 0x05, 0x69, 0x04, 0x2b, 0x3b,
++ 0xab, 0x93, 0x1a, 0x82, 0xfb, 0xa0, 0xab, 0x8e, 0x82, 0xa0, 0x55, 0x8b,
++ 0xd0, 0x13, 0x75, 0x08, 0x3e, 0xd1, 0x8c, 0xf0, 0xe4, 0x01, 0x91, 0x2b,
++ 0x6a, 0x98, 0x09, 0x1c, 0x14, 0x6b, 0x4a, 0xc8, 0x05, 0x9d, 0xb3, 0x37,
++ 0x8c, 0xd1, 0xba, 0xac, 0xf7, 0xef, 0x4b, 0xa6, 0x6f, 0x18, 0x2f, 0x41,
++ 0x0f, 0x38, 0x50, 0x54, 0xe7, 0x08, 0x3d, 0x33, 0xdf, 0xd9, 0x1b, 0xf6,
++ 0x96, 0x4e, 0xc9, 0x17, 0x3a, 0x12, 0x38, 0x54, 0xd6, 0x71, 0xa0, 0xfc,
++ 0x10, 0x9d, 0xc3, 0x74, 0x5d, 0x68, 0xae, 0xea, 0xb8, 0xd8, 0x92, 0x09,
++ 0x62, 0x62, 0xe4, 0x82, 0x0c, 0x58, 0xa6, 0x01, 0xc5, 0xd2, 0x0f, 0x83,
++ 0xf8, 0x0a, 0xc4, 0x57, 0x08, 0x62, 0xac, 0xb8, 0x23, 0x8e, 0xda, 0x66,
++ 0xbc, 0xd0, 0xc1, 0xeb, 0x79, 0x2d, 0xcb, 0xf8, 0x38, 0x5a, 0x5d, 0x1f,
++ 0xa2, 0xf5, 0x47, 0x33, 0xc0, 0xf8, 0x48, 0x1f, 0x2d, 0x95, 0xd8, 0x64,
++ 0x87, 0xb1, 0x5a, 0x87, 0x5b, 0xe3, 0xb0, 0xac, 0xaa, 0x1c, 0x57, 0x18,
++ 0x93, 0xff, 0x5c, 0x5f, 0x91, 0x03, 0xa1, 0x59, 0x70, 0xc3, 0x9f, 0x9a,
++ 0x3f, 0x55, 0xaa, 0xce, 0x6f, 0xa7, 0x7d, 0x34, 0x9a, 0xef, 0xc7, 0x5f,
++ 0x96, 0xd7, 0xe0, 0x2f, 0xca, 0xb7, 0xe1, 0xd9, 0x72, 0x1f, 0xed, 0x7b,
++ 0x1f, 0xed, 0x3b, 0x80, 0xbf, 0x2e, 0x6f, 0xc0, 0x77, 0xcb, 0x39, 0x3c,
++ 0x57, 0x5e, 0x85, 0xef, 0x94, 0x6f, 0xc6, 0x33, 0x65, 0x78, 0x67, 0x38,
++ 0x95, 0x49, 0x8a, 0x1f, 0xe5, 0x6b, 0xa0, 0xee, 0xdc, 0x8c, 0xe9, 0x52,
++ 0x10, 0xc1, 0x9d, 0x12, 0x23, 0xb6, 0xf9, 0x38, 0xd0, 0xa1, 0x07, 0x21,
++ 0xb0, 0xcc, 0x36, 0xf7, 0x03, 0x5f, 0x40, 0x2e, 0x61, 0x1e, 0x00, 0x9a,
++ 0xc4, 0x8f, 0x47, 0x9b, 0xc4, 0x6b, 0xa3, 0xaa, 0x78, 0x3d, 0x2f, 0x50,
++ 0xef, 0x20, 0xf2, 0x72, 0x46, 0xca, 0xeb, 0xd2, 0x52, 0x96, 0x52, 0x56,
++ 0xef, 0x0f, 0x85, 0x69, 0x3f, 0x22, 0x2e, 0x85, 0xd1, 0x68, 0x66, 0xd7,
++ 0x09, 0xcd, 0xad, 0x25, 0xf9, 0x2b, 0xba, 0x01, 0x6b, 0xa7, 0x41, 0x7e,
++ 0x60, 0x1d, 0x37, 0xe1, 0x0e, 0x2f, 0x26, 0xfa, 0xd0, 0x60, 0x2d, 0xc5,
++ 0xbd, 0x7d, 0x36, 0x8a, 0x65, 0x68, 0x31, 0xe7, 0x0c, 0x52, 0xc3, 0x02,
++ 0x36, 0xf9, 0x5b, 0xd0, 0xb3, 0x5d, 0x5a, 0xdf, 0x50, 0xf1, 0x37, 0x9d,
++ 0xbd, 0x40, 0x67, 0x2f, 0xd0, 0xd9, 0x0b, 0xa4, 0x57, 0x81, 0xf4, 0x2a,
++ 0x90, 0x0e, 0x05, 0xd2, 0xad, 0x40, 0x7a, 0x14, 0x48, 0x8f, 0x02, 0xe9,
++ 0x58, 0x60, 0x5f, 0x0d, 0x92, 0x0d, 0x22, 0xf8, 0xbb, 0xfc, 0x3c, 0x9c,
++ 0xe1, 0xcf, 0x4a, 0x1d, 0xc7, 0xe9, 0x8c, 0x8a, 0xf5, 0x9b, 0xca, 0xf8,
++ 0x6e, 0x84, 0x7c, 0x64, 0xfc, 0xe6, 0x7b, 0x2f, 0xc4, 0xc9, 0xfc, 0xbb,
++ 0x32, 0x34, 0x97, 0xf7, 0xfc, 0x22, 0xe4, 0x28, 0x70, 0xe9, 0x6e, 0x29,
++ 0xcf, 0x75, 0xcd, 0xc8, 0xb7, 0x6f, 0x61, 0x59, 0x0e, 0x4e, 0x8c, 0x2a,
++ 0x08, 0xd0, 0xd8, 0xb5, 0xf6, 0xdf, 0xcb, 0x3b, 0x13, 0xcc, 0xf7, 0x51,
++ 0x04, 0xb5, 0x6c, 0x27, 0x68, 0x0d, 0xce, 0xbb, 0x1b, 0xef, 0x6d, 0x87,
++ 0x1b, 0x75, 0x54, 0xf1, 0xe6, 0x90, 0x81, 0xb9, 0x4e, 0x16, 0x73, 0x1c,
++ 0x6b, 0x64, 0x8f, 0xd2, 0x39, 0x18, 0x47, 0xf6, 0xf2, 0x7a, 0xd8, 0xd8,
++ 0x57, 0x56, 0xc5, 0xab, 0x43, 0x73, 0x10, 0xdf, 0x69, 0xad, 0x1a, 0x12,
++ 0x0a, 0x72, 0x8d, 0x59, 0x8c, 0x67, 0x4c, 0xa3, 0x08, 0x03, 0xab, 0xd2,
++ 0x0a, 0x30, 0xd7, 0xc5, 0xd6, 0x8c, 0x69, 0xbb, 0x78, 0x08, 0xd3, 0x09,
++ 0x1b, 0x13, 0x65, 0x8d, 0x72, 0xc3, 0xc5, 0x9d, 0x19, 0x0d, 0x72, 0x24,
++ 0x8b, 0x93, 0x5d, 0x21, 0x4c, 0xf7, 0x71, 0x8c, 0xa8, 0xb4, 0xf7, 0x56,
++ 0x28, 0xf1, 0x38, 0xf9, 0xe5, 0xb0, 0x0c, 0xc6, 0x79, 0x0c, 0xe2, 0x5f,
++ 0x32, 0xbc, 0xff, 0x45, 0xe2, 0xd5, 0xdd, 0x51, 0xd4, 0xee, 0xd6, 0xf0,
++ 0xf4, 0x4e, 0x15, 0x2b, 0xc8, 0xb7, 0x7b, 0x52, 0xaa, 0xb1, 0x4e, 0x38,
++ 0x18, 0x2f, 0xab, 0x48, 0x0c, 0xb5, 0xc0, 0x88, 0x69, 0xb8, 0x74, 0xc8,
++ 0xc5, 0x3b, 0x24, 0x77, 0x90, 0xe4, 0xd6, 0x77, 0xe9, 0x98, 0x69, 0xac,
++ 0xf8, 0xf5, 0xeb, 0xf9, 0x56, 0x77, 0xa7, 0x12, 0x02, 0x42, 0x70, 0x35,
++ 0x27, 0x83, 0xfb, 0xf3, 0xad, 0xa4, 0xc3, 0xad, 0x58, 0x1a, 0xd2, 0xb0,
++ 0x7a, 0x98, 0xc7, 0x96, 0x03, 0x93, 0x73, 0xe7, 0xa0, 0x96, 0xf5, 0xe7,
++ 0x7c, 0x5e, 0x4a, 0xcf, 0x1c, 0x07, 0xbf, 0x9d, 0x60, 0xbb, 0xbb, 0xca,
++ 0x7f, 0xc8, 0x6c, 0x82, 0xf9, 0x2a, 0x39, 0x72, 0x38, 0x93, 0xc1, 0xc6,
++ 0x7c, 0x6b, 0xf6, 0x5b, 0x4a, 0x03, 0x10, 0x34, 0x0d, 0x43, 0x81, 0x96,
++ 0x70, 0x90, 0x1a, 0xa5, 0x78, 0x79, 0xd4, 0x8b, 0x17, 0xa4, 0xba, 0x4a,
++ 0x9c, 0x97, 0x9a, 0xab, 0x13, 0xff, 0xfc, 0xc5, 0x6d, 0xf8, 0xe8, 0x51,
++ 0xe6, 0x53, 0xf1, 0x03, 0x7a, 0x7e, 0x7f, 0xef, 0x8e, 0xd9, 0xda, 0xf1,
++ 0xa7, 0x9e, 0x5f, 0x0d, 0xa5, 0xba, 0xb7, 0x8d, 0x3b, 0xf3, 0xad, 0x67,
++ 0xb7, 0x29, 0xe4, 0xbf, 0x8b, 0x23, 0xa8, 0xa1, 0xfa, 0x13, 0x24, 0x59,
++ 0xfb, 0xf2, 0xe7, 0xb1, 0x32, 0x6d, 0x1e, 0xe4, 0x7f, 0x6f, 0x36, 0x66,
++ 0x55, 0xe4, 0x5f, 0x56, 0xb2, 0xf1, 0x64, 0xd9, 0xc6, 0xed, 0x74, 0x8e,
++ 0xfb, 0xf0, 0x8f, 0x40, 0xcb, 0x02, 0xe3, 0x94, 0x72, 0x42, 0xba, 0x37,
++ 0xb3, 0xbc, 0x79, 0x38, 0x15, 0x6f, 0xcd, 0x9d, 0x52, 0xcc, 0xe2, 0x76,
++ 0x85, 0x6d, 0xa5, 0xe0, 0xcb, 0xe9, 0x0c, 0x8a, 0x31, 0x1d, 0xb7, 0xa6,
++ 0x35, 0xf7, 0x52, 0x3a, 0xd3, 0x1b, 0x4b, 0x34, 0x34, 0xed, 0xca, 0xe2,
++ 0xad, 0xf4, 0x9b, 0x28, 0xae, 0x64, 0x3b, 0xf0, 0x3a, 0x3e, 0x73, 0x33,
++ 0xe2, 0x56, 0x0d, 0xe2, 0x63, 0x41, 0xd4, 0xef, 0xba, 0x20, 0x9b, 0x2d,
++ 0x1e, 0xb7, 0x06, 0xce, 0x0a, 0x3e, 0x73, 0x10, 0xd1, 0xb1, 0xab, 0xa0,
++ 0x5a, 0x66, 0x92, 0x1c, 0x9b, 0x60, 0xde, 0x90, 0x55, 0x3d, 0xbb, 0xc0,
++ 0x75, 0x5f, 0x10, 0x58, 0x97, 0xfa, 0xbe, 0xcc, 0x36, 0xf2, 0x9a, 0x67,
++ 0x68, 0x9c, 0xcf, 0x50, 0x73, 0x36, 0x8b, 0x26, 0x5a, 0x53, 0xe5, 0x8b,
++ 0xa0, 0x7f, 0x57, 0xe5, 0x0c, 0x6f, 0x2f, 0xc1, 0xb3, 0x1a, 0x7a, 0xd0,
++ 0x51, 0x78, 0x08, 0x6f, 0x2d, 0xf6, 0xf6, 0x3f, 0xbd, 0x2f, 0xbd, 0x83,
++ 0x6c, 0xc2, 0x75, 0xf4, 0xd3, 0x7e, 0xe1, 0xf9, 0xff, 0x64, 0x7f, 0x24,
++ 0x21, 0x9a, 0x69, 0x8c, 0xe3, 0x77, 0xa7, 0x34, 0x6e, 0xaa, 0xf8, 0x25,
++ 0x4c, 0xf2, 0xde, 0xcf, 0xf4, 0xa0, 0x75, 0x48, 0x85, 0xcc, 0xb7, 0xda,
++ 0x3f, 0x0d, 0x3c, 0x22, 0xa7, 0x6f, 0xe3, 0xb9, 0x56, 0xfd, 0x70, 0x40,
++ 0x60, 0xa9, 0x6a, 0x9e, 0xce, 0xa1, 0x19, 0xfb, 0xa9, 0xc6, 0xb4, 0x38,
++ 0x3a, 0xd5, 0x9c, 0x04, 0xd5, 0x1e, 0x43, 0x74, 0xec, 0xb1, 0xb1, 0x60,
++ 0xe8, 0x36, 0x7c, 0x69, 0xb7, 0x83, 0x83, 0x05, 0x1b, 0x4f, 0x17, 0xa4,
++ 0x3c, 0x69, 0x4b, 0xf9, 0xaf, 0x5d, 0x66, 0xff, 0x31, 0x6a, 0x07, 0x8b,
++ 0x96, 0x74, 0xe6, 0xea, 0x03, 0x2a, 0xd9, 0xa7, 0xcd, 0xd8, 0x20, 0xcc,
++ 0xe6, 0x29, 0x61, 0x53, 0xcc, 0xf5, 0x92, 0xed, 0x0d, 0xec, 0x2d, 0x27,
++ 0xf1, 0x54, 0xd9, 0xa2, 0xcf, 0x42, 0x8a, 0x95, 0x0c, 0xd5, 0x33, 0xd6,
++ 0x55, 0xc7, 0x78, 0x07, 0xe5, 0x45, 0x41, 0xc1, 0x7e, 0x9b, 0xe2, 0x3f,
++ 0x46, 0xbc, 0x85, 0x0b, 0xe4, 0x3f, 0x0d, 0xc9, 0x9d, 0x59, 0xd4, 0xa4,
++ 0x1a, 0x60, 0xdc, 0x68, 0x61, 0xbc, 0xa0, 0xb9, 0x41, 0x8a, 0xf9, 0xb1,
++ 0xfc, 0x38, 0xfe, 0x40, 0x4f, 0xa0, 0x96, 0xec, 0xb7, 0x2a, 0x1d, 0x01,
++ 0x6e, 0xe2, 0xb9, 0x08, 0x5a, 0xac, 0xef, 0xa3, 0x25, 0x3e, 0x07, 0xa1,
++ 0x05, 0x7f, 0x85, 0x69, 0x3d, 0x8a, 0x30, 0xf5, 0x8c, 0xf9, 0xc4, 0x33,
++ 0x9f, 0x7c, 0xd5, 0x68, 0x59, 0x24, 0x53, 0xc0, 0x6a, 0x23, 0x5e, 0xca,
++ 0xa7, 0x66, 0xd2, 0x3d, 0xb8, 0x24, 0x81, 0x32, 0x9d, 0x7f, 0x2a, 0x2f,
++ 0x65, 0x24, 0x63, 0xf6, 0x17, 0x28, 0x37, 0x27, 0x4b, 0x3d, 0x98, 0x2a,
++ 0xff, 0x1e, 0xd5, 0x73, 0x1b, 0x7b, 0xf3, 0x0e, 0xc6, 0x0a, 0xea, 0xaa,
++ 0x3c, 0xcc, 0xbe, 0xf5, 0xc8, 0xe0, 0x29, 0x8a, 0x9f, 0x89, 0x82, 0x69,
++ 0xbc, 0x18, 0xd0, 0x70, 0xcc, 0xae, 0xa3, 0x73, 0x52, 0xde, 0x92, 0x4e,
++ 0xcf, 0xe7, 0x47, 0x60, 0x35, 0xb0, 0xfd, 0xd9, 0x4f, 0x19, 0x7c, 0xbb,
++ 0xe0, 0xc5, 0xf7, 0x75, 0x1a, 0x5c, 0xd8, 0xdd, 0xec, 0x1b, 0xf7, 0x74,
++ 0x30, 0x5d, 0xa9, 0xa3, 0x7d, 0xdd, 0x36, 0xc2, 0xc3, 0x3d, 0x24, 0xb7,
++ 0xd5, 0x3e, 0x81, 0x3b, 0x30, 0xdd, 0xec, 0x62, 0x11, 0xc5, 0xbf, 0xea,
++ 0x3c, 0x9e, 0xda, 0x9c, 0x77, 0x65, 0xbd, 0x65, 0xf5, 0xff, 0x50, 0x3c,
++ 0x88, 0x57, 0x53, 0x5c, 0xd7, 0x55, 0xca, 0x7b, 0x1d, 0x3b, 0xec, 0x11,
++ 0xbc, 0x56, 0xfa, 0x2d, 0xe4, 0x62, 0x66, 0x72, 0x93, 0x58, 0x8f, 0x83,
++ 0x23, 0x57, 0x01, 0xb7, 0x70, 0x9e, 0x90, 0x6e, 0xd6, 0x7a, 0x1c, 0x2a,
++ 0x7e, 0x03, 0x47, 0x47, 0x6b, 0xf1, 0xbc, 0x15, 0x47, 0xcb, 0x44, 0x65,
++ 0x9f, 0xab, 0xbb, 0x35, 0x8c, 0x51, 0x4e, 0x5f, 0x6b, 0xab, 0x98, 0x49,
++ 0x70, 0xfd, 0xa0, 0x58, 0x4b, 0x6f, 0xa0, 0x5a, 0xe3, 0xb5, 0x5e, 0xac,
++ 0xc9, 0x18, 0xc8, 0xe7, 0xb3, 0x54, 0xff, 0x6a, 0xb0, 0x2b, 0x06, 0x71,
++ 0x3b, 0xf5, 0xb0, 0xbb, 0xf3, 0xad, 0xfd, 0xc3, 0x4a, 0x1c, 0xc5, 0x96,
++ 0x2c, 0xf9, 0x42, 0xa0, 0xc9, 0x32, 0xb0, 0xa5, 0x44, 0x15, 0xb4, 0xa4,
++ 0xe2, 0x9b, 0xa5, 0x2b, 0x50, 0x6c, 0xe2, 0xb5, 0x1d, 0x98, 0xf6, 0xbe,
++ 0x83, 0x98, 0x89, 0x9b, 0xcd, 0x20, 0x9b, 0x8d, 0x17, 0x54, 0xec, 0xb6,
++ 0xf7, 0x5c, 0x28, 0xae, 0x34, 0xf5, 0x1c, 0xe5, 0x5b, 0xc0, 0x8b, 0x5b,
++ 0x7e, 0x06, 0xbe, 0x96, 0xff, 0x50, 0x9e, 0xf1, 0xf6, 0x54, 0x39, 0xff,
++ 0xa7, 0xdf, 0x0e, 0xbc, 0x2f, 0x45, 0x98, 0xe5, 0xdf, 0x1f, 0xad, 0xfc,
++ 0x5b, 0xd1, 0x67, 0x99, 0x37, 0x0b, 0x70, 0x1c, 0xcc, 0xfd, 0x44, 0xcc,
++ 0x57, 0xea, 0x80, 0xbe, 0x98, 0xcf, 0x51, 0xcd, 0xb3, 0x38, 0x9a, 0x26,
++ 0xda, 0x50, 0xb3, 0x8b, 0x7f, 0xf3, 0xb8, 0xc0, 0x65, 0xdd, 0x9c, 0x63,
++ 0x6d, 0x50, 0xc6, 0x56, 0x47, 0x2b, 0x35, 0xb8, 0x5a, 0x1f, 0xfe, 0x70,
++ 0x56, 0xbe, 0xd7, 0xeb, 0xe9, 0x77, 0xa5, 0x86, 0x7e, 0x33, 0xc3, 0xcf,
++ 0xbc, 0xa6, 0x06, 0x6f, 0xed, 0x35, 0xed, 0xa2, 0xb2, 0x84, 0xf7, 0xac,
++ 0xe4, 0x08, 0x36, 0xce, 0xae, 0xa1, 0x98, 0x2f, 0x4c, 0x49, 0xdc, 0xca,
++ 0xf2, 0xaa, 0xeb, 0xdb, 0x10, 0xfa, 0xe5, 0xbe, 0x2a, 0x5e, 0xcc, 0x7c,
++ 0x7a, 0xdf, 0xdb, 0x64, 0xed, 0xca, 0x38, 0xc5, 0x59, 0x23, 0xd4, 0x05,
++ 0xd4, 0xe0, 0xf5, 0x26, 0xd4, 0x51, 0xde, 0x06, 0xac, 0x5b, 0x64, 0xe0,
++ 0x2b, 0x1c, 0xa7, 0x9a, 0x1b, 0x71, 0x2e, 0xc6, 0xf0, 0xce, 0x17, 0xc8,
++ 0xc7, 0x51, 0x8e, 0x47, 0xf2, 0xf3, 0xc5, 0x18, 0x7a, 0xe2, 0x92, 0x28,
++ 0xeb, 0xbb, 0x2a, 0x0d, 0x77, 0x3e, 0xd5, 0xec, 0xf7, 0xf6, 0xdc, 0x2d,
++ 0x8b, 0x7d, 0x3a, 0x5e, 0xca, 0xfc, 0x0e, 0x8d, 0x73, 0x3c, 0xd9, 0x78,
++ 0x2e, 0xaf, 0xe1, 0xfe, 0xe1, 0x66, 0x3a, 0x27, 0xd7, 0xca, 0x9a, 0xb3,
++ 0x33, 0x8a, 0x8d, 0x67, 0x29, 0x16, 0x9f, 0x29, 0xb0, 0xad, 0x54, 0x5c,
++ 0x96, 0x5e, 0x21, 0xc3, 0x4d, 0x1c, 0xdf, 0x49, 0x5a, 0xa3, 0x93, 0xec,
++ 0x28, 0x74, 0x6b, 0x99, 0x3c, 0xb0, 0x92, 0x9f, 0x3b, 0x68, 0xac, 0x89,
++ 0xbe, 0xbb, 0x65, 0xdd, 0xaf, 0x9d, 0x43, 0xff, 0xac, 0x73, 0x50, 0xdc,
++ 0x9b, 0xf6, 0x5a, 0x74, 0x12, 0x0e, 0x52, 0x91, 0xa5, 0x3e, 0x3f, 0x41,
++ 0x31, 0xb0, 0x8d, 0x7a, 0xf0, 0x7b, 0x84, 0xf5, 0xb6, 0x78, 0x78, 0xca,
++ 0x83, 0x67, 0x1e, 0x5e, 0x5b, 0x5d, 0xc1, 0x5d, 0x9a, 0x6a, 0x31, 0x16,
++ 0xab, 0xce, 0x71, 0x9e, 0xf6, 0x62, 0x6c, 0x54, 0xca, 0xcd, 0x76, 0x0b,
++ 0xc9, 0x88, 0x63, 0xb3, 0x45, 0x39, 0x3d, 0xca, 0x6b, 0xa4, 0x4c, 0xa6,
++ 0x16, 0xf4, 0xa8, 0xa2, 0x01, 0x33, 0xba, 0x2b, 0xd6, 0x66, 0x0c, 0xf1,
++ 0xd5, 0x51, 0x15, 0xf9, 0xc2, 0x45, 0x64, 0x2f, 0x29, 0x9f, 0x4a, 0x21,
++ 0xbb, 0x29, 0x55, 0x87, 0x57, 0x8a, 0x3a, 0x72, 0xfa, 0x05, 0xb9, 0xbc,
++ 0xad, 0x17, 0x65, 0x92, 0xf3, 0x41, 0xaa, 0x33, 0x79, 0x44, 0x44, 0x50,
++ 0x4c, 0x44, 0xf0, 0x78, 0x21, 0x81, 0x23, 0xe3, 0x11, 0x6c, 0xa5, 0x18,
++ 0x7d, 0x31, 0xc3, 0x7b, 0x46, 0xf0, 0x70, 0x99, 0x31, 0x55, 0x80, 0x6c,
++ 0xe4, 0x8a, 0x13, 0xde, 0x58, 0x1d, 0x96, 0x17, 0x99, 0xf7, 0x82, 0x6c,
++ 0xb1, 0x2c, 0xbd, 0x25, 0x50, 0xe5, 0x3b, 0x4e, 0xf8, 0xca, 0xa0, 0x5a,
++ 0x36, 0x8f, 0x70, 0x55, 0x33, 0x61, 0xa8, 0x04, 0x61, 0x28, 0x6b, 0x16,
++ 0x17, 0x9a, 0x94, 0x8d, 0x52, 0x3e, 0x4b, 0xb5, 0xec, 0xc7, 0xf4, 0x39,
++ 0x43, 0xf5, 0x34, 0x46, 0x3a, 0x5e, 0x36, 0xcc, 0x3a, 0xba, 0xc2, 0xa6,
++ 0x7a, 0x9b, 0x55, 0x94, 0x7a, 0xee, 0x43, 0x81, 0x29, 0xde, 0x5f, 0xc5,
++ 0x96, 0x02, 0xb0, 0xa9, 0x00, 0xf7, 0x08, 0xe5, 0x7e, 0xc3, 0x44, 0x14,
++ 0xf1, 0x09, 0x1d, 0xc1, 0x89, 0x24, 0xcd, 0x6b, 0x48, 0xd0, 0x6f, 0x97,
++ 0xb0, 0x60, 0xbd, 0xd3, 0x24, 0x16, 0x3e, 0x76, 0x5e, 0xee, 0x48, 0xa9,
++ 0x58, 0xd7, 0x66, 0xf6, 0xde, 0x28, 0x90, 0x4d, 0x0e, 0x49, 0x19, 0x4e,
++ 0x85, 0x29, 0x37, 0xe5, 0xa1, 0x04, 0xe9, 0x1d, 0x75, 0xe4, 0x83, 0xaf,
++ 0x75, 0x5b, 0xf6, 0x6b, 0x20, 0xb9, 0x65, 0x5e, 0xc3, 0xe3, 0xae, 0xf8,
++ 0xb0, 0xdb, 0x7a, 0xfc, 0x4d, 0xb4, 0xa3, 0x6b, 0x42, 0x15, 0xff, 0x36,
++ 0xb4, 0x10, 0xe9, 0x29, 0xe8, 0x21, 0xe7, 0x80, 0x98, 0x79, 0xe2, 0xa0,
++ 0x38, 0x39, 0x49, 0xe7, 0x2e, 0x90, 0x2e, 0x05, 0xd2, 0xa5, 0x40, 0xba,
++ 0x90, 0x5d, 0x9e, 0xf1, 0xf0, 0x24, 0xeb, 0x9a, 0x24, 0x2c, 0x73, 0xdc,
++ 0xc3, 0xbc, 0x8c, 0x11, 0x63, 0x8e, 0x99, 0x75, 0xc1, 0x7a, 0xb3, 0x9e,
++ 0x52, 0xbe, 0x69, 0x57, 0xf4, 0x71, 0xa9, 0xdc, 0x6a, 0x53, 0x55, 0x5b,
++ 0x48, 0xf9, 0xef, 0x36, 0xdb, 0x82, 0x75, 0x94, 0xf2, 0x3b, 0xa4, 0xd3,
++ 0x16, 0xd2, 0x71, 0x53, 0x41, 0x1e, 0x0a, 0x59, 0x96, 0x31, 0x41, 0x67,
++ 0x8b, 0x93, 0x4e, 0x89, 0x09, 0x8d, 0x74, 0x6d, 0x87, 0x4a, 0xba, 0x06,
++ 0x26, 0xa0, 0x2b, 0x74, 0x1e, 0x63, 0x8c, 0xec, 0x34, 0xf5, 0x79, 0xe7,
++ 0x61, 0xcc, 0xef, 0x8a, 0xab, 0x09, 0x9f, 0xa8, 0x64, 0xd7, 0x4d, 0x14,
++ 0x3b, 0x39, 0x15, 0x46, 0xd8, 0x52, 0xa8, 0x27, 0x6a, 0xf8, 0xf6, 0x78,
++ 0x1d, 0x26, 0xc8, 0xef, 0xc5, 0x71, 0xe8, 0x41, 0x92, 0xe9, 0x16, 0x0f,
++ 0x8a, 0x4f, 0xc6, 0x5b, 0xd0, 0x19, 0x20, 0x9c, 0x04, 0x3c, 0x92, 0x8f,
++ 0x8b, 0x89, 0x11, 0x15, 0x9b, 0x0b, 0xa7, 0x49, 0x3f, 0x89, 0xc3, 0xf6,
++ 0xc3, 0xcd, 0xc4, 0x22, 0x1e, 0xb6, 0xcd, 0x1e, 0xe0, 0x2a, 0x8a, 0xb7,
++ 0x00, 0xd6, 0x5a, 0xc8, 0x6e, 0xb3, 0xaf, 0xc2, 0x4c, 0x1f, 0x8c, 0xed,
++ 0xb6, 0xab, 0x87, 0x60, 0x1e, 0xbb, 0x9a, 0x7a, 0xd3, 0x95, 0xa4, 0xcf,
++ 0xa0, 0xe5, 0x0e, 0x50, 0xe1, 0x42, 0xb9, 0x6c, 0xf6, 0x1f, 0x25, 0x5f,
++ 0x94, 0xa8, 0xff, 0x95, 0xca, 0x4d, 0xe2, 0xe9, 0xd1, 0xf3, 0xf2, 0xae,
++ 0x94, 0x99, 0x6d, 0xa3, 0xb1, 0xe0, 0x90, 0x46, 0x38, 0x4d, 0xa3, 0x9c,
++ 0x32, 0x6d, 0x80, 0x6b, 0x03, 0xb4, 0x30, 0xd5, 0xe2, 0x9f, 0x59, 0x47,
++ 0x08, 0xa7, 0x6b, 0x20, 0x0c, 0x8f, 0xa5, 0x23, 0x02, 0xfb, 0x28, 0xc7,
++ 0x27, 0x17, 0x9a, 0xc7, 0x56, 0xc3, 0x9d, 0x6e, 0x81, 0x39, 0x18, 0x0e,
++ 0x9c, 0xc6, 0x07, 0x43, 0x21, 0xc2, 0x0d, 0xed, 0xf6, 0xeb, 0x30, 0xf5,
++ 0x7d, 0x81, 0x5f, 0xc8, 0xfd, 0x09, 0x5c, 0x14, 0xc4, 0x19, 0x69, 0xfc,
++ 0x3e, 0xaf, 0x61, 0xdd, 0x07, 0xb0, 0x2d, 0xc3, 0x38, 0x45, 0x25, 0x9c,
++ 0x02, 0xbc, 0x93, 0x37, 0xb0, 0x7f, 0x61, 0x0d, 0xf5, 0x93, 0xd6, 0x9e,
++ 0x75, 0x70, 0x57, 0xd1, 0xf5, 0x47, 0x8b, 0xd0, 0x5e, 0x79, 0x8a, 0x95,
++ 0x0d, 0x42, 0xe0, 0x29, 0xeb, 0xac, 0xdd, 0x31, 0xc9, 0x18, 0x46, 0x4d,
++ 0x2d, 0xa0, 0x5c, 0xdc, 0x5a, 0x16, 0xd4, 0xdb, 0x4c, 0x7d, 0x06, 0x6c,
++ 0x1b, 0x9d, 0xec, 0x7a, 0x5e, 0x22, 0xc6, 0xba, 0xbb, 0x39, 0xd2, 0x73,
++ 0xd5, 0x16, 0x3a, 0xff, 0x1a, 0xd2, 0xe9, 0x2e, 0xcb, 0xed, 0x21, 0xa9,
++ 0xd4, 0xa3, 0xcc, 0xe6, 0xf7, 0x48, 0xf7, 0xb5, 0x54, 0x47, 0x8a, 0xe5,
++ 0xe7, 0xea, 0xb9, 0x66, 0x4c, 0x94, 0xf9, 0x1e, 0xd7, 0x83, 0xa5, 0xf9,
++ 0x6a, 0x3e, 0xb0, 0xff, 0xd9, 0xf7, 0x1c, 0x0b, 0x1c, 0x33, 0x1c, 0x27,
++ 0x8c, 0xd1, 0x7a, 0x30, 0xda, 0xae, 0x20, 0x9b, 0x90, 0x72, 0xa5, 0x65,
++ 0x8e, 0x70, 0x1d, 0xa7, 0x98, 0xcf, 0xee, 0xb5, 0xeb, 0x29, 0x3f, 0xe1,
++ 0x3e, 0x69, 0x1b, 0x08, 0x39, 0x1c, 0x1b, 0x75, 0x14, 0xeb, 0x11, 0x6c,
++ 0xa3, 0x58, 0xd1, 0x2c, 0x2b, 0x49, 0x97, 0x0d, 0xfd, 0x9d, 0x0c, 0xf1,
++ 0x96, 0x61, 0x94, 0xed, 0x5a, 0xc2, 0x95, 0x2a, 0x62, 0xce, 0x21, 0xd9,
++ 0x60, 0x35, 0xea, 0xd4, 0xb8, 0xf5, 0x7b, 0xb1, 0x9a, 0xee, 0x17, 0x06,
++ 0xea, 0x1c, 0x9e, 0x3f, 0x27, 0x67, 0x62, 0x11, 0x8a, 0x33, 0xe6, 0xb1,
++ 0xdc, 0x67, 0xf0, 0x91, 0x44, 0x9c, 0x79, 0xb3, 0x58, 0x9d, 0x81, 0x38,
++ 0x48, 0x7b, 0xa1, 0x81, 0x73, 0xd7, 0xc0, 0x7c, 0xc7, 0x3a, 0x76, 0x88,
++ 0x7a, 0x8f, 0xd1, 0x00, 0xaa, 0xb9, 0x2a, 0x02, 0x8e, 0xa5, 0xef, 0xc5,
++ 0x51, 0xaf, 0x4e, 0x11, 0x52, 0x17, 0x2b, 0x76, 0xcf, 0x13, 0xbd, 0x84,
++ 0xcd, 0xdb, 0x53, 0x70, 0x34, 0xb4, 0x19, 0x7f, 0x43, 0xa3, 0x9b, 0x29,
++ 0xfe, 0xe7, 0x38, 0x11, 0x51, 0xda, 0x0d, 0xfd, 0x69, 0x5b, 0xa3, 0x3e,
++ 0x2a, 0xe5, 0xd6, 0x94, 0x81, 0x29, 0x9b, 0x70, 0x74, 0x63, 0x10, 0x31,
++ 0x0b, 0xba, 0xee, 0x58, 0x83, 0x07, 0x30, 0xc0, 0xf8, 0x37, 0x3a, 0x9f,
++ 0x7a, 0x25, 0x8d, 0x89, 0x31, 0xbb, 0x06, 0xd9, 0x9b, 0x05, 0x22, 0x4e,
++ 0x82, 0xce, 0x16, 0x42, 0xce, 0x7b, 0x66, 0x1d, 0x91, 0x7d, 0xd7, 0xde,
++ 0x43, 0xfa, 0x8a, 0xf9, 0xb5, 0x0e, 0x8f, 0x59, 0x76, 0x09, 0x77, 0x11,
++ 0x56, 0xa7, 0x21, 0x9a, 0xdf, 0x4c, 0xf3, 0x8f, 0x92, 0xec, 0x5c, 0xdc,
++ 0xbb, 0x87, 0xd6, 0xb7, 0x38, 0xd6, 0xf4, 0xf3, 0xd8, 0x4e, 0x3a, 0x70,
++ 0x8d, 0xe7, 0x31, 0x3e, 0xf3, 0x42, 0x3e, 0x33, 0xf5, 0x78, 0x8e, 0x2b,
++ 0x1b, 0x3f, 0xcb, 0xd3, 0xde, 0x09, 0x64, 0xb7, 0xdb, 0x10, 0x13, 0xf6,
++ 0x6e, 0xc2, 0x2f, 0xa8, 0x8f, 0x3a, 0x56, 0xff, 0x14, 0xa0, 0x44, 0x9c,
++ 0x9d, 0x28, 0xc5, 0x80, 0x47, 0x0b, 0x96, 0x7b, 0x8f, 0x62, 0x0e, 0x26,
++ 0x08, 0x13, 0x9f, 0x21, 0x4c, 0xbf, 0xab, 0x7d, 0xda, 0x8c, 0x83, 0xb1,
++ 0x7e, 0x54, 0xbc, 0xb4, 0x5b, 0x41, 0xc7, 0x62, 0xea, 0x4b, 0x54, 0x4b,
++ 0xae, 0xb1, 0xf9, 0xbe, 0x7c, 0x79, 0x7d, 0x05, 0x2f, 0xff, 0x6f, 0x39,
++ 0x69, 0x92, 0xc5, 0xaa, 0x79, 0x69, 0xf5, 0x3d, 0x8d, 0x3f, 0x93, 0xd9,
++ 0x18, 0xfb, 0x22, 0x42, 0xb5, 0xf8, 0x97, 0xf5, 0x28, 0x39, 0x49, 0xf2,
++ 0x37, 0x75, 0x07, 0x75, 0x8e, 0x19, 0xf2, 0x65, 0xf6, 0x8d, 0x3c, 0x44,
++ 0x7d, 0x9a, 0xf2, 0x2a, 0xc6, 0x7e, 0xe1, 0xfb, 0x3d, 0x19, 0x6f, 0x38,
++ 0x41, 0xba, 0xa9, 0xe8, 0x4a, 0xa3, 0x5e, 0x71, 0xac, 0xb3, 0x63, 0x74,
++ 0xe6, 0x16, 0xa7, 0x1e, 0xe7, 0x1a, 0xb8, 0x36, 0x46, 0xc5, 0x0f, 0x46,
++ 0xcd, 0x1e, 0xc2, 0xc3, 0xab, 0xee, 0x21, 0x1c, 0x75, 0x9f, 0x50, 0xd1,
++ 0x4b, 0x67, 0xb7, 0xda, 0xc8, 0x07, 0x84, 0x4d, 0x12, 0x6d, 0xd3, 0x66,
++ 0x02, 0xd5, 0xf3, 0x5e, 0x90, 0x71, 0xcb, 0x72, 0xe3, 0xca, 0xc7, 0x32,
++ 0x95, 0xe6, 0x18, 0xdf, 0x80, 0x70, 0x5c, 0x20, 0x94, 0x1e, 0xf2, 0x6c,
++ 0x4b, 0x77, 0x2a, 0xd4, 0xa7, 0x1f, 0x62, 0x1f, 0x11, 0x7e, 0x7b, 0x59,
++ 0xe6, 0xbe, 0xc2, 0xba, 0x6d, 0x9f, 0xd5, 0x73, 0x2d, 0xc7, 0x15, 0xfd,
++ 0x96, 0x73, 0xd8, 0xde, 0x87, 0xa8, 0x8e, 0x77, 0x2d, 0xe9, 0xdc, 0x3e,
++ 0xa8, 0x0c, 0x49, 0x63, 0x25, 0xfb, 0x93, 0x2e, 0x37, 0xb5, 0x9e, 0xaf,
++ 0xb5, 0xa8, 0x73, 0x1c, 0xaf, 0x0f, 0x45, 0x45, 0xfd, 0x63, 0xae, 0xd7,
++ 0x53, 0x5f, 0xa3, 0xb3, 0x9c, 0x4c, 0xf1, 0x19, 0x38, 0xc7, 0x8e, 0xe3,
++ 0x8a, 0xd2, 0xed, 0xc4, 0x1b, 0xa0, 0xfd, 0xa1, 0x51, 0xbc, 0x41, 0x52,
++ 0x9f, 0x39, 0xd7, 0x35, 0x25, 0x8d, 0x06, 0x96, 0x4f, 0xb6, 0x1e, 0x65,
++ 0x5b, 0xf3, 0xdd, 0xb2, 0x6a, 0x6f, 0xe6, 0xe7, 0xf5, 0x74, 0xe9, 0x8e,
++ 0xb1, 0xff, 0x50, 0x5f, 0xe7, 0xb0, 0x4d, 0x21, 0x6a, 0x9c, 0x4e, 0x63,
++ 0x81, 0xd8, 0x21, 0xdd, 0x44, 0xb5, 0x86, 0x45, 0xc5, 0x84, 0xb7, 0x9e,
++ 0xf7, 0xfe, 0xf4, 0xfa, 0x26, 0xf1, 0xce, 0x9e, 0xdf, 0xa5, 0x67, 0x2f,
++ 0x46, 0x7a, 0x9f, 0xa2, 0x1c, 0xd2, 0x9c, 0x7e, 0x99, 0x6c, 0xe4, 0x18,
++ 0x83, 0xf2, 0x8a, 0xbd, 0x56, 0xe6, 0x1a, 0x39, 0xd6, 0xe0, 0x26, 0x48,
++ 0xce, 0xae, 0xc7, 0x7e, 0x75, 0x8e, 0xab, 0xdb, 0xa5, 0x9c, 0xb0, 0xd7,
++ 0x90, 0x2d, 0x58, 0x4e, 0xd5, 0x16, 0x7b, 0x66, 0x6d, 0xd3, 0x5e, 0xf1,
++ 0x5f, 0xc1, 0x3b, 0x83, 0x16, 0x72, 0xde, 0xc0, 0x4b, 0x79, 0xa5, 0x89,
++ 0x6e, 0x2b, 0xe8, 0xb3, 0x05, 0x7e, 0xda, 0x43, 0xfa, 0x5d, 0x49, 0x58,
++ 0x65, 0x91, 0x35, 0xdd, 0x1a, 0x58, 0x2f, 0x31, 0x77, 0x9a, 0x82, 0xe3,
++ 0xbc, 0xd4, 0xda, 0x55, 0x84, 0xaf, 0xe0, 0x1e, 0xc5, 0xb6, 0x57, 0xf0,
++ 0x32, 0xf1, 0xad, 0xb8, 0xc2, 0x32, 0x5a, 0x05, 0xf5, 0xb5, 0xbe, 0xa5,
++ 0xe9, 0xe0, 0x2f, 0x63, 0x8f, 0xcf, 0x90, 0xf3, 0x74, 0xe0, 0x18, 0xec,
++ 0x22, 0xdf, 0xe5, 0x56, 0x2a, 0x48, 0x2d, 0x06, 0x61, 0x8d, 0xa8, 0xd8,
++ 0xba, 0x9b, 0xfd, 0xff, 0x3d, 0x9a, 0x67, 0xbe, 0xce, 0x66, 0x1d, 0xd6,
++ 0xaa, 0xc3, 0x74, 0xb1, 0x24, 0x2c, 0x4a, 0xf6, 0xe0, 0xbd, 0xaa, 0x72,
++ 0xaa, 0x32, 0xa2, 0x62, 0x72, 0x94, 0x79, 0x59, 0x17, 0xaa, 0xcd, 0x1c,
++ 0x2b, 0x29, 0x8e, 0x8f, 0x8f, 0x65, 0x47, 0x3a, 0x1a, 0x43, 0x2d, 0xaf,
++ 0x89, 0x0a, 0x7d, 0x0f, 0xcb, 0x85, 0x60, 0x3b, 0xc6, 0x48, 0xff, 0xf6,
++ 0xf4, 0xe5, 0xb3, 0xfa, 0xff, 0xb1, 0x5e, 0xc1, 0x71, 0x51, 0x71, 0xd4,
++ 0xdb, 0xbb, 0x62, 0xa3, 0x49, 0xb2, 0xf5, 0x44, 0xaa, 0xca, 0xf3, 0x38,
++ 0xf1, 0x70, 0x9c, 0x7d, 0x66, 0x4f, 0x22, 0xea, 0x15, 0x8f, 0xe4, 0xe9,
++ 0x92, 0x6a, 0x29, 0xd7, 0xd7, 0x52, 0x9e, 0x3c, 0x49, 0xbd, 0x69, 0x7f,
++ 0xb1, 0x57, 0x6c, 0xcb, 0xeb, 0xd4, 0xa7, 0x96, 0x8b, 0xad, 0x79, 0x8b,
++ 0x71, 0xd1, 0x6c, 0x9f, 0xaa, 0xbc, 0x8b, 0xda, 0x52, 0xfa, 0xe4, 0x3b,
++ 0xa2, 0x48, 0x4e, 0x77, 0xd0, 0x37, 0x7f, 0xf8, 0x41, 0xa9, 0x58, 0xfc,
++ 0x3e, 0xc8, 0x3a, 0x76, 0x22, 0x10, 0xe9, 0xe9, 0x59, 0x12, 0x40, 0xbd,
++ 0x85, 0xbe, 0x66, 0xc2, 0x07, 0x57, 0x7a, 0x35, 0xdd, 0x80, 0x51, 0x6a,
++ 0x6f, 0xac, 0xf8, 0x89, 0xf3, 0x0e, 0x6a, 0xad, 0x83, 0x5c, 0x0d, 0xd5,
++ 0x91, 0x6b, 0xba, 0x43, 0xda, 0xd1, 0xee, 0xde, 0x96, 0xf6, 0xc9, 0xa6,
++ 0x5c, 0xad, 0x73, 0x7d, 0x4b, 0xdb, 0xa4, 0xdb, 0xb2, 0x70, 0x08, 0xf8,
++ 0xf2, 0x90, 0x0e, 0xcd, 0xb9, 0xd1, 0x0d, 0x74, 0x23, 0xa7, 0x52, 0x5c,
++ 0xec, 0xe8, 0xb6, 0x7a, 0xa6, 0xc4, 0x4d, 0x37, 0x91, 0x1e, 0x2d, 0x9d,
++ 0x93, 0x86, 0xb1, 0x39, 0xf3, 0xc0, 0x4d, 0x81, 0x29, 0xee, 0x2f, 0x1b,
++ 0x06, 0xf7, 0xf1, 0x7b, 0x33, 0xba, 0x9b, 0x9e, 0xd0, 0xf1, 0xc0, 0xb2,
++ 0xee, 0x41, 0x0c, 0xe4, 0x1f, 0x40, 0x7f, 0x9e, 0xdf, 0x3b, 0x69, 0x18,
++ 0xe1, 0x1a, 0x5f, 0xe0, 0x77, 0x4e, 0x0f, 0x35, 0x30, 0x6e, 0xdc, 0x5e,
++ 0x56, 0x71, 0xed, 0x10, 0xcf, 0x99, 0xcd, 0xef, 0xa3, 0xca, 0xfb, 0x59,
++ 0x7c, 0x9f, 0xd4, 0x93, 0x6b, 0x1e, 0xb2, 0x81, 0x61, 0x29, 0x95, 0x0c,
++ 0xdf, 0x63, 0x4e, 0x13, 0xd6, 0xe3, 0xbd, 0x7f, 0x4e, 0xbd, 0x71, 0x2e,
++ 0xbf, 0x0b, 0x63, 0xca, 0x86, 0x87, 0x79, 0xee, 0xd4, 0xec, 0xdc, 0xbb,
++ 0x34, 0x07, 0x71, 0x92, 0xea, 0xfa, 0x74, 0x25, 0x2f, 0xb2, 0xb5, 0xc3,
++ 0x1a, 0xfe, 0xa8, 0xc0, 0x3c, 0x33, 0xb3, 0x3c, 0x3f, 0x21, 0x9e, 0x04,
++ 0x56, 0xc4, 0xb8, 0x76, 0x53, 0xce, 0xec, 0xae, 0xbe, 0x2b, 0x93, 0xf2,
++ 0x25, 0xfb, 0xc3, 0x68, 0xe5, 0x5d, 0x59, 0x54, 0x68, 0x8f, 0xd1, 0x33,
++ 0x61, 0x95, 0x50, 0x2a, 0x2a, 0x42, 0x8f, 0xf1, 0xfa, 0x57, 0x53, 0x95,
++ 0xf5, 0xc7, 0x52, 0xbc, 0xfe, 0xd7, 0xd7, 0xa8, 0xd9, 0xc8, 0x30, 0xdd,
++ 0xa9, 0x0a, 0xff, 0x24, 0x77, 0x34, 0x56, 0x64, 0x57, 0xd6, 0x7d, 0x6f,
++ 0x76, 0xdd, 0x41, 0x5a, 0xb7, 0x8f, 0x62, 0x8c, 0xd7, 0xb2, 0x9e, 0x1c,
++ 0xa3, 0xd5, 0xf7, 0x86, 0x49, 0x71, 0x80, 0x7a, 0xf5, 0x81, 0x92, 0x2a,
++ 0xf6, 0x52, 0x1d, 0x1c, 0xcf, 0x13, 0x36, 0xf2, 0xde, 0x05, 0x52, 0xcd,
++ 0x2f, 0x7f, 0x23, 0x56, 0xf1, 0x21, 0xf7, 0xd5, 0x69, 0xea, 0xab, 0xed,
++ 0x54, 0xdf, 0x55, 0x4f, 0xa7, 0xb0, 0x73, 0x84, 0xea, 0xbb, 0xc0, 0x49,
++ 0xaf, 0xbe, 0x1c, 0x41, 0x7b, 0x89, 0xfb, 0x80, 0x25, 0xce, 0x15, 0x8c,
++ 0x5c, 0x33, 0xc9, 0x6e, 0x29, 0x57, 0x6a, 0x03, 0xf5, 0x82, 0x2c, 0xf5,
++ 0x64, 0xf1, 0x62, 0x89, 0x7f, 0x52, 0xf1, 0x8c, 0xf3, 0x19, 0xb2, 0x62,
++ 0x4e, 0xbb, 0x8b, 0xfa, 0x76, 0x97, 0x71, 0xec, 0xc0, 0xf3, 0xc2, 0x9a,
++ 0x3e, 0x27, 0xb2, 0xb7, 0x36, 0xe3, 0x41, 0xfc, 0x3c, 0x95, 0x5d, 0x11,
++ 0xa5, 0x6f, 0xc2, 0xcc, 0x86, 0xc6, 0xef, 0x48, 0xbb, 0xdb, 0x7a, 0x36,
++ 0x88, 0x36, 0xaa, 0x37, 0x6d, 0xee, 0x16, 0xb4, 0x51, 0xcf, 0xb7, 0xb5,
++ 0xc3, 0x25, 0x5b, 0x7b, 0xa3, 0x54, 0xb5, 0x03, 0xc7, 0x29, 0xdb, 0x80,
++ 0x42, 0xdf, 0xb1, 0xb2, 0x0b, 0x04, 0xf5, 0x55, 0xea, 0xbb, 0xc3, 0xd4,
++ 0xb3, 0x2b, 0xf7, 0xce, 0x30, 0xe1, 0x16, 0xde, 0x7b, 0xdd, 0xec, 0xbb,
++ 0x96, 0x7f, 0x90, 0x95, 0x1e, 0xf5, 0x0a, 0xd9, 0x83, 0xcf, 0xfc, 0xa3,
++ 0x48, 0x65, 0xfc, 0x4c, 0x6c, 0xf6, 0xff, 0xf9, 0x21, 0x9c, 0x42, 0xf7,
++ 0xc8, 0x21, 0x81, 0x1d, 0x6d, 0x95, 0x58, 0xee, 0xe4, 0xf7, 0x98, 0xde,
++ 0x7b, 0xb7, 0x2a, 0x4f, 0xc5, 0x86, 0x0a, 0xe1, 0x99, 0x43, 0xe5, 0xac,
++ 0xb8, 0x26, 0x8f, 0x01, 0xea, 0x89, 0xd9, 0x20, 0xf1, 0x5e, 0x53, 0xea,
++ 0x15, 0xcb, 0xf3, 0x96, 0xb1, 0x89, 0x74, 0xdd, 0xa2, 0x77, 0xea, 0xe3,
++ 0x84, 0x21, 0x68, 0x3f, 0x23, 0x4c, 0xf1, 0xaf, 0x39, 0x73, 0xb1, 0x7d,
++ 0x36, 0x76, 0x28, 0x1f, 0x28, 0x7f, 0x06, 0xc5, 0x82, 0x49, 0xfe, 0xa9,
++ 0x7b, 0xb1, 0x5b, 0xd1, 0xe3, 0x9c, 0xdc, 0x76, 0x33, 0xcf, 0x5f, 0x31,
++ 0x6b, 0xfb, 0xa6, 0x38, 0xed, 0x49, 0xbf, 0x47, 0x66, 0xcf, 0xff, 0x7f,
++ 0xad, 0xbd, 0xf6, 0x92, 0xff, 0xb9, 0x66, 0x86, 0xce, 0xc9, 0x18, 0x08,
++ 0x6e, 0xdc, 0x61, 0xfc, 0x33, 0x6f, 0xd6, 0xe7, 0xd4, 0x15, 0xa3, 0x03,
++ 0xb8, 0x71, 0x31, 0xdd, 0x7c, 0xe9, 0x0e, 0xb6, 0x8d, 0x7c, 0x95, 0x1c,
++ 0x66, 0xbd, 0xcf, 0x93, 0xde, 0xd0, 0x6a, 0x9c, 0xb3, 0xb8, 0x7c, 0xa8,
++ 0xb5, 0x3f, 0x2c, 0xcc, 0xe4, 0x90, 0x30, 0xfb, 0xa8, 0xbe, 0xd9, 0x93,
++ 0x30, 0x9b, 0x17, 0x08, 0xd3, 0x58, 0x0b, 0xb6, 0xc9, 0x79, 0xb4, 0x95,
++ 0xf8, 0xfb, 0x2c, 0x2c, 0xf2, 0x6b, 0xdf, 0x70, 0x00, 0x4a, 0xfa, 0x03,
++ 0xb2, 0x2b, 0xe1, 0x35, 0xd1, 0x4c, 0xb9, 0xc4, 0xb1, 0x77, 0x1e, 0x9b,
++ 0xf3, 0xd0, 0x5a, 0x88, 0xe7, 0x2a, 0xaa, 0xd1, 0xad, 0xc3, 0xe6, 0x59,
++ 0xc2, 0x9c, 0x83, 0x5f, 0x0a, 0xb4, 0x26, 0xfb, 0x61, 0x0e, 0x6c, 0x41,
++ 0xe7, 0xf4, 0x51, 0x61, 0x66, 0xcf, 0x12, 0x16, 0x0c, 0xa7, 0x2b, 0x32,
++ 0x17, 0xcd, 0xca, 0x4c, 0x32, 0x3e, 0xf6, 0x72, 0x88, 0x30, 0x74, 0xfa,
++ 0x6f, 0xe5, 0xb4, 0x67, 0xb3, 0xe0, 0xac, 0xfe, 0x4b, 0xe2, 0x15, 0x1f,
++ 0x3c, 0x37, 0x6b, 0x1f, 0x42, 0x24, 0xb5, 0xcc, 0xc7, 0xf7, 0x30, 0x88,
++ 0x35, 0xf9, 0x2f, 0xe2, 0x61, 0xc2, 0x43, 0x59, 0x6f, 0x7d, 0x2f, 0x72,
++ 0x25, 0x88, 0xb5, 0xf9, 0xe9, 0xf0, 0x51, 0x3b, 0x88, 0xa2, 0x27, 0xe7,
++ 0x7a, 0x1a, 0xeb, 0xa3, 0x0f, 0xdb, 0x8c, 0xef, 0xe4, 0x37, 0xd3, 0x73,
++ 0xd6, 0xe3, 0xeb, 0xcf, 0xa3, 0x27, 0x9c, 0x22, 0xdc, 0xe6, 0xf1, 0x79,
++ 0xf7, 0x75, 0xe2, 0x59, 0xce, 0x73, 0x23, 0xfc, 0xae, 0x61, 0x75, 0xa6,
++ 0xcd, 0x78, 0xd8, 0xbb, 0x23, 0x1a, 0x58, 0x53, 0x32, 0x70, 0x07, 0xd5,
++ 0xd5, 0xa2, 0x57, 0x57, 0x7f, 0x85, 0xe7, 0x15, 0xe2, 0x5b, 0x46, 0x7c,
++ 0x9b, 0xbc, 0x31, 0x03, 0xcb, 0x4b, 0xc7, 0xbd, 0x58, 0x51, 0x1d, 0xf6,
++ 0x03, 0xdb, 0x9e, 0xf1, 0x68, 0xf5, 0xae, 0xc6, 0x3e, 0xc9, 0x8a, 0x47,
++ 0xf3, 0xbd, 0x62, 0x67, 0x3e, 0x4a, 0xfb, 0xb9, 0x62, 0x24, 0xa3, 0x8c,
++ 0xc6, 0x20, 0xb1, 0x2c, 0x7d, 0x35, 0xd5, 0x19, 0x2b, 0x69, 0xd1, 0xb5,
++ 0x65, 0x6d, 0x72, 0x2e, 0x61, 0xa7, 0x25, 0x58, 0x97, 0x0c, 0x51, 0xff,
++ 0xfe, 0x16, 0xee, 0xd4, 0xc3, 0xe8, 0x4f, 0xde, 0x0b, 0xdc, 0x58, 0x43,
++ 0xfd, 0xf6, 0x61, 0x0f, 0xb3, 0x86, 0x68, 0xdf, 0x1a, 0xaa, 0x0d, 0x77,
++ 0x79, 0x7a, 0x4f, 0xb1, 0xae, 0x74, 0xce, 0xe5, 0x62, 0x84, 0xea, 0x7d,
++ 0xa2, 0x82, 0x01, 0x36, 0x66, 0x8a, 0xfc, 0x3d, 0xb3, 0xb1, 0xcb, 0xb3,
++ 0xf3, 0x4f, 0x36, 0xda, 0xa5, 0x5f, 0xc4, 0x2b, 0x3d, 0x75, 0x29, 0xb2,
++ 0x8d, 0xdd, 0x58, 0x9f, 0xec, 0xc1, 0x1c, 0x6b, 0x39, 0xbe, 0xaa, 0xbb,
++ 0x88, 0x5a, 0x63, 0xb8, 0xdb, 0x93, 0xc1, 0xf2, 0xbc, 0xbf, 0x6d, 0x10,
++ 0x4d, 0x13, 0xc8, 0xf9, 0xbc, 0xfb, 0x50, 0xe5, 0xdd, 0x42, 0x4e, 0x09,
++ 0x62, 0xd3, 0x2e, 0xfe, 0x56, 0x71, 0x77, 0xa6, 0xf2, 0xce, 0x70, 0x78,
++ 0x2c, 0x88, 0xa1, 0x5d, 0xd4, 0xfb, 0x52, 0x21, 0xb8, 0x8d, 0x9f, 0x96,
++ 0xdd, 0x4f, 0xb2, 0x2b, 0xf7, 0xef, 0xaf, 0x91, 0x5d, 0x67, 0x82, 0x41,
++ 0x34, 0x13, 0x0c, 0x4b, 0x10, 0x4f, 0xc3, 0x54, 0x1d, 0x9a, 0xc7, 0xf8,
++ 0xef, 0x23, 0x07, 0xc5, 0x7d, 0xa5, 0x0a, 0xcf, 0x46, 0xfe, 0x9b, 0x4a,
++ 0x58, 0xc1, 0x7c, 0x8b, 0xd5, 0x55, 0x89, 0x47, 0xa3, 0x7b, 0x5c, 0x2d,
++ 0xe6, 0x8f, 0xd5, 0xd1, 0x47, 0x47, 0x6c, 0x82, 0x26, 0xa6, 0x96, 0x8b,
++ 0xaf, 0xe7, 0x93, 0x88, 0xd1, 0xfd, 0x32, 0xee, 0x54, 0xd6, 0xdf, 0x53,
++ 0xfa, 0xbc, 0xf3, 0x07, 0xff, 0xbb, 0xb2, 0x6f, 0x01, 0x8e, 0xea, 0xbc,
++ 0xd2, 0xfc, 0x6e, 0x3f, 0xa4, 0xd6, 0x93, 0xab, 0x27, 0x2d, 0x1e, 0xa6,
++ 0x9b, 0xbe, 0x2d, 0xb5, 0xad, 0x4e, 0xb8, 0x0d, 0xa2, 0x90, 0x3d, 0xbd,
++ 0xa5, 0x06, 0x0b, 0x5b, 0x04, 0x63, 0xcb, 0xb6, 0x32, 0x83, 0x67, 0x53,
++ 0x63, 0x05, 0x03, 0xc6, 0xd8, 0x33, 0x91, 0x09, 0x35, 0x25, 0xef, 0xce,
++ 0x44, 0x77, 0x25, 0x10, 0x02, 0xf5, 0x4b, 0x12, 0x04, 0x98, 0xaa, 0x2d,
++ 0x37, 0x92, 0x40, 0xd8, 0x69, 0x49, 0x78, 0x92, 0xec, 0x90, 0x4c, 0xd5,
++ 0x58, 0x01, 0x61, 0x20, 0x04, 0xe3, 0xec, 0x4e, 0x6d, 0x91, 0x5d, 0xcf,
++ 0x98, 0xc2, 0x06, 0x9c, 0x18, 0x3f, 0x33, 0x59, 0x8b, 0x78, 0xe2, 0xbb,
++ 0xdf, 0xb9, 0xdd, 0x0d, 0x82, 0x21, 0x99, 0x1a, 0x57, 0x75, 0x89, 0xee,
++ 0x7b, 0xff, 0xff, 0x9e, 0xff, 0xfc, 0xe7, 0x7c, 0xe7, 0x3b, 0xe7, 0xfc,
++ 0xb7, 0x4c, 0x2e, 0x2d, 0xfb, 0xb5, 0x08, 0xc5, 0xda, 0x94, 0xf9, 0x42,
++ 0x96, 0xe3, 0x48, 0x1c, 0xed, 0xbe, 0xd9, 0x8f, 0x11, 0x99, 0x84, 0xcb,
++ 0x41, 0xad, 0x08, 0x4b, 0x9e, 0xc7, 0x1f, 0xad, 0x3c, 0x51, 0x64, 0x90,
++ 0xb9, 0x0b, 0x91, 0x3f, 0x2c, 0x73, 0x17, 0x21, 0xef, 0xa6, 0x2c, 0xf2,
++ 0x1c, 0xa6, 0x5c, 0x13, 0x12, 0x5b, 0xe5, 0x79, 0xc7, 0x95, 0xa1, 0xb4,
++ 0xc8, 0x90, 0x7b, 0xee, 0x59, 0x73, 0xa3, 0x5a, 0xc4, 0x18, 0x3e, 0x62,
++ 0x6e, 0x62, 0x5e, 0xe2, 0x5f, 0xfa, 0x86, 0x99, 0x6a, 0x93, 0xb5, 0xba,
++ 0xcd, 0xbd, 0x09, 0x27, 0xfa, 0xa9, 0xb7, 0xad, 0xa1, 0xa3, 0xc2, 0x67,
++ 0xb3, 0xff, 0xe5, 0xf4, 0xf6, 0x97, 0xd4, 0xdb, 0xa9, 0xec, 0x3e, 0x1e,
++ 0x57, 0x4e, 0xde, 0x8c, 0xf5, 0x22, 0xa3, 0xc8, 0xa5, 0xa0, 0x42, 0x13,
++ 0xb9, 0x6c, 0x28, 0x67, 0xdc, 0xac, 0xa0, 0x7e, 0xca, 0x2d, 0x99, 0x9a,
++ 0x95, 0x9f, 0x47, 0xa1, 0xce, 0x21, 0x17, 0x2c, 0x9b, 0xc8, 0xc8, 0x35,
++ 0x45, 0xfd, 0x5c, 0xb8, 0x69, 0x13, 0xb3, 0xf5, 0x2c, 0x74, 0x46, 0x7c,
++ 0xfa, 0xe2, 0x4b, 0x3b, 0x92, 0x32, 0xaf, 0x5d, 0xf2, 0x04, 0x2b, 0xdf,
++ 0xb3, 0xd1, 0x9e, 0x56, 0x45, 0x33, 0x3a, 0xb0, 0x59, 0x7b, 0x20, 0x3e,
++ 0x20, 0xeb, 0xcf, 0xad, 0xbd, 0x59, 0x79, 0x3a, 0x2a, 0xe3, 0x35, 0x2c,
++ 0xb2, 0xc6, 0x59, 0xfb, 0xce, 0x71, 0x6f, 0x73, 0x5c, 0x80, 0x63, 0x32,
++ 0xb6, 0xe9, 0x49, 0x7d, 0x26, 0x7e, 0xcd, 0x7d, 0x3a, 0xae, 0x74, 0xf2,
++ 0x99, 0xb0, 0xf6, 0xf6, 0xfd, 0xac, 0xaf, 0x1f, 0xa7, 0x6f, 0xf2, 0x37,
++ 0xa7, 0x8d, 0xf6, 0x5e, 0x04, 0xc7, 0xb0, 0xcb, 0xaa, 0x49, 0xc8, 0xdc,
++ 0xcf, 0x45, 0xcb, 0x51, 0x70, 0x24, 0x37, 0x36, 0x13, 0xc3, 0x33, 0xbd,
++ 0xac, 0x9c, 0x3f, 0x0a, 0x3e, 0x0a, 0x76, 0x1b, 0x4a, 0xe4, 0x66, 0x3f,
++ 0x4a, 0x6a, 0x38, 0xd2, 0xa7, 0xcb, 0xa7, 0x3c, 0x52, 0xef, 0x53, 0x88,
++ 0x19, 0xcc, 0x07, 0xd5, 0x55, 0x1e, 0x07, 0x71, 0x6e, 0x13, 0xbe, 0x20,
++ 0xb7, 0x8d, 0x04, 0x9c, 0x96, 0x0f, 0x4b, 0xcd, 0x2f, 0x1f, 0x19, 0x0c,
++ 0x02, 0x86, 0xa3, 0x8c, 0xbb, 0x5c, 0x2b, 0x63, 0x3d, 0xba, 0xd3, 0x5f,
++ 0x98, 0x53, 0x95, 0xcc, 0xd9, 0xb5, 0x9b, 0x35, 0x22, 0xfa, 0x9d, 0x69,
++ 0x8e, 0xf0, 0x5a, 0x6f, 0x3a, 0xb7, 0x4f, 0xe4, 0x10, 0xe4, 0x68, 0xcf,
++ 0x68, 0xbf, 0x35, 0x37, 0xdc, 0x76, 0x6f, 0x0e, 0x9b, 0x73, 0x79, 0xa9,
++ 0x60, 0x73, 0x31, 0x7a, 0xf7, 0x7a, 0x93, 0x29, 0x54, 0x22, 0xa9, 0xd9,
++ 0xe6, 0xd3, 0x4b, 0x98, 0xf5, 0x7b, 0xfb, 0x9a, 0x61, 0xe5, 0xeb, 0x9e,
++ 0x14, 0xfa, 0x2b, 0xc4, 0x8f, 0x9c, 0x5a, 0xbd, 0xa7, 0xcc, 0x56, 0x2e,
++ 0xb2, 0x5b, 0x52, 0xd9, 0x07, 0x0b, 0xb0, 0x89, 0xb9, 0x76, 0xaa, 0x95,
++ 0x98, 0x35, 0x68, 0xb4, 0x70, 0x7a, 0x57, 0x61, 0x38, 0xd5, 0xf9, 0x35,
++ 0xbf, 0x97, 0xf1, 0x10, 0xc8, 0x67, 0xde, 0x7f, 0x09, 0x59, 0x4c, 0x1b,
++ 0xf4, 0x1a, 0x36, 0x9b, 0x8c, 0xff, 0xcc, 0x34, 0xda, 0x64, 0xac, 0xcc,
++ 0xc1, 0x67, 0xff, 0x1b, 0x5f, 0xf0, 0x50, 0x4f, 0x87, 0x2b, 0xa4, 0x7e,
++ 0xa6, 0xd6, 0x92, 0xab, 0x0f, 0x16, 0xa3, 0x88, 0xb9, 0x6b, 0x7f, 0x95,
++ 0xaf, 0x43, 0xb7, 0x15, 0xe2, 0xfc, 0x57, 0xfe, 0x13, 0x52, 0x55, 0x79,
++ 0x70, 0xd5, 0x02, 0x0f, 0xc6, 0x6d, 0xb0, 0xd5, 0x12, 0x7b, 0x1b, 0x80,
++ 0xe6, 0x09, 0xee, 0xdb, 0xa0, 0x82, 0xa7, 0x92, 0x36, 0x3c, 0x9a, 0xb4,
++ 0x63, 0x6d, 0x12, 0xdf, 0x59, 0x04, 0x4c, 0xd7, 0xc0, 0xdf, 0x3e, 0xa3,
++ 0x60, 0x6b, 0x29, 0xfc, 0xad, 0x31, 0xc5, 0xdf, 0xb2, 0x96, 0x39, 0xd3,
++ 0x9a, 0x09, 0xe2, 0x19, 0xef, 0x75, 0x0e, 0x70, 0x5f, 0x07, 0xec, 0xa8,
++ 0x19, 0xc0, 0x3d, 0xf9, 0x40, 0x83, 0x13, 0xfe, 0x19, 0xc6, 0x99, 0x72,
++ 0x07, 0xfc, 0x53, 0x97, 0xed, 0xfe, 0xce, 0x1a, 0x3b, 0x37, 0xb7, 0x56,
++ 0x64, 0x71, 0xe1, 0x31, 0xda, 0xf3, 0xa2, 0x41, 0xde, 0xcf, 0xfc, 0x5d,
++ 0x65, 0x9e, 0xf3, 0xc9, 0x9f, 0x48, 0xfd, 0x52, 0xae, 0x49, 0xef, 0x52,
++ 0x41, 0xe9, 0xa0, 0x9d, 0x18, 0x76, 0xce, 0x3c, 0x5f, 0x25, 0xf8, 0x0d,
++ 0x3c, 0x45, 0xd9, 0xdc, 0xfc, 0x4d, 0xad, 0x25, 0x37, 0x5d, 0xa1, 0x62,
++ 0xfd, 0xb0, 0xdc, 0x0b, 0x6b, 0x1e, 0x27, 0x7d, 0x2a, 0x8f, 0x3e, 0x7e,
++ 0xc4, 0xea, 0x77, 0xd9, 0xb8, 0x46, 0x3b, 0x8a, 0x06, 0x81, 0x35, 0x71,
++ 0x3c, 0x51, 0x0c, 0x7f, 0x44, 0x64, 0xac, 0x5b, 0xee, 0xe0, 0xd8, 0x62,
++ 0xb4, 0x4c, 0x64, 0xc6, 0x3d, 0x3c, 0xf1, 0xa3, 0x8a, 0x4c, 0x2d, 0xf7,
++ 0xf7, 0xf7, 0x5e, 0x7b, 0x1a, 0xfc, 0xd8, 0x94, 0xa4, 0xcd, 0xd9, 0x3c,
++ 0x18, 0xce, 0xd6, 0x54, 0x37, 0xa4, 0xbc, 0xb3, 0x7a, 0xa3, 0xff, 0xbd,
++ 0x38, 0xdb, 0x37, 0xa5, 0x2f, 0xcc, 0x70, 0x1e, 0x43, 0xd9, 0x40, 0xdd,
++ 0x0d, 0x4f, 0x9a, 0x88, 0xea, 0x26, 0xc6, 0xf9, 0x79, 0x53, 0x87, 0x51,
++ 0x44, 0x5f, 0xd8, 0x18, 0xfb, 0xd2, 0x34, 0xb2, 0xfe, 0xfc, 0x4a, 0x22,
++ 0xa0, 0x6c, 0x21, 0x57, 0x7e, 0x95, 0xf1, 0x74, 0x8c, 0x9f, 0x51, 0xe6,
++ 0x70, 0x4e, 0xca, 0x6d, 0xa3, 0x5f, 0xef, 0x4c, 0x01, 0x23, 0xcc, 0xd1,
++ 0x0f, 0x2e, 0x17, 0xfe, 0x5e, 0xc4, 0xe7, 0xd1, 0x6b, 0x78, 0x4f, 0x9a,
++ 0x9f, 0x23, 0xfc, 0x4c, 0x72, 0x4f, 0xf9, 0x3c, 0x04, 0xc6, 0x1d, 0x88,
++ 0x8c, 0x13, 0x68, 0xc7, 0x03, 0x98, 0x62, 0x0c, 0xbc, 0x31, 0xaa, 0xa2,
++ 0x64, 0xac, 0x1c, 0x1f, 0x1d, 0x26, 0x3e, 0x1e, 0xca, 0x70, 0xfe, 0x4d,
++ 0xe3, 0xd2, 0xdf, 0x92, 0xf5, 0x49, 0x1f, 0x58, 0xfc, 0xa9, 0x00, 0x63,
++ 0xa4, 0x1f, 0xd2, 0x0b, 0x7e, 0x57, 0xe7, 0xdc, 0xaa, 0xf4, 0xf1, 0x5a,
++ 0x71, 0x34, 0xea, 0xf3, 0xf4, 0xd1, 0xe6, 0x0d, 0x87, 0xf8, 0x58, 0x03,
++ 0x5e, 0x8d, 0xe6, 0x7a, 0x42, 0xbe, 0x96, 0x9f, 0x4a, 0x3d, 0x83, 0x21,
++ 0x3b, 0x4f, 0x93, 0x6b, 0xb9, 0x58, 0x2a, 0x6b, 0x96, 0xba, 0x74, 0x8e,
++ 0xb7, 0xcc, 0xfe, 0xfd, 0x8c, 0x29, 0x7d, 0xca, 0xd7, 0x26, 0xbd, 0x7d,
++ 0x29, 0xe8, 0x56, 0xac, 0x3c, 0x5c, 0xe7, 0x4d, 0x1a, 0x90, 0xfd, 0x6d,
++ 0xa0, 0x0c, 0xdf, 0xa5, 0xed, 0x07, 0x44, 0xd7, 0x8c, 0xed, 0x52, 0xef,
++ 0x2d, 0x43, 0xff, 0x40, 0x39, 0xf6, 0x0c, 0x18, 0xe8, 0x5d, 0xde, 0x86,
++ 0x33, 0x51, 0x13, 0x9b, 0x42, 0x26, 0xd6, 0x84, 0xbc, 0x81, 0x57, 0x50,
++ 0xdf, 0x78, 0x14, 0x8f, 0x91, 0x43, 0xa8, 0xd4, 0xc9, 0x37, 0xf0, 0xce,
++ 0x5e, 0x07, 0x36, 0xeb, 0x7f, 0x4c, 0x1f, 0x36, 0xcd, 0xf7, 0x96, 0x2d,
++ 0xc0, 0x70, 0xa2, 0x5e, 0xed, 0xa6, 0x7c, 0x91, 0x36, 0xee, 0x55, 0xd0,
++ 0x81, 0x67, 0xf5, 0xef, 0xf0, 0x5e, 0xb7, 0xcd, 0xa1, 0xc9, 0x77, 0x1b,
++ 0xe3, 0xa9, 0xec, 0xa5, 0x41, 0xfb, 0xca, 0xc4, 0xb2, 0x48, 0xb6, 0xce,
++ 0xbe, 0xb9, 0x41, 0x30, 0xbf, 0x18, 0xa7, 0xa9, 0xb7, 0x13, 0xc9, 0x08,
++ 0xc3, 0x2e, 0x94, 0x67, 0x1b, 0xba, 0xf0, 0x34, 0xf9, 0xc6, 0x3b, 0x24,
++ 0x02, 0xf7, 0xc7, 0x15, 0x34, 0xd6, 0xe9, 0xb8, 0x98, 0xfe, 0x06, 0xde,
++ 0x1a, 0x0d, 0xe3, 0x4d, 0xc6, 0xf4, 0x25, 0xdf, 0xf5, 0x92, 0x83, 0x7a,
++ 0x70, 0x3e, 0x1d, 0xc6, 0xb9, 0xa8, 0xb7, 0xf5, 0x05, 0x65, 0x01, 0x7e,
++ 0x9a, 0x76, 0xe0, 0xde, 0x38, 0xf0, 0x4b, 0xce, 0xe3, 0x8f, 0x3b, 0x70,
++ 0x25, 0xad, 0xe2, 0x28, 0xf7, 0xc7, 0x11, 0x5a, 0x02, 0xa3, 0xcd, 0x83,
++ 0x23, 0x43, 0x8f, 0x62, 0x2a, 0xf5, 0x28, 0x4e, 0x25, 0xdf, 0x31, 0x5d,
++ 0x9a, 0xf4, 0x75, 0x5c, 0xb8, 0xc2, 0x7c, 0x6c, 0x9a, 0xda, 0x28, 0x5e,
++ 0xd1, 0xca, 0x38, 0xaf, 0x19, 0xa2, 0xf7, 0xb7, 0xf8, 0xdb, 0xfd, 0xf1,
++ 0x46, 0x1c, 0x1c, 0xa7, 0x4a, 0x13, 0x3a, 0x12, 0x31, 0x79, 0x56, 0x03,
++ 0x62, 0xe4, 0x85, 0xfd, 0x4c, 0xdb, 0xb7, 0x86, 0xee, 0x95, 0x5c, 0x43,
++ 0x69, 0xa9, 0xed, 0xcf, 0xae, 0xa3, 0x71, 0x56, 0xcf, 0x4e, 0x72, 0x28,
++ 0xea, 0x95, 0xe3, 0xfe, 0x36, 0x11, 0xb4, 0x62, 0xd3, 0xb1, 0x9b, 0xfb,
++ 0xd1, 0xc8, 0xfd, 0xf8, 0x06, 0x2e, 0xee, 0x6d, 0xc3, 0x5b, 0xc4, 0xbb,
++ 0xd2, 0x65, 0xbe, 0x4e, 0xa7, 0xad, 0x9e, 0x73, 0xa7, 0xcd, 0x54, 0x95,
++ 0xe8, 0xb4, 0x0d, 0xbf, 0x88, 0x8a, 0x4e, 0xd3, 0xc4, 0x3f, 0x9f, 0xc7,
++ 0x6f, 0xff, 0xcb, 0x4a, 0xda, 0xb3, 0xad, 0x3b, 0x98, 0xe9, 0x41, 0x15,
++ 0xaf, 0x70, 0xe1, 0xaa, 0x25, 0x9b, 0xc8, 0xfa, 0x87, 0xe4, 0xfb, 0x85,
++ 0xb9, 0xa6, 0x4a, 0xe4, 0x33, 0xcc, 0x3c, 0x4d, 0x0b, 0xe4, 0x29, 0x12,
++ 0x67, 0x03, 0x56, 0x3d, 0xbe, 0x2e, 0xde, 0x05, 0x7b, 0xa8, 0x98, 0x79,
++ 0x98, 0x77, 0xa6, 0x03, 0x6f, 0xe1, 0xda, 0xa4, 0x0b, 0x8b, 0xe3, 0x1a,
++ 0x5e, 0x9e, 0x7c, 0x8d, 0xcf, 0xfa, 0x47, 0x5c, 0xe6, 0x77, 0x5f, 0x3c,
++ 0xe3, 0x6f, 0xdd, 0x0d, 0x6d, 0x78, 0x30, 0x2d, 0xeb, 0xcb, 0xe3, 0x83,
++ 0x74, 0x44, 0xd2, 0xb2, 0xce, 0x18, 0x7d, 0x43, 0xd6, 0x59, 0xfe, 0xef,
++ 0xac, 0xf3, 0xbf, 0x72, 0xbe, 0x05, 0xf4, 0xa5, 0x5c, 0xec, 0x28, 0xc1,
++ 0x91, 0xa4, 0x8a, 0xd3, 0x7a, 0x31, 0x2e, 0xa9, 0x52, 0x5f, 0x76, 0x31,
++ 0x86, 0x38, 0xd0, 0xcc, 0x9c, 0x71, 0x84, 0x9f, 0x8d, 0xcc, 0x7f, 0xce,
++ 0xea, 0x0e, 0x9c, 0xd2, 0x17, 0x10, 0xeb, 0xef, 0xb4, 0x61, 0xb9, 0x46,
++ 0xb2, 0x5f, 0x56, 0x8e, 0x73, 0x52, 0xff, 0xb3, 0xae, 0xbb, 0xa4, 0x2f,
++ 0x89, 0x31, 0xea, 0x2b, 0x2f, 0xf6, 0x1b, 0xf3, 0xaa, 0x85, 0x35, 0x77,
++ 0xca, 0x77, 0xe7, 0x3c, 0x12, 0x82, 0x7f, 0x69, 0x6e, 0xad, 0xca, 0xc6,
++ 0x2e, 0xe5, 0x4f, 0x2b, 0x33, 0x78, 0x21, 0x71, 0xec, 0xef, 0x72, 0xd8,
++ 0x21, 0xf9, 0x64, 0x1b, 0xe3, 0x10, 0xe3, 0xf2, 0xf1, 0x6d, 0x92, 0xe7,
++ 0xd9, 0xc2, 0xef, 0xb5, 0xad, 0xd2, 0xf2, 0x60, 0xb7, 0xf8, 0xde, 0x7b,
++ 0x2f, 0x65, 0x38, 0xfa, 0xfb, 0x2f, 0x69, 0xd6, 0xdf, 0xeb, 0x2f, 0x2d,
++ 0xb6, 0xfe, 0x7e, 0xf2, 0x92, 0x2f, 0x75, 0x2b, 0x5e, 0x65, 0x38, 0xb0,
++ 0x75, 0x6e, 0x05, 0x7d, 0xba, 0xa1, 0x3c, 0xdc, 0x20, 0x5c, 0x72, 0x36,
++ 0x8f, 0x08, 0x28, 0x67, 0xa3, 0x92, 0xa7, 0x15, 0x1a, 0xcc, 0xe3, 0x95,
++ 0x46, 0xbf, 0x46, 0x3c, 0xee, 0x42, 0xc9, 0x32, 0x0d, 0x17, 0xa8, 0x73,
++ 0xc2, 0x28, 0xed, 0xf8, 0xff, 0x20, 0xba, 0x17, 0xed, 0x85, 0x16, 0xf6,
++ 0x98, 0x66, 0x7f, 0x48, 0x6a, 0x0c, 0x32, 0xaf, 0x03, 0x1f, 0x70, 0x2f,
++ 0x7f, 0x35, 0x5a, 0x84, 0xf7, 0x53, 0x1a, 0x2e, 0xa5, 0xdb, 0xb0, 0x7b,
++ 0x32, 0xc3, 0x33, 0x4e, 0x59, 0xfc, 0x5b, 0x63, 0x8e, 0xe9, 0xc0, 0xc1,
++ 0xa8, 0x86, 0x58, 0xe2, 0x75, 0xb3, 0x40, 0xf3, 0x4d, 0xf9, 0xed, 0x0e,
++ 0x1c, 0x48, 0x4f, 0x63, 0x72, 0xe0, 0x63, 0xd3, 0xae, 0x75, 0xe1, 0xa3,
++ 0xd0, 0x34, 0x26, 0x0e, 0x49, 0x5f, 0x4f, 0x47, 0xff, 0x90, 0x86, 0xde,
++ 0x84, 0x0d, 0x7b, 0x96, 0xb7, 0xa0, 0x7f, 0xb2, 0x19, 0xc6, 0x98, 0x07,
++ 0x7b, 0xd2, 0x69, 0x4c, 0x8d, 0x4e, 0xe3, 0x4c, 0x52, 0x6b, 0x2c, 0x50,
++ 0xa6, 0x71, 0x9a, 0xcf, 0xd9, 0x91, 0x78, 0x1b, 0x06, 0xe7, 0xd8, 0x99,
++ 0x94, 0x9a, 0xa4, 0x3c, 0x67, 0x1a, 0xdd, 0xa9, 0xbb, 0xd5, 0x44, 0x28,
++ 0x4f, 0xa2, 0xa7, 0x3d, 0x53, 0xab, 0x27, 0xbe, 0xa6, 0x35, 0xa5, 0x8f,
++ 0xfb, 0x74, 0x34, 0x9d, 0xab, 0xdb, 0xdf, 0x59, 0x0b, 0xd1, 0xd1, 0x37,
++ 0xd4, 0xc2, 0x31, 0x1a, 0xba, 0x13, 0xd2, 0x1b, 0xf5, 0xf1, 0x99, 0x26,
++ 0x7e, 0xa9, 0x7b, 0xdd, 0x8b, 0xf9, 0xf7, 0xb0, 0xde, 0x89, 0x2d, 0x9c,
++ 0x6b, 0x8a, 0x79, 0x90, 0xa6, 0x78, 0x1b, 0x0d, 0xd8, 0xf1, 0x9e, 0x4e,
++ 0xce, 0x53, 0x69, 0xc7, 0xab, 0x7a, 0x09, 0x22, 0x65, 0x76, 0xd4, 0x87,
++ 0x18, 0xa7, 0xb3, 0x71, 0xfb, 0xc3, 0xa4, 0x82, 0x47, 0x89, 0xa9, 0x27,
++ 0x42, 0xf5, 0xed, 0xab, 0x85, 0xd1, 0x1d, 0x52, 0x70, 0x4d, 0xbb, 0x61,
++ 0x1a, 0x8c, 0x5d, 0x2e, 0x7f, 0x6e, 0x8f, 0x7e, 0x6d, 0x66, 0xfa, 0x9b,
++ 0x5f, 0x98, 0xb9, 0x71, 0x33, 0x94, 0xf1, 0x29, 0x8e, 0x5b, 0xbc, 0xac,
++ 0xbe, 0x53, 0xc6, 0xb9, 0x89, 0xe9, 0x32, 0x4e, 0xea, 0xd1, 0xb7, 0xc6,
++ 0xe9, 0xd8, 0x39, 0x14, 0xb1, 0xe4, 0xdd, 0x95, 0xc0, 0x52, 0x07, 0xc4,
++ 0x9f, 0xea, 0xd5, 0x2b, 0x40, 0xd7, 0xb4, 0x3e, 0x87, 0x5c, 0xc7, 0x1f,
++ 0xd8, 0x08, 0xd1, 0x95, 0xe4, 0x92, 0x6f, 0x63, 0x4f, 0x74, 0x14, 0xcc,
++ 0x27, 0x89, 0x73, 0xfe, 0xf5, 0x23, 0x48, 0xe1, 0xf9, 0x74, 0x0a, 0x2f,
++ 0x50, 0x47, 0x86, 0x75, 0x6e, 0x29, 0x8d, 0x3f, 0x8f, 0xbe, 0x8d, 0x98,
++ 0xb5, 0x67, 0x47, 0xb1, 0x21, 0xfa, 0xf7, 0x55, 0xc2, 0x11, 0x77, 0x24,
++ 0x56, 0x72, 0x7e, 0xd1, 0xab, 0xb7, 0xd5, 0xc0, 0x97, 0x9c, 0x7f, 0x25,
++ 0x7a, 0x46, 0x4c, 0xf3, 0x7b, 0x8c, 0x5f, 0x3f, 0x23, 0xbf, 0xba, 0x96,
++ 0x3d, 0x03, 0x55, 0x40, 0x7d, 0x6b, 0x56, 0x1c, 0x6b, 0xe3, 0x3e, 0x57,
++ 0x0b, 0xaf, 0x47, 0xc9, 0xb8, 0xa6, 0x2c, 0x8e, 0xc9, 0xbe, 0x93, 0x37,
++ 0x8e, 0x7b, 0xf0, 0x14, 0x39, 0x4a, 0xfe, 0xe1, 0x1f, 0x28, 0x12, 0xcb,
++ 0x6a, 0x0e, 0x91, 0xef, 0x1f, 0xf2, 0x28, 0x4b, 0xf6, 0xb9, 0xf0, 0x68,
++ 0x4c, 0xea, 0x37, 0xcd, 0xe8, 0xd9, 0xaf, 0xf1, 0x1e, 0xaf, 0x7e, 0x81,
++ 0x39, 0xe9, 0x69, 0xf8, 0x3c, 0x23, 0xe4, 0x55, 0x6e, 0x62, 0xb1, 0xe3,
++ 0x70, 0x29, 0x8a, 0x0e, 0xab, 0xb0, 0x1d, 0x2e, 0x47, 0xf1, 0x61, 0x37,
++ 0x6a, 0x18, 0xdb, 0xdc, 0xe3, 0x17, 0x31, 0xb9, 0x0f, 0x6a, 0x51, 0xf8,
++ 0x73, 0x33, 0x5f, 0x93, 0x3e, 0x5b, 0x00, 0xa5, 0xe3, 0xdb, 0x91, 0x8e,
++ 0x05, 0x51, 0x3c, 0x4e, 0x2a, 0x35, 0x7e, 0x5c, 0xa9, 0xe7, 0x33, 0x1f,
++ 0x8a, 0x69, 0x9c, 0x2b, 0xc3, 0x75, 0x56, 0x73, 0x5c, 0x5f, 0xc2, 0xbb,
++ 0x5e, 0x7a, 0x65, 0xd7, 0xf4, 0x37, 0x50, 0x30, 0x70, 0xeb, 0x2c, 0x97,
++ 0x16, 0xc2, 0x3c, 0x72, 0x91, 0xd6, 0x67, 0x91, 0x39, 0xd7, 0xf5, 0x70,
++ 0x76, 0x4d, 0x41, 0x59, 0x93, 0xb3, 0x8d, 0xb6, 0x30, 0x57, 0xea, 0x5f,
++ 0xb8, 0x4c, 0xfb, 0xb9, 0x9f, 0xf2, 0xde, 0x60, 0x6e, 0xd8, 0x19, 0x13,
++ 0xbb, 0xff, 0x81, 0x42, 0xbf, 0xc1, 0x4c, 0xaa, 0x08, 0x1f, 0xa7, 0x3c,
++ 0x8a, 0x8f, 0xeb, 0xf9, 0x0b, 0x5e, 0xff, 0x73, 0xae, 0x67, 0xc7, 0x7e,
++ 0x6f, 0xeb, 0x49, 0xc5, 0xdb, 0xbe, 0x4e, 0xf1, 0xa9, 0x3b, 0x94, 0x62,
++ 0x5c, 0x1e, 0x2d, 0xc5, 0x15, 0xc6, 0xe2, 0x1b, 0xa3, 0xe5, 0xb8, 0x3a,
++ 0x5a, 0x49, 0x5f, 0xd1, 0x38, 0x87, 0x69, 0x96, 0x68, 0x6e, 0xcc, 0xa4,
++ 0x5f, 0xc0, 0x9c, 0xd8, 0x02, 0x7c, 0x9c, 0xde, 0x82, 0xd2, 0x98, 0x70,
++ 0x76, 0x0f, 0x3e, 0xe2, 0xf5, 0x0f, 0xd3, 0x13, 0x28, 0xdc, 0xf7, 0x39,
++ 0xef, 0x31, 0xcd, 0x87, 0xb8, 0xc6, 0xab, 0xe9, 0x0e, 0x14, 0xef, 0xdb,
++ 0x06, 0xc7, 0x3e, 0xb3, 0xab, 0x27, 0x84, 0x9f, 0xda, 0xb9, 0x96, 0x6e,
++ 0xdd, 0x3b, 0xb5, 0xd8, 0x1e, 0xe4, 0x1c, 0x3a, 0xe7, 0x3c, 0xae, 0x2c,
++ 0x19, 0xdf, 0x86, 0xd2, 0x7d, 0x1e, 0x6c, 0xa5, 0x2e, 0x27, 0xa0, 0x05,
++ 0xd6, 0x29, 0xdb, 0x90, 0x77, 0x38, 0xa3, 0x83, 0x4d, 0xe3, 0x19, 0x1f,
++ 0x79, 0xa8, 0x41, 0xea, 0x43, 0xc7, 0x95, 0x11, 0xcb, 0x47, 0xdc, 0x72,
++ 0xfe, 0x04, 0xd3, 0xe9, 0x22, 0x9c, 0x4d, 0x89, 0x8e, 0xe4, 0xec, 0xda,
++ 0x04, 0xf2, 0xf7, 0x11, 0x23, 0x47, 0x75, 0x8b, 0x43, 0x88, 0x6f, 0x8c,
++ 0xa6, 0xef, 0xe6, 0x5f, 0x41, 0xec, 0x49, 0xd4, 0xd0, 0xb7, 0x16, 0x60,
++ 0xcd, 0x3e, 0xe9, 0x91, 0x4e, 0xdd, 0xef, 0xa2, 0x35, 0x8d, 0xa5, 0xef,
++ 0xe6, 0x5b, 0x0d, 0xb4, 0x53, 0x6f, 0x8b, 0x01, 0x39, 0xab, 0x61, 0x62,
++ 0x5a, 0x3f, 0xae, 0xd8, 0x62, 0x92, 0x6f, 0xb5, 0xd1, 0xe7, 0x5b, 0xd1,
++ 0x33, 0x84, 0xf6, 0x83, 0x0d, 0xd2, 0xb7, 0x75, 0x62, 0x84, 0xf9, 0xd3,
++ 0x65, 0xe6, 0x1c, 0xd4, 0xb9, 0x9a, 0x17, 0xce, 0xc3, 0xf0, 0xa8, 0x0b,
++ 0x3f, 0x1a, 0xf5, 0xa0, 0x31, 0xf6, 0x39, 0x31, 0xa3, 0x10, 0xc7, 0xa9,
++ 0xef, 0x49, 0xf2, 0x9f, 0x8f, 0xa2, 0x2a, 0x26, 0x18, 0x6b, 0x3f, 0x8c,
++ 0x56, 0x62, 0x9c, 0xb9, 0xd6, 0x75, 0xe2, 0x4c, 0x9a, 0x7b, 0xf3, 0x01,
++ 0xf3, 0x8e, 0xef, 0xa5, 0x83, 0xf8, 0x55, 0x34, 0x88, 0x57, 0xa9, 0xc7,
++ 0xba, 0x98, 0x9b, 0x32, 0x1d, 0x53, 0x70, 0xe8, 0xb8, 0x92, 0x47, 0xbb,
++ 0xf0, 0xc7, 0x34, 0xcf, 0x48, 0xd6, 0x2e, 0xb4, 0xf1, 0x56, 0xfa, 0x91,
++ 0xf4, 0xff, 0x25, 0x3e, 0x38, 0xf4, 0x11, 0x90, 0xd3, 0x05, 0x73, 0x75,
++ 0x42, 0xaf, 0x7b, 0x0a, 0x15, 0xf4, 0xa5, 0x2f, 0x4d, 0x55, 0x93, 0x9a,
++ 0x58, 0x32, 0x74, 0x2d, 0xaa, 0xa9, 0x57, 0xad, 0x35, 0x18, 0x8a, 0x73,
++ 0x39, 0x39, 0x46, 0xe5, 0x0e, 0xae, 0x5f, 0x23, 0x66, 0x38, 0xe8, 0x32,
++ 0x26, 0xef, 0xbb, 0x8e, 0xfb, 0x0e, 0xfd, 0x69, 0x75, 0x86, 0x03, 0xd1,
++ 0x9f, 0x6d, 0x77, 0xd6, 0xb1, 0xa4, 0x96, 0xbd, 0x37, 0xf4, 0x46, 0x34,
++ 0x56, 0x2d, 0x3d, 0xa5, 0x93, 0x08, 0x52, 0x2f, 0x77, 0xcb, 0x15, 0x4c,
++ 0xbc, 0x45, 0x4c, 0xb9, 0x9a, 0x14, 0xbe, 0x24, 0x3c, 0xa9, 0x8b, 0x31,
++ 0xa9, 0x84, 0x3c, 0x41, 0xc3, 0x4e, 0x72, 0x79, 0x5f, 0x7c, 0x8a, 0xb9,
++ 0xca, 0x57, 0xc9, 0xd5, 0x4a, 0x39, 0x8d, 0xc1, 0xe7, 0xb5, 0x62, 0x0f,
++ 0x7d, 0xb3, 0x40, 0x5b, 0x8c, 0x35, 0xe4, 0x41, 0x0e, 0x8d, 0xa1, 0xe4,
++ 0x09, 0x89, 0x27, 0x40, 0x6d, 0x5c, 0x95, 0x7e, 0xcf, 0xfa, 0x9f, 0xe1,
++ 0x7e, 0xb4, 0x57, 0xb9, 0x20, 0x3d, 0x9a, 0x37, 0xd1, 0x84, 0xd4, 0xd7,
++ 0xad, 0xde, 0x30, 0xdc, 0x61, 0xcd, 0xb8, 0x88, 0x45, 0x16, 0x23, 0x2f,
++ 0x0c, 0x8b, 0x3c, 0x95, 0xd4, 0xbf, 0x8a, 0x77, 0xa9, 0xd7, 0x2b, 0x51,
++ 0xdf, 0xcc, 0x83, 0xa8, 0x3f, 0x73, 0xc5, 0x2e, 0xfd, 0x2b, 0xb9, 0x3f,
++ 0x08, 0x8d, 0xf3, 0x7d, 0x1a, 0x0d, 0x61, 0x40, 0x95, 0xef, 0xc2, 0x1b,
++ 0x5b, 0xd1, 0x3d, 0x22, 0x32, 0x98, 0x66, 0x39, 0xf1, 0xf1, 0x09, 0xeb,
++ 0xf9, 0xf2, 0xec, 0x3b, 0xf3, 0x0e, 0xaf, 0x6a, 0x20, 0x97, 0x7b, 0x4c,
++ 0xe3, 0x68, 0xd2, 0x03, 0xc7, 0xf2, 0xff, 0x41, 0x3d, 0x4c, 0x63, 0x34,
++ 0xa5, 0x91, 0x53, 0x16, 0xc1, 0x53, 0x15, 0x44, 0x3f, 0xe3, 0x78, 0x8c,
++ 0xf7, 0xa7, 0x63, 0x45, 0x30, 0xaa, 0x32, 0xcf, 0xfc, 0x6a, 0xfc, 0xba,
++ 0x39, 0xf5, 0xb8, 0xcc, 0x29, 0xdf, 0x7f, 0xce, 0x31, 0x73, 0xe5, 0xd8,
++ 0x23, 0x36, 0xc7, 0xae, 0x9a, 0x53, 0xad, 0xb3, 0x7f, 0x2f, 0xb3, 0xce,
++ 0x10, 0x45, 0x6c, 0x55, 0x52, 0x6f, 0xb1, 0xf4, 0xd2, 0x4d, 0xbd, 0xcc,
++ 0xd1, 0xde, 0x36, 0x1f, 0xb3, 0xe4, 0x9a, 0xaa, 0x16, 0x9e, 0x5f, 0x1b,
++ 0xff, 0xbc, 0x5a, 0xea, 0xa5, 0x12, 0xc3, 0x5c, 0x61, 0xad, 0xf1, 0x0c,
++ 0xfe, 0xd1, 0xbc, 0x74, 0xdb, 0x3c, 0x15, 0xbc, 0x26, 0xf1, 0xe8, 0x52,
++ 0xb6, 0x1f, 0xed, 0xce, 0xe6, 0x02, 0xd3, 0x38, 0x99, 0x94, 0x58, 0xe0,
++ 0xc1, 0x06, 0xa9, 0x43, 0xa9, 0xde, 0x3e, 0x03, 0x53, 0xe4, 0x7e, 0xef,
++ 0x50, 0xf7, 0x4c, 0x80, 0xfc, 0x53, 0xe4, 0x7f, 0xb3, 0xe3, 0x55, 0x04,
++ 0xa9, 0x4a, 0xe9, 0x29, 0x08, 0x9e, 0x4e, 0x63, 0x57, 0xf2, 0x75, 0xe2,
++ 0xda, 0xc7, 0xe4, 0x43, 0x5d, 0xe4, 0xda, 0xd3, 0xe8, 0x49, 0x35, 0xe3,
++ 0xe5, 0xfd, 0x2d, 0xc4, 0x18, 0xc1, 0x4a, 0xdf, 0x99, 0xcb, 0xf6, 0x66,
++ 0x1c, 0x1c, 0x4b, 0x23, 0x75, 0x58, 0x62, 0xa4, 0x9c, 0xc7, 0x92, 0xf8,
++ 0xa8, 0x21, 0x9a, 0x38, 0x0d, 0x83, 0x7f, 0xf7, 0x24, 0xb6, 0x21, 0x72,
++ 0xf8, 0x6d, 0x72, 0xfc, 0x69, 0xac, 0x1e, 0xd0, 0xd6, 0x1f, 0xc1, 0x34,
++ 0xd6, 0x32, 0x7e, 0x26, 0x13, 0x2d, 0x9c, 0xbf, 0x19, 0xbd, 0xfb, 0xbd,
++ 0x01, 0x87, 0x6d, 0x0e, 0x63, 0x94, 0x07, 0x3b, 0x27, 0x23, 0x30, 0x46,
++ 0xe4, 0x8c, 0x81, 0x0b, 0xc1, 0xb8, 0x47, 0xf9, 0x90, 0x3c, 0xb9, 0x3e,
++ 0xee, 0x65, 0x7e, 0xe6, 0x35, 0xd6, 0x2a, 0x3e, 0x4f, 0x9e, 0x4d, 0xfa,
++ 0x59, 0x73, 0x70, 0x46, 0x57, 0x50, 0x70, 0xbf, 0x82, 0x10, 0x63, 0x97,
++ 0xa7, 0x9a, 0x31, 0x65, 0x44, 0x47, 0xef, 0x10, 0xd7, 0x7b, 0x73, 0xdf,
++ 0x64, 0xbf, 0x1e, 0xe1, 0x7c, 0xb2, 0x77, 0x2d, 0xe8, 0x9d, 0xf4, 0x75,
++ 0x9c, 0x81, 0xdb, 0xe2, 0x5c, 0xbd, 0x43, 0xb9, 0x7b, 0x50, 0xfc, 0x71,
++ 0x83, 0x37, 0x30, 0x47, 0x91, 0x7b, 0x77, 0x10, 0xbf, 0x66, 0xdf, 0x6f,
++ 0x28, 0xc9, 0xe5, 0xe4, 0xa5, 0x36, 0xf1, 0x8b, 0x6e, 0xcb, 0x5f, 0x44,
++ 0x17, 0xbd, 0xc9, 0x08, 0x6d, 0xfa, 0xc7, 0x66, 0xaa, 0xb5, 0x95, 0x72,
++ 0x36, 0x48, 0xaf, 0xc7, 0xe2, 0x26, 0xe7, 0xa5, 0xee, 0xe6, 0x94, 0xd8,
++ 0xdd, 0xdd, 0xee, 0xa2, 0x3d, 0xe5, 0x13, 0x9f, 0x0a, 0x26, 0x5c, 0x70,
++ 0x1d, 0x29, 0x42, 0xfe, 0xb0, 0xf0, 0x34, 0xa8, 0xa5, 0xcc, 0xfb, 0xe5,
++ 0x3c, 0xc3, 0x30, 0x6d, 0xd4, 0x36, 0x41, 0x1f, 0x8b, 0xba, 0xb1, 0x68,
++ 0xc2, 0x8d, 0x1f, 0x11, 0x03, 0x6a, 0x26, 0x34, 0x1c, 0x27, 0x06, 0xb8,
++ 0x27, 0x02, 0x98, 0x24, 0x06, 0xcc, 0xc9, 0xd6, 0x3e, 0xde, 0x4c, 0xcf,
++ 0x9f, 0x8b, 0x42, 0x79, 0x96, 0xe8, 0x31, 0xb7, 0xaf, 0xb2, 0xa7, 0x2d,
++ 0xc4, 0x3d, 0xd9, 0xdf, 0x00, 0x76, 0x0f, 0xa5, 0xb1, 0x6a, 0x9f, 0x89,
++ 0x9f, 0xeb, 0xf5, 0xee, 0x02, 0x45, 0xf2, 0x04, 0x13, 0x69, 0x5d, 0xce,
++ 0x4d, 0x7a, 0xd7, 0xcb, 0xb9, 0xe2, 0xf6, 0x4a, 0x13, 0x79, 0x21, 0xaf,
++ 0x4e, 0xb4, 0x5f, 0x5f, 0xa0, 0x48, 0xdc, 0xaa, 0xf7, 0x6c, 0xc1, 0x7c,
++ 0x64, 0x7a, 0x65, 0x0f, 0x62, 0x8b, 0xaa, 0xd0, 0x1f, 0x5b, 0xb0, 0xa7,
++ 0xcc, 0x70, 0x5d, 0x6b, 0x30, 0xcd, 0x4d, 0xa1, 0xdf, 0x56, 0x59, 0xb5,
++ 0x65, 0xdb, 0x1f, 0x71, 0xed, 0x6d, 0x5c, 0xb7, 0xac, 0xbd, 0x03, 0xb1,
++ 0xbd, 0x0a, 0xd2, 0xfe, 0x0e, 0x44, 0x47, 0x3b, 0xd0, 0xbf, 0x57, 0x30,
++ 0xa1, 0x8f, 0x98, 0x60, 0x76, 0x3d, 0x1b, 0x7a, 0x0c, 0x57, 0x2d, 0x16,
++ 0x20, 0x63, 0xbc, 0x01, 0x8f, 0x6d, 0xf6, 0x3e, 0xe4, 0x53, 0xfe, 0x8c,
++ 0xef, 0x34, 0x0f, 0x08, 0xa7, 0xf6, 0xf7, 0xf5, 0x72, 0xff, 0x1f, 0x3f,
++ 0x24, 0xf1, 0xc6, 0x34, 0xfb, 0xc8, 0x59, 0x51, 0x26, 0x6b, 0xd0, 0xa4,
++ 0x3e, 0xfe, 0x71, 0x8d, 0xe6, 0x9b, 0xe9, 0x67, 0x6c, 0xbf, 0xb8, 0xaf,
++ 0x7e, 0xcb, 0x16, 0xe1, 0x31, 0xcb, 0x84, 0xdb, 0xa5, 0x71, 0xe1, 0xf0,
++ 0x7d, 0x48, 0x3d, 0xce, 0xf5, 0x70, 0xaf, 0x9c, 0xf1, 0x2f, 0x4c, 0xe1,
++ 0x72, 0x76, 0x4d, 0x53, 0x8f, 0x12, 0xfb, 0x6c, 0x13, 0x7e, 0xf4, 0x94,
++ 0xc1, 0xb8, 0xd6, 0x20, 0xcf, 0xbf, 0x29, 0x3f, 0xd7, 0xdb, 0x8c, 0xfe,
++ 0xfd, 0xc2, 0x35, 0x84, 0x97, 0xf9, 0x8c, 0x0f, 0xd0, 0x82, 0xe4, 0x64,
++ 0xe6, 0x59, 0xd1, 0xc4, 0x9d, 0xb6, 0x22, 0xfb, 0x7e, 0x1a, 0xbb, 0x69,
++ 0x97, 0x2e, 0xce, 0xcf, 0xf8, 0xc2, 0xf9, 0xb4, 0x40, 0x81, 0x3c, 0x6f,
++ 0xe2, 0xc7, 0xe6, 0x9e, 0x2a, 0xd1, 0x8d, 0xcc, 0x7f, 0xba, 0x4a, 0x30,
++ 0x63, 0x53, 0xe8, 0x0f, 0xad, 0xf5, 0x75, 0xfe, 0xf5, 0xb6, 0x64, 0xf4,
++ 0x21, 0xf7, 0x9e, 0xfe, 0x3d, 0xf2, 0x5c, 0xe0, 0x7d, 0x22, 0x53, 0x07,
++ 0x76, 0xef, 0x85, 0x51, 0xa8, 0x49, 0xaf, 0xa0, 0x03, 0x7d, 0xd4, 0xef,
++ 0xce, 0x64, 0x07, 0x0e, 0xd2, 0x67, 0x87, 0xf5, 0x13, 0x35, 0x36, 0xd4,
++ 0xcd, 0xd8, 0x31, 0xf5, 0x93, 0x45, 0xc4, 0xd3, 0x25, 0xcb, 0xfc, 0xf4,
++ 0xaf, 0x0e, 0xc4, 0x53, 0x63, 0x73, 0xad, 0x3e, 0x9f, 0x4d, 0xe2, 0x9f,
++ 0xe8, 0xa2, 0x13, 0x85, 0x03, 0xa7, 0xe1, 0x1c, 0xe8, 0x44, 0x81, 0xbf,
++ 0x09, 0x0f, 0x87, 0x2e, 0x99, 0x57, 0x35, 0x87, 0xfb, 0x24, 0xf5, 0x73,
++ 0x22, 0x58, 0xc3, 0x7c, 0x92, 0x39, 0xcc, 0xc8, 0x3c, 0xfa, 0x7e, 0x03,
++ 0xf9, 0xae, 0xf4, 0xf4, 0x6d, 0x58, 0xbb, 0x5c, 0x72, 0x75, 0x85, 0xb6,
++ 0x5d, 0xcd, 0x5c, 0x53, 0x53, 0x9f, 0xb7, 0xce, 0x5f, 0x90, 0x87, 0x55,
++ 0x7a, 0xf0, 0x8c, 0x75, 0xee, 0x40, 0xae, 0x6f, 0x67, 0x8e, 0xb0, 0x1d,
++ 0x35, 0x31, 0xc3, 0x14, 0x7d, 0x9f, 0x44, 0xe4, 0x25, 0x1b, 0xe5, 0x68,
++ 0x5c, 0xe6, 0xdf, 0x32, 0xa3, 0x88, 0x4d, 0xfb, 0xdb, 0x27, 0x14, 0xdd,
++ 0xf5, 0xc8, 0xb8, 0x82, 0xc0, 0x00, 0xe7, 0x0a, 0xfd, 0xf5, 0xdc, 0x4c,
++ 0x7d, 0x2c, 0xc7, 0xf9, 0xb6, 0x93, 0x27, 0x6c, 0x47, 0x09, 0xc7, 0xbb,
++ 0x35, 0xc1, 0x86, 0xc8, 0x4a, 0xe9, 0xa5, 0xa4, 0x43, 0xfe, 0xd6, 0x62,
++ 0x45, 0xf8, 0x90, 0xbf, 0x71, 0xad, 0x22, 0xdc, 0x45, 0xc6, 0xe9, 0xae,
++ 0xba, 0xf1, 0x8b, 0xd9, 0x9e, 0x57, 0x03, 0xf1, 0xc1, 0x63, 0x9d, 0x85,
++ 0x7c, 0xed, 0xe6, 0x79, 0x89, 0x4c, 0xbd, 0xda, 0x19, 0x97, 0xbc, 0xe2,
++ 0x58, 0x68, 0x55, 0xb4, 0x91, 0x58, 0x67, 0x36, 0x8d, 0xd1, 0xee, 0x2f,
++ 0xa3, 0x12, 0xff, 0x33, 0x2a, 0xb8, 0xe6, 0xc1, 0xff, 0x8a, 0xe6, 0x4b,
++ 0xbe, 0x9c, 0x92, 0x7a, 0xe4, 0xb9, 0xa4, 0x61, 0x52, 0xaf, 0x2d, 0x6b,
++ 0x69, 0x4b, 0x81, 0x50, 0x31, 0x50, 0xd5, 0xfd, 0x8c, 0xd3, 0xca, 0xdf,
++ 0x4b, 0x50, 0xc6, 0x18, 0x30, 0x30, 0xf2, 0xfb, 0x6a, 0xaf, 0xc4, 0xe1,
++ 0x42, 0xa9, 0x81, 0xda, 0xb1, 0x33, 0xf4, 0x2f, 0x66, 0x2a, 0x7b, 0x76,
++ 0xf5, 0xc2, 0x5e, 0xb1, 0xd3, 0x00, 0xf2, 0xe3, 0x17, 0x69, 0x93, 0x2a,
++ 0xce, 0x47, 0x7d, 0xfa, 0x3a, 0xdb, 0x37, 0x68, 0xff, 0x8b, 0x6e, 0xc3,
++ 0xee, 0x45, 0xda, 0xa3, 0x78, 0xda, 0xc2, 0xee, 0x30, 0x7a, 0x18, 0x1b,
++ 0xc8, 0xe3, 0x0e, 0x3c, 0x63, 0x53, 0x51, 0x10, 0xf3, 0xa9, 0x3e, 0xe6,
++ 0xdb, 0x3d, 0x7c, 0x86, 0x70, 0xcc, 0x0a, 0x72, 0xc0, 0x67, 0xa3, 0xf5,
++ 0x9e, 0x5f, 0x63, 0x03, 0xfd, 0x51, 0x9e, 0x21, 0x6b, 0xd2, 0x50, 0xcc,
++ 0xbc, 0xf2, 0x14, 0xd7, 0xb1, 0xb3, 0x2c, 0xf3, 0xdc, 0xd2, 0xec, 0xdc,
++ 0xf1, 0x11, 0xe1, 0x5f, 0x2b, 0xb0, 0xce, 0x9a, 0x3b, 0x68, 0xf9, 0xe6,
++ 0x01, 0x39, 0x5b, 0x5e, 0xa7, 0x21, 0x91, 0x6e, 0xc6, 0xb6, 0xf2, 0x05,
++ 0x38, 0x98, 0xd8, 0x8e, 0xa5, 0xe4, 0xc1, 0x4f, 0x96, 0x1b, 0x8c, 0x8d,
++ 0xc4, 0xa1, 0xb8, 0xa6, 0xde, 0xa7, 0x3c, 0x90, 0xed, 0x3f, 0x54, 0xc2,
++ 0x11, 0x97, 0x98, 0x97, 0x87, 0x41, 0x75, 0x3e, 0x8a, 0xac, 0x33, 0x7f,
++ 0x99, 0xb9, 0xfb, 0x47, 0xbc, 0xd9, 0x38, 0x48, 0xd4, 0x88, 0x5b, 0xe7,
++ 0x2d, 0x02, 0x2f, 0x90, 0x4b, 0xa4, 0x18, 0x01, 0xf3, 0xc2, 0x5a, 0x6a,
++ 0x33, 0x0a, 0x60, 0x54, 0x0b, 0x26, 0xca, 0x98, 0x79, 0x77, 0xc8, 0x54,
++ 0x9e, 0x95, 0x29, 0x77, 0x3d, 0xc5, 0x6b, 0x62, 0x5b, 0xc2, 0x2f, 0xe4,
++ 0xf7, 0x42, 0xb4, 0xd2, 0x9e, 0x2a, 0x29, 0x73, 0xc2, 0x3a, 0xb7, 0xe9,
++ 0xd5, 0x0d, 0x5b, 0x03, 0x3e, 0xdb, 0x97, 0xb1, 0xc1, 0xf5, 0xb5, 0xdc,
++ 0xff, 0xd2, 0x06, 0xcc, 0x1c, 0x96, 0x78, 0xf6, 0xfb, 0xcf, 0x52, 0x18,
++ 0x37, 0xcf, 0x52, 0x88, 0x5e, 0xbd, 0x67, 0xde, 0x45, 0xfd, 0xd4, 0x53,
++ 0xb6, 0xa3, 0x26, 0x2a, 0x44, 0xc7, 0x9b, 0xdd, 0x92, 0x87, 0xda, 0xc8,
++ 0x23, 0x8c, 0x74, 0xd2, 0x2d, 0xb1, 0xd2, 0x11, 0x07, 0x16, 0xc5, 0x0d,
++ 0xe4, 0x87, 0xb5, 0x03, 0xd7, 0xec, 0x37, 0xcc, 0xf6, 0xea, 0x79, 0xcc,
++ 0x03, 0x6f, 0xad, 0xb9, 0x8f, 0xb2, 0xdb, 0xb5, 0x1f, 0x9b, 0x0f, 0x56,
++ 0x8a, 0x8c, 0x3f, 0x72, 0x67, 0xea, 0xcc, 0x0b, 0xa9, 0x97, 0x9c, 0x4e,
++ 0x4c, 0xda, 0xcf, 0xdf, 0x98, 0x5f, 0xbb, 0xed, 0xba, 0xf0, 0x19, 0xb1,
++ 0xd3, 0xd9, 0x67, 0xdb, 0xc4, 0x66, 0x3d, 0xb4, 0xd3, 0x69, 0x8c, 0x25,
++ 0x1b, 0x30, 0x90, 0x10, 0x1d, 0x47, 0x70, 0x99, 0xfc, 0xb0, 0x76, 0x70,
++ 0x1a, 0xc3, 0xe4, 0x87, 0xbe, 0xb8, 0xf7, 0x00, 0x35, 0x89, 0x6d, 0x6a,
++ 0x93, 0xc5, 0x93, 0x5c, 0x5a, 0x4e, 0x86, 0xaf, 0x5a, 0x7a, 0x97, 0x18,
++ 0xb3, 0x87, 0xeb, 0xbd, 0x97, 0x3c, 0xa9, 0x39, 0x96, 0x0f, 0xad, 0xac,
++ 0x14, 0xc5, 0x9a, 0xf4, 0x2b, 0x32, 0xf7, 0x45, 0x29, 0x4b, 0x91, 0xe6,
++ 0xc3, 0x5a, 0xeb, 0x5e, 0x8f, 0x75, 0xae, 0xc1, 0x51, 0x2e, 0x31, 0x58,
++ 0xe2, 0x2e, 0xf9, 0xf7, 0x72, 0x89, 0xbb, 0x61, 0xca, 0xb6, 0x98, 0x7b,
++ 0xb6, 0x14, 0xee, 0x07, 0x3c, 0xa8, 0x79, 0x80, 0x31, 0x72, 0x89, 0x82,
++ 0xf2, 0x25, 0x7e, 0x63, 0xa9, 0xad, 0x19, 0xa8, 0xd6, 0x88, 0x3f, 0x6e,
++ 0xb3, 0x27, 0xf1, 0x3b, 0xce, 0xd1, 0x01, 0x73, 0x6f, 0x21, 0x36, 0xec,
++ 0x9d, 0x43, 0x5b, 0xf5, 0x48, 0x7d, 0xdd, 0xe5, 0x0a, 0x47, 0x43, 0xae,
++ 0x58, 0xbd, 0xee, 0x54, 0x16, 0x33, 0x1e, 0xcb, 0xfe, 0xc9, 0xf3, 0xbf,
++ 0x72, 0x1b, 0x5f, 0xaa, 0x60, 0x7c, 0x7b, 0xd2, 0x92, 0x41, 0x6a, 0xc0,
++ 0x32, 0xee, 0xdf, 0xee, 0xd3, 0xd4, 0xcd, 0x7d, 0xba, 0x0f, 0x8e, 0x27,
++ 0x2a, 0xc9, 0xbf, 0xee, 0x1e, 0x43, 0x0a, 0x18, 0x43, 0xee, 0x8d, 0x99,
++ 0x5d, 0x5b, 0x43, 0x45, 0x52, 0x17, 0xb2, 0x62, 0x48, 0xbb, 0x8d, 0x38,
++ 0x5a, 0x2a, 0x76, 0xe1, 0xab, 0x21, 0xc6, 0xe9, 0x99, 0xdf, 0xc4, 0x3e,
++ 0xac, 0x3a, 0x5e, 0xf6, 0xb7, 0x0e, 0xec, 0x22, 0x66, 0xca, 0xd9, 0x6e,
++ 0xa7, 0xa6, 0xd1, 0xff, 0x3b, 0xd0, 0xc3, 0x39, 0x5f, 0x26, 0x6e, 0x0e,
++ 0x10, 0x37, 0x6f, 0x2c, 0x3b, 0xf1, 0x93, 0x1a, 0xd4, 0xd1, 0x08, 0xa6,
++ 0xfe, 0x5b, 0xb9, 0xe0, 0xe6, 0x52, 0x7f, 0xc7, 0x27, 0x16, 0x6e, 0xca,
++ 0xdc, 0x32, 0xdf, 0xec, 0xb9, 0x17, 0xf2, 0xdf, 0x85, 0x52, 0x4b, 0x34,
++ 0x9d, 0xda, 0xff, 0x36, 0x77, 0x56, 0x8a, 0xac, 0x77, 0x93, 0x43, 0xb0,
++ 0x76, 0x76, 0x4f, 0x7e, 0x9a, 0x98, 0x6b, 0xe5, 0x08, 0x8c, 0xb9, 0x11,
++ 0xac, 0x59, 0xae, 0xe2, 0x6a, 0x74, 0x1a, 0x05, 0x87, 0x72, 0xf8, 0x64,
++ 0x36, 0x9d, 0x22, 0x36, 0x0d, 0x43, 0xf0, 0xa8, 0x91, 0xfb, 0x62, 0xd0,
++ 0x4f, 0x4a, 0x30, 0x91, 0xd4, 0x88, 0x99, 0x26, 0xfa, 0x43, 0x2e, 0x72,
++ 0xdb, 0xee, 0x93, 0x79, 0x56, 0x9c, 0x28, 0x21, 0x86, 0xe7, 0x78, 0xb7,
++ 0x70, 0x6e, 0xc1, 0x1f, 0xe6, 0x18, 0x23, 0x76, 0xe4, 0x2d, 0x93, 0xbc,
++ 0xe2, 0x73, 0xf3, 0x42, 0x9b, 0xdc, 0xb7, 0x00, 0xc3, 0x7b, 0xc5, 0xfe,
++ 0x7c, 0xa8, 0xd1, 0x2e, 0x32, 0xcf, 0x00, 0xde, 0x8f, 0xda, 0xee, 0x71,
++ 0x91, 0x1b, 0x77, 0xe9, 0xcb, 0x71, 0xa3, 0xa2, 0x87, 0x3e, 0xef, 0xe6,
++ 0x6f, 0x53, 0x38, 0x12, 0x75, 0x21, 0xcf, 0xd2, 0x69, 0x29, 0xd7, 0x90,
++ 0xb1, 0xa1, 0x9d, 0xb4, 0xa1, 0x7c, 0xe6, 0x6f, 0x0f, 0x5b, 0xbe, 0x2a,
++ 0xf3, 0x4c, 0xe3, 0x15, 0x72, 0x5a, 0x6d, 0xb9, 0xf0, 0xd9, 0x20, 0xe3,
++ 0x62, 0x09, 0xe2, 0x03, 0x5d, 0x38, 0x1f, 0x2a, 0x41, 0xec, 0x90, 0xf8,
++ 0xd8, 0x02, 0xc1, 0x52, 0x3e, 0xb7, 0x91, 0x3a, 0x51, 0x89, 0x35, 0xf5,
++ 0x9d, 0x76, 0x7b, 0x09, 0x2e, 0x95, 0x31, 0xaf, 0xb5, 0xde, 0xe3, 0x69,
++ 0xc5, 0xc1, 0xac, 0x5d, 0xa8, 0xb4, 0x8b, 0xd6, 0x9b, 0x3c, 0x3a, 0xb7,
++ 0x96, 0x9c, 0xcf, 0x66, 0xfa, 0xe1, 0xbd, 0xe4, 0x36, 0x2f, 0x4b, 0xfd,
++ 0xc8, 0xe6, 0x63, 0x2c, 0x61, 0xce, 0x34, 0x29, 0xfa, 0xfd, 0xeb, 0xb9,
++ 0x19, 0xac, 0x78, 0xa5, 0x26, 0x73, 0x76, 0x25, 0xa7, 0xf7, 0xdc, 0x77,
++ 0x6d, 0x7d, 0xa1, 0xf2, 0x0b, 0x73, 0x6b, 0x95, 0xc8, 0x77, 0x9d, 0x79,
++ 0xda, 0x77, 0xf9, 0xfb, 0x2a, 0xf4, 0x8e, 0xcc, 0x8e, 0x15, 0xe2, 0x87,
++ 0x9e, 0xdb, 0xce, 0xd5, 0x95, 0xc5, 0xe5, 0xdd, 0xa9, 0x63, 0xa1, 0x67,
++ 0xb8, 0x0f, 0xfe, 0xa5, 0xf5, 0x56, 0xdd, 0x85, 0xdc, 0x97, 0x79, 0x89,
++ 0x60, 0xac, 0xc1, 0x18, 0x5f, 0x82, 0x9f, 0x26, 0x25, 0xe6, 0x9a, 0xc8,
++ 0xa7, 0xfd, 0x5d, 0xaa, 0xec, 0x7e, 0xbe, 0xcc, 0xe2, 0xd2, 0x25, 0x28,
++ 0xa7, 0xbd, 0x0f, 0x8e, 0xdc, 0xcd, 0xb6, 0x6f, 0xc5, 0x85, 0x74, 0x48,
++ 0x21, 0x4e, 0xfc, 0x8b, 0xd9, 0xff, 0xf5, 0xcc, 0x98, 0x0b, 0x49, 0x17,
++ 0x3e, 0x0a, 0xb5, 0x63, 0xaa, 0x2c, 0x8c, 0xa1, 0x44, 0x01, 0xda, 0xab,
++ 0xeb, 0xac, 0x77, 0x0a, 0x6a, 0xe2, 0x1e, 0x5c, 0x8c, 0x3a, 0xd1, 0x38,
++ 0xd7, 0x63, 0xd5, 0xd3, 0x6c, 0xf4, 0x85, 0x77, 0xa2, 0x11, 0xcb, 0xe7,
++ 0x66, 0xc7, 0x8c, 0x3c, 0x6d, 0x19, 0x1e, 0xca, 0xe2, 0xfa, 0xc1, 0xc4,
++ 0xe7, 0xc4, 0x9d, 0x52, 0xa3, 0x22, 0x5c, 0x82, 0x7b, 0x87, 0x0c, 0xc1,
++ 0x64, 0xa3, 0x24, 0xac, 0xcd, 0xdc, 0xa7, 0x94, 0xa0, 0x69, 0x44, 0x30,
++ 0x5e, 0x7c, 0x35, 0x4d, 0x5f, 0x6d, 0xe3, 0x1e, 0x75, 0xa2, 0x6e, 0xbf,
++ 0xa5, 0x57, 0xd5, 0xae, 0x98, 0x5d, 0x57, 0xf4, 0x88, 0xce, 0x18, 0xd7,
++ 0xf9, 0x10, 0xed, 0x7e, 0x26, 0xe4, 0x6d, 0xaf, 0xb0, 0x6b, 0x1d, 0xef,
++ 0x29, 0x41, 0x4c, 0x8c, 0x03, 0x03, 0x87, 0x03, 0xf8, 0x20, 0x21, 0x9c,
++ 0x3f, 0x80, 0x5f, 0x4d, 0x06, 0xf1, 0x2e, 0x63, 0x53, 0x41, 0xdc, 0x1b,
++ 0x79, 0x8e, 0x39, 0xdd, 0xfb, 0xfc, 0x9e, 0x1f, 0xd7, 0x71, 0x8d, 0xfa,
++ 0x73, 0xc6, 0x1b, 0x70, 0x65, 0xf2, 0x01, 0x5c, 0xdd, 0xaf, 0xe0, 0x84,
++ 0xf6, 0x00, 0x2e, 0x8f, 0x75, 0x62, 0xd9, 0x7e, 0x39, 0x87, 0x76, 0x2c,
++ 0xa4, 0x32, 0x36, 0x3c, 0x53, 0x6b, 0x76, 0xbd, 0xa8, 0xd7, 0x41, 0x2f,
++ 0xf7, 0xea, 0xed, 0xcc, 0x99, 0x04, 0xd3, 0x23, 0x36, 0xd9, 0x33, 0xd9,
++ 0xbb, 0x4e, 0x5c, 0xb5, 0x70, 0xfc, 0xee, 0xd8, 0x70, 0x0b, 0xc3, 0xe5,
++ 0x39, 0x82, 0x27, 0x0b, 0xf1, 0x7d, 0x26, 0xab, 0x3d, 0xbc, 0xcf, 0x45,
++ 0xec, 0x7b, 0x36, 0x5a, 0x80, 0xfc, 0xaa, 0x52, 0x2b, 0x97, 0x29, 0x8c,
++ 0x07, 0x70, 0x96, 0xba, 0x5b, 0x53, 0xe5, 0xe5, 0x77, 0x89, 0xbb, 0x41,
++ 0xe6, 0x2d, 0x15, 0xf8, 0xe0, 0xb6, 0x78, 0xfb, 0x7d, 0xf3, 0x49, 0x0b,
++ 0x9f, 0xeb, 0xe7, 0x09, 0xff, 0x7a, 0x3d, 0xf1, 0xeb, 0x1a, 0xc1, 0x69,
++ 0xa9, 0x21, 0x96, 0x6a, 0xda, 0x96, 0xbf, 0x80, 0xbc, 0x6f, 0x75, 0xe2,
++ 0x3f, 0x17, 0x93, 0x17, 0xbf, 0x18, 0xaa, 0x33, 0xca, 0xa0, 0xf1, 0xbe,
++ 0xa9, 0x65, 0x2a, 0x56, 0xf1, 0xaf, 0x9f, 0xf7, 0x05, 0x29, 0xc7, 0x75,
++ 0x33, 0xa5, 0xfa, 0xf8, 0xef, 0x05, 0x8c, 0xef, 0xdb, 0x71, 0x3e, 0x56,
++ 0xdf, 0x7e, 0x58, 0xb9, 0x66, 0x1a, 0x55, 0xb5, 0xfc, 0xad, 0x12, 0x17,
++ 0xa2, 0xde, 0xa9, 0x31, 0xd4, 0x7b, 0x66, 0x94, 0x83, 0xa6, 0xa1, 0xca,
++ 0xfe, 0xc8, 0x7a, 0x65, 0xfc, 0x62, 0x5e, 0xbf, 0x34, 0xcb, 0x0e, 0x6f,
++ 0xe5, 0x5d, 0xce, 0x9b, 0xf6, 0x27, 0xbc, 0xc4, 0x6c, 0x1a, 0xd5, 0xeb,
++ 0xd5, 0x1e, 0x62, 0x41, 0x44, 0xbd, 0x9b, 0xfd, 0x15, 0xd0, 0xfe, 0xc2,
++ 0xcc, 0x23, 0x4b, 0xa0, 0x5a, 0xf1, 0xa9, 0x15, 0xc9, 0x91, 0xd9, 0xdc,
++ 0x52, 0xec, 0x2e, 0xc3, 0x53, 0xdb, 0xcb, 0xba, 0x4f, 0x3a, 0x89, 0x45,
++ 0x09, 0xe2, 0x78, 0x9c, 0x38, 0x9e, 0x4f, 0x1c, 0xbf, 0xbe, 0xaf, 0x10,
++ 0xe7, 0xf7, 0x35, 0x22, 0x5d, 0x26, 0x63, 0xec, 0x70, 0x72, 0x75, 0xa9,
++ 0xec, 0x79, 0x85, 0x9a, 0xc1, 0x95, 0x72, 0x8e, 0x13, 0x82, 0x5f, 0x79,
++ 0x71, 0xe6, 0x59, 0xad, 0x76, 0x38, 0xac, 0x33, 0xf6, 0x73, 0x6e, 0xb3,
++ 0x3f, 0x97, 0x96, 0x8f, 0x96, 0x4a, 0xc1, 0x87, 0xd7, 0xe7, 0x49, 0x1c,
++ 0x7d, 0x9d, 0xb2, 0x9c, 0xa4, 0x4d, 0x6f, 0xd4, 0x57, 0x48, 0x5f, 0x8f,
++ 0xf7, 0xcb, 0x38, 0xc9, 0x6d, 0x4c, 0xec, 0xa6, 0x85, 0xd5, 0x55, 0x99,
++ 0x48, 0xe8, 0x61, 0xc6, 0xac, 0x10, 0x22, 0x65, 0x41, 0xc6, 0x2a, 0xf9,
++ 0xae, 0xe2, 0x0a, 0xf3, 0xb2, 0xf1, 0xa0, 0x82, 0x8f, 0xbe, 0x22, 0x5c,
++ 0xc0, 0xaf, 0x9f, 0x57, 0x84, 0x0b, 0xc8, 0x78, 0xc1, 0x88, 0x52, 0x0b,
++ 0x23, 0xf2, 0x2d, 0x5e, 0x34, 0xd7, 0xc2, 0x16, 0x79, 0x47, 0xa9, 0x86,
++ 0x71, 0xe7, 0xfe, 0x44, 0xfd, 0x94, 0xcf, 0x4e, 0x8e, 0xf6, 0x27, 0x5f,
++ 0x21, 0x37, 0xb3, 0x38, 0x02, 0xf1, 0x3e, 0x87, 0x0d, 0x72, 0xee, 0x76,
++ 0xb6, 0x3e, 0x72, 0xe7, 0x72, 0x3d, 0x19, 0xac, 0x2c, 0x15, 0x2e, 0xf7,
++ 0xff, 0xcc, 0xd6, 0xdb, 0xe4, 0xcf, 0xe1, 0xc8, 0x3f, 0xf0, 0xbb, 0x8c,
++ 0x17, 0xbf, 0xa3, 0x5d, 0xc4, 0x7f, 0x62, 0x3e, 0x6d, 0xf1, 0xb9, 0x97,
++ 0xe7, 0xc9, 0xf9, 0x43, 0xc7, 0xe0, 0xd0, 0x3c, 0x39, 0x6f, 0x65, 0x9b,
++ 0xc5, 0x0b, 0x32, 0xb1, 0xf6, 0x5d, 0x73, 0xad, 0x25, 0xeb, 0x91, 0xec,
++ 0x7d, 0x92, 0x43, 0x8b, 0x2c, 0x0a, 0x5e, 0xd1, 0xea, 0xd5, 0xb3, 0x28,
++ 0x16, 0x3c, 0x89, 0x48, 0x0f, 0xb3, 0x50, 0xf3, 0xb9, 0x8f, 0xf0, 0x6f,
++ 0x3f, 0xaf, 0xbf, 0xa1, 0x39, 0x1a, 0xb7, 0x42, 0xfa, 0xb6, 0x36, 0xee,
++ 0x55, 0xbd, 0xfb, 0x2c, 0xfc, 0x91, 0x7c, 0x65, 0xc6, 0x6c, 0xaf, 0x94,
++ 0x7b, 0x32, 0xfd, 0x5b, 0x28, 0x17, 0xad, 0xfa, 0x49, 0xc6, 0x66, 0x16,
++ 0xd0, 0x66, 0x04, 0xbb, 0x84, 0x8b, 0x2c, 0xe1, 0xda, 0x55, 0x8c, 0x4c,
++ 0x02, 0x79, 0x83, 0x2e, 0x8b, 0x1b, 0xa9, 0xb5, 0xb5, 0x9e, 0xcd, 0xf8,
++ 0xe7, 0x79, 0xf2, 0xee, 0xd1, 0x0e, 0x1d, 0xf7, 0xd8, 0xf0, 0xf6, 0x3d,
++ 0xb6, 0xf0, 0xca, 0x6f, 0x3d, 0xd4, 0x90, 0x37, 0x5f, 0xde, 0xff, 0x20,
++ 0xc3, 0x93, 0xfa, 0xad, 0x5b, 0x7a, 0x8d, 0xab, 0x19, 0xc3, 0x86, 0x99,
++ 0xe3, 0xaf, 0x0e, 0xfe, 0xd6, 0xfc, 0xa6, 0x23, 0xe2, 0xb1, 0xa3, 0xd6,
++ 0xd3, 0x8b, 0x1b, 0x66, 0xaa, 0x52, 0xae, 0xcb, 0x1c, 0xf2, 0x6e, 0xa1,
++ 0xf4, 0x4b, 0x4c, 0xf3, 0xde, 0x5a, 0x93, 0xf9, 0xb3, 0x6d, 0x95, 0x9d,
++ 0x7e, 0x91, 0xaf, 0x5d, 0x36, 0xeb, 0xaa, 0x6b, 0xdd, 0x36, 0xa5, 0x8e,
++ 0xd6, 0x51, 0x89, 0x57, 0x69, 0xbf, 0xaf, 0x4e, 0x4a, 0xcc, 0x53, 0x71,
++ 0x94, 0x7e, 0x3a, 0x56, 0xe7, 0xeb, 0xbc, 0xca, 0x5c, 0xf2, 0x43, 0x72,
++ 0xfc, 0x37, 0x35, 0x6f, 0xfb, 0x19, 0xa9, 0x3b, 0x86, 0x1c, 0x38, 0x17,
++ 0xbc, 0x61, 0xd5, 0x82, 0x63, 0x87, 0x54, 0x0c, 0x27, 0x32, 0xfe, 0xfe,
++ 0x1a, 0xfd, 0xf8, 0xd6, 0xd9, 0x05, 0x1d, 0x3d, 0x43, 0xe2, 0x1f, 0x0d,
++ 0x96, 0x1f, 0xdd, 0xaa, 0x15, 0x09, 0x5e, 0x8b, 0x5f, 0x6c, 0x90, 0xde,
++ 0x9d, 0x91, 0x02, 0xb9, 0xcc, 0xe0, 0x6a, 0x72, 0x60, 0x89, 0xb1, 0x01,
++ 0xe6, 0xbb, 0x0e, 0xfa, 0xcf, 0x19, 0xe6, 0x1e, 0x94, 0x2d, 0x6c, 0x9a,
++ 0xef, 0x32, 0x17, 0x1b, 0x41, 0xbd, 0x7a, 0x0a, 0xeb, 0xc8, 0x63, 0xc9,
++ 0x71, 0x26, 0x9b, 0xb1, 0xc7, 0xca, 0xa5, 0x7c, 0xea, 0xc3, 0xca, 0x52,
++ 0xae, 0xbf, 0x19, 0xdd, 0x63, 0x0b, 0x70, 0x80, 0xeb, 0x7a, 0x44, 0xff,
++ 0x2b, 0x94, 0x0f, 0x75, 0x77, 0x96, 0x53, 0x1f, 0x9f, 0x86, 0x8c, 0x0e,
++ 0x62, 0xfa, 0x96, 0x53, 0x4a, 0xfd, 0xfa, 0x98, 0xf2, 0x4d, 0xee, 0x87,
++ 0xd4, 0x47, 0x3c, 0xcc, 0xd3, 0x1f, 0x61, 0x3c, 0xfb, 0x33, 0xec, 0x56,
++ 0x95, 0x26, 0x5b, 0x58, 0x38, 0x22, 0xfc, 0xaa, 0x75, 0x76, 0xf0, 0xbf,
++ 0x40, 0x9f, 0xdb, 0xc0, 0x6b, 0x12, 0xd7, 0xe5, 0x5e, 0x39, 0x37, 0xde,
++ 0x89, 0x93, 0x69, 0xda, 0x75, 0xb4, 0x0f, 0xa7, 0xd2, 0xf2, 0x4c, 0xe1,
++ 0x58, 0x01, 0xc4, 0x86, 0xec, 0x98, 0xd0, 0x7d, 0x91, 0x52, 0xea, 0xa5,
++ 0x30, 0xe4, 0x8d, 0xac, 0x53, 0x02, 0xe4, 0x72, 0x69, 0x9c, 0xdb, 0xeb,
++ 0x6d, 0xaf, 0x63, 0xde, 0x18, 0x9d, 0x84, 0xfa, 0xdc, 0xf2, 0x34, 0xce,
++ 0x8e, 0x3e, 0x0e, 0x4f, 0xb5, 0xd7, 0xb3, 0x5a, 0x69, 0xc1, 0x8e, 0xc9,
++ 0x7f, 0xaf, 0xc6, 0xe4, 0xe1, 0xb3, 0x5b, 0x60, 0x50, 0xf7, 0xbb, 0xf0,
++ 0xad, 0xf9, 0xe2, 0xf3, 0xbd, 0x93, 0xc5, 0x58, 0xc4, 0x78, 0xf4, 0xb2,
++ 0x15, 0x67, 0x33, 0x7e, 0x54, 0xa3, 0x7d, 0x64, 0x3e, 0x95, 0x8d, 0xe1,
++ 0x7f, 0x58, 0x5f, 0x3f, 0x34, 0x23, 0xaa, 0xe8, 0x4b, 0xc6, 0xd5, 0xa0,
++ 0x80, 0xf3, 0xec, 0xce, 0xc6, 0xeb, 0x32, 0xed, 0x9f, 0xcc, 0xc7, 0xad,
++ 0x39, 0x56, 0xce, 0x97, 0x44, 0x61, 0xa7, 0x95, 0xe7, 0xcb, 0xba, 0x75,
++ 0x7c, 0x16, 0x95, 0x5a, 0x87, 0x8a, 0x53, 0xba, 0xe0, 0x48, 0x0b, 0x7d,
++ 0xd5, 0x89, 0x2d, 0x41, 0xba, 0xa3, 0x55, 0xf7, 0x9f, 0xc6, 0x9e, 0xe4,
++ 0xbf, 0x9a, 0xcf, 0xd3, 0x8e, 0xd6, 0x90, 0xc3, 0x78, 0x88, 0x03, 0x1b,
++ 0x43, 0x8f, 0x90, 0x87, 0x72, 0xcd, 0x09, 0x07, 0x31, 0x48, 0x41, 0xa2,
++ 0x91, 0xfe, 0x1f, 0x5a, 0x82, 0x29, 0xeb, 0xfe, 0x4f, 0xe7, 0x65, 0x6a,
++ 0x8b, 0x67, 0xe6, 0x67, 0x72, 0x43, 0xd1, 0xff, 0x7f, 0x44, 0x7f, 0xaf,
++ 0x99, 0x9e, 0x72, 0xd1, 0x9f, 0x03, 0x6e, 0xc6, 0xad, 0x03, 0xbc, 0xe7,
++ 0xc2, 0x5e, 0x07, 0x06, 0xb5, 0x16, 0x0c, 0x4e, 0xc2, 0xf3, 0x29, 0xef,
++ 0xf9, 0xf9, 0x68, 0xc7, 0xfc, 0x0c, 0x57, 0x78, 0x1b, 0xdd, 0xd1, 0x17,
++ 0xcc, 0x55, 0xe5, 0xb2, 0x5e, 0x39, 0xaf, 0xd3, 0xca, 0xfb, 0x73, 0x75,
++ 0xbe, 0xcd, 0xe6, 0x13, 0x56, 0x9c, 0x78, 0x71, 0xbe, 0xf4, 0xd7, 0x5e,
++ 0x4f, 0x98, 0xb8, 0xa2, 0xf7, 0x58, 0xb9, 0xb9, 0x60, 0x43, 0x6f, 0x42,
++ 0xf6, 0x56, 0x64, 0xfb, 0x66, 0x56, 0x1f, 0x13, 0x55, 0xb7, 0xcb, 0xbd,
++ 0x2a, 0x6b, 0xcb, 0xd2, 0xdf, 0xce, 0xf1, 0x7e, 0xb1, 0x65, 0xb1, 0x63,
++ 0xeb, 0xbd, 0x96, 0xa4, 0xbc, 0xd3, 0xb9, 0x41, 0xfd, 0x1d, 0x9f, 0x21,
++ 0x75, 0x96, 0x16, 0xce, 0x61, 0x9a, 0x9b, 0xf5, 0x7a, 0xcf, 0x29, 0xfc,
++ 0x31, 0x6d, 0x5b, 0xc7, 0xae, 0x21, 0xa9, 0xc3, 0x7a, 0x14, 0xc7, 0xbe,
++ 0x75, 0xb8, 0xc2, 0xf8, 0xbf, 0xc7, 0xb2, 0x43, 0xc1, 0x15, 0x91, 0x43,
++ 0xb0, 0xa5, 0x8d, 0x71, 0x5c, 0x6a, 0xdd, 0x46, 0xa4, 0x26, 0xdc, 0xa9,
++ 0x7c, 0x58, 0xd7, 0x89, 0x63, 0x21, 0xc3, 0x2c, 0xd5, 0xfc, 0xeb, 0x6b,
++ 0x6c, 0x28, 0x98, 0x6c, 0xc8, 0xc7, 0xf1, 0x90, 0xf0, 0x47, 0xb8, 0xd2,
++ 0x69, 0xaf, 0x31, 0xc7, 0xae, 0xba, 0xbe, 0x97, 0xce, 0x62, 0xa5, 0xad,
++ 0x7e, 0xbe, 0xe4, 0x50, 0x49, 0x0b, 0x47, 0xbe, 0x8a, 0x07, 0xad, 0xbd,
++ 0x55, 0x19, 0x43, 0xa5, 0x0e, 0x7c, 0x2c, 0x74, 0x2d, 0x2a, 0x98, 0x62,
++ 0x36, 0x35, 0x87, 0xea, 0xd5, 0x5d, 0xb8, 0x87, 0xd8, 0xd5, 0x84, 0x73,
++ 0xba, 0xf4, 0x3f, 0x8c, 0x6f, 0x3a, 0xac, 0xb3, 0x34, 0x47, 0x43, 0x3b,
++ 0xa2, 0x2b, 0x71, 0x60, 0xc8, 0x50, 0x9c, 0x61, 0x6f, 0x24, 0x46, 0x2e,
++ 0xc4, 0x1c, 0xdd, 0xaa, 0x03, 0x4a, 0x8d, 0x61, 0xb8, 0xa1, 0x13, 0xbb,
++ 0xf4, 0x7c, 0xf4, 0xea, 0x91, 0x82, 0x9e, 0xe5, 0x5d, 0x38, 0xa8, 0x17,
++ 0x1b, 0x8b, 0xc2, 0x06, 0x31, 0x5d, 0xdb, 0x92, 0x84, 0xbf, 0xe5, 0x32,
++ 0x39, 0xc7, 0x49, 0x78, 0x3b, 0x9a, 0xec, 0xc4, 0xdc, 0x15, 0x0e, 0x57,
++ 0x6c, 0xbc, 0x11, 0x89, 0xc9, 0x4a, 0xd7, 0xee, 0xf1, 0x20, 0xe2, 0x93,
++ 0xdc, 0x6f, 0xe6, 0xba, 0x8e, 0xf1, 0x95, 0xe4, 0xa0, 0xa2, 0x47, 0x3b,
++ 0x6d, 0xb1, 0x0e, 0xcf, 0xb5, 0x5e, 0x32, 0x9f, 0xf1, 0x0b, 0x7e, 0x2e,
++ 0xc0, 0x56, 0xd5, 0x67, 0x71, 0xca, 0x88, 0xed, 0x0f, 0xf9, 0x87, 0x9d,
++ 0x36, 0xf7, 0x7d, 0xd3, 0xf3, 0x75, 0xd1, 0x9b, 0x63, 0x01, 0x0a, 0x1f,
++ 0x21, 0x7e, 0xca, 0xbf, 0x45, 0x77, 0xa2, 0x43, 0x13, 0x9b, 0x74, 0xa9,
++ 0xf1, 0x35, 0xd0, 0x67, 0xdc, 0x78, 0x47, 0xbd, 0xb5, 0x0f, 0xcf, 0xea,
++ 0x3e, 0x7d, 0x0c, 0x52, 0xdb, 0x5b, 0xc1, 0x71, 0x52, 0x83, 0x69, 0xc4,
++ 0x4b, 0xd9, 0x9c, 0xc3, 0x63, 0x2b, 0x22, 0xee, 0xe6, 0xe2, 0x88, 0x5c,
++ 0xf7, 0x26, 0x23, 0xb4, 0xd3, 0x6d, 0xc1, 0x19, 0x33, 0x52, 0x6e, 0x74,
++ 0xca, 0xf9, 0x15, 0x77, 0x78, 0xba, 0xd3, 0x5d, 0xe7, 0xed, 0x98, 0x51,
++ 0x80, 0x73, 0x31, 0xc6, 0x61, 0xeb, 0x7f, 0xb1, 0x28, 0x73, 0x3b, 0x31,
++ 0x12, 0x5c, 0x88, 0xf6, 0x36, 0x79, 0x56, 0x33, 0xfa, 0xf6, 0x9b, 0x66,
++ 0x71, 0xc8, 0xa7, 0xa6, 0xe1, 0xc4, 0xc3, 0x41, 0x3b, 0x2e, 0xa9, 0x26,
++ 0x1c, 0xa1, 0x7f, 0x35, 0xc7, 0x19, 0x1f, 0x47, 0xe9, 0x27, 0xbb, 0x69,
++ 0x63, 0xf2, 0xbe, 0x8f, 0x9f, 0x7e, 0x12, 0xa7, 0x9f, 0x9c, 0x0b, 0xdd,
++ 0x97, 0x7d, 0x5f, 0x50, 0x23, 0xaf, 0x98, 0x46, 0xd3, 0x90, 0x8a, 0x4f,
++ 0x57, 0x4c, 0x23, 0x34, 0x92, 0x93, 0x5d, 0xfc, 0x32, 0x27, 0xbf, 0xf4,
++ 0x11, 0x45, 0x76, 0x91, 0x51, 0xd6, 0x22, 0xff, 0xce, 0x5d, 0xcb, 0xfd,
++ 0x26, 0x71, 0xd6, 0x89, 0x56, 0x6b, 0x6d, 0x7f, 0x56, 0x93, 0xc1, 0x8c,
++ 0xdc, 0x9a, 0x2e, 0xb9, 0x6f, 0xff, 0x7e, 0xe2, 0x8e, 0xeb, 0x2b, 0xee,
++ 0xb8, 0xbe, 0x71, 0xde, 0xed, 0xdf, 0x73, 0x3e, 0x71, 0x4b, 0xaf, 0x1d,
++ 0xba, 0x6f, 0xea, 0x18, 0xd7, 0x3a, 0x67, 0xc9, 0x98, 0x79, 0xa9, 0x4c,
++ 0x64, 0x91, 0x3c, 0x36, 0x23, 0xeb, 0xaa, 0xf1, 0xd9, 0xb2, 0xbe, 0x95,
++ 0xed, 0x19, 0x58, 0x67, 0x7c, 0xe9, 0x37, 0x1a, 0x7e, 0x78, 0xdb, 0xb9,
++ 0x43, 0xb1, 0xb5, 0x80, 0xd2, 0x17, 0x93, 0xf7, 0x33, 0x0b, 0xad, 0x77,
++ 0xac, 0x55, 0xbf, 0x81, 0x22, 0xbf, 0xb6, 0x65, 0x8e, 0xad, 0x0b, 0xce,
++ 0xa5, 0x5a, 0xc7, 0xb7, 0x94, 0x24, 0xe2, 0xe3, 0xde, 0xc0, 0x18, 0x75,
++ 0x15, 0x1b, 0xbf, 0xce, 0x5c, 0xbb, 0x0b, 0xcf, 0x85, 0x1c, 0x46, 0x61,
++ 0x58, 0xce, 0x82, 0xae, 0xc2, 0xae, 0x91, 0xbf, 0xc2, 0xe6, 0xa4, 0x70,
++ 0xfc, 0x05, 0xe8, 0x99, 0xb4, 0xe1, 0x04, 0xed, 0xbb, 0x8f, 0xcf, 0x21,
++ 0xfe, 0xb9, 0x53, 0x90, 0xf7, 0x6b, 0x1a, 0x98, 0x37, 0xeb, 0xd6, 0x67,
++ 0xc7, 0xc8, 0xcf, 0xb0, 0x39, 0x6a, 0xe2, 0x53, 0x9d, 0xb1, 0x47, 0x13,
++ 0xf9, 0x1c, 0xd0, 0xca, 0x5b, 0x2d, 0x2c, 0x7d, 0x32, 0xce, 0xfd, 0xac,
++ 0x16, 0x5f, 0x5d, 0x49, 0x9f, 0x55, 0xf0, 0x99, 0xf4, 0x27, 0xcb, 0x29,
++ 0x33, 0xb9, 0xe1, 0xf1, 0xe8, 0x76, 0x8c, 0x5a, 0xfd, 0x67, 0xad, 0xaf,
++ 0xc6, 0x1e, 0x79, 0xb1, 0x8c, 0x3c, 0x3b, 0xa1, 0xfb, 0xdb, 0x2f, 0x28,
++ 0xf0, 0x94, 0x84, 0xfd, 0x8c, 0x33, 0x5f, 0xe2, 0x37, 0xba, 0xd4, 0xd8,
++ 0x74, 0xd7, 0x5a, 0xda, 0xfb, 0xbe, 0x91, 0x80, 0x55, 0x33, 0xf8, 0xe1,
++ 0x5d, 0x6b, 0x1a, 0x99, 0x77, 0xab, 0x33, 0xf5, 0xc7, 0x9f, 0xe1, 0x48,
++ 0xda, 0x85, 0xa7, 0xe2, 0x1e, 0x65, 0xd1, 0x3e, 0x15, 0x0f, 0xc5, 0xbd,
++ 0x53, 0x4d, 0x76, 0xf2, 0x8f, 0x65, 0x73, 0x38, 0x9f, 0x82, 0x1f, 0x2c,
++ 0x95, 0x58, 0xf0, 0x47, 0x30, 0xaa, 0x23, 0x9c, 0x13, 0xc5, 0x79, 0xcb,
++ 0xbd, 0xea, 0x11, 0x9b, 0xcf, 0xfd, 0x1b, 0xec, 0x80, 0x7d, 0xfc, 0x11,
++ 0x74, 0x53, 0xfe, 0x35, 0x71, 0xe9, 0x69, 0xd5, 0x03, 0x65, 0xcd, 0xd8,
++ 0x3d, 0x26, 0xbe, 0x09, 0xa3, 0x2a, 0x0c, 0x4f, 0x65, 0xd8, 0xbf, 0x10,
++ 0x85, 0x5f, 0x92, 0x6b, 0x4f, 0x4b, 0xfe, 0xb9, 0xa5, 0xd4, 0x66, 0x32,
++ 0x7f, 0xb9, 0x2f, 0xdb, 0xab, 0x58, 0x89, 0x1d, 0x43, 0x52, 0x87, 0x27,
++ 0x6e, 0xeb, 0xcc, 0x83, 0xca, 0xb4, 0xc0, 0x46, 0x9b, 0xf4, 0x87, 0xb6,
++ 0xc3, 0x17, 0xdb, 0x8e, 0x40, 0x4c, 0x7c, 0x56, 0x53, 0x3b, 0x10, 0x39,
++ 0x2b, 0xb5, 0xbf, 0x45, 0x21, 0x3f, 0xe5, 0xf2, 0xf7, 0x55, 0xda, 0x75,
++ 0xd7, 0x6b, 0x13, 0x2a, 0xa6, 0xd4, 0x4c, 0x1e, 0x39, 0x96, 0xd4, 0xd6,
++ 0xe7, 0xdb, 0xe4, 0x0c, 0xc5, 0x55, 0xeb, 0x3d, 0xeb, 0x88, 0xed, 0x9f,
++ 0x89, 0x47, 0xcd, 0x18, 0xd8, 0xff, 0x3e, 0x63, 0x90, 0x3c, 0xe3, 0x77,
++ 0xcc, 0xaf, 0x9d, 0x58, 0xdd, 0xe6, 0xc1, 0x83, 0x71, 0xa9, 0x9d, 0xae,
++ 0xaf, 0xca, 0x9c, 0x01, 0x91, 0xef, 0x0e, 0x74, 0xe8, 0x04, 0xd9, 0xea,
++ 0x2f, 0xcc, 0x4a, 0x2b, 0x2f, 0xfd, 0xbf, 0x19, 0x9b, 0x49, 0xe4, 0x2d,
++ 0x14, 0x1f, 0xef, 0x9d, 0x64, 0x02, 0x69, 0xd9, 0x5d, 0x15, 0xbf, 0xcb,
++ 0x5c, 0xda, 0x81, 0xed, 0xd8, 0x56, 0x25, 0x7c, 0xe6, 0xc9, 0x89, 0xd9,
++ 0xf7, 0xe7, 0xea, 0x32, 0x95, 0x59, 0x4e, 0x95, 0xb3, 0x37, 0xe9, 0x05,
++ 0x46, 0x94, 0x27, 0xa2, 0x2d, 0xca, 0xda, 0xa8, 0xf4, 0x03, 0x6d, 0xd1,
++ 0x22, 0x72, 0x18, 0xdf, 0x52, 0x13, 0xdf, 0x0e, 0x1d, 0x57, 0x76, 0x5a,
++ 0xe7, 0x66, 0xe5, 0xac, 0x2b, 0x50, 0x3e, 0xd1, 0xac, 0xec, 0x8a, 0x7e,
++ 0x62, 0x6e, 0xb4, 0x7a, 0xf0, 0x79, 0xd6, 0x79, 0x9c, 0xfc, 0x09, 0x17,
++ 0xca, 0x8e, 0xc8, 0xf9, 0x41, 0x0d, 0x15, 0x13, 0x8f, 0x91, 0xb7, 0x0a,
++ 0xd7, 0x31, 0x5a, 0x1c, 0xd6, 0xb9, 0xb6, 0xe6, 0x97, 0x72, 0xe7, 0xda,
++ 0x1c, 0x31, 0x79, 0x1b, 0xd9, 0xfa, 0x8f, 0xb9, 0xd2, 0x51, 0xe6, 0x4a,
++ 0x66, 0xd3, 0xb7, 0x43, 0xc6, 0xee, 0x0a, 0x78, 0x03, 0xe5, 0x36, 0xc3,
++ 0x94, 0x7a, 0xce, 0x6b, 0x24, 0x8c, 0xeb, 0x6a, 0x0d, 0x3c, 0x5c, 0x2b,
++ 0xef, 0x1f, 0xca, 0xbb, 0xc7, 0x5d, 0x38, 0x1a, 0xea, 0xc2, 0x2f, 0xf5,
++ 0x2e, 0xec, 0xd1, 0xe5, 0x4c, 0x43, 0x31, 0x65, 0xd5, 0xa6, 0xa2, 0xd0,
++ 0xf4, 0xb4, 0xa2, 0x9d, 0xb9, 0x0e, 0xef, 0x01, 0x9f, 0xe2, 0x35, 0x56,
++ 0x29, 0x1a, 0xae, 0x8e, 0x7b, 0x67, 0x4a, 0xe9, 0x03, 0x37, 0xc6, 0x03,
++ 0x98, 0x21, 0xae, 0x26, 0x27, 0xe5, 0xfc, 0xc9, 0x02, 0x0c, 0x4d, 0x7e,
++ 0x4d, 0xb8, 0x81, 0x41, 0x4c, 0xb2, 0xce, 0x48, 0x3e, 0x2f, 0xbd, 0x4e,
++ 0x67, 0x30, 0xcb, 0x61, 0x0c, 0x65, 0x53, 0x43, 0x09, 0x6e, 0x30, 0x3a,
++ 0xfd, 0x6d, 0xba, 0x93, 0xf9, 0x1c, 0xde, 0xa8, 0x81, 0xfd, 0x3b, 0x6e,
++ 0xd4, 0x25, 0xe7, 0xe0, 0x44, 0x5d, 0x39, 0xf2, 0x70, 0x6c, 0xf4, 0x45,
++ 0x72, 0xfc, 0xee, 0xf6, 0x52, 0xe6, 0xa7, 0x13, 0xa3, 0x4e, 0xa4, 0x52,
++ 0x52, 0x73, 0xb0, 0x7a, 0x96, 0xd3, 0x0e, 0xfa, 0x52, 0x7f, 0x02, 0x75,
++ 0x35, 0x61, 0x7f, 0xb2, 0xc6, 0xae, 0x72, 0x8e, 0x4a, 0xa4, 0xd2, 0x1a,
++ 0x3f, 0x01, 0x7e, 0x82, 0xfc, 0x34, 0xe2, 0xdb, 0xf4, 0xd9, 0x32, 0xe2,
++ 0xed, 0xf7, 0xd3, 0x25, 0xf8, 0x24, 0xa9, 0x05, 0x74, 0xda, 0xc1, 0x28,
++ 0x73, 0x04, 0xc3, 0xd2, 0x53, 0x09, 0xae, 0xd3, 0x4f, 0x5f, 0x0e, 0x95,
++ 0xc0, 0x4c, 0xdd, 0x2d, 0x27, 0x94, 0xdc, 0x16, 0x6a, 0x61, 0x58, 0xf8,
++ 0xe2, 0x31, 0x25, 0x95, 0x3d, 0xf3, 0xf5, 0xea, 0x38, 0xda, 0xcb, 0xc3,
++ 0xae, 0xe0, 0xea, 0xb8, 0xfd, 0x13, 0x79, 0x9f, 0x75, 0x43, 0x83, 0xbc,
++ 0xf3, 0xe4, 0x0a, 0x3e, 0x3d, 0xe1, 0x0a, 0xae, 0x8f, 0x1f, 0x53, 0x28,
++ 0xcf, 0x81, 0x1a, 0xbb, 0x2b, 0xf8, 0xe4, 0xc4, 0xb1, 0x85, 0x99, 0xbc,
++ 0x0f, 0xca, 0xd3, 0xb5, 0x06, 0x6d, 0x8c, 0x79, 0xef, 0x32, 0xe9, 0xcb,
++ 0x68, 0x9d, 0x57, 0xec, 0x85, 0x46, 0x4d, 0xd8, 0xeb, 0xa9, 0xb1, 0xcb,
++ 0xd9, 0x90, 0x69, 0xc4, 0x93, 0xf2, 0xae, 0x97, 0xd8, 0xfe, 0x3f, 0x99,
++ 0x46, 0x99, 0x9c, 0xf5, 0xe8, 0x44, 0x5c, 0x2b, 0x67, 0xee, 0x24, 0x67,
++ 0xcd, 0x8f, 0x86, 0xa2, 0xb1, 0x62, 0x79, 0x77, 0xb6, 0xe9, 0x7b, 0x21,
++ 0x6f, 0xcb, 0xa0, 0x62, 0x3c, 0x5e, 0x04, 0xd9, 0xd7, 0x2e, 0xe2, 0xb7,
++ 0xa6, 0x3a, 0x15, 0x6f, 0x63, 0x0f, 0x02, 0x38, 0x91, 0x16, 0x5d, 0x07,
++ 0xe5, 0x8c, 0xba, 0xa5, 0xeb, 0x5b, 0x67, 0xae, 0x33, 0xb6, 0xb3, 0x2d,
++ 0xea, 0xe0, 0x5f, 0xb1, 0x17, 0x1b, 0x63, 0x0a, 0xe3, 0x8a, 0x65, 0x33,
++ 0xb7, 0x64, 0x5c, 0x57, 0xdb, 0x85, 0xc9, 0x50, 0xa1, 0xbc, 0x77, 0xcd,
++ 0xb8, 0xee, 0x0d, 0x7c, 0xa2, 0x58, 0xf1, 0xdc, 0x28, 0x62, 0x9c, 0x7d,
++ 0x61, 0xfc, 0xef, 0xcc, 0xf6, 0x6a, 0xc1, 0x2b, 0x3b, 0xc7, 0x5e, 0xc7,
++ 0x6b, 0xa9, 0x5b, 0xe3, 0x5a, 0x38, 0xae, 0x90, 0xe3, 0x8a, 0xc2, 0x92,
++ 0x3b, 0x7a, 0xf5, 0xb5, 0x8a, 0xe6, 0x29, 0x50, 0xa4, 0x57, 0xa6, 0xe1,
++ 0xbd, 0xf4, 0xe4, 0x42, 0xc9, 0x79, 0x7b, 0x27, 0xcb, 0xb1, 0x6e, 0xaf,
++ 0xd9, 0xb4, 0x68, 0xa9, 0xd9, 0x94, 0x0e, 0x45, 0xcd, 0x97, 0xab, 0x64,
++ 0x4f, 0xa5, 0xff, 0x27, 0x63, 0x34, 0xd5, 0xc7, 0x5c, 0xf3, 0x6b, 0x7a,
++ 0x6f, 0xf6, 0xcc, 0x2e, 0xed, 0x9a, 0xcf, 0x38, 0x9d, 0x12, 0x3b, 0xd9,
++ 0xd1, 0xee, 0x62, 0x3e, 0x2a, 0xef, 0x87, 0x1e, 0xe5, 0xfe, 0x1f, 0x49,
++ 0xfd, 0xcd, 0x42, 0x39, 0xc3, 0x2e, 0x67, 0x08, 0x80, 0xff, 0x0f, 0x1d,
++ 0xab, 0x22, 0x97, 0x70, 0x78, 0x00, 0x00, 0x00 };
+
+ static const u32 bnx2_RXP_b09FwData[(0x0/4) + 1] = { 0x0 };
+-static const u32 bnx2_RXP_b09FwRodata[(0x124/4) + 1] = {
++static const u32 bnx2_RXP_b09FwRodata[(0xf0/4) + 1] = {
+ 0x5f865437, 0xe4ac62cc, 0x50103a45, 0x36621985, 0xbf14c0e8, 0x1bc27a1e,
+ 0x84f4b556, 0x094ea6fe, 0x7dda01e7, 0xc04d7481, 0x80080100, 0x80080080,
+- 0x80080000, 0x08004fbc, 0x08004fbc, 0x08005098, 0x0800506c, 0x08005050,
+- 0x08004f8c, 0x08004f8c, 0x08004f8c, 0x08004fc4, 0x080072ac, 0x080072f8,
+- 0x080072b8, 0x080071dc, 0x080072b8, 0x080072e8, 0x080072b8, 0x080071dc,
+- 0x080071dc, 0x080071dc, 0x080071dc, 0x080071dc, 0x080071dc, 0x080071dc,
+- 0x080071dc, 0x080071dc, 0x080071dc, 0x080072d8, 0x080072c8, 0x080071dc,
+- 0x080071dc, 0x080071dc, 0x080071dc, 0x080071dc, 0x080071dc, 0x080071dc,
+- 0x080071dc, 0x080071dc, 0x080071dc, 0x080071dc, 0x080071dc, 0x080072c8,
+- 0x0800787c, 0x08007748, 0x08007844, 0x08007748, 0x08007814, 0x08007630,
+- 0x08007748, 0x08007748, 0x08007748, 0x08007748, 0x08007748, 0x08007748,
+- 0x08007748, 0x08007748, 0x08007748, 0x08007748, 0x08007748, 0x08007748,
+- 0x08007770, 0x00000000 };
++ 0x80080000, 0x08004efc, 0x08004efc, 0x08004fd8, 0x08004fac, 0x08004f90,
++ 0x08004ecc, 0x08004ecc, 0x08004ecc, 0x08004f04, 0x08007220, 0x0800726c,
++ 0x0800722c, 0x08007150, 0x0800722c, 0x0800725c, 0x0800722c, 0x08007150,
++ 0x08007150, 0x08007150, 0x08007150, 0x08007150, 0x08007150, 0x08007150,
++ 0x08007150, 0x08007150, 0x08007150, 0x0800724c, 0x0800723c, 0x08007150,
++ 0x08007150, 0x08007150, 0x08007150, 0x08007150, 0x08007150, 0x08007150,
++ 0x08007150, 0x08007150, 0x08007150, 0x08007150, 0x08007150, 0x0800723c,
++ 0x080077f4, 0x080076bc, 0x080077bc, 0x08007718, 0x080076e8, 0x080075a4,
++ 0x00000000 };
+
+ static struct fw_info bnx2_rxp_fw_09 = {
+- /* Firmware version: 4.6.15 */
++ /* Firmware version: 4.4.23 */
+ .ver_major = 0x4,
+- .ver_minor = 0x6,
+- .ver_fix = 0xf,
++ .ver_minor = 0x4,
++ .ver_fix = 0x17,
+
+- .start_addr = 0x080031d8,
++ .start_addr = 0x080031d0,
+
+ .text_addr = 0x08000000,
+- .text_len = 0x78f4,
++ .text_len = 0x786c,
+ .text_index = 0x0,
+ .gz_text = bnx2_RXP_b09FwText,
+ .gz_text_len = sizeof(bnx2_RXP_b09FwText),
+@@ -3148,492 +3158,548 @@
+ .data_index = 0x0,
+ .data = bnx2_RXP_b09FwData,
+
+- .sbss_addr = 0x08007a40,
++ .sbss_addr = 0x08007980,
+ .sbss_len = 0x58,
+ .sbss_index = 0x0,
+
+- .bss_addr = 0x08007a98,
+- .bss_len = 0x20,
++ .bss_addr = 0x080079d8,
++ .bss_len = 0x1c,
+ .bss_index = 0x0,
+
+- .rodata_addr = 0x080078f4,
+- .rodata_len = 0x124,
++ .rodata_addr = 0x0800786c,
++ .rodata_len = 0xf0,
+ .rodata_index = 0x0,
+ .rodata = bnx2_RXP_b09FwRodata,
+ };
+
+ static u8 bnx2_xi_rv2p_proc1[] = {
+- /* Date: 01/27/2009 19:01 */
+-#define XI_RV2P_PROC1_POST_WAIT_TIMEOUT_MSK 0xffff
+- 0xa5, 0x56, 0xdd, 0x6b, 0x1c, 0x55, 0x14, 0x3f, 0x33, 0xbb, 0x33, 0xb3,
+- 0xd9, 0x9d, 0xd9, 0x5d, 0x9a, 0x34, 0x8e, 0xb1, 0x34, 0xdb, 0x20, 0xca,
+- 0xa6, 0x13, 0xdd, 0x68, 0x1f, 0x04, 0x03, 0x2d, 0x01, 0x29, 0x98, 0xe2,
+- 0x43, 0xa0, 0x52, 0x8a, 0x60, 0x5c, 0xb4, 0x08, 0xf6, 0x2f, 0x10, 0xc1,
+- 0x21, 0x31, 0x11, 0xc4, 0xaf, 0x7d, 0xe8, 0x42, 0x02, 0x6a, 0x40, 0x50,
+- 0x09, 0x11, 0x77, 0xdf, 0x24, 0x16, 0x7c, 0x68, 0xf1, 0x41, 0xda, 0xa7,
+- 0x16, 0xd4, 0x97, 0x46, 0x11, 0xbf, 0x5e, 0x04, 0xd1, 0xc7, 0x9a, 0xf1,
+- 0x9e, 0x8f, 0xbb, 0x3b, 0x73, 0xb3, 0x9b, 0x14, 0x5c, 0x48, 0x7e, 0x9c,
+- 0x7b, 0xcf, 0x39, 0xf7, 0x7c, 0x9f, 0xa9, 0x02, 0x80, 0x0d, 0x71, 0x77,
+- 0x52, 0x21, 0x58, 0xb9, 0x5c, 0x01, 0x01, 0x60, 0x1b, 0xf8, 0xe7, 0xf8,
+- 0x44, 0xc7, 0x8f, 0x0a, 0x7d, 0x92, 0x21, 0x3e, 0x59, 0x55, 0xff, 0x2f,
+- 0xc3, 0xe9, 0x1a, 0x62, 0x0e, 0x4e, 0x9f, 0x40, 0x7c, 0x12, 0xbe, 0xae,
+- 0x85, 0x0a, 0xff, 0x4d, 0x20, 0x46, 0xfa, 0x68, 0xe7, 0xcb, 0x6e, 0x89,
+- 0xf4, 0xef, 0x8a, 0xfc, 0xf7, 0x39, 0xc6, 0x27, 0xa2, 0x02, 0xeb, 0x11,
+- 0x84, 0x99, 0x2a, 0xc1, 0xed, 0x16, 0xd2, 0xe7, 0xcf, 0x83, 0x8b, 0x7a,
+- 0xde, 0x53, 0x0c, 0x48, 0x1f, 0xb3, 0xe2, 0x19, 0xb1, 0xcb, 0x66, 0xbe,
+- 0x3b, 0xad, 0x0a, 0x9e, 0xc3, 0x8f, 0xf3, 0x48, 0xdf, 0x57, 0x7c, 0xa3,
+- 0x85, 0x38, 0x0e, 0x97, 0x0a, 0x3e, 0xfb, 0x53, 0x17, 0x9c, 0x64, 0xf5,
+- 0xbb, 0xd3, 0x28, 0xaf, 0x64, 0xa6, 0x45, 0xbf, 0x83, 0xfa, 0x7f, 0x4f,
+- 0x58, 0x3f, 0xea, 0x4d, 0xeb, 0xbb, 0x5f, 0xe9, 0xc3, 0x73, 0x57, 0xec,
+- 0x73, 0x0d, 0xfb, 0x5c, 0x65, 0x0f, 0xca, 0xaf, 0x00, 0xfb, 0x39, 0xaa,
+- 0xde, 0x45, 0xfa, 0xaf, 0xbe, 0xbe, 0x2e, 0xa2, 0x6f, 0xb1, 0xbc, 0xfa,
+- 0x13, 0xfb, 0x59, 0xee, 0x35, 0x25, 0xa7, 0xe3, 0x92, 0xb5, 0xd3, 0x8b,
+- 0xb4, 0x7f, 0x3a, 0xfe, 0xc8, 0x7f, 0x2b, 0xc9, 0xf2, 0xc3, 0x21, 0xfc,
+- 0x37, 0x15, 0x7f, 0x56, 0x2f, 0x9f, 0x7f, 0xdb, 0x3f, 0x1f, 0x18, 0x1f,
+- 0xc7, 0x88, 0xcf, 0x75, 0xf1, 0xe7, 0x29, 0x78, 0xd0, 0x0e, 0x89, 0x2f,
+- 0x0f, 0x21, 0xc5, 0x09, 0x62, 0xc4, 0xe3, 0x82, 0x2f, 0x09, 0x7e, 0x2e,
+- 0xb8, 0x2d, 0x08, 0xff, 0x13, 0xff, 0x1e, 0x72, 0x7e, 0x54, 0xf0, 0x01,
+- 0xe3, 0xfc, 0x9a, 0xe0, 0x23, 0x86, 0xfc, 0x71, 0x8b, 0xf1, 0x0f, 0xa1,
+- 0xe7, 0x85, 0x7e, 0xc6, 0x90, 0x8f, 0x81, 0xe3, 0x63, 0x19, 0x71, 0xfb,
+- 0x58, 0xea, 0x19, 0xf3, 0x2f, 0xf7, 0x75, 0xcd, 0x57, 0xa0, 0x38, 0xc2,
+- 0x74, 0x9a, 0xff, 0x83, 0x03, 0xf8, 0x99, 0x6d, 0xbe, 0x3e, 0x48, 0xae,
+- 0x9d, 0xb0, 0x1d, 0x57, 0x44, 0xbe, 0xd8, 0xb9, 0x3a, 0xa4, 0x7f, 0xe6,
+- 0xa2, 0x41, 0xfd, 0x52, 0x17, 0x3f, 0xbe, 0x92, 0xba, 0xdc, 0xb1, 0x9a,
+- 0x51, 0xc8, 0x79, 0xa5, 0x3c, 0x06, 0x52, 0x8f, 0x23, 0x46, 0x3d, 0x7b,
+- 0xaa, 0x9e, 0xa5, 0xae, 0xea, 0xba, 0xbe, 0xb2, 0x75, 0xc5, 0xf5, 0xe1,
+- 0x1a, 0xf5, 0x11, 0x1f, 0x12, 0x97, 0x92, 0xe1, 0xdf, 0xab, 0x09, 0x86,
+- 0x18, 0x7f, 0xb6, 0xcd, 0xb8, 0xc1, 0x18, 0xf9, 0x6e, 0x1e, 0xf1, 0x94,
+- 0xff, 0x0d, 0xeb, 0x9b, 0x04, 0x44, 0x3f, 0x6c, 0x53, 0x1f, 0xe5, 0xa1,
+- 0xed, 0x2a, 0x9b, 0xe1, 0x6e, 0xf2, 0x0e, 0xf3, 0x4d, 0x38, 0x37, 0x09,
+- 0xc3, 0x8d, 0x1b, 0xcc, 0xff, 0x5d, 0x8d, 0xed, 0x7e, 0x56, 0xe6, 0x53,
+- 0xff, 0xa7, 0xef, 0xa5, 0xff, 0x2a, 0x48, 0xff, 0x63, 0xc5, 0x5d, 0xfd,
+- 0x8e, 0xc8, 0xbd, 0xa2, 0xeb, 0x9b, 0x7f, 0xcb, 0x6e, 0x95, 0xfc, 0x7d,
+- 0xab, 0x4b, 0xe4, 0x98, 0xbf, 0x56, 0xa5, 0xdb, 0xb7, 0xbb, 0xda, 0x1f,
+- 0xe9, 0xf3, 0x69, 0xed, 0x3f, 0xcb, 0x07, 0x72, 0x6d, 0x3b, 0x3a, 0x7e,
+- 0x7c, 0x5e, 0x24, 0x3b, 0x46, 0x3b, 0x9b, 0x46, 0x3e, 0x6b, 0xf7, 0x34,
+- 0x07, 0xff, 0x4c, 0xfa, 0x73, 0x30, 0x1d, 0x1f, 0x3d, 0x07, 0x0b, 0xb0,
+- 0x74, 0xb6, 0x42, 0xf6, 0x94, 0x5d, 0x56, 0x73, 0xa1, 0xc2, 0xf8, 0x62,
+- 0x91, 0xf1, 0x97, 0x22, 0xc6, 0x2f, 0x49, 0x2e, 0x95, 0x98, 0x7e, 0x21,
+- 0x40, 0xbd, 0xa3, 0xea, 0x61, 0x2d, 0xaf, 0xed, 0x3a, 0xc8, 0x1e, 0x7c,
+- 0x5f, 0xbf, 0xa3, 0xed, 0xd0, 0xef, 0x65, 0xeb, 0x65, 0xf8, 0xbb, 0x8c,
+- 0x4d, 0x3b, 0x1b, 0x87, 0xfc, 0x2c, 0xe3, 0x46, 0x03, 0xed, 0xba, 0x9a,
+- 0xf4, 0xfa, 0xb0, 0x5e, 0x25, 0xbe, 0x29, 0x60, 0x7a, 0x51, 0xea, 0x73,
+- 0x91, 0xfa, 0xa7, 0xac, 0xae, 0x10, 0x27, 0x20, 0xa6, 0xbd, 0x60, 0x17,
+- 0xaf, 0x53, 0xbd, 0xe4, 0xe4, 0x5c, 0xe5, 0x67, 0x2a, 0xdb, 0x77, 0xbb,
+- 0x5c, 0x8f, 0x85, 0x6c, 0x1d, 0x3f, 0x9c, 0x9a, 0xaf, 0x69, 0x7f, 0xad,
+- 0x5e, 0xfd, 0xee, 0xcf, 0x53, 0x36, 0x1f, 0xb7, 0x5b, 0xda, 0x7f, 0x73,
+- 0x6f, 0x30, 0x7b, 0xdc, 0x90, 0x40, 0xcd, 0xca, 0xfd, 0x8c, 0xd9, 0x2f,
+- 0x83, 0xfa, 0xad, 0x6a, 0xf4, 0xcf, 0x11, 0xe9, 0xb7, 0x91, 0xce, 0x66,
+- 0xeb, 0xb0, 0x7e, 0x46, 0xfe, 0x2f, 0x64, 0x9e, 0x54, 0xa1, 0xb7, 0x97,
+- 0xb6, 0x91, 0x2e, 0x81, 0xf4, 0x61, 0x27, 0xce, 0x65, 0xf2, 0x70, 0x06,
+- 0x06, 0xce, 0x95, 0x0f, 0x45, 0x4f, 0x43, 0xe6, 0x8b, 0x9b, 0xda, 0x5f,
+- 0xc4, 0x5e, 0x06, 0xb2, 0xc3, 0x33, 0xe6, 0xc3, 0xdd, 0x3d, 0xdd, 0xef,
+- 0xcb, 0xee, 0x20, 0x7f, 0x3d, 0xf8, 0xcd, 0xe7, 0xfa, 0x68, 0x52, 0xbf,
+- 0x38, 0x63, 0x97, 0x77, 0x32, 0x79, 0x02, 0x38, 0xa1, 0xf7, 0x52, 0xda,
+- 0xae, 0xf4, 0x5e, 0x45, 0x7d, 0x21, 0x34, 0x67, 0xd3, 0xfb, 0xf5, 0xfd,
+- 0x44, 0xcf, 0xf5, 0x80, 0xfa, 0xa4, 0xbc, 0xaf, 0xef, 0xf4, 0x1c, 0xad,
+- 0x45, 0xe9, 0xfe, 0x1d, 0x93, 0xb9, 0x69, 0x03, 0xcf, 0xcd, 0x92, 0xe9,
+- 0xa7, 0xda, 0xb7, 0x83, 0xf3, 0xc5, 0xfe, 0xde, 0xd9, 0xbb, 0xb7, 0x39,
+- 0x7b, 0x58, 0xde, 0x8b, 0x46, 0xde, 0x6f, 0xf5, 0xe2, 0x68, 0x3b, 0x83,
+- 0xbe, 0x2b, 0x4e, 0x29, 0xbd, 0xc2, 0x2f, 0x73, 0xe1, 0x79, 0x9a, 0x77,
+- 0x67, 0x84, 0x6f, 0x2e, 0x55, 0xaf, 0x83, 0xf8, 0x62, 0xa3, 0xae, 0x0b,
+- 0xfb, 0xf8, 0xb2, 0x73, 0x4c, 0xfb, 0xb3, 0xb5, 0xc5, 0xf5, 0x71, 0x31,
+- 0xd5, 0xaf, 0xe9, 0xf9, 0x3f, 0x22, 0xf5, 0xa0, 0xf8, 0xc8, 0x8f, 0x9d,
+- 0xbd, 0xfe, 0xbe, 0x48, 0xd7, 0xd7, 0xa2, 0xd4, 0xb5, 0x3d, 0xb7, 0x49,
+- 0x7d, 0xe4, 0x35, 0x7f, 0x35, 0xf2, 0x35, 0x1b, 0x61, 0x9d, 0xbc, 0x0e,
+- 0x5d, 0xb1, 0xf3, 0x87, 0x8c, 0xbd, 0x81, 0xf4, 0xa1, 0x0b, 0x9f, 0x75,
+- 0xb5, 0x5f, 0x7c, 0x5d, 0x8b, 0x18, 0x3f, 0x8d, 0xa4, 0x9f, 0x7a, 0xfe,
+- 0xe1, 0xbb, 0x0b, 0xf2, 0x6e, 0x15, 0x3e, 0xe9, 0xed, 0x03, 0x9c, 0x6f,
+- 0x1e, 0x34, 0x64, 0x7e, 0x2e, 0xc9, 0x1c, 0xfb, 0xa9, 0xc8, 0x73, 0xb2,
+- 0xb9, 0x40, 0xf5, 0x0a, 0xe3, 0x32, 0xcf, 0x9a, 0x01, 0xd3, 0x13, 0x01,
+- 0x7f, 0x07, 0x37, 0x3c, 0x9f, 0xf8, 0x26, 0x02, 0xc6, 0xf1, 0x12, 0xca,
+- 0x85, 0xf0, 0xf3, 0x39, 0x62, 0x8f, 0xd6, 0x7d, 0xde, 0x73, 0xeb, 0x37,
+- 0x64, 0x9e, 0x54, 0x74, 0xdc, 0xc4, 0xcf, 0xc7, 0xf1, 0x7c, 0x5c, 0xcd,
+- 0x2d, 0xa6, 0xb9, 0x1e, 0xfc, 0x5e, 0xfd, 0x7f, 0x24, 0x59, 0xa9, 0x55,
+- 0xd2, 0x71, 0xd6, 0xfd, 0xf6, 0xae, 0x11, 0x5f, 0x9d, 0x9f, 0x87, 0x12,
+- 0x3d, 0xe7, 0xa7, 0xce, 0xa2, 0xbd, 0x15, 0x28, 0x7b, 0x5c, 0x3f, 0x8c,
+- 0x4a, 0x8f, 0xed, 0xa1, 0xd8, 0xb1, 0x55, 0x99, 0x9b, 0xab, 0xcb, 0xa4,
+- 0xe6, 0xdc, 0xaa, 0x3e, 0x9f, 0xa7, 0x86, 0x59, 0xdc, 0xba, 0x46, 0xe7,
+- 0xe5, 0x6e, 0x8e, 0xcf, 0xbd, 0x05, 0x1d, 0xaf, 0x0a, 0xf9, 0xdf, 0xe6,
+- 0x78, 0x3d, 0x77, 0x85, 0xf1, 0x22, 0x3c, 0x4d, 0x58, 0x6c, 0x4b, 0x9f,
+- 0xaf, 0xfb, 0x05, 0x42, 0xa0, 0x78, 0xd9, 0x8f, 0xf1, 0x7e, 0x77, 0x64,
+- 0x2f, 0x17, 0x52, 0xf9, 0x33, 0xf7, 0xe4, 0x41, 0x79, 0x3c, 0x62, 0xec,
+- 0x0b, 0xbd, 0xd7, 0x2d, 0xe3, 0xfb, 0x36, 0x30, 0xea, 0xf1, 0xe5, 0x21,
+- 0xf5, 0x08, 0x43, 0xea, 0xd9, 0x9c, 0x6f, 0x4b, 0xd2, 0xef, 0x79, 0x70,
+- 0x72, 0xb4, 0x78, 0xfd, 0xfc, 0x0a, 0xe5, 0xd5, 0x5e, 0xe5, 0xef, 0x1a,
+- 0xdf, 0x59, 0xb3, 0x28, 0x5e, 0xfe, 0x1a, 0xf3, 0xe5, 0xf9, 0x3c, 0xd4,
+- 0xf8, 0xe6, 0x0a, 0xf7, 0x95, 0x0d, 0xff, 0x01, 0xd7, 0x0e, 0x41, 0x60,
+- 0x88, 0x0d, 0x00, 0x00, 0x00 };
++ /* Date: 06/17/2008 16:52 */
++ 0xbd, 0x56, 0xcf, 0x6b, 0x1c, 0x75, 0x14, 0x7f, 0x3b, 0xbb, 0x33, 0x3b,
++ 0x99, 0x9d, 0xdd, 0x99, 0xda, 0x34, 0x4c, 0xb7, 0x2b, 0xd9, 0x86, 0x5e,
++ 0x36, 0x99, 0x62, 0xa2, 0x11, 0x0a, 0x46, 0x5b, 0x72, 0x09, 0xd8, 0x9e,
++ 0x02, 0x95, 0x22, 0x82, 0x71, 0xa9, 0x3d, 0xd8, 0x96, 0xe2, 0x5f, 0xe0,
++ 0x90, 0x9a, 0x08, 0x45, 0x0f, 0x0b, 0x36, 0x90, 0x20, 0x1a, 0x7b, 0x50,
++ 0x09, 0x0a, 0x3b, 0x07, 0x41, 0x44, 0x2d, 0xa8, 0x88, 0x60, 0x3d, 0x08,
++ 0x85, 0xda, 0x8b, 0x51, 0x8b, 0x8a, 0x07, 0x0f, 0x01, 0x8f, 0x9a, 0xf1,
++ 0xfb, 0x7e, 0x7c, 0x37, 0x33, 0x93, 0xdd, 0x24, 0x27, 0x03, 0xed, 0x87,
++ 0xf7, 0x9d, 0xf7, 0x7d, 0xdf, 0xf7, 0xde, 0xf7, 0xf3, 0x3e, 0xdf, 0xf5,
++ 0x01, 0xc0, 0x80, 0x28, 0x1e, 0x55, 0x08, 0x87, 0x8c, 0xa2, 0xad, 0xa0,
++ 0x00, 0xf0, 0x21, 0xf0, 0x9f, 0xe9, 0x92, 0x1d, 0x3d, 0x22, 0xf6, 0x04,
++ 0x43, 0x34, 0xe1, 0xab, 0xff, 0xaf, 0xc2, 0xe9, 0x26, 0x62, 0x11, 0x4e,
++ 0x1f, 0x47, 0x7c, 0x12, 0x6e, 0x37, 0x03, 0x85, 0xff, 0x26, 0x10, 0xa1,
++ 0x3d, 0xdc, 0xfd, 0x24, 0xae, 0x50, 0xfc, 0x4d, 0xd9, 0xff, 0x63, 0x91,
++ 0xf1, 0x54, 0x68, 0x73, 0x1c, 0x41, 0x38, 0xe9, 0x13, 0xdc, 0xed, 0xa0,
++ 0x7d, 0xfe, 0x3c, 0x58, 0x18, 0xe7, 0x6d, 0xe5, 0x80, 0x76, 0xa3, 0x10,
++ 0x9d, 0x94, 0xbc, 0x0c, 0xf6, 0xfb, 0xa9, 0xe3, 0xe1, 0x3a, 0xfc, 0x3c,
++ 0x8b, 0xf6, 0x51, 0xe7, 0xd5, 0x0e, 0x62, 0x00, 0x97, 0x6c, 0x97, 0xeb,
++ 0x19, 0xe5, 0xb0, 0x9b, 0xe3, 0xb8, 0x4f, 0xf9, 0x8e, 0x4b, 0x5c, 0x13,
++ 0xe3, 0xfe, 0x99, 0x70, 0x5c, 0x8c, 0x97, 0x8e, 0xd3, 0x50, 0x71, 0x70,
++ 0xdd, 0x92, 0xbc, 0xac, 0x5c, 0x5e, 0x96, 0xca, 0x43, 0xfa, 0x00, 0x3a,
++ 0x0f, 0xc4, 0x23, 0xea, 0x5c, 0x8c, 0xbb, 0x25, 0x75, 0x03, 0x3c, 0xdf,
++ 0x94, 0xf8, 0x31, 0xa2, 0x5b, 0xe0, 0x78, 0xea, 0x9f, 0xd4, 0xb1, 0x3b,
++ 0x8e, 0xee, 0x53, 0x36, 0xff, 0x72, 0xa8, 0xbf, 0xeb, 0xfb, 0xc0, 0x73,
++ 0x7e, 0x50, 0xe7, 0xa4, 0xfd, 0x61, 0x1f, 0xff, 0xef, 0x94, 0x7f, 0x36,
++ 0x2e, 0xaf, 0x7f, 0xbb, 0xb3, 0xde, 0xea, 0xd7, 0x37, 0x33, 0xd7, 0xb7,
++ 0x2f, 0xa5, 0x6f, 0x73, 0x70, 0xc2, 0x08, 0xc8, 0xaf, 0x04, 0x88, 0xc7,
++ 0x54, 0x02, 0x88, 0x0f, 0x0b, 0x5e, 0x13, 0xbc, 0x25, 0xf8, 0xae, 0xe0,
++ 0x11, 0xc1, 0x61, 0xc1, 0xc3, 0x82, 0x0f, 0x09, 0x6e, 0x09, 0xfa, 0x82,
++ 0x9e, 0x60, 0x4d, 0xf0, 0x2f, 0x41, 0x57, 0xb0, 0x92, 0x8b, 0x57, 0x17,
++ 0xb4, 0x05, 0x3f, 0x17, 0x7c, 0x22, 0xb7, 0xff, 0x68, 0x81, 0xf1, 0x81,
++ 0xd8, 0x4f, 0x89, 0x7d, 0x41, 0x6c, 0x6c, 0xa8, 0xf0, 0x3e, 0xd3, 0xaf,
++ 0x5b, 0xbd, 0xfb, 0xbd, 0xdb, 0x91, 0xef, 0x2d, 0xed, 0x67, 0x53, 0xff,
++ 0x60, 0x3c, 0xed, 0xff, 0xd6, 0x1e, 0xfe, 0xec, 0x36, 0xdb, 0xea, 0xb7,
++ 0xef, 0x66, 0xc2, 0x79, 0xbc, 0x29, 0xfb, 0x83, 0xee, 0x67, 0x03, 0xe6,
++ 0x68, 0x26, 0xcc, 0xf3, 0xab, 0xdf, 0x1c, 0x3d, 0x2e, 0x73, 0x34, 0xbd,
++ 0x8b, 0xbf, 0xcc, 0xd3, 0x33, 0xb2, 0x7f, 0x46, 0xf8, 0xd9, 0x18, 0xe0,
++ 0x17, 0xa5, 0xe6, 0x95, 0xce, 0x1b, 0x30, 0x0f, 0x1f, 0x15, 0xda, 0x61,
++ 0xc0, 0xfc, 0x89, 0xf6, 0xca, 0x0f, 0xf7, 0x0b, 0x7f, 0x5b, 0x9a, 0xc7,
++ 0x59, 0xfe, 0x32, 0x0f, 0xad, 0x1c, 0x0f, 0x5f, 0xde, 0xe7, 0x1e, 0x2a,
++ 0xb9, 0x7e, 0x5e, 0x56, 0xfe, 0x6c, 0x1a, 0x06, 0xe3, 0x1a, 0x63, 0xe8,
++ 0x5a, 0x25, 0xc4, 0x69, 0xf7, 0x1b, 0x8e, 0x37, 0x4a, 0x75, 0xb8, 0xc1,
++ 0x0a, 0xcd, 0x6d, 0x09, 0x56, 0xac, 0x21, 0x85, 0xff, 0x24, 0x6f, 0xb0,
++ 0x5f, 0xdd, 0xfc, 0x9e, 0x30, 0x58, 0xbb, 0xc3, 0xfe, 0xf7, 0x9a, 0x9c,
++ 0xf7, 0x33, 0x13, 0x90, 0xfb, 0xd3, 0xdf, 0x65, 0xde, 0x3d, 0xb4, 0xff,
++ 0x2e, 0x44, 0xb1, 0x3e, 0x47, 0xf6, 0x5d, 0xd6, 0x73, 0xc4, 0x7f, 0x8b,
++ 0x96, 0x4f, 0xf5, 0xde, 0x88, 0xc9, 0x1c, 0x76, 0x97, 0x7d, 0xfa, 0xfa,
++ 0x7a, 0xac, 0xeb, 0x11, 0x5d, 0x19, 0xd7, 0xf5, 0xf3, 0xfe, 0x2a, 0x9d,
++ 0x77, 0xb8, 0xbb, 0x9e, 0xe3, 0x49, 0xf3, 0x40, 0x3a, 0xbb, 0x95, 0xec,
++ 0xe8, 0x6c, 0xba, 0x0f, 0x5a, 0x67, 0x6d, 0x58, 0x98, 0xf3, 0xe8, 0xdc,
++ 0x9a, 0xc5, 0x61, 0x2e, 0x78, 0x8c, 0x17, 0x1d, 0xc6, 0xdf, 0x1c, 0xec,
++ 0x53, 0x92, 0x5c, 0xaa, 0xb0, 0xfd, 0x42, 0x55, 0xcf, 0xb7, 0xde, 0xaf,
++ 0xf3, 0xda, 0x2b, 0x1f, 0x3c, 0x5f, 0x9f, 0xa3, 0xf3, 0xd0, 0xe7, 0x65,
++ 0x79, 0x31, 0xf8, 0x5c, 0xc6, 0xb6, 0x91, 0xed, 0xc3, 0xda, 0x24, 0x63,
++ 0x69, 0x0a, 0xf3, 0xba, 0x9d, 0xf4, 0xe6, 0xbb, 0xe5, 0x93, 0xdf, 0x18,
++ 0xb0, 0x3d, 0x2f, 0x3c, 0x9c, 0xa7, 0xb9, 0x54, 0xba, 0x63, 0x20, 0xd6,
++ 0x21, 0xa2, 0x77, 0xc7, 0x70, 0xbe, 0x26, 0x5e, 0x14, 0x65, 0x5d, 0xdd,
++ 0xc3, 0x58, 0x76, 0x9e, 0x37, 0x99, 0x77, 0x76, 0x96, 0xaf, 0xc7, 0x84,
++ 0xaf, 0x4e, 0x77, 0xbd, 0xb3, 0xdf, 0x3c, 0x48, 0xc1, 0xbd, 0xfe, 0x6b,
++ 0x3d, 0xd4, 0xef, 0xb2, 0xd6, 0x3d, 0xfa, 0xdc, 0x8d, 0x8a, 0x99, 0x3a,
++ 0xcf, 0x40, 0xd8, 0xef, 0x7e, 0x3f, 0x16, 0x3d, 0x99, 0x16, 0x7d, 0x53,
++ 0x97, 0x18, 0x65, 0xf6, 0xd5, 0x80, 0xf2, 0x29, 0xe7, 0xe6, 0xac, 0xd4,
++ 0x9b, 0x9b, 0x45, 0x6b, 0x80, 0xde, 0x99, 0xfc, 0x7e, 0x2e, 0xcc, 0xe1,
++ 0xb9, 0x76, 0xe3, 0x06, 0xcd, 0x7f, 0x19, 0xfe, 0x70, 0xf9, 0x5e, 0xda,
++ 0x26, 0xda, 0xe6, 0xf0, 0x95, 0x4f, 0x33, 0xfd, 0x01, 0x38, 0xae, 0xdf,
++ 0x97, 0xf4, 0x1c, 0x07, 0xd0, 0x9e, 0x3a, 0xe8, 0x7b, 0x99, 0xe6, 0x7d,
++ 0x6d, 0x17, 0xef, 0xb5, 0x3e, 0x36, 0xc3, 0xf4, 0x9c, 0xe0, 0x3b, 0xc1,
++ 0xf7, 0xcd, 0xfa, 0x54, 0xc9, 0xf7, 0x41, 0xbd, 0x9f, 0xba, 0xbe, 0x7e,
++ 0xef, 0xe8, 0xaf, 0xdb, 0x07, 0xd3, 0xb3, 0x74, 0x9f, 0xfa, 0xe9, 0x99,
++ 0x93, 0xd3, 0xa7, 0x7b, 0xdb, 0x3d, 0x7d, 0x32, 0xfb, 0xd5, 0xff, 0x7f,
++ 0xe8, 0x36, 0xf7, 0xd3, 0x81, 0x74, 0x3d, 0x1b, 0x1b, 0xcc, 0x9f, 0xab,
++ 0xa9, 0x79, 0x49, 0xdf, 0xff, 0x90, 0xf0, 0x45, 0xf9, 0x51, 0x1d, 0x5f,
++ 0x6c, 0xef, 0xe8, 0x72, 0x9a, 0x7f, 0x2f, 0x0a, 0xff, 0x8d, 0x99, 0x75,
++ 0xe6, 0x47, 0xfb, 0xf7, 0xdc, 0x7d, 0x4d, 0x85, 0xc8, 0x97, 0x57, 0x20,
++ 0x96, 0x3c, 0xef, 0x67, 0xf2, 0xad, 0x8a, 0x2e, 0x95, 0xe1, 0x83, 0x58,
++ 0xd7, 0xc5, 0x9f, 0x9b, 0x21, 0xe3, 0xfb, 0xe4, 0xef, 0xef, 0xf3, 0x2e,
++ 0xf9, 0xf0, 0x5e, 0x4f, 0x7f, 0x3d, 0x8a, 0x37, 0x29, 0x3a, 0xb6, 0x20,
++ 0x7a, 0xf2, 0x8b, 0xc3, 0x7a, 0xd5, 0x3e, 0x4b, 0xfc, 0x85, 0x11, 0xd1,
++ 0x95, 0x76, 0x95, 0xed, 0x7a, 0x95, 0x7f, 0xef, 0x4e, 0x96, 0x5d, 0xf2,
++ 0xab, 0x57, 0x19, 0x47, 0x2a, 0xb8, 0x2f, 0x80, 0x07, 0xe7, 0xc8, 0x3d,
++ 0x5c, 0x75, 0xf9, 0x5d, 0x59, 0xbd, 0x23, 0x7a, 0xe7, 0xe9, 0xfe, 0x49,
++ 0xbd, 0x8f, 0xe1, 0xfa, 0x88, 0xd2, 0x0f, 0xb6, 0x99, 0x17, 0x6e, 0x6f,
++ 0x1e, 0xde, 0x91, 0xec, 0x9b, 0x5e, 0xba, 0xdf, 0x7a, 0x2e, 0x3b, 0xb9,
++ 0x3e, 0xeb, 0x7b, 0x3a, 0x95, 0x68, 0xbd, 0x1d, 0x9b, 0xc3, 0x7c, 0x3d,
++ 0xa8, 0x95, 0x99, 0x47, 0x8c, 0x2a, 0x8e, 0x51, 0xc6, 0x6d, 0x8d, 0x25,
++ 0xd1, 0xaf, 0xa5, 0x45, 0x0a, 0x73, 0x6e, 0x49, 0xaf, 0xcf, 0xd2, 0xe0,
++ 0xcc, 0x6f, 0x7c, 0x45, 0xeb, 0xb5, 0xb8, 0xc8, 0xeb, 0xe5, 0xb3, 0xba,
++ 0x5f, 0x1e, 0xd5, 0xbf, 0xc2, 0xfd, 0x7a, 0xee, 0x26, 0xe3, 0xb3, 0xf0,
++ 0x34, 0xa1, 0xb3, 0x22, 0x73, 0xbf, 0xea, 0xda, 0x84, 0x40, 0xfd, 0x32,
++ 0x1e, 0xe5, 0xf7, 0xd4, 0x94, 0x77, 0x70, 0x28, 0x75, 0x8f, 0xf9, 0xf7,
++ 0xea, 0xa0, 0xf7, 0x99, 0xd6, 0x6f, 0xfd, 0x9e, 0x16, 0x72, 0xbf, 0x5f,
++ 0xab, 0x39, 0x7e, 0xbe, 0x34, 0x80, 0x9f, 0x87, 0x06, 0xf0, 0x3b, 0xaf,
++ 0x87, 0x6d, 0x99, 0xff, 0x12, 0x98, 0x45, 0x7a, 0x08, 0xdd, 0xd2, 0x75,
++ 0xba, 0x5f, 0x63, 0x89, 0x7f, 0x4f, 0xb8, 0xe6, 0x72, 0x81, 0xfa, 0xe6,
++ 0x2e, 0xb3, 0x5f, 0x89, 0xd7, 0x03, 0x8d, 0xaf, 0x5d, 0xe7, 0x39, 0x33,
++ 0xe0, 0x3f, 0xdd, 0xd1, 0x99, 0x07, 0x78, 0x0d, 0x00, 0x00, 0x00 };
+
+ static u8 bnx2_xi_rv2p_proc2[] = {
+- /* Date: 01/27/2009 19:01 */
++ /* Date: 06/17/2008 16:52 */
+ #define XI_RV2P_PROC2_MAX_BD_PAGE_LOC 5
+ #define XI_RV2P_PROC2_BD_PAGE_SIZE_MSK 0xffff
+ #define XI_RV2P_PROC2_BD_PAGE_SIZE ((BCM_PAGE_SIZE / 16) - 1)
+- 0xad, 0x57, 0x4d, 0x68, 0x5c, 0x55, 0x14, 0xbe, 0x33, 0x6f, 0x7e, 0xde,
+- 0xcc, 0xbc, 0xc9, 0x4c, 0x93, 0x38, 0x99, 0x26, 0xc5, 0xa4, 0x09, 0x8d,
+- 0x4e, 0x9d, 0x69, 0x27, 0x3f, 0x44, 0xb0, 0x42, 0x43, 0x90, 0xb4, 0xb5,
+- 0x4a, 0xd3, 0x28, 0xc5, 0x5d, 0x92, 0xa9, 0x1d, 0x8c, 0x69, 0x23, 0x18,
+- 0x70, 0xe1, 0xc6, 0x47, 0x5a, 0xd3, 0xcd, 0x2c, 0x4c, 0x31, 0x3f, 0x8a,
+- 0xa0, 0xd8, 0x9d, 0xb8, 0x19, 0x50, 0xdb, 0x8a, 0x22, 0x14, 0x0c, 0x52,
+- 0x17, 0x45, 0xb0, 0x58, 0x37, 0x8a, 0x58, 0x1b, 0x1a, 0x11, 0x8d, 0x8b,
+- 0xae, 0x24, 0xe3, 0xbd, 0xe7, 0x3b, 0xf7, 0xcd, 0xbc, 0xc9, 0x8b, 0x89,
+- 0x62, 0x36, 0x27, 0xe7, 0xbe, 0x73, 0xcf, 0x39, 0xf7, 0x9c, 0xef, 0x7c,
+- 0xf7, 0x4e, 0x52, 0x08, 0x11, 0x10, 0x76, 0xb9, 0x5d, 0x4a, 0xe1, 0x33,
+- 0x0c, 0x53, 0x8a, 0x8a, 0x10, 0xc1, 0xb4, 0xd2, 0x85, 0x5f, 0xf0, 0xdf,
+- 0xfe, 0x24, 0x89, 0x6f, 0xcb, 0x96, 0x32, 0x13, 0x76, 0x46, 0xd9, 0x45,
+- 0xc4, 0xb3, 0xfe, 0x88, 0x94, 0x87, 0xc5, 0x68, 0x06, 0xf6, 0x01, 0xa1,
+- 0xa4, 0xb4, 0xb5, 0x95, 0xdc, 0xc5, 0xf2, 0x38, 0xcb, 0xc7, 0x7d, 0x90,
+- 0x87, 0x58, 0x3e, 0x56, 0x27, 0x05, 0xdb, 0x3d, 0xcd, 0xfa, 0x00, 0x4b,
+- 0x8b, 0xd7, 0x47, 0x59, 0xff, 0x90, 0xa5, 0xcd, 0xeb, 0x61, 0xd6, 0x1f,
+- 0xf0, 0xa9, 0x25, 0xe4, 0xab, 0xf4, 0xb5, 0x4a, 0x55, 0xb7, 0xe0, 0x3e,
+- 0x83, 0x73, 0x3c, 0xd3, 0xa1, 0xbe, 0xdf, 0xad, 0xb8, 0xed, 0xef, 0x38,
+- 0xfa, 0xac, 0xa1, 0xf4, 0x1f, 0xa5, 0xee, 0x53, 0x6a, 0x73, 0x0a, 0xdb,
+- 0x9b, 0xd3, 0x25, 0xb5, 0xdf, 0x10, 0xcb, 0xf3, 0x26, 0x55, 0x67, 0xd1,
+- 0x82, 0x6e, 0x97, 0x4d, 0xaa, 0xcb, 0xa2, 0xc5, 0xfe, 0x58, 0xee, 0x8e,
+- 0x23, 0xde, 0xa9, 0x0e, 0xd4, 0xed, 0xbb, 0x47, 0x60, 0x67, 0x27, 0x74,
+- 0x61, 0xf1, 0xbd, 0x5d, 0xf0, 0xf7, 0x29, 0xa5, 0xaf, 0xfb, 0x9a, 0x7c,
+- 0xa8, 0x47, 0x98, 0xad, 0xfc, 0x41, 0xb5, 0xbe, 0xb7, 0x7f, 0x71, 0x1e,
+- 0xf6, 0x63, 0x1d, 0x58, 0x7f, 0x30, 0xab, 0xfc, 0x85, 0x84, 0xcd, 0x52,
+- 0xe4, 0x28, 0x2f, 0x9f, 0x9d, 0x73, 0xfb, 0xff, 0x61, 0x1e, 0xda, 0x44,
+- 0x1c, 0x7e, 0xa3, 0x2e, 0xbf, 0xa9, 0x4d, 0x7e, 0x6f, 0x47, 0x6a, 0xfd,
+- 0x37, 0xf8, 0xe0, 0x3f, 0xba, 0xad, 0xff, 0x42, 0x1c, 0xb2, 0x29, 0xeb,
+- 0x15, 0x27, 0xb2, 0x4d, 0xfe, 0x2f, 0x6e, 0xeb, 0xff, 0x55, 0x27, 0x7f,
+- 0xbd, 0x5e, 0x5f, 0x3f, 0x52, 0x3f, 0xb0, 0x0f, 0xf2, 0xf6, 0xfd, 0xfa,
+- 0xdc, 0x9c, 0x9f, 0x01, 0x39, 0x98, 0x25, 0x51, 0x3a, 0xcd, 0x00, 0x1f,
+- 0xee, 0x56, 0x71, 0x1b, 0x45, 0xc0, 0xaf, 0xfc, 0x1d, 0x30, 0x43, 0xd7,
+- 0xb0, 0xfe, 0x1c, 0xf7, 0xe9, 0x79, 0x3e, 0xc8, 0x2f, 0x51, 0x55, 0x98,
+- 0x4a, 0xa5, 0x18, 0x63, 0xff, 0xdc, 0x67, 0x3b, 0x86, 0xfd, 0x2b, 0x96,
+- 0xca, 0xef, 0x86, 0xc4, 0x8d, 0x57, 0xdf, 0x8d, 0x7f, 0xe8, 0x3b, 0xf6,
+- 0xef, 0x7a, 0x08, 0x5f, 0xdf, 0x28, 0x42, 0x6f, 0xbb, 0x9c, 0xa4, 0xfa,
+- 0x2c, 0x97, 0xbd, 0x70, 0x52, 0xef, 0x5f, 0xce, 0x71, 0x02, 0x71, 0x44,
+- 0xa7, 0x49, 0xc9, 0xa1, 0xae, 0xd2, 0x26, 0xe7, 0x59, 0x27, 0xb1, 0xb8,
+- 0x4f, 0xcf, 0x05, 0xf4, 0x62, 0x88, 0x44, 0x7a, 0x62, 0x4e, 0x9d, 0x33,
+- 0x21, 0xc6, 0xfd, 0x2a, 0x61, 0x3f, 0xd7, 0xc5, 0x30, 0xad, 0x4f, 0x60,
+- 0xff, 0x45, 0xbb, 0x45, 0x67, 0x28, 0xf6, 0x61, 0x5f, 0x73, 0x2f, 0xe4,
+- 0x42, 0x6f, 0x50, 0x89, 0x6c, 0x71, 0x86, 0xd4, 0x03, 0x3f, 0xf7, 0x98,
+- 0x64, 0x67, 0xe7, 0xf4, 0xdc, 0xe9, 0xbe, 0xa9, 0x3a, 0xbd, 0x52, 0x9d,
+- 0xbf, 0x2e, 0xd4, 0xf5, 0xee, 0x3e, 0x65, 0x2f, 0x8b, 0xdb, 0x89, 0x38,
+- 0xa3, 0x93, 0x5e, 0x73, 0xfb, 0x92, 0x53, 0xdf, 0x9d, 0xf6, 0x7f, 0x90,
+- 0xea, 0x30, 0xc8, 0xf5, 0xe8, 0x60, 0x9c, 0xed, 0xf1, 0xc0, 0x59, 0x82,
+- 0xfe, 0x5f, 0x1b, 0x4a, 0x52, 0x3d, 0x4f, 0x60, 0xfd, 0xd2, 0xf0, 0x15,
+- 0xf4, 0xe3, 0x18, 0xd5, 0x41, 0x44, 0x2f, 0x7c, 0x8c, 0x5d, 0x13, 0x34,
+- 0xdf, 0xe7, 0xfa, 0x8b, 0x9f, 0x42, 0x2f, 0x18, 0x4a, 0x9f, 0xb2, 0x4e,
+- 0x5f, 0x85, 0x7d, 0xf0, 0x7c, 0x92, 0xea, 0x77, 0x82, 0xa3, 0x1c, 0x33,
+- 0x88, 0x4f, 0x4a, 0xa1, 0xf3, 0xa4, 0x5a, 0x2b, 0xf4, 0x3d, 0x29, 0x2e,
+- 0x96, 0xf1, 0x7d, 0x3a, 0xa6, 0xce, 0x37, 0xe2, 0xf0, 0xce, 0x64, 0x08,
+- 0xfb, 0x4b, 0xf3, 0xe0, 0x8d, 0x7b, 0x1f, 0x29, 0x7d, 0x2c, 0x7b, 0x0f,
+- 0xf6, 0xd9, 0xc9, 0x39, 0x76, 0xec, 0x47, 0xfd, 0xd6, 0xfc, 0xb0, 0x67,
+- 0x58, 0x46, 0x03, 0xd4, 0x3f, 0x9f, 0xb0, 0x86, 0x21, 0x5f, 0xa7, 0xef,
+- 0x7f, 0xf9, 0x4a, 0x54, 0xb7, 0x53, 0x0d, 0x81, 0x2b, 0xba, 0x3e, 0x2c,
+- 0x13, 0xfa, 0x5c, 0x90, 0x3b, 0xc5, 0xfd, 0x9c, 0xb5, 0x15, 0xde, 0xb9,
+- 0x8f, 0x99, 0xed, 0xf0, 0x0e, 0x39, 0xdc, 0x0d, 0x19, 0xea, 0x22, 0xbe,
+- 0xf8, 0x17, 0xb8, 0xe7, 0xbc, 0x36, 0xcd, 0x15, 0x56, 0xab, 0xf8, 0x24,
+- 0x21, 0x71, 0xe9, 0xc2, 0xa9, 0x9c, 0x03, 0xe2, 0x57, 0xd9, 0x07, 0x8d,
+- 0x37, 0xe5, 0x30, 0x2c, 0xa6, 0xd8, 0xef, 0x24, 0xd7, 0xe3, 0x2c, 0xd7,
+- 0xe3, 0x37, 0x96, 0xd3, 0x31, 0x5d, 0x07, 0xc8, 0x8b, 0x34, 0xff, 0x69,
+- 0x8f, 0x7b, 0x43, 0xdf, 0x0f, 0xe8, 0xcf, 0x32, 0xf7, 0xf3, 0x2d, 0xe7,
+- 0x9e, 0xd0, 0x75, 0xdd, 0xea, 0xbe, 0xd0, 0xf8, 0xc7, 0xfa, 0xe8, 0xa4,
+- 0xe7, 0x39, 0x4b, 0x5f, 0x76, 0xc2, 0x4d, 0x63, 0x17, 0xa4, 0x53, 0xdf,
+- 0x6e, 0x9a, 0xdf, 0x86, 0x96, 0xab, 0xfa, 0x7c, 0x2a, 0xcf, 0x5f, 0xf5,
+- 0xfc, 0x35, 0x2c, 0xcd, 0x92, 0x8c, 0x36, 0x5e, 0x56, 0xf1, 0x5a, 0x3d,
+- 0xf8, 0xc3, 0x3d, 0xc7, 0xf5, 0xf5, 0x9d, 0x8e, 0x13, 0xb1, 0xf6, 0xdf,
+- 0x5c, 0x75, 0xcf, 0x2b, 0xe6, 0x33, 0xec, 0xe0, 0xbb, 0x79, 0x80, 0xfb,
+- 0xc0, 0x32, 0xf5, 0xa8, 0xf2, 0x3b, 0xc2, 0x71, 0xf2, 0x1c, 0xc7, 0xaa,
+- 0xe1, 0x0b, 0x95, 0xe7, 0xfa, 0x86, 0xe6, 0x09, 0x8d, 0x8f, 0x2a, 0x5f,
+- 0xe8, 0x3e, 0x50, 0xfc, 0xec, 0xcd, 0x55, 0xb5, 0xbf, 0x6d, 0x1b, 0xfe,
+- 0x58, 0x75, 0xfc, 0xdd, 0x72, 0x78, 0x22, 0x49, 0x71, 0x0f, 0xb3, 0xea,
+- 0xe6, 0xc1, 0x3f, 0x24, 0x0f, 0xaa, 0xef, 0xa6, 0x69, 0x39, 0xf3, 0xc2,
+- 0xfc, 0x37, 0xa3, 0xe2, 0xa5, 0x39, 0xff, 0xb4, 0xbe, 0xbf, 0x64, 0xfe,
+- 0xcc, 0x93, 0x63, 0xb5, 0x7c, 0x77, 0xdb, 0x23, 0xee, 0x7f, 0xf5, 0xc7,
+- 0xf3, 0x95, 0x65, 0xbe, 0xcf, 0x51, 0x9e, 0x95, 0xf1, 0x3c, 0xe3, 0x25,
+- 0x57, 0xdf, 0x07, 0xf4, 0x15, 0xf6, 0xb2, 0xbf, 0x9a, 0xf7, 0xfa, 0xb4,
+- 0x7f, 0xa8, 0x76, 0x4f, 0xad, 0x7d, 0x7d, 0xff, 0x03, 0x5b, 0xf0, 0xf8,
+- 0xe7, 0x1b, 0x78, 0x7f, 0x7d, 0xb6, 0x51, 0x7d, 0x4f, 0x79, 0xe2, 0xc4,
+- 0x16, 0x74, 0x3f, 0x85, 0x25, 0x9e, 0xe9, 0xbd, 0x26, 0xb4, 0xbd, 0x3f,
+- 0x88, 0xf7, 0xa4, 0x60, 0xfc, 0x9e, 0x7b, 0x98, 0xfd, 0x64, 0xc0, 0xc7,
+- 0x2f, 0x9c, 0xa1, 0xfe, 0xbe, 0x79, 0xf6, 0x3e, 0xf1, 0xf2, 0x7b, 0x2f,
+- 0x5f, 0x53, 0x7e, 0x77, 0x8b, 0xd5, 0x19, 0x8b, 0xf2, 0x1a, 0xda, 0x0b,
+- 0xf3, 0xfb, 0x87, 0xea, 0xfb, 0xad, 0xfc, 0x9a, 0x8c, 0x07, 0x69, 0x37,
+- 0xe1, 0x7e, 0x97, 0x6c, 0xce, 0x13, 0x73, 0x7f, 0x24, 0x81, 0x7d, 0x9a,
+- 0xbf, 0xdc, 0xf8, 0x79, 0x77, 0xa3, 0x7a, 0xff, 0xc0, 0xcd, 0xad, 0x83,
+- 0xde, 0x73, 0x71, 0xb2, 0xaf, 0x36, 0x4e, 0x46, 0xac, 0x94, 0xe1, 0x7f,
+- 0x84, 0x79, 0x65, 0x9c, 0x13, 0xf9, 0x29, 0x9a, 0xa0, 0x78, 0x85, 0xe3,
+- 0x84, 0x6b, 0x91, 0x8a, 0xe1, 0xdc, 0x85, 0xa7, 0xf0, 0xbd, 0x10, 0xc7,
+- 0x7a, 0x6b, 0x1c, 0xef, 0xcd, 0x91, 0xb0, 0x45, 0xf6, 0xad, 0x71, 0xc8,
+- 0x14, 0xf3, 0xcf, 0x8a, 0xc3, 0xcb, 0x90, 0xcb, 0xa1, 0xad, 0x78, 0x19,
+- 0xf7, 0xdb, 0xf5, 0x90, 0x5a, 0x97, 0x8f, 0xa0, 0x0c, 0x78, 0x69, 0xa8,
+- 0xdb, 0xa2, 0xef, 0xa3, 0x19, 0xe0, 0x48, 0x74, 0x7a, 0x9f, 0xab, 0x0d,
+- 0xfc, 0xd2, 0x5a, 0xe5, 0xef, 0x5a, 0x9e, 0xb7, 0x7a, 0x97, 0x1c, 0x1e,
+- 0x75, 0xe7, 0x01, 0xfe, 0x52, 0xfe, 0x49, 0x95, 0x7c, 0xb5, 0x13, 0x7e,
+- 0x37, 0x18, 0x2f, 0xbf, 0xf3, 0xbd, 0xdf, 0x24, 0xbe, 0x2a, 0xa3, 0x0e,
+- 0x2b, 0xe5, 0xfa, 0xfe, 0xe8, 0x3c, 0x74, 0x1c, 0x9c, 0x4b, 0x9f, 0xb3,
+- 0x1a, 0x17, 0x79, 0x9d, 0xe1, 0xfc, 0xef, 0xd0, 0xfb, 0x2f, 0xc5, 0xe7,
+- 0x55, 0x7e, 0xb1, 0x7e, 0x94, 0xee, 0xa1, 0xa0, 0x7c, 0xdf, 0x6b, 0xdd,
+- 0x7d, 0x3f, 0x8c, 0x50, 0x5e, 0x8d, 0x72, 0x41, 0xef, 0x77, 0x9f, 0xbb,
+- 0x39, 0x0f, 0xb9, 0x90, 0xd7, 0x7d, 0xd3, 0xfd, 0xd5, 0xfd, 0x44, 0xdf,
+- 0x53, 0x3d, 0x64, 0xd6, 0x5f, 0xe8, 0x21, 0x9c, 0xe7, 0x0b, 0xeb, 0xee,
+- 0x77, 0xf2, 0xc9, 0xac, 0xb2, 0x7f, 0x4d, 0x7c, 0x43, 0xf3, 0x28, 0xc4,
+- 0xf7, 0x2c, 0xab, 0x7c, 0x29, 0xf8, 0xaf, 0x96, 0x77, 0x0d, 0x71, 0x3d,
+- 0xc8, 0xcb, 0x7d, 0x7a, 0xee, 0xdc, 0xf3, 0x5b, 0xad, 0xbb, 0x3a, 0xc7,
+- 0x13, 0x1e, 0xfc, 0xa4, 0xcf, 0xa9, 0xec, 0xf3, 0x8c, 0x5f, 0x53, 0x0c,
+- 0x1d, 0xc1, 0xfb, 0xb0, 0x21, 0x8c, 0x39, 0x69, 0x08, 0x7b, 0xdd, 0xef,
+- 0x12, 0x3f, 0x11, 0xfa, 0x05, 0xb3, 0xa7, 0x31, 0x42, 0xe7, 0xba, 0x74,
+- 0xe3, 0x6b, 0x32, 0x7b, 0x7f, 0x29, 0x86, 0xf5, 0x96, 0x21, 0x84, 0x09,
+- 0x10, 0xde, 0x0d, 0x71, 0x01, 0xf3, 0xf0, 0xce, 0x02, 0xe4, 0xdb, 0xe2,
+- 0x49, 0xf8, 0x69, 0x9c, 0xa5, 0xfb, 0xd4, 0x6c, 0x41, 0x79, 0x4b, 0x4b,
+- 0x8c, 0xf3, 0xb4, 0x9f, 0x7e, 0xaf, 0x56, 0x44, 0x9c, 0x7f, 0x47, 0xf0,
+- 0xbc, 0x02, 0xcf, 0x81, 0x9a, 0xbe, 0xef, 0x14, 0xdf, 0x4a, 0x8f, 0x4b,
+- 0xfc, 0xc2, 0x0d, 0xe3, 0xdc, 0xac, 0xc7, 0xb9, 0xee, 0x6f, 0xda, 0xef,
+- 0x89, 0xeb, 0x81, 0xcd, 0xb8, 0xd6, 0xf9, 0xa9, 0x3a, 0xff, 0xe9, 0xbc,
+- 0x7b, 0x37, 0xfb, 0x57, 0xfb, 0x62, 0x12, 0xdf, 0xff, 0x17, 0xae, 0x21,
+- 0x8f, 0x76, 0xa9, 0xf8, 0x2d, 0x35, 0xf8, 0xf4, 0x9e, 0x3b, 0xf0, 0x9b,
+- 0x21, 0x79, 0xfc, 0x6f, 0x6a, 0x8c, 0x09, 0xd0, 0x18, 0x10, 0x00, 0x00,
+- 0x00 };
++ 0xad, 0x58, 0x4d, 0x4c, 0x54, 0x57, 0x14, 0xbe, 0xf3, 0xc3, 0xcc, 0x30,
++ 0xbc, 0x99, 0x41, 0x98, 0x0e, 0x7f, 0xa6, 0x22, 0x28, 0x82, 0x1d, 0x14,
++ 0x06, 0xd4, 0xb6, 0x36, 0xa9, 0xc1, 0x06, 0xb5, 0xb5, 0x11, 0x69, 0x63,
++ 0xba, 0x68, 0x8a, 0x60, 0x45, 0x06, 0xc1, 0x10, 0x31, 0x2e, 0xdc, 0x74,
++ 0x02, 0x16, 0xbb, 0x98, 0x85, 0x98, 0xe2, 0x60, 0xd3, 0x18, 0x52, 0x37,
++ 0xa6, 0x3b, 0x92, 0xb6, 0x62, 0xbb, 0x30, 0x31, 0x2d, 0xb1, 0xb6, 0x89,
++ 0x36, 0xb1, 0x7f, 0x9b, 0xa6, 0xa6, 0x5a, 0x8a, 0x4a, 0x2d, 0xda, 0xb2,
++ 0xaa, 0xd0, 0x77, 0xcf, 0x77, 0xee, 0x9b, 0x37, 0x33, 0x6f, 0x44, 0x53,
++ 0xd9, 0x1c, 0xee, 0x7d, 0xe7, 0x9e, 0x7b, 0xce, 0x77, 0x7e, 0xef, 0xe4,
++ 0x0b, 0x21, 0x9c, 0x22, 0x36, 0xbe, 0x4c, 0xa7, 0x62, 0x89, 0xdd, 0xe1,
++ 0xd1, 0xc9, 0x82, 0x10, 0x39, 0xc5, 0x72, 0x2d, 0xec, 0x82, 0xff, 0x56,
++ 0xe7, 0x13, 0xb9, 0x36, 0x2e, 0xbf, 0xbb, 0xc5, 0xeb, 0x76, 0x7c, 0x77,
++ 0x0a, 0x49, 0x03, 0x42, 0xc4, 0x24, 0xcd, 0x67, 0xba, 0x9d, 0xe9, 0x4a,
++ 0x1b, 0xe8, 0x46, 0xa6, 0x51, 0xa6, 0x2b, 0x98, 0xd6, 0xdb, 0x41, 0x57,
++ 0x31, 0xad, 0xe6, 0x7d, 0x8d, 0xcf, 0xd7, 0xf2, 0xfe, 0x7b, 0x4c, 0x8f,
++ 0xf2, 0xbe, 0xa6, 0xf3, 0x29, 0xbd, 0xe4, 0x7a, 0x66, 0x41, 0xc4, 0xf4,
++ 0x33, 0x42, 0xdf, 0xae, 0x51, 0xfb, 0x1a, 0x91, 0x58, 0x0d, 0xf4, 0x7e,
++ 0xad, 0x5c, 0xf2, 0xfd, 0x61, 0xc1, 0x27, 0xf7, 0x6f, 0x2e, 0x28, 0x79,
++ 0x03, 0x0e, 0xb9, 0xfe, 0x55, 0x5f, 0xdb, 0xe4, 0x32, 0x18, 0x82, 0x98,
++ 0x60, 0x71, 0x5c, 0xca, 0x71, 0x88, 0xd1, 0x61, 0x0f, 0xa1, 0x72, 0x52,
++ 0xc3, 0x3a, 0x46, 0x78, 0xd8, 0xf4, 0x35, 0xcb, 0x63, 0x5a, 0xe2, 0xc3,
++ 0xbd, 0xbb, 0xca, 0x71, 0xdf, 0x8f, 0xcf, 0x80, 0x2f, 0x16, 0x50, 0x80,
++ 0xe2, 0xfb, 0x32, 0xc1, 0xdf, 0xf7, 0xcb, 0xf5, 0xac, 0xad, 0xd0, 0x06,
++ 0x5c, 0xdd, 0xcc, 0x65, 0xcf, 0x91, 0xfb, 0xcb, 0x1b, 0x4f, 0x0e, 0x83,
++ 0xbf, 0xad, 0x1c, 0xfb, 0x4f, 0x87, 0xa5, 0x3c, 0x97, 0x88, 0x31, 0x15,
++ 0xb5, 0xa4, 0x97, 0x2d, 0x56, 0x9b, 0x2a, 0xff, 0x97, 0x61, 0xac, 0xda,
++ 0x7d, 0x90, 0xeb, 0x4d, 0x91, 0x1b, 0xca, 0x90, 0xfb, 0x53, 0xae, 0x59,
++ 0xbe, 0xdf, 0x06, 0xf9, 0xde, 0x45, 0xe5, 0x77, 0xf8, 0x40, 0x0b, 0xc3,
++ 0x56, 0xf7, 0xe4, 0x2e, 0xa2, 0x7f, 0xf7, 0xa2, 0xf2, 0x8f, 0x18, 0xfa,
++ 0x2b, 0xff, 0xa9, 0xef, 0xe9, 0x38, 0xd2, 0xf2, 0xe3, 0xd8, 0x5a, 0x16,
++ 0xb3, 0x5a, 0xd9, 0xcf, 0x7a, 0x3a, 0x40, 0x37, 0x85, 0x89, 0xc4, 0xf7,
++ 0x70, 0x80, 0x37, 0x57, 0xc9, 0xfb, 0x0b, 0x84, 0xd3, 0x2e, 0xe5, 0xd5,
++ 0x79, 0x5c, 0xe7, 0xb1, 0xff, 0x06, 0xfb, 0xeb, 0x6d, 0x36, 0xe8, 0xa6,
++ 0x57, 0x02, 0xb4, 0xb0, 0xd0, 0x99, 0xc7, 0xf2, 0xd9, 0xdf, 0xb1, 0x3c,
++ 0x9c, 0x9f, 0xd4, 0xa4, 0x9e, 0x5f, 0xeb, 0xf1, 0x63, 0xe5, 0x7f, 0xc7,
++ 0x43, 0xfc, 0x8f, 0xf3, 0x4b, 0x56, 0xe1, 0xeb, 0xf1, 0x4e, 0xac, 0xcb,
++ 0xce, 0xe4, 0x13, 0x4e, 0xa3, 0xe3, 0x56, 0xf1, 0x92, 0x2e, 0x5f, 0xcf,
++ 0xe3, 0x00, 0xee, 0x11, 0x15, 0x1e, 0x52, 0x0e, 0xf8, 0xea, 0x3c, 0xb5,
++ 0x96, 0x38, 0x89, 0x93, 0x2b, 0xe5, 0xbe, 0x5d, 0xb4, 0x3a, 0x34, 0xba,
++ 0xa7, 0x35, 0xaa, 0xf2, 0x06, 0xdf, 0x3b, 0x5d, 0x44, 0x8a, 0xdb, 0x87,
++ 0xa4, 0xdd, 0x01, 0xb1, 0xdb, 0x1e, 0x20, 0x7e, 0xe0, 0xe4, 0xf0, 0x68,
++ 0x9f, 0x81, 0xff, 0xc2, 0x32, 0x8d, 0x6c, 0xea, 0x6c, 0xc0, 0xb9, 0x60,
++ 0x04, 0x74, 0x24, 0x92, 0x23, 0x49, 0xb8, 0xb3, 0x9f, 0x96, 0x6b, 0x7e,
++ 0xab, 0xf7, 0x10, 0x5f, 0xac, 0x56, 0xe5, 0xa5, 0xf2, 0xa3, 0xc4, 0xed,
++ 0x90, 0x91, 0x87, 0xa2, 0x12, 0x38, 0xff, 0xbe, 0x52, 0xf2, 0xeb, 0x60,
++ 0x57, 0xe0, 0x9e, 0xa4, 0x7e, 0xe6, 0xbc, 0xee, 0x35, 0xe5, 0xf5, 0xe3,
++ 0xc5, 0xc5, 0x26, 0xc2, 0x67, 0x13, 0xe3, 0x54, 0xce, 0x71, 0xb8, 0xd4,
++ 0x22, 0x0e, 0x03, 0xf4, 0xff, 0xad, 0xa6, 0x7c, 0xc2, 0x79, 0x07, 0xf6,
++ 0x4f, 0x34, 0x9f, 0x83, 0x9f, 0xb6, 0x11, 0x1e, 0xc2, 0x7b, 0xf4, 0x53,
++ 0x9c, 0x6a, 0xa7, 0xfc, 0xef, 0x6d, 0xec, 0xfc, 0x1c, 0xeb, 0x0e, 0x87,
++ 0x5c, 0xef, 0xd7, 0xf6, 0x4c, 0x80, 0x3f, 0x67, 0x10, 0xb8, 0xef, 0xe0,
++ 0x5b, 0xb6, 0x39, 0xa8, 0xde, 0xc4, 0x5d, 0x83, 0xb4, 0xd4, 0x26, 0xe9,
++ 0x7b, 0xbe, 0x38, 0x36, 0x8e, 0xef, 0x07, 0xf2, 0xa4, 0x9d, 0xaf, 0x1a,
++ 0x75, 0x29, 0xea, 0xc2, 0xf9, 0xf8, 0x30, 0xea, 0xca, 0xf4, 0x27, 0x72,
++ 0xdd, 0x16, 0x9e, 0x06, 0x7f, 0x38, 0x3a, 0xc4, 0x82, 0xed, 0xc0, 0xf1,
++ 0x96, 0x1d, 0xfc, 0x1c, 0xae, 0x5e, 0x27, 0xf9, 0xd1, 0x26, 0xb4, 0x66,
++ 0xd0, 0x77, 0xe9, 0xfb, 0xbf, 0xb6, 0x38, 0xe1, 0xb6, 0xcb, 0xef, 0x3c,
++ 0xa7, 0xf0, 0x61, 0x1a, 0x50, 0x76, 0x81, 0x3e, 0x6a, 0x3e, 0x0c, 0x69,
++ 0xd9, 0xf2, 0x80, 0xfd, 0x59, 0xb3, 0x58, 0x1e, 0x80, 0x36, 0x57, 0x81,
++ 0xba, 0x2a, 0xa9, 0x9e, 0x3c, 0x46, 0x3e, 0xb0, 0x5e, 0x19, 0xf9, 0x86,
++ 0xdd, 0x64, 0x9c, 0x12, 0xd1, 0xe3, 0x33, 0x25, 0x5e, 0x39, 0x3f, 0x96,
++ 0xeb, 0x7e, 0x50, 0x71, 0x27, 0x05, 0xba, 0xc5, 0x7e, 0x96, 0x1b, 0x65,
++ 0x3c, 0x7a, 0x18, 0x8f, 0x19, 0xa6, 0x07, 0xf2, 0x14, 0x0e, 0xa0, 0xc7,
++ 0x34, 0xdc, 0xdb, 0x1a, 0x95, 0x7e, 0x0c, 0x5a, 0xf4, 0x17, 0xd5, 0x47,
++ 0xe0, 0xa7, 0x51, 0xf6, 0xeb, 0x29, 0xa3, 0x9f, 0x28, 0x7c, 0xb3, 0xf5,
++ 0x95, 0xd4, 0x7c, 0x4a, 0xb3, 0x33, 0xfe, 0x55, 0x05, 0x8e, 0x17, 0x54,
++ 0x82, 0x1a, 0xf8, 0x56, 0x51, 0x1e, 0xfb, 0x8b, 0x26, 0x94, 0x7d, 0x52,
++ 0xbf, 0x3b, 0x2a, 0x0f, 0xfd, 0x89, 0x01, 0xa2, 0xde, 0x82, 0x33, 0xf2,
++ 0x9e, 0x52, 0x8b, 0xba, 0x92, 0x9a, 0xcf, 0xe9, 0xf8, 0x1e, 0xf0, 0x51,
++ 0xc1, 0x6d, 0xbc, 0x32, 0x95, 0x9a, 0xb7, 0xc8, 0x4f, 0xb7, 0x11, 0xdf,
++ 0xc1, 0xf5, 0xec, 0x07, 0xa6, 0xa1, 0x0d, 0x52, 0x6e, 0x0b, 0xdf, 0x53,
++ 0xc7, 0xf7, 0x68, 0xa6, 0xba, 0x21, 0xf5, 0xfc, 0x73, 0x5e, 0xd5, 0x0b,
++ 0x15, 0x1f, 0xc9, 0xba, 0xa1, 0xfc, 0x40, 0xf7, 0x87, 0xaf, 0x4c, 0xc9,
++ 0xf3, 0x65, 0x8b, 0xd4, 0x91, 0x1b, 0x86, 0xbc, 0xef, 0x8d, 0x3a, 0x21,
++ 0xbf, 0xe7, 0x89, 0x17, 0x79, 0x99, 0x5a, 0x0f, 0xff, 0xd2, 0xeb, 0x21,
++ 0xd9, 0xe1, 0xd1, 0xce, 0x71, 0xfd, 0xeb, 0x97, 0xf7, 0x14, 0xb3, 0xde,
++ 0xc5, 0xaa, 0xaf, 0xe9, 0x7a, 0x73, 0x9d, 0x6c, 0x33, 0xd7, 0xbb, 0x1f,
++ 0xe6, 0x93, 0x75, 0x4b, 0xae, 0xaf, 0xcd, 0x67, 0xce, 0x27, 0x96, 0xb8,
++ 0xc6, 0x44, 0x00, 0x73, 0x58, 0x2c, 0x20, 0xcf, 0xe5, 0xd8, 0x32, 0xeb,
++ 0x5f, 0xba, 0x1d, 0xc0, 0xa5, 0xdd, 0xee, 0x23, 0xbe, 0xeb, 0x7d, 0xf2,
++ 0xdc, 0xb4, 0x50, 0xf6, 0xa2, 0x0e, 0x96, 0x73, 0xbf, 0x5f, 0xca, 0x7a,
++ 0xeb, 0xf2, 0x6a, 0x29, 0x1f, 0x3c, 0xd7, 0xfb, 0xcc, 0x7a, 0x5f, 0x98,
++ 0xcf, 0x7e, 0x9f, 0x75, 0x1c, 0xf4, 0x71, 0x9f, 0xe5, 0x39, 0xc1, 0xb3,
++ 0xe7, 0x0b, 0xa5, 0x17, 0xdf, 0x1f, 0x50, 0x7a, 0x68, 0xe4, 0xa7, 0xa9,
++ 0x7e, 0x29, 0xa7, 0x50, 0x70, 0xd8, 0x88, 0xde, 0x6a, 0xd4, 0xdf, 0x99,
++ 0xbd, 0xb0, 0xa3, 0xb7, 0x4a, 0xea, 0xa1, 0x7b, 0x25, 0x86, 0x3c, 0x17,
++ 0xdc, 0x8f, 0xbe, 0x1c, 0xb6, 0xf2, 0xeb, 0xb7, 0xcc, 0x17, 0x64, 0xfb,
++ 0xf2, 0xd9, 0xbe, 0xb0, 0x48, 0xaf, 0xf3, 0x6d, 0xe5, 0xd4, 0x0f, 0x98,
++ 0xef, 0x05, 0xd5, 0x0f, 0x74, 0x3e, 0xc2, 0x99, 0xe5, 0x58, 0xe1, 0x64,
++ 0x25, 0x67, 0x82, 0xe3, 0xa0, 0x8b, 0xf9, 0x9c, 0x59, 0xe7, 0x9b, 0xb9,
++ 0x55, 0xd4, 0x57, 0x4e, 0x1f, 0xa1, 0xfe, 0xe0, 0x33, 0xe2, 0x34, 0xd5,
++ 0x8e, 0xe3, 0x4f, 0x10, 0x77, 0x9a, 0xff, 0xc4, 0x3e, 0x7f, 0x36, 0x7c,
++ 0x9d, 0x72, 0x7b, 0x6c, 0x76, 0x42, 0xf9, 0x47, 0x23, 0x7b, 0xa7, 0xfa,
++ 0xd5, 0x9c, 0x6f, 0xc6, 0xdd, 0x6e, 0xc2, 0x1d, 0xfc, 0x98, 0xef, 0xfe,
++ 0x0f, 0xde, 0x56, 0xf3, 0x41, 0x9f, 0x91, 0x9f, 0x03, 0x2e, 0xab, 0xfa,
++ 0xbf, 0xd6, 0x88, 0x97, 0x83, 0x3c, 0xe7, 0xcd, 0x69, 0xf4, 0x4f, 0x64,
++ 0x26, 0x4e, 0x4b, 0xad, 0xe4, 0xac, 0xe4, 0x5b, 0x1d, 0x39, 0xc8, 0x76,
++ 0x5d, 0x76, 0xc0, 0xee, 0xae, 0xbd, 0x58, 0x5f, 0xe1, 0x7a, 0x7d, 0x8f,
++ 0xeb, 0xe3, 0x4e, 0x0f, 0xe8, 0x4c, 0x35, 0xe1, 0x11, 0x39, 0x78, 0x5e,
++ 0xc9, 0x27, 0xb9, 0xda, 0x1c, 0xe3, 0xf9, 0x92, 0x83, 0xed, 0xac, 0x20,
++ 0x3f, 0x46, 0xee, 0x52, 0x3d, 0x70, 0x8a, 0xa6, 0xe5, 0x92, 0x96, 0xe8,
++ 0xb8, 0xb1, 0x3e, 0x1b, 0x41, 0x5b, 0xd5, 0x80, 0x5f, 0x93, 0xee, 0x67,
++ 0x6c, 0xbb, 0x2a, 0xf8, 0x7c, 0x3b, 0xd6, 0x6e, 0xae, 0x67, 0x09, 0xd6,
++ 0xeb, 0xfd, 0x6a, 0x50, 0x7f, 0x0d, 0xe6, 0x84, 0x29, 0xea, 0x0b, 0x81,
++ 0x48, 0xff, 0x04, 0xec, 0xe9, 0xd9, 0x0c, 0x7b, 0xef, 0x33, 0x0e, 0x4c,
++ 0xfd, 0xa7, 0x06, 0xa9, 0xef, 0xf8, 0x87, 0x30, 0x67, 0xf8, 0x5d, 0x83,
++ 0xb0, 0xa3, 0x67, 0x0e, 0xeb, 0xfb, 0xcf, 0x81, 0xfe, 0xf3, 0x3c, 0xce,
++ 0x1d, 0x3a, 0xc2, 0xf8, 0x6c, 0xb6, 0x3e, 0xd7, 0xf5, 0x37, 0xf8, 0x7a,
++ 0xab, 0xe5, 0xfd, 0x6f, 0x8d, 0xf1, 0xfc, 0x21, 0xa2, 0x34, 0xef, 0xbc,
++ 0xa9, 0xcd, 0xf1, 0xba, 0x9b, 0xfb, 0xe2, 0x6d, 0x9e, 0x17, 0x7a, 0xd2,
++ 0xe6, 0x85, 0x69, 0xd4, 0xe9, 0xb1, 0xb9, 0xb8, 0xdc, 0xd0, 0xeb, 0x65,
++ 0xae, 0x95, 0x7f, 0x7d, 0x91, 0x22, 0xf6, 0x5b, 0x70, 0x1d, 0xe8, 0xc8,
++ 0x3a, 0xf4, 0xeb, 0x9e, 0xc3, 0x8c, 0x4f, 0x23, 0xf9, 0x69, 0xcd, 0xec,
++ 0x44, 0xfa, 0x79, 0x19, 0x3f, 0xed, 0xf3, 0x78, 0x3f, 0x6e, 0xd6, 0xa9,
++ 0xba, 0x0f, 0xe7, 0x3a, 0xe8, 0x7d, 0x71, 0xcf, 0x98, 0x3f, 0xa7, 0x49,
++ 0xff, 0xb2, 0xb1, 0x39, 0x92, 0x53, 0x2a, 0x0a, 0x29, 0x0e, 0x4b, 0xfc,
++ 0xb3, 0xb0, 0x27, 0x92, 0x60, 0x1c, 0xfa, 0x9e, 0x05, 0x3d, 0xcc, 0x71,
++ 0xa0, 0xfc, 0x7b, 0x75, 0x83, 0x46, 0xe7, 0xa6, 0xfa, 0x71, 0x8f, 0xca,
++ 0xa3, 0xf4, 0xb9, 0x58, 0xc5, 0x45, 0x49, 0x03, 0xad, 0x45, 0xd7, 0x21,
++ 0xb2, 0x53, 0xf7, 0xa7, 0x8c, 0x27, 0x1d, 0x2b, 0xee, 0xdb, 0xa9, 0xf1,
++ 0x22, 0xe3, 0x49, 0xc5, 0xad, 0x39, 0xce, 0xcc, 0x71, 0x94, 0x1a, 0x3f,
++ 0x7e, 0xea, 0x2f, 0x7a, 0x31, 0xa0, 0x77, 0x89, 0x2b, 0x92, 0x18, 0x7e,
++ 0x38, 0x8e, 0xa7, 0x80, 0x63, 0x84, 0xf5, 0xd6, 0xa2, 0x34, 0x8f, 0x3e,
++ 0x25, 0x86, 0xd8, 0x9f, 0xd3, 0xd5, 0x9c, 0xff, 0x15, 0xf0, 0x67, 0xdf,
++ 0x0a, 0xe8, 0xd3, 0xc7, 0x79, 0x74, 0x87, 0xe7, 0x0c, 0xc4, 0x81, 0x5b,
++ 0xeb, 0x9c, 0x60, 0xbf, 0x73, 0x3c, 0x76, 0x33, 0x0e, 0xb7, 0x81, 0x83,
++ 0xa6, 0x70, 0x88, 0x1a, 0x38, 0xa8, 0x7a, 0x63, 0x96, 0x53, 0xa0, 0xc7,
++ 0x93, 0xa4, 0x4b, 0xb4, 0xab, 0x34, 0x8f, 0xe5, 0xb0, 0xdd, 0x3a, 0x5f,
++ 0x83, 0xb4, 0xcf, 0xcf, 0xf6, 0xf9, 0xc4, 0xbe, 0x35, 0xe6, 0x73, 0x79,
++ 0x7c, 0xce, 0xab, 0x9f, 0xc3, 0x3e, 0xf2, 0x55, 0xcb, 0x82, 0xaf, 0xc4,
++ 0x51, 0xc9, 0x4d, 0xcf, 0x4b, 0x33, 0x9e, 0x54, 0xa9, 0xe9, 0x0f, 0xf5,
++ 0x48, 0xf7, 0x1b, 0xd5, 0x2d, 0xcd, 0xa8, 0x43, 0xf7, 0xa8, 0xae, 0x7b,
++ 0x4f, 0xf7, 0xa2, 0x6e, 0x9c, 0xee, 0x3d, 0xcb, 0x7d, 0x98, 0x71, 0x69,
++ 0xa1, 0xf7, 0x83, 0x8e, 0x5d, 0x45, 0x6a, 0x1d, 0x4a, 0xd5, 0xa3, 0xcc,
++ 0xa4, 0x87, 0xba, 0x77, 0xb1, 0x39, 0x01, 0x73, 0xea, 0x16, 0x9a, 0x13,
++ 0x3c, 0xc6, 0xbc, 0x9d, 0xda, 0x4f, 0x26, 0x1f, 0x3c, 0x6e, 0x3f, 0xd9,
++ 0xd9, 0x60, 0xbe, 0xaf, 0x46, 0x4c, 0x8e, 0xe3, 0x9e, 0x16, 0xee, 0xdf,
++ 0xbb, 0x39, 0xcf, 0xaf, 0x7b, 0x03, 0x74, 0x6f, 0xc7, 0x2b, 0x64, 0xaf,
++ 0x08, 0xe5, 0xc1, 0xbe, 0x8e, 0xed, 0xf8, 0xde, 0xe1, 0xc3, 0x7e, 0xa9,
++ 0x0f, 0xbf, 0xa3, 0xb4, 0xb8, 0x35, 0xe2, 0x2f, 0xf5, 0x81, 0x86, 0xb8,
++ 0x3e, 0x4c, 0x1a, 0xef, 0x09, 0xd0, 0x51, 0x57, 0xb6, 0xf7, 0x04, 0xde,
++ 0x65, 0x17, 0x5d, 0xa8, 0x1f, 0xa2, 0x06, 0x73, 0x74, 0x53, 0x95, 0x46,
++ 0xdf, 0x5b, 0x6b, 0xd0, 0xa7, 0x51, 0x9f, 0x33, 0xed, 0x2a, 0x43, 0xbc,
++ 0x96, 0x26, 0xdf, 0x1d, 0xe6, 0xf7, 0x89, 0x16, 0x49, 0x18, 0xf3, 0x7f,
++ 0xaa, 0x1e, 0xc8, 0x33, 0x29, 0x9f, 0x96, 0xfa, 0x9c, 0xfd, 0x28, 0xef,
++ 0x12, 0x07, 0xcf, 0x6d, 0x77, 0xf9, 0x77, 0x82, 0x42, 0x71, 0x69, 0x1c,
++ 0x38, 0x4c, 0x8e, 0x5b, 0xe5, 0xb1, 0xd4, 0x43, 0xdd, 0x03, 0xbb, 0x94,
++ 0x9d, 0xc9, 0x7b, 0xa1, 0xd7, 0x5e, 0xd6, 0xff, 0x06, 0xfd, 0x9e, 0x11,
++ 0x62, 0x7b, 0xa5, 0x5c, 0xec, 0x6f, 0xa5, 0xf7, 0x53, 0x8e, 0x88, 0x19,
++ 0xeb, 0xd4, 0x77, 0x4d, 0x0b, 0xe9, 0x55, 0xc0, 0xfd, 0x3d, 0x64, 0x9a,
++ 0x43, 0xc0, 0x1f, 0xac, 0x03, 0x1d, 0xa9, 0x53, 0x7e, 0x53, 0xfe, 0x55,
++ 0xfe, 0x84, 0xdf, 0x43, 0xf5, 0xc4, 0xd6, 0xd8, 0x51, 0x4f, 0x09, 0x5f,
++ 0xd7, 0x31, 0xab, 0xfa, 0x3d, 0xce, 0xef, 0x0c, 0x4b, 0xfe, 0x77, 0xc4,
++ 0x77, 0x61, 0x34, 0xd8, 0x9f, 0x99, 0x26, 0xe7, 0x7c, 0xc1, 0x7f, 0xe6,
++ 0xf7, 0x82, 0x43, 0x5c, 0xcc, 0xe1, 0xed, 0x06, 0x35, 0xff, 0x66, 0x7b,
++ 0xf7, 0x48, 0x3b, 0xba, 0x1f, 0xa4, 0xcf, 0xd3, 0xc9, 0x79, 0x58, 0xd9,
++ 0x2b, 0xcf, 0xd5, 0x71, 0x1c, 0x7b, 0x44, 0xd3, 0x16, 0xfc, 0xce, 0xe1,
++ 0x77, 0x23, 0x6f, 0xfc, 0x6e, 0xab, 0xf7, 0xa9, 0x1e, 0x47, 0xb9, 0x54,
++ 0x30, 0x96, 0x16, 0xe4, 0x92, 0x7d, 0x27, 0x2e, 0x7f, 0x43, 0x6c, 0x1f,
++ 0x25, 0xf2, 0xb0, 0x5f, 0xd4, 0x84, 0x6b, 0x9c, 0x14, 0xf7, 0x0e, 0x71,
++ 0x14, 0x79, 0xf1, 0xe1, 0x08, 0xe8, 0x07, 0xe2, 0x65, 0xc8, 0x29, 0x18,
++ 0xa0, 0xbe, 0xea, 0x29, 0x02, 0xcc, 0xf1, 0x04, 0xc7, 0x7b, 0xb1, 0x9d,
++ 0x7e, 0x87, 0x5d, 0x10, 0x3e, 0xfe, 0x9d, 0x8c, 0xf3, 0x17, 0x71, 0xed,
++ 0x34, 0xf9, 0xff, 0x51, 0xe3, 0x1c, 0xfd, 0x33, 0xc1, 0x7e, 0xe7, 0x78,
++ 0xf7, 0xa4, 0xc7, 0xbb, 0xc2, 0xa9, 0xd8, 0x6e, 0x19, 0xdf, 0xeb, 0x33,
++ 0xe3, 0x5b, 0xe9, 0x97, 0xda, 0x3f, 0x33, 0xe5, 0xe3, 0x1d, 0x75, 0xe9,
++ 0x89, 0xc5, 0x37, 0xe8, 0xd6, 0x4a, 0x79, 0x7f, 0x51, 0xc6, 0xbc, 0x9c,
++ 0x9e, 0x7f, 0xa8, 0x77, 0xd5, 0x7a, 0x3c, 0xfc, 0x07, 0xd7, 0x0d, 0x36,
++ 0x4f, 0xf0, 0x16, 0x00, 0x00, 0x00 };
+
+ static u8 bnx2_TPAT_b09FwText[] = {
+- 0xbd, 0x58, 0x5d, 0x6c, 0x1c, 0x57, 0x15, 0x3e, 0x73, 0xe7, 0xee, 0xee,
+- 0x78, 0xb1, 0xe3, 0x71, 0x3b, 0xa4, 0xdb, 0x62, 0xc8, 0x8c, 0x7d, 0xfd,
+- 0x03, 0xb6, 0xc2, 0x94, 0x6e, 0xdb, 0xad, 0x18, 0x45, 0xc3, 0xec, 0xda,
+- 0xb1, 0xa2, 0x3c, 0xb8, 0x52, 0xa4, 0x46, 0x6a, 0x04, 0x66, 0x1d, 0x93,
+- 0x3e, 0xa6, 0x88, 0x07, 0xa4, 0x3e, 0x64, 0x59, 0x3b, 0xa9, 0x1f, 0x96,
+- 0x2c, 0xb8, 0xc8, 0x7e, 0x41, 0x28, 0x72, 0x6a, 0xbb, 0x48, 0x8b, 0x37,
+- 0x11, 0x48, 0x3c, 0x45, 0x8d, 0x1c, 0x14, 0x55, 0xea, 0x0b, 0x0f, 0xfc,
+- 0x3d, 0x46, 0x6a, 0x45, 0xfb, 0x50, 0x90, 0x55, 0xa9, 0xa8, 0x82, 0xe0,
+- 0xcb, 0x77, 0x66, 0x67, 0x9c, 0x4d, 0xec, 0x08, 0x9e, 0xb0, 0xb4, 0xba,
+- 0x33, 0x73, 0xef, 0x39, 0xf7, 0xdc, 0x73, 0xbe, 0xef, 0x9c, 0x73, 0x3d,
+- 0x64, 0x50, 0x9e, 0x92, 0xbf, 0x3e, 0xfc, 0x8a, 0xdf, 0xbd, 0xf8, 0x83,
+- 0x67, 0x8f, 0xbf, 0x70, 0x1c, 0x8f, 0xcf, 0x1b, 0xfd, 0x59, 0x49, 0xff,
+- 0xc7, 0x3f, 0x93, 0xc8, 0x4e, 0xed, 0xe0, 0x1f, 0x59, 0x22, 0xb8, 0xfd,
+- 0x54, 0xa4, 0xc8, 0x32, 0x83, 0xdf, 0x7c, 0x6d, 0x5e, 0x11, 0x85, 0xad,
+- 0x09, 0xb7, 0x4c, 0xff, 0xd6, 0x35, 0x47, 0x12, 0x7f, 0xff, 0x72, 0x70,
+- 0xff, 0xeb, 0xb7, 0x5e, 0xf4, 0x76, 0xaf, 0x99, 0x64, 0xd9, 0xc1, 0xb2,
+- 0xb4, 0x47, 0xc9, 0x1a, 0x84, 0xcc, 0xcf, 0xc7, 0xbe, 0x2d, 0xe8, 0x48,
+- 0xaa, 0xab, 0xa6, 0x85, 0xba, 0xa7, 0x6f, 0x8d, 0x29, 0xbb, 0x8e, 0x0d,
+- 0x6e, 0xb4, 0x5d, 0x8a, 0xda, 0x05, 0x7a, 0xb7, 0xed, 0xd0, 0xcd, 0xb6,
+- 0xa4, 0x85, 0xb7, 0x2e, 0xd1, 0x92, 0xef, 0x15, 0x2a, 0xa6, 0x45, 0x22,
+- 0xf0, 0x0a, 0x55, 0x72, 0x69, 0xc3, 0xf7, 0x6a, 0x73, 0xe6, 0x80, 0x61,
+- 0x05, 0x16, 0xbd, 0x31, 0x26, 0xe8, 0x9a, 0x73, 0x8e, 0xbe, 0xa7, 0xce,
+- 0xe2, 0x27, 0x49, 0xac, 0x48, 0xa3, 0xbc, 0x26, 0x49, 0xae, 0xf4, 0xd3,
+- 0x49, 0x5f, 0xeb, 0x79, 0x3f, 0x84, 0xfc, 0xf0, 0xf8, 0x05, 0xea, 0xa1,
+- 0x9a, 0xed, 0xcd, 0x10, 0x65, 0x78, 0x0d, 0x45, 0x7e, 0x86, 0x42, 0xbb,
+- 0x73, 0xae, 0x6b, 0xf1, 0x78, 0x5f, 0x6f, 0x40, 0xbe, 0x47, 0xa5, 0xf3,
+- 0x4f, 0x24, 0xf3, 0x76, 0x32, 0x2f, 0x48, 0xac, 0x7a, 0xee, 0x16, 0x8d,
+- 0x84, 0xd2, 0xd8, 0xd3, 0x91, 0x3a, 0x6a, 0x47, 0x5b, 0x92, 0xcc, 0x15,
+- 0xb6, 0x5f, 0xd9, 0x65, 0xd2, 0x90, 0x31, 0x59, 0x46, 0x8a, 0xe0, 0xfb,
+- 0x88, 0xdb, 0x48, 0x28, 0x0c, 0xa2, 0x9d, 0x46, 0xc1, 0x8e, 0xda, 0x3f,
+- 0x34, 0xa2, 0xe6, 0x9e, 0x0e, 0x65, 0x9e, 0x84, 0x0a, 0x8d, 0x68, 0x8b,
+- 0x75, 0xf5, 0x90, 0x54, 0x39, 0xc8, 0x0c, 0xdb, 0x82, 0x78, 0x8c, 0x92,
+- 0xef, 0xac, 0xbb, 0x82, 0xe7, 0x69, 0x23, 0xdc, 0x92, 0x46, 0xb4, 0x36,
+- 0x83, 0x67, 0x0b, 0xf2, 0xf0, 0x8b, 0x6f, 0x50, 0x38, 0x6b, 0x40, 0x8e,
+- 0xcf, 0x69, 0xe3, 0x5d, 0x50, 0xe8, 0xd8, 0xb4, 0x58, 0xf4, 0x0a, 0x35,
+- 0x3a, 0x65, 0x94, 0xb7, 0x0e, 0x04, 0xcd, 0x9e, 0x69, 0x1f, 0xfc, 0xc6,
+- 0xb6, 0x7c, 0x4b, 0x6a, 0x2d, 0x9e, 0xcd, 0x25, 0x67, 0x64, 0x7d, 0x61,
+- 0xc7, 0x7e, 0x87, 0xdf, 0x61, 0x73, 0x13, 0xb6, 0xb7, 0xb2, 0xb0, 0x47,
+- 0x6b, 0xde, 0x27, 0x52, 0x65, 0xd8, 0x19, 0xe2, 0xe7, 0x2d, 0x57, 0x01,
+- 0x85, 0xa1, 0xd5, 0x3e, 0x72, 0x07, 0xb4, 0xae, 0xf8, 0x9e, 0xbd, 0x45,
+- 0x01, 0x2d, 0x36, 0x07, 0xed, 0xa9, 0x66, 0x1d, 0xf3, 0x35, 0x5e, 0x03,
+- 0x7f, 0x10, 0x4d, 0xb5, 0xb4, 0xde, 0xf4, 0x7f, 0x9b, 0xa1, 0x23, 0x62,
+- 0x32, 0x43, 0x9e, 0x1b, 0xe2, 0xdb, 0xd0, 0xe6, 0xa3, 0x3e, 0x3b, 0x96,
+- 0xd8, 0xc0, 0x7e, 0xc7, 0x3e, 0xfe, 0x97, 0x92, 0xf7, 0x5e, 0x3b, 0x5a,
+- 0x4b, 0xfd, 0x1c, 0xdb, 0x0d, 0xbf, 0xfa, 0x14, 0x15, 0x61, 0xff, 0x63,
+- 0xcf, 0x94, 0xca, 0xb1, 0x2d, 0x6c, 0x37, 0xd6, 0xab, 0x07, 0x36, 0xbd,
+- 0x7a, 0xc0, 0x26, 0xb6, 0x47, 0x90, 0x5c, 0xb5, 0x68, 0x49, 0x7d, 0x64,
+- 0xd0, 0x11, 0xad, 0x97, 0x7c, 0x69, 0x54, 0xd6, 0x3e, 0x4b, 0x9e, 0x81,
+- 0xc3, 0x26, 0x70, 0xd8, 0x04, 0x2e, 0x9b, 0x64, 0x8b, 0xc0, 0xa5, 0x5b,
+- 0x63, 0x16, 0xdd, 0x33, 0x11, 0xcf, 0x36, 0xcf, 0xe7, 0xa8, 0xee, 0x2b,
+- 0xba, 0xdc, 0x64, 0xcf, 0xe4, 0x68, 0x51, 0x7d, 0xae, 0xcf, 0xc3, 0x1f,
+- 0x6f, 0x93, 0x3e, 0x16, 0x01, 0xb3, 0x11, 0xdc, 0xf9, 0x86, 0x1a, 0xa7,
+- 0xcb, 0x6d, 0x45, 0xf5, 0x36, 0xcb, 0x2d, 0x51, 0x47, 0xae, 0x1f, 0x72,
+- 0x93, 0x90, 0x2b, 0xd2, 0x95, 0x58, 0xb6, 0x1f, 0xb2, 0xbb, 0x89, 0xec,
+- 0x44, 0x61, 0x9a, 0x7c, 0xc8, 0x0c, 0xbb, 0xd3, 0xc0, 0xdc, 0x9c, 0x33,
+- 0x09, 0xd9, 0x49, 0x5a, 0xc2, 0xaf, 0xde, 0xa4, 0x9a, 0x2c, 0xb2, 0x5e,
+- 0xaf, 0x70, 0x9e, 0x7d, 0x1e, 0xeb, 0xac, 0x41, 0xa7, 0x83, 0x39, 0x0b,
+- 0x7a, 0x24, 0xc6, 0x0f, 0x75, 0xbd, 0x09, 0x6c, 0x3b, 0xfc, 0xfc, 0xae,
+- 0x16, 0x01, 0xfc, 0x50, 0x54, 0x6e, 0x9d, 0xf8, 0x3d, 0x4b, 0x65, 0xc4,
+- 0x52, 0xa8, 0x7e, 0xaa, 0xda, 0x86, 0x21, 0x02, 0x93, 0xaa, 0xf0, 0x42,
+- 0x38, 0x2b, 0xe3, 0x6f, 0x73, 0xb6, 0x01, 0x8e, 0x1d, 0x17, 0x9d, 0x9c,
+- 0x93, 0xc1, 0x1a, 0xc4, 0x5f, 0xf5, 0x52, 0xd5, 0x19, 0xc0, 0x5a, 0x10,
+- 0x2d, 0x3f, 0x02, 0x8e, 0x0e, 0x60, 0x0d, 0x8f, 0x1c, 0x07, 0xac, 0x57,
+- 0xbc, 0xbe, 0x17, 0x36, 0xa6, 0xdf, 0x7a, 0xa9, 0xf6, 0x50, 0x7c, 0xd8,
+- 0xc6, 0x38, 0x2e, 0xd8, 0x5f, 0x26, 0xb1, 0xed, 0x8e, 0x57, 0x3a, 0x6f,
+- 0x63, 0x7e, 0xe7, 0xab, 0x82, 0x76, 0xf5, 0x75, 0x15, 0x15, 0xf0, 0xe9,
+- 0xf3, 0x8a, 0x0a, 0x07, 0xcc, 0x18, 0x4b, 0x29, 0xa6, 0x78, 0xe4, 0x7c,
+- 0x43, 0x85, 0x79, 0x65, 0x98, 0x4b, 0x93, 0x4f, 0x52, 0xcd, 0xf1, 0xfc,
+- 0x32, 0x15, 0x68, 0xa9, 0x39, 0x01, 0xdf, 0xf5, 0xe3, 0xdc, 0x9e, 0x4f,
+- 0x34, 0x8c, 0xe7, 0xf0, 0x69, 0xc8, 0x20, 0x5f, 0xd4, 0xa0, 0x8b, 0xc7,
+- 0x41, 0xe8, 0xf7, 0x60, 0x23, 0xfc, 0xa1, 0x26, 0xec, 0x29, 0xf8, 0x23,
+- 0x74, 0x78, 0x8e, 0xf3, 0x98, 0xf3, 0x4c, 0xa4, 0x3c, 0xbf, 0x1a, 0xdb,
+- 0xe2, 0xd9, 0xb7, 0x89, 0xf3, 0x51, 0x9a, 0x83, 0x38, 0x27, 0x59, 0x73,
+- 0x32, 0xa0, 0xd9, 0x7a, 0xe3, 0x92, 0x36, 0x15, 0xcd, 0x65, 0x03, 0xc6,
+- 0x6e, 0x6f, 0x09, 0x58, 0x9c, 0xad, 0xb7, 0x06, 0x4f, 0xef, 0x34, 0xa8,
+- 0xf6, 0x4c, 0x20, 0x8e, 0x0a, 0xec, 0x1f, 0xf9, 0xcc, 0x29, 0xec, 0xd5,
+- 0x1e, 0x3c, 0x7d, 0xa7, 0x71, 0x0c, 0xbe, 0xa2, 0xfb, 0xf0, 0x3f, 0xf6,
+- 0xdf, 0x79, 0xda, 0x84, 0x9d, 0x1c, 0x33, 0x70, 0x2b, 0x7c, 0x75, 0xcc,
+- 0x00, 0x96, 0xf1, 0x0c, 0x6c, 0xd4, 0xda, 0x83, 0x73, 0x22, 0xa8, 0x51,
+- 0xd8, 0x5e, 0xc2, 0xcf, 0xa2, 0xa9, 0x86, 0x65, 0xdd, 0x81, 0x4e, 0x51,
+- 0xf4, 0xdc, 0xc8, 0xdc, 0x65, 0xae, 0xf0, 0x39, 0x58, 0x97, 0x65, 0x04,
+- 0xae, 0x1c, 0x6a, 0xf5, 0xbc, 0x22, 0x82, 0x00, 0x98, 0x90, 0x88, 0x4d,
+- 0x11, 0x58, 0xe1, 0x38, 0x5c, 0x45, 0x1c, 0x80, 0x03, 0xd8, 0x0c, 0xff,
+- 0xd7, 0x44, 0x70, 0x91, 0x2a, 0x45, 0xa2, 0xc5, 0x06, 0x61, 0x3f, 0xec,
+- 0x55, 0xc2, 0x0f, 0x78, 0x0e, 0xed, 0x12, 0x6c, 0xf0, 0xc2, 0x1a, 0x79,
+- 0xfe, 0x1c, 0xbc, 0x9e, 0xfb, 0x31, 0x59, 0x99, 0xe0, 0x9c, 0xdc, 0x68,
+- 0x90, 0x25, 0x83, 0xb3, 0x72, 0xa9, 0x31, 0xec, 0xff, 0x15, 0xbe, 0x26,
+- 0xf2, 0xc6, 0x37, 0x69, 0xc2, 0xdf, 0x04, 0x6f, 0xeb, 0xf8, 0x5d, 0x21,
+- 0xde, 0xfb, 0x9c, 0x1c, 0x69, 0xf1, 0x78, 0x56, 0xaa, 0x56, 0xb7, 0xde,
+- 0xbf, 0x69, 0xf6, 0xfb, 0x3d, 0x2a, 0xd1, 0x9b, 0xc9, 0xde, 0xf0, 0x0d,
+- 0x9d, 0x6c, 0x94, 0x80, 0xef, 0x03, 0xfa, 0x4b, 0xa9, 0xfe, 0xad, 0x58,
+- 0x37, 0x63, 0x77, 0xc2, 0xdf, 0x3a, 0x74, 0x8f, 0xa3, 0x69, 0x7e, 0x42,
+- 0x1e, 0xec, 0xe4, 0xeb, 0xc5, 0x66, 0x0e, 0x9c, 0xd0, 0xba, 0xaa, 0x7e,
+- 0x8f, 0xf3, 0xe6, 0x81, 0x5f, 0x1b, 0x3f, 0xc4, 0x72, 0x96, 0xe7, 0x0c,
+- 0xaa, 0xa2, 0x0e, 0xd5, 0xdb, 0xfc, 0xcc, 0x73, 0x9c, 0xcf, 0x72, 0x18,
+- 0xff, 0x8c, 0xb5, 0x1f, 0xea, 0x5a, 0x9b, 0xb9, 0xc6, 0xbe, 0x02, 0x47,
+- 0xda, 0x96, 0x51, 0x6e, 0x92, 0x51, 0x69, 0x92, 0x5b, 0xf5, 0x65, 0x1c,
+- 0x97, 0xd0, 0xb6, 0xe1, 0x53, 0xc6, 0xc3, 0xa4, 0x8c, 0x1a, 0x46, 0x5c,
+- 0xc3, 0x0c, 0x3c, 0x0f, 0xb5, 0x7e, 0x9d, 0x01, 0x27, 0x42, 0xf8, 0x5f,
+- 0x2c, 0x20, 0x47, 0x5e, 0x73, 0xa8, 0x5f, 0xa8, 0x39, 0x51, 0x77, 0xa8,
+- 0x4f, 0x28, 0xb6, 0xed, 0x3d, 0x01, 0xdb, 0x78, 0x3e, 0xac, 0xfa, 0xbf,
+- 0xc2, 0x9e, 0x41, 0xcc, 0xc7, 0x4a, 0x23, 0xcd, 0xfb, 0xd0, 0xa9, 0x38,
+- 0x67, 0x58, 0x49, 0xfe, 0x8f, 0x92, 0xdc, 0x2e, 0x81, 0x5b, 0xad, 0x5f,
+- 0x46, 0x5e, 0xaf, 0xc7, 0xb8, 0xf1, 0x6a, 0xae, 0xd8, 0xd3, 0xc3, 0xa3,
+- 0xcc, 0x51, 0xad, 0x2f, 0xfa, 0xd3, 0x58, 0x2b, 0x4d, 0xca, 0xcf, 0x20,
+- 0xb7, 0x73, 0x3d, 0x60, 0xdb, 0x02, 0xd8, 0xd6, 0xd7, 0xc9, 0xfb, 0xa8,
+- 0x09, 0xf5, 0xb8, 0x06, 0xf4, 0x90, 0xa9, 0x0c, 0xfc, 0x3c, 0x77, 0x8e,
+- 0xf8, 0x3b, 0xf5, 0x08, 0xbc, 0x57, 0xc1, 0xeb, 0xa5, 0xe2, 0x29, 0xa3,
+- 0xb2, 0x75, 0xcc, 0x4c, 0xfa, 0x08, 0xd8, 0x0d, 0x5e, 0x3b, 0x2c, 0x97,
+- 0x85, 0x5c, 0x1f, 0x64, 0xbe, 0x82, 0xb9, 0x0c, 0xc6, 0x6e, 0x3d, 0x71,
+- 0x2d, 0xc1, 0x5e, 0x2e, 0xf6, 0x9a, 0x21, 0x19, 0xe4, 0x51, 0xaf, 0x47,
+- 0xdc, 0x0a, 0x3d, 0x97, 0xd4, 0x6d, 0xe6, 0xf2, 0x89, 0x2e, 0x2e, 0xbb,
+- 0x64, 0xc6, 0x9c, 0x78, 0x29, 0xc9, 0x41, 0x9c, 0xc7, 0x5f, 0x48, 0xe6,
+- 0x1d, 0xe4, 0xe3, 0xe7, 0x92, 0xba, 0x62, 0xe1, 0x39, 0xa0, 0xe5, 0x38,
+- 0x37, 0x67, 0x39, 0x37, 0x17, 0x90, 0x9b, 0x4b, 0xe0, 0xa7, 0xff, 0x31,
+- 0x19, 0xc8, 0x4d, 0x44, 0xbf, 0x6b, 0x48, 0xe4, 0x21, 0x13, 0xf2, 0xdc,
+- 0x1b, 0xcc, 0xc1, 0x36, 0xcf, 0xfe, 0x18, 0x67, 0x0a, 0xcf, 0x70, 0xde,
+- 0xd4, 0x3a, 0x13, 0x28, 0xf7, 0x32, 0x8d, 0x16, 0x2e, 0x23, 0x4f, 0x9a,
+- 0x34, 0x81, 0xdd, 0x78, 0xdf, 0xb4, 0x96, 0xa7, 0x3d, 0x05, 0xff, 0xbd,
+- 0x6f, 0x90, 0xe2, 0xfa, 0xfb, 0x1d, 0xe8, 0x18, 0x71, 0xa7, 0xc0, 0xfb,
+- 0xc5, 0xd2, 0x7f, 0x93, 0xf9, 0x43, 0x22, 0x83, 0xba, 0x56, 0xe4, 0x7d,
+- 0x89, 0x2a, 0x2d, 0xf6, 0x83, 0xdf, 0x85, 0x07, 0x1f, 0x78, 0x20, 0xaa,
+- 0x36, 0xc1, 0x3f, 0xc4, 0x38, 0xc6, 0x1a, 0xd6, 0x8b, 0x22, 0x72, 0xaa,
+- 0xc3, 0xb8, 0x66, 0xbc, 0x9f, 0x49, 0xf0, 0x3e, 0x0b, 0xbc, 0x7b, 0xe3,
+- 0x37, 0xc0, 0xa3, 0x1b, 0x0f, 0xf1, 0xe8, 0x4c, 0x82, 0xf1, 0x59, 0x60,
+- 0xfc, 0x97, 0xc0, 0x96, 0x85, 0x9a, 0x0e, 0xdc, 0x36, 0xc8, 0x88, 0x50,
+- 0x1b, 0x80, 0x83, 0x44, 0xcf, 0xe9, 0x44, 0xcf, 0xcc, 0x63, 0xf4, 0x9c,
+- 0x4e, 0xf4, 0xcc, 0x74, 0xeb, 0x81, 0x5c, 0x25, 0x91, 0x0b, 0x1f, 0x23,
+- 0x57, 0x49, 0xe4, 0xc2, 0x2e, 0x39, 0x0b, 0x67, 0xe2, 0x73, 0x71, 0x1e,
+- 0xdb, 0x45, 0x2c, 0x7c, 0x8a, 0xb1, 0x62, 0x87, 0x18, 0xef, 0x61, 0x04,
+- 0x66, 0x9a, 0x37, 0xb1, 0x96, 0xfd, 0x90, 0x61, 0x0e, 0x3c, 0xe2, 0xbb,
+- 0x3d, 0xf8, 0x6e, 0x1f, 0xef, 0xf8, 0xfb, 0x66, 0x82, 0x15, 0xae, 0x45,
+- 0x5e, 0x2d, 0x7c, 0x68, 0x6d, 0x46, 0xb0, 0x9f, 0xc5, 0xd5, 0xc3, 0x62,
+- 0x60, 0x61, 0x0e, 0x35, 0xa7, 0x69, 0x52, 0x59, 0x32, 0x57, 0x5f, 0x91,
+- 0x31, 0x76, 0xb7, 0xb1, 0x7e, 0xbb, 0xc3, 0xab, 0x99, 0x46, 0x8e, 0x68,
+- 0xbd, 0x97, 0x16, 0x50, 0x4f, 0xce, 0x03, 0x4b, 0xd7, 0x7d, 0xb0, 0x90,
+- 0x86, 0x81, 0x0b, 0x0d, 0x5c, 0x7b, 0x71, 0x6c, 0x23, 0xb5, 0x08, 0x66,
+- 0xfc, 0x88, 0x76, 0x26, 0xf3, 0x94, 0xd9, 0xec, 0xd4, 0x43, 0xb9, 0xde,
+- 0xbd, 0x8f, 0x8b, 0x7d, 0x02, 0xd4, 0xe0, 0x3f, 0xa2, 0x17, 0x70, 0x48,
+- 0x8e, 0x22, 0x97, 0x36, 0x39, 0x27, 0x80, 0xa3, 0x9b, 0x5c, 0xeb, 0x39,
+- 0xe7, 0x5a, 0xc0, 0x62, 0x9a, 0x7f, 0x72, 0xe8, 0x5b, 0x3e, 0x41, 0xed,
+- 0x10, 0x34, 0x5f, 0xd4, 0x7a, 0xca, 0xff, 0x04, 0xb8, 0xc2, 0xb7, 0x75,
+- 0x9e, 0xdb, 0xc5, 0x77, 0xfe, 0x66, 0x51, 0x76, 0xf5, 0x49, 0xec, 0x89,
+- 0xfd, 0xce, 0xf0, 0xfa, 0x1c, 0x7a, 0x1a, 0xce, 0xf3, 0x18, 0xd7, 0xf9,
+- 0xdd, 0x48, 0x7c, 0x6a, 0x62, 0xfc, 0x02, 0x46, 0x3e, 0x4f, 0x0f, 0xce,
+- 0xa7, 0xf5, 0x5d, 0x9f, 0x9f, 0xb5, 0x96, 0x41, 0x2f, 0x95, 0x1b, 0x0a,
+- 0xf5, 0x7d, 0xa4, 0xb0, 0x00, 0x9e, 0x95, 0x5b, 0xe9, 0x3c, 0xcf, 0xd9,
+- 0x5d, 0x73, 0x78, 0x6e, 0xf1, 0x77, 0x41, 0x3b, 0x6a, 0x11, 0x75, 0x11,
+- 0xfd, 0xd3, 0x3a, 0xf7, 0x61, 0xdc, 0x53, 0xc5, 0xf5, 0x72, 0x9c, 0x7b,
+- 0xb0, 0x77, 0x90, 0xff, 0xd7, 0xc1, 0x29, 0xf0, 0xfb, 0x29, 0x41, 0x4f,
+- 0x50, 0xd9, 0x49, 0xcf, 0xa3, 0x35, 0x38, 0x5b, 0x30, 0x0d, 0xe6, 0xe2,
+- 0xb0, 0x3d, 0x4d, 0xdc, 0x6b, 0x8d, 0x84, 0x55, 0x96, 0x69, 0x21, 0x1f,
+- 0xac, 0x68, 0xaa, 0x76, 0xf4, 0xd8, 0xb3, 0xc8, 0xd1, 0xd1, 0x4f, 0xb8,
+- 0xb6, 0xb1, 0x6f, 0x4f, 0xc0, 0x1e, 0xf4, 0x05, 0xeb, 0x92, 0xde, 0x6e,
+- 0xb0, 0x9e, 0x3c, 0x99, 0xe8, 0x11, 0x97, 0xfd, 0x54, 0xcf, 0x9f, 0xa0,
+- 0x87, 0x1c, 0x41, 0xdc, 0xff, 0x4a, 0xe8, 0x62, 0x1f, 0x64, 0xd0, 0x8f,
+- 0x8f, 0xd3, 0xbc, 0x5a, 0x8c, 0x6b, 0xf1, 0x79, 0xd4, 0xde, 0xa8, 0x98,
+- 0x85, 0xef, 0x72, 0xb1, 0x9e, 0x7a, 0xf3, 0x5f, 0x9a, 0xf3, 0x0f, 0xea,
+- 0x24, 0xf4, 0xe3, 0xbd, 0x8d, 0xb9, 0x95, 0x80, 0xde, 0x6c, 0xc6, 0xb5,
+- 0xdb, 0xbe, 0x88, 0x9e, 0xbf, 0xd2, 0xf8, 0x47, 0xda, 0xcb, 0x84, 0xc0,
+- 0x71, 0xe1, 0x02, 0x7c, 0x23, 0xb7, 0x7b, 0xe9, 0x35, 0xf4, 0xa8, 0x99,
+- 0x15, 0xd4, 0x65, 0xf8, 0x4d, 0x5c, 0xad, 0x8d, 0x73, 0x9f, 0x79, 0x03,
+- 0x5c, 0x9f, 0x2f, 0x2a, 0xdf, 0x34, 0x46, 0x69, 0xf9, 0x67, 0x5c, 0x67,
+- 0xe2, 0x7a, 0x0d, 0xfc, 0xb8, 0x74, 0xa5, 0xa5, 0x68, 0xb9, 0x65, 0xc3,
+- 0x2e, 0xfb, 0x41, 0x2f, 0xae, 0x38, 0x1f, 0x57, 0xf0, 0x8b, 0xf3, 0x2d,
+- 0xce, 0x04, 0x3e, 0x04, 0xec, 0x0f, 0xee, 0xbd, 0x39, 0x66, 0x9c, 0xff,
+- 0x4e, 0xe1, 0x99, 0xcf, 0xca, 0xbd, 0x32, 0xfb, 0x81, 0x7b, 0xe2, 0xee,
+- 0xfe, 0x9d, 0x73, 0x23, 0x74, 0x6e, 0x33, 0x87, 0xb8, 0x47, 0xa9, 0xc8,
+- 0xf9, 0x86, 0x1d, 0xf3, 0xaa, 0xde, 0xee, 0xf8, 0x3b, 0xf2, 0x59, 0xa7,
+- 0x57, 0x0a, 0xe9, 0xce, 0x8b, 0x22, 0xee, 0x3b, 0x42, 0xe4, 0x15, 0x3e,
+- 0xcb, 0x04, 0xee, 0x27, 0x1e, 0x7c, 0xe7, 0xa1, 0x2f, 0xe9, 0xf0, 0x73,
+- 0x38, 0xe1, 0xe7, 0x50, 0xeb, 0x44, 0x26, 0xed, 0xc7, 0x0e, 0x72, 0xee,
+- 0x17, 0xe2, 0x7f, 0xe7, 0xdc, 0x46, 0xc2, 0xb9, 0x6c, 0x8c, 0x4d, 0xb1,
+- 0xd2, 0x3d, 0xf7, 0x0e, 0xe6, 0x72, 0x5d, 0xf7, 0xa2, 0xc3, 0x62, 0x12,
+- 0xf3, 0x03, 0x9c, 0xe4, 0x75, 0x88, 0xff, 0x4a, 0x2f, 0x99, 0x57, 0x99,
+- 0x97, 0x29, 0x46, 0x5c, 0xe0, 0x31, 0xd5, 0xd1, 0x83, 0x3d, 0x70, 0xd7,
+- 0x59, 0xcd, 0xc4, 0xf8, 0x37, 0x83, 0x74, 0x4d, 0x81, 0xa6, 0x1b, 0x9e,
+- 0x7f, 0x87, 0xc7, 0x16, 0xcf, 0x4b, 0xca, 0xae, 0x58, 0xf4, 0xfa, 0x98,
+- 0xe7, 0xba, 0xc2, 0xf3, 0x77, 0x60, 0xf7, 0x5d, 0xe5, 0x50, 0x66, 0x94,
+- 0x39, 0xc9, 0x15, 0x2a, 0x0b, 0xdc, 0xe0, 0x0e, 0xd8, 0xd4, 0x97, 0xd0,
+- 0x1f, 0xb9, 0x12, 0xb1, 0xfd, 0x29, 0x6c, 0xe1, 0x7c, 0x0b, 0xbb, 0xc6,
+- 0xd7, 0x81, 0x83, 0x05, 0x7e, 0xdf, 0xc7, 0x18, 0xdf, 0x2d, 0x78, 0x7f,
+- 0x07, 0x67, 0xb0, 0x28, 0xb7, 0xaa, 0x71, 0xf7, 0x7b, 0x20, 0x77, 0x25,
+- 0xc1, 0x6b, 0x06, 0xdf, 0xe7, 0x63, 0xbc, 0x72, 0x1c, 0xd9, 0xe7, 0x5a,
+- 0x7f, 0x80, 0x38, 0x96, 0xe9, 0x2f, 0x31, 0x8f, 0xef, 0xfa, 0x31, 0x7e,
+- 0x61, 0x0f, 0x64, 0x5a, 0x9f, 0xca, 0x98, 0xe7, 0xe0, 0xc3, 0x65, 0x3f,
+- 0xc6, 0xd7, 0xf8, 0x4d, 0x1c, 0xbb, 0x83, 0xfd, 0x6e, 0x3d, 0xc3, 0xf6,
+- 0x49, 0x8a, 0x39, 0xe5, 0x2e, 0x72, 0x8f, 0xe9, 0x8f, 0x20, 0xdf, 0x62,
+- 0x5d, 0x2b, 0xe5, 0x7d, 0x16, 0x7c, 0x67, 0x5f, 0x33, 0xf7, 0x07, 0x92,
+- 0xe7, 0x2f, 0x22, 0xb6, 0x36, 0xfc, 0xd8, 0xe9, 0x05, 0xcc, 0x15, 0xb6,
+- 0xad, 0x97, 0xd4, 0xd5, 0xd4, 0xae, 0x4f, 0x63, 0x7b, 0x1e, 0xd6, 0x89,
+- 0xf9, 0xed, 0xc3, 0xe4, 0xec, 0x2e, 0xb9, 0xbf, 0x1f, 0x22, 0x87, 0xf9,
+- 0x6d, 0x96, 0xc9, 0xef, 0xf7, 0x20, 0xe5, 0x7d, 0x3c, 0x87, 0xc0, 0x3b,
+- 0xcb, 0x3e, 0x7a, 0xef, 0xec, 0xc6, 0x7e, 0x5a, 0xfb, 0x19, 0xdf, 0xbc,
+- 0xa7, 0xe7, 0x72, 0xef, 0xde, 0xc1, 0x76, 0x1e, 0x79, 0x2f, 0xf6, 0x03,
+- 0x72, 0xa6, 0x37, 0x3e, 0x47, 0x29, 0xfe, 0x1f, 0x60, 0x7c, 0x01, 0x76,
+- 0x55, 0x68, 0xa2, 0xc4, 0xe3, 0xc9, 0x03, 0x18, 0xe7, 0xfb, 0x3a, 0xd7,
+- 0xa6, 0x3c, 0xee, 0x61, 0x5c, 0xe7, 0xf9, 0x2e, 0xd6, 0xc9, 0x53, 0x95,
+- 0x35, 0x7e, 0xff, 0x2c, 0x79, 0xe7, 0xbc, 0xcc, 0x7d, 0xd4, 0x0d, 0x9c,
+- 0x9f, 0xeb, 0xd1, 0x18, 0xd5, 0x1d, 0xf8, 0xd5, 0x67, 0x1b, 0x2e, 0xd0,
+- 0x83, 0x1e, 0xec, 0xb0, 0xba, 0xb2, 0x6a, 0x76, 0x71, 0xe5, 0xb0, 0x7e,
+- 0x8c, 0xef, 0x27, 0x46, 0x79, 0xcd, 0x48, 0x7a, 0x78, 0xee, 0xbf, 0xf6,
+- 0xb4, 0x19, 0xf7, 0x62, 0x9c, 0x17, 0xb8, 0x07, 0x7b, 0x0d, 0xfb, 0xf6,
+- 0xc5, 0xef, 0xe1, 0x16, 0x8f, 0xec, 0x17, 0x8a, 0x79, 0xd1, 0xe1, 0x79,
+- 0x6a, 0x77, 0x84, 0x75, 0xf0, 0x8f, 0x88, 0x52, 0x9b, 0xa8, 0xfa, 0x16,
+- 0xd7, 0x54, 0x3b, 0xc9, 0xff, 0x17, 0x31, 0x3e, 0x9f, 0x60, 0x20, 0x3d,
+- 0x4b, 0xec, 0x57, 0xec, 0xaf, 0xf5, 0x2c, 0x30, 0xf5, 0xba, 0x9f, 0xda,
+- 0x0a, 0x6c, 0x7f, 0x23, 0xcd, 0x31, 0x88, 0x97, 0xda, 0xd3, 0x72, 0x34,
+- 0x84, 0x2d, 0xfc, 0xff, 0x82, 0x0a, 0x7a, 0x3b, 0xb6, 0x65, 0xc6, 0x78,
+- 0x79, 0xff, 0x7f, 0x04, 0x8f, 0xf6, 0x71, 0x1c, 0x3f, 0x8e, 0xef, 0x7e,
+- 0xfc, 0xac, 0x1c, 0x7c, 0xff, 0x51, 0xc3, 0xb3, 0x07, 0x04, 0xe7, 0x23,
+- 0xb2, 0xb2, 0x88, 0xc1, 0x5d, 0xc4, 0x28, 0x24, 0xaf, 0xf4, 0x41, 0xdc,
+- 0x9b, 0x13, 0x38, 0x37, 0x11, 0xe2, 0x19, 0x1c, 0xc0, 0xd9, 0x46, 0x3d,
+- 0xff, 0x3d, 0xe2, 0x38, 0x58, 0xb8, 0x6b, 0x74, 0x62, 0x37, 0x96, 0xc4,
+- 0x6e, 0xb4, 0xf5, 0xf0, 0x99, 0x5d, 0xf1, 0x52, 0xf2, 0xce, 0x67, 0xe2,
+- 0x5e, 0xc1, 0xe5, 0x1e, 0x09, 0x3e, 0x28, 0x19, 0x9d, 0x7b, 0x7b, 0x93,
+- 0xef, 0x97, 0x35, 0xce, 0xe5, 0xdc, 0xcf, 0x81, 0x6b, 0xa8, 0x96, 0x23,
+- 0xb8, 0x6b, 0x68, 0x5d, 0x2f, 0x31, 0x76, 0x27, 0xc6, 0xa7, 0x62, 0x0c,
+- 0x8b, 0x41, 0x41, 0x29, 0xb7, 0xba, 0x9f, 0x31, 0x96, 0xf8, 0x9e, 0xc6,
+- 0xef, 0x1d, 0x1d, 0x1b, 0xc0, 0x1d, 0x6e, 0x32, 0xb8, 0x1d, 0xb2, 0x7e,
+- 0xa3, 0xd3, 0x13, 0xdb, 0x11, 0xf3, 0x1e, 0xb8, 0x7b, 0x1f, 0x76, 0x85,
+- 0xe0, 0x6d, 0xe7, 0x6e, 0x37, 0x87, 0x9c, 0x72, 0x1b, 0xb1, 0xbd, 0xab,
+- 0x3a, 0x75, 0x71, 0x83, 0xfb, 0xae, 0x16, 0xf2, 0x4d, 0x1e, 0xbd, 0xb2,
+- 0x4a, 0xef, 0xa2, 0x16, 0x5d, 0xc3, 0x9a, 0xeb, 0x98, 0xbb, 0xd2, 0x4a,
+- 0x71, 0x84, 0x1e, 0x0f, 0xd8, 0x9c, 0x57, 0xff, 0xd4, 0x55, 0xa7, 0x7b,
+- 0x2d, 0xff, 0xfd, 0x07, 0x5d, 0xe7, 0x92, 0xbb, 0xa8, 0x13, 0x00, 0x00,
+- 0x00 };
++ 0xbd, 0x58, 0x5d, 0x6c, 0x1c, 0x57, 0x15, 0x3e, 0x73, 0xe7, 0xee, 0x7a,
++ 0x6d, 0x39, 0xf1, 0xb8, 0x99, 0x96, 0x4d, 0x63, 0xd4, 0x99, 0x78, 0xfc,
++ 0x43, 0x6d, 0x95, 0x69, 0x59, 0x15, 0x17, 0x56, 0x68, 0xba, 0xbb, 0x71,
++ 0xad, 0xaa, 0xaa, 0x5c, 0x29, 0x88, 0x4a, 0x8d, 0x90, 0x59, 0x37, 0x6d,
++ 0x79, 0x4b, 0x11, 0x0f, 0x48, 0x45, 0xca, 0xb2, 0x76, 0xd2, 0x08, 0x2d,
++ 0x99, 0xd6, 0x85, 0x44, 0x42, 0x7d, 0x88, 0x9c, 0x3a, 0xee, 0xc3, 0xca,
++ 0x9b, 0x8a, 0x07, 0x24, 0xa4, 0xa8, 0x55, 0x80, 0xc0, 0x1b, 0x7d, 0xa8,
++ 0xf8, 0x79, 0x22, 0x12, 0x0f, 0x54, 0x08, 0x90, 0x85, 0x04, 0x2a, 0xa5,
++ 0xe4, 0xf2, 0x7d, 0x77, 0x67, 0x92, 0xc5, 0x4d, 0x41, 0xe5, 0x81, 0x95,
++ 0x56, 0x77, 0xe6, 0xde, 0x73, 0xce, 0x3d, 0xf7, 0xfc, 0x7c, 0xe7, 0xdc,
++ 0x39, 0xec, 0xc8, 0x88, 0x64, 0xbf, 0x7d, 0xf8, 0x57, 0xbe, 0x72, 0xe2,
++ 0xeb, 0x0f, 0xdc, 0x57, 0xb9, 0x0f, 0x8f, 0x0f, 0x3a, 0x77, 0x6b, 0x2d,
++ 0xff, 0xc7, 0x9f, 0x2b, 0xe2, 0xe5, 0x7a, 0xf0, 0x2f, 0x25, 0x55, 0x4d,
++ 0x0e, 0xd6, 0x22, 0x29, 0xb9, 0xd5, 0xea, 0xfc, 0x6a, 0x24, 0x92, 0x74,
++ 0xe7, 0x82, 0xba, 0xfc, 0xd3, 0xb4, 0x7c, 0x2d, 0x9c, 0xff, 0x64, 0xf5,
++ 0x83, 0x4f, 0x5f, 0xf9, 0x6c, 0xb8, 0x7b, 0xc1, 0x95, 0x92, 0x57, 0x3d,
++ 0xa3, 0xbd, 0x69, 0x29, 0x4d, 0x80, 0xe7, 0xd5, 0x99, 0x6f, 0x17, 0x64,
++ 0x7f, 0x2e, 0xab, 0x65, 0x54, 0x74, 0xdd, 0x5c, 0x99, 0x89, 0xbc, 0x36,
++ 0x36, 0xb8, 0xdc, 0x0b, 0xa4, 0xd6, 0x2b, 0xcb, 0x9b, 0x3d, 0x5f, 0xde,
++ 0xe8, 0x69, 0x39, 0xfe, 0xca, 0x49, 0x59, 0x8f, 0xc3, 0x72, 0xc3, 0x2d,
++ 0x89, 0xaa, 0x86, 0xe5, 0xa6, 0x04, 0xb2, 0x15, 0x87, 0xad, 0x15, 0x77,
++ 0xdc, 0x29, 0x55, 0x4b, 0xf2, 0xc2, 0x8c, 0x92, 0x0b, 0xfe, 0x31, 0x79,
++ 0x26, 0x7a, 0x12, 0x7f, 0x2d, 0x6a, 0x43, 0x3b, 0xf5, 0xf3, 0x5a, 0xf4,
++ 0xc6, 0x98, 0x3c, 0x12, 0x1b, 0xb3, 0x1a, 0x27, 0xe0, 0x9f, 0x9c, 0x7d,
++ 0x56, 0x86, 0xa5, 0xe5, 0x85, 0x4b, 0x22, 0x05, 0xd2, 0x48, 0x2d, 0x2e,
++ 0x48, 0xe2, 0xf5, 0xcf, 0x75, 0xc1, 0x8e, 0x1f, 0x98, 0x2d, 0xf0, 0x0f,
++ 0x47, 0xf9, 0xfa, 0x1d, 0xd9, 0xba, 0x97, 0xad, 0x2b, 0x51, 0xe7, 0xc2,
++ 0x60, 0x5b, 0xa6, 0x12, 0xed, 0xdc, 0x30, 0xb5, 0xe8, 0x2e, 0xaf, 0xb6,
++ 0xad, 0xc5, 0xdd, 0xa0, 0xfe, 0x91, 0x57, 0x17, 0x03, 0x1e, 0x97, 0x3c,
++ 0x5a, 0x55, 0xbf, 0x06, 0xbf, 0x4d, 0x25, 0xca, 0x11, 0xb9, 0xda, 0x29,
++ 0x7b, 0xb5, 0xde, 0x37, 0x9c, 0x5a, 0x7a, 0xc3, 0x24, 0x7a, 0x44, 0x54,
++ 0x94, 0x38, 0xb5, 0x6d, 0xca, 0x1a, 0x16, 0x1d, 0x0d, 0x81, 0x67, 0xd2,
++ 0x53, 0xc2, 0xb1, 0x96, 0xcd, 0x53, 0x76, 0x03, 0xcf, 0x8b, 0x4e, 0xb2,
++ 0xad, 0x9d, 0xda, 0xf9, 0x25, 0x3c, 0x97, 0xc0, 0x0f, 0xbb, 0xc4, 0x8e,
++ 0x24, 0xcb, 0x0e, 0xf8, 0x78, 0x4e, 0x0f, 0xef, 0x4a, 0x12, 0xdf, 0x93,
++ 0xb5, 0x4a, 0x58, 0x6e, 0xc9, 0xa3, 0x4e, 0x7d, 0xfb, 0x43, 0x4e, 0xf3,
++ 0x96, 0x7a, 0x1f, 0x9e, 0xa3, 0x2e, 0x0f, 0x6b, 0x63, 0xd4, 0xfd, 0x43,
++ 0xd9, 0x19, 0x29, 0x2f, 0xe9, 0xeb, 0xef, 0xf3, 0x1d, 0x3a, 0xa7, 0xd0,
++ 0xbd, 0x5b, 0x84, 0x3e, 0xc6, 0x70, 0x9f, 0x5a, 0x54, 0x87, 0x9e, 0x09,
++ 0xfe, 0xe1, 0x99, 0x26, 0x42, 0xe1, 0xf0, 0xb9, 0x7d, 0x12, 0x8c, 0x1b,
++ 0xd3, 0x88, 0x43, 0x6f, 0x5b, 0x26, 0x64, 0x2d, 0x9d, 0xf0, 0x8e, 0xa4,
++ 0x6d, 0xac, 0xb7, 0x48, 0x03, 0x7b, 0x88, 0x1c, 0xe9, 0x1a, 0x73, 0x29,
++ 0x3e, 0x50, 0x94, 0xfd, 0x6a, 0xbe, 0x20, 0x61, 0x90, 0x60, 0xee, 0xf0,
++ 0xa5, 0xbd, 0x36, 0xbb, 0x27, 0xd3, 0x81, 0x76, 0xc7, 0x3e, 0xf1, 0xa1,
++ 0xec, 0x7d, 0xd4, 0xab, 0x9d, 0xcf, 0xed, 0x6c, 0xf5, 0x86, 0x5d, 0x63,
++ 0xa9, 0x55, 0xa0, 0xff, 0x47, 0x9e, 0x29, 0xe7, 0xa3, 0x2e, 0xd4, 0x1b,
++ 0xf4, 0xd1, 0x2d, 0x9d, 0x9e, 0xfa, 0x90, 0x4e, 0xd4, 0x47, 0x89, 0x3e,
++ 0x57, 0x92, 0xf5, 0xe8, 0x71, 0x25, 0xfb, 0x8d, 0x59, 0x8f, 0xb5, 0xd3,
++ 0x38, 0x7f, 0x2c, 0x7b, 0x46, 0x1c, 0xa6, 0x88, 0xc3, 0x14, 0x71, 0x99,
++ 0x8a, 0xa7, 0xaa, 0x81, 0x5c, 0x99, 0x29, 0xc9, 0x75, 0x17, 0xfe, 0xec,
++ 0xcd, 0x79, 0xaf, 0x21, 0xa6, 0x12, 0xcf, 0x11, 0x37, 0x4a, 0x66, 0x0b,
++ 0xc2, 0x77, 0xc4, 0x92, 0x4e, 0xca, 0x2e, 0x62, 0x29, 0x39, 0xca, 0xb9,
++ 0x21, 0x59, 0xb1, 0x67, 0x99, 0xf3, 0x4e, 0x09, 0x7d, 0x55, 0xc3, 0xda,
++ 0x64, 0x70, 0x4a, 0x76, 0x11, 0x1f, 0x35, 0xac, 0x53, 0x56, 0xe8, 0xb5,
++ 0x40, 0xd1, 0x4e, 0xdf, 0x45, 0x0e, 0xf8, 0x88, 0xfb, 0x99, 0xb2, 0x12,
++ 0x47, 0x56, 0xe7, 0x61, 0x8b, 0xf9, 0x29, 0xd8, 0x88, 0x39, 0xc1, 0xb8,
++ 0xfa, 0xeb, 0xb4, 0x8e, 0x4e, 0x22, 0x7e, 0x40, 0x8b, 0xf3, 0x9f, 0x4a,
++ 0x67, 0xc0, 0x1f, 0x15, 0xa9, 0xe7, 0x56, 0xac, 0x65, 0x3d, 0xbd, 0xa2,
++ 0x0a, 0xd1, 0xef, 0x1d, 0xd9, 0x1f, 0xb6, 0x12, 0x09, 0x5b, 0x4a, 0x29,
++ 0x9f, 0x5b, 0xbf, 0x84, 0x3c, 0x7a, 0xd3, 0xea, 0xaf, 0xc1, 0x57, 0xce,
++ 0xf4, 0xa7, 0xdd, 0x45, 0x36, 0x3b, 0x61, 0xbc, 0x08, 0xdd, 0xae, 0xc2,
++ 0xff, 0xb4, 0xf9, 0xa5, 0x2e, 0x64, 0x77, 0x1c, 0xe6, 0xae, 0xb4, 0xbb,
++ 0xa4, 0xb3, 0x69, 0xbe, 0xa2, 0xab, 0xb2, 0xdc, 0xee, 0x9c, 0x34, 0x6e,
++ 0x24, 0x2b, 0x85, 0x2a, 0xfd, 0x36, 0xba, 0x00, 0x3f, 0x2c, 0xb7, 0xbb,
++ 0x13, 0x8f, 0x6d, 0x76, 0xa4, 0x75, 0x77, 0x55, 0x5a, 0x6e, 0x45, 0xdd,
++ 0xa5, 0x64, 0x0c, 0x72, 0xab, 0xd8, 0x87, 0x71, 0x15, 0x06, 0x75, 0x77,
++ 0xe2, 0xb1, 0x8b, 0x9d, 0x7b, 0x90, 0xb7, 0xf2, 0x41, 0xad, 0x12, 0x21,
++ 0x77, 0xaf, 0x1e, 0x74, 0x25, 0x92, 0xb5, 0x5e, 0x49, 0x6a, 0xe9, 0x84,
++ 0xac, 0xf7, 0x24, 0x79, 0x6a, 0x06, 0xfb, 0x55, 0xf0, 0xde, 0x9b, 0x97,
++ 0x56, 0x6f, 0x62, 0x45, 0x55, 0x5b, 0x92, 0xf4, 0xd6, 0xf1, 0x2f, 0x49,
++ 0xa3, 0x53, 0x2a, 0x5d, 0xec, 0xb4, 0xc8, 0x5f, 0x72, 0xaa, 0x81, 0x3e,
++ 0xdc, 0xdd, 0x65, 0xdc, 0x40, 0xce, 0xf0, 0x97, 0x54, 0x55, 0x4b, 0xd3,
++ 0xf7, 0x21, 0xc3, 0x81, 0x4d, 0xa8, 0xeb, 0x2c, 0xf6, 0xed, 0x8f, 0xad,
++ 0x1e, 0x7d, 0x37, 0x24, 0xed, 0x78, 0x1e, 0x76, 0x62, 0xd4, 0x0e, 0xc9,
++ 0x5a, 0xf4, 0x9e, 0x79, 0x1a, 0xb1, 0xfa, 0x9a, 0x98, 0x7b, 0x6a, 0xc0,
++ 0x93, 0x1a, 0x4c, 0xfa, 0x42, 0x54, 0x96, 0x53, 0xd8, 0xb7, 0xcf, 0xb7,
++ 0x0e, 0x1d, 0xc8, 0x37, 0x06, 0xbe, 0x06, 0xf8, 0x7c, 0x39, 0x6d, 0x79,
++ 0xc7, 0xc0, 0xbb, 0x9b, 0xf1, 0xce, 0x95, 0x17, 0x25, 0x06, 0xcf, 0x64,
++ 0xb0, 0x08, 0x7f, 0xae, 0xf8, 0x0d, 0xf0, 0x36, 0xa0, 0x03, 0xc6, 0x54,
++ 0x5a, 0xba, 0x42, 0xb9, 0x61, 0xf9, 0x69, 0xe6, 0x83, 0x95, 0xd9, 0x82,
++ 0x4c, 0xe8, 0x95, 0x96, 0x20, 0x67, 0x01, 0xe3, 0x3b, 0xa6, 0x9d, 0x02,
++ 0x77, 0x7c, 0x3e, 0xbf, 0x69, 0x54, 0x15, 0x31, 0x5a, 0x89, 0x82, 0xb6,
++ 0xf0, 0xbd, 0x28, 0x75, 0xe4, 0x99, 0x8a, 0xc6, 0xa4, 0xe9, 0x39, 0x8e,
++ 0xaa, 0xba, 0xd2, 0x44, 0x84, 0x26, 0xcb, 0xda, 0xce, 0xad, 0x20, 0xce,
++ 0x54, 0xf5, 0x7b, 0xaa, 0x5f, 0x0f, 0x0a, 0xa0, 0x41, 0x6e, 0x46, 0xa3,
++ 0xb0, 0xc1, 0x38, 0x68, 0xcf, 0x62, 0x7e, 0x0a, 0xf8, 0x39, 0x0e, 0x1a,
++ 0x8e, 0xcc, 0x11, 0xda, 0x85, 0xf4, 0x15, 0xe8, 0x98, 0xcf, 0x55, 0x60,
++ 0x9b, 0xc1, 0xb4, 0xc9, 0x7d, 0x0c, 0x9a, 0x54, 0x67, 0x79, 0x37, 0x98,
++ 0x4b, 0xf9, 0x7a, 0x80, 0xf5, 0xab, 0x9f, 0x52, 0xb2, 0x6b, 0x2e, 0x46,
++ 0x8c, 0x61, 0x79, 0xaf, 0x11, 0x25, 0xe3, 0xae, 0xcd, 0xf3, 0x3c, 0xdf,
++ 0x39, 0xb2, 0x16, 0x9c, 0x39, 0xb8, 0x1a, 0x39, 0xee, 0xfa, 0xfc, 0x01,
++ 0x69, 0xf9, 0x61, 0x5c, 0x87, 0xbf, 0xd7, 0x53, 0xe6, 0xc6, 0x18, 0xce,
++ 0x1d, 0x22, 0xea, 0x26, 0xf1, 0x9c, 0x1c, 0x04, 0x0f, 0xfc, 0xd8, 0x82,
++ 0x2c, 0x8e, 0x88, 0x99, 0x34, 0x84, 0x8e, 0xb0, 0x47, 0x34, 0xe7, 0x1d,
++ 0x61, 0x3c, 0xfa, 0x5c, 0x63, 0x8d, 0x79, 0xf5, 0x50, 0x2d, 0x0a, 0xe3,
++ 0x66, 0x96, 0x2b, 0x6f, 0xc1, 0xb6, 0xed, 0x94, 0xf5, 0x22, 0xaf, 0x11,
++ 0xcc, 0x0f, 0xc6, 0x4a, 0x8e, 0xb1, 0xe0, 0x89, 0x98, 0x9f, 0xa5, 0x0c,
++ 0x6b, 0x6b, 0x19, 0x8e, 0x2e, 0x40, 0x0f, 0x63, 0x9e, 0x00, 0x86, 0xb6,
++ 0x63, 0x1b, 0x9f, 0xad, 0x40, 0xdd, 0x30, 0x93, 0xd3, 0xb4, 0xb9, 0x31,
++ 0x27, 0xe2, 0x45, 0xd0, 0xfe, 0x16, 0xf6, 0x5a, 0x02, 0x8e, 0x12, 0x7b,
++ 0xb9, 0x77, 0x55, 0xd7, 0x3a, 0xfb, 0xa0, 0x4b, 0x00, 0x7c, 0x83, 0x0d,
++ 0x2c, 0xde, 0x0e, 0x23, 0xdf, 0x99, 0xf3, 0x61, 0xb0, 0x22, 0x9c, 0x97,
++ 0x61, 0x85, 0xf7, 0x26, 0xfc, 0xb4, 0x5e, 0x79, 0xd4, 0x69, 0x6c, 0xbf,
++ 0x9f, 0xf9, 0x48, 0xc6, 0x14, 0x6a, 0x49, 0xd3, 0x27, 0x5f, 0x11, 0x7c,
++ 0xfb, 0xc0, 0xf3, 0x77, 0xac, 0x15, 0x30, 0x0e, 0xca, 0xb1, 0xb8, 0x8d,
++ 0xbd, 0x02, 0xec, 0xb5, 0x24, 0xba, 0xfa, 0x3c, 0xb0, 0x67, 0x2a, 0x68,
++ 0xc8, 0xf7, 0x55, 0xbf, 0x46, 0xd2, 0x37, 0x5f, 0x18, 0xf0, 0x4d, 0x20,
++ 0xae, 0xcd, 0xc1, 0x87, 0xb2, 0x98, 0x22, 0x66, 0x3e, 0x98, 0xad, 0xfb,
++ 0xc0, 0xbe, 0xcf, 0x64, 0x18, 0x5e, 0x22, 0x0e, 0xca, 0x19, 0x8b, 0x83,
++ 0x45, 0xe2, 0x20, 0x70, 0xa5, 0xb5, 0x00, 0x7b, 0xc7, 0xef, 0x02, 0x5f,
++ 0xea, 0xf0, 0xc4, 0x4f, 0x3a, 0x1a, 0x71, 0xe5, 0x82, 0x9f, 0x75, 0xf8,
++ 0xf3, 0xae, 0x8c, 0x84, 0xde, 0xbb, 0xc0, 0x9b, 0xe4, 0x28, 0xf3, 0xc0,
++ 0x18, 0xe4, 0x3a, 0xb0, 0x6a, 0xba, 0x7c, 0x0a, 0x71, 0xef, 0x02, 0x27,
++ 0xb4, 0x70, 0xdf, 0xbc, 0x6e, 0xe6, 0xf5, 0x9b, 0xbf, 0xb7, 0x1d, 0xb8,
++ 0x19, 0xb5, 0xee, 0x73, 0x90, 0x31, 0x15, 0x1c, 0x81, 0x1f, 0xd7, 0x16,
++ 0xfe, 0x1b, 0xcf, 0x6f, 0x32, 0x1e, 0xd4, 0x90, 0x0a, 0xf7, 0x15, 0x69,
++ 0x74, 0x69, 0x87, 0x18, 0x76, 0xb0, 0x18, 0x84, 0x9c, 0x8f, 0x91, 0xf3,
++ 0x22, 0x4d, 0x62, 0x05, 0x30, 0x8c, 0xb8, 0xb7, 0x06, 0x7a, 0x55, 0x19,
++ 0x82, 0x5d, 0x11, 0x4b, 0x4a, 0x4a, 0xba, 0x7a, 0x54, 0xaf, 0x83, 0xb6,
++ 0x50, 0x5d, 0xd6, 0x5b, 0xd1, 0x31, 0x37, 0xef, 0x97, 0xda, 0x1d, 0x71,
++ 0x6a, 0x7d, 0x3f, 0x67, 0x74, 0x8f, 0x65, 0x74, 0x4b, 0x83, 0x74, 0x98,
++ 0x6f, 0x64, 0xf3, 0x09, 0xe6, 0x3f, 0x91, 0xd9, 0x9c, 0xb5, 0xa0, 0x84,
++ 0x3a, 0xcb, 0x3a, 0x10, 0x06, 0x81, 0xfa, 0x4f, 0x75, 0x60, 0x61, 0x00,
++ 0xbb, 0x45, 0xd9, 0xbe, 0xc2, 0x67, 0x4c, 0x0e, 0x9e, 0x75, 0x58, 0x49,
++ 0x74, 0x33, 0x3e, 0xf1, 0xdb, 0xcc, 0xf6, 0x21, 0x2d, 0xf1, 0x7a, 0x90,
++ 0x16, 0x69, 0x04, 0xbb, 0xa8, 0xb3, 0xb7, 0xb3, 0xd9, 0x01, 0xac, 0x21,
++ 0xe7, 0x53, 0x57, 0x1e, 0xd6, 0xcc, 0xef, 0x7b, 0xb5, 0x3d, 0xc7, 0x0e,
++ 0xe8, 0x77, 0x26, 0x2c, 0xce, 0x2c, 0x75, 0x86, 0x20, 0x7e, 0x54, 0x8e,
++ 0x23, 0x9f, 0x9f, 0x86, 0xef, 0x2f, 0xc6, 0x0a, 0xdd, 0x02, 0x6b, 0x8e,
++ 0x41, 0x1c, 0x86, 0xd6, 0x17, 0xb5, 0x68, 0x0d, 0x91, 0xfc, 0x2d, 0xb9,
++ 0x3a, 0x3f, 0x22, 0x85, 0x4b, 0xd4, 0x01, 0xfd, 0xd2, 0xe6, 0xe0, 0x3e,
++ 0x73, 0xd8, 0x67, 0x02, 0x18, 0x78, 0x3f, 0xea, 0x8b, 0x2f, 0x7a, 0x1a,
++ 0x58, 0x9b, 0x96, 0x9c, 0x3a, 0xe4, 0xab, 0x4b, 0x3c, 0x3f, 0x31, 0xb8,
++ 0x94, 0xd5, 0x36, 0xe6, 0xd6, 0x10, 0x6a, 0xfa, 0x1f, 0x91, 0xbb, 0x4a,
++ 0x56, 0x2b, 0xc6, 0x1c, 0x89, 0x7f, 0x00, 0xfb, 0x62, 0x6e, 0x93, 0x6b,
++ 0xbb, 0x98, 0xe7, 0x1c, 0x65, 0x30, 0x16, 0x0f, 0xa0, 0xae, 0x61, 0xcf,
++ 0xa3, 0xe4, 0x19, 0x42, 0xcd, 0x27, 0xfe, 0x63, 0xdc, 0xe4, 0x3b, 0xcf,
++ 0x44, 0x6c, 0x73, 0x31, 0x8e, 0x60, 0xe4, 0x99, 0x7e, 0x91, 0xf9, 0x8a,
++ 0xcf, 0xc6, 0xe8, 0xea, 0xa8, 0xd4, 0x3b, 0x11, 0x30, 0x76, 0xaa, 0x7c,
++ 0x5c, 0xb8, 0x86, 0xf7, 0x2e, 0xe7, 0xbd, 0x81, 0x79, 0x3c, 0x77, 0xad,
++ 0xce, 0xa8, 0xed, 0x79, 0xff, 0xb2, 0x06, 0xc3, 0xa2, 0xc7, 0xd8, 0x64,
++ 0xaf, 0xc2, 0xfa, 0x67, 0x71, 0x6b, 0x96, 0x7d, 0xca, 0xeb, 0x1d, 0xd6,
++ 0x42, 0xcd, 0xbc, 0x44, 0x00, 0x1c, 0x92, 0xba, 0x9f, 0x9f, 0x0b, 0x71,
++ 0x1c, 0x53, 0x36, 0x65, 0x4c, 0xc2, 0x76, 0xec, 0x47, 0xa2, 0xb2, 0x76,
++ 0xa6, 0x92, 0x26, 0xf9, 0xba, 0x05, 0x29, 0x6c, 0xcc, 0x8b, 0x7b, 0xd6,
++ 0xc8, 0x66, 0x5f, 0x9e, 0xb7, 0x2c, 0xbe, 0xd4, 0x5e, 0xa2, 0x1e, 0x98,
++ 0xdf, 0x61, 0x3d, 0x0c, 0x81, 0x67, 0xc5, 0x6c, 0xdf, 0xb2, 0x34, 0x3b,
++ 0x91, 0xd7, 0x10, 0x8c, 0xdd, 0x3b, 0xe0, 0xbb, 0x22, 0xce, 0xac, 0xe5,
++ 0x62, 0xa7, 0xbf, 0x17, 0x73, 0xee, 0xb9, 0xb8, 0xbf, 0x57, 0x43, 0x7e,
++ 0x89, 0xbd, 0xc4, 0x57, 0xc2, 0x3e, 0x12, 0x7d, 0xe3, 0x39, 0x8d, 0xfd,
++ 0x68, 0xa3, 0x02, 0x7a, 0xdb, 0xd9, 0xec, 0x3c, 0x21, 0xe8, 0x34, 0x6c,
++ 0x4e, 0x5b, 0x73, 0x0f, 0xc6, 0xe2, 0x3f, 0x0c, 0xf1, 0x05, 0x75, 0x05,
++ 0xfa, 0xe2, 0xbd, 0xc7, 0x3d, 0x26, 0xe4, 0xc5, 0xd4, 0x62, 0xad, 0x77,
++ 0x02, 0x98, 0xd5, 0xe8, 0xfc, 0x2d, 0xaf, 0x3d, 0x49, 0x1b, 0xf8, 0xfb,
++ 0xac, 0x8c, 0x8a, 0xde, 0x19, 0x95, 0xe7, 0xd0, 0xef, 0x15, 0x36, 0x50,
++ 0xe7, 0x61, 0x63, 0x75, 0xb6, 0x35, 0xcb, 0x9e, 0xed, 0x32, 0x72, 0x79,
++ 0xb5, 0x12, 0xc5, 0xae, 0x33, 0x2d, 0x67, 0xbe, 0x1b, 0xce, 0x6e, 0xdb,
++ 0x7c, 0xc6, 0xfa, 0x4e, 0x20, 0xa7, 0xbb, 0x91, 0x9c, 0xe9, 0x7a, 0xd0,
++ 0xcb, 0xbb, 0xd5, 0xd7, 0x46, 0xc4, 0xdb, 0x06, 0xfe, 0xc4, 0x53, 0x9e,
++ 0x0b, 0x3e, 0xa8, 0xd2, 0x6e, 0xec, 0x63, 0xe9, 0x5f, 0xe2, 0xdb, 0xa3,
++ 0x78, 0x1e, 0x11, 0xf7, 0x1c, 0xfb, 0x4e, 0xc6, 0x24, 0xfd, 0x33, 0xd8,
++ 0x0b, 0x13, 0xfb, 0x20, 0x73, 0x87, 0xb9, 0x9f, 0xe7, 0x66, 0x9e, 0xab,
++ 0xc4, 0x01, 0xed, 0x2c, 0xc2, 0x5e, 0xd7, 0x62, 0xe6, 0xeb, 0x0d, 0x73,
++ 0xcd, 0xf6, 0x6e, 0x1e, 0xfb, 0xe2, 0x81, 0xde, 0x2d, 0xef, 0x7b, 0x18,
++ 0xaf, 0xe5, 0x81, 0x7c, 0xbd, 0x6e, 0x73, 0xf5, 0x0d, 0xe4, 0xed, 0xcb,
++ 0x69, 0xd9, 0xe6, 0xec, 0xe1, 0x07, 0x6e, 0x97, 0xb3, 0x97, 0x3f, 0x46,
++ 0xce, 0xfe, 0x30, 0xcb, 0xd9, 0xa2, 0x8d, 0x6b, 0xb5, 0x31, 0xb8, 0xf6,
++ 0x23, 0xac, 0x0d, 0x65, 0x77, 0x0a, 0x6d, 0x3b, 0xe8, 0xc3, 0x0f, 0xd2,
++ 0x47, 0xb9, 0x7f, 0xfa, 0x71, 0x5a, 0xd7, 0xa4, 0x81, 0x0f, 0x37, 0x46,
++ 0x11, 0x4f, 0xcc, 0xe9, 0x3c, 0x9e, 0x02, 0xc4, 0x72, 0xce, 0x8f, 0x7e,
++ 0xf3, 0x28, 0x63, 0xa1, 0x60, 0xf3, 0xc6, 0xad, 0xe6, 0x34, 0x65, 0x59,
++ 0x44, 0x2f, 0xf7, 0x63, 0x8e, 0xdd, 0x7e, 0xac, 0x14, 0x37, 0x4a, 0xf2,
++ 0xfc, 0x0c, 0xb1, 0x2b, 0x8c, 0xaf, 0x42, 0xe7, 0x6b, 0x91, 0x2f, 0x85,
++ 0x69, 0xe6, 0x33, 0xab, 0x51, 0x11, 0x31, 0x84, 0xbb, 0x55, 0x6a, 0x4e,
++ 0xa2, 0xdf, 0x0a, 0x34, 0xfc, 0xfc, 0x32, 0xe2, 0x88, 0xd8, 0x8a, 0x98,
++ 0x98, 0xdd, 0x44, 0x4c, 0x1c, 0xe7, 0xbb, 0xdd, 0xb7, 0x60, 0x69, 0x5d,
++ 0xbb, 0xbf, 0x0f, 0xfd, 0x4b, 0x32, 0x74, 0xce, 0xe0, 0x4e, 0x75, 0x8b,
++ 0xef, 0xb4, 0x8d, 0x5f, 0x60, 0x09, 0xe6, 0x57, 0x6d, 0xfc, 0xd2, 0xa7,
++ 0x8c, 0x7b, 0x63, 0x7e, 0x67, 0xf3, 0xe6, 0xd7, 0x16, 0x03, 0xae, 0xc5,
++ 0x36, 0x9e, 0x63, 0xf6, 0x9b, 0xa7, 0xbb, 0x3f, 0xd7, 0x16, 0x23, 0x36,
++ 0x8c, 0x9c, 0x8a, 0x6d, 0xac, 0xcd, 0xbe, 0x81, 0x63, 0xbf, 0xd6, 0xcf,
++ 0x85, 0x01, 0x39, 0x93, 0xde, 0x23, 0x90, 0x83, 0x9a, 0x17, 0xac, 0xb1,
++ 0x3f, 0x88, 0xa7, 0xd0, 0x2f, 0x81, 0xae, 0xbb, 0x17, 0x2f, 0xc6, 0x31,
++ 0xd2, 0xde, 0x7f, 0x80, 0x5c, 0x0f, 0x36, 0xa4, 0x1c, 0xea, 0x4d, 0xbd,
++ 0x46, 0x25, 0x3a, 0x9b, 0xeb, 0xf4, 0x17, 0xab, 0xcb, 0xbf, 0xcb, 0xc3,
++ 0xfa, 0xce, 0xed, 0xf8, 0xbc, 0x01, 0xbe, 0x3f, 0xdf, 0x86, 0x0f, 0xeb,
++ 0x3b, 0xe4, 0x19, 0xb9, 0xd9, 0x6b, 0xd4, 0x6f, 0xc6, 0x75, 0x82, 0xb8,
++ 0x27, 0xef, 0xde, 0xbb, 0xdc, 0x60, 0x0e, 0xe4, 0x35, 0x9e, 0x71, 0xce,
++ 0x3d, 0xf3, 0x58, 0xcf, 0x63, 0x3c, 0x8f, 0xf9, 0x3c, 0xd6, 0xc3, 0xf8,
++ 0x19, 0xe9, 0xfb, 0x57, 0x6f, 0x84, 0xd8, 0x7f, 0xe4, 0x7f, 0xb8, 0xb7,
++ 0x10, 0x23, 0x24, 0xb9, 0x75, 0xd7, 0xfb, 0x69, 0xd6, 0xaf, 0x94, 0x98,
++ 0x6b, 0xf8, 0xb3, 0x8f, 0xdf, 0x45, 0x7f, 0x10, 0x67, 0xb6, 0x4d, 0xb2,
++ 0xb1, 0x4f, 0xd3, 0xef, 0x07, 0xbf, 0x9a, 0x61, 0xf2, 0x17, 0xfb, 0xf5,
++ 0x47, 0xf2, 0x9c, 0x62, 0x0e, 0xd9, 0x9c, 0xe2, 0x79, 0x70, 0x0f, 0x37,
++ 0x66, 0x19, 0x7e, 0x7c, 0x3e, 0xce, 0xf3, 0x08, 0xf1, 0xf4, 0x40, 0x9e,
++ 0xe3, 0xb0, 0x53, 0x74, 0xc3, 0xe8, 0xe9, 0x04, 0x36, 0xe3, 0xdd, 0xb7,
++ 0x81, 0xde, 0x89, 0x76, 0x5a, 0x72, 0x9e, 0xb8, 0x79, 0xdf, 0xdd, 0xdb,
++ 0x27, 0xd1, 0x6e, 0xb4, 0xeb, 0xa0, 0xdd, 0xc2, 0x78, 0x5c, 0x11, 0x03,
++ 0x6e, 0x87, 0x13, 0x79, 0x3d, 0x07, 0x06, 0x4d, 0xe7, 0x76, 0xfa, 0xd8,
++ 0x35, 0x3d, 0xe9, 0x7f, 0x2b, 0xd8, 0x8b, 0x0f, 0xdb, 0xee, 0x00, 0x3e,
++ 0xdc, 0xa6, 0xe7, 0xa4, 0x0c, 0xda, 0x00, 0xf5, 0xcd, 0xf6, 0x21, 0xec,
++ 0x31, 0x6f, 0x18, 0xd7, 0xf6, 0x9b, 0xc4, 0x46, 0xf6, 0x99, 0xdf, 0x2c,
++ 0xc8, 0xc8, 0x3e, 0xfb, 0x9e, 0x6c, 0x73, 0x64, 0x4c, 0x48, 0xbf, 0x6e,
++ 0x59, 0xfd, 0x1f, 0xcf, 0xf4, 0xef, 0xeb, 0x2c, 0xea, 0xa3, 0x30, 0x8d,
++ 0xba, 0x7a, 0xd0, 0x35, 0xcc, 0xed, 0xd2, 0x52, 0xd5, 0x13, 0xd2, 0xa8,
++ 0xb0, 0x5f, 0x12, 0xdc, 0xb5, 0xa0, 0xc3, 0x02, 0xf5, 0x28, 0x43, 0x8f,
++ 0x51, 0xdc, 0x4d, 0xc2, 0xa5, 0x96, 0x84, 0xc9, 0x0a, 0x08, 0x67, 0xbe,
++ 0x43, 0xbb, 0x1d, 0xd3, 0x5b, 0x1d, 0xda, 0xed, 0x49, 0xbd, 0xde, 0x99,
++ 0x44, 0x7f, 0x18, 0xc2, 0xdb, 0xe1, 0xec, 0x25, 0x61, 0x8c, 0xcd, 0xc5,
++ 0x1c, 0x4f, 0x0b, 0xfb, 0xb1, 0x63, 0x7a, 0xaa, 0xcb, 0xf1, 0x49, 0x1d,
++ 0x75, 0x07, 0xe5, 0xfe, 0xc9, 0x00, 0x13, 0x93, 0xeb, 0xc8, 0xa3, 0x17,
++ 0x7b, 0xfd, 0xbd, 0x71, 0x3f, 0xcc, 0xe4, 0x62, 0x2e, 0xcd, 0x65, 0x0b,
++ 0x71, 0x8a, 0xb2, 0x21, 0x77, 0x32, 0xfe, 0x99, 0xdd, 0x83, 0xf7, 0xa3,
++ 0x8f, 0xda, 0xe3, 0xae, 0xfc, 0xfb, 0x04, 0x72, 0xa7, 0x60, 0xb1, 0x67,
++ 0x2d, 0xc5, 0x9d, 0xda, 0x37, 0xa6, 0x19, 0xbd, 0x0d, 0xdb, 0xa1, 0x47,
++ 0x98, 0xf7, 0xf0, 0x07, 0xae, 0x2e, 0x73, 0x0d, 0x7d, 0x38, 0xee, 0x82,
++ 0xbc, 0xcf, 0xad, 0xa5, 0x5c, 0x63, 0x8c, 0xa3, 0x57, 0x9c, 0xff, 0x15,
++ 0x68, 0xdf, 0x31, 0xad, 0x9e, 0xb2, 0xf7, 0x75, 0x15, 0xe1, 0x1e, 0xd6,
++ 0x63, 0x3f, 0x23, 0x4e, 0x23, 0x95, 0xa0, 0x19, 0x2f, 0xd8, 0xfb, 0x5a,
++ 0xe2, 0x05, 0xbc, 0x93, 0xa2, 0x07, 0x9d, 0x1f, 0xe8, 0x41, 0xe7, 0xd1,
++ 0x83, 0x8e, 0x15, 0x11, 0xe7, 0x09, 0xee, 0xa1, 0xaa, 0xd9, 0xcf, 0x9b,
++ 0x31, 0xde, 0x39, 0xdb, 0xbe, 0xec, 0x43, 0x77, 0x05, 0xdd, 0x22, 0xec,
++ 0xcf, 0xf5, 0x3b, 0xb3, 0xef, 0x5a, 0xa3, 0xa0, 0x4f, 0x6c, 0x3f, 0xd6,
++ 0xf6, 0x8b, 0xd2, 0x8c, 0x49, 0x73, 0x28, 0xa3, 0xf9, 0xf2, 0x1e, 0x9a,
++ 0x3b, 0x79, 0x46, 0xca, 0x96, 0xe6, 0x2b, 0xcc, 0x3b, 0xd6, 0xd2, 0x62,
++ 0x96, 0x6f, 0x27, 0xf0, 0x3c, 0x94, 0x3d, 0xe7, 0xf4, 0xf7, 0xee, 0xe1,
++ 0x7f, 0xc8, 0xe9, 0xbf, 0xf3, 0x99, 0x3a, 0x27, 0xec, 0x93, 0x21, 0x6f,
++ 0xc1, 0xe9, 0x7f, 0x27, 0xc1, 0x85, 0x73, 0x84, 0x3e, 0xe9, 0xf7, 0x17,
++ 0xc0, 0x60, 0x74, 0x5f, 0x53, 0xb0, 0xbb, 0x31, 0xed, 0x05, 0xe2, 0xda,
++ 0xdc, 0xec, 0x11, 0x8b, 0x6f, 0x6a, 0x42, 0x49, 0x8e, 0xb9, 0x83, 0xcf,
++ 0x18, 0x17, 0xec, 0x37, 0x03, 0xbc, 0xf7, 0x65, 0x6c, 0xe1, 0xfe, 0x2c,
++ 0xc8, 0xe1, 0x96, 0xd5, 0xcb, 0xe9, 0xdf, 0x8b, 0xbc, 0x1a, 0xeb, 0x01,
++ 0xea, 0xc6, 0x0c, 0xf5, 0xba, 0xf9, 0x6d, 0x63, 0x05, 0xb5, 0xe6, 0x2d,
++ 0xc4, 0x3e, 0xf2, 0xd3, 0xf6, 0x58, 0x5b, 0xf6, 0xdb, 0x02, 0xea, 0xd0,
++ 0x08, 0xee, 0x4b, 0xd1, 0xcd, 0x6f, 0x0c, 0x72, 0x01, 0x34, 0x17, 0xb1,
++ 0x76, 0xba, 0x9b, 0xf7, 0xbc, 0xe8, 0xf3, 0x81, 0x7b, 0xab, 0xd1, 0xfb,
++ 0xa6, 0xe9, 0x0f, 0xd2, 0xf2, 0xf7, 0x2f, 0x97, 0xa2, 0x15, 0x3a, 0x18,
++ 0x15, 0x00, 0x00, 0x00 };
+
+ static const u32 bnx2_TPAT_b09FwData[(0x0/4) + 1] = { 0x0 };
+ static const u32 bnx2_TPAT_b09FwRodata[(0x4/4) + 1] = {
+ 0x00000001, 0x00000000 };
+
+ static struct fw_info bnx2_tpat_fw_09 = {
+- /* Firmware version: 4.6.15 */
++ /* Firmware version: 4.4.26 */
+ .ver_major = 0x4,
+- .ver_minor = 0x6,
+- .ver_fix = 0xf,
++ .ver_minor = 0x4,
++ .ver_fix = 0x1a,
+
+ .start_addr = 0x08000488,
+
+ .text_addr = 0x08000400,
+- .text_len = 0x13a4,
++ .text_len = 0x1514,
+ .text_index = 0x0,
+ .gz_text = bnx2_TPAT_b09FwText,
+ .gz_text_len = sizeof(bnx2_TPAT_b09FwText),
+@@ -3643,868 +3709,871 @@
+ .data_index = 0x0,
+ .data = bnx2_TPAT_b09FwData,
+
+- .sbss_addr = 0x080017c0,
+- .sbss_len = 0x40,
++ .sbss_addr = 0x08001940,
++ .sbss_len = 0x48,
+ .sbss_index = 0x0,
+
+- .bss_addr = 0x08001800,
++ .bss_addr = 0x08001988,
+ .bss_len = 0x12b4,
+ .bss_index = 0x0,
+
+- .rodata_addr = 0x080017a4,
++ .rodata_addr = 0x08001914,
+ .rodata_len = 0x4,
+ .rodata_index = 0x0,
+ .rodata = bnx2_TPAT_b09FwRodata,
+ };
+
+ static u8 bnx2_TXP_b09FwText[] = {
+- 0xc5, 0x7b, 0x7d, 0x70, 0x1b, 0xe7, 0x79, 0xe7, 0xef, 0xc5, 0x02, 0xe4,
+- 0x02, 0x04, 0x41, 0x90, 0x82, 0x64, 0xf0, 0xca, 0x44, 0x58, 0x61, 0x41,
+- 0xc1, 0x26, 0x2d, 0x2f, 0x28, 0x50, 0x82, 0xcb, 0x55, 0x85, 0x4a, 0xb4,
+- 0x44, 0xc7, 0x74, 0x43, 0x3b, 0x6a, 0x4b, 0x67, 0x3c, 0x09, 0x2a, 0x51,
+- 0x16, 0x2d, 0xcb, 0x16, 0xed, 0xf8, 0x7a, 0xec, 0x9c, 0x27, 0xda, 0x50,
+- 0x1f, 0x96, 0x25, 0x10, 0x00, 0x3f, 0x64, 0xca, 0x9d, 0xce, 0x19, 0x26,
+- 0x29, 0x51, 0xb6, 0xf1, 0x21, 0xc7, 0x4a, 0x6a, 0xcf, 0x24, 0x11, 0x4e,
+- 0x96, 0x65, 0xd9, 0x89, 0x3f, 0x92, 0xf8, 0x7a, 0x4e, 0xa7, 0x37, 0xd5,
+- 0x48, 0xfe, 0x90, 0x2c, 0xf9, 0xa3, 0x69, 0x6f, 0x2a, 0xb5, 0x4e, 0xf7,
+- 0x9e, 0x67, 0x17, 0x94, 0x15, 0xd7, 0x9d, 0x9b, 0xf6, 0xfe, 0x38, 0xce,
+- 0x70, 0x00, 0xec, 0xbe, 0xfb, 0xbe, 0xcf, 0xf7, 0xf3, 0x7b, 0x9e, 0xf7,
+- 0xdd, 0x56, 0xc0, 0x83, 0xea, 0x5f, 0x3d, 0xfd, 0xc7, 0x87, 0x86, 0x1f,
+- 0x8e, 0x2d, 0x5b, 0xb1, 0x8c, 0xbe, 0x76, 0xa2, 0xa1, 0xc6, 0xc9, 0x37,
+- 0x57, 0x08, 0x20, 0xf5, 0x21, 0xfe, 0x43, 0x7f, 0x5f, 0xf9, 0x8f, 0x3d,
+- 0x66, 0xfd, 0x49, 0x80, 0x7f, 0x9e, 0x2e, 0xfe, 0x87, 0xec, 0xd0, 0x93,
+- 0x5d, 0x6b, 0x54, 0xc8, 0x92, 0x7e, 0x79, 0xd5, 0x26, 0x15, 0x48, 0x16,
+- 0xda, 0x42, 0x6b, 0xf1, 0x1b, 0xd3, 0x08, 0x38, 0xc1, 0xd7, 0xbf, 0xa2,
+- 0x7f, 0xb6, 0xe3, 0xc7, 0x2b, 0x95, 0x4f, 0xf3, 0x12, 0x64, 0xbf, 0x7e,
+- 0x10, 0xfe, 0x56, 0xc8, 0x2d, 0xf4, 0xcc, 0x5f, 0x2c, 0x2d, 0x39, 0xe1,
+- 0x9b, 0x9f, 0x0b, 0x86, 0x4b, 0xd7, 0xb0, 0x33, 0x3b, 0x84, 0x23, 0x71,
+- 0xa0, 0x76, 0x34, 0xa2, 0xed, 0x04, 0x72, 0x0e, 0x3d, 0x12, 0x3a, 0x81,
+- 0x10, 0x66, 0x0b, 0x2a, 0x1e, 0x2d, 0xc3, 0x70, 0xea, 0x21, 0x3c, 0x96,
+- 0xfe, 0x17, 0x33, 0xe4, 0xe2, 0x47, 0x86, 0xb0, 0x8b, 0xc6, 0xee, 0x4e,
+- 0x43, 0x0e, 0xea, 0x8f, 0x20, 0x98, 0x85, 0x5c, 0xaf, 0x0f, 0xa3, 0x38,
+- 0x1a, 0x3e, 0x3d, 0x07, 0xa5, 0xaf, 0x59, 0x52, 0x86, 0x80, 0xb6, 0xd4,
+- 0x5d, 0x42, 0xe9, 0x2f, 0x09, 0x25, 0xb1, 0x4d, 0x40, 0x16, 0x34, 0xee,
+- 0x86, 0x02, 0x7f, 0x0e, 0x63, 0x69, 0x41, 0xc6, 0x19, 0x89, 0xe7, 0x59,
+- 0x45, 0xf2, 0x16, 0x70, 0xaa, 0x1a, 0x76, 0x67, 0x79, 0x0d, 0x81, 0x9d,
+- 0xf1, 0x88, 0x7f, 0x06, 0x7c, 0x3f, 0x84, 0x11, 0x6b, 0x9c, 0x42, 0x5c,
+- 0x9b, 0xe6, 0x2e, 0xcd, 0x34, 0x0f, 0x69, 0xb5, 0x30, 0xfc, 0x4a, 0x10,
+- 0x10, 0x18, 0xd1, 0x1c, 0x48, 0xfa, 0xd7, 0x84, 0x9c, 0x50, 0x82, 0x9b,
+- 0xf1, 0xcf, 0xc4, 0x73, 0x32, 0xea, 0x82, 0x3d, 0x3e, 0x85, 0x5a, 0x54,
+- 0xfc, 0xb6, 0xd4, 0xa6, 0xd3, 0xa6, 0x79, 0x4a, 0x75, 0xe2, 0x10, 0xc9,
+- 0x67, 0xa4, 0xf0, 0xcf, 0x66, 0x85, 0x64, 0xb3, 0x4b, 0x9d, 0x5f, 0x5f,
+- 0x46, 0xde, 0x6f, 0x9a, 0x33, 0x74, 0x6f, 0x4f, 0x61, 0x5e, 0xce, 0xa6,
+- 0xe9, 0x50, 0x4d, 0x73, 0x93, 0xfa, 0x4f, 0xe6, 0xc6, 0xdf, 0x1a, 0x1b,
+- 0xc3, 0x33, 0x39, 0x3f, 0x9e, 0xcd, 0x26, 0x51, 0x48, 0x9b, 0x90, 0x74,
+- 0x27, 0x06, 0x47, 0x43, 0xd8, 0x56, 0xec, 0x46, 0x31, 0xad, 0xa4, 0xce,
+- 0xd0, 0x73, 0x1b, 0xe3, 0x2a, 0xee, 0x2f, 0xf6, 0x60, 0x2e, 0x0d, 0xd3,
+- 0xad, 0xab, 0x15, 0xb7, 0x88, 0x62, 0x4b, 0xb1, 0x17, 0xa5, 0xb4, 0x7a,
+- 0x7a, 0x44, 0x44, 0x86, 0x9b, 0x25, 0x27, 0xb6, 0x17, 0xdb, 0xf1, 0x40,
+- 0x31, 0x41, 0xcf, 0x98, 0xf8, 0x5a, 0xac, 0x85, 0xc6, 0x77, 0xe0, 0xe9,
+- 0x49, 0xd3, 0x8c, 0xc6, 0xfc, 0x18, 0x2c, 0x6a, 0x98, 0xcb, 0x39, 0x90,
+- 0x3a, 0xe4, 0x44, 0xea, 0x29, 0x60, 0xcb, 0x53, 0x1d, 0x98, 0xc9, 0x99,
+- 0xd8, 0xa8, 0x8d, 0x34, 0x3b, 0xe0, 0x42, 0xca, 0x2f, 0xe0, 0x52, 0x7d,
+- 0xd8, 0xec, 0xb7, 0x69, 0x3f, 0x23, 0x09, 0x6c, 0x7d, 0x2a, 0x8a, 0x77,
+- 0xd2, 0x06, 0xbe, 0xd6, 0x19, 0xc4, 0x70, 0x31, 0x80, 0x37, 0xd3, 0x01,
+- 0x5a, 0x43, 0xc3, 0x1b, 0x69, 0x99, 0xd6, 0x69, 0xc7, 0xc9, 0x34, 0x8f,
+- 0xe1, 0xb1, 0x5e, 0x0c, 0x14, 0x5b, 0xf0, 0x7a, 0x3a, 0x48, 0x6b, 0x06,
+- 0xf0, 0x2a, 0x8d, 0xbb, 0xb7, 0xa8, 0xe2, 0x34, 0x8d, 0x1b, 0x2c, 0x86,
+- 0xf0, 0x4a, 0xda, 0x4b, 0xb4, 0x06, 0x70, 0x22, 0x3d, 0x84, 0x9d, 0xe9,
+- 0xb6, 0xd3, 0x6b, 0x49, 0x86, 0xa1, 0x05, 0xbc, 0x0e, 0x5f, 0x7b, 0xd7,
+- 0xec, 0x0d, 0x58, 0xa6, 0x42, 0xeb, 0xcc, 0xaf, 0x3b, 0x84, 0x91, 0xf4,
+- 0xa9, 0xaa, 0xbf, 0x68, 0x78, 0x2c, 0x77, 0xd9, 0xfc, 0xf1, 0xd2, 0x16,
+- 0x1c, 0xc9, 0x02, 0x4f, 0xcf, 0x00, 0x33, 0x59, 0xc3, 0xac, 0xd7, 0x4d,
+- 0x73, 0xba, 0xb3, 0x9d, 0xe4, 0xa5, 0xf6, 0x6f, 0xa4, 0x51, 0xcf, 0x96,
+- 0x9d, 0xc0, 0x53, 0x4a, 0x7f, 0x05, 0x0e, 0xe4, 0xe7, 0x9c, 0xa8, 0x19,
+- 0x55, 0x7a, 0xf2, 0x50, 0x4e, 0x6f, 0x21, 0x8f, 0x3a, 0x94, 0x55, 0xfa,
+- 0x0c, 0xec, 0x30, 0x83, 0x7a, 0x6b, 0xa8, 0x5d, 0x32, 0xe1, 0x23, 0x5b,
+- 0x48, 0xb7, 0x9b, 0x66, 0xc3, 0x4a, 0xd3, 0x7c, 0xbd, 0x13, 0xa6, 0x43,
+- 0x57, 0x4f, 0x97, 0xa1, 0x56, 0x3e, 0x82, 0x3a, 0x7c, 0x02, 0x95, 0xaf,
+- 0x78, 0x11, 0x19, 0x0c, 0x4b, 0x91, 0xa1, 0xcb, 0xf4, 0x6c, 0x7d, 0x91,
+- 0xcc, 0x99, 0x78, 0x51, 0x47, 0x81, 0x62, 0x59, 0x86, 0x93, 0xf8, 0x69,
+- 0x1f, 0x35, 0x4d, 0xa7, 0xea, 0x85, 0x97, 0xe4, 0xbb, 0xfe, 0x80, 0x69,
+- 0xbe, 0xaf, 0xf9, 0x51, 0x43, 0xba, 0xb9, 0x65, 0xcc, 0xc4, 0xb4, 0x76,
+- 0x82, 0xe4, 0x29, 0x90, 0xea, 0x8b, 0xd3, 0x33, 0x01, 0x1a, 0x9f, 0xc0,
+- 0xfa, 0xd1, 0x20, 0x9e, 0xc9, 0xca, 0xf8, 0xf1, 0xd2, 0x28, 0xea, 0x68,
+- 0x2e, 0x0f, 0xc9, 0xaa, 0x96, 0xe4, 0x87, 0x22, 0x99, 0x5b, 0xd1, 0xb6,
+- 0x47, 0x14, 0xcf, 0x10, 0x8f, 0x41, 0x7c, 0xbf, 0x1c, 0xc0, 0x73, 0x65,
+- 0x3f, 0x8e, 0x96, 0x5b, 0x70, 0xbc, 0xac, 0xe1, 0x60, 0x4e, 0xd9, 0x5b,
+- 0x81, 0x89, 0x7a, 0x7d, 0x07, 0x1a, 0x96, 0x03, 0x6f, 0xe6, 0x63, 0xc8,
+- 0xe4, 0x4c, 0xb3, 0x40, 0x74, 0x7b, 0x88, 0x8f, 0x37, 0xf2, 0x5f, 0xc5,
+- 0xe1, 0x49, 0x27, 0x42, 0xd3, 0x01, 0x3c, 0x9b, 0x76, 0xe2, 0xfa, 0x8c,
+- 0x62, 0xe4, 0xa1, 0x46, 0xb7, 0x09, 0x35, 0x79, 0x83, 0x50, 0x72, 0x06,
+- 0x22, 0x21, 0x97, 0x70, 0xa0, 0xf5, 0xb0, 0x13, 0x6a, 0x29, 0x04, 0x57,
+- 0xab, 0x0c, 0xb5, 0xf5, 0x21, 0xc0, 0xe7, 0x40, 0x0d, 0xf9, 0xc6, 0xfa,
+- 0xf1, 0x28, 0x5d, 0x0b, 0xd0, 0x35, 0x7c, 0xb5, 0x16, 0xd2, 0x22, 0x09,
+- 0x24, 0x3b, 0x55, 0x42, 0xd2, 0x69, 0x9a, 0x92, 0xda, 0x81, 0xbb, 0x1e,
+- 0x37, 0xcd, 0xf0, 0x72, 0x1e, 0xef, 0x47, 0xb8, 0x44, 0x72, 0x68, 0x25,
+- 0xba, 0xb2, 0x44, 0x67, 0x96, 0xe8, 0xcc, 0x12, 0x9d, 0x59, 0x89, 0xec,
+- 0x46, 0xd1, 0x80, 0x47, 0x48, 0x5f, 0x21, 0xe2, 0xf1, 0x1d, 0x4b, 0x57,
+- 0xcf, 0x95, 0x83, 0xc4, 0x43, 0xc8, 0xe2, 0xe1, 0xe9, 0x9c, 0x80, 0x43,
+- 0x55, 0xfa, 0xce, 0x60, 0x35, 0xc2, 0x31, 0x25, 0x99, 0x47, 0x92, 0x9e,
+- 0x53, 0xf6, 0x1a, 0x50, 0x7a, 0x2a, 0x64, 0x03, 0x1b, 0xfd, 0x09, 0xcc,
+- 0x65, 0x5d, 0xa8, 0x53, 0x95, 0x10, 0xe9, 0x2c, 0x5a, 0xc1, 0x02, 0xdc,
+- 0xe7, 0xa7, 0x39, 0x1d, 0xb2, 0xb0, 0x63, 0xc9, 0x23, 0x88, 0x8c, 0x3b,
+- 0x30, 0xab, 0x49, 0xe4, 0xa3, 0x1a, 0xa4, 0x56, 0x5a, 0xae, 0x14, 0xa7,
+- 0x4f, 0x9a, 0x3f, 0x4b, 0x6b, 0x11, 0x3d, 0x34, 0x1f, 0xf9, 0x26, 0xcb,
+- 0x32, 0x4a, 0x34, 0x3c, 0x6a, 0xd1, 0x7b, 0xb4, 0xfc, 0x75, 0x61, 0xdb,
+- 0x90, 0x4e, 0x36, 0xa3, 0x84, 0x20, 0x94, 0x68, 0x48, 0x28, 0x5a, 0x52,
+- 0xf8, 0x31, 0x53, 0x7e, 0x83, 0xc6, 0x04, 0xae, 0x19, 0xd3, 0x87, 0x91,
+- 0xac, 0xc0, 0x5a, 0xd5, 0xc4, 0x1a, 0xad, 0x0f, 0x3b, 0xcb, 0xf3, 0xbe,
+- 0xc9, 0x31, 0xcc, 0xef, 0x9b, 0x49, 0x77, 0x63, 0x57, 0x36, 0x84, 0x9d,
+- 0x85, 0xa0, 0x6f, 0x3a, 0xcd, 0xf7, 0x54, 0xf2, 0x79, 0xbe, 0x17, 0xb8,
+- 0xe6, 0x5e, 0xcb, 0x35, 0xf7, 0x12, 0x18, 0x99, 0xf8, 0x1d, 0x8a, 0x23,
+- 0x0d, 0xd8, 0xa9, 0x7e, 0x4a, 0xf6, 0xa2, 0x26, 0x06, 0xd0, 0x8c, 0x33,
+- 0xfe, 0x76, 0xec, 0x9f, 0xea, 0xc5, 0xae, 0xa9, 0x65, 0x78, 0x6c, 0xa2,
+- 0x25, 0xe5, 0xd1, 0x49, 0x38, 0x9e, 0x70, 0x72, 0x40, 0x28, 0x43, 0x92,
+- 0x08, 0x47, 0x07, 0xc8, 0x7e, 0x5b, 0x1b, 0x4d, 0xf3, 0x44, 0x8c, 0xec,
+- 0x5b, 0x6b, 0xd3, 0xd6, 0x93, 0x00, 0x2a, 0x7d, 0x4a, 0xcf, 0xbb, 0xf0,
+- 0xe2, 0x76, 0xb2, 0xbb, 0x99, 0x18, 0x06, 0x24, 0x48, 0xed, 0x5e, 0xfc,
+- 0xbd, 0xf9, 0x94, 0x93, 0xe5, 0x6e, 0xee, 0xd8, 0xa4, 0xed, 0x15, 0x1c,
+- 0xeb, 0x6a, 0xae, 0xc6, 0x13, 0x9e, 0x9f, 0x9f, 0x21, 0xdd, 0xd1, 0x3c,
+- 0x83, 0xb1, 0xb6, 0xc4, 0x20, 0x2e, 0x9b, 0x67, 0x36, 0xf4, 0x62, 0xe7,
+- 0xdc, 0x32, 0xec, 0x9b, 0x70, 0x21, 0xd9, 0x28, 0xd0, 0xa0, 0x86, 0x2b,
+- 0xf7, 0x61, 0x19, 0x8c, 0x19, 0x7e, 0xae, 0x17, 0x07, 0xe7, 0xec, 0xdf,
+- 0xd9, 0xab, 0xbf, 0xe7, 0xe7, 0x3b, 0x4f, 0x3a, 0x65, 0x79, 0x72, 0xac,
+- 0x24, 0x15, 0xe8, 0x6d, 0x38, 0x32, 0x11, 0x20, 0xdd, 0x76, 0x0b, 0xe7,
+- 0xe1, 0x45, 0x3e, 0xcf, 0xe3, 0x26, 0x4e, 0x69, 0xa4, 0xe7, 0xec, 0x3a,
+- 0xe1, 0x39, 0xdc, 0x23, 0x5c, 0xa5, 0x3b, 0x45, 0xcd, 0xf4, 0x37, 0x85,
+- 0x7c, 0x38, 0x25, 0x6a, 0x4b, 0xed, 0x24, 0xfb, 0x7e, 0xe1, 0x3e, 0xac,
+- 0x84, 0x42, 0xe2, 0x11, 0xd2, 0xe7, 0x06, 0x21, 0x95, 0xe0, 0x77, 0xe8,
+- 0xc3, 0xc2, 0x51, 0xa2, 0x39, 0x2c, 0x1b, 0xe2, 0x75, 0x82, 0xa4, 0x37,
+- 0x18, 0x92, 0x3e, 0x84, 0x8d, 0x14, 0xff, 0x6f, 0x4d, 0xeb, 0x78, 0x34,
+- 0x5b, 0x4b, 0x31, 0x92, 0x7d, 0xff, 0x32, 0xad, 0xab, 0xe2, 0x31, 0xca,
+- 0x15, 0xb2, 0xbe, 0x0f, 0x3e, 0xf2, 0xb9, 0xd7, 0x63, 0xec, 0x8f, 0x40,
+- 0x21, 0x1b, 0xee, 0x7f, 0x54, 0x98, 0xe6, 0xd6, 0x88, 0xb9, 0x78, 0x5d,
+- 0xac, 0x2d, 0x7a, 0x12, 0xff, 0x68, 0xe6, 0x03, 0x43, 0xa8, 0xef, 0xa4,
+- 0x7b, 0xa3, 0x90, 0x5d, 0xfa, 0x2e, 0x1c, 0xa2, 0x5c, 0xe2, 0xd1, 0x29,
+- 0xbe, 0x8c, 0x86, 0xfb, 0x1f, 0x13, 0x1c, 0xf3, 0x95, 0xca, 0xb3, 0x18,
+- 0x39, 0x5d, 0x0b, 0x25, 0xb4, 0x46, 0xb4, 0x69, 0x75, 0x92, 0x91, 0x68,
+- 0xa6, 0x14, 0xe7, 0xee, 0x54, 0x86, 0xf7, 0x40, 0xf1, 0x5f, 0x00, 0xfb,
+- 0x2a, 0xe7, 0x93, 0x5d, 0x48, 0x58, 0x79, 0xc5, 0xc0, 0x4d, 0x57, 0xf3,
+- 0x8a, 0x4e, 0x76, 0x52, 0x8b, 0x3d, 0x44, 0xd7, 0xcb, 0x9a, 0x12, 0x9c,
+- 0x86, 0xb9, 0x78, 0x40, 0xe3, 0x7b, 0x3a, 0x76, 0x95, 0xcd, 0x90, 0xa4,
+- 0xb3, 0xac, 0x90, 0xaa, 0xd5, 0x99, 0x56, 0x3f, 0xf9, 0xc6, 0x6f, 0xcc,
+- 0x81, 0xb8, 0xac, 0xbd, 0x57, 0xf0, 0x93, 0xbc, 0xe0, 0x73, 0x16, 0xbf,
+- 0x2c, 0xff, 0x9a, 0x70, 0xe8, 0xbf, 0x31, 0xbf, 0x1d, 0x87, 0x6f, 0x71,
+- 0xd1, 0x99, 0xaa, 0xd3, 0xd1, 0x37, 0x3c, 0xba, 0xc3, 0x6c, 0x56, 0x1d,
+- 0x14, 0xab, 0x54, 0x8a, 0xed, 0xde, 0xc4, 0xa5, 0x4e, 0xb7, 0x78, 0xbd,
+- 0x33, 0xd8, 0xfb, 0x51, 0xc1, 0x4d, 0x7a, 0x46, 0xdf, 0xb6, 0x62, 0xc2,
+- 0xf9, 0x21, 0xd9, 0x5a, 0x0d, 0xc5, 0x55, 0x14, 0x5b, 0x7a, 0x2f, 0x50,
+- 0x2e, 0xba, 0x25, 0xe6, 0xfe, 0xe3, 0x1a, 0xdd, 0xf1, 0x55, 0x37, 0x1e,
+- 0xbc, 0x69, 0x36, 0xd1, 0x40, 0xb1, 0xdd, 0x8f, 0xd3, 0xf1, 0x1e, 0x8c,
+- 0x94, 0x6b, 0xc9, 0x0e, 0x9f, 0xaf, 0xec, 0x56, 0x5b, 0x7a, 0x2f, 0xa6,
+- 0x17, 0x53, 0x2c, 0xc1, 0x67, 0x85, 0x4e, 0xb5, 0x6f, 0x9b, 0x38, 0x71,
+- 0xab, 0x07, 0x71, 0x92, 0xab, 0x2c, 0x5f, 0x49, 0xe3, 0xd3, 0xc5, 0xaa,
+- 0x5a, 0x59, 0x2d, 0xb5, 0x0e, 0xc9, 0x52, 0xeb, 0x70, 0x0d, 0xc5, 0xe1,
+- 0xf3, 0x37, 0x0a, 0x9c, 0xba, 0x31, 0x92, 0xa8, 0x11, 0x6e, 0x9c, 0xe9,
+- 0x4b, 0x90, 0x9d, 0xb4, 0xa4, 0xdc, 0x3a, 0xc5, 0x8f, 0x51, 0x01, 0x49,
+- 0x4d, 0x60, 0xe7, 0x0c, 0x1e, 0x19, 0xd1, 0x7a, 0x61, 0xcc, 0xb1, 0x0d,
+- 0xb5, 0x63, 0x64, 0xae, 0x0f, 0x46, 0x59, 0x42, 0x3e, 0x40, 0xcc, 0x97,
+- 0x91, 0x72, 0xe9, 0xed, 0xdd, 0xf9, 0xc2, 0x5d, 0x2e, 0xdb, 0x87, 0x89,
+- 0xff, 0xec, 0xa4, 0x0f, 0x1e, 0xd6, 0xf3, 0x69, 0x92, 0x51, 0x3b, 0x9e,
+- 0x2f, 0x47, 0x29, 0xde, 0x69, 0x24, 0x17, 0x95, 0xe2, 0x45, 0x88, 0xec,
+- 0x4b, 0xc6, 0xc6, 0x09, 0xe5, 0x20, 0xc5, 0x85, 0x5c, 0x9e, 0x40, 0x51,
+- 0x32, 0xe0, 0xa7, 0xfc, 0xfd, 0x6a, 0x35, 0x06, 0x0c, 0xd2, 0xa7, 0x62,
+- 0x24, 0x81, 0x93, 0x0e, 0xa0, 0xa3, 0x59, 0x8f, 0xec, 0x6d, 0x26, 0x7d,
+- 0x34, 0x96, 0xdc, 0xd8, 0x3e, 0xd1, 0x84, 0x07, 0xa6, 0x3c, 0xd8, 0x3a,
+- 0x61, 0xe2, 0x52, 0x8c, 0x6d, 0x43, 0xe9, 0x27, 0x12, 0xbb, 0xeb, 0x48,
+- 0xae, 0xb7, 0xc6, 0x22, 0x09, 0xb7, 0x70, 0xa2, 0xb6, 0xd4, 0x47, 0x38,
+- 0x20, 0xc9, 0x7e, 0xa1, 0xd1, 0x1c, 0xa1, 0x9d, 0xda, 0xed, 0x48, 0x05,
+- 0x64, 0xb8, 0x4a, 0x5e, 0x8a, 0x25, 0xec, 0xc7, 0x7c, 0xef, 0xeb, 0xd8,
+- 0x58, 0xe3, 0x85, 0x94, 0x91, 0x91, 0x23, 0x0c, 0x80, 0x45, 0x35, 0xe8,
+- 0x69, 0x75, 0xd0, 0x7f, 0xc0, 0x37, 0x3b, 0xd9, 0xe2, 0x3b, 0x44, 0xf1,
+- 0x75, 0x4b, 0xd6, 0xc1, 0xeb, 0x30, 0x66, 0xa0, 0xb9, 0xfd, 0x78, 0x9a,
+- 0xe2, 0xf5, 0x43, 0x14, 0x7f, 0x8e, 0x94, 0xcb, 0x82, 0xe3, 0x89, 0xc5,
+- 0x4f, 0x96, 0x78, 0xcb, 0x12, 0x6f, 0x59, 0xe2, 0x8b, 0xe2, 0xc2, 0xd1,
+- 0x2c, 0xf3, 0xf1, 0x6b, 0xf2, 0xd1, 0x04, 0xf1, 0xee, 0xc6, 0x66, 0xa2,
+- 0xf7, 0xc1, 0xa9, 0x3a, 0x6c, 0x23, 0x7a, 0x8b, 0x9a, 0xa2, 0x3d, 0x27,
+- 0x4c, 0xec, 0x8f, 0x29, 0xc6, 0x4f, 0x29, 0x10, 0x39, 0x5a, 0x4d, 0xb3,
+- 0x4f, 0x63, 0x9e, 0x29, 0x5e, 0x39, 0x2c, 0x9e, 0xf7, 0x26, 0xe1, 0xc6,
+- 0x20, 0x3d, 0x33, 0x30, 0x85, 0xcf, 0x1c, 0xc4, 0x93, 0x9b, 0x78, 0xdc,
+- 0xa7, 0x29, 0x89, 0x1b, 0x28, 0xae, 0x9f, 0x53, 0x23, 0x95, 0x73, 0x12,
+- 0x7e, 0x9f, 0xe4, 0x31, 0xcc, 0xf2, 0xb8, 0x89, 0xf8, 0x79, 0x80, 0xf0,
+- 0x4e, 0x3d, 0xc5, 0xa5, 0xc2, 0x81, 0x48, 0xf4, 0x97, 0xc4, 0x7b, 0xa4,
+- 0x44, 0xb4, 0x8f, 0xda, 0xb4, 0xdf, 0xc7, 0xb4, 0xc7, 0x4c, 0xdc, 0x43,
+- 0xb4, 0x1f, 0x26, 0xda, 0x07, 0xb3, 0x2c, 0x0f, 0xce, 0x3b, 0x36, 0xfd,
+- 0x47, 0xca, 0xbc, 0xee, 0x97, 0xf1, 0x30, 0x4f, 0x7f, 0x13, 0x36, 0x4e,
+- 0xcd, 0xcb, 0xcb, 0x34, 0xbf, 0xad, 0x1d, 0x33, 0xff, 0x84, 0x64, 0xb6,
+- 0xb8, 0xc4, 0x72, 0x83, 0x51, 0xab, 0x47, 0x0e, 0x6e, 0xc1, 0x7d, 0x0e,
+- 0x78, 0xbc, 0x58, 0x50, 0xe2, 0x5c, 0x10, 0xc2, 0x31, 0xd2, 0xef, 0x71,
+- 0xca, 0x67, 0xcf, 0x97, 0xaf, 0xcd, 0x6f, 0xac, 0xeb, 0x49, 0xd2, 0xb1,
+- 0x92, 0x37, 0x28, 0xb6, 0xa5, 0xca, 0x49, 0xec, 0x9e, 0x42, 0x72, 0x56,
+- 0xfb, 0x6f, 0x14, 0x60, 0x16, 0x91, 0x7d, 0xd5, 0x26, 0xfd, 0xaa, 0x07,
+- 0x9b, 0x66, 0x02, 0x18, 0x2a, 0xaf, 0x41, 0x96, 0xe2, 0xcd, 0x36, 0x8a,
+- 0xcf, 0x1f, 0xc7, 0x92, 0x5b, 0x7d, 0x88, 0x90, 0x7e, 0x03, 0xb8, 0x8f,
+- 0x9e, 0xd9, 0x37, 0xc5, 0x3c, 0xf8, 0xab, 0x7a, 0x0e, 0x60, 0x0b, 0x5d,
+- 0xdb, 0x33, 0x25, 0xe3, 0x25, 0xed, 0x49, 0xc2, 0x34, 0x36, 0xc6, 0xb8,
+- 0x27, 0x0b, 0x3f, 0xb9, 0x27, 0x61, 0xc0, 0x48, 0xf4, 0x25, 0xfa, 0xbd,
+- 0xb9, 0xec, 0xf1, 0x8d, 0x4c, 0xe2, 0x7b, 0x8b, 0x75, 0x1f, 0x16, 0x10,
+- 0x1e, 0xbb, 0x4b, 0x8b, 0x90, 0xdd, 0x3b, 0x31, 0x5c, 0x76, 0xe0, 0x3b,
+- 0x33, 0x1e, 0x3c, 0x34, 0xf1, 0x99, 0x59, 0x13, 0x77, 0xe2, 0x8e, 0x56,
+- 0x0f, 0x1e, 0x9c, 0x49, 0x62, 0xef, 0x14, 0x42, 0xb5, 0xb1, 0x31, 0x8a,
+- 0xdd, 0x76, 0x3e, 0xa8, 0x23, 0xde, 0x1f, 0x9b, 0xf2, 0xfa, 0x06, 0x0f,
+- 0xb0, 0x0c, 0xd6, 0x04, 0xdd, 0x40, 0xa5, 0x36, 0x26, 0x61, 0xb3, 0x26,
+- 0x2d, 0xa8, 0x25, 0x43, 0x7f, 0x92, 0xe6, 0x9b, 0x86, 0xf4, 0xda, 0x62,
+- 0x44, 0x0e, 0x36, 0x4b, 0x95, 0xdc, 0x02, 0x34, 0xe1, 0xa1, 0xb9, 0x24,
+- 0xc6, 0xc8, 0x46, 0xb7, 0x4f, 0x8c, 0x7c, 0xaf, 0x91, 0x62, 0x88, 0xaf,
+- 0x43, 0x19, 0x7c, 0x53, 0xe8, 0x28, 0x44, 0xdc, 0xd8, 0x36, 0xe3, 0xf5,
+- 0x6d, 0x3d, 0x60, 0xae, 0x66, 0x7b, 0xba, 0x77, 0xae, 0x09, 0xf7, 0x4f,
+- 0xd1, 0xb5, 0x09, 0xb6, 0x61, 0xb2, 0xb5, 0x48, 0x2d, 0xf1, 0x16, 0x4e,
+- 0xba, 0x09, 0x33, 0x49, 0xb1, 0x3a, 0x92, 0x87, 0x1b, 0x5b, 0x2c, 0x5b,
+- 0xf0, 0x63, 0xf3, 0x94, 0x89, 0xb3, 0x5a, 0x14, 0x39, 0xb2, 0xeb, 0x83,
+- 0x53, 0xca, 0xe5, 0x6e, 0xc2, 0x3b, 0xef, 0x49, 0xca, 0xc1, 0x56, 0x29,
+- 0x89, 0xa6, 0xe5, 0x14, 0xe3, 0x9b, 0x4c, 0xf3, 0x9e, 0x8e, 0xb6, 0xa1,
+- 0xb7, 0x88, 0xe6, 0x46, 0x7d, 0x11, 0x2a, 0x8d, 0x4a, 0x8e, 0xb0, 0xf3,
+- 0x70, 0x8d, 0xe3, 0x46, 0x9c, 0x59, 0x48, 0x7a, 0x06, 0xc7, 0xf2, 0x80,
+- 0xaf, 0x29, 0x63, 0xe7, 0xb8, 0x26, 0xb2, 0x93, 0xc6, 0x4c, 0xd0, 0xd7,
+- 0x58, 0x82, 0xaf, 0xa6, 0x04, 0xbc, 0x40, 0xf1, 0x65, 0xc1, 0xf2, 0xdf,
+- 0x98, 0xa9, 0x26, 0x0b, 0x13, 0xfa, 0x5e, 0x9c, 0x54, 0x8c, 0x0a, 0x94,
+- 0xbd, 0x14, 0x2a, 0xf1, 0xc4, 0x9c, 0xd3, 0x77, 0x98, 0xf0, 0x5f, 0x93,
+- 0x1a, 0xc5, 0x1e, 0xd2, 0xe7, 0x0e, 0xb2, 0x85, 0xbf, 0x27, 0x7c, 0xf2,
+- 0x58, 0x26, 0x1c, 0xd2, 0x44, 0x3f, 0x4d, 0x0c, 0xec, 0x2a, 0x51, 0xcc,
+- 0x77, 0xac, 0xa5, 0x20, 0xa6, 0x44, 0x29, 0xad, 0x21, 0x9d, 0x71, 0xc1,
+- 0x58, 0x68, 0xeb, 0xe4, 0xfe, 0xec, 0x71, 0xd3, 0xa7, 0xaa, 0xf9, 0x12,
+- 0xe9, 0xec, 0xe1, 0xb2, 0x17, 0xc3, 0x84, 0x07, 0x16, 0x10, 0x8e, 0x7c,
+- 0x90, 0xec, 0x62, 0xfb, 0x84, 0x44, 0xf4, 0xf1, 0xb8, 0x24, 0x92, 0x8b,
+- 0x6c, 0x3c, 0xfa, 0xd0, 0x0c, 0xdb, 0x25, 0xd9, 0x11, 0xd9, 0xe2, 0x31,
+- 0xca, 0xf9, 0xcf, 0xff, 0x16, 0x06, 0x51, 0xfc, 0xc6, 0xd5, 0xdc, 0x6f,
+- 0xcb, 0x63, 0x64, 0x8a, 0x79, 0x56, 0x0e, 0xc2, 0x91, 0xc4, 0x2d, 0xda,
+- 0xaf, 0x28, 0x27, 0x30, 0xef, 0x84, 0x83, 0xa7, 0xa2, 0x94, 0x57, 0x08,
+- 0xdb, 0xc4, 0x2e, 0x99, 0x5b, 0x02, 0x2c, 0x03, 0xe6, 0xe7, 0x66, 0x89,
+- 0xf3, 0x67, 0x13, 0xe1, 0xdf, 0xff, 0x77, 0xbb, 0xdb, 0x64, 0xa6, 0x2c,
+- 0x3c, 0x4b, 0x38, 0x9b, 0xec, 0x29, 0x75, 0xd5, 0x7e, 0x1e, 0x34, 0xcf,
+- 0x04, 0x38, 0x5f, 0x37, 0x21, 0x75, 0xd5, 0x16, 0xd8, 0x96, 0xb0, 0x58,
+- 0xeb, 0xd8, 0xf9, 0xa0, 0x1f, 0x6c, 0x0f, 0xd1, 0x6b, 0xec, 0xc1, 0x43,
+- 0x34, 0xf9, 0xb1, 0x75, 0x8e, 0xed, 0xd7, 0xfc, 0x64, 0xb1, 0xfe, 0x2f,
+- 0xe6, 0x95, 0x95, 0xea, 0xc1, 0x5f, 0xe1, 0xeb, 0x74, 0x3d, 0x80, 0xef,
+- 0x90, 0x1f, 0xdd, 0x47, 0x7c, 0x6e, 0xed, 0x7c, 0xc0, 0xf2, 0xdb, 0xad,
+- 0xe5, 0xdf, 0xa3, 0xeb, 0x2c, 0xef, 0x6e, 0x8a, 0x73, 0x1a, 0xf6, 0x65,
+- 0x2b, 0x9c, 0x87, 0xc8, 0xe6, 0xe3, 0xf8, 0x4b, 0x8a, 0xb3, 0xc7, 0xca,
+- 0x8c, 0xc9, 0x12, 0x16, 0x1e, 0xfb, 0x61, 0xb9, 0x1d, 0x3f, 0x20, 0x9f,
+- 0x7c, 0x9e, 0x62, 0xee, 0xf7, 0x2d, 0x9c, 0xe6, 0x14, 0x8f, 0xa6, 0x55,
+- 0x3c, 0x4d, 0x58, 0x7f, 0x5f, 0x21, 0x84, 0x23, 0xe9, 0xf0, 0xde, 0x0b,
+- 0x50, 0x5e, 0x20, 0x79, 0xf9, 0xf6, 0x52, 0x8d, 0x76, 0x38, 0xad, 0xe4,
+- 0x81, 0xa0, 0x6f, 0x4f, 0xc1, 0xef, 0x1b, 0x49, 0x07, 0x7c, 0x23, 0x84,
+- 0x81, 0x76, 0xa6, 0x5b, 0x7c, 0x3b, 0x0b, 0xcb, 0x11, 0x6a, 0x82, 0xb1,
+- 0x88, 0x72, 0xc2, 0x7d, 0x13, 0x1b, 0x90, 0x6a, 0xb4, 0xe3, 0xfc, 0x03,
+- 0x53, 0x1c, 0x83, 0xdb, 0x52, 0x37, 0x3a, 0xbe, 0x5e, 0xd5, 0xb7, 0x1f,
+- 0x43, 0x74, 0xad, 0xa1, 0x03, 0xbe, 0x37, 0xad, 0x58, 0x0b, 0x3c, 0x4f,
+- 0xb6, 0xf5, 0x50, 0xc7, 0x6f, 0xcc, 0x64, 0xd5, 0xb6, 0x7e, 0x30, 0xe9,
+- 0xa4, 0xf8, 0x6a, 0x9a, 0x47, 0x3b, 0x04, 0x02, 0x1d, 0xdd, 0x30, 0x9a,
+- 0xe6, 0x6b, 0xc8, 0x64, 0xbe, 0xb9, 0x83, 0x22, 0x94, 0x7a, 0x0b, 0x12,
+- 0x0b, 0x28, 0xb5, 0x74, 0xac, 0xae, 0xde, 0x93, 0xf1, 0x9d, 0x09, 0x37,
+- 0x52, 0x4d, 0x7e, 0xcc, 0x12, 0x36, 0xd9, 0x68, 0xc5, 0xa2, 0xb6, 0xd3,
+- 0xc7, 0xa9, 0x96, 0x09, 0x7d, 0xc3, 0x4f, 0xbc, 0x26, 0x21, 0x77, 0x10,
+- 0x90, 0xa8, 0xd2, 0xc4, 0xbf, 0x73, 0x73, 0x51, 0xec, 0x2e, 0xff, 0xd8,
+- 0x61, 0xe7, 0x13, 0x25, 0x9f, 0xc4, 0x4f, 0x28, 0x2f, 0xd2, 0xbd, 0xec,
+- 0x9b, 0x66, 0xc8, 0xb2, 0x33, 0x81, 0xc7, 0x97, 0x45, 0xf6, 0xfe, 0x4f,
+- 0xc7, 0x75, 0xc4, 0x17, 0xc9, 0x2a, 0x6b, 0xd5, 0x8e, 0x0d, 0xd7, 0xa9,
+- 0x0f, 0xe2, 0x2f, 0xfd, 0x2c, 0xcb, 0x61, 0x91, 0xa5, 0x3a, 0xf5, 0x8c,
+- 0x0b, 0x0d, 0x41, 0x35, 0x8b, 0x17, 0xfa, 0xf8, 0x5a, 0xc0, 0xf7, 0x44,
+- 0x3a, 0xe9, 0x08, 0xa8, 0xf0, 0xbb, 0xf4, 0x6e, 0xf1, 0x04, 0x61, 0xc0,
+- 0x89, 0x74, 0x8f, 0x98, 0x28, 0xdc, 0x29, 0x8c, 0xfc, 0x37, 0x85, 0x31,
+- 0x9b, 0x12, 0x46, 0xa1, 0x9f, 0x3e, 0x37, 0x88, 0xc9, 0xc2, 0xb0, 0xd8,
+- 0x5d, 0xe0, 0x79, 0x49, 0x27, 0x34, 0xf7, 0x0f, 0x29, 0xc6, 0xfe, 0x80,
+- 0x62, 0xec, 0x31, 0x8a, 0xb1, 0xcf, 0x93, 0x5d, 0x7f, 0xff, 0x2a, 0x96,
+- 0x65, 0x5b, 0x4e, 0x32, 0x06, 0xf1, 0xfd, 0xbc, 0xf4, 0x12, 0xe9, 0x95,
+- 0x65, 0xf6, 0x13, 0xb2, 0x61, 0x96, 0xc5, 0x7f, 0xe6, 0x9c, 0x40, 0xfa,
+- 0xf8, 0xd0, 0xb2, 0xd9, 0xc7, 0x97, 0x31, 0x66, 0x1a, 0x16, 0x3b, 0x98,
+- 0xae, 0x5a, 0xaa, 0xdb, 0x55, 0xc2, 0x21, 0xd9, 0x61, 0xb1, 0xb1, 0xc0,
+- 0xd7, 0xf7, 0xe1, 0x3e, 0xaa, 0xff, 0xb6, 0xc6, 0xc2, 0x89, 0x6e, 0xc2,
+- 0x48, 0x17, 0x54, 0x73, 0x71, 0x34, 0x46, 0x98, 0xe1, 0xc6, 0x2b, 0x54,
+- 0xab, 0x22, 0xb9, 0x2d, 0xae, 0xe4, 0xf3, 0x76, 0x5e, 0xcd, 0xa5, 0xc1,
+- 0x75, 0x3a, 0x1a, 0x9c, 0xaa, 0x72, 0x24, 0x89, 0xf0, 0xde, 0xb8, 0x03,
+- 0x46, 0x8d, 0xee, 0xc2, 0x80, 0x55, 0x17, 0xae, 0x41, 0x66, 0x42, 0xe0,
+- 0x65, 0xf2, 0x01, 0x17, 0xc9, 0xe8, 0x50, 0x27, 0x3e, 0x23, 0xb5, 0x0a,
+- 0xaa, 0xe3, 0x4f, 0x9f, 0xa5, 0x9c, 0x73, 0x17, 0xe5, 0xd6, 0x89, 0xec,
+- 0x0a, 0x04, 0x3b, 0x64, 0x34, 0x74, 0x38, 0xf1, 0x8d, 0xd2, 0xef, 0xe3,
+- 0x4c, 0x63, 0xe4, 0xe0, 0x0b, 0xf0, 0xf8, 0x5e, 0x9a, 0x64, 0x7a, 0xf0,
+- 0xbd, 0x3a, 0xaa, 0xd7, 0xb6, 0x12, 0x4e, 0x1a, 0x27, 0x1a, 0x7a, 0x3a,
+- 0x22, 0x3d, 0xb7, 0x09, 0xf8, 0x6b, 0xf5, 0x1a, 0x8c, 0xb7, 0xfa, 0xe0,
+- 0x57, 0x53, 0xe2, 0xd5, 0x02, 0xe5, 0x0d, 0xc7, 0x37, 0xc5, 0x5b, 0xb3,
+- 0x3a, 0xf6, 0x96, 0xfb, 0xc5, 0x2f, 0x66, 0x65, 0x90, 0x4e, 0x28, 0x3e,
+- 0x69, 0xc8, 0x10, 0x5d, 0x2e, 0xc2, 0x42, 0x2f, 0xdf, 0x21, 0x70, 0x9d,
+- 0x9a, 0xc4, 0x77, 0x56, 0xb0, 0xcd, 0xdb, 0xb1, 0x2b, 0x98, 0x51, 0x42,
+- 0x49, 0x47, 0xb7, 0x08, 0x52, 0xec, 0x6a, 0xc8, 0xf4, 0x88, 0x06, 0xc2,
+- 0x9e, 0x0b, 0xa7, 0x37, 0x88, 0x05, 0x25, 0xc6, 0x9a, 0xf0, 0x2f, 0x24,
+- 0xd9, 0x2c, 0x2c, 0x7d, 0x20, 0xd9, 0x18, 0xdf, 0xc5, 0xb6, 0x43, 0x39,
+- 0x4a, 0xf6, 0xfd, 0x7a, 0x32, 0x89, 0x5b, 0x3b, 0xd6, 0x20, 0x64, 0xd9,
+- 0xc7, 0xb0, 0xd8, 0x47, 0xf2, 0x4b, 0x5a, 0xfd, 0x07, 0xbf, 0xef, 0xc0,
+- 0x24, 0x5c, 0x7e, 0x1d, 0x21, 0x89, 0x72, 0x43, 0xa9, 0x23, 0x32, 0xf8,
+- 0x96, 0xe8, 0x15, 0xa3, 0x85, 0x80, 0x2f, 0x9d, 0x86, 0xbf, 0x8e, 0x74,
+- 0x9c, 0x26, 0x1d, 0xef, 0x21, 0x1d, 0xef, 0xf9, 0x12, 0x1d, 0xef, 0x24,
+- 0x1d, 0xef, 0x2f, 0xfc, 0x9d, 0xa5, 0x33, 0xa7, 0xae, 0x63, 0x94, 0x72,
+- 0xee, 0x78, 0xab, 0xcd, 0x4f, 0x81, 0x30, 0xea, 0x9e, 0x58, 0xaf, 0x13,
+- 0x1e, 0x9d, 0x62, 0x66, 0x2f, 0x3d, 0xd3, 0x5c, 0xb5, 0x65, 0xbf, 0xef,
+- 0xc9, 0x74, 0xb7, 0x78, 0xd2, 0xf2, 0x2b, 0xc6, 0x8d, 0x49, 0x34, 0xaa,
+- 0x3d, 0x34, 0x17, 0xdb, 0xca, 0x9d, 0x02, 0x4f, 0xb1, 0xbd, 0x7c, 0x93,
+- 0x04, 0xcf, 0x36, 0x93, 0x12, 0x28, 0xb2, 0xdd, 0xf4, 0xd3, 0x6f, 0xb6,
+- 0x9d, 0x0d, 0xa2, 0xb1, 0xf8, 0x45, 0xfb, 0x81, 0xdf, 0xa9, 0xb3, 0xfd,
+- 0xb0, 0x1d, 0x0d, 0x0b, 0x67, 0x91, 0x7c, 0x96, 0xe6, 0x1f, 0x21, 0xba,
+- 0x77, 0xa6, 0xf7, 0x3b, 0x99, 0x36, 0x59, 0x67, 0x3b, 0x62, 0xfb, 0xb9,
+- 0x48, 0xb4, 0xb2, 0xcd, 0x5f, 0xed, 0xd9, 0xd0, 0xdf, 0xef, 0x4a, 0x50,
+- 0xb7, 0x38, 0x6d, 0x1e, 0x38, 0x87, 0x73, 0xce, 0xe6, 0x78, 0xea, 0xb7,
+- 0x6a, 0xba, 0x63, 0x57, 0x73, 0x39, 0xe7, 0x75, 0xc8, 0x0b, 0xf4, 0x80,
+- 0xfe, 0x9d, 0xd6, 0x2b, 0x34, 0xdf, 0x10, 0xb4, 0x15, 0x90, 0x03, 0xfa,
+- 0xa4, 0x3e, 0xd9, 0x4a, 0xf1, 0x96, 0xe6, 0x94, 0x33, 0x80, 0x9a, 0x11,
+- 0xd8, 0x99, 0x10, 0x84, 0x47, 0x17, 0x91, 0xbf, 0xc1, 0xf0, 0xe8, 0x4a,
+- 0x4f, 0x92, 0xee, 0x2d, 0x25, 0x7c, 0xbe, 0x58, 0xdf, 0x06, 0x33, 0x0b,
+- 0xb9, 0x41, 0x1f, 0xc4, 0x27, 0xa3, 0x61, 0xff, 0x79, 0x28, 0xa9, 0xb3,
+- 0x92, 0x52, 0xa1, 0x3c, 0x35, 0x34, 0x22, 0x94, 0xc1, 0xcb, 0x42, 0x49,
+- 0x96, 0xac, 0x1e, 0xcf, 0x36, 0xb4, 0x5b, 0x58, 0x7c, 0x10, 0xd1, 0x02,
+- 0x70, 0x1b, 0x01, 0xbc, 0x7b, 0x6e, 0x26, 0x9b, 0xd4, 0x3e, 0xe2, 0xd8,
+- 0x9e, 0x3c, 0x43, 0x54, 0x2f, 0xce, 0x70, 0xcf, 0x68, 0x5b, 0xb5, 0x67,
+- 0x34, 0x68, 0xf5, 0x8c, 0xce, 0x4b, 0x4a, 0x62, 0xbe, 0x67, 0x74, 0x05,
+- 0x3c, 0x97, 0xd2, 0xef, 0xad, 0xce, 0xb7, 0xb4, 0x3a, 0x5f, 0x5b, 0x01,
+- 0x22, 0x9a, 0x31, 0xcc, 0x1a, 0xd5, 0x43, 0xfc, 0x26, 0x1d, 0xae, 0x88,
+- 0xda, 0x73, 0x18, 0x21, 0x44, 0xa9, 0xde, 0xbd, 0x9e, 0xf2, 0xa0, 0x3b,
+- 0xb3, 0x03, 0x33, 0x9a, 0xd2, 0x37, 0x00, 0xb6, 0x9d, 0x6e, 0xec, 0xa3,
+- 0x18, 0xba, 0xb7, 0xcc, 0xf5, 0xc8, 0xb0, 0x38, 0xcb, 0x76, 0xe3, 0xb4,
+- 0xa5, 0x66, 0xaf, 0xff, 0x70, 0x75, 0xfd, 0x21, 0x6b, 0xfd, 0x0b, 0x92,
+- 0xd2, 0x5f, 0x5d, 0x5f, 0xfb, 0x33, 0xa1, 0xa4, 0x68, 0xfd, 0x9e, 0x3d,
+- 0xb4, 0xbe, 0x4b, 0xe5, 0xb5, 0x1f, 0xe6, 0xb5, 0xe9, 0x73, 0x08, 0xd7,
+- 0x93, 0xdd, 0xbc, 0x57, 0x90, 0xc5, 0xbb, 0xb9, 0x35, 0xd8, 0x35, 0xb3,
+- 0x06, 0x3b, 0xc9, 0xdf, 0xb6, 0x6a, 0x0d, 0x54, 0xa7, 0xa1, 0xde, 0xa7,
+- 0xe2, 0xb2, 0x23, 0x22, 0xa4, 0xf5, 0xed, 0x2d, 0x84, 0x41, 0x4e, 0x34,
+- 0xcb, 0xf8, 0xd4, 0x1c, 0x50, 0xd7, 0xf4, 0x39, 0x91, 0xfc, 0x7d, 0x0f,
+- 0xfe, 0x5c, 0x22, 0xff, 0x7d, 0x67, 0x81, 0x40, 0xd2, 0x63, 0xd5, 0x1c,
+- 0x09, 0xe1, 0x29, 0xfe, 0xd8, 0x69, 0xdb, 0x7b, 0x2b, 0x7c, 0x8d, 0x68,
+- 0x68, 0x50, 0x6f, 0x40, 0x43, 0xa3, 0x6c, 0x38, 0xa8, 0x8e, 0x59, 0x4f,
+- 0x21, 0xd1, 0xcc, 0xf5, 0x51, 0x3c, 0x35, 0x71, 0x65, 0xf9, 0xdf, 0x9b,
+- 0x89, 0xeb, 0xf8, 0x39, 0x02, 0x15, 0x56, 0x4c, 0xfc, 0xb2, 0x39, 0xe2,
+- 0xe4, 0xbf, 0x6d, 0x54, 0x97, 0xd6, 0x51, 0xf0, 0xed, 0xc1, 0x9e, 0xac,
+- 0x92, 0xda, 0x43, 0x75, 0xe5, 0xfe, 0x48, 0x5b, 0xcf, 0x26, 0x51, 0x83,
+- 0xd0, 0xc2, 0xf0, 0xe0, 0x00, 0x92, 0xcd, 0xf5, 0x55, 0x3a, 0x1e, 0x46,
+- 0xb3, 0x8b, 0x9e, 0xe3, 0x79, 0xae, 0xb1, 0xa7, 0x22, 0xd9, 0x13, 0xdf,
+- 0xe7, 0xef, 0x57, 0xef, 0xcb, 0xbf, 0xa3, 0x4f, 0xae, 0xfa, 0xaf, 0x4b,
+- 0xbf, 0xec, 0xfa, 0xb1, 0x2f, 0xb9, 0xfe, 0x6f, 0xd5, 0xe7, 0x95, 0x46,
+- 0xa7, 0x95, 0xfb, 0x93, 0x0e, 0xee, 0x4b, 0x3a, 0xf5, 0x42, 0xd7, 0x2e,
+- 0xf5, 0x3f, 0x51, 0xcc, 0xe2, 0x7e, 0x04, 0xe7, 0xdb, 0x33, 0x56, 0x3f,
+- 0xe2, 0xf8, 0x6f, 0x61, 0x4f, 0x8e, 0x1d, 0x6e, 0x51, 0x37, 0x6e, 0x98,
+- 0x4d, 0xea, 0x1f, 0x51, 0x7d, 0xb2, 0x03, 0x03, 0x31, 0x0d, 0x63, 0x59,
+- 0xa5, 0xef, 0x0e, 0xa8, 0xc9, 0x3b, 0x05, 0x4d, 0x54, 0x72, 0x0b, 0x69,
+- 0xbc, 0x7a, 0x4f, 0x33, 0xa8, 0xe6, 0xaa, 0xa0, 0x96, 0x62, 0x8f, 0x53,
+- 0xf5, 0xcb, 0x28, 0x05, 0x64, 0x67, 0x29, 0x28, 0xd7, 0x94, 0x5a, 0xe4,
+- 0x5a, 0x1a, 0xe7, 0x1d, 0x57, 0x2e, 0xdf, 0x81, 0x1d, 0xb8, 0xbc, 0xdc,
+- 0x63, 0x34, 0xeb, 0x8a, 0xbf, 0x59, 0xda, 0x81, 0x5d, 0x31, 0x7e, 0xb6,
+- 0x9b, 0x6a, 0x2f, 0x88, 0xc6, 0x0c, 0x21, 0x5c, 0x5d, 0x60, 0x37, 0xd5,
+- 0x97, 0x4b, 0x1c, 0x6a, 0xcf, 0xaf, 0x85, 0x53, 0x76, 0x97, 0x20, 0x7c,
+- 0x19, 0x07, 0x0e, 0x76, 0xc2, 0xed, 0x5e, 0xa1, 0x0c, 0x9e, 0x10, 0xc3,
+- 0x78, 0x36, 0x16, 0xe9, 0xdb, 0x2c, 0x42, 0xb2, 0x87, 0xee, 0xb9, 0x32,
+- 0x10, 0x72, 0xc6, 0x70, 0xbb, 0x56, 0x28, 0x41, 0x87, 0x48, 0x62, 0x40,
+- 0x55, 0xb5, 0x71, 0xc8, 0xb4, 0x26, 0x44, 0x6d, 0x46, 0xb9, 0x7c, 0x96,
+- 0xb0, 0xd1, 0x95, 0xa5, 0xc3, 0xe8, 0x58, 0x1e, 0xd9, 0xdb, 0xef, 0x50,
+- 0x65, 0xc2, 0x6c, 0xc2, 0x99, 0xf1, 0xe2, 0xa6, 0x03, 0xf3, 0xfd, 0x19,
+- 0xd3, 0xfc, 0x38, 0x56, 0xb9, 0x97, 0x44, 0x28, 0xd7, 0x97, 0xa2, 0xb2,
+- 0x97, 0xf0, 0x79, 0xdb, 0x01, 0xc6, 0x4b, 0x9c, 0x0f, 0x2a, 0x64, 0x37,
+- 0xed, 0xc4, 0x63, 0x1f, 0x66, 0xd2, 0x8c, 0x9f, 0x74, 0x4c, 0x53, 0x6d,
+- 0xa3, 0x8e, 0xb6, 0x50, 0xae, 0x4f, 0x60, 0x2e, 0xcd, 0x7d, 0x9c, 0x41,
+- 0x92, 0x71, 0x3f, 0xd1, 0xbf, 0x81, 0xea, 0xda, 0x14, 0xc5, 0x2b, 0x96,
+- 0xf1, 0x00, 0xf7, 0x6b, 0xa9, 0x96, 0xfe, 0x79, 0xd7, 0xd7, 0xc6, 0x20,
+- 0xbb, 0xf5, 0xd7, 0xba, 0xae, 0x3f, 0x80, 0x46, 0xca, 0xe7, 0x3a, 0x55,
+- 0x2e, 0x88, 0x46, 0x22, 0xda, 0x79, 0x44, 0x82, 0x2f, 0x93, 0x3e, 0x46,
+- 0x54, 0x60, 0xa7, 0x55, 0x33, 0x3b, 0x61, 0x14, 0xd8, 0xa6, 0xe0, 0xae,
+- 0xed, 0x6c, 0xc4, 0xfb, 0xb9, 0xa8, 0xd5, 0x0b, 0x32, 0xa8, 0x8e, 0x79,
+- 0x49, 0x53, 0x52, 0x79, 0x7a, 0x6e, 0xa3, 0xff, 0x7f, 0xed, 0xa9, 0x8b,
+- 0x43, 0xae, 0x53, 0xd9, 0xbf, 0xfe, 0xdc, 0x73, 0x96, 0x6c, 0xf4, 0xae,
+- 0xc9, 0xbf, 0xf0, 0x7c, 0x12, 0xcf, 0x7b, 0x3e, 0x8a, 0x9b, 0x66, 0x82,
+- 0x70, 0x65, 0x3f, 0xd5, 0xcd, 0x1f, 0x8f, 0x1a, 0x9e, 0xf3, 0x71, 0xee,
+- 0xe9, 0x3a, 0xf1, 0x07, 0xf4, 0xfb, 0xe9, 0x51, 0x19, 0xb7, 0x16, 0x9b,
+- 0xe1, 0x1a, 0x93, 0xc8, 0x3f, 0xd7, 0x52, 0xae, 0x72, 0xe0, 0x9e, 0xe8,
+- 0x51, 0x54, 0x02, 0x0e, 0x1a, 0xb3, 0x9f, 0x7e, 0x73, 0x6f, 0xea, 0x71,
+- 0x6c, 0xf6, 0xcf, 0x7a, 0xde, 0x8f, 0x33, 0xbd, 0x15, 0xa6, 0x97, 0x72,
+- 0xe4, 0xed, 0xd8, 0x78, 0x07, 0x0c, 0x9f, 0x6e, 0xfd, 0xbb, 0x5f, 0xee,
+- 0x6c, 0xc2, 0xe1, 0x5c, 0x33, 0x5e, 0xcc, 0x19, 0xee, 0x9f, 0x76, 0x46,
+- 0x31, 0x38, 0x6a, 0xe2, 0x15, 0xcd, 0x18, 0xae, 0x25, 0x3b, 0x4f, 0x50,
+- 0xad, 0x14, 0x5e, 0xae, 0xf8, 0x2f, 0x0b, 0x44, 0x24, 0x44, 0x86, 0x08,
+- 0x2c, 0xde, 0x4d, 0xa1, 0x2b, 0x55, 0xaf, 0x47, 0xb4, 0xd7, 0x85, 0x59,
+- 0x73, 0x6f, 0xa7, 0x93, 0x68, 0x00, 0xd6, 0x51, 0x4c, 0x9e, 0x4b, 0x47,
+- 0x71, 0x6b, 0x44, 0xc6, 0xfa, 0xa2, 0x86, 0x17, 0xd3, 0x5e, 0xdc, 0x55,
+- 0x8c, 0x13, 0x86, 0xf6, 0x13, 0xed, 0x09, 0x94, 0xd3, 0x01, 0x7c, 0xbd,
+- 0xd8, 0x42, 0xf2, 0x0e, 0x62, 0x6d, 0x91, 0x31, 0x16, 0xe7, 0x67, 0xdd,
+- 0xbd, 0x31, 0xde, 0x82, 0x1e, 0x8a, 0xdf, 0xb3, 0x69, 0xb8, 0xb7, 0xc7,
+- 0x43, 0xe8, 0x2e, 0x46, 0x51, 0x24, 0x2c, 0x76, 0x3b, 0xcd, 0x79, 0x17,
+- 0xe9, 0xa4, 0x9d, 0xea, 0xfb, 0x25, 0x11, 0x42, 0xa8, 0x45, 0xaf, 0x18,
+- 0x26, 0xcc, 0x94, 0x28, 0x36, 0xe1, 0xfc, 0x18, 0xdb, 0xf9, 0x5b, 0x5d,
+- 0xbb, 0x72, 0x7e, 0x84, 0x8a, 0xb8, 0x49, 0x06, 0xb6, 0x51, 0x95, 0x97,
+- 0x2a, 0x12, 0xbd, 0xfb, 0x3a, 0xed, 0x7e, 0xec, 0x0d, 0xc5, 0xcf, 0xf9,
+- 0x6d, 0x20, 0x3d, 0x7d, 0x72, 0x60, 0xd6, 0x73, 0x85, 0x64, 0xe0, 0xd3,
+- 0x7f, 0xd4, 0xf5, 0xc6, 0x01, 0x20, 0x3a, 0xc5, 0xbc, 0x71, 0x7c, 0x0d,
+- 0x27, 0x28, 0xbe, 0xb6, 0xcb, 0xf8, 0xb5, 0x49, 0xb5, 0x64, 0x68, 0x86,
+- 0x7b, 0xff, 0xaa, 0x97, 0xe8, 0xf0, 0x23, 0x49, 0x6b, 0xdf, 0x56, 0xfc,
+- 0xa1, 0xb9, 0x71, 0x61, 0x10, 0x5f, 0x8b, 0xd8, 0xb2, 0x7a, 0x9d, 0x74,
+- 0x38, 0x3d, 0xd6, 0x8c, 0xb9, 0x31, 0xee, 0xad, 0x9c, 0xea, 0x3a, 0x34,
+- 0x69, 0x62, 0x9d, 0x66, 0x78, 0x7e, 0xda, 0x79, 0x03, 0x1e, 0x38, 0x30,
+- 0x72, 0xba, 0x86, 0xf4, 0x7a, 0x59, 0xbb, 0x1b, 0x8f, 0x4e, 0xe1, 0xab,
+- 0xcd, 0xc0, 0x23, 0x41, 0x70, 0xff, 0x59, 0x09, 0x1d, 0x41, 0xa4, 0x67,
+- 0x3b, 0x22, 0x7e, 0x55, 0x28, 0xda, 0x2b, 0x14, 0xab, 0xea, 0x08, 0x3b,
+- 0xdc, 0x46, 0xb5, 0x7c, 0x0d, 0x79, 0xf0, 0x5d, 0x45, 0x27, 0xc9, 0x28,
+- 0x88, 0xf2, 0x58, 0x0d, 0x24, 0xf2, 0x93, 0x0b, 0x2a, 0xd6, 0x35, 0x90,
+- 0xac, 0x25, 0x21, 0x93, 0x9e, 0xdb, 0x71, 0x68, 0x74, 0x5e, 0x56, 0x5e,
+- 0xdc, 0x42, 0x32, 0x7c, 0x76, 0xd4, 0xdc, 0xa1, 0xc6, 0x02, 0x24, 0x6b,
+- 0x3f, 0xd1, 0x37, 0x2f, 0x27, 0x96, 0xdf, 0xbc, 0x9c, 0xee, 0xc6, 0xae,
+- 0x39, 0x96, 0xdb, 0xbf, 0x47, 0x5e, 0xb3, 0x96, 0xdd, 0xad, 0x9b, 0x8c,
+- 0xa2, 0xf9, 0xc0, 0x55, 0xd9, 0x31, 0x7d, 0x8f, 0x10, 0x1f, 0xdf, 0xf3,
+- 0xad, 0x8c, 0x0c, 0x5e, 0x14, 0x5e, 0xa2, 0xc7, 0x4f, 0xba, 0x39, 0xeb,
+- 0x62, 0x0c, 0x4e, 0x32, 0xb9, 0x2a, 0xe3, 0x20, 0xc9, 0x38, 0x38, 0xc5,
+- 0xb2, 0xfe, 0x11, 0xc9, 0x1a, 0x78, 0x83, 0x70, 0xd7, 0xcd, 0xb1, 0x28,
+- 0xea, 0x0f, 0x28, 0xc9, 0x66, 0x29, 0x9c, 0x68, 0x10, 0xa0, 0xea, 0x02,
+- 0xed, 0xf5, 0xf8, 0x98, 0xe5, 0xac, 0x91, 0x9c, 0xbf, 0x37, 0x42, 0xfc,
+- 0xac, 0xa1, 0xf9, 0xd6, 0x91, 0x9c, 0x93, 0xc4, 0xff, 0x6d, 0xd6, 0xbc,
+- 0x2d, 0x34, 0xef, 0x06, 0xaa, 0x21, 0x66, 0x3d, 0x17, 0x88, 0x9e, 0xe8,
+- 0xe7, 0xb4, 0x10, 0xca, 0x8e, 0x04, 0x2f, 0x52, 0xad, 0xbc, 0xd6, 0x1a,
+- 0xe7, 0xa7, 0x71, 0x4c, 0xfb, 0x5b, 0xb5, 0x0e, 0xf5, 0xcb, 0x7a, 0xc7,
+- 0x77, 0x83, 0x7b, 0x07, 0x06, 0xfa, 0xb1, 0x37, 0xbb, 0x81, 0x6a, 0x1e,
+- 0x99, 0x30, 0xa4, 0x81, 0xef, 0xc7, 0x95, 0x68, 0xa3, 0xe0, 0xf8, 0x67,
+- 0x90, 0x1f, 0x56, 0xa8, 0xde, 0x09, 0x87, 0xe6, 0x10, 0x94, 0x1d, 0x25,
+- 0x99, 0xf0, 0x5e, 0x8b, 0x2c, 0x95, 0xc8, 0x5f, 0x83, 0xfd, 0x84, 0x93,
+- 0x9d, 0x78, 0xb9, 0xe0, 0xc4, 0xab, 0xe9, 0x0d, 0x94, 0xe7, 0xdc, 0x84,
+- 0x87, 0x0d, 0xb7, 0x73, 0xc5, 0x81, 0x1a, 0x3b, 0x26, 0x2f, 0x45, 0xef,
+- 0xf8, 0xc3, 0xa8, 0xcb, 0x38, 0xfb, 0x28, 0x47, 0x6b, 0xb7, 0x91, 0x5c,
+- 0xd6, 0x95, 0xf8, 0x7e, 0x0b, 0x32, 0xe9, 0x14, 0xb2, 0xd9, 0x30, 0xd5,
+- 0x32, 0x4e, 0xe4, 0x9b, 0x5b, 0xac, 0xfe, 0x6c, 0x8e, 0xae, 0xe5, 0xca,
+- 0x5f, 0xec, 0x1b, 0x7f, 0xab, 0xda, 0x2f, 0x1e, 0xa4, 0x9c, 0xd2, 0x4f,
+- 0xd8, 0x73, 0x03, 0xc5, 0x77, 0x9b, 0xc6, 0xd9, 0x78, 0x1f, 0xf6, 0x14,
+- 0xf4, 0xab, 0xf1, 0x63, 0xba, 0x60, 0xf7, 0x05, 0xb7, 0x90, 0x3c, 0xce,
+- 0xa5, 0x4d, 0x3c, 0xaa, 0xb1, 0x3e, 0x29, 0x2e, 0xa5, 0xb9, 0x37, 0x68,
+- 0xe2, 0x19, 0x4d, 0x70, 0xbc, 0xa1, 0x3c, 0xba, 0x01, 0x4b, 0x0a, 0x26,
+- 0x4e, 0x6b, 0x2a, 0xc5, 0x2e, 0x18, 0x6e, 0xc2, 0x7e, 0x91, 0xd1, 0x7f,
+- 0x31, 0xf3, 0xce, 0x21, 0xb4, 0x75, 0x02, 0x9b, 0x47, 0x25, 0xcc, 0xcd,
+- 0x5c, 0xcd, 0xd1, 0x78, 0xf1, 0xf3, 0x3c, 0x9d, 0x98, 0x81, 0xb9, 0xc3,
+- 0xa9, 0x2b, 0xc3, 0xbc, 0xd7, 0x32, 0x12, 0x57, 0x12, 0xb5, 0x56, 0xce,
+- 0x56, 0xfb, 0x97, 0x48, 0x8a, 0x56, 0x12, 0x6d, 0xa9, 0x4f, 0x50, 0x59,
+- 0x2f, 0x43, 0x09, 0xfe, 0x0c, 0x91, 0xe8, 0x20, 0xef, 0x29, 0x94, 0xed,
+- 0xfc, 0xbd, 0xb4, 0x9a, 0xbf, 0xc3, 0x05, 0x8f, 0x50, 0xc7, 0x1c, 0xc8,
+- 0xcf, 0x98, 0x94, 0x67, 0x05, 0x66, 0x49, 0xc1, 0x2f, 0x64, 0x77, 0xe0,
+- 0xeb, 0x31, 0xd3, 0xbc, 0x2b, 0xae, 0x0e, 0x36, 0x4b, 0xf8, 0xd3, 0x06,
+- 0xc2, 0x14, 0x64, 0xf7, 0x84, 0x01, 0x10, 0xda, 0xda, 0x69, 0x98, 0x32,
+- 0xd5, 0x0c, 0x35, 0x3a, 0xf7, 0x1a, 0x7b, 0x45, 0x7b, 0x71, 0x83, 0xb8,
+- 0xa1, 0xd8, 0x2f, 0x42, 0x87, 0xee, 0x14, 0xd1, 0xa7, 0x6c, 0xdc, 0xd6,
+- 0x5a, 0xfc, 0xbc, 0x1f, 0xda, 0x43, 0x7c, 0xef, 0xd3, 0x4c, 0x3c, 0x4d,
+- 0xbc, 0xed, 0x2d, 0xdb, 0xb5, 0xc8, 0xee, 0xb4, 0xcd, 0xdb, 0xa3, 0x74,
+- 0xff, 0x62, 0x9a, 0xfd, 0xf1, 0x61, 0xab, 0xd7, 0xd9, 0x4c, 0xcf, 0xdc,
+- 0x9c, 0x0d, 0x87, 0x06, 0x85, 0x32, 0x34, 0x0b, 0xee, 0x77, 0xb6, 0x55,
+- 0x4e, 0x0a, 0xca, 0x3d, 0x12, 0xc7, 0x57, 0xf6, 0x79, 0x9b, 0xf6, 0x65,
+- 0x05, 0x58, 0x71, 0x91, 0xe9, 0xbf, 0x91, 0xea, 0xbe, 0x9f, 0xa5, 0xdb,
+- 0xfa, 0xdd, 0x24, 0xb6, 0xf3, 0xf1, 0x6e, 0x71, 0x89, 0xea, 0xbe, 0x57,
+- 0xd3, 0xc9, 0x85, 0x75, 0xe8, 0x11, 0x17, 0x0a, 0x7d, 0xe2, 0xc3, 0x7c,
+- 0x2f, 0x9c, 0x63, 0xf7, 0x8b, 0x77, 0xf3, 0x4c, 0x5b, 0xbf, 0x38, 0x33,
+- 0x7b, 0xde, 0x92, 0xfd, 0x2e, 0x8d, 0xfb, 0x9a, 0xf5, 0xb5, 0xf0, 0x99,
+- 0x04, 0x4f, 0x59, 0x8f, 0xdc, 0xe7, 0xb3, 0xfb, 0x43, 0xeb, 0xe2, 0x39,
+- 0xd3, 0xa9, 0x72, 0xaf, 0x37, 0x68, 0xf1, 0x38, 0x43, 0x78, 0x79, 0x36,
+- 0xbf, 0x41, 0x1c, 0x2e, 0xd8, 0xfc, 0x4d, 0x17, 0xd8, 0x6e, 0x65, 0xca,
+- 0x0d, 0x5f, 0xcc, 0xcf, 0x06, 0xfc, 0x9d, 0x41, 0xd4, 0x58, 0xfd, 0x24,
+- 0x13, 0xe3, 0x5a, 0x24, 0xf4, 0x0a, 0x82, 0x70, 0x96, 0xd8, 0xa6, 0x4d,
+- 0x3c, 0xa7, 0xb9, 0x20, 0x8d, 0xcb, 0x24, 0x17, 0xb2, 0x21, 0x9f, 0x0b,
+- 0x8e, 0x69, 0xae, 0x01, 0xe2, 0xb5, 0xdc, 0x67, 0x08, 0x39, 0xf8, 0xfb,
+- 0x17, 0x6d, 0xcd, 0x45, 0x79, 0x80, 0xfb, 0xe3, 0x6f, 0xd6, 0xd8, 0x36,
+- 0xc7, 0xf9, 0x68, 0xbe, 0xa7, 0x4d, 0x39, 0xb6, 0x93, 0x7b, 0xd9, 0x6e,
+- 0xcc, 0xe5, 0x6a, 0xb8, 0xc5, 0xe0, 0xae, 0xe9, 0x34, 0x71, 0x4e, 0x73,
+- 0x52, 0x5d, 0xf2, 0x10, 0xe5, 0x26, 0x07, 0x64, 0xf5, 0x6e, 0x94, 0x26,
+- 0x9d, 0x0e, 0xde, 0x73, 0xfa, 0x59, 0x8c, 0x7b, 0x00, 0xc0, 0x7e, 0xe2,
+- 0xe1, 0x99, 0x5c, 0x88, 0xea, 0x7f, 0xb9, 0x5a, 0x43, 0xfc, 0x01, 0x8e,
+- 0xe7, 0x24, 0xd1, 0xac, 0x43, 0x4a, 0xac, 0x34, 0xf1, 0xc9, 0xf2, 0x48,
+- 0xf4, 0x32, 0xc5, 0x2f, 0x3f, 0xe5, 0xaa, 0xdd, 0x85, 0x46, 0xfc, 0x2c,
+- 0xd7, 0x88, 0x57, 0x73, 0xa4, 0xc3, 0xd8, 0x48, 0xbf, 0x87, 0x62, 0xe4,
+- 0xd2, 0x98, 0x0b, 0x5b, 0x23, 0x86, 0xdf, 0x83, 0x28, 0xce, 0x25, 0xae,
+- 0x47, 0x2a, 0x10, 0xee, 0x19, 0x41, 0x13, 0xde, 0xcc, 0x81, 0x30, 0x04,
+- 0xdc, 0x4b, 0x68, 0x8e, 0xf7, 0x62, 0xc6, 0x90, 0x0b, 0x0a, 0xd5, 0x1f,
+- 0x88, 0xd7, 0xc3, 0xac, 0x39, 0x19, 0xa7, 0x1c, 0x5d, 0x6c, 0x44, 0x6f,
+- 0xae, 0x09, 0xfd, 0x94, 0xab, 0x56, 0xaf, 0x8c, 0xe3, 0xdd, 0xac, 0x57,
+- 0xdc, 0x94, 0x1d, 0xe9, 0xf7, 0xd3, 0x9c, 0xae, 0xe5, 0xca, 0xd0, 0xb3,
+- 0x04, 0xd8, 0x64, 0x84, 0xd9, 0xbc, 0xb7, 0xfb, 0x28, 0xde, 0x1e, 0x16,
+- 0x9f, 0xe1, 0x49, 0xb2, 0xc1, 0x2d, 0x9a, 0x52, 0xb9, 0x20, 0x45, 0x4e,
+- 0xaf, 0x87, 0x32, 0x7c, 0x9b, 0x30, 0xa2, 0x0d, 0x14, 0x47, 0x9a, 0xed,
+- 0x18, 0x61, 0x44, 0x84, 0x4c, 0x98, 0xdc, 0x09, 0xb7, 0x6a, 0xa0, 0xa7,
+- 0x93, 0x65, 0xea, 0x86, 0xfb, 0x29, 0xb2, 0x1b, 0xc7, 0x17, 0xfb, 0xf3,
+- 0x8d, 0x78, 0x83, 0xf2, 0xe4, 0xeb, 0x39, 0xc8, 0xb5, 0x14, 0xfb, 0x3f,
+- 0xa0, 0xd8, 0x7f, 0x2a, 0x36, 0x12, 0xe2, 0x98, 0x5f, 0x88, 0xe1, 0x5b,
+- 0x04, 0x83, 0x5b, 0xbc, 0xb4, 0xe6, 0x26, 0xc1, 0xeb, 0x20, 0xb9, 0x58,
+- 0xe7, 0xbe, 0x9a, 0xc5, 0x0f, 0xc5, 0x61, 0xe6, 0xe9, 0xff, 0x27, 0xed,
+- 0xdb, 0x6b, 0xe1, 0x69, 0x22, 0x5d, 0xce, 0xf7, 0x24, 0xaf, 0xed, 0x47,
+- 0x72, 0x1d, 0x63, 0xe3, 0xc2, 0x1a, 0xbd, 0x4e, 0xbc, 0x94, 0x63, 0x9b,
+- 0x33, 0xf1, 0xbc, 0xa6, 0x51, 0xcd, 0xc2, 0xb5, 0xf6, 0x10, 0xd5, 0x2d,
+- 0xdc, 0x27, 0x32, 0xdc, 0x27, 0x89, 0xc2, 0xbd, 0x39, 0xfc, 0x9e, 0x0c,
+- 0x69, 0x59, 0x2d, 0xa6, 0x90, 0x77, 0x3a, 0x09, 0x6b, 0x70, 0x8c, 0x65,
+- 0x3f, 0x7a, 0xab, 0x4b, 0xcd, 0xc3, 0xf0, 0xea, 0x3d, 0x30, 0x2c, 0xdf,
+- 0xad, 0x13, 0x0f, 0x90, 0x8d, 0xbc, 0x1c, 0xab, 0x45, 0x9e, 0xea, 0x1e,
+- 0xc2, 0xdf, 0xee, 0x3f, 0xa3, 0xe7, 0x13, 0x13, 0xd8, 0x13, 0x84, 0xf4,
+- 0x5d, 0x3f, 0xfe, 0x02, 0x67, 0x5d, 0x8c, 0xcb, 0xe1, 0xee, 0x8b, 0x1b,
+- 0x9e, 0xf5, 0xf1, 0x3a, 0x71, 0x7b, 0xae, 0x1d, 0x17, 0x27, 0x1b, 0xc9,
+- 0xbe, 0x9b, 0xb0, 0x78, 0x3c, 0x88, 0xf7, 0x88, 0x96, 0x61, 0x8d, 0xb1,
+- 0xba, 0x31, 0xdc, 0x0c, 0x65, 0x88, 0xea, 0xa1, 0xbe, 0x9f, 0x0b, 0xf6,
+- 0x01, 0xa5, 0xe7, 0x0e, 0xe1, 0x81, 0x1a, 0x49, 0x92, 0xec, 0x4d, 0x73,
+- 0x4c, 0x6b, 0xd3, 0xbc, 0xe0, 0xfe, 0xcf, 0xdd, 0xd8, 0x3f, 0xc7, 0xb4,
+- 0x9c, 0xea, 0xba, 0x61, 0x96, 0x3f, 0x4f, 0x77, 0x5d, 0x6f, 0x7d, 0xbe,
+- 0x56, 0xfd, 0xac, 0x74, 0x85, 0xac, 0xcf, 0x1f, 0xd1, 0x27, 0xf7, 0x99,
+- 0xc3, 0x46, 0x8d, 0xf8, 0xbe, 0x8b, 0xfb, 0xcd, 0x49, 0xf0, 0xff, 0x71,
+- 0x97, 0xdd, 0xaf, 0xbb, 0x1b, 0x86, 0xd5, 0x13, 0xf9, 0xb5, 0xd5, 0x8b,
+- 0x0e, 0x91, 0x1b, 0xc8, 0xc4, 0x9f, 0x4c, 0x58, 0x2b, 0x10, 0xa3, 0xc2,
+- 0xbc, 0x49, 0x36, 0x16, 0xeb, 0xfd, 0x54, 0x1b, 0xc8, 0xc4, 0xaf, 0x81,
+- 0x3d, 0x9d, 0x02, 0xfb, 0x55, 0x1d, 0x3f, 0x2d, 0x70, 0x0c, 0x77, 0xe2,
+- 0x99, 0xb4, 0x12, 0x4a, 0x89, 0x30, 0xd5, 0xf9, 0x0e, 0x84, 0x9a, 0xfb,
+- 0xb1, 0x9f, 0xf2, 0xc9, 0x6c, 0x9a, 0xf3, 0x07, 0x7d, 0x52, 0x3c, 0x6f,
+- 0xa0, 0xf8, 0xf3, 0xf1, 0xa8, 0x1d, 0xef, 0x8b, 0x71, 0x65, 0xef, 0x1f,
+- 0x90, 0x4e, 0x9f, 0x2b, 0xf2, 0x9c, 0x06, 0xae, 0xac, 0x64, 0x1f, 0x56,
+- 0xa2, 0x29, 0xc7, 0x7d, 0x08, 0xcd, 0x70, 0x6c, 0xa1, 0xe5, 0x68, 0xad,
+- 0x83, 0xd9, 0x1a, 0xf4, 0xc5, 0x7b, 0x45, 0x7f, 0xa9, 0x8f, 0xf7, 0x14,
+- 0xfc, 0x0b, 0xf4, 0x3b, 0xc5, 0x9a, 0x69, 0xee, 0x09, 0x6e, 0x10, 0x7d,
+- 0x25, 0xee, 0x0b, 0x0e, 0x8b, 0x6f, 0x94, 0xd8, 0xe7, 0xe7, 0xfb, 0x83,
+- 0xf3, 0xfa, 0xe7, 0xbe, 0xa0, 0xe1, 0x7e, 0x89, 0x64, 0xbf, 0x3d, 0xc7,
+- 0x71, 0x58, 0x7a, 0xc0, 0x87, 0xe5, 0xc8, 0xbb, 0xe0, 0x3e, 0x11, 0xff,
+- 0x1d, 0xdc, 0x45, 0xb8, 0x60, 0xb1, 0x6a, 0xeb, 0x6f, 0x75, 0xde, 0x81,
+- 0xc4, 0x72, 0x12, 0xfa, 0x02, 0xd6, 0xe9, 0x00, 0xc5, 0xb3, 0x8c, 0x39,
+- 0x18, 0x60, 0x5d, 0xb2, 0xbd, 0x59, 0x7d, 0x27, 0xca, 0x2b, 0x06, 0x22,
+- 0x9d, 0x6e, 0xcc, 0xe6, 0x16, 0x51, 0x4d, 0x60, 0x62, 0xaf, 0x56, 0x8f,
+- 0x5a, 0x2b, 0x06, 0xb8, 0x09, 0x47, 0x42, 0xf6, 0xd2, 0x3c, 0xe9, 0x31,
+- 0x19, 0x1e, 0xba, 0x77, 0x92, 0x72, 0xd3, 0xfe, 0x4e, 0x7b, 0xee, 0xb6,
+- 0xfc, 0x4d, 0xd8, 0x47, 0x1e, 0x5f, 0xaf, 0x46, 0x31, 0xea, 0xf7, 0x52,
+- 0xac, 0xf9, 0x56, 0x75, 0xce, 0xcf, 0xc8, 0x36, 0x79, 0xbd, 0x4d, 0xb5,
+- 0xb6, 0x1e, 0x96, 0xc9, 0x76, 0xed, 0x25, 0x1b, 0x75, 0xb4, 0xd6, 0xd6,
+- 0xce, 0x0d, 0xe8, 0x19, 0xf5, 0x8a, 0x57, 0xd3, 0xf7, 0x98, 0xa1, 0x46,
+- 0x1a, 0x47, 0x36, 0x5b, 0x53, 0xa5, 0xb7, 0x35, 0xff, 0xcf, 0xb5, 0x5c,
+- 0xa7, 0x7b, 0x29, 0x8f, 0x3c, 0x98, 0x73, 0x20, 0x50, 0xbd, 0x1e, 0xcf,
+- 0x87, 0xa0, 0x75, 0xd4, 0x01, 0x4d, 0x82, 0xae, 0xf1, 0xdc, 0xbc, 0x86,
+- 0x8c, 0x46, 0xf2, 0x93, 0x6f, 0xc7, 0x13, 0xf8, 0x20, 0xeb, 0xc4, 0x7a,
+- 0xca, 0xef, 0x6b, 0xd3, 0x3a, 0xce, 0x95, 0x6b, 0x79, 0x3d, 0xb2, 0xc3,
+- 0xf9, 0x71, 0x4e, 0x1a, 0xe7, 0xc6, 0x74, 0xfe, 0x8b, 0xf4, 0x05, 0x88,
+- 0xe6, 0x22, 0x8d, 0xe5, 0x7b, 0xe7, 0xad, 0xbe, 0xc0, 0xf1, 0x6b, 0xea,
+- 0x29, 0xc7, 0x38, 0xf7, 0x8a, 0xec, 0x5c, 0xd0, 0xad, 0xb1, 0x2e, 0x7d,
+- 0xb8, 0x3c, 0x61, 0xe0, 0xdc, 0xca, 0x06, 0x5c, 0x99, 0x68, 0xc5, 0x03,
+- 0x39, 0x0f, 0x2e, 0x4c, 0x98, 0xb8, 0x69, 0x39, 0xee, 0x09, 0x12, 0x06,
+- 0x6b, 0x20, 0xbf, 0xff, 0x29, 0xd5, 0x3c, 0x14, 0x4f, 0x89, 0xd2, 0x48,
+- 0x62, 0x1d, 0xd9, 0x75, 0x34, 0x86, 0xd4, 0x2d, 0xf1, 0x48, 0xe8, 0x3c,
+- 0xbe, 0x67, 0x52, 0x2c, 0xf6, 0x4b, 0x7a, 0xaf, 0x70, 0x5a, 0xfb, 0x84,
+- 0x1b, 0xac, 0x7d, 0x45, 0xc7, 0xf4, 0xb0, 0x90, 0x4a, 0xd7, 0xfa, 0xf5,
+- 0x97, 0xe5, 0x21, 0xce, 0x3d, 0x9c, 0x23, 0xc7, 0x4d, 0x97, 0xba, 0xc1,
+- 0xea, 0xd3, 0xec, 0xce, 0x5f, 0xcd, 0x4d, 0x57, 0xf3, 0xd1, 0xce, 0x6a,
+- 0x1e, 0x1a, 0x29, 0xbc, 0xf3, 0x05, 0xfc, 0x14, 0xaa, 0xee, 0x57, 0x70,
+- 0xfe, 0x71, 0x8b, 0xb3, 0x64, 0x0e, 0x7b, 0xc8, 0x07, 0x8f, 0x6a, 0x27,
+- 0x82, 0x94, 0x21, 0xe0, 0xec, 0x10, 0x78, 0x90, 0xcf, 0x8b, 0x04, 0x4c,
+- 0xdc, 0xa9, 0xd9, 0xf6, 0xb0, 0xbc, 0xd3, 0x85, 0x41, 0xca, 0x49, 0xae,
+- 0x98, 0x97, 0x7c, 0xdd, 0x8f, 0xd7, 0x34, 0xb6, 0xe1, 0x5b, 0xaa, 0x39,
+- 0x89, 0xf7, 0xbf, 0xed, 0xbd, 0xea, 0xdf, 0xee, 0x5b, 0xcf, 0xdb, 0xa6,
+- 0x86, 0xe4, 0x42, 0x78, 0xde, 0x8b, 0xab, 0x54, 0x37, 0xc8, 0x54, 0x33,
+- 0xac, 0x47, 0x62, 0x81, 0x92, 0x64, 0xfd, 0xfb, 0x68, 0xee, 0x5f, 0x76,
+- 0x0e, 0xe2, 0xfe, 0x71, 0x07, 0xea, 0x54, 0x8e, 0xb3, 0x06, 0xf6, 0x37,
+- 0x72, 0x9c, 0xea, 0xc5, 0x8e, 0x71, 0xb7, 0x38, 0x99, 0x73, 0xe2, 0xc9,
+- 0xbe, 0x47, 0xb0, 0xa0, 0x63, 0x4b, 0xb5, 0xd7, 0xc9, 0xdf, 0xbf, 0x89,
+- 0xd4, 0x22, 0x5e, 0x9f, 0x7b, 0x68, 0x02, 0xde, 0x0e, 0xe6, 0x03, 0x9e,
+- 0x8b, 0x34, 0xff, 0xe6, 0x51, 0xa7, 0x38, 0x9f, 0xfe, 0x1b, 0xf3, 0x48,
+- 0x80, 0x71, 0x01, 0xdf, 0xab, 0x87, 0xd1, 0xc8, 0x63, 0x59, 0x87, 0x5e,
+- 0xaa, 0x49, 0x07, 0x31, 0x4a, 0x74, 0xbd, 0x6e, 0xcd, 0x75, 0xb6, 0x4a,
+- 0xbf, 0x57, 0x34, 0x64, 0x64, 0x23, 0x48, 0xb4, 0xf8, 0x57, 0xf6, 0xa1,
+- 0xa1, 0x74, 0x6d, 0xbe, 0x25, 0xa3, 0xf7, 0x30, 0x7f, 0x9c, 0x13, 0x06,
+- 0xf0, 0x41, 0x5a, 0xe0, 0x7d, 0xcb, 0x06, 0x07, 0xd0, 0x5a, 0xa0, 0xfa,
+- 0xdf, 0x8a, 0x21, 0x3c, 0x2e, 0x6e, 0xdb, 0xb6, 0x63, 0x10, 0xdb, 0x89,
+- 0x97, 0x7a, 0xe2, 0xe5, 0xe3, 0xd8, 0x12, 0x5a, 0x87, 0xaf, 0x1d, 0x93,
+- 0xab, 0xfd, 0x87, 0xea, 0x5c, 0xab, 0xc0, 0xbd, 0x29, 0xa7, 0x1a, 0xc1,
+- 0xb6, 0xf1, 0x48, 0xbf, 0xd7, 0xc1, 0x76, 0x18, 0xc1, 0x7d, 0xd3, 0x49,
+- 0xba, 0xcf, 0x73, 0x05, 0xb1, 0x29, 0xe3, 0x14, 0xef, 0x52, 0x9d, 0x74,
+- 0x3c, 0xed, 0x58, 0x24, 0xe1, 0x07, 0xe6, 0x93, 0x81, 0x1d, 0xb8, 0x45,
+- 0xeb, 0xc5, 0xbd, 0x64, 0x83, 0xdd, 0xad, 0x3b, 0x30, 0x41, 0x36, 0xb0,
+- 0xb9, 0x89, 0x6a, 0xb7, 0x58, 0xd9, 0x1c, 0x08, 0xb0, 0x1c, 0x05, 0x7a,
+- 0xe8, 0x7a, 0x23, 0xd5, 0x73, 0x8e, 0x18, 0x59, 0x1b, 0xf9, 0x85, 0xac,
+- 0x2a, 0xb9, 0x24, 0xea, 0xad, 0x35, 0x1b, 0x29, 0x4f, 0xbb, 0x18, 0x1f,
+- 0xf8, 0x18, 0x27, 0x7c, 0x91, 0x1e, 0xc3, 0xac, 0x55, 0xd5, 0xe8, 0x7a,
+- 0x47, 0x6b, 0x6e, 0x8e, 0x6c, 0x76, 0x4d, 0xc7, 0xb5, 0xcf, 0xcd, 0xcb,
+- 0x48, 0x43, 0x4d, 0xc7, 0x8c, 0x59, 0xf1, 0x8f, 0xc0, 0xdf, 0x71, 0xad,
+- 0xee, 0xe7, 0xe7, 0x60, 0x9a, 0xed, 0xb8, 0x16, 0x72, 0x44, 0xfc, 0xf7,
+- 0xe0, 0xaf, 0x68, 0x8d, 0x20, 0x36, 0x96, 0x7a, 0x31, 0x30, 0x2e, 0x7d,
+- 0x8e, 0x4f, 0x7c, 0x6c, 0xcb, 0x9f, 0xf3, 0xbf, 0x75, 0x3c, 0xd2, 0xe3,
+- 0xa9, 0xf2, 0x7f, 0xef, 0xf4, 0xe7, 0x73, 0x0d, 0x67, 0x38, 0xaf, 0xf2,
+- 0x7c, 0xbc, 0xef, 0x37, 0x2f, 0xdf, 0x20, 0xb6, 0x5b, 0xf3, 0xed, 0x75,
+- 0xb3, 0x0f, 0xbb, 0xc8, 0xd7, 0xd7, 0x75, 0x18, 0x78, 0x2d, 0xf1, 0x80,
+- 0xb9, 0xd5, 0x92, 0xc1, 0x9f, 0x58, 0xcf, 0xf7, 0xb4, 0x56, 0x2c, 0x7b,
+- 0xb7, 0xfd, 0x96, 0xf7, 0x04, 0x78, 0x8f, 0x60, 0x7e, 0x5f, 0x20, 0x6a,
+- 0xed, 0xd7, 0xd9, 0x7b, 0x03, 0xdf, 0xa2, 0x38, 0xcb, 0xfb, 0x06, 0xb2,
+- 0x70, 0x8e, 0xd7, 0x09, 0xd7, 0x38, 0xd3, 0xf6, 0x81, 0x6c, 0xfb, 0xd8,
+- 0x5f, 0x21, 0x19, 0xe0, 0xfe, 0xa4, 0x6d, 0xff, 0xd1, 0xce, 0xfb, 0x80,
+- 0xa7, 0x0c, 0x77, 0xed, 0x0a, 0x50, 0x8d, 0xdf, 0x67, 0xd9, 0xc3, 0x75,
+- 0xfa, 0xdb, 0xab, 0xfe, 0xb1, 0x95, 0xeb, 0x7c, 0xee, 0x09, 0xbe, 0xbb,
+- 0x6a, 0xb2, 0x55, 0x22, 0x3c, 0xc5, 0x6b, 0xf2, 0xde, 0x02, 0xe7, 0x55,
+- 0x2b, 0xee, 0x7a, 0x1a, 0x57, 0x18, 0xee, 0x05, 0x2b, 0x9c, 0x62, 0x51,
+- 0xa6, 0x9f, 0x6c, 0x4f, 0x45, 0x22, 0x63, 0x78, 0x9a, 0x57, 0x84, 0xf0,
+- 0x50, 0x66, 0x3e, 0x26, 0xb7, 0xa3, 0x7d, 0x0a, 0xf8, 0xdf, 0x99, 0x20,
+- 0xda, 0x26, 0xc2, 0x43, 0xb7, 0x3b, 0xc2, 0xc3, 0xef, 0x38, 0xf8, 0x5e,
+- 0xa1, 0xeb, 0x26, 0x0b, 0x7f, 0x1f, 0xed, 0x5a, 0x66, 0x7d, 0xbe, 0xdd,
+- 0x75, 0x63, 0xe1, 0x6e, 0xa4, 0xe7, 0xdc, 0x97, 0xf3, 0x0e, 0x13, 0x0f,
+- 0xc5, 0x1c, 0xf8, 0x9a, 0xf6, 0xd7, 0xe4, 0x5b, 0x82, 0x6c, 0xe3, 0x18,
+- 0xe7, 0x60, 0x4b, 0xa7, 0xae, 0x15, 0x2a, 0xda, 0x32, 0x8d, 0x84, 0xd7,
+- 0x9a, 0xa8, 0xe6, 0x6f, 0xc4, 0x0f, 0x73, 0x8c, 0xd7, 0x4c, 0x8a, 0xfb,
+- 0x26, 0x5e, 0xef, 0x30, 0x86, 0x82, 0x50, 0x8c, 0x37, 0x85, 0x92, 0xba,
+- 0xdd, 0xa1, 0x1c, 0x69, 0x72, 0xf8, 0xb1, 0x2f, 0x62, 0xe7, 0xd1, 0x4e,
+- 0x2b, 0x6f, 0xbe, 0xd3, 0x65, 0xf7, 0xec, 0x4e, 0x56, 0xf3, 0xeb, 0xa9,
+- 0x2e, 0x6d, 0x56, 0x39, 0x9a, 0x22, 0xff, 0x59, 0x48, 0xf1, 0x73, 0x3c,
+- 0x9b, 0xb2, 0xce, 0x82, 0xfc, 0x32, 0x53, 0x43, 0xb6, 0x11, 0xd6, 0xc6,
+- 0x11, 0x8e, 0x3e, 0x64, 0xd1, 0xfa, 0xb3, 0xae, 0x58, 0xa1, 0x8c, 0x8a,
+- 0x53, 0x39, 0x08, 0x14, 0x09, 0x37, 0xb4, 0xf9, 0x5f, 0x46, 0x99, 0xfb,
+- 0xa1, 0x56, 0xa0, 0x67, 0x1e, 0x5a, 0x0b, 0x40, 0x2e, 0xe3, 0xbe, 0x0c,
+- 0xab, 0x17, 0xeb, 0xc0, 0x5a, 0x6d, 0x3b, 0xe1, 0x42, 0xde, 0xff, 0x15,
+- 0x54, 0x63, 0x37, 0xa2, 0xb2, 0xc1, 0x89, 0xf1, 0x0c, 0xe7, 0xe1, 0x63,
+- 0x5d, 0xf2, 0x28, 0x2a, 0x6e, 0x7b, 0x4f, 0x33, 0xe1, 0xa6, 0x0c, 0x3d,
+- 0x57, 0x22, 0x4c, 0x4a, 0xb1, 0x63, 0x6b, 0xec, 0x37, 0x66, 0xb2, 0xd1,
+- 0xde, 0x53, 0x19, 0x9d, 0x14, 0x58, 0xa0, 0x26, 0x31, 0x3a, 0xe7, 0xf4,
+- 0xa5, 0xd3, 0x51, 0xa4, 0xcb, 0xfc, 0xbc, 0xfb, 0x72, 0xd2, 0x9a, 0x3f,
+- 0xb2, 0x77, 0x89, 0xc3, 0x81, 0x65, 0x1d, 0x87, 0x50, 0x59, 0x68, 0xd3,
+- 0x10, 0x24, 0x4c, 0xc0, 0x35, 0x6c, 0x13, 0xf1, 0x7a, 0xe7, 0xe3, 0x5c,
+- 0x47, 0xfc, 0xa4, 0xeb, 0xe6, 0x29, 0xf6, 0xeb, 0x63, 0x5d, 0x1f, 0xa4,
+- 0x95, 0x64, 0x93, 0x04, 0xb9, 0x8e, 0xf8, 0xbf, 0x6f, 0x94, 0xfb, 0x08,
+- 0xbf, 0xe0, 0x3e, 0x02, 0xe5, 0x65, 0x65, 0xb8, 0x59, 0x78, 0xc5, 0xba,
+- 0x0c, 0xd5, 0x15, 0x44, 0xf3, 0xa5, 0x88, 0xd2, 0x53, 0x22, 0x8c, 0xb2,
+- 0x45, 0x50, 0x5d, 0x57, 0xb6, 0xe5, 0x65, 0x9f, 0xcd, 0xab, 0x5c, 0xc5,
+- 0x21, 0x51, 0x0b, 0x77, 0xf0, 0x3e, 0x34, 0xe7, 0x71, 0x6b, 0x4f, 0x9f,
+- 0xae, 0xff, 0xbc, 0x6b, 0x09, 0xd5, 0x16, 0x23, 0x4c, 0x1f, 0x78, 0xaf,
+- 0x8f, 0x6a, 0xd0, 0xec, 0xf1, 0x2a, 0x2e, 0xf1, 0x56, 0xe5, 0xc2, 0xdf,
+- 0xf9, 0x4c, 0xe2, 0x6b, 0x5d, 0x9b, 0x26, 0xf9, 0x8c, 0xe2, 0x4f, 0xba,
+- 0xd6, 0x4c, 0x2a, 0xa1, 0x8d, 0xb4, 0xee, 0x6e, 0xde, 0x5f, 0xa7, 0x39,
+- 0x67, 0x35, 0xa6, 0xbb, 0xd0, 0x75, 0x73, 0x96, 0x7b, 0xcb, 0xc7, 0xba,
+- 0xcc, 0x6c, 0x98, 0x31, 0xa8, 0x65, 0x2b, 0x89, 0x02, 0x55, 0xf3, 0xd7,
+- 0xd9, 0xbc, 0xba, 0x48, 0x1f, 0x87, 0xd2, 0x84, 0x76, 0xe2, 0xb6, 0x6e,
+- 0x56, 0x17, 0xd6, 0x20, 0xd5, 0xd4, 0x4d, 0x35, 0xa8, 0xdf, 0xb7, 0x36,
+- 0xd3, 0x8d, 0x09, 0xd2, 0xe1, 0xa6, 0x52, 0xd0, 0xd7, 0x9d, 0x51, 0x31,
+- 0x50, 0xe2, 0x7a, 0xb3, 0xd2, 0xb5, 0x6b, 0x72, 0xaa, 0x5a, 0xff, 0xf6,
+- 0x53, 0xcd, 0x4a, 0x76, 0x91, 0xb1, 0x6d, 0xae, 0xb5, 0x40, 0x34, 0x0b,
+- 0x7b, 0x5e, 0x37, 0xad, 0x73, 0xfd, 0xe8, 0x77, 0xcd, 0xd0, 0x42, 0xb6,
+- 0x85, 0xbb, 0xf1, 0xf8, 0x94, 0xcf, 0x08, 0xe8, 0x7e, 0x74, 0x76, 0x9c,
+- 0xa2, 0x67, 0xdb, 0xf1, 0xf8, 0xe1, 0x5b, 0x90, 0xff, 0x23, 0x27, 0x2e,
+- 0x66, 0x92, 0x58, 0xda, 0xf1, 0x55, 0x9c, 0xd9, 0x20, 0xe3, 0xef, 0x32,
+- 0x5e, 0x5c, 0x22, 0xfe, 0x0c, 0x6b, 0x8e, 0x7f, 0xcf, 0xfe, 0x90, 0x5b,
+- 0xb8, 0xc7, 0x35, 0xc6, 0x9e, 0xbf, 0xe7, 0x06, 0xf7, 0xde, 0x0c, 0xd4,
+- 0x10, 0x0e, 0x0a, 0x13, 0xcd, 0x6a, 0x86, 0xcf, 0x38, 0x05, 0x7c, 0x9c,
+- 0x2b, 0xa7, 0x89, 0x27, 0x47, 0xa9, 0xc5, 0xe7, 0x24, 0x7e, 0x9c, 0xa5,
+- 0x73, 0x14, 0x03, 0xd8, 0x07, 0xdc, 0x97, 0x43, 0x96, 0x1d, 0x5c, 0xbb,
+- 0xf6, 0x7e, 0x0f, 0xef, 0xf1, 0x1f, 0xcf, 0x72, 0x6c, 0x14, 0x54, 0xbb,
+- 0x84, 0x90, 0x9c, 0x5d, 0x82, 0x9e, 0xd9, 0xed, 0x74, 0x5d, 0x45, 0x5f,
+- 0xd5, 0xd7, 0x42, 0x05, 0x8f, 0x87, 0xf1, 0x49, 0x2e, 0x63, 0xff, 0x8e,
+- 0x5c, 0xfd, 0xed, 0x16, 0x8d, 0xe3, 0x84, 0x1d, 0x11, 0xb7, 0xf2, 0xb0,
+- 0xda, 0xf1, 0xef, 0xe2, 0xe5, 0x72, 0xca, 0xa2, 0x61, 0x37, 0xcd, 0xc5,
+- 0xb2, 0x79, 0xce, 0x4c, 0xdd, 0xc9, 0xf2, 0x0b, 0xf8, 0x7e, 0x48, 0xfa,
+- 0x98, 0xa4, 0x67, 0x1e, 0x27, 0x1e, 0xca, 0xc4, 0x5b, 0xb6, 0xf4, 0x5d,
+- 0x1a, 0xc3, 0xf7, 0x40, 0xfa, 0x32, 0x14, 0x67, 0xf5, 0x6c, 0xe6, 0x08,
+- 0xe5, 0xcb, 0x5a, 0x8a, 0x45, 0x67, 0xe3, 0xf7, 0x62, 0x6d, 0x4e, 0x49,
+- 0x1a, 0x14, 0x2e, 0x53, 0x7e, 0x08, 0xa7, 0xce, 0x36, 0xfc, 0x36, 0xd9,
+- 0x70, 0x0b, 0x61, 0x80, 0x70, 0xe8, 0x1c, 0x8d, 0x37, 0x9c, 0x32, 0x1e,
+- 0x9b, 0x90, 0x70, 0x8e, 0xf7, 0x80, 0x85, 0xfd, 0xbc, 0x01, 0x1e, 0x3b,
+- 0xff, 0xbd, 0x8e, 0xea, 0xba, 0x70, 0x82, 0xb2, 0xaa, 0x51, 0x4f, 0xb8,
+- 0xbd, 0xd0, 0xf9, 0x08, 0xf6, 0x53, 0x7d, 0xbf, 0x35, 0x46, 0x32, 0x69,
+- 0x8c, 0x53, 0xbd, 0xd1, 0x36, 0x74, 0x01, 0x7f, 0x67, 0x56, 0x78, 0x1f,
+- 0x5d, 0x84, 0x13, 0x17, 0xf0, 0x99, 0x29, 0xa9, 0xea, 0xe9, 0x19, 0xa8,
+- 0x95, 0x73, 0x68, 0x1b, 0xbe, 0x82, 0x0f, 0x4d, 0xde, 0x63, 0x97, 0x25,
+- 0x89, 0x30, 0x60, 0xd8, 0xef, 0x44, 0x00, 0x95, 0x80, 0x84, 0x5b, 0x35,
+- 0xee, 0x49, 0x2b, 0xc3, 0x4f, 0x13, 0x96, 0x7f, 0x5f, 0xb4, 0x0d, 0x7e,
+- 0x8c, 0x33, 0x66, 0xbe, 0x91, 0xd7, 0x15, 0x48, 0xdc, 0xd8, 0x76, 0xba,
+- 0x06, 0x4a, 0x8f, 0x4b, 0xa8, 0x89, 0x66, 0xe9, 0xaf, 0xcd, 0x33, 0x81,
+- 0xcf, 0x4c, 0x35, 0xf2, 0x19, 0xe1, 0x20, 0x35, 0x38, 0x4d, 0x3e, 0x31,
+- 0x88, 0x79, 0xda, 0xfe, 0x81, 0xf8, 0xd7, 0x88, 0x06, 0xc6, 0x7d, 0x86,
+- 0x7b, 0x0f, 0xd1, 0xf6, 0x53, 0xc2, 0x01, 0x5b, 0x63, 0x17, 0xcc, 0xe4,
+- 0x42, 0xeb, 0xfc, 0x5e, 0x9d, 0xdd, 0xfb, 0x66, 0x5f, 0xb9, 0x1b, 0x9b,
+- 0xd2, 0x4e, 0x92, 0xd3, 0x3c, 0x5e, 0x73, 0x51, 0x0c, 0x66, 0x8c, 0x53,
+- 0xb9, 0x9e, 0x4a, 0x33, 0xc7, 0xac, 0x0a, 0xec, 0xa2, 0xb8, 0xb0, 0xd3,
+- 0xca, 0x05, 0xf0, 0x2c, 0x5e, 0xd1, 0x81, 0x2b, 0x53, 0xff, 0xc3, 0x43,
+- 0xfa, 0x5b, 0xad, 0x2e, 0x87, 0x08, 0x66, 0x0c, 0xd1, 0xa0, 0x4b, 0xf8,
+- 0xb8, 0x53, 0xe9, 0x71, 0x48, 0xc3, 0xb8, 0x31, 0x66, 0x98, 0x5e, 0x55,
+- 0xed, 0x6f, 0x17, 0x91, 0xbe, 0x92, 0x88, 0xa2, 0xae, 0xe4, 0x95, 0xeb,
+- 0x4a, 0xed, 0xb2, 0xa7, 0x64, 0xb8, 0xfd, 0x2b, 0xee, 0xa5, 0xba, 0x65,
+- 0x07, 0xd5, 0xb6, 0x5e, 0xaa, 0xaf, 0x15, 0xb2, 0xc7, 0x1a, 0x92, 0x7f,
+- 0x88, 0xe2, 0x80, 0x0e, 0x67, 0x66, 0x1b, 0x5c, 0x99, 0xb0, 0x7f, 0x37,
+- 0x76, 0x20, 0x19, 0xb4, 0xb1, 0xad, 0x4c, 0xba, 0xaa, 0xed, 0x64, 0x2c,
+- 0x73, 0x2f, 0xce, 0xe4, 0x19, 0x9f, 0x27, 0xb0, 0x31, 0xcd, 0xbf, 0xe1,
+- 0x79, 0x39, 0xae, 0xe3, 0x28, 0xd5, 0x4e, 0xee, 0x8e, 0x66, 0xd2, 0x43,
+- 0x0b, 0x46, 0xca, 0x82, 0x4d, 0x90, 0x74, 0x01, 0xcf, 0xd1, 0x4e, 0x19,
+- 0xfb, 0x66, 0x28, 0x91, 0x50, 0x9e, 0x72, 0x92, 0x9d, 0xef, 0x26, 0x1b,
+- 0xf2, 0xaa, 0x5e, 0xfa, 0x1d, 0xe0, 0x73, 0x47, 0x64, 0x93, 0x3f, 0xe9,
+- 0x6a, 0xb7, 0x62, 0xcd, 0x2f, 0xa8, 0xc6, 0xf9, 0x15, 0xf1, 0xc2, 0xb2,
+- 0xd0, 0x51, 0x37, 0x3e, 0x5f, 0x13, 0xae, 0xb9, 0xa3, 0x0e, 0x41, 0x9a,
+- 0x33, 0x58, 0xdd, 0x23, 0x13, 0x58, 0x13, 0xeb, 0x40, 0x31, 0x27, 0xaa,
+- 0x18, 0x6b, 0x44, 0xf1, 0x62, 0x35, 0xf6, 0x53, 0xed, 0xef, 0x53, 0x37,
+- 0x22, 0xe3, 0xaf, 0x78, 0xde, 0x89, 0x73, 0x0d, 0x00, 0xcf, 0x00, 0x61,
+- 0xa8, 0xd1, 0xf4, 0x57, 0x90, 0x5f, 0x08, 0xf7, 0x3d, 0x71, 0x3e, 0x9f,
+- 0x49, 0x21, 0x4a, 0x5d, 0x8d, 0x86, 0xe5, 0xbd, 0xf8, 0xb8, 0x91, 0xf1,
+- 0xaf, 0x97, 0x62, 0x83, 0x8c, 0xdd, 0x33, 0x01, 0xeb, 0x5c, 0x04, 0xc5,
+- 0xc0, 0x2a, 0xcd, 0xd7, 0xd2, 0xfa, 0x65, 0x34, 0xb2, 0x4c, 0xfe, 0x6f,
+- 0x34, 0x92, 0xcd, 0x12, 0xe6, 0xc9, 0xa5, 0x07, 0xf0, 0x4a, 0x9a, 0xe7,
+- 0x0d, 0x27, 0x35, 0xe1, 0xe7, 0x9e, 0xbc, 0x25, 0x13, 0x63, 0x86, 0xd7,
+- 0xf0, 0x5a, 0xb1, 0xc9, 0x5e, 0x27, 0xc0, 0xbd, 0xa2, 0xff, 0xe0, 0x5a,
+- 0x1a, 0xe5, 0xc7, 0xd5, 0x54, 0x77, 0x46, 0xa1, 0x7e, 0xa3, 0x42, 0xfa,
+- 0xe0, 0x1e, 0xf5, 0x12, 0xc2, 0xbc, 0x70, 0xbf, 0x1a, 0xe7, 0x73, 0xc8,
+- 0xe6, 0x0e, 0x59, 0x37, 0x4d, 0x57, 0xa7, 0xea, 0x7f, 0x0f, 0x6c, 0x87,
+- 0x5e, 0xde, 0xeb, 0x70, 0xef, 0xee, 0xf4, 0x62, 0x1f, 0xe5, 0xc0, 0x67,
+- 0xd3, 0x6d, 0x06, 0xd7, 0x7e, 0x60, 0x1c, 0x2a, 0x52, 0xf4, 0xec, 0x50,
+- 0x1d, 0x9f, 0x09, 0xda, 0x55, 0xde, 0x06, 0x47, 0xe6, 0xb6, 0x3a, 0xae,
+- 0x37, 0x6a, 0xa8, 0x4e, 0x1e, 0x49, 0x33, 0xbd, 0xdc, 0x7b, 0x33, 0xcd,
+- 0x9d, 0x71, 0xf5, 0xf2, 0x5a, 0xb2, 0x8b, 0x66, 0x9d, 0xe5, 0x18, 0xc0,
+- 0x93, 0x34, 0x36, 0x54, 0x66, 0x59, 0x7e, 0xb7, 0x8e, 0xfb, 0x9d, 0x7b,
+- 0x48, 0xbf, 0x0d, 0x59, 0x7b, 0x9e, 0x6c, 0x79, 0x10, 0x4b, 0x46, 0x5f,
+- 0xa8, 0xb3, 0x6b, 0x1f, 0xae, 0xcb, 0x87, 0xb0, 0x27, 0x1d, 0xc0, 0x4c,
+- 0xba, 0xcd, 0xff, 0x12, 0x9c, 0xd5, 0xbc, 0xca, 0xe7, 0x88, 0xe7, 0xc7,
+- 0x04, 0x30, 0x7d, 0xf5, 0x3b, 0xcb, 0xc7, 0xee, 0x99, 0x1e, 0xb7, 0x30,
+- 0xbf, 0x8c, 0x7c, 0xc0, 0xae, 0x63, 0x28, 0x56, 0x78, 0x1e, 0x25, 0xbd,
+- 0xbe, 0x4f, 0x7a, 0x75, 0x90, 0x5e, 0x5f, 0xd2, 0xfe, 0x92, 0x31, 0x8b,
+- 0x7b, 0x57, 0xdc, 0xcb, 0xfb, 0x43, 0x06, 0x81, 0x16, 0x6b, 0x4c, 0x26,
+- 0xee, 0xc4, 0xeb, 0x94, 0x07, 0x6b, 0x28, 0xfe, 0x9d, 0x4a, 0x9b, 0xab,
+- 0xe7, 0x62, 0x6d, 0xa9, 0xf7, 0x29, 0x4f, 0x1b, 0x7f, 0xa8, 0x68, 0x67,
+- 0xc8, 0x4f, 0xb3, 0x13, 0x7f, 0x8a, 0x33, 0x8d, 0x6d, 0xfe, 0xb7, 0x60,
+- 0xb8, 0x9f, 0x88, 0x3f, 0x42, 0x35, 0x3f, 0xd5, 0x0d, 0xcb, 0xff, 0x0b,
+- 0x39, 0x59, 0x1c, 0x92, 0xda, 0x76, 0xf9, 0x25, 0xfc, 0x15, 0xce, 0x5c,
+- 0x17, 0xd6, 0x5e, 0x02, 0x8f, 0xb1, 0xeb, 0xf1, 0xf0, 0xec, 0xfd, 0x7c,
+- 0x1e, 0x2a, 0x48, 0xe9, 0xcc, 0xde, 0xc7, 0x4a, 0xf3, 0xbe, 0x9b, 0x40,
+- 0x7e, 0x03, 0xd5, 0xd2, 0xd6, 0x39, 0x54, 0x78, 0x9e, 0x26, 0xbf, 0x88,
+- 0x8e, 0xf1, 0xf8, 0x63, 0x5d, 0x6a, 0x21, 0x04, 0x89, 0x30, 0x0e, 0x61,
+- 0x84, 0x1e, 0x3e, 0x9f, 0xf1, 0x74, 0x3a, 0x48, 0xb9, 0xa0, 0xad, 0x2f,
+- 0x2a, 0xbe, 0x0d, 0x1b, 0x03, 0x70, 0x9e, 0x3b, 0x46, 0x79, 0x4e, 0x49,
+- 0x3d, 0x8d, 0xb6, 0x7e, 0xaf, 0xb8, 0x1b, 0xa9, 0xc6, 0xb6, 0xc1, 0xa3,
+- 0x08, 0x13, 0x66, 0x50, 0xa2, 0x67, 0x60, 0xcf, 0xb3, 0xb4, 0x20, 0x51,
+- 0x9d, 0xc8, 0x71, 0x26, 0x8d, 0xa3, 0x7e, 0x09, 0x37, 0x74, 0xa8, 0x97,
+- 0xa7, 0x31, 0x6f, 0x2f, 0xf6, 0x98, 0xd5, 0x05, 0x1a, 0x2f, 0xf9, 0x09,
+- 0xdb, 0xd4, 0xc0, 0x49, 0xb5, 0xbf, 0xa4, 0x6f, 0xc3, 0xd6, 0x34, 0xe7,
+- 0x69, 0x92, 0x0b, 0xf9, 0x66, 0x5f, 0x64, 0x1b, 0x86, 0x0a, 0x01, 0xec,
+- 0xcf, 0x86, 0xf7, 0xee, 0x26, 0x5c, 0x37, 0x56, 0x0e, 0x87, 0x36, 0x8b,
+- 0x00, 0xe9, 0x9b, 0xea, 0xff, 0xa6, 0x20, 0xd5, 0xc9, 0x7e, 0xfa, 0xb7,
+- 0xeb, 0x99, 0x53, 0x54, 0xcf, 0xbc, 0x4e, 0xbe, 0xe6, 0xad, 0xd6, 0xaa,
+- 0x4b, 0xf3, 0x26, 0xe6, 0x62, 0xeb, 0x71, 0xc9, 0xd2, 0x59, 0x90, 0x6c,
+- 0x8c, 0x73, 0x08, 0x9f, 0x8d, 0x71, 0x8b, 0xcd, 0x63, 0x86, 0xfb, 0xc1,
+- 0xce, 0x20, 0xe5, 0x34, 0xc6, 0x9c, 0x8e, 0x3f, 0x92, 0x48, 0x1e, 0x33,
+- 0xea, 0x0e, 0xac, 0x8b, 0xed, 0xc0, 0x90, 0xf6, 0x5d, 0xd4, 0x34, 0x71,
+- 0x3c, 0x92, 0x8d, 0x06, 0x9a, 0xf7, 0x42, 0x67, 0x2f, 0xc2, 0x4f, 0x31,
+- 0x3e, 0xfa, 0x19, 0xe1, 0x23, 0xf6, 0x5d, 0x9e, 0xbf, 0x51, 0x5f, 0x46,
+- 0xb8, 0xa2, 0xbe, 0xd3, 0xce, 0xf3, 0x37, 0x16, 0xf8, 0x4c, 0x26, 0xa8,
+- 0x36, 0x85, 0xe7, 0xdd, 0x95, 0x3a, 0x9e, 0xa0, 0x18, 0x93, 0x58, 0xee,
+- 0x02, 0x16, 0xf0, 0xd9, 0x63, 0xbb, 0x8e, 0x61, 0x7e, 0x97, 0x14, 0x04,
+- 0x66, 0xe3, 0x64, 0x1f, 0xff, 0xea, 0x8c, 0x51, 0xa8, 0x7a, 0x36, 0x94,
+- 0xfb, 0x27, 0x07, 0xcc, 0x24, 0xbf, 0x33, 0xe0, 0xa8, 0xf3, 0x52, 0xbc,
+- 0x0d, 0x56, 0x20, 0x79, 0x39, 0x2e, 0x4b, 0xea, 0xbc, 0xdc, 0x59, 0xd6,
+- 0x47, 0x38, 0xbe, 0x5b, 0xba, 0x70, 0xd2, 0x33, 0xbb, 0x26, 0x95, 0xe1,
+- 0xdd, 0x68, 0x1b, 0xfa, 0x40, 0xd4, 0x5a, 0x3b, 0x97, 0xd3, 0xed, 0x48,
+- 0x2d, 0xd6, 0x9d, 0x1b, 0xae, 0x64, 0x57, 0x13, 0x1d, 0xe7, 0x4c, 0x5c,
+- 0xb7, 0xc6, 0xda, 0xdf, 0x9a, 0x6e, 0xff, 0x73, 0x9a, 0x9b, 0xbf, 0x3f,
+- 0xe0, 0xe5, 0x33, 0x93, 0xc7, 0xb3, 0x2f, 0x9a, 0xd1, 0x85, 0xb6, 0x7c,
+- 0x4e, 0x90, 0xef, 0x07, 0x75, 0x07, 0x9a, 0xd5, 0xc8, 0xe5, 0x7e, 0xfa,
+- 0xfd, 0xb7, 0x05, 0x42, 0xfb, 0x2b, 0x07, 0xf1, 0xab, 0xbc, 0x8e, 0xc7,
+- 0x28, 0x0f, 0x34, 0xa8, 0x8a, 0x3f, 0xcf, 0xfb, 0xd7, 0x31, 0x9b, 0xff,
+- 0x9b, 0xf2, 0xe4, 0x87, 0x8d, 0x7e, 0xab, 0xc6, 0xb0, 0xf9, 0x2b, 0x10,
+- 0x7f, 0x03, 0x5e, 0xf6, 0x85, 0xc5, 0xe4, 0x17, 0x7b, 0xc9, 0x5f, 0x1f,
+- 0x23, 0x5b, 0xa3, 0x0a, 0x9e, 0xfc, 0x40, 0xd9, 0x0b, 0xf2, 0xd7, 0xb1,
+- 0x34, 0xcb, 0x3f, 0xe8, 0x1b, 0x18, 0xe5, 0xb8, 0x6b, 0xf5, 0x55, 0xb5,
+- 0x90, 0x83, 0xe3, 0xae, 0x15, 0x4f, 0x8d, 0x90, 0xe3, 0xd7, 0x75, 0x4c,
+- 0xd7, 0x48, 0x39, 0x1c, 0xf4, 0xf0, 0x79, 0x7e, 0x02, 0x87, 0x03, 0x9a,
+- 0x9d, 0x2b, 0xe7, 0x28, 0x1f, 0x5d, 0x22, 0x3a, 0xf6, 0xc7, 0x9a, 0x91,
+- 0xa2, 0x7c, 0x94, 0x51, 0x6d, 0x5b, 0x52, 0x67, 0x19, 0x63, 0xfe, 0x82,
+- 0x30, 0xa6, 0x12, 0x72, 0x49, 0x6d, 0xc3, 0x27, 0xb1, 0xcd, 0x3c, 0xd3,
+- 0xc8, 0x36, 0xe5, 0xc2, 0xe1, 0xf6, 0x59, 0xb3, 0x12, 0x60, 0x7e, 0x25,
+- 0xbc, 0xa8, 0x91, 0xcd, 0x5c, 0x17, 0x0e, 0xbe, 0x48, 0x39, 0x75, 0xa6,
+- 0xaa, 0x8f, 0x70, 0x61, 0xde, 0x1e, 0x63, 0x2c, 0xeb, 0x68, 0x0a, 0x6a,
+- 0xa2, 0x80, 0x3f, 0xa6, 0xef, 0xad, 0xc1, 0x4b, 0x55, 0x5b, 0x5d, 0x36,
+- 0xfb, 0xdf, 0xbd, 0xd5, 0x77, 0x6c, 0xac, 0x67, 0x42, 0x85, 0xfb, 0xe9,
+- 0x37, 0xcf, 0x19, 0xe0, 0xb3, 0x2d, 0x7c, 0xd6, 0xca, 0xb3, 0xb5, 0xb3,
+- 0x86, 0xfd, 0xc5, 0xcf, 0xef, 0x15, 0xac, 0x1b, 0xe3, 0xbe, 0x30, 0xf7,
+- 0x68, 0x24, 0xec, 0xbe, 0xfa, 0xde, 0x03, 0x7f, 0xf6, 0xe0, 0xd6, 0x31,
+- 0xee, 0x45, 0x9c, 0xb8, 0x59, 0xc6, 0x3f, 0x51, 0x1e, 0x96, 0xd9, 0xe7,
+- 0xc9, 0xd7, 0x7f, 0xd4, 0x75, 0x6a, 0x92, 0x73, 0xea, 0xdb, 0x5d, 0x9b,
+- 0xd2, 0xf3, 0x3a, 0xbe, 0xca, 0xd3, 0xe9, 0x7b, 0x28, 0xee, 0x64, 0xd2,
+- 0xca, 0x70, 0x44, 0xb2, 0xf6, 0xd5, 0x52, 0x25, 0xf1, 0x15, 0x2a, 0xd2,
+- 0x78, 0xbe, 0x5e, 0xf4, 0x8f, 0x85, 0xa8, 0xb6, 0xf1, 0xfb, 0x1e, 0x38,
+- 0x60, 0x52, 0xae, 0x70, 0xe2, 0xe9, 0xd1, 0xb0, 0xf6, 0x26, 0xe1, 0x9d,
+- 0x67, 0x46, 0x4d, 0xf3, 0x4d, 0x0d, 0x7f, 0xd2, 0x40, 0x35, 0x72, 0xbb,
+- 0x50, 0x12, 0x84, 0x0d, 0x42, 0xeb, 0x45, 0x5b, 0xb0, 0x00, 0xe5, 0xf4,
+- 0x4e, 0x9a, 0xef, 0x50, 0x11, 0x78, 0xb1, 0xe8, 0xc1, 0x0b, 0x63, 0xdc,
+- 0xfb, 0xf3, 0xa0, 0xf4, 0x54, 0x93, 0x6f, 0xdb, 0x81, 0x10, 0xc5, 0x58,
+- 0x19, 0xbd, 0x87, 0x12, 0xb8, 0xf5, 0x80, 0x40, 0x34, 0x92, 0x40, 0xcf,
+- 0xa1, 0x7a, 0xac, 0x1f, 0x93, 0x71, 0x31, 0x5e, 0x8f, 0xdb, 0x9e, 0x9a,
+- 0xe7, 0xe3, 0x9d, 0x6a, 0x9d, 0x27, 0x5b, 0xe7, 0xd8, 0x8e, 0x66, 0x39,
+- 0x66, 0x53, 0xbe, 0xc8, 0x72, 0x0c, 0x34, 0xcd, 0x60, 0xa7, 0xdd, 0xe7,
+- 0x78, 0x8e, 0xf2, 0xc7, 0x13, 0x9d, 0x6a, 0x30, 0xe8, 0xd0, 0x71, 0xc3,
+- 0x44, 0xe5, 0xdb, 0x0d, 0x30, 0x8f, 0xf3, 0x1e, 0xc6, 0xa7, 0xed, 0xa6,
+- 0x79, 0x6b, 0x3c, 0x72, 0x99, 0x2a, 0x3b, 0xf2, 0xa9, 0xb7, 0xc9, 0xa7,
+- 0x5a, 0xf0, 0x44, 0x76, 0x7e, 0xaf, 0x4b, 0xed, 0xbf, 0x20, 0x19, 0x3b,
+- 0xfc, 0x30, 0x3f, 0xa9, 0xd5, 0xcd, 0x4f, 0x5d, 0x7a, 0x24, 0xb8, 0x5d,
+- 0xf0, 0x19, 0x11, 0xee, 0x89, 0x9b, 0xe6, 0xd9, 0xb8, 0x69, 0x16, 0xe3,
+- 0x86, 0x7b, 0xd9, 0x0a, 0x3f, 0x0e, 0x2d, 0xe5, 0x77, 0x0d, 0xc2, 0xc9,
+- 0x66, 0xb2, 0x2f, 0xcf, 0x52, 0x35, 0xb8, 0x91, 0xea, 0x2b, 0x83, 0x82,
+- 0x5c, 0x68, 0xa1, 0xd2, 0x0f, 0xb4, 0xf8, 0xf6, 0x8f, 0x36, 0xe1, 0x99,
+- 0xb9, 0xdf, 0xe5, 0xe3, 0x39, 0x56, 0x3f, 0xed, 0x13, 0x0d, 0xab, 0x1b,
+- 0x10, 0x49, 0x6e, 0x01, 0xf7, 0x46, 0xf9, 0x4c, 0xaa, 0x81, 0xdb, 0xe2,
+- 0x83, 0xd8, 0x3a, 0xc6, 0xfb, 0x6b, 0x3f, 0xef, 0xfa, 0x64, 0xcc, 0xfc,
+- 0x5b, 0x37, 0xd1, 0xbf, 0xba, 0xb3, 0x2d, 0xe5, 0xb1, 0xde, 0x55, 0x3a,
+- 0x49, 0x75, 0x40, 0x23, 0xca, 0x33, 0x6a, 0x65, 0xb1, 0x48, 0xbe, 0xe9,
+- 0x45, 0x24, 0xd8, 0x4c, 0xb1, 0x6a, 0x8e, 0x7c, 0x77, 0xa6, 0xcc, 0x75,
+- 0xc0, 0x2f, 0xbb, 0xcc, 0x89, 0x45, 0x98, 0x9e, 0xa3, 0xb9, 0xb2, 0x6a,
+- 0xcf, 0x47, 0x84, 0xf3, 0xea, 0x74, 0xb3, 0xc1, 0xa3, 0x47, 0x4e, 0xb7,
+- 0x09, 0x09, 0x97, 0x97, 0x9b, 0x66, 0x6f, 0xa7, 0x3a, 0x5c, 0x2f, 0x30,
+- 0xe4, 0xd0, 0xd5, 0x44, 0xbb, 0x84, 0xaf, 0x06, 0x11, 0xe9, 0x39, 0x8b,
+- 0x48, 0xff, 0x39, 0x8a, 0x61, 0xcf, 0x96, 0xf9, 0x9c, 0xef, 0x23, 0xf8,
+- 0xdb, 0xb1, 0x85, 0x38, 0x3e, 0xf3, 0x50, 0xb5, 0x27, 0x06, 0xcf, 0x8d,
+- 0x2b, 0x74, 0x1c, 0x26, 0xbd, 0x9e, 0xd4, 0x6a, 0x28, 0xae, 0xcb, 0x70,
+- 0xb4, 0x42, 0x6e, 0xa4, 0x3a, 0x21, 0xf6, 0xb8, 0x69, 0x2e, 0x6b, 0xb5,
+- 0x6b, 0x9e, 0x65, 0xb3, 0xd7, 0xbe, 0xa3, 0x30, 0xdf, 0xef, 0x09, 0x92,
+- 0xfe, 0xda, 0x52, 0x5b, 0xc5, 0x49, 0xd3, 0xf8, 0x43, 0x41, 0x3c, 0xdf,
+- 0x56, 0x0f, 0x0f, 0xf3, 0x2d, 0x63, 0xe7, 0x04, 0xf7, 0xe1, 0x58, 0x6f,
+- 0xf0, 0xf4, 0xc4, 0x79, 0x9f, 0x9c, 0x75, 0x54, 0xf1, 0xac, 0x8b, 0x53,
+- 0x4c, 0x14, 0x3e, 0xc2, 0x53, 0x86, 0xbb, 0x9b, 0xf2, 0x53, 0xed, 0x18,
+- 0xbf, 0x2f, 0xe1, 0xc5, 0x63, 0x14, 0x37, 0x2e, 0x69, 0x75, 0xd8, 0xdf,
+- 0xc8, 0xb6, 0xc3, 0x74, 0x72, 0xcf, 0x70, 0x1b, 0xee, 0xe5, 0x77, 0x4e,
+- 0xca, 0xbf, 0x6b, 0x9d, 0x0d, 0xa4, 0x6b, 0x84, 0x0d, 0x98, 0x8e, 0xf9,
+- 0xf5, 0x7b, 0xb0, 0x78, 0x94, 0xf5, 0x78, 0xac, 0x2b, 0x48, 0x32, 0x7a,
+- 0x82, 0xec, 0xc2, 0xa1, 0x77, 0x43, 0x26, 0x5b, 0x5c, 0x1b, 0xbf, 0x76,
+- 0x0e, 0x75, 0xe8, 0x9c, 0x44, 0xf5, 0x9d, 0xc4, 0xfb, 0x79, 0x4a, 0xe2,
+- 0x88, 0xb8, 0x76, 0xce, 0x7c, 0x3d, 0xf7, 0x13, 0x8d, 0x19, 0x3b, 0x2f,
+- 0x1d, 0xa6, 0xbc, 0xf4, 0x4a, 0x8e, 0x7d, 0xe4, 0x17, 0x96, 0x8f, 0x38,
+- 0x28, 0xd6, 0xae, 0x49, 0x87, 0x70, 0x4e, 0x83, 0x5a, 0x83, 0x18, 0xd1,
+- 0x1d, 0xe9, 0xe9, 0xae, 0x62, 0x3e, 0x17, 0xc5, 0xff, 0x99, 0x9c, 0x32,
+- 0x68, 0xf5, 0x9f, 0x54, 0xa5, 0x8f, 0x3f, 0x79, 0xef, 0x3f, 0xa8, 0x0f,
+- 0xa1, 0x61, 0x25, 0x70, 0x7e, 0x94, 0xfb, 0x55, 0xbc, 0xcf, 0x35, 0x2c,
+- 0xae, 0xf0, 0x7b, 0x61, 0xb5, 0x43, 0x78, 0x2f, 0xce, 0xef, 0x5b, 0xb1,
+- 0xef, 0x3d, 0x0c, 0xf6, 0xbd, 0x06, 0x1a, 0xfb, 0xc9, 0x68, 0x38, 0xd4,
+- 0x43, 0x7e, 0x33, 0x00, 0xeb, 0xbc, 0x90, 0x36, 0x6b, 0xf7, 0xc7, 0x93,
+- 0xa7, 0xaa, 0xfb, 0x5b, 0x91, 0xea, 0xde, 0x5c, 0xb4, 0xd0, 0x23, 0x2e,
+- 0x15, 0x98, 0xa6, 0xb7, 0x89, 0xa6, 0x6e, 0xf1, 0xe1, 0xec, 0x3a, 0x71,
+- 0x71, 0xb6, 0x57, 0x9c, 0x2d, 0x70, 0x4c, 0xfe, 0x79, 0xd7, 0xae, 0x1c,
+- 0xe7, 0xb3, 0x3b, 0xc5, 0xbb, 0xf9, 0x0d, 0xe2, 0x42, 0xa1, 0x5f, 0x7c,
+- 0x34, 0x6b, 0xe0, 0xfe, 0x78, 0x2f, 0x0a, 0x63, 0xf0, 0xbb, 0xf5, 0xfb,
+- 0xc5, 0xa5, 0xbc, 0xdd, 0x27, 0xbc, 0x50, 0x68, 0xf1, 0x15, 0xd2, 0x5c,
+- 0x03, 0x1f, 0xa3, 0x1a, 0x78, 0x91, 0xef, 0x99, 0xc9, 0x80, 0xaf, 0x34,
+- 0xa9, 0x0c, 0xde, 0x23, 0x4c, 0xf3, 0xb6, 0xd8, 0x69, 0xd6, 0xa1, 0xf9,
+- 0x5a, 0xcc, 0xc6, 0x07, 0x3b, 0x49, 0x1e, 0x9b, 0x29, 0xb7, 0x4c, 0x6b,
+- 0x6d, 0x55, 0x2c, 0xc2, 0xb6, 0xce, 0xbc, 0x72, 0xae, 0xe6, 0xfd, 0xa7,
+- 0x21, 0x38, 0x3b, 0x81, 0xbd, 0xe9, 0xcf, 0x79, 0xbd, 0x44, 0xbc, 0x1a,
+- 0xae, 0x21, 0x7c, 0x4c, 0xbc, 0xbe, 0x3e, 0xfa, 0xf9, 0x7e, 0x9e, 0x93,
+- 0xc6, 0xee, 0x4a, 0x87, 0x53, 0x47, 0x84, 0x52, 0x29, 0xd8, 0xfb, 0x79,
+- 0x9a, 0x57, 0x52, 0x4e, 0x8f, 0x50, 0x1d, 0xd1, 0x2a, 0xd9, 0xbc, 0x26,
+- 0xaa, 0xbc, 0xde, 0x44, 0xbc, 0x5e, 0x2c, 0x70, 0x7d, 0xfe, 0x76, 0xd7,
+- 0x1b, 0xa3, 0x63, 0x66, 0x3d, 0xd5, 0xff, 0x75, 0x6a, 0xb7, 0xb8, 0x40,
+- 0x3c, 0x7f, 0x48, 0x3c, 0x7f, 0x5c, 0xb8, 0x53, 0x7c, 0x44, 0x7c, 0x5e,
+- 0x2c, 0xf0, 0x1e, 0x9e, 0x5b, 0x7c, 0x98, 0xb3, 0x79, 0xfc, 0xf0, 0x2a,
+- 0x8f, 0x41, 0xdf, 0xfe, 0x74, 0x93, 0xef, 0xd1, 0x49, 0xbf, 0x6f, 0xcf,
+- 0xa4, 0x69, 0x7e, 0xa8, 0x49, 0x3e, 0xe6, 0xeb, 0x55, 0xed, 0x8b, 0x7c,
+- 0xdd, 0x4c, 0x7c, 0xf1, 0xfe, 0xeb, 0x6f, 0xeb, 0x70, 0x9e, 0xaf, 0xc7,
+- 0xac, 0x73, 0x6c, 0xf6, 0x19, 0xa9, 0x7a, 0xde, 0x83, 0x25, 0xbe, 0x7c,
+- 0x74, 0xfd, 0x95, 0x7f, 0xcd, 0xd7, 0xe0, 0x05, 0xd2, 0x5f, 0xb1, 0xca,
+- 0x57, 0xfd, 0xbf, 0xc9, 0x17, 0xd5, 0xba, 0x63, 0xcc, 0x57, 0xa3, 0xfe,
+- 0xc6, 0x98, 0x49, 0xfa, 0x92, 0xac, 0x77, 0xc1, 0x8a, 0xd9, 0x1d, 0x78,
+- 0x25, 0xc6, 0xef, 0xc7, 0x45, 0x42, 0x47, 0x28, 0x9e, 0xce, 0x96, 0x3d,
+- 0xa2, 0xc6, 0xda, 0x87, 0xc5, 0x1b, 0xb5, 0x44, 0xd3, 0xe1, 0x19, 0x7e,
+- 0xff, 0x0b, 0x1a, 0x61, 0x01, 0x3f, 0xbf, 0x37, 0x37, 0x0d, 0xee, 0x97,
+- 0xf5, 0x8a, 0x86, 0x22, 0xef, 0xbb, 0x6e, 0x10, 0xbe, 0x22, 0x9f, 0xa3,
+- 0xeb, 0x11, 0xde, 0x62, 0xb7, 0xf0, 0x1c, 0x32, 0x4c, 0x8f, 0xba, 0x4e,
+- 0xd4, 0x1d, 0xba, 0x53, 0x78, 0xaa, 0x7b, 0xb0, 0xee, 0x62, 0xd0, 0x97,
+- 0xbe, 0x46, 0x1e, 0x17, 0xb5, 0x9b, 0x2d, 0x79, 0xbc, 0xa6, 0xcd, 0xef,
+- 0x1f, 0x5a, 0xe7, 0x10, 0xf9, 0x1c, 0x9c, 0x27, 0x48, 0xb5, 0x53, 0x43,
+- 0xb5, 0x76, 0x7a, 0x37, 0xc6, 0xe7, 0x7b, 0x0c, 0x92, 0x3f, 0x42, 0x4e,
+- 0x5d, 0xe9, 0x3f, 0x21, 0xd4, 0xd4, 0xfd, 0x22, 0x79, 0xab, 0x97, 0xea,
+- 0x9f, 0xad, 0xb1, 0x48, 0xf2, 0x06, 0x11, 0x49, 0x38, 0x05, 0xe7, 0x15,
+- 0x4d, 0xae, 0x2d, 0x19, 0xd8, 0x43, 0xf1, 0xed, 0xe5, 0x9c, 0x83, 0xb0,
+- 0x03, 0xbf, 0x43, 0xe6, 0xc4, 0x5a, 0xbf, 0x17, 0x4f, 0x12, 0xee, 0x78,
+- 0x22, 0x3b, 0x88, 0x27, 0x0b, 0x03, 0x78, 0xa2, 0xf0, 0xaf, 0xde, 0x95,
+- 0x91, 0x3d, 0xfa, 0xf9, 0x95, 0xd5, 0x33, 0x08, 0x89, 0xeb, 0x23, 0x1c,
+- 0xa3, 0x1f, 0x6e, 0x97, 0x23, 0x5c, 0xeb, 0xbe, 0x75, 0xf3, 0x07, 0x2a,
+- 0xfb, 0xa2, 0xba, 0xe2, 0x94, 0x85, 0x45, 0x1e, 0x59, 0x7e, 0xc8, 0x3a,
+- 0x1b, 0x95, 0xbe, 0x69, 0x97, 0xf5, 0x4e, 0xe7, 0x3b, 0x2b, 0x36, 0xa9,
+- 0xec, 0x0f, 0x0f, 0xc7, 0xd7, 0x58, 0xf9, 0xf5, 0x6f, 0x56, 0xd9, 0x3d,
+- 0x9a, 0x77, 0x56, 0x5d, 0x6f, 0xf7, 0xd1, 0x56, 0x45, 0xad, 0xcf, 0x33,
+- 0xab, 0xec, 0xfd, 0xed, 0x4f, 0x57, 0xb5, 0x5a, 0x9f, 0xe7, 0x57, 0xd9,
+- 0x3e, 0xf5, 0xee, 0x2a, 0xd5, 0xfa, 0xfc, 0x87, 0x55, 0x76, 0x5e, 0xbe,
+- 0xb4, 0x6a, 0xc9, 0xd5, 0xf7, 0x63, 0xf8, 0xef, 0xff, 0x00, 0x88, 0xf4,
+- 0x23, 0x6f, 0xec, 0x3a, 0x00, 0x00, 0x00 };
++ 0xc5, 0x7b, 0x7b, 0x74, 0x1c, 0x55, 0x9a, 0xdf, 0xef, 0x56, 0x3f, 0x54,
++ 0xdd, 0x6a, 0xb5, 0x4a, 0x72, 0xdb, 0x6e, 0xed, 0x68, 0xc6, 0x5d, 0xee,
++ 0x6a, 0xb9, 0xb1, 0x84, 0x5d, 0x2d, 0xb5, 0xec, 0x66, 0x5d, 0xb1, 0x7b,
++ 0x8c, 0xb0, 0x65, 0x10, 0x3b, 0xc2, 0xeb, 0x9d, 0x88, 0x09, 0x27, 0xf4,
++ 0x18, 0x19, 0x64, 0x63, 0x40, 0x30, 0x64, 0xa3, 0xd9, 0x25, 0xeb, 0x1a,
++ 0xf9, 0x81, 0x1f, 0xad, 0xee, 0xd6, 0xc3, 0xc8, 0xec, 0xd9, 0x13, 0x64,
++ 0x49, 0xb6, 0xcc, 0xd0, 0x0f, 0x33, 0xc0, 0xcc, 0x30, 0x27, 0x13, 0x77,
++ 0x8c, 0x01, 0x03, 0x63, 0x98, 0xdd, 0x6c, 0x92, 0x99, 0x3d, 0x49, 0xd6,
++ 0x07, 0xf3, 0xb0, 0xc1, 0x60, 0x32, 0x43, 0x12, 0xb1, 0xcb, 0x4c, 0xe5,
++ 0xfb, 0xaa, 0x25, 0x63, 0x58, 0xb2, 0x9b, 0x6c, 0xfe, 0x88, 0xce, 0xd1,
++ 0xe9, 0xee, 0xaa, 0x5b, 0xf7, 0x7e, 0xef, 0xef, 0xf7, 0x7d, 0xf7, 0x56,
++ 0x04, 0xf0, 0x62, 0xee, 0xaf, 0x86, 0xfe, 0xe3, 0xfd, 0x03, 0x0f, 0xb7,
++ 0xae, 0x88, 0xaf, 0xa0, 0xaf, 0x6d, 0x58, 0xec, 0x74, 0xf2, 0xcd, 0x55,
++ 0x02, 0x48, 0xbd, 0x87, 0x7f, 0xd4, 0xdf, 0x57, 0xff, 0x71, 0x8f, 0xc1,
++ 0x01, 0x28, 0xf3, 0x34, 0xf1, 0x3f, 0x64, 0xc9, 0x30, 0xd7, 0xac, 0xd7,
++ 0x20, 0x3b, 0x8c, 0xc4, 0xda, 0xbb, 0x34, 0x20, 0x99, 0x6f, 0x0e, 0xdd,
++ 0x88, 0xdf, 0x58, 0x66, 0xc0, 0x09, 0xbe, 0xfe, 0x55, 0xe3, 0xd3, 0x5d,
++ 0x3f, 0x5d, 0xad, 0x7e, 0x34, 0xe1, 0x80, 0xac, 0x18, 0x63, 0x50, 0x9a,
++ 0x20, 0x37, 0xd2, 0x33, 0x7f, 0xb6, 0xec, 0x79, 0x27, 0xfc, 0xf3, 0x73,
++ 0xc1, 0x74, 0x19, 0x3a, 0x76, 0x67, 0xfb, 0x31, 0x13, 0x07, 0x2e, 0xa6,
++ 0x23, 0xfa, 0x6e, 0x20, 0x27, 0x19, 0x91, 0xd0, 0x69, 0x84, 0x30, 0x9d,
++ 0x87, 0x59, 0x65, 0x68, 0xd8, 0x5f, 0x0a, 0xe1, 0x52, 0xfa, 0xb7, 0x56,
++ 0xc8, 0xd5, 0x8f, 0xb7, 0xe2, 0x90, 0x83, 0xc6, 0x23, 0x08, 0x66, 0x21,
++ 0xd7, 0x18, 0x03, 0x28, 0x0c, 0x01, 0x7b, 0xd3, 0x6a, 0x3f, 0xa0, 0xf6,
++ 0x14, 0x45, 0xf8, 0xec, 0x09, 0xa8, 0xdd, 0x0d, 0x8e, 0xe6, 0xd4, 0xed,
++ 0x42, 0x4d, 0xee, 0x14, 0x90, 0x05, 0x8d, 0x5d, 0x9e, 0xe7, 0xcf, 0x01,
++ 0x44, 0xf3, 0x32, 0xce, 0x3b, 0x78, 0x59, 0x83, 0xe4, 0x2c, 0xe0, 0xd4,
++ 0x74, 0xec, 0xcd, 0xc2, 0x74, 0x1a, 0x02, 0xbb, 0xe3, 0x11, 0x65, 0x0a,
++ 0x7c, 0x3f, 0x84, 0x41, 0x7b, 0x9c, 0x4a, 0x1c, 0x5b, 0xd6, 0x1e, 0xdd,
++ 0xb2, 0x8e, 0xe9, 0x55, 0x30, 0x15, 0x35, 0x08, 0x08, 0x0c, 0xea, 0x12,
++ 0x92, 0xca, 0xfa, 0x90, 0x13, 0x6a, 0x70, 0x1b, 0xfe, 0x96, 0xf8, 0x4d,
++ 0x46, 0x5d, 0xa8, 0x8c, 0x4f, 0xa1, 0x0a, 0x65, 0xa5, 0x22, 0xb1, 0xc9,
++ 0xb4, 0x65, 0xbd, 0xa4, 0x39, 0x71, 0x8c, 0x64, 0x33, 0x98, 0xff, 0x5b,
++ 0xab, 0x4c, 0x72, 0xd9, 0xa3, 0xcd, 0xaf, 0x2f, 0x63, 0x42, 0xb1, 0xac,
++ 0x29, 0xba, 0xb7, 0x2f, 0x3f, 0x2f, 0x63, 0xcb, 0x92, 0x34, 0xcb, 0xba,
++ 0x4b, 0xfb, 0x1b, 0x6b, 0xeb, 0xe7, 0xc6, 0xc6, 0xf0, 0xfd, 0x9c, 0x82,
++ 0xa7, 0xb2, 0x49, 0xe4, 0xd3, 0x16, 0x1c, 0x86, 0x13, 0x7d, 0x43, 0x21,
++ 0xec, 0x2c, 0x74, 0xa0, 0x90, 0x56, 0x53, 0xe7, 0xe9, 0xb9, 0xad, 0x71,
++ 0x0d, 0xf7, 0x15, 0x3a, 0x31, 0x93, 0x86, 0xe5, 0x31, 0xb4, 0xb2, 0x47,
++ 0x44, 0x71, 0x4f, 0xa1, 0x0b, 0xc5, 0xb4, 0x76, 0x76, 0x50, 0x44, 0x06,
++ 0x1a, 0x1c, 0x4e, 0x3c, 0x50, 0x68, 0xc1, 0xfd, 0x85, 0x04, 0x3d, 0x63,
++ 0xe1, 0xe6, 0x58, 0x23, 0x8d, 0x6f, 0xc5, 0x93, 0x63, 0x96, 0x15, 0x8d,
++ 0x29, 0xe8, 0x2b, 0xe8, 0x98, 0xc9, 0x49, 0x48, 0x1d, 0x73, 0x22, 0x75,
++ 0x14, 0xb8, 0xe7, 0x68, 0x2b, 0xa6, 0x72, 0x16, 0xb6, 0xea, 0x83, 0x0d,
++ 0x12, 0x5c, 0x48, 0x29, 0x02, 0x2e, 0xcd, 0x8f, 0x6d, 0x4a, 0x85, 0xf6,
++ 0xf3, 0x0e, 0x81, 0x1d, 0x47, 0xa3, 0xf8, 0x45, 0xda, 0xc4, 0xcd, 0xed,
++ 0x41, 0x0c, 0x14, 0x02, 0x78, 0x23, 0x1d, 0xa0, 0x35, 0x74, 0xbc, 0x9e,
++ 0x96, 0x69, 0x9d, 0x16, 0x9c, 0x49, 0xf3, 0x18, 0x1e, 0xeb, 0x43, 0x6f,
++ 0xa1, 0x11, 0xe7, 0xd2, 0x41, 0x5a, 0x33, 0x80, 0x57, 0x68, 0xdc, 0xf6,
++ 0x82, 0x86, 0xb3, 0x34, 0xae, 0xaf, 0x10, 0xc2, 0xcb, 0x69, 0x1f, 0xd1,
++ 0x1a, 0xc0, 0xe9, 0x74, 0x3f, 0x76, 0xa7, 0x9b, 0xcf, 0xde, 0x48, 0x32,
++ 0x0c, 0x2d, 0xe0, 0x75, 0xf8, 0xda, 0x5b, 0x56, 0x57, 0xc0, 0x36, 0x13,
++ 0x5a, 0x67, 0x7e, 0xdd, 0x7e, 0x0c, 0xa6, 0xcf, 0xcc, 0xf9, 0x89, 0x8e,
++ 0x03, 0xb9, 0x59, 0xeb, 0xa7, 0xcb, 0x1a, 0x71, 0x22, 0x0b, 0x3c, 0x39,
++ 0x05, 0x4c, 0x65, 0x4d, 0xab, 0xc6, 0xb0, 0xac, 0xc9, 0xf6, 0x16, 0x92,
++ 0x97, 0xd6, 0xb3, 0x95, 0x46, 0x3d, 0x55, 0x72, 0x02, 0x47, 0xd5, 0x9e,
++ 0x32, 0x24, 0x4c, 0xcc, 0x38, 0xe1, 0x1e, 0x52, 0x3b, 0x27, 0xa0, 0x9e,
++ 0xbd, 0x87, 0x3c, 0xe9, 0x58, 0x56, 0xed, 0x36, 0xb1, 0xcb, 0x0a, 0x1a,
++ 0x4d, 0xa1, 0x16, 0x87, 0x05, 0x3f, 0xd9, 0x42, 0xba, 0xc5, 0xb2, 0x6a,
++ 0x57, 0x5b, 0xd6, 0xb9, 0x76, 0x58, 0x92, 0xa1, 0x9d, 0x2d, 0x41, 0x2b,
++ 0x7f, 0x00, 0x6d, 0xe0, 0x34, 0xca, 0x5f, 0xf5, 0x21, 0xd2, 0x17, 0x76,
++ 0x44, 0xfa, 0x67, 0xe9, 0xd9, 0x9a, 0x02, 0x99, 0x32, 0xf1, 0xa2, 0x91,
++ 0x0d, 0x16, 0x4a, 0x32, 0x9c, 0xc4, 0x4f, 0xcb, 0x90, 0x65, 0x39, 0x35,
++ 0x1f, 0x7c, 0x24, 0xdf, 0x8d, 0x87, 0x2d, 0xeb, 0x1d, 0x5d, 0x81, 0x9b,
++ 0x74, 0x73, 0xd3, 0xb0, 0x85, 0x49, 0xfd, 0x34, 0xc9, 0x53, 0x20, 0xd5,
++ 0x1d, 0xa7, 0x67, 0x02, 0x34, 0x3e, 0x81, 0x8d, 0x43, 0x41, 0x7c, 0x3f,
++ 0x2b, 0xe3, 0xa7, 0xcb, 0xa2, 0xa8, 0xa6, 0xb9, 0xbc, 0x24, 0xab, 0x2a,
++ 0x92, 0x1f, 0x0a, 0x64, 0x6e, 0x85, 0x8a, 0x3d, 0xa2, 0x70, 0x9e, 0x78,
++ 0x0c, 0xe2, 0x07, 0xa5, 0x00, 0x9e, 0x2e, 0x29, 0x38, 0x59, 0x6a, 0xc4,
++ 0xa9, 0x92, 0x8e, 0x6c, 0x4e, 0xdd, 0x5f, 0x86, 0x85, 0x1a, 0x32, 0xe7,
++ 0x37, 0x26, 0x62, 0xc8, 0xe4, 0x2c, 0x2b, 0x4f, 0x34, 0x7b, 0x89, 0x87,
++ 0xd7, 0x27, 0xbe, 0x86, 0xe3, 0x63, 0x4e, 0x84, 0x26, 0x03, 0x78, 0x2a,
++ 0xed, 0xc4, 0x75, 0x19, 0xd5, 0x9c, 0x80, 0x16, 0xdd, 0x29, 0xb4, 0xe4,
++ 0x72, 0xa1, 0xe6, 0x4c, 0x44, 0x42, 0x2e, 0x21, 0xa1, 0xe9, 0xb8, 0x13,
++ 0x5a, 0x31, 0x04, 0x57, 0x93, 0x0c, 0xad, 0x89, 0xdc, 0xc8, 0x2f, 0xc1,
++ 0x4d, 0x7e, 0xb1, 0x71, 0x24, 0x4a, 0xd7, 0x02, 0x74, 0x0d, 0x5f, 0xab,
++ 0x82, 0x63, 0x91, 0x03, 0x24, 0x37, 0xcd, 0x81, 0xa4, 0xd3, 0xb2, 0x1c,
++ 0x5a, 0x2b, 0x7a, 0x1e, 0xa3, 0xcf, 0x36, 0x1e, 0xaf, 0x20, 0x5c, 0x24,
++ 0x19, 0x34, 0x11, 0x4d, 0x59, 0xa2, 0x31, 0x4b, 0x34, 0x66, 0x89, 0xc6,
++ 0xac, 0x83, 0x6c, 0x46, 0xd5, 0x81, 0x3f, 0x22, 0x5d, 0x85, 0x88, 0xbf,
++ 0x5f, 0xd8, 0x7a, 0x7a, 0xba, 0x14, 0x24, 0xfa, 0x43, 0x36, 0xfd, 0x4f,
++ 0xe6, 0x04, 0x24, 0x4d, 0xed, 0x3e, 0x8f, 0x75, 0x08, 0xc7, 0xd4, 0xe4,
++ 0x04, 0x92, 0xf4, 0x9c, 0xba, 0xdf, 0x84, 0xda, 0x59, 0x26, 0xfd, 0x6f,
++ 0x55, 0x12, 0x98, 0xc9, 0xba, 0x50, 0xad, 0xa9, 0x21, 0xd2, 0x57, 0xb4,
++ 0x8c, 0x05, 0xb8, 0x57, 0xa1, 0x39, 0x25, 0xb7, 0xa8, 0xc4, 0x90, 0x47,
++ 0x10, 0x19, 0x91, 0x30, 0xad, 0x3b, 0xc8, 0x3f, 0x75, 0x38, 0x9a, 0x68,
++ 0xb9, 0x62, 0x9c, 0x3e, 0x69, 0xfe, 0x2c, 0xad, 0x45, 0xf4, 0xd0, 0x7c,
++ 0xe4, 0x97, 0x2c, 0xc7, 0x28, 0xd1, 0xb0, 0xd7, 0xa6, 0xf7, 0x64, 0xa9,
++ 0x4b, 0x54, 0xec, 0xc7, 0x20, 0x7b, 0x51, 0x43, 0x10, 0x6a, 0x34, 0x24,
++ 0x54, 0x3d, 0x29, 0x14, 0x4c, 0x95, 0x7e, 0x46, 0x63, 0x02, 0xd7, 0x8c,
++ 0xe9, 0xc6, 0x60, 0x56, 0xe0, 0x46, 0xcd, 0xc2, 0x7a, 0xbd, 0x1b, 0xbb,
++ 0x4b, 0xf3, 0x7e, 0xc9, 0xb1, 0x4b, 0xf1, 0x4f, 0xa5, 0x3b, 0xb0, 0x27,
++ 0x1b, 0xc2, 0xee, 0x7c, 0xd0, 0x3f, 0x99, 0xe6, 0x7b, 0x1a, 0xf9, 0x3b,
++ 0xdf, 0x0b, 0x5c, 0x73, 0xaf, 0xf1, 0x9a, 0x7b, 0x09, 0x0c, 0x8e, 0x7e,
++ 0x85, 0x62, 0x48, 0x2d, 0x76, 0x6b, 0x1f, 0x91, 0xad, 0x68, 0x89, 0x5e,
++ 0x34, 0xe0, 0xbc, 0xd2, 0x82, 0x43, 0xe3, 0x5d, 0xd8, 0x33, 0xbe, 0x02,
++ 0x07, 0x46, 0x1b, 0x53, 0x5e, 0x63, 0x88, 0xd6, 0x0f, 0x27, 0x7b, 0x85,
++ 0xda, 0xef, 0x10, 0xe1, 0x68, 0x2f, 0xd9, 0x6e, 0x53, 0x9d, 0x65, 0x9d,
++ 0x8e, 0x91, 0x6d, 0xeb, 0xcd, 0xfa, 0x46, 0x12, 0x40, 0xb9, 0x5b, 0xed,
++ 0x7c, 0x0b, 0x3e, 0xdc, 0x4a, 0x36, 0x37, 0x15, 0x43, 0xaf, 0x03, 0x8e,
++ 0x16, 0x1f, 0x7e, 0x6d, 0x1d, 0x75, 0xb2, 0xdc, 0xad, 0x5d, 0x77, 0xe9,
++ 0x7b, 0x05, 0xc7, 0x39, 0xf7, 0xd5, 0x58, 0xc2, 0xf3, 0xf3, 0x33, 0x96,
++ 0x15, 0xa6, 0x79, 0xfa, 0x62, 0xcd, 0x89, 0x3e, 0xcc, 0x5a, 0xe7, 0xb7,
++ 0x74, 0x61, 0xf7, 0xcc, 0x0a, 0x1c, 0x1c, 0x75, 0x21, 0x59, 0x27, 0x50,
++ 0xab, 0x85, 0xcb, 0xf7, 0x62, 0x05, 0xcc, 0x29, 0x7e, 0xae, 0x0b, 0x47,
++ 0x66, 0x2a, 0xbf, 0xb3, 0x57, 0x7f, 0xcf, 0xcf, 0x77, 0x91, 0x74, 0xca,
++ 0xf2, 0xe4, 0x38, 0x49, 0x2a, 0x30, 0x9a, 0x71, 0x62, 0x34, 0x40, 0xba,
++ 0xed, 0x10, 0xce, 0xe3, 0x8b, 0xfc, 0xde, 0xc7, 0x2c, 0xbc, 0xa4, 0x93,
++ 0x9e, 0xb3, 0x1b, 0x84, 0xf7, 0x78, 0xa7, 0x70, 0x15, 0x37, 0x0b, 0xf7,
++ 0xe4, 0xb7, 0x84, 0x7c, 0x3c, 0x25, 0xaa, 0x8a, 0x2d, 0x24, 0xfb, 0x1e,
++ 0xe1, 0x39, 0xae, 0x86, 0x42, 0xe2, 0xbb, 0xa4, 0xcf, 0x2d, 0xc2, 0x51,
++ 0x84, 0x22, 0x19, 0x03, 0x42, 0x2a, 0xd2, 0x1c, 0xb6, 0x0d, 0xf1, 0x3a,
++ 0x41, 0xd2, 0x1b, 0x4c, 0x87, 0xd1, 0x8f, 0xad, 0x94, 0x23, 0x6e, 0x49,
++ 0x1b, 0x38, 0x98, 0xad, 0xa2, 0xf8, 0xc8, 0x7e, 0x3f, 0x4b, 0xeb, 0x6a,
++ 0x38, 0x54, 0x82, 0xe9, 0x31, 0x0e, 0x62, 0x05, 0xf9, 0xdb, 0xb9, 0x18,
++ 0xfb, 0x22, 0x90, 0xcf, 0x86, 0x93, 0x07, 0x85, 0x65, 0x55, 0x45, 0xac,
++ 0x25, 0xef, 0xe8, 0xcd, 0xd1, 0x33, 0xf8, 0x9f, 0xd6, 0x44, 0xa0, 0x1f,
++ 0xd1, 0x76, 0xc8, 0x55, 0xc6, 0x1e, 0xbc, 0x9b, 0x86, 0xec, 0x36, 0x4c,
++ 0xbc, 0x94, 0x06, 0x7c, 0x43, 0x83, 0x8a, 0x17, 0x64, 0x07, 0x08, 0x07,
++ 0x0f, 0x09, 0xb5, 0xfb, 0x02, 0xa5, 0xb3, 0x44, 0xbb, 0x39, 0x20, 0x81,
++ 0xe2, 0x91, 0x50, 0x7b, 0xce, 0x90, 0x3d, 0x7e, 0x57, 0xa8, 0xca, 0xac,
++ 0x60, 0x3f, 0xe5, 0x5c, 0xb2, 0x67, 0x2e, 0xa7, 0x98, 0xb8, 0xee, 0x9a,
++ 0x9c, 0x32, 0x48, 0x74, 0xed, 0x23, 0xba, 0x5e, 0xd4, 0xd5, 0xe0, 0x24,
++ 0xac, 0x25, 0xbd, 0x3a, 0xdf, 0x33, 0xb0, 0xa7, 0x64, 0x85, 0x1c, 0x06,
++ 0xcb, 0x0a, 0xa9, 0x2a, 0x03, 0xa6, 0x6c, 0x28, 0xe4, 0x1b, 0xbf, 0xb1,
++ 0x7a, 0xe3, 0xb2, 0xfe, 0x76, 0x5e, 0x21, 0x79, 0xc1, 0xef, 0x2c, 0x7c,
++ 0x59, 0xde, 0xb5, 0x20, 0x19, 0xbf, 0xb1, 0xee, 0x8c, 0xc3, 0xbf, 0xa4,
++ 0xe0, 0x4c, 0x55, 0x1b, 0xe8, 0x1e, 0x18, 0xda, 0x65, 0x35, 0x68, 0x12,
++ 0xc5, 0x29, 0x8d, 0xe2, 0xba, 0x2f, 0x71, 0xb9, 0xdd, 0x23, 0xce, 0xb5,
++ 0x07, 0xbb, 0x3e, 0xc8, 0x7b, 0x48, 0xcf, 0xe8, 0xde, 0x59, 0x48, 0x38,
++ 0xdf, 0x23, 0x5b, 0x73, 0x53, 0x4c, 0x45, 0xa1, 0xb1, 0xeb, 0x12, 0xe5,
++ 0xa1, 0x9b, 0x62, 0x9e, 0x7f, 0xea, 0x36, 0xa4, 0xaf, 0x79, 0xf0, 0xe0,
++ 0xca, 0xe9, 0x44, 0x2d, 0xc5, 0x75, 0x05, 0x67, 0xe3, 0x9d, 0x18, 0x2c,
++ 0x55, 0x91, 0x1d, 0x3e, 0x53, 0xde, 0xab, 0x35, 0x76, 0xbd, 0x9f, 0x5e,
++ 0xc2, 0x71, 0xe4, 0xd3, 0x7c, 0xbb, 0xd6, 0xbd, 0x53, 0x9c, 0xde, 0xe4,
++ 0x45, 0x1c, 0x07, 0x4a, 0xb2, 0xfc, 0x49, 0x1a, 0x1f, 0x2d, 0xd1, 0xb4,
++ 0xf2, 0x3a, 0x47, 0x53, 0xbf, 0xec, 0x68, 0x1a, 0x70, 0x53, 0x0c, 0xbe,
++ 0x78, 0xbd, 0xc0, 0x4b, 0xd7, 0x47, 0x12, 0x6e, 0xe1, 0xc1, 0xf9, 0xee,
++ 0x04, 0xd9, 0x49, 0x63, 0xca, 0x63, 0x50, 0xfc, 0x20, 0x93, 0x75, 0x68,
++ 0x09, 0xec, 0x9e, 0xc2, 0x23, 0x83, 0x7a, 0x17, 0xcc, 0x19, 0xb6, 0xa1,
++ 0x16, 0x0c, 0xce, 0x74, 0xc3, 0x2c, 0x39, 0x30, 0x11, 0x20, 0xe6, 0x4b,
++ 0x48, 0xb9, 0x8c, 0x96, 0x8e, 0x89, 0x7c, 0xaf, 0xab, 0xe2, 0xc3, 0xc4,
++ 0x7f, 0xf6, 0xa8, 0x1f, 0x5e, 0xd6, 0xf3, 0x59, 0x92, 0x51, 0x0b, 0x9e,
++ 0x29, 0x45, 0x29, 0xd6, 0xe9, 0x24, 0x17, 0x8d, 0xe2, 0x45, 0x88, 0xec,
++ 0x4b, 0xc6, 0xd6, 0x51, 0xf5, 0x08, 0xc5, 0x85, 0xdc, 0x04, 0xda, 0x91,
++ 0x0c, 0x28, 0x94, 0xbb, 0x5f, 0x9a, 0x8b, 0x01, 0xdb, 0xe8, 0x53, 0x35,
++ 0x93, 0xc0, 0x19, 0x09, 0x68, 0x6d, 0x30, 0x22, 0xfb, 0x1b, 0x48, 0x1f,
++ 0x75, 0x45, 0x0f, 0x1e, 0x18, 0xad, 0xc7, 0xfd, 0xe3, 0x5e, 0xec, 0x18,
++ 0xb5, 0x70, 0x39, 0xc6, 0xb6, 0xa1, 0xf6, 0x10, 0x89, 0x1d, 0xd5, 0x24,
++ 0xd7, 0x4d, 0xb1, 0x48, 0xc2, 0x23, 0x9c, 0xa8, 0x2a, 0x76, 0x13, 0x06,
++ 0x48, 0xb2, 0x5f, 0xe8, 0x34, 0x47, 0x68, 0xb7, 0x7e, 0x2b, 0x52, 0x01,
++ 0x19, 0xae, 0xa2, 0x8f, 0x62, 0x09, 0xfb, 0x31, 0xdf, 0xfb, 0x06, 0xb6,
++ 0xba, 0x7d, 0x70, 0x64, 0x64, 0xe4, 0x28, 0xff, 0x63, 0x91, 0x1b, 0x9d,
++ 0x4d, 0x12, 0xfd, 0x07, 0xfc, 0xd3, 0x63, 0x8d, 0xfe, 0x63, 0x14, 0x5f,
++ 0xef, 0xc9, 0x4a, 0xbc, 0x0e, 0xe3, 0x05, 0x9a, 0x5b, 0xc1, 0x93, 0x14,
++ 0xab, 0x1f, 0xa2, 0xf8, 0x73, 0xa2, 0x94, 0x17, 0x1c, 0x4f, 0x6c, 0x7e,
++ 0xb2, 0xc4, 0x5b, 0x96, 0x78, 0xcb, 0x12, 0x5f, 0x14, 0x17, 0x4e, 0x66,
++ 0x99, 0x8f, 0x2b, 0xe4, 0xa3, 0x09, 0xe2, 0xdd, 0x83, 0x6d, 0x44, 0xef,
++ 0x83, 0xe3, 0xd5, 0xb8, 0x8f, 0xe8, 0x2d, 0xea, 0x6a, 0xcf, 0x9f, 0x0b,
++ 0x0b, 0xf9, 0x98, 0x6a, 0xee, 0x14, 0x5e, 0x48, 0x4d, 0x96, 0xd5, 0xad,
++ 0x33, 0xcf, 0x64, 0xa7, 0x92, 0xcd, 0xf3, 0xfe, 0x24, 0x3c, 0xe8, 0xa3,
++ 0x67, 0x7a, 0xc7, 0xf1, 0xa9, 0x44, 0x3c, 0x79, 0x88, 0xc7, 0x83, 0xba,
++ 0x9a, 0x58, 0x4e, 0x71, 0xfd, 0x82, 0x16, 0x29, 0x5f, 0x70, 0xe0, 0xeb,
++ 0x24, 0x0f, 0x9d, 0xe5, 0xd1, 0x44, 0xfc, 0x3c, 0x40, 0x58, 0xc7, 0x6f,
++ 0x30, 0x9f, 0x91, 0xe8, 0xaf, 0x89, 0xf7, 0x48, 0x31, 0xe0, 0x3f, 0x77,
++ 0xb8, 0xd1, 0xff, 0xe2, 0x50, 0x85, 0xfe, 0x9d, 0x44, 0xff, 0x74, 0xcc,
++ 0xc2, 0x21, 0xa2, 0xff, 0x29, 0xa2, 0xbf, 0x8f, 0xe3, 0xf9, 0x1c, 0xfd,
++ 0x27, 0x4a, 0xbc, 0xee, 0x97, 0xf1, 0x30, 0x4f, 0x7f, 0x3d, 0xb6, 0x8e,
++ 0xcf, 0xcb, 0xcb, 0xb2, 0xee, 0xd4, 0x9f, 0xb5, 0xbe, 0x4d, 0x32, 0x5b,
++ 0x52, 0x64, 0xb9, 0x31, 0x8e, 0x8b, 0x1c, 0xb9, 0x07, 0x7d, 0x12, 0xbc,
++ 0x3e, 0x2c, 0x28, 0x72, 0x2e, 0x08, 0xe1, 0x59, 0xd2, 0xef, 0x29, 0xca,
++ 0x65, 0xcf, 0x94, 0xae, 0xcd, 0x6d, 0xac, 0xeb, 0x31, 0xd2, 0xb1, 0x3a,
++ 0x61, 0x52, 0x6c, 0x4b, 0x95, 0x92, 0xd8, 0x3b, 0x8e, 0xe4, 0xb4, 0xfe,
++ 0xaf, 0x29, 0xc0, 0x2c, 0x22, 0xfb, 0xaa, 0x4a, 0x2a, 0x9a, 0x17, 0x77,
++ 0x4d, 0x05, 0xd0, 0x5f, 0x5a, 0x8f, 0x2c, 0xc5, 0x9b, 0x9d, 0x14, 0x9f,
++ 0x3f, 0x8c, 0x25, 0x77, 0xf8, 0x11, 0x21, 0xfd, 0x06, 0x70, 0x2f, 0x3d,
++ 0x73, 0x70, 0x9c, 0xe9, 0x57, 0xe6, 0xf4, 0x1c, 0xc0, 0x3d, 0x74, 0x6d,
++ 0xdf, 0xb8, 0x8c, 0x17, 0xf4, 0x27, 0x08, 0xcf, 0x54, 0xf0, 0xc5, 0xdd,
++ 0x59, 0x28, 0xe4, 0x9e, 0x84, 0xff, 0x22, 0xd1, 0x17, 0xe8, 0xf7, 0xb6,
++ 0x92, 0xd7, 0x3f, 0x38, 0x86, 0xef, 0x2d, 0x31, 0xfc, 0x58, 0x40, 0x58,
++ 0xec, 0x76, 0x3d, 0x42, 0x76, 0xef, 0xc4, 0x40, 0x49, 0xc2, 0x77, 0xa6,
++ 0xbc, 0x78, 0x68, 0xf4, 0x53, 0xcb, 0x1d, 0x77, 0xe2, 0xb6, 0x26, 0x2f,
++ 0x1e, 0x9c, 0x4a, 0x62, 0xff, 0x38, 0x42, 0x55, 0xb1, 0x61, 0x8a, 0xdd,
++ 0x95, 0x7c, 0x50, 0x4d, 0xbc, 0x1f, 0x18, 0xf7, 0xf9, 0xfb, 0x0e, 0xb3,
++ 0x0c, 0xd6, 0x07, 0x3d, 0x40, 0xb9, 0x2a, 0xe6, 0xc0, 0x36, 0xdd, 0xb1,
++ 0xa0, 0x8a, 0x0c, 0xfd, 0x09, 0x9a, 0x6f, 0x12, 0x8e, 0x57, 0x97, 0x20,
++ 0x72, 0xa4, 0xc1, 0x51, 0xce, 0x2d, 0x40, 0x3d, 0x1e, 0x9a, 0x49, 0x62,
++ 0x98, 0x6c, 0xf4, 0x81, 0xd1, 0xc1, 0xef, 0xd5, 0x51, 0x0c, 0xf1, 0xb7,
++ 0xaa, 0x7d, 0x6f, 0x08, 0x03, 0xf9, 0x88, 0x07, 0x3b, 0xa7, 0x7c, 0xfe,
++ 0x1d, 0x87, 0xad, 0x75, 0x6c, 0x4f, 0xdb, 0x67, 0xea, 0x71, 0xdf, 0x38,
++ 0x5d, 0x1b, 0x65, 0x1b, 0x26, 0x5b, 0x8b, 0x54, 0x11, 0x6f, 0xe1, 0xa4,
++ 0x87, 0xf0, 0x92, 0x23, 0x56, 0x4d, 0xf2, 0xf0, 0xe0, 0x1e, 0xdb, 0x16,
++ 0x14, 0x6c, 0x1b, 0xb7, 0xf0, 0xa6, 0x1e, 0x45, 0x8e, 0xec, 0xfa, 0xc8,
++ 0xb8, 0x3a, 0xdb, 0x41, 0x58, 0xe7, 0x6d, 0x87, 0x7a, 0xa4, 0xc9, 0x91,
++ 0x44, 0x7d, 0x1b, 0xc5, 0xf8, 0x7a, 0xcb, 0xba, 0xbb, 0xb5, 0xb9, 0xff,
++ 0xe7, 0x44, 0x73, 0x9d, 0xb1, 0x08, 0xe5, 0x3a, 0x35, 0x07, 0x34, 0x0f,
++ 0xb8, 0xa5, 0xeb, 0x71, 0x7e, 0x21, 0xc7, 0x41, 0x8e, 0xe5, 0x01, 0x7f,
++ 0x7d, 0xa6, 0x92, 0xe3, 0xea, 0x8b, 0x8d, 0xfe, 0xba, 0x4c, 0xd0, 0x5f,
++ 0x57, 0x84, 0xdf, 0x5d, 0x04, 0x7e, 0x4c, 0xf1, 0x65, 0x41, 0xdb, 0x6f,
++ 0xac, 0x54, 0xbd, 0x8d, 0x07, 0xfd, 0xcf, 0x8f, 0xa9, 0x66, 0x19, 0xea,
++ 0x7e, 0x0a, 0x9b, 0x78, 0x7c, 0xc6, 0xe9, 0x3f, 0x4e, 0xd8, 0xaf, 0x5e,
++ 0x8b, 0x62, 0x1f, 0xe9, 0x73, 0x17, 0xd9, 0xc2, 0xaf, 0xdb, 0x80, 0x03,
++ 0x99, 0x70, 0x48, 0x17, 0x3d, 0x34, 0x31, 0xb0, 0xa7, 0x48, 0x31, 0x5f,
++ 0x4a, 0x52, 0x10, 0x53, 0xa3, 0x94, 0xd6, 0x90, 0xce, 0xb8, 0x60, 0x2e,
++ 0xac, 0xe8, 0xe4, 0xbe, 0xec, 0x29, 0xcb, 0xaf, 0x69, 0x13, 0x45, 0xd2,
++ 0xd9, 0xc3, 0x25, 0x1f, 0x06, 0x08, 0x0f, 0x2c, 0x20, 0x0c, 0xf9, 0x20,
++ 0xd9, 0xc5, 0x03, 0xa3, 0x0e, 0xa2, 0x8f, 0xc7, 0x25, 0x91, 0x5c, 0x54,
++ 0xc1, 0xa2, 0x0f, 0x4d, 0xb1, 0x5d, 0x92, 0x1d, 0x91, 0x2d, 0x3e, 0x4b,
++ 0x39, 0xff, 0x99, 0xcf, 0x61, 0x10, 0x55, 0x31, 0xaf, 0xe6, 0xfe, 0x8a,
++ 0x3c, 0x06, 0xc7, 0x99, 0x67, 0xf5, 0x08, 0xa4, 0x24, 0x6e, 0xd2, 0x7f,
++ 0x49, 0x39, 0x81, 0x79, 0x27, 0x0c, 0x3c, 0x1e, 0xc5, 0xa3, 0x59, 0xc2,
++ 0x34, 0xb1, 0xcb, 0xd6, 0x3d, 0x01, 0x96, 0x01, 0xf3, 0xb3, 0xca, 0xc1,
++ 0xf9, 0xb3, 0x9e, 0xb0, 0xef, 0xff, 0xbb, 0xdd, 0xdd, 0x65, 0xa5, 0x6c,
++ 0x2c, 0x4b, 0x18, 0x9b, 0xec, 0x29, 0x75, 0xd5, 0x7e, 0x1e, 0xb4, 0xce,
++ 0x07, 0x38, 0x5f, 0xd7, 0x23, 0x75, 0xd5, 0x16, 0xd8, 0x96, 0xb0, 0x44,
++ 0x6f, 0xdd, 0xfd, 0xa0, 0x02, 0xb6, 0x87, 0xe8, 0x35, 0xf6, 0x50, 0x45,
++ 0x34, 0x29, 0xd8, 0x31, 0xc3, 0xf6, 0x6b, 0x5d, 0x59, 0x62, 0xfc, 0xd6,
++ 0xfa, 0x64, 0xb5, 0x76, 0xe4, 0x97, 0xe8, 0xa2, 0xeb, 0x01, 0x7c, 0x87,
++ 0xfc, 0xe8, 0x5e, 0xe2, 0x73, 0x47, 0xfb, 0xbd, 0xb6, 0xdf, 0xee, 0x28,
++ 0xad, 0xa1, 0xeb, 0x2c, 0xef, 0x0e, 0xec, 0xcf, 0xea, 0x48, 0x67, 0xcb,
++ 0x9c, 0x87, 0xc8, 0xe6, 0xe3, 0xf8, 0x11, 0xc5, 0xd9, 0x67, 0x4b, 0x8c,
++ 0xc9, 0x12, 0x36, 0x1e, 0xfb, 0x61, 0xa9, 0x05, 0xcf, 0x91, 0x4f, 0x3e,
++ 0x43, 0x31, 0xf7, 0x07, 0x36, 0x4e, 0x73, 0x8a, 0x43, 0x69, 0xc2, 0xa4,
++ 0x43, 0x26, 0xd2, 0xf9, 0x10, 0x3c, 0x87, 0xc3, 0xfb, 0x77, 0x08, 0xf5,
++ 0xc7, 0x24, 0x2f, 0xff, 0x81, 0xe9, 0xa5, 0xa8, 0x3a, 0xac, 0x4e, 0x10,
++ 0xdd, 0xfe, 0x47, 0xa7, 0x35, 0xc2, 0xd4, 0x41, 0xff, 0xbe, 0xbc, 0xe2,
++ 0xdf, 0x3b, 0x16, 0xf0, 0xef, 0x9d, 0xae, 0x27, 0x3f, 0x5a, 0xe4, 0x1f,
++ 0x9c, 0x0e, 0xfa, 0x77, 0xa7, 0x1b, 0xfd, 0xbb, 0xf3, 0x6d, 0x08, 0xd5,
++ 0xc3, 0x5c, 0x44, 0x39, 0xe2, 0xbe, 0xd1, 0x6f, 0x62, 0xa2, 0xae, 0x12,
++ 0xf7, 0xfb, 0xc9, 0x36, 0x6a, 0xc9, 0x0e, 0x57, 0x4a, 0xb7, 0xa1, 0xbc,
++ 0xb0, 0x72, 0xed, 0x3b, 0x74, 0xed, 0xa1, 0x56, 0xf8, 0xff, 0xc2, 0x8e,
++ 0xbd, 0xc0, 0x73, 0x64, 0x6b, 0xcf, 0xb6, 0x52, 0x5d, 0x79, 0xd5, 0xd6,
++ 0x9c, 0x14, 0x6f, 0x2d, 0x4b, 0x6f, 0x13, 0x08, 0xb6, 0x6e, 0x00, 0x16,
++ 0xcc, 0xd7, 0x92, 0xc9, 0x09, 0x67, 0x6b, 0x12, 0x4b, 0xb4, 0x8d, 0x78,
++ 0x42, 0xa1, 0x54, 0xd3, 0xfa, 0x75, 0xcc, 0x3d, 0x83, 0xef, 0x8c, 0x7a,
++ 0x90, 0xda, 0xac, 0x60, 0x9a, 0xb0, 0xca, 0x76, 0x9a, 0x7f, 0x59, 0xac,
++ 0x59, 0x99, 0x21, 0x3d, 0x24, 0x15, 0xbe, 0x46, 0x3e, 0xd1, 0xba, 0x8a,
++ 0x7c, 0xa2, 0xb2, 0xfe, 0xd3, 0xa4, 0xaf, 0xdc, 0x4c, 0x14, 0x7b, 0x4b,
++ 0x3f, 0x91, 0x2a, 0xf9, 0x45, 0x9d, 0x48, 0xe2, 0xac, 0x3d, 0xf6, 0xe9,
++ 0xec, 0x1b, 0x56, 0xc8, 0xb6, 0x3b, 0x81, 0xc7, 0x56, 0x44, 0xf6, 0xff,
++ 0x27, 0xa9, 0x81, 0xf8, 0x22, 0xd9, 0x65, 0xed, 0x3a, 0xb2, 0x76, 0xb1,
++ 0xf6, 0x2f, 0xf0, 0x23, 0x85, 0x65, 0x3b, 0x20, 0xf6, 0x53, 0xbd, 0x4a,
++ 0xa5, 0x53, 0xed, 0x02, 0xed, 0x30, 0x9e, 0xe9, 0xe6, 0x6b, 0x01, 0xff,
++ 0x81, 0xb1, 0xa4, 0x14, 0xd0, 0xa0, 0xb8, 0x8c, 0x0e, 0x71, 0x60, 0x7a,
++ 0x91, 0xff, 0xd1, 0xb1, 0x0d, 0xe2, 0xd1, 0xe9, 0x46, 0xff, 0x60, 0xba,
++ 0x53, 0x0c, 0xe6, 0x37, 0x0b, 0x73, 0xe2, 0x5b, 0xc2, 0x9c, 0x4e, 0x09,
++ 0x33, 0xdf, 0x43, 0x9f, 0x5b, 0xc4, 0x58, 0x7e, 0x40, 0xec, 0xcd, 0xf3,
++ 0xfc, 0xa4, 0x2b, 0x5a, 0xe3, 0x87, 0x14, 0x7b, 0x9f, 0xa3, 0xd8, 0xfb,
++ 0x2c, 0xc5, 0xde, 0x67, 0xc8, 0xde, 0x7f, 0x70, 0x15, 0xe3, 0xb2, 0x8d,
++ 0x27, 0x19, 0x9b, 0xf8, 0xff, 0xbc, 0x78, 0x86, 0xf4, 0xcd, 0xb2, 0xfb,
++ 0x37, 0x64, 0xdb, 0x2c, 0x93, 0x87, 0x38, 0x57, 0x90, 0x9e, 0xde, 0xb7,
++ 0x6d, 0xf9, 0xb1, 0x15, 0x8c, 0xa5, 0x06, 0xc4, 0x56, 0xa2, 0x2f, 0xe9,
++ 0x24, 0x0c, 0xa4, 0x11, 0x3e, 0xc9, 0x0e, 0x88, 0xbb, 0xf3, 0x7c, 0xfd,
++ 0x20, 0x76, 0x52, 0x4d, 0x78, 0x28, 0x16, 0xee, 0xee, 0x25, 0xec, 0xb4,
++ 0x89, 0xb0, 0xd3, 0xb2, 0x98, 0x8c, 0x8b, 0x2d, 0x9f, 0x58, 0x58, 0x88,
++ 0xe4, 0xfd, 0x71, 0x75, 0x62, 0xa2, 0x92, 0x6f, 0x73, 0x19, 0x70, 0xdd,
++ 0x8e, 0xda, 0x1a, 0x4d, 0x3d, 0x91, 0x44, 0x78, 0x7f, 0x5c, 0x82, 0xe9,
++ 0x36, 0x5c, 0xb8, 0xcf, 0xae, 0x15, 0xd7, 0x63, 0x74, 0x54, 0x60, 0x5b,
++ 0x6b, 0xf2, 0x8f, 0x5c, 0x24, 0xab, 0xb7, 0xdb, 0x11, 0x20, 0xf5, 0x0a,
++ 0x99, 0xea, 0xfa, 0x4e, 0x92, 0x5e, 0x07, 0xe5, 0xdc, 0x27, 0xb2, 0xab,
++ 0xd0, 0xd0, 0x2a, 0x93, 0x0e, 0x9d, 0xb8, 0xb3, 0x78, 0x13, 0xe9, 0x31,
++ 0x72, 0xe4, 0x79, 0x78, 0xfd, 0x2f, 0x8c, 0x19, 0x18, 0xca, 0xe2, 0x7b,
++ 0x3e, 0xaa, 0xe1, 0xee, 0x25, 0xfc, 0xf4, 0x03, 0xa2, 0x61, 0x63, 0x6b,
++ 0xa4, 0x93, 0x6a, 0x79, 0xc5, 0x6b, 0xb8, 0x31, 0xd2, 0xe4, 0x87, 0xa2,
++ 0xa5, 0xc4, 0x2b, 0xf9, 0xc8, 0x91, 0x1d, 0xd2, 0xb7, 0xc4, 0xcf, 0xa7,
++ 0x0d, 0x3c, 0x5a, 0xea, 0x11, 0x7f, 0x31, 0x2d, 0x83, 0x74, 0x43, 0x71,
++ 0x4b, 0xc7, 0x11, 0xa2, 0xcb, 0x45, 0x18, 0xc9, 0xf5, 0xfb, 0x02, 0x8b,
++ 0xb5, 0x24, 0xbe, 0xb3, 0x8a, 0x7d, 0xa1, 0x12, 0xd3, 0x9c, 0xab, 0x80,
++ 0xfd, 0x64, 0x93, 0x0d, 0x99, 0x0e, 0xb1, 0x84, 0xbe, 0x5f, 0xa4, 0xbc,
++ 0x96, 0x94, 0x3a, 0x45, 0x03, 0x61, 0xd3, 0x85, 0x93, 0x5b, 0xc4, 0x82,
++ 0x22, 0x63, 0x51, 0x28, 0x0b, 0x49, 0x46, 0x0b, 0x8b, 0x17, 0x1d, 0x95,
++ 0x1a, 0xc0, 0xc5, 0xb6, 0x64, 0xfa, 0x0c, 0xd9, 0x7f, 0x88, 0x62, 0xfb,
++ 0x8e, 0x58, 0x27, 0xe1, 0x64, 0xbe, 0x3e, 0x20, 0x86, 0x48, 0x8e, 0x13,
++ 0x2e, 0xdb, 0x76, 0xfc, 0x4f, 0x8c, 0xc1, 0xd5, 0x60, 0x20, 0xe4, 0xa6,
++ 0xdc, 0xf1, 0xdf, 0xdb, 0x22, 0xe6, 0xf3, 0x52, 0x97, 0xc8, 0xe5, 0x03,
++ 0xfe, 0x23, 0x63, 0x9c, 0x67, 0x3a, 0xc4, 0x11, 0xd2, 0x79, 0x96, 0x74,
++ 0x9e, 0x25, 0x9d, 0x67, 0x48, 0xe7, 0x99, 0x2f, 0xd1, 0xf9, 0x3e, 0xd2,
++ 0xf9, 0xee, 0xfc, 0xaf, 0x6c, 0x1d, 0x3a, 0x0d, 0x03, 0x59, 0xca, 0xcb,
++ 0x23, 0x4d, 0x15, 0xfe, 0x3e, 0x24, 0x59, 0xbc, 0x14, 0xfb, 0x86, 0x13,
++ 0x5e, 0x83, 0x62, 0x6b, 0x17, 0x3d, 0xf3, 0x95, 0x39, 0x1b, 0x57, 0xfc,
++ 0xc3, 0x63, 0x1d, 0x62, 0x98, 0xfc, 0x6e, 0x84, 0xe6, 0x1f, 0x21, 0xbf,
++ 0x1b, 0x4c, 0xff, 0x9f, 0xd8, 0x0d, 0xdb, 0x1d, 0x4c, 0x2f, 0xe5, 0xad,
++ 0x6a, 0xb2, 0x4b, 0xa7, 0xc1, 0x36, 0xb4, 0x59, 0x24, 0x8f, 0x7e, 0x4b,
++ 0x24, 0x8f, 0xa5, 0x44, 0xb2, 0xd0, 0x43, 0x9f, 0x5b, 0xc4, 0x2d, 0x76,
++ 0x1d, 0x3a, 0x20, 0x3a, 0x0a, 0x01, 0xff, 0x38, 0xad, 0x33, 0x4e, 0x7c,
++ 0x3c, 0x46, 0xeb, 0x3c, 0x66, 0xdb, 0x2e, 0x15, 0x99, 0x5e, 0x5e, 0x8b,
++ 0xed, 0x8c, 0xed, 0xeb, 0x32, 0xd1, 0xce, 0xbe, 0x71, 0xb5, 0xc7, 0x43,
++ 0x7f, 0x37, 0x38, 0xa0, 0xed, 0x74, 0x56, 0x78, 0xe2, 0xdc, 0xcf, 0xb9,
++ 0x9e, 0xe3, 0xb0, 0x62, 0xd7, 0x82, 0xcf, 0x5e, 0xc5, 0x00, 0x8c, 0x07,
++ 0x20, 0x2f, 0x30, 0xb6, 0x18, 0xdf, 0x69, 0xfa, 0x1f, 0x34, 0x5f, 0x3f,
++ 0xf4, 0x55, 0x90, 0x03, 0xc6, 0x5f, 0x1a, 0x63, 0x4d, 0x14, 0xa7, 0x69,
++ 0x4e, 0x39, 0x03, 0x68, 0x19, 0x81, 0xdd, 0x09, 0x41, 0x38, 0x76, 0x11,
++ 0xf9, 0x25, 0xd3, 0xaf, 0x76, 0x52, 0x36, 0xc1, 0xd2, 0x21, 0xc8, 0x4b,
++ 0x8c, 0x9d, 0xb0, 0xb2, 0x90, 0x6b, 0x8d, 0x3e, 0x5c, 0x19, 0x0a, 0x07,
++ 0x3b, 0xa1, 0xa6, 0x2e, 0x38, 0xd4, 0x32, 0xe5, 0xb7, 0xfe, 0xdd, 0x42,
++ 0xed, 0x9b, 0x15, 0xdc, 0x27, 0x62, 0xec, 0xbe, 0x13, 0x2d, 0x36, 0x86,
++ 0xef, 0x43, 0x73, 0x1e, 0x54, 0x87, 0x0b, 0xbc, 0x43, 0x73, 0xbe, 0xa8,
++ 0x7f, 0xc0, 0x39, 0x21, 0x49, 0x58, 0xf0, 0x0b, 0x73, 0x81, 0x70, 0x0c,
++ 0xcf, 0xc3, 0x73, 0x84, 0x95, 0x3e, 0x9a, 0xf7, 0x4d, 0x47, 0x73, 0xff,
++ 0xa0, 0x50, 0x13, 0x5f, 0x9c, 0x6f, 0x59, 0x1e, 0x62, 0x59, 0xc6, 0xb4,
++ 0xaa, 0x35, 0x2f, 0xe3, 0x21, 0xe9, 0x1d, 0x4d, 0x4b, 0xbe, 0x86, 0x10,
++ 0x96, 0x51, 0x9d, 0x1c, 0x2d, 0x32, 0x0f, 0xbb, 0x70, 0x46, 0x57, 0xbb,
++ 0xa9, 0x1a, 0xa5, 0xba, 0xa5, 0x03, 0x07, 0x29, 0xf6, 0x3e, 0x5a, 0xe2,
++ 0x3e, 0xd7, 0x80, 0x58, 0x3e, 0x44, 0x7e, 0x69, 0xdb, 0x13, 0xe4, 0x06,
++ 0xe3, 0x61, 0xdc, 0x40, 0xeb, 0xfb, 0xa9, 0xf6, 0x79, 0x9d, 0xd6, 0x97,
++ 0x32, 0xea, 0x00, 0xad, 0x9f, 0x7a, 0x43, 0x84, 0x67, 0x89, 0xaf, 0x9e,
++ 0x75, 0x8e, 0xe6, 0xbe, 0x5d, 0x42, 0x4d, 0x12, 0xe9, 0xe4, 0xc7, 0xbc,
++ 0xf6, 0xc3, 0xcc, 0x0b, 0x7d, 0x52, 0x9d, 0x43, 0x76, 0xd4, 0x54, 0x90,
++ 0x45, 0x64, 0x78, 0x3d, 0xf6, 0x4e, 0xad, 0xc7, 0x1e, 0xf2, 0xc7, 0x03,
++ 0x7a, 0x2d, 0x42, 0x75, 0xa8, 0xa9, 0xd5, 0x30, 0x7b, 0x41, 0x13, 0x8e,
++ 0x1d, 0x2d, 0x8d, 0x64, 0xc7, 0xa7, 0x1b, 0xaa, 0xf0, 0x91, 0xd5, 0xab,
++ 0xad, 0xef, 0xa4, 0x88, 0x78, 0x83, 0x07, 0xe3, 0x0e, 0xf2, 0xef, 0x5f,
++ 0xfc, 0x9a, 0x02, 0xaa, 0xc7, 0x60, 0xdc, 0x96, 0x10, 0x97, 0xf2, 0x67,
++ 0x9d, 0x15, 0x3f, 0x68, 0xc2, 0x15, 0x05, 0xb5, 0x41, 0x6d, 0x39, 0x66,
++ 0x15, 0x99, 0xe2, 0x85, 0x69, 0xd7, 0x64, 0x37, 0xe7, 0xba, 0xd1, 0x40,
++ 0xf5, 0xf1, 0x9d, 0xb1, 0x5f, 0x5b, 0x9f, 0x2c, 0xe6, 0xe7, 0x4e, 0x7a,
++ 0x2a, 0xb1, 0xf3, 0xcb, 0xe6, 0x88, 0x53, 0xbc, 0x69, 0xa6, 0x7a, 0xb6,
++ 0x9a, 0x82, 0x74, 0x27, 0xe5, 0x23, 0xb5, 0x27, 0x4d, 0xf5, 0x68, 0x5f,
++ 0xa4, 0x59, 0x77, 0x08, 0x37, 0xca, 0x81, 0x70, 0x7f, 0x2f, 0x92, 0xdb,
++ 0xfd, 0x73, 0x74, 0x3c, 0x2b, 0x34, 0x17, 0x3d, 0xc7, 0xf3, 0x5c, 0x63,
++ 0x4f, 0x27, 0xc9, 0x9e, 0xf8, 0x3e, 0x7f, 0xbf, 0x7a, 0x5f, 0xfe, 0x8a,
++ 0xf1, 0x97, 0xff, 0xe4, 0x8f, 0x97, 0x7d, 0xd9, 0xf5, 0x8f, 0xbf, 0xe4,
++ 0xfa, 0xff, 0xae, 0xae, 0x2f, 0xd7, 0x39, 0x6d, 0xcc, 0x90, 0x94, 0xb8,
++ 0x8f, 0xe9, 0x34, 0x2e, 0xaf, 0xd9, 0xa3, 0xfd, 0x0e, 0xc5, 0x34, 0xee,
++ 0x63, 0x70, 0x9e, 0x3e, 0x6f, 0xf7, 0x31, 0x4e, 0x7d, 0x0e, 0xb3, 0x72,
++ 0x6c, 0xf1, 0x88, 0xea, 0x11, 0xd3, 0xaa, 0xd7, 0xbe, 0x4d, 0x75, 0xcd,
++ 0x2e, 0xf4, 0xc6, 0x74, 0x0c, 0x67, 0xd5, 0xee, 0xdb, 0xa0, 0x25, 0x37,
++ 0x0b, 0x9a, 0xa8, 0xe8, 0x11, 0x8e, 0x91, 0xb9, 0x7b, 0xba, 0x49, 0xb5,
++ 0x5a, 0x19, 0x55, 0x14, 0x9b, 0x9c, 0x9a, 0x22, 0xa3, 0x18, 0x90, 0x9d,
++ 0xc5, 0xa0, 0xec, 0x2e, 0x36, 0xca, 0x55, 0x34, 0xce, 0x37, 0xa2, 0xce,
++ 0xde, 0x86, 0x5d, 0x98, 0x6d, 0xf3, 0x9a, 0x0d, 0x86, 0xaa, 0x34, 0x38,
++ 0x76, 0x61, 0x4f, 0x8c, 0x9f, 0xed, 0xa0, 0x9a, 0x0d, 0xa2, 0x2e, 0x43,
++ 0xc8, 0xd8, 0x10, 0xd8, 0xdb, 0xae, 0x0e, 0x2c, 0x95, 0xb4, 0xce, 0x5f,
++ 0x09, 0xa7, 0xec, 0x29, 0x42, 0xf8, 0x33, 0x12, 0x8e, 0xb4, 0xc3, 0xe3,
++ 0x59, 0xa5, 0xf6, 0x9d, 0x16, 0x03, 0x78, 0x2a, 0x16, 0xe9, 0xde, 0x26,
++ 0x42, 0xb2, 0x97, 0xee, 0xb9, 0x32, 0x14, 0x7f, 0x33, 0xa6, 0xc7, 0xb5,
++ 0x4a, 0x0d, 0x4a, 0x22, 0x89, 0x5e, 0x4d, 0xd3, 0x47, 0x20, 0xd3, 0x9a,
++ 0x10, 0x55, 0x19, 0x75, 0xf6, 0x4d, 0xc2, 0x54, 0x9f, 0x2c, 0x1b, 0x40,
++ 0x6b, 0x5b, 0x64, 0x7f, 0x8f, 0xa4, 0xc9, 0x84, 0xf5, 0x84, 0x33, 0xe3,
++ 0xc3, 0xca, 0xc3, 0xf3, 0x7d, 0x1d, 0xcb, 0xfa, 0x30, 0x56, 0x26, 0xbd,
++ 0x40, 0xae, 0x29, 0x46, 0x65, 0x1f, 0xe1, 0xfa, 0xe6, 0xc3, 0x8c, 0xb3,
++ 0x2c, 0x6b, 0x47, 0xac, 0xfc, 0x75, 0x2f, 0x5a, 0x88, 0xc7, 0x6e, 0x4c,
++ 0xa5, 0x19, 0x77, 0x19, 0x98, 0xa4, 0x9a, 0x48, 0x1b, 0x6a, 0xc4, 0x71,
++ 0x8a, 0x43, 0x33, 0x69, 0xee, 0xff, 0xf4, 0x91, 0x8c, 0x7b, 0x88, 0xfe,
++ 0x2d, 0x54, 0x0f, 0xa7, 0x28, 0x7e, 0xb1, 0x8c, 0x7b, 0xc9, 0xee, 0x21,
++ 0x7b, 0x8d, 0x3a, 0xe3, 0xe6, 0x61, 0xc8, 0x1e, 0xc3, 0x6b, 0x5c, 0x77,
++ 0x18, 0x75, 0x94, 0xf7, 0x0d, 0xaa, 0x78, 0x10, 0x8d, 0x44, 0xf4, 0x8b,
++ 0x88, 0x04, 0x5f, 0x24, 0x7d, 0x0c, 0x6a, 0xc0, 0x6e, 0xbb, 0xd6, 0x76,
++ 0xc2, 0xcc, 0x73, 0x0d, 0x0d, 0x4f, 0x55, 0x7b, 0x1d, 0xde, 0xc9, 0x45,
++ 0xed, 0x1e, 0x92, 0x49, 0xf5, 0xcf, 0x0b, 0xba, 0x9a, 0x9a, 0xa0, 0xe7,
++ 0xb6, 0x2a, 0xff, 0x65, 0x5f, 0x75, 0x1c, 0x32, 0xc5, 0x34, 0xb2, 0xbd,
++ 0x3f, 0xf5, 0xbe, 0x49, 0x36, 0x7a, 0xfb, 0xd8, 0x9f, 0x79, 0xaf, 0xc4,
++ 0x27, 0xbc, 0x1f, 0xc4, 0x2d, 0x2b, 0x41, 0x78, 0xb4, 0x87, 0xea, 0xed,
++ 0x0f, 0x87, 0x4c, 0xef, 0xc5, 0x38, 0xf7, 0x81, 0x9d, 0xf8, 0x3d, 0xfa,
++ 0xfd, 0xe4, 0x90, 0x8c, 0x4d, 0x85, 0x06, 0xb8, 0x86, 0x1d, 0x98, 0xd2,
++ 0x6f, 0x44, 0xaf, 0x22, 0xe1, 0xee, 0xe8, 0x49, 0xb2, 0x49, 0x89, 0xc6,
++ 0x1c, 0xa2, 0xdf, 0xdc, 0xd3, 0x7a, 0x0c, 0xdb, 0x94, 0x69, 0xef, 0x3b,
++ 0x71, 0xa6, 0x17, 0x4c, 0xaf, 0x2c, 0x69, 0xb7, 0x62, 0xeb, 0x6d, 0x5c,
++ 0x5b, 0xd9, 0xff, 0x9e, 0x17, 0xdb, 0xeb, 0x71, 0x3c, 0xd7, 0x80, 0xe7,
++ 0x73, 0xa6, 0xe7, 0xb5, 0xf6, 0x28, 0xfa, 0x86, 0x2c, 0xbc, 0xac, 0x9b,
++ 0x03, 0x55, 0x64, 0xe7, 0x09, 0xaa, 0xaf, 0xc2, 0x6d, 0xdc, 0x4b, 0x40,
++ 0xc4, 0x81, 0x48, 0x3f, 0x81, 0xcc, 0x3b, 0x28, 0x74, 0xa5, 0x6a, 0xa8,
++ 0x4e, 0x3b, 0x27, 0x2c, 0xf7, 0xf6, 0x76, 0x27, 0xd1, 0x00, 0x6c, 0x28,
++ 0xb4, 0x90, 0xdc, 0xa2, 0xd8, 0x14, 0x91, 0xb1, 0xb1, 0xa0, 0xe3, 0xf9,
++ 0xb4, 0x0f, 0xb7, 0x17, 0xe2, 0x84, 0xbd, 0x15, 0xa2, 0x3d, 0x81, 0x52,
++ 0x3a, 0x80, 0x6f, 0x14, 0x1a, 0x49, 0xde, 0x41, 0xdc, 0x58, 0x08, 0xe1,
++ 0x44, 0x9a, 0xf3, 0xb7, 0xe1, 0xd9, 0x1a, 0x6f, 0x44, 0x67, 0x41, 0xc3,
++ 0x74, 0x1a, 0x9e, 0x07, 0xe2, 0x21, 0x74, 0x14, 0xa2, 0x28, 0x10, 0x86,
++ 0xbb, 0x95, 0xe6, 0xbc, 0x9d, 0x74, 0xd2, 0x52, 0x08, 0x60, 0x69, 0x84,
++ 0x22, 0x72, 0xc1, 0x27, 0x06, 0x08, 0x5b, 0x25, 0x0a, 0xf5, 0xb8, 0x38,
++ 0xcc, 0x76, 0xae, 0x18, 0x7b, 0x72, 0x0a, 0x42, 0x05, 0xac, 0x94, 0x01,
++ 0x0a, 0xd6, 0x91, 0x54, 0x81, 0xe8, 0x3d, 0xd8, 0x5e, 0xe9, 0xe1, 0x2e,
++ 0x2f, 0x7c, 0xc6, 0x6f, 0x2d, 0xe9, 0xe9, 0xca, 0xe1, 0x69, 0xef, 0x27,
++ 0x71, 0x8e, 0x4d, 0x9f, 0xae, 0x79, 0xfd, 0x30, 0x10, 0x1d, 0x67, 0xde,
++ 0xec, 0xd8, 0xc8, 0xf1, 0xb0, 0x45, 0xc6, 0xaf, 0x2c, 0xaa, 0x41, 0x43,
++ 0x53, 0xbc, 0x57, 0xa0, 0xf9, 0x88, 0x0e, 0x05, 0x49, 0x5a, 0xfb, 0x96,
++ 0xc2, 0x0f, 0xad, 0xad, 0x0b, 0x83, 0xb8, 0x39, 0x52, 0x91, 0xd5, 0x39,
++ 0xd2, 0xe1, 0xe4, 0x70, 0x03, 0x66, 0x88, 0x06, 0x97, 0xe1, 0x36, 0x8e,
++ 0x8d, 0x59, 0xd8, 0xa0, 0x9b, 0xde, 0xd7, 0xda, 0x97, 0xe3, 0xfe, 0xc3,
++ 0x83, 0x67, 0xdd, 0xa4, 0xd7, 0x59, 0xfd, 0x0e, 0x3c, 0x3a, 0x8e, 0xaf,
++ 0x35, 0x00, 0x8f, 0x04, 0xc1, 0x3d, 0x6b, 0x35, 0x74, 0x02, 0x91, 0xce,
++ 0x07, 0x10, 0x51, 0x34, 0xa1, 0xea, 0x2f, 0x0b, 0x24, 0xab, 0x8d, 0xc8,
++ 0xd9, 0x5b, 0x80, 0x33, 0x6e, 0xf2, 0xe0, 0xdb, 0x0b, 0x4e, 0x92, 0x51,
++ 0x10, 0xa5, 0x61, 0x37, 0x1c, 0xe4, 0x27, 0x97, 0x34, 0x6c, 0xa8, 0x25,
++ 0x59, 0x3b, 0x84, 0x4c, 0x7a, 0x6e, 0xc1, 0xb1, 0xa1, 0x79, 0x59, 0xf9,
++ 0x70, 0x13, 0xc9, 0xf0, 0xa9, 0x21, 0x6b, 0x97, 0x16, 0x0b, 0x90, 0xac,
++ 0x15, 0xa2, 0x6f, 0x5e, 0x4e, 0x2c, 0xbf, 0x79, 0x39, 0xdd, 0x81, 0x3d,
++ 0x33, 0x2c, 0xb7, 0xff, 0x1b, 0x79, 0x4d, 0xdb, 0x76, 0xb7, 0x61, 0x2c,
++ 0x8a, 0x86, 0xc3, 0x57, 0x65, 0xc7, 0xf4, 0x3d, 0x42, 0x7c, 0x7c, 0xcf,
++ 0xbf, 0x3a, 0xd2, 0xf7, 0xbe, 0xf0, 0x11, 0x3d, 0x0a, 0xe9, 0xe6, 0x03,
++ 0x17, 0x63, 0x77, 0x92, 0xc9, 0x55, 0x19, 0x07, 0x49, 0xc6, 0xc1, 0x71,
++ 0x96, 0xf5, 0xa7, 0x6b, 0xae, 0x90, 0x7c, 0x5f, 0x27, 0x5c, 0x76, 0x43,
++ 0x2c, 0x8a, 0x9a, 0xc3, 0x6a, 0xb2, 0xc1, 0x11, 0x4e, 0xd4, 0x0a, 0x50,
++ 0x55, 0x82, 0x96, 0x1a, 0x7c, 0xc8, 0x72, 0xd6, 0x49, 0xce, 0xdf, 0x1b,
++ 0x24, 0x7e, 0xd6, 0xd3, 0x7c, 0x1b, 0x48, 0xce, 0x49, 0xe2, 0xff, 0x16,
++ 0x7b, 0xde, 0x46, 0x9a, 0x77, 0x0b, 0xd5, 0x1e, 0xd3, 0xde, 0x4b, 0x44,
++ 0x4f, 0xf4, 0x33, 0x5a, 0x08, 0x8d, 0x47, 0x82, 0xef, 0x53, 0x8d, 0x7d,
++ 0xa3, 0x3d, 0x4e, 0xa1, 0x71, 0x4c, 0xfb, 0xcf, 0xab, 0x24, 0xed, 0xcb,
++ 0xfa, 0xcd, 0xdf, 0x02, 0xf7, 0x1c, 0x4c, 0xf4, 0x50, 0x1d, 0xb1, 0x85,
++ 0x6a, 0x25, 0x99, 0x72, 0x9b, 0x89, 0x1f, 0xc4, 0xd5, 0x68, 0x9d, 0xe0,
++ 0xf8, 0x67, 0x92, 0x1f, 0x96, 0xa9, 0x4e, 0x0a, 0x87, 0x66, 0x10, 0x94,
++ 0xa5, 0xa2, 0x4c, 0x78, 0xb0, 0x51, 0x76, 0x14, 0xc9, 0x5f, 0x83, 0x3d,
++ 0x84, 0xa7, 0x9d, 0x78, 0x31, 0xef, 0xc4, 0x2b, 0xe9, 0x2d, 0x38, 0x50,
++ 0xf2, 0x10, 0x6e, 0x36, 0x3d, 0xce, 0x55, 0x13, 0xee, 0x4a, 0x4c, 0x5e,
++ 0x86, 0xae, 0x91, 0x87, 0x51, 0x9d, 0x71, 0x76, 0x53, 0x3e, 0xd5, 0x6f,
++ 0x21, 0xb9, 0x6c, 0x28, 0xf2, 0xfd, 0x46, 0x64, 0xd2, 0x29, 0xc2, 0x40,
++ 0x61, 0xaa, 0x81, 0x9c, 0x98, 0x68, 0x68, 0xb4, 0xfb, 0xba, 0x39, 0xba,
++ 0x96, 0x2b, 0x7d, 0xb1, 0xdf, 0x7c, 0xc7, 0x5c, 0x9f, 0xb9, 0x0f, 0xfb,
++ 0xb2, 0x3d, 0x84, 0x4d, 0xb7, 0x50, 0x7c, 0xaf, 0xd0, 0x38, 0x1d, 0xef,
++ 0xc6, 0xbe, 0xbc, 0x71, 0x35, 0x7e, 0x4c, 0xda, 0xf1, 0xa3, 0x1f, 0x55,
++ 0xed, 0xbc, 0x7f, 0xb5, 0x05, 0x77, 0xa5, 0x81, 0xf7, 0xd2, 0xdc, 0x4f,
++ 0x24, 0x4c, 0x41, 0xf9, 0xe0, 0x90, 0xce, 0x39, 0x74, 0x0b, 0x96, 0xe6,
++ 0x2d, 0xe4, 0x75, 0x0b, 0x67, 0x75, 0x8d, 0x72, 0x34, 0xe7, 0xea, 0x01,
++ 0xa1, 0x51, 0x7e, 0x36, 0x9d, 0xfd, 0x88, 0xb4, 0xb3, 0x8e, 0x1e, 0x9e,
++ 0xdb, 0x87, 0xea, 0xb7, 0xf7, 0xa1, 0x66, 0xd2, 0x0e, 0x3c, 0x45, 0x8a,
++ 0x78, 0x3e, 0x1b, 0x0e, 0xbd, 0x07, 0x6b, 0x97, 0xc3, 0x50, 0x13, 0x4e,
++ 0x07, 0xef, 0xcf, 0xf0, 0xfe, 0x94, 0xd6, 0xbd, 0xd4, 0xa1, 0xea, 0x45,
++ 0xd1, 0xdc, 0xf3, 0x16, 0xca, 0x1b, 0x65, 0xa8, 0xa1, 0xd7, 0x10, 0x89,
++ 0x76, 0xf2, 0x1e, 0x44, 0xa9, 0x92, 0xbb, 0x97, 0xcd, 0xe5, 0x6e, 0x2d,
++ 0xef, 0x15, 0xe1, 0x61, 0x09, 0x13, 0x53, 0x96, 0x29, 0x91, 0xfd, 0x4e,
++ 0xd1, 0x9c, 0x3f, 0xce, 0xee, 0x42, 0x36, 0x66, 0x59, 0xb7, 0xc7, 0xb5,
++ 0xbe, 0x06, 0x07, 0xfe, 0x90, 0x32, 0x39, 0xc8, 0xe6, 0x53, 0xe4, 0x6b,
++ 0xa1, 0x1d, 0xed, 0xa6, 0xe5, 0xb6, 0xeb, 0x0a, 0xee, 0x4f, 0x76, 0x89,
++ 0x96, 0xc2, 0x16, 0xb1, 0x9c, 0xb0, 0x5b, 0xe8, 0xd8, 0x66, 0xd1, 0x74,
++ 0xb4, 0x82, 0xdd, 0x22, 0x85, 0xcf, 0x7a, 0xa8, 0x37, 0xa7, 0x2d, 0xa4,
++ 0x89, 0xaf, 0xa7, 0xfe, 0x0e, 0x5f, 0xac, 0x8b, 0x7e, 0x5c, 0xd7, 0xce,
++ 0xbe, 0xf8, 0x30, 0x8e, 0xa5, 0xd9, 0xce, 0xfb, 0xb1, 0x87, 0xe4, 0xb3,
++ 0x62, 0x88, 0xf7, 0xc3, 0xd4, 0xb3, 0x83, 0x08, 0xf7, 0xbd, 0x2a, 0xd4,
++ 0x72, 0x01, 0xcd, 0x7a, 0x8d, 0x83, 0xe3, 0xab, 0x3a, 0xd0, 0xe4, 0xa8,
++ 0xd0, 0x9f, 0xc8, 0x83, 0xe2, 0x69, 0x85, 0x87, 0x95, 0xf9, 0xa5, 0x64,
++ 0xab, 0xa6, 0xe7, 0x52, 0xbc, 0xb9, 0xbf, 0x1a, 0x1b, 0xc4, 0x07, 0xd3,
++ 0x21, 0x78, 0x0f, 0x27, 0x17, 0xfa, 0xd1, 0x21, 0xde, 0xb3, 0xeb, 0xc5,
++ 0x4e, 0xf1, 0x4e, 0xbe, 0x5b, 0x5c, 0x9e, 0xe8, 0x42, 0x64, 0xf8, 0x3e,
++ 0xf1, 0xf6, 0x04, 0xd3, 0xd9, 0x23, 0xce, 0x4f, 0x73, 0x9f, 0xd4, 0xc2,
++ 0x1e, 0x9d, 0xfb, 0xa2, 0x8b, 0xab, 0xe0, 0xb7, 0x70, 0x4c, 0x67, 0x7d,
++ 0x72, 0x9f, 0xb0, 0xd2, 0x5f, 0xda, 0x10, 0xcf, 0x59, 0x4e, 0x8d, 0x7b,
++ 0xc5, 0x41, 0x9b, 0xdf, 0x29, 0xc2, 0xd1, 0xd3, 0x13, 0x5b, 0xc4, 0xf1,
++ 0x7c, 0x85, 0xd7, 0xc9, 0x3c, 0xdb, 0xaf, 0x4c, 0x3a, 0xfe, 0x62, 0x9e,
++ 0x36, 0xa1, 0xb4, 0x07, 0xe1, 0xb6, 0xfb, 0x51, 0x16, 0x46, 0xf4, 0x48,
++ 0xe8, 0x65, 0x04, 0xe1, 0x2c, 0xb2, 0x6d, 0x5b, 0x78, 0x5a, 0x77, 0xc1,
++ 0x31, 0x22, 0x93, 0x8c, 0xc8, 0x96, 0xfc, 0x2e, 0x48, 0x93, 0x5c, 0x1b,
++ 0x7c, 0xbd, 0x8a, 0xfb, 0x14, 0x21, 0x89, 0xbf, 0x7f, 0xd1, 0xe6, 0x5c,
++ 0x94, 0x0f, 0xb8, 0xbf, 0xfe, 0x57, 0xee, 0x8a, 0xed, 0xb1, 0x5d, 0xcd,
++ 0xf7, 0xc4, 0x29, 0xd7, 0xb6, 0x73, 0x2f, 0xdc, 0x83, 0x99, 0x9c, 0x9b,
++ 0x5b, 0x14, 0x1e, 0x77, 0xbb, 0x85, 0x0b, 0xba, 0x93, 0xea, 0x97, 0x87,
++ 0x28, 0x47, 0x49, 0x90, 0xb5, 0x3b, 0x50, 0x1c, 0x73, 0x4a, 0xbc, 0x5f,
++ 0xf5, 0xb3, 0x18, 0xf7, 0x10, 0x80, 0x43, 0xc4, 0xc3, 0xf7, 0x73, 0x21,
++ 0x6c, 0xa2, 0xba, 0x2b, 0x64, 0xd7, 0x18, 0xbf, 0x87, 0x53, 0x39, 0x87,
++ 0xa0, 0xba, 0xc2, 0x91, 0x58, 0x6d, 0xe1, 0x4a, 0x5b, 0x24, 0xca, 0x7d,
++ 0x68, 0x85, 0x72, 0xd6, 0xde, 0x7c, 0x1d, 0x7e, 0x96, 0xab, 0xc3, 0x2b,
++ 0x39, 0x0b, 0x07, 0x63, 0x83, 0x3d, 0x5e, 0x8a, 0x95, 0xcb, 0x62, 0x2e,
++ 0xec, 0x88, 0x98, 0x8a, 0x17, 0x51, 0x5c, 0x48, 0x5c, 0x87, 0x54, 0x20,
++ 0xdc, 0x39, 0x88, 0x7a, 0xbc, 0x91, 0x03, 0x61, 0x09, 0x78, 0x96, 0xd2,
++ 0x1c, 0x6f, 0xc7, 0xcc, 0x7e, 0x17, 0xe1, 0xd8, 0x9f, 0x0b, 0xc4, 0x6b,
++ 0x60, 0xb9, 0xcf, 0xc4, 0x29, 0x57, 0x17, 0xea, 0xd0, 0x95, 0xab, 0x47,
++ 0x0f, 0xe5, 0xac, 0x75, 0xab, 0xe3, 0x78, 0x2b, 0xeb, 0x13, 0x2b, 0xb3,
++ 0x83, 0x3d, 0x0a, 0xcd, 0xe9, 0x6a, 0x53, 0xfb, 0x9f, 0x22, 0xe0, 0x26,
++ 0x23, 0x4c, 0xe6, 0x8e, 0x07, 0xfc, 0x14, 0x77, 0x8f, 0x8b, 0x4f, 0xf1,
++ 0x04, 0xd9, 0xe3, 0x3d, 0xba, 0x5a, 0xbe, 0xe4, 0x88, 0x9c, 0xdd, 0x08,
++ 0x75, 0xe0, 0x16, 0x61, 0x46, 0x6b, 0x29, 0x9e, 0x34, 0x54, 0x62, 0x85,
++ 0x19, 0x11, 0x32, 0x61, 0x73, 0x27, 0x3c, 0x9a, 0x89, 0xce, 0x76, 0x96,
++ 0xa9, 0x07, 0x9e, 0xa3, 0x64, 0x47, 0xd2, 0x17, 0xfb, 0xfb, 0x75, 0x78,
++ 0x9d, 0xf2, 0xe5, 0xb9, 0x1c, 0xf7, 0xe6, 0xdd, 0xc6, 0xbb, 0x94, 0x03,
++ 0x5e, 0x8a, 0x0d, 0x86, 0x38, 0xf6, 0xe7, 0x63, 0xf8, 0xe7, 0x64, 0x96,
++ 0x8d, 0x3e, 0x5a, 0xf3, 0x2e, 0xc1, 0xeb, 0x20, 0xb9, 0xc4, 0xe0, 0xbe,
++ 0x9c, 0xcd, 0x0f, 0xc5, 0x63, 0xe6, 0xe9, 0xff, 0x27, 0xed, 0x8f, 0x54,
++ 0xc1, 0x5b, 0x4f, 0xba, 0x9c, 0xef, 0x69, 0x5e, 0xdb, 0xcf, 0xe4, 0x7a,
++ 0xa6, 0x82, 0x0f, 0xdd, 0x46, 0xb5, 0x78, 0x21, 0xc7, 0x36, 0x67, 0xe1,
++ 0x19, 0x5d, 0xa7, 0xda, 0x85, 0x6b, 0xf2, 0x7e, 0xaa, 0x5f, 0xb8, 0xcf,
++ 0x64, 0x7a, 0xce, 0x10, 0x85, 0xfb, 0x73, 0x58, 0x2b, 0xc3, 0xb1, 0xa2,
++ 0x0a, 0xe3, 0x98, 0x70, 0x3a, 0x09, 0x73, 0x70, 0xac, 0x65, 0x7f, 0x52,
++ 0x0c, 0x6d, 0x82, 0xeb, 0xcf, 0x4e, 0x98, 0xb6, 0x1f, 0x57, 0x8b, 0xfb,
++ 0xc9, 0x46, 0x5e, 0x8c, 0x55, 0x61, 0x82, 0xea, 0x1f, 0xc9, 0x30, 0x3d,
++ 0xdf, 0xa5, 0xe7, 0x13, 0xa3, 0xd8, 0x17, 0x84, 0xe3, 0x4f, 0x14, 0xfc,
++ 0x19, 0xde, 0x74, 0xc9, 0x74, 0x1d, 0x9e, 0xee, 0xb8, 0xe9, 0xdd, 0x18,
++ 0xaf, 0x16, 0xb7, 0xe6, 0x5a, 0xf0, 0xfe, 0x58, 0x1d, 0xd9, 0x77, 0x3d,
++ 0x96, 0x8c, 0x04, 0xf1, 0x36, 0xd1, 0x32, 0x40, 0xb4, 0x7c, 0xd2, 0x66,
++ 0x0e, 0x34, 0x40, 0xed, 0xa7, 0xba, 0xa8, 0x9b, 0xfb, 0xcd, 0x4f, 0xeb,
++ 0x6a, 0xe7, 0x6d, 0xc2, 0x0b, 0x2d, 0x92, 0x24, 0xd9, 0x5b, 0xd6, 0xb0,
++ 0xde, 0xac, 0xfb, 0xc0, 0xfd, 0xa3, 0x3b, 0x70, 0x68, 0x86, 0x69, 0x71,
++ 0x1b, 0xcb, 0xa7, 0xf9, 0x53, 0x36, 0xae, 0xb3, 0x3f, 0xbd, 0x73, 0x9f,
++ 0x30, 0x42, 0xf6, 0xe7, 0xa7, 0x6b, 0x42, 0xd3, 0xdc, 0xa7, 0x0e, 0x9b,
++ 0x6e, 0xf1, 0x53, 0x17, 0xf7, 0xab, 0x93, 0xe0, 0xff, 0x57, 0x5d, 0x95,
++ 0x7e, 0xdf, 0x1d, 0x30, 0xed, 0x1e, 0xca, 0x15, 0xbb, 0x97, 0x1d, 0x22,
++ 0x37, 0x90, 0x89, 0x3f, 0x99, 0x30, 0x57, 0x20, 0x46, 0x05, 0x7c, 0xbd,
++ 0x6c, 0x2e, 0x31, 0x7a, 0xa8, 0x46, 0x90, 0x89, 0x5f, 0x13, 0xfb, 0xda,
++ 0x05, 0x0e, 0x69, 0x06, 0x5e, 0xcb, 0x73, 0x2c, 0x77, 0xe2, 0xfb, 0x69,
++ 0x35, 0x94, 0x12, 0xe1, 0xce, 0x5b, 0x84, 0x84, 0x50, 0x43, 0x0f, 0x0e,
++ 0x51, 0x5e, 0x99, 0x4e, 0x73, 0x1e, 0x71, 0xda, 0xe7, 0x05, 0x6a, 0x29,
++ 0x0e, 0x7d, 0x38, 0x54, 0x89, 0xfb, 0x85, 0xb8, 0xba, 0xff, 0xf7, 0x48,
++ 0xa7, 0x4f, 0x17, 0x78, 0x4e, 0x13, 0x9f, 0xac, 0x66, 0x1f, 0x56, 0xa3,
++ 0x29, 0xe9, 0x5e, 0x84, 0xa6, 0x38, 0xb6, 0xd0, 0x72, 0xb4, 0xd6, 0x91,
++ 0xac, 0x1b, 0xdd, 0xf1, 0x2e, 0xd1, 0x53, 0xfc, 0x67, 0xbc, 0x27, 0xa1,
++ 0x2c, 0x30, 0x36, 0x8b, 0xf5, 0x93, 0xdc, 0x53, 0xdc, 0x22, 0xba, 0x8b,
++ 0xdc, 0x57, 0x1c, 0x10, 0xbf, 0x5f, 0x64, 0x9f, 0x9f, 0xef, 0x2f, 0xce,
++ 0xeb, 0x9f, 0xfb, 0x8a, 0xa6, 0xe7, 0x05, 0x92, 0xfd, 0x03, 0x39, 0x8e,
++ 0xc9, 0x8e, 0xfb, 0xfd, 0x68, 0xc3, 0x84, 0x0b, 0x9e, 0xd3, 0xf1, 0xaf,
++ 0xe0, 0x76, 0xc2, 0x07, 0x4b, 0xb4, 0x8a, 0xfe, 0xd6, 0x4d, 0x48, 0x48,
++ 0xb4, 0x91, 0xd0, 0x17, 0xb0, 0x4e, 0x7b, 0x29, 0x9e, 0x65, 0xac, 0xbe,
++ 0x00, 0xeb, 0x92, 0xed, 0xcd, 0x2e, 0xf7, 0x28, 0x0e, 0x9b, 0x94, 0x57,
++ 0x3c, 0x98, 0xce, 0x2d, 0xa2, 0xda, 0xc0, 0xc2, 0x7e, 0xbd, 0x06, 0x55,
++ 0x76, 0x0c, 0xf0, 0x10, 0x9e, 0x84, 0xec, 0xa3, 0x79, 0xd2, 0xc3, 0x32,
++ 0xbc, 0x74, 0xef, 0x8c, 0x4e, 0x72, 0x69, 0xaf, 0xcc, 0xdd, 0x3c, 0xb1,
++ 0x12, 0x07, 0xc9, 0xe3, 0x6b, 0xb4, 0x28, 0x86, 0x14, 0x1f, 0xc5, 0x9a,
++ 0x3b, 0xe6, 0xe6, 0xf4, 0xd0, 0x60, 0x5e, 0xaf, 0xbf, 0xaa, 0xa2, 0x87,
++ 0x35, 0x72, 0xa5, 0x06, 0x93, 0xcd, 0x6a, 0x5a, 0x6b, 0x47, 0xfb, 0x16,
++ 0x74, 0x0e, 0xf9, 0xc4, 0x2b, 0xe9, 0xbb, 0xad, 0x50, 0x1d, 0x8d, 0x23,
++ 0x9b, 0x75, 0xcf, 0xd1, 0xdb, 0x34, 0x21, 0xf3, 0x58, 0xee, 0x79, 0xe0,
++ 0xc1, 0x9c, 0x84, 0xc0, 0xdc, 0xf5, 0xf8, 0x44, 0x08, 0x7a, 0x6b, 0x35,
++ 0x50, 0x2f, 0xe8, 0x1a, 0xcf, 0xcd, 0x6b, 0xc8, 0xa8, 0x23, 0x3f, 0xb9,
++ 0x33, 0x9e, 0xc0, 0xbb, 0x59, 0x27, 0x36, 0x52, 0x9e, 0xbf, 0x31, 0x6d,
++ 0xe0, 0x42, 0x29, 0x60, 0xcf, 0x21, 0x19, 0xf3, 0xe3, 0x9c, 0x34, 0xce,
++ 0x83, 0xc9, 0x89, 0x2f, 0xd2, 0x17, 0x20, 0x9a, 0x7f, 0x42, 0xdf, 0xf9,
++ 0xde, 0x45, 0xbb, 0x3f, 0x70, 0xea, 0x9a, 0xba, 0x4a, 0x1a, 0xe1, 0x9e,
++ 0x52, 0x25, 0x17, 0x74, 0xe8, 0xac, 0x4b, 0x3f, 0x66, 0x47, 0x4d, 0x5c,
++ 0x58, 0x5d, 0x8b, 0x4f, 0x46, 0x9b, 0x70, 0x7f, 0xce, 0x8b, 0x4b, 0xa3,
++ 0x16, 0x56, 0xb6, 0xe1, 0xee, 0x20, 0x61, 0xb1, 0x5a, 0xf2, 0xfb, 0xd7,
++ 0xa8, 0xf6, 0xa1, 0x78, 0x4a, 0x94, 0x46, 0x12, 0x1b, 0xc8, 0xae, 0xa3,
++ 0x31, 0xa4, 0x6e, 0x8a, 0x47, 0x42, 0x17, 0xf1, 0x3d, 0x8b, 0x62, 0xb1,
++ 0xe2, 0x30, 0xba, 0x84, 0xd3, 0xde, 0x67, 0xdc, 0x62, 0xef, 0x4b, 0x4a,
++ 0x93, 0x03, 0xc2, 0x51, 0xbc, 0xd6, 0xaf, 0xbf, 0x2c, 0x0f, 0x71, 0xee,
++ 0xe1, 0x1e, 0xc6, 0x88, 0xe5, 0xd2, 0xb8, 0x57, 0xb3, 0x59, 0xec, 0x9d,
++ 0xb8, 0x9a, 0x9b, 0xae, 0xe6, 0xa3, 0xdd, 0x73, 0x79, 0x68, 0x30, 0xff,
++ 0x8b, 0x2f, 0xe0, 0xa8, 0xd0, 0xdc, 0x7e, 0x07, 0xe7, 0x1f, 0x8f, 0x78,
++ 0x93, 0xcc, 0x61, 0x1f, 0xf9, 0xe0, 0x49, 0xfd, 0x74, 0x90, 0x32, 0x04,
++ 0x9c, 0xad, 0x02, 0x0f, 0xf2, 0x59, 0x93, 0x80, 0x85, 0xcd, 0x7a, 0xc5,
++ 0x1e, 0xda, 0xda, 0x5d, 0xe8, 0xa3, 0x9c, 0xe4, 0x8a, 0xf9, 0xc8, 0xd7,
++ 0x15, 0xbc, 0xaa, 0xb3, 0x0d, 0x6f, 0x9e, 0xcb, 0x49, 0xbc, 0x7f, 0x5e,
++ 0xd9, 0xeb, 0xfe, 0x7c, 0xdf, 0x7b, 0xde, 0x36, 0x75, 0x24, 0x17, 0xc2,
++ 0xfb, 0x76, 0x5c, 0xa3, 0xfa, 0x41, 0xa6, 0xda, 0x61, 0x23, 0x12, 0x0b,
++ 0x54, 0x6e, 0x6d, 0x10, 0xf6, 0x36, 0xf1, 0xef, 0xdb, 0xfb, 0x70, 0xdf,
++ 0x88, 0x84, 0x6a, 0x8d, 0xe3, 0xac, 0x89, 0x43, 0x75, 0x1c, 0xa7, 0xba,
++ 0xb0, 0x6b, 0xc4, 0x23, 0xce, 0xe4, 0x9c, 0x78, 0xa2, 0xfb, 0x11, 0x2c,
++ 0x68, 0xbd, 0x07, 0xb0, 0x6d, 0x90, 0xbf, 0x7f, 0x0b, 0xa9, 0x45, 0xbc,
++ 0x3e, 0xf7, 0xda, 0x04, 0x7c, 0xad, 0xcc, 0x07, 0xbc, 0xef, 0xd3, 0xfc,
++ 0xdb, 0x86, 0x9c, 0xe2, 0x62, 0xfa, 0x3f, 0x5b, 0x27, 0x02, 0x8c, 0x13,
++ 0xf8, 0x5e, 0x0d, 0xcc, 0x3a, 0x1e, 0xcb, 0x3a, 0xf4, 0x51, 0x6d, 0xda,
++ 0x87, 0x21, 0xa2, 0xeb, 0x9c, 0x3d, 0xd7, 0x95, 0x39, 0xfa, 0x7d, 0xa2,
++ 0x36, 0x23, 0x9b, 0x41, 0xa2, 0x45, 0x59, 0xdd, 0x8d, 0xda, 0xe2, 0xb5,
++ 0xf9, 0xb6, 0xc6, 0xc3, 0xfd, 0x4a, 0xd2, 0x15, 0xe5, 0x84, 0x5e, 0xbc,
++ 0x9b, 0x16, 0x78, 0xc7, 0xb6, 0xc1, 0x5e, 0x34, 0xe5, 0x6b, 0x00, 0x3b,
++ 0x86, 0xf0, 0xb8, 0xaf, 0x57, 0x6c, 0x5b, 0xea, 0xc3, 0x03, 0xc4, 0x4b,
++ 0x0d, 0xf1, 0xf2, 0x61, 0x6c, 0x29, 0xad, 0xc3, 0xd7, 0xfe, 0x9d, 0x3c,
++ 0x77, 0xd6, 0x68, 0x6e, 0x2e, 0x4a, 0x18, 0x7e, 0xae, 0xf7, 0x22, 0xd8,
++ 0x39, 0x12, 0xe9, 0xf1, 0x49, 0x6c, 0x87, 0x11, 0xdc, 0x3b, 0x79, 0x2b,
++ 0xdd, 0xe7, 0xb9, 0x82, 0xb8, 0x2b, 0xe3, 0x14, 0x6f, 0x51, 0xbd, 0x74,
++ 0x2a, 0x2d, 0x2d, 0x72, 0xe0, 0x39, 0xeb, 0x89, 0xc0, 0x2e, 0xdc, 0xa4,
++ 0x77, 0x61, 0x3b, 0xd9, 0x60, 0x47, 0xd3, 0x2e, 0x8c, 0x92, 0x0d, 0x6c,
++ 0xab, 0xa7, 0x1a, 0x2e, 0x56, 0xb2, 0x7a, 0x03, 0x2c, 0x47, 0x81, 0x4e,
++ 0xba, 0x5e, 0x47, 0x75, 0x9d, 0x14, 0x23, 0x6b, 0x23, 0xbf, 0x90, 0x35,
++ 0x35, 0x97, 0xc4, 0xef, 0xd8, 0x6b, 0xd6, 0x51, 0x9e, 0x76, 0x31, 0x3e,
++ 0xf0, 0x33, 0x4e, 0xf8, 0x22, 0x3d, 0xa6, 0x55, 0xa5, 0x69, 0xd1, 0x8d,
++ 0x52, 0x53, 0x6e, 0x86, 0x6c, 0x76, 0x7d, 0xeb, 0xb5, 0xcf, 0xcd, 0xcb,
++ 0x48, 0x87, 0xbb, 0x75, 0xca, 0x2a, 0x2b, 0x83, 0x50, 0x5a, 0xaf, 0xd5,
++ 0xfd, 0xfc, 0x1c, 0x4c, 0x73, 0x25, 0xae, 0x85, 0xa4, 0x88, 0x72, 0x37,
++ 0x2e, 0xd0, 0x1a, 0x41, 0x6c, 0x2d, 0x76, 0xa1, 0x77, 0xc4, 0xf1, 0x19,
++ 0x3e, 0xf1, 0xb3, 0x2d, 0x7f, 0xc6, 0xff, 0x8e, 0x91, 0x48, 0xa7, 0x77,
++ 0x8e, 0xff, 0xed, 0x93, 0x9f, 0xcd, 0x35, 0x90, 0xe1, 0xbc, 0xca, 0xf3,
++ 0xf1, 0xb9, 0xa1, 0x79, 0xf9, 0x06, 0xf1, 0x80, 0x3d, 0xdf, 0x61, 0x0f,
++ 0xfb, 0xb0, 0x8b, 0x7c, 0x7d, 0x43, 0xab, 0x89, 0x57, 0x13, 0xf7, 0x5b,
++ 0x3b, 0x6c, 0x19, 0xdc, 0x6f, 0x3f, 0xdf, 0xd9, 0x74, 0x76, 0x0e, 0xfb,
++ 0x54, 0xfa, 0xb0, 0xa7, 0x4a, 0x2d, 0xf6, 0x1e, 0xc3, 0x0f, 0x29, 0x0f,
++ 0x3e, 0xf7, 0xb9, 0x3e, 0xdf, 0x76, 0x17, 0xef, 0x4d, 0x3c, 0x5d, 0x92,
++ 0x85, 0x73, 0xa4, 0x5a, 0xb8, 0x46, 0x98, 0xb6, 0x8f, 0xe5, 0x8a, 0x8f,
++ 0xfd, 0x57, 0x24, 0x03, 0xbc, 0xcf, 0x58, 0xb1, 0xff, 0x68, 0xfb, 0xbd,
++ 0xc0, 0x51, 0xd3, 0x53, 0xb5, 0x0a, 0x54, 0xeb, 0x77, 0xdb, 0xf6, 0xb0,
++ 0xd0, 0x08, 0xac, 0x7d, 0xae, 0x89, 0xeb, 0x7d, 0xee, 0x0d, 0x6a, 0x6b,
++ 0xc7, 0x08, 0x80, 0x6e, 0x55, 0x78, 0x4d, 0xf5, 0x04, 0xf7, 0xeb, 0xb9,
++ 0x8f, 0x4f, 0x71, 0xd7, 0x5b, 0xb7, 0xca, 0xf4, 0x2c, 0x58, 0xe5, 0x14,
++ 0x8b, 0x33, 0x3d, 0x64, 0x7b, 0x1a, 0x12, 0x19, 0xd3, 0xdb, 0xb0, 0x2a,
++ 0x84, 0x87, 0x32, 0xf3, 0x31, 0xb9, 0x05, 0x2d, 0xe3, 0xc0, 0x0f, 0x33,
++ 0x41, 0x34, 0x8f, 0x86, 0xfb, 0x6f, 0x95, 0xc2, 0x03, 0xb3, 0x12, 0xdf,
++ 0xbb, 0xbc, 0x66, 0xa5, 0x8d, 0xc5, 0x3f, 0x5a, 0xb3, 0xc2, 0xfe, 0x0c,
++ 0x18, 0xd7, 0xe7, 0xef, 0x40, 0x7a, 0xc6, 0x33, 0x5b, 0x96, 0x2c, 0x3c,
++ 0x14, 0x93, 0x70, 0xb3, 0xfe, 0x6f, 0xc9, 0xb7, 0x04, 0xd9, 0xc6, 0xab,
++ 0x9c, 0x83, 0xed, 0x60, 0xb6, 0x64, 0x95, 0x86, 0x55, 0x99, 0x3a, 0x8a,
++ 0x49, 0xf5, 0x14, 0x9f, 0xea, 0x70, 0x85, 0x62, 0xd2, 0x8a, 0x36, 0x0b,
++ 0x8b, 0xdb, 0xcc, 0xbe, 0xc5, 0xe0, 0x3d, 0x68, 0xd5, 0x2c, 0x0a, 0xb5,
++ 0xa7, 0x4b, 0x52, 0xbb, 0xeb, 0x25, 0x05, 0xdb, 0x23, 0x3c, 0x77, 0xd0,
++ 0x58, 0x95, 0xaf, 0xe4, 0xd3, 0x4a, 0x5e, 0x75, 0xce, 0xe5, 0x53, 0xb7,
++ 0xa1, 0x4f, 0xab, 0x3f, 0x4e, 0x49, 0xbc, 0x6f, 0xd2, 0x83, 0x91, 0x6c,
++ 0x0a, 0x7b, 0xb3, 0x21, 0xfc, 0x3a, 0xe3, 0x26, 0xdb, 0x08, 0xeb, 0x3f,
++ 0x00, 0x8f, 0xf1, 0x19, 0xb1, 0x7c, 0x38, 0xfa, 0x90, 0xf4, 0x13, 0x94,
++ 0x9d, 0xea, 0x11, 0xaa, 0x12, 0x08, 0x37, 0x34, 0x87, 0x5e, 0xc4, 0x4f,
++ 0xec, 0x7d, 0x36, 0xa0, 0xc2, 0x43, 0x53, 0x1e, 0xc8, 0x65, 0x3c, 0xb3,
++ 0xb0, 0x7b, 0xb2, 0xbc, 0x6f, 0x2c, 0x61, 0xbd, 0x7e, 0x3f, 0xc9, 0x59,
++ 0xa0, 0xa9, 0xb5, 0x0e, 0xe5, 0x2d, 0x4e, 0x8c, 0x64, 0x38, 0x0f, 0x7f,
++ 0xbc, 0x46, 0x1e, 0x42, 0x79, 0x6e, 0x4f, 0x34, 0xe1, 0xa0, 0x0c, 0xfd,
++ 0x72, 0x11, 0x38, 0x48, 0xb1, 0x63, 0x53, 0xec, 0x37, 0x56, 0x05, 0x8f,
++ 0xca, 0xfe, 0xf4, 0x98, 0xc0, 0x02, 0x2d, 0x49, 0xf2, 0x70, 0xfa, 0x0f,
++ 0xa5, 0xa3, 0x76, 0x0e, 0x1e, 0xa1, 0xf9, 0x93, 0xf6, 0xfc, 0x91, 0xfd,
++ 0x4b, 0x25, 0x09, 0xd7, 0xb7, 0x1e, 0xc5, 0xc4, 0xc2, 0x0a, 0x0d, 0x41,
++ 0xc2, 0x04, 0x5c, 0xcb, 0xd6, 0x13, 0x8f, 0x9b, 0x1f, 0xe3, 0xbe, 0xe6,
++ 0x6f, 0xd7, 0xdc, 0x30, 0xce, 0x7e, 0xfd, 0xf1, 0x9a, 0x77, 0xd3, 0x6a,
++ 0xb2, 0x9e, 0xea, 0x87, 0x6a, 0x92, 0xc3, 0xbd, 0x43, 0xdc, 0x4f, 0xa8,
++ 0x37, 0x5e, 0x3f, 0xcc, 0x79, 0x59, 0x1d, 0x68, 0x10, 0x3e, 0x71, 0x73,
++ 0x46, 0xed, 0x63, 0xc2, 0x2f, 0x47, 0xd4, 0x20, 0xc9, 0xae, 0xf3, 0x1e,
++ 0xd1, 0xc7, 0x35, 0x8b, 0x2d, 0xb7, 0xeb, 0xf2, 0x15, 0xdc, 0x11, 0x9e,
++ 0xc3, 0x21, 0x51, 0x1b, 0x77, 0x58, 0xd6, 0x9e, 0x18, 0xe7, 0x71, 0xfb,
++ 0x4c, 0x00, 0x5d, 0xaf, 0x33, 0x96, 0x52, 0x6d, 0x31, 0xc8, 0xf4, 0xf1,
++ 0x19, 0x0f, 0x89, 0x6a, 0xd1, 0xec, 0xab, 0x73, 0xb8, 0xc4, 0x87, 0x7d,
++ 0x74, 0xbd, 0x6c, 0xe3, 0x13, 0x3e, 0xa7, 0xe8, 0x35, 0x94, 0xc7, 0xf8,
++ 0x6c, 0xe3, 0x6f, 0xd7, 0xac, 0x1f, 0x53, 0x43, 0x12, 0xf1, 0xb1, 0x97,
++ 0xf7, 0xe7, 0x69, 0xce, 0x69, 0x9d, 0xe9, 0xbe, 0xbc, 0x86, 0xfb, 0xb1,
++ 0x4b, 0x88, 0x6e, 0x2b, 0x1b, 0x66, 0x0c, 0x6a, 0xdb, 0x4a, 0x22, 0x4f,
++ 0x55, 0xfd, 0xe2, 0x0a, 0xaf, 0x2e, 0xd2, 0xc9, 0xb1, 0x74, 0x12, 0xa7,
++ 0xe2, 0x15, 0xfd, 0xac, 0xcb, 0x7f, 0x03, 0xa9, 0xfa, 0x0e, 0xe4, 0xb2,
++ 0x8a, 0x7f, 0x43, 0xa6, 0x03, 0xa3, 0xa4, 0xc3, 0xbb, 0x8b, 0x41, 0x7f,
++ 0x47, 0x46, 0x43, 0x6f, 0x91, 0xeb, 0x2b, 0x18, 0x7b, 0xc6, 0x26, 0xe7,
++ 0xea, 0xe0, 0x4a, 0x2e, 0x39, 0x90, 0xa9, 0xd8, 0x5c, 0x38, 0xef, 0x99,
++ 0x0d, 0x89, 0xca, 0xbc, 0x32, 0xad, 0x23, 0x0f, 0xfd, 0x89, 0x85, 0x85,
++ 0x6c, 0x0b, 0x77, 0x60, 0x6c, 0xdc, 0x6f, 0x2e, 0x36, 0x14, 0xac, 0x6a,
++ 0xfd, 0x73, 0x7a, 0xb6, 0x05, 0x1f, 0x1f, 0xff, 0x3a, 0xca, 0xdf, 0x24,
++ 0x7c, 0x94, 0x49, 0xa2, 0xb9, 0xf5, 0x16, 0xa4, 0xfe, 0x40, 0xc6, 0xd3,
++ 0x19, 0x1f, 0x9e, 0xcf, 0x54, 0xf6, 0xec, 0x7f, 0x94, 0x25, 0x3f, 0x24,
++ 0x1f, 0x78, 0xee, 0x4b, 0xf7, 0x49, 0x29, 0x9e, 0x3b, 0x78, 0x0f, 0xff,
++ 0x1f, 0x1e, 0x77, 0xde, 0x1e, 0xe7, 0x11, 0x75, 0x23, 0xf3, 0xf3, 0x5a,
++ 0xd0, 0x5a, 0xff, 0xbe, 0x67, 0x08, 0xf3, 0x81, 0x62, 0x48, 0xe5, 0x8c,
++ 0x83, 0x90, 0x47, 0xec, 0x7d, 0x23, 0xc2, 0xb9, 0x11, 0xfd, 0x02, 0x4c,
++ 0xb8, 0x09, 0x5f, 0x2d, 0x25, 0x59, 0x68, 0x99, 0x80, 0x5f, 0x2a, 0x2a,
++ 0xf4, 0xdf, 0xe8, 0x77, 0x92, 0x7c, 0x9c, 0xc5, 0x8f, 0x28, 0xa6, 0xb0,
++ 0x4f, 0x55, 0x72, 0x9c, 0x54, 0x7c, 0xc4, 0x4b, 0xc0, 0x87, 0x3e, 0x2b,
++ 0x36, 0x1d, 0xca, 0x2f, 0xf6, 0x32, 0x96, 0xc9, 0x65, 0x2a, 0xbf, 0x23,
++ 0x57, 0x7f, 0x93, 0x9e, 0x6d, 0x99, 0x8d, 0xd0, 0x6f, 0x96, 0xc5, 0x73,
++ 0x56, 0x6a, 0x33, 0xcb, 0x2b, 0xe0, 0x7f, 0x83, 0xe4, 0x3f, 0x46, 0x34,
++ 0x66, 0x69, 0x8d, 0xd7, 0x69, 0xcd, 0x4c, 0xf1, 0x10, 0x8d, 0xe1, 0x7b,
++ 0x24, 0x67, 0xdb, 0x76, 0x0f, 0x7b, 0xf9, 0x7c, 0xc2, 0xf3, 0x19, 0x60,
++ 0x30, 0x6b, 0xaa, 0xce, 0xb9, 0x73, 0x9d, 0x83, 0x94, 0x2f, 0xab, 0x28,
++ 0x16, 0xbd, 0x19, 0xdf, 0x8e, 0x1b, 0x73, 0x6a, 0xd2, 0x24, 0x3c, 0x96,
++ 0x52, 0x20, 0x48, 0x77, 0x64, 0xc3, 0x01, 0xe3, 0xdd, 0x74, 0x23, 0xf1,
++ 0x14, 0x0e, 0x5d, 0xa0, 0xf1, 0xa6, 0x53, 0xc6, 0x81, 0x51, 0x07, 0x2e,
++ 0xf0, 0x1e, 0xb2, 0xa8, 0x3c, 0x6f, 0x82, 0xc7, 0xce, 0x7f, 0xaf, 0xa6,
++ 0xba, 0x2e, 0x9c, 0xa0, 0xac, 0x6a, 0xd6, 0x10, 0x6e, 0xcf, 0xb7, 0x3f,
++ 0x82, 0x43, 0x54, 0xeb, 0xef, 0x88, 0x85, 0x90, 0xac, 0x8b, 0x53, 0xbd,
++ 0xd1, 0xdc, 0x7f, 0x09, 0xff, 0xcd, 0x2a, 0xf3, 0x3e, 0xbc, 0x08, 0x27,
++ 0x2e, 0xe1, 0x53, 0xcb, 0xa1, 0x69, 0x67, 0xa7, 0xa0, 0x95, 0x2f, 0xa0,
++ 0x79, 0xe0, 0x13, 0xbc, 0x67, 0xf1, 0x1e, 0xbd, 0xec, 0x70, 0x10, 0x06,
++ 0x0c, 0x2b, 0x4e, 0x04, 0x50, 0x0e, 0x38, 0xb0, 0x49, 0xe7, 0xde, 0xb4,
++ 0x3a, 0xf0, 0x24, 0x61, 0xf9, 0x77, 0x44, 0x73, 0xdf, 0x87, 0x38, 0x6f,
++ 0x4d, 0xd4, 0xf1, 0xba, 0x02, 0x89, 0xeb, 0x9b, 0xcf, 0xba, 0xa1, 0x76,
++ 0xba, 0x84, 0x96, 0x68, 0x70, 0xfc, 0x95, 0x75, 0x3e, 0xf0, 0xa9, 0xa5,
++ 0x45, 0x3e, 0x25, 0x1c, 0xa4, 0x05, 0x27, 0xc9, 0xf6, 0xfb, 0x30, 0x4f,
++ 0x9b, 0xa8, 0x86, 0x57, 0x27, 0x1a, 0x18, 0xf7, 0x99, 0x9e, 0x7d, 0x44,
++ 0xdb, 0x6b, 0x84, 0x03, 0x76, 0xc4, 0x2e, 0x59, 0xc9, 0x85, 0x7c, 0xfe,
++ 0x4f, 0xa9, 0xae, 0xf4, 0xc0, 0xb9, 0x6f, 0x72, 0x07, 0xee, 0x4a, 0x3b,
++ 0x49, 0x4e, 0xf3, 0x78, 0xcd, 0x45, 0x31, 0x98, 0x63, 0x7f, 0xf9, 0x3a,
++ 0x2a, 0xcd, 0x24, 0x2a, 0xf1, 0xb1, 0x87, 0xe2, 0xc2, 0x6e, 0x3b, 0x17,
++ 0xc0, 0xbb, 0x64, 0x55, 0x2b, 0x3e, 0x19, 0x7f, 0xd3, 0x4b, 0xbe, 0xb4,
++ 0x4e, 0x6b, 0x83, 0x08, 0x66, 0x4c, 0x51, 0x6b, 0x38, 0xf0, 0x61, 0xbb,
++ 0xda, 0x29, 0x39, 0x06, 0x70, 0x7d, 0xcc, 0xb4, 0x7c, 0x9a, 0xd6, 0xd3,
++ 0x22, 0x22, 0xdd, 0x45, 0x11, 0x45, 0x75, 0xd1, 0x27, 0x57, 0x17, 0x5b,
++ 0x64, 0x6f, 0xd1, 0xf4, 0x28, 0xab, 0xb6, 0x53, 0xdd, 0xb2, 0x8b, 0x6a,
++ 0x5b, 0x1f, 0xd5, 0xd7, 0xaa, 0x7e, 0x11, 0x6e, 0x92, 0x7f, 0x08, 0xfb,
++ 0x4a, 0x06, 0x9c, 0x99, 0x9d, 0x70, 0x65, 0xc2, 0xca, 0x5e, 0xec, 0x42,
++ 0x32, 0x58, 0xc1, 0xb6, 0x32, 0xe9, 0xaa, 0xaa, 0x9d, 0xb1, 0xcc, 0x76,
++ 0x9c, 0x9f, 0x60, 0x7c, 0x9e, 0xc0, 0xd6, 0x34, 0xff, 0x86, 0xf7, 0xc5,
++ 0xb8, 0x81, 0x93, 0x54, 0x3b, 0x79, 0x5a, 0x1b, 0x48, 0x0f, 0x8d, 0x18,
++ 0x2c, 0x09, 0x36, 0x2b, 0xd2, 0x05, 0xbc, 0x27, 0xdb, 0x65, 0x1c, 0x9c,
++ 0xa2, 0x44, 0x42, 0xf9, 0xca, 0x99, 0x51, 0x28, 0x4e, 0xc8, 0xf0, 0x69,
++ 0x3e, 0xfa, 0x1d, 0xe0, 0x73, 0x4b, 0x64, 0x67, 0xbf, 0x5d, 0xd3, 0x62,
++ 0xc7, 0x9a, 0x7a, 0xaa, 0x75, 0xde, 0x21, 0x5e, 0x58, 0x16, 0x06, 0xaa,
++ 0x47, 0xe6, 0x6b, 0xc2, 0xf5, 0xb7, 0x55, 0x23, 0x48, 0x73, 0x32, 0x0e,
++ 0xac, 0x9c, 0x57, 0x5d, 0x1f, 0x6b, 0x45, 0x21, 0x27, 0xe6, 0x30, 0xd6,
++ 0xa0, 0xea, 0xc3, 0x3a, 0x1c, 0xa2, 0xda, 0xdf, 0xaf, 0x6d, 0x45, 0x46,
++ 0x29, 0x7b, 0x7f, 0x11, 0xe7, 0x1a, 0x00, 0xde, 0x5e, 0xc2, 0x50, 0x43,
++ 0xe9, 0xaf, 0x72, 0xcc, 0xf4, 0xdc, 0x1d, 0xd7, 0x71, 0x24, 0x47, 0x21,
++ 0x4a, 0x5b, 0x87, 0xda, 0xb6, 0x2e, 0x7c, 0x58, 0xc7, 0xf8, 0x97, 0x62,
++ 0x15, 0xd1, 0xb3, 0x77, 0x2a, 0x60, 0x9f, 0xab, 0xd8, 0x57, 0x9a, 0xa7,
++ 0xf9, 0x5a, 0x5a, 0xbf, 0x8c, 0x46, 0x96, 0xc9, 0x3f, 0x44, 0x23, 0xd9,
++ 0x2c, 0x61, 0x9e, 0x5c, 0xba, 0x17, 0x2f, 0xa7, 0x79, 0xde, 0x70, 0x52,
++ 0x17, 0x0a, 0xf7, 0xe6, 0x6d, 0x99, 0x98, 0x53, 0xbc, 0x06, 0xaf, 0x3f,
++ 0xbf, 0x4e, 0x80, 0x6a, 0x85, 0x7f, 0xec, 0x5a, 0x14, 0x37, 0x72, 0xeb,
++ 0xa8, 0xee, 0x8c, 0x42, 0xfb, 0xfd, 0x32, 0xe9, 0x83, 0x7b, 0xd5, 0x4b,
++ 0x09, 0xf3, 0xc2, 0xf3, 0x4a, 0x9c, 0xcf, 0x30, 0x5b, 0xbb, 0x64, 0xc3,
++ 0xb2, 0x5c, 0xed, 0x9a, 0xf2, 0x36, 0xd8, 0x0e, 0x7d, 0xbc, 0xe7, 0xe1,
++ 0xd9, 0xdb, 0xee, 0xc3, 0x41, 0xca, 0x81, 0x4f, 0xa5, 0x9b, 0x4d, 0xae,
++ 0xfd, 0xc0, 0x38, 0x54, 0xa4, 0xe8, 0xd9, 0x7f, 0x55, 0xcd, 0x3e, 0xbb,
++ 0xa7, 0xb4, 0x13, 0x52, 0xa6, 0xa7, 0x9a, 0xeb, 0x0d, 0x37, 0xd5, 0xc9,
++ 0x83, 0x69, 0xa6, 0xd7, 0xda, 0xe5, 0xa4, 0xb9, 0x76, 0xc7, 0xb5, 0xd9,
++ 0x1b, 0xc9, 0x2e, 0x1a, 0x0c, 0x96, 0x63, 0x00, 0x4f, 0xd0, 0xd8, 0x50,
++ 0x89, 0x65, 0x79, 0xa8, 0x9a, 0xfb, 0x9e, 0xfb, 0x48, 0xbf, 0xb5, 0xd9,
++ 0xca, 0x3c, 0xd9, 0x52, 0x1f, 0x96, 0x0e, 0xbd, 0x58, 0x5d, 0xa9, 0x7d,
++ 0xb8, 0x2e, 0xef, 0xc7, 0xbe, 0x74, 0x00, 0x53, 0xe9, 0x66, 0xe5, 0x05,
++ 0xfb, 0xcc, 0x40, 0xa5, 0x47, 0x36, 0x98, 0x9e, 0x1f, 0x13, 0xc0, 0xe4,
++ 0xd5, 0xef, 0x2c, 0x9f, 0x4a, 0xef, 0xf4, 0x94, 0x8d, 0xf9, 0x65, 0x4c,
++ 0x04, 0x2a, 0x78, 0x88, 0x62, 0x85, 0xf7, 0x51, 0xd2, 0xeb, 0x3b, 0xa4,
++ 0x57, 0x89, 0xf4, 0xfa, 0x82, 0xfe, 0x23, 0xc6, 0x2c, 0x9e, 0x3d, 0x71,
++ 0x1f, 0xef, 0x13, 0x99, 0x04, 0x5a, 0xec, 0x31, 0x99, 0xb8, 0x13, 0xe7,
++ 0x86, 0xf8, 0x6c, 0xe2, 0x47, 0x6b, 0x5e, 0x4a, 0x5b, 0xeb, 0x66, 0x62,
++ 0xcd, 0xa9, 0x77, 0x08, 0x4f, 0x9b, 0x7f, 0xa0, 0xea, 0xe7, 0xc9, 0x4f,
++ 0xb3, 0xa3, 0x7f, 0x88, 0xf3, 0x75, 0xcd, 0xca, 0xcf, 0x61, 0x7a, 0x1e,
++ 0x8f, 0x3f, 0x42, 0x35, 0x3f, 0xd5, 0x0d, 0x6d, 0xff, 0x92, 0x9c, 0x2c,
++ 0x0e, 0x87, 0xd6, 0x3c, 0xfb, 0x02, 0xfe, 0x23, 0xce, 0x2f, 0x0e, 0xeb,
++ 0x2f, 0x80, 0xc7, 0x54, 0xea, 0xf1, 0xf0, 0xf4, 0x7d, 0x7c, 0x9e, 0x2a,
++ 0x48, 0x69, 0xb4, 0xb2, 0x9f, 0x95, 0xe6, 0xfd, 0x37, 0x81, 0x89, 0x2d,
++ 0x54, 0x4b, 0xdb, 0xe7, 0x58, 0xe1, 0x7d, 0x92, 0xfc, 0x22, 0x3a, 0xcc,
++ 0xe3, 0x3f, 0x5e, 0xa3, 0xe5, 0x43, 0x70, 0x10, 0xc6, 0x49, 0x05, 0xd4,
++ 0x4e, 0x20, 0xe8, 0x7f, 0x32, 0x1d, 0xa4, 0x1a, 0xad, 0xb9, 0x3b, 0x2a,
++ 0xee, 0x9c, 0xdb, 0xf7, 0xe6, 0x3c, 0xf7, 0xf1, 0x9a, 0x63, 0x69, 0x35,
++ 0xf5, 0x24, 0x9a, 0x7b, 0x7c, 0xe2, 0x0e, 0xa4, 0xea, 0x9a, 0xfb, 0x4e,
++ 0x22, 0x9c, 0xf0, 0x08, 0x35, 0x7a, 0x1e, 0x95, 0x79, 0x96, 0xe5, 0x1d,
++ 0x54, 0x27, 0x72, 0x9c, 0x49, 0xe3, 0xa4, 0xe2, 0xc0, 0xf2, 0x56, 0x6d,
++ 0x76, 0x12, 0xf3, 0xf6, 0x52, 0x19, 0xb3, 0x2e, 0x4f, 0xe3, 0x1d, 0x0a,
++ 0xd5, 0xfb, 0x6e, 0x38, 0xeb, 0x79, 0x4f, 0x71, 0x27, 0x76, 0xa4, 0x39,
++ 0x4f, 0x93, 0x5c, 0xc8, 0x37, 0xbb, 0x23, 0x3b, 0xd1, 0x9f, 0x0f, 0xe0,
++ 0x50, 0x36, 0xbc, 0x7f, 0x2f, 0xe1, 0xba, 0xe1, 0x52, 0x38, 0xb4, 0x4d,
++ 0x04, 0x48, 0xdf, 0x54, 0xff, 0xd7, 0x07, 0xa9, 0x4e, 0x56, 0xe8, 0xbf,
++ 0x52, 0xcf, 0xbc, 0x44, 0xf5, 0xcc, 0x39, 0xf2, 0x35, 0xdf, 0x5c, 0xad,
++ 0xba, 0x6c, 0xc2, 0xc2, 0x4c, 0x6c, 0x23, 0x2e, 0xdb, 0x3a, 0x0b, 0x92,
++ 0x8d, 0x71, 0x2e, 0xe2, 0xb3, 0x35, 0x1e, 0xb1, 0x6d, 0xd8, 0xf4, 0x3c,
++ 0xd8, 0x1e, 0x44, 0x38, 0xc3, 0x98, 0x53, 0xfa, 0xa6, 0x83, 0xe4, 0x31,
++ 0xa5, 0xed, 0xc2, 0x86, 0xd8, 0x2e, 0xf4, 0xeb, 0x7f, 0x02, 0x77, 0x3d,
++ 0xc7, 0x23, 0xd9, 0xac, 0xa5, 0x79, 0x2f, 0xb5, 0x77, 0x21, 0x7c, 0x94,
++ 0x73, 0x30, 0x55, 0xc3, 0x43, 0xec, 0xbb, 0x3c, 0xff, 0x6d, 0xc6, 0x0a,
++ 0xc2, 0x15, 0x35, 0xed, 0x95, 0x3c, 0x7f, 0x7d, 0x9e, 0xcf, 0x74, 0x82,
++ 0x6a, 0x53, 0x78, 0xdf, 0x5a, 0x6d, 0xe0, 0x71, 0x8a, 0x31, 0x89, 0x36,
++ 0x17, 0xb0, 0x80, 0xcf, 0x2e, 0x57, 0xea, 0x18, 0xe6, 0x77, 0x69, 0x5e,
++ 0x60, 0x3a, 0x4e, 0xf6, 0xf1, 0x77, 0xce, 0x28, 0x85, 0xe6, 0xce, 0x96,
++ 0x72, 0xff, 0xe4, 0xb0, 0x95, 0xe4, 0xf7, 0x0d, 0xa4, 0xa0, 0x8f, 0xe2,
++ 0x6d, 0xb0, 0x0c, 0x2a, 0xea, 0x29, 0x2e, 0x3b, 0xb4, 0x79, 0xb9, 0xb3,
++ 0xac, 0x4f, 0x58, 0x13, 0x73, 0xba, 0x70, 0xd2, 0x33, 0x7b, 0xc6, 0xd4,
++ 0x81, 0xbd, 0x68, 0xee, 0x7f, 0x57, 0x54, 0xd9, 0x3b, 0x98, 0x93, 0x2d,
++ 0x48, 0x2d, 0x31, 0x9c, 0x5b, 0x3e, 0xc9, 0xae, 0x23, 0x3a, 0x2e, 0x10,
++ 0x08, 0x5d, 0x6f, 0xef, 0x73, 0x4d, 0xb6, 0xfc, 0x29, 0xcd, 0xcd, 0xdf,
++ 0xff, 0xd8, 0xc7, 0x67, 0x2e, 0x4f, 0x65, 0x9f, 0xb7, 0xa2, 0x0b, 0x2b,
++ 0xf2, 0x39, 0x4d, 0xbe, 0x1f, 0x34, 0x24, 0x34, 0x68, 0x91, 0xd9, 0x1e,
++ 0xfa, 0xfd, 0xd7, 0x79, 0x42, 0xfb, 0xab, 0xfb, 0xf0, 0xcb, 0x09, 0x03,
++ 0x07, 0x28, 0x0f, 0xd4, 0x6a, 0xaa, 0x32, 0x81, 0x10, 0xd7, 0xd2, 0x36,
++ 0xff, 0x2b, 0x27, 0xc8, 0x0f, 0xeb, 0x14, 0xbb, 0xc6, 0xa8, 0xf0, 0x77,
++ 0x99, 0xf8, 0x7b, 0xd0, 0xc7, 0xbe, 0xb0, 0x84, 0xfc, 0x62, 0x3f, 0xf9,
++ 0xeb, 0x01, 0xb2, 0x35, 0xaa, 0xe0, 0xc9, 0x0f, 0xd4, 0xfd, 0x20, 0x7f,
++ 0x1d, 0x4e, 0xb3, 0xfc, 0x83, 0xfe, 0x5e, 0x3e, 0xde, 0xac, 0xd9, 0x7d,
++ 0x55, 0x3d, 0x24, 0x71, 0xdc, 0xb5, 0xe3, 0xa9, 0x19, 0x92, 0xac, 0x6a,
++ 0xa6, 0x6b, 0xb0, 0x14, 0x0e, 0x7a, 0xf9, 0x5d, 0x00, 0x02, 0x87, 0xbd,
++ 0x7a, 0x25, 0x57, 0xce, 0x50, 0x3e, 0xba, 0x4c, 0x74, 0x1c, 0x8a, 0x35,
++ 0x20, 0x45, 0xf9, 0x28, 0xa3, 0x55, 0x6c, 0x49, 0x9b, 0x66, 0x8c, 0x59,
++ 0x6f, 0x04, 0xc7, 0xd5, 0x90, 0xcb, 0xd1, 0x3c, 0x70, 0x06, 0x3b, 0xad,
++ 0xf3, 0x75, 0x6c, 0x53, 0x2e, 0x1c, 0x6f, 0x99, 0xb6, 0xca, 0x01, 0xe6,
++ 0xd7, 0x81, 0xe7, 0x75, 0xb2, 0x99, 0xc5, 0xe1, 0xe0, 0xf3, 0x94, 0x53,
++ 0xa7, 0xe6, 0xf4, 0x11, 0xce, 0xcf, 0xdb, 0xe3, 0x5a, 0x96, 0x75, 0x34,
++ 0x05, 0x2d, 0x91, 0x47, 0x2f, 0x7d, 0x6f, 0x0a, 0x5e, 0x9e, 0xb3, 0xd5,
++ 0x15, 0xd3, 0xaf, 0xfb, 0xe6, 0xde, 0xcb, 0xb1, 0x9f, 0x09, 0xe5, 0xff,
++ 0x88, 0x7e, 0xf3, 0x9c, 0x01, 0xc6, 0x32, 0x7c, 0x56, 0xcb, 0xbb, 0xa3,
++ 0xdd, 0xcd, 0xfe, 0xa2, 0xf0, 0x3b, 0x09, 0x1b, 0x86, 0xb9, 0x2f, 0xcc,
++ 0x3d, 0x1a, 0x07, 0xf6, 0x5e, 0x7d, 0x67, 0x82, 0x3f, 0x3b, 0xb1, 0x69,
++ 0x98, 0x7b, 0x11, 0xa7, 0x6f, 0x90, 0xf1, 0x37, 0x94, 0x87, 0x65, 0xf6,
++ 0x79, 0xf2, 0xf5, 0x4f, 0xd7, 0xbc, 0x34, 0xc6, 0x39, 0x35, 0x60, 0xdc,
++ 0x95, 0x9e, 0xd7, 0xf1, 0x55, 0x9e, 0xce, 0xde, 0x4d, 0x71, 0x27, 0x93,
++ 0x56, 0x07, 0x22, 0x0e, 0x7b, 0x7f, 0x2d, 0x55, 0x14, 0x5f, 0xa5, 0x22,
++ 0x8d, 0xe7, 0x53, 0xfc, 0x03, 0x87, 0x43, 0xc8, 0x64, 0xbb, 0xf0, 0x8d,
++ 0x61, 0xcb, 0x72, 0xb7, 0x39, 0xf1, 0xca, 0x90, 0x85, 0x0f, 0x62, 0xc0,
++ 0xcb, 0x43, 0xe1, 0x81, 0x73, 0xc0, 0xb7, 0x6b, 0xa9, 0x46, 0x6e, 0x11,
++ 0x6a, 0x37, 0x61, 0x83, 0xd0, 0x7b, 0x68, 0x0e, 0xe6, 0xa1, 0x9e, 0xdd,
++ 0x4d, 0xf3, 0xbd, 0x58, 0x00, 0x7e, 0x59, 0xf0, 0xe2, 0x17, 0xc3, 0x3c,
++ 0xa7, 0x17, 0xe7, 0x8e, 0xd6, 0xfb, 0x77, 0xd2, 0x5c, 0x07, 0x29, 0xbe,
++ 0x77, 0x1d, 0x4b, 0x60, 0xd3, 0x61, 0x81, 0x68, 0x24, 0x81, 0xce, 0x63,
++ 0x35, 0xd8, 0x38, 0x2c, 0xe3, 0xfd, 0x78, 0x0d, 0x6e, 0x39, 0x3a, 0xcf,
++ 0x47, 0xa5, 0xaf, 0xc1, 0x67, 0x35, 0xf9, 0x1c, 0xdc, 0xc9, 0x2c, 0xc7,
++ 0x6c, 0xca, 0x17, 0x59, 0x8e, 0x81, 0x96, 0x15, 0x6c, 0xaf, 0xf4, 0x39,
++ 0x9e, 0xa6, 0xfc, 0xf1, 0x78, 0xbb, 0x16, 0x0c, 0x4a, 0x06, 0x96, 0x8f,
++ 0x96, 0xef, 0xac, 0x85, 0x75, 0x8a, 0xf7, 0x33, 0x3e, 0x6a, 0xb1, 0xac,
++ 0x4d, 0xf1, 0xc8, 0xec, 0xbd, 0x36, 0xae, 0x0d, 0x90, 0x4f, 0x35, 0xe2,
++ 0xf1, 0xec, 0xfc, 0x9e, 0x97, 0xd6, 0x73, 0xc9, 0x61, 0xee, 0x52, 0x60,
++ 0x5d, 0xa9, 0x32, 0xac, 0x8f, 0x5c, 0x46, 0x24, 0xf8, 0x80, 0xe0, 0xb3,
++ 0x22, 0xdc, 0x13, 0xb7, 0xac, 0x37, 0xe3, 0x96, 0x55, 0x88, 0x9b, 0x9e,
++ 0x15, 0xab, 0x14, 0x1c, 0x5b, 0xc6, 0xef, 0x2a, 0x84, 0x93, 0x0d, 0x64,
++ 0x5f, 0xde, 0x65, 0x5a, 0x70, 0x2b, 0x54, 0xd3, 0xa4, 0x20, 0x17, 0x5a,
++ 0xa8, 0xf6, 0x00, 0x8d, 0xfe, 0x43, 0x43, 0xf5, 0xf8, 0xfe, 0xcc, 0xef,
++ 0xf2, 0xf1, 0x1d, 0xbb, 0x9f, 0x76, 0x45, 0xc7, 0xba, 0x5a, 0x44, 0x92,
++ 0xf7, 0x80, 0x7b, 0xa3, 0x7c, 0xa6, 0xd5, 0xc4, 0x2d, 0xf1, 0x3e, 0xec,
++ 0x18, 0xe6, 0x7d, 0xb6, 0x3a, 0xe3, 0xca, 0xb0, 0xf5, 0xd7, 0x1e, 0xa2,
++ 0x7f, 0x5d, 0x7b, 0x73, 0xca, 0x6b, 0xbf, 0xe3, 0xe4, 0x34, 0xd6, 0x8f,
++ 0xd5, 0xa1, 0x34, 0xa5, 0x95, 0x97, 0x88, 0xe4, 0x1b, 0x3e, 0x44, 0x82,
++ 0x0d, 0x14, 0xab, 0x66, 0xc8, 0x77, 0xa7, 0x4a, 0x5c, 0x07, 0x2c, 0x30,
++ 0xac, 0xd1, 0x45, 0x98, 0x9c, 0xa1, 0xb9, 0xb2, 0x5a, 0xe7, 0x07, 0x84,
++ 0xf3, 0xaa, 0x0d, 0xab, 0xd6, 0x6b, 0x44, 0xce, 0x36, 0x0b, 0x07, 0x66,
++ 0xdb, 0x2c, 0xab, 0xab, 0x5d, 0x1b, 0xa8, 0x11, 0xe8, 0x97, 0x0c, 0x2d,
++ 0xd1, 0xe2, 0xc0, 0xd7, 0x82, 0x88, 0x74, 0xbe, 0x89, 0x48, 0xcf, 0x05,
++ 0x8a, 0x61, 0x4f, 0x95, 0xf8, 0x9c, 0xf0, 0x23, 0xf8, 0xeb, 0xe1, 0x85,
++ 0x38, 0x35, 0xd5, 0x3f, 0xd7, 0x13, 0x83, 0xf7, 0xfa, 0x55, 0x06, 0x8e,
++ 0x0f, 0x87, 0xc8, 0x7e, 0xdc, 0x14, 0xd7, 0x65, 0x48, 0x4d, 0x90, 0xeb,
++ 0xa8, 0x4e, 0x88, 0x3d, 0x66, 0x59, 0x2b, 0x9a, 0x2a, 0x35, 0xcf, 0x8a,
++ 0xe9, 0x6b, 0xdf, 0x71, 0x98, 0xef, 0xf7, 0x04, 0x49, 0x7f, 0xcd, 0xa9,
++ 0x1d, 0xe2, 0x8c, 0x65, 0xfe, 0x81, 0x20, 0x9e, 0x7b, 0x6a, 0xe0, 0x65,
++ 0xbe, 0x65, 0xec, 0x1e, 0xe5, 0x3e, 0x1c, 0xeb, 0x0d, 0xde, 0xce, 0x38,
++ 0xef, 0x97, 0xb3, 0x8e, 0xca, 0xde, 0x0d, 0x71, 0x8a, 0x89, 0xc2, 0x4f,
++ 0x78, 0xca, 0xf4, 0x74, 0x50, 0x7e, 0xaa, 0x1a, 0xe6, 0xf7, 0x2d, 0x7c,
++ 0x38, 0x40, 0x71, 0xe3, 0xb2, 0x5e, 0x8d, 0x43, 0x75, 0x6a, 0x82, 0xeb,
++ 0xe9, 0x27, 0x4b, 0xdc, 0x33, 0xdc, 0x89, 0xed, 0xfc, 0xbe, 0x4a, 0x69,
++ 0xb5, 0x7d, 0xb6, 0x90, 0xae, 0x11, 0x36, 0x60, 0x3a, 0xe6, 0xd7, 0xef,
++ 0xc4, 0x92, 0x21, 0xd6, 0xe3, 0xc7, 0x6b, 0x82, 0x24, 0xa3, 0xc7, 0xc9,
++ 0x2e, 0x24, 0xa3, 0x03, 0xf2, 0x90, 0x65, 0xdd, 0x18, 0xbf, 0x76, 0x0e,
++ 0xad, 0xff, 0x82, 0x83, 0xea, 0x3b, 0x07, 0xef, 0xeb, 0xa9, 0x89, 0x13,
++ 0xe2, 0xda, 0x39, 0x0b, 0x35, 0xdc, 0x4f, 0x34, 0xa7, 0x2a, 0x79, 0xe9,
++ 0x38, 0xe5, 0xa5, 0x97, 0x73, 0xec, 0x23, 0xf5, 0x06, 0xfb, 0x88, 0x44,
++ 0xb1, 0x76, 0x7d, 0x3a, 0x84, 0x0b, 0x3a, 0x34, 0x37, 0x62, 0x44, 0x77,
++ 0xa4, 0xbb, 0x63, 0x0e, 0xf3, 0xb9, 0x28, 0xfe, 0x4f, 0xe5, 0x78, 0xaf,
++ 0x4d, 0xa0, 0x46, 0x63, 0x1b, 0xb0, 0x73, 0x01, 0xc5, 0xb4, 0x7e, 0xd4,
++ 0xae, 0x06, 0x2e, 0x0d, 0xf1, 0xfe, 0x8c, 0x86, 0x03, 0xa5, 0x01, 0xd1,
++ 0x30, 0xf4, 0x5b, 0x2b, 0x54, 0x35, 0xbf, 0x07, 0xf8, 0x30, 0xef, 0x01,
++ 0x92, 0x0d, 0xf4, 0xdb, 0xe7, 0x7c, 0xde, 0x4c, 0xf3, 0x39, 0x9f, 0x70,
++ 0x68, 0x13, 0xf9, 0x4e, 0x2f, 0x9a, 0xf5, 0x69, 0xc2, 0xce, 0xb3, 0x44,
++ 0x67, 0x93, 0xa8, 0xec, 0x73, 0x45, 0xe6, 0xf6, 0xe9, 0x96, 0xe5, 0x3b,
++ 0x45, 0x4d, 0x81, 0x69, 0x0a, 0x10, 0x4d, 0x1d, 0xa2, 0xfa, 0xd8, 0x06,
++ 0xe1, 0x3b, 0xd6, 0x25, 0xa4, 0x02, 0xc7, 0xe4, 0x3a, 0x63, 0x4f, 0x8e,
++ 0xf3, 0xd9, 0x66, 0xe1, 0x3c, 0xba, 0x45, 0x78, 0x0b, 0x3d, 0xc2, 0x7f,
++ 0xcc, 0xc4, 0xfd, 0xf1, 0x2e, 0x9c, 0x1b, 0xe6, 0xb3, 0x6c, 0xf7, 0x89,
++ 0x9a, 0xb9, 0xbd, 0x39, 0x6f, 0xa1, 0xd1, 0x5f, 0x48, 0x73, 0x7f, 0xf7,
++ 0xe3, 0x35, 0xe9, 0xa1, 0x45, 0xfe, 0xa7, 0xc6, 0x02, 0xfe, 0x27, 0xc7,
++ 0xd4, 0xfe, 0x7d, 0xc2, 0xb2, 0x76, 0xc6, 0xfe, 0x03, 0xeb, 0xd0, 0x6a,
++ 0x8e, 0x55, 0xf0, 0xc1, 0x6e, 0x92, 0xc7, 0x36, 0xca, 0x2d, 0x93, 0x7a,
++ 0xf3, 0x1c, 0x16, 0x51, 0x53, 0xfc, 0xee, 0x1b, 0xfd, 0x77, 0x73, 0x6e,
++ 0xe3, 0x7d, 0x4d, 0x67, 0x3b, 0x28, 0xee, 0x7e, 0xc6, 0x6b, 0xcd, 0x10,
++ 0x9f, 0x51, 0xeb, 0x87, 0xff, 0x4b, 0xf6, 0xf5, 0xce, 0x7d, 0xb6, 0xaf,
++ 0x97, 0x78, 0x52, 0xa8, 0xe5, 0x19, 0xe2, 0xb7, 0xca, 0xf1, 0xb9, 0x3d,
++ 0xbd, 0xb9, 0xfd, 0xbc, 0x4e, 0xe1, 0x2b, 0x70, 0x7d, 0x1e, 0x30, 0x5e,
++ 0x1f, 0xea, 0x10, 0xde, 0x63, 0xc3, 0x94, 0x1f, 0x37, 0x10, 0xcf, 0x7c,
++ 0x76, 0xac, 0x4b, 0xf8, 0x0b, 0x9b, 0x85, 0x8f, 0xf8, 0xac, 0x26, 0x3e,
++ 0x71, 0xcc, 0x23, 0xbc, 0xc4, 0xa3, 0x87, 0x78, 0xf4, 0xce, 0xf1, 0xe8,
++ 0x29, 0x04, 0xfd, 0xe9, 0x74, 0xbd, 0xff, 0xd1, 0x31, 0xc5, 0xbf, 0x6f,
++ 0xcc, 0xb2, 0xde, 0xd7, 0x15, 0x3f, 0xf3, 0xf5, 0xaa, 0xfe, 0x45, 0xbe,
++ 0x6e, 0x20, 0xbe, 0x2a, 0x7b, 0xb1, 0xa4, 0xc3, 0x14, 0xeb, 0x90, 0xcf,
++ 0x71, 0xcc, 0xf3, 0x75, 0x30, 0xcd, 0xfb, 0x95, 0xbc, 0x6f, 0x39, 0x20,
++ 0x56, 0x10, 0x5f, 0x65, 0xe2, 0x6b, 0xe5, 0x97, 0xf0, 0xf5, 0xe1, 0x35,
++ 0x7c, 0xbd, 0xfa, 0xf7, 0xf2, 0xe5, 0x11, 0xcb, 0x87, 0x39, 0x0e, 0xdd,
++ 0x66, 0xc8, 0xc3, 0x16, 0x61, 0x47, 0x07, 0xbe, 0x3f, 0x05, 0x14, 0xb3,
++ 0xbb, 0x20, 0x53, 0xbc, 0x39, 0x1d, 0x8f, 0x84, 0x5e, 0xa1, 0x7a, 0x72,
++ 0xba, 0xe4, 0x15, 0xcb, 0xec, 0x3d, 0x59, 0xac, 0x90, 0x89, 0xa6, 0x19,
++ 0xfb, 0x5d, 0x33, 0xe8, 0xb5, 0x1a, 0xeb, 0x52, 0x3b, 0xbb, 0x15, 0x91,
++ 0x72, 0xc4, 0xd1, 0x25, 0x12, 0x05, 0xde, 0x83, 0xdd, 0x22, 0x56, 0xda,
++ 0xfb, 0xaf, 0x9d, 0xe2, 0xfa, 0x42, 0x87, 0x68, 0x21, 0xbb, 0x68, 0x3e,
++ 0xc6, 0xe7, 0xc1, 0x36, 0x8b, 0xe6, 0x39, 0x79, 0x2c, 0x27, 0x79, 0x0c,
++ 0x7d, 0x4e, 0x1e, 0x1b, 0x6c, 0x79, 0xfc, 0x4c, 0xbf, 0x78, 0x4d, 0x0f,
++ 0x8d, 0xeb, 0x2a, 0xca, 0x86, 0x54, 0x3b, 0xd5, 0xce, 0xd5, 0x4e, 0x6f,
++ 0xc5, 0xf8, 0x9c, 0x8f, 0x69, 0xd5, 0x68, 0x08, 0x39, 0x0d, 0xb5, 0xe7,
++ 0xb4, 0xd0, 0x52, 0xf7, 0x89, 0xe4, 0x26, 0x1f, 0xd5, 0x3f, 0x3b, 0x62,
++ 0x91, 0xe4, 0x72, 0x11, 0x49, 0x38, 0x05, 0xe7, 0x15, 0x5d, 0xae, 0x2a,
++ 0x9a, 0xd8, 0x47, 0xf1, 0xed, 0xc5, 0x9c, 0x44, 0xd8, 0x81, 0xdf, 0x3f,
++ 0x73, 0xe2, 0x46, 0x82, 0x12, 0x4f, 0x10, 0xee, 0x78, 0x3c, 0xdb, 0x87,
++ 0x27, 0xf2, 0xbd, 0x78, 0x3c, 0xff, 0x77, 0xde, 0xb5, 0x91, 0xbd, 0x46,
++ 0x63, 0xa2, 0x72, 0x16, 0xe1, 0xe3, 0xc4, 0x75, 0x11, 0x96, 0xcd, 0x89,
++ 0x16, 0x39, 0xc2, 0xb5, 0xae, 0xf3, 0x77, 0xdf, 0xd5, 0xd8, 0x17, 0x7b,
++ 0x56, 0xbd, 0x64, 0x63, 0x91, 0x93, 0x6d, 0xc7, 0xec, 0x33, 0x52, 0xe5,
++ 0x95, 0x7b, 0xec, 0x77, 0x41, 0x7d, 0xab, 0xef, 0xd2, 0xd8, 0x1f, 0x4e,
++ 0xc4, 0xd7, 0xdb, 0xf9, 0xb5, 0x71, 0x6d, 0xe5, 0x3d, 0x99, 0xe0, 0xda,
++ 0x4a, 0xaf, 0x26, 0xb0, 0x36, 0x6a, 0x7f, 0x86, 0xd6, 0x56, 0xf6, 0xba,
++ 0xf5, 0xb5, 0x4d, 0xf6, 0x67, 0x74, 0x6d, 0xc5, 0xa7, 0xb4, 0xb5, 0x9a,
++ 0xfd, 0x19, 0x5f, 0x5b, 0xc9, 0xcb, 0x2d, 0x6b, 0x97, 0x5e, 0x7d, 0xbf,
++ 0x86, 0xff, 0xfe, 0x17, 0x9f, 0xed, 0x4e, 0xb2, 0x20, 0x3b, 0x00, 0x00,
++ 0x00 };
+
+ static const u32 bnx2_TXP_b09FwData[(0x0/4) + 1] = { 0x0 };
+ static const u32 bnx2_TXP_b09FwRodata[(0x30/4) + 1] = {
+@@ -4513,15 +4582,15 @@
+ 0x00000000 };
+
+ static struct fw_info bnx2_txp_fw_09 = {
+- /* Firmware version: 4.6.15 */
++ /* Firmware version: 4.4.23 */
+ .ver_major = 0x4,
+- .ver_minor = 0x6,
+- .ver_fix = 0xf,
++ .ver_minor = 0x4,
++ .ver_fix = 0x17,
+
+- .start_addr = 0x08000098,
++ .start_addr = 0x08000094,
+
+ .text_addr = 0x08000000,
+- .text_len = 0x3ae8,
++ .text_len = 0x3b1c,
+ .text_index = 0x0,
+ .gz_text = bnx2_TXP_b09FwText,
+ .gz_text_len = sizeof(bnx2_TXP_b09FwText),
+@@ -4531,15 +4600,15 @@
+ .data_index = 0x0,
+ .data = bnx2_TXP_b09FwData,
+
+- .sbss_addr = 0x08003b40,
++ .sbss_addr = 0x08003b80,
+ .sbss_len = 0x6c,
+ .sbss_index = 0x0,
+
+- .bss_addr = 0x08003bac,
++ .bss_addr = 0x08003bec,
+ .bss_len = 0x24c,
+ .bss_index = 0x0,
+
+- .rodata_addr = 0x08003ae8,
++ .rodata_addr = 0x08003b1c,
+ .rodata_len = 0x30,
+ .rodata_index = 0x0,
+ .rodata = bnx2_TXP_b09FwRodata,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/bnx2_fw.h linux-2.6.29-rc3.owrt/drivers/net/bnx2_fw.h
+--- linux-2.6.29.owrt/drivers/net/bnx2_fw.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/bnx2_fw.h 2009-05-10 23:48:28.000000000 +0200
+@@ -15,849 +15,854 @@
+ */
+
+ static u8 bnx2_COM_b06FwText[] = {
+- 0xcd, 0x7c, 0x0d, 0x70, 0x5c, 0xd7, 0x75, 0xde, 0xd9, 0xb7, 0xbb, 0xc0,
+- 0x12, 0x04, 0xc1, 0x07, 0x68, 0x05, 0xad, 0x24, 0x24, 0xde, 0x87, 0x7d,
+- 0x00, 0x56, 0x22, 0xe4, 0x3c, 0x32, 0x10, 0x0d, 0xb9, 0x5b, 0x72, 0xbd,
+- 0x0b, 0x50, 0x90, 0x43, 0x23, 0x90, 0x84, 0x28, 0x6a, 0x86, 0xe3, 0x41,
+- 0x97, 0xa0, 0x62, 0x69, 0xdc, 0x86, 0x1e, 0x2b, 0x29, 0xe5, 0x2a, 0xe6,
+- 0x6a, 0x01, 0xca, 0x94, 0x02, 0x72, 0x61, 0x12, 0x04, 0xd5, 0x54, 0x6d,
+- 0xd7, 0x0b, 0x80, 0x54, 0xd4, 0x25, 0x97, 0x94, 0xfc, 0xa3, 0x99, 0xd8,
+- 0x21, 0x4a, 0xd1, 0x92, 0xed, 0x71, 0xa7, 0x92, 0xc7, 0x9d, 0xaa, 0x33,
+- 0x9a, 0x94, 0xa5, 0xe4, 0xda, 0xf1, 0x34, 0x8d, 0x6a, 0x7b, 0x1a, 0x25,
+- 0xb1, 0xf3, 0xfa, 0x7d, 0xf7, 0xdd, 0x0b, 0x2c, 0x20, 0x48, 0x56, 0x92,
+- 0xf1, 0x4c, 0x30, 0xb3, 0xbc, 0xef, 0xde, 0x77, 0x7f, 0xcf, 0x39, 0xf7,
+- 0x9c, 0xef, 0x9c, 0x7b, 0x1f, 0x77, 0x89, 0xb4, 0x88, 0xfe, 0xdb, 0x82,
+- 0xdf, 0xc0, 0xbf, 0xf8, 0x9d, 0xfd, 0xdb, 0x3f, 0xb8, 0xf3, 0x83, 0x78,
+- 0xdc, 0x69, 0xd9, 0x4d, 0x11, 0x96, 0x87, 0xf1, 0x8b, 0xe3, 0xb7, 0x43,
+- 0x3f, 0x6f, 0xf4, 0x67, 0xb3, 0x41, 0x48, 0x64, 0xe2, 0x87, 0x22, 0xa1,
+- 0x75, 0xef, 0x62, 0xef, 0xd2, 0xe6, 0xbd, 0xfe, 0xac, 0xf7, 0x59, 0xcf,
+- 0xfe, 0x7b, 0xf4, 0x6d, 0xfe, 0xc2, 0xba, 0xf9, 0x16, 0xfd, 0x93, 0x98,
+- 0x95, 0xb9, 0xfa, 0xb1, 0x9c, 0x2b, 0xb1, 0x70, 0xe6, 0xbb, 0xa3, 0xfb,
+- 0x5d, 0x91, 0x6c, 0x6d, 0x5b, 0x32, 0x2f, 0x3f, 0xf3, 0x8b, 0xf1, 0x88,
+- 0xb0, 0xfc, 0x97, 0x32, 0x3f, 0x3d, 0xfc, 0xb5, 0x0f, 0x39, 0x6f, 0x55,
+- 0xc2, 0x12, 0xb3, 0x33, 0x6f, 0x8b, 0xdd, 0x2b, 0xb1, 0x2e, 0xb4, 0x79,
+- 0xba, 0xef, 0x59, 0x4b, 0xda, 0x4c, 0x5f, 0xf6, 0x44, 0x38, 0x23, 0x63,
+- 0x93, 0x33, 0x87, 0x7d, 0xcb, 0x95, 0xe2, 0x4d, 0x19, 0x37, 0x59, 0x92,
+- 0xd6, 0xc1, 0xe9, 0x81, 0x0f, 0x09, 0xf2, 0x63, 0x93, 0xb5, 0x98, 0xe4,
+- 0xea, 0xc5, 0x56, 0xcb, 0x75, 0x91, 0xc6, 0x8a, 0x37, 0x67, 0x24, 0xd6,
+- 0x94, 0x79, 0xba, 0xf9, 0x25, 0x97, 0xe3, 0x27, 0x46, 0x73, 0xee, 0xcd,
+- 0x12, 0x71, 0x7d, 0x7f, 0x1a, 0xe3, 0xef, 0xa9, 0xfd, 0xcc, 0x7f, 0x2c,
+- 0x12, 0x8c, 0x6d, 0x65, 0x8a, 0x61, 0xa6, 0xa1, 0x4c, 0x72, 0xb4, 0xbb,
+- 0xa6, 0xf2, 0x4d, 0x41, 0xde, 0x35, 0xf9, 0x2d, 0x41, 0x7e, 0x42, 0xe7,
+- 0xed, 0x96, 0x60, 0x2d, 0xb1, 0x4d, 0x58, 0x4b, 0x2c, 0x92, 0x19, 0xda,
+- 0x84, 0x3e, 0x63, 0xd1, 0x8c, 0x9b, 0x59, 0x52, 0xf5, 0x3e, 0xa1, 0xeb,
+- 0x1d, 0x8c, 0x06, 0xed, 0x26, 0x47, 0x7b, 0x6b, 0x4c, 0x1f, 0x1e, 0xed,
+- 0x51, 0xe9, 0xa3, 0xa3, 0x29, 0x95, 0x16, 0x55, 0xbd, 0x50, 0x66, 0x7a,
+- 0xd4, 0x55, 0x69, 0x97, 0x2e, 0x4f, 0x8f, 0x26, 0x55, 0xda, 0xaf, 0x53,
+- 0x4f, 0xa7, 0x03, 0x3a, 0x1d, 0xd4, 0x69, 0x46, 0xa7, 0x59, 0x9d, 0x0e,
+- 0xe9, 0x7e, 0x46, 0x74, 0x7e, 0xaf, 0x4e, 0xc7, 0x74, 0x3a, 0xae, 0xd3,
+- 0xfb, 0x75, 0xba, 0x4f, 0xcf, 0xeb, 0x93, 0x3a, 0x7f, 0x50, 0xcf, 0xef,
+- 0x10, 0xe6, 0xf1, 0x93, 0x26, 0x2d, 0xbf, 0x58, 0x67, 0x52, 0xf6, 0xcf,
+- 0xc4, 0xa4, 0x54, 0x0e, 0x4b, 0x5e, 0xf1, 0xb5, 0x3f, 0x2a, 0x2d, 0x31,
+- 0x99, 0xaa, 0xc7, 0xe4, 0xaa, 0x12, 0xdb, 0x1f, 0xf8, 0x5f, 0xeb, 0xb3,
+- 0xe5, 0x42, 0x3d, 0x2e, 0x97, 0xea, 0x12, 0x1a, 0xeb, 0xdb, 0x24, 0xd6,
+- 0x89, 0x9b, 0x24, 0x6b, 0x87, 0x24, 0xac, 0xe8, 0x9b, 0x94, 0xdc, 0x4c,
+- 0x27, 0xf2, 0x4e, 0x42, 0x64, 0x32, 0x1a, 0xf0, 0x33, 0x26, 0xe1, 0x79,
+- 0xf2, 0x67, 0x7e, 0xf4, 0xa5, 0xb9, 0x84, 0x44, 0x8e, 0x27, 0xd1, 0x7f,
+- 0xab, 0x44, 0xe7, 0xa5, 0x2b, 0x2c, 0x3d, 0x89, 0x07, 0x50, 0x63, 0xa8,
+- 0x16, 0x91, 0xe1, 0x5a, 0x08, 0x3c, 0x8b, 0x41, 0x5e, 0x5a, 0xf1, 0xb3,
+- 0xf1, 0x8b, 0xe3, 0x97, 0xc0, 0xef, 0x09, 0xf4, 0xd3, 0x25, 0xf9, 0x1a,
+- 0xfb, 0xc4, 0xb8, 0x65, 0x8c, 0x5f, 0x76, 0xec, 0x09, 0xe1, 0x9c, 0x12,
+- 0xf2, 0xb5, 0xbe, 0x60, 0x4e, 0x97, 0xea, 0xb1, 0x50, 0xee, 0xb4, 0x1c,
+- 0xcc, 0x7b, 0x92, 0xb4, 0xdc, 0x16, 0x29, 0xd8, 0xa1, 0xe4, 0x64, 0xba,
+- 0x43, 0x8a, 0xe3, 0x78, 0x57, 0x96, 0xac, 0x85, 0xbe, 0x0b, 0xb6, 0x4c,
+- 0x04, 0xef, 0x58, 0xf6, 0x37, 0xd8, 0xb7, 0x8e, 0x4d, 0x01, 0xbe, 0x54,
+- 0xfe, 0x63, 0x3c, 0xb3, 0xaf, 0xff, 0x17, 0x0e, 0xe6, 0xfc, 0xd7, 0xc8,
+- 0xb3, 0xfc, 0xcb, 0x5b, 0x83, 0x3c, 0x9f, 0x59, 0xd7, 0x8c, 0x69, 0xd6,
+- 0xca, 0xb1, 0xfb, 0xb0, 0x5e, 0x8e, 0xbf, 0xb2, 0x5e, 0xcc, 0xa3, 0x35,
+- 0x94, 0x3f, 0x9d, 0x94, 0x23, 0xe5, 0x5d, 0x92, 0xf3, 0x7c, 0x7f, 0xbf,
+- 0x27, 0x71, 0x4b, 0x7a, 0xec, 0x3c, 0xde, 0x56, 0x6b, 0x12, 0xca, 0x95,
+- 0x0d, 0x3d, 0xd8, 0x6f, 0x04, 0x65, 0x9d, 0xa8, 0xdf, 0x16, 0x1a, 0x3a,
+- 0x8d, 0xb9, 0x67, 0x48, 0x17, 0xc8, 0xae, 0xd7, 0x93, 0x98, 0xc4, 0x78,
+- 0x0b, 0xb5, 0x1e, 0xef, 0xb2, 0xd8, 0xe8, 0xb3, 0x03, 0x75, 0x48, 0x23,
+- 0xf6, 0xc5, 0x3e, 0xd9, 0x5f, 0x2b, 0xda, 0xc6, 0xf1, 0x8e, 0x73, 0xf2,
+- 0xfd, 0x9c, 0x67, 0x33, 0x2f, 0x15, 0xd0, 0xad, 0x42, 0xba, 0xb5, 0x74,
+- 0xc9, 0x99, 0x1a, 0xc7, 0xd8, 0x68, 0xde, 0xb7, 0xfe, 0x23, 0x9b, 0x77,
+- 0x02, 0xfd, 0xc7, 0x91, 0x6e, 0x0e, 0xe5, 0x4e, 0xfa, 0x18, 0x3f, 0x81,
+- 0xe7, 0x8d, 0xd6, 0x70, 0x55, 0xcb, 0x60, 0x02, 0x73, 0x8f, 0xcb, 0x45,
+- 0x25, 0x87, 0x9b, 0x25, 0x0c, 0x39, 0x24, 0x8f, 0xdb, 0xe7, 0x6f, 0x97,
+- 0x42, 0xdc, 0x49, 0x52, 0x87, 0x76, 0xef, 0xd8, 0x84, 0x35, 0x6a, 0x6d,
+- 0x78, 0x3c, 0x0e, 0x39, 0xbc, 0xdc, 0x6e, 0xa1, 0xc4, 0x12, 0xc7, 0xfe,
+- 0x2d, 0x29, 0x4a, 0x7e, 0xf1, 0x91, 0x90, 0xb4, 0x58, 0xa8, 0xb7, 0x2d,
+- 0x14, 0xd0, 0x80, 0xf4, 0xc9, 0x82, 0x3e, 0x21, 0x09, 0xf6, 0x73, 0x56,
+- 0xba, 0x6b, 0xea, 0x7d, 0xd2, 0x52, 0xef, 0x86, 0xf0, 0x2e, 0x22, 0xa9,
+- 0x1d, 0xe6, 0xfd, 0x10, 0xde, 0xdf, 0x24, 0x13, 0x36, 0xe6, 0x52, 0x7e,
+- 0xc1, 0xca, 0x61, 0x8e, 0x1f, 0x89, 0xa8, 0xb5, 0xa2, 0xee, 0x44, 0x43,
+- 0x3f, 0x13, 0xa8, 0xf7, 0x34, 0xc6, 0xc2, 0x7c, 0xcb, 0x49, 0xcc, 0xa5,
+- 0x13, 0x73, 0xe1, 0x1c, 0x8b, 0x56, 0xae, 0x1e, 0x41, 0x7e, 0xda, 0xca,
+- 0x9f, 0x3d, 0x8a, 0x67, 0xb1, 0xad, 0xcc, 0x0b, 0x4c, 0xd1, 0x7e, 0x5f,
+- 0x43, 0xfb, 0x7d, 0x68, 0xcf, 0x31, 0xd8, 0x3e, 0x90, 0xff, 0xa2, 0x92,
+- 0xc5, 0xe4, 0x7b, 0xd0, 0x23, 0xfc, 0xf7, 0xa0, 0xc7, 0xd7, 0x34, 0x3d,
+- 0x7e, 0x26, 0xbf, 0x78, 0x7a, 0x5c, 0xfd, 0x05, 0xd1, 0x43, 0xa4, 0x70,
+- 0x92, 0xcf, 0x11, 0x29, 0x2a, 0xbd, 0xc5, 0x7d, 0x4b, 0x79, 0xa7, 0xce,
+- 0x22, 0x9d, 0x28, 0xc7, 0xd8, 0x03, 0xf5, 0x08, 0xd2, 0x67, 0x90, 0x6e,
+- 0x0e, 0x8d, 0x9d, 0x7c, 0x13, 0xfc, 0xf7, 0xc5, 0xde, 0x61, 0xec, 0x47,
+- 0x31, 0x61, 0x4b, 0x97, 0xd8, 0x1f, 0x84, 0xf1, 0xee, 0x74, 0xec, 0x82,
+- 0x7c, 0x9f, 0xef, 0x43, 0xc6, 0xce, 0xe7, 0x66, 0x36, 0xbd, 0x9d, 0x55,
+- 0x4f, 0x51, 0xd2, 0x33, 0x6b, 0x65, 0x22, 0xa1, 0x7c, 0x39, 0x39, 0x61,
+- 0x65, 0xe2, 0xd0, 0x53, 0xcc, 0x0f, 0x86, 0x82, 0x39, 0x0f, 0xa0, 0xae,
+- 0xd1, 0x59, 0x66, 0xee, 0x03, 0x98, 0xfb, 0x7a, 0xdd, 0x95, 0xc5, 0x5c,
+- 0x38, 0x07, 0xce, 0xab, 0xa8, 0x75, 0x10, 0xfb, 0x39, 0xa4, 0xfa, 0x09,
+- 0x67, 0x06, 0x85, 0xb6, 0xb4, 0x30, 0xc3, 0x7d, 0xc0, 0x76, 0xec, 0x2b,
+- 0xd0, 0xc9, 0x85, 0x9a, 0xe9, 0xa3, 0xd8, 0xd8, 0x07, 0xe6, 0x23, 0x5b,
+- 0x2d, 0x37, 0x0a, 0xde, 0xb3, 0xab, 0xa3, 0x78, 0xf7, 0xb4, 0xe4, 0xce,
+- 0xde, 0x61, 0x61, 0x0d, 0xe8, 0x97, 0x34, 0x1a, 0x83, 0xce, 0xe6, 0x3e,
+- 0x8b, 0x49, 0x3e, 0xce, 0xb2, 0x49, 0x3d, 0x6e, 0x44, 0xb2, 0x2a, 0x9f,
+- 0x6b, 0x5b, 0x9d, 0xc7, 0x0b, 0x7a, 0x3d, 0x19, 0xac, 0x87, 0x73, 0x30,
+- 0x6b, 0xc9, 0x34, 0xac, 0xc5, 0xd0, 0x9a, 0xb4, 0xb0, 0xa1, 0xe3, 0x63,
+- 0xda, 0x86, 0xb0, 0xdd, 0x74, 0x03, 0xef, 0xa6, 0xd1, 0x86, 0xb4, 0x47,
+- 0x9d, 0x75, 0x76, 0x85, 0x36, 0x65, 0x08, 0xfd, 0x94, 0xe6, 0x2c, 0xc9,
+- 0x7b, 0xb0, 0xd9, 0xde, 0xcd, 0x5a, 0x5e, 0x57, 0x65, 0x29, 0xba, 0xa1,
+- 0x2c, 0x3d, 0x66, 0x05, 0xfa, 0x1a, 0xb6, 0x05, 0xf6, 0x67, 0x6a, 0xce,
+- 0x49, 0x1b, 0x59, 0x2a, 0xcd, 0xbc, 0x1f, 0x59, 0x32, 0xed, 0x63, 0x90,
+- 0x5d, 0x33, 0xc6, 0xfa, 0x39, 0x9b, 0x3a, 0x98, 0x63, 0x79, 0x48, 0x63,
+- 0x15, 0x8e, 0x13, 0xd8, 0x86, 0xca, 0x1a, 0xdb, 0x70, 0x14, 0x6d, 0x25,
+- 0x94, 0xef, 0x6b, 0x95, 0x03, 0x73, 0xa6, 0x8f, 0xa3, 0x4a, 0x66, 0x27,
+- 0x67, 0x1c, 0x7b, 0x38, 0x2c, 0xd9, 0xe1, 0xd9, 0x41, 0x19, 0xaa, 0x77,
+- 0x81, 0xa7, 0x6f, 0xfb, 0xb0, 0x9d, 0x1f, 0x8c, 0x8a, 0x0b, 0xbd, 0x88,
+- 0x35, 0x0f, 0x80, 0xc6, 0xf5, 0xa8, 0x58, 0x19, 0x0f, 0x69, 0x23, 0xd6,
+- 0x8a, 0x44, 0x86, 0xd7, 0xe4, 0x9b, 0x50, 0x07, 0x7d, 0x0f, 0xac, 0xaf,
+- 0x07, 0xf9, 0x04, 0x6d, 0x73, 0xde, 0xcf, 0x7c, 0xd8, 0x61, 0x6d, 0xb3,
+- 0x58, 0x4a, 0x3d, 0x61, 0x74, 0xc4, 0x6f, 0x60, 0x7f, 0xab, 0xbd, 0x50,
+- 0x04, 0x76, 0x41, 0x1f, 0xa2, 0xe4, 0xb4, 0x54, 0x7f, 0xce, 0xec, 0x7b,
+- 0x55, 0xbe, 0x67, 0x80, 0xb2, 0x57, 0x01, 0x26, 0xe0, 0x9a, 0x16, 0xd5,
+- 0x5e, 0xcf, 0xdb, 0x71, 0x99, 0x2e, 0x73, 0x3d, 0x8b, 0x92, 0xaa, 0xfd,
+- 0x7b, 0xc9, 0x9f, 0x15, 0xf9, 0xd6, 0x0c, 0xeb, 0x7d, 0x55, 0xd7, 0x7b,
+- 0x01, 0xf5, 0x52, 0xc9, 0xa1, 0x90, 0x03, 0x3b, 0xe0, 0x60, 0x9b, 0x6c,
+- 0x4b, 0x22, 0xb5, 0x47, 0xf0, 0x1b, 0xa2, 0x91, 0x41, 0xbd, 0x00, 0xfb,
+- 0xbc, 0x00, 0x7a, 0x88, 0xdc, 0x5d, 0x6e, 0x86, 0x3e, 0xf9, 0x9f, 0x98,
+- 0x6b, 0x5c, 0x9e, 0xc4, 0x3a, 0x5e, 0x9a, 0x21, 0xbe, 0xfa, 0xaa, 0x2c,
+- 0xcd, 0x10, 0x6f, 0xbd, 0x20, 0xd3, 0x33, 0x29, 0xef, 0x5b, 0xa0, 0xf3,
+- 0x19, 0xe1, 0x5a, 0xb6, 0x79, 0x48, 0x81, 0x05, 0x9d, 0xe4, 0xe3, 0xd0,
+- 0x67, 0x7d, 0x3b, 0x82, 0xfe, 0x7a, 0x74, 0x7f, 0x6e, 0xcd, 0x91, 0xab,
+- 0x36, 0xf5, 0xd3, 0x3b, 0xf7, 0x78, 0x4e, 0xef, 0xf1, 0x31, 0xaf, 0x4b,
+- 0x2c, 0xec, 0xeb, 0xec, 0x78, 0x11, 0xd6, 0x8f, 0xfb, 0xfa, 0x6d, 0x6b,
+- 0x15, 0xff, 0x24, 0x80, 0x59, 0x1d, 0x65, 0xef, 0xfe, 0x6e, 0x7b, 0xbc,
+- 0x71, 0x6f, 0x73, 0xfc, 0x36, 0xb4, 0x89, 0x20, 0x7d, 0xef, 0x7d, 0x8d,
+- 0x3e, 0x1a, 0xda, 0x0e, 0x72, 0x5f, 0xa0, 0xcd, 0xbf, 0x05, 0x2d, 0x48,
+- 0xff, 0xf7, 0xb3, 0x9f, 0x6f, 0x0b, 0xbf, 0xaf, 0xfd, 0x3c, 0xfe, 0x5e,
+- 0xfb, 0xb9, 0x71, 0x2f, 0x5f, 0x20, 0x2d, 0x30, 0xb6, 0xcc, 0x06, 0xb2,
+- 0xd5, 0x03, 0x5a, 0x27, 0x21, 0xa7, 0x98, 0x43, 0xf9, 0x6f, 0xfd, 0x6c,
+- 0x24, 0xc0, 0x73, 0x81, 0x3c, 0xb1, 0x9e, 0xa9, 0x13, 0xe8, 0xde, 0xa1,
+- 0xfa, 0x55, 0xa5, 0x67, 0x2f, 0x2a, 0x3d, 0xeb, 0x1c, 0x2d, 0x0a, 0xe5,
+- 0xed, 0xf6, 0x30, 0xe9, 0x7e, 0xc1, 0xfb, 0x7d, 0xcc, 0xd1, 0x49, 0x26,
+- 0xad, 0x9e, 0xa2, 0x65, 0xfd, 0xbe, 0x1c, 0x5c, 0x78, 0x58, 0x0e, 0x96,
+- 0xd9, 0xc7, 0x2e, 0xbc, 0x77, 0x51, 0xb6, 0x09, 0xba, 0x96, 0x3a, 0xfd,
+- 0xed, 0x50, 0x30, 0x96, 0x05, 0xfb, 0xb5, 0x1c, 0xba, 0xbb, 0x7e, 0x25,
+- 0x94, 0x5b, 0xe0, 0xde, 0x45, 0x79, 0xbd, 0x51, 0xe7, 0x1b, 0x7d, 0xff,
+- 0x0a, 0xc6, 0x34, 0x72, 0xee, 0x35, 0xe8, 0xd4, 0x69, 0xe2, 0x41, 0x2b,
+- 0xe7, 0x91, 0x7f, 0xb4, 0x2d, 0x8f, 0xd8, 0xc1, 0xfa, 0x0f, 0x81, 0x66,
+- 0xb4, 0x49, 0xa4, 0x21, 0xec, 0x61, 0x84, 0xfb, 0x97, 0xcf, 0xe2, 0x87,
+- 0x33, 0xdc, 0x83, 0x12, 0x09, 0x67, 0x80, 0x7f, 0xe3, 0xac, 0xb3, 0x0b,
+- 0x73, 0x0e, 0xf6, 0x77, 0x71, 0x65, 0x7f, 0x77, 0xcb, 0xc4, 0x42, 0x16,
+- 0x3a, 0x20, 0xaf, 0xfa, 0x89, 0xba, 0x6b, 0x6c, 0x0b, 0xea, 0x27, 0x35,
+- 0x1f, 0x36, 0x1b, 0xfd, 0x87, 0x32, 0x4f, 0x97, 0x35, 0x35, 0x94, 0x19,
+- 0x7e, 0x15, 0x30, 0x16, 0x6d, 0xc4, 0x88, 0xc6, 0x3d, 0xbe, 0x9f, 0x27,
+- 0x9f, 0xfb, 0xf7, 0x09, 0xf7, 0xc4, 0xa5, 0x72, 0xd1, 0x0e, 0x2b, 0xd9,
+- 0x5c, 0xfc, 0xd8, 0xaa, 0x6c, 0x02, 0x27, 0xab, 0x5e, 0x48, 0x5b, 0xce,
+- 0xa5, 0x15, 0xb4, 0x1c, 0xc2, 0x1a, 0x40, 0xb3, 0xce, 0x10, 0xe8, 0xd6,
+- 0x2a, 0x85, 0xfa, 0x2e, 0xfd, 0x8e, 0xe5, 0x11, 0x19, 0x8b, 0x1b, 0x3b,
+- 0xf4, 0xe7, 0x5b, 0x03, 0xac, 0x8b, 0x3a, 0xe5, 0xff, 0x1d, 0x0e, 0x64,
+- 0xdf, 0x96, 0xc2, 0xe9, 0x21, 0xc8, 0x18, 0xb1, 0xd8, 0x26, 0x2d, 0x63,
+- 0xec, 0x07, 0xe5, 0x67, 0x29, 0xc3, 0xa2, 0xf5, 0xe7, 0x20, 0xd2, 0x1f,
+- 0x87, 0x69, 0xb7, 0xd9, 0x57, 0xe1, 0xb4, 0x69, 0x6f, 0xe6, 0xd1, 0xb1,
+- 0xd2, 0xcf, 0x98, 0x67, 0x49, 0x58, 0xcd, 0x05, 0x65, 0x67, 0xd7, 0xce,
+- 0xc5, 0xea, 0x34, 0x73, 0x79, 0x34, 0x1c, 0xcc, 0xa5, 0xa3, 0xa1, 0xaf,
+- 0x78, 0xc3, 0x5c, 0x9a, 0x30, 0x97, 0xb8, 0xb2, 0x37, 0x9c, 0xcb, 0x05,
+- 0xf0, 0xbe, 0x70, 0xf6, 0xc6, 0xeb, 0x82, 0x36, 0xf1, 0x86, 0x36, 0x9d,
+- 0xeb, 0xda, 0xb0, 0xbe, 0x19, 0x03, 0xef, 0xce, 0x5e, 0xdd, 0x1c, 0xb4,
+- 0x61, 0xbd, 0x26, 0xd8, 0x37, 0xbe, 0x53, 0x7e, 0x5b, 0x83, 0xfc, 0x1f,
+- 0x84, 0xfc, 0x1b, 0xb9, 0x32, 0xb6, 0xd9, 0xf0, 0x75, 0x53, 0x28, 0x7f,
+- 0xf2, 0x03, 0xf4, 0x3d, 0x43, 0x63, 0xe5, 0x25, 0xf8, 0x0f, 0x49, 0x29,
+- 0xa4, 0xe1, 0x9b, 0xd8, 0x83, 0xa2, 0xfc, 0x89, 0x34, 0x7c, 0x16, 0x7b,
+- 0xb3, 0xc2, 0x5b, 0x85, 0x74, 0xbf, 0xb6, 0x59, 0xdf, 0x97, 0x09, 0xc8,
+- 0x70, 0x21, 0x9d, 0xc6, 0x78, 0xd0, 0xd5, 0x6e, 0x2f, 0xda, 0x71, 0xdc,
+- 0xb7, 0x22, 0xb4, 0x23, 0x17, 0xca, 0x1f, 0x47, 0x7e, 0x33, 0xde, 0xff,
+- 0xa9, 0x9e, 0x4f, 0x1b, 0xea, 0x7c, 0x5a, 0xf9, 0x26, 0x17, 0x54, 0x1d,
+- 0xf6, 0x71, 0x19, 0xf9, 0x3b, 0x50, 0x07, 0x9b, 0x1c, 0x12, 0x68, 0xb9,
+- 0x3b, 0xf1, 0xfb, 0x36, 0xca, 0x3e, 0x84, 0xb2, 0x2f, 0xa3, 0xec, 0x76,
+- 0xe4, 0x5f, 0x5c, 0xd7, 0xef, 0x36, 0xe4, 0x1f, 0xc3, 0x7b, 0xac, 0xd3,
+- 0xfe, 0x06, 0xde, 0xdf, 0x81, 0xdf, 0x97, 0xd7, 0xd5, 0xf9, 0x37, 0xeb,
+- 0xf2, 0xc6, 0x2f, 0xf8, 0x63, 0x2d, 0x73, 0xc6, 0x27, 0x08, 0xf4, 0xe8,
+- 0x54, 0xb9, 0x35, 0x34, 0x7c, 0x3a, 0x16, 0xda, 0x73, 0x9a, 0x78, 0x23,
+- 0xa2, 0xfc, 0x80, 0x08, 0xfc, 0x80, 0xe9, 0x39, 0x3a, 0x88, 0x11, 0x94,
+- 0x11, 0xbb, 0xcb, 0x40, 0x93, 0xf4, 0x78, 0x57, 0xb0, 0x4f, 0x0a, 0xb5,
+- 0x2e, 0xe4, 0xb9, 0x7f, 0x20, 0x63, 0xb5, 0x16, 0xc8, 0x75, 0x4f, 0xba,
+- 0x0a, 0x19, 0x3b, 0x00, 0xdf, 0x64, 0x02, 0x36, 0x70, 0xa2, 0xd6, 0x25,
+- 0x0f, 0xd4, 0xae, 0x44, 0x02, 0x39, 0x32, 0x63, 0x3f, 0xbd, 0x6e, 0xec,
+- 0x18, 0xfd, 0x0a, 0xc8, 0xfd, 0xfc, 0xe8, 0xfe, 0x39, 0x8e, 0x6f, 0x75,
+- 0x47, 0xa4, 0x0d, 0x73, 0xa0, 0xff, 0x28, 0xbd, 0x11, 0xe9, 0x49, 0x4e,
+- 0x29, 0x07, 0xb5, 0x28, 0xe1, 0x4c, 0x0f, 0xec, 0x83, 0xca, 0xc3, 0x5f,
+- 0x84, 0xbe, 0xab, 0xad, 0xfa, 0x91, 0xc3, 0x2b, 0x7e, 0x64, 0x17, 0xfc,
+- 0xcc, 0x17, 0x23, 0xc1, 0xde, 0x6f, 0x85, 0x6e, 0xb8, 0x9e, 0x38, 0x47,
+- 0xe9, 0x77, 0xee, 0xf1, 0x9c, 0xd7, 0xae, 0xf3, 0x94, 0x65, 0xe8, 0x0b,
+- 0x2b, 0xaa, 0xf4, 0x95, 0x58, 0x78, 0x37, 0x40, 0xf9, 0x45, 0x7e, 0xa1,
+- 0x71, 0x7f, 0xff, 0x0e, 0xf6, 0x32, 0xdf, 0x1b, 0x39, 0xc3, 0x3f, 0x4a,
+- 0xc6, 0x18, 0xbf, 0xf8, 0x8b, 0x75, 0x6b, 0x3b, 0xb0, 0x6e, 0x6d, 0x91,
+- 0x15, 0xba, 0x72, 0x8d, 0x51, 0xac, 0x71, 0x69, 0x8e, 0xb4, 0xed, 0x87,
+- 0x7c, 0x8a, 0x1b, 0x11, 0xca, 0x31, 0xf5, 0x6a, 0x1b, 0x74, 0x35, 0x69,
+- 0x17, 0x11, 0xc6, 0x3c, 0x26, 0xb0, 0xa6, 0x09, 0xac, 0x69, 0xa2, 0x81,
+- 0x8e, 0x07, 0x56, 0xd6, 0x64, 0xe6, 0x8d, 0x7a, 0x6a, 0xbf, 0xf1, 0x99,
+- 0x3f, 0xe8, 0xa9, 0x36, 0x83, 0x69, 0x38, 0x97, 0xdc, 0xba, 0xb9, 0x90,
+- 0x16, 0x9c, 0xcb, 0xca, 0x3c, 0xe2, 0x8c, 0x1c, 0x1d, 0xac, 0x91, 0xaf,
+- 0x1c, 0x73, 0xaf, 0x4c, 0x96, 0x3f, 0xa0, 0xe7, 0xd1, 0x8a, 0x79, 0x8c,
+- 0x41, 0x6f, 0x70, 0x3c, 0xec, 0xff, 0xda, 0x38, 0x9e, 0xe3, 0xe4, 0xbf,
+- 0x9e, 0x8b, 0xa1, 0x05, 0xfd, 0xb6, 0x84, 0xc6, 0xe2, 0x86, 0x5e, 0xae,
+- 0xc2, 0x0e, 0x97, 0xca, 0xff, 0x6d, 0x6b, 0x30, 0xb7, 0xa4, 0x9e, 0x47,
+- 0x40, 0x63, 0x60, 0x78, 0x60, 0xa9, 0xbc, 0xd6, 0x07, 0x8d, 0x74, 0xbd,
+- 0xbb, 0x49, 0xeb, 0x2b, 0xc8, 0x40, 0x63, 0xf9, 0xa7, 0x9a, 0x56, 0xeb,
+- 0x32, 0x3f, 0xaf, 0xf3, 0x5b, 0x42, 0xc3, 0x27, 0x4d, 0xd9, 0xd5, 0xa6,
+- 0x77, 0xf6, 0xf7, 0xd5, 0x26, 0xa3, 0x3f, 0x2e, 0x95, 0x1b, 0xf7, 0xfb,
+- 0x21, 0x2b, 0xb0, 0x3b, 0x45, 0x29, 0x0d, 0x64, 0xa1, 0xe7, 0x68, 0x7f,
+- 0x86, 0xac, 0xc0, 0xf6, 0xb0, 0xce, 0x21, 0x85, 0x1d, 0x23, 0x99, 0x2a,
+- 0xe5, 0x1e, 0xb4, 0xac, 0x8d, 0xe6, 0x66, 0x7c, 0x7f, 0xca, 0x5b, 0x4e,
+- 0x84, 0x85, 0x7a, 0x99, 0xb8, 0x8d, 0xe5, 0xcf, 0xa0, 0x1c, 0x76, 0xbd,
+- 0x3e, 0x26, 0x6c, 0xb7, 0x31, 0x3e, 0x4b, 0x6a, 0x7c, 0x16, 0x00, 0xbb,
+- 0x9c, 0xc2, 0x53, 0x4f, 0x8d, 0xc2, 0xfe, 0xeb, 0xe7, 0xa7, 0xf1, 0x9c,
+- 0x6c, 0xc4, 0x80, 0xe8, 0xb7, 0x32, 0x9a, 0x9b, 0x53, 0x76, 0x00, 0xfb,
+- 0x81, 0xbc, 0x3a, 0x03, 0x5e, 0x85, 0x64, 0x5a, 0xd9, 0x04, 0xce, 0x83,
+- 0xed, 0x2a, 0xa3, 0xdd, 0x8b, 0x4c, 0xab, 0xa3, 0xee, 0x62, 0x58, 0x0e,
+- 0xc4, 0x83, 0xb6, 0xcc, 0x27, 0x17, 0x8d, 0xdd, 0x6e, 0x91, 0x68, 0x86,
+- 0xba, 0xcd, 0x49, 0x03, 0x87, 0x62, 0x3d, 0x47, 0x47, 0xa7, 0x5d, 0xda,
+- 0xcb, 0xff, 0x03, 0x79, 0x68, 0x91, 0x26, 0x25, 0x27, 0x4f, 0xea, 0xb1,
+- 0xce, 0x60, 0xac, 0xad, 0x98, 0x6b, 0x18, 0x3a, 0x32, 0x92, 0xc0, 0x38,
+- 0x87, 0x2d, 0x77, 0x1b, 0xc6, 0xa3, 0xd7, 0xd8, 0x25, 0x53, 0x75, 0xca,
+- 0xfa, 0xdf, 0x44, 0x56, 0x7d, 0xc5, 0x13, 0x68, 0x67, 0x7c, 0x14, 0x8e,
+- 0x57, 0x05, 0x46, 0x69, 0xc1, 0x3a, 0x1c, 0x3b, 0x17, 0x86, 0xed, 0x9b,
+- 0x33, 0x75, 0x38, 0xa7, 0xe3, 0xa3, 0xa9, 0xc5, 0x14, 0xfa, 0xea, 0xa2,
+- 0xec, 0x41, 0xe6, 0xc2, 0xf8, 0xb1, 0x6f, 0xb6, 0x83, 0x4e, 0x1e, 0x34,
+- 0x76, 0x7c, 0xb5, 0xbd, 0x69, 0xd7, 0xbd, 0x38, 0xa2, 0x65, 0xf7, 0xaf,
+- 0xfc, 0xec, 0x38, 0xdf, 0x37, 0xc6, 0x07, 0x4c, 0x3b, 0x53, 0x27, 0xac,
+- 0xf5, 0xf1, 0x7d, 0xd1, 0xd5, 0x79, 0x3e, 0x35, 0x1a, 0xf8, 0x31, 0x12,
+- 0xc9, 0xf7, 0x0d, 0x6a, 0xbe, 0x3d, 0x8d, 0x32, 0xb6, 0xc7, 0x5e, 0xa8,
+- 0x37, 0x62, 0xf0, 0xa0, 0xdf, 0x22, 0xb0, 0x47, 0xa9, 0xdc, 0x04, 0x5d,
+- 0x93, 0x6d, 0x0f, 0x62, 0x22, 0xef, 0x85, 0xbb, 0xc1, 0x53, 0xf4, 0x53,
+- 0x5a, 0x69, 0xab, 0xe2, 0x93, 0xa3, 0x2f, 0xa1, 0xff, 0x23, 0xe5, 0x60,
+- 0xaf, 0x05, 0x74, 0x20, 0x5e, 0x0a, 0xc9, 0x92, 0x9b, 0x84, 0x7f, 0x47,
+- 0x3b, 0x94, 0x94, 0x97, 0x5d, 0x83, 0x9f, 0x88, 0x9d, 0x50, 0xbf, 0xce,
+- 0xf9, 0x70, 0xdd, 0x27, 0xb0, 0x6e, 0x5f, 0x66, 0xbd, 0x40, 0x3e, 0xfa,
+- 0xb0, 0x37, 0xff, 0x53, 0xc4, 0x39, 0x4a, 0x3f, 0xe0, 0x6a, 0xa4, 0x71,
+- 0x5d, 0xc6, 0x9e, 0x3d, 0xa5, 0x63, 0x93, 0x27, 0x34, 0x2f, 0x2b, 0xe0,
+- 0xe5, 0xb6, 0xa4, 0x2d, 0xbd, 0x98, 0x3b, 0xea, 0xf4, 0xf7, 0x00, 0x8f,
+- 0xd3, 0xd7, 0x4b, 0x60, 0x3e, 0x36, 0x64, 0x7d, 0xab, 0xb6, 0xfb, 0x9f,
+- 0x89, 0x52, 0x5f, 0xb4, 0xab, 0xb8, 0xe7, 0x09, 0x25, 0x6b, 0x81, 0xec,
+- 0x85, 0xf5, 0x7b, 0xc3, 0xef, 0x30, 0xcd, 0xae, 0xac, 0xc6, 0xf9, 0x8c,
+- 0xae, 0x66, 0xfd, 0x39, 0xd4, 0x0f, 0x61, 0x4d, 0xbe, 0x3f, 0xa9, 0xe6,
+- 0x3b, 0x0f, 0x5e, 0x87, 0xa5, 0xb4, 0x22, 0x8f, 0xf3, 0x90, 0xc7, 0x26,
+- 0x91, 0x8e, 0x46, 0xb9, 0xa1, 0xac, 0xbc, 0x1e, 0x65, 0x4c, 0x2e, 0x69,
+- 0x19, 0xde, 0x45, 0x88, 0xdd, 0x90, 0x37, 0xbc, 0xe3, 0xf3, 0x46, 0x18,
+- 0x90, 0x71, 0x27, 0xdf, 0x5f, 0xf2, 0x18, 0x23, 0x6c, 0x96, 0xa2, 0x1d,
+- 0xe0, 0x97, 0x92, 0x47, 0x39, 0xcd, 0x25, 0x23, 0xe2, 0x24, 0x0e, 0xc8,
+- 0x9b, 0xe8, 0x3b, 0x9b, 0x8e, 0x4a, 0xe0, 0xa7, 0x4e, 0x80, 0x6e, 0xcb,
+- 0xb6, 0xef, 0xbf, 0x04, 0xbf, 0xba, 0x0a, 0xbf, 0x66, 0x09, 0x69, 0xa9,
+- 0x86, 0x3d, 0xd0, 0x12, 0xc1, 0x9e, 0x32, 0x7b, 0x25, 0x26, 0x15, 0xd4,
+- 0x59, 0xc0, 0xbb, 0xc7, 0x6b, 0x86, 0xcb, 0xbe, 0x6f, 0x61, 0x5d, 0xfb,
+- 0xdd, 0xbf, 0xf6, 0x0b, 0xf1, 0xc6, 0xba, 0x06, 0x77, 0x11, 0x33, 0x11,
+- 0xf3, 0x10, 0xab, 0xf0, 0x1d, 0xf1, 0xc7, 0x61, 0xcc, 0x85, 0x32, 0xdc,
+- 0x26, 0xb1, 0x8c, 0x93, 0x18, 0x11, 0xa3, 0x8b, 0x5f, 0x03, 0xff, 0x8b,
+- 0x7e, 0xb3, 0xdb, 0x25, 0xcf, 0x83, 0xd7, 0xcf, 0xd5, 0x0d, 0xef, 0x93,
+- 0xe0, 0xbd, 0x53, 0x2c, 0x8a, 0x2f, 0x17, 0x3d, 0x37, 0xf9, 0x39, 0xa4,
+- 0xdf, 0xf1, 0x7e, 0x85, 0xb4, 0x78, 0x0a, 0x26, 0x0f, 0x38, 0x1b, 0x7a,
+- 0x75, 0xd6, 0xe0, 0xc7, 0x36, 0xe2, 0x7d, 0x4d, 0xc7, 0xab, 0xe8, 0xd3,
+- 0xb1, 0x2d, 0x80, 0xa5, 0x3b, 0x51, 0x2f, 0x90, 0x6b, 0x53, 0x76, 0x18,
+- 0x75, 0x39, 0x07, 0xfa, 0x62, 0xdf, 0xc5, 0x5e, 0xf2, 0xfd, 0x7b, 0xbd,
+- 0xc9, 0x86, 0x3d, 0x31, 0x0f, 0x1e, 0x28, 0xd9, 0x1c, 0x68, 0x17, 0xc6,
+- 0xee, 0xa4, 0xbf, 0x43, 0xf9, 0x0a, 0x7c, 0x86, 0x8c, 0x0e, 0xd0, 0x26,
+- 0x24, 0x55, 0xdc, 0x8f, 0xb6, 0xe7, 0x39, 0xd0, 0xfe, 0xd3, 0x35, 0xf2,
+- 0xa1, 0x55, 0xe9, 0xfe, 0xe7, 0xcb, 0xb4, 0xef, 0x01, 0x46, 0x9b, 0x50,
+- 0xb1, 0x5c, 0xda, 0x84, 0x34, 0x78, 0x13, 0xc4, 0xf0, 0x1e, 0x50, 0x6d,
+- 0x59, 0x8f, 0x6d, 0x1b, 0xf9, 0xc7, 0x3a, 0x5b, 0x81, 0xaf, 0x28, 0x83,
+- 0x6d, 0xc0, 0x25, 0xed, 0x72, 0x20, 0xdd, 0x0c, 0xba, 0x77, 0x28, 0x3c,
+- 0x65, 0xb9, 0x1f, 0x86, 0xed, 0x02, 0xa6, 0xb3, 0x1d, 0x6f, 0xd5, 0xf7,
+- 0xb8, 0x1d, 0x65, 0x3f, 0x05, 0xfd, 0x59, 0xb6, 0x49, 0xc7, 0xaf, 0x1f,
+- 0xc6, 0xfe, 0xab, 0x6c, 0x0d, 0xe2, 0x22, 0xe4, 0x83, 0xd1, 0x03, 0xc6,
+- 0xfe, 0xd9, 0x1a, 0x47, 0x92, 0x37, 0x41, 0x0c, 0xc5, 0x52, 0x75, 0x89,
+- 0xe7, 0x1b, 0xfd, 0x16, 0xee, 0x3b, 0xdf, 0xbf, 0xe8, 0x29, 0x7b, 0x0a,
+- 0x1e, 0xec, 0x86, 0x0d, 0x8b, 0x68, 0x5a, 0xb7, 0x82, 0xd6, 0x81, 0x8d,
+- 0x4d, 0x76, 0x40, 0xef, 0xb8, 0x56, 0x53, 0x40, 0x3f, 0x62, 0x85, 0xbf,
+- 0x85, 0x1f, 0x4f, 0xff, 0x81, 0x38, 0x81, 0x73, 0x47, 0xbb, 0x05, 0xd6,
+- 0xa5, 0x2d, 0x7e, 0x0c, 0x63, 0x84, 0x25, 0xd9, 0xc9, 0xfc, 0x03, 0xba,
+- 0x0d, 0x9f, 0x7d, 0xe9, 0xdd, 0xd1, 0x28, 0xcf, 0x83, 0x98, 0x27, 0xd7,
+- 0x63, 0xe2, 0x7a, 0x5d, 0x4a, 0x07, 0xac, 0xca, 0x85, 0x99, 0x93, 0x19,
+- 0x97, 0x73, 0x4b, 0x48, 0x07, 0xe6, 0x76, 0x37, 0x74, 0xf4, 0x8e, 0x0e,
+- 0xf6, 0x69, 0xc6, 0x6e, 0x9c, 0x93, 0xc1, 0x2f, 0x81, 0xdd, 0x8d, 0xba,
+- 0xcd, 0xb2, 0xa3, 0x93, 0xb4, 0xeb, 0x52, 0xba, 0x7a, 0x95, 0x1f, 0xb4,
+- 0xbf, 0x1c, 0x7b, 0x7d, 0xf9, 0x1d, 0x0d, 0xf3, 0x6a, 0x3c, 0x03, 0x20,
+- 0x76, 0xd8, 0x89, 0x77, 0x9c, 0x13, 0x9c, 0xe4, 0xb8, 0x2f, 0x7b, 0x14,
+- 0xdd, 0x38, 0xb7, 0xc6, 0x79, 0x10, 0x43, 0x71, 0xce, 0x9c, 0xc3, 0x7a,
+- 0x6c, 0xc2, 0xf9, 0xfc, 0x57, 0xcd, 0xc3, 0x4d, 0x7a, 0x5d, 0x06, 0xcb,
+- 0xa4, 0xd0, 0xf6, 0x3f, 0x60, 0x0d, 0x7c, 0xe6, 0x3a, 0x8c, 0xcd, 0x4e,
+- 0x05, 0xfd, 0xb4, 0x98, 0x78, 0xb0, 0x89, 0x6b, 0x70, 0x5e, 0xdc, 0x33,
+- 0x86, 0x4e, 0x1d, 0x9a, 0x47, 0xbb, 0xd7, 0x8d, 0xeb, 0x78, 0x6b, 0xf5,
+- 0xc8, 0xed, 0x0d, 0xeb, 0xeb, 0x97, 0xe2, 0x02, 0xe5, 0xe2, 0x36, 0xa4,
+- 0x06, 0x13, 0x0c, 0x40, 0xf7, 0xbf, 0x2b, 0x26, 0xe0, 0x59, 0xd5, 0x78,
+- 0x01, 0x3e, 0x99, 0xd2, 0xfd, 0x6a, 0x2f, 0xc6, 0x90, 0x87, 0x3e, 0xa9,
+- 0xdf, 0x43, 0x19, 0x1b, 0x9f, 0xa8, 0x79, 0xe3, 0x93, 0xb5, 0x81, 0x71,
+- 0xe2, 0xa9, 0x40, 0xe6, 0x50, 0xbf, 0x26, 0x13, 0xf0, 0xb3, 0xc7, 0x73,
+- 0xaa, 0x9d, 0x8a, 0x31, 0x6c, 0xd0, 0x8f, 0x70, 0x3f, 0x4e, 0x04, 0x63,
+- 0xc5, 0xc6, 0xf3, 0xd0, 0x41, 0x0b, 0xb3, 0xb0, 0x4b, 0xae, 0x93, 0xa5,
+- 0x5c, 0xee, 0xf7, 0x9c, 0x11, 0x25, 0x7b, 0x71, 0x67, 0x8c, 0xbc, 0xac,
+- 0xce, 0xfe, 0xb2, 0x2c, 0xcc, 0xf9, 0x72, 0x17, 0x74, 0xe1, 0x43, 0x90,
+- 0x55, 0x39, 0x07, 0x45, 0x78, 0x0e, 0xca, 0xeb, 0x5c, 0x5c, 0xac, 0x53,
+- 0x5d, 0x12, 0x3d, 0x96, 0x90, 0xc8, 0x31, 0x62, 0xcb, 0x94, 0x7d, 0x97,
+- 0x08, 0xec, 0xd8, 0x8b, 0x1f, 0xb2, 0xc4, 0x19, 0xcc, 0x4a, 0x2a, 0xf9,
+- 0x38, 0x6c, 0x6f, 0x15, 0x69, 0x49, 0x52, 0xe9, 0xb3, 0xe8, 0x2b, 0x7a,
+- 0x0e, 0x75, 0xd1, 0x6e, 0xd3, 0x52, 0x12, 0xbf, 0x4e, 0x69, 0x59, 0x0a,
+- 0xf6, 0x4a, 0xcb, 0xd2, 0x5a, 0xff, 0x7c, 0x68, 0xc5, 0x3f, 0xe7, 0xfb,
+- 0xb7, 0x75, 0x5c, 0xe1, 0x8b, 0xfa, 0x8c, 0x81, 0x32, 0x42, 0x7b, 0xa4,
+- 0x7c, 0x63, 0xe8, 0xfd, 0x2f, 0xc2, 0xc7, 0x02, 0x0e, 0x2c, 0xc3, 0x97,
+- 0xca, 0xf8, 0xf2, 0xac, 0x57, 0xf4, 0x73, 0x03, 0xbe, 0xbc, 0xe6, 0xb9,
+- 0xc5, 0x82, 0x38, 0x6f, 0x53, 0xdf, 0xfd, 0x85, 0xf7, 0x4f, 0xe4, 0xfe,
+- 0x76, 0xe7, 0xfe, 0x6c, 0xa8, 0xe8, 0xb7, 0xc2, 0xb7, 0xba, 0x31, 0x73,
+- 0x58, 0xf6, 0x6f, 0x5f, 0x86, 0x0f, 0x9c, 0xbd, 0x11, 0x38, 0x2b, 0x51,
+- 0x50, 0xba, 0xea, 0x75, 0xe5, 0xb7, 0x7d, 0xa2, 0xe7, 0xb0, 0x6c, 0xd9,
+- 0xee, 0xd8, 0xd7, 0xc2, 0xc4, 0x40, 0x87, 0x25, 0x0f, 0xfd, 0x9f, 0x0f,
+- 0xbb, 0xf6, 0x5e, 0x71, 0x46, 0x1e, 0x11, 0x9e, 0x0d, 0xba, 0xd2, 0x7d,
+- 0xcc, 0x4d, 0x7c, 0x32, 0xd4, 0x7b, 0xf0, 0x93, 0xc0, 0xae, 0xdd, 0xe7,
+- 0x98, 0xf7, 0x25, 0xb6, 0xdd, 0xc6, 0x73, 0x5c, 0xba, 0x4f, 0x25, 0x25,
+- 0x05, 0xba, 0xf4, 0x29, 0x9a, 0xf0, 0x6c, 0x22, 0x21, 0xbd, 0xc7, 0x88,
+- 0x49, 0x14, 0x6d, 0xfa, 0x40, 0x9b, 0x34, 0x68, 0x03, 0x9f, 0x66, 0x9b,
+- 0x7d, 0x0d, 0xe9, 0x65, 0x49, 0x0d, 0x7e, 0x0f, 0xb4, 0xe9, 0x03, 0x6d,
+- 0x7a, 0xcf, 0x25, 0xd1, 0x1e, 0x7d, 0x2c, 0x75, 0x23, 0x6d, 0x91, 0x5f,
+- 0xbb, 0xbe, 0x13, 0xcf, 0xae, 0xa4, 0x8e, 0xc5, 0x30, 0x46, 0x48, 0xf6,
+- 0xf4, 0x14, 0x65, 0x78, 0x3b, 0x30, 0x74, 0xfc, 0xb0, 0x5c, 0x81, 0x1d,
+- 0x2a, 0xc3, 0x7f, 0x7b, 0x76, 0xd0, 0x19, 0x5b, 0x86, 0x2e, 0xad, 0xdf,
+- 0xed, 0xcb, 0x37, 0xb6, 0x7f, 0xd3, 0x4f, 0x5c, 0xef, 0xdc, 0x2f, 0xa1,
+- 0x01, 0x99, 0x2e, 0x2b, 0xfb, 0x90, 0xc8, 0x85, 0x15, 0xd6, 0xc1, 0x1a,
+- 0x8b, 0xb0, 0x31, 0x3c, 0xf3, 0x74, 0xa1, 0xeb, 0x1f, 0x91, 0x87, 0x2a,
+- 0x53, 0xf8, 0x01, 0x77, 0xcf, 0xb0, 0xee, 0x41, 0xe0, 0xed, 0x87, 0xe5,
+- 0xc0, 0x0c, 0xb0, 0x58, 0x06, 0xf3, 0x1e, 0x70, 0x81, 0xcb, 0x33, 0xcd,
+- 0xd2, 0x86, 0x32, 0xd0, 0x76, 0xac, 0xbe, 0x1e, 0xd7, 0x2e, 0x83, 0x0f,
+- 0x83, 0xf2, 0x27, 0xf5, 0x01, 0xf9, 0x4a, 0xbd, 0x5f, 0xbe, 0x04, 0xdb,
+- 0xf2, 0x5c, 0xbd, 0x0b, 0x7b, 0x25, 0x01, 0x9e, 0x64, 0xc0, 0x1f, 0x4f,
+- 0xbe, 0x5c, 0x4f, 0xcb, 0x17, 0x41, 0xab, 0xe7, 0xf1, 0x1b, 0x2e, 0xa7,
+- 0x65, 0x4f, 0xb9, 0x5f, 0xf3, 0x88, 0xfc, 0x71, 0x31, 0x1f, 0x17, 0x6b,
+- 0x77, 0x9e, 0x29, 0x62, 0xff, 0x2d, 0xd4, 0xdd, 0xb7, 0xaa, 0x34, 0xb2,
+- 0x6d, 0xb6, 0x9c, 0x59, 0xb1, 0x2f, 0x45, 0xdf, 0x76, 0x9d, 0xa3, 0x13,
+- 0xe0, 0x43, 0x15, 0xfb, 0x74, 0x4c, 0xd1, 0x7e, 0xd5, 0xf6, 0x54, 0x03,
+- 0xdb, 0x63, 0xd6, 0x37, 0x5b, 0x90, 0xef, 0x48, 0xee, 0xc4, 0xb4, 0xec,
+- 0x3f, 0xe9, 0xcb, 0x6f, 0x7a, 0x3e, 0xe4, 0x98, 0xba, 0x78, 0x80, 0x3a,
+- 0x3e, 0x39, 0x11, 0xb6, 0x94, 0x9f, 0x1b, 0x60, 0x8d, 0xef, 0x75, 0x60,
+- 0xcf, 0xa6, 0xb3, 0xd6, 0x94, 0xa4, 0x4e, 0x4c, 0x49, 0xf7, 0x09, 0xc8,
+- 0x82, 0xc7, 0xbe, 0x96, 0x6d, 0xeb, 0x1d, 0xf2, 0xc0, 0x71, 0x9c, 0xc1,
+- 0xbc, 0xb8, 0xf6, 0x5b, 0x92, 0xc6, 0xf8, 0x87, 0xa4, 0x07, 0x6d, 0x5c,
+- 0xb4, 0xb9, 0xa6, 0xc6, 0x6e, 0xc5, 0xd8, 0xcd, 0x72, 0x24, 0xee, 0x40,
+- 0xd6, 0x68, 0xc3, 0xff, 0xaf, 0xe4, 0xaa, 0x4c, 0x7f, 0x24, 0xb9, 0x33,
+- 0x6f, 0x37, 0x4b, 0x0b, 0x9f, 0xa1, 0x1a, 0xe6, 0x59, 0xde, 0x8d, 0x94,
+- 0xe5, 0xae, 0x58, 0xc7, 0x7f, 0x22, 0xb9, 0xf3, 0x1c, 0xfb, 0x2d, 0x94,
+- 0x7f, 0x43, 0x72, 0xc7, 0x7f, 0x8a, 0xfc, 0x15, 0xa4, 0x6f, 0x23, 0x1d,
+- 0x93, 0xee, 0xe3, 0xf0, 0x91, 0xcf, 0x7f, 0x1b, 0x79, 0xf8, 0x74, 0xe7,
+- 0x8f, 0xa0, 0xde, 0x6e, 0xcc, 0xef, 0xde, 0x18, 0xb0, 0x06, 0x74, 0x5e,
+- 0xec, 0xba, 0x60, 0xfe, 0x2c, 0x67, 0x19, 0xdf, 0x1d, 0x81, 0x4e, 0xfb,
+- 0x1f, 0xd0, 0x69, 0xfa, 0x79, 0x81, 0x79, 0xea, 0x36, 0x3e, 0x4f, 0x81,
+- 0x26, 0x87, 0x90, 0xf7, 0xe5, 0x61, 0x8f, 0xf6, 0x66, 0xa7, 0x8c, 0xdb,
+- 0x45, 0xbf, 0x05, 0xb8, 0xa2, 0x15, 0xfb, 0x60, 0x6a, 0xc7, 0xc6, 0xfb,
+- 0xe0, 0x68, 0xef, 0x61, 0xd9, 0xb4, 0xdd, 0xac, 0xdf, 0xac, 0xd7, 0xb5,
+- 0x7f, 0xa8, 0xe8, 0xe0, 0x14, 0x3f, 0x29, 0x5c, 0x87, 0x9b, 0x78, 0xd2,
+- 0xea, 0xbd, 0xff, 0x21, 0xec, 0x03, 0xeb, 0x3c, 0xf3, 0xc1, 0x3e, 0xb0,
+- 0xce, 0x43, 0x37, 0xcc, 0xc3, 0x47, 0x9b, 0xef, 0x92, 0xe6, 0xe3, 0xab,
+- 0xfb, 0xa0, 0xe9, 0xf8, 0xcf, 0xdf, 0x07, 0xcd, 0xe7, 0x51, 0xef, 0x3c,
+- 0x69, 0x86, 0x3e, 0xce, 0x90, 0x66, 0x9d, 0x48, 0x1f, 0xc1, 0x5a, 0x39,
+- 0xf7, 0x66, 0xcc, 0x3d, 0xc0, 0x45, 0x1f, 0x82, 0xbc, 0x7f, 0x62, 0xfb,
+- 0x21, 0x5d, 0xfe, 0x9f, 0xfd, 0x91, 0xb8, 0x53, 0x91, 0x10, 0x69, 0x8a,
+- 0xba, 0x55, 0xd2, 0xf0, 0x79, 0xd0, 0xe6, 0xa0, 0x74, 0x93, 0x7e, 0xd5,
+- 0xbd, 0xc8, 0x17, 0xfd, 0x28, 0x7d, 0x74, 0x45, 0x4f, 0xe0, 0xa4, 0x01,
+- 0x96, 0xbf, 0x0a, 0x99, 0x21, 0xc6, 0x7c, 0x5d, 0xf6, 0xcf, 0xf8, 0x32,
+- 0xee, 0x71, 0xfd, 0x6f, 0x62, 0xfd, 0xd9, 0xed, 0x71, 0x59, 0x4e, 0xc6,
+- 0x41, 0x93, 0x05, 0xe8, 0xf6, 0x2b, 0x12, 0xd0, 0x81, 0x31, 0xe7, 0x3d,
+- 0xe2, 0x26, 0x86, 0xc5, 0x4d, 0x7f, 0x0f, 0x74, 0x18, 0x86, 0xec, 0xe7,
+- 0xeb, 0x94, 0x9d, 0x57, 0x64, 0x08, 0x32, 0xf1, 0x86, 0xe7, 0xa4, 0x81,
+- 0x85, 0xa0, 0x2f, 0x28, 0x17, 0x94, 0x89, 0x36, 0xa5, 0x93, 0xe6, 0x3d,
+- 0xe7, 0xa9, 0xaa, 0xdc, 0x2a, 0xf3, 0x0a, 0x9b, 0xe2, 0xdd, 0x71, 0x65,
+- 0x2f, 0xd2, 0x13, 0x56, 0x0f, 0x74, 0x74, 0x5a, 0xec, 0xde, 0x9b, 0x9b,
+- 0xcd, 0x3d, 0x85, 0xc2, 0x89, 0x90, 0x4c, 0xf5, 0x92, 0x57, 0xec, 0x17,
+- 0xf9, 0x6a, 0xd1, 0x8f, 0xb8, 0x6f, 0xf9, 0xa7, 0x3b, 0x93, 0xf2, 0xe9,
+- 0xde, 0x15, 0xb9, 0xac, 0x88, 0x04, 0xfb, 0x62, 0x48, 0xf1, 0xc3, 0xcc,
+- 0xdb, 0xac, 0xc5, 0xbc, 0xeb, 0x6f, 0x78, 0xc7, 0xb5, 0x50, 0xd6, 0x57,
+- 0xf6, 0x4e, 0xf2, 0x9d, 0x73, 0xfd, 0x5d, 0xd0, 0xcc, 0x79, 0xaa, 0x24,
+- 0xaf, 0x41, 0xf6, 0x40, 0xc3, 0xf3, 0x4c, 0x49, 0xc3, 0x29, 0xc8, 0xfd,
+- 0xab, 0xb2, 0xe7, 0x04, 0xf7, 0xcc, 0xab, 0x58, 0xab, 0xd2, 0x25, 0xd0,
+- 0x11, 0xec, 0xcf, 0x97, 0x69, 0x8f, 0xb1, 0x92, 0x5b, 0x13, 0x93, 0xf0,
+- 0xe1, 0x26, 0x6c, 0x5f, 0x96, 0xbc, 0xa2, 0x2c, 0x0d, 0xa2, 0x4d, 0xf5,
+- 0x11, 0xfc, 0xda, 0xf4, 0xda, 0x3e, 0x0b, 0xba, 0x3b, 0xc9, 0x8a, 0xf5,
+- 0x19, 0xd0, 0xfd, 0x61, 0x49, 0x1d, 0x5f, 0xd1, 0x35, 0x90, 0xbb, 0x40,
+- 0xd7, 0xa4, 0xce, 0xdb, 0x52, 0x2d, 0xbb, 0xf2, 0x71, 0xea, 0x90, 0x32,
+- 0xd7, 0x05, 0x1d, 0xc3, 0xf3, 0xdb, 0x32, 0xf4, 0x4c, 0x19, 0x3a, 0x05,
+- 0x3a, 0xe4, 0x4b, 0x28, 0xff, 0x22, 0xea, 0x3c, 0x0f, 0x9f, 0xe7, 0x39,
+- 0x60, 0xbf, 0x8b, 0xc0, 0x14, 0x17, 0xca, 0x59, 0xed, 0x1b, 0xaa, 0xf5,
+- 0xc2, 0x66, 0x29, 0x7f, 0x45, 0xaa, 0x15, 0xd2, 0xe3, 0x27, 0x8a, 0xb7,
+- 0x39, 0x6f, 0x2b, 0x71, 0x16, 0x66, 0x26, 0x52, 0xa9, 0x18, 0x9a, 0x50,
+- 0xf7, 0x31, 0xf6, 0x6f, 0x74, 0x65, 0xeb, 0x3a, 0x5d, 0x29, 0xf2, 0x62,
+- 0x2d, 0xc0, 0x93, 0xc4, 0xc7, 0xa5, 0x99, 0xe4, 0xca, 0x19, 0x59, 0x09,
+- 0x76, 0xf3, 0x32, 0xfc, 0x92, 0x58, 0xe6, 0x5b, 0x12, 0x3b, 0xe5, 0xfb,
+- 0xdf, 0x87, 0xdd, 0x2c, 0x82, 0x27, 0x56, 0x08, 0xe5, 0x8b, 0x7c, 0x47,
+- 0xb9, 0xa7, 0x6c, 0x87, 0x18, 0x2b, 0x97, 0x97, 0x51, 0x56, 0x55, 0x3e,
+- 0xd3, 0xb7, 0x31, 0x1f, 0x3d, 0x3f, 0x55, 0xc6, 0x7a, 0xcd, 0x92, 0x1f,
+- 0x4f, 0xcb, 0xe3, 0xe5, 0x6d, 0x76, 0x33, 0xda, 0x57, 0x16, 0xd9, 0xc6,
+- 0x19, 0xe4, 0x95, 0x9d, 0x97, 0x17, 0x59, 0xde, 0x25, 0x57, 0x66, 0x32,
+- 0x6a, 0x0e, 0xd5, 0xb9, 0x8c, 0x04, 0x31, 0x49, 0xea, 0x2b, 0xce, 0x15,
+- 0x79, 0xfa, 0x96, 0x65, 0xda, 0xd9, 0x88, 0x14, 0x13, 0xa4, 0x75, 0x42,
+- 0x2e, 0xcf, 0xc4, 0x37, 0x31, 0x86, 0x93, 0x73, 0xf9, 0x6c, 0x62, 0x07,
+- 0xf6, 0xfb, 0x88, 0x1d, 0x30, 0x5e, 0x10, 0x81, 0x2d, 0x53, 0x31, 0x04,
+- 0xa4, 0xc9, 0x06, 0x9f, 0x95, 0xef, 0x03, 0x6c, 0xb4, 0x8a, 0x1f, 0x89,
+- 0x27, 0xb9, 0x5e, 0xa7, 0xb8, 0x0c, 0xfd, 0xd1, 0x91, 0x79, 0x49, 0xee,
+- 0x99, 0x0f, 0xd6, 0x67, 0x9d, 0x11, 0xde, 0xd3, 0x90, 0x6b, 0x73, 0x8e,
+- 0x77, 0x15, 0x98, 0x22, 0x1f, 0xf7, 0xc0, 0xaf, 0x3f, 0x8b, 0x41, 0x7f,
+- 0x0d, 0x66, 0xad, 0x3d, 0x9b, 0x02, 0x7c, 0x16, 0x91, 0xa9, 0x19, 0x9e,
+- 0xa9, 0x41, 0xb7, 0x01, 0x43, 0xfe, 0xf3, 0x08, 0x9e, 0x6b, 0xcc, 0xc3,
+- 0x4f, 0x0b, 0x7c, 0x50, 0x3c, 0x07, 0xfd, 0x91, 0xe6, 0xd6, 0x3c, 0xd7,
+- 0x1e, 0x92, 0x7b, 0x80, 0x4e, 0x04, 0xfd, 0x77, 0xeb, 0xb1, 0xba, 0xcf,
+- 0xa4, 0x19, 0xc3, 0x93, 0x14, 0xf4, 0x45, 0x6e, 0x2e, 0x82, 0xb1, 0xba,
+- 0x34, 0x36, 0xe7, 0xbb, 0xf5, 0xd8, 0xd3, 0xf8, 0x78, 0x69, 0x79, 0xa2,
+- 0x6c, 0xb0, 0x5e, 0x1a, 0x36, 0x56, 0x22, 0x23, 0x7d, 0xbe, 0x7c, 0xdf,
+- 0x23, 0xbd, 0xfa, 0x91, 0xf7, 0xe4, 0x68, 0xfd, 0xdd, 0xce, 0xce, 0x1a,
+- 0xff, 0x5a, 0x31, 0x47, 0xfe, 0x30, 0x3f, 0xe0, 0x23, 0xce, 0xdd, 0x82,
+- 0x3d, 0x2f, 0x01, 0x77, 0x59, 0xe7, 0xba, 0xd4, 0x3b, 0x0b, 0xd8, 0xa0,
+- 0x3a, 0x03, 0xdd, 0x78, 0x8e, 0xe7, 0x89, 0xd0, 0x6d, 0xe7, 0xa2, 0x52,
+- 0x9a, 0xa5, 0x5c, 0x4a, 0x87, 0x05, 0x7e, 0xb1, 0x7e, 0x75, 0xa6, 0x0b,
+- 0x69, 0x2b, 0xd2, 0xa4, 0xea, 0xa7, 0x3a, 0xe3, 0xaa, 0xf6, 0xd5, 0x99,
+- 0xb4, 0x6a, 0x57, 0x9d, 0xe9, 0x47, 0xea, 0x49, 0xd3, 0x39, 0x38, 0x4e,
+- 0xe7, 0x7a, 0x65, 0xea, 0x34, 0xec, 0xcb, 0x80, 0xa5, 0xce, 0xe2, 0x27,
+- 0x60, 0x7f, 0x22, 0xf0, 0xb2, 0xae, 0xda, 0x83, 0xc0, 0x58, 0x3b, 0x81,
+- 0x41, 0x76, 0x8a, 0x7b, 0x8a, 0xeb, 0xa7, 0xee, 0xbd, 0xcc, 0x78, 0x52,
+- 0xe2, 0x41, 0xc9, 0xca, 0x81, 0xd9, 0x66, 0xec, 0xd7, 0x88, 0x5d, 0x92,
+- 0x1e, 0x7b, 0x18, 0xf9, 0x42, 0x85, 0x74, 0xbb, 0x4f, 0xf9, 0x6e, 0x39,
+- 0xef, 0x1c, 0x78, 0x92, 0xc1, 0x18, 0xef, 0xa7, 0x7d, 0x1f, 0xe4, 0xcf,
+- 0xd5, 0x7d, 0x64, 0x30, 0x9f, 0x46, 0x7a, 0xf0, 0x1c, 0x31, 0xfb, 0x73,
+- 0xce, 0x11, 0x29, 0xd7, 0xa4, 0xef, 0x7d, 0x72, 0xd9, 0xcd, 0xc8, 0xcb,
+- 0x6e, 0x5a, 0xae, 0xb8, 0x3b, 0xe4, 0xeb, 0xb0, 0xd3, 0x2f, 0xb9, 0x7d,
+- 0x9b, 0x88, 0x05, 0xaa, 0xea, 0x6c, 0xc6, 0xf0, 0xca, 0xd5, 0xf1, 0xc4,
+- 0x1f, 0xc8, 0xd2, 0x0c, 0xb1, 0xb3, 0xbf, 0x7b, 0xbf, 0x57, 0xa4, 0xdd,
+- 0xc2, 0x1c, 0x88, 0xd5, 0x8a, 0xb0, 0x7f, 0x87, 0x65, 0xd8, 0xa3, 0xdd,
+- 0x53, 0x36, 0x2a, 0x31, 0x1c, 0xec, 0x67, 0xaf, 0x00, 0xbd, 0x7a, 0x79,
+- 0x16, 0xfb, 0x49, 0x28, 0xff, 0x78, 0xae, 0x90, 0xef, 0xae, 0x3c, 0x59,
+- 0xe6, 0x3a, 0x4b, 0xd7, 0xb5, 0x48, 0x58, 0x46, 0x14, 0x5e, 0x68, 0x93,
+- 0x17, 0x17, 0x37, 0x8b, 0x05, 0x0b, 0x65, 0xdd, 0x12, 0x55, 0xb7, 0x18,
+- 0xe8, 0x7f, 0x4b, 0x3b, 0xef, 0x22, 0xbd, 0x05, 0xda, 0x30, 0x16, 0x80,
+- 0xb5, 0xb5, 0x73, 0x25, 0x26, 0xdf, 0x8f, 0xfd, 0xf5, 0x96, 0xda, 0x6b,
+- 0x79, 0x37, 0x8e, 0x67, 0xa6, 0xdc, 0x73, 0x8c, 0x3b, 0x85, 0x75, 0xfc,
+- 0xf7, 0xaf, 0xd4, 0xfb, 0x66, 0x77, 0x17, 0x70, 0x1d, 0xe5, 0x15, 0xe9,
+- 0x52, 0x30, 0x6e, 0x1e, 0x38, 0xae, 0xd0, 0xcf, 0x3b, 0x14, 0x4e, 0xba,
+- 0x88, 0xbd, 0x30, 0xa1, 0xea, 0xef, 0xc4, 0x7e, 0xda, 0xd4, 0x42, 0xfc,
+- 0xb0, 0x07, 0xb2, 0xf8, 0xd2, 0x0c, 0x9f, 0xf9, 0x9e, 0xfe, 0x15, 0xe3,
+- 0x6b, 0x17, 0x46, 0xa7, 0xdd, 0xdf, 0xd2, 0xfb, 0x47, 0x42, 0x77, 0xf5,
+- 0x01, 0x87, 0x1e, 0x6b, 0xc2, 0x5a, 0x9c, 0x64, 0x32, 0x64, 0x75, 0x5a,
+- 0xc0, 0xf1, 0xc3, 0xca, 0xe6, 0xf6, 0x61, 0xfe, 0x69, 0x39, 0x93, 0x6e,
+- 0x93, 0xaa, 0xed, 0xaa, 0x3b, 0x57, 0xcb, 0xf6, 0x76, 0x62, 0x7d, 0xfc,
+- 0x36, 0xa1, 0xac, 0x07, 0x69, 0x33, 0xd2, 0xdb, 0xa4, 0x74, 0xb2, 0xaf,
+- 0x25, 0xe8, 0x2f, 0xba, 0x2e, 0xff, 0x75, 0x3d, 0xce, 0x5f, 0x6a, 0x7f,
+- 0x8a, 0xe3, 0x44, 0xc5, 0xfd, 0x7c, 0xab, 0xf4, 0x1c, 0xb3, 0x81, 0x6d,
+- 0x13, 0xc0, 0xba, 0x5d, 0x92, 0x3e, 0x96, 0x94, 0x5b, 0x8e, 0x99, 0x38,
+- 0xd1, 0x97, 0x47, 0x53, 0x2a, 0x66, 0xf8, 0xa5, 0x51, 0xb7, 0xa2, 0xce,
+- 0x53, 0xf5, 0xdd, 0xb0, 0x65, 0x7d, 0x67, 0xec, 0x1b, 0xa3, 0x7d, 0x2a,
+- 0xfd, 0xf6, 0x68, 0x5a, 0xa5, 0xaf, 0x8c, 0xde, 0x52, 0x0b, 0xfc, 0xa3,
+- 0xd2, 0x42, 0x5a, 0x3e, 0x57, 0x26, 0xbe, 0x1c, 0x00, 0x76, 0xf4, 0xa0,
+- 0x67, 0xfa, 0xa1, 0x67, 0xd2, 0xd0, 0x33, 0x83, 0xd4, 0x33, 0xd0, 0xdb,
+- 0xaf, 0x40, 0x6f, 0x7b, 0xf2, 0x06, 0xe4, 0xf5, 0x82, 0xd7, 0x0c, 0x5c,
+- 0xe8, 0xfb, 0xc1, 0x5a, 0x9d, 0xa7, 0x96, 0xc1, 0xdf, 0xea, 0x59, 0x89,
+- 0xb5, 0x43, 0x07, 0x6d, 0x9f, 0x6f, 0x92, 0x85, 0xb8, 0xef, 0x9f, 0xf0,
+- 0x5c, 0xb9, 0x86, 0xfa, 0x39, 0x97, 0xfb, 0x78, 0xa2, 0x85, 0xfe, 0xd8,
+- 0xb5, 0x99, 0x1d, 0xd0, 0x49, 0x94, 0xf7, 0x98, 0x54, 0xc7, 0x13, 0xb2,
+- 0x08, 0xff, 0x6c, 0xb5, 0x4e, 0x1a, 0xcf, 0xdc, 0xff, 0xff, 0x12, 0x75,
+- 0xd3, 0xb0, 0x0f, 0xb6, 0x2c, 0xf5, 0x25, 0xe5, 0x4c, 0x9f, 0x33, 0x98,
+- 0xb4, 0xa8, 0xbb, 0x92, 0x52, 0x81, 0xaf, 0x5f, 0x2d, 0xb3, 0x3e, 0xeb,
+- 0x61, 0x7f, 0x96, 0x83, 0x76, 0xd3, 0x65, 0xa3, 0x27, 0x20, 0x9f, 0x73,
+- 0x8c, 0x03, 0x06, 0x36, 0xc0, 0xb2, 0x9a, 0x21, 0x07, 0x1e, 0xe8, 0x3f,
+- 0x8e, 0xf2, 0x01, 0xde, 0x25, 0x40, 0x19, 0xb1, 0x50, 0x49, 0xf1, 0x38,
+- 0xef, 0x8d, 0xa3, 0x8c, 0x6d, 0x9c, 0x44, 0x0a, 0xe5, 0x63, 0x92, 0x4a,
+- 0x14, 0xd4, 0xbd, 0xa6, 0x4e, 0x94, 0xb1, 0x8f, 0xb0, 0x8e, 0xc7, 0xcc,
+- 0xb6, 0x50, 0x8e, 0xc2, 0xae, 0x29, 0xdf, 0xa6, 0x62, 0x03, 0x59, 0xdb,
+- 0xc3, 0x7e, 0x60, 0x59, 0xca, 0x66, 0xbb, 0xbc, 0xe7, 0x29, 0x5d, 0x78,
+- 0xaf, 0x3e, 0xb7, 0xb8, 0xa7, 0xd6, 0x2a, 0xf9, 0x5a, 0xd3, 0x7b, 0xe8,
+- 0x7f, 0xb3, 0x27, 0x2f, 0x27, 0x6c, 0xe1, 0x19, 0x7b, 0xb0, 0xcf, 0x23,
+- 0x3b, 0xb8, 0x27, 0x40, 0x77, 0xd8, 0xdf, 0xe7, 0xb1, 0xde, 0xe7, 0x60,
+- 0x7f, 0x2f, 0xc2, 0xfe, 0x5e, 0x28, 0xaf, 0xea, 0x8f, 0xc0, 0xee, 0x52,
+- 0x07, 0x3c, 0x03, 0x9e, 0x8d, 0x01, 0xf7, 0xef, 0x85, 0x3f, 0x30, 0x02,
+- 0xec, 0x3f, 0x04, 0xfe, 0x65, 0xc0, 0xbb, 0x71, 0xde, 0x45, 0x01, 0x1f,
+- 0x07, 0xd5, 0x59, 0xe6, 0xac, 0x3a, 0xcf, 0xff, 0x81, 0xb2, 0xbd, 0x8f,
+- 0x97, 0x2d, 0xd8, 0x87, 0xa2, 0x7f, 0x9d, 0xeb, 0x00, 0xff, 0xad, 0xec,
+- 0xe7, 0xc1, 0x17, 0xa1, 0x57, 0x7e, 0x8c, 0x79, 0x3d, 0x37, 0x4b, 0x7b,
+- 0x8e, 0x3a, 0x01, 0xde, 0xf6, 0x18, 0xeb, 0xc2, 0x7e, 0x3e, 0x7a, 0x59,
+- 0x96, 0x81, 0x3b, 0xb2, 0x94, 0x63, 0xf8, 0x0f, 0xce, 0x85, 0x8a, 0xf4,
+- 0x52, 0x07, 0x02, 0x13, 0x0d, 0xca, 0xc0, 0xf1, 0x04, 0xb0, 0x1e, 0x90,
+- 0xbc, 0x3a, 0xaf, 0xc3, 0xf3, 0xf9, 0x2d, 0x62, 0x11, 0xef, 0x79, 0x3c,
+- 0x9b, 0xa1, 0xde, 0x30, 0x18, 0x69, 0x79, 0xb0, 0x43, 0xb2, 0xdb, 0x3b,
+- 0x94, 0xee, 0x70, 0xbc, 0x97, 0x31, 0xee, 0x1e, 0xb8, 0x20, 0x6f, 0x00,
+- 0x21, 0x58, 0x99, 0x43, 0xf2, 0xbf, 0x3c, 0xc6, 0xa8, 0x02, 0xdf, 0x0f,
+- 0x73, 0x89, 0x81, 0x66, 0x9b, 0xf6, 0xbb, 0x76, 0x6c, 0x4f, 0x9d, 0xfd,
+- 0xc7, 0x14, 0xc6, 0xca, 0x0b, 0xfb, 0x87, 0x9d, 0xc0, 0x98, 0xa9, 0xe3,
+- 0x94, 0xfd, 0x6d, 0xe0, 0xdb, 0x3f, 0x05, 0x06, 0x22, 0x55, 0x87, 0x36,
+- 0x07, 0xfb, 0x85, 0xf3, 0x5f, 0x26, 0x9e, 0x60, 0x4c, 0x3d, 0xf0, 0xcb,
+- 0x57, 0xe6, 0xb6, 0x13, 0xf6, 0xeb, 0xb6, 0xcd, 0x94, 0x81, 0x71, 0x0f,
+- 0x7e, 0xdf, 0xf1, 0xc0, 0x5e, 0x77, 0x9f, 0x47, 0xab, 0x13, 0xd2, 0xc9,
+- 0xd3, 0x4e, 0x4b, 0x6e, 0x91, 0x8f, 0x44, 0x82, 0x7e, 0xac, 0x79, 0x1b,
+- 0xb2, 0x4a, 0x3d, 0xd0, 0x09, 0x39, 0x67, 0x9e, 0x3a, 0x85, 0x3a, 0x81,
+- 0xb2, 0xe0, 0x4a, 0xa9, 0x0e, 0x9d, 0xd0, 0xd6, 0x25, 0x15, 0xd2, 0x6c,
+- 0x9e, 0x7a, 0xe2, 0x07, 0x32, 0xbd, 0x4e, 0x57, 0x0e, 0x89, 0xf1, 0x6b,
+- 0x5b, 0x25, 0x9a, 0x71, 0xed, 0x7b, 0xd5, 0x1a, 0x03, 0x7d, 0x79, 0x80,
+- 0xf8, 0x73, 0x36, 0xeb, 0x74, 0x88, 0xc6, 0x9e, 0x0a, 0x3f, 0xbd, 0x89,
+- 0xb5, 0xb2, 0x0f, 0x45, 0xa7, 0xc1, 0xa1, 0xc0, 0x17, 0x50, 0x31, 0x3f,
+- 0xe0, 0xe0, 0xc4, 0x8f, 0xa1, 0x6b, 0xf3, 0xc4, 0x25, 0xa0, 0x73, 0xf7,
+- 0x09, 0xca, 0xd1, 0x75, 0xea, 0x6c, 0xbc, 0x62, 0xa5, 0xa9, 0xaf, 0x65,
+- 0xf1, 0x38, 0x30, 0x97, 0xb5, 0x4b, 0x0a, 0x94, 0x57, 0x9e, 0x7d, 0x2f,
+- 0x5a, 0x32, 0x3d, 0xd7, 0x26, 0x3d, 0xf3, 0x8c, 0xaf, 0xee, 0x6e, 0x91,
+- 0x36, 0xc6, 0x58, 0x69, 0x83, 0x06, 0x24, 0x8f, 0xf2, 0xee, 0xf9, 0xb0,
+- 0x8a, 0x87, 0x55, 0x2c, 0xd2, 0xa8, 0x1f, 0xfa, 0xc0, 0x49, 0x2f, 0x5b,
+- 0xff, 0x25, 0x16, 0x60, 0x48, 0xc8, 0x52, 0x19, 0x32, 0x56, 0x86, 0x8c,
+- 0x95, 0x21, 0x63, 0x65, 0xc8, 0x18, 0xb0, 0xdf, 0x73, 0xd8, 0x7f, 0x17,
+- 0xcb, 0x83, 0xda, 0xae, 0xdf, 0xaf, 0xec, 0xfa, 0x91, 0x32, 0xcf, 0xf0,
+- 0xe9, 0x83, 0x26, 0x95, 0x0e, 0xb9, 0xa4, 0x7c, 0x51, 0xe3, 0xa3, 0xbe,
+- 0x22, 0xcf, 0xcc, 0xbe, 0x2a, 0x67, 0x66, 0x57, 0x71, 0xe0, 0x54, 0xd9,
+- 0x97, 0x97, 0x3d, 0xf8, 0x9f, 0x0b, 0xc4, 0x54, 0xd9, 0xf6, 0x66, 0x85,
+- 0xad, 0x0e, 0x4b, 0x41, 0xe1, 0x64, 0x65, 0x47, 0x80, 0xaf, 0x14, 0x2e,
+- 0xe4, 0xde, 0x94, 0x8e, 0xed, 0xaf, 0xc9, 0x45, 0xd8, 0xf1, 0xc5, 0xfa,
+- 0xeb, 0xf2, 0xbc, 0xc2, 0xe3, 0xa4, 0xc3, 0x07, 0xe4, 0x47, 0x76, 0x70,
+- 0x4e, 0x7c, 0x06, 0x58, 0x63, 0xb1, 0x8f, 0xba, 0x23, 0x02, 0x5b, 0xe0,
+- 0x14, 0xbb, 0xb1, 0xaf, 0x0f, 0x5a, 0x37, 0x00, 0xd3, 0xf0, 0xfd, 0x16,
+- 0x79, 0x71, 0xb6, 0xd8, 0x20, 0x13, 0xd4, 0x0f, 0xce, 0x51, 0xb1, 0x68,
+- 0xa7, 0x68, 0x37, 0xb9, 0x5e, 0xda, 0xa9, 0x3f, 0xd8, 0xcc, 0xb3, 0xd4,
+- 0xea, 0xc9, 0x73, 0x2d, 0x8c, 0x37, 0xc6, 0x5d, 0xd2, 0xf4, 0x35, 0x39,
+- 0x58, 0x63, 0xd9, 0xab, 0xe0, 0x0f, 0xd3, 0xef, 0xf9, 0xf7, 0xc4, 0x39,
+- 0x1e, 0xfb, 0x05, 0x6e, 0xea, 0xc4, 0x5a, 0xcb, 0x7f, 0xa9, 0x63, 0x5e,
+- 0xfd, 0x0a, 0x47, 0xbf, 0x13, 0x2f, 0x9b, 0x7b, 0x0d, 0xaf, 0xa9, 0x78,
+- 0xe0, 0x06, 0x71, 0xe2, 0xa7, 0xb0, 0xaf, 0x8a, 0x57, 0x85, 0x31, 0x4b,
+- 0xc6, 0x73, 0x19, 0x2b, 0x6e, 0xd4, 0x18, 0xea, 0xbc, 0x54, 0xee, 0x86,
+- 0x7e, 0xb9, 0x07, 0xfa, 0xe5, 0xde, 0x77, 0xdc, 0xaf, 0x35, 0x71, 0xfb,
+- 0x9e, 0x62, 0xd8, 0xea, 0x92, 0xb1, 0x5a, 0x63, 0x5b, 0xc6, 0x71, 0x37,
+- 0x8a, 0xdb, 0x32, 0xa6, 0x9b, 0x5e, 0x17, 0x0b, 0xa4, 0x6c, 0xf8, 0xf2,
+- 0x92, 0xc7, 0xb8, 0x9b, 0xb9, 0x9b, 0xbd, 0x11, 0xfe, 0xfa, 0xc3, 0xcd,
+- 0x26, 0xe6, 0x1c, 0xc9, 0x5c, 0x15, 0xde, 0xd1, 0x2e, 0xcd, 0x10, 0x0f,
+- 0xa8, 0xb3, 0x40, 0x15, 0xbb, 0xce, 0x07, 0xf1, 0x03, 0x94, 0xc3, 0xea,
+- 0xc2, 0xdf, 0x61, 0xec, 0xda, 0xde, 0xe1, 0xd8, 0x63, 0xe1, 0xe0, 0xae,
+- 0x1f, 0xf7, 0x72, 0xa0, 0xcb, 0x20, 0x8b, 0xf5, 0xd5, 0x3b, 0x74, 0x43,
+- 0x4a, 0x5f, 0x5c, 0xc5, 0x1e, 0x20, 0xbf, 0xe0, 0x2f, 0x60, 0x9f, 0x4c,
+- 0x41, 0x3f, 0x15, 0x54, 0x7f, 0x31, 0xca, 0x45, 0x36, 0x17, 0xb6, 0x24,
+- 0x7a, 0x8a, 0xbe, 0x50, 0x10, 0x6b, 0xc9, 0x87, 0x1d, 0xa5, 0xbf, 0x31,
+- 0x77, 0xe0, 0x33, 0xee, 0xcf, 0xe4, 0x44, 0x73, 0xa6, 0x09, 0x76, 0x15,
+- 0xfc, 0xab, 0x33, 0x26, 0x80, 0xbd, 0xbb, 0xf4, 0x5d, 0x39, 0x30, 0x77,
+- 0x69, 0x73, 0x20, 0xff, 0x8c, 0x23, 0x73, 0x7d, 0x66, 0x0e, 0x6b, 0xfb,
+- 0xb6, 0x4e, 0x49, 0xac, 0x05, 0x36, 0xed, 0xa3, 0xa7, 0x88, 0x07, 0x9a,
+- 0x65, 0x39, 0xce, 0x7e, 0x83, 0x3d, 0x33, 0x5d, 0x66, 0xdf, 0xdf, 0x95,
+- 0xe1, 0xb9, 0x74, 0x2b, 0xf5, 0xc8, 0x12, 0xf4, 0xc0, 0x65, 0x9b, 0x36,
+- 0x74, 0x1c, 0x36, 0xae, 0x53, 0xde, 0x9c, 0xa3, 0x7d, 0x4c, 0xd9, 0x67,
+- 0x64, 0x5b, 0xe2, 0x0c, 0xe6, 0xf4, 0x84, 0x17, 0xa1, 0x8f, 0xe6, 0x0f,
+- 0xa1, 0xec, 0xeb, 0x92, 0xb2, 0xbb, 0x43, 0x7c, 0xde, 0x66, 0x3f, 0x29,
+- 0xbc, 0x6f, 0x90, 0xb2, 0x6f, 0x0d, 0x51, 0x8e, 0xe0, 0x73, 0x2f, 0xad,
+- 0xce, 0xf3, 0x7b, 0x73, 0xca, 0x4f, 0x52, 0x7a, 0x66, 0xc9, 0xe3, 0x78,
+- 0x97, 0xb4, 0x6e, 0xbb, 0x15, 0xfa, 0x24, 0xa6, 0xcf, 0xc2, 0xd0, 0x86,
+- 0xd8, 0xc6, 0x8b, 0xe8, 0xfc, 0x67, 0x25, 0x77, 0x3a, 0x0e, 0x7d, 0xc6,
+- 0xbe, 0x8c, 0xef, 0x40, 0x1b, 0x69, 0xf0, 0x36, 0xed, 0xdd, 0x2e, 0xd8,
+- 0xbd, 0x9b, 0xd4, 0x7c, 0x46, 0xbc, 0x7e, 0x99, 0x3a, 0xc9, 0xb1, 0xfb,
+- 0xa0, 0xcb, 0x13, 0x4a, 0x6e, 0x4b, 0xe5, 0xcb, 0x89, 0x18, 0x74, 0x72,
+- 0x6c, 0x3b, 0xe9, 0xf9, 0x61, 0xb9, 0xd3, 0x1d, 0x97, 0xbb, 0x20, 0x3b,
+- 0x43, 0xae, 0x27, 0xc3, 0xe0, 0xc5, 0x1e, 0x17, 0x76, 0x47, 0x61, 0xe8,
+- 0x66, 0xf8, 0x5d, 0x1c, 0x9b, 0xf7, 0xc4, 0xd9, 0x36, 0xc0, 0x8f, 0x7f,
+- 0x54, 0x0f, 0x68, 0x94, 0x9b, 0xfb, 0x88, 0xa2, 0xcd, 0x88, 0xb7, 0x53,
+- 0xdb, 0xd9, 0x36, 0xc9, 0xab, 0x7a, 0x3b, 0x95, 0x3d, 0x2e, 0x2d, 0xde,
+- 0x87, 0x14, 0xb6, 0x79, 0x11, 0xfa, 0x06, 0x98, 0xbb, 0x54, 0xdb, 0x81,
+- 0x3c, 0x6c, 0xe8, 0x62, 0x06, 0xe9, 0x87, 0x91, 0xb2, 0x6e, 0xa8, 0x35,
+- 0x88, 0xe5, 0x1a, 0x3c, 0xba, 0x7a, 0xbf, 0xf0, 0xa3, 0x0a, 0x97, 0x5e,
+- 0x55, 0xf7, 0xcb, 0x2c, 0x60, 0x9d, 0x1c, 0xf4, 0x4a, 0x2b, 0x30, 0xd0,
+- 0xcc, 0x29, 0x27, 0x3d, 0x1c, 0xda, 0x2d, 0xbf, 0x06, 0x5f, 0xbe, 0xea,
+- 0x91, 0x97, 0x3b, 0xe4, 0xc1, 0x3b, 0x28, 0x23, 0xbb, 0x65, 0xff, 0x1d,
+- 0x21, 0xd9, 0xdf, 0xef, 0x64, 0x39, 0xef, 0x5b, 0x6e, 0x33, 0xfe, 0x74,
+- 0xcf, 0x48, 0x2a, 0x34, 0x20, 0x4f, 0x42, 0xc6, 0x8a, 0x90, 0xaf, 0xe1,
+- 0x3a, 0x69, 0x4e, 0x7d, 0x4f, 0x3d, 0x9f, 0x06, 0x56, 0x36, 0xd8, 0xcf,
+- 0x95, 0x99, 0x7a, 0x93, 0x24, 0xaf, 0x67, 0x3c, 0x39, 0x19, 0x9c, 0x71,
+- 0x5c, 0x4f, 0x99, 0x80, 0x0f, 0x72, 0x7d, 0xb0, 0x3f, 0xd5, 0xbd, 0x2e,
+- 0xf5, 0x1c, 0xa7, 0xff, 0xeb, 0x13, 0xe7, 0x15, 0x14, 0x5f, 0x68, 0x23,
+- 0x98, 0xfe, 0xbb, 0xd6, 0x15, 0x7c, 0xd7, 0x46, 0xff, 0x61, 0x67, 0xeb,
+- 0xea, 0xbd, 0xf4, 0xf5, 0xb2, 0x68, 0xe2, 0x6e, 0x15, 0xac, 0x99, 0x36,
+- 0xdd, 0xb1, 0xa9, 0x0b, 0xdb, 0xdd, 0xfb, 0xe5, 0x4f, 0x60, 0xdf, 0xbf,
+- 0xb2, 0x62, 0xdf, 0xf7, 0x81, 0x1e, 0xeb, 0x31, 0x80, 0x6b, 0xdf, 0x8d,
+- 0xb5, 0x8c, 0x80, 0x9f, 0x77, 0xe1, 0x77, 0x67, 0x79, 0x4d, 0x1c, 0x6f,
+- 0xb6, 0x08, 0x3c, 0xd9, 0xe4, 0xb2, 0xbf, 0x35, 0xf1, 0xbc, 0x62, 0x41,
+- 0x56, 0x62, 0x85, 0x83, 0xd7, 0x84, 0x76, 0xef, 0x2d, 0x89, 0xf6, 0xba,
+- 0x6f, 0x75, 0x87, 0xdc, 0x17, 0xac, 0x10, 0xcf, 0x95, 0x3d, 0x39, 0x5b,
+- 0x27, 0x0e, 0xbb, 0x22, 0xd6, 0x79, 0x62, 0xb0, 0x6f, 0xa8, 0x18, 0x54,
+- 0xb5, 0xfc, 0x6d, 0xa4, 0xa8, 0x0f, 0xfd, 0x18, 0x0e, 0xe2, 0x14, 0x0a,
+- 0xab, 0x50, 0xcf, 0xde, 0x05, 0x3e, 0x4c, 0xe1, 0xd7, 0xbd, 0xfd, 0x56,
+- 0xec, 0x5f, 0xca, 0x29, 0x63, 0x5f, 0xbd, 0xf6, 0xf6, 0x10, 0xdf, 0x6d,
+- 0x14, 0x07, 0xfb, 0x8e, 0x44, 0x4e, 0xc0, 0xd6, 0x59, 0xd4, 0x0f, 0x5c,
+- 0x07, 0xed, 0xa4, 0x2d, 0x0b, 0x27, 0xb9, 0xd7, 0x37, 0xaa, 0x6f, 0xea,
+- 0x9a, 0xb5, 0x28, 0xbb, 0x91, 0x2d, 0x30, 0xc6, 0x59, 0x26, 0x0f, 0x3c,
+- 0xf0, 0xc0, 0x97, 0x53, 0x5e, 0x3b, 0xf4, 0x76, 0x5c, 0xc2, 0xa7, 0x7c,
+- 0x19, 0x52, 0xd8, 0x75, 0x1b, 0x30, 0xd7, 0x16, 0x8d, 0x1b, 0xe2, 0x12,
+- 0x39, 0xd5, 0x25, 0xcd, 0xc0, 0xd5, 0x4d, 0xc7, 0x68, 0x23, 0x53, 0xc9,
+- 0x21, 0x08, 0x41, 0x44, 0xdd, 0x55, 0x74, 0x06, 0xdf, 0x94, 0x6d, 0xc9,
+- 0x37, 0x85, 0x78, 0xe9, 0x86, 0x2d, 0xf0, 0x09, 0xbc, 0x2b, 0x1b, 0xd4,
+- 0x2f, 0xad, 0xd6, 0x87, 0x1c, 0x31, 0xb6, 0xc6, 0x36, 0x8c, 0xb5, 0xa5,
+- 0x06, 0xdf, 0x60, 0x8c, 0x0d, 0xbe, 0x66, 0xd3, 0xb9, 0x60, 0x0e, 0xd6,
+- 0x52, 0x87, 0x54, 0x4f, 0x73, 0x8f, 0x32, 0xce, 0x62, 0x07, 0x7e, 0x6a,
+- 0x99, 0xfe, 0x2a, 0xdf, 0x27, 0xf5, 0xfb, 0x6e, 0xfd, 0x9e, 0xfe, 0x68,
+- 0xd1, 0x6f, 0x02, 0x4d, 0xf7, 0x40, 0x7f, 0xde, 0xb7, 0xc3, 0x55, 0xb8,
+- 0xe1, 0xbe, 0x15, 0x9e, 0xed, 0x15, 0xeb, 0x38, 0xfc, 0xd4, 0xf2, 0x61,
+- 0x71, 0xb7, 0x2f, 0xa7, 0x23, 0x32, 0x06, 0x5e, 0x30, 0x9f, 0xe5, 0x7c,
+- 0xd2, 0x47, 0xe4, 0xa0, 0xe2, 0x4d, 0xf5, 0xa4, 0x73, 0x34, 0x19, 0x9a,
+- 0x12, 0xab, 0xca, 0xe7, 0x47, 0x90, 0x1e, 0x01, 0xde, 0x09, 0x62, 0x97,
+- 0x56, 0x75, 0x2d, 0x2d, 0x81, 0x31, 0xec, 0x3d, 0x6b, 0xe2, 0x58, 0xab,
+- 0x31, 0x2e, 0xbe, 0x1f, 0x52, 0xef, 0xd3, 0x6b, 0xe2, 0x5c, 0x79, 0x8b,
+- 0x58, 0xc6, 0xbc, 0x27, 0x2f, 0xc8, 0x2f, 0xd8, 0xe2, 0x93, 0x26, 0xe6,
+- 0xd5, 0xa6, 0xf9, 0x42, 0xfe, 0xcc, 0xc8, 0x45, 0xdb, 0x19, 0xa1, 0xfc,
+- 0xfd, 0xea, 0x8e, 0x1b, 0x65, 0xa2, 0x93, 0xf1, 0xb6, 0xc6, 0x39, 0xac,
+- 0x8f, 0xa3, 0x35, 0x8e, 0xbf, 0x3e, 0xfe, 0xc6, 0xb1, 0x83, 0x18, 0x5b,
+- 0x6e, 0x4d, 0x8c, 0xad, 0x71, 0x3c, 0x8e, 0xb5, 0x05, 0xfe, 0x53, 0xd1,
+- 0x8f, 0xbb, 0xe4, 0x51, 0x4f, 0x72, 0x8e, 0xf9, 0x2f, 0x58, 0xe0, 0x63,
+- 0x1c, 0x76, 0x84, 0xbc, 0x34, 0x67, 0xcf, 0xe4, 0x69, 0x2a, 0x79, 0x24,
+- 0xe0, 0xe7, 0x60, 0xc0, 0xf7, 0x80, 0xff, 0x57, 0x56, 0xf8, 0x48, 0xfb,
+- 0x40, 0x3e, 0x76, 0x8a, 0x40, 0xcf, 0x5a, 0xc7, 0xc8, 0x43, 0xa6, 0xe4,
+- 0x21, 0xdf, 0x91, 0x87, 0xdd, 0xfa, 0x1d, 0xf9, 0x07, 0x9c, 0xf6, 0x79,
+- 0x60, 0x0c, 0x2f, 0xa7, 0xbe, 0xb1, 0xe9, 0xee, 0x35, 0x7b, 0x31, 0x2d,
+- 0xcf, 0x2f, 0xb4, 0x88, 0x9d, 0x09, 0xd6, 0x35, 0xbe, 0x26, 0xde, 0xce,
+- 0xf3, 0xab, 0x7e, 0x62, 0x4f, 0xb3, 0xae, 0x04, 0xd7, 0x75, 0x50, 0x5e,
+- 0x93, 0xc2, 0x4c, 0x04, 0x3e, 0x60, 0x1a, 0x38, 0xa7, 0x1f, 0xfa, 0x96,
+- 0xf1, 0x51, 0x94, 0xd5, 0x88, 0x57, 0x68, 0xeb, 0xd2, 0xd8, 0x2b, 0xd4,
+- 0xc1, 0xc4, 0x23, 0xaf, 0x4a, 0xbe, 0x62, 0x74, 0x0c, 0xfa, 0xb7, 0x4c,
+- 0xff, 0xa4, 0x73, 0xf6, 0x96, 0xeb, 0x64, 0x39, 0x79, 0x9d, 0x38, 0xc9,
+- 0x45, 0x59, 0xe5, 0xeb, 0xf8, 0xc6, 0x74, 0xf7, 0xee, 0x0b, 0xaf, 0xca,
+- 0xc6, 0xf8, 0x06, 0xbc, 0x9f, 0x14, 0xf3, 0xde, 0xf0, 0x7e, 0x43, 0x3e,
+- 0x14, 0x5f, 0x11, 0xf2, 0x82, 0x34, 0x20, 0x1e, 0x8e, 0xca, 0xef, 0xc6,
+- 0xb9, 0x1f, 0x8b, 0xea, 0x7c, 0x33, 0x65, 0xf5, 0x2a, 0x9d, 0x31, 0xe4,
+- 0x05, 0xf2, 0x5a, 0xc4, 0x38, 0xb1, 0x9e, 0xdf, 0xf3, 0x87, 0xe2, 0xf0,
+- 0x73, 0x7b, 0xa8, 0x5f, 0xcc, 0x9e, 0x6e, 0x51, 0x7b, 0xfa, 0x09, 0x2f,
+- 0x24, 0x25, 0x37, 0x24, 0x53, 0xee, 0x61, 0x85, 0xf1, 0x7f, 0x03, 0x7d,
+- 0x3d, 0xa8, 0xfb, 0x9a, 0x92, 0x5e, 0xad, 0x7f, 0x0e, 0x41, 0xce, 0x7d,
+- 0xb9, 0xd7, 0xdb, 0x21, 0xbf, 0xda, 0xce, 0x3d, 0x60, 0xd6, 0x7f, 0x58,
+- 0x7a, 0x76, 0x2c, 0x27, 0xe1, 0x19, 0xdc, 0x12, 0x5d, 0xa1, 0x01, 0xf7,
+- 0x99, 0x91, 0xef, 0x80, 0x0e, 0xc1, 0xfa, 0xd7, 0xac, 0x55, 0xaf, 0x93,
+- 0x6b, 0x66, 0x3d, 0xae, 0x35, 0xc0, 0xf2, 0xab, 0x6b, 0x35, 0xf5, 0x5b,
+- 0x21, 0x4b, 0x4e, 0x52, 0x42, 0x8d, 0xb4, 0x59, 0xd1, 0x51, 0x23, 0x8c,
+- 0x91, 0x2c, 0xdb, 0x4e, 0x3a, 0x19, 0x32, 0xb1, 0xe8, 0x00, 0xeb, 0x76,
+- 0x03, 0x87, 0xbb, 0xbd, 0xbd, 0xe9, 0x82, 0x8a, 0x91, 0x5a, 0x6a, 0x5d,
+- 0x53, 0xc0, 0x64, 0x0b, 0xde, 0x2b, 0xfe, 0xa7, 0x81, 0x59, 0x27, 0xe4,
+- 0x61, 0x09, 0xaf, 0x89, 0xe5, 0x22, 0x7f, 0x9e, 0xf1, 0x5c, 0x27, 0x99,
+- 0x05, 0x8f, 0x7f, 0x13, 0x3e, 0x7c, 0x15, 0x7a, 0xff, 0xe3, 0xb4, 0x0d,
+- 0x65, 0xd8, 0x0b, 0xe0, 0x92, 0xaf, 0xbc, 0x27, 0x86, 0x9f, 0x68, 0x88,
+- 0xe5, 0x06, 0xf8, 0xf4, 0xa2, 0xc2, 0xa4, 0xc4, 0xed, 0x47, 0x43, 0x77,
+- 0xf7, 0x85, 0xe1, 0x67, 0x14, 0xfd, 0x98, 0x4b, 0x1c, 0x77, 0x58, 0xee,
+- 0x04, 0x7f, 0xce, 0x2e, 0x14, 0x43, 0x7b, 0xca, 0x46, 0x56, 0xe1, 0x57,
+- 0xd6, 0x9d, 0xf4, 0x65, 0xd0, 0xe3, 0x19, 0x8d, 0xf9, 0x78, 0x5e, 0x53,
+- 0xd5, 0x3e, 0x0b, 0x63, 0x43, 0xa5, 0xfa, 0x61, 0x99, 0xf6, 0x18, 0xdb,
+- 0xe9, 0x91, 0x52, 0x3c, 0x7b, 0x63, 0xf3, 0x0a, 0x8d, 0x1c, 0x1b, 0x3e,
+- 0x5f, 0x9a, 0xfa, 0xbb, 0xaa, 0xcf, 0x3b, 0x9e, 0x51, 0xf2, 0x65, 0xe2,
+- 0xc2, 0xf4, 0x8f, 0x78, 0x5e, 0xd5, 0x63, 0x8f, 0xf0, 0xb9, 0x42, 0x19,
+- 0x50, 0x3e, 0x13, 0x68, 0xf9, 0x90, 0x64, 0xc7, 0x92, 0x0a, 0xb7, 0x3c,
+- 0x5e, 0xe6, 0x7e, 0x21, 0xfe, 0x7f, 0x0d, 0xd8, 0x3f, 0x02, 0x9e, 0xd1,
+- 0x0f, 0xe0, 0xd8, 0xdc, 0x17, 0x28, 0xab, 0xd9, 0xef, 0xb2, 0x2f, 0x5e,
+- 0x6b, 0x23, 0xc6, 0xb8, 0x54, 0x16, 0x45, 0xbf, 0x65, 0x31, 0xb1, 0x73,
+- 0x85, 0x05, 0x8b, 0xb9, 0x70, 0x48, 0x52, 0x27, 0xfe, 0x35, 0x64, 0xe8,
+- 0xd7, 0xe1, 0x23, 0xa9, 0x7a, 0xea, 0xfc, 0x6a, 0x08, 0x98, 0xcb, 0x72,
+- 0x6f, 0x90, 0x92, 0x1d, 0x95, 0x92, 0xba, 0xa3, 0xc9, 0xf3, 0xdc, 0xb0,
+- 0x8a, 0xed, 0x94, 0x6c, 0x62, 0xfe, 0xff, 0xde, 0x16, 0xd8, 0xfa, 0x0e,
+- 0xe4, 0xd9, 0x8e, 0x79, 0x96, 0x4f, 0x49, 0xf4, 0xc4, 0x21, 0x69, 0x3a,
+- 0xf1, 0xb0, 0x34, 0x1f, 0x27, 0xc6, 0x63, 0xec, 0xde, 0xda, 0xd5, 0x2c,
+- 0xc4, 0xdc, 0x43, 0x18, 0xfb, 0xb0, 0x7c, 0xdf, 0x33, 0x73, 0x5a, 0xc4,
+- 0x1c, 0x59, 0xc7, 0xe4, 0x0d, 0x1e, 0xdf, 0x85, 0xf9, 0x70, 0xfd, 0x49,
+- 0x8d, 0xfb, 0x76, 0x35, 0xf8, 0xae, 0x4d, 0xda, 0x77, 0x65, 0xbb, 0x4f,
+- 0x61, 0xad, 0x27, 0x25, 0xea, 0x9a, 0xf6, 0xbb, 0x51, 0x2f, 0xd1, 0x70,
+- 0x07, 0x82, 0x75, 0xf4, 0x9d, 0x80, 0x36, 0xe2, 0x1e, 0x9e, 0xb7, 0xb3,
+- 0x2c, 0x38, 0xf3, 0xb7, 0xaa, 0xbb, 0xc2, 0x6b, 0xc7, 0xdf, 0xd9, 0x50,
+- 0xd7, 0x94, 0x99, 0x36, 0xd1, 0xc0, 0xe7, 0x1f, 0x88, 0x36, 0xb4, 0x83,
+- 0x71, 0x53, 0x69, 0xe0, 0x7b, 0x04, 0x7e, 0x10, 0xd7, 0x90, 0x6e, 0xc0,
+- 0x39, 0x6b, 0xbf, 0x45, 0xcc, 0xa3, 0xbc, 0x30, 0x67, 0xee, 0x91, 0x59,
+- 0x58, 0x8b, 0x53, 0xa4, 0xff, 0x62, 0xf3, 0x4e, 0xee, 0x5c, 0x11, 0xf3,
+- 0xbe, 0x49, 0xdd, 0x25, 0xe2, 0xdd, 0x0d, 0xd4, 0x4b, 0x06, 0xf8, 0x93,
+- 0xf9, 0x04, 0x78, 0x7e, 0x5b, 0x97, 0x95, 0xf9, 0xf3, 0x1b, 0x73, 0x03,
+- 0xc4, 0x37, 0x5b, 0x79, 0x0e, 0x09, 0xdc, 0x4c, 0x39, 0xfb, 0x2e, 0xe4,
+- 0xac, 0x59, 0x9d, 0xfb, 0x94, 0xca, 0xf4, 0xe7, 0x0a, 0x90, 0x1f, 0xde,
+- 0x87, 0xa3, 0xdf, 0x57, 0xd0, 0xf1, 0x58, 0xce, 0x93, 0x98, 0xde, 0xf8,
+- 0x07, 0xec, 0x73, 0xfd, 0x19, 0x6c, 0xe3, 0xfd, 0x12, 0xca, 0x5b, 0x42,
+- 0xcd, 0x79, 0x78, 0x9d, 0xbf, 0x72, 0x04, 0xba, 0x60, 0x01, 0xf2, 0x3c,
+- 0x09, 0x1d, 0x38, 0x14, 0xe6, 0xfe, 0x6c, 0xd1, 0xbe, 0xac, 0x4b, 0xbf,
+- 0x3d, 0x34, 0x86, 0x3e, 0xac, 0xe3, 0xaf, 0xcb, 0x14, 0xf4, 0xff, 0x74,
+- 0x3d, 0xa5, 0xbe, 0x17, 0xc9, 0x26, 0x78, 0x07, 0x8c, 0xe5, 0x63, 0x18,
+- 0xff, 0x75, 0xe0, 0xe1, 0xcd, 0xa0, 0xa7, 0xa5, 0x79, 0xf5, 0x2b, 0x3a,
+- 0x16, 0x15, 0x63, 0x2c, 0x1e, 0x7a, 0xb3, 0x14, 0x60, 0xcd, 0xf8, 0x34,
+- 0xd2, 0xcd, 0x2d, 0x81, 0xbc, 0x4e, 0x6e, 0xd5, 0x77, 0x2f, 0x50, 0xfe,
+- 0x98, 0x8a, 0x41, 0x06, 0x6b, 0x72, 0xb4, 0xaf, 0x12, 0x85, 0xcc, 0x71,
+- 0x5d, 0xf7, 0xa2, 0x1e, 0x65, 0xad, 0x4f, 0x9f, 0xcd, 0xb6, 0x28, 0xfd,
+- 0x98, 0x87, 0x2c, 0x15, 0x94, 0x1f, 0x01, 0x7c, 0xef, 0xb1, 0xdd, 0xaf,
+- 0x6f, 0xe5, 0xd9, 0x67, 0x93, 0xab, 0x7c, 0x8b, 0xce, 0xb0, 0x98, 0xb2,
+- 0x8f, 0xa0, 0x8c, 0x72, 0x76, 0x03, 0x78, 0xc3, 0xb2, 0x1c, 0xf2, 0x1c,
+- 0xeb, 0x46, 0x3d, 0x0e, 0xc7, 0xb8, 0xb4, 0x79, 0xed, 0x9c, 0xb8, 0x96,
+- 0xce, 0x75, 0x77, 0xe7, 0x59, 0x76, 0x83, 0x2e, 0x8b, 0xe8, 0xf5, 0xfd,
+- 0xa9, 0xfe, 0xb6, 0xc1, 0x39, 0x9a, 0x5d, 0xc1, 0xc6, 0x9c, 0x5f, 0x4c,
+- 0xb5, 0xcb, 0xda, 0x81, 0xec, 0x1c, 0x01, 0x3f, 0x22, 0x99, 0xaf, 0xf1,
+- 0x4c, 0x19, 0xf4, 0x35, 0x7b, 0x22, 0xa1, 0xfc, 0xce, 0xa4, 0x15, 0xdc,
+- 0x5d, 0xba, 0x58, 0x6e, 0xf4, 0x19, 0xcc, 0xfd, 0x6f, 0x57, 0xc6, 0x56,
+- 0x78, 0x45, 0xbe, 0x91, 0x5f, 0xef, 0xc6, 0x2b, 0xf2, 0x91, 0xfc, 0x2a,
+- 0x48, 0x69, 0x96, 0x7c, 0xa2, 0xbc, 0x8c, 0x29, 0x79, 0x29, 0x55, 0x0c,
+- 0x4e, 0xa6, 0x2e, 0xe1, 0x37, 0x0f, 0x1b, 0x9d, 0xd7, 0x9b, 0xbb, 0x61,
+- 0xbf, 0x44, 0xfa, 0x85, 0x86, 0xe1, 0x1e, 0x2d, 0xcc, 0x2a, 0x9d, 0x02,
+- 0xbb, 0x98, 0x50, 0xba, 0xa2, 0x30, 0xce, 0xfc, 0xd2, 0x56, 0x7e, 0x9b,
+- 0x8b, 0x79, 0xa0, 0xbc, 0x53, 0xf3, 0xf5, 0x06, 0x75, 0xbf, 0x89, 0x7b,
+- 0xb0, 0x54, 0xa9, 0xab, 0xf7, 0x67, 0xe7, 0x9a, 0x54, 0xfd, 0xb3, 0x73,
+- 0xeb, 0xef, 0x28, 0xb1, 0xec, 0x66, 0xc6, 0x55, 0x64, 0x71, 0xa6, 0x49,
+- 0x96, 0xe6, 0xfe, 0x90, 0x7e, 0x22, 0x8c, 0xc1, 0xca, 0xf7, 0x1d, 0xfa,
+- 0x5b, 0x2c, 0x5f, 0x86, 0x21, 0x37, 0x0b, 0x83, 0xd3, 0x52, 0x1d, 0xa4,
+- 0x1f, 0xa4, 0xee, 0x0e, 0x62, 0xbd, 0x4d, 0xc0, 0xc0, 0xc0, 0x85, 0x2e,
+- 0xe3, 0xcf, 0x5b, 0xb4, 0x3e, 0x79, 0xb0, 0x75, 0x25, 0x2e, 0x1d, 0x2f,
+- 0xfa, 0x55, 0xd7, 0x7c, 0x33, 0xc3, 0x3e, 0xf9, 0xdd, 0x0c, 0x79, 0x66,
+- 0xa1, 0x3d, 0xef, 0x64, 0x76, 0x33, 0xae, 0xad, 0xf9, 0x1c, 0x46, 0x7d,
+- 0xa6, 0xbf, 0xa7, 0xf3, 0x73, 0x3a, 0xfd, 0xac, 0xec, 0x3f, 0xf9, 0x19,
+- 0xcc, 0x7b, 0x53, 0x70, 0xef, 0x4a, 0x1a, 0xbf, 0x9b, 0x88, 0xe8, 0x6f,
+- 0x34, 0x3e, 0x8b, 0x32, 0xc6, 0xe2, 0x3e, 0xab, 0xd6, 0xc4, 0xbb, 0x7d,
+- 0x45, 0xf9, 0x79, 0x77, 0x54, 0x8c, 0x3f, 0xc8, 0xfb, 0x53, 0x2d, 0xba,
+- 0xbf, 0x3d, 0x5a, 0x96, 0xc6, 0x65, 0x3f, 0xec, 0x5d, 0x01, 0xb8, 0x98,
+- 0x77, 0xce, 0x26, 0xc2, 0x8d, 0x63, 0x9a, 0xfd, 0x14, 0xc4, 0x1a, 0xcc,
+- 0xdd, 0x87, 0xb0, 0xf2, 0x89, 0x56, 0xe2, 0x16, 0xba, 0x7c, 0x5c, 0x0e,
+- 0x94, 0x55, 0xfc, 0x42, 0x9d, 0x59, 0x4e, 0x43, 0x2f, 0x0c, 0x29, 0x9b,
+- 0x16, 0x0b, 0x0d, 0xd7, 0x32, 0x52, 0x38, 0xbd, 0x17, 0xe3, 0x30, 0x16,
+- 0x98, 0xd5, 0x67, 0x83, 0xfb, 0x64, 0x7f, 0x3d, 0x18, 0x7b, 0xb2, 0xcc,
+- 0xf7, 0x29, 0xe0, 0x04, 0xbe, 0xcf, 0x27, 0xc2, 0xea, 0x74, 0xe3, 0x56,
+- 0xb4, 0x6d, 0xd2, 0x74, 0xe6, 0xbd, 0x6b, 0xb6, 0xa7, 0x0e, 0x00, 0xc0,
+- 0x69, 0xc9, 0xe3, 0x3d, 0xdb, 0x98, 0xfe, 0x26, 0x61, 0xb7, 0xe8, 0x9f,
+- 0x3f, 0x2a, 0xcb, 0x95, 0x69, 0xb9, 0x5c, 0x31, 0xb2, 0xce, 0xbb, 0xd7,
+- 0x9c, 0xfb, 0x5d, 0xc1, 0xb7, 0xbf, 0xe5, 0x2c, 0xf8, 0xb3, 0x96, 0x56,
+- 0xf9, 0x35, 0xdf, 0xdb, 0xfc, 0x2b, 0x3b, 0xf8, 0xe6, 0x6d, 0xb7, 0xba,
+- 0xc3, 0xb5, 0x76, 0xcf, 0xb1, 0x9f, 0xfd, 0x36, 0xcf, 0x3a, 0x82, 0x7b,
+- 0x68, 0x9d, 0x0d, 0xef, 0xe3, 0xfa, 0xee, 0xd7, 0xa7, 0xec, 0x80, 0x8f,
+- 0xa4, 0xe7, 0x98, 0x9e, 0xef, 0xad, 0xd8, 0xff, 0xec, 0xf3, 0x31, 0xcd,
+- 0x37, 0xa4, 0x0b, 0x7c, 0xe6, 0xfe, 0x5a, 0xd6, 0xe7, 0xbf, 0xb6, 0x1e,
+- 0xa3, 0xf1, 0xee, 0x5d, 0x53, 0xc3, 0xb8, 0x6c, 0x4f, 0xfb, 0x64, 0xee,
+- 0x80, 0xb3, 0xec, 0xa4, 0xbe, 0xe3, 0x77, 0xb5, 0xa1, 0xcc, 0xdc, 0x45,
+- 0x23, 0xbd, 0x18, 0xd3, 0x44, 0x5a, 0x1f, 0xd3, 0xcf, 0x63, 0x0d, 0xdf,
+- 0xc8, 0x98, 0x3e, 0x23, 0xe8, 0xc3, 0xdc, 0x41, 0x6f, 0xbc, 0x53, 0xcc,
+- 0xef, 0x83, 0x28, 0x8b, 0x16, 0xbf, 0x61, 0xa6, 0x1f, 0x08, 0xec, 0xb6,
+- 0x45, 0x26, 0xd5, 0x7c, 0x8a, 0xea, 0xbe, 0x06, 0xbf, 0x9b, 0x19, 0xb2,
+- 0x83, 0xfc, 0xe4, 0xc2, 0x7a, 0x39, 0x65, 0xf9, 0x33, 0xcd, 0xd2, 0x52,
+- 0xc4, 0x38, 0x7c, 0xbf, 0xd1, 0xf7, 0xf4, 0x51, 0xfd, 0x9d, 0x90, 0x87,
+- 0x36, 0x4f, 0x50, 0xde, 0x8b, 0xc5, 0x95, 0x7b, 0xa2, 0xc5, 0xe0, 0x1b,
+- 0x26, 0xcb, 0xdc, 0xd7, 0xe4, 0x37, 0xda, 0x22, 0x17, 0x6a, 0xfc, 0x3e,
+- 0x69, 0xb7, 0xba, 0x47, 0x13, 0x9c, 0x4d, 0x72, 0x5e, 0x3d, 0xca, 0x2e,
+- 0x54, 0x6b, 0x25, 0xd2, 0x54, 0xdb, 0xf6, 0xa8, 0xb6, 0xed, 0xa4, 0xf1,
+- 0x08, 0x68, 0xfc, 0x25, 0xcd, 0x17, 0xb6, 0xcf, 0xaa, 0xfb, 0xdd, 0xd9,
+- 0x38, 0xcf, 0xc7, 0x1e, 0x53, 0x6b, 0xa1, 0x9d, 0x40, 0xdb, 0x5f, 0x0e,
+- 0xab, 0x78, 0xa7, 0xfa, 0x06, 0x1c, 0xf2, 0xc9, 0x6f, 0xba, 0xa1, 0xe3,
+- 0xcb, 0xfc, 0x76, 0x7b, 0x04, 0x29, 0xbf, 0xd9, 0xde, 0xab, 0xee, 0xff,
+- 0x57, 0xd5, 0x37, 0x01, 0x46, 0x1e, 0xc3, 0x7a, 0xac, 0x6f, 0x62, 0x8c,
+- 0x80, 0xef, 0x85, 0x32, 0xbf, 0xe5, 0x36, 0x77, 0x4c, 0x37, 0x2f, 0x73,
+- 0x4f, 0x88, 0xf2, 0xf3, 0x83, 0x6f, 0xfb, 0xab, 0xea, 0x3b, 0x82, 0x24,
+- 0xbf, 0x2b, 0x84, 0xfd, 0xba, 0x1f, 0xcf, 0x3c, 0x57, 0xde, 0x87, 0x14,
+- 0xfa, 0xa7, 0x36, 0x81, 0xf4, 0x61, 0xc9, 0xab, 0xb8, 0x5f, 0x2b, 0xf2,
+- 0x93, 0x6a, 0xec, 0x52, 0xed, 0x13, 0xb2, 0xff, 0xf4, 0x43, 0xfc, 0x5e,
+- 0x42, 0x7d, 0x77, 0x9e, 0xf3, 0x38, 0xc7, 0xb8, 0x4c, 0xa9, 0x75, 0x17,
+- 0x35, 0xed, 0xcd, 0x59, 0xcc, 0xcf, 0xd4, 0xb7, 0x19, 0xc5, 0x5a, 0x2b,
+- 0xe6, 0x18, 0xd2, 0xf7, 0x4c, 0xe9, 0x0f, 0x98, 0xf5, 0xb7, 0xf0, 0xee,
+- 0xa2, 0xcf, 0xf3, 0xc3, 0xfd, 0x65, 0xde, 0x23, 0x4d, 0xe9, 0x38, 0x01,
+- 0x63, 0x87, 0x3c, 0x9f, 0xa0, 0x8c, 0x3b, 0xe9, 0x09, 0x58, 0xa0, 0xa8,
+- 0x24, 0x78, 0xb6, 0xad, 0xd7, 0xd2, 0xda, 0xb0, 0x16, 0xde, 0x9d, 0x0d,
+- 0xd6, 0xc3, 0xef, 0x21, 0x0a, 0xe5, 0xc6, 0x6f, 0x2a, 0xd4, 0x37, 0xd0,
+- 0xfc, 0x76, 0x46, 0x26, 0x6a, 0x9f, 0x94, 0x07, 0xca, 0x5b, 0xf4, 0xf7,
+- 0x14, 0x31, 0x79, 0xa0, 0xf6, 0xba, 0xa2, 0x69, 0x41, 0x7d, 0xd7, 0x11,
+- 0xd5, 0x3c, 0x33, 0xdf, 0x54, 0x04, 0xfd, 0x1d, 0xa8, 0x39, 0x0d, 0xdf,
+- 0x2f, 0x44, 0x65, 0x62, 0xe1, 0x47, 0x91, 0x8d, 0xbf, 0x61, 0x78, 0x54,
+- 0x72, 0xa7, 0x69, 0xa3, 0xa7, 0xe5, 0xf1, 0x8a, 0xef, 0xdf, 0xe9, 0x11,
+- 0x5b, 0x6e, 0x96, 0xcb, 0xf1, 0xb1, 0x3d, 0x6f, 0xb8, 0x1d, 0xa1, 0xea,
+- 0x6c, 0x33, 0x74, 0x2f, 0xf1, 0x8c, 0xb4, 0x30, 0xbf, 0x30, 0xcb, 0x7d,
+- 0x1a, 0xc1, 0x1a, 0x1d, 0xfb, 0x9a, 0xdc, 0xde, 0xce, 0xb8, 0xdb, 0x9d,
+- 0xf0, 0x65, 0x7f, 0xdb, 0x0b, 0xf4, 0xf5, 0xe7, 0x16, 0xf7, 0xca, 0xe7,
+- 0x6a, 0xb1, 0x50, 0x75, 0x86, 0xf7, 0x0d, 0x9d, 0x91, 0x8a, 0xa4, 0x50,
+- 0x8f, 0xfd, 0x43, 0x5e, 0x12, 0xd7, 0xc9, 0xb3, 0x27, 0x7f, 0xea, 0x5f,
+- 0x73, 0xf1, 0x1e, 0xba, 0xe6, 0xb2, 0x67, 0x62, 0x8b, 0x63, 0xf0, 0x5d,
+- 0x59, 0xef, 0x3a, 0xc8, 0x01, 0xb0, 0x03, 0xf6, 0x1c, 0xfd, 0xdc, 0x6b,
+- 0x5a, 0x6f, 0x59, 0xc7, 0x6e, 0x92, 0x6b, 0x2b, 0xf7, 0x95, 0x5f, 0x83,
+- 0x6c, 0x27, 0x03, 0xfa, 0xab, 0x58, 0xfc, 0x21, 0x09, 0x7f, 0x1e, 0x36,
+- 0xe5, 0xf3, 0x4d, 0x4a, 0xb7, 0xd3, 0xb6, 0xc1, 0x07, 0x82, 0x9f, 0x13,
+- 0x41, 0x3f, 0xa9, 0xf6, 0x40, 0x66, 0xa7, 0x45, 0xbe, 0xb0, 0x49, 0xb2,
+- 0xed, 0xf4, 0xa3, 0xe5, 0xe7, 0xe8, 0xaf, 0xc6, 0x7d, 0x96, 0x96, 0x3f,
+- 0xe2, 0x1e, 0xaf, 0x73, 0x2d, 0xa9, 0xc4, 0x9f, 0xc9, 0xa7, 0x65, 0x22,
+- 0xc1, 0xb5, 0x3c, 0x2a, 0xc5, 0xca, 0x63, 0xf8, 0x71, 0x9d, 0x9c, 0xf7,
+- 0xc7, 0xf4, 0x5d, 0x86, 0x31, 0x29, 0xcd, 0x64, 0x64, 0x6a, 0x6e, 0x92,
+- 0xdf, 0xa0, 0x8e, 0xdc, 0xa9, 0xce, 0xf8, 0x9c, 0x44, 0x2a, 0xb4, 0x2d,
+- 0x39, 0xc5, 0xbb, 0x1b, 0x6a, 0x3d, 0x93, 0x58, 0xcf, 0xe3, 0xed, 0xbc,
+- 0xb3, 0x7e, 0x0d, 0xfa, 0xd7, 0x3a, 0x45, 0x39, 0x74, 0xec, 0xee, 0x10,
+- 0xf3, 0xfb, 0xe0, 0xbf, 0xb3, 0x6c, 0x9f, 0x84, 0x8f, 0xad, 0xe8, 0x79,
+- 0x94, 0xeb, 0xb3, 0x66, 0xd5, 0xfe, 0x14, 0xda, 0xa2, 0xde, 0x31, 0xd3,
+- 0xd6, 0xd4, 0x61, 0x5b, 0xae, 0x73, 0xaf, 0x34, 0x9f, 0x33, 0xf3, 0x82,
+- 0x1c, 0x26, 0x1a, 0xe9, 0xdd, 0xb2, 0x8e, 0xde, 0x11, 0x62, 0x5e, 0xd0,
+- 0x8b, 0x34, 0x0e, 0x6b, 0x1a, 0x7f, 0x05, 0xfd, 0x1b, 0x1e, 0xdc, 0x89,
+- 0x32, 0x5b, 0x7f, 0x93, 0xf4, 0x7e, 0xe8, 0x4e, 0x9a, 0xb3, 0x3e, 0xe9,
+- 0x4e, 0xd9, 0xe2, 0x7c, 0x36, 0xa2, 0xf9, 0xeb, 0x9a, 0x2f, 0xfb, 0x40,
+- 0x2f, 0xde, 0x2b, 0xdd, 0xa6, 0xbe, 0x2f, 0xc8, 0x8e, 0xef, 0x83, 0xec,
+- 0x98, 0x75, 0x6d, 0x83, 0x8c, 0xf1, 0xdc, 0x84, 0xf5, 0x1b, 0x69, 0x12,
+- 0xd8, 0xbd, 0x30, 0x63, 0x1f, 0x2e, 0xd7, 0x0a, 0x5c, 0xfa, 0x05, 0xda,
+- 0x28, 0x7e, 0x63, 0x7d, 0xb3, 0xb6, 0x51, 0x3f, 0x8f, 0xc7, 0x3f, 0x6a,
+- 0x0f, 0x6c, 0x94, 0x0d, 0x9a, 0xb4, 0xe9, 0x36, 0xfb, 0x80, 0x91, 0x19,
+- 0x0f, 0x4e, 0x25, 0x1e, 0x14, 0x33, 0x8e, 0xbf, 0x9b, 0x7e, 0xef, 0xd0,
+- 0xc0, 0x36, 0xa0, 0x16, 0x75, 0x67, 0x27, 0xc1, 0x3b, 0x40, 0xa9, 0xd0,
+- 0x3e, 0x75, 0x7f, 0x63, 0xed, 0xf7, 0x23, 0x69, 0x79, 0x76, 0x55, 0x56,
+- 0x46, 0x7e, 0x28, 0x8e, 0x24, 0x6f, 0xa4, 0xac, 0xb0, 0xdf, 0x49, 0xae,
+- 0x33, 0xf1, 0x90, 0x5a, 0xa7, 0x0d, 0x3f, 0x92, 0x77, 0x2d, 0xec, 0x50,
+- 0x75, 0x8e, 0x7c, 0x47, 0xba, 0xc8, 0x67, 0x73, 0xde, 0xab, 0xf4, 0x0a,
+- 0xc6, 0x65, 0x19, 0x75, 0x23, 0xdf, 0x67, 0xf4, 0x79, 0x70, 0x7b, 0x07,
+- 0xef, 0x24, 0x14, 0x50, 0x56, 0x59, 0xdc, 0x78, 0x6e, 0xbf, 0xad, 0xe4,
+- 0xe0, 0x51, 0xd0, 0xfd, 0x9f, 0xa1, 0xee, 0x63, 0x48, 0xb9, 0xc6, 0xcc,
+- 0x0a, 0xdf, 0x49, 0xef, 0x8f, 0xca, 0x20, 0xe4, 0x82, 0xf9, 0x47, 0x81,
+- 0x37, 0x69, 0x4f, 0x91, 0x56, 0xf8, 0x4c, 0x5d, 0xef, 0x6a, 0x7b, 0xca,
+- 0xb9, 0xec, 0xc3, 0x5c, 0xd4, 0x3a, 0xb5, 0x3c, 0xdd, 0xaf, 0xdb, 0x8d,
+- 0xaf, 0xd0, 0xea, 0xa1, 0x77, 0xe0, 0x8d, 0xe8, 0x0a, 0xde, 0x08, 0xc6,
+- 0xca, 0x76, 0x18, 0xac, 0x11, 0xac, 0x21, 0xc0, 0x1a, 0x81, 0x9c, 0x4f,
+- 0x4a, 0x04, 0x72, 0x1c, 0x5e, 0x95, 0x63, 0xe0, 0x9e, 0x60, 0xcf, 0x4c,
+- 0xf1, 0x1c, 0x53, 0xd1, 0x99, 0x72, 0x48, 0xf9, 0x25, 0x1f, 0x1b, 0x79,
+- 0x7d, 0xfb, 0xbb, 0xf0, 0xba, 0xd4, 0x61, 0xf0, 0xc3, 0x3f, 0x6c, 0x1f,
+- 0x3c, 0xd2, 0xb1, 0xba, 0x0f, 0x6e, 0xfa, 0x05, 0xed, 0x83, 0xf5, 0x72,
+- 0xd9, 0x28, 0x53, 0x36, 0xe4, 0x89, 0xfc, 0xa2, 0x3c, 0x51, 0x8e, 0x48,
+- 0x4b, 0xea, 0xd3, 0x66, 0xfa, 0x6f, 0x89, 0xab, 0xea, 0xdb, 0x91, 0x69,
+- 0xe8, 0xa0, 0x8e, 0x50, 0xa5, 0x12, 0x97, 0xd2, 0xe2, 0x4f, 0x94, 0x4c,
+- 0x3f, 0x5b, 0xa7, 0x5e, 0x7a, 0xaf, 0xb5, 0xaf, 0xd5, 0xb9, 0x85, 0x75,
+- 0x3a, 0xb7, 0xb0, 0xa2, 0x73, 0xdb, 0xb5, 0xcf, 0xf6, 0x0f, 0xd1, 0xb9,
+- 0xf1, 0x86, 0xb3, 0x21, 0x73, 0x2e, 0x24, 0xa1, 0x5c, 0x5f, 0x8b, 0xec,
+- 0x81, 0x1d, 0x19, 0x99, 0xd9, 0x2b, 0x7f, 0x30, 0x33, 0xad, 0xee, 0x49,
+- 0x7d, 0xd3, 0x4b, 0x25, 0x3e, 0x11, 0xf2, 0xe5, 0xa3, 0xf0, 0xb9, 0x27,
+- 0xba, 0x9a, 0x64, 0xcf, 0x6d, 0xea, 0xbc, 0xd3, 0xce, 0x85, 0x3a, 0x85,
+- 0x91, 0xf8, 0xbc, 0xe7, 0x78, 0xc9, 0x10, 0xef, 0xcc, 0x35, 0xcb, 0x44,
+- 0xbc, 0x55, 0xf6, 0x02, 0x3b, 0x15, 0xaf, 0xf7, 0xd4, 0x37, 0xd3, 0x59,
+- 0x75, 0x9e, 0xf4, 0x86, 0xe6, 0x3b, 0xe8, 0xd0, 0x66, 0xcb, 0x7f, 0xac,
+- 0x33, 0xcf, 0xf2, 0x07, 0xd7, 0xe5, 0xf9, 0xfc, 0x04, 0xfc, 0xb9, 0x38,
+- 0x68, 0xd5, 0x78, 0xff, 0x28, 0xac, 0xe8, 0x59, 0xaa, 0x8c, 0xab, 0x7b,
+- 0x5d, 0x57, 0xc3, 0xa4, 0x97, 0xf2, 0xa1, 0x12, 0xb9, 0x30, 0x30, 0xce,
+- 0x2c, 0x90, 0xb4, 0x4b, 0xbf, 0x53, 0xe3, 0x4f, 0xe8, 0xff, 0xfd, 0xea,
+- 0x7c, 0x79, 0x19, 0xb4, 0xf1, 0x55, 0xfc, 0xb9, 0x10, 0x27, 0xae, 0x5f,
+- 0xbd, 0xc3, 0xfc, 0x4e, 0x7c, 0xaf, 0xb0, 0xbd, 0x39, 0x0b, 0xd1, 0xf1,
+- 0x2a, 0x1d, 0x07, 0x50, 0x67, 0x7b, 0x1b, 0xfd, 0xbf, 0x0b, 0xc4, 0x7a,
+- 0xfc, 0xae, 0x9f, 0xd8, 0xce, 0x39, 0x5a, 0x91, 0x1f, 0x2a, 0x5f, 0x34,
+- 0x4b, 0xfa, 0x56, 0xc1, 0xa7, 0xe3, 0x09, 0x63, 0xcf, 0x43, 0xdd, 0xe7,
+- 0x1b, 0x7d, 0x51, 0xf6, 0x11, 0x53, 0x77, 0x42, 0x56, 0xff, 0x9f, 0x17,
+- 0xc6, 0x98, 0xb2, 0xa1, 0xbb, 0xcb, 0xd3, 0x12, 0x3e, 0x31, 0x26, 0x91,
+- 0xe3, 0x8c, 0xe7, 0x67, 0xa5, 0x14, 0xf7, 0xe5, 0x01, 0x6f, 0xad, 0x6f,
+- 0xd2, 0x6d, 0xad, 0x9f, 0xfb, 0xa3, 0x32, 0x74, 0xfa, 0x31, 0x89, 0x9e,
+- 0xe0, 0xbb, 0x35, 0x67, 0x39, 0xd0, 0x47, 0x9b, 0xa5, 0x12, 0x67, 0x4c,
+- 0x3b, 0xaa, 0xce, 0xc6, 0x2f, 0x8f, 0xbf, 0x1e, 0x2d, 0x01, 0x2b, 0x14,
+- 0x94, 0x6e, 0x41, 0xba, 0xe2, 0x4b, 0xe4, 0xae, 0xe3, 0x9e, 0x82, 0xbf,
+- 0x19, 0x9a, 0xa8, 0x44, 0xd5, 0x1d, 0xa5, 0xcb, 0x71, 0xd6, 0x7d, 0x0c,
+- 0x7e, 0x37, 0x71, 0x06, 0x74, 0xc7, 0x98, 0xb4, 0x30, 0x1f, 0x3e, 0xb1,
+- 0x8a, 0x33, 0xa8, 0x13, 0x86, 0xbc, 0xb8, 0x44, 0xce, 0x04, 0x6b, 0xe7,
+- 0x7f, 0x1c, 0x64, 0xcd, 0xef, 0x95, 0xf0, 0x71, 0x3e, 0x37, 0xfa, 0x43,
+- 0xc4, 0xee, 0xb0, 0x0d, 0xe7, 0x7f, 0x1f, 0xfd, 0xf1, 0x5d, 0x56, 0x7f,
+- 0x87, 0x8b, 0x7c, 0xf5, 0xef, 0xfa, 0x7f, 0x04, 0x50, 0xf6, 0xff, 0x3f,
+- 0xc3, 0x8e, 0xbb, 0xb0, 0xa8, 0x4d, 0x00, 0x00, 0x00 };
++ 0xcd, 0x7c, 0x0d, 0x70, 0x5b, 0xd7, 0x95, 0xde, 0xc1, 0x03, 0x40, 0x82,
++ 0x10, 0x45, 0x3d, 0x52, 0x30, 0x0d, 0x3b, 0x4c, 0x82, 0x47, 0x3c, 0x92,
++ 0xb0, 0xc9, 0x64, 0x9f, 0x64, 0x46, 0x66, 0x12, 0xac, 0x05, 0x03, 0xa4,
++ 0x4c, 0x27, 0xea, 0x92, 0xb6, 0x19, 0x47, 0x6d, 0x35, 0x09, 0x17, 0x92,
++ 0x12, 0xdb, 0x4d, 0xa7, 0x9a, 0xc6, 0xe9, 0x2a, 0x1b, 0xc7, 0x82, 0x41,
++ 0xca, 0x51, 0x52, 0x8a, 0x60, 0x24, 0x4a, 0xf2, 0x74, 0xb3, 0xbb, 0x0c,
++ 0x48, 0x4a, 0x8e, 0x03, 0x09, 0x96, 0xec, 0x75, 0xdc, 0xad, 0xb3, 0x62,
++ 0x68, 0xad, 0xec, 0x4d, 0xb3, 0xad, 0x9d, 0x49, 0x3a, 0x9a, 0xa9, 0xb7,
++ 0x55, 0x95, 0xa4, 0xf9, 0x99, 0xfe, 0xb8, 0x49, 0xa6, 0x75, 0xbb, 0xf1,
++ 0xbe, 0x7e, 0xdf, 0x7d, 0xf7, 0x11, 0x20, 0xc5, 0x28, 0xde, 0xec, 0x64,
++ 0x66, 0x39, 0x83, 0xb9, 0xef, 0xde, 0x77, 0x7f, 0xce, 0x3d, 0xf7, 0xfc,
++ 0x7c, 0xe7, 0xde, 0xfb, 0x78, 0x87, 0x48, 0x54, 0xf4, 0xdf, 0x46, 0xfc,
++ 0xfa, 0xff, 0xe9, 0x3f, 0xdb, 0xb3, 0xf5, 0xdd, 0xfd, 0xef, 0x66, 0xde,
++ 0x30, 0x42, 0x21, 0xa6, 0x41, 0xfc, 0x62, 0xf8, 0x6d, 0xd5, 0xcf, 0xeb,
++ 0xfd, 0x99, 0xf8, 0x6d, 0x0b, 0x88, 0x8c, 0xff, 0x44, 0x24, 0xb0, 0xe6,
++ 0x5d, 0x64, 0x9d, 0xfa, 0xae, 0xfb, 0x4b, 0x3a, 0xd2, 0x7f, 0x06, 0x7e,
++ 0x89, 0xeb, 0x57, 0x59, 0x19, 0xf7, 0xd7, 0xfd, 0x0b, 0xea, 0xe6, 0x1b,
++ 0xf5, 0x4f, 0x22, 0x46, 0x5a, 0x46, 0xb2, 0xb6, 0x44, 0x82, 0xe9, 0x9f,
++ 0x8f, 0xec, 0xb1, 0x45, 0x32, 0x95, 0xde, 0x44, 0x4e, 0xde, 0x74, 0x0b,
++ 0xb1, 0x90, 0xb0, 0xfc, 0xed, 0xe9, 0x5f, 0x1c, 0xfc, 0xfa, 0xed, 0xd6,
++ 0xeb, 0x73, 0x41, 0x89, 0x98, 0xe9, 0x37, 0xc4, 0xec, 0x96, 0x48, 0x07,
++ 0xda, 0x7c, 0xa9, 0xe7, 0x49, 0x43, 0x5a, 0xfc, 0xbe, 0xcc, 0xf1, 0x60,
++ 0x5a, 0x46, 0xf7, 0x4e, 0x1d, 0x74, 0x0d, 0x5b, 0x0a, 0x37, 0xa7, 0xed,
++ 0x44, 0x51, 0x9a, 0x07, 0x26, 0xfb, 0x6f, 0x17, 0xe4, 0x47, 0xf7, 0x56,
++ 0x22, 0x92, 0xad, 0x16, 0x9a, 0x0d, 0xdb, 0x46, 0x1a, 0x29, 0xbc, 0x2d,
++ 0x2d, 0x91, 0x86, 0xf4, 0x6c, 0xe3, 0x25, 0x9b, 0xe3, 0x0f, 0x60, 0xfc,
++ 0xb7, 0x49, 0xc8, 0x76, 0xdd, 0x49, 0x8c, 0xbf, 0xa3, 0xf2, 0xa6, 0xfb,
++ 0x58, 0xc8, 0x1b, 0xdb, 0x48, 0x1f, 0x08, 0x32, 0x0d, 0xa4, 0x33, 0x23,
++ 0x9d, 0x15, 0x95, 0x6f, 0xf0, 0xf2, 0x83, 0x3a, 0x1f, 0x89, 0x7a, 0xb4,
++ 0x4b, 0x13, 0x68, 0x8f, 0x84, 0xd2, 0xe9, 0x26, 0xf4, 0x11, 0x09, 0xa7,
++ 0x97, 0x7e, 0x7b, 0x51, 0xd5, 0x3b, 0xac, 0xeb, 0x3d, 0x10, 0xf6, 0xda,
++ 0x4d, 0x8e, 0x74, 0x57, 0x98, 0xce, 0x8e, 0x74, 0xa9, 0xf4, 0x4b, 0x23,
++ 0x49, 0x95, 0xce, 0xa9, 0x7a, 0x81, 0xf4, 0xc2, 0x88, 0xad, 0xd2, 0xb4,
++ 0x2e, 0x1f, 0x1e, 0x49, 0xa8, 0x74, 0xa7, 0x4e, 0x47, 0x75, 0x3a, 0xa6,
++ 0xd3, 0x5d, 0x3a, 0xdd, 0xad, 0xd3, 0x71, 0x9d, 0xee, 0xd5, 0xfd, 0x3c,
++ 0xa0, 0xf3, 0x9f, 0xd0, 0xe9, 0x7e, 0x9d, 0x3e, 0xac, 0xd3, 0x03, 0x3a,
++ 0x7d, 0x44, 0xd3, 0x55, 0xd0, 0xe9, 0x94, 0x2e, 0x9f, 0xd1, 0x74, 0x3e,
++ 0x01, 0x7a, 0xfe, 0x71, 0xa3, 0x96, 0x5b, 0xcc, 0x37, 0x21, 0x7b, 0xa6,
++ 0x22, 0x52, 0x2c, 0x05, 0x25, 0xa7, 0xd6, 0xf3, 0xe3, 0x61, 0x89, 0x46,
++ 0x64, 0xa2, 0x1a, 0x91, 0x2b, 0x4a, 0x5c, 0x7f, 0xe4, 0x7e, 0xbd, 0xc7,
++ 0x94, 0xa7, 0xab, 0x31, 0xb9, 0x50, 0x95, 0xc0, 0x68, 0x4f, 0x93, 0x18,
++ 0x47, 0x6f, 0x96, 0x8c, 0x19, 0x90, 0xa0, 0xe2, 0x6b, 0x42, 0xb2, 0x53,
++ 0xed, 0xc8, 0x5b, 0x71, 0x91, 0xc5, 0xb0, 0xb7, 0x8e, 0x11, 0x09, 0x9e,
++ 0xe0, 0xba, 0x3c, 0x37, 0x72, 0x69, 0x36, 0x2e, 0xa1, 0xe9, 0x04, 0xfa,
++ 0x6f, 0x96, 0xf0, 0x09, 0xe9, 0x08, 0x4a, 0x57, 0xfc, 0x63, 0xa8, 0x31,
++ 0x58, 0x09, 0xc9, 0x50, 0x25, 0x80, 0xb5, 0x8a, 0x40, 0x4e, 0x9a, 0xf1,
++ 0x33, 0xf1, 0x8b, 0xe1, 0x17, 0xc7, 0xef, 0xaf, 0xd0, 0x4f, 0x87, 0xe4,
++ 0x2a, 0xec, 0x13, 0xe3, 0x96, 0x30, 0x7e, 0xc9, 0x32, 0xc7, 0x85, 0x34,
++ 0xc5, 0xe5, 0xeb, 0x3d, 0x1e, 0x4d, 0x17, 0xaa, 0x91, 0x40, 0xf6, 0xa4,
++ 0xec, 0xcf, 0x39, 0x92, 0x30, 0xec, 0xa8, 0xe4, 0xcd, 0x40, 0x62, 0x6f,
++ 0xaa, 0x4d, 0x0a, 0x63, 0x78, 0x57, 0x92, 0x8c, 0x81, 0xbe, 0xf3, 0xa6,
++ 0x8c, 0x7b, 0xef, 0x58, 0xf6, 0x7f, 0xa1, 0xaf, 0x96, 0x49, 0xc1, 0xbd,
++ 0x50, 0xfa, 0xd7, 0x78, 0x66, 0x5f, 0x2f, 0x86, 0x3c, 0x9a, 0xdf, 0x40,
++ 0x9e, 0xe5, 0xee, 0x26, 0x2f, 0xcf, 0x67, 0xd6, 0xf5, 0xc7, 0xf4, 0xe7,
++ 0xca, 0xb1, 0x7b, 0x30, 0x5f, 0x8e, 0xbf, 0x32, 0x5f, 0xd0, 0xd1, 0x1c,
++ 0xc8, 0x9d, 0x4c, 0xc8, 0xa1, 0xd2, 0x1d, 0x92, 0x75, 0x5c, 0x77, 0x8f,
++ 0x23, 0x31, 0x43, 0xba, 0xcc, 0x1c, 0xde, 0x96, 0x2b, 0x12, 0xc8, 0x96,
++ 0x7c, 0x7e, 0xb0, 0xdf, 0x10, 0xca, 0xda, 0x51, 0xbf, 0x25, 0x30, 0x78,
++ 0x12, 0xb4, 0xa7, 0xc9, 0x17, 0xc8, 0xac, 0xd3, 0x15, 0xdf, 0x8b, 0xf1,
++ 0xe6, 0x2b, 0x5d, 0xce, 0xb2, 0x98, 0xe8, 0xb3, 0x0d, 0x75, 0xc8, 0x23,
++ 0xf6, 0xc5, 0x3e, 0xd9, 0x5f, 0x33, 0xda, 0xc6, 0xf0, 0x8e, 0x34, 0xb9,
++ 0x6e, 0xd6, 0x31, 0x99, 0x97, 0x39, 0xf0, 0x6d, 0x8e, 0x7c, 0x8b, 0x76,
++ 0xc8, 0xa9, 0x0a, 0xc7, 0x58, 0x8f, 0xee, 0x5b, 0xff, 0x9e, 0xd1, 0x1d,
++ 0x47, 0xff, 0x31, 0xa4, 0x1b, 0x02, 0xd9, 0x63, 0x2e, 0xc6, 0x8f, 0xe3,
++ 0x79, 0xbd, 0x39, 0x5c, 0xd1, 0x32, 0x18, 0x07, 0xed, 0x31, 0x39, 0xa7,
++ 0xe4, 0x70, 0x83, 0x04, 0x21, 0x87, 0x5c, 0xe3, 0xd6, 0x13, 0xef, 0x91,
++ 0x7c, 0xcc, 0x4a, 0xd0, 0x76, 0x76, 0x6e, 0x6d, 0xc2, 0x1c, 0xb5, 0x15,
++ 0x9c, 0x8e, 0x41, 0x0e, 0x97, 0x5b, 0x0d, 0x94, 0x18, 0x62, 0x99, 0xff,
++ 0x48, 0x0a, 0x92, 0x5b, 0xf8, 0xbd, 0x80, 0x44, 0x0d, 0xd4, 0xbb, 0x25,
++ 0xe0, 0xf1, 0x80, 0xfc, 0xc9, 0x80, 0x3f, 0x01, 0xd1, 0xf6, 0x41, 0x3a,
++ 0x2b, 0x7c, 0xdf, 0x9b, 0x30, 0xd4, 0xbb, 0x41, 0xbc, 0x0b, 0x49, 0x72,
++ 0xab, 0xff, 0x7e, 0x10, 0xef, 0x6f, 0x96, 0x71, 0x13, 0xb4, 0x94, 0x9e,
++ 0x37, 0xb2, 0xa0, 0xf1, 0xce, 0x90, 0x9a, 0x2b, 0xea, 0x8e, 0xd7, 0xf5,
++ 0x33, 0x8e, 0x7a, 0xff, 0x0a, 0x63, 0x81, 0xde, 0x52, 0x02, 0xb4, 0xb4,
++ 0x83, 0x16, 0xd2, 0x58, 0x30, 0xb2, 0xd5, 0x10, 0xf2, 0x93, 0x46, 0xee,
++ 0xf4, 0x61, 0x3c, 0x8b, 0x69, 0xa4, 0x9f, 0x67, 0x8a, 0xf6, 0xbb, 0xeb,
++ 0xda, 0xef, 0x46, 0x7b, 0x8e, 0xc1, 0xf6, 0x9e, 0xfc, 0x17, 0x94, 0x2c,
++ 0x26, 0xae, 0xc3, 0x8f, 0xe0, 0xaf, 0xc1, 0x8f, 0x7f, 0xa3, 0xf9, 0xf1,
++ 0xd7, 0xf2, 0x9b, 0xe7, 0xc7, 0x7f, 0xfa, 0x0d, 0xf1, 0x43, 0x24, 0x7f,
++ 0x8c, 0xcf, 0x21, 0x29, 0x28, 0xbb, 0x45, 0xbd, 0xa5, 0xbc, 0xd3, 0x66,
++ 0x91, 0x4f, 0x94, 0x63, 0xe8, 0x40, 0x35, 0x84, 0xf4, 0x49, 0xa4, 0x1b,
++ 0x02, 0xa3, 0xc7, 0xae, 0x62, 0xfd, 0x5d, 0x31, 0xb7, 0xfa, 0x7e, 0xa3,
++ 0x10, 0x37, 0xa5, 0x43, 0xcc, 0x77, 0xc3, 0x69, 0xb7, 0x5b, 0x66, 0x5e,
++ 0x7e, 0x80, 0xf7, 0x6f, 0x06, 0x7c, 0xff, 0x9e, 0x9d, 0x6a, 0x7a, 0x23,
++ 0xa3, 0x9e, 0xc2, 0xe4, 0x67, 0xc6, 0x48, 0x87, 0x02, 0xb9, 0x52, 0x62,
++ 0xdc, 0x48, 0xc7, 0x60, 0xa7, 0x98, 0x1f, 0x08, 0x78, 0x34, 0xf7, 0xa3,
++ 0xae, 0x6f, 0xb3, 0x7c, 0xda, 0xfb, 0x41, 0xfb, 0x5a, 0xdb, 0x95, 0x01,
++ 0x2d, 0xa4, 0x81, 0x74, 0x15, 0x82, 0x9a, 0xf7, 0xe8, 0xe7, 0x80, 0xea,
++ 0x27, 0x98, 0x1e, 0x10, 0xfa, 0xd0, 0xfc, 0x14, 0xf5, 0x80, 0xed, 0xd8,
++ 0x97, 0x67, 0x93, 0xf3, 0x15, 0xbf, 0x8f, 0x42, 0x7d, 0x1f, 0xa0, 0x47,
++ 0x36, 0x19, 0x76, 0x18, 0x6b, 0xcf, 0xae, 0x0e, 0xe3, 0xdd, 0x97, 0x24,
++ 0x7b, 0xfa, 0x76, 0x03, 0x73, 0x40, 0xbf, 0xe4, 0xd1, 0x28, 0x6c, 0x36,
++ 0xf5, 0x2c, 0x22, 0xb9, 0x18, 0xcb, 0x3e, 0xa2, 0xc7, 0x0d, 0x49, 0x46,
++ 0xe5, 0xbf, 0xd2, 0x52, 0xa3, 0xe3, 0x79, 0x3d, 0x9f, 0x34, 0xe6, 0x43,
++ 0x1a, 0xfc, 0xb9, 0xa4, 0xeb, 0xe6, 0xe2, 0xf3, 0x9a, 0xbc, 0x30, 0x61,
++ 0xe3, 0x23, 0xda, 0x87, 0xb0, 0xdd, 0x64, 0xdd, 0xda, 0x4d, 0xa2, 0x0d,
++ 0x79, 0x8f, 0x3a, 0x6b, 0xfc, 0x0a, 0x7d, 0xca, 0x20, 0xfa, 0x29, 0xce,
++ 0x1a, 0x92, 0x73, 0xe0, 0xab, 0x9d, 0xb7, 0x69, 0x79, 0xad, 0xc9, 0x52,
++ 0x78, 0x5d, 0x59, 0x3a, 0x68, 0x78, 0xf6, 0x1a, 0xbe, 0x05, 0xfe, 0x67,
++ 0x62, 0xd6, 0x4a, 0xf9, 0xb2, 0x54, 0x9c, 0x7a, 0x2b, 0xb2, 0xe4, 0xb7,
++ 0x8f, 0x40, 0x76, 0xfd, 0x31, 0xd6, 0xd2, 0xec, 0xd7, 0x01, 0x8d, 0xa5,
++ 0xac, 0xc6, 0x28, 0x1c, 0xc7, 0xf3, 0x0d, 0x73, 0xab, 0x7c, 0xc3, 0x61,
++ 0xb4, 0x95, 0x40, 0xae, 0xa7, 0x59, 0xf6, 0xcd, 0xfa, 0x7d, 0x1c, 0x56,
++ 0x32, 0xbb, 0x77, 0xca, 0x32, 0x87, 0x82, 0x92, 0x19, 0x9a, 0x19, 0x90,
++ 0xc1, 0x6a, 0x07, 0xd6, 0xf4, 0x0d, 0x17, 0xbe, 0xf3, 0xdd, 0x61, 0xb1,
++ 0x61, 0x17, 0x31, 0xe7, 0x7e, 0xf0, 0xb8, 0x1a, 0x16, 0x23, 0xed, 0x20,
++ 0xad, 0xc7, 0x58, 0xa1, 0xd0, 0xd0, 0xaa, 0x7c, 0x03, 0xea, 0xa0, 0xef,
++ 0xfe, 0xb5, 0xf5, 0x20, 0x9f, 0xe0, 0x6d, 0xd6, 0x79, 0xd3, 0x85, 0x1f,
++ 0xd6, 0x3e, 0x8b, 0xa5, 0xb4, 0x13, 0xbe, 0x8d, 0xf8, 0x10, 0xf4, 0x5b,
++ 0xe9, 0x42, 0xc1, 0x48, 0xef, 0x47, 0x1f, 0xa2, 0xe4, 0xb4, 0x58, 0x7d,
++ 0xda, 0xd7, 0x7b, 0x55, 0xbe, 0xa3, 0x9f, 0xb2, 0x37, 0x07, 0x4c, 0xc0,
++ 0x39, 0x2d, 0x28, 0x5d, 0xcf, 0x99, 0x31, 0x99, 0x2c, 0x29, 0x4c, 0x23,
++ 0xc9, 0xca, 0x1f, 0x49, 0xee, 0xb4, 0xc8, 0x37, 0xa7, 0x58, 0xef, 0x05,
++ 0x5d, 0xef, 0x79, 0xd4, 0x4b, 0x26, 0x06, 0x03, 0x16, 0xfc, 0x80, 0x05,
++ 0x35, 0xe9, 0x4d, 0x20, 0x35, 0x87, 0xf1, 0x1b, 0xa4, 0x93, 0x41, 0x3d,
++ 0x0f, 0x03, 0x3d, 0x0f, 0x7e, 0x88, 0xdc, 0x53, 0x6a, 0x84, 0x3d, 0xf9,
++ 0x2f, 0xa0, 0x35, 0x26, 0x5f, 0xc0, 0x3c, 0x2e, 0x4d, 0x11, 0x67, 0xbd,
++ 0x20, 0x8b, 0x53, 0xc4, 0x5d, 0xcf, 0xcb, 0xe4, 0x54, 0xd2, 0xf9, 0x26,
++ 0xf8, 0x7c, 0x4a, 0x38, 0x97, 0x5e, 0x07, 0x29, 0x30, 0xa0, 0x95, 0x78,
++ 0x1c, 0xf6, 0xac, 0x67, 0xab, 0xd7, 0x5f, 0x97, 0xee, 0xcf, 0xae, 0x58,
++ 0x72, 0xc5, 0xa4, 0x7d, 0xba, 0x56, 0xc7, 0xb3, 0x5a, 0xc7, 0x47, 0x9d,
++ 0x0e, 0x31, 0xa0, 0xd7, 0x99, 0xb1, 0x02, 0xbc, 0x1f, 0xf5, 0xfa, 0x7f,
++ 0x1b, 0x35, 0xfc, 0x33, 0x00, 0xac, 0x6a, 0x29, 0x7f, 0xf7, 0xb7, 0xd3,
++ 0xf1, 0x7a, 0xdd, 0xe6, 0xf8, 0x2d, 0x68, 0x13, 0x42, 0x7a, 0x7d, 0xbd,
++ 0x46, 0x1f, 0x75, 0x6d, 0x07, 0xa8, 0x17, 0x68, 0xf3, 0x07, 0xe0, 0x05,
++ 0xf9, 0xff, 0x56, 0xf4, 0xb9, 0x37, 0xf8, 0x96, 0xf4, 0x79, 0xec, 0x7a,
++ 0xfa, 0x5c, 0xaf, 0xcb, 0x67, 0xc9, 0x0b, 0x8c, 0x2d, 0x33, 0x9e, 0x6c,
++ 0x75, 0x81, 0xd7, 0x09, 0xc8, 0x29, 0x68, 0x28, 0xfd, 0x8d, 0x9b, 0x09,
++ 0x79, 0x78, 0xce, 0x93, 0x27, 0xd6, 0xf3, 0xeb, 0x78, 0xb6, 0x77, 0xb0,
++ 0x7a, 0x45, 0xd9, 0xd9, 0x73, 0xca, 0xce, 0x5a, 0x87, 0x0b, 0x42, 0x79,
++ 0xbb, 0x2d, 0x48, 0xbe, 0x3f, 0xed, 0x7c, 0x16, 0x34, 0x5a, 0x89, 0x84,
++ 0xd1, 0x55, 0x30, 0x8c, 0xcf, 0xca, 0xfe, 0xf9, 0x87, 0x65, 0x7f, 0x89,
++ 0x7d, 0xa4, 0xf1, 0xde, 0x46, 0x59, 0x13, 0x6c, 0x2d, 0x6d, 0xfa, 0x1b,
++ 0x01, 0x6f, 0x2c, 0x03, 0xfe, 0x6b, 0x29, 0x70, 0x4f, 0xf5, 0x62, 0x20,
++ 0x3b, 0x4f, 0xdd, 0x45, 0x79, 0xb5, 0xde, 0xe6, 0xfb, 0xf6, 0xbe, 0x66,
++ 0xff, 0x06, 0x4b, 0x93, 0xc4, 0x80, 0x46, 0xd6, 0xe1, 0x9a, 0x51, 0x37,
++ 0x2f, 0x98, 0xde, 0x9c, 0x3f, 0x09, 0x3e, 0x51, 0xaf, 0xc9, 0x37, 0xf8,
++ 0xc0, 0x10, 0x75, 0x96, 0xcf, 0xe2, 0x06, 0xd3, 0xd4, 0x3b, 0x09, 0x05,
++ 0x41, 0x46, 0x2e, 0xc6, 0x3a, 0x77, 0x80, 0xce, 0xb5, 0x3a, 0xcd, 0x75,
++ 0x14, 0x6d, 0x43, 0x58, 0x36, 0x80, 0xe7, 0x4e, 0x19, 0x9f, 0xcf, 0x60,
++ 0xcc, 0x3b, 0x75, 0xdf, 0xab, 0x7c, 0x0c, 0xfa, 0x48, 0xe8, 0xf5, 0xd8,
++ 0xe0, 0xdb, 0x41, 0x94, 0x39, 0xba, 0xac, 0xa1, 0xae, 0xcc, 0x5f, 0xb7,
++ 0x8f, 0x62, 0x7c, 0xfa, 0x8a, 0x61, 0x8d, 0x7f, 0x5c, 0x37, 0xc7, 0xf5,
++ 0xee, 0xfb, 0x87, 0x42, 0xdd, 0xb8, 0x50, 0x2a, 0x98, 0x41, 0x25, 0xa3,
++ 0x2f, 0xfc, 0x4e, 0x4d, 0x46, 0x81, 0x97, 0x55, 0x2f, 0xe4, 0x31, 0x69,
++ 0x69, 0x06, 0x4f, 0x07, 0x41, 0x2b, 0x78, 0xd7, 0x1e, 0x00, 0xff, 0x9a,
++ 0x25, 0x5f, 0x4d, 0xeb, 0x77, 0x2c, 0x0f, 0xc9, 0x68, 0xcc, 0xf7, 0x47,
++ 0xb7, 0x99, 0x1e, 0xe6, 0x45, 0x9d, 0xd2, 0x8f, 0x83, 0x9e, 0x0e, 0x98,
++ 0x92, 0x3f, 0x39, 0x08, 0x59, 0x23, 0x26, 0x6b, 0x80, 0xac, 0xc5, 0x94,
++ 0xad, 0x37, 0x6c, 0xd6, 0xc7, 0xbb, 0xd3, 0xbf, 0x17, 0xf4, 0xda, 0xb0,
++ 0x9e, 0xdf, 0xc6, 0x1f, 0xbb, 0x6d, 0xa5, 0xed, 0xa8, 0x63, 0x48, 0x50,
++ 0x8d, 0x8f, 0xb2, 0xd3, 0xab, 0xc7, 0x37, 0xda, 0xfd, 0xf1, 0x1f, 0xd1,
++ 0x7d, 0xb5, 0xd5, 0xf5, 0x15, 0xbb, 0xce, 0xf8, 0x78, 0x77, 0xfa, 0xa3,
++ 0x9b, 0xbd, 0x36, 0xb1, 0xba, 0x36, 0xed, 0x6b, 0xda, 0xb0, 0xbe, 0x3f,
++ 0x06, 0xde, 0x9d, 0xbe, 0xab, 0xd9, 0x6b, 0xc3, 0x7a, 0x0d, 0xf0, 0x6d,
++ 0x7c, 0x47, 0xd9, 0xdf, 0x5f, 0x27, 0xfb, 0xfb, 0x21, 0xfb, 0xbe, 0x4c,
++ 0xad, 0xc5, 0xc9, 0x7e, 0xbc, 0xc3, 0x38, 0x87, 0xd8, 0xaa, 0x16, 0xd7,
++ 0x84, 0x4e, 0x34, 0x03, 0xb7, 0xb4, 0x30, 0x96, 0xd1, 0xb8, 0x98, 0xb1,
++ 0x0d, 0x71, 0xb0, 0xd8, 0x21, 0xe9, 0x82, 0x8d, 0xea, 0x8a, 0xef, 0xa3,
++ 0xc2, 0x55, 0x62, 0x0a, 0x2f, 0x67, 0xf4, 0x18, 0x8c, 0x6b, 0xc8, 0x77,
++ 0xe6, 0x73, 0x2b, 0x71, 0x4e, 0x07, 0xe2, 0x20, 0xe2, 0x5d, 0xe2, 0x25,
++ 0x9f, 0x7e, 0x9f, 0x9e, 0x03, 0x46, 0x4d, 0x27, 0x32, 0xc6, 0x60, 0x75,
++ 0xd0, 0xf0, 0x74, 0x82, 0xef, 0x0f, 0x68, 0x9f, 0xb6, 0x96, 0xde, 0xb7,
++ 0xaf, 0xa1, 0x97, 0xb8, 0x2a, 0x21, 0x13, 0x90, 0x91, 0xd0, 0x09, 0xda,
++ 0xd8, 0xe7, 0x46, 0x16, 0x67, 0x89, 0x1f, 0xfa, 0xc0, 0x17, 0xd2, 0x4b,
++ 0xfe, 0x51, 0x97, 0x5b, 0x60, 0x1f, 0xba, 0x52, 0x65, 0xd4, 0x67, 0x7c,
++ 0x3d, 0xae, 0xe2, 0xb2, 0x66, 0xa4, 0x08, 0x9e, 0x40, 0xeb, 0x38, 0x68,
++ 0x1d, 0xd7, 0x31, 0xd9, 0x3e, 0xd8, 0xef, 0xd0, 0xb4, 0x4f, 0xeb, 0x8d,
++ 0x21, 0x7f, 0x6d, 0x56, 0xd3, 0x5e, 0xef, 0x77, 0x3c, 0xfc, 0x75, 0x4f,
++ 0x0f, 0x65, 0xc6, 0x2a, 0x10, 0xb3, 0x8d, 0x2b, 0xf9, 0x00, 0xf6, 0x33,
++ 0xc4, 0xd3, 0xa5, 0x16, 0xdf, 0xff, 0x72, 0x3e, 0xf4, 0xff, 0xd4, 0x79,
++ 0x7f, 0x0e, 0xcd, 0xd2, 0x79, 0x82, 0x73, 0x58, 0xa1, 0x3f, 0xc6, 0xdd,
++ 0x8d, 0xfd, 0xb0, 0x9b, 0x79, 0x45, 0xeb, 0x4e, 0xd9, 0x5b, 0x7a, 0xa7,
++ 0xa6, 0xbf, 0x19, 0xf4, 0x8f, 0x42, 0xb6, 0x6b, 0x36, 0x23, 0x5f, 0x19,
++ 0x43, 0xde, 0xc3, 0x62, 0xe4, 0x71, 0xbe, 0x42, 0xfb, 0xa1, 0xe7, 0x13,
++ 0xe5, 0x7c, 0xd6, 0xda, 0x96, 0xf5, 0xf8, 0xfa, 0x8e, 0x35, 0x7c, 0x15,
++ 0xcd, 0xd7, 0x88, 0x34, 0x9c, 0x50, 0x71, 0x2d, 0xfa, 0x25, 0xaf, 0xe9,
++ 0xbf, 0x9e, 0x1b, 0x99, 0x9c, 0x95, 0xbe, 0xb0, 0x90, 0xbe, 0x38, 0xcb,
++ 0xfa, 0x1b, 0xa4, 0xcb, 0xb9, 0x88, 0x79, 0xe7, 0xb1, 0xde, 0xc6, 0xb4,
++ 0x27, 0xdf, 0xe4, 0x6f, 0xbe, 0x12, 0x45, 0x2c, 0xcd, 0xb1, 0xc9, 0x33,
++ 0xd2, 0x6f, 0x2a, 0x7a, 0x56, 0xf8, 0x0d, 0xfa, 0x3e, 0x56, 0x59, 0xcb,
++ 0xdb, 0x7a, 0x3b, 0xe3, 0xc7, 0xec, 0xdf, 0x35, 0x3d, 0xbd, 0x58, 0x2f,
++ 0x66, 0x6f, 0x86, 0x7d, 0x0c, 0xd1, 0x36, 0x82, 0xf7, 0xdc, 0x5f, 0x59,
++ 0x0a, 0x11, 0x83, 0x5f, 0x28, 0x85, 0x95, 0xcd, 0xcb, 0x3a, 0x2d, 0x5a,
++ 0x3f, 0x6e, 0xd3, 0xbe, 0x23, 0xac, 0x6c, 0xb6, 0x18, 0x26, 0x71, 0x09,
++ 0xca, 0x90, 0x9f, 0x67, 0xde, 0xa7, 0xe3, 0xde, 0x5d, 0x61, 0xfb, 0x0f,
++ 0x43, 0xbe, 0x4d, 0xa8, 0xd1, 0x55, 0x1f, 0x93, 0xbb, 0xc0, 0x72, 0xef,
++ 0x84, 0xdc, 0xde, 0x89, 0xb8, 0x3b, 0x21, 0xf9, 0x14, 0xf5, 0x68, 0x40,
++ 0xc5, 0x26, 0x86, 0xbd, 0x0f, 0x65, 0x4d, 0x28, 0x83, 0x13, 0x33, 0x31,
++ 0x7f, 0xfb, 0x77, 0x65, 0x1c, 0x32, 0x9e, 0x4f, 0xf5, 0x82, 0x0e, 0xda,
++ 0x60, 0x60, 0x1c, 0x3b, 0xc5, 0xb8, 0x1d, 0x7f, 0xfd, 0x61, 0x6f, 0x5e,
++ 0xbb, 0x90, 0x47, 0x0c, 0x9f, 0xea, 0xd4, 0x75, 0x36, 0x08, 0xf7, 0x7f,
++ 0xf2, 0x66, 0x0b, 0xd2, 0xee, 0x35, 0x75, 0xdf, 0x8f, 0xfc, 0x7b, 0x75,
++ 0xff, 0x05, 0xbc, 0xdf, 0x86, 0xdf, 0x20, 0xca, 0x6e, 0x47, 0x99, 0x83,
++ 0xb2, 0xf7, 0x20, 0xff, 0x7e, 0xbd, 0x1f, 0xe0, 0xb7, 0x69, 0x41, 0xfe,
++ 0x31, 0xbc, 0x87, 0xad, 0x30, 0x5f, 0xc6, 0xfb, 0xf7, 0xe2, 0xf7, 0xee,
++ 0x35, 0x75, 0xda, 0xd6, 0xe4, 0x3f, 0xb5, 0xc2, 0x83, 0x0b, 0xa5, 0x9f,
++ 0x69, 0xbb, 0x46, 0x79, 0x66, 0xfe, 0x94, 0x7e, 0xf7, 0xce, 0xd0, 0xea,
++ 0xf2, 0x1d, 0x7e, 0xbe, 0x6e, 0x0d, 0x3b, 0xb1, 0x86, 0x3e, 0xc6, 0x7c,
++ 0xbb, 0xf6, 0x5d, 0x6f, 0xf7, 0xe2, 0xf4, 0x92, 0xdf, 0x8e, 0x7e, 0xed,
++ 0xce, 0x35, 0x63, 0x3c, 0xdf, 0x50, 0xcb, 0x37, 0x07, 0x86, 0x4e, 0xb2,
++ 0xec, 0x72, 0xc3, 0xea, 0x3a, 0x6f, 0xd6, 0xe5, 0x37, 0x06, 0x86, 0x94,
++ 0x8f, 0xbb, 0xab, 0x71, 0x75, 0x9d, 0x64, 0x63, 0x6d, 0x1e, 0x35, 0x5b,
++ 0x18, 0x4a, 0x2f, 0x53, 0x8e, 0xa1, 0x0b, 0xdf, 0x1a, 0xc9, 0x4e, 0xb9,
++ 0xee, 0x84, 0xb3, 0x14, 0x0f, 0x0a, 0x7d, 0x10, 0xb1, 0x2a, 0xcb, 0x5f,
++ 0x46, 0x39, 0xb0, 0x4c, 0x75, 0x54, 0x68, 0x93, 0xd6, 0xc7, 0xa4, 0x09,
++ 0x8d, 0x49, 0x55, 0x36, 0x94, 0x55, 0x18, 0xf2, 0xf9, 0x11, 0x60, 0x1e,
++ 0xfd, 0xfc, 0x02, 0x9e, 0x13, 0xf5, 0xb8, 0x17, 0xfd, 0x2e, 0x8d, 0x64,
++ 0x67, 0xe9, 0xf3, 0x2e, 0x8e, 0xec, 0x99, 0xa5, 0xce, 0x5f, 0x82, 0xce,
++ 0x07, 0x64, 0x52, 0xf9, 0x3f, 0xd2, 0xc1, 0x76, 0x4b, 0x23, 0x9d, 0x0b,
++ 0x4c, 0x97, 0x47, 0xec, 0x85, 0xa0, 0xec, 0x8b, 0x79, 0x6d, 0x99, 0x4f,
++ 0x2c, 0xf8, 0x3a, 0x10, 0x95, 0x70, 0x9a, 0x32, 0x69, 0xa5, 0x80, 0xbd,
++ 0x31, 0x9f, 0x27, 0x47, 0x26, 0x6d, 0xca, 0xe7, 0x87, 0x1a, 0xa4, 0x25,
++ 0x2a, 0x0d, 0xca, 0xde, 0x3c, 0xa5, 0xc7, 0xba, 0x84, 0xb1, 0x36, 0x29,
++ 0x7d, 0xca, 0xda, 0xa1, 0x38, 0xc6, 0x39, 0x68, 0xd8, 0xbd, 0x18, 0x8f,
++ 0x91, 0x72, 0x87, 0x4c, 0x54, 0xa9, 0x37, 0xdb, 0xc2, 0xb5, 0xf8, 0xf8,
++ 0x3c, 0xda, 0xf9, 0x71, 0x19, 0xc7, 0x2b, 0x03, 0x97, 0x41, 0x96, 0xd3,
++ 0x96, 0x99, 0x0d, 0xc2, 0xcf, 0xcf, 0xfa, 0x75, 0x48, 0xd3, 0xd9, 0x91,
++ 0xe4, 0x42, 0x12, 0x7d, 0x75, 0xd0, 0x86, 0xc1, 0x76, 0x05, 0xf1, 0x63,
++ 0xdf, 0x6c, 0x07, 0x5f, 0x34, 0x40, 0x3f, 0x72, 0x1e, 0x7e, 0xa4, 0x43,
++ 0x0e, 0x95, 0x54, 0x1f, 0x09, 0xf6, 0x51, 0xd4, 0x6d, 0x3b, 0x17, 0x1a,
++ 0x10, 0xdb, 0x24, 0xcd, 0x17, 0xa5, 0xd6, 0x76, 0x48, 0xbc, 0x76, 0x5e,
++ 0xdf, 0x3f, 0x77, 0x33, 0xb1, 0x7a, 0xdd, 0x8f, 0x4a, 0x10, 0x74, 0xe4,
++ 0xd0, 0x07, 0xc7, 0xaf, 0xf5, 0xed, 0xf7, 0x97, 0x34, 0x97, 0xaf, 0xe9,
++ 0x6b, 0x93, 0x8e, 0xb9, 0xac, 0x44, 0xee, 0xd7, 0x1a, 0x5b, 0xc5, 0x00,
++ 0x90, 0x07, 0x09, 0xe5, 0x7a, 0x60, 0x17, 0xab, 0x03, 0x5a, 0x46, 0x5e,
++ 0x40, 0x59, 0x7d, 0x6c, 0xe3, 0xc9, 0x57, 0x01, 0x98, 0xae, 0x08, 0x3d,
++ 0x0f, 0xa6, 0x33, 0xad, 0xde, 0x5e, 0xd3, 0xf5, 0xe2, 0x19, 0xc8, 0x0d,
++ 0xfa, 0x2c, 0xae, 0xb4, 0xe5, 0x9c, 0x5e, 0x18, 0xb9, 0x34, 0x15, 0xc7,
++ 0x9c, 0x3c, 0xbf, 0xe0, 0xf1, 0x9a, 0x3e, 0x27, 0x20, 0x8b, 0x76, 0x02,
++ 0x71, 0x33, 0x7d, 0x7c, 0x42, 0x5e, 0xb2, 0x7d, 0xff, 0x43, 0x5f, 0x84,
++ 0xfa, 0x55, 0xd2, 0x46, 0xda, 0xcf, 0x63, 0x6e, 0xae, 0xcc, 0x38, 0x9e,
++ 0x0c, 0xf6, 0xc0, 0x8f, 0x7c, 0x23, 0x64, 0x1d, 0x66, 0x7c, 0x75, 0x25,
++ 0x54, 0x3f, 0x1f, 0x1f, 0x2b, 0x3c, 0xaf, 0xf7, 0x7e, 0xcf, 0x6b, 0x79,
++ 0x59, 0x82, 0xbc, 0xf4, 0x26, 0x4c, 0xe9, 0x06, 0xed, 0xa8, 0xd3, 0xd7,
++ 0x85, 0x38, 0x87, 0x31, 0x74, 0x1c, 0xf4, 0x98, 0xb0, 0x1d, 0x9b, 0x34,
++ 0x66, 0xff, 0x77, 0x61, 0xfa, 0xb6, 0x56, 0xb5, 0xaf, 0x7c, 0x5e, 0xc9,
++ 0xb3, 0x27, 0xdf, 0x41, 0xfd, 0xde, 0x97, 0xa9, 0x20, 0x21, 0x8d, 0xd4,
++ 0xf6, 0x4f, 0x59, 0xff, 0x39, 0x5d, 0xff, 0x59, 0xd4, 0x0f, 0x60, 0x4e,
++ 0xae, 0xbb, 0x57, 0xd1, 0xfb, 0x1c, 0xf8, 0x1e, 0x94, 0xe2, 0x8a, 0xcc,
++ 0x3f, 0x07, 0x99, 0xa7, 0x7c, 0x9f, 0x87, 0xbe, 0x82, 0xf8, 0x7b, 0x29,
++ 0xf7, 0x65, 0x19, 0x3c, 0x9d, 0x6b, 0xe0, 0x5e, 0x67, 0xc2, 0x60, 0xec,
++ 0x49, 0x99, 0xec, 0x90, 0xc7, 0x4b, 0x49, 0x73, 0xa2, 0x6e, 0x2d, 0x77,
++ 0xac, 0x5a, 0x4b, 0xca, 0x80, 0xaa, 0x9f, 0x62, 0xfd, 0x72, 0x9d, 0x0c,
++ 0xcc, 0xcf, 0x5e, 0xaf, 0x1d, 0x65, 0x80, 0xed, 0xd6, 0xc3, 0xe9, 0xdc,
++ 0x1b, 0x74, 0xdd, 0x45, 0x87, 0xfb, 0xb8, 0x8d, 0x52, 0x50, 0x32, 0x16,
++ 0x90, 0xa2, 0x43, 0xbd, 0xca, 0x26, 0x42, 0x62, 0x01, 0x2b, 0x7d, 0x10,
++ 0x74, 0x66, 0x52, 0x61, 0xf1, 0xf6, 0x12, 0xc6, 0xb1, 0x06, 0x4b, 0xa6,
++ 0xeb, 0x5e, 0xb2, 0x45, 0xca, 0x88, 0x3d, 0x17, 0x91, 0x16, 0x2b, 0xd0,
++ 0xd9, 0x68, 0x08, 0x36, 0xc0, 0x97, 0xf1, 0x88, 0xcc, 0xa1, 0xce, 0x3c,
++ 0xde, 0x3d, 0x5e, 0xf1, 0x25, 0xc6, 0x75, 0x0d, 0xf0, 0x68, 0x8f, 0xfd,
++ 0xff, 0xdc, 0x7c, 0xac, 0xbe, 0xae, 0x8f, 0x89, 0x89, 0x65, 0x89, 0x4d,
++ 0x89, 0x29, 0xf9, 0x8e, 0x38, 0xf1, 0x20, 0x68, 0xa1, 0xce, 0xb6, 0x48,
++ 0x24, 0x6d, 0xc5, 0x87, 0xc5, 0xf7, 0xfd, 0x97, 0x21, 0x4b, 0x05, 0xb7,
++ 0xd1, 0xee, 0x90, 0x67, 0x20, 0x37, 0xe7, 0x57, 0x70, 0x4c, 0x02, 0x72,
++ 0x44, 0x3f, 0xea, 0xca, 0x39, 0xc7, 0x4e, 0x7c, 0x0e, 0xe9, 0xb7, 0x9d,
++ 0xdf, 0x22, 0xdf, 0x9e, 0x10, 0xe9, 0x43, 0x2c, 0x04, 0xbb, 0x3e, 0xe3,
++ 0x63, 0xfb, 0x16, 0xc6, 0x64, 0x5a, 0x96, 0xae, 0xa0, 0x4f, 0xcb, 0x34,
++ 0x00, 0x6a, 0xef, 0x42, 0x3d, 0x4f, 0x37, 0xfc, 0xb2, 0x83, 0xa8, 0x4b,
++ 0x1a, 0x18, 0x2f, 0x7f, 0x07, 0x3a, 0xeb, 0xba, 0xf7, 0x39, 0x8b, 0x75,
++ 0xb6, 0xe6, 0x39, 0xac, 0xbf, 0x92, 0xf3, 0xfe, 0x56, 0xe1, 0xfe, 0xaa,
++ 0xf4, 0xb5, 0xa9, 0x78, 0x8e, 0xcf, 0x90, 0xf7, 0x7e, 0x62, 0xa1, 0x84,
++ 0xc2, 0x9a, 0xc4, 0x0d, 0xe7, 0xc1, 0xfb, 0x4f, 0x2a, 0x4c, 0x43, 0xfc,
++ 0x06, 0xfa, 0x4b, 0xc4, 0x14, 0x1e, 0x96, 0xf6, 0x70, 0x1d, 0xb1, 0x45,
++ 0x0a, 0x6b, 0xe3, 0xe3, 0x0b, 0xb6, 0x65, 0x3d, 0xb6, 0xad, 0x5f, 0x3f,
++ 0xd6, 0xd9, 0x14, 0xc8, 0x1d, 0xa3, 0x3c, 0xd3, 0x3f, 0xb6, 0xca, 0xbe,
++ 0x54, 0x23, 0xf8, 0xde, 0xa6, 0xfd, 0xf8, 0xfb, 0x80, 0xd9, 0x80, 0xbd,
++ 0x4d, 0xcb, 0xa9, 0xd9, 0x9e, 0xf7, 0xa0, 0xec, 0x17, 0xe0, 0x3f, 0xcb,
++ 0xf6, 0x37, 0x78, 0x7e, 0xf2, 0x61, 0xe8, 0xf2, 0xdc, 0x26, 0x6f, 0xef,
++ 0x8a, 0xeb, 0xe0, 0xe3, 0x04, 0x1f, 0xf7, 0x99, 0x1a, 0xef, 0x73, 0x6d,
++ 0xbc, 0x7d, 0x2e, 0x43, 0xd5, 0x65, 0xac, 0x55, 0x1f, 0x5b, 0x52, 0x87,
++ 0x5d, 0xf7, 0x9c, 0xe3, 0xe3, 0xc8, 0xed, 0xf0, 0xa1, 0x21, 0xcd, 0xeb,
++ 0x66, 0xf0, 0x9a, 0x18, 0x25, 0x22, 0x89, 0x36, 0x62, 0x8a, 0x07, 0x1b,
++ 0x6a, 0x58, 0xe6, 0x6f, 0xdc, 0xa0, 0xcd, 0x78, 0x8f, 0x38, 0x86, 0xb4,
++ 0x6f, 0xd7, 0x78, 0x86, 0xd8, 0xe6, 0x31, 0x8c, 0x11, 0x94, 0x44, 0x3b,
++ 0xf3, 0x7f, 0xa9, 0xdb, 0xf0, 0xd9, 0x95, 0xee, 0xad, 0xf5, 0xf2, 0x3c,
++ 0x00, 0x3a, 0x39, 0x1f, 0x7f, 0xef, 0xb5, 0x43, 0xd9, 0x93, 0x9a, 0x5c,
++ 0xf8, 0x34, 0xf9, 0xe3, 0x92, 0xb6, 0xb8, 0xb4, 0x81, 0xb6, 0x7b, 0xe0,
++ 0x53, 0xb6, 0xb6, 0xb1, 0x4f, 0x7f, 0xec, 0x7a, 0x9a, 0xea, 0xf1, 0x55,
++ 0x02, 0x63, 0x34, 0xca, 0xd6, 0x76, 0xf2, 0xae, 0x43, 0xf9, 0x96, 0xda,
++ 0x7a, 0xd0, 0xf7, 0x73, 0xec, 0xb5, 0xe5, 0xef, 0xad, 0xa3, 0x6b, 0x2d,
++ 0xe6, 0xdb, 0x86, 0x77, 0xa4, 0xc9, 0x84, 0x5d, 0x72, 0x65, 0x87, 0xe3,
++ 0xe3, 0xbb, 0x7a, 0x3a, 0x88, 0xf1, 0x48, 0x33, 0x69, 0xf0, 0x31, 0x39,
++ 0x7f, 0x5c, 0x1b, 0xd2, 0x93, 0xd6, 0xe7, 0x44, 0xfb, 0xf5, 0xbc, 0x6e,
++ 0xd3, 0x75, 0x92, 0x68, 0xfb, 0xc7, 0x98, 0x03, 0x9f, 0x39, 0x0f, 0x1f,
++ 0x1b, 0x26, 0xbd, 0x7e, 0xa2, 0xeb, 0xc5, 0x00, 0xd4, 0x19, 0x9f, 0x4f,
++ 0x6d, 0x7a, 0x8d, 0xb6, 0xaf, 0x19, 0xd7, 0x72, 0x56, 0xdb, 0x91, 0xf7,
++ 0xd4, 0xcd, 0xaf, 0x4f, 0x0a, 0xf3, 0x94, 0x8b, 0x77, 0x21, 0xf5, 0x63,
++ 0xa3, 0x7e, 0xf8, 0x91, 0x0c, 0x62, 0x21, 0xc6, 0x48, 0xd7, 0xc4, 0x47,
++ 0x3c, 0x47, 0x1c, 0xcb, 0x23, 0x5e, 0x56, 0x7e, 0xc4, 0xf3, 0x91, 0xc8,
++ 0xc3, 0x9e, 0x54, 0xef, 0xa5, 0x8c, 0x8d, 0x8d, 0x57, 0x9c, 0xb1, 0xbd,
++ 0x95, 0xfe, 0x31, 0xc6, 0x11, 0x9e, 0xcc, 0xa1, 0x7e, 0x45, 0xc6, 0x0d,
++ 0xb4, 0xcb, 0xaa, 0x76, 0x6a, 0x1f, 0x68, 0x9d, 0x7e, 0x84, 0xfa, 0x38,
++ 0xee, 0x8d, 0x15, 0x19, 0xcb, 0xc1, 0x06, 0xcd, 0xcf, 0xc0, 0xc7, 0xd9,
++ 0x56, 0x86, 0x72, 0xb9, 0xc7, 0xb1, 0x86, 0x95, 0xec, 0xc5, 0xac, 0x51,
++ 0xae, 0x65, 0x79, 0xe6, 0x1d, 0xb0, 0xa1, 0xae, 0xdc, 0x0d, 0x5b, 0xf8,
++ 0x10, 0x64, 0x55, 0xce, 0xc0, 0x10, 0x9e, 0x81, 0xf1, 0x3a, 0x13, 0x13,
++ 0xe3, 0x78, 0x87, 0x84, 0x8f, 0xc4, 0x25, 0x74, 0x84, 0xb1, 0x58, 0xd2,
++ 0xbc, 0x5b, 0x04, 0x3e, 0xf1, 0xc5, 0xdb, 0x0d, 0xb1, 0x06, 0x32, 0x92,
++ 0x44, 0x3c, 0xd9, 0x6b, 0x96, 0x91, 0x16, 0x25, 0x99, 0x3a, 0x8d, 0xbe,
++ 0xc2, 0x67, 0x50, 0x17, 0xed, 0x9a, 0x16, 0x13, 0xf8, 0xb5, 0x4b, 0x74,
++ 0xd1, 0xd3, 0x95, 0xe8, 0xe2, 0xea, 0x3d, 0x94, 0xc1, 0x95, 0x3d, 0x14,
++ 0xbe, 0x7f, 0x43, 0xef, 0xfd, 0x3c, 0xab, 0xe3, 0x1a, 0xca, 0x08, 0x7d,
++ 0x9b, 0x8a, 0xcd, 0x60, 0xc7, 0x9f, 0x45, 0x2c, 0x6c, 0x4b, 0xae, 0x04,
++ 0xcc, 0x9e, 0x76, 0xe5, 0x29, 0xa7, 0xe0, 0x66, 0xfb, 0x5d, 0xb9, 0xec,
++ 0xd8, 0x85, 0xbc, 0x58, 0x6f, 0xd0, 0xde, 0xfd, 0x4f, 0xe7, 0xfd, 0xb2,
++ 0xab, 0xd5, 0xda, 0x95, 0x09, 0x14, 0xdc, 0x66, 0x3b, 0x2a, 0x37, 0xa5,
++ 0x0f, 0xca, 0x9e, 0x2d, 0x4b, 0x66, 0x50, 0x32, 0x37, 0x01, 0x17, 0xc6,
++ 0xf3, 0xca, 0x56, 0xbd, 0xa6, 0xe2, 0xeb, 0x07, 0xba, 0x0e, 0xca, 0xc6,
++ 0x2d, 0x96, 0x79, 0x35, 0x48, 0xcc, 0x76, 0x10, 0xb1, 0x80, 0x15, 0xcf,
++ 0x05, 0x6d, 0x73, 0xa7, 0x58, 0xc3, 0x9f, 0x16, 0x9e, 0xdb, 0xda, 0xd2,
++ 0x79, 0xc4, 0x8e, 0x7f, 0x22, 0xd0, 0xbd, 0xff, 0x13, 0x8c, 0xef, 0xce,
++ 0x30, 0xef, 0x4a, 0x64, 0x8b, 0x89, 0xe7, 0x98, 0x74, 0x1e, 0x4f, 0x48,
++ 0x12, 0x7c, 0xe9, 0x51, 0x3c, 0xe1, 0xf9, 0x51, 0x5c, 0xba, 0x8f, 0x10,
++ 0x43, 0x29, 0xde, 0xf4, 0x80, 0x37, 0x29, 0xf0, 0x06, 0x31, 0x55, 0xaf,
++ 0x79, 0x15, 0xe9, 0xb2, 0x24, 0x07, 0x7e, 0x00, 0xde, 0xf4, 0x80, 0x37,
++ 0xdd, 0x67, 0x12, 0x68, 0x8f, 0x3e, 0x16, 0x3b, 0x91, 0x46, 0xe5, 0x83,
++ 0x37, 0xb4, 0xe3, 0xd9, 0x96, 0xe4, 0x91, 0x08, 0xc6, 0x08, 0xc8, 0x8e,
++ 0xae, 0x82, 0x0c, 0x6d, 0x41, 0x6c, 0x16, 0x3b, 0x28, 0x17, 0xe1, 0x87,
++ 0x4a, 0x88, 0x11, 0x9e, 0x1a, 0xb0, 0x46, 0x97, 0x60, 0x4b, 0xab, 0xf7,
++ 0xb8, 0xf2, 0xf2, 0x96, 0xbf, 0x70, 0xe3, 0x37, 0x58, 0xbb, 0x24, 0xd0,
++ 0x2f, 0x93, 0x25, 0xe5, 0x1f, 0xe2, 0xd9, 0xa0, 0xc2, 0x65, 0x98, 0x63,
++ 0x01, 0x3e, 0x86, 0xe7, 0xd1, 0x36, 0x6c, 0xfd, 0xa7, 0xe5, 0xa1, 0xb9,
++ 0x09, 0xfc, 0x10, 0x6f, 0x4e, 0xb1, 0xee, 0x7e, 0xc4, 0x73, 0x0f, 0xcb,
++ 0xbe, 0x29, 0x60, 0xc7, 0x34, 0xe8, 0xee, 0xb7, 0x11, 0xcf, 0xcd, 0x37,
++ 0x4a, 0x0b, 0xca, 0xc0, 0xdb, 0xd1, 0xea, 0xda, 0x38, 0x6e, 0x09, 0xeb,
++ 0x30, 0x20, 0x7f, 0x56, 0xed, 0x97, 0xaf, 0x55, 0xfb, 0xe4, 0x4f, 0xe0,
++ 0x5b, 0xce, 0x57, 0x3b, 0xa0, 0x2b, 0x71, 0xac, 0x49, 0x1a, 0xeb, 0xe3,
++ 0xc8, 0x73, 0xd5, 0x94, 0x3c, 0x0b, 0x5e, 0x3d, 0x83, 0xdf, 0x50, 0x29,
++ 0x25, 0x3b, 0x4a, 0x7d, 0x7a, 0x8d, 0xb8, 0x3e, 0x36, 0xe8, 0xb1, 0x31,
++ 0x77, 0xeb, 0xc9, 0x02, 0xf4, 0x6f, 0xbe, 0x6a, 0xbf, 0x5e, 0x96, 0x8f,
++ 0x37, 0x72, 0x8f, 0xf7, 0xd4, 0x8a, 0x7f, 0x29, 0xb8, 0xa6, 0x6d, 0x1d,
++ 0x1e, 0xc7, 0x3a, 0x94, 0xa1, 0xa7, 0xa3, 0x8a, 0xf7, 0x35, 0xdf, 0x53,
++ 0xf6, 0x7c, 0x8f, 0x3f, 0xbf, 0x99, 0xbc, 0x7c, 0x5b, 0xb2, 0x47, 0x27,
++ 0x65, 0xcf, 0x31, 0x57, 0x3e, 0xec, 0xb8, 0x90, 0x63, 0xda, 0xe2, 0x7e,
++ 0xda, 0xf8, 0xc4, 0x78, 0xd0, 0x50, 0xb1, 0x94, 0x87, 0x5b, 0x7a, 0x37,
++ 0x43, 0x67, 0x53, 0x19, 0x63, 0x42, 0x92, 0x47, 0x27, 0xa4, 0xf3, 0x28,
++ 0x64, 0xc1, 0x61, 0x5f, 0x4b, 0xa6, 0x71, 0x8d, 0x3c, 0x70, 0x1c, 0x6b,
++ 0x20, 0x27, 0xb6, 0xf9, 0xba, 0xa4, 0x30, 0xfe, 0x01, 0xe9, 0x42, 0x1b,
++ 0x1b, 0x6d, 0xae, 0xaa, 0xb1, 0x9b, 0x31, 0x76, 0xa3, 0x1c, 0x8a, 0x59,
++ 0x90, 0x35, 0xfa, 0xf0, 0xff, 0x25, 0xd9, 0x32, 0xd3, 0x9f, 0x4a, 0xf6,
++ 0xd4, 0x47, 0x23, 0x12, 0xe5, 0x33, 0x4c, 0xc3, 0x09, 0x96, 0x77, 0x22,
++ 0x65, 0xb9, 0x8d, 0x38, 0xfa, 0xe7, 0x92, 0x3d, 0xcb, 0xb1, 0x5f, 0x47,
++ 0xf9, 0xcb, 0x92, 0x9d, 0xfe, 0x05, 0xf2, 0x17, 0x91, 0xbe, 0x81, 0x74,
++ 0x54, 0x3a, 0xa7, 0x25, 0x90, 0x3d, 0xfb, 0x2d, 0xe4, 0x43, 0x48, 0x0f,
++ 0xa1, 0xde, 0x76, 0xd0, 0xf7, 0xa7, 0xe8, 0x2f, 0x03, 0x9b, 0xf7, 0x3b,
++ 0x9a, 0x7e, 0x96, 0xb3, 0x8c, 0xef, 0x0e, 0xc1, 0xa6, 0xfd, 0x67, 0xd8,
++ 0x34, 0xfd, 0x3c, 0xcf, 0x3c, 0x6d, 0x1b, 0x9f, 0x27, 0xc0, 0x93, 0x03,
++ 0xc8, 0xbb, 0xf2, 0xb0, 0x43, 0x7f, 0xb3, 0x4d, 0xc6, 0xcc, 0x82, 0x1b,
++ 0x05, 0xae, 0x68, 0x86, 0x1e, 0x4c, 0x6c, 0x5d, 0x5f, 0x0f, 0x0e, 0x77,
++ 0x1f, 0x94, 0xa6, 0x2d, 0xfe, 0xfc, 0xfd, 0xf9, 0xda, 0xe6, 0x4f, 0x14,
++ 0x1f, 0xac, 0xc2, 0x27, 0x84, 0xf3, 0xb0, 0xe3, 0x5f, 0x30, 0xba, 0x77,
++ 0x3d, 0x04, 0x3d, 0x30, 0xce, 0x32, 0xef, 0xe9, 0x81, 0x71, 0x16, 0xb6,
++ 0xe1, 0x04, 0x62, 0xc4, 0x13, 0x1d, 0xd2, 0x38, 0x5d, 0xd3, 0x83, 0x86,
++ 0xe9, 0x5f, 0xad, 0x07, 0x8d, 0x67, 0x51, 0xef, 0x2c, 0x79, 0x86, 0x3e,
++ 0x4e, 0x91, 0x67, 0xed, 0x48, 0x3f, 0x8d, 0xb9, 0x92, 0xf6, 0x46, 0xd0,
++ 0xee, 0xe1, 0xa2, 0xdb, 0x21, 0xef, 0x0f, 0x6c, 0x39, 0xa0, 0xcb, 0xff,
++ 0xd2, 0x1d, 0x8e, 0x59, 0x73, 0x12, 0x20, 0x4f, 0x51, 0xb7, 0x4c, 0x1e,
++ 0xde, 0xdc, 0x24, 0xd1, 0xfd, 0xd2, 0x49, 0xfe, 0x95, 0x77, 0x22, 0x5f,
++ 0x70, 0xc3, 0x76, 0xb3, 0xe6, 0x27, 0x70, 0x52, 0x3f, 0xcb, 0x5f, 0x85,
++ 0xcc, 0x10, 0xaf, 0xbe, 0x26, 0x7b, 0xa6, 0x5c, 0x19, 0x73, 0x38, 0xff,
++ 0xef, 0x63, 0xfe, 0x99, 0x2d, 0x31, 0x59, 0x4a, 0xc4, 0xc0, 0x93, 0x79,
++ 0xd8, 0xf6, 0x8b, 0xe2, 0xf1, 0x81, 0xe7, 0x02, 0x3b, 0xc4, 0x8e, 0x0f,
++ 0x89, 0x9d, 0xfa, 0x01, 0xf8, 0x30, 0x04, 0xd9, 0xcf, 0x55, 0x29, 0x3b,
++ 0xaf, 0xc8, 0x20, 0x64, 0xe2, 0x7b, 0x8e, 0x95, 0x02, 0x16, 0x82, 0xbd,
++ 0xa0, 0x5c, 0x50, 0x26, 0x5a, 0x94, 0x4d, 0x3a, 0xe1, 0x58, 0x4f, 0x94,
++ 0xe5, 0x56, 0x39, 0xd1, 0x46, 0xda, 0xf1, 0x6e, 0x5a, 0xf9, 0x8b, 0xd4,
++ 0xb8, 0xd1, 0x05, 0x1b, 0x9d, 0x12, 0xb3, 0xbb, 0xd8, 0xe8, 0xdf, 0x21,
++ 0xc9, 0x1f, 0x0d, 0xc8, 0x44, 0x37, 0xd7, 0x8a, 0xfd, 0x22, 0x5f, 0x2e,
++ 0xb8, 0x21, 0xfb, 0x75, 0xf7, 0x64, 0x7b, 0x42, 0x3e, 0xd9, 0xbd, 0x22,
++ 0x97, 0x73, 0x22, 0x9e, 0x5e, 0x0c, 0xaa, 0xf5, 0xf0, 0xe9, 0xf6, 0xe7,
++ 0xe2, 0xbf, 0xeb, 0xab, 0x7b, 0xc7, 0xb9, 0x50, 0xd6, 0x57, 0x74, 0x27,
++ 0x71, 0x2d, 0xad, 0xaf, 0x41, 0x9e, 0xac, 0x27, 0x8a, 0x72, 0x19, 0xb2,
++ 0x07, 0x1e, 0x9e, 0x65, 0x4a, 0x1e, 0x4e, 0x40, 0xee, 0x5f, 0x95, 0x1d,
++ 0x47, 0xa9, 0x33, 0xaf, 0x62, 0xae, 0xca, 0x96, 0xc0, 0x46, 0xb0, 0x3f,
++ 0x57, 0x26, 0x9d, 0xae, 0xd4, 0x29, 0xb9, 0x35, 0xbe, 0x17, 0x31, 0xe7,
++ 0xb8, 0xe9, 0xca, 0xa2, 0x53, 0x90, 0xc5, 0x01, 0xb4, 0x29, 0x7f, 0x1a,
++ 0xbf, 0x4f, 0xe9, 0xb9, 0x3d, 0x0a, 0xbe, 0x5b, 0x89, 0x39, 0xe3, 0xf7,
++ 0xc1, 0xf7, 0x87, 0x25, 0x39, 0xbd, 0x62, 0x6b, 0x20, 0x77, 0x9e, 0xad,
++ 0x49, 0x9e, 0x35, 0xa5, 0x5c, 0xb2, 0xe5, 0x23, 0xb4, 0x21, 0x25, 0xce,
++ 0x0b, 0x36, 0x86, 0x67, 0xec, 0x25, 0xd8, 0x99, 0x12, 0x6c, 0x0a, 0x6c,
++ 0xc8, 0x9f, 0xa0, 0xfc, 0x59, 0xd4, 0x79, 0x06, 0xf1, 0xd3, 0x79, 0x60,
++ 0xbf, 0x73, 0xc0, 0x14, 0x4f, 0x97, 0x32, 0x3a, 0x96, 0x55, 0xf3, 0x85,
++ 0xcf, 0x52, 0xb1, 0x8f, 0x94, 0xe7, 0xd4, 0x7d, 0x1e, 0xb5, 0xb6, 0x59,
++ 0x67, 0x13, 0x71, 0x16, 0x28, 0x13, 0x99, 0x9b, 0xf3, 0x79, 0x42, 0xdb,
++ 0xc7, 0xf3, 0x19, 0xdf, 0x56, 0x36, 0xaf, 0xb1, 0x95, 0x22, 0x2f, 0x56,
++ 0x3c, 0x3c, 0x49, 0x7c, 0x5c, 0x9c, 0x4a, 0xac, 0x9c, 0x63, 0x16, 0xe1,
++ 0x37, 0x97, 0x11, 0x67, 0x44, 0xd2, 0xdf, 0x94, 0xc8, 0x71, 0xd7, 0xfd,
++ 0x21, 0xfc, 0x66, 0x01, 0x6b, 0x62, 0x04, 0x50, 0xbe, 0xc0, 0x77, 0x94,
++ 0x7b, 0xca, 0x76, 0x80, 0xe7, 0x19, 0xf2, 0x12, 0xca, 0xca, 0x2a, 0xfe,
++ 0xfa, 0x16, 0xe8, 0xd1, 0xf4, 0xa9, 0x32, 0xd6, 0x6b, 0x94, 0xdc, 0x58,
++ 0x0a, 0x31, 0x4e, 0xaf, 0xd9, 0x88, 0xf6, 0x73, 0x0b, 0x6c, 0x63, 0x0d,
++ 0xf0, 0x3a, 0xd5, 0x4b, 0x0b, 0x2c, 0xef, 0x90, 0x8b, 0x88, 0x45, 0x49,
++ 0x43, 0x79, 0x36, 0x2d, 0xde, 0xde, 0x31, 0xed, 0x15, 0x69, 0x45, 0x1e,
++ 0xfc, 0xca, 0x96, 0xe8, 0x67, 0x43, 0x52, 0x88, 0x93, 0xd7, 0x71, 0x59,
++ 0x9e, 0xfa, 0x4c, 0x13, 0xf7, 0x66, 0xb3, 0x36, 0x9f, 0xfd, 0xbd, 0x0e,
++ 0xf3, 0x2d, 0xec, 0x75, 0x70, 0x7f, 0x23, 0x04, 0x5f, 0xa6, 0xf6, 0x3c,
++ 0x90, 0x26, 0xea, 0xe2, 0x5f, 0xbe, 0xf7, 0xb0, 0x51, 0x0d, 0x3f, 0x12,
++ 0x4f, 0x72, 0xbe, 0x56, 0x61, 0x09, 0xf6, 0xa3, 0x2d, 0x7d, 0x49, 0xee,
++ 0x3d, 0xe1, 0xcd, 0xcf, 0x38, 0x25, 0xbc, 0x4b, 0x23, 0x57, 0x67, 0x2d,
++ 0xe7, 0x0a, 0x30, 0x45, 0x2e, 0xe6, 0x60, 0xbd, 0x46, 0x9b, 0x60, 0xbf,
++ 0x06, 0x32, 0xc6, 0x99, 0x26, 0x0f, 0x9f, 0x85, 0x64, 0x62, 0x8a, 0xe7,
++ 0x9e, 0xb0, 0x6d, 0xc0, 0x90, 0xbf, 0x1b, 0xc2, 0x73, 0x85, 0x79, 0xc4,
++ 0xa4, 0x5e, 0x3c, 0x8b, 0x67, 0xaf, 0x3f, 0xf2, 0xdc, 0x38, 0xc1, 0xb9,
++ 0x07, 0xe4, 0x5e, 0xa0, 0x13, 0x41, 0xff, 0x9d, 0x7a, 0xac, 0xce, 0x53,
++ 0x29, 0xee, 0x65, 0x4b, 0x12, 0xf6, 0x22, 0x8b, 0x58, 0x32, 0x17, 0xeb,
++ 0xd0, 0xd8, 0x9c, 0xef, 0xd6, 0x62, 0x4f, 0x3f, 0xc6, 0x4b, 0xc9, 0xe7,
++ 0x4b, 0x3e, 0xd6, 0x4b, 0xc1, 0xc7, 0x4a, 0x68, 0xb8, 0xc7, 0x95, 0x1f,
++ 0x3a, 0xe4, 0x57, 0x1f, 0xf2, 0x8e, 0x1c, 0xae, 0xfe, 0xb2, 0xf3, 0xcd,
++ 0xfa, 0xbf, 0x66, 0xd0, 0xc8, 0x1f, 0xe8, 0x03, 0x3e, 0x22, 0xed, 0x06,
++ 0xfc, 0x79, 0x11, 0xb8, 0xcb, 0x38, 0xd3, 0xa1, 0xde, 0x19, 0xc0, 0x06,
++ 0xe5, 0x29, 0xd8, 0xc6, 0x33, 0x3c, 0xf3, 0x85, 0x6d, 0x3b, 0x13, 0x96,
++ 0xe2, 0x0c, 0xe5, 0x52, 0xda, 0x0c, 0xac, 0x17, 0xeb, 0x97, 0xa7, 0x3a,
++ 0x90, 0x36, 0x23, 0x4d, 0xa8, 0x7e, 0xca, 0x53, 0xb6, 0x6a, 0x5f, 0x9e,
++ 0x4a, 0xa9, 0x76, 0xe5, 0xa9, 0x3e, 0xa4, 0x8e, 0x34, 0x9c, 0x41, 0xe0,
++ 0x74, 0xa6, 0x5b, 0x26, 0x4e, 0xc2, 0xbf, 0xf4, 0x1b, 0xea, 0xbe, 0xc4,
++ 0x38, 0xfc, 0x4f, 0x08, 0x51, 0xd6, 0x15, 0x73, 0x00, 0x18, 0x6b, 0x1b,
++ 0x30, 0xc8, 0x36, 0xb1, 0x8f, 0x73, 0xfe, 0xb4, 0xbd, 0xcb, 0xdc, 0xff,
++ 0x8a, 0x3f, 0x28, 0x19, 0xd9, 0x37, 0xd3, 0x08, 0x7d, 0x0d, 0x99, 0x45,
++ 0xe9, 0x32, 0x87, 0x90, 0xcf, 0xcf, 0x91, 0x6f, 0xf7, 0xab, 0xd8, 0x2d,
++ 0xeb, 0xc4, 0xa2, 0x12, 0x4d, 0x63, 0x8c, 0xb7, 0xd2, 0xbe, 0x07, 0xf2,
++ 0x67, 0xeb, 0x3e, 0xd2, 0xa0, 0xa7, 0x9e, 0x1f, 0x3c, 0xeb, 0xcd, 0xfc,
++ 0x8a, 0xb3, 0x5e, 0xca, 0x35, 0xf9, 0x7b, 0xbf, 0x2c, 0xdb, 0x69, 0x79,
++ 0xc9, 0x4e, 0xc9, 0x45, 0x7b, 0xab, 0xfc, 0x39, 0xfc, 0xf4, 0x25, 0x7b,
++ 0xba, 0x89, 0x58, 0xa0, 0xac, 0xce, 0xcf, 0xfc, 0xb5, 0xb2, 0xf5, 0x3e,
++ 0xfa, 0x8f, 0x64, 0x71, 0x8a, 0xd8, 0xd9, 0xdd, 0xbe, 0xc7, 0x29, 0xd0,
++ 0x6f, 0x81, 0x06, 0x62, 0xb5, 0x02, 0xfc, 0xdf, 0x41, 0x19, 0x72, 0xe8,
++ 0xf7, 0x94, 0x8f, 0x8a, 0x0f, 0x79, 0xfa, 0xec, 0xe4, 0x61, 0x57, 0x97,
++ 0x67, 0xa0, 0x4f, 0x42, 0xf9, 0xc7, 0xf3, 0x1c, 0xd7, 0xdd, 0x96, 0x2f,
++ 0x94, 0x38, 0xcf, 0xe2, 0xe6, 0xa8, 0x04, 0x65, 0x58, 0xe1, 0x85, 0x16,
++ 0x79, 0x71, 0x61, 0x83, 0x18, 0xf0, 0x50, 0xc6, 0x2d, 0x61, 0x75, 0xd3,
++ 0x84, 0xf1, 0xb7, 0xb4, 0xf2, 0xbe, 0xd8, 0x87, 0xc1, 0x1b, 0xee, 0x05,
++ 0x60, 0x6e, 0xad, 0x9c, 0x89, 0x9f, 0xef, 0x83, 0x7e, 0xf1, 0x39, 0x20,
++ 0x39, 0x3b, 0x86, 0x67, 0xa6, 0xd4, 0x39, 0xee, 0x93, 0x05, 0xc5, 0xc3,
++ 0xdc, 0xe3, 0xea, 0x7d, 0xa3, 0x7d, 0x07, 0x70, 0x1d, 0xe5, 0x15, 0xe9,
++ 0xa2, 0x37, 0x6e, 0x0e, 0x38, 0x2e, 0xdf, 0xd7, 0xa4, 0xce, 0xff, 0x0a,
++ 0xd0, 0x85, 0x71, 0x55, 0xbf, 0x5f, 0x2e, 0x4d, 0xed, 0x8f, 0x7a, 0xfa,
++ 0x31, 0xa0, 0x9f, 0xf9, 0x9e, 0xf1, 0x15, 0xf7, 0x4b, 0x5e, 0x19, 0x99,
++ 0xb4, 0xbf, 0xa1, 0xf5, 0x47, 0x02, 0x77, 0xf7, 0x00, 0x87, 0x1e, 0x69,
++ 0xc0, 0x5c, 0xac, 0x44, 0x22, 0x60, 0xb4, 0x1b, 0xc0, 0xf1, 0x43, 0xca,
++ 0xe7, 0xf6, 0xa8, 0xfd, 0xe8, 0x53, 0xa9, 0x16, 0x29, 0x9b, 0xb6, 0xba,
++ 0x17, 0xb7, 0x64, 0x6e, 0x21, 0xd6, 0xc7, 0xaf, 0x09, 0x65, 0x5d, 0x48,
++ 0x1b, 0x91, 0xbe, 0x4b, 0x8a, 0xc7, 0xa6, 0xf5, 0x78, 0xe1, 0x35, 0xf9,
++ 0x3e, 0x9d, 0x7e, 0x44, 0xc7, 0x53, 0x1c, 0x27, 0x2c, 0xf6, 0x17, 0x9b,
++ 0xa5, 0xeb, 0x88, 0x09, 0x6c, 0x1b, 0x07, 0xd6, 0xed, 0x90, 0xd4, 0x91,
++ 0x84, 0xdc, 0x72, 0xc4, 0xdf, 0x73, 0xfa, 0x0f, 0x23, 0x49, 0xb5, 0xc7,
++ 0xf9, 0xdd, 0x11, 0x7b, 0x8e, 0xe9, 0x6b, 0xfa, 0xfe, 0xde, 0x15, 0x7d,
++ 0xaf, 0xef, 0x47, 0x23, 0x3d, 0x2a, 0xfd, 0x6f, 0x23, 0x29, 0x95, 0xbe,
++ 0x3e, 0x72, 0x4b, 0xc5, 0x8b, 0x8f, 0x8a, 0xf3, 0x29, 0xf9, 0x5c, 0x89,
++ 0xf8, 0xb2, 0x1f, 0xd8, 0xd1, 0x81, 0x9d, 0xe9, 0x83, 0x9d, 0x49, 0xc1,
++ 0xce, 0x0c, 0xd0, 0xce, 0xc0, 0x6e, 0xbf, 0x02, 0xbb, 0xed, 0xc8, 0xf7,
++ 0x20, 0xaf, 0x4f, 0x3b, 0x8d, 0xc0, 0x85, 0xae, 0xeb, 0xcd, 0xd5, 0x7a,
++ 0x62, 0x09, 0xeb, 0x5b, 0x3e, 0x2d, 0x91, 0x56, 0xd8, 0xa0, 0x2d, 0x27,
++ 0x1a, 0x64, 0x3e, 0xe6, 0xba, 0x47, 0x1d, 0x5b, 0xae, 0xa2, 0x7e, 0xd6,
++ 0xa6, 0x1e, 0xbf, 0x14, 0x65, 0x3c, 0x76, 0x75, 0x6a, 0x2b, 0x6c, 0x12,
++ 0xe5, 0x3d, 0x22, 0xe5, 0xb1, 0xb8, 0x2c, 0x20, 0x3e, 0xab, 0xd5, 0x49,
++ 0xe1, 0x99, 0xfa, 0xff, 0x5d, 0xd4, 0x4d, 0xc1, 0x3f, 0x98, 0xb2, 0xd8,
++ 0x93, 0x90, 0x53, 0x3d, 0xd6, 0x40, 0xc2, 0xa0, 0xed, 0x4a, 0xc8, 0x1c,
++ 0x62, 0xfd, 0x72, 0x89, 0xf5, 0x59, 0x0f, 0xfa, 0x59, 0xf2, 0xda, 0x4d,
++ 0x96, 0x7c, 0x3b, 0xd1, 0xcf, 0x7d, 0xc8, 0x50, 0xae, 0xc7, 0xf3, 0x01,
++ 0x86, 0xd1, 0x08, 0x39, 0x70, 0xc0, 0xff, 0x31, 0x94, 0xf7, 0xf3, 0xbe,
++ 0x07, 0xca, 0x88, 0x85, 0x7e, 0x1c, 0x25, 0x46, 0xcc, 0x39, 0x63, 0x28,
++ 0x63, 0x1b, 0x2b, 0x9e, 0x44, 0xf9, 0xa8, 0x24, 0xe3, 0x79, 0x75, 0xf7,
++ 0xac, 0x1d, 0x65, 0xec, 0x23, 0xa8, 0xf7, 0x63, 0xfe, 0x8f, 0x92, 0xa3,
++ 0xa0, 0xed, 0x97, 0xf7, 0xaa, 0xbd, 0x81, 0x8c, 0xe9, 0x40, 0x1f, 0x58,
++ 0x96, 0x34, 0xd9, 0x2e, 0xe7, 0x38, 0xca, 0x16, 0xde, 0x57, 0xe1, 0x19,
++ 0x5e, 0x44, 0xee, 0xad, 0x34, 0x4b, 0xae, 0xd2, 0x70, 0x1d, 0xfb, 0xef,
++ 0xeb, 0xe4, 0x72, 0xdc, 0x14, 0xde, 0x83, 0xf0, 0xf4, 0x3c, 0xb4, 0x95,
++ 0x3a, 0x31, 0xc0, 0x73, 0x03, 0xf8, 0x5b, 0xac, 0x05, 0xfc, 0xef, 0x39,
++ 0xf8, 0xdf, 0xa7, 0x4b, 0x35, 0xfb, 0xe1, 0xf9, 0x5d, 0xda, 0x80, 0x27,
++ 0xb1, 0x66, 0xa3, 0xc0, 0xfd, 0x3b, 0x11, 0x0f, 0x0c, 0x03, 0xfb, 0x0f,
++ 0x62, 0xfd, 0xd2, 0x58, 0xbb, 0x31, 0xde, 0x17, 0xc2, 0x3a, 0x0e, 0xa8,
++ 0x73, 0xe6, 0x19, 0x75, 0xe7, 0xe2, 0x47, 0xca, 0xf7, 0x3e, 0x5e, 0x32,
++ 0xe0, 0x1f, 0x0a, 0xee, 0x66, 0xdb, 0x02, 0xfe, 0x5b, 0xd1, 0xe7, 0x81,
++ 0x17, 0x61, 0x57, 0x7e, 0x06, 0xba, 0xce, 0xcf, 0xd0, 0x9f, 0xa3, 0x8e,
++ 0x87, 0xb7, 0x1d, 0xee, 0x75, 0x41, 0x9f, 0x0f, 0x2f, 0xcb, 0x12, 0x70,
++ 0x47, 0x86, 0x72, 0x8c, 0xf8, 0xc1, 0x7a, 0x7a, 0x4e, 0xba, 0x69, 0x03,
++ 0xe7, 0xa8, 0x2b, 0xfd, 0xd3, 0x71, 0x60, 0x3d, 0x20, 0x79, 0x75, 0xae,
++ 0x8a, 0xe7, 0xb3, 0x1b, 0xc5, 0x20, 0xde, 0x73, 0x6e, 0x40, 0x19, 0xed,
++ 0x86, 0x8f, 0x91, 0x96, 0x06, 0xda, 0x24, 0xb3, 0xa5, 0x4d, 0xd9, 0x0e,
++ 0xcb, 0x79, 0x09, 0xe3, 0xee, 0x90, 0x46, 0x60, 0xb8, 0x02, 0xc6, 0x38,
++ 0x20, 0xff, 0xd5, 0xe1, 0x1e, 0x95, 0x17, 0xfb, 0x81, 0x96, 0x08, 0x78,
++ 0xd6, 0xb4, 0xc7, 0x36, 0x23, 0x3b, 0xaa, 0xec, 0x3f, 0xa2, 0x30, 0x56,
++ 0x4e, 0xd8, 0x3f, 0xfc, 0x04, 0xc6, 0x4c, 0x4e, 0x53, 0xf6, 0x7b, 0xb1,
++ 0x6e, 0xbf, 0x0d, 0x0c, 0x44, 0xae, 0x7e, 0x75, 0x83, 0xa7, 0x2f, 0xa4,
++ 0x7f, 0x89, 0x78, 0x82, 0x67, 0x00, 0x5e, 0x5c, 0xbe, 0x42, 0x5b, 0x3f,
++ 0xe8, 0x9d, 0xdd, 0xe0, 0x9f, 0x25, 0x77, 0x4e, 0x7b, 0xfe, 0xba, 0xf3,
++ 0x2c, 0x5a, 0x1d, 0x95, 0x76, 0x9e, 0x4a, 0x1b, 0x72, 0x8b, 0xdc, 0x19,
++ 0xf2, 0xfa, 0x31, 0x4e, 0x98, 0x90, 0x55, 0xda, 0x81, 0x76, 0xc8, 0x39,
++ 0xf3, 0xb4, 0x29, 0xb4, 0x09, 0x94, 0x05, 0x5b, 0x8a, 0x55, 0xd8, 0x84,
++ 0x96, 0x0e, 0x99, 0x23, 0xcf, 0x4e, 0xd0, 0x4e, 0xfc, 0x48, 0x26, 0xd7,
++ 0xd8, 0xca, 0x41, 0xf1, 0xe3, 0xda, 0x66, 0x09, 0xa7, 0x6d, 0xf3, 0x3e,
++ 0x35, 0x47, 0xcf, 0x5e, 0xee, 0x23, 0xfe, 0x9c, 0xc9, 0x58, 0x6d, 0xa2,
++ 0xb1, 0xa7, 0xc2, 0x4f, 0xdf, 0xc7, 0x5c, 0xd9, 0x87, 0xe2, 0xd3, 0xc0,
++ 0xa0, 0x17, 0x0b, 0xa8, 0x3d, 0x3f, 0xe0, 0xe0, 0xf8, 0xcf, 0x60, 0x6b,
++ 0x73, 0xc4, 0x25, 0xe0, 0x73, 0xe7, 0x51, 0xca, 0xd1, 0x66, 0xda, 0x32,
++ 0xe0, 0xbc, 0x14, 0xed, 0xb5, 0x2c, 0x4c, 0x03, 0x73, 0x19, 0x77, 0x48,
++ 0x9e, 0xf2, 0xca, 0xbb, 0x0a, 0x0b, 0x86, 0x4c, 0xce, 0xb6, 0x48, 0xd7,
++ 0x09, 0xee, 0xaf, 0x9e, 0x8a, 0x4a, 0x0b, 0xf7, 0x58, 0xe9, 0x83, 0xfa,
++ 0x25, 0x87, 0xf2, 0xce, 0x13, 0x41, 0xb5, 0x1f, 0x36, 0x67, 0x90, 0x47,
++ 0x7d, 0xb0, 0x07, 0x56, 0x6a, 0xc9, 0xd8, 0xd6, 0xe4, 0x61, 0x48, 0xc8,
++ 0x52, 0x09, 0x32, 0x56, 0x82, 0x8c, 0x95, 0x20, 0x63, 0x25, 0xc8, 0x18,
++ 0xb0, 0xdf, 0x79, 0xe8, 0xdf, 0xb9, 0xd2, 0x80, 0xf6, 0xeb, 0xbb, 0x94,
++ 0x5f, 0x3f, 0x54, 0x7a, 0xc5, 0x65, 0xfa, 0xac, 0x8a, 0x4d, 0xfb, 0x20,
++ 0x83, 0x8c, 0x45, 0xfd, 0x18, 0xf5, 0x15, 0x79, 0x72, 0xe6, 0x55, 0x39,
++ 0x35, 0x53, 0xc3, 0x81, 0x13, 0x25, 0x57, 0x5e, 0x72, 0x10, 0x7f, 0xce,
++ 0x13, 0x53, 0x65, 0x5a, 0x1b, 0x15, 0xb6, 0x3a, 0x28, 0x79, 0x85, 0x93,
++ 0x95, 0x1f, 0x01, 0xbe, 0x52, 0xb8, 0x90, 0xba, 0x29, 0x6d, 0x5b, 0x2e,
++ 0xcb, 0x39, 0xf8, 0xf1, 0x85, 0xea, 0x6b, 0xf2, 0x8c, 0xc2, 0xe3, 0xe4,
++ 0xc3, 0x3b, 0xe5, 0xa7, 0xa6, 0x77, 0x9e, 0x7f, 0x0a, 0x58, 0x63, 0xa1,
++ 0x87, 0xb6, 0x23, 0x04, 0x5f, 0x60, 0x15, 0x3a, 0xa1, 0xd7, 0xfb, 0x8d,
++ 0x1b, 0x81, 0x69, 0xf8, 0x7e, 0xa3, 0xbc, 0x38, 0x53, 0xa8, 0x93, 0x09,
++ 0xda, 0x07, 0xeb, 0xb0, 0x18, 0xf4, 0x53, 0xf4, 0x9b, 0x9c, 0x2f, 0xfd,
++ 0xd4, 0x4f, 0x37, 0xf0, 0x0e, 0x57, 0xf9, 0x58, 0x6c, 0x03, 0xf7, 0x1b,
++ 0x63, 0x36, 0x79, 0x7a, 0x59, 0xf6, 0x57, 0x58, 0xf6, 0x2a, 0xd6, 0x87,
++ 0xe9, 0x0f, 0xdc, 0x7b, 0x63, 0x1c, 0x8f, 0xfd, 0x02, 0x37, 0xb5, 0x63,
++ 0xae, 0xa5, 0x8f, 0x68, 0xcc, 0xdd, 0xa7, 0x70, 0xf4, 0xb5, 0x78, 0x99,
++ 0x7c, 0x72, 0xc0, 0xa7, 0xcb, 0x6a, 0x3f, 0x70, 0x9d, 0x7d, 0xe2, 0x27,
++ 0xa0, 0x57, 0x85, 0x2b, 0xc2, 0x3d, 0x4b, 0xee, 0xe7, 0x72, 0xaf, 0xb8,
++ 0xde, 0x62, 0xa8, 0x7b, 0x03, 0x72, 0x0f, 0xec, 0xcb, 0xbd, 0xb0, 0x2f,
++ 0xf7, 0x5d, 0x73, 0x07, 0xda, 0x3f, 0x03, 0xe8, 0x2a, 0x04, 0x8d, 0x0e,
++ 0x19, 0xad, 0xd4, 0xb7, 0xe5, 0x3e, 0xee, 0x7a, 0xfb, 0xb6, 0xdc, 0xd3,
++ 0x4d, 0xad, 0xd9, 0x0b, 0xa4, 0x6c, 0xb8, 0x72, 0xc9, 0xe1, 0xbe, 0x9b,
++ 0x7f, 0x6f, 0x7e, 0x3d, 0xfc, 0x15, 0x68, 0xf6, 0xf7, 0x9c, 0x43, 0xe9,
++ 0x2b, 0xc2, 0xfb, 0xf3, 0xc5, 0x29, 0xe2, 0x81, 0x98, 0xba, 0x17, 0x63,
++ 0xa8, 0x7d, 0x3e, 0xaf, 0x6d, 0x71, 0x4a, 0x9d, 0x31, 0x15, 0xb8, 0x77,
++ 0x6d, 0x6e, 0xb5, 0xcc, 0xd1, 0xa0, 0x77, 0x1f, 0x93, 0xba, 0xec, 0xd9,
++ 0x32, 0xc8, 0x62, 0xb5, 0x76, 0xcf, 0x71, 0x50, 0xd9, 0x8b, 0x2b, 0xd0,
++ 0x01, 0xae, 0x17, 0xe2, 0x05, 0xe8, 0xc9, 0x04, 0xec, 0x53, 0x5e, 0xf5,
++ 0x17, 0xa1, 0x5c, 0x64, 0xb2, 0x41, 0x43, 0xc2, 0xc7, 0x19, 0x0b, 0x79,
++ 0x7b, 0x2d, 0xb9, 0xa0, 0xa5, 0xec, 0x37, 0x68, 0x07, 0x3e, 0xa3, 0x7e,
++ 0x26, 0xc6, 0x1b, 0xd3, 0x0d, 0xf0, 0xab, 0x58, 0xbf, 0x2a, 0xf7, 0x04,
++ 0xa0, 0xbb, 0x8b, 0xdf, 0x91, 0x7d, 0xb3, 0xdd, 0xcd, 0x9e, 0xfc, 0x73,
++ 0x1f, 0x99, 0xf3, 0xf3, 0x69, 0x58, 0xdd, 0xb7, 0x71, 0x5c, 0x22, 0x51,
++ 0xf8, 0xb4, 0x0f, 0x20, 0xce, 0xd8, 0x01, 0x59, 0x59, 0x8a, 0xb1, 0x5f,
++ 0x4f, 0x67, 0x26, 0x4b, 0xec, 0xfb, 0x3b, 0x32, 0x34, 0x5b, 0x6a, 0xa6,
++ 0x2f, 0x59, 0x84, 0x1d, 0x58, 0x36, 0xe9, 0x43, 0xc7, 0xe0, 0xe3, 0xda,
++ 0xe5, 0xfb, 0xb3, 0xf4, 0x8f, 0x49, 0xf3, 0x94, 0xf4, 0xc6, 0x4f, 0x81,
++ 0xa6, 0xcf, 0x3b, 0x21, 0xc6, 0x68, 0xee, 0x20, 0xca, 0xfe, 0x5c, 0x92,
++ 0x66, 0x67, 0x80, 0xcf, 0xbd, 0xe6, 0x17, 0x80, 0x61, 0x33, 0x66, 0xd2,
++ 0xbc, 0x35, 0x40, 0x39, 0x42, 0xcc, 0xbd, 0x58, 0xa3, 0xf3, 0x07, 0xb3,
++ 0x2a, 0x4e, 0x52, 0x76, 0x66, 0xd1, 0xe1, 0x78, 0xa0, 0x5b, 0xd9, 0xac,
++ 0x5b, 0x61, 0x4f, 0x22, 0xfa, 0xfc, 0x0d, 0x6d, 0x88, 0x6d, 0x9c, 0x90,
++ 0xce, 0x3f, 0x2a, 0xd9, 0x93, 0x31, 0xd8, 0x33, 0xf6, 0xe5, 0xc7, 0x0e,
++ 0xf4, 0x91, 0x3e, 0xde, 0xa6, 0xbf, 0xbb, 0x03, 0x7e, 0xef, 0x66, 0x45,
++ 0xcf, 0xb0, 0xd3, 0x27, 0x13, 0xc7, 0x38, 0x76, 0x0f, 0x6c, 0x79, 0x5c,
++ 0xc9, 0x6d, 0xb1, 0xb4, 0x1c, 0x8f, 0xc0, 0x26, 0x47, 0xb6, 0x90, 0x9f,
++ 0xef, 0x93, 0xbb, 0xec, 0x31, 0xb9, 0x1b, 0xb2, 0x33, 0x68, 0x3b, 0x32,
++ 0x84, 0xb5, 0xd8, 0x61, 0xc3, 0xef, 0x28, 0x0c, 0xdd, 0x88, 0xb8, 0x8b,
++ 0x63, 0xb7, 0xeb, 0xfb, 0x17, 0x1e, 0x7e, 0xfc, 0x4a, 0xd5, 0xe3, 0x51,
++ 0x76, 0xf6, 0x49, 0xc5, 0x9b, 0x61, 0x67, 0x9b, 0xf6, 0xb3, 0x2d, 0x92,
++ 0x53, 0xf5, 0xb6, 0x29, 0x7f, 0x5c, 0x5c, 0xb8, 0x1f, 0x29, 0x7c, 0xf3,
++ 0x02, 0xec, 0x0d, 0x30, 0x77, 0xb1, 0xb2, 0x15, 0x79, 0xf8, 0xd0, 0x85,
++ 0x34, 0xd2, 0xf7, 0x21, 0x65, 0xdd, 0x07, 0x9a, 0xbd, 0xbd, 0xdc, 0xb5,
++ 0xf7, 0xb8, 0x24, 0xf0, 0x01, 0x85, 0x4b, 0xaf, 0xa8, 0x3b, 0x80, 0x88,
++ 0xa1, 0x47, 0xb2, 0xb0, 0x2b, 0xcd, 0xc0, 0x40, 0x53, 0xc7, 0xad, 0xd4,
++ 0x50, 0x60, 0xbb, 0x7c, 0x10, 0xb1, 0x7c, 0xd9, 0xe1, 0x5a, 0x6e, 0x95,
++ 0x07, 0xdf, 0x4b, 0x19, 0xd9, 0x2e, 0x7b, 0xde, 0x1b, 0x90, 0x3d, 0x7d,
++ 0x56, 0x86, 0x74, 0xdf, 0xf2, 0x2e, 0x3f, 0x9e, 0xee, 0x1a, 0x4e, 0x06,
++ 0xfa, 0xe5, 0x0b, 0x90, 0xb1, 0x02, 0xe4, 0x6b, 0xa8, 0x4a, 0x9e, 0xd3,
++ 0xde, 0xd3, 0xce, 0xa7, 0x80, 0x95, 0x7d, 0xec, 0x67, 0xcb, 0x54, 0xb5,
++ 0x41, 0x12, 0x37, 0x70, 0x3f, 0x39, 0xe1, 0x9d, 0x71, 0xdc, 0x40, 0x99,
++ 0x40, 0x0c, 0x72, 0x83, 0xa7, 0x9f, 0xea, 0xee, 0xdd, 0x0d, 0x9e, 0x5f,
++ 0x41, 0xfc, 0xeb, 0x12, 0xe7, 0x79, 0x77, 0x0d, 0xbe, 0xa1, 0x6d, 0x69,
++ 0x68, 0xe3, 0x0a, 0xbe, 0x6b, 0x61, 0xfc, 0xf0, 0x87, 0xcd, 0xb5, 0x6f,
++ 0x07, 0xd6, 0xca, 0xa2, 0xbf, 0xef, 0x36, 0x87, 0x39, 0xd3, 0xa7, 0x5b,
++ 0x26, 0x6d, 0x61, 0xab, 0xbd, 0x4b, 0xfe, 0x0c, 0xfe, 0xfd, 0x6b, 0x2b,
++ 0xfe, 0x7d, 0x37, 0xf8, 0xb1, 0x16, 0x03, 0xd8, 0xe6, 0x3d, 0x98, 0xcb,
++ 0x30, 0xd6, 0xf3, 0x6e, 0xfc, 0xee, 0x2a, 0xad, 0xda, 0xc7, 0x9b, 0x29,
++ 0x00, 0x4f, 0x36, 0xd8, 0xec, 0x6f, 0xd5, 0x7e, 0x5e, 0x21, 0x2f, 0x2b,
++ 0x7b, 0x85, 0x03, 0x57, 0x85, 0x7e, 0xef, 0x75, 0x09, 0x77, 0xdb, 0xaf,
++ 0x77, 0x06, 0xec, 0xe7, 0x8d, 0x00, 0xcf, 0xc1, 0x1d, 0x39, 0x5d, 0x25,
++ 0x0e, 0xbb, 0x28, 0xc6, 0x59, 0x62, 0xb0, 0x97, 0xd5, 0x1e, 0x54, 0xb9,
++ 0xf4, 0x2d, 0xa4, 0xa8, 0x0f, 0xfb, 0x18, 0xf4, 0xf6, 0x29, 0x14, 0x56,
++ 0xa1, 0x9d, 0xbd, 0x1b, 0xeb, 0x30, 0x81, 0x5f, 0xe7, 0x96, 0x5b, 0xa1,
++ 0xbf, 0x94, 0x53, 0xee, 0x7d, 0x75, 0x9b, 0x5b, 0x02, 0x7c, 0xb7, 0xde,
++ 0x3e, 0xd8, 0xb7, 0x25, 0x74, 0x14, 0xbe, 0xce, 0xa0, 0x7d, 0xe0, 0x3c,
++ 0xe8, 0x27, 0x4d, 0x99, 0x3f, 0x46, 0x5d, 0x5f, 0xaf, 0xbe, 0x5f, 0xd7,
++ 0x9f, 0x8b, 0xf2, 0x1b, 0x99, 0x3c, 0xf7, 0x38, 0x4b, 0x5c, 0x03, 0x07,
++ 0x6b, 0xe0, 0xca, 0x71, 0xa7, 0x95, 0x36, 0x5d, 0x82, 0xc7, 0x5d, 0x19,
++ 0x54, 0xd8, 0xb5, 0x17, 0x98, 0x6b, 0xa3, 0xc6, 0x0d, 0x31, 0x09, 0x1d,
++ 0xef, 0x90, 0x46, 0xe0, 0xea, 0x86, 0x23, 0xf4, 0x91, 0xc9, 0xc4, 0x20,
++ 0x84, 0x20, 0xa4, 0xee, 0x93, 0x5a, 0x03, 0xdf, 0x97, 0xde, 0xc4, 0xf7,
++ 0x85, 0x78, 0xe9, 0x51, 0xac, 0x9f, 0xe5, 0x5c, 0x5c, 0xa7, 0x7e, 0xb1,
++ 0x56, 0x1f, 0x72, 0xc4, 0xbd, 0x35, 0xb6, 0xe1, 0x5e, 0x5b, 0x72, 0xe0,
++ 0x7b, 0xdc, 0x63, 0x43, 0xac, 0xd9, 0x70, 0xc6, 0xa3, 0xc1, 0x58, 0x6c,
++ 0x93, 0xf2, 0x49, 0xea, 0x28, 0xf7, 0x59, 0x4c, 0x2f, 0x4e, 0x2d, 0x31,
++ 0x5e, 0xe5, 0xfb, 0x84, 0x7e, 0xdf, 0xa9, 0xdf, 0x33, 0x1e, 0x2d, 0xb8,
++ 0x0d, 0xe0, 0xe9, 0x0e, 0xd8, 0xcf, 0xfb, 0xb7, 0xda, 0x0a, 0x37, 0xdc,
++ 0xbf, 0xb2, 0x66, 0x3b, 0xd5, 0xdd, 0xa2, 0x72, 0xe9, 0xa0, 0xd8, 0x5b,
++ 0x96, 0x52, 0x21, 0x19, 0xc5, 0x5a, 0x30, 0x9f, 0x21, 0x3d, 0xa9, 0x43,
++ 0xb2, 0x5f, 0xad, 0x4d, 0xf9, 0x98, 0x75, 0x38, 0x11, 0x98, 0x10, 0xa3,
++ 0xcc, 0xe7, 0x4f, 0x23, 0x3d, 0x04, 0xbc, 0xe3, 0xed, 0x5d, 0x1a, 0xe5,
++ 0xd5, 0xbc, 0x04, 0xc6, 0x30, 0x77, 0xac, 0xda, 0xc7, 0xaa, 0xed, 0x71,
++ 0xf1, 0xfd, 0xa0, 0x7a, 0x9f, 0x5a, 0xb5, 0xcf, 0x95, 0x33, 0x88, 0x65,
++ 0xfc, 0xf7, 0x5c, 0x0b, 0xae, 0x17, 0x7c, 0xf1, 0x31, 0x7f, 0xcf, 0xab,
++ 0x45, 0xaf, 0x0b, 0xd7, 0x67, 0x4a, 0xce, 0x99, 0xd6, 0x30, 0xe5, 0xef,
++ 0xb6, 0xad, 0x37, 0xc9, 0x78, 0x3b, 0xf7, 0xdb, 0xea, 0x69, 0x58, 0xbb,
++ 0x8f, 0x56, 0x3f, 0xfe, 0xda, 0xfd, 0x37, 0x8e, 0xed, 0xed, 0xb1, 0x65,
++ 0x57, 0xed, 0xb1, 0xd5, 0x8f, 0xc7, 0xb1, 0x36, 0x22, 0x7e, 0x2a, 0xb8,
++ 0x31, 0x9b, 0x6b, 0xd4, 0x95, 0x98, 0x65, 0xfe, 0xcb, 0x06, 0xd6, 0x31,
++ 0x06, 0x3f, 0xc2, 0xb5, 0xf4, 0xcf, 0x9e, 0xb9, 0xa6, 0xc9, 0xc4, 0x21,
++ 0x6f, 0x3d, 0x07, 0xbc, 0x75, 0xf7, 0xd6, 0xff, 0xe2, 0xca, 0x3a, 0xd2,
++ 0x3f, 0x70, 0x1d, 0xdb, 0x45, 0x60, 0x67, 0x8d, 0x23, 0x5c, 0x43, 0xa6,
++ 0x5c, 0x43, 0xbe, 0xe3, 0x1a, 0x76, 0xea, 0x77, 0x5c, 0x3f, 0xe0, 0xb4,
++ 0x2f, 0x02, 0x63, 0x38, 0x59, 0xf5, 0x1d, 0x54, 0x67, 0xb7, 0xaf, 0x8b,
++ 0x29, 0x79, 0x66, 0x3e, 0x2a, 0x66, 0xda, 0x9b, 0xd7, 0xd8, 0xaa, 0xfd,
++ 0x76, 0x9e, 0x5f, 0xf5, 0x11, 0x7b, 0xfa, 0xf3, 0x8a, 0x73, 0x5e, 0xfb,
++ 0xe5, 0xb2, 0xe4, 0xa7, 0x42, 0x88, 0x01, 0x53, 0xc0, 0x39, 0x7d, 0xb0,
++ 0xb7, 0xdc, 0x1f, 0x45, 0x59, 0x85, 0x78, 0x85, 0xbe, 0x2e, 0x05, 0x5d,
++ 0xa1, 0x0d, 0x26, 0x1e, 0x79, 0x55, 0x72, 0x73, 0xbe, 0x8d, 0x41, 0xff,
++ 0x86, 0xdf, 0x3f, 0xf9, 0x9c, 0xb9, 0x65, 0xb3, 0x2c, 0x25, 0x36, 0x8b,
++ 0x95, 0x58, 0x90, 0xda, 0xba, 0x8e, 0xad, 0xcf, 0x77, 0xe7, 0xfe, 0x60,
++ 0x4d, 0x36, 0xc6, 0xd6, 0x59, 0xfb, 0xbd, 0xe2, 0xbf, 0xf7, 0xd7, 0x7e,
++ 0xdd, 0x75, 0x28, 0xbc, 0x22, 0x5c, 0x0b, 0xf2, 0x80, 0x78, 0x38, 0x2c,
++ 0x9f, 0x8a, 0x51, 0x1f, 0x0b, 0xea, 0x7c, 0x33, 0x69, 0x74, 0x2b, 0x9b,
++ 0x31, 0xe8, 0x78, 0xf2, 0x5a, 0xc0, 0x38, 0x91, 0xae, 0x7f, 0xe1, 0x0e,
++ 0xc6, 0x10, 0xe7, 0x76, 0xd1, 0xbe, 0xf8, 0x3a, 0x1d, 0x55, 0x3a, 0xfd,
++ 0x79, 0x27, 0x20, 0x45, 0x3b, 0x20, 0x13, 0xf6, 0x41, 0x85, 0xf1, 0x3f,
++ 0x84, 0xbe, 0x1e, 0xd4, 0x7d, 0x4d, 0x48, 0xb7, 0xb6, 0x3f, 0x07, 0x20,
++ 0xe7, 0xae, 0xdc, 0xe7, 0x6c, 0x95, 0xdb, 0x5a, 0xa9, 0x03, 0xfe, 0xfc,
++ 0x0f, 0x4a, 0xd7, 0xd6, 0xa5, 0x04, 0x22, 0x83, 0x5b, 0xc2, 0x2b, 0x3c,
++ 0xa0, 0x9e, 0xf9, 0xf2, 0xed, 0xf1, 0xc1, 0x9b, 0xff, 0xaa, 0xb9, 0xea,
++ 0x79, 0x72, 0xce, 0xac, 0xc7, 0xb9, 0x7a, 0x58, 0xbe, 0x36, 0x57, 0xbf,
++ 0x7e, 0x33, 0x64, 0xc9, 0x4a, 0x48, 0xa0, 0x9e, 0x37, 0x2b, 0x36, 0x6a,
++ 0x98, 0x7b, 0x24, 0x4b, 0xa6, 0x95, 0x4a, 0x04, 0xfc, 0xbd, 0x68, 0x0f,
++ 0xeb, 0x76, 0x02, 0x87, 0xdb, 0xdd, 0xdd, 0xa9, 0xbc, 0xda, 0x23, 0x35,
++ 0xd4, 0xbc, 0x26, 0x80, 0xc9, 0xe6, 0x9d, 0x57, 0xdc, 0x4f, 0x02, 0xb3,
++ 0x8e, 0xcb, 0xc3, 0x12, 0x5c, 0xb5, 0x97, 0x8b, 0xfc, 0x59, 0xee, 0xe7,
++ 0x5a, 0x89, 0x0c, 0xd6, 0xf8, 0xc3, 0x88, 0xe1, 0xcb, 0xb0, 0xfb, 0x1f,
++ 0xa1, 0x6f, 0x28, 0xc1, 0x5f, 0x00, 0x97, 0x7c, 0xed, 0xba, 0x18, 0x7e,
++ 0xbc, 0x6e, 0x2f, 0xd7, 0xc3, 0xa7, 0xe7, 0x14, 0x26, 0x25, 0x6e, 0x3f,
++ 0x1c, 0xb8, 0xa7, 0x27, 0x88, 0x38, 0xa3, 0xe0, 0x46, 0x6c, 0xe2, 0xb8,
++ 0x83, 0x72, 0x17, 0xd6, 0xe7, 0xf4, 0x7c, 0x21, 0xb0, 0xa3, 0xe4, 0xcb,
++ 0x2a, 0xe2, 0xca, 0xaa, 0x95, 0x5a, 0x06, 0x3f, 0x9e, 0xd4, 0x98, 0x8f,
++ 0xe7, 0x35, 0x65, 0x1d, 0xb3, 0x70, 0x6f, 0xa8, 0x58, 0x3d, 0x28, 0x93,
++ 0x0e, 0xf7, 0x76, 0xba, 0xa4, 0x18, 0xcb, 0xdc, 0xd4, 0xb8, 0xc2, 0x23,
++ 0xcb, 0x44, 0xcc, 0x97, 0xa2, 0xfd, 0x2e, 0xeb, 0xf3, 0x8e, 0x27, 0x95,
++ 0x7c, 0xf9, 0xfb, 0xc2, 0x8c, 0x8f, 0x78, 0x5e, 0xd5, 0x65, 0x0e, 0xf3,
++ 0x79, 0x8e, 0x32, 0xa0, 0x62, 0x26, 0xf0, 0xf2, 0x21, 0xc9, 0x8c, 0x26,
++ 0x14, 0x6e, 0x79, 0xbc, 0x44, 0x7d, 0x21, 0xfe, 0xbf, 0x0c, 0xec, 0x1f,
++ 0xc2, 0x9a, 0x31, 0x0e, 0xe0, 0xd8, 0xd4, 0x0b, 0x94, 0x55, 0xcc, 0x5f,
++ 0xa2, 0x17, 0xdb, 0x37, 0x11, 0x63, 0x5c, 0x28, 0x7d, 0x5c, 0xf1, 0x6f,
++ 0x49, 0xfc, 0xbd, 0x73, 0x85, 0x05, 0x0b, 0xd9, 0x60, 0x40, 0x92, 0x47,
++ 0x3f, 0x03, 0x19, 0x1a, 0x41, 0x8c, 0xc4, 0x7a, 0xa2, 0xce, 0xaf, 0x06,
++ 0x81, 0xb9, 0x0c, 0xfb, 0x46, 0x29, 0x9a, 0x61, 0x29, 0xaa, 0x7b, 0x80,
++ 0x3c, 0xcf, 0x0d, 0xaa, 0xbd, 0x9d, 0xa2, 0x49, 0xcc, 0x9f, 0xd9, 0xe4,
++ 0xdf, 0x03, 0x2c, 0x9a, 0x6c, 0xc7, 0x3c, 0xcb, 0x27, 0x24, 0x7c, 0xf4,
++ 0x80, 0x34, 0x1c, 0x7d, 0x58, 0x1a, 0xa7, 0x89, 0xf1, 0xb8, 0x77, 0x6f,
++ 0xdc, 0xd1, 0x28, 0xc4, 0xdc, 0x5f, 0xc5, 0xd8, 0x07, 0xe5, 0x87, 0x8e,
++ 0x4f, 0xd3, 0x86, 0x8d, 0xd2, 0xc2, 0x3a, 0x7e, 0xde, 0xc7, 0xe3, 0x77,
++ 0x80, 0x1e, 0xce, 0x3f, 0xa1, 0x71, 0xdf, 0x1d, 0x75, 0xb1, 0x6b, 0x83,
++ 0x8e, 0x5d, 0xd9, 0xee, 0x32, 0x7c, 0xf6, 0x31, 0x09, 0xdb, 0x7e, 0xfb,
++ 0xed, 0xa8, 0x17, 0xaf, 0xbb, 0x03, 0xc1, 0x3a, 0xfa, 0x4e, 0x40, 0x0b,
++ 0x71, 0x0f, 0xcf, 0xdb, 0x59, 0xe6, 0x9d, 0xf9, 0x1b, 0xe5, 0x74, 0x70,
++ 0xf5, 0xf8, 0xdb, 0xea, 0xea, 0xfa, 0x65, 0x7e, 0x9b, 0xb0, 0x17, 0xf3,
++ 0xf7, 0x87, 0xeb, 0xda, 0x7d, 0xd7, 0xf4, 0x52, 0x2f, 0xf6, 0xf0, 0xe2,
++ 0x20, 0xce, 0x21, 0x55, 0x87, 0x73, 0x56, 0x7f, 0x2f, 0x9a, 0x43, 0x79,
++ 0x7e, 0xd6, 0xbf, 0x3b, 0x64, 0x60, 0x2e, 0x56, 0x81, 0xf1, 0x8b, 0xc9,
++ 0x6f, 0x33, 0x67, 0x0b, 0xa0, 0xfb, 0x66, 0x75, 0xef, 0x88, 0x77, 0x37,
++ 0x50, 0x2f, 0xe1, 0xe1, 0x4f, 0xe6, 0xe3, 0x58, 0xf3, 0x77, 0x75, 0x18,
++ 0xe9, 0xff, 0x7e, 0x53, 0xb6, 0x9f, 0xf8, 0x66, 0x13, 0xcf, 0x21, 0x81,
++ 0x9b, 0x29, 0x67, 0xdf, 0x81, 0x9c, 0x35, 0xaa, 0x73, 0x9f, 0x62, 0x89,
++ 0xf1, 0x5c, 0x1e, 0xf2, 0xc3, 0xfb, 0x7b, 0x8c, 0xfb, 0xf2, 0x7a, 0x3f,
++ 0x96, 0x74, 0x12, 0xd3, 0xfb, 0xf1, 0x01, 0xfb, 0x5c, 0xef, 0x9e, 0xb2,
++ 0x1f, 0xb3, 0x51, 0xde, 0xe2, 0x8a, 0xe6, 0xa1, 0x35, 0xf1, 0xca, 0x21,
++ 0xd8, 0x82, 0x79, 0xc8, 0xf3, 0x5e, 0xd8, 0xc0, 0xc1, 0x20, 0xf5, 0x33,
++ 0xaa, 0x63, 0x59, 0x9b, 0x71, 0x7b, 0x60, 0x14, 0x7d, 0x18, 0xd3, 0xaf,
++ 0xc9, 0x04, 0xec, 0xff, 0x64, 0x35, 0xa9, 0xbe, 0xe9, 0xc9, 0xc4, 0x79,
++ 0x9f, 0x8c, 0xe5, 0x5f, 0x83, 0xbc, 0xbe, 0x06, 0x3c, 0xbc, 0x01, 0xfc,
++ 0x34, 0xf4, 0x5a, 0xfd, 0x96, 0xde, 0x8b, 0x8a, 0x70, 0x2f, 0x1e, 0x76,
++ 0xb3, 0xe8, 0x61, 0xcd, 0xd8, 0x24, 0xd2, 0x7f, 0x1e, 0xf5, 0xe4, 0xf5,
++ 0xdf, 0x6a, 0x79, 0x6b, 0x42, 0xf9, 0x63, 0x6a, 0x0f, 0xd2, 0x9b, 0x93,
++ 0xa5, 0x63, 0x95, 0x30, 0x64, 0x8e, 0xf3, 0xfa, 0x53, 0xd4, 0xa3, 0xac,
++ 0xf5, 0xe8, 0xb3, 0xd9, 0xa8, 0xb2, 0x8f, 0x39, 0xc8, 0x52, 0x5e, 0xc5,
++ 0x11, 0xc0, 0xf7, 0x0e, 0xdb, 0x3d, 0xb7, 0x89, 0x67, 0x9f, 0x0d, 0xb6,
++ 0x8a, 0x2d, 0xda, 0x83, 0xe2, 0x97, 0xdd, 0x89, 0x32, 0xca, 0xd9, 0x8d,
++ 0x58, 0x1b, 0x96, 0x65, 0x91, 0xe7, 0x58, 0x37, 0xe9, 0x71, 0x38, 0x46,
++ 0x77, 0xf3, 0x6a, 0x9a, 0x38, 0x97, 0xf6, 0x35, 0xdf, 0x35, 0xb0, 0xec,
++ 0x46, 0x5d, 0x16, 0xd2, 0xf3, 0x1b, 0xd2, 0xdf, 0xd2, 0x5a, 0x87, 0x33,
++ 0x2b, 0xd8, 0x98, 0xf4, 0x45, 0x54, 0xbb, 0x8c, 0xe9, 0xc9, 0xce, 0x21,
++ 0xac, 0x47, 0x28, 0x1d, 0xe4, 0x99, 0x2c, 0xf8, 0xeb, 0xeb, 0x44, 0x5c,
++ 0xc5, 0x9d, 0x09, 0xc3, 0xbb, 0xbb, 0x74, 0xee, 0x9a, 0xfb, 0xd9, 0xde,
++ 0x5d, 0xf7, 0xa1, 0x9e, 0x26, 0x99, 0x9f, 0x89, 0xe8, 0x7b, 0x93, 0x71,
++ 0xa5, 0xb3, 0xf9, 0x31, 0xe6, 0xff, 0xc7, 0x26, 0x7e, 0xc7, 0x6c, 0xd8,
++ 0x2c, 0x6f, 0xd7, 0xfc, 0xbd, 0x51, 0xdd, 0x33, 0xa2, 0x2e, 0x14, 0xe7,
++ 0xde, 0x50, 0xef, 0x4f, 0xcf, 0x36, 0xa8, 0xfa, 0xa7, 0x67, 0xd7, 0xde,
++ 0x15, 0x62, 0xd9, 0xdb, 0xb8, 0xbf, 0x21, 0x0b, 0x53, 0x0d, 0xb2, 0x38,
++ 0x1b, 0x60, 0xbc, 0x96, 0x6e, 0xac, 0x7d, 0x0b, 0xa3, 0xbf, 0x5b, 0x73,
++ 0x65, 0x08, 0xeb, 0x37, 0x3f, 0x30, 0x29, 0xe5, 0x01, 0xc6, 0x23, 0xea,
++ 0x3e, 0x20, 0x64, 0xa4, 0x01, 0x58, 0xb4, 0xe0, 0x96, 0x6d, 0xee, 0x03,
++ 0xb7, 0x68, 0xbd, 0x7e, 0x45, 0xc7, 0x7c, 0xe4, 0x91, 0x21, 0xb9, 0xbe,
++ 0x09, 0x45, 0x57, 0x59, 0xf1, 0xca, 0xff, 0xd6, 0x88, 0xfd, 0xf3, 0x7b,
++ 0xa3, 0xa0, 0xc6, 0xb2, 0xfb, 0x35, 0xcf, 0xff, 0x4a, 0xa7, 0x8f, 0xca,
++ 0x9e, 0x63, 0xbf, 0x0f, 0x5a, 0x9b, 0xbc, 0x3b, 0x4f, 0x52, 0xff, 0x3d,
++ 0x49, 0x48, 0x7d, 0xcf, 0x12, 0xb2, 0x1f, 0x45, 0x19, 0xf7, 0xc1, 0x1e,
++ 0x55, 0xf3, 0xe0, 0xbd, 0xba, 0x82, 0xfc, 0xaa, 0xfb, 0x21, 0x7e, 0x2c,
++ 0xc6, 0xbb, 0x4b, 0x51, 0xdd, 0xdf, 0x0e, 0xbd, 0x8e, 0x63, 0xb2, 0x07,
++ 0xbe, 0x26, 0x0f, 0x4c, 0xca, 0xfb, 0x5e, 0xe3, 0xc1, 0xfa, 0x31, 0x7d,
++ 0x59, 0xf6, 0xe2, 0x7c, 0xff, 0xde, 0x41, 0x50, 0xc5, 0x23, 0x2b, 0x7b,
++ 0x06, 0xba, 0x7c, 0x4c, 0xf6, 0x95, 0xd4, 0xde, 0x81, 0x3a, 0x2f, 0x9c,
++ 0x84, 0x4e, 0x0e, 0x2a, 0x7f, 0x12, 0x09, 0x0c, 0x55, 0xd2, 0x92, 0x3f,
++ 0xb9, 0x13, 0xe3, 0x70, 0x1f, 0x2e, 0xa3, 0xcf, 0xe5, 0x76, 0xcb, 0x9e,
++ 0xaa, 0x37, 0xf6, 0xde, 0x12, 0xdf, 0x27, 0xe1, 0xa3, 0xf9, 0x3e, 0x17,
++ 0x0f, 0xaa, 0x93, 0x85, 0x5b, 0xd1, 0xb6, 0x41, 0xf3, 0x96, 0xf7, 0xfc,
++ 0xd9, 0x9e, 0xfa, 0xf7, 0x4f, 0x4c, 0x89, 0xe6, 0xf0, 0x9e, 0x6d, 0xfc,
++ 0xfe, 0xf6, 0xc2, 0x67, 0x30, 0x36, 0x7e, 0x44, 0x96, 0xe6, 0x26, 0x65,
++ 0x79, 0xce, 0x97, 0x33, 0xde, 0xb9, 0x26, 0xed, 0x77, 0xeb, 0x3b, 0xd7,
++ 0x19, 0xac, 0xc3, 0x6a, 0x5e, 0xe5, 0x56, 0x7d, 0x8f, 0xf4, 0x75, 0xd3,
++ 0xfb, 0x26, 0x70, 0xbb, 0xba, 0x3f, 0xb5, 0x5a, 0xde, 0xd9, 0xcf, 0x57,
++ 0x4c, 0x9e, 0x33, 0x78, 0x77, 0xc0, 0xda, 0xeb, 0xde, 0xc7, 0xf4, 0xbd,
++ 0xab, 0xaf, 0xe9, 0xbb, 0xfa, 0xe4, 0xe7, 0xa8, 0xa6, 0xf7, 0x56, 0xe8,
++ 0x1e, 0xfb, 0x7c, 0x4c, 0xaf, 0x1b, 0xd2, 0x79, 0x3e, 0xab, 0xbb, 0xa6,
++ 0xfa, 0xec, 0xd5, 0xd4, 0x63, 0xd4, 0xdf, 0x7b, 0x6b, 0xa8, 0x1b, 0x97,
++ 0xed, 0xe9, 0x1b, 0xfc, 0x3b, 0xe0, 0x2c, 0x3b, 0xa6, 0xef, 0xd7, 0xf9,
++ 0x77, 0xbe, 0x59, 0xe6, 0xdf, 0x03, 0x23, 0xbf, 0xb8, 0x9f, 0x88, 0xb4,
++ 0x3a, 0xaa, 0x9f, 0x47, 0xeb, 0xbe, 0x1d, 0xf2, 0xfb, 0x0c, 0xa1, 0x8f,
++ 0x3b, 0x83, 0xd7, 0xde, 0x11, 0xe7, 0xb7, 0x54, 0x94, 0x45, 0x83, 0xdf,
++ 0x78, 0x33, 0x06, 0x03, 0x6e, 0xda, 0x28, 0x7b, 0x15, 0x3d, 0x05, 0x75,
++ 0x57, 0x22, 0xeb, 0x34, 0xc9, 0xa0, 0xe9, 0xe5, 0xf7, 0xce, 0xaf, 0x95,
++ 0x53, 0x96, 0x6f, 0x8a, 0x48, 0x94, 0xdf, 0x70, 0xf1, 0xfd, 0x7a, 0xdf,
++ 0x2e, 0x84, 0xf5, 0xf7, 0x53, 0x0e, 0xda, 0x7c, 0x9e, 0xf2, 0x5e, 0x28,
++ 0xac, 0xdc, 0xd1, 0x2c, 0xa8, 0x3d, 0x52, 0x00, 0x73, 0x7d, 0x57, 0x92,
++ 0xdf, 0xb0, 0x8b, 0x3c, 0x5d, 0xe1, 0xb7, 0x5c, 0xdb, 0xd5, 0x1d, 0x16,
++ 0xef, 0x5c, 0x90, 0x74, 0x75, 0x29, 0x9b, 0x5c, 0xae, 0x14, 0xc9, 0x53,
++ 0xed, 0x57, 0xc3, 0xda, 0xaf, 0x92, 0xc7, 0xc3, 0xe0, 0xf1, 0x5f, 0xeb,
++ 0x75, 0x61, 0xfb, 0x8c, 0xba, 0x0b, 0x9e, 0x89, 0xf1, 0x6c, 0xea, 0x31,
++ 0x35, 0x17, 0xda, 0x68, 0xb4, 0x7d, 0x47, 0x50, 0xe9, 0xae, 0xfa, 0x46,
++ 0x1e, 0xf2, 0xc9, 0x6f, 0xde, 0x61, 0x5f, 0x4b, 0xfc, 0xb6, 0x7d, 0x58,
++ 0x7d, 0x67, 0x52, 0xae, 0x70, 0x5d, 0xf9, 0x4d, 0xfb, 0x68, 0x9d, 0x3c,
++ 0x06, 0xf5, 0x58, 0x9b, 0x5a, 0x25, 0xea, 0xad, 0x3b, 0xbf, 0x51, 0x29,
++ 0x57, 0xfc, 0xfb, 0x9d, 0x1b, 0x96, 0xa8, 0x13, 0xa2, 0x62, 0x6c, 0xef,
++ 0x3b, 0x9b, 0xb2, 0xfa, 0x6e, 0x25, 0xc1, 0xef, 0x2e, 0xe1, 0x3b, 0x76,
++ 0xe1, 0x99, 0x67, 0xba, 0xbb, 0x91, 0xc2, 0xe6, 0x54, 0xc6, 0x91, 0x3e,
++ 0x2c, 0x39, 0xb5, 0xe7, 0xd6, 0x8c, 0xfc, 0x5e, 0x35, 0x76, 0xb1, 0xf2,
++ 0x80, 0xec, 0x39, 0xf9, 0x10, 0xbf, 0xed, 0x51, 0xdf, 0xe5, 0x67, 0x1d,
++ 0xd2, 0x18, 0x93, 0x09, 0x35, 0xef, 0x42, 0xed, 0x9b, 0x11, 0xc5, 0xfb,
++ 0x5c, 0x2b, 0xd7, 0xb4, 0x50, 0x69, 0x06, 0x8d, 0x01, 0x7d, 0xc7, 0x93,
++ 0x58, 0xdc, 0x9f, 0x7f, 0x94, 0xf7, 0x06, 0x5d, 0x9e, 0xdd, 0xed, 0x29,
++ 0xf1, 0x0e, 0x67, 0x52, 0xc7, 0xe8, 0xdc, 0xb7, 0xe3, 0xd9, 0x00, 0x65,
++ 0xdc, 0x4a, 0x8d, 0xc3, 0xfa, 0x87, 0x25, 0xce, 0x73, 0x65, 0x3d, 0x97,
++ 0xe6, 0xba, 0xb9, 0xf0, 0xde, 0xaa, 0x37, 0x1f, 0x7e, 0x0b, 0x93, 0x2f,
++ 0xd5, 0x7f, 0xc7, 0xa3, 0xbe, 0x11, 0x57, 0xdf, 0xcd, 0x8c, 0x57, 0x3e,
++ 0x21, 0x1f, 0x2b, 0x6d, 0xd4, 0xdf, 0xf0, 0x44, 0xe4, 0x63, 0x95, 0xd7,
++ 0x14, 0x4f, 0xf3, 0xea, 0xfb, 0xa3, 0xb0, 0x5e, 0xb3, 0x98, 0xea, 0xa3,
++ 0xf6, 0x1d, 0x92, 0x55, 0xf7, 0x4d, 0x4a, 0x58, 0xc6, 0xe7, 0x7f, 0xd9,
++ 0xb7, 0x48, 0x8f, 0x08, 0xbf, 0x47, 0xb9, 0xe4, 0x4c, 0xca, 0xe3, 0x73,
++ 0xae, 0x7b, 0x97, 0x43, 0x5c, 0xb7, 0x41, 0x96, 0x63, 0xa3, 0x3b, 0xbe,
++ 0x67, 0xb7, 0x05, 0xca, 0x33, 0x8d, 0xb0, 0xd7, 0xc4, 0x12, 0x12, 0x65,
++ 0x7e, 0x7e, 0x86, 0x7a, 0x1a, 0xc2, 0x1c, 0x2d, 0xf3, 0xaa, 0x7c, 0xa6,
++ 0x95, 0x7b, 0x5e, 0x77, 0x21, 0x8e, 0xfc, 0xb8, 0xe3, 0xd9, 0xe5, 0xcf,
++ 0x2d, 0xec, 0x94, 0xcf, 0x55, 0x22, 0x81, 0xf2, 0x14, 0xef, 0xfa, 0x59,
++ 0xc3, 0x73, 0x92, 0x44, 0x3d, 0xf6, 0x0f, 0x79, 0x89, 0x6f, 0x96, 0xa7,
++ 0x8e, 0xfd, 0xc2, 0xbd, 0x6a, 0xe3, 0x3d, 0x6c, 0xcd, 0xb2, 0xe3, 0xef,
++ 0xeb, 0x21, 0x86, 0x3f, 0xc2, 0x7a, 0x9b, 0x21, 0x07, 0xf0, 0xdb, 0xd0,
++ 0x39, 0xc6, 0x98, 0x57, 0xb5, 0xdd, 0x32, 0x8e, 0xdc, 0x2c, 0x57, 0x57,
++ 0xee, 0x0a, 0x5f, 0x86, 0x6c, 0x27, 0x3c, 0xfe, 0xab, 0x7d, 0xf0, 0x03,
++ 0x12, 0xfc, 0x22, 0xfc, 0xc4, 0x17, 0x1b, 0x94, 0x6d, 0xa7, 0x3f, 0x43,
++ 0xfc, 0x81, 0x18, 0x23, 0x84, 0x7e, 0x1e, 0x6c, 0xf5, 0x64, 0x76, 0x52,
++ 0xe4, 0xcb, 0x4d, 0x92, 0x69, 0x65, 0x0c, 0x2b, 0xbf, 0xc2, 0x7e, 0xd5,
++ 0xeb, 0x59, 0x4a, 0xbe, 0x42, 0x1d, 0xaf, 0x72, 0x2e, 0xc9, 0xf8, 0x8f,
++ 0xe5, 0x93, 0x32, 0x1e, 0xe7, 0x5c, 0x1e, 0x91, 0xc2, 0xdc, 0x63, 0xf8,
++ 0x71, 0x9e, 0xa4, 0xfb, 0x1f, 0xe8, 0x7b, 0x04, 0xa3, 0x52, 0x9c, 0x4a,
++ 0xcb, 0xc4, 0xec, 0x5e, 0x7e, 0xa3, 0x3b, 0x7c, 0x97, 0x3a, 0x5f, 0xb3,
++ 0xe2, 0xc9, 0x40, 0x6f, 0x62, 0x82, 0xf7, 0x26, 0xd4, 0x7c, 0xf6, 0x62,
++ 0x3e, 0xdf, 0x6a, 0xe5, 0xdd, 0xf3, 0xab, 0xb0, 0xbf, 0xc6, 0x71, 0xca,
++ 0xa1, 0x65, 0x76, 0x06, 0x98, 0xdf, 0x8d, 0xd8, 0x99, 0x65, 0xbb, 0x25,
++ 0x78, 0x64, 0xc5, 0xce, 0xa3, 0x5c, 0x9f, 0xf3, 0xaa, 0xf6, 0xff, 0x11,
++ 0x6d, 0x51, 0xef, 0x88, 0xdf, 0xd6, 0xaf, 0xc3, 0xb6, 0x9c, 0xe7, 0x4e,
++ 0xc4, 0xec, 0x3e, 0x5d, 0x90, 0xc3, 0x78, 0x3d, 0xbf, 0xa3, 0x6b, 0xf8,
++ 0x1d, 0x22, 0xde, 0x04, 0xbf, 0xc8, 0xe3, 0xa0, 0xe6, 0xf1, 0x9b, 0xe8,
++ 0xdf, 0x5f, 0x83, 0xbb, 0x50, 0x66, 0xea, 0x6f, 0x03, 0xdf, 0x0a, 0xdf,
++ 0xc9, 0x73, 0xd6, 0x7f, 0xb0, 0xd5, 0x93, 0x35, 0xd2, 0xb3, 0x1e, 0xcf,
++ 0x3b, 0xdb, 0xbc, 0x75, 0xd9, 0x0d, 0x7e, 0xf1, 0x4e, 0x67, 0xaf, 0xfa,
++ 0x4e, 0x20, 0x33, 0xb6, 0x1b, 0xb2, 0xe3, 0xcf, 0xab, 0x17, 0x32, 0xc6,
++ 0x33, 0x0b, 0xd6, 0xaf, 0xe7, 0x89, 0xe7, 0xf7, 0x82, 0xdc, 0x77, 0xb0,
++ 0x39, 0x57, 0x60, 0xc2, 0x2f, 0xab, 0xef, 0x82, 0x60, 0x27, 0xdf, 0xb6,
++ 0xf2, 0x5d, 0xd0, 0xf5, 0xd7, 0x78, 0xa0, 0xcd, 0xf3, 0x51, 0x26, 0x78,
++ 0xd2, 0xa2, 0xdb, 0xec, 0x06, 0x3e, 0xe5, 0x5e, 0x6c, 0x32, 0xfe, 0xa0,
++ 0xf8, 0xe3, 0xb8, 0xdb, 0x19, 0x73, 0x0e, 0xf6, 0xf7, 0x22, 0xbe, 0x56,
++ 0xf7, 0x65, 0xe2, 0xbc, 0x7f, 0x93, 0x0c, 0xec, 0x56, 0x77, 0x27, 0x2e,
++ 0xac, 0xfa, 0xb6, 0x2b, 0x25, 0x4f, 0xd5, 0x64, 0x65, 0xf8, 0x27, 0x62,
++ 0x49, 0xe2, 0x26, 0xca, 0x0a, 0xfb, 0xdd, 0xcb, 0x79, 0xc6, 0x1f, 0x52,
++ 0xf3, 0x34, 0x11, 0xc3, 0xf1, 0x9e, 0x83, 0x19, 0x28, 0xcf, 0x72, 0xdd,
++ 0x91, 0x2e, 0xf0, 0xd9, 0x3f, 0x6b, 0x55, 0x76, 0x05, 0xe3, 0xb2, 0x8c,
++ 0xb6, 0x91, 0xef, 0xd3, 0xfa, 0x2c, 0xf6, 0xc3, 0x6d, 0xbc, 0x0f, 0x90,
++ 0x47, 0xd9, 0xdc, 0xc2, 0xfa, 0xb4, 0x7d, 0x5c, 0xc9, 0xc1, 0x23, 0xe0,
++ 0xfb, 0x1f, 0xa3, 0xee, 0x63, 0x48, 0x39, 0xc7, 0xf4, 0xca, 0xba, 0x93,
++ 0xdf, 0x1f, 0x90, 0x01, 0xc8, 0x05, 0xf3, 0x8f, 0x48, 0x51, 0xdd, 0x63,
++ 0x42, 0x3a, 0xc7, 0x67, 0xda, 0x7a, 0x5b, 0xfb, 0x53, 0xd2, 0xb2, 0x5b,
++ 0x7f, 0x4f, 0xe6, 0xcb, 0xd3, 0x2e, 0xdd, 0x6e, 0x6c, 0x85, 0x57, 0x0f,
++ 0x5d, 0x83, 0x37, 0xc2, 0x2b, 0x78, 0xc3, 0x1b, 0xeb, 0xf1, 0x36, 0x1f,
++ 0x6b, 0x78, 0x73, 0xf0, 0xb0, 0x86, 0x27, 0xe7, 0x7b, 0x25, 0x04, 0x39,
++ 0x0e, 0xd6, 0xe4, 0x18, 0xb8, 0xc7, 0xd3, 0x99, 0x09, 0x9e, 0x21, 0x2a,
++ 0x3e, 0x53, 0x0e, 0x29, 0xbf, 0x5c, 0xc7, 0xfa, 0xb5, 0x7e, 0xcf, 0x2f,
++ 0x59, 0xeb, 0x97, 0xdb, 0x7c, 0xfc, 0xf0, 0x77, 0xd3, 0x83, 0x0b, 0x6d,
++ 0x35, 0x3d, 0xb8, 0xf9, 0x37, 0xa4, 0x07, 0x6b, 0xe5, 0xb2, 0x5e, 0xa6,
++ 0x4c, 0xc8, 0x13, 0xd7, 0x8b, 0xf2, 0x44, 0x39, 0x22, 0x2f, 0x69, 0x4f,
++ 0x1b, 0x19, 0x3b, 0xc5, 0xaf, 0xa8, 0xef, 0x36, 0x26, 0x61, 0x83, 0xda,
++ 0x02, 0x73, 0x73, 0x31, 0x29, 0x2e, 0xbc, 0x4f, 0xc9, 0xf4, 0x53, 0x55,
++ 0xda, 0xa5, 0xeb, 0xcd, 0x7d, 0xb5, 0xcd, 0xcd, 0xaf, 0xb1, 0xb9, 0xf9,
++ 0x15, 0x9b, 0xdb, 0xaa, 0xe3, 0xa5, 0xbf, 0x8b, 0xcd, 0x8d, 0xd5, 0x9d,
++ 0xcb, 0xf8, 0x67, 0x32, 0x12, 0xc8, 0xf6, 0x44, 0x65, 0x07, 0xfc, 0xc8,
++ 0xf0, 0xd4, 0x4e, 0xf9, 0x97, 0x53, 0x93, 0xea, 0x8e, 0xd2, 0x5f, 0x38,
++ 0xc9, 0xf8, 0x03, 0x01, 0x57, 0x3e, 0x80, 0x78, 0x77, 0xbc, 0xa3, 0x41,
++ 0x76, 0xbc, 0x4b, 0x9d, 0x35, 0x9a, 0xd9, 0x40, 0xbb, 0x70, 0x17, 0x3c,
++ 0xe7, 0x58, 0x4e, 0x22, 0xc0, 0xfb, 0x6a, 0x8d, 0x32, 0x1e, 0x6b, 0x96,
++ 0x9d, 0xc0, 0x4e, 0x85, 0x1b, 0x1c, 0xf5, 0x2d, 0x79, 0x46, 0x9d, 0xe5,
++ 0xdc, 0xb2, 0xd9, 0x1b, 0x17, 0x7c, 0x68, 0x31, 0xe5, 0xab, 0xd5, 0x5b,
++ 0xd4, 0x77, 0xd1, 0x17, 0x4a, 0xd5, 0xd6, 0xd5, 0x79, 0x3e, 0xff, 0x7b,
++ 0xd4, 0x89, 0x81, 0x57, 0xf5, 0x77, 0x7f, 0x82, 0x8a, 0x9f, 0xc5, 0xb9,
++ 0x31, 0x75, 0xa7, 0xea, 0x4a, 0x90, 0xfc, 0x52, 0x71, 0x53, 0x3c, 0x1b,
++ 0x04, 0xc6, 0x99, 0x01, 0x92, 0xb6, 0x19, 0xf3, 0x69, 0xfc, 0x09, 0xfb,
++ 0xbf, 0x47, 0x9d, 0xed, 0x2e, 0x81, 0x37, 0xae, 0xda, 0xfb, 0xcd, 0xc7,
++ 0x88, 0xeb, 0x6b, 0xf7, 0x87, 0xaf, 0xc5, 0xf7, 0xde, 0xb7, 0x67, 0xfa,
++ 0x1c, 0x42, 0xef, 0x15, 0xe9, 0x18, 0x5c, 0x9d, 0xab, 0xad, 0xf7, 0x7f,
++ 0x29, 0x88, 0xf5, 0xf8, 0x7f, 0x0f, 0x88, 0xed, 0xac, 0xc3, 0x73, 0xe2,
++ 0xa8, 0x38, 0x30, 0x43, 0xfe, 0x96, 0xb1, 0x4e, 0xd3, 0x71, 0xdf, 0x9f,
++ 0x07, 0x3a, 0xcf, 0xd6, 0xc7, 0x81, 0xec, 0x23, 0xa2, 0xee, 0x63, 0xd4,
++ 0xfe, 0x0f, 0x0e, 0xf7, 0x77, 0x32, 0x81, 0x7b, 0x4a, 0x93, 0x12, 0x3c,
++ 0x3a, 0x2a, 0xa1, 0x69, 0xee, 0xa5, 0x67, 0xa4, 0x18, 0x73, 0xe5, 0x63,
++ 0xce, 0xea, 0xd8, 0xa4, 0xd3, 0x58, 0x4b, 0xfb, 0x23, 0x32, 0x78, 0xf2,
++ 0x31, 0x09, 0x1f, 0xe5, 0xbb, 0x55, 0xe7, 0x28, 0xb0, 0x47, 0x1b, 0x64,
++ 0x2e, 0xc6, 0xfd, 0xe4, 0xb0, 0x3a, 0x97, 0x5e, 0x1e, 0x7b, 0x2d, 0x5c,
++ 0x04, 0x56, 0xc8, 0x2b, 0xdb, 0x82, 0x74, 0x25, 0x96, 0x38, 0xbc, 0x99,
++ 0x3a, 0x85, 0x18, 0x33, 0x30, 0x3e, 0x17, 0x56, 0xf7, 0x83, 0x96, 0x63,
++ 0xac, 0x8b, 0xf8, 0xfd, 0x28, 0x71, 0x06, 0x6c, 0xc7, 0xa8, 0x44, 0x99,
++ 0x0f, 0x1e, 0xad, 0xe1, 0x0c, 0xda, 0x84, 0x41, 0x27, 0x26, 0xa1, 0x53,
++ 0xde, 0xdc, 0xf9, 0x8f, 0x95, 0x8c, 0x13, 0x3b, 0x25, 0x38, 0xcd, 0xe7,
++ 0xfa, 0x78, 0x88, 0xd8, 0x1d, 0xbe, 0xe1, 0xec, 0x67, 0xd1, 0x1f, 0xdf,
++ 0x65, 0xf4, 0x37, 0xba, 0xc8, 0x97, 0xff, 0xb6, 0xff, 0x43, 0x81, 0xb2,
++ 0xff, 0xff, 0x01, 0xe6, 0x8e, 0x9a, 0x21, 0xc0, 0x4e, 0x00, 0x00, 0x00 };
+
+ static const u32 bnx2_COM_b06FwData[(0x0/4) + 1] = { 0x0 };
+ static const u32 bnx2_COM_b06FwRodata[(0x14/4) + 1] = {
+- 0x08000e7c, 0x08000ec4, 0x08000f04, 0x08000f50, 0x08000f84, 0x00000000
++ 0x08000e7c, 0x08000ec4, 0x08000ef8, 0x08000f44, 0x08000f78, 0x00000000
+ };
+
+ static struct fw_info bnx2_com_fw_06 = {
+- /* Firmware version: 4.6.16 */
++ /* Firmware version: 4.4.2 */
+ .ver_major = 0x4,
+- .ver_minor = 0x6,
+- .ver_fix = 0x10,
++ .ver_minor = 0x4,
++ .ver_fix = 0x2,
+
+ .start_addr = 0x080000f8,
+
+ .text_addr = 0x08000000,
+- .text_len = 0x4da4,
++ .text_len = 0x4ebc,
+ .text_index = 0x0,
+ .gz_text = bnx2_COM_b06FwText,
+ .gz_text_len = sizeof(bnx2_COM_b06FwText),
+@@ -867,15 +872,15 @@
+ .data_index = 0x0,
+ .data = bnx2_COM_b06FwData,
+
+- .sbss_addr = 0x08004de0,
++ .sbss_addr = 0x08004f00,
+ .sbss_len = 0x38,
+ .sbss_index = 0x0,
+
+- .bss_addr = 0x08004e18,
++ .bss_addr = 0x08004f38,
+ .bss_len = 0xbc,
+ .bss_index = 0x0,
+
+- .rodata_addr = 0x08004da4,
++ .rodata_addr = 0x08004ebc,
+ .rodata_len = 0x14,
+ .rodata_index = 0x0,
+ .rodata = bnx2_COM_b06FwRodata,
+@@ -898,1219 +903,1232 @@
+ };
+
+ static u8 bnx2_CP_b06FwText[] = {
+- 0x9d, 0xbc, 0x0d, 0x7c, 0x1b, 0xe5, 0x95, 0x2e, 0xfe, 0xcc, 0x48, 0xb2,
+- 0x65, 0x5b, 0xb6, 0xc7, 0x8e, 0x92, 0x28, 0xac, 0x37, 0xd1, 0xc4, 0x23,
+- 0x47, 0xc1, 0xa6, 0x8c, 0x12, 0x27, 0xa8, 0xac, 0x4a, 0x54, 0xc7, 0x24,
+- 0x4e, 0x48, 0xc1, 0x29, 0x69, 0x6b, 0xb8, 0x2d, 0xa8, 0xf9, 0xc2, 0x84,
+- 0x40, 0x43, 0xcb, 0xde, 0x6b, 0xee, 0xed, 0xae, 0x55, 0xdb, 0x49, 0x9c,
+- 0x44, 0x96, 0x6c, 0xc7, 0x24, 0xa1, 0xdb, 0xff, 0xa2, 0xc4, 0xce, 0x07,
+- 0x54, 0xb6, 0xd2, 0x96, 0xee, 0x86, 0xde, 0x74, 0xd1, 0x4d, 0x02, 0x18,
+- 0xca, 0x47, 0xda, 0xe5, 0x76, 0x69, 0x7f, 0xbd, 0xc5, 0x97, 0x42, 0x08,
+- 0x5b, 0x0a, 0xe9, 0xe7, 0x86, 0x7e, 0x30, 0xf7, 0x39, 0x23, 0x29, 0x31,
+- 0x2c, 0xdb, 0x76, 0xff, 0xfa, 0xfd, 0xe6, 0x27, 0xcd, 0xe8, 0xfd, 0x38,
+- 0xef, 0x79, 0xcf, 0x79, 0xce, 0x73, 0xde, 0x79, 0x67, 0xfc, 0x40, 0x39,
+- 0x0a, 0x9f, 0x4a, 0x1e, 0x1f, 0x6a, 0xde, 0xb6, 0x61, 0x69, 0xe8, 0x43,
+- 0x4b, 0xe5, 0xdc, 0xa9, 0x95, 0x38, 0xf1, 0x67, 0x7e, 0xfc, 0x7f, 0x6e,
+- 0xc1, 0xc2, 0x47, 0xe1, 0xd1, 0x58, 0xf8, 0xed, 0x00, 0xb4, 0x62, 0xff,
+- 0x72, 0xc0, 0xad, 0x46, 0xc6, 0x3a, 0x5a, 0x0c, 0xb8, 0x1d, 0x91, 0x6d,
+- 0xb7, 0x6f, 0x30, 0x80, 0x68, 0xa6, 0xd1, 0xbf, 0x1c, 0x7f, 0xb0, 0xe2,
+- 0x5e, 0x27, 0xe4, 0xfa, 0x5f, 0x46, 0x7e, 0xdf, 0xfd, 0xed, 0x6b, 0xf4,
+- 0x0b, 0x69, 0x07, 0xdc, 0x5a, 0x24, 0x0e, 0xad, 0x01, 0xee, 0x3a, 0xd6,
+- 0xf9, 0xca, 0x82, 0xaf, 0x28, 0xa8, 0x2a, 0xb6, 0x75, 0xde, 0xfa, 0xf6,
+- 0x02, 0x5f, 0xac, 0x2c, 0xa2, 0xe1, 0xf1, 0x2c, 0xda, 0x9b, 0x06, 0xba,
+- 0xad, 0x4a, 0x23, 0x04, 0xb7, 0x61, 0x74, 0x0c, 0x28, 0x9e, 0xf0, 0x96,
+- 0x25, 0xf0, 0x94, 0x1a, 0x88, 0x5f, 0x11, 0x41, 0xfb, 0x95, 0xe3, 0xe5,
+- 0x71, 0x67, 0xc4, 0x8d, 0xb6, 0xac, 0x3b, 0xfe, 0x17, 0x11, 0x03, 0x2b,
+- 0xb3, 0x46, 0x19, 0xaa, 0x34, 0xf4, 0x65, 0x5f, 0x77, 0xe7, 0xdb, 0x6b,
+- 0x2e, 0x7c, 0xdf, 0x56, 0x9b, 0xff, 0x9e, 0x15, 0x73, 0x46, 0x80, 0xed,
+- 0x09, 0xcb, 0x2a, 0x89, 0xdc, 0x7c, 0xb3, 0x1a, 0x31, 0x7c, 0x47, 0xb0,
+- 0x0c, 0xeb, 0x35, 0x7c, 0x71, 0x47, 0xf3, 0x2f, 0x94, 0x53, 0x23, 0x4d,
+- 0x88, 0x1f, 0x75, 0x20, 0xaa, 0x3d, 0xcb, 0xef, 0xb9, 0x73, 0x3b, 0xc2,
+- 0x4d, 0x38, 0x70, 0xf4, 0x22, 0xaf, 0x3b, 0xed, 0x6b, 0xbd, 0xfb, 0xe7,
+- 0xce, 0xbd, 0x25, 0xfc, 0x2c, 0x1e, 0x3c, 0x2a, 0xbf, 0xef, 0x40, 0x77,
+- 0x93, 0x82, 0xa9, 0x9b, 0x37, 0xc3, 0x61, 0x34, 0xa1, 0x6f, 0xbf, 0xe2,
+- 0xec, 0x69, 0x52, 0x11, 0xf5, 0xea, 0xc1, 0x18, 0x27, 0xc1, 0x69, 0x20,
+- 0x56, 0x1a, 0x09, 0x3b, 0xdf, 0x48, 0x44, 0x34, 0x87, 0x61, 0x59, 0xc1,
+- 0xd0, 0x6c, 0x38, 0x6a, 0x2c, 0xeb, 0x31, 0xd3, 0x03, 0xff, 0xa7, 0x9e,
+- 0x47, 0x7c, 0xb4, 0x1d, 0xaa, 0xf1, 0x3c, 0x7a, 0x46, 0x9f, 0xc7, 0x43,
+- 0x7b, 0xcb, 0x31, 0x35, 0x83, 0xe3, 0x4d, 0xf9, 0xf0, 0xed, 0x05, 0xd2,
+- 0xb7, 0xc8, 0xd1, 0xcc, 0xc3, 0x8d, 0x29, 0xc7, 0x39, 0x7e, 0x4b, 0x99,
+- 0x8b, 0xd6, 0xd4, 0xec, 0xcb, 0x65, 0xb6, 0xb3, 0x4c, 0xdf, 0xfb, 0xca,
+- 0xc4, 0x47, 0x23, 0xf8, 0x4e, 0x42, 0xc1, 0x96, 0x50, 0x15, 0xa2, 0x35,
+- 0x32, 0x5e, 0xcb, 0x3a, 0x6a, 0x9e, 0xb3, 0xa6, 0x34, 0xe9, 0x6b, 0x12,
+- 0xcf, 0xf2, 0xbf, 0x1d, 0xa1, 0x57, 0xad, 0x9c, 0x57, 0xda, 0xfb, 0x3c,
+- 0x6d, 0x68, 0x2d, 0xaf, 0x3b, 0x91, 0x4a, 0x20, 0x56, 0x15, 0xf9, 0x04,
+- 0xcf, 0x75, 0xf3, 0x2d, 0xc5, 0xed, 0x7e, 0x3b, 0xe1, 0xfe, 0x54, 0xa5,
+- 0xa1, 0xde, 0x57, 0x0d, 0x27, 0x9e, 0xa3, 0xcc, 0x27, 0xcc, 0xcd, 0x70,
+- 0x19, 0x5f, 0x10, 0x9b, 0xe3, 0xb8, 0x5e, 0xb4, 0x30, 0xbb, 0x58, 0x5f,
+- 0xda, 0xd5, 0xb0, 0x23, 0x65, 0x59, 0xbb, 0xcc, 0xe8, 0x87, 0xcb, 0x68,
+- 0x10, 0xa7, 0x13, 0xed, 0x70, 0x47, 0x02, 0xfe, 0xf3, 0x08, 0x63, 0x79,
+- 0xd6, 0x8b, 0x27, 0x12, 0x70, 0xb6, 0x2c, 0xa8, 0x43, 0x4f, 0x36, 0x82,
+- 0xeb, 0xb3, 0x26, 0x5a, 0xb3, 0x7f, 0xda, 0xca, 0x6e, 0x48, 0xf9, 0x39,
+- 0x86, 0x3f, 0x58, 0xf9, 0x31, 0xc8, 0xf8, 0xe4, 0x9b, 0xf3, 0x9a, 0xba,
+- 0x02, 0xbb, 0x47, 0x0c, 0xec, 0xe4, 0xfc, 0xad, 0x0a, 0xe5, 0xa2, 0x65,
+- 0xd0, 0xcd, 0xf3, 0x88, 0x60, 0x45, 0xd6, 0xe0, 0x9c, 0x46, 0xb0, 0x3c,
+- 0x55, 0xaf, 0x8d, 0x62, 0x21, 0xa2, 0xbe, 0xbc, 0x6d, 0xef, 0xe1, 0x78,
+- 0xd7, 0x07, 0xda, 0x51, 0x49, 0x1b, 0xc9, 0x2c, 0x09, 0xa3, 0x85, 0xfd,
+- 0xaf, 0xf9, 0x33, 0xfa, 0xbf, 0x89, 0xfd, 0xbf, 0xc5, 0xfe, 0x73, 0x76,
+- 0xff, 0x70, 0xae, 0xe6, 0xb9, 0x9b, 0xf6, 0xb8, 0x3b, 0xe3, 0x74, 0xae,
+- 0x4a, 0x79, 0xb1, 0x2b, 0x63, 0xd2, 0xe6, 0xe4, 0x2f, 0x1f, 0x76, 0x8c,
+- 0xd4, 0x61, 0xe7, 0x88, 0xee, 0x7b, 0x8a, 0xbf, 0x7b, 0xc7, 0xae, 0xc0,
+- 0xf6, 0x11, 0x05, 0x87, 0x8c, 0x2b, 0xd0, 0xc3, 0xdf, 0x07, 0x46, 0xe6,
+- 0xe2, 0xc1, 0x11, 0x07, 0xc2, 0x33, 0xa6, 0x8f, 0x43, 0xbe, 0xaf, 0x40,
+- 0x7c, 0xcc, 0x8f, 0x9e, 0xc4, 0xb3, 0xb6, 0x0e, 0x2b, 0x23, 0xdf, 0x2e,
+- 0xfa, 0x33, 0x7d, 0xc7, 0x8f, 0x0d, 0x09, 0x1f, 0x7a, 0x52, 0xe2, 0x07,
+- 0x6e, 0xda, 0xa6, 0xf8, 0xc1, 0xaf, 0x80, 0x2a, 0xb6, 0x9f, 0x2d, 0xfe,
+- 0xaf, 0xc0, 0xc9, 0x79, 0xdb, 0xc8, 0xff, 0x76, 0xa5, 0xc4, 0x26, 0xa4,
+- 0x4d, 0xb1, 0x0b, 0xf9, 0x5d, 0x4b, 0xbb, 0x2b, 0x87, 0xff, 0x70, 0x39,
+- 0x82, 0x0f, 0x68, 0x78, 0xad, 0x59, 0xae, 0xd3, 0xde, 0x43, 0x52, 0x66,
+- 0x10, 0x47, 0x32, 0xe2, 0xa7, 0x7e, 0xb4, 0x24, 0x26, 0xd9, 0x7e, 0x33,
+- 0xdb, 0x36, 0xf1, 0x4f, 0xd9, 0x26, 0xfc, 0x63, 0x36, 0x88, 0x7f, 0xa0,
+- 0x1e, 0xbf, 0x99, 0xf5, 0xe3, 0xd1, 0x6c, 0x1d, 0xbe, 0x91, 0xf5, 0xe1,
+- 0xeb, 0x9c, 0xbf, 0xaf, 0x65, 0xdb, 0x69, 0xfb, 0x1a, 0x8e, 0x67, 0x45,
+- 0xff, 0x25, 0x1c, 0x6f, 0x39, 0x7a, 0x47, 0xea, 0x83, 0xa7, 0x69, 0x5b,
+- 0xff, 0x60, 0xae, 0x46, 0xae, 0xb6, 0xd9, 0xb6, 0xc9, 0x5d, 0xbc, 0xbe,
+- 0x7b, 0xa4, 0x3e, 0x7a, 0xa5, 0x62, 0x59, 0x6a, 0xa8, 0x31, 0x7c, 0x4a,
+- 0x55, 0x31, 0xe5, 0xd5, 0xfd, 0x39, 0x55, 0xf7, 0x47, 0xe1, 0x42, 0x82,
+- 0xbe, 0x11, 0x9f, 0xa9, 0xa7, 0xe3, 0xb4, 0x29, 0xaf, 0x31, 0xca, 0xf1,
+- 0xe8, 0xfe, 0xb8, 0xaa, 0x61, 0x67, 0x4a, 0x3f, 0x10, 0x57, 0xbd, 0x88,
+- 0x67, 0xcb, 0xf1, 0xb3, 0x11, 0xbd, 0x3f, 0xae, 0xde, 0x88, 0x78, 0xad,
+- 0x65, 0x7d, 0x3d, 0x84, 0x6d, 0xb3, 0x23, 0x88, 0xce, 0x8c, 0x20, 0x36,
+- 0x37, 0x52, 0x87, 0x54, 0x0a, 0x78, 0x6b, 0xc0, 0xf0, 0xfd, 0x8b, 0xd2,
+- 0x8e, 0xbf, 0x6e, 0xd7, 0xfd, 0x7e, 0xb5, 0x31, 0x3e, 0xaa, 0x2e, 0xa1,
+- 0x4b, 0xc3, 0xef, 0x8b, 0xac, 0x44, 0x97, 0x7d, 0x4d, 0x81, 0x66, 0x78,
+- 0xd1, 0x9b, 0xfa, 0x30, 0x62, 0xde, 0xfa, 0x8e, 0x21, 0xb5, 0xfe, 0xa2,
+- 0xa9, 0xea, 0x93, 0xed, 0xaa, 0x65, 0xfd, 0x7c, 0xf1, 0x5b, 0x96, 0x7f,
+- 0x96, 0x65, 0x2d, 0x5a, 0x2c, 0x7d, 0xfa, 0x51, 0x13, 0x31, 0xb1, 0xd6,
+- 0x9e, 0xc3, 0x72, 0x9c, 0x1b, 0xa9, 0x65, 0x1f, 0x1a, 0xfe, 0xf7, 0x35,
+- 0x7a, 0x70, 0xb3, 0x5a, 0x8e, 0xd7, 0xc6, 0xca, 0xf1, 0x0a, 0xc7, 0xf3,
+- 0x8b, 0x11, 0x1f, 0x7e, 0x35, 0x62, 0x59, 0x9f, 0x32, 0xff, 0x0a, 0xc3,
+- 0xb5, 0x83, 0xf8, 0xc7, 0x09, 0x2f, 0x7e, 0x96, 0xd0, 0xf0, 0x6a, 0x22,
+- 0x7a, 0xef, 0x0c, 0xe8, 0xd1, 0x09, 0xe5, 0xf4, 0xed, 0x55, 0x68, 0x6c,
+- 0xaf, 0x52, 0xf4, 0xb6, 0x3d, 0xd0, 0x7d, 0x57, 0x2a, 0x5e, 0x9c, 0xcf,
+- 0x68, 0xf8, 0x49, 0xa6, 0x3e, 0xfc, 0xcf, 0xec, 0xf3, 0x37, 0xe6, 0x63,
+- 0x56, 0x6e, 0x96, 0xe8, 0x4d, 0x74, 0x44, 0x3d, 0xa7, 0xa8, 0xe7, 0x14,
+- 0xf5, 0x9c, 0xa2, 0x9e, 0x29, 0xc3, 0xa3, 0x29, 0xea, 0x99, 0xba, 0xfb,
+- 0x3a, 0x6d, 0xea, 0x6b, 0x9c, 0xc7, 0xe3, 0xf6, 0x3c, 0x86, 0x39, 0x5f,
+- 0x7f, 0x81, 0xbf, 0xb5, 0xb1, 0xf5, 0x59, 0xeb, 0xbf, 0x79, 0x65, 0x4c,
+- 0x0f, 0xcf, 0xcc, 0xe3, 0x97, 0x8c, 0xed, 0x3b, 0x56, 0x4c, 0x93, 0x71,
+- 0xc9, 0xf8, 0x6c, 0xfd, 0xf9, 0xb7, 0x29, 0x3b, 0x15, 0x94, 0x5b, 0xd6,
+- 0x5e, 0xb3, 0xf0, 0xbf, 0xb7, 0x38, 0xbe, 0x9b, 0x95, 0xbc, 0x5d, 0xfd,
+- 0x5d, 0x29, 0xf5, 0x1d, 0x8c, 0xaa, 0x2b, 0x79, 0xae, 0xc7, 0xa3, 0xf8,
+- 0xa8, 0xe3, 0xbd, 0xe7, 0xf7, 0x7a, 0x65, 0x3e, 0xfc, 0x97, 0xce, 0x69,
+- 0x8f, 0x76, 0x7f, 0x77, 0xf2, 0x5c, 0xc6, 0x22, 0xb6, 0x28, 0x36, 0xe0,
+- 0xa5, 0xbd, 0x5c, 0x53, 0xf8, 0x0f, 0x71, 0x35, 0xb2, 0x0d, 0xed, 0xcd,
+- 0x8f, 0xd8, 0x7d, 0x94, 0x24, 0xc5, 0x6f, 0x14, 0xbc, 0xf5, 0x61, 0x05,
+- 0xa7, 0x42, 0x06, 0x6d, 0xe6, 0x18, 0x71, 0x01, 0x28, 0x4d, 0xc2, 0xed,
+- 0x89, 0x44, 0x90, 0x18, 0x80, 0xbb, 0x2c, 0x12, 0xc6, 0xc2, 0x81, 0xfa,
+- 0xce, 0x73, 0xd0, 0x83, 0x03, 0x8a, 0xde, 0xce, 0x58, 0x62, 0x8e, 0x53,
+- 0x8f, 0x57, 0x2a, 0xba, 0xbf, 0x44, 0x81, 0x5b, 0x61, 0xb9, 0x40, 0xe6,
+- 0x18, 0x76, 0x66, 0xe5, 0x77, 0x18, 0x46, 0xe6, 0x37, 0xc5, 0xbe, 0x24,
+- 0xa6, 0xd0, 0xee, 0xcf, 0x71, 0xec, 0xba, 0x9f, 0xf8, 0xea, 0x76, 0x45,
+- 0x3a, 0x71, 0x38, 0x01, 0x77, 0x49, 0x64, 0x2b, 0x9e, 0x4c, 0x84, 0x67,
+- 0x16, 0xcb, 0x29, 0x2c, 0xe7, 0xcf, 0x4c, 0x97, 0xe5, 0xc7, 0x56, 0xd4,
+- 0x9b, 0x97, 0xa5, 0x3c, 0x79, 0x0c, 0x7b, 0x52, 0x52, 0x37, 0x62, 0xd7,
+- 0x75, 0xb2, 0x8f, 0xbe, 0x44, 0x7d, 0xdb, 0x0d, 0x8a, 0x1e, 0x7e, 0x98,
+- 0xf3, 0xd7, 0x83, 0xc6, 0xe8, 0x1b, 0xd0, 0xb5, 0x4e, 0xe4, 0x65, 0x59,
+- 0x90, 0xc9, 0xcb, 0x31, 0x3f, 0x03, 0xe5, 0xf6, 0x14, 0xac, 0x39, 0x06,
+- 0x3c, 0x3e, 0xc3, 0xf0, 0xbf, 0xe3, 0xa8, 0xc5, 0x01, 0xce, 0x4f, 0x1f,
+- 0x7d, 0x45, 0xf0, 0xec, 0xee, 0xbd, 0x7e, 0x78, 0x0c, 0x0b, 0x47, 0x42,
+- 0xb5, 0x78, 0x96, 0x58, 0x5b, 0x45, 0xdf, 0x7c, 0x5e, 0x43, 0x74, 0x4e,
+- 0x24, 0xac, 0xdc, 0x92, 0x1d, 0x2d, 0xcc, 0xc1, 0x8b, 0x35, 0x05, 0x19,
+- 0xdf, 0x77, 0xbd, 0x5a, 0xf9, 0xe0, 0xeb, 0x50, 0x3a, 0x52, 0x7a, 0x30,
+- 0x0e, 0x0b, 0xd5, 0x8b, 0x75, 0xff, 0x94, 0xf2, 0x96, 0x8a, 0x2a, 0x62,
+- 0x75, 0xf6, 0xfd, 0xe5, 0x1a, 0xb5, 0x31, 0xc6, 0x65, 0x07, 0x43, 0x5f,
+- 0x54, 0xd3, 0x4d, 0x36, 0x13, 0x74, 0xd9, 0xd7, 0x1c, 0x48, 0x3b, 0xa3,
+- 0x3e, 0x07, 0x7e, 0x6f, 0x45, 0xd7, 0xc9, 0xb5, 0x72, 0xc4, 0xda, 0x1b,
+- 0x7d, 0x4e, 0x34, 0x86, 0xb7, 0xd3, 0x07, 0xa7, 0xd6, 0xb5, 0xf0, 0xbf,
+- 0x80, 0x79, 0x1a, 0xf5, 0xfe, 0xed, 0x90, 0xdf, 0xef, 0xd0, 0x6e, 0x5a,
+- 0xa4, 0x2e, 0xcb, 0x88, 0x1d, 0xea, 0x9a, 0xf8, 0x78, 0x9f, 0x69, 0x59,
+- 0x87, 0xcd, 0x13, 0x4a, 0x4b, 0xea, 0x5d, 0x2b, 0xea, 0x8c, 0x47, 0x4b,
+- 0x23, 0x01, 0x73, 0x27, 0xc1, 0xd8, 0x11, 0x89, 0x2b, 0xd1, 0x6c, 0x9f,
+- 0x72, 0x7d, 0xb6, 0x5f, 0x59, 0x91, 0x95, 0xf2, 0x27, 0x94, 0xe5, 0x59,
+- 0x29, 0x5f, 0x2c, 0x1b, 0x66, 0x59, 0xe0, 0x48, 0x22, 0x10, 0x2c, 0x96,
+- 0x5f, 0xc1, 0xb2, 0xd7, 0x5f, 0x2a, 0x1b, 0xa6, 0xad, 0x9a, 0x9c, 0x97,
+- 0x0a, 0x6c, 0xd6, 0xf4, 0x68, 0x9c, 0x3a, 0x2f, 0x8d, 0xf8, 0x6e, 0x7d,
+- 0xdd, 0xc8, 0x05, 0x1d, 0x9c, 0x83, 0xa3, 0x1c, 0x59, 0x2b, 0x71, 0x6e,
+- 0x83, 0xe1, 0x42, 0xbf, 0x56, 0x8d, 0x0d, 0xe6, 0x6f, 0xad, 0xcd, 0xeb,
+- 0xe4, 0xbf, 0xbc, 0x6c, 0xb0, 0xcb, 0xd7, 0xb1, 0xbc, 0x6e, 0x1e, 0x2d,
+- 0x60, 0xeb, 0xa9, 0x04, 0x06, 0x1d, 0x11, 0x62, 0x7e, 0x73, 0xc0, 0xdf,
+- 0x03, 0x99, 0x1b, 0x3f, 0xae, 0xa7, 0x2c, 0x69, 0xe7, 0x74, 0xfc, 0x45,
+- 0xfc, 0x72, 0x19, 0xb9, 0x26, 0xe5, 0xa6, 0x68, 0xdf, 0x82, 0x75, 0x96,
+- 0x35, 0x64, 0x8a, 0x9d, 0xfb, 0x68, 0xe7, 0x33, 0xe1, 0xaf, 0xd5, 0xe3,
+- 0x69, 0x56, 0x38, 0x9c, 0x98, 0x81, 0xb4, 0xa6, 0x12, 0x73, 0xef, 0xf2,
+- 0xa0, 0x2a, 0xaa, 0x94, 0x90, 0xdb, 0x60, 0x42, 0xc6, 0x59, 0x89, 0xa8,
+- 0x53, 0x0f, 0xca, 0xdc, 0x95, 0x30, 0xe6, 0x35, 0xa8, 0xac, 0x77, 0xc9,
+- 0x97, 0x65, 0xcc, 0x7e, 0xfa, 0x72, 0xdc, 0xd6, 0x51, 0xeb, 0xa5, 0x71,
+- 0x4b, 0x7b, 0x45, 0x1d, 0xfd, 0x67, 0xea, 0x59, 0xd6, 0x8e, 0x4b, 0xba,
+- 0x2d, 0x89, 0x96, 0x51, 0xb7, 0xc7, 0x12, 0x81, 0xf0, 0xd3, 0x88, 0x2b,
+- 0x6d, 0x59, 0x27, 0xc6, 0x12, 0x52, 0xaf, 0x8f, 0xe5, 0xfb, 0x95, 0x95,
+- 0x97, 0xea, 0x4c, 0x15, 0xfc, 0x56, 0xc6, 0x23, 0xe3, 0xbb, 0x0e, 0x1b,
+- 0xf6, 0xea, 0xf1, 0x38, 0xc4, 0xae, 0xa2, 0x58, 0x6f, 0xea, 0x7e, 0xda,
+- 0x1f, 0xed, 0x06, 0xa8, 0x49, 0xc6, 0xdc, 0x79, 0x0c, 0x00, 0xee, 0xd8,
+- 0xdb, 0xce, 0xb1, 0x5a, 0x78, 0xcd, 0xac, 0xc5, 0x18, 0xbd, 0xb4, 0x3a,
+- 0x29, 0xd7, 0xa7, 0xcb, 0x18, 0x51, 0xd6, 0x1f, 0xf5, 0x97, 0xa1, 0x5c,
+- 0xe4, 0xfc, 0x1b, 0x35, 0x6f, 0xbf, 0x1f, 0x54, 0xff, 0x17, 0xd6, 0x98,
+- 0x37, 0x7f, 0xad, 0x3a, 0x29, 0x9c, 0xaf, 0x1d, 0x5a, 0xd2, 0xc3, 0x78,
+- 0x17, 0xb7, 0x2a, 0x0c, 0xbd, 0xfd, 0x82, 0xd2, 0x8d, 0x1b, 0x43, 0x7a,
+- 0xec, 0x87, 0x8a, 0x1e, 0x1d, 0x50, 0x0c, 0xfa, 0x61, 0x10, 0xab, 0xb2,
+- 0xef, 0xef, 0xeb, 0xfb, 0x50, 0x0f, 0x4b, 0x3f, 0xd2, 0xdf, 0x59, 0xf4,
+- 0xdb, 0x63, 0x2a, 0x8e, 0x47, 0xc6, 0xa6, 0x60, 0xb3, 0x3d, 0xa6, 0x15,
+- 0xb6, 0x7f, 0x7c, 0xd7, 0x74, 0x61, 0xe3, 0xde, 0x53, 0x0b, 0xc5, 0x40,
+- 0x36, 0x1d, 0x8d, 0xa2, 0xb7, 0xd9, 0x85, 0x0d, 0xa3, 0x37, 0xa9, 0x22,
+- 0x1b, 0xd4, 0xf9, 0x65, 0xf9, 0x6f, 0x85, 0xbc, 0xc5, 0x83, 0xf5, 0x59,
+- 0xce, 0x1d, 0x31, 0x74, 0xfd, 0x51, 0x99, 0xdb, 0x5a, 0x7e, 0xcb, 0xdc,
+- 0x7a, 0xf9, 0x2d, 0xf3, 0x3c, 0x8b, 0xdf, 0xd5, 0xf0, 0xcf, 0x12, 0x59,
+- 0x9a, 0x91, 0xd8, 0x0f, 0x77, 0x45, 0xa4, 0x0b, 0x77, 0x0d, 0x58, 0x56,
+- 0x7f, 0xc0, 0xb2, 0xca, 0x42, 0xe4, 0x59, 0x81, 0xc6, 0xf0, 0x95, 0x4a,
+- 0x09, 0xa6, 0xb4, 0x66, 0xf4, 0x1f, 0x2d, 0x89, 0x55, 0x47, 0x66, 0xd1,
+- 0xf7, 0x35, 0xfc, 0x6c, 0x49, 0x3b, 0x26, 0xc6, 0xa7, 0x8f, 0x21, 0x6f,
+- 0x67, 0xdf, 0x5e, 0x50, 0xb4, 0x33, 0x91, 0x5f, 0x64, 0xd7, 0xfb, 0xd3,
+- 0xf4, 0xcb, 0xb8, 0x86, 0x18, 0xfd, 0x83, 0x32, 0xd5, 0xa2, 0xe7, 0x12,
+- 0xa7, 0xfe, 0xa0, 0xfa, 0x17, 0x1b, 0x3b, 0x13, 0xef, 0x5a, 0x0c, 0xa7,
+- 0xfc, 0xe4, 0x1a, 0xef, 0xcd, 0xbc, 0xd7, 0x6e, 0xca, 0x6c, 0xbb, 0x91,
+- 0xb2, 0x17, 0x1b, 0xef, 0xcc, 0xac, 0xb0, 0xc7, 0x9c, 0x66, 0xe1, 0x4d,
+- 0x7b, 0x45, 0xa7, 0xa2, 0x03, 0x0b, 0xc7, 0xcd, 0xeb, 0x88, 0x15, 0xaf,
+- 0x5b, 0x8e, 0x59, 0xd2, 0x46, 0x97, 0xd2, 0x4a, 0x7b, 0x8a, 0x3b, 0x4b,
+- 0x41, 0x4e, 0xad, 0x95, 0x44, 0xa2, 0xca, 0x5a, 0x5b, 0xff, 0xad, 0xca,
+- 0xca, 0xd1, 0xe9, 0x6d, 0x77, 0xd1, 0x77, 0x1f, 0x57, 0xf3, 0xf3, 0x7d,
+- 0xde, 0x1e, 0x43, 0x5e, 0x7e, 0x3f, 0xda, 0x53, 0xd2, 0x8e, 0xe8, 0x35,
+- 0xef, 0x6f, 0xed, 0x12, 0x23, 0x2e, 0xc9, 0x9c, 0xe7, 0x1e, 0x97, 0x31,
+- 0x61, 0xc9, 0x7b, 0xf0, 0xe3, 0x7a, 0xe2, 0x47, 0xf4, 0x3f, 0xc4, 0x8f,
+- 0xa5, 0x7f, 0xa2, 0xec, 0x59, 0xca, 0x21, 0x3c, 0x45, 0xe2, 0x9e, 0xf0,
+- 0x16, 0xe1, 0x2b, 0x41, 0xca, 0x25, 0xfc, 0xa5, 0x68, 0x1b, 0x96, 0xf5,
+- 0x4d, 0x73, 0x01, 0x62, 0xb5, 0xfa, 0x20, 0x50, 0x87, 0x41, 0xca, 0xea,
+- 0x48, 0x22, 0xce, 0x71, 0x52, 0xd7, 0xea, 0x75, 0x0e, 0xa8, 0x4d, 0x0e,
+- 0x74, 0xe3, 0x55, 0xd3, 0xe8, 0xdf, 0x8c, 0xbf, 0x44, 0x8f, 0xd7, 0xc2,
+- 0x61, 0x33, 0x48, 0x5c, 0x2a, 0x47, 0x67, 0x13, 0x27, 0x62, 0xad, 0x17,
+- 0x43, 0xa9, 0x78, 0x07, 0x61, 0x83, 0x31, 0xec, 0xd9, 0x4f, 0x26, 0x02,
+- 0x7a, 0xfb, 0x56, 0xa6, 0x40, 0xab, 0x06, 0xdc, 0xf0, 0x4b, 0x2a, 0xc4,
+- 0x98, 0xf1, 0x75, 0xc6, 0xf9, 0x4d, 0xe6, 0x15, 0xd4, 0x6d, 0x1f, 0x6d,
+- 0x48, 0xa5, 0xbd, 0x48, 0x3f, 0x41, 0xf2, 0x19, 0xa9, 0xcb, 0xb8, 0xd0,
+- 0xa0, 0xe0, 0x86, 0x06, 0xda, 0x27, 0x79, 0xd1, 0xe7, 0x43, 0x4e, 0xfb,
+- 0xff, 0x44, 0xb6, 0x31, 0x7a, 0xb3, 0xfa, 0x23, 0x0b, 0x33, 0xed, 0x36,
+- 0xb4, 0xa8, 0x4a, 0xb9, 0xff, 0x28, 0x27, 0x30, 0x21, 0x5c, 0xad, 0xd2,
+- 0xf8, 0x0d, 0xc6, 0xbd, 0x52, 0xa7, 0x0a, 0x15, 0xc3, 0xf1, 0x59, 0xe5,
+- 0xb4, 0xe1, 0xd2, 0x88, 0x8e, 0xbb, 0x46, 0x2b, 0xe1, 0x18, 0xd6, 0x2f,
+- 0xae, 0x74, 0x20, 0x56, 0x22, 0xfc, 0x70, 0xb4, 0x16, 0x35, 0xfb, 0xac,
+- 0x6e, 0x77, 0xc4, 0xb2, 0x3c, 0x4b, 0x22, 0xb8, 0xf7, 0xa8, 0x06, 0x75,
+- 0x9f, 0x0b, 0x15, 0xcc, 0x43, 0xd6, 0x99, 0x7d, 0xb8, 0x8f, 0xfc, 0x6e,
+- 0x4e, 0x32, 0x88, 0xd5, 0xc4, 0xa2, 0x8b, 0xa9, 0xb6, 0xd6, 0x17, 0x12,
+- 0x0d, 0xdb, 0xe6, 0x38, 0x84, 0xfb, 0xaf, 0xc1, 0xe6, 0xec, 0x1a, 0xdc,
+- 0xc9, 0xd8, 0xf9, 0x9c, 0x81, 0xee, 0x39, 0xf4, 0xd7, 0x3b, 0xc9, 0xff,
+- 0x36, 0xa6, 0xd6, 0x61, 0x63, 0x76, 0x1b, 0xff, 0xeb, 0xc0, 0xdd, 0x3c,
+- 0x36, 0xa5, 0xc4, 0xbf, 0x3f, 0x8d, 0x4d, 0xd9, 0x7a, 0xc4, 0x46, 0x37,
+- 0x62, 0x2b, 0x39, 0xc1, 0x5d, 0xa3, 0x5e, 0xea, 0xb6, 0x0d, 0x1b, 0xb2,
+- 0x6d, 0xb8, 0x97, 0x63, 0xb9, 0x97, 0xf3, 0xa1, 0x26, 0xb7, 0xd2, 0xc7,
+- 0x3c, 0xf0, 0x0e, 0x2f, 0xc5, 0x7d, 0xa3, 0xd7, 0x61, 0x0b, 0xe3, 0xe4,
+- 0xed, 0x4b, 0xae, 0x43, 0xf7, 0xe8, 0x7d, 0xe8, 0x4a, 0x19, 0x5d, 0x73,
+- 0x98, 0x6a, 0xbd, 0xb5, 0xe4, 0x3e, 0xdc, 0x43, 0x39, 0xb6, 0xed, 0xb5,
+- 0x50, 0xb6, 0x68, 0xb1, 0x6a, 0xd4, 0xc4, 0x2d, 0x9f, 0x21, 0xb1, 0xf9,
+- 0xc0, 0xad, 0x7d, 0xc6, 0xee, 0x02, 0xb6, 0x38, 0x51, 0x62, 0x28, 0x62,
+- 0xa3, 0xf9, 0xeb, 0x89, 0xbf, 0xc1, 0xe6, 0x51, 0x17, 0xee, 0x18, 0xed,
+- 0x52, 0x56, 0x8b, 0xad, 0xb8, 0x54, 0xce, 0x67, 0x94, 0xd8, 0xd7, 0xaa,
+- 0xb4, 0x8c, 0xda, 0xf3, 0xac, 0x79, 0x23, 0x5d, 0xca, 0xba, 0xec, 0x9d,
+- 0x0e, 0x94, 0xcb, 0x5c, 0x5c, 0x83, 0xf1, 0xa6, 0xaf, 0x58, 0xe9, 0xfc,
+- 0x7c, 0xa6, 0xe9, 0x3e, 0x6e, 0x5f, 0xe4, 0x57, 0x9f, 0xf4, 0x2d, 0xd0,
+- 0xbb, 0x0e, 0xa8, 0xc2, 0x2b, 0xdd, 0xc8, 0xd9, 0xf3, 0x59, 0xc2, 0x7e,
+- 0x6a, 0x70, 0xc4, 0x9b, 0xe7, 0x12, 0xf3, 0xd8, 0x97, 0x95, 0x72, 0x71,
+- 0xac, 0x94, 0x9b, 0xe3, 0x99, 0x93, 0xf4, 0xe1, 0x7e, 0xea, 0xa7, 0x8b,
+- 0x73, 0xd4, 0x45, 0xbd, 0x7c, 0x2e, 0x75, 0x8a, 0x31, 0x62, 0x1b, 0x3e,
+- 0x57, 0xe8, 0xa7, 0x2f, 0x5b, 0x8a, 0x72, 0xa3, 0x0f, 0x8f, 0x68, 0x25,
+- 0xf4, 0x31, 0xe1, 0x19, 0x07, 0x6e, 0x3d, 0x6c, 0xac, 0xe3, 0x18, 0xbe,
+- 0xc4, 0x36, 0x44, 0xae, 0x46, 0xad, 0x06, 0xf9, 0xb2, 0x3d, 0xc4, 0xec,
+- 0x72, 0xe3, 0x37, 0xd6, 0x23, 0xde, 0x76, 0xbb, 0x6c, 0x15, 0xcb, 0x3e,
+- 0x3f, 0xe0, 0xc7, 0x8d, 0xb4, 0xef, 0xb2, 0x64, 0x94, 0x7a, 0x77, 0x93,
+- 0x53, 0xb5, 0x52, 0xe7, 0x9c, 0x63, 0xea, 0xf5, 0x0e, 0xda, 0xb3, 0x33,
+- 0xb9, 0x86, 0xf3, 0xa0, 0xa1, 0x32, 0xd9, 0xc7, 0x79, 0xf0, 0xc2, 0x9d,
+- 0x6c, 0x47, 0x27, 0xe5, 0x72, 0x25, 0xd7, 0x71, 0x2e, 0xea, 0xe0, 0x49,
+- 0x76, 0x70, 0x2e, 0x80, 0xbb, 0xa8, 0xcb, 0xfb, 0x42, 0xbf, 0x56, 0x7a,
+- 0x6b, 0x65, 0x18, 0x6d, 0x9c, 0xbf, 0x28, 0x36, 0xa7, 0xea, 0xc3, 0x3b,
+- 0x24, 0xee, 0x3b, 0x99, 0x90, 0x19, 0x3f, 0x26, 0x17, 0xa6, 0xf5, 0x1b,
+- 0x3d, 0xfc, 0x5d, 0x94, 0xb3, 0x88, 0xe3, 0x22, 0xa7, 0xc4, 0xd7, 0xa2,
+- 0x9c, 0x2e, 0x94, 0x19, 0xcf, 0x5a, 0x0f, 0x7b, 0xe1, 0x77, 0xb1, 0x6c,
+- 0x39, 0xcb, 0xae, 0xa6, 0x9c, 0xab, 0x29, 0xff, 0xbc, 0xe4, 0xa7, 0xd1,
+- 0x4d, 0x39, 0xe7, 0x0c, 0xbb, 0xc9, 0x51, 0x75, 0xdc, 0x4f, 0xdd, 0x1f,
+- 0x48, 0x95, 0xa1, 0x9a, 0xf3, 0xfc, 0x39, 0xfe, 0xde, 0x41, 0x3f, 0x7a,
+- 0x7e, 0xd0, 0xc2, 0x99, 0x90, 0x86, 0x41, 0xad, 0x0c, 0xbd, 0xc1, 0xad,
+- 0xe4, 0xe5, 0x32, 0x57, 0xcc, 0xa7, 0x8c, 0x0a, 0xc6, 0x75, 0xc4, 0x5d,
+- 0xcd, 0x3a, 0xb6, 0x07, 0xdd, 0x48, 0x7b, 0x11, 0x75, 0x19, 0x51, 0xda,
+- 0xb8, 0x0b, 0x03, 0x9a, 0x02, 0x17, 0xf1, 0xb0, 0x94, 0xfe, 0xb4, 0x93,
+- 0x71, 0xd7, 0x15, 0x91, 0xff, 0x68, 0x27, 0xe4, 0x60, 0xd5, 0x11, 0x23,
+- 0xfe, 0x82, 0x12, 0x68, 0x73, 0xa9, 0xf7, 0x51, 0x47, 0x15, 0x38, 0x33,
+- 0xf8, 0x25, 0x6c, 0x64, 0x5f, 0x7d, 0x29, 0x0f, 0x73, 0x93, 0xbf, 0x53,
+- 0x72, 0x36, 0x7e, 0x7a, 0x90, 0x1c, 0x79, 0xdc, 0x9a, 0x67, 0x88, 0xdd,
+- 0x44, 0x70, 0xcf, 0xd1, 0x2a, 0x0c, 0x0e, 0x5e, 0x87, 0x6d, 0x2c, 0xb7,
+- 0x2b, 0x55, 0x0d, 0x63, 0x68, 0x99, 0x5d, 0x67, 0x84, 0xfe, 0x35, 0x90,
+- 0xbc, 0x0f, 0x2b, 0x53, 0xf5, 0xc1, 0xa3, 0x4a, 0x8c, 0x3a, 0xf4, 0xa2,
+- 0x3f, 0xb9, 0xd1, 0xd6, 0x69, 0x62, 0x5f, 0x27, 0xb6, 0x1e, 0xbd, 0x02,
+- 0x7b, 0xf6, 0x6d, 0xc1, 0x5d, 0x47, 0x99, 0xbf, 0xda, 0xb6, 0xac, 0xa2,
+- 0x77, 0xdf, 0x75, 0xca, 0x06, 0xb6, 0xb7, 0x7b, 0x98, 0xf6, 0x4c, 0x9b,
+- 0xbe, 0x7f, 0xaf, 0x91, 0x5b, 0xe6, 0xd8, 0xa2, 0xf8, 0x6b, 0xaf, 0x43,
+- 0x97, 0x6d, 0x7b, 0x79, 0xbd, 0xed, 0xc8, 0xce, 0x67, 0x9e, 0xf3, 0xb7,
+- 0xd6, 0xa3, 0xde, 0x52, 0x7b, 0x7e, 0x55, 0xea, 0xad, 0x25, 0xc1, 0xdc,
+- 0xbf, 0x96, 0xb9, 0x57, 0xc1, 0x5e, 0x7a, 0xb3, 0x8b, 0xc9, 0x1b, 0xbd,
+- 0xc8, 0x68, 0x41, 0xea, 0xa3, 0x38, 0x0f, 0x0d, 0x05, 0x7b, 0x79, 0x8b,
+- 0x65, 0x6c, 0x5b, 0x7e, 0x9f, 0x2f, 0xc8, 0xfc, 0xb6, 0xa3, 0x86, 0xf1,
+- 0x75, 0x43, 0x68, 0x9d, 0x72, 0xaf, 0x76, 0x69, 0xce, 0x7c, 0xc5, 0x39,
+- 0x93, 0x3c, 0xd1, 0x6e, 0x2b, 0xf1, 0x25, 0xdb, 0x76, 0xaf, 0xcf, 0x36,
+- 0xa3, 0x73, 0x74, 0x7a, 0xfb, 0xc5, 0x3a, 0x65, 0x9c, 0x8b, 0xe2, 0x3c,
+- 0xeb, 0xfd, 0x82, 0x65, 0x81, 0x45, 0x45, 0x2c, 0xbb, 0xb3, 0xd0, 0xff,
+- 0x41, 0x8b, 0x31, 0xc9, 0xe9, 0x32, 0x1c, 0x18, 0x09, 0xfe, 0x57, 0x25,
+- 0x5e, 0xeb, 0xa4, 0xcc, 0x0a, 0xb1, 0xe4, 0xef, 0xac, 0x3d, 0xeb, 0x64,
+- 0x5e, 0x3e, 0x42, 0x43, 0x86, 0xe2, 0xba, 0xe4, 0xb3, 0x6b, 0xb0, 0x3e,
+- 0x25, 0xb2, 0xb6, 0x63, 0x43, 0xca, 0x96, 0xcb, 0x5f, 0x94, 0xab, 0x8f,
+- 0x36, 0xa3, 0x25, 0x77, 0xdb, 0x32, 0xb5, 0xd3, 0xae, 0xee, 0xd9, 0xab,
+- 0xe2, 0xe9, 0xd0, 0x26, 0xc5, 0x3f, 0x53, 0xe2, 0x70, 0x3d, 0xba, 0xf6,
+- 0xca, 0xb7, 0x9f, 0x7c, 0x37, 0xa6, 0x4c, 0xcd, 0x1c, 0x60, 0xb9, 0x65,
+- 0x58, 0xbf, 0xb7, 0x16, 0x73, 0x38, 0xd6, 0xdb, 0xcd, 0xff, 0xa2, 0xbc,
+- 0x33, 0x43, 0xc6, 0xb3, 0xa2, 0x10, 0xcb, 0xeb, 0x71, 0xdf, 0x5e, 0xf1,
+- 0x21, 0xf9, 0xdd, 0x82, 0xde, 0xa5, 0xf5, 0x85, 0x38, 0xff, 0x37, 0x9c,
+- 0x97, 0x2e, 0xe5, 0x06, 0xe2, 0x42, 0x8c, 0xb8, 0x40, 0x9b, 0x52, 0xda,
+- 0x89, 0x0b, 0xd7, 0x17, 0x70, 0xc1, 0x43, 0x5c, 0x58, 0x93, 0x7d, 0x9b,
+- 0xf2, 0x88, 0x2f, 0xbe, 0x57, 0x9e, 0xbb, 0x29, 0xcf, 0xb1, 0xd0, 0x1c,
+- 0xc0, 0x96, 0x67, 0x19, 0x79, 0x4c, 0x2d, 0xe7, 0xd0, 0x62, 0x7c, 0x50,
+- 0x94, 0x11, 0x5b, 0xcf, 0xcb, 0x28, 0xb3, 0xd8, 0x94, 0x45, 0xb9, 0x7f,
+- 0x8f, 0x06, 0x7b, 0x7d, 0xe0, 0xb2, 0x3c, 0xeb, 0xf7, 0xbe, 0xcb, 0x1c,
+- 0x41, 0x7e, 0x13, 0x2f, 0x9a, 0xeb, 0x89, 0x73, 0xcb, 0x88, 0x7b, 0x2e,
+- 0x8e, 0x4b, 0xb0, 0x4e, 0x64, 0x73, 0xd1, 0x2f, 0xa4, 0x6d, 0xd1, 0xc9,
+- 0x52, 0x47, 0x7e, 0x1e, 0x8a, 0xf3, 0xec, 0xa4, 0x1f, 0xbb, 0x51, 0x1d,
+- 0xd1, 0xa3, 0x37, 0x39, 0x64, 0xce, 0x88, 0xf2, 0x43, 0xed, 0x85, 0xbe,
+- 0xfe, 0xbb, 0xd2, 0x50, 0xd3, 0x4f, 0x39, 0x4f, 0x28, 0xb7, 0x70, 0x5c,
+- 0xfe, 0xd2, 0xaa, 0xa8, 0x27, 0x12, 0xe8, 0x48, 0xbc, 0x2f, 0x36, 0xde,
+- 0x90, 0xcd, 0xf3, 0x4b, 0x75, 0x28, 0x6e, 0x95, 0xd3, 0xf6, 0x9d, 0x46,
+- 0xe0, 0xe2, 0x6a, 0xf6, 0x30, 0xef, 0xa0, 0xf0, 0x19, 0x93, 0x6d, 0x15,
+- 0xfb, 0xaa, 0x23, 0x96, 0x84, 0x0a, 0x76, 0xb0, 0x46, 0x61, 0xde, 0xd0,
+- 0x16, 0xb5, 0xed, 0x61, 0x17, 0xf5, 0x75, 0x42, 0xf9, 0x98, 0x70, 0x66,
+- 0x9b, 0x63, 0xc4, 0x95, 0x55, 0xc4, 0x95, 0xea, 0xa4, 0x12, 0xf5, 0x46,
+- 0x1a, 0xb7, 0xd5, 0x20, 0xd0, 0xf6, 0x28, 0xfb, 0xac, 0x21, 0xcf, 0xbc,
+- 0x89, 0xb1, 0x36, 0xc9, 0x3e, 0x57, 0xb1, 0xcf, 0xb5, 0xd9, 0x2d, 0x6c,
+- 0x57, 0xb0, 0x55, 0xc5, 0x9c, 0x7d, 0x70, 0x7b, 0x69, 0x07, 0x23, 0x0d,
+- 0x4e, 0x84, 0x17, 0xff, 0x02, 0x98, 0x81, 0x98, 0xca, 0xfc, 0x7d, 0x5e,
+- 0x52, 0x72, 0xa9, 0x03, 0xb7, 0x2e, 0xcb, 0x08, 0x96, 0x6a, 0xf0, 0x0c,
+- 0x7b, 0x25, 0x1e, 0xa1, 0x2f, 0x54, 0xa7, 0xec, 0xb1, 0xf1, 0x56, 0x45,
+- 0xd9, 0x3e, 0x05, 0x57, 0x85, 0xbe, 0xae, 0xa4, 0x67, 0xe6, 0x31, 0x5f,
+- 0xa5, 0x3e, 0x7a, 0x26, 0x04, 0x1b, 0xd3, 0xc4, 0xc6, 0x63, 0x4a, 0x7e,
+- 0x3d, 0x86, 0x7e, 0x9f, 0x42, 0xbc, 0x2a, 0x22, 0x6b, 0x20, 0x81, 0xce,
+- 0x0f, 0x29, 0xf7, 0x11, 0x0b, 0x5d, 0x8c, 0x43, 0x1e, 0x62, 0xa3, 0xc4,
+- 0xe9, 0xf4, 0xad, 0x89, 0x81, 0x3a, 0xf4, 0xd3, 0xb7, 0x37, 0x1e, 0x3d,
+- 0x75, 0x8b, 0x07, 0xb5, 0xfc, 0xf6, 0xf2, 0x98, 0xc5, 0xc3, 0x4d, 0x5f,
+- 0x76, 0xc3, 0x31, 0x20, 0x7c, 0xaf, 0x89, 0xb1, 0xca, 0x83, 0xf2, 0x01,
+- 0x13, 0x5b, 0x28, 0x4f, 0xe9, 0x50, 0x33, 0xe3, 0x09, 0xfd, 0x3c, 0x55,
+- 0x83, 0xeb, 0x07, 0x97, 0x60, 0x93, 0x8d, 0x5f, 0xb5, 0x38, 0x3b, 0xb8,
+- 0xd4, 0xc6, 0x8d, 0x87, 0x52, 0x33, 0xf0, 0xce, 0xde, 0x6b, 0x6c, 0x8c,
+- 0x1b, 0x64, 0x6c, 0xf6, 0xed, 0x0b, 0xa3, 0x8b, 0x6d, 0x7a, 0xf7, 0x5d,
+- 0x8b, 0xfb, 0x8e, 0xfa, 0xa8, 0x23, 0x83, 0x71, 0x40, 0x7d, 0xd7, 0xff,
+- 0x49, 0xb1, 0xf3, 0xe9, 0xd8, 0x2f, 0x73, 0x2d, 0x75, 0x32, 0x34, 0x56,
+- 0xf9, 0xed, 0xb4, 0xb9, 0x70, 0x5e, 0x47, 0x79, 0x9d, 0x5c, 0x4d, 0x9d,
+- 0xdc, 0x94, 0xa5, 0x39, 0x0c, 0x3b, 0x39, 0xd7, 0xe4, 0x10, 0x35, 0xb5,
+- 0xf4, 0xcb, 0x12, 0x1e, 0xb4, 0xff, 0xd1, 0xbf, 0x60, 0x6c, 0xcf, 0x71,
+- 0x3e, 0xf9, 0xdb, 0x94, 0xf9, 0x94, 0xf8, 0xe9, 0x20, 0xe6, 0x2a, 0xd4,
+- 0xef, 0xff, 0x02, 0x66, 0xe7, 0x73, 0x9b, 0xa2, 0xae, 0x54, 0x8e, 0xbf,
+- 0x25, 0x91, 0xb3, 0x39, 0x3d, 0x33, 0x22, 0x5d, 0xe5, 0x7f, 0x1b, 0x8f,
+- 0x92, 0x73, 0x27, 0xc5, 0x67, 0xbd, 0xb4, 0xe7, 0x26, 0xea, 0x4b, 0x63,
+- 0xec, 0x30, 0x89, 0x73, 0xb3, 0xe0, 0xe2, 0x38, 0x36, 0x51, 0x3f, 0x1e,
+- 0x8e, 0x63, 0x2b, 0xcb, 0xdd, 0xc5, 0xff, 0xee, 0x3a, 0x5a, 0xcb, 0xc3,
+- 0xcb, 0x63, 0x16, 0x8f, 0x9f, 0x12, 0xb3, 0x9a, 0x69, 0xc7, 0x0e, 0x94,
+- 0x0c, 0xab, 0x78, 0xca, 0x54, 0x70, 0xa1, 0x89, 0xfd, 0x35, 0x5c, 0xc6,
+- 0x3a, 0x89, 0x65, 0xde, 0xe4, 0x97, 0x88, 0x73, 0x7e, 0xac, 0x23, 0x27,
+- 0xe8, 0xdc, 0xab, 0xc1, 0x15, 0xca, 0x30, 0x67, 0x12, 0x19, 0x4e, 0x14,
+- 0x38, 0xe6, 0x3c, 0xe6, 0x3a, 0x8d, 0x61, 0xda, 0x90, 0xb6, 0xd9, 0xb6,
+- 0xa1, 0x38, 0xe3, 0x73, 0x90, 0xb9, 0x7e, 0xde, 0x76, 0x5b, 0xde, 0x63,
+- 0x47, 0xf4, 0x31, 0x8e, 0x67, 0x4e, 0x44, 0xf7, 0xdf, 0x42, 0x5f, 0x10,
+- 0xce, 0x57, 0x9a, 0x04, 0x0e, 0x0c, 0xb6, 0xa3, 0x9a, 0x36, 0xe3, 0x5d,
+- 0x7c, 0x14, 0xa9, 0xda, 0x7e, 0xdb, 0x56, 0xf3, 0x6d, 0x97, 0x45, 0x2b,
+- 0x23, 0x8d, 0x31, 0x69, 0x7b, 0xbc, 0xd0, 0xf6, 0x0a, 0xb6, 0x9d, 0x60,
+- 0xdb, 0x2b, 0xff, 0x5d, 0xdb, 0xd3, 0xe3, 0x5d, 0x4f, 0x21, 0x2e, 0x4b,
+- 0xde, 0x5c, 0xc4, 0xed, 0x22, 0xc7, 0xf8, 0x8d, 0xf7, 0x32, 0x4e, 0xee,
+- 0x90, 0xb9, 0xf3, 0xe5, 0x7d, 0xf6, 0xbd, 0xd8, 0x7c, 0xb9, 0xad, 0x3d,
+- 0xc5, 0x18, 0x6f, 0xd6, 0x4c, 0x6b, 0x6b, 0x0e, 0xff, 0xff, 0x70, 0x4a,
+- 0xb8, 0x44, 0x3b, 0x2c, 0xca, 0xfa, 0xac, 0xa1, 0x77, 0x2d, 0x73, 0x18,
+- 0xdb, 0x2e, 0x32, 0xd7, 0xb9, 0xf1, 0x52, 0x5f, 0xb2, 0x36, 0xd2, 0x8e,
+- 0x85, 0x03, 0x7a, 0xe7, 0x2e, 0xf2, 0xd1, 0xc3, 0x21, 0x3d, 0xfa, 0x2d,
+- 0xe8, 0xf1, 0x52, 0xe5, 0x25, 0x94, 0x4c, 0x9c, 0xc5, 0x60, 0xf6, 0x47,
+- 0x92, 0x6f, 0xb2, 0x4d, 0xb7, 0xe2, 0x99, 0xe8, 0x43, 0x8c, 0xf5, 0xdc,
+- 0xac, 0xe7, 0x1e, 0x80, 0xbb, 0x92, 0xf5, 0xc6, 0x07, 0xe2, 0x96, 0x8b,
+- 0x5c, 0x50, 0x8d, 0xe8, 0x1d, 0x95, 0x8a, 0x11, 0xdb, 0xc4, 0xb6, 0xd7,
+- 0x30, 0x96, 0x95, 0x27, 0xbb, 0xc9, 0x03, 0x74, 0xdf, 0x97, 0x55, 0xbd,
+- 0x6b, 0x3d, 0x5e, 0xc2, 0xbf, 0x92, 0x3c, 0xce, 0x4b, 0x9e, 0x45, 0x8a,
+- 0xed, 0x59, 0xe3, 0x1a, 0xf9, 0xcc, 0xbb, 0x56, 0x78, 0x41, 0x85, 0x53,
+- 0xda, 0xbd, 0x38, 0xbe, 0xe0, 0xdd, 0xc4, 0x65, 0x3c, 0xd7, 0x5c, 0x46,
+- 0xe3, 0xfb, 0xf0, 0xa9, 0xa9, 0x75, 0x45, 0x62, 0xfd, 0x56, 0x57, 0x64,
+- 0xdb, 0xfd, 0xc7, 0x9b, 0xf3, 0x76, 0xeb, 0xcf, 0xb8, 0x71, 0xd6, 0x2b,
+- 0xbe, 0xc4, 0xfc, 0x67, 0x7f, 0x13, 0x76, 0xef, 0x67, 0x5e, 0xa9, 0x36,
+- 0x86, 0xcb, 0x95, 0x1a, 0xe6, 0x44, 0xc3, 0x36, 0x1f, 0x76, 0x1a, 0xbb,
+- 0xec, 0x9c, 0x59, 0xe2, 0x83, 0xd4, 0x99, 0x9f, 0x91, 0xf8, 0x27, 0xeb,
+- 0x39, 0x07, 0x6e, 0xdd, 0x90, 0xa0, 0xdf, 0x6a, 0xbd, 0x2c, 0xb3, 0xae,
+- 0xb0, 0x4e, 0x2f, 0x6b, 0x18, 0xbd, 0xd3, 0x38, 0xc9, 0xba, 0x69, 0xb1,
+- 0xaa, 0xd1, 0x5f, 0x73, 0x29, 0x8e, 0x74, 0x14, 0xca, 0x33, 0xd9, 0xb3,
+- 0x65, 0x73, 0x4f, 0xc3, 0xb3, 0x1d, 0xbc, 0x96, 0xf7, 0x85, 0xcb, 0xf1,
+- 0x6e, 0x67, 0x61, 0x6e, 0x0e, 0xb9, 0xf2, 0xb8, 0xff, 0x69, 0x77, 0x71,
+- 0xbd, 0x28, 0x5f, 0xe6, 0xda, 0x12, 0x94, 0xef, 0xb9, 0x14, 0x5b, 0xe2,
+- 0xc4, 0xf2, 0x6d, 0x7b, 0xf3, 0xeb, 0x93, 0x95, 0x4b, 0x05, 0xb7, 0xeb,
+- 0x71, 0xb7, 0xed, 0xf7, 0x5f, 0x75, 0xe5, 0xed, 0xc0, 0x59, 0x18, 0x97,
+- 0x49, 0x1b, 0xbc, 0x52, 0xd6, 0xfc, 0x0b, 0xf8, 0x39, 0x9b, 0xff, 0xf7,
+- 0x42, 0xe6, 0xc2, 0x45, 0xff, 0x7c, 0xdc, 0x74, 0x60, 0x6a, 0x46, 0x9e,
+- 0xaf, 0xab, 0xfb, 0x9a, 0xd0, 0x33, 0x46, 0xbc, 0xa1, 0x0f, 0xb5, 0x85,
+- 0xd6, 0x5a, 0xa8, 0x91, 0x75, 0x83, 0x5a, 0x54, 0xec, 0x13, 0xde, 0x4c,
+- 0x9e, 0x31, 0x76, 0xca, 0x1e, 0x4b, 0x6f, 0x26, 0xbf, 0x2e, 0xb2, 0x33,
+- 0xd5, 0xf7, 0xee, 0x1d, 0x9a, 0xe0, 0x85, 0xd8, 0x46, 0xdd, 0xad, 0x0b,
+- 0x03, 0x39, 0xbf, 0x03, 0xba, 0xb9, 0x4b, 0x56, 0x92, 0x12, 0xb7, 0x61,
+- 0x7b, 0xad, 0x82, 0x2e, 0xa3, 0x1a, 0x8e, 0xc5, 0xbf, 0xb5, 0xee, 0x58,
+- 0x27, 0xff, 0xbd, 0x5b, 0xc0, 0x97, 0x0f, 0xb2, 0x6f, 0x19, 0xb7, 0x70,
+- 0x3a, 0x37, 0x2a, 0xe8, 0x53, 0x37, 0x38, 0x84, 0x73, 0x2a, 0x8c, 0x9d,
+- 0xf6, 0x5c, 0xa0, 0x37, 0xad, 0x60, 0x77, 0x5a, 0x30, 0xd3, 0x49, 0x1c,
+- 0xf4, 0x61, 0x67, 0x5a, 0x70, 0xd0, 0x45, 0x1c, 0x9c, 0x83, 0xed, 0x69,
+- 0xc1, 0xc1, 0x12, 0xbc, 0x3c, 0x78, 0x05, 0x1e, 0xe2, 0xef, 0x07, 0x53,
+- 0xa5, 0x08, 0xef, 0xfd, 0x0b, 0x1c, 0x48, 0x0b, 0x7f, 0x72, 0x23, 0x35,
+- 0x5c, 0x87, 0x54, 0x3a, 0xcf, 0x25, 0xaa, 0x86, 0xff, 0x12, 0x49, 0xfe,
+- 0x1e, 0x20, 0xef, 0xcb, 0x0c, 0xcd, 0x45, 0x82, 0xbf, 0x65, 0xbd, 0xcd,
+- 0x43, 0xf9, 0x13, 0x81, 0x0a, 0x6c, 0x18, 0x92, 0x1c, 0xda, 0x77, 0xeb,
+- 0x5d, 0x81, 0x79, 0xec, 0xb3, 0x0e, 0xbb, 0xc9, 0xd9, 0xda, 0x86, 0xfc,
+- 0xe8, 0xe7, 0xef, 0x9d, 0xa9, 0x4a, 0xbc, 0x36, 0xa8, 0xdb, 0xfd, 0xf5,
+- 0xa4, 0x56, 0xac, 0x70, 0x19, 0x55, 0x58, 0x31, 0x38, 0x1f, 0x3b, 0xd2,
+- 0x82, 0xbd, 0xd5, 0xc4, 0xde, 0x7a, 0x3c, 0x98, 0x16, 0x7e, 0xa9, 0xc1,
+- 0xbb, 0xd7, 0xc0, 0x48, 0x5a, 0xd6, 0x84, 0x6b, 0x70, 0x61, 0x28, 0x80,
+- 0x41, 0xbb, 0x7f, 0x13, 0xc9, 0x54, 0x98, 0xf2, 0x79, 0x51, 0xb9, 0x2f,
+- 0xe7, 0xab, 0x82, 0x82, 0xc9, 0x40, 0x10, 0x03, 0x63, 0xb3, 0x50, 0xbe,
+- 0x4f, 0x37, 0xb7, 0x42, 0xbf, 0x78, 0x17, 0xae, 0xc4, 0xee, 0x31, 0x1f,
+- 0x4a, 0xf7, 0x55, 0xc3, 0x1d, 0x6a, 0xc2, 0xce, 0xb1, 0x0f, 0x61, 0xfb,
+- 0x58, 0x1d, 0xb1, 0x13, 0x78, 0x3a, 0x63, 0xa2, 0x9f, 0x18, 0x3c, 0x87,
+- 0x31, 0xe6, 0x95, 0xac, 0xcc, 0xa3, 0xcc, 0x8f, 0x02, 0x4f, 0xa0, 0x9a,
+- 0x31, 0x4a, 0x7e, 0xcb, 0xb5, 0xb0, 0x8d, 0xed, 0xf9, 0x75, 0x2a, 0x3d,
+- 0xbe, 0x13, 0xb6, 0xbe, 0x91, 0xcb, 0x88, 0xee, 0x65, 0x4d, 0x68, 0xba,
+- 0x3d, 0xed, 0xb4, 0xd7, 0xe8, 0x2f, 0xdb, 0xe5, 0x5f, 0x15, 0xec, 0xd2,
+- 0x5e, 0x53, 0xc3, 0x93, 0x97, 0xf2, 0x5c, 0xb4, 0x96, 0x20, 0x60, 0x3a,
+- 0x15, 0xf8, 0x99, 0xef, 0xfa, 0x9f, 0x7a, 0xdf, 0xda, 0xda, 0xe5, 0xf5,
+- 0x9f, 0xe9, 0x6b, 0xb0, 0x72, 0x6f, 0x49, 0x65, 0x3c, 0x2f, 0x41, 0x5c,
+- 0x93, 0x35, 0xaa, 0x46, 0x8d, 0x5a, 0x79, 0x5f, 0xde, 0x5d, 0x15, 0x2b,
+- 0x8b, 0x34, 0xc3, 0x3f, 0x5e, 0xe7, 0x7f, 0x2d, 0x21, 0x3a, 0xfd, 0xbd,
+- 0xe5, 0x36, 0x0c, 0xdf, 0x31, 0xd4, 0xf9, 0x7f, 0x92, 0x79, 0xbb, 0x04,
+- 0x55, 0x1e, 0x5c, 0x9f, 0xf8, 0xe0, 0x7a, 0x6a, 0x04, 0xca, 0xca, 0x66,
+- 0x1f, 0x79, 0x3f, 0x9c, 0xab, 0x17, 0x60, 0xda, 0x87, 0x7c, 0x24, 0x02,
+- 0xf5, 0x74, 0x73, 0x98, 0xb9, 0x7e, 0xfe, 0x7e, 0xce, 0xf2, 0xac, 0xee,
+- 0x8b, 0x2a, 0xf9, 0x7b, 0x36, 0x9d, 0xa1, 0x3f, 0xd0, 0xae, 0xbb, 0x85,
+- 0xb3, 0xb0, 0x2f, 0x60, 0x6b, 0xc2, 0xb2, 0x9e, 0xa4, 0x0e, 0xe4, 0x5e,
+- 0xe0, 0x9b, 0x99, 0xdf, 0x59, 0x93, 0x5e, 0x27, 0x5e, 0x37, 0xa6, 0xb7,
+- 0x47, 0xae, 0x17, 0x31, 0x19, 0xfb, 0xec, 0x13, 0x75, 0xdc, 0x68, 0xdc,
+- 0x76, 0x98, 0x79, 0xf2, 0xc2, 0x80, 0xee, 0x4f, 0xe2, 0xff, 0x5a, 0xc2,
+- 0x0b, 0xd3, 0x4a, 0x71, 0xdd, 0xee, 0xfd, 0x6b, 0x27, 0x55, 0x31, 0x17,
+- 0xc7, 0x77, 0x28, 0xa1, 0xf7, 0xc7, 0x99, 0xb7, 0x45, 0xbd, 0x88, 0x39,
+- 0x23, 0x75, 0xfe, 0x9d, 0x09, 0x7b, 0x9c, 0xe6, 0x79, 0xce, 0xdd, 0xe9,
+- 0xe6, 0x3a, 0x7f, 0x6f, 0x46, 0x6c, 0x50, 0xe1, 0x58, 0x9a, 0xf1, 0x70,
+- 0x46, 0xc5, 0x9d, 0x0f, 0x78, 0xb1, 0x69, 0xc0, 0x83, 0x6d, 0x03, 0x5f,
+- 0x82, 0x71, 0x95, 0x13, 0x77, 0x30, 0xf7, 0xdb, 0x3c, 0x50, 0x4a, 0x3d,
+- 0x6a, 0xd8, 0x32, 0xe0, 0x44, 0xd3, 0x55, 0x55, 0x88, 0xcf, 0x2c, 0xc5,
+- 0xf3, 0xf4, 0xdd, 0xab, 0x42, 0x15, 0x48, 0xdb, 0x9c, 0x43, 0xb0, 0x41,
+- 0x78, 0x9b, 0xe8, 0x8d, 0x71, 0xd0, 0x10, 0x0c, 0xf9, 0xa0, 0xf5, 0x99,
+- 0xdf, 0x58, 0xb9, 0x99, 0x7b, 0x6c, 0x3e, 0xe9, 0x88, 0x88, 0x6e, 0xa4,
+- 0xae, 0xac, 0x35, 0x79, 0x19, 0x23, 0xdf, 0xa3, 0x47, 0x65, 0x5e, 0x24,
+- 0x30, 0xb9, 0x4c, 0x71, 0x20, 0x1c, 0xa8, 0x8a, 0x55, 0x47, 0xc2, 0x58,
+- 0x99, 0xed, 0xf1, 0xf9, 0xec, 0x7b, 0x59, 0x11, 0x9c, 0x5f, 0x62, 0xe2,
+- 0x96, 0x2c, 0x9c, 0x2b, 0xa9, 0xfb, 0x56, 0xea, 0x75, 0x87, 0xf9, 0x07,
+- 0x2b, 0x9f, 0xd7, 0xb8, 0x89, 0x97, 0x96, 0xb5, 0x99, 0xfa, 0x65, 0x4e,
+- 0x81, 0x9f, 0x16, 0xf4, 0x2b, 0x3a, 0xad, 0x18, 0xff, 0x9d, 0x75, 0x9a,
+- 0xfa, 0x75, 0xb3, 0x3d, 0x37, 0xdb, 0x2b, 0x1b, 0x7f, 0xaf, 0x9e, 0x4b,
+- 0x29, 0xcf, 0x4a, 0x5b, 0x86, 0xd9, 0x72, 0x2f, 0xc0, 0x1f, 0x55, 0x8a,
+- 0x3c, 0xf4, 0x4f, 0x8d, 0xe9, 0x25, 0x7b, 0xbd, 0xed, 0xeb, 0x59, 0xcb,
+- 0x1a, 0x36, 0x45, 0xff, 0x7e, 0xea, 0x5f, 0xd6, 0x5d, 0x64, 0x0e, 0x9a,
+- 0x10, 0xad, 0xd5, 0xfb, 0x01, 0x49, 0x7c, 0x15, 0xcc, 0x60, 0xae, 0xf5,
+- 0x8d, 0x76, 0x0f, 0x5e, 0x4b, 0x54, 0xda, 0xe3, 0xbe, 0xaa, 0xc1, 0xb2,
+- 0xbe, 0x16, 0xf2, 0xe3, 0x4d, 0xa3, 0x31, 0xbc, 0x48, 0xd5, 0x19, 0x13,
+- 0x64, 0xed, 0x83, 0xba, 0x48, 0xcd, 0xe5, 0x7c, 0x89, 0xcf, 0x63, 0x1b,
+- 0xed, 0xc9, 0xef, 0x88, 0x00, 0xaf, 0x26, 0x8c, 0xe0, 0x0e, 0xf6, 0x3f,
+- 0xea, 0x8d, 0x60, 0x7b, 0x4a, 0x6d, 0x75, 0x92, 0x7c, 0x96, 0x31, 0xd7,
+- 0xdb, 0x85, 0x7f, 0xb5, 0xd2, 0x5e, 0x0b, 0x25, 0x21, 0x89, 0x25, 0xf3,
+- 0x70, 0x46, 0x73, 0xe0, 0x99, 0xe0, 0x2c, 0x44, 0x6b, 0x1c, 0xe4, 0x33,
+- 0xaf, 0x5b, 0xff, 0xec, 0x95, 0x7e, 0x64, 0x2c, 0x7f, 0xe0, 0x38, 0x14,
+- 0x1b, 0xef, 0x76, 0xa6, 0x22, 0xd4, 0xf7, 0xfb, 0xfb, 0xff, 0xbf, 0xd6,
+- 0x94, 0x57, 0xfa, 0xd7, 0x35, 0x3f, 0xf9, 0xf9, 0xe3, 0x1f, 0xb8, 0xce,
+- 0x12, 0xe4, 0x78, 0xbf, 0x67, 0x7d, 0xc7, 0x6e, 0xf3, 0x23, 0xa5, 0x79,
+- 0x5e, 0x2f, 0xed, 0x3d, 0xcd, 0xf1, 0x49, 0x9b, 0xc5, 0x7e, 0x44, 0x6f,
+- 0x93, 0xa5, 0x82, 0xd7, 0x3b, 0x53, 0xa2, 0x3f, 0xc9, 0x97, 0x4e, 0x5b,
+- 0x98, 0x25, 0xe7, 0x0f, 0xdb, 0x65, 0xe3, 0xd4, 0x57, 0x0f, 0x6d, 0x88,
+- 0xb1, 0x81, 0xf1, 0x42, 0xee, 0xb2, 0x6a, 0xc4, 0x5c, 0x0b, 0xdb, 0x19,
+- 0xb2, 0xd2, 0xde, 0x6a, 0xec, 0x34, 0x69, 0x77, 0x86, 0x3a, 0xdf, 0x09,
+- 0x0b, 0xa7, 0x4d, 0x39, 0x77, 0x61, 0xca, 0xeb, 0xc0, 0x2e, 0xd3, 0x89,
+- 0x4e, 0x43, 0xd5, 0xe5, 0xba, 0x23, 0x24, 0xe7, 0x2e, 0xf8, 0x67, 0x2a,
+- 0xd8, 0x13, 0x56, 0xb1, 0xc5, 0xe8, 0xf1, 0xcb, 0xf5, 0xe5, 0x21, 0x39,
+- 0x57, 0xb0, 0x91, 0x3a, 0x89, 0x33, 0x57, 0xde, 0xca, 0x76, 0x7b, 0x43,
+- 0xf9, 0x75, 0xf1, 0x18, 0x2c, 0x6b, 0x8f, 0xd9, 0xf2, 0xe1, 0x0a, 0x96,
+- 0x3b, 0x67, 0x4a, 0xec, 0x38, 0x70, 0xcb, 0xc2, 0x40, 0x3c, 0x5a, 0x02,
+- 0x3d, 0x56, 0x46, 0x3f, 0xdd, 0x39, 0x30, 0x8f, 0xf5, 0x04, 0xfb, 0x9d,
+- 0xbe, 0xdd, 0x90, 0xf5, 0xae, 0x80, 0xff, 0x27, 0xe4, 0xde, 0x69, 0xef,
+- 0x02, 0x6a, 0xd6, 0xf0, 0xbf, 0xc2, 0x79, 0xab, 0x36, 0x9c, 0xdb, 0x5e,
+- 0x80, 0xde, 0x59, 0xa6, 0x2c, 0x08, 0x56, 0xc1, 0x85, 0x38, 0xf9, 0xf9,
+- 0xd8, 0x38, 0xf3, 0xeb, 0x94, 0xa1, 0x1d, 0xb1, 0xd7, 0xcc, 0x3d, 0xd4,
+- 0x85, 0x87, 0xf1, 0x22, 0xa0, 0x4d, 0x2a, 0xc5, 0xf3, 0x79, 0x82, 0x0d,
+- 0x31, 0x47, 0x44, 0xf0, 0x2d, 0x6e, 0x3d, 0xd1, 0x4c, 0xd5, 0x19, 0x6e,
+- 0x7f, 0x2c, 0xe3, 0xe1, 0xa1, 0xf1, 0xf0, 0xfa, 0x37, 0x65, 0x7c, 0xfe,
+- 0x8d, 0x19, 0xf8, 0xd7, 0x67, 0x8a, 0x76, 0x59, 0xf4, 0x6d, 0xc1, 0x36,
+- 0xcb, 0x92, 0x7b, 0xc9, 0x8f, 0x67, 0xa5, 0xad, 0x7c, 0x1c, 0x2b, 0xa1,
+- 0xec, 0x4f, 0xd2, 0xd6, 0x5d, 0x8c, 0x55, 0xbb, 0x8c, 0x38, 0xa1, 0xd2,
+- 0xb2, 0x0c, 0xf2, 0x99, 0x12, 0xc5, 0x8f, 0x9d, 0x4d, 0xbf, 0xe5, 0x7c,
+- 0x02, 0x9b, 0x32, 0x01, 0x77, 0x7e, 0x3e, 0xc4, 0xcf, 0x04, 0x03, 0xfc,
+- 0x8c, 0xbf, 0x3e, 0x7f, 0x0f, 0xfb, 0xd9, 0x9e, 0x99, 0xee, 0x03, 0x0a,
+- 0x56, 0xb3, 0xad, 0x96, 0x10, 0x9c, 0x2b, 0x9a, 0xfe, 0xcd, 0xca, 0x79,
+- 0xa7, 0xdf, 0x37, 0x75, 0x33, 0xe6, 0xc2, 0xb9, 0xbe, 0x49, 0xce, 0x15,
+- 0xb4, 0x84, 0xe5, 0x5c, 0xc1, 0x7a, 0x43, 0xce, 0x89, 0xd9, 0x59, 0x39,
+- 0xb7, 0xac, 0xcb, 0xe7, 0xef, 0xc7, 0x22, 0x13, 0x77, 0xa5, 0x64, 0xed,
+- 0x4d, 0xb0, 0xc8, 0xed, 0xff, 0x4e, 0xa6, 0x09, 0x5b, 0x52, 0x72, 0x7f,
+- 0x8c, 0xb9, 0x86, 0xe1, 0xf1, 0x3f, 0x93, 0xb9, 0x16, 0x77, 0xee, 0x0f,
+- 0xa3, 0x73, 0x3f, 0x9a, 0xca, 0x38, 0x86, 0xd2, 0x50, 0xc0, 0x7f, 0x14,
+- 0x9a, 0xff, 0x0c, 0x75, 0x72, 0x8a, 0x72, 0x9e, 0x7e, 0x8f, 0x9c, 0xa2,
+- 0x43, 0xf8, 0xef, 0x4e, 0xb8, 0x91, 0x09, 0xbd, 0x63, 0xc5, 0xed, 0x5c,
+- 0xc8, 0xeb, 0xbf, 0x27, 0xe1, 0x47, 0xce, 0xce, 0xc9, 0xde, 0x28, 0x15,
+- 0xec, 0xee, 0x4b, 0xc5, 0xa3, 0x2a, 0x8a, 0xf3, 0xab, 0x87, 0x65, 0x6e,
+- 0x5f, 0x4d, 0xc8, 0x7f, 0xd1, 0x2f, 0xa9, 0x8c, 0x4b, 0x2a, 0x73, 0xf9,
+- 0x41, 0x59, 0xdf, 0x57, 0x4b, 0x45, 0x3f, 0x72, 0x8f, 0x22, 0x2e, 0x39,
+- 0x63, 0x13, 0xaf, 0x6b, 0x8b, 0x10, 0xab, 0xa1, 0x9e, 0xca, 0x0d, 0xaf,
+- 0xbf, 0x71, 0xc2, 0xe7, 0x37, 0x27, 0xe0, 0xbf, 0x72, 0x62, 0xba, 0x08,
+- 0xe4, 0x0a, 0xea, 0x07, 0x61, 0x81, 0xd7, 0xbf, 0x39, 0x31, 0x8f, 0x3c,
+- 0x33, 0x6e, 0x2d, 0x6f, 0x3e, 0x6f, 0xcd, 0x8b, 0x18, 0xb9, 0xd3, 0x94,
+- 0xe1, 0x9d, 0x6b, 0xf4, 0xf8, 0x1c, 0xc7, 0xa9, 0xfb, 0xb5, 0x69, 0x7d,
+- 0x5c, 0x08, 0xfd, 0xff, 0xed, 0xa3, 0x18, 0xe7, 0x68, 0x0f, 0xcd, 0x32,
+- 0x06, 0x89, 0x77, 0xcc, 0x85, 0x6a, 0x65, 0x2c, 0x81, 0x02, 0x6f, 0x2b,
+- 0x8e, 0x4b, 0xe1, 0x5c, 0xbb, 0xa9, 0x8b, 0x62, 0x0c, 0xb3, 0xac, 0x5e,
+- 0xc3, 0x57, 0x58, 0x03, 0xe7, 0x9c, 0x65, 0x4f, 0x7d, 0xd8, 0xc9, 0x9c,
+- 0xfd, 0x9c, 0xd9, 0xf2, 0x57, 0x4e, 0x44, 0x7d, 0xa5, 0x8c, 0xad, 0xb2,
+- 0xf6, 0x74, 0xa6, 0x69, 0xca, 0x9a, 0x64, 0x1e, 0xd4, 0x92, 0x95, 0xfb,
+- 0x4b, 0x0e, 0xda, 0xb7, 0x85, 0x87, 0x4d, 0xf9, 0x5f, 0x70, 0x26, 0x1e,
+- 0x73, 0xd0, 0x56, 0xdc, 0x86, 0xde, 0xf1, 0x65, 0xa5, 0x8a, 0xae, 0xec,
+- 0x0c, 0x4e, 0x42, 0x0f, 0x6f, 0x51, 0xe8, 0x87, 0x35, 0x0b, 0x4c, 0x99,
+- 0x82, 0x37, 0x12, 0x01, 0x33, 0x50, 0x88, 0x4b, 0xe7, 0x38, 0x77, 0x6f,
+- 0x25, 0x8c, 0xce, 0x27, 0x0b, 0xe7, 0x3f, 0xcb, 0x4c, 0x5f, 0x1f, 0x17,
+- 0x7b, 0x74, 0xbb, 0xb7, 0x27, 0x70, 0xc1, 0xd1, 0x8c, 0x0b, 0x87, 0xcc,
+- 0x12, 0x2c, 0x6f, 0x17, 0x3b, 0x75, 0xbb, 0x77, 0x26, 0x30, 0xe5, 0xe4,
+- 0xb5, 0x73, 0xe6, 0x5c, 0x62, 0x9a, 0xbd, 0x7e, 0x29, 0x31, 0x22, 0xa6,
+- 0x31, 0xbe, 0x96, 0x47, 0xbc, 0xee, 0xf2, 0x09, 0x68, 0x65, 0xe4, 0x40,
+- 0xee, 0x08, 0x5a, 0x1d, 0x49, 0xdd, 0xdf, 0xe6, 0x68, 0xc2, 0xaa, 0xac,
+- 0x9f, 0x3c, 0xfa, 0x05, 0xf2, 0x4e, 0xfb, 0x3e, 0x1f, 0x6d, 0xd2, 0xc9,
+- 0x0a, 0x43, 0xb3, 0xd4, 0x88, 0xe4, 0x76, 0x55, 0xb8, 0x4b, 0xdb, 0xfa,
+- 0x11, 0x35, 0x32, 0x88, 0x9b, 0x9a, 0xdd, 0xad, 0xd5, 0x13, 0x45, 0x9d,
+- 0x20, 0xe6, 0x89, 0x40, 0xab, 0x32, 0xa0, 0x56, 0x46, 0x44, 0x37, 0xfe,
+- 0xd6, 0xe4, 0xb8, 0xc8, 0xaa, 0xb9, 0x07, 0xc6, 0x7f, 0xe3, 0x46, 0x79,
+- 0x94, 0x58, 0xf5, 0x43, 0xdf, 0x7f, 0xae, 0xde, 0x33, 0x6e, 0xc1, 0x7b,
+- 0x97, 0x21, 0xdf, 0xb6, 0x6d, 0x31, 0x1f, 0x19, 0xfb, 0x8c, 0x3b, 0x60,
+- 0x59, 0x8c, 0x93, 0x3e, 0x28, 0x73, 0x39, 0x1e, 0xfa, 0x1a, 0xe3, 0xd2,
+- 0xc6, 0xcc, 0x1f, 0xac, 0x8f, 0x3a, 0x6d, 0x0e, 0x40, 0xde, 0xe4, 0xbf,
+- 0xed, 0x75, 0xe3, 0xf7, 0x96, 0xf0, 0x11, 0x27, 0x7d, 0xba, 0x84, 0x78,
+- 0xbe, 0xdb, 0x74, 0xb6, 0xad, 0x50, 0x14, 0xf4, 0x19, 0x0b, 0xb4, 0x32,
+- 0xc6, 0xa9, 0x5e, 0xfa, 0x75, 0xcc, 0x6b, 0x04, 0x0f, 0x81, 0xe5, 0x32,
+- 0x9b, 0x37, 0xbb, 0x22, 0xf7, 0x7c, 0x76, 0xac, 0x59, 0xb0, 0x60, 0xea,
+- 0xb6, 0x27, 0x8d, 0x0e, 0xf2, 0xaf, 0xaf, 0x90, 0xa7, 0xe5, 0xfb, 0xc9,
+- 0x61, 0xde, 0x07, 0xf4, 0xb3, 0x79, 0x73, 0x69, 0x44, 0x78, 0x58, 0xfa,
+- 0xb6, 0xc3, 0x46, 0x1b, 0x73, 0xb0, 0x7b, 0x3e, 0x7b, 0xae, 0xf9, 0x00,
+- 0xbf, 0xf3, 0x75, 0xd2, 0xa8, 0xfe, 0xc0, 0x3a, 0x15, 0x11, 0xe9, 0xc3,
+- 0xcf, 0x3e, 0xee, 0xf9, 0x6c, 0xe7, 0x92, 0x31, 0x6c, 0xcf, 0x6e, 0xfb,
+- 0x93, 0xfd, 0x54, 0x46, 0x64, 0x3d, 0x34, 0x76, 0xfb, 0xea, 0xc0, 0x3d,
+- 0x9f, 0xcd, 0x2c, 0x19, 0x64, 0x1f, 0x9f, 0x66, 0x7c, 0xc9, 0xd7, 0x89,
+- 0x2a, 0x8e, 0x0f, 0xd4, 0x41, 0x59, 0x64, 0xdb, 0xed, 0x0b, 0x03, 0xbf,
+- 0xb7, 0x16, 0x0c, 0x94, 0xd8, 0x3a, 0x70, 0x51, 0x07, 0x0f, 0x9a, 0xce,
+- 0x5c, 0xc0, 0x61, 0xeb, 0xa0, 0xcb, 0x47, 0x1d, 0x24, 0xa9, 0x83, 0xdc,
+- 0x4c, 0x23, 0xfc, 0x36, 0x75, 0xb0, 0x60, 0x7c, 0xf3, 0xe6, 0xb2, 0x08,
+- 0x9c, 0x0e, 0xe3, 0x47, 0x0e, 0xe6, 0x45, 0xaa, 0xcb, 0xd8, 0x4c, 0xbd,
+- 0xdd, 0xf3, 0xd9, 0xf9, 0x4b, 0x6c, 0x9d, 0xdf, 0xea, 0x0e, 0xdc, 0x47,
+- 0xbb, 0x69, 0xa5, 0xad, 0x6f, 0xe5, 0xd1, 0xce, 0xa3, 0x8f, 0x47, 0x02,
+- 0xbb, 0xb3, 0x1b, 0xa9, 0xab, 0x35, 0x1c, 0xc7, 0x3a, 0xca, 0xd5, 0xc5,
+- 0xdf, 0x31, 0xfe, 0x8e, 0xf3, 0xb7, 0xcc, 0x8f, 0x7a, 0x49, 0xb6, 0xd8,
+- 0x25, 0xd9, 0x1c, 0x94, 0xc7, 0x63, 0xaf, 0x55, 0x96, 0x47, 0x8e, 0xdf,
+- 0xba, 0x3a, 0xd0, 0xc9, 0x36, 0xfe, 0xbf, 0x32, 0xd9, 0x57, 0xe0, 0x32,
+- 0xe2, 0x3e, 0x27, 0x44, 0x3e, 0xbd, 0xa3, 0x13, 0x39, 0x62, 0xef, 0xef,
+- 0xf2, 0xd8, 0x4b, 0xd9, 0xaa, 0x38, 0x3f, 0xcf, 0x2d, 0x49, 0xcf, 0xf6,
+- 0x18, 0xf0, 0xb9, 0x8d, 0x7e, 0x0c, 0x64, 0x47, 0xa8, 0x03, 0xb1, 0x93,
+- 0x2f, 0x52, 0x7f, 0xdd, 0xac, 0x73, 0x8a, 0xb1, 0x4c, 0x8f, 0xd2, 0x67,
+- 0x69, 0xb3, 0x7a, 0x98, 0x07, 0xed, 0xe5, 0x51, 0xb6, 0x9b, 0xa6, 0x4c,
+- 0x25, 0xb4, 0x5f, 0x05, 0x72, 0x0f, 0xf7, 0x0c, 0xdb, 0x3f, 0x6c, 0xfc,
+- 0xba, 0xe2, 0x14, 0xc7, 0x1e, 0xf5, 0x6e, 0xc6, 0x68, 0x93, 0xe8, 0x2a,
+- 0x46, 0x5d, 0xe9, 0x3e, 0xff, 0x34, 0x5d, 0x5e, 0x96, 0xf7, 0x0a, 0xf2,
+- 0x09, 0xcb, 0xfa, 0x89, 0xd1, 0xb2, 0x90, 0x49, 0x21, 0xd2, 0x76, 0xae,
+- 0x64, 0x59, 0x25, 0xf6, 0xfe, 0xb3, 0xd8, 0xed, 0x1b, 0x0c, 0x91, 0xb7,
+- 0xb1, 0x7d, 0x3b, 0x8d, 0x73, 0x73, 0x86, 0xfe, 0x1c, 0xf8, 0x9d, 0x15,
+- 0x9d, 0x29, 0xf5, 0xe6, 0xe1, 0x15, 0xc6, 0xde, 0xa8, 0x16, 0xef, 0x74,
+- 0x0b, 0xbf, 0x37, 0x9c, 0xe1, 0x35, 0x88, 0x33, 0xa1, 0xd4, 0x83, 0x77,
+- 0x92, 0x7b, 0x9e, 0x33, 0xf2, 0x7e, 0x7c, 0x24, 0xa3, 0x47, 0x1f, 0xe6,
+- 0x39, 0x39, 0x30, 0xb9, 0x54, 0x31, 0x4e, 0x05, 0xc9, 0x7b, 0x3d, 0x70,
+- 0x32, 0x87, 0x6a, 0x75, 0xf4, 0x04, 0x5d, 0xa0, 0x2f, 0x96, 0xcb, 0xb8,
+- 0xe2, 0x1c, 0xa3, 0xe0, 0xb6, 0x5b, 0xdb, 0x68, 0x63, 0x79, 0x7c, 0xa1,
+- 0x0b, 0x1e, 0x6d, 0x53, 0xa6, 0x18, 0xe3, 0x3c, 0xda, 0xfa, 0x84, 0xe0,
+- 0x82, 0xdc, 0x77, 0x0d, 0x53, 0xcf, 0x82, 0x0f, 0xaf, 0xda, 0x7b, 0xd5,
+- 0x88, 0x11, 0x55, 0x4e, 0x23, 0xdf, 0xae, 0xc6, 0x76, 0xdb, 0x1d, 0x1a,
+- 0x2e, 0xfb, 0xb8, 0xae, 0xb5, 0x3b, 0x64, 0x1f, 0x1d, 0xd1, 0x2b, 0x53,
+- 0xa8, 0x97, 0xc7, 0xb9, 0x65, 0x2e, 0x1b, 0xe7, 0xd8, 0x06, 0xf3, 0x8e,
+- 0xe5, 0x89, 0xf7, 0xf7, 0x2f, 0xfd, 0x49, 0xbf, 0x3d, 0x35, 0x2a, 0x64,
+- 0x9f, 0x8f, 0xdc, 0x13, 0xeb, 0x64, 0xbe, 0x36, 0x7d, 0xaf, 0x8f, 0x7e,
+- 0x82, 0xed, 0x1f, 0x8f, 0x73, 0x3e, 0xe7, 0x1a, 0xb2, 0x0f, 0x48, 0xee,
+- 0xa1, 0x4d, 0xdf, 0xf7, 0x63, 0xdf, 0x9f, 0x2c, 0x17, 0x2e, 0x73, 0x98,
+- 0x38, 0x19, 0x6d, 0x97, 0xfa, 0x96, 0xf5, 0xe3, 0x05, 0x41, 0xe4, 0x66,
+- 0x38, 0x31, 0xd2, 0x00, 0x0c, 0x27, 0x45, 0xd7, 0xe9, 0xcf, 0x6c, 0x30,
+- 0xfe, 0xcd, 0x8a, 0xd6, 0x36, 0x6a, 0xbd, 0xaa, 0xac, 0x67, 0x8c, 0xdd,
+- 0xda, 0x67, 0xd4, 0x6b, 0x7d, 0x6a, 0xee, 0x18, 0xe3, 0xd0, 0x01, 0xe6,
+- 0xe8, 0xe5, 0x82, 0x15, 0x35, 0x46, 0xb4, 0xbf, 0x06, 0x0d, 0xf0, 0xdb,
+- 0xf7, 0x24, 0xf4, 0xf8, 0x37, 0x54, 0x23, 0xb8, 0x56, 0xf8, 0xa7, 0xfa,
+- 0x8e, 0x95, 0xa6, 0x0d, 0x7c, 0xa1, 0xe1, 0x67, 0x65, 0x79, 0x6c, 0x8f,
+- 0x76, 0xce, 0xe2, 0xbc, 0xbc, 0xb9, 0x48, 0xf7, 0x67, 0x14, 0xd1, 0x91,
+- 0x70, 0xae, 0x11, 0xec, 0x62, 0x3c, 0xfe, 0xb7, 0x86, 0x08, 0x8e, 0xf0,
+- 0xfb, 0xa7, 0xd7, 0xca, 0x1e, 0x37, 0xcb, 0x0a, 0x06, 0x16, 0x84, 0x6b,
+- 0x38, 0x86, 0x67, 0xf8, 0x7f, 0x7f, 0xf6, 0x75, 0xeb, 0xdc, 0x2c, 0x63,
+- 0x70, 0x25, 0x83, 0xe2, 0xf0, 0x84, 0xae, 0x4d, 0xa9, 0xff, 0xd9, 0x3d,
+- 0x37, 0xf6, 0x3a, 0xe3, 0x67, 0x9e, 0x0f, 0x34, 0x6a, 0x49, 0xb5, 0xae,
+- 0x5c, 0xf4, 0x3a, 0x3c, 0xf1, 0x52, 0x21, 0xce, 0xe7, 0xef, 0x75, 0x3e,
+- 0x7e, 0x49, 0x3f, 0x72, 0xdf, 0x76, 0x1e, 0x6d, 0x2e, 0x1a, 0xa7, 0xde,
+- 0xdd, 0x33, 0x38, 0xe6, 0x2f, 0x34, 0xdc, 0x69, 0x8f, 0xb3, 0xd6, 0x98,
+- 0xc3, 0x31, 0x2a, 0xd0, 0x1a, 0x9c, 0xe5, 0x79, 0xfe, 0xd8, 0x42, 0x96,
+- 0x96, 0xb6, 0x5a, 0xe9, 0x43, 0x25, 0xac, 0x73, 0xbd, 0x79, 0x70, 0x76,
+- 0x4f, 0x93, 0xee, 0xfb, 0x02, 0x6d, 0x35, 0xd4, 0xf0, 0x2b, 0x2b, 0xaa,
+- 0x39, 0xcd, 0xaf, 0x73, 0xd4, 0x77, 0x26, 0xa4, 0xac, 0xcc, 0xab, 0x11,
+- 0x6d, 0x50, 0xde, 0xb2, 0x30, 0x33, 0x10, 0x6e, 0xb0, 0xc7, 0x0f, 0xdc,
+- 0x91, 0x19, 0x61, 0xae, 0x2c, 0x6d, 0x2a, 0x58, 0x19, 0x78, 0xc3, 0xf2,
+- 0xcf, 0x1a, 0xc1, 0xce, 0xec, 0x1f, 0xe3, 0xb0, 0x5f, 0x21, 0x87, 0xd6,
+- 0x3b, 0xe2, 0x79, 0xbf, 0x6b, 0x03, 0xfb, 0x2d, 0x37, 0xec, 0x3c, 0xfc,
+- 0xb6, 0x44, 0x40, 0xd6, 0x8c, 0xc6, 0x3e, 0x33, 0x1e, 0x90, 0xbd, 0x19,
+- 0x5e, 0xe4, 0xda, 0xa5, 0x4c, 0xbd, 0x36, 0x8e, 0x1c, 0x19, 0xa6, 0xec,
+- 0x23, 0x39, 0x54, 0x9e, 0x5f, 0x47, 0x70, 0xc8, 0x3a, 0xb8, 0xf6, 0x2a,
+- 0x39, 0x61, 0x9b, 0x21, 0x6d, 0x28, 0x58, 0x18, 0x98, 0x81, 0xc6, 0xb5,
+- 0x3f, 0x7a, 0xb9, 0x24, 0x90, 0xf7, 0xdb, 0x3e, 0xc3, 0xd8, 0x76, 0x1a,
+- 0xbf, 0x26, 0x56, 0xc9, 0x3e, 0x93, 0xb4, 0xd4, 0x63, 0x5b, 0x0d, 0xc8,
+- 0x68, 0x4e, 0x8c, 0x1a, 0xb2, 0x0f, 0xd2, 0xb2, 0x56, 0x07, 0x5e, 0xa3,
+- 0xdf, 0x51, 0x9e, 0xac, 0xb3, 0x50, 0x57, 0xca, 0x14, 0xf6, 0x70, 0x28,
+- 0x2d, 0x9f, 0x15, 0x9d, 0x3c, 0x61, 0xc6, 0x99, 0x35, 0x48, 0x7c, 0x18,
+- 0xfb, 0xcc, 0xeb, 0x86, 0x70, 0x78, 0xdd, 0x5c, 0xa9, 0x54, 0x33, 0xde,
+- 0x3a, 0xfd, 0x63, 0xf6, 0x7a, 0x86, 0x9f, 0x58, 0x2e, 0x3c, 0x54, 0x72,
+- 0x43, 0x27, 0x9e, 0x34, 0x6a, 0xf0, 0x84, 0x96, 0xe7, 0x74, 0xc4, 0x44,
+- 0xbc, 0x90, 0x58, 0x90, 0xa3, 0x87, 0x90, 0x1b, 0x1b, 0x9d, 0x17, 0x95,
+- 0x5f, 0x33, 0x6f, 0x04, 0x9e, 0xcb, 0x74, 0xe1, 0x41, 0xb9, 0x8f, 0xa5,
+- 0xd4, 0xb7, 0x35, 0x3a, 0xa4, 0xbf, 0x2e, 0xec, 0xb2, 0xd7, 0x65, 0xc7,
+- 0x3e, 0x73, 0xd8, 0x78, 0xa4, 0x20, 0xab, 0x60, 0xfe, 0xd8, 0x67, 0x9e,
+- 0x34, 0x4e, 0xdb, 0x73, 0x27, 0x7b, 0x16, 0xfa, 0x4d, 0xc1, 0xc6, 0x72,
+- 0xa8, 0xcc, 0x2f, 0x1c, 0xc6, 0xa7, 0xe1, 0xa8, 0x19, 0xa3, 0xed, 0xc9,
+- 0x7a, 0xcf, 0xed, 0x70, 0xd6, 0xb8, 0xe8, 0x9b, 0x77, 0xc0, 0x55, 0x23,
+- 0x9c, 0xbe, 0xc8, 0xb7, 0xdb, 0xf8, 0xbf, 0xe8, 0x76, 0xca, 0xd6, 0xad,
+- 0x93, 0xd8, 0xd3, 0x27, 0xf9, 0x9f, 0x51, 0x4d, 0x1d, 0xe9, 0x1d, 0xb2,
+- 0xae, 0x5d, 0x49, 0x6c, 0x65, 0x1c, 0x75, 0x57, 0xb3, 0xcc, 0xdb, 0xd4,
+- 0xfb, 0x82, 0x81, 0x0a, 0x72, 0x7d, 0xcb, 0x7a, 0x87, 0x5c, 0x7f, 0x61,
+- 0xa0, 0x31, 0x67, 0x30, 0xfe, 0xe1, 0x66, 0xbd, 0x4d, 0xee, 0x11, 0x6f,
+- 0x30, 0x2e, 0x5a, 0xb1, 0x75, 0x52, 0x46, 0xf7, 0xc5, 0x94, 0x62, 0x1f,
+- 0x8b, 0xe0, 0x9f, 0x61, 0xc1, 0x15, 0xb1, 0x88, 0x5d, 0xba, 0x19, 0x45,
+- 0x8b, 0xec, 0xf5, 0x69, 0x97, 0xf1, 0xbb, 0xe4, 0x7e, 0x03, 0xa2, 0x93,
+- 0x2e, 0x18, 0xb9, 0x23, 0x32, 0x67, 0xb3, 0x2d, 0x04, 0x16, 0xff, 0x8e,
+- 0x39, 0x93, 0xcc, 0x4f, 0x7d, 0xae, 0x49, 0xc9, 0x05, 0x7d, 0xe4, 0xfe,
+- 0x8f, 0x40, 0x6f, 0x4f, 0x50, 0xd7, 0xad, 0x21, 0x1b, 0xf3, 0x7c, 0x09,
+- 0xd8, 0x7c, 0xdf, 0x7c, 0x05, 0x1f, 0x45, 0x25, 0x73, 0xdc, 0x86, 0xf1,
+- 0x35, 0xa8, 0xaa, 0x89, 0xfa, 0xca, 0xb1, 0x94, 0xe7, 0x5b, 0x99, 0xc7,
+- 0x7c, 0x12, 0x55, 0x6b, 0x63, 0x48, 0x70, 0xec, 0x95, 0xc6, 0xad, 0xbc,
+- 0xd6, 0x87, 0x64, 0xca, 0xc5, 0x71, 0xfc, 0xd0, 0xaa, 0x9a, 0x29, 0xb2,
+- 0x99, 0xde, 0x0a, 0x83, 0x79, 0xb7, 0xad, 0x0b, 0x62, 0x79, 0x4a, 0xb8,
+- 0x54, 0x63, 0x74, 0x0b, 0xfe, 0x40, 0xdb, 0xd5, 0x3b, 0x36, 0x2a, 0x71,
+- 0xda, 0x6c, 0x82, 0x3a, 0x97, 0xb2, 0x96, 0xb5, 0x2a, 0xf0, 0x5b, 0xea,
+- 0x38, 0xce, 0x73, 0xc3, 0xff, 0x1a, 0xd4, 0xa5, 0xa5, 0x38, 0x6b, 0xc5,
+- 0x35, 0x1f, 0xed, 0x52, 0x5d, 0x27, 0xbc, 0x6b, 0x45, 0x48, 0xad, 0x40,
+- 0xb9, 0x56, 0xb0, 0xd3, 0x74, 0x41, 0x97, 0x53, 0xb7, 0xf5, 0x19, 0x6f,
+- 0x94, 0xcb, 0x75, 0x87, 0x7d, 0xdd, 0x5f, 0xb8, 0x9e, 0xe6, 0xf5, 0xf3,
+- 0xbc, 0x3e, 0x48, 0xdd, 0xab, 0x57, 0x48, 0xfd, 0xcd, 0xa6, 0xd4, 0x27,
+- 0x1d, 0x31, 0x12, 0x85, 0xf9, 0x88, 0xdd, 0x9e, 0x2f, 0xbb, 0xed, 0xf6,
+- 0x7c, 0x1b, 0x4e, 0xb6, 0x11, 0x8f, 0x96, 0xc3, 0x44, 0x45, 0x40, 0x70,
+- 0x5e, 0xe4, 0xe2, 0xdc, 0x65, 0x45, 0xae, 0xad, 0x8c, 0x8b, 0x3d, 0x4f,
+- 0x97, 0x23, 0xde, 0x35, 0xc7, 0xb6, 0xc3, 0x34, 0x79, 0x8a, 0xee, 0x7f,
+- 0x5d, 0x69, 0xf1, 0xc9, 0xb2, 0x4e, 0x8a, 0x9c, 0xf7, 0x7e, 0xd3, 0x19,
+- 0x6e, 0x72, 0x2c, 0xc8, 0x95, 0xc2, 0x88, 0x5d, 0x54, 0x66, 0x57, 0x08,
+- 0x3e, 0x24, 0x32, 0x2d, 0xcc, 0xd0, 0xe2, 0x41, 0xe6, 0x56, 0xc1, 0x2c,
+- 0x75, 0xbb, 0x9e, 0x88, 0x7d, 0xc2, 0xde, 0xb3, 0xe4, 0x9c, 0x5c, 0x83,
+- 0x16, 0xdd, 0x81, 0x05, 0xe1, 0x39, 0xcc, 0xd0, 0x68, 0x97, 0x66, 0xa9,
+- 0x43, 0xf7, 0xdf, 0x84, 0xff, 0x62, 0xd7, 0x3b, 0x92, 0xc9, 0x75, 0x96,
+- 0x73, 0x4e, 0xbf, 0x4a, 0x39, 0x76, 0x07, 0x44, 0x8e, 0xb1, 0x82, 0x1c,
+- 0x31, 0xc6, 0x5c, 0x53, 0xbb, 0x21, 0x30, 0x78, 0x49, 0x6f, 0x4f, 0xdb,
+- 0x7a, 0xeb, 0xe3, 0x79, 0x29, 0x76, 0x90, 0x3f, 0x9e, 0x6a, 0xf2, 0x16,
+- 0xd6, 0xf6, 0x25, 0xa7, 0x13, 0xfc, 0x3d, 0xfb, 0xa9, 0x0d, 0x86, 0x1e,
+- 0x76, 0xd8, 0xfc, 0xdf, 0x8d, 0xb8, 0xcd, 0xad, 0x1d, 0x10, 0xee, 0xf8,
+- 0xb0, 0x5d, 0xce, 0x45, 0x9d, 0x54, 0xe0, 0x91, 0x82, 0xbf, 0x54, 0x30,
+- 0xbe, 0x7d, 0xd5, 0xfe, 0x9d, 0xe6, 0xdc, 0xba, 0xe8, 0xab, 0xc5, 0x18,
+- 0x25, 0xeb, 0x83, 0xfd, 0xb6, 0xef, 0xa7, 0xf1, 0x7d, 0xfb, 0x3b, 0x97,
+- 0xcf, 0xcb, 0xd0, 0x47, 0x9f, 0x70, 0xb0, 0x8d, 0x5e, 0x7b, 0x2f, 0xaa,
+- 0xac, 0x15, 0x5c, 0x8b, 0x1d, 0x1c, 0x95, 0xdb, 0xe8, 0x44, 0xbf, 0x26,
+- 0x36, 0xd1, 0x8d, 0xa4, 0x66, 0x7a, 0xb3, 0x4d, 0xd3, 0x73, 0x2a, 0x13,
+- 0x87, 0x9a, 0x7e, 0xcf, 0x58, 0x2e, 0xd7, 0xce, 0x5a, 0x87, 0x8d, 0x53,
+- 0x21, 0x7a, 0x70, 0x67, 0x89, 0xad, 0xdf, 0xa9, 0xdb, 0xec, 0x7d, 0x5b,
+- 0x94, 0xf9, 0xe9, 0x84, 0xc4, 0xd1, 0x79, 0xc8, 0x98, 0x22, 0x9b, 0xb3,
+- 0x7d, 0x0f, 0xe7, 0xa4, 0x2f, 0x15, 0x88, 0x5e, 0xc9, 0xff, 0x26, 0x19,
+- 0xcb, 0x7a, 0xa9, 0xcf, 0x58, 0xbb, 0xf0, 0xb8, 0xad, 0x38, 0x40, 0x1b,
+- 0x9b, 0x30, 0x2d, 0xeb, 0x08, 0x31, 0xa2, 0x7a, 0x81, 0x8a, 0xdc, 0xcc,
+- 0xad, 0x48, 0x31, 0x36, 0x1d, 0x31, 0x5a, 0x3e, 0x5a, 0x82, 0xb8, 0x9f,
+- 0x31, 0xdc, 0xb7, 0x93, 0xa3, 0xb9, 0x9f, 0xf3, 0x75, 0xca, 0x14, 0x7e,
+- 0xe9, 0xbc, 0xb8, 0x02, 0x46, 0x78, 0x99, 0xe3, 0x87, 0xd6, 0x94, 0xc8,
+- 0x9e, 0xea, 0xf9, 0x5f, 0x94, 0x61, 0x9b, 0x38, 0x6f, 0x35, 0xe7, 0xf8,
+- 0xed, 0x80, 0xde, 0xf6, 0x02, 0xfb, 0x69, 0x1c, 0x68, 0xe9, 0x14, 0x19,
+- 0x0e, 0x87, 0x9c, 0xb1, 0x23, 0x08, 0xb4, 0x6f, 0x55, 0x8a, 0x39, 0x04,
+- 0x70, 0xe5, 0xb8, 0x89, 0xa3, 0x4d, 0xcf, 0x90, 0xef, 0x48, 0xfd, 0x52,
+- 0x3c, 0x66, 0x3e, 0x65, 0xd5, 0xcf, 0x7e, 0xde, 0x3a, 0x66, 0xa8, 0x5b,
+- 0xa8, 0xed, 0x58, 0x25, 0x64, 0x4d, 0x33, 0x7d, 0xdb, 0x5d, 0x01, 0xdd,
+- 0xdc, 0xc3, 0xb6, 0xce, 0x24, 0x4e, 0x05, 0xdd, 0x6c, 0xeb, 0x11, 0x53,
+- 0x72, 0x08, 0x67, 0x5b, 0x1b, 0xe7, 0xb6, 0x27, 0x15, 0xf0, 0xc9, 0xba,
+- 0xad, 0xe4, 0x79, 0xb7, 0x27, 0x64, 0xcf, 0xf8, 0x18, 0xc7, 0x13, 0xdd,
+- 0xe6, 0x42, 0xcb, 0xfd, 0x55, 0xb4, 0x9f, 0x6a, 0x14, 0x6d, 0x5d, 0xf7,
+- 0x11, 0xef, 0x70, 0x17, 0xcb, 0xbc, 0x1c, 0x98, 0x87, 0xe7, 0x42, 0x2d,
+- 0x6b, 0xe7, 0xc1, 0x19, 0x3b, 0xa6, 0x04, 0xda, 0xb6, 0x2a, 0x71, 0x4d,
+- 0x6c, 0xf1, 0xce, 0x8c, 0x1e, 0x6c, 0x85, 0x60, 0x77, 0x8c, 0xfa, 0x98,
+- 0x87, 0x77, 0x16, 0x8b, 0x5c, 0xce, 0x70, 0xd0, 0x11, 0xe8, 0x7a, 0x8a,
+- 0xf3, 0x5b, 0xb5, 0x40, 0x64, 0x07, 0xb2, 0x19, 0x91, 0x3f, 0x86, 0x64,
+- 0xf6, 0xec, 0xdb, 0x87, 0x0d, 0x38, 0x4f, 0x34, 0x3d, 0x68, 0xc1, 0xde,
+- 0x63, 0xde, 0x22, 0xf3, 0xd0, 0x21, 0xf3, 0x50, 0x4e, 0x7f, 0x5a, 0x4d,
+- 0xb9, 0xb7, 0xd8, 0x72, 0xcf, 0xc3, 0xa8, 0x29, 0xeb, 0x64, 0x4e, 0xed,
+- 0x4e, 0x0c, 0x12, 0x3b, 0x03, 0x17, 0x7b, 0xd8, 0xcf, 0xcb, 0x94, 0x79,
+- 0x01, 0xf5, 0x3e, 0xd5, 0x2e, 0xfc, 0xb6, 0x0f, 0x03, 0xa9, 0xe2, 0x1e,
+- 0x74, 0x05, 0x92, 0x7a, 0x4f, 0x39, 0xfa, 0xc8, 0xf7, 0x7a, 0xac, 0xa9,
+- 0x99, 0x72, 0x3d, 0x8d, 0x1d, 0xa9, 0xa8, 0x46, 0x7f, 0xa0, 0xde, 0xa1,
+- 0xcf, 0x83, 0x3e, 0xf9, 0xaa, 0x23, 0x4a, 0x1f, 0x30, 0xbd, 0x17, 0x89,
+- 0x0d, 0x27, 0xd0, 0x65, 0xa1, 0xc6, 0xb6, 0x87, 0x9f, 0x8e, 0x19, 0x0e,
+- 0x59, 0x6b, 0x0f, 0xe6, 0xa8, 0x03, 0x95, 0x73, 0x22, 0x3a, 0xa8, 0xa4,
+- 0xcf, 0x8e, 0x07, 0x74, 0xff, 0x73, 0x94, 0x67, 0x0f, 0xe5, 0x59, 0x93,
+- 0x9f, 0x43, 0xdf, 0x0e, 0x45, 0x7c, 0x3a, 0xd0, 0xbe, 0x81, 0xd7, 0x77,
+- 0x53, 0x9e, 0xc0, 0x80, 0x82, 0x34, 0xd1, 0xac, 0x8f, 0x7c, 0xf6, 0xc0,
+- 0x34, 0x79, 0xdc, 0xf6, 0x9c, 0xc5, 0xc9, 0x05, 0x4a, 0x71, 0xd8, 0x14,
+- 0xfc, 0xd6, 0x30, 0x4a, 0x3b, 0x3d, 0xc4, 0x19, 0x89, 0x7a, 0x55, 0x94,
+- 0x1a, 0x82, 0x01, 0x33, 0x79, 0xcd, 0xc5, 0xb9, 0xa9, 0xc6, 0x31, 0x2d,
+- 0xcd, 0x38, 0x59, 0xe4, 0x76, 0x7f, 0xb0, 0x8e, 0x7a, 0x85, 0x9f, 0xc9,
+- 0x3a, 0x9a, 0xac, 0x35, 0x7d, 0xb9, 0x22, 0xbf, 0xbf, 0x52, 0xf6, 0x3f,
+- 0xe4, 0xaf, 0x3f, 0xad, 0x09, 0x47, 0x2e, 0x96, 0xff, 0xb9, 0xf5, 0x84,
+- 0x5d, 0x5e, 0xca, 0xb9, 0x6c, 0x2e, 0x5f, 0x6e, 0x97, 0xfb, 0xb9, 0xf5,
+- 0x8c, 0xe6, 0x9c, 0x56, 0xae, 0xb8, 0x07, 0xef, 0xd4, 0x97, 0x5c, 0xc4,
+- 0x3c, 0x47, 0xc3, 0x32, 0x3c, 0x61, 0x9c, 0xad, 0x5f, 0xdf, 0xd4, 0xcd,
+- 0x38, 0x56, 0xe4, 0x5a, 0x75, 0xf4, 0x2b, 0x0b, 0x43, 0xe6, 0xa9, 0xa1,
+- 0x12, 0xf4, 0x90, 0x3b, 0x0a, 0x17, 0x10, 0x8e, 0x2a, 0xeb, 0x7c, 0xb7,
+- 0x96, 0x5f, 0xce, 0x79, 0xf5, 0xa0, 0x5f, 0x6d, 0xb3, 0xb9, 0x61, 0x54,
+- 0x15, 0xdc, 0xad, 0xb3, 0xc7, 0x7e, 0x39, 0xfe, 0x4b, 0xac, 0x98, 0xbe,
+- 0x6e, 0xd7, 0x8d, 0x43, 0x46, 0x91, 0xb3, 0x9c, 0x7a, 0x50, 0x25, 0x4e,
+- 0x0e, 0x9b, 0xcb, 0x24, 0x36, 0xfb, 0x59, 0x3f, 0x18, 0x53, 0xa7, 0x73,
+- 0x9b, 0xbf, 0xa9, 0x40, 0x55, 0xcf, 0x2e, 0x07, 0x64, 0xff, 0xaf, 0xec,
+- 0xd9, 0x96, 0xbe, 0xca, 0x0a, 0xeb, 0x57, 0x1f, 0xc4, 0x35, 0x8a, 0x7d,
+- 0x09, 0xdf, 0xa8, 0x28, 0xca, 0x18, 0x8c, 0xda, 0x72, 0xfe, 0xd2, 0x5a,
+- 0xab, 0xe5, 0xe6, 0x68, 0x78, 0xaf, 0xec, 0xd1, 0x82, 0xec, 0xb1, 0x0f,
+- 0x5c, 0x7f, 0x93, 0x7e, 0xa6, 0xb7, 0x59, 0xdc, 0x7b, 0x2a, 0x6b, 0xb3,
+- 0xf2, 0x9f, 0x82, 0x1e, 0xe2, 0x50, 0x54, 0x6b, 0x61, 0x9c, 0xd7, 0x7d,
+- 0x9b, 0x38, 0x1f, 0x71, 0xaf, 0xec, 0x6b, 0x2d, 0xc6, 0xc8, 0x52, 0xe4,
+- 0xd7, 0x48, 0x81, 0x43, 0x85, 0x75, 0x51, 0xda, 0x3d, 0x7a, 0x32, 0xbf,
+- 0xb3, 0x72, 0x5e, 0x27, 0x63, 0xe1, 0xe5, 0xfd, 0xf7, 0x69, 0xea, 0x75,
+- 0x94, 0xff, 0xed, 0xb8, 0xb4, 0xee, 0x22, 0x6b, 0x4f, 0x12, 0x7b, 0x7f,
+- 0x6b, 0xad, 0x7f, 0x4f, 0xd9, 0xe9, 0x7b, 0x5f, 0x67, 0xc6, 0x64, 0x3f,
+- 0xda, 0xd1, 0xc2, 0xfa, 0x7c, 0xeb, 0xbf, 0xdf, 0x8f, 0x46, 0x5b, 0x42,
+- 0x74, 0x07, 0xb9, 0x5d, 0x1c, 0x7d, 0x38, 0x9a, 0x68, 0xd4, 0x76, 0x42,
+- 0x93, 0x75, 0x69, 0x7e, 0xfa, 0x70, 0x2c, 0x81, 0x68, 0xc9, 0x55, 0xd5,
+- 0xe4, 0x5b, 0x88, 0x3a, 0x64, 0x8f, 0x50, 0xa2, 0xb1, 0x6d, 0x37, 0xc7,
+- 0xe4, 0x5f, 0xdb, 0x87, 0xd1, 0x44, 0xcb, 0xad, 0x8c, 0x23, 0xfe, 0x8a,
+- 0x3c, 0xd7, 0xe9, 0x38, 0x4c, 0x1c, 0xd8, 0x5e, 0x58, 0x1b, 0x5b, 0x9f,
+- 0xf8, 0x15, 0xe5, 0xb7, 0x85, 0x64, 0xbd, 0x3f, 0x56, 0xee, 0x2c, 0x7a,
+- 0x53, 0x67, 0xb1, 0x79, 0x50, 0x11, 0xfb, 0xc2, 0xa6, 0xb4, 0xc8, 0x73,
+- 0x16, 0x1b, 0x07, 0xbf, 0x87, 0x43, 0x83, 0xb3, 0xd1, 0x6a, 0xeb, 0xa6,
+- 0x0b, 0x5b, 0xf7, 0x9e, 0xc4, 0x9e, 0x94, 0x85, 0xdd, 0x21, 0x0f, 0xb6,
+- 0x1c, 0x54, 0xb0, 0x2a, 0x70, 0x06, 0x3b, 0xf7, 0x5a, 0x98, 0x1f, 0xea,
+- 0x46, 0x9b, 0x59, 0x81, 0xd2, 0x9a, 0x05, 0x9d, 0x2a, 0xcb, 0xad, 0x1f,
+- 0xed, 0x52, 0x6e, 0xe4, 0xb8, 0x73, 0xae, 0xe3, 0xc4, 0x02, 0x15, 0x3e,
+- 0x03, 0x5a, 0x75, 0x24, 0xaa, 0xdc, 0x92, 0x6d, 0x55, 0x3a, 0x46, 0x6d,
+- 0x3e, 0xa5, 0xdc, 0x94, 0xf5, 0x55, 0x4a, 0x4c, 0x3f, 0x14, 0x3a, 0x8b,
+- 0x74, 0xba, 0xaa, 0x32, 0xef, 0x2f, 0x67, 0xc9, 0x1d, 0x24, 0xe7, 0x30,
+- 0x69, 0x53, 0x7f, 0xec, 0xb9, 0x02, 0xb1, 0xbb, 0x29, 0xfc, 0x64, 0xe4,
+- 0x15, 0xbc, 0x32, 0xf2, 0x2f, 0x58, 0xae, 0x49, 0x9e, 0x69, 0x75, 0x3b,
+- 0x23, 0x96, 0xb5, 0xbf, 0x39, 0x6e, 0xcd, 0x34, 0x2c, 0xb6, 0x57, 0x85,
+- 0x59, 0x91, 0xef, 0x62, 0xb7, 0xc6, 0xb6, 0x52, 0xc7, 0xed, 0x7b, 0xb7,
+- 0xbe, 0xc8, 0xa7, 0xe1, 0x4b, 0xe5, 0xcc, 0x5a, 0x44, 0x87, 0x6a, 0xa1,
+- 0x6f, 0xab, 0x71, 0x18, 0x5d, 0xff, 0x5b, 0x69, 0xc2, 0x4d, 0xd9, 0x57,
+- 0xf0, 0xe6, 0x48, 0x37, 0x31, 0x53, 0xef, 0xf8, 0x96, 0x62, 0x75, 0xef,
+- 0x0e, 0xe9, 0x6d, 0xff, 0x55, 0x89, 0xc6, 0xcb, 0x69, 0x53, 0x65, 0xcc,
+- 0x09, 0x6e, 0x1e, 0x91, 0x7c, 0xb9, 0x03, 0xee, 0x01, 0x3d, 0xb7, 0x82,
+- 0x3c, 0xfb, 0x0b, 0x8b, 0xe2, 0x73, 0x66, 0xd0, 0x2e, 0x1d, 0x8a, 0x1e,
+- 0x34, 0xd4, 0x6e, 0x3c, 0x6e, 0xea, 0x93, 0xbf, 0x75, 0x18, 0xe9, 0x6f,
+- 0xa2, 0x09, 0xeb, 0xb2, 0x7a, 0x7a, 0x29, 0xf3, 0xb0, 0x9d, 0x49, 0x13,
+- 0xa9, 0xa4, 0xde, 0xd1, 0xe5, 0xe8, 0xc7, 0xdd, 0x81, 0xfa, 0x6d, 0x6f,
+- 0x93, 0xcb, 0x79, 0x88, 0x29, 0xc9, 0x89, 0x0c, 0xf3, 0xdc, 0x7e, 0x6c,
+- 0x3d, 0x18, 0xc1, 0x96, 0xfd, 0x26, 0xfa, 0x92, 0x19, 0xca, 0xf6, 0x1a,
+- 0x6d, 0xdb, 0xb2, 0xda, 0x43, 0xf1, 0x1b, 0x54, 0x04, 0xa2, 0xec, 0xb3,
+- 0x45, 0x8d, 0x04, 0xfc, 0xaa, 0xc2, 0xe8, 0x3f, 0xe1, 0x44, 0x2f, 0xcb,
+- 0x0c, 0xa4, 0x68, 0x73, 0x49, 0x37, 0xe3, 0x65, 0x1d, 0x46, 0xc7, 0x7d,
+- 0x38, 0x32, 0xee, 0x41, 0x7a, 0x5c, 0xe3, 0x51, 0x8e, 0x87, 0x86, 0x2d,
+- 0x62, 0xb9, 0x17, 0x8f, 0x1d, 0x76, 0x63, 0xfb, 0x3e, 0x0f, 0xe6, 0x45,
+- 0x66, 0xe1, 0xf0, 0xe1, 0x72, 0x1c, 0xe0, 0xf5, 0x9a, 0xc5, 0x7e, 0x7c,
+- 0x8d, 0xd7, 0x07, 0xf7, 0xb9, 0x38, 0x0f, 0xf3, 0x71, 0x9c, 0x86, 0x9d,
+- 0x1e, 0xaf, 0x40, 0x6a, 0x98, 0x26, 0x4f, 0xce, 0xfa, 0x3a, 0x33, 0x8c,
+- 0xa3, 0x87, 0x19, 0x1b, 0x0f, 0x9a, 0x48, 0xb0, 0x9f, 0x3d, 0xd4, 0x55,
+- 0x1f, 0x71, 0x6d, 0xeb, 0xb8, 0x60, 0xfc, 0x3a, 0xac, 0x1e, 0xd0, 0xdb,
+- 0x5a, 0x15, 0x23, 0xba, 0x44, 0x09, 0xca, 0x73, 0x2b, 0x6e, 0x95, 0xd7,
+- 0x5a, 0x12, 0xba, 0xd9, 0x8a, 0x6e, 0x9c, 0xe6, 0xb8, 0xff, 0x3b, 0xfd,
+- 0x76, 0x99, 0x43, 0xef, 0xbf, 0x5e, 0x3d, 0x89, 0xa1, 0x6c, 0x8e, 0x5c,
+- 0x1d, 0x08, 0x1f, 0x3a, 0x49, 0xfe, 0xf6, 0x38, 0xf1, 0xe7, 0x65, 0xcb,
+- 0x67, 0xa8, 0xb8, 0xe9, 0x01, 0x23, 0x7c, 0x41, 0x09, 0x6c, 0xfb, 0x25,
+- 0x75, 0x70, 0xe3, 0x61, 0x15, 0x1f, 0x1b, 0x5a, 0x86, 0x4c, 0x28, 0x8a,
+- 0x3d, 0x4b, 0x54, 0xdc, 0x70, 0xf0, 0x24, 0x71, 0xff, 0xac, 0xcd, 0x93,
+- 0x73, 0x99, 0x2f, 0x22, 0x38, 0x20, 0x6b, 0xf7, 0x6e, 0xc6, 0xef, 0x4a,
+- 0x9c, 0x19, 0xec, 0xa6, 0xdf, 0x56, 0xe2, 0x54, 0xfa, 0x24, 0xed, 0xb1,
+- 0x12, 0x8f, 0x0f, 0x1a, 0x93, 0x3f, 0x71, 0x54, 0xe2, 0x31, 0x9e, 0x0f,
+- 0xf1, 0x7c, 0xf1, 0xb0, 0x31, 0xd8, 0xa5, 0x56, 0x62, 0xd1, 0xa1, 0x66,
+- 0x0c, 0x26, 0xc5, 0x36, 0x35, 0x6c, 0x1b, 0x6f, 0x2a, 0xe8, 0x5e, 0x74,
+- 0xee, 0xc5, 0x3d, 0xd4, 0xd5, 0xdd, 0x43, 0xdd, 0xec, 0xcf, 0x47, 0x9d,
+- 0x9f, 0xc4, 0x43, 0xcc, 0xeb, 0x76, 0x27, 0x7d, 0x38, 0x9f, 0x32, 0xfc,
+- 0x9f, 0x52, 0x0c, 0xb3, 0x4c, 0x09, 0x68, 0x67, 0xe0, 0xc3, 0x2b, 0xd9,
+- 0x72, 0xf4, 0x0e, 0xd7, 0xe1, 0x27, 0xb4, 0xcf, 0x07, 0xf7, 0x9d, 0xb4,
+- 0xed, 0xff, 0x40, 0x6a, 0x2e, 0x1e, 0x1b, 0x33, 0xd9, 0xb6, 0xcc, 0x93,
+- 0xc3, 0xde, 0xdb, 0xe4, 0x4a, 0x89, 0x6f, 0x44, 0x87, 0x68, 0x16, 0xc4,
+- 0xc4, 0x93, 0xc8, 0x0e, 0xea, 0xfd, 0x37, 0xab, 0xc2, 0xab, 0x55, 0xea,
+- 0xd2, 0x81, 0x29, 0x4d, 0x8f, 0xd7, 0xa8, 0xf1, 0x41, 0xe6, 0xaf, 0xf1,
+- 0x5a, 0xea, 0xe4, 0xb1, 0x41, 0x27, 0x16, 0x2c, 0x56, 0x79, 0x3d, 0x7e,
+- 0x91, 0xb1, 0x2d, 0x3e, 0x4f, 0x35, 0x71, 0xc0, 0x96, 0x15, 0xf1, 0x12,
+- 0x72, 0xfb, 0xea, 0xc5, 0xf5, 0x8c, 0x5f, 0x0e, 0xb1, 0xbd, 0x58, 0xa5,
+- 0xea, 0xa4, 0xde, 0x5f, 0xc1, 0x18, 0xed, 0xfa, 0x11, 0x1e, 0xc7, 0x47,
+- 0xac, 0xee, 0x55, 0xe4, 0xdc, 0xf3, 0x03, 0x56, 0xf7, 0xcd, 0xa6, 0xe1,
+- 0x2b, 0x51, 0x03, 0xd1, 0x2f, 0xe0, 0x15, 0x1c, 0x1b, 0x93, 0x32, 0xb2,
+- 0x0f, 0x24, 0x86, 0x91, 0xa4, 0xd5, 0x3d, 0x64, 0xce, 0x47, 0xb3, 0x9d,
+- 0x1b, 0xbb, 0x2a, 0xf3, 0x98, 0x29, 0x7e, 0x24, 0x6b, 0x25, 0x53, 0xf8,
+- 0x25, 0xdb, 0xb9, 0x30, 0x52, 0x8d, 0x19, 0xb5, 0xe2, 0x07, 0x67, 0xf1,
+- 0xc6, 0xe0, 0x77, 0x71, 0x7e, 0xd0, 0xc2, 0xa2, 0x90, 0x05, 0x67, 0xa8,
+- 0xd1, 0x6c, 0x55, 0x97, 0x12, 0x23, 0x14, 0xac, 0x6e, 0xf8, 0x1e, 0xde,
+- 0x1a, 0x94, 0xfd, 0xa6, 0x96, 0x2d, 0xcb, 0x00, 0x16, 0x5b, 0x7b, 0x66,
+- 0x8a, 0xdf, 0x48, 0xbd, 0x3f, 0x95, 0x07, 0xeb, 0x8c, 0x86, 0xc5, 0x5c,
+- 0xf8, 0x15, 0x8c, 0x8e, 0x18, 0xd1, 0xcd, 0x45, 0x39, 0x07, 0x5f, 0xa1,
+- 0x0e, 0xec, 0xf8, 0x74, 0xb0, 0x06, 0x0b, 0x2e, 0x32, 0x6b, 0xfc, 0xf0,
+- 0x3c, 0xda, 0xce, 0xa2, 0xc5, 0x01, 0x73, 0xa5, 0xfa, 0x6f, 0xf4, 0xd3,
+- 0x57, 0x70, 0x24, 0x5d, 0xc4, 0x6b, 0x1f, 0x5a, 0xe9, 0xe7, 0xf9, 0x7d,
+- 0xfe, 0x5e, 0xb4, 0xa4, 0x4e, 0xd8, 0xeb, 0x0f, 0xc7, 0x89, 0x8f, 0x83,
+- 0x29, 0x29, 0xa3, 0x61, 0x2c, 0xdb, 0x4a, 0x6c, 0x88, 0xe2, 0x9f, 0xb2,
+- 0x11, 0xe2, 0x43, 0x98, 0xf8, 0xd0, 0x4c, 0x7c, 0x30, 0x89, 0x0f, 0x4d,
+- 0xc4, 0x87, 0x20, 0xf1, 0xc1, 0xb0, 0xd7, 0xd6, 0xd3, 0x47, 0xbf, 0x8b,
+- 0x92, 0xe1, 0xb3, 0x70, 0xd1, 0x07, 0xce, 0x98, 0x16, 0xf9, 0x49, 0xa3,
+- 0xb6, 0x11, 0xf3, 0x95, 0xa8, 0xe6, 0x45, 0x9a, 0xed, 0x95, 0x0d, 0x6b,
+- 0x1c, 0x8b, 0x85, 0x60, 0xa8, 0x3e, 0xdc, 0x4f, 0xac, 0xfe, 0x95, 0xd1,
+- 0xd8, 0xef, 0x45, 0xe3, 0x81, 0x99, 0x30, 0x06, 0x17, 0xab, 0x0d, 0x4a,
+- 0xf4, 0xe3, 0x5e, 0x8e, 0xb3, 0x16, 0x73, 0xf7, 0x69, 0x98, 0xc7, 0xe3,
+- 0x1f, 0x53, 0xf5, 0x93, 0x2f, 0x3b, 0xe0, 0x9d, 0x4d, 0xba, 0x33, 0x87,
+- 0x4c, 0x80, 0xac, 0xd6, 0xeb, 0xc3, 0x95, 0xc7, 0x5f, 0x51, 0x15, 0xe4,
+- 0x3e, 0x2e, 0x31, 0xaf, 0x31, 0xd8, 0xa7, 0xaa, 0xb2, 0x96, 0x44, 0x0c,
+- 0xe7, 0xa1, 0x22, 0x42, 0x16, 0x51, 0xc7, 0xfc, 0xc2, 0xda, 0x68, 0x96,
+- 0x61, 0x47, 0x13, 0x39, 0xa7, 0x57, 0x3f, 0x21, 0x31, 0x6a, 0x36, 0x63,
+- 0x44, 0x79, 0x32, 0x7e, 0xe7, 0x6c, 0x78, 0x50, 0x96, 0xb4, 0xac, 0xaf,
+- 0x86, 0x34, 0x78, 0x22, 0x81, 0xe8, 0x56, 0xa6, 0x91, 0x1f, 0x5f, 0x10,
+- 0xc6, 0xea, 0xec, 0x09, 0x0c, 0x73, 0x7c, 0xab, 0xb2, 0xc5, 0x67, 0xc5,
+- 0xfe, 0xf8, 0xe7, 0xf2, 0x33, 0x67, 0x57, 0x1e, 0x98, 0x0d, 0x43, 0xbb,
+- 0x57, 0x1d, 0xae, 0x22, 0x07, 0x3f, 0xce, 0xb8, 0xa7, 0x4c, 0x7d, 0x42,
+- 0x41, 0xc7, 0x70, 0x1c, 0x33, 0x42, 0x2f, 0x28, 0xb1, 0x5a, 0xdd, 0xef,
+- 0x57, 0x6a, 0xf1, 0x89, 0x7d, 0xd4, 0xf5, 0xa2, 0x1f, 0x7a, 0xe4, 0xb9,
+- 0xb0, 0x6f, 0x1e, 0x15, 0xdd, 0xd6, 0xa7, 0x87, 0x38, 0x8e, 0xc9, 0x86,
+- 0x13, 0x82, 0x93, 0x8f, 0xba, 0xe1, 0x78, 0x74, 0x16, 0xa2, 0x68, 0x6a,
+- 0xb8, 0xb2, 0xeb, 0x5f, 0x54, 0xd1, 0x8b, 0xf0, 0x6b, 0x7d, 0x30, 0xae,
+- 0x18, 0xda, 0xcf, 0x95, 0x13, 0xf6, 0x7d, 0xb8, 0xaf, 0x66, 0x4f, 0x52,
+- 0x97, 0xc7, 0x0b, 0xf9, 0xd2, 0x3a, 0x24, 0x06, 0x64, 0x5f, 0xfe, 0x59,
+- 0xcc, 0x1d, 0xd6, 0xdb, 0x77, 0x29, 0x46, 0xf0, 0x06, 0xe5, 0x2c, 0xe6,
+- 0x0c, 0x07, 0x39, 0x97, 0x1a, 0x56, 0x26, 0x8b, 0xf8, 0x29, 0x18, 0xbc,
+- 0x8e, 0x18, 0x6c, 0x2d, 0xfb, 0x89, 0x19, 0xd7, 0x65, 0x4f, 0x82, 0x53,
+- 0xd1, 0x3b, 0x1a, 0x94, 0x38, 0x63, 0xa8, 0x71, 0x71, 0x3d, 0xeb, 0x78,
+- 0x86, 0x9b, 0x70, 0x3b, 0xc7, 0xdc, 0xc6, 0x79, 0xfb, 0xee, 0x62, 0x0b,
+- 0x4b, 0x16, 0xeb, 0x07, 0xca, 0x1c, 0xd1, 0x7b, 0x6b, 0x90, 0xeb, 0x9a,
+- 0x49, 0xbb, 0xb9, 0x7b, 0x91, 0x1e, 0x7e, 0x81, 0xb8, 0x4b, 0x9c, 0x46,
+- 0x2f, 0xe3, 0xce, 0x46, 0xc6, 0xa2, 0xf2, 0x88, 0xde, 0xcf, 0x1c, 0xf5,
+- 0xc2, 0x1d, 0x8e, 0x68, 0x48, 0x9e, 0xff, 0xf8, 0x32, 0x96, 0xc1, 0x1d,
+- 0xaa, 0x22, 0x0e, 0xea, 0xb9, 0xef, 0x42, 0x3f, 0x70, 0x3b, 0xfa, 0xf1,
+- 0x03, 0xf2, 0xbb, 0x99, 0x57, 0xe5, 0x88, 0x51, 0x19, 0x3c, 0x98, 0x3d,
+- 0x89, 0x03, 0xd9, 0x47, 0xb1, 0x37, 0xbb, 0x5b, 0x49, 0xdb, 0xf7, 0x20,
+- 0x15, 0x79, 0xee, 0x26, 0x5a, 0xa5, 0x7c, 0x06, 0x95, 0xa1, 0xaf, 0x5b,
+- 0xe9, 0x1a, 0x15, 0xd5, 0xa1, 0x20, 0x56, 0x27, 0xe3, 0x70, 0x44, 0xde,
+- 0xb6, 0xe4, 0xb9, 0xcf, 0x2d, 0x13, 0x06, 0xae, 0x4f, 0x96, 0x23, 0x76,
+- 0xc8, 0xb2, 0xfa, 0x9b, 0x9d, 0xd8, 0x34, 0xd1, 0x84, 0x95, 0xc3, 0x0f,
+- 0x59, 0xf3, 0x18, 0x73, 0xde, 0xbd, 0xc6, 0x83, 0x3b, 0x0e, 0x79, 0xb0,
+- 0x3e, 0x19, 0x85, 0x2f, 0x52, 0xc1, 0xdf, 0x01, 0x73, 0x39, 0x8c, 0xc9,
+- 0x49, 0x18, 0xfd, 0xd7, 0x39, 0x02, 0xc7, 0xc2, 0xaa, 0x07, 0x7f, 0x4d,
+- 0x1c, 0x5f, 0x45, 0xdc, 0x89, 0x4d, 0x58, 0xa8, 0x8e, 0x78, 0x71, 0x27,
+- 0xeb, 0x7f, 0x8c, 0x73, 0xff, 0xd6, 0x92, 0xe3, 0xc4, 0x02, 0x23, 0x36,
+- 0xa1, 0x68, 0xd8, 0x3a, 0xe1, 0xa6, 0xae, 0xdc, 0x88, 0x1d, 0xa9, 0xc5,
+- 0xf5, 0xfb, 0xfc, 0xb8, 0x63, 0xc2, 0x83, 0x96, 0xa4, 0xb5, 0xec, 0xb8,
+- 0x19, 0x5f, 0xab, 0xc1, 0xc0, 0xfa, 0x09, 0x2f, 0x6e, 0x4b, 0xea, 0xbe,
+- 0x1b, 0x98, 0xf3, 0x8f, 0x99, 0x41, 0xfc, 0xed, 0x84, 0x0f, 0xb7, 0x24,
+- 0x4f, 0x49, 0x1e, 0xb9, 0xdc, 0xc9, 0xd8, 0x73, 0xff, 0x44, 0x1d, 0xd6,
+- 0x26, 0xf5, 0x8b, 0x93, 0xe4, 0x76, 0xdd, 0x47, 0x4c, 0xdc, 0x3b, 0xa1,
+- 0xa2, 0x83, 0xed, 0x7c, 0x22, 0x39, 0x17, 0x5d, 0x47, 0x9a, 0x29, 0xc3,
+- 0x62, 0xac, 0x1a, 0x76, 0xc2, 0x24, 0x8b, 0xc7, 0x27, 0x81, 0x76, 0xfa,
+- 0x47, 0x22, 0xf5, 0x45, 0xec, 0x19, 0x30, 0x71, 0xd7, 0x84, 0x9c, 0x9f,
+- 0xb4, 0x9f, 0x95, 0xbb, 0x70, 0x70, 0x31, 0x6e, 0x1c, 0x56, 0x89, 0x03,
+- 0xa5, 0x48, 0xaf, 0x55, 0x70, 0x1b, 0xaf, 0xef, 0x4a, 0xd9, 0x7b, 0xab,
+- 0x11, 0x1a, 0x0a, 0x1c, 0xab, 0x21, 0x67, 0x58, 0x72, 0x30, 0x7f, 0xfd,
+- 0x41, 0xe2, 0x7c, 0x19, 0x71, 0xbe, 0x82, 0x1c, 0xf6, 0xba, 0xd1, 0x93,
+- 0x78, 0x80, 0xb8, 0x7c, 0x62, 0xb8, 0x9b, 0x71, 0xa7, 0x12, 0x5f, 0x63,
+- 0x1c, 0x48, 0xf2, 0xfc, 0xec, 0x90, 0xd1, 0x55, 0x46, 0x9c, 0x7e, 0x81,
+- 0xf8, 0xdb, 0x4f, 0xcc, 0xb8, 0x3b, 0x49, 0xb7, 0x1f, 0x62, 0x0e, 0x70,
+- 0x55, 0x74, 0xa1, 0x87, 0x39, 0xd6, 0x0d, 0x4a, 0xc0, 0xf7, 0x1a, 0x2a,
+- 0xe1, 0x38, 0x58, 0x8b, 0x96, 0x7d, 0x52, 0x46, 0xf0, 0x4b, 0x85, 0x7a,
+- 0xd8, 0x49, 0x9d, 0x9f, 0x84, 0x35, 0xe8, 0xe0, 0x78, 0xeb, 0x4d, 0x32,
+- 0x70, 0xfc, 0xd8, 0xd4, 0xb5, 0x7f, 0x22, 0xd6, 0xbe, 0x43, 0x4c, 0xf5,
+- 0xcf, 0x6e, 0x46, 0xab, 0x61, 0xf2, 0x38, 0x89, 0x57, 0x06, 0x0d, 0xf3,
+- 0x10, 0x9c, 0x78, 0x99, 0x3c, 0x6f, 0x6a, 0x36, 0x63, 0xa6, 0x21, 0x7e,
+- 0x98, 0xe1, 0x78, 0x54, 0xc9, 0x4b, 0xe0, 0x18, 0x07, 0xde, 0x38, 0xb8,
+- 0x8c, 0xe3, 0x92, 0x58, 0x2a, 0xf1, 0x2e, 0x43, 0x59, 0x97, 0x61, 0x0d,
+- 0xf5, 0xd1, 0x9a, 0x54, 0x91, 0x39, 0x12, 0xc1, 0x5d, 0xfb, 0xf3, 0x71,
+- 0x78, 0x5b, 0x28, 0x7e, 0x33, 0xe3, 0x70, 0xb8, 0x9c, 0x71, 0xd8, 0x15,
+- 0x11, 0xd9, 0x9c, 0x18, 0x65, 0xdc, 0xde, 0x91, 0x0a, 0xa3, 0x8d, 0x73,
+- 0x38, 0x99, 0x61, 0xbf, 0xc9, 0x3a, 0x9c, 0xc9, 0x78, 0x18, 0xb3, 0x34,
+- 0x1e, 0x44, 0xb5, 0xb1, 0x59, 0x3c, 0xfc, 0x3c, 0xe6, 0xf3, 0x30, 0xec,
+- 0x6b, 0x1b, 0x93, 0x0a, 0xe2, 0xed, 0x8a, 0xcd, 0xe7, 0xcf, 0x64, 0x04,
+- 0x9b, 0x65, 0x2d, 0x73, 0x7b, 0x95, 0x3c, 0x8b, 0x32, 0x98, 0xfa, 0x1e,
+- 0xaa, 0xa9, 0xff, 0xaa, 0x02, 0x0e, 0xfd, 0x34, 0x24, 0xb8, 0x5b, 0x4f,
+- 0xdc, 0x95, 0xe7, 0x04, 0x2c, 0x6b, 0x5d, 0x60, 0x3a, 0x1e, 0xfd, 0x9f,
+- 0x77, 0xa3, 0xf6, 0x33, 0x17, 0x82, 0x49, 0xc4, 0xbf, 0x14, 0xf1, 0x8f,
+- 0x63, 0xe8, 0xb9, 0x96, 0x18, 0x48, 0x99, 0xfe, 0x21, 0x45, 0x0c, 0x24,
+- 0x4e, 0x3f, 0x4a, 0x9c, 0xfe, 0x06, 0x71, 0xfa, 0xeb, 0xc4, 0xe9, 0xaf,
+- 0x11, 0x13, 0xf2, 0x6b, 0x7a, 0x6d, 0x72, 0xff, 0x85, 0xf3, 0xf1, 0x96,
+- 0xbd, 0xb6, 0x38, 0x93, 0xba, 0x9a, 0x3b, 0xac, 0x60, 0x9e, 0xa1, 0x1f,
+- 0x13, 0xbb, 0xff, 0x01, 0xe7, 0xc9, 0x3f, 0xa3, 0xce, 0x7e, 0x26, 0xa6,
+- 0x35, 0xd9, 0x07, 0x77, 0xb2, 0x51, 0xeb, 0x87, 0xfd, 0x2c, 0xb2, 0x29,
+- 0x5c, 0xb4, 0x24, 0xb9, 0x11, 0x8e, 0x64, 0xe3, 0xb1, 0xd3, 0x72, 0x9f,
+- 0x77, 0x96, 0xe4, 0xf5, 0x1b, 0xe1, 0x4c, 0xea, 0xc7, 0xe2, 0x94, 0x65,
+- 0x25, 0xff, 0x73, 0x25, 0x1b, 0xcd, 0xd7, 0x60, 0x63, 0x9b, 0x7f, 0xca,
+- 0xfe, 0xaf, 0xfe, 0xc2, 0x03, 0xd4, 0x57, 0x8e, 0x6d, 0x66, 0xa8, 0xfb,
+- 0x72, 0xf2, 0x95, 0x47, 0xb2, 0xf2, 0xbb, 0xb1, 0x23, 0xa1, 0x1e, 0x43,
+- 0x6c, 0xa6, 0xf0, 0xf1, 0x30, 0x6e, 0x4a, 0x7a, 0x68, 0x07, 0x71, 0x54,
+- 0xd1, 0xb7, 0x3e, 0x37, 0xd1, 0x4c, 0x5f, 0x7b, 0xc8, 0xd2, 0x22, 0x81,
+- 0x8e, 0x09, 0x72, 0x9e, 0x2d, 0x13, 0xcb, 0xb0, 0x62, 0xd8, 0xb2, 0x3c,
+- 0x4b, 0x8d, 0xf0, 0x56, 0xc5, 0x0f, 0x17, 0x7d, 0xd0, 0x41, 0xbf, 0xda,
+- 0x7c, 0x28, 0xa0, 0xbd, 0x46, 0x3c, 0xed, 0x6c, 0x3e, 0x41, 0xfb, 0x30,
+- 0x2e, 0xb6, 0x11, 0x4b, 0x9d, 0x91, 0x00, 0xf3, 0x44, 0x0f, 0x6d, 0xdf,
+- 0x8b, 0x8b, 0x09, 0xf1, 0x2f, 0xbd, 0xeb, 0x9f, 0x98, 0x9b, 0x74, 0xd1,
+- 0x37, 0x7e, 0x9e, 0xa8, 0xa3, 0x0f, 0xb8, 0xf1, 0x46, 0xc2, 0xa0, 0xbf,
+- 0x79, 0xf0, 0x56, 0xa2, 0x89, 0x7d, 0x05, 0x59, 0xc6, 0x8f, 0x7b, 0x26,
+- 0xc2, 0xf4, 0xb3, 0x6b, 0x79, 0xc8, 0x73, 0x99, 0xf5, 0xf1, 0x6f, 0x2a,
+- 0xf5, 0x83, 0x73, 0xd5, 0x1a, 0x44, 0x6b, 0x35, 0x7c, 0x7e, 0xe2, 0x23,
+- 0xf8, 0x57, 0xc6, 0xed, 0x4d, 0x49, 0x70, 0x0e, 0x11, 0x22, 0x0f, 0x9c,
+- 0x3c, 0x22, 0xf7, 0x1c, 0xd1, 0x18, 0x6d, 0x70, 0xe8, 0xcc, 0x6d, 0xf5,
+- 0xdc, 0x79, 0x87, 0x93, 0x7d, 0x92, 0x15, 0xb3, 0xec, 0xcf, 0x07, 0xcb,
+- 0x71, 0xef, 0xa1, 0x13, 0xf4, 0x91, 0x12, 0x2c, 0x7a, 0xc0, 0x8d, 0xcf,
+- 0x1f, 0xc9, 0x90, 0x3b, 0xa8, 0x90, 0xfd, 0xbc, 0x69, 0x12, 0x85, 0x39,
+- 0xa3, 0x11, 0xdc, 0xb9, 0x3f, 0x83, 0xe1, 0x02, 0xcf, 0x0b, 0x85, 0xe2,
+- 0xff, 0x43, 0xc5, 0x09, 0xf2, 0x88, 0x40, 0xe7, 0xd5, 0xb4, 0xb1, 0xaa,
+- 0x48, 0x20, 0x2e, 0xe3, 0x6e, 0xa7, 0x8d, 0xf5, 0x71, 0x3e, 0x33, 0x1c,
+- 0x47, 0x82, 0x36, 0xf6, 0x55, 0xca, 0xbf, 0x87, 0x36, 0x16, 0xa7, 0x8d,
+- 0xc5, 0x69, 0x4f, 0x71, 0xda, 0x98, 0x3c, 0xfb, 0x1b, 0xa7, 0x8d, 0xc5,
+- 0x69, 0x63, 0xf1, 0xcc, 0x32, 0x1c, 0x25, 0xd3, 0xd8, 0x39, 0xd6, 0x4c,
+- 0x1c, 0x53, 0xec, 0xa8, 0x94, 0xbb, 0xf9, 0x23, 0xe4, 0xec, 0xd7, 0xf1,
+- 0x50, 0xd0, 0x46, 0x9f, 0xec, 0x4f, 0x67, 0xc8, 0x79, 0xdc, 0xf8, 0x75,
+- 0x56, 0x38, 0x7e, 0x33, 0xf3, 0xd8, 0x93, 0xe4, 0xf9, 0x2a, 0x9e, 0x30,
+- 0x25, 0x0f, 0x36, 0x79, 0xce, 0x58, 0x93, 0x12, 0xbe, 0x76, 0x12, 0x77,
+- 0x0f, 0x02, 0x37, 0x90, 0x17, 0xd6, 0x92, 0x97, 0x1c, 0x5e, 0xc4, 0xdf,
+- 0x07, 0x4f, 0xd0, 0xe6, 0x4f, 0xda, 0x7b, 0xbb, 0x54, 0xb6, 0x75, 0x66,
+- 0xb0, 0xde, 0x77, 0x3d, 0x7d, 0xf0, 0x7e, 0xd6, 0x75, 0x1e, 0x94, 0x3a,
+- 0x27, 0xd8, 0xb6, 0x1e, 0xfe, 0x35, 0xe7, 0xbf, 0xe3, 0x81, 0x5a, 0xbc,
+- 0xb1, 0x5f, 0x0f, 0xbf, 0x43, 0xcc, 0xab, 0x75, 0x58, 0xcb, 0xae, 0x0e,
+- 0x05, 0xb6, 0x5d, 0xad, 0xe6, 0xf9, 0x5e, 0xfb, 0x90, 0x13, 0xc7, 0x42,
+- 0xcb, 0xe0, 0x59, 0x54, 0xe4, 0x7c, 0xb4, 0xa5, 0x5a, 0xe1, 0x58, 0x7a,
+- 0xf8, 0x3c, 0xb9, 0x4a, 0x92, 0xed, 0x1f, 0xcd, 0x3c, 0x4e, 0x0c, 0xf9,
+- 0x22, 0x9e, 0x63, 0x7e, 0x3e, 0xf6, 0xa1, 0x97, 0xc9, 0x1d, 0xdd, 0x18,
+- 0x27, 0x07, 0x3c, 0x3e, 0x18, 0xfd, 0xa8, 0x93, 0xb8, 0xef, 0x59, 0x54,
+- 0x89, 0x4c, 0x5a, 0xb8, 0x62, 0x25, 0x9e, 0x19, 0x34, 0xb4, 0x1b, 0x94,
+- 0x3c, 0x2f, 0xcc, 0xef, 0xfd, 0x32, 0x2e, 0x8e, 0x22, 0x30, 0x79, 0x9e,
+- 0xdc, 0xf0, 0x9d, 0xb4, 0xc4, 0xb0, 0x93, 0xf4, 0x71, 0x3f, 0xc2, 0x49,
+- 0x0d, 0x27, 0xc6, 0x0d, 0x2c, 0x4c, 0x7a, 0xf1, 0xf0, 0x78, 0x10, 0x57,
+- 0xd3, 0x77, 0xb3, 0xe4, 0x87, 0x1f, 0x4a, 0x8a, 0x2f, 0xd6, 0x61, 0x62,
+- 0xbc, 0x8e, 0x3e, 0x22, 0xbc, 0xfc, 0x67, 0xf0, 0xd4, 0x9e, 0xb5, 0xf7,
+- 0x36, 0x8f, 0xa6, 0xf4, 0xfe, 0x18, 0xc7, 0x13, 0xf3, 0xea, 0xc7, 0x62,
+- 0xd0, 0xd3, 0xc0, 0x87, 0xdf, 0x4d, 0x7f, 0x52, 0xe2, 0xa3, 0xf8, 0xa3,
+- 0x86, 0x09, 0xf2, 0x9d, 0x52, 0x62, 0x6a, 0x79, 0xa4, 0xfe, 0xc2, 0xf7,
+- 0x15, 0x3d, 0xf7, 0x94, 0x6a, 0x59, 0xdf, 0x5b, 0xac, 0xc1, 0x77, 0x44,
+- 0x23, 0xf7, 0x30, 0xed, 0xe7, 0x62, 0xe4, 0x79, 0xf3, 0xd9, 0xfb, 0x6a,
+- 0x31, 0x63, 0x5f, 0x12, 0xff, 0xad, 0x36, 0xfe, 0xd1, 0x59, 0x8c, 0xf3,
+- 0xb3, 0x64, 0x7f, 0x76, 0xf2, 0xf4, 0x6c, 0xb9, 0x57, 0x34, 0xa9, 0x36,
+- 0x76, 0x1c, 0x83, 0x7e, 0xec, 0x15, 0x45, 0xf7, 0x7d, 0x95, 0xb1, 0xc1,
+- 0x45, 0x1b, 0x75, 0x4c, 0x68, 0xf4, 0xdd, 0xc6, 0x13, 0x33, 0x60, 0xc4,
+- 0xaf, 0x51, 0x5d, 0x16, 0x6c, 0x79, 0x6e, 0xa8, 0xca, 0xe7, 0x45, 0x82,
+- 0x3b, 0x12, 0x17, 0xc8, 0x17, 0x89, 0xc1, 0x9d, 0xf4, 0x97, 0x35, 0x76,
+- 0x2c, 0x3a, 0x61, 0xef, 0xfd, 0xde, 0x3a, 0x11, 0xa7, 0x8f, 0x2c, 0x43,
+- 0xc5, 0xb0, 0x07, 0x9f, 0xb3, 0xe3, 0xd0, 0x43, 0x56, 0x0d, 0xfd, 0xe5,
+- 0xae, 0x43, 0x81, 0xce, 0xeb, 0xe9, 0x2f, 0xf5, 0x4b, 0x25, 0x86, 0x31,
+- 0x6e, 0xa7, 0x0c, 0x73, 0x94, 0xd8, 0xf2, 0x50, 0xb3, 0x31, 0xf9, 0x32,
+- 0xf2, 0x3e, 0xb3, 0x6b, 0xa0, 0x16, 0x7f, 0xff, 0xc0, 0x71, 0x7b, 0x2d,
+- 0xe4, 0x4e, 0x9e, 0x27, 0x07, 0x7c, 0xb6, 0x7f, 0xc4, 0xf8, 0xfb, 0x1e,
+- 0xc6, 0xbc, 0x18, 0xfd, 0x68, 0xe7, 0x80, 0xb5, 0xec, 0xf9, 0xc5, 0xf1,
+- 0xb5, 0x55, 0x08, 0x32, 0x26, 0xb9, 0xd1, 0x3f, 0xa0, 0x0f, 0x76, 0x30,
+- 0x06, 0x9d, 0x5d, 0x6c, 0x52, 0x16, 0x0f, 0x86, 0x06, 0x04, 0x53, 0x4f,
+- 0xdd, 0x52, 0x8b, 0xf8, 0xff, 0xd0, 0x38, 0xbe, 0xcf, 0xd9, 0xf7, 0x08,
+- 0xeb, 0xb0, 0xe9, 0xc8, 0x52, 0xca, 0xdc, 0x44, 0x1f, 0x64, 0x5e, 0xcd,
+- 0x7c, 0x67, 0xc3, 0x7e, 0xf1, 0x0b, 0xb4, 0x48, 0x9e, 0xd6, 0x6d, 0x06,
+- 0xcc, 0x57, 0xe9, 0x43, 0x25, 0xe4, 0x3a, 0x0f, 0xa6, 0xec, 0xe7, 0x73,
+- 0x72, 0x15, 0x46, 0x18, 0x8b, 0x69, 0xa3, 0x25, 0x86, 0x0f, 0x33, 0xc8,
+- 0xeb, 0x16, 0x72, 0x3e, 0xca, 0xb2, 0x1e, 0x80, 0x1c, 0x02, 0xc4, 0x27,
+- 0x1c, 0x25, 0x08, 0x1e, 0xf5, 0xf3, 0x98, 0xcf, 0x83, 0x8a, 0xc8, 0xaa,
+- 0x98, 0x79, 0x94, 0x75, 0x47, 0x33, 0xb6, 0x2d, 0xfe, 0x3d, 0xe7, 0x3d,
+- 0x41, 0x5b, 0xff, 0x04, 0xb1, 0x7e, 0x72, 0x2f, 0xd0, 0x7f, 0x30, 0x6f,
+- 0xdb, 0x29, 0xb6, 0xdf, 0x4e, 0xcc, 0xbb, 0x40, 0x9b, 0xed, 0xe3, 0x7c,
+- 0x0f, 0x8d, 0x18, 0xc1, 0x46, 0x35, 0xa0, 0x4d, 0x70, 0x9e, 0x7b, 0xc6,
+- 0x54, 0x0c, 0x0c, 0x2e, 0xc3, 0x28, 0xf3, 0xa0, 0xde, 0xb4, 0xf8, 0x88,
+- 0x94, 0x39, 0x89, 0x6e, 0xfa, 0xc8, 0x2f, 0x17, 0x2b, 0x88, 0x7d, 0x5c,
+- 0xf6, 0xbe, 0x3b, 0x99, 0xef, 0x7f, 0x11, 0x9b, 0x12, 0x8f, 0x5b, 0x95,
+- 0x86, 0xde, 0x9f, 0x56, 0x99, 0x67, 0xd1, 0x36, 0x7b, 0x98, 0x9f, 0x2c,
+- 0x67, 0x7e, 0xd2, 0x5b, 0xb0, 0xcb, 0x33, 0xb4, 0xc3, 0x01, 0xc6, 0xb1,
+- 0x97, 0xd3, 0xf9, 0xb8, 0xf7, 0x83, 0x21, 0x3f, 0x16, 0x5e, 0x53, 0x89,
+- 0xa7, 0x0f, 0xe6, 0x65, 0xdb, 0x4b, 0x9b, 0x7c, 0x8a, 0x7a, 0xbe, 0x83,
+- 0x7a, 0x7d, 0x29, 0x25, 0x18, 0x15, 0xc4, 0x33, 0xe4, 0xd1, 0x5b, 0xc8,
+- 0x05, 0xbe, 0x97, 0xca, 0xdb, 0xe4, 0xe7, 0x27, 0xd6, 0x68, 0xf9, 0xf8,
+- 0xe0, 0x85, 0xba, 0x4f, 0xf6, 0x00, 0x5a, 0xd6, 0x72, 0x33, 0xd7, 0x49,
+- 0x5e, 0xc3, 0xb6, 0x23, 0xe4, 0x46, 0x4e, 0xcc, 0x49, 0x46, 0xb0, 0x22,
+- 0x55, 0xdf, 0xd6, 0x20, 0x9b, 0x3d, 0xe6, 0xe4, 0x39, 0xa0, 0x2b, 0x29,
+- 0xef, 0x0e, 0xd0, 0x50, 0xc1, 0xdc, 0xe9, 0xaf, 0x0b, 0xef, 0x2b, 0xf8,
+- 0xc4, 0x9f, 0xc1, 0x1d, 0xd7, 0x50, 0xa6, 0x14, 0xb9, 0xe3, 0x54, 0xe1,
+- 0x7d, 0x05, 0x37, 0xdb, 0xef, 0x2b, 0x70, 0x63, 0xc6, 0x84, 0xd3, 0xf9,
+- 0xa9, 0x94, 0x07, 0xb3, 0x27, 0x2e, 0x71, 0x50, 0x77, 0x49, 0xa4, 0x15,
+- 0x4f, 0x26, 0x14, 0xcc, 0x32, 0xfe, 0x27, 0xbe, 0x6f, 0xaf, 0x09, 0xd4,
+- 0xda, 0x7b, 0xf6, 0x5d, 0x91, 0x28, 0x0e, 0x27, 0xf4, 0xb6, 0xc7, 0x78,
+- 0x5e, 0x46, 0x3c, 0xad, 0xda, 0xa7, 0xe0, 0xa9, 0x80, 0x17, 0xa5, 0x47,
+- 0x64, 0xaf, 0xbb, 0x65, 0x39, 0x17, 0xaf, 0xb2, 0x76, 0xac, 0x13, 0xfb,
+- 0xe6, 0x1c, 0x1e, 0x09, 0x54, 0x09, 0x06, 0x1e, 0x36, 0x65, 0xdd, 0xd2,
+- 0x40, 0x5f, 0xa2, 0x96, 0xfc, 0xba, 0xbe, 0xb3, 0x15, 0xf5, 0xe6, 0xcf,
+- 0x1c, 0xb5, 0x28, 0x39, 0x72, 0x87, 0x26, 0x6b, 0xf6, 0xdf, 0xe0, 0x9c,
+- 0xf5, 0x12, 0xbb, 0x7a, 0x52, 0xf9, 0xf8, 0xd9, 0x9a, 0xb1, 0xaa, 0x45,
+- 0x2f, 0xbd, 0xe4, 0x27, 0x6a, 0xf2, 0xa2, 0x5d, 0xa6, 0x22, 0x92, 0x23,
+- 0xfe, 0xd4, 0xe1, 0x04, 0xf9, 0x82, 0xc4, 0xd2, 0x0a, 0x1e, 0x95, 0xe4,
+- 0x8d, 0x3f, 0x67, 0x2c, 0xbd, 0x27, 0x94, 0x0b, 0xca, 0x9b, 0x2c, 0x6a,
+- 0xc8, 0xc5, 0xe9, 0x03, 0x38, 0x12, 0xd2, 0xdb, 0x37, 0x38, 0xa2, 0x4f,
+- 0x33, 0x07, 0x0b, 0x2f, 0x63, 0x4e, 0xbe, 0x2a, 0x90, 0xc1, 0x2e, 0xf2,
+- 0xc0, 0x9d, 0xcc, 0xc5, 0x3b, 0x68, 0x9b, 0x9d, 0xfb, 0x19, 0xdb, 0x1c,
+- 0x97, 0x73, 0x71, 0x2d, 0x14, 0xdf, 0x40, 0x0e, 0xd0, 0xe5, 0x51, 0xc5,
+- 0x5e, 0xc5, 0x77, 0x02, 0x1d, 0xaf, 0x12, 0xa3, 0x1b, 0x19, 0x37, 0xc4,
+- 0xde, 0xf7, 0xa4, 0xf4, 0x4e, 0x2a, 0xa0, 0xa6, 0x92, 0xb9, 0xe3, 0xbd,
+- 0xe3, 0xcd, 0xf4, 0x9b, 0xfc, 0x33, 0x73, 0xce, 0x25, 0x75, 0xcc, 0x39,
+- 0xaf, 0x43, 0xef, 0x10, 0xed, 0x9f, 0xbe, 0x74, 0xff, 0x00, 0xc8, 0xcf,
+- 0xd4, 0x9d, 0x9c, 0xbf, 0xdc, 0x11, 0x04, 0x2e, 0xb6, 0xa3, 0xb1, 0xad,
+- 0xc4, 0x21, 0x32, 0xe8, 0xed, 0x6f, 0x90, 0xa7, 0x75, 0x31, 0x3f, 0xdd,
+- 0xc2, 0x5c, 0x3e, 0xc6, 0x5c, 0x3e, 0xc6, 0x7a, 0xa9, 0x21, 0xb9, 0x4f,
+- 0x64, 0xb4, 0x9f, 0x61, 0xfe, 0xf3, 0x39, 0xf2, 0x9f, 0xa1, 0x07, 0x44,
+- 0xae, 0x59, 0xb8, 0xf7, 0xf0, 0x75, 0x48, 0xd2, 0x9e, 0xee, 0xe1, 0xb5,
+- 0x81, 0x07, 0xe6, 0xe3, 0x6e, 0xe6, 0xf1, 0xb1, 0xf1, 0x65, 0x18, 0x64,
+- 0x26, 0xba, 0xed, 0xf0, 0x47, 0xd0, 0x43, 0x3e, 0xb5, 0x9c, 0x18, 0xbd,
+- 0xe1, 0x60, 0xc6, 0xc6, 0x6c, 0xc1, 0xfc, 0x1f, 0x67, 0x80, 0xd7, 0xc8,
+- 0xc9, 0x06, 0x53, 0x27, 0x6c, 0x9e, 0xe6, 0x62, 0x7c, 0x28, 0x25, 0x2e,
+- 0x85, 0xf7, 0x1b, 0x5d, 0x2b, 0x55, 0x6b, 0x59, 0xd9, 0xe2, 0x40, 0xff,
+- 0x1b, 0xf4, 0xd5, 0x9a, 0x23, 0x2a, 0x6a, 0x87, 0x25, 0x57, 0x27, 0x3f,
+- 0x22, 0x46, 0x3f, 0x47, 0x8c, 0xae, 0x3c, 0x94, 0xcf, 0xcb, 0x13, 0xcc,
+- 0xbb, 0x6a, 0x8d, 0x7c, 0x6e, 0xbe, 0x67, 0x40, 0xf6, 0xe8, 0xb8, 0xf1,
+- 0x1d, 0xda, 0xfe, 0xa9, 0x82, 0xed, 0x9f, 0x2e, 0x60, 0xb0, 0xc5, 0xdc,
+- 0xfc, 0x35, 0x1b, 0x7f, 0xf3, 0xb9, 0xf9, 0xc2, 0x61, 0xa3, 0x2b, 0x4c,
+- 0x8c, 0xbe, 0xfa, 0x90, 0xf4, 0xaf, 0xa1, 0x96, 0x78, 0x32, 0x93, 0x58,
+- 0x52, 0x35, 0x2c, 0xeb, 0x33, 0x81, 0xce, 0x09, 0xd5, 0x67, 0xf7, 0xb1,
+- 0x9d, 0xb2, 0xf5, 0xd2, 0x07, 0xbe, 0x9a, 0x30, 0xb4, 0xad, 0x4a, 0xc0,
+- 0x5c, 0x4d, 0x7d, 0x1e, 0xc9, 0x5c, 0x87, 0xce, 0xc1, 0x3a, 0x1c, 0x4b,
+- 0x4b, 0x7c, 0x91, 0xf6, 0x25, 0x17, 0x77, 0xe2, 0x9d, 0xfd, 0x73, 0xf1,
+- 0xce, 0xd8, 0xe5, 0x3c, 0x7c, 0x47, 0x2a, 0x7a, 0x3f, 0xc3, 0xeb, 0x2a,
+- 0xc9, 0xc3, 0xbf, 0xc7, 0x3c, 0xfc, 0x0d, 0x45, 0xd6, 0x10, 0x55, 0x7c,
+- 0x62, 0x91, 0x83, 0xf1, 0x45, 0xf7, 0x7f, 0xd7, 0x11, 0x97, 0xfb, 0xc8,
+- 0xfe, 0x07, 0xf8, 0xff, 0xb3, 0x8c, 0xe7, 0xc3, 0x9c, 0x89, 0x68, 0xad,
+- 0x03, 0x4f, 0x2f, 0x8e, 0x47, 0x65, 0x9d, 0xb4, 0x9f, 0x3c, 0x65, 0x0e,
+- 0xe3, 0xe1, 0xdf, 0xa7, 0xea, 0xc3, 0x0b, 0x1d, 0x0e, 0x5c, 0x34, 0xf5,
+- 0xf6, 0x03, 0xbc, 0xf6, 0x4c, 0x56, 0x7c, 0x31, 0x4c, 0xfc, 0x5a, 0x59,
+- 0xf0, 0xc5, 0x5a, 0x94, 0xd3, 0xce, 0xe7, 0xd2, 0x5e, 0x7f, 0x9c, 0xd2,
+- 0x07, 0x9f, 0xa1, 0x9d, 0xd6, 0x5e, 0xb2, 0x53, 0x59, 0xa3, 0x95, 0xbc,
+- 0xa6, 0x9d, 0x79, 0xcd, 0xf4, 0xe7, 0xa5, 0x8f, 0xa3, 0x2f, 0x7b, 0x1f,
+- 0xee, 0xdd, 0xab, 0x77, 0x39, 0x1d, 0x71, 0x4b, 0x33, 0xba, 0x99, 0xa3,
+- 0x75, 0x23, 0xb0, 0xc8, 0xe8, 0xb8, 0xa0, 0xe8, 0x9d, 0x3f, 0x54, 0xca,
+- 0x99, 0xf3, 0x9d, 0xc1, 0xf6, 0x51, 0x3d, 0x98, 0x51, 0x0c, 0xdc, 0x40,
+- 0x8c, 0x7b, 0x78, 0xa4, 0x84, 0x76, 0xb8, 0x1e, 0x47, 0x06, 0xf5, 0x70,
+- 0x1c, 0x26, 0x31, 0xb4, 0xde, 0x5f, 0xa6, 0x5c, 0xc0, 0x69, 0xf3, 0x2c,
+- 0xb6, 0x67, 0xe7, 0x60, 0xbd, 0x26, 0x7b, 0x9a, 0xd6, 0x63, 0x62, 0xf0,
+- 0x02, 0x71, 0xa8, 0x9d, 0xdc, 0x4a, 0xf2, 0x06, 0x0b, 0x7b, 0x42, 0x57,
+- 0x63, 0x8b, 0xed, 0xbf, 0xa5, 0xf2, 0x4e, 0x0b, 0xcf, 0x3c, 0xc3, 0x20,
+- 0x4e, 0x48, 0x6e, 0xee, 0x9b, 0xb6, 0x3f, 0x57, 0xd6, 0x75, 0x1b, 0xab,
+- 0xf2, 0xf7, 0x95, 0xff, 0x58, 0x99, 0x29, 0x1c, 0x1a, 0x91, 0xf5, 0x85,
+- 0x19, 0xca, 0xe3, 0x83, 0x0d, 0xbe, 0x1e, 0xc6, 0x8f, 0xfb, 0xcd, 0x1c,
+- 0x5e, 0x5f, 0x5c, 0x86, 0x29, 0xaf, 0x82, 0xd0, 0xd5, 0x61, 0xe9, 0x83,
+- 0x9f, 0x73, 0x96, 0xff, 0x93, 0xd2, 0xce, 0x82, 0xc2, 0x9a, 0xc3, 0x3b,
+- 0x35, 0x8c, 0x55, 0x3c, 0x97, 0xe7, 0x03, 0xe5, 0xbc, 0x78, 0xfd, 0x47,
+- 0x56, 0xd4, 0x2b, 0xd7, 0x89, 0xd9, 0xb3, 0xc4, 0x7f, 0x67, 0x28, 0x77,
+- 0x12, 0x6f, 0xe7, 0x87, 0x66, 0x28, 0xeb, 0xd3, 0xc5, 0x3a, 0x2f, 0x22,
+- 0x3b, 0xf2, 0x22, 0xe7, 0x53, 0x0f, 0x4e, 0xc1, 0x55, 0x78, 0x56, 0x5e,
+- 0xf6, 0x81, 0xb9, 0xc8, 0x43, 0x65, 0x2d, 0xfe, 0x1c, 0x86, 0xf6, 0x0b,
+- 0x6f, 0xb4, 0xac, 0x40, 0xc3, 0x39, 0x6c, 0x3f, 0x7a, 0x42, 0xe9, 0x48,
+- 0xbd, 0x6b, 0xa1, 0x74, 0x46, 0x6c, 0x8e, 0xbd, 0xdf, 0x59, 0xda, 0xe8,
+- 0x53, 0xda, 0xb3, 0x81, 0xf0, 0xfd, 0x0c, 0xbe, 0x5a, 0x44, 0x9e, 0x63,
+- 0x97, 0xb1, 0x9d, 0xe0, 0x35, 0xc3, 0x7e, 0x66, 0xe8, 0xb8, 0x3d, 0xce,
+- 0xf7, 0xeb, 0xe1, 0x9b, 0x56, 0xb4, 0x5d, 0xea, 0x16, 0xe5, 0x9a, 0xcf,
+- 0x89, 0x16, 0xd9, 0x8a, 0xff, 0x8f, 0x17, 0x64, 0x2f, 0x25, 0x77, 0xce,
+- 0x97, 0xe9, 0xa4, 0xec, 0x25, 0xa1, 0x28, 0x4e, 0x35, 0x4f, 0x97, 0xbf,
+- 0x38, 0xd6, 0x83, 0xef, 0x69, 0x2f, 0x5f, 0xf6, 0xe3, 0xb5, 0xb2, 0x4f,
+- 0xea, 0x54, 0xf3, 0x24, 0xfe, 0xce, 0x5e, 0xd7, 0x78, 0xd3, 0xde, 0xdf,
+- 0xb9, 0xcb, 0x6c, 0x89, 0x96, 0xe1, 0xa3, 0x50, 0xaf, 0x8a, 0x2f, 0x2c,
+- 0xb3, 0xf9, 0x76, 0xb4, 0xbd, 0x8c, 0x39, 0xb7, 0xdb, 0x88, 0xde, 0xef,
+- 0x46, 0x2e, 0x47, 0x9e, 0xd0, 0x71, 0x51, 0x39, 0xa6, 0xdc, 0x11, 0xd0,
+- 0xb7, 0xbd, 0x4d, 0xfe, 0xf3, 0x6c, 0x20, 0xce, 0x39, 0x37, 0x7c, 0x03,
+- 0x8a, 0x6e, 0x6e, 0x62, 0x8c, 0x7d, 0x86, 0x39, 0xed, 0xc6, 0x40, 0xbf,
+- 0x7d, 0xcf, 0x53, 0x89, 0xac, 0xc1, 0x95, 0xf6, 0xfb, 0x26, 0xda, 0x61,
+- 0x64, 0x5e, 0x94, 0x35, 0x38, 0xfe, 0x8e, 0x61, 0xa1, 0x7d, 0x6d, 0x23,
+- 0x82, 0xf6, 0xf7, 0xba, 0xc2, 0x3b, 0x29, 0x3a, 0x50, 0x6f, 0x7f, 0x7f,
+- 0x1a, 0x0d, 0x99, 0x4b, 0x6b, 0xd5, 0xe8, 0x35, 0x2d, 0xeb, 0x49, 0x53,
+- 0x9e, 0x57, 0xbb, 0xb4, 0xb7, 0x7c, 0x8d, 0x83, 0x39, 0x10, 0x21, 0x25,
+- 0x96, 0x7f, 0x27, 0xcf, 0xe5, 0xe7, 0xc5, 0x56, 0xbc, 0x67, 0x6f, 0xb9,
+- 0xfd, 0xac, 0x93, 0xfd, 0xce, 0xa5, 0x05, 0x4b, 0x9c, 0xf8, 0x4e, 0xa2,
+- 0x2a, 0xe6, 0xe1, 0xef, 0xed, 0x4b, 0x4a, 0xb0, 0x25, 0x44, 0x0e, 0x7a,
+- 0xd5, 0x19, 0x9c, 0xcf, 0x38, 0x71, 0x26, 0x11, 0x0f, 0x8d, 0xb1, 0xbf,
+- 0x53, 0x09, 0x15, 0xa7, 0x47, 0xfa, 0x42, 0x87, 0xec, 0xbe, 0x5f, 0x45,
+- 0xef, 0x51, 0xb9, 0x0f, 0xd9, 0x8e, 0x0d, 0x89, 0xf3, 0x8c, 0xbb, 0xd2,
+- 0x96, 0xac, 0x05, 0xe8, 0xb9, 0x8d, 0xcc, 0x9f, 0x55, 0x47, 0x10, 0xb7,
+- 0x30, 0xde, 0x3d, 0x97, 0xe8, 0x86, 0x6b, 0xb1, 0xde, 0xf5, 0x2d, 0x72,
+- 0x96, 0xaa, 0x88, 0x1e, 0x7c, 0x4b, 0xe9, 0x20, 0x37, 0x74, 0x63, 0x32,
+- 0x21, 0x7e, 0x21, 0xef, 0xac, 0xf9, 0x34, 0x8e, 0x91, 0x23, 0x3f, 0x9b,
+- 0xd0, 0x70, 0xbe, 0xd9, 0x83, 0x0c, 0x39, 0xf3, 0x77, 0x12, 0x6e, 0x7c,
+- 0x95, 0x9c, 0xf9, 0x91, 0x11, 0x59, 0xb3, 0x6c, 0x45, 0x4b, 0x42, 0xd6,
+- 0xab, 0xc9, 0x03, 0xc7, 0xbc, 0xb4, 0x6d, 0xcb, 0xea, 0x35, 0x67, 0xd3,
+- 0x9f, 0xce, 0xb2, 0x4f, 0x59, 0xe7, 0x8c, 0x62, 0x35, 0x79, 0xd0, 0x23,
+- 0x63, 0x3e, 0x3c, 0xcf, 0x5c, 0x21, 0xc9, 0x7a, 0xcf, 0x25, 0xfc, 0x18,
+- 0xc8, 0xf8, 0xf0, 0x14, 0x73, 0x86, 0x9d, 0x3c, 0x97, 0xf7, 0x1f, 0x95,
+- 0x18, 0x41, 0xf2, 0xf2, 0x93, 0xa8, 0x18, 0xb8, 0x02, 0x9b, 0xd7, 0x3e,
+- 0x0a, 0x75, 0xe0, 0x04, 0x8f, 0x6b, 0xc9, 0x21, 0xae, 0x45, 0x6a, 0x24,
+- 0x82, 0xd4, 0xd8, 0x8b, 0xe8, 0x1f, 0x91, 0x71, 0xc9, 0x7b, 0x6c, 0x64,
+- 0x0f, 0x12, 0xb9, 0xe7, 0x80, 0x17, 0xe9, 0x31, 0xe9, 0xa7, 0x96, 0x7d,
+- 0xff, 0xb9, 0xed, 0xff, 0xab, 0xb5, 0xf9, 0x13, 0xd2, 0xf6, 0xa3, 0x7f,
+- 0xa4, 0x7d, 0xd1, 0x95, 0xac, 0xbd, 0xb4, 0x17, 0xd6, 0x5e, 0xdc, 0x6c,
+- 0xd3, 0x03, 0x47, 0x24, 0xb7, 0xb6, 0x12, 0x7a, 0x74, 0xb7, 0x62, 0xb4,
+- 0x55, 0x28, 0xe7, 0xb1, 0x3b, 0x2b, 0xef, 0x45, 0x28, 0xc5, 0x53, 0xc4,
+- 0x6b, 0x57, 0x48, 0xd7, 0xbe, 0x45, 0xdb, 0x59, 0x4e, 0x8c, 0x7b, 0xd5,
+- 0xbc, 0x1a, 0x71, 0x4d, 0xf4, 0x57, 0x8a, 0x17, 0x06, 0xdd, 0xc4, 0xa6,
+- 0x08, 0xf2, 0xcf, 0xc8, 0x79, 0xf0, 0x83, 0x84, 0x97, 0xf3, 0xd5, 0x98,
+- 0x33, 0x1c, 0x0d, 0xf2, 0x0c, 0x9e, 0x7d, 0xed, 0x54, 0x62, 0x23, 0x0e,
+- 0x51, 0xde, 0xe7, 0x12, 0x17, 0x39, 0x3f, 0x9d, 0xd4, 0xbf, 0xe8, 0x3b,
+- 0x5e, 0xd0, 0x75, 0x1f, 0x75, 0x5d, 0x87, 0x67, 0x12, 0x5f, 0xc4, 0x23,
+- 0x94, 0xff, 0xe1, 0x41, 0x23, 0x3a, 0x5f, 0x39, 0x49, 0xfc, 0x2e, 0xc5,
+- 0x69, 0xb6, 0x7d, 0x07, 0x33, 0xf7, 0x29, 0xe9, 0x2b, 0x25, 0xeb, 0xa5,
+- 0x0a, 0xde, 0x5a, 0x72, 0x12, 0x13, 0xfc, 0xef, 0x07, 0x83, 0xf2, 0x1c,
+- 0x5a, 0x35, 0xfb, 0x10, 0xfd, 0xf8, 0xed, 0xdc, 0xa4, 0x87, 0xbc, 0x6b,
+- 0x55, 0xf3, 0x49, 0xec, 0x4a, 0xcb, 0xb5, 0xf5, 0xe8, 0x1f, 0xbc, 0x00,
+- 0x47, 0xa8, 0x04, 0x77, 0x78, 0x9b, 0x69, 0xeb, 0x39, 0xec, 0xce, 0x34,
+- 0xcf, 0xc8, 0x73, 0xe2, 0xaa, 0x19, 0xf2, 0x4c, 0xd6, 0xa9, 0x44, 0x29,
+- 0xbe, 0xc3, 0x3a, 0x9b, 0x89, 0x15, 0xf9, 0x7b, 0x38, 0xe4, 0xfe, 0xc4,
+- 0xfa, 0x0c, 0xfb, 0x48, 0xd8, 0x6d, 0xcc, 0x50, 0x0e, 0xd0, 0x0f, 0xab,
+- 0x17, 0xcf, 0x50, 0x52, 0x69, 0xc9, 0x35, 0x5e, 0xc4, 0x13, 0x0f, 0xe4,
+- 0x75, 0x78, 0xc8, 0xdc, 0x88, 0x74, 0xa6, 0xba, 0xd0, 0xde, 0x4b, 0x85,
+- 0x7b, 0x6d, 0xf2, 0x3c, 0x88, 0x51, 0x78, 0x17, 0xc0, 0xe5, 0x7b, 0x6c,
+- 0xdf, 0xc8, 0x56, 0x91, 0xcf, 0x97, 0xd3, 0xd6, 0x4a, 0x62, 0x5e, 0xc6,
+- 0xf9, 0x8d, 0x8b, 0x34, 0xec, 0x5d, 0xfa, 0xd9, 0x5a, 0x54, 0x69, 0xce,
+- 0x5f, 0x35, 0xbf, 0xc8, 0x7e, 0xaa, 0x62, 0x35, 0x91, 0x47, 0xec, 0x7d,
+- 0x59, 0xa1, 0xa5, 0x33, 0x19, 0xe7, 0xe4, 0x5e, 0x75, 0x0c, 0xaf, 0x27,
+- 0x6a, 0x63, 0xb5, 0x91, 0x6a, 0xe6, 0xf6, 0x17, 0x30, 0x30, 0xea, 0x44,
+- 0x15, 0x79, 0x7c, 0x65, 0xb2, 0x16, 0x6e, 0x7b, 0x5d, 0xf1, 0x0a, 0xf2,
+- 0xa7, 0xb9, 0xe4, 0x48, 0x75, 0xa8, 0x26, 0x4f, 0xf2, 0x84, 0x2c, 0xeb,
+- 0xa7, 0x8b, 0x2d, 0xeb, 0x4a, 0x1e, 0x65, 0x3c, 0xce, 0x85, 0xc4, 0x4f,
+- 0xa3, 0x68, 0xb4, 0xfd, 0xd5, 0x40, 0x93, 0xfd, 0xdd, 0x4a, 0x5f, 0xef,
+- 0x0a, 0x2d, 0x9c, 0xf8, 0x62, 0xa8, 0x61, 0x62, 0x26, 0xd4, 0xe1, 0x59,
+- 0x70, 0xb0, 0xad, 0x8f, 0x2f, 0xb5, 0xd0, 0x6a, 0xca, 0xfb, 0x04, 0x84,
+- 0xa7, 0x6d, 0x24, 0x4f, 0xeb, 0x0f, 0x19, 0x13, 0x8f, 0xe2, 0x7a, 0xc6,
+- 0x5d, 0xf7, 0xb0, 0x8f, 0xfd, 0x48, 0xce, 0xef, 0xcc, 0xcd, 0x23, 0xff,
+- 0xbf, 0x7a, 0xb1, 0x70, 0xb6, 0x0e, 0x79, 0x97, 0x08, 0x3a, 0x26, 0x4e,
+- 0xe2, 0x26, 0x96, 0xf1, 0x0c, 0xbf, 0x84, 0x64, 0xf6, 0x47, 0x18, 0xc8,
+- 0x4a, 0x3c, 0xc9, 0xe1, 0x06, 0xb6, 0x5d, 0x3e, 0xdc, 0x46, 0xae, 0xba,
+- 0x06, 0x9b, 0x27, 0x2c, 0xac, 0x0a, 0x4d, 0x62, 0xd5, 0x04, 0x39, 0xf0,
+- 0x44, 0xd1, 0x5f, 0x85, 0xbf, 0xad, 0x81, 0x3c, 0x7f, 0xe6, 0x26, 0xb6,
+- 0xc8, 0xda, 0x9e, 0x4a, 0x3f, 0x6c, 0xa1, 0x7d, 0x3f, 0x9e, 0x8a, 0x63,
+- 0xc3, 0x84, 0x60, 0xee, 0x7d, 0xe8, 0x9d, 0x90, 0xb5, 0xe2, 0xaf, 0x84,
+- 0xe6, 0x4f, 0xfc, 0x08, 0x2d, 0x13, 0xe9, 0xd0, 0x82, 0x89, 0x31, 0xca,
+- 0x9d, 0xa0, 0x6c, 0x83, 0xa1, 0xfa, 0x89, 0x91, 0x50, 0x70, 0xe2, 0x40,
+- 0x28, 0x30, 0xd1, 0x8e, 0x9d, 0x13, 0xeb, 0xb0, 0x63, 0x62, 0x1b, 0xb6,
+- 0x4f, 0x08, 0x6e, 0x4f, 0x61, 0xe5, 0xc4, 0xab, 0x58, 0x31, 0xf1, 0x2c,
+- 0x5a, 0x27, 0xce, 0x62, 0xf9, 0xc4, 0x8b, 0x68, 0x9b, 0x78, 0x89, 0x63,
+- 0x91, 0xb5, 0x67, 0x59, 0x77, 0x2e, 0xde, 0xe7, 0x9b, 0xbe, 0x97, 0x5a,
+- 0xd6, 0x56, 0xe4, 0x59, 0x30, 0x99, 0x43, 0x17, 0xd6, 0x6a, 0xe7, 0xd0,
+- 0xb7, 0x5f, 0xde, 0xb5, 0xd6, 0xa8, 0xf5, 0x42, 0xee, 0xe1, 0xbe, 0x28,
+- 0xcf, 0x06, 0xd0, 0xc6, 0xa6, 0xef, 0x1b, 0xd6, 0xb5, 0xa9, 0x4b, 0xf7,
+- 0x3c, 0xe5, 0x99, 0x2c, 0x89, 0x3d, 0xe7, 0xd1, 0x93, 0xfd, 0x8d, 0x15,
+- 0xd5, 0xa4, 0xac, 0x3c, 0x2b, 0x26, 0xf6, 0x70, 0x0e, 0x0f, 0xed, 0x3f,
+- 0x4f, 0x0e, 0x35, 0x69, 0xaf, 0x1d, 0xbd, 0xbd, 0x40, 0xde, 0xd3, 0xe3,
+- 0x27, 0x36, 0x9d, 0x43, 0xea, 0x28, 0x30, 0x71, 0x50, 0xfc, 0x70, 0x23,
+- 0xfd, 0x70, 0x52, 0x7c, 0x32, 0x4e, 0x4c, 0xbe, 0xcd, 0x83, 0xfb, 0xc8,
+- 0x93, 0x4a, 0x90, 0x1b, 0x2b, 0xc7, 0xd3, 0x23, 0x71, 0x6b, 0x9e, 0x21,
+- 0xef, 0x2e, 0x31, 0x72, 0x57, 0x32, 0xee, 0xbf, 0xc4, 0x6b, 0x93, 0x83,
+- 0xf0, 0xfb, 0x8c, 0x80, 0x6f, 0x1e, 0xcf, 0x4f, 0xa7, 0x27, 0xc9, 0x71,
+- 0xba, 0x30, 0xc5, 0x6f, 0xc9, 0x89, 0x81, 0x5e, 0xa4, 0xd3, 0xa2, 0xcf,
+- 0x76, 0xea, 0x53, 0x70, 0x51, 0xef, 0x6a, 0x25, 0x1e, 0x5a, 0x8a, 0xe0,
+- 0xa1, 0x8a, 0x8a, 0x7d, 0xc2, 0x25, 0xec, 0x77, 0x9f, 0x98, 0x03, 0xca,
+- 0x8b, 0xf8, 0x0e, 0x73, 0x98, 0xf2, 0x7d, 0xe4, 0x43, 0xc4, 0xca, 0xaa,
+- 0x88, 0x62, 0xac, 0x0a, 0x9c, 0xc3, 0xd3, 0x63, 0x4e, 0xb8, 0x93, 0x4e,
+- 0x4c, 0x12, 0x27, 0x1d, 0x49, 0xd9, 0x3f, 0xa0, 0x51, 0x16, 0x59, 0xa7,
+- 0x3a, 0x8b, 0x9c, 0x7d, 0x7f, 0x4f, 0xee, 0xcf, 0x7c, 0xd7, 0xee, 0xc7,
+- 0x49, 0xd9, 0xfb, 0x88, 0xa5, 0x3d, 0xa9, 0xef, 0xa1, 0x35, 0xed, 0xb1,
+- 0x9f, 0xf3, 0xdb, 0x9d, 0x7a, 0x15, 0xa9, 0xfd, 0x75, 0xb8, 0xdd, 0x7e,
+- 0xd6, 0xcf, 0x84, 0x46, 0xbd, 0xdd, 0x32, 0x6e, 0x22, 0x7a, 0x78, 0x1d,
+- 0xd6, 0x1e, 0xfe, 0x24, 0x8f, 0x59, 0xb8, 0xe9, 0x70, 0x27, 0x6e, 0x1c,
+- 0x8f, 0xa3, 0x63, 0xbc, 0x8f, 0xc7, 0x7a, 0x7c, 0x6c, 0xa8, 0x1a, 0x99,
+- 0x90, 0xc6, 0x1c, 0x7f, 0x3d, 0x73, 0x7c, 0xe1, 0x67, 0x1b, 0xf0, 0x34,
+- 0x71, 0x27, 0x18, 0xda, 0x80, 0x49, 0xdb, 0x17, 0x65, 0x8f, 0xe5, 0x06,
+- 0x6c, 0x67, 0xfe, 0x3e, 0x8a, 0x0d, 0xe8, 0xe1, 0xb5, 0x21, 0x7b, 0x0e,
+- 0x4e, 0x62, 0x19, 0xf3, 0xb3, 0x77, 0xae, 0x39, 0x89, 0x0f, 0x1f, 0x92,
+- 0xbe, 0x2f, 0x20, 0xb5, 0x77, 0x23, 0xdb, 0xcc, 0xa1, 0x7d, 0xfc, 0x9f,
+- 0x71, 0xe3, 0x10, 0xee, 0xac, 0x46, 0x35, 0x9e, 0x0d, 0x05, 0x3a, 0x06,
+- 0x94, 0x7f, 0xb6, 0xdb, 0xde, 0x9e, 0xfa, 0x11, 0x76, 0xa5, 0xce, 0xe3,
+- 0xe1, 0xcc, 0x4b, 0xe8, 0x4f, 0x4d, 0x9f, 0x53, 0x99, 0xcb, 0x37, 0x19,
+- 0x0f, 0xbe, 0x8f, 0x23, 0x63, 0x53, 0xc4, 0xde, 0x57, 0x78, 0xbc, 0xff,
+- 0x7e, 0x7a, 0xfe, 0x39, 0xdc, 0xbc, 0xdd, 0x48, 0x3e, 0x55, 0xe4, 0x6f,
+- 0x71, 0xab, 0xda, 0xc8, 0xed, 0x9a, 0x03, 0x7d, 0x5b, 0x58, 0x95, 0xfb,
+- 0x81, 0x46, 0xec, 0x05, 0x45, 0x6f, 0xff, 0x96, 0xe2, 0x61, 0xae, 0x21,
+- 0xcf, 0x45, 0xea, 0xd1, 0x1b, 0xa8, 0xef, 0xb2, 0x07, 0xbe, 0x0f, 0xe7,
+- 0x03, 0x4e, 0x94, 0x26, 0x65, 0x2d, 0x47, 0xde, 0x2b, 0x23, 0xef, 0x30,
+- 0xc9, 0xe9, 0xa5, 0xf2, 0xae, 0x89, 0xe4, 0x24, 0x63, 0x7f, 0x6e, 0x61,
+- 0x09, 0xe4, 0x39, 0xec, 0xeb, 0xb0, 0x71, 0x30, 0x8a, 0x1e, 0x53, 0x9e,
+- 0x31, 0xca, 0x8f, 0x7f, 0x5e, 0xf3, 0xf7, 0xd1, 0xcb, 0xf8, 0xb3, 0x9e,
+- 0x98, 0x78, 0xbb, 0x7d, 0x6f, 0xf6, 0xfb, 0xe8, 0x1b, 0xf9, 0x47, 0xb7,
+- 0xf0, 0x9d, 0x3e, 0x53, 0x9e, 0xe3, 0xd6, 0xcd, 0xf7, 0xbe, 0xc3, 0x66,
+- 0xbe, 0xec, 0x69, 0xa3, 0x4d, 0xe4, 0x16, 0xba, 0xb0, 0xbd, 0x36, 0xff,
+- 0x1e, 0x95, 0x0f, 0x7a, 0xe7, 0xd0, 0x5f, 0xda, 0xef, 0x1c, 0x92, 0xfb,
+- 0xfa, 0xf2, 0xbe, 0xaa, 0x27, 0x12, 0xf2, 0x1e, 0x09, 0x75, 0x99, 0x0b,
+- 0xaa, 0xd7, 0x45, 0x5e, 0xf8, 0xaa, 0x39, 0x13, 0xbd, 0x5e, 0x0b, 0xd7,
+- 0x53, 0x96, 0x63, 0x4d, 0x1f, 0x63, 0xe6, 0x12, 0xef, 0x70, 0xd9, 0xef,
+- 0x26, 0x39, 0xff, 0xa9, 0x7f, 0xff, 0x6e, 0x92, 0x37, 0x89, 0x93, 0x0a,
+- 0x2a, 0x8d, 0x5b, 0xf0, 0x9c, 0x1d, 0x13, 0x14, 0x54, 0x34, 0xc8, 0xba,
+- 0xa8, 0x1f, 0xcf, 0x18, 0x8d, 0xfe, 0x1a, 0xb9, 0xdf, 0xa5, 0x9c, 0xb3,
+- 0xe2, 0xde, 0x3a, 0xc6, 0x97, 0xff, 0x68, 0x2f, 0xfe, 0xf3, 0xd8, 0xb9,
+- 0x37, 0x4c, 0xce, 0xe8, 0x95, 0x67, 0x23, 0x67, 0x14, 0x9f, 0xc5, 0xdc,
+- 0x91, 0x92, 0x3d, 0xec, 0x0c, 0x8a, 0xe5, 0x6f, 0xd2, 0xcf, 0xde, 0x94,
+- 0x3d, 0x58, 0xe4, 0x3c, 0x7f, 0x85, 0x60, 0xcd, 0x8c, 0xfc, 0x73, 0x52,
+- 0xf6, 0x5e, 0x5f, 0x59, 0x0f, 0xd8, 0x5e, 0x78, 0xef, 0xa2, 0x94, 0x95,
+- 0x7a, 0x6f, 0xda, 0x6b, 0xc2, 0x2e, 0xe3, 0x37, 0xd6, 0x6b, 0xde, 0x5a,
+- 0x96, 0xfd, 0x45, 0xe1, 0xff, 0xf3, 0xe2, 0x33, 0x66, 0x14, 0x72, 0x4d,
+- 0xea, 0x88, 0xae, 0x2e, 0xd7, 0xe9, 0x4d, 0x39, 0x88, 0x7b, 0x67, 0xad,
+- 0x6e, 0xaf, 0x8c, 0x61, 0xec, 0x7d, 0x75, 0x54, 0xfb, 0x1d, 0x84, 0x79,
+- 0xfd, 0x8a, 0x3c, 0xff, 0xbe, 0x4f, 0x59, 0x3f, 0x2e, 0x31, 0x2a, 0x70,
+- 0xae, 0x26, 0xbf, 0xae, 0x73, 0x59, 0xc6, 0x47, 0xbc, 0xb2, 0xef, 0xaf,
+- 0xd4, 0x3e, 0xb7, 0xfb, 0x35, 0x2f, 0xd7, 0xfb, 0x46, 0x61, 0xbc, 0xb5,
+- 0xf6, 0xb3, 0x4a, 0x0f, 0xda, 0xbc, 0xc6, 0x31, 0x6d, 0xdc, 0xcb, 0xbc,
+- 0xef, 0xed, 0x67, 0xa4, 0xd0, 0xaf, 0x6a, 0x3f, 0xef, 0x75, 0xb9, 0x0f,
+- 0x91, 0xeb, 0xa9, 0x42, 0x1d, 0x3d, 0x1c, 0xb5, 0xfb, 0x57, 0x99, 0xbf,
+- 0x15, 0xfb, 0xa4, 0x3f, 0x2d, 0x2e, 0xb6, 0x31, 0x29, 0xf6, 0xd5, 0x5d,
+- 0xca, 0xd8, 0x74, 0xae, 0xf9, 0x3e, 0x6c, 0x4f, 0x88, 0x9e, 0xe5, 0x1d,
+- 0x95, 0xc4, 0x60, 0x9b, 0x6b, 0xb9, 0xe8, 0x6f, 0x4b, 0x91, 0xd6, 0xe2,
+- 0x38, 0xd4, 0x24, 0xcf, 0xe6, 0xb9, 0x68, 0xd3, 0x71, 0x94, 0x91, 0xdb,
+- 0x46, 0x79, 0x4d, 0xf6, 0xb4, 0x1c, 0x31, 0xf5, 0xe8, 0x13, 0xf8, 0x12,
+- 0x1c, 0x57, 0xd9, 0xeb, 0x5f, 0x6d, 0x69, 0xc8, 0x75, 0x93, 0xb9, 0xc9,
+- 0xf4, 0x15, 0x83, 0x32, 0xda, 0x8e, 0xbd, 0x17, 0xdb, 0x94, 0x67, 0xf7,
+- 0x06, 0x12, 0xf2, 0x0c, 0x59, 0x63, 0x8c, 0xfc, 0x10, 0xcf, 0x65, 0x64,
+- 0xff, 0xc3, 0x6f, 0xad, 0xf8, 0x4c, 0xd9, 0x67, 0x39, 0xbd, 0x4e, 0x09,
+- 0x71, 0x29, 0x10, 0xae, 0x52, 0x8a, 0xcf, 0x91, 0x5d, 0xfe, 0xdc, 0x44,
+- 0x9b, 0x39, 0x6f, 0x3f, 0xfb, 0x27, 0x67, 0x11, 0xb4, 0xa4, 0xe4, 0x5d,
+- 0x8c, 0xfa, 0xe4, 0x2a, 0x34, 0xe6, 0xea, 0x1d, 0xce, 0x02, 0xff, 0x08,
+- 0x63, 0x0d, 0xed, 0x66, 0x47, 0x20, 0x6c, 0x3f, 0xe3, 0x26, 0xef, 0xdc,
+- 0x78, 0x18, 0x7a, 0xe7, 0x1b, 0x2c, 0xff, 0xb1, 0xec, 0xf3, 0x56, 0xda,
+- 0x2b, 0x63, 0x2a, 0xfa, 0xb8, 0xbc, 0xdb, 0x87, 0x7a, 0x8c, 0x88, 0x7f,
+- 0x78, 0x50, 0x13, 0x09, 0xd3, 0x0f, 0x25, 0x7e, 0xcb, 0xf3, 0x71, 0xfa,
+- 0x01, 0xc9, 0xab, 0x5a, 0xb2, 0xf2, 0xfc, 0xb7, 0xec, 0x9b, 0xd6, 0xfd,
+- 0x6b, 0x1d, 0xc1, 0xc2, 0xfe, 0xe5, 0x62, 0xbc, 0xb7, 0xbc, 0x85, 0xbd,
+- 0xd5, 0xee, 0x79, 0x8c, 0x6f, 0x96, 0xbd, 0x6f, 0x60, 0xa3, 0x8d, 0x0d,
+- 0x9a, 0xa1, 0x1f, 0xfb, 0xa5, 0xa3, 0x1b, 0x8f, 0x2d, 0x32, 0xba, 0x8e,
+- 0xab, 0xb9, 0xb4, 0x8f, 0x38, 0x71, 0xad, 0x23, 0x3a, 0xc4, 0x6f, 0xff,
+- 0x77, 0x89, 0xcd, 0x37, 0xd9, 0x75, 0xf5, 0xe0, 0x3a, 0xb5, 0xf8, 0x6c,
+- 0xb5, 0x3c, 0x73, 0xa1, 0x77, 0x7c, 0x43, 0xe9, 0xc6, 0xd6, 0x90, 0xd1,
+- 0xbe, 0x4d, 0xd1, 0xdb, 0xbe, 0xac, 0xe8, 0xfe, 0x90, 0x22, 0xe5, 0xec,
+- 0x77, 0xe8, 0x5c, 0x8a, 0x9d, 0x2e, 0xf6, 0x71, 0x38, 0xa1, 0x87, 0x67,
+- 0xb0, 0xec, 0x39, 0xd3, 0xf0, 0x5d, 0x60, 0x9b, 0x3f, 0xe4, 0x31, 0x84,
+- 0x20, 0x96, 0xdb, 0xed, 0x46, 0x17, 0xba, 0xec, 0xf7, 0xa4, 0x76, 0x30,
+- 0x26, 0xc8, 0xfb, 0xb0, 0x62, 0xd0, 0x92, 0x75, 0x34, 0x31, 0xbd, 0xff,
+- 0x66, 0x48, 0x4e, 0xdd, 0xc3, 0x80, 0xed, 0x81, 0x37, 0xd2, 0x8d, 0x86,
+- 0x45, 0x86, 0x6f, 0x89, 0x6a, 0xd7, 0x0f, 0xca, 0xfb, 0x81, 0x96, 0x73,
+- 0x9c, 0x23, 0x90, 0x36, 0x72, 0x96, 0xd6, 0x50, 0x6d, 0xd7, 0x59, 0xa4,
+- 0x7e, 0x14, 0xae, 0x0f, 0xfd, 0xca, 0x4a, 0x6b, 0xd0, 0x6a, 0x0d, 0xa9,
+- 0x13, 0x1f, 0xd2, 0xf0, 0x1f, 0xd5, 0x13, 0x5c, 0xf9, 0xa5, 0x85, 0x59,
+- 0x52, 0x4f, 0xf6, 0xac, 0x7d, 0x1a, 0x77, 0x0d, 0xc8, 0x7b, 0x22, 0xc4,
+- 0x1f, 0xf5, 0xe8, 0x17, 0xc8, 0x35, 0xcb, 0xed, 0xf7, 0x6f, 0x49, 0x2c,
+- 0x59, 0x4f, 0x3c, 0xeb, 0x86, 0x16, 0xd2, 0xfb, 0xaf, 0x50, 0xe5, 0x1d,
+- 0x43, 0x8f, 0xc9, 0xbe, 0x9d, 0x03, 0x0b, 0xd4, 0xfc, 0xfe, 0x9e, 0xd8,
+- 0x1f, 0x7d, 0x5f, 0x11, 0xfb, 0x2a, 0x97, 0xf7, 0x15, 0xd5, 0xd9, 0xcf,
+- 0xa7, 0xac, 0x4f, 0x38, 0x0a, 0xfb, 0x15, 0x2f, 0xbf, 0xc7, 0x73, 0x23,
+- 0x79, 0xfd, 0x26, 0x79, 0x67, 0x1f, 0xc7, 0xba, 0x39, 0x21, 0x4b, 0x5a,
+- 0xff, 0x0f, 0xdd, 0x0f, 0x6b, 0xf2, 0xd0, 0x56, 0x00, 0x00, 0x00 };
++ 0x9d, 0xbc, 0x0d, 0x78, 0x1b, 0xe5, 0x95, 0x36, 0x7c, 0xcf, 0x48, 0xb2,
++ 0x65, 0x5b, 0xb6, 0xc7, 0x8e, 0x9c, 0x28, 0x6c, 0x9a, 0x68, 0xf0, 0x28,
++ 0x51, 0xb0, 0x69, 0x47, 0x89, 0x03, 0x82, 0x55, 0x89, 0xea, 0x98, 0xc4,
++ 0x81, 0x50, 0x9c, 0x12, 0x5a, 0xb3, 0x4b, 0x5b, 0xe1, 0xfc, 0x60, 0x42,
++ 0xa0, 0xa1, 0xb0, 0xef, 0x9a, 0xef, 0x65, 0x5f, 0xab, 0xb6, 0x93, 0x38,
++ 0x89, 0x2c, 0x39, 0x8e, 0x21, 0x61, 0xbf, 0x5e, 0x8b, 0x89, 0x9d, 0x38,
++ 0x80, 0x6c, 0x85, 0x36, 0xdd, 0x0d, 0x7d, 0xd3, 0x8d, 0x36, 0x09, 0x60,
++ 0xfe, 0xda, 0x40, 0xbb, 0x2c, 0xed, 0xcb, 0x07, 0xde, 0x14, 0x42, 0xd8,
++ 0xb6, 0x40, 0xb7, 0x3f, 0x1b, 0x5a, 0xca, 0xbc, 0xf7, 0x19, 0x49, 0x89,
++ 0x13, 0x28, 0xed, 0x7e, 0xbe, 0xae, 0xb9, 0xac, 0x99, 0x79, 0x7e, 0xce,
++ 0x73, 0x9e, 0x73, 0xee, 0x73, 0x9f, 0x67, 0x9e, 0x19, 0x3f, 0x50, 0x8a,
++ 0xfc, 0x5f, 0x39, 0x8f, 0x4f, 0x37, 0x6c, 0x5c, 0xbd, 0x60, 0xc1, 0xa7,
++ 0x1b, 0xe4, 0xdc, 0x39, 0xdd, 0xe9, 0xc4, 0x9f, 0xf9, 0xe7, 0xff, 0x73,
++ 0x0b, 0x7e, 0xcc, 0x9f, 0x03, 0xd0, 0x0a, 0xfd, 0xcb, 0x01, 0xb7, 0x1a,
++ 0x71, 0xde, 0xdc, 0x68, 0xc0, 0xed, 0x88, 0x4c, 0xb4, 0xad, 0x36, 0x80,
++ 0x68, 0xba, 0xce, 0xbf, 0x04, 0x7f, 0xb0, 0xe2, 0x5e, 0x27, 0xe4, 0xfa,
++ 0xa7, 0x22, 0x1f, 0x74, 0x7e, 0xef, 0x72, 0xfd, 0xbd, 0x21, 0x07, 0xdc,
++ 0x5a, 0x24, 0x0e, 0x6d, 0x2e, 0xdc, 0xb3, 0x58, 0xe7, 0x9b, 0xf3, 0xbe,
++ 0xa9, 0xa0, 0xa2, 0xd0, 0xd6, 0x69, 0xeb, 0x7b, 0xf3, 0x7c, 0xb1, 0x92,
++ 0x88, 0x86, 0x23, 0x19, 0xb4, 0xd4, 0xf7, 0x75, 0x5a, 0xe5, 0x46, 0x08,
++ 0x6e, 0xc3, 0x68, 0xed, 0x53, 0x3c, 0xe1, 0xf5, 0x8b, 0xe0, 0x29, 0x36,
++ 0x10, 0xbf, 0x28, 0x82, 0x96, 0x4b, 0xc6, 0x4a, 0xe3, 0xce, 0x88, 0x1b,
++ 0xcd, 0x19, 0x77, 0xfc, 0x2f, 0x22, 0x06, 0x96, 0x65, 0x66, 0x95, 0xa2,
++ 0xc2, 0x8d, 0x9e, 0xcc, 0xeb, 0x25, 0xb9, 0xf6, 0xea, 0xf3, 0xff, 0x83,
++ 0xd3, 0x72, 0xff, 0xa7, 0xc7, 0x9c, 0x11, 0x60, 0x53, 0xc2, 0xb2, 0x8a,
++ 0x22, 0x37, 0xdc, 0xa0, 0x46, 0x0c, 0xdf, 0x3e, 0x2c, 0x46, 0x9b, 0x86,
++ 0xfb, 0x36, 0x37, 0xfc, 0xa7, 0x72, 0x74, 0x90, 0x0d, 0x8f, 0x3a, 0x10,
++ 0xd5, 0x8e, 0xf3, 0xff, 0xec, 0xd9, 0xad, 0x61, 0x03, 0xbb, 0x47, 0xcf,
++ 0xf0, 0xba, 0xd3, 0xbe, 0xd6, 0xbd, 0x6b, 0xf6, 0xec, 0x9b, 0xc2, 0xc7,
++ 0xf1, 0xe0, 0xa8, 0xfc, 0xbe, 0x15, 0x9d, 0xf5, 0x0a, 0x26, 0x6f, 0x58,
++ 0x07, 0x87, 0x61, 0xa0, 0x67, 0x97, 0xe2, 0xec, 0xaa, 0x57, 0x11, 0xf5,
++ 0xea, 0xc1, 0x18, 0x27, 0xc1, 0x69, 0x20, 0x56, 0x1c, 0x09, 0x3b, 0xdf,
++ 0x4e, 0x44, 0x34, 0x87, 0x61, 0x59, 0xc1, 0xd0, 0x0c, 0x38, 0xaa, 0x2c,
++ 0xeb, 0x09, 0xd3, 0x03, 0xff, 0x97, 0x9e, 0x42, 0x7c, 0xb8, 0x05, 0xaa,
++ 0xf1, 0x14, 0xba, 0x86, 0x9f, 0xc2, 0x43, 0x3b, 0x4b, 0x31, 0x39, 0x8d,
++ 0xe3, 0x4d, 0xf9, 0xf0, 0xbd, 0x79, 0xd2, 0xb7, 0xc8, 0x51, 0xcf, 0xc3,
++ 0x8d, 0x49, 0xc7, 0x6b, 0xfc, 0x2f, 0x65, 0xce, 0x58, 0x93, 0x33, 0xce,
++ 0x95, 0xd9, 0xc4, 0x32, 0x3d, 0x17, 0x94, 0x89, 0x0f, 0x47, 0xf0, 0x5c,
++ 0x42, 0xc1, 0xfa, 0x50, 0x05, 0xa2, 0x55, 0x32, 0x5e, 0xcb, 0x1a, 0x35,
++ 0x4f, 0x59, 0x93, 0x9a, 0xf4, 0x35, 0x81, 0xe7, 0x79, 0x6f, 0x73, 0xe8,
++ 0x0d, 0x2b, 0xeb, 0x95, 0xf6, 0xbe, 0x4e, 0x1b, 0x5a, 0xc9, 0xeb, 0x4e,
++ 0xa4, 0x12, 0x88, 0x55, 0x44, 0x6e, 0xe4, 0xb9, 0x6e, 0xbe, 0xa3, 0xb8,
++ 0xdd, 0xef, 0x26, 0xdc, 0x5f, 0x2a, 0x37, 0xd4, 0x7b, 0x2a, 0xe1, 0xc4,
++ 0x0b, 0x94, 0xf9, 0x90, 0xb9, 0x0e, 0x2e, 0xe3, 0x6e, 0xb1, 0x39, 0x8e,
++ 0xeb, 0x47, 0x16, 0x66, 0x14, 0xea, 0x4b, 0xbb, 0x6e, 0x6c, 0x4e, 0x59,
++ 0xd6, 0x56, 0x33, 0x7a, 0x45, 0x09, 0x0d, 0xe2, 0x58, 0xa2, 0x05, 0xee,
++ 0x48, 0xc0, 0x7f, 0x1a, 0x61, 0x2c, 0xc9, 0x78, 0xf1, 0x64, 0x02, 0xce,
++ 0xc6, 0x79, 0x5e, 0x74, 0x65, 0x22, 0xb8, 0x3a, 0x63, 0xa2, 0x29, 0xf3,
++ 0xa7, 0x2d, 0xeb, 0xda, 0x94, 0x9f, 0x63, 0xf8, 0x83, 0x95, 0x1b, 0x83,
++ 0x8c, 0x2f, 0xf7, 0xbf, 0x27, 0x75, 0x11, 0xb6, 0x71, 0x8e, 0xb6, 0x70,
++ 0xfe, 0x96, 0x87, 0xb2, 0xd1, 0x12, 0xe8, 0xe6, 0x69, 0x44, 0xb0, 0x34,
++ 0x63, 0x70, 0x4e, 0x23, 0x58, 0x92, 0xaa, 0xd5, 0x86, 0x31, 0x1f, 0x51,
++ 0x5f, 0xce, 0xb6, 0xb7, 0x73, 0xbc, 0x6d, 0x81, 0x16, 0x94, 0xd3, 0x46,
++ 0xd2, 0x8b, 0xc2, 0x68, 0x64, 0xff, 0x2b, 0xfe, 0x8c, 0xfe, 0xaf, 0x67,
++ 0xff, 0xef, 0xb0, 0xff, 0xac, 0xdd, 0x3f, 0x9c, 0xd7, 0xf0, 0xdc, 0x4d,
++ 0x7b, 0xdc, 0x96, 0x76, 0x3a, 0x97, 0xa7, 0xbc, 0xd8, 0x9a, 0x36, 0x69,
++ 0x73, 0x72, 0xcb, 0x87, 0xcd, 0x83, 0xb3, 0xb0, 0x65, 0x50, 0xf7, 0x3d,
++ 0xcd, 0xdf, 0xdd, 0x23, 0x17, 0x61, 0xd3, 0xa0, 0x82, 0x3d, 0xc6, 0x45,
++ 0xe8, 0xe2, 0xef, 0xdd, 0x83, 0xb3, 0xf1, 0xe0, 0xa0, 0x03, 0xe1, 0x69,
++ 0xe7, 0x8f, 0x63, 0xd2, 0x71, 0x11, 0xe2, 0x23, 0x7e, 0x74, 0x25, 0x9e,
++ 0xb7, 0x75, 0x58, 0x1e, 0xf9, 0x5e, 0xc1, 0x9f, 0xe9, 0x3b, 0x7e, 0xac,
++ 0x4e, 0x68, 0xe8, 0x4a, 0x89, 0x1f, 0xb8, 0x69, 0x9b, 0xe2, 0x07, 0xbf,
++ 0x06, 0x2a, 0x34, 0x74, 0x67, 0x0a, 0xf7, 0x15, 0x38, 0x39, 0x6f, 0x6b,
++ 0x34, 0x37, 0xb6, 0xa6, 0xc4, 0x26, 0xa4, 0x4d, 0xb1, 0x0b, 0xf9, 0x5d,
++ 0x4d, 0xbb, 0x2b, 0x85, 0x7f, 0x6f, 0x29, 0x82, 0xf7, 0x6b, 0x78, 0xb3,
++ 0x41, 0xae, 0xd3, 0xde, 0x43, 0x52, 0xa6, 0x1f, 0xfb, 0xd2, 0xe2, 0xa7,
++ 0x7e, 0x34, 0x26, 0x26, 0xd8, 0x7e, 0x03, 0xdb, 0x36, 0xf1, 0xcf, 0x99,
++ 0x7a, 0xfc, 0x53, 0x26, 0x88, 0x7f, 0xa4, 0x1e, 0xbf, 0x93, 0xf1, 0xe3,
++ 0x60, 0x66, 0x16, 0xbe, 0x9d, 0xf1, 0xe1, 0x5b, 0x9c, 0xbf, 0xc7, 0x33,
++ 0x2d, 0xb4, 0x7d, 0x0d, 0x07, 0x32, 0xa2, 0xff, 0x22, 0x8e, 0xb7, 0x14,
++ 0xdd, 0x83, 0xb5, 0xc1, 0x63, 0xb4, 0xad, 0x7f, 0x34, 0xaf, 0x41, 0xb6,
++ 0xba, 0xc1, 0xb6, 0xc9, 0xad, 0xbc, 0xbe, 0x6d, 0xb0, 0x36, 0x7a, 0x89,
++ 0x62, 0x59, 0x6a, 0xa8, 0x2e, 0x7c, 0x54, 0x55, 0x31, 0xe9, 0xd5, 0xfd,
++ 0x59, 0x55, 0xf7, 0x47, 0xe1, 0x42, 0x82, 0xbe, 0x11, 0xaf, 0xd1, 0x87,
++ 0xe2, 0xb4, 0x29, 0xaf, 0x31, 0xcc, 0xf1, 0xe8, 0xfe, 0xb8, 0xea, 0xc6,
++ 0x96, 0x94, 0xbe, 0x3b, 0xae, 0x7a, 0x10, 0xcf, 0x94, 0xe2, 0x17, 0x83,
++ 0x7a, 0x6f, 0x5c, 0xfd, 0x3c, 0xe2, 0xd5, 0x96, 0xf5, 0xad, 0x10, 0x36,
++ 0xce, 0x88, 0x20, 0x5a, 0x13, 0x41, 0x6c, 0x76, 0xc4, 0x8b, 0x54, 0x0a,
++ 0x78, 0xa7, 0xcf, 0xf0, 0xfd, 0x9b, 0xd2, 0x82, 0xbf, 0x69, 0xd1, 0xfd,
++ 0x7e, 0xb5, 0x2e, 0x3e, 0xac, 0x2e, 0xa2, 0x4b, 0xc3, 0xef, 0x8b, 0x2c,
++ 0x43, 0x87, 0x7d, 0x4d, 0x81, 0x66, 0x78, 0xd0, 0x9d, 0xba, 0x02, 0x31,
++ 0x6f, 0x6d, 0xeb, 0x0e, 0xb5, 0xf6, 0x8c, 0xa9, 0xea, 0x13, 0x2d, 0xaa,
++ 0x65, 0xfd, 0x72, 0xe1, 0x3b, 0x96, 0x7f, 0xba, 0x65, 0x2d, 0x58, 0x28,
++ 0x7d, 0xfa, 0x51, 0x15, 0x31, 0xb1, 0xd2, 0x9e, 0xc3, 0x52, 0x9c, 0x1a,
++ 0xac, 0x66, 0x1f, 0x1a, 0xfe, 0xf5, 0x72, 0x3d, 0xb8, 0x4e, 0x2d, 0xc5,
++ 0x9b, 0x23, 0xa5, 0x38, 0xc9, 0xf1, 0xfc, 0xe7, 0xa0, 0x0f, 0xbf, 0x1e,
++ 0xb4, 0xac, 0x2f, 0x99, 0x7f, 0x89, 0x81, 0xea, 0x7e, 0xfc, 0xd3, 0xb8,
++ 0x17, 0xbf, 0xe0, 0xdc, 0xbc, 0x91, 0x88, 0xde, 0x35, 0x0d, 0x7a, 0x74,
++ 0x5c, 0x39, 0xf6, 0xd5, 0x0a, 0xd4, 0xb5, 0x54, 0x28, 0x7a, 0xf3, 0x76,
++ 0xe8, 0xbe, 0x4b, 0x14, 0x2f, 0x4e, 0xa7, 0x35, 0xfc, 0x34, 0x5d, 0x1b,
++ 0xfe, 0x21, 0xfb, 0xfc, 0xad, 0xf9, 0x84, 0x95, 0x9d, 0x2e, 0x7a, 0x13,
++ 0x1d, 0x51, 0xcf, 0x29, 0xea, 0x39, 0x45, 0x3d, 0xa7, 0xa8, 0x67, 0xca,
++ 0x70, 0x30, 0x45, 0x3d, 0x53, 0x77, 0xdf, 0xa2, 0x4d, 0x3d, 0xce, 0x79,
++ 0x3c, 0x60, 0xcf, 0x63, 0x98, 0xf3, 0xf5, 0x17, 0xf8, 0x5f, 0x36, 0xb6,
++ 0x3e, 0x6f, 0xfd, 0xad, 0x57, 0xc6, 0xd4, 0x3d, 0x3d, 0x87, 0x5f, 0x32,
++ 0xb6, 0xe7, 0xac, 0x98, 0x26, 0xe3, 0x92, 0xf1, 0xd9, 0xfa, 0xf3, 0x6f,
++ 0x54, 0xb6, 0x28, 0x28, 0xb5, 0xac, 0x9d, 0x66, 0xfe, 0xbe, 0xb7, 0x30,
++ 0xbe, 0x1b, 0x94, 0x9c, 0x5d, 0xed, 0x74, 0x53, 0xdf, 0xc1, 0xa8, 0xba,
++ 0x8c, 0xe7, 0x7a, 0x3c, 0x8a, 0xb9, 0xc5, 0xe7, 0x9f, 0x5f, 0x5b, 0x23,
++ 0xf3, 0xe1, 0x3f, 0x7b, 0x4e, 0x7b, 0xb4, 0xfb, 0xbb, 0x8d, 0xe7, 0x32,
++ 0x16, 0xb1, 0x45, 0xb1, 0x01, 0x2f, 0xed, 0xe5, 0xf2, 0xfc, 0x3d, 0xc4,
++ 0xd5, 0xc8, 0x46, 0xb4, 0x34, 0x3c, 0x6a, 0xf7, 0x51, 0x94, 0x14, 0xbf,
++ 0x51, 0xf0, 0xce, 0x15, 0x0a, 0x8e, 0x86, 0x0c, 0xda, 0xcc, 0x10, 0x71,
++ 0x01, 0x28, 0x4e, 0xc2, 0xed, 0x89, 0x44, 0x90, 0xe8, 0x83, 0xbb, 0x24,
++ 0x12, 0xc6, 0xfc, 0xbe, 0xda, 0xf6, 0x53, 0xd0, 0x83, 0x7d, 0x8a, 0xde,
++ 0x02, 0xd4, 0x99, 0x63, 0xd4, 0xe3, 0x25, 0x8a, 0xee, 0x2f, 0x52, 0xe0,
++ 0x56, 0x58, 0x2e, 0x90, 0x1e, 0xc2, 0x96, 0x8c, 0xfc, 0x0e, 0xc3, 0x48,
++ 0xff, 0xb6, 0xd0, 0x17, 0xed, 0x7e, 0x23, 0xed, 0xfe, 0x14, 0xc7, 0xae,
++ 0xfb, 0x89, 0xaf, 0x6e, 0x57, 0xa4, 0x1d, 0x7b, 0x13, 0x70, 0x17, 0x45,
++ 0x36, 0xe0, 0xa9, 0x44, 0xf5, 0xf4, 0x42, 0x39, 0x85, 0xe5, 0xfc, 0xe9,
++ 0xa9, 0xb2, 0xbc, 0x66, 0x45, 0xbd, 0x39, 0x59, 0x4a, 0x93, 0x43, 0xd8,
++ 0x9e, 0x92, 0xba, 0x11, 0xbb, 0xae, 0x93, 0x7d, 0xf4, 0x24, 0x6a, 0x9b,
++ 0xaf, 0x55, 0xf4, 0xf0, 0x23, 0xa8, 0x8b, 0xbe, 0xcd, 0x39, 0xec, 0x82,
++ 0x7e, 0xa6, 0x1d, 0x39, 0x59, 0xe6, 0xa5, 0x73, 0x72, 0x2c, 0x4e, 0x43,
++ 0xb9, 0x29, 0x05, 0x8f, 0xcf, 0x98, 0x96, 0xf7, 0x65, 0x28, 0xd7, 0x71,
++ 0xfe, 0x54, 0xc3, 0x8f, 0xeb, 0x68, 0x43, 0x1b, 0x76, 0x5a, 0xe8, 0x0e,
++ 0x55, 0xd3, 0x57, 0x5b, 0x50, 0x41, 0xbf, 0xbc, 0x53, 0x43, 0xb4, 0x32,
++ 0x12, 0x56, 0xae, 0xcf, 0x0c, 0xe7, 0xf5, 0x7f, 0xb4, 0x9a, 0xf2, 0x29,
++ 0x4d, 0xa9, 0x0b, 0xaf, 0x57, 0xe6, 0xe3, 0xde, 0x85, 0xd7, 0x3d, 0x45,
++ 0x1f, 0x5f, 0xbe, 0x4e, 0x1b, 0x81, 0xc2, 0x78, 0x53, 0x42, 0xfd, 0xea,
++ 0x26, 0xab, 0x05, 0x5d, 0xf6, 0x35, 0x07, 0x86, 0x9c, 0x51, 0x9f, 0x03,
++ 0x1f, 0x58, 0xd1, 0x55, 0x72, 0xad, 0x14, 0xb1, 0x96, 0x3a, 0x9f, 0x13,
++ 0x75, 0xe1, 0x4d, 0xf4, 0xb7, 0xc9, 0x55, 0x8d, 0xbc, 0x17, 0x30, 0x8f,
++ 0xa1, 0xd6, 0xbf, 0x09, 0xf2, 0xfb, 0x7d, 0xda, 0x48, 0xa3, 0xd4, 0x65,
++ 0x19, 0xb1, 0x39, 0x5d, 0x3b, 0x06, 0x2f, 0x36, 0xd1, 0xfe, 0x8a, 0x23,
++ 0xba, 0xb9, 0xcc, 0xe1, 0xc4, 0x7e, 0xe2, 0xb8, 0xc3, 0xe8, 0x45, 0x31,
++ 0xc7, 0xc8, 0xf8, 0x8a, 0x47, 0x12, 0xc0, 0xb3, 0xfd, 0x16, 0x1a, 0x43,
++ 0x1e, 0x2c, 0xb1, 0x6d, 0xf3, 0x90, 0x72, 0x75, 0xea, 0x43, 0x6b, 0xc8,
++ 0x59, 0x12, 0x55, 0x23, 0x01, 0xdf, 0x49, 0xb2, 0x81, 0xa2, 0x48, 0x9d,
++ 0xe6, 0x44, 0x5c, 0x69, 0xce, 0xf4, 0x28, 0xcb, 0x33, 0xbd, 0xca, 0x92,
++ 0x8c, 0xb4, 0x7d, 0x48, 0x59, 0x9a, 0xf1, 0x20, 0xdd, 0xaf, 0x60, 0x7b,
++ 0x88, 0x72, 0xd5, 0xe4, 0xec, 0x38, 0xd3, 0xaf, 0x12, 0x63, 0xdf, 0x21,
++ 0xc6, 0xea, 0x61, 0xb0, 0xef, 0x27, 0x12, 0xd5, 0x38, 0x44, 0x2c, 0xfd,
++ 0x71, 0x5a, 0x57, 0x51, 0x7a, 0x11, 0x5e, 0x19, 0xa9, 0xc0, 0xd8, 0xa0,
++ 0xc9, 0xdf, 0xf5, 0x78, 0x61, 0xc4, 0xb2, 0x7a, 0x4c, 0xcb, 0xda, 0x6b,
++ 0x1e, 0x52, 0x1a, 0xd9, 0x67, 0xd4, 0x19, 0x8f, 0x16, 0x47, 0x02, 0xe6,
++ 0x16, 0xf6, 0xe9, 0x88, 0xc4, 0x95, 0x28, 0xfb, 0xbb, 0x9a, 0xfd, 0x2d,
++ 0xcd, 0xf7, 0x97, 0xeb, 0x57, 0x64, 0x91, 0x7a, 0x85, 0x3a, 0x61, 0xd6,
++ 0x01, 0xf6, 0x25, 0x02, 0xc1, 0x42, 0xbd, 0xa5, 0xac, 0x73, 0xf5, 0xd9,
++ 0x3a, 0xc0, 0x70, 0x22, 0xc8, 0x39, 0x15, 0x5b, 0xf7, 0x33, 0x76, 0x7d,
++ 0x83, 0x18, 0xdb, 0x80, 0xb6, 0x61, 0xc1, 0xdf, 0x6b, 0xd4, 0xdc, 0x3c,
++ 0xe5, 0xb0, 0x56, 0x62, 0x5e, 0x0e, 0x6f, 0x83, 0xe8, 0xa3, 0x5f, 0x77,
++ 0xa5, 0xc4, 0xc6, 0xef, 0xf9, 0x72, 0x22, 0xa0, 0xe0, 0xb1, 0x40, 0xb6,
++ 0xa5, 0x1c, 0x95, 0x68, 0x0f, 0x89, 0x6d, 0x6e, 0xfc, 0xf2, 0x53, 0x86,
++ 0x1e, 0x5e, 0xa1, 0x70, 0xce, 0x02, 0x7a, 0xf3, 0x52, 0x05, 0x08, 0x8c,
++ 0x01, 0x6f, 0xa4, 0x2b, 0xb1, 0xda, 0x74, 0x40, 0xad, 0x0a, 0xa2, 0x37,
++ 0x33, 0x35, 0x2e, 0x98, 0xc4, 0x78, 0x69, 0x2f, 0x48, 0xbf, 0x2e, 0xc3,
++ 0x32, 0x2d, 0x67, 0xd3, 0x6e, 0xb6, 0xed, 0x0e, 0x64, 0x83, 0x2a, 0xe3,
++ 0xdd, 0x7e, 0x5e, 0x38, 0x46, 0xfc, 0x6f, 0x34, 0x5c, 0xc4, 0xff, 0x4a,
++ 0x34, 0x9a, 0xbf, 0xb3, 0x96, 0xad, 0x92, 0x7b, 0x85, 0x76, 0xe0, 0x2e,
++ 0x66, 0xbf, 0x6f, 0x19, 0xba, 0x7f, 0x94, 0x27, 0xd9, 0x74, 0xee, 0x7a,
++ 0x9c, 0x31, 0xab, 0x9b, 0xed, 0x6e, 0x66, 0xbb, 0xeb, 0x34, 0x3d, 0x1a,
++ 0x3f, 0x5b, 0x2e, 0x1b, 0x74, 0x40, 0xd7, 0xa4, 0x6c, 0x13, 0xdb, 0x5d,
++ 0xcd, 0x76, 0x7b, 0x35, 0x91, 0xef, 0x77, 0xd6, 0xba, 0x55, 0x72, 0x2f,
++ 0x67, 0x1f, 0xb9, 0x76, 0xef, 0x91, 0x76, 0xcd, 0xd1, 0x7c, 0x5f, 0x47,
++ 0x13, 0xe8, 0x77, 0x44, 0x18, 0x63, 0x1b, 0x02, 0xfe, 0x2e, 0xc6, 0xdb,
++ 0x26, 0xc6, 0x8e, 0x9c, 0x4d, 0x4c, 0x8d, 0x77, 0x88, 0x9f, 0x2b, 0x23,
++ 0xd7, 0xa4, 0x9c, 0xd8, 0xda, 0x24, 0xf5, 0x2c, 0xf1, 0xc5, 0x47, 0xfd,
++ 0x0a, 0xb6, 0x38, 0x71, 0x20, 0x41, 0xfc, 0xc7, 0x37, 0x68, 0x77, 0x7e,
++ 0xb4, 0x64, 0x6a, 0xb1, 0x66, 0x27, 0xe3, 0xa0, 0x59, 0x45, 0x5b, 0xcf,
++ 0xd9, 0xdb, 0x32, 0xb6, 0x3d, 0x69, 0xb7, 0x1d, 0x57, 0x5a, 0x32, 0x75,
++ 0x5a, 0x15, 0x63, 0xee, 0x91, 0xb3, 0xd8, 0x39, 0x27, 0x5a, 0x1a, 0x09,
++ 0x34, 0xaf, 0xe7, 0x24, 0xb9, 0x19, 0xdf, 0xbe, 0x37, 0xaf, 0x87, 0x76,
++ 0xd1, 0x4b, 0x3b, 0xcc, 0xcd, 0x6f, 0x73, 0x66, 0x8f, 0x2a, 0x18, 0x07,
++ 0xb5, 0x16, 0xeb, 0x76, 0xca, 0x7f, 0x72, 0x95, 0x86, 0xc7, 0x78, 0xad,
++ 0x16, 0xab, 0x87, 0xbf, 0x47, 0x3b, 0xd3, 0x7d, 0x62, 0x87, 0x5d, 0x67,
++ 0xe5, 0x12, 0x99, 0x44, 0x36, 0x91, 0xa9, 0x8f, 0xe5, 0x66, 0x51, 0x3f,
++ 0x82, 0x8d, 0xd5, 0x94, 0x67, 0x2b, 0xf9, 0xd0, 0x21, 0xe5, 0xf3, 0x94,
++ 0x27, 0xeb, 0xf2, 0xe2, 0xa1, 0x94, 0xc8, 0xa3, 0x44, 0x67, 0x46, 0x66,
++ 0xe1, 0x4c, 0x2a, 0x10, 0x7f, 0x02, 0x22, 0x5b, 0x8f, 0xd2, 0x2a, 0xf5,
++ 0x53, 0xbd, 0xbc, 0x57, 0x90, 0x11, 0x5a, 0xa5, 0x2d, 0x5b, 0x4e, 0xa6,
++ 0xeb, 0x39, 0xd7, 0x2e, 0xe3, 0x6f, 0xcb, 0x51, 0xe1, 0xa4, 0xad, 0x49,
++ 0xdb, 0xff, 0x61, 0x45, 0xb5, 0x6e, 0x5e, 0xf3, 0x72, 0x9e, 0xdc, 0xe4,
++ 0x05, 0x7a, 0xf0, 0x3a, 0x87, 0xd2, 0xe2, 0x91, 0x78, 0x4d, 0xfb, 0x4c,
++ 0xa7, 0x9d, 0x38, 0x9e, 0x58, 0xba, 0xb4, 0xcc, 0xf8, 0x34, 0x1e, 0x1b,
++ 0xf1, 0x61, 0x84, 0x73, 0xfb, 0x6c, 0x42, 0xe2, 0xeb, 0x2c, 0x3c, 0x9a,
++ 0xf6, 0xe0, 0x99, 0x84, 0x1f, 0x8f, 0x30, 0xfe, 0x4c, 0x24, 0x0c, 0xec,
++ 0x4f, 0x7b, 0xf1, 0x34, 0xed, 0x79, 0x34, 0xed, 0xa3, 0xbd, 0xd4, 0x63,
++ 0x38, 0xdd, 0x66, 0x8f, 0xe1, 0xc9, 0xc4, 0xbf, 0xcb, 0x58, 0x83, 0x32,
++ 0xd6, 0xcd, 0xf6, 0x58, 0x0b, 0x71, 0x7e, 0xd6, 0xd9, 0x79, 0x38, 0x91,
++ 0xb0, 0x71, 0xa0, 0x77, 0x99, 0x43, 0xe6, 0x81, 0x36, 0x3b, 0x20, 0x58,
++ 0xa0, 0xf7, 0xc7, 0x61, 0x61, 0x8f, 0x39, 0x93, 0xfe, 0xdf, 0x4b, 0x79,
++ 0xa9, 0x53, 0x8e, 0x1f, 0xae, 0x8a, 0x68, 0x79, 0x24, 0x10, 0xeb, 0xa3,
++ 0xde, 0x9d, 0x11, 0xd1, 0x43, 0x4e, 0xef, 0x2b, 0x32, 0x87, 0x14, 0xe1,
++ 0x7a, 0x97, 0x0c, 0xc4, 0xad, 0x32, 0x43, 0xf4, 0x1d, 0x20, 0xce, 0x02,
++ 0xf3, 0xf7, 0x38, 0x39, 0xbe, 0x9b, 0x38, 0x66, 0x13, 0x45, 0x46, 0x9d,
++ 0x56, 0x4d, 0xd9, 0x8f, 0x7c, 0x24, 0x06, 0x8a, 0x8e, 0xfe, 0x36, 0x3f,
++ 0x5f, 0xba, 0x83, 0xf2, 0xfa, 0x81, 0xc2, 0xbc, 0x58, 0xd6, 0x0e, 0xb3,
++ 0x30, 0x37, 0x35, 0xf0, 0x57, 0xeb, 0xf1, 0x21, 0x5a, 0xc4, 0x48, 0x62,
++ 0x1a, 0xe2, 0x9a, 0x9a, 0x6f, 0x3b, 0xaa, 0x14, 0x31, 0xff, 0xc0, 0xb8,
++ 0xf8, 0x7e, 0x39, 0xa2, 0x4e, 0xa9, 0x8f, 0x68, 0x51, 0x24, 0x10, 0x9c,
++ 0xab, 0x4e, 0xb5, 0x19, 0xc1, 0x01, 0xe9, 0x2b, 0x4e, 0x59, 0xcf, 0xc7,
++ 0x82, 0x91, 0x44, 0x01, 0x37, 0xfe, 0x3b, 0xf5, 0x2e, 0xd4, 0xa9, 0xc8,
++ 0x29, 0x7a, 0x55, 0x71, 0x74, 0x50, 0xf4, 0xe7, 0xc4, 0x4a, 0x73, 0x7a,
++ 0x5e, 0xe6, 0x59, 0x9c, 0x17, 0x62, 0x0e, 0xe7, 0xeb, 0x85, 0x7e, 0x2f,
++ 0xe5, 0xb6, 0x90, 0x0e, 0x5d, 0x8c, 0x4d, 0x36, 0xe7, 0x5c, 0x95, 0xcf,
++ 0x5b, 0x38, 0x4f, 0xea, 0x76, 0xea, 0xfa, 0xb3, 0x8e, 0xdc, 0x79, 0x9d,
++ 0xef, 0xa3, 0xfa, 0xd2, 0xb5, 0x18, 0x0a, 0x3a, 0x03, 0x86, 0xd2, 0x88,
++ 0xb9, 0x23, 0xf5, 0x4d, 0xce, 0xbe, 0xb6, 0x0d, 0xf4, 0xef, 0x7b, 0x4f,
++ 0x35, 0x7c, 0x16, 0x9b, 0xa9, 0x17, 0xa7, 0x6d, 0x67, 0x51, 0xc5, 0x65,
++ 0x2c, 0xb1, 0xfd, 0x49, 0x1d, 0x5f, 0x91, 0xef, 0x23, 0x6a, 0xe7, 0x2c,
++ 0x50, 0x5b, 0xf2, 0xe7, 0x77, 0x53, 0xdf, 0x32, 0x0e, 0x15, 0x3f, 0x20,
++ 0x97, 0x7d, 0x27, 0xf4, 0x59, 0x64, 0x6d, 0xcc, 0x76, 0xd2, 0xdf, 0xaf,
++ 0x62, 0x5d, 0xe2, 0xdf, 0xb8, 0xc4, 0x52, 0xc4, 0x4b, 0xe8, 0xd7, 0x45,
++ 0xf4, 0xd5, 0x6b, 0x32, 0xf7, 0xa0, 0x3d, 0x15, 0x08, 0x97, 0x28, 0xf7,
++ 0xe0, 0xd6, 0x8c, 0x0b, 0xb1, 0x61, 0x0f, 0xd6, 0x51, 0x27, 0xce, 0xa4,
++ 0xf8, 0xb9, 0x86, 0x75, 0xa3, 0x47, 0x67, 0x3a, 0xe9, 0x37, 0xeb, 0x46,
++ 0xbd, 0x3c, 0xa6, 0xf3, 0x70, 0x63, 0x35, 0x8f, 0x3d, 0xb4, 0xcb, 0x36,
++ 0xc6, 0x86, 0x23, 0x09, 0x13, 0x9d, 0xd4, 0xd5, 0x13, 0x89, 0x06, 0xdc,
++ 0x4b, 0xbd, 0x1d, 0x4a, 0x7c, 0x8a, 0x3a, 0x0a, 0xa3, 0x83, 0x73, 0xfc,
++ 0x58, 0x42, 0xb5, 0xf3, 0xab, 0xdb, 0x33, 0xff, 0x62, 0x45, 0xa7, 0x8b,
++ 0x9c, 0xa2, 0x0b, 0x99, 0xcf, 0x8f, 0xe8, 0x81, 0xfe, 0x3b, 0x55, 0x17,
++ 0xf5, 0xd8, 0xb6, 0xcb, 0xc0, 0xf6, 0x5d, 0x75, 0xb4, 0xbb, 0x8c, 0xe5,
++ 0xaf, 0x1a, 0xa0, 0x0e, 0xa6, 0xea, 0xe1, 0x08, 0x79, 0x81, 0xe8, 0x41,
++ 0xda, 0xbc, 0x8f, 0x63, 0xee, 0xe6, 0x3d, 0x1f, 0x1e, 0x4f, 0x7c, 0x97,
++ 0xbf, 0xc3, 0xca, 0x5d, 0x19, 0xf1, 0x79, 0xf1, 0xb7, 0x7f, 0x70, 0xe4,
++ 0x62, 0x6f, 0xa1, 0xdc, 0x16, 0x96, 0xb3, 0xac, 0xcd, 0x67, 0xe3, 0x4a,
++ 0x51, 0xb4, 0x84, 0x71, 0x65, 0x7f, 0x22, 0x10, 0x7e, 0xc6, 0x8e, 0x7d,
++ 0x4e, 0xda, 0x8e, 0xd8, 0x47, 0x8f, 0x6d, 0x1b, 0xcb, 0xce, 0xda, 0xc6,
++ 0xe4, 0x59, 0x0e, 0xd5, 0x9f, 0x9a, 0xea, 0x73, 0x39, 0xbb, 0x70, 0x26,
++ 0xf5, 0x5e, 0xdb, 0x8e, 0xd3, 0x82, 0x8f, 0x0e, 0x38, 0x06, 0x9c, 0x68,
++ 0x33, 0x2f, 0xa5, 0xbe, 0xab, 0x19, 0x6f, 0x8a, 0x78, 0x30, 0x4f, 0x1d,
++ 0xfe, 0x0b, 0x94, 0x0e, 0x64, 0xad, 0x12, 0xfe, 0x6e, 0x0e, 0x89, 0xbe,
++ 0xaf, 0xc2, 0xad, 0xc3, 0x0e, 0x14, 0x0d, 0x28, 0x78, 0xd2, 0xac, 0xc7,
++ 0x90, 0x37, 0x87, 0xbb, 0x6a, 0xf2, 0x52, 0x7b, 0x9e, 0x2e, 0x1e, 0x3f,
++ 0xfa, 0x8c, 0xc4, 0x85, 0x7b, 0x47, 0x3d, 0xf0, 0x25, 0x15, 0x78, 0x88,
++ 0x2b, 0x65, 0x46, 0x3d, 0xf5, 0xaa, 0xa1, 0x32, 0x69, 0xe2, 0x6b, 0x19,
++ 0xd2, 0xa6, 0x07, 0xc2, 0xb8, 0x93, 0xf3, 0x52, 0xfe, 0xc0, 0x95, 0xb8,
++ 0x83, 0xe5, 0x36, 0xf0, 0xde, 0x86, 0xd1, 0x6a, 0x1e, 0x5e, 0x1e, 0xd3,
++ 0x79, 0x34, 0xe0, 0xf6, 0xe1, 0x5a, 0x44, 0xab, 0xf5, 0xa0, 0x5f, 0x75,
++ 0xa0, 0x7a, 0x40, 0xf4, 0xae, 0x62, 0xe5, 0x02, 0x05, 0xe6, 0xa7, 0x8b,
++ 0xa1, 0xce, 0xfd, 0x38, 0xdf, 0xfd, 0x53, 0xb2, 0xbe, 0x6c, 0x0d, 0xd9,
++ 0x98, 0x2e, 0x3a, 0x16, 0x3b, 0xf9, 0x57, 0xce, 0x85, 0xc8, 0x2b, 0x7d,
++ 0x48, 0xac, 0x15, 0x1d, 0x7f, 0x12, 0x36, 0x30, 0xb2, 0x54, 0x74, 0xb1,
++ 0xcc, 0x47, 0x7d, 0x01, 0x67, 0xe7, 0x7f, 0x2a, 0x67, 0x95, 0xb8, 0xaf,
++ 0x87, 0x87, 0x6c, 0x8e, 0xe3, 0x67, 0xbe, 0xa8, 0xc7, 0x45, 0xe7, 0xe4,
++ 0x34, 0x6e, 0xd5, 0x80, 0xbf, 0xc8, 0xb8, 0x19, 0xb7, 0x71, 0x9e, 0xf6,
++ 0x26, 0xd4, 0xa5, 0x2e, 0xa8, 0xb3, 0x5c, 0x4c, 0x9c, 0x47, 0x4c, 0x1d,
++ 0xed, 0xc3, 0xcc, 0xb5, 0x86, 0xcb, 0xd1, 0xa5, 0x29, 0xee, 0x6d, 0xf5,
++ 0x8b, 0x24, 0xa7, 0xf6, 0x57, 0x1a, 0x50, 0xcb, 0x18, 0xff, 0xb7, 0x6b,
++ 0x70, 0x16, 0x19, 0x8a, 0x9a, 0xa8, 0x6f, 0x42, 0xbc, 0x0a, 0xce, 0x0a,
++ 0x03, 0x0a, 0x73, 0x66, 0xf4, 0x69, 0x10, 0xec, 0x89, 0x16, 0x19, 0xf7,
++ 0xe0, 0xb6, 0x14, 0xac, 0xd2, 0x08, 0xf3, 0xa1, 0x88, 0x41, 0x8e, 0x1b,
++ 0xf0, 0x15, 0xd1, 0x3f, 0x56, 0x93, 0x57, 0xac, 0x1d, 0x16, 0x39, 0x3c,
++ 0xe4, 0x1b, 0x86, 0xbf, 0x0d, 0xcc, 0xe1, 0x5b, 0xf4, 0xe0, 0x24, 0xf3,
++ 0xd8, 0xd5, 0xd4, 0xfd, 0x48, 0xe2, 0x1e, 0x34, 0xa6, 0x8e, 0x58, 0x1e,
++ 0xf2, 0xc8, 0x22, 0xa3, 0xf6, 0x4c, 0x17, 0x62, 0xf4, 0x0d, 0xe1, 0x47,
++ 0x6b, 0xe8, 0x1b, 0x3e, 0x64, 0x12, 0xea, 0x71, 0xb2, 0x0b, 0x74, 0x8c,
++ 0xae, 0xc7, 0xd7, 0x46, 0x67, 0x61, 0x3c, 0xb1, 0x01, 0x77, 0x66, 0xc8,
++ 0x95, 0xfa, 0xaf, 0xc2, 0x1d, 0xc3, 0x57, 0xe1, 0xf6, 0x9d, 0x46, 0x70,
++ 0x03, 0x75, 0xbd, 0x76, 0x98, 0x81, 0x72, 0xba, 0xb4, 0x5b, 0xd0, 0x95,
++ 0xf0, 0x45, 0xea, 0x22, 0xaf, 0xa7, 0x2c, 0x0a, 0x1c, 0xe6, 0x5f, 0x2d,
++ 0x5e, 0x8a, 0x17, 0x35, 0x28, 0xfe, 0xdd, 0xf5, 0x2f, 0x31, 0xb7, 0x17,
++ 0xd9, 0x11, 0x9d, 0x69, 0xfc, 0xc0, 0x7a, 0x50, 0xa3, 0x7f, 0x47, 0x10,
++ 0x9f, 0xd3, 0xf0, 0xbc, 0xf5, 0xd0, 0x2a, 0xb9, 0x7e, 0x9b, 0x13, 0xa5,
++ 0x2a, 0xaf, 0x49, 0x9b, 0x82, 0x4b, 0x75, 0x44, 0xe2, 0x8f, 0x6b, 0x33,
++ 0x6b, 0x25, 0xcf, 0x96, 0x27, 0x2f, 0x24, 0x16, 0x3f, 0x91, 0xf0, 0xa2,
++ 0x37, 0x95, 0xe3, 0x56, 0x37, 0x65, 0x84, 0x53, 0xb9, 0x51, 0xda, 0x27,
++ 0x71, 0x25, 0x8a, 0xf5, 0xfc, 0x5d, 0xd2, 0xa7, 0xb7, 0xc4, 0x91, 0x60,
++ 0x9b, 0x4d, 0x9c, 0x0b, 0xda, 0x6b, 0x9f, 0x03, 0x25, 0x46, 0x73, 0xce,
++ 0x56, 0xfb, 0x56, 0xd0, 0x56, 0x35, 0x54, 0xf4, 0xf5, 0x70, 0xac, 0xb4,
++ 0x55, 0xd6, 0xbb, 0x83, 0xba, 0xf0, 0xf4, 0xad, 0xa2, 0xbd, 0xce, 0x42,
++ 0x59, 0x5f, 0x2b, 0xf1, 0x01, 0x8c, 0xeb, 0x16, 0x8e, 0x9a, 0x95, 0x79,
++ 0x7e, 0xda, 0x8c, 0x5b, 0x53, 0x51, 0xb4, 0xa5, 0x6a, 0xa3, 0x27, 0x65,
++ 0xad, 0xca, 0x95, 0xc3, 0xb0, 0x68, 0x8d, 0xe8, 0x62, 0x32, 0x8f, 0xa7,
++ 0x7a, 0x73, 0x8e, 0xd3, 0xe9, 0x9a, 0x5f, 0x29, 0xc8, 0xde, 0x83, 0x18,
++ 0xf3, 0x8f, 0x39, 0x91, 0x16, 0x58, 0x29, 0x91, 0x3b, 0x6e, 0xf9, 0x98,
++ 0x53, 0x7a, 0x22, 0xfa, 0xc6, 0xc5, 0x0e, 0xa3, 0xe3, 0x15, 0x25, 0x88,
++ 0xeb, 0x29, 0x43, 0x59, 0x5f, 0x27, 0x5e, 0x08, 0xe9, 0xbe, 0xef, 0x2a,
++ 0xfa, 0x99, 0x0d, 0x78, 0x05, 0x3f, 0xe3, 0xb5, 0xa2, 0xbe, 0x09, 0x3c,
++ 0x94, 0x79, 0x15, 0xa7, 0x28, 0xab, 0xda, 0xf7, 0xa1, 0xb5, 0xcc, 0x78,
++ 0x86, 0xe3, 0x77, 0x2b, 0x6f, 0x65, 0xa6, 0xda, 0xe2, 0x55, 0x58, 0xbd,
++ 0x53, 0xec, 0x4f, 0x0f, 0xc6, 0x89, 0xbd, 0x6d, 0x66, 0x85, 0x70, 0x79,
++ 0x89, 0x4f, 0x94, 0xbf, 0x45, 0xb0, 0x85, 0xfe, 0x41, 0x3b, 0xb0, 0xc7,
++ 0xd0, 0x6a, 0x63, 0xb2, 0x33, 0x09, 0x1b, 0x4b, 0x73, 0x7a, 0x8e, 0x28,
++ 0x6d, 0xa3, 0xbe, 0x52, 0x94, 0xfa, 0xf2, 0x7e, 0x90, 0x5b, 0xb3, 0x38,
++ 0x57, 0xf7, 0x3f, 0xad, 0x11, 0xef, 0xf9, 0x75, 0x2b, 0x98, 0x83, 0x55,
++ 0x72, 0x3c, 0xef, 0xf6, 0xc5, 0xad, 0xd2, 0xdc, 0x58, 0x9a, 0x7f, 0xa0,
++ 0x88, 0x4d, 0x06, 0xc9, 0xed, 0x3b, 0x71, 0x69, 0x48, 0x6f, 0xfd, 0xae,
++ 0x22, 0x65, 0xf5, 0xf0, 0x06, 0xa5, 0xd0, 0xcf, 0xcb, 0x38, 0x39, 0x22,
++ 0x7d, 0x48, 0x5f, 0x13, 0xcc, 0xc9, 0x72, 0x63, 0x10, 0x5f, 0x7a, 0xc4,
++ 0x9e, 0x4b, 0xf1, 0x27, 0x3f, 0x96, 0x73, 0x4c, 0xae, 0x3e, 0x1f, 0x0f,
++ 0x17, 0xed, 0xd5, 0x87, 0xb5, 0x99, 0x15, 0x58, 0xcd, 0xbc, 0x76, 0x75,
++ 0xa6, 0x85, 0xba, 0xdf, 0x48, 0x7c, 0x67, 0x46, 0xa0, 0xe5, 0x74, 0x7c,
++ 0xce, 0x3e, 0x74, 0xff, 0x24, 0x56, 0xf0, 0xfe, 0xcf, 0x9d, 0xa8, 0x68,
++ 0x61, 0x79, 0xfb, 0xbe, 0x29, 0xf8, 0x7d, 0xae, 0xcc, 0x47, 0x78, 0x98,
++ 0x1d, 0xe7, 0xf7, 0xda, 0x1c, 0xb1, 0xc5, 0xce, 0xbd, 0xae, 0xb6, 0xe7,
++ 0x5c, 0x38, 0x82, 0x85, 0x63, 0x66, 0x31, 0xf3, 0xaf, 0xba, 0xe0, 0xf9,
++ 0x9c, 0x50, 0x67, 0x16, 0x5a, 0xc0, 0x03, 0xe9, 0x4b, 0xf4, 0x72, 0xa2,
++ 0x26, 0xa7, 0x97, 0x4f, 0x2a, 0x7b, 0x3e, 0x76, 0xec, 0x49, 0x48, 0xdf,
++ 0x45, 0x36, 0x2f, 0x6d, 0xcc, 0x94, 0x22, 0xee, 0x15, 0x1d, 0x49, 0x7b,
++ 0xba, 0x5f, 0x64, 0x5a, 0xbb, 0x53, 0xec, 0xd8, 0xc2, 0x08, 0x65, 0xe8,
++ 0xb6, 0xe7, 0x2d, 0xc7, 0x25, 0x8f, 0x9c, 0x17, 0x9f, 0x65, 0x4c, 0x85,
++ 0xbe, 0x6f, 0x73, 0xe5, 0xf8, 0x66, 0x81, 0x2b, 0x58, 0xd6, 0x80, 0x59,
++ 0xe0, 0x0a, 0x32, 0xe6, 0xbf, 0x00, 0x63, 0x9d, 0x3d, 0xde, 0x35, 0xf9,
++ 0xb6, 0xbb, 0xcc, 0x00, 0xed, 0x5a, 0xb8, 0x54, 0x44, 0x59, 0xb3, 0x2b,
++ 0xc3, 0xb9, 0x95, 0xdc, 0x06, 0xb8, 0x93, 0xf7, 0xcb, 0x79, 0xff, 0xc5,
++ 0x90, 0x0b, 0x97, 0x4e, 0x97, 0xbe, 0xaf, 0x42, 0xc7, 0xce, 0x28, 0x2a,
++ 0x17, 0x06, 0x30, 0x69, 0x73, 0x89, 0x02, 0xef, 0x75, 0xe1, 0x8e, 0x9d,
++ 0x1f, 0x5a, 0x15, 0x36, 0x17, 0x33, 0x62, 0xe3, 0x8a, 0x8a, 0xed, 0x8b,
++ 0x84, 0xff, 0xba, 0x88, 0xef, 0xe4, 0xa2, 0xc2, 0xad, 0x5d, 0x65, 0xe4,
++ 0xb0, 0xc2, 0xe1, 0x02, 0xd9, 0x9b, 0x54, 0x68, 0x5a, 0x44, 0xb8, 0xdc,
++ 0x2c, 0x9b, 0xc3, 0x0a, 0x97, 0xfd, 0x56, 0xea, 0xd0, 0x14, 0x2e, 0x7b,
++ 0x96, 0x73, 0x30, 0xf7, 0x69, 0x61, 0x7e, 0xef, 0x81, 0x3b, 0xa2, 0xb7,
++ 0x6c, 0x52, 0x3a, 0xb1, 0x3c, 0x64, 0x98, 0x92, 0x53, 0x5f, 0xa9, 0xe8,
++ 0xc1, 0xd3, 0x08, 0x12, 0x6f, 0x5f, 0xc6, 0xc8, 0x60, 0xdc, 0x25, 0x76,
++ 0xb4, 0x29, 0x73, 0x4e, 0x9e, 0x5b, 0x29, 0x8f, 0x3b, 0x27, 0x8f, 0x79,
++ 0x1a, 0x2a, 0x9e, 0x6c, 0x70, 0x11, 0xb7, 0xfe, 0x0e, 0x6d, 0x3b, 0x55,
++ 0x2c, 0xb1, 0xb9, 0xf9, 0xdf, 0x11, 0x7f, 0x2f, 0x2a, 0xcd, 0x95, 0x07,
++ 0x3a, 0xe9, 0xdf, 0xef, 0x2f, 0x2c, 0x41, 0x68, 0x9a, 0x82, 0x2a, 0xa3,
++ 0x83, 0xf9, 0xf1, 0x87, 0x56, 0xdc, 0x49, 0x3a, 0x6b, 0x40, 0x2b, 0x89,
++ 0x44, 0x29, 0x5b, 0x93, 0x72, 0xcd, 0xf0, 0x20, 0xfb, 0xe9, 0x20, 0xef,
++ 0xf7, 0xe0, 0x2e, 0xda, 0xce, 0x5d, 0x8c, 0x65, 0x77, 0x31, 0x96, 0xdd,
++ 0x35, 0xfa, 0x2f, 0xbc, 0x3e, 0xdd, 0xfe, 0xbd, 0x29, 0x55, 0xb0, 0x65,
++ 0x27, 0xe3, 0x82, 0xe8, 0x77, 0x33, 0x7d, 0x47, 0xe2, 0x02, 0x28, 0x93,
++ 0x85, 0x93, 0x9c, 0xc7, 0x25, 0x9a, 0x1e, 0xcc, 0xe2, 0xeb, 0xae, 0x73,
++ 0x79, 0x5f, 0x21, 0xb6, 0xc8, 0x3c, 0xba, 0x70, 0x1b, 0x65, 0x0c, 0x86,
++ 0xfe, 0xcb, 0x42, 0x95, 0xf8, 0xee, 0x85, 0xf7, 0x73, 0xf3, 0x7a, 0xe4,
++ 0x2c, 0x07, 0x54, 0xc4, 0x4e, 0xe9, 0xf3, 0x7b, 0x6c, 0x4e, 0xf1, 0xa2,
++ 0xc9, 0xdc, 0x6d, 0xe7, 0xd1, 0xf9, 0x62, 0x2a, 0x6b, 0x47, 0xa3, 0xe8,
++ 0xe6, 0xb8, 0x57, 0x0f, 0x3f, 0x96, 0xd7, 0x4b, 0x61, 0xbc, 0x0a, 0xd5,
++ 0xe2, 0xa1, 0xff, 0xe4, 0x72, 0x95, 0xb6, 0x51, 0xe1, 0xb6, 0xd5, 0xfc,
++ 0x2f, 0xdc, 0xd6, 0xcb, 0xff, 0xc2, 0x73, 0xa7, 0xf3, 0xbf, 0x13, 0xfe,
++ 0xe9, 0x62, 0xc7, 0xf5, 0xe8, 0xdd, 0x65, 0x59, 0xc5, 0x81, 0x7a, 0x6c,
++ 0x19, 0xfd, 0x48, 0xbc, 0xbc, 0x40, 0x1e, 0x7b, 0x0e, 0xe8, 0x47, 0x2e,
++ 0xc1, 0x22, 0xbf, 0x5f, 0x95, 0xbe, 0x2d, 0x6c, 0x34, 0xaf, 0x62, 0x9f,
++ 0x8c, 0x80, 0xd5, 0x53, 0xfd, 0xa2, 0xd0, 0x46, 0x41, 0xdf, 0xc5, 0xf4,
++ 0x73, 0x68, 0x2e, 0xea, 0x7b, 0x65, 0x46, 0xea, 0x36, 0x29, 0x4b, 0x87,
++ 0xa7, 0x96, 0xef, 0x20, 0x1f, 0x3e, 0x4d, 0x5d, 0x17, 0xfc, 0xc8, 0x9b,
++ 0xcf, 0x2b, 0x98, 0x4b, 0xa4, 0x44, 0x97, 0x32, 0xbe, 0x5c, 0xae, 0x28,
++ 0xb6, 0x74, 0xe4, 0x6c, 0x1f, 0xa2, 0xb7, 0xf8, 0xf4, 0x12, 0x43, 0xec,
++ 0x28, 0x48, 0x5c, 0xd1, 0xc3, 0xcd, 0x84, 0xed, 0x53, 0x09, 0xc4, 0x1c,
++ 0x91, 0xe6, 0xa6, 0xb5, 0x89, 0xb9, 0xda, 0xf1, 0x7c, 0x2e, 0xba, 0x87,
++ 0x38, 0xae, 0x1a, 0xb2, 0x0e, 0x42, 0x5b, 0x19, 0x16, 0xdd, 0x75, 0x28,
++ 0xe7, 0xf2, 0xce, 0x28, 0x79, 0x97, 0x6a, 0xcb, 0xe8, 0x8c, 0x88, 0x6c,
++ 0x52, 0x87, 0xb2, 0x5f, 0xc0, 0xbf, 0x72, 0xba, 0xa8, 0x80, 0x67, 0x40,
++ 0x78, 0x97, 0x8e, 0x0d, 0x8c, 0xf3, 0x65, 0x03, 0x7e, 0xfa, 0x42, 0x35,
++ 0x4a, 0x1f, 0x88, 0x60, 0xfd, 0xa8, 0x86, 0x92, 0x07, 0x2c, 0x6b, 0x6e,
++ 0xa8, 0x87, 0x5c, 0xf6, 0xb2, 0x22, 0xc9, 0x9d, 0x9c, 0x49, 0x62, 0x16,
++ 0xf1, 0xad, 0x3d, 0xa5, 0xe0, 0x6a, 0xc6, 0xd3, 0x28, 0x71, 0xa8, 0xdd,
++ 0xc6, 0x39, 0xab, 0x73, 0x4e, 0xc4, 0x45, 0x1b, 0x5a, 0xc5, 0xfb, 0xad,
++ 0xc4, 0xc0, 0x56, 0x62, 0x9a, 0x65, 0xbd, 0x7f, 0x39, 0x3a, 0xcb, 0x22,
++ 0x37, 0x13, 0x0b, 0x6b, 0xc9, 0x89, 0x25, 0x7e, 0x5f, 0x8e, 0x35, 0x8c,
++ 0xfd, 0xc5, 0x49, 0x3b, 0x9f, 0xa2, 0xee, 0x18, 0xa3, 0x32, 0x8c, 0x71,
++ 0x94, 0xfd, 0x69, 0x72, 0x5c, 0xe1, 0xbb, 0x95, 0xc9, 0x0d, 0x8c, 0x75,
++ 0x1e, 0x54, 0x0c, 0x5c, 0x86, 0x3b, 0x19, 0xcf, 0xef, 0xd8, 0xe9, 0x47,
++ 0x7a, 0xd1, 0x55, 0x94, 0xef, 0x1e, 0xac, 0x4f, 0x19, 0x92, 0x43, 0x45,
++ 0x83, 0x8b, 0xc8, 0xb7, 0x33, 0x82, 0x3b, 0x92, 0x8f, 0x95, 0x61, 0x49,
++ 0x0b, 0x10, 0x4c, 0x16, 0xf0, 0x2d, 0x2a, 0x6b, 0x47, 0x30, 0x92, 0xe7,
++ 0x63, 0xdb, 0x39, 0x5e, 0x24, 0xeb, 0x70, 0x2d, 0x98, 0xcf, 0x58, 0x20,
++ 0xf6, 0xa5, 0x31, 0xc7, 0x2c, 0x51, 0x0c, 0xdf, 0x1e, 0xfa, 0xa9, 0xe4,
++ 0x3d, 0x57, 0x24, 0x0b, 0xb1, 0x4f, 0xcf, 0x2e, 0x76, 0x74, 0x12, 0x47,
++ 0xf4, 0x8d, 0xbf, 0x53, 0xf4, 0xf6, 0x13, 0xca, 0x2b, 0xd8, 0x37, 0xf6,
++ 0x2a, 0x86, 0xc6, 0xdc, 0xca, 0xe8, 0x98, 0xf4, 0x35, 0x81, 0xbe, 0xcc,
++ 0x9f, 0xea, 0x6b, 0xea, 0xfa, 0xcb, 0xa2, 0xf3, 0xd6, 0x6c, 0xae, 0xce,
++ 0xe7, 0x89, 0x4b, 0xcf, 0xe3, 0xc7, 0x32, 0x27, 0x62, 0x97, 0x5e, 0xf4,
++ 0xa4, 0xce, 0xad, 0x0b, 0xf4, 0x27, 0xb6, 0xd9, 0xfe, 0xd9, 0x92, 0x11,
++ 0x7b, 0x55, 0x19, 0x33, 0x2f, 0xce, 0xe7, 0x2c, 0xb5, 0xd4, 0x41, 0x9f,
++ 0x7d, 0x6f, 0x9f, 0xf9, 0x29, 0x64, 0xed, 0x6b, 0x8b, 0xe9, 0x9b, 0xd5,
++ 0x28, 0x26, 0x26, 0x06, 0x43, 0x3e, 0x14, 0x57, 0xc9, 0x3a, 0xce, 0xb9,
++ 0xdc, 0x7f, 0xc3, 0x4e, 0x86, 0x64, 0x1b, 0x73, 0x1a, 0x89, 0x7f, 0xb5,
++ 0x9c, 0xef, 0x1c, 0xce, 0xac, 0xa7, 0x0d, 0x5d, 0x27, 0x36, 0xe4, 0xca,
++ 0xd9, 0xd0, 0x47, 0xd7, 0x17, 0x54, 0x90, 0xfb, 0x69, 0x15, 0x76, 0xde,
++ 0xd7, 0xa4, 0x5c, 0x9f, 0xb7, 0xab, 0xcf, 0x67, 0x1e, 0x2d, 0xca, 0xe7,
++ 0x66, 0x17, 0x94, 0xff, 0x38, 0x1d, 0x5c, 0xf6, 0x67, 0xe8, 0x40, 0xe2,
++ 0x81, 0xe4, 0x04, 0xa2, 0x83, 0xf3, 0xf3, 0xf2, 0xfe, 0x44, 0x35, 0x71,
++ 0xef, 0x42, 0x5d, 0xcc, 0xcc, 0xeb, 0x62, 0x31, 0xb1, 0x4b, 0xfe, 0x5b,
++ 0x38, 0x65, 0x7a, 0xf1, 0xa2, 0x26, 0xe3, 0x5e, 0x8c, 0xf5, 0x1c, 0xaf,
++ 0x9b, 0xba, 0x58, 0x1e, 0xaa, 0x44, 0xf0, 0xbc, 0x78, 0x50, 0xcb, 0xd8,
++ 0xf1, 0x21, 0x79, 0xa6, 0xfc, 0xf6, 0xe3, 0x05, 0xea, 0xe2, 0x8e, 0xe1,
++ 0xc5, 0xb8, 0x8b, 0xfe, 0x94, 0xe3, 0x90, 0xb9, 0xd8, 0xb0, 0x76, 0x58,
++ 0xda, 0x14, 0x8c, 0xfb, 0xd9, 0xd9, 0x71, 0xfe, 0x71, 0x5e, 0xfe, 0x0a,
++ 0xe5, 0x97, 0x67, 0x07, 0xb2, 0x16, 0x2d, 0xcf, 0x11, 0x64, 0x2c, 0xc6,
++ 0x14, 0xdc, 0xb1, 0xac, 0x83, 0xe6, 0x3c, 0xc4, 0xaa, 0xf5, 0x7e, 0x89,
++ 0x8f, 0xfd, 0xc4, 0x03, 0x07, 0xf3, 0xc8, 0xa2, 0x48, 0x94, 0xfe, 0xac,
++ 0x5e, 0xe5, 0x80, 0x5a, 0xef, 0x40, 0x27, 0xde, 0x30, 0x8d, 0xde, 0x75,
++ 0xf8, 0x14, 0xba, 0xbc, 0x16, 0xf6, 0xb2, 0x9d, 0xee, 0x54, 0x09, 0xda,
++ 0xeb, 0x69, 0x56, 0x2b, 0x3d, 0xd8, 0x91, 0x8a, 0xb7, 0x12, 0x16, 0x18,
++ 0x73, 0x1a, 0xfe, 0x2a, 0x11, 0xd0, 0x5b, 0x36, 0x90, 0xb7, 0x2c, 0xef,
++ 0x73, 0xc3, 0xaf, 0xe4, 0x72, 0xb4, 0x01, 0x55, 0xd6, 0x09, 0x23, 0x94,
++ 0xbd, 0xc7, 0xce, 0xf7, 0xfc, 0xd3, 0xa5, 0x1f, 0x3f, 0xe2, 0x19, 0xa9,
++ 0xeb, 0x47, 0xe9, 0x5c, 0x05, 0xcb, 0xe7, 0xea, 0xf1, 0xa8, 0x62, 0x59,
++ 0x0b, 0x42, 0x4e, 0xfb, 0xfe, 0xb6, 0x4c, 0x5d, 0xeb, 0x0d, 0xea, 0xab,
++ 0x56, 0x6e, 0x6d, 0x52, 0xd7, 0xa2, 0x4c, 0x0a, 0x8e, 0xfc, 0xd1, 0xf5,
++ 0xf9, 0x20, 0xe4, 0xb9, 0x89, 0xdb, 0x58, 0x89, 0xfd, 0xf9, 0xf5, 0x39,
++ 0x57, 0xe4, 0xbd, 0x2f, 0xef, 0x35, 0x24, 0x6f, 0x11, 0x9d, 0x4b, 0x7f,
++ 0x62, 0x0b, 0xd7, 0x15, 0x0b, 0x06, 0x76, 0x65, 0x16, 0xd2, 0x16, 0x7f,
++ 0x6b, 0x8d, 0x7a, 0xa7, 0x96, 0xbd, 0x51, 0xcd, 0xad, 0xb7, 0x4b, 0xd9,
++ 0x42, 0xb9, 0x8b, 0x89, 0x09, 0x8d, 0x18, 0x3e, 0xaf, 0x4d, 0xc9, 0x75,
++ 0x0b, 0x6d, 0xde, 0xc6, 0x72, 0xd2, 0xae, 0xe0, 0xef, 0x7f, 0x59, 0xfb,
++ 0xce, 0x6b, 0xaf, 0xd5, 0x95, 0x6b, 0xef, 0xee, 0x62, 0xc9, 0xdd, 0xfb,
++ 0x53, 0x45, 0xac, 0xf3, 0x4e, 0x9e, 0x07, 0x16, 0xca, 0x7c, 0xea, 0x82,
++ 0x32, 0xc4, 0x79, 0xe3, 0x4d, 0x6b, 0xcf, 0x79, 0x65, 0x96, 0x3b, 0xcf,
++ 0x2f, 0xe3, 0xc4, 0x1c, 0xe3, 0x55, 0xeb, 0xc8, 0x79, 0x65, 0xd2, 0x17,
++ 0x94, 0xb9, 0x1c, 0x63, 0xf5, 0x8f, 0x58, 0x43, 0xb9, 0xb9, 0xc9, 0xd2,
++ 0x7d, 0xdc, 0x33, 0x23, 0xad, 0x7f, 0x75, 0xc5, 0x3c, 0xbd, 0x63, 0xa6,
++ 0x43, 0x9e, 0xd9, 0xb8, 0x91, 0xcd, 0xcd, 0x4d, 0x5c, 0xe6, 0xc6, 0xb5,
++ 0xa0, 0x30, 0x37, 0xd7, 0xe5, 0xeb, 0x17, 0xda, 0xbd, 0xae, 0xe8, 0xfc,
++ 0x76, 0x0b, 0xd7, 0xaf, 0xb8, 0x40, 0xee, 0xef, 0x5c, 0x50, 0xee, 0xb7,
++ 0x7f, 0xa4, 0xde, 0x2f, 0x1c, 0xe7, 0x5f, 0x3f, 0xa0, 0x9e, 0x7f, 0xde,
++ 0x9c, 0x3f, 0x2f, 0xe8, 0xbf, 0xea, 0x82, 0xf2, 0x35, 0x17, 0x94, 0x7f,
++ 0x59, 0xfd, 0xf8, 0x7e, 0xd6, 0x5d, 0x50, 0xcf, 0x5e, 0xab, 0xc6, 0x53,
++ 0x67, 0x7d, 0x1e, 0x4d, 0x45, 0x08, 0x98, 0x4e, 0x05, 0x7e, 0xfa, 0xbe,
++ 0xff, 0xe9, 0x0b, 0xd6, 0xac, 0x9b, 0xce, 0xfa, 0xfe, 0x79, 0x9c, 0x33,
++ 0x56, 0x1c, 0x91, 0x18, 0x56, 0x44, 0xee, 0x2c, 0x3c, 0xb0, 0x4e, 0x3b,
++ 0x97, 0x67, 0x15, 0x62, 0x65, 0x45, 0xac, 0x24, 0xd2, 0x00, 0xff, 0xd8,
++ 0x2c, 0xff, 0x9b, 0x09, 0x59, 0xb7, 0xfc, 0x80, 0x5c, 0xca, 0xf0, 0xed,
++ 0xc7, 0x2c, 0xff, 0x4f, 0xd3, 0x6f, 0x15, 0xa3, 0xc2, 0x83, 0xab, 0x13,
++ 0x1f, 0x5f, 0x4f, 0x8d, 0x40, 0x59, 0xd6, 0xe0, 0x63, 0x7e, 0x05, 0xe7,
++ 0x35, 0xf3, 0x30, 0xe5, 0xaf, 0x45, 0xf2, 0x3d, 0xf5, 0x58, 0x43, 0x98,
++ 0xf1, 0x39, 0xf7, 0xbc, 0x76, 0x49, 0x46, 0xf7, 0x45, 0x95, 0xdc, 0x33,
++ 0xd9, 0xf6, 0xd0, 0x1f, 0xc8, 0x77, 0x3a, 0x29, 0x97, 0xc5, 0xbe, 0x80,
++ 0x0d, 0x09, 0xcb, 0x7a, 0x8a, 0x79, 0xaa, 0x3c, 0xeb, 0xff, 0x79, 0xfa,
++ 0xf7, 0xd6, 0x84, 0xd7, 0x89, 0xb7, 0x8c, 0xa9, 0xed, 0xf9, 0x51, 0x19,
++ 0x31, 0x99, 0x2f, 0xd9, 0x27, 0xea, 0x98, 0x51, 0xb7, 0x71, 0x2f, 0xfd,
++ 0x6e, 0x7e, 0x40, 0xf7, 0x27, 0xf1, 0xef, 0x96, 0xbf, 0x46, 0x0f, 0x0e,
++ 0x29, 0x85, 0x75, 0xe2, 0x0b, 0xd7, 0x83, 0x2b, 0x62, 0x2e, 0x8e, 0x6f,
++ 0x8f, 0xcd, 0xf7, 0x8b, 0x88, 0x71, 0x88, 0x39, 0x23, 0xb3, 0xfc, 0x5b,
++ 0x12, 0xf6, 0x38, 0xc9, 0x17, 0x15, 0x1c, 0x6b, 0x98, 0xe5, 0xef, 0x4e,
++ 0x7b, 0xb1, 0x9d, 0xf1, 0xb8, 0xc4, 0x68, 0xc0, 0x23, 0x69, 0x15, 0xb7,
++ 0xdd, 0xef, 0xc5, 0x5a, 0x72, 0xd1, 0x8d, 0x7d, 0xdf, 0x80, 0x71, 0xa9,
++ 0x13, 0xb7, 0xd2, 0xfe, 0xd6, 0xf5, 0x15, 0xdb, 0x39, 0xc8, 0xfa, 0x3e,
++ 0x27, 0xea, 0x2f, 0xad, 0x40, 0xbc, 0xa6, 0x18, 0xdf, 0x37, 0x1d, 0xcc,
++ 0x7b, 0xca, 0x30, 0x64, 0x63, 0xa2, 0xe4, 0xb2, 0x82, 0x73, 0xa2, 0x37,
++ 0x87, 0xbd, 0x2e, 0xf9, 0xf1, 0x58, 0xfe, 0x5b, 0x2b, 0x5b, 0xb3, 0xdd,
++ 0xc6, 0x5f, 0x47, 0xc4, 0xb4, 0xe3, 0x25, 0x90, 0xe3, 0x69, 0x5d, 0xe7,
++ 0x3d, 0x57, 0x6e, 0x51, 0xe6, 0x44, 0x02, 0x13, 0x8b, 0x15, 0x07, 0xc2,
++ 0x81, 0x8a, 0x58, 0x65, 0x24, 0x8c, 0x65, 0x99, 0x2e, 0x9f, 0xcf, 0x7e,
++ 0x56, 0x1d, 0xc1, 0xe9, 0x45, 0x26, 0x73, 0x60, 0x38, 0x97, 0x51, 0xf7,
++ 0x4d, 0xd4, 0xeb, 0x66, 0xf3, 0x0f, 0x56, 0xd6, 0xf6, 0x7b, 0x37, 0x62,
++ 0x9a, 0x65, 0xad, 0xa3, 0x7e, 0x1d, 0xd4, 0xe3, 0xcf, 0xf2, 0xfa, 0x15,
++ 0x9d, 0x96, 0x8d, 0xfd, 0xde, 0x3a, 0x46, 0xfd, 0xba, 0xd9, 0x9e, 0x9b,
++ 0xed, 0x95, 0x8c, 0x9d, 0xaf, 0xe7, 0x62, 0xca, 0xb3, 0xcc, 0x96, 0xa1,
++ 0x52, 0x9e, 0xf5, 0xf9, 0xa3, 0x4a, 0x01, 0xb7, 0xff, 0xd4, 0x98, 0x5e,
++ 0x99, 0x92, 0x83, 0x88, 0xfe, 0xfd, 0xd4, 0xbf, 0x60, 0xb8, 0xcc, 0x41,
++ 0xbd, 0xac, 0xfb, 0xf4, 0x02, 0xa3, 0x4c, 0xd6, 0x15, 0x4c, 0x33, 0x22,
++ 0xf8, 0x76, 0x8b, 0x07, 0x6f, 0x26, 0xca, 0xed, 0x71, 0x5f, 0x3a, 0xd7,
++ 0xb2, 0x1e, 0x0f, 0xf9, 0xf1, 0x73, 0xa3, 0x2e, 0xbc, 0x40, 0xd5, 0x31,
++ 0xa9, 0x79, 0x91, 0x20, 0xce, 0x76, 0xa5, 0x66, 0x73, 0xbe, 0xbc, 0xd8,
++ 0x92, 0xc2, 0x46, 0xda, 0x93, 0xdf, 0x11, 0x01, 0xde, 0x48, 0x18, 0xc1,
++ 0xcd, 0xec, 0x7f, 0xd8, 0xdb, 0x40, 0xfe, 0xad, 0x36, 0x91, 0xaa, 0xc5,
++ 0x4b, 0x22, 0x46, 0x7c, 0x2b, 0xfe, 0xc3, 0x1a, 0x22, 0xce, 0x17, 0x85,
++ 0x64, 0x6d, 0x6e, 0x0e, 0x8e, 0x6b, 0x0e, 0x3c, 0x1b, 0x9c, 0x8e, 0x28,
++ 0xdd, 0xb1, 0xcc, 0x78, 0xcb, 0xfa, 0xa1, 0x57, 0xfa, 0x91, 0xb1, 0xfc,
++ 0x86, 0xe3, 0x50, 0x6c, 0x2c, 0xdc, 0x92, 0x6a, 0xa0, 0xbe, 0x2f, 0xec,
++ 0xff, 0xdf, 0xad, 0x49, 0xaf, 0xf4, 0xcf, 0x5c, 0x9e, 0xf1, 0xec, 0xc8,
++ 0x1f, 0xc5, 0xee, 0x97, 0xac, 0xe7, 0xec, 0x36, 0x17, 0xb9, 0x73, 0x71,
++ 0x50, 0xda, 0xfb, 0x17, 0x8e, 0x4f, 0xda, 0x2c, 0xf4, 0x23, 0x7a, 0xcb,
++ 0xba, 0xc5, 0x9f, 0xb7, 0xa4, 0x44, 0x7f, 0x82, 0x57, 0xc7, 0x2c, 0x4c,
++ 0x97, 0xf3, 0x87, 0xed, 0xb2, 0x71, 0xea, 0xab, 0x8b, 0x36, 0xc4, 0xd8,
++ 0xcb, 0x3c, 0x4e, 0x76, 0x51, 0x68, 0x76, 0x9e, 0xb6, 0x89, 0xdc, 0x7e,
++ 0xc8, 0x5b, 0x89, 0x2d, 0x26, 0xed, 0xce, 0x50, 0x2f, 0x76, 0x42, 0x72,
++ 0x53, 0x39, 0x77, 0x61, 0xd2, 0xeb, 0xc0, 0x56, 0xd3, 0x89, 0x76, 0x43,
++ 0xd5, 0xe5, 0xba, 0x23, 0x24, 0xe7, 0x2e, 0xf8, 0x6b, 0x14, 0x6c, 0x0f,
++ 0xab, 0x58, 0x6f, 0x74, 0xf9, 0xe5, 0xfa, 0x92, 0x90, 0x9c, 0x2b, 0x58,
++ 0x43, 0x9d, 0xc4, 0x35, 0x05, 0x1b, 0x0c, 0x79, 0xbe, 0x98, 0xe3, 0xbe,
++ 0x31, 0x58, 0xd6, 0x76, 0xb3, 0xf1, 0x8a, 0x32, 0x48, 0x9c, 0x17, 0x2e,
++ 0xf7, 0xde, 0xcd, 0xf3, 0x03, 0x71, 0x12, 0x31, 0x3d, 0x56, 0x42, 0x3f,
++ 0xdd, 0xd2, 0x37, 0x87, 0xf5, 0x14, 0x72, 0x1c, 0xa7, 0x6f, 0x1b, 0x24,
++ 0x7e, 0x06, 0xfc, 0x3f, 0x65, 0xf2, 0x34, 0xe4, 0x9d, 0x47, 0xcd, 0x1a,
++ 0xfe, 0x93, 0x9c, 0xb7, 0x4a, 0xc3, 0xb9, 0xf1, 0x07, 0xd0, 0xdb, 0x4b,
++ 0x94, 0x79, 0xc1, 0x0a, 0xe6, 0x00, 0x71, 0xe2, 0xfb, 0xc8, 0x98, 0x13,
++ 0x9b, 0x53, 0x86, 0xb6, 0xcf, 0xe6, 0x6e, 0x4e, 0xea, 0xc2, 0xc9, 0x1c,
++ 0x3f, 0xa0, 0x4d, 0x28, 0x85, 0xf3, 0x39, 0x82, 0x0d, 0xe4, 0xe2, 0x82,
++ 0x6f, 0x71, 0xeb, 0xc9, 0x06, 0x49, 0xdb, 0xdc, 0xfe, 0x58, 0xda, 0xc3,
++ 0x43, 0xe3, 0xe1, 0xf5, 0xaf, 0x4d, 0xfb, 0xfc, 0x6b, 0xd2, 0xf0, 0xb7,
++ 0xa5, 0x0b, 0x76, 0x59, 0xf0, 0x6d, 0xc1, 0x36, 0x8b, 0x7c, 0x33, 0x97,
++ 0x73, 0x75, 0x49, 0x4e, 0x03, 0x79, 0x3e, 0xf6, 0xde, 0xcd, 0x4f, 0xd1,
++ 0xd6, 0x5d, 0xe4, 0xf2, 0x5b, 0x8d, 0x78, 0x54, 0x9e, 0xd7, 0x19, 0x21,
++ 0xdd, 0x57, 0xa4, 0xf8, 0xb1, 0xa5, 0xfe, 0x77, 0x9c, 0x4f, 0x72, 0xdc,
++ 0xf4, 0xa7, 0x4a, 0x72, 0xf3, 0x21, 0x7e, 0x26, 0x18, 0xe0, 0x67, 0x1e,
++ 0xe4, 0xf3, 0x77, 0xb1, 0x9f, 0x4d, 0xe9, 0xa9, 0x3e, 0xa0, 0xe0, 0x1a,
++ 0xb6, 0xd5, 0x18, 0x82, 0x73, 0x69, 0xfd, 0x7f, 0x59, 0x59, 0xef, 0xd4,
++ 0x7d, 0x11, 0x20, 0x87, 0x80, 0xb3, 0xad, 0x5e, 0xce, 0x15, 0x34, 0x86,
++ 0xe5, 0x5c, 0x41, 0x9b, 0x91, 0x93, 0x4f, 0x7c, 0xb7, 0x9b, 0xb8, 0x7d,
++ 0xee, 0xfc, 0x42, 0x2c, 0x32, 0x71, 0x7b, 0x0a, 0xb1, 0xa2, 0x88, 0x60,
++ 0x91, 0xdb, 0xff, 0x5c, 0xba, 0x9e, 0x5c, 0x5c, 0x9e, 0x7f, 0xbb, 0x39,
++ 0xe7, 0x1e, 0xff, 0xb3, 0xe9, 0x2b, 0x71, 0xdb, 0xae, 0x30, 0xda, 0x77,
++ 0xc9, 0x86, 0x23, 0xe6, 0x60, 0xa1, 0x80, 0x7f, 0x14, 0x9a, 0xff, 0x38,
++ 0x75, 0x72, 0x94, 0x72, 0x1e, 0x3b, 0x4f, 0x4e, 0xd1, 0x21, 0xfc, 0x77,
++ 0x24, 0xdc, 0x48, 0x87, 0xde, 0xb7, 0xe2, 0x36, 0xe7, 0xf0, 0xfa, 0xef,
++ 0x4c, 0xf8, 0x91, 0xb5, 0xb9, 0xe7, 0xbf, 0xbb, 0x25, 0x47, 0xec, 0x49,
++ 0xc5, 0xa3, 0x4c, 0x79, 0xf3, 0xf3, 0xab, 0x87, 0x65, 0x6e, 0xdf, 0x48,
++ 0xc8, 0xbd, 0xe8, 0x37, 0x54, 0xe8, 0x7e, 0x95, 0xb1, 0xb4, 0xdf, 0x14,
++ 0xfb, 0xb5, 0xec, 0x67, 0xfb, 0xac, 0x18, 0xf7, 0x44, 0x02, 0xad, 0xf5,
++ 0xbc, 0xae, 0x2d, 0x40, 0xac, 0x8a, 0x7a, 0x2a, 0x35, 0xbc, 0xfe, 0xba,
++ 0x71, 0x9f, 0xdf, 0x1c, 0x87, 0xff, 0x92, 0xf1, 0xa9, 0x22, 0x90, 0xa3,
++ 0xab, 0x1f, 0x87, 0x05, 0x5e, 0xff, 0xba, 0xc4, 0x1c, 0xa8, 0x91, 0xb8,
++ 0xb5, 0xa4, 0xe1, 0xb4, 0x35, 0x27, 0x62, 0x64, 0x8f, 0x51, 0x86, 0xf7,
++ 0x2f, 0xd7, 0xe3, 0x33, 0x1d, 0x47, 0xef, 0xd5, 0xa6, 0xf4, 0xf1, 0x5e,
++ 0xe8, 0xff, 0x6f, 0x1f, 0x85, 0x38, 0x47, 0x7b, 0x68, 0x90, 0x31, 0x48,
++ 0xbc, 0x2b, 0x62, 0xce, 0x29, 0x63, 0xf9, 0x54, 0xe1, 0xb9, 0x47, 0x7e,
++ 0x5c, 0x0a, 0xe7, 0x1a, 0x36, 0x0f, 0xce, 0xc5, 0x30, 0xcb, 0xea, 0x36,
++ 0x7c, 0xf9, 0xe7, 0x67, 0x9c, 0xb3, 0xcc, 0xd1, 0x2b, 0x9c, 0x58, 0x4c,
++ 0x3f, 0x68, 0xfc, 0x4b, 0x27, 0xa2, 0xbe, 0x62, 0xc6, 0x56, 0x59, 0x17,
++ 0x3a, 0x5e, 0x3f, 0x69, 0x4d, 0x18, 0xf5, 0x68, 0xcc, 0xc8, 0xf3, 0x4c,
++ 0x07, 0xed, 0xdb, 0xc2, 0x23, 0xa6, 0xdc, 0x17, 0x9c, 0x89, 0xc7, 0x1c,
++ 0xb4, 0x15, 0xb7, 0xa1, 0xb7, 0xfe, 0xbd, 0x52, 0x81, 0xd2, 0x88, 0x33,
++ 0x38, 0x01, 0x3d, 0xbc, 0x5e, 0xa1, 0x1f, 0x56, 0xcd, 0x33, 0x65, 0x0a,
++ 0xde, 0x4e, 0x04, 0xcc, 0x40, 0x3e, 0x2e, 0x9d, 0xe2, 0xdc, 0xbd, 0x93,
++ 0x30, 0xda, 0x9f, 0xca, 0x9f, 0xff, 0x22, 0x3d, 0x35, 0xa7, 0x15, 0x7b,
++ 0x74, 0xbb, 0x37, 0x25, 0xf0, 0x9e, 0xa3, 0x01, 0xef, 0xed, 0x31, 0x8b,
++ 0x98, 0x8b, 0x89, 0x9d, 0xba, 0xdd, 0x5b, 0x12, 0x98, 0x74, 0xf2, 0xda,
++ 0x29, 0x73, 0x36, 0x31, 0x4d, 0xe5, 0xb5, 0xb0, 0xd8, 0x59, 0x4c, 0x63,
++ 0x7c, 0x2d, 0x8d, 0x78, 0xdd, 0xa5, 0xe3, 0xd0, 0x4a, 0x8c, 0x0a, 0xe6,
++ 0xba, 0x68, 0x72, 0x24, 0x75, 0x7f, 0xb3, 0xa3, 0x9e, 0x39, 0xaf, 0x5f,
++ 0x71, 0x19, 0xdf, 0x63, 0x5e, 0x2f, 0x6b, 0x61, 0x61, 0xda, 0xa4, 0x93,
++ 0x15, 0x76, 0x4c, 0x57, 0x23, 0x0a, 0xb1, 0xb0, 0x02, 0xb7, 0x6b, 0x1b,
++ 0x3e, 0xab, 0x46, 0xfa, 0x71, 0x7d, 0x83, 0xbb, 0xa9, 0x72, 0xbc, 0xa0,
++ 0x13, 0xc4, 0x3c, 0x11, 0xe6, 0x25, 0x06, 0xd4, 0xf2, 0x88, 0xe8, 0xc6,
++ 0xdf, 0x94, 0x1c, 0x13, 0x59, 0x35, 0x77, 0xdf, 0xd8, 0x3b, 0x25, 0x28,
++ 0x0d, 0x13, 0xab, 0x7e, 0xe2, 0xfb, 0xef, 0xd5, 0x3b, 0x5a, 0x22, 0x78,
++ 0xef, 0x32, 0xe4, 0xbf, 0x6d, 0x5b, 0x6e, 0x77, 0xe4, 0x83, 0x98, 0x3b,
++ 0x60, 0x59, 0x8c, 0x93, 0x3e, 0x28, 0xb3, 0x39, 0x1e, 0xfa, 0x1a, 0xe7,
++ 0x66, 0x4d, 0xfa, 0x0f, 0xd6, 0xe7, 0x9c, 0x36, 0x07, 0x70, 0x17, 0x47,
++ 0x3a, 0x6e, 0x79, 0xcb, 0xf8, 0xc0, 0x7a, 0x33, 0xc1, 0x5c, 0xd9, 0x90,
++ 0x67, 0x43, 0x73, 0xb0, 0xcd, 0x74, 0x36, 0x2f, 0x55, 0x14, 0xf4, 0x18,
++ 0xf3, 0xb4, 0x12, 0xc6, 0xa9, 0x6e, 0xfa, 0x75, 0xcc, 0x6b, 0x04, 0xf7,
++ 0x80, 0xe5, 0xd2, 0xeb, 0xd6, 0xb9, 0x22, 0x77, 0xde, 0x32, 0xd2, 0x20,
++ 0x58, 0x10, 0x6e, 0x7b, 0xca, 0x68, 0x41, 0x4f, 0x66, 0x10, 0xbd, 0x99,
++ 0x5c, 0x3f, 0x59, 0xcc, 0xf9, 0x98, 0x7e, 0xd6, 0xad, 0x2b, 0x8e, 0x08,
++ 0xf7, 0x3a, 0x73, 0xcb, 0x5e, 0x23, 0x8a, 0xcd, 0x99, 0x3b, 0x6f, 0x39,
++ 0xd5, 0xd0, 0xcf, 0xff, 0xb9, 0x3a, 0x43, 0xa8, 0xfc, 0xd8, 0x3a, 0x65,
++ 0x11, 0xe9, 0xa3, 0xe3, 0x96, 0xa7, 0x8c, 0x3b, 0x6f, 0x69, 0x5f, 0xf4,
++ 0x4d, 0x6c, 0xca, 0xb4, 0xff, 0xc9, 0x7e, 0xca, 0x59, 0xa7, 0x34, 0x72,
++ 0xa8, 0xed, 0x9a, 0xc0, 0x9d, 0xb7, 0xa4, 0x17, 0xf5, 0xb2, 0x8f, 0x55,
++ 0x8c, 0x2f, 0xb9, 0x3a, 0x51, 0xc6, 0xf6, 0x8f, 0xd3, 0x41, 0x49, 0x64,
++ 0xa2, 0x6d, 0x7e, 0xe0, 0x03, 0x6b, 0x5e, 0x5f, 0x91, 0xad, 0x03, 0x17,
++ 0x75, 0xf0, 0xa0, 0xe9, 0xcc, 0x06, 0x1c, 0xb6, 0x0e, 0x3a, 0x7c, 0xd4,
++ 0x41, 0x92, 0x3a, 0xc8, 0xd6, 0x18, 0xe1, 0x77, 0xa9, 0x83, 0x79, 0x63,
++ 0xeb, 0xd6, 0x95, 0x44, 0xe0, 0x74, 0x18, 0xaf, 0x3a, 0x9c, 0x9c, 0x0b,
++ 0x97, 0xb1, 0x8e, 0x7a, 0xbb, 0xf3, 0x96, 0x8b, 0x17, 0xd9, 0x3a, 0xff,
++ 0xb2, 0x3b, 0xb0, 0xc1, 0xde, 0x3b, 0xd7, 0x9d, 0x59, 0xc3, 0xa3, 0x99,
++ 0xc7, 0x7d, 0x3c, 0x7a, 0x98, 0xb3, 0xdc, 0x4c, 0x5d, 0x35, 0x71, 0x1c,
++ 0x2b, 0x28, 0xd7, 0x46, 0xfe, 0x6e, 0xe5, 0xef, 0x0e, 0xfe, 0x96, 0xf9,
++ 0x51, 0xcf, 0xca, 0x16, 0x3b, 0x2b, 0x9b, 0x83, 0xf2, 0x78, 0x88, 0x57,
++ 0x32, 0x26, 0xf7, 0x57, 0xae, 0x09, 0xc4, 0xd8, 0xc6, 0xfd, 0xa5, 0xb2,
++ 0x6f, 0xc8, 0x65, 0xc4, 0x7d, 0x4e, 0x88, 0x7c, 0x7a, 0x6b, 0x3b, 0xb2,
++ 0xc4, 0xde, 0xdf, 0xe7, 0xb0, 0x97, 0xb2, 0x55, 0x70, 0x7e, 0x5e, 0x58,
++ 0x34, 0x34, 0xc3, 0x63, 0xc0, 0xe7, 0x36, 0xe2, 0xcc, 0xf9, 0x13, 0xd4,
++ 0x81, 0xd8, 0xc9, 0x3d, 0xd4, 0x5f, 0x27, 0xeb, 0x1c, 0x65, 0x2c, 0xdb,
++ 0xcd, 0xfe, 0xed, 0xf5, 0xdb, 0xb0, 0xfd, 0x9c, 0x0c, 0xba, 0x79, 0x9c,
++ 0xed, 0xed, 0x35, 0x7e, 0x53, 0x76, 0xb4, 0x5e, 0xf6, 0x53, 0x3a, 0x31,
++ 0x6c, 0xcf, 0xbb, 0x42, 0x2e, 0x73, 0x11, 0x79, 0x82, 0x65, 0xfd, 0xd4,
++ 0x68, 0x9c, 0xef, 0xb0, 0xed, 0xea, 0x50, 0x9b, 0x3b, 0xe0, 0xc6, 0x90,
++ 0xbd, 0x06, 0x6e, 0x59, 0x45, 0xb6, 0x7d, 0x89, 0x2c, 0x75, 0xcd, 0x9b,
++ 0x68, 0x78, 0xeb, 0xd2, 0x1f, 0x90, 0x27, 0x8a, 0xfc, 0x73, 0x70, 0x92,
++ 0x31, 0x35, 0xaa, 0xc5, 0xdb, 0x45, 0xd6, 0x32, 0xc3, 0x19, 0xbe, 0x16,
++ 0xf1, 0x16, 0x27, 0xfb, 0x6b, 0x26, 0xa7, 0x3c, 0x95, 0xc7, 0xee, 0x7d,
++ 0x69, 0x3d, 0xb6, 0x5f, 0xc9, 0xf1, 0xd3, 0xde, 0xb1, 0x42, 0xfc, 0x09,
++ 0x92, 0xcf, 0x7a, 0xe0, 0x8c, 0xe8, 0xfe, 0x26, 0x47, 0x57, 0xd0, 0x05,
++ 0xfa, 0x58, 0xa9, 0xc8, 0x1b, 0xa7, 0xec, 0x82, 0xc7, 0x6e, 0x6d, 0x8d,
++ 0x8d, 0xd1, 0xf1, 0xf9, 0x2e, 0x78, 0xb4, 0xb5, 0xe9, 0x42, 0xec, 0xf2,
++ 0x68, 0x6d, 0x09, 0xf1, 0x77, 0x59, 0xab, 0x0f, 0xdb, 0xdc, 0xe3, 0x48,
++ 0xe6, 0xa5, 0x52, 0xd9, 0x8b, 0x47, 0xdf, 0xaf, 0x70, 0x1a, 0xb9, 0x76,
++ 0x35, 0xb6, 0xdb, 0xe2, 0xd0, 0x70, 0xce, 0x77, 0x75, 0xad, 0xc5, 0x21,
++ 0xfb, 0x5f, 0x89, 0x4a, 0xe9, 0x7c, 0xbd, 0x1c, 0x7e, 0x2d, 0x76, 0xd9,
++ 0xf8, 0xc5, 0x36, 0x4a, 0x81, 0x25, 0x89, 0x0b, 0xfb, 0x97, 0xfe, 0xa4,
++ 0xdf, 0xae, 0x2a, 0x15, 0x13, 0xf6, 0xb3, 0x92, 0x83, 0x99, 0x18, 0x06,
++ 0x53, 0x53, 0xf7, 0xe8, 0xe9, 0x87, 0xd8, 0xfe, 0x81, 0x38, 0xe7, 0x69,
++ 0xb6, 0x21, 0xfb, 0xf7, 0x64, 0xcf, 0xde, 0xd4, 0xfd, 0x7a, 0x22, 0x5b,
++ 0x65, 0x19, 0x81, 0x0d, 0x7b, 0x89, 0x7f, 0xd1, 0x16, 0xa9, 0x6f, 0x59,
++ 0xaf, 0xcd, 0x0b, 0x22, 0x3b, 0xcd, 0x89, 0xc1, 0xb9, 0xc0, 0x40, 0x52,
++ 0xf6, 0x53, 0x9d, 0x89, 0xad, 0x66, 0x1e, 0x19, 0xad, 0xae, 0xd3, 0xba,
++ 0x55, 0xd9, 0x0b, 0xf5, 0xc1, 0x97, 0x7b, 0x8c, 0x5a, 0xad, 0x47, 0xcd,
++ 0xee, 0x67, 0x7c, 0xd9, 0x0d, 0xcc, 0x2e, 0x13, 0x0c, 0xa8, 0x32, 0xa2,
++ 0xbd, 0x55, 0x98, 0x0b, 0x7f, 0xb5, 0x8d, 0xcb, 0xf1, 0x6f, 0xab, 0x46,
++ 0x70, 0xa5, 0xf0, 0x4a, 0xf5, 0x7d, 0x6b, 0x88, 0xdc, 0xe4, 0xee, 0xb9,
++ 0xff, 0xa7, 0x34, 0xbf, 0xee, 0xd4, 0x3e, 0x9d, 0xf3, 0xf2, 0xf3, 0x05,
++ 0xba, 0x3f, 0xad, 0x88, 0x8e, 0x84, 0x4b, 0x25, 0xb0, 0x95, 0x71, 0xf6,
++ 0xbf, 0xe6, 0x46, 0xb0, 0x8f, 0xff, 0x7f, 0x76, 0xa5, 0xec, 0x4d, 0xb5,
++ 0xac, 0x60, 0x60, 0x5e, 0xb8, 0x8a, 0x63, 0x78, 0x96, 0xf7, 0x7b, 0x33,
++ 0x6f, 0x59, 0xa7, 0xa6, 0x1b, 0xfd, 0xcb, 0x18, 0xec, 0x06, 0xc6, 0x75,
++ 0x6d, 0x52, 0xfd, 0xef, 0xee, 0x95, 0x83, 0xbb, 0x82, 0x63, 0xf9, 0x7e,
++ 0xa0, 0x4e, 0x4b, 0xaa, 0xa5, 0x65, 0xa2, 0xd7, 0x81, 0xf1, 0x57, 0xa6,
++ 0x3c, 0x3b, 0x28, 0xf0, 0x59, 0x7b, 0x5d, 0xa5, 0x77, 0x88, 0xbe, 0x3e,
++ 0xa4, 0x45, 0xe3, 0xd4, 0xbb, 0x7b, 0x1a, 0xc7, 0x7c, 0xf7, 0xdc, 0x2f,
++ 0xd9, 0xe3, 0xac, 0x36, 0x66, 0x72, 0x8c, 0x0a, 0xb4, 0xb9, 0xff, 0x99,
++ 0x5f, 0x7f, 0x6d, 0x24, 0xfb, 0x1a, 0xb2, 0x9a, 0xe8, 0x1b, 0x45, 0xac,
++ 0x73, 0xb5, 0xf9, 0xf0, 0x8c, 0xae, 0x7a, 0xdd, 0x77, 0x37, 0x6d, 0x34,
++ 0x34, 0xf7, 0xd7, 0x16, 0x6d, 0xda, 0xfc, 0x16, 0x47, 0x7d, 0x5b, 0xc2,
++ 0x8e, 0x55, 0x9c, 0x57, 0x23, 0x3a, 0x57, 0x79, 0xc7, 0x42, 0x4d, 0x20,
++ 0x3c, 0xd7, 0x1e, 0x3f, 0x70, 0x6b, 0x3a, 0x81, 0x6d, 0x29, 0x69, 0x53,
++ 0xc1, 0xb2, 0xc0, 0xdb, 0x96, 0x7f, 0x7a, 0x02, 0x5b, 0x32, 0x9f, 0xc4,
++ 0x4d, 0x07, 0xc9, 0x8d, 0xf5, 0xd6, 0x38, 0xf4, 0x68, 0xee, 0xd9, 0xd4,
++ 0x1c, 0x59, 0xdb, 0x96, 0xbd, 0x45, 0xb7, 0x24, 0x02, 0x70, 0x97, 0x13,
++ 0x83, 0xc7, 0x02, 0xf2, 0x2c, 0xd3, 0x8b, 0x6c, 0x8b, 0x94, 0xa9, 0xd5,
++ 0xc6, 0x90, 0x25, 0x73, 0x94, 0xb5, 0xd0, 0xfe, 0xb2, 0xdc, 0x3e, 0x09,
++ 0x1a, 0x5e, 0x8d, 0xae, 0xbd, 0x41, 0xae, 0xd7, 0x6c, 0x48, 0x1b, 0x0a,
++ 0xe6, 0x07, 0xa6, 0xa1, 0x6e, 0xe5, 0xab, 0xaf, 0x17, 0x05, 0x8a, 0x18,
++ 0x4f, 0xc4, 0xb7, 0x8c, 0x8d, 0xc7, 0xf0, 0x1b, 0x62, 0x90, 0xec, 0x19,
++ 0x4b, 0x4a, 0x3d, 0xb6, 0x35, 0x17, 0x69, 0xf1, 0x53, 0x43, 0xf6, 0x2f,
++ 0x5b, 0xd6, 0x35, 0x81, 0x37, 0xad, 0x68, 0x0d, 0xe5, 0x21, 0x5f, 0xcb,
++ 0xd5, 0x95, 0x32, 0xf9, 0xbd, 0x40, 0x4a, 0xe3, 0x2d, 0xa2, 0x93, 0x27,
++ 0xcd, 0x38, 0xb3, 0x01, 0xc1, 0xfd, 0x0f, 0x62, 0x6f, 0x19, 0x8a, 0xfd,
++ 0x8c, 0x71, 0x99, 0x52, 0xc9, 0x38, 0xea, 0xf4, 0x8f, 0xd8, 0xeb, 0x05,
++ 0x1d, 0xc4, 0x68, 0xe1, 0x97, 0x92, 0xf3, 0x39, 0xf1, 0x94, 0x51, 0x85,
++ 0x27, 0xb5, 0x1c, 0x57, 0x23, 0xd6, 0xe1, 0x07, 0x89, 0x79, 0x59, 0x7a,
++ 0x08, 0x39, 0xaf, 0xd1, 0x7e, 0x46, 0xf9, 0x0d, 0xfd, 0x1c, 0x78, 0x21,
++ 0xbd, 0x11, 0x0f, 0xca, 0x1a, 0xa2, 0x52, 0xdb, 0x5c, 0xe7, 0x90, 0xfe,
++ 0x36, 0x62, 0x6b, 0x46, 0xda, 0xfa, 0x20, 0xb6, 0xd7, 0xd8, 0x9d, 0x97,
++ 0x55, 0xb0, 0xfc, 0x83, 0xd8, 0x53, 0xc6, 0xe3, 0xf6, 0xdc, 0xc9, 0x73,
++ 0xaf, 0x5e, 0x53, 0x30, 0xaf, 0x14, 0x2a, 0xf3, 0x06, 0x87, 0x71, 0x33,
++ 0x1c, 0x55, 0xdf, 0xa4, 0xed, 0xc9, 0xbe, 0x9a, 0xaf, 0xc2, 0x59, 0xe5,
++ 0xa2, 0x6f, 0xde, 0x0a, 0x57, 0x95, 0x70, 0xf5, 0x02, 0x8f, 0x8e, 0xf2,
++ 0xbe, 0xe8, 0x36, 0xdc, 0x26, 0xba, 0x75, 0x12, 0x87, 0x7a, 0x24, 0xaf,
++ 0x33, 0x2a, 0xa9, 0x23, 0xbd, 0x95, 0x9c, 0x1e, 0xe5, 0xc4, 0x4c, 0xc6,
++ 0x47, 0x37, 0xf3, 0xb7, 0xb6, 0x77, 0xa9, 0xf7, 0x79, 0x7d, 0x65, 0xe4,
++ 0xf0, 0x96, 0xf5, 0x3e, 0x39, 0xfc, 0xfc, 0x40, 0x5d, 0xd6, 0x20, 0x4e,
++ 0xe1, 0x06, 0xbd, 0x39, 0x4e, 0xbc, 0x59, 0x6d, 0x9c, 0xb1, 0x62, 0xab,
++ 0xa4, 0x8c, 0xee, 0x8b, 0x29, 0x85, 0x3e, 0x16, 0xc0, 0x3f, 0xcd, 0x82,
++ 0x2b, 0x22, 0xcf, 0x14, 0x64, 0xbd, 0xb8, 0x51, 0x9e, 0xf5, 0xb5, 0xc8,
++ 0xf8, 0x5d, 0xb2, 0xee, 0x86, 0xe8, 0x84, 0x0b, 0x46, 0x76, 0x9f, 0xcc,
++ 0xd9, 0x0c, 0x0b, 0x81, 0x85, 0xbf, 0x67, 0x2e, 0x24, 0xf3, 0x53, 0x9b,
++ 0xad, 0x57, 0xb2, 0x41, 0x1f, 0x39, 0xfd, 0xa3, 0xd0, 0x5b, 0x12, 0xd4,
++ 0x75, 0x53, 0x48, 0x9e, 0xdf, 0x3b, 0x7d, 0x09, 0xd8, 0x3c, 0xde, 0x3c,
++ 0x89, 0xcf, 0xa1, 0x9c, 0xb9, 0xeb, 0xdc, 0xb1, 0x15, 0xa8, 0xa8, 0x8a,
++ 0xfa, 0x4a, 0x71, 0x19, 0xcf, 0xd7, 0x30, 0x3f, 0xf9, 0x22, 0x2a, 0x56,
++ 0xb6, 0x22, 0xc1, 0xb1, 0x97, 0x1b, 0x7f, 0xc5, 0x6b, 0xf7, 0x21, 0x99,
++ 0x72, 0x71, 0x1c, 0x3f, 0xb1, 0x2a, 0x6a, 0x44, 0x36, 0xd3, 0x5b, 0x66,
++ 0x30, 0x9f, 0xb6, 0x75, 0x41, 0xdc, 0x4e, 0x09, 0x47, 0xaa, 0x8b, 0xae,
++ 0x07, 0x73, 0xfb, 0x1a, 0xbd, 0x75, 0x8d, 0xd2, 0x41, 0x9b, 0xed, 0xa1,
++ 0xce, 0xa5, 0xac, 0x65, 0x2d, 0x0f, 0x9c, 0xa6, 0x8e, 0x3b, 0x78, 0x6e,
++ 0xf8, 0xdf, 0x84, 0x7a, 0x59, 0x31, 0x4e, 0x58, 0x71, 0xcd, 0x47, 0xbb,
++ 0x54, 0x57, 0x09, 0x9f, 0x5a, 0x1a, 0x7a, 0x8f, 0xf7, 0xb5, 0xbc, 0x9d,
++ 0x9e, 0xb9, 0x25, 0xa7, 0xcb, 0x30, 0x75, 0xf9, 0x6f, 0xf6, 0x75, 0x87,
++ 0x7d, 0xbd, 0x23, 0x7f, 0xfd, 0xcc, 0x2d, 0x3d, 0xc6, 0xcb, 0xbc, 0xde,
++ 0x4b, 0xdd, 0xab, 0x17, 0x49, 0xfd, 0x75, 0xa6, 0xd4, 0x67, 0x4a, 0x65,
++ 0xf4, 0xe4, 0xe7, 0xe3, 0x50, 0x7e, 0x3e, 0x26, 0xf2, 0x6d, 0x38, 0xd9,
++ 0x46, 0x3c, 0x5a, 0x0a, 0x13, 0x65, 0x01, 0xc1, 0x79, 0x91, 0x8b, 0x73,
++ 0x97, 0x11, 0xb9, 0xd6, 0x30, 0xde, 0x75, 0x3d, 0x53, 0x8a, 0x78, 0xc7,
++ 0x4c, 0xdb, 0x0e, 0xcf, 0xdc, 0x22, 0xfb, 0xde, 0xde, 0x52, 0x1a, 0x7d,
++ 0xb2, 0x65, 0x23, 0x45, 0x2e, 0x7b, 0xaf, 0xe9, 0x0c, 0xd7, 0x3b, 0xe6,
++ 0x65, 0x8b, 0x61, 0xc4, 0xce, 0x28, 0x2e, 0x8f, 0xe0, 0x43, 0x22, 0xdd,
++ 0xc8, 0xcc, 0x2b, 0x1e, 0x64, 0xce, 0x14, 0xcc, 0x50, 0xb7, 0x6d, 0x44,
++ 0xec, 0x43, 0xf6, 0xde, 0x37, 0xe7, 0xc4, 0x0a, 0x34, 0xea, 0x0e, 0xcc,
++ 0x0b, 0xcf, 0x64, 0xe6, 0x45, 0xbb, 0x34, 0x8b, 0x1d, 0xba, 0xff, 0x7a,
++ 0x2c, 0xb7, 0xeb, 0xed, 0x4b, 0x67, 0xdb, 0x4b, 0x39, 0xa7, 0x8f, 0x51,
++ 0x8e, 0x6d, 0x01, 0x91, 0xe3, 0x9b, 0x79, 0x39, 0x5a, 0x19, 0x4b, 0x4d,
++ 0xed, 0xda, 0x40, 0xef, 0x59, 0xbd, 0x3d, 0x63, 0xeb, 0xed, 0x3e, 0x9e,
++ 0x17, 0x33, 0xbf, 0x2f, 0xc2, 0xd1, 0x7a, 0x6f, 0x7e, 0x1f, 0x9b, 0xe4,
++ 0x6a, 0x82, 0xbf, 0x0d, 0x7f, 0xbd, 0xda, 0xd0, 0xc3, 0x0e, 0x9b, 0xd7,
++ 0xbb, 0x11, 0xb7, 0x39, 0xb3, 0x3c, 0xf3, 0xae, 0xc0, 0x23, 0x76, 0x39,
++ 0x17, 0x75, 0x52, 0x86, 0x47, 0xf3, 0xfe, 0x22, 0x7b, 0x0e, 0x1e, 0xb3,
++ 0x7f, 0xef, 0xe6, 0xdc, 0xba, 0xe8, 0xab, 0x85, 0x18, 0x25, 0xeb, 0xed,
++ 0xff, 0xc3, 0xf6, 0xfd, 0x21, 0x1c, 0xb7, 0xff, 0x67, 0x73, 0xf9, 0x16,
++ 0x7a, 0x4c, 0xd9, 0x3b, 0x53, 0x86, 0x6e, 0x7b, 0x0f, 0xb9, 0xac, 0x01,
++ 0x5c, 0x89, 0xcd, 0x9a, 0xac, 0x07, 0x93, 0xfb, 0x68, 0x62, 0x13, 0x9d,
++ 0x48, 0x6a, 0xa6, 0x37, 0x53, 0x3f, 0x35, 0x57, 0x32, 0xb1, 0xa7, 0xfe,
++ 0x03, 0x2b, 0x6a, 0xe7, 0x4f, 0x27, 0xac, 0xbd, 0xc6, 0xd1, 0x10, 0x3d,
++ 0xb8, 0xbd, 0xc8, 0xd6, 0x6f, 0xb8, 0xcd, 0xde, 0xff, 0x47, 0x99, 0x9f,
++ 0x49, 0x48, 0x1c, 0x9d, 0x83, 0xb4, 0x69, 0xc7, 0xe2, 0x96, 0xed, 0x9c,
++ 0x93, 0x9e, 0x54, 0x20, 0x7a, 0x09, 0xef, 0x4d, 0x30, 0x96, 0x75, 0x53,
++ 0x9f, 0xb1, 0x16, 0xe1, 0x67, 0x6b, 0xb0, 0x9b, 0x36, 0x36, 0x6e, 0x5a,
++ 0xd6, 0x3e, 0x62, 0x44, 0xe5, 0x3c, 0x15, 0xd9, 0x9a, 0x35, 0x48, 0x31,
++ 0x36, 0xed, 0x33, 0x1a, 0x3f, 0x57, 0x84, 0xb8, 0xdf, 0x0d, 0xdd, 0xb7,
++ 0x85, 0xa3, 0xb9, 0x97, 0xf3, 0x75, 0xd4, 0x14, 0xde, 0xe8, 0x3c, 0xb3,
++ 0x14, 0x46, 0x78, 0xb1, 0xe3, 0x27, 0xd6, 0xa4, 0xfd, 0xec, 0xb8, 0xeb,
++ 0x5f, 0x28, 0xc3, 0x46, 0x71, 0xde, 0x4a, 0xce, 0xf1, 0xbb, 0x01, 0x79,
++ 0x7e, 0x0d, 0xd4, 0xf5, 0x35, 0xb6, 0x8b, 0x0c, 0x7b, 0x43, 0xce, 0xd8,
++ 0x3e, 0x04, 0x5a, 0x36, 0x28, 0xe7, 0x72, 0x83, 0x4b, 0xc6, 0x4c, 0x8c,
++ 0xd6, 0x3f, 0x4b, 0x1e, 0x23, 0xf5, 0x8b, 0xf1, 0x84, 0xf9, 0xb4, 0x55,
++ 0x3b, 0xe3, 0xfb, 0xd6, 0x7e, 0x43, 0x5d, 0x4f, 0x6d, 0xc7, 0xca, 0xd9,
++ 0x56, 0x19, 0xdb, 0xba, 0x3d, 0xa0, 0x9b, 0xdb, 0xd9, 0xd6, 0xf1, 0xc4,
++ 0xd1, 0xa0, 0x9b, 0x6d, 0x3d, 0x6a, 0x4a, 0x6e, 0xe0, 0x6c, 0x6e, 0xe6,
++ 0xdc, 0x76, 0xa5, 0x02, 0xbe, 0xad, 0x94, 0x4b, 0xf2, 0xb7, 0xaf, 0x26,
++ 0xe4, 0x5d, 0x8f, 0x6f, 0x72, 0x3c, 0xd1, 0x8d, 0x2e, 0x34, 0xde, 0x5b,
++ 0x41, 0xfb, 0xa9, 0x44, 0xc1, 0xd6, 0x75, 0x1f, 0xf1, 0x0e, 0xb7, 0xb3,
++ 0xcc, 0xeb, 0x81, 0x39, 0x78, 0x21, 0xd4, 0xb8, 0x72, 0x0e, 0x9c, 0xe4,
++ 0x21, 0x81, 0xe6, 0x0d, 0x4a, 0x5c, 0x13, 0x5b, 0xbc, 0x2d, 0xad, 0x07,
++ 0x9b, 0x20, 0xd8, 0xdd, 0x4a, 0x7d, 0xcc, 0xc1, 0xfb, 0x0b, 0x45, 0x2e,
++ 0x67, 0x38, 0xe8, 0x08, 0x74, 0x3c, 0xcd, 0xf9, 0xad, 0x98, 0x97, 0xcb,
++ 0x53, 0x33, 0xf6, 0x7e, 0xcd, 0x56, 0x24, 0x33, 0x27, 0xde, 0xdd, 0x6b,
++ 0xc0, 0x79, 0xa8, 0xfe, 0x41, 0x0b, 0xf6, 0xbb, 0x21, 0x8d, 0x32, 0x0f,
++ 0xad, 0x32, 0x0f, 0xa5, 0xf4, 0xa7, 0x6b, 0x28, 0xf7, 0x7a, 0x5b, 0xee,
++ 0x39, 0x18, 0x36, 0x65, 0xfd, 0xcb, 0xa9, 0xdd, 0x86, 0x5e, 0x62, 0x67,
++ 0xe0, 0x4c, 0x17, 0xfb, 0x79, 0x9d, 0x32, 0xcf, 0xa3, 0xde, 0x27, 0x5b,
++ 0x84, 0xb7, 0xde, 0x87, 0xbe, 0x54, 0xe1, 0xdd, 0x11, 0x05, 0xe9, 0x80,
++ 0xf4, 0x71, 0x1f, 0x79, 0x5c, 0x97, 0x35, 0x59, 0x23, 0xd7, 0x77, 0x33,
++ 0xf7, 0x8f, 0x6a, 0xf4, 0x07, 0xea, 0x1d, 0xfa, 0x1c, 0xe8, 0x13, 0x6f,
++ 0x38, 0xa2, 0xf4, 0x01, 0xd3, 0x7b, 0x86, 0xd8, 0x70, 0x08, 0x1d, 0x16,
++ 0xaa, 0x6c, 0x7b, 0xf8, 0xd9, 0x88, 0xf1, 0xa1, 0x22, 0xb1, 0x3d, 0x4b,
++ 0x1d, 0xa8, 0x9c, 0x13, 0xd1, 0x41, 0x39, 0x7d, 0x76, 0x2c, 0xa0, 0xfb,
++ 0x5f, 0xa0, 0x3c, 0xdb, 0x29, 0xcf, 0x8a, 0xdc, 0x1c, 0xfa, 0x36, 0x2b,
++ 0xe2, 0xd3, 0x81, 0x96, 0xd5, 0xbc, 0xbe, 0x8d, 0xf2, 0x04, 0xfa, 0x14,
++ 0x0c, 0xb5, 0xf4, 0x90, 0x2b, 0x76, 0x50, 0x07, 0xe7, 0xe4, 0x71, 0xdb,
++ 0x73, 0xd6, 0x41, 0x2e, 0x50, 0x8c, 0xbd, 0xa6, 0xe0, 0xb7, 0x86, 0x61,
++ 0xda, 0xe9, 0x1e, 0xce, 0x48, 0xd4, 0xab, 0xa2, 0xd8, 0x10, 0x0c, 0xa8,
++ 0xe1, 0x35, 0x17, 0xe7, 0xa6, 0x12, 0xfb, 0xb5, 0xdd, 0xf6, 0x5e, 0xe5,
++ 0x1c, 0xb7, 0xfb, 0x83, 0x35, 0xea, 0x15, 0x7e, 0x26, 0xeb, 0x63, 0xb2,
++ 0x86, 0xd4, 0xeb, 0xc9, 0xed, 0xd7, 0x72, 0x51, 0x27, 0xb9, 0xeb, 0xcf,
++ 0x68, 0xc2, 0x7d, 0x0b, 0xe5, 0x7f, 0x69, 0x3d, 0x69, 0x97, 0x97, 0x72,
++ 0x2e, 0x9b, 0xa3, 0x97, 0xda, 0xe5, 0x7e, 0x69, 0x3d, 0xab, 0x39, 0xa7,
++ 0x94, 0x2b, 0x3c, 0x2f, 0x3c, 0xfa, 0x0d, 0x27, 0x31, 0xaf, 0x78, 0xee,
++ 0x62, 0x1c, 0x33, 0x4e, 0xd4, 0x9e, 0xac, 0xef, 0x64, 0x1c, 0x9b, 0xba,
++ 0x7f, 0xcb, 0xc2, 0xe3, 0x76, 0x1e, 0xde, 0x45, 0x3e, 0x7b, 0x74, 0x47,
++ 0x11, 0x84, 0xa3, 0xca, 0xfa, 0x5d, 0x73, 0xd9, 0xb9, 0x5c, 0x56, 0xf6,
++ 0x35, 0x5d, 0x66, 0x73, 0xc3, 0xa8, 0x2a, 0xb8, 0xfb, 0x49, 0x7b, 0xf8,
++ 0x84, 0xbb, 0x74, 0x62, 0x8f, 0x51, 0xe0, 0x2c, 0x47, 0x1f, 0x54, 0x89,
++ 0x93, 0x03, 0xe6, 0x62, 0x89, 0xcd, 0x7e, 0xd6, 0x0f, 0xc6, 0xd4, 0xa9,
++ 0xdc, 0xe6, 0x76, 0x0f, 0x2a, 0xba, 0xb6, 0x3a, 0x20, 0xfb, 0x47, 0x65,
++ 0x2f, 0xa8, 0xf4, 0x55, 0x92, 0x5f, 0x97, 0xfa, 0x38, 0xae, 0x51, 0xe8,
++ 0x4b, 0xf8, 0xc6, 0xfb, 0xa5, 0x85, 0x7d, 0x86, 0x51, 0x5b, 0xce, 0x5f,
++ 0x59, 0x2b, 0xb5, 0xec, 0x4c, 0x0d, 0xe7, 0xcb, 0x1e, 0xcd, 0xcb, 0x1e,
++ 0xfb, 0xd8, 0x75, 0xb5, 0xa9, 0xfb, 0xee, 0x82, 0xf9, 0xe7, 0x5d, 0xf2,
++ 0x0c, 0x46, 0xd6, 0x5c, 0xe5, 0x9e, 0x82, 0x2e, 0xe2, 0x50, 0x54, 0x6b,
++ 0x64, 0x9c, 0xd7, 0x7d, 0x6b, 0x39, 0x1f, 0x71, 0xaf, 0xec, 0x51, 0x2f,
++ 0xc4, 0xc8, 0x62, 0xe4, 0xd6, 0x3e, 0x65, 0x9f, 0x45, 0x6e, 0xbd, 0x93,
++ 0x76, 0x8f, 0xae, 0xf4, 0xef, 0xad, 0xac, 0xd7, 0xc9, 0x58, 0x78, 0x6e,
++ 0x7f, 0xf4, 0x10, 0xf5, 0x3a, 0xcc, 0x7b, 0x9b, 0xcf, 0xae, 0xa7, 0xc8,
++ 0x9a, 0x92, 0xc4, 0xde, 0xdf, 0x59, 0x6d, 0xe7, 0x95, 0x9d, 0xba, 0x57,
++ 0xbc, 0x26, 0x26, 0xcf, 0xdc, 0x46, 0xf3, 0xeb, 0xee, 0x4d, 0x1f, 0x79,
++ 0xe6, 0x36, 0x41, 0x5b, 0x42, 0x74, 0x33, 0xb9, 0x5d, 0x1c, 0x3d, 0x18,
++ 0x4d, 0xd4, 0x69, 0x5b, 0xa0, 0xc9, 0x7a, 0x33, 0xff, 0x7a, 0xb0, 0x3f,
++ 0x81, 0x68, 0xd1, 0xa5, 0x95, 0xe4, 0x5b, 0x88, 0x3a, 0x18, 0xa3, 0x1e,
++ 0x4d, 0xd4, 0x35, 0x6f, 0xe3, 0x98, 0xfc, 0x2b, 0x7b, 0x30, 0x9c, 0x68,
++ 0xfc, 0x2b, 0xc6, 0x11, 0x7f, 0x99, 0xcd, 0x75, 0xe2, 0x7f, 0xbd, 0x97,
++ 0x38, 0xb0, 0x29, 0xbf, 0xe6, 0xd5, 0x96, 0xf8, 0x35, 0xe5, 0xb7, 0x85,
++ 0x64, 0xbd, 0x4f, 0x2a, 0x37, 0xc1, 0x3c, 0xff, 0x04, 0xd6, 0xf5, 0x2b,
++ 0x78, 0xd2, 0x38, 0x81, 0xb5, 0x43, 0x22, 0xcf, 0x09, 0xac, 0xe9, 0x7f,
++ 0x09, 0x7b, 0xfa, 0x67, 0xa0, 0xc9, 0xd6, 0x4d, 0x07, 0x36, 0xec, 0x3c,
++ 0x88, 0xed, 0x29, 0x0b, 0xdb, 0x42, 0x1e, 0xac, 0x7f, 0x58, 0xc1, 0xf2,
++ 0xc0, 0x61, 0x6c, 0xd9, 0x69, 0xe1, 0xe2, 0x50, 0x27, 0x9a, 0xcd, 0x32,
++ 0x14, 0x57, 0xcd, 0x6b, 0x57, 0x59, 0xae, 0x6d, 0xb8, 0x23, 0xbf, 0x2f,
++ 0x79, 0x3f, 0xb1, 0x40, 0x85, 0xcf, 0x90, 0x3d, 0xc7, 0x51, 0xe5, 0xa6,
++ 0x4c, 0x93, 0xd2, 0x9a, 0x7f, 0x66, 0x79, 0x7d, 0xa6, 0xa8, 0x02, 0xa5,
++ 0x71, 0xec, 0x09, 0x9d, 0xc0, 0xd0, 0xd0, 0x07, 0xe5, 0x39, 0x7f, 0x99,
++ 0x20, 0x77, 0x90, 0x9c, 0xc3, 0xa4, 0x4d, 0x7d, 0xd2, 0xfb, 0x40, 0x62,
++ 0x77, 0x93, 0xf8, 0xe9, 0xe0, 0x49, 0x9c, 0x1c, 0xfc, 0x37, 0x2c, 0xd1,
++ 0x24, 0x7f, 0xb4, 0x3a, 0x9d, 0x11, 0xcb, 0xda, 0xd5, 0x10, 0xb7, 0x6a,
++ 0x8c, 0x5f, 0xb0, 0xed, 0x0a, 0x4c, 0x8f, 0xbc, 0x88, 0x6d, 0x1a, 0xdb,
++ 0x4a, 0xed, 0xc7, 0x0e, 0xc6, 0x75, 0x5f, 0xe4, 0x66, 0xf8, 0x52, 0x59,
++ 0xb3, 0x1a, 0xd1, 0x1d, 0xd5, 0xd0, 0x37, 0x56, 0x39, 0x8c, 0x8e, 0x7f,
++ 0x55, 0xea, 0x71, 0x7d, 0xe6, 0x24, 0x7e, 0x3e, 0x68, 0xef, 0xa5, 0x6a,
++ 0xfd, 0xae, 0x62, 0x75, 0x6e, 0x0b, 0xe9, 0xcd, 0xff, 0x43, 0x89, 0xc6,
++ 0x4b, 0x69, 0x53, 0x25, 0xcc, 0x09, 0x6e, 0x18, 0x94, 0x1c, 0xb1, 0x15,
++ 0xee, 0x3e, 0x3d, 0xbb, 0x94, 0x3c, 0xfb, 0xee, 0x05, 0xf1, 0x99, 0xd3,
++ 0x68, 0x97, 0x0e, 0x45, 0x0f, 0x1a, 0x6a, 0x27, 0x8e, 0x98, 0xfa, 0xc4,
++ 0xef, 0x1c, 0xc6, 0xd0, 0x77, 0x50, 0x8f, 0x55, 0x19, 0x7d, 0xe8, 0x32,
++ 0xe6, 0x61, 0x5b, 0x92, 0x26, 0x52, 0x49, 0xbd, 0xb5, 0xc3, 0xd1, 0x8b,
++ 0x3b, 0x02, 0xb5, 0x1b, 0xdf, 0x25, 0x97, 0xf3, 0x10, 0x53, 0x92, 0xe3,
++ 0x23, 0xcc, 0x5f, 0x7b, 0xb1, 0xe1, 0xe1, 0x08, 0xd6, 0xef, 0x32, 0xd1,
++ 0x93, 0x1c, 0xa1, 0x6c, 0x3f, 0x2c, 0x97, 0xbd, 0x34, 0x2d, 0xa1, 0xf8,
++ 0xb5, 0x2a, 0x02, 0x51, 0xf6, 0xd9, 0xa8, 0x46, 0x02, 0x7e, 0x55, 0x61,
++ 0xf4, 0x1f, 0x77, 0xa2, 0x9b, 0x65, 0xfa, 0x52, 0xb4, 0xb9, 0xa4, 0x9b,
++ 0xf1, 0x72, 0x16, 0x86, 0xc7, 0x7c, 0xd8, 0x37, 0xe6, 0xc1, 0xd0, 0x98,
++ 0xc6, 0xa3, 0x14, 0x0f, 0x0d, 0xc8, 0x9e, 0x14, 0x2f, 0x9e, 0xd8, 0xeb,
++ 0xc6, 0xa6, 0x07, 0x3c, 0x98, 0x13, 0x99, 0x8e, 0xbd, 0x7b, 0x4b, 0xb1,
++ 0x9b, 0xd7, 0xab, 0x16, 0xfa, 0xf1, 0x38, 0xaf, 0xf7, 0x3f, 0xe0, 0xe2,
++ 0x3c, 0x5c, 0x8c, 0x03, 0x34, 0xec, 0xa1, 0xb1, 0x32, 0xa4, 0x06, 0x68,
++ 0xf2, 0xe4, 0xac, 0x6f, 0x31, 0xc3, 0x18, 0xdd, 0xcb, 0xd8, 0xf8, 0xb0,
++ 0x89, 0x04, 0xfb, 0xd9, 0x4e, 0x5d, 0xf5, 0x10, 0xd7, 0x36, 0x8c, 0x09,
++ 0xc6, 0xaf, 0xc2, 0x35, 0x7d, 0x7a, 0x73, 0x93, 0x62, 0x44, 0x17, 0xd9,
++ 0xfb, 0xb4, 0xe4, 0xbd, 0xad, 0x55, 0x68, 0x4c, 0xe8, 0x66, 0x13, 0x3a,
++ 0x71, 0x8c, 0xe3, 0xfe, 0x7f, 0xe8, 0xb7, 0x8b, 0x1d, 0x7a, 0xef, 0xd5,
++ 0xea, 0x41, 0xec, 0xc8, 0x1c, 0x22, 0x57, 0x07, 0xc2, 0x7b, 0x0e, 0x92,
++ 0xbf, 0x1d, 0x21, 0xfe, 0xbc, 0x6e, 0xf9, 0x0c, 0x15, 0xd7, 0xdf, 0x6f,
++ 0x84, 0xdf, 0x53, 0x02, 0x1b, 0x7f, 0x45, 0x1d, 0x7c, 0x7e, 0xaf, 0x8a,
++ 0xeb, 0x76, 0x2c, 0x46, 0x3a, 0x14, 0xc5, 0xf6, 0x45, 0x2a, 0xae, 0x7d,
++ 0xf8, 0x20, 0x71, 0x7f, 0xc2, 0xe6, 0xc9, 0xd9, 0xf4, 0x7d, 0x08, 0xf6,
++ 0xc9, 0x9a, 0xbc, 0x9b, 0xf1, 0xbb, 0x1c, 0xc7, 0xfb, 0x3b, 0xe9, 0xb7,
++ 0xe5, 0x38, 0x3a, 0x74, 0x90, 0xf6, 0x58, 0x8e, 0x23, 0xfd, 0xc6, 0xc4,
++ 0x4f, 0x1d, 0xe5, 0x78, 0x82, 0xe7, 0x3b, 0x78, 0xbe, 0x70, 0xc0, 0xe8,
++ 0xef, 0x50, 0xcb, 0xb1, 0x60, 0x4f, 0x03, 0xfa, 0x93, 0x62, 0x9b, 0x1a,
++ 0x36, 0x8e, 0xd5, 0xe7, 0x75, 0x2f, 0x3a, 0xf7, 0xe2, 0x4e, 0xea, 0xea,
++ 0x8e, 0x1d, 0x9d, 0xec, 0xcf, 0x47, 0x9d, 0x1f, 0xc4, 0x43, 0xcc, 0xeb,
++ 0xb6, 0x25, 0x7d, 0x38, 0x9d, 0x32, 0xfc, 0x5f, 0x52, 0x0c, 0xb3, 0x44,
++ 0x09, 0x68, 0xc7, 0xe1, 0xc3, 0xc9, 0x4c, 0x29, 0xba, 0x07, 0x66, 0xe1,
++ 0xa7, 0xb4, 0xcf, 0x07, 0x1f, 0x90, 0xfe, 0x26, 0x18, 0x1f, 0x66, 0xe3,
++ 0x89, 0x11, 0x93, 0x6d, 0xcb, 0x3c, 0x49, 0xcc, 0xe9, 0x81, 0x2b, 0x25,
++ 0xbe, 0x11, 0xdd, 0x41, 0xb3, 0x20, 0x26, 0x1e, 0x46, 0xa6, 0x5f, 0xef,
++ 0xbd, 0x41, 0x15, 0x5e, 0xad, 0x52, 0x97, 0x0e, 0x4c, 0x6a, 0x7a, 0xbc,
++ 0x4a, 0x8d, 0xf7, 0x33, 0x7f, 0x8d, 0x57, 0xab, 0x87, 0xf1, 0x44, 0xbf,
++ 0x13, 0xf3, 0x16, 0xaa, 0xbc, 0x1e, 0x3f, 0xc3, 0xd8, 0x16, 0x9f, 0xa3,
++ 0x9a, 0xd8, 0x6d, 0xcb, 0x8a, 0x78, 0x11, 0xb9, 0x7d, 0xe5, 0xc2, 0x5a,
++ 0xc6, 0x2f, 0x87, 0xd8, 0x5e, 0xac, 0x5c, 0x75, 0x52, 0xef, 0x27, 0x31,
++ 0x42, 0xbb, 0x7e, 0x94, 0xc7, 0x81, 0x41, 0xab, 0x73, 0x39, 0x39, 0xf7,
++ 0xc5, 0x01, 0xab, 0xf3, 0x06, 0xd3, 0xf0, 0x15, 0xa9, 0x81, 0xe8, 0xdd,
++ 0x38, 0x89, 0xfd, 0x23, 0x52, 0x06, 0x6e, 0x6f, 0x84, 0x79, 0x75, 0xd2,
++ 0xea, 0xdc, 0x61, 0x5e, 0x8c, 0x06, 0x3b, 0x37, 0xfe, 0x55, 0x79, 0x0e,
++ 0x33, 0xc5, 0x8f, 0x64, 0x0d, 0x64, 0x12, 0xbf, 0x62, 0x3b, 0xef, 0x0d,
++ 0x56, 0x62, 0x5a, 0xb5, 0xf8, 0xc1, 0x09, 0xbc, 0xdd, 0xff, 0x22, 0x4e,
++ 0xf7, 0x5b, 0x58, 0x10, 0xb2, 0xe0, 0x0c, 0xd5, 0x99, 0x4d, 0xea, 0x65,
++ 0xc4, 0x08, 0x05, 0xd7, 0xcc, 0x7d, 0x09, 0xef, 0xd0, 0xff, 0xaf, 0x9d,
++ 0x6b, 0xd9, 0xb2, 0xf4, 0x61, 0xa1, 0xb5, 0xbd, 0x46, 0xfc, 0xc6, 0xb4,
++ 0xf7, 0xf5, 0x7c, 0x72, 0x1e, 0x5c, 0xd8, 0xb7, 0x26, 0xb9, 0xf0, 0x49,
++ 0x0c, 0x0f, 0x1a, 0xd1, 0x75, 0x05, 0x39, 0xfb, 0x4f, 0x52, 0x07, 0x16,
++ 0x76, 0x98, 0x47, 0x1f, 0xae, 0xc2, 0xbc, 0x33, 0xcc, 0x1a, 0xaf, 0x98,
++ 0x43, 0xdb, 0x59, 0xb0, 0x30, 0x60, 0x2e, 0x53, 0xdf, 0xa4, 0x9f, 0x9e,
++ 0xc4, 0xbe, 0xa1, 0x02, 0x5e, 0xfb, 0xd0, 0x44, 0x3f, 0xcf, 0xed, 0x65,
++ 0xf7, 0xa2, 0x31, 0x75, 0xc8, 0x5e, 0x7f, 0x38, 0x40, 0x7c, 0xcc, 0x3d,
++ 0xd3, 0xd4, 0x30, 0x92, 0x69, 0x22, 0x36, 0x44, 0xf1, 0xcf, 0x99, 0x08,
++ 0xf1, 0x21, 0x4c, 0x7c, 0x68, 0x20, 0x3e, 0x98, 0xc4, 0x87, 0x7a, 0xe2,
++ 0x43, 0xd0, 0x7e, 0xd6, 0x2f, 0x6b, 0xe6, 0x43, 0xa3, 0x2f, 0xa2, 0x68,
++ 0xe0, 0x04, 0x5c, 0xf4, 0x81, 0xe3, 0xa6, 0x45, 0x7e, 0x52, 0xa7, 0xad,
++ 0xc1, 0xc5, 0x4a, 0x54, 0xf3, 0x62, 0x28, 0x73, 0x02, 0x25, 0x03, 0x1a,
++ 0xc7, 0x22, 0xfb, 0x33, 0x6a, 0xc3, 0xbd, 0xc4, 0xea, 0x5f, 0x1b, 0x75,
++ 0xbd, 0x5e, 0xd4, 0xed, 0xae, 0x81, 0xd1, 0xbf, 0x50, 0x9d, 0xab, 0x44,
++ 0xbf, 0xe0, 0xe5, 0x38, 0xab, 0x31, 0xfb, 0x01, 0x0d, 0x73, 0x78, 0xfc,
++ 0x53, 0xaa, 0x76, 0xe2, 0x75, 0x07, 0xbc, 0x33, 0x48, 0x77, 0x66, 0x92,
++ 0x09, 0x90, 0xd5, 0x7a, 0x7d, 0xb8, 0xe4, 0xc0, 0x49, 0x55, 0x41, 0xf6,
++ 0x0b, 0x12, 0xf3, 0xea, 0x82, 0x3d, 0xaa, 0x2a, 0x6b, 0x48, 0xc4, 0x70,
++ 0x1e, 0x2a, 0x22, 0x64, 0x11, 0xb3, 0x98, 0x5f, 0x58, 0x6b, 0xcc, 0x12,
++ 0x6c, 0xae, 0x57, 0x65, 0x6f, 0xc8, 0x21, 0x89, 0x51, 0x33, 0x18, 0x23,
++ 0x4a, 0x93, 0xf1, 0xdb, 0x66, 0xc0, 0x83, 0x92, 0xa4, 0x65, 0x3d, 0x16,
++ 0xd2, 0xe0, 0x89, 0x04, 0xa2, 0x1b, 0x98, 0x46, 0x7e, 0x61, 0x5e, 0x18,
++ 0xd7, 0x64, 0x0e, 0x60, 0x80, 0xe3, 0x5b, 0x9e, 0x29, 0xbc, 0xe3, 0xf9,
++ 0xc9, 0x7f, 0xe7, 0xde, 0x15, 0xbd, 0x64, 0xf7, 0x0c, 0x18, 0xda, 0x5d,
++ 0x6a, 0xbc, 0x92, 0x1c, 0xfc, 0x00, 0xe3, 0x9e, 0x32, 0x79, 0xa3, 0x82,
++ 0xd6, 0x81, 0x38, 0xa6, 0x85, 0x7e, 0xa0, 0xc4, 0xaa, 0x75, 0xbf, 0x5f,
++ 0xa9, 0xc6, 0x8d, 0x0f, 0x50, 0xd7, 0x0b, 0x26, 0x68, 0x2b, 0x3e, 0x7c,
++ 0x67, 0x54, 0x74, 0x5b, 0x3b, 0xb4, 0x83, 0xe3, 0x98, 0x98, 0x7b, 0x40,
++ 0x70, 0xf2, 0xa0, 0x1b, 0x8e, 0x83, 0xd3, 0x99, 0x9b, 0xd6, 0xcf, 0xbd,
++ 0xa4, 0xe3, 0xdf, 0x54, 0xd1, 0x8b, 0xf0, 0x6b, 0xbd, 0x3f, 0xae, 0x18,
++ 0xda, 0x2f, 0x95, 0x03, 0xe4, 0x6c, 0x5e, 0x3c, 0x96, 0x39, 0x4c, 0x5d,
++ 0xee, 0xcf, 0xe7, 0x4b, 0xab, 0x90, 0xe8, 0x93, 0x7d, 0x81, 0x27, 0x30,
++ 0x7b, 0x40, 0x6f, 0xd9, 0xaa, 0x18, 0xc1, 0x6b, 0x95, 0x13, 0x98, 0x39,
++ 0x10, 0xe4, 0x5c, 0x6a, 0x58, 0x96, 0x2c, 0xe0, 0xa7, 0x60, 0xf0, 0x2a,
++ 0x62, 0xb0, 0xb5, 0xf8, 0xa7, 0x66, 0x9c, 0x39, 0x8e, 0x6e, 0x3a, 0x15,
++ 0xbd, 0x75, 0xae, 0x22, 0xfb, 0x80, 0x8c, 0x33, 0x6d, 0xac, 0xe3, 0x19,
++ 0xa8, 0xc7, 0x57, 0x39, 0xe6, 0x66, 0xce, 0xdb, 0x8b, 0x0b, 0x2d, 0x2c,
++ 0x5a, 0xa8, 0xef, 0x2e, 0x71, 0x44, 0xef, 0xaa, 0x42, 0xb6, 0xa3, 0x86,
++ 0x76, 0x73, 0xc7, 0x02, 0x3d, 0xfc, 0x03, 0xe2, 0x2e, 0x71, 0x1a, 0xdd,
++ 0x8c, 0x3b, 0x6b, 0x18, 0x8b, 0x4a, 0x23, 0x7a, 0x2f, 0x73, 0xd4, 0xf7,
++ 0x6e, 0x75, 0x44, 0x43, 0xf2, 0x1e, 0xd1, 0xdf, 0x63, 0x31, 0xdc, 0xa1,
++ 0x0a, 0xe2, 0xa0, 0x9e, 0x7d, 0x11, 0xfa, 0xee, 0xaf, 0x92, 0x93, 0xfe,
++ 0x98, 0xfc, 0xae, 0xe6, 0xd2, 0x43, 0xc4, 0xa8, 0x11, 0x3c, 0x98, 0x39,
++ 0x88, 0xdd, 0x99, 0x34, 0x76, 0x66, 0xb6, 0x29, 0x43, 0xf6, 0xb3, 0x45,
++ 0x45, 0xde, 0x99, 0x8b, 0x56, 0x28, 0x5f, 0x46, 0x79, 0xe8, 0x5b, 0xd6,
++ 0x50, 0x95, 0x8a, 0xca, 0x50, 0x10, 0xd7, 0x24, 0xe3, 0x70, 0x44, 0xde,
++ 0xb5, 0xe4, 0x7d, 0xed, 0xf5, 0xe3, 0x06, 0xae, 0x4e, 0x96, 0x22, 0xb6,
++ 0xc7, 0xb2, 0x7a, 0x1b, 0x9c, 0x58, 0x3b, 0x5e, 0x8f, 0x65, 0x03, 0x0f,
++ 0x59, 0x73, 0x18, 0x73, 0x3e, 0xbc, 0xdc, 0x83, 0x5b, 0xf7, 0x78, 0xd0,
++ 0x96, 0x8c, 0xc2, 0x17, 0x29, 0xe3, 0xef, 0x80, 0xb9, 0x04, 0xc6, 0xc4,
++ 0x04, 0x8c, 0xde, 0xab, 0x1c, 0x81, 0xfd, 0x61, 0xd5, 0x83, 0xbf, 0x21,
++ 0x8e, 0x2f, 0x27, 0xee, 0xc4, 0xc6, 0x2d, 0x54, 0x46, 0xbc, 0xb8, 0x8d,
++ 0xf5, 0xaf, 0xe3, 0xdc, 0xbf, 0xb3, 0x68, 0x3f, 0xb1, 0x40, 0xf6, 0x42,
++ 0x6a, 0xd8, 0x30, 0xee, 0xa6, 0xae, 0xdc, 0x88, 0xed, 0xab, 0xc6, 0xd5,
++ 0x0f, 0xf8, 0x71, 0xeb, 0xb8, 0x07, 0x8d, 0x49, 0x6b, 0xf1, 0x01, 0x33,
++ 0xbe, 0x52, 0x83, 0x81, 0xb6, 0x71, 0x2f, 0xbe, 0x92, 0xd4, 0x7d, 0xd7,
++ 0x32, 0xe7, 0x1f, 0x31, 0x83, 0xf8, 0x5f, 0xe3, 0x3e, 0xdc, 0x94, 0x3c,
++ 0x2a, 0x79, 0xe4, 0x12, 0x27, 0x63, 0xcf, 0xbd, 0xe3, 0xb3, 0xb0, 0x32,
++ 0xa9, 0x9f, 0x99, 0x20, 0xb7, 0xeb, 0xdc, 0x67, 0xe2, 0xae, 0x71, 0x15,
++ 0xad, 0x6c, 0xe7, 0xc6, 0xe4, 0x6c, 0x74, 0xec, 0x6b, 0xa0, 0x0c, 0x0b,
++ 0xb1, 0x7c, 0xc0, 0x09, 0x93, 0x2c, 0x1e, 0x5f, 0x04, 0x5a, 0x06, 0x26,
++ 0x98, 0xc7, 0xdd, 0x87, 0xed, 0x7d, 0x26, 0x6e, 0x1f, 0x97, 0xf3, 0x83,
++ 0xf6, 0x3b, 0xae, 0xef, 0x3d, 0xbc, 0x10, 0x9f, 0x1f, 0x50, 0x89, 0x03,
++ 0xc5, 0x18, 0x5a, 0xa9, 0xe0, 0x2b, 0xbc, 0xbe, 0x35, 0x25, 0x7b, 0x90,
++ 0x81, 0xd0, 0x8e, 0xc0, 0xfe, 0x2a, 0x72, 0x86, 0x45, 0x0f, 0xe7, 0xae,
++ 0x3f, 0x48, 0x9c, 0x2f, 0x21, 0xce, 0x97, 0x91, 0xc3, 0x5e, 0x35, 0x7c,
++ 0x10, 0xf7, 0x13, 0x97, 0x0f, 0x0d, 0x74, 0x32, 0xee, 0x94, 0xe3, 0x71,
++ 0xc6, 0x81, 0x24, 0xcf, 0x4f, 0xec, 0x30, 0x3a, 0x4a, 0x88, 0xd3, 0x3f,
++ 0x20, 0xfe, 0xf6, 0x12, 0x33, 0xee, 0x48, 0x32, 0xdc, 0xef, 0x60, 0x0e,
++ 0x70, 0x69, 0x74, 0xbe, 0x87, 0x39, 0xd6, 0xb5, 0x4a, 0xc0, 0xf7, 0x26,
++ 0xca, 0xe1, 0x78, 0xb8, 0x1a, 0x8d, 0x0f, 0x48, 0x19, 0xc1, 0x2f, 0x15,
++ 0xea, 0x5e, 0x27, 0x75, 0x7e, 0x18, 0x56, 0xbf, 0x83, 0xe3, 0xad, 0x35,
++ 0xc9, 0xc0, 0xf1, 0x9a, 0xa9, 0x6b, 0xff, 0x4c, 0xac, 0x7d, 0x9f, 0x98,
++ 0xea, 0x9f, 0xd1, 0x80, 0x26, 0xc3, 0xe4, 0x71, 0x18, 0x27, 0xfb, 0x0d,
++ 0x53, 0xf6, 0xe4, 0xbd, 0x4e, 0x9e, 0x37, 0x39, 0x83, 0x31, 0xd3, 0x10,
++ 0x3f, 0x1c, 0xe1, 0x78, 0x54, 0xc9, 0x4b, 0xe0, 0x18, 0x03, 0xde, 0x7e,
++ 0x78, 0x31, 0xc7, 0x25, 0xb1, 0x54, 0xe2, 0xdd, 0x08, 0x65, 0x5d, 0x8c,
++ 0x15, 0xd4, 0x47, 0x53, 0x52, 0x45, 0x7a, 0x5f, 0x04, 0xb7, 0xef, 0xca,
++ 0xc5, 0xe1, 0x8d, 0xa1, 0xf8, 0x0d, 0x8c, 0xc3, 0xe1, 0x52, 0xc6, 0x61,
++ 0x57, 0x44, 0x64, 0x73, 0x62, 0x98, 0x71, 0x7b, 0x73, 0x2a, 0x8c, 0x66,
++ 0xce, 0xe1, 0x44, 0x9a, 0xfd, 0x26, 0x67, 0xe1, 0x78, 0xda, 0xc3, 0x98,
++ 0xa5, 0xf1, 0x20, 0xaa, 0x8d, 0x4c, 0xe7, 0xe1, 0xe7, 0x71, 0x31, 0x0f,
++ 0xc3, 0xbe, 0xb6, 0x26, 0xa9, 0x20, 0xde, 0xa2, 0xd8, 0x7c, 0xfe, 0x78,
++ 0x5a, 0xb0, 0x59, 0xd6, 0x32, 0xef, 0xae, 0x94, 0x3d, 0xa8, 0xfd, 0xa9,
++ 0x97, 0x50, 0x49, 0x7c, 0xaa, 0xc8, 0xe3, 0xd0, 0xcf, 0x42, 0x82, 0xbb,
++ 0xb5, 0xc4, 0x5d, 0xd9, 0x4f, 0x64, 0x59, 0xab, 0x02, 0x53, 0xf1, 0xe8,
++ 0xff, 0xfb, 0x30, 0x6a, 0xef, 0xab, 0x15, 0x4c, 0x22, 0xfe, 0xa5, 0x88,
++ 0x7f, 0x1c, 0x43, 0xd7, 0x95, 0xc4, 0x40, 0xca, 0xf4, 0x8f, 0x29, 0x62,
++ 0x20, 0x71, 0xfa, 0x20, 0x71, 0xfa, 0xdb, 0xc4, 0xe9, 0x6f, 0x11, 0xa7,
++ 0x1f, 0x27, 0x26, 0xe4, 0xd6, 0xf4, 0x9a, 0xe5, 0xb9, 0x0a, 0xe7, 0xe3,
++ 0x1d, 0x7b, 0x6d, 0xb1, 0x86, 0xba, 0x9a, 0x3d, 0xa0, 0x60, 0x8e, 0xa1,
++ 0xef, 0x17, 0xbb, 0xff, 0x31, 0xe7, 0xc9, 0x3f, 0x2d, 0xb7, 0xe7, 0xb7,
++ 0x29, 0xd9, 0x03, 0x77, 0xb2, 0x4e, 0xeb, 0x85, 0xfd, 0x0d, 0x01, 0x53,
++ 0xb8, 0x68, 0x51, 0x72, 0x0d, 0x1c, 0xc9, 0xba, 0xfd, 0xc7, 0xe4, 0xf9,
++ 0xed, 0x74, 0xc9, 0xeb, 0xd7, 0xc8, 0x1e, 0xed, 0xfd, 0xb2, 0x37, 0x6c,
++ 0x19, 0xef, 0xb9, 0x92, 0x75, 0xe6, 0x9b, 0xb0, 0xb1, 0xcd, 0x3f, 0x69,
++ 0xdf, 0xab, 0x7d, 0xef, 0x7e, 0xea, 0x2b, 0xcb, 0x36, 0xd3, 0x29, 0xd9,
++ 0x17, 0x3b, 0x0b, 0x8f, 0x66, 0xe4, 0x77, 0x5d, 0x6b, 0x42, 0xdd, 0x8f,
++ 0x58, 0x8d, 0xf0, 0xf1, 0x30, 0xae, 0x4f, 0x7a, 0x68, 0x07, 0x71, 0x54,
++ 0xd0, 0xb7, 0xbe, 0x36, 0xde, 0x40, 0x5f, 0x7b, 0xc8, 0xd2, 0x22, 0x81,
++ 0xd6, 0x71, 0x72, 0x9e, 0xf5, 0xe3, 0x8b, 0xb1, 0x74, 0xc0, 0xb2, 0x3c,
++ 0x97, 0x19, 0xe1, 0x0d, 0x8a, 0x1f, 0x2e, 0xfa, 0xa0, 0x83, 0x7e, 0xb5,
++ 0x6e, 0x4f, 0x40, 0x7b, 0x93, 0x78, 0xda, 0xde, 0x70, 0x80, 0xf6, 0x61,
++ 0x9c, 0x69, 0x26, 0x96, 0x3a, 0x23, 0x01, 0xe6, 0x89, 0x1e, 0xda, 0xbe,
++ 0x17, 0x67, 0x12, 0xe2, 0x5f, 0x7a, 0xc7, 0x3f, 0x33, 0x37, 0xe9, 0xa0,
++ 0x6f, 0xfc, 0x32, 0x31, 0x8b, 0x3e, 0xe0, 0xc6, 0xdb, 0x09, 0x83, 0xfe,
++ 0xe6, 0xc1, 0x3b, 0x89, 0x7a, 0xf6, 0x15, 0x64, 0x19, 0x3f, 0xee, 0x1c,
++ 0x0f, 0xd3, 0xcf, 0xae, 0xe4, 0x21, 0xef, 0x53, 0xd7, 0xc6, 0xbf, 0xa3,
++ 0xd4, 0xf6, 0xcf, 0x56, 0xab, 0x10, 0xad, 0xd6, 0xf0, 0xf5, 0xf1, 0xcf,
++ 0xe2, 0x3f, 0x18, 0xb7, 0xd7, 0x26, 0xc1, 0x39, 0x44, 0x88, 0x3c, 0x70,
++ 0x62, 0x9f, 0x3c, 0x4b, 0x44, 0x5d, 0x74, 0xae, 0x43, 0x67, 0x6e, 0xab,
++ 0x67, 0x4f, 0x3b, 0x9c, 0xec, 0x93, 0xac, 0x98, 0x65, 0x7f, 0xd9, 0x5f,
++ 0x8a, 0xbb, 0xf6, 0x1c, 0xa0, 0x8f, 0x14, 0x61, 0xc1, 0xfd, 0x6e, 0x7c,
++ 0x7d, 0xdf, 0x08, 0xb9, 0x83, 0x8a, 0x99, 0xcc, 0x95, 0x86, 0x48, 0x14,
++ 0x66, 0x0e, 0x47, 0x70, 0xdb, 0xae, 0x11, 0x0c, 0xe4, 0x79, 0x5e, 0x28,
++ 0x14, 0xff, 0x9f, 0x2a, 0x0e, 0x90, 0x47, 0x04, 0xda, 0x3f, 0x43, 0x1b,
++ 0xab, 0x88, 0x04, 0xe2, 0x32, 0xee, 0x16, 0xda, 0x58, 0x0f, 0xe7, 0x33,
++ 0xcd, 0x71, 0x24, 0x68, 0x63, 0x8f, 0x51, 0xfe, 0xed, 0xb4, 0xb1, 0x38,
++ 0x6d, 0x2c, 0x4e, 0x7b, 0x8a, 0xd3, 0xc6, 0xe4, 0x9d, 0xfd, 0x38, 0x6d,
++ 0x2c, 0x4e, 0x1b, 0x8b, 0xa7, 0x17, 0x63, 0x94, 0x4c, 0x63, 0xcb, 0x48,
++ 0x03, 0x71, 0x4c, 0xb1, 0xa3, 0x52, 0xf6, 0x86, 0xcf, 0x92, 0xb3, 0x5f,
++ 0xc5, 0x43, 0x41, 0x33, 0x7d, 0xb2, 0x77, 0x68, 0x84, 0x9c, 0xc7, 0x8d,
++ 0xdf, 0x64, 0x84, 0xe3, 0x37, 0x30, 0x8f, 0x3d, 0x4c, 0x9e, 0xaf, 0xe2,
++ 0x49, 0x53, 0xf2, 0x60, 0x93, 0xe7, 0x8c, 0x35, 0x29, 0xe1, 0x6b, 0x87,
++ 0x71, 0x47, 0x3f, 0x70, 0x2d, 0x79, 0x61, 0x35, 0x79, 0xc9, 0xde, 0x05,
++ 0xfc, 0xfd, 0xf0, 0x01, 0xda, 0xbc, 0xf8, 0x63, 0x6e, 0xaf, 0xeb, 0xf1,
++ 0xfe, 0x5a, 0xdf, 0xd5, 0xf4, 0xc1, 0x7b, 0x59, 0xd7, 0xf9, 0xb0, 0xd4,
++ 0x39, 0xc0, 0xb6, 0xf5, 0xf0, 0x6f, 0x38, 0xff, 0xad, 0xf7, 0x57, 0xe3,
++ 0xed, 0x5d, 0x7a, 0xf8, 0x7d, 0x62, 0x5e, 0xb5, 0xc3, 0x5a, 0xfc, 0x99,
++ 0x50, 0x60, 0xe3, 0x67, 0xd4, 0x1c, 0xdf, 0x6b, 0xd9, 0xe1, 0xc4, 0xfe,
++ 0xd0, 0x62, 0x78, 0x16, 0x14, 0x38, 0x1f, 0x6d, 0xa9, 0x5a, 0x38, 0x96,
++ 0x1e, 0x3e, 0x4d, 0xae, 0x92, 0x64, 0xfb, 0xa3, 0xe9, 0x23, 0xc4, 0x90,
++ 0xfb, 0xf0, 0x02, 0xf3, 0xf3, 0x91, 0x4f, 0xbf, 0x4e, 0xee, 0xe8, 0xc6,
++ 0x18, 0x39, 0xe0, 0x81, 0xfe, 0xe8, 0xe7, 0x9c, 0xc4, 0x7d, 0xcf, 0x82,
++ 0x72, 0xa4, 0x87, 0x84, 0x2b, 0x96, 0xe3, 0xd9, 0x7e, 0x43, 0xbb, 0x56,
++ 0xc9, 0xf1, 0xc2, 0x2d, 0x3c, 0x7f, 0xb3, 0xdf, 0x38, 0x33, 0x8c, 0xc0,
++ 0xc4, 0x69, 0x72, 0xc3, 0xf7, 0x87, 0x24, 0x86, 0x1d, 0xa4, 0x8f, 0xfb,
++ 0x11, 0x4e, 0x6a, 0x38, 0x34, 0x66, 0x60, 0x7e, 0xd2, 0x8b, 0x47, 0xc6,
++ 0x82, 0xf8, 0x0c, 0x7d, 0x37, 0x43, 0x7e, 0xf8, 0xe9, 0xa4, 0xf8, 0xe2,
++ 0x2c, 0x8c, 0x8f, 0xcd, 0xb2, 0xf7, 0x54, 0x7a, 0x8c, 0x5f, 0xc0, 0x53,
++ 0x2d, 0x3e, 0x49, 0x6e, 0x9d, 0xd2, 0x7b, 0x63, 0x1c, 0x4f, 0xcc, 0xab,
++ 0xef, 0x8f, 0x41, 0x1f, 0x02, 0xae, 0xf8, 0x70, 0xe8, 0x8b, 0x12, 0x1f,
++ 0xc5, 0x1f, 0x35, 0x8c, 0x93, 0xef, 0x14, 0x13, 0x53, 0x4b, 0x23, 0xb5,
++ 0xef, 0xbd, 0xac, 0xe8, 0xd9, 0xa7, 0x55, 0xcb, 0x7a, 0x69, 0xa1, 0x06,
++ 0xdf, 0x3e, 0x8d, 0xdc, 0xc3, 0x64, 0xec, 0x16, 0x3f, 0xd5, 0x30, 0xe3,
++ 0x81, 0x6a, 0x4c, 0x7b, 0x20, 0x89, 0xbf, 0xad, 0x8e, 0x7f, 0x6e, 0x3a,
++ 0xe3, 0xfc, 0x74, 0xe2, 0x7a, 0x65, 0xf2, 0xd8, 0x0c, 0x37, 0xf9, 0xf2,
++ 0x84, 0x5a, 0xd7, 0xba, 0x1f, 0xfa, 0xfe, 0x93, 0x8a, 0xee, 0x7b, 0x8c,
++ 0xb1, 0xc1, 0x45, 0x1b, 0x75, 0x8c, 0x6b, 0xf4, 0xdd, 0xba, 0x43, 0xd3,
++ 0x60, 0xc4, 0x2f, 0x57, 0x5d, 0x16, 0x6c, 0x79, 0xae, 0xa8, 0xcc, 0xe5,
++ 0x45, 0x82, 0x3b, 0x12, 0x17, 0x1c, 0xb2, 0xff, 0x13, 0xed, 0xf4, 0x97,
++ 0x15, 0x76, 0x2c, 0x3a, 0x60, 0xef, 0x8f, 0xdb, 0x30, 0x1e, 0xa7, 0x8f,
++ 0x2c, 0x46, 0xd9, 0x80, 0x07, 0x5f, 0xb3, 0xe3, 0xd0, 0x43, 0x56, 0x15,
++ 0xfd, 0xe5, 0xf6, 0x3d, 0x81, 0xf6, 0xab, 0xe9, 0x2f, 0xb5, 0x97, 0x49,
++ 0x0c, 0x63, 0xdc, 0x4e, 0x19, 0xe6, 0x30, 0xb1, 0xe5, 0xa1, 0x06, 0x63,
++ 0xe2, 0x75, 0xe4, 0x7c, 0x66, 0x6b, 0x5f, 0x35, 0xfe, 0xe1, 0xfe, 0xfd,
++ 0xf6, 0x5a, 0xc8, 0x6d, 0x3c, 0x4f, 0xf6, 0xf9, 0x6c, 0xff, 0x88, 0xf1,
++ 0xf7, 0x9d, 0x8c, 0x79, 0x31, 0xfa, 0xd1, 0x96, 0x3e, 0x6b, 0xf1, 0xf7,
++ 0x17, 0xc6, 0x57, 0x56, 0x20, 0xc8, 0x98, 0xe4, 0x46, 0x6f, 0x9f, 0xde,
++ 0xdf, 0xca, 0x18, 0x74, 0x62, 0xa1, 0x49, 0x59, 0x3c, 0xd8, 0xd1, 0x27,
++ 0x98, 0x7a, 0xf4, 0xa6, 0x6a, 0xc4, 0xff, 0xa7, 0xc6, 0xf1, 0x7d, 0xcd,
++ 0x7e, 0xf6, 0x37, 0x0b, 0x6b, 0xf7, 0x5d, 0x46, 0x99, 0xeb, 0xe9, 0x83,
++ 0xcc, 0xab, 0x99, 0xef, 0xac, 0xde, 0x25, 0x7e, 0x81, 0x46, 0xc9, 0xd3,
++ 0x3a, 0xcd, 0x80, 0xf9, 0x06, 0x7d, 0xa8, 0x88, 0x5c, 0xe7, 0x41, 0x62,
++ 0x59, 0x31, 0x21, 0xb3, 0xcc, 0x08, 0x63, 0x21, 0x6d, 0x54, 0xde, 0xe1,
++ 0x98, 0x46, 0x5e, 0x37, 0x9f, 0xf3, 0x51, 0x92, 0xf1, 0x00, 0xe4, 0x10,
++ 0x20, 0x3e, 0x61, 0x94, 0x20, 0x38, 0xea, 0xe7, 0x71, 0x31, 0x0f, 0x2a,
++ 0x22, 0xa3, 0xa2, 0x66, 0x94, 0x75, 0x87, 0x47, 0x6c, 0x5b, 0xfc, 0x07,
++ 0xce, 0x7b, 0x82, 0xb6, 0x7e, 0x23, 0xb1, 0x7e, 0x62, 0x27, 0xd0, 0xfb,
++ 0x70, 0xce, 0xb6, 0x53, 0x6c, 0xbf, 0x85, 0x98, 0xf7, 0x1e, 0x6d, 0xb6,
++ 0x87, 0xf3, 0xbd, 0x63, 0xd0, 0x08, 0xd6, 0xa9, 0x01, 0x6d, 0x9c, 0xf3,
++ 0xdc, 0x35, 0xa2, 0xa2, 0xaf, 0x7f, 0x31, 0x86, 0x99, 0x07, 0x75, 0x0f,
++ 0x89, 0x8f, 0x48, 0x99, 0xc3, 0xe8, 0xa4, 0x8f, 0xfc, 0x6a, 0xa1, 0x82,
++ 0xd8, 0x17, 0xe4, 0x1d, 0x51, 0x27, 0xf3, 0xfd, 0xfb, 0xb0, 0x36, 0x71,
++ 0xc4, 0x2a, 0x37, 0xf4, 0xde, 0x21, 0x95, 0x79, 0x16, 0x6d, 0xb3, 0x8b,
++ 0xf9, 0xc9, 0x12, 0xe6, 0x27, 0xdd, 0x79, 0xbb, 0x3c, 0x4e, 0x3b, 0xec,
++ 0x63, 0x1c, 0x7b, 0x7d, 0x28, 0x17, 0xf7, 0x7e, 0xbc, 0xc3, 0x8f, 0xf9,
++ 0x97, 0x97, 0xe3, 0x99, 0x87, 0x73, 0xb2, 0xed, 0xa4, 0x4d, 0x3e, 0x4d,
++ 0x3d, 0xdf, 0x4a, 0xbd, 0xbe, 0x92, 0x12, 0x8c, 0x0a, 0xe2, 0x59, 0xf2,
++ 0xe8, 0xf5, 0xe4, 0x02, 0x2f, 0xa5, 0x72, 0x36, 0xf9, 0xf5, 0xf1, 0x2b,
++ 0xab, 0x72, 0xf1, 0xc1, 0x0b, 0xf5, 0x01, 0x79, 0x27, 0xcf, 0xb2, 0x96,
++ 0x98, 0xd9, 0x76, 0xf2, 0x1a, 0xb6, 0x1d, 0x21, 0x37, 0x72, 0x62, 0x66,
++ 0x32, 0x82, 0xa5, 0xa9, 0xda, 0xe6, 0xb9, 0xb2, 0x89, 0x63, 0x66, 0x8e,
++ 0x03, 0xba, 0x92, 0xf2, 0xcd, 0x0f, 0x0d, 0x65, 0xcc, 0x9d, 0xfe, 0x26,
++ 0xff, 0x9d, 0x91, 0x1b, 0xff, 0x0c, 0xee, 0xb8, 0x82, 0x32, 0xa5, 0xc8,
++ 0x1d, 0x27, 0xf3, 0xdf, 0x19, 0xb9, 0xc1, 0xfe, 0xce, 0x88, 0x1b, 0xd3,
++ 0xc6, 0x9d, 0xce, 0x2f, 0xa5, 0x3c, 0x98, 0x31, 0x7e, 0x96, 0x83, 0xba,
++ 0x8b, 0x22, 0x4d, 0x78, 0x2a, 0xa1, 0x60, 0xba, 0xf1, 0xbf, 0xf1, 0xb2,
++ 0xbd, 0x26, 0x50, 0x8d, 0x99, 0x0f, 0xc8, 0x7a, 0x42, 0x54, 0xde, 0x89,
++ 0x69, 0x7e, 0x82, 0xe7, 0x25, 0xc4, 0xd3, 0x8a, 0x07, 0x14, 0x3c, 0x1d,
++ 0xf0, 0xa2, 0x98, 0xbf, 0x7d, 0xe4, 0x9a, 0xce, 0x85, 0xcb, 0xad, 0xcd,
++ 0xab, 0xc4, 0xbe, 0x39, 0x87, 0xfb, 0xa6, 0x55, 0x0a, 0x06, 0xee, 0x35,
++ 0x65, 0xdd, 0xd2, 0x40, 0x4f, 0xa2, 0x9a, 0xfc, 0xba, 0xb6, 0xbd, 0x09,
++ 0xb5, 0xe6, 0x2f, 0x1c, 0xd5, 0x28, 0xda, 0x77, 0x63, 0x95, 0xac, 0xd9,
++ 0x7f, 0x9b, 0x73, 0xd6, 0x4d, 0xec, 0xea, 0x4a, 0xe5, 0xe2, 0x67, 0x53,
++ 0xfa, 0x17, 0x9a, 0xe8, 0xa5, 0x9b, 0xfc, 0x44, 0x4d, 0x9e, 0xb2, 0xcb,
++ 0x94, 0x45, 0x0e, 0x11, 0x7f, 0x66, 0xe1, 0x10, 0xf3, 0x1a, 0x89, 0xa5,
++ 0x65, 0x3c, 0xca, 0xc9, 0x1b, 0x7f, 0xc9, 0x58, 0x7a, 0x67, 0x28, 0x1b,
++ 0x94, 0x2f, 0xd0, 0x54, 0x91, 0x8b, 0xd3, 0x07, 0xb0, 0x2f, 0xa4, 0xb7,
++ 0xac, 0x76, 0x44, 0x9f, 0x61, 0x0e, 0x16, 0x5e, 0xcc, 0x9c, 0x7c, 0x79,
++ 0x60, 0x04, 0x5b, 0xc9, 0x03, 0xb7, 0x30, 0x17, 0x6f, 0xa5, 0x6d, 0xb6,
++ 0xef, 0x62, 0x6c, 0x73, 0x9c, 0xcb, 0xc5, 0xb5, 0x50, 0x7c, 0x35, 0x39,
++ 0x40, 0x87, 0x47, 0x15, 0x7b, 0x15, 0xdf, 0x09, 0xb4, 0xbe, 0x41, 0x8c,
++ 0xae, 0x63, 0xdc, 0x10, 0x7b, 0xdf, 0x9e, 0xd2, 0xdb, 0xa9, 0x80, 0xaa,
++ 0x72, 0xe6, 0x8e, 0x77, 0x8d, 0x35, 0xd0, 0x6f, 0xac, 0x4e, 0x37, 0xed,
++ 0xda, 0xb9, 0x68, 0x16, 0x73, 0xce, 0xab, 0xd0, 0xbd, 0x83, 0xf6, 0x4f,
++ 0x5f, 0xba, 0xb7, 0x0f, 0xe4, 0x67, 0xea, 0x16, 0xce, 0x5f, 0x76, 0x1f,
++ 0x02, 0x67, 0x5a, 0x50, 0xd7, 0x5c, 0xe4, 0x10, 0x19, 0xf4, 0x96, 0xb7,
++ 0xc9, 0xd3, 0x3a, 0x98, 0x9f, 0xae, 0x67, 0x2e, 0x1f, 0x63, 0x2e, 0x1f,
++ 0x63, 0xbd, 0xd4, 0x0e, 0x79, 0x4e, 0x64, 0xb4, 0x1c, 0x67, 0xfe, 0xf3,
++ 0x35, 0xf2, 0x9f, 0x1d, 0xf7, 0x8b, 0x5c, 0xd3, 0x71, 0xd7, 0xde, 0xab,
++ 0x90, 0xa4, 0x3d, 0xdd, 0xc9, 0x6b, 0x7d, 0xf7, 0x5f, 0x8c, 0x3b, 0x98,
++ 0xc7, 0xc7, 0xc6, 0x16, 0xa3, 0x9f, 0x99, 0xe8, 0xc6, 0xbd, 0x9f, 0x45,
++ 0x17, 0xf9, 0xd4, 0x12, 0x62, 0xf4, 0xea, 0x87, 0x47, 0x6c, 0xcc, 0x16,
++ 0xcc, 0x7f, 0x2d, 0x0d, 0xbc, 0x49, 0x4e, 0xd6, 0x9f, 0x3a, 0x60, 0xf3,
++ 0x34, 0x17, 0xe3, 0x43, 0x31, 0x71, 0x29, 0xbc, 0xcb, 0xe8, 0x58, 0xa6,
++ 0x5a, 0x8b, 0x4b, 0x16, 0x06, 0x7a, 0xdf, 0xa6, 0xaf, 0x56, 0xed, 0x53,
++ 0x51, 0x3d, 0x20, 0xb9, 0x3a, 0xf9, 0x11, 0x31, 0xfa, 0x05, 0x62, 0x74,
++ 0xf9, 0x9e, 0x5c, 0x5e, 0x9e, 0x60, 0xde, 0x55, 0x6d, 0xe4, 0x72, 0xf3,
++ 0xed, 0x7d, 0xb2, 0xf7, 0xc6, 0x8d, 0xe7, 0x68, 0xfb, 0x47, 0xf3, 0xb6,
++ 0x7f, 0x2c, 0x8f, 0xc1, 0x16, 0x73, 0xf3, 0x37, 0x6d, 0xfc, 0xcd, 0xe5,
++ 0xe6, 0xf3, 0x07, 0x8c, 0x8e, 0x30, 0x31, 0xfa, 0x33, 0x7b, 0xa4, 0x7f,
++ 0x0d, 0xd5, 0xc4, 0x93, 0x1a, 0x62, 0x49, 0xc5, 0x80, 0xac, 0xcf, 0x04,
++ 0xda, 0xc7, 0x55, 0x9f, 0xdd, 0xc7, 0x26, 0xca, 0xd6, 0x9d, 0x92, 0x77,
++ 0x6c, 0x0d, 0x6d, 0x83, 0x12, 0x30, 0xaf, 0xa1, 0x3e, 0xf7, 0xa5, 0xaf,
++ 0x42, 0x7b, 0xff, 0x2c, 0xec, 0x1f, 0x92, 0xf8, 0x22, 0xed, 0x4b, 0x2e,
++ 0xee, 0xc4, 0xfb, 0xbb, 0x66, 0xe3, 0xfd, 0x91, 0x73, 0x79, 0xf8, 0xe6,
++ 0x54, 0xf4, 0x5e, 0x86, 0xd7, 0xe5, 0x92, 0x87, 0xbf, 0xc4, 0x3c, 0xfc,
++ 0x6d, 0x45, 0xd6, 0x10, 0x55, 0xdc, 0xb8, 0xc0, 0xc1, 0xf8, 0xa2, 0xfb,
++ 0x5f, 0x74, 0xc4, 0xe5, 0x39, 0xb2, 0xff, 0x7e, 0xde, 0x7f, 0x9e, 0xf1,
++ 0x7c, 0x80, 0x33, 0x11, 0xad, 0x76, 0xe0, 0x99, 0x85, 0xf1, 0xa8, 0x8b,
++ 0xd7, 0x7b, 0xc9, 0x53, 0x66, 0x1a, 0x07, 0xe9, 0x9b, 0xb5, 0xe1, 0xf9,
++ 0x0e, 0x07, 0xce, 0x98, 0x7a, 0xcb, 0x6e, 0x5e, 0x7b, 0x36, 0x23, 0xbe,
++ 0x18, 0x26, 0x7e, 0x2d, 0xca, 0xfb, 0xa2, 0xbc, 0x8f, 0x01, 0xf7, 0x6c,
++ 0xda, 0xeb, 0x6b, 0x29, 0xbd, 0xff, 0x59, 0xda, 0x69, 0xf5, 0x59, 0x3b,
++ 0x2d, 0xec, 0xd3, 0x82, 0xbb, 0x2a, 0xd2, 0x82, 0x50, 0xb2, 0xb0, 0x5f,
++ 0x6b, 0x3f, 0x7a, 0x32, 0xf7, 0x60, 0xe3, 0x4e, 0x7d, 0xa3, 0xac, 0x11,
++ 0xbd, 0x10, 0x8a, 0x5b, 0x95, 0x46, 0x27, 0x5c, 0x0b, 0x8c, 0x16, 0xe6,
++ 0x2f, 0xb1, 0xef, 0x2a, 0xa5, 0xb4, 0xdf, 0xc3, 0xd8, 0x34, 0xac, 0x07,
++ 0xb7, 0x2b, 0x06, 0xe3, 0x86, 0x86, 0xfd, 0x83, 0x45, 0xb8, 0x75, 0x57,
++ 0x1b, 0xf6, 0xf5, 0x9b, 0xc4, 0xcf, 0x5a, 0xff, 0x69, 0xbc, 0x87, 0x63,
++ 0xa6, 0xbc, 0xaf, 0x54, 0x82, 0x36, 0x4d, 0xf6, 0x29, 0x31, 0xfb, 0x9c,
++ 0x7e, 0xde, 0x3b, 0xe0, 0x9e, 0x12, 0xa3, 0xf0, 0x2e, 0xbf, 0xc1, 0x7c,
++ 0x71, 0x12, 0x7b, 0x06, 0x65, 0x6d, 0x60, 0x9a, 0x72, 0xa4, 0x7f, 0xae,
++ 0xaf, 0x8b, 0xd8, 0x7f, 0xaf, 0x99, 0xc5, 0x99, 0x85, 0xd5, 0xc0, 0x0c,
++ 0x05, 0xa1, 0xcf, 0x04, 0xe4, 0x5b, 0x35, 0xfc, 0x7b, 0xd7, 0xf2, 0x7f,
++ 0x51, 0xda, 0xa9, 0xa9, 0xc8, 0xad, 0x17, 0xbc, 0x5e, 0x2d, 0xef, 0xf2,
++ 0x1d, 0x49, 0xcd, 0xac, 0xcc, 0x3d, 0x77, 0xfe, 0xa4, 0x3e, 0x5e, 0xb3,
++ 0xfc, 0x76, 0x1b, 0x85, 0xba, 0xaf, 0x5a, 0x51, 0xaf, 0x94, 0x2f, 0x62,
++ 0xdb, 0xe2, 0x9f, 0xd3, 0x94, 0x76, 0xe2, 0xa9, 0x1a, 0x9a, 0xa6, 0xb4,
++ 0x0d, 0x5d, 0xd8, 0xee, 0x8b, 0x56, 0xb4, 0x45, 0xce, 0x0b, 0xe5, 0xdc,
++ 0xd3, 0x50, 0x2a, 0x65, 0x0b, 0xf7, 0x9f, 0xc9, 0xb7, 0x55, 0x4c, 0xae,
++ 0x9a, 0x2b, 0x73, 0x6b, 0xbf, 0xec, 0xad, 0x8a, 0xe2, 0x68, 0xc3, 0xd4,
++ 0xf6, 0x0a, 0x7d, 0x7f, 0xef, 0xbc, 0xf6, 0x72, 0x65, 0x67, 0xb1, 0x4d,
++ 0x29, 0x9f, 0xc5, 0xff, 0x6b, 0xaf, 0x23, 0xbc, 0x61, 0xef, 0x93, 0xdc,
++ 0x6a, 0x36, 0x46, 0x4b, 0xf0, 0x39, 0xa8, 0x97, 0xc6, 0xe7, 0x97, 0xd8,
++ 0xfc, 0x36, 0xda, 0x52, 0xc2, 0x1c, 0xd7, 0x6d, 0x44, 0xef, 0x75, 0x23,
++ 0x9b, 0x65, 0x5c, 0x6e, 0x3d, 0xa3, 0xec, 0x57, 0x6e, 0x0d, 0xe8, 0x1b,
++ 0xdf, 0x25, 0xdf, 0x78, 0x3e, 0x10, 0x27, 0xd6, 0x1b, 0xbe, 0x3e, 0x45,
++ 0x37, 0xd7, 0x32, 0xa6, 0x3d, 0xcb, 0x1c, 0x72, 0x4d, 0xa0, 0xd7, 0x7e,
++ 0xc6, 0xa8, 0x44, 0x56, 0xe0, 0x12, 0xfb, 0xbb, 0x2c, 0x2d, 0x30, 0xd2,
++ 0xcf, 0xcb, 0x9a, 0x17, 0x7f, 0xc7, 0x30, 0xdf, 0xbe, 0xb6, 0x06, 0x41,
++ 0xfb, 0xff, 0xaa, 0xfc, 0xb7, 0x5b, 0x5a, 0x51, 0x6b, 0xff, 0xbf, 0x19,
++ 0x73, 0xd3, 0x67, 0xd7, 0x86, 0xd1, 0x6d, 0x5a, 0xd6, 0x53, 0xa6, 0x85,
++ 0x37, 0xce, 0xed, 0xd1, 0x5e, 0xe1, 0x60, 0xce, 0x41, 0x17, 0x8e, 0xe5,
++ 0xbe, 0x5d, 0x75, 0xee, 0xfd, 0x8c, 0xa5, 0xe7, 0xed, 0xd1, 0x96, 0xf7,
++ 0xe2, 0xab, 0xed, 0x6f, 0x93, 0xcd, 0x5b, 0xe4, 0xc4, 0x73, 0x89, 0x8a,
++ 0x98, 0x87, 0xbf, 0x37, 0x2d, 0x2a, 0xc2, 0xfa, 0x10, 0x39, 0xdf, 0xa5,
++ 0xc7, 0x71, 0xda, 0xfe, 0x46, 0x43, 0x3c, 0x24, 0xdf, 0x66, 0x38, 0x9a,
++ 0x50, 0x71, 0x6c, 0xb0, 0x27, 0xb4, 0xc7, 0xee, 0xfb, 0x55, 0x74, 0x8f,
++ 0xca, 0x73, 0xbf, 0x16, 0xac, 0x4e, 0x4c, 0xda, 0x7b, 0xda, 0x36, 0xa7,
++ 0x24, 0xf7, 0xd6, 0xb3, 0x6b, 0x98, 0xaf, 0xaa, 0x8e, 0x20, 0x6e, 0x62,
++ 0x7c, 0x79, 0x21, 0x41, 0x3b, 0x5d, 0xa8, 0x77, 0x7c, 0x97, 0x1c, 0xa1,
++ 0x22, 0xa2, 0x07, 0xdf, 0x51, 0x5a, 0xc9, 0xc5, 0xdc, 0x98, 0x48, 0x88,
++ 0x2d, 0xca, 0xb7, 0x9d, 0x6e, 0xc6, 0x7e, 0x72, 0xd2, 0xe7, 0x13, 0x1a,
++ 0x4e, 0x37, 0x78, 0x90, 0x26, 0x47, 0x7d, 0x2e, 0xe1, 0xc6, 0x63, 0xe4,
++ 0xa8, 0x8f, 0x0e, 0xca, 0x1a, 0x61, 0x13, 0x1a, 0x13, 0xb2, 0x3e, 0x4c,
++ 0xde, 0x35, 0xe2, 0xa5, 0x3d, 0x5a, 0x56, 0x37, 0x6d, 0xb7, 0x4d, 0x9b,
++ 0x60, 0x9f, 0xb2, 0xae, 0x18, 0xc5, 0x35, 0xe4, 0x1d, 0x8f, 0x8e, 0xf8,
++ 0xf0, 0x7d, 0x72, 0xf3, 0x24, 0xeb, 0xbd, 0x90, 0xf0, 0xa3, 0x2f, 0xed,
++ 0xc3, 0xd3, 0xe4, 0xe8, 0x5b, 0x78, 0x2e, 0xdf, 0x09, 0x2b, 0x32, 0x82,
++ 0xe4, 0xc1, 0x87, 0x51, 0xd6, 0x77, 0x11, 0xd6, 0xad, 0x3c, 0x08, 0xb5,
++ 0xef, 0x10, 0x8f, 0x2b, 0x19, 0xb3, 0xaf, 0x44, 0x6a, 0x30, 0x82, 0xd4,
++ 0xc8, 0x8f, 0xd0, 0x3b, 0x28, 0xe3, 0x92, 0xef, 0x3d, 0xc9, 0xbe, 0x27,
++ 0x72, 0xbd, 0x3e, 0x2f, 0x86, 0x46, 0xa4, 0x9f, 0x6a, 0xf6, 0xfd, 0xe7,
++ 0xb6, 0xff, 0x1f, 0xd6, 0xba, 0x1b, 0xa5, 0xed, 0x83, 0x9f, 0xd0, 0xbe,
++ 0xe8, 0xaa, 0xf0, 0x9e, 0xa1, 0xac, 0x75, 0xb8, 0xd9, 0xa6, 0x07, 0x8e,
++ 0x48, 0x76, 0x65, 0x39, 0xf4, 0xe8, 0x36, 0xc5, 0x68, 0x2e, 0x53, 0x26,
++ 0xb1, 0x2d, 0x23, 0xef, 0x8d, 0x15, 0xe3, 0x69, 0xe2, 0xa3, 0x2b, 0xa4,
++ 0x6b, 0xdf, 0xa5, 0xed, 0x2c, 0x21, 0xa6, 0xbc, 0x61, 0x7e, 0x06, 0x71,
++ 0x4d, 0xf4, 0x57, 0x8c, 0x1f, 0xf4, 0xbb, 0xf1, 0x4e, 0x28, 0x82, 0xdc,
++ 0xb7, 0xbd, 0x3c, 0xf8, 0x71, 0xc2, 0xcb, 0xf9, 0xaa, 0xcb, 0x1a, 0x8e,
++ 0xb9, 0xc0, 0xb4, 0xdc, 0xb5, 0xa3, 0x89, 0x35, 0xd8, 0x43, 0x79, 0x5f,
++ 0x48, 0x9c, 0xe1, 0xfc, 0xb4, 0x53, 0xff, 0xa2, 0xef, 0x78, 0x5e, 0xd7,
++ 0x3d, 0xd4, 0xf5, 0x2c, 0x3c, 0x9b, 0xb8, 0x0f, 0x8f, 0x52, 0xfe, 0x47,
++ 0xfa, 0x8d, 0xe8, 0xc5, 0xca, 0x61, 0xe2, 0x65, 0x31, 0x8e, 0xb1, 0xed,
++ 0x5b, 0x99, 0x29, 0x4f, 0x4a, 0x5f, 0x29, 0x59, 0x9f, 0x54, 0xf0, 0xce,
++ 0xa2, 0xc3, 0x18, 0xe7, 0xbd, 0x1f, 0xf3, 0x77, 0x78, 0x61, 0x25, 0xfb,
++ 0x10, 0xfd, 0xf8, 0xed, 0x5c, 0xa0, 0x8b, 0x3c, 0x67, 0x79, 0xc3, 0x61,
++ 0x6c, 0x1d, 0x92, 0x6b, 0x6d, 0xe8, 0xed, 0x7f, 0x0f, 0x8e, 0x10, 0x71,
++ 0xc8, 0xdb, 0x40, 0x5b, 0xcf, 0x62, 0x5b, 0xfa, 0xc3, 0x69, 0x39, 0x0e,
++ 0xfa, 0xca, 0x34, 0xd9, 0x8b, 0x7c, 0x34, 0x51, 0x8c, 0xe7, 0x58, 0x67,
++ 0x5d, 0xc8, 0x95, 0x7f, 0x66, 0x72, 0x98, 0xfc, 0xc9, 0x89, 0x34, 0xfb,
++ 0x48, 0xd8, 0x6d, 0x4c, 0x53, 0x76, 0xd3, 0x0f, 0x2b, 0x17, 0x4e, 0x53,
++ 0x52, 0x43, 0xc2, 0xed, 0x7f, 0x84, 0x27, 0xef, 0xcf, 0xe9, 0x70, 0x8f,
++ 0xb9, 0x06, 0x43, 0xe9, 0x1f, 0x17, 0xda, 0x9b, 0xf2, 0x2e, 0x9c, 0xbc,
++ 0x9f, 0x53, 0x78, 0x57, 0x27, 0xf7, 0x4c, 0xeb, 0xdb, 0x99, 0x0a, 0xf2,
++ 0xe7, 0x52, 0xda, 0x5a, 0x51, 0xcc, 0xcb, 0xb8, 0xba, 0x66, 0x81, 0x86,
++ 0x9d, 0x97, 0xd5, 0x4d, 0x43, 0x85, 0xe6, 0xfc, 0x75, 0xc3, 0xf3, 0xec,
++ 0xa7, 0x22, 0x56, 0x15, 0xd9, 0x63, 0xef, 0x83, 0x0a, 0x5d, 0x56, 0xc3,
++ 0xb8, 0x22, 0xcf, 0x86, 0x63, 0x78, 0x2b, 0x51, 0x1d, 0xab, 0x8e, 0x54,
++ 0x12, 0x6f, 0x4f, 0xa3, 0x6f, 0xd8, 0x89, 0x0a, 0xf2, 0xe6, 0xf2, 0x64,
++ 0x35, 0xdc, 0xf6, 0x3a, 0xde, 0x45, 0xe4, 0x2b, 0xb3, 0xc9, 0x49, 0x66,
++ 0xa1, 0x92, 0xbc, 0xc4, 0x13, 0xb2, 0xac, 0x9f, 0x2d, 0xb4, 0xac, 0x4b,
++ 0x78, 0x94, 0xf0, 0x38, 0x15, 0x12, 0x3f, 0x8d, 0xa2, 0xce, 0xf6, 0x57,
++ 0x03, 0xf5, 0xf6, 0xff, 0x26, 0xfa, 0x7a, 0x47, 0x68, 0xfe, 0xf8, 0x7d,
++ 0xa1, 0xb9, 0xe3, 0x35, 0x50, 0x07, 0xa6, 0xc3, 0xc1, 0xb6, 0xbe, 0x70,
++ 0x99, 0x85, 0x26, 0xfa, 0xf0, 0x5a, 0x53, 0x78, 0xd1, 0x1a, 0xf2, 0xa2,
++ 0xde, 0x90, 0x31, 0x7e, 0x10, 0x57, 0x33, 0xce, 0xb9, 0x07, 0x7c, 0xec,
++ 0x47, 0x72, 0x6c, 0x67, 0x76, 0x0e, 0xf9, 0xf6, 0x67, 0x16, 0x0a, 0x47,
++ 0x6a, 0x25, 0x47, 0x3a, 0x84, 0xd6, 0xf1, 0xc3, 0xb8, 0x9e, 0x65, 0x3c,
++ 0xe4, 0x2a, 0xc9, 0xcc, 0x8f, 0xd0, 0x97, 0xb1, 0xb0, 0x3d, 0x94, 0xc5,
++ 0xb5, 0x6c, 0xbb, 0x74, 0xa0, 0x99, 0xdc, 0x70, 0x05, 0xd6, 0x8d, 0xcb,
++ 0xbb, 0x52, 0x13, 0x58, 0x3e, 0x4e, 0xce, 0x39, 0x5e, 0xf0, 0x57, 0xe1,
++ 0x4b, 0x2b, 0xc8, 0x97, 0x64, 0x2d, 0x6d, 0x95, 0xbd, 0x96, 0xa6, 0xd2,
++ 0x0f, 0x1b, 0x13, 0xf2, 0x9e, 0x50, 0x1c, 0xab, 0xc7, 0x05, 0xab, 0xef,
++ 0x41, 0xf7, 0xb8, 0xac, 0xcd, 0x7e, 0x33, 0x74, 0xf1, 0xf8, 0xab, 0x68,
++ 0x1c, 0x1f, 0x0a, 0xcd, 0x1b, 0x1f, 0xa1, 0xdc, 0x09, 0xca, 0xd6, 0x1f,
++ 0xaa, 0x1d, 0x1f, 0x0c, 0x05, 0xc7, 0x77, 0x87, 0x02, 0xe3, 0x2d, 0xd8,
++ 0x32, 0xbe, 0x0a, 0x9b, 0xc7, 0x37, 0x62, 0xd3, 0xb8, 0xe0, 0xfc, 0x24,
++ 0x96, 0x8d, 0xbf, 0x81, 0xa5, 0xe3, 0xcf, 0xa3, 0x69, 0xfc, 0x04, 0x96,
++ 0x8c, 0xff, 0x08, 0xcd, 0xe3, 0xaf, 0x70, 0x2c, 0xb2, 0xd6, 0x2b, 0xeb,
++ 0xbc, 0x85, 0xe7, 0x6a, 0x53, 0xf7, 0x24, 0xcb, 0x5a, 0x86, 0x7c, 0xbf,
++ 0x43, 0xe6, 0xd0, 0x85, 0x95, 0xda, 0x6b, 0xe8, 0xd9, 0x25, 0xdf, 0x24,
++ 0xac, 0xd3, 0xba, 0xe5, 0xf9, 0xa3, 0xf7, 0x79, 0xd9, 0x63, 0x4f, 0x1b,
++ 0x3b, 0xff, 0xbd, 0xbc, 0xc9, 0xb3, 0xcf, 0x18, 0xe5, 0x1b, 0x18, 0xf2,
++ 0xec, 0x73, 0x12, 0x5d, 0x99, 0xdf, 0x5a, 0x51, 0x4d, 0xca, 0xca, 0xf7,
++ 0x3f, 0xc4, 0x1e, 0x5e, 0xc3, 0x43, 0xbb, 0x26, 0xc9, 0x59, 0xb2, 0xf6,
++ 0x5a, 0xcd, 0xbb, 0xf3, 0xe4, 0x9b, 0x56, 0xf2, 0xce, 0xfe, 0x6b, 0x48,
++ 0x8d, 0x02, 0xe3, 0x0f, 0x8b, 0x1f, 0xae, 0xa1, 0x1f, 0x66, 0xc5, 0x27,
++ 0xe3, 0xc4, 0xe4, 0xaf, 0x78, 0x70, 0x0f, 0x79, 0x49, 0x11, 0xb2, 0x23,
++ 0xa5, 0x78, 0x66, 0x30, 0x6e, 0xcd, 0x31, 0x3c, 0x28, 0x8f, 0x18, 0xd9,
++ 0x4b, 0x18, 0x67, 0x5f, 0xe1, 0xb5, 0x89, 0x7e, 0xf8, 0x7d, 0x46, 0xc0,
++ 0x37, 0x87, 0xe7, 0xc7, 0x86, 0xb2, 0xe4, 0x14, 0x1d, 0x98, 0xe4, 0x7f,
++ 0xc9, 0x41, 0x81, 0x6e, 0x0c, 0x0d, 0x89, 0x3e, 0x5b, 0xa8, 0x4f, 0xc1,
++ 0x45, 0xbd, 0xa3, 0x89, 0x78, 0x68, 0x29, 0x82, 0x87, 0x2a, 0xca, 0x1e,
++ 0xe8, 0xa4, 0xbf, 0xea, 0xb1, 0x9f, 0x30, 0x16, 0xf4, 0x29, 0x3f, 0xc2,
++ 0x73, 0xcc, 0x19, 0x4a, 0x1f, 0x20, 0xff, 0x20, 0x56, 0x56, 0x44, 0x14,
++ 0x63, 0x79, 0xe0, 0x14, 0x9e, 0x19, 0x71, 0xc2, 0x9d, 0x74, 0x62, 0x82,
++ 0x38, 0xe9, 0x48, 0xca, 0xf3, 0x7a, 0x8d, 0xb2, 0xc8, 0xba, 0xd0, 0x09,
++ 0x64, 0xed, 0xe7, 0x69, 0xf2, 0x3c, 0xe4, 0x45, 0xbb, 0x1f, 0x27, 0x65,
++ 0xef, 0x21, 0x96, 0x76, 0xa5, 0x5e, 0x42, 0xd3, 0x90, 0x07, 0x73, 0x92,
++ 0x13, 0xcc, 0x5f, 0x5e, 0x45, 0x6a, 0xd7, 0x2c, 0x7c, 0x95, 0x3c, 0x70,
++ 0x66, 0xd2, 0x84, 0x46, 0xbd, 0xdd, 0x34, 0x66, 0x22, 0xba, 0x77, 0x15,
++ 0x56, 0xee, 0xfd, 0x22, 0x8f, 0xe9, 0xb8, 0x7e, 0x6f, 0x3b, 0x3e, 0x3f,
++ 0x16, 0x47, 0xeb, 0x58, 0x0f, 0x8f, 0x36, 0x5c, 0xb7, 0xa3, 0x12, 0xe9,
++ 0x90, 0xc6, 0x9c, 0xba, 0x8d, 0x39, 0xb5, 0xf0, 0xa1, 0xd5, 0x78, 0x86,
++ 0xb8, 0x13, 0x0c, 0xad, 0xc6, 0x84, 0xed, 0x8b, 0xb2, 0x97, 0x71, 0x35,
++ 0x36, 0x31, 0x5f, 0x1e, 0xc6, 0x6a, 0x74, 0xf1, 0xda, 0x0e, 0x7b, 0x0e,
++ 0x0e, 0x63, 0x31, 0xf3, 0xa1, 0xf7, 0x2f, 0x3f, 0x8c, 0x2b, 0xf6, 0x48,
++ 0xdf, 0xa7, 0x91, 0xda, 0xb9, 0x86, 0x6d, 0x66, 0xd1, 0x32, 0xf6, 0x43,
++ 0x7c, 0x7e, 0x07, 0x6e, 0xab, 0x44, 0x25, 0x9e, 0x0f, 0x05, 0x5a, 0xfb,
++ 0x94, 0x1f, 0xda, 0x6d, 0x6f, 0xa2, 0x1f, 0x6f, 0x65, 0xb9, 0x47, 0xd2,
++ 0x27, 0xd0, 0x9b, 0x9a, 0x3a, 0xa7, 0xf6, 0x7b, 0xed, 0x8c, 0x07, 0x2f,
++ 0x63, 0xdf, 0xc8, 0x24, 0xb1, 0xf7, 0x24, 0x8f, 0x0b, 0x9f, 0x5f, 0x7b,
++ 0xed, 0x7c, 0x26, 0x67, 0x37, 0x92, 0xbf, 0xc8, 0x3a, 0x70, 0x0b, 0x7c,
++ 0x29, 0xe1, 0x44, 0xd9, 0xad, 0x33, 0xa1, 0x6f, 0x0c, 0xdb, 0x1c, 0xc9,
++ 0x88, 0x91, 0x1b, 0xb5, 0x7c, 0x57, 0xf1, 0x90, 0x1b, 0x05, 0xb1, 0x22,
++ 0xa3, 0x47, 0xaf, 0xa5, 0xbe, 0x4b, 0xee, 0x7f, 0x19, 0xce, 0xfb, 0x9d,
++ 0x28, 0x4e, 0xca, 0xda, 0xc9, 0x04, 0x7a, 0x33, 0xf2, 0xfe, 0x6e, 0x56,
++ 0x2f, 0x26, 0xae, 0x16, 0x25, 0xb3, 0x8c, 0xfd, 0xd9, 0xf9, 0x45, 0x90,
++ 0x77, 0xf1, 0xaf, 0xc2, 0x9a, 0xfe, 0x28, 0xba, 0x4c, 0x79, 0x57, 0x27,
++ 0x37, 0xfe, 0x39, 0x0d, 0x2f, 0xa3, 0x9b, 0xf1, 0xa7, 0x8d, 0x98, 0xf8,
++ 0x55, 0xfb, 0x59, 0xe8, 0xcb, 0xe8, 0x19, 0x2c, 0xbc, 0xbb, 0x2e, 0x6d,
++ 0x3e, 0x4f, 0xbd, 0xb9, 0xf2, 0xdf, 0xec, 0x91, 0x36, 0x75, 0xd3, 0xaf,
++ 0x4e, 0xcb, 0xbd, 0x8b, 0x03, 0xfb, 0x19, 0x36, 0xed, 0xe3, 0x35, 0xf4,
++ 0xee, 0x2a, 0x8c, 0x99, 0xb9, 0x41, 0xe0, 0x35, 0xf4, 0x8f, 0xca, 0xd8,
++ 0xaf, 0x9f, 0x96, 0x7b, 0xc7, 0x78, 0xaa, 0x3e, 0x0a, 0x75, 0x1d, 0xb4,
++ 0xe7, 0xc2, 0xfd, 0x8f, 0xfb, 0x6e, 0xd0, 0xa7, 0xec, 0x6f, 0xf0, 0xe4,
++ 0xbe, 0x81, 0x04, 0x3c, 0x99, 0x90, 0x77, 0xfb, 0xd5, 0xc5, 0x2e, 0xa8,
++ 0x5e, 0x17, 0x8a, 0x19, 0x2f, 0x6a, 0xd0, 0xed, 0xb5, 0x70, 0x35, 0xc7,
++ 0xb2, 0xbf, 0xfe, 0x3a, 0x66, 0x1a, 0xf1, 0x56, 0x97, 0xfd, 0xce, 0xe1,
++ 0x8a, 0xbf, 0xfe, 0xe8, 0x3b, 0x87, 0x6f, 0x10, 0x67, 0x15, 0x94, 0x1b,
++ 0x37, 0xe1, 0x05, 0x3b, 0xa6, 0x28, 0x28, 0x9b, 0x2b, 0xeb, 0x98, 0x7e,
++ 0x3c, 0x6b, 0xd4, 0xf9, 0xab, 0xe4, 0xf9, 0x94, 0x72, 0xca, 0x92, 0x6f,
++ 0x06, 0x6c, 0xcb, 0xfc, 0xb1, 0x3d, 0xf1, 0x4f, 0x61, 0xcb, 0xce, 0x30,
++ 0xe4, 0xfd, 0x15, 0xa7, 0xa1, 0x79, 0x73, 0xfc, 0x4a, 0x64, 0x93, 0xbd,
++ 0xe4, 0xb7, 0x12, 0x9c, 0xde, 0xa0, 0x9f, 0xbe, 0x21, 0x7b, 0xa6, 0xc8,
++ 0x99, 0xfe, 0x12, 0xc1, 0xaa, 0xc2, 0x38, 0x65, 0xaf, 0xa9, 0x92, 0x1b,
++ 0xab, 0x5d, 0x47, 0xca, 0x4a, 0xbd, 0x37, 0xec, 0x35, 0x5c, 0x97, 0xf1,
++ 0x5b, 0xeb, 0x4d, 0x6f, 0x35, 0xcb, 0x1e, 0xce, 0xdf, 0x9f, 0x14, 0x9f,
++ 0x33, 0xe5, 0x1b, 0x56, 0x4e, 0xbb, 0x8e, 0xe8, 0xf7, 0x5c, 0x9d, 0xee,
++ 0x94, 0x83, 0xb8, 0x79, 0xc2, 0xea, 0xf4, 0xca, 0x18, 0xee, 0xbc, 0xa0,
++ 0x8e, 0xac, 0x2b, 0x68, 0xd2, 0x6f, 0x58, 0xc6, 0xdc, 0x95, 0xf9, 0x68,
++ 0x9f, 0xb2, 0xde, 0x5b, 0x64, 0x94, 0xe1, 0x54, 0x55, 0x6e, 0x1d, 0xe6,
++ 0x9c, 0x8c, 0x3d, 0x35, 0xb2, 0x4f, 0xaf, 0xd8, 0x3e, 0xb7, 0xfb, 0x35,
++ 0xcf, 0xd5, 0xfb, 0xbb, 0xfc, 0x78, 0xab, 0xed, 0x77, 0x86, 0x1e, 0xb4,
++ 0x79, 0x91, 0x63, 0xca, 0xb8, 0x4b, 0x6a, 0xce, 0xef, 0xe7, 0x2b, 0xf9,
++ 0x7e, 0x45, 0x1e, 0xef, 0x94, 0x3e, 0x44, 0xae, 0x87, 0xf3, 0x75, 0xf4,
++ 0x70, 0xd4, 0xee, 0x5f, 0x65, 0xbe, 0x55, 0xe8, 0x93, 0xfe, 0xb8, 0xb0,
++ 0xd0, 0x46, 0x56, 0xec, 0xb3, 0xb3, 0x98, 0xb1, 0xed, 0x54, 0xc3, 0x3d,
++ 0xd8, 0x94, 0x10, 0x3d, 0xcb, 0xb7, 0x60, 0x89, 0xe1, 0x36, 0x57, 0x73,
++ 0xd1, 0x5f, 0x2f, 0xc3, 0x90, 0x16, 0xc7, 0x9e, 0x7a, 0x79, 0x47, 0xce,
++ 0x45, 0x9f, 0x88, 0xa3, 0xc4, 0x28, 0x96, 0xfd, 0xc7, 0xf6, 0x1e, 0x94,
++ 0x7d, 0xa6, 0x1e, 0x7d, 0x52, 0xbe, 0x55, 0x76, 0xa9, 0xbd, 0x5e, 0xd5,
++ 0x3c, 0x04, 0xb9, 0x6e, 0xe2, 0xda, 0xf3, 0xf2, 0xfe, 0x12, 0xda, 0x8e,
++ 0xbd, 0x27, 0xda, 0x94, 0x77, 0xe8, 0xfa, 0x12, 0xf2, 0x2e, 0x57, 0x5d,
++ 0x8c, 0xfc, 0x12, 0x2f, 0xa4, 0x65, 0xbf, 0xc2, 0xef, 0xac, 0x78, 0x8d,
++ 0xec, 0x8b, 0x9c, 0x5a, 0xa7, 0x88, 0xb8, 0x16, 0x08, 0x57, 0x28, 0x85,
++ 0xf7, 0xb9, 0xce, 0xfd, 0x5d, 0x4f, 0x9b, 0x39, 0x6d, 0xbf, 0x83, 0x27,
++ 0x67, 0x11, 0x34, 0xa6, 0xe4, 0x9b, 0xa7, 0xfa, 0xc4, 0x72, 0xd4, 0x65,
++ 0x6b, 0x1d, 0xce, 0x3c, 0x7f, 0x09, 0x63, 0x05, 0xed, 0x66, 0x73, 0x20,
++ 0x6c, 0xbf, 0x6b, 0xb6, 0x2c, 0x55, 0x1b, 0x7c, 0x04, 0x7a, 0xfb, 0xdb,
++ 0x2c, 0x7f, 0x5d, 0xe6, 0xfb, 0xd6, 0x90, 0x57, 0xc6, 0x54, 0xc0, 0x88,
++ 0x13, 0xf4, 0x0d, 0xea, 0x31, 0x22, 0xfe, 0xe1, 0x41, 0x55, 0x24, 0x4c,
++ 0x3f, 0x96, 0xf8, 0x2f, 0xef, 0xa9, 0xe9, 0xbb, 0xe3, 0x30, 0xd1, 0xc8,
++ 0x1c, 0xdd, 0x65, 0xef, 0x73, 0xd6, 0xfd, 0x2b, 0x19, 0x87, 0x8e, 0x9c,
++ 0xdd, 0x13, 0x20, 0x7c, 0xe1, 0xc7, 0x35, 0xf9, 0xbd, 0xd0, 0xee, 0x39,
++ 0x8c, 0x8f, 0x96, 0xfd, 0x9c, 0x7f, 0x8d, 0x8d, 0x2d, 0x9a, 0xa1, 0xef,
++ 0xff, 0x95, 0xa3, 0x13, 0x4f, 0x2c, 0x30, 0x3a, 0x0e, 0xa8, 0xd9, 0x21,
++ 0x1f, 0x71, 0xe6, 0x4a, 0x47, 0x74, 0x07, 0xff, 0xfb, 0x5f, 0xb4, 0xbf,
++ 0xa1, 0x22, 0x75, 0xf5, 0xe0, 0x2a, 0x55, 0xf6, 0x0f, 0xb5, 0x60, 0xac,
++ 0x4f, 0xde, 0x7d, 0xd0, 0x5b, 0xbf, 0xad, 0x74, 0x62, 0x43, 0xc8, 0x68,
++ 0xd9, 0xa8, 0xe8, 0xcd, 0x7f, 0xaf, 0xe8, 0xfe, 0x90, 0x22, 0xe5, 0x82,
++ 0xb2, 0xb6, 0x77, 0x36, 0xf6, 0xba, 0xd8, 0xc7, 0xde, 0x84, 0x1e, 0x9e,
++ 0xc6, 0xb2, 0xa7, 0x4c, 0xc3, 0xf7, 0x1e, 0xdb, 0xfc, 0x09, 0x8f, 0x1d,
++ 0xf6, 0x3b, 0xec, 0x52, 0x3e, 0x3a, 0xdf, 0x65, 0x7f, 0x8f, 0xb8, 0x95,
++ 0x31, 0x45, 0xbe, 0x35, 0x1c, 0x83, 0x96, 0x9c, 0x45, 0x13, 0xd3, 0x7b,
++ 0x6f, 0x80, 0xe4, 0xc0, 0x37, 0x4f, 0x47, 0xa9, 0x07, 0xde, 0x48, 0x27,
++ 0xe6, 0x2e, 0x30, 0x7c, 0x8b, 0x54, 0xbb, 0x7e, 0x30, 0xaa, 0x4a, 0x7d,
++ 0xdd, 0x3f, 0x08, 0x69, 0x23, 0x6b, 0x69, 0x73, 0x2b, 0xed, 0x3a, 0x0b,
++ 0xd4, 0xcf, 0xc1, 0xf5, 0xe9, 0x5f, 0xcb, 0x37, 0x8b, 0xb4, 0x6a, 0x43,
++ 0xea, 0xc4, 0x77, 0x68, 0xf8, 0x63, 0xf5, 0x04, 0x57, 0x7e, 0x65, 0x61,
++ 0xba, 0xd4, 0x93, 0x3d, 0x66, 0x37, 0xe3, 0x76, 0xfb, 0xbb, 0x2b, 0xe2,
++ 0x8f, 0x7a, 0xf4, 0x6e, 0x72, 0xd5, 0x52, 0x45, 0x78, 0xaa, 0xc4, 0xa2,
++ 0x36, 0xe2, 0x61, 0x27, 0xb4, 0x90, 0xde, 0x7b, 0x91, 0xea, 0x41, 0x71,
++ 0x64, 0x54, 0xf6, 0xd9, 0xec, 0x9e, 0xa7, 0xe6, 0xf6, 0xe3, 0xc4, 0xd8,
++ 0xee, 0x91, 0x3f, 0xfa, 0xdc, 0x97, 0x7d, 0x95, 0x9a, 0xf2, 0xce, 0x8e,
++ 0xfd, 0x9e, 0x48, 0x5b, 0xc2, 0x91, 0xdf, 0x5f, 0x58, 0x98, 0x5b, 0x0d,
++ 0x6b, 0x98, 0x17, 0xac, 0x95, 0x6f, 0x63, 0x72, 0xac, 0xeb, 0x12, 0xb2,
++ 0x0a, 0xf5, 0x7f, 0x01, 0x28, 0xfc, 0xfc, 0x40, 0x38, 0x5a, 0x00, 0x00,
++ 0x00 };
+
+ static const u32 bnx2_CP_b06FwData[(0x84/4) + 1] = {
+ 0x00000000, 0x0000001b, 0x0000000f, 0x0000000a, 0x00000008, 0x00000006,
+@@ -2119,51 +2137,50 @@
+ 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002,
+ 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002,
+ 0x00000001, 0x00000001, 0x00000001, 0x00000000 };
+-static const u32 bnx2_CP_b06FwRodata[(0x134/4) + 1] = {
+- 0x08000f30, 0x08000d88, 0x08000fc4, 0x0800106c, 0x08000f58, 0x08000f98,
+- 0x080011a4, 0x08000da4, 0x080011c8, 0x08000df4, 0x08001498, 0x08001440,
+- 0x08000da4, 0x08000da4, 0x08000da4, 0x08001254, 0x08001254, 0x08000da4,
+- 0x08000da4, 0x080016e0, 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4,
+- 0x080013d4, 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4,
+- 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4,
+- 0x08000da4, 0x08000da4, 0x08000da4, 0x08000fb8, 0x08000da4, 0x08000da4,
+- 0x08001690, 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4,
+- 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4,
+- 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4, 0x08000da4,
+- 0x080015bc, 0x08000da4, 0x08000da4, 0x08001348, 0x080012b8, 0x08002e50,
+- 0x08002e58, 0x08002e20, 0x08002e2c, 0x08002e38, 0x08002e44, 0x0800532c,
+- 0x080052ec, 0x080052b8, 0x0800528c, 0x08005268, 0x08005224, 0x00000000
+-};
++static const u32 bnx2_CP_b06FwRodata[(0x130/4) + 1] = {
++ 0x08001e8c, 0x08001d18, 0x08001e68, 0x08001e44, 0x08001e20, 0x08001dfc,
++ 0x08001dd4, 0x08001dac, 0x08001d80, 0x08001f84, 0x08001f74, 0x08001d34,
++ 0x08001d34, 0x08001d34, 0x08001eb4, 0x08001eb4, 0x08001d34, 0x08001d34,
++ 0x08001f64, 0x08001d34, 0x08001d34, 0x08001d34, 0x08001d34, 0x08001f54,
++ 0x08001d34, 0x08001d34, 0x08001d34, 0x08001d34, 0x08001d34, 0x08001d34,
++ 0x08001d34, 0x08001d34, 0x08001d34, 0x08001d34, 0x08001d34, 0x08001d34,
++ 0x08001d34, 0x08001d34, 0x08001f44, 0x08001d34, 0x08001d34, 0x08001f34,
++ 0x08001d34, 0x08001d34, 0x08001d34, 0x08001d34, 0x08001d34, 0x08001d34,
++ 0x08001d34, 0x08001d34, 0x08001d34, 0x08001d34, 0x08001d34, 0x08001d34,
++ 0x08001d34, 0x08001d34, 0x08001d34, 0x08001d34, 0x08001d34, 0x08001f1c,
++ 0x08001d34, 0x08001d34, 0x08001f0c, 0x08001efc, 0x08003208, 0x08003210,
++ 0x080031d8, 0x080031e4, 0x080031f0, 0x080031fc, 0x08005694, 0x08005654,
++ 0x08005620, 0x080055f4, 0x080055d0, 0x0800558c, 0x00000000 };
+
+ static struct fw_info bnx2_cp_fw_06 = {
+- /* Firmware version: 4.6.16 */
++ /* Firmware version: 4.4.22 */
+ .ver_major = 0x4,
+- .ver_minor = 0x6,
+- .ver_fix = 0x10,
++ .ver_minor = 0x4,
++ .ver_fix = 0x16,
+
+ .start_addr = 0x08000080,
+
+ .text_addr = 0x08000000,
+- .text_len = 0x56cc,
++ .text_len = 0x5a34,
+ .text_index = 0x0,
+ .gz_text = bnx2_CP_b06FwText,
+ .gz_text_len = sizeof(bnx2_CP_b06FwText),
+
+- .data_addr = 0x08005820,
++ .data_addr = 0x08005b80,
+ .data_len = 0x84,
+ .data_index = 0x0,
+ .data = bnx2_CP_b06FwData,
+
+- .sbss_addr = 0x080058a4,
+- .sbss_len = 0xf1,
++ .sbss_addr = 0x08005c04,
++ .sbss_len = 0xe9,
+ .sbss_index = 0x0,
+
+- .bss_addr = 0x08005998,
++ .bss_addr = 0x08005cf0,
+ .bss_len = 0x5d8,
+ .bss_index = 0x0,
+
+- .rodata_addr = 0x080056cc,
+- .rodata_len = 0x134,
++ .rodata_addr = 0x08005a34,
++ .rodata_len = 0x130,
+ .rodata_index = 0x0,
+ .rodata = bnx2_CP_b06FwRodata,
+ };
+@@ -2185,747 +2202,761 @@
+ };
+
+ static u8 bnx2_RXP_b06FwText[] = {
+- 0xec, 0x5b, 0x5d, 0x6c, 0x1c, 0xd7, 0x75, 0x3e, 0x33, 0x3b, 0x24, 0x57,
+- 0x14, 0x45, 0x8e, 0xa8, 0x15, 0xb5, 0xb2, 0x99, 0x64, 0x97, 0x1c, 0x89,
+- 0x1b, 0x93, 0x50, 0x86, 0xec, 0x5a, 0x66, 0x92, 0x45, 0xbc, 0x59, 0x52,
+- 0x16, 0x53, 0x08, 0xf0, 0xda, 0x56, 0x5c, 0xa3, 0x31, 0x90, 0xc5, 0x92,
+- 0x76, 0xd2, 0x37, 0xc9, 0xa9, 0x5d, 0x21, 0xb1, 0xab, 0xf5, 0x92, 0x91,
+- 0x15, 0x75, 0xc5, 0x61, 0x24, 0x26, 0x72, 0x1b, 0xb7, 0xa0, 0xf9, 0x23,
+- 0xaa, 0xc1, 0x4a, 0xe3, 0x9f, 0xd8, 0xf5, 0x43, 0x64, 0x31, 0xb2, 0xad,
+- 0xfa, 0xa5, 0x80, 0xd3, 0x1f, 0xc0, 0x28, 0x8c, 0x56, 0x90, 0x6b, 0xd9,
+- 0x68, 0x81, 0x42, 0x6d, 0x51, 0xd4, 0x6d, 0x64, 0x4d, 0xbf, 0xef, 0xce,
+- 0x0c, 0xb9, 0x22, 0x94, 0xc6, 0x2f, 0x7d, 0x9b, 0x0b, 0x2c, 0xee, 0xdc,
+- 0x3b, 0xe7, 0x9e, 0x7b, 0xce, 0xb9, 0xe7, 0xf7, 0x0e, 0xf9, 0x44, 0x9b,
+- 0xb4, 0x4a, 0xd0, 0x36, 0xe1, 0x97, 0x3d, 0x70, 0xe8, 0xb1, 0xc1, 0x5d,
+- 0xbb, 0x77, 0xe1, 0x71, 0x77, 0xcc, 0x6c, 0x36, 0x38, 0xaf, 0x49, 0xd4,
+- 0xa2, 0x16, 0xb5, 0xa8, 0x45, 0x2d, 0x6a, 0x51, 0x8b, 0x5a, 0xd4, 0xa2,
+- 0x16, 0xb5, 0xa8, 0x45, 0x2d, 0x6a, 0x51, 0x8b, 0x5a, 0xd4, 0xa2, 0x16,
+- 0xb5, 0xa8, 0x45, 0x2d, 0x6a, 0x51, 0x8b, 0x5a, 0xd4, 0xa2, 0x16, 0xb5,
+- 0xa8, 0x45, 0x2d, 0x6a, 0x51, 0x8b, 0x5a, 0xd4, 0xa2, 0x16, 0xb5, 0xa8,
+- 0x45, 0x2d, 0x6a, 0x51, 0x8b, 0x5a, 0xd4, 0xa2, 0x16, 0xb5, 0xa8, 0x45,
+- 0x2d, 0x6a, 0x51, 0x8b, 0x5a, 0xd4, 0xfe, 0x3f, 0x5a, 0x4c, 0xc4, 0x64,
+- 0xbf, 0x29, 0xf8, 0x49, 0x5c, 0xcf, 0xa5, 0x0e, 0x16, 0x2c, 0x89, 0xc7,
+- 0x72, 0x6f, 0x3f, 0x3e, 0x6e, 0x89, 0xe4, 0xeb, 0xfd, 0xa9, 0x11, 0xf9,
+- 0xc4, 0xab, 0x24, 0x0c, 0xe1, 0xfc, 0x67, 0x72, 0xd7, 0x0f, 0x9f, 0xbf,
+- 0x2b, 0x7d, 0x6d, 0x2e, 0x26, 0x71, 0x33, 0xf7, 0xee, 0xa0, 0xb9, 0x53,
+- 0xe2, 0xdd, 0x58, 0xf3, 0x5c, 0xdf, 0xc4, 0x66, 0x69, 0x0f, 0x71, 0x79,
+- 0xde, 0x92, 0xed, 0xc9, 0x25, 0xbb, 0xa2, 0x8d, 0xf4, 0xbd, 0xa6, 0x15,
+- 0x9c, 0x1b, 0x5e, 0xde, 0xd0, 0x45, 0x07, 0xbe, 0x89, 0x7a, 0x5c, 0x1e,
+- 0x59, 0x6c, 0x95, 0x47, 0xe7, 0x36, 0x4a, 0x79, 0x4e, 0x4c, 0x3d, 0x97,
+- 0x94, 0x6f, 0x61, 0xee, 0x72, 0x0c, 0x70, 0xae, 0x94, 0x62, 0xb9, 0x8f,
+- 0xef, 0x2d, 0xd7, 0x08, 0x2f, 0xba, 0x9e, 0x5b, 0xb9, 0x77, 0xa2, 0xfe,
+- 0xe6, 0xbd, 0xe5, 0x3a, 0xe1, 0x08, 0x83, 0x77, 0xf5, 0x8f, 0xbc, 0xf3,
+- 0x7d, 0x09, 0xb9, 0xe0, 0x9a, 0xf2, 0x82, 0xfb, 0x32, 0xf6, 0x4c, 0x57,
+- 0x2a, 0xd2, 0x24, 0xe5, 0x93, 0x37, 0xbc, 0x98, 0x95, 0x4e, 0x61, 0x13,
+- 0x73, 0x44, 0xf0, 0xde, 0xc1, 0x7b, 0x07, 0xf3, 0x0b, 0x3f, 0xdf, 0x2c,
+- 0xad, 0x49, 0x39, 0xdf, 0xc7, 0x75, 0x5c, 0xc3, 0xb5, 0x8b, 0xed, 0xfe,
+- 0x3a, 0xc1, 0xba, 0xa2, 0xc4, 0x2c, 0x4f, 0x0a, 0xb6, 0x21, 0x23, 0x09,
+- 0xd1, 0x74, 0xab, 0x02, 0x3a, 0x7e, 0xd1, 0x26, 0xad, 0xc4, 0x55, 0xd1,
+- 0xf2, 0x2e, 0xfb, 0x10, 0xdf, 0x53, 0x1d, 0x3e, 0xae, 0x67, 0x81, 0xab,
+- 0x24, 0xaf, 0xbb, 0x0f, 0xcb, 0x5f, 0xb8, 0x63, 0xf2, 0x92, 0x3b, 0x01,
+- 0x9c, 0x0f, 0xc9, 0xab, 0xee, 0x7e, 0x79, 0xc5, 0x2d, 0xca, 0xcf, 0xdc,
+- 0x7d, 0xf2, 0xb2, 0x3b, 0x2a, 0x2f, 0xba, 0x79, 0xec, 0x97, 0xd1, 0x8a,
+- 0xce, 0xdd, 0x32, 0x7e, 0x92, 0x34, 0xa6, 0xaf, 0x41, 0x36, 0xf2, 0x98,
+- 0xdd, 0x67, 0xea, 0xa2, 0x61, 0xcf, 0xf4, 0x6b, 0x22, 0x8f, 0x4a, 0x3e,
+- 0x31, 0x2c, 0x73, 0x6e, 0x97, 0x56, 0x38, 0xd9, 0xa9, 0x8d, 0x9c, 0x24,
+- 0x2d, 0x9e, 0x8c, 0xdb, 0xe9, 0x54, 0x21, 0x96, 0x36, 0x47, 0x62, 0x92,
+- 0xdf, 0x03, 0xb9, 0x55, 0x9d, 0xa4, 0xe4, 0x4d, 0xc9, 0x1f, 0xb5, 0x0c,
+- 0xc8, 0x53, 0x93, 0x58, 0x8e, 0x7c, 0x6e, 0xe1, 0x1c, 0x5a, 0x9b, 0x2c,
+- 0xd4, 0x6c, 0x29, 0x3b, 0xf3, 0x5a, 0x39, 0xa1, 0x51, 0x04, 0x18, 0x0f,
+- 0x60, 0xfc, 0x67, 0xc1, 0xf8, 0x4b, 0x52, 0x3e, 0x25, 0xf9, 0xc9, 0x59,
+- 0xcf, 0x2b, 0xd8, 0x7f, 0x1c, 0xcc, 0x0d, 0x63, 0x4e, 0x97, 0xd8, 0x8f,
+- 0x38, 0x37, 0x1b, 0xcc, 0x51, 0x1e, 0x9e, 0x8c, 0xd8, 0x14, 0x23, 0xe8,
+- 0x35, 0x8b, 0xe8, 0x9b, 0xd1, 0x73, 0x8f, 0x8d, 0x9b, 0xfc, 0xff, 0x03,
+- 0xe2, 0xf9, 0x26, 0xf0, 0x6c, 0x83, 0x66, 0x89, 0x7f, 0x36, 0x77, 0xf4,
+- 0xe0, 0x3f, 0xf4, 0xad, 0x8d, 0xf5, 0xdc, 0x7b, 0x52, 0xa8, 0x69, 0x4a,
+- 0x57, 0x34, 0x3c, 0xf7, 0xd4, 0x9f, 0xea, 0xf4, 0xf5, 0xc2, 0x69, 0x97,
+- 0x56, 0xc8, 0xc9, 0x21, 0xfd, 0x29, 0xd0, 0xbf, 0x49, 0xb6, 0xfc, 0x90,
+- 0x3c, 0xf4, 0xa7, 0x74, 0xc9, 0xa7, 0x0d, 0xb1, 0x65, 0xd1, 0x35, 0xb4,
+- 0x11, 0x27, 0x2f, 0x7a, 0xce, 0x4a, 0x96, 0x45, 0x97, 0x52, 0x22, 0x2f,
+- 0xcf, 0x64, 0xd3, 0xc3, 0x15, 0x49, 0x49, 0x79, 0xc8, 0x96, 0x65, 0x17,
+- 0x90, 0x89, 0x8a, 0x5c, 0xcd, 0xa6, 0xed, 0xcb, 0xb2, 0x51, 0x56, 0x4c,
+- 0x5b, 0x4e, 0xbb, 0x71, 0x79, 0xeb, 0xe4, 0x3e, 0xf9, 0x96, 0xc3, 0x73,
+- 0x92, 0xfe, 0x26, 0x79, 0x5a, 0x96, 0xb2, 0x4f, 0x5f, 0x5b, 0xb2, 0x8f,
+- 0xb7, 0x49, 0x3b, 0x75, 0xb0, 0xd6, 0xee, 0xd3, 0xfd, 0x15, 0xf0, 0x96,
+- 0x87, 0x6c, 0xdb, 0x21, 0x33, 0x43, 0xf1, 0x55, 0x78, 0xb0, 0x13, 0x3d,
+- 0xd7, 0xfd, 0xfd, 0x16, 0xe8, 0x83, 0x2d, 0x5a, 0x48, 0x63, 0x93, 0x14,
+- 0xba, 0xb8, 0xe6, 0x25, 0xe0, 0xc0, 0xfb, 0x55, 0xda, 0x6f, 0xd3, 0x0a,
+- 0xa7, 0xda, 0xc5, 0xf8, 0xd1, 0x9d, 0x38, 0x4f, 0x43, 0x1e, 0x19, 0xf2,
+- 0xbc, 0xaf, 0xdb, 0x46, 0x6a, 0x42, 0x72, 0xa4, 0x5d, 0x36, 0x1f, 0xdf,
+- 0x2a, 0x73, 0x66, 0x5c, 0x12, 0xc7, 0xc3, 0xbd, 0x5a, 0x82, 0xf3, 0xf9,
+- 0x32, 0xf1, 0xa7, 0x52, 0xfa, 0xa6, 0x60, 0x1c, 0xd2, 0x34, 0x8a, 0x33,
+- 0xea, 0x35, 0x7b, 0xf4, 0x21, 0x2d, 0xaf, 0xfe, 0x8f, 0x6a, 0x2c, 0x18,
+- 0xef, 0xd2, 0xbe, 0x6a, 0x74, 0x89, 0x61, 0xcd, 0x43, 0xae, 0x86, 0x5c,
+- 0x74, 0xc2, 0xf9, 0xb8, 0xf8, 0x70, 0x94, 0xb3, 0x0c, 0xae, 0xc9, 0x59,
+- 0x06, 0x7b, 0xea, 0x4f, 0x07, 0x38, 0xf3, 0x01, 0xec, 0x06, 0xc9, 0x27,
+- 0xdb, 0x78, 0xa6, 0x01, 0xec, 0x75, 0xf9, 0xce, 0x50, 0xfa, 0x0c, 0xff,
+- 0x57, 0x6b, 0x6d, 0x0d, 0xdf, 0xdb, 0x32, 0xef, 0xaa, 0x35, 0xc9, 0xfb,
+- 0x70, 0xb6, 0xa5, 0xe4, 0x1d, 0xe6, 0x82, 0x1e, 0xd3, 0xf2, 0x09, 0xe2,
+- 0x6a, 0x96, 0xc7, 0x13, 0xbd, 0x18, 0x6b, 0x52, 0xfe, 0x12, 0xf5, 0xf5,
+- 0x13, 0xf1, 0xe7, 0x39, 0x97, 0x3e, 0xda, 0xab, 0x1f, 0x03, 0x7d, 0x94,
+- 0x41, 0x3a, 0x29, 0x10, 0x7e, 0x79, 0xe8, 0x36, 0xf0, 0x67, 0xa2, 0x0f,
+- 0xf9, 0xdf, 0x2c, 0xf9, 0x22, 0xe9, 0x57, 0x76, 0x0a, 0x39, 0x27, 0xb1,
+- 0xdf, 0xdd, 0xb0, 0xc9, 0xf5, 0xf6, 0x0a, 0x1b, 0x6d, 0xa7, 0xad, 0x7e,
+- 0x11, 0x3c, 0xa7, 0x33, 0x22, 0x16, 0xe4, 0x95, 0x94, 0x66, 0x6b, 0x1a,
+- 0x3c, 0x51, 0x2f, 0xb7, 0x61, 0x7e, 0xc3, 0xc7, 0x79, 0xc5, 0x7a, 0x38,
+- 0xf7, 0x41, 0x20, 0xcb, 0x7d, 0x32, 0xe1, 0xec, 0x57, 0x3c, 0x57, 0xf5,
+- 0xcb, 0x92, 0xef, 0xee, 0x35, 0xa7, 0x40, 0x6f, 0xc1, 0x48, 0xcf, 0x55,
+- 0x24, 0x29, 0x0b, 0xf0, 0x13, 0x2f, 0xc2, 0xe6, 0x5f, 0x71, 0x53, 0xb0,
+- 0xaf, 0xbc, 0x3c, 0xea, 0xe4, 0x64, 0xe2, 0x14, 0x6d, 0x2c, 0x9d, 0x29,
+- 0xc4, 0x72, 0x32, 0xef, 0xa4, 0x33, 0x0b, 0xd0, 0xbd, 0x05, 0xc7, 0xf3,
+- 0xa6, 0xec, 0xfe, 0xd4, 0x28, 0x30, 0x5e, 0x74, 0x76, 0x24, 0x27, 0x20,
+- 0xc8, 0x25, 0x2b, 0x25, 0x4b, 0x6e, 0x06, 0x3a, 0x86, 0xf7, 0xae, 0x85,
+- 0x7e, 0x00, 0x3a, 0x9e, 0x85, 0x7d, 0x93, 0x16, 0x53, 0x16, 0xfb, 0x20,
+- 0x3b, 0x47, 0x07, 0x2e, 0x4d, 0xf2, 0xfb, 0x6f, 0x40, 0xbe, 0x21, 0xdf,
+- 0x77, 0x81, 0xb6, 0x04, 0x70, 0x92, 0xae, 0xdb, 0xa4, 0xda, 0x05, 0xf9,
+- 0x0d, 0x25, 0x94, 0x5d, 0x16, 0x3a, 0xb7, 0x4a, 0xe1, 0x8e, 0x66, 0xbc,
+- 0xef, 0xc2, 0x98, 0xf2, 0x6f, 0xc1, 0x1c, 0xdf, 0xff, 0x4b, 0x60, 0x5f,
+- 0x4d, 0xeb, 0xc6, 0x57, 0xd1, 0xb7, 0xcb, 0x36, 0x8b, 0xbd, 0x89, 0xfe,
+- 0x9f, 0xd1, 0x77, 0xa2, 0xef, 0xc5, 0x5e, 0xe7, 0x21, 0x43, 0xca, 0x0f,
+- 0xcf, 0x0b, 0x5c, 0xb3, 0x3d, 0xd8, 0x97, 0x78, 0xdb, 0x81, 0x67, 0x53,
+- 0xb0, 0x57, 0x3b, 0xc6, 0xad, 0xc1, 0x5e, 0x16, 0x68, 0x8e, 0x29, 0x19,
+- 0x16, 0xac, 0xf8, 0xba, 0xb1, 0x86, 0x3e, 0x0e, 0xdc, 0x84, 0xd7, 0xe5,
+- 0x4a, 0x57, 0x17, 0x9e, 0xb9, 0x27, 0x61, 0xf8, 0x1e, 0xbd, 0x4b, 0xfc,
+- 0x1c, 0xe7, 0xe5, 0x09, 0x07, 0xfe, 0x89, 0xfa, 0xe6, 0x52, 0x8e, 0xbb,
+- 0x65, 0x02, 0xbc, 0x8f, 0x3b, 0xe9, 0x99, 0xaa, 0xee, 0x79, 0x7a, 0xd6,
+- 0x30, 0xab, 0x92, 0x86, 0x1d, 0x8f, 0xc9, 0x38, 0xe4, 0x77, 0xda, 0x89,
+- 0xcb, 0x45, 0x65, 0x7b, 0xe4, 0xe9, 0x21, 0xc8, 0x05, 0xf1, 0xa4, 0x8b,
+- 0xf6, 0x49, 0x9b, 0x82, 0xfc, 0x8a, 0xa6, 0x5c, 0xca, 0xd2, 0x96, 0xb3,
+- 0xb2, 0xbc, 0x6a, 0xcb, 0x15, 0xd8, 0x32, 0xed, 0xb8, 0x02, 0x7b, 0xf6,
+- 0xf5, 0xfa, 0x41, 0xd9, 0x06, 0xbd, 0x4e, 0x62, 0x3f, 0xea, 0xf5, 0xb3,
+- 0xd0, 0x6b, 0xc8, 0xd4, 0x86, 0xae, 0x9b, 0xd4, 0x89, 0x6f, 0xc3, 0xa7,
+- 0x81, 0xdf, 0x44, 0xf0, 0xbc, 0xfc, 0x5d, 0x29, 0x9c, 0x6a, 0x05, 0xdd,
+- 0x7b, 0xdb, 0x29, 0xb3, 0xf2, 0x32, 0x7f, 0xa1, 0x2e, 0x3e, 0x05, 0xf9,
+- 0xc1, 0x8f, 0x2a, 0x1d, 0x04, 0x6f, 0xd9, 0x3d, 0x80, 0x19, 0xc6, 0x39,
+- 0xb7, 0x02, 0x3f, 0x69, 0xbc, 0x15, 0x1c, 0xdf, 0x83, 0xee, 0x2c, 0xf5,
+- 0x15, 0xf3, 0x0b, 0xe1, 0x79, 0xb7, 0xa9, 0x3d, 0xcb, 0x43, 0xad, 0x01,
+- 0x7f, 0x94, 0x03, 0xf5, 0x3e, 0x09, 0xbd, 0xd5, 0x64, 0x5c, 0xe9, 0x6e,
+- 0x5e, 0xc9, 0x61, 0xde, 0xa1, 0xfe, 0x02, 0x87, 0x4d, 0x19, 0x98, 0x72,
+- 0xbf, 0x82, 0x4f, 0xae, 0xd9, 0x77, 0x37, 0x69, 0xe7, 0x78, 0x83, 0xf4,
+- 0x28, 0x1f, 0xd4, 0x1d, 0xe8, 0x76, 0x13, 0x6c, 0x9f, 0xef, 0x1e, 0x92,
+- 0xc7, 0xdc, 0x61, 0x9c, 0x43, 0x52, 0x0e, 0xba, 0xdd, 0xf2, 0xfb, 0xee,
+- 0x46, 0xb9, 0xdc, 0x09, 0xba, 0x56, 0x6d, 0xec, 0x6e, 0xf9, 0x03, 0xc6,
+- 0x3c, 0xf5, 0x0c, 0x3f, 0xa9, 0xdf, 0x05, 0x1a, 0x68, 0x4f, 0xb4, 0x2b,
+- 0xc2, 0xc5, 0xa4, 0xa4, 0xf6, 0xfc, 0x89, 0xef, 0xdb, 0x80, 0x77, 0xae,
+- 0x93, 0xf6, 0x4b, 0xda, 0x8c, 0xc0, 0x66, 0xd3, 0x66, 0x49, 0xc8, 0x33,
+- 0x69, 0xe5, 0x73, 0xa3, 0x2c, 0xd8, 0x37, 0xca, 0x20, 0xc4, 0x13, 0xda,
+- 0xe5, 0xa8, 0xe4, 0x5d, 0xf6, 0xf4, 0x97, 0x88, 0x91, 0x0e, 0x62, 0xa4,
+- 0x83, 0xd8, 0x08, 0x5b, 0x78, 0xc5, 0x41, 0x6c, 0x74, 0x10, 0x1b, 0xe1,
+- 0xcf, 0x5e, 0x72, 0x10, 0x1f, 0xa1, 0x43, 0x2f, 0x38, 0x8c, 0xeb, 0xdf,
+- 0x46, 0x4c, 0x35, 0xe4, 0x99, 0x9a, 0xc8, 0x91, 0x5a, 0x1a, 0xd4, 0xa5,
+- 0x87, 0x3f, 0x90, 0xfe, 0xcc, 0x07, 0x92, 0xb6, 0x2f, 0xe2, 0xf7, 0x96,
+- 0xe0, 0x9d, 0xca, 0x11, 0xf0, 0xbe, 0x1e, 0xe6, 0x13, 0x38, 0x7f, 0x8b,
+- 0x39, 0x83, 0x3f, 0x0f, 0x97, 0x88, 0xb8, 0x41, 0x9b, 0x1e, 0x93, 0xf9,
+- 0x59, 0xda, 0xf2, 0xed, 0x38, 0x8b, 0x4e, 0x99, 0xb2, 0xfc, 0x71, 0xc1,
+- 0xbe, 0xc3, 0x1c, 0xa5, 0xee, 0x98, 0x31, 0xd0, 0x76, 0x1b, 0x7e, 0x29,
+- 0xc4, 0xda, 0x3f, 0xd2, 0x0a, 0x0b, 0x71, 0xc4, 0x56, 0xc6, 0x5b, 0xc9,
+- 0xfb, 0x7a, 0x74, 0xc3, 0x1b, 0x5f, 0x5d, 0xd3, 0x0f, 0xfd, 0x86, 0xdc,
+- 0x13, 0x09, 0xc0, 0xcc, 0x6a, 0x23, 0xcb, 0x6f, 0xfb, 0x76, 0x92, 0xe5,
+- 0xf8, 0x46, 0x60, 0x7b, 0xdc, 0x1f, 0x63, 0x97, 0x78, 0xf9, 0x4c, 0x9c,
+- 0x97, 0x91, 0x1f, 0x24, 0x91, 0x17, 0x24, 0xe0, 0x7b, 0x98, 0x73, 0x74,
+- 0x23, 0x3f, 0xf0, 0xbc, 0x17, 0x6d, 0xcf, 0x7b, 0x07, 0xbf, 0x7f, 0xb7,
+- 0x57, 0x79, 0x40, 0xab, 0x68, 0xa3, 0x6e, 0x4a, 0x46, 0xdd, 0x9f, 0xb6,
+- 0xfb, 0x72, 0x8c, 0xcb, 0xa4, 0x93, 0x90, 0x29, 0xa7, 0xa6, 0xdd, 0xb7,
+- 0x3c, 0xad, 0x15, 0x97, 0x67, 0xb0, 0xaf, 0x81, 0x39, 0xa9, 0x54, 0xed,
+- 0x33, 0xda, 0x88, 0x7b, 0x54, 0xbb, 0x7f, 0xb9, 0x5d, 0xd9, 0x79, 0xd5,
+- 0x61, 0xce, 0x70, 0x5d, 0xe5, 0x2e, 0x05, 0x2b, 0x6d, 0xfe, 0x2e, 0x14,
+- 0xaf, 0x50, 0x23, 0xdd, 0xcd, 0x01, 0xcd, 0xb0, 0xc3, 0x9c, 0x77, 0xb8,
+- 0x90, 0xb5, 0x60, 0x8b, 0xa4, 0x51, 0xcd, 0x5d, 0xf0, 0xe9, 0x3e, 0xad,
+- 0x15, 0x96, 0xdb, 0xb4, 0x91, 0x53, 0x8c, 0xc7, 0xd2, 0x1d, 0x13, 0xae,
+- 0xdb, 0x01, 0x7b, 0xad, 0x63, 0x0f, 0xe6, 0x5b, 0x94, 0x2d, 0xe8, 0x86,
+- 0x0e, 0xbf, 0x04, 0x7a, 0x5e, 0x54, 0xf9, 0x0f, 0xf9, 0x4b, 0xe1, 0xac,
+- 0x42, 0xfe, 0x3c, 0xef, 0xaf, 0xed, 0x90, 0xfe, 0x74, 0x2a, 0xaf, 0x87,
+- 0xfc, 0x7a, 0xde, 0xbf, 0xd9, 0xe4, 0x99, 0x3c, 0x79, 0xde, 0x0b, 0x76,
+- 0x02, 0xf4, 0x7b, 0x17, 0x74, 0xab, 0x06, 0x7e, 0x18, 0xdb, 0x29, 0xf3,
+- 0x69, 0xf0, 0x71, 0x14, 0x3c, 0x9e, 0x06, 0x7f, 0x33, 0xa0, 0xe5, 0x37,
+- 0xed, 0xd9, 0x98, 0x4b, 0x4a, 0x8a, 0xb2, 0x2e, 0x2f, 0x32, 0xa7, 0x64,
+- 0x1e, 0x69, 0x4a, 0x69, 0x31, 0x5c, 0x1f, 0xea, 0xc3, 0x01, 0xd9, 0xeb,
+- 0x74, 0x42, 0x3e, 0x94, 0xe7, 0x35, 0xd0, 0x4b, 0x9f, 0x5f, 0xcd, 0xe8,
+- 0x08, 0x80, 0x65, 0x1b, 0xb1, 0x5e, 0x46, 0x94, 0x2e, 0x2c, 0x5a, 0x92,
+- 0x2f, 0xdb, 0x26, 0xed, 0x36, 0x55, 0xb6, 0x2b, 0xc8, 0x0c, 0x7c, 0x39,
+- 0x8e, 0xd4, 0x0c, 0xbc, 0xe3, 0x58, 0x60, 0xf3, 0xa1, 0x6c, 0x0d, 0xd8,
+- 0x5d, 0x28, 0xf3, 0x70, 0xee, 0xc1, 0x0e, 0xfa, 0xcc, 0x79, 0xf7, 0x0b,
+- 0xc0, 0x41, 0xbc, 0xbf, 0x09, 0x47, 0x1c, 0x31, 0x84, 0x78, 0xe2, 0x72,
+- 0xc6, 0x21, 0x3c, 0xf3, 0x8b, 0xb8, 0xb4, 0x22, 0x26, 0x6f, 0xc8, 0x89,
+- 0xf6, 0xf9, 0x1d, 0x69, 0x73, 0x31, 0x16, 0x93, 0x63, 0x09, 0xb9, 0xc3,
+- 0x60, 0x00, 0xd8, 0xec, 0x67, 0xea, 0x85, 0x19, 0x0d, 0xba, 0xdc, 0x26,
+- 0x93, 0x03, 0x69, 0x73, 0x1e, 0x7b, 0xe8, 0xd8, 0xe3, 0x6b, 0x9c, 0xaf,
+- 0xfd, 0x87, 0x57, 0x4a, 0xec, 0x84, 0x9d, 0x48, 0xdc, 0xc8, 0x19, 0x83,
+- 0x53, 0xb5, 0x03, 0xc2, 0xfc, 0x6a, 0x72, 0x60, 0x03, 0xec, 0xbc, 0x77,
+- 0x78, 0xaf, 0x30, 0x97, 0x8f, 0x0f, 0x8e, 0x5b, 0x3e, 0x5d, 0x23, 0xb0,
+- 0xeb, 0x49, 0xe4, 0x79, 0x7b, 0xeb, 0xcc, 0x01, 0x8c, 0xc1, 0xde, 0xba,
+- 0x21, 0x47, 0x60, 0xaf, 0xcd, 0xd0, 0x9f, 0x15, 0xa5, 0xcb, 0x26, 0x64,
+- 0x4d, 0xdf, 0x3a, 0x0c, 0xdc, 0xef, 0x40, 0x6e, 0x16, 0x62, 0x67, 0x37,
+- 0xf2, 0xd9, 0x0c, 0xce, 0x33, 0x85, 0xd8, 0xd7, 0xa8, 0xd7, 0x12, 0xdf,
+- 0x0a, 0xb8, 0x57, 0x76, 0x32, 0x2f, 0xf3, 0xbc, 0x07, 0xac, 0xf4, 0xb3,
+- 0xe4, 0x65, 0xca, 0x91, 0x7c, 0xd5, 0x56, 0xbe, 0x10, 0x3a, 0x9b, 0x62,
+- 0x3e, 0x07, 0xfd, 0x83, 0x4e, 0x16, 0x39, 0x5e, 0xd5, 0xc1, 0xe4, 0xa4,
+- 0xcc, 0x43, 0x76, 0x62, 0x16, 0xb2, 0x84, 0x0d, 0xe1, 0x5a, 0x02, 0xdd,
+- 0xf6, 0xbc, 0x18, 0x74, 0x77, 0x3c, 0x4b, 0x38, 0xa9, 0x28, 0x9b, 0x83,
+- 0xcc, 0x26, 0xdd, 0x5d, 0x1d, 0x7e, 0x3e, 0x09, 0x5f, 0x99, 0xe0, 0x5e,
+- 0x9f, 0x85, 0x0e, 0x77, 0x23, 0x86, 0x78, 0x1e, 0x6c, 0x38, 0xa1, 0x0b,
+- 0x75, 0x18, 0xf6, 0xe2, 0xf2, 0x5d, 0x1b, 0xe6, 0xc5, 0x9c, 0x84, 0x4f,
+- 0x2b, 0x99, 0x9e, 0x77, 0x0f, 0x68, 0xa9, 0xda, 0x1d, 0x58, 0xd7, 0x24,
+- 0x08, 0x7b, 0xa6, 0xbf, 0xdf, 0x46, 0x15, 0x3b, 0x30, 0x6e, 0xc7, 0x7e,
+- 0x9b, 0x98, 0x7b, 0x4e, 0xd2, 0x16, 0xb2, 0xb4, 0x7d, 0x23, 0xf0, 0xe7,
+- 0x6f, 0x82, 0x4e, 0xae, 0x51, 0x70, 0xf1, 0xa6, 0x5c, 0x56, 0x96, 0x6a,
+- 0xdb, 0x65, 0x6e, 0x3f, 0xf7, 0xe8, 0xa6, 0x1d, 0x22, 0xfe, 0xf3, 0x99,
+- 0x74, 0xd3, 0x8f, 0x74, 0x06, 0x63, 0xed, 0x73, 0xfe, 0x1e, 0x62, 0x32,
+- 0xdf, 0x1d, 0x51, 0xf4, 0x8a, 0x7e, 0xd1, 0xde, 0xe8, 0xc7, 0xa8, 0x5c,
+- 0xbb, 0x76, 0x0f, 0x72, 0xf0, 0xbd, 0xbb, 0xa9, 0x03, 0x86, 0x5c, 0xb2,
+- 0x3c, 0xef, 0x92, 0xdd, 0x04, 0xfe, 0x74, 0x69, 0xb2, 0x8e, 0x9b, 0xd2,
+- 0x0a, 0x99, 0x3b, 0x5a, 0x20, 0x97, 0x36, 0x25, 0x97, 0x49, 0x15, 0xf7,
+- 0xde, 0xc5, 0xd9, 0x70, 0x6d, 0x45, 0xc5, 0x97, 0x82, 0x5a, 0xc7, 0x35,
+- 0x3c, 0xd3, 0x77, 0x91, 0x73, 0x1f, 0xc3, 0xda, 0x98, 0xb4, 0x28, 0xdd,
+- 0x66, 0xfc, 0x27, 0xaf, 0xd2, 0xe1, 0xe3, 0x61, 0xac, 0xa5, 0x0e, 0x87,
+- 0xfc, 0x8f, 0x06, 0x3c, 0x12, 0xaf, 0x0d, 0xbc, 0x6d, 0xaa, 0xce, 0x28,
+- 0xfb, 0xe7, 0xd7, 0x11, 0x53, 0xf2, 0x40, 0x5d, 0x94, 0x0b, 0x7d, 0x21,
+- 0x41, 0x43, 0xba, 0x9f, 0xc1, 0x3e, 0xa4, 0x61, 0x13, 0xf2, 0x5e, 0xd1,
+- 0xaa, 0xe4, 0xcb, 0x0c, 0xf7, 0x11, 0x3d, 0x96, 0x6b, 0x91, 0x11, 0x68,
+- 0x5d, 0xd5, 0xb1, 0xcc, 0x07, 0xa0, 0x7b, 0x5f, 0x07, 0x8f, 0x85, 0x19,
+- 0xfa, 0xaa, 0x2f, 0x61, 0xdd, 0x4a, 0x5a, 0xf7, 0xb7, 0x95, 0x23, 0x0e,
+- 0x65, 0xfa, 0x0e, 0x64, 0xaa, 0x77, 0x35, 0x4b, 0x87, 0x14, 0x91, 0x4f,
+- 0xcd, 0x0f, 0x83, 0xaf, 0x81, 0x36, 0x89, 0xed, 0xa2, 0xaf, 0x42, 0xed,
+- 0x93, 0x58, 0x41, 0x60, 0xb8, 0xee, 0xe9, 0x3b, 0xb1, 0x7e, 0x20, 0x01,
+- 0xf9, 0x52, 0x66, 0x7a, 0x00, 0x47, 0x18, 0x14, 0x4a, 0x66, 0xa1, 0xb3,
+- 0x59, 0x88, 0x9b, 0xef, 0xfa, 0x93, 0xa6, 0x70, 0x1e, 0x3e, 0xbd, 0xc8,
+- 0xb5, 0xa4, 0xd9, 0x5f, 0xd3, 0x64, 0x85, 0xb2, 0xfe, 0x2b, 0xf8, 0xa7,
+- 0x5f, 0x79, 0x7b, 0x87, 0xc2, 0xf7, 0xe4, 0x87, 0x7c, 0xe1, 0x0c, 0x41,
+- 0xd3, 0xe6, 0x9c, 0x25, 0x83, 0xd3, 0xa2, 0x15, 0x90, 0x7b, 0x50, 0x47,
+- 0x7a, 0x86, 0xd2, 0x95, 0x94, 0xbe, 0x0d, 0xbc, 0x1a, 0xb2, 0x7f, 0x88,
+- 0xfc, 0x6e, 0x0d, 0xf2, 0x8e, 0x46, 0x9e, 0x3b, 0x02, 0x9e, 0xd5, 0x7e,
+- 0xc3, 0x79, 0x7d, 0x8d, 0xf7, 0xd1, 0x99, 0x70, 0x5f, 0x03, 0xb6, 0xbc,
+- 0x82, 0x9a, 0x87, 0xfb, 0x93, 0x9e, 0x1b, 0x9e, 0x6e, 0x59, 0x95, 0x1e,
+- 0xfd, 0x57, 0xde, 0xfd, 0x43, 0x9a, 0xca, 0xd3, 0x74, 0xe4, 0x8c, 0xfa,
+- 0x10, 0x78, 0x1d, 0xe2, 0x79, 0xe9, 0x72, 0xff, 0x6e, 0xe2, 0x3b, 0x42,
+- 0xde, 0x80, 0xb3, 0xd5, 0xaf, 0x61, 0x86, 0xc2, 0x3d, 0x1a, 0xf5, 0x27,
+- 0xc4, 0x49, 0x5c, 0x84, 0xe1, 0x99, 0xd0, 0xdf, 0x4a, 0xbc, 0x60, 0xc7,
+- 0x83, 0xb3, 0x0e, 0xd7, 0x89, 0x66, 0x58, 0xeb, 0xd7, 0xc1, 0x68, 0x1f,
+- 0xa4, 0xde, 0xf5, 0x04, 0x76, 0x16, 0xea, 0x21, 0xf7, 0x64, 0x7f, 0x2b,
+- 0x9d, 0xe5, 0x3a, 0xae, 0x27, 0x3c, 0x61, 0xe0, 0x33, 0xe0, 0x83, 0x7e,
+- 0x06, 0xdb, 0x78, 0xf9, 0x26, 0x5f, 0xce, 0xd8, 0x4e, 0x1f, 0x63, 0xaf,
+- 0xf7, 0xe7, 0xac, 0x7d, 0xf0, 0xac, 0xc3, 0x7e, 0x1b, 0xfd, 0x3a, 0xe7,
+- 0x50, 0x4f, 0x2c, 0x8e, 0xa2, 0xb7, 0x64, 0xed, 0x1e, 0x80, 0x7e, 0x3e,
+- 0xac, 0xe7, 0xdb, 0x4a, 0x46, 0x8e, 0x35, 0xbd, 0x14, 0xab, 0xb5, 0xc3,
+- 0x88, 0xc9, 0x52, 0xb9, 0x4d, 0xd5, 0xc6, 0x6d, 0xc3, 0x85, 0x2c, 0xe6,
+- 0xea, 0x8c, 0xcb, 0x30, 0x7f, 0xac, 0x43, 0x6c, 0x88, 0xeb, 0xd3, 0xf1,
+- 0xca, 0xed, 0x39, 0xda, 0x49, 0x4a, 0x52, 0xf5, 0x6b, 0x88, 0x79, 0xc8,
+- 0x1f, 0x95, 0x0e, 0x7d, 0xf1, 0x76, 0xd2, 0x5f, 0x45, 0xec, 0x32, 0x72,
+- 0x62, 0xe8, 0xb9, 0xe6, 0xf8, 0x64, 0xb6, 0x0d, 0xb1, 0x7e, 0x6c, 0xbb,
+- 0x7e, 0x6e, 0xdf, 0xf6, 0xd8, 0xb9, 0xae, 0x52, 0x53, 0xae, 0xb2, 0x5d,
+- 0x9f, 0x86, 0x2f, 0xaf, 0x89, 0x8e, 0x98, 0x8a, 0x1a, 0x01, 0xe3, 0x73,
+- 0x0f, 0x3c, 0xa0, 0xe7, 0x62, 0x52, 0x4e, 0xc8, 0x93, 0x8b, 0x59, 0xf8,
+- 0xf5, 0x5a, 0x3a, 0x55, 0x94, 0x27, 0xa5, 0x5a, 0x3b, 0x24, 0x93, 0xb5,
+- 0xf0, 0xde, 0x80, 0x77, 0x06, 0x49, 0xe5, 0xbf, 0xe8, 0x5f, 0x27, 0x03,
+- 0xda, 0x41, 0x73, 0x7e, 0x84, 0x31, 0x3a, 0x4b, 0xdf, 0x7d, 0x0d, 0x3a,
+- 0xd1, 0x12, 0xd4, 0xda, 0xbe, 0xfe, 0x19, 0xb9, 0x8f, 0x30, 0x47, 0xfd,
+- 0xdb, 0xb0, 0x7a, 0x6e, 0x7b, 0x4e, 0xfd, 0x89, 0x8a, 0xa9, 0x4b, 0x36,
+- 0x9f, 0x09, 0xf3, 0xf6, 0xe0, 0x94, 0x75, 0xdd, 0x64, 0x6d, 0x70, 0xc1,
+- 0x21, 0x3e, 0x53, 0x9d, 0xb5, 0x91, 0xbb, 0x8c, 0xb5, 0xad, 0xa4, 0x0b,
+- 0xcd, 0xc0, 0x3c, 0xf6, 0x77, 0x9a, 0x83, 0x71, 0xb8, 0xf6, 0xb5, 0x86,
+- 0xb5, 0x9c, 0x63, 0x4f, 0xdc, 0xd8, 0xa3, 0xe1, 0xce, 0xe4, 0x82, 0x9b,
+- 0x51, 0x35, 0x7b, 0xc1, 0x55, 0xb9, 0x02, 0x6a, 0x74, 0xe8, 0x93, 0xba,
+- 0x43, 0x81, 0x3f, 0x72, 0xff, 0xce, 0xf4, 0xcf, 0x9d, 0xfe, 0x63, 0x45,
+- 0x18, 0xdf, 0xa8, 0x6f, 0x53, 0xca, 0x4f, 0xbd, 0xd9, 0x70, 0x17, 0xf0,
+- 0x26, 0xfc, 0xd2, 0x9d, 0x9b, 0xfd, 0x9a, 0xc6, 0x0c, 0x7c, 0x5a, 0xab,
+- 0xca, 0x53, 0x7c, 0x9f, 0x96, 0x6a, 0x80, 0x4d, 0xf1, 0xde, 0xa0, 0xc3,
+- 0xaf, 0xbd, 0x7f, 0x2b, 0x58, 0xc3, 0xfc, 0xc1, 0x32, 0x99, 0x3b, 0xf8,
+- 0xb2, 0xf0, 0x9e, 0x59, 0x1d, 0x27, 0x4a, 0x01, 0xbe, 0xa6, 0xe0, 0xdd,
+- 0x5b, 0x6d, 0x3e, 0x4d, 0xe1, 0xda, 0x3f, 0x0d, 0xee, 0xa6, 0x94, 0x2f,
+- 0xcc, 0x03, 0x16, 0x3c, 0xa4, 0x4a, 0x3a, 0xf4, 0x66, 0xa4, 0xee, 0xcb,
+- 0x1b, 0xf1, 0x8e, 0xf7, 0x4f, 0x8a, 0xb6, 0x0b, 0x2a, 0xe7, 0x68, 0xe4,
+- 0x3f, 0x4f, 0xbe, 0xf3, 0x06, 0x69, 0x74, 0xc7, 0xb0, 0x56, 0x0e, 0xf8,
+- 0x77, 0x14, 0xa6, 0x4c, 0x98, 0xfd, 0xe6, 0x24, 0xf1, 0x26, 0x04, 0xf8,
+- 0x90, 0x97, 0xe4, 0xc2, 0x33, 0xfc, 0x26, 0xf7, 0x06, 0xde, 0x8d, 0x1c,
+- 0xa3, 0xff, 0x66, 0x40, 0xcb, 0x8f, 0x03, 0x79, 0x85, 0xef, 0x7f, 0xb1,
+- 0xf9, 0xe6, 0xf1, 0x3d, 0xb7, 0x07, 0xf2, 0xc4, 0xf3, 0xa1, 0x5f, 0x43,
+- 0x13, 0xf5, 0xfd, 0x34, 0xf0, 0xa8, 0x18, 0x5c, 0xd1, 0x73, 0x88, 0xf9,
+- 0x59, 0x64, 0x34, 0x35, 0xd8, 0xb4, 0x20, 0xf6, 0xbb, 0x69, 0xbb, 0x84,
+- 0x55, 0x1f, 0xd5, 0xe8, 0x57, 0xaf, 0xc3, 0xaf, 0xf2, 0xac, 0x3f, 0x96,
+- 0xa9, 0x5a, 0xaf, 0xdd, 0xac, 0xa9, 0xfc, 0x3a, 0x73, 0x5a, 0xfa, 0xed,
+- 0xd3, 0xc8, 0x3d, 0x50, 0xa3, 0xa5, 0x8e, 0x08, 0x65, 0x7e, 0x5d, 0x76,
+- 0xa8, 0x9c, 0xe0, 0x63, 0xb1, 0x20, 0x93, 0x22, 0xea, 0x04, 0x7d, 0xe8,
+- 0x5f, 0x3d, 0x95, 0xd3, 0x68, 0xa8, 0x42, 0x6f, 0x81, 0xeb, 0x6d, 0x85,
+- 0x87, 0xf8, 0x1a, 0x71, 0x69, 0xd2, 0x32, 0x14, 0xe2, 0x4b, 0xc9, 0x51,
+- 0x37, 0xc4, 0x69, 0xc8, 0x65, 0x64, 0x2d, 0xfa, 0x90, 0x17, 0xf0, 0xcf,
+- 0xe7, 0x5f, 0x7a, 0xcc, 0x09, 0xf4, 0xdc, 0xdd, 0x81, 0x0c, 0x7e, 0x8f,
+- 0x32, 0xc0, 0x18, 0x3a, 0xef, 0x7c, 0xc5, 0xaf, 0x45, 0x54, 0x2d, 0x37,
+- 0x86, 0x9a, 0x82, 0x73, 0x2b, 0x2d, 0x05, 0x3b, 0x3c, 0xe3, 0x7d, 0x98,
+- 0x2b, 0xe2, 0x47, 0xb9, 0x10, 0x66, 0x3f, 0x9e, 0xf3, 0x01, 0x9c, 0x0c,
+- 0xfb, 0x35, 0x79, 0x58, 0x8b, 0x84, 0x39, 0xa1, 0xcc, 0xe8, 0x39, 0xe6,
+- 0xef, 0x3b, 0x40, 0x2b, 0x73, 0x56, 0x9c, 0xe7, 0xaa, 0xff, 0x59, 0x85,
+- 0xa9, 0xac, 0xc1, 0xf8, 0xb9, 0xe7, 0xa8, 0x1b, 0xe6, 0xbb, 0xcc, 0x69,
+- 0xc3, 0xdc, 0x27, 0xaf, 0x15, 0x9d, 0x31, 0xed, 0x3e, 0x87, 0xf0, 0xfa,
+- 0xec, 0x66, 0xb1, 0x52, 0x3d, 0xba, 0x27, 0x23, 0x43, 0xac, 0x9d, 0x8f,
+- 0xe1, 0xcc, 0x3b, 0xa4, 0x9c, 0x41, 0x1e, 0x60, 0xde, 0x85, 0xbe, 0x19,
+- 0x73, 0x5f, 0xc6, 0x1c, 0x74, 0x23, 0xc3, 0xfc, 0x66, 0x83, 0xaa, 0x41,
+- 0x4a, 0x2a, 0x76, 0xec, 0x08, 0xf4, 0xe5, 0x89, 0x4e, 0x5f, 0x3f, 0xbe,
+- 0x87, 0xf1, 0x46, 0xcc, 0x7f, 0x03, 0xbd, 0xe7, 0xf5, 0x0c, 0x85, 0xf3,
+- 0xd4, 0xfb, 0x61, 0xcc, 0xdf, 0x09, 0x1c, 0x15, 0x3c, 0x7f, 0x0e, 0xcf,
+- 0x7f, 0xb8, 0x6e, 0xed, 0x77, 0x31, 0xae, 0x60, 0xbe, 0xb0, 0x6e, 0x3e,
+- 0xf4, 0xb3, 0xdc, 0xaf, 0xa2, 0x15, 0xdd, 0x29, 0x2d, 0xaf, 0xea, 0x88,
+- 0x63, 0xa8, 0x55, 0xe8, 0x6b, 0x59, 0xb3, 0xcc, 0x20, 0x17, 0xa7, 0x9f,
+- 0x3d, 0x88, 0x35, 0x8b, 0xd0, 0xbb, 0x56, 0x95, 0x65, 0xea, 0xca, 0x1e,
+- 0x0f, 0x1d, 0xec, 0x99, 0x63, 0x5f, 0x39, 0x68, 0xd7, 0x09, 0xc3, 0xe7,
+- 0x27, 0x0f, 0xf6, 0xd4, 0x0f, 0x01, 0x96, 0xf9, 0x7a, 0xe3, 0x1d, 0xef,
+- 0x37, 0xd6, 0xed, 0xe9, 0xd7, 0x38, 0x45, 0x75, 0x37, 0x78, 0xe8, 0x60,
+- 0x61, 0x86, 0x71, 0x9a, 0xf5, 0x26, 0xf3, 0xd2, 0xca, 0xc1, 0xf1, 0xda,
+- 0x54, 0x50, 0xd3, 0x84, 0xef, 0xf9, 0x8e, 0xf2, 0xbf, 0x15, 0x6d, 0xa4,
+- 0xab, 0x11, 0x8f, 0xca, 0x6b, 0x80, 0xe7, 0x49, 0xe0, 0x61, 0x6d, 0xa4,
+- 0xee, 0x90, 0x15, 0xbd, 0xa9, 0xb9, 0x5b, 0xd1, 0x46, 0x5c, 0xdc, 0x2b,
+- 0xc4, 0x77, 0x02, 0x75, 0xc7, 0x77, 0x48, 0x2f, 0xf0, 0x7c, 0x26, 0xc8,
+- 0x6d, 0x78, 0x37, 0x65, 0xf8, 0x77, 0x38, 0x6a, 0x1c, 0xd6, 0xbe, 0x4d,
+- 0xeb, 0x6a, 0xdf, 0xa6, 0xe0, 0x1e, 0x8b, 0xb0, 0x7a, 0x00, 0xab, 0xee,
+- 0xd0, 0x31, 0x97, 0x0a, 0xee, 0x94, 0xe3, 0xbc, 0x53, 0x6e, 0x90, 0x45,
+- 0x53, 0x20, 0x7f, 0xd2, 0x11, 0xd6, 0x2b, 0x8d, 0xf4, 0xf1, 0xbe, 0x79,
+- 0x0a, 0xef, 0xc3, 0xb3, 0x09, 0x79, 0x5f, 0xc4, 0x3c, 0xe9, 0x3d, 0x03,
+- 0xf8, 0x90, 0xde, 0x4f, 0x7b, 0xa6, 0x5c, 0x7b, 0x06, 0xbf, 0x70, 0xbf,
+- 0x50, 0x2e, 0xa4, 0xf5, 0xd7, 0xd5, 0x5a, 0xa1, 0xdf, 0x5b, 0x0c, 0x62,
+- 0x3a, 0xe9, 0xa2, 0x0f, 0xa2, 0x3f, 0x0e, 0xef, 0xc0, 0x59, 0x63, 0x33,
+- 0x56, 0xf0, 0xbc, 0x5a, 0xa0, 0x2b, 0x84, 0xd3, 0x90, 0x5f, 0xeb, 0xcc,
+- 0xc3, 0x52, 0xa8, 0x35, 0x92, 0x8f, 0xc8, 0x0f, 0xb0, 0x57, 0x3e, 0xd3,
+- 0xa4, 0xec, 0x88, 0xf7, 0x08, 0xcd, 0xb2, 0x02, 0x9d, 0xbe, 0x84, 0xfa,
+- 0x63, 0x1e, 0xb5, 0xd1, 0x12, 0xef, 0xb5, 0xeb, 0x27, 0x3b, 0x79, 0x1f,
+- 0x32, 0x65, 0xad, 0xd5, 0xf1, 0x73, 0x80, 0x59, 0xb0, 0x58, 0xeb, 0x4b,
+- 0xd0, 0x10, 0x23, 0x91, 0x67, 0x8c, 0x5b, 0xff, 0xe3, 0x95, 0x13, 0x8d,
+- 0xb0, 0xb7, 0xaa, 0xb3, 0xdb, 0xa4, 0x3a, 0x9b, 0x3e, 0x3a, 0x87, 0x7a,
+- 0x77, 0xc6, 0xd2, 0xb7, 0xe8, 0x7e, 0xad, 0x34, 0x03, 0xdf, 0xa4, 0x6a,
+- 0xad, 0x39, 0x79, 0xae, 0x93, 0x67, 0xd7, 0x64, 0xf5, 0x9b, 0x9d, 0xfa,
+- 0xef, 0x50, 0x17, 0x15, 0xe5, 0xb1, 0x13, 0x1b, 0xa4, 0x3c, 0x70, 0x1f,
+- 0x72, 0x2d, 0xc8, 0xf3, 0x44, 0x05, 0x95, 0x21, 0xf5, 0xea, 0xbd, 0x03,
+- 0xe3, 0x16, 0x6b, 0x26, 0xf1, 0xe3, 0x9a, 0xf8, 0x3c, 0xc6, 0x4e, 0xb4,
+- 0x29, 0x9f, 0xe4, 0xdf, 0x99, 0xf7, 0x9a, 0x45, 0xe4, 0x63, 0x85, 0x01,
+- 0x24, 0x8d, 0xc8, 0x5e, 0xcc, 0x9d, 0x22, 0x3d, 0xcc, 0x19, 0xe1, 0x8f,
+- 0x7b, 0xce, 0xc1, 0xcb, 0x9d, 0x20, 0xbc, 0x2e, 0xc6, 0x89, 0x98, 0x34,
+- 0x9d, 0x60, 0x9d, 0x2d, 0x5d, 0xa8, 0x51, 0x88, 0xb3, 0xc7, 0x40, 0x3f,
+- 0x8a, 0xdf, 0x1e, 0xe4, 0x51, 0x26, 0xf2, 0xda, 0x5b, 0xc0, 0x03, 0x96,
+- 0x6b, 0x6e, 0x05, 0xff, 0x6a, 0x27, 0xeb, 0xce, 0x9e, 0x73, 0x84, 0xe7,
+- 0x7d, 0x76, 0x17, 0xe8, 0xf1, 0xf7, 0x27, 0x0e, 0xe3, 0x84, 0x48, 0xef,
+- 0xb4, 0x74, 0xea, 0x6a, 0x8d, 0x21, 0xe3, 0x59, 0xbe, 0x6b, 0x03, 0xfc,
+- 0xab, 0xca, 0x3e, 0x7b, 0xd5, 0x3a, 0xff, 0xce, 0xa2, 0xbc, 0x46, 0x37,
+- 0xe6, 0x34, 0x3c, 0x23, 0x57, 0xca, 0x9a, 0xd2, 0x3b, 0xef, 0xc3, 0xf6,
+- 0x9c, 0xeb, 0xd8, 0xe2, 0xdf, 0xed, 0xf8, 0xb4, 0xf1, 0x6e, 0xb0, 0x0c,
+- 0xa9, 0x1a, 0x3b, 0x59, 0xf3, 0x13, 0x86, 0xdf, 0x52, 0xd8, 0x73, 0x2d,
+- 0xe5, 0xe7, 0xcf, 0xe9, 0xfa, 0xff, 0xa5, 0x5f, 0xeb, 0xbf, 0xe1, 0x84,
+- 0x77, 0x4b, 0xa9, 0x86, 0xbb, 0xa5, 0x74, 0xc3, 0xb7, 0x97, 0x9f, 0xb4,
+- 0x05, 0x7a, 0x27, 0x93, 0xb6, 0x27, 0xe1, 0xf7, 0xa5, 0xbd, 0x37, 0xe5,
+- 0x90, 0x19, 0x15, 0xa7, 0xc7, 0x21, 0xfb, 0x2b, 0x75, 0xd2, 0x8b, 0x98,
+- 0x53, 0x8f, 0xcb, 0xfb, 0x8b, 0xad, 0x72, 0x65, 0xce, 0xcf, 0x29, 0xaf,
+- 0xa8, 0x6f, 0x4e, 0xa6, 0x7c, 0x80, 0xc2, 0xff, 0x72, 0x3d, 0x83, 0x5f,
+- 0xa7, 0x5c, 0x5d, 0xbc, 0x39, 0xa7, 0xbc, 0xe0, 0xde, 0x0d, 0x5a, 0x3a,
+- 0x03, 0x1b, 0x46, 0xdd, 0x86, 0x18, 0x58, 0x09, 0xee, 0xea, 0x55, 0xce,
+- 0x62, 0xd0, 0x16, 0x78, 0x27, 0x1f, 0xde, 0x57, 0xf7, 0x9a, 0x17, 0x21,
+- 0xe3, 0xaf, 0x1a, 0x9d, 0xa8, 0xa3, 0x79, 0xd7, 0x16, 0xc6, 0xec, 0x30,
+- 0xf6, 0x90, 0xee, 0xb7, 0x81, 0x7b, 0x00, 0x7a, 0x4a, 0xdd, 0xb4, 0xa1,
+- 0xb3, 0xa6, 0x2c, 0xf5, 0xa5, 0x67, 0x2a, 0xc2, 0xef, 0x02, 0x59, 0xec,
+- 0xb9, 0x0c, 0xbd, 0xcc, 0x40, 0x1e, 0xcc, 0xf5, 0x28, 0x57, 0x9c, 0xed,
+- 0xf4, 0x94, 0x94, 0xdd, 0xad, 0xc0, 0x97, 0x97, 0x92, 0x3b, 0x8c, 0xbd,
+- 0x8e, 0x43, 0x6f, 0x7f, 0xb9, 0x85, 0x77, 0x99, 0xcd, 0x56, 0x16, 0x34,
+- 0xde, 0x25, 0xe3, 0x27, 0xa7, 0x64, 0xc2, 0x59, 0xfd, 0x66, 0x94, 0xe1,
+- 0xf7, 0x94, 0x45, 0xd4, 0xb4, 0xbe, 0x3d, 0xe6, 0x64, 0xfc, 0x14, 0x70,
+- 0x38, 0xac, 0x8d, 0x7b, 0xa1, 0x37, 0xfd, 0xaa, 0x36, 0x2e, 0x29, 0x9f,
+- 0xc4, 0xf9, 0xef, 0x01, 0x57, 0x6f, 0x65, 0x0f, 0xe0, 0xca, 0xa8, 0x9f,
+- 0x8b, 0xc8, 0x85, 0x17, 0x1c, 0x43, 0xca, 0x36, 0x7c, 0x6b, 0x31, 0xa9,
+- 0xeb, 0xbb, 0xba, 0x65, 0xde, 0xe9, 0x37, 0x75, 0xde, 0x3d, 0x26, 0x7c,
+- 0xdf, 0x57, 0x56, 0xf6, 0x9d, 0xd4, 0x0d, 0xab, 0x5b, 0x16, 0x9d, 0x8a,
+- 0x54, 0x07, 0x38, 0xe6, 0xf9, 0x55, 0xc4, 0xb4, 0x7c, 0x5f, 0x99, 0xd7,
+- 0x35, 0x75, 0xb7, 0x5d, 0x76, 0xd5, 0xfd, 0x68, 0xca, 0x94, 0xc3, 0xa0,
+- 0x0f, 0xcf, 0x0b, 0xd0, 0xf1, 0x69, 0xe6, 0x78, 0xfe, 0x9d, 0xf1, 0x81,
+- 0xe5, 0x22, 0x68, 0x68, 0x97, 0xde, 0x1f, 0xd3, 0xc6, 0x1e, 0xc2, 0x1c,
+- 0xc7, 0x69, 0xe8, 0xeb, 0xc3, 0x78, 0x26, 0x6c, 0x12, 0x3d, 0xe5, 0xd0,
+- 0x8d, 0xde, 0x04, 0x2d, 0xd0, 0x4b, 0xd6, 0xa5, 0xfb, 0x53, 0x32, 0x7f,
+- 0x72, 0xb7, 0x94, 0x16, 0x76, 0x03, 0xff, 0x3f, 0x22, 0xe7, 0xbf, 0x33,
+- 0xb8, 0x8b, 0x65, 0xde, 0xcf, 0x7d, 0x5e, 0xdc, 0xa2, 0x6c, 0x63, 0x9a,
+- 0xf3, 0xec, 0xf7, 0x61, 0x3d, 0xea, 0x07, 0x47, 0xdd, 0x4f, 0x03, 0x06,
+- 0x67, 0xe7, 0x36, 0x7e, 0xfb, 0xeb, 0x84, 0x9f, 0xae, 0xb0, 0x76, 0x40,
+- 0x6c, 0x99, 0x1b, 0x2c, 0xd4, 0xd2, 0x66, 0x41, 0x7d, 0x97, 0xc8, 0x88,
+- 0x1f, 0x6f, 0x38, 0x17, 0x17, 0x6b, 0x1a, 0xf5, 0x68, 0x8e, 0xef, 0x0e,
+- 0xab, 0xfb, 0x1f, 0xf5, 0x7d, 0x4e, 0xde, 0x95, 0x51, 0xe8, 0x58, 0xef,
+- 0x74, 0x06, 0x39, 0xf1, 0x7b, 0xc8, 0x27, 0x7f, 0x1e, 0xc8, 0x60, 0x38,
+- 0xd0, 0x8d, 0xd6, 0x06, 0x9d, 0xc0, 0x39, 0x3b, 0x38, 0x7b, 0x07, 0x7a,
+- 0xe0, 0xe0, 0xac, 0x57, 0xf5, 0x63, 0xb8, 0xc1, 0xe7, 0x6e, 0x92, 0xbf,
+- 0x9c, 0x49, 0x67, 0x56, 0xa0, 0x3f, 0x57, 0xc1, 0xeb, 0x0a, 0xea, 0xbc,
+- 0x2b, 0x88, 0x23, 0x0b, 0x35, 0x7e, 0x4b, 0xe0, 0xb7, 0x38, 0x8e, 0xb7,
+- 0xe1, 0x3c, 0x42, 0x7f, 0xfc, 0x52, 0x60, 0x17, 0x9b, 0xd4, 0x7d, 0xe7,
+- 0xfb, 0x38, 0xc3, 0x15, 0xd3, 0xcf, 0x17, 0xfd, 0x35, 0x9b, 0x24, 0xfc,
+- 0xde, 0xe7, 0xeb, 0x0f, 0x69, 0xa1, 0xfe, 0x7c, 0xb2, 0xc5, 0xcf, 0xfb,
+- 0xf9, 0x0d, 0x8c, 0xf5, 0x0b, 0x9f, 0xef, 0xdf, 0xe2, 0xe3, 0x6a, 0xd4,
+- 0xdb, 0x8f, 0x3d, 0xd6, 0x6a, 0x85, 0x3e, 0xf8, 0x6c, 0xd7, 0x93, 0x63,
+- 0xf6, 0xcd, 0xf6, 0x76, 0x8f, 0x13, 0xca, 0x87, 0xf2, 0x2b, 0xca, 0x11,
+- 0x37, 0x0d, 0x5b, 0xa0, 0xec, 0xac, 0x06, 0xd9, 0x89, 0xfc, 0xb9, 0x23,
+- 0xbc, 0xef, 0xc2, 0x3b, 0x25, 0xbb, 0x64, 0x21, 0xd6, 0xca, 0xfb, 0x5a,
+- 0xe8, 0xe3, 0xdf, 0xca, 0xc4, 0xac, 0xc8, 0x32, 0xde, 0x2f, 0x39, 0xb4,
+- 0xd1, 0x0c, 0xf2, 0xd7, 0x8d, 0x32, 0x3f, 0x87, 0x3a, 0xcb, 0x91, 0x52,
+- 0xe1, 0x4e, 0xc6, 0x99, 0xb8, 0x5c, 0x51, 0xf7, 0x7b, 0x22, 0x3b, 0xcf,
+- 0x1a, 0x62, 0x9c, 0x45, 0x41, 0x07, 0x99, 0x9f, 0xef, 0x0b, 0xef, 0xfb,
+- 0x7c, 0x5b, 0xaf, 0xd6, 0xb0, 0xd6, 0xe9, 0x55, 0xfe, 0xb1, 0x5a, 0x1f,
+- 0x97, 0xf2, 0x0c, 0xf7, 0x42, 0x3f, 0x97, 0xc2, 0x3b, 0x5b, 0x26, 0x4f,
+- 0x66, 0xe4, 0xfb, 0xfc, 0x5e, 0x93, 0x1d, 0xc5, 0x1e, 0x05, 0xa9, 0x2c,
+- 0x63, 0xbe, 0xfe, 0x4f, 0x32, 0xb7, 0x38, 0x2e, 0xf3, 0x33, 0x17, 0x1a,
+- 0xee, 0x73, 0x31, 0x9e, 0x6b, 0xac, 0x4f, 0x8b, 0xac, 0xa9, 0x50, 0x7f,
+- 0x5a, 0x18, 0xc3, 0x06, 0xea, 0x93, 0xa5, 0x9b, 0xef, 0x1f, 0x1b, 0xeb,
+- 0xd2, 0x51, 0x39, 0x8a, 0x33, 0xae, 0x9e, 0xcc, 0xa8, 0xba, 0xa6, 0x25,
+- 0x37, 0xfb, 0xf8, 0x87, 0x88, 0x11, 0x63, 0x42, 0x3d, 0xbb, 0x2e, 0x5f,
+- 0xb3, 0x8f, 0xca, 0x23, 0x88, 0x1d, 0x47, 0x90, 0x5f, 0xff, 0x36, 0xea,
+- 0xba, 0xd4, 0x66, 0x9e, 0x21, 0xe8, 0xb5, 0x58, 0x57, 0x7a, 0x32, 0x6a,
+- 0xdf, 0x61, 0xfe, 0x00, 0x92, 0x7d, 0xbf, 0xce, 0xf8, 0xf8, 0xdf, 0x5e,
+- 0x1e, 0xf1, 0xee, 0x43, 0x0b, 0x3e, 0x41, 0xc1, 0x69, 0x3e, 0xdc, 0x0c,
+- 0xe1, 0xfa, 0xcd, 0x63, 0x84, 0x9b, 0xd3, 0x02, 0x38, 0x0d, 0x70, 0x31,
+- 0xb9, 0x68, 0x1b, 0xd0, 0x8d, 0x51, 0xf0, 0x09, 0xdf, 0x3e, 0x18, 0x7e,
+- 0x6f, 0xdc, 0x80, 0x98, 0xba, 0xb6, 0xfe, 0x8d, 0x60, 0xfd, 0xf7, 0x83,
+- 0xf5, 0x97, 0x56, 0xd7, 0x87, 0x71, 0xf5, 0x13, 0x4f, 0x1a, 0xe8, 0x7a,
+- 0xa3, 0xe6, 0xc3, 0x1f, 0x0d, 0xe8, 0xba, 0xb4, 0x4a, 0x57, 0x08, 0x0f,
+- 0x79, 0x2a, 0x9e, 0xe9, 0x93, 0xe9, 0x9b, 0x7b, 0x21, 0x47, 0x7e, 0x47,
+- 0x86, 0x4d, 0x38, 0xfc, 0x7e, 0x4b, 0x3b, 0xd1, 0x65, 0x25, 0x71, 0x54,
+- 0xc6, 0xac, 0xf4, 0xf0, 0xa4, 0xc4, 0xa0, 0xc3, 0xf4, 0x29, 0x31, 0x99,
+- 0xa7, 0xaf, 0x41, 0x5f, 0xb6, 0x6f, 0x4d, 0xeb, 0xfb, 0x0d, 0xb4, 0xc6,
+- 0x9e, 0x27, 0x8d, 0x3e, 0xad, 0xf1, 0x1d, 0x6b, 0xb4, 0xfa, 0xf0, 0x3e,
+- 0xad, 0xef, 0xd7, 0x1a, 0xe0, 0xcf, 0x1a, 0x01, 0xbc, 0xd1, 0x00, 0x4f,
+- 0x7d, 0x66, 0x3e, 0x41, 0x7d, 0x26, 0x6d, 0x5f, 0x50, 0xf7, 0x66, 0x1b,
+- 0x72, 0xb3, 0x07, 0x3f, 0xbf, 0xc3, 0x93, 0x38, 0xf2, 0x8c, 0x66, 0xbc,
+- 0xbb, 0x32, 0xc3, 0x1c, 0x44, 0xef, 0x69, 0x96, 0x9d, 0xd0, 0x59, 0x9e,
+- 0x5d, 0xe3, 0x9d, 0xab, 0x27, 0x8f, 0xd8, 0xa4, 0xe5, 0x3f, 0xbd, 0x33,
+- 0x89, 0x9d, 0x76, 0x55, 0xfa, 0xcc, 0x66, 0xe1, 0x9d, 0xae, 0xc2, 0x99,
+- 0x21, 0x2d, 0xa7, 0xfb, 0x7a, 0xcd, 0xb7, 0xc0, 0xe7, 0xe8, 0x8c, 0x26,
+- 0xf3, 0x56, 0x3a, 0x79, 0x1e, 0x38, 0xf6, 0xe0, 0x6c, 0xe6, 0x07, 0x48,
+- 0x8f, 0xc8, 0x04, 0xf4, 0x7b, 0x5e, 0xc5, 0x43, 0xea, 0x71, 0x7a, 0xac,
+- 0x82, 0x1c, 0xe7, 0xa7, 0x2a, 0xa6, 0x79, 0xde, 0x87, 0x88, 0x6b, 0x63,
+- 0xeb, 0x74, 0x4f, 0x3f, 0xeb, 0xeb, 0x9e, 0x7e, 0x16, 0xb5, 0xf1, 0xf1,
+- 0xb8, 0xb4, 0x2c, 0xc1, 0x7e, 0x9e, 0xef, 0x52, 0xfa, 0xa7, 0x3f, 0xcf,
+- 0x6f, 0x19, 0xf0, 0x73, 0xc7, 0x0d, 0xb1, 0x8e, 0xab, 0x38, 0x00, 0x79,
+- 0x17, 0x64, 0xf2, 0x14, 0x7d, 0xa9, 0x25, 0x3b, 0x8e, 0xf3, 0x3c, 0x98,
+- 0xcf, 0xcc, 0x0d, 0x8e, 0xc3, 0x46, 0xa6, 0xf8, 0x7d, 0x70, 0xe9, 0x23,
+- 0x19, 0xb7, 0x28, 0x07, 0x94, 0xfa, 0x4b, 0xa6, 0xc4, 0x96, 0xe0, 0x13,
+- 0x96, 0x92, 0xd2, 0x04, 0xdb, 0xd2, 0xcf, 0x26, 0xb4, 0xea, 0xec, 0x7f,
+- 0xc1, 0x1e, 0xf8, 0x4d, 0x20, 0x83, 0x71, 0x52, 0xab, 0xd6, 0x06, 0xd0,
+- 0x53, 0xcf, 0x91, 0x46, 0x9d, 0xa5, 0x9e, 0x93, 0x8e, 0xd0, 0x5e, 0xf0,
+- 0x7c, 0x36, 0xa3, 0xee, 0x6c, 0x3f, 0xb4, 0xc9, 0xcb, 0xdf, 0x48, 0x61,
+- 0x26, 0xfc, 0x1b, 0x10, 0xd9, 0x8c, 0x1c, 0xa6, 0xa3, 0x60, 0xef, 0x18,
+- 0xbe, 0x22, 0x9f, 0x96, 0xaf, 0x6d, 0x9f, 0x82, 0x2f, 0xf2, 0xd1, 0xc8,
+- 0x17, 0x79, 0x6a, 0x97, 0x26, 0xc5, 0x57, 0xc8, 0x0f, 0x04, 0x0d, 0x7e,
+- 0x7a, 0x8e, 0x27, 0x81, 0xff, 0x61, 0xf8, 0x80, 0x6e, 0xf4, 0x0f, 0xa1,
+- 0x47, 0x28, 0x3b, 0x4b, 0xde, 0xc9, 0xeb, 0x55, 0xe4, 0x8b, 0x21, 0x9f,
+- 0x25, 0x3c, 0xbf, 0x2e, 0x93, 0xb3, 0xde, 0x61, 0xc4, 0x53, 0xde, 0x27,
+- 0x77, 0xea, 0x4a, 0x77, 0xd7, 0xf3, 0xfe, 0xba, 0xf8, 0xf2, 0xe1, 0x5d,
+- 0x3c, 0x9e, 0x17, 0xd7, 0xcb, 0xa2, 0xd1, 0x77, 0x24, 0x83, 0xbf, 0x7b,
+- 0xa1, 0x9f, 0xa0, 0x8c, 0xae, 0x4a, 0x61, 0x96, 0x77, 0x5a, 0x3e, 0xbe,
+- 0xd2, 0xea, 0xdf, 0xbe, 0x34, 0xae, 0x19, 0x00, 0x5c, 0x37, 0xe0, 0x48,
+- 0xd7, 0x0a, 0xe5, 0x07, 0x9f, 0xb3, 0xbd, 0xc1, 0xd7, 0x34, 0xae, 0xcb,
+- 0xca, 0x33, 0x88, 0xff, 0x6f, 0xd8, 0x37, 0xc9, 0xb5, 0xc4, 0x1c, 0x68,
+- 0xbe, 0xbe, 0x0f, 0x36, 0xd9, 0x04, 0x5f, 0x66, 0xca, 0x95, 0x5a, 0xb3,
+- 0xcc, 0x23, 0xcf, 0x59, 0x58, 0xa4, 0x2f, 0x24, 0xed, 0xad, 0x98, 0xf7,
+- 0xfd, 0x17, 0x7d, 0xed, 0x95, 0x1a, 0xe2, 0x2b, 0x6c, 0xfb, 0x4a, 0x2d,
+- 0x81, 0xbe, 0x1b, 0xbd, 0x85, 0x3e, 0x85, 0x3e, 0x83, 0x7e, 0x00, 0xfd,
+- 0x00, 0x7a, 0x0b, 0x6b, 0x93, 0xe8, 0xc3, 0x5a, 0x82, 0xb8, 0xd6, 0xf8,
+- 0xae, 0xaa, 0xfd, 0xf8, 0xdd, 0x90, 0xb1, 0xcc, 0xb0, 0x47, 0x50, 0x63,
+- 0x17, 0x06, 0xc2, 0xbf, 0xb9, 0xb9, 0xe1, 0x99, 0x16, 0x6b, 0xf7, 0x8a,
+- 0xb6, 0x47, 0x7d, 0x5f, 0x98, 0x41, 0x5c, 0x78, 0x6e, 0xab, 0xb4, 0x5a,
+- 0xe6, 0x3d, 0xea, 0xee, 0x68, 0x16, 0x63, 0x3e, 0xa3, 0x3e, 0x4e, 0x4c,
+- 0x21, 0x3e, 0xd1, 0x7f, 0xfe, 0x6f, 0xe7, 0xd6, 0x1b, 0xdb, 0xc6, 0x59,
+- 0xc6, 0x1f, 0x9f, 0x9d, 0x34, 0xe9, 0x9a, 0xf6, 0x92, 0x38, 0xa9, 0x93,
+- 0x85, 0xcd, 0x8e, 0x2f, 0xad, 0x45, 0xd2, 0x71, 0xed, 0x2c, 0x16, 0xa6,
+- 0x8c, 0x78, 0x76, 0x92, 0x76, 0x30, 0xa6, 0xb4, 0x74, 0xd3, 0x84, 0x10,
+- 0x58, 0xc9, 0xba, 0x75, 0x13, 0xd2, 0x28, 0x30, 0x34, 0x89, 0xa2, 0x18,
+- 0x27, 0x61, 0x19, 0x18, 0xc7, 0x0b, 0x81, 0x4e, 0xf0, 0xc5, 0x38, 0xd1,
+- 0x06, 0x22, 0x4a, 0x3a, 0x8d, 0x0f, 0x08, 0x6d, 0x74, 0xb8, 0x83, 0xef,
+- 0xfc, 0x11, 0x62, 0x12, 0x1f, 0xaa, 0xa8, 0x63, 0x20, 0x21, 0xe0, 0x23,
+- 0xd2, 0x98, 0x8e, 0xdf, 0xef, 0x79, 0xef, 0x12, 0xc7, 0x64, 0x54, 0xf0,
+- 0xc1, 0x3a, 0xbf, 0x77, 0xf7, 0xbe, 0xf7, 0xde, 0xfb, 0x3c, 0xef, 0xef,
+- 0xf9, 0x3d, 0x7f, 0xce, 0x43, 0x9f, 0x19, 0xe0, 0xf8, 0x11, 0x61, 0x0c,
+- 0x36, 0x9b, 0xc6, 0xff, 0xea, 0xc5, 0x1e, 0x63, 0x4b, 0xc1, 0xdb, 0x77,
+- 0xb8, 0x61, 0x60, 0xab, 0x46, 0xd0, 0x67, 0x3f, 0x9f, 0x00, 0x36, 0xb0,
+- 0x92, 0xa8, 0x54, 0xb1, 0x07, 0x7f, 0xed, 0xce, 0x29, 0xa7, 0xa3, 0x2c,
+- 0x16, 0xc1, 0x4d, 0x73, 0x65, 0x72, 0x97, 0xcb, 0xf0, 0x47, 0xe0, 0xcb,
+- 0x45, 0xe9, 0xbb, 0xd3, 0x16, 0x90, 0x83, 0xfe, 0x12, 0x73, 0xa3, 0x1d,
+- 0xf8, 0x26, 0x9e, 0x87, 0xf7, 0x5a, 0xf3, 0xb0, 0x66, 0xa7, 0xc1, 0x05,
+- 0x3d, 0x2f, 0xe2, 0x4c, 0x4a, 0xfc, 0x1c, 0x31, 0x47, 0xd0, 0xdf, 0xc4,
+- 0xb2, 0xc8, 0xab, 0x32, 0xd3, 0x9a, 0x83, 0x84, 0x72, 0xfd, 0x0e, 0x7d,
+- 0x7b, 0xc4, 0xc4, 0xa7, 0x18, 0x7f, 0x16, 0x99, 0x2c, 0x1b, 0x2e, 0x0b,
+- 0xbf, 0xac, 0x61, 0xbc, 0xbb, 0xfd, 0xf1, 0x78, 0xdd, 0xd2, 0x71, 0x6a,
+- 0xd2, 0x6b, 0x62, 0xbb, 0x63, 0x23, 0xb0, 0x11, 0x51, 0xa9, 0x43, 0x2e,
+- 0xd7, 0x21, 0x93, 0x37, 0x4b, 0xd4, 0xf5, 0x61, 0xe8, 0x7d, 0x0b, 0xf3,
+- 0xb3, 0x18, 0x6b, 0x44, 0x9f, 0x5d, 0x2f, 0x01, 0x3b, 0x6d, 0xf5, 0x4f,
+- 0x7b, 0xc9, 0x0b, 0x69, 0x07, 0xcd, 0x38, 0x03, 0xe6, 0x3e, 0x09, 0xae,
+- 0x75, 0xeb, 0x7c, 0x6a, 0x1a, 0x03, 0xe3, 0x3a, 0x41, 0x07, 0x4b, 0xdd,
+- 0xfe, 0x3d, 0x5e, 0x8f, 0xa9, 0x77, 0xe2, 0x39, 0xbe, 0xc7, 0x88, 0x64,
+- 0xcb, 0x41, 0xbf, 0x4e, 0xf4, 0x6b, 0x6f, 0x18, 0xeb, 0x68, 0xd3, 0x3b,
+- 0x58, 0xfe, 0x3b, 0xf0, 0x7a, 0x33, 0xdf, 0x4f, 0xd8, 0x05, 0x09, 0x38,
+- 0x3f, 0xed, 0x2f, 0x65, 0x93, 0xd6, 0xfc, 0xb6, 0x91, 0xcf, 0x80, 0xef,
+- 0x03, 0x24, 0x96, 0x0a, 0x02, 0xbe, 0x18, 0xa5, 0x8c, 0xd2, 0xd8, 0xd7,
+- 0x3f, 0x89, 0xca, 0x61, 0x57, 0x2a, 0xa5, 0x03, 0x62, 0x75, 0xb5, 0x68,
+- 0x8d, 0x4e, 0xdc, 0x6a, 0x7c, 0xe6, 0x67, 0xfd, 0x67, 0xc2, 0xf7, 0x5e,
+- 0x69, 0xd7, 0xb8, 0x34, 0xec, 0x0c, 0xee, 0x39, 0xd4, 0x34, 0xb7, 0x87,
+- 0xfd, 0xfb, 0x78, 0xdd, 0x91, 0x02, 0xf8, 0x67, 0xae, 0x0c, 0x26, 0x0f,
+- 0xfc, 0xb6, 0xc6, 0x98, 0xe3, 0x61, 0x0c, 0x6f, 0x38, 0x3e, 0x8f, 0x39,
+- 0x16, 0xec, 0x31, 0xc6, 0xcd, 0x30, 0x46, 0x5f, 0xd3, 0x18, 0x13, 0xfe,
+- 0x18, 0x59, 0x29, 0x5e, 0x99, 0xc0, 0x5e, 0x1b, 0x83, 0x7d, 0x4f, 0xda,
+- 0xa7, 0xe5, 0x23, 0x22, 0x9d, 0x38, 0xf7, 0x72, 0x0a, 0x72, 0xf2, 0xbc,
+- 0x49, 0x77, 0x1a, 0xf3, 0x7e, 0x0d, 0xb6, 0x35, 0xe0, 0x3c, 0xc5, 0x58,
+- 0x18, 0x36, 0xec, 0xf3, 0x2e, 0xe3, 0x62, 0x05, 0x30, 0xb2, 0x84, 0x6d,
+- 0x85, 0x86, 0x53, 0x35, 0xf0, 0xba, 0x2a, 0x2c, 0x69, 0xd1, 0xe1, 0x7b,
+- 0x76, 0x48, 0xd1, 0x0e, 0x8d, 0x87, 0xc1, 0x6b, 0xb2, 0x65, 0xee, 0x23,
+- 0x19, 0x0a, 0x8f, 0xb5, 0x82, 0x8b, 0x7a, 0xf2, 0x36, 0xa0, 0xa6, 0x58,
+- 0x5a, 0x92, 0xfa, 0x86, 0x8d, 0xe3, 0x05, 0xc8, 0xe1, 0x45, 0xfc, 0x7f,
+- 0x3e, 0xaa, 0x75, 0x4a, 0xe0, 0xeb, 0x8b, 0x78, 0x1f, 0xf2, 0x19, 0xf2,
+- 0x88, 0x1a, 0xec, 0xad, 0x05, 0x5b, 0x03, 0x5e, 0x35, 0x4a, 0xde, 0xf5,
+- 0xdc, 0xda, 0x4d, 0x79, 0x73, 0x35, 0x81, 0x67, 0xd1, 0x2e, 0x9f, 0x21,
+- 0x1e, 0xd8, 0x0b, 0x69, 0x9c, 0x5b, 0x37, 0xdc, 0xb7, 0xb8, 0x85, 0x0d,
+- 0xd4, 0x05, 0x8e, 0x00, 0x8e, 0xbd, 0x0d, 0x0c, 0x2c, 0xe2, 0xfe, 0xfa,
+- 0x6a, 0x44, 0xd6, 0x1c, 0xf2, 0x22, 0x89, 0x67, 0x71, 0x6f, 0x7d, 0x7d,
+- 0xb1, 0xd7, 0xe4, 0x51, 0xd8, 0x7f, 0x42, 0x0a, 0xe0, 0x75, 0xa7, 0xb5,
+- 0xef, 0xad, 0xe4, 0xcc, 0x39, 0x35, 0xfa, 0x77, 0xb3, 0x52, 0xe7, 0x7e,
+- 0xd2, 0xdc, 0x03, 0xb9, 0xc1, 0x65, 0xe8, 0x2c, 0x39, 0x3b, 0xfd, 0x00,
+- 0xfc, 0xdf, 0xe0, 0x75, 0xbe, 0x3b, 0x8e, 0xd5, 0x24, 0xd6, 0x86, 0xfb,
+- 0xbe, 0x10, 0x9a, 0x3e, 0x0e, 0x3b, 0x6a, 0x71, 0xaf, 0x17, 0x15, 0x0b,
+- 0x8a, 0xcb, 0xb3, 0xb0, 0x29, 0xac, 0xb5, 0xe8, 0x83, 0x2e, 0x3e, 0x08,
+- 0x59, 0xa6, 0x71, 0x5f, 0x93, 0x2d, 0xd9, 0x2c, 0x2a, 0x2f, 0xb3, 0x5e,
+- 0x32, 0xb8, 0x66, 0xd5, 0xc0, 0xd1, 0xb0, 0x7f, 0xac, 0x4d, 0xe8, 0x16,
+- 0xf6, 0x90, 0xb5, 0x19, 0xc5, 0x11, 0x78, 0xbc, 0x09, 0xbf, 0x02, 0xf8,
+- 0x66, 0x6d, 0xc2, 0x27, 0x00, 0xbe, 0x59, 0x9b, 0x29, 0x1c, 0x81, 0xf1,
+- 0x9b, 0x01, 0xae, 0x71, 0xfc, 0x94, 0xe6, 0xe1, 0x0d, 0xbe, 0x90, 0x4b,
+- 0x12, 0x5f, 0x02, 0x3e, 0x69, 0x74, 0xe1, 0xeb, 0xcb, 0xc4, 0x10, 0xea,
+- 0x75, 0x12, 0xb8, 0x45, 0x5d, 0x30, 0x5c, 0x72, 0xbd, 0x62, 0xd6, 0x6c,
+- 0x7e, 0xeb, 0x9a, 0xda, 0x88, 0x29, 0x71, 0xa0, 0x63, 0x5c, 0x3b, 0x5c,
+- 0x53, 0x1b, 0xf0, 0xba, 0x64, 0xf4, 0xc8, 0x35, 0xfb, 0xb9, 0x64, 0xd6,
+- 0x53, 0xf2, 0x0d, 0xc5, 0xad, 0x00, 0xb3, 0xc8, 0x21, 0x63, 0x58, 0x3f,
+- 0x47, 0x9e, 0xff, 0xf6, 0x4d, 0xc9, 0x7e, 0x87, 0xb8, 0x35, 0x1c, 0x6b,
+- 0x0f, 0x11, 0xab, 0x3c, 0xd9, 0x80, 0x6d, 0x3a, 0xed, 0x26, 0x1e, 0x65,
+- 0xfd, 0x66, 0x1e, 0xba, 0xd2, 0x7a, 0x32, 0xe1, 0xc6, 0x43, 0xc9, 0x47,
+- 0xdb, 0x43, 0xb4, 0x8d, 0xc3, 0xf6, 0x45, 0x39, 0xe5, 0xc7, 0xa3, 0x0e,
+- 0xc8, 0x45, 0xe5, 0xfe, 0x2c, 0xcf, 0x78, 0x57, 0x73, 0x23, 0xef, 0xa4,
+- 0xb9, 0xd6, 0x68, 0x6f, 0x6a, 0xdc, 0xa8, 0xed, 0x9d, 0x74, 0x8b, 0x14,
+- 0x7b, 0x3c, 0xef, 0xc2, 0xc9, 0xb7, 0xa2, 0x26, 0xce, 0xd5, 0x7f, 0xd4,
+- 0x60, 0x01, 0x00, 0x4c, 0xdb, 0x9f, 0xc0, 0x91, 0xba, 0x4d, 0x7b, 0x4b,
+- 0xfb, 0x48, 0xb9, 0xe1, 0xb8, 0xce, 0xff, 0xb4, 0xbd, 0x4b, 0xb0, 0xbd,
+- 0xb4, 0x97, 0x47, 0x24, 0xc7, 0x9c, 0x9c, 0xa5, 0xe7, 0x0b, 0x86, 0x4b,
+- 0xfb, 0xf7, 0x55, 0xf2, 0x32, 0x5f, 0x21, 0x87, 0xaa, 0xc3, 0x96, 0xb1,
+- 0xf6, 0x91, 0x36, 0x6d, 0x0e, 0xf6, 0x9c, 0xb9, 0x5a, 0x5c, 0xab, 0xb2,
+- 0x5f, 0x22, 0x15, 0xb7, 0xf0, 0xce, 0x3b, 0x3a, 0x55, 0x82, 0xfe, 0x51,
+- 0x9f, 0x20, 0xf7, 0x17, 0xe8, 0x5b, 0x0c, 0xa9, 0x8e, 0x64, 0x7f, 0xc0,
+- 0xb5, 0xf7, 0xbc, 0x33, 0x2e, 0xd4, 0xb0, 0xd3, 0xec, 0x01, 0xf2, 0x80,
+- 0x8f, 0x63, 0x5d, 0xa6, 0xdc, 0x9b, 0xb4, 0xdd, 0x7f, 0xb7, 0x9c, 0xe1,
+- 0xd4, 0xc5, 0x10, 0xf7, 0x36, 0xda, 0xeb, 0x61, 0xa9, 0x46, 0xf9, 0xfe,
+- 0x58, 0xaf, 0x10, 0xf7, 0xce, 0x7e, 0xeb, 0xd0, 0xbc, 0x06, 0x59, 0xac,
+- 0x01, 0xd7, 0x32, 0x58, 0x03, 0xfe, 0x9f, 0x80, 0xbc, 0xe8, 0x33, 0x10,
+- 0x87, 0xf1, 0x7f, 0xcb, 0x3c, 0x9b, 0x75, 0x99, 0xbb, 0x73, 0xe6, 0x7c,
+- 0x29, 0xd3, 0xd7, 0x25, 0xa7, 0xf2, 0x5d, 0x92, 0x5c, 0xe5, 0x75, 0x99,
+- 0xac, 0x2c, 0xc9, 0x03, 0xce, 0x38, 0xde, 0xf7, 0x86, 0x37, 0xeb, 0xa8,
+- 0xaf, 0x32, 0x3a, 0x83, 0x67, 0xcf, 0x8e, 0xf4, 0xc9, 0x9f, 0x5d, 0x47,
+- 0x16, 0xd7, 0x6c, 0xc9, 0xdb, 0x69, 0x79, 0x5e, 0x63, 0xf9, 0xf4, 0x4f,
+- 0x42, 0xe0, 0xa4, 0xcc, 0xc9, 0xb7, 0x89, 0xf4, 0x38, 0xb1, 0x6d, 0x21,
+- 0xa7, 0x6c, 0x81, 0xac, 0xe3, 0x86, 0x37, 0xdb, 0xe6, 0xfa, 0xb1, 0x17,
+- 0xc0, 0xdd, 0xdd, 0xb7, 0x7a, 0x83, 0xf8, 0xb0, 0xe1, 0xb7, 0x7f, 0xf0,
+- 0xf3, 0x62, 0x69, 0xa9, 0x30, 0x07, 0xa7, 0x38, 0xeb, 0x40, 0x97, 0x98,
+- 0xc3, 0x8f, 0x69, 0xdc, 0xa1, 0xa5, 0x4c, 0x8c, 0xba, 0x0a, 0x8c, 0x1a,
+- 0x25, 0x76, 0x8d, 0xaf, 0xb9, 0x8c, 0x0b, 0x44, 0xe5, 0xb7, 0x25, 0xe2,
+- 0x70, 0x5c, 0x7e, 0x53, 0x7a, 0x16, 0xf3, 0x49, 0x54, 0x19, 0xcf, 0xbc,
+- 0x5e, 0x29, 0x90, 0x27, 0x29, 0x9f, 0xcf, 0xba, 0x5f, 0x54, 0x3b, 0x10,
+- 0xb7, 0x8a, 0xdd, 0x2d, 0x8a, 0x37, 0x4f, 0x6b, 0x1e, 0x36, 0x6e, 0x0d,
+- 0xc8, 0xf5, 0x55, 0xbe, 0x6f, 0x0a, 0x63, 0x47, 0x43, 0xb9, 0x75, 0xda,
+- 0xa5, 0x64, 0x6c, 0xc6, 0x3a, 0x20, 0x17, 0xa2, 0x8c, 0x53, 0x8f, 0x11,
+- 0x9f, 0x61, 0x0b, 0x87, 0xed, 0x19, 0xd6, 0x38, 0xa9, 0xfd, 0x89, 0x35,
+- 0xe1, 0xec, 0xd3, 0x3e, 0xce, 0xf2, 0xda, 0x18, 0x64, 0x4a, 0x5b, 0x94,
+- 0xa8, 0x4c, 0x58, 0x49, 0xd8, 0x3c, 0xfc, 0xdf, 0xe0, 0xf8, 0x71, 0xf9,
+- 0xc2, 0xc6, 0x45, 0xf0, 0xef, 0x61, 0xfb, 0x1c, 0xed, 0xaa, 0x3d, 0x8a,
+- 0x7b, 0xf9, 0xfc, 0x0f, 0x34, 0x8d, 0xf5, 0x69, 0x7f, 0x2c, 0x5e, 0xc7,
+- 0x3e, 0x2f, 0x3b, 0x32, 0x5b, 0x62, 0x2e, 0xda, 0xcc, 0x75, 0xef, 0xbd,
+- 0x67, 0x77, 0x9e, 0xbb, 0xb0, 0x4c, 0x7e, 0x63, 0xea, 0xdc, 0x8a, 0xe0,
+- 0x42, 0x9f, 0xec, 0xe2, 0x33, 0xf9, 0xbc, 0xc3, 0x92, 0x7d, 0x04, 0xf8,
+- 0x52, 0xe6, 0xaf, 0xe0, 0xd7, 0xde, 0xc2, 0x5f, 0x89, 0xf6, 0xef, 0x63,
+- 0x9b, 0xee, 0xf3, 0xc7, 0xfb, 0x3d, 0x74, 0x28, 0xda, 0x70, 0x3f, 0x63,
+- 0x2a, 0x6c, 0xc7, 0xa5, 0xb0, 0xc1, 0xa3, 0xe7, 0x75, 0x39, 0xad, 0x72,
+- 0xce, 0xbe, 0xbd, 0x69, 0x8c, 0x13, 0x38, 0x67, 0x38, 0x41, 0xb8, 0x1c,
+- 0xf2, 0xb9, 0xc5, 0x9d, 0xe4, 0x4d, 0xfe, 0xff, 0x36, 0x8d, 0xc5, 0xc4,
+- 0xad, 0xfe, 0xa6, 0xf7, 0xb8, 0x73, 0xc7, 0x0e, 0xc7, 0x2d, 0x62, 0xe7,
+- 0x8f, 0x71, 0x8d, 0x3a, 0xe4, 0x29, 0x8f, 0x8f, 0x80, 0xe7, 0xe7, 0x80,
+- 0x05, 0x51, 0xe7, 0xb6, 0x18, 0x8b, 0x4d, 0xae, 0x2d, 0x9b, 0x7a, 0x54,
+- 0x72, 0xe0, 0x6b, 0xfb, 0xe6, 0x6a, 0x53, 0xd0, 0x65, 0x8c, 0x7f, 0x90,
+- 0xe3, 0x8f, 0xf8, 0xeb, 0x9c, 0x70, 0x0b, 0xd6, 0x87, 0x65, 0x66, 0xd5,
+- 0xe8, 0x5f, 0xd6, 0x81, 0xee, 0x1d, 0x46, 0x7b, 0x9d, 0x36, 0xe1, 0xfd,
+- 0xc6, 0x09, 0x6c, 0x43, 0x4a, 0x6d, 0xc3, 0xfc, 0x32, 0xf5, 0x93, 0x7a,
+- 0x19, 0xe8, 0x63, 0x80, 0x79, 0xd4, 0x51, 0xe2, 0x6c, 0x5a, 0x5e, 0x58,
+- 0xe6, 0xda, 0x64, 0x34, 0xa7, 0x35, 0xb4, 0x32, 0xab, 0xf5, 0x3d, 0x83,
+- 0xe5, 0xc4, 0x8b, 0x05, 0x19, 0x97, 0xab, 0x2e, 0xd7, 0x2c, 0x51, 0xcd,
+- 0x87, 0x3b, 0x1a, 0xde, 0xff, 0x9c, 0xbf, 0x66, 0x29, 0xd5, 0xab, 0xc1,
+- 0xf2, 0xe5, 0x1d, 0x79, 0xe7, 0xad, 0xc3, 0x4d, 0xeb, 0x14, 0x70, 0xb8,
+- 0xb8, 0x90, 0x3f, 0x44, 0xba, 0xd8, 0x87, 0xcf, 0x25, 0xe7, 0xe3, 0xb3,
+- 0x68, 0x5b, 0xef, 0x60, 0x3d, 0x83, 0xd0, 0x8f, 0x8b, 0x3c, 0x62, 0xb8,
+- 0x45, 0xde, 0x7a, 0x18, 0xeb, 0x76, 0x50, 0xeb, 0x28, 0xe7, 0xbf, 0xfb,
+- 0x1e, 0xfa, 0xe7, 0x7d, 0x7e, 0x9e, 0xc6, 0x78, 0x7c, 0x77, 0xee, 0xa9,
+- 0xd2, 0x49, 0xea, 0xe6, 0xa4, 0xe6, 0x03, 0xd9, 0x87, 0xfb, 0x96, 0x6b,
+- 0x44, 0x39, 0x5c, 0x8e, 0x19, 0x7b, 0x7a, 0xa2, 0x69, 0x3e, 0x49, 0x7f,
+- 0x3e, 0xc1, 0xf5, 0x16, 0x89, 0xf4, 0xa6, 0xb4, 0x96, 0x24, 0x59, 0xa6,
+- 0x8f, 0x02, 0x5b, 0x35, 0xcd, 0xb1, 0x6e, 0x8d, 0xbd, 0xf9, 0xff, 0x13,
+- 0x7b, 0xf3, 0x56, 0x49, 0xe7, 0xd8, 0xe2, 0xfc, 0x2f, 0x72, 0x6c, 0xac,
+- 0xa7, 0x37, 0x72, 0x7b, 0x6e, 0x99, 0xf6, 0x29, 0xa3, 0xb1, 0xe3, 0x3f,
+- 0x95, 0xb8, 0x96, 0x9c, 0xe3, 0x55, 0xce, 0x71, 0xbc, 0xae, 0xb5, 0x74,
+- 0x0f, 0xe9, 0x9e, 0x5d, 0x5c, 0x26, 0xa6, 0x74, 0xc8, 0x5a, 0x25, 0xc0,
+- 0x95, 0x07, 0x7c, 0x4e, 0x5b, 0xec, 0x6e, 0xc5, 0x3e, 0x39, 0xe3, 0x5a,
+- 0x5a, 0x47, 0x68, 0x3d, 0xcc, 0x73, 0x03, 0x52, 0x5b, 0xa5, 0x9d, 0x4d,
+- 0xc2, 0xaf, 0x88, 0x86, 0x6a, 0xeb, 0xcc, 0x45, 0xb2, 0x4e, 0x64, 0x5c,
+- 0x98, 0xbb, 0xcf, 0xd9, 0xf3, 0xd8, 0x5f, 0x31, 0xf8, 0xfd, 0xe4, 0xf0,
+- 0x8c, 0x8f, 0x35, 0xcb, 0x7b, 0x74, 0x87, 0x03, 0xee, 0x95, 0xf3, 0x2f,
+- 0xb0, 0xde, 0xd4, 0x6b, 0xc7, 0xbe, 0x0e, 0x3b, 0x99, 0x8b, 0xf2, 0xff,
+- 0x0c, 0xb8, 0x3f, 0x7d, 0x8d, 0xb8, 0xfa, 0x1a, 0xb5, 0x6a, 0x46, 0x96,
+- 0x54, 0xf7, 0x3b, 0xfc, 0x58, 0x52, 0x87, 0xea, 0x07, 0x75, 0x2c, 0xaf,
+- 0x9c, 0x7b, 0x54, 0x71, 0xaa, 0x58, 0x1a, 0x36, 0x75, 0x26, 0x76, 0xcc,
+- 0xaf, 0x27, 0x6f, 0x7c, 0x7e, 0xcc, 0x7f, 0xfe, 0x5f, 0x7c, 0xf9, 0xda,
+- 0x8a, 0x31, 0xba, 0xd6, 0x56, 0x52, 0x7d, 0xcb, 0xf9, 0x65, 0xea, 0x07,
+- 0xf5, 0x84, 0x38, 0x17, 0xdc, 0x17, 0xc8, 0x24, 0x68, 0xf3, 0x7e, 0xea,
+- 0x7c, 0x63, 0x4d, 0x41, 0xb0, 0x3f, 0x83, 0x73, 0x81, 0x8c, 0x78, 0xad,
+- 0xd1, 0x0e, 0x70, 0xaf, 0xc5, 0x21, 0xa7, 0xdd, 0xfd, 0xd6, 0x55, 0xde,
+- 0x95, 0x4d, 0xf6, 0x14, 0xe7, 0x7f, 0x99, 0x71, 0x5c, 0xec, 0xb1, 0xfd,
+- 0xe4, 0xf3, 0x65, 0x95, 0x4f, 0x1e, 0xf2, 0xe9, 0x52, 0xdc, 0xa7, 0x8f,
+- 0x77, 0xc9, 0xd7, 0xb9, 0x0e, 0xac, 0x19, 0xe3, 0xb2, 0xc0, 0xb7, 0xf3,
+- 0xc4, 0xf9, 0xbe, 0x3e, 0xe2, 0x0b, 0x63, 0x8a, 0x99, 0xe9, 0x43, 0xc0,
+- 0x30, 0xb6, 0x8f, 0x2b, 0x07, 0x31, 0x3e, 0x56, 0x5c, 0x63, 0x8b, 0x61,
+- 0x60, 0x72, 0xad, 0x04, 0x7e, 0xc6, 0xba, 0xaf, 0x3d, 0xf2, 0x7a, 0xca,
+- 0x5f, 0xaf, 0x89, 0x3e, 0xca, 0x87, 0xfb, 0x80, 0x58, 0xd9, 0x89, 0xf1,
+- 0xce, 0x46, 0x53, 0xd0, 0xb1, 0x71, 0x9c, 0x1f, 0x52, 0x1f, 0x22, 0x8c,
+- 0x7d, 0xbe, 0x5d, 0xea, 0xf5, 0xfd, 0x36, 0x07, 0x6d, 0xf8, 0xaa, 0xa5,
+- 0x2e, 0xfa, 0x11, 0x1a, 0x47, 0x6c, 0x2d, 0xc3, 0x67, 0x05, 0x76, 0xd7,
+- 0xd5, 0x06, 0x8d, 0xe0, 0xfa, 0x6d, 0xac, 0x89, 0xd3, 0xda, 0xe0, 0x6d,
+- 0x95, 0x19, 0x7d, 0xcd, 0x63, 0xba, 0xa6, 0xb5, 0x52, 0x22, 0xf6, 0xb8,
+- 0xf8, 0xe7, 0xa6, 0xf9, 0xdc, 0xc1, 0x86, 0x79, 0x4d, 0xca, 0xd9, 0x1d,
+- 0x1b, 0x41, 0xdf, 0x19, 0xbc, 0xbd, 0x62, 0x6c, 0x40, 0xb1, 0x9a, 0xd2,
+- 0xfa, 0xa5, 0xf0, 0xd8, 0x06, 0xd6, 0x92, 0x3c, 0xf4, 0x06, 0xb8, 0xf7,
+- 0x08, 0xd6, 0x90, 0x5c, 0xdb, 0x9b, 0x5b, 0x70, 0x33, 0xcc, 0x85, 0xc1,
+- 0x86, 0xcd, 0x49, 0x0e, 0xbe, 0x40, 0x2e, 0x7c, 0x98, 0x31, 0x64, 0xf0,
+- 0xc1, 0x82, 0x1f, 0x6f, 0x1c, 0x61, 0x9c, 0x54, 0x56, 0xd6, 0x39, 0x77,
+- 0xee, 0x6f, 0xe3, 0x6f, 0xd7, 0x4a, 0x9c, 0xaf, 0x89, 0x3d, 0xb0, 0x6d,
+- 0x95, 0x5d, 0x1c, 0xb9, 0x16, 0x69, 0x1c, 0xef, 0xc5, 0x9e, 0xe0, 0xbd,
+- 0x38, 0xae, 0xdf, 0x90, 0x5f, 0xad, 0x06, 0xf6, 0x3c, 0x24, 0x6f, 0x3a,
+- 0xde, 0xdc, 0xbc, 0xdb, 0xcd, 0x35, 0x70, 0x0b, 0xcc, 0x65, 0x3b, 0x8e,
+- 0x5b, 0x14, 0xcf, 0xab, 0xbb, 0xf5, 0x6e, 0x4b, 0x65, 0x49, 0x0c, 0xf8,
+- 0x1a, 0xd6, 0xf0, 0x8d, 0xbb, 0x2d, 0x31, 0xf2, 0xa3, 0x6c, 0xae, 0xfd,
+- 0x57, 0xfc, 0x0f, 0x30, 0x90, 0xfa, 0x48, 0xbd, 0xbc, 0x21, 0x53, 0x8a,
+- 0xf9, 0xfb, 0xf5, 0x6b, 0xc4, 0x89, 0x80, 0xd3, 0x12, 0xd3, 0xa9, 0x8b,
+- 0x31, 0xf5, 0x09, 0x8e, 0x95, 0x9b, 0x71, 0xe1, 0x33, 0x7e, 0x0e, 0x61,
+- 0x3f, 0xdd, 0x7b, 0xd4, 0xc7, 0x86, 0x31, 0xe5, 0xcb, 0x19, 0x9b, 0x18,
+- 0xc1, 0xf9, 0x1c, 0x94, 0xd9, 0x2b, 0x8d, 0x38, 0x4c, 0x5f, 0xcf, 0xe0,
+- 0x87, 0x7e, 0xe3, 0xa1, 0xfc, 0xd7, 0x92, 0xc1, 0x15, 0xf2, 0x25, 0x07,
+- 0x58, 0xda, 0x23, 0xf9, 0xe9, 0xb0, 0x24, 0x57, 0x7e, 0xd6, 0x67, 0xf8,
+- 0x2d, 0xf5, 0x0f, 0xfb, 0x4d, 0xcf, 0xb1, 0x5d, 0xc7, 0xf9, 0x23, 0xc2,
+- 0x67, 0x1b, 0x7d, 0xc6, 0x7e, 0x3e, 0x1f, 0x5c, 0xb3, 0x9b, 0x74, 0xf4,
+- 0x5e, 0x5f, 0x47, 0x79, 0xdd, 0x32, 0xb9, 0x0e, 0xdc, 0x3b, 0xb8, 0xc2,
+- 0x39, 0x9a, 0x7e, 0x83, 0x2b, 0xc6, 0x47, 0xdf, 0xdb, 0x6f, 0x64, 0xa7,
+- 0x1f, 0xae, 0x83, 0xef, 0x9a, 0xb1, 0xa7, 0x46, 0xc1, 0xe3, 0x46, 0x58,
+- 0x83, 0x44, 0x9b, 0x3d, 0xe4, 0x4e, 0x09, 0xf5, 0x3d, 0xe1, 0xeb, 0x1c,
+- 0xf1, 0xa6, 0xcb, 0xc7, 0x9b, 0x5d, 0x1b, 0x93, 0x33, 0x35, 0x27, 0x8c,
+- 0x83, 0x34, 0xd8, 0x18, 0xe9, 0xff, 0x4f, 0x1b, 0x73, 0xc4, 0x1f, 0x27,
+- 0xb8, 0x16, 0xe0, 0x4a, 0xd0, 0x0e, 0x70, 0xa5, 0x99, 0xc7, 0x06, 0xb2,
+- 0x6f, 0x3c, 0xdf, 0xe8, 0xe7, 0x65, 0x7c, 0x7f, 0xde, 0xd2, 0xfd, 0xf3,
+- 0xca, 0x8e, 0x1f, 0x4f, 0x19, 0x27, 0xa0, 0x7a, 0x25, 0xec, 0xed, 0xf7,
+- 0xd4, 0x6f, 0x5e, 0xbc, 0x32, 0xa1, 0xb1, 0x9c, 0x9a, 0xca, 0xfa, 0xab,
+- 0x58, 0x9f, 0x33, 0xd8, 0x47, 0x0f, 0x46, 0x77, 0xeb, 0x86, 0x56, 0x9f,
+- 0xc9, 0xfa, 0xbc, 0x25, 0x23, 0x5d, 0x98, 0x5f, 0x5a, 0xeb, 0xb0, 0xda,
+- 0x9d, 0xaf, 0xc8, 0x03, 0x66, 0xee, 0x6d, 0x6d, 0x63, 0xeb, 0xcf, 0xb4,
+- 0x7d, 0x2b, 0xd0, 0x73, 0xea, 0xcf, 0xea, 0x33, 0xb3, 0x15, 0x6f, 0x3c,
+- 0x72, 0x72, 0xd8, 0x2e, 0x0a, 0x6b, 0xbd, 0xc7, 0xe5, 0x09, 0x97, 0xd7,
+- 0x7f, 0x88, 0xeb, 0xd3, 0xf4, 0x21, 0x13, 0x11, 0xfd, 0xfe, 0x20, 0x11,
+- 0x7b, 0x0c, 0x7b, 0x6f, 0x46, 0xbf, 0xf7, 0x38, 0xa4, 0x35, 0xe2, 0x35,
+- 0x21, 0x97, 0x62, 0x8d, 0xc1, 0xb3, 0xf2, 0xb8, 0x3b, 0xe4, 0xd6, 0xc5,
+- 0x70, 0xdc, 0x19, 0xcd, 0xf7, 0x1c, 0x90, 0xc7, 0xdc, 0x48, 0x5b, 0x76,
+- 0xcb, 0xe8, 0xfc, 0x44, 0x38, 0xd3, 0xbe, 0xe0, 0x44, 0xdb, 0xa6, 0xb6,
+- 0xb0, 0xa7, 0xb7, 0x80, 0xf7, 0x5b, 0xb1, 0x50, 0x6e, 0x83, 0xef, 0x1e,
+- 0x36, 0x35, 0x1d, 0xea, 0x5f, 0x11, 0x43, 0xee, 0x93, 0x6d, 0xfb, 0xb8,
+- 0x6c, 0xa7, 0xf8, 0x4d, 0xd6, 0x29, 0xb4, 0x07, 0x35, 0xe7, 0xb2, 0x0d,
+- 0xbc, 0xd9, 0x4e, 0xb5, 0xa9, 0x0e, 0xaa, 0x1f, 0x06, 0x9c, 0xda, 0xb6,
+- 0x89, 0x4f, 0x77, 0xf0, 0x88, 0x77, 0x9e, 0x83, 0x1c, 0x58, 0xef, 0x71,
+- 0x02, 0x6d, 0xe2, 0x9a, 0xdd, 0x74, 0xbe, 0x1f, 0xed, 0xbb, 0x31, 0x46,
+- 0xab, 0xbe, 0xa3, 0xe5, 0x9c, 0x34, 0x79, 0xcc, 0x3d, 0xf7, 0x74, 0x36,
+- 0xb5, 0x3f, 0x77, 0xd4, 0x7c, 0x6f, 0xf4, 0x3d, 0xca, 0xb8, 0x90, 0x91,
+- 0xbf, 0xc5, 0xf6, 0xb6, 0x97, 0xfb, 0xf6, 0xb6, 0x0f, 0x4b, 0x7b, 0x0f,
+- 0x45, 0xd1, 0xdd, 0x74, 0x5f, 0xa0, 0x43, 0x41, 0xfb, 0x28, 0x71, 0x85,
+- 0x76, 0x4b, 0x7d, 0xa6, 0xed, 0x28, 0x9f, 0xb5, 0xd8, 0xd4, 0x87, 0xff,
+- 0xd9, 0x87, 0x7d, 0x19, 0xbf, 0xfb, 0xbe, 0xd1, 0x33, 0x8b, 0xbe, 0x3f,
+- 0xe3, 0x17, 0xd4, 0xd3, 0xfd, 0xfc, 0xa9, 0x84, 0x7e, 0x1f, 0xb4, 0xbf,
+- 0xae, 0x05, 0x38, 0x12, 0xf3, 0x63, 0x0a, 0x26, 0xef, 0x64, 0xe2, 0xbe,
+- 0x94, 0x9d, 0xe6, 0x9d, 0x62, 0xd7, 0x21, 0xe7, 0x0b, 0x90, 0xf3, 0x64,
+- 0x98, 0xbe, 0x1f, 0xf3, 0x4b, 0x8e, 0xe4, 0xb6, 0x28, 0x6f, 0xda, 0x75,
+- 0xea, 0x26, 0x78, 0xc4, 0x16, 0x31, 0xc5, 0x02, 0x07, 0xca, 0x60, 0x8e,
+- 0xaf, 0xe1, 0xbc, 0xe5, 0xd7, 0x6f, 0xa4, 0x61, 0xd3, 0x5c, 0xfc, 0x28,
+- 0x77, 0xf8, 0xf4, 0x6b, 0x94, 0x31, 0xeb, 0xd9, 0x18, 0x0b, 0xe0, 0xfc,
+- 0x98, 0x63, 0x77, 0xa1, 0xd3, 0x13, 0xd0, 0xdd, 0x88, 0x38, 0xe5, 0x13,
+- 0x52, 0x98, 0x9e, 0x50, 0xfb, 0x3f, 0x08, 0xfb, 0x34, 0xef, 0x66, 0x65,
+- 0xe1, 0xe5, 0x3b, 0xb1, 0x4f, 0xe9, 0xe7, 0x6b, 0x0c, 0xc3, 0x6b, 0x51,
+- 0x9d, 0x26, 0xe7, 0x60, 0xdc, 0xcd, 0xe4, 0x92, 0xfd, 0xef, 0xaa, 0xfa,
+- 0xe5, 0x70, 0x56, 0x2a, 0x57, 0x6c, 0xad, 0x85, 0xc9, 0xc8, 0x7b, 0x1e,
+- 0x65, 0x38, 0x73, 0x3e, 0x0e, 0x9c, 0x22, 0x77, 0xff, 0x60, 0xd4, 0xac,
+- 0xe9, 0x5f, 0xfb, 0xe9, 0x03, 0x27, 0xcb, 0x8d, 0x63, 0x68, 0xfd, 0x0c,
+- 0xae, 0x3d, 0x74, 0xd4, 0xec, 0x1f, 0xfa, 0xc3, 0x37, 0xbd, 0x4c, 0x94,
+- 0xcf, 0xe4, 0xbd, 0xcc, 0xd1, 0x52, 0x57, 0x38, 0xb7, 0x77, 0x7d, 0xbd,
+- 0xfe, 0x28, 0xc6, 0x8b, 0xcb, 0xe0, 0xe6, 0x84, 0xfa, 0xf1, 0xf3, 0x7b,
+- 0x7c, 0x56, 0x13, 0x1f, 0x30, 0x7e, 0xeb, 0x1b, 0xf2, 0xd8, 0x06, 0xe5,
+- 0x44, 0xfb, 0x1e, 0x92, 0x1f, 0x39, 0xc3, 0xf6, 0x93, 0x5a, 0x77, 0x9c,
+- 0xc8, 0x30, 0x1f, 0x73, 0xd0, 0x49, 0xda, 0x6b, 0x12, 0x19, 0xfd, 0x98,
+- 0xf0, 0x9b, 0x16, 0xd6, 0x7a, 0x0c, 0xbb, 0x4f, 0x4a, 0x50, 0xef, 0x31,
+- 0x94, 0x39, 0x10, 0xfa, 0xa7, 0xf7, 0xc6, 0x79, 0xde, 0x63, 0xea, 0x3d,
+- 0x24, 0x44, 0xb9, 0xfd, 0xf1, 0x0e, 0x7e, 0xe3, 0xb9, 0x37, 0xde, 0x77,
+- 0xff, 0xd3, 0xe7, 0xd2, 0x89, 0x25, 0xfa, 0xac, 0x2d, 0xce, 0xbf, 0xfa,
+- 0xcd, 0xbb, 0x16, 0x0a, 0x9d, 0xa2, 0xf9, 0xb2, 0x4b, 0xef, 0x38, 0xac,
+- 0x7b, 0x48, 0xc4, 0x0e, 0x58, 0x8c, 0x7b, 0x13, 0xdf, 0x98, 0x43, 0x61,
+- 0x8c, 0x0d, 0x6d, 0x70, 0x86, 0x97, 0x46, 0x2c, 0xb9, 0x3f, 0x92, 0x89,
+- 0x5b, 0x72, 0x2c, 0xbe, 0x22, 0x78, 0x26, 0xf3, 0x29, 0x1b, 0x89, 0x02,
+- 0xef, 0x8f, 0x94, 0x39, 0x5e, 0x5c, 0xfd, 0x93, 0xe4, 0x31, 0xcf, 0xbb,
+- 0xe4, 0x4a, 0x28, 0x79, 0xd7, 0xdb, 0x1e, 0x73, 0xde, 0xd6, 0xe6, 0xfb,
+- 0xd5, 0x23, 0x10, 0x37, 0x16, 0x9e, 0x32, 0xb5, 0x87, 0x4b, 0x97, 0x06,
+- 0x37, 0xf4, 0x9b, 0xb9, 0x69, 0xd3, 0x2e, 0xa1, 0xdd, 0xea, 0xd7, 0x41,
+- 0x55, 0x2e, 0x0d, 0x56, 0x8f, 0xdc, 0x6e, 0xfc, 0x6d, 0xf2, 0xab, 0xc0,
+- 0x87, 0x89, 0xef, 0xa9, 0x0b, 0x3b, 0xbb, 0x7c, 0x26, 0x74, 0x66, 0xd9,
+- 0x5a, 0x6d, 0x63, 0x0e, 0xec, 0x94, 0x27, 0xdd, 0x27, 0x83, 0x38, 0x15,
+- 0xe3, 0x5a, 0x22, 0x9d, 0x9b, 0x13, 0x26, 0xe7, 0xb1, 0x69, 0x29, 0x17,
+- 0xea, 0x7a, 0x89, 0xb1, 0xaa, 0xa8, 0x62, 0x43, 0xf7, 0x26, 0xeb, 0xc1,
+- 0x7a, 0x64, 0x46, 0x31, 0xa3, 0x47, 0xf1, 0xc0, 0xe8, 0x5d, 0x97, 0xc6,
+- 0x61, 0xc9, 0x97, 0xae, 0x2d, 0xbb, 0x03, 0xac, 0xe1, 0x79, 0x75, 0xf9,
+- 0x09, 0xb4, 0x89, 0x33, 0xf7, 0x34, 0x9d, 0x6f, 0xcc, 0xc9, 0x26, 0xec,
+- 0x41, 0xab, 0x39, 0x1f, 0xcb, 0x73, 0xcd, 0x79, 0xd8, 0x57, 0x25, 0xdf,
+- 0xcb, 0xdc, 0x6b, 0x10, 0x6f, 0x77, 0xfd, 0x78, 0xfb, 0x87, 0x06, 0xa8,
+- 0x83, 0xf0, 0x6f, 0xf2, 0x91, 0xb1, 0xb6, 0x91, 0xf9, 0x52, 0xf8, 0x1f,
+- 0xbb, 0xb1, 0x53, 0xb4, 0x37, 0x76, 0xf2, 0xe3, 0xb8, 0xf6, 0x25, 0x70,
+- 0x92, 0x22, 0xf8, 0x45, 0xc1, 0xaf, 0xc3, 0xe7, 0xf5, 0x9d, 0xfe, 0xb7,
+- 0x98, 0xd3, 0x41, 0xcd, 0xad, 0x0f, 0xee, 0xc9, 0xad, 0xdf, 0x35, 0xc0,
+- 0xda, 0xe3, 0xe2, 0xd6, 0x6e, 0xdf, 0x88, 0xdf, 0x77, 0xe2, 0x96, 0xef,
+- 0x63, 0xf6, 0x4c, 0x51, 0xf7, 0xcc, 0x65, 0x8d, 0x11, 0xcf, 0x6f, 0x2d,
+- 0xc9, 0x8c, 0xd3, 0x25, 0xb9, 0xd5, 0xc0, 0x4e, 0x78, 0xe3, 0xb3, 0x6e,
+- 0xa1, 0x2f, 0x2c, 0xec, 0xcf, 0xe7, 0x29, 0x47, 0x8b, 0xe5, 0xc2, 0x1c,
+- 0xff, 0x90, 0x44, 0xc6, 0x68, 0x3b, 0x68, 0x13, 0x3e, 0x05, 0x2c, 0x03,
+- 0x4f, 0xdf, 0x6a, 0xcc, 0x7d, 0xbf, 0x9f, 0x1c, 0x29, 0xc3, 0xe0, 0x9d,
+- 0x0b, 0x5e, 0x2b, 0xf6, 0xdf, 0x31, 0xd6, 0xb4, 0xec, 0xcc, 0x95, 0x36,
+- 0x4b, 0x6d, 0x93, 0xbe, 0xc7, 0x94, 0xff, 0x1e, 0x61, 0xcc, 0x67, 0xb6,
+- 0x14, 0xdc, 0x33, 0x27, 0xc7, 0x4f, 0x25, 0x62, 0x49, 0x4b, 0xe7, 0xa5,
+- 0xf6, 0x2b, 0xeb, 0xce, 0xc1, 0x2e, 0xd1, 0x86, 0x29, 0xae, 0x81, 0xab,
+- 0x12, 0xd7, 0x68, 0x9f, 0xd4, 0xa6, 0xc5, 0x8b, 0x98, 0x67, 0x6e, 0x4b,
+- 0xf3, 0x0f, 0xb1, 0xd3, 0xe1, 0x44, 0x65, 0x46, 0xb1, 0x0e, 0x7c, 0x55,
+- 0xe7, 0x0e, 0x7b, 0x1c, 0x6a, 0xcc, 0x2d, 0xd1, 0xbf, 0x64, 0x1e, 0xa6,
+- 0x43, 0xb2, 0x15, 0x91, 0x57, 0xa0, 0xdf, 0x57, 0xd7, 0xb9, 0xe7, 0xc2,
+- 0xbd, 0xc6, 0x47, 0xac, 0xdf, 0x63, 0x49, 0xaf, 0xe6, 0x6b, 0x8b, 0x58,
+- 0x2f, 0xf0, 0xab, 0xf1, 0xf0, 0x29, 0xf8, 0x09, 0x5a, 0x27, 0xc1, 0x18,
+- 0xeb, 0x2c, 0x7c, 0xca, 0xc6, 0xb8, 0x10, 0x30, 0x62, 0x9a, 0xe7, 0x67,
+- 0xc0, 0x8b, 0x77, 0x73, 0x35, 0xc5, 0xea, 0x82, 0xc6, 0x63, 0x6b, 0xeb,
+- 0x1d, 0x6a, 0x2f, 0x6a, 0xd5, 0x3e, 0xac, 0x8b, 0x1c, 0xb7, 0xc6, 0x8a,
+- 0xfe, 0xf9, 0x16, 0xa9, 0x56, 0xd9, 0x96, 0x81, 0x56, 0xd5, 0x97, 0x20,
+- 0x1f, 0x65, 0xcb, 0x1a, 0xb8, 0x6e, 0x75, 0xc3, 0xc1, 0x2f, 0x85, 0xdf,
+- 0x08, 0x7e, 0x0f, 0x4a, 0xb6, 0x4c, 0xfe, 0xcd, 0xfc, 0x53, 0x47, 0xd3,
+- 0xf3, 0x5b, 0xf4, 0xfb, 0x11, 0xd6, 0xb4, 0x15, 0x7d, 0x3f, 0xad, 0x58,
+- 0xdd, 0x8f, 0x9b, 0x32, 0xbe, 0x9b, 0xf2, 0xb1, 0xee, 0xa7, 0x7e, 0x6d,
+- 0xed, 0xbf, 0x01, 0x17, 0x24, 0x5e, 0x9d, 0xe0, 0x70, 0x00, 0x00, 0x00 };
++ 0xec, 0x5b, 0x5f, 0x6c, 0x5b, 0xd7, 0x79, 0xff, 0xee, 0x21, 0x25, 0x51,
++ 0xb2, 0xfe, 0x5c, 0xc9, 0x8c, 0x43, 0x27, 0x4a, 0x43, 0x4a, 0x57, 0x12,
++ 0x13, 0x69, 0xe9, 0x95, 0xc6, 0x26, 0x2a, 0x46, 0x34, 0x2c, 0x29, 0xdb,
++ 0x4a, 0xe3, 0x07, 0xc5, 0xf5, 0xda, 0xac, 0xeb, 0x30, 0x81, 0xb2, 0xb1,
++ 0xec, 0x61, 0x83, 0x67, 0xac, 0x41, 0xb6, 0xb9, 0x30, 0x41, 0x29, 0x8e,
++ 0x92, 0xd2, 0x22, 0x67, 0x2b, 0x73, 0xb1, 0x65, 0x80, 0x42, 0x49, 0x76,
++ 0xb6, 0xd1, 0x62, 0xda, 0xbd, 0x74, 0x45, 0x1c, 0x0b, 0x8a, 0xe7, 0xe5,
++ 0xa1, 0x0f, 0x69, 0x17, 0x60, 0xed, 0xd0, 0x61, 0x86, 0xe2, 0xda, 0x79,
++ 0x28, 0xb6, 0x6c, 0x40, 0x96, 0x6c, 0x71, 0x73, 0xf7, 0xfb, 0x9d, 0x7b,
++ 0xaf, 0x4c, 0x2b, 0x1a, 0x9a, 0x87, 0x3d, 0xde, 0x03, 0x08, 0xe7, 0x9e,
++ 0x73, 0xbe, 0xf3, 0x9d, 0xef, 0xfb, 0xce, 0xf7, 0xf7, 0xd0, 0xfe, 0xc3,
++ 0x76, 0x69, 0x13, 0xaf, 0x75, 0xe0, 0x2f, 0x75, 0xec, 0x99, 0xe3, 0x63,
++ 0x0f, 0xa5, 0x1e, 0xe2, 0x38, 0xa4, 0xc2, 0x61, 0xf6, 0x86, 0x04, 0x2d,
++ 0x68, 0x41, 0x0b, 0x5a, 0xd0, 0x82, 0x16, 0xb4, 0xa0, 0x05, 0x2d, 0x68,
++ 0x41, 0x0b, 0x5a, 0xd0, 0x82, 0x16, 0xb4, 0xa0, 0x05, 0x2d, 0x68, 0x41,
++ 0x0b, 0x5a, 0xd0, 0x82, 0x16, 0xb4, 0xa0, 0x05, 0x2d, 0x68, 0x41, 0x0b,
++ 0x5a, 0xd0, 0x82, 0x16, 0xb4, 0xa0, 0x05, 0x2d, 0x68, 0x41, 0x0b, 0x5a,
++ 0xd0, 0x82, 0x16, 0xb4, 0xa0, 0x05, 0x2d, 0x68, 0x41, 0x0b, 0x5a, 0xd0,
++ 0x82, 0x16, 0xb4, 0xa0, 0x05, 0xed, 0xff, 0xb3, 0x85, 0x44, 0x4c, 0xf6,
++ 0x1d, 0xde, 0x9f, 0x44, 0x54, 0x3a, 0x7e, 0x3c, 0x6b, 0x49, 0x24, 0x94,
++ 0xbe, 0xf2, 0xf4, 0x8c, 0x25, 0x92, 0xa9, 0x0d, 0xc7, 0x73, 0xf2, 0x0b,
++ 0xa7, 0x10, 0x0d, 0x0b, 0xe7, 0xef, 0x4b, 0xdf, 0x3a, 0x79, 0xe9, 0x91,
++ 0xc4, 0x7b, 0x4b, 0x21, 0x89, 0x98, 0xe9, 0xb7, 0x46, 0xcd, 0x41, 0x89,
++ 0xf4, 0x62, 0xcf, 0x4b, 0x43, 0x97, 0xbb, 0xa4, 0xd3, 0xc7, 0x25, 0x52,
++ 0x2d, 0x25, 0xec, 0xfd, 0x32, 0x6c, 0x6e, 0x48, 0x58, 0x32, 0x38, 0xe3,
++ 0x7c, 0x4d, 0xa4, 0x58, 0x32, 0x88, 0x43, 0x8a, 0xb5, 0x88, 0x5c, 0x0b,
++ 0x11, 0xea, 0x7b, 0x46, 0xb6, 0xfc, 0xb1, 0x93, 0x09, 0xe3, 0x5c, 0x0b,
++ 0xdf, 0x75, 0x7f, 0x3e, 0x22, 0x2a, 0x9d, 0x48, 0x66, 0x43, 0x93, 0x52,
++ 0x5d, 0x74, 0x9c, 0x39, 0xfb, 0x5e, 0xe0, 0xe8, 0x91, 0x39, 0xcb, 0x1d,
++ 0x67, 0xed, 0x07, 0xcd, 0x09, 0xb9, 0x1b, 0x73, 0x21, 0x51, 0xd6, 0x3d,
++ 0xf8, 0x8b, 0x1b, 0xb9, 0xb3, 0xdf, 0x32, 0xb2, 0xcb, 0xed, 0x52, 0x2c,
++ 0x3b, 0x32, 0x63, 0x4b, 0x26, 0x6b, 0xb7, 0x62, 0xfd, 0x63, 0x67, 0x66,
++ 0x6b, 0xcf, 0xb0, 0x99, 0x93, 0x26, 0xc9, 0x44, 0x63, 0x80, 0x59, 0x34,
++ 0x72, 0x17, 0xfe, 0xae, 0x5d, 0xda, 0x40, 0x4f, 0x8a, 0xe3, 0x8f, 0x9d,
++ 0x90, 0x65, 0x61, 0x9d, 0xe7, 0x63, 0x5c, 0x27, 0x5e, 0x7e, 0x13, 0xe7,
++ 0x35, 0xe7, 0xd2, 0x50, 0x4c, 0xbe, 0x5b, 0x8f, 0xca, 0x77, 0xea, 0xa6,
++ 0xbc, 0x5a, 0xef, 0x95, 0xcb, 0x75, 0xc7, 0xf9, 0x8e, 0xed, 0x38, 0x6f,
++ 0xe1, 0xef, 0x3f, 0xed, 0x2d, 0x1e, 0xd0, 0x0a, 0xc6, 0x44, 0xfd, 0x2f,
++ 0xda, 0xa5, 0x33, 0x11, 0x17, 0xd5, 0x2e, 0xb3, 0xe5, 0x98, 0xcc, 0x95,
++ 0x4b, 0xc6, 0x13, 0x17, 0x16, 0x8c, 0xa9, 0x0b, 0x15, 0x9c, 0x19, 0xc6,
++ 0x9c, 0x14, 0x8a, 0xf6, 0x2b, 0x46, 0xae, 0x3e, 0x6f, 0x1c, 0xba, 0xd0,
++ 0x09, 0x1a, 0x79, 0xfe, 0x1e, 0x23, 0x7b, 0xf6, 0x96, 0x64, 0x6d, 0xca,
++ 0x38, 0x61, 0x7e, 0x0d, 0x62, 0xcf, 0x96, 0x48, 0x73, 0xb3, 0x47, 0xaf,
++ 0xe3, 0xa8, 0xb4, 0x73, 0x32, 0x9b, 0xb2, 0xcc, 0xa2, 0x90, 0x3e, 0x3d,
++ 0x77, 0xd9, 0xa5, 0xf9, 0xbc, 0x91, 0xbd, 0xd0, 0x6e, 0xe4, 0xce, 0x85,
++ 0x41, 0x87, 0xf4, 0x86, 0x84, 0xfb, 0x06, 0x62, 0x79, 0xa9, 0xe1, 0x0c,
++ 0x31, 0x55, 0x9a, 0x72, 0x05, 0xcd, 0xa0, 0xe5, 0xbb, 0x65, 0xf0, 0x50,
++ 0x06, 0x0f, 0x65, 0xf2, 0x16, 0x97, 0x4b, 0x43, 0x3e, 0x6f, 0x8e, 0xf3,
++ 0x23, 0x9b, 0xb4, 0x27, 0xe2, 0x19, 0xe5, 0xf3, 0xe9, 0x38, 0xff, 0x61,
++ 0x93, 0x57, 0xf2, 0xe3, 0x38, 0xaf, 0xda, 0x31, 0xd0, 0xee, 0x5c, 0x56,
++ 0x56, 0x09, 0xbc, 0x58, 0xc0, 0x4f, 0x59, 0x2f, 0x80, 0x87, 0x79, 0xf0,
++ 0x77, 0x1e, 0xbc, 0x55, 0x40, 0xc7, 0x2f, 0x3b, 0xaf, 0x60, 0xe4, 0x86,
++ 0xb6, 0xe4, 0x15, 0xa7, 0x8c, 0xf3, 0x2b, 0x0a, 0xb2, 0xde, 0x25, 0xf9,
++ 0x25, 0x53, 0xa6, 0x57, 0xfc, 0xfd, 0xbe, 0x1e, 0x1c, 0x93, 0x83, 0xe5,
++ 0x1e, 0xc8, 0x86, 0xb2, 0x4c, 0xd8, 0x22, 0x0e, 0x64, 0x54, 0x4c, 0x2a,
++ 0x11, 0x23, 0x6f, 0x9f, 0xd4, 0xf7, 0xbf, 0x62, 0x49, 0x26, 0x6f, 0x53,
++ 0x8e, 0x12, 0xcf, 0xdb, 0x85, 0x58, 0x18, 0xfa, 0xb6, 0x62, 0x15, 0xcc,
++ 0xb0, 0x50, 0x8e, 0x89, 0xd8, 0x1f, 0x43, 0x96, 0x47, 0x4b, 0x92, 0xf9,
++ 0x52, 0xc9, 0x97, 0xb1, 0x2b, 0xdf, 0xc7, 0x4b, 0x5f, 0xec, 0x90, 0x36,
++ 0xf5, 0x99, 0x26, 0xf9, 0x3d, 0xec, 0x25, 0xee, 0x3b, 0xf6, 0x62, 0x9f,
++ 0x0b, 0xe7, 0xee, 0x4d, 0x3c, 0x29, 0x42, 0xd8, 0x62, 0x7f, 0x93, 0xb6,
++ 0x11, 0x31, 0xb2, 0x56, 0x21, 0x16, 0x02, 0x5c, 0x5e, 0x8a, 0xa3, 0xde,
++ 0x5c, 0x53, 0xd6, 0xba, 0x15, 0x9a, 0xb3, 0x13, 0xf1, 0xa2, 0xdc, 0x0a,
++ 0x5d, 0xb5, 0xf5, 0x5c, 0x6b, 0xd6, 0x72, 0x64, 0x15, 0xd8, 0x9f, 0x83,
++ 0x3d, 0x6c, 0x80, 0xa3, 0xdf, 0x2d, 0xe9, 0xf9, 0x0e, 0xec, 0x4f, 0x36,
++ 0x01, 0x67, 0x9b, 0x24, 0x92, 0x55, 0xcc, 0x5f, 0x75, 0xe7, 0xbb, 0x5d,
++ 0xbc, 0xc5, 0xfe, 0x36, 0x8d, 0x5b, 0xe4, 0x15, 0x77, 0xfe, 0x2e, 0x17,
++ 0x77, 0xf1, 0x01, 0xcc, 0x03, 0xff, 0xe0, 0xe4, 0x90, 0xa1, 0xe7, 0xf7,
++ 0xd2, 0x9e, 0x7e, 0xa7, 0x74, 0x2b, 0xb4, 0x6a, 0x3b, 0x92, 0x1b, 0x1d,
++ 0x9c, 0x1c, 0x34, 0x5c, 0x7c, 0xa7, 0xdc, 0x7d, 0xf7, 0xb9, 0xf8, 0x06,
++ 0x27, 0x93, 0x86, 0x8b, 0x6f, 0xa5, 0xa4, 0xf7, 0x4a, 0xbe, 0x44, 0xd8,
++ 0xc1, 0x49, 0xcb, 0xb8, 0x4f, 0xa6, 0xbb, 0x07, 0x27, 0xfb, 0x0c, 0xf5,
++ 0x99, 0x5d, 0x2e, 0x1f, 0x09, 0x9f, 0x86, 0x5d, 0x9a, 0x06, 0x9e, 0xab,
++ 0xe7, 0x07, 0xb2, 0x56, 0xf1, 0x81, 0x5d, 0xfa, 0x7c, 0x9e, 0xa9, 0xe7,
++ 0x1e, 0x20, 0x5d, 0x3c, 0x7b, 0x66, 0xf4, 0x8e, 0x73, 0x7f, 0xe5, 0xb6,
++ 0x7c, 0x76, 0x3a, 0x93, 0xe7, 0x49, 0x24, 0x9c, 0x0e, 0x8f, 0xce, 0x95,
++ 0x8e, 0x49, 0xb6, 0x1c, 0x97, 0xd9, 0x91, 0x56, 0x99, 0x36, 0xfb, 0xa7,
++ 0x0f, 0x0a, 0x7d, 0x4f, 0x64, 0x74, 0xc6, 0xbb, 0xc3, 0x9c, 0x18, 0x32,
++ 0x0b, 0x1e, 0x0f, 0xd6, 0x24, 0x62, 0x00, 0xbe, 0xbf, 0x16, 0x96, 0xe7,
++ 0xeb, 0x86, 0x34, 0x6b, 0xfb, 0x4c, 0x98, 0xeb, 0xd0, 0xc3, 0x67, 0xcb,
++ 0xd4, 0x63, 0xea, 0xac, 0x64, 0xaa, 0x5a, 0x67, 0x7d, 0x7b, 0x6d, 0xe3,
++ 0xdd, 0x16, 0x0a, 0x02, 0x73, 0x4c, 0x5b, 0x66, 0x55, 0x5a, 0x24, 0x33,
++ 0x25, 0x85, 0xaa, 0xbd, 0x65, 0x3f, 0xb1, 0x65, 0xd9, 0x80, 0x1e, 0x88,
++ 0x99, 0x4d, 0x71, 0x9e, 0xf0, 0x0d, 0xb0, 0xa6, 0x6b, 0x7b, 0x21, 0xd8,
++ 0xde, 0x4c, 0x8a, 0xb0, 0x52, 0xd0, 0xfe, 0xa2, 0x0e, 0x7d, 0xac, 0xdf,
++ 0xd7, 0xe1, 0xfa, 0xbb, 0x08, 0x6c, 0xb4, 0x1d, 0x76, 0xfe, 0x19, 0xd8,
++ 0x60, 0xaf, 0x91, 0x3d, 0xe7, 0x38, 0xf0, 0x3f, 0x51, 0x25, 0xb4, 0x41,
++ 0xd8, 0x7b, 0x9d, 0x6b, 0xed, 0x98, 0x17, 0x73, 0xd6, 0xee, 0x06, 0x8f,
++ 0x8e, 0x33, 0x69, 0xc7, 0xa5, 0x68, 0x77, 0x61, 0x5f, 0x93, 0xf4, 0x58,
++ 0xd4, 0x79, 0xda, 0xf5, 0x2e, 0x9c, 0x67, 0x70, 0xdc, 0x89, 0xf3, 0x3a,
++ 0x30, 0x17, 0x9b, 0xa5, 0x2d, 0xa7, 0xe8, 0xb7, 0x5c, 0x1f, 0x2a, 0x72,
++ 0x1d, 0xb4, 0x72, 0x8f, 0x86, 0x8b, 0xb4, 0xa4, 0x53, 0x72, 0xb3, 0xb4,
++ 0x57, 0xae, 0x45, 0x29, 0x03, 0xe0, 0x2c, 0xc3, 0x27, 0x46, 0x0d, 0xd0,
++ 0x4f, 0xba, 0xe9, 0x03, 0x77, 0x7b, 0x63, 0xe3, 0x7e, 0xf7, 0x0c, 0x31,
++ 0x43, 0xe9, 0x4e, 0xc9, 0xe9, 0x39, 0x51, 0x6a, 0x74, 0x97, 0xb7, 0xde,
++ 0x69, 0xec, 0x3f, 0xa7, 0xe4, 0xc0, 0xc3, 0xf0, 0x5b, 0x38, 0xeb, 0xaa,
++ 0xe5, 0x38, 0x57, 0xed, 0xf7, 0x61, 0xf7, 0x4a, 0x9a, 0xac, 0x6b, 0x9d,
++ 0xd2, 0x46, 0x7b, 0x36, 0x1a, 0x64, 0x18, 0x93, 0x53, 0x65, 0xee, 0x29,
++ 0x48, 0xd8, 0x22, 0x0c, 0xe1, 0xff, 0x05, 0x70, 0x21, 0x69, 0x81, 0x3d,
++ 0x6e, 0xd8, 0x51, 0xd2, 0xdb, 0xe5, 0xc2, 0x77, 0xe3, 0x0c, 0xd2, 0x4e,
++ 0xfb, 0x73, 0xb4, 0xfd, 0x65, 0x43, 0x2a, 0x33, 0xb1, 0x08, 0x6b, 0x1a,
++ 0xa1, 0xbc, 0xb3, 0xdd, 0x70, 0xff, 0x32, 0x3b, 0x54, 0x30, 0x95, 0xbe,
++ 0x6f, 0x91, 0x5c, 0xe9, 0x7e, 0x99, 0xb3, 0x71, 0x9e, 0x15, 0x06, 0xcd,
++ 0xf4, 0x35, 0x03, 0x85, 0x90, 0x82, 0x95, 0xf5, 0x50, 0x56, 0x3e, 0xad,
++ 0xff, 0x8c, 0xf3, 0x0a, 0x46, 0xd8, 0xe2, 0x19, 0xbf, 0xe5, 0xc9, 0x87,
++ 0xba, 0x67, 0x4b, 0xb6, 0xd4, 0xce, 0x31, 0xe8, 0x68, 0xd3, 0x74, 0x84,
++ 0xd2, 0xfa, 0xee, 0x0c, 0x95, 0xf6, 0x63, 0x00, 0x41, 0xef, 0xc0, 0x03,
++ 0x3e, 0xb8, 0xd7, 0xc2, 0xde, 0x08, 0x68, 0xec, 0x68, 0xa0, 0xbf, 0x8d,
++ 0xf0, 0x90, 0x55, 0xc4, 0x3b, 0x43, 0xf3, 0x6d, 0xb8, 0x7c, 0xfb, 0xb2,
++ 0x7a, 0x1d, 0xb2, 0xfa, 0xc8, 0x39, 0x30, 0x46, 0x1c, 0x29, 0xe0, 0x80,
++ 0xdc, 0x4d, 0xfa, 0x2c, 0xfa, 0x29, 0x73, 0x0b, 0x17, 0x6c, 0x41, 0x85,
++ 0xd2, 0xed, 0x92, 0x33, 0x75, 0x1c, 0x00, 0xec, 0xb8, 0x68, 0x3f, 0x6f,
++ 0x91, 0x47, 0x6f, 0x6c, 0x25, 0xb4, 0xde, 0xe4, 0x2b, 0x8c, 0x05, 0x45,
++ 0xd0, 0xb6, 0x9e, 0x50, 0x9a, 0xb5, 0x76, 0xc8, 0x5c, 0x22, 0x4d, 0xe9,
++ 0xb7, 0x64, 0xb5, 0xa4, 0xf6, 0x34, 0x4b, 0x97, 0x4c, 0x41, 0x46, 0xd5,
++ 0x71, 0xc4, 0xb0, 0x91, 0x76, 0x09, 0x3d, 0xc4, 0x58, 0x10, 0x03, 0xad,
++ 0xeb, 0x09, 0x53, 0x6e, 0x39, 0x6a, 0x10, 0xfb, 0x47, 0x70, 0x0f, 0x87,
++ 0x79, 0xa7, 0xca, 0x83, 0x23, 0x4c, 0x88, 0x32, 0xef, 0x69, 0x16, 0xe2,
++ 0xe6, 0xda, 0x70, 0xcc, 0x14, 0xce, 0x23, 0x5e, 0x4e, 0x71, 0x2f, 0xf9,
++ 0x73, 0xf7, 0x7c, 0x92, 0x3f, 0x7f, 0x9d, 0x32, 0xa3, 0xec, 0xa0, 0x63,
++ 0xa0, 0xa9, 0x1b, 0x72, 0x1b, 0x5d, 0x80, 0x4f, 0xb4, 0x1f, 0xd7, 0x3a,
++ 0xdc, 0x37, 0x76, 0xaf, 0x5c, 0x83, 0xdd, 0xc5, 0x95, 0x18, 0x55, 0x7b,
++ 0xaf, 0x9e, 0x53, 0x96, 0x2f, 0x4f, 0xca, 0x60, 0xf7, 0x36, 0x19, 0x10,
++ 0xe7, 0xce, 0x72, 0x38, 0x52, 0x21, 0x0d, 0x2e, 0x2d, 0x73, 0xd6, 0x7a,
++ 0x22, 0x2c, 0x8d, 0xf4, 0x7c, 0xec, 0x28, 0xcb, 0x2a, 0xf4, 0x29, 0xe2,
++ 0x6f, 0x16, 0xb5, 0x27, 0x2c, 0x4f, 0x8c, 0x19, 0x12, 0x3f, 0xa4, 0xe4,
++ 0xd0, 0xc3, 0xc4, 0xf9, 0x13, 0xf2, 0x38, 0x9e, 0xe1, 0xfa, 0x18, 0x75,
++ 0x21, 0x8c, 0x5e, 0xf3, 0x87, 0xb9, 0x46, 0x5d, 0x7f, 0xdd, 0xd3, 0xf5,
++ 0x8f, 0x9c, 0x43, 0x63, 0x61, 0x0f, 0x36, 0xd2, 0x00, 0x2b, 0xb8, 0xef,
++ 0x9d, 0x60, 0x09, 0xd3, 0xa8, 0x17, 0x84, 0x2d, 0xec, 0x00, 0x8b, 0xe0,
++ 0xf4, 0x15, 0xda, 0x50, 0xb7, 0xe7, 0x33, 0x7c, 0x9b, 0xe2, 0x39, 0xec,
++ 0x77, 0xb2, 0x3f, 0xee, 0xe3, 0x7e, 0xc2, 0x6f, 0x8f, 0xa7, 0xb8, 0x06,
++ 0xd9, 0x31, 0xa6, 0xa2, 0x4d, 0xe2, 0x5b, 0xc1, 0xff, 0x34, 0xc6, 0x56,
++ 0xce, 0x99, 0x18, 0x4f, 0xa0, 0xb7, 0x24, 0x5f, 0xa3, 0x1d, 0x71, 0x3f,
++ 0x63, 0xed, 0xbb, 0x9e, 0xef, 0x6c, 0x9f, 0x0e, 0xa7, 0xa3, 0xf0, 0x9d,
++ 0x32, 0x55, 0x2c, 0x9d, 0x44, 0x3e, 0x24, 0x85, 0x7b, 0xd2, 0xd4, 0x8b,
++ 0xf6, 0x71, 0xf8, 0xc6, 0xa9, 0x62, 0x8d, 0x39, 0x11, 0xdc, 0x17, 0xf6,
++ 0x21, 0x3e, 0x47, 0xd4, 0x42, 0xa4, 0x70, 0x6f, 0x9a, 0x3e, 0x39, 0x2e,
++ 0xf1, 0xda, 0x7b, 0xc8, 0x39, 0x4c, 0xc9, 0x6a, 0x1d, 0xfb, 0xf6, 0x5e,
++ 0xd2, 0x5c, 0x44, 0xfe, 0x10, 0x4e, 0x4b, 0x58, 0xa5, 0x9b, 0x23, 0xb3,
++ 0xa9, 0x76, 0xe4, 0x59, 0x93, 0x7b, 0xd5, 0xda, 0xc1, 0xbd, 0xa1, 0xb5,
++ 0x3d, 0xd3, 0x4d, 0xe9, 0xc2, 0x5e, 0xb5, 0x20, 0xb2, 0x5c, 0x12, 0x85,
++ 0x9c, 0x26, 0x76, 0x44, 0x30, 0x5e, 0xfb, 0xf2, 0x97, 0x55, 0x3a, 0x24,
++ 0xf9, 0xa8, 0x9c, 0x58, 0x49, 0x85, 0x99, 0x3f, 0xc6, 0xa7, 0xe4, 0x04,
++ 0x72, 0xc6, 0x67, 0x64, 0xb6, 0x04, 0xba, 0x34, 0xdf, 0x31, 0xf0, 0xdb,
++ 0x0b, 0xdc, 0xa4, 0x3d, 0x0a, 0xdf, 0xea, 0xd2, 0x0e, 0x9a, 0x33, 0x39,
++ 0xe6, 0x48, 0x29, 0xc6, 0x94, 0xf7, 0xa0, 0x27, 0xb4, 0x93, 0x9f, 0xcb,
++ 0xaa, 0xd5, 0x2a, 0x79, 0xd7, 0x2f, 0x68, 0x3d, 0x0d, 0xa7, 0xdf, 0xf5,
++ 0xd6, 0xae, 0x63, 0x8d, 0xfa, 0xba, 0xab, 0xe1, 0xee, 0xbe, 0xa5, 0xf3,
++ 0x9c, 0xab, 0x36, 0xbf, 0x09, 0xfb, 0x83, 0x51, 0x17, 0xf6, 0xcd, 0xd1,
++ 0x55, 0xeb, 0x2b, 0x5d, 0xd2, 0x86, 0x73, 0xca, 0x3c, 0x27, 0x4a, 0xdf,
++ 0x8a, 0xf5, 0x6b, 0x1e, 0xae, 0x9f, 0x02, 0x57, 0x3b, 0xe9, 0x46, 0x0b,
++ 0x63, 0x1d, 0xf4, 0x21, 0xdf, 0xc9, 0x6f, 0xf9, 0x18, 0xc2, 0xbe, 0xe6,
++ 0xe1, 0xfa, 0x5e, 0x03, 0x2e, 0xae, 0xb1, 0xe7, 0x99, 0x38, 0xbb, 0x8d,
++ 0xbc, 0x91, 0x1f, 0xde, 0x01, 0xef, 0x23, 0x69, 0x4c, 0xc1, 0xa7, 0x4f,
++ 0xd5, 0x75, 0x5e, 0x67, 0xe4, 0xca, 0xc8, 0xb7, 0xea, 0x2f, 0x82, 0x46,
++ 0xe4, 0x61, 0xf5, 0x01, 0x2f, 0xd7, 0xa6, 0xad, 0xac, 0x6b, 0x9f, 0x45,
++ 0x7f, 0x53, 0xd4, 0xf6, 0x74, 0x05, 0x63, 0x9d, 0x67, 0xe3, 0x6e, 0xae,
++ 0x48, 0x5f, 0xad, 0xdc, 0xe5, 0xfe, 0xbf, 0x6d, 0x53, 0x42, 0xfa, 0x3e,
++ 0x19, 0xd7, 0xa8, 0x67, 0x77, 0xc3, 0x9f, 0x3b, 0x1f, 0x30, 0xbe, 0x4c,
++ 0x31, 0xf6, 0x4c, 0x31, 0x66, 0x18, 0x9e, 0x1f, 0x8c, 0x37, 0xe0, 0x88,
++ 0x03, 0xc7, 0x79, 0x4f, 0x6f, 0x4f, 0x7b, 0xb8, 0xfc, 0xdc, 0xd3, 0xf7,
++ 0xa5, 0x2f, 0xdd, 0x73, 0xe7, 0xba, 0x61, 0xba, 0xe3, 0x66, 0xed, 0x87,
++ 0x61, 0xf7, 0xa0, 0x3f, 0x3e, 0xad, 0xa0, 0x5f, 0xb9, 0x9a, 0x7b, 0x1f,
++ 0xb0, 0x71, 0xe8, 0x1e, 0x3f, 0xfd, 0xbb, 0x75, 0x73, 0x6f, 0x57, 0x06,
++ 0xbc, 0xd3, 0x0c, 0xf9, 0xce, 0x84, 0x49, 0x4b, 0x7d, 0x12, 0xfb, 0xe5,
++ 0x18, 0x63, 0x62, 0x1e, 0x7c, 0x1c, 0x31, 0x87, 0xcd, 0x59, 0xe2, 0x8e,
++ 0x0a, 0x70, 0x22, 0x8f, 0x4c, 0xb7, 0x78, 0xf7, 0xfc, 0x7d, 0x9e, 0x0f,
++ 0xdc, 0xbb, 0x38, 0x46, 0xff, 0x7d, 0x8f, 0x9e, 0x1b, 0x9d, 0x2e, 0x3d,
++ 0xfe, 0xfa, 0x80, 0x79, 0xe7, 0x78, 0x75, 0xaf, 0x27, 0x4f, 0x7c, 0x3f,
++ 0xe3, 0xd1, 0xc5, 0xbb, 0x69, 0xa4, 0x89, 0xf7, 0xf2, 0x5f, 0xc0, 0xa3,
++ 0xf3, 0x8c, 0x82, 0x4a, 0x23, 0x6f, 0x49, 0x31, 0x56, 0xc1, 0xe6, 0xc5,
++ 0xc2, 0x9d, 0x24, 0xec, 0x69, 0xec, 0x7a, 0xb7, 0xc4, 0x7b, 0xbe, 0x05,
++ 0x1f, 0xcd, 0x7b, 0xff, 0x50, 0xe6, 0x4a, 0xfd, 0x76, 0xb3, 0x41, 0x7b,
++ 0x4d, 0x24, 0xcf, 0xcb, 0xb0, 0x7d, 0x5e, 0xe7, 0x4f, 0x89, 0xf8, 0x29,
++ 0xa1, 0x6c, 0x6f, 0xc9, 0x80, 0xce, 0x6b, 0x3e, 0x14, 0x0b, 0x72, 0x99,
++ 0x2a, 0xc3, 0xc6, 0xc6, 0xfe, 0xcd, 0xd1, 0xf9, 0x28, 0xf2, 0xa5, 0x1b,
++ 0x3b, 0xe0, 0x7a, 0x53, 0xe3, 0x21, 0xbe, 0x46, 0x5c, 0x86, 0xb4, 0x8c,
++ 0xf9, 0xf8, 0x2c, 0x99, 0xaf, 0xfb, 0x38, 0xc3, 0xf0, 0xc3, 0xf0, 0x01,
++ 0x63, 0xbf, 0xe1, 0xe9, 0x0b, 0xbf, 0x7f, 0xe8, 0x30, 0x07, 0x52, 0xe9,
++ 0x3f, 0xf7, 0xe6, 0xae, 0x50, 0x06, 0x18, 0xfb, 0x72, 0x7f, 0xd1, 0xf3,
++ 0x39, 0x05, 0x23, 0x53, 0xa7, 0x0c, 0xa8, 0x2b, 0xb8, 0x7f, 0xad, 0x9f,
++ 0xb0, 0x99, 0xf2, 0x17, 0x10, 0x1f, 0xbb, 0xdd, 0xbc, 0x01, 0xb5, 0x55,
++ 0xa6, 0xce, 0xb9, 0xf5, 0x96, 0xac, 0xdd, 0xe4, 0xd9, 0xd2, 0x41, 0xcc,
++ 0x4d, 0xe1, 0x8f, 0xb2, 0x23, 0xcc, 0x61, 0x7c, 0x67, 0x3c, 0x38, 0x19,
++ 0xcf, 0x22, 0x66, 0x65, 0x0e, 0x4f, 0x60, 0x6c, 0x78, 0x35, 0x96, 0x96,
++ 0x7b, 0x05, 0x39, 0x0a, 0xe4, 0x39, 0x00, 0x7e, 0xe2, 0x32, 0x51, 0xc7,
++ 0x9d, 0x6f, 0xf9, 0xb3, 0x2d, 0x98, 0xc2, 0x6d, 0x18, 0xd7, 0xf7, 0x4d,
++ 0xd4, 0x7f, 0xec, 0xd0, 0x1f, 0xfc, 0xad, 0xb6, 0x97, 0x78, 0x43, 0xde,
++ 0x97, 0x31, 0x9e, 0x28, 0x4f, 0x1a, 0x87, 0xca, 0xdc, 0xa3, 0x5e, 0xea,
++ 0x11, 0x2b, 0x9e, 0x55, 0xc8, 0x51, 0xc7, 0x3a, 0x71, 0xe6, 0x29, 0xe8,
++ 0x46, 0xc1, 0x98, 0x1a, 0xea, 0x92, 0x7c, 0xb2, 0x07, 0x34, 0x3f, 0x82,
++ 0x1e, 0xb1, 0xc3, 0xfa, 0x35, 0xcc, 0x43, 0x8f, 0x92, 0xb4, 0x8f, 0x56,
++ 0x5d, 0x57, 0x4e, 0xeb, 0xb8, 0x35, 0xe0, 0xe9, 0xd6, 0x3f, 0x99, 0xae,
++ 0x2e, 0x3d, 0x8d, 0xf1, 0x2e, 0xcc, 0xff, 0x26, 0x7a, 0xc4, 0xac, 0x31,
++ 0x7f, 0x9e, 0x36, 0x38, 0x8e, 0xf9, 0xcf, 0x01, 0xc7, 0x9f, 0xe0, 0xfb,
++ 0x7e, 0x7c, 0xff, 0xd1, 0xb6, 0xbd, 0xdf, 0xe0, 0xd9, 0x98, 0xcf, 0x6e,
++ 0x9b, 0xf7, 0xfd, 0xb7, 0x8e, 0x93, 0xd2, 0xbd, 0x06, 0xc6, 0xd7, 0x22,
++ 0xb2, 0xfb, 0x7c, 0x9b, 0xa8, 0xaa, 0xeb, 0xc3, 0x55, 0xd5, 0x94, 0x9e,
++ 0xf3, 0xf4, 0xdf, 0x3f, 0xc2, 0x1e, 0x4b, 0xd4, 0x1a, 0x2e, 0x8d, 0x77,
++ 0xab, 0x6d, 0xf4, 0x99, 0xe3, 0x7d, 0x4b, 0xec, 0x0b, 0xc7, 0x47, 0x6b,
++ 0x84, 0xe1, 0xf7, 0x89, 0xe3, 0x7d, 0xb5, 0x9f, 0x00, 0x16, 0x72, 0x29,
++ 0xfb, 0xf8, 0x09, 0xff, 0xda, 0xb6, 0x33, 0xb5, 0x6c, 0x71, 0x26, 0xed,
++ 0xfe, 0x99, 0xe3, 0xd9, 0x0a, 0xf3, 0x83, 0x44, 0x4c, 0x74, 0x1e, 0x5e,
++ 0x38, 0x3e, 0x53, 0x0a, 0x4b, 0x48, 0xd3, 0xe2, 0xaf, 0x73, 0x8d, 0xf7,
++ 0xb0, 0x13, 0x6d, 0xa4, 0xab, 0x11, 0x0f, 0xe3, 0x0c, 0xf1, 0x9c, 0x00,
++ 0x9e, 0x24, 0xf0, 0x30, 0xde, 0xb8, 0xf4, 0xc6, 0x97, 0x76, 0xa2, 0x8d,
++ 0xb8, 0x78, 0x96, 0x8f, 0xaf, 0x47, 0xd4, 0xf9, 0xb7, 0x49, 0xaf, 0xc9,
++ 0x9c, 0xd6, 0xf5, 0x35, 0x4d, 0x92, 0x3f, 0x8b, 0xdc, 0xc6, 0x1e, 0xf3,
++ 0xc6, 0x77, 0x9b, 0xac, 0xb7, 0xe3, 0x8a, 0xf3, 0xec, 0xb1, 0x96, 0x8a,
++ 0x63, 0x0e, 0xe3, 0x65, 0x1f, 0x56, 0x79, 0xb0, 0x1d, 0x0d, 0x7c, 0x37,
++ 0x79, 0xb2, 0xe6, 0x99, 0x7e, 0xdd, 0xd9, 0x48, 0x0b, 0x40, 0x71, 0x0f,
++ 0xdd, 0x5b, 0xf7, 0xe0, 0xf3, 0x89, 0x85, 0x35, 0xd2, 0x96, 0x04, 0xaf,
++ 0x3e, 0x6d, 0x9f, 0xf6, 0xfe, 0xb8, 0x37, 0x89, 0x3f, 0xff, 0x3c, 0x5f,
++ 0x06, 0xa4, 0x8b, 0x3d, 0x74, 0xf9, 0x13, 0x75, 0x73, 0x12, 0x76, 0xc7,
++ 0x37, 0x10, 0xc7, 0x59, 0xb5, 0x29, 0xfb, 0x16, 0xdc, 0xbb, 0xf6, 0xb1,
++ 0xa8, 0x21, 0x14, 0x73, 0xb9, 0x38, 0xeb, 0xd5, 0xa3, 0xb2, 0x09, 0x5c,
++ 0x19, 0xd4, 0x94, 0x6e, 0x5d, 0x34, 0x0d, 0xff, 0xb8, 0x0e, 0xfd, 0xbc,
++ 0x6a, 0xf1, 0x2d, 0x26, 0xcc, 0x78, 0x27, 0xc5, 0xda, 0xcf, 0x01, 0xc3,
++ 0x3c, 0xea, 0xf6, 0x3b, 0xcb, 0x12, 0x60, 0x96, 0xb1, 0x76, 0xca, 0xf5,
++ 0xcb, 0xf4, 0xed, 0xc8, 0xa9, 0x50, 0xc3, 0x58, 0xff, 0xe3, 0xe4, 0xa3,
++ 0x8d, 0xb0, 0x3b, 0xbd, 0x83, 0x20, 0xe6, 0x2c, 0x26, 0xe6, 0x97, 0xe0,
++ 0xc3, 0x2b, 0x96, 0xda, 0xad, 0xb4, 0x46, 0x26, 0x2a, 0xf0, 0x49, 0xa8,
++ 0x78, 0x13, 0xf1, 0x25, 0x79, 0x5f, 0xdf, 0x43, 0x93, 0x35, 0x6c, 0xf6,
++ 0xa8, 0xaf, 0x52, 0xaf, 0x34, 0xe5, 0xa1, 0x33, 0x88, 0xcb, 0x23, 0x4f,
++ 0x20, 0xe6, 0x40, 0x5e, 0x67, 0x0a, 0xa8, 0xe2, 0xa9, 0x23, 0x3f, 0xf8,
++ 0x83, 0x19, 0xcb, 0xcd, 0xff, 0x75, 0x3c, 0x13, 0x97, 0xc7, 0xd0, 0x99,
++ 0x76, 0xed, 0x67, 0xf2, 0xda, 0xdf, 0xf4, 0x9b, 0x53, 0xaa, 0x0d, 0x39,
++ 0x06, 0x12, 0x4f, 0x64, 0x38, 0xe6, 0xa0, 0x48, 0x1f, 0xf3, 0x4e, 0xf8,
++ 0xe1, 0xbe, 0x35, 0x78, 0xb7, 0x33, 0x84, 0x57, 0x12, 0x3e, 0x13, 0x92,
++ 0xa6, 0x33, 0x7c, 0x0b, 0x91, 0x3d, 0xa8, 0xc3, 0x88, 0xb3, 0x2f, 0x8c,
++ 0x7e, 0x02, 0x7f, 0xfb, 0x90, 0x5f, 0x99, 0xc8, 0x8d, 0x77, 0x80, 0x07,
++ 0x2c, 0xf7, 0xec, 0x04, 0xdf, 0xd5, 0x2d, 0x6d, 0x11, 0xec, 0x21, 0x3c,
++ 0xf2, 0x43, 0x6b, 0x0f, 0xe8, 0x71, 0xcf, 0x27, 0x8e, 0xf0, 0x19, 0x91,
++ 0xfe, 0x05, 0xe9, 0x51, 0x7a, 0x4f, 0x58, 0x66, 0x52, 0x5c, 0x6b, 0x07,
++ 0x3c, 0xf7, 0x61, 0x4d, 0xef, 0x73, 0xdf, 0x94, 0xf2, 0xb7, 0xe9, 0xc6,
++ 0x9c, 0x81, 0x6f, 0xe4, 0x53, 0x29, 0x53, 0xfa, 0xab, 0x2e, 0x6c, 0xdf,
++ 0xda, 0x53, 0xdd, 0x7c, 0x97, 0x52, 0x96, 0x4b, 0x9b, 0x42, 0xee, 0x9b,
++ 0x87, 0x54, 0xc3, 0x83, 0x7c, 0x9b, 0x21, 0x0c, 0xeb, 0xd9, 0x2e, 0x0d,
++ 0x63, 0x0e, 0x52, 0x7e, 0xee, 0x9c, 0x52, 0xff, 0xd7, 0x9b, 0x4b, 0x63,
++ 0x4e, 0xa1, 0x6d, 0x05, 0xfb, 0xbf, 0xa9, 0x6d, 0x45, 0x54, 0xdc, 0xb3,
++ 0x15, 0x8c, 0x97, 0x39, 0xf6, 0x63, 0xf1, 0xf1, 0x7b, 0x5c, 0x7f, 0xef,
++ 0xc8, 0xac, 0xcd, 0xf7, 0x0b, 0x47, 0xae, 0xda, 0x05, 0xe3, 0xc0, 0x1d,
++ 0x79, 0x66, 0x52, 0xc7, 0xe7, 0x19, 0xc8, 0x7e, 0xb3, 0xa6, 0x6b, 0x35,
++ 0xb9, 0x56, 0x8b, 0xc8, 0x3b, 0x2b, 0x6d, 0xb2, 0xb9, 0xe4, 0xea, 0xfc,
++ 0xe6, 0x12, 0xf5, 0xdc, 0x94, 0x9f, 0xad, 0x58, 0x58, 0x4b, 0xe2, 0xaf,
++ 0x47, 0x6e, 0xac, 0xdc, 0x99, 0x77, 0x5e, 0xae, 0x3f, 0x0a, 0x5a, 0x7a,
++ 0x24, 0x64, 0x39, 0xba, 0xee, 0xca, 0x21, 0xf6, 0x15, 0x64, 0x42, 0xf2,
++ 0xe5, 0x7e, 0xd4, 0x7e, 0x08, 0xce, 0x61, 0xc6, 0x20, 0xdc, 0x7f, 0xf9,
++ 0xf3, 0xc8, 0x4d, 0x12, 0x30, 0x9e, 0x7e, 0xfd, 0xa6, 0xf8, 0xc5, 0x70,
++ 0x8f, 0x34, 0x5b, 0xdf, 0xec, 0x76, 0x63, 0x95, 0xe9, 0xd6, 0xa7, 0x96,
++ 0x1f, 0xaf, 0xdf, 0x04, 0xee, 0x11, 0xe8, 0x29, 0x75, 0xd3, 0x86, 0xce,
++ 0x9a, 0xb2, 0x3a, 0x94, 0xa8, 0x14, 0x84, 0xfe, 0x21, 0xc5, 0x7c, 0x11,
++ 0xfb, 0x92, 0x90, 0x47, 0xab, 0xce, 0x85, 0x32, 0x0a, 0x77, 0xbb, 0x30,
++ 0x27, 0xf9, 0xfa, 0xef, 0x63, 0x3e, 0x23, 0xd3, 0xf5, 0x71, 0x9c, 0x75,
++ 0x1a, 0x7a, 0xfb, 0x60, 0x8f, 0xb4, 0xf1, 0x9c, 0x14, 0x68, 0x7c, 0x44,
++ 0x66, 0xce, 0xce, 0xc9, 0x91, 0x32, 0xe9, 0xe4, 0x1b, 0x63, 0x22, 0x99,
++ 0x93, 0xe1, 0xf8, 0x0a, 0x72, 0x27, 0xd7, 0x1e, 0xd3, 0x32, 0x73, 0x0e,
++ 0x38, 0xca, 0xac, 0xff, 0xfb, 0xa1, 0x37, 0xc3, 0xba, 0x7e, 0x99, 0xd6,
++ 0x7e, 0x87, 0xf3, 0x6f, 0xe3, 0x9e, 0xfa, 0x0b, 0xfb, 0x00, 0x97, 0x47,
++ 0xad, 0x33, 0x85, 0x7c, 0x79, 0xb9, 0x8c, 0x3a, 0xcf, 0x0e, 0x31, 0xf7,
++ 0x52, 0xea, 0xa1, 0x5e, 0xa9, 0x96, 0x87, 0x4d, 0xa5, 0x98, 0x53, 0xf1,
++ 0x2e, 0xb8, 0x46, 0xfb, 0x8e, 0xa9, 0xb0, 0xd5, 0x2b, 0x2b, 0xe5, 0x02,
++ 0xea, 0x65, 0xe5, 0xbd, 0x67, 0x14, 0xc4, 0xb4, 0x5c, 0xbf, 0xa7, 0x6b,
++ 0x1b, 0xe6, 0x9f, 0xf5, 0x2f, 0x80, 0xc6, 0x0c, 0x2e, 0xf3, 0x24, 0xe8,
++ 0xc3, 0xf7, 0x32, 0x74, 0x7c, 0x81, 0x39, 0x5c, 0x06, 0x6b, 0x69, 0x39,
++ 0x76, 0x61, 0x0a, 0x34, 0x74, 0x4a, 0xff, 0x9f, 0xd1, 0xc6, 0x9e, 0xc4,
++ 0x1c, 0xc7, 0x09, 0xe8, 0xeb, 0xd7, 0xf1, 0x4d, 0xd8, 0x18, 0x7a, 0xca,
++ 0xa1, 0x17, 0xbd, 0x09, 0x5a, 0x58, 0x07, 0x43, 0xfe, 0x87, 0xe3, 0x52,
++ 0x3d, 0xfb, 0xb0, 0x4c, 0x2f, 0x3f, 0x0c, 0xfc, 0xff, 0x8a, 0xba, 0x00,
++ 0xf1, 0x6d, 0x99, 0x67, 0x31, 0xff, 0xe3, 0x39, 0x10, 0x10, 0x6d, 0x63,
++ 0x81, 0xf3, 0xec, 0x0f, 0x62, 0x3f, 0x6a, 0x8c, 0x72, 0x46, 0x66, 0xca,
++ 0x3c, 0x0b, 0x77, 0x87, 0x7c, 0x2a, 0x7f, 0x76, 0xca, 0xbb, 0xe3, 0x1e,
++ 0xc9, 0x45, 0x0b, 0xac, 0x2f, 0x10, 0x27, 0x96, 0x46, 0xb3, 0xa5, 0x84,
++ 0x99, 0x55, 0xc4, 0x95, 0x14, 0xc6, 0x06, 0x77, 0x2e, 0x22, 0xd6, 0x02,
++ 0x6a, 0xda, 0x34, 0xd7, 0x4e, 0x7a, 0x6f, 0x06, 0xc4, 0xf5, 0x63, 0x99,
++ 0x80, 0x8e, 0xf5, 0x2f, 0x8c, 0x20, 0x17, 0xfe, 0x29, 0x72, 0xc9, 0xb8,
++ 0x27, 0x83, 0x71, 0x4f, 0x37, 0xda, 0x1a, 0x74, 0x02, 0xf7, 0x5c, 0xc6,
++ 0xdd, 0x97, 0xa1, 0x07, 0xf0, 0xd5, 0xaf, 0x6e, 0xe9, 0xc7, 0x78, 0x43,
++ 0x8e, 0xd9, 0x21, 0xff, 0x50, 0x49, 0x24, 0xd7, 0xa1, 0x3f, 0x37, 0x50,
++ 0x0b, 0xac, 0xa3, 0x3e, 0xdc, 0xb4, 0x23, 0xa8, 0x4b, 0x0e, 0x83, 0x7e,
++ 0xe6, 0x94, 0x1c, 0xc7, 0x74, 0xae, 0xd3, 0x62, 0x3d, 0x7f, 0x8f, 0x7e,
++ 0xd7, 0x95, 0xaf, 0xf6, 0xb0, 0xa6, 0x64, 0x3d, 0xce, 0x37, 0xe9, 0x77,
++ 0x70, 0x8f, 0xeb, 0x26, 0xd7, 0xfd, 0x7d, 0xac, 0x05, 0x7c, 0xfd, 0x21,
++ 0x2d, 0xd4, 0x1f, 0xee, 0x21, 0x4c, 0x8f, 0xb6, 0x93, 0xbc, 0xc6, 0x47,
++ 0x9d, 0xfd, 0x9b, 0x6e, 0xd7, 0xce, 0x74, 0x9e, 0x65, 0x5e, 0x13, 0x5f,
++ 0x7f, 0x3f, 0x74, 0x58, 0xd7, 0x65, 0x87, 0xe0, 0xbb, 0xeb, 0x8e, 0xbc,
++ 0x60, 0xdf, 0x69, 0x77, 0xfb, 0xcb, 0xbe, 0x9c, 0x28, 0xc7, 0xc3, 0x72,
++ 0xaa, 0x9e, 0x80, 0x4d, 0x50, 0x86, 0x56, 0x83, 0x0c, 0x45, 0xfe, 0xaa,
++ 0x2c, 0xf2, 0x4a, 0x99, 0x6b, 0x5a, 0x86, 0xb1, 0x6c, 0xa8, 0x8d, 0xef,
++ 0xea, 0xd0, 0xcb, 0xb7, 0xe5, 0xc8, 0xa2, 0xc8, 0x05, 0xac, 0xaf, 0x96,
++ 0x69, 0xab, 0x23, 0xc8, 0x5f, 0x77, 0x49, 0x75, 0x09, 0x35, 0x59, 0x59,
++ 0xa6, 0xb3, 0x9f, 0x63, 0xbc, 0x89, 0xc8, 0xa6, 0x7e, 0x8f, 0x15, 0x19,
++ 0xbc, 0x18, 0x96, 0xf0, 0x45, 0x14, 0x7f, 0x90, 0xfd, 0xa5, 0x21, 0xff,
++ 0x7d, 0xd6, 0xb5, 0xf9, 0x62, 0x09, 0x7b, 0xcb, 0xfd, 0xda, 0x4f, 0x16,
++ 0x6b, 0x33, 0x92, 0xaf, 0xf0, 0x2c, 0xf4, 0x4b, 0x71, 0xac, 0xa5, 0x64,
++ 0xf6, 0xec, 0x88, 0x3c, 0x8b, 0x33, 0x50, 0xff, 0xe1, 0x8c, 0x09, 0x29,
++ 0x5c, 0xc0, 0x7c, 0xed, 0xba, 0x2c, 0xad, 0xcc, 0x48, 0xb5, 0x72, 0xb9,
++ 0xe1, 0xdd, 0x1d, 0xe3, 0xa5, 0xc6, 0x5a, 0xf6, 0x30, 0xeb, 0x19, 0xd4,
++ 0xaa, 0x16, 0xc6, 0x90, 0x59, 0x6d, 0x76, 0xfa, 0xce, 0xf7, 0xe2, 0xc6,
++ 0x1a, 0x76, 0x52, 0xe6, 0xcb, 0x29, 0x29, 0x9e, 0x1d, 0xd1, 0x6f, 0x0a,
++ 0x2d, 0xe9, 0xca, 0xd3, 0x37, 0x11, 0x2b, 0x26, 0xf5, 0x7b, 0xf1, 0x2d,
++ 0x79, 0xcc, 0x9e, 0x97, 0xa3, 0xd6, 0x41, 0x39, 0x85, 0xfc, 0xfa, 0x4b,
++ 0x76, 0xab, 0xc4, 0xbb, 0x79, 0x8f, 0xa0, 0xd7, 0x62, 0x0d, 0xea, 0xc8,
++ 0x84, 0xfd, 0xa0, 0xf9, 0x3c, 0x24, 0xfb, 0x4e, 0x8d, 0x71, 0xf2, 0xbf,
++ 0x9d, 0x0c, 0xe2, 0xde, 0x4d, 0xd4, 0x8e, 0x19, 0x0d, 0x67, 0xb8, 0x70,
++ 0x15, 0xc2, 0x0d, 0x9b, 0x2f, 0x10, 0x6e, 0xc9, 0xf0, 0xe0, 0x0c, 0xc0,
++ 0x85, 0x64, 0xc3, 0x0e, 0x43, 0x47, 0x26, 0xc1, 0x27, 0x7c, 0xfc, 0x68,
++ 0x87, 0x97, 0x07, 0xb7, 0x22, 0xb6, 0xde, 0xde, 0xff, 0x86, 0xb7, 0xff,
++ 0x59, 0x6f, 0xff, 0xd5, 0xad, 0xfd, 0x7e, 0x7c, 0xfd, 0x85, 0x23, 0x0d,
++ 0x74, 0xbd, 0x51, 0x72, 0xe1, 0xe7, 0x3d, 0xba, 0xae, 0x6e, 0xd1, 0xe5,
++ 0xc3, 0x43, 0x9e, 0x9a, 0x67, 0xfa, 0x66, 0xfa, 0xe8, 0x7e, 0xc8, 0xd1,
++ 0x91, 0x9c, 0x0d, 0xdb, 0x28, 0x27, 0xc6, 0x0b, 0xfa, 0x2d, 0x4d, 0xc9,
++ 0x7a, 0x74, 0x5e, 0x26, 0xad, 0xc4, 0xf8, 0xac, 0x84, 0xa0, 0xcb, 0xf4,
++ 0x2d, 0x21, 0xa9, 0xd2, 0xe7, 0xa0, 0xcf, 0xdb, 0x3b, 0xd3, 0xfa, 0x4e,
++ 0x03, 0xad, 0xa1, 0x97, 0x49, 0xa3, 0x4b, 0x6b, 0x64, 0xe0, 0x36, 0xad,
++ 0x2e, 0xbc, 0x4b, 0xeb, 0x3b, 0xa5, 0x06, 0xf8, 0x8b, 0x61, 0x0f, 0x3e,
++ 0xdc, 0x00, 0x4f, 0x7d, 0x66, 0x5e, 0x41, 0x7d, 0x26, 0x6d, 0x9f, 0x85,
++ 0x6d, 0x48, 0xa4, 0x35, 0x5d, 0x39, 0xfe, 0xc0, 0x80, 0x23, 0x11, 0xe4,
++ 0x1b, 0xcd, 0x58, 0xdb, 0xac, 0x30, 0x17, 0x51, 0x7d, 0xcd, 0x32, 0x08,
++ 0x9d, 0xe5, 0xdd, 0xb9, 0x6f, 0x82, 0x8f, 0xe9, 0x9c, 0xc0, 0x91, 0xa3,
++ 0x36, 0x69, 0x79, 0xdf, 0x79, 0x25, 0x3a, 0x68, 0x17, 0x65, 0xc8, 0x6c,
++ 0xc6, 0xf9, 0xd5, 0xba, 0xc6, 0x99, 0x24, 0x2d, 0xe7, 0x87, 0xfa, 0xcd,
++ 0xbf, 0x07, 0x9f, 0x13, 0x15, 0x43, 0xaa, 0x56, 0x22, 0x76, 0x09, 0x38,
++ 0xf6, 0xe1, 0x6e, 0xaa, 0x23, 0xa4, 0x47, 0xe4, 0x08, 0xf4, 0xbb, 0xaa,
++ 0xe3, 0x22, 0xf5, 0x38, 0x31, 0x59, 0x40, 0xae, 0xf3, 0xd7, 0x3a, 0xb6,
++ 0x39, 0xce, 0x4d, 0xc4, 0xb7, 0xc9, 0x6d, 0xba, 0xa7, 0x2e, 0xba, 0xba,
++ 0xa7, 0x2e, 0xa2, 0x06, 0x3e, 0x1d, 0x91, 0x96, 0x55, 0xd8, 0xcf, 0xcb,
++ 0x7b, 0xdc, 0x7c, 0xee, 0x65, 0xfe, 0xe6, 0x04, 0x7f, 0x77, 0x3a, 0x2c,
++ 0xd6, 0x69, 0x1d, 0x0f, 0x20, 0xef, 0x09, 0x99, 0x3d, 0x47, 0x9f, 0x6a,
++ 0xc9, 0xc0, 0x69, 0xde, 0x07, 0xf3, 0x9a, 0xa5, 0xd1, 0x19, 0xd8, 0xc8,
++ 0x1c, 0xfc, 0x82, 0x5a, 0x7d, 0x57, 0x66, 0x2c, 0xca, 0xa1, 0x53, 0xda,
++ 0x56, 0x51, 0x8f, 0xaf, 0xc2, 0x37, 0xac, 0xc6, 0xa4, 0x09, 0xb6, 0xa5,
++ 0x2e, 0x46, 0x8d, 0xe2, 0xe2, 0x07, 0xb0, 0x07, 0xfe, 0x7e, 0x83, 0xdc,
++ 0xf2, 0x62, 0xcc, 0xa0, 0x6d, 0xa9, 0x8b, 0xd4, 0x73, 0xa4, 0x53, 0x17,
++ 0xa9, 0xe7, 0xa4, 0xc3, 0xb7, 0x17, 0x7c, 0x5f, 0x1c, 0xd1, 0xef, 0xd3,
++ 0x37, 0x6d, 0xf2, 0xf2, 0x8f, 0x92, 0xad, 0x30, 0x47, 0x24, 0x3f, 0xd2,
++ 0x8d, 0x5c, 0xa6, 0x2b, 0x6b, 0x0f, 0x8c, 0x6f, 0xca, 0xa7, 0xe5, 0xeb,
++ 0xee, 0x4f, 0xc1, 0x17, 0xf9, 0x68, 0xe4, 0x8b, 0x3c, 0x75, 0x4a, 0x93,
++ 0xe6, 0xcb, 0xe7, 0x07, 0x82, 0x06, 0x3f, 0x7d, 0xa7, 0x63, 0xc0, 0xff,
++ 0x75, 0xf8, 0x80, 0x5e, 0xf4, 0x4f, 0xa2, 0x47, 0x48, 0xbb, 0x48, 0xde,
++ 0xc9, 0xeb, 0x0d, 0xe4, 0x8d, 0x3e, 0x9f, 0xd3, 0xf8, 0x7e, 0x5d, 0x66,
++ 0x17, 0x9d, 0x93, 0x88, 0xab, 0x7c, 0x3b, 0xef, 0x71, 0xdf, 0x81, 0xb7,
++ 0xf3, 0xfe, 0xba, 0xb8, 0xf2, 0x49, 0x98, 0x55, 0xc1, 0xf7, 0xca, 0x76,
++ 0x59, 0x34, 0xfa, 0x8e, 0x98, 0xce, 0xc3, 0x8f, 0xd4, 0xe8, 0x27, 0x28,
++ 0xa3, 0x1b, 0x92, 0x5d, 0xe4, 0xfb, 0x97, 0x8b, 0x6f, 0xba, 0xe6, 0xfb,
++ 0x8d, 0xc6, 0x3d, 0x36, 0xe0, 0x7a, 0x01, 0x47, 0xba, 0xd6, 0x29, 0x3f,
++ 0xf8, 0x9c, 0xbd, 0x0d, 0xbe, 0xa6, 0x71, 0xdf, 0xb8, 0x3c, 0x87, 0x3c,
++ 0xe0, 0x0d, 0xfb, 0x0e, 0xb9, 0x4e, 0x33, 0x17, 0xaa, 0xd6, 0xa6, 0x60,
++ 0x93, 0x4d, 0xf0, 0x65, 0xa6, 0x6c, 0x96, 0x9a, 0xa5, 0x8a, 0x7c, 0x67,
++ 0x79, 0x85, 0xbe, 0x90, 0xb4, 0xb7, 0x61, 0xde, 0xf5, 0x5f, 0xf4, 0xb5,
++ 0x9b, 0x25, 0xc4, 0x59, 0xd8, 0xf6, 0x66, 0x29, 0x8a, 0xbe, 0x17, 0xbd,
++ 0x85, 0x3e, 0x8e, 0x3e, 0x89, 0x7e, 0x04, 0xfd, 0x08, 0x7a, 0x0b, 0x7b,
++ 0x63, 0xe8, 0xfd, 0x9a, 0x81, 0xb8, 0x6e, 0xf3, 0x5d, 0xd4, 0xe7, 0x21,
++ 0x57, 0xb4, 0x18, 0xd3, 0xc2, 0x76, 0x0e, 0x75, 0x44, 0x76, 0x84, 0xb9,
++ 0x1e, 0x73, 0xbe, 0x8f, 0x1d, 0xd3, 0x62, 0x5d, 0x5e, 0x30, 0xf6, 0x0d,
++ 0x31, 0x2e, 0x54, 0x10, 0x17, 0x3e, 0xd8, 0x8d, 0xfa, 0xd1, 0xdc, 0xaf,
++ 0xdf, 0x8e, 0x16, 0x31, 0xe6, 0x37, 0x6a, 0xde, 0xe8, 0x1c, 0xe2, 0x14,
++ 0xfd, 0xa7, 0x83, 0x3d, 0x79, 0xf8, 0xf1, 0x2e, 0xd8, 0x5f, 0x06, 0x7e,
++ 0x1b, 0xdf, 0x4b, 0x6f, 0xec, 0x76, 0x63, 0x2a, 0xf2, 0x77, 0xb5, 0xfd,
++ 0xbd, 0xc6, 0xc6, 0x9e, 0x9d, 0x6a, 0x83, 0x0e, 0xe0, 0x48, 0x54, 0x96,
++ 0x60, 0x83, 0x3f, 0xb4, 0x4f, 0xea, 0xdc, 0x8e, 0x77, 0xf1, 0x2c, 0x72,
++ 0xd4, 0xdc, 0x02, 0x73, 0x98, 0x13, 0xa8, 0x4b, 0x50, 0x9f, 0x45, 0x59,
++ 0x93, 0x33, 0x16, 0xe8, 0x5c, 0x34, 0x2a, 0x6d, 0x8c, 0x03, 0x37, 0x70,
++ 0x1e, 0xf8, 0x5a, 0x76, 0x20, 0xb3, 0x03, 0xc8, 0x09, 0x1d, 0x27, 0x6c,
++ 0xed, 0x93, 0xf8, 0x21, 0xfa, 0x1c, 0xc1, 0x7e, 0x53, 0xdc, 0xf7, 0x74,
++ 0xf8, 0xdd, 0x29, 0xfd, 0x5b, 0x31, 0x94, 0xeb, 0xb3, 0xd8, 0x7b, 0x17,
++ 0x70, 0x71, 0x9e, 0x6f, 0xd9, 0x22, 0xfb, 0x16, 0xdc, 0x9c, 0x56, 0x59,
++ 0x8d, 0xf8, 0x7e, 0xd5, 0xc3, 0xc7, 0x75, 0xe5, 0xfd, 0xa6, 0xb1, 0xc7,
++ 0x7d, 0x1b, 0xc6, 0x1d, 0x9f, 0x42, 0xfe, 0xbc, 0x81, 0x7b, 0x79, 0x03,
++ 0x77, 0x72, 0xa5, 0x44, 0x5d, 0x1f, 0x86, 0xde, 0x43, 0x86, 0x53, 0xc4,
++ 0x35, 0xa2, 0xcf, 0xde, 0x28, 0xc1, 0x77, 0xd2, 0xff, 0x29, 0x64, 0x77,
++ 0x6d, 0x6e, 0x4c, 0x77, 0xf1, 0xf4, 0xba, 0x70, 0xe2, 0xaf, 0xed, 0xd6,
++ 0xf4, 0x54, 0xf5, 0x3b, 0x18, 0xe5, 0x04, 0x1d, 0xe4, 0x6f, 0x03, 0x1a,
++ 0xe6, 0x6b, 0x51, 0xfd, 0xfe, 0xae, 0x38, 0x47, 0x3e, 0x46, 0x24, 0xbb,
++ 0xe0, 0xef, 0xeb, 0xc6, 0xbe, 0xd6, 0x06, 0x5c, 0x77, 0x6f, 0xe3, 0x41,
++ 0x79, 0x3c, 0x70, 0xfd, 0x93, 0x6f, 0xc3, 0x85, 0xad, 0xb7, 0x61, 0xc6,
++ 0x5f, 0xde, 0x4d, 0x0a, 0xfb, 0xfd, 0xfb, 0xe9, 0xf5, 0x6a, 0x81, 0xc4,
++ 0x7c, 0x41, 0x98, 0xab, 0xf0, 0x8e, 0xc6, 0x61, 0xd7, 0x5d, 0xc0, 0x6f,
++ 0x4b, 0xa5, 0xd4, 0x22, 0xaa, 0x87, 0xb5, 0x31, 0x73, 0xe5, 0xc6, 0x33,
++ 0x7f, 0xdb, 0x3b, 0x13, 0xf5, 0xf4, 0x19, 0xe6, 0xcd, 0x3a, 0xce, 0x00,
++ 0xa6, 0x7d, 0x1b, 0x6d, 0xbf, 0xee, 0xc1, 0x71, 0x3d, 0x29, 0x05, 0xe4,
++ 0xa1, 0xb9, 0x05, 0x64, 0xf4, 0xf0, 0xdf, 0x2a, 0xcd, 0xdf, 0xb3, 0xf8,
++ 0x86, 0x37, 0x1c, 0x9f, 0x05, 0x8d, 0x05, 0x33, 0xc3, 0x77, 0x33, 0xe0,
++ 0xd8, 0xbb, 0x0d, 0xc7, 0x84, 0x87, 0x63, 0x42, 0x8a, 0xe7, 0x26, 0x61,
++ 0x6b, 0x19, 0xc4, 0xf7, 0x7e, 0xf3, 0x80, 0x7c, 0x1e, 0xc5, 0x35, 0xe6,
++ 0x2e, 0x8c, 0xe0, 0x9e, 0x1c, 0x67, 0x9f, 0x7d, 0x18, 0x74, 0xbf, 0x86,
++ 0xd8, 0xea, 0xe7, 0x3c, 0xc5, 0x58, 0x08, 0x31, 0xec, 0x98, 0xfe, 0x0d,
++ 0xb6, 0x60, 0x9a, 0xd0, 0x57, 0x65, 0x0c, 0x27, 0x51, 0xde, 0x23, 0xbe,
++ 0xcd, 0x23, 0x56, 0x91, 0xcf, 0x0e, 0x29, 0x9a, 0xc6, 0xa3, 0x21, 0xe4,
++ 0x35, 0xd9, 0x05, 0xda, 0x91, 0x0c, 0x84, 0xd2, 0xcd, 0xc8, 0x49, 0x1d,
++ 0xf9, 0x99, 0xcd, 0x7f, 0xa3, 0x30, 0x2f, 0x1b, 0x35, 0x13, 0xfd, 0x3a,
++ 0xee, 0xe1, 0xdb, 0xf8, 0xbe, 0xde, 0x83, 0xbc, 0x0f, 0x2b, 0x19, 0xe8,
++ 0x6e, 0x52, 0xe7, 0x33, 0xcc, 0x23, 0xaa, 0x88, 0xb7, 0x0a, 0xb1, 0x06,
++ 0x79, 0xd5, 0x38, 0x73, 0xd7, 0xe7, 0x96, 0xaf, 0xcb, 0x95, 0x45, 0xfe,
++ 0x06, 0xca, 0xb8, 0x7c, 0x90, 0xfe, 0xc0, 0x9c, 0x4b, 0x61, 0x6e, 0x85,
++ 0xbe, 0x0c, 0xe3, 0x3a, 0x0c, 0xa8, 0x07, 0x39, 0x02, 0x72, 0xed, 0x4d,
++ 0x2b, 0x09, 0x3e, 0xaf, 0xcb, 0xc6, 0x62, 0x58, 0x96, 0x2d, 0xe6, 0x45,
++ 0x12, 0xcf, 0x02, 0x76, 0x63, 0xe5, 0x9a, 0xab, 0x13, 0x84, 0x47, 0xcd,
++ 0x53, 0x40, 0x5e, 0x77, 0x40, 0xef, 0xfd, 0x65, 0xf7, 0x4c, 0x9a, 0x1a,
++ 0xeb, 0xbc, 0x19, 0xd9, 0xa0, 0x3d, 0xd9, 0x7c, 0x93, 0x62, 0x6e, 0x70,
++ 0x02, 0x3a, 0xcb, 0xdc, 0x9d, 0xf5, 0x00, 0xbe, 0x6b, 0x5c, 0x27, 0xef,
++ 0xe8, 0x97, 0xfa, 0x21, 0x1b, 0xda, 0x3d, 0xdf, 0xc4, 0x10, 0x47, 0x15,
++ 0x6d, 0xbd, 0xa8, 0x7d, 0x41, 0xb1, 0x3c, 0x83, 0x98, 0x02, 0x1f, 0xc0,
++ 0xdf, 0x70, 0xa6, 0xa6, 0x70, 0x97, 0xe3, 0x80, 0xdb, 0x16, 0x4b, 0xd6,
++ 0x8a, 0x3a, 0x2f, 0x53, 0xe7, 0x6f, 0xbf, 0xdf, 0xe4, 0x61, 0x3f, 0x6a,
++ 0x0d, 0xba, 0x05, 0x1b, 0x52, 0x6b, 0x51, 0xf4, 0xf0, 0xc7, 0x6b, 0xa8,
++ 0x2f, 0x4a, 0x7c, 0x1f, 0x42, 0x6d, 0x50, 0xe2, 0xdb, 0x49, 0x12, 0xfd,
++ 0x08, 0xdf, 0x8b, 0x3c, 0xbf, 0x46, 0xfc, 0xa4, 0xc3, 0xf7, 0x2f, 0xcc,
++ 0x25, 0xe9, 0x5f, 0xfc, 0x7c, 0xd2, 0xd5, 0x85, 0x53, 0x65, 0xfa, 0x10,
++ 0xea, 0x75, 0x3f, 0xfc, 0x16, 0x75, 0xc1, 0xcd, 0x25, 0x57, 0x2a, 0xae,
++ 0xcc, 0x66, 0xeb, 0x97, 0x75, 0x8c, 0xd8, 0x2f, 0x16, 0x74, 0x8c, 0xb2,
++ 0xc3, 0x9a, 0x8e, 0x01, 0x97, 0x24, 0xa3, 0x7b, 0xca, 0xec, 0x75, 0xc9,
++ 0xac, 0x8c, 0xc8, 0x0b, 0xda, 0x6f, 0xf9, 0x3e, 0x8b, 0x39, 0x64, 0x0c,
++ 0xf2, 0x4b, 0xca, 0xf3, 0x67, 0xaf, 0x4b, 0xf6, 0x45, 0xfa, 0xad, 0xe1,
++ 0x58, 0xab, 0x41, 0x5f, 0xe5, 0x48, 0x0d, 0xb1, 0xe9, 0x80, 0xcd, 0x7f,
++ 0x07, 0x10, 0x42, 0x4d, 0xe7, 0x48, 0xf3, 0x68, 0xc2, 0x8e, 0x1b, 0xfd,
++ 0x4f, 0xb6, 0x1a, 0x8c, 0x8d, 0xc3, 0xe6, 0x53, 0xe2, 0xbf, 0x47, 0xb5,
++ 0xc8, 0x53, 0xfa, 0xad, 0x02, 0x66, 0xbb, 0xf0, 0x91, 0xfe, 0x1d, 0xe5,
++ 0x66, 0x8a, 0xb2, 0xc6, 0x78, 0x8d, 0xf3, 0x85, 0xc8, 0xcd, 0x54, 0x93,
++ 0x14, 0xef, 0x72, 0x9c, 0xa3, 0xa3, 0xa9, 0xdd, 0xee, 0xbf, 0x15, 0xf9,
++ 0xc6, 0x5d, 0xae, 0x2f, 0x38, 0xea, 0x8d, 0x5f, 0x41, 0x4f, 0xdd, 0x66,
++ 0xbc, 0x65, 0x7c, 0xe4, 0xbd, 0xa1, 0x5f, 0xe1, 0x37, 0x63, 0xef, 0x3c,
++ 0x62, 0x2f, 0xe3, 0x65, 0x97, 0xe4, 0x0e, 0x6b, 0x9f, 0xc1, 0xf9, 0x82,
++ 0x9b, 0x4b, 0x7b, 0x70, 0x95, 0x69, 0x99, 0xad, 0x30, 0x87, 0xda, 0x40,
++ 0x2c, 0x1b, 0x82, 0xae, 0x32, 0xa6, 0x9d, 0x44, 0x3c, 0xe7, 0xef, 0xd2,
++ 0x58, 0x5b, 0xe2, 0xbe, 0x44, 0x32, 0xae, 0xc0, 0xf3, 0x96, 0x4e, 0xdd,
++ 0x8c, 0xf2, 0x3d, 0xea, 0xd2, 0x10, 0xee, 0xfd, 0x4f, 0x59, 0x5b, 0x0c,
++ 0x68, 0x1d, 0xc9, 0xbe, 0x4c, 0xd9, 0xbb, 0xbf, 0x5b, 0x4b, 0xb7, 0x6b,
++ 0x03, 0xcc, 0x03, 0x1e, 0x87, 0x5c, 0xf6, 0xdb, 0xd7, 0x19, 0xbb, 0xff,
++ 0x5d, 0x59, 0xc3, 0xc9, 0xa7, 0x0c, 0xda, 0x36, 0xc6, 0x2b, 0x21, 0x59,
++ 0x8a, 0x92, 0x7f, 0xc8, 0xcb, 0xa0, 0xed, 0xec, 0x24, 0x87, 0xed, 0x32,
++ 0xf8, 0x4b, 0xc8, 0x80, 0xb2, 0xf4, 0x65, 0xc0, 0xef, 0x49, 0xdc, 0x17,
++ 0x6b, 0x86, 0x7e, 0x5d, 0x47, 0x16, 0xeb, 0xee, 0xd9, 0xc5, 0x72, 0x23,
++ 0xcd, 0xa4, 0x97, 0x77, 0x7a, 0x49, 0x72, 0xfa, 0x7e, 0xe7, 0x25, 0x57,
++ 0xb9, 0x24, 0xfb, 0x2a, 0xf3, 0xf2, 0x98, 0xf5, 0x28, 0xf8, 0xbd, 0xe6,
++ 0xcc, 0x58, 0xba, 0x56, 0x19, 0xcf, 0xff, 0x6f, 0xe7, 0x56, 0x1b, 0xdb,
++ 0x56, 0x75, 0x86, 0x5f, 0x5f, 0xdb, 0x69, 0x1a, 0x9a, 0x70, 0xeb, 0x3a,
++ 0x89, 0x9b, 0x66, 0xad, 0x1d, 0xdf, 0x7e, 0x88, 0xa4, 0xe8, 0x36, 0x64,
++ 0x34, 0xea, 0x82, 0x62, 0x9c, 0x50, 0xc2, 0xe8, 0x44, 0xda, 0x75, 0x55,
++ 0xb5, 0x31, 0x64, 0x39, 0xe9, 0x07, 0xd3, 0x06, 0xa3, 0xb0, 0x82, 0x18,
++ 0x52, 0x8d, 0xdb, 0x6a, 0x9d, 0x96, 0xc6, 0xe9, 0x07, 0x6b, 0x37, 0x69,
++ 0x9a, 0xe5, 0xa4, 0x2d, 0x48, 0x11, 0x2e, 0x88, 0x6e, 0xfb, 0xb1, 0x8d,
++ 0x2a, 0x65, 0xec, 0xff, 0xf6, 0x67, 0xda, 0xd0, 0x16, 0x15, 0x18, 0xfc,
++ 0xd8, 0xa4, 0xfe, 0xe0, 0x47, 0x25, 0xe8, 0xbc, 0xe7, 0x79, 0xcf, 0xbd,
++ 0x8e, 0x6d, 0x82, 0x26, 0x2d, 0x52, 0xe4, 0x7b, 0xce, 0x3d, 0xf7, 0x9c,
++ 0x73, 0xcf, 0xfb, 0xfd, 0xbe, 0xcf, 0xc5, 0xda, 0x13, 0x7d, 0x6b, 0xe5,
++ 0x63, 0xf8, 0x1d, 0x27, 0x67, 0x6d, 0xc9, 0xd8, 0x83, 0xf2, 0x63, 0xcd,
++ 0xe5, 0x33, 0x3e, 0x09, 0xc0, 0x27, 0x35, 0xb8, 0x02, 0x69, 0x77, 0x62,
++ 0x37, 0x85, 0x3e, 0x65, 0x18, 0xb4, 0x8e, 0x1b, 0xbf, 0xd9, 0x36, 0xf7,
++ 0x37, 0x9d, 0x81, 0xef, 0xee, 0x0e, 0xb4, 0xfb, 0x39, 0x5f, 0xe3, 0xdf,
++ 0xfe, 0xc5, 0xab, 0xa1, 0x0d, 0xca, 0x0c, 0xf6, 0xf3, 0x96, 0xea, 0x59,
++ 0x07, 0xbc, 0xc4, 0xdc, 0x74, 0x4c, 0xf3, 0x0f, 0xe1, 0x69, 0xea, 0xa8,
++ 0xab, 0xd0, 0x51, 0x43, 0xd4, 0x5d, 0xc3, 0xb3, 0x2e, 0xf3, 0x03, 0x51,
++ 0xf9, 0xf3, 0x14, 0xf5, 0x70, 0x5c, 0xfe, 0x34, 0xf5, 0x02, 0xf6, 0x93,
++ 0x28, 0x32, 0x47, 0x79, 0x63, 0x26, 0x47, 0x3f, 0x49, 0xfd, 0xf9, 0xb4,
++ 0xfb, 0xac, 0xda, 0x81, 0xb8, 0x95, 0x5f, 0x13, 0x56, 0x7d, 0xf3, 0xb4,
++ 0xd6, 0x74, 0xe3, 0x56, 0xb7, 0xdc, 0x38, 0x6f, 0x74, 0x6c, 0x78, 0x3a,
++ 0x1a, 0x18, 0x99, 0xa3, 0x5d, 0x4a, 0xc6, 0xb2, 0xd6, 0x0a, 0x39, 0x10,
++ 0x65, 0xee, 0x39, 0x45, 0xfd, 0x0c, 0x5b, 0xd8, 0x6b, 0x67, 0xad, 0x66,
++ 0xcf, 0xfe, 0xc4, 0x1a, 0xf4, 0xec, 0xd3, 0x9e, 0x9e, 0xe5, 0xbd, 0x14,
++ 0x68, 0x4a, 0x5b, 0x94, 0x98, 0x19, 0xb5, 0x92, 0xb0, 0x79, 0xb8, 0x9e,
++ 0xe7, 0xfc, 0x71, 0x39, 0x32, 0x7f, 0x18, 0xfe, 0x77, 0xaf, 0xbd, 0x87,
++ 0x76, 0xd5, 0x1e, 0x22, 0x16, 0x07, 0xeb, 0x7f, 0xa9, 0x61, 0xae, 0xc7,
++ 0xbd, 0xb9, 0x78, 0x1f, 0x72, 0x3e, 0xed, 0xc8, 0x04, 0x6c, 0xc9, 0x88,
++ 0x6d, 0xf6, 0x5a, 0x3f, 0x76, 0x77, 0x75, 0xdd, 0x13, 0x05, 0xc7, 0xc3,
++ 0x85, 0xe1, 0x17, 0xbe, 0xd0, 0xd7, 0x23, 0x5c, 0x93, 0xeb, 0xb5, 0x49,
++ 0x7a, 0x1f, 0xf4, 0xcb, 0x34, 0xff, 0x73, 0x5e, 0xed, 0x0a, 0xf1, 0x4a,
++ 0xb4, 0x6b, 0x19, 0xdb, 0xf4, 0x80, 0x37, 0xdf, 0xb6, 0x0e, 0x69, 0x89,
++ 0xd6, 0x8c, 0x67, 0x6e, 0x85, 0xed, 0xb8, 0xe4, 0xe6, 0xf9, 0x5b, 0xa9,
++ 0x44, 0x9c, 0x26, 0xd9, 0x63, 0xaf, 0x6b, 0x98, 0x63, 0x2b, 0xfa, 0x8c,
++ 0x4f, 0x10, 0x9c, 0x0e, 0x78, 0xbe, 0xc5, 0x06, 0xfa, 0x4d, 0xde, 0x75,
++ 0xb3, 0xe6, 0x64, 0xe2, 0x56, 0x57, 0xc3, 0x7b, 0x6c, 0xa8, 0xda, 0xe1,
++ 0xb8, 0x45, 0xdd, 0xd9, 0x14, 0x95, 0x36, 0xf2, 0x50, 0x45, 0xfd, 0xf8,
++ 0x90, 0x63, 0xb0, 0x16, 0x51, 0xe7, 0x60, 0x07, 0x73, 0xf6, 0x6f, 0xeb,
++ 0xb9, 0xb5, 0xd2, 0x27, 0xc0, 0x35, 0xf8, 0xe4, 0x73, 0xf9, 0x5e, 0xe6,
++ 0x7a, 0x31, 0x7f, 0x0b, 0xe7, 0x77, 0xbd, 0x73, 0x4e, 0xb8, 0x39, 0xeb,
++ 0x7e, 0xc9, 0x9e, 0x37, 0xfc, 0x97, 0x76, 0xc0, 0x7b, 0x6d, 0x68, 0xcf,
++ 0xd1, 0x26, 0x7c, 0xd1, 0x3c, 0xbe, 0x6d, 0xd8, 0xa2, 0xb6, 0xe1, 0x78,
++ 0x81, 0xfc, 0x49, 0xbe, 0xf4, 0xf9, 0xd1, 0xd7, 0x79, 0xe4, 0x51, 0xea,
++ 0xd9, 0x41, 0x39, 0x53, 0xe0, 0xd9, 0xa4, 0xb4, 0xa6, 0xb5, 0xf1, 0xec,
++ 0x84, 0xe2, 0xb1, 0x7a, 0xa6, 0x13, 0x17, 0x73, 0x32, 0x2c, 0x57, 0x5d,
++ 0x9e, 0x59, 0xa2, 0x98, 0x09, 0xb6, 0xd6, 0xbc, 0xff, 0x3e, 0x3d, 0xb3,
++ 0xb0, 0xfa, 0x8c, 0x31, 0x8c, 0x7d, 0xc9, 0xa3, 0x77, 0x9b, 0x9e, 0x6d,
++ 0xa6, 0x8e, 0x3e, 0x8f, 0xea, 0x39, 0x85, 0xa1, 0x13, 0x59, 0xc7, 0x0f,
++ 0x47, 0xf8, 0x0c, 0xd7, 0xa5, 0xcf, 0xc7, 0xb5, 0xc8, 0x7b, 0x3d, 0xb0,
++ 0xd8, 0xfd, 0x12, 0xdc, 0x01, 0xd1, 0xdf, 0xc1, 0x3a, 0x72, 0x00, 0xb2,
++ 0xba, 0xd1, 0x60, 0x5f, 0xc6, 0x8d, 0xaf, 0x91, 0xb1, 0xde, 0xc2, 0x39,
++ 0x22, 0x56, 0x81, 0x1f, 0x7d, 0xfc, 0xa7, 0x77, 0x30, 0x5f, 0xc6, 0xf3,
++ 0xd7, 0x07, 0x30, 0x3f, 0xcf, 0x82, 0x32, 0x36, 0xb5, 0x8d, 0xbc, 0x3a,
++ 0xaa, 0xf5, 0x41, 0x3e, 0x43, 0x39, 0xe6, 0x99, 0x91, 0x2e, 0x7f, 0xc3,
++ 0xf3, 0x6c, 0x6f, 0x6d, 0xa0, 0x63, 0xd2, 0xdb, 0x9f, 0x7f, 0x3f, 0x2c,
++ 0xe1, 0x0e, 0xea, 0xb8, 0xa8, 0x24, 0xa7, 0x19, 0xb3, 0xc0, 0x76, 0x8d,
++ 0x73, 0xae, 0xff, 0xad, 0x8b, 0x33, 0xff, 0xa7, 0x2e, 0xce, 0x58, 0x1f,
++ 0x29, 0xef, 0x84, 0x35, 0x8f, 0xf5, 0xc5, 0x74, 0x2d, 0xd6, 0xd1, 0xd5,
++ 0xaf, 0xdd, 0x47, 0xab, 0x74, 0xfc, 0x51, 0x81, 0xf6, 0x2a, 0xa5, 0x39,
++ 0xe5, 0x7f, 0x4e, 0xf1, 0x6c, 0xb9, 0xc7, 0xab, 0xdc, 0xe3, 0xf0, 0x82,
++ 0x62, 0x20, 0xbf, 0xa6, 0x32, 0x7c, 0xb2, 0x40, 0x1d, 0xd3, 0x2a, 0xb3,
++ 0x33, 0xbe, 0x9e, 0x19, 0xf3, 0x7c, 0xdc, 0xfc, 0x9a, 0x26, 0xd5, 0x33,
++ 0xf0, 0x6e, 0x9c, 0x11, 0xcf, 0xbe, 0x74, 0x4b, 0xe9, 0x3c, 0xed, 0x6e,
++ 0x12, 0x7d, 0xd1, 0x40, 0x69, 0x8e, 0xb5, 0x49, 0x62, 0x50, 0x86, 0x85,
++ 0x75, 0xff, 0x11, 0xfb, 0x38, 0xe4, 0x2d, 0x26, 0xef, 0x4f, 0xd1, 0xa7,
++ 0x6f, 0x82, 0x6f, 0xdc, 0xd6, 0x70, 0xbe, 0xdb, 0xab, 0x3e, 0x61, 0x3d,
++ 0xdd, 0x37, 0x74, 0x4a, 0x0b, 0xf9, 0xdc, 0xb1, 0x6f, 0x08, 0x7d, 0x30,
++ 0x5e, 0x67, 0x11, 0x0b, 0x30, 0xf6, 0x88, 0x6b, 0xec, 0x51, 0x2a, 0xb2,
++ 0xaf, 0xd5, 0xcb, 0x2b, 0xb5, 0x2a, 0xaf, 0x90, 0xdf, 0x32, 0xea, 0x7f,
++ 0x0f, 0xa9, 0xce, 0xca, 0x4f, 0xf5, 0x1a, 0xfc, 0x8a, 0x1d, 0x53, 0xde,
++ 0x93, 0x3a, 0xde, 0x8b, 0x79, 0x6b, 0x3f, 0xdc, 0x69, 0x7c, 0x2b, 0x5b,
++ 0xf5, 0x4d, 0x58, 0xc7, 0xd1, 0xae, 0x70, 0x7e, 0xf2, 0x06, 0x79, 0x84,
++ 0x3a, 0xcf, 0x1f, 0xe7, 0xd3, 0xc3, 0x6f, 0x73, 0x3c, 0xf9, 0xbf, 0x16,
++ 0x8b, 0xe0, 0xcb, 0xaa, 0xdf, 0xe7, 0xcb, 0x1d, 0xef, 0xd5, 0xda, 0x04,
++ 0xca, 0x5d, 0x6d, 0x7d, 0xd2, 0x96, 0xc8, 0xf4, 0x12, 0x5d, 0xd2, 0xfd,
++ 0xdc, 0xff, 0x4b, 0xcc, 0xed, 0x42, 0xde, 0x96, 0xa3, 0xcd, 0x51, 0xa5,
++ 0x4d, 0x06, 0xb4, 0x89, 0x28, 0x6d, 0x18, 0xef, 0x3d, 0xe3, 0xf1, 0x5b,
++ 0x2b, 0xce, 0x8b, 0xb9, 0x5a, 0xe8, 0xba, 0xbd, 0xd4, 0xf9, 0xcf, 0x77,
++ 0x6a, 0x7d, 0xd0, 0xa1, 0xee, 0x5b, 0x05, 0x7d, 0xc6, 0xf6, 0x66, 0xf5,
++ 0x47, 0x4c, 0xbc, 0x15, 0xd7, 0x3c, 0x68, 0x10, 0xfa, 0xb9, 0x34, 0x05,
++ 0x5f, 0x8d, 0x78, 0xb7, 0x3a, 0x5a, 0x7d, 0xc7, 0x3b, 0xaf, 0x92, 0xd2,
++ 0x86, 0x32, 0x40, 0xbd, 0xb9, 0x1a, 0xf3, 0xed, 0x8e, 0xf6, 0x81, 0xbf,
++ 0x7e, 0x81, 0xfe, 0x8d, 0x1a, 0x4f, 0x04, 0x21, 0xf3, 0x37, 0xa7, 0x3a,
++ 0xbc, 0x18, 0xce, 0x41, 0x1b, 0x71, 0xeb, 0x54, 0x84, 0x31, 0x05, 0xda,
++ 0x5b, 0xa4, 0x69, 0x1a, 0xf1, 0x2b, 0xf4, 0xf8, 0x82, 0xda, 0xa3, 0x3e,
++ 0xdc, 0xbf, 0x8b, 0x18, 0x3f, 0x5c, 0x1f, 0xc6, 0x73, 0xbd, 0x06, 0x8b,
++ 0x10, 0xdd, 0xa4, 0x67, 0x5a, 0x9a, 0x4a, 0xc4, 0x0e, 0x8a, 0xd7, 0x37,
++ 0xee, 0xaa, 0x3e, 0x58, 0xda, 0xd7, 0x43, 0xb2, 0xbb, 0x6a, 0x2f, 0x18,
++ 0x47, 0xc3, 0x87, 0x9f, 0x31, 0xf6, 0x20, 0x5f, 0xec, 0x53, 0x5c, 0x54,
++ 0x70, 0x68, 0x1e, 0x67, 0x49, 0x9f, 0x74, 0x11, 0x7e, 0xb8, 0x8b, 0x33,
++ 0xa4, 0xdf, 0x5d, 0x39, 0x76, 0xc2, 0x4d, 0xb1, 0x3e, 0x06, 0x7d, 0x70,
++ 0x4c, 0x46, 0x10, 0x17, 0x8c, 0x04, 0xdb, 0x98, 0x57, 0x86, 0x6f, 0x98,
++ 0xf3, 0x72, 0x8f, 0x7d, 0xcc, 0x99, 0xca, 0xd9, 0x39, 0xee, 0x9d, 0xb2,
++ 0x6d, 0x62, 0xef, 0xd2, 0x14, 0xf7, 0x6b, 0xf2, 0x10, 0x6c, 0x5b, 0xd3,
++ 0x2e, 0x7e, 0x79, 0x16, 0x03, 0xf8, 0x1d, 0x84, 0x3c, 0x70, 0x2c, 0x7e,
++ 0xe7, 0x16, 0xe5, 0xdd, 0xf3, 0xbe, 0x6d, 0x0f, 0xc8, 0x3b, 0x4e, 0xe5,
++ 0xd8, 0x71, 0x77, 0x0d, 0xcf, 0xc0, 0xcd, 0xb1, 0x66, 0xed, 0x38, 0x6e,
++ 0x5e, 0x2a, 0x95, 0x05, 0x77, 0x61, 0x8d, 0xa5, 0xb4, 0xa4, 0xfc, 0xff,
++ 0x03, 0x67, 0x78, 0xfd, 0x3e, 0x4b, 0x0c, 0xfd, 0x48, 0x9b, 0xcf, 0xd7,
++ 0xfe, 0x6a, 0x6d, 0x81, 0xaf, 0xff, 0xc8, 0x8f, 0xe4, 0xcb, 0x45, 0xd9,
++ 0xa9, 0xfa, 0x7f, 0xb9, 0xe7, 0x6a, 0x75, 0xbf, 0xef, 0xdf, 0x52, 0xbf,
++ 0x93, 0x17, 0x63, 0x1a, 0x1f, 0x6c, 0x9a, 0x6e, 0xd4, 0x09, 0x4f, 0x78,
++ 0x75, 0x85, 0xe5, 0x78, 0x6f, 0xbf, 0xa7, 0x17, 0x52, 0xea, 0x3b, 0xa7,
++ 0x6c, 0xea, 0x07, 0xee, 0xa7, 0x45, 0x26, 0x2e, 0xdc, 0x01, 0x4d, 0x7c,
++ 0x1d, 0xcc, 0xb8, 0xcf, 0xd7, 0x1d, 0x6d, 0x9e, 0x2f, 0x6c, 0x49, 0xcf,
++ 0x59, 0xfa, 0x4e, 0x0e, 0xf4, 0x68, 0xbb, 0x64, 0xc6, 0x83, 0x92, 0x3c,
++ 0x1b, 0x8b, 0x19, 0x5f, 0x97, 0xfc, 0x07, 0x79, 0xd3, 0x3e, 0xad, 0x45,
++ 0xa1, 0xff, 0x6e, 0xe1, 0xda, 0x86, 0x9f, 0x21, 0xcf, 0x7b, 0xfd, 0x7b,
++ 0x76, 0x03, 0x8f, 0xee, 0xf0, 0x78, 0x94, 0xf7, 0x2d, 0x53, 0xff, 0xc0,
++ 0xd8, 0x9e, 0xb3, 0xdc, 0xa3, 0x79, 0xae, 0xe7, 0xac, 0x89, 0xd7, 0xeb,
++ 0x9f, 0xeb, 0xab, 0x3e, 0x87, 0xfb, 0xf0, 0x7d, 0xcd, 0xdc, 0x3b, 0x07,
++ 0xe1, 0xd3, 0xf5, 0xd1, 0xe6, 0xd0, 0x7e, 0x6f, 0x74, 0x77, 0x0a, 0xf9,
++ 0x3d, 0xe1, 0xf1, 0x1c, 0xf5, 0x4d, 0xc4, 0xd3, 0x37, 0x4b, 0xf6, 0x65,
++ 0xc4, 0xe0, 0x4f, 0x98, 0x13, 0xa9, 0xb1, 0x2f, 0x4f, 0x98, 0x77, 0xab,
++ 0xb3, 0x2f, 0x77, 0x7b, 0xf3, 0xf8, 0xf7, 0x7c, 0xbd, 0xe2, 0xb7, 0x7d,
++ 0xbd, 0xd2, 0xe8, 0xd3, 0xfa, 0xb4, 0xaf, 0xed, 0xaf, 0x8f, 0xf9, 0xf2,
++ 0xcb, 0xe6, 0x5d, 0xb2, 0x88, 0xd9, 0xe8, 0x53, 0x26, 0x72, 0x06, 0x2f,
++ 0x6d, 0x9d, 0xb1, 0x88, 0xfb, 0x70, 0x7e, 0x22, 0xe9, 0xc8, 0x1d, 0x8d,
++ 0xad, 0x4f, 0x5e, 0x18, 0xd3, 0x3c, 0x4f, 0xc9, 0xf5, 0xf4, 0x4e, 0x74,
++ 0x17, 0xe4, 0xea, 0x4a, 0x64, 0x09, 0x53, 0x34, 0x73, 0x34, 0x0d, 0x3b,
++ 0x94, 0xd2, 0x7a, 0xd9, 0xf7, 0xb0, 0xdf, 0x41, 0xc5, 0x73, 0xad, 0x74,
++ 0x5e, 0x94, 0x47, 0xec, 0x8a, 0xd6, 0x6e, 0x9a, 0x87, 0x8a, 0x47, 0x9b,
++ 0x4f, 0xfb, 0x7c, 0x4f, 0x7e, 0x9a, 0x39, 0x3a, 0x31, 0x53, 0x19, 0x0e,
++ 0x6d, 0xeb, 0xb5, 0xf3, 0x42, 0xbc, 0xfe, 0xb0, 0x1c, 0x52, 0xdc, 0xf0,
++ 0xab, 0xb8, 0xbf, 0x97, 0xf1, 0x65, 0x22, 0xa4, 0x78, 0xe0, 0x44, 0x6c,
++ 0x12, 0xb2, 0x98, 0x75, 0x89, 0xef, 0x5f, 0xa5, 0x38, 0xff, 0x92, 0xd0,
++ 0xcf, 0x22, 0xa6, 0xe0, 0x05, 0x39, 0xe8, 0x6e, 0x74, 0x17, 0xc4, 0xf8,
++ 0xbf, 0x59, 0xad, 0x09, 0xad, 0x90, 0x49, 0x37, 0xd4, 0x9c, 0x2e, 0x1b,
++ 0x19, 0x18, 0x0d, 0xa6, 0x56, 0x9e, 0x70, 0xa2, 0xcd, 0x3b, 0xcb, 0x90,
++ 0xf1, 0x32, 0xf4, 0x7f, 0x39, 0x16, 0x18, 0x51, 0x6c, 0xda, 0x57, 0x24,
++ 0xdd, 0x41, 0x3f, 0x9f, 0xfa, 0xe4, 0x01, 0xb9, 0x69, 0x6f, 0x96, 0x9b,
++ 0x5b, 0x88, 0xc3, 0xec, 0x47, 0x9b, 0xba, 0x64, 0x10, 0x7d, 0x49, 0xf4,
++ 0x35, 0x2b, 0x3f, 0x6a, 0x7c, 0x06, 0x9d, 0x75, 0xd3, 0xa6, 0xae, 0x5a,
++ 0xcf, 0x5f, 0xbc, 0xeb, 0x22, 0x68, 0x42, 0x6c, 0xc7, 0x56, 0xb4, 0xa9,
++ 0xe3, 0xec, 0x86, 0xfe, 0x2e, 0xb4, 0xef, 0xc3, 0x1c, 0x4d, 0xfa, 0x7e,
++ 0x96, 0xb3, 0xcd, 0xd4, 0x39, 0xeb, 0xc6, 0xac, 0x6e, 0x68, 0xff, 0xb1,
++ 0xdd, 0xe0, 0x13, 0x3e, 0x25, 0xbd, 0x73, 0x29, 0xd9, 0xd5, 0x59, 0xdf,
++ 0xfe, 0x77, 0x43, 0xbb, 0x4d, 0x56, 0xb6, 0x93, 0x0c, 0x4f, 0x75, 0xd4,
++ 0xf7, 0xfb, 0xfc, 0xe4, 0xb7, 0x3b, 0xf1, 0xbe, 0x09, 0x18, 0xbc, 0xa4,
++ 0xc6, 0x52, 0x37, 0xa3, 0x5c, 0xeb, 0x83, 0x86, 0x67, 0x78, 0xcd, 0x67,
++ 0xf8, 0x2c, 0xf3, 0x7a, 0x9f, 0xb1, 0x1f, 0xcf, 0x30, 0x27, 0xc0, 0xbc,
++ 0x06, 0x79, 0x76, 0xb9, 0x38, 0x8b, 0x63, 0x3e, 0x9f, 0x6f, 0xc8, 0x54,
++ 0x79, 0xcf, 0xd7, 0x2b, 0xb1, 0x2a, 0x56, 0x6d, 0x67, 0xc1, 0xcf, 0x09,
++ 0x93, 0x76, 0x5a, 0x93, 0x8a, 0xdd, 0x00, 0x9d, 0x0f, 0x80, 0xce, 0x0f,
++ 0x05, 0x19, 0x17, 0xb6, 0x78, 0xb4, 0x76, 0x64, 0xa4, 0xfc, 0x5b, 0xc8,
++ 0x38, 0x79, 0x14, 0x3e, 0x45, 0xd9, 0xf2, 0xf0, 0x19, 0x03, 0xb0, 0x69,
++ 0xae, 0x04, 0x35, 0xef, 0x80, 0xf8, 0x7e, 0xf6, 0xba, 0x8c, 0x4c, 0x31,
++ 0x27, 0x40, 0x7e, 0x66, 0x5c, 0x9f, 0xc2, 0xbd, 0x5b, 0x18, 0xeb, 0x42,
++ 0x86, 0xc7, 0xc0, 0xaf, 0x21, 0x71, 0xa6, 0xb7, 0x4a, 0x6e, 0x7c, 0x4c,
++ 0x7d, 0x80, 0x1e, 0xd8, 0xa8, 0xe3, 0xee, 0xa8, 0x9c, 0xb8, 0xb2, 0x01,
++ 0xb2, 0xca, 0xb8, 0x5f, 0x73, 0x1a, 0x95, 0xb0, 0xfa, 0xe6, 0xf4, 0x39,
++ 0x98, 0x87, 0x33, 0x35, 0x66, 0x23, 0xb7, 0x93, 0x31, 0x69, 0x1b, 0x95,
++ 0x99, 0x0b, 0xb6, 0xe2, 0x5d, 0x52, 0x72, 0xa7, 0x42, 0xda, 0x65, 0xf7,
++ 0xc6, 0xa1, 0xab, 0xe8, 0xcb, 0x9f, 0x8c, 0x98, 0xb3, 0x7c, 0x74, 0x2d,
++ 0x63, 0xe2, 0xe4, 0x74, 0xed, 0x1c, 0x8a, 0x91, 0xc1, 0xbd, 0xd7, 0xda,
++ 0x8d, 0xcc, 0x30, 0x3e, 0xfe, 0xa0, 0x92, 0x8a, 0x72, 0x4d, 0x8e, 0x65,
++ 0xed, 0x96, 0x3c, 0xc2, 0xbd, 0x7d, 0xea, 0xf1, 0xf2, 0xcf, 0x30, 0x5f,
++ 0x5c, 0x7a, 0x5e, 0x1f, 0xd3, 0xb8, 0xfe, 0x78, 0x5d, 0x0c, 0x6b, 0xf2,
++ 0x05, 0x26, 0x8e, 0xbd, 0x2e, 0x93, 0xf3, 0xa4, 0x0f, 0x6d, 0x7c, 0x40,
++ 0x5e, 0x73, 0x7a, 0xed, 0x27, 0xb5, 0xd6, 0x98, 0x48, 0xb1, 0x3e, 0xd3,
++ 0xe2, 0x24, 0xed, 0x59, 0x09, 0x0d, 0x7e, 0x15, 0xd7, 0x8c, 0x6b, 0xf3,
++ 0x6e, 0xaf, 0xfb, 0xa4, 0xf8, 0x38, 0x90, 0x8d, 0xa9, 0x15, 0x81, 0xdb,
++ 0x95, 0xeb, 0x7b, 0x39, 0xc6, 0xe0, 0x40, 0x24, 0x40, 0x5a, 0xbd, 0xb7,
++ 0x9e, 0xf8, 0x99, 0xfa, 0xfc, 0xdf, 0x83, 0x4f, 0xef, 0x19, 0x48, 0x9c,
++ 0x62, 0x0c, 0x1b, 0x76, 0xbe, 0xb5, 0xd6, 0xbc, 0x6b, 0x2e, 0xb7, 0x5a,
++ 0xb4, 0x7e, 0x76, 0xe4, 0x23, 0x87, 0x78, 0x88, 0x44, 0x6c, 0x85, 0xc5,
++ 0x3c, 0x38, 0x75, 0x1c, 0x6b, 0x2a, 0xcc, 0xb9, 0x11, 0xc7, 0xdf, 0x2c,
++ 0x97, 0xfb, 0x2c, 0x79, 0x30, 0x94, 0x8a, 0x5b, 0xb2, 0x29, 0x7e, 0x56,
++ 0xb0, 0x26, 0xeb, 0x2b, 0xf3, 0x89, 0x1c, 0xc7, 0x87, 0xa6, 0x39, 0x5f,
++ 0x5c, 0xe3, 0x95, 0xe4, 0xa6, 0x4a, 0xe5, 0x19, 0x57, 0x02, 0xc9, 0x7b,
++ 0x3f, 0xac, 0xb0, 0x16, 0x6e, 0xbd, 0xfe, 0x45, 0x38, 0x05, 0xea, 0x8a,
++ 0x55, 0x93, 0x06, 0x73, 0x78, 0xe2, 0x48, 0xcf, 0x3c, 0xdb, 0xdf, 0x7d,
++ 0xc4, 0xb4, 0x4f, 0xa1, 0xdd, 0xe4, 0x61, 0x9d, 0xa6, 0x8e, 0xf4, 0x14,
++ 0x9f, 0x5a, 0x6b, 0xe2, 0xef, 0x45, 0xc5, 0x7f, 0xbd, 0x5d, 0x17, 0xd3,
++ 0xa4, 0x02, 0xe3, 0x85, 0xb1, 0xc0, 0x58, 0xc1, 0xea, 0x6b, 0x06, 0xad,
++ 0xe6, 0x5c, 0xe6, 0x6a, 0xfc, 0x9c, 0x15, 0xf3, 0xfd, 0x22, 0xdf, 0x57,
++ 0x8c, 0x14, 0x6b, 0x8a, 0x96, 0xfa, 0x42, 0x07, 0xe6, 0x98, 0xe3, 0x8f,
++ 0xa8, 0x3e, 0x38, 0x38, 0xdf, 0x26, 0x79, 0x7b, 0x8d, 0xe4, 0x55, 0xc6,
++ 0xa3, 0xaa, 0x03, 0x2c, 0xe7, 0x5e, 0xf4, 0x71, 0xdf, 0x4f, 0x28, 0x2e,
++ 0xe2, 0xcd, 0x42, 0x17, 0xda, 0xcc, 0x35, 0x6f, 0x6f, 0xe8, 0xaf, 0xad,
++ 0xcb, 0x26, 0x6c, 0xcb, 0x6a, 0xac, 0xc9, 0xb2, 0xaf, 0xb1, 0x16, 0x7b,
++ 0x52, 0xae, 0x93, 0x6f, 0xca, 0x7e, 0xce, 0xdd, 0xf5, 0x72, 0xee, 0xdf,
++ 0xee, 0x32, 0x18, 0x61, 0xc9, 0x84, 0x86, 0x9a, 0xfb, 0x8e, 0x4f, 0x05,
++ 0x6f, 0x2d, 0xe5, 0x4f, 0xd1, 0x9e, 0xaf, 0xd6, 0xca, 0x71, 0xef, 0x39,
++ 0x62, 0xc5, 0xe1, 0x57, 0xe4, 0xbc, 0xef, 0x0e, 0x78, 0xbf, 0xfa, 0xfc,
++ 0xff, 0xd8, 0x53, 0x8b, 0xd6, 0xd9, 0xad, 0xba, 0x3a, 0xfb, 0xe3, 0x78,
++ 0x96, 0x35, 0xf6, 0x5c, 0xa5, 0x09, 0xbc, 0xdb, 0x44, 0x9c, 0x48, 0x75,
++ 0x3c, 0x75, 0xbc, 0xea, 0x72, 0x9d, 0x6b, 0xa7, 0x37, 0x57, 0x10, 0x7a,
++ 0x7e, 0x62, 0xca, 0x1f, 0x73, 0x4c, 0x56, 0xf4, 0x27, 0x62, 0x41, 0x8b,
++ 0x63, 0x8c, 0xbe, 0x4f, 0xbb, 0xc7, 0xa0, 0xc7, 0xa9, 0xf3, 0xf9, 0xde,
++ 0x0e, 0x7c, 0x3d, 0xea, 0x02, 0xea, 0x73, 0xb5, 0x01, 0xf1, 0x3c, 0x74,
++ 0xfd, 0x48, 0x59, 0x73, 0xf9, 0xb1, 0x87, 0x83, 0x89, 0x99, 0xac, 0xea,
++ 0x06, 0xf8, 0x7b, 0xe5, 0x6b, 0xcc, 0x07, 0x9d, 0x92, 0x40, 0x6d, 0x9d,
++ 0x86, 0xb1, 0x19, 0x6b, 0x1a, 0xad, 0xd0, 0x0d, 0x22, 0x57, 0xc1, 0x1b,
++ 0x6f, 0xcc, 0x91, 0x5f, 0x83, 0x1d, 0x26, 0xbe, 0x5a, 0xd8, 0x6e, 0x49,
++ 0x87, 0xd6, 0x3e, 0xf3, 0x4e, 0x84, 0xfe, 0xc9, 0x70, 0xb2, 0x1f, 0x7e,
++ 0xb6, 0x62, 0x0f, 0x98, 0xaf, 0x9c, 0x40, 0x3c, 0x56, 0x9b, 0x63, 0x81,
++ 0x7c, 0x8d, 0xb3, 0x3f, 0x0b, 0xbf, 0x72, 0xa9, 0xee, 0x91, 0x2f, 0x9e,
++ 0xd0, 0xdc, 0x66, 0x69, 0xae, 0x55, 0x75, 0x6c, 0xa9, 0xf8, 0x30, 0xce,
++ 0x45, 0x36, 0x5b, 0x43, 0x79, 0xaf, 0x3f, 0x2c, 0xc5, 0x22, 0xdb, 0xd2,
++ 0xdd, 0xa4, 0xe7, 0xee, 0xd7, 0x76, 0x6c, 0x99, 0x85, 0xaf, 0x58, 0x9c,
++ 0x77, 0xf0, 0xbf, 0x05, 0xff, 0x7d, 0xf8, 0xdf, 0x25, 0xe9, 0x69, 0xfa,
++ 0xaf, 0xac, 0xe5, 0xb4, 0x36, 0xac, 0x1f, 0xf6, 0x70, 0xe0, 0xf4, 0x6b,
++ 0x4d, 0x9c, 0x93, 0x2f, 0x36, 0xca, 0x09, 0xf3, 0xa4, 0xbe, 0x8e, 0x60,
++ 0xbe, 0xd4, 0xaf, 0xf5, 0xd5, 0xd6, 0xb0, 0x2c, 0xaf, 0xee, 0x45, 0x9e,
++ 0x6e, 0x91, 0x83, 0x45, 0xbf, 0x76, 0x15, 0x93, 0x43, 0xd5, 0xda, 0x95,
++ 0x64, 0x82, 0x43, 0xb7, 0x1f, 0xcb, 0x4e, 0x29, 0x9e, 0xc0, 0xb2, 0x86,
++ 0xae, 0x3f, 0x36, 0x39, 0xff, 0xce, 0x63, 0x4b, 0x98, 0x70, 0xdc, 0x9b,
++ 0x5f, 0x0e, 0x33, 0x44, 0x2c, 0x1d, 0xbf, 0x93, 0x53, 0xdf, 0x0d, 0xfb,
++ 0xf6, 0x63, 0x1e, 0xe2, 0xec, 0xe2, 0xf6, 0x12, 0x7e, 0xd9, 0x8f, 0x47,
++ 0x89, 0x23, 0xe5, 0x73, 0xb5, 0xd8, 0x8f, 0x10, 0xce, 0x5f, 0x02, 0x96,
++ 0x93, 0xc3, 0x3e, 0x2e, 0x76, 0x19, 0x3f, 0x90, 0x38, 0xd3, 0x44, 0x0d,
++ 0xf6, 0xc8, 0xc7, 0x9a, 0x5e, 0xc4, 0x5c, 0x19, 0xf9, 0x7d, 0xf9, 0x71,
++ 0xf9, 0x75, 0x79, 0x0c, 0xf2, 0x3d, 0x89, 0x39, 0xf7, 0xcb, 0xaf, 0xca,
++ 0x7b, 0xe5, 0x5a, 0x79, 0x5c, 0xde, 0x2a, 0xef, 0x42, 0x4c, 0x35, 0x4a,
++ 0xac, 0xa7, 0x87, 0x95, 0x1e, 0x96, 0x89, 0x73, 0x8a, 0x01, 0xbc, 0x45,
++ 0xbf, 0xe7, 0x88, 0xfa, 0xd9, 0x01, 0xf2, 0xf4, 0x6f, 0x18, 0xcf, 0x13,
++ 0x9b, 0x59, 0x2c, 0xfb, 0x18, 0x8e, 0x43, 0xdd, 0x58, 0xdb, 0xe6, 0x37,
++ 0x29, 0x23, 0xe7, 0x22, 0x81, 0xd1, 0x73, 0xa1, 0xc0, 0x43, 0xfa, 0x7d,
++ 0x0b, 0xeb, 0x9d, 0x15, 0x39, 0xe1, 0x3a, 0xe4, 0xcd, 0xc1, 0x11, 0xc8,
++ 0xc2, 0x28, 0x54, 0xfd, 0x23, 0xce, 0x1a, 0x01, 0x49, 0x53, 0x1f, 0xc3,
++ 0xcf, 0x4c, 0x9e, 0x76, 0x25, 0x5b, 0x98, 0x0d, 0x18, 0x3c, 0x9a, 0x8d,
++ 0x76, 0x1f, 0xda, 0xbf, 0xf4, 0xda, 0x3b, 0x24, 0x7b, 0x41, 0x52, 0xef,
++ 0xab, 0x3f, 0xfc, 0x73, 0xaf, 0x6f, 0x10, 0x7d, 0xe0, 0xcc, 0x57, 0xd8,
++ 0xf7, 0x8a, 0xd7, 0xc7, 0x33, 0x61, 0xad, 0x3e, 0xae, 0x7c, 0x95, 0xb5,
++ 0xc7, 0x85, 0xdf, 0x2f, 0x18, 0x4c, 0xe8, 0xfb, 0x5d, 0x46, 0xb7, 0x11,
++ 0x13, 0xf8, 0xaf, 0x2e, 0xc6, 0x60, 0x45, 0xc8, 0xd7, 0x7a, 0xe8, 0xc4,
++ 0xbf, 0x6f, 0x5e, 0x6a, 0x5b, 0x43, 0x9f, 0xd4, 0x60, 0xb4, 0x3f, 0x91,
++ 0x9e, 0xf9, 0xdb, 0x1e, 0x9e, 0xf7, 0x30, 0xde, 0x0d, 0x67, 0x55, 0x20,
++ 0x6e, 0x3c, 0x0e, 0xd9, 0x6e, 0x95, 0x35, 0x67, 0x48, 0xaf, 0x5e, 0xe8,
++ 0xea, 0x14, 0xe4, 0xd6, 0x95, 0xb9, 0x72, 0x28, 0x30, 0x52, 0x48, 0x89,
++ 0xc1, 0x53, 0x5b, 0x92, 0x89, 0xa6, 0xe4, 0xe4, 0x40, 0x62, 0x0b, 0xf3,
++ 0x90, 0xd9, 0x7e, 0x57, 0x2e, 0x95, 0x69, 0x8f, 0x73, 0x72, 0x79, 0x20,
++ 0xe1, 0x16, 0x85, 0xb8, 0x18, 0x57, 0x2e, 0x43, 0x36, 0xff, 0x70, 0x6e,
++ 0x97, 0x1c, 0x2a, 0xa8, 0x1f, 0xdc, 0x1b, 0x96, 0x97, 0xe5, 0xd2, 0xc0,
++ 0xcb, 0xb7, 0x2e, 0xb9, 0x93, 0x38, 0x53, 0xf2, 0xe1, 0x81, 0x6e, 0xb3,
++ 0x6f, 0xc5, 0x21, 0x09, 0xf3, 0x21, 0x5a, 0x53, 0x73, 0x56, 0x48, 0x7a,
++ 0x5f, 0xc4, 0x8b, 0xcb, 0xe1, 0x73, 0x07, 0xee, 0x33, 0xf5, 0x94, 0x80,
++ 0xbf, 0xcf, 0x30, 0xfc, 0x18, 0x3e, 0xe7, 0xd3, 0xc6, 0x9f, 0xa7, 0x2b,
++ 0x90, 0xbe, 0xd0, 0x26, 0xa1, 0x57, 0xbe, 0x0c, 0xba, 0x86, 0xe4, 0x40,
++ 0x7f, 0xa5, 0xf2, 0x0d, 0x37, 0x14, 0x9f, 0x44, 0x8c, 0x82, 0xfd, 0xcb,
++ 0xea, 0xd3, 0xed, 0xa0, 0x49, 0xb3, 0x44, 0x4f, 0xfb, 0xeb, 0xad, 0xf0,
++ 0xb0, 0x0c, 0xe7, 0x57, 0x1b, 0x5b, 0xe6, 0x63, 0x1b, 0xfc, 0xf9, 0x0c,
++ 0xa6, 0xac, 0xc7, 0xea, 0x0f, 0x78, 0xdf, 0x49, 0x78, 0xed, 0x7b, 0x03,
++ 0x0f, 0x86, 0x3a, 0x24, 0xe4, 0xfc, 0x70, 0x1d, 0xb1, 0x91, 0x0b, 0x05,
++ 0xbf, 0x1f, 0x7e, 0x62, 0xc8, 0xf7, 0x87, 0x65, 0xdb, 0xd2, 0x59, 0xcb,
++ 0xb6, 0x9e, 0xf9, 0x6f, 0x7a, 0x73, 0xa6, 0xbc, 0xb1, 0x88, 0x39, 0x62,
++ 0xab, 0xd4, 0x3e, 0x99, 0xb1, 0x9f, 0xc9, 0xb3, 0xfd, 0x89, 0x57, 0x15,
++ 0x27, 0x5b, 0x7d, 0x86, 0xf7, 0x11, 0x43, 0x96, 0xf5, 0x99, 0xd8, 0x6e,
++ 0xd0, 0x37, 0x13, 0xbb, 0xc7, 0x9e, 0xb5, 0x82, 0x01, 0xe3, 0x8f, 0x34,
++ 0xc9, 0x0f, 0xa2, 0xb0, 0xdb, 0x88, 0xf1, 0xb2, 0xcc, 0x7f, 0xb9, 0x77,
++ 0x3c, 0x3f, 0x85, 0x7d, 0x89, 0x53, 0x49, 0x6b, 0x02, 0xfb, 0xe3, 0x19,
++ 0x10, 0x03, 0x6a, 0x81, 0x4e, 0x5d, 0x78, 0x3f, 0xc4, 0x4f, 0xfd, 0xfe,
++ 0xfb, 0xaf, 0x86, 0x0e, 0xe3, 0xfe, 0x0d, 0x2e, 0x4c, 0x2c, 0xe6, 0x42,
++ 0x86, 0x3d, 0x0c, 0x6c, 0xad, 0xdc, 0xfa, 0xd8, 0x58, 0x1f, 0x4f, 0x47,
++ 0x8c, 0x52, 0x0c, 0x7e, 0x20, 0x65, 0x82, 0xbc, 0xd9, 0x89, 0xfe, 0x95,
++ 0xb7, 0x53, 0xfa, 0xea, 0x7e, 0xdf, 0x87, 0x55, 0x6c, 0xf7, 0x64, 0x61,
++ 0xaf, 0xc1, 0xe6, 0x59, 0x8b, 0x92, 0xea, 0x4e, 0xda, 0x27, 0xb0, 0xdf,
++ 0x74, 0x28, 0x51, 0xcc, 0x49, 0x4c, 0x66, 0xa1, 0x2f, 0xde, 0x80, 0xec,
++ 0x5f, 0x2b, 0xc7, 0x03, 0x69, 0xec, 0xe9, 0x60, 0x61, 0x48, 0x26, 0x2f,
++ 0xe8, 0x37, 0x5f, 0xd0, 0xfb, 0x43, 0x52, 0x2a, 0x24, 0xb6, 0xcc, 0x82,
++ 0xff, 0x66, 0x0b, 0xc4, 0x17, 0xf5, 0xc6, 0x47, 0x31, 0xe3, 0x42, 0x61,
++ 0x23, 0xec, 0x83, 0xa4, 0x2e, 0xc1, 0xff, 0xb9, 0x54, 0xde, 0x02, 0x3e,
++ 0xc3, 0xfd, 0xb2, 0x83, 0x5f, 0xe8, 0xcc, 0xf2, 0x00, 0xe4, 0x9c, 0x7b,
++ 0xb1, 0x65, 0x6e, 0x33, 0xce, 0x8e, 0x38, 0x22, 0xc5, 0x8f, 0xff, 0x07,
++ 0xe7, 0xeb, 0xbf, 0xf7, 0x76, 0xb5, 0xd3, 0xb3, 0xba, 0x2f, 0xd8, 0x65,
++ 0xc4, 0x00, 0xd9, 0x7e, 0x63, 0xb7, 0xd3, 0x91, 0x76, 0x49, 0xdf, 0x43,
++ 0x3b, 0xde, 0xa1, 0x31, 0xa2, 0xf2, 0x62, 0x84, 0xf7, 0xdf, 0x59, 0x67,
++ 0xe8, 0x17, 0x6e, 0x68, 0xbf, 0x8d, 0xdf, 0x36, 0xe9, 0x74, 0xf8, 0x6b,
++ 0xe3, 0xf7, 0xc6, 0x3a, 0xd6, 0x77, 0x3b, 0x9d, 0x24, 0xd6, 0xfa, 0x9d,
++ 0x97, 0x2f, 0xc0, 0xf5, 0x2c, 0x9f, 0x59, 0xeb, 0xad, 0xcb, 0x79, 0xdb,
++ 0x30, 0x4f, 0xab, 0xb7, 0x56, 0x9b, 0xe6, 0x27, 0xcd, 0x5a, 0x88, 0x71,
++ 0x0b, 0xef, 0xad, 0xd3, 0xef, 0x8c, 0x61, 0x2f, 0xea, 0xdb, 0x7f, 0x5d,
++ 0x47, 0xdc, 0x5c, 0xa7, 0xd3, 0xa6, 0x18, 0xcf, 0x9b, 0x1d, 0x1d, 0xb8,
++ 0xe6, 0x9a, 0x1c, 0x63, 0xf2, 0xe1, 0xa5, 0x32, 0xe7, 0x67, 0x3b, 0x25,
++ 0x47, 0x35, 0x9f, 0x61, 0xb0, 0x7c, 0xa5, 0xc2, 0xfd, 0x32, 0x79, 0x4e,
++ 0xf1, 0x75, 0x33, 0x79, 0x8b, 0xdf, 0xbd, 0xf0, 0x3b, 0x39, 0xfa, 0x12,
++ 0x63, 0x32, 0x81, 0xf3, 0xbb, 0x0c, 0x9f, 0x6a, 0xc1, 0x7c, 0x13, 0x8b,
++ 0xbf, 0xfd, 0x38, 0x97, 0x10, 0x64, 0x8c, 0x32, 0x4a, 0x99, 0xc2, 0xf9,
++ 0x8d, 0xdb, 0xf2, 0xee, 0x00, 0xe5, 0x79, 0x40, 0xae, 0x54, 0xe5, 0x39,
++ 0x07, 0x79, 0xa6, 0x2c, 0xe7, 0x20, 0xd3, 0x86, 0xaf, 0xf7, 0xf1, 0x1b,
++ 0x6b, 0x84, 0xeb, 0x25, 0xf5, 0x21, 0x2e, 0x82, 0xaf, 0x6d, 0x13, 0x97,
++ 0x2b, 0x2e, 0xfe, 0x30, 0xf4, 0x5a, 0x93, 0xf7, 0x1d, 0x00, 0xae, 0xaf,
++ 0xbc, 0x28, 0xe9, 0x0b, 0x2d, 0xd8, 0x77, 0xbc, 0x9b, 0x67, 0x96, 0xbd,
++ 0xc2, 0x7f, 0x9f, 0x17, 0x89, 0x37, 0xa5, 0x3f, 0xcb, 0x6b, 0xc6, 0x79,
++ 0xeb, 0x31, 0x66, 0x10, 0x74, 0x6e, 0xc1, 0xfc, 0xdc, 0xe3, 0x72, 0xe3,
++ 0x78, 0x3f, 0x54, 0x83, 0x4f, 0xf5, 0xe9, 0xbd, 0x4a, 0xd7, 0xcc, 0xea,
++ 0x37, 0x5a, 0x46, 0x06, 0x27, 0x0a, 0xe4, 0xfb, 0x18, 0xf8, 0x96, 0x3e,
++ 0x31, 0xf9, 0x25, 0xa5, 0xe7, 0x50, 0x2a, 0x90, 0x7f, 0x43, 0x9a, 0xc3,
++ 0xc8, 0xc2, 0xb6, 0xec, 0xd1, 0xf1, 0xb1, 0x25, 0xf9, 0xee, 0x0e, 0x68,
++ 0xdc, 0x9d, 0x2d, 0xac, 0x94, 0x1e, 0xd5, 0x41, 0xdd, 0x1e, 0x6f, 0xc3,
++ 0x5e, 0x28, 0x96, 0x7b, 0xbf, 0x1c, 0x29, 0x0f, 0x82, 0x0e, 0x31, 0x79,
++ 0x06, 0x7e, 0xf3, 0x73, 0xe5, 0xbb, 0x64, 0x31, 0x82, 0x7d, 0x55, 0x65,
++ 0x6c, 0x58, 0x9e, 0x9f, 0x8d, 0x7b, 0xd7, 0x09, 0x77, 0xd1, 0xda, 0x8e,
++ 0x3d, 0x50, 0x9e, 0x28, 0x57, 0x1c, 0x17, 0x44, 0x2c, 0xc2, 0x79, 0x8f,
++ 0x18, 0xdd, 0x86, 0x79, 0x8b, 0x11, 0xca, 0x2f, 0xf7, 0x16, 0xf2, 0x64,
++ 0x96, 0x71, 0x15, 0xdf, 0xd9, 0xd8, 0xa4, 0x4c, 0xdd, 0x59, 0x24, 0x14,
++ 0x07, 0xba, 0x74, 0x06, 0xfe, 0x3c, 0xbe, 0x5c, 0xfa, 0xdf, 0x51, 0x50,
++ 0x8f, 0xc2, 0x56, 0x16, 0x60, 0x2b, 0x0b, 0xb0, 0x91, 0x90, 0x85, 0x6b,
++ 0x05, 0xd8, 0xc8, 0x02, 0x6c, 0x24, 0xf4, 0xd9, 0x9b, 0x88, 0xed, 0xde,
++ 0x00, 0x0f, 0x19, 0x5f, 0xfb, 0x30, 0x7d, 0x6d, 0xfc, 0xfd, 0x17, 0xea,
++ 0x52, 0x61, 0x78, 0xd0, 0x71, 0x00, 0x00, 0x00 };
+
+ static const u32 bnx2_RXP_b06FwData[(0x0/4) + 1] = { 0x0 };
+ static const u32 bnx2_RXP_b06FwRodata[(0x24/4) + 1] = {
+- 0x08004c28, 0x08004c28, 0x08004ba0, 0x08004bd8, 0x08004c0c, 0x08004c30,
+- 0x08004c30, 0x08004c30, 0x08004b10, 0x00000000 };
++ 0x0800458c, 0x0800458c, 0x08004504, 0x0800453c, 0x08004570, 0x08004594,
++ 0x08004594, 0x08004594, 0x08004474, 0x00000000 };
+
+ static struct fw_info bnx2_rxp_fw_06 = {
+- /* Firmware version: 4.6.16 */
++ /* Firmware version: 4.4.2 */
+ .ver_major = 0x4,
+- .ver_minor = 0x6,
+- .ver_fix = 0x10,
++ .ver_minor = 0x4,
++ .ver_fix = 0x2,
+
+- .start_addr = 0x080031d8,
++ .start_addr = 0x080031d0,
+
+ .text_addr = 0x08000000,
+- .text_len = 0x70dc,
++ .text_len = 0x71cc,
+ .text_index = 0x0,
+ .gz_text = bnx2_RXP_b06FwText,
+ .gz_text_len = sizeof(bnx2_RXP_b06FwText),
+@@ -2935,15 +2966,15 @@
+ .data_index = 0x0,
+ .data = bnx2_RXP_b06FwData,
+
+- .sbss_addr = 0x08007120,
+- .sbss_len = 0x54,
++ .sbss_addr = 0x08007220,
++ .sbss_len = 0x58,
+ .sbss_index = 0x0,
+
+- .bss_addr = 0x08007178,
+- .bss_len = 0x450,
++ .bss_addr = 0x08007278,
++ .bss_len = 0x44c,
+ .bss_index = 0x0,
+
+- .rodata_addr = 0x080070dc,
++ .rodata_addr = 0x080071cc,
+ .rodata_len = 0x24,
+ .rodata_index = 0x0,
+ .rodata = bnx2_RXP_b06FwRodata,
+@@ -2966,571 +2997,639 @@
+ };
+
+ static u8 bnx2_rv2p_proc1[] = {
+- /* Date: 02/03/2009 14:20 */
+- 0xa5, 0x56, 0x4f, 0x68, 0x14, 0x67, 0x14, 0x7f, 0x33, 0xbb, 0xb3, 0xb3,
+- 0x99, 0x9d, 0xd9, 0xdd, 0x92, 0x18, 0x96, 0x18, 0xcc, 0x1a, 0x84, 0x92,
+- 0x75, 0xb7, 0x6e, 0x6c, 0x0f, 0x42, 0x03, 0x29, 0xb9, 0x08, 0x35, 0x87,
+- 0x12, 0x11, 0x8a, 0x2d, 0x68, 0xb7, 0x22, 0x14, 0x0a, 0xa5, 0x07, 0x8f,
+- 0xa5, 0x83, 0x71, 0x53, 0x5a, 0xbc, 0xe4, 0xd0, 0x80, 0x42, 0x35, 0x27,
+- 0x5b, 0x62, 0x0e, 0x3b, 0xe0, 0xa1, 0x88, 0xe0, 0x41, 0x8f, 0x7a, 0xaa,
+- 0x7f, 0x5a, 0x28, 0x46, 0x29, 0xb5, 0x87, 0x82, 0xc7, 0xde, 0x9a, 0xe9,
+- 0xf7, 0xfe, 0x7c, 0xbb, 0x33, 0x5f, 0x66, 0x13, 0xa1, 0x42, 0xfc, 0xf1,
+- 0xbd, 0x79, 0xef, 0xfb, 0xde, 0x9f, 0xdf, 0x7b, 0x6f, 0xab, 0x00, 0x60,
+- 0x43, 0x18, 0x4d, 0x29, 0x04, 0x2b, 0x67, 0x15, 0x11, 0x00, 0x36, 0x81,
+- 0xff, 0x39, 0x3e, 0x9d, 0xc3, 0x23, 0x72, 0x3e, 0xcc, 0x10, 0x1e, 0xae,
+- 0xaa, 0xff, 0x3f, 0x85, 0xf9, 0x3a, 0x62, 0x0e, 0xe6, 0x0f, 0x22, 0x1e,
+- 0x85, 0xbb, 0xf5, 0x9a, 0xc2, 0x7f, 0x63, 0x08, 0xf1, 0x1c, 0xf4, 0x7e,
+- 0x8e, 0x4a, 0x74, 0xff, 0x96, 0xd8, 0xff, 0x9a, 0x63, 0x3c, 0xd6, 0xac,
+- 0x12, 0x3e, 0x5a, 0xc5, 0xf7, 0x4e, 0x9d, 0x82, 0x02, 0xda, 0x5d, 0x50,
+- 0x17, 0x23, 0x96, 0xd4, 0x83, 0x45, 0xb2, 0x03, 0xbb, 0xa2, 0x70, 0x12,
+- 0x9e, 0x2f, 0xa0, 0xfe, 0x1b, 0xde, 0xa5, 0x55, 0xc4, 0x12, 0x74, 0x9a,
+- 0xa8, 0x77, 0x00, 0xb2, 0xf5, 0x6a, 0x4a, 0x0f, 0xe5, 0x11, 0x84, 0x4d,
+- 0xc4, 0x11, 0x80, 0x56, 0xf2, 0x3d, 0xd7, 0x0a, 0x5b, 0x68, 0xff, 0x85,
+- 0xbc, 0xb7, 0x4f, 0xee, 0x51, 0x71, 0x47, 0x88, 0x3d, 0xb1, 0x53, 0x7f,
+- 0x2d, 0x96, 0xb3, 0xfe, 0x67, 0x4a, 0x4f, 0xc7, 0xe3, 0x73, 0xde, 0xa6,
+- 0x38, 0x1e, 0x57, 0xe2, 0x79, 0xb6, 0xaa, 0xf3, 0x86, 0xfa, 0xbf, 0xc7,
+- 0x69, 0x7d, 0xd8, 0x43, 0xff, 0x89, 0xd2, 0x4f, 0xdf, 0xcb, 0xf2, 0x5f,
+- 0x06, 0xf2, 0x99, 0xf4, 0xf7, 0xad, 0x06, 0xfa, 0xe7, 0x00, 0x34, 0x24,
+- 0x8f, 0xa4, 0xff, 0x30, 0xe6, 0x78, 0xe6, 0xe0, 0x90, 0x5d, 0x23, 0xbd,
+- 0x3c, 0xd4, 0x28, 0x3f, 0x1c, 0xef, 0x01, 0xc1, 0x25, 0xc1, 0x6b, 0x82,
+- 0x3f, 0x08, 0xc2, 0xff, 0xc4, 0xad, 0x21, 0xf2, 0x7d, 0x82, 0xfb, 0x0d,
+- 0xf9, 0x2d, 0xc1, 0xb7, 0x0c, 0x7b, 0xcf, 0x62, 0x7c, 0xac, 0xbf, 0xcb,
+- 0xf9, 0x5d, 0xc3, 0xfe, 0x4b, 0xe0, 0xfc, 0x58, 0x46, 0xde, 0x36, 0x85,
+- 0x87, 0x58, 0x77, 0xf9, 0x3e, 0xa3, 0xf5, 0x84, 0x37, 0x8d, 0xa4, 0xfe,
+- 0x8d, 0x5d, 0xf4, 0x59, 0x6d, 0x61, 0x26, 0xcb, 0xee, 0x7a, 0x2c, 0x79,
+- 0x14, 0x7b, 0xaf, 0x77, 0x67, 0x08, 0xef, 0xe7, 0x32, 0x79, 0x3f, 0x2e,
+- 0x71, 0xa8, 0xa6, 0x23, 0xfb, 0xdb, 0x16, 0xf3, 0xdb, 0x11, 0x5e, 0xee,
+- 0xc6, 0x63, 0xe1, 0xd5, 0x8c, 0xe6, 0x57, 0x9a, 0x57, 0xcc, 0x8f, 0x82,
+- 0xc1, 0x8f, 0x6f, 0xf7, 0xc8, 0x4b, 0xc9, 0x88, 0x6f, 0x39, 0xd6, 0xf9,
+- 0xb6, 0x45, 0x7c, 0xb1, 0x50, 0xa5, 0x7b, 0xbf, 0x8b, 0xe8, 0x38, 0xe6,
+- 0xaf, 0xe0, 0x39, 0x0f, 0x97, 0x23, 0x6d, 0x27, 0xfd, 0xd4, 0xd0, 0xef,
+- 0xb0, 0x7d, 0x20, 0x9f, 0x6d, 0x47, 0xfb, 0xc9, 0x72, 0x0f, 0xf0, 0x3c,
+- 0xda, 0x5b, 0x37, 0xf2, 0x56, 0xa7, 0xb8, 0x41, 0xe2, 0x07, 0x23, 0x7e,
+- 0x9d, 0xbf, 0x57, 0xc2, 0xf7, 0x49, 0x95, 0x0f, 0xfe, 0x3e, 0x05, 0xfa,
+- 0x7e, 0x9c, 0x0b, 0x45, 0x38, 0x7b, 0xbc, 0x42, 0xfe, 0x94, 0x0b, 0x7c,
+- 0xcd, 0x87, 0x15, 0xc6, 0x73, 0x1e, 0xe3, 0x9f, 0x9e, 0xca, 0x2d, 0xc4,
+- 0xf1, 0xf9, 0x12, 0x9f, 0x3f, 0x09, 0xf0, 0xde, 0x51, 0xf5, 0xb0, 0xb6,
+- 0xd7, 0x7e, 0xed, 0xe6, 0x0f, 0xbe, 0xaf, 0xdf, 0xd1, 0x7e, 0xe8, 0xf7,
+- 0xd2, 0x75, 0x19, 0xfe, 0x2e, 0x63, 0xc7, 0x4e, 0xe7, 0x21, 0x3f, 0xcb,
+- 0x78, 0xb5, 0x4d, 0x50, 0x5b, 0xf3, 0xd9, 0xee, 0x8a, 0x9f, 0xc7, 0xf3,
+- 0x3b, 0x57, 0x1e, 0xe0, 0xfd, 0xf6, 0xd1, 0xb5, 0x48, 0xfc, 0xab, 0xe8,
+- 0xba, 0x92, 0x1c, 0xa6, 0x81, 0xcf, 0x4b, 0xc2, 0x93, 0x25, 0xe2, 0x71,
+- 0x59, 0x7d, 0x42, 0x9c, 0x80, 0xd0, 0x26, 0x3d, 0xef, 0x3e, 0xd9, 0xe7,
+- 0x44, 0xae, 0xea, 0x37, 0x9d, 0xe6, 0xff, 0x16, 0xf3, 0xa2, 0x98, 0xe6,
+- 0xd3, 0x7c, 0x62, 0xce, 0x25, 0xf3, 0x61, 0xf5, 0x79, 0xb4, 0xb3, 0x8e,
+- 0xe9, 0x7a, 0x3d, 0x5a, 0xd5, 0xf9, 0x61, 0xbe, 0xb2, 0x9e, 0x2a, 0x56,
+- 0x8b, 0xd5, 0xc3, 0xb6, 0x24, 0x72, 0x56, 0xbe, 0xb7, 0x4c, 0xde, 0x66,
+- 0xf1, 0xbe, 0x6a, 0xf0, 0xb8, 0x21, 0xbc, 0x1f, 0xe9, 0xad, 0xbf, 0xd6,
+- 0x7e, 0xb8, 0x29, 0xbc, 0xaf, 0x0e, 0xf6, 0xc3, 0x26, 0xed, 0x27, 0x75,
+- 0x26, 0xf5, 0x5e, 0x98, 0x4b, 0xd5, 0xe9, 0x3d, 0xc8, 0xec, 0xef, 0xab,
+- 0x72, 0x4f, 0x5b, 0xfa, 0xbc, 0x90, 0xd8, 0x23, 0xa4, 0x5e, 0x06, 0xf2,
+- 0xc3, 0x35, 0xfa, 0x74, 0x2c, 0x96, 0x77, 0x54, 0xbf, 0x65, 0xc5, 0xeb,
+- 0xc2, 0x5f, 0xc2, 0x83, 0x0e, 0xf5, 0x93, 0x33, 0xf6, 0xf9, 0xed, 0x54,
+- 0x9d, 0x00, 0x0e, 0xea, 0xfd, 0x90, 0xf4, 0x2b, 0xb9, 0xdf, 0xf0, 0xbe,
+- 0x1a, 0x74, 0x66, 0x93, 0x7b, 0xee, 0x72, 0xbf, 0xdf, 0x03, 0xea, 0xa3,
+- 0xf2, 0x8e, 0xbe, 0xd4, 0xf3, 0xac, 0xde, 0x4c, 0xf6, 0xf7, 0x98, 0xcc,
+- 0x2f, 0x5b, 0xf6, 0x73, 0xc9, 0x8c, 0x53, 0xed, 0xbd, 0xec, 0x7a, 0x71,
+- 0xbc, 0xff, 0x6c, 0xbf, 0xde, 0xbc, 0xdb, 0xab, 0xee, 0x9e, 0x51, 0xf7,
+- 0xbf, 0xb7, 0x75, 0x1e, 0x6d, 0x27, 0x6b, 0xbf, 0x7f, 0xa0, 0xee, 0x15,
+- 0x7d, 0x99, 0x1b, 0x67, 0xea, 0x59, 0x7c, 0x2d, 0xee, 0xd0, 0x4b, 0xcf,
+- 0x2f, 0xed, 0xe7, 0xc6, 0x06, 0xd7, 0xfd, 0xa3, 0xb8, 0xbf, 0x97, 0x52,
+- 0xf3, 0x75, 0x44, 0xea, 0xac, 0xf4, 0xc8, 0xbf, 0xa7, 0xdb, 0x83, 0x79,
+- 0x9c, 0xe4, 0xcd, 0x49, 0xe1, 0xab, 0x3d, 0xb7, 0x4e, 0xfd, 0xe1, 0x76,
+- 0x5e, 0x1a, 0x75, 0x98, 0x6d, 0x62, 0xfd, 0xbf, 0x86, 0x48, 0xfc, 0xfc,
+- 0x2d, 0xe5, 0x6f, 0x20, 0xfd, 0x55, 0x80, 0x9f, 0x22, 0x1d, 0x97, 0xae,
+- 0x1b, 0xe3, 0x8f, 0x4d, 0xe9, 0x93, 0x7e, 0x7c, 0xf8, 0xee, 0xa2, 0xbc,
+- 0x5b, 0x85, 0x1b, 0x91, 0x9e, 0x63, 0x38, 0xd7, 0x5c, 0x68, 0xcb, 0xdc,
+- 0x3c, 0x2b, 0xf3, 0xeb, 0x85, 0xc7, 0xf3, 0xb1, 0x73, 0x82, 0x78, 0x08,
+- 0xe3, 0x32, 0xc7, 0x3a, 0x01, 0x9f, 0x27, 0x02, 0xfe, 0x7d, 0xd8, 0x76,
+- 0x7d, 0xd2, 0x9b, 0x08, 0x18, 0xc7, 0x4b, 0x68, 0x57, 0x83, 0x3f, 0x16,
+- 0x49, 0xbd, 0x39, 0x98, 0x63, 0xe6, 0xfc, 0x92, 0x38, 0xdf, 0x46, 0xb9,
+- 0xda, 0x93, 0xd3, 0x7c, 0xe6, 0x3a, 0xfb, 0x7d, 0x5e, 0x5f, 0x97, 0xaa,
+- 0xd4, 0x2b, 0xc9, 0x3c, 0xeb, 0x3e, 0xba, 0x69, 0xe4, 0x57, 0xd7, 0xe7,
+- 0xcd, 0x58, 0xcf, 0xf7, 0xe9, 0xe3, 0xe8, 0x6f, 0x05, 0xca, 0x2e, 0xf3,
+- 0x82, 0x51, 0xdd, 0x63, 0xbb, 0x68, 0x36, 0xd9, 0x95, 0x79, 0xd8, 0xbd,
+- 0x48, 0xd7, 0x2c, 0x76, 0xb5, 0x7c, 0x81, 0x1a, 0x61, 0x69, 0xe3, 0x1e,
+- 0xc9, 0xcb, 0x51, 0x8e, 0xe5, 0xee, 0x09, 0x9d, 0xaf, 0x0a, 0xc5, 0xbf,
+- 0xc6, 0xf9, 0xfa, 0xf8, 0x7b, 0xc6, 0xd3, 0xf0, 0x3e, 0xa1, 0x37, 0x98,
+- 0xe3, 0x45, 0x42, 0x08, 0x92, 0x73, 0xdc, 0x51, 0xee, 0x55, 0xc9, 0x9f,
+- 0x41, 0xfd, 0xcc, 0xfd, 0xb8, 0x5b, 0x1d, 0x47, 0x13, 0xfc, 0xd3, 0x75,
+- 0x34, 0xe7, 0x39, 0xf1, 0xc4, 0xe0, 0x63, 0x77, 0x08, 0x1f, 0xad, 0x21,
+- 0x7c, 0x36, 0xe7, 0xd6, 0x57, 0xd2, 0xc7, 0x79, 0x70, 0x72, 0xb4, 0x70,
+- 0xfd, 0xfc, 0x32, 0xd5, 0xd5, 0xee, 0xf2, 0x0f, 0x08, 0xdf, 0x59, 0xb1,
+- 0x28, 0x5f, 0xfe, 0x0a, 0xeb, 0xe5, 0x59, 0x5e, 0xd3, 0xf8, 0xcd, 0xb2,
+- 0xfe, 0xbd, 0xf1, 0x1f, 0xb6, 0x34, 0x9b, 0xb9, 0xa0, 0x0c, 0x00, 0x00,
+- 0x00 };
++ /* Date: 05/13/2008 13:50 */
++ 0xa5, 0x56, 0x4f, 0x48, 0x14, 0x61, 0x14, 0x7f, 0x3b, 0xfb, 0x67, 0xd6,
++ 0xdd, 0xd9, 0x9d, 0x25, 0xff, 0x6d, 0x66, 0xb8, 0x49, 0x97, 0xd5, 0x15,
++ 0xb5, 0x22, 0x3a, 0x18, 0x86, 0x17, 0x21, 0x3b, 0x84, 0x20, 0x45, 0x04,
++ 0xd9, 0x12, 0xde, 0x82, 0x0e, 0xd1, 0x29, 0x68, 0xd1, 0x34, 0x8a, 0x0a,
++ 0x16, 0x52, 0x30, 0xa2, 0xa4, 0x43, 0x85, 0x04, 0xed, 0x74, 0x0a, 0x12,
++ 0x82, 0x8a, 0x88, 0xea, 0x12, 0x78, 0xa8, 0x4b, 0x16, 0x61, 0xd0, 0xa1,
++ 0x83, 0x9d, 0xba, 0xe4, 0xf4, 0xbd, 0xef, 0xbd, 0xcf, 0x9d, 0xf9, 0x9c,
++ 0x55, 0x21, 0x41, 0x7f, 0xbc, 0x6f, 0xde, 0x7b, 0xdf, 0x9b, 0xdf, 0x7b,
++ 0xef, 0x37, 0x66, 0x00, 0xc0, 0x80, 0x92, 0xd3, 0x26, 0x10, 0x52, 0x46,
++ 0x28, 0x2e, 0x20, 0x04, 0xf0, 0x18, 0xe8, 0x27, 0x6a, 0x49, 0xbb, 0xd4,
++ 0xcd, 0x76, 0x27, 0x41, 0xa9, 0x33, 0x23, 0xfe, 0x9e, 0x85, 0xfe, 0x1c,
++ 0x62, 0x18, 0xfa, 0x77, 0x21, 0x1e, 0x84, 0x17, 0xb9, 0xac, 0xc0, 0xbf,
++ 0x2e, 0x94, 0xd0, 0x6e, 0xa8, 0x3c, 0x73, 0x92, 0x32, 0xff, 0x12, 0xc7,
++ 0x7f, 0x0a, 0x13, 0x1e, 0x28, 0xc4, 0x29, 0x0f, 0x23, 0x74, 0x65, 0x24,
++ 0x2c, 0x96, 0xd1, 0x1e, 0x19, 0x81, 0x18, 0xe6, 0x99, 0x12, 0x0e, 0x68,
++ 0xb7, 0x86, 0x4a, 0x5d, 0x5c, 0x97, 0x41, 0x7e, 0x5f, 0xca, 0x36, 0x9e,
++ 0xc3, 0xd7, 0x01, 0xb4, 0xb7, 0x27, 0x2e, 0x97, 0x11, 0xb3, 0x30, 0x16,
++ 0xb7, 0xe8, 0x7d, 0xda, 0x28, 0xed, 0x52, 0x07, 0xc6, 0x09, 0xdf, 0x0e,
++ 0xce, 0x1b, 0xc5, 0xbc, 0x3f, 0x5d, 0xca, 0x8b, 0xf9, 0xbc, 0x79, 0x5a,
++ 0x45, 0x1e, 0x3c, 0x8f, 0x71, 0x5d, 0x31, 0xad, 0xae, 0x98, 0xa8, 0x83,
++ 0x79, 0x00, 0x55, 0x07, 0x62, 0xa3, 0xb8, 0x17, 0xf3, 0xae, 0xf0, 0x7b,
++ 0x03, 0x9c, 0xca, 0x71, 0x7e, 0x07, 0xb1, 0xc2, 0xf9, 0xc4, 0x2f, 0xbf,
++ 0xc7, 0xfa, 0x3c, 0x8a, 0x27, 0x7f, 0xfd, 0x66, 0x41, 0x3d, 0x57, 0xfd,
++ 0xc0, 0x7b, 0x3e, 0x8a, 0x7b, 0xbc, 0xfe, 0xb0, 0x89, 0xff, 0x7b, 0xe1,
++ 0xef, 0xcf, 0x4b, 0xe7, 0x6f, 0xab, 0xe7, 0xf9, 0x20, 0xde, 0xa2, 0x1a,
++ 0x6f, 0x2f, 0x99, 0xb7, 0x41, 0xd8, 0x6d, 0x64, 0xa5, 0x5f, 0x04, 0x10,
++ 0x77, 0x88, 0x02, 0x10, 0x77, 0x32, 0x1e, 0x63, 0xbc, 0xc9, 0x78, 0x83,
++ 0xb1, 0x91, 0xb1, 0x81, 0xb1, 0x9e, 0x71, 0x1b, 0xe3, 0x3b, 0xc6, 0x0c,
++ 0xa3, 0xcd, 0x98, 0x66, 0x7c, 0xc3, 0x68, 0x31, 0x26, 0xb5, 0x7c, 0x2d,
++ 0x8c, 0x71, 0xc6, 0xbb, 0x8c, 0xfb, 0xb5, 0xf8, 0xdf, 0x8c, 0x0b, 0x8c,
++ 0xcd, 0x21, 0xc2, 0x43, 0x6c, 0x23, 0xa1, 0x3c, 0xf7, 0x3e, 0xbe, 0xee,
++ 0xaf, 0xf5, 0x77, 0xb1, 0xcc, 0xcf, 0xf3, 0xca, 0x2f, 0x2e, 0xf9, 0x83,
++ 0x0e, 0xaf, 0xff, 0x9d, 0x0d, 0xfc, 0xc9, 0x6d, 0x20, 0x1f, 0x14, 0x37,
++ 0xed, 0x52, 0x1d, 0xb7, 0x38, 0xbe, 0xbe, 0xb2, 0x50, 0x63, 0x8f, 0xfa,
++ 0x0a, 0xfa, 0x7c, 0x05, 0xed, 0xd1, 0x4e, 0xde, 0xa3, 0xa3, 0xeb, 0xe6,
++ 0x97, 0xe6, 0xd4, 0xbb, 0x87, 0x32, 0x4f, 0x8d, 0x39, 0x7f, 0x1a, 0x2a,
++ 0x16, 0xb2, 0x34, 0x17, 0xa5, 0x8d, 0xee, 0xc5, 0x78, 0x9e, 0xcb, 0xbc,
++ 0x9a, 0x4f, 0xff, 0x5c, 0xd2, 0x7c, 0xc5, 0xb4, 0xf9, 0xba, 0xb0, 0x09,
++ 0xbf, 0x49, 0x8d, 0xa7, 0x73, 0xae, 0xea, 0x97, 0xc1, 0xc7, 0xe3, 0xb1,
++ 0x8c, 0xcc, 0x7b, 0xcd, 0x91, 0x66, 0x83, 0x35, 0x85, 0x76, 0x04, 0xae,
++ 0x3b, 0x2a, 0x8e, 0xf7, 0xb2, 0x43, 0xdd, 0x43, 0xf1, 0x29, 0x20, 0x9e,
++ 0xe7, 0x34, 0x9e, 0x73, 0x5b, 0xd2, 0xa9, 0x15, 0xb7, 0xaa, 0x53, 0xf4,
++ 0xbc, 0x0d, 0xbc, 0x3a, 0x15, 0x87, 0xd1, 0x41, 0x5b, 0xde, 0x9b, 0x8e,
++ 0x51, 0x9a, 0xe3, 0x36, 0xe1, 0x99, 0x04, 0xe1, 0x72, 0xa2, 0x4e, 0xfc,
++ 0x75, 0xdd, 0xb1, 0x24, 0xd9, 0xa7, 0x53, 0x6a, 0x3f, 0x54, 0xbc, 0xaa,
++ 0x6b, 0xa3, 0x7a, 0xf0, 0x7e, 0x75, 0x8f, 0xaa, 0x43, 0xdd, 0xe7, 0xe7,
++ 0xbf, 0xf6, 0xbd, 0x84, 0x45, 0xc3, 0xcf, 0xc3, 0xed, 0x1e, 0xc2, 0x48,
++ 0xaf, 0x84, 0xec, 0x8c, 0x45, 0x71, 0xb3, 0x56, 0x04, 0xed, 0x7d, 0xb3,
++ 0x1f, 0x30, 0xbf, 0xb1, 0x67, 0xc6, 0xe1, 0xfa, 0x6c, 0xd5, 0x3f, 0x79,
++ 0x0e, 0xed, 0x40, 0xf6, 0x30, 0xcf, 0xc3, 0xb0, 0x9c, 0x7b, 0xb1, 0xd7,
++ 0x06, 0x62, 0x0b, 0x94, 0xa4, 0xae, 0x1b, 0x89, 0xd7, 0x32, 0x3e, 0xcc,
++ 0xe7, 0xa2, 0x4f, 0xed, 0xfe, 0x7d, 0x59, 0xa2, 0xfe, 0xc7, 0xfd, 0x73,
++ 0xd3, 0xed, 0x06, 0xcf, 0x63, 0xa2, 0x32, 0x57, 0x0e, 0xea, 0xd7, 0x73,
++ 0xd6, 0xbd, 0x2c, 0x14, 0x7b, 0x6b, 0xe9, 0xb1, 0xfa, 0x0e, 0x2a, 0x3d,
++ 0x92, 0xc7, 0x95, 0x52, 0xd8, 0xc7, 0xcb, 0x21, 0x28, 0x04, 0xe5, 0x7f,
++ 0xa2, 0xbe, 0x2f, 0x01, 0x7b, 0xb4, 0xd9, 0xbd, 0xbe, 0xfc, 0x69, 0x28,
++ 0x04, 0xed, 0x81, 0xa9, 0xed, 0x8d, 0xcd, 0x7b, 0xd3, 0xbc, 0x6e, 0x7e,
++ 0x95, 0x4e, 0xe4, 0x36, 0xd4, 0x89, 0xff, 0xd5, 0x05, 0x03, 0x48, 0x17,
++ 0x50, 0x8f, 0xfd, 0xf7, 0x9b, 0xaa, 0x7e, 0x6d, 0xff, 0xa9, 0xee, 0x3f,
++ 0xab, 0x5b, 0xd3, 0x11, 0xef, 0xfb, 0x07, 0xe9, 0x48, 0x42, 0xd3, 0x85,
++ 0x5f, 0xab, 0x55, 0x1d, 0xc1, 0xe7, 0xf3, 0xf3, 0xd4, 0x97, 0x8b, 0xee,
++ 0x9a, 0xae, 0xfb, 0xf8, 0xac, 0x63, 0x3e, 0x85, 0x9f, 0x8c, 0x5f, 0xd6,
++ 0xe2, 0x55, 0x5f, 0xcf, 0x33, 0xcf, 0x46, 0x1f, 0xcd, 0x95, 0x59, 0xfc,
++ 0xa1, 0xf1, 0xdd, 0x5b, 0xc0, 0xbd, 0xb8, 0x04, 0x0e, 0xf3, 0xf6, 0xd9,
++ 0xc7, 0x5f, 0x8a, 0xf5, 0xc1, 0x84, 0x47, 0x8e, 0xe2, 0x59, 0xf5, 0x87,
++ 0xf0, 0xa1, 0xf4, 0xcf, 0x6c, 0xc2, 0x77, 0x06, 0x1e, 0x38, 0x6a, 0xbf,
++ 0x6d, 0x99, 0xaf, 0x87, 0xf5, 0x64, 0x94, 0xf7, 0xfa, 0x5b, 0x82, 0x74,
++ 0xa3, 0x38, 0x24, 0xf7, 0x14, 0x9a, 0x78, 0xbf, 0x8b, 0x29, 0xb2, 0x5b,
++ 0x52, 0xf4, 0x7f, 0x5b, 0x8f, 0x69, 0x49, 0xbf, 0x96, 0x14, 0x61, 0x53,
++ 0x12, 0xe3, 0xb2, 0xf0, 0xfd, 0x88, 0x74, 0x2f, 0x54, 0xf7, 0x5b, 0xdf,
++ 0x6b, 0x7e, 0xdf, 0xbd, 0x78, 0xde, 0x24, 0xf6, 0xd4, 0xdb, 0x0f, 0x6b,
++ 0x4d, 0x5f, 0xef, 0x71, 0xf5, 0x39, 0xdb, 0xcb, 0xb7, 0x9a, 0xdb, 0x67,
++ 0x35, 0xfa, 0x34, 0xe8, 0x2a, 0xdd, 0x6b, 0x1f, 0xc4, 0x7a, 0x6d, 0x48,
++ 0x9b, 0x34, 0x1f, 0x84, 0x22, 0x8f, 0x61, 0x62, 0x58, 0xeb, 0x24, 0xeb,
++ 0xc4, 0xe4, 0xb8, 0x4c, 0x73, 0x64, 0x52, 0x9d, 0x0f, 0xc8, 0xc1, 0x1f,
++ 0x9e, 0x7f, 0x25, 0xcf, 0xd3, 0x4e, 0x98, 0xce, 0xcd, 0x21, 0xc5, 0x97,
++ 0x2d, 0xdf, 0x7f, 0x86, 0xf8, 0x3a, 0x39, 0x4d, 0x78, 0x02, 0x0e, 0x4b,
++ 0x4c, 0x54, 0xf5, 0x2d, 0x2e, 0x11, 0x52, 0x5e, 0x7d, 0x8b, 0x8a, 0xf2,
++ 0xd0, 0xae, 0xf3, 0xf4, 0x51, 0xff, 0x6e, 0x6c, 0xb5, 0x9f, 0x5e, 0x9d,
++ 0xc4, 0x7e, 0xea, 0x7a, 0x27, 0xe7, 0x46, 0x9b, 0xcf, 0x72, 0x8d, 0xf9,
++ 0xcc, 0xd5, 0x98, 0x6f, 0x5d, 0x2f, 0xae, 0xf2, 0xde, 0x45, 0x20, 0x1a,
++ 0x96, 0x1f, 0x24, 0x2b, 0x32, 0x21, 0xfb, 0x6b, 0x4c, 0xd2, 0x87, 0xd4,
++ 0x8a, 0x4e, 0x85, 0x24, 0x6f, 0xd6, 0x14, 0xf9, 0x45, 0xe8, 0x3c, 0xab,
++ 0xf0, 0xca, 0x84, 0xfa, 0xee, 0xfe, 0x03, 0x65, 0x6c, 0x9a, 0x59, 0x40,
++ 0x0c, 0x00, 0x00, 0x00 };
+
+ static u8 bnx2_rv2p_proc2[] = {
+- /* Date: 02/03/2009 14:20 */
+- 0xad, 0x57, 0x4d, 0x68, 0x5c, 0x55, 0x14, 0x3e, 0xf3, 0xe6, 0xef, 0xcd,
+- 0xcc, 0x9b, 0xcc, 0x34, 0x8d, 0x93, 0x31, 0x29, 0x26, 0x4d, 0x68, 0xea,
+- 0xc8, 0x44, 0xf3, 0x47, 0x05, 0x5d, 0x18, 0x46, 0x48, 0x7f, 0x2c, 0x34,
+- 0x8d, 0x2e, 0x8a, 0x9b, 0x36, 0x53, 0x3b, 0x3a, 0x6d, 0xed, 0xc2, 0xec,
+- 0xdc, 0xf8, 0xb0, 0x35, 0x41, 0x98, 0x45, 0x53, 0x4c, 0x13, 0x44, 0xa8,
+- 0xe8, 0xce, 0xdd, 0x88, 0x9a, 0xd6, 0x8d, 0x50, 0x68, 0x28, 0x76, 0x51,
+- 0x04, 0x05, 0xed, 0x42, 0x10, 0xad, 0xa1, 0x15, 0x41, 0x51, 0xb3, 0x92,
+- 0x8c, 0xf7, 0x9e, 0xef, 0xdc, 0x37, 0xef, 0x4d, 0xa6, 0xa4, 0x0b, 0x67,
+- 0xf3, 0xe5, 0xdc, 0x77, 0xee, 0xb9, 0xe7, 0xe7, 0x3b, 0xe7, 0xde, 0x64,
+- 0x89, 0x28, 0x42, 0x6e, 0xbd, 0x4f, 0x21, 0x85, 0xc2, 0x21, 0x5b, 0x41,
+- 0x83, 0x28, 0x9a, 0xd7, 0x32, 0x59, 0x24, 0xbf, 0x27, 0xb2, 0x0c, 0xdf,
+- 0xd6, 0x1d, 0xad, 0x46, 0x6e, 0x41, 0xeb, 0xd9, 0xf4, 0x92, 0x05, 0xbd,
+- 0x08, 0x69, 0x54, 0x3a, 0xae, 0xc6, 0x1d, 0x82, 0xcf, 0x08, 0x46, 0x42,
+- 0xc0, 0xb0, 0xa0, 0xd5, 0x82, 0x24, 0x7a, 0x5d, 0x22, 0x6f, 0x8a, 0xec,
+- 0x08, 0xe6, 0x65, 0xfd, 0xb4, 0xe0, 0xab, 0xb2, 0x7e, 0x47, 0x70, 0x5d,
+- 0xa1, 0xf1, 0x53, 0xcb, 0xbf, 0x35, 0x9a, 0xb2, 0x03, 0xf3, 0x05, 0xf8,
+- 0xff, 0x62, 0x3f, 0xeb, 0x37, 0x82, 0xfa, 0x77, 0x1b, 0xc6, 0x0f, 0x13,
+- 0xaf, 0x15, 0xd5, 0xfa, 0xbb, 0x27, 0x2e, 0x2f, 0x62, 0xdf, 0xf1, 0x7e,
+- 0xac, 0x3f, 0x56, 0xd4, 0x71, 0xc7, 0xc8, 0x15, 0xa4, 0x61, 0x9b, 0xe3,
+- 0x70, 0x87, 0x4d, 0xa2, 0xa0, 0xff, 0xe3, 0x22, 0xa4, 0xd9, 0x34, 0xec,
+- 0x26, 0x03, 0x76, 0x73, 0x5b, 0xec, 0x7e, 0x9f, 0xf0, 0xdb, 0xff, 0x54,
+- 0xec, 0x27, 0xb7, 0xb5, 0x5f, 0x4e, 0x03, 0x77, 0x16, 0xdb, 0x9d, 0x93,
+- 0xd8, 0xc6, 0xff, 0xd3, 0xdb, 0xda, 0x7f, 0xd3, 0xf3, 0xdf, 0xac, 0x03,
+- 0xfb, 0xf0, 0xf9, 0x13, 0xf7, 0x29, 0x93, 0x47, 0x13, 0xaf, 0xf8, 0x15,
+- 0x06, 0x4e, 0x16, 0x19, 0x6a, 0x27, 0x25, 0xb1, 0x53, 0x43, 0xfa, 0xbc,
+- 0x4e, 0x8a, 0x58, 0xda, 0xce, 0x5e, 0x3b, 0x76, 0x0d, 0xeb, 0xc7, 0x32,
+- 0xc0, 0x57, 0x24, 0x80, 0xbb, 0x49, 0x9d, 0x90, 0x46, 0xa3, 0x92, 0x12,
+- 0xfb, 0x28, 0x23, 0xb9, 0x29, 0xec, 0x5f, 0x73, 0xb4, 0x5f, 0xb7, 0x54,
+- 0xdd, 0xb4, 0x1c, 0x26, 0x37, 0x13, 0xf4, 0xff, 0x0a, 0x41, 0x6f, 0xc7,
+- 0x5e, 0xac, 0x5e, 0xac, 0x40, 0xee, 0xfd, 0x38, 0xcb, 0xfa, 0x2b, 0x75,
+- 0x13, 0x87, 0x5e, 0x57, 0xfc, 0xcf, 0xc0, 0x0e, 0x0d, 0xd8, 0x7c, 0x18,
+- 0xf2, 0xa3, 0x0e, 0x1d, 0x36, 0xf6, 0xf0, 0xbb, 0xbc, 0xc7, 0xf0, 0x09,
+- 0x72, 0x25, 0xc6, 0x90, 0x9f, 0x9d, 0xd7, 0xfe, 0x66, 0xe8, 0x84, 0xa5,
+- 0x1d, 0xb1, 0x24, 0xbe, 0xb0, 0xed, 0x7c, 0x01, 0xfd, 0xaf, 0xfa, 0x1c,
+- 0xf6, 0xad, 0x32, 0x8e, 0x7d, 0x5d, 0x63, 0xc0, 0xa5, 0xb1, 0xa8, 0x86,
+- 0x62, 0x65, 0x8e, 0xc5, 0x27, 0x7f, 0x1e, 0xb5, 0x59, 0xcf, 0x1d, 0x36,
+- 0x7c, 0x35, 0x79, 0xd7, 0xf1, 0x5e, 0x6c, 0xf2, 0x76, 0x10, 0xf9, 0xf9,
+- 0x75, 0x8f, 0xd6, 0x57, 0x49, 0x1a, 0xc0, 0x39, 0x33, 0xd5, 0x76, 0x7c,
+- 0x7f, 0x57, 0xed, 0x7b, 0xb8, 0xfa, 0x4d, 0x72, 0xdc, 0x93, 0x12, 0x7f,
+- 0xbf, 0xf0, 0x63, 0x57, 0x1b, 0x7e, 0x64, 0xf8, 0xef, 0xfb, 0xa5, 0x2c,
+- 0xe7, 0xef, 0x08, 0xd6, 0x2f, 0x4d, 0xad, 0x22, 0xcf, 0x07, 0x39, 0x7e,
+- 0x4a, 0x5e, 0xf8, 0x1c, 0xbb, 0x66, 0xd3, 0x5a, 0x7e, 0x79, 0xa2, 0xf2,
+- 0x25, 0xe4, 0x72, 0x58, 0xcb, 0xc7, 0x9c, 0x93, 0x57, 0xa1, 0x1f, 0x3d,
+- 0x9f, 0xe5, 0xbc, 0x1d, 0x91, 0x53, 0x0e, 0xaa, 0x51, 0xa1, 0x7e, 0xb5,
+- 0xd8, 0x79, 0x16, 0x9d, 0x35, 0xfe, 0x9e, 0xa5, 0x85, 0x3a, 0xbe, 0x9f,
+- 0x4b, 0xe9, 0xb8, 0xce, 0xa8, 0xb8, 0x58, 0xaf, 0xab, 0x1a, 0xc3, 0xfe,
+- 0xda, 0xa2, 0xb6, 0x17, 0xa2, 0x7b, 0x9f, 0x69, 0xf9, 0x70, 0xf1, 0x1e,
+- 0xf4, 0x8b, 0xd5, 0x79, 0x31, 0x6c, 0x21, 0x6f, 0xf7, 0x2d, 0xe8, 0x0b,
+- 0xad, 0x92, 0x11, 0xae, 0x5b, 0x88, 0x9c, 0x29, 0xe0, 0x3b, 0xfc, 0xfd,
+- 0xdf, 0x50, 0x8d, 0xf3, 0xf5, 0x7c, 0x47, 0x64, 0xd5, 0xe4, 0x47, 0x30,
+- 0x63, 0xe2, 0x02, 0x3e, 0x2c, 0x6f, 0xe7, 0x1d, 0xc3, 0x57, 0xa9, 0x57,
+- 0xe1, 0x41, 0x7c, 0x05, 0x4e, 0x0d, 0x01, 0x63, 0x83, 0x5a, 0x2f, 0xda,
+- 0x86, 0xb7, 0xc1, 0xba, 0x48, 0x5d, 0x7d, 0xfc, 0x62, 0x50, 0xbc, 0x0a,
+- 0xf0, 0x4c, 0xf1, 0x98, 0xe7, 0x90, 0xca, 0xa7, 0xe1, 0x8b, 0x36, 0x14,
+- 0xa7, 0x33, 0x62, 0xaf, 0x2a, 0x71, 0x9d, 0x95, 0xb8, 0x7e, 0x4f, 0x9a,
+- 0xbc, 0x9b, 0x78, 0x80, 0x0b, 0x5e, 0x3c, 0x86, 0x6f, 0xb8, 0x1f, 0x66,
+- 0xaa, 0x01, 0x7f, 0x6a, 0x37, 0x06, 0xf0, 0x47, 0xef, 0x20, 0xd0, 0x8b,
+- 0x73, 0x88, 0xfb, 0xa4, 0xa3, 0xfb, 0xaa, 0xf1, 0x43, 0xd7, 0x75, 0x43,
+- 0xf8, 0x6a, 0xa9, 0x78, 0xfd, 0xfd, 0xd9, 0xd3, 0xa6, 0x3f, 0x83, 0xfd,
+- 0x62, 0xe2, 0x3f, 0x97, 0xe6, 0x01, 0x34, 0x71, 0x7b, 0x3d, 0xd8, 0x0f,
+- 0xe0, 0x7f, 0xdc, 0xe3, 0x51, 0xd7, 0x3e, 0xc9, 0x93, 0x60, 0xee, 0x69,
+- 0x6d, 0x6f, 0x5a, 0xec, 0x8f, 0x88, 0x7d, 0xc7, 0xd7, 0x8f, 0xda, 0xbf,
+- 0x3e, 0xaf, 0x0f, 0x4d, 0x7d, 0x9a, 0xfd, 0x68, 0xf2, 0xc4, 0xe7, 0x17,
+- 0x6f, 0xaf, 0xeb, 0xfd, 0xbd, 0xdb, 0xf4, 0xe7, 0x23, 0x9e, 0xbd, 0xef,
+- 0xbc, 0x7e, 0xd4, 0xdf, 0x53, 0xf4, 0x9c, 0x88, 0xc1, 0x39, 0xf3, 0x87,
+- 0x9a, 0x33, 0x1c, 0x87, 0xed, 0xac, 0xca, 0x5c, 0x99, 0xd3, 0xe7, 0xe4,
+- 0xc5, 0xef, 0xbc, 0x99, 0xeb, 0xca, 0x6f, 0x99, 0x3f, 0xc7, 0xfd, 0x73,
+- 0x24, 0xde, 0xe6, 0x3c, 0xc0, 0x64, 0xb1, 0x35, 0x5f, 0xc8, 0x3b, 0xec,
+- 0xaa, 0xfc, 0x9b, 0x39, 0x30, 0x6e, 0xec, 0x43, 0x74, 0x47, 0xfd, 0xfa,
+- 0xad, 0xf5, 0x89, 0x3c, 0x60, 0x9e, 0x6d, 0x6c, 0xe2, 0xde, 0xfd, 0x67,
+- 0xb3, 0x79, 0x1f, 0x07, 0xea, 0xe8, 0x12, 0xd7, 0x3d, 0xae, 0xea, 0xcf,
+- 0xef, 0x03, 0xef, 0x9e, 0xb7, 0xa2, 0x7a, 0x5d, 0xe5, 0x42, 0x78, 0xf5,
+- 0xfa, 0xe3, 0xb2, 0xbf, 0x80, 0xb9, 0xf4, 0xda, 0x29, 0xce, 0xff, 0x7b,
+- 0x67, 0x37, 0x78, 0x3e, 0x7d, 0xf8, 0xc6, 0x35, 0x1d, 0xd7, 0xa3, 0xb4,
+- 0x3e, 0xe7, 0xb0, 0x3f, 0xa5, 0xdd, 0x50, 0xdf, 0x78, 0xb6, 0xb5, 0x1e,
+- 0x78, 0xd7, 0xa0, 0x5e, 0x4a, 0x6f, 0x36, 0x78, 0xaf, 0x36, 0xfd, 0x43,
+- 0xbf, 0xec, 0xcf, 0x40, 0xdf, 0xf4, 0x73, 0xb0, 0xae, 0x77, 0x36, 0x9b,
+- 0x73, 0xd7, 0xe4, 0x3b, 0xc8, 0xd3, 0xa3, 0xe3, 0x7e, 0xbb, 0x83, 0xb4,
+- 0x56, 0x87, 0xdd, 0x69, 0xe9, 0xc3, 0x13, 0x72, 0xf0, 0x4f, 0xc9, 0x0c,
+- 0x9f, 0x53, 0x7e, 0x81, 0x79, 0x46, 0xb9, 0x14, 0xe2, 0x2c, 0x1f, 0xc6,
+- 0xf7, 0x72, 0x1a, 0xeb, 0x3d, 0x69, 0xdc, 0x6f, 0xd3, 0x71, 0x87, 0xf5,
+- 0x7b, 0xd2, 0xc0, 0x9c, 0xf4, 0xeb, 0x9a, 0x37, 0x8f, 0x80, 0x2b, 0x31,
+- 0x7f, 0xff, 0x46, 0xe8, 0x7a, 0x4c, 0x2b, 0xa8, 0xcb, 0xba, 0x80, 0xfe,
+- 0x2b, 0x0d, 0x39, 0xfc, 0x7d, 0xa6, 0x80, 0xb9, 0x4a, 0x03, 0xc1, 0xfb,
+- 0x50, 0xfa, 0xb9, 0xa7, 0x39, 0xb7, 0xfc, 0x73, 0x2d, 0x31, 0xb6, 0x5c,
+- 0x0f, 0xde, 0x97, 0x2b, 0x31, 0xff, 0x9c, 0xd0, 0x76, 0x59, 0x54, 0xf3,
+- 0xc1, 0x3f, 0xd7, 0xc2, 0x52, 0xef, 0xbf, 0x64, 0x0e, 0xec, 0xa4, 0x9b,
+- 0x75, 0xc4, 0xb5, 0x56, 0x6f, 0xcd, 0xb3, 0x39, 0xcf, 0xd8, 0x83, 0xdf,
+- 0x26, 0x8e, 0xa6, 0x7d, 0x9c, 0x7f, 0x4a, 0xfc, 0xfc, 0x85, 0xdf, 0x21,
+- 0x39, 0x89, 0x47, 0xdb, 0xc5, 0xfa, 0x01, 0x99, 0xb3, 0xae, 0x27, 0x07,
+- 0xe7, 0xe3, 0x34, 0xfb, 0xd5, 0x49, 0x78, 0x77, 0xe4, 0xbc, 0xbe, 0x36,
+- 0xf1, 0x75, 0x8d, 0x00, 0x97, 0x46, 0x4c, 0x1d, 0x4c, 0xbd, 0x4c, 0x7d,
+- 0x50, 0xc7, 0xdc, 0x28, 0xab, 0x4d, 0x94, 0x47, 0x99, 0xa7, 0x23, 0xe5,
+- 0x3f, 0x83, 0xef, 0xb4, 0xa3, 0x45, 0xad, 0xff, 0x16, 0x7d, 0xc3, 0x7d,
+- 0x44, 0xf4, 0x83, 0x60, 0x73, 0x1e, 0x49, 0x01, 0x02, 0xef, 0xb2, 0x30,
+- 0x5d, 0x8f, 0xca, 0xf2, 0xb8, 0xe9, 0x9b, 0x60, 0xdf, 0x5d, 0xe1, 0x77,
+- 0xfa, 0xc2, 0xe6, 0xd6, 0xfe, 0x37, 0xf1, 0x69, 0xbd, 0x61, 0xe1, 0xa1,
+- 0x4d, 0xa5, 0xfd, 0x78, 0xd7, 0x74, 0xc4, 0xc1, 0xf3, 0x8e, 0xb8, 0xbf,
+- 0x4e, 0x8a, 0x0f, 0x89, 0xb8, 0x16, 0x77, 0x75, 0x26, 0x38, 0x8e, 0x4b,
+- 0x5f, 0xdf, 0xe2, 0xcf, 0x1f, 0x2d, 0xa7, 0xb0, 0xde, 0x5d, 0x82, 0xf9,
+- 0x08, 0xf3, 0x35, 0x4c, 0x17, 0xc0, 0xe7, 0x0f, 0x96, 0x80, 0xef, 0xd3,
+- 0x21, 0xd8, 0xe9, 0x7c, 0x9b, 0xef, 0x71, 0xbb, 0x1b, 0xe9, 0xac, 0x2d,
+- 0x0b, 0x4f, 0xf3, 0x16, 0xff, 0x3f, 0xd2, 0xa0, 0xb4, 0xbc, 0x5b, 0xa5,
+- 0xcf, 0xc0, 0xcf, 0x88, 0xaf, 0xce, 0xdb, 0xf1, 0x55, 0xa3, 0xa3, 0xf8,
+- 0x88, 0xed, 0xc2, 0x5b, 0xbb, 0x95, 0xb7, 0xa6, 0x8e, 0x79, 0xab, 0x2d,
+- 0x4f, 0xf7, 0x05, 0x79, 0x1a, 0x13, 0x9e, 0xfe, 0xed, 0xcd, 0xd3, 0xad,
+- 0x76, 0x31, 0xc7, 0x6f, 0xfe, 0x6f, 0xbc, 0x05, 0x1e, 0x18, 0xd4, 0xe7,
+- 0x77, 0xfb, 0xf8, 0x67, 0xfc, 0xf2, 0xcf, 0x9f, 0x43, 0x6a, 0xae, 0xfe,
+- 0x07, 0x92, 0xe2, 0x88, 0x7c, 0xe0, 0x0d, 0x00, 0x00, 0x00 };
++ /* Date: 05/13/2008 13:50 */
++ 0xad, 0x58, 0x4d, 0x6c, 0x54, 0x55, 0x14, 0xbe, 0x7d, 0xf3, 0xdb, 0x99,
++ 0x37, 0x3f, 0xb4, 0xb5, 0xbf, 0x68, 0xa1, 0x95, 0xd2, 0x92, 0x29, 0x94,
++ 0x69, 0x01, 0x95, 0x44, 0x49, 0x31, 0x05, 0x94, 0x84, 0x52, 0x5d, 0x10,
++ 0x37, 0xd0, 0x22, 0xa5, 0x83, 0x2d, 0x69, 0x28, 0x61, 0xc1, 0xc6, 0x09,
++ 0xc5, 0xe2, 0x62, 0x12, 0x2d, 0xb1, 0x14, 0x8c, 0xc1, 0x46, 0x37, 0xc4,
++ 0xb8, 0x19, 0x83, 0x52, 0xd4, 0xc4, 0x84, 0x60, 0x43, 0x70, 0x01, 0x26,
++ 0x9a, 0xe0, 0x42, 0x13, 0xa2, 0x50, 0x0b, 0x36, 0x58, 0x7e, 0x46, 0x17,
++ 0xca, 0x78, 0xef, 0xf9, 0xce, 0x7d, 0x7d, 0x6f, 0x3a, 0xb5, 0x2c, 0xe8,
++ 0xe6, 0xeb, 0xbd, 0xef, 0xdc, 0x73, 0xcf, 0xcf, 0x77, 0xcf, 0x39, 0x6d,
++ 0x54, 0x08, 0xe1, 0x16, 0xc9, 0x74, 0xb5, 0x44, 0x11, 0x32, 0x0a, 0xfc,
++ 0x12, 0xb2, 0x42, 0x78, 0xca, 0xd5, 0x5a, 0x18, 0x82, 0x7f, 0x56, 0x44,
++ 0x09, 0x7e, 0x48, 0xab, 0xef, 0x3e, 0xf1, 0xaa, 0x81, 0xef, 0x6e, 0xa1,
++ 0x30, 0x22, 0x44, 0x52, 0x61, 0x94, 0x71, 0x3d, 0x63, 0x86, 0x31, 0x58,
++ 0x00, 0x6c, 0x66, 0x7c, 0xc0, 0xfb, 0x77, 0x78, 0x7d, 0x93, 0xf1, 0x6f,
++ 0xde, 0x37, 0x19, 0x6f, 0xf3, 0xfe, 0xf3, 0x06, 0x30, 0xc1, 0xfb, 0x3f,
++ 0x4b, 0xd4, 0x76, 0xa9, 0xf5, 0x74, 0x56, 0x24, 0xe5, 0x19, 0x21, 0xc5,
++ 0x1b, 0xf4, 0xbe, 0x49, 0x90, 0x6c, 0x80, 0xdd, 0xaf, 0x2c, 0x51, 0x72,
++ 0xbf, 0xe7, 0x91, 0x53, 0xfb, 0x37, 0xb2, 0xd0, 0x3b, 0xeb, 0xaf, 0xe1,
++ 0x51, 0xe7, 0x96, 0xb6, 0x9c, 0x18, 0xc6, 0xf9, 0x9d, 0x4b, 0xb0, 0xff,
++ 0x54, 0x4c, 0xf9, 0xef, 0x15, 0x49, 0x46, 0xd1, 0xa8, 0xd0, 0x28, 0x48,
++ 0x36, 0xea, 0x40, 0x41, 0xfe, 0x97, 0x61, 0xac, 0x3a, 0x43, 0xd0, 0x1b,
++ 0x70, 0xe8, 0x2d, 0x9d, 0xa3, 0xf7, 0x5a, 0xa1, 0x5d, 0xff, 0x67, 0xac,
++ 0x3f, 0xb0, 0xa0, 0xfe, 0xae, 0x10, 0xb0, 0x38, 0x96, 0xef, 0x9e, 0xc2,
++ 0x05, 0xec, 0xdf, 0xb7, 0xa0, 0xfe, 0xc3, 0x96, 0xfd, 0x3a, 0x6e, 0xfa,
++ 0x3b, 0xb0, 0x1a, 0x62, 0x9f, 0x24, 0x57, 0xe9, 0x78, 0x6a, 0xbf, 0xd9,
++ 0x3e, 0x17, 0x70, 0x43, 0x8c, 0x20, 0xb5, 0x9b, 0x03, 0xdc, 0x56, 0xa7,
++ 0xee, 0x2d, 0x12, 0x6e, 0x43, 0xe9, 0x59, 0xee, 0xf7, 0x9e, 0xc7, 0xfe,
++ 0x8e, 0x08, 0xf0, 0x75, 0x76, 0xe4, 0x46, 0x40, 0x05, 0x26, 0x9b, 0xed,
++ 0x0e, 0xb2, 0x7e, 0xa4, 0x55, 0x24, 0x83, 0x38, 0x3f, 0x61, 0x2a, 0xfb,
++ 0x2e, 0xcb, 0xfc, 0xa9, 0xb5, 0x4b, 0x24, 0x23, 0x4e, 0x3f, 0x3e, 0x14,
++ 0x90, 0x5b, 0xb4, 0x1c, 0xbb, 0xef, 0x76, 0x63, 0x5d, 0xf5, 0x71, 0x94,
++ 0xe4, 0x4f, 0xa6, 0xb5, 0x1f, 0x6a, 0x5f, 0xbe, 0x83, 0x08, 0xf4, 0x88,
++ 0x1a, 0x3f, 0x5d, 0x86, 0x38, 0xc9, 0x4b, 0x1b, 0xb5, 0x3e, 0xfc, 0x9c,
++ 0x58, 0xa6, 0xf9, 0x85, 0x75, 0xb7, 0x97, 0xa0, 0xbc, 0x73, 0x48, 0xd9,
++ 0x1b, 0x11, 0xbb, 0x0c, 0x65, 0x88, 0xc1, 0xfe, 0xb9, 0xfc, 0xe6, 0x17,
++ 0x90, 0xff, 0xa6, 0xda, 0x24, 0xdb, 0xba, 0x9b, 0x71, 0xae, 0x24, 0x0e,
++ 0x1c, 0x89, 0x7b, 0x14, 0xc4, 0xba, 0x07, 0x68, 0xb9, 0xf2, 0xd7, 0xd5,
++ 0x7e, 0x92, 0x4b, 0x36, 0x6a, 0xfe, 0xea, 0xb8, 0x2b, 0x7f, 0xdf, 0xc9,
++ 0x5a, 0xfc, 0xaf, 0x45, 0x7c, 0x6e, 0x2e, 0x53, 0xf2, 0x32, 0x48, 0x35,
++ 0xb8, 0xa7, 0x23, 0x91, 0x8f, 0xff, 0x6f, 0xdb, 0xf8, 0xff, 0x68, 0x79,
++ 0xdc, 0x40, 0xfe, 0x6f, 0xe0, 0x38, 0x2c, 0x61, 0xbe, 0x2c, 0xce, 0xc3,
++ 0x97, 0x08, 0xfd, 0x7e, 0xab, 0x35, 0x4a, 0x71, 0xdc, 0x86, 0xfd, 0xe3,
++ 0x6d, 0xe7, 0x10, 0xef, 0x2d, 0x14, 0x07, 0x11, 0x38, 0xfa, 0x39, 0x4e,
++ 0x75, 0x86, 0xd4, 0xfa, 0xb5, 0x96, 0xee, 0x2f, 0xb1, 0xee, 0x72, 0xa9,
++ 0xf5, 0x0e, 0x73, 0xf7, 0x38, 0xe4, 0x3d, 0x83, 0x51, 0x8a, 0xdf, 0x36,
++ 0xbe, 0x65, 0x8b, 0xab, 0x40, 0x41, 0xca, 0x3b, 0x48, 0x4b, 0x73, 0x82,
++ 0xbe, 0x47, 0xc5, 0xb1, 0x34, 0xbe, 0xef, 0x0f, 0x52, 0x7d, 0x90, 0xfe,
++ 0x91, 0x5c, 0x49, 0xc2, 0x8b, 0xf3, 0xa9, 0x61, 0x3f, 0xf9, 0x3b, 0x75,
++ 0x56, 0xad, 0xb7, 0xc6, 0xa6, 0x20, 0x1f, 0x4b, 0x0c, 0xb1, 0x62, 0x03,
++ 0xf1, 0xbb, 0x65, 0x40, 0x9e, 0xe9, 0x15, 0x70, 0x53, 0xfe, 0x0a, 0x84,
++ 0xd9, 0x06, 0x7c, 0x8b, 0xbe, 0xff, 0x53, 0x90, 0xa2, 0x78, 0x6d, 0x0c,
++ 0xbb, 0xcf, 0xe9, 0xf8, 0x30, 0x46, 0xb4, 0x5f, 0xc0, 0x47, 0xe5, 0xef,
++ 0x90, 0xa9, 0x79, 0xcb, 0x79, 0x6b, 0x98, 0x8f, 0xb7, 0xc0, 0xb6, 0x3a,
++ 0xa0, 0xb7, 0x56, 0xc9, 0x79, 0xf2, 0xf0, 0xd7, 0x99, 0x17, 0xce, 0xab,
++ 0x8d, 0x67, 0x04, 0x92, 0x5f, 0x0e, 0xbe, 0x49, 0x3e, 0x53, 0x5d, 0x92,
++ 0xf1, 0xd4, 0xbc, 0x51, 0x8a, 0x7c, 0xe2, 0x0d, 0xd6, 0x97, 0x60, 0xbf,
++ 0x7a, 0xd9, 0xaf, 0xe9, 0x80, 0x8e, 0xbb, 0xf6, 0x07, 0x78, 0xcc, 0x04,
++ 0xbf, 0x3a, 0x12, 0xda, 0x2f, 0x27, 0x7f, 0xd9, 0x9e, 0xd4, 0xb7, 0x35,
++ 0xf8, 0xa5, 0xaa, 0x16, 0x68, 0xf9, 0x59, 0x47, 0xef, 0x25, 0x5c, 0x36,
++ 0xae, 0xed, 0x50, 0x79, 0xfd, 0x4b, 0xe6, 0x15, 0xf9, 0x39, 0x99, 0xb6,
++ 0xbf, 0xd3, 0xca, 0x3c, 0xef, 0xd4, 0xf9, 0x6e, 0xb4, 0xff, 0xfb, 0x43,
++ 0x54, 0x88, 0x5a, 0xae, 0x4c, 0x3a, 0xdf, 0x05, 0xf8, 0xef, 0xb3, 0x78,
++ 0x54, 0xb2, 0x96, 0xe3, 0xc4, 0x58, 0xba, 0x4e, 0xe9, 0x6b, 0x67, 0xfd,
++ 0x4d, 0xac, 0xdf, 0xb4, 0xbd, 0x4b, 0x65, 0xdf, 0x93, 0xd6, 0x7b, 0xd4,
++ 0xf9, 0x99, 0x7d, 0x97, 0x3a, 0x4e, 0x74, 0x7f, 0xec, 0xca, 0xa4, 0x3a,
++ 0x5f, 0xb5, 0xc0, 0x3b, 0x2d, 0xb6, 0xf4, 0xfd, 0x68, 0xbd, 0x47, 0xf5,
++ 0x3d, 0x28, 0x5e, 0xe0, 0xa5, 0xb3, 0xde, 0xfc, 0x29, 0xeb, 0x0d, 0xf9,
++ 0xe1, 0x37, 0xcf, 0x71, 0x7d, 0x19, 0x50, 0xf7, 0x94, 0xb3, 0xdd, 0xe5,
++ 0xba, 0xce, 0x4b, 0xbb, 0xb9, 0x0e, 0xed, 0xb4, 0xd7, 0x13, 0x8f, 0xad,
++ 0x2e, 0xa8, 0xb5, 0x2b, 0x4f, 0x9f, 0x74, 0xc4, 0x33, 0x29, 0x22, 0x98,
++ 0x03, 0x92, 0x11, 0x25, 0x7f, 0x4f, 0xcc, 0xad, 0x2b, 0xb9, 0xf6, 0x23,
++ 0x1e, 0x9d, 0x46, 0x88, 0xe4, 0xae, 0xf7, 0xab, 0x73, 0xd7, 0xac, 0x3e,
++ 0x8e, 0x3a, 0x73, 0x91, 0xed, 0x5d, 0xcc, 0xf6, 0x4a, 0x7d, 0x8d, 0xc4,
++ 0x53, 0xff, 0xf5, 0x7e, 0xbb, 0xbd, 0x77, 0x1e, 0xce, 0x7f, 0x9f, 0x33,
++ 0xef, 0xfd, 0xdc, 0x6f, 0xb8, 0x4f, 0xfa, 0x77, 0x7f, 0xa5, 0xed, 0xe1,
++ 0x7b, 0x23, 0xfa, 0x7e, 0x93, 0xf2, 0x32, 0x39, 0xa0, 0xce, 0x87, 0x05,
++ 0xd3, 0x44, 0xf4, 0xd5, 0xa3, 0xae, 0x4d, 0xef, 0x81, 0xfd, 0x7d, 0x75,
++ 0xea, 0xfe, 0x16, 0x81, 0x7e, 0xe3, 0x96, 0x21, 0x45, 0x7d, 0xbf, 0x38,
++ 0x9c, 0x2f, 0x8f, 0x5f, 0xb3, 0xdc, 0x38, 0xfb, 0x15, 0x65, 0xbf, 0x36,
++ 0x4b, 0xbf, 0x28, 0xee, 0xfc, 0x3d, 0x9f, 0xdf, 0x6c, 0xa7, 0xd0, 0xfd,
++ 0x9b, 0xcf, 0x91, 0x5c, 0x0f, 0xcb, 0xb9, 0xe7, 0xed, 0xdb, 0x99, 0xe5,
++ 0x54, 0x87, 0x4f, 0x1f, 0xa6, 0x7a, 0x1a, 0xb2, 0xf8, 0xe6, 0xb4, 0x6f,
++ 0xe2, 0x31, 0xc4, 0x51, 0xc9, 0x2d, 0x12, 0x7b, 0xc3, 0xf3, 0xc5, 0xcb,
++ 0xad, 0xb6, 0xc7, 0x66, 0xc6, 0x75, 0xbc, 0x4d, 0xf2, 0x73, 0x72, 0x80,
++ 0xe6, 0xc2, 0x9c, 0x38, 0x1a, 0xb6, 0x38, 0x42, 0x1e, 0xf3, 0x4a, 0xbe,
++ 0xf8, 0xe5, 0xeb, 0x8b, 0x9f, 0x3e, 0xd4, 0x7c, 0x3a, 0xe2, 0xd5, 0xf6,
++ 0x2b, 0x5c, 0x65, 0xe5, 0xf3, 0x00, 0xcf, 0x23, 0x19, 0x93, 0x7e, 0x89,
++ 0x4f, 0xa7, 0x68, 0x69, 0x56, 0x9c, 0x51, 0x72, 0x2b, 0xe2, 0x07, 0xd8,
++ 0xce, 0xcb, 0x2e, 0xf8, 0xd1, 0xb3, 0x07, 0xeb, 0x2b, 0x5c, 0xdf, 0xee,
++ 0x72, 0x9d, 0xda, 0xee, 0x07, 0x4e, 0xd7, 0x93, 0x7f, 0xf1, 0x03, 0xe7,
++ 0xb5, 0x7e, 0xd2, 0x6b, 0x66, 0x38, 0x3e, 0x2f, 0xba, 0xd8, 0xee, 0x1a,
++ 0xca, 0x47, 0xfc, 0x0e, 0xbd, 0x4f, 0xb7, 0x68, 0x5d, 0xaa, 0xb0, 0x42,
++ 0xc6, 0x81, 0xed, 0x59, 0x0f, 0xec, 0xf0, 0x71, 0x5c, 0x1b, 0x72, 0xf3,
++ 0x85, 0x6d, 0x6f, 0x0d, 0x9f, 0xef, 0xc4, 0xda, 0xc7, 0xf5, 0x65, 0x94,
++ 0xed, 0x7a, 0xaf, 0x1e, 0x18, 0x6e, 0x40, 0x7f, 0x9c, 0x34, 0x15, 0x46,
++ 0xe2, 0x03, 0xe3, 0xf0, 0xa7, 0x77, 0x23, 0xfc, 0xbd, 0xc7, 0x71, 0x60,
++ 0x0c, 0x9f, 0x1a, 0xa4, 0xbe, 0x19, 0x1e, 0x42, 0x7f, 0x0d, 0x7b, 0x07,
++ 0xe1, 0x47, 0x6f, 0x06, 0xeb, 0x7b, 0xcf, 0x02, 0x1f, 0x3c, 0x87, 0x73,
++ 0x07, 0x0f, 0x73, 0x7c, 0x36, 0xe6, 0x3f, 0xd7, 0x73, 0x1f, 0x72, 0x7d,
++ 0xf5, 0xd4, 0xe7, 0xc7, 0xb8, 0xef, 0x8a, 0x04, 0xf7, 0xf9, 0x0c, 0xaf,
++ 0xf7, 0x71, 0x1f, 0xb9, 0xcd, 0x7d, 0xb2, 0x37, 0xa7, 0x4f, 0x4e, 0xa1,
++ 0x6e, 0x8e, 0x65, 0x52, 0x6a, 0x43, 0xd6, 0xaf, 0x42, 0xdd, 0x1f, 0x15,
++ 0x06, 0xe2, 0x65, 0x9c, 0xaf, 0x92, 0x35, 0xc0, 0x91, 0x35, 0xe8, 0x6b,
++ 0xbd, 0x87, 0x38, 0x2e, 0x2d, 0x94, 0x9f, 0x95, 0x33, 0xe3, 0x9a, 0x0f,
++ 0x34, 0x3f, 0x3d, 0xd4, 0xbc, 0x43, 0xfd, 0xca, 0x58, 0xf5, 0x76, 0x8a,
++ 0xec, 0xab, 0x1a, 0xcb, 0x90, 0x7c, 0xa5, 0x28, 0x26, 0x7e, 0x55, 0x84,
++ 0x67, 0x60, 0x6f, 0x7c, 0x94, 0xfd, 0xec, 0x7f, 0x06, 0x78, 0x88, 0xf3,
++ 0xac, 0xf3, 0x77, 0x75, 0x9d, 0x49, 0xe7, 0x26, 0x07, 0x60, 0xb7, 0xe6,
++ 0x7d, 0xee, 0x9c, 0xa7, 0xf3, 0x5e, 0xd1, 0x4c, 0x6b, 0xd1, 0x73, 0x50,
++ 0xdd, 0x13, 0x92, 0xf9, 0x52, 0x76, 0xc9, 0x58, 0x70, 0x7f, 0x74, 0xf2,
++ 0x41, 0xf1, 0x45, 0xf3, 0xd2, 0xce, 0x23, 0x3b, 0x4f, 0x9c, 0xfc, 0x08,
++ 0x53, 0x3d, 0x97, 0x8f, 0x97, 0xfa, 0xa7, 0x37, 0x3e, 0x3a, 0xfc, 0xff,
++ 0xf1, 0x3a, 0x85, 0x78, 0xc5, 0xd9, 0x6e, 0x33, 0x41, 0x73, 0xd6, 0x13,
++ 0x62, 0x88, 0xf3, 0x35, 0x55, 0xcf, 0xef, 0xb5, 0x06, 0xf9, 0xea, 0x7f,
++ 0x1a, 0xf6, 0xf4, 0xf3, 0x3b, 0xf9, 0x83, 0xfb, 0x39, 0xf2, 0xec, 0x33,
++ 0xbb, 0xc7, 0x39, 0xaf, 0xcc, 0xb7, 0x7d, 0x1c, 0x87, 0xdb, 0x88, 0x83,
++ 0xa9, 0xe3, 0x90, 0xb0, 0xe2, 0xa0, 0xeb, 0x83, 0x5d, 0x4f, 0x91, 0xe4,
++ 0x0b, 0xd5, 0x19, 0xf3, 0x2a, 0xcd, 0x27, 0x1e, 0xf6, 0x5b, 0xca, 0x35,
++ 0x2b, 0xff, 0xc2, 0xec, 0x5f, 0x48, 0xec, 0x5d, 0x69, 0x3f, 0x17, 0xe4,
++ 0x73, 0x01, 0x79, 0x0e, 0xfb, 0x78, 0x8f, 0xe6, 0x3c, 0xf1, 0x55, 0x71,
++ 0xd4, 0x7a, 0x73, 0xdf, 0x9d, 0x3d, 0x9e, 0x54, 0x51, 0xe9, 0x07, 0x75,
++ 0x46, 0xe6, 0x8d, 0xea, 0x91, 0x69, 0xd5, 0x99, 0xbb, 0x54, 0x7f, 0x03,
++ 0xa7, 0xfb, 0x50, 0x17, 0x4e, 0xf7, 0x9d, 0xe1, 0xfe, 0xc7, 0x71, 0x69,
++ 0xa7, 0xb9, 0x58, 0xc6, 0xae, 0xc6, 0x59, 0x67, 0x9c, 0x76, 0x54, 0xd9,
++ 0xec, 0xd0, 0xf7, 0xce, 0xd7, 0x97, 0x31, 0xaf, 0x6d, 0xa2, 0xbe, 0xec,
++ 0xb7, 0xe6, 0x49, 0x67, 0xbd, 0xf7, 0x3f, 0x72, 0xbd, 0xdf, 0xde, 0x6c,
++ 0xd7, 0x5f, 0x2b, 0x26, 0xd2, 0xd0, 0xdf, 0xce, 0xfd, 0x72, 0x17, 0xbf,
++ 0xdb, 0xeb, 0x81, 0x08, 0xdd, 0xd7, 0xf5, 0x32, 0xf9, 0x27, 0x4a, 0x83,
++ 0xf0, 0xa7, 0x6b, 0x2b, 0xbe, 0x77, 0x85, 0xb0, 0x5f, 0x19, 0xc2, 0xdf,
++ 0x5b, 0xed, 0x3e, 0x93, 0xe4, 0x2b, 0x43, 0xc0, 0x52, 0x7e, 0xef, 0x13,
++ 0xd6, 0x5c, 0x0c, 0x3c, 0xe9, 0xb5, 0xcf, 0x8f, 0x6e, 0x71, 0xc1, 0x8b,
++ 0xf7, 0x2f, 0x1a, 0x30, 0x07, 0xb6, 0xd6, 0x99, 0xf4, 0xbd, 0xa3, 0x01,
++ 0xfd, 0x12, 0xf5, 0x75, 0xf6, 0xef, 0x33, 0x9e, 0x2b, 0x2b, 0x67, 0xe7,
++ 0x67, 0xfb, 0x7c, 0x5d, 0x18, 0x1f, 0xb5, 0xe6, 0x5c, 0x7d, 0x9f, 0xfd,
++ 0xfd, 0x28, 0xbd, 0xb4, 0x94, 0x73, 0xaa, 0x7d, 0xbe, 0x76, 0xe9, 0x79,
++ 0x87, 0xe7, 0xd1, 0x62, 0x71, 0x29, 0x0d, 0xbf, 0x26, 0xd2, 0xf9, 0xde,
++ 0xa1, 0xba, 0x4f, 0xeb, 0x83, 0xdd, 0xda, 0x8f, 0x59, 0xfd, 0xb8, 0x7f,
++ 0x0f, 0xdb, 0xf9, 0x1b, 0xfd, 0x5d, 0x5c, 0xca, 0xfe, 0x28, 0xbd, 0xd8,
++ 0xdf, 0xcc, 0xf3, 0x7e, 0xd2, 0x5a, 0x3b, 0xe7, 0xf4, 0x76, 0xb2, 0xab,
++ 0x88, 0xfb, 0x69, 0xa9, 0xad, 0xdf, 0x43, 0xbe, 0xa4, 0x09, 0x38, 0xd2,
++ 0xa4, 0xf3, 0xa0, 0xf3, 0xa5, 0xf3, 0x83, 0x3c, 0x96, 0xae, 0x26, 0xb1,
++ 0x96, 0xae, 0xd5, 0xf4, 0x60, 0x9b, 0xba, 0x66, 0x9c, 0xff, 0x3f, 0xd8,
++ 0x1e, 0x53, 0xf2, 0x6f, 0x8a, 0xef, 0x63, 0x68, 0x80, 0x3f, 0x31, 0xce,
++ 0xce, 0xc5, 0x9c, 0x00, 0x6b, 0x1e, 0xc1, 0x7d, 0x17, 0x3c, 0xbc, 0xdd,
++ 0xac, 0xe7, 0x46, 0x67, 0xff, 0xfe, 0x90, 0xea, 0xf2, 0xd9, 0x7f, 0x73,
++ 0xe7, 0xce, 0xd9, 0xf9, 0x51, 0xfb, 0xa9, 0xe4, 0x1b, 0x99, 0x8f, 0x7e,
++ 0xd1, 0xba, 0x09, 0x7f, 0x6f, 0x87, 0x7d, 0xe0, 0x7d, 0xd8, 0x67, 0xcf,
++ 0x97, 0xe4, 0x45, 0x21, 0x3d, 0xf0, 0xc5, 0x45, 0x85, 0xe4, 0xcf, 0xf1,
++ 0xcb, 0xdf, 0xd1, 0xe7, 0x8f, 0x46, 0x83, 0xd8, 0x2f, 0x6b, 0x85, 0x7a,
++ 0x37, 0xf1, 0xd6, 0x25, 0x8e, 0x82, 0xd7, 0x1f, 0x8c, 0x00, 0xdf, 0x17,
++ 0x2f, 0x41, 0x4f, 0xd1, 0x11, 0xea, 0x73, 0xfe, 0x32, 0x84, 0x35, 0x35,
++ 0xca, 0x7c, 0x2d, 0x37, 0xe8, 0xff, 0x65, 0x59, 0x11, 0xe2, 0xff, 0xab,
++ 0xf0, 0xbb, 0x03, 0x4f, 0xdd, 0xb6, 0x7c, 0x2f, 0xc4, 0x5b, 0xaa, 0x1f,
++ 0x92, 0x97, 0x38, 0xce, 0xfc, 0xf5, 0xe7, 0xf2, 0x57, 0xc7, 0xa5, 0xdc,
++ 0xc8, 0xcb, 0xd7, 0xb5, 0x4e, 0xbe, 0x7a, 0x99, 0xaf, 0xf7, 0xad, 0xfe,
++ 0x36, 0x57, 0x2f, 0xfe, 0xae, 0xb8, 0xf4, 0xd8, 0xf8, 0x0b, 0xdc, 0x5c,
++ 0xab, 0xee, 0x2f, 0x9b, 0x33, 0x77, 0x56, 0x0b, 0x7b, 0x3d, 0x3a, 0x24,
++ 0xf3, 0xfd, 0x1f, 0xfe, 0xac, 0x5e, 0x92, 0x80, 0x14, 0x00, 0x00, 0x00 };
+
+ static u8 bnx2_TPAT_b06FwText[] = {
+- 0xbd, 0x58, 0x6d, 0x70, 0x5c, 0xd5, 0x79, 0x7e, 0xce, 0xbd, 0x77, 0xb5,
+- 0xd7, 0xd2, 0x4a, 0xba, 0xb2, 0xd6, 0x66, 0x5d, 0xdc, 0xfa, 0x1e, 0x74,
+- 0x57, 0x52, 0x58, 0x01, 0x77, 0x6d, 0x01, 0xeb, 0xe6, 0xb6, 0xbe, 0xc8,
+- 0xb2, 0xbc, 0xfe, 0x00, 0xe4, 0xc0, 0x4c, 0xe4, 0x96, 0x8e, 0x37, 0xc6,
+- 0x18, 0xd9, 0x90, 0xa9, 0x28, 0xfc, 0x58, 0x37, 0x4c, 0xbd, 0x95, 0x65,
+- 0x63, 0xc3, 0x4a, 0x6b, 0x0c, 0xb1, 0x4c, 0xda, 0x99, 0x78, 0x84, 0xb1,
+- 0x4c, 0x22, 0x7b, 0x0d, 0xe4, 0x07, 0x49, 0xc3, 0xa0, 0xc1, 0x0e, 0x08,
+- 0x06, 0xf3, 0x31, 0x6d, 0x67, 0x98, 0xe9, 0xa4, 0xf5, 0x18, 0xf3, 0x11,
+- 0x92, 0x18, 0x87, 0x4e, 0x3a, 0xa2, 0x10, 0x9f, 0x3e, 0x67, 0x77, 0xc5,
+- 0x57, 0x32, 0xd3, 0xfe, 0xaa, 0x66, 0x56, 0x7b, 0xf7, 0xec, 0xf9, 0x78,
+- 0xcf, 0xfb, 0x3e, 0xef, 0xf3, 0x3e, 0xef, 0x5e, 0x21, 0x50, 0x8f, 0xda,
+- 0x5f, 0x23, 0x5f, 0xdd, 0xdf, 0x1a, 0xba, 0x2f, 0x7d, 0xf5, 0x75, 0x57,
+- 0xf3, 0xf1, 0x3a, 0xe1, 0xd4, 0x59, 0xf8, 0x7f, 0xfc, 0x33, 0x01, 0x67,
+- 0xce, 0x0e, 0xfd, 0x82, 0x6d, 0x04, 0x85, 0xcb, 0x7b, 0x3c, 0xd8, 0x66,
+- 0x10, 0x77, 0x6f, 0xf7, 0x80, 0x70, 0x2a, 0xe5, 0xae, 0xc4, 0xef, 0x54,
+- 0x21, 0x6e, 0x41, 0x8f, 0xff, 0x71, 0xf0, 0xe9, 0x35, 0xcf, 0x5d, 0x2f,
+- 0x2f, 0x1e, 0x36, 0x61, 0x3b, 0xc1, 0x5e, 0xcb, 0x69, 0x87, 0xbd, 0x98,
+- 0x6b, 0xfe, 0xb1, 0xe3, 0x2f, 0x04, 0x9a, 0xe6, 0xf6, 0x52, 0x6a, 0xc4,
+- 0x8f, 0x62, 0xd8, 0x4f, 0x60, 0x77, 0xc9, 0x40, 0xe8, 0x44, 0xb1, 0xcb,
+- 0x9b, 0x55, 0x5b, 0x7c, 0xe9, 0xef, 0x86, 0x5a, 0x72, 0xda, 0x97, 0x89,
+- 0x5e, 0x13, 0xe1, 0x77, 0xbc, 0xc5, 0xd8, 0x5d, 0x4e, 0x60, 0xa4, 0x6c,
+- 0xe3, 0xac, 0x39, 0x82, 0xde, 0xf2, 0xdc, 0x3a, 0x97, 0xeb, 0x3a, 0xb1,
+- 0xe7, 0xcb, 0x6b, 0xdd, 0xdd, 0x48, 0x25, 0xf6, 0xc0, 0x40, 0x2e, 0xee,
+- 0x71, 0x5d, 0x9b, 0xbb, 0x07, 0xb2, 0x93, 0xfb, 0x14, 0xea, 0xba, 0x5d,
+- 0xee, 0x51, 0xe0, 0x7a, 0xe9, 0x1e, 0x85, 0xde, 0x2b, 0xc3, 0xcf, 0x6f,
+- 0xa9, 0xe7, 0x3a, 0x16, 0xe3, 0x19, 0xee, 0xff, 0x74, 0xd9, 0xc1, 0xc9,
+- 0xb2, 0x87, 0xe7, 0xcb, 0x2e, 0x7e, 0x54, 0x8e, 0xe3, 0xa9, 0xb2, 0x9d,
+- 0xb3, 0x03, 0xf4, 0xc7, 0x47, 0x77, 0xaa, 0x84, 0x87, 0xc2, 0x1f, 0x05,
+- 0xde, 0xa1, 0x43, 0x46, 0x2c, 0xf3, 0x37, 0xd7, 0xa1, 0x7f, 0xfe, 0x71,
+- 0x1b, 0x1b, 0x4a, 0x8b, 0x73, 0xd1, 0x00, 0x9c, 0x23, 0xe0, 0x5f, 0x67,
+- 0xa3, 0x9f, 0x7b, 0x14, 0xb8, 0x7f, 0x58, 0x1e, 0xe1, 0xcb, 0xc6, 0xbb,
+- 0x45, 0xdb, 0x6e, 0x1e, 0x5d, 0xa8, 0xe7, 0xe0, 0x57, 0xc5, 0x8b, 0xea,
+- 0x42, 0xda, 0xc1, 0x2b, 0xcb, 0x95, 0x6a, 0x0c, 0x50, 0x68, 0xe8, 0x2e,
+- 0xc0, 0x0c, 0x64, 0x76, 0x9d, 0x29, 0xd0, 0x7b, 0x95, 0xd7, 0x39, 0x2a,
+- 0x6e, 0xb9, 0xc5, 0x08, 0x60, 0x8b, 0xc0, 0xb5, 0xda, 0xa6, 0x32, 0xd8,
+- 0x57, 0xe6, 0xbd, 0x68, 0xcf, 0x48, 0x19, 0xe1, 0x5f, 0x76, 0x98, 0x98,
+- 0x88, 0xe3, 0xfe, 0xb7, 0xbb, 0x2d, 0x7c, 0x5c, 0x94, 0x89, 0x4e, 0xf3,
+- 0x7e, 0xec, 0x2c, 0xe6, 0x71, 0x47, 0x11, 0x05, 0x23, 0x18, 0xc2, 0x37,
+- 0xba, 0x03, 0xde, 0x33, 0xc4, 0xf7, 0xcb, 0xb0, 0x5b, 0x83, 0xd3, 0x97,
+- 0xdf, 0xdb, 0x2e, 0x0f, 0x87, 0x06, 0x90, 0x1d, 0x03, 0xfa, 0x4a, 0x02,
+- 0xa7, 0x32, 0x02, 0x5b, 0xfc, 0xcb, 0x50, 0x70, 0xba, 0xb1, 0xb7, 0x2c,
+- 0xb3, 0x05, 0x7e, 0x77, 0xd5, 0x28, 0xec, 0x45, 0xc1, 0x6d, 0xd6, 0xf2,
+- 0x12, 0xec, 0x96, 0x60, 0xc0, 0x4a, 0x8f, 0xb5, 0xcd, 0x1e, 0x13, 0x32,
+- 0xbf, 0xc2, 0x94, 0x21, 0x20, 0x33, 0x9d, 0x46, 0xaa, 0xa0, 0x84, 0x1c,
+- 0xba, 0x08, 0x6d, 0xd3, 0x6d, 0xd6, 0x35, 0x53, 0xfa, 0x7d, 0xc0, 0xba,
+- 0x7a, 0x0a, 0x58, 0xcf, 0x3d, 0x1f, 0x5a, 0x2e, 0xb0, 0x3d, 0xfd, 0x6b,
+- 0x15, 0x2e, 0x90, 0xe1, 0x61, 0xd1, 0x8d, 0xd1, 0x32, 0x70, 0xd3, 0x18,
+- 0xec, 0x18, 0xe7, 0x16, 0xb9, 0x77, 0x3d, 0xe7, 0xae, 0x1d, 0x6d, 0x1b,
+- 0x9c, 0x11, 0x92, 0x77, 0x93, 0x03, 0x40, 0xca, 0x3f, 0x0e, 0xe9, 0xae,
+- 0x13, 0xd2, 0xd9, 0x53, 0xdb, 0x33, 0x59, 0xdb, 0xf3, 0x8a, 0x29, 0x5b,
+- 0xac, 0x2a, 0x41, 0xf4, 0x96, 0xe0, 0x3e, 0xe9, 0x83, 0x77, 0x89, 0xf1,
+- 0xde, 0xf5, 0x70, 0x5b, 0xa4, 0x7f, 0x98, 0x73, 0xa3, 0x41, 0x97, 0xf5,
+- 0x5e, 0x51, 0xe0, 0x43, 0x4f, 0xcf, 0xef, 0xd2, 0xb6, 0x84, 0x4e, 0x90,
+- 0x11, 0xfd, 0xe5, 0xfd, 0x73, 0x39, 0x62, 0x9c, 0xf4, 0xe3, 0xc0, 0x42,
+- 0x34, 0xb7, 0x78, 0xf3, 0xf1, 0xb0, 0x83, 0xc6, 0xa8, 0xb7, 0xcc, 0x78,
+- 0xc0, 0xa9, 0xc3, 0x49, 0xff, 0xb7, 0x0a, 0xdf, 0xd0, 0xf3, 0x81, 0x6f,
+- 0x3f, 0xe2, 0x20, 0xe6, 0x5d, 0xc4, 0xd1, 0xf4, 0x36, 0xe3, 0x55, 0x67,
+- 0x08, 0x4d, 0xde, 0xcf, 0x8d, 0xd7, 0x9c, 0x38, 0x1e, 0xe2, 0x7d, 0xee,
+- 0x4c, 0xc6, 0xf1, 0x40, 0xf9, 0xab, 0xfb, 0x5a, 0x22, 0x3b, 0xfe, 0x8e,
+- 0x42, 0x4b, 0x65, 0x7d, 0xf8, 0xac, 0x3f, 0x01, 0x5c, 0xa6, 0xc7, 0xf3,
+- 0x62, 0x63, 0xe9, 0x92, 0x72, 0xa3, 0x19, 0x3c, 0x50, 0xb2, 0x31, 0x8f,
+- 0x76, 0x45, 0x3c, 0x1b, 0x6f, 0x17, 0xf3, 0x62, 0x55, 0x39, 0x14, 0x6b,
+- 0x26, 0x7b, 0x44, 0x38, 0x69, 0x89, 0x9e, 0x71, 0x10, 0x9b, 0x4a, 0xad,
+- 0xf1, 0x05, 0xfe, 0xc3, 0xff, 0x57, 0xe3, 0x6c, 0xab, 0x0c, 0x5d, 0x71,
+- 0x49, 0x79, 0x49, 0x03, 0xf5, 0x5e, 0x9f, 0x58, 0x3b, 0xa9, 0xd4, 0x5e,
+- 0x3f, 0x2b, 0x7a, 0x27, 0x61, 0x37, 0x04, 0x81, 0x75, 0xd7, 0xe8, 0x69,
+- 0x23, 0xb7, 0x20, 0x86, 0x52, 0xc9, 0xc5, 0x29, 0x5f, 0xe3, 0x77, 0x1e,
+- 0x2c, 0x4f, 0xf0, 0x85, 0xd8, 0x19, 0x1f, 0x56, 0x8c, 0xcf, 0x53, 0x1b,
+- 0x2c, 0x8c, 0x74, 0xaf, 0xad, 0xac, 0x89, 0x10, 0x2b, 0x4f, 0x14, 0xb3,
+- 0x30, 0x88, 0xbf, 0x45, 0x41, 0x72, 0x76, 0x82, 0x98, 0x7f, 0xcb, 0x4f,
+- 0x76, 0x7e, 0x6c, 0x92, 0x1c, 0x5a, 0x65, 0x82, 0x86, 0x0a, 0x2b, 0x48,
+- 0x76, 0x1e, 0x81, 0x80, 0xe9, 0x59, 0x78, 0xc5, 0x8f, 0x20, 0xdc, 0x60,
+- 0x63, 0x17, 0x71, 0x55, 0xc7, 0xf1, 0xa3, 0x95, 0x71, 0xfd, 0x19, 0xce,
+- 0xaa, 0xf2, 0x57, 0x73, 0x9e, 0xe3, 0xa5, 0x36, 0xe4, 0x2a, 0x79, 0x0f,
+- 0x67, 0x1d, 0xef, 0xfb, 0xad, 0x88, 0x7e, 0xfc, 0x93, 0xcf, 0xc6, 0x6e,
+- 0xa4, 0x9d, 0x66, 0xe0, 0xe5, 0x1e, 0x17, 0x8b, 0x50, 0x68, 0x01, 0xed,
+- 0x36, 0x70, 0x21, 0xbd, 0x10, 0xd3, 0x2d, 0xfa, 0xeb, 0xb8, 0xd3, 0x3f,
+- 0xde, 0xaa, 0x63, 0xa2, 0xf7, 0x72, 0x56, 0x8d, 0x2b, 0xf5, 0xbc, 0x5f,
+- 0x87, 0xd9, 0x8e, 0xe1, 0x19, 0x66, 0x89, 0xbf, 0x88, 0x39, 0xf9, 0x12,
+- 0xcf, 0x6f, 0x59, 0x66, 0xc2, 0x5c, 0xe6, 0x9a, 0xee, 0x7c, 0x60, 0xa2,
+- 0xa8, 0x39, 0x41, 0xce, 0xbe, 0xc4, 0xff, 0xe7, 0xca, 0x1a, 0x9f, 0x3e,
+- 0xf1, 0x29, 0xd0, 0xde, 0xa1, 0xe3, 0xee, 0x5b, 0xed, 0xc4, 0xde, 0x76,
+- 0xfa, 0x33, 0xc2, 0x3c, 0x78, 0x90, 0xf6, 0x9e, 0x2b, 0x7e, 0xcf, 0x58,
+- 0xe5, 0x48, 0x57, 0x9f, 0xf0, 0x4e, 0x11, 0xe2, 0x79, 0xff, 0xef, 0xb4,
+- 0x8f, 0x5d, 0x6e, 0x4b, 0xcc, 0xdc, 0x47, 0xcc, 0x68, 0xee, 0x59, 0x6f,
+- 0x39, 0x63, 0x72, 0xe0, 0x7d, 0x1a, 0x91, 0x08, 0x86, 0xac, 0x44, 0x29,
+- 0xb5, 0x77, 0x90, 0xdf, 0xdb, 0x41, 0xd6, 0xb2, 0x47, 0x65, 0x9e, 0xe7,
+- 0xe5, 0x2c, 0x43, 0x26, 0x9a, 0xcd, 0xd4, 0xd0, 0x88, 0x90, 0x83, 0xcd,
+- 0x42, 0xf6, 0xdf, 0x03, 0xe9, 0x9c, 0x10, 0xfa, 0xcc, 0xf5, 0x56, 0x57,
+- 0x05, 0xa3, 0x59, 0x62, 0x54, 0xbf, 0xdf, 0x67, 0xa5, 0x2a, 0xef, 0x43,
+- 0xd6, 0x95, 0x53, 0x09, 0x8c, 0x96, 0xa4, 0xef, 0x8a, 0x28, 0xbe, 0x96,
+- 0xb6, 0x71, 0x22, 0xa9, 0x96, 0xbc, 0x90, 0x96, 0xb9, 0x1e, 0x73, 0x31,
+- 0x73, 0x21, 0x81, 0x61, 0x62, 0xe9, 0x1f, 0x92, 0x23, 0xe8, 0x29, 0x9b,
+- 0xc4, 0xb1, 0x8b, 0xfd, 0xa5, 0x28, 0x66, 0xc8, 0x4f, 0x75, 0xe9, 0x4e,
+- 0x8c, 0x94, 0x64, 0xe7, 0x1b, 0x48, 0xe5, 0x8f, 0x30, 0x5e, 0x67, 0x17,
+- 0x78, 0xd8, 0x5f, 0x6e, 0x63, 0x8c, 0xa4, 0xbb, 0x8a, 0x1c, 0x65, 0x76,
+- 0x4b, 0x67, 0x17, 0x7d, 0x5b, 0x17, 0x90, 0xdb, 0xca, 0x19, 0xee, 0x53,
+- 0xc0, 0xaa, 0x72, 0x5e, 0xf4, 0x95, 0xe7, 0x70, 0xfa, 0x73, 0x62, 0x53,
+- 0x63, 0xd5, 0xc6, 0xe6, 0x12, 0x70, 0x67, 0xc9, 0x47, 0x8b, 0x67, 0xbc,
+- 0x18, 0xc5, 0x45, 0xfa, 0x71, 0x02, 0xf7, 0x38, 0x21, 0x16, 0x79, 0xeb,
+- 0xd4, 0x8e, 0xb8, 0x9e, 0x9f, 0x17, 0x6b, 0x19, 0xb7, 0x30, 0x02, 0x63,
+- 0xd2, 0x37, 0x71, 0x36, 0x3e, 0x3c, 0x3f, 0x52, 0xe1, 0x5d, 0xfd, 0x6e,
+- 0xa2, 0xdf, 0xc7, 0x1a, 0x07, 0x72, 0xc8, 0x17, 0x85, 0xc1, 0x26, 0xfa,
+- 0xe1, 0xa4, 0x28, 0x0c, 0xc4, 0x20, 0x0b, 0xf7, 0x0a, 0x3a, 0x6b, 0x8c,
+- 0x24, 0xb1, 0x60, 0x8e, 0xa7, 0x2d, 0xfc, 0x75, 0xe9, 0x29, 0xe3, 0x5c,
+- 0xa4, 0x0e, 0xe6, 0x81, 0x08, 0xa2, 0x07, 0x2c, 0x34, 0x1f, 0x10, 0xc4,
+- 0x5d, 0xa1, 0x33, 0xaa, 0xd7, 0x21, 0x81, 0x7d, 0xa3, 0x36, 0xee, 0xe9,
+- 0x88, 0xe0, 0x42, 0x52, 0x0e, 0x5e, 0x21, 0x86, 0xfd, 0x26, 0x8e, 0x8d,
+- 0x1e, 0x97, 0xae, 0x6b, 0x14, 0x22, 0x68, 0x8a, 0x23, 0xd2, 0x5e, 0x87,
+- 0x06, 0xae, 0xdb, 0x59, 0x52, 0x3b, 0xed, 0xa0, 0xe0, 0x36, 0x40, 0xfa,
+- 0x0f, 0x73, 0xdf, 0x53, 0x45, 0xa5, 0xea, 0xaf, 0xf5, 0x66, 0x3e, 0x30,
+- 0xe5, 0xf4, 0x0e, 0x7e, 0x7e, 0x6b, 0xaa, 0xba, 0xff, 0xbc, 0x03, 0x36,
+- 0x1a, 0x0f, 0x56, 0xf6, 0x9f, 0x7d, 0x8a, 0x16, 0x7c, 0x58, 0xd2, 0xf9,
+- 0xa4, 0x54, 0x34, 0xf0, 0xfa, 0xdf, 0x13, 0x4a, 0xdd, 0xe4, 0xcb, 0xdc,
+- 0xcb, 0xa2, 0x6d, 0x60, 0x94, 0xcf, 0x83, 0xe9, 0xa4, 0x9b, 0xa5, 0xcd,
+- 0xe7, 0xcb, 0x51, 0xda, 0xc7, 0x5c, 0xf0, 0xb6, 0x19, 0x3b, 0x1c, 0x13,
+- 0x75, 0xde, 0x0e, 0x63, 0x6b, 0x05, 0xab, 0x0e, 0x16, 0x8d, 0xd5, 0x63,
+- 0x89, 0x17, 0x8a, 0x4d, 0xcc, 0xcd, 0x8d, 0x93, 0x16, 0xe7, 0xe9, 0xdc,
+- 0x14, 0x88, 0x7a, 0xbd, 0x62, 0xe5, 0x64, 0x5f, 0x25, 0x5f, 0x07, 0xc6,
+- 0x0d, 0xbc, 0xe9, 0xdf, 0x80, 0x48, 0x90, 0x15, 0x03, 0x93, 0x3a, 0x7f,
+- 0xd6, 0x8a, 0xd5, 0x93, 0x8c, 0xdf, 0x7c, 0x9d, 0x3b, 0x37, 0x88, 0x48,
+- 0xa0, 0xf3, 0xe5, 0xf3, 0x1c, 0xb2, 0x99, 0x43, 0xc7, 0xfe, 0x97, 0x1c,
+- 0x7a, 0xa8, 0x64, 0x21, 0xd7, 0x52, 0xcd, 0x97, 0x5e, 0xc6, 0xe2, 0xef,
+- 0x6b, 0x75, 0x7b, 0x3b, 0xc7, 0xa3, 0x07, 0x74, 0x0e, 0xf7, 0x32, 0x87,
+- 0x35, 0x9e, 0x2d, 0xb1, 0x69, 0x1c, 0x76, 0x73, 0x10, 0x5a, 0x1f, 0x8e,
+- 0x2a, 0xbc, 0xed, 0x2b, 0xf5, 0xf1, 0x32, 0xed, 0x13, 0x39, 0xf8, 0x2c,
+- 0xf1, 0x08, 0x12, 0xd2, 0xbb, 0x9e, 0x52, 0x33, 0x7e, 0x2a, 0xfb, 0x2c,
+- 0x79, 0xf9, 0x9c, 0xd0, 0xf7, 0x8f, 0xc2, 0x49, 0x6b, 0x3c, 0xf6, 0x5a,
+- 0x57, 0x55, 0x70, 0x19, 0x12, 0xaf, 0xac, 0xd5, 0xf3, 0x35, 0x36, 0xa3,
+- 0x68, 0x48, 0xce, 0xd2, 0x37, 0x72, 0xa8, 0x51, 0xa8, 0x25, 0xaf, 0xa6,
+- 0xab, 0xb8, 0x2c, 0xb2, 0x36, 0xad, 0xe7, 0x59, 0xbd, 0xe3, 0xb2, 0xb0,
+- 0xde, 0xac, 0xd6, 0xd1, 0xbd, 0xc4, 0x86, 0xe6, 0xb8, 0xcb, 0xdb, 0xa3,
+- 0xd8, 0x47, 0x8c, 0x7a, 0x69, 0x17, 0xc3, 0xac, 0xab, 0xbb, 0x4b, 0xd2,
+- 0x1d, 0x26, 0x4e, 0x77, 0xd7, 0x70, 0x3a, 0xcc, 0x5a, 0xba, 0x1b, 0x72,
+- 0xaf, 0xae, 0xa5, 0x11, 0xe2, 0x94, 0x34, 0x56, 0xc1, 0xe9, 0x48, 0x0d,
+- 0xa7, 0xbd, 0x15, 0x9c, 0xee, 0x36, 0x34, 0x3e, 0x35, 0xf6, 0x36, 0xf1,
+- 0xbe, 0x67, 0xa3, 0x30, 0x7e, 0xc0, 0xfd, 0xc3, 0x05, 0xc3, 0x3d, 0x35,
+- 0xec, 0xf5, 0x68, 0xec, 0x19, 0x69, 0xdc, 0x63, 0xf0, 0x6e, 0x2f, 0x88,
+- 0x42, 0xae, 0x11, 0x32, 0x3b, 0x2c, 0x0a, 0x9d, 0xf3, 0x88, 0xbd, 0x67,
+- 0x38, 0xa3, 0x81, 0xd8, 0xab, 0xfa, 0x4c, 0xcf, 0x8f, 0x11, 0x7b, 0xff,
+- 0x29, 0xce, 0x46, 0x34, 0xd7, 0xea, 0xd8, 0x02, 0x8b, 0x4e, 0x68, 0xae,
+- 0x8d, 0x92, 0x30, 0x2c, 0xe4, 0x4b, 0xc6, 0xe2, 0x04, 0x14, 0xb6, 0x92,
+- 0xdb, 0xde, 0xf4, 0x76, 0xf9, 0x2d, 0xb8, 0x01, 0xa7, 0xbb, 0x0c, 0x68,
+- 0x1d, 0x62, 0x4e, 0x54, 0xb1, 0x7b, 0x17, 0x39, 0xa3, 0x29, 0x90, 0x9d,
+- 0x67, 0xa9, 0x37, 0xb6, 0xa4, 0x1b, 0x50, 0xf2, 0x86, 0xc3, 0x66, 0x56,
+- 0x43, 0x9b, 0xe7, 0xae, 0x86, 0xae, 0x85, 0x71, 0x58, 0xed, 0x36, 0x1a,
+- 0x8e, 0x7a, 0xb9, 0x13, 0x42, 0xe3, 0x15, 0xe8, 0x3a, 0x6e, 0xd3, 0x7e,
+- 0x38, 0xf5, 0x81, 0x97, 0xf9, 0xc0, 0x7c, 0x5c, 0x9c, 0x75, 0xaa, 0xf5,
+- 0xa0, 0x6f, 0x5c, 0x63, 0xec, 0x57, 0xea, 0x4d, 0xcf, 0xc0, 0x1d, 0xdd,
+- 0x4a, 0x79, 0x4b, 0xa3, 0x88, 0x4c, 0xd8, 0xa8, 0x3b, 0xd8, 0x8a, 0x97,
+- 0xba, 0x22, 0x38, 0x7b, 0xab, 0xfe, 0x3e, 0x8a, 0x7a, 0xe2, 0x70, 0xd3,
+- 0xb5, 0x51, 0x2c, 0x99, 0xa8, 0x62, 0xb2, 0xc1, 0xfb, 0x89, 0xb8, 0x8b,
+- 0x98, 0x9c, 0xe7, 0x9d, 0x11, 0xdb, 0x9c, 0x0c, 0xf6, 0xd2, 0xa6, 0xd7,
+- 0xc9, 0xf1, 0xe7, 0x93, 0xbb, 0x66, 0x2c, 0xda, 0xbf, 0x62, 0x59, 0xa1,
+- 0x73, 0x09, 0x22, 0x58, 0x34, 0x21, 0x07, 0x8e, 0xe9, 0x0a, 0x33, 0x6a,
+- 0x89, 0x0d, 0xc4, 0xbb, 0xe6, 0x57, 0x93, 0x71, 0xba, 0x62, 0x69, 0xdb,
+- 0xd0, 0xcd, 0xb8, 0xa4, 0xce, 0x24, 0x93, 0xd9, 0x51, 0x62, 0x7d, 0xdb,
+- 0xf1, 0x08, 0xea, 0x0e, 0xfc, 0x97, 0x32, 0x02, 0xe6, 0x42, 0xb7, 0x22,
+- 0x3e, 0x0b, 0x99, 0x7a, 0x72, 0xc8, 0x45, 0xc4, 0xf1, 0xd8, 0xfe, 0x9d,
+- 0x6a, 0x09, 0xc7, 0xdf, 0xbb, 0xbe, 0x19, 0x6d, 0xcb, 0x64, 0x7e, 0x2b,
+- 0xf7, 0x9f, 0x4d, 0x17, 0x3a, 0x13, 0x8c, 0xdd, 0x49, 0xb8, 0xb8, 0x6a,
+- 0x4c, 0xe6, 0x8e, 0xa1, 0x0e, 0xcd, 0x13, 0x5e, 0xf6, 0x84, 0x88, 0xa1,
+- 0xf1, 0x44, 0x0c, 0xfb, 0x8e, 0xeb, 0xfc, 0x8c, 0xc1, 0x1a, 0xf3, 0x66,
+- 0x3b, 0x44, 0xa1, 0x9f, 0xf9, 0x39, 0xd3, 0x2f, 0xda, 0xd1, 0x3e, 0x2e,
+- 0xa7, 0xb3, 0xc2, 0x0b, 0x1f, 0x80, 0x87, 0x76, 0xd6, 0x65, 0xfb, 0x84,
+- 0x8b, 0x15, 0xba, 0x7e, 0x94, 0x75, 0xfe, 0xe8, 0x7a, 0x6a, 0xf0, 0x4e,
+- 0xa1, 0x58, 0x5f, 0xa9, 0x79, 0xbd, 0x7c, 0xf5, 0xb1, 0xfe, 0x59, 0x62,
+- 0xdd, 0xb8, 0xce, 0x2d, 0x03, 0x33, 0xfe, 0x25, 0xb5, 0x3d, 0x99, 0x65,
+- 0xad, 0x9b, 0xc7, 0xbc, 0xaa, 0xe6, 0x13, 0x5a, 0x74, 0x6e, 0xcd, 0xab,
+- 0xe5, 0x93, 0x85, 0x33, 0x8c, 0xdd, 0xe1, 0xff, 0x73, 0x5d, 0xb2, 0x90,
+- 0x38, 0x60, 0xa0, 0xa5, 0x23, 0x8a, 0x6b, 0x96, 0xb6, 0x39, 0xcd, 0x88,
+- 0xe2, 0x26, 0xdf, 0x41, 0x13, 0x31, 0xb1, 0x9f, 0x39, 0x85, 0xf9, 0xd5,
+- 0x5c, 0x5b, 0xa9, 0xeb, 0x55, 0x2d, 0xd7, 0xf2, 0xa5, 0x04, 0x6b, 0x93,
+- 0xae, 0x05, 0xbd, 0xac, 0x05, 0x16, 0x0e, 0x95, 0xb5, 0x6f, 0x1d, 0xbc,
+- 0x4b, 0xce, 0x7e, 0xc5, 0xd7, 0xbe, 0x5d, 0x8c, 0x12, 0x73, 0xe3, 0x41,
+- 0xe6, 0xc6, 0xda, 0xf2, 0x25, 0xb5, 0xc6, 0xd3, 0xf5, 0x38, 0x64, 0x3d,
+- 0xb6, 0xc4, 0x4d, 0xe3, 0x72, 0xd0, 0x15, 0xa7, 0xee, 0x24, 0x36, 0x3b,
+- 0x1b, 0x0d, 0xa5, 0x5e, 0x4e, 0xa7, 0x42, 0xea, 0x98, 0xcc, 0xdd, 0x42,
+- 0xba, 0xef, 0x93, 0x9b, 0xd6, 0x9a, 0x51, 0x2c, 0xaf, 0xe5, 0x60, 0xb2,
+- 0x96, 0x83, 0x1e, 0x73, 0xd0, 0x6d, 0x45, 0xf8, 0x09, 0x6d, 0x6c, 0x63,
+- 0x0e, 0x6e, 0xa3, 0x4e, 0xfd, 0x7e, 0xa9, 0xc2, 0xfb, 0x99, 0x15, 0x22,
+- 0x35, 0x73, 0x9e, 0xf9, 0xe4, 0x5e, 0xe6, 0x51, 0xaf, 0xb5, 0x65, 0xce,
+- 0x33, 0x66, 0xab, 0x6b, 0xf9, 0xb4, 0xbb, 0xc6, 0xfb, 0x0f, 0xd4, 0xf2,
+- 0x69, 0xf5, 0x97, 0xf2, 0x49, 0xf3, 0xd3, 0x0b, 0xbf, 0x43, 0xab, 0xd6,
+- 0x22, 0x79, 0xa1, 0xef, 0x97, 0xb3, 0x10, 0xfe, 0xd8, 0xd7, 0x67, 0xd9,
+- 0xb0, 0x82, 0xc6, 0x0a, 0xdf, 0x58, 0x41, 0x28, 0x7a, 0x59, 0x3b, 0x6d,
+- 0x2f, 0x2f, 0xb2, 0xf4, 0x9d, 0x5e, 0xb7, 0x96, 0xb1, 0xd8, 0x99, 0xfe,
+- 0x05, 0xce, 0xb6, 0x2a, 0xd5, 0x97, 0xbe, 0xa4, 0xde, 0x60, 0x5c, 0x62,
+- 0xd4, 0x1f, 0xeb, 0x27, 0xb3, 0xa2, 0x7f, 0x52, 0xfb, 0xa6, 0x11, 0x11,
+- 0x6f, 0xad, 0x58, 0x35, 0x09, 0xdc, 0x43, 0x3d, 0x73, 0x8e, 0x7e, 0x59,
+- 0xe3, 0xcb, 0xa1, 0x35, 0xbc, 0xdb, 0x19, 0xdf, 0xc2, 0xc3, 0xe5, 0xaa,
+- 0x7f, 0xf6, 0x95, 0x65, 0x66, 0x1a, 0x23, 0x58, 0xc3, 0x9a, 0x76, 0x98,
+- 0x7c, 0xf1, 0x6f, 0xc9, 0x28, 0x5e, 0x24, 0x5f, 0xbc, 0xc4, 0xfb, 0x1d,
+- 0xaa, 0xde, 0xcf, 0x9f, 0x45, 0x2a, 0x73, 0x5a, 0xf3, 0x05, 0xb5, 0xf7,
+- 0xa1, 0x72, 0x9b, 0x7f, 0x9a, 0x78, 0x7c, 0xb0, 0x24, 0x07, 0xfa, 0x78,
+- 0x47, 0xbb, 0x5b, 0xce, 0x0e, 0x0a, 0x81, 0x8d, 0x49, 0x38, 0x66, 0xa0,
+- 0xef, 0xe1, 0x52, 0xe3, 0x66, 0xe8, 0x87, 0x02, 0xfa, 0x78, 0xd7, 0x95,
+- 0xac, 0x71, 0x8f, 0x95, 0xbf, 0xa4, 0xeb, 0xb0, 0xad, 0xa4, 0xb9, 0x4a,
+- 0xa9, 0x8e, 0xb4, 0xd6, 0x4a, 0x79, 0x71, 0xb3, 0xe6, 0x94, 0x48, 0x14,
+- 0xca, 0x6f, 0x4b, 0x2c, 0x61, 0xec, 0xf3, 0xc4, 0xd7, 0xbb, 0x5e, 0x3d,
+- 0x79, 0x21, 0x24, 0xaf, 0xf7, 0x90, 0xb7, 0x7b, 0x45, 0x5f, 0x85, 0xcf,
+- 0xb3, 0x22, 0x3b, 0x69, 0x8b, 0x1e, 0x6a, 0x94, 0x0d, 0xcc, 0x33, 0x77,
+- 0xe1, 0x3c, 0x62, 0x4a, 0xe3, 0xca, 0xc0, 0x0f, 0xfc, 0xb5, 0xe4, 0xfc,
+- 0x1b, 0xe8, 0x2b, 0xf2, 0x52, 0x05, 0x8b, 0x37, 0x50, 0x27, 0x55, 0xb1,
+- 0xf8, 0x43, 0x62, 0x31, 0x57, 0xc3, 0x62, 0x24, 0x48, 0x92, 0xef, 0x3e,
+- 0xc7, 0x62, 0xef, 0x1f, 0xe0, 0xf7, 0x2f, 0x62, 0x6e, 0xbd, 0xe6, 0xf7,
+- 0xc8, 0x1c, 0xe6, 0x58, 0x9f, 0x3b, 0x02, 0xf2, 0xb0, 0xc6, 0x9b, 0x8d,
+- 0xbe, 0x47, 0xeb, 0xb1, 0xe1, 0xd1, 0x18, 0x6e, 0x7e, 0x54, 0xa9, 0xd7,
+- 0x7c, 0x78, 0x2d, 0xe4, 0xa2, 0x5f, 0xa4, 0x27, 0x70, 0xa6, 0x25, 0xe9,
+- 0xee, 0x83, 0xee, 0xa3, 0x7a, 0xad, 0xdb, 0x8b, 0x5a, 0xa3, 0x84, 0xd4,
+- 0x28, 0xb2, 0xff, 0x7d, 0xe6, 0xfa, 0xa6, 0xa4, 0xcc, 0xef, 0xac, 0x70,
+- 0x7f, 0xca, 0xa7, 0x16, 0xdf, 0x6b, 0x98, 0x32, 0xdb, 0x6e, 0x54, 0xb1,
+- 0x76, 0x4d, 0x0d, 0x6b, 0x5f, 0x9b, 0xb2, 0xf1, 0x4b, 0xd6, 0x85, 0xcd,
+- 0xe9, 0x28, 0x56, 0xeb, 0x1a, 0xef, 0xe8, 0x5e, 0x2a, 0x8a, 0x7e, 0xc6,
+- 0xc5, 0x58, 0xaa, 0xa8, 0x37, 0xa8, 0x3b, 0x18, 0xcb, 0x55, 0xec, 0xa7,
+- 0xce, 0x50, 0x9f, 0xdc, 0x68, 0x56, 0x7b, 0xa9, 0xd1, 0x9a, 0x3e, 0xb9,
+- 0xb1, 0xac, 0xf3, 0xd1, 0x25, 0x06, 0xa2, 0x38, 0xcd, 0x35, 0x7b, 0xfc,
+- 0xaa, 0x3e, 0x79, 0x1d, 0xa9, 0xac, 0xd6, 0x27, 0x2e, 0x79, 0xbf, 0x54,
+- 0xd1, 0x27, 0x5a, 0x8f, 0x68, 0x2d, 0xa2, 0xfb, 0x85, 0x6e, 0xf6, 0x0b,
+- 0x72, 0x5a, 0xeb, 0x15, 0xa3, 0x5b, 0xfa, 0x86, 0x19, 0x61, 0x8d, 0xcc,
+- 0x30, 0x96, 0x97, 0x61, 0xd7, 0x23, 0x4d, 0x8c, 0x45, 0x23, 0x76, 0x38,
+- 0x2b, 0xac, 0x25, 0x9e, 0xe6, 0x4f, 0x6a, 0x90, 0xdf, 0xd3, 0x2e, 0x47,
+- 0x35, 0xc7, 0x32, 0xfe, 0x73, 0xe3, 0xff, 0x5e, 0x1b, 0xd7, 0xf3, 0xb3,
+- 0xac, 0xd1, 0x7a, 0xcd, 0x8f, 0xac, 0x2a, 0xee, 0xd1, 0xdc, 0xe4, 0xfd,
+- 0x19, 0x2e, 0xd0, 0xc6, 0x37, 0xbf, 0x14, 0x47, 0x9b, 0x79, 0xa1, 0xe3,
+- 0xf8, 0x09, 0xd7, 0xea, 0x78, 0xdb, 0x78, 0x87, 0x3e, 0x3e, 0x47, 0x1f,
+- 0xff, 0xf2, 0xd1, 0x80, 0xdc, 0x84, 0x4f, 0x0d, 0xfa, 0x78, 0x3b, 0x71,
+- 0xf3, 0x63, 0xff, 0x7a, 0xb4, 0xb7, 0x26, 0xdd, 0x0f, 0xcc, 0xb9, 0x7a,
+- 0x0b, 0x7b, 0x09, 0x7d, 0xa7, 0xe8, 0x67, 0xdd, 0xeb, 0x1c, 0xa3, 0x7f,
+- 0x99, 0xcb, 0x15, 0x0d, 0xd2, 0x6e, 0x56, 0xfd, 0xdb, 0x51, 0xf3, 0x6f,
+- 0x66, 0x6a, 0x1b, 0xcf, 0xd1, 0xf5, 0x54, 0xeb, 0xd1, 0xfb, 0x2b, 0xfd,
+- 0x92, 0x19, 0xdc, 0x5a, 0x89, 0x55, 0x5d, 0x90, 0xb7, 0x5e, 0x2c, 0xea,
+- 0x9a, 0xdd, 0xcf, 0x9a, 0xcd, 0x9e, 0xc9, 0x94, 0x83, 0x83, 0x48, 0x4d,
+- 0x73, 0xaf, 0xbd, 0xa7, 0x91, 0x0a, 0xd9, 0x4f, 0x0d, 0x9d, 0x67, 0xef,
+- 0x93, 0x31, 0x64, 0x6e, 0xa6, 0xa2, 0x27, 0x6f, 0xad, 0xd5, 0xe9, 0xfe,
+- 0x9a, 0xae, 0xbc, 0xbf, 0x76, 0x4e, 0x9e, 0xba, 0x72, 0xee, 0x1c, 0x7d,
+- 0x97, 0xcb, 0x2d, 0xfd, 0xac, 0xfb, 0x80, 0x37, 0xfc, 0x9f, 0x29, 0x2c,
+- 0x6c, 0xac, 0xe8, 0x8e, 0xcf, 0xef, 0x6c, 0x89, 0x8d, 0xe3, 0x17, 0x55,
+- 0xa6, 0xe3, 0x2e, 0x13, 0xf5, 0x4a, 0x59, 0xcb, 0x42, 0x14, 0x4b, 0x33,
+- 0xaa, 0x18, 0x97, 0x05, 0x0d, 0xca, 0x96, 0xe0, 0x6e, 0xc6, 0x07, 0xb6,
+- 0x15, 0x0c, 0x5a, 0x23, 0x45, 0x39, 0xc4, 0x5e, 0x2e, 0xcf, 0x3e, 0x2c,
+- 0xdc, 0x0f, 0xad, 0x6f, 0xf5, 0x79, 0x77, 0xeb, 0x3e, 0x8e, 0xef, 0x83,
+- 0xb4, 0x67, 0xee, 0xdc, 0x10, 0x8f, 0x95, 0xfe, 0x4a, 0x3d, 0x16, 0x97,
+- 0x39, 0xbd, 0x47, 0x84, 0x73, 0x9e, 0xa8, 0xe8, 0xe7, 0x41, 0xad, 0x9f,
+- 0x5d, 0x8d, 0xc7, 0x31, 0x4f, 0xce, 0x9e, 0x40, 0x6a, 0xe0, 0x82, 0x29,
+- 0xfb, 0x63, 0xd4, 0xcc, 0xeb, 0x6a, 0x7b, 0xad, 0xa8, 0xed, 0xd5, 0x36,
+- 0xf5, 0x10, 0xed, 0xd6, 0x78, 0xac, 0xd6, 0x37, 0x23, 0x88, 0xa1, 0x69,
+- 0xd4, 0x63, 0x8d, 0x4f, 0xe6, 0x8e, 0xb0, 0xce, 0xc4, 0x8e, 0xef, 0xa8,
+- 0xd8, 0xfb, 0xba, 0xff, 0xa4, 0x59, 0xc9, 0xef, 0x13, 0xba, 0x4e, 0x58,
+- 0xb0, 0x58, 0x77, 0xae, 0x1c, 0x93, 0xe1, 0x16, 0xf1, 0x91, 0x5a, 0x92,
+- 0xf4, 0x12, 0xab, 0x85, 0xd6, 0x3e, 0x49, 0x6a, 0x9f, 0x18, 0x32, 0x27,
+- 0xfe, 0x85, 0xf6, 0x69, 0xfd, 0xa6, 0x6b, 0xa1, 0x83, 0x96, 0x51, 0xaf,
+- 0xb3, 0xcd, 0x48, 0x52, 0x3b, 0x3b, 0x68, 0xfe, 0x6c, 0x3f, 0x4b, 0xac,
+- 0xe2, 0x3e, 0x75, 0x07, 0x1c, 0x5c, 0x33, 0x26, 0x9d, 0xa3, 0xb8, 0x40,
+- 0x0e, 0xf7, 0x06, 0xb5, 0x4e, 0xbc, 0x3a, 0x9d, 0x64, 0x4d, 0x77, 0xd0,
+- 0xf5, 0xd9, 0x3e, 0x31, 0xd4, 0x8d, 0xe9, 0xb3, 0x0b, 0xd3, 0x26, 0xe3,
+- 0xe4, 0x98, 0x47, 0x39, 0xee, 0xa2, 0xfd, 0x44, 0x23, 0xfb, 0x2d, 0xa5,
+- 0xfa, 0x59, 0x0f, 0x2c, 0xd6, 0xdc, 0x5e, 0xb4, 0x0f, 0x8e, 0x88, 0xd4,
+- 0x40, 0x23, 0x52, 0xfd, 0x31, 0x78, 0xce, 0x3a, 0xa1, 0x7f, 0x63, 0x98,
+- 0xd3, 0x24, 0xc0, 0xe3, 0xc5, 0x3f, 0xe7, 0xba, 0xa4, 0xb3, 0x85, 0x18,
+- 0x6b, 0xf9, 0xd3, 0x54, 0xbe, 0x05, 0xa9, 0x21, 0x07, 0x9e, 0xfb, 0x3a,
+- 0xe7, 0x15, 0xbe, 0x30, 0xef, 0xd9, 0xca, 0x3c, 0xfa, 0xe2, 0x7a, 0xad,
+- 0xb5, 0x94, 0x7a, 0x82, 0x7a, 0xab, 0xe0, 0x68, 0xce, 0x11, 0x18, 0xf6,
+- 0xf5, 0x9e, 0x3d, 0xae, 0x05, 0x99, 0xb8, 0x03, 0x9f, 0xa8, 0x42, 0x3c,
+- 0xec, 0x8c, 0x54, 0x7e, 0x97, 0x90, 0x4e, 0x8e, 0xdc, 0x36, 0x5d, 0xed,
+- 0xb3, 0xd8, 0x17, 0x29, 0xf5, 0x22, 0xb9, 0xe9, 0x09, 0x6a, 0x9f, 0xe1,
+- 0xa9, 0x4f, 0xd4, 0x34, 0xb5, 0xcd, 0x88, 0xa7, 0xe7, 0x55, 0x39, 0xe8,
+- 0xb0, 0xa3, 0xd4, 0xe3, 0xfc, 0x6e, 0xcf, 0xd4, 0x1c, 0x2f, 0xf1, 0x3c,
+- 0x72, 0xc2, 0xed, 0xde, 0x7f, 0xab, 0xcd, 0x5f, 0x9a, 0xab, 0xd4, 0x18,
+- 0x6d, 0x78, 0xcb, 0xc7, 0xfd, 0x11, 0x24, 0x73, 0xb3, 0xf4, 0xcf, 0x99,
+- 0xe5, 0xb2, 0x7f, 0x8a, 0xf7, 0x5c, 0x2f, 0x64, 0x96, 0x77, 0xec, 0x9d,
+- 0x07, 0xcd, 0xb5, 0x92, 0xf9, 0x60, 0x78, 0x75, 0x7c, 0xfe, 0x99, 0x2f,
+- 0x13, 0x47, 0xf8, 0xbe, 0x39, 0xa3, 0xf7, 0x50, 0xaa, 0xc7, 0xd7, 0x3d,
+- 0xfe, 0x08, 0x7b, 0xfc, 0x82, 0x6a, 0xf0, 0xde, 0x50, 0xcf, 0x75, 0xc8,
+- 0xfe, 0x11, 0xe1, 0x71, 0xad, 0xcb, 0xba, 0xa0, 0xfb, 0xaa, 0x11, 0xf6,
+- 0x55, 0x2e, 0x9e, 0x26, 0xc7, 0x9c, 0x2c, 0x77, 0xe2, 0xf9, 0xb2, 0x87,
+- 0x67, 0x58, 0x3f, 0x9e, 0x2a, 0x5b, 0xd8, 0xfa, 0x88, 0xcc, 0x58, 0x62,
+- 0x27, 0xce, 0xfb, 0xd2, 0xf9, 0x1e, 0xed, 0x36, 0x03, 0xb9, 0x7f, 0x25,
+- 0x79, 0x85, 0x67, 0x14, 0x72, 0x66, 0x8b, 0xb0, 0x03, 0x1b, 0xdf, 0xe9,
+- 0x30, 0x70, 0x38, 0x3e, 0x84, 0xbe, 0xf6, 0xbb, 0xf9, 0xb2, 0xd0, 0x7a,
+- 0x40, 0xd7, 0x6a, 0xdd, 0x6f, 0x34, 0xe3, 0x4e, 0xf2, 0xd9, 0xd5, 0x4b,
+- 0x43, 0xfc, 0x3a, 0xdd, 0xd6, 0xf9, 0x92, 0xa0, 0x66, 0x68, 0x91, 0x59,
+- 0xe0, 0xa7, 0xd8, 0xc8, 0x7e, 0x21, 0xb3, 0x6c, 0x7f, 0xad, 0x37, 0xff,
+- 0x29, 0x56, 0xea, 0x3e, 0xc3, 0x6f, 0x66, 0xbd, 0xab, 0xc6, 0xe1, 0x70,
+- 0xc5, 0x8f, 0x06, 0x9a, 0x0e, 0x16, 0x54, 0xbd, 0x27, 0x73, 0x93, 0x15,
+- 0x1d, 0xb5, 0xd0, 0xb9, 0x91, 0x7d, 0x40, 0xc3, 0x01, 0xcf, 0x5d, 0x27,
+- 0x14, 0x63, 0xb1, 0x9b, 0xb1, 0x48, 0x86, 0x31, 0xb6, 0xdb, 0xcd, 0x41,
+- 0x32, 0x6c, 0x16, 0x79, 0x71, 0x8b, 0xae, 0xb1, 0x75, 0xf5, 0xec, 0xbf,
+- 0x59, 0x53, 0x27, 0x0d, 0xf6, 0x23, 0xba, 0x1f, 0x8f, 0x62, 0x2a, 0xdd,
+- 0xc6, 0x3e, 0x29, 0x8a, 0xed, 0xe9, 0x1e, 0xea, 0x1a, 0x03, 0xc6, 0xc1,
+- 0x4b, 0x6a, 0xe5, 0x17, 0xfa, 0x88, 0x4d, 0xe3, 0x9a, 0xc3, 0x6c, 0xb1,
+- 0x91, 0xf9, 0x9b, 0x59, 0x46, 0xb1, 0x76, 0x8b, 0xee, 0xe1, 0xf5, 0x1d,
+- 0x1c, 0xf6, 0xc7, 0x06, 0xa6, 0x17, 0x38, 0xd8, 0xd5, 0x2d, 0x13, 0x05,
+- 0xe8, 0x5c, 0xfe, 0x6a, 0x4d, 0x81, 0x93, 0xfd, 0xbd, 0x3a, 0x03, 0x67,
+- 0x03, 0x6d, 0x91, 0x75, 0x4a, 0xb5, 0xa6, 0x4d, 0xe4, 0x2a, 0xf5, 0x26,
+- 0xe1, 0x64, 0xd9, 0xff, 0xcd, 0x4c, 0xb1, 0x27, 0x3b, 0xa8, 0xd4, 0x4e,
+- 0x62, 0xe9, 0xe3, 0x8e, 0xe1, 0x43, 0xec, 0xc4, 0xf7, 0xb6, 0xb2, 0xb7,
+- 0xfa, 0x3a, 0xdb, 0xb7, 0xb7, 0x8a, 0xdf, 0x24, 0x7f, 0x1b, 0xdd, 0x09,
+- 0xe8, 0x7e, 0xa7, 0xa0, 0x22, 0x9e, 0x37, 0xfb, 0x38, 0xb5, 0xe0, 0x6f,
+- 0x96, 0x75, 0xc1, 0x9d, 0x5f, 0xf5, 0xd5, 0x6a, 0x6a, 0xa9, 0x8f, 0xc8,
+- 0xf9, 0x61, 0xe5, 0x73, 0xcc, 0x59, 0x37, 0x7e, 0x49, 0x6d, 0xa6, 0x6f,
+- 0x7a, 0xaa, 0x76, 0x59, 0xf5, 0x01, 0x9b, 0xc4, 0x6b, 0xe1, 0xac, 0xf9,
+- 0x03, 0x36, 0x7d, 0x5e, 0xef, 0x62, 0xce, 0x9a, 0xf1, 0xc5, 0xb4, 0x51,
+- 0xba, 0xd3, 0x15, 0xfc, 0xf8, 0xf8, 0xc8, 0x1b, 0x4e, 0xcc, 0x47, 0xa1,
+- 0x93, 0x39, 0x36, 0xfb, 0x4f, 0x1c, 0x6b, 0x5f, 0x0a, 0xfc, 0xa6, 0xfc,
+- 0x5d, 0xf2, 0xbe, 0xd1, 0xd5, 0x82, 0xc2, 0x0c, 0x6d, 0x3c, 0xf4, 0x75,
+- 0x62, 0x32, 0x3f, 0x86, 0xfb, 0xd8, 0x46, 0xe0, 0x59, 0xd6, 0xdb, 0x63,
+- 0xe4, 0x8c, 0xe6, 0xb4, 0x83, 0x32, 0x9f, 0x8f, 0x94, 0x92, 0x83, 0xa7,
+- 0x99, 0xb7, 0xc7, 0xf9, 0x7c, 0x94, 0xf7, 0xdc, 0x4a, 0x7d, 0x77, 0xef,
+- 0x78, 0x3d, 0xbe, 0x3d, 0x1e, 0xc3, 0xd6, 0xf1, 0x80, 0x9a, 0x02, 0xb7,
+- 0x35, 0x72, 0xdf, 0x57, 0x89, 0xe7, 0xcd, 0x4b, 0xaf, 0xc3, 0x5a, 0x27,
+- 0xe9, 0xde, 0xcd, 0xdc, 0xab, 0x3b, 0x08, 0xc7, 0x21, 0x8e, 0xfe, 0xd9,
+- 0x5b, 0x2e, 0xd0, 0x44, 0xbd, 0xbf, 0xd4, 0x12, 0xeb, 0xc7, 0x57, 0x57,
+- 0x9e, 0x47, 0xd2, 0x79, 0x6a, 0x0b, 0x62, 0xb2, 0x44, 0x4c, 0x32, 0x36,
+- 0x4f, 0x97, 0x88, 0x4b, 0x6a, 0xc3, 0x93, 0x25, 0x8d, 0x6d, 0x1f, 0xcf,
+- 0x75, 0x0c, 0xa9, 0x2a, 0x56, 0x3e, 0x55, 0x4f, 0x78, 0xaf, 0x45, 0x50,
+- 0x6f, 0xe9, 0xdf, 0x76, 0xf0, 0x66, 0x31, 0xe1, 0x6c, 0x28, 0x6b, 0x3c,
+- 0xfc, 0x6d, 0x0d, 0x0f, 0x6f, 0x47, 0xaa, 0xfa, 0x44, 0xce, 0x4c, 0x42,
+- 0x73, 0xdd, 0x62, 0xe7, 0xa6, 0xd2, 0xf0, 0x34, 0x7d, 0x9f, 0xa7, 0xc6,
+- 0x76, 0xdf, 0x67, 0xc8, 0xc7, 0xa6, 0x8c, 0x2e, 0xf6, 0xd4, 0xf4, 0x87,
+- 0xbe, 0x33, 0xf3, 0x37, 0x2d, 0x3b, 0x75, 0x4c, 0x8e, 0x17, 0x71, 0x2b,
+- 0xfb, 0x1e, 0x3f, 0x44, 0xf5, 0x6e, 0x53, 0xbc, 0xf3, 0x43, 0xbc, 0xf3,
+- 0x0f, 0xf9, 0x3c, 0x51, 0x4a, 0x66, 0x7b, 0x78, 0xe7, 0x27, 0xf9, 0x3c,
+- 0x59, 0x6a, 0xad, 0xd3, 0x67, 0x4c, 0x4e, 0x85, 0xac, 0x03, 0x2f, 0xab,
+- 0x52, 0xbc, 0x12, 0x0e, 0xf6, 0xc0, 0x06, 0x1a, 0x0e, 0xce, 0xf1, 0xb3,
+- 0xfe, 0x6d, 0x49, 0xd7, 0x38, 0xcd, 0xf9, 0x83, 0xba, 0x26, 0x67, 0xae,
+- 0x14, 0x97, 0xd4, 0x47, 0x9e, 0x0c, 0x9f, 0xc6, 0x29, 0x35, 0x1f, 0xa9,
+- 0x99, 0xf9, 0x42, 0x4e, 0xaf, 0x30, 0xa4, 0xbb, 0xc8, 0xac, 0x72, 0x75,
+- 0x67, 0x8d, 0xab, 0xbd, 0xa9, 0x1b, 0xeb, 0xaa, 0x77, 0x48, 0x39, 0x47,
+- 0x30, 0x8f, 0xd8, 0xd7, 0x35, 0x55, 0xf3, 0x8f, 0xfe, 0x4c, 0x7d, 0x67,
+- 0x85, 0x09, 0x93, 0x7e, 0x08, 0x6f, 0xd5, 0x63, 0xd1, 0xda, 0x6f, 0x3e,
+- 0x29, 0x5f, 0xf7, 0x82, 0xd3, 0xf1, 0x1e, 0x7e, 0xa7, 0x7b, 0xc1, 0x4f,
+- 0x54, 0x2e, 0xde, 0xf3, 0x19, 0x67, 0x15, 0xd0, 0x45, 0xed, 0xf1, 0x3e,
+- 0x39, 0xa1, 0x83, 0x2a, 0x4a, 0xe0, 0x14, 0xfb, 0xb0, 0x23, 0x5d, 0x49,
+- 0x67, 0x17, 0xf7, 0x0b, 0x1d, 0x87, 0x5c, 0xb0, 0x93, 0x3a, 0x93, 0x73,
+- 0xca, 0x1d, 0x5c, 0xa3, 0xb9, 0xf0, 0x3e, 0xfa, 0xe6, 0xb7, 0xed, 0x96,
+- 0xe7, 0x63, 0x57, 0xe9, 0x39, 0xc3, 0xf2, 0xb4, 0x5f, 0x52, 0x99, 0x5d,
+- 0xb4, 0xe7, 0x2c, 0xed, 0x89, 0x78, 0x21, 0xb9, 0x31, 0x55, 0x59, 0x5f,
+- 0xb0, 0xb4, 0x1d, 0x15, 0x7b, 0x38, 0xa6, 0x39, 0x4f, 0xf6, 0x9f, 0x62,
+- 0x8d, 0xdd, 0x02, 0xfd, 0x3b, 0x85, 0xb6, 0xa1, 0x2d, 0xb1, 0x85, 0xf6,
+- 0x1c, 0x8e, 0x57, 0xf8, 0x94, 0xdf, 0xf1, 0xbc, 0x92, 0xb1, 0xbe, 0x9e,
+- 0x78, 0xbf, 0x22, 0x9d, 0x60, 0x6c, 0xbb, 0xa8, 0xef, 0xab, 0x71, 0xde,
+- 0x57, 0xc1, 0xf2, 0xff, 0x00, 0xb0, 0x60, 0x72, 0xf9, 0x60, 0x17, 0x00,
+- 0x00, 0x00 };
++ 0xbd, 0x59, 0x6d, 0x70, 0x5b, 0x55, 0x7a, 0x7e, 0xae, 0x74, 0x25, 0x5d,
++ 0xdb, 0xb2, 0x75, 0x8d, 0x95, 0x20, 0xb7, 0x2e, 0xd6, 0x8d, 0xaf, 0x6c,
++ 0x11, 0xb9, 0xe1, 0x2a, 0x36, 0x45, 0x19, 0xee, 0x94, 0x1b, 0x7f, 0x21,
++ 0x92, 0x10, 0x94, 0x42, 0x5b, 0x67, 0x96, 0x19, 0x4c, 0xe2, 0x4d, 0x4c,
++ 0x08, 0x6c, 0xba, 0xcb, 0x4c, 0xdd, 0xd9, 0x4c, 0x23, 0xfc, 0x15, 0x93,
++ 0xc8, 0x16, 0x6b, 0x20, 0x26, 0x3b, 0x3b, 0x43, 0xc6, 0xf9, 0x70, 0x0a,
++ 0x72, 0x14, 0xda, 0x3f, 0x3b, 0xd3, 0x65, 0xf0, 0x6c, 0x12, 0x12, 0x58,
++ 0xd8, 0xb4, 0xd3, 0x3f, 0xc9, 0xf4, 0xc7, 0x7a, 0x21, 0xa1, 0x81, 0x42,
++ 0x36, 0xed, 0x0c, 0x9d, 0x50, 0x68, 0x4e, 0x9f, 0x73, 0x25, 0x07, 0x13,
++ 0xb2, 0xfd, 0xd9, 0xcc, 0x08, 0x4b, 0xe7, 0xde, 0x73, 0xce, 0x7b, 0xce,
++ 0xfb, 0x3c, 0xcf, 0xfb, 0x9c, 0xc3, 0x0a, 0x05, 0x95, 0x28, 0xff, 0xab,
++ 0xe6, 0xa7, 0xfd, 0xc9, 0x5d, 0xcf, 0xad, 0x5e, 0xd5, 0xbe, 0x8a, 0x5f,
++ 0x57, 0x2b, 0xcb, 0x55, 0x15, 0xff, 0x8f, 0xff, 0xbc, 0x80, 0xbe, 0x18,
++ 0x87, 0xfc, 0x40, 0xf3, 0xd8, 0xf3, 0x77, 0x75, 0x98, 0xd0, 0xbc, 0xf6,
++ 0x63, 0x4d, 0x5b, 0x4d, 0xc0, 0x29, 0x24, 0xa2, 0x9d, 0xf8, 0x1f, 0x91,
++ 0x0d, 0xab, 0x90, 0xed, 0x7f, 0x64, 0x7f, 0x7d, 0xcf, 0x5b, 0xf7, 0x19,
++ 0xd7, 0x0e, 0x79, 0xa1, 0xe9, 0xf6, 0xb8, 0xaa, 0x37, 0x43, 0x6b, 0x60,
++ 0x9f, 0x9f, 0xb5, 0xf4, 0xfb, 0x50, 0xb3, 0x38, 0x16, 0x70, 0x38, 0x67,
++ 0x58, 0xdb, 0x90, 0xd0, 0x4f, 0x41, 0x85, 0xc3, 0x39, 0x8e, 0x15, 0x80,
++ 0xbd, 0x39, 0x05, 0x97, 0x39, 0xe6, 0x68, 0x41, 0xc3, 0x82, 0xd7, 0x9d,
++ 0xae, 0xaf, 0xc2, 0x46, 0xc6, 0x9c, 0xd8, 0x23, 0x02, 0x26, 0xb2, 0x7f,
++ 0x60, 0x9b, 0xf1, 0xbd, 0x08, 0xa6, 0x66, 0xda, 0x91, 0x59, 0x31, 0xa7,
++ 0x61, 0x73, 0xbe, 0xa1, 0x4f, 0xb3, 0xc1, 0x77, 0x14, 0xa4, 0xee, 0xd3,
++ 0xd0, 0x5b, 0x8c, 0x23, 0x5b, 0xcc, 0xc2, 0x29, 0x8e, 0xf0, 0xa3, 0x21,
++ 0x30, 0xa1, 0x69, 0xf7, 0x4c, 0x2c, 0x97, 0xef, 0x20, 0x38, 0x71, 0x4d,
++ 0x5c, 0x4d, 0xea, 0x78, 0x6f, 0x8d, 0x10, 0xd5, 0x36, 0xb2, 0x55, 0xed,
++ 0x59, 0x78, 0x6d, 0xc3, 0x5a, 0xef, 0x55, 0xd0, 0xf5, 0xc7, 0x66, 0x7c,
++ 0x42, 0x79, 0xf4, 0x51, 0x8f, 0x0d, 0x4d, 0xb1, 0xa3, 0x6a, 0x53, 0xa1,
++ 0x01, 0x63, 0x45, 0x1d, 0x7b, 0x8b, 0x61, 0x8c, 0x14, 0xb1, 0xdb, 0x7b,
++ 0xaf, 0x1f, 0x33, 0x3a, 0x9c, 0xef, 0xb5, 0xec, 0xc6, 0x8e, 0xdc, 0x20,
++ 0xb6, 0xe6, 0x52, 0xd8, 0x57, 0x94, 0x31, 0x46, 0x31, 0x5c, 0x54, 0xe1,
++ 0x9f, 0x30, 0x22, 0xef, 0xe2, 0x76, 0xcf, 0x84, 0x18, 0xb1, 0x02, 0x18,
++ 0xb2, 0xe2, 0x18, 0xcd, 0x7b, 0xb8, 0xce, 0x00, 0x86, 0xcd, 0xeb, 0xa2,
++ 0xdf, 0x32, 0xac, 0x51, 0x88, 0xc6, 0xd3, 0x96, 0x11, 0xe9, 0xf2, 0xc2,
++ 0xf9, 0xb1, 0x19, 0xc1, 0x28, 0x63, 0x1f, 0x71, 0xfb, 0x8d, 0xa0, 0xeb,
++ 0x66, 0x3f, 0x87, 0xfd, 0x74, 0x8c, 0x7d, 0xbb, 0x6f, 0x74, 0x14, 0x89,
++ 0xc8, 0x18, 0x3c, 0xe8, 0x0b, 0xb7, 0xb2, 0x5f, 0x53, 0x74, 0x0c, 0x46,
++ 0x9c, 0xe3, 0x64, 0xfd, 0xed, 0x0e, 0xc7, 0xc8, 0xb2, 0xbf, 0x11, 0x3d,
++ 0x06, 0x39, 0x56, 0x03, 0x7f, 0xb7, 0xb3, 0xbf, 0x02, 0x8f, 0x1d, 0x8b,
++ 0x0e, 0xb1, 0xcf, 0x29, 0x4b, 0xc5, 0x19, 0x7e, 0xfa, 0x74, 0x43, 0x66,
++ 0x56, 0x09, 0xb0, 0x7d, 0x2f, 0xf8, 0xdc, 0xac, 0xc2, 0xa1, 0x8c, 0x85,
++ 0x21, 0xae, 0x5b, 0x63, 0xdb, 0x38, 0xdb, 0x7c, 0xa6, 0xc5, 0xf1, 0xa1,
++ 0x77, 0x15, 0x97, 0x62, 0x62, 0x31, 0x37, 0xbf, 0xaf, 0x9d, 0x63, 0xe4,
++ 0x4b, 0x39, 0x95, 0xef, 0x74, 0xe6, 0x6f, 0x88, 0x27, 0xd5, 0xa5, 0xcf,
++ 0x07, 0x95, 0x0e, 0xb6, 0x39, 0x6a, 0x03, 0xf6, 0xe6, 0xa1, 0xf9, 0x4d,
++ 0x8d, 0xf3, 0x68, 0xf8, 0x28, 0x37, 0xa8, 0xf4, 0x14, 0x1d, 0xa5, 0x7b,
++ 0xb6, 0x43, 0x71, 0x66, 0x55, 0xa5, 0x6b, 0x5a, 0xc6, 0x2d, 0xc4, 0x0b,
++ 0x96, 0xc2, 0x98, 0x7f, 0x22, 0xe3, 0x75, 0xa2, 0xca, 0x0d, 0xb1, 0x32,
++ 0xe6, 0x41, 0x95, 0xd9, 0xa3, 0xac, 0x9f, 0x15, 0x22, 0x9d, 0x4c, 0x2b,
++ 0xeb, 0x66, 0xa1, 0x05, 0x6d, 0x5b, 0xcd, 0x4d, 0xec, 0x43, 0x76, 0x99,
++ 0x89, 0x83, 0xf9, 0x28, 0x3e, 0xb0, 0x3c, 0x38, 0xb4, 0xac, 0x02, 0xaa,
++ 0xa9, 0xf0, 0x83, 0xe0, 0x79, 0x0b, 0x6a, 0x0d, 0xbf, 0x5f, 0xdd, 0xa4,
++ 0x62, 0xa4, 0x7d, 0x9d, 0xd2, 0xc5, 0x3e, 0x3e, 0xe6, 0xf9, 0x68, 0x2e,
++ 0x8d, 0x20, 0xb1, 0x53, 0x65, 0xc7, 0x22, 0x05, 0xee, 0xcd, 0x7b, 0x56,
++ 0x2c, 0xfe, 0xb4, 0xc4, 0x63, 0xad, 0x11, 0x91, 0x7b, 0x53, 0x6d, 0xc7,
++ 0xe2, 0x73, 0xdc, 0x07, 0xaf, 0xa9, 0xe2, 0xd7, 0x96, 0x0f, 0xf3, 0x9b,
++ 0x2c, 0xe6, 0x54, 0x87, 0x9f, 0xed, 0xc7, 0xdc, 0x76, 0xf9, 0x1b, 0x7a,
++ 0xf7, 0xb7, 0xf6, 0xa1, 0xb4, 0x07, 0xc3, 0xf9, 0x26, 0xc6, 0x5c, 0xda,
++ 0x83, 0x47, 0xb8, 0xde, 0xdf, 0xfa, 0xe4, 0xd7, 0xbb, 0x6e, 0xb6, 0x6d,
++ 0x66, 0x9c, 0x1e, 0xdb, 0x9c, 0x5f, 0xe1, 0xad, 0x07, 0xea, 0xda, 0xb1,
++ 0x8f, 0x39, 0xee, 0x4a, 0x2e, 0x47, 0xd6, 0x7d, 0x1e, 0xd6, 0xd7, 0x4f,
++ 0xd7, 0xa1, 0x6f, 0x99, 0xbb, 0x6f, 0xfa, 0xc6, 0x69, 0x21, 0xce, 0x24,
++ 0xfd, 0x98, 0x33, 0x87, 0x22, 0xd5, 0xc8, 0x5a, 0x5e, 0xe6, 0xfb, 0x2c,
++ 0xe7, 0x2f, 0x24, 0xbd, 0x38, 0x9c, 0x3c, 0x84, 0x6c, 0x2d, 0x30, 0x93,
++ 0x93, 0xbc, 0x32, 0xe6, 0xcf, 0xf2, 0xbf, 0x9e, 0xa2, 0x5c, 0x9f, 0xc5,
++ 0xf5, 0x29, 0x38, 0x66, 0x4a, 0x4c, 0x5b, 0x6a, 0x33, 0xf9, 0xb5, 0x83,
++ 0xfb, 0x59, 0xdf, 0x1e, 0x24, 0x3e, 0x81, 0x0f, 0x73, 0xfd, 0xd8, 0x5c,
++ 0x8a, 0x05, 0xd7, 0x73, 0x50, 0x7c, 0x6d, 0x69, 0x1c, 0x2a, 0xfd, 0x26,
++ 0xc7, 0xd3, 0x6a, 0x47, 0xce, 0xc8, 0xa4, 0x91, 0x38, 0xd7, 0xa1, 0xc8,
++ 0xfe, 0x69, 0x75, 0x65, 0xc1, 0x8f, 0x68, 0x5d, 0xe9, 0x79, 0x95, 0xbd,
++ 0x41, 0x7d, 0x7a, 0x42, 0xc1, 0xf6, 0x98, 0x7c, 0xb6, 0x41, 0x6d, 0x29,
++ 0x40, 0xab, 0xb6, 0x77, 0xa9, 0x73, 0x13, 0x46, 0xdf, 0x71, 0x25, 0x11,
++ 0x9d, 0x70, 0xfb, 0xec, 0x52, 0x5b, 0x0b, 0x01, 0xae, 0x27, 0xce, 0x9c,
++ 0x40, 0xab, 0xb1, 0x9f, 0x53, 0x7f, 0xcd, 0x07, 0xe7, 0xdc, 0x3e, 0xcf,
++ 0xa9, 0xf1, 0x82, 0x6c, 0x37, 0xac, 0xa8, 0x12, 0xc0, 0xdd, 0x49, 0x0d,
++ 0x2b, 0x5b, 0x44, 0x63, 0x77, 0xd2, 0x98, 0xef, 0xf6, 0x46, 0x70, 0x90,
++ 0x5c, 0x20, 0xee, 0x9c, 0x3f, 0x6c, 0x19, 0x41, 0x77, 0xd1, 0x8b, 0x68,
++ 0xad, 0x83, 0xfd, 0xf9, 0x00, 0x7e, 0x49, 0xfc, 0xf7, 0x58, 0x3a, 0x46,
++ 0xf2, 0x46, 0xfc, 0x57, 0x48, 0xa4, 0x8e, 0x30, 0x67, 0x0b, 0xe4, 0xc0,
++ 0xfe, 0x62, 0x53, 0xfc, 0x08, 0x8c, 0x81, 0x6e, 0x72, 0x40, 0x6b, 0x97,
++ 0x31, 0x40, 0x57, 0x6d, 0x72, 0xa7, 0xd8, 0x80, 0x1c, 0xf9, 0xd0, 0xed,
++ 0xf2, 0x6a, 0x50, 0xe9, 0x2a, 0xbe, 0x4f, 0x6d, 0xed, 0x21, 0xbe, 0x10,
++ 0x8a, 0x98, 0x7e, 0xa4, 0xea, 0xa2, 0x38, 0x4d, 0xac, 0x64, 0xc3, 0x15,
++ 0xcc, 0xa5, 0xcc, 0xe7, 0x45, 0x3e, 0x5f, 0xa7, 0x74, 0xce, 0x46, 0xf1,
++ 0x4b, 0xeb, 0x6b, 0xe1, 0x84, 0xab, 0xd9, 0xe6, 0x5b, 0xd2, 0xae, 0xe1,
++ 0xf2, 0xcb, 0x95, 0xf8, 0xf4, 0xe5, 0x20, 0xbe, 0x7c, 0x99, 0xfc, 0xce,
++ 0xa3, 0xbd, 0x12, 0x42, 0xa4, 0xda, 0x84, 0x28, 0x5a, 0xad, 0xf8, 0xa8,
++ 0x36, 0x16, 0xbd, 0x00, 0xa9, 0x8d, 0x8e, 0xba, 0x35, 0x67, 0xec, 0x1a,
++ 0x40, 0xc2, 0x39, 0xe5, 0xee, 0x85, 0xa3, 0xae, 0x2a, 0x9c, 0x16, 0xd8,
++ 0x54, 0xda, 0x0b, 0xbf, 0xdd, 0xa5, 0xbe, 0xc3, 0xdc, 0x9c, 0x77, 0x73,
++ 0xd3, 0xa5, 0xde, 0x53, 0xb8, 0xdf, 0x83, 0xca, 0xd2, 0x33, 0xd5, 0xce,
++ 0xa8, 0x23, 0x39, 0xa3, 0x77, 0x9c, 0xeb, 0xeb, 0x77, 0xfb, 0x66, 0xd4,
++ 0x04, 0xf7, 0x7e, 0xa1, 0x9c, 0x9b, 0x6a, 0xfb, 0x31, 0xee, 0x33, 0x73,
++ 0xef, 0xee, 0xe3, 0x63, 0xdc, 0x63, 0x39, 0xdf, 0xe0, 0x2d, 0xf3, 0x0d,
++ 0x72, 0xbe, 0xe3, 0x4b, 0xe6, 0xdb, 0xbd, 0x64, 0xbe, 0xdd, 0x4b, 0xe6,
++ 0x4b, 0x91, 0xab, 0xff, 0x22, 0x86, 0xc2, 0xa5, 0xb1, 0x55, 0x7b, 0xe0,
++ 0x96, 0xb9, 0x07, 0x38, 0xf7, 0x01, 0xb1, 0x90, 0x29, 0x8d, 0x53, 0x6d,
++ 0xef, 0x5c, 0x32, 0xf7, 0x4e, 0xce, 0xbd, 0x38, 0x8e, 0x4e, 0x2d, 0x12,
++ 0x62, 0xa3, 0x25, 0x84, 0x6a, 0x9b, 0x7a, 0x17, 0x9a, 0x33, 0x5d, 0xc4,
++ 0x4e, 0x25, 0x12, 0xf3, 0x1e, 0x98, 0x83, 0xf5, 0x5e, 0x1f, 0x16, 0x6a,
++ 0x17, 0xb9, 0x51, 0x5d, 0xfe, 0xfb, 0x9a, 0x02, 0x6a, 0xfd, 0x1b, 0xb9,
++ 0x10, 0xc7, 0x88, 0xe9, 0xfd, 0x8a, 0x10, 0xa7, 0xd6, 0x24, 0x06, 0xbc,
++ 0x48, 0xf4, 0xd5, 0xc0, 0x24, 0x86, 0x7c, 0x65, 0x2e, 0x2c, 0xed, 0x73,
++ 0xdc, 0xed, 0x53, 0x74, 0xfb, 0x08, 0xf1, 0xe1, 0xbd, 0x57, 0xc4, 0x5b,
++ 0x2d, 0x61, 0xbc, 0x4d, 0x4e, 0x9e, 0x2c, 0x2e, 0xea, 0x8a, 0xd4, 0x0d,
++ 0x78, 0x4e, 0x59, 0x7e, 0xc6, 0x34, 0xb4, 0xc3, 0xff, 0xad, 0xfe, 0x04,
++ 0x8c, 0x29, 0xdb, 0xbc, 0x78, 0x3d, 0x89, 0x27, 0x2b, 0x61, 0xf4, 0xee,
++ 0x53, 0xb2, 0xe9, 0x2a, 0x18, 0xce, 0x4a, 0x25, 0x9b, 0xd2, 0x20, 0x79,
++ 0xa3, 0x36, 0x1e, 0x35, 0x8d, 0xec, 0x65, 0xbe, 0xac, 0x4e, 0xde, 0x2e,
++ 0x06, 0x95, 0x63, 0x04, 0xf1, 0x6c, 0xfe, 0x7d, 0xcc, 0xfb, 0xa4, 0x86,
++ 0x49, 0xed, 0xe4, 0xc0, 0x27, 0xa4, 0x86, 0x05, 0x48, 0x44, 0x15, 0x7b,
++ 0xf2, 0x9e, 0xd3, 0x8d, 0x10, 0xf0, 0xb7, 0xf9, 0x70, 0xd1, 0x1c, 0xb6,
++ 0xea, 0xb1, 0x16, 0xe7, 0x5b, 0xb9, 0x07, 0xcb, 0x54, 0x44, 0x66, 0x96,
++ 0x8e, 0x15, 0xe1, 0x58, 0x11, 0x7c, 0x92, 0x13, 0xa2, 0xd2, 0x36, 0xe2,
++ 0x0b, 0x30, 0x19, 0x47, 0x04, 0x57, 0x0a, 0x5b, 0xfc, 0xa8, 0x09, 0x43,
++ 0x6d, 0x56, 0xb1, 0x3d, 0xaf, 0x29, 0xdd, 0x79, 0xe8, 0x5e, 0xdb, 0x8c,
++ 0x1e, 0xc6, 0x51, 0xc6, 0xc3, 0xba, 0x76, 0x4c, 0x55, 0x36, 0x4e, 0x07,
++ 0x50, 0x3d, 0xf5, 0x99, 0x78, 0x9f, 0x7a, 0xf8, 0xc6, 0xbd, 0xac, 0x17,
++ 0xc9, 0x00, 0xaa, 0xdc, 0xb9, 0x85, 0xf8, 0xb8, 0xad, 0x0e, 0x17, 0x39,
++ 0x5f, 0xf4, 0x2f, 0x03, 0xf0, 0x4e, 0x05, 0xe0, 0x9b, 0x52, 0x30, 0xd3,
++ 0x1e, 0x80, 0x67, 0x46, 0xfe, 0x56, 0x10, 0x30, 0xa7, 0xb1, 0x5d, 0x6f,
++ 0xc0, 0x78, 0x9e, 0x45, 0xda, 0xfc, 0x19, 0x06, 0xdc, 0xef, 0x2a, 0x9e,
++ 0xca, 0x6b, 0x08, 0x1d, 0x10, 0xa2, 0xd1, 0x16, 0x22, 0x96, 0xf4, 0x60,
++ 0xd6, 0x1c, 0x8e, 0x06, 0xb8, 0x8e, 0x61, 0x4b, 0x6a, 0x8e, 0x0f, 0xea,
++ 0x8c, 0x91, 0x39, 0xc7, 0xa8, 0x37, 0x4f, 0xa8, 0x4a, 0xef, 0xf4, 0x1e,
++ 0xc1, 0x98, 0xfa, 0x1e, 0xf0, 0x0a, 0x51, 0xd3, 0xd6, 0x34, 0x70, 0x9e,
++ 0xda, 0x3c, 0x13, 0x8b, 0xf5, 0x0e, 0x29, 0xc0, 0xfa, 0x39, 0x1f, 0xfc,
++ 0x53, 0xff, 0xc5, 0x3a, 0x2b, 0x44, 0xe1, 0x5e, 0x81, 0x77, 0xad, 0x6c,
++ 0xbc, 0x02, 0x46, 0xea, 0x24, 0xc2, 0xb8, 0xf4, 0xa2, 0x10, 0xdb, 0xdb,
++ 0x43, 0x78, 0xcd, 0x32, 0x76, 0x7d, 0xec, 0x15, 0xb8, 0x98, 0xcc, 0x0e,
++ 0xd6, 0x53, 0xb7, 0xae, 0x29, 0x51, 0x54, 0xe5, 0x8d, 0xcc, 0x15, 0x85,
++ 0x4b, 0x9f, 0x31, 0xf5, 0x9d, 0x4a, 0x10, 0x55, 0x27, 0x82, 0xe8, 0x98,
++ 0xf3, 0xa3, 0x62, 0x2a, 0x08, 0xef, 0xa4, 0x79, 0xfd, 0x41, 0xb8, 0xe3,
++ 0x58, 0x27, 0xd1, 0x8c, 0x8b, 0x2f, 0x1b, 0xf3, 0xc7, 0x89, 0x93, 0xed,
++ 0x88, 0xe2, 0x37, 0x05, 0x13, 0x17, 0x0b, 0x41, 0xa8, 0x27, 0x74, 0xd4,
++ 0xbb, 0xf5, 0x4e, 0x47, 0xb5, 0xe9, 0x61, 0x5e, 0x1c, 0xe5, 0x61, 0xb7,
++ 0x9e, 0x74, 0xf1, 0xd3, 0xa3, 0x74, 0xb0, 0xae, 0x6c, 0x98, 0x26, 0x95,
++ 0xf9, 0xec, 0x9c, 0x75, 0x43, 0xec, 0x8f, 0xa5, 0x59, 0x47, 0x2a, 0xe0,
++ 0xb3, 0xd7, 0xb1, 0x8e, 0xb0, 0x38, 0xb9, 0xba, 0x5f, 0xa1, 0xf8, 0xec,
++ 0xef, 0x6a, 0x7e, 0x88, 0x9a, 0x5f, 0xfc, 0x3f, 0x35, 0x5f, 0x85, 0x3a,
++ 0xe5, 0xc1, 0x98, 0x19, 0xc0, 0x6f, 0xac, 0xa6, 0x73, 0x8d, 0x08, 0x20,
++ 0xd5, 0xa6, 0x23, 0x72, 0xc2, 0xc2, 0x8b, 0xdc, 0x5b, 0xdc, 0x71, 0x6b,
++ 0x3d, 0x04, 0x76, 0x92, 0x53, 0x15, 0xd4, 0x86, 0xbb, 0x27, 0x82, 0xd4,
++ 0x29, 0x55, 0x59, 0x4f, 0x9d, 0xdf, 0x91, 0xbc, 0x21, 0xd2, 0x31, 0x23,
++ 0x1e, 0x57, 0x12, 0xa9, 0xbf, 0x43, 0x49, 0x3b, 0x62, 0xd4, 0xd1, 0x05,
++ 0x7d, 0x91, 0x83, 0x5d, 0x2e, 0x07, 0x67, 0x62, 0x25, 0xed, 0x58, 0x51,
++ 0x28, 0xf1, 0xef, 0x01, 0xea, 0xe7, 0xf5, 0xb6, 0x92, 0x76, 0xbe, 0x4a,
++ 0xff, 0xd3, 0xcb, 0xf1, 0x1e, 0x99, 0x36, 0xb2, 0xbd, 0xcc, 0xcf, 0x25,
++ 0x62, 0x63, 0x92, 0x19, 0x9c, 0xaf, 0xa5, 0xa6, 0x36, 0x07, 0x18, 0xe3,
++ 0x75, 0x71, 0x9a, 0xde, 0x62, 0x98, 0xfd, 0x46, 0xf3, 0x46, 0x74, 0x98,
++ 0x7c, 0x1f, 0x2d, 0x6b, 0xe9, 0x30, 0xfd, 0xc4, 0x28, 0xf3, 0xf4, 0x36,
++ 0x9f, 0x9d, 0xcc, 0x1b, 0xe9, 0x2e, 0x57, 0x53, 0xa5, 0xaf, 0x90, 0x31,
++ 0x49, 0x6f, 0x11, 0xc1, 0x5b, 0x2d, 0x52, 0x5f, 0x1b, 0xa8, 0xaf, 0x8b,
++ 0xba, 0x2a, 0xf1, 0x70, 0x4d, 0x84, 0x5a, 0x42, 0x5e, 0xc9, 0xcb, 0x4b,
++ 0x49, 0x21, 0xaa, 0xec, 0x20, 0x2a, 0x27, 0xcc, 0xf4, 0x7a, 0x25, 0x16,
++ 0x31, 0x95, 0xbb, 0xd8, 0xce, 0x1c, 0xce, 0x6d, 0xf2, 0xba, 0xde, 0xf6,
++ 0x84, 0x10, 0x21, 0x5b, 0x47, 0xcd, 0x84, 0x49, 0xdc, 0xc4, 0xfa, 0x8e,
++ 0xb8, 0xcf, 0x75, 0x04, 0xe7, 0x16, 0xc8, 0xe7, 0x08, 0xf9, 0x1c, 0xc6,
++ 0x9b, 0xb7, 0x70, 0x9a, 0x5a, 0xeb, 0xe9, 0x27, 0xa7, 0xb3, 0xe1, 0xa1,
++ 0x2d, 0xde, 0x6f, 0xf1, 0x71, 0xbf, 0xe4, 0x34, 0xdb, 0xbc, 0x78, 0x21,
++ 0x89, 0xcd, 0xc4, 0x47, 0xe6, 0x29, 0x25, 0xeb, 0x90, 0xdb, 0xa9, 0x0a,
++ 0x25, 0x4b, 0x17, 0xf5, 0x0d, 0xa7, 0xcf, 0xf0, 0x6d, 0x2f, 0x39, 0xdd,
++ 0x17, 0xbe, 0x95, 0xd3, 0x2c, 0xbe, 0xcc, 0xf7, 0x33, 0xf9, 0x83, 0x98,
++ 0xf1, 0xf9, 0x11, 0x99, 0xf2, 0x21, 0x30, 0xa5, 0x92, 0x5f, 0x0a, 0xfd,
++ 0x41, 0x36, 0x1e, 0x80, 0x91, 0x3e, 0x89, 0x08, 0x12, 0x13, 0x1a, 0xfe,
++ 0xaa, 0xc5, 0x87, 0x63, 0x31, 0x23, 0xb3, 0x93, 0x3c, 0x5d, 0x39, 0x37,
++ 0xc4, 0x88, 0x8c, 0x68, 0xd4, 0x53, 0xe2, 0xab, 0xaf, 0xd9, 0x0f, 0x6d,
++ 0xca, 0xe5, 0xe0, 0x1e, 0x8f, 0x9d, 0x8d, 0x6a, 0x30, 0x76, 0xfd, 0x84,
++ 0xb8, 0xb8, 0x30, 0x21, 0x44, 0x67, 0xbb, 0x79, 0xee, 0x23, 0xaf, 0x41,
++ 0x2d, 0x54, 0x71, 0x7e, 0xae, 0x34, 0x7e, 0xd5, 0x94, 0x06, 0xff, 0x01,
++ 0x77, 0xfc, 0xeb, 0x6f, 0x32, 0x8a, 0xcf, 0xf3, 0x12, 0x9f, 0x42, 0x04,
++ 0x6c, 0x33, 0x32, 0x4b, 0x3d, 0xdc, 0x97, 0x34, 0xb8, 0x7f, 0x4d, 0x4e,
++ 0x33, 0xbf, 0x7b, 0x92, 0xb1, 0xe8, 0x16, 0xbe, 0x73, 0xa9, 0x58, 0xe2,
++ 0x70, 0xbd, 0xb9, 0x15, 0x7f, 0xa3, 0x7b, 0x51, 0x63, 0xfe, 0x10, 0xcf,
++ 0xba, 0x1a, 0x45, 0xec, 0x4f, 0x56, 0xa2, 0x91, 0x98, 0x7f, 0x82, 0x98,
++ 0xdf, 0x3c, 0x4b, 0xad, 0x99, 0x6a, 0x67, 0x7e, 0x25, 0xdf, 0xbb, 0x94,
++ 0xde, 0xd9, 0x1e, 0xd7, 0x57, 0x3d, 0x32, 0xed, 0xc1, 0x9b, 0xd6, 0x5a,
++ 0x7a, 0x98, 0xb4, 0xf2, 0xc8, 0xac, 0xc4, 0xfb, 0x3a, 0xe5, 0x41, 0x62,
++ 0x3f, 0x7a, 0x87, 0x8a, 0x19, 0x6b, 0xad, 0xe2, 0x77, 0xb1, 0xef, 0x83,
++ 0x93, 0x29, 0xe1, 0xde, 0x6b, 0xc7, 0xac, 0x53, 0x4b, 0x70, 0xdf, 0x73,
++ 0x1b, 0xaf, 0x23, 0xb5, 0x03, 0x25, 0x7d, 0xd7, 0xbb, 0x98, 0xaf, 0xe7,
++ 0xcb, 0xf8, 0x7e, 0x96, 0xed, 0xbe, 0x29, 0x68, 0x95, 0xc4, 0xf0, 0x3a,
++ 0x62, 0x7c, 0x92, 0x38, 0x79, 0x78, 0x5a, 0xe0, 0x0d, 0xd6, 0x89, 0x42,
++ 0xd2, 0xb0, 0x76, 0x2a, 0x46, 0xba, 0x47, 0x49, 0x64, 0x57, 0x96, 0x6b,
++ 0xe4, 0xdd, 0xac, 0x73, 0xb8, 0x43, 0xe0, 0xe7, 0x16, 0xb4, 0x00, 0xb1,
++ 0xfd, 0x6f, 0xac, 0x59, 0xff, 0x51, 0xae, 0x91, 0xc9, 0x42, 0x25, 0x42,
++ 0x2d, 0xd4, 0x7c, 0x62, 0xb9, 0x9b, 0x58, 0x3e, 0x44, 0x3e, 0x8c, 0xd0,
++ 0x13, 0x6c, 0x26, 0x96, 0x57, 0xb4, 0x19, 0xd9, 0x2e, 0xfa, 0x69, 0xcf,
++ 0xea, 0x08, 0x71, 0x1a, 0xa7, 0x87, 0x1d, 0x41, 0x07, 0xe7, 0x4a, 0x4f,
++ 0x1b, 0x91, 0x0e, 0xe2, 0x5f, 0x65, 0x9f, 0xd7, 0xd8, 0x67, 0xa1, 0x4e,
++ 0x7a, 0xed, 0x00, 0x5e, 0x60, 0x1f, 0x33, 0xe9, 0xb8, 0x3a, 0x21, 0xf1,
++ 0x3f, 0x86, 0x44, 0x46, 0xe2, 0xdf, 0x59, 0xd6, 0x4a, 0xdf, 0x2f, 0xf1,
++ 0x4f, 0x0c, 0xe6, 0x89, 0xc1, 0x12, 0x07, 0x06, 0x24, 0x07, 0x6a, 0xe8,
++ 0x2b, 0x4e, 0xd0, 0x57, 0x54, 0xd9, 0x51, 0xe2, 0x5f, 0xf2, 0xa1, 0xe4,
++ 0x2d, 0xba, 0xca, 0x1c, 0x58, 0xef, 0xce, 0x27, 0x35, 0x20, 0x88, 0xa6,
++ 0x49, 0x43, 0x57, 0x95, 0xff, 0x14, 0x4f, 0x98, 0xe6, 0xfc, 0x76, 0xfa,
++ 0x83, 0x2f, 0xdb, 0x62, 0xcc, 0x7b, 0x10, 0xf7, 0x9c, 0x08, 0xa9, 0x12,
++ 0xe7, 0xf5, 0x93, 0x41, 0x84, 0x26, 0x25, 0x0f, 0xb2, 0xe3, 0x11, 0x62,
++ 0xc4, 0xf2, 0xfc, 0x96, 0xf8, 0x8f, 0x12, 0x17, 0xaa, 0xd2, 0xcd, 0x31,
++ 0x6a, 0xa6, 0x74, 0xb4, 0x4e, 0x1a, 0x03, 0x27, 0x70, 0x55, 0xbc, 0x11,
++ 0x33, 0x33, 0x7b, 0x99, 0xff, 0x6d, 0xc9, 0x18, 0xf7, 0x4a, 0xc7, 0xdd,
++ 0x37, 0xc7, 0x70, 0x39, 0xe1, 0x6c, 0xb1, 0x82, 0x65, 0xaf, 0xad, 0x61,
++ 0x4b, 0x1e, 0xd8, 0x96, 0xa7, 0xd9, 0x35, 0x3d, 0xab, 0xfc, 0xb8, 0x86,
++ 0xc3, 0x44, 0x7f, 0xbf, 0xee, 0x30, 0xff, 0x01, 0xea, 0x7d, 0xe9, 0x9d,
++ 0x92, 0x07, 0xff, 0x79, 0xf9, 0x8c, 0xf9, 0x2b, 0x4f, 0xe9, 0xef, 0xdb,
++ 0xde, 0xc5, 0x33, 0xe7, 0x16, 0x62, 0xb0, 0x93, 0x18, 0xec, 0x61, 0x8e,
++ 0xb6, 0x5b, 0xe4, 0x36, 0xf3, 0x99, 0x55, 0x03, 0xf4, 0xd4, 0x4d, 0x7d,
++ 0xd5, 0xd4, 0xb4, 0x7d, 0xd4, 0xa7, 0x77, 0xcd, 0x4a, 0x7a, 0x70, 0x87,
++ 0xda, 0xd9, 0x41, 0xdd, 0xec, 0x52, 0x1e, 0x72, 0xb1, 0x95, 0x26, 0x8e,
++ 0x34, 0x25, 0x4d, 0x5f, 0xeb, 0x63, 0xed, 0x38, 0x14, 0x5e, 0xf4, 0xdf,
++ 0x32, 0x4e, 0xe9, 0xb9, 0x8d, 0xb8, 0x2c, 0xbf, 0xcf, 0xba, 0x3a, 0xb4,
++ 0x16, 0xaa, 0xbd, 0x56, 0x51, 0x6d, 0x79, 0xc6, 0x50, 0xf1, 0x03, 0xea,
++ 0xec, 0xc2, 0x26, 0x79, 0xd6, 0xe0, 0xba, 0xd8, 0x16, 0x31, 0x63, 0xd1,
++ 0x83, 0xc4, 0xd5, 0xab, 0xdf, 0x39, 0x7b, 0x94, 0xf0, 0x36, 0x9c, 0x57,
++ 0x6f, 0xfa, 0x68, 0xa9, 0x0f, 0x6b, 0x6f, 0xe2, 0x4d, 0xc3, 0x33, 0x2d,
++ 0x51, 0xe2, 0x51, 0x62, 0x4d, 0x43, 0xe1, 0x95, 0x4a, 0xbc, 0xf1, 0x4a,
++ 0x10, 0xaf, 0xbf, 0x22, 0xc4, 0x68, 0x12, 0x3c, 0xe1, 0x08, 0xf1, 0x50,
++ 0x72, 0x0d, 0x8e, 0xeb, 0xb1, 0xe8, 0x0b, 0xae, 0x8f, 0x75, 0xe8, 0x63,
++ 0x8d, 0x81, 0xb3, 0xb8, 0x21, 0x0a, 0x2e, 0xa7, 0x13, 0xe4, 0x5b, 0x09,
++ 0x8b, 0xae, 0xdf, 0xad, 0xd5, 0x70, 0x81, 0xf8, 0x0b, 0x11, 0x7f, 0xbf,
++ 0xa3, 0xe6, 0x5e, 0x2d, 0x6b, 0xee, 0xaa, 0x02, 0xf9, 0xd8, 0x16, 0x40,
++ 0x8f, 0x5c, 0x0b, 0x71, 0x38, 0x7c, 0x13, 0x87, 0xac, 0xbd, 0xdc, 0xf3,
++ 0xb3, 0x96, 0x11, 0xef, 0x24, 0x1e, 0x67, 0x2c, 0xc3, 0xe9, 0xa0, 0x9f,
++ 0x1d, 0x76, 0x31, 0x49, 0xed, 0x8d, 0x49, 0x5c, 0x12, 0x87, 0xcc, 0xc9,
++ 0x3e, 0xf6, 0x39, 0xcd, 0x3e, 0x63, 0x65, 0x3f, 0xfb, 0x1e, 0x12, 0x69,
++ 0xe9, 0x67, 0xa3, 0xc4, 0xe0, 0x3e, 0xd7, 0xcf, 0x4a, 0xff, 0x2a, 0xbd,
++ 0xab, 0x8c, 0xb3, 0xdd, 0x8d, 0xb3, 0xfb, 0x26, 0x0e, 0xa9, 0x61, 0xb5,
++ 0x12, 0x7f, 0x0f, 0x60, 0xec, 0xa5, 0x1a, 0x84, 0xcc, 0x3b, 0x71, 0x3e,
++ 0xf3, 0x80, 0x1a, 0x31, 0xa1, 0xd7, 0xdb, 0x25, 0x3c, 0x6e, 0x2e, 0xa6,
++ 0x90, 0xcf, 0xbf, 0x23, 0xf2, 0x61, 0xc3, 0x39, 0xeb, 0x7a, 0xd2, 0x01,
++ 0x7a, 0xc4, 0x1b, 0xc2, 0x13, 0x33, 0xce, 0x6d, 0xa1, 0x2f, 0x6b, 0xf2,
++ 0x96, 0xfc, 0xdd, 0x9a, 0xc2, 0xfb, 0x02, 0x75, 0xa5, 0x75, 0xaa, 0xf4,
++ 0x74, 0x23, 0xe4, 0xdc, 0xa8, 0x59, 0xf2, 0x77, 0xb1, 0xc2, 0xa7, 0xaa,
++ 0xd4, 0x73, 0x4f, 0x9b, 0x1c, 0x37, 0x4d, 0x0d, 0x59, 0x1c, 0xfb, 0x1b,
++ 0x5d, 0x1e, 0x21, 0x06, 0x87, 0xa5, 0xd7, 0xa2, 0x2f, 0xe1, 0x59, 0x7d,
++ 0x89, 0xa6, 0xee, 0xf6, 0xc2, 0x94, 0x6d, 0x8e, 0xf2, 0x10, 0xd7, 0xa0,
++ 0x99, 0x83, 0x4a, 0x9a, 0xb5, 0x79, 0x2f, 0xf1, 0xd5, 0xc3, 0x1a, 0x7c,
++ 0xd9, 0x6a, 0x26, 0x87, 0x05, 0xeb, 0xd0, 0x0d, 0xb1, 0xcf, 0x5c, 0x3c,
++ 0xd3, 0xc9, 0xf3, 0x5c, 0x9c, 0x71, 0x57, 0xb3, 0x76, 0xaf, 0x63, 0xbd,
++ 0xe6, 0x69, 0x91, 0x39, 0xfd, 0x32, 0x26, 0x1a, 0x57, 0xb5, 0x19, 0x03,
++ 0x1b, 0xbd, 0x01, 0xe4, 0x88, 0xf7, 0x57, 0x59, 0x83, 0xf2, 0xdc, 0xd3,
++ 0xc9, 0xa2, 0x91, 0xca, 0x62, 0x04, 0x1b, 0xb9, 0xa7, 0x3c, 0x03, 0x39,
++ 0xff, 0x18, 0x2b, 0x9d, 0x91, 0xb7, 0xb3, 0xb6, 0x8d, 0x97, 0xb9, 0x7d,
++ 0x05, 0x09, 0x4b, 0x72, 0x7b, 0x9e, 0xb5, 0x6d, 0xdc, 0xe5, 0xb6, 0x91,
++ 0x92, 0x7c, 0xae, 0x28, 0xd7, 0xb4, 0x4f, 0x20, 0x39, 0x7c, 0x6b, 0x3d,
++ 0x93, 0x78, 0x5e, 0xeb, 0x93, 0xde, 0x36, 0x9f, 0x97, 0x35, 0x49, 0xd6,
++ 0xa2, 0xc5, 0xba, 0xa4, 0xc9, 0xfb, 0x84, 0x4c, 0xe3, 0xc4, 0x1e, 0xe1,
++ 0x29, 0xdd, 0x49, 0x9c, 0xfb, 0xd0, 0x1b, 0x4c, 0xa5, 0xee, 0x43, 0x26,
++ 0x32, 0xa7, 0x61, 0x53, 0xbe, 0xa1, 0x2f, 0x60, 0x83, 0xef, 0x28, 0xb0,
++ 0xfe, 0x44, 0x43, 0xe6, 0x96, 0x3b, 0x89, 0x8f, 0x73, 0x9a, 0x16, 0x9a,
++ 0x58, 0x2e, 0xdf, 0xc1, 0x67, 0xb9, 0xdb, 0xde, 0x49, 0xa4, 0x7f, 0xdf,
++ 0x9d, 0xc4, 0x0b, 0xe4, 0xc7, 0x58, 0xe9, 0x4e, 0xc2, 0xf9, 0x5e, 0x8b,
++ 0x17, 0x33, 0x61, 0xec, 0xfe, 0xa8, 0x5d, 0xc5, 0xe5, 0x9c, 0x11, 0x39,
++ 0x8e, 0xdd, 0xe8, 0x77, 0xef, 0x1f, 0x90, 0xf5, 0xdb, 0xbb, 0xf0, 0x4f,
++ 0xed, 0xf2, 0xfe, 0x21, 0x25, 0xd7, 0x38, 0xce, 0xe5, 0x43, 0xa3, 0xde,
++ 0xac, 0x67, 0x2d, 0xd8, 0xb1, 0x46, 0xc1, 0x43, 0xc9, 0x3b, 0x5d, 0x6c,
++ 0x8f, 0x17, 0x8d, 0x74, 0x94, 0xcf, 0xee, 0x99, 0x90, 0x35, 0xf2, 0x71,
++ 0x9e, 0x17, 0xa1, 0x35, 0xda, 0xbd, 0xaa, 0xc8, 0x37, 0x45, 0xae, 0x28,
++ 0x86, 0x73, 0x18, 0xf2, 0x8e, 0x20, 0x71, 0xce, 0xab, 0x18, 0xf3, 0x1f,
++ 0x7a, 0x8d, 0x54, 0xbd, 0x8b, 0x99, 0xc7, 0x79, 0x76, 0x93, 0x7f, 0x7b,
++ 0xe5, 0xb9, 0x0f, 0x1b, 0x39, 0xe6, 0x07, 0x6b, 0xe4, 0x59, 0xf4, 0x73,
++ 0x91, 0x5d, 0x66, 0x38, 0x0b, 0x8a, 0xc6, 0xdc, 0x80, 0xfa, 0x24, 0x35,
++ 0xfc, 0x71, 0x6a, 0xb8, 0xf4, 0x2c, 0xbd, 0xf4, 0x2c, 0x4d, 0xf3, 0x71,
++ 0xaf, 0x91, 0xb9, 0x4e, 0xbd, 0xe3, 0x98, 0x7d, 0xbd, 0x8a, 0xd1, 0x7b,
++ 0x82, 0xfa, 0xbf, 0x53, 0x29, 0x8d, 0xb9, 0xb2, 0x3c, 0xe6, 0xdd, 0x05,
++ 0x4d, 0xe9, 0xcc, 0x83, 0xba, 0x83, 0xe8, 0x36, 0x8b, 0xda, 0x51, 0xac,
++ 0x24, 0xc7, 0x4c, 0xb9, 0x66, 0xc6, 0xd6, 0xca, 0xd8, 0x14, 0x5c, 0x69,
++ 0x91, 0xef, 0xb6, 0xca, 0x38, 0x9c, 0x2a, 0x3b, 0x45, 0xed, 0x7d, 0xc5,
++ 0x57, 0xd6, 0x2f, 0xcf, 0x16, 0x6b, 0x19, 0x9c, 0x30, 0x42, 0x3e, 0xb3,
++ 0x0e, 0xa3, 0xb4, 0x81, 0x41, 0xb3, 0x19, 0x39, 0xdd, 0x8f, 0x2d, 0xd6,
++ 0x17, 0x82, 0x3a, 0xc9, 0xf7, 0x81, 0xa7, 0x5e, 0xe2, 0x19, 0xde, 0xbc,
++ 0x86, 0x58, 0xf2, 0x39, 0x1c, 0xd3, 0x77, 0xd1, 0x0f, 0x6e, 0xc5, 0xeb,
++ 0xae, 0x9e, 0xd8, 0xc4, 0xb3, 0x42, 0x0c, 0xd9, 0xb2, 0xd6, 0xdd, 0x32,
++ 0xb6, 0xbc, 0x93, 0xb8, 0x24, 0xb2, 0xa5, 0x31, 0x9c, 0x6d, 0x56, 0x86,
++ 0x71, 0x7d, 0xa3, 0xbb, 0x3b, 0xa8, 0xbb, 0x15, 0xa6, 0xe7, 0xae, 0x4a,
++ 0xea, 0xee, 0x56, 0xeb, 0xcf, 0xf1, 0x14, 0x39, 0x5e, 0x65, 0x7e, 0x26,
++ 0x9e, 0x0e, 0xcb, 0x31, 0xa9, 0xaf, 0x35, 0x4b, 0xc7, 0xff, 0x90, 0x63,
++ 0xca, 0x39, 0x64, 0x3d, 0x3c, 0x2f, 0x0e, 0xd5, 0xca, 0x31, 0x07, 0x95,
++ 0x8d, 0xe4, 0xd4, 0x3c, 0x4b, 0xef, 0x0f, 0xc8, 0xa7, 0x05, 0xe6, 0xa7,
++ 0xf1, 0x36, 0x7c, 0x6a, 0x24, 0x9f, 0x9e, 0x58, 0xc2, 0xa7, 0x83, 0x79,
++ 0xe9, 0xbd, 0x14, 0xb4, 0xb4, 0xfd, 0x29, 0x75, 0x45, 0x08, 0x7f, 0xdb,
++ 0x0d, 0x71, 0xc6, 0xf5, 0xbe, 0xd2, 0xef, 0xa6, 0x95, 0xee, 0x59, 0xa9,
++ 0x4f, 0xd5, 0x08, 0x92, 0x4f, 0x1b, 0xc8, 0xa7, 0x7e, 0xf2, 0xe9, 0x69,
++ 0x53, 0x34, 0xee, 0x48, 0x1a, 0xa9, 0x79, 0xfa, 0x9a, 0x75, 0xe4, 0xd4,
++ 0x3b, 0xe4, 0xd4, 0x48, 0xb1, 0xa4, 0x53, 0xfb, 0xb8, 0xee, 0xfb, 0xa9,
++ 0x53, 0xeb, 0x8a, 0x52, 0xdb, 0x1c, 0xe2, 0x3f, 0x80, 0xcf, 0xc9, 0xa9,
++ 0xd9, 0xa4, 0xab, 0x53, 0xd6, 0xef, 0x90, 0xd8, 0x75, 0x5a, 0xf2, 0x89,
++ 0x3a, 0x95, 0x2f, 0x36, 0x59, 0xa7, 0xb9, 0xa6, 0xf1, 0xbc, 0x71, 0xbd,
++ 0x87, 0x9c, 0xf2, 0xb5, 0x1b, 0xe7, 0x2e, 0x13, 0xbb, 0x81, 0x18, 0xf4,
++ 0x88, 0x2d, 0xd7, 0xc4, 0x1a, 0xcb, 0x3a, 0x79, 0x90, 0xf8, 0xef, 0xa1,
++ 0x66, 0xf4, 0x16, 0x6d, 0xec, 0x2d, 0x2e, 0xdd, 0x53, 0xd6, 0xa1, 0xdb,
++ 0xee, 0xcb, 0xb8, 0xff, 0xf6, 0xed, 0xac, 0x57, 0xb7, 0x6d, 0x97, 0x7c,
++ 0x5d, 0xe6, 0x97, 0x7c, 0x1d, 0xce, 0xbf, 0xa6, 0xde, 0xfe, 0x1d, 0x79,
++ 0xa7, 0x26, 0xc4, 0x51, 0x4b, 0xde, 0x49, 0x48, 0xdf, 0xa3, 0x60, 0xc8,
++ 0x92, 0xf7, 0x6a, 0x1d, 0x51, 0x15, 0x46, 0xe4, 0xfb, 0xf8, 0x4a, 0x64,
++ 0xc3, 0x4e, 0xdc, 0xe7, 0xd6, 0x48, 0x43, 0xef, 0x63, 0xad, 0x9b, 0x2f,
++ 0x9f, 0xfd, 0x66, 0x78, 0x3e, 0x7b, 0x87, 0x75, 0xea, 0x28, 0xcf, 0x79,
++ 0x43, 0x85, 0xaf, 0xc4, 0x7c, 0x58, 0xc5, 0x88, 0x79, 0xf3, 0x8e, 0xd2,
++ 0xd5, 0xb1, 0xc3, 0x7c, 0x36, 0x56, 0x58, 0xac, 0x51, 0xd4, 0x4c, 0x53,
++ 0x88, 0xad, 0xe6, 0x7f, 0x8b, 0x2d, 0xdf, 0x7a, 0x57, 0x88, 0x49, 0xc6,
++ 0x70, 0xc1, 0xc2, 0x6e, 0x1f, 0x62, 0x7d, 0xd7, 0x59, 0xd7, 0x3f, 0x58,
++ 0x63, 0x64, 0x0a, 0x4a, 0xa2, 0x77, 0x83, 0x22, 0xbd, 0x9e, 0xa7, 0xab,
++ 0x82, 0xef, 0xb4, 0xd0, 0x1b, 0x5d, 0x61, 0x06, 0xfd, 0xfc, 0x7e, 0xc6,
++ 0x32, 0x22, 0x47, 0xf8, 0x77, 0x4b, 0x4a, 0x8e, 0x21, 0x44, 0x87, 0x25,
++ 0xef, 0xbb, 0x46, 0xd4, 0xdc, 0x44, 0x56, 0x54, 0x99, 0x17, 0xa8, 0x4d,
++ 0x46, 0x66, 0x44, 0x91, 0x3e, 0x3b, 0x0a, 0x57, 0x67, 0xf9, 0x4c, 0x9b,
++ 0x88, 0xe0, 0xef, 0x5d, 0xff, 0x1c, 0xa5, 0x66, 0x35, 0xe0, 0x1f, 0x5c,
++ 0xdd, 0x52, 0xb1, 0xed, 0x25, 0x23, 0xa5, 0x2a, 0x7b, 0x70, 0xc9, 0x32,
++ 0xf4, 0x9f, 0x32, 0x6e, 0x6a, 0xcd, 0x8b, 0x9d, 0x3c, 0x3f, 0x71, 0x8e,
++ 0x6c, 0x9f, 0xb7, 0x56, 0xd1, 0x58, 0x3b, 0x7e, 0xdc, 0x22, 0x6b, 0xf7,
++ 0x2e, 0xf4, 0x34, 0xef, 0xe4, 0x47, 0x45, 0xdd, 0x94, 0xaa, 0x6c, 0xa2,
++ 0x27, 0x09, 0x4d, 0x85, 0xb0, 0x7d, 0xb5, 0x10, 0xab, 0x56, 0x3b, 0xf8,
++ 0x3c, 0xd9, 0x14, 0x3f, 0xcb, 0x1a, 0x74, 0xa8, 0xd6, 0x48, 0x03, 0xbf,
++ 0xc0, 0x66, 0x7a, 0xd9, 0x54, 0x5b, 0x0e, 0xb8, 0x53, 0xae, 0xf1, 0x17,
++ 0xe8, 0x94, 0x1e, 0xd8, 0x0a, 0x49, 0xbf, 0xe5, 0xe2, 0xb7, 0x74, 0xaf,
++ 0xc4, 0xd4, 0x1d, 0xc8, 0x8a, 0x4a, 0xd3, 0xe8, 0x9b, 0x65, 0xbd, 0xfd,
++ 0x20, 0xb6, 0x5c, 0x7f, 0x78, 0x56, 0x7a, 0x60, 0x33, 0xba, 0x5e, 0x11,
++ 0xcc, 0xc5, 0xf3, 0xcc, 0x45, 0xcc, 0x09, 0xd2, 0x32, 0xf0, 0xac, 0xe5,
++ 0x84, 0x94, 0x41, 0xe5, 0x51, 0xf2, 0xa1, 0xcf, 0x5f, 0x49, 0x0f, 0xe1,
++ 0xd0, 0x3f, 0x78, 0x50, 0x7d, 0x40, 0x7a, 0x8a, 0x00, 0xb5, 0xa6, 0xa9,
++ 0x37, 0xc8, 0xfc, 0xec, 0x48, 0x4a, 0xff, 0x41, 0xac, 0x1f, 0xb8, 0x21,
++ 0x3a, 0xe9, 0x71, 0x3b, 0xcb, 0x1e, 0xf7, 0x89, 0xe9, 0x34, 0x3d, 0xb0,
++ 0xa6, 0xc8, 0x3b, 0xb6, 0x54, 0x1b, 0x0f, 0xa4, 0x8f, 0x4a, 0x1f, 0x22,
++ 0xd7, 0xa0, 0xe3, 0x6a, 0x52, 0x62, 0x57, 0xc7, 0x70, 0xbb, 0x11, 0xc9,
++ 0x42, 0xde, 0xe9, 0xdc, 0xea, 0x2f, 0xa0, 0xa7, 0xbf, 0xe3, 0x39, 0xa0,
++ 0x6f, 0x62, 0x2c, 0x86, 0x5f, 0x88, 0xba, 0xa4, 0x17, 0x7d, 0xee, 0x59,
++ 0x2e, 0xa2, 0xa7, 0xc9, 0xfb, 0x73, 0xf4, 0x09, 0x5e, 0x9e, 0x99, 0xf7,
++ 0x10, 0x4b, 0x5f, 0xb6, 0x0c, 0xbd, 0x5a, 0x8f, 0xec, 0x78, 0x1d, 0xcf,
++ 0xa8, 0xf7, 0x53, 0x57, 0x2f, 0xe4, 0x1e, 0x65, 0x3d, 0xf7, 0xb4, 0x47,
++ 0x78, 0x06, 0x68, 0x9c, 0xca, 0x8a, 0x7a, 0xfa, 0x41, 0x9e, 0x97, 0x51,
++ 0xdb, 0x16, 0xa7, 0xdf, 0x5e, 0xdc, 0x2b, 0x0f, 0x7e, 0x68, 0x99, 0x70,
++ 0xdc, 0xdf, 0x41, 0xbd, 0x7b, 0x9a, 0xe7, 0x68, 0x73, 0xb9, 0xde, 0x51,
++ 0x8a, 0x4b, 0xad, 0xb0, 0x2d, 0xb4, 0xdc, 0x0b, 0xfd, 0xc1, 0xdb, 0xc4,
++ 0xb4, 0x4e, 0x7a, 0x1f, 0x5f, 0xa9, 0xdf, 0x9f, 0x4d, 0x37, 0xe8, 0x8f,
++ 0xb0, 0xde, 0xcd, 0x13, 0x2b, 0x4f, 0xac, 0xb6, 0x64, 0x2c, 0xf3, 0x32,
++ 0x16, 0xfa, 0x4b, 0xe7, 0x7e, 0x0f, 0x7d, 0x49, 0x12, 0x08, 0xcd, 0xfd,
++ 0x35, 0x79, 0xe5, 0x69, 0x0d, 0x21, 0xbb, 0x8b, 0x31, 0xbe, 0xfa, 0xaf,
++ 0xdc, 0x9a, 0xfe, 0x49, 0xf4, 0x7b, 0xd8, 0x67, 0xc2, 0x02, 0x9e, 0x39,
++ 0x01, 0x3c, 0x3d, 0x19, 0xa3, 0x2f, 0xa7, 0x8f, 0x3c, 0xa1, 0xe1, 0xfb,
++ 0xd3, 0x95, 0xf8, 0xd1, 0x74, 0x10, 0x3b, 0xa6, 0xdd, 0xbb, 0xae, 0x0d,
++ 0x75, 0x7c, 0xaf, 0x83, 0x67, 0xbb, 0x59, 0x6b, 0x35, 0x3e, 0xa2, 0x87,
++ 0x5a, 0xa1, 0x78, 0x10, 0x39, 0x00, 0x5d, 0x27, 0x6e, 0x6a, 0x5b, 0x7e,
++ 0x44, 0x2e, 0x0b, 0x61, 0xae, 0x96, 0x3a, 0xf9, 0xbc, 0xfb, 0x7d, 0x84,
++ 0xfe, 0x31, 0x23, 0x31, 0x98, 0x27, 0x06, 0xf3, 0xc4, 0xe4, 0x4d, 0x4f,
++ 0x2d, 0xb1, 0x1c, 0xa7, 0x8f, 0x7e, 0x4e, 0x94, 0xb0, 0xf1, 0xb5, 0x38,
++ 0x6a, 0x9e, 0x24, 0x7f, 0x55, 0x6a, 0x28, 0xf0, 0xcf, 0xb9, 0x88, 0xbe,
++ 0xa9, 0x28, 0xf3, 0xff, 0xb7, 0xe5, 0xfc, 0x9f, 0xf1, 0x97, 0xf4, 0xc2,
++ 0x70, 0x66, 0xd1, 0x80, 0xc9, 0x7c, 0x83, 0xbe, 0x21, 0x3f, 0x34, 0xa8,
++ 0x21, 0x1b, 0x0d, 0xc1, 0x18, 0x98, 0x84, 0xa7, 0x35, 0x08, 0xb9, 0x76,
++ 0xa0, 0xe0, 0xae, 0x51, 0x88, 0x31, 0xea, 0x9b, 0xcc, 0xc1, 0xbf, 0xe7,
++ 0xd0, 0xea, 0x61, 0x3e, 0x1c, 0xc8, 0xb3, 0x35, 0xf0, 0x69, 0x41, 0xde,
++ 0x7d, 0xc6, 0xd2, 0xdd, 0xf8, 0xc2, 0x1d, 0xf3, 0x93, 0x42, 0x0a, 0xfb,
++ 0xf3, 0x1f, 0x88, 0xfd, 0xe1, 0x92, 0xc6, 0xa7, 0x79, 0x3e, 0x0a, 0x1d,
++ 0x28, 0x7b, 0x21, 0x72, 0xb8, 0x9a, 0xeb, 0xbd, 0x9a, 0x74, 0xbd, 0x3f,
++ 0x6b, 0xe4, 0x80, 0x7a, 0xd4, 0x64, 0xb1, 0xab, 0xb9, 0x21, 0xc6, 0x62,
++ 0x89, 0x40, 0x29, 0xa6, 0x84, 0x7e, 0x04, 0x15, 0xc4, 0xae, 0x3c, 0x23,
++ 0x49, 0xfd, 0x90, 0xbf, 0x79, 0x3e, 0x51, 0x9d, 0x88, 0x97, 0xeb, 0x72,
++ 0x1e, 0x93, 0x6d, 0x81, 0xb2, 0x5f, 0x5d, 0xf4, 0x22, 0x1d, 0x7c, 0x26,
++ 0xbd, 0xc8, 0x57, 0xa2, 0x2f, 0xdc, 0x71, 0x53, 0x73, 0xb2, 0x7c, 0x63,
++ 0x34, 0x2f, 0xef, 0xb4, 0x5a, 0xe8, 0x88, 0x15, 0x9c, 0x62, 0xe4, 0x47,
++ 0x5a, 0x63, 0xfa, 0x30, 0xc7, 0x73, 0x74, 0x9d, 0x5c, 0xde, 0x43, 0xbf,
++ 0xcc, 0x77, 0x8a, 0x2d, 0xec, 0x23, 0xb5, 0xec, 0x2f, 0xb8, 0xd6, 0x2f,
++ 0x9a, 0x25, 0xb6, 0x87, 0xf3, 0x6f, 0x79, 0x54, 0x53, 0xae, 0x33, 0x91,
++ 0x1a, 0x66, 0x3c, 0x0b, 0xba, 0xf4, 0xd6, 0x0e, 0xb5, 0x2d, 0xe1, 0xf6,
++ 0xcf, 0xaa, 0x32, 0x0e, 0x37, 0x1e, 0xb6, 0x49, 0xcd, 0x32, 0x32, 0xa7,
++ 0x90, 0x70, 0xfa, 0xa5, 0x39, 0x58, 0x26, 0x63, 0x68, 0x8a, 0xf4, 0x33,
++ 0x9e, 0x43, 0x61, 0x57, 0x0f, 0xf9, 0x8c, 0xf3, 0xe5, 0x3d, 0x1b, 0x2a,
++ 0x21, 0xb0, 0x22, 0xe9, 0x9e, 0xf9, 0xcb, 0xff, 0x5f, 0x43, 0xa5, 0x0f,
++ 0x91, 0x58, 0xfc, 0x5f, 0x69, 0xd7, 0x8a, 0xc0, 0xa8, 0x1a, 0x00, 0x00,
++ 0x00 };
+
+ static const u32 bnx2_TPAT_b06FwData[(0x0/4) + 1] = { 0x0 };
+ static const u32 bnx2_TPAT_b06FwRodata[(0x0/4) + 1] = { 0x0 };
+
+ static struct fw_info bnx2_tpat_fw_06 = {
+- /* Firmware version: 4.6.16 */
++ /* Firmware version: 4.4.22 */
+ .ver_major = 0x4,
+- .ver_minor = 0x6,
+- .ver_fix = 0x10,
++ .ver_minor = 0x4,
++ .ver_fix = 0x16,
+
+ .start_addr = 0x08000488,
+
+ .text_addr = 0x08000400,
+- .text_len = 0x175c,
++ .text_len = 0x1aa4,
+ .text_index = 0x0,
+ .gz_text = bnx2_TPAT_b06FwText,
+ .gz_text_len = sizeof(bnx2_TPAT_b06FwText),
+@@ -3540,11 +3639,11 @@
+ .data_index = 0x0,
+ .data = bnx2_TPAT_b06FwData,
+
+- .sbss_addr = 0x08001b80,
++ .sbss_addr = 0x08001ec0,
+ .sbss_len = 0x44,
+ .sbss_index = 0x0,
+
+- .bss_addr = 0x08001bc4,
++ .bss_addr = 0x08001f04,
+ .bss_len = 0x450,
+ .bss_index = 0x0,
+
+@@ -3571,858 +3670,862 @@
+ };
+
+ static u8 bnx2_TXP_b06FwText[] = {
+- 0xad, 0x7b, 0x0f, 0x70, 0x54, 0xe7, 0x75, 0xef, 0xef, 0xee, 0x1f, 0x69,
+- 0x57, 0x5a, 0xad, 0x2e, 0x78, 0xc1, 0xab, 0x54, 0x29, 0x7b, 0xd9, 0xbb,
+- 0xd2, 0x1a, 0x09, 0xb8, 0x0b, 0xc2, 0x88, 0xe8, 0xd6, 0x6c, 0x85, 0x00,
+- 0x21, 0x64, 0x2c, 0x63, 0x25, 0x15, 0x7d, 0x9e, 0x5a, 0x0f, 0x64, 0x23,
+- 0xdb, 0xd8, 0x16, 0x35, 0x6d, 0xe5, 0xd4, 0xad, 0xd6, 0x92, 0xc0, 0xc2,
+- 0xac, 0xb8, 0x22, 0x0b, 0x11, 0xee, 0xf4, 0xbd, 0xc8, 0x96, 0xb0, 0xb0,
+- 0xb3, 0x62, 0xed, 0xa4, 0xaf, 0xd3, 0xcc, 0x34, 0xe3, 0x7d, 0xfe, 0x83,
+- 0x49, 0x1e, 0xb6, 0xd3, 0x4e, 0xe7, 0x3d, 0xa7, 0xf3, 0xde, 0x84, 0x17,
+- 0x63, 0x62, 0xa7, 0x89, 0xed, 0xe6, 0xa5, 0xf3, 0x44, 0xea, 0xf8, 0xbe,
+- 0xdf, 0xb9, 0x77, 0x17, 0x88, 0x9b, 0x4e, 0x67, 0x3a, 0x4f, 0x33, 0x9a,
+- 0xd5, 0xde, 0x3f, 0xdf, 0x77, 0xce, 0xf9, 0xce, 0xf9, 0x9d, 0xdf, 0x39,
+- 0xdf, 0xa7, 0x06, 0xa0, 0x0a, 0xa5, 0x9f, 0x1a, 0xfe, 0xb6, 0x0c, 0x0d,
+- 0x1f, 0x4a, 0xad, 0xb9, 0x75, 0x0d, 0xff, 0xbc, 0x15, 0x6a, 0x85, 0x4f,
+- 0x6e, 0xde, 0xaa, 0x00, 0xfd, 0x3f, 0xc6, 0xbf, 0xeb, 0xe7, 0xf3, 0xff,
+- 0xbe, 0xd7, 0x9c, 0x1f, 0x2f, 0xa0, 0x96, 0xe5, 0x92, 0x5f, 0x04, 0x3c,
+- 0xe6, 0xcc, 0x17, 0xda, 0x75, 0x04, 0xbc, 0x66, 0xaf, 0xb9, 0x4f, 0x07,
+- 0xd2, 0xf9, 0xa6, 0xd8, 0x16, 0xfc, 0xd2, 0xce, 0x44, 0x7c, 0x90, 0xeb,
+- 0x9f, 0x37, 0x3f, 0x19, 0xf9, 0xf6, 0x46, 0xed, 0xe3, 0x19, 0x2f, 0x02,
+- 0xaa, 0x79, 0x1a, 0x6a, 0x03, 0x02, 0xf5, 0x7c, 0xe7, 0xcf, 0x1b, 0xfd,
+- 0x5e, 0x84, 0xcb, 0x63, 0xb5, 0x62, 0xcc, 0x42, 0x26, 0x60, 0x0e, 0xa1,
+- 0x72, 0x03, 0xf0, 0x5e, 0x36, 0x61, 0x8c, 0x01, 0x53, 0x1e, 0x33, 0x11,
+- 0x7b, 0x05, 0x06, 0x0e, 0x17, 0x62, 0xe8, 0xe0, 0xef, 0x0e, 0xeb, 0x53,
+- 0x3b, 0xe6, 0x47, 0xc6, 0xcb, 0xe7, 0xf6, 0xb6, 0x00, 0x5b, 0xb3, 0x06,
+- 0x8e, 0x58, 0x08, 0xd4, 0x99, 0x8f, 0x63, 0x13, 0x3f, 0xc3, 0xe6, 0x30,
+- 0xde, 0x9a, 0x8c, 0xc7, 0x9e, 0x83, 0xd6, 0xa7, 0x7b, 0xb5, 0x61, 0xa0,
+- 0x69, 0x70, 0x40, 0xd1, 0xfa, 0xdf, 0x56, 0xb4, 0x9e, 0x49, 0x05, 0x01,
+- 0x85, 0xcf, 0x35, 0xe5, 0xe5, 0x73, 0x18, 0xab, 0xf2, 0x01, 0x5c, 0xf2,
+- 0xca, 0xfc, 0xbf, 0x45, 0x7b, 0x2b, 0xf0, 0xe9, 0xad, 0x18, 0xa7, 0x0c,
+- 0x7e, 0x53, 0xc1, 0xb3, 0x2d, 0x89, 0xe8, 0x28, 0xe4, 0x7e, 0x0c, 0x5b,
+- 0x0a, 0xf2, 0xa9, 0x51, 0x6b, 0xdb, 0x1e, 0x37, 0x6c, 0xfb, 0x8c, 0x51,
+- 0x89, 0x8c, 0xaa, 0x45, 0x01, 0x05, 0xa3, 0x86, 0x07, 0x69, 0xb5, 0x3d,
+- 0xe6, 0x83, 0x16, 0xbd, 0x17, 0xff, 0x4c, 0x9d, 0xd3, 0x49, 0x3f, 0xdc,
+- 0xe7, 0xfb, 0x51, 0x89, 0xa2, 0xea, 0x5a, 0xed, 0xd9, 0xac, 0x6d, 0x9f,
+- 0xd7, 0x7d, 0x38, 0x43, 0xfb, 0x8c, 0xe6, 0xff, 0xd9, 0x2e, 0xd2, 0x36,
+- 0xe3, 0x7a, 0x79, 0xfe, 0x00, 0x66, 0x54, 0xdb, 0x9e, 0xe5, 0xbd, 0x23,
+- 0xf9, 0xb2, 0x9d, 0x6d, 0xdb, 0xa3, 0xdb, 0xf6, 0x3e, 0xfd, 0x17, 0xf6,
+- 0xde, 0x5f, 0x79, 0xd6, 0xb6, 0x9f, 0x32, 0x6e, 0xc2, 0xd9, 0x5c, 0x87,
+- 0xd2, 0x35, 0xbf, 0x3c, 0xbc, 0x63, 0xda, 0xc6, 0x79, 0x03, 0xaa, 0xc7,
+- 0xdc, 0xa6, 0xec, 0x98, 0xef, 0x54, 0xb6, 0x16, 0x76, 0x2b, 0xdb, 0x66,
+- 0x7f, 0x57, 0xe9, 0x9c, 0xef, 0x57, 0xb6, 0x17, 0xa2, 0x98, 0xb3, 0x22,
+- 0x98, 0xb5, 0xfa, 0x94, 0x8e, 0xf9, 0x5e, 0xc5, 0xd5, 0x63, 0x58, 0x69,
+- 0x2f, 0x94, 0xc7, 0xba, 0x6e, 0xc7, 0x1d, 0x59, 0x13, 0x13, 0x56, 0x25,
+- 0xe7, 0x59, 0xb4, 0xbf, 0xdd, 0xb8, 0x48, 0x3d, 0x0d, 0x1c, 0x2d, 0x3c,
+- 0x85, 0xdb, 0xa7, 0x6d, 0x3b, 0x9f, 0x02, 0xf2, 0x05, 0xe0, 0xeb, 0x56,
+- 0xbc, 0x67, 0x50, 0xb1, 0xed, 0xed, 0x09, 0x7b, 0xc5, 0x15, 0xa3, 0x29,
+- 0xf9, 0x1a, 0xfe, 0xaf, 0x3d, 0x13, 0x41, 0x26, 0xc4, 0x31, 0x8e, 0x71,
+- 0xcd, 0x1e, 0x98, 0x44, 0xa0, 0xd2, 0x1c, 0xc7, 0x8f, 0xb2, 0x08, 0x54,
+- 0x98, 0x19, 0x9c, 0xcf, 0x8e, 0xaa, 0x01, 0xc4, 0xa3, 0x3b, 0x94, 0xcc,
+- 0xb0, 0x07, 0xda, 0xd0, 0xbb, 0xd0, 0x62, 0x5c, 0x8f, 0x0b, 0xaf, 0x2a,
+- 0x5a, 0xf1, 0x35, 0x68, 0xe9, 0x5f, 0x28, 0x5a, 0x67, 0x9d, 0x17, 0x69,
+- 0x4f, 0x22, 0x80, 0x6f, 0x37, 0xca, 0x9a, 0x8c, 0x63, 0x8d, 0xb3, 0x36,
+- 0x19, 0xdc, 0x72, 0x6d, 0x6d, 0x4c, 0x8c, 0x52, 0xae, 0x23, 0x94, 0xeb,
+- 0x75, 0x43, 0x8b, 0x3e, 0x0b, 0x7b, 0xc5, 0x80, 0x21, 0xf7, 0x4c, 0x8c,
+- 0x17, 0xec, 0x58, 0xd8, 0xbc, 0x44, 0x79, 0x91, 0xf9, 0x9c, 0x19, 0xc8,
+- 0xd4, 0x9a, 0xbf, 0xb4, 0xdf, 0xdc, 0x10, 0xc5, 0xcb, 0x85, 0x08, 0x5e,
+- 0x2a, 0xa8, 0x78, 0xb1, 0xd0, 0x01, 0xab, 0x80, 0xf0, 0xed, 0x85, 0x5f,
+- 0xe7, 0xc7, 0x36, 0x42, 0x7c, 0x9e, 0x72, 0x87, 0x77, 0x16, 0x7c, 0xfd,
+- 0x15, 0x26, 0x7a, 0xbe, 0x93, 0x1d, 0xb1, 0xab, 0x74, 0xf4, 0x2f, 0x31,
+- 0xf5, 0xf4, 0x2a, 0x25, 0xd4, 0x4a, 0x3f, 0xec, 0x79, 0x23, 0xdf, 0xea,
+- 0xd3, 0x8f, 0x07, 0xe1, 0xa7, 0xfd, 0xb7, 0x16, 0x6c, 0x7b, 0xcc, 0x38,
+- 0xb8, 0x76, 0x6f, 0xeb, 0x37, 0x8b, 0x3d, 0x7a, 0x37, 0x32, 0x85, 0x01,
+- 0x20, 0x6c, 0xf2, 0x93, 0xa1, 0xb8, 0xbb, 0xb9, 0x23, 0x76, 0xae, 0xdf,
+- 0xe7, 0xfa, 0x33, 0x65, 0xa0, 0xdd, 0x5f, 0xb2, 0x28, 0x83, 0xf5, 0x47,
+- 0x61, 0x54, 0xc5, 0xa8, 0xdf, 0xf7, 0x28, 0x67, 0x12, 0xdf, 0x28, 0xe8,
+- 0x94, 0xad, 0x99, 0x32, 0xc6, 0x28, 0x5f, 0x00, 0x7b, 0x73, 0xda, 0x54,
+- 0x06, 0xda, 0xc4, 0x0c, 0x56, 0x23, 0x1d, 0x51, 0xe9, 0x83, 0x7f, 0x06,
+- 0x77, 0x8c, 0x6e, 0x1c, 0xb7, 0xb0, 0x4e, 0x35, 0xb9, 0xbe, 0x29, 0x3c,
+- 0x5e, 0x81, 0x44, 0xff, 0xc7, 0x8a, 0x82, 0x37, 0x13, 0xdd, 0x98, 0xa4,
+- 0x3e, 0xdd, 0xf9, 0x20, 0x1e, 0xcc, 0x55, 0xe1, 0xfe, 0x9c, 0x8d, 0x07,
+- 0x52, 0x30, 0xab, 0xa8, 0x4f, 0x32, 0x95, 0x88, 0xbd, 0x0f, 0x1f, 0x3a,
+- 0xf2, 0xdd, 0x8c, 0xa5, 0x2d, 0x48, 0x57, 0x04, 0xb0, 0x25, 0x1f, 0x62,
+- 0x3c, 0xa6, 0x71, 0x7a, 0x3a, 0x00, 0xff, 0x7a, 0x0f, 0x66, 0x22, 0x15,
+- 0x48, 0x36, 0x78, 0xf8, 0x1b, 0x09, 0xb7, 0x4f, 0xd7, 0x87, 0xb7, 0x5a,
+- 0x3e, 0xec, 0xb7, 0x3c, 0x18, 0xc9, 0xd9, 0x76, 0x87, 0x61, 0xe3, 0xea,
+- 0x7a, 0x15, 0xdf, 0xa2, 0xfd, 0x0e, 0x5a, 0x51, 0x9c, 0x2d, 0x3c, 0x49,
+- 0x59, 0x22, 0xae, 0xbc, 0x16, 0x65, 0xb7, 0x28, 0xbb, 0x45, 0xb9, 0x2d,
+- 0x91, 0xf3, 0x55, 0xc6, 0x8c, 0x41, 0xbd, 0x82, 0x94, 0xa1, 0x1a, 0x83,
+- 0x94, 0x23, 0x9e, 0xb2, 0xe1, 0x49, 0x69, 0x99, 0xbd, 0x04, 0xaf, 0x15,
+- 0x0d, 0xb6, 0xfd, 0xf1, 0x7a, 0xd1, 0x85, 0x6b, 0xee, 0xe9, 0x96, 0x18,
+- 0xfd, 0xed, 0x1a, 0xc6, 0xd5, 0xf7, 0x69, 0xb7, 0xa7, 0x0b, 0x41, 0x0c,
+- 0xe7, 0x1c, 0xbf, 0x3d, 0x54, 0x41, 0xb9, 0x45, 0xae, 0x82, 0x9e, 0x60,
+- 0x8c, 0x26, 0xfa, 0x18, 0xa3, 0xd8, 0x49, 0x99, 0x1f, 0xb0, 0x22, 0xe1,
+- 0x8e, 0xe9, 0x44, 0xeb, 0x6e, 0xc5, 0x87, 0xed, 0xf9, 0xeb, 0x72, 0x52,
+- 0x5f, 0x89, 0x41, 0xea, 0xaa, 0x52, 0xbe, 0x08, 0xf6, 0x51, 0xce, 0x97,
+- 0x4a, 0x72, 0xce, 0x16, 0x64, 0xae, 0xcf, 0xca, 0x5a, 0x96, 0x13, 0x99,
+- 0xa5, 0x66, 0x44, 0x41, 0x55, 0x08, 0xbb, 0xf3, 0xef, 0x70, 0x2d, 0xea,
+- 0xf1, 0x4d, 0xae, 0xc1, 0xcb, 0x8c, 0x91, 0x6f, 0x5c, 0xf3, 0x17, 0x59,
+- 0x8f, 0x27, 0xb8, 0x0e, 0xda, 0xe9, 0x0c, 0x42, 0xe8, 0x2f, 0xa4, 0x71,
+- 0x78, 0x1a, 0xe9, 0x39, 0xe3, 0x18, 0xe3, 0x7d, 0x39, 0xbc, 0x7a, 0x65,
+- 0x5a, 0xd5, 0xab, 0xb0, 0x6f, 0x36, 0x82, 0xa1, 0x42, 0x3b, 0xac, 0x5c,
+- 0x04, 0x07, 0xe8, 0x9b, 0x1f, 0xa6, 0xd2, 0x0f, 0x84, 0x21, 0xb2, 0x47,
+- 0xf0, 0x20, 0xdf, 0x79, 0x6a, 0x3a, 0x82, 0x41, 0xda, 0x68, 0x47, 0x2a,
+- 0xd1, 0x1a, 0xe4, 0xb5, 0xfd, 0xbc, 0x76, 0x84, 0xf6, 0x7f, 0xd5, 0x98,
+- 0x44, 0x7f, 0x8f, 0x96, 0x04, 0x22, 0xb8, 0xcf, 0x82, 0x4a, 0x17, 0x7e,
+- 0x82, 0xf8, 0x96, 0x7c, 0x95, 0xdf, 0xef, 0x2d, 0x54, 0x51, 0xdf, 0x30,
+- 0xa2, 0xfa, 0x27, 0xb6, 0xbf, 0xc5, 0xb6, 0xbf, 0x66, 0x24, 0x2e, 0xfc,
+- 0xd0, 0xeb, 0xc3, 0x63, 0x05, 0x0f, 0x86, 0x67, 0xab, 0xf0, 0xfb, 0x39,
+- 0x1f, 0xee, 0x6c, 0xa8, 0xc2, 0xc1, 0xd9, 0x34, 0xc6, 0xa6, 0xab, 0x30,
+- 0x90, 0xc3, 0x8a, 0xfb, 0x8c, 0xb1, 0x25, 0x15, 0xd0, 0x16, 0x3b, 0x90,
+- 0xc4, 0x55, 0xae, 0xc3, 0x63, 0xb3, 0xa1, 0x70, 0xdf, 0xb4, 0x8a, 0xe1,
+- 0xf9, 0x20, 0x9f, 0xf7, 0xf0, 0xf9, 0x4a, 0x18, 0xeb, 0xe2, 0xc3, 0x2a,
+- 0x44, 0xc6, 0x6a, 0x3c, 0x3c, 0x1b, 0xc4, 0x43, 0x39, 0x15, 0x07, 0xa6,
+- 0x5b, 0x30, 0x65, 0xa5, 0x71, 0x94, 0xd8, 0xf1, 0xf5, 0x94, 0xd6, 0x73,
+- 0x40, 0xd1, 0xd2, 0x5b, 0x95, 0x34, 0x1a, 0x53, 0x7e, 0x5c, 0x22, 0x0e,
+- 0xf9, 0x53, 0x4d, 0xad, 0x2f, 0x12, 0x1b, 0x2a, 0xcc, 0x08, 0xbf, 0x6b,
+- 0x13, 0x8c, 0xd9, 0xb4, 0xdf, 0xb3, 0x1e, 0x58, 0x26, 0xf1, 0x1b, 0x09,
+- 0x77, 0x59, 0x6a, 0xb8, 0xab, 0x50, 0x1f, 0xde, 0x61, 0x45, 0xc3, 0x3b,
+- 0x18, 0x5f, 0x5b, 0xc5, 0x1f, 0xad, 0x00, 0x8e, 0xa5, 0x7e, 0x69, 0xf7,
+- 0x2f, 0x71, 0xf0, 0x2c, 0x7c, 0xfb, 0xb4, 0x96, 0x99, 0x81, 0x66, 0x30,
+- 0x1b, 0x60, 0x72, 0xde, 0xc7, 0xf5, 0x53, 0xb0, 0x44, 0x6f, 0x21, 0x8e,
+- 0xab, 0x78, 0x98, 0x98, 0xf2, 0xb7, 0xc4, 0x94, 0x81, 0xe3, 0x71, 0x75,
+- 0x0a, 0x41, 0xda, 0x1b, 0xd8, 0x7b, 0x2e, 0xc2, 0x35, 0xef, 0xc4, 0x93,
+- 0x94, 0x6b, 0xc7, 0x86, 0x08, 0xee, 0x2f, 0xa8, 0xe1, 0x4e, 0xae, 0xdf,
+- 0xfb, 0xf9, 0x68, 0x78, 0x0b, 0xd7, 0xf2, 0xdd, 0xbc, 0x16, 0x2b, 0xe2,
+- 0x9f, 0xc4, 0x9f, 0x92, 0xf0, 0x00, 0xf7, 0x1d, 0xf7, 0xa3, 0x18, 0x91,
+- 0xb9, 0x68, 0x73, 0xeb, 0x65, 0x3b, 0xa4, 0xeb, 0xa7, 0x0f, 0xd0, 0xd6,
+- 0x8f, 0x16, 0x42, 0x78, 0xc8, 0xd2, 0x92, 0xdf, 0x50, 0x42, 0xb4, 0x69,
+- 0x80, 0x76, 0x20, 0xc0, 0x2c, 0x97, 0xe7, 0x52, 0x88, 0x2d, 0x77, 0xb1,
+- 0xf6, 0xe0, 0xac, 0xf8, 0x09, 0xd7, 0xde, 0xa2, 0x0f, 0xd0, 0x7f, 0xbe,
+- 0x71, 0x2d, 0x56, 0x35, 0x35, 0xe3, 0x60, 0x77, 0x92, 0xfe, 0xe2, 0xda,
+- 0xe8, 0xc4, 0xb4, 0xd8, 0x41, 0x9b, 0x82, 0x27, 0x8d, 0xb5, 0xeb, 0xfe,
+- 0xd6, 0xbe, 0xb4, 0x4c, 0xec, 0xa1, 0x62, 0x84, 0x36, 0x3c, 0x6d, 0xd9,
+- 0xf6, 0xd5, 0xf5, 0x3f, 0xb5, 0x5b, 0x6f, 0x16, 0xbb, 0x88, 0xae, 0xdf,
+- 0x52, 0x24, 0x8f, 0x2c, 0xd1, 0xc3, 0xff, 0x1f, 0x7c, 0xe5, 0x0f, 0xed,
+- 0x7e, 0x47, 0x3f, 0xf1, 0x17, 0x1f, 0x7d, 0xf1, 0x49, 0x8e, 0xed, 0x41,
+- 0x3f, 0xc7, 0x7b, 0xc4, 0xb2, 0x3f, 0xaa, 0x33, 0x3f, 0xb5, 0x5b, 0x37,
+- 0xea, 0x43, 0x8b, 0xca, 0xff, 0xe0, 0xf5, 0x08, 0x1e, 0x2e, 0xb4, 0xd2,
+- 0x76, 0x1d, 0x78, 0xca, 0x12, 0x3c, 0xec, 0x64, 0xbc, 0x45, 0xe9, 0xcf,
+- 0xf5, 0xf4, 0x6f, 0x9f, 0xb2, 0xd5, 0xca, 0x63, 0xc7, 0x64, 0x06, 0xdb,
+- 0xe9, 0xef, 0x17, 0xb2, 0xf1, 0xd6, 0xe7, 0xa1, 0x65, 0xa8, 0x43, 0xb8,
+- 0x93, 0x36, 0xee, 0xb0, 0xb4, 0x4e, 0x59, 0xd3, 0x0e, 0xe2, 0xd2, 0x2b,
+- 0xd9, 0x68, 0xb8, 0xbd, 0x20, 0xf6, 0xae, 0x0f, 0x6f, 0x29, 0xdc, 0xca,
+- 0xb5, 0x57, 0xb0, 0x69, 0x75, 0x80, 0x38, 0x73, 0x07, 0xdc, 0x75, 0x75,
+- 0xd7, 0xee, 0xcd, 0x54, 0x53, 0xff, 0x4f, 0xd1, 0x85, 0xcc, 0x32, 0xf7,
+- 0xda, 0x30, 0xaf, 0xd5, 0xae, 0x47, 0xf8, 0x0e, 0xfa, 0xc1, 0x3d, 0xf4,
+- 0x83, 0xab, 0xeb, 0x7f, 0x69, 0xc7, 0x6e, 0x72, 0xfd, 0xa0, 0x7d, 0xda,
+- 0x17, 0xde, 0x46, 0x3b, 0x6d, 0x35, 0x14, 0xcc, 0x1a, 0x4f, 0xa1, 0xff,
+- 0x1a, 0x77, 0x48, 0xcf, 0x9c, 0x35, 0xd2, 0xc4, 0x91, 0x36, 0xf8, 0x96,
+- 0x60, 0xe6, 0x79, 0xe3, 0x30, 0x62, 0xae, 0xef, 0xe0, 0x40, 0x2e, 0x88,
+- 0xcc, 0x9d, 0x2a, 0xe6, 0x1a, 0x55, 0x3c, 0xc2, 0xb1, 0x3f, 0x4c, 0x35,
+- 0x0d, 0xbe, 0x45, 0x1b, 0xcc, 0x2c, 0x91, 0x6b, 0x69, 0xfc, 0x95, 0xf1,
+- 0x65, 0xe0, 0x26, 0x77, 0xee, 0x79, 0x89, 0xd1, 0xf9, 0x16, 0x1c, 0x29,
+- 0xf4, 0x29, 0x2e, 0x6e, 0x6a, 0x9d, 0x69, 0x7c, 0xcf, 0x16, 0x2c, 0x9d,
+- 0x27, 0x86, 0xb4, 0xd3, 0xa7, 0xc6, 0xe9, 0x47, 0xa3, 0xc4, 0x90, 0xed,
+- 0xf4, 0xa3, 0x27, 0xf3, 0xa2, 0x53, 0xc2, 0x30, 0xbc, 0x37, 0x33, 0x37,
+- 0xd3, 0x3e, 0x96, 0x93, 0xf3, 0x6b, 0x55, 0xfd, 0x30, 0xa6, 0x1c, 0xd9,
+- 0x86, 0x95, 0x3b, 0xc8, 0x31, 0x2e, 0xf9, 0x51, 0x1b, 0xd5, 0x1f, 0xc1,
+- 0x69, 0xe7, 0x5a, 0x84, 0xef, 0xa6, 0x3d, 0x1e, 0x1d, 0xaa, 0x6a, 0x76,
+- 0x30, 0xaf, 0x8a, 0xef, 0x77, 0x2a, 0x3b, 0x98, 0x6b, 0xd3, 0xcc, 0xb5,
+- 0x69, 0xe6, 0xda, 0x34, 0xe7, 0x4f, 0x33, 0xc7, 0xb6, 0x17, 0x86, 0x95,
+- 0x1e, 0xb1, 0xbb, 0xd8, 0xdf, 0x72, 0xf9, 0x03, 0xb1, 0x27, 0xbc, 0xbd,
+- 0xb0, 0xc6, 0xe3, 0x72, 0xba, 0x61, 0xa5, 0xc4, 0x61, 0x02, 0x55, 0x3a,
+- 0x73, 0x98, 0x35, 0xac, 0x74, 0x31, 0xcf, 0xf6, 0x39, 0x36, 0x8c, 0x0f,
+- 0x5d, 0x66, 0x7e, 0x7d, 0x93, 0xf9, 0x35, 0x9f, 0x62, 0x3c, 0xad, 0xbe,
+- 0x6a, 0xf7, 0x2f, 0x73, 0x73, 0xc1, 0x18, 0xe5, 0xfc, 0x1a, 0xd7, 0xaa,
+- 0xc8, 0x1c, 0xda, 0xe1, 0x55, 0x70, 0x9f, 0x8e, 0xda, 0x3a, 0x62, 0xe9,
+- 0x91, 0x02, 0xf1, 0xdf, 0x88, 0xb7, 0x7e, 0x40, 0x83, 0x1e, 0xd1, 0xfd,
+- 0xb8, 0x7a, 0x13, 0x49, 0x8e, 0xde, 0x8e, 0x63, 0xb9, 0x4a, 0x0c, 0xa6,
+- 0xd2, 0x4b, 0x03, 0xe4, 0x28, 0x9d, 0x2d, 0x78, 0x9c, 0x53, 0x2b, 0x51,
+- 0x33, 0x41, 0x7f, 0x41, 0xfa, 0x38, 0xf3, 0xc3, 0xa4, 0x75, 0x2b, 0xf2,
+- 0xcc, 0xa3, 0x73, 0x86, 0x0f, 0x6f, 0xe6, 0xd7, 0x10, 0xdf, 0x12, 0x46,
+- 0x48, 0xa9, 0x62, 0xdc, 0x9a, 0xc8, 0x5a, 0x82, 0x4b, 0xb6, 0x3d, 0x27,
+- 0x32, 0x24, 0x12, 0xe9, 0x51, 0x08, 0x56, 0xd9, 0x2b, 0xee, 0x4d, 0x55,
+- 0x60, 0x53, 0x22, 0x8c, 0x15, 0x7a, 0xbf, 0xd2, 0x59, 0x48, 0x18, 0xaf,
+- 0xe2, 0x77, 0x95, 0x7b, 0xe6, 0x4d, 0xc6, 0x74, 0x9f, 0xb2, 0x67, 0xbe,
+- 0x0a, 0x97, 0x22, 0x22, 0x23, 0x6a, 0xfd, 0xba, 0x07, 0xef, 0xdd, 0xa5,
+- 0x40, 0xd5, 0xd3, 0x38, 0xdf, 0xa2, 0xd2, 0x9f, 0x3a, 0xc9, 0x2d, 0x62,
+- 0xf0, 0x2e, 0x44, 0xc3, 0x3b, 0xb9, 0x06, 0xd5, 0x0b, 0xb2, 0x2e, 0x1d,
+- 0xb4, 0x55, 0x3d, 0xfd, 0xaf, 0x53, 0xe9, 0xa0, 0x1d, 0xbb, 0x66, 0xa1,
+- 0x56, 0x99, 0xbd, 0xca, 0xb6, 0x82, 0x46, 0x3b, 0x89, 0x4d, 0x86, 0xc9,
+- 0x91, 0xc4, 0x47, 0xca, 0x6b, 0x28, 0x7e, 0x7a, 0xe3, 0x3a, 0xf6, 0x79,
+- 0x24, 0xd6, 0x36, 0xad, 0x36, 0x19, 0x87, 0x1e, 0xca, 0x25, 0x32, 0x04,
+- 0x50, 0xdb, 0x68, 0xaf, 0xf8, 0x30, 0xb5, 0xc0, 0x7b, 0x26, 0x8e, 0x17,
+- 0xba, 0xb9, 0x2e, 0xcd, 0x25, 0xbf, 0x52, 0xe9, 0x87, 0x1d, 0x1c, 0x5f,
+- 0xfc, 0x3b, 0x0d, 0x77, 0x2d, 0x3b, 0xc9, 0x89, 0xfe, 0xb5, 0x35, 0x3c,
+- 0xc8, 0x31, 0x64, 0x1d, 0x2b, 0xca, 0x7e, 0x19, 0xbe, 0x67, 0x3a, 0x8d,
+- 0xf7, 0x9c, 0x1c, 0x5a, 0xf6, 0xe1, 0x61, 0xa5, 0x93, 0x6b, 0x09, 0xbf,
+- 0x3b, 0xfe, 0xae, 0x69, 0xf8, 0x6b, 0x4c, 0xc4, 0xbc, 0xe4, 0x6d, 0x17,
+- 0x53, 0x09, 0x75, 0x52, 0xe9, 0xe6, 0x58, 0x8c, 0x2d, 0x62, 0x7d, 0x35,
+- 0xfd, 0xa6, 0x83, 0xfa, 0x76, 0x51, 0xdf, 0x2e, 0x67, 0x4e, 0xf1, 0xbb,
+- 0x5f, 0x9d, 0x77, 0x4b, 0xe1, 0x1e, 0x47, 0xf7, 0x9d, 0x7c, 0x67, 0x0f,
+- 0x65, 0xdd, 0xc3, 0xe7, 0xb7, 0x58, 0xdf, 0xe7, 0x35, 0x91, 0x57, 0xe2,
+- 0xfa, 0xc6, 0x5c, 0x25, 0xb1, 0xfd, 0xdd, 0x12, 0x57, 0x40, 0xc6, 0x63,
+- 0x4a, 0xec, 0x0f, 0xa1, 0xa7, 0x05, 0x81, 0xa5, 0xe6, 0x50, 0xdb, 0xee,
+- 0x06, 0xe2, 0x14, 0x71, 0x32, 0x70, 0x9c, 0x1c, 0x99, 0xd8, 0x3b, 0xd7,
+- 0xaa, 0x60, 0xcc, 0xb8, 0x99, 0xf1, 0x67, 0x60, 0xa2, 0xa0, 0x75, 0xc6,
+- 0x78, 0xaf, 0x79, 0x52, 0xb8, 0xfb, 0x01, 0xb4, 0x93, 0xaf, 0x45, 0xcd,
+- 0x41, 0x44, 0xad, 0x78, 0x74, 0x42, 0xd1, 0x06, 0xb7, 0x40, 0xbb, 0x40,
+- 0xcc, 0x1f, 0x9e, 0x55, 0xb4, 0xa1, 0x3a, 0xaf, 0x96, 0x7e, 0xdb, 0xe1,
+- 0xcd, 0x07, 0xb0, 0xda, 0xe1, 0x66, 0x83, 0x48, 0x92, 0xa3, 0xee, 0xe4,
+- 0x98, 0xfb, 0x37, 0x29, 0xb8, 0x62, 0xfc, 0x94, 0xeb, 0xa4, 0xa5, 0x33,
+- 0x8a, 0x81, 0x2c, 0xe3, 0x3f, 0x7a, 0x5c, 0x38, 0xf8, 0x01, 0x72, 0x70,
+- 0x04, 0x42, 0x7c, 0x36, 0x3b, 0x19, 0x1f, 0x0e, 0x78, 0xb5, 0x24, 0xf9,
+- 0x77, 0x9a, 0x63, 0x1a, 0x05, 0xf2, 0x72, 0xce, 0x11, 0xbb, 0xaf, 0x34,
+- 0x66, 0xa2, 0x34, 0xa6, 0x9e, 0x07, 0xe3, 0x62, 0x02, 0xdb, 0x13, 0xcc,
+- 0x01, 0xc4, 0xb2, 0xa3, 0xc2, 0xf5, 0x39, 0x5e, 0xe5, 0x71, 0x83, 0xdf,
+- 0x87, 0x95, 0x3d, 0x12, 0x33, 0x95, 0x2e, 0x73, 0xab, 0xe5, 0x1c, 0x35,
+- 0xe6, 0x21, 0x2c, 0x38, 0x73, 0x0c, 0xc9, 0x1c, 0x43, 0x3f, 0x52, 0xb4,
+- 0xe4, 0x39, 0x45, 0x30, 0xb8, 0xa9, 0xef, 0x1c, 0x63, 0xe4, 0x88, 0xa2,
+- 0xb5, 0x1e, 0xa3, 0xfa, 0x41, 0x5d, 0xc6, 0x3f, 0x54, 0x9a, 0x67, 0x08,
+- 0x8d, 0x79, 0xc6, 0x5f, 0x21, 0xa0, 0x6c, 0xc9, 0xb5, 0x63, 0x6c, 0xb6,
+- 0x1d, 0xa3, 0x39, 0x05, 0xf7, 0x18, 0xcb, 0x70, 0xe9, 0x66, 0xa7, 0xfe,
+- 0xa8, 0x59, 0xa1, 0xd7, 0x61, 0x44, 0x45, 0xad, 0x47, 0xff, 0x3c, 0xf6,
+- 0x96, 0xb8, 0xfb, 0xf6, 0x13, 0x3d, 0xc4, 0x73, 0x1b, 0x1f, 0x30, 0x56,
+- 0xe2, 0x4b, 0x90, 0xf6, 0x9b, 0xad, 0xe4, 0xd9, 0x4b, 0xbd, 0x6e, 0x3c,
+- 0xff, 0x7d, 0xc0, 0x5d, 0x03, 0xb1, 0xff, 0x67, 0xef, 0xb5, 0xe3, 0xe9,
+- 0x5c, 0x05, 0x5a, 0xd7, 0xe3, 0xce, 0x28, 0x6a, 0x3c, 0xcc, 0x5d, 0xef,
+- 0xec, 0x56, 0x1e, 0xe6, 0x3d, 0xe7, 0xd9, 0xc0, 0x6f, 0x98, 0x1f, 0xb7,
+- 0xfd, 0x71, 0xa3, 0x5c, 0x97, 0x67, 0x6f, 0xbc, 0xae, 0x9a, 0xff, 0xf2,
+- 0xba, 0x82, 0x17, 0x08, 0x50, 0x5f, 0x67, 0xae, 0xc8, 0x67, 0x6d, 0x78,
+- 0x4d, 0x1f, 0x06, 0x27, 0x63, 0x38, 0xb0, 0x10, 0xc1, 0x42, 0x56, 0xeb,
+- 0xbf, 0xc4, 0xba, 0x60, 0x6f, 0x8b, 0x8e, 0x87, 0x16, 0xa2, 0x98, 0xcf,
+- 0xc2, 0x0e, 0x9a, 0x7a, 0x31, 0xa8, 0x24, 0xb1, 0x7f, 0xa1, 0x1e, 0xe7,
+- 0xb2, 0xfa, 0x85, 0x51, 0x25, 0x31, 0x5c, 0x47, 0x3e, 0xf1, 0xc8, 0x42,
+- 0x33, 0x1e, 0x5e, 0x08, 0xf0, 0x1d, 0x1b, 0x5d, 0xa9, 0x7a, 0x3e, 0xef,
+- 0xc1, 0xf3, 0x27, 0x6d, 0x5b, 0xf8, 0xd4, 0xe0, 0x02, 0x30, 0x3f, 0xc5,
+- 0x1c, 0x73, 0x86, 0xf9, 0xe6, 0x19, 0x60, 0xff, 0x33, 0x1e, 0xcc, 0x4e,
+- 0xd9, 0xd8, 0x6b, 0x8c, 0xd6, 0x79, 0xe8, 0xe4, 0xfd, 0xcc, 0x07, 0x7e,
+- 0xe6, 0xb6, 0x7b, 0x55, 0x17, 0xa7, 0x2f, 0x11, 0x87, 0x1e, 0x78, 0x26,
+- 0x89, 0x77, 0xb2, 0x19, 0x74, 0x91, 0x77, 0x0f, 0x53, 0x96, 0xb7, 0xb3,
+- 0xcc, 0x4f, 0x0b, 0x06, 0xde, 0xca, 0x06, 0x38, 0x4f, 0x33, 0x5e, 0xcb,
+- 0xca, 0x33, 0xf2, 0x6c, 0x08, 0x03, 0x94, 0xe5, 0xcd, 0x6c, 0x94, 0x73,
+- 0x46, 0xf0, 0x1d, 0x3e, 0x77, 0xff, 0x82, 0xce, 0x7c, 0x14, 0xe0, 0xbc,
+- 0x31, 0xbc, 0x91, 0x0d, 0x51, 0xd6, 0x08, 0x73, 0xd0, 0x00, 0xc6, 0xb2,
+- 0x4d, 0x17, 0xb6, 0x90, 0xb3, 0xb8, 0x39, 0x44, 0xae, 0x5d, 0xb6, 0xbb,
+- 0x9d, 0x98, 0x93, 0x79, 0xca, 0xf3, 0x0e, 0x60, 0x34, 0xfb, 0x9a, 0xb7,
+- 0x5c, 0x27, 0xbf, 0x30, 0xb5, 0xe8, 0x70, 0xba, 0xe7, 0x2d, 0xfe, 0x3d,
+- 0x0b, 0x9c, 0xb3, 0x32, 0x76, 0xad, 0x49, 0x0e, 0xcb, 0xdc, 0xf3, 0xc3,
+- 0x0d, 0xcd, 0x9c, 0x57, 0xef, 0x7f, 0x45, 0x91, 0x3a, 0xc6, 0x87, 0xd8,
+- 0x33, 0x62, 0x2f, 0xc6, 0xf1, 0x3c, 0xf0, 0x57, 0xe4, 0x95, 0x8d, 0x93,
+- 0x9a, 0xf8, 0x7d, 0x1f, 0xf9, 0x4a, 0x4f, 0x11, 0x0d, 0xc9, 0x87, 0x30,
+- 0x62, 0x57, 0x90, 0x77, 0xd7, 0x92, 0xaf, 0x2e, 0x34, 0x33, 0xff, 0x6c,
+- 0xb0, 0xed, 0xef, 0xb7, 0xc0, 0xf6, 0x98, 0xba, 0x51, 0xe7, 0x2d, 0x7e,
+- 0xbe, 0x06, 0xfa, 0x85, 0xb0, 0xa2, 0x17, 0x7f, 0x88, 0xc4, 0xd0, 0xab,
+- 0x10, 0xbb, 0x02, 0x6b, 0x16, 0x7c, 0x58, 0x4b, 0x7d, 0xb6, 0x4e, 0x72,
+- 0x6e, 0xf2, 0x8e, 0x04, 0x75, 0xba, 0x7d, 0x92, 0x5c, 0x4a, 0x0f, 0x61,
+- 0x35, 0x6d, 0x3c, 0x78, 0xca, 0xb6, 0x2b, 0x69, 0xe3, 0x46, 0xae, 0xcf,
+- 0x7d, 0x27, 0x6c, 0xbc, 0x62, 0xbc, 0x42, 0x9b, 0x2a, 0xe4, 0x83, 0x2d,
+- 0x7c, 0x27, 0xc2, 0xe7, 0x03, 0xd8, 0x3f, 0x29, 0x75, 0x50, 0x3d, 0x9f,
+- 0xb9, 0x88, 0x63, 0xd9, 0x24, 0x9a, 0x69, 0xbf, 0x18, 0xc7, 0x6c, 0xe2,
+- 0x3b, 0xb1, 0x05, 0x37, 0x97, 0xc4, 0x16, 0x7e, 0x1d, 0x0e, 0x00, 0xa7,
+- 0xa7, 0xb4, 0x89, 0x22, 0xb9, 0x74, 0x8d, 0x39, 0x02, 0xe6, 0x62, 0xbc,
+- 0x3d, 0xa3, 0xe0, 0xf8, 0x14, 0x6b, 0xb7, 0x0d, 0xb0, 0xab, 0xa8, 0xc7,
+- 0x5b, 0x33, 0xbf, 0x89, 0xe7, 0x4e, 0x52, 0xf7, 0x67, 0x23, 0xf8, 0x7a,
+- 0xd6, 0x87, 0x5b, 0x8e, 0x0b, 0x3f, 0xd3, 0x93, 0x07, 0x14, 0xa9, 0x75,
+- 0xa4, 0x06, 0x49, 0xc4, 0xfc, 0x8a, 0x07, 0x0d, 0xcf, 0xf9, 0xa0, 0x9f,
+- 0x8b, 0xc1, 0xdf, 0x10, 0x80, 0xde, 0xf0, 0xfb, 0xc4, 0x17, 0x0f, 0x2a,
+- 0x58, 0x97, 0x6e, 0xff, 0x4a, 0x92, 0xd7, 0x22, 0xbc, 0x86, 0xdf, 0xac,
+- 0x84, 0x77, 0xb9, 0x97, 0xf9, 0xb8, 0x42, 0x27, 0xb7, 0xf2, 0xd9, 0xb6,
+- 0x97, 0x78, 0xbf, 0xe7, 0xab, 0xb6, 0x1d, 0x5f, 0x2f, 0xcf, 0xab, 0x88,
+- 0x9f, 0xd3, 0xf9, 0x9c, 0x9b, 0x03, 0xaf, 0x73, 0x2b, 0x2f, 0x7d, 0x47,
+- 0xe2, 0xf3, 0x71, 0xb8, 0xf5, 0x90, 0xcb, 0xc1, 0x5f, 0x2a, 0x08, 0x4f,
+- 0x89, 0x39, 0x3a, 0x9c, 0x9d, 0x52, 0x88, 0x73, 0x26, 0x9f, 0xdd, 0x0c,
+- 0x6f, 0x4a, 0x9b, 0xc8, 0x70, 0xed, 0xf7, 0xaa, 0xad, 0x78, 0xc1, 0xf2,
+- 0xa3, 0x5a, 0x5f, 0x8e, 0x07, 0x7b, 0x54, 0xbc, 0x40, 0x8e, 0xcf, 0x75,
+- 0x4a, 0x16, 0x51, 0xc9, 0x5a, 0x8b, 0xe3, 0x79, 0xfe, 0x1a, 0xfa, 0x57,
+- 0x3c, 0xc4, 0x36, 0xaf, 0x83, 0x6d, 0x15, 0x0d, 0x40, 0x31, 0xef, 0xc3,
+- 0x79, 0xdd, 0xe5, 0x77, 0x2f, 0x39, 0x79, 0x58, 0x53, 0x8b, 0xd7, 0x78,
+- 0x9d, 0xd6, 0x9a, 0x56, 0x0e, 0x7b, 0x45, 0xce, 0x17, 0x0b, 0x3b, 0x7d,
+- 0xae, 0xff, 0x5c, 0xf4, 0x4a, 0xfd, 0x70, 0xfd, 0x7b, 0x15, 0x3c, 0xa6,
+- 0x16, 0x6d, 0xf7, 0x22, 0xe0, 0x33, 0x03, 0x6d, 0xe3, 0xfa, 0xe7, 0x6e,
+- 0x90, 0xbd, 0x19, 0x63, 0x85, 0xeb, 0x75, 0x73, 0x67, 0xd6, 0xf1, 0x9b,
+- 0x4e, 0xb1, 0xfd, 0x53, 0x86, 0x60, 0xeb, 0xb0, 0xd2, 0x41, 0xac, 0xca,
+- 0xf8, 0xdc, 0xba, 0xf8, 0x08, 0xeb, 0xe2, 0xd7, 0xb3, 0xd2, 0x1b, 0x39,
+- 0x84, 0x7d, 0x0e, 0xce, 0x0e, 0x09, 0xce, 0xc6, 0xce, 0x42, 0x1b, 0x1c,
+- 0x28, 0xe1, 0xec, 0x9c, 0x8b, 0xb3, 0xfd, 0x2e, 0xce, 0x1e, 0x2a, 0xe1,
+- 0xec, 0x10, 0x9a, 0xf3, 0x11, 0x72, 0xe0, 0x0e, 0xe6, 0xda, 0x6e, 0x72,
+- 0x0e, 0xc9, 0x91, 0x7d, 0xca, 0xce, 0xf9, 0x80, 0xb2, 0x2d, 0x17, 0xc0,
+- 0xeb, 0xe4, 0x53, 0x33, 0xbd, 0x50, 0x6f, 0xd9, 0x80, 0xe0, 0xce, 0x5c,
+- 0x0f, 0x2a, 0x75, 0xa9, 0x03, 0x2b, 0xb1, 0xdd, 0xc9, 0x55, 0x52, 0x2f,
+- 0x49, 0x2f, 0xa0, 0x97, 0x58, 0x07, 0x35, 0x68, 0xba, 0x75, 0xbf, 0xe0,
+- 0xde, 0xed, 0x7c, 0xf7, 0x2c, 0xfd, 0x10, 0x6e, 0x4e, 0x53, 0xee, 0x60,
+- 0x3d, 0xf0, 0x61, 0x4a, 0x41, 0xf1, 0xce, 0x00, 0x38, 0x16, 0xf5, 0x3d,
+- 0xd0, 0x36, 0x3e, 0xd5, 0xa3, 0x74, 0xcc, 0xce, 0x05, 0x99, 0xb7, 0x99,
+- 0x93, 0x66, 0x82, 0x6e, 0xae, 0xfe, 0xec, 0x58, 0xd2, 0x73, 0x49, 0xb6,
+- 0x6d, 0x22, 0xc7, 0x69, 0x5d, 0xff, 0x8f, 0x36, 0x7e, 0x47, 0xde, 0xff,
+- 0xcf, 0x25, 0xfb, 0xa5, 0x29, 0x4f, 0x24, 0xb0, 0xbd, 0xa0, 0x06, 0xd2,
+- 0x85, 0x0e, 0xbe, 0xdf, 0xc3, 0xb1, 0x7a, 0x83, 0x1d, 0xd6, 0xdd, 0xc1,
+- 0xad, 0x56, 0x77, 0x70, 0x9b, 0xc5, 0xd8, 0x2d, 0xf4, 0xd2, 0x8e, 0x3d,
+- 0xac, 0xe1, 0xef, 0x26, 0x7f, 0x90, 0x31, 0xfb, 0xc9, 0x65, 0x82, 0xd4,
+- 0x6d, 0x84, 0xba, 0x15, 0xa3, 0x7e, 0xa4, 0x35, 0x3f, 0x34, 0x75, 0xcc,
+- 0x59, 0xb7, 0x09, 0xa7, 0x8f, 0x54, 0x65, 0xae, 0x6e, 0xeb, 0x3a, 0x41,
+- 0x4c, 0x37, 0x1b, 0xda, 0x6e, 0x39, 0x85, 0x25, 0x7e, 0x53, 0xea, 0x5e,
+- 0xd6, 0xb2, 0x89, 0x84, 0xf1, 0x3e, 0x12, 0xd1, 0xd7, 0xf9, 0xec, 0x28,
+- 0x7d, 0x75, 0xcc, 0xe9, 0x1d, 0x70, 0x01, 0xf2, 0xcd, 0xe8, 0xb2, 0x02,
+- 0xc1, 0xdb, 0x59, 0x57, 0x85, 0x4d, 0xad, 0x75, 0x97, 0x57, 0x7a, 0x19,
+- 0xc5, 0xdf, 0x0e, 0xa1, 0x19, 0x9d, 0x85, 0x40, 0x70, 0xcb, 0xf4, 0xe7,
+- 0xf0, 0x0f, 0x27, 0x99, 0xbb, 0x20, 0x7e, 0x67, 0xdb, 0xf7, 0xb3, 0x26,
+- 0x39, 0x9a, 0xaf, 0xc7, 0x15, 0x67, 0x4d, 0x7d, 0x38, 0x92, 0x8f, 0xe1,
+- 0x32, 0xf1, 0xc9, 0xb7, 0x50, 0x87, 0x77, 0xa7, 0xbc, 0xd8, 0x67, 0xdc,
+- 0x56, 0xca, 0x09, 0x1e, 0xdc, 0x9b, 0x3c, 0x48, 0x1e, 0xe0, 0x41, 0x2d,
+- 0x39, 0xd8, 0x23, 0xce, 0x35, 0x2f, 0x6b, 0xb7, 0x2f, 0x62, 0xd8, 0xcd,
+- 0x19, 0x94, 0xb1, 0x9e, 0x32, 0xb6, 0x04, 0xb7, 0xe4, 0xb4, 0xe0, 0x1d,
+- 0x39, 0x04, 0xfc, 0xe6, 0xca, 0xb6, 0x33, 0x27, 0x6d, 0x0c, 0x18, 0xab,
+- 0xf0, 0xe1, 0xc9, 0xd1, 0x41, 0x1f, 0xfd, 0xe5, 0x27, 0xa9, 0x3e, 0x58,
+- 0xd3, 0x38, 0x4f, 0x26, 0x71, 0x31, 0x44, 0xfc, 0x6e, 0x24, 0x67, 0xa0,
+- 0x1f, 0x18, 0xf3, 0x8c, 0xc5, 0x6d, 0xf4, 0x0f, 0xfa, 0x43, 0xda, 0x6b,
+- 0x26, 0xfa, 0xc7, 0x48, 0x00, 0x6b, 0x28, 0x4f, 0x90, 0xf8, 0x1c, 0x5a,
+- 0x88, 0x05, 0xf7, 0x30, 0xa7, 0x44, 0x59, 0x9b, 0x05, 0x13, 0xb8, 0xad,
+- 0x0e, 0x89, 0xe4, 0x22, 0xf5, 0xf6, 0x2f, 0x34, 0x07, 0x77, 0x31, 0x47,
+- 0x5c, 0x49, 0xd8, 0x23, 0xaf, 0x18, 0x21, 0x84, 0x17, 0x0c, 0xda, 0xbb,
+- 0x0f, 0xa3, 0xf3, 0x2c, 0x97, 0x12, 0xac, 0xd7, 0x17, 0x5a, 0x83, 0xb7,
+- 0x33, 0x16, 0x6b, 0x88, 0x53, 0x4d, 0x0b, 0xe9, 0xa0, 0xd4, 0x6b, 0xcd,
+- 0x0b, 0x1b, 0x29, 0x9f, 0xac, 0x63, 0x73, 0xdb, 0x26, 0xfa, 0x41, 0x6c,
+- 0x01, 0xdb, 0x09, 0x65, 0xaf, 0x71, 0xcc, 0xbe, 0x28, 0x79, 0xe8, 0xfe,
+- 0x0d, 0x21, 0x62, 0x91, 0xd8, 0x92, 0x76, 0x2c, 0x94, 0x75, 0x92, 0xdc,
+- 0xdb, 0xd0, 0xb6, 0x70, 0x4a, 0x72, 0x6f, 0xb4, 0x2d, 0x7b, 0x4a, 0xc7,
+- 0x65, 0xe6, 0x8f, 0x35, 0x29, 0xcd, 0x38, 0xa7, 0xc4, 0xa3, 0x17, 0xa9,
+- 0x8b, 0x0f, 0x3f, 0xb3, 0xf7, 0xea, 0x89, 0xe2, 0x4a, 0xc6, 0x4f, 0x2d,
+- 0xf1, 0x2f, 0x4a, 0x5c, 0xaf, 0x5d, 0xa0, 0x61, 0x16, 0x7e, 0x46, 0xff,
+- 0x88, 0x22, 0x90, 0xd0, 0xf1, 0xde, 0xc9, 0x24, 0xed, 0x70, 0x6d, 0xcc,
+- 0x03, 0xa4, 0x50, 0x03, 0x4c, 0x77, 0x4f, 0x3c, 0x47, 0x1f, 0x1c, 0xe7,
+- 0xbc, 0x15, 0x0b, 0x22, 0xb3, 0x3c, 0x1f, 0xe1, 0xf3, 0xd7, 0xe7, 0xae,
+- 0xe5, 0xdc, 0x1f, 0x9d, 0x92, 0xfe, 0x52, 0xb4, 0xed, 0xfc, 0x49, 0x77,
+- 0xee, 0x44, 0x2a, 0x89, 0x9f, 0x9e, 0xd4, 0x86, 0xde, 0x53, 0xe2, 0xfd,
+- 0xe7, 0x15, 0x99, 0x1f, 0xf5, 0x35, 0xf8, 0xd0, 0x1e, 0x4d, 0x24, 0x86,
+- 0xf7, 0x72, 0xcc, 0xd6, 0x8d, 0xb4, 0xbf, 0x23, 0x07, 0x13, 0x3b, 0xb1,
+- 0xd4, 0x4f, 0x79, 0x5c, 0x59, 0xea, 0x39, 0xf6, 0xc9, 0x52, 0x9d, 0xc5,
+- 0x1a, 0xf3, 0xba, 0x3c, 0x11, 0xda, 0x21, 0xb0, 0xa7, 0x25, 0x84, 0x3a,
+- 0xe7, 0x39, 0x95, 0xcf, 0x89, 0x1d, 0x7e, 0xae, 0x78, 0xf4, 0xf7, 0x89,
+- 0x5b, 0x82, 0x1d, 0x11, 0x62, 0xd6, 0xdd, 0x52, 0x8f, 0x66, 0x32, 0xf4,
+- 0x77, 0x3f, 0xfd, 0x7d, 0xab, 0xf8, 0xb4, 0x45, 0x9f, 0xb6, 0xe8, 0xd3,
+- 0x96, 0x16, 0x1d, 0x42, 0x5c, 0x1d, 0xe0, 0xba, 0xa5, 0xa3, 0xe2, 0xeb,
+- 0xbd, 0xd8, 0xc7, 0xdf, 0xfb, 0x78, 0xff, 0x08, 0x6b, 0x54, 0x2c, 0x95,
+- 0x39, 0x0f, 0xa1, 0xc3, 0x7a, 0x02, 0x83, 0x39, 0xfc, 0x22, 0xd8, 0x52,
+- 0x89, 0xca, 0xd5, 0x52, 0x7f, 0x6b, 0xea, 0x51, 0x3c, 0xc1, 0x1a, 0xe8,
+- 0xe7, 0x4a, 0xb5, 0xee, 0xeb, 0x39, 0xa6, 0x68, 0x6a, 0x07, 0x6b, 0xd9,
+- 0xbd, 0x85, 0xbb, 0xb9, 0xbe, 0xf1, 0xc1, 0xd7, 0x15, 0xd6, 0x41, 0x75,
+- 0x9c, 0x9b, 0xb1, 0x74, 0x07, 0xe7, 0xb1, 0x44, 0x0e, 0x07, 0x5f, 0x7f,
+- 0x0f, 0x62, 0xdb, 0x6f, 0x37, 0x0e, 0x70, 0x7e, 0x57, 0x8e, 0x51, 0xd6,
+- 0x83, 0x03, 0x8c, 0xb1, 0x7d, 0x4e, 0x7c, 0xf5, 0x72, 0x8c, 0xeb, 0xb8,
+- 0xb5, 0x25, 0x2b, 0xf9, 0xd2, 0xc6, 0x93, 0x86, 0x8d, 0xe7, 0xf9, 0x7b,
+- 0x81, 0xd8, 0x35, 0x76, 0x03, 0x76, 0x79, 0xf8, 0xdc, 0x1e, 0x3e, 0xd7,
+- 0x4a, 0xdc, 0x9e, 0x9f, 0x95, 0xbe, 0xde, 0x21, 0xe9, 0xeb, 0x21, 0x6f,
+- 0x89, 0xed, 0x87, 0x70, 0x3e, 0x1b, 0x1f, 0xf6, 0x7a, 0xed, 0x11, 0xc6,
+- 0xd5, 0x85, 0x8f, 0xe8, 0xbb, 0x6f, 0x6e, 0xd0, 0x7a, 0x68, 0xc3, 0xe4,
+- 0xa4, 0xa2, 0x45, 0xbf, 0x8b, 0xe2, 0xf6, 0x00, 0x9a, 0x62, 0x6b, 0xbd,
+- 0x09, 0x95, 0x38, 0x57, 0x1c, 0xa0, 0xa6, 0xcf, 0x16, 0x5c, 0x6c, 0xdb,
+- 0x54, 0xc2, 0xb6, 0xd6, 0x7c, 0x15, 0xb1, 0x87, 0x39, 0x78, 0xd6, 0xce,
+- 0x84, 0x99, 0x9f, 0x0a, 0xb3, 0x32, 0xf6, 0x08, 0x9a, 0x52, 0x32, 0x96,
+- 0xde, 0x39, 0xa9, 0xe0, 0x4b, 0xd5, 0x48, 0x30, 0x37, 0xc1, 0xa8, 0xd4,
+- 0x33, 0x36, 0x73, 0x90, 0xea, 0x37, 0x25, 0x3f, 0x76, 0x13, 0x0f, 0x7b,
+- 0x89, 0x87, 0xc2, 0x99, 0xa5, 0xd7, 0xe9, 0xe2, 0xd1, 0xd6, 0x82, 0xac,
+- 0x8b, 0xac, 0x89, 0xac, 0xcd, 0x21, 0xdc, 0x6b, 0x49, 0xdd, 0x6e, 0x63,
+- 0xca, 0x48, 0xc4, 0x9e, 0x83, 0xac, 0xd3, 0x21, 0xda, 0xc2, 0x8f, 0x7d,
+- 0xc4, 0xbf, 0xbd, 0x2d, 0xb4, 0x55, 0xd8, 0x8f, 0xbd, 0x4e, 0x1f, 0xa0,
+- 0x6c, 0x3f, 0x3f, 0xd7, 0x50, 0x61, 0x4e, 0xfb, 0xaa, 0xdf, 0xb5, 0xa3,
+- 0xdb, 0x57, 0xf4, 0x9a, 0x32, 0x5e, 0xb9, 0xa7, 0xe8, 0xda, 0x6e, 0x7b,
+- 0x56, 0xc6, 0xb5, 0x71, 0xd6, 0x70, 0xb9, 0x69, 0xd9, 0x66, 0x82, 0xed,
+- 0x4b, 0x36, 0x02, 0x6b, 0x6f, 0xe0, 0xa7, 0x55, 0xbc, 0xd6, 0x75, 0x9d,
+- 0x9f, 0xf6, 0x09, 0x07, 0x26, 0x3f, 0xed, 0xdc, 0x49, 0x7e, 0xda, 0xa0,
+- 0x94, 0xb9, 0xa9, 0xf4, 0x14, 0xca, 0xfc, 0xb4, 0xb6, 0x84, 0xcd, 0x87,
+- 0xb0, 0x97, 0xdc, 0xa5, 0xae, 0x61, 0x04, 0x81, 0x75, 0x9e, 0x4f, 0x3d,
+- 0x18, 0x61, 0xed, 0x51, 0x01, 0x2c, 0xb3, 0xb1, 0x72, 0x7d, 0xc6, 0xae,
+- 0xd4, 0x1b, 0x62, 0x95, 0x1e, 0xe9, 0x19, 0x27, 0x32, 0x63, 0xc4, 0x12,
+- 0xcf, 0x3a, 0x2d, 0x93, 0x46, 0x40, 0x5d, 0xa2, 0xdf, 0x5d, 0xaa, 0x09,
+- 0xa2, 0x81, 0x1d, 0xe4, 0x36, 0x89, 0xd4, 0x2f, 0xed, 0x99, 0xc8, 0x08,
+- 0xa2, 0xeb, 0x8a, 0xc3, 0x51, 0xa4, 0x0f, 0x46, 0x1d, 0x5c, 0x99, 0x40,
+- 0x3e, 0x11, 0x0d, 0x74, 0x17, 0x32, 0xc1, 0xae, 0xc6, 0x18, 0x76, 0x4e,
+- 0x76, 0xb0, 0xe6, 0xd0, 0xb1, 0x6d, 0xb2, 0x93, 0xf5, 0x51, 0x8f, 0xd2,
+- 0x33, 0x2b, 0xf6, 0x11, 0xfb, 0x6a, 0x6a, 0xcc, 0x73, 0x63, 0x2f, 0xb3,
+- 0x5c, 0xcf, 0xbe, 0xef, 0xf8, 0xce, 0xb8, 0xa1, 0xd2, 0x2e, 0xff, 0xdb,
+- 0x8f, 0xb0, 0x8d, 0x33, 0x86, 0xf8, 0x1c, 0xbf, 0xb3, 0xb6, 0xda, 0xda,
+- 0x32, 0x65, 0xfb, 0x74, 0xe9, 0x49, 0x47, 0x9d, 0xf5, 0x92, 0x1a, 0xab,
+- 0x63, 0xb6, 0x97, 0x6b, 0x54, 0xee, 0x3f, 0xdf, 0xb8, 0x56, 0x9b, 0x83,
+- 0x5b, 0x89, 0x67, 0xac, 0xc7, 0x02, 0x01, 0x62, 0x64, 0xe0, 0x94, 0x8d,
+- 0x59, 0xe3, 0x1d, 0xfb, 0x49, 0xdd, 0xc7, 0xf5, 0xb8, 0x95, 0x78, 0x2b,
+- 0xfc, 0xc3, 0x0c, 0xee, 0x9a, 0xf6, 0x79, 0x58, 0x5b, 0xb5, 0x54, 0xc0,
+- 0xa9, 0xad, 0x9c, 0x3e, 0xe1, 0xb1, 0xfc, 0x6d, 0xc1, 0xae, 0x1c, 0xeb,
+- 0x04, 0xd6, 0xa9, 0x6e, 0x8d, 0x76, 0x6b, 0xf0, 0x9e, 0x9c, 0x57, 0xa9,
+- 0x33, 0xe1, 0x6d, 0xdd, 0x68, 0xe3, 0xe3, 0xf5, 0x89, 0xe1, 0xa8, 0x87,
+- 0xd8, 0xc8, 0xb1, 0xac, 0x7c, 0x4b, 0xb0, 0x8f, 0x58, 0x7c, 0x7b, 0x0e,
+- 0x69, 0xe9, 0xa9, 0x86, 0xd7, 0x8f, 0xf6, 0x87, 0x21, 0xfd, 0x2f, 0x7c,
+- 0x89, 0xd1, 0x18, 0xa1, 0xaf, 0x45, 0xdb, 0x95, 0xc4, 0xe2, 0x20, 0x12,
+- 0x17, 0x3e, 0xf6, 0xbe, 0x63, 0x3f, 0x9d, 0xdf, 0xc8, 0xe7, 0x3b, 0x89,
+- 0x93, 0x69, 0xe2, 0xe6, 0xe8, 0xb0, 0x1f, 0xf2, 0x8e, 0xd6, 0xf7, 0xb6,
+- 0x12, 0xa7, 0x8f, 0xe3, 0x77, 0xf8, 0xbc, 0xba, 0x8d, 0x18, 0x39, 0x6b,
+- 0x24, 0xd2, 0x5b, 0x90, 0xe9, 0xac, 0x85, 0x66, 0x34, 0x2a, 0xd2, 0xaf,
+- 0x12, 0xfb, 0x27, 0xf1, 0x3d, 0xce, 0xe9, 0xd3, 0xc5, 0x8e, 0x9b, 0x31,
+- 0x30, 0xab, 0xa9, 0xd7, 0xfd, 0x4c, 0x6c, 0x20, 0x76, 0xe9, 0xa8, 0x40,
+- 0xd5, 0x52, 0xea, 0xf6, 0x3d, 0x07, 0x4f, 0x82, 0xba, 0x8e, 0xff, 0x42,
+- 0x1e, 0xf4, 0x17, 0x05, 0xe9, 0x4b, 0x96, 0xb9, 0x9d, 0xf8, 0x44, 0x73,
+- 0xdb, 0x2d, 0x33, 0xc9, 0x52, 0x9f, 0x32, 0x10, 0xec, 0x9c, 0xb6, 0x71,
+- 0xd2, 0x08, 0x43, 0xea, 0xf3, 0xca, 0x54, 0x91, 0x19, 0xbf, 0x19, 0xdb,
+- 0x78, 0xbd, 0x63, 0xba, 0x5a, 0xe9, 0xc8, 0xd9, 0xf8, 0xa6, 0xa1, 0x65,
+- 0xda, 0xbd, 0x8c, 0x65, 0x43, 0x3b, 0x0b, 0x5c, 0x26, 0x27, 0x12, 0xdf,
+- 0xf2, 0x21, 0xa4, 0xbb, 0x63, 0x35, 0xcf, 0xdc, 0x46, 0xbe, 0x20, 0xb1,
+- 0xe5, 0x5d, 0x53, 0x85, 0x94, 0x32, 0xe3, 0x13, 0xbb, 0x75, 0x22, 0x5d,
+- 0xa8, 0x56, 0x76, 0xd3, 0x96, 0x77, 0xac, 0xab, 0xc0, 0x25, 0xc7, 0x96,
+- 0xb7, 0xd1, 0x96, 0x78, 0x6b, 0x05, 0xbc, 0xe7, 0xeb, 0xd0, 0xa9, 0xc0,
+- 0xa9, 0xbd, 0xaa, 0x99, 0x9f, 0xd3, 0xe4, 0xae, 0xe4, 0x7d, 0x6a, 0x2f,
+- 0xbe, 0x42, 0x9c, 0x79, 0x92, 0x3e, 0xfa, 0x33, 0xbd, 0x19, 0x55, 0x5f,
+- 0x6d, 0xe1, 0x3a, 0x6e, 0x0c, 0xee, 0xc8, 0xf5, 0xe1, 0xa9, 0x79, 0x1b,
+- 0xcf, 0x31, 0x3e, 0x1a, 0x53, 0x19, 0xb5, 0x92, 0xb5, 0x18, 0x73, 0xd9,
+- 0xe2, 0x09, 0xc7, 0xbf, 0x57, 0xb6, 0x6d, 0x9e, 0x8b, 0xc2, 0xfb, 0x15,
+- 0xf9, 0xbb, 0xbe, 0x2d, 0x36, 0x27, 0x9f, 0x51, 0x7e, 0xda, 0x18, 0x32,
+- 0xb4, 0xf4, 0xc7, 0xde, 0x2a, 0x54, 0x27, 0x6c, 0x7b, 0x28, 0x25, 0xd7,
+- 0xf5, 0xb6, 0xa4, 0x73, 0xbf, 0x81, 0x9f, 0xe5, 0x3e, 0xf2, 0xeb, 0xc2,
+- 0xf9, 0x62, 0x69, 0xea, 0xbc, 0x93, 0x79, 0xbd, 0x8f, 0x79, 0xbd, 0xce,
+- 0xd4, 0xd2, 0x7b, 0xbc, 0xd2, 0x3b, 0x29, 0x1e, 0xac, 0xe5, 0xf5, 0x5d,
+- 0xa5, 0xbc, 0x5e, 0x73, 0x4a, 0xfa, 0x70, 0xe4, 0x7a, 0x70, 0xf7, 0x2f,
+- 0xba, 0x99, 0xd7, 0xab, 0x26, 0x7d, 0xe8, 0x62, 0x4e, 0xf7, 0x93, 0x67,
+- 0x6f, 0xcd, 0xd7, 0x21, 0x78, 0xc2, 0x8b, 0x78, 0xea, 0xdb, 0x38, 0x48,
+- 0x1f, 0x3b, 0x98, 0xf4, 0x2a, 0xb1, 0xe5, 0x1e, 0xda, 0xe9, 0x9f, 0x70,
+- 0x40, 0xf5, 0xa2, 0x46, 0xff, 0x2e, 0x1e, 0xfa, 0x35, 0xb9, 0xbc, 0x2f,
+- 0x27, 0x31, 0xbd, 0xb2, 0xad, 0xeb, 0x94, 0x9b, 0xcb, 0x43, 0xa7, 0x46,
+- 0x17, 0x25, 0x97, 0xd7, 0xad, 0xef, 0xc3, 0xe9, 0x69, 0xfc, 0xe1, 0x0a,
+- 0x92, 0xc4, 0x3a, 0xce, 0xd9, 0x90, 0x4a, 0xb0, 0x6e, 0xd6, 0x06, 0xb7,
+- 0x29, 0x89, 0x89, 0x1a, 0xc6, 0xfe, 0x69, 0xe6, 0xf2, 0x80, 0x99, 0x50,
+- 0x93, 0x1e, 0x74, 0xfb, 0xb9, 0x1e, 0x1f, 0xb0, 0x86, 0xfe, 0x61, 0x3e,
+- 0xc6, 0x31, 0x2b, 0xe0, 0x63, 0x2e, 0xff, 0x40, 0xc7, 0xa7, 0x5e, 0xfa,
+- 0xde, 0x65, 0x6f, 0x00, 0x57, 0xf3, 0x6e, 0x2e, 0xaf, 0x6d, 0xb4, 0x47,
+- 0xae, 0xa4, 0x42, 0xf8, 0x30, 0x6f, 0xd0, 0x07, 0xfb, 0x70, 0x84, 0xb9,
+- 0xfc, 0x8a, 0xae, 0xe2, 0xa7, 0xf9, 0x56, 0xfa, 0x65, 0x04, 0x3f, 0x21,
+- 0xcf, 0x5d, 0xc7, 0x5c, 0x7e, 0x27, 0x7d, 0x2a, 0xc5, 0x5c, 0xde, 0xee,
+- 0xf0, 0x8c, 0xe6, 0xb6, 0x33, 0x53, 0x4e, 0x2e, 0x6f, 0x64, 0x89, 0x5f,
+- 0xef, 0x47, 0x62, 0x91, 0xf8, 0x60, 0xff, 0x6c, 0x63, 0x88, 0xcf, 0xd2,
+- 0x6e, 0x85, 0xf5, 0x98, 0x71, 0x72, 0xcf, 0xe6, 0xe0, 0x6e, 0xce, 0xbd,
+- 0xcc, 0x89, 0x33, 0x1b, 0x3b, 0xd7, 0xbd, 0x89, 0x3f, 0x58, 0xe2, 0xa1,
+- 0x1f, 0x9a, 0xc1, 0x3b, 0x18, 0x6b, 0x61, 0xfa, 0xd7, 0x4f, 0x53, 0x89,
+- 0xfe, 0x73, 0xac, 0x21, 0x7f, 0xc2, 0x38, 0xbb, 0x93, 0xbe, 0xb1, 0x72,
+- 0x5d, 0x80, 0xeb, 0xee, 0xc6, 0x59, 0x07, 0xe3, 0x2c, 0xca, 0x38, 0x5b,
+- 0xc1, 0x38, 0x7b, 0xda, 0x48, 0x24, 0x37, 0x93, 0x6f, 0xbd, 0x9e, 0x97,
+- 0x58, 0x6b, 0xe1, 0xb8, 0x1a, 0xf5, 0x1a, 0xed, 0x97, 0x98, 0xd9, 0xb9,
+- 0x6e, 0xf4, 0x6c, 0x35, 0xc4, 0x56, 0xf8, 0x74, 0x19, 0xb9, 0x05, 0x11,
+- 0xe9, 0xc2, 0xa2, 0x37, 0x31, 0xbc, 0xca, 0x9b, 0x18, 0x7a, 0x5f, 0x79,
+- 0xc7, 0x7e, 0x8b, 0x71, 0x76, 0x3b, 0xe3, 0x6c, 0x37, 0xe3, 0xac, 0xdd,
+- 0xb2, 0xf1, 0x52, 0x4a, 0xeb, 0x6b, 0xf6, 0xc4, 0x8d, 0x76, 0x0f, 0x56,
+- 0x54, 0x33, 0x25, 0x04, 0x91, 0xe8, 0xfc, 0x03, 0xca, 0x7f, 0xc1, 0x48,
+- 0xf4, 0x24, 0x15, 0x89, 0xad, 0x18, 0x7e, 0x4c, 0xbd, 0x2b, 0x4b, 0xb1,
+- 0xb5, 0x7f, 0xf6, 0xd5, 0x92, 0x6f, 0x94, 0x75, 0xf7, 0xe2, 0x45, 0x83,
+- 0x18, 0xba, 0x54, 0x8b, 0x65, 0x3c, 0xbd, 0x98, 0xa0, 0x1d, 0x83, 0x89,
+- 0x5e, 0x1c, 0x65, 0x1e, 0xbc, 0x9f, 0xf9, 0xf7, 0x01, 0x2b, 0xde, 0xba,
+- 0x83, 0x75, 0xce, 0xa5, 0xa8, 0x16, 0x8b, 0x29, 0xbd, 0x18, 0xa0, 0x0f,
+- 0x0f, 0x30, 0x5f, 0xb4, 0x5b, 0x3f, 0x57, 0xb6, 0x91, 0x23, 0xdc, 0x57,
+- 0x90, 0xf7, 0xb4, 0x64, 0xbf, 0x67, 0x10, 0xfd, 0xf3, 0x82, 0x6d, 0x50,
+- 0x6f, 0x32, 0x7b, 0x71, 0xdc, 0xaa, 0x40, 0x6f, 0x4b, 0xb7, 0xb2, 0xab,
+- 0x20, 0xbd, 0x33, 0xc6, 0xa3, 0xc5, 0x78, 0x75, 0xe4, 0x55, 0x88, 0xa5,
+- 0xdd, 0xc8, 0x4a, 0x7c, 0x5a, 0xbb, 0x95, 0x3b, 0x67, 0x25, 0xc6, 0x7b,
+- 0x95, 0x5e, 0x89, 0x61, 0x6b, 0x58, 0xb9, 0x4b, 0x62, 0xda, 0xe9, 0x33,
+- 0x4b, 0xdc, 0xcb, 0x3e, 0xc4, 0x6d, 0xe4, 0x6f, 0x60, 0x4c, 0x79, 0xbf,
+- 0x1a, 0x65, 0xdc, 0xb5, 0x57, 0x78, 0xe8, 0xa7, 0x71, 0xae, 0x9d, 0x07,
+- 0x1d, 0xc6, 0x6f, 0xda, 0x19, 0xb5, 0x9f, 0x31, 0xd5, 0x8b, 0x23, 0xd6,
+- 0x6f, 0xd8, 0x57, 0x1c, 0x5e, 0x52, 0xc6, 0xf3, 0xcd, 0xb8, 0x37, 0xb7,
+- 0x1c, 0x01, 0x5d, 0xf2, 0x75, 0x08, 0xc9, 0x25, 0x01, 0x54, 0xe9, 0x92,
+- 0x67, 0x9a, 0xdb, 0x16, 0x4e, 0x50, 0x86, 0x0d, 0xe5, 0xf8, 0xde, 0x8c,
+- 0x07, 0x89, 0x03, 0xfb, 0x52, 0xf7, 0xe2, 0x01, 0xb5, 0x0a, 0x61, 0xda,
+- 0xe9, 0x61, 0x35, 0x44, 0x7c, 0xfd, 0xbd, 0xd2, 0x38, 0xff, 0xa9, 0xa2,
+- 0x54, 0x33, 0x5f, 0xe3, 0x54, 0x75, 0x8c, 0xb1, 0x4d, 0xd3, 0x52, 0x9b,
+- 0x44, 0xdb, 0xa2, 0xd3, 0x3a, 0xc2, 0xac, 0x55, 0x37, 0xa7, 0xb4, 0xe1,
+- 0xcd, 0xde, 0xf8, 0xe0, 0xa2, 0x82, 0x6c, 0x98, 0x7c, 0x2e, 0x9f, 0x48,
+- 0xf4, 0x34, 0x8b, 0x8d, 0xf5, 0x28, 0xb6, 0xd3, 0x4e, 0x5d, 0xf9, 0x08,
+- 0x63, 0xe8, 0xbd, 0x0a, 0xe1, 0x46, 0xe9, 0xfc, 0xf5, 0xb1, 0xa2, 0x1c,
+- 0x2b, 0x3a, 0x2d, 0x3c, 0x2d, 0x4a, 0x9e, 0xa6, 0x33, 0x0e, 0x6d, 0x7b,
+- 0x13, 0xf9, 0x59, 0xe8, 0x94, 0xd4, 0x38, 0xf1, 0x09, 0x72, 0xda, 0x66,
+- 0xf2, 0xdd, 0x5e, 0x7a, 0xb5, 0xbd, 0xb2, 0x21, 0x61, 0xb4, 0x2b, 0x78,
+- 0x62, 0xae, 0x85, 0xf5, 0x11, 0xc7, 0xbc, 0x9c, 0x57, 0x71, 0x25, 0x1f,
+- 0xc5, 0xbb, 0x1c, 0xfb, 0x92, 0x33, 0x76, 0x3d, 0x7e, 0x54, 0xc2, 0xad,
+- 0x14, 0x71, 0x6b, 0x4b, 0x4e, 0xa1, 0xbf, 0xc6, 0x30, 0x62, 0xfc, 0xdd,
+- 0xa7, 0x97, 0x6e, 0x0e, 0xd0, 0x6e, 0xa2, 0x8b, 0x8f, 0x9f, 0xe3, 0x78,
+- 0xd8, 0xc1, 0xe9, 0x37, 0x3f, 0x9d, 0x59, 0xc2, 0xb5, 0xa2, 0xed, 0x6b,
+- 0x4b, 0xef, 0xad, 0x9d, 0xf9, 0xf3, 0x92, 0xbe, 0x3a, 0x3c, 0xa7, 0x92,
+- 0xa8, 0x38, 0x75, 0x4d, 0x56, 0x5d, 0xe2, 0x83, 0x19, 0xf5, 0x89, 0xaf,
+- 0x71, 0xfe, 0xc7, 0xc8, 0xf5, 0x6c, 0xce, 0x7f, 0xd5, 0x99, 0x37, 0xc2,
+- 0x79, 0x95, 0x6b, 0xbc, 0x30, 0x7a, 0xed, 0x1d, 0x95, 0xba, 0xe3, 0xf1,
+- 0x28, 0x6d, 0xf7, 0xe1, 0x06, 0x79, 0x2e, 0x84, 0x5d, 0xf9, 0x15, 0x95,
+- 0x82, 0xe3, 0x41, 0xd6, 0x01, 0xae, 0x2f, 0x91, 0xe7, 0x59, 0xcf, 0xf1,
+- 0x9e, 0xf0, 0xae, 0xcd, 0xe4, 0x18, 0x9f, 0xb5, 0x7b, 0x84, 0x6b, 0xf1,
+- 0x7f, 0xf8, 0x8e, 0xdc, 0xfb, 0x75, 0x79, 0xf4, 0x4f, 0x31, 0xcc, 0x1a,
+- 0xe8, 0xb1, 0x5c, 0x06, 0x0f, 0xe7, 0xbe, 0xec, 0xec, 0xab, 0xad, 0x5d,
+- 0x8f, 0xfb, 0x38, 0xe7, 0x81, 0x5a, 0xc6, 0xd1, 0x7f, 0x4b, 0x25, 0x84,
+- 0x1b, 0xed, 0xae, 0x86, 0xe4, 0xda, 0x44, 0xeb, 0x2a, 0xc5, 0x46, 0x45,
+- 0x0a, 0x43, 0x1d, 0x2d, 0x89, 0xe4, 0x15, 0x3c, 0x61, 0x4b, 0x5f, 0xd3,
+- 0x5b, 0xca, 0xbb, 0x52, 0xff, 0x49, 0x6f, 0xb5, 0xbd, 0xc4, 0x91, 0xb6,
+- 0x14, 0xde, 0xf9, 0x4c, 0xef, 0x40, 0xea, 0x6e, 0xc9, 0x37, 0x41, 0xa5,
+- 0x9d, 0xf3, 0x1c, 0x21, 0x66, 0xbf, 0x68, 0xbc, 0x12, 0x65, 0x36, 0x86,
+- 0x6f, 0x9d, 0x82, 0x83, 0x86, 0x1f, 0x99, 0x88, 0x8d, 0xdd, 0xfc, 0xdc,
+- 0x4f, 0xde, 0xf4, 0x9e, 0x51, 0x83, 0x19, 0x55, 0x25, 0x57, 0x24, 0x06,
+- 0x7b, 0xde, 0xf4, 0xcb, 0x5e, 0x4c, 0xcc, 0x23, 0xfb, 0xe6, 0xff, 0xd6,
+- 0x5e, 0xca, 0x3a, 0xf2, 0x16, 0xd1, 0x3d, 0xa8, 0x10, 0x43, 0x93, 0x20,
+- 0x97, 0xd9, 0x6b, 0x14, 0x63, 0x1e, 0xa4, 0xaf, 0x7a, 0xa0, 0x9d, 0xbe,
+- 0xcc, 0xfa, 0xee, 0xb1, 0x06, 0xed, 0x74, 0x9b, 0x57, 0xc7, 0xf0, 0xf1,
+- 0x00, 0x1e, 0x39, 0xbe, 0x0d, 0xb5, 0x4e, 0xef, 0x67, 0x9c, 0x36, 0xf5,
+- 0xb0, 0xae, 0x1a, 0xfd, 0xa5, 0x8f, 0xf5, 0xd5, 0xd5, 0xf5, 0x8f, 0xa3,
+- 0xd5, 0xb9, 0x3e, 0x86, 0xfb, 0x72, 0x41, 0xa5, 0x2b, 0xe7, 0xc3, 0xb6,
+- 0x3b, 0x1f, 0x87, 0x7f, 0x5d, 0x3f, 0xe5, 0x92, 0xeb, 0xf2, 0xf7, 0x5d,
+- 0xac, 0xcb, 0x44, 0xbe, 0x0a, 0xc4, 0x96, 0x53, 0xb6, 0x75, 0x3a, 0x46,
+- 0x8e, 0xfb, 0x94, 0x3d, 0xd6, 0x7f, 0xb7, 0xaf, 0x3a, 0xfb, 0x34, 0x72,
+- 0xad, 0x4a, 0xf6, 0xef, 0xf9, 0x8c, 0x60, 0xce, 0x00, 0x72, 0x8c, 0xed,
+- 0xbb, 0x9c, 0xf7, 0xff, 0xb8, 0xc2, 0xd5, 0x29, 0xcd, 0x7a, 0xb5, 0x83,
+- 0xeb, 0x27, 0xcf, 0x24, 0x4b, 0xd7, 0x9a, 0x03, 0xee, 0x19, 0x01, 0xf1,
+- 0x85, 0x01, 0xdc, 0xc2, 0x45, 0x68, 0x48, 0x88, 0x8f, 0x0d, 0xa0, 0x21,
+- 0x4f, 0x40, 0x5d, 0xee, 0xca, 0xfb, 0x90, 0x55, 0x64, 0xad, 0xa9, 0x13,
+- 0x37, 0x69, 0xbb, 0x65, 0xf2, 0xfe, 0x2f, 0x2a, 0x7f, 0xf5, 0x7d, 0xc1,
+- 0x5b, 0x72, 0xcc, 0xb0, 0x70, 0xcd, 0x5f, 0x77, 0xff, 0xb7, 0x20, 0xf7,
+- 0x7c, 0xfa, 0x9f, 0x30, 0x8e, 0x13, 0x3d, 0xd5, 0x1e, 0xf1, 0x9f, 0x3f,
+- 0xc1, 0x03, 0xb3, 0x8f, 0xf0, 0xbe, 0x8c, 0x7f, 0x88, 0x35, 0x84, 0x4f,
+- 0xe9, 0x24, 0xfe, 0xec, 0x3f, 0xee, 0xd9, 0x55, 0x81, 0xbf, 0xb4, 0x2b,
+- 0x97, 0x8d, 0xa0, 0x21, 0x35, 0xc6, 0xe7, 0x15, 0x74, 0x90, 0x2f, 0x3e,
+- 0x65, 0x6c, 0xc1, 0xb6, 0x25, 0x82, 0x01, 0x2f, 0xda, 0x03, 0xbd, 0x62,
+- 0x43, 0x05, 0x5b, 0x79, 0xfd, 0x25, 0xae, 0xef, 0xb3, 0x86, 0x0f, 0x0d,
+- 0x4b, 0xa5, 0x8f, 0xa7, 0x4d, 0xa5, 0xd1, 0x1e, 0x70, 0xf7, 0xab, 0x32,
+- 0x76, 0xad, 0xae, 0x0f, 0xdd, 0xe1, 0x69, 0x98, 0x7a, 0x9b, 0xfe, 0xd4,
+- 0xbe, 0xee, 0xc6, 0x7b, 0x65, 0x9b, 0x18, 0xe4, 0x90, 0x2f, 0xd8, 0xb8,
+- 0x69, 0x14, 0xea, 0xba, 0x1b, 0xd7, 0xbf, 0x2c, 0xf7, 0x21, 0xc6, 0x20,
+- 0x32, 0xb5, 0xa6, 0xf4, 0x79, 0x12, 0x1c, 0xe7, 0x10, 0x7e, 0xbf, 0x30,
+- 0x86, 0x83, 0xb9, 0x12, 0xa7, 0xa6, 0x6f, 0xeb, 0xeb, 0xae, 0xeb, 0xf6,
+- 0x50, 0x2e, 0xd1, 0x5f, 0x53, 0xd2, 0xed, 0x00, 0xeb, 0x8b, 0x6a, 0x62,
+- 0xec, 0x83, 0xb4, 0xe9, 0x90, 0x63, 0xd3, 0x5e, 0x18, 0xf9, 0xeb, 0xe3,
+- 0x0e, 0x72, 0xdc, 0xa0, 0x29, 0x76, 0x93, 0x3d, 0xb2, 0x43, 0xd8, 0xcf,
+- 0x71, 0xf7, 0xdd, 0x30, 0xee, 0x80, 0x71, 0x7d, 0xdc, 0xbd, 0xb9, 0xc4,
+- 0x69, 0x4f, 0x69, 0xdc, 0x47, 0x67, 0xcb, 0x63, 0x64, 0x70, 0xfb, 0xba,
+- 0x0c, 0xf2, 0x9b, 0x0e, 0xd8, 0x07, 0x1c, 0x7b, 0x9c, 0x72, 0xae, 0x6f,
+- 0x6d, 0x10, 0xee, 0xc5, 0x3f, 0x4d, 0xd9, 0x8f, 0x4f, 0x92, 0x7b, 0xe9,
+- 0xce, 0x9e, 0xf0, 0x37, 0x0a, 0xe5, 0xbe, 0x94, 0xf6, 0x4e, 0x97, 0x37,
+- 0xcd, 0xd8, 0x8e, 0x04, 0x76, 0x7c, 0xa6, 0x97, 0xb1, 0x8d, 0xf5, 0xd7,
+- 0x76, 0xab, 0x3b, 0xd8, 0x69, 0x05, 0xc8, 0xbb, 0xaa, 0x95, 0xad, 0x39,
+- 0xe9, 0x69, 0x48, 0x2c, 0x97, 0xb8, 0x70, 0x41, 0xea, 0xbc, 0xbb, 0x59,
+- 0x1f, 0x2c, 0x0f, 0x20, 0xdc, 0x8f, 0x89, 0xc2, 0xef, 0x2a, 0xe9, 0x88,
+- 0xec, 0x4d, 0x4b, 0x5e, 0x01, 0x73, 0x5e, 0x0f, 0xaa, 0xe9, 0x4b, 0x11,
+- 0xd3, 0x30, 0x4f, 0x36, 0xd8, 0x20, 0x47, 0x09, 0x2c, 0x35, 0xd3, 0xe6,
+- 0xee, 0x06, 0x2f, 0x8e, 0x39, 0xfc, 0x4b, 0x9b, 0xe1, 0xef, 0x94, 0xc4,
+- 0xcc, 0x1d, 0x39, 0xc9, 0x63, 0xa4, 0x90, 0xfa, 0x08, 0xfe, 0x31, 0x55,
+- 0x1c, 0x5a, 0x82, 0xf4, 0xfd, 0x4b, 0x20, 0xf5, 0xc4, 0x04, 0xfe, 0x4a,
+- 0x8f, 0x06, 0xfa, 0x0a, 0x3e, 0xa5, 0xcb, 0x9a, 0x0b, 0xee, 0xb4, 0xc2,
+- 0x08, 0xb1, 0x1e, 0xeb, 0xf6, 0xc6, 0x59, 0x5f, 0x88, 0x1d, 0x03, 0x6d,
+- 0xb7, 0xe4, 0xfb, 0x82, 0x1d, 0x96, 0x8b, 0x85, 0x2b, 0x67, 0x02, 0xc1,
+- 0x6d, 0xd3, 0xf1, 0xe8, 0x84, 0xc3, 0xc5, 0x42, 0x6d, 0xf1, 0xbc, 0x6d,
+- 0xbf, 0x61, 0x14, 0xaf, 0x56, 0x3a, 0xdf, 0x8d, 0xb6, 0x64, 0xbe, 0x19,
+- 0xf7, 0x90, 0x3f, 0xb5, 0x4f, 0x37, 0xc3, 0x98, 0x06, 0x4e, 0x1c, 0x8f,
+- 0x62, 0x6d, 0x4e, 0x3b, 0x3d, 0xec, 0xed, 0xc3, 0xd4, 0x7c, 0x27, 0x72,
+- 0x85, 0xe0, 0x62, 0xcc, 0x43, 0x5e, 0x9d, 0xf2, 0x60, 0x97, 0x71, 0x5c,
+- 0x29, 0x2e, 0x53, 0x70, 0x17, 0x11, 0xbc, 0xdf, 0xe1, 0x13, 0x73, 0xac,
+- 0x47, 0x15, 0xdc, 0xe4, 0xe0, 0x6e, 0x4b, 0xdb, 0x5a, 0xf2, 0xed, 0x3b,
+- 0xc9, 0x07, 0x77, 0x11, 0x57, 0x12, 0xeb, 0x6c, 0xbc, 0x99, 0xca, 0xf4,
+- 0xd7, 0x40, 0xeb, 0x39, 0xcc, 0x1a, 0xa8, 0x47, 0x71, 0xf9, 0x5d, 0xd3,
+- 0x9c, 0xcb, 0x09, 0x57, 0xcd, 0xb5, 0x90, 0x37, 0xb2, 0xae, 0x49, 0x69,
+- 0x31, 0x8f, 0x47, 0xc5, 0x94, 0x33, 0x46, 0xac, 0xcd, 0x98, 0xab, 0x60,
+- 0xbe, 0xeb, 0xc5, 0xd3, 0x8e, 0xfc, 0x49, 0xca, 0x77, 0x37, 0xbe, 0x66,
+- 0xf5, 0x05, 0xfb, 0x2c, 0xd9, 0xbf, 0x8c, 0x27, 0xaf, 0x7a, 0x4d, 0xf2,
+- 0xd7, 0x78, 0xac, 0xce, 0xfb, 0x05, 0x25, 0xe3, 0x6b, 0x6a, 0x9d, 0x83,
+- 0xa9, 0x5c, 0x2a, 0x71, 0x36, 0xd1, 0x2f, 0x41, 0x8e, 0xd5, 0x7e, 0x3c,
+- 0xb8, 0x98, 0x86, 0xdb, 0xb3, 0xd9, 0x66, 0xfc, 0x2f, 0x14, 0x23, 0xda,
+- 0x44, 0x9a, 0x18, 0xb0, 0x85, 0x98, 0xdb, 0xdf, 0xeb, 0xe3, 0x7d, 0xe9,
+- 0x79, 0xa9, 0x6d, 0xe3, 0x59, 0x14, 0x83, 0x66, 0x22, 0x73, 0x94, 0x9e,
+- 0xd3, 0x53, 0x90, 0xfd, 0x8d, 0x00, 0x1e, 0x60, 0xed, 0x94, 0x2e, 0xed,
+- 0xfd, 0x6c, 0x9d, 0x76, 0xf7, 0xb3, 0x0e, 0xcf, 0xfb, 0xc2, 0xdd, 0x56,
+- 0x0b, 0xf3, 0xbd, 0xef, 0x86, 0xb1, 0x13, 0x13, 0x2b, 0x3d, 0x1e, 0xac,
+- 0x5e, 0xb7, 0x47, 0x99, 0x59, 0x56, 0xce, 0xad, 0x51, 0x27, 0x1f, 0x56,
+- 0x50, 0xcf, 0xf3, 0x27, 0x65, 0x8e, 0xcf, 0xb5, 0x8d, 0x9f, 0x94, 0x5c,
+- 0xab, 0xb6, 0x6d, 0xb2, 0xb4, 0x3e, 0xa9, 0xfd, 0xa2, 0xb4, 0x53, 0x94,
+- 0xba, 0xad, 0x30, 0xd7, 0xb4, 0xd9, 0xd3, 0x5a, 0x74, 0x40, 0x49, 0x93,
+- 0xf7, 0x69, 0xc9, 0x5b, 0xbc, 0x1e, 0x3c, 0xa2, 0x6b, 0x83, 0xd2, 0x13,
+- 0x7c, 0x19, 0x2e, 0x07, 0x6e, 0x9a, 0x1b, 0x60, 0x5e, 0x73, 0x6d, 0xeb,
+- 0xf6, 0x07, 0xeb, 0xdb, 0x9a, 0x1d, 0x5e, 0x6c, 0xdb, 0x97, 0x53, 0xdd,
+- 0xe4, 0x0c, 0xc2, 0x8b, 0xe5, 0xfa, 0xea, 0xb6, 0xc6, 0x99, 0x00, 0x65,
+- 0x53, 0xf0, 0x3e, 0x73, 0xd2, 0x44, 0xa1, 0x2c, 0xa3, 0xcb, 0x99, 0x77,
+- 0x90, 0x33, 0x57, 0x99, 0x5a, 0x6b, 0x17, 0x39, 0xb3, 0x9e, 0x2a, 0xd6,
+- 0xf9, 0xd0, 0x8b, 0xa7, 0xac, 0x66, 0x39, 0xe3, 0xe4, 0xf0, 0xe6, 0x2b,
+- 0x27, 0xb5, 0xb4, 0x70, 0xe6, 0x1f, 0x18, 0xc0, 0x3d, 0xe4, 0xcc, 0x57,
+- 0xb3, 0x3e, 0xec, 0x21, 0x67, 0x5e, 0xcc, 0x06, 0xd0, 0x47, 0xce, 0xfc,
+- 0x11, 0xf9, 0xd5, 0xbb, 0xa9, 0x2b, 0x78, 0xb4, 0xd4, 0x07, 0xdb, 0x9b,
+- 0xf4, 0xd0, 0xaf, 0x85, 0x37, 0xff, 0xbc, 0xc4, 0x9b, 0xe7, 0xff, 0x05,
+- 0x6f, 0xde, 0x4a, 0x3e, 0xd8, 0x9d, 0x13, 0x4e, 0xb0, 0x92, 0x9c, 0xc0,
+- 0xc6, 0xcb, 0xa5, 0x1e, 0xd8, 0x0a, 0xe6, 0xb3, 0xa7, 0x53, 0x7d, 0xc8,
+- 0x4e, 0x63, 0x79, 0x8d, 0xd3, 0x77, 0x12, 0x99, 0x34, 0xe3, 0xb2, 0x92,
+- 0xe8, 0xec, 0x43, 0x82, 0xf5, 0xb1, 0x96, 0xbc, 0xe8, 0xf6, 0xc0, 0x16,
+- 0xdf, 0x85, 0xf4, 0x88, 0x7c, 0xa8, 0x59, 0x00, 0x56, 0xdc, 0xd0, 0x03,
+- 0xab, 0x49, 0xe0, 0x4f, 0xeb, 0x20, 0xfb, 0x9a, 0x0c, 0xb3, 0x85, 0x66,
+- 0xc6, 0xa7, 0x82, 0x23, 0x89, 0x10, 0xba, 0x8f, 0x93, 0xf3, 0x38, 0x3d,
+- 0x30, 0x7b, 0xe4, 0x3b, 0x46, 0x1f, 0x8e, 0xce, 0xbb, 0x3d, 0xb0, 0xed,
+- 0xe4, 0x6e, 0xbe, 0x44, 0x04, 0x95, 0x0b, 0x3e, 0xbc, 0x40, 0xee, 0xbc,
+- 0x95, 0xeb, 0x7c, 0xa6, 0xd4, 0x07, 0x5b, 0xc1, 0x18, 0xb1, 0x73, 0x2a,
+- 0x66, 0x16, 0xf0, 0x86, 0x17, 0xb8, 0xb8, 0xc2, 0xe9, 0xed, 0x4b, 0xff,
+- 0x3f, 0x84, 0x73, 0x0e, 0x77, 0x0e, 0x2e, 0x66, 0x14, 0x57, 0xb7, 0x0a,
+- 0xae, 0x89, 0xac, 0xab, 0x87, 0xeb, 0xda, 0x7e, 0x52, 0xeb, 0x7c, 0x85,
+- 0xb6, 0x68, 0x4a, 0xbc, 0xea, 0xac, 0xc7, 0x40, 0x4a, 0x6a, 0xd9, 0x40,
+- 0x5b, 0xc0, 0x39, 0x0f, 0xa5, 0xb6, 0xfd, 0x28, 0x1b, 0xef, 0xa9, 0x2c,
+- 0xc5, 0xe3, 0xaa, 0x7c, 0x05, 0xd2, 0x25, 0x1f, 0x09, 0xd0, 0xa7, 0x03,
+- 0x93, 0x69, 0x54, 0x6d, 0x70, 0xfd, 0x7b, 0x55, 0x7e, 0x9c, 0xbc, 0xb5,
+- 0x53, 0xea, 0xe8, 0xf0, 0x76, 0xab, 0x13, 0x53, 0x56, 0x0c, 0x95, 0xe7,
+- 0x4a, 0x7b, 0xa6, 0xe7, 0xe4, 0xec, 0x5c, 0x7d, 0x9b, 0xfa, 0xd5, 0x32,
+- 0x1f, 0x4c, 0x93, 0xe3, 0x44, 0x02, 0x77, 0x14, 0x84, 0x2b, 0xf6, 0xe0,
+- 0xa8, 0xa5, 0x45, 0xbf, 0x87, 0xf8, 0xd0, 0xfd, 0xb4, 0x51, 0xb1, 0xee,
+- 0x7a, 0xbf, 0x69, 0x40, 0xfa, 0x51, 0x9f, 0xe9, 0x37, 0x0d, 0xe7, 0xf0,
+- 0x8b, 0xba, 0x96, 0x4a, 0x78, 0xd6, 0xfa, 0xc9, 0xe7, 0xb5, 0xe8, 0xd3,
+- 0x78, 0x02, 0x23, 0xb9, 0x9f, 0x2b, 0x21, 0xdd, 0x37, 0xf8, 0x13, 0xaf,
+- 0x16, 0x9d, 0x53, 0x42, 0x7c, 0xf7, 0xee, 0x60, 0x97, 0x75, 0x37, 0x71,
+- 0x27, 0x9e, 0xec, 0x54, 0xbc, 0x98, 0x89, 0x3a, 0x5c, 0x34, 0xd8, 0xc3,
+- 0x6b, 0x53, 0x85, 0x32, 0xa7, 0x71, 0x6b, 0xfe, 0xed, 0xc7, 0x5d, 0xfc,
+- 0x88, 0xe7, 0x83, 0x8b, 0x97, 0xe0, 0xea, 0x56, 0x4d, 0x5d, 0x1f, 0x9c,
+- 0x54, 0xed, 0xfe, 0x65, 0x12, 0xc3, 0x3a, 0xf6, 0xd0, 0xf7, 0xee, 0x99,
+- 0x1e, 0xa0, 0x9c, 0xc2, 0xa5, 0x57, 0x10, 0xa7, 0xfa, 0x30, 0x4e, 0x9c,
+- 0xb1, 0x28, 0x5f, 0x8e, 0x35, 0xe4, 0xe2, 0xfa, 0x8c, 0x3d, 0xb9, 0x41,
+- 0x37, 0x56, 0x7b, 0x8b, 0x4b, 0xa2, 0xe4, 0x36, 0xeb, 0x98, 0xb7, 0xdb,
+- 0x0b, 0xcd, 0xb8, 0x7c, 0x46, 0x67, 0x7d, 0xdb, 0x41, 0xee, 0xde, 0x83,
+- 0x87, 0xa9, 0xcf, 0xa3, 0x85, 0xc7, 0x91, 0xfe, 0x92, 0x0f, 0x87, 0x8f,
+- 0xa7, 0xb1, 0x6a, 0x5d, 0x0a, 0xe9, 0x2f, 0x06, 0x88, 0x53, 0x21, 0x4c,
+- 0x30, 0x16, 0xa1, 0xb8, 0x7e, 0x2e, 0xe7, 0x7f, 0xfe, 0x82, 0x36, 0xfb,
+- 0x26, 0xed, 0xf7, 0x8d, 0x6b, 0x7b, 0x00, 0x65, 0xfe, 0x7d, 0x9d, 0xab,
+- 0x7a, 0xb9, 0x86, 0xfb, 0x9c, 0xd8, 0x8c, 0x32, 0x36, 0x75, 0x5c, 0x2d,
+- 0xf5, 0x12, 0x17, 0x4f, 0x6a, 0x8b, 0xf7, 0x22, 0x3e, 0x7c, 0xd9, 0x8b,
+- 0x81, 0x3a, 0xfa, 0x5d, 0x94, 0x5c, 0xf5, 0xc3, 0x44, 0xc2, 0x38, 0x47,
+- 0xae, 0x3a, 0xba, 0xc1, 0xe5, 0xaa, 0x9e, 0x05, 0x15, 0x15, 0x0b, 0xac,
+- 0x65, 0x9d, 0x5e, 0xe2, 0x37, 0x83, 0x6e, 0x2f, 0x51, 0xf8, 0x4d, 0xab,
+- 0x9c, 0x75, 0xba, 0x8d, 0xb5, 0x5c, 0xfa, 0x0a, 0x32, 0xe8, 0x2c, 0xcc,
+- 0x04, 0xef, 0x21, 0x36, 0xf7, 0x49, 0x6f, 0xa4, 0x10, 0x09, 0xdf, 0x43,
+- 0xde, 0xf5, 0x2d, 0xae, 0xaf, 0xec, 0xed, 0xf6, 0x15, 0x56, 0xf3, 0xbd,
+- 0x28, 0x3f, 0x05, 0x57, 0x45, 0xf6, 0x1b, 0xf5, 0xe8, 0xa9, 0x92, 0xbd,
+- 0x86, 0x97, 0xa9, 0x43, 0xff, 0xdc, 0x4a, 0x3c, 0x3a, 0xe7, 0xaf, 0x12,
+- 0xc2, 0xff, 0x68, 0xde, 0xc5, 0xb6, 0x58, 0xfe, 0xae, 0xa0, 0xf0, 0xc9,
+- 0xf6, 0xe3, 0xee, 0x77, 0xfd, 0x86, 0xef, 0x65, 0xfd, 0x56, 0x50, 0x3f,
+- 0x7b, 0x5a, 0xea, 0xa2, 0x68, 0xdb, 0x19, 0xea, 0xb7, 0x78, 0xd2, 0x89,
+- 0x2f, 0xd6, 0x98, 0xf1, 0xe1, 0x84, 0x57, 0xf4, 0xfa, 0x99, 0xe8, 0x45,
+- 0xae, 0xc2, 0x78, 0xe1, 0xb8, 0x1e, 0x3d, 0xe2, 0xe8, 0xe5, 0xea, 0xe3,
+- 0xf6, 0x69, 0xaf, 0x9c, 0x4c, 0xde, 0xd8, 0x17, 0xd5, 0xc9, 0x97, 0x3f,
+- 0x61, 0x6c, 0x3c, 0x71, 0x98, 0x9c, 0xf9, 0x2a, 0x6b, 0x4a, 0x3f, 0x9f,
+- 0xaf, 0x73, 0x9e, 0x97, 0x3e, 0xad, 0xe7, 0x1a, 0x67, 0x5e, 0xbc, 0xfe,
+- 0x4e, 0x89, 0x2f, 0x4b, 0x4f, 0x5a, 0x9e, 0x53, 0x1d, 0x3b, 0xed, 0x76,
+- 0x78, 0xa0, 0x70, 0x2b, 0x1b, 0x1d, 0xeb, 0xfe, 0xad, 0x35, 0x0b, 0x2e,
+- 0xce, 0x38, 0x6e, 0xd5, 0x55, 0x25, 0x7b, 0xe1, 0xab, 0xd6, 0x3d, 0x68,
+- 0xbb, 0xfe, 0x1c, 0x09, 0xef, 0x62, 0x9c, 0x7c, 0x85, 0xef, 0xec, 0x3a,
+- 0x57, 0x1f, 0xbe, 0xcb, 0x6a, 0x71, 0x6c, 0x74, 0xd7, 0xb9, 0x28, 0x46,
+- 0x2d, 0xe9, 0xeb, 0x43, 0xf1, 0x99, 0x87, 0xb1, 0x7d, 0x2a, 0x86, 0x77,
+- 0x8d, 0x60, 0xe9, 0xec, 0x89, 0xc4, 0xa4, 0xc1, 0x98, 0x8c, 0xd0, 0x77,
+- 0xe3, 0xb1, 0x77, 0xc9, 0x51, 0x33, 0x3e, 0xe0, 0x68, 0x8e, 0xb8, 0x46,
+- 0xde, 0x08, 0xc5, 0x3d, 0xbb, 0xe9, 0xbe, 0x5b, 0xfe, 0xbb, 0x1a, 0xb1,
+- 0x25, 0xf1, 0xd6, 0xfd, 0xa8, 0x47, 0x96, 0xd8, 0x1f, 0xd4, 0xff, 0x1a,
+- 0xc7, 0x4e, 0x78, 0x98, 0x1f, 0x08, 0x4e, 0x77, 0x1a, 0xfc, 0xde, 0x34,
+- 0xf8, 0x01, 0xfe, 0xd1, 0x9e, 0x91, 0xf3, 0x51, 0x8a, 0x9c, 0xc5, 0xf8,
+- 0xc4, 0xae, 0xd3, 0xf5, 0xe2, 0xb7, 0xa0, 0x0f, 0x5f, 0x45, 0xd3, 0xd0,
+- 0x22, 0x7e, 0x6c, 0x17, 0x79, 0xef, 0x7d, 0xc6, 0xd1, 0x2b, 0x46, 0x3c,
+- 0xea, 0xa1, 0xf0, 0xc5, 0x88, 0x17, 0xf7, 0x1b, 0xb2, 0xa7, 0xa4, 0x0d,
+- 0x3d, 0x0f, 0x6d, 0xf0, 0xbc, 0x22, 0x67, 0x6a, 0x2e, 0xd9, 0x99, 0x25,
+- 0x32, 0xaf, 0x82, 0xb5, 0xab, 0x9b, 0x3a, 0x2b, 0xa0, 0xb5, 0xfa, 0x15,
+- 0xdd, 0xf8, 0x40, 0xf9, 0x7b, 0xbb, 0x18, 0xf9, 0xc4, 0xbe, 0xac, 0x97,
+- 0xc7, 0xd5, 0x62, 0x01, 0x6f, 0x59, 0xb6, 0x7a, 0x1c, 0xb3, 0x64, 0x2f,
+- 0xee, 0xaf, 0xf1, 0xc0, 0x09, 0x1f, 0x3a, 0x52, 0x3f, 0xb1, 0x33, 0x11,
+- 0x19, 0xf3, 0x13, 0xda, 0x42, 0xc6, 0x77, 0xfb, 0xd5, 0x2f, 0x17, 0xa0,
+- 0x6c, 0xb3, 0x84, 0x33, 0x8b, 0x5f, 0x4c, 0xc1, 0xb6, 0xa4, 0x87, 0x68,
+- 0xe3, 0x8e, 0xd4, 0x08, 0xde, 0x4f, 0xa5, 0xff, 0x63, 0x00, 0xda, 0x85,
+- 0x2b, 0x5e, 0xad, 0xd8, 0xec, 0x8d, 0x29, 0xc1, 0x46, 0x7d, 0xa8, 0xd1,
+- 0xdd, 0x9f, 0x67, 0xfd, 0x14, 0x0a, 0xec, 0x2a, 0x48, 0x9d, 0x39, 0x85,
+- 0x85, 0xc9, 0x0c, 0x7c, 0xe4, 0x77, 0xa3, 0x2d, 0x5a, 0xdf, 0x73, 0x8a,
+- 0x16, 0x3d, 0xa0, 0xc4, 0x94, 0x7b, 0xf5, 0x61, 0xbc, 0x60, 0x24, 0xd2,
+- 0xed, 0x4a, 0x7d, 0xa0, 0xb3, 0x50, 0x1e, 0xbb, 0x83, 0xb8, 0xa1, 0x15,
+- 0xaf, 0x78, 0x2b, 0x51, 0xb7, 0x5e, 0xef, 0xac, 0xf4, 0x6a, 0xc3, 0x5f,
+- 0x60, 0x1d, 0xb0, 0xa3, 0x50, 0x0c, 0x7e, 0x90, 0xf0, 0x60, 0x8d, 0xb3,
+- 0x87, 0x90, 0x2d, 0xf5, 0x47, 0xa7, 0xd0, 0x35, 0x69, 0x6f, 0xbe, 0x98,
+- 0xd2, 0xa2, 0xcf, 0x29, 0x99, 0x3d, 0x21, 0xf2, 0x9a, 0x07, 0xa1, 0xc7,
+- 0xe6, 0x19, 0xc7, 0x1d, 0x05, 0x0f, 0x56, 0x3a, 0x7e, 0x9c, 0xe5, 0x98,
+- 0x87, 0x51, 0x79, 0xc2, 0xde, 0xbc, 0xc7, 0xd0, 0x86, 0xaf, 0x78, 0x33,
+- 0xff, 0xb5, 0x8e, 0x76, 0xdb, 0xa6, 0x68, 0xac, 0x4f, 0x47, 0x70, 0x91,
+- 0x3a, 0x7c, 0x3d, 0xa5, 0x25, 0xff, 0x4c, 0xd1, 0x7a, 0xbe, 0x4c, 0x5f,
+- 0xf6, 0x9a, 0x61, 0xca, 0xa9, 0x25, 0x67, 0x21, 0xbd, 0xf3, 0x18, 0xae,
+- 0x18, 0x99, 0xe0, 0xf6, 0xc6, 0x24, 0xf9, 0x59, 0x94, 0xf9, 0x30, 0x86,
+- 0xa3, 0xe4, 0x77, 0x87, 0x0b, 0x15, 0x28, 0xaa, 0x3a, 0xf9, 0x59, 0x0f,
+- 0x3c, 0x93, 0x21, 0x65, 0x2e, 0x1b, 0x37, 0x3a, 0xf0, 0x47, 0x28, 0x3a,
+- 0x38, 0x77, 0x18, 0xa1, 0x13, 0x3f, 0xb0, 0x6b, 0x74, 0xbd, 0x75, 0x52,
+- 0xe1, 0xbc, 0xcf, 0x44, 0x69, 0x63, 0xbe, 0x27, 0xe7, 0x4e, 0xac, 0x6e,
+- 0xdc, 0x3b, 0x19, 0xe1, 0xfb, 0x35, 0x58, 0x7b, 0x22, 0x86, 0x0f, 0x53,
+- 0x37, 0xa3, 0xe8, 0x70, 0x04, 0x85, 0x7e, 0x40, 0x3f, 0x62, 0xad, 0x95,
+- 0x21, 0x8f, 0x94, 0x7d, 0xa3, 0xc3, 0x96, 0xd4, 0xe8, 0x3e, 0x7e, 0x0f,
+- 0xf1, 0x57, 0xec, 0xf9, 0x39, 0x72, 0x1d, 0xf9, 0x5c, 0xd3, 0x16, 0x9b,
+- 0xfb, 0x5e, 0x95, 0xb3, 0x7f, 0x89, 0x18, 0x9f, 0x53, 0x9d, 0xde, 0xe0,
+- 0x28, 0xc7, 0x3c, 0x3b, 0x25, 0xb5, 0x5b, 0xfb, 0xa6, 0x40, 0x69, 0x7f,
+- 0xfd, 0x87, 0x86, 0x07, 0x9b, 0x59, 0xdf, 0x47, 0x75, 0x39, 0x9b, 0x39,
+- 0xaa, 0xd5, 0x61, 0x13, 0x4e, 0xab, 0x2c, 0xc4, 0xf5, 0xff, 0x80, 0x09,
+- 0x35, 0x49, 0xac, 0xd1, 0xf1, 0x5e, 0xf6, 0x37, 0x58, 0xf3, 0xd4, 0xcb,
+- 0xd9, 0x1b, 0xac, 0x3c, 0xe1, 0xe7, 0x9c, 0x9b, 0xc9, 0x75, 0xb6, 0xe3,
+- 0xbb, 0xaa, 0x5b, 0x6f, 0x10, 0x8f, 0x30, 0x3e, 0x1b, 0x22, 0x1f, 0x0d,
+- 0xf0, 0xf7, 0x46, 0xd9, 0x7e, 0x9d, 0x4c, 0xa2, 0xcb, 0xbf, 0x25, 0x53,
+- 0x80, 0x7c, 0x80, 0x78, 0x99, 0x7d, 0x0d, 0x1f, 0x72, 0xec, 0xcc, 0xac,
+- 0x3b, 0xe6, 0xf1, 0x82, 0x8c, 0x2b, 0xf3, 0xc5, 0x99, 0x37, 0x65, 0xfc,
+- 0x90, 0x9c, 0xbf, 0xfd, 0x77, 0xce, 0x41, 0x86, 0x77, 0x82, 0x35, 0xb2,
+- 0xd1, 0x88, 0x0e, 0x95, 0xeb, 0x65, 0xc9, 0x1c, 0x1a, 0xeb, 0x51, 0x79,
+- 0x37, 0x8a, 0x35, 0x93, 0xf6, 0x48, 0xd4, 0x94, 0xeb, 0xb6, 0x5d, 0xbb,
+- 0x51, 0x8f, 0xbe, 0xad, 0xf8, 0x98, 0xf3, 0x7c, 0xb4, 0xc1, 0x38, 0xce,
+- 0x66, 0x9b, 0x2e, 0xbc, 0x4f, 0x0e, 0x15, 0x63, 0xbd, 0x77, 0xc9, 0x3b,
+- 0x8e, 0xb9, 0xec, 0xb1, 0x6a, 0xe9, 0x13, 0x30, 0x0f, 0x2a, 0xb3, 0xd9,
+- 0xfb, 0xab, 0x05, 0xab, 0xc6, 0xe8, 0x0b, 0xcd, 0x93, 0x22, 0xab, 0x3d,
+- 0x52, 0xc3, 0x71, 0x8e, 0x72, 0x9c, 0xd9, 0x0d, 0x7a, 0xdf, 0x98, 0x22,
+- 0x36, 0x0b, 0xe1, 0x58, 0xe1, 0xa2, 0xf4, 0xd0, 0x68, 0xb7, 0x69, 0x3e,
+- 0x2f, 0x76, 0x8b, 0xe0, 0xbb, 0xa5, 0x71, 0x9e, 0x2a, 0x5c, 0xc0, 0x6c,
+- 0xf6, 0x2d, 0xe7, 0xef, 0x31, 0xd6, 0x0d, 0xe3, 0xac, 0x21, 0xf3, 0xc4,
+- 0x93, 0xc9, 0x6c, 0x53, 0xdf, 0x24, 0xe5, 0x70, 0xcf, 0xca, 0x0d, 0xe0,
+- 0xd9, 0xd2, 0x33, 0xa3, 0x7c, 0x77, 0xf4, 0xda, 0xdf, 0x62, 0x23, 0x77,
+- 0x0f, 0xdf, 0xdd, 0x53, 0xa8, 0xe4, 0xda, 0xb9, 0xb5, 0xf8, 0x11, 0xcb,
+- 0x2f, 0x7d, 0x70, 0xbc, 0x36, 0xb5, 0x19, 0x63, 0xc6, 0x5f, 0x62, 0x2f,
+- 0xf5, 0x1e, 0xa7, 0x3d, 0x4f, 0x58, 0xce, 0x5e, 0xbd, 0x9c, 0xcb, 0x22,
+- 0x96, 0x87, 0xda, 0xce, 0x90, 0x93, 0x1d, 0x63, 0xcc, 0xdc, 0x97, 0x6a,
+- 0xea, 0x79, 0x9d, 0x7e, 0x97, 0xfe, 0xa2, 0xec, 0x87, 0x03, 0x93, 0xb9,
+- 0x47, 0x31, 0xb3, 0xa4, 0x69, 0xf1, 0x45, 0x62, 0xc2, 0x69, 0xe2, 0x94,
+- 0x8f, 0x98, 0x50, 0x9b, 0xf3, 0x94, 0xf6, 0x77, 0x0d, 0x7e, 0x6f, 0xba,
+- 0x30, 0x87, 0xbf, 0xa1, 0x5d, 0x44, 0xbe, 0x78, 0x72, 0x0e, 0xf2, 0xac,
+- 0xdb, 0x83, 0xd5, 0xe7, 0x06, 0x71, 0xe9, 0x66, 0xb7, 0x8f, 0xe6, 0x65,
+- 0xee, 0xde, 0x97, 0x6d, 0x52, 0xc7, 0x64, 0xec, 0x5e, 0x2d, 0x9a, 0xe1,
+- 0x5a, 0x4d, 0x38, 0x1c, 0x5c, 0x65, 0x8e, 0x97, 0x73, 0x58, 0x35, 0xf0,
+- 0xd1, 0xf7, 0xc7, 0x0c, 0x39, 0xbf, 0x10, 0x0d, 0xef, 0xe0, 0x1a, 0x8e,
+- 0x59, 0x4d, 0xad, 0x71, 0x65, 0x0f, 0xca, 0xfc, 0xdb, 0xe5, 0xd4, 0x5a,
+- 0xdf, 0x51, 0x34, 0xf5, 0x3c, 0x88, 0x2f, 0x21, 0xbd, 0xa4, 0xa9, 0x7f,
+- 0x0a, 0x71, 0xe3, 0x7e, 0xc8, 0x39, 0x4e, 0x77, 0xac, 0x86, 0x3c, 0x33,
+- 0xc9, 0xd2, 0x4f, 0xec, 0x15, 0xfa, 0x53, 0x98, 0x22, 0x77, 0x6c, 0x5c,
+- 0xa7, 0x5f, 0xf8, 0x5a, 0xe9, 0x9e, 0xbb, 0x4f, 0x24, 0xfe, 0x12, 0xa0,
+- 0x0d, 0x2a, 0xe1, 0x5b, 0x5a, 0xcf, 0x39, 0x68, 0x0b, 0xe7, 0x8c, 0xef,
+- 0x45, 0x1c, 0xa4, 0xbf, 0x4d, 0x15, 0x14, 0x18, 0x0d, 0x17, 0x31, 0x24,
+- 0xb9, 0x8b, 0xef, 0xb4, 0x67, 0x43, 0xe4, 0xb2, 0x51, 0x54, 0xea, 0xf1,
+- 0xd8, 0x28, 0xf5, 0x6b, 0x27, 0x96, 0x8f, 0x13, 0x43, 0x32, 0x6a, 0xc8,
+- 0x39, 0x77, 0x5a, 0xa9, 0x47, 0x9d, 0xff, 0x15, 0x90, 0x5a, 0xa8, 0x71,
+- 0x46, 0xf6, 0xa8, 0x0f, 0xe3, 0xe2, 0x54, 0x11, 0xc7, 0x52, 0x69, 0xec,
+- 0x5f, 0xa2, 0x62, 0xd2, 0x5a, 0xe6, 0xf4, 0x0e, 0xa4, 0xe6, 0xea, 0xca,
+- 0x1d, 0x72, 0xfa, 0x91, 0x5b, 0x53, 0x9e, 0x06, 0x39, 0xa7, 0x31, 0xcb,
+- 0xda, 0x6b, 0xca, 0x18, 0xc1, 0x41, 0xe3, 0xcb, 0x30, 0x96, 0x0a, 0x76,
+- 0x8e, 0xe1, 0xd5, 0x19, 0xc9, 0x71, 0xc9, 0xb6, 0x5b, 0x26, 0xc5, 0x3e,
+- 0x1e, 0x72, 0xdf, 0x00, 0x9a, 0x1d, 0x2e, 0xf7, 0x50, 0xdb, 0xea, 0x19,
+- 0x97, 0xd3, 0x35, 0xe7, 0xe5, 0xac, 0x74, 0x0d, 0xc2, 0xb4, 0xd7, 0xf9,
+- 0x94, 0x9f, 0x98, 0x23, 0xf6, 0x94, 0x33, 0x7a, 0xae, 0x9e, 0xc9, 0xbc,
+- 0x82, 0xb1, 0x96, 0x1b, 0xf7, 0x58, 0xe4, 0xff, 0x06, 0xae, 0x9d, 0x1b,
+- 0x2c, 0xf5, 0xc7, 0xff, 0xcc, 0xbe, 0x74, 0x93, 0xe8, 0xbd, 0x22, 0x44,
+- 0x4c, 0x8f, 0xcd, 0x5c, 0xb3, 0xaf, 0xd8, 0xf4, 0x9c, 0xe4, 0x0c, 0xc7,
+- 0xe6, 0x6e, 0xcf, 0x4d, 0x1b, 0xba, 0xac, 0x34, 0x31, 0x9f, 0xd0, 0xaf,
+- 0x96, 0xd0, 0xdf, 0x9a, 0xd1, 0xbf, 0xc2, 0xf4, 0xf5, 0x5e, 0xb5, 0x36,
+- 0xa3, 0x75, 0xfd, 0x7b, 0x36, 0x6e, 0x6e, 0x87, 0x57, 0x97, 0xeb, 0x33,
+- 0x76, 0x5a, 0x95, 0xbf, 0xff, 0x24, 0x24, 0xb9, 0xfe, 0x65, 0xab, 0x68,
+- 0xaf, 0x5e, 0xe6, 0x72, 0xc4, 0x1f, 0x64, 0x65, 0xdf, 0x2b, 0x63, 0xb3,
+- 0xde, 0xbe, 0xf0, 0xae, 0xf7, 0x10, 0xbe, 0x9f, 0x3f, 0x8c, 0x77, 0xa6,
+- 0x7c, 0x08, 0xeb, 0xa2, 0xcb, 0x66, 0xd4, 0xae, 0x4f, 0xa4, 0xdf, 0x23,
+- 0x2e, 0x5e, 0x98, 0x29, 0xfb, 0xc5, 0x43, 0x6d, 0x6b, 0x66, 0x14, 0x8e,
+- 0x55, 0x83, 0x0a, 0xea, 0xf9, 0x1d, 0xc3, 0x8b, 0x58, 0x89, 0xe3, 0x7a,
+- 0x29, 0xa7, 0x9c, 0x7b, 0x10, 0xee, 0x1b, 0xcf, 0x1f, 0x0a, 0xb9, 0x3d,
+- 0xb0, 0x10, 0x71, 0x74, 0x1c, 0x13, 0xd9, 0xa6, 0xe4, 0xfb, 0x72, 0x0e,
+- 0x87, 0x35, 0xd9, 0x25, 0x8c, 0xe3, 0x44, 0xb6, 0x8c, 0xa1, 0x51, 0x39,
+- 0x97, 0x9a, 0x8c, 0x79, 0x5c, 0x8c, 0x8c, 0x79, 0xb4, 0x4c, 0xcc, 0xe3,
+- 0x0f, 0x09, 0x77, 0x18, 0x2d, 0xc4, 0xa3, 0x95, 0xf0, 0xe2, 0x3e, 0xc3,
+- 0xf5, 0x8f, 0x86, 0x39, 0x3f, 0x62, 0x4b, 0x25, 0x2f, 0x4b, 0x4e, 0xf6,
+- 0x31, 0x27, 0x2f, 0x23, 0xbf, 0xf6, 0xe1, 0x4d, 0x5d, 0xec, 0xb1, 0xa6,
+- 0x6c, 0x0f, 0xe3, 0x1c, 0x1e, 0xb6, 0x8b, 0x3d, 0xe2, 0x4b, 0x7e, 0x1c,
+- 0x6e, 0x9e, 0xb5, 0x67, 0x22, 0xa2, 0xbb, 0x17, 0xa7, 0x89, 0xaf, 0xb8,
+- 0x39, 0x1e, 0x3d, 0xcd, 0x9c, 0x3d, 0xa6, 0x97, 0x7d, 0xfc, 0xb7, 0x4b,
+- 0x72, 0xea, 0x7d, 0xf3, 0xb8, 0x9f, 0x7f, 0x37, 0x44, 0xf7, 0x2b, 0xee,
+- 0x7c, 0xab, 0xe7, 0xfe, 0x26, 0x54, 0xee, 0x9f, 0xca, 0xb3, 0xb1, 0xfc,
+- 0xe3, 0xfc, 0x2e, 0x63, 0x85, 0xe8, 0x9f, 0x95, 0xe8, 0x8f, 0xc8, 0xff,
+- 0x89, 0x88, 0x5d, 0x64, 0x3f, 0x11, 0xb4, 0x87, 0x8d, 0xd7, 0x68, 0x8f,
+- 0xc3, 0xd7, 0xce, 0x4c, 0xb9, 0xf8, 0x55, 0xc5, 0xeb, 0x3b, 0x52, 0xaf,
+- 0x6c, 0x0a, 0xe2, 0x17, 0xf6, 0xa5, 0x48, 0x94, 0x98, 0x50, 0xe6, 0xa1,
+- 0x62, 0x33, 0xc3, 0xb1, 0x99, 0x5b, 0x2b, 0x5e, 0xd3, 0xa3, 0x38, 0x40,
+- 0xbe, 0xbd, 0x90, 0x2d, 0x9f, 0x15, 0x89, 0x13, 0x6b, 0x3e, 0x8f, 0xfe,
+- 0x3a, 0x19, 0xaf, 0x9e, 0xfe, 0x95, 0xa4, 0x0d, 0xd4, 0xf0, 0xce, 0x69,
+- 0xa9, 0xb5, 0xc9, 0x8f, 0x27, 0xe3, 0xc6, 0x43, 0xe4, 0x91, 0x13, 0x93,
+- 0xb6, 0xfd, 0x96, 0x81, 0x3b, 0xc3, 0xcc, 0xef, 0x2f, 0x90, 0x4f, 0x90,
+- 0x6f, 0xc4, 0x2a, 0x95, 0xa6, 0xe8, 0x2a, 0xe6, 0xfa, 0x31, 0xd6, 0x0a,
+- 0x4f, 0x13, 0xe3, 0x4e, 0x2f, 0x54, 0xc1, 0x3a, 0x21, 0xfb, 0x82, 0x55,
+- 0x98, 0x7c, 0x26, 0x49, 0xd9, 0x97, 0x72, 0x9c, 0x00, 0xaa, 0xcf, 0xb4,
+- 0xa2, 0xea, 0x94, 0x82, 0x1d, 0x89, 0x56, 0x04, 0xcf, 0xd4, 0x30, 0xff,
+- 0x06, 0x70, 0xa5, 0x85, 0x6b, 0xfc, 0x4c, 0x59, 0x0f, 0x67, 0x8f, 0x14,
+- 0x4f, 0xe6, 0x62, 0xe4, 0xf1, 0x11, 0x2c, 0x58, 0xb2, 0x1f, 0x1c, 0x70,
+- 0xb0, 0xf4, 0xc2, 0x86, 0x7a, 0x67, 0xcf, 0xea, 0xc5, 0x82, 0x1e, 0x3d,
+- 0xab, 0xd4, 0xe0, 0xc7, 0x27, 0x8a, 0x37, 0x57, 0xc2, 0x7e, 0x79, 0x85,
+- 0x99, 0xe8, 0xdb, 0x4b, 0xff, 0x5f, 0xb3, 0x3a, 0xc2, 0xfa, 0xc6, 0xb6,
+- 0xaf, 0x6e, 0x94, 0x3a, 0xd8, 0x70, 0xea, 0x60, 0x77, 0x6f, 0x5f, 0x1f,
+- 0x7c, 0x4c, 0xc9, 0x6c, 0x0f, 0xc3, 0xfe, 0xa8, 0xd2, 0xb4, 0x3f, 0xf6,
+- 0x9b, 0x09, 0xbe, 0x2f, 0x7b, 0x7c, 0xb6, 0xfd, 0xc3, 0x16, 0xdb, 0xce,
+- 0xb7, 0xc4, 0xfb, 0x54, 0xaf, 0x8a, 0x33, 0x8d, 0xb2, 0x2f, 0xe8, 0xc1,
+- 0x8f, 0x13, 0x7a, 0x74, 0x2f, 0x64, 0x0f, 0x9e, 0x78, 0xbf, 0x4c, 0xce,
+- 0x18, 0xd6, 0x87, 0x3b, 0xad, 0xa5, 0x78, 0x61, 0x7e, 0x23, 0xfa, 0xfd,
+- 0x70, 0xce, 0xc5, 0xd8, 0x06, 0xde, 0x5e, 0x01, 0xc9, 0xe1, 0x89, 0xd6,
+- 0xc7, 0x10, 0xc1, 0x7c, 0xe1, 0x30, 0x1e, 0x39, 0x21, 0xf5, 0xd7, 0xea,
+- 0xb6, 0xc0, 0x09, 0xfb, 0x07, 0x51, 0xb3, 0x48, 0x8c, 0xb4, 0xed, 0xaa,
+- 0x8d, 0x4d, 0x51, 0xa6, 0x26, 0xf2, 0x8d, 0x18, 0x79, 0xb3, 0x3e, 0xf8,
+- 0x63, 0x2c, 0xc1, 0xd9, 0xd9, 0xf4, 0xcd, 0xe4, 0xf2, 0x9d, 0xcf, 0x2a,
+- 0xc2, 0xdb, 0x23, 0x78, 0xbe, 0x20, 0x9c, 0x65, 0x6d, 0x5b, 0xd7, 0x89,
+- 0xe5, 0x78, 0x79, 0x3e, 0x82, 0xb3, 0x96, 0x4e, 0xce, 0x04, 0xa5, 0xda,
+- 0xb4, 0x6b, 0x6b, 0x29, 0x6b, 0xb5, 0xd7, 0x8b, 0xed, 0x29, 0xa9, 0x19,
+- 0xf5, 0xc1, 0x90, 0x82, 0xe5, 0x95, 0xd0, 0x17, 0x1f, 0x06, 0x86, 0x82,
+- 0x66, 0xe2, 0xc2, 0xb3, 0x4a, 0xa2, 0xef, 0x03, 0x6f, 0x04, 0xdf, 0x22,
+- 0x16, 0x7d, 0xbd, 0x20, 0x67, 0xa5, 0x88, 0x37, 0xb3, 0x31, 0xae, 0x5b,
+- 0x00, 0x9e, 0x86, 0x1a, 0x1c, 0x61, 0xec, 0xbc, 0x66, 0x54, 0x10, 0xaf,
+- 0xe4, 0xec, 0x94, 0x60, 0x7d, 0xbd, 0x9c, 0x19, 0xb1, 0x5f, 0xd4, 0xdd,
+- 0x7a, 0xdf, 0x98, 0xbb, 0xf1, 0x4c, 0xb1, 0x4a, 0x8c, 0x6f, 0xea, 0x89,
+- 0x2a, 0x6f, 0xd8, 0xe9, 0x2f, 0x2a, 0xd4, 0xb3, 0xb7, 0x06, 0x55, 0x8e,
+- 0xae, 0x18, 0xcd, 0x95, 0xf3, 0x4b, 0xad, 0xd4, 0x77, 0x3d, 0x99, 0x92,
+- 0x3f, 0x56, 0x33, 0xee, 0x8f, 0x32, 0x5f, 0x57, 0x9e, 0x90, 0xbc, 0x42,
+- 0xfe, 0xad, 0x6c, 0x26, 0x2f, 0x16, 0x0e, 0x11, 0xc0, 0x83, 0xaa, 0xf8,
+- 0x86, 0x4a, 0xfd, 0x36, 0xf9, 0xe4, 0x2c, 0xd4, 0x0b, 0x05, 0xc9, 0xeb,
+- 0x82, 0x0b, 0xe5, 0xf9, 0xa2, 0xa8, 0x9b, 0x94, 0x35, 0x52, 0xdb, 0x3e,
+- 0x9a, 0x0c, 0xc9, 0xd9, 0xf7, 0x11, 0x0f, 0xeb, 0xef, 0x00, 0xfd, 0xeb,
+- 0x9e, 0x16, 0x7d, 0x70, 0xb3, 0x57, 0x63, 0x0d, 0x1e, 0x67, 0x2d, 0xa1,
+- 0xb5, 0x4e, 0x28, 0x37, 0x8e, 0xf3, 0x6c, 0x8d, 0xc4, 0x4b, 0x86, 0x7a,
+- 0x3e, 0xe9, 0xe8, 0xb4, 0x86, 0x3a, 0x09, 0x5e, 0x27, 0x89, 0xd7, 0x35,
+- 0xb8, 0x32, 0x05, 0x9d, 0x11, 0x8c, 0x57, 0x0d, 0x02, 0x95, 0x9a, 0x48,
+- 0x77, 0x40, 0x62, 0x41, 0xeb, 0x17, 0x3e, 0x55, 0x4d, 0x7c, 0x9e, 0x9d,
+- 0x92, 0x7c, 0xa3, 0x08, 0x57, 0xc9, 0xd4, 0x9a, 0x43, 0xf8, 0x70, 0x03,
+- 0xf0, 0xc6, 0xa4, 0xbb, 0xef, 0xde, 0x27, 0x67, 0x6f, 0x2b, 0xdd, 0x33,
+- 0x0d, 0x8f, 0x39, 0x67, 0x15, 0x64, 0xfc, 0x43, 0x38, 0x93, 0x15, 0x7e,
+- 0x39, 0x44, 0x7e, 0x19, 0x1f, 0x26, 0xf7, 0x6c, 0x2d, 0x40, 0x62, 0xb2,
+- 0xc9, 0xf8, 0x88, 0xbe, 0xff, 0x2c, 0x79, 0xeb, 0x11, 0xb8, 0xfb, 0xee,
+- 0x8d, 0xa5, 0xb3, 0x08, 0xf1, 0x7c, 0xa7, 0xb2, 0xd3, 0x39, 0xcf, 0x64,
+- 0x30, 0xde, 0x3a, 0x94, 0x1d, 0xf3, 0xdb, 0x94, 0xae, 0xf9, 0x6e, 0x65,
+- 0x4f, 0x41, 0xea, 0xd8, 0xd5, 0x6d, 0x0f, 0x9e, 0xd8, 0xad, 0xec, 0x9c,
+- 0xed, 0x55, 0xc8, 0x6f, 0xd5, 0x80, 0xd9, 0xa7, 0x74, 0xcf, 0xbb, 0xfd,
+- 0xf4, 0x4e, 0xd6, 0x70, 0x3b, 0x2d, 0xf1, 0x07, 0xb5, 0xad, 0x6b, 0x52,
+- 0xfe, 0x17, 0x2b, 0x22, 0xff, 0xf7, 0xd0, 0xbf, 0x55, 0xb1, 0xed, 0x55,
+- 0xa9, 0xd7, 0x65, 0x3d, 0xec, 0xe7, 0x53, 0xcc, 0x93, 0x56, 0x0d, 0x06,
+- 0x58, 0x83, 0x8c, 0x1a, 0xb7, 0x94, 0xf6, 0xcf, 0x44, 0x27, 0x39, 0x2f,
+- 0x21, 0xfe, 0x8a, 0x4c, 0x25, 0x65, 0xf8, 0x07, 0xca, 0xbf, 0xbf, 0xa4,
+- 0x57, 0xb7, 0x9c, 0x27, 0xf0, 0x23, 0x23, 0x3a, 0xe4, 0xa9, 0xef, 0xb1,
+- 0xc9, 0xeb, 0x7a, 0xf9, 0x78, 0x6d, 0x9c, 0x5c, 0x75, 0xbf, 0xa2, 0x0d,
+- 0x3f, 0xe7, 0xea, 0x75, 0xe1, 0x8a, 0xa2, 0x15, 0x47, 0x21, 0xb8, 0xe0,
+- 0xea, 0xb5, 0xb6, 0xa4, 0xd7, 0x9a, 0x7c, 0xa7, 0x73, 0x4e, 0xab, 0x86,
+- 0x7a, 0x2d, 0x4c, 0x76, 0x28, 0x9d, 0xf3, 0xd2, 0xcb, 0x14, 0xdd, 0x44,
+- 0x8f, 0x13, 0x76, 0x95, 0xde, 0xad, 0xdc, 0xee, 0x9c, 0x2b, 0x93, 0xb3,
+- 0x5d, 0xb2, 0xdf, 0x5f, 0xd6, 0x4b, 0x72, 0xfa, 0xd2, 0xf0, 0xb6, 0x69,
+- 0x35, 0xbc, 0x75, 0xda, 0xb6, 0xbf, 0x6b, 0xfc, 0xb3, 0xa3, 0xcb, 0x59,
+- 0x43, 0x74, 0x91, 0x73, 0x23, 0x65, 0x7d, 0xbe, 0x50, 0xd2, 0x47, 0xd6,
+- 0xea, 0xfa, 0x3a, 0x95, 0xff, 0x87, 0xef, 0xdd, 0xac, 0x7b, 0xa6, 0xa4,
+- 0xac, 0x4f, 0xd8, 0x2c, 0x9f, 0x2f, 0x1b, 0xc2, 0x1b, 0xbc, 0xff, 0x93,
+- 0x6c, 0x59, 0x2f, 0x2f, 0xe6, 0x66, 0xc5, 0xfe, 0x43, 0xf2, 0x3f, 0x7c,
+- 0xc4, 0x91, 0xb8, 0x31, 0x46, 0x3f, 0x72, 0xf5, 0xd3, 0x86, 0x57, 0x7a,
+- 0x9b, 0x8a, 0x57, 0xa0, 0xf5, 0x2f, 0x2a, 0x89, 0x34, 0x6b, 0x70, 0x9c,
+- 0x2d, 0xfc, 0xea, 0xfa, 0x35, 0xe7, 0xab, 0x94, 0x6d, 0x39, 0x19, 0xfb,
+- 0x21, 0x8e, 0x2d, 0x67, 0x4a, 0x14, 0x3c, 0x37, 0x0b, 0xcc, 0x5a, 0x9c,
+- 0xd6, 0x1c, 0xc1, 0xd3, 0x86, 0x6d, 0x3f, 0xdb, 0xa2, 0xcb, 0x59, 0xa0,
+- 0xf3, 0x6e, 0xaf, 0x08, 0x46, 0x8d, 0x2e, 0x7b, 0x79, 0x72, 0x9e, 0xa4,
+- 0x97, 0x36, 0x10, 0xdd, 0xc5, 0x07, 0xca, 0x6b, 0x2f, 0xe7, 0xdc, 0x32,
+- 0xb4, 0x8f, 0xd8, 0xa6, 0x7c, 0xde, 0x4d, 0xfa, 0x30, 0x37, 0xda, 0x64,
+- 0x6d, 0xd8, 0x59, 0x5f, 0x43, 0xfc, 0x95, 0xe8, 0x43, 0x5f, 0x9d, 0x23,
+- 0x97, 0x18, 0x33, 0xfc, 0x0e, 0x6f, 0x3b, 0x42, 0xae, 0x32, 0xc1, 0xd8,
+- 0x79, 0xd2, 0xba, 0x80, 0x0b, 0xf9, 0xd7, 0xf0, 0xc6, 0xb5, 0xff, 0x67,
+- 0x13, 0x7f, 0xb9, 0xb8, 0xb1, 0xcb, 0x39, 0xd3, 0x74, 0xba, 0xf5, 0x96,
+- 0x84, 0xe0, 0x50, 0x77, 0xb3, 0x9c, 0x71, 0xaa, 0x34, 0xf3, 0x9b, 0x64,
+- 0xbf, 0xab, 0xc2, 0x34, 0x6f, 0x3d, 0xaf, 0x8b, 0x6d, 0xfe, 0x62, 0xfd,
+- 0x19, 0x5d, 0xf4, 0xfa, 0x9f, 0x6b, 0xc7, 0x9d, 0xff, 0xaf, 0xfc, 0xbb,
+- 0x5b, 0xf7, 0xe9, 0x12, 0x3b, 0x67, 0x5b, 0xda, 0x1d, 0x4c, 0x68, 0x35,
+- 0x57, 0x39, 0x36, 0x68, 0x31, 0x6f, 0x71, 0x3e, 0x0d, 0x33, 0xe9, 0x7c,
+- 0x9a, 0xa6, 0x6b, 0x9b, 0x6e, 0xb3, 0xc1, 0xf9, 0xec, 0x30, 0xdd, 0xf3,
+- 0xcf, 0x69, 0x53, 0x77, 0x3e, 0x7b, 0xcc, 0xb8, 0xf3, 0xd9, 0x69, 0xae,
+- 0xbc, 0x2e, 0x17, 0x7f, 0xfe, 0x1f, 0x9b, 0x97, 0x53, 0xd9, 0x78, 0x3a,
++ 0xad, 0x7b, 0x0d, 0x70, 0x94, 0xf7, 0x79, 0xe7, 0xef, 0xbf, 0x1f, 0xd2,
++ 0xae, 0xb4, 0x5a, 0xad, 0xf0, 0x82, 0x57, 0x89, 0x52, 0xf6, 0xf5, 0xbe,
++ 0x2b, 0x2d, 0x96, 0x80, 0x77, 0x41, 0x04, 0x11, 0x6d, 0xcd, 0x56, 0x08,
++ 0x21, 0x40, 0xd8, 0x32, 0x56, 0x92, 0x25, 0xc7, 0xd4, 0x2a, 0xc8, 0x20,
++ 0xdb, 0x18, 0x8b, 0x86, 0xe6, 0xe4, 0xd6, 0xad, 0xd6, 0x92, 0xc0, 0x60,
++ 0x56, 0xbc, 0x22, 0x82, 0x08, 0x77, 0xee, 0x26, 0xb2, 0x25, 0x2c, 0xec,
++ 0xac, 0x58, 0x3b, 0xbd, 0xeb, 0xc5, 0x33, 0xc9, 0x58, 0x67, 0x6c, 0x4c,
++ 0x72, 0xfe, 0xc8, 0x75, 0x3a, 0x3d, 0xf7, 0xe6, 0xee, 0xca, 0xf8, 0x83,
++ 0xd8, 0x6e, 0x8c, 0xdd, 0x4c, 0x3a, 0x27, 0x52, 0xdb, 0xef, 0xfd, 0x9e,
++ 0xf7, 0xdd, 0x05, 0xe2, 0xba, 0xd3, 0x99, 0xce, 0x69, 0x66, 0x67, 0xa5,
++ 0xf7, 0xe3, 0xf9, 0x3f, 0xdf, 0xcf, 0xef, 0x79, 0xfe, 0x7f, 0xd5, 0x03,
++ 0x15, 0x28, 0xfe, 0x54, 0xf1, 0xd3, 0x3c, 0x30, 0x78, 0x70, 0xd5, 0x8a,
++ 0xe6, 0x15, 0xf6, 0x05, 0x97, 0xc7, 0x23, 0x37, 0xbf, 0xaa, 0x80, 0xde,
++ 0x0f, 0xf0, 0x6f, 0xfa, 0xf9, 0xca, 0xbf, 0xed, 0x35, 0xfb, 0xc7, 0x0d,
++ 0x84, 0x4a, 0x7c, 0xc9, 0x07, 0x3e, 0x57, 0xea, 0xd2, 0xd7, 0xda, 0x74,
++ 0xf8, 0xdc, 0xa9, 0x93, 0xa9, 0xdd, 0x3a, 0x90, 0xce, 0x37, 0x46, 0x37,
++ 0xe0, 0x53, 0x2b, 0x1b, 0xf6, 0x40, 0xae, 0x7f, 0x25, 0xf5, 0xc9, 0xd0,
++ 0x4f, 0xd6, 0x6a, 0x1f, 0x4f, 0xb9, 0xe1, 0x0b, 0xa5, 0x4e, 0x23, 0x54,
++ 0x0f, 0x5f, 0x1d, 0xdf, 0xf9, 0x0f, 0x0d, 0xd5, 0x6e, 0x04, 0x4b, 0xb4,
++ 0x5a, 0x30, 0x62, 0x22, 0xeb, 0x4b, 0x0d, 0xa0, 0x7c, 0x0d, 0xf0, 0x6e,
++ 0x2e, 0x6e, 0x8c, 0x00, 0xe3, 0xae, 0x54, 0x3c, 0xfa, 0x22, 0x0c, 0x1c,
++ 0x2a, 0x44, 0xd1, 0xce, 0xcf, 0x66, 0xf3, 0x33, 0x2b, 0xea, 0x45, 0xd6,
++ 0xcd, 0xe7, 0x76, 0x35, 0x03, 0x1b, 0x73, 0x06, 0x0e, 0x9b, 0xf0, 0xd5,
++ 0xa6, 0x1e, 0xc6, 0x3a, 0x7e, 0x07, 0x53, 0x83, 0x78, 0x7d, 0x2c, 0x16,
++ 0x7d, 0x0a, 0x5a, 0x46, 0x77, 0x6b, 0x83, 0x40, 0x63, 0x7f, 0x9f, 0xd2,
++ 0x7a, 0xdf, 0x50, 0x5a, 0xf7, 0x98, 0x82, 0x4f, 0xf1, 0xb9, 0xc6, 0xbc,
++ 0x7c, 0x0f, 0xe2, 0xd6, 0xbc, 0x0f, 0x97, 0xdc, 0xb2, 0xfe, 0xef, 0x52,
++ 0xdf, 0x0a, 0x1e, 0xbd, 0x05, 0xa3, 0xe4, 0xc1, 0x9b, 0x52, 0x78, 0xb2,
++ 0x39, 0x1e, 0x19, 0x86, 0xdc, 0x8f, 0x62, 0x43, 0x41, 0xbe, 0x35, 0x4a,
++ 0x6d, 0x59, 0xa3, 0x86, 0x65, 0x9d, 0x31, 0xca, 0x91, 0x0d, 0x69, 0x11,
++ 0x40, 0x61, 0xd8, 0x70, 0x21, 0x1d, 0x6a, 0x8b, 0x7a, 0xa0, 0x45, 0xee,
++ 0xc1, 0x3f, 0x51, 0xe6, 0x74, 0xc2, 0x0b, 0xe7, 0xf9, 0x5e, 0x94, 0x63,
++ 0x3e, 0xe4, 0x68, 0xed, 0xc9, 0x9c, 0x65, 0x5d, 0xd0, 0x3d, 0x38, 0x43,
++ 0xfd, 0x0c, 0xe7, 0xff, 0xc9, 0x9a, 0xa7, 0x6e, 0x46, 0xf5, 0xd2, 0xfa,
++ 0x3e, 0x4c, 0x85, 0x2c, 0x6b, 0x9a, 0xf7, 0x0e, 0xe7, 0x4b, 0x7a, 0xb6,
++ 0x2c, 0x97, 0x6e, 0x59, 0xbb, 0xf5, 0xdf, 0x58, 0xbb, 0x7e, 0xeb, 0x59,
++ 0xcb, 0x7a, 0xcc, 0xb8, 0x09, 0x67, 0x27, 0xda, 0xd5, 0x96, 0xd9, 0x25,
++ 0xc1, 0xcd, 0x93, 0x16, 0x2e, 0x18, 0x08, 0xb9, 0x52, 0x1d, 0x6a, 0xf3,
++ 0x6c, 0xa7, 0xda, 0x58, 0xd8, 0xae, 0x3a, 0xa6, 0xbf, 0xa5, 0x3a, 0x67,
++ 0x7b, 0xd5, 0xa6, 0x42, 0x04, 0x33, 0x66, 0x18, 0xd3, 0x66, 0x46, 0xb5,
++ 0xcf, 0xf6, 0x28, 0x47, 0x8e, 0x41, 0xd5, 0x56, 0x28, 0xd1, 0xba, 0xae,
++ 0xc7, 0xcd, 0xb9, 0x14, 0x8e, 0x98, 0xe5, 0x5c, 0x67, 0xc1, 0xfa, 0x49,
++ 0xc3, 0x02, 0xe5, 0x34, 0x70, 0xb4, 0xf0, 0x18, 0xb6, 0x4d, 0x5a, 0x56,
++ 0x3e, 0x09, 0xe4, 0x0b, 0xc0, 0x0f, 0xcc, 0x58, 0x77, 0xbf, 0xb2, 0xac,
++ 0x4d, 0x71, 0x6b, 0xe9, 0x65, 0xa3, 0x31, 0xf1, 0x12, 0xfe, 0xaf, 0x35,
++ 0x15, 0x46, 0x36, 0x40, 0x1a, 0xc7, 0x68, 0xb3, 0xfb, 0xc6, 0xe0, 0x2b,
++ 0x4f, 0x8d, 0xe2, 0x17, 0x39, 0xf8, 0xca, 0x52, 0x59, 0x5c, 0xc8, 0x0d,
++ 0x87, 0x7c, 0x88, 0x45, 0x36, 0xab, 0xec, 0xa0, 0x0b, 0xda, 0xc0, 0xdb,
++ 0xd0, 0xa2, 0xb4, 0xc7, 0xc5, 0xf3, 0x4a, 0x9b, 0x7f, 0x09, 0x5a, 0xfa,
++ 0x37, 0x4a, 0xeb, 0xac, 0x75, 0x23, 0xed, 0x8a, 0xfb, 0xf0, 0x93, 0x06,
++ 0xb1, 0xc9, 0x28, 0x56, 0xd8, 0xb6, 0xc9, 0x62, 0xd9, 0x35, 0xdb, 0xa4,
++ 0x30, 0x4c, 0xbe, 0x0e, 0x93, 0xaf, 0x97, 0x0d, 0x2d, 0xf2, 0x24, 0xac,
++ 0xa5, 0x7d, 0x86, 0xdc, 0x4b, 0x61, 0xb4, 0x60, 0x45, 0x83, 0xa9, 0x4b,
++ 0xe4, 0x17, 0xd9, 0x2f, 0xa5, 0x7c, 0xd9, 0xea, 0xd4, 0xa7, 0xd6, 0x6b,
++ 0x6b, 0x22, 0x78, 0xa1, 0x10, 0xc6, 0x73, 0x85, 0x10, 0x9e, 0x2d, 0xb4,
++ 0xc3, 0x2c, 0x20, 0xb8, 0xad, 0xf0, 0x45, 0x7e, 0x6c, 0x21, 0xc0, 0xe7,
++ 0xc9, 0x77, 0x70, 0x6b, 0xc1, 0xd3, 0x5b, 0x96, 0x42, 0xf7, 0x4f, 0x73,
++ 0x43, 0x56, 0x85, 0x8e, 0xde, 0x9a, 0x94, 0x9e, 0xbe, 0x55, 0x05, 0x5a,
++ 0xe8, 0x87, 0xdd, 0xaf, 0xe4, 0x5b, 0x3c, 0xfa, 0x71, 0x3f, 0xbc, 0xd4,
++ 0xff, 0xc6, 0x82, 0x65, 0x8d, 0x18, 0x07, 0x56, 0xee, 0x6a, 0xf9, 0x8b,
++ 0xf9, 0x6e, 0xbd, 0x0b, 0xd9, 0x42, 0x1f, 0x10, 0x4c, 0xf1, 0x9b, 0xa1,
++ 0xb8, 0xbd, 0xa9, 0x3d, 0x7a, 0xee, 0x01, 0x8f, 0xe3, 0xcf, 0xe4, 0x81,
++ 0x7a, 0x7f, 0xce, 0x24, 0x0f, 0xe6, 0xe1, 0x20, 0x2a, 0xa2, 0x94, 0xef,
++ 0xe7, 0xe4, 0x33, 0x81, 0x1f, 0x16, 0x74, 0xf2, 0xd6, 0x44, 0x1e, 0xa3,
++ 0xe4, 0xcf, 0x87, 0x5d, 0x13, 0xda, 0x78, 0x16, 0xda, 0x91, 0x29, 0x2c,
++ 0x47, 0x3a, 0x1c, 0xa2, 0x0f, 0xfe, 0x39, 0x1c, 0x1a, 0x5d, 0x38, 0x6e,
++ 0x62, 0x55, 0x28, 0x45, 0xfb, 0x26, 0xf1, 0x70, 0x19, 0xe2, 0xbd, 0x1f,
++ 0x2b, 0x85, 0xd7, 0xe2, 0x5d, 0x18, 0xa3, 0x3c, 0x5d, 0x79, 0x3f, 0xee,
++ 0x9f, 0xa8, 0xc0, 0xbd, 0x13, 0x16, 0xee, 0x4b, 0x22, 0x55, 0x41, 0x79,
++ 0x12, 0xc9, 0x78, 0xf4, 0x3d, 0x78, 0xd0, 0x9e, 0xef, 0x62, 0x2c, 0x6d,
++ 0x40, 0xba, 0xcc, 0x87, 0x0d, 0xf9, 0x00, 0xe3, 0x31, 0x8d, 0xd3, 0x93,
++ 0x3e, 0x78, 0x57, 0xbb, 0x30, 0x15, 0x2e, 0x43, 0xa2, 0xde, 0xc5, 0x4f,
++ 0x38, 0xd8, 0x36, 0x59, 0x17, 0xdc, 0x68, 0x7a, 0xb0, 0xd7, 0x74, 0x61,
++ 0x68, 0xc2, 0xb2, 0xda, 0x0d, 0x0b, 0x57, 0x57, 0x87, 0xf0, 0x3c, 0xf5,
++ 0x77, 0xc0, 0x8c, 0xe0, 0x6c, 0xe1, 0x51, 0xf2, 0x12, 0x76, 0xf8, 0x35,
++ 0xc9, 0xbb, 0x49, 0xde, 0x4d, 0xf2, 0x6d, 0x0a, 0x9f, 0xe7, 0x19, 0x33,
++ 0x06, 0xe5, 0xf2, 0x93, 0x87, 0x4a, 0xf4, 0x93, 0x8f, 0x58, 0xd2, 0x82,
++ 0x2b, 0xa9, 0x65, 0x77, 0x31, 0x79, 0x2d, 0xad, 0xb7, 0xac, 0x8f, 0x57,
++ 0x8b, 0x2c, 0xb4, 0xb9, 0xab, 0x4b, 0x62, 0xf4, 0xf7, 0xaa, 0x18, 0x57,
++ 0x7f, 0x4b, 0xbd, 0x3d, 0x5e, 0xf0, 0x63, 0x70, 0xc2, 0xf6, 0xdb, 0x83,
++ 0x65, 0xe4, 0x5b, 0xf8, 0x2a, 0xe8, 0x71, 0xc6, 0x68, 0x3c, 0xc3, 0x18,
++ 0xc5, 0x56, 0xf2, 0x7c, 0x9f, 0x19, 0x6f, 0xd9, 0xae, 0x3c, 0xd8, 0x94,
++ 0x0f, 0x07, 0xdb, 0x6f, 0xe0, 0x93, 0xf2, 0x4a, 0x0c, 0x52, 0xd6, 0x10,
++ 0xf9, 0x0b, 0x63, 0x37, 0xf9, 0x7c, 0xae, 0xc8, 0xe7, 0x74, 0x41, 0xd6,
++ 0xfa, 0x3c, 0xaf, 0x25, 0x3e, 0x91, 0x5d, 0x94, 0x0a, 0x2b, 0x54, 0x04,
++ 0xb0, 0x3d, 0xff, 0x26, 0x6d, 0x51, 0x87, 0xbf, 0xa0, 0x0d, 0x5e, 0x60,
++ 0x8c, 0xfc, 0xf0, 0x9a, 0xbf, 0x88, 0x3d, 0x1e, 0xa1, 0x1d, 0xb4, 0xd3,
++ 0x59, 0x04, 0xd0, 0x5b, 0x48, 0xe3, 0xd0, 0x24, 0xd2, 0x33, 0xc6, 0x31,
++ 0xc6, 0xfb, 0x12, 0xb8, 0xf5, 0xf2, 0x74, 0x48, 0xaf, 0xc0, 0xee, 0xe9,
++ 0x30, 0x06, 0x0a, 0x6d, 0x30, 0x27, 0xc2, 0xd8, 0x47, 0xdf, 0xbc, 0x92,
++ 0x4c, 0xdf, 0x17, 0x84, 0xf0, 0x1e, 0xc6, 0xfd, 0x7c, 0xe7, 0xb1, 0xc9,
++ 0x30, 0xfa, 0xa9, 0xa3, 0xcd, 0xc9, 0x78, 0x8b, 0x9f, 0xd7, 0xf6, 0xf2,
++ 0xda, 0x61, 0xea, 0xff, 0xbc, 0x31, 0x86, 0xde, 0x6e, 0x2d, 0x01, 0x84,
++ 0xb1, 0xc7, 0x44, 0x88, 0x2e, 0xfc, 0x08, 0xf3, 0x5b, 0xe2, 0x3c, 0xff,
++ 0xbe, 0xa7, 0x50, 0x41, 0x39, 0x83, 0x88, 0xe8, 0x9f, 0x58, 0xde, 0x66,
++ 0xcb, 0xfa, 0xbe, 0x11, 0xbf, 0xf8, 0x96, 0xdb, 0x83, 0x87, 0x0a, 0x2e,
++ 0x0c, 0x4e, 0x57, 0xe0, 0x0f, 0x27, 0x3c, 0xb8, 0xb3, 0xbe, 0x02, 0x07,
++ 0xa6, 0xd3, 0x18, 0x99, 0xac, 0x40, 0xdf, 0x04, 0x96, 0xee, 0x31, 0x46,
++ 0x6a, 0xca, 0xa0, 0x2d, 0xb4, 0x23, 0x81, 0xab, 0xb4, 0xc3, 0x43, 0xd3,
++ 0x81, 0x60, 0x66, 0x32, 0x84, 0xc1, 0x59, 0x3f, 0x9f, 0x77, 0xf1, 0xf9,
++ 0x72, 0x18, 0xab, 0x62, 0x83, 0x21, 0x08, 0x8f, 0x95, 0xd8, 0x3f, 0xed,
++ 0xc7, 0x03, 0x13, 0x21, 0xec, 0x9b, 0x6c, 0xc6, 0xb8, 0x99, 0xc6, 0x51,
++ 0xe6, 0x8e, 0x1f, 0x24, 0xb5, 0xee, 0x7d, 0x4a, 0x4b, 0x6f, 0x54, 0x69,
++ 0x34, 0x24, 0xbd, 0xb8, 0xc4, 0x3c, 0xe4, 0x4d, 0x36, 0xb6, 0x3c, 0xcb,
++ 0xdc, 0x50, 0x96, 0x0a, 0xf3, 0x6f, 0xed, 0x08, 0x63, 0x36, 0xed, 0x75,
++ 0xad, 0x06, 0x16, 0x4b, 0xfc, 0x86, 0x83, 0x5b, 0xcc, 0x50, 0x70, 0x4b,
++ 0xa1, 0x2e, 0xb8, 0xd9, 0x8c, 0x04, 0x37, 0x33, 0xbe, 0x36, 0x8a, 0x3f,
++ 0x9a, 0x3e, 0x1c, 0x4b, 0x7e, 0x6a, 0xf5, 0xd6, 0xd8, 0xf9, 0x2c, 0xb8,
++ 0x6d, 0x52, 0xcb, 0x4e, 0x41, 0x33, 0x58, 0x0d, 0x30, 0x36, 0xeb, 0xa1,
++ 0xfd, 0x14, 0x6a, 0xf4, 0x66, 0xe6, 0xf1, 0x10, 0xf6, 0x33, 0xa7, 0xfc,
++ 0x15, 0x73, 0x4a, 0xdf, 0xf1, 0x58, 0x68, 0x1c, 0x7e, 0xea, 0x1b, 0xd8,
++ 0x75, 0x2e, 0x4c, 0x9b, 0x77, 0xe2, 0x51, 0xf2, 0xb5, 0x79, 0x4d, 0x18,
++ 0xf7, 0x16, 0x42, 0xc1, 0x4e, 0xda, 0xef, 0xbd, 0x7c, 0x24, 0xb8, 0x81,
++ 0xb6, 0x7c, 0x3b, 0xaf, 0x45, 0xe7, 0xf1, 0x8f, 0xe2, 0x4f, 0x09, 0xb8,
++ 0x80, 0x3d, 0xc7, 0xbd, 0x98, 0x0f, 0xcb, 0x5a, 0xd4, 0xb9, 0xf9, 0x82,
++ 0x15, 0xd0, 0xf5, 0xd3, 0xfb, 0xa8, 0xeb, 0x6f, 0x17, 0x02, 0x78, 0xc0,
++ 0xd4, 0x12, 0x3f, 0x54, 0x01, 0xea, 0xd4, 0x47, 0x3d, 0x30, 0xc1, 0x2c,
++ 0x91, 0xe7, 0x92, 0x88, 0x2e, 0x71, 0x72, 0xed, 0x81, 0x69, 0xf1, 0x13,
++ 0xda, 0xde, 0xa4, 0x0f, 0xd0, 0x7f, 0x7e, 0x78, 0x2d, 0x56, 0xb5, 0x50,
++ 0xd6, 0xce, 0xdd, 0x09, 0xfa, 0x8b, 0xa3, 0xa3, 0x13, 0x93, 0xa2, 0x07,
++ 0x6d, 0x1c, 0xae, 0x34, 0x56, 0xae, 0xfa, 0x2b, 0xeb, 0xd2, 0x62, 0xd1,
++ 0x47, 0x08, 0x43, 0xd4, 0xe1, 0x69, 0xd3, 0xb2, 0xae, 0xae, 0xfe, 0xd0,
++ 0x6a, 0xb9, 0x59, 0xf4, 0x22, 0xb2, 0x3e, 0xaf, 0xa4, 0x8e, 0xd4, 0xe8,
++ 0xc1, 0xff, 0x0f, 0xbe, 0xf2, 0x1d, 0xab, 0xd7, 0x96, 0x4f, 0xfc, 0xc5,
++ 0x43, 0x5f, 0x7c, 0x94, 0xb4, 0x5d, 0xe8, 0x25, 0xbd, 0x07, 0x4d, 0xeb,
++ 0xa3, 0xda, 0xd4, 0x67, 0x56, 0xcb, 0x5a, 0x7d, 0x60, 0x41, 0xfd, 0x0f,
++ 0x5e, 0x0f, 0x63, 0x7f, 0xa1, 0x85, 0xba, 0x6b, 0xc7, 0x63, 0xd4, 0xe1,
++ 0x61, 0x53, 0x72, 0x62, 0x84, 0xfe, 0x5c, 0x47, 0xff, 0xf6, 0xa8, 0x8d,
++ 0x66, 0x1e, 0x9b, 0xc7, 0xb2, 0xd8, 0x44, 0x7f, 0xbf, 0x98, 0x8b, 0xb5,
++ 0x3c, 0x0d, 0x2d, 0x4b, 0x19, 0x82, 0x9d, 0xd4, 0x71, 0xbb, 0xa9, 0x75,
++ 0x8a, 0x4d, 0xdb, 0x99, 0x97, 0x5e, 0xcc, 0x45, 0x82, 0x6d, 0x05, 0xd1,
++ 0x77, 0x5d, 0x70, 0x43, 0xe1, 0xab, 0xb4, 0xbd, 0xc2, 0xba, 0xe5, 0x3e,
++ 0xe6, 0x99, 0x3b, 0xe1, 0xd8, 0xd5, 0xb1, 0xdd, 0x6b, 0xc9, 0xc6, 0xde,
++ 0x0f, 0x99, 0x9f, 0xb2, 0x8b, 0x9d, 0x6b, 0x83, 0xbc, 0x56, 0xbd, 0x1a,
++ 0xc1, 0x3b, 0xe8, 0x07, 0x77, 0xd3, 0x0f, 0xae, 0xae, 0xfe, 0xd4, 0x8a,
++ 0xde, 0xe4, 0xf8, 0x41, 0xdb, 0xa4, 0x27, 0xd8, 0x41, 0x3d, 0x6d, 0x34,
++ 0x14, 0xa6, 0x8d, 0x1c, 0x7a, 0xaf, 0x61, 0x87, 0xf4, 0xd4, 0x59, 0x23,
++ 0xcd, 0x3c, 0xf2, 0xbb, 0xf0, 0xd4, 0x60, 0xea, 0x69, 0xe3, 0x51, 0x44,
++ 0x1d, 0xdf, 0xc1, 0xbe, 0x09, 0x3f, 0xb2, 0x77, 0x86, 0x30, 0xd3, 0x10,
++ 0xc2, 0x83, 0xa4, 0x7d, 0x25, 0xd9, 0xd8, 0xff, 0x3a, 0x75, 0x30, 0x55,
++ 0x23, 0xd7, 0xd2, 0xf8, 0x91, 0xf1, 0x30, 0x70, 0x93, 0xb3, 0xf6, 0xac,
++ 0xc4, 0xe8, 0x6c, 0x33, 0x0e, 0x17, 0x32, 0xca, 0xc9, 0x9b, 0x5a, 0x67,
++ 0x1a, 0x3f, 0xb7, 0x24, 0x97, 0xce, 0x9a, 0xcc, 0x71, 0xd4, 0xc7, 0x28,
++ 0xfd, 0x68, 0x38, 0x5f, 0x17, 0xdc, 0x44, 0x3f, 0x7a, 0x34, 0x2f, 0x32,
++ 0xc5, 0x0d, 0xc3, 0x5d, 0xcb, 0xda, 0x4c, 0xfd, 0x98, 0x76, 0xcd, 0xaf,
++ 0x0e, 0xe9, 0x47, 0x31, 0x6e, 0xf3, 0x36, 0xa8, 0x32, 0xc4, 0x18, 0x0c,
++ 0x99, 0xea, 0x72, 0xfd, 0x00, 0x1e, 0xb5, 0xaf, 0x85, 0x83, 0x3b, 0x26,
++ 0xd3, 0x2e, 0x97, 0x8e, 0x50, 0x65, 0xaa, 0x5d, 0xed, 0x60, 0xdd, 0xed,
++ 0x98, 0xec, 0x50, 0x1d, 0xb3, 0x12, 0x03, 0x9d, 0x6a, 0x33, 0x6b, 0x6e,
++ 0x9a, 0x35, 0x37, 0xcd, 0x9a, 0x9b, 0x26, 0x1f, 0x69, 0xd6, 0xda, 0xb6,
++ 0xc2, 0xa0, 0xda, 0x2a, 0xfa, 0xa7, 0x7f, 0x3d, 0x6b, 0x3a, 0x38, 0x82,
++ 0x39, 0x28, 0xb8, 0xa9, 0xb0, 0xc2, 0xe5, 0x60, 0xbb, 0x41, 0x55, 0xc4,
++ 0x32, 0xbe, 0x0a, 0x9d, 0xb5, 0xcc, 0x1c, 0x54, 0x5b, 0x58, 0x6f, 0x33,
++ 0xb6, 0x2e, 0x63, 0x03, 0xef, 0xb0, 0xce, 0xbe, 0xc6, 0x3a, 0x9b, 0x4f,
++ 0x32, 0xae, 0x96, 0x5f, 0xb5, 0x7a, 0x17, 0x3b, 0x35, 0x61, 0x84, 0xfc,
++ 0x7e, 0x9f, 0x36, 0x9b, 0x67, 0x2d, 0x6d, 0x77, 0x2b, 0xec, 0xd1, 0x51,
++ 0x5d, 0xcb, 0x9c, 0x7a, 0xb8, 0xc0, 0x3a, 0x60, 0xc4, 0x5a, 0xde, 0xa7,
++ 0x62, 0x0f, 0xeb, 0x5e, 0x5c, 0xbd, 0x89, 0x60, 0x47, 0x6f, 0xc3, 0xb1,
++ 0x89, 0x72, 0xf4, 0x27, 0xd3, 0x8b, 0x7c, 0xc4, 0x2a, 0x9d, 0xcd, 0x78,
++ 0x98, 0x4b, 0xab, 0x48, 0x2a, 0x4e, 0xbf, 0x41, 0xfa, 0x38, 0xeb, 0xc4,
++ 0x98, 0xf9, 0x55, 0xe4, 0x59, 0x4f, 0x67, 0x0c, 0x0f, 0x5e, 0xcb, 0xaf,
++ 0x60, 0x9e, 0x8b, 0x1b, 0x01, 0x55, 0xc1, 0xf8, 0x4d, 0x21, 0x67, 0x4a,
++ 0x7e, 0xb2, 0xac, 0x19, 0xe1, 0x21, 0x1e, 0x4f, 0x0f, 0x43, 0x72, 0x96,
++ 0xb5, 0xf4, 0x9e, 0x64, 0x19, 0xd6, 0xc5, 0x83, 0x58, 0xaa, 0xf7, 0xaa,
++ 0xce, 0x42, 0xdc, 0x38, 0x8f, 0x6f, 0xa9, 0xbb, 0x67, 0x53, 0x8c, 0xed,
++ 0x0c, 0x75, 0x53, 0x81, 0x4b, 0x61, 0xe1, 0x11, 0xd5, 0x5e, 0xdd, 0x85,
++ 0x77, 0xef, 0x52, 0x08, 0xe9, 0x69, 0x5c, 0x68, 0x0e, 0xd1, 0xaf, 0x3a,
++ 0x89, 0x31, 0xa2, 0x70, 0xcf, 0x45, 0x82, 0x5b, 0x69, 0x8b, 0xca, 0xb9,
++ 0x3a, 0xda, 0x87, 0xbe, 0x47, 0x1d, 0xb6, 0x51, 0x87, 0x5b, 0xa6, 0x11,
++ 0xaa, 0x48, 0xf5, 0xa8, 0x8e, 0x42, 0xbb, 0x6a, 0x2f, 0x68, 0xd4, 0x93,
++ 0xe8, 0xe4, 0x3b, 0xc4, 0x4a, 0xe2, 0x2b, 0x25, 0x5b, 0x8a, 0xbf, 0xde,
++ 0x68, 0xcf, 0x8c, 0x4b, 0x62, 0x6e, 0xdd, 0xf2, 0x14, 0xe3, 0xd1, 0x45,
++ 0xbe, 0x84, 0x07, 0x1f, 0xaa, 0x1b, 0xac, 0xa5, 0x57, 0x92, 0x4c, 0x9e,
++ 0x15, 0x29, 0x1c, 0x2f, 0x74, 0xd1, 0x2e, 0xab, 0x8b, 0xfe, 0x15, 0x0a,
++ 0x6e, 0x9c, 0x6c, 0x57, 0x1b, 0x67, 0x17, 0x05, 0xbb, 0x69, 0xc3, 0xee,
++ 0xd9, 0x88, 0xd0, 0xe5, 0xfa, 0x62, 0xdb, 0x34, 0x5c, 0xfa, 0xbf, 0x64,
++ 0xcb, 0x6f, 0x93, 0x96, 0xd8, 0xd3, 0x5f, 0xf2, 0xd3, 0xe0, 0xdd, 0x93,
++ 0x69, 0xbc, 0xbb, 0xda, 0xcb, 0x9a, 0x5a, 0xc2, 0x14, 0x55, 0xc5, 0xef,
++ 0xd3, 0x2e, 0xe8, 0x83, 0xaa, 0x53, 0xfc, 0xc8, 0xeb, 0xac, 0x79, 0xc7,
++ 0x24, 0xbc, 0x84, 0x0a, 0x51, 0x37, 0x31, 0xdd, 0x87, 0xc9, 0x78, 0xef,
++ 0x39, 0xd5, 0xa5, 0xba, 0x0a, 0x52, 0x83, 0x1d, 0x9f, 0x6a, 0xa3, 0x4f,
++ 0xb5, 0x93, 0x9f, 0x76, 0xfa, 0xd4, 0x16, 0xf2, 0xb3, 0xc5, 0xf6, 0x29,
++ 0xf1, 0xcd, 0xdf, 0xe6, 0x65, 0x43, 0xe1, 0x6e, 0x5b, 0x2f, 0x5b, 0xf9,
++ 0x6e, 0x27, 0xe5, 0xe8, 0xe4, 0x7b, 0x77, 0xf3, 0xbd, 0xbb, 0x67, 0xff,
++ 0x97, 0xf0, 0x47, 0x59, 0x9c, 0xd8, 0xbf, 0x5e, 0xd3, 0x24, 0x07, 0xfc,
++ 0xac, 0x88, 0x29, 0x90, 0x75, 0xa5, 0x24, 0x47, 0x0c, 0xa0, 0xbb, 0x19,
++ 0xbe, 0x45, 0xa9, 0x67, 0x5b, 0xb7, 0xd7, 0x33, 0x9f, 0x31, 0x9f, 0xfa,
++ 0x8e, 0x13, 0x4b, 0x33, 0x47, 0xcf, 0xb4, 0x28, 0x8c, 0x18, 0x37, 0x33,
++ 0x4e, 0x0d, 0x1c, 0x29, 0x68, 0x9d, 0x51, 0xde, 0x6b, 0x1a, 0x13, 0x8c,
++ 0xbf, 0x0f, 0x6d, 0xc4, 0x75, 0x91, 0x54, 0x3f, 0x22, 0x66, 0x2c, 0x72,
++ 0x44, 0x69, 0xfd, 0x1b, 0xa0, 0x5d, 0x64, 0x6d, 0x18, 0x9c, 0x56, 0xda,
++ 0x40, 0xad, 0x5b, 0x4b, 0xbf, 0x61, 0xe3, 0xeb, 0x7d, 0x58, 0x6e, 0x63,
++ 0xb8, 0x7e, 0x24, 0x88, 0x65, 0xb7, 0x92, 0xe6, 0xde, 0x75, 0x0a, 0x97,
++ 0x8d, 0x0f, 0x69, 0x47, 0x2d, 0x9d, 0x55, 0x06, 0x72, 0xcc, 0x13, 0x91,
++ 0xe3, 0x82, 0xd5, 0xf7, 0x11, 0xab, 0xc3, 0x17, 0xe0, 0xb3, 0xb9, 0xb1,
++ 0xd8, 0xa0, 0xcf, 0xad, 0x25, 0x88, 0xd3, 0xd3, 0xa4, 0x69, 0x14, 0x88,
++ 0xdf, 0xb9, 0x46, 0x74, 0x4f, 0x91, 0x66, 0xbc, 0x48, 0x53, 0xcf, 0x83,
++ 0x71, 0x73, 0x04, 0x9b, 0xe2, 0xac, 0x15, 0xcc, 0x79, 0x47, 0xa5, 0x27,
++ 0x20, 0xbd, 0xf2, 0xe3, 0x06, 0xff, 0x1e, 0x54, 0x3b, 0x24, 0xa6, 0xca,
++ 0x1d, 0x2b, 0x54, 0x73, 0x8d, 0xaa, 0xd4, 0x41, 0xcc, 0xd9, 0x6b, 0x0c,
++ 0xc8, 0x1a, 0x03, 0xbf, 0x50, 0x5a, 0xe2, 0x9c, 0x92, 0x5c, 0xdd, 0x98,
++ 0x39, 0xc7, 0x18, 0x3a, 0xac, 0xb4, 0x96, 0x63, 0x14, 0xdf, 0xaf, 0x0b,
++ 0xfd, 0x83, 0xc5, 0x75, 0x06, 0xd0, 0x90, 0x67, 0x7c, 0x16, 0x7c, 0x6a,
++ 0xc3, 0x44, 0x1b, 0x46, 0xa6, 0xdb, 0x30, 0x3c, 0xa1, 0x70, 0xb7, 0xb1,
++ 0x18, 0x97, 0x6e, 0xb6, 0xfb, 0x94, 0xaa, 0xa5, 0x7a, 0x2d, 0x86, 0x42,
++ 0xa8, 0x76, 0xe9, 0x5f, 0xc1, 0xae, 0x22, 0xc6, 0xdf, 0x74, 0xa2, 0x9b,
++ 0x79, 0xdf, 0xc2, 0xfb, 0x8c, 0xa5, 0x58, 0x0d, 0xd2, 0xde, 0x54, 0x0b,
++ 0xf1, 0x78, 0x9d, 0xdb, 0x89, 0xf7, 0x0f, 0x7d, 0x8e, 0x0d, 0x44, 0xff,
++ 0x9f, 0xbf, 0xd7, 0x86, 0xc7, 0x27, 0xca, 0xd0, 0xb2, 0x1a, 0x77, 0x46,
++ 0x50, 0xe5, 0x62, 0x8d, 0x7b, 0x73, 0xbb, 0x1a, 0xe4, 0x3d, 0xfb, 0x59,
++ 0xdf, 0x97, 0x53, 0x46, 0xea, 0x4f, 0x1a, 0xe4, 0xba, 0x9d, 0x37, 0x6e,
++ 0xb8, 0xde, 0xfd, 0x05, 0xd7, 0x15, 0x9e, 0x61, 0x22, 0xfb, 0x01, 0x6b,
++ 0x4a, 0x3e, 0x67, 0xc1, 0x9d, 0xf2, 0xa0, 0x7f, 0x2c, 0x8a, 0x7d, 0x73,
++ 0x61, 0xcc, 0xe5, 0xb4, 0xde, 0x4b, 0xec, 0x1f, 0x76, 0x35, 0xeb, 0x78,
++ 0x60, 0x2e, 0x82, 0xd9, 0x1c, 0x2c, 0x7f, 0x4a, 0x9f, 0xf7, 0xab, 0x04,
++ 0xf6, 0xce, 0xd5, 0xe1, 0x5c, 0x4e, 0xbf, 0x38, 0xac, 0xe2, 0x83, 0xb5,
++ 0xc4, 0x1d, 0x0f, 0xce, 0x35, 0x61, 0xff, 0x9c, 0x8f, 0xef, 0x58, 0xd8,
++ 0x92, 0xac, 0xe3, 0xf3, 0x2e, 0x3c, 0x7d, 0xd2, 0xb2, 0x04, 0x77, 0xf5,
++ 0xcf, 0x01, 0xb3, 0xe3, 0xac, 0x45, 0x67, 0x58, 0x97, 0x9e, 0x00, 0xf6,
++ 0x3e, 0xe1, 0xc2, 0xf4, 0xb8, 0x85, 0x5d, 0xc6, 0x70, 0xad, 0x8b, 0x0e,
++ 0xdf, 0xcb, 0xba, 0xe1, 0x65, 0x0d, 0xbc, 0x27, 0xe4, 0xe4, 0xf3, 0x4b,
++ 0xcc, 0x53, 0xf7, 0x3d, 0x91, 0xc0, 0x9b, 0xb9, 0x2c, 0xb6, 0x10, 0x9f,
++ 0x0f, 0x92, 0x97, 0x37, 0x72, 0xac, 0x63, 0x73, 0x06, 0x5e, 0xcf, 0xf9,
++ 0xb8, 0x4e, 0x13, 0x5e, 0xca, 0xc9, 0x33, 0xf2, 0x6c, 0x00, 0x7d, 0xe4,
++ 0xe5, 0xb5, 0x5c, 0x84, 0x6b, 0x86, 0xf1, 0x53, 0x3e, 0x77, 0xef, 0x9c,
++ 0xce, 0xba, 0xe5, 0xe3, 0xba, 0x51, 0xbc, 0x92, 0x0b, 0x90, 0xd7, 0x30,
++ 0x6b, 0x55, 0x1f, 0x46, 0x72, 0x8d, 0x17, 0x37, 0x30, 0x51, 0x3b, 0xb5,
++ 0x46, 0xae, 0xbd, 0x63, 0x75, 0xd9, 0xb1, 0x28, 0xeb, 0x94, 0xd6, 0xed,
++ 0xc3, 0x70, 0xee, 0x75, 0x77, 0xa9, 0x9f, 0x7e, 0x66, 0x7c, 0xc1, 0xc6,
++ 0x7e, 0x4f, 0x9b, 0xfc, 0x7d, 0x1a, 0x38, 0x67, 0x66, 0xad, 0xea, 0x14,
++ 0xb1, 0x2e, 0x6b, 0xd4, 0x5b, 0x6b, 0x9a, 0xb8, 0xae, 0xde, 0xfb, 0xa2,
++ 0x92, 0x7e, 0xc7, 0x83, 0xe8, 0x13, 0xa2, 0x2f, 0x62, 0xe6, 0x59, 0xe0,
++ 0x47, 0xc4, 0x9f, 0x0d, 0x63, 0x9a, 0xf8, 0x7d, 0x86, 0xb8, 0xa6, 0x7b,
++ 0x1e, 0xf5, 0x89, 0x07, 0x30, 0x64, 0x95, 0x11, 0x9f, 0x57, 0x13, 0xd7,
++ 0xce, 0x35, 0xb1, 0x4e, 0xad, 0xb1, 0xac, 0xbf, 0x6d, 0x86, 0xe5, 0x4a,
++ 0xe9, 0x46, 0xad, 0x7b, 0xfe, 0x2b, 0x55, 0xd0, 0x2f, 0x06, 0x95, 0x3e,
++ 0xff, 0x16, 0xe2, 0x03, 0xe7, 0x21, 0x7a, 0x05, 0x56, 0xcc, 0x79, 0xb0,
++ 0x92, 0xf2, 0x6c, 0x1c, 0xe3, 0xda, 0xc4, 0x27, 0x71, 0xca, 0xb4, 0x6d,
++ 0x8c, 0x98, 0x4b, 0x0f, 0x60, 0x39, 0x75, 0xdc, 0x7f, 0xca, 0xb2, 0xca,
++ 0xa9, 0xe3, 0x06, 0xda, 0x67, 0xcf, 0x09, 0x0b, 0x2f, 0x1a, 0x2f, 0x52,
++ 0xa7, 0x8a, 0xb8, 0xb1, 0x99, 0xef, 0x84, 0xf9, 0xbc, 0x0f, 0x7b, 0xc7,
++ 0xa4, 0x5f, 0xaa, 0xe3, 0x33, 0xaf, 0xe2, 0x58, 0x2e, 0x81, 0x26, 0xea,
++ 0x2f, 0x4a, 0x9a, 0x8d, 0x7c, 0x27, 0x4a, 0x7a, 0xd1, 0xb9, 0xaf, 0x61,
++ 0xf3, 0x29, 0x05, 0x3d, 0x2e, 0x3a, 0xf8, 0x1a, 0xda, 0xcf, 0x7c, 0x51,
++ 0x4e, 0x60, 0x96, 0x1a, 0xd7, 0x8e, 0xcc, 0x13, 0x7f, 0x57, 0xa5, 0x86,
++ 0xc0, 0xfa, 0x8d, 0x37, 0xa6, 0x14, 0x8e, 0x8f, 0xb3, 0xdf, 0x5b, 0x03,
++ 0xab, 0x82, 0x32, 0xbd, 0x3e, 0xf5, 0x3b, 0x78, 0xea, 0x24, 0xf5, 0xf0,
++ 0x64, 0x18, 0x3f, 0xc8, 0x79, 0xb0, 0xec, 0xb8, 0x60, 0x3a, 0x3d, 0xb1,
++ 0x4f, 0x49, 0x7f, 0x24, 0x7d, 0x4b, 0x3c, 0xea, 0x55, 0x2e, 0xd4, 0x3f,
++ 0xe5, 0x81, 0x7e, 0x2e, 0x0a, 0x6f, 0xbd, 0x0f, 0x7a, 0xfd, 0x1f, 0x32,
++ 0xd7, 0xb8, 0x50, 0xc6, 0x5e, 0x76, 0xd3, 0x77, 0x13, 0xbc, 0x16, 0xe6,
++ 0x35, 0xfc, 0x4e, 0x39, 0xdc, 0x4b, 0xdc, 0xac, 0xe1, 0x65, 0x3a, 0xf1,
++ 0x98, 0xc7, 0xb2, 0xdc, 0xac, 0x0d, 0x3b, 0xbe, 0x67, 0x59, 0xb1, 0xd5,
++ 0xf2, 0x7c, 0x08, 0xb1, 0x73, 0x3a, 0x9f, 0x73, 0xea, 0xe5, 0x75, 0x3c,
++ 0xe6, 0xa6, 0x1f, 0x49, 0xac, 0xb2, 0xde, 0xdb, 0x3d, 0x94, 0x83, 0xdb,
++ 0x9f, 0x2b, 0x08, 0xb6, 0x89, 0xda, 0x32, 0x9c, 0x1d, 0x57, 0xcc, 0xd9,
++ 0x29, 0x3e, 0xbb, 0x1e, 0xee, 0xa4, 0x76, 0x24, 0x4b, 0x3f, 0xd8, 0x15,
++ 0x6a, 0xc1, 0x33, 0xa6, 0x17, 0x95, 0xfa, 0x12, 0xdc, 0xdf, 0x1d, 0xc2,
++ 0x33, 0xec, 0x0b, 0x68, 0xb3, 0xc4, 0x3c, 0xd8, 0x48, 0x07, 0x49, 0xcf,
++ 0xf5, 0x63, 0xe8, 0xdf, 0x75, 0x31, 0xcf, 0xb9, 0xed, 0x3c, 0x57, 0x56,
++ 0x0f, 0xcc, 0xe7, 0x3d, 0xb8, 0xa0, 0x3b, 0x98, 0xf0, 0x39, 0xbb, 0x66,
++ 0x6b, 0xa1, 0xf9, 0x6b, 0x58, 0x50, 0x6b, 0x49, 0x2b, 0x32, 0x13, 0x14,
++ 0xdd, 0x65, 0x3c, 0x8e, 0x2f, 0xfd, 0x8d, 0x5b, 0x7a, 0x8e, 0xeb, 0x7f,
++ 0x57, 0xc0, 0x95, 0xd2, 0x22, 0x6d, 0x6e, 0xf8, 0x3c, 0xa9, 0xce, 0xd6,
++ 0x51, 0xfd, 0x4b, 0x37, 0xf0, 0xde, 0x84, 0x91, 0xc2, 0xf5, 0x5e, 0xbb,
++ 0x33, 0x67, 0xfb, 0x50, 0xa7, 0xe8, 0xfe, 0x31, 0x43, 0xf2, 0xec, 0xa0,
++ 0x6a, 0x67, 0xde, 0xca, 0x7a, 0x90, 0xad, 0xe2, 0x33, 0xd4, 0x3f, 0x0e,
++ 0x8f, 0x09, 0x9d, 0x83, 0x18, 0xcd, 0xc9, 0x6c, 0x63, 0x00, 0xeb, 0xcc,
++ 0x58, 0xe2, 0x22, 0x7b, 0xe8, 0x43, 0x90, 0x39, 0x44, 0xe3, 0xfc, 0xcb,
++ 0x4a, 0x1b, 0xbc, 0xc5, 0xad, 0xf5, 0x2f, 0x28, 0x27, 0x6f, 0xad, 0x28,
++ 0xe6, 0xad, 0xe5, 0xf9, 0x25, 0xc1, 0x2e, 0xd6, 0x83, 0xae, 0xd9, 0x52,
++ 0x7d, 0xe8, 0x52, 0x9b, 0xec, 0xda, 0x9a, 0x51, 0x5b, 0x67, 0x7d, 0xaa,
++ 0x63, 0xc2, 0x87, 0x97, 0x89, 0xc5, 0xa6, 0x7a, 0x10, 0x5a, 0xb6, 0x06,
++ 0xfe, 0xad, 0x13, 0xdd, 0x28, 0xd7, 0xa5, 0x87, 0x2c, 0xc7, 0x26, 0xbb,
++ 0xae, 0xd5, 0x05, 0xbb, 0x58, 0x7f, 0xba, 0x0a, 0x3d, 0xcc, 0x7f, 0x08,
++ 0xf9, 0x53, 0xce, 0xcc, 0x40, 0x72, 0xe1, 0xed, 0x7c, 0xf7, 0x62, 0x72,
++ 0x11, 0xe0, 0xd4, 0x3f, 0x95, 0x61, 0x2f, 0x51, 0xbd, 0x5a, 0xe1, 0xd2,
++ 0x9d, 0x3e, 0x90, 0x16, 0x7b, 0xfe, 0x7c, 0xeb, 0x85, 0xf1, 0x6e, 0xd5,
++ 0x31, 0x3d, 0xe3, 0xdf, 0x68, 0xca, 0x2c, 0x62, 0xca, 0xdf, 0x4e, 0x1e,
++ 0xda, 0x67, 0x9f, 0xf4, 0x6f, 0x20, 0x4f, 0x1b, 0x66, 0x3f, 0x4f, 0x53,
++ 0xea, 0x4a, 0x7f, 0x6b, 0x1b, 0x63, 0x7b, 0x87, 0xf1, 0x91, 0x15, 0xfd,
++ 0xa6, 0xd0, 0x99, 0x2b, 0xea, 0x33, 0x4d, 0xbe, 0xc2, 0xbe, 0x4d, 0x85,
++ 0x90, 0x2f, 0x5d, 0x68, 0xf7, 0xb7, 0x99, 0xdd, 0xfe, 0x0d, 0x66, 0x8f,
++ 0xbf, 0xdd, 0xdc, 0x49, 0xda, 0x5d, 0xfe, 0x0e, 0x93, 0x71, 0x5d, 0xe8,
++ 0xa1, 0x5e, 0xbb, 0x31, 0x5a, 0xd8, 0x49, 0xec, 0x21, 0x34, 0x7b, 0x89,
++ 0x83, 0xfc, 0x94, 0x71, 0x88, 0x32, 0xce, 0x47, 0xbc, 0x48, 0x6b, 0x5e,
++ 0xea, 0x6b, 0xc4, 0xb6, 0xe3, 0x11, 0x7b, 0x16, 0x55, 0x91, 0x7a, 0xa0,
++ 0x75, 0xcb, 0x09, 0xe6, 0xfb, 0xd4, 0x9e, 0xd6, 0x65, 0xa7, 0x50, 0xe3,
++ 0x4d, 0x49, 0xef, 0xcc, 0x7e, 0x38, 0x1e, 0x37, 0xde, 0x43, 0x3c, 0xf2,
++ 0x32, 0x9f, 0x1d, 0xa6, 0xef, 0x8e, 0xd8, 0xf3, 0x07, 0x1a, 0x24, 0xdf,
++ 0x84, 0x2d, 0xa6, 0xcf, 0xbf, 0x8d, 0xbd, 0x59, 0x30, 0xa5, 0xb5, 0xdc,
++ 0xee, 0x96, 0x79, 0xc8, 0xfc, 0xef, 0x05, 0xd0, 0x84, 0xce, 0x82, 0x8f,
++ 0x72, 0x7d, 0x09, 0x7f, 0x7f, 0x92, 0x75, 0x0d, 0xe2, 0x87, 0x96, 0x75,
++ 0x2f, 0xfb, 0x9a, 0xa3, 0xf9, 0x3a, 0x5c, 0xb6, 0x6d, 0xec, 0xc1, 0xe1,
++ 0x7c, 0x14, 0xef, 0x50, 0x3e, 0xcf, 0x5c, 0x2d, 0xde, 0x1e, 0x77, 0x63,
++ 0xb7, 0x71, 0x5b, 0xb1, 0x5e, 0xb8, 0x70, 0x4f, 0xe2, 0x00, 0xb1, 0x83,
++ 0x0b, 0xd5, 0xc4, 0x6f, 0x0f, 0xda, 0xd7, 0xdc, 0xec, 0xff, 0xbe, 0x8e,
++ 0x41, 0xa7, 0x9e, 0x90, 0xc7, 0x9d, 0xe4, 0xb1, 0xd9, 0xbf, 0x61, 0x42,
++ 0xf3, 0xdf, 0x31, 0x01, 0x9f, 0x37, 0xb5, 0xab, 0xf5, 0xcc, 0x49, 0x0b,
++ 0x7d, 0xc6, 0xad, 0xb8, 0x72, 0x72, 0xb8, 0xdf, 0x43, 0xff, 0xf9, 0x65,
++ 0x32, 0x03, 0x73, 0x12, 0x17, 0x88, 0x3c, 0x5e, 0x0d, 0x30, 0xb7, 0x37,
++ 0x24, 0xe3, 0x21, 0xd6, 0x62, 0x63, 0x96, 0xb1, 0xd9, 0x01, 0xad, 0x9f,
++ 0x35, 0x39, 0xed, 0x4e, 0xc5, 0x7b, 0x47, 0x08, 0x1e, 0xab, 0xc8, 0x8f,
++ 0x9f, 0xb9, 0x3b, 0x30, 0x17, 0xf5, 0xef, 0x60, 0xbd, 0x89, 0xb0, 0xbf,
++ 0xf3, 0xc7, 0x71, 0x5b, 0x2d, 0xe2, 0x89, 0x05, 0xca, 0xed, 0x9d, 0x6b,
++ 0xf2, 0xdf, 0xce, 0xfa, 0x71, 0x39, 0x6e, 0x0d, 0xbd, 0x68, 0x04, 0x10,
++ 0x9c, 0x33, 0xa8, 0xef, 0x0c, 0x86, 0x67, 0xd9, 0x72, 0xc5, 0xd9, 0xf3,
++ 0xcf, 0xb5, 0xf8, 0xb7, 0x31, 0x36, 0xab, 0x68, 0xa2, 0xc6, 0xb9, 0xb4,
++ 0x5f, 0x7a, 0xbe, 0xa6, 0xb9, 0xb5, 0xe4, 0x4f, 0x7c, 0x74, 0x5f, 0xeb,
++ 0x3a, 0xfa, 0x43, 0x74, 0x0e, 0x9b, 0x98, 0xe6, 0x5e, 0x22, 0xcd, 0x4c,
++ 0x84, 0x18, 0x76, 0xef, 0x9a, 0x00, 0xf3, 0x94, 0xe8, 0x92, 0x7a, 0x2c,
++ 0x94, 0x64, 0x92, 0xba, 0xbc, 0xa7, 0x75, 0xee, 0x94, 0xd4, 0xe5, 0x4c,
++ 0x6b, 0xee, 0x94, 0x8e, 0x77, 0x58, 0x5b, 0x56, 0x24, 0x35, 0xe3, 0x9c,
++ 0x8a, 0x45, 0x5e, 0xa5, 0x2c, 0x1e, 0xfc, 0xca, 0xda, 0xa5, 0xc7, 0xe7,
++ 0x6f, 0x61, 0x3c, 0x55, 0x33, 0x37, 0x46, 0x98, 0xf3, 0xab, 0xe7, 0xa8,
++ 0x98, 0x39, 0xb7, 0x17, 0x15, 0x11, 0xf8, 0xe2, 0x3a, 0xde, 0x3d, 0x99,
++ 0xa0, 0x1e, 0xae, 0xd1, 0xdc, 0x47, 0xa8, 0xd5, 0xc7, 0x52, 0xf8, 0xc8,
++ 0x53, 0xf4, 0xc5, 0x51, 0xae, 0x5b, 0x36, 0x27, 0x3c, 0xcb, 0xf3, 0x61,
++ 0x3e, 0x7f, 0x7d, 0xed, 0x6a, 0xae, 0xfd, 0xd1, 0x29, 0xf1, 0xd7, 0x4c,
++ 0xeb, 0x85, 0x93, 0xce, 0xda, 0xf1, 0x64, 0x02, 0x1f, 0x9e, 0xd4, 0x06,
++ 0xde, 0x55, 0xb1, 0xde, 0x0b, 0x4a, 0xd6, 0x47, 0x5d, 0x15, 0xae, 0x58,
++ 0xc3, 0xf1, 0xf8, 0xe0, 0x2e, 0xd2, 0x6c, 0x59, 0x4b, 0xfd, 0xdb, 0x7c,
++ 0xd0, 0xe7, 0x99, 0x67, 0xbd, 0xe4, 0xc7, 0xe1, 0xa5, 0x8e, 0xb4, 0x4f,
++ 0x16, 0x7b, 0x35, 0xf6, 0xa9, 0xd7, 0xf9, 0x09, 0x53, 0x0f, 0xbe, 0x1d,
++ 0xcd, 0x01, 0xd4, 0xda, 0xcf, 0x85, 0xf8, 0x9c, 0xe8, 0xe1, 0xd7, 0xca,
++ 0xa5, 0xbf, 0xc7, 0x3c, 0x26, 0xb9, 0x24, 0xcc, 0x1c, 0xb6, 0x53, 0x7a,
++ 0xda, 0x6c, 0x96, 0xfe, 0xee, 0xa5, 0xbf, 0x6f, 0x14, 0x9f, 0x36, 0xe9,
++ 0xd3, 0x26, 0x7d, 0xda, 0xd4, 0x22, 0x03, 0x88, 0x85, 0xfa, 0x68, 0xb7,
++ 0x74, 0x44, 0x7c, 0xbd, 0x07, 0xbb, 0xf9, 0xd9, 0xc3, 0xfb, 0x87, 0xd9,
++ 0xe7, 0x62, 0x91, 0xac, 0x79, 0x10, 0xed, 0xe6, 0x23, 0xe8, 0x9f, 0xc0,
++ 0x6f, 0xfc, 0xcd, 0xe5, 0x28, 0x5f, 0x2e, 0x3d, 0xbc, 0x16, 0x3a, 0x8a,
++ 0x47, 0xd8, 0x47, 0xfd, 0x5a, 0x55, 0xea, 0x9e, 0xee, 0x63, 0x4a, 0x0b,
++ 0xb5, 0xb3, 0x1f, 0xde, 0x55, 0xd8, 0x49, 0xfb, 0xc6, 0xfa, 0x5f, 0x56,
++ 0xec, 0xa5, 0x6a, 0xb9, 0x36, 0x63, 0xe9, 0x0e, 0xae, 0x63, 0x0a, 0x1f,
++ 0x76, 0xbe, 0xfd, 0x7d, 0x88, 0x6e, 0x7f, 0xd2, 0xd0, 0xc7, 0xf5, 0x1d,
++ 0x3e, 0x86, 0xd9, 0x53, 0xf6, 0x31, 0xc6, 0x76, 0xdb, 0xf1, 0xd5, 0x43,
++ 0x1a, 0xd7, 0xf3, 0xd8, 0x86, 0x9c, 0xd4, 0x52, 0x0b, 0x8f, 0x1a, 0x16,
++ 0x9e, 0xe6, 0xe7, 0x22, 0x73, 0xd9, 0xc8, 0x0d, 0xb9, 0xcc, 0xc5, 0xe7,
++ 0x76, 0xf0, 0xb9, 0x16, 0xa6, 0xce, 0xd9, 0x69, 0x99, 0x0d, 0x1e, 0x94,
++ 0xd9, 0x20, 0xf2, 0xa6, 0xe8, 0x7e, 0x00, 0x17, 0x72, 0xb1, 0x41, 0xb7,
++ 0xdb, 0x1a, 0x62, 0x5c, 0x5d, 0xfc, 0x88, 0xbe, 0xfb, 0xda, 0x1a, 0xad,
++ 0x9b, 0x3a, 0x4c, 0x8c, 0x29, 0x2d, 0xf2, 0x33, 0xcc, 0x6f, 0xf2, 0xa1,
++ 0x31, 0xba, 0xd2, 0x1d, 0x0f, 0x9d, 0x85, 0x36, 0xdf, 0x47, 0x49, 0x9f,
++ 0x2c, 0x38, 0xb9, 0x6e, 0x5d, 0x31, 0xd7, 0xb5, 0xe4, 0x2b, 0xd4, 0x1d,
++ 0x13, 0xac, 0xcf, 0xd3, 0x56, 0x36, 0xc8, 0x7a, 0x55, 0x98, 0x16, 0xda,
++ 0x43, 0x68, 0x4c, 0x0a, 0x2d, 0xbd, 0x73, 0x4c, 0xe1, 0x1b, 0x95, 0x88,
++ 0xb3, 0x56, 0xc1, 0x28, 0xd7, 0xb3, 0x16, 0x6b, 0x52, 0xc8, 0x9b, 0x92,
++ 0xda, 0xd9, 0xc5, 0xbe, 0xa5, 0x87, 0x79, 0x51, 0x30, 0xb5, 0xcc, 0x4b,
++ 0x9d, 0x7c, 0xb4, 0xb1, 0x20, 0x76, 0x11, 0x9b, 0x88, 0x6d, 0x0e, 0xe2,
++ 0x1e, 0x53, 0x7a, 0x7f, 0x0b, 0xe3, 0x46, 0x3c, 0xfa, 0x14, 0xc4, 0x4e,
++ 0x07, 0xa9, 0x0b, 0x2f, 0x76, 0x33, 0x0f, 0xee, 0x6a, 0xa6, 0xae, 0x82,
++ 0x5e, 0xec, 0xb2, 0x67, 0x09, 0x25, 0xfd, 0x79, 0x69, 0x43, 0xc5, 0x1a,
++ 0x37, 0xeb, 0x75, 0xf4, 0xe8, 0xcc, 0x26, 0xdd, 0x29, 0xa1, 0x57, 0x9a,
++ 0x4b, 0x3a, 0xba, 0xdb, 0x94, 0x13, 0xba, 0x16, 0xce, 0x1a, 0x0e, 0x6e,
++ 0x2d, 0xe9, 0x2c, 0x42, 0xb9, 0x6a, 0xd6, 0x02, 0x2b, 0x6f, 0xc0, 0xae,
++ 0x15, 0xbc, 0xb6, 0xe5, 0x3a, 0x76, 0xcd, 0x08, 0x3e, 0x26, 0x76, 0xed,
++ 0xdc, 0x4a, 0xec, 0x5a, 0xaf, 0x4a, 0xb8, 0x55, 0xe6, 0x12, 0x25, 0xec,
++ 0x5a, 0x5d, 0xcc, 0xd1, 0x07, 0xb1, 0x8b, 0xb8, 0xa6, 0xb6, 0x7e, 0x08,
++ 0xbe, 0x55, 0xae, 0xcf, 0x5c, 0x18, 0x62, 0xbf, 0x52, 0x06, 0x2c, 0xb6,
++ 0x70, 0xcb, 0xea, 0xac, 0x55, 0xae, 0xd7, 0x47, 0xcb, 0x5d, 0x32, 0x77,
++ 0x8e, 0x67, 0x47, 0x98, 0x4b, 0x5c, 0xab, 0xb4, 0x6c, 0x1a, 0xbe, 0x50,
++ 0x8d, 0xbe, 0xb3, 0xd8, 0x2f, 0x44, 0x7c, 0x9b, 0x89, 0x7b, 0xe2, 0xc9,
++ 0x4f, 0xad, 0xa9, 0xb0, 0xd0, 0x98, 0x9f, 0xf7, 0x21, 0xfd, 0x90, 0x8f,
++ 0x75, 0x68, 0x41, 0x1d, 0xc1, 0x6b, 0xf1, 0x88, 0x6f, 0x5b, 0x21, 0xeb,
++ 0xdf, 0xd2, 0x70, 0x0b, 0xba, 0x4e, 0x49, 0xcd, 0x89, 0x62, 0xeb, 0xa9,
++ 0x76, 0xd6, 0x19, 0x1d, 0x1d, 0x63, 0x9d, 0xec, 0xe3, 0xba, 0x55, 0xf7,
++ 0xb4, 0xe8, 0x49, 0xf4, 0xac, 0x85, 0xa2, 0xae, 0x1b, 0xe7, 0xa2, 0xa5,
++ 0x9e, 0xf8, 0x3d, 0xdb, 0x87, 0x46, 0x8d, 0x10, 0xf5, 0xf3, 0x2b, 0x2f,
++ 0x82, 0x16, 0xce, 0x18, 0xe2, 0x7b, 0xfc, 0xdb, 0x4c, 0x63, 0x63, 0xf3,
++ 0xb8, 0xe5, 0xd1, 0x65, 0xbe, 0x1d, 0xb1, 0xed, 0xb6, 0x81, 0xb5, 0xac,
++ 0x7d, 0xba, 0x87, 0xb6, 0x2a, 0xcd, 0xb2, 0x6f, 0xb4, 0xd9, 0x7a, 0xff,
++ 0x46, 0xe6, 0x35, 0xf6, 0xe9, 0x3e, 0x1f, 0x73, 0xa5, 0xef, 0x94, 0x85,
++ 0x69, 0xe3, 0x4d, 0xeb, 0x51, 0xdd, 0x43, 0xbb, 0x7c, 0x95, 0x79, 0x57,
++ 0x70, 0x49, 0xca, 0x7f, 0xfb, 0xa4, 0xc7, 0x55, 0x95, 0x42, 0x73, 0x19,
++ 0x7d, 0xee, 0xd5, 0xa4, 0x33, 0x73, 0x3c, 0x96, 0xbf, 0xcd, 0xbf, 0x65,
++ 0x82, 0xbd, 0x04, 0x7b, 0x5d, 0xa7, 0xbf, 0xfb, 0xaa, 0xff, 0xee, 0x09,
++ 0xb7, 0xaa, 0x4d, 0xc1, 0xdd, 0xb2, 0xd6, 0xc2, 0xc7, 0xab, 0xe3, 0x83,
++ 0x11, 0x17, 0x73, 0x24, 0x69, 0x99, 0xf9, 0x66, 0x7f, 0x86, 0x39, 0x79,
++ 0xdb, 0x04, 0xd2, 0x32, 0x9f, 0x0d, 0xae, 0x1e, 0xee, 0x0d, 0x42, 0x66,
++ 0x69, 0xf8, 0x06, 0xa3, 0x32, 0x4c, 0x9f, 0x8b, 0xb4, 0xa9, 0xf8, 0x42,
++ 0x3f, 0xe2, 0x17, 0x3f, 0x76, 0xbf, 0x69, 0x3d, 0x9e, 0x5f, 0xcb, 0xe7,
++ 0x3b, 0x99, 0x2f, 0xd3, 0xcc, 0x9f, 0xc3, 0x83, 0x5e, 0xc8, 0x3b, 0x5a,
++ 0xe6, 0x0d, 0x15, 0xa3, 0xaf, 0xe3, 0x9b, 0x7c, 0x3e, 0xd4, 0xc1, 0x5c,
++ 0x39, 0x6d, 0xc4, 0xd3, 0x1b, 0x90, 0xed, 0xac, 0x86, 0x66, 0x34, 0x28,
++ 0x99, 0x7d, 0x89, 0x1d, 0x12, 0xf8, 0x39, 0xd7, 0xf4, 0xe8, 0xa2, 0xc7,
++ 0xf5, 0xe8, 0x9b, 0x66, 0xfd, 0xbf, 0xe6, 0x6f, 0xa2, 0x03, 0xd1, 0xcb,
++ 0x37, 0xcb, 0x50, 0xb1, 0x88, 0xb2, 0xfd, 0xdc, 0xce, 0x2b, 0x7e, 0x5d,
++ 0xc7, 0x7f, 0x26, 0x3e, 0xfa, 0x4f, 0x05, 0x99, 0x71, 0x96, 0x30, 0x9f,
++ 0xdd, 0x47, 0xb5, 0x2e, 0x9b, 0x4a, 0x14, 0x67, 0x9e, 0x3e, 0x7f, 0xe7,
++ 0xa4, 0x85, 0x93, 0x46, 0x10, 0xd2, 0xe3, 0x97, 0x27, 0xe7, 0x89, 0x00,
++ 0x9a, 0xd0, 0xc1, 0xeb, 0xed, 0x93, 0x95, 0xaa, 0x7d, 0xc2, 0xc2, 0x5f,
++ 0x18, 0x5a, 0xb6, 0xcd, 0xcd, 0x98, 0x36, 0xb4, 0xb3, 0xc0, 0x3b, 0xc4,
++ 0x4a, 0xe2, 0x63, 0x1e, 0x04, 0x74, 0x87, 0x56, 0xd3, 0xd4, 0x6d, 0xc4,
++ 0x0f, 0x12, 0x63, 0xee, 0x15, 0x15, 0x48, 0xaa, 0x29, 0x8f, 0xe8, 0xad,
++ 0x13, 0xe9, 0x42, 0xa5, 0xda, 0x4e, 0x5d, 0xde, 0xb1, 0xaa, 0x0c, 0x97,
++ 0x6c, 0x5d, 0xde, 0x46, 0x5d, 0xe2, 0xf5, 0xa5, 0x70, 0x5f, 0xa8, 0x45,
++ 0xa7, 0x82, 0xdd, 0x9f, 0x55, 0xb2, 0x4e, 0xa7, 0x89, 0x6f, 0x89, 0x07,
++ 0x43, 0x3d, 0xf8, 0x2e, 0xf3, 0xcd, 0xa3, 0xf4, 0xd5, 0x5f, 0xe9, 0x4d,
++ 0xa8, 0xf8, 0x5e, 0x33, 0xed, 0xb8, 0xd6, 0xbf, 0x79, 0x22, 0x83, 0xc7,
++ 0x66, 0x2d, 0x3c, 0xc5, 0x38, 0x69, 0x48, 0x66, 0x43, 0xe5, 0xec, 0xd7,
++ 0x58, 0xd3, 0x16, 0x4e, 0xd8, 0x7e, 0xbe, 0xab, 0x75, 0xfd, 0x4c, 0x04,
++ 0xee, 0xef, 0xca, 0xef, 0x3b, 0x5b, 0xa3, 0x33, 0xf2, 0x9d, 0xe1, 0xb7,
++ 0x85, 0x01, 0x43, 0x4b, 0x7f, 0xec, 0xae, 0x40, 0x65, 0xdc, 0xb2, 0x06,
++ 0x92, 0x72, 0xbd, 0xaf, 0x35, 0x61, 0xdf, 0xdf, 0xc3, 0xef, 0xd2, 0x4c,
++ 0xfa, 0x6f, 0x04, 0x0b, 0x46, 0xd3, 0x94, 0x79, 0x2b, 0xeb, 0x7b, 0x86,
++ 0xf5, 0xbd, 0x36, 0xa5, 0xa5, 0x77, 0xb8, 0x65, 0xfe, 0x32, 0x7f, 0xa0,
++ 0x9a, 0xd7, 0x6f, 0x2f, 0xd6, 0xf7, 0xaa, 0x53, 0x32, 0xd3, 0x23, 0x06,
++ 0x84, 0xb3, 0x17, 0xd2, 0xc5, 0xfa, 0x5e, 0x31, 0xe6, 0xc1, 0x16, 0xd6,
++ 0x76, 0x2f, 0xb1, 0xf8, 0xc6, 0x7c, 0x2d, 0xfc, 0x27, 0xdc, 0x88, 0x25,
++ 0x7f, 0x82, 0x03, 0xf4, 0xb1, 0x03, 0x09, 0xb7, 0x8a, 0x2e, 0x71, 0x51,
++ 0x4f, 0xff, 0x88, 0x7d, 0x21, 0x37, 0xaa, 0xf4, 0x9f, 0xe1, 0x81, 0x2f,
++ 0xa8, 0xe9, 0x99, 0x09, 0x89, 0xed, 0x5d, 0xad, 0x5b, 0x4e, 0x39, 0x35,
++ 0x3d, 0x70, 0x6a, 0x78, 0x41, 0x6a, 0x7a, 0xed, 0xea, 0x0c, 0x4e, 0x4f,
++ 0xe2, 0x3b, 0x4b, 0x09, 0x1e, 0x6b, 0xb9, 0x66, 0x7d, 0x32, 0xce, 0xde,
++ 0x5a, 0xeb, 0xef, 0x50, 0xf1, 0x23, 0x55, 0xcc, 0x01, 0xa7, 0x59, 0xd3,
++ 0x7d, 0xa9, 0x78, 0x28, 0xe1, 0x42, 0x97, 0x97, 0xf6, 0x78, 0x9f, 0x7d,
++ 0xf6, 0x5b, 0xf9, 0x28, 0x69, 0x96, 0xc1, 0xc3, 0x9a, 0xfe, 0xbe, 0x8e,
++ 0xcf, 0xdc, 0xf4, 0xbd, 0x77, 0xdc, 0x3e, 0x5c, 0xcd, 0x3b, 0x35, 0xbd,
++ 0xba, 0xc1, 0x1a, 0xba, 0x9c, 0x0c, 0xe0, 0x4a, 0xde, 0xa0, 0x0f, 0x66,
++ 0x70, 0x98, 0x35, 0xfd, 0xb2, 0x1e, 0xc2, 0x87, 0xf9, 0x16, 0xfa, 0x65,
++ 0x18, 0xbf, 0x24, 0xfe, 0x5d, 0xc5, 0x9a, 0x7e, 0x27, 0x7d, 0x2a, 0xc9,
++ 0x9a, 0xde, 0x66, 0xe3, 0x8d, 0x7d, 0xad, 0x67, 0xc6, 0xed, 0x9a, 0xde,
++ 0xe0, 0x62, 0x3d, 0xf4, 0x22, 0xbe, 0xc0, 0x3c, 0x61, 0xfd, 0x6a, 0x6d,
++ 0x80, 0xcf, 0x52, 0x6f, 0x85, 0xd5, 0x98, 0xb2, 0x6b, 0xd0, 0x7a, 0xff,
++ 0x76, 0xae, 0xbd, 0xd8, 0x8e, 0x33, 0x0b, 0x5b, 0x57, 0xbd, 0x86, 0x3f,
++ 0xaa, 0x71, 0xd1, 0x0f, 0x53, 0xfe, 0x3b, 0x18, 0x6b, 0xc1, 0x54, 0x69,
++ 0xe6, 0x91, 0xe0, 0x3a, 0xb7, 0xf9, 0xef, 0xa4, 0x6f, 0xdc, 0xb2, 0x8a,
++ 0x99, 0x24, 0xe4, 0xc4, 0x59, 0x3b, 0xe3, 0x2c, 0xc2, 0x38, 0x5b, 0xca,
++ 0x38, 0x7b, 0xdc, 0x88, 0x27, 0xd6, 0x13, 0x77, 0xbd, 0x9c, 0x97, 0x58,
++ 0x6b, 0x26, 0x5d, 0x8d, 0x72, 0x0d, 0xf7, 0x4a, 0xcc, 0x6c, 0x5d, 0x35,
++ 0x7c, 0xb6, 0x12, 0xa2, 0x2b, 0x7c, 0xb6, 0x98, 0x18, 0x83, 0x99, 0xe9,
++ 0xe2, 0x82, 0x3b, 0x3e, 0x78, 0xab, 0x3b, 0x3e, 0xf0, 0x9e, 0x7a, 0xd3,
++ 0x7a, 0x9d, 0x71, 0xb6, 0x8d, 0x71, 0xb6, 0x9d, 0x71, 0xd6, 0x66, 0x5a,
++ 0x78, 0x2e, 0xa9, 0x65, 0x9a, 0x5c, 0x31, 0xa3, 0xcd, 0x85, 0xa5, 0x95,
++ 0x2c, 0x0d, 0x7e, 0xc4, 0x3b, 0xff, 0x88, 0xfc, 0x5f, 0x34, 0xe2, 0xdd,
++ 0x09, 0x25, 0xb1, 0x15, 0xc5, 0x07, 0x94, 0xbb, 0xbc, 0x18, 0x5b, 0x7b,
++ 0xa7, 0xcf, 0x17, 0x7d, 0xa3, 0x24, 0xbb, 0x1b, 0xcf, 0x1a, 0xcc, 0xa5,
++ 0x8b, 0xb4, 0x68, 0xd6, 0xd5, 0x83, 0x23, 0xd4, 0xa3, 0x3f, 0xde, 0x83,
++ 0xa3, 0xac, 0x87, 0xf7, 0xb2, 0x0e, 0xdf, 0x67, 0xc6, 0x5a, 0x36, 0xb3,
++ 0xff, 0xb9, 0x14, 0xd1, 0xa2, 0x51, 0xd5, 0x83, 0x3e, 0xfa, 0x70, 0x1f,
++ 0xeb, 0x46, 0x9b, 0xf9, 0x6b, 0xd5, 0x41, 0xac, 0xb0, 0xa7, 0x20, 0xef,
++ 0x69, 0x89, 0x5e, 0x57, 0x3f, 0x7a, 0x67, 0x25, 0xb7, 0x21, 0x74, 0x53,
++ 0xaa, 0x07, 0xc7, 0xcd, 0x32, 0xf4, 0x34, 0x77, 0xa9, 0xdb, 0x0b, 0x32,
++ 0x7f, 0x63, 0x3c, 0x9a, 0x8c, 0x57, 0x9b, 0x5f, 0x85, 0x7c, 0xbc, 0x0b,
++ 0x39, 0x89, 0x4f, 0x73, 0xbb, 0xba, 0x73, 0x5a, 0x62, 0xbc, 0x47, 0xf5,
++ 0x48, 0x0c, 0x9b, 0x83, 0xea, 0x2e, 0x89, 0x69, 0x7b, 0x66, 0x2d, 0x71,
++ 0x2f, 0x7b, 0x1a, 0xb7, 0x11, 0xc7, 0x81, 0x31, 0xe5, 0xfe, 0x5e, 0x84,
++ 0x71, 0xd7, 0x56, 0xe6, 0xa2, 0x9f, 0xc6, 0x68, 0x3b, 0x17, 0xda, 0x8d,
++ 0xdf, 0xb1, 0xb2, 0xa1, 0x5e, 0xc6, 0x54, 0x0f, 0x0e, 0x9b, 0x5f, 0xb6,
++ 0x2e, 0xdb, 0xf8, 0xa4, 0x94, 0xd7, 0xd7, 0xe3, 0x9e, 0x89, 0x25, 0xf0,
++ 0xe9, 0x52, 0xb7, 0x03, 0x48, 0xd4, 0xf8, 0x50, 0xa1, 0x4b, 0xbd, 0xd9,
++ 0xd7, 0x3a, 0x77, 0x42, 0x49, 0xff, 0x51, 0x8c, 0xef, 0xf5, 0xb8, 0x9f,
++ 0x79, 0x60, 0x77, 0xf2, 0x1e, 0xdc, 0x17, 0xaa, 0x40, 0x90, 0x7a, 0xda,
++ 0x1f, 0x0a, 0x30, 0xbf, 0xfe, 0x7e, 0x91, 0xce, 0xb3, 0x65, 0xc5, 0xbe,
++ 0xfa, 0x1a, 0xb6, 0xaa, 0x65, 0x8c, 0xad, 0x9b, 0x94, 0x39, 0x51, 0xa6,
++ 0x35, 0x32, 0xa9, 0x23, 0xc8, 0x7e, 0x76, 0x7d, 0x52, 0x1b, 0x5c, 0xef,
++ 0x8e, 0x49, 0xaf, 0x92, 0x0b, 0x12, 0xd7, 0xe5, 0xe3, 0xf1, 0xee, 0x26,
++ 0xd1, 0xb1, 0x1e, 0xc1, 0x26, 0xea, 0x69, 0x4b, 0x3e, 0xcc, 0x18, 0x5a,
++ 0x28, 0x13, 0x8c, 0x94, 0xce, 0x5f, 0xa7, 0x15, 0x21, 0xad, 0xc8, 0xa4,
++ 0xe0, 0xb5, 0x0c, 0xf1, 0x9a, 0xce, 0x38, 0xb4, 0xac, 0x75, 0xc4, 0x69,
++ 0x81, 0x53, 0x32, 0x6f, 0x8a, 0x1d, 0x21, 0xb6, 0x6d, 0x22, 0xee, 0xed,
++ 0xa1, 0x57, 0x5b, 0xb7, 0xd4, 0xc7, 0x8d, 0x36, 0x85, 0x47, 0x66, 0x9a,
++ 0xe1, 0x73, 0x93, 0xe6, 0x3b, 0xf9, 0x10, 0x2e, 0xe7, 0x23, 0x78, 0x9b,
++ 0xb4, 0x2f, 0xd9, 0xb4, 0xeb, 0xf0, 0x8b, 0x62, 0xde, 0x4a, 0x32, 0x6f,
++ 0x6d, 0x98, 0x50, 0xf4, 0xd7, 0x28, 0x86, 0x8c, 0xbf, 0xfe, 0xec, 0xd2,
++ 0xcd, 0x3e, 0xea, 0x4d, 0x64, 0xf1, 0xf0, 0x7b, 0x14, 0xfb, 0xed, 0x3c,
++ 0xfd, 0xda, 0x67, 0x53, 0x35, 0xb4, 0x15, 0x75, 0x5f, 0x5d, 0x7c, 0x6f,
++ 0xe5, 0x54, 0xa1, 0x28, 0xaf, 0x0e, 0xd7, 0xa9, 0x04, 0xca, 0x4e, 0x5d,
++ 0xe3, 0x55, 0x97, 0xf8, 0x60, 0x65, 0x7d, 0xe4, 0xfb, 0x5c, 0xff, 0x21,
++ 0x62, 0x3e, 0x8b, 0xeb, 0x5f, 0xb5, 0xd7, 0x0d, 0x73, 0x5d, 0x75, 0x0d,
++ 0x1f, 0x46, 0xae, 0xbd, 0x13, 0xa2, 0xec, 0x78, 0x38, 0x42, 0xdd, 0x5d,
++ 0x59, 0x23, 0xcf, 0x05, 0x70, 0x7b, 0x7e, 0x55, 0xb9, 0xe4, 0x71, 0x3f,
++ 0xfb, 0x01, 0xc7, 0x97, 0x88, 0xf7, 0xcc, 0xe7, 0x79, 0x4f, 0xf0, 0xd7,
++ 0x7a, 0x62, 0x8d, 0xcf, 0xeb, 0x3d, 0x4c, 0x5b, 0x94, 0xd1, 0x78, 0x72,
++ 0xef, 0x8b, 0xea, 0xe8, 0x9f, 0x61, 0x90, 0xbd, 0xd0, 0x43, 0x13, 0x59,
++ 0xec, 0x9f, 0xf8, 0x63, 0x7b, 0x8f, 0x6e, 0xe5, 0x6a, 0xec, 0xe1, 0x9a,
++ 0xfb, 0xaa, 0x19, 0x47, 0xff, 0x2d, 0x19, 0x17, 0x8c, 0xb4, 0xbd, 0x12,
++ 0x52, 0x6b, 0xe3, 0x2d, 0xb7, 0x2a, 0x0b, 0x65, 0x49, 0x0c, 0xb4, 0x37,
++ 0xc7, 0x13, 0x97, 0xf1, 0x88, 0x25, 0xf3, 0x6e, 0x77, 0xb1, 0xee, 0x12,
++ 0x97, 0xaa, 0x76, 0xd6, 0xde, 0xb6, 0x22, 0x56, 0xda, 0x50, 0x78, 0xf3,
++ 0x73, 0x33, 0x05, 0xe9, 0xc7, 0xa5, 0xde, 0xf8, 0x55, 0x1b, 0xd7, 0x39,
++ 0xcc, 0x9c, 0xfd, 0xac, 0xf1, 0x62, 0x84, 0xd5, 0x18, 0x9e, 0x55, 0x0a,
++ 0x07, 0x0c, 0x2f, 0xb2, 0x61, 0x0b, 0xdb, 0xf9, 0xbd, 0x97, 0xf8, 0xe9,
++ 0x5d, 0xa3, 0x0a, 0x53, 0xa1, 0x10, 0x31, 0x23, 0x73, 0xb0, 0xeb, 0xff,
++ 0x78, 0x65, 0x5f, 0x27, 0xea, 0x92, 0x3d, 0xf8, 0x7f, 0x6d, 0x5f, 0x66,
++ 0x15, 0xf1, 0x8b, 0xc8, 0xee, 0x57, 0xcc, 0xa1, 0x09, 0x10, 0xd3, 0xec,
++ 0x32, 0xe6, 0xa3, 0x2e, 0xa4, 0xaf, 0xba, 0xa0, 0x9d, 0x7e, 0x87, 0x7d,
++ 0xde, 0x43, 0xf5, 0xda, 0xe9, 0x56, 0xb7, 0x8e, 0xc1, 0xe3, 0x3e, 0x3c,
++ 0x78, 0xbc, 0x03, 0xd5, 0xf6, 0x7c, 0x68, 0x94, 0x3a, 0x75, 0xb1, 0xbf,
++ 0x1a, 0xfe, 0xd4, 0xc3, 0x3e, 0xeb, 0xea, 0xea, 0x87, 0xd1, 0x62, 0x5f,
++ 0x1f, 0xc1, 0x9e, 0x09, 0xbf, 0xda, 0x32, 0xe1, 0x41, 0xc7, 0x9d, 0x0f,
++ 0xc3, 0xbb, 0xaa, 0x97, 0x7c, 0xc9, 0x75, 0xf9, 0xfd, 0x2e, 0xf6, 0x67,
++ 0xc2, 0x5f, 0x19, 0xa2, 0x4b, 0xc8, 0xdb, 0x2a, 0x1d, 0x43, 0xc7, 0x3d,
++ 0x6a, 0x87, 0xf9, 0x37, 0xd6, 0x55, 0x7b, 0xcf, 0x47, 0xae, 0x55, 0xc8,
++ 0x59, 0x00, 0x3e, 0x23, 0x39, 0xa7, 0x0f, 0x13, 0x8c, 0xed, 0xbb, 0xec,
++ 0xf7, 0x8f, 0x97, 0x39, 0x32, 0xa5, 0xd9, 0xb7, 0xb6, 0xd3, 0x7e, 0xf2,
++ 0x4c, 0x6b, 0xf1, 0xda, 0x7a, 0x9f, 0x73, 0xde, 0x40, 0x7c, 0xa1, 0x0f,
++ 0xcb, 0x68, 0x84, 0xfa, 0xb8, 0x5d, 0xa7, 0x50, 0x9f, 0x67, 0x42, 0x5d,
++ 0xe2, 0xf0, 0xfb, 0x80, 0x39, 0xcf, 0x9e, 0x53, 0x67, 0xde, 0xa4, 0xee,
++ 0x16, 0xcb, 0xfb, 0x55, 0xbe, 0xdf, 0x7e, 0x5f, 0xf2, 0x2d, 0xb1, 0x66,
++ 0x50, 0x30, 0xe7, 0x17, 0xdd, 0xff, 0x5d, 0xc8, 0x3d, 0x8f, 0xfe, 0xa7,
++ 0x8c, 0xe3, 0x78, 0x77, 0xa5, 0x4b, 0xfc, 0xe7, 0x4f, 0x71, 0xdf, 0xf4,
++ 0x30, 0xef, 0x0b, 0xfd, 0x83, 0xec, 0x25, 0x3c, 0xaa, 0x93, 0xf9, 0x67,
++ 0xef, 0x71, 0xd7, 0xed, 0x65, 0xf8, 0x4b, 0xab, 0x7c, 0xf1, 0x10, 0xea,
++ 0x93, 0x23, 0x7c, 0x5e, 0xa1, 0x9d, 0xb8, 0xf1, 0x31, 0x63, 0x03, 0x3a,
++ 0x6a, 0x24, 0x07, 0x3c, 0x6b, 0xf5, 0xf5, 0x88, 0x0e, 0x15, 0x36, 0xf2,
++ 0xfa, 0x73, 0xb4, 0xef, 0x93, 0x86, 0x07, 0xf5, 0x8b, 0x64, 0xd6, 0xa7,
++ 0x8d, 0xa7, 0xf1, 0x75, 0x9f, 0xb3, 0xf7, 0x95, 0xb5, 0xaa, 0x75, 0x7d,
++ 0xe0, 0x0e, 0x57, 0xfd, 0xf8, 0x1b, 0xf4, 0xa7, 0xb6, 0x55, 0x37, 0xde,
++ 0x2b, 0xe9, 0xc4, 0x40, 0x64, 0xd5, 0x33, 0x16, 0x6e, 0x1a, 0x46, 0x68,
++ 0xd5, 0x8d, 0xf6, 0x2f, 0xf1, 0x7d, 0x90, 0x31, 0x88, 0x6c, 0x75, 0x4a,
++ 0xe6, 0x3f, 0x71, 0xd2, 0x39, 0x88, 0x3f, 0x2c, 0x8c, 0xe0, 0xc0, 0x44,
++ 0x11, 0x5b, 0xd3, 0xb7, 0xf5, 0x55, 0xd7, 0x65, 0x7b, 0x60, 0x22, 0xde,
++ 0x5b, 0x55, 0x94, 0x6d, 0x1f, 0xfb, 0x8c, 0x4a, 0xe6, 0xd8, 0xfb, 0xa9,
++ 0xd3, 0x01, 0x5b, 0xa7, 0x3d, 0x30, 0xf2, 0xd7, 0xe9, 0xf6, 0x93, 0xae,
++ 0x3f, 0x25, 0x7a, 0x93, 0xfd, 0xb6, 0x83, 0xd8, 0x4b, 0xba, 0xbb, 0x6f,
++ 0xa0, 0xdb, 0x67, 0x5c, 0xa7, 0xbb, 0x6b, 0x22, 0x7e, 0xda, 0x55, 0xa4,
++ 0xfb, 0xed, 0xe9, 0x12, 0x8d, 0x2c, 0xb6, 0xad, 0xca, 0x22, 0xbf, 0x6e,
++ 0x9f, 0xb5, 0xcf, 0xd6, 0xc7, 0x59, 0xfb, 0xfa, 0xc6, 0x7a, 0x89, 0x07,
++ 0xfe, 0x9a, 0xd2, 0xed, 0xbd, 0x7d, 0x07, 0x7b, 0xdd, 0x18, 0x1f, 0xda,
++ 0x9b, 0x5b, 0xdc, 0x69, 0xc6, 0x76, 0xd8, 0xb7, 0xf9, 0x73, 0x33, 0x8d,
++ 0x0e, 0xf6, 0x61, 0x9b, 0xcc, 0x2e, 0x7f, 0xa7, 0xe9, 0x23, 0xee, 0xaa,
++ 0x54, 0x1b, 0x27, 0x64, 0xb6, 0x21, 0xb1, 0x5c, 0xc4, 0xc2, 0x05, 0xe9,
++ 0xf7, 0x76, 0xb2, 0x4f, 0x58, 0x46, 0xfb, 0xf6, 0xe2, 0x48, 0xa1, 0x57,
++ 0xa5, 0xc3, 0x5c, 0xc7, 0x94, 0xba, 0x02, 0xd6, 0xbc, 0x6e, 0x54, 0xd2,
++ 0x97, 0xc2, 0xa9, 0x81, 0xd4, 0xc9, 0x7a, 0x0b, 0xc4, 0x28, 0xbe, 0x45,
++ 0xa9, 0x6c, 0x6a, 0x7b, 0xbd, 0x1b, 0xc7, 0x6c, 0xfc, 0xa5, 0x4d, 0xf1,
++ 0x33, 0x2e, 0x31, 0x73, 0xc7, 0x84, 0xd4, 0x31, 0x42, 0x48, 0x7d, 0x08,
++ 0xff, 0x90, 0x9c, 0x1f, 0xa8, 0x41, 0xfa, 0xde, 0x1a, 0x48, 0x5f, 0x71,
++ 0x04, 0x3f, 0xd2, 0x23, 0xbe, 0x4c, 0xc1, 0xa3, 0xb6, 0x98, 0x33, 0xfe,
++ 0xad, 0x66, 0x10, 0x01, 0xf6, 0x65, 0x5d, 0xee, 0x18, 0xfb, 0x0c, 0xd1,
++ 0x63, 0x67, 0xeb, 0xb2, 0x7c, 0xc6, 0xdf, 0x6e, 0x3a, 0xb9, 0xf0, 0x96,
++ 0x29, 0x9f, 0xbf, 0x63, 0x32, 0x16, 0x39, 0x62, 0x63, 0xb1, 0xae, 0xd6,
++ 0x58, 0xde, 0xb2, 0x5e, 0x31, 0xe6, 0xaf, 0x96, 0x3b, 0x3d, 0x48, 0x6b,
++ 0x22, 0xdf, 0x84, 0xbb, 0x89, 0x9f, 0xda, 0x26, 0x9b, 0x60, 0x4c, 0x02,
++ 0x27, 0x8e, 0x47, 0xb0, 0x72, 0x42, 0x3b, 0x3d, 0xe8, 0xce, 0x60, 0x7c,
++ 0xb6, 0x13, 0x13, 0x05, 0xff, 0x42, 0xd4, 0x45, 0x5c, 0x9d, 0x74, 0xe1,
++ 0x76, 0x63, 0xb5, 0x9a, 0xb7, 0x63, 0x5a, 0xe1, 0x2e, 0x63, 0xbb, 0xea,
++ 0xb5, 0x31, 0xc5, 0x0c, 0xb1, 0x88, 0xc2, 0x4d, 0xce, 0x5c, 0xbe, 0x35,
++ 0x49, 0xcc, 0x7d, 0xfb, 0x84, 0xd4, 0x77, 0x0b, 0xaf, 0x26, 0xa9, 0x97,
++ 0x64, 0x36, 0xe3, 0x65, 0x0f, 0xb4, 0x4f, 0x69, 0xdd, 0x86, 0x72, 0x30,
++ 0xde, 0xad, 0x33, 0x0e, 0x2e, 0x5c, 0x36, 0xd3, 0xec, 0x97, 0x1c, 0xd4,
++ 0x6e, 0x68, 0x11, 0x8f, 0x2b, 0x84, 0x01, 0x9b, 0x46, 0x6f, 0xab, 0x31,
++ 0x53, 0x86, 0xa5, 0x7a, 0x0f, 0x4e, 0xdb, 0x32, 0xf4, 0xb7, 0xae, 0x27,
++ 0xbe, 0x7e, 0xdc, 0xcc, 0xb0, 0x07, 0x96, 0xfd, 0xd0, 0x58, 0xa2, 0xc5,
++ 0xdd, 0x46, 0x0c, 0x1b, 0x8b, 0x2e, 0xa8, 0xb4, 0xca, 0x7a, 0x1a, 0xd3,
++ 0x33, 0x60, 0x45, 0xa9, 0x71, 0xea, 0x9b, 0xc8, 0x18, 0x27, 0xce, 0x6a,
++ 0x3b, 0xee, 0x5f, 0x48, 0xc3, 0x99, 0xdf, 0x6c, 0x32, 0xfe, 0x37, 0x2e,
++ 0x85, 0xb5, 0x23, 0x69, 0xf2, 0xdd, 0xc1, 0xbc, 0x3b, 0xdf, 0xe3, 0xe1,
++ 0x7d, 0x99, 0xdb, 0x75, 0xb7, 0x8e, 0xe6, 0x30, 0xef, 0x4e, 0x49, 0x5f,
++ 0x85, 0x60, 0x77, 0x01, 0x32, 0x43, 0x62, 0x6f, 0xf1, 0xa9, 0x55, 0xda,
++ 0x3b, 0xea, 0x9a, 0x74, 0xf6, 0xc5, 0x72, 0xb3, 0x9e, 0xe0, 0x56, 0xb3,
++ 0x19, 0xc7, 0x0a, 0x9e, 0x1b, 0x68, 0xc7, 0x8f, 0xdc, 0xe2, 0x72, 0x21,
++ 0xbe, 0xea, 0x2e, 0x55, 0xdc, 0x5b, 0x62, 0x9e, 0xc8, 0xd8, 0x35, 0xb1,
++ 0x8c, 0x72, 0x5e, 0x38, 0x29, 0x6b, 0x7c, 0xab, 0x75, 0xf4, 0xa4, 0xd4,
++ 0xc8, 0xee, 0xd6, 0x88, 0xa9, 0x75, 0x4b, 0x1f, 0x58, 0x4d, 0x3d, 0x7d,
++ 0x34, 0x26, 0x35, 0x78, 0x3f, 0x6b, 0xb0, 0xb6, 0xd0, 0xae, 0xa4, 0x8e,
++ 0x69, 0x09, 0xbf, 0xdb, 0x85, 0x2b, 0x0d, 0x5a, 0xe6, 0x79, 0x68, 0xbd,
++ 0xce, 0xbc, 0x70, 0x67, 0x6b, 0x63, 0x11, 0x0f, 0xdf, 0x3a, 0xd3, 0x27,
++ 0xe7, 0x49, 0x6c, 0x1d, 0x37, 0xe5, 0x05, 0x1b, 0x5b, 0xd6, 0x4b, 0xc9,
++ 0x2e, 0xe2, 0x06, 0xc1, 0xc6, 0x72, 0xfd, 0x81, 0xd6, 0x86, 0x29, 0x1f,
++ 0x79, 0x53, 0x78, 0x8f, 0x75, 0xe9, 0x48, 0xa1, 0xc4, 0xa3, 0x83, 0x9b,
++ 0x37, 0x13, 0x37, 0xbb, 0x53, 0x5a, 0xcb, 0x06, 0xe2, 0x66, 0x9d, 0x3d,
++ 0x84, 0x07, 0x3d, 0x78, 0xcc, 0x74, 0xfa, 0x08, 0xc1, 0xce, 0xd6, 0x49,
++ 0x2d, 0x2d, 0xb8, 0xf9, 0xea, 0x6a, 0x60, 0x07, 0x71, 0xf3, 0x42, 0xce,
++ 0x83, 0x0c, 0x71, 0xf3, 0x47, 0x39, 0x1f, 0xee, 0x20, 0x6e, 0xbe, 0x42,
++ 0x8c, 0x75, 0x3e, 0xf9, 0x4b, 0x7c, 0xbb, 0x38, 0x13, 0xdb, 0x95, 0xf0,
++ 0xd1, 0xb7, 0x05, 0x3b, 0xff, 0xa6, 0x88, 0x9d, 0xff, 0xcb, 0x3f, 0xc3,
++ 0xce, 0x77, 0x13, 0x13, 0x76, 0x4d, 0xc8, 0xfe, 0xd1, 0xae, 0xd6, 0xd7,
++ 0x4f, 0xc9, 0x99, 0x95, 0x5b, 0xf1, 0xee, 0xc9, 0xe1, 0x7e, 0x62, 0x65,
++ 0x8c, 0x24, 0x33, 0xc8, 0x4d, 0x62, 0x09, 0x71, 0xc1, 0x4b, 0x6e, 0xae,
++ 0xbb, 0x32, 0xa9, 0x19, 0x6f, 0xa8, 0x78, 0x67, 0x06, 0x71, 0xf6, 0xca,
++ 0xda, 0x02, 0x4d, 0x98, 0xf6, 0xa4, 0x88, 0x8d, 0x59, 0x03, 0x97, 0x12,
++ 0x3b, 0x57, 0xcd, 0x01, 0xb5, 0x73, 0x0e, 0x76, 0x96, 0x79, 0x58, 0x55,
++ 0x1c, 0x7f, 0x46, 0xec, 0xcc, 0xfe, 0x96, 0xa1, 0x36, 0xd7, 0xc4, 0x18,
++ 0x55, 0x38, 0x1c, 0x0f, 0xa0, 0xeb, 0x38, 0x71, 0x8f, 0x3d, 0x0f, 0xb3,
++ 0x86, 0x7e, 0x6a, 0x64, 0x70, 0x74, 0xd6, 0x99, 0x87, 0x6d, 0x22, 0x7e,
++ 0xf3, 0xc4, 0xc3, 0x28, 0x9f, 0xf3, 0xe0, 0x19, 0xe2, 0xe7, 0x8d, 0xb4,
++ 0xf3, 0x19, 0xe2, 0xe7, 0xbb, 0x6f, 0x98, 0x89, 0x4d, 0xcd, 0xe1, 0x15,
++ 0x62, 0xf9, 0xba, 0x5a, 0xc4, 0x65, 0xde, 0x61, 0x5d, 0x59, 0x13, 0xc0,
++ 0x39, 0x1b, 0x3f, 0xfb, 0x17, 0xb2, 0xca, 0x91, 0xad, 0x8c, 0xb6, 0x10,
++ 0xbb, 0xba, 0x68, 0xd7, 0xb6, 0x93, 0x5a, 0xe7, 0x8b, 0xd4, 0x45, 0x63,
++ 0xfc, 0xbc, 0x6d, 0x8f, 0xbe, 0xa4, 0xcc, 0x4e, 0x3a, 0x5b, 0xe5, 0x5c,
++ 0x55, 0x05, 0xed, 0xbd, 0x65, 0x2c, 0x96, 0xfe, 0x00, 0x4e, 0x4c, 0x26,
++ 0xf2, 0x65, 0xc5, 0x7a, 0x28, 0xf7, 0xfa, 0x79, 0x2f, 0x8d, 0xce, 0x35,
++ 0x8e, 0x7f, 0x27, 0xf2, 0xc7, 0x88, 0x5d, 0x65, 0xcf, 0x34, 0x14, 0xdc,
++ 0x64, 0x76, 0x62, 0xdc, 0x8c, 0xa2, 0xfc, 0x5c, 0x71, 0xef, 0xf5, 0x9c,
++ 0x9c, 0xc5, 0xdb, 0xd9, 0x1a, 0xfa, 0x5e, 0x09, 0x13, 0xa6, 0x89, 0xef,
++ 0xc2, 0xbe, 0xdb, 0x0b, 0x82, 0x17, 0xbb, 0x71, 0xd4, 0xd4, 0x22, 0x3f,
++ 0x67, 0x4c, 0xdc, 0x2b, 0xfb, 0xee, 0x37, 0xcc, 0x9e, 0x1e, 0xe4, 0x3d,
++ 0xf3, 0x73, 0xb3, 0xa7, 0xc1, 0x09, 0xfc, 0xc6, 0xdd, 0x5c, 0x0e, 0xd7,
++ 0x4a, 0x2f, 0x31, 0xbd, 0x16, 0x19, 0xc1, 0x23, 0xc4, 0x1c, 0xbf, 0x56,
++ 0x01, 0xdd, 0xd3, 0xdf, 0xe4, 0xd6, 0x22, 0x33, 0x2a, 0xc0, 0x77, 0x77,
++ 0x32, 0xbf, 0xed, 0xa4, 0x6f, 0xc4, 0x16, 0x2a, 0x94, 0x1b, 0x97, 0xbe,
++ 0x6c, 0xe3, 0x51, 0x7f, 0x37, 0xaf, 0x8d, 0x17, 0x4a, 0xb8, 0xa6, 0x47,
++ 0x78, 0xc5, 0xa6, 0xe3, 0x4e, 0x0e, 0xd1, 0xf3, 0xfe, 0x85, 0x4b, 0x70,
++ 0x64, 0xab, 0xa4, 0xac, 0xf7, 0x8f, 0x85, 0xac, 0xde, 0xc5, 0x12, 0xc3,
++ 0x3a, 0xb6, 0x99, 0xe2, 0x5f, 0x7d, 0xe4, 0xb3, 0x07, 0x87, 0xcc, 0xa5,
++ 0xec, 0xdd, 0x64, 0x0e, 0xda, 0x44, 0x6c, 0xdd, 0xcd, 0x1a, 0x6c, 0x59,
++ 0x83, 0x46, 0xd6, 0x6a, 0x5a, 0xab, 0x1b, 0x79, 0x35, 0x5f, 0x13, 0x21,
++ 0xbe, 0x59, 0xc5, 0xda, 0xdd, 0x56, 0x68, 0xc2, 0x1b, 0x67, 0x74, 0xfa,
++ 0x66, 0x3b, 0xf1, 0x7b, 0x37, 0xee, 0xa1, 0x3c, 0xdf, 0x2e, 0x7c, 0x07,
++ 0xe9, 0x6f, 0x78, 0x70, 0xe4, 0x78, 0x1a, 0xeb, 0x57, 0x0d, 0xe1, 0xd2,
++ 0x37, 0x7d, 0xcc, 0x55, 0x01, 0x3c, 0x7e, 0x5c, 0xf2, 0x6b, 0x09, 0x6f,
++ 0xdf, 0x88, 0x45, 0x7c, 0x88, 0xda, 0x38, 0xe4, 0x8b, 0xef, 0x39, 0x18,
++ 0xc5, 0xcf, 0xfe, 0xb7, 0xf4, 0x3e, 0xf3, 0xd0, 0xaa, 0x7f, 0x86, 0x67,
++ 0x88, 0x5b, 0x88, 0x05, 0x2a, 0x12, 0xf6, 0xb9, 0xb7, 0x12, 0xde, 0xf5,
++ 0xd0, 0x07, 0x24, 0xa6, 0x97, 0x32, 0xd6, 0x2d, 0x62, 0xe7, 0x85, 0xe2,
++ 0x5c, 0xf2, 0xed, 0x93, 0xda, 0xc5, 0x43, 0x88, 0x11, 0x43, 0xa3, 0x4f,
++ 0xb0, 0x9b, 0x9b, 0x78, 0xf7, 0x4a, 0x3c, 0x6e, 0x9c, 0x23, 0xde, 0x1d,
++ 0xa6, 0xad, 0x3d, 0xba, 0xf8, 0x66, 0x08, 0x65, 0x73, 0x11, 0xfa, 0xa4,
++ 0xcc, 0x25, 0x5f, 0xf1, 0x3b, 0x73, 0x49, 0x99, 0x85, 0xcb, 0xb9, 0x10,
++ 0x74, 0x94, 0xb1, 0x77, 0x2b, 0x57, 0x59, 0xe6, 0xe4, 0x29, 0xff, 0x0e,
++ 0xe6, 0xf7, 0x8c, 0x19, 0x0e, 0xee, 0x28, 0x84, 0xf8, 0xa9, 0x0b, 0x66,
++ 0x0a, 0xbf, 0xc7, 0xe7, 0x23, 0xfc, 0x8e, 0x62, 0x22, 0x5f, 0x5b, 0x21,
++ 0xcd, 0xc0, 0x44, 0xde, 0xc9, 0x79, 0xd1, 0xfc, 0x5e, 0xbf, 0x60, 0xcd,
++ 0xb6, 0xe3, 0xce, 0xdf, 0xfa, 0x0d, 0x7f, 0x7f, 0x1e, 0xf3, 0x7b, 0xc9,
++ 0xf7, 0x99, 0x93, 0x3a, 0x3e, 0x3a, 0x69, 0x63, 0xfe, 0x79, 0x62, 0xfe,
++ 0x01, 0xaf, 0x5b, 0xb0, 0xe6, 0xaf, 0xac, 0xf3, 0xf1, 0x78, 0xef, 0x34,
++ 0xfd, 0xa0, 0x8b, 0x74, 0x5d, 0x7a, 0xd8, 0xe6, 0xd7, 0xe1, 0xd3, 0x99,
++ 0xe5, 0x5e, 0x3e, 0x99, 0xc0, 0x3b, 0xd7, 0x67, 0xa7, 0x9f, 0x94, 0xd9,
++ 0x33, 0x60, 0x3c, 0xf2, 0xee, 0x5a, 0xf8, 0x5a, 0xd8, 0x6f, 0x7a, 0xf9,
++ 0x7c, 0xc4, 0x7e, 0x5e, 0x66, 0xb9, 0x9f, 0x7c, 0x56, 0xc2, 0xd3, 0x1f,
++ 0x5d, 0x7f, 0xe7, 0x20, 0x3b, 0x35, 0xdf, 0x79, 0xc6, 0x96, 0xdb, 0x7e,
++ 0x4e, 0xe6, 0xad, 0xfe, 0x05, 0xd8, 0xf1, 0xf5, 0xfb, 0x94, 0x49, 0xec,
++ 0x7b, 0xc0, 0x72, 0xfc, 0x36, 0x1c, 0xdc, 0xc6, 0x78, 0xf8, 0x2e, 0xed,
++ 0xb3, 0xed, 0x5c, 0x5d, 0xf0, 0x2e, 0xb3, 0xd3, 0x96, 0xf9, 0xae, 0x73,
++ 0x52, 0x93, 0xe4, 0xfe, 0x1f, 0x54, 0x08, 0x1e, 0x7f, 0x9c, 0x35, 0x6b,
++ 0xd8, 0x94, 0xd9, 0x3e, 0x94, 0x27, 0x75, 0x08, 0x9b, 0xc6, 0xa3, 0x78,
++ 0xdb, 0xf0, 0x17, 0xcf, 0xb0, 0x48, 0x4c, 0x0e, 0x30, 0x26, 0xc3, 0x18,
++ 0x31, 0x63, 0xd1, 0xb7, 0x89, 0x4f, 0xb3, 0x64, 0xf8, 0xe8, 0x84, 0x1b,
++ 0x6f, 0x13, 0x33, 0x42, 0x39, 0x67, 0x40, 0x9d, 0x77, 0x4b, 0xbf, 0x57,
++ 0x22, 0x5a, 0x13, 0x6b, 0xd9, 0x8b, 0x3a, 0xe4, 0x98, 0xf3, 0xfd, 0xfa,
++ 0x8f, 0x71, 0xec, 0x84, 0x0b, 0xf7, 0xb1, 0xef, 0x4b, 0xdf, 0x69, 0xf0,
++ 0xef, 0xc6, 0xfe, 0xf7, 0xf1, 0x0f, 0xd6, 0x94, 0x9c, 0xb3, 0x52, 0x72,
++ 0x96, 0xe3, 0x13, 0xab, 0x56, 0xd7, 0xe7, 0x9f, 0x87, 0x3e, 0x78, 0x15,
++ 0x8d, 0x03, 0x0b, 0xf8, 0xc0, 0x9a, 0xe7, 0xbd, 0xf7, 0x18, 0x3f, 0x2f,
++ 0x1a, 0xb1, 0x88, 0x8b, 0xc2, 0xcc, 0x87, 0xdd, 0xb8, 0xd7, 0x90, 0x7d,
++ 0x26, 0x6d, 0xe0, 0x69, 0x68, 0xfd, 0x17, 0x94, 0x9c, 0xcd, 0xb9, 0x64,
++ 0x65, 0x6b, 0x64, 0x5d, 0x85, 0x95, 0xcb, 0x1b, 0x3b, 0xcb, 0xa0, 0xb5,
++ 0x78, 0x95, 0x6e, 0xbc, 0xaf, 0xfe, 0xa7, 0x35, 0x1f, 0xfe, 0xc4, 0x7a,
++ 0x47, 0x2f, 0xd1, 0xd5, 0xa2, 0x3e, 0x77, 0x89, 0xb7, 0x3a, 0x1c, 0x33,
++ 0x65, 0x7f, 0xee, 0xc7, 0xb8, 0xef, 0x84, 0x07, 0xed, 0xc9, 0x5f, 0x5a,
++ 0xd9, 0xb0, 0xd0, 0x0c, 0x56, 0xa2, 0x42, 0xe8, 0x3b, 0x33, 0xeb, 0x17,
++ 0x0a, 0x50, 0x1d, 0xa6, 0xe0, 0x65, 0xf1, 0xd3, 0x71, 0x58, 0xa6, 0xcc,
++ 0x11, 0x2d, 0xdc, 0x91, 0x1c, 0xc2, 0x7b, 0xc9, 0xf4, 0x1f, 0xf8, 0xa0,
++ 0x5d, 0xbc, 0xec, 0xd6, 0xe6, 0x9b, 0xdc, 0x51, 0xe5, 0x6f, 0xd0, 0x07,
++ 0x1a, 0xec, 0x7a, 0x93, 0x67, 0xef, 0x14, 0x60, 0x6e, 0x91, 0x1e, 0x73,
++ 0x1c, 0x73, 0x63, 0x59, 0x78, 0x88, 0xed, 0x86, 0x9b, 0xb5, 0xcc, 0x53,
++ 0x4a, 0x8b, 0xec, 0x53, 0x51, 0x75, 0x8f, 0x3e, 0x88, 0x67, 0x8c, 0x78,
++ 0xba, 0x4d, 0xd5, 0xf9, 0x3a, 0x0b, 0x25, 0xda, 0xed, 0xc4, 0x2a, 0xda,
++ 0xfc, 0x65, 0x77, 0x39, 0x6a, 0x57, 0xeb, 0x9d, 0xe5, 0x6e, 0x6d, 0xf0,
++ 0x6b, 0x8c, 0xaf, 0xcd, 0x85, 0x79, 0xff, 0xfb, 0x71, 0x17, 0x56, 0xd8,
++ 0xfb, 0x08, 0xb9, 0xe2, 0x8c, 0x74, 0x1c, 0x5b, 0xc6, 0xac, 0xf5, 0xaf,
++ 0x26, 0xb5, 0xc8, 0x53, 0x2a, 0xbb, 0x23, 0x40, 0x4c, 0x73, 0x3f, 0xf4,
++ 0xe8, 0x2c, 0xeb, 0x54, 0x7b, 0xc1, 0x85, 0x5b, 0x4e, 0x09, 0xcd, 0x1c,
++ 0x69, 0x1e, 0x42, 0xf9, 0x09, 0x6b, 0xfd, 0x0e, 0x43, 0x1b, 0xbc, 0xec,
++ 0xce, 0xfe, 0xd7, 0x5a, 0xea, 0xad, 0x43, 0xc9, 0x3e, 0xda, 0x10, 0x71,
++ 0xc5, 0x90, 0x9c, 0x87, 0x4b, 0xfc, 0x39, 0x31, 0xc5, 0x1f, 0xd3, 0x57,
++ 0xdd, 0xa9, 0x20, 0xf9, 0xd4, 0x12, 0xd3, 0x90, 0xf9, 0x79, 0x14, 0x97,
++ 0x8d, 0xac, 0x7f, 0x53, 0x43, 0x82, 0xd8, 0x2c, 0xc2, 0x3a, 0x18, 0xc5,
++ 0x51, 0x62, 0xbc, 0x43, 0x6c, 0x09, 0xe7, 0x43, 0x3a, 0xb1, 0x59, 0x37,
++ 0x5c, 0x63, 0x01, 0x35, 0x93, 0x8b, 0x19, 0xed, 0xf8, 0xf7, 0x98, 0x8f,
++ 0x88, 0x8b, 0x1c, 0x42, 0xe0, 0xc4, 0xdf, 0x59, 0x55, 0xba, 0xde, 0x32,
++ 0xa6, 0xb8, 0xee, 0x13, 0x11, 0xea, 0x98, 0xef, 0xc9, 0xb9, 0x15, 0xb3,
++ 0x0b, 0xf7, 0x8c, 0x85, 0xf9, 0x7e, 0x15, 0x56, 0x9e, 0x88, 0xe2, 0x4a,
++ 0xf2, 0x66, 0xcc, 0xd7, 0x38, 0x18, 0xc8, 0xaf, 0xd3, 0x8f, 0xd8, 0x67,
++ 0x65, 0x0b, 0xba, 0xbd, 0x77, 0x74, 0xc8, 0x94, 0xfe, 0xdc, 0xc3, 0xbf,
++ 0x03, 0xfc, 0x88, 0x3e, 0xbf, 0x55, 0xc4, 0x3a, 0xfb, 0x5b, 0xa3, 0x33,
++ 0x6f, 0x55, 0xd8, 0x7b, 0x9a, 0x88, 0xf2, 0xb9, 0x90, 0x3d, 0x17, 0x1c,
++ 0x26, 0xcd, 0xb3, 0xe3, 0xd2, 0xb7, 0xb5, 0xad, 0xf3, 0x15, 0xf7, 0xdf,
++ 0xdf, 0x32, 0x5c, 0x58, 0xcf, 0xde, 0x3e, 0xa2, 0x4b, 0xbd, 0x1c, 0xd6,
++ 0x6a, 0xb1, 0x0e, 0xa7, 0x43, 0x6c, 0xc2, 0xf5, 0x7f, 0x87, 0x23, 0xa1,
++ 0x04, 0x73, 0xbe, 0x8e, 0x77, 0x73, 0x5f, 0x66, 0xbf, 0x53, 0x27, 0x67,
++ 0x77, 0x70, 0xcb, 0x09, 0x2f, 0xd7, 0x5c, 0x4f, 0x5c, 0xb3, 0x09, 0x3f,
++ 0x0b, 0x39, 0xbd, 0xc6, 0x61, 0x5e, 0x1f, 0x9d, 0x0e, 0x10, 0x8b, 0xfa,
++ 0xf8, 0xb9, 0x91, 0xb7, 0x2f, 0xe2, 0x49, 0x64, 0xf9, 0xd7, 0x78, 0xf2,
++ 0x11, 0x0f, 0xe8, 0xb8, 0x9a, 0x7b, 0x09, 0x57, 0x48, 0x3b, 0x3b, 0xed,
++ 0xd0, 0x3c, 0x5e, 0x10, 0xba, 0xb2, 0x5e, 0x6c, 0xb0, 0xd6, 0x2d, 0xf4,
++ 0x03, 0x72, 0x8e, 0xf7, 0xdf, 0xb8, 0x06, 0x91, 0xdd, 0x09, 0xf6, 0xc7,
++ 0x46, 0x03, 0xda, 0x43, 0xb4, 0x97, 0x29, 0x6b, 0x68, 0xec, 0x45, 0xe5,
++ 0xdd, 0x08, 0x56, 0x8c, 0x59, 0x43, 0x91, 0x94, 0x5c, 0xb7, 0xac, 0xea,
++ 0xb5, 0x7a, 0xe4, 0x0d, 0xe5, 0x61, 0xad, 0xf3, 0x50, 0x07, 0xa3, 0x38,
++ 0x9b, 0x6b, 0xbc, 0xf8, 0x1e, 0xb1, 0x53, 0x94, 0xbd, 0xde, 0x25, 0xf7,
++ 0x28, 0x66, 0x72, 0xff, 0xb1, 0x52, 0x66, 0x04, 0xa3, 0x85, 0x80, 0x9a,
++ 0xce, 0xfd, 0x49, 0xa5, 0xe4, 0xa2, 0x11, 0xfa, 0x42, 0xd3, 0x98, 0xf0,
++ 0x6a, 0x0d, 0x55, 0x91, 0xce, 0x51, 0xd2, 0x99, 0x5e, 0xa3, 0x67, 0x46,
++ 0x94, 0xe8, 0x2c, 0x40, 0x5c, 0xf7, 0xaa, 0xcc, 0xcf, 0xa8, 0xb7, 0xa7,
++ 0xf9, 0xbc, 0xe8, 0x2d, 0x8c, 0x9f, 0x15, 0xe9, 0x3c, 0x56, 0xb8, 0x88,
++ 0xe9, 0xdc, 0x25, 0xfb, 0xf7, 0x91, 0x42, 0x82, 0xb5, 0xaf, 0x0f, 0x79,
++ 0xe6, 0x93, 0xb1, 0x5c, 0x63, 0x66, 0x8c, 0x7c, 0x38, 0x67, 0xee, 0xfa,
++ 0xf0, 0x64, 0xf1, 0x99, 0x61, 0xbe, 0x3b, 0x7c, 0xed, 0x77, 0xd1, 0x91,
++ 0xb3, 0xaf, 0xef, 0xec, 0x2b, 0x94, 0xd3, 0x76, 0x4e, 0x1f, 0x7e, 0xd8,
++ 0xf4, 0xca, 0x0c, 0x1c, 0x2f, 0x8d, 0xaf, 0xc7, 0x88, 0xf1, 0x97, 0xd8,
++ 0x45, 0xb9, 0x47, 0xa9, 0xcf, 0x13, 0xa6, 0xbd, 0x7f, 0x2f, 0xe7, 0xba,
++ 0x98, 0xab, 0xbb, 0x5a, 0xcf, 0x10, 0x8b, 0x1d, 0x63, 0xcc, 0xec, 0x49,
++ 0x36, 0x76, 0xbf, 0x4c, 0xbf, 0x4b, 0x7f, 0x5d, 0xf6, 0xc8, 0x81, 0xb1,
++ 0x89, 0x6f, 0x63, 0xaa, 0xa6, 0x71, 0xe1, 0x59, 0xe6, 0x84, 0xd3, 0xcc,
++ 0x53, 0x1e, 0xe6, 0x84, 0xea, 0x09, 0x62, 0x48, 0xe6, 0xa9, 0x79, 0xe6,
++ 0x29, 0x8f, 0xde, 0x78, 0x71, 0x06, 0xff, 0x9d, 0x7a, 0x11, 0xfe, 0x62,
++ 0x89, 0x19, 0xc8, 0xb3, 0xce, 0xfc, 0x55, 0x9f, 0xe9, 0xc7, 0xa5, 0x9b,
++ 0x9d, 0x19, 0x9a, 0x9b, 0x35, 0x7b, 0x77, 0xae, 0x31, 0x34, 0x22, 0xb4,
++ 0x7b, 0xb4, 0x48, 0x96, 0xb6, 0x3a, 0x62, 0x63, 0xef, 0x6e, 0xf6, 0x0b,
++ 0x72, 0x8e, 0xab, 0x0a, 0x1e, 0xfa, 0xfe, 0x88, 0x21, 0xe7, 0x1b, 0x22,
++ 0xc1, 0xcd, 0xb4, 0xe1, 0x88, 0xd9, 0xd8, 0x12, 0x53, 0x3b, 0x70, 0xa9,
++ 0x98, 0x63, 0x1d, 0x2c, 0xad, 0x65, 0x8e, 0xa2, 0xb1, 0xfb, 0x7e, 0x7c,
++ 0x03, 0xe9, 0x9a, 0xc6, 0xde, 0x71, 0xc4, 0x8c, 0x7b, 0x21, 0xe7, 0x41,
++ 0x1d, 0x5a, 0xf5, 0x79, 0x37, 0xf1, 0xc8, 0x27, 0xd6, 0x52, 0xfd, 0x31,
++ 0x8c, 0x13, 0x33, 0x36, 0xac, 0xd2, 0x2f, 0x7e, 0xbf, 0x78, 0xcf, 0xd9,
++ 0x2b, 0x12, 0x7f, 0xf1, 0x51, 0x07, 0xe5, 0xf0, 0x2c, 0xaa, 0xe3, 0x1a,
++ 0xd4, 0x85, 0x7d, 0x56, 0xf8, 0x55, 0x1c, 0xa0, 0xbf, 0x8d, 0x17, 0x14,
++ 0x8c, 0xfa, 0x57, 0x31, 0x20, 0xb5, 0x89, 0xef, 0xb4, 0xe5, 0x02, 0xc4,
++ 0x29, 0x11, 0x94, 0xeb, 0xb1, 0xe8, 0x30, 0xe5, 0x6b, 0x63, 0x2e, 0x1f,
++ 0x65, 0x0e, 0xc9, 0x86, 0x02, 0xf6, 0xf9, 0xd5, 0x72, 0x3d, 0x62, 0xff,
++ 0xcf, 0x81, 0xf4, 0x41, 0x0d, 0x53, 0xb2, 0x4f, 0x7d, 0x08, 0xaf, 0x8e,
++ 0xcf, 0xe3, 0x58, 0x32, 0x8d, 0xbd, 0x35, 0x21, 0x8c, 0x99, 0x8b, 0xed,
++ 0xb9, 0x81, 0xf4, 0x5b, 0x5b, 0x26, 0x0e, 0xda, 0xb3, 0xc8, 0x8d, 0x49,
++ 0x57, 0xbd, 0x9c, 0xe3, 0x98, 0x66, 0xdf, 0x35, 0x6e, 0x0c, 0xe1, 0x80,
++ 0xf1, 0xc7, 0x30, 0x16, 0x49, 0xee, 0x1c, 0xc1, 0xf9, 0x29, 0xa9, 0x61,
++ 0xfd, 0xad, 0xcb, 0xc6, 0x44, 0x3f, 0x2e, 0x62, 0x5e, 0x1f, 0x9a, 0x6c,
++ 0x0c, 0x37, 0xd7, 0xba, 0x7c, 0xca, 0xc1, 0x72, 0x4d, 0x79, 0x39, 0x73,
++ 0x5d, 0x85, 0x20, 0xf5, 0x75, 0x21, 0xe9, 0x65, 0xce, 0x11, 0x7d, 0xca,
++ 0x19, 0x3f, 0x47, 0xce, 0x44, 0x5e, 0x61, 0xa4, 0xf9, 0xc6, 0xfd, 0x15,
++ 0xf9, 0xff, 0x83, 0x6b, 0xe7, 0x0e, 0x8b, 0xb3, 0xf1, 0x3f, 0xb7, 0x2e,
++ 0xdd, 0x24, 0x72, 0x27, 0x03, 0xcc, 0xe9, 0xd1, 0xa9, 0x6b, 0xfa, 0x15,
++ 0x9d, 0x9e, 0x93, 0x9a, 0x61, 0xeb, 0xdc, 0x99, 0xb7, 0x69, 0x03, 0xef,
++ 0xa8, 0x46, 0xd6, 0x13, 0xfa, 0x55, 0x0d, 0xfd, 0xad, 0x09, 0xbd, 0x4b,
++ 0x53, 0x9e, 0x9e, 0xab, 0xe6, 0x7a, 0xb4, 0xac, 0x7e, 0xd7, 0xc2, 0xcd,
++ 0x6d, 0x70, 0xeb, 0x72, 0x7d, 0xca, 0x4a, 0x87, 0xe4, 0x77, 0x33, 0x20,
++ 0xb5, 0xfc, 0x05, 0x73, 0xde, 0x5a, 0xbe, 0xd8, 0xc1, 0x86, 0x7f, 0x97,
++ 0x93, 0xbd, 0xaf, 0xac, 0xc5, 0x5e, 0xfb, 0xe2, 0xdb, 0xee, 0x83, 0xf8,
++ 0xdb, 0xfc, 0x21, 0xbc, 0x39, 0xee, 0x21, 0xce, 0x14, 0x59, 0xd6, 0xa3,
++ 0x7a, 0x75, 0x3c, 0xfd, 0x2e, 0xf3, 0xe2, 0xc5, 0xa9, 0x92, 0x5f, 0xcc,
++ 0xb5, 0xae, 0x98, 0x52, 0xa4, 0x55, 0x85, 0x32, 0xca, 0xf9, 0x53, 0xc3,
++ 0x8d, 0x68, 0x11, 0xdb, 0xba, 0xc9, 0xe7, 0xee, 0x9c, 0x83, 0x79, 0x63,
++ 0xf9, 0xc3, 0x01, 0x67, 0xfe, 0x15, 0x60, 0x1e, 0x1d, 0xc5, 0x91, 0x5c,
++ 0x63, 0xe2, 0x3d, 0x39, 0xa7, 0xc3, 0x5e, 0xec, 0x12, 0x46, 0x71, 0x22,
++ 0x57, 0xca, 0xa1, 0x11, 0x39, 0xdf, 0x9a, 0x88, 0xba, 0x9c, 0x1c, 0x19,
++ 0x75, 0x69, 0xd9, 0xa8, 0xeb, 0xe6, 0x80, 0x60, 0x83, 0xe1, 0x42, 0x2c,
++ 0x52, 0x0e, 0x37, 0xf6, 0x18, 0x8e, 0x7f, 0xd4, 0xcf, 0x78, 0x11, 0x5d,
++ 0x24, 0x75, 0x59, 0x6a, 0xb2, 0x87, 0x35, 0x79, 0x31, 0xd2, 0x8b, 0x3d,
++ 0x78, 0x4d, 0x17, 0x7d, 0xec, 0x2f, 0xe9, 0xc3, 0x38, 0x87, 0xfd, 0xd6,
++ 0x7c, 0xb7, 0xf8, 0x92, 0x17, 0x87, 0x9a, 0xa6, 0xad, 0xa9, 0xb0, 0xc8,
++ 0xee, 0xc6, 0x69, 0xe6, 0x57, 0xdc, 0x1c, 0x8b, 0x9c, 0x66, 0xcd, 0x1e,
++ 0xd1, 0x4b, 0x3e, 0x7e, 0x57, 0x91, 0x4f, 0x3d, 0x33, 0x8b, 0x3f, 0xe1,
++ 0xef, 0xf5, 0x91, 0xbd, 0xca, 0x59, 0x6f, 0xf9, 0xcc, 0xdb, 0x81, 0xd2,
++ 0xec, 0x54, 0x9e, 0x8d, 0xe6, 0x09, 0x3a, 0x2b, 0x84, 0x56, 0x80, 0xfe,
++ 0x59, 0x8e, 0xde, 0xb0, 0x9c, 0xf3, 0x10, 0xbd, 0xc8, 0x9e, 0x22, 0xa8,
++ 0x0f, 0x0b, 0x2f, 0x51, 0x1f, 0x87, 0xae, 0x9d, 0xa9, 0x72, 0xf2, 0x57,
++ 0x05, 0xaf, 0x6f, 0x4e, 0xbe, 0xb8, 0xce, 0x8f, 0xdf, 0x58, 0x97, 0xc2,
++ 0x11, 0xe6, 0x04, 0xb1, 0x69, 0xc6, 0xc6, 0x91, 0x6e, 0xe2, 0x93, 0xdd,
++ 0xf6, 0xf9, 0x11, 0xc6, 0x81, 0x79, 0x4d, 0x8e, 0xf9, 0x3e, 0xe2, 0xec,
++ 0xb9, 0x9c, 0x7d, 0x66, 0xaf, 0xf7, 0x0d, 0x15, 0x63, 0xae, 0xf9, 0x12,
++ 0x7a, 0x6b, 0x85, 0x5e, 0x28, 0xb8, 0x6d, 0x32, 0x41, 0x1d, 0xd4, 0x09,
++ 0x5d, 0xeb, 0x29, 0x76, 0x73, 0x87, 0xc6, 0x84, 0x3e, 0x30, 0x32, 0x16,
++ 0xeb, 0xff, 0x29, 0xb0, 0xae, 0x0a, 0xda, 0xe0, 0x6c, 0xf1, 0xff, 0x38,
++ 0x7e, 0xa1, 0x84, 0x96, 0xd0, 0xf1, 0xc0, 0x64, 0x8e, 0x3b, 0x3e, 0x57,
++ 0x41, 0xdd, 0x69, 0xdd, 0x3f, 0x50, 0x15, 0x78, 0xec, 0x89, 0x04, 0x79,
++ 0x5f, 0x14, 0xdc, 0x3c, 0xe9, 0x83, 0xff, 0x4c, 0x15, 0x6b, 0xae, 0x0f,
++ 0x97, 0x9b, 0x69, 0xd7, 0x27, 0x4a, 0xbc, 0xdb, 0x7b, 0xa3, 0x78, 0x74,
++ 0x22, 0x0a, 0x93, 0x3e, 0x3b, 0x67, 0xca, 0x3e, 0xb0, 0xcf, 0xce, 0x9f,
++ 0x17, 0xd7, 0xd4, 0xd9, 0x7b, 0x54, 0xcf, 0x16, 0xf4, 0xc8, 0x59, 0x55,
++ 0x85, 0x0f, 0x4e, 0xcc, 0xdf, 0x5c, 0x0e, 0xeb, 0x85, 0xa5, 0xa9, 0x78,
++ 0x66, 0x17, 0x7d, 0x7e, 0xc5, 0xf2, 0x30, 0x7b, 0x19, 0xf6, 0x94, 0x6b,
++ 0xa5, 0xff, 0x1d, 0x60, 0xff, 0x5b, 0xda, 0xd3, 0xd7, 0xfb, 0x1f, 0x52,
++ 0xd9, 0x4d, 0x41, 0x58, 0x1f, 0x95, 0xa7, 0xac, 0x8f, 0xbd, 0xa9, 0x38,
++ 0xdf, 0x97, 0x3d, 0x3d, 0xcb, 0x7a, 0xab, 0xd9, 0xb2, 0xf2, 0xcd, 0xb1,
++ 0x4c, 0xc8, 0x1d, 0xc2, 0x99, 0x06, 0xd9, 0x07, 0x74, 0xe1, 0x83, 0xb8,
++ 0x1e, 0xd9, 0x05, 0xd9, 0x7b, 0x67, 0x8e, 0x5f, 0x2c, 0xe7, 0x0e, 0xeb,
++ 0x82, 0x9d, 0xe6, 0x22, 0x3c, 0x33, 0xbb, 0x16, 0xbd, 0x5e, 0xd8, 0xe7,
++ 0x62, 0x2c, 0x03, 0x6f, 0x2c, 0x85, 0xd4, 0xed, 0x78, 0xcb, 0x43, 0x08,
++ 0x63, 0xb6, 0x70, 0x08, 0x0f, 0x9e, 0x90, 0xfd, 0xc5, 0x07, 0x5a, 0x7d,
++ 0x27, 0xac, 0xbf, 0x8b, 0xa4, 0xe6, 0x99, 0x17, 0x2d, 0xab, 0x62, 0x6d,
++ 0x63, 0x84, 0xe5, 0x88, 0x18, 0xa3, 0x57, 0xb0, 0x7b, 0xff, 0x07, 0xa8,
++ 0xc1, 0xd9, 0xe9, 0xf4, 0xcd, 0xec, 0x25, 0x3b, 0x9f, 0x54, 0x21, 0x3c,
++ 0x4f, 0x19, 0x9f, 0x2e, 0x08, 0x4e, 0x79, 0xb0, 0x75, 0xcb, 0x89, 0x25,
++ 0x78, 0x61, 0x36, 0x8c, 0xb3, 0xa6, 0x4e, 0x9c, 0x04, 0x55, 0x99, 0xb2,
++ 0xaa, 0xab, 0xc9, 0x6b, 0xa5, 0xdb, 0x8d, 0x4d, 0x49, 0xe9, 0x0f, 0xf5,
++ 0xfe, 0x80, 0xc2, 0x92, 0x72, 0xe8, 0x0b, 0xfb, 0x81, 0x01, 0x3f, 0xfb,
++ 0xd5, 0x27, 0x55, 0x3c, 0xf3, 0xbe, 0x3b, 0x8c, 0xe7, 0x99, 0x7f, 0x7e,
++ 0x50, 0x90, 0x33, 0x53, 0xcc, 0x31, 0xd3, 0x51, 0xda, 0xca, 0x07, 0x57,
++ 0x7d, 0x15, 0x0e, 0x33, 0x5e, 0x5e, 0x32, 0xca, 0x98, 0xa3, 0xe4, 0x0c,
++ 0x95, 0xe4, 0xf7, 0x9d, 0x72, 0x56, 0xc4, 0x7a, 0x56, 0x77, 0xfa, 0x7d,
++ 0x63, 0xe6, 0xc6, 0x73, 0xc8, 0x21, 0xe6, 0xf5, 0xc6, 0xee, 0x88, 0x7a,
++ 0xc5, 0x4a, 0x7f, 0x5d, 0x51, 0xce, 0xdd, 0x55, 0xa8, 0xb0, 0x65, 0xc5,
++ 0xf0, 0x44, 0xa9, 0xa6, 0x54, 0x4b, 0x2f, 0xd7, 0x9d, 0x2d, 0xfa, 0x60,
++ 0x25, 0x63, 0xfd, 0x28, 0x6b, 0x74, 0xf9, 0x09, 0xa9, 0x25, 0xec, 0x5f,
++ 0xd4, 0x7a, 0x62, 0x61, 0xc1, 0x0d, 0x3e, 0xdc, 0x1f, 0xd2, 0x5a, 0xe4,
++ 0x2c, 0xf6, 0xd3, 0x85, 0x0e, 0x8f, 0x9c, 0x89, 0x7a, 0xa6, 0x20, 0xb5,
++ 0x5c, 0x72, 0x41, 0x69, 0xbd, 0x08, 0x6a, 0xc7, 0xc4, 0x46, 0xdd, 0xad,
++ 0x1f, 0x8d, 0x05, 0xe4, 0xdc, 0xfc, 0x90, 0x8b, 0xbd, 0xb6, 0x6f, 0xcc,
++ 0xb2, 0xee, 0x6e, 0xd6, 0xfb, 0xd7, 0xbb, 0x65, 0x3f, 0x39, 0xd6, 0x7b,
++ 0x4e, 0x69, 0x2d, 0x47, 0xd4, 0x8d, 0x74, 0x9e, 0xab, 0x92, 0x18, 0xc9,
++ 0x52, 0xce, 0x47, 0x6d, 0x99, 0xf6, 0x53, 0xa6, 0xd2, 0x99, 0xa1, 0x2a,
++ 0x5c, 0x1e, 0x87, 0xce, 0xa8, 0xc5, 0x79, 0x83, 0xc9, 0x29, 0x14, 0x4f,
++ 0xb7, 0x43, 0xfc, 0x5f, 0xeb, 0x15, 0x0c, 0x55, 0xc9, 0x9c, 0x3c, 0x3d,
++ 0x2e, 0x35, 0x46, 0x09, 0x3e, 0xc9, 0x56, 0xa7, 0x06, 0x70, 0x65, 0x0d,
++ 0xf0, 0xca, 0x98, 0xb3, 0xdf, 0x5e, 0x3c, 0xe3, 0x6d, 0x9f, 0x65, 0x78,
++ 0xc8, 0x3e, 0xa3, 0x20, 0xf4, 0x0f, 0xe2, 0x4c, 0x4e, 0x30, 0xe5, 0x00,
++ 0x31, 0x65, 0x6c, 0x90, 0x78, 0xb3, 0xa5, 0xe0, 0x9c, 0xb7, 0x32, 0x3e,
++ 0xa2, 0xcf, 0x3f, 0x49, 0xac, 0x7a, 0x18, 0xce, 0x7e, 0x7b, 0x43, 0xf1,
++ 0x0c, 0x42, 0x2c, 0xdf, 0xa9, 0xb6, 0x16, 0xec, 0x33, 0x5a, 0x8c, 0xb1,
++ 0x76, 0xb5, 0x79, 0xb6, 0x43, 0x6d, 0x99, 0xed, 0x52, 0x3b, 0x0a, 0xd2,
++ 0xb3, 0x3e, 0xd0, 0x7a, 0xff, 0x89, 0xed, 0x6a, 0xeb, 0x74, 0x8f, 0x22,
++ 0xa6, 0x0d, 0xf9, 0x52, 0x19, 0xd5, 0x35, 0xeb, 0xcc, 0xcf, 0x3b, 0xd9,
++ 0x77, 0x6d, 0x35, 0x4b, 0xfd, 0xbc, 0xfc, 0x1f, 0x57, 0x58, 0xfe, 0x67,
++ 0xa2, 0x77, 0xa3, 0xb2, 0xac, 0x5b, 0x93, 0x7f, 0x2d, 0xf6, 0xb0, 0x9e,
++ 0x4e, 0xb2, 0x36, 0x9a, 0x55, 0xe8, 0x63, 0xdf, 0x31, 0x6c, 0x2c, 0x2b,
++ 0xee, 0x97, 0x89, 0x4c, 0x72, 0x4e, 0x42, 0xfc, 0x15, 0x59, 0xf6, 0x20,
++ 0xf8, 0x7b, 0xf2, 0xbf, 0xb7, 0x28, 0x57, 0x97, 0x9c, 0x23, 0xf0, 0x5e,
++ 0x3f, 0x47, 0x76, 0x6c, 0xec, 0xba, 0x5c, 0x1e, 0x5e, 0x1b, 0x25, 0x3e,
++ 0xdd, 0xab, 0xb4, 0xc1, 0xa7, 0x1c, 0xb9, 0x2e, 0x5e, 0x66, 0x0c, 0x0f,
++ 0xdb, 0x31, 0xec, 0xc8, 0xb5, 0xb2, 0x28, 0xd7, 0x8a, 0x7c, 0xa7, 0x7d,
++ 0x3e, 0x8b, 0x74, 0x5a, 0xe7, 0xc6, 0xe4, 0x1c, 0x99, 0xcc, 0x2e, 0x45,
++ 0x36, 0x91, 0xe3, 0x84, 0x55, 0xa1, 0x77, 0xa9, 0x6d, 0xf6, 0xb9, 0x32,
++ 0x39, 0xd3, 0x25, 0xfb, 0xfb, 0x25, 0xb9, 0xa4, 0x8e, 0x2f, 0x0a, 0x76,
++ 0x4c, 0xca, 0x39, 0x6b, 0xcb, 0xfa, 0x99, 0x51, 0x11, 0x14, 0x59, 0xce,
++ 0x1a, 0x22, 0x8b, 0x9c, 0x17, 0x29, 0xc9, 0xf3, 0xb5, 0xa2, 0x3c, 0x62,
++ 0xab, 0xeb, 0x76, 0x2a, 0xfd, 0xff, 0xdf, 0xdb, 0x39, 0xe7, 0x2c, 0x49,
++ 0x49, 0x9e, 0x60, 0x4a, 0xf8, 0xcf, 0xb7, 0x8e, 0x8e, 0x0f, 0xe0, 0x15,
++ 0xde, 0xff, 0x65, 0xae, 0x24, 0x97, 0x1b, 0x33, 0xd3, 0xa5, 0x33, 0x72,
++ 0x6c, 0x29, 0xcd, 0x98, 0x31, 0x42, 0x3f, 0x72, 0xe4, 0x93, 0x33, 0x72,
++ 0x8d, 0xf3, 0x97, 0xed, 0xb9, 0x57, 0x3c, 0xcd, 0x7e, 0x19, 0x67, 0x0b,
++ 0xbf, 0x6d, 0xbf, 0xa6, 0x7c, 0x05, 0x7b, 0x64, 0xa1, 0x3d, 0x47, 0xda,
++ 0x72, 0x96, 0x44, 0xe1, 0xa9, 0x69, 0x60, 0xda, 0xe4, 0xb2, 0xa9, 0x21,
++ 0x3c, 0x6e, 0x58, 0xd6, 0x93, 0xcd, 0xba, 0x9c, 0x01, 0xba, 0x50, 0x6b,
++ 0xcf, 0x85, 0x60, 0x54, 0xe9, 0xb2, 0x77, 0x27, 0xe7, 0x48, 0x7a, 0xa8,
++ 0x03, 0x91, 0x5d, 0x7c, 0xa0, 0x64, 0x7b, 0x39, 0xdf, 0x96, 0xa5, 0x7e,
++ 0x44, 0x37, 0xa5, 0x73, 0x6e, 0x32, 0x73, 0xb9, 0x51, 0x27, 0xb7, 0xd9,
++ 0x3a, 0x79, 0xda, 0x10, 0x7f, 0x65, 0xf6, 0xa1, 0xaf, 0xce, 0x10, 0x3f,
++ 0x8c, 0x18, 0x5e, 0x1b, 0xab, 0x1d, 0x26, 0x3e, 0x39, 0xc2, 0xd8, 0x79,
++ 0xd4, 0xbc, 0x88, 0x8b, 0xf9, 0x97, 0xf0, 0xca, 0xb5, 0xff, 0x85, 0x13,
++ 0x7f, 0xf1, 0xb5, 0x6c, 0xb1, 0xcf, 0x32, 0xfd, 0x75, 0xcb, 0xb2, 0xb8,
++ 0xe4, 0xa1, 0x93, 0x4d, 0x72, 0xb6, 0xa9, 0x3c, 0xf5, 0xde, 0x3a, 0xd9,
++ 0xdf, 0x2a, 0x4b, 0x0d, 0x7e, 0xf5, 0x82, 0x2e, 0xba, 0xf9, 0x64, 0xf5,
++ 0x19, 0x5d, 0xe4, 0xd2, 0x8d, 0x51, 0xfb, 0x7f, 0x33, 0x43, 0x6b, 0x77,
++ 0xeb, 0x12, 0x3b, 0xef, 0x34, 0xb7, 0xd9, 0x39, 0x61, 0x30, 0x75, 0xab,
++ 0xad, 0x83, 0x83, 0xa9, 0x65, 0x8e, 0x2e, 0x52, 0x09, 0xfb, 0xfb, 0xe1,
++ 0x94, 0xa3, 0x9b, 0x5c, 0xaa, 0xde, 0xfe, 0x1e, 0x4d, 0x39, 0x67, 0xa2,
++ 0xb3, 0x29, 0xdd, 0xfe, 0x1e, 0x4f, 0xc5, 0xec, 0xef, 0x23, 0xa9, 0x5b,
++ 0xae, 0xf3, 0xc5, 0x9f, 0xff, 0x07, 0xd8, 0xc4, 0xd3, 0xb4, 0xb4, 0x3a,
+ 0x00, 0x00, 0x00 };
+
+ static const u32 bnx2_TXP_b06FwData[(0x0/4) + 1] = { 0x0 };
+ static const u32 bnx2_TXP_b06FwRodata[(0x0/4) + 1] = { 0x0 };
+
+ static struct fw_info bnx2_txp_fw_06 = {
+- /* Firmware version: 4.6.16 */
++ /* Firmware version: 4.4.2 */
+ .ver_major = 0x4,
+- .ver_minor = 0x6,
+- .ver_fix = 0x10,
++ .ver_minor = 0x4,
++ .ver_fix = 0x2,
+
+ .start_addr = 0x08000098,
+
+ .text_addr = 0x08000000,
+- .text_len = 0x3a74,
++ .text_len = 0x3ab0,
+ .text_index = 0x0,
+ .gz_text = bnx2_TXP_b06FwText,
+ .gz_text_len = sizeof(bnx2_TXP_b06FwText),
+@@ -4432,11 +4535,11 @@
+ .data_index = 0x0,
+ .data = bnx2_TXP_b06FwData,
+
+- .sbss_addr = 0x08003aa0,
++ .sbss_addr = 0x08003ae0,
+ .sbss_len = 0x68,
+ .sbss_index = 0x0,
+
+- .bss_addr = 0x08003b08,
++ .bss_addr = 0x08003b48,
+ .bss_len = 0x14c,
+ .bss_index = 0x0,
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/bnx2.h linux-2.6.29-rc3.owrt/drivers/net/bnx2.h
+--- linux-2.6.29.owrt/drivers/net/bnx2.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/bnx2.h 2009-05-10 23:48:28.000000000 +0200
+@@ -1,6 +1,6 @@
+ /* bnx2.h: Broadcom NX2 network driver.
+ *
+- * Copyright (c) 2004-2009 Broadcom Corporation
++ * Copyright (c) 2004-2007 Broadcom Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/bnx2x.h linux-2.6.29-rc3.owrt/drivers/net/bnx2x.h
+--- linux-2.6.29.owrt/drivers/net/bnx2x.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/bnx2x.h 2009-05-10 23:48:28.000000000 +0200
+@@ -152,7 +152,7 @@
+ #define PAGES_PER_SGE (1 << PAGES_PER_SGE_SHIFT)
+ #define SGE_PAGE_SIZE PAGE_SIZE
+ #define SGE_PAGE_SHIFT PAGE_SHIFT
+-#define SGE_PAGE_ALIGN(addr) PAGE_ALIGN((typeof(PAGE_SIZE))addr)
++#define SGE_PAGE_ALIGN(addr) PAGE_ALIGN(addr)
+
+ #define BCM_RX_ETH_PAYLOAD_ALIGN 64
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/bnx2x_init.h linux-2.6.29-rc3.owrt/drivers/net/bnx2x_init.h
+--- linux-2.6.29.owrt/drivers/net/bnx2x_init.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/bnx2x_init.h 2009-05-10 23:48:28.000000000 +0200
+@@ -150,6 +150,7 @@
+
+ static void bnx2x_write_big_buf(struct bnx2x *bp, u32 addr, u32 len)
+ {
++#ifdef USE_DMAE
+ int offset = 0;
+
+ if (bp->dmae_ready) {
+@@ -163,6 +164,9 @@
+ addr + offset, len);
+ } else
+ bnx2x_init_str_wr(bp, addr, bp->gunzip_buf, len);
++#else
++ bnx2x_init_str_wr(bp, addr, bp->gunzip_buf, len);
++#endif
+ }
+
+ static void bnx2x_init_fill(struct bnx2x *bp, u32 addr, int fill, u32 len)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/bnx2x_main.c linux-2.6.29-rc3.owrt/drivers/net/bnx2x_main.c
+--- linux-2.6.29.owrt/drivers/net/bnx2x_main.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/bnx2x_main.c 2009-05-10 23:48:28.000000000 +0200
+@@ -57,7 +57,7 @@
+ #include "bnx2x.h"
+ #include "bnx2x_init.h"
+
+-#define DRV_MODULE_VERSION "1.45.27"
++#define DRV_MODULE_VERSION "1.45.26"
+ #define DRV_MODULE_RELDATE "2009/01/26"
+ #define BNX2X_BC_VER 0x040200
+
+@@ -4035,10 +4035,10 @@
+ {
+ int port = BP_PORT(bp);
+
+- bnx2x_init_fill(bp, USTORM_INTMEM_ADDR +
++ bnx2x_init_fill(bp, BAR_USTRORM_INTMEM +
+ USTORM_SB_HOST_STATUS_BLOCK_OFFSET(port, sb_id), 0,
+ sizeof(struct ustorm_status_block)/4);
+- bnx2x_init_fill(bp, CSTORM_INTMEM_ADDR +
++ bnx2x_init_fill(bp, BAR_CSTRORM_INTMEM +
+ CSTORM_SB_HOST_STATUS_BLOCK_OFFSET(port, sb_id), 0,
+ sizeof(struct cstorm_status_block)/4);
+ }
+@@ -4092,18 +4092,18 @@
+ {
+ int func = BP_FUNC(bp);
+
+- bnx2x_init_fill(bp, TSTORM_INTMEM_ADDR +
+- TSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(func), 0,
+- sizeof(struct tstorm_def_status_block)/4);
+- bnx2x_init_fill(bp, USTORM_INTMEM_ADDR +
++ bnx2x_init_fill(bp, BAR_USTRORM_INTMEM +
+ USTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(func), 0,
+ sizeof(struct ustorm_def_status_block)/4);
+- bnx2x_init_fill(bp, CSTORM_INTMEM_ADDR +
++ bnx2x_init_fill(bp, BAR_CSTRORM_INTMEM +
+ CSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(func), 0,
+ sizeof(struct cstorm_def_status_block)/4);
+- bnx2x_init_fill(bp, XSTORM_INTMEM_ADDR +
++ bnx2x_init_fill(bp, BAR_XSTRORM_INTMEM +
+ XSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(func), 0,
+ sizeof(struct xstorm_def_status_block)/4);
++ bnx2x_init_fill(bp, BAR_TSTRORM_INTMEM +
++ TSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(func), 0,
++ sizeof(struct tstorm_def_status_block)/4);
+ }
+
+ static void bnx2x_init_def_sb(struct bnx2x *bp,
+@@ -4518,8 +4518,7 @@
+ (USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_TPA |
+ USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_SGE_RING);
+ context->ustorm_st_context.common.sge_buff_size =
+- (u16)min((u32)SGE_PAGE_SIZE*PAGES_PER_SGE,
+- (u32)0xffff);
++ (u16)(BCM_PAGE_SIZE*PAGES_PER_SGE);
+ context->ustorm_st_context.common.sge_page_base_hi =
+ U64_HI(fp->rx_sge_mapping);
+ context->ustorm_st_context.common.sge_page_base_lo =
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/bonding/bond_main.c linux-2.6.29-rc3.owrt/drivers/net/bonding/bond_main.c
+--- linux-2.6.29.owrt/drivers/net/bonding/bond_main.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/bonding/bond_main.c 2009-05-10 23:48:28.000000000 +0200
+@@ -3537,26 +3537,11 @@
+ }
+ break;
+ case NETDEV_CHANGE:
+- if (bond->params.mode == BOND_MODE_8023AD || bond_is_lb(bond)) {
+- struct slave *slave;
+-
+- slave = bond_get_slave_by_dev(bond, slave_dev);
+- if (slave) {
+- u16 old_speed = slave->speed;
+- u16 old_duplex = slave->duplex;
+-
+- bond_update_speed_duplex(slave);
+-
+- if (bond_is_lb(bond))
+- break;
+-
+- if (old_speed != slave->speed)
+- bond_3ad_adapter_speed_changed(slave);
+- if (old_duplex != slave->duplex)
+- bond_3ad_adapter_duplex_changed(slave);
+- }
+- }
+-
++ /*
++ * TODO: is this what we get if somebody
++ * sets up a hierarchical bond, then rmmod's
++ * one of the slave bonding devices?
++ */
+ break;
+ case NETDEV_DOWN:
+ /*
+@@ -4128,7 +4113,7 @@
+ const struct net_device_ops *slave_ops
+ = slave->dev->netdev_ops;
+ if (slave_ops->ndo_neigh_setup)
+- return slave_ops->ndo_neigh_setup(slave->dev, parms);
++ return slave_ops->ndo_neigh_setup(dev, parms);
+ }
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/cassini.c linux-2.6.29-rc3.owrt/drivers/net/cassini.c
+--- linux-2.6.29.owrt/drivers/net/cassini.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/cassini.c 2009-05-10 23:48:28.000000000 +0200
+@@ -806,7 +806,7 @@
+
+ cas_phy_write(cp, MII_BMCR, BMCR_RESET);
+ udelay(100);
+- while (--limit) {
++ while (limit--) {
+ val = cas_phy_read(cp, MII_BMCR);
+ if ((val & BMCR_RESET) == 0)
+ break;
+@@ -979,7 +979,7 @@
+ writel(val, cp->regs + REG_PCS_MII_CTRL);
+
+ limit = STOP_TRIES;
+- while (--limit > 0) {
++ while (limit-- > 0) {
+ udelay(10);
+ if ((readl(cp->regs + REG_PCS_MII_CTRL) &
+ PCS_MII_RESET) == 0)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/cxgb3/cxgb3_main.c linux-2.6.29-rc3.owrt/drivers/net/cxgb3/cxgb3_main.c
+--- linux-2.6.29.owrt/drivers/net/cxgb3/cxgb3_main.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/cxgb3/cxgb3_main.c 2009-05-10 23:48:28.000000000 +0200
+@@ -90,7 +90,6 @@
+ CH_DEVICE(0x30, 2), /* T3B10 */
+ CH_DEVICE(0x31, 3), /* T3B20 */
+ CH_DEVICE(0x32, 1), /* T3B02 */
+- CH_DEVICE(0x35, 6), /* T3C20-derived T3C10 */
+ {0,}
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/cxgb3/sge.c linux-2.6.29-rc3.owrt/drivers/net/cxgb3/sge.c
+--- linux-2.6.29.owrt/drivers/net/cxgb3/sge.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/cxgb3/sge.c 2009-05-10 23:48:28.000000000 +0200
+@@ -2276,7 +2276,8 @@
+ } else if ((len = ntohl(r->len_cq)) != 0) {
+ struct sge_fl *fl;
+
+- lro &= eth && is_eth_tcp(rss_hi);
++ if (eth)
++ lro = qs->lro_enabled && is_eth_tcp(rss_hi);
+
+ fl = (len & F_RSPD_FLQ) ? &qs->fl[1] : &qs->fl[0];
+ if (fl->use_pages) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/cxgb3/t3_hw.c linux-2.6.29-rc3.owrt/drivers/net/cxgb3/t3_hw.c
+--- linux-2.6.29.owrt/drivers/net/cxgb3/t3_hw.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/cxgb3/t3_hw.c 2009-05-10 23:48:28.000000000 +0200
+@@ -512,13 +512,6 @@
+ F_GPIO5_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL,
+ { S_GPIO9, S_GPIO3 }, SUPPORTED_10000baseT_Full | SUPPORTED_AUI,
+ &mi1_mdio_ext_ops, "Chelsio T320"},
+- {},
+- {},
+- {1, 0,
+- F_GPIO1_OEN | F_GPIO2_OEN | F_GPIO4_OEN | F_GPIO6_OEN | F_GPIO7_OEN |
+- F_GPIO10_OEN | F_GPIO1_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL,
+- { S_GPIO9 }, SUPPORTED_10000baseT_Full | SUPPORTED_AUI,
+- &mi1_mdio_ext_ops, "Chelsio T310" },
+ };
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/dm9000.c linux-2.6.29-rc3.owrt/drivers/net/dm9000.c
+--- linux-2.6.29.owrt/drivers/net/dm9000.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/dm9000.c 2009-05-10 23:48:28.000000000 +0200
+@@ -930,15 +930,13 @@
+ struct net_device *dev = dev_id;
+ board_info_t *db = netdev_priv(dev);
+ int int_status;
+- unsigned long flags;
+ u8 reg_save;
+
+ dm9000_dbg(db, 3, "entering %s\n", __func__);
+
+ /* A real interrupt coming */
+
+- /* holders of db->lock must always block IRQs */
+- spin_lock_irqsave(&db->lock, flags);
++ spin_lock(&db->lock);
+
+ /* Save previous register address */
+ reg_save = readb(db->io_addr);
+@@ -974,7 +972,7 @@
+ /* Restore previous register address */
+ writeb(reg_save, db->io_addr);
+
+- spin_unlock_irqrestore(&db->lock, flags);
++ spin_unlock(&db->lock);
+
+ return IRQ_HANDLED;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/dnet.c linux-2.6.29-rc3.owrt/drivers/net/dnet.c
+--- linux-2.6.29.owrt/drivers/net/dnet.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/dnet.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,994 +0,0 @@
+-/*
+- * Dave DNET Ethernet Controller driver
+- *
+- * Copyright (C) 2008 Dave S.r.l. <www.dave.eu>
+- * Copyright (C) 2009 Ilya Yanok, Emcraft Systems Ltd, <yanok@emcraft.com>
+- *
+- * 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.
+- */
+-#include <linux/version.h>
+-#include <linux/module.h>
+-#include <linux/moduleparam.h>
+-#include <linux/kernel.h>
+-#include <linux/types.h>
+-#include <linux/slab.h>
+-#include <linux/delay.h>
+-#include <linux/init.h>
+-#include <linux/netdevice.h>
+-#include <linux/etherdevice.h>
+-#include <linux/dma-mapping.h>
+-#include <linux/platform_device.h>
+-#include <linux/phy.h>
+-#include <linux/platform_device.h>
+-
+-#include "dnet.h"
+-
+-#undef DEBUG
+-
+-/* function for reading internal MAC register */
+-u16 dnet_readw_mac(struct dnet *bp, u16 reg)
+-{
+- u16 data_read;
+-
+- /* issue a read */
+- dnet_writel(bp, reg, MACREG_ADDR);
+-
+- /* since a read/write op to the MAC is very slow,
+- * we must wait before reading the data */
+- ndelay(500);
+-
+- /* read data read from the MAC register */
+- data_read = dnet_readl(bp, MACREG_DATA);
+-
+- /* all done */
+- return data_read;
+-}
+-
+-/* function for writing internal MAC register */
+-void dnet_writew_mac(struct dnet *bp, u16 reg, u16 val)
+-{
+- /* load data to write */
+- dnet_writel(bp, val, MACREG_DATA);
+-
+- /* issue a write */
+- dnet_writel(bp, reg | DNET_INTERNAL_WRITE, MACREG_ADDR);
+-
+- /* since a read/write op to the MAC is very slow,
+- * we must wait before exiting */
+- ndelay(500);
+-}
+-
+-static void __dnet_set_hwaddr(struct dnet *bp)
+-{
+- u16 tmp;
+-
+- tmp = cpu_to_be16(*((u16 *) bp->dev->dev_addr));
+- dnet_writew_mac(bp, DNET_INTERNAL_MAC_ADDR_0_REG, tmp);
+- tmp = cpu_to_be16(*((u16 *) (bp->dev->dev_addr + 2)));
+- dnet_writew_mac(bp, DNET_INTERNAL_MAC_ADDR_1_REG, tmp);
+- tmp = cpu_to_be16(*((u16 *) (bp->dev->dev_addr + 4)));
+- dnet_writew_mac(bp, DNET_INTERNAL_MAC_ADDR_2_REG, tmp);
+-}
+-
+-static void __devinit dnet_get_hwaddr(struct dnet *bp)
+-{
+- u16 tmp;
+- u8 addr[6];
+-
+- /*
+- * from MAC docs:
+- * "Note that the MAC address is stored in the registers in Hexadecimal
+- * form. For example, to set the MAC Address to: AC-DE-48-00-00-80
+- * would require writing 0xAC (octet 0) to address 0x0B (high byte of
+- * Mac_addr[15:0]), 0xDE (octet 1) to address 0x0A (Low byte of
+- * Mac_addr[15:0]), 0x48 (octet 2) to address 0x0D (high byte of
+- * Mac_addr[15:0]), 0x00 (octet 3) to address 0x0C (Low byte of
+- * Mac_addr[15:0]), 0x00 (octet 4) to address 0x0F (high byte of
+- * Mac_addr[15:0]), and 0x80 (octet 5) to address * 0x0E (Low byte of
+- * Mac_addr[15:0]).
+- */
+- tmp = dnet_readw_mac(bp, DNET_INTERNAL_MAC_ADDR_0_REG);
+- *((u16 *) addr) = be16_to_cpu(tmp);
+- tmp = dnet_readw_mac(bp, DNET_INTERNAL_MAC_ADDR_1_REG);
+- *((u16 *) (addr + 2)) = be16_to_cpu(tmp);
+- tmp = dnet_readw_mac(bp, DNET_INTERNAL_MAC_ADDR_2_REG);
+- *((u16 *) (addr + 4)) = be16_to_cpu(tmp);
+-
+- if (is_valid_ether_addr(addr))
+- memcpy(bp->dev->dev_addr, addr, sizeof(addr));
+-}
+-
+-static int dnet_mdio_read(struct mii_bus *bus, int mii_id, int regnum)
+-{
+- struct dnet *bp = bus->priv;
+- u16 value;
+-
+- while (!(dnet_readw_mac(bp, DNET_INTERNAL_GMII_MNG_CTL_REG)
+- & DNET_INTERNAL_GMII_MNG_CMD_FIN))
+- cpu_relax();
+-
+- /* only 5 bits allowed for phy-addr and reg_offset */
+- mii_id &= 0x1f;
+- regnum &= 0x1f;
+-
+- /* prepare reg_value for a read */
+- value = (mii_id << 8);
+- value |= regnum;
+-
+- /* write control word */
+- dnet_writew_mac(bp, DNET_INTERNAL_GMII_MNG_CTL_REG, value);
+-
+- /* wait for end of transfer */
+- while (!(dnet_readw_mac(bp, DNET_INTERNAL_GMII_MNG_CTL_REG)
+- & DNET_INTERNAL_GMII_MNG_CMD_FIN))
+- cpu_relax();
+-
+- value = dnet_readw_mac(bp, DNET_INTERNAL_GMII_MNG_DAT_REG);
+-
+- pr_debug("mdio_read %02x:%02x <- %04x\n", mii_id, regnum, value);
+-
+- return value;
+-}
+-
+-static int dnet_mdio_write(struct mii_bus *bus, int mii_id, int regnum,
+- u16 value)
+-{
+- struct dnet *bp = bus->priv;
+- u16 tmp;
+-
+- pr_debug("mdio_write %02x:%02x <- %04x\n", mii_id, regnum, value);
+-
+- while (!(dnet_readw_mac(bp, DNET_INTERNAL_GMII_MNG_CTL_REG)
+- & DNET_INTERNAL_GMII_MNG_CMD_FIN))
+- cpu_relax();
+-
+- /* prepare for a write operation */
+- tmp = (1 << 13);
+-
+- /* only 5 bits allowed for phy-addr and reg_offset */
+- mii_id &= 0x1f;
+- regnum &= 0x1f;
+-
+- /* only 16 bits on data */
+- value &= 0xffff;
+-
+- /* prepare reg_value for a write */
+- tmp |= (mii_id << 8);
+- tmp |= regnum;
+-
+- /* write data to write first */
+- dnet_writew_mac(bp, DNET_INTERNAL_GMII_MNG_DAT_REG, value);
+-
+- /* write control word */
+- dnet_writew_mac(bp, DNET_INTERNAL_GMII_MNG_CTL_REG, tmp);
+-
+- while (!(dnet_readw_mac(bp, DNET_INTERNAL_GMII_MNG_CTL_REG)
+- & DNET_INTERNAL_GMII_MNG_CMD_FIN))
+- cpu_relax();
+-
+- return 0;
+-}
+-
+-static int dnet_mdio_reset(struct mii_bus *bus)
+-{
+- return 0;
+-}
+-
+-static void dnet_handle_link_change(struct net_device *dev)
+-{
+- struct dnet *bp = netdev_priv(dev);
+- struct phy_device *phydev = bp->phy_dev;
+- unsigned long flags;
+- u32 mode_reg, ctl_reg;
+-
+- int status_change = 0;
+-
+- spin_lock_irqsave(&bp->lock, flags);
+-
+- mode_reg = dnet_readw_mac(bp, DNET_INTERNAL_MODE_REG);
+- ctl_reg = dnet_readw_mac(bp, DNET_INTERNAL_RXTX_CONTROL_REG);
+-
+- if (phydev->link) {
+- if (bp->duplex != phydev->duplex) {
+- if (phydev->duplex)
+- ctl_reg &=
+- ~(DNET_INTERNAL_RXTX_CONTROL_ENABLEHALFDUP);
+- else
+- ctl_reg |=
+- DNET_INTERNAL_RXTX_CONTROL_ENABLEHALFDUP;
+-
+- bp->duplex = phydev->duplex;
+- status_change = 1;
+- }
+-
+- if (bp->speed != phydev->speed) {
+- status_change = 1;
+- switch (phydev->speed) {
+- case 1000:
+- mode_reg |= DNET_INTERNAL_MODE_GBITEN;
+- break;
+- case 100:
+- case 10:
+- mode_reg &= ~DNET_INTERNAL_MODE_GBITEN;
+- break;
+- default:
+- printk(KERN_WARNING
+- "%s: Ack! Speed (%d) is not "
+- "10/100/1000!\n", dev->name,
+- phydev->speed);
+- break;
+- }
+- bp->speed = phydev->speed;
+- }
+- }
+-
+- if (phydev->link != bp->link) {
+- if (phydev->link) {
+- mode_reg |=
+- (DNET_INTERNAL_MODE_RXEN | DNET_INTERNAL_MODE_TXEN);
+- } else {
+- mode_reg &=
+- ~(DNET_INTERNAL_MODE_RXEN |
+- DNET_INTERNAL_MODE_TXEN);
+- bp->speed = 0;
+- bp->duplex = -1;
+- }
+- bp->link = phydev->link;
+-
+- status_change = 1;
+- }
+-
+- if (status_change) {
+- dnet_writew_mac(bp, DNET_INTERNAL_RXTX_CONTROL_REG, ctl_reg);
+- dnet_writew_mac(bp, DNET_INTERNAL_MODE_REG, mode_reg);
+- }
+-
+- spin_unlock_irqrestore(&bp->lock, flags);
+-
+- if (status_change) {
+- if (phydev->link)
+- printk(KERN_INFO "%s: link up (%d/%s)\n",
+- dev->name, phydev->speed,
+- DUPLEX_FULL == phydev->duplex ? "Full" : "Half");
+- else
+- printk(KERN_INFO "%s: link down\n", dev->name);
+- }
+-}
+-
+-static int dnet_mii_probe(struct net_device *dev)
+-{
+- struct dnet *bp = netdev_priv(dev);
+- struct phy_device *phydev = NULL;
+- int phy_addr;
+-
+- /* find the first phy */
+- for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) {
+- if (bp->mii_bus->phy_map[phy_addr]) {
+- phydev = bp->mii_bus->phy_map[phy_addr];
+- break;
+- }
+- }
+-
+- if (!phydev) {
+- printk(KERN_ERR "%s: no PHY found\n", dev->name);
+- return -ENODEV;
+- }
+-
+- /* TODO : add pin_irq */
+-
+- /* attach the mac to the phy */
+- if (bp->capabilities & DNET_HAS_RMII) {
+- phydev = phy_connect(dev, dev_name(&phydev->dev),
+- &dnet_handle_link_change, 0,
+- PHY_INTERFACE_MODE_RMII);
+- } else {
+- phydev = phy_connect(dev, dev_name(&phydev->dev),
+- &dnet_handle_link_change, 0,
+- PHY_INTERFACE_MODE_MII);
+- }
+-
+- if (IS_ERR(phydev)) {
+- printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name);
+- return PTR_ERR(phydev);
+- }
+-
+- /* mask with MAC supported features */
+- if (bp->capabilities & DNET_HAS_GIGABIT)
+- phydev->supported &= PHY_GBIT_FEATURES;
+- else
+- phydev->supported &= PHY_BASIC_FEATURES;
+-
+- phydev->supported |= SUPPORTED_Asym_Pause | SUPPORTED_Pause;
+-
+- phydev->advertising = phydev->supported;
+-
+- bp->link = 0;
+- bp->speed = 0;
+- bp->duplex = -1;
+- bp->phy_dev = phydev;
+-
+- return 0;
+-}
+-
+-static int dnet_mii_init(struct dnet *bp)
+-{
+- int err, i;
+-
+- bp->mii_bus = mdiobus_alloc();
+- if (bp->mii_bus == NULL)
+- return -ENOMEM;
+-
+- bp->mii_bus->name = "dnet_mii_bus";
+- bp->mii_bus->read = &dnet_mdio_read;
+- bp->mii_bus->write = &dnet_mdio_write;
+- bp->mii_bus->reset = &dnet_mdio_reset;
+-
+- snprintf(bp->mii_bus->id, MII_BUS_ID_SIZE, "%x", 0);
+-
+- bp->mii_bus->priv = bp;
+-
+- bp->mii_bus->irq = kmalloc(sizeof(int) * PHY_MAX_ADDR, GFP_KERNEL);
+- if (!bp->mii_bus->irq) {
+- err = -ENOMEM;
+- goto err_out;
+- }
+-
+- for (i = 0; i < PHY_MAX_ADDR; i++)
+- bp->mii_bus->irq[i] = PHY_POLL;
+-
+- platform_set_drvdata(bp->dev, bp->mii_bus);
+-
+- if (mdiobus_register(bp->mii_bus)) {
+- err = -ENXIO;
+- goto err_out_free_mdio_irq;
+- }
+-
+- if (dnet_mii_probe(bp->dev) != 0) {
+- err = -ENXIO;
+- goto err_out_unregister_bus;
+- }
+-
+- return 0;
+-
+-err_out_unregister_bus:
+- mdiobus_unregister(bp->mii_bus);
+-err_out_free_mdio_irq:
+- kfree(bp->mii_bus->irq);
+-err_out:
+- mdiobus_free(bp->mii_bus);
+- return err;
+-}
+-
+-/* For Neptune board: LINK1000 as Link LED and TX as activity LED */
+-int dnet_phy_marvell_fixup(struct phy_device *phydev)
+-{
+- return phy_write(phydev, 0x18, 0x4148);
+-}
+-
+-static void dnet_update_stats(struct dnet *bp)
+-{
+- u32 __iomem *reg = bp->regs + DNET_RX_PKT_IGNR_CNT;
+- u32 *p = &bp->hw_stats.rx_pkt_ignr;
+- u32 *end = &bp->hw_stats.rx_byte + 1;
+-
+- WARN_ON((unsigned long)(end - p - 1) !=
+- (DNET_RX_BYTE_CNT - DNET_RX_PKT_IGNR_CNT) / 4);
+-
+- for (; p < end; p++, reg++)
+- *p += readl(reg);
+-
+- reg = bp->regs + DNET_TX_UNICAST_CNT;
+- p = &bp->hw_stats.tx_unicast;
+- end = &bp->hw_stats.tx_byte + 1;
+-
+- WARN_ON((unsigned long)(end - p - 1) !=
+- (DNET_TX_BYTE_CNT - DNET_TX_UNICAST_CNT) / 4);
+-
+- for (; p < end; p++, reg++)
+- *p += readl(reg);
+-}
+-
+-static int dnet_poll(struct napi_struct *napi, int budget)
+-{
+- struct dnet *bp = container_of(napi, struct dnet, napi);
+- struct net_device *dev = bp->dev;
+- int npackets = 0;
+- unsigned int pkt_len;
+- struct sk_buff *skb;
+- unsigned int *data_ptr;
+- u32 int_enable;
+- u32 cmd_word;
+- int i;
+-
+- while (npackets < budget) {
+- /*
+- * break out of while loop if there are no more
+- * packets waiting
+- */
+- if (!(dnet_readl(bp, RX_FIFO_WCNT) >> 16)) {
+- napi_complete(napi);
+- int_enable = dnet_readl(bp, INTR_ENB);
+- int_enable |= DNET_INTR_SRC_RX_CMDFIFOAF;
+- dnet_writel(bp, int_enable, INTR_ENB);
+- return 0;
+- }
+-
+- cmd_word = dnet_readl(bp, RX_LEN_FIFO);
+- pkt_len = cmd_word & 0xFFFF;
+-
+- if (cmd_word & 0xDF180000)
+- printk(KERN_ERR "%s packet receive error %x\n",
+- __func__, cmd_word);
+-
+- skb = dev_alloc_skb(pkt_len + 5);
+- if (skb != NULL) {
+- /* Align IP on 16 byte boundaries */
+- skb_reserve(skb, 2);
+- /*
+- * 'skb_put()' points to the start of sk_buff
+- * data area.
+- */
+- data_ptr = (unsigned int *)skb_put(skb, pkt_len);
+- for (i = 0; i < (pkt_len + 3) >> 2; i++)
+- *data_ptr++ = dnet_readl(bp, RX_DATA_FIFO);
+- skb->protocol = eth_type_trans(skb, dev);
+- netif_receive_skb(skb);
+- npackets++;
+- } else
+- printk(KERN_NOTICE
+- "%s: No memory to allocate a sk_buff of "
+- "size %u.\n", dev->name, pkt_len);
+- }
+-
+- budget -= npackets;
+-
+- if (npackets < budget) {
+- /* We processed all packets available. Tell NAPI it can
+- * stop polling then re-enable rx interrupts */
+- napi_complete(napi);
+- int_enable = dnet_readl(bp, INTR_ENB);
+- int_enable |= DNET_INTR_SRC_RX_CMDFIFOAF;
+- dnet_writel(bp, int_enable, INTR_ENB);
+- return 0;
+- }
+-
+- /* There are still packets waiting */
+- return 1;
+-}
+-
+-static irqreturn_t dnet_interrupt(int irq, void *dev_id)
+-{
+- struct net_device *dev = dev_id;
+- struct dnet *bp = netdev_priv(dev);
+- u32 int_src, int_enable, int_current;
+- unsigned long flags;
+- unsigned int handled = 0;
+-
+- spin_lock_irqsave(&bp->lock, flags);
+-
+- /* read and clear the DNET irq (clear on read) */
+- int_src = dnet_readl(bp, INTR_SRC);
+- int_enable = dnet_readl(bp, INTR_ENB);
+- int_current = int_src & int_enable;
+-
+- /* restart the queue if we had stopped it for TX fifo almost full */
+- if (int_current & DNET_INTR_SRC_TX_FIFOAE) {
+- int_enable = dnet_readl(bp, INTR_ENB);
+- int_enable &= ~DNET_INTR_ENB_TX_FIFOAE;
+- dnet_writel(bp, int_enable, INTR_ENB);
+- netif_wake_queue(dev);
+- handled = 1;
+- }
+-
+- /* RX FIFO error checking */
+- if (int_current &
+- (DNET_INTR_SRC_RX_CMDFIFOFF | DNET_INTR_SRC_RX_DATAFIFOFF)) {
+- printk(KERN_ERR "%s: RX fifo error %x, irq %x\n", __func__,
+- dnet_readl(bp, RX_STATUS), int_current);
+- /* we can only flush the RX FIFOs */
+- dnet_writel(bp, DNET_SYS_CTL_RXFIFOFLUSH, SYS_CTL);
+- ndelay(500);
+- dnet_writel(bp, 0, SYS_CTL);
+- handled = 1;
+- }
+-
+- /* TX FIFO error checking */
+- if (int_current &
+- (DNET_INTR_SRC_TX_FIFOFULL | DNET_INTR_SRC_TX_DISCFRM)) {
+- printk(KERN_ERR "%s: TX fifo error %x, irq %x\n", __func__,
+- dnet_readl(bp, TX_STATUS), int_current);
+- /* we can only flush the TX FIFOs */
+- dnet_writel(bp, DNET_SYS_CTL_TXFIFOFLUSH, SYS_CTL);
+- ndelay(500);
+- dnet_writel(bp, 0, SYS_CTL);
+- handled = 1;
+- }
+-
+- if (int_current & DNET_INTR_SRC_RX_CMDFIFOAF) {
+- if (napi_schedule_prep(&bp->napi)) {
+- /*
+- * There's no point taking any more interrupts
+- * until we have processed the buffers
+- */
+- /* Disable Rx interrupts and schedule NAPI poll */
+- int_enable = dnet_readl(bp, INTR_ENB);
+- int_enable &= ~DNET_INTR_SRC_RX_CMDFIFOAF;
+- dnet_writel(bp, int_enable, INTR_ENB);
+- __napi_schedule(&bp->napi);
+- }
+- handled = 1;
+- }
+-
+- if (!handled)
+- pr_debug("%s: irq %x remains\n", __func__, int_current);
+-
+- spin_unlock_irqrestore(&bp->lock, flags);
+-
+- return IRQ_RETVAL(handled);
+-}
+-
+-#ifdef DEBUG
+-static inline void dnet_print_skb(struct sk_buff *skb)
+-{
+- int k;
+- printk(KERN_DEBUG PFX "data:");
+- for (k = 0; k < skb->len; k++)
+- printk(" %02x", (unsigned int)skb->data[k]);
+- printk("\n");
+-}
+-#else
+-#define dnet_print_skb(skb) do {} while (0)
+-#endif
+-
+-static int dnet_start_xmit(struct sk_buff *skb, struct net_device *dev)
+-{
+-
+- struct dnet *bp = netdev_priv(dev);
+- u32 tx_status, irq_enable;
+- unsigned int len, i, tx_cmd, wrsz;
+- unsigned long flags;
+- unsigned int *bufp;
+-
+- tx_status = dnet_readl(bp, TX_STATUS);
+-
+- pr_debug("start_xmit: len %u head %p data %p\n",
+- skb->len, skb->head, skb->data);
+- dnet_print_skb(skb);
+-
+- /* frame size (words) */
+- len = (skb->len + 3) >> 2;
+-
+- spin_lock_irqsave(&bp->lock, flags);
+-
+- tx_status = dnet_readl(bp, TX_STATUS);
+-
+- bufp = (unsigned int *)(((unsigned long) skb->data) & ~0x3UL);
+- wrsz = (u32) skb->len + 3;
+- wrsz += ((unsigned long) skb->data) & 0x3;
+- wrsz >>= 2;
+- tx_cmd = ((((unsigned long)(skb->data)) & 0x03) << 16) | (u32) skb->len;
+-
+- /* check if there is enough room for the current frame */
+- if (wrsz < (DNET_FIFO_SIZE - dnet_readl(bp, TX_FIFO_WCNT))) {
+- for (i = 0; i < wrsz; i++)
+- dnet_writel(bp, *bufp++, TX_DATA_FIFO);
+-
+- /*
+- * inform MAC that a packet's written and ready to be
+- * shipped out
+- */
+- dnet_writel(bp, tx_cmd, TX_LEN_FIFO);
+- }
+-
+- if (dnet_readl(bp, TX_FIFO_WCNT) > DNET_FIFO_TX_DATA_AF_TH) {
+- netif_stop_queue(dev);
+- tx_status = dnet_readl(bp, INTR_SRC);
+- irq_enable = dnet_readl(bp, INTR_ENB);
+- irq_enable |= DNET_INTR_ENB_TX_FIFOAE;
+- dnet_writel(bp, irq_enable, INTR_ENB);
+- }
+-
+- /* free the buffer */
+- dev_kfree_skb(skb);
+-
+- spin_unlock_irqrestore(&bp->lock, flags);
+-
+- dev->trans_start = jiffies;
+-
+- return 0;
+-}
+-
+-static void dnet_reset_hw(struct dnet *bp)
+-{
+- /* put ts_mac in IDLE state i.e. disable rx/tx */
+- dnet_writew_mac(bp, DNET_INTERNAL_MODE_REG, DNET_INTERNAL_MODE_FCEN);
+-
+- /*
+- * RX FIFO almost full threshold: only cmd FIFO almost full is
+- * implemented for RX side
+- */
+- dnet_writel(bp, DNET_FIFO_RX_CMD_AF_TH, RX_FIFO_TH);
+- /*
+- * TX FIFO almost empty threshold: only data FIFO almost empty
+- * is implemented for TX side
+- */
+- dnet_writel(bp, DNET_FIFO_TX_DATA_AE_TH, TX_FIFO_TH);
+-
+- /* flush rx/tx fifos */
+- dnet_writel(bp, DNET_SYS_CTL_RXFIFOFLUSH | DNET_SYS_CTL_TXFIFOFLUSH,
+- SYS_CTL);
+- msleep(1);
+- dnet_writel(bp, 0, SYS_CTL);
+-}
+-
+-static void dnet_init_hw(struct dnet *bp)
+-{
+- u32 config;
+-
+- dnet_reset_hw(bp);
+- __dnet_set_hwaddr(bp);
+-
+- config = dnet_readw_mac(bp, DNET_INTERNAL_RXTX_CONTROL_REG);
+-
+- if (bp->dev->flags & IFF_PROMISC)
+- /* Copy All Frames */
+- config |= DNET_INTERNAL_RXTX_CONTROL_ENPROMISC;
+- if (!(bp->dev->flags & IFF_BROADCAST))
+- /* No BroadCast */
+- config |= DNET_INTERNAL_RXTX_CONTROL_RXMULTICAST;
+-
+- config |= DNET_INTERNAL_RXTX_CONTROL_RXPAUSE |
+- DNET_INTERNAL_RXTX_CONTROL_RXBROADCAST |
+- DNET_INTERNAL_RXTX_CONTROL_DROPCONTROL |
+- DNET_INTERNAL_RXTX_CONTROL_DISCFXFCS;
+-
+- dnet_writew_mac(bp, DNET_INTERNAL_RXTX_CONTROL_REG, config);
+-
+- /* clear irq before enabling them */
+- config = dnet_readl(bp, INTR_SRC);
+-
+- /* enable RX/TX interrupt, recv packet ready interrupt */
+- dnet_writel(bp, DNET_INTR_ENB_GLOBAL_ENABLE | DNET_INTR_ENB_RX_SUMMARY |
+- DNET_INTR_ENB_TX_SUMMARY | DNET_INTR_ENB_RX_FIFOERR |
+- DNET_INTR_ENB_RX_ERROR | DNET_INTR_ENB_RX_FIFOFULL |
+- DNET_INTR_ENB_TX_FIFOFULL | DNET_INTR_ENB_TX_DISCFRM |
+- DNET_INTR_ENB_RX_PKTRDY, INTR_ENB);
+-}
+-
+-static int dnet_open(struct net_device *dev)
+-{
+- struct dnet *bp = netdev_priv(dev);
+-
+- /* if the phy is not yet register, retry later */
+- if (!bp->phy_dev)
+- return -EAGAIN;
+-
+- if (!is_valid_ether_addr(dev->dev_addr))
+- return -EADDRNOTAVAIL;
+-
+- napi_enable(&bp->napi);
+- dnet_init_hw(bp);
+-
+- phy_start_aneg(bp->phy_dev);
+-
+- /* schedule a link state check */
+- phy_start(bp->phy_dev);
+-
+- netif_start_queue(dev);
+-
+- return 0;
+-}
+-
+-static int dnet_close(struct net_device *dev)
+-{
+- struct dnet *bp = netdev_priv(dev);
+-
+- netif_stop_queue(dev);
+- napi_disable(&bp->napi);
+-
+- if (bp->phy_dev)
+- phy_stop(bp->phy_dev);
+-
+- dnet_reset_hw(bp);
+- netif_carrier_off(dev);
+-
+- return 0;
+-}
+-
+-static inline void dnet_print_pretty_hwstats(struct dnet_stats *hwstat)
+-{
+- pr_debug("%s\n", __func__);
+- pr_debug("----------------------------- RX statistics "
+- "-------------------------------\n");
+- pr_debug("RX_PKT_IGNR_CNT %-8x\n", hwstat->rx_pkt_ignr);
+- pr_debug("RX_LEN_CHK_ERR_CNT %-8x\n", hwstat->rx_len_chk_err);
+- pr_debug("RX_LNG_FRM_CNT %-8x\n", hwstat->rx_lng_frm);
+- pr_debug("RX_SHRT_FRM_CNT %-8x\n", hwstat->rx_shrt_frm);
+- pr_debug("RX_IPG_VIOL_CNT %-8x\n", hwstat->rx_ipg_viol);
+- pr_debug("RX_CRC_ERR_CNT %-8x\n", hwstat->rx_crc_err);
+- pr_debug("RX_OK_PKT_CNT %-8x\n", hwstat->rx_ok_pkt);
+- pr_debug("RX_CTL_FRM_CNT %-8x\n", hwstat->rx_ctl_frm);
+- pr_debug("RX_PAUSE_FRM_CNT %-8x\n", hwstat->rx_pause_frm);
+- pr_debug("RX_MULTICAST_CNT %-8x\n", hwstat->rx_multicast);
+- pr_debug("RX_BROADCAST_CNT %-8x\n", hwstat->rx_broadcast);
+- pr_debug("RX_VLAN_TAG_CNT %-8x\n", hwstat->rx_vlan_tag);
+- pr_debug("RX_PRE_SHRINK_CNT %-8x\n", hwstat->rx_pre_shrink);
+- pr_debug("RX_DRIB_NIB_CNT %-8x\n", hwstat->rx_drib_nib);
+- pr_debug("RX_UNSUP_OPCD_CNT %-8x\n", hwstat->rx_unsup_opcd);
+- pr_debug("RX_BYTE_CNT %-8x\n", hwstat->rx_byte);
+- pr_debug("----------------------------- TX statistics "
+- "-------------------------------\n");
+- pr_debug("TX_UNICAST_CNT %-8x\n", hwstat->tx_unicast);
+- pr_debug("TX_PAUSE_FRM_CNT %-8x\n", hwstat->tx_pause_frm);
+- pr_debug("TX_MULTICAST_CNT %-8x\n", hwstat->tx_multicast);
+- pr_debug("TX_BRDCAST_CNT %-8x\n", hwstat->tx_brdcast);
+- pr_debug("TX_VLAN_TAG_CNT %-8x\n", hwstat->tx_vlan_tag);
+- pr_debug("TX_BAD_FCS_CNT %-8x\n", hwstat->tx_bad_fcs);
+- pr_debug("TX_JUMBO_CNT %-8x\n", hwstat->tx_jumbo);
+- pr_debug("TX_BYTE_CNT %-8x\n", hwstat->tx_byte);
+-}
+-
+-static struct net_device_stats *dnet_get_stats(struct net_device *dev)
+-{
+-
+- struct dnet *bp = netdev_priv(dev);
+- struct net_device_stats *nstat = &dev->stats;
+- struct dnet_stats *hwstat = &bp->hw_stats;
+-
+- /* read stats from hardware */
+- dnet_update_stats(bp);
+-
+- /* Convert HW stats into netdevice stats */
+- nstat->rx_errors = (hwstat->rx_len_chk_err +
+- hwstat->rx_lng_frm + hwstat->rx_shrt_frm +
+- /* ignore IGP violation error
+- hwstat->rx_ipg_viol + */
+- hwstat->rx_crc_err +
+- hwstat->rx_pre_shrink +
+- hwstat->rx_drib_nib + hwstat->rx_unsup_opcd);
+- nstat->tx_errors = hwstat->tx_bad_fcs;
+- nstat->rx_length_errors = (hwstat->rx_len_chk_err +
+- hwstat->rx_lng_frm +
+- hwstat->rx_shrt_frm + hwstat->rx_pre_shrink);
+- nstat->rx_crc_errors = hwstat->rx_crc_err;
+- nstat->rx_frame_errors = hwstat->rx_pre_shrink + hwstat->rx_drib_nib;
+- nstat->rx_packets = hwstat->rx_ok_pkt;
+- nstat->tx_packets = (hwstat->tx_unicast +
+- hwstat->tx_multicast + hwstat->tx_brdcast);
+- nstat->rx_bytes = hwstat->rx_byte;
+- nstat->tx_bytes = hwstat->tx_byte;
+- nstat->multicast = hwstat->rx_multicast;
+- nstat->rx_missed_errors = hwstat->rx_pkt_ignr;
+-
+- dnet_print_pretty_hwstats(hwstat);
+-
+- return nstat;
+-}
+-
+-static int dnet_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+-{
+- struct dnet *bp = netdev_priv(dev);
+- struct phy_device *phydev = bp->phy_dev;
+-
+- if (!phydev)
+- return -ENODEV;
+-
+- return phy_ethtool_gset(phydev, cmd);
+-}
+-
+-static int dnet_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+-{
+- struct dnet *bp = netdev_priv(dev);
+- struct phy_device *phydev = bp->phy_dev;
+-
+- if (!phydev)
+- return -ENODEV;
+-
+- return phy_ethtool_sset(phydev, cmd);
+-}
+-
+-static int dnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
+-{
+- struct dnet *bp = netdev_priv(dev);
+- struct phy_device *phydev = bp->phy_dev;
+-
+- if (!netif_running(dev))
+- return -EINVAL;
+-
+- if (!phydev)
+- return -ENODEV;
+-
+- return phy_mii_ioctl(phydev, if_mii(rq), cmd);
+-}
+-
+-static void dnet_get_drvinfo(struct net_device *dev,
+- struct ethtool_drvinfo *info)
+-{
+- strcpy(info->driver, DRV_NAME);
+- strcpy(info->version, DRV_VERSION);
+- strcpy(info->bus_info, "0");
+-}
+-
+-static const struct ethtool_ops dnet_ethtool_ops = {
+- .get_settings = dnet_get_settings,
+- .set_settings = dnet_set_settings,
+- .get_drvinfo = dnet_get_drvinfo,
+- .get_link = ethtool_op_get_link,
+-};
+-
+-static const struct net_device_ops dnet_netdev_ops = {
+- .ndo_open = dnet_open,
+- .ndo_stop = dnet_close,
+- .ndo_get_stats = dnet_get_stats,
+- .ndo_start_xmit = dnet_start_xmit,
+- .ndo_do_ioctl = dnet_ioctl,
+- .ndo_set_mac_address = eth_mac_addr,
+- .ndo_validate_addr = eth_validate_addr,
+- .ndo_change_mtu = eth_change_mtu,
+-};
+-
+-static int __devinit dnet_probe(struct platform_device *pdev)
+-{
+- struct resource *res;
+- struct net_device *dev;
+- struct dnet *bp;
+- struct phy_device *phydev;
+- int err = -ENXIO;
+- unsigned int mem_base, mem_size, irq;
+-
+- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+- if (!res) {
+- dev_err(&pdev->dev, "no mmio resource defined\n");
+- goto err_out;
+- }
+- mem_base = res->start;
+- mem_size = resource_size(res);
+- irq = platform_get_irq(pdev, 0);
+-
+- if (!request_mem_region(mem_base, mem_size, DRV_NAME)) {
+- dev_err(&pdev->dev, "no memory region available\n");
+- err = -EBUSY;
+- goto err_out;
+- }
+-
+- err = -ENOMEM;
+- dev = alloc_etherdev(sizeof(*bp));
+- if (!dev) {
+- dev_err(&pdev->dev, "etherdev alloc failed, aborting.\n");
+- goto err_out;
+- }
+-
+- /* TODO: Actually, we have some interesting features... */
+- dev->features |= 0;
+-
+- bp = netdev_priv(dev);
+- bp->dev = dev;
+-
+- SET_NETDEV_DEV(dev, &pdev->dev);
+-
+- spin_lock_init(&bp->lock);
+-
+- bp->regs = ioremap(mem_base, mem_size);
+- if (!bp->regs) {
+- dev_err(&pdev->dev, "failed to map registers, aborting.\n");
+- err = -ENOMEM;
+- goto err_out_free_dev;
+- }
+-
+- dev->irq = irq;
+- err = request_irq(dev->irq, dnet_interrupt, 0, DRV_NAME, dev);
+- if (err) {
+- dev_err(&pdev->dev, "Unable to request IRQ %d (error %d)\n",
+- irq, err);
+- goto err_out_iounmap;
+- }
+-
+- dev->netdev_ops = &dnet_netdev_ops;
+- netif_napi_add(dev, &bp->napi, dnet_poll, 64);
+- dev->ethtool_ops = &dnet_ethtool_ops;
+-
+- dev->base_addr = (unsigned long)bp->regs;
+-
+- bp->capabilities = dnet_readl(bp, VERCAPS) & DNET_CAPS_MASK;
+-
+- dnet_get_hwaddr(bp);
+-
+- if (!is_valid_ether_addr(dev->dev_addr)) {
+- /* choose a random ethernet address */
+- random_ether_addr(dev->dev_addr);
+- __dnet_set_hwaddr(bp);
+- }
+-
+- err = register_netdev(dev);
+- if (err) {
+- dev_err(&pdev->dev, "Cannot register net device, aborting.\n");
+- goto err_out_free_irq;
+- }
+-
+- /* register the PHY board fixup (for Marvell 88E1111) */
+- err = phy_register_fixup_for_uid(0x01410cc0, 0xfffffff0,
+- dnet_phy_marvell_fixup);
+- /* we can live without it, so just issue a warning */
+- if (err)
+- dev_warn(&pdev->dev, "Cannot register PHY board fixup.\n");
+-
+- if (dnet_mii_init(bp) != 0)
+- goto err_out_unregister_netdev;
+-
+- dev_info(&pdev->dev, "Dave DNET at 0x%p (0x%08x) irq %d %pM\n",
+- bp->regs, mem_base, dev->irq, dev->dev_addr);
+- dev_info(&pdev->dev, "has %smdio, %sirq, %sgigabit, %sdma \n",
+- (bp->capabilities & DNET_HAS_MDIO) ? "" : "no ",
+- (bp->capabilities & DNET_HAS_IRQ) ? "" : "no ",
+- (bp->capabilities & DNET_HAS_GIGABIT) ? "" : "no ",
+- (bp->capabilities & DNET_HAS_DMA) ? "" : "no ");
+- phydev = bp->phy_dev;
+- dev_info(&pdev->dev, "attached PHY driver [%s] "
+- "(mii_bus:phy_addr=%s, irq=%d)\n",
+- phydev->drv->name, dev_name(&phydev->dev), phydev->irq);
+-
+- return 0;
+-
+-err_out_unregister_netdev:
+- unregister_netdev(dev);
+-err_out_free_irq:
+- free_irq(dev->irq, dev);
+-err_out_iounmap:
+- iounmap(bp->regs);
+-err_out_free_dev:
+- free_netdev(dev);
+-err_out:
+- return err;
+-}
+-
+-static int __devexit dnet_remove(struct platform_device *pdev)
+-{
+-
+- struct net_device *dev;
+- struct dnet *bp;
+-
+- dev = platform_get_drvdata(pdev);
+-
+- if (dev) {
+- bp = netdev_priv(dev);
+- if (bp->phy_dev)
+- phy_disconnect(bp->phy_dev);
+- mdiobus_unregister(bp->mii_bus);
+- kfree(bp->mii_bus->irq);
+- mdiobus_free(bp->mii_bus);
+- unregister_netdev(dev);
+- free_irq(dev->irq, dev);
+- iounmap(bp->regs);
+- free_netdev(dev);
+- }
+-
+- return 0;
+-}
+-
+-static struct platform_driver dnet_driver = {
+- .probe = dnet_probe,
+- .remove = __devexit_p(dnet_remove),
+- .driver = {
+- .name = "dnet",
+- },
+-};
+-
+-static int __init dnet_init(void)
+-{
+- return platform_driver_register(&dnet_driver);
+-}
+-
+-static void __exit dnet_exit(void)
+-{
+- platform_driver_unregister(&dnet_driver);
+-}
+-
+-module_init(dnet_init);
+-module_exit(dnet_exit);
+-
+-MODULE_LICENSE("GPL");
+-MODULE_DESCRIPTION("Dave DNET Ethernet driver");
+-MODULE_AUTHOR("Ilya Yanok <yanok@emcraft.com>, "
+- "Matteo Vit <matteo.vit@dave.eu>");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/dnet.h linux-2.6.29-rc3.owrt/drivers/net/dnet.h
+--- linux-2.6.29.owrt/drivers/net/dnet.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/dnet.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,225 +0,0 @@
+-/*
+- * Dave DNET Ethernet Controller driver
+- *
+- * Copyright (C) 2008 Dave S.r.l. <www.dave.eu>
+- *
+- * 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.
+- */
+-#ifndef _DNET_H
+-#define _DNET_H
+-
+-#define DRV_NAME "dnet"
+-#define DRV_VERSION "0.9.1"
+-#define PFX DRV_NAME ": "
+-
+-/* Register access macros */
+-#define dnet_writel(port, value, reg) \
+- writel((value), (port)->regs + DNET_##reg)
+-#define dnet_readl(port, reg) readl((port)->regs + DNET_##reg)
+-
+-/* ALL DNET FIFO REGISTERS */
+-#define DNET_RX_LEN_FIFO 0x000 /* RX_LEN_FIFO */
+-#define DNET_RX_DATA_FIFO 0x004 /* RX_DATA_FIFO */
+-#define DNET_TX_LEN_FIFO 0x008 /* TX_LEN_FIFO */
+-#define DNET_TX_DATA_FIFO 0x00C /* TX_DATA_FIFO */
+-
+-/* ALL DNET CONTROL/STATUS REGISTERS OFFSETS */
+-#define DNET_VERCAPS 0x100 /* VERCAPS */
+-#define DNET_INTR_SRC 0x104 /* INTR_SRC */
+-#define DNET_INTR_ENB 0x108 /* INTR_ENB */
+-#define DNET_RX_STATUS 0x10C /* RX_STATUS */
+-#define DNET_TX_STATUS 0x110 /* TX_STATUS */
+-#define DNET_RX_FRAMES_CNT 0x114 /* RX_FRAMES_CNT */
+-#define DNET_TX_FRAMES_CNT 0x118 /* TX_FRAMES_CNT */
+-#define DNET_RX_FIFO_TH 0x11C /* RX_FIFO_TH */
+-#define DNET_TX_FIFO_TH 0x120 /* TX_FIFO_TH */
+-#define DNET_SYS_CTL 0x124 /* SYS_CTL */
+-#define DNET_PAUSE_TMR 0x128 /* PAUSE_TMR */
+-#define DNET_RX_FIFO_WCNT 0x12C /* RX_FIFO_WCNT */
+-#define DNET_TX_FIFO_WCNT 0x130 /* TX_FIFO_WCNT */
+-
+-/* ALL DNET MAC REGISTERS */
+-#define DNET_MACREG_DATA 0x200 /* Mac-Reg Data */
+-#define DNET_MACREG_ADDR 0x204 /* Mac-Reg Addr */
+-
+-/* ALL DNET RX STATISTICS COUNTERS */
+-#define DNET_RX_PKT_IGNR_CNT 0x300
+-#define DNET_RX_LEN_CHK_ERR_CNT 0x304
+-#define DNET_RX_LNG_FRM_CNT 0x308
+-#define DNET_RX_SHRT_FRM_CNT 0x30C
+-#define DNET_RX_IPG_VIOL_CNT 0x310
+-#define DNET_RX_CRC_ERR_CNT 0x314
+-#define DNET_RX_OK_PKT_CNT 0x318
+-#define DNET_RX_CTL_FRM_CNT 0x31C
+-#define DNET_RX_PAUSE_FRM_CNT 0x320
+-#define DNET_RX_MULTICAST_CNT 0x324
+-#define DNET_RX_BROADCAST_CNT 0x328
+-#define DNET_RX_VLAN_TAG_CNT 0x32C
+-#define DNET_RX_PRE_SHRINK_CNT 0x330
+-#define DNET_RX_DRIB_NIB_CNT 0x334
+-#define DNET_RX_UNSUP_OPCD_CNT 0x338
+-#define DNET_RX_BYTE_CNT 0x33C
+-
+-/* DNET TX STATISTICS COUNTERS */
+-#define DNET_TX_UNICAST_CNT 0x400
+-#define DNET_TX_PAUSE_FRM_CNT 0x404
+-#define DNET_TX_MULTICAST_CNT 0x408
+-#define DNET_TX_BRDCAST_CNT 0x40C
+-#define DNET_TX_VLAN_TAG_CNT 0x410
+-#define DNET_TX_BAD_FCS_CNT 0x414
+-#define DNET_TX_JUMBO_CNT 0x418
+-#define DNET_TX_BYTE_CNT 0x41C
+-
+-/* SOME INTERNAL MAC-CORE REGISTER */
+-#define DNET_INTERNAL_MODE_REG 0x0
+-#define DNET_INTERNAL_RXTX_CONTROL_REG 0x2
+-#define DNET_INTERNAL_MAX_PKT_SIZE_REG 0x4
+-#define DNET_INTERNAL_IGP_REG 0x8
+-#define DNET_INTERNAL_MAC_ADDR_0_REG 0xa
+-#define DNET_INTERNAL_MAC_ADDR_1_REG 0xc
+-#define DNET_INTERNAL_MAC_ADDR_2_REG 0xe
+-#define DNET_INTERNAL_TX_RX_STS_REG 0x12
+-#define DNET_INTERNAL_GMII_MNG_CTL_REG 0x14
+-#define DNET_INTERNAL_GMII_MNG_DAT_REG 0x16
+-
+-#define DNET_INTERNAL_GMII_MNG_CMD_FIN (1 << 14)
+-
+-#define DNET_INTERNAL_WRITE (1 << 31)
+-
+-/* MAC-CORE REGISTER FIELDS */
+-
+-/* MAC-CORE MODE REGISTER FIELDS */
+-#define DNET_INTERNAL_MODE_GBITEN (1 << 0)
+-#define DNET_INTERNAL_MODE_FCEN (1 << 1)
+-#define DNET_INTERNAL_MODE_RXEN (1 << 2)
+-#define DNET_INTERNAL_MODE_TXEN (1 << 3)
+-
+-/* MAC-CORE RXTX CONTROL REGISTER FIELDS */
+-#define DNET_INTERNAL_RXTX_CONTROL_RXSHORTFRAME (1 << 8)
+-#define DNET_INTERNAL_RXTX_CONTROL_RXBROADCAST (1 << 7)
+-#define DNET_INTERNAL_RXTX_CONTROL_RXMULTICAST (1 << 4)
+-#define DNET_INTERNAL_RXTX_CONTROL_RXPAUSE (1 << 3)
+-#define DNET_INTERNAL_RXTX_CONTROL_DISTXFCS (1 << 2)
+-#define DNET_INTERNAL_RXTX_CONTROL_DISCFXFCS (1 << 1)
+-#define DNET_INTERNAL_RXTX_CONTROL_ENPROMISC (1 << 0)
+-#define DNET_INTERNAL_RXTX_CONTROL_DROPCONTROL (1 << 6)
+-#define DNET_INTERNAL_RXTX_CONTROL_ENABLEHALFDUP (1 << 5)
+-
+-/* SYSTEM CONTROL REGISTER FIELDS */
+-#define DNET_SYS_CTL_IGNORENEXTPKT (1 << 0)
+-#define DNET_SYS_CTL_SENDPAUSE (1 << 2)
+-#define DNET_SYS_CTL_RXFIFOFLUSH (1 << 3)
+-#define DNET_SYS_CTL_TXFIFOFLUSH (1 << 4)
+-
+-/* TX STATUS REGISTER FIELDS */
+-#define DNET_TX_STATUS_FIFO_ALMOST_EMPTY (1 << 2)
+-#define DNET_TX_STATUS_FIFO_ALMOST_FULL (1 << 1)
+-
+-/* INTERRUPT SOURCE REGISTER FIELDS */
+-#define DNET_INTR_SRC_TX_PKTSENT (1 << 0)
+-#define DNET_INTR_SRC_TX_FIFOAF (1 << 1)
+-#define DNET_INTR_SRC_TX_FIFOAE (1 << 2)
+-#define DNET_INTR_SRC_TX_DISCFRM (1 << 3)
+-#define DNET_INTR_SRC_TX_FIFOFULL (1 << 4)
+-#define DNET_INTR_SRC_RX_CMDFIFOAF (1 << 8)
+-#define DNET_INTR_SRC_RX_CMDFIFOFF (1 << 9)
+-#define DNET_INTR_SRC_RX_DATAFIFOFF (1 << 10)
+-#define DNET_INTR_SRC_TX_SUMMARY (1 << 16)
+-#define DNET_INTR_SRC_RX_SUMMARY (1 << 17)
+-#define DNET_INTR_SRC_PHY (1 << 19)
+-
+-/* INTERRUPT ENABLE REGISTER FIELDS */
+-#define DNET_INTR_ENB_TX_PKTSENT (1 << 0)
+-#define DNET_INTR_ENB_TX_FIFOAF (1 << 1)
+-#define DNET_INTR_ENB_TX_FIFOAE (1 << 2)
+-#define DNET_INTR_ENB_TX_DISCFRM (1 << 3)
+-#define DNET_INTR_ENB_TX_FIFOFULL (1 << 4)
+-#define DNET_INTR_ENB_RX_PKTRDY (1 << 8)
+-#define DNET_INTR_ENB_RX_FIFOAF (1 << 9)
+-#define DNET_INTR_ENB_RX_FIFOERR (1 << 10)
+-#define DNET_INTR_ENB_RX_ERROR (1 << 11)
+-#define DNET_INTR_ENB_RX_FIFOFULL (1 << 12)
+-#define DNET_INTR_ENB_RX_FIFOAE (1 << 13)
+-#define DNET_INTR_ENB_TX_SUMMARY (1 << 16)
+-#define DNET_INTR_ENB_RX_SUMMARY (1 << 17)
+-#define DNET_INTR_ENB_GLOBAL_ENABLE (1 << 18)
+-
+-/* default values:
+- * almost empty = less than one full sized ethernet frame (no jumbo) inside
+- * the fifo almost full = can write less than one full sized ethernet frame
+- * (no jumbo) inside the fifo
+- */
+-#define DNET_CFG_TX_FIFO_FULL_THRES 25
+-#define DNET_CFG_RX_FIFO_FULL_THRES 20
+-
+-/*
+- * Capabilities. Used by the driver to know the capabilities that the ethernet
+- * controller inside the FPGA have.
+- */
+-
+-#define DNET_HAS_MDIO (1 << 0)
+-#define DNET_HAS_IRQ (1 << 1)
+-#define DNET_HAS_GIGABIT (1 << 2)
+-#define DNET_HAS_DMA (1 << 3)
+-
+-#define DNET_HAS_MII (1 << 4) /* or GMII */
+-#define DNET_HAS_RMII (1 << 5) /* or RGMII */
+-
+-#define DNET_CAPS_MASK 0xFFFF
+-
+-#define DNET_FIFO_SIZE 1024 /* 1K x 32 bit */
+-#define DNET_FIFO_TX_DATA_AF_TH (DNET_FIFO_SIZE - 384) /* 384 = 1536 / 4 */
+-#define DNET_FIFO_TX_DATA_AE_TH 384
+-
+-#define DNET_FIFO_RX_CMD_AF_TH (1 << 16) /* just one frame inside the FIFO */
+-
+-/*
+- * Hardware-collected statistics.
+- */
+-struct dnet_stats {
+- u32 rx_pkt_ignr;
+- u32 rx_len_chk_err;
+- u32 rx_lng_frm;
+- u32 rx_shrt_frm;
+- u32 rx_ipg_viol;
+- u32 rx_crc_err;
+- u32 rx_ok_pkt;
+- u32 rx_ctl_frm;
+- u32 rx_pause_frm;
+- u32 rx_multicast;
+- u32 rx_broadcast;
+- u32 rx_vlan_tag;
+- u32 rx_pre_shrink;
+- u32 rx_drib_nib;
+- u32 rx_unsup_opcd;
+- u32 rx_byte;
+- u32 tx_unicast;
+- u32 tx_pause_frm;
+- u32 tx_multicast;
+- u32 tx_brdcast;
+- u32 tx_vlan_tag;
+- u32 tx_bad_fcs;
+- u32 tx_jumbo;
+- u32 tx_byte;
+-};
+-
+-struct dnet {
+- void __iomem *regs;
+- spinlock_t lock;
+- struct platform_device *pdev;
+- struct net_device *dev;
+- struct dnet_stats hw_stats;
+- unsigned int capabilities; /* read from FPGA */
+- struct napi_struct napi;
+-
+- /* PHY stuff */
+- struct mii_bus *mii_bus;
+- struct phy_device *phy_dev;
+- unsigned int link;
+- unsigned int speed;
+- unsigned int duplex;
+-};
+-
+-#endif /* _DNET_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/e1000/e1000_main.c linux-2.6.29-rc3.owrt/drivers/net/e1000/e1000_main.c
+--- linux-2.6.29.owrt/drivers/net/e1000/e1000_main.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/e1000/e1000_main.c 2009-05-10 23:48:28.000000000 +0200
+@@ -31,7 +31,7 @@
+
+ char e1000_driver_name[] = "e1000";
+ static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
+-#define DRV_VERSION "7.3.21-k3-NAPI"
++#define DRV_VERSION "7.3.20-k3-NAPI"
+ const char e1000_driver_version[] = DRV_VERSION;
+ static const char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation.";
+
+@@ -940,7 +940,7 @@
+ err = pci_enable_device(pdev);
+ } else {
+ bars = pci_select_bars(pdev, IORESOURCE_MEM);
+- err = pci_enable_device_mem(pdev);
++ err = pci_enable_device(pdev);
+ }
+ if (err)
+ return err;
+@@ -3712,7 +3712,7 @@
+ struct e1000_hw *hw = &adapter->hw;
+ u32 rctl, icr = er32(ICR);
+
+- if (unlikely((!icr) || test_bit(__E1000_RESETTING, &adapter->flags)))
++ if (unlikely(!icr))
+ return IRQ_NONE; /* Not our interrupt */
+
+ /* IMS will not auto-mask if INT_ASSERTED is not set, and if it is
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/forcedeth.c linux-2.6.29-rc3.owrt/drivers/net/forcedeth.c
+--- linux-2.6.29.owrt/drivers/net/forcedeth.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/forcedeth.c 2009-05-10 23:48:28.000000000 +0200
+@@ -6011,20 +6011,9 @@
+ if (netif_running(dev))
+ nv_close(dev);
+
+- /*
+- * Restore the MAC so a kernel started by kexec won't get confused.
+- * If we really go for poweroff, we must not restore the MAC,
+- * otherwise the MAC for WOL will be reversed at least on some boards.
+- */
+- if (system_state != SYSTEM_POWER_OFF) {
+- nv_restore_mac_addr(pdev);
+- }
++ nv_restore_mac_addr(pdev);
+
+ pci_disable_device(pdev);
+- /*
+- * Apparently it is not possible to reinitialise from D3 hot,
+- * only put the device into D3 if we really go for poweroff.
+- */
+ if (system_state == SYSTEM_POWER_OFF) {
+ if (pci_enable_wake(pdev, PCI_D3cold, np->wolenabled))
+ pci_enable_wake(pdev, PCI_D3hot, np->wolenabled);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/gianfar.c linux-2.6.29-rc3.owrt/drivers/net/gianfar.c
+--- linux-2.6.29.owrt/drivers/net/gianfar.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/gianfar.c 2009-05-10 23:48:28.000000000 +0200
+@@ -351,9 +351,6 @@
+ /* Reset MAC layer */
+ gfar_write(&priv->regs->maccfg1, MACCFG1_SOFT_RESET);
+
+- /* We need to delay at least 3 TX clocks */
+- udelay(2);
+-
+ tempval = (MACCFG1_TX_FLOW | MACCFG1_RX_FLOW);
+ gfar_write(&priv->regs->maccfg1, tempval);
+
+@@ -1284,7 +1281,7 @@
+ spin_lock_irqsave(&priv->txlock, flags);
+
+ /* check if there is space to queue this packet */
+- if ((nr_frags+1) > priv->num_txbdfree) {
++ if (nr_frags > priv->num_txbdfree) {
+ /* no space, stop the queue */
+ netif_stop_queue(dev);
+ dev->stats.tx_fifo_errors++;
+@@ -1629,12 +1626,6 @@
+ if (netif_rx_schedule_prep(&priv->napi)) {
+ gfar_write(&priv->regs->imask, IMASK_RTX_DISABLED);
+ __netif_rx_schedule(&priv->napi);
+- } else {
+- /*
+- * Clear IEVENT, so interrupts aren't called again
+- * because of the packets that have already arrived.
+- */
+- gfar_write(&priv->regs->ievent, IEVENT_RTX_MASK);
+ }
+
+ spin_unlock(&priv->rxlock);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/gianfar.h linux-2.6.29-rc3.owrt/drivers/net/gianfar.h
+--- linux-2.6.29.owrt/drivers/net/gianfar.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/gianfar.h 2009-05-10 23:48:28.000000000 +0200
+@@ -312,7 +312,7 @@
+ #define ATTRELI_EI(x) (x)
+
+ #define BD_LFLAG(flags) ((flags) << 16)
+-#define BD_LENGTH_MASK 0x0000ffff
++#define BD_LENGTH_MASK 0x00ff
+
+ /* TxBD status field bits */
+ #define TXBD_READY 0x8000
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/gianfar_mii.c linux-2.6.29-rc3.owrt/drivers/net/gianfar_mii.c
+--- linux-2.6.29.owrt/drivers/net/gianfar_mii.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/gianfar_mii.c 2009-05-10 23:48:28.000000000 +0200
+@@ -234,8 +234,6 @@
+ if (NULL == new_bus)
+ return -ENOMEM;
+
+- device_init_wakeup(&ofdev->dev, 1);
+-
+ new_bus->name = "Gianfar MII Bus",
+ new_bus->read = &gfar_mdio_read,
+ new_bus->write = &gfar_mdio_write,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/hp-plus.c linux-2.6.29-rc3.owrt/drivers/net/hp-plus.c
+--- linux-2.6.29.owrt/drivers/net/hp-plus.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/hp-plus.c 2009-05-10 23:48:28.000000000 +0200
+@@ -467,7 +467,7 @@
+ if (this_dev != 0) break; /* only autoprobe 1st one */
+ printk(KERN_NOTICE "hp-plus.c: Presently autoprobing (not recommended) for a single card.\n");
+ }
+- dev = alloc_eip_netdev();
++ dev = alloc_ei_netdev();
+ if (!dev)
+ break;
+ dev->irq = irq[this_dev];
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/ibm_newemac/core.c linux-2.6.29-rc3.owrt/drivers/net/ibm_newemac/core.c
+--- linux-2.6.29.owrt/drivers/net/ibm_newemac/core.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/ibm_newemac/core.c 2009-05-10 23:48:28.000000000 +0200
+@@ -2594,9 +2594,6 @@
+ if (of_device_is_compatible(np, "ibm,emac-460ex") ||
+ of_device_is_compatible(np, "ibm,emac-460gt"))
+ dev->features |= EMAC_FTR_460EX_PHY_CLK_FIX;
+- if (of_device_is_compatible(np, "ibm,emac-405ex") ||
+- of_device_is_compatible(np, "ibm,emac-405exr"))
+- dev->features |= EMAC_FTR_440EP_PHY_CLK_FIX;
+ } else if (of_device_is_compatible(np, "ibm,emac4")) {
+ dev->features |= EMAC_FTR_EMAC4;
+ if (of_device_is_compatible(np, "ibm,emac-440gx"))
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/ibm_newemac/phy.c linux-2.6.29-rc3.owrt/drivers/net/ibm_newemac/phy.c
+--- linux-2.6.29.owrt/drivers/net/ibm_newemac/phy.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/ibm_newemac/phy.c 2009-05-10 23:48:28.000000000 +0200
+@@ -60,7 +60,7 @@
+
+ udelay(300);
+
+- while (--limit) {
++ while (limit--) {
+ val = phy_read(phy, MII_BMCR);
+ if (val >= 0 && (val & BMCR_RESET) == 0)
+ break;
+@@ -84,7 +84,7 @@
+
+ udelay(300);
+
+- while (--limit) {
++ while (limit--) {
+ val = gpcs_phy_read(phy, MII_BMCR);
+ if (val >= 0 && (val & BMCR_RESET) == 0)
+ break;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/igb/e1000_82575.c linux-2.6.29-rc3.owrt/drivers/net/igb/e1000_82575.c
+--- linux-2.6.29.owrt/drivers/net/igb/e1000_82575.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/igb/e1000_82575.c 2009-05-10 23:48:28.000000000 +0200
+@@ -699,18 +699,11 @@
+
+ /* SGMII link check is done through the PCS register. */
+ if ((hw->phy.media_type != e1000_media_type_copper) ||
+- (igb_sgmii_active_82575(hw))) {
++ (igb_sgmii_active_82575(hw)))
+ ret_val = igb_get_pcs_speed_and_duplex_82575(hw, &speed,
+ &duplex);
+- /*
+- * Use this flag to determine if link needs to be checked or
+- * not. If we have link clear the flag so that we do not
+- * continue to check for link.
+- */
+- hw->mac.get_link_status = !hw->mac.serdes_has_link;
+- } else {
++ else
+ ret_val = igb_check_for_copper_link(hw);
+- }
+
+ return ret_val;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/igb/igb.h linux-2.6.29-rc3.owrt/drivers/net/igb/igb.h
+--- linux-2.6.29.owrt/drivers/net/igb/igb.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/igb/igb.h 2009-05-10 23:48:28.000000000 +0200
+@@ -300,10 +300,11 @@
+
+ #define IGB_FLAG_HAS_MSI (1 << 0)
+ #define IGB_FLAG_MSI_ENABLE (1 << 1)
+-#define IGB_FLAG_DCA_ENABLED (1 << 2)
+-#define IGB_FLAG_IN_NETPOLL (1 << 3)
+-#define IGB_FLAG_QUAD_PORT_A (1 << 4)
+-#define IGB_FLAG_NEED_CTX_IDX (1 << 5)
++#define IGB_FLAG_HAS_DCA (1 << 2)
++#define IGB_FLAG_DCA_ENABLED (1 << 3)
++#define IGB_FLAG_IN_NETPOLL (1 << 5)
++#define IGB_FLAG_QUAD_PORT_A (1 << 6)
++#define IGB_FLAG_NEED_CTX_IDX (1 << 7)
+
+ enum e1000_state_t {
+ __IGB_TESTING,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/igb/igb_main.c linux-2.6.29-rc3.owrt/drivers/net/igb/igb_main.c
+--- linux-2.6.29.owrt/drivers/net/igb/igb_main.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/igb/igb_main.c 2009-05-10 23:48:28.000000000 +0200
+@@ -206,11 +206,10 @@
+
+ global_quad_port_a = 0;
+
++ ret = pci_register_driver(&igb_driver);
+ #ifdef CONFIG_IGB_DCA
+ dca_register_notify(&dca_notifier);
+ #endif
+-
+- ret = pci_register_driver(&igb_driver);
+ return ret;
+ }
+
+@@ -1023,10 +1022,11 @@
+ struct net_device *netdev;
+ struct igb_adapter *adapter;
+ struct e1000_hw *hw;
++ struct pci_dev *us_dev;
+ const struct e1000_info *ei = igb_info_tbl[ent->driver_data];
+ unsigned long mmio_start, mmio_len;
+- int i, err, pci_using_dac;
+- u16 eeprom_data = 0;
++ int i, err, pci_using_dac, pos;
++ u16 eeprom_data = 0, state = 0;
+ u16 eeprom_apme_mask = IGB_EEPROM_APME;
+ u32 part_num;
+ int bars, need_ioport;
+@@ -1061,6 +1061,27 @@
+ }
+ }
+
++ /* 82575 requires that the pci-e link partner disable the L0s state */
++ switch (pdev->device) {
++ case E1000_DEV_ID_82575EB_COPPER:
++ case E1000_DEV_ID_82575EB_FIBER_SERDES:
++ case E1000_DEV_ID_82575GB_QUAD_COPPER:
++ us_dev = pdev->bus->self;
++ pos = pci_find_capability(us_dev, PCI_CAP_ID_EXP);
++ if (pos) {
++ pci_read_config_word(us_dev, pos + PCI_EXP_LNKCTL,
++ &state);
++ state &= ~PCIE_LINK_STATE_L0S;
++ pci_write_config_word(us_dev, pos + PCI_EXP_LNKCTL,
++ state);
++ dev_info(&pdev->dev,
++ "Disabling ASPM L0s upstream switch port %s\n",
++ pci_name(us_dev));
++ }
++ default:
++ break;
++ }
++
+ err = pci_request_selected_regions(pdev, bars, igb_driver_name);
+ if (err)
+ goto err_pci_reg;
+@@ -1135,10 +1156,11 @@
+
+ /* set flags */
+ switch (hw->mac.type) {
++ case e1000_82576:
+ case e1000_82575:
++ adapter->flags |= IGB_FLAG_HAS_DCA;
+ adapter->flags |= IGB_FLAG_NEED_CTX_IDX;
+ break;
+- case e1000_82576:
+ default:
+ break;
+ }
+@@ -1288,7 +1310,8 @@
+ goto err_register;
+
+ #ifdef CONFIG_IGB_DCA
+- if (dca_add_requester(&pdev->dev) == 0) {
++ if ((adapter->flags & IGB_FLAG_HAS_DCA) &&
++ (dca_add_requester(&pdev->dev) == 0)) {
+ adapter->flags |= IGB_FLAG_DCA_ENABLED;
+ dev_info(&pdev->dev, "DCA enabled\n");
+ /* Always use CB2 mode, difference is masked
+@@ -1812,11 +1835,11 @@
+ rctl |= E1000_RCTL_SECRC;
+
+ /*
+- * disable store bad packets and clear size bits.
++ * disable store bad packets, long packet enable, and clear size bits.
+ */
+- rctl &= ~(E1000_RCTL_SBP | E1000_RCTL_SZ_256);
++ rctl &= ~(E1000_RCTL_SBP | E1000_RCTL_LPE | E1000_RCTL_SZ_256);
+
+- /* enable LPE when to prevent packets larger than max_frame_size */
++ if (adapter->netdev->mtu > ETH_DATA_LEN)
+ rctl |= E1000_RCTL_LPE;
+
+ /* Setup buffer sizes */
+@@ -1842,7 +1865,7 @@
+ */
+ /* allocations using alloc_page take too long for regular MTU
+ * so only enable packet split for jumbo frames */
+- if (adapter->netdev->mtu > ETH_DATA_LEN) {
++ if (rctl & E1000_RCTL_LPE) {
+ adapter->rx_ps_hdr_size = IGB_RXBUFFER_128;
+ srrctl |= adapter->rx_ps_hdr_size <<
+ E1000_SRRCTL_BSIZEHDRSIZE_SHIFT;
+@@ -3450,16 +3473,19 @@
+ struct e1000_hw *hw = &adapter->hw;
+ unsigned long event = *(unsigned long *)data;
+
++ if (!(adapter->flags & IGB_FLAG_HAS_DCA))
++ goto out;
++
+ switch (event) {
+ case DCA_PROVIDER_ADD:
+ /* if already enabled, don't do it again */
+ if (adapter->flags & IGB_FLAG_DCA_ENABLED)
+ break;
++ adapter->flags |= IGB_FLAG_DCA_ENABLED;
+ /* Always use CB2 mode, difference is masked
+ * in the CB driver. */
+ wr32(E1000_DCA_CTRL, 2);
+ if (dca_add_requester(dev) == 0) {
+- adapter->flags |= IGB_FLAG_DCA_ENABLED;
+ dev_info(&adapter->pdev->dev, "DCA enabled\n");
+ igb_setup_dca(adapter);
+ break;
+@@ -3476,7 +3502,7 @@
+ }
+ break;
+ }
+-
++out:
+ return 0;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/irda/mcs7780.c linux-2.6.29-rc3.owrt/drivers/net/irda/mcs7780.c
+--- linux-2.6.29.owrt/drivers/net/irda/mcs7780.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/irda/mcs7780.c 2009-05-10 23:48:28.000000000 +0200
+@@ -585,7 +585,7 @@
+ mcs_get_reg(mcs, MCS_RESV_REG, &rval);
+ } while(cnt++ < 100 && (rval & MCS_IRINTX));
+
+- if (cnt > 100) {
++ if(cnt >= 100) {
+ IRDA_ERROR("unable to change speed\n");
+ ret = -EIO;
+ goto error;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/ixgbe/ixgbe_main.c linux-2.6.29-rc3.owrt/drivers/net/ixgbe/ixgbe_main.c
+--- linux-2.6.29.owrt/drivers/net/ixgbe/ixgbe_main.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/ixgbe/ixgbe_main.c 2009-05-10 23:48:28.000000000 +0200
+@@ -3973,7 +3973,6 @@
+ .ndo_stop = ixgbe_close,
+ .ndo_start_xmit = ixgbe_xmit_frame,
+ .ndo_get_stats = ixgbe_get_stats,
+- .ndo_set_rx_mode = ixgbe_set_rx_mode,
+ .ndo_set_multicast_list = ixgbe_set_rx_mode,
+ .ndo_validate_addr = eth_validate_addr,
+ .ndo_set_mac_address = ixgbe_set_mac,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/jme.c linux-2.6.29-rc3.owrt/drivers/net/jme.c
+--- linux-2.6.29.owrt/drivers/net/jme.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/jme.c 2009-05-10 23:48:28.000000000 +0200
+@@ -957,14 +957,13 @@
+ goto out_inc;
+
+ i = atomic_read(&rxring->next_to_clean);
+- while (limit > 0) {
++ while (limit-- > 0) {
+ rxdesc = rxring->desc;
+ rxdesc += i;
+
+ if ((rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_OWN)) ||
+ !(rxdesc->descwb.desccnt & RXWBDCNT_WBCPL))
+ goto out;
+- --limit;
+
+ desccnt = rxdesc->descwb.desccnt & RXWBDCNT_DCNT;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/Kconfig linux-2.6.29-rc3.owrt/drivers/net/Kconfig
+--- linux-2.6.29.owrt/drivers/net/Kconfig 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/Kconfig 2009-05-10 23:48:28.000000000 +0200
+@@ -1163,17 +1163,6 @@
+ To compile this driver as a module, choose M here. The module
+ will be called ni65.
+
+-config DNET
+- tristate "Dave ethernet support (DNET)"
+- depends on NET_ETHERNET && HAS_IOMEM
+- select PHYLIB
+- help
+- The Dave ethernet interface (DNET) is found on Qong Board FPGA.
+- Say Y to include support for the DNET chip.
+-
+- To compile this driver as a module, choose M here: the module
+- will be called dnet.
+-
+ source "drivers/net/tulip/Kconfig"
+
+ config AT1700
+@@ -2476,17 +2465,6 @@
+ To compile this driver as a module, choose M here. The module
+ will be called atl1e.
+
+-config ATL1C
+- tristate "Atheros L1C Gigabit Ethernet support (EXPERIMENTAL)"
+- depends on PCI && EXPERIMENTAL
+- select CRC32
+- select MII
+- help
+- This driver supports the Atheros L1C gigabit ethernet adapter.
+-
+- To compile this driver as a module, choose M here. The module
+- will be called atl1c.
+-
+ config JME
+ tristate "JMicron(R) PCI-Express Gigabit Ethernet support"
+ depends on PCI
+@@ -2753,8 +2731,6 @@
+
+ source "drivers/net/sfc/Kconfig"
+
+-source "drivers/net/benet/Kconfig"
+-
+ endif # NETDEV_10000
+
+ source "drivers/net/tokenring/Kconfig"
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/Makefile linux-2.6.29-rc3.owrt/drivers/net/Makefile
+--- linux-2.6.29.owrt/drivers/net/Makefile 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/Makefile 2009-05-10 23:48:28.000000000 +0200
+@@ -17,12 +17,10 @@
+ obj-$(CONFIG_ATL1) += atlx/
+ obj-$(CONFIG_ATL2) += atlx/
+ obj-$(CONFIG_ATL1E) += atl1e/
+-obj-$(CONFIG_ATL1C) += atl1c/
+ obj-$(CONFIG_GIANFAR) += gianfar_driver.o
+ obj-$(CONFIG_TEHUTI) += tehuti.o
+ obj-$(CONFIG_ENIC) += enic/
+ obj-$(CONFIG_JME) += jme.o
+-obj-$(CONFIG_BE2NET) += benet/
+
+ gianfar_driver-objs := gianfar.o \
+ gianfar_ethtool.o \
+@@ -233,7 +231,6 @@
+
+ obj-$(CONFIG_XTENSA_XT2000_SONIC) += xtsonic.o
+
+-obj-$(CONFIG_DNET) += dnet.o
+ obj-$(CONFIG_MACB) += macb.o
+
+ obj-$(CONFIG_ARM) += arm/
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/mv643xx_eth.c linux-2.6.29-rc3.owrt/drivers/net/mv643xx_eth.c
+--- linux-2.6.29.owrt/drivers/net/mv643xx_eth.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/mv643xx_eth.c 2009-05-10 23:48:28.000000000 +0200
+@@ -1175,7 +1175,7 @@
+ {
+ struct mib_counters *p = &mp->mib_counters;
+
+- spin_lock_bh(&mp->mib_counters_lock);
++ spin_lock(&mp->mib_counters_lock);
+ p->good_octets_received += mib_read(mp, 0x00);
+ p->good_octets_received += (u64)mib_read(mp, 0x04) << 32;
+ p->bad_octets_received += mib_read(mp, 0x08);
+@@ -1208,7 +1208,7 @@
+ p->bad_crc_event += mib_read(mp, 0x74);
+ p->collision += mib_read(mp, 0x78);
+ p->late_collision += mib_read(mp, 0x7c);
+- spin_unlock_bh(&mp->mib_counters_lock);
++ spin_unlock(&mp->mib_counters_lock);
+
+ mod_timer(&mp->mib_counters_timer, jiffies + 30 * HZ);
+ }
+@@ -1575,7 +1575,7 @@
+ return;
+ }
+
+- mc_spec = kmalloc(0x200, GFP_ATOMIC);
++ mc_spec = kmalloc(0x200, GFP_KERNEL);
+ if (mc_spec == NULL)
+ goto oom;
+ mc_other = mc_spec + (0x100 >> 2);
+@@ -2030,6 +2030,11 @@
+ }
+
+ /*
++ * Add configured unicast address to address filter table.
++ */
++ mv643xx_eth_program_unicast_filter(mp->dev);
++
++ /*
+ * Receive all unmatched unicast, TCP, UDP, BPDU and broadcast
+ * frames to RX queue #0, and include the pseudo-header when
+ * calculating receive checksums.
+@@ -2042,11 +2047,6 @@
+ wrlp(mp, PORT_CONFIG_EXT, 0x00000000);
+
+ /*
+- * Add configured unicast addresses to address filter table.
+- */
+- mv643xx_eth_program_unicast_filter(mp->dev);
+-
+- /*
+ * Enable the receive queues.
+ */
+ for (i = 0; i < mp->rxq_count; i++) {
+@@ -2216,6 +2216,8 @@
+ wrlp(mp, INT_MASK, 0x00000000);
+ rdlp(mp, INT_MASK);
+
++ del_timer_sync(&mp->mib_counters_timer);
++
+ napi_disable(&mp->napi);
+
+ del_timer_sync(&mp->rx_oom);
+@@ -2227,7 +2229,6 @@
+ port_reset(mp);
+ mv643xx_eth_get_stats(dev);
+ mib_counters_update(mp);
+- del_timer_sync(&mp->mib_counters_timer);
+
+ skb_queue_purge(&mp->rx_recycle);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/netxen/netxen_nic.h linux-2.6.29-rc3.owrt/drivers/net/netxen/netxen_nic.h
+--- linux-2.6.29.owrt/drivers/net/netxen/netxen_nic.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/netxen/netxen_nic.h 2009-05-10 23:48:29.000000000 +0200
+@@ -210,7 +210,7 @@
+ #define MAX_CMD_DESCRIPTORS_HOST 1024
+ #define MAX_RCV_DESCRIPTORS_1G 2048
+ #define MAX_RCV_DESCRIPTORS_10G 4096
+-#define MAX_JUMBO_RCV_DESCRIPTORS 1024
++#define MAX_JUMBO_RCV_DESCRIPTORS 512
+ #define MAX_LRO_RCV_DESCRIPTORS 8
+ #define MAX_RCVSTATUS_DESCRIPTORS MAX_RCV_DESCRIPTORS
+ #define MAX_JUMBO_RCV_DESC MAX_JUMBO_RCV_DESCRIPTORS
+@@ -1203,7 +1203,7 @@
+ #define NETXEN_IS_MSI_FAMILY(adapter) \
+ ((adapter)->flags & (NETXEN_NIC_MSI_ENABLED | NETXEN_NIC_MSIX_ENABLED))
+
+-#define MSIX_ENTRIES_PER_ADAPTER 1
++#define MSIX_ENTRIES_PER_ADAPTER 8
+ #define NETXEN_MSIX_TBL_SPACE 8192
+ #define NETXEN_PCI_REG_MSIX_TBL 0x44
+
+@@ -1595,6 +1595,7 @@
+ }
+
+
++int netxen_is_flash_supported(struct netxen_adapter *adapter);
+ int netxen_get_flash_mac_addr(struct netxen_adapter *adapter, __le64 *mac);
+ int netxen_p3_get_mac_addr(struct netxen_adapter *adapter, __le64 *mac);
+ extern void netxen_change_ringparam(struct netxen_adapter *adapter);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/netxen/netxen_nic_hw.c linux-2.6.29-rc3.owrt/drivers/net/netxen/netxen_nic_hw.c
+--- linux-2.6.29.owrt/drivers/net/netxen/netxen_nic_hw.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/netxen/netxen_nic_hw.c 2009-05-10 23:48:29.000000000 +0200
+@@ -706,6 +706,28 @@
+ return rc;
+ }
+
++int netxen_is_flash_supported(struct netxen_adapter *adapter)
++{
++ const int locs[] = { 0, 0x4, 0x100, 0x4000, 0x4128 };
++ int addr, val01, val02, i, j;
++
++ /* if the flash size less than 4Mb, make huge war cry and die */
++ for (j = 1; j < 4; j++) {
++ addr = j * NETXEN_NIC_WINDOW_MARGIN;
++ for (i = 0; i < ARRAY_SIZE(locs); i++) {
++ if (netxen_rom_fast_read(adapter, locs[i], &val01) == 0
++ && netxen_rom_fast_read(adapter, (addr + locs[i]),
++ &val02) == 0) {
++ if (val01 == val02)
++ return -1;
++ } else
++ return -1;
++ }
++ }
++
++ return 0;
++}
++
+ static int netxen_get_flash_block(struct netxen_adapter *adapter, int base,
+ int size, __le32 * buf)
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/netxen/netxen_nic_init.c linux-2.6.29-rc3.owrt/drivers/net/netxen/netxen_nic_init.c
+--- linux-2.6.29.owrt/drivers/net/netxen/netxen_nic_init.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/netxen/netxen_nic_init.c 2009-05-10 23:48:29.000000000 +0200
+@@ -947,10 +947,8 @@
+ }
+ for (i = 0; i < n; i++) {
+ if (netxen_rom_fast_read(adapter, 8*i + 4*offset, &val) != 0 ||
+- netxen_rom_fast_read(adapter, 8*i + 4*offset + 4, &addr) != 0) {
+- kfree(buf);
++ netxen_rom_fast_read(adapter, 8*i + 4*offset + 4, &addr) != 0)
+ return -EIO;
+- }
+
+ buf[i].addr = addr;
+ buf[i].data = val;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/netxen/netxen_nic_main.c linux-2.6.29-rc3.owrt/drivers/net/netxen/netxen_nic_main.c
+--- linux-2.6.29.owrt/drivers/net/netxen/netxen_nic_main.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/netxen/netxen_nic_main.c 2009-05-10 23:48:29.000000000 +0200
+@@ -76,7 +76,6 @@
+ #endif
+ static irqreturn_t netxen_intr(int irq, void *data);
+ static irqreturn_t netxen_msi_intr(int irq, void *data);
+-static irqreturn_t netxen_msix_intr(int irq, void *data);
+
+ /* PCI Device ID Table */
+ #define ENTRY(device) \
+@@ -201,9 +200,9 @@
+ adapter->pci_using_dac = 1;
+ return 0;
+ }
+-set_32_bit_mask:
+ #endif /* CONFIG_IA64 */
+
++set_32_bit_mask:
+ err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+ if (!err)
+ err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+@@ -372,6 +371,67 @@
+ }
+ }
+
++#define PCI_CAP_ID_GEN 0x10
++
++static void netxen_pcie_strap_init(struct netxen_adapter *adapter)
++{
++ u32 pdevfuncsave;
++ u32 c8c9value = 0;
++ u32 chicken = 0;
++ u32 control = 0;
++ int i, pos;
++ struct pci_dev *pdev;
++
++ pdev = adapter->pdev;
++
++ adapter->hw_read_wx(adapter,
++ NETXEN_PCIE_REG(PCIE_CHICKEN3), &chicken, 4);
++ /* clear chicken3.25:24 */
++ chicken &= 0xFCFFFFFF;
++ /*
++ * if gen1 and B0, set F1020 - if gen 2, do nothing
++ * if gen2 set to F1000
++ */
++ pos = pci_find_capability(pdev, PCI_CAP_ID_GEN);
++ if (pos == 0xC0) {
++ pci_read_config_dword(pdev, pos + 0x10, &control);
++ if ((control & 0x000F0000) != 0x00020000) {
++ /* set chicken3.24 if gen1 */
++ chicken |= 0x01000000;
++ }
++ printk(KERN_INFO "%s Gen2 strapping detected\n",
++ netxen_nic_driver_name);
++ c8c9value = 0xF1000;
++ } else {
++ /* set chicken3.24 if gen1 */
++ chicken |= 0x01000000;
++ printk(KERN_INFO "%s Gen1 strapping detected\n",
++ netxen_nic_driver_name);
++ if (adapter->ahw.revision_id == NX_P3_B0)
++ c8c9value = 0xF1020;
++ else
++ c8c9value = 0;
++
++ }
++ adapter->hw_write_wx(adapter,
++ NETXEN_PCIE_REG(PCIE_CHICKEN3), &chicken, 4);
++
++ if (!c8c9value)
++ return;
++
++ pdevfuncsave = pdev->devfn;
++ if (pdevfuncsave & 0x07)
++ return;
++
++ for (i = 0; i < 8; i++) {
++ pci_read_config_dword(pdev, pos + 8, &control);
++ pci_read_config_dword(pdev, pos + 8, &control);
++ pci_write_config_dword(pdev, pos + 8, c8c9value);
++ pdev->devfn++;
++ }
++ pdev->devfn = pdevfuncsave;
++}
++
+ static void netxen_set_msix_bit(struct pci_dev *pdev, int enable)
+ {
+ u32 control;
+@@ -405,6 +465,9 @@
+ struct net_device *netdev = adapter->netdev;
+ struct pci_dev *pdev = adapter->pdev;
+
++ if (netxen_is_flash_supported(adapter) != 0)
++ return -EIO;
++
+ if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
+ if (netxen_p3_get_mac_addr(adapter, &mac_addr) != 0)
+ return -EIO;
+@@ -585,12 +648,7 @@
+ adapter->pci_mem_read = netxen_nic_pci_mem_read_2M;
+ adapter->pci_mem_write = netxen_nic_pci_mem_write_2M;
+
+- mem_ptr0 = pci_ioremap_bar(pdev, 0);
+- if (mem_ptr0 == NULL) {
+- dev_err(&pdev->dev, "failed to map PCI bar 0\n");
+- return -EIO;
+- }
+-
++ mem_ptr0 = ioremap(mem_base, mem_len);
+ pci_len0 = mem_len;
+ first_page_group_start = 0;
+ first_page_group_end = 0;
+@@ -753,6 +811,9 @@
+ }
+ netxen_load_firmware(adapter);
+
++ if (NX_IS_REVISION_P3(revision_id))
++ netxen_pcie_strap_init(adapter);
++
+ if (NX_IS_REVISION_P2(revision_id)) {
+
+ /* Initialize multicast addr pool owners */
+@@ -797,12 +858,9 @@
+ * See if the firmware gave us a virtual-physical port mapping.
+ */
+ adapter->physical_port = adapter->portnum;
+- if (adapter->fw_major < 4) {
+- i = adapter->pci_read_normalize(adapter,
+- CRB_V2P(adapter->portnum));
+- if (i != 0x55555555)
+- adapter->physical_port = i;
+- }
++ i = adapter->pci_read_normalize(adapter, CRB_V2P(adapter->portnum));
++ if (i != 0x55555555)
++ adapter->physical_port = i;
+
+ adapter->flags &= ~(NETXEN_NIC_MSI_ENABLED | NETXEN_NIC_MSIX_ENABLED);
+
+@@ -1026,9 +1084,7 @@
+ for (ring = 0; ring < adapter->max_rds_rings; ring++)
+ netxen_post_rx_buffers(adapter, ctx, ring);
+ }
+- if (adapter->flags & NETXEN_NIC_MSIX_ENABLED)
+- handler = netxen_msix_intr;
+- else if (adapter->flags & NETXEN_NIC_MSI_ENABLED)
++ if (NETXEN_IS_MSI_FAMILY(adapter))
+ handler = netxen_msi_intr;
+ else {
+ flags |= IRQF_SHARED;
+@@ -1556,14 +1612,6 @@
+ return IRQ_HANDLED;
+ }
+
+-static irqreturn_t netxen_msix_intr(int irq, void *data)
+-{
+- struct netxen_adapter *adapter = data;
+-
+- napi_schedule(&adapter->napi);
+- return IRQ_HANDLED;
+-}
+-
+ static int netxen_nic_poll(struct napi_struct *napi, int budget)
+ {
+ struct netxen_adapter *adapter = container_of(napi, struct netxen_adapter, napi);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/pcmcia/3c574_cs.c linux-2.6.29-rc3.owrt/drivers/net/pcmcia/3c574_cs.c
+--- linux-2.6.29.owrt/drivers/net/pcmcia/3c574_cs.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/pcmcia/3c574_cs.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1035,8 +1035,7 @@
+ DEBUG(3, "%s: in rx_packet(), status %4.4x, rx_status %4.4x.\n",
+ dev->name, inw(ioaddr+EL3_STATUS), inw(ioaddr+RxStatus));
+ while (!((rx_status = inw(ioaddr + RxStatus)) & 0x8000) &&
+- worklimit > 0) {
+- worklimit--;
++ (--worklimit >= 0)) {
+ if (rx_status & 0x4000) { /* Error, update stats. */
+ short error = rx_status & 0x3800;
+ dev->stats.rx_errors++;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/pcmcia/3c589_cs.c linux-2.6.29-rc3.owrt/drivers/net/pcmcia/3c589_cs.c
+--- linux-2.6.29.owrt/drivers/net/pcmcia/3c589_cs.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/pcmcia/3c589_cs.c 2009-05-10 23:48:29.000000000 +0200
+@@ -857,8 +857,7 @@
+ DEBUG(3, "%s: in rx_packet(), status %4.4x, rx_status %4.4x.\n",
+ dev->name, inw(ioaddr+EL3_STATUS), inw(ioaddr+RX_STATUS));
+ while (!((rx_status = inw(ioaddr + RX_STATUS)) & 0x8000) &&
+- worklimit > 0) {
+- worklimit--;
++ (--worklimit >= 0)) {
+ if (rx_status & 0x4000) { /* Error, update stats. */
+ short error = rx_status & 0x3800;
+ dev->stats.rx_errors++;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/pcmcia/pcnet_cs.c linux-2.6.29-rc3.owrt/drivers/net/pcmcia/pcnet_cs.c
+--- linux-2.6.29.owrt/drivers/net/pcmcia/pcnet_cs.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/pcmcia/pcnet_cs.c 2009-05-10 23:48:29.000000000 +0200
+@@ -586,7 +586,7 @@
+ }
+
+ if ((link->conf.ConfigBase == 0x03c0)
+- && (link->manf_id == 0x149) && (link->card_id == 0xc1ab)) {
++ && (link->manf_id == 0x149) && (link->card_id = 0xc1ab)) {
+ printk(KERN_INFO "pcnet_cs: this is an AX88190 card!\n");
+ printk(KERN_INFO "pcnet_cs: use axnet_cs instead.\n");
+ goto failed;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/phy/mdio-gpio.c linux-2.6.29-rc3.owrt/drivers/net/phy/mdio-gpio.c
+--- linux-2.6.29.owrt/drivers/net/phy/mdio-gpio.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/phy/mdio-gpio.c 2009-05-10 23:48:29.000000000 +0200
+@@ -125,8 +125,6 @@
+ if (gpio_request(bitbang->mdio, "mdio"))
+ goto out_free_mdc;
+
+- gpio_direction_output(bitbang->mdc, 0);
+-
+ dev_set_drvdata(dev, new_bus);
+
+ ret = mdiobus_register(new_bus);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/ps3_gelic_wireless.c linux-2.6.29-rc3.owrt/drivers/net/ps3_gelic_wireless.c
+--- linux-2.6.29.owrt/drivers/net/ps3_gelic_wireless.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/ps3_gelic_wireless.c 2009-05-10 23:48:29.000000000 +0200
+@@ -2168,7 +2168,7 @@
+ complete(&wl->assoc_done);
+ netif_carrier_on(port_to_netdev(wl_port(wl)));
+ } else
+- pr_debug("%s: event %#llx under wpa\n",
++ pr_debug("%s: event %#lx under wpa\n",
+ __func__, event);
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/qlge/qlge.h linux-2.6.29-rc3.owrt/drivers/net/qlge/qlge.h
+--- linux-2.6.29.owrt/drivers/net/qlge/qlge.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/qlge/qlge.h 2009-05-10 23:48:29.000000000 +0200
+@@ -787,12 +787,12 @@
+
+ struct flash_params {
+ u8 dev_id_str[4];
+- __le16 size;
+- __le16 csum;
+- __le16 ver;
+- __le16 sub_dev_id;
++ u16 size;
++ u16 csum;
++ u16 ver;
++ u16 sub_dev_id;
+ u8 mac_addr[6];
+- __le16 res;
++ u16 res;
+ };
+
+
+@@ -927,7 +927,6 @@
+ u8 flags1;
+ #define IB_MAC_IOCB_RSP_OI 0x01 /* Overide intr delay */
+ #define IB_MAC_IOCB_RSP_I 0x02 /* Disble Intr Generation */
+-#define IB_MAC_CSUM_ERR_MASK 0x1c /* A mask to use for csum errs */
+ #define IB_MAC_IOCB_RSP_TE 0x04 /* Checksum error */
+ #define IB_MAC_IOCB_RSP_NU 0x08 /* No checksum rcvd */
+ #define IB_MAC_IOCB_RSP_IE 0x10 /* IPv4 checksum error */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/qlge/qlge_main.c linux-2.6.29-rc3.owrt/drivers/net/qlge/qlge_main.c
+--- linux-2.6.29.owrt/drivers/net/qlge/qlge_main.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/qlge/qlge_main.c 2009-05-10 23:48:29.000000000 +0200
+@@ -641,7 +641,7 @@
+
+ }
+
+-static int ql_read_flash_word(struct ql_adapter *qdev, int offset, __le32 *data)
++static int ql_read_flash_word(struct ql_adapter *qdev, int offset, u32 *data)
+ {
+ int status = 0;
+ /* wait for reg to come ready */
+@@ -656,11 +656,8 @@
+ FLASH_ADDR, FLASH_ADDR_RDY, FLASH_ADDR_ERR);
+ if (status)
+ goto exit;
+- /* This data is stored on flash as an array of
+- * __le32. Since ql_read32() returns cpu endian
+- * we need to swap it back.
+- */
+- *data = cpu_to_le32(ql_read32(qdev, FLASH_DATA));
++ /* get the data */
++ *data = ql_read32(qdev, FLASH_DATA);
+ exit:
+ return status;
+ }
+@@ -669,20 +666,13 @@
+ {
+ int i;
+ int status;
+- __le32 *p = (__le32 *)&qdev->flash;
+- u32 offset = 0;
+-
+- /* Second function's parameters follow the first
+- * function's.
+- */
+- if (qdev->func)
+- offset = sizeof(qdev->flash) / sizeof(u32);
++ u32 *p = (u32 *)&qdev->flash;
+
+ if (ql_sem_spinlock(qdev, SEM_FLASH_MASK))
+ return -ETIMEDOUT;
+
+ for (i = 0; i < sizeof(qdev->flash) / sizeof(u32); i++, p++) {
+- status = ql_read_flash_word(qdev, i+offset, p);
++ status = ql_read_flash_word(qdev, i, p);
+ if (status) {
+ QPRINTK(qdev, IFUP, ERR, "Error reading flash.\n");
+ goto exit;
+@@ -898,7 +888,6 @@
+ lbq_desc->index);
+ lbq_desc->p.lbq_page = alloc_page(GFP_ATOMIC);
+ if (lbq_desc->p.lbq_page == NULL) {
+- rx_ring->lbq_clean_idx = clean_idx;
+ QPRINTK(qdev, RX_STATUS, ERR,
+ "Couldn't get a page.\n");
+ return;
+@@ -908,9 +897,6 @@
+ 0, PAGE_SIZE,
+ PCI_DMA_FROMDEVICE);
+ if (pci_dma_mapping_error(qdev->pdev, map)) {
+- rx_ring->lbq_clean_idx = clean_idx;
+- put_page(lbq_desc->p.lbq_page);
+- lbq_desc->p.lbq_page = NULL;
+ QPRINTK(qdev, RX_STATUS, ERR,
+ "PCI mapping failed.\n");
+ return;
+@@ -972,8 +958,6 @@
+ if (pci_dma_mapping_error(qdev->pdev, map)) {
+ QPRINTK(qdev, IFUP, ERR, "PCI mapping failed.\n");
+ rx_ring->sbq_clean_idx = clean_idx;
+- dev_kfree_skb_any(sbq_desc->p.skb);
+- sbq_desc->p.skb = NULL;
+ return;
+ }
+ pci_unmap_addr_set(sbq_desc, mapaddr, map);
+@@ -1436,32 +1420,18 @@
+ if (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_P) {
+ QPRINTK(qdev, RX_STATUS, DEBUG, "Promiscuous Packet.\n");
+ }
+-
+- skb->protocol = eth_type_trans(skb, ndev);
+- skb->ip_summed = CHECKSUM_NONE;
+-
+- /* If rx checksum is on, and there are no
+- * csum or frame errors.
+- */
+- if (qdev->rx_csum &&
+- !(ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_ERR_MASK) &&
+- !(ib_mac_rsp->flags1 & IB_MAC_CSUM_ERR_MASK)) {
+- /* TCP frame. */
+- if (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_T) {
+- QPRINTK(qdev, RX_STATUS, DEBUG,
+- "TCP checksum done!\n");
+- skb->ip_summed = CHECKSUM_UNNECESSARY;
+- } else if ((ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_U) &&
+- (ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_V4)) {
+- /* Unfragmented ipv4 UDP frame. */
+- struct iphdr *iph = (struct iphdr *) skb->data;
+- if (!(iph->frag_off &
+- cpu_to_be16(IP_MF|IP_OFFSET))) {
+- skb->ip_summed = CHECKSUM_UNNECESSARY;
+- QPRINTK(qdev, RX_STATUS, DEBUG,
+- "TCP checksum done!\n");
+- }
+- }
++ if (ib_mac_rsp->flags1 & (IB_MAC_IOCB_RSP_IE | IB_MAC_IOCB_RSP_TE)) {
++ QPRINTK(qdev, RX_STATUS, ERR,
++ "Bad checksum for this %s packet.\n",
++ ((ib_mac_rsp->
++ flags2 & IB_MAC_IOCB_RSP_T) ? "TCP" : "UDP"));
++ skb->ip_summed = CHECKSUM_NONE;
++ } else if (qdev->rx_csum &&
++ ((ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_T) ||
++ ((ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_U) &&
++ !(ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_NU)))) {
++ QPRINTK(qdev, RX_STATUS, DEBUG, "RX checksum done!\n");
++ skb->ip_summed = CHECKSUM_UNNECESSARY;
+ }
+ qdev->stats.rx_packets++;
+ qdev->stats.rx_bytes += skb->len;
+@@ -1469,12 +1439,12 @@
+ if (qdev->vlgrp && (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_V)) {
+ QPRINTK(qdev, RX_STATUS, DEBUG,
+ "Passing a VLAN packet upstream.\n");
+- vlan_hwaccel_receive_skb(skb, qdev->vlgrp,
++ vlan_hwaccel_rx(skb, qdev->vlgrp,
+ le16_to_cpu(ib_mac_rsp->vlan_id));
+ } else {
+ QPRINTK(qdev, RX_STATUS, DEBUG,
+ "Passing a normal packet upstream.\n");
+- netif_receive_skb(skb);
++ netif_rx(skb);
+ }
+ }
+
+@@ -1531,11 +1501,6 @@
+ netif_stop_queue(qdev->ndev);
+ netif_carrier_off(qdev->ndev);
+ ql_disable_interrupts(qdev);
+- /* Clear adapter up bit to signal the recovery
+- * process that it shouldn't kill the reset worker
+- * thread
+- */
+- clear_bit(QL_ADAPTER_UP, &qdev->flags);
+ queue_delayed_work(qdev->workqueue, &qdev->asic_reset_work, 0);
+ }
+
+@@ -1941,9 +1906,6 @@
+
+ tx_ring = &qdev->tx_ring[tx_ring_idx];
+
+- if (skb_padto(skb, ETH_ZLEN))
+- return NETDEV_TX_OK;
+-
+ if (unlikely(atomic_read(&tx_ring->tx_count) < 2)) {
+ QPRINTK(qdev, TX_QUEUED, INFO,
+ "%s: shutting down tx queue %d du to lack of resources.\n",
+@@ -1955,6 +1917,10 @@
+ tx_ring_desc = &tx_ring->q[tx_ring->prod_idx];
+ mac_iocb_ptr = tx_ring_desc->queue_entry;
+ memset((void *)mac_iocb_ptr, 0, sizeof(mac_iocb_ptr));
++ if (ql_map_send(qdev, mac_iocb_ptr, skb, tx_ring_desc) != NETDEV_TX_OK) {
++ QPRINTK(qdev, TX_QUEUED, ERR, "Could not map the segments.\n");
++ return NETDEV_TX_BUSY;
++ }
+
+ mac_iocb_ptr->opcode = OPCODE_OB_MAC_IOCB;
+ mac_iocb_ptr->tid = tx_ring_desc->index;
+@@ -1980,12 +1946,6 @@
+ ql_hw_csum_setup(skb,
+ (struct ob_mac_tso_iocb_req *)mac_iocb_ptr);
+ }
+- if (ql_map_send(qdev, mac_iocb_ptr, skb, tx_ring_desc) !=
+- NETDEV_TX_OK) {
+- QPRINTK(qdev, TX_QUEUED, ERR,
+- "Could not map the segments.\n");
+- return NETDEV_TX_BUSY;
+- }
+ QL_DUMP_OB_MAC_IOCB(mac_iocb_ptr);
+ tx_ring->prod_idx++;
+ if (tx_ring->prod_idx == tx_ring->wq_len)
+@@ -2903,8 +2863,8 @@
+ /*
+ * Fill out the Indirection Table.
+ */
+- for (i = 0; i < 256; i++)
+- hash_id[i] = i & (qdev->rss_ring_count - 1);
++ for (i = 0; i < 32; i++)
++ hash_id[i] = i & 1;
+
+ /*
+ * Random values for the IPv6 and IPv4 Hash Keys.
+@@ -2987,9 +2947,9 @@
+ mask = value << 16;
+ ql_write32(qdev, SYS, mask | value);
+
+- /* Set the default queue, and VLAN behavior. */
+- value = NIC_RCV_CFG_DFQ | NIC_RCV_CFG_RV;
+- mask = NIC_RCV_CFG_DFQ_MASK | (NIC_RCV_CFG_RV << 16);
++ /* Set the default queue. */
++ value = NIC_RCV_CFG_DFQ;
++ mask = NIC_RCV_CFG_DFQ_MASK;
+ ql_write32(qdev, NIC_RCV_CFG, (mask | value));
+
+ /* Set the MPI interrupt to enabled. */
+@@ -3130,11 +3090,7 @@
+ netif_stop_queue(ndev);
+ netif_carrier_off(ndev);
+
+- /* Don't kill the reset worker thread if we
+- * are in the process of recovery.
+- */
+- if (test_bit(QL_ADAPTER_UP, &qdev->flags))
+- cancel_delayed_work_sync(&qdev->asic_reset_work);
++ cancel_delayed_work_sync(&qdev->asic_reset_work);
+ cancel_delayed_work_sync(&qdev->mpi_reset_work);
+ cancel_delayed_work_sync(&qdev->mpi_work);
+
+@@ -3166,11 +3122,6 @@
+
+ ql_tx_ring_clean(qdev);
+
+- /* Call netif_napi_del() from common point.
+- */
+- for (i = qdev->rss_ring_first_cq_id; i < qdev->rx_ring_count; i++)
+- netif_napi_del(&qdev->rx_ring[i].napi);
+-
+ spin_lock(&qdev->hw_lock);
+ status = ql_adapter_reset(qdev);
+ if (status)
+@@ -3540,7 +3491,7 @@
+ static void qlge_tx_timeout(struct net_device *ndev)
+ {
+ struct ql_adapter *qdev = (struct ql_adapter *)netdev_priv(ndev);
+- ql_queue_asic_error(qdev);
++ queue_delayed_work(qdev->workqueue, &qdev->asic_reset_work, 0);
+ }
+
+ static void ql_asic_reset_work(struct work_struct *work)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/r6040.c linux-2.6.29-rc3.owrt/drivers/net/r6040.c
+--- linux-2.6.29.owrt/drivers/net/r6040.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/r6040.c 2009-05-10 23:48:29.000000000 +0200
+@@ -438,6 +438,7 @@
+ {
+ struct r6040_private *lp = netdev_priv(dev);
+ void __iomem *ioaddr = lp->base;
++ struct pci_dev *pdev = lp->pdev;
+ int limit = 2048;
+ u16 *adrp;
+ u16 cmd;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/r8169.c linux-2.6.29-rc3.owrt/drivers/net/r8169.c
+--- linux-2.6.29.owrt/drivers/net/r8169.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/r8169.c 2009-05-10 23:48:29.000000000 +0200
+@@ -437,22 +437,6 @@
+ RTL_FEATURE_GMII = (1 << 2),
+ };
+
+-struct rtl8169_counters {
+- __le64 tx_packets;
+- __le64 rx_packets;
+- __le64 tx_errors;
+- __le32 rx_errors;
+- __le16 rx_missed;
+- __le16 align_errors;
+- __le32 tx_one_collision;
+- __le32 tx_multi_collision;
+- __le64 rx_unicast;
+- __le64 rx_broadcast;
+- __le32 rx_multicast;
+- __le16 tx_aborted;
+- __le16 tx_underun;
+-};
+-
+ struct rtl8169_private {
+ void __iomem *mmio_addr; /* memory map physical address */
+ struct pci_dev *pci_dev; /* Index of PCI device */
+@@ -496,7 +480,6 @@
+ unsigned features;
+
+ struct mii_if_info mii;
+- struct rtl8169_counters counters;
+ };
+
+ MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>");
+@@ -1117,6 +1100,22 @@
+ "tx_underrun",
+ };
+
++struct rtl8169_counters {
++ __le64 tx_packets;
++ __le64 rx_packets;
++ __le64 tx_errors;
++ __le32 rx_errors;
++ __le16 rx_missed;
++ __le16 align_errors;
++ __le32 tx_one_collision;
++ __le32 tx_multi_collision;
++ __le64 rx_unicast;
++ __le64 rx_broadcast;
++ __le32 rx_multicast;
++ __le16 tx_aborted;
++ __le16 tx_underun;
++};
++
+ static int rtl8169_get_sset_count(struct net_device *dev, int sset)
+ {
+ switch (sset) {
+@@ -1127,21 +1126,16 @@
+ }
+ }
+
+-static void rtl8169_update_counters(struct net_device *dev)
++static void rtl8169_get_ethtool_stats(struct net_device *dev,
++ struct ethtool_stats *stats, u64 *data)
+ {
+ struct rtl8169_private *tp = netdev_priv(dev);
+ void __iomem *ioaddr = tp->mmio_addr;
+ struct rtl8169_counters *counters;
+ dma_addr_t paddr;
+ u32 cmd;
+- int wait = 1000;
+
+- /*
+- * Some chips are unable to dump tally counters when the receiver
+- * is disabled.
+- */
+- if ((RTL_R8(ChipCmd) & CmdRxEnb) == 0)
+- return;
++ ASSERT_RTNL();
+
+ counters = pci_alloc_consistent(tp->pci_dev, sizeof(*counters), &paddr);
+ if (!counters)
+@@ -1152,43 +1146,29 @@
+ RTL_W32(CounterAddrLow, cmd);
+ RTL_W32(CounterAddrLow, cmd | CounterDump);
+
+- while (wait--) {
+- if ((RTL_R32(CounterAddrLow) & CounterDump) == 0) {
+- /* copy updated counters */
+- memcpy(&tp->counters, counters, sizeof(*counters));
++ while (RTL_R32(CounterAddrLow) & CounterDump) {
++ if (msleep_interruptible(1))
+ break;
+- }
+- udelay(10);
+ }
+
+ RTL_W32(CounterAddrLow, 0);
+ RTL_W32(CounterAddrHigh, 0);
+
+- pci_free_consistent(tp->pci_dev, sizeof(*counters), counters, paddr);
+-}
++ data[0] = le64_to_cpu(counters->tx_packets);
++ data[1] = le64_to_cpu(counters->rx_packets);
++ data[2] = le64_to_cpu(counters->tx_errors);
++ data[3] = le32_to_cpu(counters->rx_errors);
++ data[4] = le16_to_cpu(counters->rx_missed);
++ data[5] = le16_to_cpu(counters->align_errors);
++ data[6] = le32_to_cpu(counters->tx_one_collision);
++ data[7] = le32_to_cpu(counters->tx_multi_collision);
++ data[8] = le64_to_cpu(counters->rx_unicast);
++ data[9] = le64_to_cpu(counters->rx_broadcast);
++ data[10] = le32_to_cpu(counters->rx_multicast);
++ data[11] = le16_to_cpu(counters->tx_aborted);
++ data[12] = le16_to_cpu(counters->tx_underun);
+
+-static void rtl8169_get_ethtool_stats(struct net_device *dev,
+- struct ethtool_stats *stats, u64 *data)
+-{
+- struct rtl8169_private *tp = netdev_priv(dev);
+-
+- ASSERT_RTNL();
+-
+- rtl8169_update_counters(dev);
+-
+- data[0] = le64_to_cpu(tp->counters.tx_packets);
+- data[1] = le64_to_cpu(tp->counters.rx_packets);
+- data[2] = le64_to_cpu(tp->counters.tx_errors);
+- data[3] = le32_to_cpu(tp->counters.rx_errors);
+- data[4] = le16_to_cpu(tp->counters.rx_missed);
+- data[5] = le16_to_cpu(tp->counters.align_errors);
+- data[6] = le32_to_cpu(tp->counters.tx_one_collision);
+- data[7] = le32_to_cpu(tp->counters.tx_multi_collision);
+- data[8] = le64_to_cpu(tp->counters.rx_unicast);
+- data[9] = le64_to_cpu(tp->counters.rx_broadcast);
+- data[10] = le32_to_cpu(tp->counters.rx_multicast);
+- data[11] = le16_to_cpu(tp->counters.tx_aborted);
+- data[12] = le16_to_cpu(tp->counters.tx_underun);
++ pci_free_consistent(tp->pci_dev, sizeof(*counters), counters, paddr);
+ }
+
+ static void rtl8169_get_strings(struct net_device *dev, u32 stringset, u8 *data)
+@@ -3253,6 +3233,13 @@
+ opts1 |= FirstFrag;
+ } else {
+ len = skb->len;
++
++ if (unlikely(len < ETH_ZLEN)) {
++ if (skb_padto(skb, ETH_ZLEN))
++ goto err_update_stats;
++ len = ETH_ZLEN;
++ }
++
+ opts1 |= FirstFrag | LastFrag;
+ tp->tx_skb[entry].skb = skb;
+ }
+@@ -3290,6 +3277,7 @@
+ err_stop:
+ netif_stop_queue(dev);
+ ret = NETDEV_TX_BUSY;
++err_update_stats:
+ dev->stats.tx_dropped++;
+ goto out;
+ }
+@@ -3696,9 +3684,6 @@
+ struct rtl8169_private *tp = netdev_priv(dev);
+ struct pci_dev *pdev = tp->pci_dev;
+
+- /* update counters before going down */
+- rtl8169_update_counters(dev);
+-
+ rtl8169_down(dev);
+
+ free_irq(dev->irq, dev);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/sfc/efx.c linux-2.6.29-rc3.owrt/drivers/net/sfc/efx.c
+--- linux-2.6.29.owrt/drivers/net/sfc/efx.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/sfc/efx.c 2009-05-10 23:48:29.000000000 +0200
+@@ -676,8 +676,9 @@
+ rc = efx->phy_op->init(efx);
+ if (rc)
+ return rc;
+- mutex_lock(&efx->mac_lock);
+ efx->phy_op->reconfigure(efx);
++
++ mutex_lock(&efx->mac_lock);
+ rc = falcon_switch_mac(efx);
+ mutex_unlock(&efx->mac_lock);
+ if (rc)
+@@ -685,7 +686,7 @@
+ efx->mac_op->reconfigure(efx);
+
+ efx->port_initialized = true;
+- efx_stats_enable(efx);
++ efx->stats_enabled = true;
+ return 0;
+
+ fail:
+@@ -734,7 +735,6 @@
+ if (!efx->port_initialized)
+ return;
+
+- efx_stats_disable(efx);
+ efx->phy_op->fini(efx);
+ efx->port_initialized = false;
+
+@@ -1361,20 +1361,6 @@
+ return 0;
+ }
+
+-void efx_stats_disable(struct efx_nic *efx)
+-{
+- spin_lock(&efx->stats_lock);
+- ++efx->stats_disable_count;
+- spin_unlock(&efx->stats_lock);
+-}
+-
+-void efx_stats_enable(struct efx_nic *efx)
+-{
+- spin_lock(&efx->stats_lock);
+- --efx->stats_disable_count;
+- spin_unlock(&efx->stats_lock);
+-}
+-
+ /* Context: process, dev_base_lock or RTNL held, non-blocking. */
+ static struct net_device_stats *efx_net_stats(struct net_device *net_dev)
+ {
+@@ -1383,12 +1369,12 @@
+ struct net_device_stats *stats = &net_dev->stats;
+
+ /* Update stats if possible, but do not wait if another thread
+- * is updating them or if MAC stats fetches are temporarily
+- * disabled; slightly stale stats are acceptable.
++ * is updating them (or resetting the NIC); slightly stale
++ * stats are acceptable.
+ */
+ if (!spin_trylock(&efx->stats_lock))
+ return stats;
+- if (!efx->stats_disable_count) {
++ if (efx->stats_enabled) {
+ efx->mac_op->update_stats(efx);
+ falcon_update_nic_stats(efx);
+ }
+@@ -1636,12 +1622,16 @@
+
+ /* Tears down the entire software state and most of the hardware state
+ * before reset. */
+-void efx_reset_down(struct efx_nic *efx, enum reset_type method,
+- struct ethtool_cmd *ecmd)
++void efx_reset_down(struct efx_nic *efx, struct ethtool_cmd *ecmd)
+ {
+ EFX_ASSERT_RESET_SERIALISED(efx);
+
+- efx_stats_disable(efx);
++ /* The net_dev->get_stats handler is quite slow, and will fail
++ * if a fetch is pending over reset. Serialise against it. */
++ spin_lock(&efx->stats_lock);
++ efx->stats_enabled = false;
++ spin_unlock(&efx->stats_lock);
++
+ efx_stop_all(efx);
+ mutex_lock(&efx->mac_lock);
+ mutex_lock(&efx->spi_lock);
+@@ -1649,8 +1639,6 @@
+ efx->phy_op->get_settings(efx, ecmd);
+
+ efx_fini_channels(efx);
+- if (efx->port_initialized && method != RESET_TYPE_INVISIBLE)
+- efx->phy_op->fini(efx);
+ }
+
+ /* This function will always ensure that the locks acquired in
+@@ -1658,8 +1646,7 @@
+ * that we were unable to reinitialise the hardware, and the
+ * driver should be disabled. If ok is false, then the rx and tx
+ * engines are not restarted, pending a RESET_DISABLE. */
+-int efx_reset_up(struct efx_nic *efx, enum reset_type method,
+- struct ethtool_cmd *ecmd, bool ok)
++int efx_reset_up(struct efx_nic *efx, struct ethtool_cmd *ecmd, bool ok)
+ {
+ int rc;
+
+@@ -1671,15 +1658,6 @@
+ ok = false;
+ }
+
+- if (efx->port_initialized && method != RESET_TYPE_INVISIBLE) {
+- if (ok) {
+- rc = efx->phy_op->init(efx);
+- if (rc)
+- ok = false;
+- } else
+- efx->port_initialized = false;
+- }
+-
+ if (ok) {
+ efx_init_channels(efx);
+
+@@ -1692,7 +1670,7 @@
+
+ if (ok) {
+ efx_start_all(efx);
+- efx_stats_enable(efx);
++ efx->stats_enabled = true;
+ }
+ return rc;
+ }
+@@ -1724,7 +1702,7 @@
+
+ EFX_INFO(efx, "resetting (%d)\n", method);
+
+- efx_reset_down(efx, method, &ecmd);
++ efx_reset_down(efx, &ecmd);
+
+ rc = falcon_reset_hw(efx, method);
+ if (rc) {
+@@ -1743,10 +1721,10 @@
+
+ /* Leave device stopped if necessary */
+ if (method == RESET_TYPE_DISABLE) {
+- efx_reset_up(efx, method, &ecmd, false);
++ efx_reset_up(efx, &ecmd, false);
+ rc = -EIO;
+ } else {
+- rc = efx_reset_up(efx, method, &ecmd, true);
++ rc = efx_reset_up(efx, &ecmd, true);
+ }
+
+ out_disable:
+@@ -1898,7 +1876,6 @@
+ efx->rx_checksum_enabled = true;
+ spin_lock_init(&efx->netif_stop_lock);
+ spin_lock_init(&efx->stats_lock);
+- efx->stats_disable_count = 1;
+ mutex_init(&efx->mac_lock);
+ efx->mac_op = &efx_dummy_mac_operations;
+ efx->phy_op = &efx_dummy_phy_operations;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/sfc/efx.h linux-2.6.29-rc3.owrt/drivers/net/sfc/efx.h
+--- linux-2.6.29.owrt/drivers/net/sfc/efx.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/sfc/efx.h 2009-05-10 23:48:29.000000000 +0200
+@@ -36,16 +36,13 @@
+ extern void efx_flush_queues(struct efx_nic *efx);
+
+ /* Ports */
+-extern void efx_stats_disable(struct efx_nic *efx);
+-extern void efx_stats_enable(struct efx_nic *efx);
+ extern void efx_reconfigure_port(struct efx_nic *efx);
+ extern void __efx_reconfigure_port(struct efx_nic *efx);
+
+ /* Reset handling */
+-extern void efx_reset_down(struct efx_nic *efx, enum reset_type method,
+- struct ethtool_cmd *ecmd);
+-extern int efx_reset_up(struct efx_nic *efx, enum reset_type method,
+- struct ethtool_cmd *ecmd, bool ok);
++extern void efx_reset_down(struct efx_nic *efx, struct ethtool_cmd *ecmd);
++extern int efx_reset_up(struct efx_nic *efx, struct ethtool_cmd *ecmd,
++ bool ok);
+
+ /* Global */
+ extern void efx_schedule_reset(struct efx_nic *efx, enum reset_type type);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/sfc/ethtool.c linux-2.6.29-rc3.owrt/drivers/net/sfc/ethtool.c
+--- linux-2.6.29.owrt/drivers/net/sfc/ethtool.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/sfc/ethtool.c 2009-05-10 23:48:29.000000000 +0200
+@@ -219,6 +219,9 @@
+ struct efx_nic *efx = netdev_priv(net_dev);
+ int rc;
+
++ if (EFX_WORKAROUND_13963(efx) && !ecmd->autoneg)
++ return -EINVAL;
++
+ /* Falcon GMAC does not support 1000Mbps HD */
+ if (ecmd->speed == SPEED_1000 && ecmd->duplex != DUPLEX_FULL) {
+ EFX_LOG(efx, "rejecting unsupported 1000Mbps HD"
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/sfc/falcon.c linux-2.6.29-rc3.owrt/drivers/net/sfc/falcon.c
+--- linux-2.6.29.owrt/drivers/net/sfc/falcon.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/sfc/falcon.c 2009-05-10 23:48:29.000000000 +0200
+@@ -824,6 +824,10 @@
+ rx_ev_pause_frm ? " [PAUSE]" : "");
+ }
+ #endif
++
++ if (unlikely(rx_ev_eth_crc_err && EFX_WORKAROUND_10750(efx) &&
++ efx->phy_type == PHY_TYPE_SFX7101))
++ tenxpress_crc_err(efx);
+ }
+
+ /* Handle receive events that are not in-order. */
+@@ -1883,7 +1887,7 @@
+
+ /* MAC stats will fail whilst the TX fifo is draining. Serialise
+ * the drain sequence with the statistics fetch */
+- efx_stats_disable(efx);
++ spin_lock(&efx->stats_lock);
+
+ falcon_read(efx, &reg, MAC0_CTRL_REG_KER);
+ EFX_SET_OWORD_FIELD(reg, TXFIFO_DRAIN_EN_B0, 1);
+@@ -1913,7 +1917,7 @@
+ udelay(10);
+ }
+
+- efx_stats_enable(efx);
++ spin_unlock(&efx->stats_lock);
+
+ /* If we've reset the EM block and the link is up, then
+ * we'll have to kick the XAUI link so the PHY can recover */
+@@ -2273,10 +2277,6 @@
+ struct efx_mac_operations *old_mac_op = efx->mac_op;
+ efx_oword_t nic_stat;
+ unsigned strap_val;
+- int rc = 0;
+-
+- /* Don't try to fetch MAC stats while we're switching MACs */
+- efx_stats_disable(efx);
+
+ /* Internal loopbacks override the phy speed setting */
+ if (efx->loopback_mode == LOOPBACK_GMAC) {
+@@ -2287,12 +2287,16 @@
+ efx->link_fd = true;
+ }
+
+- WARN_ON(!mutex_is_locked(&efx->mac_lock));
+ efx->mac_op = (EFX_IS10G(efx) ?
+ &falcon_xmac_operations : &falcon_gmac_operations);
++ if (old_mac_op == efx->mac_op)
++ return 0;
++
++ WARN_ON(!mutex_is_locked(&efx->mac_lock));
++
++ /* Not all macs support a mac-level link state */
++ efx->mac_up = true;
+
+- /* Always push the NIC_STAT_REG setting even if the mac hasn't
+- * changed, because this function is run post online reset */
+ falcon_read(efx, &nic_stat, NIC_STAT_REG);
+ strap_val = EFX_IS10G(efx) ? 5 : 3;
+ if (falcon_rev(efx) >= FALCON_REV_B0) {
+@@ -2305,17 +2309,9 @@
+ BUG_ON(EFX_OWORD_FIELD(nic_stat, STRAP_PINS) != strap_val);
+ }
+
+- if (old_mac_op == efx->mac_op)
+- goto out;
+
+ EFX_LOG(efx, "selected %cMAC\n", EFX_IS10G(efx) ? 'X' : 'G');
+- /* Not all macs support a mac-level link state */
+- efx->mac_up = true;
+-
+- rc = falcon_reset_macs(efx);
+-out:
+- efx_stats_enable(efx);
+- return rc;
++ return falcon_reset_macs(efx);
+ }
+
+ /* This call is responsible for hooking in the MAC and PHY operations */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/sfc/mdio_10g.c linux-2.6.29-rc3.owrt/drivers/net/sfc/mdio_10g.c
+--- linux-2.6.29.owrt/drivers/net/sfc/mdio_10g.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/sfc/mdio_10g.c 2009-05-10 23:48:29.000000000 +0200
+@@ -15,7 +15,6 @@
+ #include "net_driver.h"
+ #include "mdio_10g.h"
+ #include "boards.h"
+-#include "workarounds.h"
+
+ int mdio_clause45_reset_mmd(struct efx_nic *port, int mmd,
+ int spins, int spintime)
+@@ -180,12 +179,17 @@
+ return false;
+ else if (efx_phy_mode_disabled(efx->phy_mode))
+ return false;
+- else if (efx->loopback_mode == LOOPBACK_PHYXS)
++ else if (efx->loopback_mode == LOOPBACK_PHYXS) {
+ mmd_mask &= ~(MDIO_MMDREG_DEVS_PHYXS |
+ MDIO_MMDREG_DEVS_PCS |
+ MDIO_MMDREG_DEVS_PMAPMD |
+ MDIO_MMDREG_DEVS_AN);
+- else if (efx->loopback_mode == LOOPBACK_PCS)
++ if (!mmd_mask) {
++ reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_PHYXS,
++ MDIO_PHYXS_STATUS2);
++ return !(reg & (1 << MDIO_PHYXS_STATUS2_RX_FAULT_LBN));
++ }
++ } else if (efx->loopback_mode == LOOPBACK_PCS)
+ mmd_mask &= ~(MDIO_MMDREG_DEVS_PCS |
+ MDIO_MMDREG_DEVS_PMAPMD |
+ MDIO_MMDREG_DEVS_AN);
+@@ -193,13 +197,6 @@
+ mmd_mask &= ~(MDIO_MMDREG_DEVS_PMAPMD |
+ MDIO_MMDREG_DEVS_AN);
+
+- if (!mmd_mask) {
+- /* Use presence of XGMII faults in leui of link state */
+- reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_PHYXS,
+- MDIO_PHYXS_STATUS2);
+- return !(reg & (1 << MDIO_PHYXS_STATUS2_RX_FAULT_LBN));
+- }
+-
+ while (mmd_mask) {
+ if (mmd_mask & 1) {
+ /* Double reads because link state is latched, and a
+@@ -266,7 +263,7 @@
+ }
+ }
+
+-static u32 mdio_clause45_get_an(struct efx_nic *efx, u16 addr)
++static u32 mdio_clause45_get_an(struct efx_nic *efx, u16 addr, u32 xnp)
+ {
+ int phy_id = efx->mii.phy_id;
+ u32 result = 0;
+@@ -281,6 +278,9 @@
+ result |= ADVERTISED_100baseT_Half;
+ if (reg & ADVERTISE_100FULL)
+ result |= ADVERTISED_100baseT_Full;
++ if (reg & LPA_RESV)
++ result |= xnp;
++
+ return result;
+ }
+
+@@ -310,7 +310,7 @@
+ */
+ void mdio_clause45_get_settings_ext(struct efx_nic *efx,
+ struct ethtool_cmd *ecmd,
+- u32 npage_adv, u32 npage_lpa)
++ u32 xnp, u32 xnp_lpa)
+ {
+ int phy_id = efx->mii.phy_id;
+ int reg;
+@@ -361,8 +361,8 @@
+ ecmd->autoneg = AUTONEG_ENABLE;
+ ecmd->advertising |=
+ ADVERTISED_Autoneg |
+- mdio_clause45_get_an(efx, MDIO_AN_ADVERTISE) |
+- npage_adv;
++ mdio_clause45_get_an(efx,
++ MDIO_AN_ADVERTISE, xnp);
+ } else
+ ecmd->autoneg = AUTONEG_DISABLE;
+ } else
+@@ -371,30 +371,27 @@
+ if (ecmd->autoneg) {
+ /* If AN is complete, report best common mode,
+ * otherwise report best advertised mode. */
+- u32 modes = 0;
++ u32 common = ecmd->advertising;
+ if (mdio_clause45_read(efx, phy_id, MDIO_MMD_AN,
+ MDIO_MMDREG_STAT1) &
+- (1 << MDIO_AN_STATUS_AN_DONE_LBN))
+- modes = (ecmd->advertising &
+- (mdio_clause45_get_an(efx, MDIO_AN_LPA) |
+- npage_lpa));
+- if (modes == 0)
+- modes = ecmd->advertising;
+-
+- if (modes & ADVERTISED_10000baseT_Full) {
++ (1 << MDIO_AN_STATUS_AN_DONE_LBN)) {
++ common &= mdio_clause45_get_an(efx, MDIO_AN_LPA,
++ xnp_lpa);
++ }
++ if (common & ADVERTISED_10000baseT_Full) {
+ ecmd->speed = SPEED_10000;
+ ecmd->duplex = DUPLEX_FULL;
+- } else if (modes & (ADVERTISED_1000baseT_Full |
+- ADVERTISED_1000baseT_Half)) {
++ } else if (common & (ADVERTISED_1000baseT_Full |
++ ADVERTISED_1000baseT_Half)) {
+ ecmd->speed = SPEED_1000;
+- ecmd->duplex = !!(modes & ADVERTISED_1000baseT_Full);
+- } else if (modes & (ADVERTISED_100baseT_Full |
+- ADVERTISED_100baseT_Half)) {
++ ecmd->duplex = !!(common & ADVERTISED_1000baseT_Full);
++ } else if (common & (ADVERTISED_100baseT_Full |
++ ADVERTISED_100baseT_Half)) {
+ ecmd->speed = SPEED_100;
+- ecmd->duplex = !!(modes & ADVERTISED_100baseT_Full);
++ ecmd->duplex = !!(common & ADVERTISED_100baseT_Full);
+ } else {
+ ecmd->speed = SPEED_10;
+- ecmd->duplex = !!(modes & ADVERTISED_10baseT_Full);
++ ecmd->duplex = !!(common & ADVERTISED_10baseT_Full);
+ }
+ } else {
+ /* Report forced settings */
+@@ -418,7 +415,7 @@
+ int phy_id = efx->mii.phy_id;
+ struct ethtool_cmd prev;
+ u32 required;
+- int reg;
++ int ctrl1_bits, reg;
+
+ efx->phy_op->get_settings(efx, &prev);
+
+@@ -433,83 +430,99 @@
+ if (prev.port != PORT_TP || ecmd->port != PORT_TP)
+ return -EINVAL;
+
+- /* Check that PHY supports these settings */
+- if (ecmd->autoneg) {
+- required = SUPPORTED_Autoneg;
+- } else if (ecmd->duplex) {
++ /* Check that PHY supports these settings and work out the
++ * basic control bits */
++ if (ecmd->duplex) {
+ switch (ecmd->speed) {
+- case SPEED_10: required = SUPPORTED_10baseT_Full; break;
+- case SPEED_100: required = SUPPORTED_100baseT_Full; break;
+- default: return -EINVAL;
++ case SPEED_10:
++ ctrl1_bits = BMCR_FULLDPLX;
++ required = SUPPORTED_10baseT_Full;
++ break;
++ case SPEED_100:
++ ctrl1_bits = BMCR_SPEED100 | BMCR_FULLDPLX;
++ required = SUPPORTED_100baseT_Full;
++ break;
++ case SPEED_1000:
++ ctrl1_bits = BMCR_SPEED1000 | BMCR_FULLDPLX;
++ required = SUPPORTED_1000baseT_Full;
++ break;
++ case SPEED_10000:
++ ctrl1_bits = (BMCR_SPEED1000 | BMCR_SPEED100 |
++ BMCR_FULLDPLX);
++ required = SUPPORTED_10000baseT_Full;
++ break;
++ default:
++ return -EINVAL;
+ }
+ } else {
+ switch (ecmd->speed) {
+- case SPEED_10: required = SUPPORTED_10baseT_Half; break;
+- case SPEED_100: required = SUPPORTED_100baseT_Half; break;
+- default: return -EINVAL;
++ case SPEED_10:
++ ctrl1_bits = 0;
++ required = SUPPORTED_10baseT_Half;
++ break;
++ case SPEED_100:
++ ctrl1_bits = BMCR_SPEED100;
++ required = SUPPORTED_100baseT_Half;
++ break;
++ case SPEED_1000:
++ ctrl1_bits = BMCR_SPEED1000;
++ required = SUPPORTED_1000baseT_Half;
++ break;
++ default:
++ return -EINVAL;
+ }
+ }
++ if (ecmd->autoneg)
++ required |= SUPPORTED_Autoneg;
+ required |= ecmd->advertising;
+ if (required & ~prev.supported)
+ return -EINVAL;
+
+- if (ecmd->autoneg) {
+- bool xnp = (ecmd->advertising & ADVERTISED_10000baseT_Full
+- || EFX_WORKAROUND_13204(efx));
+-
+- /* Set up the base page */
+- reg = ADVERTISE_CSMA;
+- if (ecmd->advertising & ADVERTISED_10baseT_Half)
+- reg |= ADVERTISE_10HALF;
+- if (ecmd->advertising & ADVERTISED_10baseT_Full)
+- reg |= ADVERTISE_10FULL;
+- if (ecmd->advertising & ADVERTISED_100baseT_Half)
+- reg |= ADVERTISE_100HALF;
+- if (ecmd->advertising & ADVERTISED_100baseT_Full)
+- reg |= ADVERTISE_100FULL;
+- if (xnp)
+- reg |= ADVERTISE_RESV;
+- else if (ecmd->advertising & (ADVERTISED_1000baseT_Half |
+- ADVERTISED_1000baseT_Full))
+- reg |= ADVERTISE_NPAGE;
+- reg |= efx_fc_advertise(efx->wanted_fc);
+- mdio_clause45_write(efx, phy_id, MDIO_MMD_AN,
+- MDIO_AN_ADVERTISE, reg);
+-
+- /* Set up the (extended) next page if necessary */
+- if (efx->phy_op->set_npage_adv)
+- efx->phy_op->set_npage_adv(efx, ecmd->advertising);
++ /* Set the basic control bits */
++ reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_PMAPMD,
++ MDIO_MMDREG_CTRL1);
++ reg &= ~(BMCR_SPEED1000 | BMCR_SPEED100 | BMCR_FULLDPLX | 0x003c);
++ reg |= ctrl1_bits;
++ mdio_clause45_write(efx, phy_id, MDIO_MMD_PMAPMD, MDIO_MMDREG_CTRL1,
++ reg);
++
++ /* Set the AN registers */
++ if (ecmd->autoneg != prev.autoneg ||
++ ecmd->advertising != prev.advertising) {
++ bool xnp = false;
++
++ if (efx->phy_op->set_xnp_advertise)
++ xnp = efx->phy_op->set_xnp_advertise(efx,
++ ecmd->advertising);
++
++ if (ecmd->autoneg) {
++ reg = 0;
++ if (ecmd->advertising & ADVERTISED_10baseT_Half)
++ reg |= ADVERTISE_10HALF;
++ if (ecmd->advertising & ADVERTISED_10baseT_Full)
++ reg |= ADVERTISE_10FULL;
++ if (ecmd->advertising & ADVERTISED_100baseT_Half)
++ reg |= ADVERTISE_100HALF;
++ if (ecmd->advertising & ADVERTISED_100baseT_Full)
++ reg |= ADVERTISE_100FULL;
++ if (xnp)
++ reg |= ADVERTISE_RESV;
++ mdio_clause45_write(efx, phy_id, MDIO_MMD_AN,
++ MDIO_AN_ADVERTISE, reg);
++ }
+
+- /* Enable and restart AN */
+ reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_AN,
+ MDIO_MMDREG_CTRL1);
+- reg |= BMCR_ANENABLE;
+- if (!(EFX_WORKAROUND_15195(efx) &&
+- LOOPBACK_MASK(efx) & efx->phy_op->loopbacks))
+- reg |= BMCR_ANRESTART;
++ if (ecmd->autoneg)
++ reg |= BMCR_ANENABLE | BMCR_ANRESTART;
++ else
++ reg &= ~BMCR_ANENABLE;
+ if (xnp)
+ reg |= 1 << MDIO_AN_CTRL_XNP_LBN;
+ else
+ reg &= ~(1 << MDIO_AN_CTRL_XNP_LBN);
+ mdio_clause45_write(efx, phy_id, MDIO_MMD_AN,
+ MDIO_MMDREG_CTRL1, reg);
+- } else {
+- /* Disable AN */
+- mdio_clause45_set_flag(efx, phy_id, MDIO_MMD_AN,
+- MDIO_MMDREG_CTRL1,
+- __ffs(BMCR_ANENABLE), false);
+-
+- /* Set the basic control bits */
+- reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_PMAPMD,
+- MDIO_MMDREG_CTRL1);
+- reg &= ~(BMCR_SPEED1000 | BMCR_SPEED100 | BMCR_FULLDPLX |
+- 0x003c);
+- if (ecmd->speed == SPEED_100)
+- reg |= BMCR_SPEED100;
+- if (ecmd->duplex)
+- reg |= BMCR_FULLDPLX;
+- mdio_clause45_write(efx, phy_id, MDIO_MMD_PMAPMD,
+- MDIO_MMDREG_CTRL1, reg);
+ }
+
+ return 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/sfc/mdio_10g.h linux-2.6.29-rc3.owrt/drivers/net/sfc/mdio_10g.h
+--- linux-2.6.29.owrt/drivers/net/sfc/mdio_10g.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/sfc/mdio_10g.h 2009-05-10 23:48:29.000000000 +0200
+@@ -155,8 +155,7 @@
+ #define MDIO_AN_XNP 22
+ #define MDIO_AN_LPA_XNP 25
+
+-#define MDIO_AN_10GBT_CTRL 32
+-#define MDIO_AN_10GBT_CTRL_ADV_10G_LBN 12
++#define MDIO_AN_10GBT_ADVERTISE 32
+ #define MDIO_AN_10GBT_STATUS (33)
+ #define MDIO_AN_10GBT_STATUS_MS_FLT_LBN (15) /* MASTER/SLAVE config fault */
+ #define MDIO_AN_10GBT_STATUS_MS_LBN (14) /* MASTER/SLAVE config */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/sfc/net_driver.h linux-2.6.29-rc3.owrt/drivers/net/sfc/net_driver.h
+--- linux-2.6.29.owrt/drivers/net/sfc/net_driver.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/sfc/net_driver.h 2009-05-10 23:48:29.000000000 +0200
+@@ -566,7 +566,7 @@
+ * @poll: Poll for hardware state. Serialised by the mac_lock.
+ * @get_settings: Get ethtool settings. Serialised by the mac_lock.
+ * @set_settings: Set ethtool settings. Serialised by the mac_lock.
+- * @set_npage_adv: Set abilities advertised in (Extended) Next Page
++ * @set_xnp_advertise: Set abilities advertised in Extended Next Page
+ * (only needed where AN bit is set in mmds)
+ * @num_tests: Number of PHY-specific tests/results
+ * @test_names: Names of the tests/results
+@@ -586,7 +586,7 @@
+ struct ethtool_cmd *ecmd);
+ int (*set_settings) (struct efx_nic *efx,
+ struct ethtool_cmd *ecmd);
+- void (*set_npage_adv) (struct efx_nic *efx, u32);
++ bool (*set_xnp_advertise) (struct efx_nic *efx, u32);
+ u32 num_tests;
+ const char *const *test_names;
+ int (*run_tests) (struct efx_nic *efx, int *results, unsigned flags);
+@@ -754,7 +754,8 @@
+ * &struct net_device_stats.
+ * @stats_buffer: DMA buffer for statistics
+ * @stats_lock: Statistics update lock. Serialises statistics fetches
+- * @stats_disable_count: Nest count for disabling statistics fetches
++ * @stats_enabled: Temporarily disable statistics fetches.
++ * Serialised by @stats_lock
+ * @mac_op: MAC interface
+ * @mac_address: Permanent MAC address
+ * @phy_type: PHY type
+@@ -836,7 +837,7 @@
+ struct efx_mac_stats mac_stats;
+ struct efx_buffer stats_buffer;
+ spinlock_t stats_lock;
+- unsigned int stats_disable_count;
++ bool stats_enabled;
+
+ struct efx_mac_operations *mac_op;
+ unsigned char mac_address[ETH_ALEN];
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/sfc/phy.h linux-2.6.29-rc3.owrt/drivers/net/sfc/phy.h
+--- linux-2.6.29.owrt/drivers/net/sfc/phy.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/sfc/phy.h 2009-05-10 23:48:29.000000000 +0200
+@@ -17,6 +17,7 @@
+ extern struct efx_phy_operations falcon_sft9001_phy_ops;
+
+ extern void tenxpress_phy_blink(struct efx_nic *efx, bool blink);
++extern void tenxpress_crc_err(struct efx_nic *efx);
+
+ /****************************************************************************
+ * Exported functions from the driver for XFP optical PHYs
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/sfc/selftest.c linux-2.6.29-rc3.owrt/drivers/net/sfc/selftest.c
+--- linux-2.6.29.owrt/drivers/net/sfc/selftest.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/sfc/selftest.c 2009-05-10 23:48:29.000000000 +0200
+@@ -665,7 +665,6 @@
+ {
+ enum efx_loopback_mode loopback_mode = efx->loopback_mode;
+ int phy_mode = efx->phy_mode;
+- enum reset_type reset_method = RESET_TYPE_INVISIBLE;
+ struct ethtool_cmd ecmd;
+ struct efx_channel *channel;
+ int rc_test = 0, rc_reset = 0, rc;
+@@ -719,21 +718,21 @@
+ mutex_unlock(&efx->mac_lock);
+
+ /* free up all consumers of SRAM (including all the queues) */
+- efx_reset_down(efx, reset_method, &ecmd);
++ efx_reset_down(efx, &ecmd);
+
+ rc = efx_test_chip(efx, tests);
+ if (rc && !rc_test)
+ rc_test = rc;
+
+ /* reset the chip to recover from the register test */
+- rc_reset = falcon_reset_hw(efx, reset_method);
++ rc_reset = falcon_reset_hw(efx, RESET_TYPE_ALL);
+
+ /* Ensure that the phy is powered and out of loopback
+ * for the bist and loopback tests */
+ efx->phy_mode &= ~PHY_MODE_LOW_POWER;
+ efx->loopback_mode = LOOPBACK_NONE;
+
+- rc = efx_reset_up(efx, reset_method, &ecmd, rc_reset == 0);
++ rc = efx_reset_up(efx, &ecmd, rc_reset == 0);
+ if (rc && !rc_reset)
+ rc_reset = rc;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/sfc/sfe4001.c linux-2.6.29-rc3.owrt/drivers/net/sfc/sfe4001.c
+--- linux-2.6.29.owrt/drivers/net/sfc/sfe4001.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/sfc/sfe4001.c 2009-05-10 23:48:29.000000000 +0200
+@@ -186,22 +186,19 @@
+ {
+ efx_oword_t reg;
+
+- /* GPIO 3 and the GPIO register are shared with I2C, so block that */
++ /* GPIO pins are also used for I2C, so block that temporarily */
+ mutex_lock(&efx->i2c_adap.bus_lock);
+
+- /* Pull RST_N (GPIO 2) low then let it up again, setting the
+- * FLASH_CFG_1 strap (GPIO 3) appropriately. Only change the
+- * output enables; the output levels should always be 0 (low)
+- * and we rely on external pull-ups. */
+ falcon_read(efx, &reg, GPIO_CTL_REG_KER);
+ EFX_SET_OWORD_FIELD(reg, GPIO2_OEN, true);
++ EFX_SET_OWORD_FIELD(reg, GPIO2_OUT, false);
+ falcon_write(efx, &reg, GPIO_CTL_REG_KER);
+ msleep(1000);
+- EFX_SET_OWORD_FIELD(reg, GPIO2_OEN, false);
+- EFX_SET_OWORD_FIELD(reg, GPIO3_OEN,
+- !!(efx->phy_mode & PHY_MODE_SPECIAL));
++ EFX_SET_OWORD_FIELD(reg, GPIO2_OUT, true);
++ EFX_SET_OWORD_FIELD(reg, GPIO3_OEN, true);
++ EFX_SET_OWORD_FIELD(reg, GPIO3_OUT,
++ !(efx->phy_mode & PHY_MODE_SPECIAL));
+ falcon_write(efx, &reg, GPIO_CTL_REG_KER);
+- msleep(1);
+
+ mutex_unlock(&efx->i2c_adap.bus_lock);
+
+@@ -235,18 +232,12 @@
+ } else if (efx->state != STATE_RUNNING || netif_running(efx->net_dev)) {
+ err = -EBUSY;
+ } else {
+- /* Reset the PHY, reconfigure the MAC and enable/disable
+- * MAC stats accordingly. */
+ efx->phy_mode = new_mode;
+- if (new_mode & PHY_MODE_SPECIAL)
+- efx_stats_disable(efx);
+ if (efx->board_info.type == EFX_BOARD_SFE4001)
+ err = sfe4001_poweron(efx);
+ else
+ err = sfn4111t_reset(efx);
+ efx_reconfigure_port(efx);
+- if (!(new_mode & PHY_MODE_SPECIAL))
+- efx_stats_enable(efx);
+ }
+ rtnl_unlock();
+
+@@ -335,11 +326,6 @@
+ efx->board_info.monitor = sfe4001_check_hw;
+ efx->board_info.fini = sfe4001_fini;
+
+- if (efx->phy_mode & PHY_MODE_SPECIAL) {
+- /* PHY won't generate a 156.25 MHz clock and MAC stats fetch
+- * will fail. */
+- efx_stats_disable(efx);
+- }
+ rc = sfe4001_poweron(efx);
+ if (rc)
+ goto fail_ioexp;
+@@ -386,25 +372,17 @@
+ i2c_unregister_device(efx->board_info.hwmon_client);
+ }
+
+-static struct i2c_board_info sfn4111t_a0_hwmon_info = {
++static struct i2c_board_info sfn4111t_hwmon_info = {
+ I2C_BOARD_INFO("max6647", 0x4e),
+ .irq = -1,
+ };
+
+-static struct i2c_board_info sfn4111t_r5_hwmon_info = {
+- I2C_BOARD_INFO("max6646", 0x4d),
+- .irq = -1,
+-};
+-
+ int sfn4111t_init(struct efx_nic *efx)
+ {
+ int rc;
+
+ efx->board_info.hwmon_client =
+- i2c_new_device(&efx->i2c_adap,
+- (efx->board_info.minor < 5) ?
+- &sfn4111t_a0_hwmon_info :
+- &sfn4111t_r5_hwmon_info);
++ i2c_new_device(&efx->i2c_adap, &sfn4111t_hwmon_info);
+ if (!efx->board_info.hwmon_client)
+ return -EIO;
+
+@@ -416,10 +394,8 @@
+ if (rc)
+ goto fail_hwmon;
+
+- if (efx->phy_mode & PHY_MODE_SPECIAL) {
+- efx_stats_disable(efx);
++ if (efx->phy_mode & PHY_MODE_SPECIAL)
+ sfn4111t_reset(efx);
+- }
+
+ return 0;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/sfc/tenxpress.c linux-2.6.29-rc3.owrt/drivers/net/sfc/tenxpress.c
+--- linux-2.6.29.owrt/drivers/net/sfc/tenxpress.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/sfc/tenxpress.c 2009-05-10 23:48:29.000000000 +0200
+@@ -67,8 +67,6 @@
+ #define PMA_PMD_EXT_CLK312_WIDTH 1
+ #define PMA_PMD_EXT_LPOWER_LBN 12
+ #define PMA_PMD_EXT_LPOWER_WIDTH 1
+-#define PMA_PMD_EXT_ROBUST_LBN 14
+-#define PMA_PMD_EXT_ROBUST_WIDTH 1
+ #define PMA_PMD_EXT_SSR_LBN 15
+ #define PMA_PMD_EXT_SSR_WIDTH 1
+
+@@ -179,24 +177,35 @@
+ #define C22EXT_STATUS_LINK_LBN 2
+ #define C22EXT_STATUS_LINK_WIDTH 1
+
+-#define C22EXT_MSTSLV_CTRL 49161
+-#define C22EXT_MSTSLV_CTRL_ADV_1000_HD_LBN 8
+-#define C22EXT_MSTSLV_CTRL_ADV_1000_FD_LBN 9
+-
+-#define C22EXT_MSTSLV_STATUS 49162
+-#define C22EXT_MSTSLV_STATUS_LP_1000_HD_LBN 10
+-#define C22EXT_MSTSLV_STATUS_LP_1000_FD_LBN 11
++#define C22EXT_MSTSLV_REG 49162
++#define C22EXT_MSTSLV_1000_HD_LBN 10
++#define C22EXT_MSTSLV_1000_HD_WIDTH 1
++#define C22EXT_MSTSLV_1000_FD_LBN 11
++#define C22EXT_MSTSLV_1000_FD_WIDTH 1
+
+ /* Time to wait between powering down the LNPGA and turning off the power
+ * rails */
+ #define LNPGA_PDOWN_WAIT (HZ / 5)
+
++static int crc_error_reset_threshold = 100;
++module_param(crc_error_reset_threshold, int, 0644);
++MODULE_PARM_DESC(crc_error_reset_threshold,
++ "Max number of CRC errors before XAUI reset");
++
+ struct tenxpress_phy_data {
+ enum efx_loopback_mode loopback_mode;
++ atomic_t bad_crc_count;
+ enum efx_phy_mode phy_mode;
+ int bad_lp_tries;
+ };
+
++void tenxpress_crc_err(struct efx_nic *efx)
++{
++ struct tenxpress_phy_data *phy_data = efx->phy_data;
++ if (phy_data != NULL)
++ atomic_inc(&phy_data->bad_crc_count);
++}
++
+ static ssize_t show_phy_short_reach(struct device *dev,
+ struct device_attribute *attr, char *buf)
+ {
+@@ -275,9 +284,7 @@
+ PMA_PMD_XCONTROL_REG);
+ reg |= ((1 << PMA_PMD_EXT_GMII_EN_LBN) |
+ (1 << PMA_PMD_EXT_CLK_OUT_LBN) |
+- (1 << PMA_PMD_EXT_CLK312_LBN) |
+- (1 << PMA_PMD_EXT_ROBUST_LBN));
+-
++ (1 << PMA_PMD_EXT_CLK312_LBN));
+ mdio_clause45_write(efx, phy_id, MDIO_MMD_PMAPMD,
+ PMA_PMD_XCONTROL_REG, reg);
+ mdio_clause45_set_flag(efx, phy_id, MDIO_MMD_C22EXT,
+@@ -339,7 +346,6 @@
+ rc = tenxpress_init(efx);
+ if (rc < 0)
+ goto fail;
+- mdio_clause45_set_pause(efx);
+
+ if (efx->phy_type == PHY_TYPE_SFT9001B) {
+ rc = device_create_file(&efx->pci_dev->dev,
+@@ -370,8 +376,8 @@
+
+ /* The XGMAC clock is driven from the SFC7101/SFT9001 312MHz clock, so
+ * a special software reset can glitch the XGMAC sufficiently for stats
+- * requests to fail. */
+- efx_stats_disable(efx);
++ * requests to fail. Since we don't often special_reset, just lock. */
++ spin_lock(&efx->stats_lock);
+
+ /* Initiate reset */
+ reg = mdio_clause45_read(efx, efx->mii.phy_id,
+@@ -386,17 +392,17 @@
+ rc = mdio_clause45_wait_reset_mmds(efx,
+ TENXPRESS_REQUIRED_DEVS);
+ if (rc < 0)
+- goto out;
++ goto unlock;
+
+ /* Try and reconfigure the device */
+ rc = tenxpress_init(efx);
+ if (rc < 0)
+- goto out;
++ goto unlock;
+
+ /* Wait for the XGXS state machine to churn */
+ mdelay(10);
+-out:
+- efx_stats_enable(efx);
++unlock:
++ spin_unlock(&efx->stats_lock);
+ return rc;
+ }
+
+@@ -514,7 +520,7 @@
+ {
+ struct tenxpress_phy_data *phy_data = efx->phy_data;
+ struct ethtool_cmd ecmd;
+- bool phy_mode_change, loop_reset;
++ bool phy_mode_change, loop_reset, loop_toggle, loopback;
+
+ if (efx->phy_mode & (PHY_MODE_OFF | PHY_MODE_SPECIAL)) {
+ phy_data->phy_mode = efx->phy_mode;
+@@ -525,10 +531,12 @@
+
+ phy_mode_change = (efx->phy_mode == PHY_MODE_NORMAL &&
+ phy_data->phy_mode != PHY_MODE_NORMAL);
++ loopback = LOOPBACK_MASK(efx) & efx->phy_op->loopbacks;
++ loop_toggle = LOOPBACK_CHANGED(phy_data, efx, efx->phy_op->loopbacks);
+ loop_reset = (LOOPBACK_OUT_OF(phy_data, efx, efx->phy_op->loopbacks) ||
+ LOOPBACK_CHANGED(phy_data, efx, 1 << LOOPBACK_GPHY));
+
+- if (loop_reset || phy_mode_change) {
++ if (loop_reset || loop_toggle || loopback || phy_mode_change) {
+ int rc;
+
+ efx->phy_op->get_settings(efx, &ecmd);
+@@ -543,6 +551,20 @@
+ falcon_reset_xaui(efx);
+ }
+
++ if (efx->phy_type != PHY_TYPE_SFX7101) {
++ /* Only change autoneg once, on coming out or
++ * going into loopback */
++ if (loop_toggle)
++ ecmd.autoneg = !loopback;
++ if (loopback) {
++ ecmd.duplex = DUPLEX_FULL;
++ if (efx->loopback_mode == LOOPBACK_GPHY)
++ ecmd.speed = SPEED_1000;
++ else
++ ecmd.speed = SPEED_10000;
++ }
++ }
++
+ rc = efx->phy_op->set_settings(efx, &ecmd);
+ WARN_ON(rc);
+ }
+@@ -601,6 +623,13 @@
+
+ if (phy_data->phy_mode != PHY_MODE_NORMAL)
+ return;
++
++ if (EFX_WORKAROUND_10750(efx) &&
++ atomic_read(&phy_data->bad_crc_count) > crc_error_reset_threshold) {
++ EFX_ERR(efx, "Resetting XAUI due to too many CRC errors\n");
++ falcon_reset_xaui(efx);
++ atomic_set(&phy_data->bad_crc_count, 0);
++ }
+ }
+
+ static void tenxpress_phy_fini(struct efx_nic *efx)
+@@ -743,76 +772,107 @@
+ return rc;
+ }
+
+-static void
+-tenxpress_get_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd)
++static u32 tenxpress_get_xnp_lpa(struct efx_nic *efx)
+ {
+- int phy_id = efx->mii.phy_id;
+- u32 adv = 0, lpa = 0;
++ int phy = efx->mii.phy_id;
++ u32 lpa = 0;
+ int reg;
+
+ if (efx->phy_type != PHY_TYPE_SFX7101) {
+- reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_C22EXT,
+- C22EXT_MSTSLV_CTRL);
+- if (reg & (1 << C22EXT_MSTSLV_CTRL_ADV_1000_FD_LBN))
+- adv |= ADVERTISED_1000baseT_Full;
+- reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_C22EXT,
+- C22EXT_MSTSLV_STATUS);
+- if (reg & (1 << C22EXT_MSTSLV_STATUS_LP_1000_HD_LBN))
++ reg = mdio_clause45_read(efx, phy, MDIO_MMD_C22EXT,
++ C22EXT_MSTSLV_REG);
++ if (reg & (1 << C22EXT_MSTSLV_1000_HD_LBN))
+ lpa |= ADVERTISED_1000baseT_Half;
+- if (reg & (1 << C22EXT_MSTSLV_STATUS_LP_1000_FD_LBN))
++ if (reg & (1 << C22EXT_MSTSLV_1000_FD_LBN))
+ lpa |= ADVERTISED_1000baseT_Full;
+ }
+- reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_AN,
+- MDIO_AN_10GBT_CTRL);
+- if (reg & (1 << MDIO_AN_10GBT_CTRL_ADV_10G_LBN))
+- adv |= ADVERTISED_10000baseT_Full;
+- reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_AN,
+- MDIO_AN_10GBT_STATUS);
++ reg = mdio_clause45_read(efx, phy, MDIO_MMD_AN, MDIO_AN_10GBT_STATUS);
+ if (reg & (1 << MDIO_AN_10GBT_STATUS_LP_10G_LBN))
+ lpa |= ADVERTISED_10000baseT_Full;
+-
+- mdio_clause45_get_settings_ext(efx, ecmd, adv, lpa);
+-
+- if (efx->phy_type != PHY_TYPE_SFX7101)
+- ecmd->supported |= (SUPPORTED_100baseT_Full |
+- SUPPORTED_1000baseT_Full);
+-
+- /* In loopback, the PHY automatically brings up the correct interface,
+- * but doesn't advertise the correct speed. So override it */
+- if (efx->loopback_mode == LOOPBACK_GPHY)
+- ecmd->speed = SPEED_1000;
+- else if (LOOPBACK_MASK(efx) & efx->phy_op->loopbacks)
+- ecmd->speed = SPEED_10000;
++ return lpa;
+ }
+
+-static int tenxpress_set_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd)
++static void sfx7101_get_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd)
+ {
+- if (!ecmd->autoneg)
+- return -EINVAL;
+-
+- return mdio_clause45_set_settings(efx, ecmd);
++ mdio_clause45_get_settings_ext(efx, ecmd, ADVERTISED_10000baseT_Full,
++ tenxpress_get_xnp_lpa(efx));
++ ecmd->supported |= SUPPORTED_10000baseT_Full;
++ ecmd->advertising |= ADVERTISED_10000baseT_Full;
+ }
+
+-static void sfx7101_set_npage_adv(struct efx_nic *efx, u32 advertising)
++static void sft9001_get_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd)
+ {
+- mdio_clause45_set_flag(efx, efx->mii.phy_id, MDIO_MMD_AN,
+- MDIO_AN_10GBT_CTRL,
+- MDIO_AN_10GBT_CTRL_ADV_10G_LBN,
+- advertising & ADVERTISED_10000baseT_Full);
++ int phy_id = efx->mii.phy_id;
++ u32 xnp_adv = 0;
++ int reg;
++
++ reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_PMAPMD,
++ PMA_PMD_SPEED_ENABLE_REG);
++ if (EFX_WORKAROUND_13204(efx) && (reg & (1 << PMA_PMD_100TX_ADV_LBN)))
++ xnp_adv |= ADVERTISED_100baseT_Full;
++ if (reg & (1 << PMA_PMD_1000T_ADV_LBN))
++ xnp_adv |= ADVERTISED_1000baseT_Full;
++ if (reg & (1 << PMA_PMD_10000T_ADV_LBN))
++ xnp_adv |= ADVERTISED_10000baseT_Full;
++
++ mdio_clause45_get_settings_ext(efx, ecmd, xnp_adv,
++ tenxpress_get_xnp_lpa(efx));
++
++ ecmd->supported |= (SUPPORTED_100baseT_Half |
++ SUPPORTED_100baseT_Full |
++ SUPPORTED_1000baseT_Full);
++
++ /* Use the vendor defined C22ext register for duplex settings */
++ if (ecmd->speed != SPEED_10000 && !ecmd->autoneg) {
++ reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_C22EXT,
++ GPHY_XCONTROL_REG);
++ ecmd->duplex = (reg & (1 << GPHY_DUPLEX_LBN) ?
++ DUPLEX_FULL : DUPLEX_HALF);
++ }
+ }
+
+-static void sft9001_set_npage_adv(struct efx_nic *efx, u32 advertising)
++static int sft9001_set_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd)
+ {
+ int phy_id = efx->mii.phy_id;
++ int rc;
+
+- mdio_clause45_set_flag(efx, phy_id, MDIO_MMD_C22EXT,
+- C22EXT_MSTSLV_CTRL,
+- C22EXT_MSTSLV_CTRL_ADV_1000_FD_LBN,
+- advertising & ADVERTISED_1000baseT_Full);
+- mdio_clause45_set_flag(efx, phy_id, MDIO_MMD_AN,
+- MDIO_AN_10GBT_CTRL,
+- MDIO_AN_10GBT_CTRL_ADV_10G_LBN,
+- advertising & ADVERTISED_10000baseT_Full);
++ rc = mdio_clause45_set_settings(efx, ecmd);
++ if (rc)
++ return rc;
++
++ if (ecmd->speed != SPEED_10000 && !ecmd->autoneg)
++ mdio_clause45_set_flag(efx, phy_id, MDIO_MMD_C22EXT,
++ GPHY_XCONTROL_REG, GPHY_DUPLEX_LBN,
++ ecmd->duplex == DUPLEX_FULL);
++
++ return rc;
++}
++
++static bool sft9001_set_xnp_advertise(struct efx_nic *efx, u32 advertising)
++{
++ int phy = efx->mii.phy_id;
++ int reg = mdio_clause45_read(efx, phy, MDIO_MMD_PMAPMD,
++ PMA_PMD_SPEED_ENABLE_REG);
++ bool enabled;
++
++ reg &= ~((1 << 2) | (1 << 3));
++ if (EFX_WORKAROUND_13204(efx) &&
++ (advertising & ADVERTISED_100baseT_Full))
++ reg |= 1 << PMA_PMD_100TX_ADV_LBN;
++ if (advertising & ADVERTISED_1000baseT_Full)
++ reg |= 1 << PMA_PMD_1000T_ADV_LBN;
++ if (advertising & ADVERTISED_10000baseT_Full)
++ reg |= 1 << PMA_PMD_10000T_ADV_LBN;
++ mdio_clause45_write(efx, phy, MDIO_MMD_PMAPMD,
++ PMA_PMD_SPEED_ENABLE_REG, reg);
++
++ enabled = (advertising &
++ (ADVERTISED_1000baseT_Half |
++ ADVERTISED_1000baseT_Full |
++ ADVERTISED_10000baseT_Full));
++ if (EFX_WORKAROUND_13204(efx))
++ enabled |= (advertising & ADVERTISED_100baseT_Full);
++ return enabled;
+ }
+
+ struct efx_phy_operations falcon_sfx7101_phy_ops = {
+@@ -822,9 +882,8 @@
+ .poll = tenxpress_phy_poll,
+ .fini = tenxpress_phy_fini,
+ .clear_interrupt = efx_port_dummy_op_void,
+- .get_settings = tenxpress_get_settings,
+- .set_settings = tenxpress_set_settings,
+- .set_npage_adv = sfx7101_set_npage_adv,
++ .get_settings = sfx7101_get_settings,
++ .set_settings = mdio_clause45_set_settings,
+ .num_tests = ARRAY_SIZE(sfx7101_test_names),
+ .test_names = sfx7101_test_names,
+ .run_tests = sfx7101_run_tests,
+@@ -839,9 +898,9 @@
+ .poll = tenxpress_phy_poll,
+ .fini = tenxpress_phy_fini,
+ .clear_interrupt = efx_port_dummy_op_void,
+- .get_settings = tenxpress_get_settings,
+- .set_settings = tenxpress_set_settings,
+- .set_npage_adv = sft9001_set_npage_adv,
++ .get_settings = sft9001_get_settings,
++ .set_settings = sft9001_set_settings,
++ .set_xnp_advertise = sft9001_set_xnp_advertise,
+ .num_tests = ARRAY_SIZE(sft9001_test_names),
+ .test_names = sft9001_test_names,
+ .run_tests = sft9001_run_tests,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/sfc/workarounds.h linux-2.6.29-rc3.owrt/drivers/net/sfc/workarounds.h
+--- linux-2.6.29.owrt/drivers/net/sfc/workarounds.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/sfc/workarounds.h 2009-05-10 23:48:29.000000000 +0200
+@@ -18,8 +18,8 @@
+ #define EFX_WORKAROUND_ALWAYS(efx) 1
+ #define EFX_WORKAROUND_FALCON_A(efx) (falcon_rev(efx) <= FALCON_REV_A1)
+ #define EFX_WORKAROUND_10G(efx) EFX_IS10G(efx)
+-#define EFX_WORKAROUND_SFT9001(efx) ((efx)->phy_type == PHY_TYPE_SFT9001A || \
+- (efx)->phy_type == PHY_TYPE_SFT9001B)
++#define EFX_WORKAROUND_SFX7101(efx) ((efx)->phy_type == PHY_TYPE_SFX7101)
++#define EFX_WORKAROUND_SFT9001A(efx) ((efx)->phy_type == PHY_TYPE_SFT9001A)
+
+ /* XAUI resets if link not detected */
+ #define EFX_WORKAROUND_5147 EFX_WORKAROUND_ALWAYS
+@@ -29,6 +29,8 @@
+ #define EFX_WORKAROUND_7884 EFX_WORKAROUND_10G
+ /* TX pkt parser problem with <= 16 byte TXes */
+ #define EFX_WORKAROUND_9141 EFX_WORKAROUND_ALWAYS
++/* Low rate CRC errors require XAUI reset */
++#define EFX_WORKAROUND_10750 EFX_WORKAROUND_SFX7101
+ /* TX_EV_PKT_ERR can be caused by a dangling TX descriptor
+ * or a PCIe error (bug 11028) */
+ #define EFX_WORKAROUND_10727 EFX_WORKAROUND_ALWAYS
+@@ -53,8 +55,8 @@
+ #define EFX_WORKAROUND_8071 EFX_WORKAROUND_FALCON_A
+
+ /* Need to send XNP pages for 100BaseT */
+-#define EFX_WORKAROUND_13204 EFX_WORKAROUND_SFT9001
+-/* Don't restart AN in near-side loopback */
+-#define EFX_WORKAROUND_15195 EFX_WORKAROUND_SFT9001
++#define EFX_WORKAROUND_13204 EFX_WORKAROUND_SFT9001A
++/* Need to keep AN enabled */
++#define EFX_WORKAROUND_13963 EFX_WORKAROUND_SFT9001A
+
+ #endif /* EFX_WORKAROUNDS_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/sh_eth.c linux-2.6.29-rc3.owrt/drivers/net/sh_eth.c
+--- linux-2.6.29.owrt/drivers/net/sh_eth.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/sh_eth.c 2009-05-10 23:48:29.000000000 +0200
+@@ -687,7 +687,6 @@
+ {
+ struct net_device *ndev = netdev;
+ struct sh_eth_private *mdp = netdev_priv(ndev);
+- irqreturn_t ret = IRQ_NONE;
+ u32 ioaddr, boguscnt = RX_RING_SIZE;
+ u32 intr_status = 0;
+
+@@ -697,13 +696,7 @@
+ /* Get interrpt stat */
+ intr_status = ctrl_inl(ioaddr + EESR);
+ /* Clear interrupt */
+- if (intr_status & (EESR_FRC | EESR_RMAF | EESR_RRF |
+- EESR_RTLF | EESR_RTSF | EESR_PRE | EESR_CERF |
+- TX_CHECK | EESR_ERR_CHECK)) {
+- ctrl_outl(intr_status, ioaddr + EESR);
+- ret = IRQ_HANDLED;
+- } else
+- goto other_irq;
++ ctrl_outl(intr_status, ioaddr + EESR);
+
+ if (intr_status & (EESR_FRC | /* Frame recv*/
+ EESR_RMAF | /* Multi cast address recv*/
+@@ -730,10 +723,9 @@
+ ndev->name, intr_status);
+ }
+
+-other_irq:
+ spin_unlock(&mdp->lock);
+
+- return ret;
++ return IRQ_HANDLED;
+ }
+
+ static void sh_eth_timer(unsigned long data)
+@@ -852,13 +844,7 @@
+ int ret = 0;
+ struct sh_eth_private *mdp = netdev_priv(ndev);
+
+- ret = request_irq(ndev->irq, &sh_eth_interrupt,
+-#if defined(CONFIG_CPU_SUBTYPE_SH7763) || defined(CONFIG_CPU_SUBTYPE_SH7764)
+- IRQF_SHARED,
+-#else
+- 0,
+-#endif
+- ndev->name, ndev);
++ ret = request_irq(ndev->irq, &sh_eth_interrupt, 0, ndev->name, ndev);
+ if (ret) {
+ printk(KERN_ERR "Can not assign IRQ number to %s\n", CARDNAME);
+ return ret;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/sh_eth.h linux-2.6.29-rc3.owrt/drivers/net/sh_eth.h
+--- linux-2.6.29.owrt/drivers/net/sh_eth.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/sh_eth.h 2009-05-10 23:48:29.000000000 +0200
+@@ -43,8 +43,8 @@
+
+ #define SH7763_SKB_ALIGN 32
+ /* Chip Base Address */
+-# define SH_TSU_ADDR 0xFEE01800
+-# define ARSTR SH_TSU_ADDR
++# define SH_TSU_ADDR 0xFFE01800
++# define ARSTR 0xFFE01800
+
+ /* Chip Registers */
+ /* E-DMAC */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/skfp/skfddi.c linux-2.6.29-rc3.owrt/drivers/net/skfp/skfddi.c
+--- linux-2.6.29.owrt/drivers/net/skfp/skfddi.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/skfp/skfddi.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1003,9 +1003,9 @@
+ break;
+ case SKFP_CLR_STATS: /* Zero out the driver statistics */
+ if (!capable(CAP_NET_ADMIN)) {
+- status = -EPERM;
+- } else {
+ memset(&lp->MacStat, 0, sizeof(lp->MacStat));
++ } else {
++ status = -EPERM;
+ }
+ break;
+ default:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/sky2.c linux-2.6.29-rc3.owrt/drivers/net/sky2.c
+--- linux-2.6.29.owrt/drivers/net/sky2.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/sky2.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1403,6 +1403,9 @@
+
+ }
+
++ if (netif_msg_ifup(sky2))
++ printk(KERN_INFO PFX "%s: enabling interface\n", dev->name);
++
+ netif_carrier_off(dev);
+
+ /* must be power of 2 */
+@@ -1481,9 +1484,6 @@
+ sky2_write32(hw, B0_IMSK, imask);
+
+ sky2_set_multicast(dev);
+-
+- if (netif_msg_ifup(sky2))
+- printk(KERN_INFO PFX "%s: enabling interface\n", dev->name);
+ return 0;
+
+ err_out:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/smc911x.c linux-2.6.29-rc3.owrt/drivers/net/smc911x.c
+--- linux-2.6.29.owrt/drivers/net/smc911x.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/smc911x.c 2009-05-10 23:48:29.000000000 +0200
+@@ -220,9 +220,9 @@
+
+ /* make sure EEPROM has finished loading before setting GPIO_CFG */
+ timeout=1000;
+- while (--timeout && (SMC_GET_E2P_CMD(lp) & E2P_CMD_EPC_BUSY_))
++ while ( timeout-- && (SMC_GET_E2P_CMD(lp) & E2P_CMD_EPC_BUSY_)) {
+ udelay(10);
+-
++ }
+ if (timeout == 0){
+ PRINTK("%s: smc911x_reset timeout waiting for EEPROM busy\n", dev->name);
+ return;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/smc911x.h linux-2.6.29-rc3.owrt/drivers/net/smc911x.h
+--- linux-2.6.29.owrt/drivers/net/smc911x.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/smc911x.h 2009-05-10 23:48:29.000000000 +0200
+@@ -42,16 +42,6 @@
+ #define SMC_USE_16BIT 0
+ #define SMC_USE_32BIT 1
+ #define SMC_IRQ_SENSE IRQF_TRIGGER_LOW
+-#elif defined(CONFIG_ARCH_OMAP34XX)
+- #define SMC_USE_16BIT 0
+- #define SMC_USE_32BIT 1
+- #define SMC_IRQ_SENSE IRQF_TRIGGER_LOW
+- #define SMC_MEM_RESERVED 1
+-#elif defined(CONFIG_ARCH_OMAP24XX)
+- #define SMC_USE_16BIT 0
+- #define SMC_USE_32BIT 1
+- #define SMC_IRQ_SENSE IRQF_TRIGGER_LOW
+- #define SMC_MEM_RESERVED 1
+ #else
+ /*
+ * Default configuration
+@@ -685,7 +675,6 @@
+ #define CHIP_9116 0x0116
+ #define CHIP_9117 0x0117
+ #define CHIP_9118 0x0118
+-#define CHIP_9211 0x9211
+ #define CHIP_9215 0x115A
+ #define CHIP_9217 0x117A
+ #define CHIP_9218 0x118A
+@@ -700,7 +689,6 @@
+ { CHIP_9116, "LAN9116" },
+ { CHIP_9117, "LAN9117" },
+ { CHIP_9118, "LAN9118" },
+- { CHIP_9211, "LAN9211" },
+ { CHIP_9215, "LAN9215" },
+ { CHIP_9217, "LAN9217" },
+ { CHIP_9218, "LAN9218" },
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/smsc911x.c linux-2.6.29-rc3.owrt/drivers/net/smsc911x.c
+--- linux-2.6.29.owrt/drivers/net/smsc911x.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/smsc911x.c 2009-05-10 23:48:29.000000000 +0200
+@@ -953,7 +953,7 @@
+ do {
+ udelay(1);
+ val = smsc911x_reg_read(pdata, RX_DP_CTRL);
+- } while (--timeout && (val & RX_DP_CTRL_RX_FFWD_));
++ } while (timeout-- && (val & RX_DP_CTRL_RX_FFWD_));
+
+ if (unlikely(timeout == 0))
+ SMSC_WARNING(HW, "Timed out waiting for "
+@@ -1225,10 +1225,6 @@
+ dev_info(&dev->dev, "SMSC911x/921x identified at %#08lx, IRQ: %d\n",
+ (unsigned long)pdata->ioaddr, dev->irq);
+
+- /* Reset the last known duplex and carrier */
+- pdata->last_duplex = -1;
+- pdata->last_carrier = -1;
+-
+ /* Bring the PHY up */
+ phy_start(pdata->phy_dev);
+
+@@ -1628,7 +1624,7 @@
+ do {
+ msleep(1);
+ e2cmd = smsc911x_reg_read(pdata, E2P_CMD);
+- } while ((e2cmd & E2P_CMD_EPC_BUSY_) && (--timeout));
++ } while ((e2cmd & E2P_CMD_EPC_BUSY_) && (timeout--));
+
+ if (!timeout) {
+ SMSC_TRACE(DRV, "TIMED OUT");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/smsc9420.c linux-2.6.29-rc3.owrt/drivers/net/smsc9420.c
+--- linux-2.6.29.owrt/drivers/net/smsc9420.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/smsc9420.c 2009-05-10 23:48:29.000000000 +0200
+@@ -341,7 +341,7 @@
+ do {
+ msleep(1);
+ e2cmd = smsc9420_reg_read(pd, E2P_CMD);
+- } while ((e2cmd & E2P_CMD_EPC_BUSY_) && (--timeout));
++ } while ((e2cmd & E2P_CMD_EPC_BUSY_) && (timeout--));
+
+ if (!timeout) {
+ smsc_info(HW, "TIMED OUT");
+@@ -413,7 +413,6 @@
+ }
+
+ memcpy(data, &eeprom_data[eeprom->offset], len);
+- eeprom->magic = SMSC9420_EEPROM_MAGIC;
+ eeprom->len = len;
+ return 0;
+ }
+@@ -424,9 +423,6 @@
+ struct smsc9420_pdata *pd = netdev_priv(dev);
+ int ret;
+
+- if (eeprom->magic != SMSC9420_EEPROM_MAGIC)
+- return -EINVAL;
+-
+ smsc9420_eeprom_enable_access(pd);
+ smsc9420_eeprom_send_cmd(pd, E2P_CMD_EPC_CMD_EWEN_);
+ ret = smsc9420_eeprom_write_location(pd, eeprom->offset, *data);
+@@ -502,7 +498,7 @@
+ static void smsc9420_stop_tx(struct smsc9420_pdata *pd)
+ {
+ u32 dmac_control, mac_cr, dma_intr_ena;
+- int timeout = 1000;
++ int timeOut = 1000;
+
+ /* disable TX DMAC */
+ dmac_control = smsc9420_reg_read(pd, DMAC_CONTROL);
+@@ -510,13 +506,13 @@
+ smsc9420_reg_write(pd, DMAC_CONTROL, dmac_control);
+
+ /* Wait max 10ms for transmit process to stop */
+- while (--timeout) {
++ while (timeOut--) {
+ if (smsc9420_reg_read(pd, DMAC_STATUS) & DMAC_STS_TS_)
+ break;
+ udelay(10);
+ }
+
+- if (!timeout)
++ if (!timeOut)
+ smsc_warn(IFDOWN, "TX DMAC failed to stop");
+
+ /* ACK Tx DMAC stop bit */
+@@ -600,7 +596,7 @@
+
+ static void smsc9420_stop_rx(struct smsc9420_pdata *pd)
+ {
+- int timeout = 1000;
++ int timeOut = 1000;
+ u32 mac_cr, dmac_control, dma_intr_ena;
+
+ /* mask RX DMAC interrupts */
+@@ -621,13 +617,13 @@
+ smsc9420_pci_flush_write(pd);
+
+ /* wait up to 10ms for receive to stop */
+- while (--timeout) {
++ while (timeOut--) {
+ if (smsc9420_reg_read(pd, DMAC_STATUS) & DMAC_STS_RS_)
+ break;
+ udelay(10);
+ }
+
+- if (!timeout)
++ if (!timeOut)
+ smsc_warn(IFDOWN, "RX DMAC did not stop! timeout.");
+
+ /* ACK the Rx DMAC stop bit */
+@@ -1382,7 +1378,6 @@
+
+ /* test the IRQ connection to the ISR */
+ smsc_dbg(IFUP, "Testing ISR using IRQ %d", dev->irq);
+- pd->software_irq_signal = false;
+
+ spin_lock_irqsave(&pd->int_lock, flags);
+ /* configure interrupt deassertion timer and enable interrupts */
+@@ -1398,6 +1393,8 @@
+ smsc9420_pci_flush_write(pd);
+
+ timeout = 1000;
++ pd->software_irq_signal = false;
++ smp_wmb();
+ while (timeout--) {
+ if (pd->software_irq_signal)
+ break;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/smsc9420.h linux-2.6.29-rc3.owrt/drivers/net/smsc9420.h
+--- linux-2.6.29.owrt/drivers/net/smsc9420.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/smsc9420.h 2009-05-10 23:48:29.000000000 +0200
+@@ -44,7 +44,6 @@
+ #define LAN_REGISTER_EXTENT (0x400)
+
+ #define SMSC9420_EEPROM_SIZE ((u32)11)
+-#define SMSC9420_EEPROM_MAGIC (0x9420)
+
+ #define PKT_BUF_SZ (VLAN_ETH_FRAME_LEN + NET_IP_ALIGN + 4)
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/sun3lance.c linux-2.6.29-rc3.owrt/drivers/net/sun3lance.c
+--- linux-2.6.29.owrt/drivers/net/sun3lance.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/sun3lance.c 2009-05-10 23:48:29.000000000 +0200
+@@ -428,7 +428,7 @@
+ while (--i > 0)
+ if (DREG & CSR0_IDON)
+ break;
+- if (i <= 0 || (DREG & CSR0_ERR)) {
++ if (i < 0 || (DREG & CSR0_ERR)) {
+ DPRINTK( 2, ( "lance_open(): opening %s failed, i=%d, csr0=%04x\n",
+ dev->name, i, DREG ));
+ DREG = CSR0_STOP;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/sundance.c linux-2.6.29-rc3.owrt/drivers/net/sundance.c
+--- linux-2.6.29.owrt/drivers/net/sundance.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/sundance.c 2009-05-10 23:48:29.000000000 +0200
+@@ -909,7 +909,7 @@
+ printk(KERN_INFO "%s: Setting %s-duplex based on MII #%d "
+ "negotiated capability %4.4x.\n", dev->name,
+ duplex ? "full" : "half", np->phys[0], negotiated);
+- iowrite16(ioread16(ioaddr + MACCtrl0) | (duplex ? 0x20 : 0), ioaddr + MACCtrl0);
++ iowrite16(ioread16(ioaddr + MACCtrl0) | duplex ? 0x20 : 0, ioaddr + MACCtrl0);
+ }
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/sungem.c linux-2.6.29-rc3.owrt/drivers/net/sungem.c
+--- linux-2.6.29.owrt/drivers/net/sungem.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/sungem.c 2009-05-10 23:48:29.000000000 +0200
+@@ -148,7 +148,7 @@
+ cmd |= (MIF_FRAME_TAMSB);
+ writel(cmd, gp->regs + MIF_FRAME);
+
+- while (--limit) {
++ while (limit--) {
+ cmd = readl(gp->regs + MIF_FRAME);
+ if (cmd & MIF_FRAME_TALSB)
+ break;
+@@ -1157,7 +1157,7 @@
+ if (limit-- <= 0)
+ break;
+ }
+- if (limit < 0)
++ if (limit <= 0)
+ printk(KERN_WARNING "%s: PCS reset bit would not clear.\n",
+ gp->dev->name);
+ }
+@@ -1229,7 +1229,7 @@
+ break;
+ } while (val & (GREG_SWRST_TXRST | GREG_SWRST_RXRST));
+
+- if (limit < 0)
++ if (limit <= 0)
+ printk(KERN_ERR "%s: SW reset is ghetto.\n", gp->dev->name);
+
+ if (gp->phy_type == phy_serialink || gp->phy_type == phy_serdes)
+@@ -2221,8 +2221,6 @@
+
+ gp->running = 1;
+
+- napi_enable(&gp->napi);
+-
+ if (gp->lstate == link_up) {
+ netif_carrier_on(gp->dev);
+ gem_set_link_modes(gp);
+@@ -2240,8 +2238,6 @@
+ spin_lock_irqsave(&gp->lock, flags);
+ spin_lock(&gp->tx_lock);
+
+- napi_disable(&gp->napi);
+-
+ gp->running = 0;
+ gem_reset(gp);
+ gem_clean_rings(gp);
+@@ -2342,6 +2338,8 @@
+ if (!gp->asleep)
+ rc = gem_do_start(dev);
+ gp->opened = (rc == 0);
++ if (gp->opened)
++ napi_enable(&gp->napi);
+
+ mutex_unlock(&gp->pm_mutex);
+
+@@ -2478,6 +2476,8 @@
+
+ /* Re-attach net device */
+ netif_device_attach(dev);
++
++ napi_enable(&gp->napi);
+ }
+
+ spin_lock_irqsave(&gp->lock, flags);
+@@ -2998,11 +2998,8 @@
+ .ndo_do_ioctl = gem_ioctl,
+ .ndo_tx_timeout = gem_tx_timeout,
+ .ndo_change_mtu = gem_change_mtu,
++ .ndo_set_mac_address = eth_mac_addr,
+ .ndo_validate_addr = eth_validate_addr,
+- .ndo_set_mac_address = gem_set_mac_address,
+-#ifdef CONFIG_NET_POLL_CONTROLLER
+- .ndo_poll_controller = gem_poll_controller,
+-#endif
+ };
+
+ static int __devinit gem_init_one(struct pci_dev *pdev,
+@@ -3164,6 +3161,10 @@
+ dev->watchdog_timeo = 5 * HZ;
+ dev->irq = pdev->irq;
+ dev->dma = 0;
++ dev->set_mac_address = gem_set_mac_address;
++#ifdef CONFIG_NET_POLL_CONTROLLER
++ dev->poll_controller = gem_poll_controller;
++#endif
+
+ /* Set that now, in case PM kicks in now */
+ pci_set_drvdata(pdev, dev);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/sungem_phy.c linux-2.6.29-rc3.owrt/drivers/net/sungem_phy.c
+--- linux-2.6.29.owrt/drivers/net/sungem_phy.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/sungem_phy.c 2009-05-10 23:48:29.000000000 +0200
+@@ -79,7 +79,7 @@
+
+ udelay(100);
+
+- while (--limit) {
++ while (limit--) {
+ val = __phy_read(phy, phy_id, MII_BMCR);
+ if ((val & BMCR_RESET) == 0)
+ break;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/sunhme.c linux-2.6.29-rc3.owrt/drivers/net/sunhme.c
+--- linux-2.6.29.owrt/drivers/net/sunhme.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/sunhme.c 2009-05-10 23:48:29.000000000 +0200
+@@ -2543,36 +2543,25 @@
+ }
+
+ /* After all quattro cards have been probed, we call these functions
+- * to register the IRQ handlers for the cards that have been
+- * successfully probed and skip the cards that failed to initialize
++ * to register the IRQ handlers.
+ */
+-static int __init quattro_sbus_register_irqs(void)
++static void __init quattro_sbus_register_irqs(void)
+ {
+ struct quattro *qp;
+
+ for (qp = qfe_sbus_list; qp != NULL; qp = qp->next) {
+ struct of_device *op = qp->quattro_dev;
+- int err, qfe_slot, skip = 0;
+-
+- for (qfe_slot = 0; qfe_slot < 4; qfe_slot++) {
+- if (!qp->happy_meals[qfe_slot])
+- skip = 1;
+- }
+- if (skip)
+- continue;
++ int err;
+
+ err = request_irq(op->irqs[0],
+ quattro_sbus_interrupt,
+ IRQF_SHARED, "Quattro",
+ qp);
+ if (err != 0) {
+- printk(KERN_ERR "Quattro HME: IRQ registration "
+- "error %d.\n", err);
+- return err;
++ printk(KERN_ERR "Quattro: Fatal IRQ registery error %d.\n", err);
++ panic("QFE request irq");
+ }
+ }
+-
+- return 0;
+ }
+
+ static void quattro_sbus_free_irqs(void)
+@@ -2581,14 +2570,6 @@
+
+ for (qp = qfe_sbus_list; qp != NULL; qp = qp->next) {
+ struct of_device *op = qp->quattro_dev;
+- int qfe_slot, skip = 0;
+-
+- for (qfe_slot = 0; qfe_slot < 4; qfe_slot++) {
+- if (!qp->happy_meals[qfe_slot])
+- skip = 1;
+- }
+- if (skip)
+- continue;
+
+ free_irq(op->irqs[0], qp);
+ }
+@@ -2648,12 +2629,6 @@
+ int i, qfe_slot = -1;
+ int err = -ENODEV;
+
+- sbus_dp = to_of_device(op->dev.parent)->node;
+-
+- /* We can match PCI devices too, do not accept those here. */
+- if (strcmp(sbus_dp->name, "sbus"))
+- return err;
+-
+ if (is_qfe) {
+ qp = quattro_sbus_find(op);
+ if (qp == NULL)
+@@ -2759,6 +2734,10 @@
+ if (qp != NULL)
+ hp->happy_flags |= HFLAG_QUATTRO;
+
++ sbus_dp = to_of_device(op->dev.parent)->node;
++ if (is_qfe)
++ sbus_dp = to_of_device(op->dev.parent->parent)->node;
++
+ /* Get the supported DVMA burst sizes from our Happy SBUS. */
+ hp->happy_bursts = of_getintprop_default(sbus_dp,
+ "burst-sizes", 0x00);
+@@ -2845,9 +2824,6 @@
+ if (hp->tcvregs)
+ of_iounmap(&op->resource[4], hp->tcvregs, TCVR_REG_SIZE);
+
+- if (qp)
+- qp->happy_meals[qfe_slot] = NULL;
+-
+ err_out_free_netdev:
+ free_netdev(dev);
+
+@@ -3305,7 +3281,7 @@
+
+ err = of_register_driver(&hme_sbus_driver, &of_bus_type);
+ if (!err)
+- err = quattro_sbus_register_irqs();
++ quattro_sbus_register_irqs();
+
+ return err;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/sunlance.c linux-2.6.29-rc3.owrt/drivers/net/sunlance.c
+--- linux-2.6.29.owrt/drivers/net/sunlance.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/sunlance.c 2009-05-10 23:48:29.000000000 +0200
+@@ -343,7 +343,7 @@
+ ib->phys_addr [5] = dev->dev_addr [4];
+
+ /* Setup the Tx ring entries */
+- for (i = 0; i < TX_RING_SIZE; i++) {
++ for (i = 0; i <= TX_RING_SIZE; i++) {
+ leptr = LANCE_ADDR(aib + libbuff_offset(tx_buf, i));
+ ib->btx_ring [i].tmd0 = leptr;
+ ib->btx_ring [i].tmd1_hadr = leptr >> 16;
+@@ -399,7 +399,7 @@
+ sbus_writeb(dev->dev_addr[4], &ib->phys_addr[5]);
+
+ /* Setup the Tx ring entries */
+- for (i = 0; i < TX_RING_SIZE; i++) {
++ for (i = 0; i <= TX_RING_SIZE; i++) {
+ leptr = libbuff_offset(tx_buf, i);
+ sbus_writew(leptr, &ib->btx_ring [i].tmd0);
+ sbus_writeb(leptr >> 16,&ib->btx_ring [i].tmd1_hadr);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/sunqe.c linux-2.6.29-rc3.owrt/drivers/net/sunqe.c
+--- linux-2.6.29.owrt/drivers/net/sunqe.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/sunqe.c 2009-05-10 23:48:29.000000000 +0200
+@@ -227,7 +227,7 @@
+ if (!(sbus_readb(mregs + MREGS_PHYCONFIG) & MREGS_PHYCONFIG_LTESTDIS)) {
+ int tries = 50;
+
+- while (--tries) {
++ while (tries--) {
+ u8 tmp;
+
+ mdelay(5);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/tg3.c linux-2.6.29-rc3.owrt/drivers/net/tg3.c
+--- linux-2.6.29.owrt/drivers/net/tg3.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/tg3.c 2009-05-10 23:48:29.000000000 +0200
+@@ -852,7 +852,7 @@
+ }
+ udelay(10);
+ }
+- if (limit < 0)
++ if (limit <= 0)
+ return -EBUSY;
+
+ return 0;
+@@ -1473,8 +1473,7 @@
+ {
+ u32 reg;
+
+- if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS) ||
+- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)
++ if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS))
+ return;
+
+ reg = MII_TG3_MISC_SHDW_WREN |
+@@ -1604,7 +1603,7 @@
+ break;
+ }
+ }
+- if (limit < 0)
++ if (limit <= 0)
+ return -EBUSY;
+
+ return 0;
+@@ -2238,8 +2237,8 @@
+ phyid = phydev->drv->phy_id & phydev->drv->phy_id_mask;
+ if (phyid != TG3_PHY_ID_BCMAC131) {
+ phyid &= TG3_PHY_OUI_MASK;
+- if (phyid == TG3_PHY_OUI_1 ||
+- phyid == TG3_PHY_OUI_2 ||
++ if (phyid == TG3_PHY_OUI_1 &&
++ phyid == TG3_PHY_OUI_2 &&
+ phyid == TG3_PHY_OUI_3)
+ do_low_power = true;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/tokenring/tmspci.c linux-2.6.29-rc3.owrt/drivers/net/tokenring/tmspci.c
+--- linux-2.6.29.owrt/drivers/net/tokenring/tmspci.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/tokenring/tmspci.c 2009-05-10 23:48:29.000000000 +0200
+@@ -121,6 +121,11 @@
+ goto err_out_trdev;
+ }
+
++ ret = request_irq(pdev->irq, tms380tr_interrupt, IRQF_SHARED,
++ dev->name, dev);
++ if (ret)
++ goto err_out_region;
++
+ dev->base_addr = pci_ioaddr;
+ dev->irq = pci_irq_line;
+ dev->dma = 0;
+@@ -137,7 +142,7 @@
+ ret = tmsdev_init(dev, &pdev->dev);
+ if (ret) {
+ printk("%s: unable to get memory for dev->priv.\n", dev->name);
+- goto err_out_region;
++ goto err_out_irq;
+ }
+
+ tp = netdev_priv(dev);
+@@ -152,11 +157,6 @@
+
+ tp->tmspriv = cardinfo;
+
+- ret = request_irq(pdev->irq, tms380tr_interrupt, IRQF_SHARED,
+- dev->name, dev);
+- if (ret)
+- goto err_out_tmsdev;
+-
+ dev->open = tms380tr_open;
+ dev->stop = tms380tr_close;
+ pci_set_drvdata(pdev, dev);
+@@ -164,15 +164,15 @@
+
+ ret = register_netdev(dev);
+ if (ret)
+- goto err_out_irq;
++ goto err_out_tmsdev;
+
+ return 0;
+
+-err_out_irq:
+- free_irq(pdev->irq, dev);
+ err_out_tmsdev:
+ pci_set_drvdata(pdev, NULL);
+ tmsdev_term(dev);
++err_out_irq:
++ free_irq(pdev->irq, dev);
+ err_out_region:
+ release_region(pci_ioaddr, TMS_PCI_IO_EXTENT);
+ err_out_trdev:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/tsi108_eth.c linux-2.6.29-rc3.owrt/drivers/net/tsi108_eth.c
+--- linux-2.6.29.owrt/drivers/net/tsi108_eth.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/tsi108_eth.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1237,7 +1237,7 @@
+ spin_lock_irqsave(&phy_lock, flags);
+
+ tsi108_write_mii(data, MII_BMCR, BMCR_RESET);
+- while (--i) {
++ while (i--){
+ if(!(tsi108_read_mii(data, MII_BMCR) & BMCR_RESET))
+ break;
+ udelay(10);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/tulip/21142.c linux-2.6.29-rc3.owrt/drivers/net/tulip/21142.c
+--- linux-2.6.29.owrt/drivers/net/tulip/21142.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/tulip/21142.c 2009-05-10 23:48:29.000000000 +0200
+@@ -9,11 +9,6 @@
+
+ Please refer to Documentation/DocBook/tulip-user.{pdf,ps,html}
+ for more information on this driver.
+-
+- DC21143 manual "21143 PCI/CardBus 10/100Mb/s Ethernet LAN Controller
+- Hardware Reference Manual" is currently available at :
+- http://developer.intel.com/design/network/manuals/278074.htm
+-
+ Please submit bugs to http://bugzilla.kernel.org/ .
+ */
+
+@@ -37,11 +32,7 @@
+ int csr12 = ioread32(ioaddr + CSR12);
+ int next_tick = 60*HZ;
+ int new_csr6 = 0;
+- int csr14 = ioread32(ioaddr + CSR14);
+
+- /* CSR12[LS10,LS100] are not reliable during autonegotiation */
+- if ((csr14 & 0x80) && (csr12 & 0x7000) != 0x5000)
+- csr12 |= 6;
+ if (tulip_debug > 2)
+ printk(KERN_INFO"%s: 21143 negotiation status %8.8x, %s.\n",
+ dev->name, csr12, medianame[dev->if_port]);
+@@ -85,7 +76,7 @@
+ new_csr6 = 0x83860000;
+ dev->if_port = 3;
+ iowrite32(0, ioaddr + CSR13);
+- iowrite32(0x0003FFFF, ioaddr + CSR14);
++ iowrite32(0x0003FF7F, ioaddr + CSR14);
+ iowrite16(8, ioaddr + CSR15);
+ iowrite32(1, ioaddr + CSR13);
+ }
+@@ -141,14 +132,10 @@
+ struct tulip_private *tp = netdev_priv(dev);
+ void __iomem *ioaddr = tp->base_addr;
+ int csr12 = ioread32(ioaddr + CSR12);
+- int csr14 = ioread32(ioaddr + CSR14);
+
+- /* CSR12[LS10,LS100] are not reliable during autonegotiation */
+- if ((csr14 & 0x80) && (csr12 & 0x7000) != 0x5000)
+- csr12 |= 6;
+ if (tulip_debug > 1)
+ printk(KERN_INFO"%s: 21143 link status interrupt %8.8x, CSR5 %x, "
+- "%8.8x.\n", dev->name, csr12, csr5, csr14);
++ "%8.8x.\n", dev->name, csr12, csr5, ioread32(ioaddr + CSR14));
+
+ /* If NWay finished and we have a negotiated partner capability. */
+ if (tp->nway && !tp->nwayset && (csr12 & 0x7000) == 0x5000) {
+@@ -156,9 +143,7 @@
+ int negotiated = tp->sym_advertise & (csr12 >> 16);
+ tp->lpar = csr12 >> 16;
+ tp->nwayset = 1;
+- /* If partner cannot negotiate, it is 10Mbps Half Duplex */
+- if (!(csr12 & 0x8000)) dev->if_port = 0;
+- else if (negotiated & 0x0100) dev->if_port = 5;
++ if (negotiated & 0x0100) dev->if_port = 5;
+ else if (negotiated & 0x0080) dev->if_port = 3;
+ else if (negotiated & 0x0040) dev->if_port = 4;
+ else if (negotiated & 0x0020) dev->if_port = 0;
+@@ -229,7 +214,7 @@
+ tp->timer.expires = RUN_AT(3*HZ);
+ add_timer(&tp->timer);
+ } else if (dev->if_port == 5)
+- iowrite32(csr14 & ~0x080, ioaddr + CSR14);
++ iowrite32(ioread32(ioaddr + CSR14) & ~0x080, ioaddr + CSR14);
+ } else if (dev->if_port == 0 || dev->if_port == 4) {
+ if ((csr12 & 4) == 0)
+ printk(KERN_INFO"%s: 21143 10baseT link beat good.\n",
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/tulip/de2104x.c linux-2.6.29-rc3.owrt/drivers/net/tulip/de2104x.c
+--- linux-2.6.29.owrt/drivers/net/tulip/de2104x.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/tulip/de2104x.c 2009-05-10 23:48:29.000000000 +0200
+@@ -392,7 +392,7 @@
+ unsigned drop = 0;
+ int rc;
+
+- while (--rx_work) {
++ while (rx_work--) {
+ u32 status, len;
+ dma_addr_t mapping;
+ struct sk_buff *skb, *copy_skb;
+@@ -464,14 +464,13 @@
+ drop = 1;
+
+ rx_next:
++ de->rx_ring[rx_tail].opts1 = cpu_to_le32(DescOwn);
+ if (rx_tail == (DE_RX_RING_SIZE - 1))
+ de->rx_ring[rx_tail].opts2 =
+ cpu_to_le32(RingEnd | de->rx_buf_sz);
+ else
+ de->rx_ring[rx_tail].opts2 = cpu_to_le32(de->rx_buf_sz);
+ de->rx_ring[rx_tail].addr1 = cpu_to_le32(mapping);
+- wmb();
+- de->rx_ring[rx_tail].opts1 = cpu_to_le32(DescOwn);
+ rx_tail = NEXT_RX(rx_tail);
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/tulip/tulip_core.c linux-2.6.29-rc3.owrt/drivers/net/tulip/tulip_core.c
+--- linux-2.6.29.owrt/drivers/net/tulip/tulip_core.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/tulip/tulip_core.c 2009-05-10 23:48:29.000000000 +0200
+@@ -255,7 +255,6 @@
+
+ static void tulip_tx_timeout(struct net_device *dev);
+ static void tulip_init_ring(struct net_device *dev);
+-static void tulip_free_ring(struct net_device *dev);
+ static int tulip_start_xmit(struct sk_buff *skb, struct net_device *dev);
+ static int tulip_open(struct net_device *dev);
+ static int tulip_close(struct net_device *dev);
+@@ -503,21 +502,16 @@
+ {
+ int retval;
+
+- tulip_init_ring (dev);
++ if ((retval = request_irq(dev->irq, &tulip_interrupt, IRQF_SHARED, dev->name, dev)))
++ return retval;
+
+- retval = request_irq(dev->irq, &tulip_interrupt, IRQF_SHARED, dev->name, dev);
+- if (retval)
+- goto free_ring;
++ tulip_init_ring (dev);
+
+ tulip_up (dev);
+
+ netif_start_queue (dev);
+
+ return 0;
+-
+-free_ring:
+- tulip_free_ring (dev);
+- return retval;
+ }
+
+
+@@ -774,11 +768,23 @@
+ tulip_set_power_state (tp, 0, 1);
+ }
+
+-static void tulip_free_ring (struct net_device *dev)
++
++static int tulip_close (struct net_device *dev)
+ {
+ struct tulip_private *tp = netdev_priv(dev);
++ void __iomem *ioaddr = tp->base_addr;
+ int i;
+
++ netif_stop_queue (dev);
++
++ tulip_down (dev);
++
++ if (tulip_debug > 1)
++ printk (KERN_DEBUG "%s: Shutting down ethercard, status was %2.2x.\n",
++ dev->name, ioread32 (ioaddr + CSR5));
++
++ free_irq (dev->irq, dev);
++
+ /* Free all the skbuffs in the Rx queue. */
+ for (i = 0; i < RX_RING_SIZE; i++) {
+ struct sk_buff *skb = tp->rx_buffers[i].skb;
+@@ -797,7 +803,6 @@
+ dev_kfree_skb (skb);
+ }
+ }
+-
+ for (i = 0; i < TX_RING_SIZE; i++) {
+ struct sk_buff *skb = tp->tx_buffers[i].skb;
+
+@@ -809,24 +814,6 @@
+ tp->tx_buffers[i].skb = NULL;
+ tp->tx_buffers[i].mapping = 0;
+ }
+-}
+-
+-static int tulip_close (struct net_device *dev)
+-{
+- struct tulip_private *tp = netdev_priv(dev);
+- void __iomem *ioaddr = tp->base_addr;
+-
+- netif_stop_queue (dev);
+-
+- tulip_down (dev);
+-
+- if (tulip_debug > 1)
+- printk (KERN_DEBUG "%s: Shutting down ethercard, status was %2.2x.\n",
+- dev->name, ioread32 (ioaddr + CSR5));
+-
+- free_irq (dev->irq, dev);
+-
+- tulip_free_ring (dev);
+
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/tun.c linux-2.6.29-rc3.owrt/drivers/net/tun.c
+--- linux-2.6.29.owrt/drivers/net/tun.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/tun.c 2009-05-10 23:48:29.000000000 +0200
+@@ -157,16 +157,10 @@
+
+ nexact = n;
+
+- /* Remaining multicast addresses are hashed,
+- * unicast will leave the filter disabled. */
++ /* The rest is hashed */
+ memset(filter->mask, 0, sizeof(filter->mask));
+- for (; n < uf.count; n++) {
+- if (!is_multicast_ether_addr(addr[n].u)) {
+- err = 0; /* no filter */
+- goto done;
+- }
++ for (; n < uf.count; n++)
+ addr_hash_set(filter->mask, addr[n].u);
+- }
+
+ /* For ALLMULTI just set the mask to all ones.
+ * This overrides the mask populated above. */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/ucc_geth.c linux-2.6.29-rc3.owrt/drivers/net/ucc_geth.c
+--- linux-2.6.29.owrt/drivers/net/ucc_geth.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/ucc_geth.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1536,15 +1536,17 @@
+ static int init_phy(struct net_device *dev)
+ {
+ struct ucc_geth_private *priv = netdev_priv(dev);
+- struct ucc_geth_info *ug_info = priv->ug_info;
+ struct phy_device *phydev;
++ char phy_id[BUS_ID_SIZE];
+
+ priv->oldlink = 0;
+ priv->oldspeed = 0;
+ priv->oldduplex = -1;
+
+- phydev = phy_connect(dev, ug_info->phy_bus_id, &adjust_link, 0,
+- priv->phy_interface);
++ snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT, priv->ug_info->mdio_bus,
++ priv->ug_info->phy_address);
++
++ phydev = phy_connect(dev, phy_id, &adjust_link, 0, priv->phy_interface);
+
+ if (IS_ERR(phydev)) {
+ printk("%s: Could not attach to PHY\n", dev->name);
+@@ -3612,12 +3614,10 @@
+ ug_info->uf_info.irq = irq_of_parse_and_map(np, 0);
+ fixed_link = of_get_property(np, "fixed-link", NULL);
+ if (fixed_link) {
+- snprintf(ug_info->phy_bus_id, sizeof(ug_info->phy_bus_id),
+- PHY_ID_FMT, "0", fixed_link[0]);
++ snprintf(ug_info->mdio_bus, MII_BUS_ID_SIZE, "0");
++ ug_info->phy_address = fixed_link[0];
+ phy = NULL;
+ } else {
+- char bus_name[MII_BUS_ID_SIZE];
+-
+ ph = of_get_property(np, "phy-handle", NULL);
+ phy = of_find_node_by_phandle(*ph);
+
+@@ -3628,6 +3628,7 @@
+ prop = of_get_property(phy, "reg", NULL);
+ if (prop == NULL)
+ return -1;
++ ug_info->phy_address = *prop;
+
+ /* Set the bus id */
+ mdio = of_get_parent(phy);
+@@ -3641,9 +3642,7 @@
+ if (err)
+ return -1;
+
+- uec_mdio_bus_name(bus_name, mdio);
+- snprintf(ug_info->phy_bus_id, sizeof(ug_info->phy_bus_id),
+- "%s:%02x", bus_name, *prop);
++ snprintf(ug_info->mdio_bus, MII_BUS_ID_SIZE, "%x", res.start);
+ }
+
+ /* get the phy interface type, or default to MII */
+@@ -3749,7 +3748,6 @@
+
+ ugeth->ug_info = ug_info;
+ ugeth->dev = dev;
+- ugeth->node = np;
+
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/ucc_geth.h linux-2.6.29-rc3.owrt/drivers/net/ucc_geth.h
+--- linux-2.6.29.owrt/drivers/net/ucc_geth.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/ucc_geth.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1091,7 +1091,8 @@
+ u32 eventRegMask;
+ u16 pausePeriod;
+ u16 extensionField;
+- char phy_bus_id[BUS_ID_SIZE];
++ u8 phy_address;
++ char mdio_bus[MII_BUS_ID_SIZE];
+ u8 weightfactor[NUM_TX_QUEUES];
+ u8 interruptcoalescingmaxvalue[NUM_RX_QUEUES];
+ u8 l2qt[UCC_GETH_VLAN_PRIORITY_MAX];
+@@ -1185,8 +1186,6 @@
+ int oldspeed;
+ int oldduplex;
+ int oldlink;
+-
+- struct device_node *node;
+ };
+
+ void uec_set_ethtool_ops(struct net_device *netdev);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/ucc_geth_mii.c linux-2.6.29-rc3.owrt/drivers/net/ucc_geth_mii.c
+--- linux-2.6.29.owrt/drivers/net/ucc_geth_mii.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/ucc_geth_mii.c 2009-05-10 23:48:29.000000000 +0200
+@@ -107,7 +107,7 @@
+ static int uec_mdio_reset(struct mii_bus *bus)
+ {
+ struct ucc_mii_mng __iomem *regs = (void __iomem *)bus->priv;
+- int timeout = PHY_INIT_TIMEOUT;
++ unsigned int timeout = PHY_INIT_TIMEOUT;
+
+ mutex_lock(&bus->mdio_lock);
+
+@@ -123,7 +123,7 @@
+
+ mutex_unlock(&bus->mdio_lock);
+
+- if (timeout < 0) {
++ if (timeout <= 0) {
+ printk(KERN_ERR "%s: The MII Bus is stuck!\n", bus->name);
+ return -EBUSY;
+ }
+@@ -156,7 +156,7 @@
+ if (err)
+ goto reg_map_fail;
+
+- uec_mdio_bus_name(new_bus->id, np);
++ snprintf(new_bus->id, MII_BUS_ID_SIZE, "%x", res.start);
+
+ new_bus->irq = kmalloc(32 * sizeof(int), GFP_KERNEL);
+
+@@ -283,13 +283,3 @@
+ {
+ of_unregister_platform_driver(&uec_mdio_driver);
+ }
+-
+-void uec_mdio_bus_name(char *name, struct device_node *np)
+-{
+- const u32 *reg;
+-
+- reg = of_get_property(np, "reg", NULL);
+-
+- snprintf(name, MII_BUS_ID_SIZE, "%s@%x", np->name, reg ? *reg : 0);
+-}
+-
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/ucc_geth_mii.h linux-2.6.29-rc3.owrt/drivers/net/ucc_geth_mii.h
+--- linux-2.6.29.owrt/drivers/net/ucc_geth_mii.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/ucc_geth_mii.h 2009-05-10 23:48:29.000000000 +0200
+@@ -97,5 +97,4 @@
+ int uec_mdio_write(struct mii_bus *bus, int mii_id, int regnum, u16 value);
+ int __init uec_mdio_init(void);
+ void uec_mdio_exit(void);
+-void uec_mdio_bus_name(char *name, struct device_node *np);
+ #endif /* __UEC_MII_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/usb/asix.c linux-2.6.29-rc3.owrt/drivers/net/usb/asix.c
+--- linux-2.6.29.owrt/drivers/net/usb/asix.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/usb/asix.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1451,14 +1451,6 @@
+ // Cables-to-Go USB Ethernet Adapter
+ USB_DEVICE(0x0b95, 0x772a),
+ .driver_info = (unsigned long) &ax88772_info,
+-}, {
+- // ABOCOM for pci
+- USB_DEVICE(0x14ea, 0xab11),
+- .driver_info = (unsigned long) &ax88178_info,
+-}, {
+- // ASIX 88772a
+- USB_DEVICE(0x0db0, 0xa877),
+- .driver_info = (unsigned long) &ax88772_info,
+ },
+ { }, // END
+ };
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/usb/cdc_ether.c linux-2.6.29-rc3.owrt/drivers/net/usb/cdc_ether.c
+--- linux-2.6.29.owrt/drivers/net/usb/cdc_ether.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/usb/cdc_ether.c 2009-05-10 23:48:29.000000000 +0200
+@@ -559,11 +559,6 @@
+ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ETHERNET,
+ USB_CDC_PROTO_NONE),
+ .driver_info = (unsigned long) &cdc_info,
+-}, {
+- /* Ericsson F3507g */
+- USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1900, USB_CLASS_COMM,
+- USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
+- .driver_info = (unsigned long) &cdc_info,
+ },
+ { }, // END
+ };
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/usb/dm9601.c linux-2.6.29-rc3.owrt/drivers/net/usb/dm9601.c
+--- linux-2.6.29.owrt/drivers/net/usb/dm9601.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/usb/dm9601.c 2009-05-10 23:48:29.000000000 +0200
+@@ -635,10 +635,6 @@
+ USB_DEVICE(0x0a47, 0x9601), /* Hirose USB-100 */
+ .driver_info = (unsigned long)&dm9601_info,
+ },
+- {
+- USB_DEVICE(0x0fe6, 0x8101), /* DM9601 USB to Fast Ethernet Adapter */
+- .driver_info = (unsigned long)&dm9601_info,
+- },
+ {}, // END
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/usb/hso.c linux-2.6.29-rc3.owrt/drivers/net/usb/hso.c
+--- linux-2.6.29.owrt/drivers/net/usb/hso.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/usb/hso.c 2009-05-10 23:48:29.000000000 +0200
+@@ -455,7 +455,6 @@
+ {icon321_port_device(0x0af0, 0xd033)}, /* Icon-322 */
+ {USB_DEVICE(0x0af0, 0x7301)}, /* GE40x */
+ {USB_DEVICE(0x0af0, 0x7361)}, /* GE40x */
+- {USB_DEVICE(0x0af0, 0x7381)}, /* GE40x */
+ {USB_DEVICE(0x0af0, 0x7401)}, /* GI 0401 */
+ {USB_DEVICE(0x0af0, 0x7501)}, /* GTM 382 */
+ {USB_DEVICE(0x0af0, 0x7601)}, /* GE40x */
+@@ -463,8 +462,7 @@
+ {USB_DEVICE(0x0af0, 0x7801)},
+ {USB_DEVICE(0x0af0, 0x7901)},
+ {USB_DEVICE(0x0af0, 0x7361)},
+- {USB_DEVICE(0x0af0, 0xd057)},
+- {USB_DEVICE(0x0af0, 0xd055)},
++ {icon321_port_device(0x0af0, 0xd051)},
+ {}
+ };
+ MODULE_DEVICE_TABLE(usb, hso_ids);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/usb/usbnet.c linux-2.6.29-rc3.owrt/drivers/net/usb/usbnet.c
+--- linux-2.6.29.owrt/drivers/net/usb/usbnet.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/usb/usbnet.c 2009-05-10 23:48:29.000000000 +0200
+@@ -723,8 +723,8 @@
+ if (dev->mii.mdio_read)
+ return mii_link_ok(&dev->mii);
+
+- /* Otherwise, dtrt for drivers calling netif_carrier_{on,off} */
+- return ethtool_op_get_link(net);
++ /* Otherwise, say we're up (to avoid breaking scripts) */
++ return 1;
+ }
+ EXPORT_SYMBOL_GPL(usbnet_get_link);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/usb/zaurus.c linux-2.6.29-rc3.owrt/drivers/net/usb/zaurus.c
+--- linux-2.6.29.owrt/drivers/net/usb/zaurus.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/usb/zaurus.c 2009-05-10 23:48:29.000000000 +0200
+@@ -341,11 +341,6 @@
+ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM,
+ USB_CDC_PROTO_NONE),
+ .driver_info = (unsigned long) &bogus_mdlm_info,
+-}, {
+- /* Motorola MOTOMAGX phones */
+- USB_DEVICE_AND_INTERFACE_INFO(0x22b8, 0x6425, USB_CLASS_COMM,
+- USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
+- .driver_info = (unsigned long) &bogus_mdlm_info,
+ },
+
+ /* Olympus has some models with a Zaurus-compatible option.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/veth.c linux-2.6.29-rc3.owrt/drivers/net/veth.c
+--- linux-2.6.29.owrt/drivers/net/veth.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/veth.c 2009-05-10 23:48:29.000000000 +0200
+@@ -239,16 +239,6 @@
+ return 0;
+ }
+
+-static int veth_close(struct net_device *dev)
+-{
+- struct veth_priv *priv = netdev_priv(dev);
+-
+- netif_carrier_off(dev);
+- netif_carrier_off(priv->peer);
+-
+- return 0;
+-}
+-
+ static int veth_dev_init(struct net_device *dev)
+ {
+ struct veth_net_stats *stats;
+@@ -273,12 +263,10 @@
+ }
+
+ static const struct net_device_ops veth_netdev_ops = {
+- .ndo_init = veth_dev_init,
+- .ndo_open = veth_open,
+- .ndo_stop = veth_close,
+- .ndo_start_xmit = veth_xmit,
+- .ndo_get_stats = veth_get_stats,
+- .ndo_set_mac_address = eth_mac_addr,
++ .ndo_init = veth_dev_init,
++ .ndo_open = veth_open,
++ .ndo_start_xmit = veth_xmit,
++ .ndo_get_stats = veth_get_stats,
+ };
+
+ static void veth_setup(struct net_device *dev)
+@@ -291,6 +279,44 @@
+ dev->destructor = veth_dev_free;
+ }
+
++static void veth_change_state(struct net_device *dev)
++{
++ struct net_device *peer;
++ struct veth_priv *priv;
++
++ priv = netdev_priv(dev);
++ peer = priv->peer;
++
++ if (netif_carrier_ok(peer)) {
++ if (!netif_carrier_ok(dev))
++ netif_carrier_on(dev);
++ } else {
++ if (netif_carrier_ok(dev))
++ netif_carrier_off(dev);
++ }
++}
++
++static int veth_device_event(struct notifier_block *unused,
++ unsigned long event, void *ptr)
++{
++ struct net_device *dev = ptr;
++
++ if (dev->netdev_ops->ndo_open != veth_open)
++ goto out;
++
++ switch (event) {
++ case NETDEV_CHANGE:
++ veth_change_state(dev);
++ break;
++ }
++out:
++ return NOTIFY_DONE;
++}
++
++static struct notifier_block veth_notifier_block __read_mostly = {
++ .notifier_call = veth_device_event,
++};
++
+ /*
+ * netlink interface
+ */
+@@ -441,12 +467,14 @@
+
+ static __init int veth_init(void)
+ {
++ register_netdevice_notifier(&veth_notifier_block);
+ return rtnl_link_register(&veth_link_ops);
+ }
+
+ static __exit void veth_exit(void)
+ {
+ rtnl_link_unregister(&veth_link_ops);
++ unregister_netdevice_notifier(&veth_notifier_block);
+ }
+
+ module_init(veth_init);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/via-velocity.c linux-2.6.29-rc3.owrt/drivers/net/via-velocity.c
+--- linux-2.6.29.owrt/drivers/net/via-velocity.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/via-velocity.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1838,19 +1838,17 @@
+ {
+ struct sk_buff *skb = tdinfo->skb;
+ int i;
+- int pktlen;
+
+ /*
+ * Don't unmap the pre-allocated tx_bufs
+ */
+ if (tdinfo->skb_dma) {
+
+- pktlen = (skb->len > ETH_ZLEN ? : ETH_ZLEN);
+ for (i = 0; i < tdinfo->nskb_dma; i++) {
+ #ifdef VELOCITY_ZERO_COPY_SUPPORT
+ pci_unmap_single(vptr->pdev, tdinfo->skb_dma[i], le16_to_cpu(td->tdesc1.len), PCI_DMA_TODEVICE);
+ #else
+- pci_unmap_single(vptr->pdev, tdinfo->skb_dma[i], pktlen, PCI_DMA_TODEVICE);
++ pci_unmap_single(vptr->pdev, tdinfo->skb_dma[i], skb->len, PCI_DMA_TODEVICE);
+ #endif
+ tdinfo->skb_dma[i] = 0;
+ }
+@@ -2082,14 +2080,17 @@
+ struct tx_desc *td_ptr;
+ struct velocity_td_info *tdinfo;
+ unsigned long flags;
+- int pktlen;
++ int pktlen = skb->len;
+ __le16 len;
+ int index;
+
+
+- if (skb_padto(skb, ETH_ZLEN))
+- goto out;
+- pktlen = max_t(unsigned int, skb->len, ETH_ZLEN);
++
++ if (skb->len < ETH_ZLEN) {
++ if (skb_padto(skb, ETH_ZLEN))
++ goto out;
++ pktlen = ETH_ZLEN;
++ }
+
+ len = cpu_to_le16(pktlen);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/virtio_net.c linux-2.6.29-rc3.owrt/drivers/net/virtio_net.c
+--- linux-2.6.29.owrt/drivers/net/virtio_net.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/virtio_net.c 2009-05-10 23:48:29.000000000 +0200
+@@ -287,7 +287,7 @@
+ skb_put(skb, MAX_PACKET_LEN);
+
+ hdr = skb_vnet_hdr(skb);
+- sg_set_buf(sg, hdr, sizeof(*hdr));
++ sg_init_one(sg, hdr, sizeof(*hdr));
+
+ if (vi->big_packets) {
+ for (i = 0; i < MAX_SKB_FRAGS; i++) {
+@@ -488,9 +488,9 @@
+
+ /* Encode metadata header at front. */
+ if (vi->mergeable_rx_bufs)
+- sg_set_buf(sg, mhdr, sizeof(*mhdr));
++ sg_init_one(sg, mhdr, sizeof(*mhdr));
+ else
+- sg_set_buf(sg, hdr, sizeof(*hdr));
++ sg_init_one(sg, hdr, sizeof(*hdr));
+
+ num = skb_to_sgvec(skb, sg+1, 0, skb->len) + 1;
+
+@@ -612,7 +612,6 @@
+ .set_tx_csum = virtnet_set_tx_csum,
+ .set_sg = ethtool_op_set_sg,
+ .set_tso = ethtool_op_set_tso,
+- .get_link = ethtool_op_get_link,
+ };
+
+ #define MIN_MTU 68
+@@ -740,8 +739,6 @@
+ goto unregister;
+ }
+
+- netif_carrier_on(dev);
+-
+ pr_debug("virtnet: registered device %s\n", dev->name);
+ return 0;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wimax/i2400m/debugfs.c linux-2.6.29-rc3.owrt/drivers/net/wimax/i2400m/debugfs.c
+--- linux-2.6.29.owrt/drivers/net/wimax/i2400m/debugfs.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wimax/i2400m/debugfs.c 2009-05-10 23:48:29.000000000 +0200
+@@ -234,6 +234,20 @@
+ &fops_i2400m_reset);
+ }
+
++/*
++ * Debug levels control; see debug.h
++ */
++struct d_level D_LEVEL[] = {
++ D_SUBMODULE_DEFINE(control),
++ D_SUBMODULE_DEFINE(driver),
++ D_SUBMODULE_DEFINE(debugfs),
++ D_SUBMODULE_DEFINE(fw),
++ D_SUBMODULE_DEFINE(netdev),
++ D_SUBMODULE_DEFINE(rfkill),
++ D_SUBMODULE_DEFINE(rx),
++ D_SUBMODULE_DEFINE(tx),
++};
++size_t D_LEVEL_SIZE = ARRAY_SIZE(D_LEVEL);
+
+ #define __debugfs_register(prefix, name, parent) \
+ do { \
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wimax/i2400m/driver.c linux-2.6.29-rc3.owrt/drivers/net/wimax/i2400m/driver.c
+--- linux-2.6.29.owrt/drivers/net/wimax/i2400m/driver.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wimax/i2400m/driver.c 2009-05-10 23:48:29.000000000 +0200
+@@ -707,22 +707,6 @@
+ EXPORT_SYMBOL_GPL(i2400m_release);
+
+
+-/*
+- * Debug levels control; see debug.h
+- */
+-struct d_level D_LEVEL[] = {
+- D_SUBMODULE_DEFINE(control),
+- D_SUBMODULE_DEFINE(driver),
+- D_SUBMODULE_DEFINE(debugfs),
+- D_SUBMODULE_DEFINE(fw),
+- D_SUBMODULE_DEFINE(netdev),
+- D_SUBMODULE_DEFINE(rfkill),
+- D_SUBMODULE_DEFINE(rx),
+- D_SUBMODULE_DEFINE(tx),
+-};
+-size_t D_LEVEL_SIZE = ARRAY_SIZE(D_LEVEL);
+-
+-
+ static
+ int __init i2400m_driver_init(void)
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wimax/i2400m/i2400m.h linux-2.6.29-rc3.owrt/drivers/net/wimax/i2400m/i2400m.h
+--- linux-2.6.29.owrt/drivers/net/wimax/i2400m/i2400m.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wimax/i2400m/i2400m.h 2009-05-10 23:48:29.000000000 +0200
+@@ -157,7 +157,7 @@
+
+
+ /* Firmware version we request when pulling the fw image file */
+-#define I2400M_FW_VERSION "1.4"
++#define I2400M_FW_VERSION "1.3"
+
+
+ /**
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/ath5k/base.c linux-2.6.29-rc3.owrt/drivers/net/wireless/ath5k/base.c
+--- linux-2.6.29.owrt/drivers/net/wireless/ath5k/base.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/ath5k/base.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1028,8 +1028,6 @@
+ * it's done by reseting the chip. To accomplish this we must
+ * first cleanup any pending DMA, then restart stuff after a la
+ * ath5k_init.
+- *
+- * Called with sc->lock.
+ */
+ static int
+ ath5k_chan_set(struct ath5k_softc *sc, struct ieee80211_channel *chan)
+@@ -1098,42 +1096,6 @@
+ * Buffers setup *
+ \***************/
+
+-static
+-struct sk_buff *ath5k_rx_skb_alloc(struct ath5k_softc *sc, dma_addr_t *skb_addr)
+-{
+- struct sk_buff *skb;
+- unsigned int off;
+-
+- /*
+- * Allocate buffer with headroom_needed space for the
+- * fake physical layer header at the start.
+- */
+- skb = dev_alloc_skb(sc->rxbufsize + sc->cachelsz - 1);
+-
+- if (!skb) {
+- ATH5K_ERR(sc, "can't alloc skbuff of size %u\n",
+- sc->rxbufsize + sc->cachelsz - 1);
+- return NULL;
+- }
+- /*
+- * Cache-line-align. This is important (for the
+- * 5210 at least) as not doing so causes bogus data
+- * in rx'd frames.
+- */
+- off = ((unsigned long)skb->data) % sc->cachelsz;
+- if (off != 0)
+- skb_reserve(skb, sc->cachelsz - off);
+-
+- *skb_addr = pci_map_single(sc->pdev,
+- skb->data, sc->rxbufsize, PCI_DMA_FROMDEVICE);
+- if (unlikely(pci_dma_mapping_error(sc->pdev, *skb_addr))) {
+- ATH5K_ERR(sc, "%s: DMA mapping failed\n", __func__);
+- dev_kfree_skb(skb);
+- return NULL;
+- }
+- return skb;
+-}
+-
+ static int
+ ath5k_rxbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
+ {
+@@ -1141,11 +1103,37 @@
+ struct sk_buff *skb = bf->skb;
+ struct ath5k_desc *ds;
+
+- if (!skb) {
+- skb = ath5k_rx_skb_alloc(sc, &bf->skbaddr);
+- if (!skb)
++ if (likely(skb == NULL)) {
++ unsigned int off;
++
++ /*
++ * Allocate buffer with headroom_needed space for the
++ * fake physical layer header at the start.
++ */
++ skb = dev_alloc_skb(sc->rxbufsize + sc->cachelsz - 1);
++ if (unlikely(skb == NULL)) {
++ ATH5K_ERR(sc, "can't alloc skbuff of size %u\n",
++ sc->rxbufsize + sc->cachelsz - 1);
+ return -ENOMEM;
++ }
++ /*
++ * Cache-line-align. This is important (for the
++ * 5210 at least) as not doing so causes bogus data
++ * in rx'd frames.
++ */
++ off = ((unsigned long)skb->data) % sc->cachelsz;
++ if (off != 0)
++ skb_reserve(skb, sc->cachelsz - off);
++
+ bf->skb = skb;
++ bf->skbaddr = pci_map_single(sc->pdev,
++ skb->data, sc->rxbufsize, PCI_DMA_FROMDEVICE);
++ if (unlikely(pci_dma_mapping_error(sc->pdev, bf->skbaddr))) {
++ ATH5K_ERR(sc, "%s: DMA mapping failed\n", __func__);
++ dev_kfree_skb(skb);
++ bf->skb = NULL;
++ return -ENOMEM;
++ }
+ }
+
+ /*
+@@ -1674,8 +1662,7 @@
+ {
+ struct ieee80211_rx_status rxs = {};
+ struct ath5k_rx_status rs = {};
+- struct sk_buff *skb, *next_skb;
+- dma_addr_t next_skb_addr;
++ struct sk_buff *skb;
+ struct ath5k_softc *sc = (void *)data;
+ struct ath5k_buf *bf, *bf_last;
+ struct ath5k_desc *ds;
+@@ -1760,17 +1747,10 @@
+ goto next;
+ }
+ accept:
+- next_skb = ath5k_rx_skb_alloc(sc, &next_skb_addr);
+-
+- /*
+- * If we can't replace bf->skb with a new skb under memory
+- * pressure, just skip this packet
+- */
+- if (!next_skb)
+- goto next;
+-
+ pci_unmap_single(sc->pdev, bf->skbaddr, sc->rxbufsize,
+ PCI_DMA_FROMDEVICE);
++ bf->skb = NULL;
++
+ skb_put(skb, rs.rs_datalen);
+
+ /* The MAC header is padded to have 32-bit boundary if the
+@@ -1843,9 +1823,6 @@
+ ath5k_check_ibss_tsf(sc, skb, &rxs);
+
+ __ieee80211_rx(sc->hw, skb, &rxs);
+-
+- bf->skb = next_skb;
+- bf->skbaddr = next_skb_addr;
+ next:
+ list_move_tail(&bf->list, &sc->rxbuf);
+ } while (ath5k_rxbuf_setup(sc, bf) == 0);
+@@ -2837,17 +2814,11 @@
+ {
+ struct ath5k_softc *sc = hw->priv;
+ struct ieee80211_conf *conf = &hw->conf;
+- int ret;
+-
+- mutex_lock(&sc->lock);
+
+ sc->bintval = conf->beacon_int;
+ sc->power_level = conf->power_level;
+
+- ret = ath5k_chan_set(sc, conf->channel);
+-
+- mutex_unlock(&sc->lock);
+- return ret;
++ return ath5k_chan_set(sc, conf->channel);
+ }
+
+ static int
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/ath9k/ath9k.h linux-2.6.29-rc3.owrt/drivers/net/wireless/ath9k/ath9k.h
+--- linux-2.6.29.owrt/drivers/net/wireless/ath9k/ath9k.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/ath9k/ath9k.h 2009-05-10 23:48:29.000000000 +0200
+@@ -587,8 +587,8 @@
+ u8 iso[3];
+ };
+
+-#define REG_WRITE(_ah, _reg, _val) ath9k_iowrite32((_ah), (_reg), (_val))
+-#define REG_READ(_ah, _reg) ath9k_ioread32((_ah), (_reg))
++#define REG_WRITE(_ah, _reg, _val) iowrite32(_val, _ah->ah_sh + _reg)
++#define REG_READ(_ah, _reg) ioread32(_ah->ah_sh + _reg)
+
+ #define SM(_v, _f) (((_v) << _f##_S) & _f)
+ #define MS(_v, _f) (((_v) & _f) >> _f##_S)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/ath9k/core.h linux-2.6.29-rc3.owrt/drivers/net/wireless/ath9k/core.h
+--- linux-2.6.29.owrt/drivers/net/wireless/ath9k/core.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/ath9k/core.h 2009-05-10 23:48:29.000000000 +0200
+@@ -701,7 +701,6 @@
+ struct ath_hal *sc_ah;
+ void __iomem *mem;
+ spinlock_t sc_resetlock;
+- spinlock_t sc_serial_rw;
+ struct mutex mutex;
+
+ u8 sc_curbssid[ETH_ALEN];
+@@ -752,36 +751,4 @@
+ int ath_get_mac80211_qnum(u32 queue, struct ath_softc *sc);
+ int ath_cabq_update(struct ath_softc *);
+
+-/*
+- * Read and write, they both share the same lock. We do this to serialize
+- * reads and writes on Atheros 802.11n PCI devices only. This is required
+- * as the FIFO on these devices can only accept sanely 2 requests. After
+- * that the device goes bananas. Serializing the reads/writes prevents this
+- * from happening.
+- */
+-
+-static inline void ath9k_iowrite32(struct ath_hal *ah, u32 reg_offset, u32 val)
+-{
+- if (ah->ah_config.serialize_regmode == SER_REG_MODE_ON) {
+- unsigned long flags;
+- spin_lock_irqsave(&ah->ah_sc->sc_serial_rw, flags);
+- iowrite32(val, ah->ah_sc->mem + reg_offset);
+- spin_unlock_irqrestore(&ah->ah_sc->sc_serial_rw, flags);
+- } else
+- iowrite32(val, ah->ah_sc->mem + reg_offset);
+-}
+-
+-static inline unsigned int ath9k_ioread32(struct ath_hal *ah, u32 reg_offset)
+-{
+- u32 val;
+- if (ah->ah_config.serialize_regmode == SER_REG_MODE_ON) {
+- unsigned long flags;
+- spin_lock_irqsave(&ah->ah_sc->sc_serial_rw, flags);
+- val = ioread32(ah->ah_sc->mem + reg_offset);
+- spin_unlock_irqrestore(&ah->ah_sc->sc_serial_rw, flags);
+- } else
+- val = ioread32(ah->ah_sc->mem + reg_offset);
+- return val;
+-}
+-
+ #endif /* CORE_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/ath9k/hw.c linux-2.6.29-rc3.owrt/drivers/net/wireless/ath9k/hw.c
+--- linux-2.6.29.owrt/drivers/net/wireless/ath9k/hw.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/ath9k/hw.c 2009-05-10 23:48:29.000000000 +0200
+@@ -437,25 +437,6 @@
+ }
+
+ ah->ah_config.intr_mitigation = 1;
+-
+- /*
+- * We need this for PCI devices only (Cardbus, PCI, miniPCI)
+- * _and_ if on non-uniprocessor systems (Multiprocessor/HT).
+- * This means we use it for all AR5416 devices, and the few
+- * minor PCI AR9280 devices out there.
+- *
+- * Serialization is required because these devices do not handle
+- * well the case of two concurrent reads/writes due to the latency
+- * involved. During one read/write another read/write can be issued
+- * on another CPU while the previous read/write may still be working
+- * on our hardware, if we hit this case the hardware poops in a loop.
+- * We prevent this by serializing reads and writes.
+- *
+- * This issue is not present on PCI-Express devices or pre-AR5416
+- * devices (legacy, 802.11abg).
+- */
+- if (num_possible_cpus() > 1)
+- ah->ah_config.serialize_regmode = SER_REG_MODE_AUTO;
+ }
+
+ static struct ath_hal_5416 *ath9k_hw_newstate(u16 devid,
+@@ -687,8 +668,7 @@
+ }
+
+ if (ah->ah_config.serialize_regmode == SER_REG_MODE_AUTO) {
+- if (ah->ah_macVersion == AR_SREV_VERSION_5416_PCI ||
+- (AR_SREV_9280(ah) && !ah->ah_isPciExpress)) {
++ if (ah->ah_macVersion == AR_SREV_VERSION_5416_PCI) {
+ ah->ah_config.serialize_regmode =
+ SER_REG_MODE_ON;
+ } else {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/ath9k/main.c linux-2.6.29-rc3.owrt/drivers/net/wireless/ath9k/main.c
+--- linux-2.6.29.owrt/drivers/net/wireless/ath9k/main.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/ath9k/main.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1336,7 +1336,6 @@
+ printk(KERN_ERR "Unable to create debugfs files\n");
+
+ spin_lock_init(&sc->sc_resetlock);
+- spin_lock_init(&sc->sc_serial_rw);
+ mutex_init(&sc->mutex);
+ tasklet_init(&sc->intr_tq, ath9k_tasklet, (unsigned long)sc);
+ tasklet_init(&sc->bcon_tasklet, ath9k_beacon_tasklet,
+@@ -1539,7 +1538,6 @@
+ bad:
+ if (ah)
+ ath9k_hw_detach(ah);
+- ath9k_exit_debug(sc);
+
+ return error;
+ }
+@@ -1547,7 +1545,7 @@
+ static int ath_attach(u16 devid, struct ath_softc *sc)
+ {
+ struct ieee80211_hw *hw = sc->hw;
+- int error = 0, i;
++ int error = 0;
+
+ DPRINTF(sc, ATH_DBG_CONFIG, "Attach ATH hw\n");
+
+@@ -1591,11 +1589,11 @@
+ /* initialize tx/rx engine */
+ error = ath_tx_init(sc, ATH_TXBUF);
+ if (error != 0)
+- goto error_attach;
++ goto detach;
+
+ error = ath_rx_init(sc, ATH_RXBUF);
+ if (error != 0)
+- goto error_attach;
++ goto detach;
+
+ #if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
+ /* Initialze h/w Rfkill */
+@@ -1603,9 +1601,8 @@
+ INIT_DELAYED_WORK(&sc->rf_kill.rfkill_poll, ath_rfkill_poll);
+
+ /* Initialize s/w rfkill */
+- error = ath_init_sw_rfkill(sc);
+- if (error)
+- goto error_attach;
++ if (ath_init_sw_rfkill(sc))
++ goto detach;
+ #endif
+
+ error = ieee80211_register_hw(hw);
+@@ -1614,16 +1611,8 @@
+ ath_init_leds(sc);
+
+ return 0;
+-
+-error_attach:
+- /* cleanup tx queues */
+- for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++)
+- if (ATH_TXQ_SETUP(sc, i))
+- ath_tx_cleanupq(sc, &sc->tx.txq[i]);
+-
+- ath9k_hw_detach(sc->sc_ah);
+- ath9k_exit_debug(sc);
+-
++detach:
++ ath_detach(sc);
+ return error;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/iwlwifi/iwl3945-base.c linux-2.6.29-rc3.owrt/drivers/net/wireless/iwlwifi/iwl3945-base.c
+--- linux-2.6.29.owrt/drivers/net/wireless/iwlwifi/iwl3945-base.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/iwlwifi/iwl3945-base.c 2009-05-10 23:48:29.000000000 +0200
+@@ -7911,7 +7911,7 @@
+ CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000);
+ if (err < 0) {
+ IWL_DEBUG_INFO("Failed to init the card\n");
+- goto out_iounmap;
++ goto out_remove_sysfs;
+ }
+
+ /***********************
+@@ -7921,7 +7921,7 @@
+ err = iwl3945_eeprom_init(priv);
+ if (err) {
+ IWL_ERROR("Unable to init EEPROM\n");
+- goto out_iounmap;
++ goto out_remove_sysfs;
+ }
+ /* MAC Address location in EEPROM same for 3945/4965 */
+ get_eeprom_mac(priv, priv->mac_addr);
+@@ -7975,7 +7975,7 @@
+ err = iwl3945_init_channel_map(priv);
+ if (err) {
+ IWL_ERROR("initializing regulatory failed: %d\n", err);
+- goto out_unset_hw_setting;
++ goto out_release_irq;
+ }
+
+ err = iwl3945_init_geos(priv);
+@@ -8045,22 +8045,25 @@
+ return 0;
+
+ out_remove_sysfs:
+- destroy_workqueue(priv->workqueue);
+- priv->workqueue = NULL;
+ sysfs_remove_group(&pdev->dev.kobj, &iwl3945_attribute_group);
+ out_free_geos:
+ iwl3945_free_geos(priv);
+ out_free_channel_map:
+ iwl3945_free_channel_map(priv);
+- out_unset_hw_setting:
++
++
++ out_release_irq:
++ destroy_workqueue(priv->workqueue);
++ priv->workqueue = NULL;
+ iwl3945_unset_hw_setting(priv);
++
+ out_iounmap:
+ pci_iounmap(pdev, priv->hw_base);
+ out_pci_release_regions:
+ pci_release_regions(pdev);
+ out_pci_disable_device:
+- pci_set_drvdata(pdev, NULL);
+ pci_disable_device(pdev);
++ pci_set_drvdata(pdev, NULL);
+ out_ieee80211_free_hw:
+ ieee80211_free_hw(priv->hw);
+ out:
+@@ -8140,19 +8143,6 @@
+ priv->is_open = 1;
+ }
+
+- /* pci driver assumes state will be saved in this function.
+- * pci state is saved and device disabled when interface is
+- * stopped, so at this time pci device will always be disabled -
+- * whether interface was started or not. saving pci state now will
+- * cause saved state be that of a disabled device, which will cause
+- * problems during resume in that we will end up with a disabled device.
+- *
+- * indicate that the current saved state (from when interface was
+- * stopped) is valid. if interface was never up at time of suspend
+- * then the saved state will still be valid as it was saved during
+- * .probe. */
+- pdev->state_saved = true;
+-
+ pci_set_power_state(pdev, PCI_D3hot);
+
+ return 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/iwlwifi/iwl-agn.c linux-2.6.29-rc3.owrt/drivers/net/wireless/iwlwifi/iwl-agn.c
+--- linux-2.6.29.owrt/drivers/net/wireless/iwlwifi/iwl-agn.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/iwlwifi/iwl-agn.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1719,10 +1719,6 @@
+ priv->ucode_data_backup.len = data_size;
+ iwl_alloc_fw_desc(priv->pci_dev, &priv->ucode_data_backup);
+
+- if (!priv->ucode_code.v_addr || !priv->ucode_data.v_addr ||
+- !priv->ucode_data_backup.v_addr)
+- goto err_pci_alloc;
+-
+ /* Initialization instructions and data */
+ if (init_size && init_data_size) {
+ priv->ucode_init.len = init_size;
+@@ -3868,7 +3864,7 @@
+ }
+ err = iwl_eeprom_check_version(priv);
+ if (err)
+- goto out_free_eeprom;
++ goto out_iounmap;
+
+ /* extract MAC Address */
+ iwl_eeprom_get_mac(priv, priv->mac_addr);
+@@ -3945,8 +3941,6 @@
+ return 0;
+
+ out_remove_sysfs:
+- destroy_workqueue(priv->workqueue);
+- priv->workqueue = NULL;
+ sysfs_remove_group(&pdev->dev.kobj, &iwl_attribute_group);
+ out_uninit_drv:
+ iwl_uninit_drv(priv);
+@@ -3955,8 +3949,8 @@
+ out_iounmap:
+ pci_iounmap(pdev, priv->hw_base);
+ out_pci_release_regions:
+- pci_set_drvdata(pdev, NULL);
+ pci_release_regions(pdev);
++ pci_set_drvdata(pdev, NULL);
+ out_pci_disable_device:
+ pci_disable_device(pdev);
+ out_ieee80211_free_hw:
+@@ -4044,19 +4038,6 @@
+ priv->is_open = 1;
+ }
+
+- /* pci driver assumes state will be saved in this function.
+- * pci state is saved and device disabled when interface is
+- * stopped, so at this time pci device will always be disabled -
+- * whether interface was started or not. saving pci state now will
+- * cause saved state be that of a disabled device, which will cause
+- * problems during resume in that we will end up with a disabled device.
+- *
+- * indicate that the current saved state (from when interface was
+- * stopped) is valid. if interface was never up at time of suspend
+- * then the saved state will still be valid as it was saved during
+- * .probe. */
+- pdev->state_saved = true;
+-
+ pci_set_power_state(pdev, PCI_D3hot);
+
+ return 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/iwlwifi/iwl-sta.c linux-2.6.29-rc3.owrt/drivers/net/wireless/iwlwifi/iwl-sta.c
+--- linux-2.6.29.owrt/drivers/net/wireless/iwlwifi/iwl-sta.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/iwlwifi/iwl-sta.c 2009-05-10 23:48:29.000000000 +0200
+@@ -480,9 +480,6 @@
+ priv->num_stations = 0;
+ memset(priv->stations, 0, sizeof(priv->stations));
+
+- /* clean ucode key table bit map */
+- priv->ucode_key_table = 0;
+-
+ spin_unlock_irqrestore(&priv->sta_lock, flags);
+ }
+ EXPORT_SYMBOL(iwl_clear_stations_table);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/iwlwifi/iwl-tx.c linux-2.6.29-rc3.owrt/drivers/net/wireless/iwlwifi/iwl-tx.c
+--- linux-2.6.29.owrt/drivers/net/wireless/iwlwifi/iwl-tx.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/iwlwifi/iwl-tx.c 2009-05-10 23:48:29.000000000 +0200
+@@ -148,7 +148,7 @@
+ pci_unmap_single(dev,
+ pci_unmap_addr(&txq->cmd[index]->meta, mapping),
+ pci_unmap_len(&txq->cmd[index]->meta, len),
+- PCI_DMA_BIDIRECTIONAL);
++ PCI_DMA_TODEVICE);
+
+ /* Unmap chunks, if any. */
+ for (i = 1; i < num_tbs; i++) {
+@@ -964,7 +964,7 @@
+ * within command buffer array. */
+ txcmd_phys = pci_map_single(priv->pci_dev,
+ out_cmd, sizeof(struct iwl_cmd),
+- PCI_DMA_BIDIRECTIONAL);
++ PCI_DMA_TODEVICE);
+ pci_unmap_addr_set(&out_cmd->meta, mapping, txcmd_phys);
+ pci_unmap_len_set(&out_cmd->meta, len, sizeof(struct iwl_cmd));
+ /* Add buffer containing Tx command and MAC(!) header to TFD's
+@@ -1115,7 +1115,7 @@
+ IWL_MAX_SCAN_SIZE : sizeof(struct iwl_cmd);
+
+ phys_addr = pci_map_single(priv->pci_dev, out_cmd,
+- len, PCI_DMA_BIDIRECTIONAL);
++ len, PCI_DMA_TODEVICE);
+ pci_unmap_addr_set(&out_cmd->meta, mapping, phys_addr);
+ pci_unmap_len_set(&out_cmd->meta, len, len);
+ phys_addr += offsetof(struct iwl_cmd, hdr);
+@@ -1212,7 +1212,7 @@
+ pci_unmap_single(priv->pci_dev,
+ pci_unmap_addr(&txq->cmd[cmd_idx]->meta, mapping),
+ pci_unmap_len(&txq->cmd[cmd_idx]->meta, len),
+- PCI_DMA_BIDIRECTIONAL);
++ PCI_DMA_TODEVICE);
+
+ for (idx = iwl_queue_inc_wrap(idx, q->n_bd); q->read_ptr != idx;
+ q->read_ptr = iwl_queue_inc_wrap(q->read_ptr, q->n_bd)) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/libertas/ethtool.c linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/ethtool.c
+--- linux-2.6.29.owrt/drivers/net/wireless/libertas/ethtool.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/ethtool.c 2009-05-10 23:48:29.000000000 +0200
+@@ -23,7 +23,7 @@
+ static void lbs_ethtool_get_drvinfo(struct net_device *dev,
+ struct ethtool_drvinfo *info)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+
+ snprintf(info->fw_version, 32, "%u.%u.%u.p%u",
+ priv->fwrelease >> 24 & 0xff,
+@@ -47,7 +47,7 @@
+ static int lbs_ethtool_get_eeprom(struct net_device *dev,
+ struct ethtool_eeprom *eeprom, u8 * bytes)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ struct cmd_ds_802_11_eeprom_access cmd;
+ int ret;
+
+@@ -76,7 +76,7 @@
+ static void lbs_ethtool_get_stats(struct net_device *dev,
+ struct ethtool_stats *stats, uint64_t *data)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ struct cmd_ds_mesh_access mesh_access;
+ int ret;
+
+@@ -113,7 +113,7 @@
+
+ static int lbs_ethtool_get_sset_count(struct net_device *dev, int sset)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+
+ if (sset == ETH_SS_STATS && dev == priv->mesh_dev)
+ return MESH_STATS_NUM;
+@@ -143,7 +143,7 @@
+ static void lbs_ethtool_get_wol(struct net_device *dev,
+ struct ethtool_wolinfo *wol)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+
+ if (priv->wol_criteria == 0xffffffff) {
+ /* Interface driver didn't configure wake */
+@@ -166,7 +166,7 @@
+ static int lbs_ethtool_set_wol(struct net_device *dev,
+ struct ethtool_wolinfo *wol)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ uint32_t criteria = 0;
+
+ if (priv->wol_criteria == 0xffffffff && wol->wolopts)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/libertas/if_usb.c linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/if_usb.c
+--- linux-2.6.29.owrt/drivers/net/wireless/libertas/if_usb.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/if_usb.c 2009-05-10 23:48:29.000000000 +0200
+@@ -59,7 +59,7 @@
+ static ssize_t if_usb_firmware_set(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+ {
+- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
++ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
+ struct if_usb_card *cardp = priv->card;
+ char fwname[FIRMWARE_NAME_MAX];
+ int ret;
+@@ -86,7 +86,7 @@
+ static ssize_t if_usb_boot2_set(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+ {
+- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
++ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
+ struct if_usb_card *cardp = priv->card;
+ char fwname[FIRMWARE_NAME_MAX];
+ int ret;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/libertas/main.c linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/main.c
+--- linux-2.6.29.owrt/drivers/net/wireless/libertas/main.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/main.c 2009-05-10 23:48:29.000000000 +0200
+@@ -222,7 +222,7 @@
+ static ssize_t lbs_anycast_get(struct device *dev,
+ struct device_attribute *attr, char * buf)
+ {
+- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
++ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
+ struct cmd_ds_mesh_access mesh_access;
+ int ret;
+
+@@ -241,7 +241,7 @@
+ static ssize_t lbs_anycast_set(struct device *dev,
+ struct device_attribute *attr, const char * buf, size_t count)
+ {
+- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
++ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
+ struct cmd_ds_mesh_access mesh_access;
+ uint32_t datum;
+ int ret;
+@@ -263,7 +263,7 @@
+ static ssize_t lbs_prb_rsp_limit_get(struct device *dev,
+ struct device_attribute *attr, char *buf)
+ {
+- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
++ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
+ struct cmd_ds_mesh_access mesh_access;
+ int ret;
+ u32 retry_limit;
+@@ -286,7 +286,7 @@
+ static ssize_t lbs_prb_rsp_limit_set(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+ {
+- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
++ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
+ struct cmd_ds_mesh_access mesh_access;
+ int ret;
+ unsigned long retry_limit;
+@@ -321,7 +321,7 @@
+ static ssize_t lbs_rtap_get(struct device *dev,
+ struct device_attribute *attr, char * buf)
+ {
+- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
++ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
+ return snprintf(buf, 5, "0x%X\n", priv->monitormode);
+ }
+
+@@ -332,7 +332,7 @@
+ struct device_attribute *attr, const char * buf, size_t count)
+ {
+ int monitor_mode;
+- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
++ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
+
+ sscanf(buf, "%x", &monitor_mode);
+ if (monitor_mode) {
+@@ -383,7 +383,7 @@
+ static ssize_t lbs_mesh_get(struct device *dev,
+ struct device_attribute *attr, char * buf)
+ {
+- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
++ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
+ return snprintf(buf, 5, "0x%X\n", !!priv->mesh_dev);
+ }
+
+@@ -393,7 +393,7 @@
+ static ssize_t lbs_mesh_set(struct device *dev,
+ struct device_attribute *attr, const char * buf, size_t count)
+ {
+- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
++ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
+ int enable;
+ int ret, action = CMD_ACT_MESH_CONFIG_STOP;
+
+@@ -452,7 +452,7 @@
+ */
+ static int lbs_dev_open(struct net_device *dev)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev) ;
+ int ret = 0;
+
+ lbs_deb_enter(LBS_DEB_NET);
+@@ -521,7 +521,7 @@
+ */
+ static int lbs_eth_stop(struct net_device *dev)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+
+ lbs_deb_enter(LBS_DEB_NET);
+
+@@ -538,7 +538,7 @@
+
+ static void lbs_tx_timeout(struct net_device *dev)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+
+ lbs_deb_enter(LBS_DEB_TX);
+
+@@ -590,7 +590,7 @@
+ */
+ static struct net_device_stats *lbs_get_stats(struct net_device *dev)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+
+ lbs_deb_enter(LBS_DEB_NET);
+ return &priv->stats;
+@@ -599,7 +599,7 @@
+ static int lbs_set_mac_address(struct net_device *dev, void *addr)
+ {
+ int ret = 0;
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ struct sockaddr *phwaddr = addr;
+ struct cmd_ds_802_11_mac_address cmd;
+
+@@ -732,7 +732,7 @@
+
+ static void lbs_set_multicast_list(struct net_device *dev)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+
+ schedule_work(&priv->mcast_work);
+ }
+@@ -748,7 +748,7 @@
+ static int lbs_thread(void *data)
+ {
+ struct net_device *dev = data;
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ wait_queue_t wait;
+
+ lbs_deb_enter(LBS_DEB_THREAD);
+@@ -1184,7 +1184,6 @@
+ goto done;
+ }
+ priv = netdev_priv(dev);
+- dev->ml_priv = priv;
+
+ if (lbs_init_adapter(priv)) {
+ lbs_pr_err("failed to initialize adapter structure.\n");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/libertas/persistcfg.c linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/persistcfg.c
+--- linux-2.6.29.owrt/drivers/net/wireless/libertas/persistcfg.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/persistcfg.c 2009-05-10 23:48:29.000000000 +0200
+@@ -18,7 +18,7 @@
+ static int mesh_get_default_parameters(struct device *dev,
+ struct mrvl_mesh_defaults *defs)
+ {
+- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
++ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
+ struct cmd_ds_mesh_config cmd;
+ int ret;
+
+@@ -57,7 +57,7 @@
+ static ssize_t bootflag_set(struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
++ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
+ struct cmd_ds_mesh_config cmd;
+ uint32_t datum;
+ int ret;
+@@ -100,7 +100,7 @@
+ static ssize_t boottime_set(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+ {
+- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
++ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
+ struct cmd_ds_mesh_config cmd;
+ uint32_t datum;
+ int ret;
+@@ -152,7 +152,7 @@
+ static ssize_t channel_set(struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+ {
+- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
++ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
+ struct cmd_ds_mesh_config cmd;
+ uint32_t datum;
+ int ret;
+@@ -210,7 +210,7 @@
+ struct cmd_ds_mesh_config cmd;
+ struct mrvl_mesh_defaults defs;
+ struct mrvl_meshie *ie;
+- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
++ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
+ int len;
+ int ret;
+
+@@ -269,7 +269,7 @@
+ struct cmd_ds_mesh_config cmd;
+ struct mrvl_mesh_defaults defs;
+ struct mrvl_meshie *ie;
+- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
++ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
+ uint32_t datum;
+ int ret;
+
+@@ -323,7 +323,7 @@
+ struct cmd_ds_mesh_config cmd;
+ struct mrvl_mesh_defaults defs;
+ struct mrvl_meshie *ie;
+- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
++ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
+ uint32_t datum;
+ int ret;
+
+@@ -377,7 +377,7 @@
+ struct cmd_ds_mesh_config cmd;
+ struct mrvl_mesh_defaults defs;
+ struct mrvl_meshie *ie;
+- struct lbs_private *priv = to_net_dev(dev)->ml_priv;
++ struct lbs_private *priv = netdev_priv(to_net_dev(dev));
+ uint32_t datum;
+ int ret;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/libertas/scan.c linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/scan.c
+--- linux-2.6.29.owrt/drivers/net/wireless/libertas/scan.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/scan.c 2009-05-10 23:48:29.000000000 +0200
+@@ -945,7 +945,7 @@
+ union iwreq_data *wrqu, char *extra)
+ {
+ DECLARE_SSID_BUF(ssid);
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ int ret = 0;
+
+ lbs_deb_enter(LBS_DEB_WEXT);
+@@ -1008,7 +1008,7 @@
+ struct iw_point *dwrq, char *extra)
+ {
+ #define SCAN_ITEM_SIZE 128
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ int err = 0;
+ char *ev = extra;
+ char *stop = ev + dwrq->length;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/libertas/tx.c linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/tx.c
+--- linux-2.6.29.owrt/drivers/net/wireless/libertas/tx.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/tx.c 2009-05-10 23:48:29.000000000 +0200
+@@ -60,7 +60,7 @@
+ int lbs_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
+ {
+ unsigned long flags;
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ struct txpd *txpd;
+ char *p802x_hdr;
+ uint16_t pkt_len;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/libertas/wext.c linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/wext.c
+--- linux-2.6.29.owrt/drivers/net/wireless/libertas/wext.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/wext.c 2009-05-10 23:48:29.000000000 +0200
+@@ -163,7 +163,7 @@
+ static int lbs_get_freq(struct net_device *dev, struct iw_request_info *info,
+ struct iw_freq *fwrq, char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ struct chan_freq_power *cfp;
+
+ lbs_deb_enter(LBS_DEB_WEXT);
+@@ -189,7 +189,7 @@
+ static int lbs_get_wap(struct net_device *dev, struct iw_request_info *info,
+ struct sockaddr *awrq, char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+
+ lbs_deb_enter(LBS_DEB_WEXT);
+
+@@ -207,7 +207,7 @@
+ static int lbs_set_nick(struct net_device *dev, struct iw_request_info *info,
+ struct iw_point *dwrq, char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+
+ lbs_deb_enter(LBS_DEB_WEXT);
+
+@@ -231,7 +231,7 @@
+ static int lbs_get_nick(struct net_device *dev, struct iw_request_info *info,
+ struct iw_point *dwrq, char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+
+ lbs_deb_enter(LBS_DEB_WEXT);
+
+@@ -248,7 +248,7 @@
+ static int mesh_get_nick(struct net_device *dev, struct iw_request_info *info,
+ struct iw_point *dwrq, char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+
+ lbs_deb_enter(LBS_DEB_WEXT);
+
+@@ -273,7 +273,7 @@
+ struct iw_param *vwrq, char *extra)
+ {
+ int ret = 0;
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ u32 val = vwrq->value;
+
+ lbs_deb_enter(LBS_DEB_WEXT);
+@@ -293,7 +293,7 @@
+ static int lbs_get_rts(struct net_device *dev, struct iw_request_info *info,
+ struct iw_param *vwrq, char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ int ret = 0;
+ u16 val = 0;
+
+@@ -315,7 +315,7 @@
+ static int lbs_set_frag(struct net_device *dev, struct iw_request_info *info,
+ struct iw_param *vwrq, char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ int ret = 0;
+ u32 val = vwrq->value;
+
+@@ -336,7 +336,7 @@
+ static int lbs_get_frag(struct net_device *dev, struct iw_request_info *info,
+ struct iw_param *vwrq, char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ int ret = 0;
+ u16 val = 0;
+
+@@ -359,7 +359,7 @@
+ static int lbs_get_mode(struct net_device *dev,
+ struct iw_request_info *info, u32 * uwrq, char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+
+ lbs_deb_enter(LBS_DEB_WEXT);
+
+@@ -385,7 +385,7 @@
+ struct iw_request_info *info,
+ struct iw_param *vwrq, char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ s16 curlevel = 0;
+ int ret = 0;
+
+@@ -418,7 +418,7 @@
+ static int lbs_set_retry(struct net_device *dev, struct iw_request_info *info,
+ struct iw_param *vwrq, char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ int ret = 0;
+ u16 slimit = 0, llimit = 0;
+
+@@ -466,7 +466,7 @@
+ static int lbs_get_retry(struct net_device *dev, struct iw_request_info *info,
+ struct iw_param *vwrq, char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ int ret = 0;
+ u16 val = 0;
+
+@@ -542,7 +542,7 @@
+ struct iw_point *dwrq, char *extra)
+ {
+ int i, j;
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ struct iw_range *range = (struct iw_range *)extra;
+ struct chan_freq_power *cfp;
+ u8 rates[MAX_RATES + 1];
+@@ -708,7 +708,7 @@
+ static int lbs_set_power(struct net_device *dev, struct iw_request_info *info,
+ struct iw_param *vwrq, char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+
+ lbs_deb_enter(LBS_DEB_WEXT);
+
+@@ -758,7 +758,7 @@
+ static int lbs_get_power(struct net_device *dev, struct iw_request_info *info,
+ struct iw_param *vwrq, char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+
+ lbs_deb_enter(LBS_DEB_WEXT);
+
+@@ -781,7 +781,7 @@
+ EXCELLENT = 95,
+ PERFECT = 100
+ };
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ u32 rssi_qual;
+ u32 tx_qual;
+ u32 quality = 0;
+@@ -886,7 +886,7 @@
+ struct iw_freq *fwrq, char *extra)
+ {
+ int ret = -EINVAL;
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ struct chan_freq_power *cfp;
+ struct assoc_request * assoc_req;
+
+@@ -943,7 +943,7 @@
+ struct iw_request_info *info,
+ struct iw_freq *fwrq, char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ struct chan_freq_power *cfp;
+ int ret = -EINVAL;
+
+@@ -994,7 +994,7 @@
+ static int lbs_set_rate(struct net_device *dev, struct iw_request_info *info,
+ struct iw_param *vwrq, char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ u8 new_rate = 0;
+ int ret = -EINVAL;
+ u8 rates[MAX_RATES + 1];
+@@ -1054,7 +1054,7 @@
+ static int lbs_get_rate(struct net_device *dev, struct iw_request_info *info,
+ struct iw_param *vwrq, char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+
+ lbs_deb_enter(LBS_DEB_WEXT);
+
+@@ -1079,7 +1079,7 @@
+ struct iw_request_info *info, u32 * uwrq, char *extra)
+ {
+ int ret = 0;
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ struct assoc_request * assoc_req;
+
+ lbs_deb_enter(LBS_DEB_WEXT);
+@@ -1124,7 +1124,7 @@
+ struct iw_request_info *info,
+ struct iw_point *dwrq, u8 * extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ int index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
+
+ lbs_deb_enter(LBS_DEB_WEXT);
+@@ -1319,7 +1319,7 @@
+ struct iw_point *dwrq, char *extra)
+ {
+ int ret = 0;
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ struct assoc_request * assoc_req;
+ u16 is_default = 0, index = 0, set_tx_key = 0;
+
+@@ -1395,7 +1395,7 @@
+ char *extra)
+ {
+ int ret = -EINVAL;
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
+ int index, max_key_len;
+
+@@ -1501,7 +1501,7 @@
+ char *extra)
+ {
+ int ret = 0;
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
+ int alg = ext->alg;
+ struct assoc_request * assoc_req;
+@@ -1639,7 +1639,7 @@
+ struct iw_point *dwrq,
+ char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ int ret = 0;
+ struct assoc_request * assoc_req;
+
+@@ -1685,7 +1685,7 @@
+ char *extra)
+ {
+ int ret = 0;
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+
+ lbs_deb_enter(LBS_DEB_WEXT);
+
+@@ -1713,7 +1713,7 @@
+ struct iw_param *dwrq,
+ char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ struct assoc_request * assoc_req;
+ int ret = 0;
+ int updated = 0;
+@@ -1816,7 +1816,7 @@
+ char *extra)
+ {
+ int ret = 0;
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+
+ lbs_deb_enter(LBS_DEB_WEXT);
+
+@@ -1857,7 +1857,7 @@
+ struct iw_param *vwrq, char *extra)
+ {
+ int ret = 0;
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ s16 dbm = (s16) vwrq->value;
+
+ lbs_deb_enter(LBS_DEB_WEXT);
+@@ -1936,7 +1936,7 @@
+ static int lbs_get_essid(struct net_device *dev, struct iw_request_info *info,
+ struct iw_point *dwrq, char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+
+ lbs_deb_enter(LBS_DEB_WEXT);
+
+@@ -1971,7 +1971,7 @@
+ static int lbs_set_essid(struct net_device *dev, struct iw_request_info *info,
+ struct iw_point *dwrq, char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ int ret = 0;
+ u8 ssid[IW_ESSID_MAX_SIZE];
+ u8 ssid_len = 0;
+@@ -2040,7 +2040,7 @@
+ struct iw_request_info *info,
+ struct iw_point *dwrq, char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+
+ lbs_deb_enter(LBS_DEB_WEXT);
+
+@@ -2058,7 +2058,7 @@
+ struct iw_request_info *info,
+ struct iw_point *dwrq, char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ int ret = 0;
+
+ lbs_deb_enter(LBS_DEB_WEXT);
+@@ -2102,7 +2102,7 @@
+ static int lbs_set_wap(struct net_device *dev, struct iw_request_info *info,
+ struct sockaddr *awrq, char *extra)
+ {
+- struct lbs_private *priv = dev->ml_priv;
++ struct lbs_private *priv = netdev_priv(dev);
+ struct assoc_request * assoc_req;
+ int ret = 0;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/orinoco/orinoco.c linux-2.6.29-rc3.owrt/drivers/net/wireless/orinoco/orinoco.c
+--- linux-2.6.29.owrt/drivers/net/wireless/orinoco/orinoco.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/orinoco/orinoco.c 2009-05-10 23:48:29.000000000 +0200
+@@ -3157,20 +3157,8 @@
+
+ return NOTIFY_DONE;
+ }
+-
+-static void orinoco_register_pm_notifier(struct orinoco_private *priv)
+-{
+- priv->pm_notifier.notifier_call = orinoco_pm_notifier;
+- register_pm_notifier(&priv->pm_notifier);
+-}
+-
+-static void orinoco_unregister_pm_notifier(struct orinoco_private *priv)
+-{
+- unregister_pm_notifier(&priv->pm_notifier);
+-}
+ #else /* !PM_SLEEP || HERMES_CACHE_FW_ON_INIT */
+-#define orinoco_register_pm_notifier(priv) do { } while(0)
+-#define orinoco_unregister_pm_notifier(priv) do { } while(0)
++#define orinoco_pm_notifier NULL
+ #endif
+
+ /********************************************************************/
+@@ -3660,7 +3648,8 @@
+ priv->cached_fw = NULL;
+
+ /* Register PM notifiers */
+- orinoco_register_pm_notifier(priv);
++ priv->pm_notifier.notifier_call = orinoco_pm_notifier;
++ register_pm_notifier(&priv->pm_notifier);
+
+ return dev;
+ }
+@@ -3684,7 +3673,7 @@
+ kfree(rx_data);
+ }
+
+- orinoco_unregister_pm_notifier(priv);
++ unregister_pm_notifier(&priv->pm_notifier);
+ orinoco_uncache_fw(priv);
+
+ priv->wpa_ie_len = 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/p54/p54common.c linux-2.6.29-rc3.owrt/drivers/net/wireless/p54/p54common.c
+--- linux-2.6.29.owrt/drivers/net/wireless/p54/p54common.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/p54/p54common.c 2009-05-10 23:48:29.000000000 +0200
+@@ -710,11 +710,10 @@
+ __le32 req_id)
+ {
+ struct p54_common *priv = dev->priv;
+- struct sk_buff *entry;
++ struct sk_buff *entry = priv->tx_queue.next;
+ unsigned long flags;
+
+ spin_lock_irqsave(&priv->tx_queue.lock, flags);
+- entry = priv->tx_queue.next;
+ while (entry != (struct sk_buff *)&priv->tx_queue) {
+ struct p54_hdr *hdr = (struct p54_hdr *) entry->data;
+
+@@ -733,7 +732,7 @@
+ struct p54_common *priv = dev->priv;
+ struct p54_hdr *hdr = (struct p54_hdr *) skb->data;
+ struct p54_frame_sent *payload = (struct p54_frame_sent *) hdr->data;
+- struct sk_buff *entry;
++ struct sk_buff *entry = (struct sk_buff *) priv->tx_queue.next;
+ u32 addr = le32_to_cpu(hdr->req_id) - priv->headroom;
+ struct memrecord *range = NULL;
+ u32 freed = 0;
+@@ -742,7 +741,6 @@
+ int count, idx;
+
+ spin_lock_irqsave(&priv->tx_queue.lock, flags);
+- entry = (struct sk_buff *) priv->tx_queue.next;
+ while (entry != (struct sk_buff *)&priv->tx_queue) {
+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(entry);
+ struct p54_hdr *entry_hdr;
+@@ -978,7 +976,7 @@
+ struct p54_hdr *data, u32 len)
+ {
+ struct p54_common *priv = dev->priv;
+- struct sk_buff *entry;
++ struct sk_buff *entry = priv->tx_queue.next;
+ struct sk_buff *target_skb = NULL;
+ struct ieee80211_tx_info *info;
+ struct memrecord *range;
+@@ -1016,7 +1014,6 @@
+ }
+ }
+
+- entry = priv->tx_queue.next;
+ while (left--) {
+ u32 hole_size;
+ info = IEEE80211_SKB_CB(entry);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/rt2x00/rt2500usb.c linux-2.6.29-rc3.owrt/drivers/net/wireless/rt2x00/rt2500usb.c
+--- linux-2.6.29.owrt/drivers/net/wireless/rt2x00/rt2500usb.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/rt2x00/rt2500usb.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1952,8 +1952,6 @@
+ { USB_DEVICE(0x13b1, 0x000d), USB_DEVICE_DATA(&rt2500usb_ops) },
+ { USB_DEVICE(0x13b1, 0x0011), USB_DEVICE_DATA(&rt2500usb_ops) },
+ { USB_DEVICE(0x13b1, 0x001a), USB_DEVICE_DATA(&rt2500usb_ops) },
+- /* CNet */
+- { USB_DEVICE(0x1371, 0x9022), USB_DEVICE_DATA(&rt2500usb_ops) },
+ /* Conceptronic */
+ { USB_DEVICE(0x14b2, 0x3c02), USB_DEVICE_DATA(&rt2500usb_ops) },
+ /* D-LINK */
+@@ -1978,20 +1976,14 @@
+ { USB_DEVICE(0x148f, 0x2570), USB_DEVICE_DATA(&rt2500usb_ops) },
+ { USB_DEVICE(0x148f, 0x2573), USB_DEVICE_DATA(&rt2500usb_ops) },
+ { USB_DEVICE(0x148f, 0x9020), USB_DEVICE_DATA(&rt2500usb_ops) },
+- /* Sagem */
+- { USB_DEVICE(0x079b, 0x004b), USB_DEVICE_DATA(&rt2500usb_ops) },
+ /* Siemens */
+ { USB_DEVICE(0x0681, 0x3c06), USB_DEVICE_DATA(&rt2500usb_ops) },
+ /* SMC */
+ { USB_DEVICE(0x0707, 0xee13), USB_DEVICE_DATA(&rt2500usb_ops) },
+ /* Spairon */
+ { USB_DEVICE(0x114b, 0x0110), USB_DEVICE_DATA(&rt2500usb_ops) },
+- /* SURECOM */
+- { USB_DEVICE(0x0769, 0x11f3), USB_DEVICE_DATA(&rt2500usb_ops) },
+ /* Trust */
+ { USB_DEVICE(0x0eb0, 0x9020), USB_DEVICE_DATA(&rt2500usb_ops) },
+- /* VTech */
+- { USB_DEVICE(0x0f88, 0x3012), USB_DEVICE_DATA(&rt2500usb_ops) },
+ /* Zinwell */
+ { USB_DEVICE(0x5a57, 0x0260), USB_DEVICE_DATA(&rt2500usb_ops) },
+ { 0, }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/rt2x00/rt73usb.c linux-2.6.29-rc3.owrt/drivers/net/wireless/rt2x00/rt73usb.c
+--- linux-2.6.29.owrt/drivers/net/wireless/rt2x00/rt73usb.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/rt2x00/rt73usb.c 2009-05-10 23:48:29.000000000 +0200
+@@ -2281,18 +2281,7 @@
+ */
+ static struct usb_device_id rt73usb_device_table[] = {
+ /* AboCom */
+- { USB_DEVICE(0x07b8, 0xb21b), USB_DEVICE_DATA(&rt73usb_ops) },
+- { USB_DEVICE(0x07b8, 0xb21c), USB_DEVICE_DATA(&rt73usb_ops) },
+ { USB_DEVICE(0x07b8, 0xb21d), USB_DEVICE_DATA(&rt73usb_ops) },
+- { USB_DEVICE(0x07b8, 0xb21e), USB_DEVICE_DATA(&rt73usb_ops) },
+- { USB_DEVICE(0x07b8, 0xb21f), USB_DEVICE_DATA(&rt73usb_ops) },
+- /* AL */
+- { USB_DEVICE(0x14b2, 0x3c10), USB_DEVICE_DATA(&rt73usb_ops) },
+- /* Amigo */
+- { USB_DEVICE(0x148f, 0x9021), USB_DEVICE_DATA(&rt73usb_ops) },
+- { USB_DEVICE(0x0eb0, 0x9021), USB_DEVICE_DATA(&rt73usb_ops) },
+- /* AMIT */
+- { USB_DEVICE(0x18c5, 0x0002), USB_DEVICE_DATA(&rt73usb_ops) },
+ /* Askey */
+ { USB_DEVICE(0x1690, 0x0722), USB_DEVICE_DATA(&rt73usb_ops) },
+ /* ASUS */
+@@ -2305,9 +2294,7 @@
+ { USB_DEVICE(0x050d, 0x905c), USB_DEVICE_DATA(&rt73usb_ops) },
+ /* Billionton */
+ { USB_DEVICE(0x1631, 0xc019), USB_DEVICE_DATA(&rt73usb_ops) },
+- { USB_DEVICE(0x08dd, 0x0120), USB_DEVICE_DATA(&rt73usb_ops) },
+ /* Buffalo */
+- { USB_DEVICE(0x0411, 0x00d8), USB_DEVICE_DATA(&rt73usb_ops) },
+ { USB_DEVICE(0x0411, 0x00f4), USB_DEVICE_DATA(&rt73usb_ops) },
+ /* CNet */
+ { USB_DEVICE(0x1371, 0x9022), USB_DEVICE_DATA(&rt73usb_ops) },
+@@ -2321,11 +2308,6 @@
+ { USB_DEVICE(0x07d1, 0x3c04), USB_DEVICE_DATA(&rt73usb_ops) },
+ { USB_DEVICE(0x07d1, 0x3c06), USB_DEVICE_DATA(&rt73usb_ops) },
+ { USB_DEVICE(0x07d1, 0x3c07), USB_DEVICE_DATA(&rt73usb_ops) },
+- /* Edimax */
+- { USB_DEVICE(0x7392, 0x7318), USB_DEVICE_DATA(&rt73usb_ops) },
+- { USB_DEVICE(0x7392, 0x7618), USB_DEVICE_DATA(&rt73usb_ops) },
+- /* EnGenius */
+- { USB_DEVICE(0x1740, 0x3701), USB_DEVICE_DATA(&rt73usb_ops) },
+ /* Gemtek */
+ { USB_DEVICE(0x15a9, 0x0004), USB_DEVICE_DATA(&rt73usb_ops) },
+ /* Gigabyte */
+@@ -2346,34 +2328,22 @@
+ { USB_DEVICE(0x0db0, 0xa861), USB_DEVICE_DATA(&rt73usb_ops) },
+ { USB_DEVICE(0x0db0, 0xa874), USB_DEVICE_DATA(&rt73usb_ops) },
+ /* Ralink */
+- { USB_DEVICE(0x04bb, 0x093d), USB_DEVICE_DATA(&rt73usb_ops) },
+ { USB_DEVICE(0x148f, 0x2573), USB_DEVICE_DATA(&rt73usb_ops) },
+ { USB_DEVICE(0x148f, 0x2671), USB_DEVICE_DATA(&rt73usb_ops) },
+ /* Qcom */
+ { USB_DEVICE(0x18e8, 0x6196), USB_DEVICE_DATA(&rt73usb_ops) },
+ { USB_DEVICE(0x18e8, 0x6229), USB_DEVICE_DATA(&rt73usb_ops) },
+ { USB_DEVICE(0x18e8, 0x6238), USB_DEVICE_DATA(&rt73usb_ops) },
+- /* Samsung */
+- { USB_DEVICE(0x04e8, 0x4471), USB_DEVICE_DATA(&rt73usb_ops) },
+ /* Senao */
+ { USB_DEVICE(0x1740, 0x7100), USB_DEVICE_DATA(&rt73usb_ops) },
+ /* Sitecom */
+- { USB_DEVICE(0x0df6, 0x0024), USB_DEVICE_DATA(&rt73usb_ops) },
+- { USB_DEVICE(0x0df6, 0x0027), USB_DEVICE_DATA(&rt73usb_ops) },
+- { USB_DEVICE(0x0df6, 0x002f), USB_DEVICE_DATA(&rt73usb_ops) },
+- { USB_DEVICE(0x0df6, 0x90ac), USB_DEVICE_DATA(&rt73usb_ops) },
+ { USB_DEVICE(0x0df6, 0x9712), USB_DEVICE_DATA(&rt73usb_ops) },
++ { USB_DEVICE(0x0df6, 0x90ac), USB_DEVICE_DATA(&rt73usb_ops) },
+ /* Surecom */
+ { USB_DEVICE(0x0769, 0x31f3), USB_DEVICE_DATA(&rt73usb_ops) },
+- /* Philips */
+- { USB_DEVICE(0x0471, 0x200a), USB_DEVICE_DATA(&rt73usb_ops) },
+ /* Planex */
+ { USB_DEVICE(0x2019, 0xab01), USB_DEVICE_DATA(&rt73usb_ops) },
+ { USB_DEVICE(0x2019, 0xab50), USB_DEVICE_DATA(&rt73usb_ops) },
+- /* Zcom */
+- { USB_DEVICE(0x0cde, 0x001c), USB_DEVICE_DATA(&rt73usb_ops) },
+- /* ZyXEL */
+- { USB_DEVICE(0x0586, 0x3415), USB_DEVICE_DATA(&rt73usb_ops) },
+ { 0, }
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/rtl818x/rtl8187_dev.c linux-2.6.29-rc3.owrt/drivers/net/wireless/rtl818x/rtl8187_dev.c
+--- linux-2.6.29.owrt/drivers/net/wireless/rtl818x/rtl8187_dev.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/rtl818x/rtl8187_dev.c 2009-05-10 23:48:29.000000000 +0200
+@@ -48,10 +48,6 @@
+ {USB_DEVICE(0x0bda, 0x8189), .driver_info = DEVICE_RTL8187B},
+ {USB_DEVICE(0x0bda, 0x8197), .driver_info = DEVICE_RTL8187B},
+ {USB_DEVICE(0x0bda, 0x8198), .driver_info = DEVICE_RTL8187B},
+- /* Surecom */
+- {USB_DEVICE(0x0769, 0x11F2), .driver_info = DEVICE_RTL8187},
+- /* Logitech */
+- {USB_DEVICE(0x0789, 0x010C), .driver_info = DEVICE_RTL8187},
+ /* Netgear */
+ {USB_DEVICE(0x0846, 0x6100), .driver_info = DEVICE_RTL8187},
+ {USB_DEVICE(0x0846, 0x6a00), .driver_info = DEVICE_RTL8187},
+@@ -61,16 +57,8 @@
+ /* Sitecom */
+ {USB_DEVICE(0x0df6, 0x000d), .driver_info = DEVICE_RTL8187},
+ {USB_DEVICE(0x0df6, 0x0028), .driver_info = DEVICE_RTL8187B},
+- /* Sphairon Access Systems GmbH */
+- {USB_DEVICE(0x114B, 0x0150), .driver_info = DEVICE_RTL8187},
+- /* Dick Smith Electronics */
+- {USB_DEVICE(0x1371, 0x9401), .driver_info = DEVICE_RTL8187},
+ /* Abocom */
+ {USB_DEVICE(0x13d1, 0xabe6), .driver_info = DEVICE_RTL8187},
+- /* Qcom */
+- {USB_DEVICE(0x18E8, 0x6232), .driver_info = DEVICE_RTL8187},
+- /* AirLive */
+- {USB_DEVICE(0x1b75, 0x8187), .driver_info = DEVICE_RTL8187},
+ {}
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/rtl818x/rtl8187_rtl8225.c linux-2.6.29-rc3.owrt/drivers/net/wireless/rtl818x/rtl8187_rtl8225.c
+--- linux-2.6.29.owrt/drivers/net/wireless/rtl818x/rtl8187_rtl8225.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/rtl818x/rtl8187_rtl8225.c 2009-05-10 23:48:29.000000000 +0200
+@@ -285,10 +285,7 @@
+ ofdm_power = priv->channels[channel - 1].hw_value >> 4;
+
+ cck_power = min(cck_power, (u8)11);
+- if (ofdm_power > (u8)15)
+- ofdm_power = 25;
+- else
+- ofdm_power += 10;
++ ofdm_power = min(ofdm_power, (u8)35);
+
+ rtl818x_iowrite8(priv, &priv->map->TX_GAIN_CCK,
+ rtl8225_tx_gain_cck_ofdm[cck_power / 6] >> 1);
+@@ -539,10 +536,7 @@
+ cck_power += priv->txpwr_base & 0xF;
+ cck_power = min(cck_power, (u8)35);
+
+- if (ofdm_power > (u8)15)
+- ofdm_power = 25;
+- else
+- ofdm_power += 10;
++ ofdm_power = min(ofdm_power, (u8)15);
+ ofdm_power += priv->txpwr_base >> 4;
+ ofdm_power = min(ofdm_power, (u8)35);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/zd1211rw/zd_mac.c linux-2.6.29-rc3.owrt/drivers/net/wireless/zd1211rw/zd_mac.c
+--- linux-2.6.29.owrt/drivers/net/wireless/zd1211rw/zd_mac.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/zd1211rw/zd_mac.c 2009-05-10 23:48:29.000000000 +0200
+@@ -575,17 +575,13 @@
+
+ r = fill_ctrlset(mac, skb);
+ if (r)
+- goto fail;
++ return r;
+
+ info->rate_driver_data[0] = hw;
+
+ r = zd_usb_tx(&mac->chip.usb, skb);
+ if (r)
+- goto fail;
+- return 0;
+-
+-fail:
+- dev_kfree_skb(skb);
++ return r;
+ return 0;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/zd1211rw/zd_rf.c linux-2.6.29-rc3.owrt/drivers/net/wireless/zd1211rw/zd_rf.c
+--- linux-2.6.29.owrt/drivers/net/wireless/zd1211rw/zd_rf.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/zd1211rw/zd_rf.c 2009-05-10 23:48:29.000000000 +0200
+@@ -86,7 +86,6 @@
+ case AL7230B_RF:
+ r = zd_rf_init_al7230b(rf);
+ break;
+- case MAXIM_NEW_RF:
+ case UW2453_RF:
+ r = zd_rf_init_uw2453(rf);
+ break;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/net/wireless/zd1211rw/zd_usb.c linux-2.6.29-rc3.owrt/drivers/net/wireless/zd1211rw/zd_usb.c
+--- linux-2.6.29.owrt/drivers/net/wireless/zd1211rw/zd_usb.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/net/wireless/zd1211rw/zd_usb.c 2009-05-10 23:48:29.000000000 +0200
+@@ -37,7 +37,6 @@
+ static struct usb_device_id usb_ids[] = {
+ /* ZD1211 */
+ { USB_DEVICE(0x0ace, 0x1211), .driver_info = DEVICE_ZD1211 },
+- { USB_DEVICE(0x0ace, 0xa211), .driver_info = DEVICE_ZD1211 },
+ { USB_DEVICE(0x07b8, 0x6001), .driver_info = DEVICE_ZD1211 },
+ { USB_DEVICE(0x126f, 0xa006), .driver_info = DEVICE_ZD1211 },
+ { USB_DEVICE(0x6891, 0xa727), .driver_info = DEVICE_ZD1211 },
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/parisc/dino.c linux-2.6.29-rc3.owrt/drivers/parisc/dino.c
+--- linux-2.6.29.owrt/drivers/parisc/dino.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/parisc/dino.c 2009-05-10 23:48:29.000000000 +0200
+@@ -479,7 +479,7 @@
+ res = &dino_dev->hba.lmmio_space;
+ res->flags = IORESOURCE_MEM;
+ size = scnprintf(name, sizeof(name), "Dino LMMIO (%s)",
+- dev_name(bus->bridge));
++ bus->bridge->bus_id);
+ res->name = kmalloc(size+1, GFP_KERNEL);
+ if(res->name)
+ strcpy((char *)res->name, name);
+@@ -493,7 +493,7 @@
+ struct list_head *ln, *tmp_ln;
+
+ printk(KERN_ERR "Dino: cannot attach bus %s\n",
+- dev_name(bus->bridge));
++ bus->bridge->bus_id);
+ /* kill the bus, we can't do anything with it */
+ list_for_each_safe(ln, tmp_ln, &bus->devices) {
+ struct pci_dev *dev = pci_dev_b(ln);
+@@ -587,7 +587,7 @@
+ bus->resource[i+1] = &res[i];
+ }
+
+- } else if (bus->parent) {
++ } else if(bus->self) {
+ int i;
+
+ pci_read_bridge_bases(bus);
+@@ -611,12 +611,12 @@
+ }
+
+ DBG("DEBUG %s assigning %d [0x%lx,0x%lx]\n",
+- dev_name(&bus->self->dev), i,
++ bus->self->dev.bus_id, i,
+ bus->self->resource[i].start,
+ bus->self->resource[i].end);
+ pci_assign_resource(bus->self, i);
+ DBG("DEBUG %s after assign %d [0x%lx,0x%lx]\n",
+- dev_name(&bus->self->dev), i,
++ bus->self->dev.bus_id, i,
+ bus->self->resource[i].start,
+ bus->self->resource[i].end);
+ }
+@@ -1026,8 +1026,7 @@
+ dino_current_bus = bus->subordinate + 1;
+ pci_bus_assign_resources(bus);
+ } else {
+- printk(KERN_ERR "ERROR: failed to scan PCI bus on %s (probably duplicate bus number %d)\n",
+- dev_name(&dev->dev), dino_current_bus);
++ printk(KERN_ERR "ERROR: failed to scan PCI bus on %s (probably duplicate bus number %d)\n", dev->dev.bus_id, dino_current_bus);
+ /* increment the bus number in case of duplicates */
+ dino_current_bus++;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/parisc/gsc.c linux-2.6.29-rc3.owrt/drivers/parisc/gsc.c
+--- linux-2.6.29.owrt/drivers/parisc/gsc.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/parisc/gsc.c 2009-05-10 23:48:29.000000000 +0200
+@@ -186,34 +186,29 @@
+ *irqp = irq;
+ }
+
+-struct gsc_fixup_struct {
+- void (*choose_irq)(struct parisc_device *, void *);
+- void *ctrl;
+-};
+-
+-static int gsc_fixup_irqs_callback(struct device *dev, void *data)
++static struct device *next_device(struct klist_iter *i)
+ {
+- struct parisc_device *padev = to_parisc_device(dev);
+- struct gsc_fixup_struct *gf = data;
+-
+- /* work-around for 715/64 and others which have parent
+- at path [5] and children at path [5/0/x] */
+- if (padev->id.hw_type == HPHW_FAULTY)
+- gsc_fixup_irqs(padev, gf->ctrl, gf->choose_irq);
+- gf->choose_irq(padev, gf->ctrl);
+-
+- return 0;
++ struct klist_node * n = klist_next(i);
++ return n ? container_of(n, struct device, knode_parent) : NULL;
+ }
+
+ void gsc_fixup_irqs(struct parisc_device *parent, void *ctrl,
+ void (*choose_irq)(struct parisc_device *, void *))
+ {
+- struct gsc_fixup_struct data = {
+- .choose_irq = choose_irq,
+- .ctrl = ctrl,
+- };
++ struct device *dev;
++ struct klist_iter i;
+
+- device_for_each_child(&parent->dev, &data, gsc_fixup_irqs_callback);
++ klist_iter_init(&parent->dev.klist_children, &i);
++ while ((dev = next_device(&i))) {
++ struct parisc_device *padev = to_parisc_device(dev);
++
++ /* work-around for 715/64 and others which have parent
++ at path [5] and children at path [5/0/x] */
++ if (padev->id.hw_type == HPHW_FAULTY)
++ return gsc_fixup_irqs(padev, ctrl, choose_irq);
++ choose_irq(padev, ctrl);
++ }
++ klist_iter_exit(&i);
+ }
+
+ int gsc_common_setup(struct parisc_device *parent, struct gsc_asic *gsc_asic)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/parisc/iosapic.c linux-2.6.29-rc3.owrt/drivers/parisc/iosapic.c
+--- linux-2.6.29.owrt/drivers/parisc/iosapic.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/parisc/iosapic.c 2009-05-10 23:48:29.000000000 +0200
+@@ -487,7 +487,7 @@
+ }
+
+ /* Check if pcidev behind a PPB */
+- if (pcidev->bus->parent) {
++ if (NULL != pcidev->bus->self) {
+ /* Convert pcidev INTR_PIN into something we
+ ** can lookup in the IRT.
+ */
+@@ -523,9 +523,10 @@
+ #endif /* PCI_BRIDGE_FUNCS */
+
+ /*
+- * Locate the host slot of the PPB.
+- */
+- while (p->parent->parent)
++ ** Locate the host slot the PPB nearest the Host bus
++ ** adapter.
++ */
++ while (NULL != p->parent->self)
+ p = p->parent;
+
+ intr_slot = PCI_SLOT(p->self->devfn);
+@@ -708,14 +709,11 @@
+ struct vector_info *vi = iosapic_get_vector(irq);
+ u32 d0, d1, dummy_d0;
+ unsigned long flags;
+- int dest_cpu;
+
+- dest_cpu = cpu_check_affinity(irq, dest);
+- if (dest_cpu < 0)
++ if (cpu_check_affinity(irq, dest))
+ return;
+
+- irq_desc[irq].affinity = cpumask_of_cpu(dest_cpu);
+- vi->txn_addr = txn_affinity_addr(irq, dest_cpu);
++ vi->txn_addr = txn_affinity_addr(irq, cpumask_first(dest));
+
+ spin_lock_irqsave(&iosapic_lock, flags);
+ /* d1 contains the destination CPU, so only want to set that
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/parisc/lba_pci.c linux-2.6.29-rc3.owrt/drivers/parisc/lba_pci.c
+--- linux-2.6.29.owrt/drivers/parisc/lba_pci.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/parisc/lba_pci.c 2009-05-10 23:48:29.000000000 +0200
+@@ -644,7 +644,7 @@
+ ** Properly Setup MMIO resources for this bus.
+ ** pci_alloc_primary_bus() mangles this.
+ */
+- if (bus->parent) {
++ if (bus->self) {
+ int i;
+ /* PCI-PCI Bridge */
+ pci_read_bridge_bases(bus);
+@@ -802,7 +802,7 @@
+ ** Can't fixup here anyway....garr...
+ */
+ if (fbb_enable) {
+- if (bus->parent) {
++ if (bus->self) {
+ u8 control;
+ /* enable on PPB */
+ (void) pci_read_config_byte(bus->self, PCI_BRIDGE_CONTROL, &control);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/parisc/sba_iommu.c linux-2.6.29-rc3.owrt/drivers/parisc/sba_iommu.c
+--- linux-2.6.29.owrt/drivers/parisc/sba_iommu.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/parisc/sba_iommu.c 2009-05-10 23:48:29.000000000 +0200
+@@ -668,7 +668,7 @@
+ * @dev: instance of PCI owned by the driver that's asking
+ * @mask: number of address bits this PCI device can handle
+ *
+- * See Documentation/PCI/PCI-DMA-mapping.txt
++ * See Documentation/DMA-mapping.txt
+ */
+ static int sba_dma_supported( struct device *dev, u64 mask)
+ {
+@@ -680,8 +680,8 @@
+ return(0);
+ }
+
+- /* Documentation/PCI/PCI-DMA-mapping.txt tells drivers to try 64-bit
+- * first, then fall back to 32-bit if that fails.
++ /* Documentation/DMA-mapping.txt tells drivers to try 64-bit first,
++ * then fall back to 32-bit if that fails.
+ * We are just "encouraging" 32-bit DMA masks here since we can
+ * never allow IOMMU bypass unless we add special support for ZX1.
+ */
+@@ -706,7 +706,7 @@
+ * @size: number of bytes to map in driver buffer.
+ * @direction: R/W or both.
+ *
+- * See Documentation/PCI/PCI-DMA-mapping.txt
++ * See Documentation/DMA-mapping.txt
+ */
+ static dma_addr_t
+ sba_map_single(struct device *dev, void *addr, size_t size,
+@@ -785,7 +785,7 @@
+ * @size: number of bytes mapped in driver buffer.
+ * @direction: R/W or both.
+ *
+- * See Documentation/PCI/PCI-DMA-mapping.txt
++ * See Documentation/DMA-mapping.txt
+ */
+ static void
+ sba_unmap_single(struct device *dev, dma_addr_t iova, size_t size,
+@@ -861,7 +861,7 @@
+ * @size: number of bytes mapped in driver buffer.
+ * @dma_handle: IOVA of new buffer.
+ *
+- * See Documentation/PCI/PCI-DMA-mapping.txt
++ * See Documentation/DMA-mapping.txt
+ */
+ static void *sba_alloc_consistent(struct device *hwdev, size_t size,
+ dma_addr_t *dma_handle, gfp_t gfp)
+@@ -892,7 +892,7 @@
+ * @vaddr: virtual address IOVA of "consistent" buffer.
+ * @dma_handler: IO virtual address of "consistent" buffer.
+ *
+- * See Documentation/PCI/PCI-DMA-mapping.txt
++ * See Documentation/DMA-mapping.txt
+ */
+ static void
+ sba_free_consistent(struct device *hwdev, size_t size, void *vaddr,
+@@ -927,7 +927,7 @@
+ * @nents: number of entries in list
+ * @direction: R/W or both.
+ *
+- * See Documentation/PCI/PCI-DMA-mapping.txt
++ * See Documentation/DMA-mapping.txt
+ */
+ static int
+ sba_map_sg(struct device *dev, struct scatterlist *sglist, int nents,
+@@ -1011,7 +1011,7 @@
+ * @nents: number of entries in list
+ * @direction: R/W or both.
+ *
+- * See Documentation/PCI/PCI-DMA-mapping.txt
++ * See Documentation/DMA-mapping.txt
+ */
+ static void
+ sba_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents,
+@@ -1206,48 +1206,30 @@
+ return (void *) pdir_base;
+ }
+
+-struct ibase_data_struct {
+- struct ioc *ioc;
+- int ioc_num;
+-};
+-
+-static int setup_ibase_imask_callback(struct device *dev, void *data)
++static struct device *next_device(struct klist_iter *i)
+ {
+- /* lba_set_iregs() is in drivers/parisc/lba_pci.c */
+- extern void lba_set_iregs(struct parisc_device *, u32, u32);
+- struct parisc_device *lba = to_parisc_device(dev);
+- struct ibase_data_struct *ibd = data;
+- int rope_num = (lba->hpa.start >> 13) & 0xf;
+- if (rope_num >> 3 == ibd->ioc_num)
+- lba_set_iregs(lba, ibd->ioc->ibase, ibd->ioc->imask);
+- return 0;
++ struct klist_node * n = klist_next(i);
++ return n ? container_of(n, struct device, knode_parent) : NULL;
+ }
+
+ /* setup Mercury or Elroy IBASE/IMASK registers. */
+ static void
+ setup_ibase_imask(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
+ {
+- struct ibase_data_struct ibase_data = {
+- .ioc = ioc,
+- .ioc_num = ioc_num,
+- };
+-
+- device_for_each_child(&sba->dev, &ibase_data,
+- setup_ibase_imask_callback);
+-}
+-
+-#ifdef SBA_AGP_SUPPORT
+-static int
+-sba_ioc_find_quicksilver(struct device *dev, void *data)
+-{
+- int *agp_found = data;
+- struct parisc_device *lba = to_parisc_device(dev);
++ /* lba_set_iregs() is in drivers/parisc/lba_pci.c */
++ extern void lba_set_iregs(struct parisc_device *, u32, u32);
++ struct device *dev;
++ struct klist_iter i;
+
+- if (IS_QUICKSILVER(lba))
+- *agp_found = 1;
+- return 0;
++ klist_iter_init(&sba->dev.klist_children, &i);
++ while ((dev = next_device(&i))) {
++ struct parisc_device *lba = to_parisc_device(dev);
++ int rope_num = (lba->hpa.start >> 13) & 0xf;
++ if (rope_num >> 3 == ioc_num)
++ lba_set_iregs(lba, ioc->ibase, ioc->imask);
++ }
++ klist_iter_exit(&i);
+ }
+-#endif
+
+ static void
+ sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
+@@ -1350,6 +1332,9 @@
+ WRITE_REG(ioc->ibase | 31, ioc->ioc_hpa + IOC_PCOM);
+
+ #ifdef SBA_AGP_SUPPORT
++{
++ struct klist_iter i;
++ struct device *dev = NULL;
+
+ /*
+ ** If an AGP device is present, only use half of the IOV space
+@@ -1359,7 +1344,13 @@
+ ** We program the next pdir index after we stop w/ a key for
+ ** the GART code to handshake on.
+ */
+- device_for_each_child(&sba->dev, &agp_found, sba_ioc_find_quicksilver);
++ klist_iter_init(&sba->dev.klist_children, &i);
++ while ((dev = next_device(&i))) {
++ struct parisc_device *lba = to_parisc_device(dev);
++ if (IS_QUICKSILVER(lba))
++ agp_found = 1;
++ }
++ klist_iter_exit(&i);
+
+ if (agp_found && sba_reserve_agpgart) {
+ printk(KERN_INFO "%s: reserving %dMb of IOVA space for agpgart\n",
+@@ -1367,7 +1358,9 @@
+ ioc->pdir_size /= 2;
+ ioc->pdir_base[PDIR_INDEX(iova_space_size/2)] = SBA_AGPGART_COOKIE;
+ }
++}
+ #endif /*SBA_AGP_SUPPORT*/
++
+ }
+
+ static void
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/parport/parport_atari.c linux-2.6.29-rc3.owrt/drivers/parport/parport_atari.c
+--- linux-2.6.29.owrt/drivers/parport/parport_atari.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/parport/parport_atari.c 2009-05-10 23:48:29.000000000 +0200
+@@ -84,7 +84,7 @@
+ static unsigned char
+ parport_atari_read_status(struct parport *p)
+ {
+- return ((st_mfp.par_dt_reg & 1 ? 0 : PARPORT_STATUS_BUSY) |
++ return ((mfp.par_dt_reg & 1 ? 0 : PARPORT_STATUS_BUSY) |
+ PARPORT_STATUS_SELECT | PARPORT_STATUS_ERROR);
+ }
+
+@@ -193,9 +193,9 @@
+ sound_ym.wd_data = sound_ym.rd_data_reg_sel | (1 << 5);
+ local_irq_restore(flags);
+ /* MFP port I0 as input. */
+- st_mfp.data_dir &= ~1;
++ mfp.data_dir &= ~1;
+ /* MFP port I0 interrupt on high->low edge. */
+- st_mfp.active_edge &= ~1;
++ mfp.active_edge &= ~1;
+ p = parport_register_port((unsigned long)&sound_ym.wd_data,
+ IRQ_MFP_BUSY, PARPORT_DMA_NONE,
+ &parport_atari_ops);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/parport/parport_serial.c linux-2.6.29-rc3.owrt/drivers/parport/parport_serial.c
+--- linux-2.6.29.owrt/drivers/parport/parport_serial.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/parport/parport_serial.c 2009-05-10 23:48:29.000000000 +0200
+@@ -64,11 +64,6 @@
+
+ static int __devinit netmos_parallel_init(struct pci_dev *dev, struct parport_pc_pci *card, int autoirq, int autodma)
+ {
+- /* the rule described below doesn't hold for this device */
+- if (dev->device == PCI_DEVICE_ID_NETMOS_9835 &&
+- dev->subsystem_vendor == PCI_VENDOR_ID_IBM &&
+- dev->subsystem_device == 0x0299)
+- return -ENODEV;
+ /*
+ * Netmos uses the subdevice ID to indicate the number of parallel
+ * and serial ports. The form is 0x00PS, where <P> is the number of
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/pci/dmar.c linux-2.6.29-rc3.owrt/drivers/pci/dmar.c
+--- linux-2.6.29.owrt/drivers/pci/dmar.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/pci/dmar.c 2009-05-10 23:48:29.000000000 +0200
+@@ -330,14 +330,6 @@
+ entry_header = (struct acpi_dmar_header *)(dmar + 1);
+ while (((unsigned long)entry_header) <
+ (((unsigned long)dmar) + dmar_tbl->length)) {
+- /* Avoid looping forever on bad ACPI tables */
+- if (entry_header->length == 0) {
+- printk(KERN_WARNING PREFIX
+- "Invalid 0-length structure\n");
+- ret = -EINVAL;
+- break;
+- }
+-
+ dmar_table_print_dmar_entry(entry_header);
+
+ switch (entry_header->type) {
+@@ -499,7 +491,7 @@
+ int map_size;
+ u32 ver;
+ static int iommu_allocated = 0;
+- int agaw = 0;
++ int agaw;
+
+ iommu = kzalloc(sizeof(*iommu), GFP_KERNEL);
+ if (!iommu)
+@@ -515,7 +507,6 @@
+ iommu->cap = dmar_readq(iommu->reg + DMAR_CAP_REG);
+ iommu->ecap = dmar_readq(iommu->reg + DMAR_ECAP_REG);
+
+-#ifdef CONFIG_DMAR
+ agaw = iommu_calculate_agaw(iommu);
+ if (agaw < 0) {
+ printk(KERN_ERR
+@@ -523,7 +514,6 @@
+ iommu->seq_id);
+ goto error;
+ }
+-#endif
+ iommu->agaw = agaw;
+
+ /* the registers might be more than one page */
+@@ -581,49 +571,19 @@
+ }
+ }
+
+-static int qi_check_fault(struct intel_iommu *iommu, int index)
+-{
+- u32 fault;
+- int head;
+- struct q_inval *qi = iommu->qi;
+- int wait_index = (index + 1) % QI_LENGTH;
+-
+- fault = readl(iommu->reg + DMAR_FSTS_REG);
+-
+- /*
+- * If IQE happens, the head points to the descriptor associated
+- * with the error. No new descriptors are fetched until the IQE
+- * is cleared.
+- */
+- if (fault & DMA_FSTS_IQE) {
+- head = readl(iommu->reg + DMAR_IQH_REG);
+- if ((head >> 4) == index) {
+- memcpy(&qi->desc[index], &qi->desc[wait_index],
+- sizeof(struct qi_desc));
+- __iommu_flush_cache(iommu, &qi->desc[index],
+- sizeof(struct qi_desc));
+- writel(DMA_FSTS_IQE, iommu->reg + DMAR_FSTS_REG);
+- return -EINVAL;
+- }
+- }
+-
+- return 0;
+-}
+-
+ /*
+ * Submit the queued invalidation descriptor to the remapping
+ * hardware unit and wait for its completion.
+ */
+-int qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu)
++void qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu)
+ {
+- int rc = 0;
+ struct q_inval *qi = iommu->qi;
+ struct qi_desc *hw, wait_desc;
+ int wait_index, index;
+ unsigned long flags;
+
+ if (!qi)
+- return 0;
++ return;
+
+ hw = qi->desc;
+
+@@ -641,8 +601,7 @@
+
+ hw[index] = *desc;
+
+- wait_desc.low = QI_IWD_STATUS_DATA(QI_DONE) |
+- QI_IWD_STATUS_WRITE | QI_IWD_TYPE;
++ wait_desc.low = QI_IWD_STATUS_DATA(2) | QI_IWD_STATUS_WRITE | QI_IWD_TYPE;
+ wait_desc.high = virt_to_phys(&qi->desc_status[wait_index]);
+
+ hw[wait_index] = wait_desc;
+@@ -653,11 +612,13 @@
+ qi->free_head = (qi->free_head + 2) % QI_LENGTH;
+ qi->free_cnt -= 2;
+
++ spin_lock(&iommu->register_lock);
+ /*
+ * update the HW tail register indicating the presence of
+ * new descriptors.
+ */
+ writel(qi->free_head << 4, iommu->reg + DMAR_IQT_REG);
++ spin_unlock(&iommu->register_lock);
+
+ while (qi->desc_status[wait_index] != QI_DONE) {
+ /*
+@@ -667,21 +628,15 @@
+ * a deadlock where the interrupt context can wait indefinitely
+ * for free slots in the queue.
+ */
+- rc = qi_check_fault(iommu, index);
+- if (rc)
+- goto out;
+-
+ spin_unlock(&qi->q_lock);
+ cpu_relax();
+ spin_lock(&qi->q_lock);
+ }
+-out:
+- qi->desc_status[index] = qi->desc_status[wait_index] = QI_DONE;
++
++ qi->desc_status[index] = QI_DONE;
+
+ reclaim_free_desc(qi);
+ spin_unlock_irqrestore(&qi->q_lock, flags);
+-
+- return rc;
+ }
+
+ /*
+@@ -694,13 +649,13 @@
+ desc.low = QI_IEC_TYPE;
+ desc.high = 0;
+
+- /* should never fail */
+ qi_submit_sync(&desc, iommu);
+ }
+
+ int qi_flush_context(struct intel_iommu *iommu, u16 did, u16 sid, u8 fm,
+ u64 type, int non_present_entry_flush)
+ {
++
+ struct qi_desc desc;
+
+ if (non_present_entry_flush) {
+@@ -714,7 +669,10 @@
+ | QI_CC_GRAN(type) | QI_CC_TYPE;
+ desc.high = 0;
+
+- return qi_submit_sync(&desc, iommu);
++ qi_submit_sync(&desc, iommu);
++
++ return 0;
++
+ }
+
+ int qi_flush_iotlb(struct intel_iommu *iommu, u16 did, u64 addr,
+@@ -744,7 +702,10 @@
+ desc.high = QI_IOTLB_ADDR(addr) | QI_IOTLB_IH(ih)
+ | QI_IOTLB_AM(size_order);
+
+- return qi_submit_sync(&desc, iommu);
++ qi_submit_sync(&desc, iommu);
++
++ return 0;
++
+ }
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/pci/hotplug/fakephp.c linux-2.6.29-rc3.owrt/drivers/pci/hotplug/fakephp.c
+--- linux-2.6.29.owrt/drivers/pci/hotplug/fakephp.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/pci/hotplug/fakephp.c 2009-05-10 23:48:29.000000000 +0200
+@@ -195,13 +195,13 @@
+ * Tries hard not to re-enable already existing devices;
+ * also handles scanning of subfunctions.
+ */
+-static int pci_rescan_slot(struct pci_dev *temp)
++static void pci_rescan_slot(struct pci_dev *temp)
+ {
+ struct pci_bus *bus = temp->bus;
+ struct pci_dev *dev;
+ int func;
++ int retval;
+ u8 hdr_type;
+- int count = 0;
+
+ if (!pci_read_config_byte(temp, PCI_HEADER_TYPE, &hdr_type)) {
+ temp->hdr_type = hdr_type & 0x7f;
+@@ -213,12 +213,17 @@
+ dbg("New device on %s function %x:%x\n",
+ bus->name, temp->devfn >> 3,
+ temp->devfn & 7);
+- count++;
++ retval = pci_bus_add_device(dev);
++ if (retval)
++ dev_err(&dev->dev, "error adding "
++ "device, continuing.\n");
++ else
++ add_slot(dev);
+ }
+ }
+ /* multifunction device? */
+ if (!(hdr_type & 0x80))
+- return count;
++ return;
+
+ /* continue scanning for other functions */
+ for (func = 1, temp->devfn++; func < 8; func++, temp->devfn++) {
+@@ -234,13 +239,16 @@
+ dbg("New device on %s function %x:%x\n",
+ bus->name, temp->devfn >> 3,
+ temp->devfn & 7);
+- count++;
++ retval = pci_bus_add_device(dev);
++ if (retval)
++ dev_err(&dev->dev, "error adding "
++ "device, continuing.\n");
++ else
++ add_slot(dev);
+ }
+ }
+ }
+ }
+-
+- return count;
+ }
+
+
+@@ -254,8 +262,6 @@
+ {
+ unsigned int devfn;
+ struct pci_dev *dev;
+- int retval;
+- int found = 0;
+ dev = alloc_pci_dev();
+ if (!dev)
+ return;
+@@ -264,23 +270,7 @@
+ dev->sysdata = bus->sysdata;
+ for (devfn = 0; devfn < 0x100; devfn += 8) {
+ dev->devfn = devfn;
+- found += pci_rescan_slot(dev);
+- }
+-
+- if (found) {
+- pci_bus_assign_resources(bus);
+- list_for_each_entry(dev, &bus->devices, bus_list) {
+- /* Skip already-added devices */
+- if (dev->is_added)
+- continue;
+- retval = pci_bus_add_device(dev);
+- if (retval)
+- dev_err(&dev->dev,
+- "Error adding device, continuing\n");
+- else
+- add_slot(dev);
+- }
+- pci_bus_add_devices(bus);
++ pci_rescan_slot(dev);
+ }
+ kfree(dev);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/pci/hotplug/Kconfig linux-2.6.29-rc3.owrt/drivers/pci/hotplug/Kconfig
+--- linux-2.6.29.owrt/drivers/pci/hotplug/Kconfig 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/pci/hotplug/Kconfig 2009-05-10 23:48:29.000000000 +0200
+@@ -143,7 +143,7 @@
+
+ config HOTPLUG_PCI_RPA
+ tristate "RPA PCI Hotplug driver"
+- depends on PPC_PSERIES && EEH && !HOTPLUG_PCI_FAKE
++ depends on PPC_PSERIES && PPC64 && !HOTPLUG_PCI_FAKE
+ help
+ Say Y here if you have a RPA system that supports PCI Hotplug.
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/pci/hotplug/Makefile linux-2.6.29-rc3.owrt/drivers/pci/hotplug/Makefile
+--- linux-2.6.29.owrt/drivers/pci/hotplug/Makefile 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/pci/hotplug/Makefile 2009-05-10 23:48:29.000000000 +0200
+@@ -5,15 +5,11 @@
+ obj-$(CONFIG_HOTPLUG_PCI) += pci_hotplug.o
+ obj-$(CONFIG_HOTPLUG_PCI_COMPAQ) += cpqphp.o
+ obj-$(CONFIG_HOTPLUG_PCI_IBM) += ibmphp.o
+-
+-# pciehp should be linked before acpiphp in order to allow the native driver
+-# to attempt to bind first. We can then fall back to generic support.
+-
+-obj-$(CONFIG_HOTPLUG_PCI_PCIE) += pciehp.o
+ obj-$(CONFIG_HOTPLUG_PCI_ACPI) += acpiphp.o
+ obj-$(CONFIG_HOTPLUG_PCI_ACPI_IBM) += acpiphp_ibm.o
+ obj-$(CONFIG_HOTPLUG_PCI_CPCI_ZT5550) += cpcihp_zt5550.o
+ obj-$(CONFIG_HOTPLUG_PCI_CPCI_GENERIC) += cpcihp_generic.o
++obj-$(CONFIG_HOTPLUG_PCI_PCIE) += pciehp.o
+ obj-$(CONFIG_HOTPLUG_PCI_SHPC) += shpchp.o
+ obj-$(CONFIG_HOTPLUG_PCI_RPA) += rpaphp.o
+ obj-$(CONFIG_HOTPLUG_PCI_RPA_DLPAR) += rpadlpar_io.o
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/pci/hotplug/pciehp_core.c linux-2.6.29-rc3.owrt/drivers/pci/hotplug/pciehp_core.c
+--- linux-2.6.29.owrt/drivers/pci/hotplug/pciehp_core.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/pci/hotplug/pciehp_core.c 2009-05-10 23:48:29.000000000 +0200
+@@ -434,13 +434,6 @@
+ goto err_out_release_ctlr;
+ }
+
+- /* Enable events after we have setup the data structures */
+- rc = pcie_init_notification(ctrl);
+- if (rc) {
+- ctrl_err(ctrl, "Notification initialization failed\n");
+- goto err_out_release_ctlr;
+- }
+-
+ /* Check if slot is occupied */
+ t_slot = pciehp_find_slot(ctrl, ctrl->slot_device_offset);
+ t_slot->hpc_ops->get_adapter_status(t_slot, &value);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/pci/hotplug/pciehp.h linux-2.6.29-rc3.owrt/drivers/pci/hotplug/pciehp.h
+--- linux-2.6.29.owrt/drivers/pci/hotplug/pciehp.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/pci/hotplug/pciehp.h 2009-05-10 23:48:29.000000000 +0200
+@@ -111,7 +111,6 @@
+ int cmd_busy;
+ unsigned int no_cmd_complete:1;
+ unsigned int link_active_reporting:1;
+- unsigned int notification_enabled:1;
+ };
+
+ #define INT_BUTTON_IGNORE 0
+@@ -171,7 +170,6 @@
+ extern int pciehp_unconfigure_device(struct slot *p_slot);
+ extern void pciehp_queue_pushbutton_work(struct work_struct *work);
+ struct controller *pcie_init(struct pcie_device *dev);
+-int pcie_init_notification(struct controller *ctrl);
+ int pciehp_enable_slot(struct slot *p_slot);
+ int pciehp_disable_slot(struct slot *p_slot);
+ int pcie_enable_notification(struct controller *ctrl);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/pci/hotplug/pciehp_hpc.c linux-2.6.29-rc3.owrt/drivers/pci/hotplug/pciehp_hpc.c
+--- linux-2.6.29.owrt/drivers/pci/hotplug/pciehp_hpc.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/pci/hotplug/pciehp_hpc.c 2009-05-10 23:48:29.000000000 +0200
+@@ -934,7 +934,7 @@
+ ctrl_warn(ctrl, "Cannot disable software notification\n");
+ }
+
+-int pcie_init_notification(struct controller *ctrl)
++static int pcie_init_notification(struct controller *ctrl)
+ {
+ if (pciehp_request_irq(ctrl))
+ return -1;
+@@ -942,17 +942,13 @@
+ pciehp_free_irq(ctrl);
+ return -1;
+ }
+- ctrl->notification_enabled = 1;
+ return 0;
+ }
+
+ static void pcie_shutdown_notification(struct controller *ctrl)
+ {
+- if (ctrl->notification_enabled) {
+- pcie_disable_notification(ctrl);
+- pciehp_free_irq(ctrl);
+- ctrl->notification_enabled = 0;
+- }
++ pcie_disable_notification(ctrl);
++ pciehp_free_irq(ctrl);
+ }
+
+ static int pcie_init_slot(struct controller *ctrl)
+@@ -1114,8 +1110,13 @@
+ if (pcie_init_slot(ctrl))
+ goto abort_ctrl;
+
++ if (pcie_init_notification(ctrl))
++ goto abort_slot;
++
+ return ctrl;
+
++abort_slot:
++ pcie_cleanup_slot(ctrl);
+ abort_ctrl:
+ kfree(ctrl);
+ abort:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/pci/intel-iommu.c linux-2.6.29-rc3.owrt/drivers/pci/intel-iommu.c
+--- linux-2.6.29.owrt/drivers/pci/intel-iommu.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/pci/intel-iommu.c 2009-05-10 23:48:29.000000000 +0200
+@@ -61,8 +61,6 @@
+ /* global iommu list, set NULL for ignored DMAR units */
+ static struct intel_iommu **g_iommus;
+
+-static int rwbf_quirk;
+-
+ /*
+ * 0: Present
+ * 1-11: Reserved
+@@ -270,12 +268,7 @@
+
+ static void domain_remove_dev_info(struct dmar_domain *domain);
+
+-#ifdef CONFIG_DMAR_DEFAULT_ON
+-int dmar_disabled = 0;
+-#else
+-int dmar_disabled = 1;
+-#endif /*CONFIG_DMAR_DEFAULT_ON*/
+-
++int dmar_disabled;
+ static int __initdata dmar_map_gfx = 1;
+ static int dmar_forcedac;
+ static int intel_iommu_strict;
+@@ -291,12 +284,9 @@
+ if (!str)
+ return -EINVAL;
+ while (*str) {
+- if (!strncmp(str, "on", 2)) {
+- dmar_disabled = 0;
+- printk(KERN_INFO "Intel-IOMMU: enabled\n");
+- } else if (!strncmp(str, "off", 3)) {
++ if (!strncmp(str, "off", 3)) {
+ dmar_disabled = 1;
+- printk(KERN_INFO "Intel-IOMMU: disabled\n");
++ printk(KERN_INFO"Intel-IOMMU: disabled\n");
+ } else if (!strncmp(str, "igfx_off", 8)) {
+ dmar_map_gfx = 0;
+ printk(KERN_INFO
+@@ -787,7 +777,7 @@
+ u32 val;
+ unsigned long flag;
+
+- if (!rwbf_quirk && !cap_rwbf(iommu->cap))
++ if (!cap_rwbf(iommu->cap))
+ return;
+ val = iommu->gcmd | DMA_GCMD_WBF;
+
+@@ -3139,15 +3129,3 @@
+ .unmap = intel_iommu_unmap_range,
+ .iova_to_phys = intel_iommu_iova_to_phys,
+ };
+-
+-static void __devinit quirk_iommu_rwbf(struct pci_dev *dev)
+-{
+- /*
+- * Mobile 4 Series Chipset neglects to set RWBF capability,
+- * but needs it:
+- */
+- printk(KERN_INFO "DMAR: Forcing write-buffer flush capability\n");
+- rwbf_quirk = 1;
+-}
+-
+-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2a40, quirk_iommu_rwbf);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/pci/intr_remapping.c linux-2.6.29-rc3.owrt/drivers/pci/intr_remapping.c
+--- linux-2.6.29.owrt/drivers/pci/intr_remapping.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/pci/intr_remapping.c 2009-05-10 23:48:29.000000000 +0200
+@@ -207,7 +207,7 @@
+ return index;
+ }
+
+-static int qi_flush_iec(struct intel_iommu *iommu, int index, int mask)
++static void qi_flush_iec(struct intel_iommu *iommu, int index, int mask)
+ {
+ struct qi_desc desc;
+
+@@ -215,7 +215,7 @@
+ | QI_IEC_SELECTIVE;
+ desc.high = 0;
+
+- return qi_submit_sync(&desc, iommu);
++ qi_submit_sync(&desc, iommu);
+ }
+
+ int map_irq_to_irte_handle(int irq, u16 *sub_handle)
+@@ -283,7 +283,6 @@
+
+ int modify_irte(int irq, struct irte *irte_modified)
+ {
+- int rc;
+ int index;
+ struct irte *irte;
+ struct intel_iommu *iommu;
+@@ -304,15 +303,14 @@
+ set_64bit((unsigned long *)irte, irte_modified->low | (1 << 1));
+ __iommu_flush_cache(iommu, irte, sizeof(*irte));
+
+- rc = qi_flush_iec(iommu, index, 0);
+- spin_unlock(&irq_2_ir_lock);
++ qi_flush_iec(iommu, index, 0);
+
+- return rc;
++ spin_unlock(&irq_2_ir_lock);
++ return 0;
+ }
+
+ int flush_irte(int irq)
+ {
+- int rc;
+ int index;
+ struct intel_iommu *iommu;
+ struct irq_2_iommu *irq_iommu;
+@@ -328,10 +326,10 @@
+
+ index = irq_iommu->irte_index + irq_iommu->sub_handle;
+
+- rc = qi_flush_iec(iommu, index, irq_iommu->irte_mask);
++ qi_flush_iec(iommu, index, irq_iommu->irte_mask);
+ spin_unlock(&irq_2_ir_lock);
+
+- return rc;
++ return 0;
+ }
+
+ struct intel_iommu *map_ioapic_to_ir(int apic)
+@@ -357,7 +355,6 @@
+
+ int free_irte(int irq)
+ {
+- int rc = 0;
+ int index, i;
+ struct irte *irte;
+ struct intel_iommu *iommu;
+@@ -378,7 +375,7 @@
+ if (!irq_iommu->sub_handle) {
+ for (i = 0; i < (1 << irq_iommu->irte_mask); i++)
+ set_64bit((unsigned long *)irte, 0);
+- rc = qi_flush_iec(iommu, index, irq_iommu->irte_mask);
++ qi_flush_iec(iommu, index, irq_iommu->irte_mask);
+ }
+
+ irq_iommu->iommu = NULL;
+@@ -388,7 +385,7 @@
+
+ spin_unlock(&irq_2_ir_lock);
+
+- return rc;
++ return 0;
+ }
+
+ static void iommu_set_intr_remapping(struct intel_iommu *iommu, int mode)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/pci/msi.c linux-2.6.29-rc3.owrt/drivers/pci/msi.c
+--- linux-2.6.29.owrt/drivers/pci/msi.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/pci/msi.c 2009-05-10 23:48:29.000000000 +0200
+@@ -103,14 +103,6 @@
+ }
+ }
+
+-static inline __attribute_const__ u32 msi_mask(unsigned x)
+-{
+- /* Don't shift by >= width of type */
+- if (x >= 5)
+- return 0xffffffff;
+- return (1 << (1 << x)) - 1;
+-}
+-
+ static void msix_flush_writes(struct irq_desc *desc)
+ {
+ struct msi_desc *entry;
+@@ -415,7 +407,8 @@
+
+ /* All MSIs are unmasked by default, Mask them all */
+ pci_read_config_dword(dev, base, &maskbits);
+- temp = msi_mask((control & PCI_MSI_FLAGS_QMASK) >> 1);
++ temp = (1 << multi_msi_capable(control));
++ temp = ((temp - 1) & ~temp);
+ maskbits |= temp;
+ pci_write_config_dword(dev, base, maskbits);
+ entry->msi_attrib.maskbits_mask = temp;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/pci/pci.c linux-2.6.29-rc3.owrt/drivers/pci/pci.c
+--- linux-2.6.29.owrt/drivers/pci/pci.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/pci/pci.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1393,35 +1393,35 @@
+ pci_power_t prev_state;
+ int error;
+
++ pci_restore_state(dev);
+ pci_update_current_state(dev, PCI_D0);
+
+ prev_state = dev->current_state;
+ if (prev_state == PCI_D0)
+- goto Restore;
++ return 0;
+
+ error = pci_raw_set_power_state(dev, PCI_D0, false);
+ if (error)
+ return error;
+
+- /*
+- * This assumes that we won't get a bus in B2 or B3 from the BIOS, but
+- * we've made this assumption forever and it appears to be universally
+- * satisfied.
+- */
+- switch(prev_state) {
+- case PCI_D3cold:
+- case PCI_D3hot:
+- mdelay(pci_pm_d3_delay);
+- break;
+- case PCI_D2:
+- udelay(PCI_PM_D2_DELAY);
+- break;
++ if (pci_is_bridge(dev)) {
++ if (prev_state > PCI_D1)
++ mdelay(PCI_PM_BUS_WAIT);
++ } else {
++ switch(prev_state) {
++ case PCI_D3cold:
++ case PCI_D3hot:
++ mdelay(pci_pm_d3_delay);
++ break;
++ case PCI_D2:
++ udelay(PCI_PM_D2_DELAY);
++ break;
++ }
+ }
+
+- pci_update_current_state(dev, PCI_D0);
++ dev->current_state = PCI_D0;
+
+- Restore:
+- return dev->state_saved ? pci_restore_state(dev) : 0;
++ return 0;
+ }
+
+ /**
+@@ -1540,21 +1540,16 @@
+ }
+
+ /**
+- * __pci_request_region - Reserved PCI I/O and memory resource
++ * pci_request_region - Reserved PCI I/O and memory resource
+ * @pdev: PCI device whose resources are to be reserved
+ * @bar: BAR to be reserved
+ * @res_name: Name to be associated with resource.
+- * @exclusive: whether the region access is exclusive or not
+ *
+ * Mark the PCI region associated with PCI device @pdev BR @bar as
+ * being reserved by owner @res_name. Do not access any
+ * address inside the PCI regions unless this call returns
+ * successfully.
+ *
+- * If @exclusive is set, then the region is marked so that userspace
+- * is explicitly not allowed to map the resource via /dev/mem or
+- * sysfs MMIO access.
+- *
+ * Returns 0 on success, or %EBUSY on error. A warning
+ * message is also printed on failure.
+ */
+@@ -1593,12 +1588,12 @@
+ }
+
+ /**
+- * pci_request_region - Reserve PCI I/O and memory resource
++ * pci_request_region - Reserved PCI I/O and memory resource
+ * @pdev: PCI device whose resources are to be reserved
+ * @bar: BAR to be reserved
+- * @res_name: Name to be associated with resource
++ * @res_name: Name to be associated with resource.
+ *
+- * Mark the PCI region associated with PCI device @pdev BAR @bar as
++ * Mark the PCI region associated with PCI device @pdev BR @bar as
+ * being reserved by owner @res_name. Do not access any
+ * address inside the PCI regions unless this call returns
+ * successfully.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/pci/pci-driver.c linux-2.6.29-rc3.owrt/drivers/pci/pci-driver.c
+--- linux-2.6.29.owrt/drivers/pci/pci-driver.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/pci/pci-driver.c 2009-05-10 23:48:29.000000000 +0200
+@@ -355,8 +355,6 @@
+ int i = 0;
+
+ if (drv && drv->suspend) {
+- pci_power_t prev = pci_dev->current_state;
+-
+ pci_dev->state_saved = false;
+
+ i = drv->suspend(pci_dev, state);
+@@ -367,13 +365,8 @@
+ if (pci_dev->state_saved)
+ goto Fixup;
+
+- if (pci_dev->current_state != PCI_D0
+- && pci_dev->current_state != PCI_UNKNOWN) {
+- WARN_ONCE(pci_dev->current_state != prev,
+- "PCI PM: Device state not saved by %pF\n",
+- drv->suspend);
++ if (WARN_ON_ONCE(pci_dev->current_state != PCI_D0))
+ goto Fixup;
+- }
+ }
+
+ pci_save_state(pci_dev);
+@@ -426,24 +419,38 @@
+ static void pci_pm_default_resume_noirq(struct pci_dev *pci_dev)
+ {
+ pci_restore_standard_config(pci_dev);
+- pci_dev->state_saved = false;
+ pci_fixup_device(pci_fixup_resume_early, pci_dev);
+ }
+
+-static void pci_pm_default_resume(struct pci_dev *pci_dev)
++static int pci_pm_default_resume(struct pci_dev *pci_dev)
+ {
+ pci_fixup_device(pci_fixup_resume, pci_dev);
+
+ if (!pci_is_bridge(pci_dev))
+ pci_enable_wake(pci_dev, PCI_D0, false);
++
++ return pci_pm_reenable_device(pci_dev);
++}
++
++static void pci_pm_default_suspend_generic(struct pci_dev *pci_dev)
++{
++ /* If device is enabled at this point, disable it */
++ pci_disable_enabled_device(pci_dev);
++ /*
++ * Save state with interrupts enabled, because in principle the bus the
++ * device is on may be put into a low power state after this code runs.
++ */
++ pci_save_state(pci_dev);
+ }
+
+ static void pci_pm_default_suspend(struct pci_dev *pci_dev)
+ {
+- /* Disable non-bridge devices without PM support */
++ pci_pm_default_suspend_generic(pci_dev);
++
+ if (!pci_is_bridge(pci_dev))
+- pci_disable_enabled_device(pci_dev);
+- pci_save_state(pci_dev);
++ pci_prepare_to_sleep(pci_dev);
++
++ pci_fixup_device(pci_fixup_suspend, pci_dev);
+ }
+
+ static bool pci_has_legacy_pm_support(struct pci_dev *pci_dev)
+@@ -488,49 +495,21 @@
+ static int pci_pm_suspend(struct device *dev)
+ {
+ struct pci_dev *pci_dev = to_pci_dev(dev);
+- struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
++ struct device_driver *drv = dev->driver;
++ int error = 0;
+
+ if (pci_has_legacy_pm_support(pci_dev))
+ return pci_legacy_suspend(dev, PMSG_SUSPEND);
+
+- if (!pm) {
+- pci_pm_default_suspend(pci_dev);
+- goto Fixup;
+- }
+-
+- pci_dev->state_saved = false;
+-
+- if (pm->suspend) {
+- pci_power_t prev = pci_dev->current_state;
+- int error;
+-
+- error = pm->suspend(dev);
+- suspend_report_result(pm->suspend, error);
+- if (error)
+- return error;
+-
+- if (pci_dev->state_saved)
+- goto Fixup;
+-
+- if (pci_dev->current_state != PCI_D0
+- && pci_dev->current_state != PCI_UNKNOWN) {
+- WARN_ONCE(pci_dev->current_state != prev,
+- "PCI PM: State of device not saved by %pF\n",
+- pm->suspend);
+- goto Fixup;
+- }
+- }
+-
+- if (!pci_dev->state_saved) {
+- pci_save_state(pci_dev);
+- if (!pci_is_bridge(pci_dev))
+- pci_prepare_to_sleep(pci_dev);
++ if (drv && drv->pm && drv->pm->suspend) {
++ error = drv->pm->suspend(dev);
++ suspend_report_result(drv->pm->suspend, error);
+ }
+
+- Fixup:
+- pci_fixup_device(pci_fixup_suspend, pci_dev);
++ if (!error)
++ pci_pm_default_suspend(pci_dev);
+
+- return 0;
++ return error;
+ }
+
+ static int pci_pm_suspend_noirq(struct device *dev)
+@@ -573,29 +552,18 @@
+ static int pci_pm_resume(struct device *dev)
+ {
+ struct pci_dev *pci_dev = to_pci_dev(dev);
+- struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
++ struct device_driver *drv = dev->driver;
+ int error = 0;
+
+- /*
+- * This is necessary for the suspend error path in which resume is
+- * called without restoring the standard config registers of the device.
+- */
+- if (pci_dev->state_saved)
+- pci_restore_standard_config(pci_dev);
+-
+ if (pci_has_legacy_pm_support(pci_dev))
+ return pci_legacy_resume(dev);
+
+- pci_pm_default_resume(pci_dev);
++ error = pci_pm_default_resume(pci_dev);
+
+- if (pm) {
+- if (pm->resume)
+- error = pm->resume(dev);
+- } else {
+- pci_pm_reenable_device(pci_dev);
+- }
++ if (!error && drv && drv->pm && drv->pm->resume)
++ error = drv->pm->resume(dev);
+
+- return 0;
++ return error;
+ }
+
+ #else /* !CONFIG_SUSPEND */
+@@ -612,31 +580,21 @@
+ static int pci_pm_freeze(struct device *dev)
+ {
+ struct pci_dev *pci_dev = to_pci_dev(dev);
+- struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
++ struct device_driver *drv = dev->driver;
++ int error = 0;
+
+ if (pci_has_legacy_pm_support(pci_dev))
+ return pci_legacy_suspend(dev, PMSG_FREEZE);
+
+- if (!pm) {
+- pci_pm_default_suspend(pci_dev);
+- return 0;
++ if (drv && drv->pm && drv->pm->freeze) {
++ error = drv->pm->freeze(dev);
++ suspend_report_result(drv->pm->freeze, error);
+ }
+
+- pci_dev->state_saved = false;
+-
+- if (pm->freeze) {
+- int error;
+-
+- error = pm->freeze(dev);
+- suspend_report_result(pm->freeze, error);
+- if (error)
+- return error;
+- }
+-
+- if (!pci_dev->state_saved)
+- pci_save_state(pci_dev);
++ if (!error)
++ pci_pm_default_suspend_generic(pci_dev);
+
+- return 0;
++ return error;
+ }
+
+ static int pci_pm_freeze_noirq(struct device *dev)
+@@ -679,18 +637,16 @@
+ static int pci_pm_thaw(struct device *dev)
+ {
+ struct pci_dev *pci_dev = to_pci_dev(dev);
+- struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
++ struct device_driver *drv = dev->driver;
+ int error = 0;
+
+ if (pci_has_legacy_pm_support(pci_dev))
+ return pci_legacy_resume(dev);
+
+- if (pm) {
+- if (pm->thaw)
+- error = pm->thaw(dev);
+- } else {
+- pci_pm_reenable_device(pci_dev);
+- }
++ pci_pm_reenable_device(pci_dev);
++
++ if (drv && drv->pm && drv->pm->thaw)
++ error = drv->pm->thaw(dev);
+
+ return error;
+ }
+@@ -698,29 +654,19 @@
+ static int pci_pm_poweroff(struct device *dev)
+ {
+ struct pci_dev *pci_dev = to_pci_dev(dev);
+- struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
++ struct device_driver *drv = dev->driver;
+ int error = 0;
+
+ if (pci_has_legacy_pm_support(pci_dev))
+ return pci_legacy_suspend(dev, PMSG_HIBERNATE);
+
+- if (!pm) {
+- pci_pm_default_suspend(pci_dev);
+- goto Fixup;
++ if (drv && drv->pm && drv->pm->poweroff) {
++ error = drv->pm->poweroff(dev);
++ suspend_report_result(drv->pm->poweroff, error);
+ }
+
+- pci_dev->state_saved = false;
+-
+- if (pm->poweroff) {
+- error = pm->poweroff(dev);
+- suspend_report_result(pm->poweroff, error);
+- }
+-
+- if (!pci_dev->state_saved && !pci_is_bridge(pci_dev))
+- pci_prepare_to_sleep(pci_dev);
+-
+- Fixup:
+- pci_fixup_device(pci_fixup_suspend, pci_dev);
++ if (!error)
++ pci_pm_default_suspend(pci_dev);
+
+ return error;
+ }
+@@ -761,27 +707,16 @@
+ static int pci_pm_restore(struct device *dev)
+ {
+ struct pci_dev *pci_dev = to_pci_dev(dev);
+- struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
++ struct device_driver *drv = dev->driver;
+ int error = 0;
+
+- /*
+- * This is necessary for the hibernation error path in which restore is
+- * called without restoring the standard config registers of the device.
+- */
+- if (pci_dev->state_saved)
+- pci_restore_standard_config(pci_dev);
+-
+ if (pci_has_legacy_pm_support(pci_dev))
+ return pci_legacy_resume(dev);
+
+- pci_pm_default_resume(pci_dev);
++ error = pci_pm_default_resume(pci_dev);
+
+- if (pm) {
+- if (pm->restore)
+- error = pm->restore(dev);
+- } else {
+- pci_pm_reenable_device(pci_dev);
+- }
++ if (!error && drv && drv->pm && drv->pm->restore)
++ error = drv->pm->restore(dev);
+
+ return error;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/pci/pcie/aer/aerdrv_core.c linux-2.6.29-rc3.owrt/drivers/pci/pcie/aer/aerdrv_core.c
+--- linux-2.6.29.owrt/drivers/pci/pcie/aer/aerdrv_core.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/pci/pcie/aer/aerdrv_core.c 2009-05-10 23:48:29.000000000 +0200
+@@ -108,37 +108,6 @@
+ }
+ #endif /* 0 */
+
+-
+-static void set_device_error_reporting(struct pci_dev *dev, void *data)
+-{
+- bool enable = *((bool *)data);
+-
+- if (dev->pcie_type != PCIE_RC_PORT &&
+- dev->pcie_type != PCIE_SW_UPSTREAM_PORT &&
+- dev->pcie_type != PCIE_SW_DOWNSTREAM_PORT)
+- return;
+-
+- if (enable)
+- pci_enable_pcie_error_reporting(dev);
+- else
+- pci_disable_pcie_error_reporting(dev);
+-}
+-
+-/**
+- * set_downstream_devices_error_reporting - enable/disable the error reporting bits on the root port and its downstream ports.
+- * @dev: pointer to root port's pci_dev data structure
+- * @enable: true = enable error reporting, false = disable error reporting.
+- */
+-static void set_downstream_devices_error_reporting(struct pci_dev *dev,
+- bool enable)
+-{
+- set_device_error_reporting(dev, &enable);
+-
+- if (!dev->subordinate)
+- return;
+- pci_walk_bus(dev->subordinate, set_device_error_reporting, &enable);
+-}
+-
+ static int find_device_iter(struct device *device, void *data)
+ {
+ struct pci_dev *dev;
+@@ -556,11 +525,15 @@
+ pci_read_config_dword(pdev, aer_pos + PCI_ERR_UNCOR_STATUS, &reg32);
+ pci_write_config_dword(pdev, aer_pos + PCI_ERR_UNCOR_STATUS, reg32);
+
+- /*
+- * Enable error reporting for the root port device and downstream port
+- * devices.
+- */
+- set_downstream_devices_error_reporting(pdev, true);
++ /* Enable Root Port device reporting error itself */
++ pci_read_config_word(pdev, pos+PCI_EXP_DEVCTL, &reg16);
++ reg16 = reg16 |
++ PCI_EXP_DEVCTL_CERE |
++ PCI_EXP_DEVCTL_NFERE |
++ PCI_EXP_DEVCTL_FERE |
++ PCI_EXP_DEVCTL_URRE;
++ pci_write_config_word(pdev, pos+PCI_EXP_DEVCTL,
++ reg16);
+
+ /* Enable Root Port's interrupt in response to error messages */
+ pci_write_config_dword(pdev,
+@@ -580,12 +553,6 @@
+ u32 reg32;
+ int pos;
+
+- /*
+- * Disable error reporting for the root port device and downstream port
+- * devices.
+- */
+- set_downstream_devices_error_reporting(pdev, false);
+-
+ pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ERR);
+ /* Disable Root's interrupt in response to error messages */
+ pci_write_config_dword(pdev, pos + PCI_ERR_ROOT_COMMAND, 0);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/pci/pcie/aspm.c linux-2.6.29-rc3.owrt/drivers/pci/pcie/aspm.c
+--- linux-2.6.29.owrt/drivers/pci/pcie/aspm.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/pci/pcie/aspm.c 2009-05-10 23:48:29.000000000 +0200
+@@ -718,9 +718,9 @@
+
+ /*
+ * All PCIe functions are in one slot, remove one function will remove
+- * the whole slot, so just wait until we are the last function left.
++ * the the whole slot, so just wait
+ */
+- if (!list_is_last(&pdev->bus_list, &parent->subordinate->devices))
++ if (!list_empty(&parent->subordinate->devices))
+ goto out;
+
+ /* All functions are removed, so just disable ASPM for the link */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/pci/pcie/portdrv_pci.c linux-2.6.29-rc3.owrt/drivers/pci/pcie/portdrv_pci.c
+--- linux-2.6.29.owrt/drivers/pci/pcie/portdrv_pci.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/pci/pcie/portdrv_pci.c 2009-05-10 23:48:29.000000000 +0200
+@@ -55,13 +55,25 @@
+
+ }
+
++static int pcie_portdrv_suspend_late(struct pci_dev *dev, pm_message_t state)
++{
++ return pci_save_state(dev);
++}
++
++static int pcie_portdrv_resume_early(struct pci_dev *dev)
++{
++ return pci_restore_state(dev);
++}
++
+ static int pcie_portdrv_resume(struct pci_dev *dev)
+ {
+- pci_set_master(dev);
++ pcie_portdrv_restore_config(dev);
+ return pcie_port_device_resume(dev);
+ }
+ #else
+ #define pcie_portdrv_suspend NULL
++#define pcie_portdrv_suspend_late NULL
++#define pcie_portdrv_resume_early NULL
+ #define pcie_portdrv_resume NULL
+ #endif
+
+@@ -97,13 +109,14 @@
+
+ pcie_portdrv_save_config(dev);
+
++ pci_enable_pcie_error_reporting(dev);
++
+ return 0;
+ }
+
+ static void pcie_portdrv_remove (struct pci_dev *dev)
+ {
+ pcie_port_device_remove(dev);
+- pci_disable_device(dev);
+ kfree(pci_get_drvdata(dev));
+ }
+
+@@ -279,6 +292,8 @@
+ .remove = pcie_portdrv_remove,
+
+ .suspend = pcie_portdrv_suspend,
++ .suspend_late = pcie_portdrv_suspend_late,
++ .resume_early = pcie_portdrv_resume_early,
+ .resume = pcie_portdrv_resume,
+
+ .err_handler = &pcie_portdrv_err_handler,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/pci/pci.h linux-2.6.29-rc3.owrt/drivers/pci/pci.h
+--- linux-2.6.29.owrt/drivers/pci/pci.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/pci/pci.h 2009-05-10 23:48:29.000000000 +0200
+@@ -16,21 +16,21 @@
+ #endif
+
+ /**
+- * struct pci_platform_pm_ops - Firmware PM callbacks
++ * Firmware PM callbacks
+ *
+- * @is_manageable: returns 'true' if given device is power manageable by the
+- * platform firmware
++ * @is_manageable - returns 'true' if given device is power manageable by the
++ * platform firmware
+ *
+- * @set_state: invokes the platform firmware to set the device's power state
++ * @set_state - invokes the platform firmware to set the device's power state
+ *
+- * @choose_state: returns PCI power state of given device preferred by the
+- * platform; to be used during system-wide transitions from a
+- * sleeping state to the working state and vice versa
++ * @choose_state - returns PCI power state of given device preferred by the
++ * platform; to be used during system-wide transitions from a
++ * sleeping state to the working state and vice versa
+ *
+- * @can_wakeup: returns 'true' if given device is capable of waking up the
+- * system from a sleeping state
++ * @can_wakeup - returns 'true' if given device is capable of waking up the
++ * system from a sleeping state
+ *
+- * @sleep_wake: enables/disables the system wake up capability of given device
++ * @sleep_wake - enables/disables the system wake up capability of given device
+ *
+ * If given platform is generally capable of power managing PCI devices, all of
+ * these callbacks are mandatory.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/pci/pci-sysfs.c linux-2.6.29-rc3.owrt/drivers/pci/pci-sysfs.c
+--- linux-2.6.29.owrt/drivers/pci/pci-sysfs.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/pci/pci-sysfs.c 2009-05-10 23:48:29.000000000 +0200
+@@ -768,8 +768,8 @@
+ return -EINVAL;
+
+ rom = pci_map_rom(pdev, &size); /* size starts out as PCI window size */
+- if (!rom || !size)
+- return -EIO;
++ if (!rom)
++ return 0;
+
+ if (off >= size)
+ count = 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/pci/quirks.c linux-2.6.29-rc3.owrt/drivers/pci/quirks.c
+--- linux-2.6.29.owrt/drivers/pci/quirks.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/pci/quirks.c 2009-05-10 23:48:29.000000000 +0200
+@@ -23,7 +23,6 @@
+ #include <linux/acpi.h>
+ #include <linux/kallsyms.h>
+ #include <linux/dmi.h>
+-#include <linux/pci-aspm.h>
+ #include "pci.h"
+
+ int isa_dma_bridge_buggy;
+@@ -1585,7 +1584,6 @@
+ */
+ #define AMD_813X_MISC 0x40
+ #define AMD_813X_NOIOAMODE (1<<0)
+-#define AMD_813X_REV_B2 0x13
+
+ static void quirk_disable_amd_813x_boot_interrupt(struct pci_dev *dev)
+ {
+@@ -1593,8 +1591,6 @@
+
+ if (noioapicquirk)
+ return;
+- if (dev->revision == AMD_813X_REV_B2)
+- return;
+
+ pci_read_config_dword(dev, AMD_813X_MISC, &pci_config_dword);
+ pci_config_dword &= ~AMD_813X_NOIOAMODE;
+@@ -1750,30 +1746,6 @@
+ }
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_ANY_ID, quirk_e100_interrupt);
+
+-/*
+- * The 82575 and 82598 may experience data corruption issues when transitioning
+- * out of L0S. To prevent this we need to disable L0S on the pci-e link
+- */
+-static void __devinit quirk_disable_aspm_l0s(struct pci_dev *dev)
+-{
+- dev_info(&dev->dev, "Disabling L0s\n");
+- pci_disable_link_state(dev, PCIE_LINK_STATE_L0S);
+-}
+-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10a7, quirk_disable_aspm_l0s);
+-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10a9, quirk_disable_aspm_l0s);
+-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10b6, quirk_disable_aspm_l0s);
+-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10c6, quirk_disable_aspm_l0s);
+-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10c7, quirk_disable_aspm_l0s);
+-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10c8, quirk_disable_aspm_l0s);
+-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10d6, quirk_disable_aspm_l0s);
+-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10db, quirk_disable_aspm_l0s);
+-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10dd, quirk_disable_aspm_l0s);
+-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10e1, quirk_disable_aspm_l0s);
+-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10ec, quirk_disable_aspm_l0s);
+-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10f1, quirk_disable_aspm_l0s);
+-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10f4, quirk_disable_aspm_l0s);
+-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1508, quirk_disable_aspm_l0s);
+-
+ static void __devinit fixup_rev1_53c810(struct pci_dev* dev)
+ {
+ /* rev 1 ncr53c810 chips don't set the class at all which means
+@@ -2009,6 +1981,7 @@
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HT2000_PCIE,
+ quirk_msi_ht_cap);
+
++
+ /* The nVidia CK804 chipset may have 2 HT MSI mappings.
+ * MSI are supported if the MSI capability set in any of these mappings.
+ */
+@@ -2059,9 +2032,6 @@
+ PCI_DEVICE_ID_SERVERWORKS_HT1000_PXB,
+ ht_enable_msi_mapping);
+
+-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8132_BRIDGE,
+- ht_enable_msi_mapping);
+-
+ /* The P5N32-SLI Premium motherboard from Asus has a problem with msi
+ * for the MCP55 NIC. It is not yet determined whether the msi problem
+ * also affects other devices. As for now, turn off msi for this device.
+@@ -2078,104 +2048,10 @@
+ PCI_DEVICE_ID_NVIDIA_NVENET_15,
+ nvenet_msi_disable);
+
+-static void __devinit nv_ht_enable_msi_mapping(struct pci_dev *dev)
+-{
+- struct pci_dev *host_bridge;
+- int pos;
+- int i, dev_no;
+- int found = 0;
+-
+- dev_no = dev->devfn >> 3;
+- for (i = dev_no; i >= 0; i--) {
+- host_bridge = pci_get_slot(dev->bus, PCI_DEVFN(i, 0));
+- if (!host_bridge)
+- continue;
+-
+- pos = pci_find_ht_capability(host_bridge, HT_CAPTYPE_SLAVE);
+- if (pos != 0) {
+- found = 1;
+- break;
+- }
+- pci_dev_put(host_bridge);
+- }
+-
+- if (!found)
+- return;
+-
+- /* root did that ! */
+- if (msi_ht_cap_enabled(host_bridge))
+- goto out;
+-
+- ht_enable_msi_mapping(dev);
+-
+-out:
+- pci_dev_put(host_bridge);
+-}
+-
+-static void __devinit ht_disable_msi_mapping(struct pci_dev *dev)
+-{
+- int pos, ttl = 48;
+-
+- pos = pci_find_ht_capability(dev, HT_CAPTYPE_MSI_MAPPING);
+- while (pos && ttl--) {
+- u8 flags;
+-
+- if (pci_read_config_byte(dev, pos + HT_MSI_FLAGS,
+- &flags) == 0) {
+- dev_info(&dev->dev, "Disabling HT MSI Mapping\n");
+-
+- pci_write_config_byte(dev, pos + HT_MSI_FLAGS,
+- flags & ~HT_MSI_FLAGS_ENABLE);
+- }
+- pos = pci_find_next_ht_capability(dev, pos,
+- HT_CAPTYPE_MSI_MAPPING);
+- }
+-}
+-
+-static int __devinit ht_check_msi_mapping(struct pci_dev *dev)
+-{
+- int pos, ttl = 48;
+- int found = 0;
+-
+- /* check if there is HT MSI cap or enabled on this device */
+- pos = pci_find_ht_capability(dev, HT_CAPTYPE_MSI_MAPPING);
+- while (pos && ttl--) {
+- u8 flags;
+-
+- if (found < 1)
+- found = 1;
+- if (pci_read_config_byte(dev, pos + HT_MSI_FLAGS,
+- &flags) == 0) {
+- if (flags & HT_MSI_FLAGS_ENABLE) {
+- if (found < 2) {
+- found = 2;
+- break;
+- }
+- }
+- }
+- pos = pci_find_next_ht_capability(dev, pos,
+- HT_CAPTYPE_MSI_MAPPING);
+- }
+-
+- return found;
+-}
+-
+ static void __devinit nv_msi_ht_cap_quirk(struct pci_dev *dev)
+ {
+ struct pci_dev *host_bridge;
+- int pos;
+- int found;
+-
+- /* Enabling HT MSI mapping on this device breaks MCP51 */
+- if (dev->device == 0x270)
+- return;
+-
+- /* check if there is HT MSI cap or enabled on this device */
+- found = ht_check_msi_mapping(dev);
+-
+- /* no HT MSI CAP */
+- if (found == 0)
+- return;
++ int pos, ttl = 48;
+
+ /*
+ * HT MSI mapping should be disabled on devices that are below
+@@ -2191,19 +2067,24 @@
+ pos = pci_find_ht_capability(host_bridge, HT_CAPTYPE_SLAVE);
+ if (pos != 0) {
+ /* Host bridge is to HT */
+- if (found == 1) {
+- /* it is not enabled, try to enable it */
+- nv_ht_enable_msi_mapping(dev);
+- }
++ ht_enable_msi_mapping(dev);
+ return;
+ }
+
+- /* HT MSI is not enabled */
+- if (found == 1)
+- return;
+-
+ /* Host bridge is not to HT, disable HT MSI mapping on this device */
+- ht_disable_msi_mapping(dev);
++ pos = pci_find_ht_capability(dev, HT_CAPTYPE_MSI_MAPPING);
++ while (pos && ttl--) {
++ u8 flags;
++
++ if (pci_read_config_byte(dev, pos + HT_MSI_FLAGS,
++ &flags) == 0) {
++ dev_info(&dev->dev, "Disabling HT MSI mapping");
++ pci_write_config_byte(dev, pos + HT_MSI_FLAGS,
++ flags & ~HT_MSI_FLAGS_ENABLE);
++ }
++ pos = pci_find_next_ht_capability(dev, pos,
++ HT_CAPTYPE_MSI_MAPPING);
++ }
+ }
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, nv_msi_ht_cap_quirk);
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL, PCI_ANY_ID, nv_msi_ht_cap_quirk);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/pci/rom.c linux-2.6.29-rc3.owrt/drivers/pci/rom.c
+--- linux-2.6.29.owrt/drivers/pci/rom.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/pci/rom.c 2009-05-10 23:48:29.000000000 +0200
+@@ -55,7 +55,6 @@
+
+ /**
+ * pci_get_rom_size - obtain the actual size of the ROM image
+- * @pdev: target PCI device
+ * @rom: kernel virtual pointer to image of ROM
+ * @size: size of PCI window
+ * return: size of actual ROM image
+@@ -64,7 +63,7 @@
+ * The PCI window size could be much larger than the
+ * actual image size.
+ */
+-size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size)
++size_t pci_get_rom_size(void __iomem *rom, size_t size)
+ {
+ void __iomem *image;
+ int last_image;
+@@ -73,10 +72,8 @@
+ do {
+ void __iomem *pds;
+ /* Standard PCI ROMs start out with these bytes 55 AA */
+- if (readb(image) != 0x55) {
+- dev_err(&pdev->dev, "Invalid ROM contents\n");
++ if (readb(image) != 0x55)
+ break;
+- }
+ if (readb(image + 1) != 0xAA)
+ break;
+ /* get the PCI data structure and check its signature */
+@@ -162,7 +159,7 @@
+ * size is much larger than the actual size of the ROM.
+ * True size is important if the ROM is going to be copied.
+ */
+- *size = pci_get_rom_size(pdev, rom, *size);
++ *size = pci_get_rom_size(rom, *size);
+ return rom;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/platform/x86/acer-wmi.c linux-2.6.29-rc3.owrt/drivers/platform/x86/acer-wmi.c
+--- linux-2.6.29.owrt/drivers/platform/x86/acer-wmi.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/platform/x86/acer-wmi.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1026,7 +1026,7 @@
+ kfree(wireless_rfkill->data);
+ rfkill_unregister(wireless_rfkill);
+ if (has_cap(ACER_CAP_BLUETOOTH)) {
+- kfree(bluetooth_rfkill->data);
++ kfree(wireless_rfkill->data);
+ rfkill_unregister(bluetooth_rfkill);
+ }
+ return;
+@@ -1297,7 +1297,7 @@
+
+ set_quirks();
+
+- if (acpi_video_backlight_support() && has_cap(ACER_CAP_BRIGHTNESS)) {
++ if (!acpi_video_backlight_support() && has_cap(ACER_CAP_BRIGHTNESS)) {
+ interface->capability &= ~ACER_CAP_BRIGHTNESS;
+ printk(ACER_INFO "Brightness must be controlled by "
+ "generic video driver\n");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/platform/x86/asus_acpi.c linux-2.6.29-rc3.owrt/drivers/platform/x86/asus_acpi.c
+--- linux-2.6.29.owrt/drivers/platform/x86/asus_acpi.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/platform/x86/asus_acpi.c 2009-05-10 23:48:29.000000000 +0200
+@@ -143,7 +143,6 @@
+ S1300N, S5200N*/
+ A4S, /* Z81sp */
+ F3Sa, /* (Centrino) */
+- R1F,
+ END_MODEL
+ } model; /* Models currently supported */
+ u16 event_count[128]; /* Count for each event TODO make this better */
+@@ -421,18 +420,7 @@
+ .display_get = "\\ADVG",
+ .display_set = "SDSP",
+ },
+- {
+- .name = "R1F",
+- .mt_bt_switch = "BLED",
+- .mt_mled = "MLED",
+- .mt_wled = "WLED",
+- .mt_lcd_switch = "\\Q10",
+- .lcd_status = "\\GP06",
+- .brightness_set = "SPLV",
+- .brightness_get = "GPLV",
+- .display_set = "SDSP",
+- .display_get = "\\INFB"
+- }
++
+ };
+
+ /* procdir we use */
+@@ -1177,8 +1165,6 @@
+ return W3V;
+ else if (strncmp(model, "W5A", 3) == 0)
+ return W5A;
+- else if (strncmp(model, "R1F", 3) == 0)
+- return R1F;
+ else if (strncmp(model, "A4S", 3) == 0)
+ return A4S;
+ else if (strncmp(model, "F3Sa", 4) == 0)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/platform/x86/asus-laptop.c linux-2.6.29-rc3.owrt/drivers/platform/x86/asus-laptop.c
+--- linux-2.6.29.owrt/drivers/platform/x86/asus-laptop.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/platform/x86/asus-laptop.c 2009-05-10 23:48:29.000000000 +0200
+@@ -46,7 +46,6 @@
+ #include <acpi/acpi_drivers.h>
+ #include <acpi/acpi_bus.h>
+ #include <asm/uaccess.h>
+-#include <linux/input.h>
+
+ #define ASUS_LAPTOP_VERSION "0.42"
+
+@@ -182,8 +181,6 @@
+ u8 light_level; //light sensor level
+ u8 light_switch; //light sensor switch value
+ u16 event_count[128]; //count for each event TODO make this better
+- struct input_dev *inputdev;
+- u16 *keycode_map;
+ };
+
+ /*
+@@ -253,37 +250,6 @@
+ ASUS_LED(pled, "phone");
+ ASUS_LED(gled, "gaming");
+
+-struct key_entry {
+- char type;
+- u8 code;
+- u16 keycode;
+-};
+-
+-enum { KE_KEY, KE_END };
+-
+-static struct key_entry asus_keymap[] = {
+- {KE_KEY, 0x30, KEY_VOLUMEUP},
+- {KE_KEY, 0x31, KEY_VOLUMEDOWN},
+- {KE_KEY, 0x32, KEY_MUTE},
+- {KE_KEY, 0x33, KEY_SWITCHVIDEOMODE},
+- {KE_KEY, 0x34, KEY_SWITCHVIDEOMODE},
+- {KE_KEY, 0x40, KEY_PREVIOUSSONG},
+- {KE_KEY, 0x41, KEY_NEXTSONG},
+- {KE_KEY, 0x43, KEY_STOP},
+- {KE_KEY, 0x45, KEY_PLAYPAUSE},
+- {KE_KEY, 0x50, KEY_EMAIL},
+- {KE_KEY, 0x51, KEY_WWW},
+- {KE_KEY, 0x5C, BTN_EXTRA}, /* Performance */
+- {KE_KEY, 0x5D, KEY_WLAN},
+- {KE_KEY, 0x61, KEY_SWITCHVIDEOMODE},
+- {KE_KEY, 0x6B, BTN_TOUCH}, /* Lock Mouse */
+- {KE_KEY, 0x82, KEY_CAMERA},
+- {KE_KEY, 0x8A, KEY_TV},
+- {KE_KEY, 0x95, KEY_MEDIA},
+- {KE_KEY, 0x99, KEY_PHONE},
+- {KE_END, 0},
+-};
+-
+ /*
+ * This function evaluates an ACPI method, given an int as parameter, the
+ * method is searched within the scope of the handle, can be NULL. The output
+@@ -754,69 +720,8 @@
+ return store_status(buf, count, NULL, GPS_ON);
+ }
+
+-/*
+- * Hotkey functions
+- */
+-static struct key_entry *asus_get_entry_by_scancode(int code)
+-{
+- struct key_entry *key;
+-
+- for (key = asus_keymap; key->type != KE_END; key++)
+- if (code == key->code)
+- return key;
+-
+- return NULL;
+-}
+-
+-static struct key_entry *asus_get_entry_by_keycode(int code)
+-{
+- struct key_entry *key;
+-
+- for (key = asus_keymap; key->type != KE_END; key++)
+- if (code == key->keycode && key->type == KE_KEY)
+- return key;
+-
+- return NULL;
+-}
+-
+-static int asus_getkeycode(struct input_dev *dev, int scancode, int *keycode)
+-{
+- struct key_entry *key = asus_get_entry_by_scancode(scancode);
+-
+- if (key && key->type == KE_KEY) {
+- *keycode = key->keycode;
+- return 0;
+- }
+-
+- return -EINVAL;
+-}
+-
+-static int asus_setkeycode(struct input_dev *dev, int scancode, int keycode)
+-{
+- struct key_entry *key;
+- int old_keycode;
+-
+- if (keycode < 0 || keycode > KEY_MAX)
+- return -EINVAL;
+-
+- key = asus_get_entry_by_scancode(scancode);
+- if (key && key->type == KE_KEY) {
+- old_keycode = key->keycode;
+- key->keycode = keycode;
+- set_bit(keycode, dev->keybit);
+- if (!asus_get_entry_by_keycode(old_keycode))
+- clear_bit(old_keycode, dev->keybit);
+- return 0;
+- }
+-
+- return -EINVAL;
+-}
+-
+ static void asus_hotk_notify(acpi_handle handle, u32 event, void *data)
+ {
+- static struct key_entry *key;
+- u16 count;
+-
+ /* TODO Find a better way to handle events count. */
+ if (!hotk)
+ return;
+@@ -833,26 +738,10 @@
+ lcd_blank(FB_BLANK_POWERDOWN);
+ }
+
+- count = hotk->event_count[event % 128]++;
+- acpi_bus_generate_proc_event(hotk->device, event, count);
+- acpi_bus_generate_netlink_event(hotk->device->pnp.device_class,
+- dev_name(&hotk->device->dev), event,
+- count);
+-
+- if (hotk->inputdev) {
+- key = asus_get_entry_by_scancode(event);
+- if (!key)
+- return ;
+-
+- switch (key->type) {
+- case KE_KEY:
+- input_report_key(hotk->inputdev, key->keycode, 1);
+- input_sync(hotk->inputdev);
+- input_report_key(hotk->inputdev, key->keycode, 0);
+- input_sync(hotk->inputdev);
+- break;
+- }
+- }
++ acpi_bus_generate_proc_event(hotk->device, event,
++ hotk->event_count[event % 128]++);
++
++ return;
+ }
+
+ #define ASUS_CREATE_DEVICE_ATTR(_name) \
+@@ -1070,38 +959,6 @@
+ return AE_OK;
+ }
+
+-static int asus_input_init(void)
+-{
+- const struct key_entry *key;
+- int result;
+-
+- hotk->inputdev = input_allocate_device();
+- if (!hotk->inputdev) {
+- printk(ASUS_INFO "Unable to allocate input device\n");
+- return 0;
+- }
+- hotk->inputdev->name = "Asus Laptop extra buttons";
+- hotk->inputdev->phys = ASUS_HOTK_FILE "/input0";
+- hotk->inputdev->id.bustype = BUS_HOST;
+- hotk->inputdev->getkeycode = asus_getkeycode;
+- hotk->inputdev->setkeycode = asus_setkeycode;
+-
+- for (key = asus_keymap; key->type != KE_END; key++) {
+- switch (key->type) {
+- case KE_KEY:
+- set_bit(EV_KEY, hotk->inputdev->evbit);
+- set_bit(key->keycode, hotk->inputdev->keybit);
+- break;
+- }
+- }
+- result = input_register_device(hotk->inputdev);
+- if (result) {
+- printk(ASUS_INFO "Unable to register input device\n");
+- input_free_device(hotk->inputdev);
+- }
+- return result;
+-}
+-
+ static int asus_hotk_check(void)
+ {
+ int result = 0;
+@@ -1187,7 +1044,7 @@
+ /* GPS is on by default */
+ write_status(NULL, 1, GPS_ON);
+
+-end:
++ end:
+ if (result) {
+ kfree(hotk->name);
+ kfree(hotk);
+@@ -1234,17 +1091,10 @@
+ ASUS_LED_UNREGISTER(gled);
+ }
+
+-static void asus_input_exit(void)
+-{
+- if (hotk->inputdev)
+- input_unregister_device(hotk->inputdev);
+-}
+-
+ static void __exit asus_laptop_exit(void)
+ {
+ asus_backlight_exit();
+ asus_led_exit();
+- asus_input_exit();
+
+ acpi_bus_unregister_driver(&asus_hotk_driver);
+ sysfs_remove_group(&asuspf_device->dev.kobj, &asuspf_attribute_group);
+@@ -1366,10 +1216,6 @@
+ printk(ASUS_INFO "Brightness ignored, must be controlled by "
+ "ACPI video driver\n");
+
+- result = asus_input_init();
+- if (result)
+- goto fail_input;
+-
+ result = asus_led_init(dev);
+ if (result)
+ goto fail_led;
+@@ -1396,25 +1242,22 @@
+
+ return 0;
+
+-fail_sysfs:
++ fail_sysfs:
+ platform_device_del(asuspf_device);
+
+-fail_platform_device2:
++ fail_platform_device2:
+ platform_device_put(asuspf_device);
+
+-fail_platform_device1:
++ fail_platform_device1:
+ platform_driver_unregister(&asuspf_driver);
+
+-fail_platform_driver:
++ fail_platform_driver:
+ asus_led_exit();
+
+-fail_led:
+- asus_input_exit();
+-
+-fail_input:
++ fail_led:
+ asus_backlight_exit();
+
+-fail_backlight:
++ fail_backlight:
+
+ return result;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/platform/x86/eeepc-laptop.c linux-2.6.29-rc3.owrt/drivers/platform/x86/eeepc-laptop.c
+--- linux-2.6.29.owrt/drivers/platform/x86/eeepc-laptop.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/platform/x86/eeepc-laptop.c 2009-05-10 23:48:29.000000000 +0200
+@@ -30,7 +30,6 @@
+ #include <linux/uaccess.h>
+ #include <linux/input.h>
+ #include <linux/rfkill.h>
+-#include <linux/pci.h>
+
+ #define EEEPC_LAPTOP_VERSION "0.1"
+
+@@ -162,10 +161,6 @@
+ {KE_KEY, 0x13, KEY_MUTE },
+ {KE_KEY, 0x14, KEY_VOLUMEDOWN },
+ {KE_KEY, 0x15, KEY_VOLUMEUP },
+- {KE_KEY, 0x1a, KEY_COFFEE },
+- {KE_KEY, 0x1b, KEY_ZOOM },
+- {KE_KEY, 0x1c, KEY_PROG2 },
+- {KE_KEY, 0x1d, KEY_PROG3 },
+ {KE_KEY, 0x30, KEY_SWITCHVIDEOMODE },
+ {KE_KEY, 0x31, KEY_SWITCHVIDEOMODE },
+ {KE_KEY, 0x32, KEY_SWITCHVIDEOMODE },
+@@ -515,59 +510,18 @@
+ static void notify_brn(void)
+ {
+ struct backlight_device *bd = eeepc_backlight_device;
+- if (bd)
+- bd->props.brightness = read_brightness(bd);
+-}
+-
+-static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data)
+-{
+- struct pci_dev *dev;
+- struct pci_bus *bus = pci_find_bus(0, 1);
+-
+- if (event != ACPI_NOTIFY_BUS_CHECK)
+- return;
+-
+- if (!bus) {
+- printk(EEEPC_WARNING "Unable to find PCI bus 1?\n");
+- return;
+- }
+-
+- if (get_acpi(CM_ASL_WLAN) == 1) {
+- dev = pci_get_slot(bus, 0);
+- if (dev) {
+- /* Device already present */
+- pci_dev_put(dev);
+- return;
+- }
+- dev = pci_scan_single_device(bus, 0);
+- if (dev) {
+- pci_bus_assign_resources(bus);
+- if (pci_bus_add_device(dev))
+- printk(EEEPC_ERR "Unable to hotplug wifi\n");
+- }
+- } else {
+- dev = pci_get_slot(bus, 0);
+- if (dev) {
+- pci_remove_bus_device(dev);
+- pci_dev_put(dev);
+- }
+- }
++ bd->props.brightness = read_brightness(bd);
+ }
+
+ static void eeepc_hotk_notify(acpi_handle handle, u32 event, void *data)
+ {
+ static struct key_entry *key;
+- u16 count;
+-
+ if (!ehotk)
+ return;
+ if (event >= NOTIFY_BRN_MIN && event <= NOTIFY_BRN_MAX)
+ notify_brn();
+- count = ehotk->event_count[event % 128]++;
+- acpi_bus_generate_proc_event(ehotk->device, event, count);
+- acpi_bus_generate_netlink_event(ehotk->device->pnp.device_class,
+- dev_name(&ehotk->device->dev), event,
+- count);
++ acpi_bus_generate_proc_event(ehotk->device, event,
++ ehotk->event_count[event % 128]++);
+ if (ehotk->inputdev) {
+ key = eepc_get_entry_by_scancode(event);
+ if (key) {
+@@ -585,45 +539,6 @@
+ }
+ }
+
+-static int eeepc_register_rfkill_notifier(char *node)
+-{
+- acpi_status status = AE_OK;
+- acpi_handle handle;
+-
+- status = acpi_get_handle(NULL, node, &handle);
+-
+- if (ACPI_SUCCESS(status)) {
+- status = acpi_install_notify_handler(handle,
+- ACPI_SYSTEM_NOTIFY,
+- eeepc_rfkill_notify,
+- NULL);
+- if (ACPI_FAILURE(status))
+- printk(EEEPC_WARNING
+- "Failed to register notify on %s\n", node);
+- } else
+- return -ENODEV;
+-
+- return 0;
+-}
+-
+-static void eeepc_unregister_rfkill_notifier(char *node)
+-{
+- acpi_status status = AE_OK;
+- acpi_handle handle;
+-
+- status = acpi_get_handle(NULL, node, &handle);
+-
+- if (ACPI_SUCCESS(status)) {
+- status = acpi_remove_notify_handler(handle,
+- ACPI_SYSTEM_NOTIFY,
+- eeepc_rfkill_notify);
+- if (ACPI_FAILURE(status))
+- printk(EEEPC_ERR
+- "Error removing rfkill notify handler %s\n",
+- node);
+- }
+-}
+-
+ static int eeepc_hotk_add(struct acpi_device *device)
+ {
+ acpi_status status = AE_OK;
+@@ -643,7 +558,7 @@
+ ehotk->device = device;
+ result = eeepc_hotk_check();
+ if (result)
+- goto ehotk_fail;
++ goto end;
+ status = acpi_install_notify_handler(ehotk->handle, ACPI_SYSTEM_NOTIFY,
+ eeepc_hotk_notify, ehotk);
+ if (ACPI_FAILURE(status))
+@@ -654,25 +569,18 @@
+ RFKILL_TYPE_WLAN);
+
+ if (!ehotk->eeepc_wlan_rfkill)
+- goto wlan_fail;
++ goto end;
+
+ ehotk->eeepc_wlan_rfkill->name = "eeepc-wlan";
+ ehotk->eeepc_wlan_rfkill->toggle_radio = eeepc_wlan_rfkill_set;
+ ehotk->eeepc_wlan_rfkill->get_state = eeepc_wlan_rfkill_state;
+- if (get_acpi(CM_ASL_WLAN) == 1) {
++ if (get_acpi(CM_ASL_WLAN) == 1)
+ ehotk->eeepc_wlan_rfkill->state =
+ RFKILL_STATE_UNBLOCKED;
+- rfkill_set_default(RFKILL_TYPE_WLAN,
+- RFKILL_STATE_UNBLOCKED);
+- } else {
++ else
+ ehotk->eeepc_wlan_rfkill->state =
+ RFKILL_STATE_SOFT_BLOCKED;
+- rfkill_set_default(RFKILL_TYPE_WLAN,
+- RFKILL_STATE_SOFT_BLOCKED);
+- }
+- result = rfkill_register(ehotk->eeepc_wlan_rfkill);
+- if (result)
+- goto wlan_fail;
++ rfkill_register(ehotk->eeepc_wlan_rfkill);
+ }
+
+ if (get_acpi(CM_ASL_BLUETOOTH) != -1) {
+@@ -680,47 +588,27 @@
+ rfkill_allocate(&device->dev, RFKILL_TYPE_BLUETOOTH);
+
+ if (!ehotk->eeepc_bluetooth_rfkill)
+- goto bluetooth_fail;
++ goto end;
+
+ ehotk->eeepc_bluetooth_rfkill->name = "eeepc-bluetooth";
+ ehotk->eeepc_bluetooth_rfkill->toggle_radio =
+ eeepc_bluetooth_rfkill_set;
+ ehotk->eeepc_bluetooth_rfkill->get_state =
+ eeepc_bluetooth_rfkill_state;
+- if (get_acpi(CM_ASL_BLUETOOTH) == 1) {
++ if (get_acpi(CM_ASL_BLUETOOTH) == 1)
+ ehotk->eeepc_bluetooth_rfkill->state =
+ RFKILL_STATE_UNBLOCKED;
+- rfkill_set_default(RFKILL_TYPE_BLUETOOTH,
+- RFKILL_STATE_UNBLOCKED);
+- } else {
++ else
+ ehotk->eeepc_bluetooth_rfkill->state =
+ RFKILL_STATE_SOFT_BLOCKED;
+- rfkill_set_default(RFKILL_TYPE_BLUETOOTH,
+- RFKILL_STATE_SOFT_BLOCKED);
+- }
+-
+- result = rfkill_register(ehotk->eeepc_bluetooth_rfkill);
+- if (result)
+- goto bluetooth_fail;
++ rfkill_register(ehotk->eeepc_bluetooth_rfkill);
+ }
+
+- eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P6");
+- eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P7");
+-
+- return 0;
+-
+- bluetooth_fail:
+- if (ehotk->eeepc_bluetooth_rfkill)
+- rfkill_free(ehotk->eeepc_bluetooth_rfkill);
+- rfkill_unregister(ehotk->eeepc_wlan_rfkill);
+- ehotk->eeepc_wlan_rfkill = NULL;
+- wlan_fail:
+- if (ehotk->eeepc_wlan_rfkill)
+- rfkill_free(ehotk->eeepc_wlan_rfkill);
+- ehotk_fail:
+- kfree(ehotk);
+- ehotk = NULL;
+-
++ end:
++ if (result) {
++ kfree(ehotk);
++ ehotk = NULL;
++ }
+ return result;
+ }
+
+@@ -734,10 +622,6 @@
+ eeepc_hotk_notify);
+ if (ACPI_FAILURE(status))
+ printk(EEEPC_ERR "Error removing notify handler\n");
+-
+- eeepc_unregister_rfkill_notifier("\\_SB.PCI0.P0P6");
+- eeepc_unregister_rfkill_notifier("\\_SB.PCI0.P0P7");
+-
+ kfree(ehotk);
+ return 0;
+ }
+@@ -853,21 +737,13 @@
+ {
+ if (eeepc_backlight_device)
+ backlight_device_unregister(eeepc_backlight_device);
+- eeepc_backlight_device = NULL;
+-}
+-
+-static void eeepc_rfkill_exit(void)
+-{
++ if (ehotk->inputdev)
++ input_unregister_device(ehotk->inputdev);
+ if (ehotk->eeepc_wlan_rfkill)
+ rfkill_unregister(ehotk->eeepc_wlan_rfkill);
+ if (ehotk->eeepc_bluetooth_rfkill)
+ rfkill_unregister(ehotk->eeepc_bluetooth_rfkill);
+-}
+-
+-static void eeepc_input_exit(void)
+-{
+- if (ehotk->inputdev)
+- input_unregister_device(ehotk->inputdev);
++ eeepc_backlight_device = NULL;
+ }
+
+ static void eeepc_hwmon_exit(void)
+@@ -886,8 +762,6 @@
+ static void __exit eeepc_laptop_exit(void)
+ {
+ eeepc_backlight_exit();
+- eeepc_rfkill_exit();
+- eeepc_input_exit();
+ eeepc_hwmon_exit();
+ acpi_bus_unregister_driver(&eeepc_hotk_driver);
+ sysfs_remove_group(&platform_device->dev.kobj,
+@@ -991,8 +865,6 @@
+ fail_hwmon:
+ eeepc_backlight_exit();
+ fail_backlight:
+- eeepc_input_exit();
+- eeepc_rfkill_exit();
+ return result;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/platform/x86/fujitsu-laptop.c linux-2.6.29-rc3.owrt/drivers/platform/x86/fujitsu-laptop.c
+--- linux-2.6.29.owrt/drivers/platform/x86/fujitsu-laptop.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/platform/x86/fujitsu-laptop.c 2009-05-10 23:48:29.000000000 +0200
+@@ -166,7 +166,6 @@
+ struct platform_device *pf_device;
+ struct kfifo *fifo;
+ spinlock_t fifo_lock;
+- int rfkill_supported;
+ int rfkill_state;
+ int logolamp_registered;
+ int kblamps_registered;
+@@ -527,7 +526,7 @@
+ show_lid_state(struct device *dev,
+ struct device_attribute *attr, char *buf)
+ {
+- if (!(fujitsu_hotkey->rfkill_supported & 0x100))
++ if (fujitsu_hotkey->rfkill_state == UNSUPPORTED_CMD)
+ return sprintf(buf, "unknown\n");
+ if (fujitsu_hotkey->rfkill_state & 0x100)
+ return sprintf(buf, "open\n");
+@@ -539,7 +538,7 @@
+ show_dock_state(struct device *dev,
+ struct device_attribute *attr, char *buf)
+ {
+- if (!(fujitsu_hotkey->rfkill_supported & 0x200))
++ if (fujitsu_hotkey->rfkill_state == UNSUPPORTED_CMD)
+ return sprintf(buf, "unknown\n");
+ if (fujitsu_hotkey->rfkill_state & 0x200)
+ return sprintf(buf, "docked\n");
+@@ -551,7 +550,7 @@
+ show_radios_state(struct device *dev,
+ struct device_attribute *attr, char *buf)
+ {
+- if (!(fujitsu_hotkey->rfkill_supported & 0x20))
++ if (fujitsu_hotkey->rfkill_state == UNSUPPORTED_CMD)
+ return sprintf(buf, "unknown\n");
+ if (fujitsu_hotkey->rfkill_state & 0x20)
+ return sprintf(buf, "on\n");
+@@ -929,17 +928,8 @@
+ ; /* No action, result is discarded */
+ vdbg_printk(FUJLAPTOP_DBG_INFO, "Discarded %i ringbuffer entries\n", i);
+
+- fujitsu_hotkey->rfkill_supported =
+- call_fext_func(FUNC_RFKILL, 0x0, 0x0, 0x0);
+-
+- /* Make sure our bitmask of supported functions is cleared if the
+- RFKILL function block is not implemented, like on the S7020. */
+- if (fujitsu_hotkey->rfkill_supported == UNSUPPORTED_CMD)
+- fujitsu_hotkey->rfkill_supported = 0;
+-
+- if (fujitsu_hotkey->rfkill_supported)
+- fujitsu_hotkey->rfkill_state =
+- call_fext_func(FUNC_RFKILL, 0x4, 0x0, 0x0);
++ fujitsu_hotkey->rfkill_state =
++ call_fext_func(FUNC_RFKILL, 0x4, 0x0, 0x0);
+
+ /* Suspect this is a keymap of the application panel, print it */
+ printk(KERN_INFO "fujitsu-laptop: BTNI: [0x%x]\n",
+@@ -1015,9 +1005,8 @@
+
+ input = fujitsu_hotkey->input;
+
+- if (fujitsu_hotkey->rfkill_supported)
+- fujitsu_hotkey->rfkill_state =
+- call_fext_func(FUNC_RFKILL, 0x4, 0x0, 0x0);
++ fujitsu_hotkey->rfkill_state =
++ call_fext_func(FUNC_RFKILL, 0x4, 0x0, 0x0);
+
+ switch (event) {
+ case ACPI_FUJITSU_NOTIFY_CODE1:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/platform/x86/hp-wmi.c linux-2.6.29-rc3.owrt/drivers/platform/x86/hp-wmi.c
+--- linux-2.6.29.owrt/drivers/platform/x86/hp-wmi.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/platform/x86/hp-wmi.c 2009-05-10 23:48:29.000000000 +0200
+@@ -382,11 +382,6 @@
+ case KE_SW:
+ set_bit(EV_SW, hp_wmi_input_dev->evbit);
+ set_bit(key->keycode, hp_wmi_input_dev->swbit);
+-
+- /* Set initial dock state */
+- input_report_switch(hp_wmi_input_dev, key->keycode,
+- hp_wmi_dock_state());
+- input_sync(hp_wmi_input_dev);
+ break;
+ }
+ }
+@@ -446,7 +441,6 @@
+ bluetooth_rfkill->toggle_radio = hp_wmi_bluetooth_set;
+ bluetooth_rfkill->user_claim_unsupported = 1;
+ err = rfkill_register(bluetooth_rfkill);
+- if (err)
+ goto register_bluetooth_error;
+ }
+
+@@ -463,11 +457,9 @@
+
+ return 0;
+ register_wwan_err:
+- if (bluetooth_rfkill)
+- rfkill_unregister(bluetooth_rfkill);
++ rfkill_unregister(bluetooth_rfkill);
+ register_bluetooth_error:
+- if (wifi_rfkill)
+- rfkill_unregister(wifi_rfkill);
++ rfkill_unregister(wifi_rfkill);
+ add_sysfs_error:
+ cleanup_sysfs(device);
+ return err;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/platform/x86/Kconfig linux-2.6.29-rc3.owrt/drivers/platform/x86/Kconfig
+--- linux-2.6.29.owrt/drivers/platform/x86/Kconfig 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/platform/x86/Kconfig 2009-05-10 23:48:29.000000000 +0200
+@@ -15,7 +15,8 @@
+ if X86_PLATFORM_DEVICES
+
+ config ACER_WMI
+- tristate "Acer WMI Laptop Extras"
++ tristate "Acer WMI Laptop Extras (EXPERIMENTAL)"
++ depends on EXPERIMENTAL
+ depends on ACPI
+ depends on LEDS_CLASS
+ depends on NEW_LEDS
+@@ -38,10 +39,9 @@
+ tristate "Asus Laptop Extras (EXPERIMENTAL)"
+ depends on ACPI
+ depends on EXPERIMENTAL && !ACPI_ASUS
+- select LEDS_CLASS
+- select NEW_LEDS
+- select BACKLIGHT_CLASS_DEVICE
+- depends on INPUT
++ depends on LEDS_CLASS
++ depends on NEW_LEDS
++ depends on BACKLIGHT_CLASS_DEVICE
+ ---help---
+ This is the new Linux driver for Asus laptops. It may also support some
+ MEDION, JVC or VICTOR laptops. It makes all the extra buttons generate
+@@ -61,7 +61,6 @@
+ depends on EXPERIMENTAL
+ depends on BACKLIGHT_CLASS_DEVICE
+ depends on RFKILL
+- depends on POWER_SUPPLY
+ default n
+ ---help---
+ This driver adds support for rfkill and backlight control to Dell
+@@ -184,11 +183,11 @@
+ config THINKPAD_ACPI
+ tristate "ThinkPad ACPI Laptop Extras"
+ depends on ACPI
+- depends on INPUT
+ select BACKLIGHT_LCD_SUPPORT
+ select BACKLIGHT_CLASS_DEVICE
+ select HWMON
+ select NVRAM
++ select INPUT
+ select NEW_LEDS
+ select LEDS_CLASS
+ select NET
+@@ -301,7 +300,6 @@
+ config EEEPC_LAPTOP
+ tristate "Eee PC Hotkey Driver (EXPERIMENTAL)"
+ depends on ACPI
+- depends on INPUT
+ depends on EXPERIMENTAL
+ select BACKLIGHT_CLASS_DEVICE
+ select HWMON
+@@ -314,8 +312,9 @@
+
+
+ config ACPI_WMI
+- tristate "WMI"
++ tristate "WMI (EXPERIMENTAL)"
+ depends on ACPI
++ depends on EXPERIMENTAL
+ help
+ This driver adds support for the ACPI-WMI (Windows Management
+ Instrumentation) mapper device (PNP0C14) found on some systems.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/platform/x86/panasonic-laptop.c linux-2.6.29-rc3.owrt/drivers/platform/x86/panasonic-laptop.c
+--- linux-2.6.29.owrt/drivers/platform/x86/panasonic-laptop.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/platform/x86/panasonic-laptop.c 2009-05-10 23:48:29.000000000 +0200
+@@ -507,7 +507,7 @@
+
+ hkey_num = result & 0xf;
+
+- if (hkey_num < 0 || hkey_num >= ARRAY_SIZE(pcc->keymap)) {
++ if (hkey_num < 0 || hkey_num > ARRAY_SIZE(pcc->keymap)) {
+ ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
+ "hotkey number out of range: %d\n",
+ hkey_num));
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/platform/x86/thinkpad_acpi.c linux-2.6.29-rc3.owrt/drivers/platform/x86/thinkpad_acpi.c
+--- linux-2.6.29.owrt/drivers/platform/x86/thinkpad_acpi.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/platform/x86/thinkpad_acpi.c 2009-05-10 23:48:29.000000000 +0200
+@@ -7532,7 +7532,7 @@
+ * if it is not there yet.
+ */
+ #define IBM_BIOS_MODULE_ALIAS(__type) \
+- MODULE_ALIAS("dmi:bvnIBM:bvr" __type "ET??WW*")
++ MODULE_ALIAS("dmi:bvnIBM:bvr" __type "ET??WW")
+
+ /* Non-ancient thinkpads */
+ MODULE_ALIAS("dmi:bvnIBM:*:svnIBM:*:pvrThinkPad*:rvnIBM:*");
+@@ -7541,9 +7541,9 @@
+ /* Ancient thinkpad BIOSes have to be identified by
+ * BIOS type or model number, and there are far less
+ * BIOS types than model numbers... */
+-IBM_BIOS_MODULE_ALIAS("I[BDHIMNOTWVYZ]");
+-IBM_BIOS_MODULE_ALIAS("1[0368A-GIKM-PST]");
+-IBM_BIOS_MODULE_ALIAS("K[UX-Z]");
++IBM_BIOS_MODULE_ALIAS("I[B,D,H,I,M,N,O,T,W,V,Y,Z]");
++IBM_BIOS_MODULE_ALIAS("1[0,3,6,8,A-G,I,K,M-P,S,T]");
++IBM_BIOS_MODULE_ALIAS("K[U,X-Z]");
+
+ MODULE_AUTHOR("Borislav Deianov, Henrique de Moraes Holschuh");
+ MODULE_DESCRIPTION(TPACPI_DESC);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/platform/x86/wmi.c linux-2.6.29-rc3.owrt/drivers/platform/x86/wmi.c
+--- linux-2.6.29.owrt/drivers/platform/x86/wmi.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/platform/x86/wmi.c 2009-05-10 23:48:29.000000000 +0200
+@@ -708,7 +708,7 @@
+
+ static int __init acpi_wmi_init(void)
+ {
+- int result;
++ acpi_status result;
+
+ INIT_LIST_HEAD(&wmi_blocks.list);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/power/ds2760_battery.c linux-2.6.29-rc3.owrt/drivers/power/ds2760_battery.c
+--- linux-2.6.29.owrt/drivers/power/ds2760_battery.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/power/ds2760_battery.c 2009-05-10 23:48:29.000000000 +0200
+@@ -180,13 +180,10 @@
+ di->empty_uAh = battery_interpolate(scale, di->temp_C / 10);
+ di->empty_uAh *= 1000; /* convert to µAh */
+
+- if (di->full_active_uAh == di->empty_uAh)
+- di->rem_capacity = 0;
+- else
+- /* From Maxim Application Note 131: remaining capacity =
+- * ((ICA - Empty Value) / (Full Value - Empty Value)) x 100% */
+- di->rem_capacity = ((di->accum_current_uAh - di->empty_uAh) * 100L) /
+- (di->full_active_uAh - di->empty_uAh);
++ /* From Maxim Application Note 131: remaining capacity =
++ * ((ICA - Empty Value) / (Full Value - Empty Value)) x 100% */
++ di->rem_capacity = ((di->accum_current_uAh - di->empty_uAh) * 100L) /
++ (di->full_active_uAh - di->empty_uAh);
+
+ if (di->rem_capacity < 0)
+ di->rem_capacity = 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/power/pcf50633-charger.c linux-2.6.29-rc3.owrt/drivers/power/pcf50633-charger.c
+--- linux-2.6.29.owrt/drivers/power/pcf50633-charger.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/power/pcf50633-charger.c 2009-05-10 23:48:29.000000000 +0200
+@@ -199,8 +199,7 @@
+ enum power_supply_property psp,
+ union power_supply_propval *val)
+ {
+- struct pcf50633_mbc *mbc = container_of(psy,
+- struct pcf50633_mbc, adapter);
++ struct pcf50633_mbc *mbc = container_of(psy, struct pcf50633_mbc, usb);
+ int ret = 0;
+
+ switch (psp) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/regulator/bq24022.c linux-2.6.29-rc3.owrt/drivers/regulator/bq24022.c
+--- linux-2.6.29.owrt/drivers/regulator/bq24022.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/regulator/bq24022.c 2009-05-10 23:48:29.000000000 +0200
+@@ -152,7 +152,11 @@
+ platform_driver_unregister(&bq24022_driver);
+ }
+
+-module_init(bq24022_init);
++/*
++ * make sure this is probed before gpio_vbus and pda_power,
++ * but after asic3 or other GPIO expander drivers.
++ */
++subsys_initcall(bq24022_init);
+ module_exit(bq24022_exit);
+
+ MODULE_AUTHOR("Philipp Zabel");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/regulator/wm8350-regulator.c linux-2.6.29-rc3.owrt/drivers/regulator/wm8350-regulator.c
+--- linux-2.6.29.owrt/drivers/regulator/wm8350-regulator.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/regulator/wm8350-regulator.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1435,7 +1435,7 @@
+ struct platform_device *pdev;
+ int ret;
+
+- if (lednum >= ARRAY_SIZE(wm8350->pmic.led) || lednum < 0) {
++ if (lednum > ARRAY_SIZE(wm8350->pmic.led) || lednum < 0) {
+ dev_err(wm8350->dev, "Invalid LED index %d\n", lednum);
+ return -ENODEV;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/rtc/Kconfig linux-2.6.29-rc3.owrt/drivers/rtc/Kconfig
+--- linux-2.6.29.owrt/drivers/rtc/Kconfig 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/rtc/Kconfig 2009-05-10 23:48:29.000000000 +0200
+@@ -241,12 +241,6 @@
+ If you say Y here you will get support for the
+ watchdog timer in the ST M41T60 and M41T80 RTC chips series.
+
+-config RTC_DRV_DM355EVM
+- tristate "TI DaVinci DM355 EVM RTC"
+- depends on MFD_DM355EVM_MSP
+- help
+- Supports the RTC firmware in the MSP430 on the DM355 EVM.
+-
+ config RTC_DRV_TWL92330
+ boolean "TI TWL92330/Menelaus"
+ depends on MENELAUS
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/rtc/Makefile linux-2.6.29-rc3.owrt/drivers/rtc/Makefile
+--- linux-2.6.29.owrt/drivers/rtc/Makefile 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/rtc/Makefile 2009-05-10 23:48:29.000000000 +0200
+@@ -23,7 +23,6 @@
+ obj-$(CONFIG_RTC_DRV_AU1XXX) += rtc-au1xxx.o
+ obj-$(CONFIG_RTC_DRV_BFIN) += rtc-bfin.o
+ obj-$(CONFIG_RTC_DRV_CMOS) += rtc-cmos.o
+-obj-$(CONFIG_RTC_DRV_DM355EVM) += rtc-dm355evm.o
+ obj-$(CONFIG_RTC_DRV_DS1216) += rtc-ds1216.o
+ obj-$(CONFIG_RTC_DRV_DS1286) += rtc-ds1286.o
+ obj-$(CONFIG_RTC_DRV_DS1302) += rtc-ds1302.o
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/rtc/rtc-au1xxx.c linux-2.6.29-rc3.owrt/drivers/rtc/rtc-au1xxx.c
+--- linux-2.6.29.owrt/drivers/rtc/rtc-au1xxx.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/rtc/rtc-au1xxx.c 2009-05-10 23:48:29.000000000 +0200
+@@ -81,7 +81,7 @@
+ if (au_readl(SYS_TOYTRIM) != 32767) {
+ /* wait until hardware gives access to TRIM register */
+ t = 0x00100000;
+- while ((au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_T0S) && --t)
++ while ((au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_T0S) && t--)
+ msleep(1);
+
+ if (!t) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/rtc/rtc-dm355evm.c linux-2.6.29-rc3.owrt/drivers/rtc/rtc-dm355evm.c
+--- linux-2.6.29.owrt/drivers/rtc/rtc-dm355evm.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/rtc/rtc-dm355evm.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,175 +0,0 @@
+-/*
+- * rtc-dm355evm.c - access battery-backed counter in MSP430 firmware
+- *
+- * Copyright (c) 2008 by David Brownell
+- *
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU General Public License
+- * as published by the Free Software Foundation; either version
+- * 2 of the License, or (at your option) any later version.
+- */
+-#include <linux/kernel.h>
+-#include <linux/init.h>
+-#include <linux/rtc.h>
+-#include <linux/platform_device.h>
+-
+-#include <linux/i2c/dm355evm_msp.h>
+-
+-
+-/*
+- * The MSP430 firmware on the DM355 EVM uses a watch crystal to feed
+- * a 1 Hz counter. When a backup battery is supplied, that makes a
+- * reasonable RTC for applications where alarms and non-NTP drift
+- * compensation aren't important.
+- *
+- * The only real glitch is the inability to read or write all four
+- * counter bytes atomically: the count may increment in the middle
+- * of an operation, causing trouble when the LSB rolls over.
+- *
+- * This driver was tested with firmware revision A4.
+- */
+-union evm_time {
+- u8 bytes[4];
+- u32 value;
+-};
+-
+-static int dm355evm_rtc_read_time(struct device *dev, struct rtc_time *tm)
+-{
+- union evm_time time;
+- int status;
+- int tries = 0;
+-
+- do {
+- /*
+- * Read LSB(0) to MSB(3) bytes. Defend against the counter
+- * rolling over by re-reading until the value is stable,
+- * and assuming the four reads take at most a few seconds.
+- */
+- status = dm355evm_msp_read(DM355EVM_MSP_RTC_0);
+- if (status < 0)
+- return status;
+- if (tries && time.bytes[0] == status)
+- break;
+- time.bytes[0] = status;
+-
+- status = dm355evm_msp_read(DM355EVM_MSP_RTC_1);
+- if (status < 0)
+- return status;
+- if (tries && time.bytes[1] == status)
+- break;
+- time.bytes[1] = status;
+-
+- status = dm355evm_msp_read(DM355EVM_MSP_RTC_2);
+- if (status < 0)
+- return status;
+- if (tries && time.bytes[2] == status)
+- break;
+- time.bytes[2] = status;
+-
+- status = dm355evm_msp_read(DM355EVM_MSP_RTC_3);
+- if (status < 0)
+- return status;
+- if (tries && time.bytes[3] == status)
+- break;
+- time.bytes[3] = status;
+-
+- } while (++tries < 5);
+-
+- dev_dbg(dev, "read timestamp %08x\n", time.value);
+-
+- rtc_time_to_tm(le32_to_cpu(time.value), tm);
+- return 0;
+-}
+-
+-static int dm355evm_rtc_set_time(struct device *dev, struct rtc_time *tm)
+-{
+- union evm_time time;
+- unsigned long value;
+- int status;
+-
+- rtc_tm_to_time(tm, &value);
+- time.value = cpu_to_le32(value);
+-
+- dev_dbg(dev, "write timestamp %08x\n", time.value);
+-
+- /*
+- * REVISIT handle non-atomic writes ... maybe just retry until
+- * byte[1] sticks (no rollover)?
+- */
+- status = dm355evm_msp_write(time.bytes[0], DM355EVM_MSP_RTC_0);
+- if (status < 0)
+- return status;
+-
+- status = dm355evm_msp_write(time.bytes[1], DM355EVM_MSP_RTC_1);
+- if (status < 0)
+- return status;
+-
+- status = dm355evm_msp_write(time.bytes[2], DM355EVM_MSP_RTC_2);
+- if (status < 0)
+- return status;
+-
+- status = dm355evm_msp_write(time.bytes[3], DM355EVM_MSP_RTC_3);
+- if (status < 0)
+- return status;
+-
+- return 0;
+-}
+-
+-static struct rtc_class_ops dm355evm_rtc_ops = {
+- .read_time = dm355evm_rtc_read_time,
+- .set_time = dm355evm_rtc_set_time,
+-};
+-
+-/*----------------------------------------------------------------------*/
+-
+-static int __devinit dm355evm_rtc_probe(struct platform_device *pdev)
+-{
+- struct rtc_device *rtc;
+-
+- rtc = rtc_device_register(pdev->name,
+- &pdev->dev, &dm355evm_rtc_ops, THIS_MODULE);
+- if (IS_ERR(rtc)) {
+- dev_err(&pdev->dev, "can't register RTC device, err %ld\n",
+- PTR_ERR(rtc));
+- return PTR_ERR(rtc);
+- }
+- platform_set_drvdata(pdev, rtc);
+-
+- return 0;
+-}
+-
+-static int __devexit dm355evm_rtc_remove(struct platform_device *pdev)
+-{
+- struct rtc_device *rtc = platform_get_drvdata(pdev);
+-
+- rtc_device_unregister(rtc);
+- platform_set_drvdata(pdev, NULL);
+- return 0;
+-}
+-
+-/*
+- * I2C is used to talk to the MSP430, but this platform device is
+- * exposed by an MFD driver that manages I2C communications.
+- */
+-static struct platform_driver rtc_dm355evm_driver = {
+- .probe = dm355evm_rtc_probe,
+- .remove = __devexit_p(dm355evm_rtc_remove),
+- .driver = {
+- .owner = THIS_MODULE,
+- .name = "rtc-dm355evm",
+- },
+-};
+-
+-static int __init dm355evm_rtc_init(void)
+-{
+- return platform_driver_register(&rtc_dm355evm_driver);
+-}
+-module_init(dm355evm_rtc_init);
+-
+-static void __exit dm355evm_rtc_exit(void)
+-{
+- platform_driver_unregister(&rtc_dm355evm_driver);
+-}
+-module_exit(dm355evm_rtc_exit);
+-
+-MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/rtc/rtc-ds1390.c linux-2.6.29-rc3.owrt/drivers/rtc/rtc-ds1390.c
+--- linux-2.6.29.owrt/drivers/rtc/rtc-ds1390.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/rtc/rtc-ds1390.c 2009-05-10 23:48:29.000000000 +0200
+@@ -122,6 +122,7 @@
+
+ static int __devinit ds1390_probe(struct spi_device *spi)
+ {
++ struct rtc_device *rtc;
+ unsigned char tmp;
+ struct ds1390 *chip;
+ int res;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/rtc/rtc-pxa.c linux-2.6.29-rc3.owrt/drivers/rtc/rtc-pxa.c
+--- linux-2.6.29.owrt/drivers/rtc/rtc-pxa.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/rtc/rtc-pxa.c 2009-05-10 23:48:29.000000000 +0200
+@@ -485,7 +485,7 @@
+ module_init(pxa_rtc_init);
+ module_exit(pxa_rtc_exit);
+
+-MODULE_AUTHOR("Robert Jarzmik <robert.jarzmik@free.fr>");
++MODULE_AUTHOR("Robert Jarzmik");
+ MODULE_DESCRIPTION("PXA27x/PXA3xx Realtime Clock Driver (RTC)");
+ MODULE_LICENSE("GPL");
+ MODULE_ALIAS("platform:pxa-rtc");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/s390/block/dasd.c linux-2.6.29-rc3.owrt/drivers/s390/block/dasd.c
+--- linux-2.6.29.owrt/drivers/s390/block/dasd.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/s390/block/dasd.c 2009-05-10 23:48:29.000000000 +0200
+@@ -57,8 +57,6 @@
+ static void dasd_block_tasklet(struct dasd_block *);
+ static void do_kick_device(struct work_struct *);
+ static void dasd_return_cqr_cb(struct dasd_ccw_req *, void *);
+-static void dasd_device_timeout(unsigned long);
+-static void dasd_block_timeout(unsigned long);
+
+ /*
+ * SECTION: Operations on the device structure.
+@@ -101,8 +99,6 @@
+ (unsigned long) device);
+ INIT_LIST_HEAD(&device->ccw_queue);
+ init_timer(&device->timer);
+- device->timer.function = dasd_device_timeout;
+- device->timer.data = (unsigned long) device;
+ INIT_WORK(&device->kick_work, do_kick_device);
+ device->state = DASD_STATE_NEW;
+ device->target = DASD_STATE_NEW;
+@@ -142,8 +138,6 @@
+ INIT_LIST_HEAD(&block->ccw_queue);
+ spin_lock_init(&block->queue_lock);
+ init_timer(&block->timer);
+- block->timer.function = dasd_block_timeout;
+- block->timer.data = (unsigned long) block;
+
+ return block;
+ }
+@@ -921,10 +915,19 @@
+ */
+ void dasd_device_set_timer(struct dasd_device *device, int expires)
+ {
+- if (expires == 0)
+- del_timer(&device->timer);
+- else
+- mod_timer(&device->timer, jiffies + expires);
++ if (expires == 0) {
++ if (timer_pending(&device->timer))
++ del_timer(&device->timer);
++ return;
++ }
++ if (timer_pending(&device->timer)) {
++ if (mod_timer(&device->timer, jiffies + expires))
++ return;
++ }
++ device->timer.function = dasd_device_timeout;
++ device->timer.data = (unsigned long) device;
++ device->timer.expires = jiffies + expires;
++ add_timer(&device->timer);
+ }
+
+ /*
+@@ -932,7 +935,8 @@
+ */
+ void dasd_device_clear_timer(struct dasd_device *device)
+ {
+- del_timer(&device->timer);
++ if (timer_pending(&device->timer))
++ del_timer(&device->timer);
+ }
+
+ static void dasd_handle_killed_request(struct ccw_device *cdev,
+@@ -1582,10 +1586,19 @@
+ */
+ void dasd_block_set_timer(struct dasd_block *block, int expires)
+ {
+- if (expires == 0)
+- del_timer(&block->timer);
+- else
+- mod_timer(&block->timer, jiffies + expires);
++ if (expires == 0) {
++ if (timer_pending(&block->timer))
++ del_timer(&block->timer);
++ return;
++ }
++ if (timer_pending(&block->timer)) {
++ if (mod_timer(&block->timer, jiffies + expires))
++ return;
++ }
++ block->timer.function = dasd_block_timeout;
++ block->timer.data = (unsigned long) block;
++ block->timer.expires = jiffies + expires;
++ add_timer(&block->timer);
+ }
+
+ /*
+@@ -1593,7 +1606,8 @@
+ */
+ void dasd_block_clear_timer(struct dasd_block *block)
+ {
+- del_timer(&block->timer);
++ if (timer_pending(&block->timer))
++ del_timer(&block->timer);
+ }
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/s390/block/dasd_devmap.c linux-2.6.29-rc3.owrt/drivers/s390/block/dasd_devmap.c
+--- linux-2.6.29.owrt/drivers/s390/block/dasd_devmap.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/s390/block/dasd_devmap.c 2009-05-10 23:48:29.000000000 +0200
+@@ -677,7 +677,7 @@
+ struct dasd_devmap *devmap;
+ int ff_flag;
+
+- devmap = dasd_find_busid(dev_name(dev));
++ devmap = dasd_find_busid(dev->bus_id);
+ if (!IS_ERR(devmap))
+ ff_flag = (devmap->features & DASD_FEATURE_FAILFAST) != 0;
+ else
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/s390/char/sclp.c linux-2.6.29-rc3.owrt/drivers/s390/char/sclp.c
+--- linux-2.6.29.owrt/drivers/s390/char/sclp.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/s390/char/sclp.c 2009-05-10 23:48:29.000000000 +0200
+@@ -280,11 +280,8 @@
+ rc = 0;
+ for (offset = sizeof(struct sccb_header); offset < sccb->length;
+ offset += evbuf->length) {
+- evbuf = (struct evbuf_header *) ((addr_t) sccb + offset);
+- /* Check for malformed hardware response */
+- if (evbuf->length == 0)
+- break;
+ /* Search for event handler */
++ evbuf = (struct evbuf_header *) ((addr_t) sccb + offset);
+ reg = NULL;
+ list_for_each(l, &sclp_reg_list) {
+ reg = list_entry(l, struct sclp_register, list);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/s390/char/sclp_cmd.c linux-2.6.29-rc3.owrt/drivers/s390/char/sclp_cmd.c
+--- linux-2.6.29.owrt/drivers/s390/char/sclp_cmd.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/s390/char/sclp_cmd.c 2009-05-10 23:48:29.000000000 +0200
+@@ -19,7 +19,6 @@
+ #include <linux/memory.h>
+ #include <asm/chpid.h>
+ #include <asm/sclp.h>
+-#include <asm/setup.h>
+
+ #include "sclp.h"
+
+@@ -475,10 +474,6 @@
+ goto skip_add;
+ if (start + size > VMEM_MAX_PHYS)
+ size = VMEM_MAX_PHYS - start;
+- if (memory_end_set && (start >= memory_end))
+- goto skip_add;
+- if (memory_end_set && (start + size > memory_end))
+- size = memory_end - start;
+ add_memory(0, start, size);
+ skip_add:
+ first_rn = rn;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/sbus/char/bbc_i2c.c linux-2.6.29-rc3.owrt/drivers/sbus/char/bbc_i2c.c
+--- linux-2.6.29.owrt/drivers/sbus/char/bbc_i2c.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/sbus/char/bbc_i2c.c 2009-05-10 23:48:29.000000000 +0200
+@@ -129,7 +129,7 @@
+ bp->waiting = 1;
+ add_wait_queue(&bp->wq, &wait);
+ while (limit-- > 0) {
+- long val;
++ unsigned long val;
+
+ val = wait_event_interruptible_timeout(
+ bp->wq,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/sbus/char/jsflash.c linux-2.6.29-rc3.owrt/drivers/sbus/char/jsflash.c
+--- linux-2.6.29.owrt/drivers/sbus/char/jsflash.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/sbus/char/jsflash.c 2009-05-10 23:48:29.000000000 +0200
+@@ -38,6 +38,9 @@
+ #include <linux/string.h>
+ #include <linux/genhd.h>
+ #include <linux/blkdev.h>
++
++#define MAJOR_NR JSFD_MAJOR
++
+ #include <asm/uaccess.h>
+ #include <asm/pgtable.h>
+ #include <asm/io.h>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/sbus/char/openprom.c linux-2.6.29-rc3.owrt/drivers/sbus/char/openprom.c
+--- linux-2.6.29.owrt/drivers/sbus/char/openprom.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/sbus/char/openprom.c 2009-05-10 23:48:29.000000000 +0200
+@@ -51,7 +51,6 @@
+ MODULE_DESCRIPTION("OPENPROM Configuration Driver");
+ MODULE_LICENSE("GPL");
+ MODULE_VERSION("1.0");
+-MODULE_ALIAS_MISCDEV(SUN_OPENPROM_MINOR);
+
+ /* Private data kept by the driver for each descriptor. */
+ typedef struct openprom_private_data
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_ddp.c linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_ddp.c
+--- linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_ddp.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_ddp.c 2009-05-10 23:48:29.000000000 +0200
+@@ -639,11 +639,10 @@
+ write_unlock(&cxgb3i_ddp_rwlock);
+
+ ddp_log_info("nppods %u (0x%x ~ 0x%x), bits %u, mask 0x%x,0x%x "
+- "pkt %u/%u, %u/%u.\n",
++ "pkt %u,%u.\n",
+ ppmax, ddp->llimit, ddp->ulimit, ddp->idx_bits,
+ ddp->idx_mask, ddp->rsvd_tag_mask,
+- ddp->max_txsz, uinfo.max_txsz,
+- ddp->max_rxsz, uinfo.max_rxsz);
++ ddp->max_txsz, ddp->max_rxsz);
+ return 0;
+
+ free_ddp_map:
+@@ -655,8 +654,8 @@
+ * cxgb3i_adapter_ddp_init - initialize the adapter's ddp resource
+ * @tdev: t3cdev adapter
+ * @tformat: tag format
+- * @txsz: max tx pdu payload size, filled in by this func.
+- * @rxsz: max rx pdu payload size, filled in by this func.
++ * @txsz: max tx pkt size, filled in by this func.
++ * @rxsz: max rx pkt size, filled in by this func.
+ * initialize the ddp pagepod manager for a given adapter if needed and
+ * setup the tag format for a given iscsi entity
+ */
+@@ -686,12 +685,10 @@
+ tformat->sw_bits, tformat->rsvd_bits,
+ tformat->rsvd_shift, tformat->rsvd_mask);
+
+- *txsz = min_t(unsigned int, ULP2_MAX_PDU_PAYLOAD,
+- ddp->max_txsz - ISCSI_PDU_NONPAYLOAD_LEN);
+- *rxsz = min_t(unsigned int, ULP2_MAX_PDU_PAYLOAD,
+- ddp->max_rxsz - ISCSI_PDU_NONPAYLOAD_LEN);
+- ddp_log_info("max payload size: %u/%u, %u/%u.\n",
+- *txsz, ddp->max_txsz, *rxsz, ddp->max_rxsz);
++ *txsz = ddp->max_txsz;
++ *rxsz = ddp->max_rxsz;
++ ddp_log_info("ddp max pkt size: %u, %u.\n",
++ ddp->max_txsz, ddp->max_rxsz);
+ return 0;
+ }
+ EXPORT_SYMBOL_GPL(cxgb3i_adapter_ddp_init);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_ddp.h linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_ddp.h
+--- linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_ddp.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_ddp.h 2009-05-10 23:48:29.000000000 +0200
+@@ -13,8 +13,6 @@
+ #ifndef __CXGB3I_ULP2_DDP_H__
+ #define __CXGB3I_ULP2_DDP_H__
+
+-#include <linux/vmalloc.h>
+-
+ /**
+ * struct cxgb3i_tag_format - cxgb3i ulp tag format for an iscsi entity
+ *
+@@ -87,9 +85,8 @@
+ struct sk_buff **gl_skb;
+ };
+
+-#define ISCSI_PDU_NONPAYLOAD_LEN 312 /* bhs(48) + ahs(256) + digest(8) */
+ #define ULP2_MAX_PKT_SIZE 16224
+-#define ULP2_MAX_PDU_PAYLOAD (ULP2_MAX_PKT_SIZE - ISCSI_PDU_NONPAYLOAD_LEN)
++#define ULP2_MAX_PDU_PAYLOAD (ULP2_MAX_PKT_SIZE - ISCSI_PDU_NONPAYLOAD_MAX)
+ #define PPOD_PAGES_MAX 4
+ #define PPOD_PAGES_SHIFT 2 /* 4 pages per pod */
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i.h linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i.h
+--- linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i.h 2009-05-10 23:48:29.000000000 +0200
+@@ -20,7 +20,6 @@
+ #include <linux/list.h>
+ #include <linux/netdevice.h>
+ #include <linux/scatterlist.h>
+-#include <linux/skbuff.h>
+ #include <scsi/libiscsi_tcp.h>
+
+ /* from cxgb3 LLD */
+@@ -114,26 +113,6 @@
+ struct cxgb3i_conn *cconn;
+ };
+
+-/**
+- * struct cxgb3i_task_data - private iscsi task data
+- *
+- * @nr_frags: # of coalesced page frags (from scsi sgl)
+- * @frags: coalesced page frags (from scsi sgl)
+- * @skb: tx pdu skb
+- * @offset: data offset for the next pdu
+- * @count: max. possible pdu payload
+- * @sgoffset: offset to the first sg entry for a given offset
+- */
+-#define MAX_PDU_FRAGS ((ULP2_MAX_PDU_PAYLOAD + 512 - 1) / 512)
+-struct cxgb3i_task_data {
+- unsigned short nr_frags;
+- skb_frag_t frags[MAX_PDU_FRAGS];
+- struct sk_buff *skb;
+- unsigned int offset;
+- unsigned int count;
+- unsigned int sgoffset;
+-};
+-
+ int cxgb3i_iscsi_init(void);
+ void cxgb3i_iscsi_cleanup(void);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_init.c linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_init.c
+--- linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_init.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_init.c 2009-05-10 23:48:29.000000000 +0200
+@@ -12,8 +12,8 @@
+ #include "cxgb3i.h"
+
+ #define DRV_MODULE_NAME "cxgb3i"
+-#define DRV_MODULE_VERSION "1.0.1"
+-#define DRV_MODULE_RELDATE "Jan. 2009"
++#define DRV_MODULE_VERSION "1.0.0"
++#define DRV_MODULE_RELDATE "Jun. 1, 2008"
+
+ static char version[] =
+ "Chelsio S3xx iSCSI Driver " DRV_MODULE_NAME
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_iscsi.c linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_iscsi.c
+--- linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_iscsi.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_iscsi.c 2009-05-10 23:48:29.000000000 +0200
+@@ -364,8 +364,7 @@
+
+ cls_session = iscsi_session_setup(&cxgb3i_iscsi_transport, shost,
+ cmds_max,
+- sizeof(struct iscsi_tcp_task) +
+- sizeof(struct cxgb3i_task_data),
++ sizeof(struct iscsi_tcp_task),
+ initial_cmdsn, ISCSI_MAX_TARGET);
+ if (!cls_session)
+ return NULL;
+@@ -403,15 +402,17 @@
+ {
+ struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
+ struct cxgb3i_conn *cconn = tcp_conn->dd_data;
+- unsigned int max = max(512 * MAX_SKB_FRAGS, SKB_TX_HEADROOM);
++ unsigned int max = min_t(unsigned int, ULP2_MAX_PDU_PAYLOAD,
++ cconn->hba->snic->tx_max_size -
++ ISCSI_PDU_NONPAYLOAD_MAX);
+
+- max = min(cconn->hba->snic->tx_max_size, max);
+ if (conn->max_xmit_dlength)
+- conn->max_xmit_dlength = min(conn->max_xmit_dlength, max);
++ conn->max_xmit_dlength = min_t(unsigned int,
++ conn->max_xmit_dlength, max);
+ else
+ conn->max_xmit_dlength = max;
+ align_pdu_size(conn->max_xmit_dlength);
+- cxgb3i_api_debug("conn 0x%p, max xmit %u.\n",
++ cxgb3i_log_info("conn 0x%p, max xmit %u.\n",
+ conn, conn->max_xmit_dlength);
+ return 0;
+ }
+@@ -426,7 +427,9 @@
+ {
+ struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
+ struct cxgb3i_conn *cconn = tcp_conn->dd_data;
+- unsigned int max = cconn->hba->snic->rx_max_size;
++ unsigned int max = min_t(unsigned int, ULP2_MAX_PDU_PAYLOAD,
++ cconn->hba->snic->rx_max_size -
++ ISCSI_PDU_NONPAYLOAD_MAX);
+
+ align_pdu_size(max);
+ if (conn->max_recv_dlength) {
+@@ -436,7 +439,8 @@
+ conn->max_recv_dlength, max);
+ return -EINVAL;
+ }
+- conn->max_recv_dlength = min(conn->max_recv_dlength, max);
++ conn->max_recv_dlength = min_t(unsigned int,
++ conn->max_recv_dlength, max);
+ align_pdu_size(conn->max_recv_dlength);
+ } else
+ conn->max_recv_dlength = max;
+@@ -840,7 +844,7 @@
+ .proc_name = "cxgb3i",
+ .queuecommand = iscsi_queuecommand,
+ .change_queue_depth = iscsi_change_queue_depth,
+- .can_queue = CXGB3I_SCSI_QDEPTH_DFLT - 1,
++ .can_queue = 128 * (ISCSI_DEF_XMIT_CMDS_MAX - 1),
+ .sg_tablesize = SG_ALL,
+ .max_sectors = 0xFFFF,
+ .cmd_per_lun = ISCSI_DEF_CMD_PER_LUN,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_offload.c linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_offload.c
+--- linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_offload.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_offload.c 2009-05-10 23:48:29.000000000 +0200
+@@ -23,19 +23,19 @@
+ #include "cxgb3i_ddp.h"
+
+ #ifdef __DEBUG_C3CN_CONN__
+-#define c3cn_conn_debug cxgb3i_log_debug
++#define c3cn_conn_debug cxgb3i_log_info
+ #else
+ #define c3cn_conn_debug(fmt...)
+ #endif
+
+ #ifdef __DEBUG_C3CN_TX__
+-#define c3cn_tx_debug cxgb3i_log_debug
++#define c3cn_tx_debug cxgb3i_log_debug
+ #else
+ #define c3cn_tx_debug(fmt...)
+ #endif
+
+ #ifdef __DEBUG_C3CN_RX__
+-#define c3cn_rx_debug cxgb3i_log_debug
++#define c3cn_rx_debug cxgb3i_log_debug
+ #else
+ #define c3cn_rx_debug(fmt...)
+ #endif
+@@ -47,9 +47,9 @@
+ module_param(cxgb3_rcv_win, int, 0644);
+ MODULE_PARM_DESC(cxgb3_rcv_win, "TCP receive window in bytes (default=256KB)");
+
+-static int cxgb3_snd_win = 128 * 1024;
++static int cxgb3_snd_win = 64 * 1024;
+ module_param(cxgb3_snd_win, int, 0644);
+-MODULE_PARM_DESC(cxgb3_snd_win, "TCP send window in bytes (default=128KB)");
++MODULE_PARM_DESC(cxgb3_snd_win, "TCP send window in bytes (default=64KB)");
+
+ static int cxgb3_rx_credit_thres = 10 * 1024;
+ module_param(cxgb3_rx_credit_thres, int, 0644);
+@@ -301,8 +301,8 @@
+ static void skb_entail(struct s3_conn *c3cn, struct sk_buff *skb,
+ int flags)
+ {
+- skb_tcp_seq(skb) = c3cn->write_seq;
+- skb_flags(skb) = flags;
++ CXGB3_SKB_CB(skb)->seq = c3cn->write_seq;
++ CXGB3_SKB_CB(skb)->flags = flags;
+ __skb_queue_tail(&c3cn->write_queue, skb);
+ }
+
+@@ -457,9 +457,12 @@
+ * The number of WRs needed for an skb depends on the number of fragments
+ * in the skb and whether it has any payload in its main body. This maps the
+ * length of the gather list represented by an skb into the # of necessary WRs.
+- * The extra two fragments are for iscsi bhs and payload padding.
++ *
++ * The max. length of an skb is controlled by the max pdu size which is ~16K.
++ * Also, assume the min. fragment length is the sector size (512), then add
++ * extra fragment counts for iscsi bhs and payload padding.
+ */
+-#define SKB_WR_LIST_SIZE (MAX_SKB_FRAGS + 2)
++#define SKB_WR_LIST_SIZE (16384/512 + 3)
+ static unsigned int skb_wrs[SKB_WR_LIST_SIZE] __read_mostly;
+
+ static void s3_init_wr_tab(unsigned int wr_len)
+@@ -482,7 +485,7 @@
+
+ static inline void reset_wr_list(struct s3_conn *c3cn)
+ {
+- c3cn->wr_pending_head = c3cn->wr_pending_tail = NULL;
++ c3cn->wr_pending_head = NULL;
+ }
+
+ /*
+@@ -493,7 +496,7 @@
+ static inline void enqueue_wr(struct s3_conn *c3cn,
+ struct sk_buff *skb)
+ {
+- skb_tx_wr_next(skb) = NULL;
++ skb_wr_data(skb) = NULL;
+
+ /*
+ * We want to take an extra reference since both us and the driver
+@@ -506,22 +509,10 @@
+ if (!c3cn->wr_pending_head)
+ c3cn->wr_pending_head = skb;
+ else
+- skb_tx_wr_next(c3cn->wr_pending_tail) = skb;
++ skb_wr_data(skb) = skb;
+ c3cn->wr_pending_tail = skb;
+ }
+
+-static int count_pending_wrs(struct s3_conn *c3cn)
+-{
+- int n = 0;
+- const struct sk_buff *skb = c3cn->wr_pending_head;
+-
+- while (skb) {
+- n += skb->csum;
+- skb = skb_tx_wr_next(skb);
+- }
+- return n;
+-}
+-
+ static inline struct sk_buff *peek_wr(const struct s3_conn *c3cn)
+ {
+ return c3cn->wr_pending_head;
+@@ -538,8 +529,8 @@
+
+ if (likely(skb)) {
+ /* Don't bother clearing the tail */
+- c3cn->wr_pending_head = skb_tx_wr_next(skb);
+- skb_tx_wr_next(skb) = NULL;
++ c3cn->wr_pending_head = skb_wr_data(skb);
++ skb_wr_data(skb) = NULL;
+ }
+ return skb;
+ }
+@@ -552,14 +543,13 @@
+ }
+
+ static inline void make_tx_data_wr(struct s3_conn *c3cn, struct sk_buff *skb,
+- int len, int req_completion)
++ int len)
+ {
+ struct tx_data_wr *req;
+
+ skb_reset_transport_header(skb);
+ req = (struct tx_data_wr *)__skb_push(skb, sizeof(*req));
+- req->wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_TX_DATA) |
+- (req_completion ? F_WR_COMPL : 0));
++ req->wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_TX_DATA));
+ req->wr_lo = htonl(V_WR_TID(c3cn->tid));
+ req->sndseq = htonl(c3cn->snd_nxt);
+ /* len includes the length of any HW ULP additions */
+@@ -602,7 +592,7 @@
+
+ if (unlikely(c3cn->state == C3CN_STATE_CONNECTING ||
+ c3cn->state == C3CN_STATE_CLOSE_WAIT_1 ||
+- c3cn->state >= C3CN_STATE_ABORTING)) {
++ c3cn->state == C3CN_STATE_ABORTING)) {
+ c3cn_tx_debug("c3cn 0x%p, in closing state %u.\n",
+ c3cn, c3cn->state);
+ return 0;
+@@ -625,7 +615,7 @@
+ if (c3cn->wr_avail < wrs_needed) {
+ c3cn_tx_debug("c3cn 0x%p, skb len %u/%u, frag %u, "
+ "wr %d < %u.\n",
+- c3cn, skb->len, skb->data_len, frags,
++ c3cn, skb->len, skb->datalen, frags,
+ wrs_needed, c3cn->wr_avail);
+ break;
+ }
+@@ -637,24 +627,20 @@
+ c3cn->wr_unacked += wrs_needed;
+ enqueue_wr(c3cn, skb);
+
+- c3cn_tx_debug("c3cn 0x%p, enqueue, skb len %u/%u, frag %u, "
+- "wr %d, left %u, unack %u.\n",
+- c3cn, skb->len, skb->data_len, frags,
+- wrs_needed, c3cn->wr_avail, c3cn->wr_unacked);
+-
++ if (likely(CXGB3_SKB_CB(skb)->flags & C3CB_FLAG_NEED_HDR)) {
++ len += ulp_extra_len(skb);
++ make_tx_data_wr(c3cn, skb, len);
++ c3cn->snd_nxt += len;
++ if ((req_completion
++ && c3cn->wr_unacked == wrs_needed)
++ || (CXGB3_SKB_CB(skb)->flags & C3CB_FLAG_COMPL)
++ || c3cn->wr_unacked >= c3cn->wr_max / 2) {
++ struct work_request_hdr *wr = cplhdr(skb);
+
+- if (likely(skb_flags(skb) & C3CB_FLAG_NEED_HDR)) {
+- if ((req_completion &&
+- c3cn->wr_unacked == wrs_needed) ||
+- (skb_flags(skb) & C3CB_FLAG_COMPL) ||
+- c3cn->wr_unacked >= c3cn->wr_max / 2) {
+- req_completion = 1;
++ wr->wr_hi |= htonl(F_WR_COMPL);
+ c3cn->wr_unacked = 0;
+ }
+- len += ulp_extra_len(skb);
+- make_tx_data_wr(c3cn, skb, len, req_completion);
+- c3cn->snd_nxt += len;
+- skb_flags(skb) &= ~C3CB_FLAG_NEED_HDR;
++ CXGB3_SKB_CB(skb)->flags &= ~C3CB_FLAG_NEED_HDR;
+ }
+
+ total_size += skb->truesize;
+@@ -749,11 +735,8 @@
+ if (unlikely(c3cn_flag(c3cn, C3CN_ACTIVE_CLOSE_NEEDED)))
+ /* upper layer has requested closing */
+ send_abort_req(c3cn);
+- else {
+- if (skb_queue_len(&c3cn->write_queue))
+- c3cn_push_tx_frames(c3cn, 1);
++ else if (c3cn_push_tx_frames(c3cn, 1))
+ cxgb3i_conn_tx_open(c3cn);
+- }
+ }
+
+ static int do_act_establish(struct t3cdev *cdev, struct sk_buff *skb,
+@@ -1099,8 +1082,8 @@
+ return;
+ }
+
+- skb_tcp_seq(skb) = ntohl(hdr_cpl->seq);
+- skb_flags(skb) = 0;
++ CXGB3_SKB_CB(skb)->seq = ntohl(hdr_cpl->seq);
++ CXGB3_SKB_CB(skb)->flags = 0;
+
+ skb_reset_transport_header(skb);
+ __skb_pull(skb, sizeof(struct cpl_iscsi_hdr));
+@@ -1120,12 +1103,12 @@
+ goto abort_conn;
+
+ skb_ulp_mode(skb) = ULP2_FLAG_DATA_READY;
+- skb_rx_pdulen(skb) = ntohs(ddp_cpl.len);
+- skb_rx_ddigest(skb) = ntohl(ddp_cpl.ulp_crc);
++ skb_ulp_pdulen(skb) = ntohs(ddp_cpl.len);
++ skb_ulp_ddigest(skb) = ntohl(ddp_cpl.ulp_crc);
+ status = ntohl(ddp_cpl.ddp_status);
+
+ c3cn_rx_debug("rx skb 0x%p, len %u, pdulen %u, ddp status 0x%x.\n",
+- skb, skb->len, skb_rx_pdulen(skb), status);
++ skb, skb->len, skb_ulp_pdulen(skb), status);
+
+ if (status & (1 << RX_DDP_STATUS_HCRC_SHIFT))
+ skb_ulp_mode(skb) |= ULP2_FLAG_HCRC_ERROR;
+@@ -1143,7 +1126,7 @@
+ } else if (status & (1 << RX_DDP_STATUS_DDP_SHIFT))
+ skb_ulp_mode(skb) |= ULP2_FLAG_DATA_DDPED;
+
+- c3cn->rcv_nxt = ntohl(ddp_cpl.seq) + skb_rx_pdulen(skb);
++ c3cn->rcv_nxt = ntohl(ddp_cpl.seq) + skb_ulp_pdulen(skb);
+ __pskb_trim(skb, len);
+ __skb_queue_tail(&c3cn->receive_queue, skb);
+ cxgb3i_conn_pdu_ready(c3cn);
+@@ -1168,27 +1151,12 @@
+ * Process an acknowledgment of WR completion. Advance snd_una and send the
+ * next batch of work requests from the write queue.
+ */
+-static void check_wr_invariants(struct s3_conn *c3cn)
+-{
+- int pending = count_pending_wrs(c3cn);
+-
+- if (unlikely(c3cn->wr_avail + pending != c3cn->wr_max))
+- cxgb3i_log_error("TID %u: credit imbalance: avail %u, "
+- "pending %u, total should be %u\n",
+- c3cn->tid, c3cn->wr_avail, pending,
+- c3cn->wr_max);
+-}
+-
+ static void process_wr_ack(struct s3_conn *c3cn, struct sk_buff *skb)
+ {
+ struct cpl_wr_ack *hdr = cplhdr(skb);
+ unsigned int credits = ntohs(hdr->credits);
+ u32 snd_una = ntohl(hdr->snd_una);
+
+- c3cn_tx_debug("%u WR credits, avail %u, unack %u, TID %u, state %u.\n",
+- credits, c3cn->wr_avail, c3cn->wr_unacked,
+- c3cn->tid, c3cn->state);
+-
+ c3cn->wr_avail += credits;
+ if (c3cn->wr_unacked > c3cn->wr_max - c3cn->wr_avail)
+ c3cn->wr_unacked = c3cn->wr_max - c3cn->wr_avail;
+@@ -1203,17 +1171,6 @@
+ break;
+ }
+ if (unlikely(credits < p->csum)) {
+- struct tx_data_wr *w = cplhdr(p);
+- cxgb3i_log_error("TID %u got %u WR credits need %u, "
+- "len %u, main body %u, frags %u, "
+- "seq # %u, ACK una %u, ACK nxt %u, "
+- "WR_AVAIL %u, WRs pending %u\n",
+- c3cn->tid, credits, p->csum, p->len,
+- p->len - p->data_len,
+- skb_shinfo(p)->nr_frags,
+- ntohl(w->sndseq), snd_una,
+- ntohl(hdr->snd_nxt), c3cn->wr_avail,
+- count_pending_wrs(c3cn) - credits);
+ p->csum -= credits;
+ break;
+ } else {
+@@ -1223,24 +1180,15 @@
+ }
+ }
+
+- check_wr_invariants(c3cn);
+-
+- if (unlikely(before(snd_una, c3cn->snd_una))) {
+- cxgb3i_log_error("TID %u, unexpected sequence # %u in WR_ACK "
+- "snd_una %u\n",
+- c3cn->tid, snd_una, c3cn->snd_una);
++ if (unlikely(before(snd_una, c3cn->snd_una)))
+ goto out_free;
+- }
+
+ if (c3cn->snd_una != snd_una) {
+ c3cn->snd_una = snd_una;
+ dst_confirm(c3cn->dst_cache);
+ }
+
+- if (skb_queue_len(&c3cn->write_queue)) {
+- if (c3cn_push_tx_frames(c3cn, 0))
+- cxgb3i_conn_tx_open(c3cn);
+- } else
++ if (skb_queue_len(&c3cn->write_queue) && c3cn_push_tx_frames(c3cn, 0))
+ cxgb3i_conn_tx_open(c3cn);
+ out_free:
+ __kfree_skb(skb);
+@@ -1504,7 +1452,7 @@
+ struct dst_entry *dst)
+ {
+ BUG_ON(c3cn->cdev != cdev);
+- c3cn->wr_max = c3cn->wr_avail = T3C_DATA(cdev)->max_wrs - 1;
++ c3cn->wr_max = c3cn->wr_avail = T3C_DATA(cdev)->max_wrs;
+ c3cn->wr_unacked = 0;
+ c3cn->mss_idx = select_mss(c3cn, dst_mtu(dst));
+
+@@ -1723,17 +1671,9 @@
+ goto out_err;
+ }
+
++ err = -EPIPE;
+ if (c3cn->err) {
+ c3cn_tx_debug("c3cn 0x%p, err %d.\n", c3cn, c3cn->err);
+- err = -EPIPE;
+- goto out_err;
+- }
+-
+- if (c3cn->write_seq - c3cn->snd_una >= cxgb3_snd_win) {
+- c3cn_tx_debug("c3cn 0x%p, snd %u - %u > %u.\n",
+- c3cn, c3cn->write_seq, c3cn->snd_una,
+- cxgb3_snd_win);
+- err = -EAGAIN;
+ goto out_err;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_offload.h linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_offload.h
+--- linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_offload.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_offload.h 2009-05-10 23:48:29.000000000 +0200
+@@ -178,33 +178,25 @@
+ * @flag: see C3CB_FLAG_* below
+ * @ulp_mode: ULP mode/submode of sk_buff
+ * @seq: tcp sequence number
++ * @ddigest: pdu data digest
++ * @pdulen: recovered pdu length
++ * @wr_data: scratch area for tx wr
+ */
+-struct cxgb3_skb_rx_cb {
+- __u32 ddigest; /* data digest */
+- __u32 pdulen; /* recovered pdu length */
+-};
+-
+-struct cxgb3_skb_tx_cb {
+- struct sk_buff *wr_next; /* next wr */
+-};
+-
+ struct cxgb3_skb_cb {
+ __u8 flags;
+ __u8 ulp_mode;
+ __u32 seq;
+- union {
+- struct cxgb3_skb_rx_cb rx;
+- struct cxgb3_skb_tx_cb tx;
+- };
++ __u32 ddigest;
++ __u32 pdulen;
++ struct sk_buff *wr_data;
+ };
+
+ #define CXGB3_SKB_CB(skb) ((struct cxgb3_skb_cb *)&((skb)->cb[0]))
+-#define skb_flags(skb) (CXGB3_SKB_CB(skb)->flags)
++
+ #define skb_ulp_mode(skb) (CXGB3_SKB_CB(skb)->ulp_mode)
+-#define skb_tcp_seq(skb) (CXGB3_SKB_CB(skb)->seq)
+-#define skb_rx_ddigest(skb) (CXGB3_SKB_CB(skb)->rx.ddigest)
+-#define skb_rx_pdulen(skb) (CXGB3_SKB_CB(skb)->rx.pdulen)
+-#define skb_tx_wr_next(skb) (CXGB3_SKB_CB(skb)->tx.wr_next)
++#define skb_ulp_ddigest(skb) (CXGB3_SKB_CB(skb)->ddigest)
++#define skb_ulp_pdulen(skb) (CXGB3_SKB_CB(skb)->pdulen)
++#define skb_wr_data(skb) (CXGB3_SKB_CB(skb)->wr_data)
+
+ enum c3cb_flags {
+ C3CB_FLAG_NEED_HDR = 1 << 0, /* packet needs a TX_DATA_WR header */
+@@ -225,7 +217,6 @@
+ /* for TX: a skb must have a headroom of at least TX_HEADER_LEN bytes */
+ #define TX_HEADER_LEN \
+ (sizeof(struct tx_data_wr) + sizeof(struct sge_opaque_hdr))
+-#define SKB_TX_HEADROOM SKB_MAX_HEAD(TX_HEADER_LEN)
+
+ /*
+ * get and set private ip for iscsi traffic
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_pdu.c linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_pdu.c
+--- linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_pdu.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_pdu.c 2009-05-10 23:48:29.000000000 +0200
+@@ -32,10 +32,6 @@
+ #define cxgb3i_tx_debug(fmt...)
+ #endif
+
+-/* always allocate rooms for AHS */
+-#define SKB_TX_PDU_HEADER_LEN \
+- (sizeof(struct iscsi_hdr) + ISCSI_MAX_AHS_SIZE)
+-static unsigned int skb_extra_headroom;
+ static struct page *pad_page;
+
+ /*
+@@ -150,13 +146,12 @@
+
+ void cxgb3i_conn_cleanup_task(struct iscsi_task *task)
+ {
+- struct cxgb3i_task_data *tdata = task->dd_data +
+- sizeof(struct iscsi_tcp_task);
++ struct iscsi_tcp_task *tcp_task = task->dd_data;
+
+ /* never reached the xmit task callout */
+- if (tdata->skb)
+- __kfree_skb(tdata->skb);
+- memset(tdata, 0, sizeof(struct cxgb3i_task_data));
++ if (tcp_task->dd_data)
++ kfree_skb(tcp_task->dd_data);
++ tcp_task->dd_data = NULL;
+
+ /* MNC - Do we need a check in case this is called but
+ * cxgb3i_conn_alloc_pdu has never been called on the task */
+@@ -164,102 +159,28 @@
+ iscsi_tcp_cleanup_task(task);
+ }
+
+-static int sgl_seek_offset(struct scatterlist *sgl, unsigned int sgcnt,
+- unsigned int offset, unsigned int *off,
+- struct scatterlist **sgp)
+-{
+- int i;
+- struct scatterlist *sg;
+-
+- for_each_sg(sgl, sg, sgcnt, i) {
+- if (offset < sg->length) {
+- *off = offset;
+- *sgp = sg;
+- return 0;
+- }
+- offset -= sg->length;
+- }
+- return -EFAULT;
+-}
+-
+-static int sgl_read_to_frags(struct scatterlist *sg, unsigned int sgoffset,
+- unsigned int dlen, skb_frag_t *frags,
+- int frag_max)
+-{
+- unsigned int datalen = dlen;
+- unsigned int sglen = sg->length - sgoffset;
+- struct page *page = sg_page(sg);
+- int i;
+-
+- i = 0;
+- do {
+- unsigned int copy;
+-
+- if (!sglen) {
+- sg = sg_next(sg);
+- if (!sg) {
+- cxgb3i_log_error("%s, sg NULL, len %u/%u.\n",
+- __func__, datalen, dlen);
+- return -EINVAL;
+- }
+- sgoffset = 0;
+- sglen = sg->length;
+- page = sg_page(sg);
+-
+- }
+- copy = min(datalen, sglen);
+- if (i && page == frags[i - 1].page &&
+- sgoffset + sg->offset ==
+- frags[i - 1].page_offset + frags[i - 1].size) {
+- frags[i - 1].size += copy;
+- } else {
+- if (i >= frag_max) {
+- cxgb3i_log_error("%s, too many pages %u, "
+- "dlen %u.\n", __func__,
+- frag_max, dlen);
+- return -EINVAL;
+- }
+-
+- frags[i].page = page;
+- frags[i].page_offset = sg->offset + sgoffset;
+- frags[i].size = copy;
+- i++;
+- }
+- datalen -= copy;
+- sgoffset += copy;
+- sglen -= copy;
+- } while (datalen);
+-
+- return i;
+-}
+-
++/*
++ * We do not support ahs yet
++ */
+ int cxgb3i_conn_alloc_pdu(struct iscsi_task *task, u8 opcode)
+ {
+- struct iscsi_conn *conn = task->conn;
+ struct iscsi_tcp_task *tcp_task = task->dd_data;
+- struct cxgb3i_task_data *tdata = task->dd_data + sizeof(*tcp_task);
+- struct scsi_cmnd *sc = task->sc;
+- int headroom = SKB_TX_PDU_HEADER_LEN;
++ struct sk_buff *skb;
+
+- tcp_task->dd_data = tdata;
+ task->hdr = NULL;
+-
+- /* write command, need to send data pdus */
+- if (skb_extra_headroom && (opcode == ISCSI_OP_SCSI_DATA_OUT ||
+- (opcode == ISCSI_OP_SCSI_CMD &&
+- (scsi_bidi_cmnd(sc) || sc->sc_data_direction == DMA_TO_DEVICE))))
+- headroom += min(skb_extra_headroom, conn->max_xmit_dlength);
+-
+- tdata->skb = alloc_skb(TX_HEADER_LEN + headroom, GFP_ATOMIC);
+- if (!tdata->skb)
++ /* always allocate rooms for AHS */
++ skb = alloc_skb(sizeof(struct iscsi_hdr) + ISCSI_MAX_AHS_SIZE +
++ TX_HEADER_LEN, GFP_ATOMIC);
++ if (!skb)
+ return -ENOMEM;
+- skb_reserve(tdata->skb, TX_HEADER_LEN);
+
+ cxgb3i_tx_debug("task 0x%p, opcode 0x%x, skb 0x%p.\n",
+- task, opcode, tdata->skb);
++ task, opcode, skb);
+
+- task->hdr = (struct iscsi_hdr *)tdata->skb->data;
+- task->hdr_max = SKB_TX_PDU_HEADER_LEN;
++ tcp_task->dd_data = skb;
++ skb_reserve(skb, TX_HEADER_LEN);
++ task->hdr = (struct iscsi_hdr *)skb->data;
++ task->hdr_max = sizeof(struct iscsi_hdr);
+
+ /* data_out uses scsi_cmd's itt */
+ if (opcode != ISCSI_OP_SCSI_DATA_OUT)
+@@ -271,13 +192,13 @@
+ int cxgb3i_conn_init_pdu(struct iscsi_task *task, unsigned int offset,
+ unsigned int count)
+ {
+- struct iscsi_conn *conn = task->conn;
+ struct iscsi_tcp_task *tcp_task = task->dd_data;
+- struct cxgb3i_task_data *tdata = tcp_task->dd_data;
+- struct sk_buff *skb = tdata->skb;
++ struct sk_buff *skb = tcp_task->dd_data;
++ struct iscsi_conn *conn = task->conn;
++ struct page *pg;
+ unsigned int datalen = count;
+ int i, padlen = iscsi_padding(count);
+- struct page *pg;
++ skb_frag_t *frag;
+
+ cxgb3i_tx_debug("task 0x%p,0x%p, offset %u, count %u, skb 0x%p.\n",
+ task, task->sc, offset, count, skb);
+@@ -288,94 +209,90 @@
+ return 0;
+
+ if (task->sc) {
+- struct scsi_data_buffer *sdb = scsi_out(task->sc);
+- struct scatterlist *sg = NULL;
+- int err;
+-
+- tdata->offset = offset;
+- tdata->count = count;
+- err = sgl_seek_offset(sdb->table.sgl, sdb->table.nents,
+- tdata->offset, &tdata->sgoffset, &sg);
+- if (err < 0) {
+- cxgb3i_log_warn("tpdu, sgl %u, bad offset %u/%u.\n",
+- sdb->table.nents, tdata->offset,
+- sdb->length);
+- return err;
++ struct scatterlist *sg;
++ struct scsi_data_buffer *sdb;
++ unsigned int sgoffset = offset;
++ struct page *sgpg;
++ unsigned int sglen;
++
++ sdb = scsi_out(task->sc);
++ sg = sdb->table.sgl;
++
++ for_each_sg(sdb->table.sgl, sg, sdb->table.nents, i) {
++ cxgb3i_tx_debug("sg %d, page 0x%p, len %u offset %u\n",
++ i, sg_page(sg), sg->length, sg->offset);
++
++ if (sgoffset < sg->length)
++ break;
++ sgoffset -= sg->length;
+ }
+- err = sgl_read_to_frags(sg, tdata->sgoffset, tdata->count,
+- tdata->frags, MAX_PDU_FRAGS);
+- if (err < 0) {
+- cxgb3i_log_warn("tpdu, sgl %u, bad offset %u + %u.\n",
+- sdb->table.nents, tdata->offset,
+- tdata->count);
+- return err;
+- }
+- tdata->nr_frags = err;
++ sgpg = sg_page(sg);
++ sglen = sg->length - sgoffset;
+
+- if (tdata->nr_frags > MAX_SKB_FRAGS ||
+- (padlen && tdata->nr_frags == MAX_SKB_FRAGS)) {
+- char *dst = skb->data + task->hdr_len;
+- skb_frag_t *frag = tdata->frags;
+-
+- /* data fits in the skb's headroom */
+- for (i = 0; i < tdata->nr_frags; i++, frag++) {
+- char *src = kmap_atomic(frag->page,
+- KM_SOFTIRQ0);
+-
+- memcpy(dst, src+frag->page_offset, frag->size);
+- dst += frag->size;
+- kunmap_atomic(src, KM_SOFTIRQ0);
++ do {
++ int j = skb_shinfo(skb)->nr_frags;
++ unsigned int copy;
++
++ if (!sglen) {
++ sg = sg_next(sg);
++ sgpg = sg_page(sg);
++ sgoffset = 0;
++ sglen = sg->length;
++ ++i;
+ }
+- if (padlen) {
+- memset(dst, 0, padlen);
+- padlen = 0;
++ copy = min(sglen, datalen);
++ if (j && skb_can_coalesce(skb, j, sgpg,
++ sg->offset + sgoffset)) {
++ skb_shinfo(skb)->frags[j - 1].size += copy;
++ } else {
++ get_page(sgpg);
++ skb_fill_page_desc(skb, j, sgpg,
++ sg->offset + sgoffset, copy);
+ }
+- skb_put(skb, count + padlen);
+- } else {
+- /* data fit into frag_list */
+- for (i = 0; i < tdata->nr_frags; i++)
+- get_page(tdata->frags[i].page);
+-
+- memcpy(skb_shinfo(skb)->frags, tdata->frags,
+- sizeof(skb_frag_t) * tdata->nr_frags);
+- skb_shinfo(skb)->nr_frags = tdata->nr_frags;
+- skb->len += count;
+- skb->data_len += count;
+- skb->truesize += count;
+- }
+-
++ sgoffset += copy;
++ sglen -= copy;
++ datalen -= copy;
++ } while (datalen);
+ } else {
+ pg = virt_to_page(task->data);
+
+- get_page(pg);
+- skb_fill_page_desc(skb, 0, pg, offset_in_page(task->data),
+- count);
+- skb->len += count;
+- skb->data_len += count;
+- skb->truesize += count;
++ while (datalen) {
++ i = skb_shinfo(skb)->nr_frags;
++ frag = &skb_shinfo(skb)->frags[i];
++
++ get_page(pg);
++ frag->page = pg;
++ frag->page_offset = 0;
++ frag->size = min((unsigned int)PAGE_SIZE, datalen);
++
++ skb_shinfo(skb)->nr_frags++;
++ datalen -= frag->size;
++ pg++;
++ }
+ }
+
+ if (padlen) {
+ i = skb_shinfo(skb)->nr_frags;
+- get_page(pad_page);
+- skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags, pad_page, 0,
+- padlen);
+-
+- skb->data_len += padlen;
+- skb->truesize += padlen;
+- skb->len += padlen;
++ frag = &skb_shinfo(skb)->frags[i];
++ frag->page = pad_page;
++ frag->page_offset = 0;
++ frag->size = padlen;
++ skb_shinfo(skb)->nr_frags++;
+ }
+
++ datalen = count + padlen;
++ skb->data_len += datalen;
++ skb->truesize += datalen;
++ skb->len += datalen;
+ return 0;
+ }
+
+ int cxgb3i_conn_xmit_pdu(struct iscsi_task *task)
+ {
++ struct iscsi_tcp_task *tcp_task = task->dd_data;
++ struct sk_buff *skb = tcp_task->dd_data;
+ struct iscsi_tcp_conn *tcp_conn = task->conn->dd_data;
+ struct cxgb3i_conn *cconn = tcp_conn->dd_data;
+- struct iscsi_tcp_task *tcp_task = task->dd_data;
+- struct cxgb3i_task_data *tdata = tcp_task->dd_data;
+- struct sk_buff *skb = tdata->skb;
+ unsigned int datalen;
+ int err;
+
+@@ -383,13 +300,12 @@
+ return 0;
+
+ datalen = skb->data_len;
+- tdata->skb = NULL;
++ tcp_task->dd_data = NULL;
+ err = cxgb3i_c3cn_send_pdus(cconn->cep->c3cn, skb);
+- if (err > 0) {
+- int pdulen = err;
+-
+ cxgb3i_tx_debug("task 0x%p, skb 0x%p, len %u/%u, rv %d.\n",
+ task, skb, skb->len, skb->data_len, err);
++ if (err > 0) {
++ int pdulen = err;
+
+ if (task->conn->hdrdgst_en)
+ pdulen += ISCSI_DIGEST_SIZE;
+@@ -409,14 +325,12 @@
+ return err;
+ }
+ /* reset skb to send when we are called again */
+- tdata->skb = skb;
++ tcp_task->dd_data = skb;
+ return -EAGAIN;
+ }
+
+ int cxgb3i_pdu_init(void)
+ {
+- if (SKB_TX_HEADROOM > (512 * MAX_SKB_FRAGS))
+- skb_extra_headroom = SKB_TX_HEADROOM;
+ pad_page = alloc_page(GFP_KERNEL);
+ if (!pad_page)
+ return -ENOMEM;
+@@ -452,9 +366,7 @@
+ skb = skb_peek(&c3cn->receive_queue);
+ while (!err && skb) {
+ __skb_unlink(skb, &c3cn->receive_queue);
+- read += skb_rx_pdulen(skb);
+- cxgb3i_rx_debug("conn 0x%p, cn 0x%p, rx skb 0x%p, pdulen %u.\n",
+- conn, c3cn, skb, skb_rx_pdulen(skb));
++ read += skb_ulp_pdulen(skb);
+ err = cxgb3i_conn_read_pdu_skb(conn, skb);
+ __kfree_skb(skb);
+ skb = skb_peek(&c3cn->receive_queue);
+@@ -465,11 +377,6 @@
+ cxgb3i_c3cn_rx_credits(c3cn, read);
+ }
+ conn->rxdata_octets += read;
+-
+- if (err) {
+- cxgb3i_log_info("conn 0x%p rx failed err %d.\n", conn, err);
+- iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
+- }
+ }
+
+ void cxgb3i_conn_tx_open(struct s3_conn *c3cn)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_pdu.h linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_pdu.h
+--- linux-2.6.29.owrt/drivers/scsi/cxgb3i/cxgb3i_pdu.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/cxgb3i/cxgb3i_pdu.h 2009-05-10 23:48:29.000000000 +0200
+@@ -53,7 +53,7 @@
+ #define ULP2_FLAG_DCRC_ERROR 0x20
+ #define ULP2_FLAG_PAD_ERROR 0x40
+
+-void cxgb3i_conn_closing(struct s3_conn *c3cn);
++void cxgb3i_conn_closing(struct s3_conn *);
+ void cxgb3i_conn_pdu_ready(struct s3_conn *c3cn);
+ void cxgb3i_conn_tx_open(struct s3_conn *c3cn);
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/fcoe/fcoe_sw.c linux-2.6.29-rc3.owrt/drivers/scsi/fcoe/fcoe_sw.c
+--- linux-2.6.29.owrt/drivers/scsi/fcoe/fcoe_sw.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/fcoe/fcoe_sw.c 2009-05-10 23:48:29.000000000 +0200
+@@ -104,19 +104,19 @@
+ .max_sectors = 0xffff,
+ };
+
+-/**
+- * fcoe_sw_lport_config() - sets up the fc_lport
++/*
++ * fcoe_sw_lport_config - sets up the fc_lport
+ * @lp: ptr to the fc_lport
+ * @shost: ptr to the parent scsi host
+ *
+ * Returns: 0 for success
++ *
+ */
+ static int fcoe_sw_lport_config(struct fc_lport *lp)
+ {
+ int i = 0;
+
+- lp->link_up = 0;
+- lp->qfull = 0;
++ lp->link_status = 0;
+ lp->max_retry_count = 3;
+ lp->e_d_tov = 2 * 1000; /* FC-FS default */
+ lp->r_a_tov = 2 * 2 * 1000;
+@@ -136,14 +136,16 @@
+ return 0;
+ }
+
+-/**
+- * fcoe_sw_netdev_config() - Set up netdev for SW FCoE
++/*
++ * fcoe_sw_netdev_config - sets up fcoe_softc for lport and network
++ * related properties
+ * @lp : ptr to the fc_lport
+ * @netdev : ptr to the associated netdevice struct
+ *
+ * Must be called after fcoe_sw_lport_config() as it will use lport mutex
+ *
+ * Returns : 0 for success
++ *
+ */
+ static int fcoe_sw_netdev_config(struct fc_lport *lp, struct net_device *netdev)
+ {
+@@ -179,8 +181,9 @@
+ if (fc_set_mfs(lp, mfs))
+ return -EINVAL;
+
++ lp->link_status = ~FC_PAUSE & ~FC_LINK_UP;
+ if (!fcoe_link_ok(lp))
+- lp->link_up = 1;
++ lp->link_status |= FC_LINK_UP;
+
+ /* offload features support */
+ if (fc->real_dev->features & NETIF_F_SG)
+@@ -188,7 +191,6 @@
+
+
+ skb_queue_head_init(&fc->fcoe_pending_queue);
+- fc->fcoe_pending_queue_active = 0;
+
+ /* setup Source Mac Address */
+ memcpy(fc->ctl_src_addr, fc->real_dev->dev_addr,
+@@ -222,15 +224,16 @@
+ return 0;
+ }
+
+-/**
+- * fcoe_sw_shost_config() - Sets up fc_lport->host
++/*
++ * fcoe_sw_shost_config - sets up fc_lport->host
+ * @lp : ptr to the fc_lport
+ * @shost : ptr to the associated scsi host
+ * @dev : device associated to scsi host
+ *
+- * Must be called after fcoe_sw_lport_config() and fcoe_sw_netdev_config()
++ * Must be called after fcoe_sw_lport_config) and fcoe_sw_netdev_config()
+ *
+ * Returns : 0 for success
++ *
+ */
+ static int fcoe_sw_shost_config(struct fc_lport *lp, struct Scsi_Host *shost,
+ struct device *dev)
+@@ -258,8 +261,8 @@
+ return 0;
+ }
+
+-/**
+- * fcoe_sw_em_config() - allocates em for this lport
++/*
++ * fcoe_sw_em_config - allocates em for this lport
+ * @lp: the port that em is to allocated for
+ *
+ * Returns : 0 on success
+@@ -276,8 +279,8 @@
+ return 0;
+ }
+
+-/**
+- * fcoe_sw_destroy() - FCoE software HBA tear-down function
++/*
++ * fcoe_sw_destroy - FCoE software HBA tear-down function
+ * @netdev: ptr to the associated net_device
+ *
+ * Returns: 0 if link is OK for use by FCoE.
+@@ -298,7 +301,7 @@
+ if (!lp)
+ return -ENODEV;
+
+- fc = lport_priv(lp);
++ fc = fcoe_softc(lp);
+
+ /* Logout of the fabric */
+ fc_fabric_logoff(lp);
+@@ -350,8 +353,8 @@
+ .frame_send = fcoe_xmit,
+ };
+
+-/**
+- * fcoe_sw_create() - this function creates the fcoe interface
++/*
++ * fcoe_sw_create - this function creates the fcoe interface
+ * @netdev: pointer the associated netdevice
+ *
+ * Creates fc_lport struct and scsi_host for lport, configures lport
+@@ -437,8 +440,8 @@
+ return rc;
+ }
+
+-/**
+- * fcoe_sw_match() - The FCoE SW transport match function
++/*
++ * fcoe_sw_match - the fcoe sw transport match function
+ *
+ * Returns : false always
+ */
+@@ -458,8 +461,8 @@
+ .device = 0xffff,
+ };
+
+-/**
+- * fcoe_sw_init() - Registers fcoe_sw_transport
++/*
++ * fcoe_sw_init - registers fcoe_sw_transport
+ *
+ * Returns : 0 on success
+ */
+@@ -468,22 +471,17 @@
+ /* attach to scsi transport */
+ scsi_transport_fcoe_sw =
+ fc_attach_transport(&fcoe_sw_transport_function);
+-
+ if (!scsi_transport_fcoe_sw) {
+ printk(KERN_ERR "fcoe_sw_init:fc_attach_transport() failed\n");
+ return -ENODEV;
+ }
+-
+- mutex_init(&fcoe_sw_transport.devlock);
+- INIT_LIST_HEAD(&fcoe_sw_transport.devlist);
+-
+ /* register sw transport */
+ fcoe_transport_register(&fcoe_sw_transport);
+ return 0;
+ }
+
+-/**
+- * fcoe_sw_exit() - Unregisters fcoe_sw_transport
++/*
++ * fcoe_sw_exit - unregisters fcoe_sw_transport
+ *
+ * Returns : 0 on success
+ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/fcoe/fc_transport_fcoe.c linux-2.6.29-rc3.owrt/drivers/scsi/fcoe/fc_transport_fcoe.c
+--- linux-2.6.29.owrt/drivers/scsi/fcoe/fc_transport_fcoe.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/fcoe/fc_transport_fcoe.c 2009-05-10 23:48:29.000000000 +0200
+@@ -33,19 +33,19 @@
+ static DEFINE_MUTEX(fcoe_transports_lock);
+
+ /**
+- * fcoe_transport_default() - Returns ptr to the default transport fcoe_sw
+- */
++ * fcoe_transport_default - returns ptr to the default transport fcoe_sw
++ **/
+ struct fcoe_transport *fcoe_transport_default(void)
+ {
+ return &fcoe_sw_transport;
+ }
+
+ /**
+- * fcoe_transport_to_pcidev() - get the pci dev from a netdev
++ * fcoe_transport_to_pcidev - get the pci dev from a netdev
+ * @netdev: the netdev that pci dev will be retrived from
+ *
+ * Returns: NULL or the corrsponding pci_dev
+- */
++ **/
+ struct pci_dev *fcoe_transport_pcidev(const struct net_device *netdev)
+ {
+ if (!netdev->dev.parent)
+@@ -54,17 +54,18 @@
+ }
+
+ /**
+- * fcoe_transport_device_lookup() - Lookup a transport
++ * fcoe_transport_device_lookup - find out netdev is managed by the
++ * transport
++ * assign a transport to a device
+ * @netdev: the netdev the transport to be attached to
+ *
+ * This will look for existing offload driver, if not found, it falls back to
+ * the default sw hba (fcoe_sw) as its fcoe transport.
+ *
+ * Returns: 0 for success
+- */
+-static struct fcoe_transport_internal *
+-fcoe_transport_device_lookup(struct fcoe_transport *t,
+- struct net_device *netdev)
++ **/
++static struct fcoe_transport_internal *fcoe_transport_device_lookup(
++ struct fcoe_transport *t, struct net_device *netdev)
+ {
+ struct fcoe_transport_internal *ti;
+
+@@ -80,14 +81,14 @@
+ return NULL;
+ }
+ /**
+- * fcoe_transport_device_add() - Assign a transport to a device
++ * fcoe_transport_device_add - assign a transport to a device
+ * @netdev: the netdev the transport to be attached to
+ *
+ * This will look for existing offload driver, if not found, it falls back to
+ * the default sw hba (fcoe_sw) as its fcoe transport.
+ *
+ * Returns: 0 for success
+- */
++ **/
+ static int fcoe_transport_device_add(struct fcoe_transport *t,
+ struct net_device *netdev)
+ {
+@@ -122,14 +123,14 @@
+ }
+
+ /**
+- * fcoe_transport_device_remove() - Remove a device from its transport
++ * fcoe_transport_device_remove - remove a device from its transport
+ * @netdev: the netdev the transport to be attached to
+ *
+- * This removes the device from the transport so the given transport will
++ * this removes the device from the transport so the given transport will
+ * not manage this device any more
+ *
+ * Returns: 0 for success
+- */
++ **/
+ static int fcoe_transport_device_remove(struct fcoe_transport *t,
+ struct net_device *netdev)
+ {
+@@ -154,13 +155,13 @@
+ }
+
+ /**
+- * fcoe_transport_device_remove_all() - Remove all from transport devlist
++ * fcoe_transport_device_remove_all - remove all from transport devlist
+ *
+- * This removes the device from the transport so the given transport will
++ * this removes the device from the transport so the given transport will
+ * not manage this device any more
+ *
+ * Returns: 0 for success
+- */
++ **/
+ static void fcoe_transport_device_remove_all(struct fcoe_transport *t)
+ {
+ struct fcoe_transport_internal *ti, *tmp;
+@@ -174,18 +175,18 @@
+ }
+
+ /**
+- * fcoe_transport_match() - Use the bus device match function to match the hw
+- * @t: The fcoe transport to check
+- * @netdev: The netdev to match against
++ * fcoe_transport_match - use the bus device match function to match the hw
++ * @t: the fcoe transport
++ * @netdev:
+ *
+- * This function is used to check if the given transport wants to manage the
++ * This function is used to check if the givne transport wants to manage the
+ * input netdev. if the transports implements the match function, it will be
+ * called, o.w. we just compare the pci vendor and device id.
+ *
+ * Returns: true for match up
+- */
++ **/
+ static bool fcoe_transport_match(struct fcoe_transport *t,
+- struct net_device *netdev)
++ struct net_device *netdev)
+ {
+ /* match transport by vendor and device id */
+ struct pci_dev *pci;
+@@ -209,17 +210,17 @@
+ }
+
+ /**
+- * fcoe_transport_lookup() - Check if the transport is already registered
++ * fcoe_transport_lookup - check if the transport is already registered
+ * @t: the transport to be looked up
+ *
+ * This compares the parent device (pci) vendor and device id
+ *
+ * Returns: NULL if not found
+ *
+- * TODO: return default sw transport if no other transport is found
+- */
+-static struct fcoe_transport *
+-fcoe_transport_lookup(struct net_device *netdev)
++ * TODO - return default sw transport if no other transport is found
++ **/
++static struct fcoe_transport *fcoe_transport_lookup(
++ struct net_device *netdev)
+ {
+ struct fcoe_transport *t;
+
+@@ -238,11 +239,11 @@
+ }
+
+ /**
+- * fcoe_transport_register() - Adds a fcoe transport to the fcoe transports list
++ * fcoe_transport_register - adds a fcoe transport to the fcoe transports list
+ * @t: ptr to the fcoe transport to be added
+ *
+ * Returns: 0 for success
+- */
++ **/
+ int fcoe_transport_register(struct fcoe_transport *t)
+ {
+ struct fcoe_transport *tt;
+@@ -258,6 +259,9 @@
+ list_add_tail(&t->list, &fcoe_transports);
+ mutex_unlock(&fcoe_transports_lock);
+
++ mutex_init(&t->devlock);
++ INIT_LIST_HEAD(&t->devlist);
++
+ printk(KERN_DEBUG "fcoe_transport_register:%s\n", t->name);
+
+ return 0;
+@@ -265,11 +269,11 @@
+ EXPORT_SYMBOL_GPL(fcoe_transport_register);
+
+ /**
+- * fcoe_transport_unregister() - Remove the tranport fro the fcoe transports list
++ * fcoe_transport_unregister - remove the tranport fro the fcoe transports list
+ * @t: ptr to the fcoe transport to be removed
+ *
+ * Returns: 0 for success
+- */
++ **/
+ int fcoe_transport_unregister(struct fcoe_transport *t)
+ {
+ struct fcoe_transport *tt, *tmp;
+@@ -290,8 +294,8 @@
+ }
+ EXPORT_SYMBOL_GPL(fcoe_transport_unregister);
+
+-/**
+- * fcoe_load_transport_driver() - Load an offload driver by alias name
++/*
++ * fcoe_load_transport_driver - load an offload driver by alias name
+ * @netdev: the target net device
+ *
+ * Requests for an offload driver module as the fcoe transport, if fails, it
+@@ -303,7 +307,7 @@
+ * 3. pure hw fcoe hba may not have netdev
+ *
+ * Returns: 0 for success
+- */
++ **/
+ int fcoe_load_transport_driver(struct net_device *netdev)
+ {
+ struct pci_dev *pci;
+@@ -331,14 +335,14 @@
+ EXPORT_SYMBOL_GPL(fcoe_load_transport_driver);
+
+ /**
+- * fcoe_transport_attach() - Load transport to fcoe
++ * fcoe_transport_attach - load transport to fcoe
+ * @netdev: the netdev the transport to be attached to
+ *
+ * This will look for existing offload driver, if not found, it falls back to
+ * the default sw hba (fcoe_sw) as its fcoe transport.
+ *
+ * Returns: 0 for success
+- */
++ **/
+ int fcoe_transport_attach(struct net_device *netdev)
+ {
+ struct fcoe_transport *t;
+@@ -369,11 +373,11 @@
+ EXPORT_SYMBOL_GPL(fcoe_transport_attach);
+
+ /**
+- * fcoe_transport_release() - Unload transport from fcoe
++ * fcoe_transport_release - unload transport from fcoe
+ * @netdev: the net device on which fcoe is to be released
+ *
+ * Returns: 0 for success
+- */
++ **/
+ int fcoe_transport_release(struct net_device *netdev)
+ {
+ struct fcoe_transport *t;
+@@ -406,12 +410,12 @@
+ EXPORT_SYMBOL_GPL(fcoe_transport_release);
+
+ /**
+- * fcoe_transport_init() - Initializes fcoe transport layer
++ * fcoe_transport_init - initializes fcoe transport layer
+ *
+ * This prepares for the fcoe transport layer
+ *
+ * Returns: none
+- */
++ **/
+ int __init fcoe_transport_init(void)
+ {
+ INIT_LIST_HEAD(&fcoe_transports);
+@@ -420,13 +424,12 @@
+ }
+
+ /**
+- * fcoe_transport_exit() - Cleans up the fcoe transport layer
+- *
++ * fcoe_transport_exit - cleans up the fcoe transport layer
+ * This cleans up the fcoe transport layer. removing any transport on the list,
+ * note that the transport destroy func is not called here.
+ *
+ * Returns: none
+- */
++ **/
+ int __exit fcoe_transport_exit(void)
+ {
+ struct fcoe_transport *t, *tmp;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/fcoe/libfcoe.c linux-2.6.29-rc3.owrt/drivers/scsi/fcoe/libfcoe.c
+--- linux-2.6.29.owrt/drivers/scsi/fcoe/libfcoe.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/fcoe/libfcoe.c 2009-05-10 23:48:29.000000000 +0200
+@@ -49,7 +49,6 @@
+ static int debug_fcoe;
+
+ #define FCOE_MAX_QUEUE_DEPTH 256
+-#define FCOE_LOW_QUEUE_DEPTH 32
+
+ /* destination address mode */
+ #define FCOE_GW_ADDR_MODE 0x00
+@@ -70,6 +69,8 @@
+
+ /* Function Prototyes */
+ static int fcoe_check_wait_queue(struct fc_lport *);
++static void fcoe_insert_wait_queue_head(struct fc_lport *, struct sk_buff *);
++static void fcoe_insert_wait_queue(struct fc_lport *, struct sk_buff *);
+ static void fcoe_recv_flogi(struct fcoe_softc *, struct fc_frame *, u8 *);
+ #ifdef CONFIG_HOTPLUG_CPU
+ static int fcoe_cpu_callback(struct notifier_block *, ulong, void *);
+@@ -90,13 +91,13 @@
+ };
+
+ /**
+- * fcoe_create_percpu_data() - creates the associated cpu data
++ * fcoe_create_percpu_data - creates the associated cpu data
+ * @cpu: index for the cpu where fcoe cpu data will be created
+ *
+ * create percpu stats block, from cpu add notifier
+ *
+ * Returns: none
+- */
++ **/
+ static void fcoe_create_percpu_data(int cpu)
+ {
+ struct fc_lport *lp;
+@@ -114,13 +115,13 @@
+ }
+
+ /**
+- * fcoe_destroy_percpu_data() - destroys the associated cpu data
++ * fcoe_destroy_percpu_data - destroys the associated cpu data
+ * @cpu: index for the cpu where fcoe cpu data will destroyed
+ *
+ * destroy percpu stats block called by cpu add/remove notifier
+ *
+ * Retuns: none
+- */
++ **/
+ static void fcoe_destroy_percpu_data(int cpu)
+ {
+ struct fc_lport *lp;
+@@ -136,7 +137,7 @@
+ }
+
+ /**
+- * fcoe_cpu_callback() - fcoe cpu hotplug event callback
++ * fcoe_cpu_callback - fcoe cpu hotplug event callback
+ * @nfb: callback data block
+ * @action: event triggering the callback
+ * @hcpu: index for the cpu of this event
+@@ -144,7 +145,7 @@
+ * this creates or destroys per cpu data for fcoe
+ *
+ * Returns NOTIFY_OK always.
+- */
++ **/
+ static int fcoe_cpu_callback(struct notifier_block *nfb, unsigned long action,
+ void *hcpu)
+ {
+@@ -165,7 +166,7 @@
+ #endif /* CONFIG_HOTPLUG_CPU */
+
+ /**
+- * fcoe_rcv() - this is the fcoe receive function called by NET_RX_SOFTIRQ
++ * fcoe_rcv - this is the fcoe receive function called by NET_RX_SOFTIRQ
+ * @skb: the receive skb
+ * @dev: associated net device
+ * @ptype: context
+@@ -174,7 +175,7 @@
+ * this function will receive the packet and build fc frame and pass it up
+ *
+ * Returns: 0 for success
+- */
++ **/
+ int fcoe_rcv(struct sk_buff *skb, struct net_device *dev,
+ struct packet_type *ptype, struct net_device *olddev)
+ {
+@@ -264,11 +265,11 @@
+ EXPORT_SYMBOL_GPL(fcoe_rcv);
+
+ /**
+- * fcoe_start_io() - pass to netdev to start xmit for fcoe
++ * fcoe_start_io - pass to netdev to start xmit for fcoe
+ * @skb: the skb to be xmitted
+ *
+ * Returns: 0 for success
+- */
++ **/
+ static inline int fcoe_start_io(struct sk_buff *skb)
+ {
+ int rc;
+@@ -282,12 +283,12 @@
+ }
+
+ /**
+- * fcoe_get_paged_crc_eof() - in case we need alloc a page for crc_eof
++ * fcoe_get_paged_crc_eof - in case we need alloc a page for crc_eof
+ * @skb: the skb to be xmitted
+ * @tlen: total len
+ *
+ * Returns: 0 for success
+- */
++ **/
+ static int fcoe_get_paged_crc_eof(struct sk_buff *skb, int tlen)
+ {
+ struct fcoe_percpu_s *fps;
+@@ -325,12 +326,13 @@
+ }
+
+ /**
+- * fcoe_fc_crc() - calculates FC CRC in this fcoe skb
++ * fcoe_fc_crc - calculates FC CRC in this fcoe skb
+ * @fp: the fc_frame containg data to be checksummed
+ *
+ * This uses crc32() to calculate the crc for fc frame
+ * Return : 32 bit crc
+- */
++ *
++ **/
+ u32 fcoe_fc_crc(struct fc_frame *fp)
+ {
+ struct sk_buff *skb = fp_skb(fp);
+@@ -361,12 +363,13 @@
+ EXPORT_SYMBOL_GPL(fcoe_fc_crc);
+
+ /**
+- * fcoe_xmit() - FCoE frame transmit function
++ * fcoe_xmit - FCoE frame transmit function
+ * @lp: the associated local port
+ * @fp: the fc_frame to be transmitted
+ *
+ * Return : 0 for success
+- */
++ *
++ **/
+ int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp)
+ {
+ int wlen, rc = 0;
+@@ -386,7 +389,7 @@
+
+ WARN_ON((fr_len(fp) % sizeof(u32)) != 0);
+
+- fc = lport_priv(lp);
++ fc = fcoe_softc(lp);
+ /*
+ * if it is a flogi then we need to learn gw-addr
+ * and my own fcid
+@@ -436,7 +439,7 @@
+ if (skb_is_nonlinear(skb)) {
+ skb_frag_t *frag;
+ if (fcoe_get_paged_crc_eof(skb, tlen)) {
+- kfree_skb(skb);
++ kfree(skb);
+ return -ENOMEM;
+ }
+ frag = &skb_shinfo(skb)->frags[skb_shinfo(skb)->nr_frags - 1];
+@@ -499,22 +502,21 @@
+ rc = fcoe_start_io(skb);
+
+ if (rc) {
+- spin_lock_bh(&fc->fcoe_pending_queue.lock);
+- __skb_queue_tail(&fc->fcoe_pending_queue, skb);
+- spin_unlock_bh(&fc->fcoe_pending_queue.lock);
++ fcoe_insert_wait_queue(lp, skb);
+ if (fc->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH)
+- lp->qfull = 1;
++ fc_pause(lp);
+ }
+
+ return 0;
+ }
+ EXPORT_SYMBOL_GPL(fcoe_xmit);
+
+-/**
+- * fcoe_percpu_receive_thread() - recv thread per cpu
++/*
++ * fcoe_percpu_receive_thread - recv thread per cpu
+ * @arg: ptr to the fcoe per cpu struct
+ *
+ * Return: 0 for success
++ *
+ */
+ int fcoe_percpu_receive_thread(void *arg)
+ {
+@@ -531,7 +533,7 @@
+ struct fcoe_softc *fc;
+ struct fcoe_hdr *hp;
+
+- set_user_nice(current, -20);
++ set_user_nice(current, 19);
+
+ while (!kthread_should_stop()) {
+
+@@ -656,7 +658,7 @@
+ }
+
+ /**
+- * fcoe_recv_flogi() - flogi receive function
++ * fcoe_recv_flogi - flogi receive function
+ * @fc: associated fcoe_softc
+ * @fp: the recieved frame
+ * @sa: the source address of this flogi
+@@ -665,7 +667,7 @@
+ * mac address for the initiator, eitehr OUI based or GW based.
+ *
+ * Returns: none
+- */
++ **/
+ static void fcoe_recv_flogi(struct fcoe_softc *fc, struct fc_frame *fp, u8 *sa)
+ {
+ struct fc_frame_header *fh;
+@@ -713,23 +715,32 @@
+ }
+
+ /**
+- * fcoe_watchdog() - fcoe timer callback
++ * fcoe_watchdog - fcoe timer callback
+ * @vp:
+ *
+- * This checks the pending queue length for fcoe and set lport qfull
++ * This checks the pending queue length for fcoe and put fcoe to be paused state
+ * if the FCOE_MAX_QUEUE_DEPTH is reached. This is done for all fc_lport on the
+ * fcoe_hostlist.
+ *
+ * Returns: 0 for success
+- */
++ **/
+ void fcoe_watchdog(ulong vp)
+ {
++ struct fc_lport *lp;
+ struct fcoe_softc *fc;
++ int paused = 0;
+
+ read_lock(&fcoe_hostlist_lock);
+ list_for_each_entry(fc, &fcoe_hostlist, list) {
+- if (fc->lp)
+- fcoe_check_wait_queue(fc->lp);
++ lp = fc->lp;
++ if (lp) {
++ if (fc->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH)
++ paused = 1;
++ if (fcoe_check_wait_queue(lp) < FCOE_MAX_QUEUE_DEPTH) {
++ if (paused)
++ fc_unpause(lp);
++ }
++ }
+ }
+ read_unlock(&fcoe_hostlist_lock);
+
+@@ -739,64 +750,96 @@
+
+
+ /**
+- * fcoe_check_wait_queue() - put the skb into fcoe pending xmit queue
++ * fcoe_check_wait_queue - put the skb into fcoe pending xmit queue
+ * @lp: the fc_port for this skb
+ * @skb: the associated skb to be xmitted
+ *
+ * This empties the wait_queue, dequeue the head of the wait_queue queue
+ * and calls fcoe_start_io() for each packet, if all skb have been
+- * transmitted, return qlen or -1 if a error occurs, then restore
+- * wait_queue and try again later.
++ * transmitted, return 0 if a error occurs, then restore wait_queue and
++ * try again later.
+ *
+ * The wait_queue is used when the skb transmit fails. skb will go
+ * in the wait_queue which will be emptied by the time function OR
+ * by the next skb transmit.
+ *
+ * Returns: 0 for success
+- */
++ **/
+ static int fcoe_check_wait_queue(struct fc_lport *lp)
+ {
+- struct fcoe_softc *fc = lport_priv(lp);
++ int rc, unpause = 0;
++ int paused = 0;
+ struct sk_buff *skb;
+- int rc = -1;
++ struct fcoe_softc *fc;
+
++ fc = fcoe_softc(lp);
+ spin_lock_bh(&fc->fcoe_pending_queue.lock);
+- if (fc->fcoe_pending_queue_active)
+- goto out;
+- fc->fcoe_pending_queue_active = 1;
+-
+- while (fc->fcoe_pending_queue.qlen) {
+- /* keep qlen > 0 until fcoe_start_io succeeds */
+- fc->fcoe_pending_queue.qlen++;
+- skb = __skb_dequeue(&fc->fcoe_pending_queue);
+-
+- spin_unlock_bh(&fc->fcoe_pending_queue.lock);
+- rc = fcoe_start_io(skb);
+- spin_lock_bh(&fc->fcoe_pending_queue.lock);
+
+- if (rc) {
+- __skb_queue_head(&fc->fcoe_pending_queue, skb);
+- /* undo temporary increment above */
+- fc->fcoe_pending_queue.qlen--;
+- break;
++ /*
++ * is this interface paused?
++ */
++ if (fc->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH)
++ paused = 1;
++ if (fc->fcoe_pending_queue.qlen) {
++ while ((skb = __skb_dequeue(&fc->fcoe_pending_queue)) != NULL) {
++ spin_unlock_bh(&fc->fcoe_pending_queue.lock);
++ rc = fcoe_start_io(skb);
++ if (rc) {
++ fcoe_insert_wait_queue_head(lp, skb);
++ return rc;
++ }
++ spin_lock_bh(&fc->fcoe_pending_queue.lock);
+ }
+- /* undo temporary increment above */
+- fc->fcoe_pending_queue.qlen--;
++ if (fc->fcoe_pending_queue.qlen < FCOE_MAX_QUEUE_DEPTH)
++ unpause = 1;
+ }
++ spin_unlock_bh(&fc->fcoe_pending_queue.lock);
++ if ((unpause) && (paused))
++ fc_unpause(lp);
++ return fc->fcoe_pending_queue.qlen;
++}
+
+- if (fc->fcoe_pending_queue.qlen < FCOE_LOW_QUEUE_DEPTH)
+- lp->qfull = 0;
+- fc->fcoe_pending_queue_active = 0;
+- rc = fc->fcoe_pending_queue.qlen;
+-out:
++/**
++ * fcoe_insert_wait_queue_head - puts skb to fcoe pending queue head
++ * @lp: the fc_port for this skb
++ * @skb: the associated skb to be xmitted
++ *
++ * Returns: none
++ **/
++static void fcoe_insert_wait_queue_head(struct fc_lport *lp,
++ struct sk_buff *skb)
++{
++ struct fcoe_softc *fc;
++
++ fc = fcoe_softc(lp);
++ spin_lock_bh(&fc->fcoe_pending_queue.lock);
++ __skb_queue_head(&fc->fcoe_pending_queue, skb);
+ spin_unlock_bh(&fc->fcoe_pending_queue.lock);
+- return rc;
+ }
+
+ /**
+- * fcoe_dev_setup() - setup link change notification interface
+- */
+-static void fcoe_dev_setup()
++ * fcoe_insert_wait_queue - put the skb into fcoe pending queue tail
++ * @lp: the fc_port for this skb
++ * @skb: the associated skb to be xmitted
++ *
++ * Returns: none
++ **/
++static void fcoe_insert_wait_queue(struct fc_lport *lp,
++ struct sk_buff *skb)
++{
++ struct fcoe_softc *fc;
++
++ fc = fcoe_softc(lp);
++ spin_lock_bh(&fc->fcoe_pending_queue.lock);
++ __skb_queue_tail(&fc->fcoe_pending_queue, skb);
++ spin_unlock_bh(&fc->fcoe_pending_queue.lock);
++}
++
++/**
++ * fcoe_dev_setup - setup link change notification interface
++ *
++ **/
++static void fcoe_dev_setup(void)
+ {
+ /*
+ * here setup a interface specific wd time to
+@@ -806,15 +849,15 @@
+ }
+
+ /**
+- * fcoe_dev_setup() - cleanup link change notification interface
+- */
++ * fcoe_dev_setup - cleanup link change notification interface
++ **/
+ static void fcoe_dev_cleanup(void)
+ {
+ unregister_netdevice_notifier(&fcoe_notifier);
+ }
+
+ /**
+- * fcoe_device_notification() - netdev event notification callback
++ * fcoe_device_notification - netdev event notification callback
+ * @notifier: context of the notification
+ * @event: type of event
+ * @ptr: fixed array for output parsed ifname
+@@ -822,7 +865,7 @@
+ * This function is called by the ethernet driver in case of link change event
+ *
+ * Returns: 0 for success
+- */
++ **/
+ static int fcoe_device_notification(struct notifier_block *notifier,
+ ulong event, void *ptr)
+ {
+@@ -830,7 +873,7 @@
+ struct net_device *real_dev = ptr;
+ struct fcoe_softc *fc;
+ struct fcoe_dev_stats *stats;
+- u32 new_link_up;
++ u16 new_status;
+ u32 mfs;
+ int rc = NOTIFY_OK;
+
+@@ -847,15 +890,17 @@
+ goto out;
+ }
+
+- new_link_up = lp->link_up;
++ new_status = lp->link_status;
+ switch (event) {
+ case NETDEV_DOWN:
+ case NETDEV_GOING_DOWN:
+- new_link_up = 0;
++ new_status &= ~FC_LINK_UP;
+ break;
+ case NETDEV_UP:
+ case NETDEV_CHANGE:
+- new_link_up = !fcoe_link_ok(lp);
++ new_status &= ~FC_LINK_UP;
++ if (!fcoe_link_ok(lp))
++ new_status |= FC_LINK_UP;
+ break;
+ case NETDEV_CHANGEMTU:
+ mfs = fc->real_dev->mtu -
+@@ -863,15 +908,17 @@
+ sizeof(struct fcoe_crc_eof));
+ if (mfs >= FC_MIN_MAX_FRAME)
+ fc_set_mfs(lp, mfs);
+- new_link_up = !fcoe_link_ok(lp);
++ new_status &= ~FC_LINK_UP;
++ if (!fcoe_link_ok(lp))
++ new_status |= FC_LINK_UP;
+ break;
+ case NETDEV_REGISTER:
+ break;
+ default:
+ FC_DBG("unknown event %ld call", event);
+ }
+- if (lp->link_up != new_link_up) {
+- if (new_link_up)
++ if (lp->link_status != new_status) {
++ if ((new_status & FC_LINK_UP) == FC_LINK_UP)
+ fc_linkup(lp);
+ else {
+ stats = lp->dev_stats[smp_processor_id()];
+@@ -886,12 +933,12 @@
+ }
+
+ /**
+- * fcoe_if_to_netdev() - parse a name buffer to get netdev
++ * fcoe_if_to_netdev - parse a name buffer to get netdev
+ * @ifname: fixed array for output parsed ifname
+ * @buffer: incoming buffer to be copied
+ *
+ * Returns: NULL or ptr to netdeive
+- */
++ **/
+ static struct net_device *fcoe_if_to_netdev(const char *buffer)
+ {
+ char *cp;
+@@ -908,13 +955,13 @@
+ }
+
+ /**
+- * fcoe_netdev_to_module_owner() - finds out the nic drive moddule of the netdev
++ * fcoe_netdev_to_module_owner - finds out the nic drive moddule of the netdev
+ * @netdev: the target netdev
+ *
+ * Returns: ptr to the struct module, NULL for failure
+- */
+-static struct module *
+-fcoe_netdev_to_module_owner(const struct net_device *netdev)
++ **/
++static struct module *fcoe_netdev_to_module_owner(
++ const struct net_device *netdev)
+ {
+ struct device *dev;
+
+@@ -932,14 +979,12 @@
+ }
+
+ /**
+- * fcoe_ethdrv_get() - Hold the Ethernet driver
+- * @netdev: the target netdev
+- *
+- * Holds the Ethernet driver module by try_module_get() for
++ * fcoe_ethdrv_get - holds the nic driver module by try_module_get() for
+ * the corresponding netdev.
++ * @netdev: the target netdev
+ *
+ * Returns: 0 for succsss
+- */
++ **/
+ static int fcoe_ethdrv_get(const struct net_device *netdev)
+ {
+ struct module *owner;
+@@ -954,14 +999,12 @@
+ }
+
+ /**
+- * fcoe_ethdrv_put() - Release the Ethernet driver
+- * @netdev: the target netdev
+- *
+- * Releases the Ethernet driver module by module_put for
++ * fcoe_ethdrv_get - releases the nic driver module by module_put for
+ * the corresponding netdev.
++ * @netdev: the target netdev
+ *
+ * Returns: 0 for succsss
+- */
++ **/
+ static int fcoe_ethdrv_put(const struct net_device *netdev)
+ {
+ struct module *owner;
+@@ -977,12 +1020,12 @@
+ }
+
+ /**
+- * fcoe_destroy() - handles the destroy from sysfs
++ * fcoe_destroy- handles the destroy from sysfs
+ * @buffer: expcted to be a eth if name
+ * @kp: associated kernel param
+ *
+ * Returns: 0 for success
+- */
++ **/
+ static int fcoe_destroy(const char *buffer, struct kernel_param *kp)
+ {
+ int rc;
+@@ -1015,12 +1058,12 @@
+ }
+
+ /**
+- * fcoe_create() - Handles the create call from sysfs
++ * fcoe_create - handles the create call from sysfs
+ * @buffer: expcted to be a eth if name
+ * @kp: associated kernel param
+ *
+ * Returns: 0 for success
+- */
++ **/
+ static int fcoe_create(const char *buffer, struct kernel_param *kp)
+ {
+ int rc;
+@@ -1061,8 +1104,8 @@
+ __MODULE_PARM_TYPE(destroy, "string");
+ MODULE_PARM_DESC(destroy, "Destroy fcoe port");
+
+-/**
+- * fcoe_link_ok() - Check if link is ok for the fc_lport
++/*
++ * fcoe_link_ok - check if link is ok for the fc_lport
+ * @lp: ptr to the fc_lport
+ *
+ * Any permanently-disqualifying conditions have been previously checked.
+@@ -1077,7 +1120,7 @@
+ */
+ int fcoe_link_ok(struct fc_lport *lp)
+ {
+- struct fcoe_softc *fc = lport_priv(lp);
++ struct fcoe_softc *fc = fcoe_softc(lp);
+ struct net_device *dev = fc->real_dev;
+ struct ethtool_cmd ecmd = { ETHTOOL_GSET };
+ int rc = 0;
+@@ -1106,8 +1149,9 @@
+ }
+ EXPORT_SYMBOL_GPL(fcoe_link_ok);
+
+-/**
+- * fcoe_percpu_clean() - Clear the pending skbs for an lport
++/*
++ * fcoe_percpu_clean - frees skb of the corresponding lport from the per
++ * cpu queue.
+ * @lp: the fc_lport
+ */
+ void fcoe_percpu_clean(struct fc_lport *lp)
+@@ -1141,11 +1185,11 @@
+ EXPORT_SYMBOL_GPL(fcoe_percpu_clean);
+
+ /**
+- * fcoe_clean_pending_queue() - Dequeue a skb and free it
++ * fcoe_clean_pending_queue - dequeue skb and free it
+ * @lp: the corresponding fc_lport
+ *
+ * Returns: none
+- */
++ **/
+ void fcoe_clean_pending_queue(struct fc_lport *lp)
+ {
+ struct fcoe_softc *fc = lport_priv(lp);
+@@ -1162,21 +1206,21 @@
+ EXPORT_SYMBOL_GPL(fcoe_clean_pending_queue);
+
+ /**
+- * libfc_host_alloc() - Allocate a Scsi_Host with room for the fc_lport
++ * libfc_host_alloc - allocate a Scsi_Host with room for the fc_lport
+ * @sht: ptr to the scsi host templ
+ * @priv_size: size of private data after fc_lport
+ *
+ * Returns: ptr to Scsi_Host
+- * TODO: to libfc?
++ * TODO - to libfc?
+ */
+-static inline struct Scsi_Host *
+-libfc_host_alloc(struct scsi_host_template *sht, int priv_size)
++static inline struct Scsi_Host *libfc_host_alloc(
++ struct scsi_host_template *sht, int priv_size)
+ {
+ return scsi_host_alloc(sht, sizeof(struct fc_lport) + priv_size);
+ }
+
+ /**
+- * fcoe_host_alloc() - Allocate a Scsi_Host with room for the fcoe_softc
++ * fcoe_host_alloc - allocate a Scsi_Host with room for the fcoe_softc
+ * @sht: ptr to the scsi host templ
+ * @priv_size: size of private data after fc_lport
+ *
+@@ -1188,8 +1232,8 @@
+ }
+ EXPORT_SYMBOL_GPL(fcoe_host_alloc);
+
+-/**
+- * fcoe_reset() - Resets the fcoe
++/*
++ * fcoe_reset - resets the fcoe
+ * @shost: shost the reset is from
+ *
+ * Returns: always 0
+@@ -1202,8 +1246,8 @@
+ }
+ EXPORT_SYMBOL_GPL(fcoe_reset);
+
+-/**
+- * fcoe_wwn_from_mac() - Converts 48-bit IEEE MAC address to 64-bit FC WWN.
++/*
++ * fcoe_wwn_from_mac - converts 48-bit IEEE MAC address to 64-bit FC WWN.
+ * @mac: mac address
+ * @scheme: check port
+ * @port: port indicator for converting
+@@ -1242,15 +1286,14 @@
+ return wwn;
+ }
+ EXPORT_SYMBOL_GPL(fcoe_wwn_from_mac);
+-
+-/**
+- * fcoe_hostlist_lookup_softc() - find the corresponding lport by a given device
++/*
++ * fcoe_hostlist_lookup_softc - find the corresponding lport by a given device
+ * @device: this is currently ptr to net_device
+ *
+ * Returns: NULL or the located fcoe_softc
+ */
+-static struct fcoe_softc *
+-fcoe_hostlist_lookup_softc(const struct net_device *dev)
++static struct fcoe_softc *fcoe_hostlist_lookup_softc(
++ const struct net_device *dev)
+ {
+ struct fcoe_softc *fc;
+
+@@ -1265,8 +1308,8 @@
+ return NULL;
+ }
+
+-/**
+- * fcoe_hostlist_lookup() - Find the corresponding lport by netdev
++/*
++ * fcoe_hostlist_lookup - find the corresponding lport by netdev
+ * @netdev: ptr to net_device
+ *
+ * Returns: 0 for success
+@@ -1281,8 +1324,8 @@
+ }
+ EXPORT_SYMBOL_GPL(fcoe_hostlist_lookup);
+
+-/**
+- * fcoe_hostlist_add() - Add a lport to lports list
++/*
++ * fcoe_hostlist_add - add a lport to lports list
+ * @lp: ptr to the fc_lport to badded
+ *
+ * Returns: 0 for success
+@@ -1293,7 +1336,7 @@
+
+ fc = fcoe_hostlist_lookup_softc(fcoe_netdev(lp));
+ if (!fc) {
+- fc = lport_priv(lp);
++ fc = fcoe_softc(lp);
+ write_lock_bh(&fcoe_hostlist_lock);
+ list_add_tail(&fc->list, &fcoe_hostlist);
+ write_unlock_bh(&fcoe_hostlist_lock);
+@@ -1302,8 +1345,8 @@
+ }
+ EXPORT_SYMBOL_GPL(fcoe_hostlist_add);
+
+-/**
+- * fcoe_hostlist_remove() - remove a lport from lports list
++/*
++ * fcoe_hostlist_remove - remove a lport from lports list
+ * @lp: ptr to the fc_lport to badded
+ *
+ * Returns: 0 for success
+@@ -1323,12 +1366,12 @@
+ EXPORT_SYMBOL_GPL(fcoe_hostlist_remove);
+
+ /**
+- * fcoe_libfc_config() - sets up libfc related properties for lport
++ * fcoe_libfc_config - sets up libfc related properties for lport
+ * @lp: ptr to the fc_lport
+ * @tt: libfc function template
+ *
+ * Returns : 0 for success
+- */
++ **/
+ int fcoe_libfc_config(struct fc_lport *lp, struct libfc_function_template *tt)
+ {
+ /* Set the function pointers set by the LLDD */
+@@ -1346,14 +1389,14 @@
+ EXPORT_SYMBOL_GPL(fcoe_libfc_config);
+
+ /**
+- * fcoe_init() - fcoe module loading initialization
++ * fcoe_init - fcoe module loading initialization
+ *
+ * Initialization routine
+ * 1. Will create fc transport software structure
+ * 2. initialize the link list of port information structure
+ *
+ * Returns 0 on success, negative on failure
+- */
++ **/
+ static int __init fcoe_init(void)
+ {
+ int cpu;
+@@ -1390,6 +1433,7 @@
+ } else {
+ fcoe_percpu[cpu] = NULL;
+ kfree(p);
++
+ }
+ }
+ }
+@@ -1399,9 +1443,11 @@
+ */
+ fcoe_dev_setup();
+
+- setup_timer(&fcoe_timer, fcoe_watchdog, 0);
+-
+- mod_timer(&fcoe_timer, jiffies + (10 * HZ));
++ init_timer(&fcoe_timer);
++ fcoe_timer.data = 0;
++ fcoe_timer.function = fcoe_watchdog;
++ fcoe_timer.expires = (jiffies + (10 * HZ));
++ add_timer(&fcoe_timer);
+
+ /* initiatlize the fcoe transport */
+ fcoe_transport_init();
+@@ -1413,10 +1459,10 @@
+ module_init(fcoe_init);
+
+ /**
+- * fcoe_exit() - fcoe module unloading cleanup
++ * fcoe_exit - fcoe module unloading cleanup
+ *
+ * Returns 0 on success, negative on failure
+- */
++ **/
+ static void __exit fcoe_exit(void)
+ {
+ u32 idx;
+@@ -1437,7 +1483,7 @@
+ */
+ del_timer_sync(&fcoe_timer);
+
+- /* releases the associated fcoe transport for each lport */
++ /* releases the assocaited fcoe transport for each lport */
+ list_for_each_entry_safe(fc, tmp, &fcoe_hostlist, list)
+ fcoe_transport_release(fc->real_dev);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/hptiop.c linux-2.6.29-rc3.owrt/drivers/scsi/hptiop.c
+--- linux-2.6.29.owrt/drivers/scsi/hptiop.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/hptiop.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1251,7 +1251,6 @@
+ { PCI_VDEVICE(TTI, 0x3530), (kernel_ulong_t)&hptiop_itl_ops },
+ { PCI_VDEVICE(TTI, 0x3560), (kernel_ulong_t)&hptiop_itl_ops },
+ { PCI_VDEVICE(TTI, 0x4322), (kernel_ulong_t)&hptiop_itl_ops },
+- { PCI_VDEVICE(TTI, 0x4321), (kernel_ulong_t)&hptiop_itl_ops },
+ { PCI_VDEVICE(TTI, 0x4210), (kernel_ulong_t)&hptiop_itl_ops },
+ { PCI_VDEVICE(TTI, 0x4211), (kernel_ulong_t)&hptiop_itl_ops },
+ { PCI_VDEVICE(TTI, 0x4310), (kernel_ulong_t)&hptiop_itl_ops },
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/ibmvscsi/ibmvfc.c linux-2.6.29-rc3.owrt/drivers/scsi/ibmvscsi/ibmvfc.c
+--- linux-2.6.29.owrt/drivers/scsi/ibmvscsi/ibmvfc.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/ibmvscsi/ibmvfc.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1573,6 +1573,9 @@
+ vfc_cmd->resp_len = sizeof(vfc_cmd->rsp);
+ vfc_cmd->cancel_key = (unsigned long)cmnd->device->hostdata;
+ vfc_cmd->tgt_scsi_id = rport->port_id;
++ if ((rport->supported_classes & FC_COS_CLASS3) &&
++ (fc_host_supported_classes(vhost->host) & FC_COS_CLASS3))
++ vfc_cmd->flags = IBMVFC_CLASS_3_ERR;
+ vfc_cmd->iu.xfer_len = scsi_bufflen(cmnd);
+ int_to_scsilun(cmnd->device->lun, &vfc_cmd->iu.lun);
+ memcpy(vfc_cmd->iu.cdb, cmnd->cmnd, cmnd->cmd_len);
+@@ -3263,7 +3266,6 @@
+ return -ENOMEM;
+ }
+
+- memset(tgt, 0, sizeof(*tgt));
+ tgt->scsi_id = scsi_id;
+ tgt->new_scsi_id = scsi_id;
+ tgt->vhost = vhost;
+@@ -3574,18 +3576,9 @@
+ static void ibmvfc_tgt_add_rport(struct ibmvfc_target *tgt)
+ {
+ struct ibmvfc_host *vhost = tgt->vhost;
+- struct fc_rport *rport = tgt->rport;
++ struct fc_rport *rport;
+ unsigned long flags;
+
+- if (rport) {
+- tgt_dbg(tgt, "Setting rport roles\n");
+- fc_remote_port_rolechg(rport, tgt->ids.roles);
+- spin_lock_irqsave(vhost->host->host_lock, flags);
+- ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
+- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+- return;
+- }
+-
+ tgt_dbg(tgt, "Adding rport\n");
+ rport = fc_remote_port_add(vhost->host, 0, &tgt->ids);
+ spin_lock_irqsave(vhost->host->host_lock, flags);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/ibmvscsi/ibmvfc.h linux-2.6.29-rc3.owrt/drivers/scsi/ibmvscsi/ibmvfc.h
+--- linux-2.6.29.owrt/drivers/scsi/ibmvscsi/ibmvfc.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/ibmvscsi/ibmvfc.h 2009-05-10 23:48:29.000000000 +0200
+@@ -32,7 +32,7 @@
+ #define IBMVFC_DRIVER_VERSION "1.0.4"
+ #define IBMVFC_DRIVER_DATE "(November 14, 2008)"
+
+-#define IBMVFC_DEFAULT_TIMEOUT 60
++#define IBMVFC_DEFAULT_TIMEOUT 15
+ #define IBMVFC_INIT_TIMEOUT 120
+ #define IBMVFC_MAX_REQUESTS_DEFAULT 100
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/ibmvscsi/ibmvscsi.c linux-2.6.29-rc3.owrt/drivers/scsi/ibmvscsi/ibmvscsi.c
+--- linux-2.6.29.owrt/drivers/scsi/ibmvscsi/ibmvscsi.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/ibmvscsi/ibmvscsi.c 2009-05-10 23:48:29.000000000 +0200
+@@ -432,7 +432,6 @@
+ sdev_printk(KERN_ERR, cmd->device,
+ "Can't allocate memory "
+ "for indirect table\n");
+- scsi_dma_unmap(cmd);
+ return 0;
+ }
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/lasi700.c linux-2.6.29-rc3.owrt/drivers/scsi/lasi700.c
+--- linux-2.6.29.owrt/drivers/scsi/lasi700.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/lasi700.c 2009-05-10 23:48:29.000000000 +0200
+@@ -103,7 +103,7 @@
+
+ hostdata = kzalloc(sizeof(*hostdata), GFP_KERNEL);
+ if (!hostdata) {
+- dev_printk(KERN_ERR, &dev->dev, "Failed to allocate host data\n");
++ dev_printk(KERN_ERR, dev, "Failed to allocate host data\n");
+ return -ENOMEM;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/libfc/fc_disc.c linux-2.6.29-rc3.owrt/drivers/scsi/libfc/fc_disc.c
+--- linux-2.6.29.owrt/drivers/scsi/libfc/fc_disc.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/libfc/fc_disc.c 2009-05-10 23:48:29.000000000 +0200
+@@ -64,7 +64,7 @@
+ static void fc_disc_restart(struct fc_disc *);
+
+ /**
+- * fc_disc_lookup_rport() - lookup a remote port by port_id
++ * fc_disc_lookup_rport - lookup a remote port by port_id
+ * @lport: Fibre Channel host port instance
+ * @port_id: remote port port_id to match
+ */
+@@ -92,7 +92,7 @@
+ }
+
+ /**
+- * fc_disc_stop_rports() - delete all the remote ports associated with the lport
++ * fc_disc_stop_rports - delete all the remote ports associated with the lport
+ * @disc: The discovery job to stop rports on
+ *
+ * Locking Note: This function expects that the lport mutex is locked before
+@@ -117,7 +117,7 @@
+ }
+
+ /**
+- * fc_disc_rport_callback() - Event handler for rport events
++ * fc_disc_rport_callback - Event handler for rport events
+ * @lport: The lport which is receiving the event
+ * @rport: The rport which the event has occured on
+ * @event: The event that occured
+@@ -151,7 +151,7 @@
+ }
+
+ /**
+- * fc_disc_recv_rscn_req() - Handle Registered State Change Notification (RSCN)
++ * fc_disc_recv_rscn_req - Handle Registered State Change Notification (RSCN)
+ * @sp: Current sequence of the RSCN exchange
+ * @fp: RSCN Frame
+ * @lport: Fibre Channel host port instance
+@@ -246,7 +246,7 @@
+ list_del(&dp->peers);
+ rport = lport->tt.rport_lookup(lport, dp->ids.port_id);
+ if (rport) {
+- rdata = rport->dd_data;
++ rdata = RPORT_TO_PRIV(rport);
+ list_del(&rdata->peers);
+ lport->tt.rport_logoff(rport);
+ }
+@@ -265,7 +265,7 @@
+ }
+
+ /**
+- * fc_disc_recv_req() - Handle incoming requests
++ * fc_disc_recv_req - Handle incoming requests
+ * @sp: Current sequence of the request exchange
+ * @fp: The frame
+ * @lport: The FC local port
+@@ -294,7 +294,7 @@
+ }
+
+ /**
+- * fc_disc_restart() - Restart discovery
++ * fc_disc_restart - Restart discovery
+ * @lport: FC discovery context
+ *
+ * Locking Note: This function expects that the disc mutex
+@@ -322,7 +322,7 @@
+ }
+
+ /**
+- * fc_disc_start() - Fibre Channel Target discovery
++ * fc_disc_start - Fibre Channel Target discovery
+ * @lport: FC local port
+ *
+ * Returns non-zero if discovery cannot be started.
+@@ -383,7 +383,7 @@
+ };
+
+ /**
+- * fc_disc_new_target() - Handle new target found by discovery
++ * fc_disc_new_target - Handle new target found by discovery
+ * @lport: FC local port
+ * @rport: The previous FC remote port (NULL if new remote port)
+ * @ids: Identifiers for the new FC remote port
+@@ -396,7 +396,7 @@
+ struct fc_rport_identifiers *ids)
+ {
+ struct fc_lport *lport = disc->lport;
+- struct fc_rport_libfc_priv *rdata;
++ struct fc_rport_libfc_priv *rp;
+ int error = 0;
+
+ if (rport && ids->port_name) {
+@@ -430,15 +430,15 @@
+ dp.ids.port_name = ids->port_name;
+ dp.ids.node_name = ids->node_name;
+ dp.ids.roles = ids->roles;
+- rport = lport->tt.rport_create(&dp);
++ rport = fc_rport_rogue_create(&dp);
+ }
+ if (!rport)
+ error = -ENOMEM;
+ }
+ if (rport) {
+- rdata = rport->dd_data;
+- rdata->ops = &fc_disc_rport_ops;
+- rdata->rp_state = RPORT_ST_INIT;
++ rp = rport->dd_data;
++ rp->ops = &fc_disc_rport_ops;
++ rp->rp_state = RPORT_ST_INIT;
+ lport->tt.rport_login(rport);
+ }
+ }
+@@ -446,20 +446,20 @@
+ }
+
+ /**
+- * fc_disc_del_target() - Delete a target
++ * fc_disc_del_target - Delete a target
+ * @disc: FC discovery context
+ * @rport: The remote port to be removed
+ */
+ static void fc_disc_del_target(struct fc_disc *disc, struct fc_rport *rport)
+ {
+ struct fc_lport *lport = disc->lport;
+- struct fc_rport_libfc_priv *rdata = rport->dd_data;
++ struct fc_rport_libfc_priv *rdata = RPORT_TO_PRIV(rport);
+ list_del(&rdata->peers);
+ lport->tt.rport_logoff(rport);
+ }
+
+ /**
+- * fc_disc_done() - Discovery has been completed
++ * fc_disc_done - Discovery has been completed
+ * @disc: FC discovery context
+ */
+ static void fc_disc_done(struct fc_disc *disc)
+@@ -479,7 +479,7 @@
+ }
+
+ /**
+- * fc_disc_error() - Handle error on dNS request
++ * fc_disc_error - Handle error on dNS request
+ * @disc: FC discovery context
+ * @fp: The frame pointer
+ */
+@@ -519,7 +519,7 @@
+ }
+
+ /**
+- * fc_disc_gpn_ft_req() - Send Get Port Names by FC-4 type (GPN_FT) request
++ * fc_disc_gpn_ft_req - Send Get Port Names by FC-4 type (GPN_FT) request
+ * @lport: FC discovery context
+ *
+ * Locking Note: This function expects that the disc_mutex is locked
+@@ -553,7 +553,7 @@
+ }
+
+ /**
+- * fc_disc_gpn_ft_parse() - Parse the list of IDs and names resulting from a request
++ * fc_disc_gpn_ft_parse - Parse the list of IDs and names resulting from a request
+ * @lport: Fibre Channel host port instance
+ * @buf: GPN_FT response buffer
+ * @len: size of response buffer
+@@ -617,7 +617,7 @@
+
+ if ((dp.ids.port_id != fc_host_port_id(lport->host)) &&
+ (dp.ids.port_name != lport->wwpn)) {
+- rport = lport->tt.rport_create(&dp);
++ rport = fc_rport_rogue_create(&dp);
+ if (rport) {
+ rdata = rport->dd_data;
+ rdata->ops = &fc_disc_rport_ops;
+@@ -658,10 +658,7 @@
+ return error;
+ }
+
+-/**
+- * fc_disc_timeout() - Retry handler for the disc component
+- * @work: Structure holding disc obj that needs retry discovery
+- *
++/*
+ * Handle retry of memory allocation for remote ports.
+ */
+ static void fc_disc_timeout(struct work_struct *work)
+@@ -676,7 +673,7 @@
+ }
+
+ /**
+- * fc_disc_gpn_ft_resp() - Handle a response frame from Get Port Names (GPN_FT)
++ * fc_disc_gpn_ft_resp - Handle a response frame from Get Port Names (GPN_FT)
+ * @sp: Current sequence of GPN_FT exchange
+ * @fp: response frame
+ * @lp_arg: Fibre Channel host port instance
+@@ -715,7 +712,9 @@
+ fr_len(fp));
+ } else if (ntohs(cp->ct_cmd) == FC_FS_ACC) {
+
+- /* Accepted, parse the response. */
++ /*
++ * Accepted. Parse response.
++ */
+ buf = cp + 1;
+ len -= sizeof(*cp);
+ } else if (ntohs(cp->ct_cmd) == FC_FS_RJT) {
+@@ -747,7 +746,7 @@
+ }
+
+ /**
+- * fc_disc_single() - Discover the directory information for a single target
++ * fc_disc_single - Discover the directory information for a single target
+ * @lport: FC local port
+ * @dp: The port to rediscover
+ *
+@@ -770,7 +769,7 @@
+ if (rport)
+ fc_disc_del_target(disc, rport);
+
+- new_rport = lport->tt.rport_create(dp);
++ new_rport = fc_rport_rogue_create(dp);
+ if (new_rport) {
+ rdata = new_rport->dd_data;
+ rdata->ops = &fc_disc_rport_ops;
+@@ -783,7 +782,7 @@
+ }
+
+ /**
+- * fc_disc_stop() - Stop discovery for a given lport
++ * fc_disc_stop - Stop discovery for a given lport
+ * @lport: The lport that discovery should stop for
+ */
+ void fc_disc_stop(struct fc_lport *lport)
+@@ -797,7 +796,7 @@
+ }
+
+ /**
+- * fc_disc_stop_final() - Stop discovery for a given lport
++ * fc_disc_stop_final - Stop discovery for a given lport
+ * @lport: The lport that discovery should stop for
+ *
+ * This function will block until discovery has been
+@@ -810,7 +809,7 @@
+ }
+
+ /**
+- * fc_disc_init() - Initialize the discovery block
++ * fc_disc_init - Initialize the discovery block
+ * @lport: FC local port
+ */
+ int fc_disc_init(struct fc_lport *lport)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/libfc/fc_exch.c linux-2.6.29-rc3.owrt/drivers/scsi/libfc/fc_exch.c
+--- linux-2.6.29.owrt/drivers/scsi/libfc/fc_exch.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/libfc/fc_exch.c 2009-05-10 23:48:29.000000000 +0200
+@@ -32,6 +32,8 @@
+ #include <scsi/libfc.h>
+ #include <scsi/fc_encode.h>
+
++#define FC_DEF_R_A_TOV (10 * 1000) /* resource allocation timeout */
++
+ /*
+ * fc_exch_debug can be set in debugger or at compile time to get more logs.
+ */
+@@ -625,6 +627,7 @@
+ {
+ struct fc_exch *ep;
+ struct fc_frame_header *fh;
++ u16 rxid;
+
+ ep = mp->lp->tt.exch_get(mp->lp, fp);
+ if (ep) {
+@@ -651,6 +654,18 @@
+ if ((ntoh24(fh->fh_f_ctl) & FC_FC_SEQ_INIT) == 0)
+ ep->esb_stat &= ~ESB_ST_SEQ_INIT;
+
++ /*
++ * Set the responder ID in the frame header.
++ * The old one should've been 0xffff.
++ * If it isn't, don't assign one.
++ * Incoming basic link service frames may specify
++ * a referenced RX_ID.
++ */
++ if (fh->fh_type != FC_TYPE_BLS) {
++ rxid = ntohs(fh->fh_rx_id);
++ WARN_ON(rxid != FC_XID_UNKNOWN);
++ fh->fh_rx_id = htons(ep->rxid);
++ }
+ fc_exch_hold(ep); /* hold for caller */
+ spin_unlock_bh(&ep->ex_lock); /* lock from exch_get */
+ }
+@@ -662,8 +677,8 @@
+ * If fc_pf_rjt_reason is FC_RJT_NONE then this function will have a hold
+ * on the ep that should be released by the caller.
+ */
+-static enum fc_pf_rjt_reason fc_seq_lookup_recip(struct fc_exch_mgr *mp,
+- struct fc_frame *fp)
++static enum fc_pf_rjt_reason
++fc_seq_lookup_recip(struct fc_exch_mgr *mp, struct fc_frame *fp)
+ {
+ struct fc_frame_header *fh = fc_frame_header_get(fp);
+ struct fc_exch *ep = NULL;
+@@ -981,9 +996,9 @@
+ * Send BLS Reject.
+ * This is for rejecting BA_ABTS only.
+ */
+-static void fc_exch_send_ba_rjt(struct fc_frame *rx_fp,
+- enum fc_ba_rjt_reason reason,
+- enum fc_ba_rjt_explan explan)
++static void
++fc_exch_send_ba_rjt(struct fc_frame *rx_fp, enum fc_ba_rjt_reason reason,
++ enum fc_ba_rjt_explan explan)
+ {
+ struct fc_frame *fp;
+ struct fc_frame_header *rx_fh;
+@@ -1081,7 +1096,7 @@
+ ap->ba_high_seq_cnt = fh->fh_seq_cnt;
+ ap->ba_low_seq_cnt = htons(sp->cnt);
+ }
+- sp = fc_seq_start_next_locked(sp);
++ sp = fc_seq_start_next(sp);
+ spin_unlock_bh(&ep->ex_lock);
+ fc_seq_send_last(sp, fp, FC_RCTL_BA_ACC, FC_TYPE_BLS);
+ fc_frame_free(rx_fp);
+@@ -1465,11 +1480,10 @@
+ * If sid is non-zero, reset only exchanges we source from that FID.
+ * If did is non-zero, reset only exchanges destined to that FID.
+ */
+-void fc_exch_mgr_reset(struct fc_lport *lp, u32 sid, u32 did)
++void fc_exch_mgr_reset(struct fc_exch_mgr *mp, u32 sid, u32 did)
+ {
+ struct fc_exch *ep;
+ struct fc_exch *next;
+- struct fc_exch_mgr *mp = lp->emp;
+
+ spin_lock_bh(&mp->em_lock);
+ restart:
+@@ -1593,7 +1607,7 @@
+ if (IS_ERR(fp)) {
+ int err = PTR_ERR(fp);
+
+- if (err == -FC_EX_CLOSED || err == -FC_EX_TIMEOUT)
++ if (err == -FC_EX_CLOSED)
+ goto cleanup;
+ FC_DBG("Cannot process RRQ, because of frame error %d\n", err);
+ return;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/libfc/fc_fcp.c linux-2.6.29-rc3.owrt/drivers/scsi/libfc/fc_fcp.c
+--- linux-2.6.29.owrt/drivers/scsi/libfc/fc_fcp.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/libfc/fc_fcp.c 2009-05-10 23:48:29.000000000 +0200
+@@ -161,7 +161,7 @@
+ }
+
+ /**
+- * fc_fcp_pkt_release() - release hold on scsi_pkt packet
++ * fc_fcp_pkt_release - release hold on scsi_pkt packet
+ * @fsp: fcp packet struct
+ *
+ * This is used by upper layer scsi driver.
+@@ -183,7 +183,8 @@
+ }
+
+ /**
+- * fc_fcp_pkt_destory() - release hold on scsi_pkt packet
++ * fc_fcp_pkt_destory - release hold on scsi_pkt packet
++ *
+ * @seq: exchange sequence
+ * @fsp: fcp packet struct
+ *
+@@ -198,7 +199,7 @@
+ }
+
+ /**
+- * fc_fcp_lock_pkt() - lock a packet and get a ref to it.
++ * fc_fcp_lock_pkt - lock a packet and get a ref to it.
+ * @fsp: fcp packet
+ *
+ * We should only return error if we return a command to scsi-ml before
+@@ -290,7 +291,9 @@
+ buf = fc_frame_payload_get(fp, 0);
+
+ if (offset + len > fsp->data_len) {
+- /* this should never happen */
++ /*
++ * this should never happen
++ */
+ if ((fr_flags(fp) & FCPHF_CRC_UNCHECKED) &&
+ fc_frame_crc_check(fp))
+ goto crc_err;
+@@ -384,8 +387,8 @@
+ fc_fcp_complete_locked(fsp);
+ }
+
+-/**
+- * fc_fcp_send_data() - Send SCSI data to target.
++/*
++ * fc_fcp_send_data - Send SCSI data to target.
+ * @fsp: ptr to fc_fcp_pkt
+ * @sp: ptr to this sequence
+ * @offset: starting offset for this data request
+@@ -607,8 +610,8 @@
+ }
+ }
+
+-/**
+- * fc_fcp_reduce_can_queue() - drop can_queue
++/*
++ * fc_fcp_reduce_can_queue - drop can_queue
+ * @lp: lport to drop queueing for
+ *
+ * If we are getting memory allocation failures, then we may
+@@ -639,11 +642,9 @@
+ spin_unlock_irqrestore(lp->host->host_lock, flags);
+ }
+
+-/**
+- * fc_fcp_recv() - Reveive FCP frames
+- * @seq: The sequence the frame is on
+- * @fp: The FC frame
+- * @arg: The related FCP packet
++/*
++ * exch mgr calls this routine to process scsi
++ * exchanges.
+ *
+ * Return : None
+ * Context : called from Soft IRQ context
+@@ -831,7 +832,7 @@
+ }
+
+ /**
+- * fc_fcp_complete_locked() - complete processing of a fcp packet
++ * fc_fcp_complete_locked - complete processing of a fcp packet
+ * @fsp: fcp packet
+ *
+ * This function may sleep if a timer is pending. The packet lock must be
+@@ -899,7 +900,7 @@
+ }
+
+ /**
+- * fc_fcp_cleanup_each_cmd() - Cleanup active commads
++ * fc_fcp_cleanup_each_cmd - run fn on each active command
+ * @lp: logical port
+ * @id: target id
+ * @lun: lun
+@@ -951,7 +952,7 @@
+ }
+
+ /**
+- * fc_fcp_pkt_send() - send a fcp packet to the lower level.
++ * fc_fcp_pkt_send - send a fcp packet to the lower level.
+ * @lp: fc lport
+ * @fsp: fc packet.
+ *
+@@ -1620,7 +1621,7 @@
+ static inline int fc_fcp_lport_queue_ready(struct fc_lport *lp)
+ {
+ /* lock ? */
+- return (lp->state == LPORT_ST_READY) && lp->link_up && !lp->qfull;
++ return (lp->state == LPORT_ST_READY) && (lp->link_status & FC_LINK_UP);
+ }
+
+ /**
+@@ -1726,7 +1727,7 @@
+ EXPORT_SYMBOL(fc_queuecommand);
+
+ /**
+- * fc_io_compl() - Handle responses for completed commands
++ * fc_io_compl - Handle responses for completed commands
+ * @fsp: scsi packet
+ *
+ * Translates a error to a Linux SCSI error.
+@@ -1809,12 +1810,12 @@
+ sc_cmd->result = DID_ERROR << 16;
+ break;
+ case FC_DATA_UNDRUN:
+- if ((fsp->cdb_status == 0) && !(fsp->req_flags & FC_SRB_READ)) {
++ if (fsp->cdb_status == 0) {
+ /*
+ * scsi status is good but transport level
+- * underrun.
++ * underrun. for read it should be an error??
+ */
+- sc_cmd->result = DID_OK << 16;
++ sc_cmd->result = (DID_OK << 16) | fsp->cdb_status;
+ } else {
+ /*
+ * scsi got underrun, this is an error
+@@ -1856,7 +1857,7 @@
+ }
+
+ /**
+- * fc_fcp_complete() - complete processing of a fcp packet
++ * fc_fcp_complete - complete processing of a fcp packet
+ * @fsp: fcp packet
+ *
+ * This function may sleep if a fsp timer is pending.
+@@ -1873,10 +1874,9 @@
+ EXPORT_SYMBOL(fc_fcp_complete);
+
+ /**
+- * fc_eh_abort() - Abort a command
++ * fc_eh_abort - Abort a command...from scsi host template
+ * @sc_cmd: scsi command to abort
+ *
+- * From scsi host template.
+ * send ABTS to the target device and wait for the response
+ * sc_cmd is the pointer to the command to be aborted.
+ */
+@@ -1890,7 +1890,7 @@
+ lp = shost_priv(sc_cmd->device->host);
+ if (lp->state != LPORT_ST_READY)
+ return rc;
+- else if (!lp->link_up)
++ else if (!(lp->link_status & FC_LINK_UP))
+ return rc;
+
+ spin_lock_irqsave(lp->host->host_lock, flags);
+@@ -1920,7 +1920,7 @@
+ EXPORT_SYMBOL(fc_eh_abort);
+
+ /**
+- * fc_eh_device_reset() Reset a single LUN
++ * fc_eh_device_reset: Reset a single LUN
+ * @sc_cmd: scsi command
+ *
+ * Set from scsi host template to send tm cmd to the target and wait for the
+@@ -1973,7 +1973,7 @@
+ EXPORT_SYMBOL(fc_eh_device_reset);
+
+ /**
+- * fc_eh_host_reset() - The reset function will reset the ports on the host.
++ * fc_eh_host_reset - The reset function will reset the ports on the host.
+ * @sc_cmd: scsi command
+ */
+ int fc_eh_host_reset(struct scsi_cmnd *sc_cmd)
+@@ -1999,7 +1999,7 @@
+ EXPORT_SYMBOL(fc_eh_host_reset);
+
+ /**
+- * fc_slave_alloc() - configure queue depth
++ * fc_slave_alloc - configure queue depth
+ * @sdev: scsi device
+ *
+ * Configures queue depth based on host's cmd_per_len. If not set
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/libfc/fc_lport.c linux-2.6.29-rc3.owrt/drivers/scsi/libfc/fc_lport.c
+--- linux-2.6.29.owrt/drivers/scsi/libfc/fc_lport.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/libfc/fc_lport.c 2009-05-10 23:48:29.000000000 +0200
+@@ -139,7 +139,7 @@
+ }
+
+ /**
+- * fc_lport_rport_callback() - Event handler for rport events
++ * fc_lport_rport_callback - Event handler for rport events
+ * @lport: The lport which is receiving the event
+ * @rport: The rport which the event has occured on
+ * @event: The event that occured
+@@ -195,7 +195,7 @@
+ }
+
+ /**
+- * fc_lport_state() - Return a string which represents the lport's state
++ * fc_lport_state - Return a string which represents the lport's state
+ * @lport: The lport whose state is to converted to a string
+ */
+ static const char *fc_lport_state(struct fc_lport *lport)
+@@ -209,7 +209,7 @@
+ }
+
+ /**
+- * fc_lport_ptp_setup() - Create an rport for point-to-point mode
++ * fc_lport_ptp_setup - Create an rport for point-to-point mode
+ * @lport: The lport to attach the ptp rport to
+ * @fid: The FID of the ptp rport
+ * @remote_wwpn: The WWPN of the ptp rport
+@@ -232,7 +232,7 @@
+ lport->ptp_rp = NULL;
+ }
+
+- lport->ptp_rp = lport->tt.rport_create(&dp);
++ lport->ptp_rp = fc_rport_rogue_create(&dp);
+
+ lport->tt.rport_login(lport->ptp_rp);
+
+@@ -250,7 +250,7 @@
+ {
+ struct fc_lport *lp = shost_priv(shost);
+
+- if (lp->link_up)
++ if ((lp->link_status & FC_LINK_UP) == FC_LINK_UP)
+ fc_host_port_state(shost) = FC_PORTSTATE_ONLINE;
+ else
+ fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE;
+@@ -351,7 +351,7 @@
+ }
+
+ /**
+- * fc_lport_recv_rlir_req() - Handle received Registered Link Incident Report.
++ * fc_lport_recv_rlir_req - Handle received Registered Link Incident Report.
+ * @lport: Fibre Channel local port recieving the RLIR
+ * @sp: current sequence in the RLIR exchange
+ * @fp: RLIR request frame
+@@ -370,7 +370,7 @@
+ }
+
+ /**
+- * fc_lport_recv_echo_req() - Handle received ECHO request
++ * fc_lport_recv_echo_req - Handle received ECHO request
+ * @lport: Fibre Channel local port recieving the ECHO
+ * @sp: current sequence in the ECHO exchange
+ * @fp: ECHO request frame
+@@ -412,7 +412,7 @@
+ }
+
+ /**
+- * fc_lport_recv_echo_req() - Handle received Request Node ID data request
++ * fc_lport_recv_echo_req - Handle received Request Node ID data request
+ * @lport: Fibre Channel local port recieving the RNID
+ * @sp: current sequence in the RNID exchange
+ * @fp: RNID request frame
+@@ -479,7 +479,7 @@
+ }
+
+ /**
+- * fc_lport_recv_adisc_req() - Handle received Address Discovery Request
++ * fc_lport_recv_adisc_req - Handle received Address Discovery Request
+ * @lport: Fibre Channel local port recieving the ADISC
+ * @sp: current sequence in the ADISC exchange
+ * @fp: ADISC request frame
+@@ -529,7 +529,7 @@
+ }
+
+ /**
+- * fc_lport_recv_logo_req() - Handle received fabric LOGO request
++ * fc_lport_recv_logo_req - Handle received fabric LOGO request
+ * @lport: Fibre Channel local port recieving the LOGO
+ * @sp: current sequence in the LOGO exchange
+ * @fp: LOGO request frame
+@@ -546,7 +546,7 @@
+ }
+
+ /**
+- * fc_fabric_login() - Start the lport state machine
++ * fc_fabric_login - Start the lport state machine
+ * @lport: The lport that should log into the fabric
+ *
+ * Locking Note: This function should not be called
+@@ -568,7 +568,7 @@
+ EXPORT_SYMBOL(fc_fabric_login);
+
+ /**
+- * fc_linkup() - Handler for transport linkup events
++ * fc_linkup - Handler for transport linkup events
+ * @lport: The lport whose link is up
+ */
+ void fc_linkup(struct fc_lport *lport)
+@@ -577,8 +577,8 @@
+ fc_host_port_id(lport->host));
+
+ mutex_lock(&lport->lp_mutex);
+- if (!lport->link_up) {
+- lport->link_up = 1;
++ if ((lport->link_status & FC_LINK_UP) != FC_LINK_UP) {
++ lport->link_status |= FC_LINK_UP;
+
+ if (lport->state == LPORT_ST_RESET)
+ fc_lport_enter_flogi(lport);
+@@ -588,7 +588,7 @@
+ EXPORT_SYMBOL(fc_linkup);
+
+ /**
+- * fc_linkdown() - Handler for transport linkdown events
++ * fc_linkdown - Handler for transport linkdown events
+ * @lport: The lport whose link is down
+ */
+ void fc_linkdown(struct fc_lport *lport)
+@@ -597,8 +597,8 @@
+ FC_DEBUG_LPORT("Link is down for port (%6x)\n",
+ fc_host_port_id(lport->host));
+
+- if (lport->link_up) {
+- lport->link_up = 0;
++ if ((lport->link_status & FC_LINK_UP) == FC_LINK_UP) {
++ lport->link_status &= ~(FC_LINK_UP);
+ fc_lport_enter_reset(lport);
+ lport->tt.fcp_cleanup(lport);
+ }
+@@ -607,25 +607,48 @@
+ EXPORT_SYMBOL(fc_linkdown);
+
+ /**
+- * fc_fabric_logoff() - Logout of the fabric
++ * fc_pause - Pause the flow of frames
++ * @lport: The lport to be paused
++ */
++void fc_pause(struct fc_lport *lport)
++{
++ mutex_lock(&lport->lp_mutex);
++ lport->link_status |= FC_PAUSE;
++ mutex_unlock(&lport->lp_mutex);
++}
++EXPORT_SYMBOL(fc_pause);
++
++/**
++ * fc_unpause - Unpause the flow of frames
++ * @lport: The lport to be unpaused
++ */
++void fc_unpause(struct fc_lport *lport)
++{
++ mutex_lock(&lport->lp_mutex);
++ lport->link_status &= ~(FC_PAUSE);
++ mutex_unlock(&lport->lp_mutex);
++}
++EXPORT_SYMBOL(fc_unpause);
++
++/**
++ * fc_fabric_logoff - Logout of the fabric
+ * @lport: fc_lport pointer to logoff the fabric
+ *
+ * Return value:
+ * 0 for success, -1 for failure
+- */
++ **/
+ int fc_fabric_logoff(struct fc_lport *lport)
+ {
+ lport->tt.disc_stop_final(lport);
+ mutex_lock(&lport->lp_mutex);
+ fc_lport_enter_logo(lport);
+ mutex_unlock(&lport->lp_mutex);
+- cancel_delayed_work_sync(&lport->retry_work);
+ return 0;
+ }
+ EXPORT_SYMBOL(fc_fabric_logoff);
+
+ /**
+- * fc_lport_destroy() - unregister a fc_lport
++ * fc_lport_destroy - unregister a fc_lport
+ * @lport: fc_lport pointer to unregister
+ *
+ * Return value:
+@@ -635,25 +658,26 @@
+ * clean-up all the allocated memory
+ * and free up other system resources.
+ *
+- */
++ **/
+ int fc_lport_destroy(struct fc_lport *lport)
+ {
+ lport->tt.frame_send = fc_frame_drop;
+ lport->tt.fcp_abort_io(lport);
+- lport->tt.exch_mgr_reset(lport, 0, 0);
++ lport->tt.exch_mgr_reset(lport->emp, 0, 0);
+ return 0;
+ }
+ EXPORT_SYMBOL(fc_lport_destroy);
+
+ /**
+- * fc_set_mfs() - sets up the mfs for the corresponding fc_lport
++ * fc_set_mfs - sets up the mfs for the corresponding fc_lport
+ * @lport: fc_lport pointer to unregister
+ * @mfs: the new mfs for fc_lport
+ *
+ * Set mfs for the given fc_lport to the new mfs.
+ *
+ * Return: 0 for success
+- */
++ *
++ **/
+ int fc_set_mfs(struct fc_lport *lport, u32 mfs)
+ {
+ unsigned int old_mfs;
+@@ -682,7 +706,7 @@
+ EXPORT_SYMBOL(fc_set_mfs);
+
+ /**
+- * fc_lport_disc_callback() - Callback for discovery events
++ * fc_lport_disc_callback - Callback for discovery events
+ * @lport: FC local port
+ * @event: The discovery event
+ */
+@@ -707,7 +731,7 @@
+ }
+
+ /**
+- * fc_rport_enter_ready() - Enter the ready state and start discovery
++ * fc_rport_enter_ready - Enter the ready state and start discovery
+ * @lport: Fibre Channel local port that is ready
+ *
+ * Locking Note: The lport lock is expected to be held before calling
+@@ -724,7 +748,7 @@
+ }
+
+ /**
+- * fc_lport_recv_flogi_req() - Receive a FLOGI request
++ * fc_lport_recv_flogi_req - Receive a FLOGI request
+ * @sp_in: The sequence the FLOGI is on
+ * @rx_fp: The frame the FLOGI is in
+ * @lport: The lport that recieved the request
+@@ -814,7 +838,7 @@
+ }
+
+ /**
+- * fc_lport_recv_req() - The generic lport request handler
++ * fc_lport_recv_req - The generic lport request handler
+ * @lport: The lport that received the request
+ * @sp: The sequence the request is on
+ * @fp: The frame the request is in
+@@ -910,7 +934,7 @@
+ }
+
+ /**
+- * fc_lport_reset() - Reset an lport
++ * fc_lport_reset - Reset an lport
+ * @lport: The lport which should be reset
+ *
+ * Locking Note: This functions should not be called with the
+@@ -918,7 +942,6 @@
+ */
+ int fc_lport_reset(struct fc_lport *lport)
+ {
+- cancel_delayed_work_sync(&lport->retry_work);
+ mutex_lock(&lport->lp_mutex);
+ fc_lport_enter_reset(lport);
+ mutex_unlock(&lport->lp_mutex);
+@@ -927,7 +950,7 @@
+ EXPORT_SYMBOL(fc_lport_reset);
+
+ /**
+- * fc_rport_enter_reset() - Reset the local port
++ * fc_rport_enter_reset - Reset the local port
+ * @lport: Fibre Channel local port to be reset
+ *
+ * Locking Note: The lport lock is expected to be held before calling
+@@ -950,16 +973,16 @@
+
+ lport->tt.disc_stop(lport);
+
+- lport->tt.exch_mgr_reset(lport, 0, 0);
++ lport->tt.exch_mgr_reset(lport->emp, 0, 0);
+ fc_host_fabric_name(lport->host) = 0;
+ fc_host_port_id(lport->host) = 0;
+
+- if (lport->link_up)
++ if ((lport->link_status & FC_LINK_UP) == FC_LINK_UP)
+ fc_lport_enter_flogi(lport);
+ }
+
+ /**
+- * fc_lport_error() - Handler for any errors
++ * fc_lport_error - Handler for any errors
+ * @lport: The fc_lport object
+ * @fp: The frame pointer
+ *
+@@ -1006,8 +1029,8 @@
+ }
+
+ /**
+- * fc_lport_rft_id_resp() - Handle response to Register Fibre
+- * Channel Types by ID (RPN_ID) request
++ * fc_lport_rft_id_resp - Handle response to Register Fibre
++ * Channel Types by ID (RPN_ID) request
+ * @sp: current sequence in RPN_ID exchange
+ * @fp: response frame
+ * @lp_arg: Fibre Channel host port instance
+@@ -1030,17 +1053,17 @@
+
+ FC_DEBUG_LPORT("Received a RFT_ID response\n");
+
+- if (IS_ERR(fp)) {
+- fc_lport_error(lport, fp);
+- goto err;
+- }
+-
+ if (lport->state != LPORT_ST_RFT_ID) {
+ FC_DBG("Received a RFT_ID response, but in state %s\n",
+ fc_lport_state(lport));
+ goto out;
+ }
+
++ if (IS_ERR(fp)) {
++ fc_lport_error(lport, fp);
++ goto err;
++ }
++
+ fh = fc_frame_header_get(fp);
+ ct = fc_frame_payload_get(fp, sizeof(*ct));
+
+@@ -1058,8 +1081,8 @@
+ }
+
+ /**
+- * fc_lport_rpn_id_resp() - Handle response to Register Port
+- * Name by ID (RPN_ID) request
++ * fc_lport_rpn_id_resp - Handle response to Register Port
++ * Name by ID (RPN_ID) request
+ * @sp: current sequence in RPN_ID exchange
+ * @fp: response frame
+ * @lp_arg: Fibre Channel host port instance
+@@ -1082,17 +1105,17 @@
+
+ FC_DEBUG_LPORT("Received a RPN_ID response\n");
+
+- if (IS_ERR(fp)) {
+- fc_lport_error(lport, fp);
+- goto err;
+- }
+-
+ if (lport->state != LPORT_ST_RPN_ID) {
+ FC_DBG("Received a RPN_ID response, but in state %s\n",
+ fc_lport_state(lport));
+ goto out;
+ }
+
++ if (IS_ERR(fp)) {
++ fc_lport_error(lport, fp);
++ goto err;
++ }
++
+ fh = fc_frame_header_get(fp);
+ ct = fc_frame_payload_get(fp, sizeof(*ct));
+ if (fh && ct && fh->fh_type == FC_TYPE_CT &&
+@@ -1110,7 +1133,7 @@
+ }
+
+ /**
+- * fc_lport_scr_resp() - Handle response to State Change Register (SCR) request
++ * fc_lport_scr_resp - Handle response to State Change Register (SCR) request
+ * @sp: current sequence in SCR exchange
+ * @fp: response frame
+ * @lp_arg: Fibre Channel lport port instance that sent the registration request
+@@ -1132,17 +1155,17 @@
+
+ FC_DEBUG_LPORT("Received a SCR response\n");
+
+- if (IS_ERR(fp)) {
+- fc_lport_error(lport, fp);
+- goto err;
+- }
+-
+ if (lport->state != LPORT_ST_SCR) {
+ FC_DBG("Received a SCR response, but in state %s\n",
+ fc_lport_state(lport));
+ goto out;
+ }
+
++ if (IS_ERR(fp)) {
++ fc_lport_error(lport, fp);
++ goto err;
++ }
++
+ op = fc_frame_payload_op(fp);
+ if (op == ELS_LS_ACC)
+ fc_lport_enter_ready(lport);
+@@ -1156,7 +1179,7 @@
+ }
+
+ /**
+- * fc_lport_enter_scr() - Send a State Change Register (SCR) request
++ * fc_lport_enter_scr - Send a State Change Register (SCR) request
+ * @lport: Fibre Channel local port to register for state changes
+ *
+ * Locking Note: The lport lock is expected to be held before calling
+@@ -1183,7 +1206,7 @@
+ }
+
+ /**
+- * fc_lport_enter_rft_id() - Register FC4-types with the name server
++ * fc_lport_enter_rft_id - Register FC4-types with the name server
+ * @lport: Fibre Channel local port to register
+ *
+ * Locking Note: The lport lock is expected to be held before calling
+@@ -1225,7 +1248,7 @@
+ }
+
+ /**
+- * fc_rport_enter_rft_id() - Register port name with the name server
++ * fc_rport_enter_rft_id - Register port name with the name server
+ * @lport: Fibre Channel local port to register
+ *
+ * Locking Note: The lport lock is expected to be held before calling
+@@ -1258,7 +1281,7 @@
+ };
+
+ /**
+- * fc_rport_enter_dns() - Create a rport to the name server
++ * fc_rport_enter_dns - Create a rport to the name server
+ * @lport: Fibre Channel local port requesting a rport for the name server
+ *
+ * Locking Note: The lport lock is expected to be held before calling
+@@ -1281,7 +1304,7 @@
+
+ fc_lport_state_enter(lport, LPORT_ST_DNS);
+
+- rport = lport->tt.rport_create(&dp);
++ rport = fc_rport_rogue_create(&dp);
+ if (!rport)
+ goto err;
+
+@@ -1295,7 +1318,7 @@
+ }
+
+ /**
+- * fc_lport_timeout() - Handler for the retry_work timer.
++ * fc_lport_timeout - Handler for the retry_work timer.
+ * @work: The work struct of the fc_lport
+ */
+ static void fc_lport_timeout(struct work_struct *work)
+@@ -1336,7 +1359,7 @@
+ }
+
+ /**
+- * fc_lport_logo_resp() - Handle response to LOGO request
++ * fc_lport_logo_resp - Handle response to LOGO request
+ * @sp: current sequence in LOGO exchange
+ * @fp: response frame
+ * @lp_arg: Fibre Channel lport port instance that sent the LOGO request
+@@ -1358,17 +1381,17 @@
+
+ FC_DEBUG_LPORT("Received a LOGO response\n");
+
+- if (IS_ERR(fp)) {
+- fc_lport_error(lport, fp);
+- goto err;
+- }
+-
+ if (lport->state != LPORT_ST_LOGO) {
+ FC_DBG("Received a LOGO response, but in state %s\n",
+ fc_lport_state(lport));
+ goto out;
+ }
+
++ if (IS_ERR(fp)) {
++ fc_lport_error(lport, fp);
++ goto err;
++ }
++
+ op = fc_frame_payload_op(fp);
+ if (op == ELS_LS_ACC)
+ fc_lport_enter_reset(lport);
+@@ -1382,7 +1405,7 @@
+ }
+
+ /**
+- * fc_rport_enter_logo() - Logout of the fabric
++ * fc_rport_enter_logo - Logout of the fabric
+ * @lport: Fibre Channel local port to be logged out
+ *
+ * Locking Note: The lport lock is expected to be held before calling
+@@ -1414,7 +1437,7 @@
+ }
+
+ /**
+- * fc_lport_flogi_resp() - Handle response to FLOGI request
++ * fc_lport_flogi_resp - Handle response to FLOGI request
+ * @sp: current sequence in FLOGI exchange
+ * @fp: response frame
+ * @lp_arg: Fibre Channel lport port instance that sent the FLOGI request
+@@ -1442,17 +1465,17 @@
+
+ FC_DEBUG_LPORT("Received a FLOGI response\n");
+
+- if (IS_ERR(fp)) {
+- fc_lport_error(lport, fp);
+- goto err;
+- }
+-
+ if (lport->state != LPORT_ST_FLOGI) {
+ FC_DBG("Received a FLOGI response, but in state %s\n",
+ fc_lport_state(lport));
+ goto out;
+ }
+
++ if (IS_ERR(fp)) {
++ fc_lport_error(lport, fp);
++ goto err;
++ }
++
+ fh = fc_frame_header_get(fp);
+ did = ntoh24(fh->fh_d_id);
+ if (fc_frame_payload_op(fp) == ELS_LS_ACC && did != 0) {
+@@ -1509,7 +1532,7 @@
+ }
+
+ /**
+- * fc_rport_enter_flogi() - Send a FLOGI request to the fabric manager
++ * fc_rport_enter_flogi - Send a FLOGI request to the fabric manager
+ * @lport: Fibre Channel local port to be logged in to the fabric
+ *
+ * Locking Note: The lport lock is expected to be held before calling
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/libfc/fc_rport.c linux-2.6.29-rc3.owrt/drivers/scsi/libfc/fc_rport.c
+--- linux-2.6.29.owrt/drivers/scsi/libfc/fc_rport.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/libfc/fc_rport.c 2009-05-10 23:48:29.000000000 +0200
+@@ -81,7 +81,6 @@
+ struct fc_seq *, struct fc_frame *);
+ static void fc_rport_timeout(struct work_struct *);
+ static void fc_rport_error(struct fc_rport *, struct fc_frame *);
+-static void fc_rport_error_retry(struct fc_rport *, struct fc_frame *);
+ static void fc_rport_work(struct work_struct *);
+
+ static const char *fc_rport_state_names[] = {
+@@ -146,7 +145,7 @@
+ }
+
+ /**
+- * fc_rport_state() - return a string for the state the rport is in
++ * fc_rport_state - return a string for the state the rport is in
+ * @rport: The rport whose state we want to get a string for
+ */
+ static const char *fc_rport_state(struct fc_rport *rport)
+@@ -161,7 +160,7 @@
+ }
+
+ /**
+- * fc_set_rport_loss_tmo() - Set the remote port loss timeout in seconds.
++ * fc_set_rport_loss_tmo - Set the remote port loss timeout in seconds.
+ * @rport: Pointer to Fibre Channel remote port structure
+ * @timeout: timeout in seconds
+ */
+@@ -175,12 +174,12 @@
+ EXPORT_SYMBOL(fc_set_rport_loss_tmo);
+
+ /**
+- * fc_plogi_get_maxframe() - Get max payload from the common service parameters
++ * fc_plogi_get_maxframe - Get max payload from the common service parameters
+ * @flp: FLOGI payload structure
+ * @maxval: upper limit, may be less than what is in the service parameters
+ */
+-static unsigned int fc_plogi_get_maxframe(struct fc_els_flogi *flp,
+- unsigned int maxval)
++static unsigned int
++fc_plogi_get_maxframe(struct fc_els_flogi *flp, unsigned int maxval)
+ {
+ unsigned int mfs;
+
+@@ -198,7 +197,7 @@
+ }
+
+ /**
+- * fc_rport_state_enter() - Change the rport's state
++ * fc_rport_state_enter - Change the rport's state
+ * @rport: The rport whose state should change
+ * @new: The new state of the rport
+ *
+@@ -215,7 +214,6 @@
+
+ static void fc_rport_work(struct work_struct *work)
+ {
+- u32 port_id;
+ struct fc_rport_libfc_priv *rdata =
+ container_of(work, struct fc_rport_libfc_priv, event_work);
+ enum fc_rport_event event;
+@@ -281,18 +279,14 @@
+ rport_ops->event_callback(lport, rport, event);
+ if (trans_state == FC_PORTSTATE_ROGUE)
+ put_device(&rport->dev);
+- else {
+- port_id = rport->port_id;
++ else
+ fc_remote_port_delete(rport);
+- lport->tt.exch_mgr_reset(lport, 0, port_id);
+- lport->tt.exch_mgr_reset(lport, port_id, 0);
+- }
+ } else
+ mutex_unlock(&rdata->rp_mutex);
+ }
+
+ /**
+- * fc_rport_login() - Start the remote port login state machine
++ * fc_rport_login - Start the remote port login state machine
+ * @rport: Fibre Channel remote port
+ *
+ * Locking Note: Called without the rport lock held. This
+@@ -315,7 +309,7 @@
+ }
+
+ /**
+- * fc_rport_logoff() - Logoff and remove an rport
++ * fc_rport_logoff - Logoff and remove an rport
+ * @rport: Fibre Channel remote port to be removed
+ *
+ * Locking Note: Called without the rport lock held. This
+@@ -353,7 +347,7 @@
+ }
+
+ /**
+- * fc_rport_enter_ready() - The rport is ready
++ * fc_rport_enter_ready - The rport is ready
+ * @rport: Fibre Channel remote port that is ready
+ *
+ * Locking Note: The rport lock is expected to be held before calling
+@@ -372,7 +366,7 @@
+ }
+
+ /**
+- * fc_rport_timeout() - Handler for the retry_work timer.
++ * fc_rport_timeout - Handler for the retry_work timer.
+ * @work: The work struct of the fc_rport_libfc_priv
+ *
+ * Locking Note: Called without the rport lock held. This
+@@ -411,75 +405,59 @@
+ }
+
+ /**
+- * fc_rport_error() - Error handler, called once retries have been exhausted
++ * fc_rport_error - Handler for any errors
+ * @rport: The fc_rport object
+ * @fp: The frame pointer
+ *
++ * If the error was caused by a resource allocation failure
++ * then wait for half a second and retry, otherwise retry
++ * immediately.
++ *
+ * Locking Note: The rport lock is expected to be held before
+ * calling this routine
+ */
+ static void fc_rport_error(struct fc_rport *rport, struct fc_frame *fp)
+ {
+ struct fc_rport_libfc_priv *rdata = rport->dd_data;
++ unsigned long delay = 0;
+
+ FC_DEBUG_RPORT("Error %ld in state %s, retries %d\n",
+ PTR_ERR(fp), fc_rport_state(rport), rdata->retries);
+
+- switch (rdata->rp_state) {
+- case RPORT_ST_PLOGI:
+- case RPORT_ST_PRLI:
+- case RPORT_ST_LOGO:
+- rdata->event = RPORT_EV_FAILED;
+- queue_work(rport_event_queue,
+- &rdata->event_work);
+- break;
+- case RPORT_ST_RTV:
+- fc_rport_enter_ready(rport);
+- break;
+- case RPORT_ST_NONE:
+- case RPORT_ST_READY:
+- case RPORT_ST_INIT:
+- break;
+- }
+-}
+-
+-/**
+- * fc_rport_error_retry() - Error handler when retries are desired
+- * @rport: The fc_rport object
+- * @fp: The frame pointer
+- *
+- * If the error was an exchange timeout retry immediately,
+- * otherwise wait for E_D_TOV.
+- *
+- * Locking Note: The rport lock is expected to be held before
+- * calling this routine
+- */
+-static void fc_rport_error_retry(struct fc_rport *rport, struct fc_frame *fp)
+-{
+- struct fc_rport_libfc_priv *rdata = rport->dd_data;
+- unsigned long delay = FC_DEF_E_D_TOV;
+-
+- /* make sure this isn't an FC_EX_CLOSED error, never retry those */
+- if (PTR_ERR(fp) == -FC_EX_CLOSED)
+- return fc_rport_error(rport, fp);
+-
+- if (rdata->retries < rdata->local_port->max_retry_count) {
+- FC_DEBUG_RPORT("Error %ld in state %s, retrying\n",
+- PTR_ERR(fp), fc_rport_state(rport));
+- rdata->retries++;
+- /* no additional delay on exchange timeouts */
+- if (PTR_ERR(fp) == -FC_EX_TIMEOUT)
+- delay = 0;
+- get_device(&rport->dev);
+- schedule_delayed_work(&rdata->retry_work, delay);
+- return;
++ if (!fp || PTR_ERR(fp) == -FC_EX_TIMEOUT) {
++ /*
++ * Memory allocation failure, or the exchange timed out.
++ * Retry after delay
++ */
++ if (rdata->retries < rdata->local_port->max_retry_count) {
++ rdata->retries++;
++ if (!fp)
++ delay = msecs_to_jiffies(500);
++ get_device(&rport->dev);
++ schedule_delayed_work(&rdata->retry_work, delay);
++ } else {
++ switch (rdata->rp_state) {
++ case RPORT_ST_PLOGI:
++ case RPORT_ST_PRLI:
++ case RPORT_ST_LOGO:
++ rdata->event = RPORT_EV_FAILED;
++ queue_work(rport_event_queue,
++ &rdata->event_work);
++ break;
++ case RPORT_ST_RTV:
++ fc_rport_enter_ready(rport);
++ break;
++ case RPORT_ST_NONE:
++ case RPORT_ST_READY:
++ case RPORT_ST_INIT:
++ break;
++ }
++ }
+ }
+-
+- return fc_rport_error(rport, fp);
+ }
+
+ /**
+- * fc_rport_plogi_recv_resp() - Handle incoming ELS PLOGI response
++ * fc_rport_plogi_recv_resp - Handle incoming ELS PLOGI response
+ * @sp: current sequence in the PLOGI exchange
+ * @fp: response frame
+ * @rp_arg: Fibre Channel remote port
+@@ -505,17 +483,17 @@
+ FC_DEBUG_RPORT("Received a PLOGI response from port (%6x)\n",
+ rport->port_id);
+
+- if (IS_ERR(fp)) {
+- fc_rport_error_retry(rport, fp);
+- goto err;
+- }
+-
+ if (rdata->rp_state != RPORT_ST_PLOGI) {
+ FC_DBG("Received a PLOGI response, but in state %s\n",
+ fc_rport_state(rport));
+ goto out;
+ }
+
++ if (IS_ERR(fp)) {
++ fc_rport_error(rport, fp);
++ goto err;
++ }
++
+ op = fc_frame_payload_op(fp);
+ if (op == ELS_LS_ACC &&
+ (plp = fc_frame_payload_get(fp, sizeof(*plp))) != NULL) {
+@@ -544,7 +522,7 @@
+ else
+ fc_rport_enter_prli(rport);
+ } else
+- fc_rport_error_retry(rport, fp);
++ fc_rport_error(rport, fp);
+
+ out:
+ fc_frame_free(fp);
+@@ -554,7 +532,7 @@
+ }
+
+ /**
+- * fc_rport_enter_plogi() - Send Port Login (PLOGI) request to peer
++ * fc_rport_enter_plogi - Send Port Login (PLOGI) request to peer
+ * @rport: Fibre Channel remote port to send PLOGI to
+ *
+ * Locking Note: The rport lock is expected to be held before calling
+@@ -574,20 +552,20 @@
+ rport->maxframe_size = FC_MIN_MAX_PAYLOAD;
+ fp = fc_frame_alloc(lport, sizeof(struct fc_els_flogi));
+ if (!fp) {
+- fc_rport_error_retry(rport, fp);
++ fc_rport_error(rport, fp);
+ return;
+ }
+ rdata->e_d_tov = lport->e_d_tov;
+
+ if (!lport->tt.elsct_send(lport, rport, fp, ELS_PLOGI,
+ fc_rport_plogi_resp, rport, lport->e_d_tov))
+- fc_rport_error_retry(rport, fp);
++ fc_rport_error(rport, fp);
+ else
+ get_device(&rport->dev);
+ }
+
+ /**
+- * fc_rport_prli_resp() - Process Login (PRLI) response handler
++ * fc_rport_prli_resp - Process Login (PRLI) response handler
+ * @sp: current sequence in the PRLI exchange
+ * @fp: response frame
+ * @rp_arg: Fibre Channel remote port
+@@ -614,17 +592,17 @@
+ FC_DEBUG_RPORT("Received a PRLI response from port (%6x)\n",
+ rport->port_id);
+
+- if (IS_ERR(fp)) {
+- fc_rport_error_retry(rport, fp);
+- goto err;
+- }
+-
+ if (rdata->rp_state != RPORT_ST_PRLI) {
+ FC_DBG("Received a PRLI response, but in state %s\n",
+ fc_rport_state(rport));
+ goto out;
+ }
+
++ if (IS_ERR(fp)) {
++ fc_rport_error(rport, fp);
++ goto err;
++ }
++
+ op = fc_frame_payload_op(fp);
+ if (op == ELS_LS_ACC) {
+ pp = fc_frame_payload_get(fp, sizeof(*pp));
+@@ -657,7 +635,7 @@
+ }
+
+ /**
+- * fc_rport_logo_resp() - Logout (LOGO) response handler
++ * fc_rport_logo_resp - Logout (LOGO) response handler
+ * @sp: current sequence in the LOGO exchange
+ * @fp: response frame
+ * @rp_arg: Fibre Channel remote port
+@@ -679,7 +657,7 @@
+ rport->port_id);
+
+ if (IS_ERR(fp)) {
+- fc_rport_error_retry(rport, fp);
++ fc_rport_error(rport, fp);
+ goto err;
+ }
+
+@@ -706,7 +684,7 @@
+ }
+
+ /**
+- * fc_rport_enter_prli() - Send Process Login (PRLI) request to peer
++ * fc_rport_enter_prli - Send Process Login (PRLI) request to peer
+ * @rport: Fibre Channel remote port to send PRLI to
+ *
+ * Locking Note: The rport lock is expected to be held before calling
+@@ -729,19 +707,19 @@
+
+ fp = fc_frame_alloc(lport, sizeof(*pp));
+ if (!fp) {
+- fc_rport_error_retry(rport, fp);
++ fc_rport_error(rport, fp);
+ return;
+ }
+
+ if (!lport->tt.elsct_send(lport, rport, fp, ELS_PRLI,
+ fc_rport_prli_resp, rport, lport->e_d_tov))
+- fc_rport_error_retry(rport, fp);
++ fc_rport_error(rport, fp);
+ else
+ get_device(&rport->dev);
+ }
+
+ /**
+- * fc_rport_els_rtv_resp() - Request Timeout Value response handler
++ * fc_rport_els_rtv_resp - Request Timeout Value response handler
+ * @sp: current sequence in the RTV exchange
+ * @fp: response frame
+ * @rp_arg: Fibre Channel remote port
+@@ -764,17 +742,17 @@
+ FC_DEBUG_RPORT("Received a RTV response from port (%6x)\n",
+ rport->port_id);
+
+- if (IS_ERR(fp)) {
+- fc_rport_error(rport, fp);
+- goto err;
+- }
+-
+ if (rdata->rp_state != RPORT_ST_RTV) {
+ FC_DBG("Received a RTV response, but in state %s\n",
+ fc_rport_state(rport));
+ goto out;
+ }
+
++ if (IS_ERR(fp)) {
++ fc_rport_error(rport, fp);
++ goto err;
++ }
++
+ op = fc_frame_payload_op(fp);
+ if (op == ELS_LS_ACC) {
+ struct fc_els_rtv_acc *rtv;
+@@ -807,7 +785,7 @@
+ }
+
+ /**
+- * fc_rport_enter_rtv() - Send Request Timeout Value (RTV) request to peer
++ * fc_rport_enter_rtv - Send Request Timeout Value (RTV) request to peer
+ * @rport: Fibre Channel remote port to send RTV to
+ *
+ * Locking Note: The rport lock is expected to be held before calling
+@@ -826,19 +804,19 @@
+
+ fp = fc_frame_alloc(lport, sizeof(struct fc_els_rtv));
+ if (!fp) {
+- fc_rport_error_retry(rport, fp);
++ fc_rport_error(rport, fp);
+ return;
+ }
+
+ if (!lport->tt.elsct_send(lport, rport, fp, ELS_RTV,
+ fc_rport_rtv_resp, rport, lport->e_d_tov))
+- fc_rport_error_retry(rport, fp);
++ fc_rport_error(rport, fp);
+ else
+ get_device(&rport->dev);
+ }
+
+ /**
+- * fc_rport_enter_logo() - Send Logout (LOGO) request to peer
++ * fc_rport_enter_logo - Send Logout (LOGO) request to peer
+ * @rport: Fibre Channel remote port to send LOGO to
+ *
+ * Locking Note: The rport lock is expected to be held before calling
+@@ -857,20 +835,20 @@
+
+ fp = fc_frame_alloc(lport, sizeof(struct fc_els_logo));
+ if (!fp) {
+- fc_rport_error_retry(rport, fp);
++ fc_rport_error(rport, fp);
+ return;
+ }
+
+ if (!lport->tt.elsct_send(lport, rport, fp, ELS_LOGO,
+ fc_rport_logo_resp, rport, lport->e_d_tov))
+- fc_rport_error_retry(rport, fp);
++ fc_rport_error(rport, fp);
+ else
+ get_device(&rport->dev);
+ }
+
+
+ /**
+- * fc_rport_recv_req() - Receive a request from a rport
++ * fc_rport_recv_req - Receive a request from a rport
+ * @sp: current sequence in the PLOGI exchange
+ * @fp: response frame
+ * @rp_arg: Fibre Channel remote port
+@@ -931,7 +909,7 @@
+ }
+
+ /**
+- * fc_rport_recv_plogi_req() - Handle incoming Port Login (PLOGI) request
++ * fc_rport_recv_plogi_req - Handle incoming Port Login (PLOGI) request
+ * @rport: Fibre Channel remote port that initiated PLOGI
+ * @sp: current sequence in the PLOGI exchange
+ * @fp: PLOGI request frame
+@@ -1053,7 +1031,7 @@
+ }
+
+ /**
+- * fc_rport_recv_prli_req() - Handle incoming Process Login (PRLI) request
++ * fc_rport_recv_prli_req - Handle incoming Process Login (PRLI) request
+ * @rport: Fibre Channel remote port that initiated PRLI
+ * @sp: current sequence in the PRLI exchange
+ * @fp: PRLI request frame
+@@ -1204,7 +1182,7 @@
+ }
+
+ /**
+- * fc_rport_recv_prlo_req() - Handle incoming Process Logout (PRLO) request
++ * fc_rport_recv_prlo_req - Handle incoming Process Logout (PRLO) request
+ * @rport: Fibre Channel remote port that initiated PRLO
+ * @sp: current sequence in the PRLO exchange
+ * @fp: PRLO request frame
+@@ -1235,7 +1213,7 @@
+ }
+
+ /**
+- * fc_rport_recv_logo_req() - Handle incoming Logout (LOGO) request
++ * fc_rport_recv_logo_req - Handle incoming Logout (LOGO) request
+ * @rport: Fibre Channel remote port that initiated LOGO
+ * @sp: current sequence in the LOGO exchange
+ * @fp: LOGO request frame
+@@ -1271,9 +1249,6 @@
+
+ int fc_rport_init(struct fc_lport *lport)
+ {
+- if (!lport->tt.rport_create)
+- lport->tt.rport_create = fc_rport_rogue_create;
+-
+ if (!lport->tt.rport_login)
+ lport->tt.rport_login = fc_rport_login;
+
+@@ -1310,7 +1285,7 @@
+ struct fc_rport_libfc_priv *rdata = rport->dd_data;
+ struct fc_lport *lport = rdata->local_port;
+
+- lport->tt.exch_mgr_reset(lport, 0, rport->port_id);
+- lport->tt.exch_mgr_reset(lport, rport->port_id, 0);
++ lport->tt.exch_mgr_reset(lport->emp, 0, rport->port_id);
++ lport->tt.exch_mgr_reset(lport->emp, rport->port_id, 0);
+ }
+ EXPORT_SYMBOL(fc_rport_terminate_io);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/libiscsi.c linux-2.6.29-rc3.owrt/drivers/scsi/libiscsi.c
+--- linux-2.6.29.owrt/drivers/scsi/libiscsi.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/libiscsi.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1998,8 +1998,6 @@
+ if (!shost->can_queue)
+ shost->can_queue = ISCSI_DEF_XMIT_CMDS_MAX;
+
+- if (!shost->transportt->eh_timed_out)
+- shost->transportt->eh_timed_out = iscsi_eh_cmd_timed_out;
+ return scsi_add_host(shost, pdev);
+ }
+ EXPORT_SYMBOL_GPL(iscsi_host_add);
+@@ -2022,6 +2020,7 @@
+ shost = scsi_host_alloc(sht, sizeof(struct iscsi_host) + dd_data_size);
+ if (!shost)
+ return NULL;
++ shost->transportt->eh_timed_out = iscsi_eh_cmd_timed_out;
+
+ if (qdepth > ISCSI_MAX_CMD_PER_LUN || qdepth < 1) {
+ if (qdepth != 0)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/lpfc/lpfc_els.c linux-2.6.29-rc3.owrt/drivers/scsi/lpfc/lpfc_els.c
+--- linux-2.6.29.owrt/drivers/scsi/lpfc/lpfc_els.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/lpfc/lpfc_els.c 2009-05-10 23:48:29.000000000 +0200
+@@ -5258,7 +5258,6 @@
+ sizeof(struct lpfc_name));
+ break;
+ default:
+- kfree(els_data);
+ return;
+ }
+ memcpy(els_data->wwpn, &ndlp->nlp_portname, sizeof(struct lpfc_name));
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_attr.c linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_attr.c
+--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_attr.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_attr.c 2009-05-10 23:48:29.000000000 +0200
+@@ -244,6 +244,12 @@
+ if (ha->optrom_state != QLA_SWAITING)
+ break;
+
++ if (start & 0xfff) {
++ qla_printk(KERN_WARNING, ha,
++ "Invalid start region 0x%x/0x%x.\n", start, size);
++ return -EINVAL;
++ }
++
+ ha->optrom_region_start = start;
+ ha->optrom_region_size = start + size > ha->optrom_size ?
+ ha->optrom_size - start : size;
+@@ -297,7 +303,8 @@
+ else if (start == (ha->flt_region_boot * 4) ||
+ start == (ha->flt_region_fw * 4))
+ valid = 1;
+- else if (IS_QLA25XX(ha) || IS_QLA81XX(ha))
++ else if ((IS_QLA25XX(ha) || IS_QLA81XX(ha)) &&
++ start == (ha->flt_region_vpd_nvram * 4))
+ valid = 1;
+ if (!valid) {
+ qla_printk(KERN_WARNING, ha,
+@@ -1258,6 +1265,13 @@
+ test_bit(FCPORT_UPDATE_NEEDED, &vha->dpc_flags))
+ msleep(1000);
+
++ if (ha->mqenable) {
++ if (qla25xx_delete_queues(vha, 0) != QLA_SUCCESS)
++ qla_printk(KERN_WARNING, ha,
++ "Queue delete failed.\n");
++ vha->req_ques[0] = ha->req_q_map[0]->id;
++ }
++
+ qla24xx_disable_vp(vha);
+
+ fc_remove_host(vha->host);
+@@ -1279,12 +1293,6 @@
+ vha->host_no, vha->vp_idx, vha));
+ }
+
+- if (ha->mqenable) {
+- if (qla25xx_delete_queues(vha, 0) != QLA_SUCCESS)
+- qla_printk(KERN_WARNING, ha,
+- "Queue delete failed.\n");
+- }
+-
+ scsi_host_put(vha->host);
+ qla_printk(KERN_INFO, ha, "vport %d deleted\n", id);
+ return 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_def.h linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_def.h
+--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_def.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_def.h 2009-05-10 23:48:29.000000000 +0200
+@@ -2135,7 +2135,6 @@
+ /* Work events. */
+ enum qla_work_type {
+ QLA_EVT_AEN,
+- QLA_EVT_IDC_ACK,
+ };
+
+
+@@ -2150,10 +2149,6 @@
+ enum fc_host_event_code code;
+ u32 data;
+ } aen;
+- struct {
+-#define QLA_IDC_ACK_REGS 7
+- uint16_t mb[QLA_IDC_ACK_REGS];
+- } idc_ack;
+ } u;
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_devtbl.h linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_devtbl.h
+--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_devtbl.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_devtbl.h 2009-05-10 23:48:29.000000000 +0200
+@@ -72,7 +72,7 @@
+ "QLA2462", "Sun PCI-X 2.0 to 4Gb FC, Dual Channel", /* 0x141 */
+ "QLE2460", "Sun PCI-Express to 2Gb FC, Single Channel", /* 0x142 */
+ "QLE2462", "Sun PCI-Express to 4Gb FC, Single Channel", /* 0x143 */
+- "QEM2462", "Server I/O Module 4Gb FC, Dual Channel", /* 0x144 */
++ "QEM2462" "Server I/O Module 4Gb FC, Dual Channel", /* 0x144 */
+ "QLE2440", "PCI-Express to 4Gb FC, Single Channel", /* 0x145 */
+ "QLE2464", "PCI-Express to 4Gb FC, Quad Channel", /* 0x146 */
+ "QLA2440", "PCI-X 2.0 to 4Gb FC, Single Channel", /* 0x147 */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_fw.h linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_fw.h
+--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_fw.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_fw.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1402,8 +1402,6 @@
+ #define MBA_IDC_NOTIFY 0x8101
+ #define MBA_IDC_TIME_EXT 0x8102
+
+-#define MBC_IDC_ACK 0x101
+-
+ struct nvram_81xx {
+ /* NVRAM header. */
+ uint8_t id[4];
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_gbl.h linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_gbl.h
+--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_gbl.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_gbl.h 2009-05-10 23:48:29.000000000 +0200
+@@ -72,7 +72,6 @@
+ extern void qla2x00_abort_all_cmds(scsi_qla_host_t *, int);
+ extern int qla2x00_post_aen_work(struct scsi_qla_host *, enum
+ fc_host_event_code, u32);
+-extern int qla2x00_post_idc_ack_work(struct scsi_qla_host *, uint16_t *);
+
+ extern void qla2x00_abort_fcport_cmds(fc_port_t *);
+ extern struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *,
+@@ -267,8 +266,6 @@
+
+ extern int qla84xx_verify_chip(struct scsi_qla_host *, uint16_t *);
+
+-extern int qla81xx_idc_ack(scsi_qla_host_t *, uint16_t *);
+-
+ /*
+ * Global Function Prototypes in qla_isr.c source file.
+ */
+@@ -379,8 +376,10 @@
+
+ /* Globa function prototypes for multi-q */
+ extern int qla25xx_request_irq(struct rsp_que *);
+-extern int qla25xx_init_req_que(struct scsi_qla_host *, struct req_que *);
+-extern int qla25xx_init_rsp_que(struct scsi_qla_host *, struct rsp_que *);
++extern int qla25xx_init_req_que(struct scsi_qla_host *, struct req_que *,
++ uint8_t);
++extern int qla25xx_init_rsp_que(struct scsi_qla_host *, struct rsp_que *,
++ uint8_t);
+ extern int qla25xx_create_req_que(struct qla_hw_data *, uint16_t, uint8_t,
+ uint16_t, uint8_t, uint8_t);
+ extern int qla25xx_create_rsp_que(struct qla_hw_data *, uint16_t, uint8_t,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_init.c linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_init.c
+--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_init.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_init.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1226,8 +1226,9 @@
+ icb->firmware_options_2 |=
+ __constant_cpu_to_le32(BIT_18);
+
+- icb->firmware_options_2 &= __constant_cpu_to_le32(~BIT_22);
++ icb->firmware_options_2 |= __constant_cpu_to_le32(BIT_22);
+ icb->firmware_options_2 |= __constant_cpu_to_le32(BIT_23);
++ ha->rsp_q_map[0]->options = icb->firmware_options_2;
+
+ WRT_REG_DWORD(&reg->isp25mq.req_q_in, 0);
+ WRT_REG_DWORD(&reg->isp25mq.req_q_out, 0);
+@@ -1308,12 +1309,8 @@
+
+ DEBUG(printk("scsi(%ld): Issue init firmware.\n", vha->host_no));
+
+- if (ha->flags.npiv_supported) {
+- if (ha->operating_mode == LOOP)
+- ha->max_npiv_vports = MIN_MULTI_ID_FABRIC - 1;
++ if (ha->flags.npiv_supported)
+ mid_init_cb->count = cpu_to_le16(ha->max_npiv_vports);
+- }
+-
+
+ mid_init_cb->options = __constant_cpu_to_le16(BIT_1);
+
+@@ -2614,7 +2611,6 @@
+ port_id_t wrap, nxt_d_id;
+ struct qla_hw_data *ha = vha->hw;
+ struct scsi_qla_host *vp, *base_vha = pci_get_drvdata(ha->pdev);
+- struct scsi_qla_host *tvp;
+
+ rval = QLA_SUCCESS;
+
+@@ -2714,7 +2710,7 @@
+ /* Bypass virtual ports of the same host. */
+ found = 0;
+ if (ha->num_vhosts) {
+- list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) {
++ list_for_each_entry(vp, &ha->vp_list, list) {
+ if (new_fcport->d_id.b24 == vp->d_id.b24) {
+ found = 1;
+ break;
+@@ -2837,7 +2833,6 @@
+ uint16_t first_loop_id;
+ struct qla_hw_data *ha = vha->hw;
+ struct scsi_qla_host *vp;
+- struct scsi_qla_host *tvp;
+
+ rval = QLA_SUCCESS;
+
+@@ -2862,7 +2857,7 @@
+ /* Check for loop ID being already in use. */
+ found = 0;
+ fcport = NULL;
+- list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) {
++ list_for_each_entry(vp, &ha->vp_list, list) {
+ list_for_each_entry(fcport, &vp->vp_fcports, list) {
+ if (fcport->loop_id == dev->loop_id &&
+ fcport != dev) {
+@@ -3297,7 +3292,6 @@
+ uint8_t status = 0;
+ struct qla_hw_data *ha = vha->hw;
+ struct scsi_qla_host *vp;
+- struct scsi_qla_host *tvp;
+ struct req_que *req = ha->req_q_map[0];
+
+ if (vha->flags.online) {
+@@ -3313,7 +3307,7 @@
+ if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
+ atomic_set(&vha->loop_state, LOOP_DOWN);
+ qla2x00_mark_all_devices_lost(vha, 0);
+- list_for_each_entry_safe(vp, tvp, &ha->vp_list, list)
++ list_for_each_entry(vp, &ha->vp_list, list)
+ qla2x00_mark_all_devices_lost(vp, 0);
+ } else {
+ if (!atomic_read(&vha->loop_down_timer))
+@@ -3410,7 +3404,7 @@
+ DEBUG(printk(KERN_INFO
+ "qla2x00_abort_isp(%ld): succeeded.\n",
+ vha->host_no));
+- list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) {
++ list_for_each_entry(vp, &ha->vp_list, list) {
+ if (vp->vp_idx)
+ qla2x00_vp_abort_isp(vp);
+ }
+@@ -3435,7 +3429,7 @@
+ static int
+ qla2x00_restart_isp(scsi_qla_host_t *vha)
+ {
+- int status = 0;
++ uint8_t status = 0;
+ uint32_t wait_time;
+ struct qla_hw_data *ha = vha->hw;
+ struct req_que *req = ha->req_q_map[0];
+@@ -3499,7 +3493,7 @@
+ rsp = ha->rsp_q_map[i];
+ if (rsp) {
+ rsp->options &= ~BIT_0;
+- ret = qla25xx_init_rsp_que(base_vha, rsp);
++ ret = qla25xx_init_rsp_que(base_vha, rsp, rsp->options);
+ if (ret != QLA_SUCCESS)
+ DEBUG2_17(printk(KERN_WARNING
+ "%s Rsp que:%d init failed\n", __func__,
+@@ -3513,7 +3507,7 @@
+ if (req) {
+ /* Clear outstanding commands array. */
+ req->options &= ~BIT_0;
+- ret = qla25xx_init_req_que(base_vha, req);
++ ret = qla25xx_init_req_que(base_vha, req, req->options);
+ if (ret != QLA_SUCCESS)
+ DEBUG2_17(printk(KERN_WARNING
+ "%s Req que:%d init failed\n", __func__,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_isr.c linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_isr.c
+--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_isr.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_isr.c 2009-05-10 23:48:29.000000000 +0200
+@@ -266,40 +266,6 @@
+ }
+ }
+
+-static void
+-qla81xx_idc_event(scsi_qla_host_t *vha, uint16_t aen, uint16_t descr)
+-{
+- static char *event[] =
+- { "Complete", "Request Notification", "Time Extension" };
+- int rval;
+- struct device_reg_24xx __iomem *reg24 = &vha->hw->iobase->isp24;
+- uint16_t __iomem *wptr;
+- uint16_t cnt, timeout, mb[QLA_IDC_ACK_REGS];
+-
+- /* Seed data -- mailbox1 -> mailbox7. */
+- wptr = (uint16_t __iomem *)&reg24->mailbox1;
+- for (cnt = 0; cnt < QLA_IDC_ACK_REGS; cnt++, wptr++)
+- mb[cnt] = RD_REG_WORD(wptr);
+-
+- DEBUG2(printk("scsi(%ld): Inter-Driver Commucation %s -- "
+- "%04x %04x %04x %04x %04x %04x %04x.\n", vha->host_no,
+- event[aen & 0xff],
+- mb[0], mb[1], mb[2], mb[3], mb[4], mb[5], mb[6]));
+-
+- /* Acknowledgement needed? [Notify && non-zero timeout]. */
+- timeout = (descr >> 8) & 0xf;
+- if (aen != MBA_IDC_NOTIFY || !timeout)
+- return;
+-
+- DEBUG2(printk("scsi(%ld): Inter-Driver Commucation %s -- "
+- "ACK timeout=%d.\n", vha->host_no, event[aen & 0xff], timeout));
+-
+- rval = qla2x00_post_idc_ack_work(vha, mb);
+- if (rval != QLA_SUCCESS)
+- qla_printk(KERN_WARNING, vha->hw,
+- "IDC failed to post ACK.\n");
+-}
+-
+ /**
+ * qla2x00_async_event() - Process aynchronous events.
+ * @ha: SCSI driver HA context
+@@ -748,9 +714,21 @@
+ "%04x %04x %04x\n", vha->host_no, mb[1], mb[2], mb[3]));
+ break;
+ case MBA_IDC_COMPLETE:
++ DEBUG2(printk("scsi(%ld): Inter-Driver Commucation "
++ "Complete -- %04x %04x %04x\n", vha->host_no, mb[1], mb[2],
++ mb[3]));
++ break;
+ case MBA_IDC_NOTIFY:
++ DEBUG2(printk("scsi(%ld): Inter-Driver Commucation "
++ "Request Notification -- %04x %04x %04x\n", vha->host_no,
++ mb[1], mb[2], mb[3]));
++ /**** Mailbox registers 4 - 7 valid!!! */
++ break;
+ case MBA_IDC_TIME_EXT:
+- qla81xx_idc_event(vha, mb[0], mb[1]);
++ DEBUG2(printk("scsi(%ld): Inter-Driver Commucation "
++ "Time Extension -- %04x %04x %04x\n", vha->host_no, mb[1],
++ mb[2], mb[3]));
++ /**** Mailbox registers 4 - 7 valid!!! */
+ break;
+ }
+
+@@ -1729,6 +1707,7 @@
+ struct qla_hw_data *ha;
+ struct rsp_que *rsp;
+ struct device_reg_24xx __iomem *reg;
++ uint16_t msix_disabled_hccr = 0;
+
+ rsp = (struct rsp_que *) dev_id;
+ if (!rsp) {
+@@ -1741,8 +1720,17 @@
+
+ spin_lock_irq(&ha->hardware_lock);
+
++ msix_disabled_hccr = rsp->options;
++ if (!rsp->id)
++ msix_disabled_hccr &= __constant_cpu_to_le32(BIT_22);
++ else
++ msix_disabled_hccr &= __constant_cpu_to_le32(BIT_6);
++
+ qla24xx_process_response_queue(rsp);
+
++ if (!msix_disabled_hccr)
++ WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
++
+ spin_unlock_irq(&ha->hardware_lock);
+
+ return IRQ_HANDLED;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_mbx.c linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_mbx.c
+--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_mbx.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_mbx.c 2009-05-10 23:48:29.000000000 +0200
+@@ -2685,7 +2685,6 @@
+ uint16_t stat = le16_to_cpu(rptid_entry->vp_idx);
+ struct qla_hw_data *ha = vha->hw;
+ scsi_qla_host_t *vp;
+- scsi_qla_host_t *tvp;
+
+ if (rptid_entry->entry_status != 0)
+ return;
+@@ -2711,7 +2710,7 @@
+ if (MSB(stat) == 1)
+ return;
+
+- list_for_each_entry_safe(vp, tvp, &ha->vp_list, list)
++ list_for_each_entry(vp, &ha->vp_list, list)
+ if (vp_idx == vp->vp_idx)
+ break;
+ if (!vp)
+@@ -3091,7 +3090,8 @@
+ }
+
+ int
+-qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req)
++qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req,
++ uint8_t options)
+ {
+ int rval;
+ unsigned long flags;
+@@ -3101,7 +3101,7 @@
+ struct qla_hw_data *ha = vha->hw;
+
+ mcp->mb[0] = MBC_INITIALIZE_MULTIQ;
+- mcp->mb[1] = req->options;
++ mcp->mb[1] = options;
+ mcp->mb[2] = MSW(LSD(req->dma));
+ mcp->mb[3] = LSW(LSD(req->dma));
+ mcp->mb[6] = MSW(MSD(req->dma));
+@@ -3128,7 +3128,7 @@
+ mcp->tov = 60;
+
+ spin_lock_irqsave(&ha->hardware_lock, flags);
+- if (!(req->options & BIT_0)) {
++ if (!(options & BIT_0)) {
+ WRT_REG_DWORD(&reg->req_q_in, 0);
+ WRT_REG_DWORD(&reg->req_q_out, 0);
+ }
+@@ -3142,7 +3142,8 @@
+ }
+
+ int
+-qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp)
++qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp,
++ uint8_t options)
+ {
+ int rval;
+ unsigned long flags;
+@@ -3152,7 +3153,7 @@
+ struct qla_hw_data *ha = vha->hw;
+
+ mcp->mb[0] = MBC_INITIALIZE_MULTIQ;
+- mcp->mb[1] = rsp->options;
++ mcp->mb[1] = options;
+ mcp->mb[2] = MSW(LSD(rsp->dma));
+ mcp->mb[3] = LSW(LSD(rsp->dma));
+ mcp->mb[6] = MSW(MSD(rsp->dma));
+@@ -3177,7 +3178,7 @@
+ mcp->tov = 60;
+
+ spin_lock_irqsave(&ha->hardware_lock, flags);
+- if (!(rsp->options & BIT_0)) {
++ if (!(options & BIT_0)) {
+ WRT_REG_DWORD(&reg->rsp_q_out, 0);
+ WRT_REG_DWORD(&reg->rsp_q_in, 0);
+ }
+@@ -3192,29 +3193,3 @@
+ return rval;
+ }
+
+-int
+-qla81xx_idc_ack(scsi_qla_host_t *vha, uint16_t *mb)
+-{
+- int rval;
+- mbx_cmd_t mc;
+- mbx_cmd_t *mcp = &mc;
+-
+- DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no));
+-
+- mcp->mb[0] = MBC_IDC_ACK;
+- memcpy(&mcp->mb[1], mb, QLA_IDC_ACK_REGS * sizeof(uint16_t));
+- mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
+- mcp->in_mb = MBX_0;
+- mcp->tov = MBX_TOV_SECONDS;
+- mcp->flags = 0;
+- rval = qla2x00_mailbox_command(vha, mcp);
+-
+- if (rval != QLA_SUCCESS) {
+- DEBUG2_3_11(printk("%s(%ld): failed=%x (%x).\n", __func__,
+- vha->host_no, rval, mcp->mb[0]));
+- } else {
+- DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no));
+- }
+-
+- return rval;
+-}
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_mid.c linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_mid.c
+--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_mid.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_mid.c 2009-05-10 23:48:29.000000000 +0200
+@@ -69,10 +69,9 @@
+ qla24xx_find_vhost_by_name(struct qla_hw_data *ha, uint8_t *port_name)
+ {
+ scsi_qla_host_t *vha;
+- struct scsi_qla_host *tvha;
+
+ /* Locate matching device in database. */
+- list_for_each_entry_safe(vha, tvha, &ha->vp_list, list) {
++ list_for_each_entry(vha, &ha->vp_list, list) {
+ if (!memcmp(port_name, vha->port_name, WWN_SIZE))
+ return vha;
+ }
+@@ -195,11 +194,11 @@
+ void
+ qla2x00_alert_all_vps(struct rsp_que *rsp, uint16_t *mb)
+ {
+- scsi_qla_host_t *vha, *tvha;
++ scsi_qla_host_t *vha;
+ struct qla_hw_data *ha = rsp->hw;
+ int i = 0;
+
+- list_for_each_entry_safe(vha, tvha, &ha->vp_list, list) {
++ list_for_each_entry(vha, &ha->vp_list, list) {
+ if (vha->vp_idx) {
+ switch (mb[0]) {
+ case MBA_LIP_OCCURRED:
+@@ -301,7 +300,6 @@
+ int ret;
+ struct qla_hw_data *ha = vha->hw;
+ scsi_qla_host_t *vp;
+- struct scsi_qla_host *tvp;
+
+ if (vha->vp_idx)
+ return;
+@@ -310,7 +308,7 @@
+
+ clear_bit(VP_DPC_NEEDED, &vha->dpc_flags);
+
+- list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) {
++ list_for_each_entry(vp, &ha->vp_list, list) {
+ if (vp->vp_idx)
+ ret = qla2x00_do_dpc_vp(vp);
+ }
+@@ -398,7 +396,7 @@
+
+ qla2x00_start_timer(vha, qla2x00_timer, WATCH_INTERVAL);
+
+- memset(vha->req_ques, 0, sizeof(vha->req_ques));
++ memset(vha->req_ques, 0, sizeof(vha->req_ques) * QLA_MAX_HOST_QUES);
+ vha->req_ques[0] = ha->req_q_map[0]->id;
+ host->can_queue = ha->req_q_map[0]->length + 128;
+ host->this_id = 255;
+@@ -473,7 +471,7 @@
+
+ if (req) {
+ req->options |= BIT_0;
+- ret = qla25xx_init_req_que(vha, req);
++ ret = qla25xx_init_req_que(vha, req, req->options);
+ }
+ if (ret == QLA_SUCCESS)
+ qla25xx_free_req_que(vha, req);
+@@ -488,7 +486,7 @@
+
+ if (rsp) {
+ rsp->options |= BIT_0;
+- ret = qla25xx_init_rsp_que(vha, rsp);
++ ret = qla25xx_init_rsp_que(vha, rsp, rsp->options);
+ }
+ if (ret == QLA_SUCCESS)
+ qla25xx_free_rsp_que(vha, rsp);
+@@ -504,7 +502,7 @@
+
+ req->options |= BIT_3;
+ req->qos = qos;
+- ret = qla25xx_init_req_que(vha, req);
++ ret = qla25xx_init_req_que(vha, req, req->options);
+ if (ret != QLA_SUCCESS)
+ DEBUG2_17(printk(KERN_WARNING "%s failed\n", __func__));
+ /* restore options bit */
+@@ -634,7 +632,7 @@
+ req->max_q_depth = ha->req_q_map[0]->max_q_depth;
+ mutex_unlock(&ha->vport_lock);
+
+- ret = qla25xx_init_req_que(base_vha, req);
++ ret = qla25xx_init_req_que(base_vha, req, options);
+ if (ret != QLA_SUCCESS) {
+ qla_printk(KERN_WARNING, ha, "%s failed\n", __func__);
+ mutex_lock(&ha->vport_lock);
+@@ -712,7 +710,7 @@
+ if (ret)
+ goto que_failed;
+
+- ret = qla25xx_init_rsp_que(base_vha, rsp);
++ ret = qla25xx_init_rsp_que(base_vha, rsp, options);
+ if (ret != QLA_SUCCESS) {
+ qla_printk(KERN_WARNING, ha, "%s failed\n", __func__);
+ mutex_lock(&ha->vport_lock);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_os.c linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_os.c
+--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_os.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_os.c 2009-05-10 23:48:29.000000000 +0200
+@@ -2222,6 +2222,10 @@
+ {
+ char name[16];
+
++ ha->init_cb_size = sizeof(init_cb_t);
++ if (IS_QLA2XXX_MIDTYPE(ha))
++ ha->init_cb_size = sizeof(struct mid_init_cb_24xx);
++
+ ha->init_cb = dma_alloc_coherent(&ha->pdev->dev, ha->init_cb_size,
+ &ha->init_cb_dma, GFP_KERNEL);
+ if (!ha->init_cb)
+@@ -2518,19 +2522,6 @@
+ return qla2x00_post_work(vha, e, 1);
+ }
+
+-int
+-qla2x00_post_idc_ack_work(struct scsi_qla_host *vha, uint16_t *mb)
+-{
+- struct qla_work_evt *e;
+-
+- e = qla2x00_alloc_work(vha, QLA_EVT_IDC_ACK, 1);
+- if (!e)
+- return QLA_FUNCTION_FAILED;
+-
+- memcpy(e->u.idc_ack.mb, mb, QLA_IDC_ACK_REGS * sizeof(uint16_t));
+- return qla2x00_post_work(vha, e, 1);
+-}
+-
+ static void
+ qla2x00_do_work(struct scsi_qla_host *vha)
+ {
+@@ -2548,9 +2539,6 @@
+ fc_host_post_event(vha->host, fc_get_event_number(),
+ e->u.aen.code, e->u.aen.data);
+ break;
+- case QLA_EVT_IDC_ACK:
+- qla81xx_idc_ack(vha, e->u.idc_ack.mb);
+- break;
+ }
+ if (e->flags & QLA_EVT_FLAG_FREE)
+ kfree(e);
+@@ -2564,7 +2552,7 @@
+ void qla2x00_relogin(struct scsi_qla_host *vha)
+ {
+ fc_port_t *fcport;
+- int status;
++ uint8_t status;
+ uint16_t next_loopid = 0;
+ struct qla_hw_data *ha = vha->hw;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_sup.c linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_sup.c
+--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_sup.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_sup.c 2009-05-10 23:48:29.000000000 +0200
+@@ -684,7 +684,7 @@
+ "end=0x%x size=0x%x.\n", le32_to_cpu(region->code), start,
+ le32_to_cpu(region->end) >> 2, le32_to_cpu(region->size)));
+
+- switch (le32_to_cpu(region->code) & 0xff) {
++ switch (le32_to_cpu(region->code)) {
+ case FLT_REG_FW:
+ ha->flt_region_fw = start;
+ break;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_version.h linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_version.h
+--- linux-2.6.29.owrt/drivers/scsi/qla2xxx/qla_version.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/qla2xxx/qla_version.h 2009-05-10 23:48:29.000000000 +0200
+@@ -7,7 +7,7 @@
+ /*
+ * Driver version
+ */
+-#define QLA2XXX_VERSION "8.03.00-k4"
++#define QLA2XXX_VERSION "8.03.00-k2"
+
+ #define QLA_DRIVER_MAJOR_VER 8
+ #define QLA_DRIVER_MINOR_VER 3
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/scsi_lib.c linux-2.6.29-rc3.owrt/drivers/scsi/scsi_lib.c
+--- linux-2.6.29.owrt/drivers/scsi/scsi_lib.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/scsi_lib.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1040,11 +1040,12 @@
+ action = ACTION_FAIL;
+ break;
+ case ABORTED_COMMAND:
+- action = ACTION_FAIL;
+ if (sshdr.asc == 0x10) { /* DIF */
+ description = "Target Data Integrity Failure";
++ action = ACTION_FAIL;
+ error = -EILSEQ;
+- }
++ } else
++ action = ACTION_RETRY;
+ break;
+ case NOT_READY:
+ /* If the device is in the process of becoming
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/scsi_scan.c linux-2.6.29-rc3.owrt/drivers/scsi/scsi_scan.c
+--- linux-2.6.29.owrt/drivers/scsi/scsi_scan.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/scsi_scan.c 2009-05-10 23:48:29.000000000 +0200
+@@ -317,7 +317,6 @@
+ return sdev;
+
+ out_device_destroy:
+- scsi_device_set_state(sdev, SDEV_DEL);
+ transport_destroy_device(&sdev->sdev_gendev);
+ put_device(&sdev->sdev_gendev);
+ out:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/sd.c linux-2.6.29-rc3.owrt/drivers/scsi/sd.c
+--- linux-2.6.29.owrt/drivers/scsi/sd.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/sd.c 2009-05-10 23:48:29.000000000 +0200
+@@ -107,7 +107,6 @@
+ static void sd_print_sense_hdr(struct scsi_disk *, struct scsi_sense_hdr *);
+ static void sd_print_result(struct scsi_disk *, int);
+
+-static DEFINE_SPINLOCK(sd_index_lock);
+ static DEFINE_IDA(sd_index_ida);
+
+ /* This semaphore is used to mediate the 0->1 reference get in the
+@@ -1167,19 +1166,23 @@
+ /*
+ * The device does not want the automatic start to be issued.
+ */
+- if (sdkp->device->no_start_on_add)
++ if (sdkp->device->no_start_on_add) {
+ break;
++ }
+
+- if (sense_valid && sshdr.sense_key == NOT_READY) {
+- if (sshdr.asc == 4 && sshdr.ascq == 3)
+- break; /* manual intervention required */
+- if (sshdr.asc == 4 && sshdr.ascq == 0xb)
+- break; /* standby */
+- if (sshdr.asc == 4 && sshdr.ascq == 0xc)
+- break; /* unavailable */
+- /*
+- * Issue command to spin up drive when not ready
+- */
++ /*
++ * If manual intervention is required, or this is an
++ * absent USB storage device, a spinup is meaningless.
++ */
++ if (sense_valid &&
++ sshdr.sense_key == NOT_READY &&
++ sshdr.asc == 4 && sshdr.ascq == 3) {
++ break; /* manual intervention required */
++
++ /*
++ * Issue command to spin up drive when not ready
++ */
++ } else if (sense_valid && sshdr.sense_key == NOT_READY) {
+ if (!spintime) {
+ sd_printk(KERN_NOTICE, sdkp, "Spinning up disk...");
+ cmd[0] = START_STOP;
+@@ -1911,9 +1914,7 @@
+ if (!ida_pre_get(&sd_index_ida, GFP_KERNEL))
+ goto out_put;
+
+- spin_lock(&sd_index_lock);
+ error = ida_get_new(&sd_index_ida, &index);
+- spin_unlock(&sd_index_lock);
+ } while (error == -EAGAIN);
+
+ if (error)
+@@ -1935,9 +1936,7 @@
+ return 0;
+
+ out_free_index:
+- spin_lock(&sd_index_lock);
+ ida_remove(&sd_index_ida, index);
+- spin_unlock(&sd_index_lock);
+ out_put:
+ put_disk(gd);
+ out_free:
+@@ -1987,9 +1986,7 @@
+ struct scsi_disk *sdkp = to_scsi_disk(dev);
+ struct gendisk *disk = sdkp->disk;
+
+- spin_lock(&sd_index_lock);
+ ida_remove(&sd_index_ida, sdkp->index);
+- spin_unlock(&sd_index_lock);
+
+ disk->private_data = NULL;
+ put_disk(disk);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/sg.c linux-2.6.29-rc3.owrt/drivers/scsi/sg.c
+--- linux-2.6.29.owrt/drivers/scsi/sg.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/sg.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1078,7 +1078,7 @@
+ case BLKTRACESETUP:
+ return blk_trace_setup(sdp->device->request_queue,
+ sdp->disk->disk_name,
+- MKDEV(SCSI_GENERIC_MAJOR, sdp->index),
++ sdp->device->sdev_gendev.devt,
+ (char *)arg);
+ case BLKTRACESTART:
+ return blk_trace_startstop(sdp->device->request_queue, 1);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/scsi/zalon.c linux-2.6.29-rc3.owrt/drivers/scsi/zalon.c
+--- linux-2.6.29.owrt/drivers/scsi/zalon.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/scsi/zalon.c 2009-05-10 23:48:29.000000000 +0200
+@@ -137,7 +137,7 @@
+ goto fail;
+
+ if (request_irq(dev->irq, ncr53c8xx_intr, IRQF_SHARED, "zalon", host)) {
+- dev_printk(KERN_ERR, &dev->dev, "irq problem with %d, detaching\n ",
++ dev_printk(KERN_ERR, dev, "irq problem with %d, detaching\n ",
+ dev->irq);
+ goto fail;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/serial/8250.c linux-2.6.29-rc3.owrt/drivers/serial/8250.c
+--- linux-2.6.29.owrt/drivers/serial/8250.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/serial/8250.c 2009-05-10 23:48:29.000000000 +0200
+@@ -2083,20 +2083,6 @@
+
+ serial8250_set_mctrl(&up->port, up->port.mctrl);
+
+- /* Serial over Lan (SoL) hack:
+- Intel 8257x Gigabit ethernet chips have a
+- 16550 emulation, to be used for Serial Over Lan.
+- Those chips take a longer time than a normal
+- serial device to signalize that a transmission
+- data was queued. Due to that, the above test generally
+- fails. One solution would be to delay the reading of
+- iir. However, this is not reliable, since the timeout
+- is variable. So, let's just don't test if we receive
+- TX irq. This way, we'll never enable UART_BUG_TXEN.
+- */
+- if (up->port.flags & UPF_NO_TXEN_TEST)
+- goto dont_test_tx_en;
+-
+ /*
+ * Do a quick test to see if we receive an
+ * interrupt when we enable the TX irq.
+@@ -2116,7 +2102,6 @@
+ up->bugs &= ~UART_BUG_TXEN;
+ }
+
+-dont_test_tx_en:
+ spin_unlock_irqrestore(&up->port.lock, flags);
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/serial/8250_pci.c linux-2.6.29-rc3.owrt/drivers/serial/8250_pci.c
+--- linux-2.6.29.owrt/drivers/serial/8250_pci.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/serial/8250_pci.c 2009-05-10 23:48:29.000000000 +0200
+@@ -798,21 +798,6 @@
+ return setup_port(priv, port, bar, offset, board->reg_shift);
+ }
+
+-static int skip_tx_en_setup(struct serial_private *priv,
+- const struct pciserial_board *board,
+- struct uart_port *port, int idx)
+-{
+- port->flags |= UPF_NO_TXEN_TEST;
+- printk(KERN_DEBUG "serial8250: skipping TxEn test for device "
+- "[%04x:%04x] subsystem [%04x:%04x]\n",
+- priv->dev->vendor,
+- priv->dev->device,
+- priv->dev->subsystem_vendor,
+- priv->dev->subsystem_device);
+-
+- return pci_default_setup(priv, board, port, idx);
+-}
+-
+ /* This should be in linux/pci_ids.h */
+ #define PCI_VENDOR_ID_SBSMODULARIO 0x124B
+ #define PCI_SUBVENDOR_ID_SBSMODULARIO 0x124B
+@@ -879,27 +864,6 @@
+ .init = pci_inteli960ni_init,
+ .setup = pci_default_setup,
+ },
+- {
+- .vendor = PCI_VENDOR_ID_INTEL,
+- .device = PCI_DEVICE_ID_INTEL_8257X_SOL,
+- .subvendor = PCI_ANY_ID,
+- .subdevice = PCI_ANY_ID,
+- .setup = skip_tx_en_setup,
+- },
+- {
+- .vendor = PCI_VENDOR_ID_INTEL,
+- .device = PCI_DEVICE_ID_INTEL_82573L_SOL,
+- .subvendor = PCI_ANY_ID,
+- .subdevice = PCI_ANY_ID,
+- .setup = skip_tx_en_setup,
+- },
+- {
+- .vendor = PCI_VENDOR_ID_INTEL,
+- .device = PCI_DEVICE_ID_INTEL_82573E_SOL,
+- .subvendor = PCI_ANY_ID,
+- .subdevice = PCI_ANY_ID,
+- .setup = skip_tx_en_setup,
+- },
+ /*
+ * ITE
+ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/serial/atmel_serial.c linux-2.6.29-rc3.owrt/drivers/serial/atmel_serial.c
+--- linux-2.6.29.owrt/drivers/serial/atmel_serial.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/serial/atmel_serial.c 2009-05-10 23:48:29.000000000 +0200
+@@ -877,10 +877,6 @@
+ }
+ }
+
+- /* Save current CSR for comparison in atmel_tasklet_func() */
+- atmel_port->irq_status_prev = UART_GET_CSR(port);
+- atmel_port->irq_status = atmel_port->irq_status_prev;
+-
+ /*
+ * Finally, enable the serial port
+ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/serial/jsm/jsm_driver.c linux-2.6.29-rc3.owrt/drivers/serial/jsm/jsm_driver.c
+--- linux-2.6.29.owrt/drivers/serial/jsm/jsm_driver.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/serial/jsm/jsm_driver.c 2009-05-10 23:48:29.000000000 +0200
+@@ -84,8 +84,6 @@
+ brd->pci_dev = pdev;
+ if (pdev->device == PCIE_DEVICE_ID_NEO_4_IBM)
+ brd->maxports = 4;
+- else if (pdev->device == PCI_DEVICE_ID_DIGI_NEO_8)
+- brd->maxports = 8;
+ else
+ brd->maxports = 2;
+
+@@ -214,7 +212,6 @@
+ { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2RJ45), 0, 0, 2 },
+ { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2RJ45PRI), 0, 0, 3 },
+ { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_4_IBM), 0, 0, 4 },
+- { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_NEO_8), 0, 0, 5 },
+ { 0, }
+ };
+ MODULE_DEVICE_TABLE(pci, jsm_pci_tbl);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/serial/jsm/jsm_tty.c linux-2.6.29-rc3.owrt/drivers/serial/jsm/jsm_tty.c
+--- linux-2.6.29.owrt/drivers/serial/jsm/jsm_tty.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/serial/jsm/jsm_tty.c 2009-05-10 23:48:29.000000000 +0200
+@@ -161,11 +161,6 @@
+ channel->ch_bd->bd_ops->disable_receiver(channel);
+ }
+
+-static void jsm_tty_enable_ms(struct uart_port *port)
+-{
+- /* Nothing needed */
+-}
+-
+ static void jsm_tty_break(struct uart_port *port, int break_state)
+ {
+ unsigned long lock_flags;
+@@ -350,7 +345,6 @@
+ .start_tx = jsm_tty_start_tx,
+ .send_xchar = jsm_tty_send_xchar,
+ .stop_rx = jsm_tty_stop_rx,
+- .enable_ms = jsm_tty_enable_ms,
+ .break_ctl = jsm_tty_break,
+ .startup = jsm_tty_open,
+ .shutdown = jsm_tty_close,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/serial/sh-sci.h linux-2.6.29-rc3.owrt/drivers/serial/sh-sci.h
+--- linux-2.6.29.owrt/drivers/serial/sh-sci.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/serial/sh-sci.h 2009-05-10 23:48:29.000000000 +0200
+@@ -133,7 +133,7 @@
+ # define SCSPTR3 0xffed0024 /* 16 bit SCIF */
+ # define SCSPTR4 0xffee0024 /* 16 bit SCIF */
+ # define SCSPTR5 0xffef0024 /* 16 bit SCIF */
+-# define SCIF_ORER 0x0001 /* Overrun error bit */
++# define SCIF_OPER 0x0001 /* Overrun error bit */
+ # define SCSCR_INIT(port) 0x3a /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
+ #elif defined(CONFIG_CPU_SUBTYPE_SH7201) || \
+ defined(CONFIG_CPU_SUBTYPE_SH7203) || \
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/spi/spi_gpio.c linux-2.6.29-rc3.owrt/drivers/spi/spi_gpio.c
+--- linux-2.6.29.owrt/drivers/spi/spi_gpio.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/spi/spi_gpio.c 2009-05-10 23:48:29.000000000 +0200
+@@ -117,7 +117,7 @@
+
+ static inline int getmiso(const struct spi_device *spi)
+ {
+- return !!gpio_get_value(SPI_MISO_GPIO);
++ return gpio_get_value(SPI_MISO_GPIO);
+ }
+
+ #undef pdata
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/agnx/agnx.h linux-2.6.29-rc3.owrt/drivers/staging/agnx/agnx.h
+--- linux-2.6.29.owrt/drivers/staging/agnx/agnx.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/staging/agnx/agnx.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,8 +1,6 @@
+ #ifndef AGNX_H_
+ #define AGNX_H_
+
+-#include <linux/io.h>
+-
+ #include "xmit.h"
+
+ #define PFX KBUILD_MODNAME ": "
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/altpciechdma/altpciechdma.c linux-2.6.29-rc3.owrt/drivers/staging/altpciechdma/altpciechdma.c
+--- linux-2.6.29.owrt/drivers/staging/altpciechdma/altpciechdma.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/staging/altpciechdma/altpciechdma.c 2009-05-10 23:48:29.000000000 +0200
+@@ -531,7 +531,7 @@
+ goto fail;
+
+ /* allocate and map coherently-cached memory for a DMA-able buffer */
+- /* @see Documentation/PCI/PCI-DMA-mapping.txt, near line 318 */
++ /* @see 2.6.26.2/Documentation/DMA-mapping.txt line 318 */
+ buffer_virt = (u8 *)pci_alloc_consistent(dev, PAGE_SIZE * 4, &buffer_bus);
+ if (!buffer_virt) {
+ printk(KERN_DEBUG "Could not allocate coherent DMA buffer.\n");
+@@ -846,7 +846,7 @@
+
+ #if 1 // @todo For now, disable 64-bit, because I do not understand the implications (DAC!)
+ /* query for DMA transfer */
+- /* @see Documentation/PCI/PCI-DMA-mapping.txt */
++ /* @see Documentation/DMA-mapping.txt */
+ if (!pci_set_dma_mask(dev, DMA_64BIT_MASK)) {
+ pci_set_consistent_dma_mask(dev, DMA_64BIT_MASK);
+ /* use 64-bit DMA */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/android/binder.c linux-2.6.29-rc3.owrt/drivers/staging/android/binder.c
+--- linux-2.6.29.owrt/drivers/staging/android/binder.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/staging/android/binder.c 2009-05-10 23:48:29.000000000 +0200
+@@ -319,7 +319,6 @@
+ int fd, error;
+ struct fdtable *fdt;
+ unsigned long rlim_cur;
+- unsigned long irqs;
+
+ if (files == NULL)
+ return -ESRCH;
+@@ -336,11 +335,12 @@
+ * N.B. For clone tasks sharing a files structure, this test
+ * will limit the total number of files that can be opened.
+ */
+- rlim_cur = 0;
+- if (lock_task_sighand(tsk, &irqs)) {
++ rcu_read_lock();
++ if (tsk->signal)
+ rlim_cur = tsk->signal->rlim[RLIMIT_NOFILE].rlim_cur;
+- unlock_task_sighand(tsk, &irqs);
+- }
++ else
++ rlim_cur = 0;
++ rcu_read_unlock();
+ if (fd >= rlim_cur)
+ goto out;
+
+@@ -2649,14 +2649,14 @@
+ {
+ struct binder_proc *proc = vma->vm_private_data;
+ if (binder_debug_mask & BINDER_DEBUG_OPEN_CLOSE)
+- printk(KERN_INFO "binder: %d open vm area %lx-%lx (%ld K) vma %lx pagep %lx\n", proc->pid, vma->vm_start, vma->vm_end, (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags, pgprot_val(vma->vm_page_prot));
++ printk(KERN_INFO "binder: %d open vm area %lx-%lx (%ld K) vma %lx pagep %lx\n", proc->pid, vma->vm_start, vma->vm_end, (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags, vma->vm_page_prot.pgprot);
+ dump_stack();
+ }
+ static void binder_vma_close(struct vm_area_struct *vma)
+ {
+ struct binder_proc *proc = vma->vm_private_data;
+ if (binder_debug_mask & BINDER_DEBUG_OPEN_CLOSE)
+- printk(KERN_INFO "binder: %d close vm area %lx-%lx (%ld K) vma %lx pagep %lx\n", proc->pid, vma->vm_start, vma->vm_end, (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags, pgprot_val(vma->vm_page_prot));
++ printk(KERN_INFO "binder: %d close vm area %lx-%lx (%ld K) vma %lx pagep %lx\n", proc->pid, vma->vm_start, vma->vm_end, (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags, vma->vm_page_prot.pgprot);
+ proc->vma = NULL;
+ }
+
+@@ -2677,7 +2677,7 @@
+ vma->vm_end = vma->vm_start + SZ_4M;
+
+ if (binder_debug_mask & BINDER_DEBUG_OPEN_CLOSE)
+- printk(KERN_INFO "binder_mmap: %d %lx-%lx (%ld K) vma %lx pagep %lx\n", proc->pid, vma->vm_start, vma->vm_end, (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags, pgprot_val(vma->vm_page_prot));
++ printk(KERN_INFO "binder_mmap: %d %lx-%lx (%ld K) vma %lx pagep %lx\n", proc->pid, vma->vm_start, vma->vm_end, (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags, vma->vm_page_prot.pgprot);
+
+ if (vma->vm_flags & FORBIDDEN_MMAP_FLAGS) {
+ ret = -EPERM;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/android/Kconfig linux-2.6.29-rc3.owrt/drivers/staging/android/Kconfig
+--- linux-2.6.29.owrt/drivers/staging/android/Kconfig 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/staging/android/Kconfig 2009-05-10 23:48:29.000000000 +0200
+@@ -27,7 +27,6 @@
+ bool "Android RAM Console Enable error correction"
+ default n
+ depends on ANDROID_RAM_CONSOLE
+- depends on !ANDROID_RAM_CONSOLE_EARLY_INIT
+ select REED_SOLOMON
+ select REED_SOLOMON_ENC8
+ select REED_SOLOMON_DEC8
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/android/lowmemorykiller.txt linux-2.6.29-rc3.owrt/drivers/staging/android/lowmemorykiller.txt
+--- linux-2.6.29.owrt/drivers/staging/android/lowmemorykiller.txt 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/staging/android/lowmemorykiller.txt 1970-01-01 01:00:00.000000000 +0100
+@@ -1,16 +0,0 @@
+-The lowmemorykiller driver lets user-space specify a set of memory thresholds
+-where processes with a range of oom_adj values will get killed. Specify the
+-minimum oom_adj values in /sys/module/lowmemorykiller/parameters/adj and the
+-number of free pages in /sys/module/lowmemorykiller/parameters/minfree. Both
+-files take a comma separated list of numbers in ascending order.
+-
+-For example, write "0,8" to /sys/module/lowmemorykiller/parameters/adj and
+-"1024,4096" to /sys/module/lowmemorykiller/parameters/minfree to kill processes
+-with a oom_adj value of 8 or higher when the free memory drops below 4096 pages
+-and kill processes with a oom_adj value of 0 or higher when the free memory
+-drops below 1024 pages.
+-
+-The driver considers memory used for caches to be free, but if a large
+-percentage of the cached memory is locked this can be very inaccurate
+-and processes may not get killed until the normal oom killer is triggered.
+-
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/android/ram_console.c linux-2.6.29-rc3.owrt/drivers/staging/android/ram_console.c
+--- linux-2.6.29.owrt/drivers/staging/android/ram_console.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/staging/android/ram_console.c 2009-05-10 23:48:29.000000000 +0200
+@@ -224,23 +224,9 @@
+ ram_console_buffer_size =
+ buffer_size - sizeof(struct ram_console_buffer);
+
+- if (ram_console_buffer_size > buffer_size) {
+- pr_err("ram_console: buffer %p, invalid size %d, datasize %d\n",
+- buffer, buffer_size, ram_console_buffer_size);
+- return 0;
+- }
+-
+ #ifdef CONFIG_ANDROID_RAM_CONSOLE_ERROR_CORRECTION
+ ram_console_buffer_size -= (DIV_ROUND_UP(ram_console_buffer_size,
+ ECC_BLOCK_SIZE) + 1) * ECC_SIZE;
+-
+- if (ram_console_buffer_size > buffer_size) {
+- pr_err("ram_console: buffer %p, invalid size %d, "
+- "non-ecc datasize %d\n",
+- buffer, buffer_size, ram_console_buffer_size);
+- return 0;
+- }
+-
+ ram_console_par_buffer = buffer->data + ram_console_buffer_size;
+
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/android/timed_gpio.c linux-2.6.29-rc3.owrt/drivers/staging/android/timed_gpio.c
+--- linux-2.6.29.owrt/drivers/staging/android/timed_gpio.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/staging/android/timed_gpio.c 2009-05-10 23:48:29.000000000 +0200
+@@ -18,7 +18,7 @@
+ #include <linux/platform_device.h>
+ #include <linux/hrtimer.h>
+ #include <linux/err.h>
+-#include <linux/gpio.h>
++#include <asm/arch/gpio.h>
+
+ #include "timed_gpio.h"
+
+@@ -49,8 +49,7 @@
+
+ if (hrtimer_active(&gpio_data->timer)) {
+ ktime_t r = hrtimer_get_remaining(&gpio_data->timer);
+- struct timeval t = ktime_to_timeval(r);
+- remaining = t.tv_sec * 1000 + t.tv_usec / 1000;
++ remaining = r.tv.sec * 1000 + r.tv.nsec / 1000000;
+ } else
+ remaining = 0;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/at76_usb/at76_usb.c linux-2.6.29-rc3.owrt/drivers/staging/at76_usb/at76_usb.c
+--- linux-2.6.29.owrt/drivers/staging/at76_usb/at76_usb.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/staging/at76_usb/at76_usb.c 2009-05-10 23:48:29.000000000 +0200
+@@ -6,6 +6,7 @@
+ * Copyright (c) 2004 Nick Jones
+ * Copyright (c) 2004 Balint Seeber <n0_5p4m_p13453@hotmail.com>
+ * Copyright (c) 2007 Guido Guenther <agx@sigxcpu.org>
++ * Copyright (c) 2007 Kalle Valo <kalle.valo@iki.fi>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+@@ -16,6 +17,13 @@
+ * Atmel AT76C503A/505/505A.
+ *
+ * Some iw_handler code was taken from airo.c, (C) 1999 Benjamin Reed
++ *
++ * TODO for the mac80211 port:
++ * o adhoc support
++ * o RTS/CTS support
++ * o Power Save Mode support
++ * o support for short/long preambles
++ * o export variables through debugfs/sysfs
+ */
+
+ #include <linux/init.h>
+@@ -36,7 +44,7 @@
+ #include <net/ieee80211_radiotap.h>
+ #include <linux/firmware.h>
+ #include <linux/leds.h>
+-#include <net/ieee80211.h>
++#include <net/mac80211.h>
+
+ #include "at76_usb.h"
+
+@@ -76,31 +84,43 @@
+ #define DBG_WE_EVENTS 0x08000000 /* dump wireless events */
+ #define DBG_FW 0x10000000 /* firmware download */
+ #define DBG_DFU 0x20000000 /* device firmware upgrade */
++#define DBG_CMD 0x40000000
++#define DBG_MAC80211 0x80000000
+
+ #define DBG_DEFAULTS 0
+
+ /* Use our own dbg macro */
+ #define at76_dbg(bits, format, arg...) \
+- do { \
+- if (at76_debug & (bits)) \
++do { \
++ if (at76_debug & (bits)) \
++ printk(KERN_DEBUG DRIVER_NAME ": " format "\n" , ## arg); \
++} while (0)
++
++#define at76_dbg_dump(bits, buf, len, format, arg...) \
++do { \
++ if (at76_debug & (bits)) { \
+ printk(KERN_DEBUG DRIVER_NAME ": " format "\n" , ## arg); \
+- } while (0)
++ print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, buf, len); \
++ } \
++} while (0)
+
+ static int at76_debug = DBG_DEFAULTS;
+
++#define FIRMWARE_IS_WPA(ver) ((ver.major == 1) && (ver.minor == 103))
++
+ /* Protect against concurrent firmware loading and parsing */
+ static struct mutex fw_mutex;
+
+ static struct fwentry firmwares[] = {
+- [0] = {""},
+- [BOARD_503_ISL3861] = {"atmel_at76c503-i3861.bin"},
+- [BOARD_503_ISL3863] = {"atmel_at76c503-i3863.bin"},
+- [BOARD_503] = {"atmel_at76c503-rfmd.bin"},
+- [BOARD_503_ACC] = {"atmel_at76c503-rfmd-acc.bin"},
+- [BOARD_505] = {"atmel_at76c505-rfmd.bin"},
+- [BOARD_505_2958] = {"atmel_at76c505-rfmd2958.bin"},
+- [BOARD_505A] = {"atmel_at76c505a-rfmd2958.bin"},
+- [BOARD_505AMX] = {"atmel_at76c505amx-rfmd.bin"},
++ [0] = { "" },
++ [BOARD_503_ISL3861] = { "atmel_at76c503-i3861.bin" },
++ [BOARD_503_ISL3863] = { "atmel_at76c503-i3863.bin" },
++ [BOARD_503] = { "atmel_at76c503-rfmd.bin" },
++ [BOARD_503_ACC] = { "atmel_at76c503-rfmd-acc.bin" },
++ [BOARD_505] = { "atmel_at76c505-rfmd.bin" },
++ [BOARD_505_2958] = { "atmel_at76c505-rfmd2958.bin" },
++ [BOARD_505A] = { "atmel_at76c505a-rfmd2958.bin" },
++ [BOARD_505AMX] = { "atmel_at76c505amx-rfmd.bin" },
+ };
+
+ #define USB_DEVICE_DATA(__ops) .driver_info = (kernel_ulong_t)(__ops)
+@@ -110,135 +130,133 @@
+ * at76c503-i3861
+ */
+ /* Generic AT76C503/3861 device */
+- {USB_DEVICE(0x03eb, 0x7603), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++ { USB_DEVICE(0x03eb, 0x7603), USB_DEVICE_DATA(BOARD_503_ISL3861) },
+ /* Linksys WUSB11 v2.1/v2.6 */
+- {USB_DEVICE(0x066b, 0x2211), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++ { USB_DEVICE(0x066b, 0x2211), USB_DEVICE_DATA(BOARD_503_ISL3861) },
+ /* Netgear MA101 rev. A */
+- {USB_DEVICE(0x0864, 0x4100), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++ { USB_DEVICE(0x0864, 0x4100), USB_DEVICE_DATA(BOARD_503_ISL3861) },
+ /* Tekram U300C / Allnet ALL0193 */
+- {USB_DEVICE(0x0b3b, 0x1612), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++ { USB_DEVICE(0x0b3b, 0x1612), USB_DEVICE_DATA(BOARD_503_ISL3861) },
+ /* HP HN210W J7801A */
+- {USB_DEVICE(0x03f0, 0x011c), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++ { USB_DEVICE(0x03f0, 0x011c), USB_DEVICE_DATA(BOARD_503_ISL3861) },
+ /* Sitecom/Z-Com/Zyxel M4Y-750 */
+- {USB_DEVICE(0x0cde, 0x0001), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++ { USB_DEVICE(0x0cde, 0x0001), USB_DEVICE_DATA(BOARD_503_ISL3861) },
+ /* Dynalink/Askey WLL013 (intersil) */
+- {USB_DEVICE(0x069a, 0x0320), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++ { USB_DEVICE(0x069a, 0x0320), USB_DEVICE_DATA(BOARD_503_ISL3861) },
+ /* EZ connect 11Mpbs Wireless USB Adapter SMC2662W v1 */
+- {USB_DEVICE(0x0d5c, 0xa001), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++ { USB_DEVICE(0x0d5c, 0xa001), USB_DEVICE_DATA(BOARD_503_ISL3861) },
+ /* BenQ AWL300 */
+- {USB_DEVICE(0x04a5, 0x9000), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++ { USB_DEVICE(0x04a5, 0x9000), USB_DEVICE_DATA(BOARD_503_ISL3861) },
+ /* Addtron AWU-120, Compex WLU11 */
+- {USB_DEVICE(0x05dd, 0xff31), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++ { USB_DEVICE(0x05dd, 0xff31), USB_DEVICE_DATA(BOARD_503_ISL3861) },
+ /* Intel AP310 AnyPoint II USB */
+- {USB_DEVICE(0x8086, 0x0200), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++ { USB_DEVICE(0x8086, 0x0200), USB_DEVICE_DATA(BOARD_503_ISL3861) },
+ /* Dynalink L11U */
+- {USB_DEVICE(0x0d8e, 0x7100), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++ { USB_DEVICE(0x0d8e, 0x7100), USB_DEVICE_DATA(BOARD_503_ISL3861) },
+ /* Arescom WL-210, FCC id 07J-GL2411USB */
+- {USB_DEVICE(0x0d8e, 0x7110), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++ { USB_DEVICE(0x0d8e, 0x7110), USB_DEVICE_DATA(BOARD_503_ISL3861) },
+ /* I-O DATA WN-B11/USB */
+- {USB_DEVICE(0x04bb, 0x0919), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++ { USB_DEVICE(0x04bb, 0x0919), USB_DEVICE_DATA(BOARD_503_ISL3861) },
+ /* BT Voyager 1010 */
+- {USB_DEVICE(0x069a, 0x0821), USB_DEVICE_DATA(BOARD_503_ISL3861)},
++ { USB_DEVICE(0x069a, 0x0821), USB_DEVICE_DATA(BOARD_503_ISL3861) },
+ /*
+ * at76c503-i3863
+ */
+ /* Generic AT76C503/3863 device */
+- {USB_DEVICE(0x03eb, 0x7604), USB_DEVICE_DATA(BOARD_503_ISL3863)},
++ { USB_DEVICE(0x03eb, 0x7604), USB_DEVICE_DATA(BOARD_503_ISL3863) },
+ /* Samsung SWL-2100U */
+- {USB_DEVICE(0x055d, 0xa000), USB_DEVICE_DATA(BOARD_503_ISL3863)},
++ { USB_DEVICE(0x055d, 0xa000), USB_DEVICE_DATA(BOARD_503_ISL3863) },
+ /*
+ * at76c503-rfmd
+ */
+ /* Generic AT76C503/RFMD device */
+- {USB_DEVICE(0x03eb, 0x7605), USB_DEVICE_DATA(BOARD_503)},
++ { USB_DEVICE(0x03eb, 0x7605), USB_DEVICE_DATA(BOARD_503) },
+ /* Dynalink/Askey WLL013 (rfmd) */
+- {USB_DEVICE(0x069a, 0x0321), USB_DEVICE_DATA(BOARD_503)},
++ { USB_DEVICE(0x069a, 0x0321), USB_DEVICE_DATA(BOARD_503) },
+ /* Linksys WUSB11 v2.6 */
+- {USB_DEVICE(0x077b, 0x2219), USB_DEVICE_DATA(BOARD_503)},
++ { USB_DEVICE(0x077b, 0x2219), USB_DEVICE_DATA(BOARD_503) },
+ /* Network Everywhere NWU11B */
+- {USB_DEVICE(0x077b, 0x2227), USB_DEVICE_DATA(BOARD_503)},
++ { USB_DEVICE(0x077b, 0x2227), USB_DEVICE_DATA(BOARD_503) },
+ /* Netgear MA101 rev. B */
+- {USB_DEVICE(0x0864, 0x4102), USB_DEVICE_DATA(BOARD_503)},
++ { USB_DEVICE(0x0864, 0x4102), USB_DEVICE_DATA(BOARD_503) },
+ /* D-Link DWL-120 rev. E */
+- {USB_DEVICE(0x2001, 0x3200), USB_DEVICE_DATA(BOARD_503)},
++ { USB_DEVICE(0x2001, 0x3200), USB_DEVICE_DATA(BOARD_503) },
+ /* Actiontec 802UAT1, HWU01150-01UK */
+- {USB_DEVICE(0x1668, 0x7605), USB_DEVICE_DATA(BOARD_503)},
++ { USB_DEVICE(0x1668, 0x7605), USB_DEVICE_DATA(BOARD_503) },
+ /* AirVast W-Buddie WN210 */
+- {USB_DEVICE(0x03eb, 0x4102), USB_DEVICE_DATA(BOARD_503)},
++ { USB_DEVICE(0x03eb, 0x4102), USB_DEVICE_DATA(BOARD_503) },
+ /* Dick Smith Electronics XH1153 802.11b USB adapter */
+- {USB_DEVICE(0x1371, 0x5743), USB_DEVICE_DATA(BOARD_503)},
++ { USB_DEVICE(0x1371, 0x5743), USB_DEVICE_DATA(BOARD_503) },
+ /* CNet CNUSB611 */
+- {USB_DEVICE(0x1371, 0x0001), USB_DEVICE_DATA(BOARD_503)},
++ { USB_DEVICE(0x1371, 0x0001), USB_DEVICE_DATA(BOARD_503) },
+ /* FiberLine FL-WL200U */
+- {USB_DEVICE(0x1371, 0x0002), USB_DEVICE_DATA(BOARD_503)},
++ { USB_DEVICE(0x1371, 0x0002), USB_DEVICE_DATA(BOARD_503) },
+ /* BenQ AWL400 USB stick */
+- {USB_DEVICE(0x04a5, 0x9001), USB_DEVICE_DATA(BOARD_503)},
++ { USB_DEVICE(0x04a5, 0x9001), USB_DEVICE_DATA(BOARD_503) },
+ /* 3Com 3CRSHEW696 */
+- {USB_DEVICE(0x0506, 0x0a01), USB_DEVICE_DATA(BOARD_503)},
++ { USB_DEVICE(0x0506, 0x0a01), USB_DEVICE_DATA(BOARD_503) },
+ /* Siemens Santis ADSL WLAN USB adapter WLL 013 */
+- {USB_DEVICE(0x0681, 0x001b), USB_DEVICE_DATA(BOARD_503)},
++ { USB_DEVICE(0x0681, 0x001b), USB_DEVICE_DATA(BOARD_503) },
+ /* Belkin F5D6050, version 2 */
+- {USB_DEVICE(0x050d, 0x0050), USB_DEVICE_DATA(BOARD_503)},
++ { USB_DEVICE(0x050d, 0x0050), USB_DEVICE_DATA(BOARD_503) },
+ /* iBlitzz, BWU613 (not *B or *SB) */
+- {USB_DEVICE(0x07b8, 0xb000), USB_DEVICE_DATA(BOARD_503)},
++ { USB_DEVICE(0x07b8, 0xb000), USB_DEVICE_DATA(BOARD_503) },
+ /* Gigabyte GN-WLBM101 */
+- {USB_DEVICE(0x1044, 0x8003), USB_DEVICE_DATA(BOARD_503)},
++ { USB_DEVICE(0x1044, 0x8003), USB_DEVICE_DATA(BOARD_503) },
+ /* Planex GW-US11S */
+- {USB_DEVICE(0x2019, 0x3220), USB_DEVICE_DATA(BOARD_503)},
++ { USB_DEVICE(0x2019, 0x3220), USB_DEVICE_DATA(BOARD_503) },
+ /* Internal WLAN adapter in h5[4,5]xx series iPAQs */
+- {USB_DEVICE(0x049f, 0x0032), USB_DEVICE_DATA(BOARD_503)},
++ { USB_DEVICE(0x049f, 0x0032), USB_DEVICE_DATA(BOARD_503) },
+ /* Corega Wireless LAN USB-11 mini */
+- {USB_DEVICE(0x07aa, 0x0011), USB_DEVICE_DATA(BOARD_503)},
++ { USB_DEVICE(0x07aa, 0x0011), USB_DEVICE_DATA(BOARD_503) },
+ /* Corega Wireless LAN USB-11 mini2 */
+- {USB_DEVICE(0x07aa, 0x0018), USB_DEVICE_DATA(BOARD_503)},
++ { USB_DEVICE(0x07aa, 0x0018), USB_DEVICE_DATA(BOARD_503) },
+ /* Uniden PCW100 */
+- {USB_DEVICE(0x05dd, 0xff35), USB_DEVICE_DATA(BOARD_503)},
++ { USB_DEVICE(0x05dd, 0xff35), USB_DEVICE_DATA(BOARD_503) },
+ /*
+ * at76c503-rfmd-acc
+ */
+ /* SMC2664W */
+- {USB_DEVICE(0x083a, 0x3501), USB_DEVICE_DATA(BOARD_503_ACC)},
++ { USB_DEVICE(0x083a, 0x3501), USB_DEVICE_DATA(BOARD_503_ACC) },
+ /* Belkin F5D6050, SMC2662W v2, SMC2662W-AR */
+- {USB_DEVICE(0x0d5c, 0xa002), USB_DEVICE_DATA(BOARD_503_ACC)},
++ { USB_DEVICE(0x0d5c, 0xa002), USB_DEVICE_DATA(BOARD_503_ACC) },
+ /*
+ * at76c505-rfmd
+ */
+ /* Generic AT76C505/RFMD */
+- {USB_DEVICE(0x03eb, 0x7606), USB_DEVICE_DATA(BOARD_505)},
++ { USB_DEVICE(0x03eb, 0x7606), USB_DEVICE_DATA(BOARD_505) },
+ /*
+ * at76c505-rfmd2958
+ */
+ /* Generic AT76C505/RFMD, OvisLink WL-1130USB */
+- {USB_DEVICE(0x03eb, 0x7613), USB_DEVICE_DATA(BOARD_505_2958)},
++ { USB_DEVICE(0x03eb, 0x7613), USB_DEVICE_DATA(BOARD_505_2958) },
+ /* Fiberline FL-WL240U */
+- {USB_DEVICE(0x1371, 0x0014), USB_DEVICE_DATA(BOARD_505_2958)},
++ { USB_DEVICE(0x1371, 0x0014), USB_DEVICE_DATA(BOARD_505_2958) },
+ /* CNet CNUSB-611G */
+- {USB_DEVICE(0x1371, 0x0013), USB_DEVICE_DATA(BOARD_505_2958)},
++ { USB_DEVICE(0x1371, 0x0013), USB_DEVICE_DATA(BOARD_505_2958) },
+ /* Linksys WUSB11 v2.8 */
+- {USB_DEVICE(0x1915, 0x2233), USB_DEVICE_DATA(BOARD_505_2958)},
++ { USB_DEVICE(0x1915, 0x2233), USB_DEVICE_DATA(BOARD_505_2958) },
+ /* Xterasys XN-2122B, IBlitzz BWU613B/BWU613SB */
+- {USB_DEVICE(0x12fd, 0x1001), USB_DEVICE_DATA(BOARD_505_2958)},
++ { USB_DEVICE(0x12fd, 0x1001), USB_DEVICE_DATA(BOARD_505_2958) },
+ /* Corega WLAN USB Stick 11 */
+- {USB_DEVICE(0x07aa, 0x7613), USB_DEVICE_DATA(BOARD_505_2958)},
++ { USB_DEVICE(0x07aa, 0x7613), USB_DEVICE_DATA(BOARD_505_2958) },
+ /* Microstar MSI Box MS6978 */
+- {USB_DEVICE(0x0db0, 0x1020), USB_DEVICE_DATA(BOARD_505_2958)},
++ { USB_DEVICE(0x0db0, 0x1020), USB_DEVICE_DATA(BOARD_505_2958) },
+ /*
+ * at76c505a-rfmd2958
+ */
+ /* Generic AT76C505A device */
+- {USB_DEVICE(0x03eb, 0x7614), USB_DEVICE_DATA(BOARD_505A)},
++ { USB_DEVICE(0x03eb, 0x7614), USB_DEVICE_DATA(BOARD_505A) },
+ /* Generic AT76C505AS device */
+- {USB_DEVICE(0x03eb, 0x7617), USB_DEVICE_DATA(BOARD_505A)},
++ { USB_DEVICE(0x03eb, 0x7617), USB_DEVICE_DATA(BOARD_505A) },
+ /* Siemens Gigaset USB WLAN Adapter 11 */
+- {USB_DEVICE(0x1690, 0x0701), USB_DEVICE_DATA(BOARD_505A)},
+- /* OQO Model 01+ Internal Wi-Fi */
+- {USB_DEVICE(0x1557, 0x0002), USB_DEVICE_DATA(BOARD_505A)},
++ { USB_DEVICE(0x1690, 0x0701), USB_DEVICE_DATA(BOARD_505A) },
+ /*
+ * at76c505amx-rfmd
+ */
+ /* Generic AT76C505AMX device */
+- {USB_DEVICE(0x03eb, 0x7615), USB_DEVICE_DATA(BOARD_505AMX)},
+- {}
++ { USB_DEVICE(0x03eb, 0x7615), USB_DEVICE_DATA(BOARD_505AMX) },
++ { }
+ };
+
+ MODULE_DEVICE_TABLE(usb, dev_table);
+@@ -246,26 +264,8 @@
+ /* Supported rates of this hardware, bit 7 marks basic rates */
+ static const u8 hw_rates[] = { 0x82, 0x84, 0x0b, 0x16 };
+
+-/* Frequency of each channel in MHz */
+-static const long channel_frequency[] = {
+- 2412, 2417, 2422, 2427, 2432, 2437, 2442,
+- 2447, 2452, 2457, 2462, 2467, 2472, 2484
+-};
+-
+-#define NUM_CHANNELS ARRAY_SIZE(channel_frequency)
+-
+ static const char *const preambles[] = { "long", "short", "auto" };
+
+-static const char *const mac_states[] = {
+- [MAC_INIT] = "INIT",
+- [MAC_SCANNING] = "SCANNING",
+- [MAC_AUTH] = "AUTH",
+- [MAC_ASSOC] = "ASSOC",
+- [MAC_JOINING] = "JOINING",
+- [MAC_CONNECTED] = "CONNECTED",
+- [MAC_OWN_IBSS] = "OWN_IBSS"
+-};
+-
+ /* Firmware download */
+ /* DFU states */
+ #define STATE_IDLE 0x00
+@@ -300,17 +300,30 @@
+
+ static inline int at76_is_intersil(enum board_type board)
+ {
+- return (board == BOARD_503_ISL3861 || board == BOARD_503_ISL3863);
++ if (board == BOARD_503_ISL3861 || board == BOARD_503_ISL3863)
++ return 1;
++ return 0;
+ }
+
+ static inline int at76_is_503rfmd(enum board_type board)
+ {
+- return (board == BOARD_503 || board == BOARD_503_ACC);
++ if (board == BOARD_503 || board == BOARD_503_ACC)
++ return 1;
++ return 0;
++}
++
++static inline int at76_is_505(enum board_type board)
++{
++ if (board == BOARD_505 || board == BOARD_505_2958)
++ return 1;
++ return 0;
+ }
+
+ static inline int at76_is_505a(enum board_type board)
+ {
+- return (board == BOARD_505A || board == BOARD_505AMX);
++ if (board == BOARD_505A || board == BOARD_505AMX)
++ return 1;
++ return 0;
+ }
+
+ /* Load a block of the first (internal) part of the firmware */
+@@ -491,41 +504,6 @@
+ return ret;
+ }
+
+-/* Report that the scan results are ready */
+-static inline void at76_iwevent_scan_complete(struct net_device *netdev)
+-{
+- union iwreq_data wrqu;
+- wrqu.data.length = 0;
+- wrqu.data.flags = 0;
+- wireless_send_event(netdev, SIOCGIWSCAN, &wrqu, NULL);
+- at76_dbg(DBG_WE_EVENTS, "%s: SIOCGIWSCAN sent", netdev->name);
+-}
+-
+-static inline void at76_iwevent_bss_connect(struct net_device *netdev,
+- u8 *bssid)
+-{
+- union iwreq_data wrqu;
+- wrqu.data.length = 0;
+- wrqu.data.flags = 0;
+- memcpy(wrqu.ap_addr.sa_data, bssid, ETH_ALEN);
+- wrqu.ap_addr.sa_family = ARPHRD_ETHER;
+- wireless_send_event(netdev, SIOCGIWAP, &wrqu, NULL);
+- at76_dbg(DBG_WE_EVENTS, "%s: %s: SIOCGIWAP sent", netdev->name,
+- __func__);
+-}
+-
+-static inline void at76_iwevent_bss_disconnect(struct net_device *netdev)
+-{
+- union iwreq_data wrqu;
+- wrqu.data.length = 0;
+- wrqu.data.flags = 0;
+- memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN);
+- wrqu.ap_addr.sa_family = ARPHRD_ETHER;
+- wireless_send_event(netdev, SIOCGIWAP, &wrqu, NULL);
+- at76_dbg(DBG_WE_EVENTS, "%s: %s: SIOCGIWAP sent", netdev->name,
+- __func__);
+-}
+-
+ #define HEX2STR_BUFFERS 4
+ #define HEX2STR_MAX_LEN 64
+ #define BIN2HEX(x) ((x) < 10 ? '0' + (x) : (x) + 'A' - 10)
+@@ -597,37 +575,6 @@
+ mod_timer(&ledtrig_tx_timer, jiffies + HZ / 4);
+ }
+
+-/* Check if the given ssid is hidden */
+-static inline int at76_is_hidden_ssid(u8 *ssid, int length)
+-{
+- static const u8 zeros[32];
+-
+- if (length == 0)
+- return 1;
+-
+- if (length == 1 && ssid[0] == ' ')
+- return 1;
+-
+- return (memcmp(ssid, zeros, length) == 0);
+-}
+-
+-static inline void at76_free_bss_list(struct at76_priv *priv)
+-{
+- struct list_head *next, *ptr;
+- unsigned long flags;
+-
+- spin_lock_irqsave(&priv->bss_list_spinlock, flags);
+-
+- priv->curr_bss = NULL;
+-
+- list_for_each_safe(ptr, next, &priv->bss_list) {
+- list_del(ptr);
+- kfree(list_entry(ptr, struct bss_info, list));
+- }
+-
+- spin_unlock_irqrestore(&priv->bss_list_spinlock, flags);
+-}
+-
+ static int at76_remap(struct usb_device *udev)
+ {
+ int ret;
+@@ -651,7 +598,7 @@
+ return -ENOMEM;
+ ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 0x33,
+ USB_TYPE_VENDOR | USB_DIR_IN |
+- USB_RECIP_INTERFACE, 0x01, 0, op_mode, 1,
++ USB_RECIP_INTERFACE, 0x01, 0, &op_mode, 1,
+ USB_CTRL_GET_TIMEOUT);
+ saved = *op_mode;
+ kfree(op_mode);
+@@ -729,7 +676,7 @@
+ kfree(hwcfg);
+ if (ret < 0)
+ printk(KERN_ERR "%s: cannot get HW Config (error %d)\n",
+- priv->netdev->name, ret);
++ wiphy_name(priv->hw->wiphy), ret);
+
+ return ret;
+ }
+@@ -738,15 +685,15 @@
+ {
+ int i;
+ static struct reg_domain const fd_tab[] = {
+- {0x10, "FCC (USA)", 0x7ff}, /* ch 1-11 */
+- {0x20, "IC (Canada)", 0x7ff}, /* ch 1-11 */
+- {0x30, "ETSI (most of Europe)", 0x1fff}, /* ch 1-13 */
+- {0x31, "Spain", 0x600}, /* ch 10-11 */
+- {0x32, "France", 0x1e00}, /* ch 10-13 */
+- {0x40, "MKK (Japan)", 0x2000}, /* ch 14 */
+- {0x41, "MKK1 (Japan)", 0x3fff}, /* ch 1-14 */
+- {0x50, "Israel", 0x3fc}, /* ch 3-9 */
+- {0x00, "<unknown>", 0xffffffff} /* ch 1-32 */
++ { 0x10, "FCC (USA)", 0x7ff }, /* ch 1-11 */
++ { 0x20, "IC (Canada)", 0x7ff }, /* ch 1-11 */
++ { 0x30, "ETSI (most of Europe)", 0x1fff }, /* ch 1-13 */
++ { 0x31, "Spain", 0x600 }, /* ch 10-11 */
++ { 0x32, "France", 0x1e00 }, /* ch 10-13 */
++ { 0x40, "MKK (Japan)", 0x2000 }, /* ch 14 */
++ { 0x41, "MKK1 (Japan)", 0x3fff }, /* ch 1-14 */
++ { 0x50, "Israel", 0x3fc }, /* ch 3-9 */
++ { 0x00, "<unknown>", 0xffffffff } /* ch 1-32 */
+ };
+
+ /* Last entry is fallback for unknown domain code */
+@@ -784,7 +731,7 @@
+ ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 0x22,
+ USB_TYPE_VENDOR | USB_DIR_IN |
+ USB_RECIP_INTERFACE, cmd, 0, stat_buf,
+- 40, USB_CTRL_GET_TIMEOUT);
++ sizeof(stat_buf), USB_CTRL_GET_TIMEOUT);
+ if (ret >= 0)
+ ret = stat_buf[5];
+ kfree(stat_buf);
+@@ -792,6 +739,24 @@
+ return ret;
+ }
+
++#define MAKE_CMD_CASE(c) case (c): return #c
++
++static const char *at76_get_cmd_string(u8 cmd_status)
++{
++ switch (cmd_status) {
++ MAKE_CMD_CASE(CMD_SET_MIB);
++ MAKE_CMD_CASE(CMD_GET_MIB);
++ MAKE_CMD_CASE(CMD_SCAN);
++ MAKE_CMD_CASE(CMD_JOIN);
++ MAKE_CMD_CASE(CMD_START_IBSS);
++ MAKE_CMD_CASE(CMD_RADIO_ON);
++ MAKE_CMD_CASE(CMD_RADIO_OFF);
++ MAKE_CMD_CASE(CMD_STARTUP);
++ }
++
++ return "UNKNOWN";
++}
++
+ static int at76_set_card_command(struct usb_device *udev, u8 cmd, void *buf,
+ int buf_size)
+ {
+@@ -807,6 +772,10 @@
+ cmd_buf->size = cpu_to_le16(buf_size);
+ memcpy(cmd_buf->data, buf, buf_size);
+
++ at76_dbg_dump(DBG_CMD, cmd_buf, sizeof(struct at76_command) + buf_size,
++ "issuing command %s (0x%02x)",
++ at76_get_cmd_string(cmd), cmd);
++
+ ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x0e,
+ USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
+ 0, 0, cmd_buf,
+@@ -844,13 +813,13 @@
+ status = at76_get_cmd_status(priv->udev, cmd);
+ if (status < 0) {
+ printk(KERN_ERR "%s: at76_get_cmd_status failed: %d\n",
+- priv->netdev->name, status);
++ wiphy_name(priv->hw->wiphy), status);
+ break;
+ }
+
+ at76_dbg(DBG_WAIT_COMPLETE,
+ "%s: Waiting on cmd %d, status = %d (%s)",
+- priv->netdev->name, cmd, status,
++ wiphy_name(priv->hw->wiphy), cmd, status,
+ at76_get_cmd_status_string(status));
+
+ if (status != CMD_STATUS_IN_PROGRESS
+@@ -861,7 +830,7 @@
+ if (time_after(jiffies, timeout)) {
+ printk(KERN_ERR
+ "%s: completion timeout for command %d\n",
+- priv->netdev->name, cmd);
++ wiphy_name(priv->hw->wiphy), cmd);
+ status = -ETIMEDOUT;
+ break;
+ }
+@@ -884,7 +853,7 @@
+ if (ret != CMD_STATUS_COMPLETE) {
+ printk(KERN_INFO
+ "%s: set_mib: at76_wait_completion failed "
+- "with %d\n", priv->netdev->name, ret);
++ "with %d\n", wiphy_name(priv->hw->wiphy), ret);
+ ret = -EIO;
+ }
+
+@@ -905,7 +874,7 @@
+ ret = at76_set_card_command(priv->udev, cmd, NULL, 0);
+ if (ret < 0)
+ printk(KERN_ERR "%s: at76_set_card_command(%d) failed: %d\n",
+- priv->netdev->name, cmd, ret);
++ wiphy_name(priv->hw->wiphy), cmd, ret);
+ else
+ ret = 1;
+
+@@ -926,44 +895,7 @@
+ ret = at76_set_mib(priv, &priv->mib_buf);
+ if (ret < 0)
+ printk(KERN_ERR "%s: set_mib (pm_mode) failed: %d\n",
+- priv->netdev->name, ret);
+-
+- return ret;
+-}
+-
+-/* Set the association id for power save mode */
+-static int at76_set_associd(struct at76_priv *priv, u16 id)
+-{
+- int ret = 0;
+-
+- priv->mib_buf.type = MIB_MAC_MGMT;
+- priv->mib_buf.size = 2;
+- priv->mib_buf.index = offsetof(struct mib_mac_mgmt, station_id);
+- priv->mib_buf.data.word = cpu_to_le16(id);
+-
+- ret = at76_set_mib(priv, &priv->mib_buf);
+- if (ret < 0)
+- printk(KERN_ERR "%s: set_mib (associd) failed: %d\n",
+- priv->netdev->name, ret);
+-
+- return ret;
+-}
+-
+-/* Set the listen interval for power save mode */
+-static int at76_set_listen_interval(struct at76_priv *priv, u16 interval)
+-{
+- int ret = 0;
+-
+- priv->mib_buf.type = MIB_MAC;
+- priv->mib_buf.size = 2;
+- priv->mib_buf.index = offsetof(struct mib_mac, listen_interval);
+- priv->mib_buf.data.word = cpu_to_le16(interval);
+-
+- ret = at76_set_mib(priv, &priv->mib_buf);
+- if (ret < 0)
+- printk(KERN_ERR
+- "%s: set_mib (listen_interval) failed: %d\n",
+- priv->netdev->name, ret);
++ wiphy_name(priv->hw->wiphy), ret);
+
+ return ret;
+ }
+@@ -980,7 +912,7 @@
+ ret = at76_set_mib(priv, &priv->mib_buf);
+ if (ret < 0)
+ printk(KERN_ERR "%s: set_mib (preamble) failed: %d\n",
+- priv->netdev->name, ret);
++ wiphy_name(priv->hw->wiphy), ret);
+
+ return ret;
+ }
+@@ -997,7 +929,7 @@
+ ret = at76_set_mib(priv, &priv->mib_buf);
+ if (ret < 0)
+ printk(KERN_ERR "%s: set_mib (frag threshold) failed: %d\n",
+- priv->netdev->name, ret);
++ wiphy_name(priv->hw->wiphy), ret);
+
+ return ret;
+ }
+@@ -1014,7 +946,7 @@
+ ret = at76_set_mib(priv, &priv->mib_buf);
+ if (ret < 0)
+ printk(KERN_ERR "%s: set_mib (rts) failed: %d\n",
+- priv->netdev->name, ret);
++ wiphy_name(priv->hw->wiphy), ret);
+
+ return ret;
+ }
+@@ -1031,24 +963,41 @@
+ ret = at76_set_mib(priv, &priv->mib_buf);
+ if (ret < 0)
+ printk(KERN_ERR "%s: set_mib (autorate fallback) failed: %d\n",
+- priv->netdev->name, ret);
++ wiphy_name(priv->hw->wiphy), ret);
+
+ return ret;
+ }
+
+-static int at76_add_mac_address(struct at76_priv *priv, void *addr)
++static int at76_set_tkip_bssid(struct at76_priv *priv, const void *addr)
+ {
+ int ret = 0;
+
+- priv->mib_buf.type = MIB_MAC_ADDR;
++ priv->mib_buf.type = MIB_MAC_ENCRYPTION;
+ priv->mib_buf.size = ETH_ALEN;
+- priv->mib_buf.index = offsetof(struct mib_mac_addr, mac_addr);
++ priv->mib_buf.index = offsetof(struct mib_mac_encryption, tkip_bssid);
+ memcpy(priv->mib_buf.data.addr, addr, ETH_ALEN);
+
+ ret = at76_set_mib(priv, &priv->mib_buf);
+ if (ret < 0)
+- printk(KERN_ERR "%s: set_mib (MAC_ADDR, mac_addr) failed: %d\n",
+- priv->netdev->name, ret);
++ printk(KERN_ERR "%s: set_mib (MAC_ENCRYPTION, tkip_bssid) failed: %d\n",
++ wiphy_name(priv->hw->wiphy), ret);
++
++ return ret;
++}
++
++static int at76_reset_rsc(struct at76_priv *priv)
++{
++ int ret = 0;
++
++ priv->mib_buf.type = MIB_MAC_ENCRYPTION;
++ priv->mib_buf.size = 4 * 8;
++ priv->mib_buf.index = offsetof(struct mib_mac_encryption, key_rsc);
++ memset(priv->mib_buf.data.data, 0 , priv->mib_buf.size);
++
++ ret = at76_set_mib(priv, &priv->mib_buf);
++ if (ret < 0)
++ printk(KERN_ERR "%s: set_mib (MAC_ENCRYPTION, key_rsc) failed: %d\n",
++ wiphy_name(priv->hw->wiphy), ret);
+
+ return ret;
+ }
+@@ -1067,16 +1016,16 @@
+ sizeof(struct mib_mac_addr));
+ if (ret < 0) {
+ printk(KERN_ERR "%s: at76_get_mib (MAC_ADDR) failed: %d\n",
+- priv->netdev->name, ret);
++ wiphy_name(priv->hw->wiphy), ret);
+ goto exit;
+ }
+
+ at76_dbg(DBG_MIB, "%s: MIB MAC_ADDR: mac_addr %s res 0x%x 0x%x",
+- priv->netdev->name,
++ wiphy_name(priv->hw->wiphy),
+ mac2str(m->mac_addr), m->res[0], m->res[1]);
+ for (i = 0; i < ARRAY_SIZE(m->group_addr); i++)
+ at76_dbg(DBG_MIB, "%s: MIB MAC_ADDR: group addr %d: %s, "
+- "status %d", priv->netdev->name, i,
++ "status %d", wiphy_name(priv->hw->wiphy), i,
+ mac2str(m->group_addr[i]), m->group_addr_status[i]);
+ exit:
+ kfree(m);
+@@ -1096,13 +1045,13 @@
+ sizeof(struct mib_mac_wep));
+ if (ret < 0) {
+ printk(KERN_ERR "%s: at76_get_mib (MAC_WEP) failed: %d\n",
+- priv->netdev->name, ret);
++ wiphy_name(priv->hw->wiphy), ret);
+ goto exit;
+ }
+
+ at76_dbg(DBG_MIB, "%s: MIB MAC_WEP: priv_invoked %u def_key_id %u "
+ "key_len %u excl_unencr %u wep_icv_err %u wep_excluded %u "
+- "encr_level %u key %d", priv->netdev->name,
++ "encr_level %u key %d", wiphy_name(priv->hw->wiphy),
+ m->privacy_invoked, m->wep_default_key_id,
+ m->wep_key_mapping_len, m->exclude_unencrypted,
+ le32_to_cpu(m->wep_icv_error_count),
+@@ -1114,12 +1063,55 @@
+
+ for (i = 0; i < WEP_KEYS; i++)
+ at76_dbg(DBG_MIB, "%s: MIB MAC_WEP: key %d: %s",
+- priv->netdev->name, i,
++ wiphy_name(priv->hw->wiphy), i,
+ hex2str(m->wep_default_keyvalue[i], key_len));
+ exit:
+ kfree(m);
+ }
+
++static void at76_dump_mib_mac_encryption(struct at76_priv *priv)
++{
++ int i;
++ int ret;
++ /*int key_len;*/
++ struct mib_mac_encryption *m;
++
++ m = kmalloc(sizeof(struct mib_mac_encryption), GFP_KERNEL);
++ if (!m)
++ return;
++
++ ret = at76_get_mib(priv->udev, MIB_MAC_ENCRYPTION, m,
++ sizeof(struct mib_mac_encryption));
++ if (ret < 0) {
++ dev_err(&priv->udev->dev,
++ "%s: at76_get_mib (MAC_ENCRYPTION) failed: %d\n",
++ wiphy_name(priv->hw->wiphy), ret);
++ goto exit;
++ }
++
++ at76_dbg(DBG_MIB,
++ "%s: MIB MAC_ENCRYPTION: tkip_bssid %s priv_invoked %u "
++ "ciph_key_id %u grp_key_id %u excl_unencr %u "
++ "ckip_key_perm %u wep_icv_err %u wep_excluded %u",
++ wiphy_name(priv->hw->wiphy), mac2str(m->tkip_bssid),
++ m->privacy_invoked, m->cipher_default_key_id,
++ m->cipher_default_group_key_id, m->exclude_unencrypted,
++ m->ckip_key_permutation,
++ le32_to_cpu(m->wep_icv_error_count),
++ le32_to_cpu(m->wep_excluded_count));
++
++ /*key_len = (m->encryption_level == 1) ?
++ WEP_SMALL_KEY_LEN : WEP_LARGE_KEY_LEN;*/
++
++ for (i = 0; i < CIPHER_KEYS; i++)
++ at76_dbg(DBG_MIB, "%s: MIB MAC_ENCRYPTION: key %d: %s",
++ wiphy_name(priv->hw->wiphy), i,
++ hex2str(m->cipher_default_keyvalue[i],
++ CIPHER_KEY_LEN));
++exit:
++ kfree(m);
++}
++
+ static void at76_dump_mib_mac_mgmt(struct at76_priv *priv)
+ {
+ int ret;
+@@ -1133,7 +1125,7 @@
+ sizeof(struct mib_mac_mgmt));
+ if (ret < 0) {
+ printk(KERN_ERR "%s: at76_get_mib (MAC_MGMT) failed: %d\n",
+- priv->netdev->name, ret);
++ wiphy_name(priv->hw->wiphy), ret);
+ goto exit;
+ }
+
+@@ -1144,7 +1136,7 @@
+ "pm_mode %d ibss_change %d res %d "
+ "multi_domain_capability_implemented %d "
+ "international_roaming %d country_string %.3s",
+- priv->netdev->name, le16_to_cpu(m->beacon_period),
++ wiphy_name(priv->hw->wiphy), le16_to_cpu(m->beacon_period),
+ le16_to_cpu(m->CFP_max_duration),
+ le16_to_cpu(m->medium_occupancy_limit),
+ le16_to_cpu(m->station_id), le16_to_cpu(m->ATIM_window),
+@@ -1169,7 +1161,7 @@
+ ret = at76_get_mib(priv->udev, MIB_MAC, m, sizeof(struct mib_mac));
+ if (ret < 0) {
+ printk(KERN_ERR "%s: at76_get_mib (MAC) failed: %d\n",
+- priv->netdev->name, ret);
++ wiphy_name(priv->hw->wiphy), ret);
+ goto exit;
+ }
+
+@@ -1179,7 +1171,8 @@
+ "scan_type %d scan_channel %d probe_delay %u "
+ "min_channel_time %d max_channel_time %d listen_int %d "
+ "desired_ssid %s desired_bssid %s desired_bsstype %d",
+- priv->netdev->name, le32_to_cpu(m->max_tx_msdu_lifetime),
++ wiphy_name(priv->hw->wiphy),
++ le32_to_cpu(m->max_tx_msdu_lifetime),
+ le32_to_cpu(m->max_rx_lifetime),
+ le16_to_cpu(m->frag_threshold), le16_to_cpu(m->rts_threshold),
+ le16_to_cpu(m->cwmin), le16_to_cpu(m->cwmax),
+@@ -1205,7 +1198,7 @@
+ ret = at76_get_mib(priv->udev, MIB_PHY, m, sizeof(struct mib_phy));
+ if (ret < 0) {
+ printk(KERN_ERR "%s: at76_get_mib (PHY) failed: %d\n",
+- priv->netdev->name, ret);
++ wiphy_name(priv->hw->wiphy), ret);
+ goto exit;
+ }
+
+@@ -1214,7 +1207,7 @@
+ "mpdu_max_length %d cca_mode_supported %d operation_rate_set "
+ "0x%x 0x%x 0x%x 0x%x channel_id %d current_cca_mode %d "
+ "phy_type %d current_reg_domain %d",
+- priv->netdev->name, le32_to_cpu(m->ed_threshold),
++ wiphy_name(priv->hw->wiphy), le32_to_cpu(m->ed_threshold),
+ le16_to_cpu(m->slot_time), le16_to_cpu(m->sifs_time),
+ le16_to_cpu(m->preamble_length),
+ le16_to_cpu(m->plcp_header_length),
+@@ -1238,13 +1231,14 @@
+ ret = at76_get_mib(priv->udev, MIB_LOCAL, m, sizeof(struct mib_local));
+ if (ret < 0) {
+ printk(KERN_ERR "%s: at76_get_mib (LOCAL) failed: %d\n",
+- priv->netdev->name, ret);
++ wiphy_name(priv->hw->wiphy), ret);
+ goto exit;
+ }
+
+ at76_dbg(DBG_MIB, "%s: MIB LOCAL: beacon_enable %d "
+ "txautorate_fallback %d ssid_size %d promiscuous_mode %d "
+- "preamble_type %d", priv->netdev->name, m->beacon_enable,
++ "preamble_type %d", wiphy_name(priv->hw->wiphy),
++ m->beacon_enable,
+ m->txautorate_fallback, m->ssid_size, m->promiscuous_mode,
+ m->preamble_type);
+ exit:
+@@ -1263,118 +1257,21 @@
+ sizeof(struct mib_mdomain));
+ if (ret < 0) {
+ printk(KERN_ERR "%s: at76_get_mib (MDOMAIN) failed: %d\n",
+- priv->netdev->name, ret);
++ wiphy_name(priv->hw->wiphy), ret);
+ goto exit;
+ }
+
+ at76_dbg(DBG_MIB, "%s: MIB MDOMAIN: channel_list %s",
+- priv->netdev->name,
++ wiphy_name(priv->hw->wiphy),
+ hex2str(m->channel_list, sizeof(m->channel_list)));
+
+ at76_dbg(DBG_MIB, "%s: MIB MDOMAIN: tx_powerlevel %s",
+- priv->netdev->name,
++ wiphy_name(priv->hw->wiphy),
+ hex2str(m->tx_powerlevel, sizeof(m->tx_powerlevel)));
+ exit:
+ kfree(m);
+ }
+
+-static int at76_get_current_bssid(struct at76_priv *priv)
+-{
+- int ret = 0;
+- struct mib_mac_mgmt *mac_mgmt =
+- kmalloc(sizeof(struct mib_mac_mgmt), GFP_KERNEL);
+-
+- if (!mac_mgmt) {
+- ret = -ENOMEM;
+- goto exit;
+- }
+-
+- ret = at76_get_mib(priv->udev, MIB_MAC_MGMT, mac_mgmt,
+- sizeof(struct mib_mac_mgmt));
+- if (ret < 0) {
+- printk(KERN_ERR "%s: at76_get_mib failed: %d\n",
+- priv->netdev->name, ret);
+- goto error;
+- }
+- memcpy(priv->bssid, mac_mgmt->current_bssid, ETH_ALEN);
+- printk(KERN_INFO "%s: using BSSID %s\n", priv->netdev->name,
+- mac2str(priv->bssid));
+-error:
+- kfree(mac_mgmt);
+-exit:
+- return ret;
+-}
+-
+-static int at76_get_current_channel(struct at76_priv *priv)
+-{
+- int ret = 0;
+- struct mib_phy *phy = kmalloc(sizeof(struct mib_phy), GFP_KERNEL);
+-
+- if (!phy) {
+- ret = -ENOMEM;
+- goto exit;
+- }
+- ret = at76_get_mib(priv->udev, MIB_PHY, phy, sizeof(struct mib_phy));
+- if (ret < 0) {
+- printk(KERN_ERR "%s: at76_get_mib(MIB_PHY) failed: %d\n",
+- priv->netdev->name, ret);
+- goto error;
+- }
+- priv->channel = phy->channel_id;
+-error:
+- kfree(phy);
+-exit:
+- return ret;
+-}
+-
+-/**
+- * at76_start_scan - start a scan
+- *
+- * @use_essid - use the configured ESSID in non passive mode
+- */
+-static int at76_start_scan(struct at76_priv *priv, int use_essid)
+-{
+- struct at76_req_scan scan;
+-
+- memset(&scan, 0, sizeof(struct at76_req_scan));
+- memset(scan.bssid, 0xff, ETH_ALEN);
+-
+- if (use_essid) {
+- memcpy(scan.essid, priv->essid, IW_ESSID_MAX_SIZE);
+- scan.essid_size = priv->essid_size;
+- } else
+- scan.essid_size = 0;
+-
+- /* jal: why should we start at a certain channel? we do scan the whole
+- range allowed by reg domain. */
+- scan.channel = priv->channel;
+-
+- /* atmelwlandriver differs between scan type 0 and 1 (active/passive)
+- For ad-hoc mode, it uses type 0 only. */
+- scan.scan_type = priv->scan_mode;
+-
+- /* INFO: For probe_delay, not multiplying by 1024 as this will be
+- slightly less than min_channel_time
+- (per spec: probe delay < min. channel time) */
+- scan.min_channel_time = cpu_to_le16(priv->scan_min_time);
+- scan.max_channel_time = cpu_to_le16(priv->scan_max_time);
+- scan.probe_delay = cpu_to_le16(priv->scan_min_time * 1000);
+- scan.international_scan = 0;
+-
+- /* other values are set to 0 for type 0 */
+-
+- at76_dbg(DBG_PROGRESS, "%s: start_scan (use_essid = %d, intl = %d, "
+- "channel = %d, probe_delay = %d, scan_min_time = %d, "
+- "scan_max_time = %d)",
+- priv->netdev->name, use_essid,
+- scan.international_scan, scan.channel,
+- le16_to_cpu(scan.probe_delay),
+- le16_to_cpu(scan.min_channel_time),
+- le16_to_cpu(scan.max_channel_time));
+-
+- return at76_set_card_command(priv->udev, CMD_SCAN, &scan, sizeof(scan));
+-}
+-
+ /* Enable monitor mode */
+ static int at76_start_monitor(struct at76_priv *priv)
+ {
+@@ -1395,86 +1292,6 @@
+ return ret;
+ }
+
+-static int at76_start_ibss(struct at76_priv *priv)
+-{
+- struct at76_req_ibss bss;
+- int ret;
+-
+- WARN_ON(priv->mac_state != MAC_OWN_IBSS);
+- if (priv->mac_state != MAC_OWN_IBSS)
+- return -EBUSY;
+-
+- memset(&bss, 0, sizeof(struct at76_req_ibss));
+- memset(bss.bssid, 0xff, ETH_ALEN);
+- memcpy(bss.essid, priv->essid, IW_ESSID_MAX_SIZE);
+- bss.essid_size = priv->essid_size;
+- bss.bss_type = ADHOC_MODE;
+- bss.channel = priv->channel;
+-
+- ret = at76_set_card_command(priv->udev, CMD_START_IBSS, &bss,
+- sizeof(struct at76_req_ibss));
+- if (ret < 0) {
+- printk(KERN_ERR "%s: start_ibss failed: %d\n",
+- priv->netdev->name, ret);
+- return ret;
+- }
+-
+- ret = at76_wait_completion(priv, CMD_START_IBSS);
+- if (ret != CMD_STATUS_COMPLETE) {
+- printk(KERN_ERR "%s: start_ibss failed to complete, %d\n",
+- priv->netdev->name, ret);
+- return ret;
+- }
+-
+- ret = at76_get_current_bssid(priv);
+- if (ret < 0)
+- return ret;
+-
+- ret = at76_get_current_channel(priv);
+- if (ret < 0)
+- return ret;
+-
+- /* not sure what this is good for ??? */
+- priv->mib_buf.type = MIB_MAC_MGMT;
+- priv->mib_buf.size = 1;
+- priv->mib_buf.index = offsetof(struct mib_mac_mgmt, ibss_change);
+- priv->mib_buf.data.byte = 0;
+-
+- ret = at76_set_mib(priv, &priv->mib_buf);
+- if (ret < 0) {
+- printk(KERN_ERR "%s: set_mib (ibss change ok) failed: %d\n",
+- priv->netdev->name, ret);
+- return ret;
+- }
+-
+- netif_carrier_on(priv->netdev);
+- netif_start_queue(priv->netdev);
+- return 0;
+-}
+-
+-/* Request card to join BSS in managed or ad-hoc mode */
+-static int at76_join_bss(struct at76_priv *priv, struct bss_info *ptr)
+-{
+- struct at76_req_join join;
+-
+- BUG_ON(!ptr);
+-
+- memset(&join, 0, sizeof(struct at76_req_join));
+- memcpy(join.bssid, ptr->bssid, ETH_ALEN);
+- memcpy(join.essid, ptr->ssid, ptr->ssid_len);
+- join.essid_size = ptr->ssid_len;
+- join.bss_type = (priv->iw_mode == IW_MODE_ADHOC ? 1 : 2);
+- join.channel = ptr->channel;
+- join.timeout = cpu_to_le16(2000);
+-
+- at76_dbg(DBG_PROGRESS,
+- "%s join addr %s ssid %s type %d ch %d timeout %d",
+- priv->netdev->name, mac2str(join.bssid), join.essid,
+- join.bss_type, join.channel, le16_to_cpu(join.timeout));
+- return at76_set_card_command(priv->udev, CMD_JOIN, &join,
+- sizeof(struct at76_req_join));
+-}
+-
+ /* Calculate padding from txbuf->wlength (which excludes the USB TX header),
+ likely to compensate a flaw in the AT76C503A USB part ... */
+ static inline int at76_calc_padding(int wlen)
+@@ -1493,14 +1310,6 @@
+ return 0;
+ }
+
+-/* We are doing a lot of things here in an interrupt. Need
+- a bh handler (Watching TV with a TV card is probably
+- a good test: if you see flickers, we are doing too much.
+- Currently I do see flickers... even with our tasklet :-( )
+- Maybe because the bttv driver and usb-uhci use the same interrupt
+-*/
+-/* Or maybe because our BH handler is preempting bttv's BH handler.. BHs don't
+- * solve everything.. (alex) */
+ static void at76_rx_callback(struct urb *urb)
+ {
+ struct at76_priv *priv = urb->context;
+@@ -1510,1914 +1319,70 @@
+ return;
+ }
+
+-static void at76_tx_callback(struct urb *urb)
++static int at76_submit_rx_urb(struct at76_priv *priv)
+ {
+- struct at76_priv *priv = urb->context;
+- struct net_device_stats *stats = &priv->stats;
+- unsigned long flags;
+- struct at76_tx_buffer *mgmt_buf;
+ int ret;
++ int size;
++ struct sk_buff *skb = priv->rx_skb;
+
+- switch (urb->status) {
+- case 0:
+- stats->tx_packets++;
+- break;
+- case -ENOENT:
+- case -ECONNRESET:
+- /* urb has been unlinked */
+- return;
+- default:
+- at76_dbg(DBG_URB, "%s - nonzero tx status received: %d",
+- __func__, urb->status);
+- stats->tx_errors++;
+- break;
++ if (!priv->rx_urb) {
++ printk(KERN_ERR "%s: %s: priv->rx_urb is NULL\n",
++ wiphy_name(priv->hw->wiphy), __func__);
++ return -EFAULT;
+ }
+
+- spin_lock_irqsave(&priv->mgmt_spinlock, flags);
+- mgmt_buf = priv->next_mgmt_bulk;
+- priv->next_mgmt_bulk = NULL;
+- spin_unlock_irqrestore(&priv->mgmt_spinlock, flags);
++ if (!skb) {
++ skb = dev_alloc_skb(sizeof(struct at76_rx_buffer));
++ if (!skb) {
++ printk(KERN_ERR "%s: cannot allocate rx skbuff\n",
++ wiphy_name(priv->hw->wiphy));
++ ret = -ENOMEM;
++ goto exit;
++ }
++ priv->rx_skb = skb;
++ } else {
++ skb_push(skb, skb_headroom(skb));
++ skb_trim(skb, 0);
++ }
+
+- if (!mgmt_buf) {
+- netif_wake_queue(priv->netdev);
+- return;
++ size = skb_tailroom(skb);
++ usb_fill_bulk_urb(priv->rx_urb, priv->udev, priv->rx_pipe,
++ skb_put(skb, size), size, at76_rx_callback, priv);
++ ret = usb_submit_urb(priv->rx_urb, GFP_ATOMIC);
++ if (ret < 0) {
++ if (ret == -ENODEV)
++ at76_dbg(DBG_DEVSTART,
++ "usb_submit_urb returned -ENODEV");
++ else
++ printk(KERN_ERR "%s: rx, usb_submit_urb failed: %d\n",
++ wiphy_name(priv->hw->wiphy), ret);
+ }
+
+- /* we don't copy the padding bytes, but add them
+- to the length */
+- memcpy(priv->bulk_out_buffer, mgmt_buf,
+- le16_to_cpu(mgmt_buf->wlength) + AT76_TX_HDRLEN);
+- usb_fill_bulk_urb(priv->tx_urb, priv->udev, priv->tx_pipe,
+- priv->bulk_out_buffer,
+- le16_to_cpu(mgmt_buf->wlength) + mgmt_buf->padding +
+- AT76_TX_HDRLEN, at76_tx_callback, priv);
+- ret = usb_submit_urb(priv->tx_urb, GFP_ATOMIC);
+- if (ret)
+- printk(KERN_ERR "%s: error in tx submit urb: %d\n",
+- priv->netdev->name, ret);
++exit:
++ if (ret < 0 && ret != -ENODEV)
++ printk(KERN_ERR "%s: cannot submit rx urb - please unload the "
++ "driver and/or power cycle the device\n",
++ wiphy_name(priv->hw->wiphy));
+
+- kfree(mgmt_buf);
++ return ret;
+ }
+
+-/* Send a management frame on bulk-out. txbuf->wlength must be set */
+-static int at76_tx_mgmt(struct at76_priv *priv, struct at76_tx_buffer *txbuf)
++/* Download external firmware */
++static int at76_load_external_fw(struct usb_device *udev, struct fwentry *fwe)
+ {
+- unsigned long flags;
+ int ret;
+- int urb_status;
+- void *oldbuf = NULL;
+-
+- netif_carrier_off(priv->netdev); /* stop netdev watchdog */
+- netif_stop_queue(priv->netdev); /* stop tx data packets */
++ int op_mode;
++ int blockno = 0;
++ int bsize;
++ u8 *block;
++ u8 *buf = fwe->extfw;
++ int size = fwe->extfw_size;
+
+- spin_lock_irqsave(&priv->mgmt_spinlock, flags);
++ if (!buf || !size)
++ return -ENOENT;
+
+- urb_status = priv->tx_urb->status;
+- if (urb_status == -EINPROGRESS) {
+- /* cannot transmit now, put in the queue */
+- oldbuf = priv->next_mgmt_bulk;
+- priv->next_mgmt_bulk = txbuf;
+- }
+- spin_unlock_irqrestore(&priv->mgmt_spinlock, flags);
+-
+- if (oldbuf) {
+- /* a data/mgmt tx is already pending in the URB -
+- if this is no error in some situations we must
+- implement a queue or silently modify the old msg */
+- printk(KERN_ERR "%s: removed pending mgmt buffer %s\n",
+- priv->netdev->name, hex2str(oldbuf, 64));
+- kfree(oldbuf);
+- return 0;
+- }
+-
+- txbuf->tx_rate = TX_RATE_1MBIT;
+- txbuf->padding = at76_calc_padding(le16_to_cpu(txbuf->wlength));
+- memset(txbuf->reserved, 0, sizeof(txbuf->reserved));
+-
+- if (priv->next_mgmt_bulk)
+- printk(KERN_ERR "%s: URB status %d, but mgmt is pending\n",
+- priv->netdev->name, urb_status);
+-
+- at76_dbg(DBG_TX_MGMT,
+- "%s: tx mgmt: wlen %d tx_rate %d pad %d %s",
+- priv->netdev->name, le16_to_cpu(txbuf->wlength),
+- txbuf->tx_rate, txbuf->padding,
+- hex2str(txbuf->packet, le16_to_cpu(txbuf->wlength)));
+-
+- /* txbuf was not consumed above -> send mgmt msg immediately */
+- memcpy(priv->bulk_out_buffer, txbuf,
+- le16_to_cpu(txbuf->wlength) + AT76_TX_HDRLEN);
+- usb_fill_bulk_urb(priv->tx_urb, priv->udev, priv->tx_pipe,
+- priv->bulk_out_buffer,
+- le16_to_cpu(txbuf->wlength) + txbuf->padding +
+- AT76_TX_HDRLEN, at76_tx_callback, priv);
+- ret = usb_submit_urb(priv->tx_urb, GFP_ATOMIC);
+- if (ret)
+- printk(KERN_ERR "%s: error in tx submit urb: %d\n",
+- priv->netdev->name, ret);
+-
+- kfree(txbuf);
+-
+- return ret;
+-}
+-
+-/* Go to the next information element */
+-static inline void next_ie(struct ieee80211_info_element **ie)
+-{
+- *ie = (struct ieee80211_info_element *)(&(*ie)->data[(*ie)->len]);
+-}
+-
+-/* Challenge is the challenge string (in TLV format)
+- we got with seq_nr 2 for shared secret authentication only and
+- send in seq_nr 3 WEP encrypted to prove we have the correct WEP key;
+- otherwise it is NULL */
+-static int at76_auth_req(struct at76_priv *priv, struct bss_info *bss,
+- int seq_nr, struct ieee80211_info_element *challenge)
+-{
+- struct at76_tx_buffer *tx_buffer;
+- struct ieee80211_hdr_3addr *mgmt;
+- struct ieee80211_auth *req;
+- int buf_len = (seq_nr != 3 ? AUTH_FRAME_SIZE :
+- AUTH_FRAME_SIZE + 1 + 1 + challenge->len);
+-
+- BUG_ON(!bss);
+- BUG_ON(seq_nr == 3 && !challenge);
+- tx_buffer = kmalloc(buf_len + MAX_PADDING_SIZE, GFP_ATOMIC);
+- if (!tx_buffer)
+- return -ENOMEM;
+-
+- req = (struct ieee80211_auth *)tx_buffer->packet;
+- mgmt = &req->header;
+-
+- /* make wireless header */
+- /* first auth msg is not encrypted, only the second (seq_nr == 3) */
+- mgmt->frame_ctl =
+- cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_AUTH |
+- (seq_nr == 3 ? IEEE80211_FCTL_PROTECTED : 0));
+-
+- mgmt->duration_id = cpu_to_le16(0x8000);
+- memcpy(mgmt->addr1, bss->bssid, ETH_ALEN);
+- memcpy(mgmt->addr2, priv->netdev->dev_addr, ETH_ALEN);
+- memcpy(mgmt->addr3, bss->bssid, ETH_ALEN);
+- mgmt->seq_ctl = cpu_to_le16(0);
+-
+- req->algorithm = cpu_to_le16(priv->auth_mode);
+- req->transaction = cpu_to_le16(seq_nr);
+- req->status = cpu_to_le16(0);
+-
+- if (seq_nr == 3)
+- memcpy(req->info_element, challenge, 1 + 1 + challenge->len);
+-
+- /* init. at76_priv tx header */
+- tx_buffer->wlength = cpu_to_le16(buf_len - AT76_TX_HDRLEN);
+- at76_dbg(DBG_TX_MGMT, "%s: AuthReq bssid %s alg %d seq_nr %d",
+- priv->netdev->name, mac2str(mgmt->addr3),
+- le16_to_cpu(req->algorithm), le16_to_cpu(req->transaction));
+- if (seq_nr == 3)
+- at76_dbg(DBG_TX_MGMT, "%s: AuthReq challenge: %s ...",
+- priv->netdev->name, hex2str(req->info_element, 18));
+-
+- /* either send immediately (if no data tx is pending
+- or put it in pending list */
+- return at76_tx_mgmt(priv, tx_buffer);
+-}
+-
+-static int at76_assoc_req(struct at76_priv *priv, struct bss_info *bss)
+-{
+- struct at76_tx_buffer *tx_buffer;
+- struct ieee80211_hdr_3addr *mgmt;
+- struct ieee80211_assoc_request *req;
+- struct ieee80211_info_element *ie;
+- char *essid;
+- int essid_len;
+- u16 capa;
+-
+- BUG_ON(!bss);
+-
+- tx_buffer = kmalloc(ASSOCREQ_MAX_SIZE + MAX_PADDING_SIZE, GFP_ATOMIC);
+- if (!tx_buffer)
+- return -ENOMEM;
+-
+- req = (struct ieee80211_assoc_request *)tx_buffer->packet;
+- mgmt = &req->header;
+- ie = req->info_element;
+-
+- /* make wireless header */
+- mgmt->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_MGMT |
+- IEEE80211_STYPE_ASSOC_REQ);
+-
+- mgmt->duration_id = cpu_to_le16(0x8000);
+- memcpy(mgmt->addr1, bss->bssid, ETH_ALEN);
+- memcpy(mgmt->addr2, priv->netdev->dev_addr, ETH_ALEN);
+- memcpy(mgmt->addr3, bss->bssid, ETH_ALEN);
+- mgmt->seq_ctl = cpu_to_le16(0);
+-
+- /* we must set the Privacy bit in the capabilities to assure an
+- Agere-based AP with optional WEP transmits encrypted frames
+- to us. AP only set the Privacy bit in their capabilities
+- if WEP is mandatory in the BSS! */
+- capa = bss->capa;
+- if (priv->wep_enabled)
+- capa |= WLAN_CAPABILITY_PRIVACY;
+- if (priv->preamble_type != PREAMBLE_TYPE_LONG)
+- capa |= WLAN_CAPABILITY_SHORT_PREAMBLE;
+- req->capability = cpu_to_le16(capa);
+-
+- req->listen_interval = cpu_to_le16(2 * bss->beacon_interval);
+-
+- /* write TLV data elements */
+-
+- ie->id = MFIE_TYPE_SSID;
+- ie->len = bss->ssid_len;
+- memcpy(ie->data, bss->ssid, bss->ssid_len);
+- next_ie(&ie);
+-
+- ie->id = MFIE_TYPE_RATES;
+- ie->len = sizeof(hw_rates);
+- memcpy(ie->data, hw_rates, sizeof(hw_rates));
+- next_ie(&ie); /* ie points behind the supp_rates field */
+-
+- /* init. at76_priv tx header */
+- tx_buffer->wlength = cpu_to_le16((u8 *)ie - (u8 *)mgmt);
+-
+- ie = req->info_element;
+- essid = ie->data;
+- essid_len = min_t(int, IW_ESSID_MAX_SIZE, ie->len);
+-
+- next_ie(&ie); /* points to IE of rates now */
+- at76_dbg(DBG_TX_MGMT,
+- "%s: AssocReq bssid %s capa 0x%04x ssid %.*s rates %s",
+- priv->netdev->name, mac2str(mgmt->addr3),
+- le16_to_cpu(req->capability), essid_len, essid,
+- hex2str(ie->data, ie->len));
+-
+- /* either send immediately (if no data tx is pending
+- or put it in pending list */
+- return at76_tx_mgmt(priv, tx_buffer);
+-}
+-
+-/* We got to check the bss_list for old entries */
+-static void at76_bss_list_timeout(unsigned long par)
+-{
+- struct at76_priv *priv = (struct at76_priv *)par;
+- unsigned long flags;
+- struct list_head *lptr, *nptr;
+- struct bss_info *ptr;
+-
+- spin_lock_irqsave(&priv->bss_list_spinlock, flags);
+-
+- list_for_each_safe(lptr, nptr, &priv->bss_list) {
+-
+- ptr = list_entry(lptr, struct bss_info, list);
+-
+- if (ptr != priv->curr_bss
+- && time_after(jiffies, ptr->last_rx + BSS_LIST_TIMEOUT)) {
+- at76_dbg(DBG_BSS_TABLE_RM,
+- "%s: bss_list: removing old BSS %s ch %d",
+- priv->netdev->name, mac2str(ptr->bssid),
+- ptr->channel);
+- list_del(&ptr->list);
+- kfree(ptr);
+- }
+- }
+- spin_unlock_irqrestore(&priv->bss_list_spinlock, flags);
+- /* restart the timer */
+- mod_timer(&priv->bss_list_timer, jiffies + BSS_LIST_TIMEOUT);
+-}
+-
+-static inline void at76_set_mac_state(struct at76_priv *priv,
+- enum mac_state mac_state)
+-{
+- at76_dbg(DBG_MAC_STATE, "%s state: %s", priv->netdev->name,
+- mac_states[mac_state]);
+- priv->mac_state = mac_state;
+-}
+-
+-static void at76_dump_bss_table(struct at76_priv *priv)
+-{
+- struct bss_info *ptr;
+- unsigned long flags;
+- struct list_head *lptr;
+-
+- spin_lock_irqsave(&priv->bss_list_spinlock, flags);
+-
+- at76_dbg(DBG_BSS_TABLE, "%s BSS table (curr=%p):", priv->netdev->name,
+- priv->curr_bss);
+-
+- list_for_each(lptr, &priv->bss_list) {
+- ptr = list_entry(lptr, struct bss_info, list);
+- at76_dbg(DBG_BSS_TABLE, "0x%p: bssid %s channel %d ssid %.*s "
+- "(%s) capa 0x%04x rates %s rssi %d link %d noise %d",
+- ptr, mac2str(ptr->bssid), ptr->channel, ptr->ssid_len,
+- ptr->ssid, hex2str(ptr->ssid, ptr->ssid_len),
+- ptr->capa, hex2str(ptr->rates, ptr->rates_len),
+- ptr->rssi, ptr->link_qual, ptr->noise_level);
+- }
+- spin_unlock_irqrestore(&priv->bss_list_spinlock, flags);
+-}
+-
+-/* Called upon successful association to mark interface as connected */
+-static void at76_work_assoc_done(struct work_struct *work)
+-{
+- struct at76_priv *priv = container_of(work, struct at76_priv,
+- work_assoc_done);
+-
+- mutex_lock(&priv->mtx);
+-
+- WARN_ON(priv->mac_state != MAC_ASSOC);
+- WARN_ON(!priv->curr_bss);
+- if (priv->mac_state != MAC_ASSOC || !priv->curr_bss)
+- goto exit;
+-
+- if (priv->iw_mode == IW_MODE_INFRA) {
+- if (priv->pm_mode != AT76_PM_OFF) {
+- /* calculate the listen interval in units of
+- beacon intervals of the curr_bss */
+- u32 pm_period_beacon = (priv->pm_period >> 10) /
+- priv->curr_bss->beacon_interval;
+-
+- pm_period_beacon = max(pm_period_beacon, 2u);
+- pm_period_beacon = min(pm_period_beacon, 0xffffu);
+-
+- at76_dbg(DBG_PM,
+- "%s: pm_mode %d assoc id 0x%x listen int %d",
+- priv->netdev->name, priv->pm_mode,
+- priv->assoc_id, pm_period_beacon);
+-
+- at76_set_associd(priv, priv->assoc_id);
+- at76_set_listen_interval(priv, (u16)pm_period_beacon);
+- }
+- schedule_delayed_work(&priv->dwork_beacon, BEACON_TIMEOUT);
+- }
+- at76_set_pm_mode(priv);
+-
+- netif_carrier_on(priv->netdev);
+- netif_wake_queue(priv->netdev);
+- at76_set_mac_state(priv, MAC_CONNECTED);
+- at76_iwevent_bss_connect(priv->netdev, priv->curr_bss->bssid);
+- at76_dbg(DBG_PROGRESS, "%s: connected to BSSID %s",
+- priv->netdev->name, mac2str(priv->curr_bss->bssid));
+-
+-exit:
+- mutex_unlock(&priv->mtx);
+-}
+-
+-/* We only store the new mac address in netdev struct,
+- it gets set when the netdev is opened. */
+-static int at76_set_mac_address(struct net_device *netdev, void *addr)
+-{
+- struct sockaddr *mac = addr;
+- memcpy(netdev->dev_addr, mac->sa_data, ETH_ALEN);
+- return 1;
+-}
+-
+-static struct net_device_stats *at76_get_stats(struct net_device *netdev)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- return &priv->stats;
+-}
+-
+-static struct iw_statistics *at76_get_wireless_stats(struct net_device *netdev)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+-
+- at76_dbg(DBG_IOCTL, "RETURN qual %d level %d noise %d updated %d",
+- priv->wstats.qual.qual, priv->wstats.qual.level,
+- priv->wstats.qual.noise, priv->wstats.qual.updated);
+-
+- return &priv->wstats;
+-}
+-
+-static void at76_set_multicast(struct net_device *netdev)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- int promisc;
+-
+- promisc = ((netdev->flags & IFF_PROMISC) != 0);
+- if (promisc != priv->promisc) {
+- /* This gets called in interrupt, must reschedule */
+- priv->promisc = promisc;
+- schedule_work(&priv->work_set_promisc);
+- }
+-}
+-
+-/* Stop all network activity, flush all pending tasks */
+-static void at76_quiesce(struct at76_priv *priv)
+-{
+- unsigned long flags;
+-
+- netif_stop_queue(priv->netdev);
+- netif_carrier_off(priv->netdev);
+-
+- at76_set_mac_state(priv, MAC_INIT);
+-
+- cancel_delayed_work(&priv->dwork_get_scan);
+- cancel_delayed_work(&priv->dwork_beacon);
+- cancel_delayed_work(&priv->dwork_auth);
+- cancel_delayed_work(&priv->dwork_assoc);
+- cancel_delayed_work(&priv->dwork_restart);
+-
+- spin_lock_irqsave(&priv->mgmt_spinlock, flags);
+- kfree(priv->next_mgmt_bulk);
+- priv->next_mgmt_bulk = NULL;
+- spin_unlock_irqrestore(&priv->mgmt_spinlock, flags);
+-}
+-
+-/*******************************************************************************
+- * at76_priv implementations of iw_handler functions:
+- */
+-static int at76_iw_handler_commit(struct net_device *netdev,
+- struct iw_request_info *info,
+- void *null, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+-
+- at76_dbg(DBG_IOCTL, "%s %s: restarting the device", netdev->name,
+- __func__);
+-
+- if (priv->mac_state != MAC_INIT)
+- at76_quiesce(priv);
+-
+- /* Wait half second before the restart to process subsequent
+- * requests from the same iwconfig in a single restart */
+- schedule_delayed_work(&priv->dwork_restart, HZ / 2);
+-
+- return 0;
+-}
+-
+-static int at76_iw_handler_get_name(struct net_device *netdev,
+- struct iw_request_info *info,
+- char *name, char *extra)
+-{
+- strcpy(name, "IEEE 802.11b");
+- at76_dbg(DBG_IOCTL, "%s: SIOCGIWNAME - name %s", netdev->name, name);
+- return 0;
+-}
+-
+-static int at76_iw_handler_set_freq(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_freq *freq, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- int chan = -1;
+- int ret = -EIWCOMMIT;
+- at76_dbg(DBG_IOCTL, "%s: SIOCSIWFREQ - freq.m %d freq.e %d",
+- netdev->name, freq->m, freq->e);
+-
+- if ((freq->e == 0) && (freq->m <= 1000))
+- /* Setting by channel number */
+- chan = freq->m;
+- else {
+- /* Setting by frequency - search the table */
+- int mult = 1;
+- int i;
+-
+- for (i = 0; i < (6 - freq->e); i++)
+- mult *= 10;
+-
+- for (i = 0; i < NUM_CHANNELS; i++) {
+- if (freq->m == (channel_frequency[i] * mult))
+- chan = i + 1;
+- }
+- }
+-
+- if (chan < 1 || !priv->domain)
+- /* non-positive channels are invalid
+- * we need a domain info to set the channel
+- * either that or an invalid frequency was
+- * provided by the user */
+- ret = -EINVAL;
+- else if (!(priv->domain->channel_map & (1 << (chan - 1)))) {
+- printk(KERN_INFO "%s: channel %d not allowed for domain %s\n",
+- priv->netdev->name, chan, priv->domain->name);
+- ret = -EINVAL;
+- }
+-
+- if (ret == -EIWCOMMIT) {
+- priv->channel = chan;
+- at76_dbg(DBG_IOCTL, "%s: SIOCSIWFREQ - ch %d", netdev->name,
+- chan);
+- }
+-
+- return ret;
+-}
+-
+-static int at76_iw_handler_get_freq(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_freq *freq, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+-
+- freq->m = priv->channel;
+- freq->e = 0;
+-
+- if (priv->channel)
+- at76_dbg(DBG_IOCTL, "%s: SIOCGIWFREQ - freq %ld x 10e%d",
+- netdev->name, channel_frequency[priv->channel - 1], 6);
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCGIWFREQ - ch %d", netdev->name,
+- priv->channel);
+-
+- return 0;
+-}
+-
+-static int at76_iw_handler_set_mode(struct net_device *netdev,
+- struct iw_request_info *info,
+- __u32 *mode, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCSIWMODE - %d", netdev->name, *mode);
+-
+- if ((*mode != IW_MODE_ADHOC) && (*mode != IW_MODE_INFRA) &&
+- (*mode != IW_MODE_MONITOR))
+- return -EINVAL;
+-
+- priv->iw_mode = *mode;
+- if (priv->iw_mode != IW_MODE_INFRA)
+- priv->pm_mode = AT76_PM_OFF;
+-
+- return -EIWCOMMIT;
+-}
+-
+-static int at76_iw_handler_get_mode(struct net_device *netdev,
+- struct iw_request_info *info,
+- __u32 *mode, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+-
+- *mode = priv->iw_mode;
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCGIWMODE - %d", netdev->name, *mode);
+-
+- return 0;
+-}
+-
+-static int at76_iw_handler_get_range(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_point *data, char *extra)
+-{
+- /* inspired by atmel.c */
+- struct at76_priv *priv = netdev_priv(netdev);
+- struct iw_range *range = (struct iw_range *)extra;
+- int i;
+-
+- data->length = sizeof(struct iw_range);
+- memset(range, 0, sizeof(struct iw_range));
+-
+- /* TODO: range->throughput = xxxxxx; */
+-
+- range->min_nwid = 0x0000;
+- range->max_nwid = 0x0000;
+-
+- /* this driver doesn't maintain sensitivity information */
+- range->sensitivity = 0;
+-
+- range->max_qual.qual = 100;
+- range->max_qual.level = 100;
+- range->max_qual.noise = 0;
+- range->max_qual.updated = IW_QUAL_NOISE_INVALID;
+-
+- range->avg_qual.qual = 50;
+- range->avg_qual.level = 50;
+- range->avg_qual.noise = 0;
+- range->avg_qual.updated = IW_QUAL_NOISE_INVALID;
+-
+- range->bitrate[0] = 1000000;
+- range->bitrate[1] = 2000000;
+- range->bitrate[2] = 5500000;
+- range->bitrate[3] = 11000000;
+- range->num_bitrates = 4;
+-
+- range->min_rts = 0;
+- range->max_rts = MAX_RTS_THRESHOLD;
+-
+- range->min_frag = MIN_FRAG_THRESHOLD;
+- range->max_frag = MAX_FRAG_THRESHOLD;
+-
+- range->pmp_flags = IW_POWER_PERIOD;
+- range->pmt_flags = IW_POWER_ON;
+- range->pm_capa = IW_POWER_PERIOD | IW_POWER_ALL_R;
+-
+- range->encoding_size[0] = WEP_SMALL_KEY_LEN;
+- range->encoding_size[1] = WEP_LARGE_KEY_LEN;
+- range->num_encoding_sizes = 2;
+- range->max_encoding_tokens = WEP_KEYS;
+-
+- /* both WL-240U and Linksys WUSB11 v2.6 specify 15 dBm as output power
+- - take this for all (ignore antenna gains) */
+- range->txpower[0] = 15;
+- range->num_txpower = 1;
+- range->txpower_capa = IW_TXPOW_DBM;
+-
+- range->we_version_source = WIRELESS_EXT;
+- range->we_version_compiled = WIRELESS_EXT;
+-
+- /* same as the values used in atmel.c */
+- range->retry_capa = IW_RETRY_LIMIT;
+- range->retry_flags = IW_RETRY_LIMIT;
+- range->r_time_flags = 0;
+- range->min_retry = 1;
+- range->max_retry = 255;
+-
+- range->num_channels = NUM_CHANNELS;
+- range->num_frequency = 0;
+-
+- for (i = 0; i < NUM_CHANNELS; i++) {
+- /* test if channel map bit is raised */
+- if (priv->domain->channel_map & (0x1 << i)) {
+- range->num_frequency += 1;
+-
+- range->freq[i].i = i + 1;
+- range->freq[i].m = channel_frequency[i] * 100000;
+- range->freq[i].e = 1; /* freq * 10^1 */
+- }
+- }
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCGIWRANGE", netdev->name);
+-
+- return 0;
+-}
+-
+-static int at76_iw_handler_set_spy(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_point *data, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- int ret = 0;
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCSIWSPY - number of addresses %d",
+- netdev->name, data->length);
+-
+- spin_lock_bh(&priv->spy_spinlock);
+- ret = iw_handler_set_spy(priv->netdev, info, (union iwreq_data *)data,
+- extra);
+- spin_unlock_bh(&priv->spy_spinlock);
+-
+- return ret;
+-}
+-
+-static int at76_iw_handler_get_spy(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_point *data, char *extra)
+-{
+-
+- struct at76_priv *priv = netdev_priv(netdev);
+- int ret = 0;
+-
+- spin_lock_bh(&priv->spy_spinlock);
+- ret = iw_handler_get_spy(priv->netdev, info,
+- (union iwreq_data *)data, extra);
+- spin_unlock_bh(&priv->spy_spinlock);
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCGIWSPY - number of addresses %d",
+- netdev->name, data->length);
+-
+- return ret;
+-}
+-
+-static int at76_iw_handler_set_thrspy(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_point *data, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- int ret;
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCSIWTHRSPY - number of addresses %d)",
+- netdev->name, data->length);
+-
+- spin_lock_bh(&priv->spy_spinlock);
+- ret = iw_handler_set_thrspy(netdev, info, (union iwreq_data *)data,
+- extra);
+- spin_unlock_bh(&priv->spy_spinlock);
+-
+- return ret;
+-}
+-
+-static int at76_iw_handler_get_thrspy(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_point *data, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- int ret;
+-
+- spin_lock_bh(&priv->spy_spinlock);
+- ret = iw_handler_get_thrspy(netdev, info, (union iwreq_data *)data,
+- extra);
+- spin_unlock_bh(&priv->spy_spinlock);
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCGIWTHRSPY - number of addresses %d)",
+- netdev->name, data->length);
+-
+- return ret;
+-}
+-
+-static int at76_iw_handler_set_wap(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct sockaddr *ap_addr, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCSIWAP - wap/bssid %s", netdev->name,
+- mac2str(ap_addr->sa_data));
+-
+- /* if the incoming address == ff:ff:ff:ff:ff:ff, the user has
+- chosen any or auto AP preference */
+- if (is_broadcast_ether_addr(ap_addr->sa_data)
+- || is_zero_ether_addr(ap_addr->sa_data))
+- priv->wanted_bssid_valid = 0;
+- else {
+- /* user wants to set a preferred AP address */
+- priv->wanted_bssid_valid = 1;
+- memcpy(priv->wanted_bssid, ap_addr->sa_data, ETH_ALEN);
+- }
+-
+- return -EIWCOMMIT;
+-}
+-
+-static int at76_iw_handler_get_wap(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct sockaddr *ap_addr, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+-
+- ap_addr->sa_family = ARPHRD_ETHER;
+- memcpy(ap_addr->sa_data, priv->bssid, ETH_ALEN);
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCGIWAP - wap/bssid %s", netdev->name,
+- mac2str(ap_addr->sa_data));
+-
+- return 0;
+-}
+-
+-static int at76_iw_handler_set_scan(struct net_device *netdev,
+- struct iw_request_info *info,
+- union iwreq_data *wrqu, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- int ret = 0;
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCSIWSCAN", netdev->name);
+-
+- if (mutex_lock_interruptible(&priv->mtx))
+- return -EINTR;
+-
+- if (!netif_running(netdev)) {
+- ret = -ENETDOWN;
+- goto exit;
+- }
+-
+- /* jal: we don't allow "iwlist ethX scan" while we are
+- in monitor mode */
+- if (priv->iw_mode == IW_MODE_MONITOR) {
+- ret = -EBUSY;
+- goto exit;
+- }
+-
+- /* Discard old scan results */
+- if ((jiffies - priv->last_scan) > (20 * HZ))
+- priv->scan_state = SCAN_IDLE;
+- priv->last_scan = jiffies;
+-
+- /* Initiate a scan command */
+- if (priv->scan_state == SCAN_IN_PROGRESS) {
+- ret = -EBUSY;
+- goto exit;
+- }
+-
+- priv->scan_state = SCAN_IN_PROGRESS;
+-
+- at76_quiesce(priv);
+-
+- /* Try to do passive or active scan if WE asks as. */
+- if (wrqu->data.length
+- && wrqu->data.length == sizeof(struct iw_scan_req)) {
+- struct iw_scan_req *req = (struct iw_scan_req *)extra;
+-
+- if (req->scan_type == IW_SCAN_TYPE_PASSIVE)
+- priv->scan_mode = SCAN_TYPE_PASSIVE;
+- else if (req->scan_type == IW_SCAN_TYPE_ACTIVE)
+- priv->scan_mode = SCAN_TYPE_ACTIVE;
+-
+- /* Sanity check values? */
+- if (req->min_channel_time > 0)
+- priv->scan_min_time = req->min_channel_time;
+-
+- if (req->max_channel_time > 0)
+- priv->scan_max_time = req->max_channel_time;
+- }
+-
+- /* change to scanning state */
+- at76_set_mac_state(priv, MAC_SCANNING);
+- schedule_work(&priv->work_start_scan);
+-
+-exit:
+- mutex_unlock(&priv->mtx);
+- return ret;
+-}
+-
+-static int at76_iw_handler_get_scan(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_point *data, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- unsigned long flags;
+- struct list_head *lptr, *nptr;
+- struct bss_info *curr_bss;
+- struct iw_event *iwe = kmalloc(sizeof(struct iw_event), GFP_KERNEL);
+- char *curr_val, *curr_pos = extra;
+- int i;
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCGIWSCAN", netdev->name);
+-
+- if (!iwe)
+- return -ENOMEM;
+-
+- if (priv->scan_state != SCAN_COMPLETED) {
+- /* scan not yet finished */
+- kfree(iwe);
+- return -EAGAIN;
+- }
+-
+- spin_lock_irqsave(&priv->bss_list_spinlock, flags);
+-
+- list_for_each_safe(lptr, nptr, &priv->bss_list) {
+- curr_bss = list_entry(lptr, struct bss_info, list);
+-
+- iwe->cmd = SIOCGIWAP;
+- iwe->u.ap_addr.sa_family = ARPHRD_ETHER;
+- memcpy(iwe->u.ap_addr.sa_data, curr_bss->bssid, 6);
+- curr_pos = iwe_stream_add_event(info, curr_pos,
+- extra + IW_SCAN_MAX_DATA, iwe,
+- IW_EV_ADDR_LEN);
+-
+- iwe->u.data.length = curr_bss->ssid_len;
+- iwe->cmd = SIOCGIWESSID;
+- iwe->u.data.flags = 1;
+-
+- curr_pos = iwe_stream_add_point(info, curr_pos,
+- extra + IW_SCAN_MAX_DATA, iwe,
+- curr_bss->ssid);
+-
+- iwe->cmd = SIOCGIWMODE;
+- iwe->u.mode = (curr_bss->capa & WLAN_CAPABILITY_IBSS) ?
+- IW_MODE_ADHOC :
+- (curr_bss->capa & WLAN_CAPABILITY_ESS) ?
+- IW_MODE_MASTER : IW_MODE_AUTO;
+- /* IW_MODE_AUTO = 0 which I thought is
+- * the most logical value to return in this case */
+- curr_pos = iwe_stream_add_event(info, curr_pos,
+- extra + IW_SCAN_MAX_DATA, iwe,
+- IW_EV_UINT_LEN);
+-
+- iwe->cmd = SIOCGIWFREQ;
+- iwe->u.freq.m = curr_bss->channel;
+- iwe->u.freq.e = 0;
+- curr_pos = iwe_stream_add_event(info, curr_pos,
+- extra + IW_SCAN_MAX_DATA, iwe,
+- IW_EV_FREQ_LEN);
+-
+- iwe->cmd = SIOCGIWENCODE;
+- if (curr_bss->capa & WLAN_CAPABILITY_PRIVACY)
+- iwe->u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
+- else
+- iwe->u.data.flags = IW_ENCODE_DISABLED;
+-
+- iwe->u.data.length = 0;
+- curr_pos = iwe_stream_add_point(info, curr_pos,
+- extra + IW_SCAN_MAX_DATA, iwe,
+- NULL);
+-
+- /* Add quality statistics */
+- iwe->cmd = IWEVQUAL;
+- iwe->u.qual.noise = 0;
+- iwe->u.qual.updated =
+- IW_QUAL_NOISE_INVALID | IW_QUAL_LEVEL_UPDATED;
+- iwe->u.qual.level = (curr_bss->rssi * 100 / 42);
+- if (iwe->u.qual.level > 100)
+- iwe->u.qual.level = 100;
+- if (at76_is_intersil(priv->board_type))
+- iwe->u.qual.qual = curr_bss->link_qual;
+- else {
+- iwe->u.qual.qual = 0;
+- iwe->u.qual.updated |= IW_QUAL_QUAL_INVALID;
+- }
+- /* Add new value to event */
+- curr_pos = iwe_stream_add_event(info, curr_pos,
+- extra + IW_SCAN_MAX_DATA, iwe,
+- IW_EV_QUAL_LEN);
+-
+- /* Rate: stuffing multiple values in a single event requires
+- * a bit more of magic - Jean II */
+- curr_val = curr_pos + IW_EV_LCP_LEN;
+-
+- iwe->cmd = SIOCGIWRATE;
+- /* Those two flags are ignored... */
+- iwe->u.bitrate.fixed = 0;
+- iwe->u.bitrate.disabled = 0;
+- /* Max 8 values */
+- for (i = 0; i < curr_bss->rates_len; i++) {
+- /* Bit rate given in 500 kb/s units (+ 0x80) */
+- iwe->u.bitrate.value =
+- ((curr_bss->rates[i] & 0x7f) * 500000);
+- /* Add new value to event */
+- curr_val = iwe_stream_add_value(info, curr_pos,
+- curr_val,
+- extra +
+- IW_SCAN_MAX_DATA, iwe,
+- IW_EV_PARAM_LEN);
+- }
+-
+- /* Check if we added any event */
+- if ((curr_val - curr_pos) > IW_EV_LCP_LEN)
+- curr_pos = curr_val;
+-
+- /* more information may be sent back using IWECUSTOM */
+-
+- }
+-
+- spin_unlock_irqrestore(&priv->bss_list_spinlock, flags);
+-
+- data->length = (curr_pos - extra);
+- data->flags = 0;
+-
+- kfree(iwe);
+- return 0;
+-}
+-
+-static int at76_iw_handler_set_essid(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_point *data, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCSIWESSID - %s", netdev->name, extra);
+-
+- if (data->flags) {
+- memcpy(priv->essid, extra, data->length);
+- priv->essid_size = data->length;
+- } else
+- priv->essid_size = 0; /* Use any SSID */
+-
+- return -EIWCOMMIT;
+-}
+-
+-static int at76_iw_handler_get_essid(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_point *data, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+-
+- if (priv->essid_size) {
+- /* not the ANY ssid in priv->essid */
+- data->flags = 1;
+- data->length = priv->essid_size;
+- memcpy(extra, priv->essid, data->length);
+- } else {
+- /* the ANY ssid was specified */
+- if (priv->mac_state == MAC_CONNECTED && priv->curr_bss) {
+- /* report the SSID we have found */
+- data->flags = 1;
+- data->length = priv->curr_bss->ssid_len;
+- memcpy(extra, priv->curr_bss->ssid, data->length);
+- } else {
+- /* report ANY back */
+- data->flags = 0;
+- data->length = 0;
+- }
+- }
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCGIWESSID - %.*s", netdev->name,
+- data->length, extra);
+-
+- return 0;
+-}
+-
+-static int at76_iw_handler_set_rate(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_param *bitrate, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- int ret = -EIWCOMMIT;
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCSIWRATE - %d", netdev->name,
+- bitrate->value);
+-
+- switch (bitrate->value) {
+- case -1:
+- priv->txrate = TX_RATE_AUTO;
+- break; /* auto rate */
+- case 1000000:
+- priv->txrate = TX_RATE_1MBIT;
+- break;
+- case 2000000:
+- priv->txrate = TX_RATE_2MBIT;
+- break;
+- case 5500000:
+- priv->txrate = TX_RATE_5_5MBIT;
+- break;
+- case 11000000:
+- priv->txrate = TX_RATE_11MBIT;
+- break;
+- default:
+- ret = -EINVAL;
+- }
+-
+- return ret;
+-}
+-
+-static int at76_iw_handler_get_rate(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_param *bitrate, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- int ret = 0;
+-
+- switch (priv->txrate) {
+- /* return max rate if RATE_AUTO */
+- case TX_RATE_AUTO:
+- bitrate->value = 11000000;
+- break;
+- case TX_RATE_1MBIT:
+- bitrate->value = 1000000;
+- break;
+- case TX_RATE_2MBIT:
+- bitrate->value = 2000000;
+- break;
+- case TX_RATE_5_5MBIT:
+- bitrate->value = 5500000;
+- break;
+- case TX_RATE_11MBIT:
+- bitrate->value = 11000000;
+- break;
+- default:
+- ret = -EINVAL;
+- }
+-
+- bitrate->fixed = (priv->txrate != TX_RATE_AUTO);
+- bitrate->disabled = 0;
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCGIWRATE - %d", netdev->name,
+- bitrate->value);
+-
+- return ret;
+-}
+-
+-static int at76_iw_handler_set_rts(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_param *rts, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- int ret = -EIWCOMMIT;
+- int rthr = rts->value;
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCSIWRTS - value %d disabled %s",
+- netdev->name, rts->value, (rts->disabled) ? "true" : "false");
+-
+- if (rts->disabled)
+- rthr = MAX_RTS_THRESHOLD;
+-
+- if ((rthr < 0) || (rthr > MAX_RTS_THRESHOLD))
+- ret = -EINVAL;
+- else
+- priv->rts_threshold = rthr;
+-
+- return ret;
+-}
+-
+-static int at76_iw_handler_get_rts(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_param *rts, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+-
+- rts->value = priv->rts_threshold;
+- rts->disabled = (rts->value >= MAX_RTS_THRESHOLD);
+- rts->fixed = 1;
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCGIWRTS - value %d disabled %s",
+- netdev->name, rts->value, (rts->disabled) ? "true" : "false");
+-
+- return 0;
+-}
+-
+-static int at76_iw_handler_set_frag(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_param *frag, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- int ret = -EIWCOMMIT;
+- int fthr = frag->value;
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCSIWFRAG - value %d, disabled %s",
+- netdev->name, frag->value,
+- (frag->disabled) ? "true" : "false");
+-
+- if (frag->disabled)
+- fthr = MAX_FRAG_THRESHOLD;
+-
+- if ((fthr < MIN_FRAG_THRESHOLD) || (fthr > MAX_FRAG_THRESHOLD))
+- ret = -EINVAL;
+- else
+- priv->frag_threshold = fthr & ~0x1; /* get an even value */
+-
+- return ret;
+-}
+-
+-static int at76_iw_handler_get_frag(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_param *frag, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+-
+- frag->value = priv->frag_threshold;
+- frag->disabled = (frag->value >= MAX_FRAG_THRESHOLD);
+- frag->fixed = 1;
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCGIWFRAG - value %d, disabled %s",
+- netdev->name, frag->value,
+- (frag->disabled) ? "true" : "false");
+-
+- return 0;
+-}
+-
+-static int at76_iw_handler_get_txpow(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_param *power, char *extra)
+-{
+- power->value = 15;
+- power->fixed = 1; /* No power control */
+- power->disabled = 0;
+- power->flags = IW_TXPOW_DBM;
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCGIWTXPOW - txpow %d dBm", netdev->name,
+- power->value);
+-
+- return 0;
+-}
+-
+-/* jal: short retry is handled by the firmware (at least 0.90.x),
+- while long retry is not (?) */
+-static int at76_iw_handler_set_retry(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_param *retry, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- int ret = -EIWCOMMIT;
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCSIWRETRY disabled %d flags 0x%x val %d",
+- netdev->name, retry->disabled, retry->flags, retry->value);
+-
+- if (!retry->disabled && (retry->flags & IW_RETRY_LIMIT)) {
+- if ((retry->flags & IW_RETRY_MIN) ||
+- !(retry->flags & IW_RETRY_MAX))
+- priv->short_retry_limit = retry->value;
+- else
+- ret = -EINVAL;
+- } else
+- ret = -EINVAL;
+-
+- return ret;
+-}
+-
+-/* Adapted (ripped) from atmel.c */
+-static int at76_iw_handler_get_retry(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_param *retry, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCGIWRETRY", netdev->name);
+-
+- retry->disabled = 0; /* Can't be disabled */
+- retry->flags = IW_RETRY_LIMIT;
+- retry->value = priv->short_retry_limit;
+-
+- return 0;
+-}
+-
+-static int at76_iw_handler_set_encode(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_point *encoding, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- int index = (encoding->flags & IW_ENCODE_INDEX) - 1;
+- int len = encoding->length;
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCSIWENCODE - enc.flags %08x "
+- "pointer %p len %d", netdev->name, encoding->flags,
+- encoding->pointer, encoding->length);
+- at76_dbg(DBG_IOCTL,
+- "%s: SIOCSIWENCODE - old wepstate: enabled %s key_id %d "
+- "auth_mode %s", netdev->name,
+- (priv->wep_enabled) ? "true" : "false", priv->wep_key_id,
+- (priv->auth_mode ==
+- WLAN_AUTH_SHARED_KEY) ? "restricted" : "open");
+-
+- /* take the old default key if index is invalid */
+- if ((index < 0) || (index >= WEP_KEYS))
+- index = priv->wep_key_id;
+-
+- if (len > 0) {
+- if (len > WEP_LARGE_KEY_LEN)
+- len = WEP_LARGE_KEY_LEN;
+-
+- memset(priv->wep_keys[index], 0, WEP_KEY_LEN);
+- memcpy(priv->wep_keys[index], extra, len);
+- priv->wep_keys_len[index] = (len <= WEP_SMALL_KEY_LEN) ?
+- WEP_SMALL_KEY_LEN : WEP_LARGE_KEY_LEN;
+- priv->wep_enabled = 1;
+- }
+-
+- priv->wep_key_id = index;
+- priv->wep_enabled = ((encoding->flags & IW_ENCODE_DISABLED) == 0);
+-
+- if (encoding->flags & IW_ENCODE_RESTRICTED)
+- priv->auth_mode = WLAN_AUTH_SHARED_KEY;
+- if (encoding->flags & IW_ENCODE_OPEN)
+- priv->auth_mode = WLAN_AUTH_OPEN;
+-
+- at76_dbg(DBG_IOCTL,
+- "%s: SIOCSIWENCODE - new wepstate: enabled %s key_id %d "
+- "key_len %d auth_mode %s", netdev->name,
+- (priv->wep_enabled) ? "true" : "false", priv->wep_key_id + 1,
+- priv->wep_keys_len[priv->wep_key_id],
+- (priv->auth_mode ==
+- WLAN_AUTH_SHARED_KEY) ? "restricted" : "open");
+-
+- return -EIWCOMMIT;
+-}
+-
+-static int at76_iw_handler_get_encode(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_point *encoding, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- int index = (encoding->flags & IW_ENCODE_INDEX) - 1;
+-
+- if ((index < 0) || (index >= WEP_KEYS))
+- index = priv->wep_key_id;
+-
+- encoding->flags =
+- (priv->auth_mode == WLAN_AUTH_SHARED_KEY) ?
+- IW_ENCODE_RESTRICTED : IW_ENCODE_OPEN;
+-
+- if (!priv->wep_enabled)
+- encoding->flags |= IW_ENCODE_DISABLED;
+-
+- if (encoding->pointer) {
+- encoding->length = priv->wep_keys_len[index];
+-
+- memcpy(extra, priv->wep_keys[index], priv->wep_keys_len[index]);
+-
+- encoding->flags |= (index + 1);
+- }
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCGIWENCODE - enc.flags %08x "
+- "pointer %p len %d", netdev->name, encoding->flags,
+- encoding->pointer, encoding->length);
+- at76_dbg(DBG_IOCTL,
+- "%s: SIOCGIWENCODE - wepstate: enabled %s key_id %d "
+- "key_len %d auth_mode %s", netdev->name,
+- (priv->wep_enabled) ? "true" : "false", priv->wep_key_id + 1,
+- priv->wep_keys_len[priv->wep_key_id],
+- (priv->auth_mode ==
+- WLAN_AUTH_SHARED_KEY) ? "restricted" : "open");
+-
+- return 0;
+-}
+-
+-static int at76_iw_handler_set_power(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_param *prq, char *extra)
+-{
+- int err = -EIWCOMMIT;
+- struct at76_priv *priv = netdev_priv(netdev);
+-
+- at76_dbg(DBG_IOCTL,
+- "%s: SIOCSIWPOWER - disabled %s flags 0x%x value 0x%x",
+- netdev->name, (prq->disabled) ? "true" : "false", prq->flags,
+- prq->value);
+-
+- if (prq->disabled)
+- priv->pm_mode = AT76_PM_OFF;
+- else {
+- switch (prq->flags & IW_POWER_MODE) {
+- case IW_POWER_ALL_R:
+- case IW_POWER_ON:
+- break;
+- default:
+- err = -EINVAL;
+- goto exit;
+- }
+- if (prq->flags & IW_POWER_PERIOD)
+- priv->pm_period = prq->value;
+-
+- if (prq->flags & IW_POWER_TIMEOUT) {
+- err = -EINVAL;
+- goto exit;
+- }
+- priv->pm_mode = AT76_PM_ON;
+- }
+-exit:
+- return err;
+-}
+-
+-static int at76_iw_handler_get_power(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_param *power, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+-
+- power->disabled = (priv->pm_mode == AT76_PM_OFF);
+- if (!power->disabled) {
+- power->flags = IW_POWER_PERIOD | IW_POWER_ALL_R;
+- power->value = priv->pm_period;
+- }
+-
+- at76_dbg(DBG_IOCTL, "%s: SIOCGIWPOWER - %s flags 0x%x value 0x%x",
+- netdev->name, power->disabled ? "disabled" : "enabled",
+- power->flags, power->value);
+-
+- return 0;
+-}
+-
+-/*******************************************************************************
+- * Private IOCTLS
+- */
+-static int at76_iw_set_short_preamble(struct net_device *netdev,
+- struct iw_request_info *info, char *name,
+- char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- int val = *((int *)name);
+- int ret = -EIWCOMMIT;
+-
+- at76_dbg(DBG_IOCTL, "%s: AT76_SET_SHORT_PREAMBLE, %d",
+- netdev->name, val);
+-
+- if (val < PREAMBLE_TYPE_LONG || val > PREAMBLE_TYPE_AUTO)
+- ret = -EINVAL;
+- else
+- priv->preamble_type = val;
+-
+- return ret;
+-}
+-
+-static int at76_iw_get_short_preamble(struct net_device *netdev,
+- struct iw_request_info *info,
+- union iwreq_data *wrqu, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+-
+- snprintf(wrqu->name, sizeof(wrqu->name), "%s (%d)",
+- preambles[priv->preamble_type], priv->preamble_type);
+- return 0;
+-}
+-
+-static int at76_iw_set_debug(struct net_device *netdev,
+- struct iw_request_info *info,
+- struct iw_point *data, char *extra)
+-{
+- char *ptr;
+- u32 val;
+-
+- if (data->length > 0) {
+- val = simple_strtol(extra, &ptr, 0);
+-
+- if (ptr == extra)
+- val = DBG_DEFAULTS;
+-
+- at76_dbg(DBG_IOCTL, "%s: AT76_SET_DEBUG input %d: %s -> 0x%x",
+- netdev->name, data->length, extra, val);
+- } else
+- val = DBG_DEFAULTS;
+-
+- at76_dbg(DBG_IOCTL, "%s: AT76_SET_DEBUG, old 0x%x, new 0x%x",
+- netdev->name, at76_debug, val);
+-
+- /* jal: some more output to pin down lockups */
+- at76_dbg(DBG_IOCTL, "%s: netif running %d queue_stopped %d "
+- "carrier_ok %d", netdev->name, netif_running(netdev),
+- netif_queue_stopped(netdev), netif_carrier_ok(netdev));
+-
+- at76_debug = val;
+-
+- return 0;
+-}
+-
+-static int at76_iw_get_debug(struct net_device *netdev,
+- struct iw_request_info *info,
+- union iwreq_data *wrqu, char *extra)
+-{
+- snprintf(wrqu->name, sizeof(wrqu->name), "0x%08x", at76_debug);
+- return 0;
+-}
+-
+-static int at76_iw_set_powersave_mode(struct net_device *netdev,
+- struct iw_request_info *info, char *name,
+- char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- int val = *((int *)name);
+- int ret = -EIWCOMMIT;
+-
+- at76_dbg(DBG_IOCTL, "%s: AT76_SET_POWERSAVE_MODE, %d (%s)",
+- netdev->name, val,
+- val == AT76_PM_OFF ? "active" : val == AT76_PM_ON ? "save" :
+- val == AT76_PM_SMART ? "smart save" : "<invalid>");
+- if (val < AT76_PM_OFF || val > AT76_PM_SMART)
+- ret = -EINVAL;
+- else
+- priv->pm_mode = val;
+-
+- return ret;
+-}
+-
+-static int at76_iw_get_powersave_mode(struct net_device *netdev,
+- struct iw_request_info *info,
+- union iwreq_data *wrqu, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- int *param = (int *)extra;
+-
+- param[0] = priv->pm_mode;
+- return 0;
+-}
+-
+-static int at76_iw_set_scan_times(struct net_device *netdev,
+- struct iw_request_info *info, char *name,
+- char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- int mint = *((int *)name);
+- int maxt = *((int *)name + 1);
+- int ret = -EIWCOMMIT;
+-
+- at76_dbg(DBG_IOCTL, "%s: AT76_SET_SCAN_TIMES - min %d max %d",
+- netdev->name, mint, maxt);
+- if (mint <= 0 || maxt <= 0 || mint > maxt)
+- ret = -EINVAL;
+- else {
+- priv->scan_min_time = mint;
+- priv->scan_max_time = maxt;
+- }
+-
+- return ret;
+-}
+-
+-static int at76_iw_get_scan_times(struct net_device *netdev,
+- struct iw_request_info *info,
+- union iwreq_data *wrqu, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- int *param = (int *)extra;
+-
+- param[0] = priv->scan_min_time;
+- param[1] = priv->scan_max_time;
+- return 0;
+-}
+-
+-static int at76_iw_set_scan_mode(struct net_device *netdev,
+- struct iw_request_info *info, char *name,
+- char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- int val = *((int *)name);
+- int ret = -EIWCOMMIT;
+-
+- at76_dbg(DBG_IOCTL, "%s: AT76_SET_SCAN_MODE - mode %s",
+- netdev->name, (val = SCAN_TYPE_ACTIVE) ? "active" :
+- (val = SCAN_TYPE_PASSIVE) ? "passive" : "<invalid>");
+-
+- if (val != SCAN_TYPE_ACTIVE && val != SCAN_TYPE_PASSIVE)
+- ret = -EINVAL;
+- else
+- priv->scan_mode = val;
+-
+- return ret;
+-}
+-
+-static int at76_iw_get_scan_mode(struct net_device *netdev,
+- struct iw_request_info *info,
+- union iwreq_data *wrqu, char *extra)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- int *param = (int *)extra;
+-
+- param[0] = priv->scan_mode;
+- return 0;
+-}
+-
+-#define AT76_SET_HANDLER(h, f) [h - SIOCIWFIRST] = (iw_handler) f
+-
+-/* Standard wireless handlers */
+-static const iw_handler at76_handlers[] = {
+- AT76_SET_HANDLER(SIOCSIWCOMMIT, at76_iw_handler_commit),
+- AT76_SET_HANDLER(SIOCGIWNAME, at76_iw_handler_get_name),
+- AT76_SET_HANDLER(SIOCSIWFREQ, at76_iw_handler_set_freq),
+- AT76_SET_HANDLER(SIOCGIWFREQ, at76_iw_handler_get_freq),
+- AT76_SET_HANDLER(SIOCSIWMODE, at76_iw_handler_set_mode),
+- AT76_SET_HANDLER(SIOCGIWMODE, at76_iw_handler_get_mode),
+- AT76_SET_HANDLER(SIOCGIWRANGE, at76_iw_handler_get_range),
+- AT76_SET_HANDLER(SIOCSIWSPY, at76_iw_handler_set_spy),
+- AT76_SET_HANDLER(SIOCGIWSPY, at76_iw_handler_get_spy),
+- AT76_SET_HANDLER(SIOCSIWTHRSPY, at76_iw_handler_set_thrspy),
+- AT76_SET_HANDLER(SIOCGIWTHRSPY, at76_iw_handler_get_thrspy),
+- AT76_SET_HANDLER(SIOCSIWAP, at76_iw_handler_set_wap),
+- AT76_SET_HANDLER(SIOCGIWAP, at76_iw_handler_get_wap),
+- AT76_SET_HANDLER(SIOCSIWSCAN, at76_iw_handler_set_scan),
+- AT76_SET_HANDLER(SIOCGIWSCAN, at76_iw_handler_get_scan),
+- AT76_SET_HANDLER(SIOCSIWESSID, at76_iw_handler_set_essid),
+- AT76_SET_HANDLER(SIOCGIWESSID, at76_iw_handler_get_essid),
+- AT76_SET_HANDLER(SIOCSIWRATE, at76_iw_handler_set_rate),
+- AT76_SET_HANDLER(SIOCGIWRATE, at76_iw_handler_get_rate),
+- AT76_SET_HANDLER(SIOCSIWRTS, at76_iw_handler_set_rts),
+- AT76_SET_HANDLER(SIOCGIWRTS, at76_iw_handler_get_rts),
+- AT76_SET_HANDLER(SIOCSIWFRAG, at76_iw_handler_set_frag),
+- AT76_SET_HANDLER(SIOCGIWFRAG, at76_iw_handler_get_frag),
+- AT76_SET_HANDLER(SIOCGIWTXPOW, at76_iw_handler_get_txpow),
+- AT76_SET_HANDLER(SIOCSIWRETRY, at76_iw_handler_set_retry),
+- AT76_SET_HANDLER(SIOCGIWRETRY, at76_iw_handler_get_retry),
+- AT76_SET_HANDLER(SIOCSIWENCODE, at76_iw_handler_set_encode),
+- AT76_SET_HANDLER(SIOCGIWENCODE, at76_iw_handler_get_encode),
+- AT76_SET_HANDLER(SIOCSIWPOWER, at76_iw_handler_set_power),
+- AT76_SET_HANDLER(SIOCGIWPOWER, at76_iw_handler_get_power)
+-};
+-
+-#define AT76_SET_PRIV(h, f) [h - SIOCIWFIRSTPRIV] = (iw_handler) f
+-
+-/* Private wireless handlers */
+-static const iw_handler at76_priv_handlers[] = {
+- AT76_SET_PRIV(AT76_SET_SHORT_PREAMBLE, at76_iw_set_short_preamble),
+- AT76_SET_PRIV(AT76_GET_SHORT_PREAMBLE, at76_iw_get_short_preamble),
+- AT76_SET_PRIV(AT76_SET_DEBUG, at76_iw_set_debug),
+- AT76_SET_PRIV(AT76_GET_DEBUG, at76_iw_get_debug),
+- AT76_SET_PRIV(AT76_SET_POWERSAVE_MODE, at76_iw_set_powersave_mode),
+- AT76_SET_PRIV(AT76_GET_POWERSAVE_MODE, at76_iw_get_powersave_mode),
+- AT76_SET_PRIV(AT76_SET_SCAN_TIMES, at76_iw_set_scan_times),
+- AT76_SET_PRIV(AT76_GET_SCAN_TIMES, at76_iw_get_scan_times),
+- AT76_SET_PRIV(AT76_SET_SCAN_MODE, at76_iw_set_scan_mode),
+- AT76_SET_PRIV(AT76_GET_SCAN_MODE, at76_iw_get_scan_mode),
+-};
+-
+-/* Names and arguments of private wireless handlers */
+-static const struct iw_priv_args at76_priv_args[] = {
+- /* 0 - long, 1 - short */
+- {AT76_SET_SHORT_PREAMBLE,
+- IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_preamble"},
+-
+- {AT76_GET_SHORT_PREAMBLE,
+- 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | 10, "get_preamble"},
+-
+- /* we must pass the new debug mask as a string, because iwpriv cannot
+- * parse hex numbers starting with 0x :-( */
+- {AT76_SET_DEBUG,
+- IW_PRIV_TYPE_CHAR | 10, 0, "set_debug"},
+-
+- {AT76_GET_DEBUG,
+- 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | 10, "get_debug"},
+-
+- /* 1 - active, 2 - power save, 3 - smart power save */
+- {AT76_SET_POWERSAVE_MODE,
+- IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_powersave"},
+-
+- {AT76_GET_POWERSAVE_MODE,
+- 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_powersave"},
+-
+- /* min_channel_time, max_channel_time */
+- {AT76_SET_SCAN_TIMES,
+- IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "set_scan_times"},
+-
+- {AT76_GET_SCAN_TIMES,
+- 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, "get_scan_times"},
+-
+- /* 0 - active, 1 - passive scan */
+- {AT76_SET_SCAN_MODE,
+- IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_scan_mode"},
+-
+- {AT76_GET_SCAN_MODE,
+- 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_scan_mode"},
+-};
+-
+-static const struct iw_handler_def at76_handler_def = {
+- .num_standard = ARRAY_SIZE(at76_handlers),
+- .num_private = ARRAY_SIZE(at76_priv_handlers),
+- .num_private_args = ARRAY_SIZE(at76_priv_args),
+- .standard = at76_handlers,
+- .private = at76_priv_handlers,
+- .private_args = at76_priv_args,
+- .get_wireless_stats = at76_get_wireless_stats,
+-};
+-
+-static const u8 snapsig[] = { 0xaa, 0xaa, 0x03 };
+-
+-/* RFC 1042 encapsulates Ethernet frames in 802.2 SNAP (0xaa, 0xaa, 0x03) with
+- * a SNAP OID of 0 (0x00, 0x00, 0x00) */
+-static const u8 rfc1042sig[] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
+-
+-static int at76_tx(struct sk_buff *skb, struct net_device *netdev)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- struct net_device_stats *stats = &priv->stats;
+- int ret = 0;
+- int wlen;
+- int submit_len;
+- struct at76_tx_buffer *tx_buffer = priv->bulk_out_buffer;
+- struct ieee80211_hdr_3addr *i802_11_hdr =
+- (struct ieee80211_hdr_3addr *)tx_buffer->packet;
+- u8 *payload = i802_11_hdr->payload;
+- struct ethhdr *eh = (struct ethhdr *)skb->data;
+-
+- if (netif_queue_stopped(netdev)) {
+- printk(KERN_ERR "%s: %s called while netdev is stopped\n",
+- netdev->name, __func__);
+- /* skip this packet */
+- dev_kfree_skb(skb);
+- return 0;
+- }
+-
+- if (priv->tx_urb->status == -EINPROGRESS) {
+- printk(KERN_ERR "%s: %s called while tx urb is pending\n",
+- netdev->name, __func__);
+- /* skip this packet */
+- dev_kfree_skb(skb);
+- return 0;
+- }
+-
+- if (skb->len < ETH_HLEN) {
+- printk(KERN_ERR "%s: %s: skb too short (%d)\n",
+- netdev->name, __func__, skb->len);
+- dev_kfree_skb(skb);
+- return 0;
+- }
+-
+- at76_ledtrig_tx_activity(); /* tell ledtrigger we send a packet */
+-
+- /* we can get rid of memcpy if we set netdev->hard_header_len to
+- reserve enough space, but we would need to keep the skb around */
+-
+- if (ntohs(eh->h_proto) <= ETH_DATA_LEN) {
+- /* this is a 802.3 packet */
+- if (skb->len >= ETH_HLEN + sizeof(rfc1042sig)
+- && skb->data[ETH_HLEN] == rfc1042sig[0]
+- && skb->data[ETH_HLEN + 1] == rfc1042sig[1]) {
+- /* higher layer delivered SNAP header - keep it */
+- memcpy(payload, skb->data + ETH_HLEN,
+- skb->len - ETH_HLEN);
+- wlen = IEEE80211_3ADDR_LEN + skb->len - ETH_HLEN;
+- } else {
+- printk(KERN_ERR "%s: dropping non-SNAP 802.2 packet "
+- "(DSAP 0x%02x SSAP 0x%02x cntrl 0x%02x)\n",
+- priv->netdev->name, skb->data[ETH_HLEN],
+- skb->data[ETH_HLEN + 1],
+- skb->data[ETH_HLEN + 2]);
+- dev_kfree_skb(skb);
+- return 0;
+- }
+- } else {
+- /* add RFC 1042 header in front */
+- memcpy(payload, rfc1042sig, sizeof(rfc1042sig));
+- memcpy(payload + sizeof(rfc1042sig), &eh->h_proto,
+- skb->len - offsetof(struct ethhdr, h_proto));
+- wlen = IEEE80211_3ADDR_LEN + sizeof(rfc1042sig) + skb->len -
+- offsetof(struct ethhdr, h_proto);
+- }
+-
+- /* make wireless header */
+- i802_11_hdr->frame_ctl =
+- cpu_to_le16(IEEE80211_FTYPE_DATA |
+- (priv->wep_enabled ? IEEE80211_FCTL_PROTECTED : 0) |
+- (priv->iw_mode ==
+- IW_MODE_INFRA ? IEEE80211_FCTL_TODS : 0));
+-
+- if (priv->iw_mode == IW_MODE_ADHOC) {
+- memcpy(i802_11_hdr->addr1, eh->h_dest, ETH_ALEN);
+- memcpy(i802_11_hdr->addr2, eh->h_source, ETH_ALEN);
+- memcpy(i802_11_hdr->addr3, priv->bssid, ETH_ALEN);
+- } else if (priv->iw_mode == IW_MODE_INFRA) {
+- memcpy(i802_11_hdr->addr1, priv->bssid, ETH_ALEN);
+- memcpy(i802_11_hdr->addr2, eh->h_source, ETH_ALEN);
+- memcpy(i802_11_hdr->addr3, eh->h_dest, ETH_ALEN);
+- }
+-
+- i802_11_hdr->duration_id = cpu_to_le16(0);
+- i802_11_hdr->seq_ctl = cpu_to_le16(0);
+-
+- /* setup 'Atmel' header */
+- tx_buffer->wlength = cpu_to_le16(wlen);
+- tx_buffer->tx_rate = priv->txrate;
+- /* for broadcast destination addresses, the firmware 0.100.x
+- seems to choose the highest rate set with CMD_STARTUP in
+- basic_rate_set replacing this value */
+-
+- memset(tx_buffer->reserved, 0, sizeof(tx_buffer->reserved));
+-
+- tx_buffer->padding = at76_calc_padding(wlen);
+- submit_len = wlen + AT76_TX_HDRLEN + tx_buffer->padding;
+-
+- at76_dbg(DBG_TX_DATA_CONTENT, "%s skb->data %s", priv->netdev->name,
+- hex2str(skb->data, 32));
+- at76_dbg(DBG_TX_DATA, "%s tx: wlen 0x%x pad 0x%x rate %d hdr %s",
+- priv->netdev->name,
+- le16_to_cpu(tx_buffer->wlength),
+- tx_buffer->padding, tx_buffer->tx_rate,
+- hex2str(i802_11_hdr, sizeof(*i802_11_hdr)));
+- at76_dbg(DBG_TX_DATA_CONTENT, "%s payload %s", priv->netdev->name,
+- hex2str(payload, 48));
+-
+- /* send stuff */
+- netif_stop_queue(netdev);
+- netdev->trans_start = jiffies;
+-
+- usb_fill_bulk_urb(priv->tx_urb, priv->udev, priv->tx_pipe, tx_buffer,
+- submit_len, at76_tx_callback, priv);
+- ret = usb_submit_urb(priv->tx_urb, GFP_ATOMIC);
+- if (ret) {
+- stats->tx_errors++;
+- printk(KERN_ERR "%s: error in tx submit urb: %d\n",
+- netdev->name, ret);
+- if (ret == -EINVAL)
+- printk(KERN_ERR
+- "%s: -EINVAL: tx urb %p hcpriv %p complete %p\n",
+- priv->netdev->name, priv->tx_urb,
+- priv->tx_urb->hcpriv, priv->tx_urb->complete);
+- } else {
+- stats->tx_bytes += skb->len;
+- dev_kfree_skb(skb);
+- }
+-
+- return ret;
+-}
+-
+-static void at76_tx_timeout(struct net_device *netdev)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+-
+- if (!priv)
+- return;
+- dev_warn(&netdev->dev, "tx timeout.");
+-
+- usb_unlink_urb(priv->tx_urb);
+- priv->stats.tx_errors++;
+-}
+-
+-static int at76_submit_rx_urb(struct at76_priv *priv)
+-{
+- int ret;
+- int size;
+- struct sk_buff *skb = priv->rx_skb;
+-
+- if (!priv->rx_urb) {
+- printk(KERN_ERR "%s: %s: priv->rx_urb is NULL\n",
+- priv->netdev->name, __func__);
+- return -EFAULT;
+- }
+-
+- if (!skb) {
+- skb = dev_alloc_skb(sizeof(struct at76_rx_buffer));
+- if (!skb) {
+- printk(KERN_ERR "%s: cannot allocate rx skbuff\n",
+- priv->netdev->name);
+- ret = -ENOMEM;
+- goto exit;
+- }
+- priv->rx_skb = skb;
+- } else {
+- skb_push(skb, skb_headroom(skb));
+- skb_trim(skb, 0);
+- }
+-
+- size = skb_tailroom(skb);
+- usb_fill_bulk_urb(priv->rx_urb, priv->udev, priv->rx_pipe,
+- skb_put(skb, size), size, at76_rx_callback, priv);
+- ret = usb_submit_urb(priv->rx_urb, GFP_ATOMIC);
+- if (ret < 0) {
+- if (ret == -ENODEV)
+- at76_dbg(DBG_DEVSTART,
+- "usb_submit_urb returned -ENODEV");
+- else
+- printk(KERN_ERR "%s: rx, usb_submit_urb failed: %d\n",
+- priv->netdev->name, ret);
+- }
+-
+-exit:
+- if (ret < 0 && ret != -ENODEV)
+- printk(KERN_ERR "%s: cannot submit rx urb - please unload the "
+- "driver and/or power cycle the device\n",
+- priv->netdev->name);
+-
+- return ret;
+-}
+-
+-static int at76_open(struct net_device *netdev)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- int ret = 0;
+-
+- at76_dbg(DBG_PROC_ENTRY, "%s(): entry", __func__);
+-
+- if (mutex_lock_interruptible(&priv->mtx))
+- return -EINTR;
+-
+- /* if netdev->dev_addr != priv->mac_addr we must
+- set the mac address in the device ! */
+- if (compare_ether_addr(netdev->dev_addr, priv->mac_addr)) {
+- if (at76_add_mac_address(priv, netdev->dev_addr) >= 0)
+- at76_dbg(DBG_PROGRESS, "%s: set new MAC addr %s",
+- netdev->name, mac2str(netdev->dev_addr));
+- }
+-
+- priv->scan_state = SCAN_IDLE;
+- priv->last_scan = jiffies;
+-
+- ret = at76_submit_rx_urb(priv);
+- if (ret < 0) {
+- printk(KERN_ERR "%s: open: submit_rx_urb failed: %d\n",
+- netdev->name, ret);
+- goto error;
+- }
+-
+- schedule_delayed_work(&priv->dwork_restart, 0);
+-
+- at76_dbg(DBG_PROC_ENTRY, "%s(): end", __func__);
+-error:
+- mutex_unlock(&priv->mtx);
+- return ret < 0 ? ret : 0;
+-}
+-
+-static int at76_stop(struct net_device *netdev)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+-
+- at76_dbg(DBG_DEVSTART, "%s: ENTER", __func__);
+-
+- if (mutex_lock_interruptible(&priv->mtx))
+- return -EINTR;
+-
+- at76_quiesce(priv);
+-
+- if (!priv->device_unplugged) {
+- /* We are called by "ifconfig ethX down", not because the
+- * device is not available anymore. */
+- at76_set_radio(priv, 0);
+-
+- /* We unlink rx_urb because at76_open() re-submits it.
+- * If unplugged, at76_delete_device() takes care of it. */
+- usb_kill_urb(priv->rx_urb);
+- }
+-
+- /* free the bss_list */
+- at76_free_bss_list(priv);
+-
+- mutex_unlock(&priv->mtx);
+- at76_dbg(DBG_DEVSTART, "%s: EXIT", __func__);
+-
+- return 0;
+-}
+-
+-static void at76_ethtool_get_drvinfo(struct net_device *netdev,
+- struct ethtool_drvinfo *info)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+-
+- strncpy(info->driver, DRIVER_NAME, sizeof(info->driver));
+- strncpy(info->version, DRIVER_VERSION, sizeof(info->version));
+-
+- usb_make_path(priv->udev, info->bus_info, sizeof(info->bus_info));
+-
+- snprintf(info->fw_version, sizeof(info->fw_version), "%d.%d.%d-%d",
+- priv->fw_version.major, priv->fw_version.minor,
+- priv->fw_version.patch, priv->fw_version.build);
+-}
+-
+-static u32 at76_ethtool_get_link(struct net_device *netdev)
+-{
+- struct at76_priv *priv = netdev_priv(netdev);
+- return priv->mac_state == MAC_CONNECTED;
+-}
+-
+-static struct ethtool_ops at76_ethtool_ops = {
+- .get_drvinfo = at76_ethtool_get_drvinfo,
+- .get_link = at76_ethtool_get_link,
+-};
+-
+-/* Download external firmware */
+-static int at76_load_external_fw(struct usb_device *udev, struct fwentry *fwe)
+-{
+- int ret;
+- int op_mode;
+- int blockno = 0;
+- int bsize;
+- u8 *block;
+- u8 *buf = fwe->extfw;
+- int size = fwe->extfw_size;
+-
+- if (!buf || !size)
+- return -ENOENT;
+-
+- op_mode = at76_get_op_mode(udev);
+- at76_dbg(DBG_DEVSTART, "opmode %d", op_mode);
++ op_mode = at76_get_op_mode(udev);
++ at76_dbg(DBG_DEVSTART, "opmode %d", op_mode);
+
+ if (op_mode != OPMODE_NORMAL_NIC_WITHOUT_FLASH) {
+ dev_printk(KERN_ERR, &udev->dev, "unexpected opmode %d\n",
+@@ -3458,444 +1423,44 @@
+ exit:
+ kfree(block);
+ if (ret < 0)
+- dev_printk(KERN_ERR, &udev->dev,
+- "downloading external firmware failed: %d\n", ret);
+- return ret;
+-}
+-
+-/* Download internal firmware */
+-static int at76_load_internal_fw(struct usb_device *udev, struct fwentry *fwe)
+-{
+- int ret;
+- int need_remap = !at76_is_505a(fwe->board_type);
+-
+- ret = at76_usbdfu_download(udev, fwe->intfw, fwe->intfw_size,
+- need_remap ? 0 : 2 * HZ);
+-
+- if (ret < 0) {
+- dev_printk(KERN_ERR, &udev->dev,
+- "downloading internal fw failed with %d\n", ret);
+- goto exit;
+- }
+-
+- at76_dbg(DBG_DEVSTART, "sending REMAP");
+-
+- /* no REMAP for 505A (see SF driver) */
+- if (need_remap) {
+- ret = at76_remap(udev);
+- if (ret < 0) {
+- dev_printk(KERN_ERR, &udev->dev,
+- "sending REMAP failed with %d\n", ret);
+- goto exit;
+- }
+- }
+-
+- at76_dbg(DBG_DEVSTART, "sleeping for 2 seconds");
+- schedule_timeout_interruptible(2 * HZ + 1);
+- usb_reset_device(udev);
+-
+-exit:
+- return ret;
+-}
+-
+-static int at76_match_essid(struct at76_priv *priv, struct bss_info *ptr)
+-{
+- /* common criteria for both modi */
+-
+- int ret = (priv->essid_size == 0 /* ANY ssid */ ||
+- (priv->essid_size == ptr->ssid_len &&
+- !memcmp(priv->essid, ptr->ssid, ptr->ssid_len)));
+- if (!ret)
+- at76_dbg(DBG_BSS_MATCH,
+- "%s bss table entry %p: essid didn't match",
+- priv->netdev->name, ptr);
+- return ret;
+-}
+-
+-static inline int at76_match_mode(struct at76_priv *priv, struct bss_info *ptr)
+-{
+- int ret;
+-
+- if (priv->iw_mode == IW_MODE_ADHOC)
+- ret = ptr->capa & WLAN_CAPABILITY_IBSS;
+- else
+- ret = ptr->capa & WLAN_CAPABILITY_ESS;
+- if (!ret)
+- at76_dbg(DBG_BSS_MATCH,
+- "%s bss table entry %p: mode didn't match",
+- priv->netdev->name, ptr);
+- return ret;
+-}
+-
+-static int at76_match_rates(struct at76_priv *priv, struct bss_info *ptr)
+-{
+- int i;
+-
+- for (i = 0; i < ptr->rates_len; i++) {
+- u8 rate = ptr->rates[i];
+-
+- if (!(rate & 0x80))
+- continue;
+-
+- /* this is a basic rate we have to support
+- (see IEEE802.11, ch. 7.3.2.2) */
+- if (rate != (0x80 | hw_rates[0])
+- && rate != (0x80 | hw_rates[1])
+- && rate != (0x80 | hw_rates[2])
+- && rate != (0x80 | hw_rates[3])) {
+- at76_dbg(DBG_BSS_MATCH,
+- "%s: bss table entry %p: basic rate %02x not "
+- "supported", priv->netdev->name, ptr, rate);
+- return 0;
+- }
+- }
+-
+- /* if we use short preamble, the bss must support it */
+- if (priv->preamble_type == PREAMBLE_TYPE_SHORT &&
+- !(ptr->capa & WLAN_CAPABILITY_SHORT_PREAMBLE)) {
+- at76_dbg(DBG_BSS_MATCH,
+- "%s: %p does not support short preamble",
+- priv->netdev->name, ptr);
+- return 0;
+- } else
+- return 1;
+-}
+-
+-static inline int at76_match_wep(struct at76_priv *priv, struct bss_info *ptr)
+-{
+- if (!priv->wep_enabled && ptr->capa & WLAN_CAPABILITY_PRIVACY) {
+- /* we have disabled WEP, but the BSS signals privacy */
+- at76_dbg(DBG_BSS_MATCH,
+- "%s: bss table entry %p: requires encryption",
+- priv->netdev->name, ptr);
+- return 0;
+- }
+- /* otherwise if the BSS does not signal privacy it may well
+- accept encrypted packets from us ... */
+- return 1;
+-}
+-
+-static inline int at76_match_bssid(struct at76_priv *priv, struct bss_info *ptr)
+-{
+- if (!priv->wanted_bssid_valid ||
+- !compare_ether_addr(ptr->bssid, priv->wanted_bssid))
+- return 1;
+-
+- at76_dbg(DBG_BSS_MATCH,
+- "%s: requested bssid - %s does not match",
+- priv->netdev->name, mac2str(priv->wanted_bssid));
+- at76_dbg(DBG_BSS_MATCH,
+- " AP bssid - %s of bss table entry %p",
+- mac2str(ptr->bssid), ptr);
+- return 0;
+-}
+-
+-/**
+- * at76_match_bss - try to find a matching bss in priv->bss
+- *
+- * last - last bss tried
+- *
+- * last == NULL signals a new round starting with priv->bss_list.next
+- * this function must be called inside an acquired priv->bss_list_spinlock
+- * otherwise the timeout on bss may remove the newly chosen entry
+- */
+-static struct bss_info *at76_match_bss(struct at76_priv *priv,
+- struct bss_info *last)
+-{
+- struct bss_info *ptr = NULL;
+- struct list_head *curr;
+-
+- curr = last ? last->list.next : priv->bss_list.next;
+- while (curr != &priv->bss_list) {
+- ptr = list_entry(curr, struct bss_info, list);
+- if (at76_match_essid(priv, ptr) && at76_match_mode(priv, ptr)
+- && at76_match_wep(priv, ptr) && at76_match_rates(priv, ptr)
+- && at76_match_bssid(priv, ptr))
+- break;
+- curr = curr->next;
+- }
+-
+- if (curr == &priv->bss_list)
+- ptr = NULL;
+- /* otherwise ptr points to the struct bss_info we have chosen */
+-
+- at76_dbg(DBG_BSS_TABLE, "%s %s: returned %p", priv->netdev->name,
+- __func__, ptr);
+- return ptr;
+-}
+-
+-/* Start joining a matching BSS, or create own IBSS */
+-static void at76_work_join(struct work_struct *work)
+-{
+- struct at76_priv *priv = container_of(work, struct at76_priv,
+- work_join);
+- int ret;
+- unsigned long flags;
+-
+- mutex_lock(&priv->mtx);
+-
+- WARN_ON(priv->mac_state != MAC_JOINING);
+- if (priv->mac_state != MAC_JOINING)
+- goto exit;
+-
+- /* secure the access to priv->curr_bss ! */
+- spin_lock_irqsave(&priv->bss_list_spinlock, flags);
+- priv->curr_bss = at76_match_bss(priv, priv->curr_bss);
+- spin_unlock_irqrestore(&priv->bss_list_spinlock, flags);
+-
+- if (!priv->curr_bss) {
+- /* here we haven't found a matching (i)bss ... */
+- if (priv->iw_mode == IW_MODE_ADHOC) {
+- at76_set_mac_state(priv, MAC_OWN_IBSS);
+- at76_start_ibss(priv);
+- goto exit;
+- }
+- /* haven't found a matching BSS in infra mode - try again */
+- at76_set_mac_state(priv, MAC_SCANNING);
+- schedule_work(&priv->work_start_scan);
+- goto exit;
+- }
+-
+- ret = at76_join_bss(priv, priv->curr_bss);
+- if (ret < 0) {
+- printk(KERN_ERR "%s: join_bss failed with %d\n",
+- priv->netdev->name, ret);
+- goto exit;
+- }
+-
+- ret = at76_wait_completion(priv, CMD_JOIN);
+- if (ret != CMD_STATUS_COMPLETE) {
+- if (ret != CMD_STATUS_TIME_OUT)
+- printk(KERN_ERR "%s: join_bss completed with %d\n",
+- priv->netdev->name, ret);
+- else
+- printk(KERN_INFO "%s: join_bss ssid %s timed out\n",
+- priv->netdev->name,
+- mac2str(priv->curr_bss->bssid));
+-
+- /* retry next BSS immediately */
+- schedule_work(&priv->work_join);
+- goto exit;
+- }
+-
+- /* here we have joined the (I)BSS */
+- if (priv->iw_mode == IW_MODE_ADHOC) {
+- struct bss_info *bptr = priv->curr_bss;
+- at76_set_mac_state(priv, MAC_CONNECTED);
+- /* get ESSID, BSSID and channel for priv->curr_bss */
+- priv->essid_size = bptr->ssid_len;
+- memcpy(priv->essid, bptr->ssid, bptr->ssid_len);
+- memcpy(priv->bssid, bptr->bssid, ETH_ALEN);
+- priv->channel = bptr->channel;
+- at76_iwevent_bss_connect(priv->netdev, bptr->bssid);
+- netif_carrier_on(priv->netdev);
+- netif_start_queue(priv->netdev);
+- /* just to be sure */
+- cancel_delayed_work(&priv->dwork_get_scan);
+- cancel_delayed_work(&priv->dwork_auth);
+- cancel_delayed_work(&priv->dwork_assoc);
+- } else {
+- /* send auth req */
+- priv->retries = AUTH_RETRIES;
+- at76_set_mac_state(priv, MAC_AUTH);
+- at76_auth_req(priv, priv->curr_bss, 1, NULL);
+- at76_dbg(DBG_MGMT_TIMER,
+- "%s:%d: starting mgmt_timer + HZ", __func__, __LINE__);
+- schedule_delayed_work(&priv->dwork_auth, AUTH_TIMEOUT);
+- }
+-
+-exit:
+- mutex_unlock(&priv->mtx);
+-}
+-
+-/* Reap scan results */
+-static void at76_dwork_get_scan(struct work_struct *work)
+-{
+- int status;
+- int ret;
+- struct at76_priv *priv = container_of(work, struct at76_priv,
+- dwork_get_scan.work);
+-
+- mutex_lock(&priv->mtx);
+- WARN_ON(priv->mac_state != MAC_SCANNING);
+- if (priv->mac_state != MAC_SCANNING)
+- goto exit;
+-
+- status = at76_get_cmd_status(priv->udev, CMD_SCAN);
+- if (status < 0) {
+- printk(KERN_ERR "%s: %s: at76_get_cmd_status failed with %d\n",
+- priv->netdev->name, __func__, status);
+- status = CMD_STATUS_IN_PROGRESS;
+- /* INFO: Hope it was a one off error - if not, scanning
+- further down the line and stop this cycle */
+- }
+- at76_dbg(DBG_PROGRESS,
+- "%s %s: got cmd_status %d (state %s, need_any %d)",
+- priv->netdev->name, __func__, status,
+- mac_states[priv->mac_state], priv->scan_need_any);
+-
+- if (status != CMD_STATUS_COMPLETE) {
+- if ((status != CMD_STATUS_IN_PROGRESS) &&
+- (status != CMD_STATUS_IDLE))
+- printk(KERN_ERR "%s: %s: Bad scan status: %s\n",
+- priv->netdev->name, __func__,
+- at76_get_cmd_status_string(status));
+-
+- /* the first cmd status after scan start is always a IDLE ->
+- start the timer to poll again until COMPLETED */
+- at76_dbg(DBG_MGMT_TIMER,
+- "%s:%d: starting mgmt_timer for %d ticks",
+- __func__, __LINE__, SCAN_POLL_INTERVAL);
+- schedule_delayed_work(&priv->dwork_get_scan,
+- SCAN_POLL_INTERVAL);
+- goto exit;
+- }
+-
+- if (at76_debug & DBG_BSS_TABLE)
+- at76_dump_bss_table(priv);
+-
+- if (priv->scan_need_any) {
+- ret = at76_start_scan(priv, 0);
+- if (ret < 0)
+- printk(KERN_ERR
+- "%s: %s: start_scan (ANY) failed with %d\n",
+- priv->netdev->name, __func__, ret);
+- at76_dbg(DBG_MGMT_TIMER,
+- "%s:%d: starting mgmt_timer for %d ticks", __func__,
+- __LINE__, SCAN_POLL_INTERVAL);
+- schedule_delayed_work(&priv->dwork_get_scan,
+- SCAN_POLL_INTERVAL);
+- priv->scan_need_any = 0;
+- } else {
+- priv->scan_state = SCAN_COMPLETED;
+- /* report the end of scan to user space */
+- at76_iwevent_scan_complete(priv->netdev);
+- at76_set_mac_state(priv, MAC_JOINING);
+- schedule_work(&priv->work_join);
+- }
+-
+-exit:
+- mutex_unlock(&priv->mtx);
+-}
+-
+-/* Handle loss of beacons from the AP */
+-static void at76_dwork_beacon(struct work_struct *work)
+-{
+- struct at76_priv *priv = container_of(work, struct at76_priv,
+- dwork_beacon.work);
+-
+- mutex_lock(&priv->mtx);
+- if (priv->mac_state != MAC_CONNECTED || priv->iw_mode != IW_MODE_INFRA)
+- goto exit;
+-
+- /* We haven't received any beacons from out AP for BEACON_TIMEOUT */
+- printk(KERN_INFO "%s: lost beacon bssid %s\n",
+- priv->netdev->name, mac2str(priv->curr_bss->bssid));
+-
+- netif_carrier_off(priv->netdev);
+- netif_stop_queue(priv->netdev);
+- at76_iwevent_bss_disconnect(priv->netdev);
+- at76_set_mac_state(priv, MAC_SCANNING);
+- schedule_work(&priv->work_start_scan);
+-
+-exit:
+- mutex_unlock(&priv->mtx);
+-}
+-
+-/* Handle authentication response timeout */
+-static void at76_dwork_auth(struct work_struct *work)
+-{
+- struct at76_priv *priv = container_of(work, struct at76_priv,
+- dwork_auth.work);
+-
+- mutex_lock(&priv->mtx);
+- WARN_ON(priv->mac_state != MAC_AUTH);
+- if (priv->mac_state != MAC_AUTH)
+- goto exit;
+-
+- at76_dbg(DBG_PROGRESS, "%s: authentication response timeout",
+- priv->netdev->name);
+-
+- if (priv->retries-- >= 0) {
+- at76_auth_req(priv, priv->curr_bss, 1, NULL);
+- at76_dbg(DBG_MGMT_TIMER, "%s:%d: starting mgmt_timer + HZ",
+- __func__, __LINE__);
+- schedule_delayed_work(&priv->dwork_auth, AUTH_TIMEOUT);
+- } else {
+- /* try to get next matching BSS */
+- at76_set_mac_state(priv, MAC_JOINING);
+- schedule_work(&priv->work_join);
+- }
+-
+-exit:
+- mutex_unlock(&priv->mtx);
+-}
+-
+-/* Handle association response timeout */
+-static void at76_dwork_assoc(struct work_struct *work)
+-{
+- struct at76_priv *priv = container_of(work, struct at76_priv,
+- dwork_assoc.work);
+-
+- mutex_lock(&priv->mtx);
+- WARN_ON(priv->mac_state != MAC_ASSOC);
+- if (priv->mac_state != MAC_ASSOC)
+- goto exit;
+-
+- at76_dbg(DBG_PROGRESS, "%s: association response timeout",
+- priv->netdev->name);
+-
+- if (priv->retries-- >= 0) {
+- at76_assoc_req(priv, priv->curr_bss);
+- at76_dbg(DBG_MGMT_TIMER, "%s:%d: starting mgmt_timer + HZ",
+- __func__, __LINE__);
+- schedule_delayed_work(&priv->dwork_assoc, ASSOC_TIMEOUT);
+- } else {
+- /* try to get next matching BSS */
+- at76_set_mac_state(priv, MAC_JOINING);
+- schedule_work(&priv->work_join);
+- }
+-
+-exit:
+- mutex_unlock(&priv->mtx);
++ dev_printk(KERN_ERR, &udev->dev,
++ "downloading external firmware failed: %d\n", ret);
++ return ret;
+ }
+
+-/* Read new bssid in ad-hoc mode */
+-static void at76_work_new_bss(struct work_struct *work)
++/* Download internal firmware */
++static int at76_load_internal_fw(struct usb_device *udev, struct fwentry *fwe)
+ {
+- struct at76_priv *priv = container_of(work, struct at76_priv,
+- work_new_bss);
+ int ret;
+- struct mib_mac_mgmt mac_mgmt;
++ int need_remap = !at76_is_505a(fwe->board_type);
+
+- mutex_lock(&priv->mtx);
++ ret = at76_usbdfu_download(udev, fwe->intfw, fwe->intfw_size,
++ need_remap ? 0 : 2 * HZ);
+
+- ret = at76_get_mib(priv->udev, MIB_MAC_MGMT, &mac_mgmt,
+- sizeof(struct mib_mac_mgmt));
+ if (ret < 0) {
+- printk(KERN_ERR "%s: at76_get_mib failed: %d\n",
+- priv->netdev->name, ret);
++ dev_printk(KERN_ERR, &udev->dev,
++ "downloading internal fw failed with %d\n", ret);
+ goto exit;
+ }
+
+- at76_dbg(DBG_PROGRESS, "ibss_change = 0x%2x", mac_mgmt.ibss_change);
+- memcpy(priv->bssid, mac_mgmt.current_bssid, ETH_ALEN);
+- at76_dbg(DBG_PROGRESS, "using BSSID %s", mac2str(priv->bssid));
+-
+- at76_iwevent_bss_connect(priv->netdev, priv->bssid);
++ at76_dbg(DBG_DEVSTART, "sending REMAP");
+
+- priv->mib_buf.type = MIB_MAC_MGMT;
+- priv->mib_buf.size = 1;
+- priv->mib_buf.index = offsetof(struct mib_mac_mgmt, ibss_change);
+- priv->mib_buf.data.byte = 0;
++ /* no REMAP for 505A (see SF driver) */
++ if (need_remap) {
++ ret = at76_remap(udev);
++ if (ret < 0) {
++ dev_printk(KERN_ERR, &udev->dev,
++ "sending REMAP failed with %d\n", ret);
++ goto exit;
++ }
++ }
+
+- ret = at76_set_mib(priv, &priv->mib_buf);
+- if (ret < 0)
+- printk(KERN_ERR "%s: set_mib (ibss change ok) failed: %d\n",
+- priv->netdev->name, ret);
++ at76_dbg(DBG_DEVSTART, "sleeping for 2 seconds");
++ schedule_timeout_interruptible(2 * HZ + 1);
++ usb_reset_device(udev);
+
+ exit:
+- mutex_unlock(&priv->mtx);
++ return ret;
+ }
+
+ static int at76_startup_device(struct at76_priv *priv)
+@@ -3905,14 +1470,14 @@
+
+ at76_dbg(DBG_PARAMS,
+ "%s param: ssid %.*s (%s) mode %s ch %d wep %s key %d "
+- "keylen %d", priv->netdev->name, priv->essid_size, priv->essid,
+- hex2str(priv->essid, IW_ESSID_MAX_SIZE),
++ "keylen %d", wiphy_name(priv->hw->wiphy), priv->essid_size,
++ priv->essid, hex2str(priv->essid, IW_ESSID_MAX_SIZE),
+ priv->iw_mode == IW_MODE_ADHOC ? "adhoc" : "infra",
+ priv->channel, priv->wep_enabled ? "enabled" : "disabled",
+ priv->wep_key_id, priv->wep_keys_len[priv->wep_key_id]);
+ at76_dbg(DBG_PARAMS,
+ "%s param: preamble %s rts %d retry %d frag %d "
+- "txrate %s auth_mode %d", priv->netdev->name,
++ "txrate %s auth_mode %d", wiphy_name(priv->hw->wiphy),
+ preambles[priv->preamble_type], priv->rts_threshold,
+ priv->short_retry_limit, priv->frag_threshold,
+ priv->txrate == TX_RATE_1MBIT ? "1MBit" : priv->txrate ==
+@@ -3923,7 +1488,7 @@
+ at76_dbg(DBG_PARAMS,
+ "%s param: pm_mode %d pm_period %d auth_mode %s "
+ "scan_times %d %d scan_mode %s",
+- priv->netdev->name, priv->pm_mode, priv->pm_period,
++ wiphy_name(priv->hw->wiphy), priv->pm_mode, priv->pm_period,
+ priv->auth_mode == WLAN_AUTH_OPEN ? "open" : "shared_secret",
+ priv->scan_min_time, priv->scan_max_time,
+ priv->scan_mode == SCAN_TYPE_ACTIVE ? "active" : "passive");
+@@ -3957,7 +1522,8 @@
+ ccfg->ssid_len = priv->essid_size;
+
+ ccfg->wep_default_key_id = priv->wep_key_id;
+- memcpy(ccfg->wep_default_key_value, priv->wep_keys, 4 * WEP_KEY_LEN);
++ memcpy(ccfg->wep_default_key_value, priv->wep_keys,
++ sizeof(priv->wep_keys));
+
+ ccfg->short_preamble = priv->preamble_type;
+ ccfg->beacon_period = cpu_to_le16(priv->beacon_period);
+@@ -3966,7 +1532,7 @@
+ sizeof(struct at76_card_config));
+ if (ret < 0) {
+ printk(KERN_ERR "%s: at76_set_card_command failed: %d\n",
+- priv->netdev->name, ret);
++ wiphy_name(priv->hw->wiphy), ret);
+ return ret;
+ }
+
+@@ -4012,69 +1578,6 @@
+ return 0;
+ }
+
+-/* Restart the interface */
+-static void at76_dwork_restart(struct work_struct *work)
+-{
+- struct at76_priv *priv = container_of(work, struct at76_priv,
+- dwork_restart.work);
+-
+- mutex_lock(&priv->mtx);
+-
+- netif_carrier_off(priv->netdev); /* stop netdev watchdog */
+- netif_stop_queue(priv->netdev); /* stop tx data packets */
+-
+- at76_startup_device(priv);
+-
+- if (priv->iw_mode != IW_MODE_MONITOR) {
+- priv->netdev->type = ARPHRD_ETHER;
+- at76_set_mac_state(priv, MAC_SCANNING);
+- schedule_work(&priv->work_start_scan);
+- } else {
+- priv->netdev->type = ARPHRD_IEEE80211_RADIOTAP;
+- at76_start_monitor(priv);
+- }
+-
+- mutex_unlock(&priv->mtx);
+-}
+-
+-/* Initiate scanning */
+-static void at76_work_start_scan(struct work_struct *work)
+-{
+- struct at76_priv *priv = container_of(work, struct at76_priv,
+- work_start_scan);
+- int ret;
+-
+- mutex_lock(&priv->mtx);
+-
+- WARN_ON(priv->mac_state != MAC_SCANNING);
+- if (priv->mac_state != MAC_SCANNING)
+- goto exit;
+-
+- /* only clear the bss list when a scan is actively initiated,
+- * otherwise simply rely on at76_bss_list_timeout */
+- if (priv->scan_state == SCAN_IN_PROGRESS) {
+- at76_free_bss_list(priv);
+- priv->scan_need_any = 1;
+- } else
+- priv->scan_need_any = 0;
+-
+- ret = at76_start_scan(priv, 1);
+-
+- if (ret < 0)
+- printk(KERN_ERR "%s: %s: start_scan failed with %d\n",
+- priv->netdev->name, __func__, ret);
+- else {
+- at76_dbg(DBG_MGMT_TIMER,
+- "%s:%d: starting mgmt_timer for %d ticks",
+- __func__, __LINE__, SCAN_POLL_INTERVAL);
+- schedule_delayed_work(&priv->dwork_get_scan,
+- SCAN_POLL_INTERVAL);
+- }
+-
+-exit:
+- mutex_unlock(&priv->mtx);
+-}
+-
+ /* Enable or disable promiscuous mode */
+ static void at76_work_set_promisc(struct work_struct *work)
+ {
+@@ -4092,7 +1595,7 @@
+ ret = at76_set_mib(priv, &priv->mib_buf);
+ if (ret < 0)
+ printk(KERN_ERR "%s: set_mib (promiscuous_mode) failed: %d\n",
+- priv->netdev->name, ret);
++ wiphy_name(priv->hw->wiphy), ret);
+
+ mutex_unlock(&priv->mtx);
+ }
+@@ -4108,1088 +1611,759 @@
+ mutex_unlock(&priv->mtx);
+ }
+
+-/* We got an association response */
+-static void at76_rx_mgmt_assoc(struct at76_priv *priv,
+- struct at76_rx_buffer *buf)
+-{
+- struct ieee80211_assoc_response *resp =
+- (struct ieee80211_assoc_response *)buf->packet;
+- u16 assoc_id = le16_to_cpu(resp->aid);
+- u16 status = le16_to_cpu(resp->status);
+-
+- at76_dbg(DBG_RX_MGMT, "%s: rx AssocResp bssid %s capa 0x%04x status "
+- "0x%04x assoc_id 0x%04x rates %s", priv->netdev->name,
+- mac2str(resp->header.addr3), le16_to_cpu(resp->capability),
+- status, assoc_id, hex2str(resp->info_element->data,
+- resp->info_element->len));
+-
+- if (priv->mac_state != MAC_ASSOC) {
+- printk(KERN_INFO "%s: AssocResp in state %s ignored\n",
+- priv->netdev->name, mac_states[priv->mac_state]);
++static void at76_rx_tasklet(unsigned long param)
++{
++ struct urb *urb = (struct urb *)param;
++ struct at76_priv *priv = urb->context;
++ struct at76_rx_buffer *buf;
++ struct ieee80211_rx_status rx_status = { 0 };
++
++ if (priv->device_unplugged) {
++ at76_dbg(DBG_DEVSTART, "device unplugged");
++ if (urb)
++ at76_dbg(DBG_DEVSTART, "urb status %d", urb->status);
+ return;
+ }
+
+- BUG_ON(!priv->curr_bss);
++ if (!priv->rx_skb || !priv->rx_skb->data)
++ return;
+
+- cancel_delayed_work(&priv->dwork_assoc);
+- if (status == WLAN_STATUS_SUCCESS) {
+- struct bss_info *ptr = priv->curr_bss;
+- priv->assoc_id = assoc_id & 0x3fff;
+- /* update iwconfig params */
+- memcpy(priv->bssid, ptr->bssid, ETH_ALEN);
+- memcpy(priv->essid, ptr->ssid, ptr->ssid_len);
+- priv->essid_size = ptr->ssid_len;
+- priv->channel = ptr->channel;
+- schedule_work(&priv->work_assoc_done);
+- } else {
+- at76_set_mac_state(priv, MAC_JOINING);
+- schedule_work(&priv->work_join);
++ buf = (struct at76_rx_buffer *)priv->rx_skb->data;
++
++ if (urb->status != 0) {
++ if (urb->status != -ENOENT && urb->status != -ECONNRESET)
++ at76_dbg(DBG_URB,
++ "%s %s: - nonzero Rx bulk status received: %d",
++ __func__, wiphy_name(priv->hw->wiphy),
++ urb->status);
++ return;
+ }
++
++ at76_dbg(DBG_RX_ATMEL_HDR,
++ "%s: rx frame: rate %d rssi %d noise %d link %d",
++ wiphy_name(priv->hw->wiphy), buf->rx_rate, buf->rssi,
++ buf->noise_level, buf->link_quality);
++
++ skb_trim(priv->rx_skb, le16_to_cpu(buf->wlength) + AT76_RX_HDRLEN);
++ at76_dbg_dump(DBG_RX_DATA, &priv->rx_skb->data[AT76_RX_HDRLEN],
++ priv->rx_skb->len, "RX: len=%d",
++ (int)(priv->rx_skb->len - AT76_RX_HDRLEN));
++
++ rx_status.signal = buf->rssi;
++ /* FIXME: is rate_idx still present in structure? */
++ rx_status.rate_idx = buf->rx_rate;
++ rx_status.flag |= RX_FLAG_DECRYPTED;
++ rx_status.flag |= RX_FLAG_IV_STRIPPED;
++
++ skb_pull(priv->rx_skb, AT76_RX_HDRLEN);
++ at76_dbg(DBG_MAC80211, "calling ieee80211_rx_irqsafe(): %d/%d",
++ priv->rx_skb->len, priv->rx_skb->data_len);
++ ieee80211_rx_irqsafe(priv->hw, priv->rx_skb, &rx_status);
++
++ /* Use a new skb for the next receive */
++ priv->rx_skb = NULL;
++
++ at76_submit_rx_urb(priv);
+ }
+
+-/* Process disassociation request from the AP */
+-static void at76_rx_mgmt_disassoc(struct at76_priv *priv,
+- struct at76_rx_buffer *buf)
++/* Load firmware into kernel memory and parse it */
++static struct fwentry *at76_load_firmware(struct usb_device *udev,
++ enum board_type board_type)
+ {
+- struct ieee80211_disassoc *resp =
+- (struct ieee80211_disassoc *)buf->packet;
+- struct ieee80211_hdr_3addr *mgmt = &resp->header;
++ int ret;
++ char *str;
++ struct at76_fw_header *fwh;
++ struct fwentry *fwe = &firmwares[board_type];
+
+- at76_dbg(DBG_RX_MGMT,
+- "%s: rx DisAssoc bssid %s reason 0x%04x destination %s",
+- priv->netdev->name, mac2str(mgmt->addr3),
+- le16_to_cpu(resp->reason), mac2str(mgmt->addr1));
++ mutex_lock(&fw_mutex);
+
+- /* We are not connected, ignore */
+- if (priv->mac_state == MAC_SCANNING || priv->mac_state == MAC_INIT
+- || !priv->curr_bss)
+- return;
++ if (fwe->loaded) {
++ at76_dbg(DBG_FW, "re-using previously loaded fw");
++ goto exit;
++ }
+
+- /* Not our BSSID, ignore */
+- if (compare_ether_addr(mgmt->addr3, priv->curr_bss->bssid))
+- return;
++ at76_dbg(DBG_FW, "downloading firmware %s", fwe->fwname);
++ ret = request_firmware(&fwe->fw, fwe->fwname, &udev->dev);
++ if (ret < 0) {
++ dev_printk(KERN_ERR, &udev->dev, "firmware %s not found!\n",
++ fwe->fwname);
++ dev_printk(KERN_ERR, &udev->dev,
++ "you may need to download the firmware from "
++ "http://developer.berlios.de/projects/at76c503a/\n");
++ goto exit;
++ }
+
+- /* Not for our STA and not broadcast, ignore */
+- if (compare_ether_addr(priv->netdev->dev_addr, mgmt->addr1)
+- && !is_broadcast_ether_addr(mgmt->addr1))
+- return;
++ at76_dbg(DBG_FW, "got it.");
++ fwh = (struct at76_fw_header *)(fwe->fw->data);
+
+- if (priv->mac_state != MAC_ASSOC && priv->mac_state != MAC_CONNECTED
+- && priv->mac_state != MAC_JOINING) {
+- printk(KERN_INFO "%s: DisAssoc in state %s ignored\n",
+- priv->netdev->name, mac_states[priv->mac_state]);
+- return;
++ if (fwe->fw->size <= sizeof(*fwh)) {
++ dev_printk(KERN_ERR, &udev->dev,
++ "firmware is too short (0x%zx)\n", fwe->fw->size);
++ goto exit;
+ }
+
+- if (priv->mac_state == MAC_CONNECTED) {
+- netif_carrier_off(priv->netdev);
+- netif_stop_queue(priv->netdev);
+- at76_iwevent_bss_disconnect(priv->netdev);
+- }
+- cancel_delayed_work(&priv->dwork_get_scan);
+- cancel_delayed_work(&priv->dwork_beacon);
+- cancel_delayed_work(&priv->dwork_auth);
+- cancel_delayed_work(&priv->dwork_assoc);
+- at76_set_mac_state(priv, MAC_JOINING);
+- schedule_work(&priv->work_join);
+-}
+-
+-static void at76_rx_mgmt_auth(struct at76_priv *priv,
+- struct at76_rx_buffer *buf)
+-{
+- struct ieee80211_auth *resp = (struct ieee80211_auth *)buf->packet;
+- struct ieee80211_hdr_3addr *mgmt = &resp->header;
+- int seq_nr = le16_to_cpu(resp->transaction);
+- int alg = le16_to_cpu(resp->algorithm);
+- int status = le16_to_cpu(resp->status);
+-
+- at76_dbg(DBG_RX_MGMT,
+- "%s: rx AuthFrame bssid %s alg %d seq_nr %d status %d "
+- "destination %s", priv->netdev->name, mac2str(mgmt->addr3),
+- alg, seq_nr, status, mac2str(mgmt->addr1));
+-
+- if (alg == WLAN_AUTH_SHARED_KEY && seq_nr == 2)
+- at76_dbg(DBG_RX_MGMT, "%s: AuthFrame challenge %s ...",
+- priv->netdev->name, hex2str(resp->info_element, 18));
+-
+- if (priv->mac_state != MAC_AUTH) {
+- printk(KERN_INFO "%s: ignored AuthFrame in state %s\n",
+- priv->netdev->name, mac_states[priv->mac_state]);
+- return;
+- }
+- if (priv->auth_mode != alg) {
+- printk(KERN_INFO "%s: ignored AuthFrame for alg %d\n",
+- priv->netdev->name, alg);
+- return;
++ /* CRC currently not checked */
++ fwe->board_type = le32_to_cpu(fwh->board_type);
++ if (fwe->board_type != board_type) {
++ dev_printk(KERN_ERR, &udev->dev,
++ "board type mismatch, requested %u, got %u\n",
++ board_type, fwe->board_type);
++ goto exit;
+ }
+
+- BUG_ON(!priv->curr_bss);
++ fwe->fw_version.major = fwh->major;
++ fwe->fw_version.minor = fwh->minor;
++ fwe->fw_version.patch = fwh->patch;
++ fwe->fw_version.build = fwh->build;
+
+- /* Not our BSSID or not for our STA, ignore */
+- if (compare_ether_addr(mgmt->addr3, priv->curr_bss->bssid)
+- || compare_ether_addr(priv->netdev->dev_addr, mgmt->addr1))
+- return;
++ str = (char *)fwh + le32_to_cpu(fwh->str_offset);
++ fwe->intfw = (u8 *)fwh + le32_to_cpu(fwh->int_fw_offset);
++ fwe->intfw_size = le32_to_cpu(fwh->int_fw_len);
++ fwe->extfw = (u8 *)fwh + le32_to_cpu(fwh->ext_fw_offset);
++ fwe->extfw_size = le32_to_cpu(fwh->ext_fw_len);
+
+- cancel_delayed_work(&priv->dwork_auth);
+- if (status != WLAN_STATUS_SUCCESS) {
+- /* try to join next bss */
+- at76_set_mac_state(priv, MAC_JOINING);
+- schedule_work(&priv->work_join);
+- return;
+- }
++ fwe->loaded = 1;
+
+- if (priv->auth_mode == WLAN_AUTH_OPEN || seq_nr == 4) {
+- priv->retries = ASSOC_RETRIES;
+- at76_set_mac_state(priv, MAC_ASSOC);
+- at76_assoc_req(priv, priv->curr_bss);
+- at76_dbg(DBG_MGMT_TIMER,
+- "%s:%d: starting mgmt_timer + HZ", __func__, __LINE__);
+- schedule_delayed_work(&priv->dwork_assoc, ASSOC_TIMEOUT);
+- return;
+- }
++ dev_printk(KERN_DEBUG, &udev->dev,
++ "using firmware %s (version %d.%d.%d-%d)\n",
++ fwe->fwname, fwh->major, fwh->minor, fwh->patch, fwh->build);
+
+- WARN_ON(seq_nr != 2);
+- at76_auth_req(priv, priv->curr_bss, seq_nr + 1, resp->info_element);
+- at76_dbg(DBG_MGMT_TIMER, "%s:%d: starting mgmt_timer + HZ", __func__,
+- __LINE__);
+- schedule_delayed_work(&priv->dwork_auth, AUTH_TIMEOUT);
+-}
+-
+-static void at76_rx_mgmt_deauth(struct at76_priv *priv,
+- struct at76_rx_buffer *buf)
+-{
+- struct ieee80211_disassoc *resp =
+- (struct ieee80211_disassoc *)buf->packet;
+- struct ieee80211_hdr_3addr *mgmt = &resp->header;
+-
+- at76_dbg(DBG_RX_MGMT | DBG_PROGRESS,
+- "%s: rx DeAuth bssid %s reason 0x%04x destination %s",
+- priv->netdev->name, mac2str(mgmt->addr3),
+- le16_to_cpu(resp->reason), mac2str(mgmt->addr1));
+-
+- if (priv->mac_state != MAC_AUTH && priv->mac_state != MAC_ASSOC
+- && priv->mac_state != MAC_CONNECTED) {
+- printk(KERN_INFO "%s: DeAuth in state %s ignored\n",
+- priv->netdev->name, mac_states[priv->mac_state]);
+- return;
+- }
++ at76_dbg(DBG_DEVSTART, "board %u, int %d:%d, ext %d:%d", board_type,
++ le32_to_cpu(fwh->int_fw_offset), le32_to_cpu(fwh->int_fw_len),
++ le32_to_cpu(fwh->ext_fw_offset), le32_to_cpu(fwh->ext_fw_len));
++ at76_dbg(DBG_DEVSTART, "firmware id %s", str);
+
+- BUG_ON(!priv->curr_bss);
++exit:
++ mutex_unlock(&fw_mutex);
+
+- /* Not our BSSID, ignore */
+- if (compare_ether_addr(mgmt->addr3, priv->curr_bss->bssid))
+- return;
++ if (fwe->loaded)
++ return fwe;
++ else
++ return NULL;
++}
+
+- /* Not for our STA and not broadcast, ignore */
+- if (compare_ether_addr(priv->netdev->dev_addr, mgmt->addr1)
+- && !is_broadcast_ether_addr(mgmt->addr1))
+- return;
++static void at76_mac80211_tx_callback(struct urb *urb)
++{
++ struct at76_priv *priv = urb->context;
++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(priv->tx_skb);
+
+- if (priv->mac_state == MAC_CONNECTED)
+- at76_iwevent_bss_disconnect(priv->netdev);
++ at76_dbg(DBG_MAC80211, "%s()", __func__);
+
+- at76_set_mac_state(priv, MAC_JOINING);
+- schedule_work(&priv->work_join);
+- cancel_delayed_work(&priv->dwork_get_scan);
+- cancel_delayed_work(&priv->dwork_beacon);
+- cancel_delayed_work(&priv->dwork_auth);
+- cancel_delayed_work(&priv->dwork_assoc);
+-}
+-
+-static void at76_rx_mgmt_beacon(struct at76_priv *priv,
+- struct at76_rx_buffer *buf)
+-{
+- int varpar_len;
+- /* beacon content */
+- struct ieee80211_beacon *bdata = (struct ieee80211_beacon *)buf->packet;
+- struct ieee80211_hdr_3addr *mgmt = &bdata->header;
+-
+- struct list_head *lptr;
+- struct bss_info *match; /* entry matching addr3 with its bssid */
+- int new_entry = 0;
+- int len;
+- struct ieee80211_info_element *ie;
+- int have_ssid = 0;
+- int have_rates = 0;
+- int have_channel = 0;
+- int keep_going = 1;
+- unsigned long flags;
+-
+- spin_lock_irqsave(&priv->bss_list_spinlock, flags);
+- if (priv->mac_state == MAC_CONNECTED) {
+- /* in state MAC_CONNECTED we use the mgmt_timer to control
+- the beacon of the BSS */
+- BUG_ON(!priv->curr_bss);
+-
+- if (!compare_ether_addr(priv->curr_bss->bssid, mgmt->addr3)) {
+- /* We got our AP's beacon, defer the timeout handler.
+- Kill pending work first, as schedule_delayed_work()
+- won't do it. */
+- cancel_delayed_work(&priv->dwork_beacon);
+- schedule_delayed_work(&priv->dwork_beacon,
+- BEACON_TIMEOUT);
+- priv->curr_bss->rssi = buf->rssi;
+- priv->beacons_received++;
+- goto exit;
+- }
++ switch (urb->status) {
++ case 0:
++ /* success */
++ /* FIXME:
++ * is the frame really ACKed when tx_callback is called ? */
++ info->flags |= IEEE80211_TX_STAT_ACK;
++ break;
++ case -ENOENT:
++ case -ECONNRESET:
++ /* fail, urb has been unlinked */
++ /* FIXME: add error message */
++ break;
++ default:
++ at76_dbg(DBG_URB, "%s - nonzero tx status received: %d",
++ __func__, urb->status);
++ break;
+ }
+
+- /* look if we have this BSS already in the list */
+- match = NULL;
++ memset(&info->status, 0, sizeof(info->status));
+
+- if (!list_empty(&priv->bss_list)) {
+- list_for_each(lptr, &priv->bss_list) {
+- struct bss_info *bss_ptr =
+- list_entry(lptr, struct bss_info, list);
+- if (!compare_ether_addr(bss_ptr->bssid, mgmt->addr3)) {
+- match = bss_ptr;
+- break;
+- }
+- }
++ ieee80211_tx_status_irqsafe(priv->hw, priv->tx_skb);
++
++ priv->tx_skb = NULL;
++
++ ieee80211_wake_queues(priv->hw);
++}
++
++static int at76_mac80211_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
++{
++ struct at76_priv *priv = hw->priv;
++ struct at76_tx_buffer *tx_buffer = priv->bulk_out_buffer;
++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
++ int padding, submit_len, ret;
++
++ at76_dbg(DBG_MAC80211, "%s()", __func__);
++
++ if (priv->tx_urb->status == -EINPROGRESS) {
++ printk(KERN_ERR "%s: %s called while tx urb is pending\n",
++ wiphy_name(priv->hw->wiphy), __func__);
++ return NETDEV_TX_BUSY;
+ }
+
+- if (!match) {
+- /* BSS not in the list - append it */
+- match = kzalloc(sizeof(struct bss_info), GFP_ATOMIC);
+- if (!match) {
+- at76_dbg(DBG_BSS_TABLE,
+- "%s: cannot kmalloc new bss info (%zd byte)",
+- priv->netdev->name, sizeof(struct bss_info));
+- goto exit;
+- }
+- new_entry = 1;
+- list_add_tail(&match->list, &priv->bss_list);
++ ieee80211_stop_queues(hw);
++
++ at76_ledtrig_tx_activity(); /* tell ledtrigger we send a packet */
++
++ WARN_ON(priv->tx_skb != NULL);
++
++ priv->tx_skb = skb;
++ padding = at76_calc_padding(skb->len);
++ submit_len = AT76_TX_HDRLEN + skb->len + padding;
++
++ /* setup 'Atmel' header */
++ memset(tx_buffer, 0, sizeof(*tx_buffer));
++ tx_buffer->padding = padding;
++ tx_buffer->wlength = cpu_to_le16(skb->len);
++ tx_buffer->tx_rate = ieee80211_get_tx_rate(hw, info)->hw_value;
++ if (FIRMWARE_IS_WPA(priv->fw_version) && info->control.hw_key) {
++ tx_buffer->key_id = (info->control.hw_key->keyidx);
++ tx_buffer->cipher_type =
++ priv->keys[info->control.hw_key->keyidx].cipher;
++ tx_buffer->cipher_length =
++ priv->keys[info->control.hw_key->keyidx].keylen;
++ tx_buffer->reserved = 0;
++ } else {
++ tx_buffer->key_id = 0;
++ tx_buffer->cipher_type = 0;
++ tx_buffer->cipher_length = 0;
++ tx_buffer->reserved = 0;
++ };
++ /* memset(tx_buffer->reserved, 0, sizeof(tx_buffer->reserved)); */
++ memcpy(tx_buffer->packet, skb->data, skb->len);
++
++ at76_dbg(DBG_TX_DATA, "%s tx: wlen 0x%x pad 0x%x rate %d hdr",
++ wiphy_name(priv->hw->wiphy), le16_to_cpu(tx_buffer->wlength),
++ tx_buffer->padding, tx_buffer->tx_rate);
++
++ /* send stuff */
++ at76_dbg_dump(DBG_TX_DATA_CONTENT, tx_buffer, submit_len,
++ "%s(): tx_buffer %d bytes:", __func__, submit_len);
++ usb_fill_bulk_urb(priv->tx_urb, priv->udev, priv->tx_pipe, tx_buffer,
++ submit_len, at76_mac80211_tx_callback, priv);
++ ret = usb_submit_urb(priv->tx_urb, GFP_ATOMIC);
++ if (ret) {
++ printk(KERN_ERR "%s: error in tx submit urb: %d\n",
++ wiphy_name(priv->hw->wiphy), ret);
++ if (ret == -EINVAL)
++ printk(KERN_ERR
++ "%s: -EINVAL: tx urb %p hcpriv %p complete %p\n",
++ wiphy_name(priv->hw->wiphy), priv->tx_urb,
++ priv->tx_urb->hcpriv, priv->tx_urb->complete);
+ }
+
+- match->capa = le16_to_cpu(bdata->capability);
+- match->beacon_interval = le16_to_cpu(bdata->beacon_interval);
+- match->rssi = buf->rssi;
+- match->link_qual = buf->link_quality;
+- match->noise_level = buf->noise_level;
+- memcpy(match->bssid, mgmt->addr3, ETH_ALEN);
+- at76_dbg(DBG_RX_BEACON, "%s: bssid %s", priv->netdev->name,
+- mac2str(match->bssid));
+-
+- ie = bdata->info_element;
+-
+- /* length of var length beacon parameters */
+- varpar_len = min_t(int, le16_to_cpu(buf->wlength) -
+- sizeof(struct ieee80211_beacon),
+- BEACON_MAX_DATA_LENGTH);
+-
+- /* This routine steps through the bdata->data array to get
+- * some useful information about the access point.
+- * Currently, this implementation supports receipt of: SSID,
+- * supported transfer rates and channel, in any order, with some
+- * tolerance for intermittent unknown codes (although this
+- * functionality may not be necessary as the useful information will
+- * usually arrive in consecutively, but there have been some
+- * reports of some of the useful information fields arriving in a
+- * different order).
+- * It does not support any more IE types although MFIE_TYPE_TIM may
+- * be supported (on my AP at least).
+- * The bdata->data array is about 1500 bytes long but only ~36 of those
+- * bytes are useful, hence the have_ssid etc optimizations. */
+-
+- while (keep_going &&
+- ((&ie->data[ie->len] - (u8 *)bdata->info_element) <=
+- varpar_len)) {
++ return 0;
++}
+
+- switch (ie->id) {
++static int at76_mac80211_start(struct ieee80211_hw *hw)
++{
++ struct at76_priv *priv = hw->priv;
++ int ret;
+
+- case MFIE_TYPE_SSID:
+- if (have_ssid)
+- break;
++ at76_dbg(DBG_MAC80211, "%s()", __func__);
+
+- len = min_t(int, IW_ESSID_MAX_SIZE, ie->len);
++ mutex_lock(&priv->mtx);
+
+- /* we copy only if this is a new entry,
+- or the incoming SSID is not a hidden SSID. This
+- will protect us from overwriting a real SSID read
+- in a ProbeResponse with a hidden one from a
+- following beacon. */
+- if (!new_entry && at76_is_hidden_ssid(ie->data, len)) {
+- have_ssid = 1;
+- break;
+- }
++ ret = at76_submit_rx_urb(priv);
++ if (ret < 0) {
++ printk(KERN_ERR "%s: open: submit_rx_urb failed: %d\n",
++ wiphy_name(priv->hw->wiphy), ret);
++ goto error;
++ }
+
+- match->ssid_len = len;
+- memcpy(match->ssid, ie->data, len);
+- at76_dbg(DBG_RX_BEACON, "%s: SSID - %.*s",
+- priv->netdev->name, len, match->ssid);
+- have_ssid = 1;
+- break;
++ at76_startup_device(priv);
+
+- case MFIE_TYPE_RATES:
+- if (have_rates)
+- break;
++ at76_start_monitor(priv);
+
+- match->rates_len =
+- min_t(int, sizeof(match->rates), ie->len);
+- memcpy(match->rates, ie->data, match->rates_len);
+- have_rates = 1;
+- at76_dbg(DBG_RX_BEACON, "%s: SUPPORTED RATES %s",
+- priv->netdev->name,
+- hex2str(ie->data, ie->len));
+- break;
++error:
++ mutex_unlock(&priv->mtx);
+
+- case MFIE_TYPE_DS_SET:
+- if (have_channel)
+- break;
++ return 0;
++}
+
+- match->channel = ie->data[0];
+- have_channel = 1;
+- at76_dbg(DBG_RX_BEACON, "%s: CHANNEL - %d",
+- priv->netdev->name, match->channel);
+- break;
++static void at76_mac80211_stop(struct ieee80211_hw *hw)
++{
++ struct at76_priv *priv = hw->priv;
+
+- case MFIE_TYPE_CF_SET:
+- case MFIE_TYPE_TIM:
+- case MFIE_TYPE_IBSS_SET:
+- default:
+- at76_dbg(DBG_RX_BEACON, "%s: beacon IE id %d len %d %s",
+- priv->netdev->name, ie->id, ie->len,
+- hex2str(ie->data, ie->len));
+- break;
+- }
++ at76_dbg(DBG_MAC80211, "%s()", __func__);
+
+- /* advance to the next informational element */
+- next_ie(&ie);
++ mutex_lock(&priv->mtx);
++
++ if (!priv->device_unplugged) {
++ /* We are called by "ifconfig ethX down", not because the
++ * device is not available anymore. */
++ if (at76_set_radio(priv, 0) == 1)
++ at76_wait_completion(priv, CMD_RADIO_ON);
++
++ /* We unlink rx_urb because at76_open() re-submits it.
++ * If unplugged, at76_delete_device() takes care of it. */
++ usb_kill_urb(priv->rx_urb);
++ }
++
++ mutex_unlock(&priv->mtx);
++}
++
++static int at76_add_interface(struct ieee80211_hw *hw,
++ struct ieee80211_if_init_conf *conf)
++{
++ struct at76_priv *priv = hw->priv;
++ int ret = 0;
+
+- /* Optimization: after all, the bdata->data array is
+- * varpar_len bytes long, whereas we get all of the useful
+- * information after only ~36 bytes, this saves us a lot of
+- * time (and trouble as the remaining portion of the array
+- * could be full of junk)
+- * Comment this out if you want to see what other information
+- * comes from the AP - although little of it may be useful */
+- }
++ at76_dbg(DBG_MAC80211, "%s()", __func__);
+
+- at76_dbg(DBG_RX_BEACON, "%s: Finished processing beacon data",
+- priv->netdev->name);
++ mutex_lock(&priv->mtx);
+
+- match->last_rx = jiffies; /* record last rx of beacon */
++ switch (conf->type) {
++ case NL80211_IFTYPE_STATION:
++ priv->iw_mode = IW_MODE_INFRA;
++ break;
++ default:
++ ret = -EOPNOTSUPP;
++ goto exit;
++ }
+
+ exit:
+- spin_unlock_irqrestore(&priv->bss_list_spinlock, flags);
++ mutex_unlock(&priv->mtx);
++
++ return ret;
+ }
+
+-/* Calculate the link level from a given rx_buffer */
+-static void at76_calc_level(struct at76_priv *priv, struct at76_rx_buffer *buf,
+- struct iw_quality *qual)
++static void at76_remove_interface(struct ieee80211_hw *hw,
++ struct ieee80211_if_init_conf *conf)
+ {
+- /* just a guess for now, might be different for other chips */
+- int max_rssi = 42;
+-
+- qual->level = (buf->rssi * 100 / max_rssi);
+- if (qual->level > 100)
+- qual->level = 100;
+- qual->updated |= IW_QUAL_LEVEL_UPDATED;
++ at76_dbg(DBG_MAC80211, "%s()", __func__);
+ }
+
+-/* Calculate the link quality from a given rx_buffer */
+-static void at76_calc_qual(struct at76_priv *priv, struct at76_rx_buffer *buf,
+- struct iw_quality *qual)
++static int at76_join(struct at76_priv *priv)
+ {
+- if (at76_is_intersil(priv->board_type))
+- qual->qual = buf->link_quality;
+- else {
+- unsigned long elapsed;
++ struct at76_req_join join;
++ int ret;
+
+- /* Update qual at most once a second */
+- elapsed = jiffies - priv->beacons_last_qual;
+- if (elapsed < 1 * HZ)
+- return;
++ memset(&join, 0, sizeof(struct at76_req_join));
++ memcpy(join.essid, priv->essid, priv->essid_size);
++ join.essid_size = priv->essid_size;
++ memcpy(join.bssid, priv->bssid, ETH_ALEN);
++ join.bss_type = INFRASTRUCTURE_MODE;
++ join.channel = priv->channel;
++ join.timeout = cpu_to_le16(2000);
+
+- qual->qual = qual->level * priv->beacons_received *
+- msecs_to_jiffies(priv->beacon_period) / elapsed;
++ at76_dbg(DBG_MAC80211, "%s: sending CMD_JOIN", __func__);
++ ret = at76_set_card_command(priv->udev, CMD_JOIN, &join,
++ sizeof(struct at76_req_join));
+
+- priv->beacons_last_qual = jiffies;
+- priv->beacons_received = 0;
++ if (ret < 0) {
++ printk(KERN_ERR "%s: at76_set_card_command failed: %d\n",
++ wiphy_name(priv->hw->wiphy), ret);
++ return 0;
+ }
+- qual->qual = (qual->qual > 100) ? 100 : qual->qual;
+- qual->updated |= IW_QUAL_QUAL_UPDATED;
+-}
+
+-/* Calculate the noise quality from a given rx_buffer */
+-static void at76_calc_noise(struct at76_priv *priv, struct at76_rx_buffer *buf,
+- struct iw_quality *qual)
+-{
+- qual->noise = 0;
+- qual->updated |= IW_QUAL_NOISE_INVALID;
+-}
++ ret = at76_wait_completion(priv, CMD_JOIN);
++ at76_dbg(DBG_MAC80211, "%s: CMD_JOIN returned: 0x%02x", __func__, ret);
++ if (ret != CMD_STATUS_COMPLETE) {
++ printk(KERN_ERR "%s: at76_wait_completion failed: %d\n",
++ wiphy_name(priv->hw->wiphy), ret);
++ return 0;
++ }
+
+-static void at76_update_wstats(struct at76_priv *priv,
+- struct at76_rx_buffer *buf)
+-{
+- struct iw_quality *qual = &priv->wstats.qual;
++ at76_set_tkip_bssid(priv, priv->bssid);
++ at76_set_pm_mode(priv);
+
+- if (buf->rssi && priv->mac_state == MAC_CONNECTED) {
+- qual->updated = 0;
+- at76_calc_level(priv, buf, qual);
+- at76_calc_qual(priv, buf, qual);
+- at76_calc_noise(priv, buf, qual);
+- } else {
+- qual->qual = 0;
+- qual->level = 0;
+- qual->noise = 0;
+- qual->updated = IW_QUAL_ALL_INVALID;
+- }
++ return 0;
+ }
+
+-static void at76_rx_mgmt(struct at76_priv *priv, struct at76_rx_buffer *buf)
+-{
+- struct ieee80211_hdr_3addr *mgmt =
+- (struct ieee80211_hdr_3addr *)buf->packet;
+- u16 framectl = le16_to_cpu(mgmt->frame_ctl);
+-
+- /* update wstats */
+- if (priv->mac_state != MAC_INIT && priv->mac_state != MAC_SCANNING) {
+- /* jal: this is a dirty hack needed by Tim in ad-hoc mode */
+- /* Data packets always seem to have a 0 link level, so we
+- only read link quality info from management packets.
+- Atmel driver actually averages the present, and previous
+- values, we just present the raw value at the moment - TJS */
+- if (priv->iw_mode == IW_MODE_ADHOC
+- || (priv->curr_bss
+- && !compare_ether_addr(mgmt->addr3,
+- priv->curr_bss->bssid)))
+- at76_update_wstats(priv, buf);
+- }
+-
+- at76_dbg(DBG_RX_MGMT_CONTENT, "%s rx mgmt framectl 0x%x %s",
+- priv->netdev->name, framectl,
+- hex2str(mgmt, le16_to_cpu(buf->wlength)));
+-
+- switch (framectl & IEEE80211_FCTL_STYPE) {
+- case IEEE80211_STYPE_BEACON:
+- case IEEE80211_STYPE_PROBE_RESP:
+- at76_rx_mgmt_beacon(priv, buf);
+- break;
++static void at76_dwork_hw_scan(struct work_struct *work)
++{
++ struct at76_priv *priv = container_of(work, struct at76_priv,
++ dwork_hw_scan.work);
++ int ret;
+
+- case IEEE80211_STYPE_ASSOC_RESP:
+- at76_rx_mgmt_assoc(priv, buf);
+- break;
++ ret = at76_get_cmd_status(priv->udev, CMD_SCAN);
++ at76_dbg(DBG_MAC80211, "%s: CMD_SCAN status 0x%02x", __func__, ret);
+
+- case IEEE80211_STYPE_DISASSOC:
+- at76_rx_mgmt_disassoc(priv, buf);
+- break;
++ /* FIXME: add maximum time for scan to complete */
+
+- case IEEE80211_STYPE_AUTH:
+- at76_rx_mgmt_auth(priv, buf);
+- break;
++ if (ret != CMD_STATUS_COMPLETE) {
++ queue_delayed_work(priv->hw->workqueue, &priv->dwork_hw_scan,
++ SCAN_POLL_INTERVAL);
++ goto exit;
++ }
+
+- case IEEE80211_STYPE_DEAUTH:
+- at76_rx_mgmt_deauth(priv, buf);
+- break;
++ ieee80211_scan_completed(priv->hw);
+
+- default:
+- printk(KERN_DEBUG "%s: ignoring frame with framectl 0x%04x\n",
+- priv->netdev->name, framectl);
++ if (is_valid_ether_addr(priv->bssid)) {
++ ieee80211_wake_queues(priv->hw);
++ at76_join(priv);
+ }
+
++ ieee80211_wake_queues(priv->hw);
++
++exit:
+ return;
+ }
+
+-/* Convert the 802.11 header into an ethernet-style header, make skb
+- * ready for consumption by netif_rx() */
+-static void at76_ieee80211_to_eth(struct sk_buff *skb, int iw_mode)
+-{
+- struct ieee80211_hdr_3addr *i802_11_hdr;
+- struct ethhdr *eth_hdr_p;
+- u8 *src_addr;
+- u8 *dest_addr;
+-
+- i802_11_hdr = (struct ieee80211_hdr_3addr *)skb->data;
+-
+- /* That would be the ethernet header if the hardware converted
+- * the frame for us. Make sure the source and the destination
+- * match the 802.11 header. Which hardware does it? */
+- eth_hdr_p = (struct ethhdr *)skb_pull(skb, IEEE80211_3ADDR_LEN);
+-
+- dest_addr = i802_11_hdr->addr1;
+- if (iw_mode == IW_MODE_ADHOC)
+- src_addr = i802_11_hdr->addr2;
+- else
+- src_addr = i802_11_hdr->addr3;
+-
+- if (!compare_ether_addr(eth_hdr_p->h_source, src_addr) &&
+- !compare_ether_addr(eth_hdr_p->h_dest, dest_addr))
+- /* Yes, we already have an ethernet header */
+- skb_reset_mac_header(skb);
+- else {
+- u16 len;
+-
+- /* Need to build an ethernet header */
+- if (!memcmp(skb->data, snapsig, sizeof(snapsig))) {
+- /* SNAP frame - decapsulate, keep proto */
+- skb_push(skb, offsetof(struct ethhdr, h_proto) -
+- sizeof(rfc1042sig));
+- len = 0;
+- } else {
+- /* 802.3 frame, proto is length */
+- len = skb->len;
+- skb_push(skb, ETH_HLEN);
+- }
+-
+- skb_reset_mac_header(skb);
+- eth_hdr_p = eth_hdr(skb);
+- /* This needs to be done in this order (eth_hdr_p->h_dest may
+- * overlap src_addr) */
+- memcpy(eth_hdr_p->h_source, src_addr, ETH_ALEN);
+- memcpy(eth_hdr_p->h_dest, dest_addr, ETH_ALEN);
+- if (len)
+- eth_hdr_p->h_proto = htons(len);
+- }
+-
+- skb->protocol = eth_type_trans(skb, skb->dev);
+-}
+-
+-/* Check for fragmented data in priv->rx_skb. If the packet was no fragment
+- or it was the last of a fragment set a skb containing the whole packet
+- is returned for further processing. Otherwise we get NULL and are
+- done and the packet is either stored inside the fragment buffer
+- or thrown away. Every returned skb starts with the ieee802_11 header
+- and contains _no_ FCS at the end */
+-static struct sk_buff *at76_check_for_rx_frags(struct at76_priv *priv)
++static int at76_hw_scan(struct ieee80211_hw *hw, u8 *ssid, size_t len)
+ {
+- struct sk_buff *skb = priv->rx_skb;
+- struct at76_rx_buffer *buf = (struct at76_rx_buffer *)skb->data;
+- struct ieee80211_hdr_3addr *i802_11_hdr =
+- (struct ieee80211_hdr_3addr *)buf->packet;
+- /* seq_ctrl, fragment_number, sequence number of new packet */
+- u16 sctl = le16_to_cpu(i802_11_hdr->seq_ctl);
+- u16 fragnr = sctl & 0xf;
+- u16 seqnr = sctl >> 4;
+- u16 frame_ctl = le16_to_cpu(i802_11_hdr->frame_ctl);
+-
+- /* Length including the IEEE802.11 header, but without the trailing
+- * FCS and without the Atmel Rx header */
+- int length = le16_to_cpu(buf->wlength) - IEEE80211_FCS_LEN;
+-
+- /* where does the data payload start in skb->data ? */
+- u8 *data = i802_11_hdr->payload;
+-
+- /* length of payload, excl. the trailing FCS */
+- int data_len = length - IEEE80211_3ADDR_LEN;
+-
+- int i;
+- struct rx_data_buf *bptr, *optr;
+- unsigned long oldest = ~0UL;
+-
+- at76_dbg(DBG_RX_FRAGS,
+- "%s: rx data frame_ctl %04x addr2 %s seq/frag %d/%d "
+- "length %d data %d: %s ...", priv->netdev->name, frame_ctl,
+- mac2str(i802_11_hdr->addr2), seqnr, fragnr, length, data_len,
+- hex2str(data, 32));
+-
+- at76_dbg(DBG_RX_FRAGS_SKB, "%s: incoming skb: head %p data %p "
+- "tail %p end %p len %d", priv->netdev->name, skb->head,
+- skb->data, skb_tail_pointer(skb), skb_end_pointer(skb),
+- skb->len);
+-
+- if (data_len < 0) {
+- /* make sure data starts in the buffer */
+- printk(KERN_INFO "%s: data frame too short\n",
+- priv->netdev->name);
+- return NULL;
+- }
+-
+- WARN_ON(length <= AT76_RX_HDRLEN);
+- if (length <= AT76_RX_HDRLEN)
+- return NULL;
++ struct at76_priv *priv = hw->priv;
++ struct at76_req_scan scan;
++ int ret;
+
+- /* remove the at76_rx_buffer header - we don't need it anymore */
+- /* we need the IEEE802.11 header (for the addresses) if this packet
+- is the first of a chain */
+- skb_pull(skb, AT76_RX_HDRLEN);
+-
+- /* remove FCS at end */
+- skb_trim(skb, length);
+-
+- at76_dbg(DBG_RX_FRAGS_SKB, "%s: trimmed skb: head %p data %p tail %p "
+- "end %p len %d data %p data_len %d", priv->netdev->name,
+- skb->head, skb->data, skb_tail_pointer(skb),
+- skb_end_pointer(skb), skb->len, data, data_len);
+-
+- if (fragnr == 0 && !(frame_ctl & IEEE80211_FCTL_MOREFRAGS)) {
+- /* unfragmented packet received */
+- /* Use a new skb for the next receive */
+- priv->rx_skb = NULL;
+- at76_dbg(DBG_RX_FRAGS, "%s: unfragmented", priv->netdev->name);
+- return skb;
+- }
+-
+- /* look if we've got a chain for the sender address.
+- afterwards optr points to first free or the oldest entry,
+- or, if i < NR_RX_DATA_BUF, bptr points to the entry for the
+- sender address */
+- /* determining the oldest entry doesn't cope with jiffies wrapping
+- but I don't care to delete a young entry at these rare moments ... */
+-
+- bptr = priv->rx_data;
+- optr = NULL;
+- for (i = 0; i < NR_RX_DATA_BUF; i++, bptr++) {
+- if (!bptr->skb) {
+- optr = bptr;
+- oldest = 0UL;
+- continue;
+- }
++ at76_dbg(DBG_MAC80211, "%s():", __func__);
++ at76_dbg_dump(DBG_MAC80211, ssid, len, "ssid %zd bytes:", len);
+
+- if (!compare_ether_addr(i802_11_hdr->addr2, bptr->sender))
+- break;
++ mutex_lock(&priv->mtx);
+
+- if (!optr) {
+- optr = bptr;
+- oldest = bptr->last_rx;
+- } else if (bptr->last_rx < oldest)
+- optr = bptr;
+- }
+-
+- if (i < NR_RX_DATA_BUF) {
+-
+- at76_dbg(DBG_RX_FRAGS, "%s: %d. cacheentry (seq/frag = %d/%d) "
+- "matched sender addr",
+- priv->netdev->name, i, bptr->seqnr, bptr->fragnr);
+-
+- /* bptr points to an entry for the sender address */
+- if (bptr->seqnr == seqnr) {
+- int left;
+- /* the fragment has the current sequence number */
+- if (((bptr->fragnr + 1) & 0xf) != fragnr) {
+- /* wrong fragment number -> ignore it */
+- /* is & 0xf necessary above ??? */
+- at76_dbg(DBG_RX_FRAGS,
+- "%s: frag nr mismatch: %d + 1 != %d",
+- priv->netdev->name, bptr->fragnr,
+- fragnr);
+- return NULL;
+- }
+- bptr->last_rx = jiffies;
+- /* the next following fragment number ->
+- add the data at the end */
+-
+- /* for test only ??? */
+- left = skb_tailroom(bptr->skb);
+- if (left < data_len)
+- printk(KERN_INFO
+- "%s: only %d byte free (need %d)\n",
+- priv->netdev->name, left, data_len);
+- else
+- memcpy(skb_put(bptr->skb, data_len), data,
+- data_len);
+-
+- bptr->fragnr = fragnr;
+- if (frame_ctl & IEEE80211_FCTL_MOREFRAGS)
+- return NULL;
+-
+- /* this was the last fragment - send it */
+- skb = bptr->skb;
+- bptr->skb = NULL; /* free the entry */
+- at76_dbg(DBG_RX_FRAGS, "%s: last frag of seq %d",
+- priv->netdev->name, seqnr);
+- return skb;
+- }
++ ieee80211_stop_queues(hw);
+
+- /* got another sequence number */
+- if (fragnr == 0) {
+- /* it's the start of a new chain - replace the
+- old one by this */
+- /* bptr->sender has the correct value already */
+- at76_dbg(DBG_RX_FRAGS,
+- "%s: start of new seq %d, removing old seq %d",
+- priv->netdev->name, seqnr, bptr->seqnr);
+- bptr->seqnr = seqnr;
+- bptr->fragnr = 0;
+- bptr->last_rx = jiffies;
+- /* swap bptr->skb and priv->rx_skb */
+- skb = bptr->skb;
+- bptr->skb = priv->rx_skb;
+- priv->rx_skb = skb;
+- } else {
+- /* it from the middle of a new chain ->
+- delete the old entry and skip the new one */
+- at76_dbg(DBG_RX_FRAGS,
+- "%s: middle of new seq %d (%d) "
+- "removing old seq %d",
+- priv->netdev->name, seqnr, fragnr,
+- bptr->seqnr);
+- dev_kfree_skb(bptr->skb);
+- bptr->skb = NULL;
+- }
+- return NULL;
++ memset(&scan, 0, sizeof(struct at76_req_scan));
++ memset(scan.bssid, 0xFF, ETH_ALEN);
++ scan.scan_type = SCAN_TYPE_ACTIVE;
++ if (priv->essid_size > 0) {
++ memcpy(scan.essid, ssid, len);
++ scan.essid_size = len;
+ }
++ scan.min_channel_time = cpu_to_le16(priv->scan_min_time);
++ scan.max_channel_time = cpu_to_le16(priv->scan_max_time);
++ scan.probe_delay = cpu_to_le16(priv->scan_min_time * 1000);
++ scan.international_scan = 0;
+
+- /* if we didn't find a chain for the sender address, optr
+- points either to the first free or the oldest entry */
++ at76_dbg(DBG_MAC80211, "%s: sending CMD_SCAN", __func__);
++ ret = at76_set_card_command(priv->udev, CMD_SCAN, &scan, sizeof(scan));
+
+- if (fragnr != 0) {
+- /* this is not the begin of a fragment chain ... */
+- at76_dbg(DBG_RX_FRAGS,
+- "%s: no chain for non-first fragment (%d)",
+- priv->netdev->name, fragnr);
+- return NULL;
++ if (ret < 0) {
++ err("CMD_SCAN failed: %d", ret);
++ goto exit;
+ }
+
+- BUG_ON(!optr);
+- if (optr->skb) {
+- /* swap the skb's */
+- skb = optr->skb;
+- optr->skb = priv->rx_skb;
+- priv->rx_skb = skb;
+-
+- at76_dbg(DBG_RX_FRAGS,
+- "%s: free old contents: sender %s seq/frag %d/%d",
+- priv->netdev->name, mac2str(optr->sender),
+- optr->seqnr, optr->fragnr);
++ queue_delayed_work(priv->hw->workqueue, &priv->dwork_hw_scan,
++ SCAN_POLL_INTERVAL);
+
+- } else {
+- /* take the skb from priv->rx_skb */
+- optr->skb = priv->rx_skb;
+- /* let at76_submit_rx_urb() allocate a new skb */
+- priv->rx_skb = NULL;
+-
+- at76_dbg(DBG_RX_FRAGS, "%s: use a free entry",
+- priv->netdev->name);
+- }
+- memcpy(optr->sender, i802_11_hdr->addr2, ETH_ALEN);
+- optr->seqnr = seqnr;
+- optr->fragnr = 0;
+- optr->last_rx = jiffies;
++exit:
++ mutex_unlock(&priv->mtx);
+
+- return NULL;
++ return 0;
+ }
+
+-/* Rx interrupt: we expect the complete data buffer in priv->rx_skb */
+-static void at76_rx_data(struct at76_priv *priv)
++static int at76_config(struct ieee80211_hw *hw, u32 changed)
+ {
+- struct net_device *netdev = priv->netdev;
+- struct net_device_stats *stats = &priv->stats;
+- struct sk_buff *skb = priv->rx_skb;
+- struct at76_rx_buffer *buf = (struct at76_rx_buffer *)skb->data;
+- struct ieee80211_hdr_3addr *i802_11_hdr;
+- int length = le16_to_cpu(buf->wlength);
+-
+- at76_dbg(DBG_RX_DATA, "%s received data packet: %s", netdev->name,
+- hex2str(skb->data, AT76_RX_HDRLEN));
++ struct at76_priv *priv = hw->priv;
++ struct ieee80211_conf *conf = &hw->conf;
+
+- at76_dbg(DBG_RX_DATA_CONTENT, "rx packet: %s",
+- hex2str(skb->data + AT76_RX_HDRLEN, length));
++ at76_dbg(DBG_MAC80211, "%s(): channel %d radio %d",
++ __func__, conf->channel->hw_value, conf->radio_enabled);
++ at76_dbg_dump(DBG_MAC80211, priv->essid, priv->essid_size, "ssid:");
++ at76_dbg_dump(DBG_MAC80211, priv->bssid, ETH_ALEN, "bssid:");
+
+- skb = at76_check_for_rx_frags(priv);
+- if (!skb)
+- return;
++ mutex_lock(&priv->mtx);
+
+- /* Atmel header and the FCS are already removed */
+- i802_11_hdr = (struct ieee80211_hdr_3addr *)skb->data;
++ priv->channel = conf->channel->hw_value;
+
+- skb->dev = netdev;
+- skb->ip_summed = CHECKSUM_NONE; /* TODO: should check CRC */
++ if (is_valid_ether_addr(priv->bssid)) {
++ at76_join(priv);
++ ieee80211_wake_queues(priv->hw);
++ } else {
++ ieee80211_stop_queues(priv->hw);
++ at76_start_monitor(priv);
++ };
+
+- if (is_broadcast_ether_addr(i802_11_hdr->addr1)) {
+- if (!compare_ether_addr(i802_11_hdr->addr1, netdev->broadcast))
+- skb->pkt_type = PACKET_BROADCAST;
+- else
+- skb->pkt_type = PACKET_MULTICAST;
+- } else if (compare_ether_addr(i802_11_hdr->addr1, netdev->dev_addr))
+- skb->pkt_type = PACKET_OTHERHOST;
+-
+- at76_ieee80211_to_eth(skb, priv->iw_mode);
+-
+- netdev->last_rx = jiffies;
+- netif_rx(skb);
+- stats->rx_packets++;
+- stats->rx_bytes += length;
++ mutex_unlock(&priv->mtx);
+
+- return;
++ return 0;
+ }
+
+-static void at76_rx_monitor_mode(struct at76_priv *priv)
++static int at76_config_interface(struct ieee80211_hw *hw,
++ struct ieee80211_vif *vif,
++ struct ieee80211_if_conf *conf)
+ {
+- struct at76_rx_radiotap *rt;
+- u8 *payload;
+- int skblen;
+- struct net_device *netdev = priv->netdev;
+- struct at76_rx_buffer *buf =
+- (struct at76_rx_buffer *)priv->rx_skb->data;
+- /* length including the IEEE802.11 header and the trailing FCS,
+- but not at76_rx_buffer */
+- int length = le16_to_cpu(buf->wlength);
+- struct sk_buff *skb = priv->rx_skb;
+- struct net_device_stats *stats = &priv->stats;
+-
+- if (length < IEEE80211_FCS_LEN) {
+- /* buffer contains no data */
+- at76_dbg(DBG_MONITOR_MODE,
+- "%s: MONITOR MODE: rx skb without data",
+- priv->netdev->name);
+- return;
+- }
+-
+- skblen = sizeof(struct at76_rx_radiotap) + length;
++ struct at76_priv *priv = hw->priv;
+
+- skb = dev_alloc_skb(skblen);
+- if (!skb) {
+- printk(KERN_ERR "%s: MONITOR MODE: dev_alloc_skb for radiotap "
+- "header returned NULL\n", priv->netdev->name);
+- return;
+- }
++ at76_dbg_dump(DBG_MAC80211, conf->bssid, ETH_ALEN, "bssid:");
+
+- skb_put(skb, skblen);
++ mutex_lock(&priv->mtx);
+
+- rt = (struct at76_rx_radiotap *)skb->data;
+- payload = skb->data + sizeof(struct at76_rx_radiotap);
++ memcpy(priv->bssid, conf->bssid, ETH_ALEN);
++// memcpy(priv->essid, conf->ssid, conf->ssid_len);
++// priv->essid_size = conf->ssid_len;
++
++ if (is_valid_ether_addr(priv->bssid)) {
++ /* mac80211 is joining a bss */
++ ieee80211_wake_queues(priv->hw);
++ at76_join(priv);
++ } else
++ ieee80211_stop_queues(priv->hw);
+
+- rt->rt_hdr.it_version = 0;
+- rt->rt_hdr.it_pad = 0;
+- rt->rt_hdr.it_len = cpu_to_le16(sizeof(struct at76_rx_radiotap));
+- rt->rt_hdr.it_present = cpu_to_le32(AT76_RX_RADIOTAP_PRESENT);
+-
+- rt->rt_tsft = cpu_to_le64(le32_to_cpu(buf->rx_time));
+- rt->rt_rate = hw_rates[buf->rx_rate] & (~0x80);
+- rt->rt_signal = buf->rssi;
+- rt->rt_noise = buf->noise_level;
+- rt->rt_flags = IEEE80211_RADIOTAP_F_FCS;
+- if (buf->fragmentation)
+- rt->rt_flags |= IEEE80211_RADIOTAP_F_FRAG;
+-
+- memcpy(payload, buf->packet, length);
+- skb->dev = netdev;
+- skb->ip_summed = CHECKSUM_NONE;
+- skb_reset_mac_header(skb);
+- skb->pkt_type = PACKET_OTHERHOST;
+- skb->protocol = htons(ETH_P_802_2);
+-
+- netdev->last_rx = jiffies;
+- netif_rx(skb);
+- stats->rx_packets++;
+- stats->rx_bytes += length;
+-}
+-
+-/* Check if we spy on the sender address in buf and update stats */
+-static void at76_iwspy_update(struct at76_priv *priv,
+- struct at76_rx_buffer *buf)
+-{
+- struct ieee80211_hdr_3addr *hdr =
+- (struct ieee80211_hdr_3addr *)buf->packet;
+- struct iw_quality qual;
+-
+- /* We can only set the level here */
+- qual.updated = IW_QUAL_QUAL_INVALID | IW_QUAL_NOISE_INVALID;
+- qual.level = 0;
+- qual.noise = 0;
+- at76_calc_level(priv, buf, &qual);
++ mutex_unlock(&priv->mtx);
+
+- spin_lock_bh(&priv->spy_spinlock);
++ return 0;
++}
+
+- if (priv->spy_data.spy_number > 0)
+- wireless_spy_update(priv->netdev, hdr->addr2, &qual);
++/* must be atomic */
++static void at76_configure_filter(struct ieee80211_hw *hw,
++ unsigned int changed_flags,
++ unsigned int *total_flags, int mc_count,
++ struct dev_addr_list *mc_list)
++{
++ struct at76_priv *priv = hw->priv;
++ int flags;
++
++ at76_dbg(DBG_MAC80211, "%s(): changed_flags=0x%08x "
++ "total_flags=0x%08x mc_count=%d",
++ __func__, changed_flags, *total_flags, mc_count);
++
++ flags = changed_flags & AT76_SUPPORTED_FILTERS;
++ *total_flags = AT76_SUPPORTED_FILTERS;
++
++ /* FIXME: access to priv->promisc should be protected with
++ * priv->mtx, but it's impossible because this function needs to be
++ * atomic */
++
++ if (flags && !priv->promisc) {
++ /* mac80211 wants us to enable promiscuous mode */
++ priv->promisc = 1;
++ } else if (!flags && priv->promisc) {
++ /* we need to disable promiscuous mode */
++ priv->promisc = 0;
++ } else
++ return;
+
+- spin_unlock_bh(&priv->spy_spinlock);
++ queue_work(hw->workqueue, &priv->work_set_promisc);
+ }
+
+-static void at76_rx_tasklet(unsigned long param)
++static int at76_set_key_oldfw(struct ieee80211_hw *hw, enum set_key_cmd cmd,
++ const u8 *local_address, const u8 *address,
++ struct ieee80211_key_conf *key)
+ {
+- struct urb *urb = (struct urb *)param;
+- struct at76_priv *priv = urb->context;
+- struct net_device *netdev = priv->netdev;
+- struct at76_rx_buffer *buf;
+- struct ieee80211_hdr_3addr *i802_11_hdr;
+- u16 frame_ctl;
+-
+- if (priv->device_unplugged) {
+- at76_dbg(DBG_DEVSTART, "device unplugged");
+- if (urb)
+- at76_dbg(DBG_DEVSTART, "urb status %d", urb->status);
+- return;
+- }
++ struct at76_priv *priv = hw->priv;
+
+- if (!priv->rx_skb || !netdev || !priv->rx_skb->data)
+- return;
++ int i;
+
+- buf = (struct at76_rx_buffer *)priv->rx_skb->data;
++ at76_dbg(DBG_MAC80211, "%s(): cmd %d key->alg %d key->keyidx %d "
++ "key->keylen %d",
++ __func__, cmd, key->alg, key->keyidx, key->keylen);
+
+- i802_11_hdr = (struct ieee80211_hdr_3addr *)buf->packet;
++ if (key->alg != ALG_WEP)
++ return -EOPNOTSUPP;
+
+- frame_ctl = le16_to_cpu(i802_11_hdr->frame_ctl);
++ key->hw_key_idx = key->keyidx;
+
+- if (urb->status != 0) {
+- if (urb->status != -ENOENT && urb->status != -ECONNRESET)
+- at76_dbg(DBG_URB,
+- "%s %s: - nonzero Rx bulk status received: %d",
+- __func__, netdev->name, urb->status);
+- return;
+- }
++ mutex_lock(&priv->mtx);
+
+- at76_dbg(DBG_RX_ATMEL_HDR,
+- "%s: rx frame: rate %d rssi %d noise %d link %d %s",
+- priv->netdev->name, buf->rx_rate, buf->rssi, buf->noise_level,
+- buf->link_quality, hex2str(i802_11_hdr, 48));
+- if (priv->iw_mode == IW_MODE_MONITOR) {
+- at76_rx_monitor_mode(priv);
+- goto exit;
+- }
++ switch (cmd) {
++ case SET_KEY:
++ memcpy(priv->wep_keys[key->keyidx], key->key, key->keylen);
++ priv->wep_keys_len[key->keyidx] = key->keylen;
+
+- /* there is a new bssid around, accept it: */
+- if (buf->newbss && priv->iw_mode == IW_MODE_ADHOC) {
+- at76_dbg(DBG_PROGRESS, "%s: rx newbss", netdev->name);
+- schedule_work(&priv->work_new_bss);
+- }
++ /* FIXME: find out how to do this properly */
++ priv->wep_key_id = key->keyidx;
+
+- switch (frame_ctl & IEEE80211_FCTL_FTYPE) {
+- case IEEE80211_FTYPE_DATA:
+- at76_rx_data(priv);
+ break;
++ case DISABLE_KEY:
++ default:
++ priv->wep_keys_len[key->keyidx] = 0;
++ break;
++ }
+
+- case IEEE80211_FTYPE_MGMT:
+- /* jal: TODO: find out if we can update iwspy also on
+- other frames than management (might depend on the
+- radio chip / firmware version !) */
++ priv->wep_enabled = 0;
+
+- at76_iwspy_update(priv, buf);
++ for (i = 0; i < WEP_KEYS; i++) {
++ if (priv->wep_keys_len[i] != 0)
++ priv->wep_enabled = 1;
++ }
+
+- at76_rx_mgmt(priv, buf);
+- break;
++ at76_startup_device(priv);
+
+- case IEEE80211_FTYPE_CTL:
+- at76_dbg(DBG_RX_CTRL, "%s: ignored ctrl frame: %04x",
+- priv->netdev->name, frame_ctl);
+- break;
++ mutex_unlock(&priv->mtx);
+
+- default:
+- printk(KERN_DEBUG "%s: ignoring frame with framectl 0x%04x\n",
+- priv->netdev->name, frame_ctl);
+- }
+-exit:
+- at76_submit_rx_urb(priv);
++ return 0;
+ }
+
+-/* Load firmware into kernel memory and parse it */
+-static struct fwentry *at76_load_firmware(struct usb_device *udev,
+- enum board_type board_type)
+-{
+- int ret;
+- char *str;
+- struct at76_fw_header *fwh;
+- struct fwentry *fwe = &firmwares[board_type];
++static int at76_set_key_newfw(struct ieee80211_hw *hw, enum set_key_cmd cmd,
++ const u8 *local_address, const u8 *address,
++ struct ieee80211_key_conf *key)
++{
++ struct at76_priv *priv = hw->priv;
++ int ret = -EOPNOTSUPP;
++
++ at76_dbg(DBG_MAC80211, "%s(): cmd %d key->alg %d key->keyidx %d "
++ "key->keylen %d",
++ __func__, cmd, key->alg, key->keyidx, key->keylen);
+
+- mutex_lock(&fw_mutex);
++ mutex_lock(&priv->mtx);
+
+- if (fwe->loaded) {
+- at76_dbg(DBG_FW, "re-using previously loaded fw");
+- goto exit;
+- }
++ priv->mib_buf.type = MIB_MAC_ENCRYPTION;
+
+- at76_dbg(DBG_FW, "downloading firmware %s", fwe->fwname);
+- ret = request_firmware(&fwe->fw, fwe->fwname, &udev->dev);
+- if (ret < 0) {
+- dev_printk(KERN_ERR, &udev->dev, "firmware %s not found!\n",
+- fwe->fwname);
+- dev_printk(KERN_ERR, &udev->dev,
+- "you may need to download the firmware from "
+- "http://developer.berlios.de/projects/at76c503a/");
++ if (cmd == DISABLE_KEY) {
++ priv->mib_buf.size = CIPHER_KEY_LEN;
++ priv->mib_buf.index = offsetof(struct mib_mac_encryption,
++ cipher_default_keyvalue[key->keyidx]);
++ memset(priv->mib_buf.data.data, 0, CIPHER_KEY_LEN);
++ if (at76_set_mib(priv, &priv->mib_buf) != CMD_STATUS_COMPLETE)
++ ret = -EOPNOTSUPP; /* -EIO would be probably better */
++ else {
++
++ priv->keys[key->keyidx].cipher = CIPHER_NONE;
++ priv->keys[key->keyidx].keylen = 0;
++ };
++ if (priv->default_group_key == key->keyidx)
++ priv->default_group_key = 0xff;
++
++ if (priv->default_pairwise_key == key->keyidx)
++ priv->default_pairwise_key = 0xff;
++ /* If default pairwise key is removed, fall back to
++ * group key? */
++ ret = 0;
+ goto exit;
+- }
++ };
+
+- at76_dbg(DBG_FW, "got it.");
+- fwh = (struct at76_fw_header *)(fwe->fw->data);
++ if (cmd == SET_KEY) {
++ /* store key into MIB */
++ priv->mib_buf.size = CIPHER_KEY_LEN;
++ priv->mib_buf.index = offsetof(struct mib_mac_encryption,
++ cipher_default_keyvalue[key->keyidx]);
++ memset(priv->mib_buf.data.data, 0, CIPHER_KEY_LEN);
++ memcpy(priv->mib_buf.data.data, key->key, key->keylen);
++
++ switch (key->alg) {
++ case ALG_WEP:
++ if (key->keylen == 5) {
++ priv->keys[key->keyidx].cipher =
++ CIPHER_WEP64;
++ priv->keys[key->keyidx].keylen = 8;
++ } else if (key->keylen == 13) {
++ priv->keys[key->keyidx].cipher =
++ CIPHER_WEP128;
++ /* Firmware needs this */
++ priv->keys[key->keyidx].keylen = 8;
++ } else {
++ ret = -EOPNOTSUPP;
++ goto exit;
++ };
++ break;
++ case ALG_TKIP:
++ key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
++ priv->keys[key->keyidx].cipher = CIPHER_TKIP;
++ priv->keys[key->keyidx].keylen = 12;
++ break;
+
+- if (fwe->fw->size <= sizeof(*fwh)) {
+- dev_printk(KERN_ERR, &udev->dev,
+- "firmware is too short (0x%zx)\n", fwe->fw->size);
+- goto exit;
+- }
++ case ALG_CCMP:
++ if (!at76_is_505a(priv->board_type)) {
++ ret = -EOPNOTSUPP;
++ goto exit;
++ };
++ key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
++ priv->keys[key->keyidx].cipher = CIPHER_CCMP;
++ priv->keys[key->keyidx].keylen = 16;
++ break;
+
+- /* CRC currently not checked */
+- fwe->board_type = le32_to_cpu(fwh->board_type);
+- if (fwe->board_type != board_type) {
+- dev_printk(KERN_ERR, &udev->dev,
+- "board type mismatch, requested %u, got %u\n",
+- board_type, fwe->board_type);
+- goto exit;
+- }
++ default:
++ ret = -EOPNOTSUPP;
++ goto exit;
++ };
+
+- fwe->fw_version.major = fwh->major;
+- fwe->fw_version.minor = fwh->minor;
+- fwe->fw_version.patch = fwh->patch;
+- fwe->fw_version.build = fwh->build;
++ priv->mib_buf.data.data[38] = priv->keys[key->keyidx].cipher;
++ priv->mib_buf.data.data[39] = 1; /* Taken from atmelwlandriver,
++ not documented */
++
++ if (is_valid_ether_addr(address))
++ /* Pairwise key */
++ priv->mib_buf.data.data[39] |= (KEY_PAIRWISE | KEY_TX);
++ else if (is_broadcast_ether_addr(address))
++ /* Group key */
++ priv->mib_buf.data.data[39] |= (KEY_TX);
++ else /* Key used only for transmission ??? */
++ priv->mib_buf.data.data[39] |= (KEY_TX);
++
++ if (at76_set_mib(priv, &priv->mib_buf) !=
++ CMD_STATUS_COMPLETE) {
++ ret = -EOPNOTSUPP; /* -EIO would be probably better */
++ goto exit;
++ };
+
+- str = (char *)fwh + le32_to_cpu(fwh->str_offset);
+- fwe->intfw = (u8 *)fwh + le32_to_cpu(fwh->int_fw_offset);
+- fwe->intfw_size = le32_to_cpu(fwh->int_fw_len);
+- fwe->extfw = (u8 *)fwh + le32_to_cpu(fwh->ext_fw_offset);
+- fwe->extfw_size = le32_to_cpu(fwh->ext_fw_len);
++ if ((key->alg == ALG_TKIP) || (key->alg == ALG_CCMP))
++ at76_reset_rsc(priv);
+
+- fwe->loaded = 1;
++ key->hw_key_idx = key->keyidx;
+
+- dev_printk(KERN_DEBUG, &udev->dev,
+- "using firmware %s (version %d.%d.%d-%d)\n",
+- fwe->fwname, fwh->major, fwh->minor, fwh->patch, fwh->build);
++ /* Set up default keys */
++ if (is_broadcast_ether_addr(address))
++ priv->default_group_key = key->keyidx;
++ if (is_valid_ether_addr(address))
++ priv->default_pairwise_key = key->keyidx;
++
++ /* Set up encryption MIBs */
++
++ /* first block of settings */
++ priv->mib_buf.size = 3;
++ priv->mib_buf.index = offsetof(struct mib_mac_encryption,
++ privacy_invoked);
++ priv->mib_buf.data.data[0] = 1; /* privacy_invoked */
++ priv->mib_buf.data.data[1] = priv->default_pairwise_key;
++ priv->mib_buf.data.data[2] = priv->default_group_key;
+
+- at76_dbg(DBG_DEVSTART, "board %u, int %d:%d, ext %d:%d", board_type,
+- le32_to_cpu(fwh->int_fw_offset), le32_to_cpu(fwh->int_fw_len),
+- le32_to_cpu(fwh->ext_fw_offset), le32_to_cpu(fwh->ext_fw_len));
+- at76_dbg(DBG_DEVSTART, "firmware id %s", str);
++ ret = at76_set_mib(priv, &priv->mib_buf);
++ if (ret != CMD_STATUS_COMPLETE)
++ goto exit;
++
++ /* second block of settings */
++ priv->mib_buf.size = 3;
++ priv->mib_buf.index = offsetof(struct mib_mac_encryption,
++ exclude_unencrypted);
++ priv->mib_buf.data.data[0] = 1; /* exclude_unencrypted */
++ priv->mib_buf.data.data[1] = 0; /* wep_encryption_type */
++ priv->mib_buf.data.data[2] = 0; /* ckip_key_permutation */
+
++ ret = at76_set_mib(priv, &priv->mib_buf);
++ if (ret != CMD_STATUS_COMPLETE)
++ goto exit;
++ ret = 0;
++ };
+ exit:
+- mutex_unlock(&fw_mutex);
++ at76_dump_mib_mac_encryption(priv);
++ mutex_unlock(&priv->mtx);
++ return ret;
++}
+
+- if (fwe->loaded)
+- return fwe;
++static int at76_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
++ const u8 *local_address, const u8 *address,
++ struct ieee80211_key_conf *key)
++{
++ struct at76_priv *priv = hw->priv;
++
++ at76_dbg(DBG_MAC80211, "%s(): cmd %d key->alg %d key->keyidx %d "
++ "key->keylen %d",
++ __func__, cmd, key->alg, key->keyidx, key->keylen);
++
++ if (FIRMWARE_IS_WPA(priv->fw_version))
++ return at76_set_key_newfw(hw, cmd, local_address, address, key);
+ else
+- return NULL;
++ return at76_set_key_oldfw(hw, cmd, local_address, address, key);
++
+ }
+
++static const struct ieee80211_ops at76_ops = {
++ .tx = at76_mac80211_tx,
++ .add_interface = at76_add_interface,
++ .remove_interface = at76_remove_interface,
++ .config = at76_config,
++ .config_interface = at76_config_interface,
++ .configure_filter = at76_configure_filter,
++ .start = at76_mac80211_start,
++ .stop = at76_mac80211_stop,
++ .hw_scan = at76_hw_scan,
++ .set_key = at76_set_key,
++};
++
+ /* Allocate network device and initialize private data */
+ static struct at76_priv *at76_alloc_new_device(struct usb_device *udev)
+ {
+- struct net_device *netdev;
++ struct ieee80211_hw *hw;
+ struct at76_priv *priv;
+- int i;
+
+- /* allocate memory for our device state and initialize it */
+- netdev = alloc_etherdev(sizeof(struct at76_priv));
+- if (!netdev) {
+- dev_printk(KERN_ERR, &udev->dev, "out of memory\n");
++ hw = ieee80211_alloc_hw(sizeof(struct at76_priv), &at76_ops);
++ if (!hw) {
++ printk(KERN_ERR DRIVER_NAME ": could not register"
++ " ieee80211_hw\n");
+ return NULL;
+ }
+
+- priv = netdev_priv(netdev);
++ priv = hw->priv;
++ priv->hw = hw;
+
+ priv->udev = udev;
+- priv->netdev = netdev;
+
+ mutex_init(&priv->mtx);
+- INIT_WORK(&priv->work_assoc_done, at76_work_assoc_done);
+- INIT_WORK(&priv->work_join, at76_work_join);
+- INIT_WORK(&priv->work_new_bss, at76_work_new_bss);
+- INIT_WORK(&priv->work_start_scan, at76_work_start_scan);
+ INIT_WORK(&priv->work_set_promisc, at76_work_set_promisc);
+ INIT_WORK(&priv->work_submit_rx, at76_work_submit_rx);
+- INIT_DELAYED_WORK(&priv->dwork_restart, at76_dwork_restart);
+- INIT_DELAYED_WORK(&priv->dwork_get_scan, at76_dwork_get_scan);
+- INIT_DELAYED_WORK(&priv->dwork_beacon, at76_dwork_beacon);
+- INIT_DELAYED_WORK(&priv->dwork_auth, at76_dwork_auth);
+- INIT_DELAYED_WORK(&priv->dwork_assoc, at76_dwork_assoc);
+-
+- spin_lock_init(&priv->mgmt_spinlock);
+- priv->next_mgmt_bulk = NULL;
+- priv->mac_state = MAC_INIT;
+-
+- /* initialize empty BSS list */
+- priv->curr_bss = NULL;
+- INIT_LIST_HEAD(&priv->bss_list);
+- spin_lock_init(&priv->bss_list_spinlock);
+-
+- init_timer(&priv->bss_list_timer);
+- priv->bss_list_timer.data = (unsigned long)priv;
+- priv->bss_list_timer.function = at76_bss_list_timeout;
+-
+- spin_lock_init(&priv->spy_spinlock);
+-
+- /* mark all rx data entries as unused */
+- for (i = 0; i < NR_RX_DATA_BUF; i++)
+- priv->rx_data[i].skb = NULL;
++ INIT_DELAYED_WORK(&priv->dwork_hw_scan, at76_dwork_hw_scan);
+
+ priv->rx_tasklet.func = at76_rx_tasklet;
+ priv->rx_tasklet.data = 0;
+@@ -5197,6 +2371,9 @@
+ priv->pm_mode = AT76_PM_OFF;
+ priv->pm_period = 0;
+
++ /* unit us */
++ priv->hw->channel_change_time = 100000;
++
+ return priv;
+ }
+
+@@ -5259,11 +2436,42 @@
+ return 0;
+ }
+
++static struct ieee80211_rate at76_rates[] = {
++ { .bitrate = 10, .hw_value = TX_RATE_1MBIT, },
++ { .bitrate = 20, .hw_value = TX_RATE_2MBIT, },
++ { .bitrate = 55, .hw_value = TX_RATE_5_5MBIT, },
++ { .bitrate = 110, .hw_value = TX_RATE_11MBIT, },
++};
++
++static struct ieee80211_channel at76_channels[] = {
++ { .center_freq = 2412, .hw_value = 1 },
++ { .center_freq = 2417, .hw_value = 2 },
++ { .center_freq = 2422, .hw_value = 3 },
++ { .center_freq = 2427, .hw_value = 4 },
++ { .center_freq = 2432, .hw_value = 5 },
++ { .center_freq = 2437, .hw_value = 6 },
++ { .center_freq = 2442, .hw_value = 7 },
++ { .center_freq = 2447, .hw_value = 8 },
++ { .center_freq = 2452, .hw_value = 9 },
++ { .center_freq = 2457, .hw_value = 10 },
++ { .center_freq = 2462, .hw_value = 11 },
++ { .center_freq = 2467, .hw_value = 12 },
++ { .center_freq = 2472, .hw_value = 13 },
++ { .center_freq = 2484, .hw_value = 14 }
++};
++
++static struct ieee80211_supported_band at76_supported_band = {
++ .channels = at76_channels,
++ .n_channels = ARRAY_SIZE(at76_channels),
++ .bitrates = at76_rates,
++ .n_bitrates = ARRAY_SIZE(at76_rates),
++};
++
+ /* Register network device and initialize the hardware */
+ static int at76_init_new_device(struct at76_priv *priv,
+ struct usb_interface *interface)
+ {
+- struct net_device *netdev = priv->netdev;
++ struct device *dev = &interface->dev;
+ int ret;
+
+ /* set up the endpoint information */
+@@ -5279,14 +2487,11 @@
+ /* MAC address */
+ ret = at76_get_hw_config(priv);
+ if (ret < 0) {
+- dev_printk(KERN_ERR, &interface->dev,
+- "cannot get MAC address\n");
++ dev_err(dev, "cannot get MAC address\n");
+ goto exit;
+ }
+
+ priv->domain = at76_get_reg_domain(priv->regulatory_domain);
+- /* init. netdev->dev_addr */
+- memcpy(netdev->dev_addr, priv->mac_addr, ETH_ALEN);
+
+ priv->channel = DEF_CHANNEL;
+ priv->iw_mode = IW_MODE_INFRA;
+@@ -5296,47 +2501,54 @@
+ priv->txrate = TX_RATE_AUTO;
+ priv->preamble_type = PREAMBLE_TYPE_LONG;
+ priv->beacon_period = 100;
+- priv->beacons_last_qual = jiffies;
+ priv->auth_mode = WLAN_AUTH_OPEN;
+ priv->scan_min_time = DEF_SCAN_MIN_TIME;
+ priv->scan_max_time = DEF_SCAN_MAX_TIME;
+ priv->scan_mode = SCAN_TYPE_ACTIVE;
++ priv->default_pairwise_key = 0xff;
++ priv->default_group_key = 0xff;
++
++ /* mac80211 initialisation */
++ priv->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &at76_supported_band;
++
++ if (FIRMWARE_IS_WPA(priv->fw_version) &&
++ (at76_is_503rfmd(priv->board_type) ||
++ at76_is_505(priv->board_type)))
++ priv->hw->flags = IEEE80211_HW_SIGNAL_UNSPEC;
++ else
++ priv->hw->flags = IEEE80211_HW_RX_INCLUDES_FCS |
++ IEEE80211_HW_SIGNAL_UNSPEC;
+
+- netdev->flags &= ~IFF_MULTICAST; /* not yet or never */
+- netdev->open = at76_open;
+- netdev->stop = at76_stop;
+- netdev->get_stats = at76_get_stats;
+- netdev->ethtool_ops = &at76_ethtool_ops;
+-
+- /* Add pointers to enable iwspy support. */
+- priv->wireless_data.spy_data = &priv->spy_data;
+- netdev->wireless_data = &priv->wireless_data;
+-
+- netdev->hard_start_xmit = at76_tx;
+- netdev->tx_timeout = at76_tx_timeout;
+- netdev->watchdog_timeo = 2 * HZ;
+- netdev->wireless_handlers = &at76_handler_def;
+- netdev->set_multicast_list = at76_set_multicast;
+- netdev->set_mac_address = at76_set_mac_address;
+- dev_alloc_name(netdev, "wlan%d");
++ priv->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
+
+- ret = register_netdev(priv->netdev);
++ SET_IEEE80211_DEV(priv->hw, &interface->dev);
++ SET_IEEE80211_PERM_ADDR(priv->hw, priv->mac_addr);
++
++ ret = ieee80211_register_hw(priv->hw);
+ if (ret) {
+- dev_printk(KERN_ERR, &interface->dev,
+- "cannot register netdevice (status %d)!\n", ret);
++ dev_err(dev, "cannot register mac80211 hw (status %d)!\n", ret);
+ goto exit;
+ }
+- priv->netdev_registered = 1;
+
+- printk(KERN_INFO "%s: USB %s, MAC %s, firmware %d.%d.%d-%d\n",
+- netdev->name, dev_name(&interface->dev), mac2str(priv->mac_addr),
+- priv->fw_version.major, priv->fw_version.minor,
+- priv->fw_version.patch, priv->fw_version.build);
+- printk(KERN_INFO "%s: regulatory domain 0x%02x: %s\n", netdev->name,
+- priv->regulatory_domain, priv->domain->name);
++ priv->mac80211_registered = 1;
+
+- /* we let this timer run the whole time this driver instance lives */
+- mod_timer(&priv->bss_list_timer, jiffies + BSS_LIST_TIMEOUT);
++ dev_info(dev, "%s: USB %s, MAC %s, firmware %d.%d.%d-%d\n",
++ wiphy_name(priv->hw->wiphy),
++ dev_name(&interface->dev), mac2str(priv->mac_addr),
++ priv->fw_version.major, priv->fw_version.minor,
++ priv->fw_version.patch, priv->fw_version.build);
++ dev_info(dev, "%s: regulatory domain 0x%02x: %s\n",
++ wiphy_name(priv->hw->wiphy),
++ priv->regulatory_domain, priv->domain->name);
++ dev_info(dev, "%s: WPA support: ", wiphy_name(priv->hw->wiphy));
++ if (!FIRMWARE_IS_WPA(priv->fw_version))
++ printk("none\n");
++ else {
++ if (!at76_is_505a(priv->board_type))
++ printk("TKIP\n");
++ else
++ printk("TKIP, AES/CCMP\n");
++ };
+
+ exit:
+ return ret;
+@@ -5344,15 +2556,13 @@
+
+ static void at76_delete_device(struct at76_priv *priv)
+ {
+- int i;
+-
+ at76_dbg(DBG_PROC_ENTRY, "%s: ENTER", __func__);
+
+ /* The device is gone, don't bother turning it off */
+ priv->device_unplugged = 1;
+
+- if (priv->netdev_registered)
+- unregister_netdev(priv->netdev);
++ if (priv->mac80211_registered)
++ ieee80211_unregister_hw(priv->hw);
+
+ /* assuming we used keventd, it must quiesce too */
+ flush_scheduled_work();
+@@ -5373,25 +2583,11 @@
+ if (priv->rx_skb)
+ kfree_skb(priv->rx_skb);
+
+- at76_free_bss_list(priv);
+- del_timer_sync(&priv->bss_list_timer);
+- cancel_delayed_work(&priv->dwork_get_scan);
+- cancel_delayed_work(&priv->dwork_beacon);
+- cancel_delayed_work(&priv->dwork_auth);
+- cancel_delayed_work(&priv->dwork_assoc);
+-
+- if (priv->mac_state == MAC_CONNECTED)
+- at76_iwevent_bss_disconnect(priv->netdev);
+-
+- for (i = 0; i < NR_RX_DATA_BUF; i++)
+- if (priv->rx_data[i].skb) {
+- dev_kfree_skb(priv->rx_data[i].skb);
+- priv->rx_data[i].skb = NULL;
+- }
+ usb_put_dev(priv->udev);
+
+- at76_dbg(DBG_PROC_ENTRY, "%s: before freeing priv/netdev", __func__);
+- free_netdev(priv->netdev); /* priv is in netdev */
++ at76_dbg(DBG_PROC_ENTRY, "%s: before freeing priv/ieee80211_hw",
++ __func__);
++ ieee80211_free_hw(priv->hw);
+
+ at76_dbg(DBG_PROC_ENTRY, "%s: EXIT", __func__);
+ }
+@@ -5425,8 +2621,8 @@
+ we get 204 with 2.4.23, Fiberline FL-WL240u (505A+RFMD2958) ??? */
+
+ if (op_mode == OPMODE_HW_CONFIG_MODE) {
+- dev_printk(KERN_ERR, &interface->dev,
+- "cannot handle a device in HW_CONFIG_MODE\n");
++ dev_err(&interface->dev,
++ "cannot handle a device in HW_CONFIG_MODE\n");
+ ret = -EBUSY;
+ goto error;
+ }
+@@ -5434,13 +2630,12 @@
+ if (op_mode != OPMODE_NORMAL_NIC_WITH_FLASH
+ && op_mode != OPMODE_NORMAL_NIC_WITHOUT_FLASH) {
+ /* download internal firmware part */
+- dev_printk(KERN_DEBUG, &interface->dev,
+- "downloading internal firmware\n");
++ dev_dbg(&interface->dev, "downloading internal firmware\n");
+ ret = at76_load_internal_fw(udev, fwe);
+ if (ret < 0) {
+- dev_printk(KERN_ERR, &interface->dev,
+- "error %d downloading internal firmware\n",
+- ret);
++ dev_err(&interface->dev,
++ "error %d downloading internal firmware\n",
++ ret);
+ goto error;
+ }
+ usb_put_dev(udev);
+@@ -5465,8 +2660,7 @@
+ need_ext_fw = 1;
+
+ if (need_ext_fw) {
+- dev_printk(KERN_DEBUG, &interface->dev,
+- "downloading external firmware\n");
++ dev_dbg(&interface->dev, "downloading external firmware\n");
+
+ ret = at76_load_external_fw(udev, fwe);
+ if (ret)
+@@ -5475,8 +2669,8 @@
+ /* Re-check firmware version */
+ ret = at76_get_mib(udev, MIB_FW_VERSION, &fwv, sizeof(fwv));
+ if (ret < 0) {
+- dev_printk(KERN_ERR, &interface->dev,
+- "error %d getting firmware version\n", ret);
++ dev_err(&interface->dev,
++ "error %d getting firmware version\n", ret);
+ goto error;
+ }
+ }
+@@ -5487,7 +2681,6 @@
+ goto error;
+ }
+
+- SET_NETDEV_DEV(priv->netdev, &interface->dev);
+ usb_set_intfdata(interface, priv);
+
+ memcpy(&priv->fw_version, &fwv, sizeof(struct mib_fw_version));
+@@ -5515,7 +2708,7 @@
+ if (!priv)
+ return;
+
+- printk(KERN_INFO "%s: disconnecting\n", priv->netdev->name);
++ printk(KERN_INFO "%s: disconnecting\n", wiphy_name(priv->hw->wiphy));
+ at76_delete_device(priv);
+ dev_printk(KERN_INFO, &interface->dev, "disconnected\n");
+ }
+@@ -5571,5 +2764,8 @@
+ MODULE_AUTHOR("Nick Jones");
+ MODULE_AUTHOR("Balint Seeber <n0_5p4m_p13453@hotmail.com>");
+ MODULE_AUTHOR("Pavel Roskin <proski@gnu.org>");
++MODULE_AUTHOR("Guido Guenther <agx@sigxcpu.org>");
++MODULE_AUTHOR("Kalle Valo <kalle.valo@iki.fi>");
++MODULE_AUTHOR("Milan Plzik <milan.plzik@gmail.com>");
+ MODULE_DESCRIPTION(DRIVER_DESC);
+ MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/at76_usb/at76_usb.h linux-2.6.29-rc3.owrt/drivers/staging/at76_usb/at76_usb.h
+--- linux-2.6.29.owrt/drivers/staging/at76_usb/at76_usb.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/staging/at76_usb/at76_usb.h 2009-05-10 23:48:29.000000000 +0200
+@@ -34,23 +34,6 @@
+ BOARD_505AMX = 8
+ };
+
+-/* our private ioctl's */
+-/* preamble length (0 - long, 1 - short, 2 - auto) */
+-#define AT76_SET_SHORT_PREAMBLE (SIOCIWFIRSTPRIV + 0)
+-#define AT76_GET_SHORT_PREAMBLE (SIOCIWFIRSTPRIV + 1)
+-/* which debug channels are enabled */
+-#define AT76_SET_DEBUG (SIOCIWFIRSTPRIV + 2)
+-#define AT76_GET_DEBUG (SIOCIWFIRSTPRIV + 3)
+-/* power save mode (incl. the Atmel proprietary smart save mode) */
+-#define AT76_SET_POWERSAVE_MODE (SIOCIWFIRSTPRIV + 4)
+-#define AT76_GET_POWERSAVE_MODE (SIOCIWFIRSTPRIV + 5)
+-/* min and max channel times for scan */
+-#define AT76_SET_SCAN_TIMES (SIOCIWFIRSTPRIV + 6)
+-#define AT76_GET_SCAN_TIMES (SIOCIWFIRSTPRIV + 7)
+-/* scan mode (0 - active, 1 - passive) */
+-#define AT76_SET_SCAN_MODE (SIOCIWFIRSTPRIV + 8)
+-#define AT76_GET_SCAN_MODE (SIOCIWFIRSTPRIV + 9)
+-
+ #define CMD_STATUS_IDLE 0x00
+ #define CMD_STATUS_COMPLETE 0x01
+ #define CMD_STATUS_UNKNOWN 0x02
+@@ -82,6 +65,7 @@
+ #define MIB_MAC 0x03
+ #define MIB_MAC_MGMT 0x05
+ #define MIB_MAC_WEP 0x06
++#define MIB_MAC_ENCRYPTION 0x06
+ #define MIB_PHY 0x07
+ #define MIB_FW_VERSION 0x08
+ #define MIB_MDOMAIN 0x09
+@@ -106,6 +90,26 @@
+ #define AT76_PM_ON 2
+ #define AT76_PM_SMART 3
+
++/* cipher values for encryption keys */
++#define CIPHER_NONE 0 /* this value is only guessed */
++#define CIPHER_WEP64 1
++#define CIPHER_TKIP 2
++#define CIPHER_CCMP 3
++#define CIPHER_CCX 4 /* for consistency sake only */
++#define CIPHER_WEP128 5
++
++/* bit flags key types for encryption keys */
++#define KEY_PAIRWISE 2
++#define KEY_TX 4
++
++#define CIPHER_KEYS (4)
++#define CIPHER_KEY_LEN (40)
++
++struct key_config {
++ u8 cipher;
++ u8 keylen;
++};
++
+ struct hwcfg_r505 {
+ u8 cr39_values[14];
+ u8 reserved1[14];
+@@ -147,6 +151,9 @@
+
+ #define WEP_SMALL_KEY_LEN (40 / 8)
+ #define WEP_LARGE_KEY_LEN (104 / 8)
++#define WEP_KEYS (4)
++
++
+
+ struct at76_card_config {
+ u8 exclude_unencrypted;
+@@ -161,7 +168,7 @@
+ u8 privacy_invoked;
+ u8 wep_default_key_id; /* 0..3 */
+ u8 current_ssid[32];
+- u8 wep_default_key_value[4][WEP_KEY_LEN];
++ u8 wep_default_key_value[4][WEP_LARGE_KEY_LEN];
+ u8 ssid_len;
+ u8 short_preamble;
+ __le16 beacon_period;
+@@ -186,7 +193,7 @@
+ u8 link_quality;
+ u8 noise_level;
+ __le32 rx_time;
+- u8 packet[IEEE80211_FRAME_LEN + IEEE80211_FCS_LEN];
++ u8 packet[IEEE80211_MAX_FRAG_THRESHOLD];
+ } __attribute__((packed));
+
+ /* Length of Atmel-specific Tx header before 802.11 frame */
+@@ -196,8 +203,11 @@
+ __le16 wlength;
+ u8 tx_rate;
+ u8 padding;
+- u8 reserved[4];
+- u8 packet[IEEE80211_FRAME_LEN + IEEE80211_FCS_LEN];
++ u8 key_id;
++ u8 cipher_type;
++ u8 cipher_length;
++ u8 reserved;
++ u8 packet[IEEE80211_MAX_FRAG_THRESHOLD];
+ } __attribute__((packed));
+
+ /* defines for scan_type below */
+@@ -244,6 +254,7 @@
+ u8 byte;
+ __le16 word;
+ u8 addr[ETH_ALEN];
++ u8 data[256]; /* we need more space for mib_mac_encryption */
+ } data;
+ } __attribute__((packed));
+
+@@ -317,10 +328,24 @@
+ u8 exclude_unencrypted;
+ __le32 wep_icv_error_count;
+ __le32 wep_excluded_count;
+- u8 wep_default_keyvalue[WEP_KEYS][WEP_KEY_LEN];
++ u8 wep_default_keyvalue[WEP_KEYS][WEP_LARGE_KEY_LEN];
+ u8 encryption_level; /* 1 for 40bit, 2 for 104bit encryption */
+ } __attribute__((packed));
+
++struct mib_mac_encryption {
++ u8 cipher_default_keyvalue[CIPHER_KEYS][CIPHER_KEY_LEN];
++ u8 tkip_bssid[6];
++ u8 privacy_invoked;
++ u8 cipher_default_key_id;
++ u8 cipher_default_group_key_id;
++ u8 exclude_unencrypted;
++ u8 wep_encryption_type;
++ u8 ckip_key_permutation; /* bool */
++ __le32 wep_icv_error_count;
++ __le32 wep_excluded_count;
++ u8 key_rsc[CIPHER_KEYS][8];
++} __attribute__((packed));
++
+ struct mib_phy {
+ __le32 ed_threshold;
+
+@@ -364,16 +389,6 @@
+ __le32 ext_fw_len; /* external firmware image length */
+ } __attribute__((packed));
+
+-enum mac_state {
+- MAC_INIT,
+- MAC_SCANNING,
+- MAC_AUTH,
+- MAC_ASSOC,
+- MAC_JOINING,
+- MAC_CONNECTED,
+- MAC_OWN_IBSS
+-};
+-
+ /* a description of a regulatory domain and the allowed channels */
+ struct reg_domain {
+ u16 code;
+@@ -381,47 +396,6 @@
+ u32 channel_map; /* if bit N is set, channel (N+1) is allowed */
+ };
+
+-/* how long do we keep a (I)BSS in the bss_list in jiffies
+- this should be long enough for the user to retrieve the table
+- (by iwlist ?) after the device started, because all entries from
+- other channels than the one the device locks on get removed, too */
+-#define BSS_LIST_TIMEOUT (120 * HZ)
+-/* struct to store BSS info found during scan */
+-#define BSS_LIST_MAX_RATE_LEN 32 /* 32 rates should be enough ... */
+-
+-struct bss_info {
+- struct list_head list;
+-
+- u8 bssid[ETH_ALEN]; /* bssid */
+- u8 ssid[IW_ESSID_MAX_SIZE]; /* essid */
+- u8 ssid_len; /* length of ssid above */
+- u8 channel;
+- u16 capa; /* BSS capabilities */
+- u16 beacon_interval; /* beacon interval, Kus (1024 microseconds) */
+- u8 rates[BSS_LIST_MAX_RATE_LEN]; /* supported rates in units of
+- 500 kbps, ORed with 0x80 for
+- basic rates */
+- u8 rates_len;
+-
+- /* quality of received beacon */
+- u8 rssi;
+- u8 link_qual;
+- u8 noise_level;
+-
+- unsigned long last_rx; /* time (jiffies) of last beacon received */
+-};
+-
+-/* a rx data buffer to collect rx fragments */
+-struct rx_data_buf {
+- u8 sender[ETH_ALEN]; /* sender address */
+- u16 seqnr; /* sequence number */
+- u16 fragnr; /* last fragment received */
+- unsigned long last_rx; /* jiffies of last rx */
+- struct sk_buff *skb; /* == NULL if entry is free */
+-};
+-
+-#define NR_RX_DATA_BUF 8
+-
+ /* Data for one loaded firmware file */
+ struct fwentry {
+ const char *const fwname;
+@@ -438,11 +412,9 @@
+
+ struct at76_priv {
+ struct usb_device *udev; /* USB device pointer */
+- struct net_device *netdev; /* net device pointer */
+- struct net_device_stats stats; /* net device stats */
+- struct iw_statistics wstats; /* wireless stats */
+
+ struct sk_buff *rx_skb; /* skbuff for receiving data */
++ struct sk_buff *tx_skb; /* skbuff for transmitting data */
+ void *bulk_out_buffer; /* buffer for sending data */
+
+ struct urb *tx_urb; /* URB for sending data */
+@@ -454,26 +426,17 @@
+ struct mutex mtx; /* locks this structure */
+
+ /* work queues */
+- struct work_struct work_assoc_done;
+- struct work_struct work_join;
+- struct work_struct work_new_bss;
+- struct work_struct work_start_scan;
+ struct work_struct work_set_promisc;
+ struct work_struct work_submit_rx;
+- struct delayed_work dwork_restart;
+- struct delayed_work dwork_get_scan;
+- struct delayed_work dwork_beacon;
+- struct delayed_work dwork_auth;
+- struct delayed_work dwork_assoc;
++ struct delayed_work dwork_hw_scan;
+
+ struct tasklet_struct rx_tasklet;
+
+ /* the WEP stuff */
+ int wep_enabled; /* 1 if WEP is enabled */
+ int wep_key_id; /* key id to be used */
+- u8 wep_keys[WEP_KEYS][WEP_KEY_LEN]; /* the four WEP keys,
+- 5 or 13 bytes are used */
+- u8 wep_keys_len[WEP_KEYS]; /* the length of the above keys */
++ u8 wep_keys[WEP_KEYS][WEP_LARGE_KEY_LEN]; /* WEP keys */
++ u8 wep_keys_len[WEP_KEYS]; /* length of WEP keys */
+
+ int channel;
+ int iw_mode;
+@@ -495,44 +458,13 @@
+ int scan_mode; /* SCAN_TYPE_ACTIVE, SCAN_TYPE_PASSIVE */
+ int scan_need_any; /* if set, need to scan for any ESSID */
+
+- /* the list we got from scanning */
+- spinlock_t bss_list_spinlock; /* protects bss_list operations */
+- struct list_head bss_list; /* list of BSS we got beacons from */
+- struct timer_list bss_list_timer; /* timer to purge old entries
+- from bss_list */
+- struct bss_info *curr_bss; /* current BSS */
+ u16 assoc_id; /* current association ID, if associated */
+
+- u8 wanted_bssid[ETH_ALEN];
+- int wanted_bssid_valid; /* != 0 if wanted_bssid is to be used */
+-
+- /* some data for infrastructure mode only */
+- spinlock_t mgmt_spinlock; /* this spinlock protects access to
+- next_mgmt_bulk */
+-
+- struct at76_tx_buffer *next_mgmt_bulk; /* pending management msg to
+- send via bulk out */
+- enum mac_state mac_state;
+- enum {
+- SCAN_IDLE,
+- SCAN_IN_PROGRESS,
+- SCAN_COMPLETED
+- } scan_state;
+- time_t last_scan;
+-
+- int retries; /* remaining retries in case of timeout when
+- * sending AuthReq or AssocReq */
+ u8 pm_mode; /* power management mode */
+ u32 pm_period; /* power management period in microseconds */
+
+ struct reg_domain const *domain; /* reg domain description */
+
+- /* iwspy support */
+- spinlock_t spy_spinlock;
+- struct iw_spy_data spy_data;
+-
+- struct iw_public_data wireless_data;
+-
+ /* These fields contain HW config provided by the device (not all of
+ * these fields are used by all board types) */
+ u8 mac_addr[ETH_ALEN];
+@@ -540,9 +472,6 @@
+
+ struct at76_card_config card_config;
+
+- /* store rx fragments until complete */
+- struct rx_data_buf rx_data[NR_RX_DATA_BUF];
+-
+ enum board_type board_type;
+ struct mib_fw_version fw_version;
+
+@@ -550,58 +479,20 @@
+ unsigned int netdev_registered:1;
+ struct set_mib_buffer mib_buf; /* global buffer for set_mib calls */
+
+- /* beacon counting */
+ int beacon_period; /* period of mgmt beacons, Kus */
+- int beacons_received;
+- unsigned long beacons_last_qual; /* time we restarted counting
+- beacons */
+-};
+
+-struct at76_rx_radiotap {
+- struct ieee80211_radiotap_header rt_hdr;
+- __le64 rt_tsft;
+- u8 rt_flags;
+- u8 rt_rate;
+- s8 rt_signal;
+- s8 rt_noise;
+-};
+-
+-#define AT76_RX_RADIOTAP_PRESENT \
+- ((1 << IEEE80211_RADIOTAP_TSFT) | \
+- (1 << IEEE80211_RADIOTAP_FLAGS) | \
+- (1 << IEEE80211_RADIOTAP_RATE) | \
+- (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL) | \
+- (1 << IEEE80211_RADIOTAP_DB_ANTNOISE))
+-
+-#define BEACON_MAX_DATA_LENGTH 1500
+-
+-/* the maximum size of an AssocReq packet */
+-#define ASSOCREQ_MAX_SIZE \
+- (AT76_TX_HDRLEN + sizeof(struct ieee80211_assoc_request) + \
+- 1 + 1 + IW_ESSID_MAX_SIZE + 1 + 1 + 4)
+-
+-/* for shared secret auth, add the challenge text size */
+-#define AUTH_FRAME_SIZE (AT76_TX_HDRLEN + sizeof(struct ieee80211_auth))
++ struct ieee80211_hw *hw;
++ int mac80211_registered;
+
+-/* Maximal number of AuthReq retries */
+-#define AUTH_RETRIES 3
+-
+-/* Maximal number of AssocReq retries */
+-#define ASSOC_RETRIES 3
+-
+-/* Beacon timeout in managed mode when we are connected */
+-#define BEACON_TIMEOUT (10 * HZ)
+-
+-/* Timeout for authentication response */
+-#define AUTH_TIMEOUT (1 * HZ)
++ struct key_config keys[4]; /* installed key types */
++ u8 default_pairwise_key;
++ u8 default_group_key;
++};
+
+-/* Timeout for association response */
+-#define ASSOC_TIMEOUT (1 * HZ)
++#define AT76_SUPPORTED_FILTERS FIF_PROMISC_IN_BSS
+
+-/* Polling interval when scan is running */
+ #define SCAN_POLL_INTERVAL (HZ / 4)
+
+-/* Command completion timeout */
+ #define CMD_COMPLETION_TIMEOUT (5 * HZ)
+
+ #define DEF_RTS_THRESHOLD 1536
+@@ -611,8 +502,6 @@
+ #define DEF_SCAN_MIN_TIME 10
+ #define DEF_SCAN_MAX_TIME 120
+
+-#define MAX_RTS_THRESHOLD (MAX_FRAG_THRESHOLD + 1)
+-
+ /* the max padding size for tx in bytes (see calc_padding) */
+ #define MAX_PADDING_SIZE 53
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/at76_usb/Kconfig linux-2.6.29-rc3.owrt/drivers/staging/at76_usb/Kconfig
+--- linux-2.6.29.owrt/drivers/staging/at76_usb/Kconfig 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/staging/at76_usb/Kconfig 2009-05-10 23:48:29.000000000 +0200
+@@ -1,6 +1,6 @@
+ config USB_ATMEL
+ tristate "Atmel at76c503/at76c505/at76c505a USB cards"
+- depends on WLAN_80211 && USB
++ depends on MAC80211 && WLAN_80211 && USB
+ default N
+ select FW_LOADER
+ ---help---
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/asyncmesg.h linux-2.6.29-rc3.owrt/drivers/staging/benet/asyncmesg.h
+--- linux-2.6.29.owrt/drivers/staging/benet/asyncmesg.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/asyncmesg.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,82 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * Autogenerated by srcgen version: 0127
++ */
++#ifndef __asyncmesg_amap_h__
++#define __asyncmesg_amap_h__
++#include "fwcmd_common.h"
++
++/* --- ASYNC_EVENT_CODES --- */
++#define ASYNC_EVENT_CODE_LINK_STATE (1)
++#define ASYNC_EVENT_CODE_ISCSI (2)
++
++/* --- ASYNC_LINK_STATES --- */
++#define ASYNC_EVENT_LINK_DOWN (0) /* Link Down on a port */
++#define ASYNC_EVENT_LINK_UP (1) /* Link Up on a port */
++
++/*
++ * The last 4 bytes of the async events have this common format. It allows
++ * the driver to distinguish [link]MCC_CQ_ENTRY[/link] structs from
++ * asynchronous events. Both arrive on the same completion queue. This
++ * structure also contains the common fields used to decode the async event.
++ */
++struct BE_ASYNC_EVENT_TRAILER_AMAP {
++ u8 rsvd0[8]; /* DWORD 0 */
++ u8 event_code[8]; /* DWORD 0 */
++ u8 event_type[8]; /* DWORD 0 */
++ u8 rsvd1[6]; /* DWORD 0 */
++ u8 async_event; /* DWORD 0 */
++ u8 valid; /* DWORD 0 */
++} __packed;
++struct ASYNC_EVENT_TRAILER_AMAP {
++ u32 dw[1];
++};
++
++/*
++ * Applicable in Initiator, Target and NIC modes.
++ * A link state async event is seen by all device drivers as soon they
++ * create an MCC ring. Thereafter, anytime the link status changes the
++ * drivers will receive a link state async event. Notifications continue to
++ * be sent until a driver destroys its MCC ring. A link down event is
++ * reported when either port loses link. A link up event is reported
++ * when either port regains link. When BE's failover mechanism is enabled, a
++ * link down on the active port causes traffic to be diverted to the standby
++ * port by the BE's ARM firmware (assuming the standby port has link). In
++ * this case, the standy port assumes the active status. Note: when link is
++ * restored on the failed port, traffic continues on the currently active
++ * port. The ARM firmware does not attempt to 'fail back' traffic to
++ * the restored port.
++ */
++struct BE_ASYNC_EVENT_LINK_STATE_AMAP {
++ u8 port0_link_status[8];
++ u8 port1_link_status[8];
++ u8 active_port[8];
++ u8 rsvd0[8]; /* DWORD 0 */
++ u8 port0_duplex[8];
++ u8 port0_speed[8];
++ u8 port1_duplex[8];
++ u8 port1_speed[8];
++ u8 port0_fault[8];
++ u8 port1_fault[8];
++ u8 rsvd1[2][8]; /* DWORD 2 */
++ struct BE_ASYNC_EVENT_TRAILER_AMAP trailer;
++} __packed;
++struct ASYNC_EVENT_LINK_STATE_AMAP {
++ u32 dw[4];
++};
++#endif /* __asyncmesg_amap_h__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/be_cm.h linux-2.6.29-rc3.owrt/drivers/staging/benet/be_cm.h
+--- linux-2.6.29.owrt/drivers/staging/benet/be_cm.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/be_cm.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,134 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * Autogenerated by srcgen version: 0127
++ */
++#ifndef __be_cm_amap_h__
++#define __be_cm_amap_h__
++#include "be_common.h"
++#include "etx_context.h"
++#include "mpu_context.h"
++
++/*
++ * --- CEV_WATERMARK_ENUM ---
++ * CQ/EQ Watermark Encodings. Encoded as number of free entries in
++ * Queue when Watermark is reached.
++ */
++#define CEV_WMARK_0 (0) /* Watermark when Queue full */
++#define CEV_WMARK_16 (1) /* Watermark at 16 free entries */
++#define CEV_WMARK_32 (2) /* Watermark at 32 free entries */
++#define CEV_WMARK_48 (3) /* Watermark at 48 free entries */
++#define CEV_WMARK_64 (4) /* Watermark at 64 free entries */
++#define CEV_WMARK_80 (5) /* Watermark at 80 free entries */
++#define CEV_WMARK_96 (6) /* Watermark at 96 free entries */
++#define CEV_WMARK_112 (7) /* Watermark at 112 free entries */
++#define CEV_WMARK_128 (8) /* Watermark at 128 free entries */
++#define CEV_WMARK_144 (9) /* Watermark at 144 free entries */
++#define CEV_WMARK_160 (10) /* Watermark at 160 free entries */
++#define CEV_WMARK_176 (11) /* Watermark at 176 free entries */
++#define CEV_WMARK_192 (12) /* Watermark at 192 free entries */
++#define CEV_WMARK_208 (13) /* Watermark at 208 free entries */
++#define CEV_WMARK_224 (14) /* Watermark at 224 free entries */
++#define CEV_WMARK_240 (15) /* Watermark at 240 free entries */
++
++/*
++ * --- CQ_CNT_ENUM ---
++ * Completion Queue Count Encodings.
++ */
++#define CEV_CQ_CNT_256 (0) /* CQ has 256 entries */
++#define CEV_CQ_CNT_512 (1) /* CQ has 512 entries */
++#define CEV_CQ_CNT_1024 (2) /* CQ has 1024 entries */
++
++/*
++ * --- EQ_CNT_ENUM ---
++ * Event Queue Count Encodings.
++ */
++#define CEV_EQ_CNT_256 (0) /* EQ has 256 entries (16-byte EQEs only) */
++#define CEV_EQ_CNT_512 (1) /* EQ has 512 entries (16-byte EQEs only) */
++#define CEV_EQ_CNT_1024 (2) /* EQ has 1024 entries (4-byte or */
++ /* 16-byte EQEs only) */
++#define CEV_EQ_CNT_2048 (3) /* EQ has 2048 entries (4-byte or */
++ /* 16-byte EQEs only) */
++#define CEV_EQ_CNT_4096 (4) /* EQ has 4096 entries (4-byte EQEs only) */
++
++/*
++ * --- EQ_SIZE_ENUM ---
++ * Event Queue Entry Size Encoding.
++ */
++#define CEV_EQ_SIZE_4 (0) /* EQE is 4 bytes */
++#define CEV_EQ_SIZE_16 (1) /* EQE is 16 bytes */
++
++/*
++ * Completion Queue Context Table Entry. Contains the state of a CQ.
++ * Located in RAM within the CEV block.
++ */
++struct BE_CQ_CONTEXT_AMAP {
++ u8 Cidx[11]; /* DWORD 0 */
++ u8 Watermark[4]; /* DWORD 0 */
++ u8 NoDelay; /* DWORD 0 */
++ u8 EPIdx[11]; /* DWORD 0 */
++ u8 Count[2]; /* DWORD 0 */
++ u8 valid; /* DWORD 0 */
++ u8 SolEvent; /* DWORD 0 */
++ u8 Eventable; /* DWORD 0 */
++ u8 Pidx[11]; /* DWORD 1 */
++ u8 PD[10]; /* DWORD 1 */
++ u8 EQID[7]; /* DWORD 1 */
++ u8 Func; /* DWORD 1 */
++ u8 WME; /* DWORD 1 */
++ u8 Stalled; /* DWORD 1 */
++ u8 Armed; /* DWORD 1 */
++} __packed;
++struct CQ_CONTEXT_AMAP {
++ u32 dw[2];
++};
++
++/*
++ * Event Queue Context Table Entry. Contains the state of an EQ.
++ * Located in RAM in the CEV block.
++ */
++struct BE_EQ_CONTEXT_AMAP {
++ u8 Cidx[13]; /* DWORD 0 */
++ u8 rsvd0[2]; /* DWORD 0 */
++ u8 Func; /* DWORD 0 */
++ u8 EPIdx[13]; /* DWORD 0 */
++ u8 valid; /* DWORD 0 */
++ u8 rsvd1; /* DWORD 0 */
++ u8 Size; /* DWORD 0 */
++ u8 Pidx[13]; /* DWORD 1 */
++ u8 rsvd2[3]; /* DWORD 1 */
++ u8 PD[10]; /* DWORD 1 */
++ u8 Count[3]; /* DWORD 1 */
++ u8 SolEvent; /* DWORD 1 */
++ u8 Stalled; /* DWORD 1 */
++ u8 Armed; /* DWORD 1 */
++ u8 Watermark[4]; /* DWORD 2 */
++ u8 WME; /* DWORD 2 */
++ u8 rsvd3[3]; /* DWORD 2 */
++ u8 EventVect[6]; /* DWORD 2 */
++ u8 rsvd4[2]; /* DWORD 2 */
++ u8 Delay[8]; /* DWORD 2 */
++ u8 rsvd5[6]; /* DWORD 2 */
++ u8 TMR; /* DWORD 2 */
++ u8 rsvd6; /* DWORD 2 */
++ u8 rsvd7[32]; /* DWORD 3 */
++} __packed;
++struct EQ_CONTEXT_AMAP {
++ u32 dw[4];
++};
++
++#endif /* __be_cm_amap_h__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/be_common.h linux-2.6.29-rc3.owrt/drivers/staging/benet/be_common.h
+--- linux-2.6.29.owrt/drivers/staging/benet/be_common.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/be_common.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,53 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * Autogenerated by srcgen version: 0127
++ */
++#ifndef __be_common_amap_h__
++#define __be_common_amap_h__
++
++/* Physical Address. */
++struct BE_PHYS_ADDR_AMAP {
++ u8 lo[32]; /* DWORD 0 */
++ u8 hi[32]; /* DWORD 1 */
++} __packed;
++struct PHYS_ADDR_AMAP {
++ u32 dw[2];
++};
++
++/* Virtual Address. */
++struct BE_VIRT_ADDR_AMAP {
++ u8 lo[32]; /* DWORD 0 */
++ u8 hi[32]; /* DWORD 1 */
++} __packed;
++struct VIRT_ADDR_AMAP {
++ u32 dw[2];
++};
++
++/* Scatter gather element. */
++struct BE_SGE_AMAP {
++ u8 addr_hi[32]; /* DWORD 0 */
++ u8 addr_lo[32]; /* DWORD 1 */
++ u8 rsvd0[32]; /* DWORD 2 */
++ u8 len[16]; /* DWORD 3 */
++ u8 rsvd1[16]; /* DWORD 3 */
++} __packed;
++struct SGE_AMAP {
++ u32 dw[4];
++};
++
++#endif /* __be_common_amap_h__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/be_ethtool.c linux-2.6.29-rc3.owrt/drivers/staging/benet/be_ethtool.c
+--- linux-2.6.29.owrt/drivers/staging/benet/be_ethtool.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/be_ethtool.c 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,348 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * be_ethtool.c
++ *
++ * This file contains various functions that ethtool can use
++ * to talk to the driver and the BE H/W.
++ */
++
++#include "benet.h"
++
++#include <linux/ethtool.h>
++
++static const char benet_gstrings_stats[][ETH_GSTRING_LEN] = {
++/* net_device_stats */
++ "rx_packets",
++ "tx_packets",
++ "rx_bytes",
++ "tx_bytes",
++ "rx_errors",
++ "tx_errors",
++ "rx_dropped",
++ "tx_dropped",
++ "multicast",
++ "collisions",
++ "rx_length_errors",
++ "rx_over_errors",
++ "rx_crc_errors",
++ "rx_frame_errors",
++ "rx_fifo_errors",
++ "rx_missed_errors",
++ "tx_aborted_errors",
++ "tx_carrier_errors",
++ "tx_fifo_errors",
++ "tx_heartbeat_errors",
++ "tx_window_errors",
++ "rx_compressed",
++ "tc_compressed",
++/* BE driver Stats */
++ "bes_tx_reqs",
++ "bes_tx_fails",
++ "bes_fwd_reqs",
++ "bes_tx_wrbs",
++ "bes_interrupts",
++ "bes_events",
++ "bes_tx_events",
++ "bes_rx_events",
++ "bes_tx_compl",
++ "bes_rx_compl",
++ "bes_ethrx_post_fail",
++ "bes_802_3_dropped_frames",
++ "bes_802_3_malformed_frames",
++ "bes_rx_misc_pkts",
++ "bes_eth_tx_rate",
++ "bes_eth_rx_rate",
++ "Num Packets collected",
++ "Num Times Flushed",
++};
++
++#define NET_DEV_STATS_LEN \
++ (sizeof(struct net_device_stats)/sizeof(unsigned long))
++
++#define BENET_STATS_LEN ARRAY_SIZE(benet_gstrings_stats)
++
++static void
++be_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo)
++{
++ struct be_net_object *pnob = netdev_priv(netdev);
++ struct be_adapter *adapter = pnob->adapter;
++
++ strncpy(drvinfo->driver, be_driver_name, 32);
++ strncpy(drvinfo->version, be_drvr_ver, 32);
++ strncpy(drvinfo->fw_version, be_fw_ver, 32);
++ strcpy(drvinfo->bus_info, pci_name(adapter->pdev));
++ drvinfo->testinfo_len = 0;
++ drvinfo->regdump_len = 0;
++ drvinfo->eedump_len = 0;
++}
++
++static int
++be_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce)
++{
++ struct be_net_object *pnob = netdev_priv(netdev);
++ struct be_adapter *adapter = pnob->adapter;
++
++ coalesce->rx_max_coalesced_frames = adapter->max_rx_coal;
++
++ coalesce->rx_coalesce_usecs = adapter->cur_eqd;
++ coalesce->rx_coalesce_usecs_high = adapter->max_eqd;
++ coalesce->rx_coalesce_usecs_low = adapter->min_eqd;
++
++ coalesce->tx_coalesce_usecs = adapter->cur_eqd;
++ coalesce->tx_coalesce_usecs_high = adapter->max_eqd;
++ coalesce->tx_coalesce_usecs_low = adapter->min_eqd;
++
++ coalesce->use_adaptive_rx_coalesce = adapter->enable_aic;
++ coalesce->use_adaptive_tx_coalesce = adapter->enable_aic;
++
++ return 0;
++}
++
++/*
++ * This routine is used to set interrup coalescing delay *as well as*
++ * the number of pkts to coalesce for LRO.
++ */
++static int
++be_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce)
++{
++ struct be_net_object *pnob = netdev_priv(netdev);
++ struct be_adapter *adapter = pnob->adapter;
++ struct be_eq_object *eq_objectp;
++ u32 max, min, cur;
++ int status;
++
++ adapter->max_rx_coal = coalesce->rx_max_coalesced_frames;
++ if (adapter->max_rx_coal >= BE_LRO_MAX_PKTS)
++ adapter->max_rx_coal = BE_LRO_MAX_PKTS;
++
++ if (adapter->enable_aic == 0 &&
++ coalesce->use_adaptive_rx_coalesce == 1) {
++ /* if AIC is being turned on now, start with an EQD of 0 */
++ adapter->cur_eqd = 0;
++ }
++ adapter->enable_aic = coalesce->use_adaptive_rx_coalesce;
++
++ /* round off to nearest multiple of 8 */
++ max = (((coalesce->rx_coalesce_usecs_high + 4) >> 3) << 3);
++ min = (((coalesce->rx_coalesce_usecs_low + 4) >> 3) << 3);
++ cur = (((coalesce->rx_coalesce_usecs + 4) >> 3) << 3);
++
++ if (adapter->enable_aic) {
++ /* accept low and high if AIC is enabled */
++ if (max > MAX_EQD)
++ max = MAX_EQD;
++ if (min > max)
++ min = max;
++ adapter->max_eqd = max;
++ adapter->min_eqd = min;
++ if (adapter->cur_eqd > max)
++ adapter->cur_eqd = max;
++ if (adapter->cur_eqd < min)
++ adapter->cur_eqd = min;
++ } else {
++ /* accept specified coalesce_usecs only if AIC is disabled */
++ if (cur > MAX_EQD)
++ cur = MAX_EQD;
++ eq_objectp = &pnob->event_q_obj;
++ status =
++ be_eq_modify_delay(&pnob->fn_obj, 1, &eq_objectp, &cur,
++ NULL, NULL, NULL);
++ if (status == BE_SUCCESS)
++ adapter->cur_eqd = cur;
++ }
++ return 0;
++}
++
++static u32 be_get_rx_csum(struct net_device *netdev)
++{
++ struct be_net_object *pnob = netdev_priv(netdev);
++ struct be_adapter *adapter = pnob->adapter;
++ return adapter->rx_csum;
++}
++
++static int be_set_rx_csum(struct net_device *netdev, uint32_t data)
++{
++ struct be_net_object *pnob = netdev_priv(netdev);
++ struct be_adapter *adapter = pnob->adapter;
++
++ if (data)
++ adapter->rx_csum = 1;
++ else
++ adapter->rx_csum = 0;
++
++ return 0;
++}
++
++static void
++be_get_strings(struct net_device *netdev, uint32_t stringset, uint8_t *data)
++{
++ switch (stringset) {
++ case ETH_SS_STATS:
++ memcpy(data, *benet_gstrings_stats,
++ sizeof(benet_gstrings_stats));
++ break;
++ }
++}
++
++static int be_get_stats_count(struct net_device *netdev)
++{
++ return BENET_STATS_LEN;
++}
++
++static void
++be_get_ethtool_stats(struct net_device *netdev,
++ struct ethtool_stats *stats, uint64_t *data)
++{
++ struct be_net_object *pnob = netdev_priv(netdev);
++ struct be_adapter *adapter = pnob->adapter;
++ int i;
++
++ benet_get_stats(netdev);
++
++ for (i = 0; i <= NET_DEV_STATS_LEN; i++)
++ data[i] = ((unsigned long *)&adapter->benet_stats)[i];
++
++ data[i] = adapter->be_stat.bes_tx_reqs;
++ data[i++] = adapter->be_stat.bes_tx_fails;
++ data[i++] = adapter->be_stat.bes_fwd_reqs;
++ data[i++] = adapter->be_stat.bes_tx_wrbs;
++
++ data[i++] = adapter->be_stat.bes_ints;
++ data[i++] = adapter->be_stat.bes_events;
++ data[i++] = adapter->be_stat.bes_tx_events;
++ data[i++] = adapter->be_stat.bes_rx_events;
++ data[i++] = adapter->be_stat.bes_tx_compl;
++ data[i++] = adapter->be_stat.bes_rx_compl;
++ data[i++] = adapter->be_stat.bes_ethrx_post_fail;
++ data[i++] = adapter->be_stat.bes_802_3_dropped_frames;
++ data[i++] = adapter->be_stat.bes_802_3_malformed_frames;
++ data[i++] = adapter->be_stat.bes_rx_misc_pkts;
++ data[i++] = adapter->be_stat.bes_eth_tx_rate;
++ data[i++] = adapter->be_stat.bes_eth_rx_rate;
++ data[i++] = adapter->be_stat.bes_rx_coal;
++ data[i++] = adapter->be_stat.bes_rx_flush;
++
++}
++
++static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
++{
++ ecmd->speed = SPEED_10000;
++ ecmd->duplex = DUPLEX_FULL;
++ ecmd->autoneg = AUTONEG_DISABLE;
++ return 0;
++}
++
++/* Get the Ring parameters from the pnob */
++static void
++be_get_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring)
++{
++ struct be_net_object *pnob = netdev_priv(netdev);
++
++ /* Pre Set Maxims */
++ ring->rx_max_pending = pnob->rx_q_len;
++ ring->rx_mini_max_pending = ring->rx_mini_max_pending;
++ ring->rx_jumbo_max_pending = ring->rx_jumbo_max_pending;
++ ring->tx_max_pending = pnob->tx_q_len;
++
++ /* Current hardware Settings */
++ ring->rx_pending = atomic_read(&pnob->rx_q_posted);
++ ring->rx_mini_pending = ring->rx_mini_pending;
++ ring->rx_jumbo_pending = ring->rx_jumbo_pending;
++ ring->tx_pending = atomic_read(&pnob->tx_q_used);
++
++}
++
++static void
++be_get_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *ecmd)
++{
++ struct be_net_object *pnob = netdev_priv(netdev);
++ bool rxfc, txfc;
++ int status;
++
++ status = be_eth_get_flow_control(&pnob->fn_obj, &txfc, &rxfc);
++ if (status != BE_SUCCESS) {
++ dev_info(&netdev->dev, "Unable to get pause frame settings\n");
++ /* return defaults */
++ ecmd->rx_pause = 1;
++ ecmd->tx_pause = 0;
++ ecmd->autoneg = AUTONEG_ENABLE;
++ return;
++ }
++
++ if (txfc == true)
++ ecmd->tx_pause = 1;
++ else
++ ecmd->tx_pause = 0;
++
++ if (rxfc == true)
++ ecmd->rx_pause = 1;
++ else
++ ecmd->rx_pause = 0;
++
++ ecmd->autoneg = AUTONEG_ENABLE;
++}
++
++static int
++be_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *ecmd)
++{
++ struct be_net_object *pnob = netdev_priv(netdev);
++ bool txfc, rxfc;
++ int status;
++
++ if (ecmd->autoneg != AUTONEG_ENABLE)
++ return -EINVAL;
++
++ if (ecmd->tx_pause)
++ txfc = true;
++ else
++ txfc = false;
++
++ if (ecmd->rx_pause)
++ rxfc = true;
++ else
++ rxfc = false;
++
++ status = be_eth_set_flow_control(&pnob->fn_obj, txfc, rxfc);
++ if (status != BE_SUCCESS) {
++ dev_info(&netdev->dev, "Unable to set pause frame settings\n");
++ return -1;
++ }
++ return 0;
++}
++
++struct ethtool_ops be_ethtool_ops = {
++ .get_settings = be_get_settings,
++ .get_drvinfo = be_get_drvinfo,
++ .get_link = ethtool_op_get_link,
++ .get_coalesce = be_get_coalesce,
++ .set_coalesce = be_set_coalesce,
++ .get_ringparam = be_get_ringparam,
++ .get_pauseparam = be_get_pauseparam,
++ .set_pauseparam = be_set_pauseparam,
++ .get_rx_csum = be_get_rx_csum,
++ .set_rx_csum = be_set_rx_csum,
++ .get_tx_csum = ethtool_op_get_tx_csum,
++ .set_tx_csum = ethtool_op_set_tx_csum,
++ .get_sg = ethtool_op_get_sg,
++ .set_sg = ethtool_op_set_sg,
++ .get_tso = ethtool_op_get_tso,
++ .set_tso = ethtool_op_set_tso,
++ .get_strings = be_get_strings,
++ .get_stats_count = be_get_stats_count,
++ .get_ethtool_stats = be_get_ethtool_stats,
++};
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/be_init.c linux-2.6.29-rc3.owrt/drivers/staging/benet/be_init.c
+--- linux-2.6.29.owrt/drivers/staging/benet/be_init.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/be_init.c 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,1382 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++#include <linux/etherdevice.h>
++#include "benet.h"
++
++#define DRVR_VERSION "1.0.728"
++
++static const struct pci_device_id be_device_id_table[] = {
++ {PCI_DEVICE(0x19a2, 0x0201)},
++ {0}
++};
++
++MODULE_DEVICE_TABLE(pci, be_device_id_table);
++
++MODULE_VERSION(DRVR_VERSION);
++
++#define DRV_DESCRIPTION "ServerEngines BladeEngine Network Driver Version "
++
++MODULE_DESCRIPTION(DRV_DESCRIPTION DRVR_VERSION);
++MODULE_AUTHOR("ServerEngines");
++MODULE_LICENSE("GPL");
++
++static unsigned int msix = 1;
++module_param(msix, uint, S_IRUGO);
++MODULE_PARM_DESC(msix, "Use MSI-x interrupts");
++
++static unsigned int rxbuf_size = 2048; /* Default RX frag size */
++module_param(rxbuf_size, uint, S_IRUGO);
++MODULE_PARM_DESC(rxbuf_size, "Size of buffers to hold Rx data");
++
++const char be_drvr_ver[] = DRVR_VERSION;
++char be_fw_ver[32]; /* F/W version filled in by be_probe */
++char be_driver_name[] = "benet";
++
++/*
++ * Number of entries in each queue.
++ */
++#define EVENT_Q_LEN 1024
++#define ETH_TXQ_LEN 2048
++#define ETH_TXCQ_LEN 1024
++#define ETH_RXQ_LEN 1024 /* Does not support any other value */
++#define ETH_UC_RXCQ_LEN 1024
++#define ETH_BC_RXCQ_LEN 256
++#define MCC_Q_LEN 64 /* total size not to exceed 8 pages */
++#define MCC_CQ_LEN 256
++
++/* Bit mask describing events of interest to be traced */
++unsigned int trace_level;
++
++static int
++init_pci_be_function(struct be_adapter *adapter, struct pci_dev *pdev)
++{
++ u64 pa;
++
++ /* CSR */
++ pa = pci_resource_start(pdev, 2);
++ adapter->csr_va = ioremap_nocache(pa, pci_resource_len(pdev, 2));
++ if (adapter->csr_va == NULL)
++ return -ENOMEM;
++
++ /* Door Bell */
++ pa = pci_resource_start(pdev, 4);
++ adapter->db_va = ioremap_nocache(pa, (128 * 1024));
++ if (adapter->db_va == NULL) {
++ iounmap(adapter->csr_va);
++ return -ENOMEM;
++ }
++
++ /* PCI */
++ pa = pci_resource_start(pdev, 1);
++ adapter->pci_va = ioremap_nocache(pa, pci_resource_len(pdev, 1));
++ if (adapter->pci_va == NULL) {
++ iounmap(adapter->csr_va);
++ iounmap(adapter->db_va);
++ return -ENOMEM;
++ }
++ return 0;
++}
++
++/*
++ This function enables the interrupt corresponding to the Event
++ queue ID for the given NetObject
++*/
++void be_enable_eq_intr(struct be_net_object *pnob)
++{
++ struct CQ_DB_AMAP cqdb;
++ cqdb.dw[0] = 0;
++ AMAP_SET_BITS_PTR(CQ_DB, event, &cqdb, 1);
++ AMAP_SET_BITS_PTR(CQ_DB, rearm, &cqdb, 1);
++ AMAP_SET_BITS_PTR(CQ_DB, num_popped, &cqdb, 0);
++ AMAP_SET_BITS_PTR(CQ_DB, qid, &cqdb, pnob->event_q_id);
++ PD_WRITE(&pnob->fn_obj, cq_db, cqdb.dw[0]);
++}
++
++/*
++ This function disables the interrupt corresponding to the Event
++ queue ID for the given NetObject
++*/
++void be_disable_eq_intr(struct be_net_object *pnob)
++{
++ struct CQ_DB_AMAP cqdb;
++ cqdb.dw[0] = 0;
++ AMAP_SET_BITS_PTR(CQ_DB, event, &cqdb, 1);
++ AMAP_SET_BITS_PTR(CQ_DB, rearm, &cqdb, 0);
++ AMAP_SET_BITS_PTR(CQ_DB, num_popped, &cqdb, 0);
++ AMAP_SET_BITS_PTR(CQ_DB, qid, &cqdb, pnob->event_q_id);
++ PD_WRITE(&pnob->fn_obj, cq_db, cqdb.dw[0]);
++}
++
++/*
++ This function enables the interrupt from the network function
++ of the BladeEngine. Use the function be_disable_eq_intr()
++ to enable the interrupt from the event queue of only one specific
++ NetObject
++*/
++void be_enable_intr(struct be_net_object *pnob)
++{
++ struct PCICFG_HOST_TIMER_INT_CTRL_CSR_AMAP ctrl;
++ u32 host_intr;
++
++ ctrl.dw[0] = PCICFG1_READ(&pnob->fn_obj, host_timer_int_ctrl);
++ host_intr = AMAP_GET_BITS_PTR(PCICFG_HOST_TIMER_INT_CTRL_CSR,
++ hostintr, ctrl.dw);
++ if (!host_intr) {
++ AMAP_SET_BITS_PTR(PCICFG_HOST_TIMER_INT_CTRL_CSR,
++ hostintr, ctrl.dw, 1);
++ PCICFG1_WRITE(&pnob->fn_obj, host_timer_int_ctrl,
++ ctrl.dw[0]);
++ }
++}
++
++/*
++ This function disables the interrupt from the network function of
++ the BladeEngine. Use the function be_disable_eq_intr() to
++ disable the interrupt from the event queue of only one specific NetObject
++*/
++void be_disable_intr(struct be_net_object *pnob)
++{
++
++ struct PCICFG_HOST_TIMER_INT_CTRL_CSR_AMAP ctrl;
++ u32 host_intr;
++ ctrl.dw[0] = PCICFG1_READ(&pnob->fn_obj, host_timer_int_ctrl);
++ host_intr = AMAP_GET_BITS_PTR(PCICFG_HOST_TIMER_INT_CTRL_CSR,
++ hostintr, ctrl.dw);
++ if (host_intr) {
++ AMAP_SET_BITS_PTR(PCICFG_HOST_TIMER_INT_CTRL_CSR, hostintr,
++ ctrl.dw, 0);
++ PCICFG1_WRITE(&pnob->fn_obj, host_timer_int_ctrl,
++ ctrl.dw[0]);
++ }
++}
++
++static int be_enable_msix(struct be_adapter *adapter)
++{
++ int i, ret;
++
++ if (!msix)
++ return -1;
++
++ for (i = 0; i < BE_MAX_REQ_MSIX_VECTORS; i++)
++ adapter->msix_entries[i].entry = i;
++
++ ret = pci_enable_msix(adapter->pdev, adapter->msix_entries,
++ BE_MAX_REQ_MSIX_VECTORS);
++
++ if (ret == 0)
++ adapter->msix_enabled = 1;
++ return ret;
++}
++
++static int be_register_isr(struct be_adapter *adapter,
++ struct be_net_object *pnob)
++{
++ struct net_device *netdev = pnob->netdev;
++ int intx = 0, r;
++
++ netdev->irq = adapter->pdev->irq;
++ r = be_enable_msix(adapter);
++
++ if (r == 0) {
++ r = request_irq(adapter->msix_entries[0].vector,
++ be_int, IRQF_SHARED, netdev->name, netdev);
++ if (r) {
++ printk(KERN_WARNING
++ "MSIX Request IRQ failed - Errno %d\n", r);
++ intx = 1;
++ pci_disable_msix(adapter->pdev);
++ adapter->msix_enabled = 0;
++ }
++ } else {
++ intx = 1;
++ }
++
++ if (intx) {
++ r = request_irq(netdev->irq, be_int, IRQF_SHARED,
++ netdev->name, netdev);
++ if (r) {
++ printk(KERN_WARNING
++ "INTx Request IRQ failed - Errno %d\n", r);
++ return -1;
++ }
++ }
++ adapter->isr_registered = 1;
++ return 0;
++}
++
++static void be_unregister_isr(struct be_adapter *adapter)
++{
++ struct net_device *netdev = adapter->netdevp;
++ if (adapter->isr_registered) {
++ if (adapter->msix_enabled) {
++ free_irq(adapter->msix_entries[0].vector, netdev);
++ pci_disable_msix(adapter->pdev);
++ adapter->msix_enabled = 0;
++ } else {
++ free_irq(netdev->irq, netdev);
++ }
++ adapter->isr_registered = 0;
++ }
++}
++
++/*
++ This function processes the Flush Completions that are issued by the
++ ARM F/W, when a Recv Ring is destroyed. A flush completion is
++ identified when a Rx COmpl descriptor has the tcpcksum and udpcksum
++ set and the pktsize is 32. These completions are received on the
++ Rx Completion Queue.
++*/
++static u32 be_process_rx_flush_cmpl(struct be_net_object *pnob)
++{
++ struct ETH_RX_COMPL_AMAP *rxcp;
++ unsigned int i = 0;
++ while ((rxcp = be_get_rx_cmpl(pnob)) != NULL) {
++ be_notify_cmpl(pnob, 1, pnob->rx_cq_id, 1);
++ i++;
++ }
++ return i;
++}
++
++static void be_tx_q_clean(struct be_net_object *pnob)
++{
++ while (atomic_read(&pnob->tx_q_used))
++ process_one_tx_compl(pnob, tx_compl_lastwrb_idx_get(pnob));
++}
++
++static void be_rx_q_clean(struct be_net_object *pnob)
++{
++ if (pnob->rx_ctxt) {
++ int i;
++ struct be_rx_page_info *rx_page_info;
++ for (i = 0; i < pnob->rx_q_len; i++) {
++ rx_page_info = &(pnob->rx_page_info[i]);
++ if (!pnob->rx_pg_shared || rx_page_info->page_offset) {
++ pci_unmap_page(pnob->adapter->pdev,
++ pci_unmap_addr(rx_page_info, bus),
++ pnob->rx_buf_size,
++ PCI_DMA_FROMDEVICE);
++ }
++ if (rx_page_info->page)
++ put_page(rx_page_info->page);
++ memset(rx_page_info, 0, sizeof(struct be_rx_page_info));
++ }
++ pnob->rx_pg_info_hd = 0;
++ }
++}
++
++static void be_destroy_netobj(struct be_net_object *pnob)
++{
++ int status;
++
++ if (pnob->tx_q_created) {
++ status = be_eth_sq_destroy(&pnob->tx_q_obj);
++ pnob->tx_q_created = 0;
++ }
++
++ if (pnob->rx_q_created) {
++ status = be_eth_rq_destroy(&pnob->rx_q_obj);
++ if (status != 0) {
++ status = be_eth_rq_destroy_options(&pnob->rx_q_obj, 0,
++ NULL, NULL);
++ BUG_ON(status);
++ }
++ pnob->rx_q_created = 0;
++ }
++
++ be_process_rx_flush_cmpl(pnob);
++
++ if (pnob->tx_cq_created) {
++ status = be_cq_destroy(&pnob->tx_cq_obj);
++ pnob->tx_cq_created = 0;
++ }
++
++ if (pnob->rx_cq_created) {
++ status = be_cq_destroy(&pnob->rx_cq_obj);
++ pnob->rx_cq_created = 0;
++ }
++
++ if (pnob->mcc_q_created) {
++ status = be_mcc_ring_destroy(&pnob->mcc_q_obj);
++ pnob->mcc_q_created = 0;
++ }
++ if (pnob->mcc_cq_created) {
++ status = be_cq_destroy(&pnob->mcc_cq_obj);
++ pnob->mcc_cq_created = 0;
++ }
++
++ if (pnob->event_q_created) {
++ status = be_eq_destroy(&pnob->event_q_obj);
++ pnob->event_q_created = 0;
++ }
++ be_function_cleanup(&pnob->fn_obj);
++}
++
++/*
++ * free all resources associated with a pnob
++ * Called at the time of module cleanup as well a any error during
++ * module init. Some resources may be partially allocated in a NetObj.
++ */
++static void netobject_cleanup(struct be_adapter *adapter,
++ struct be_net_object *pnob)
++{
++ struct net_device *netdev = adapter->netdevp;
++
++ if (netif_running(netdev)) {
++ netif_stop_queue(netdev);
++ be_wait_nic_tx_cmplx_cmpl(pnob);
++ be_disable_eq_intr(pnob);
++ }
++
++ be_unregister_isr(adapter);
++
++ if (adapter->tasklet_started) {
++ tasklet_kill(&(adapter->sts_handler));
++ adapter->tasklet_started = 0;
++ }
++ if (pnob->fn_obj_created)
++ be_disable_intr(pnob);
++
++ if (adapter->dev_state != BE_DEV_STATE_NONE)
++ unregister_netdev(netdev);
++
++ if (pnob->fn_obj_created)
++ be_destroy_netobj(pnob);
++
++ adapter->net_obj = NULL;
++ adapter->netdevp = NULL;
++
++ be_rx_q_clean(pnob);
++ if (pnob->rx_ctxt) {
++ kfree(pnob->rx_page_info);
++ kfree(pnob->rx_ctxt);
++ }
++
++ be_tx_q_clean(pnob);
++ kfree(pnob->tx_ctxt);
++
++ if (pnob->mcc_q)
++ pci_free_consistent(adapter->pdev, pnob->mcc_q_size,
++ pnob->mcc_q, pnob->mcc_q_bus);
++
++ if (pnob->mcc_wrb_ctxt)
++ free_pages((unsigned long)pnob->mcc_wrb_ctxt,
++ get_order(pnob->mcc_wrb_ctxt_size));
++
++ if (pnob->mcc_cq)
++ pci_free_consistent(adapter->pdev, pnob->mcc_cq_size,
++ pnob->mcc_cq, pnob->mcc_cq_bus);
++
++ if (pnob->event_q)
++ pci_free_consistent(adapter->pdev, pnob->event_q_size,
++ pnob->event_q, pnob->event_q_bus);
++
++ if (pnob->tx_cq)
++ pci_free_consistent(adapter->pdev, pnob->tx_cq_size,
++ pnob->tx_cq, pnob->tx_cq_bus);
++
++ if (pnob->tx_q)
++ pci_free_consistent(adapter->pdev, pnob->tx_q_size,
++ pnob->tx_q, pnob->tx_q_bus);
++
++ if (pnob->rx_q)
++ pci_free_consistent(adapter->pdev, pnob->rx_q_size,
++ pnob->rx_q, pnob->rx_q_bus);
++
++ if (pnob->rx_cq)
++ pci_free_consistent(adapter->pdev, pnob->rx_cq_size,
++ pnob->rx_cq, pnob->rx_cq_bus);
++
++
++ if (pnob->mb_ptr)
++ pci_free_consistent(adapter->pdev, pnob->mb_size, pnob->mb_ptr,
++ pnob->mb_bus);
++
++ free_netdev(netdev);
++}
++
++
++static int be_nob_ring_alloc(struct be_adapter *adapter,
++ struct be_net_object *pnob)
++{
++ u32 size;
++
++ /* Mail box rd; mailbox pointer needs to be 16 byte aligned */
++ pnob->mb_size = sizeof(struct MCC_MAILBOX_AMAP) + 16;
++ pnob->mb_ptr = pci_alloc_consistent(adapter->pdev, pnob->mb_size,
++ &pnob->mb_bus);
++ if (!pnob->mb_bus)
++ return -1;
++ memset(pnob->mb_ptr, 0, pnob->mb_size);
++ pnob->mb_rd.va = PTR_ALIGN(pnob->mb_ptr, 16);
++ pnob->mb_rd.pa = PTR_ALIGN(pnob->mb_bus, 16);
++ pnob->mb_rd.length = sizeof(struct MCC_MAILBOX_AMAP);
++ /*
++ * Event queue
++ */
++ pnob->event_q_len = EVENT_Q_LEN;
++ pnob->event_q_size = pnob->event_q_len * sizeof(struct EQ_ENTRY_AMAP);
++ pnob->event_q = pci_alloc_consistent(adapter->pdev, pnob->event_q_size,
++ &pnob->event_q_bus);
++ if (!pnob->event_q_bus)
++ return -1;
++ memset(pnob->event_q, 0, pnob->event_q_size);
++ /*
++ * Eth TX queue
++ */
++ pnob->tx_q_len = ETH_TXQ_LEN;
++ pnob->tx_q_port = 0;
++ pnob->tx_q_size = pnob->tx_q_len * sizeof(struct ETH_WRB_AMAP);
++ pnob->tx_q = pci_alloc_consistent(adapter->pdev, pnob->tx_q_size,
++ &pnob->tx_q_bus);
++ if (!pnob->tx_q_bus)
++ return -1;
++ memset(pnob->tx_q, 0, pnob->tx_q_size);
++ /*
++ * Eth TX Compl queue
++ */
++ pnob->txcq_len = ETH_TXCQ_LEN;
++ pnob->tx_cq_size = pnob->txcq_len * sizeof(struct ETH_TX_COMPL_AMAP);
++ pnob->tx_cq = pci_alloc_consistent(adapter->pdev, pnob->tx_cq_size,
++ &pnob->tx_cq_bus);
++ if (!pnob->tx_cq_bus)
++ return -1;
++ memset(pnob->tx_cq, 0, pnob->tx_cq_size);
++ /*
++ * Eth RX queue
++ */
++ pnob->rx_q_len = ETH_RXQ_LEN;
++ pnob->rx_q_size = pnob->rx_q_len * sizeof(struct ETH_RX_D_AMAP);
++ pnob->rx_q = pci_alloc_consistent(adapter->pdev, pnob->rx_q_size,
++ &pnob->rx_q_bus);
++ if (!pnob->rx_q_bus)
++ return -1;
++ memset(pnob->rx_q, 0, pnob->rx_q_size);
++ /*
++ * Eth Unicast RX Compl queue
++ */
++ pnob->rx_cq_len = ETH_UC_RXCQ_LEN;
++ pnob->rx_cq_size = pnob->rx_cq_len *
++ sizeof(struct ETH_RX_COMPL_AMAP);
++ pnob->rx_cq = pci_alloc_consistent(adapter->pdev, pnob->rx_cq_size,
++ &pnob->rx_cq_bus);
++ if (!pnob->rx_cq_bus)
++ return -1;
++ memset(pnob->rx_cq, 0, pnob->rx_cq_size);
++
++ /* TX resources */
++ size = pnob->tx_q_len * sizeof(void **);
++ pnob->tx_ctxt = kzalloc(size, GFP_KERNEL);
++ if (pnob->tx_ctxt == NULL)
++ return -1;
++
++ /* RX resources */
++ size = pnob->rx_q_len * sizeof(void *);
++ pnob->rx_ctxt = kzalloc(size, GFP_KERNEL);
++ if (pnob->rx_ctxt == NULL)
++ return -1;
++
++ size = (pnob->rx_q_len * sizeof(struct be_rx_page_info));
++ pnob->rx_page_info = kzalloc(size, GFP_KERNEL);
++ if (pnob->rx_page_info == NULL)
++ return -1;
++
++ adapter->eth_statsp = kzalloc(sizeof(struct FWCMD_ETH_GET_STATISTICS),
++ GFP_KERNEL);
++ if (adapter->eth_statsp == NULL)
++ return -1;
++ pnob->rx_buf_size = rxbuf_size;
++ return 0;
++}
++
++/*
++ This function initializes the be_net_object for subsequent
++ network operations.
++
++ Before calling this function, the driver must have allocated
++ space for the NetObject structure, initialized the structure,
++ allocated DMAable memory for all the network queues that form
++ part of the NetObject and populated the start address (virtual)
++ and number of entries allocated for each queue in the NetObject structure.
++
++ The driver must also have allocated memory to hold the
++ mailbox structure (MCC_MAILBOX) and post the physical address,
++ virtual addresses and the size of the mailbox memory in the
++ NetObj.mb_rd. This structure is used by BECLIB for
++ initial communication with the embedded MCC processor. BECLIB
++ uses the mailbox until MCC rings are created for more efficient
++ communication with the MCC processor.
++
++ If the driver wants to create multiple network interface for more
++ than one protection domain, it can call be_create_netobj()
++ multiple times once for each protection domain. A Maximum of
++ 32 protection domains are supported.
++
++*/
++static int
++be_create_netobj(struct be_net_object *pnob, u8 __iomem *csr_va,
++ u8 __iomem *db_va, u8 __iomem *pci_va)
++{
++ int status = 0;
++ bool eventable = false, tx_no_delay = false, rx_no_delay = false;
++ struct be_eq_object *eq_objectp = NULL;
++ struct be_function_object *pfob = &pnob->fn_obj;
++ struct ring_desc rd;
++ u32 set_rxbuf_size;
++ u32 tx_cmpl_wm = CEV_WMARK_96; /* 0xffffffff to disable */
++ u32 rx_cmpl_wm = CEV_WMARK_160; /* 0xffffffff to disable */
++ u32 eq_delay = 0; /* delay in 8usec units. 0xffffffff to disable */
++
++ memset(&rd, 0, sizeof(struct ring_desc));
++
++ status = be_function_object_create(csr_va, db_va, pci_va,
++ BE_FUNCTION_TYPE_NETWORK, &pnob->mb_rd, pfob);
++ if (status != BE_SUCCESS)
++ return status;
++ pnob->fn_obj_created = true;
++
++ if (tx_cmpl_wm == 0xffffffff)
++ tx_no_delay = true;
++ if (rx_cmpl_wm == 0xffffffff)
++ rx_no_delay = true;
++ /*
++ * now create the necessary rings
++ * Event Queue first.
++ */
++ if (pnob->event_q_len) {
++ rd.va = pnob->event_q;
++ rd.pa = pnob->event_q_bus;
++ rd.length = pnob->event_q_size;
++
++ status = be_eq_create(pfob, &rd, 4, pnob->event_q_len,
++ (u32) -1, /* CEV_WMARK_* or -1 */
++ eq_delay, /* in 8us units, or -1 */
++ &pnob->event_q_obj);
++ if (status != BE_SUCCESS)
++ goto error_ret;
++ pnob->event_q_id = pnob->event_q_obj.eq_id;
++ pnob->event_q_created = 1;
++ eventable = true;
++ eq_objectp = &pnob->event_q_obj;
++ }
++ /*
++ * Now Eth Tx Compl. queue.
++ */
++ if (pnob->txcq_len) {
++ rd.va = pnob->tx_cq;
++ rd.pa = pnob->tx_cq_bus;
++ rd.length = pnob->tx_cq_size;
++
++ status = be_cq_create(pfob, &rd,
++ pnob->txcq_len * sizeof(struct ETH_TX_COMPL_AMAP),
++ false, /* solicted events, */
++ tx_no_delay, /* nodelay */
++ tx_cmpl_wm, /* Watermark encodings */
++ eq_objectp, &pnob->tx_cq_obj);
++ if (status != BE_SUCCESS)
++ goto error_ret;
++
++ pnob->tx_cq_id = pnob->tx_cq_obj.cq_id;
++ pnob->tx_cq_created = 1;
++ }
++ /*
++ * Eth Tx queue
++ */
++ if (pnob->tx_q_len) {
++ struct be_eth_sq_parameters ex_params = { 0 };
++ u32 type;
++
++ if (pnob->tx_q_port) {
++ /* TXQ to be bound to a specific port */
++ type = BE_ETH_TX_RING_TYPE_BOUND;
++ ex_params.port = pnob->tx_q_port - 1;
++ } else
++ type = BE_ETH_TX_RING_TYPE_STANDARD;
++
++ rd.va = pnob->tx_q;
++ rd.pa = pnob->tx_q_bus;
++ rd.length = pnob->tx_q_size;
++
++ status = be_eth_sq_create_ex(pfob, &rd,
++ pnob->tx_q_len * sizeof(struct ETH_WRB_AMAP),
++ type, 2, &pnob->tx_cq_obj,
++ &ex_params, &pnob->tx_q_obj);
++
++ if (status != BE_SUCCESS)
++ goto error_ret;
++
++ pnob->tx_q_id = pnob->tx_q_obj.bid;
++ pnob->tx_q_created = 1;
++ }
++ /*
++ * Now Eth Rx compl. queue. Always needed.
++ */
++ rd.va = pnob->rx_cq;
++ rd.pa = pnob->rx_cq_bus;
++ rd.length = pnob->rx_cq_size;
++
++ status = be_cq_create(pfob, &rd,
++ pnob->rx_cq_len * sizeof(struct ETH_RX_COMPL_AMAP),
++ false, /* solicted events, */
++ rx_no_delay, /* nodelay */
++ rx_cmpl_wm, /* Watermark encodings */
++ eq_objectp, &pnob->rx_cq_obj);
++ if (status != BE_SUCCESS)
++ goto error_ret;
++
++ pnob->rx_cq_id = pnob->rx_cq_obj.cq_id;
++ pnob->rx_cq_created = 1;
++
++ status = be_eth_rq_set_frag_size(pfob, pnob->rx_buf_size,
++ (u32 *) &set_rxbuf_size);
++ if (status != BE_SUCCESS) {
++ be_eth_rq_get_frag_size(pfob, (u32 *) &pnob->rx_buf_size);
++ if ((pnob->rx_buf_size != 2048) && (pnob->rx_buf_size != 4096)
++ && (pnob->rx_buf_size != 8192))
++ goto error_ret;
++ } else {
++ if (pnob->rx_buf_size != set_rxbuf_size)
++ pnob->rx_buf_size = set_rxbuf_size;
++ }
++ /*
++ * Eth RX queue. be_eth_rq_create() always assumes 2 pages size
++ */
++ rd.va = pnob->rx_q;
++ rd.pa = pnob->rx_q_bus;
++ rd.length = pnob->rx_q_size;
++
++ status = be_eth_rq_create(pfob, &rd, &pnob->rx_cq_obj,
++ &pnob->rx_cq_obj, &pnob->rx_q_obj);
++
++ if (status != BE_SUCCESS)
++ goto error_ret;
++
++ pnob->rx_q_id = pnob->rx_q_obj.rid;
++ pnob->rx_q_created = 1;
++
++ return BE_SUCCESS; /* All required queues created. */
++
++error_ret:
++ be_destroy_netobj(pnob);
++ return status;
++}
++
++static int be_nob_ring_init(struct be_adapter *adapter,
++ struct be_net_object *pnob)
++{
++ int status;
++
++ pnob->event_q_tl = 0;
++
++ pnob->tx_q_hd = 0;
++ pnob->tx_q_tl = 0;
++
++ pnob->tx_cq_tl = 0;
++
++ pnob->rx_cq_tl = 0;
++
++ memset(pnob->event_q, 0, pnob->event_q_size);
++ memset(pnob->tx_cq, 0, pnob->tx_cq_size);
++ memset(pnob->tx_ctxt, 0, pnob->tx_q_len * sizeof(void **));
++ memset(pnob->rx_ctxt, 0, pnob->rx_q_len * sizeof(void *));
++ pnob->rx_pg_info_hd = 0;
++ pnob->rx_q_hd = 0;
++ atomic_set(&pnob->rx_q_posted, 0);
++
++ status = be_create_netobj(pnob, adapter->csr_va, adapter->db_va,
++ adapter->pci_va);
++ if (status != BE_SUCCESS)
++ return -1;
++
++ be_post_eth_rx_buffs(pnob);
++ return 0;
++}
++
++/* This function handles async callback for link status */
++static void
++be_link_status_async_callback(void *context, u32 event_code, void *event)
++{
++ struct ASYNC_EVENT_LINK_STATE_AMAP *link_status = event;
++ struct be_adapter *adapter = context;
++ bool link_enable = false;
++ struct be_net_object *pnob;
++ struct ASYNC_EVENT_TRAILER_AMAP *async_trailer;
++ struct net_device *netdev;
++ u32 async_event_code, async_event_type, active_port;
++ u32 port0_link_status, port1_link_status, port0_duplex, port1_duplex;
++ u32 port0_speed, port1_speed;
++
++ if (event_code != ASYNC_EVENT_CODE_LINK_STATE) {
++ /* Not our event to handle */
++ return;
++ }
++ async_trailer = (struct ASYNC_EVENT_TRAILER_AMAP *)
++ ((u8 *) event + sizeof(struct MCC_CQ_ENTRY_AMAP) -
++ sizeof(struct ASYNC_EVENT_TRAILER_AMAP));
++
++ async_event_code = AMAP_GET_BITS_PTR(ASYNC_EVENT_TRAILER, event_code,
++ async_trailer);
++ BUG_ON(async_event_code != ASYNC_EVENT_CODE_LINK_STATE);
++
++ pnob = adapter->net_obj;
++ netdev = pnob->netdev;
++
++ /* Determine if this event is a switch VLD or a physical link event */
++ async_event_type = AMAP_GET_BITS_PTR(ASYNC_EVENT_TRAILER, event_type,
++ async_trailer);
++ active_port = AMAP_GET_BITS_PTR(ASYNC_EVENT_LINK_STATE,
++ active_port, link_status);
++ port0_link_status = AMAP_GET_BITS_PTR(ASYNC_EVENT_LINK_STATE,
++ port0_link_status, link_status);
++ port1_link_status = AMAP_GET_BITS_PTR(ASYNC_EVENT_LINK_STATE,
++ port1_link_status, link_status);
++ port0_duplex = AMAP_GET_BITS_PTR(ASYNC_EVENT_LINK_STATE,
++ port0_duplex, link_status);
++ port1_duplex = AMAP_GET_BITS_PTR(ASYNC_EVENT_LINK_STATE,
++ port1_duplex, link_status);
++ port0_speed = AMAP_GET_BITS_PTR(ASYNC_EVENT_LINK_STATE,
++ port0_speed, link_status);
++ port1_speed = AMAP_GET_BITS_PTR(ASYNC_EVENT_LINK_STATE,
++ port1_speed, link_status);
++ if (async_event_type == NTWK_LINK_TYPE_VIRTUAL) {
++ adapter->be_stat.bes_link_change_virtual++;
++ if (adapter->be_link_sts->active_port != active_port) {
++ dev_notice(&netdev->dev,
++ "Active port changed due to VLD on switch\n");
++ } else {
++ dev_notice(&netdev->dev, "Link status update\n");
++ }
++
++ } else {
++ adapter->be_stat.bes_link_change_physical++;
++ if (adapter->be_link_sts->active_port != active_port) {
++ dev_notice(&netdev->dev,
++ "Active port changed due to port link"
++ " status change\n");
++ } else {
++ dev_notice(&netdev->dev, "Link status update\n");
++ }
++ }
++
++ memset(adapter->be_link_sts, 0, sizeof(adapter->be_link_sts));
++
++ if ((port0_link_status == ASYNC_EVENT_LINK_UP) ||
++ (port1_link_status == ASYNC_EVENT_LINK_UP)) {
++ if ((adapter->port0_link_sts == BE_PORT_LINK_DOWN) &&
++ (adapter->port1_link_sts == BE_PORT_LINK_DOWN)) {
++ /* Earlier both the ports are down So link is up */
++ link_enable = true;
++ }
++
++ if (port0_link_status == ASYNC_EVENT_LINK_UP) {
++ adapter->port0_link_sts = BE_PORT_LINK_UP;
++ adapter->be_link_sts->mac0_duplex = port0_duplex;
++ adapter->be_link_sts->mac0_speed = port0_speed;
++ if (active_port == NTWK_PORT_A)
++ adapter->be_link_sts->active_port = 0;
++ } else
++ adapter->port0_link_sts = BE_PORT_LINK_DOWN;
++
++ if (port1_link_status == ASYNC_EVENT_LINK_UP) {
++ adapter->port1_link_sts = BE_PORT_LINK_UP;
++ adapter->be_link_sts->mac1_duplex = port1_duplex;
++ adapter->be_link_sts->mac1_speed = port1_speed;
++ if (active_port == NTWK_PORT_B)
++ adapter->be_link_sts->active_port = 1;
++ } else
++ adapter->port1_link_sts = BE_PORT_LINK_DOWN;
++
++ printk(KERN_INFO "Link Properties for %s:\n", netdev->name);
++ dev_info(&netdev->dev, "Link Properties:\n");
++ be_print_link_info(adapter->be_link_sts);
++
++ if (!link_enable)
++ return;
++ /*
++ * Both ports were down previously, but atleast one of
++ * them has come up if this netdevice's carrier is not up,
++ * then indicate to stack
++ */
++ if (!netif_carrier_ok(netdev)) {
++ netif_start_queue(netdev);
++ netif_carrier_on(netdev);
++ }
++ return;
++ }
++
++ /* Now both the ports are down. Tell the stack about it */
++ dev_info(&netdev->dev, "Both ports are down\n");
++ adapter->port0_link_sts = BE_PORT_LINK_DOWN;
++ adapter->port1_link_sts = BE_PORT_LINK_DOWN;
++ if (netif_carrier_ok(netdev)) {
++ netif_carrier_off(netdev);
++ netif_stop_queue(netdev);
++ }
++ return;
++}
++
++static int be_mcc_create(struct be_adapter *adapter)
++{
++ struct be_net_object *pnob;
++
++ pnob = adapter->net_obj;
++ /*
++ * Create the MCC ring so that all further communication with
++ * MCC can go thru the ring. we do this at the end since
++ * we do not want to be dealing with interrupts until the
++ * initialization is complete.
++ */
++ pnob->mcc_q_len = MCC_Q_LEN;
++ pnob->mcc_q_size = pnob->mcc_q_len * sizeof(struct MCC_WRB_AMAP);
++ pnob->mcc_q = pci_alloc_consistent(adapter->pdev, pnob->mcc_q_size,
++ &pnob->mcc_q_bus);
++ if (!pnob->mcc_q_bus)
++ return -1;
++ /*
++ * space for MCC WRB context
++ */
++ pnob->mcc_wrb_ctxtLen = MCC_Q_LEN;
++ pnob->mcc_wrb_ctxt_size = pnob->mcc_wrb_ctxtLen *
++ sizeof(struct be_mcc_wrb_context);
++ pnob->mcc_wrb_ctxt = (void *)__get_free_pages(GFP_KERNEL,
++ get_order(pnob->mcc_wrb_ctxt_size));
++ if (pnob->mcc_wrb_ctxt == NULL)
++ return -1;
++ /*
++ * Space for MCC compl. ring
++ */
++ pnob->mcc_cq_len = MCC_CQ_LEN;
++ pnob->mcc_cq_size = pnob->mcc_cq_len * sizeof(struct MCC_CQ_ENTRY_AMAP);
++ pnob->mcc_cq = pci_alloc_consistent(adapter->pdev, pnob->mcc_cq_size,
++ &pnob->mcc_cq_bus);
++ if (!pnob->mcc_cq_bus)
++ return -1;
++ return 0;
++}
++
++/*
++ This function creates the MCC request and completion ring required
++ for communicating with the ARM processor. The caller must have
++ allocated required amount of memory for the MCC ring and MCC
++ completion ring and posted the virtual address and number of
++ entries in the corresponding members (mcc_q and mcc_cq) in the
++ NetObject struture.
++
++ When this call is completed, all further communication with
++ ARM will switch from mailbox to this ring.
++
++ pnob - Pointer to the NetObject structure. This NetObject should
++ have been created using a previous call to be_create_netobj()
++*/
++int be_create_mcc_rings(struct be_net_object *pnob)
++{
++ int status = 0;
++ struct ring_desc rd;
++ struct be_function_object *pfob = &pnob->fn_obj;
++
++ memset(&rd, 0, sizeof(struct ring_desc));
++ if (pnob->mcc_cq_len) {
++ rd.va = pnob->mcc_cq;
++ rd.pa = pnob->mcc_cq_bus;
++ rd.length = pnob->mcc_cq_size;
++
++ status = be_cq_create(pfob, &rd,
++ pnob->mcc_cq_len * sizeof(struct MCC_CQ_ENTRY_AMAP),
++ false, /* solicted events, */
++ true, /* nodelay */
++ 0, /* 0 Watermark since Nodelay is true */
++ &pnob->event_q_obj,
++ &pnob->mcc_cq_obj);
++
++ if (status != BE_SUCCESS)
++ return status;
++
++ pnob->mcc_cq_id = pnob->mcc_cq_obj.cq_id;
++ pnob->mcc_cq_created = 1;
++ }
++ if (pnob->mcc_q_len) {
++ rd.va = pnob->mcc_q;
++ rd.pa = pnob->mcc_q_bus;
++ rd.length = pnob->mcc_q_size;
++
++ status = be_mcc_ring_create(pfob, &rd,
++ pnob->mcc_q_len * sizeof(struct MCC_WRB_AMAP),
++ pnob->mcc_wrb_ctxt, pnob->mcc_wrb_ctxtLen,
++ &pnob->mcc_cq_obj, &pnob->mcc_q_obj);
++
++ if (status != BE_SUCCESS)
++ return status;
++
++ pnob->mcc_q_created = 1;
++ }
++ return BE_SUCCESS;
++}
++
++static int be_mcc_init(struct be_adapter *adapter)
++{
++ u32 r;
++ struct be_net_object *pnob;
++
++ pnob = adapter->net_obj;
++ memset(pnob->mcc_q, 0, pnob->mcc_q_size);
++ pnob->mcc_q_hd = 0;
++
++ memset(pnob->mcc_wrb_ctxt, 0, pnob->mcc_wrb_ctxt_size);
++
++ memset(pnob->mcc_cq, 0, pnob->mcc_cq_size);
++ pnob->mcc_cq_tl = 0;
++
++ r = be_create_mcc_rings(adapter->net_obj);
++ if (r != BE_SUCCESS)
++ return -1;
++
++ return 0;
++}
++
++static void be_remove(struct pci_dev *pdev)
++{
++ struct be_net_object *pnob;
++ struct be_adapter *adapter;
++
++ adapter = pci_get_drvdata(pdev);
++ if (!adapter)
++ return;
++
++ pci_set_drvdata(pdev, NULL);
++ pnob = (struct be_net_object *)adapter->net_obj;
++
++ flush_scheduled_work();
++
++ if (pnob) {
++ /* Unregister async callback function for link status updates */
++ if (pnob->mcc_q_created)
++ be_mcc_add_async_event_callback(&pnob->mcc_q_obj,
++ NULL, NULL);
++ netobject_cleanup(adapter, pnob);
++ }
++
++ if (adapter->csr_va)
++ iounmap(adapter->csr_va);
++ if (adapter->db_va)
++ iounmap(adapter->db_va);
++ if (adapter->pci_va)
++ iounmap(adapter->pci_va);
++
++ pci_release_regions(adapter->pdev);
++ pci_disable_device(adapter->pdev);
++
++ kfree(adapter->be_link_sts);
++ kfree(adapter->eth_statsp);
++
++ if (adapter->timer_ctxt.get_stats_timer.function)
++ del_timer_sync(&adapter->timer_ctxt.get_stats_timer);
++ kfree(adapter);
++}
++
++/*
++ * This function is called by the PCI sub-system when it finds a PCI
++ * device with dev/vendor IDs that match with one of our devices.
++ * All of the driver initialization is done in this function.
++ */
++static int be_probe(struct pci_dev *pdev, const struct pci_device_id *pdev_id)
++{
++ int status = 0;
++ struct be_adapter *adapter;
++ struct FWCMD_COMMON_GET_FW_VERSION_RESPONSE_PAYLOAD get_fwv;
++ struct be_net_object *pnob;
++ struct net_device *netdev;
++
++ status = pci_enable_device(pdev);
++ if (status)
++ goto error;
++
++ status = pci_request_regions(pdev, be_driver_name);
++ if (status)
++ goto error_pci_req;
++
++ pci_set_master(pdev);
++ adapter = kzalloc(sizeof(struct be_adapter), GFP_KERNEL);
++ if (adapter == NULL) {
++ status = -ENOMEM;
++ goto error_adapter;
++ }
++ adapter->dev_state = BE_DEV_STATE_NONE;
++ adapter->pdev = pdev;
++ pci_set_drvdata(pdev, adapter);
++
++ adapter->enable_aic = 1;
++ adapter->max_eqd = MAX_EQD;
++ adapter->min_eqd = 0;
++ adapter->cur_eqd = 0;
++
++ status = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
++ if (!status) {
++ adapter->dma_64bit_cap = true;
++ } else {
++ adapter->dma_64bit_cap = false;
++ status = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
++ if (status != 0) {
++ printk(KERN_ERR "Could not set PCI DMA Mask\n");
++ goto cleanup;
++ }
++ }
++
++ status = init_pci_be_function(adapter, pdev);
++ if (status != 0) {
++ printk(KERN_ERR "Failed to map PCI BARS\n");
++ status = -ENOMEM;
++ goto cleanup;
++ }
++
++ be_trace_set_level(DL_ALWAYS | DL_ERR);
++
++ adapter->be_link_sts = kmalloc(sizeof(struct BE_LINK_STATUS),
++ GFP_KERNEL);
++ if (adapter->be_link_sts == NULL) {
++ printk(KERN_ERR "Memory allocation for link status "
++ "buffer failed\n");
++ goto cleanup;
++ }
++ spin_lock_init(&adapter->txq_lock);
++
++ netdev = alloc_etherdev(sizeof(struct be_net_object));
++ if (netdev == NULL) {
++ status = -ENOMEM;
++ goto cleanup;
++ }
++ pnob = netdev_priv(netdev);
++ adapter->net_obj = pnob;
++ adapter->netdevp = netdev;
++ pnob->adapter = adapter;
++ pnob->netdev = netdev;
++
++ status = be_nob_ring_alloc(adapter, pnob);
++ if (status != 0)
++ goto cleanup;
++
++ status = be_nob_ring_init(adapter, pnob);
++ if (status != 0)
++ goto cleanup;
++
++ be_rxf_mac_address_read_write(&pnob->fn_obj, false, false, false,
++ false, false, netdev->dev_addr, NULL, NULL);
++
++ netdev->init = &benet_init;
++ netif_carrier_off(netdev);
++ netif_stop_queue(netdev);
++
++ SET_NETDEV_DEV(netdev, &(adapter->pdev->dev));
++
++ netif_napi_add(netdev, &pnob->napi, be_poll, 64);
++
++ /* if the rx_frag size if 2K, one page is shared as two RX frags */
++ pnob->rx_pg_shared =
++ (pnob->rx_buf_size <= PAGE_SIZE / 2) ? true : false;
++ if (pnob->rx_buf_size != rxbuf_size) {
++ printk(KERN_WARNING
++ "Could not set Rx buffer size to %d. Using %d\n",
++ rxbuf_size, pnob->rx_buf_size);
++ rxbuf_size = pnob->rx_buf_size;
++ }
++
++ tasklet_init(&(adapter->sts_handler), be_process_intr,
++ (unsigned long)adapter);
++ adapter->tasklet_started = 1;
++ spin_lock_init(&(adapter->int_lock));
++
++ status = be_register_isr(adapter, pnob);
++ if (status != 0)
++ goto cleanup;
++
++ adapter->rx_csum = 1;
++ adapter->max_rx_coal = BE_LRO_MAX_PKTS;
++
++ memset(&get_fwv, 0,
++ sizeof(struct FWCMD_COMMON_GET_FW_VERSION_RESPONSE_PAYLOAD));
++ printk(KERN_INFO "BladeEngine Driver version:%s. "
++ "Copyright ServerEngines, Corporation 2005 - 2008\n",
++ be_drvr_ver);
++ status = be_function_get_fw_version(&pnob->fn_obj, &get_fwv, NULL,
++ NULL);
++ if (status == BE_SUCCESS) {
++ strncpy(be_fw_ver, get_fwv.firmware_version_string, 32);
++ printk(KERN_INFO "BladeEngine Firmware Version:%s\n",
++ get_fwv.firmware_version_string);
++ } else {
++ printk(KERN_WARNING "Unable to get BE Firmware Version\n");
++ }
++
++ sema_init(&adapter->get_eth_stat_sem, 0);
++ init_timer(&adapter->timer_ctxt.get_stats_timer);
++ atomic_set(&adapter->timer_ctxt.get_stat_flag, 0);
++ adapter->timer_ctxt.get_stats_timer.function =
++ &be_get_stats_timer_handler;
++
++ status = be_mcc_create(adapter);
++ if (status < 0)
++ goto cleanup;
++ status = be_mcc_init(adapter);
++ if (status < 0)
++ goto cleanup;
++
++
++ status = be_mcc_add_async_event_callback(&adapter->net_obj->mcc_q_obj,
++ be_link_status_async_callback, (void *)adapter);
++ if (status != BE_SUCCESS) {
++ printk(KERN_WARNING "add_async_event_callback failed");
++ printk(KERN_WARNING
++ "Link status changes may not be reflected\n");
++ }
++
++ status = register_netdev(netdev);
++ if (status != 0)
++ goto cleanup;
++ be_update_link_status(adapter);
++ adapter->dev_state = BE_DEV_STATE_INIT;
++ return 0;
++
++cleanup:
++ be_remove(pdev);
++ return status;
++error_adapter:
++ pci_release_regions(pdev);
++error_pci_req:
++ pci_disable_device(pdev);
++error:
++ printk(KERN_ERR "BladeEngine initalization failed\n");
++ return status;
++}
++
++/*
++ * Get the current link status and print the status on console
++ */
++void be_update_link_status(struct be_adapter *adapter)
++{
++ int status;
++ struct be_net_object *pnob = adapter->net_obj;
++
++ status = be_rxf_link_status(&pnob->fn_obj, adapter->be_link_sts, NULL,
++ NULL, NULL);
++ if (status == BE_SUCCESS) {
++ if (adapter->be_link_sts->mac0_speed &&
++ adapter->be_link_sts->mac0_duplex)
++ adapter->port0_link_sts = BE_PORT_LINK_UP;
++ else
++ adapter->port0_link_sts = BE_PORT_LINK_DOWN;
++
++ if (adapter->be_link_sts->mac1_speed &&
++ adapter->be_link_sts->mac1_duplex)
++ adapter->port1_link_sts = BE_PORT_LINK_UP;
++ else
++ adapter->port1_link_sts = BE_PORT_LINK_DOWN;
++
++ dev_info(&pnob->netdev->dev, "Link Properties:\n");
++ be_print_link_info(adapter->be_link_sts);
++ return;
++ }
++ dev_info(&pnob->netdev->dev, "Could not get link status\n");
++ return;
++}
++
++
++#ifdef CONFIG_PM
++static void
++be_pm_cleanup(struct be_adapter *adapter,
++ struct be_net_object *pnob, struct net_device *netdev)
++{
++ netif_carrier_off(netdev);
++ netif_stop_queue(netdev);
++
++ be_wait_nic_tx_cmplx_cmpl(pnob);
++ be_disable_eq_intr(pnob);
++
++ if (adapter->tasklet_started) {
++ tasklet_kill(&adapter->sts_handler);
++ adapter->tasklet_started = 0;
++ }
++
++ be_unregister_isr(adapter);
++ be_disable_intr(pnob);
++
++ be_tx_q_clean(pnob);
++ be_rx_q_clean(pnob);
++
++ be_destroy_netobj(pnob);
++}
++
++static int be_suspend(struct pci_dev *pdev, pm_message_t state)
++{
++ struct be_adapter *adapter = pci_get_drvdata(pdev);
++ struct net_device *netdev = adapter->netdevp;
++ struct be_net_object *pnob = netdev_priv(netdev);
++
++ adapter->dev_pm_state = adapter->dev_state;
++ adapter->dev_state = BE_DEV_STATE_SUSPEND;
++
++ netif_device_detach(netdev);
++ if (netif_running(netdev))
++ be_pm_cleanup(adapter, pnob, netdev);
++
++ pci_enable_wake(pdev, 3, 1);
++ pci_enable_wake(pdev, 4, 1); /* D3 Cold = 4 */
++ pci_save_state(pdev);
++ pci_disable_device(pdev);
++ pci_set_power_state(pdev, pci_choose_state(pdev, state));
++ return 0;
++}
++
++static void be_up(struct be_adapter *adapter)
++{
++ struct be_net_object *pnob = adapter->net_obj;
++
++ if (pnob->num_vlans != 0)
++ be_rxf_vlan_config(&pnob->fn_obj, false, pnob->num_vlans,
++ pnob->vlan_tag, NULL, NULL, NULL);
++
++}
++
++static int be_resume(struct pci_dev *pdev)
++{
++ int status = 0;
++ struct be_adapter *adapter = pci_get_drvdata(pdev);
++ struct net_device *netdev = adapter->netdevp;
++ struct be_net_object *pnob = netdev_priv(netdev);
++
++ netif_device_detach(netdev);
++
++ status = pci_enable_device(pdev);
++ if (status)
++ return status;
++
++ pci_set_power_state(pdev, 0);
++ pci_restore_state(pdev);
++ pci_enable_wake(pdev, 3, 0);
++ pci_enable_wake(pdev, 4, 0); /* 4 is D3 cold */
++
++ netif_carrier_on(netdev);
++ netif_start_queue(netdev);
++
++ if (netif_running(netdev)) {
++ be_rxf_mac_address_read_write(&pnob->fn_obj, false, false,
++ false, true, false, netdev->dev_addr, NULL, NULL);
++
++ status = be_nob_ring_init(adapter, pnob);
++ if (status < 0)
++ return status;
++
++ tasklet_init(&(adapter->sts_handler), be_process_intr,
++ (unsigned long)adapter);
++ adapter->tasklet_started = 1;
++
++ if (be_register_isr(adapter, pnob) != 0) {
++ printk(KERN_ERR "be_register_isr failed\n");
++ return status;
++ }
++
++
++ status = be_mcc_init(adapter);
++ if (status < 0) {
++ printk(KERN_ERR "be_mcc_init failed\n");
++ return status;
++ }
++ be_update_link_status(adapter);
++ /*
++ * Register async call back function to handle link
++ * status updates
++ */
++ status = be_mcc_add_async_event_callback(
++ &adapter->net_obj->mcc_q_obj,
++ be_link_status_async_callback, (void *)adapter);
++ if (status != BE_SUCCESS) {
++ printk(KERN_WARNING "add_async_event_callback failed");
++ printk(KERN_WARNING
++ "Link status changes may not be reflected\n");
++ }
++ be_enable_intr(pnob);
++ be_enable_eq_intr(pnob);
++ be_up(adapter);
++ }
++ netif_device_attach(netdev);
++ adapter->dev_state = adapter->dev_pm_state;
++ return 0;
++
++}
++
++#endif
++
++/* Wait until no more pending transmits */
++void be_wait_nic_tx_cmplx_cmpl(struct be_net_object *pnob)
++{
++ int i;
++
++ /* Wait for 20us * 50000 (= 1s) and no more */
++ i = 0;
++ while ((pnob->tx_q_tl != pnob->tx_q_hd) && (i < 50000)) {
++ ++i;
++ udelay(20);
++ }
++
++ /* Check for no more pending transmits */
++ if (i >= 50000) {
++ printk(KERN_WARNING
++ "Did not receive completions for all TX requests\n");
++ }
++}
++
++static struct pci_driver be_driver = {
++ .name = be_driver_name,
++ .id_table = be_device_id_table,
++ .probe = be_probe,
++#ifdef CONFIG_PM
++ .suspend = be_suspend,
++ .resume = be_resume,
++#endif
++ .remove = be_remove
++};
++
++/*
++ * Module init entry point. Registers our our device and return.
++ * Our probe will be called if the device is found.
++ */
++static int __init be_init_module(void)
++{
++ int ret;
++
++ if (rxbuf_size != 8192 && rxbuf_size != 4096 && rxbuf_size != 2048) {
++ printk(KERN_WARNING
++ "Unsupported receive buffer size (%d) requested\n",
++ rxbuf_size);
++ printk(KERN_WARNING
++ "Must be 2048, 4096 or 8192. Defaulting to 2048\n");
++ rxbuf_size = 2048;
++ }
++
++ ret = pci_register_driver(&be_driver);
++
++ return ret;
++}
++
++module_init(be_init_module);
++
++/*
++ * be_exit_module - Driver Exit Cleanup Routine
++ */
++static void __exit be_exit_module(void)
++{
++ pci_unregister_driver(&be_driver);
++}
++
++module_exit(be_exit_module);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/be_int.c linux-2.6.29-rc3.owrt/drivers/staging/benet/be_int.c
+--- linux-2.6.29.owrt/drivers/staging/benet/be_int.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/be_int.c 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,863 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++#include <linux/if_vlan.h>
++#include <linux/inet_lro.h>
++
++#include "benet.h"
++
++/* number of bytes of RX frame that are copied to skb->data */
++#define BE_HDR_LEN 64
++
++#define NETIF_RX(skb) netif_receive_skb(skb)
++#define VLAN_ACCEL_RX(skb, pnob, vt) \
++ vlan_hwaccel_rx(skb, pnob->vlan_grp, vt)
++
++/*
++ This function notifies BladeEngine of the number of completion
++ entries processed from the specified completion queue by writing
++ the number of popped entries to the door bell.
++
++ pnob - Pointer to the NetObject structure
++ n - Number of completion entries processed
++ cq_id - Queue ID of the completion queue for which notification
++ is being done.
++ re_arm - 1 - rearm the completion ring to generate an event.
++ - 0 - dont rearm the completion ring to generate an event
++*/
++void be_notify_cmpl(struct be_net_object *pnob, int n, int cq_id, int re_arm)
++{
++ struct CQ_DB_AMAP cqdb;
++
++ cqdb.dw[0] = 0;
++ AMAP_SET_BITS_PTR(CQ_DB, qid, &cqdb, cq_id);
++ AMAP_SET_BITS_PTR(CQ_DB, rearm, &cqdb, re_arm);
++ AMAP_SET_BITS_PTR(CQ_DB, num_popped, &cqdb, n);
++ PD_WRITE(&pnob->fn_obj, cq_db, cqdb.dw[0]);
++}
++
++/*
++ * adds additional receive frags indicated by BE starting from given
++ * frag index (fi) to specified skb's frag list
++ */
++static void
++add_skb_frags(struct be_net_object *pnob, struct sk_buff *skb,
++ u32 nresid, u32 fi)
++{
++ struct be_adapter *adapter = pnob->adapter;
++ u32 sk_frag_idx, n;
++ struct be_rx_page_info *rx_page_info;
++ u32 frag_sz = pnob->rx_buf_size;
++
++ sk_frag_idx = skb_shinfo(skb)->nr_frags;
++ while (nresid) {
++ index_inc(&fi, pnob->rx_q_len);
++
++ rx_page_info = (struct be_rx_page_info *)pnob->rx_ctxt[fi];
++ pnob->rx_ctxt[fi] = NULL;
++ if ((rx_page_info->page_offset) ||
++ (pnob->rx_pg_shared == false)) {
++ pci_unmap_page(adapter->pdev,
++ pci_unmap_addr(rx_page_info, bus),
++ frag_sz, PCI_DMA_FROMDEVICE);
++ }
++
++ n = min(nresid, frag_sz);
++ skb_shinfo(skb)->frags[sk_frag_idx].page = rx_page_info->page;
++ skb_shinfo(skb)->frags[sk_frag_idx].page_offset
++ = rx_page_info->page_offset;
++ skb_shinfo(skb)->frags[sk_frag_idx].size = n;
++
++ sk_frag_idx++;
++ skb->len += n;
++ skb->data_len += n;
++ skb_shinfo(skb)->nr_frags++;
++ nresid -= n;
++
++ memset(rx_page_info, 0, sizeof(struct be_rx_page_info));
++ atomic_dec(&pnob->rx_q_posted);
++ }
++}
++
++/*
++ * This function processes incoming nic packets over various Rx queues.
++ * This function takes the adapter, the current Rx status descriptor
++ * entry and the Rx completion queue ID as argument.
++ */
++static inline int process_nic_rx_completion(struct be_net_object *pnob,
++ struct ETH_RX_COMPL_AMAP *rxcp)
++{
++ struct be_adapter *adapter = pnob->adapter;
++ struct sk_buff *skb;
++ int udpcksm, tcpcksm;
++ int n;
++ u32 nresid, fi;
++ u32 frag_sz = pnob->rx_buf_size;
++ u8 *va;
++ struct be_rx_page_info *rx_page_info;
++ u32 numfrags, vtp, vtm, vlan_tag, pktsize;
++
++ fi = AMAP_GET_BITS_PTR(ETH_RX_COMPL, fragndx, rxcp);
++ BUG_ON(fi >= (int)pnob->rx_q_len);
++ BUG_ON(fi < 0);
++
++ rx_page_info = (struct be_rx_page_info *)pnob->rx_ctxt[fi];
++ BUG_ON(!rx_page_info->page);
++ pnob->rx_ctxt[fi] = NULL;
++
++ /*
++ * If one page is used per fragment or if this is the second half of
++ * of the page, unmap the page here
++ */
++ if ((rx_page_info->page_offset) || (pnob->rx_pg_shared == false)) {
++ pci_unmap_page(adapter->pdev,
++ pci_unmap_addr(rx_page_info, bus), frag_sz,
++ PCI_DMA_FROMDEVICE);
++ }
++
++ atomic_dec(&pnob->rx_q_posted);
++ udpcksm = AMAP_GET_BITS_PTR(ETH_RX_COMPL, udpcksm, rxcp);
++ tcpcksm = AMAP_GET_BITS_PTR(ETH_RX_COMPL, tcpcksm, rxcp);
++ pktsize = AMAP_GET_BITS_PTR(ETH_RX_COMPL, pktsize, rxcp);
++ /*
++ * get rid of RX flush completions first.
++ */
++ if ((tcpcksm) && (udpcksm) && (pktsize == 32)) {
++ put_page(rx_page_info->page);
++ memset(rx_page_info, 0, sizeof(struct be_rx_page_info));
++ return 0;
++ }
++ skb = netdev_alloc_skb(pnob->netdev, BE_HDR_LEN + NET_IP_ALIGN);
++ if (skb == NULL) {
++ dev_info(&pnob->netdev->dev, "alloc_skb() failed\n");
++ put_page(rx_page_info->page);
++ memset(rx_page_info, 0, sizeof(struct be_rx_page_info));
++ goto free_frags;
++ }
++ skb_reserve(skb, NET_IP_ALIGN);
++
++ skb->dev = pnob->netdev;
++
++ n = min(pktsize, frag_sz);
++
++ va = page_address(rx_page_info->page) + rx_page_info->page_offset;
++ prefetch(va);
++
++ skb->len = n;
++ skb->data_len = n;
++ if (n <= BE_HDR_LEN) {
++ memcpy(skb->data, va, n);
++ put_page(rx_page_info->page);
++ skb->data_len -= n;
++ skb->tail += n;
++ } else {
++
++ /* Setup the SKB with page buffer information */
++ skb_shinfo(skb)->frags[0].page = rx_page_info->page;
++ skb_shinfo(skb)->nr_frags++;
++
++ /* Copy the header into the skb_data */
++ memcpy(skb->data, va, BE_HDR_LEN);
++ skb_shinfo(skb)->frags[0].page_offset =
++ rx_page_info->page_offset + BE_HDR_LEN;
++ skb_shinfo(skb)->frags[0].size = n - BE_HDR_LEN;
++ skb->data_len -= BE_HDR_LEN;
++ skb->tail += BE_HDR_LEN;
++ }
++ memset(rx_page_info, 0, sizeof(struct be_rx_page_info));
++ nresid = pktsize - n;
++
++ skb->protocol = eth_type_trans(skb, pnob->netdev);
++
++ if ((tcpcksm || udpcksm) && adapter->rx_csum)
++ skb->ip_summed = CHECKSUM_UNNECESSARY;
++ else
++ skb->ip_summed = CHECKSUM_NONE;
++ /*
++ * if we have more bytes left, the frame has been
++ * given to us in multiple fragments. This happens
++ * with Jumbo frames. Add the remaining fragments to
++ * skb->frags[] array.
++ */
++ if (nresid)
++ add_skb_frags(pnob, skb, nresid, fi);
++
++ /* update the the true size of the skb. */
++ skb->truesize = skb->len + sizeof(struct sk_buff);
++
++ /*
++ * If a 802.3 frame or 802.2 LLC frame
++ * (i.e) contains length field in MAC Hdr
++ * and frame len is greater than 64 bytes
++ */
++ if (((skb->protocol == ntohs(ETH_P_802_2)) ||
++ (skb->protocol == ntohs(ETH_P_802_3)))
++ && (pktsize > BE_HDR_LEN)) {
++ /*
++ * If the length given in Mac Hdr is less than frame size
++ * Erraneous frame, Drop it
++ */
++ if ((ntohs(*(u16 *) (va + 12)) + ETH_HLEN) < pktsize) {
++ /* Increment Non Ether type II frames dropped */
++ adapter->be_stat.bes_802_3_dropped_frames++;
++
++ kfree_skb(skb);
++ return 0;
++ }
++ /*
++ * else if the length given in Mac Hdr is greater than
++ * frame size, should not be seeing this sort of frames
++ * dump the pkt and pass to stack
++ */
++ else if ((ntohs(*(u16 *) (va + 12)) + ETH_HLEN) > pktsize) {
++ /* Increment Non Ether type II frames malformed */
++ adapter->be_stat.bes_802_3_malformed_frames++;
++ }
++ }
++
++ vtp = AMAP_GET_BITS_PTR(ETH_RX_COMPL, vtp, rxcp);
++ vtm = AMAP_GET_BITS_PTR(ETH_RX_COMPL, vtm, rxcp);
++ if (vtp && vtm) {
++ /* Vlan tag present in pkt and BE found
++ * that the tag matched an entry in VLAN table
++ */
++ if (!pnob->vlan_grp || pnob->num_vlans == 0) {
++ /* But we have no VLANs configured.
++ * This should never happen. Drop the packet.
++ */
++ dev_info(&pnob->netdev->dev,
++ "BladeEngine: Unexpected vlan tagged packet\n");
++ kfree_skb(skb);
++ return 0;
++ }
++ /* pass the VLAN packet to stack */
++ vlan_tag = AMAP_GET_BITS_PTR(ETH_RX_COMPL, vlan_tag, rxcp);
++ VLAN_ACCEL_RX(skb, pnob, be16_to_cpu(vlan_tag));
++
++ } else {
++ NETIF_RX(skb);
++ }
++ return 0;
++
++free_frags:
++ /* free all frags associated with the current rxcp */
++ numfrags = AMAP_GET_BITS_PTR(ETH_RX_COMPL, numfrags, rxcp);
++ while (numfrags-- > 1) {
++ index_inc(&fi, pnob->rx_q_len);
++
++ rx_page_info = (struct be_rx_page_info *)
++ pnob->rx_ctxt[fi];
++ pnob->rx_ctxt[fi] = (void *)NULL;
++ if (rx_page_info->page_offset || !pnob->rx_pg_shared) {
++ pci_unmap_page(adapter->pdev,
++ pci_unmap_addr(rx_page_info, bus),
++ frag_sz, PCI_DMA_FROMDEVICE);
++ }
++
++ put_page(rx_page_info->page);
++ memset(rx_page_info, 0, sizeof(struct be_rx_page_info));
++ atomic_dec(&pnob->rx_q_posted);
++ }
++ return -ENOMEM;
++}
++
++static void process_nic_rx_completion_lro(struct be_net_object *pnob,
++ struct ETH_RX_COMPL_AMAP *rxcp)
++{
++ struct be_adapter *adapter = pnob->adapter;
++ struct skb_frag_struct rx_frags[BE_MAX_FRAGS_PER_FRAME];
++ unsigned int udpcksm, tcpcksm;
++ u32 numfrags, vlanf, vtm, vlan_tag, nresid;
++ u16 vlant;
++ unsigned int fi, idx, n;
++ struct be_rx_page_info *rx_page_info;
++ u32 frag_sz = pnob->rx_buf_size, pktsize;
++ bool rx_coal = (adapter->max_rx_coal <= 1) ? 0 : 1;
++ u8 err, *va;
++ __wsum csum = 0;
++
++ if (AMAP_GET_BITS_PTR(ETH_RX_COMPL, ipsec, rxcp)) {
++ /* Drop the pkt and move to the next completion. */
++ adapter->be_stat.bes_rx_misc_pkts++;
++ return;
++ }
++ err = AMAP_GET_BITS_PTR(ETH_RX_COMPL, err, rxcp);
++ if (err || !rx_coal) {
++ /* We won't coalesce Rx pkts if the err bit set.
++ * take the path of normal completion processing */
++ process_nic_rx_completion(pnob, rxcp);
++ return;
++ }
++
++ fi = AMAP_GET_BITS_PTR(ETH_RX_COMPL, fragndx, rxcp);
++ BUG_ON(fi >= (int)pnob->rx_q_len);
++ BUG_ON(fi < 0);
++ rx_page_info = (struct be_rx_page_info *)pnob->rx_ctxt[fi];
++ BUG_ON(!rx_page_info->page);
++ pnob->rx_ctxt[fi] = (void *)NULL;
++ /* If one page is used per fragment or if this is the
++ * second half of the page, unmap the page here
++ */
++ if (rx_page_info->page_offset || !pnob->rx_pg_shared) {
++ pci_unmap_page(adapter->pdev,
++ pci_unmap_addr(rx_page_info, bus),
++ frag_sz, PCI_DMA_FROMDEVICE);
++ }
++
++ numfrags = AMAP_GET_BITS_PTR(ETH_RX_COMPL, numfrags, rxcp);
++ udpcksm = AMAP_GET_BITS_PTR(ETH_RX_COMPL, udpcksm, rxcp);
++ tcpcksm = AMAP_GET_BITS_PTR(ETH_RX_COMPL, tcpcksm, rxcp);
++ vlan_tag = AMAP_GET_BITS_PTR(ETH_RX_COMPL, vlan_tag, rxcp);
++ vlant = be16_to_cpu(vlan_tag);
++ vlanf = AMAP_GET_BITS_PTR(ETH_RX_COMPL, vtp, rxcp);
++ vtm = AMAP_GET_BITS_PTR(ETH_RX_COMPL, vtm, rxcp);
++ pktsize = AMAP_GET_BITS_PTR(ETH_RX_COMPL, pktsize, rxcp);
++
++ atomic_dec(&pnob->rx_q_posted);
++
++ if (tcpcksm && udpcksm && pktsize == 32) {
++ /* flush completion entries */
++ put_page(rx_page_info->page);
++ memset(rx_page_info, 0, sizeof(struct be_rx_page_info));
++ return;
++ }
++ /* Only one of udpcksum and tcpcksum can be set */
++ BUG_ON(udpcksm && tcpcksm);
++
++ /* jumbo frames could come in multiple fragments */
++ BUG_ON(numfrags != ((pktsize + (frag_sz - 1)) / frag_sz));
++ n = min(pktsize, frag_sz);
++ nresid = pktsize - n; /* will be useful for jumbo pkts */
++ idx = 0;
++
++ va = page_address(rx_page_info->page) + rx_page_info->page_offset;
++ prefetch(va);
++ rx_frags[idx].page = rx_page_info->page;
++ rx_frags[idx].page_offset = (rx_page_info->page_offset);
++ rx_frags[idx].size = n;
++ memset(rx_page_info, 0, sizeof(struct be_rx_page_info));
++
++ /* If we got multiple fragments, we have more data. */
++ while (nresid) {
++ idx++;
++ index_inc(&fi, pnob->rx_q_len);
++
++ rx_page_info = (struct be_rx_page_info *)pnob->rx_ctxt[fi];
++ pnob->rx_ctxt[fi] = (void *)NULL;
++ if (rx_page_info->page_offset || !pnob->rx_pg_shared) {
++ pci_unmap_page(adapter->pdev,
++ pci_unmap_addr(rx_page_info, bus),
++ frag_sz, PCI_DMA_FROMDEVICE);
++ }
++
++ n = min(nresid, frag_sz);
++ rx_frags[idx].page = rx_page_info->page;
++ rx_frags[idx].page_offset = (rx_page_info->page_offset);
++ rx_frags[idx].size = n;
++
++ nresid -= n;
++ memset(rx_page_info, 0, sizeof(struct be_rx_page_info));
++ atomic_dec(&pnob->rx_q_posted);
++ }
++
++ if (likely(!(vlanf && vtm))) {
++ lro_receive_frags(&pnob->lro_mgr, rx_frags,
++ pktsize, pktsize,
++ (void *)(unsigned long)csum, csum);
++ } else {
++ /* Vlan tag present in pkt and BE found
++ * that the tag matched an entry in VLAN table
++ */
++ if (unlikely(!pnob->vlan_grp || pnob->num_vlans == 0)) {
++ /* But we have no VLANs configured.
++ * This should never happen. Drop the packet.
++ */
++ dev_info(&pnob->netdev->dev,
++ "BladeEngine: Unexpected vlan tagged packet\n");
++ return;
++ }
++ /* pass the VLAN packet to stack */
++ lro_vlan_hwaccel_receive_frags(&pnob->lro_mgr,
++ rx_frags, pktsize, pktsize,
++ pnob->vlan_grp, vlant,
++ (void *)(unsigned long)csum,
++ csum);
++ }
++
++ adapter->be_stat.bes_rx_coal++;
++}
++
++struct ETH_RX_COMPL_AMAP *be_get_rx_cmpl(struct be_net_object *pnob)
++{
++ struct ETH_RX_COMPL_AMAP *rxcp = &pnob->rx_cq[pnob->rx_cq_tl];
++ u32 valid, ct;
++
++ valid = AMAP_GET_BITS_PTR(ETH_RX_COMPL, valid, rxcp);
++ if (valid == 0)
++ return NULL;
++
++ ct = AMAP_GET_BITS_PTR(ETH_RX_COMPL, ct, rxcp);
++ if (ct != 0) {
++ /* Invalid chute #. treat as error */
++ AMAP_SET_BITS_PTR(ETH_RX_COMPL, err, rxcp, 1);
++ }
++
++ be_adv_rxcq_tl(pnob);
++ AMAP_SET_BITS_PTR(ETH_RX_COMPL, valid, rxcp, 0);
++ return rxcp;
++}
++
++static void update_rx_rate(struct be_adapter *adapter)
++{
++ /* update the rate once in two seconds */
++ if ((jiffies - adapter->eth_rx_jiffies) > 2 * (HZ)) {
++ u32 r;
++ r = adapter->eth_rx_bytes /
++ ((jiffies - adapter->eth_rx_jiffies) / (HZ));
++ r = (r / 1000000); /* MB/Sec */
++
++ /* Mega Bits/Sec */
++ adapter->be_stat.bes_eth_rx_rate = (r * 8);
++ adapter->eth_rx_jiffies = jiffies;
++ adapter->eth_rx_bytes = 0;
++ }
++}
++
++static int process_rx_completions(struct be_net_object *pnob, int max_work)
++{
++ struct be_adapter *adapter = pnob->adapter;
++ struct ETH_RX_COMPL_AMAP *rxcp;
++ u32 nc = 0;
++ unsigned int pktsize;
++
++ while (max_work && (rxcp = be_get_rx_cmpl(pnob))) {
++ prefetch(rxcp);
++ pktsize = AMAP_GET_BITS_PTR(ETH_RX_COMPL, pktsize, rxcp);
++ process_nic_rx_completion_lro(pnob, rxcp);
++ adapter->eth_rx_bytes += pktsize;
++ update_rx_rate(adapter);
++ nc++;
++ max_work--;
++ adapter->be_stat.bes_rx_compl++;
++ }
++ if (likely(adapter->max_rx_coal > 1)) {
++ adapter->be_stat.bes_rx_flush++;
++ lro_flush_all(&pnob->lro_mgr);
++ }
++
++ /* Refill the queue */
++ if (atomic_read(&pnob->rx_q_posted) < 900)
++ be_post_eth_rx_buffs(pnob);
++
++ return nc;
++}
++
++static struct ETH_TX_COMPL_AMAP *be_get_tx_cmpl(struct be_net_object *pnob)
++{
++ struct ETH_TX_COMPL_AMAP *txcp = &pnob->tx_cq[pnob->tx_cq_tl];
++ u32 valid;
++
++ valid = AMAP_GET_BITS_PTR(ETH_TX_COMPL, valid, txcp);
++ if (valid == 0)
++ return NULL;
++
++ AMAP_SET_BITS_PTR(ETH_TX_COMPL, valid, txcp, 0);
++ be_adv_txcq_tl(pnob);
++ return txcp;
++
++}
++
++void process_one_tx_compl(struct be_net_object *pnob, u32 end_idx)
++{
++ struct be_adapter *adapter = pnob->adapter;
++ int cur_index, tx_wrbs_completed = 0;
++ struct sk_buff *skb;
++ u64 busaddr, pa, pa_lo, pa_hi;
++ struct ETH_WRB_AMAP *wrb;
++ u32 frag_len, last_index, j;
++
++ last_index = tx_compl_lastwrb_idx_get(pnob);
++ BUG_ON(last_index != end_idx);
++ pnob->tx_ctxt[pnob->tx_q_tl] = NULL;
++ do {
++ cur_index = pnob->tx_q_tl;
++ wrb = &pnob->tx_q[cur_index];
++ pa_hi = AMAP_GET_BITS_PTR(ETH_WRB, frag_pa_hi, wrb);
++ pa_lo = AMAP_GET_BITS_PTR(ETH_WRB, frag_pa_lo, wrb);
++ frag_len = AMAP_GET_BITS_PTR(ETH_WRB, frag_len, wrb);
++ busaddr = (pa_hi << 32) | pa_lo;
++ if (busaddr != 0) {
++ pa = le64_to_cpu(busaddr);
++ pci_unmap_single(adapter->pdev, pa,
++ frag_len, PCI_DMA_TODEVICE);
++ }
++ if (cur_index == last_index) {
++ skb = (struct sk_buff *)pnob->tx_ctxt[cur_index];
++ BUG_ON(!skb);
++ for (j = 0; j < skb_shinfo(skb)->nr_frags; j++) {
++ struct skb_frag_struct *frag;
++ frag = &skb_shinfo(skb)->frags[j];
++ pci_unmap_page(adapter->pdev,
++ (ulong) frag->page, frag->size,
++ PCI_DMA_TODEVICE);
++ }
++ kfree_skb(skb);
++ pnob->tx_ctxt[cur_index] = NULL;
++ } else {
++ BUG_ON(pnob->tx_ctxt[cur_index]);
++ }
++ tx_wrbs_completed++;
++ be_adv_txq_tl(pnob);
++ } while (cur_index != last_index);
++ atomic_sub(tx_wrbs_completed, &pnob->tx_q_used);
++}
++
++/* there is no need to take an SMP lock here since currently
++ * we have only one instance of the tasklet that does completion
++ * processing.
++ */
++static void process_nic_tx_completions(struct be_net_object *pnob)
++{
++ struct be_adapter *adapter = pnob->adapter;
++ struct ETH_TX_COMPL_AMAP *txcp;
++ struct net_device *netdev = pnob->netdev;
++ u32 end_idx, num_processed = 0;
++
++ adapter->be_stat.bes_tx_events++;
++
++ while ((txcp = be_get_tx_cmpl(pnob))) {
++ end_idx = AMAP_GET_BITS_PTR(ETH_TX_COMPL, wrb_index, txcp);
++ process_one_tx_compl(pnob, end_idx);
++ num_processed++;
++ adapter->be_stat.bes_tx_compl++;
++ }
++ be_notify_cmpl(pnob, num_processed, pnob->tx_cq_id, 1);
++ /*
++ * We got Tx completions and have usable WRBs.
++ * If the netdev's queue has been stopped
++ * because we had run out of WRBs, wake it now.
++ */
++ spin_lock(&adapter->txq_lock);
++ if (netif_queue_stopped(netdev)
++ && atomic_read(&pnob->tx_q_used) < pnob->tx_q_len / 2) {
++ netif_wake_queue(netdev);
++ }
++ spin_unlock(&adapter->txq_lock);
++}
++
++static u32 post_rx_buffs(struct be_net_object *pnob, struct list_head *rxbl)
++{
++ u32 nposted = 0;
++ struct ETH_RX_D_AMAP *rxd = NULL;
++ struct be_recv_buffer *rxbp;
++ void **rx_ctxp;
++ struct RQ_DB_AMAP rqdb;
++
++ rx_ctxp = pnob->rx_ctxt;
++
++ while (!list_empty(rxbl) &&
++ (rx_ctxp[pnob->rx_q_hd] == NULL) && nposted < 255) {
++
++ rxbp = list_first_entry(rxbl, struct be_recv_buffer, rxb_list);
++ list_del(&rxbp->rxb_list);
++ rxd = pnob->rx_q + pnob->rx_q_hd;
++ AMAP_SET_BITS_PTR(ETH_RX_D, fragpa_lo, rxd, rxbp->rxb_pa_lo);
++ AMAP_SET_BITS_PTR(ETH_RX_D, fragpa_hi, rxd, rxbp->rxb_pa_hi);
++
++ rx_ctxp[pnob->rx_q_hd] = rxbp->rxb_ctxt;
++ be_adv_rxq_hd(pnob);
++ nposted++;
++ }
++
++ if (nposted) {
++ /* Now press the door bell to notify BladeEngine. */
++ rqdb.dw[0] = 0;
++ AMAP_SET_BITS_PTR(RQ_DB, numPosted, &rqdb, nposted);
++ AMAP_SET_BITS_PTR(RQ_DB, rq, &rqdb, pnob->rx_q_id);
++ PD_WRITE(&pnob->fn_obj, erx_rq_db, rqdb.dw[0]);
++ }
++ atomic_add(nposted, &pnob->rx_q_posted);
++ return nposted;
++}
++
++void be_post_eth_rx_buffs(struct be_net_object *pnob)
++{
++ struct be_adapter *adapter = pnob->adapter;
++ u32 num_bufs, r;
++ u64 busaddr = 0, tmp_pa;
++ u32 max_bufs, pg_hd;
++ u32 frag_size;
++ struct be_recv_buffer *rxbp;
++ struct list_head rxbl;
++ struct be_rx_page_info *rx_page_info;
++ struct page *page = NULL;
++ u32 page_order = 0;
++ gfp_t alloc_flags = GFP_ATOMIC;
++
++ BUG_ON(!adapter);
++
++ max_bufs = 64; /* should be even # <= 255. */
++
++ frag_size = pnob->rx_buf_size;
++ page_order = get_order(frag_size);
++
++ if (frag_size == 8192)
++ alloc_flags |= (gfp_t) __GFP_COMP;
++ /*
++ * Form a linked list of RECV_BUFFFER structure to be be posted.
++ * We will post even number of buffer so that pages can be
++ * shared.
++ */
++ INIT_LIST_HEAD(&rxbl);
++
++ for (num_bufs = 0; num_bufs < max_bufs &&
++ !pnob->rx_page_info[pnob->rx_pg_info_hd].page; ++num_bufs) {
++
++ rxbp = &pnob->eth_rx_bufs[num_bufs];
++ pg_hd = pnob->rx_pg_info_hd;
++ rx_page_info = &pnob->rx_page_info[pg_hd];
++
++ if (!page) {
++ page = alloc_pages(alloc_flags, page_order);
++ if (unlikely(page == NULL)) {
++ adapter->be_stat.bes_ethrx_post_fail++;
++ pnob->rxbuf_post_fail++;
++ break;
++ }
++ pnob->rxbuf_post_fail = 0;
++ busaddr = pci_map_page(adapter->pdev, page, 0,
++ frag_size, PCI_DMA_FROMDEVICE);
++ rx_page_info->page_offset = 0;
++ rx_page_info->page = page;
++ /*
++ * If we are sharing a page among two skbs,
++ * alloc a new one on the next iteration
++ */
++ if (pnob->rx_pg_shared == false)
++ page = NULL;
++ } else {
++ get_page(page);
++ rx_page_info->page_offset += frag_size;
++ rx_page_info->page = page;
++ /*
++ * We are finished with the alloced page,
++ * Alloc a new one on the next iteration
++ */
++ page = NULL;
++ }
++ rxbp->rxb_ctxt = (void *)rx_page_info;
++ index_inc(&pnob->rx_pg_info_hd, pnob->rx_q_len);
++
++ pci_unmap_addr_set(rx_page_info, bus, busaddr);
++ tmp_pa = busaddr + rx_page_info->page_offset;
++ rxbp->rxb_pa_lo = (tmp_pa & 0xFFFFFFFF);
++ rxbp->rxb_pa_hi = (tmp_pa >> 32);
++ rxbp->rxb_len = frag_size;
++ list_add_tail(&rxbp->rxb_list, &rxbl);
++ } /* End of for */
++
++ r = post_rx_buffs(pnob, &rxbl);
++ BUG_ON(r != num_bufs);
++ return;
++}
++
++/*
++ * Interrupt service for network function. We just schedule the
++ * tasklet which does all completion processing.
++ */
++irqreturn_t be_int(int irq, void *dev)
++{
++ struct net_device *netdev = dev;
++ struct be_net_object *pnob = netdev_priv(netdev);
++ struct be_adapter *adapter = pnob->adapter;
++ u32 isr;
++
++ isr = CSR_READ(&pnob->fn_obj, cev.isr1);
++ if (unlikely(!isr))
++ return IRQ_NONE;
++
++ spin_lock(&adapter->int_lock);
++ adapter->isr |= isr;
++ spin_unlock(&adapter->int_lock);
++
++ adapter->be_stat.bes_ints++;
++
++ tasklet_schedule(&adapter->sts_handler);
++ return IRQ_HANDLED;
++}
++
++/*
++ * Poll function called by NAPI with a work budget.
++ * We process as many UC. BC and MC receive completions
++ * as the budget allows and return the actual number of
++ * RX ststutses processed.
++ */
++int be_poll(struct napi_struct *napi, int budget)
++{
++ struct be_net_object *pnob =
++ container_of(napi, struct be_net_object, napi);
++ u32 work_done;
++
++ pnob->adapter->be_stat.bes_polls++;
++ work_done = process_rx_completions(pnob, budget);
++ BUG_ON(work_done > budget);
++
++ /* All consumed */
++ if (work_done < budget) {
++ netif_rx_complete(napi);
++ /* enable intr */
++ be_notify_cmpl(pnob, work_done, pnob->rx_cq_id, 1);
++ } else {
++ /* More to be consumed; continue with interrupts disabled */
++ be_notify_cmpl(pnob, work_done, pnob->rx_cq_id, 0);
++ }
++ return work_done;
++}
++
++static struct EQ_ENTRY_AMAP *get_event(struct be_net_object *pnob)
++{
++ struct EQ_ENTRY_AMAP *eqp = &(pnob->event_q[pnob->event_q_tl]);
++ if (!AMAP_GET_BITS_PTR(EQ_ENTRY, Valid, eqp))
++ return NULL;
++ be_adv_eq_tl(pnob);
++ return eqp;
++}
++
++/*
++ * Processes all valid events in the event ring associated with given
++ * NetObject. Also, notifies BE the number of events processed.
++ */
++static inline u32 process_events(struct be_net_object *pnob)
++{
++ struct be_adapter *adapter = pnob->adapter;
++ struct EQ_ENTRY_AMAP *eqp;
++ u32 rid, num_events = 0;
++ struct net_device *netdev = pnob->netdev;
++
++ while ((eqp = get_event(pnob)) != NULL) {
++ adapter->be_stat.bes_events++;
++ rid = AMAP_GET_BITS_PTR(EQ_ENTRY, ResourceID, eqp);
++ if (rid == pnob->rx_cq_id) {
++ adapter->be_stat.bes_rx_events++;
++ netif_rx_schedule(&pnob->napi);
++ } else if (rid == pnob->tx_cq_id) {
++ process_nic_tx_completions(pnob);
++ } else if (rid == pnob->mcc_cq_id) {
++ be_mcc_process_cq(&pnob->mcc_q_obj, 1);
++ } else {
++ dev_info(&netdev->dev,
++ "Invalid EQ ResourceID %d\n", rid);
++ }
++ AMAP_SET_BITS_PTR(EQ_ENTRY, Valid, eqp, 0);
++ AMAP_SET_BITS_PTR(EQ_ENTRY, ResourceID, eqp, 0);
++ num_events++;
++ }
++ return num_events;
++}
++
++static void update_eqd(struct be_adapter *adapter, struct be_net_object *pnob)
++{
++ int status;
++ struct be_eq_object *eq_objectp;
++
++ /* update once a second */
++ if ((jiffies - adapter->ips_jiffies) > 1 * (HZ)) {
++ /* One second elapsed since last update */
++ u32 r, new_eqd = -1;
++ r = adapter->be_stat.bes_ints - adapter->be_stat.bes_prev_ints;
++ r = r / ((jiffies - adapter->ips_jiffies) / (HZ));
++ adapter->be_stat.bes_ips = r;
++ adapter->ips_jiffies = jiffies;
++ adapter->be_stat.bes_prev_ints = adapter->be_stat.bes_ints;
++ if (r > IPS_HI_WM && adapter->cur_eqd < adapter->max_eqd)
++ new_eqd = (adapter->cur_eqd + 8);
++ if (r < IPS_LO_WM && adapter->cur_eqd > adapter->min_eqd)
++ new_eqd = (adapter->cur_eqd - 8);
++ if (adapter->enable_aic && new_eqd != -1) {
++ eq_objectp = &pnob->event_q_obj;
++ status = be_eq_modify_delay(&pnob->fn_obj, 1,
++ &eq_objectp, &new_eqd, NULL,
++ NULL, NULL);
++ if (status == BE_SUCCESS)
++ adapter->cur_eqd = new_eqd;
++ }
++ }
++}
++
++/*
++ This function notifies BladeEngine of how many events were processed
++ from the event queue by ringing the corresponding door bell and
++ optionally re-arms the event queue.
++ n - number of events processed
++ re_arm - 1 - re-arm the EQ, 0 - do not re-arm the EQ
++
++*/
++static void be_notify_event(struct be_net_object *pnob, int n, int re_arm)
++{
++ struct CQ_DB_AMAP eqdb;
++ eqdb.dw[0] = 0;
++
++ AMAP_SET_BITS_PTR(CQ_DB, qid, &eqdb, pnob->event_q_id);
++ AMAP_SET_BITS_PTR(CQ_DB, rearm, &eqdb, re_arm);
++ AMAP_SET_BITS_PTR(CQ_DB, event, &eqdb, 1);
++ AMAP_SET_BITS_PTR(CQ_DB, num_popped, &eqdb, n);
++ /*
++ * Under some situations we see an interrupt and no valid
++ * EQ entry. To keep going, we need to ring the DB even if
++ * numPOsted is 0.
++ */
++ PD_WRITE(&pnob->fn_obj, cq_db, eqdb.dw[0]);
++ return;
++}
++
++/*
++ * Called from the tasklet scheduled by ISR. All real interrupt processing
++ * is done here.
++ */
++void be_process_intr(unsigned long context)
++{
++ struct be_adapter *adapter = (struct be_adapter *)context;
++ struct be_net_object *pnob = adapter->net_obj;
++ u32 isr, n;
++ ulong flags = 0;
++
++ isr = adapter->isr;
++
++ /*
++ * we create only one NIC event queue in Linux. Event is
++ * expected only in the first event queue
++ */
++ BUG_ON(isr & 0xfffffffe);
++ if ((isr & 1) == 0)
++ return; /* not our interrupt */
++ n = process_events(pnob);
++ /*
++ * Clear the event bit. adapter->isr is set by
++ * hard interrupt. Prevent race with lock.
++ */
++ spin_lock_irqsave(&adapter->int_lock, flags);
++ adapter->isr &= ~1;
++ spin_unlock_irqrestore(&adapter->int_lock, flags);
++ be_notify_event(pnob, n, 1);
++ /*
++ * If previous allocation attempts had failed and
++ * BE has used up all posted buffers, post RX buffers here
++ */
++ if (pnob->rxbuf_post_fail && atomic_read(&pnob->rx_q_posted) == 0)
++ be_post_eth_rx_buffs(pnob);
++ update_eqd(adapter, pnob);
++ return;
++}
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/benet.h linux-2.6.29-rc3.owrt/drivers/staging/benet/benet.h
+--- linux-2.6.29.owrt/drivers/staging/benet/benet.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/benet.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,429 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++#ifndef _BENET_H_
++#define _BENET_H_
++
++#include <linux/pci.h>
++#include <linux/netdevice.h>
++#include <linux/inet_lro.h>
++#include "hwlib.h"
++
++#define _SA_MODULE_NAME "net-driver"
++
++#define VLAN_VALID_BIT 0x8000
++#define BE_NUM_VLAN_SUPPORTED 32
++#define BE_PORT_LINK_DOWN 0000
++#define BE_PORT_LINK_UP 0001
++#define BE_MAX_TX_FRAG_COUNT (30)
++
++/* Flag bits for send operation */
++#define IPCS (1 << 0) /* Enable IP checksum offload */
++#define UDPCS (1 << 1) /* Enable UDP checksum offload */
++#define TCPCS (1 << 2) /* Enable TCP checksum offload */
++#define LSO (1 << 3) /* Enable Large Segment offload */
++#define ETHVLAN (1 << 4) /* Enable VLAN insert */
++#define ETHEVENT (1 << 5) /* Generate event on completion */
++#define ETHCOMPLETE (1 << 6) /* Generate completion when done */
++#define IPSEC (1 << 7) /* Enable IPSEC */
++#define FORWARD (1 << 8) /* Send the packet in forwarding path */
++#define FIN (1 << 9) /* Issue FIN segment */
++
++#define BE_MAX_MTU 8974
++
++#define BE_MAX_LRO_DESCRIPTORS 8
++#define BE_LRO_MAX_PKTS 64
++#define BE_MAX_FRAGS_PER_FRAME 6
++
++extern const char be_drvr_ver[];
++extern char be_fw_ver[];
++extern char be_driver_name[];
++
++extern struct ethtool_ops be_ethtool_ops;
++
++#define BE_DEV_STATE_NONE 0
++#define BE_DEV_STATE_INIT 1
++#define BE_DEV_STATE_OPEN 2
++#define BE_DEV_STATE_SUSPEND 3
++
++/* This structure is used to describe physical fragments to use
++ * for DMAing data from NIC.
++ */
++struct be_recv_buffer {
++ struct list_head rxb_list; /* for maintaining a linked list */
++ void *rxb_va; /* buffer virtual address */
++ u32 rxb_pa_lo; /* low part of physical address */
++ u32 rxb_pa_hi; /* high part of physical address */
++ u32 rxb_len; /* length of recv buffer */
++ void *rxb_ctxt; /* context for OSM driver to use */
++};
++
++/*
++ * fragment list to describe scattered data.
++ */
++struct be_tx_frag_list {
++ u32 txb_len; /* Size of this fragment */
++ u32 txb_pa_lo; /* Lower 32 bits of 64 bit physical addr */
++ u32 txb_pa_hi; /* Higher 32 bits of 64 bit physical addr */
++};
++
++struct be_rx_page_info {
++ struct page *page;
++ dma_addr_t bus;
++ u16 page_offset;
++};
++
++/*
++ * This structure is the main tracking structure for a NIC interface.
++ */
++struct be_net_object {
++ /* MCC Ring - used to send fwcmds to embedded ARM processor */
++ struct MCC_WRB_AMAP *mcc_q; /* VA of the start of the ring */
++ u32 mcc_q_len; /* # of WRB entries in this ring */
++ u32 mcc_q_size;
++ u32 mcc_q_hd; /* MCC ring head */
++ u8 mcc_q_created; /* flag to help cleanup */
++ struct be_mcc_object mcc_q_obj; /* BECLIB's MCC ring Object */
++ dma_addr_t mcc_q_bus; /* DMA'ble bus address */
++
++ /* MCC Completion Ring - FW responses to fwcmds sent from MCC ring */
++ struct MCC_CQ_ENTRY_AMAP *mcc_cq; /* VA of the start of the ring */
++ u32 mcc_cq_len; /* # of compl. entries in this ring */
++ u32 mcc_cq_size;
++ u32 mcc_cq_tl; /* compl. ring tail */
++ u8 mcc_cq_created; /* flag to help cleanup */
++ struct be_cq_object mcc_cq_obj; /* BECLIB's MCC compl. ring object */
++ u32 mcc_cq_id; /* MCC ring ID */
++ dma_addr_t mcc_cq_bus; /* DMA'ble bus address */
++
++ struct ring_desc mb_rd; /* RD for MCC_MAIL_BOX */
++ void *mb_ptr; /* mailbox ptr to be freed */
++ dma_addr_t mb_bus; /* DMA'ble bus address */
++ u32 mb_size;
++
++ /* BEClib uses an array of context objects to track outstanding
++ * requests to the MCC. We need allocate the same number of
++ * conext entries as the number of entries in the MCC WRB ring
++ */
++ u32 mcc_wrb_ctxt_size;
++ void *mcc_wrb_ctxt; /* pointer to the context area */
++ u32 mcc_wrb_ctxtLen; /* Number of entries in the context */
++ /*
++ * NIC send request ring - used for xmitting raw ether frames.
++ */
++ struct ETH_WRB_AMAP *tx_q; /* VA of the start of the ring */
++ u32 tx_q_len; /* # if entries in the send ring */
++ u32 tx_q_size;
++ u32 tx_q_hd; /* Head index. Next req. goes here */
++ u32 tx_q_tl; /* Tail indx. oldest outstanding req. */
++ u8 tx_q_created; /* flag to help cleanup */
++ struct be_ethsq_object tx_q_obj;/* BECLIB's send Q handle */
++ dma_addr_t tx_q_bus; /* DMA'ble bus address */
++ u32 tx_q_id; /* send queue ring ID */
++ u32 tx_q_port; /* 0 no binding, 1 port A, 2 port B */
++ atomic_t tx_q_used; /* # of WRBs used */
++ /* ptr to an array in which we store context info for each send req. */
++ void **tx_ctxt;
++ /*
++ * NIC Send compl. ring - completion status for all NIC frames xmitted.
++ */
++ struct ETH_TX_COMPL_AMAP *tx_cq;/* VA of start of the ring */
++ u32 txcq_len; /* # of entries in the ring */
++ u32 tx_cq_size;
++ /*
++ * index into compl ring where the host expects next completion entry
++ */
++ u32 tx_cq_tl;
++ u32 tx_cq_id; /* completion queue id */
++ u8 tx_cq_created; /* flag to help cleanup */
++ struct be_cq_object tx_cq_obj;
++ dma_addr_t tx_cq_bus; /* DMA'ble bus address */
++ /*
++ * Event Queue - all completion entries post events here.
++ */
++ struct EQ_ENTRY_AMAP *event_q; /* VA of start of event queue */
++ u32 event_q_len; /* # of entries */
++ u32 event_q_size;
++ u32 event_q_tl; /* Tail of the event queue */
++ u32 event_q_id; /* Event queue ID */
++ u8 event_q_created; /* flag to help cleanup */
++ struct be_eq_object event_q_obj; /* Queue handle */
++ dma_addr_t event_q_bus; /* DMA'ble bus address */
++ /*
++ * NIC receive queue - Data buffers to be used for receiving unicast,
++ * broadcast and multi-cast frames are posted here.
++ */
++ struct ETH_RX_D_AMAP *rx_q; /* VA of start of the queue */
++ u32 rx_q_len; /* # of entries */
++ u32 rx_q_size;
++ u32 rx_q_hd; /* Head of the queue */
++ atomic_t rx_q_posted; /* number of posted buffers */
++ u32 rx_q_id; /* queue ID */
++ u8 rx_q_created; /* flag to help cleanup */
++ struct be_ethrq_object rx_q_obj; /* NIC RX queue handle */
++ dma_addr_t rx_q_bus; /* DMA'ble bus address */
++ /*
++ * Pointer to an array of opaque context object for use by OSM driver
++ */
++ void **rx_ctxt;
++ /*
++ * NIC unicast RX completion queue - all unicast ether frame completion
++ * statuses from BE come here.
++ */
++ struct ETH_RX_COMPL_AMAP *rx_cq; /* VA of start of the queue */
++ u32 rx_cq_len; /* # of entries */
++ u32 rx_cq_size;
++ u32 rx_cq_tl; /* Tail of the queue */
++ u32 rx_cq_id; /* queue ID */
++ u8 rx_cq_created; /* flag to help cleanup */
++ struct be_cq_object rx_cq_obj; /* queue handle */
++ dma_addr_t rx_cq_bus; /* DMA'ble bus address */
++ struct be_function_object fn_obj; /* function object */
++ bool fn_obj_created;
++ u32 rx_buf_size; /* Size of the RX buffers */
++
++ struct net_device *netdev;
++ struct be_recv_buffer eth_rx_bufs[256]; /* to pass Rx buffer
++ addresses */
++ struct be_adapter *adapter; /* Pointer to OSM adapter */
++ u32 devno; /* OSM, network dev no. */
++ u32 use_port; /* Current active port */
++ struct be_rx_page_info *rx_page_info; /* Array of Rx buf pages */
++ u32 rx_pg_info_hd; /* Head of queue */
++ int rxbuf_post_fail; /* RxBuff posting fail count */
++ bool rx_pg_shared; /* Is an allocsted page shared as two frags ? */
++ struct vlan_group *vlan_grp;
++ u32 num_vlans; /* Number of vlans in BE's filter */
++ u16 vlan_tag[BE_NUM_VLAN_SUPPORTED]; /* vlans currently configured */
++ struct napi_struct napi;
++ struct net_lro_mgr lro_mgr;
++ struct net_lro_desc lro_desc[BE_MAX_LRO_DESCRIPTORS];
++};
++
++#define NET_FH(np) (&(np)->fn_obj)
++
++/*
++ * BE driver statistics.
++ */
++struct be_drvr_stat {
++ u32 bes_tx_reqs; /* number of TX requests initiated */
++ u32 bes_tx_fails; /* number of TX requests that failed */
++ u32 bes_fwd_reqs; /* number of send reqs through forwarding i/f */
++ u32 bes_tx_wrbs; /* number of tx WRBs used */
++
++ u32 bes_ints; /* number of interrupts */
++ u32 bes_polls; /* number of times NAPI called poll function */
++ u32 bes_events; /* total evet entries processed */
++ u32 bes_tx_events; /* number of tx completion events */
++ u32 bes_rx_events; /* number of ucast rx completion events */
++ u32 bes_tx_compl; /* number of tx completion entries processed */
++ u32 bes_rx_compl; /* number of rx completion entries
++ processed */
++ u32 bes_ethrx_post_fail; /* number of ethrx buffer alloc
++ failures */
++ /*
++ * number of non ether type II frames dropped where
++ * frame len > length field of Mac Hdr
++ */
++ u32 bes_802_3_dropped_frames;
++ /*
++ * number of non ether type II frames malformed where
++ * in frame len < length field of Mac Hdr
++ */
++ u32 bes_802_3_malformed_frames;
++ u32 bes_ips; /* interrupts / sec */
++ u32 bes_prev_ints; /* bes_ints at last IPS calculation */
++ u16 bes_eth_tx_rate; /* ETH TX rate - Mb/sec */
++ u16 bes_eth_rx_rate; /* ETH RX rate - Mb/sec */
++ u32 bes_rx_coal; /* Num pkts coalasced */
++ u32 bes_rx_flush; /* Num times coalasced */
++ u32 bes_link_change_physical; /*Num of times physical link changed */
++ u32 bes_link_change_virtual; /*Num of times virtual link changed */
++ u32 bes_rx_misc_pkts; /* Misc pkts received */
++};
++
++/* Maximum interrupt delay (in microseconds) allowed */
++#define MAX_EQD 120
++
++/*
++ * timer to prevent system shutdown hang for ever if h/w stops responding
++ */
++struct be_timer_ctxt {
++ atomic_t get_stat_flag;
++ struct timer_list get_stats_timer;
++ unsigned long get_stat_sem_addr;
++} ;
++
++/* This structure is the main BladeEngine driver context. */
++struct be_adapter {
++ struct net_device *netdevp;
++ struct be_drvr_stat be_stat;
++ struct net_device_stats benet_stats;
++
++ /* PCI BAR mapped addresses */
++ u8 __iomem *csr_va; /* CSR */
++ u8 __iomem *db_va; /* Door Bell */
++ u8 __iomem *pci_va; /* PCI Config */
++
++ struct tasklet_struct sts_handler;
++ struct timer_list cq_timer;
++ spinlock_t int_lock; /* to protect the isr field in adapter */
++
++ struct FWCMD_ETH_GET_STATISTICS *eth_statsp;
++ /*
++ * This will enable the use of ethtool to enable or disable
++ * Checksum on Rx pkts to be obeyed or disobeyed.
++ * If this is true = 1, then whatever is the checksum on the
++ * Received pkt as per BE, it will be given to the stack.
++ * Else the stack will re calculate it.
++ */
++ bool rx_csum;
++ /*
++ * This will enable the use of ethtool to enable or disable
++ * Coalese on Rx pkts to be obeyed or disobeyed.
++ * If this is grater than 0 and less than 16 then coalascing
++ * is enabled else it is disabled
++ */
++ u32 max_rx_coal;
++ struct pci_dev *pdev; /* Pointer to OS's PCI dvice */
++
++ spinlock_t txq_lock; /* to stop/wake queue based on tx_q_used */
++
++ u32 isr; /* copy of Intr status reg. */
++
++ u32 port0_link_sts; /* Port 0 link status */
++ u32 port1_link_sts; /* port 1 list status */
++ struct BE_LINK_STATUS *be_link_sts;
++
++ /* pointer to the first netobject of this adapter */
++ struct be_net_object *net_obj;
++
++ /* Flags to indicate what to clean up */
++ bool tasklet_started;
++ bool isr_registered;
++ /*
++ * adaptive interrupt coalescing (AIC) related
++ */
++ bool enable_aic; /* 1 if AIC is enabled */
++ u16 min_eqd; /* minimum EQ delay in usec */
++ u16 max_eqd; /* minimum EQ delay in usec */
++ u16 cur_eqd; /* current EQ delay in usec */
++ /*
++ * book keeping for interrupt / sec and TX/RX rate calculation
++ */
++ ulong ips_jiffies; /* jiffies at last IPS calc */
++ u32 eth_tx_bytes;
++ ulong eth_tx_jiffies;
++ u32 eth_rx_bytes;
++ ulong eth_rx_jiffies;
++
++ struct semaphore get_eth_stat_sem;
++
++ /* timer ctxt to prevent shutdown hanging due to un-responsive BE */
++ struct be_timer_ctxt timer_ctxt;
++
++#define BE_MAX_MSIX_VECTORS 32
++#define BE_MAX_REQ_MSIX_VECTORS 1 /* only one EQ in Linux driver */
++ struct msix_entry msix_entries[BE_MAX_MSIX_VECTORS];
++ bool msix_enabled;
++ bool dma_64bit_cap; /* the Device DAC capable or not */
++ u8 dev_state; /* The current state of the device */
++ u8 dev_pm_state; /* The State of device before going to suspend */
++};
++
++/*
++ * Every second we look at the ints/sec and adjust eq_delay
++ * between adapter->min_eqd and adapter->max_eqd to keep the ints/sec between
++ * IPS_HI_WM and IPS_LO_WM.
++ */
++#define IPS_HI_WM 18000
++#define IPS_LO_WM 8000
++
++
++static inline void index_adv(u32 *index, u32 val, u32 limit)
++{
++ BUG_ON(limit & (limit-1));
++ *index = (*index + val) & (limit - 1);
++}
++
++static inline void index_inc(u32 *index, u32 limit)
++{
++ BUG_ON(limit & (limit-1));
++ *index = (*index + 1) & (limit - 1);
++}
++
++static inline void be_adv_eq_tl(struct be_net_object *pnob)
++{
++ index_inc(&pnob->event_q_tl, pnob->event_q_len);
++}
++
++static inline void be_adv_txq_hd(struct be_net_object *pnob)
++{
++ index_inc(&pnob->tx_q_hd, pnob->tx_q_len);
++}
++
++static inline void be_adv_txq_tl(struct be_net_object *pnob)
++{
++ index_inc(&pnob->tx_q_tl, pnob->tx_q_len);
++}
++
++static inline void be_adv_txcq_tl(struct be_net_object *pnob)
++{
++ index_inc(&pnob->tx_cq_tl, pnob->txcq_len);
++}
++
++static inline void be_adv_rxq_hd(struct be_net_object *pnob)
++{
++ index_inc(&pnob->rx_q_hd, pnob->rx_q_len);
++}
++
++static inline void be_adv_rxcq_tl(struct be_net_object *pnob)
++{
++ index_inc(&pnob->rx_cq_tl, pnob->rx_cq_len);
++}
++
++static inline u32 tx_compl_lastwrb_idx_get(struct be_net_object *pnob)
++{
++ return (pnob->tx_q_tl + *(u32 *)&pnob->tx_ctxt[pnob->tx_q_tl] - 1)
++ & (pnob->tx_q_len - 1);
++}
++
++int benet_init(struct net_device *);
++int be_ethtool_ioctl(struct net_device *, struct ifreq *);
++struct net_device_stats *benet_get_stats(struct net_device *);
++void be_process_intr(unsigned long context);
++irqreturn_t be_int(int irq, void *dev);
++void be_post_eth_rx_buffs(struct be_net_object *);
++void be_get_stat_cb(void *, int, struct MCC_WRB_AMAP *);
++void be_get_stats_timer_handler(unsigned long);
++void be_wait_nic_tx_cmplx_cmpl(struct be_net_object *);
++void be_print_link_info(struct BE_LINK_STATUS *);
++void be_update_link_status(struct be_adapter *);
++void be_init_procfs(struct be_adapter *);
++void be_cleanup_procfs(struct be_adapter *);
++int be_poll(struct napi_struct *, int);
++struct ETH_RX_COMPL_AMAP *be_get_rx_cmpl(struct be_net_object *);
++void be_notify_cmpl(struct be_net_object *, int, int, int);
++void be_enable_intr(struct be_net_object *);
++void be_enable_eq_intr(struct be_net_object *);
++void be_disable_intr(struct be_net_object *);
++void be_disable_eq_intr(struct be_net_object *);
++int be_set_uc_mac_adr(struct be_net_object *, u8, u8, u8,
++ u8 *, mcc_wrb_cqe_callback, void *);
++int be_get_flow_ctl(struct be_function_object *pFnObj, bool *, bool *);
++void process_one_tx_compl(struct be_net_object *pnob, u32 end_idx);
++
++#endif /* _BENET_H_ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/be_netif.c linux-2.6.29-rc3.owrt/drivers/staging/benet/be_netif.c
+--- linux-2.6.29.owrt/drivers/staging/benet/be_netif.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/be_netif.c 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,705 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * be_netif.c
++ *
++ * This file contains various entry points of drivers seen by tcp/ip stack.
++ */
++
++#include <linux/if_vlan.h>
++#include <linux/in.h>
++#include "benet.h"
++#include <linux/ip.h>
++#include <linux/inet_lro.h>
++
++/* Strings to print Link properties */
++static const char *link_speed[] = {
++ "Invalid link Speed Value",
++ "10 Mbps",
++ "100 Mbps",
++ "1 Gbps",
++ "10 Gbps"
++};
++
++static const char *link_duplex[] = {
++ "Invalid Duplex Value",
++ "Half Duplex",
++ "Full Duplex"
++};
++
++static const char *link_state[] = {
++ "",
++ "(active)"
++};
++
++void be_print_link_info(struct BE_LINK_STATUS *lnk_status)
++{
++ u16 si, di, ai;
++
++ /* Port 0 */
++ if (lnk_status->mac0_speed && lnk_status->mac0_duplex) {
++ /* Port is up and running */
++ si = (lnk_status->mac0_speed < 5) ? lnk_status->mac0_speed : 0;
++ di = (lnk_status->mac0_duplex < 3) ?
++ lnk_status->mac0_duplex : 0;
++ ai = (lnk_status->active_port == 0) ? 1 : 0;
++ printk(KERN_INFO "PortNo. 0: Speed - %s %s %s\n",
++ link_speed[si], link_duplex[di], link_state[ai]);
++ } else
++ printk(KERN_INFO "PortNo. 0: Down\n");
++
++ /* Port 1 */
++ if (lnk_status->mac1_speed && lnk_status->mac1_duplex) {
++ /* Port is up and running */
++ si = (lnk_status->mac1_speed < 5) ? lnk_status->mac1_speed : 0;
++ di = (lnk_status->mac1_duplex < 3) ?
++ lnk_status->mac1_duplex : 0;
++ ai = (lnk_status->active_port == 0) ? 1 : 0;
++ printk(KERN_INFO "PortNo. 1: Speed - %s %s %s\n",
++ link_speed[si], link_duplex[di], link_state[ai]);
++ } else
++ printk(KERN_INFO "PortNo. 1: Down\n");
++
++ return;
++}
++
++static int
++be_get_frag_header(struct skb_frag_struct *frag, void **mac_hdr,
++ void **ip_hdr, void **tcpudp_hdr,
++ u64 *hdr_flags, void *priv)
++{
++ struct ethhdr *eh;
++ struct vlan_ethhdr *veh;
++ struct iphdr *iph;
++ u8 *va = page_address(frag->page) + frag->page_offset;
++ unsigned long ll_hlen;
++
++ /* find the mac header, abort if not IPv4 */
++
++ prefetch(va);
++ eh = (struct ethhdr *)va;
++ *mac_hdr = eh;
++ ll_hlen = ETH_HLEN;
++ if (eh->h_proto != htons(ETH_P_IP)) {
++ if (eh->h_proto == htons(ETH_P_8021Q)) {
++ veh = (struct vlan_ethhdr *)va;
++ if (veh->h_vlan_encapsulated_proto != htons(ETH_P_IP))
++ return -1;
++
++ ll_hlen += VLAN_HLEN;
++
++ } else {
++ return -1;
++ }
++ }
++ *hdr_flags = LRO_IPV4;
++
++ iph = (struct iphdr *)(va + ll_hlen);
++ *ip_hdr = iph;
++ if (iph->protocol != IPPROTO_TCP)
++ return -1;
++ *hdr_flags |= LRO_TCP;
++ *tcpudp_hdr = (u8 *) (*ip_hdr) + (iph->ihl << 2);
++
++ return 0;
++}
++
++static int benet_open(struct net_device *netdev)
++{
++ struct be_net_object *pnob = netdev_priv(netdev);
++ struct be_adapter *adapter = pnob->adapter;
++ struct net_lro_mgr *lro_mgr;
++
++ if (adapter->dev_state < BE_DEV_STATE_INIT)
++ return -EAGAIN;
++
++ lro_mgr = &pnob->lro_mgr;
++ lro_mgr->dev = netdev;
++
++ lro_mgr->features = LRO_F_NAPI;
++ lro_mgr->ip_summed = CHECKSUM_UNNECESSARY;
++ lro_mgr->ip_summed_aggr = CHECKSUM_UNNECESSARY;
++ lro_mgr->max_desc = BE_MAX_LRO_DESCRIPTORS;
++ lro_mgr->lro_arr = pnob->lro_desc;
++ lro_mgr->get_frag_header = be_get_frag_header;
++ lro_mgr->max_aggr = adapter->max_rx_coal;
++ lro_mgr->frag_align_pad = 2;
++ if (lro_mgr->max_aggr > MAX_SKB_FRAGS)
++ lro_mgr->max_aggr = MAX_SKB_FRAGS;
++
++ adapter->max_rx_coal = BE_LRO_MAX_PKTS;
++
++ be_update_link_status(adapter);
++
++ /*
++ * Set carrier on only if Physical Link up
++ * Either of the port link status up signifies this
++ */
++ if ((adapter->port0_link_sts == BE_PORT_LINK_UP) ||
++ (adapter->port1_link_sts == BE_PORT_LINK_UP)) {
++ netif_start_queue(netdev);
++ netif_carrier_on(netdev);
++ }
++
++ adapter->dev_state = BE_DEV_STATE_OPEN;
++ napi_enable(&pnob->napi);
++ be_enable_intr(pnob);
++ be_enable_eq_intr(pnob);
++ /*
++ * RX completion queue may be in dis-armed state. Arm it.
++ */
++ be_notify_cmpl(pnob, 0, pnob->rx_cq_id, 1);
++
++ return 0;
++}
++
++static int benet_close(struct net_device *netdev)
++{
++ struct be_net_object *pnob = netdev_priv(netdev);
++ struct be_adapter *adapter = pnob->adapter;
++
++ netif_stop_queue(netdev);
++ synchronize_irq(netdev->irq);
++
++ be_wait_nic_tx_cmplx_cmpl(pnob);
++ adapter->dev_state = BE_DEV_STATE_INIT;
++ netif_carrier_off(netdev);
++
++ adapter->port0_link_sts = BE_PORT_LINK_DOWN;
++ adapter->port1_link_sts = BE_PORT_LINK_DOWN;
++ be_disable_intr(pnob);
++ be_disable_eq_intr(pnob);
++ napi_disable(&pnob->napi);
++
++ return 0;
++}
++
++/*
++ * Setting a Mac Address for BE
++ * Takes netdev and a void pointer as arguments.
++ * The pointer holds the new addres to be used.
++ */
++static int benet_set_mac_addr(struct net_device *netdev, void *p)
++{
++ struct sockaddr *addr = p;
++ struct be_net_object *pnob = netdev_priv(netdev);
++
++ memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
++ be_rxf_mac_address_read_write(&pnob->fn_obj, 0, 0, false, true, false,
++ netdev->dev_addr, NULL, NULL);
++ /*
++ * Since we are doing Active-Passive failover, both
++ * ports should have matching MAC addresses everytime.
++ */
++ be_rxf_mac_address_read_write(&pnob->fn_obj, 1, 0, false, true, false,
++ netdev->dev_addr, NULL, NULL);
++
++ return 0;
++}
++
++void be_get_stats_timer_handler(unsigned long context)
++{
++ struct be_timer_ctxt *ctxt = (struct be_timer_ctxt *)context;
++
++ if (atomic_read(&ctxt->get_stat_flag)) {
++ atomic_dec(&ctxt->get_stat_flag);
++ up((void *)ctxt->get_stat_sem_addr);
++ }
++ del_timer(&ctxt->get_stats_timer);
++ return;
++}
++
++void be_get_stat_cb(void *context, int status,
++ struct MCC_WRB_AMAP *optional_wrb)
++{
++ struct be_timer_ctxt *ctxt = (struct be_timer_ctxt *)context;
++ /*
++ * just up the semaphore if the get_stat_flag
++ * reads 1. so that the waiter can continue.
++ * If it is 0, then it was handled by the timer handler.
++ */
++ del_timer(&ctxt->get_stats_timer);
++ if (atomic_read(&ctxt->get_stat_flag)) {
++ atomic_dec(&ctxt->get_stat_flag);
++ up((void *)ctxt->get_stat_sem_addr);
++ }
++}
++
++struct net_device_stats *benet_get_stats(struct net_device *dev)
++{
++ struct be_net_object *pnob = netdev_priv(dev);
++ struct be_adapter *adapter = pnob->adapter;
++ u64 pa;
++ struct be_timer_ctxt *ctxt = &adapter->timer_ctxt;
++
++ if (adapter->dev_state != BE_DEV_STATE_OPEN) {
++ /* Return previously read stats */
++ return &(adapter->benet_stats);
++ }
++ /* Get Physical Addr */
++ pa = pci_map_single(adapter->pdev, adapter->eth_statsp,
++ sizeof(struct FWCMD_ETH_GET_STATISTICS),
++ PCI_DMA_FROMDEVICE);
++ ctxt->get_stat_sem_addr = (unsigned long)&adapter->get_eth_stat_sem;
++ atomic_inc(&ctxt->get_stat_flag);
++
++ be_rxf_query_eth_statistics(&pnob->fn_obj, adapter->eth_statsp,
++ cpu_to_le64(pa), be_get_stat_cb, ctxt,
++ NULL);
++
++ ctxt->get_stats_timer.data = (unsigned long)ctxt;
++ mod_timer(&ctxt->get_stats_timer, (jiffies + (HZ * 2)));
++ down((void *)ctxt->get_stat_sem_addr); /* callback will unblock us */
++
++ /* Adding port0 and port1 stats. */
++ adapter->benet_stats.rx_packets =
++ adapter->eth_statsp->params.response.p0recvdtotalframes +
++ adapter->eth_statsp->params.response.p1recvdtotalframes;
++ adapter->benet_stats.tx_packets =
++ adapter->eth_statsp->params.response.p0xmitunicastframes +
++ adapter->eth_statsp->params.response.p1xmitunicastframes;
++ adapter->benet_stats.tx_bytes =
++ adapter->eth_statsp->params.response.p0xmitbyteslsd +
++ adapter->eth_statsp->params.response.p1xmitbyteslsd;
++ adapter->benet_stats.rx_errors =
++ adapter->eth_statsp->params.response.p0crcerrors +
++ adapter->eth_statsp->params.response.p1crcerrors;
++ adapter->benet_stats.rx_errors +=
++ adapter->eth_statsp->params.response.p0alignmentsymerrs +
++ adapter->eth_statsp->params.response.p1alignmentsymerrs;
++ adapter->benet_stats.rx_errors +=
++ adapter->eth_statsp->params.response.p0inrangelenerrors +
++ adapter->eth_statsp->params.response.p1inrangelenerrors;
++ adapter->benet_stats.rx_bytes =
++ adapter->eth_statsp->params.response.p0recvdtotalbytesLSD +
++ adapter->eth_statsp->params.response.p1recvdtotalbytesLSD;
++ adapter->benet_stats.rx_crc_errors =
++ adapter->eth_statsp->params.response.p0crcerrors +
++ adapter->eth_statsp->params.response.p1crcerrors;
++
++ adapter->benet_stats.tx_packets +=
++ adapter->eth_statsp->params.response.p0xmitmulticastframes +
++ adapter->eth_statsp->params.response.p1xmitmulticastframes;
++ adapter->benet_stats.tx_packets +=
++ adapter->eth_statsp->params.response.p0xmitbroadcastframes +
++ adapter->eth_statsp->params.response.p1xmitbroadcastframes;
++ adapter->benet_stats.tx_errors = 0;
++
++ adapter->benet_stats.multicast =
++ adapter->eth_statsp->params.response.p0xmitmulticastframes +
++ adapter->eth_statsp->params.response.p1xmitmulticastframes;
++
++ adapter->benet_stats.rx_fifo_errors =
++ adapter->eth_statsp->params.response.p0rxfifooverflowdropped +
++ adapter->eth_statsp->params.response.p1rxfifooverflowdropped;
++ adapter->benet_stats.rx_frame_errors =
++ adapter->eth_statsp->params.response.p0alignmentsymerrs +
++ adapter->eth_statsp->params.response.p1alignmentsymerrs;
++ adapter->benet_stats.rx_length_errors =
++ adapter->eth_statsp->params.response.p0inrangelenerrors +
++ adapter->eth_statsp->params.response.p1inrangelenerrors;
++ adapter->benet_stats.rx_length_errors +=
++ adapter->eth_statsp->params.response.p0outrangeerrors +
++ adapter->eth_statsp->params.response.p1outrangeerrors;
++ adapter->benet_stats.rx_length_errors +=
++ adapter->eth_statsp->params.response.p0frametoolongerrors +
++ adapter->eth_statsp->params.response.p1frametoolongerrors;
++
++ pci_unmap_single(adapter->pdev, (ulong) adapter->eth_statsp,
++ sizeof(struct FWCMD_ETH_GET_STATISTICS),
++ PCI_DMA_FROMDEVICE);
++ return &(adapter->benet_stats);
++
++}
++
++static void be_start_tx(struct be_net_object *pnob, u32 nposted)
++{
++#define CSR_ETH_MAX_SQPOSTS 255
++ struct SQ_DB_AMAP sqdb;
++
++ sqdb.dw[0] = 0;
++
++ AMAP_SET_BITS_PTR(SQ_DB, cid, &sqdb, pnob->tx_q_id);
++ while (nposted) {
++ if (nposted > CSR_ETH_MAX_SQPOSTS) {
++ AMAP_SET_BITS_PTR(SQ_DB, numPosted, &sqdb,
++ CSR_ETH_MAX_SQPOSTS);
++ nposted -= CSR_ETH_MAX_SQPOSTS;
++ } else {
++ AMAP_SET_BITS_PTR(SQ_DB, numPosted, &sqdb, nposted);
++ nposted = 0;
++ }
++ PD_WRITE(&pnob->fn_obj, etx_sq_db, sqdb.dw[0]);
++ }
++
++ return;
++}
++
++static void update_tx_rate(struct be_adapter *adapter)
++{
++ /* update the rate once in two seconds */
++ if ((jiffies - adapter->eth_tx_jiffies) > 2 * (HZ)) {
++ u32 r;
++ r = adapter->eth_tx_bytes /
++ ((jiffies - adapter->eth_tx_jiffies) / (HZ));
++ r = (r / 1000000); /* M bytes/s */
++ adapter->be_stat.bes_eth_tx_rate = (r * 8); /* M bits/s */
++ adapter->eth_tx_jiffies = jiffies;
++ adapter->eth_tx_bytes = 0;
++ }
++}
++
++static int wrb_cnt_in_skb(struct sk_buff *skb)
++{
++ int cnt = 0;
++ while (skb) {
++ if (skb->len > skb->data_len)
++ cnt++;
++ cnt += skb_shinfo(skb)->nr_frags;
++ skb = skb_shinfo(skb)->frag_list;
++ }
++ BUG_ON(cnt > BE_MAX_TX_FRAG_COUNT);
++ return cnt;
++}
++
++static void wrb_fill(struct ETH_WRB_AMAP *wrb, u64 addr, int len)
++{
++ AMAP_SET_BITS_PTR(ETH_WRB, frag_pa_hi, wrb, addr >> 32);
++ AMAP_SET_BITS_PTR(ETH_WRB, frag_pa_lo, wrb, addr & 0xFFFFFFFF);
++ AMAP_SET_BITS_PTR(ETH_WRB, frag_len, wrb, len);
++}
++
++static void wrb_fill_extra(struct ETH_WRB_AMAP *wrb, struct sk_buff *skb,
++ struct be_net_object *pnob)
++{
++ wrb->dw[2] = 0;
++ wrb->dw[3] = 0;
++ AMAP_SET_BITS_PTR(ETH_WRB, crc, wrb, 1);
++ if (skb_shinfo(skb)->gso_segs > 1 && skb_shinfo(skb)->gso_size) {
++ AMAP_SET_BITS_PTR(ETH_WRB, lso, wrb, 1);
++ AMAP_SET_BITS_PTR(ETH_WRB, lso_mss, wrb,
++ skb_shinfo(skb)->gso_size);
++ } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
++ u8 proto = ((struct iphdr *)ip_hdr(skb))->protocol;
++ if (proto == IPPROTO_TCP)
++ AMAP_SET_BITS_PTR(ETH_WRB, tcpcs, wrb, 1);
++ else if (proto == IPPROTO_UDP)
++ AMAP_SET_BITS_PTR(ETH_WRB, udpcs, wrb, 1);
++ }
++ if (pnob->vlan_grp && vlan_tx_tag_present(skb)) {
++ AMAP_SET_BITS_PTR(ETH_WRB, vlan, wrb, 1);
++ AMAP_SET_BITS_PTR(ETH_WRB, vlan_tag, wrb, vlan_tx_tag_get(skb));
++ }
++}
++
++static inline void wrb_copy_extra(struct ETH_WRB_AMAP *to,
++ struct ETH_WRB_AMAP *from)
++{
++
++ to->dw[2] = from->dw[2];
++ to->dw[3] = from->dw[3];
++}
++
++/* Returns the actual count of wrbs used including a possible dummy */
++static int copy_skb_to_txq(struct be_net_object *pnob, struct sk_buff *skb,
++ u32 wrb_cnt, u32 *copied)
++{
++ u64 busaddr;
++ struct ETH_WRB_AMAP *wrb = NULL, *first = NULL;
++ u32 i;
++ bool dummy = true;
++ struct pci_dev *pdev = pnob->adapter->pdev;
++
++ if (wrb_cnt & 1)
++ wrb_cnt++;
++ else
++ dummy = false;
++
++ atomic_add(wrb_cnt, &pnob->tx_q_used);
++
++ while (skb) {
++ if (skb->len > skb->data_len) {
++ int len = skb->len - skb->data_len;
++ busaddr = pci_map_single(pdev, skb->data, len,
++ PCI_DMA_TODEVICE);
++ busaddr = cpu_to_le64(busaddr);
++ wrb = &pnob->tx_q[pnob->tx_q_hd];
++ if (first == NULL) {
++ wrb_fill_extra(wrb, skb, pnob);
++ first = wrb;
++ } else {
++ wrb_copy_extra(wrb, first);
++ }
++ wrb_fill(wrb, busaddr, len);
++ be_adv_txq_hd(pnob);
++ *copied += len;
++ }
++
++ for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
++ struct skb_frag_struct *frag =
++ &skb_shinfo(skb)->frags[i];
++ busaddr = pci_map_page(pdev, frag->page,
++ frag->page_offset, frag->size,
++ PCI_DMA_TODEVICE);
++ busaddr = cpu_to_le64(busaddr);
++ wrb = &pnob->tx_q[pnob->tx_q_hd];
++ if (first == NULL) {
++ wrb_fill_extra(wrb, skb, pnob);
++ first = wrb;
++ } else {
++ wrb_copy_extra(wrb, first);
++ }
++ wrb_fill(wrb, busaddr, frag->size);
++ be_adv_txq_hd(pnob);
++ *copied += frag->size;
++ }
++ skb = skb_shinfo(skb)->frag_list;
++ }
++
++ if (dummy) {
++ wrb = &pnob->tx_q[pnob->tx_q_hd];
++ BUG_ON(first == NULL);
++ wrb_copy_extra(wrb, first);
++ wrb_fill(wrb, 0, 0);
++ be_adv_txq_hd(pnob);
++ }
++ AMAP_SET_BITS_PTR(ETH_WRB, complete, wrb, 1);
++ AMAP_SET_BITS_PTR(ETH_WRB, last, wrb, 1);
++ return wrb_cnt;
++}
++
++/* For each skb transmitted, tx_ctxt stores the num of wrbs in the
++ * start index and skb pointer in the end index
++ */
++static inline void be_tx_wrb_info_remember(struct be_net_object *pnob,
++ struct sk_buff *skb, int wrb_cnt,
++ u32 start)
++{
++ *(u32 *) (&pnob->tx_ctxt[start]) = wrb_cnt;
++ index_adv(&start, wrb_cnt - 1, pnob->tx_q_len);
++ pnob->tx_ctxt[start] = skb;
++}
++
++static int benet_xmit(struct sk_buff *skb, struct net_device *netdev)
++{
++ struct be_net_object *pnob = netdev_priv(netdev);
++ struct be_adapter *adapter = pnob->adapter;
++ u32 wrb_cnt, copied = 0;
++ u32 start = pnob->tx_q_hd;
++
++ adapter->be_stat.bes_tx_reqs++;
++
++ wrb_cnt = wrb_cnt_in_skb(skb);
++ spin_lock_bh(&adapter->txq_lock);
++ if ((pnob->tx_q_len - 2 - atomic_read(&pnob->tx_q_used)) <= wrb_cnt) {
++ netif_stop_queue(pnob->netdev);
++ spin_unlock_bh(&adapter->txq_lock);
++ adapter->be_stat.bes_tx_fails++;
++ return NETDEV_TX_BUSY;
++ }
++ spin_unlock_bh(&adapter->txq_lock);
++
++ wrb_cnt = copy_skb_to_txq(pnob, skb, wrb_cnt, &copied);
++ be_tx_wrb_info_remember(pnob, skb, wrb_cnt, start);
++
++ be_start_tx(pnob, wrb_cnt);
++
++ adapter->eth_tx_bytes += copied;
++ adapter->be_stat.bes_tx_wrbs += wrb_cnt;
++ update_tx_rate(adapter);
++ netdev->trans_start = jiffies;
++
++ return NETDEV_TX_OK;
++}
++
++/*
++ * This is the driver entry point to change the mtu of the device
++ * Returns 0 for success and errno for failure.
++ */
++static int benet_change_mtu(struct net_device *netdev, int new_mtu)
++{
++ /*
++ * BE supports jumbo frame size upto 9000 bytes including the link layer
++ * header. Considering the different variants of frame formats possible
++ * like VLAN, SNAP/LLC, the maximum possible value for MTU is 8974 bytes
++ */
++
++ if (new_mtu < (ETH_ZLEN + ETH_FCS_LEN) || (new_mtu > BE_MAX_MTU)) {
++ dev_info(&netdev->dev, "Invalid MTU requested. "
++ "Must be between %d and %d bytes\n",
++ (ETH_ZLEN + ETH_FCS_LEN), BE_MAX_MTU);
++ return -EINVAL;
++ }
++ dev_info(&netdev->dev, "MTU changed from %d to %d\n",
++ netdev->mtu, new_mtu);
++ netdev->mtu = new_mtu;
++ return 0;
++}
++
++/*
++ * This is the driver entry point to register a vlan with the device
++ */
++static void benet_vlan_register(struct net_device *netdev,
++ struct vlan_group *grp)
++{
++ struct be_net_object *pnob = netdev_priv(netdev);
++
++ be_disable_eq_intr(pnob);
++ pnob->vlan_grp = grp;
++ pnob->num_vlans = 0;
++ be_enable_eq_intr(pnob);
++}
++
++/*
++ * This is the driver entry point to add a vlan vlan_id
++ * with the device netdev
++ */
++static void benet_vlan_add_vid(struct net_device *netdev, u16 vlan_id)
++{
++ struct be_net_object *pnob = netdev_priv(netdev);
++
++ if (pnob->num_vlans == (BE_NUM_VLAN_SUPPORTED - 1)) {
++ /* no way to return an error */
++ dev_info(&netdev->dev,
++ "BladeEngine: Cannot configure more than %d Vlans\n",
++ BE_NUM_VLAN_SUPPORTED);
++ return;
++ }
++ /* The new vlan tag will be in the slot indicated by num_vlans. */
++ pnob->vlan_tag[pnob->num_vlans++] = vlan_id;
++ be_rxf_vlan_config(&pnob->fn_obj, false, pnob->num_vlans,
++ pnob->vlan_tag, NULL, NULL, NULL);
++}
++
++/*
++ * This is the driver entry point to remove a vlan vlan_id
++ * with the device netdev
++ */
++static void benet_vlan_rem_vid(struct net_device *netdev, u16 vlan_id)
++{
++ struct be_net_object *pnob = netdev_priv(netdev);
++
++ u32 i, value;
++
++ /*
++ * In Blade Engine, we support 32 vlan tag filters across both ports.
++ * To program a vlan tag, the RXF_RTPR_CSR register is used.
++ * Each 32-bit value of RXF_RTDR_CSR can address 2 vlan tag entries.
++ * The Vlan table is of depth 16. thus we support 32 tags.
++ */
++
++ value = vlan_id | VLAN_VALID_BIT;
++ for (i = 0; i < BE_NUM_VLAN_SUPPORTED; i++) {
++ if (pnob->vlan_tag[i] == vlan_id)
++ break;
++ }
++
++ if (i == BE_NUM_VLAN_SUPPORTED)
++ return;
++ /* Now compact the vlan tag array by removing hole created. */
++ while ((i + 1) < BE_NUM_VLAN_SUPPORTED) {
++ pnob->vlan_tag[i] = pnob->vlan_tag[i + 1];
++ i++;
++ }
++ if ((i + 1) == BE_NUM_VLAN_SUPPORTED)
++ pnob->vlan_tag[i] = (u16) 0x0;
++ pnob->num_vlans--;
++ be_rxf_vlan_config(&pnob->fn_obj, false, pnob->num_vlans,
++ pnob->vlan_tag, NULL, NULL, NULL);
++}
++
++/*
++ * This function is called to program multicast
++ * address in the multicast filter of the ASIC.
++ */
++static void be_set_multicast_filter(struct net_device *netdev)
++{
++ struct be_net_object *pnob = netdev_priv(netdev);
++ struct dev_mc_list *mc_ptr;
++ u8 mac_addr[32][ETH_ALEN];
++ int i;
++
++ if (netdev->flags & IFF_ALLMULTI) {
++ /* set BE in Multicast promiscuous */
++ be_rxf_multicast_config(&pnob->fn_obj, true, 0, NULL, NULL,
++ NULL, NULL);
++ return;
++ }
++
++ for (mc_ptr = netdev->mc_list, i = 0; mc_ptr;
++ mc_ptr = mc_ptr->next, i++) {
++ memcpy(&mac_addr[i][0], mc_ptr->dmi_addr, ETH_ALEN);
++ }
++
++ /* reset the promiscuous mode also. */
++ be_rxf_multicast_config(&pnob->fn_obj, false, i,
++ &mac_addr[0][0], NULL, NULL, NULL);
++}
++
++/*
++ * This is the driver entry point to set multicast list
++ * with the device netdev. This function will be used to
++ * set promiscuous mode or multicast promiscuous mode
++ * or multicast mode....
++ */
++static void benet_set_multicast_list(struct net_device *netdev)
++{
++ struct be_net_object *pnob = netdev_priv(netdev);
++
++ if (netdev->flags & IFF_PROMISC) {
++ be_rxf_promiscuous(&pnob->fn_obj, 1, 1, NULL, NULL, NULL);
++ } else {
++ be_rxf_promiscuous(&pnob->fn_obj, 0, 0, NULL, NULL, NULL);
++ be_set_multicast_filter(netdev);
++ }
++}
++
++int benet_init(struct net_device *netdev)
++{
++ struct be_net_object *pnob = netdev_priv(netdev);
++ struct be_adapter *adapter = pnob->adapter;
++
++ ether_setup(netdev);
++
++ netdev->open = &benet_open;
++ netdev->stop = &benet_close;
++ netdev->hard_start_xmit = &benet_xmit;
++
++ netdev->get_stats = &benet_get_stats;
++
++ netdev->set_multicast_list = &benet_set_multicast_list;
++
++ netdev->change_mtu = &benet_change_mtu;
++ netdev->set_mac_address = &benet_set_mac_addr;
++
++ netdev->vlan_rx_register = benet_vlan_register;
++ netdev->vlan_rx_add_vid = benet_vlan_add_vid;
++ netdev->vlan_rx_kill_vid = benet_vlan_rem_vid;
++
++ netdev->features =
++ NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_HW_VLAN_RX | NETIF_F_TSO |
++ NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_FILTER | NETIF_F_IP_CSUM;
++
++ netdev->flags |= IFF_MULTICAST;
++
++ /* If device is DAC Capable, set the HIGHDMA flag for netdevice. */
++ if (adapter->dma_64bit_cap)
++ netdev->features |= NETIF_F_HIGHDMA;
++
++ SET_ETHTOOL_OPS(netdev, &be_ethtool_ops);
++ return 0;
++}
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/bestatus.h linux-2.6.29-rc3.owrt/drivers/staging/benet/bestatus.h
+--- linux-2.6.29.owrt/drivers/staging/benet/bestatus.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/bestatus.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,103 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++#ifndef _BESTATUS_H_
++#define _BESTATUS_H_
++
++#define BE_SUCCESS (0x00000000L)
++/*
++ * MessageId: BE_PENDING
++ * The BladeEngine Driver call succeeded, and pended operation.
++ */
++#define BE_PENDING (0x20070001L)
++#define BE_STATUS_PENDING (BE_PENDING)
++/*
++ * MessageId: BE_NOT_OK
++ * An error occurred.
++ */
++#define BE_NOT_OK (0xE0070002L)
++/*
++ * MessageId: BE_STATUS_SYSTEM_RESOURCES
++ * Insufficient host system resources exist to complete the API.
++ */
++#define BE_STATUS_SYSTEM_RESOURCES (0xE0070003L)
++/*
++ * MessageId: BE_STATUS_CHIP_RESOURCES
++ * Insufficient chip resources exist to complete the API.
++ */
++#define BE_STATUS_CHIP_RESOURCES (0xE0070004L)
++/*
++ * MessageId: BE_STATUS_NO_RESOURCE
++ * Insufficient resources to complete request.
++ */
++#define BE_STATUS_NO_RESOURCE (0xE0070005L)
++/*
++ * MessageId: BE_STATUS_BUSY
++ * Resource is currently busy.
++ */
++#define BE_STATUS_BUSY (0xE0070006L)
++/*
++ * MessageId: BE_STATUS_INVALID_PARAMETER
++ * Invalid Parameter in request.
++ */
++#define BE_STATUS_INVALID_PARAMETER (0xE0000007L)
++/*
++ * MessageId: BE_STATUS_NOT_SUPPORTED
++ * Requested operation is not supported.
++ */
++#define BE_STATUS_NOT_SUPPORTED (0xE000000DL)
++
++/*
++ * ***************************************************************************
++ * E T H E R N E T S T A T U S
++ * ***************************************************************************
++ */
++
++/*
++ * MessageId: BE_ETH_TX_ERROR
++ * The Ethernet device driver failed to transmit a packet.
++ */
++#define BE_ETH_TX_ERROR (0xE0070101L)
++
++/*
++ * ***************************************************************************
++ * S H A R E D S T A T U S
++ * ***************************************************************************
++ */
++
++/*
++ * MessageId: BE_STATUS_VBD_INVALID_VERSION
++ * The device driver is not compatible with this version of the VBD.
++ */
++#define BE_STATUS_INVALID_VERSION (0xE0070402L)
++/*
++ * MessageId: BE_STATUS_DOMAIN_DENIED
++ * The operation failed to complete due to insufficient access
++ * rights for the requesting domain.
++ */
++#define BE_STATUS_DOMAIN_DENIED (0xE0070403L)
++/*
++ * MessageId: BE_STATUS_TCP_NOT_STARTED
++ * The embedded TCP/IP stack has not been started.
++ */
++#define BE_STATUS_TCP_NOT_STARTED (0xE0070409L)
++/*
++ * MessageId: BE_STATUS_NO_MCC_WRB
++ * No free MCC WRB are available for posting the request.
++ */
++#define BE_STATUS_NO_MCC_WRB (0xE0070414L)
++
++#endif /* _BESTATUS_ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/cev.h linux-2.6.29-rc3.owrt/drivers/staging/benet/cev.h
+--- linux-2.6.29.owrt/drivers/staging/benet/cev.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/cev.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,243 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * Autogenerated by srcgen version: 0127
++ */
++#ifndef __cev_amap_h__
++#define __cev_amap_h__
++#include "ep.h"
++
++/*
++ * Host Interrupt Status Register 0. The first of four application
++ * interrupt status registers. This register contains the interrupts
++ * for Event Queues EQ0 through EQ31.
++ */
++struct BE_CEV_ISR0_CSR_AMAP {
++ u8 interrupt0; /* DWORD 0 */
++ u8 interrupt1; /* DWORD 0 */
++ u8 interrupt2; /* DWORD 0 */
++ u8 interrupt3; /* DWORD 0 */
++ u8 interrupt4; /* DWORD 0 */
++ u8 interrupt5; /* DWORD 0 */
++ u8 interrupt6; /* DWORD 0 */
++ u8 interrupt7; /* DWORD 0 */
++ u8 interrupt8; /* DWORD 0 */
++ u8 interrupt9; /* DWORD 0 */
++ u8 interrupt10; /* DWORD 0 */
++ u8 interrupt11; /* DWORD 0 */
++ u8 interrupt12; /* DWORD 0 */
++ u8 interrupt13; /* DWORD 0 */
++ u8 interrupt14; /* DWORD 0 */
++ u8 interrupt15; /* DWORD 0 */
++ u8 interrupt16; /* DWORD 0 */
++ u8 interrupt17; /* DWORD 0 */
++ u8 interrupt18; /* DWORD 0 */
++ u8 interrupt19; /* DWORD 0 */
++ u8 interrupt20; /* DWORD 0 */
++ u8 interrupt21; /* DWORD 0 */
++ u8 interrupt22; /* DWORD 0 */
++ u8 interrupt23; /* DWORD 0 */
++ u8 interrupt24; /* DWORD 0 */
++ u8 interrupt25; /* DWORD 0 */
++ u8 interrupt26; /* DWORD 0 */
++ u8 interrupt27; /* DWORD 0 */
++ u8 interrupt28; /* DWORD 0 */
++ u8 interrupt29; /* DWORD 0 */
++ u8 interrupt30; /* DWORD 0 */
++ u8 interrupt31; /* DWORD 0 */
++} __packed;
++struct CEV_ISR0_CSR_AMAP {
++ u32 dw[1];
++};
++
++/*
++ * Host Interrupt Status Register 1. The second of four application
++ * interrupt status registers. This register contains the interrupts
++ * for Event Queues EQ32 through EQ63.
++ */
++struct BE_CEV_ISR1_CSR_AMAP {
++ u8 interrupt32; /* DWORD 0 */
++ u8 interrupt33; /* DWORD 0 */
++ u8 interrupt34; /* DWORD 0 */
++ u8 interrupt35; /* DWORD 0 */
++ u8 interrupt36; /* DWORD 0 */
++ u8 interrupt37; /* DWORD 0 */
++ u8 interrupt38; /* DWORD 0 */
++ u8 interrupt39; /* DWORD 0 */
++ u8 interrupt40; /* DWORD 0 */
++ u8 interrupt41; /* DWORD 0 */
++ u8 interrupt42; /* DWORD 0 */
++ u8 interrupt43; /* DWORD 0 */
++ u8 interrupt44; /* DWORD 0 */
++ u8 interrupt45; /* DWORD 0 */
++ u8 interrupt46; /* DWORD 0 */
++ u8 interrupt47; /* DWORD 0 */
++ u8 interrupt48; /* DWORD 0 */
++ u8 interrupt49; /* DWORD 0 */
++ u8 interrupt50; /* DWORD 0 */
++ u8 interrupt51; /* DWORD 0 */
++ u8 interrupt52; /* DWORD 0 */
++ u8 interrupt53; /* DWORD 0 */
++ u8 interrupt54; /* DWORD 0 */
++ u8 interrupt55; /* DWORD 0 */
++ u8 interrupt56; /* DWORD 0 */
++ u8 interrupt57; /* DWORD 0 */
++ u8 interrupt58; /* DWORD 0 */
++ u8 interrupt59; /* DWORD 0 */
++ u8 interrupt60; /* DWORD 0 */
++ u8 interrupt61; /* DWORD 0 */
++ u8 interrupt62; /* DWORD 0 */
++ u8 interrupt63; /* DWORD 0 */
++} __packed;
++struct CEV_ISR1_CSR_AMAP {
++ u32 dw[1];
++};
++/*
++ * Host Interrupt Status Register 2. The third of four application
++ * interrupt status registers. This register contains the interrupts
++ * for Event Queues EQ64 through EQ95.
++ */
++struct BE_CEV_ISR2_CSR_AMAP {
++ u8 interrupt64; /* DWORD 0 */
++ u8 interrupt65; /* DWORD 0 */
++ u8 interrupt66; /* DWORD 0 */
++ u8 interrupt67; /* DWORD 0 */
++ u8 interrupt68; /* DWORD 0 */
++ u8 interrupt69; /* DWORD 0 */
++ u8 interrupt70; /* DWORD 0 */
++ u8 interrupt71; /* DWORD 0 */
++ u8 interrupt72; /* DWORD 0 */
++ u8 interrupt73; /* DWORD 0 */
++ u8 interrupt74; /* DWORD 0 */
++ u8 interrupt75; /* DWORD 0 */
++ u8 interrupt76; /* DWORD 0 */
++ u8 interrupt77; /* DWORD 0 */
++ u8 interrupt78; /* DWORD 0 */
++ u8 interrupt79; /* DWORD 0 */
++ u8 interrupt80; /* DWORD 0 */
++ u8 interrupt81; /* DWORD 0 */
++ u8 interrupt82; /* DWORD 0 */
++ u8 interrupt83; /* DWORD 0 */
++ u8 interrupt84; /* DWORD 0 */
++ u8 interrupt85; /* DWORD 0 */
++ u8 interrupt86; /* DWORD 0 */
++ u8 interrupt87; /* DWORD 0 */
++ u8 interrupt88; /* DWORD 0 */
++ u8 interrupt89; /* DWORD 0 */
++ u8 interrupt90; /* DWORD 0 */
++ u8 interrupt91; /* DWORD 0 */
++ u8 interrupt92; /* DWORD 0 */
++ u8 interrupt93; /* DWORD 0 */
++ u8 interrupt94; /* DWORD 0 */
++ u8 interrupt95; /* DWORD 0 */
++} __packed;
++struct CEV_ISR2_CSR_AMAP {
++ u32 dw[1];
++};
++
++/*
++ * Host Interrupt Status Register 3. The fourth of four application
++ * interrupt status registers. This register contains the interrupts
++ * for Event Queues EQ96 through EQ127.
++ */
++struct BE_CEV_ISR3_CSR_AMAP {
++ u8 interrupt96; /* DWORD 0 */
++ u8 interrupt97; /* DWORD 0 */
++ u8 interrupt98; /* DWORD 0 */
++ u8 interrupt99; /* DWORD 0 */
++ u8 interrupt100; /* DWORD 0 */
++ u8 interrupt101; /* DWORD 0 */
++ u8 interrupt102; /* DWORD 0 */
++ u8 interrupt103; /* DWORD 0 */
++ u8 interrupt104; /* DWORD 0 */
++ u8 interrupt105; /* DWORD 0 */
++ u8 interrupt106; /* DWORD 0 */
++ u8 interrupt107; /* DWORD 0 */
++ u8 interrupt108; /* DWORD 0 */
++ u8 interrupt109; /* DWORD 0 */
++ u8 interrupt110; /* DWORD 0 */
++ u8 interrupt111; /* DWORD 0 */
++ u8 interrupt112; /* DWORD 0 */
++ u8 interrupt113; /* DWORD 0 */
++ u8 interrupt114; /* DWORD 0 */
++ u8 interrupt115; /* DWORD 0 */
++ u8 interrupt116; /* DWORD 0 */
++ u8 interrupt117; /* DWORD 0 */
++ u8 interrupt118; /* DWORD 0 */
++ u8 interrupt119; /* DWORD 0 */
++ u8 interrupt120; /* DWORD 0 */
++ u8 interrupt121; /* DWORD 0 */
++ u8 interrupt122; /* DWORD 0 */
++ u8 interrupt123; /* DWORD 0 */
++ u8 interrupt124; /* DWORD 0 */
++ u8 interrupt125; /* DWORD 0 */
++ u8 interrupt126; /* DWORD 0 */
++ u8 interrupt127; /* DWORD 0 */
++} __packed;
++struct CEV_ISR3_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* Completions and Events block Registers. */
++struct BE_CEV_CSRMAP_AMAP {
++ u8 rsvd0[32]; /* DWORD 0 */
++ u8 rsvd1[32]; /* DWORD 1 */
++ u8 rsvd2[32]; /* DWORD 2 */
++ u8 rsvd3[32]; /* DWORD 3 */
++ struct BE_CEV_ISR0_CSR_AMAP isr0;
++ struct BE_CEV_ISR1_CSR_AMAP isr1;
++ struct BE_CEV_ISR2_CSR_AMAP isr2;
++ struct BE_CEV_ISR3_CSR_AMAP isr3;
++ u8 rsvd4[32]; /* DWORD 8 */
++ u8 rsvd5[32]; /* DWORD 9 */
++ u8 rsvd6[32]; /* DWORD 10 */
++ u8 rsvd7[32]; /* DWORD 11 */
++ u8 rsvd8[32]; /* DWORD 12 */
++ u8 rsvd9[32]; /* DWORD 13 */
++ u8 rsvd10[32]; /* DWORD 14 */
++ u8 rsvd11[32]; /* DWORD 15 */
++ u8 rsvd12[32]; /* DWORD 16 */
++ u8 rsvd13[32]; /* DWORD 17 */
++ u8 rsvd14[32]; /* DWORD 18 */
++ u8 rsvd15[32]; /* DWORD 19 */
++ u8 rsvd16[32]; /* DWORD 20 */
++ u8 rsvd17[32]; /* DWORD 21 */
++ u8 rsvd18[32]; /* DWORD 22 */
++ u8 rsvd19[32]; /* DWORD 23 */
++ u8 rsvd20[32]; /* DWORD 24 */
++ u8 rsvd21[32]; /* DWORD 25 */
++ u8 rsvd22[32]; /* DWORD 26 */
++ u8 rsvd23[32]; /* DWORD 27 */
++ u8 rsvd24[32]; /* DWORD 28 */
++ u8 rsvd25[32]; /* DWORD 29 */
++ u8 rsvd26[32]; /* DWORD 30 */
++ u8 rsvd27[32]; /* DWORD 31 */
++ u8 rsvd28[32]; /* DWORD 32 */
++ u8 rsvd29[32]; /* DWORD 33 */
++ u8 rsvd30[192]; /* DWORD 34 */
++ u8 rsvd31[192]; /* DWORD 40 */
++ u8 rsvd32[160]; /* DWORD 46 */
++ u8 rsvd33[160]; /* DWORD 51 */
++ u8 rsvd34[160]; /* DWORD 56 */
++ u8 rsvd35[96]; /* DWORD 61 */
++ u8 rsvd36[192][32]; /* DWORD 64 */
++} __packed;
++struct CEV_CSRMAP_AMAP {
++ u32 dw[256];
++};
++
++#endif /* __cev_amap_h__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/cq.c linux-2.6.29-rc3.owrt/drivers/staging/benet/cq.c
+--- linux-2.6.29.owrt/drivers/staging/benet/cq.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/cq.c 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,211 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++#include "hwlib.h"
++#include "bestatus.h"
++
++/*
++ * Completion Queue Objects
++ */
++/*
++ *============================================================================
++ * P U B L I C R O U T I N E S
++ *============================================================================
++ */
++
++/*
++ This routine creates a completion queue based on the client completion
++ queue configuration information.
++
++
++ FunctionObject - Handle to a function object
++ CqBaseVa - Base VA for a the CQ ring
++ NumEntries - CEV_CQ_CNT_* values
++ solEventEnable - 0 = All CQEs can generate Events if CQ is eventable
++ 1 = only CQEs with solicited bit set are eventable
++ eventable - Eventable CQ, generates interrupts.
++ nodelay - 1 = Force interrupt, relevent if CQ eventable.
++ Interrupt is asserted immediately after EQE
++ write is confirmed, regardless of EQ Timer
++ or watermark settings.
++ wme - Enable watermark based coalescing
++ wmThresh - High watermark(CQ fullness at which event
++ or interrupt should be asserted). These are the
++ CEV_WATERMARK encoded values.
++ EqObject - EQ Handle to assign to this CQ
++ ppCqObject - Internal CQ Handle returned.
++
++ Returns BE_SUCCESS if successfull, otherwise a useful error code is
++ returned.
++
++ IRQL < DISPATCH_LEVEL
++
++*/
++int be_cq_create(struct be_function_object *pfob,
++ struct ring_desc *rd, u32 length, bool solicited_eventable,
++ bool no_delay, u32 wm_thresh,
++ struct be_eq_object *eq_object, struct be_cq_object *cq_object)
++{
++ int status = BE_SUCCESS;
++ u32 num_entries_encoding;
++ u32 num_entries = length / sizeof(struct MCC_CQ_ENTRY_AMAP);
++ struct FWCMD_COMMON_CQ_CREATE *fwcmd = NULL;
++ struct MCC_WRB_AMAP *wrb = NULL;
++ u32 n;
++ unsigned long irql;
++
++ ASSERT(rd);
++ ASSERT(cq_object);
++ ASSERT(length % sizeof(struct MCC_CQ_ENTRY_AMAP) == 0);
++
++ switch (num_entries) {
++ case 256:
++ num_entries_encoding = CEV_CQ_CNT_256;
++ break;
++ case 512:
++ num_entries_encoding = CEV_CQ_CNT_512;
++ break;
++ case 1024:
++ num_entries_encoding = CEV_CQ_CNT_1024;
++ break;
++ default:
++ ASSERT(0);
++ return BE_STATUS_INVALID_PARAMETER;
++ }
++
++ /*
++ * All cq entries all the same size. Use iSCSI version
++ * as a test for the proper rd length.
++ */
++ memset(cq_object, 0, sizeof(*cq_object));
++
++ atomic_set(&cq_object->ref_count, 0);
++ cq_object->parent_function = pfob;
++ cq_object->eq_object = eq_object;
++ cq_object->num_entries = num_entries;
++ /* save for MCC cq processing */
++ cq_object->va = rd->va;
++
++ /* map into UT. */
++ length = num_entries * sizeof(struct MCC_CQ_ENTRY_AMAP);
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++ if (!wrb) {
++ ASSERT(wrb);
++ TRACE(DL_ERR, "No free MCC WRBs in create EQ.");
++ status = BE_STATUS_NO_MCC_WRB;
++ goto Error;
++ }
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_CQ_CREATE);
++
++ fwcmd->params.request.num_pages = PAGES_SPANNED(OFFSET_IN_PAGE(rd->va),
++ length);
++
++ AMAP_SET_BITS_PTR(CQ_CONTEXT, valid, &fwcmd->params.request.context, 1);
++ n = pfob->pci_function_number;
++ AMAP_SET_BITS_PTR(CQ_CONTEXT, Func, &fwcmd->params.request.context, n);
++
++ n = (eq_object != NULL);
++ AMAP_SET_BITS_PTR(CQ_CONTEXT, Eventable,
++ &fwcmd->params.request.context, n);
++ AMAP_SET_BITS_PTR(CQ_CONTEXT, Armed, &fwcmd->params.request.context, 1);
++
++ n = eq_object ? eq_object->eq_id : 0;
++ AMAP_SET_BITS_PTR(CQ_CONTEXT, EQID, &fwcmd->params.request.context, n);
++ AMAP_SET_BITS_PTR(CQ_CONTEXT, Count,
++ &fwcmd->params.request.context, num_entries_encoding);
++
++ n = 0; /* Protection Domain is always 0 in Linux driver */
++ AMAP_SET_BITS_PTR(CQ_CONTEXT, PD, &fwcmd->params.request.context, n);
++ AMAP_SET_BITS_PTR(CQ_CONTEXT, NoDelay,
++ &fwcmd->params.request.context, no_delay);
++ AMAP_SET_BITS_PTR(CQ_CONTEXT, SolEvent,
++ &fwcmd->params.request.context, solicited_eventable);
++
++ n = (wm_thresh != 0xFFFFFFFF);
++ AMAP_SET_BITS_PTR(CQ_CONTEXT, WME, &fwcmd->params.request.context, n);
++
++ n = (n ? wm_thresh : 0);
++ AMAP_SET_BITS_PTR(CQ_CONTEXT, Watermark,
++ &fwcmd->params.request.context, n);
++ /* Create a page list for the FWCMD. */
++ be_rd_to_pa_list(rd, fwcmd->params.request.pages,
++ ARRAY_SIZE(fwcmd->params.request.pages));
++
++ /* Post the f/w command */
++ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
++ NULL, NULL, fwcmd, NULL);
++ if (status != BE_SUCCESS) {
++ TRACE(DL_ERR, "MCC to create CQ failed.");
++ goto Error;
++ }
++ /* Remember the CQ id. */
++ cq_object->cq_id = fwcmd->params.response.cq_id;
++
++ /* insert this cq into eq_object reference */
++ if (eq_object) {
++ atomic_inc(&eq_object->ref_count);
++ list_add_tail(&cq_object->cqlist_for_eq,
++ &eq_object->cq_list_head);
++ }
++
++Error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
++/*
++
++ Deferences the given object. Once the object's reference count drops to
++ zero, the object is destroyed and all resources that are held by this object
++ are released. The on-chip context is also destroyed along with the queue
++ ID, and any mappings made into the UT.
++
++ cq_object - CQ handle returned from cq_object_create.
++
++ returns the current reference count on the object
++
++ IRQL: IRQL < DISPATCH_LEVEL
++*/
++int be_cq_destroy(struct be_cq_object *cq_object)
++{
++ int status = 0;
++
++ /* Nothing should reference this CQ at this point. */
++ ASSERT(atomic_read(&cq_object->ref_count) == 0);
++
++ /* Send fwcmd to destroy the CQ. */
++ status = be_function_ring_destroy(cq_object->parent_function,
++ cq_object->cq_id, FWCMD_RING_TYPE_CQ,
++ NULL, NULL, NULL, NULL);
++ ASSERT(status == 0);
++
++ /* Remove reference if this is an eventable CQ. */
++ if (cq_object->eq_object) {
++ atomic_dec(&cq_object->eq_object->ref_count);
++ list_del(&cq_object->cqlist_for_eq);
++ }
++ return BE_SUCCESS;
++}
++
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/descriptors.h linux-2.6.29-rc3.owrt/drivers/staging/benet/descriptors.h
+--- linux-2.6.29.owrt/drivers/staging/benet/descriptors.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/descriptors.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,71 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * Autogenerated by srcgen version: 0127
++ */
++#ifndef __descriptors_amap_h__
++#define __descriptors_amap_h__
++
++/*
++ * --- IPC_NODE_ID_ENUM ---
++ * IPC processor id values
++ */
++#define TPOST_NODE_ID (0) /* TPOST ID */
++#define TPRE_NODE_ID (1) /* TPRE ID */
++#define TXULP0_NODE_ID (2) /* TXULP0 ID */
++#define TXULP1_NODE_ID (3) /* TXULP1 ID */
++#define TXULP2_NODE_ID (4) /* TXULP2 ID */
++#define RXULP0_NODE_ID (5) /* RXULP0 ID */
++#define RXULP1_NODE_ID (6) /* RXULP1 ID */
++#define RXULP2_NODE_ID (7) /* RXULP2 ID */
++#define MPU_NODE_ID (15) /* MPU ID */
++
++/*
++ * --- MAC_ID_ENUM ---
++ * Meaning of the mac_id field in rxpp_eth_d
++ */
++#define PORT0_HOST_MAC0 (0) /* PD 0, Port 0, host networking, MAC 0. */
++#define PORT0_HOST_MAC1 (1) /* PD 0, Port 0, host networking, MAC 1. */
++#define PORT0_STORAGE_MAC0 (2) /* PD 0, Port 0, host storage, MAC 0. */
++#define PORT0_STORAGE_MAC1 (3) /* PD 0, Port 0, host storage, MAC 1. */
++#define PORT1_HOST_MAC0 (4) /* PD 0, Port 1 host networking, MAC 0. */
++#define PORT1_HOST_MAC1 (5) /* PD 0, Port 1 host networking, MAC 1. */
++#define PORT1_STORAGE_MAC0 (6) /* PD 0, Port 1 host storage, MAC 0. */
++#define PORT1_STORAGE_MAC1 (7) /* PD 0, Port 1 host storage, MAC 1. */
++#define FIRST_VM_MAC (8) /* PD 1 MAC. Protection domains have IDs */
++ /* from 0x8-0x26, one per PD. */
++#define LAST_VM_MAC (38) /* PD 31 MAC. */
++#define MGMT_MAC (39) /* Management port MAC. */
++#define MARBLE_MAC0 (59) /* Used for flushing function 0 receive */
++ /*
++ * queues before re-using a torn-down
++ * receive ring. the DA =
++ * 00-00-00-00-00-00, and the MSB of the
++ * SA = 00
++ */
++#define MARBLE_MAC1 (60) /* Used for flushing function 1 receive */
++ /*
++ * queues before re-using a torn-down
++ * receive ring. the DA =
++ * 00-00-00-00-00-00, and the MSB of the
++ * SA != 00
++ */
++#define NULL_MAC (61) /* Promiscuous mode, indicates no match */
++#define MCAST_MAC (62) /* Multicast match. */
++#define BCAST_MATCH (63) /* Broadcast match. */
++
++#endif /* __descriptors_amap_h__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/doorbells.h linux-2.6.29-rc3.owrt/drivers/staging/benet/doorbells.h
+--- linux-2.6.29.owrt/drivers/staging/benet/doorbells.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/doorbells.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,179 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * Autogenerated by srcgen version: 0127
++ */
++#ifndef __doorbells_amap_h__
++#define __doorbells_amap_h__
++
++/* The TX/RDMA send queue doorbell. */
++struct BE_SQ_DB_AMAP {
++ u8 cid[11]; /* DWORD 0 */
++ u8 rsvd0[5]; /* DWORD 0 */
++ u8 numPosted[14]; /* DWORD 0 */
++ u8 rsvd1[2]; /* DWORD 0 */
++} __packed;
++struct SQ_DB_AMAP {
++ u32 dw[1];
++};
++
++/* The receive queue doorbell. */
++struct BE_RQ_DB_AMAP {
++ u8 rq[10]; /* DWORD 0 */
++ u8 rsvd0[13]; /* DWORD 0 */
++ u8 Invalidate; /* DWORD 0 */
++ u8 numPosted[8]; /* DWORD 0 */
++} __packed;
++struct RQ_DB_AMAP {
++ u32 dw[1];
++};
++
++/*
++ * The CQ/EQ doorbell. Software MUST set reserved fields in this
++ * descriptor to zero, otherwise (CEV) hardware will not execute the
++ * doorbell (flagging a bad_db_qid error instead).
++ */
++struct BE_CQ_DB_AMAP {
++ u8 qid[10]; /* DWORD 0 */
++ u8 rsvd0[4]; /* DWORD 0 */
++ u8 rearm; /* DWORD 0 */
++ u8 event; /* DWORD 0 */
++ u8 num_popped[13]; /* DWORD 0 */
++ u8 rsvd1[3]; /* DWORD 0 */
++} __packed;
++struct CQ_DB_AMAP {
++ u32 dw[1];
++};
++
++struct BE_TPM_RQ_DB_AMAP {
++ u8 qid[10]; /* DWORD 0 */
++ u8 rsvd0[6]; /* DWORD 0 */
++ u8 numPosted[11]; /* DWORD 0 */
++ u8 mss_cnt[5]; /* DWORD 0 */
++} __packed;
++struct TPM_RQ_DB_AMAP {
++ u32 dw[1];
++};
++
++/*
++ * Post WRB Queue Doorbell Register used by the host Storage stack
++ * to notify the controller of a posted Work Request Block
++ */
++struct BE_WRB_POST_DB_AMAP {
++ u8 wrb_cid[10]; /* DWORD 0 */
++ u8 rsvd0[6]; /* DWORD 0 */
++ u8 wrb_index[8]; /* DWORD 0 */
++ u8 numberPosted[8]; /* DWORD 0 */
++} __packed;
++struct WRB_POST_DB_AMAP {
++ u32 dw[1];
++};
++
++/*
++ * Update Default PDU Queue Doorbell Register used to communicate
++ * to the controller that the driver has stopped processing the queue
++ * and where in the queue it stopped, this is
++ * a CQ Entry Type. Used by storage driver.
++ */
++struct BE_DEFAULT_PDU_DB_AMAP {
++ u8 qid[10]; /* DWORD 0 */
++ u8 rsvd0[4]; /* DWORD 0 */
++ u8 rearm; /* DWORD 0 */
++ u8 event; /* DWORD 0 */
++ u8 cqproc[14]; /* DWORD 0 */
++ u8 rsvd1[2]; /* DWORD 0 */
++} __packed;
++struct DEFAULT_PDU_DB_AMAP {
++ u32 dw[1];
++};
++
++/* Management Command and Controller default fragment ring */
++struct BE_MCC_DB_AMAP {
++ u8 rid[11]; /* DWORD 0 */
++ u8 rsvd0[5]; /* DWORD 0 */
++ u8 numPosted[14]; /* DWORD 0 */
++ u8 rsvd1[2]; /* DWORD 0 */
++} __packed;
++struct MCC_DB_AMAP {
++ u32 dw[1];
++};
++
++/*
++ * Used for bootstrapping the Host interface. This register is
++ * used for driver communication with the MPU when no MCC Rings exist.
++ * The software must write this register twice to post any MCC
++ * command. First, it writes the register with hi=1 and the upper bits of
++ * the physical address for the MCC_MAILBOX structure. Software must poll
++ * the ready bit until this is acknowledged. Then, sotware writes the
++ * register with hi=0 with the lower bits in the address. It must
++ * poll the ready bit until the MCC command is complete. Upon completion,
++ * the MCC_MAILBOX will contain a valid completion queue entry.
++ */
++struct BE_MPU_MAILBOX_DB_AMAP {
++ u8 ready; /* DWORD 0 */
++ u8 hi; /* DWORD 0 */
++ u8 address[30]; /* DWORD 0 */
++} __packed;
++struct MPU_MAILBOX_DB_AMAP {
++ u32 dw[1];
++};
++
++/*
++ * This is the protection domain doorbell register map. Note that
++ * while this map shows doorbells for all Blade Engine supported
++ * protocols, not all of these may be valid in a given function or
++ * protection domain. It is the responsibility of the application
++ * accessing the doorbells to know which are valid. Each doorbell
++ * occupies 32 bytes of space, but unless otherwise specified,
++ * only the first 4 bytes should be written. There are 32 instances
++ * of these doorbells for the host and 31 virtual machines respectively.
++ * The host and VMs will only map the doorbell pages belonging to its
++ * protection domain. It will not be able to touch the doorbells for
++ * another VM. The doorbells are the only registers directly accessible
++ * by a virtual machine. Similarly, there are 511 additional
++ * doorbells for RDMA protection domains. PD 0 for RDMA shares
++ * the same physical protection domain doorbell page as ETH/iSCSI.
++ *
++ */
++struct BE_PROTECTION_DOMAIN_DBMAP_AMAP {
++ u8 rsvd0[512]; /* DWORD 0 */
++ struct BE_SQ_DB_AMAP rdma_sq_db;
++ u8 rsvd1[7][32]; /* DWORD 17 */
++ struct BE_WRB_POST_DB_AMAP iscsi_wrb_post_db;
++ u8 rsvd2[7][32]; /* DWORD 25 */
++ struct BE_SQ_DB_AMAP etx_sq_db;
++ u8 rsvd3[7][32]; /* DWORD 33 */
++ struct BE_RQ_DB_AMAP rdma_rq_db;
++ u8 rsvd4[7][32]; /* DWORD 41 */
++ struct BE_DEFAULT_PDU_DB_AMAP iscsi_default_pdu_db;
++ u8 rsvd5[7][32]; /* DWORD 49 */
++ struct BE_TPM_RQ_DB_AMAP tpm_rq_db;
++ u8 rsvd6[7][32]; /* DWORD 57 */
++ struct BE_RQ_DB_AMAP erx_rq_db;
++ u8 rsvd7[7][32]; /* DWORD 65 */
++ struct BE_CQ_DB_AMAP cq_db;
++ u8 rsvd8[7][32]; /* DWORD 73 */
++ struct BE_MCC_DB_AMAP mpu_mcc_db;
++ u8 rsvd9[7][32]; /* DWORD 81 */
++ struct BE_MPU_MAILBOX_DB_AMAP mcc_bootstrap_db;
++ u8 rsvd10[935][32]; /* DWORD 89 */
++} __packed;
++struct PROTECTION_DOMAIN_DBMAP_AMAP {
++ u32 dw[1024];
++};
++
++#endif /* __doorbells_amap_h__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/ep.h linux-2.6.29-rc3.owrt/drivers/staging/benet/ep.h
+--- linux-2.6.29.owrt/drivers/staging/benet/ep.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/ep.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,66 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * Autogenerated by srcgen version: 0127
++ */
++#ifndef __ep_amap_h__
++#define __ep_amap_h__
++
++/* General Control and Status Register. */
++struct BE_EP_CONTROL_CSR_AMAP {
++ u8 m0_RxPbuf; /* DWORD 0 */
++ u8 m1_RxPbuf; /* DWORD 0 */
++ u8 m2_RxPbuf; /* DWORD 0 */
++ u8 ff_en; /* DWORD 0 */
++ u8 rsvd0[27]; /* DWORD 0 */
++ u8 CPU_reset; /* DWORD 0 */
++} __packed;
++struct EP_CONTROL_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* Semaphore Register. */
++struct BE_EP_SEMAPHORE_CSR_AMAP {
++ u8 value[32]; /* DWORD 0 */
++} __packed;
++struct EP_SEMAPHORE_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* Embedded Processor Specific Registers. */
++struct BE_EP_CSRMAP_AMAP {
++ struct BE_EP_CONTROL_CSR_AMAP ep_control;
++ u8 rsvd0[32]; /* DWORD 1 */
++ u8 rsvd1[32]; /* DWORD 2 */
++ u8 rsvd2[32]; /* DWORD 3 */
++ u8 rsvd3[32]; /* DWORD 4 */
++ u8 rsvd4[32]; /* DWORD 5 */
++ u8 rsvd5[8][128]; /* DWORD 6 */
++ u8 rsvd6[32]; /* DWORD 38 */
++ u8 rsvd7[32]; /* DWORD 39 */
++ u8 rsvd8[32]; /* DWORD 40 */
++ u8 rsvd9[32]; /* DWORD 41 */
++ u8 rsvd10[32]; /* DWORD 42 */
++ struct BE_EP_SEMAPHORE_CSR_AMAP ep_semaphore;
++ u8 rsvd11[32]; /* DWORD 44 */
++ u8 rsvd12[19][32]; /* DWORD 45 */
++} __packed;
++struct EP_CSRMAP_AMAP {
++ u32 dw[64];
++};
++
++#endif /* __ep_amap_h__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/eq.c linux-2.6.29-rc3.owrt/drivers/staging/benet/eq.c
+--- linux-2.6.29.owrt/drivers/staging/benet/eq.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/eq.c 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,299 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++#include "hwlib.h"
++#include "bestatus.h"
++/*
++ This routine creates an event queue based on the client completion
++ queue configuration information.
++
++ FunctionObject - Handle to a function object
++ EqBaseVa - Base VA for a the EQ ring
++ SizeEncoding - The encoded size for the EQ entries. This value is
++ either CEV_EQ_SIZE_4 or CEV_EQ_SIZE_16
++ NumEntries - CEV_CQ_CNT_* values.
++ Watermark - Enables watermark based coalescing. This parameter
++ must be of the type CEV_WMARK_* if watermarks
++ are enabled. If watermarks to to be disabled
++ this value should be-1.
++ TimerDelay - If a timer delay is enabled this value should be the
++ time of the delay in 8 microsecond units. If
++ delays are not used this parameter should be
++ set to -1.
++ ppEqObject - Internal EQ Handle returned.
++
++ Returns BE_SUCCESS if successfull,, otherwise a useful error code
++ is returned.
++
++ IRQL < DISPATCH_LEVEL
++*/
++int
++be_eq_create(struct be_function_object *pfob,
++ struct ring_desc *rd, u32 eqe_size, u32 num_entries,
++ u32 watermark, /* CEV_WMARK_* or -1 */
++ u32 timer_delay, /* in 8us units, or -1 */
++ struct be_eq_object *eq_object)
++{
++ int status = BE_SUCCESS;
++ u32 num_entries_encoding, eqe_size_encoding, length;
++ struct FWCMD_COMMON_EQ_CREATE *fwcmd = NULL;
++ struct MCC_WRB_AMAP *wrb = NULL;
++ u32 n;
++ unsigned long irql;
++
++ ASSERT(rd);
++ ASSERT(eq_object);
++
++ switch (num_entries) {
++ case 256:
++ num_entries_encoding = CEV_EQ_CNT_256;
++ break;
++ case 512:
++ num_entries_encoding = CEV_EQ_CNT_512;
++ break;
++ case 1024:
++ num_entries_encoding = CEV_EQ_CNT_1024;
++ break;
++ case 2048:
++ num_entries_encoding = CEV_EQ_CNT_2048;
++ break;
++ case 4096:
++ num_entries_encoding = CEV_EQ_CNT_4096;
++ break;
++ default:
++ ASSERT(0);
++ return BE_STATUS_INVALID_PARAMETER;
++ }
++
++ switch (eqe_size) {
++ case 4:
++ eqe_size_encoding = CEV_EQ_SIZE_4;
++ break;
++ case 16:
++ eqe_size_encoding = CEV_EQ_SIZE_16;
++ break;
++ default:
++ ASSERT(0);
++ return BE_STATUS_INVALID_PARAMETER;
++ }
++
++ if ((eqe_size == 4 && num_entries < 1024) ||
++ (eqe_size == 16 && num_entries == 4096)) {
++ TRACE(DL_ERR, "Bad EQ size. eqe_size:%d num_entries:%d",
++ eqe_size, num_entries);
++ ASSERT(0);
++ return BE_STATUS_INVALID_PARAMETER;
++ }
++
++ memset(eq_object, 0, sizeof(*eq_object));
++
++ atomic_set(&eq_object->ref_count, 0);
++ eq_object->parent_function = pfob;
++ eq_object->eq_id = 0xFFFFFFFF;
++
++ INIT_LIST_HEAD(&eq_object->cq_list_head);
++
++ length = num_entries * eqe_size;
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++ if (!wrb) {
++ ASSERT(wrb);
++ TRACE(DL_ERR, "No free MCC WRBs in create EQ.");
++ status = BE_STATUS_NO_MCC_WRB;
++ goto Error;
++ }
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_EQ_CREATE);
++
++ fwcmd->params.request.num_pages = PAGES_SPANNED(OFFSET_IN_PAGE(rd->va),
++ length);
++ n = pfob->pci_function_number;
++ AMAP_SET_BITS_PTR(EQ_CONTEXT, Func, &fwcmd->params.request.context, n);
++
++ AMAP_SET_BITS_PTR(EQ_CONTEXT, valid, &fwcmd->params.request.context, 1);
++
++ AMAP_SET_BITS_PTR(EQ_CONTEXT, Size,
++ &fwcmd->params.request.context, eqe_size_encoding);
++
++ n = 0; /* Protection Domain is always 0 in Linux driver */
++ AMAP_SET_BITS_PTR(EQ_CONTEXT, PD, &fwcmd->params.request.context, n);
++
++ /* Let the caller ARM the EQ with the doorbell. */
++ AMAP_SET_BITS_PTR(EQ_CONTEXT, Armed, &fwcmd->params.request.context, 0);
++
++ AMAP_SET_BITS_PTR(EQ_CONTEXT, Count, &fwcmd->params.request.context,
++ num_entries_encoding);
++
++ n = pfob->pci_function_number * 32;
++ AMAP_SET_BITS_PTR(EQ_CONTEXT, EventVect,
++ &fwcmd->params.request.context, n);
++ if (watermark != -1) {
++ AMAP_SET_BITS_PTR(EQ_CONTEXT, WME,
++ &fwcmd->params.request.context, 1);
++ AMAP_SET_BITS_PTR(EQ_CONTEXT, Watermark,
++ &fwcmd->params.request.context, watermark);
++ ASSERT(watermark <= CEV_WMARK_240);
++ } else
++ AMAP_SET_BITS_PTR(EQ_CONTEXT, WME,
++ &fwcmd->params.request.context, 0);
++ if (timer_delay != -1) {
++ AMAP_SET_BITS_PTR(EQ_CONTEXT, TMR,
++ &fwcmd->params.request.context, 1);
++
++ ASSERT(timer_delay <= 250); /* max value according to EAS */
++ timer_delay = min(timer_delay, (u32)250);
++
++ AMAP_SET_BITS_PTR(EQ_CONTEXT, Delay,
++ &fwcmd->params.request.context, timer_delay);
++ } else {
++ AMAP_SET_BITS_PTR(EQ_CONTEXT, TMR,
++ &fwcmd->params.request.context, 0);
++ }
++ /* Create a page list for the FWCMD. */
++ be_rd_to_pa_list(rd, fwcmd->params.request.pages,
++ ARRAY_SIZE(fwcmd->params.request.pages));
++
++ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
++ NULL, NULL, fwcmd, NULL);
++ if (status != BE_SUCCESS) {
++ TRACE(DL_ERR, "MCC to create EQ failed.");
++ goto Error;
++ }
++ /* Get the EQ id. The MPU allocates the IDs. */
++ eq_object->eq_id = fwcmd->params.response.eq_id;
++
++Error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
++/*
++ Deferences the given object. Once the object's reference count drops to
++ zero, the object is destroyed and all resources that are held by this
++ object are released. The on-chip context is also destroyed along with
++ the queue ID, and any mappings made into the UT.
++
++ eq_object - EQ handle returned from eq_object_create.
++
++ Returns BE_SUCCESS if successfull, otherwise a useful error code
++ is returned.
++
++ IRQL: IRQL < DISPATCH_LEVEL
++*/
++int be_eq_destroy(struct be_eq_object *eq_object)
++{
++ int status = 0;
++
++ ASSERT(atomic_read(&eq_object->ref_count) == 0);
++ /* no CQs should reference this EQ now */
++ ASSERT(list_empty(&eq_object->cq_list_head));
++
++ /* Send fwcmd to destroy the EQ. */
++ status = be_function_ring_destroy(eq_object->parent_function,
++ eq_object->eq_id, FWCMD_RING_TYPE_EQ,
++ NULL, NULL, NULL, NULL);
++ ASSERT(status == 0);
++
++ return BE_SUCCESS;
++}
++/*
++ *---------------------------------------------------------------------------
++ * Function: be_eq_modify_delay
++ * Changes the EQ delay for a group of EQs.
++ * num_eq - The number of EQs in the eq_array to adjust.
++ * This also is the number of delay values in
++ * the eq_delay_array.
++ * eq_array - Array of struct be_eq_object pointers to adjust.
++ * eq_delay_array - Array of "num_eq" timer delays in units
++ * of microseconds. The be_eq_query_delay_range
++ * fwcmd returns the resolution and range of
++ * legal EQ delays.
++ * cb -
++ * cb_context -
++ * q_ctxt - Optional. Pointer to a previously allocated
++ * struct. If the MCC WRB ring is full, this
++ * structure is used to queue the operation. It
++ * will be posted to the MCC ring when space
++ * becomes available. All queued commands will
++ * be posted to the ring in the order they are
++ * received. It is always valid to pass a pointer to
++ * a generic be_generic_q_cntxt. However,
++ * the specific context structs
++ * are generally smaller than the generic struct.
++ * return pend_status - BE_SUCCESS (0) on success.
++ * BE_PENDING (postive value) if the FWCMD
++ * completion is pending. Negative error code on failure.
++ *-------------------------------------------------------------------------
++ */
++int
++be_eq_modify_delay(struct be_function_object *pfob,
++ u32 num_eq, struct be_eq_object **eq_array,
++ u32 *eq_delay_array, mcc_wrb_cqe_callback cb,
++ void *cb_context, struct be_eq_modify_delay_q_ctxt *q_ctxt)
++{
++ struct FWCMD_COMMON_MODIFY_EQ_DELAY *fwcmd = NULL;
++ struct MCC_WRB_AMAP *wrb = NULL;
++ int status = 0;
++ struct be_generic_q_ctxt *gen_ctxt = NULL;
++ u32 i;
++ unsigned long irql;
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++ if (!wrb) {
++ if (q_ctxt && cb) {
++ wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header;
++ gen_ctxt = (struct be_generic_q_ctxt *) q_ctxt;
++ gen_ctxt->context.bytes = sizeof(*q_ctxt);
++ } else {
++ status = BE_STATUS_NO_MCC_WRB;
++ goto Error;
++ }
++ }
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_MODIFY_EQ_DELAY);
++
++ ASSERT(num_eq > 0);
++ ASSERT(num_eq <= ARRAY_SIZE(fwcmd->params.request.delay));
++ fwcmd->params.request.num_eq = num_eq;
++ for (i = 0; i < num_eq; i++) {
++ fwcmd->params.request.delay[i].eq_id = eq_array[i]->eq_id;
++ fwcmd->params.request.delay[i].delay_in_microseconds =
++ eq_delay_array[i];
++ }
++
++ /* Post the f/w command */
++ status = be_function_post_mcc_wrb(pfob, wrb, gen_ctxt,
++ cb, cb_context, NULL, NULL, fwcmd, NULL);
++
++Error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/eth.c linux-2.6.29-rc3.owrt/drivers/staging/benet/eth.c
+--- linux-2.6.29.owrt/drivers/staging/benet/eth.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/eth.c 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,1273 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++#include <linux/if_ether.h>
++#include "hwlib.h"
++#include "bestatus.h"
++
++/*
++ *---------------------------------------------------------
++ * Function: be_eth_sq_create_ex
++ * Creates an ethernet send ring - extended version with
++ * additional parameters.
++ * pfob -
++ * rd - ring address
++ * length_in_bytes -
++ * type - The type of ring to create.
++ * ulp - The requested ULP number for the ring.
++ * This should be zero based, i.e. 0,1,2. This must
++ * be valid NIC ULP based on the firmware config.
++ * All doorbells for this ring must be sent to
++ * this ULP. The first network ring allocated for
++ * each ULP are higher performance than subsequent rings.
++ * cq_object - cq object for completions
++ * ex_parameters - Additional parameters (that may increase in
++ * future revisions). These parameters are only used
++ * for certain ring types -- see
++ * struct be_eth_sq_parameters for details.
++ * eth_sq -
++ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
++ *---------------------------------------------------------
++ */
++int
++be_eth_sq_create_ex(struct be_function_object *pfob, struct ring_desc *rd,
++ u32 length, u32 type, u32 ulp, struct be_cq_object *cq_object,
++ struct be_eth_sq_parameters *ex_parameters,
++ struct be_ethsq_object *eth_sq)
++{
++ struct FWCMD_COMMON_ETH_TX_CREATE *fwcmd = NULL;
++ struct MCC_WRB_AMAP *wrb = NULL;
++ int status = 0;
++ u32 n;
++ unsigned long irql;
++
++ ASSERT(rd);
++ ASSERT(eth_sq);
++ ASSERT(ex_parameters);
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ memset(eth_sq, 0, sizeof(*eth_sq));
++
++ eth_sq->parent_function = pfob;
++ eth_sq->bid = 0xFFFFFFFF;
++ eth_sq->cq_object = cq_object;
++
++ /* Translate hwlib interface to arm interface. */
++ switch (type) {
++ case BE_ETH_TX_RING_TYPE_FORWARDING:
++ type = ETH_TX_RING_TYPE_FORWARDING;
++ break;
++ case BE_ETH_TX_RING_TYPE_STANDARD:
++ type = ETH_TX_RING_TYPE_STANDARD;
++ break;
++ case BE_ETH_TX_RING_TYPE_BOUND:
++ ASSERT(ex_parameters->port < 2);
++ type = ETH_TX_RING_TYPE_BOUND;
++ break;
++ default:
++ TRACE(DL_ERR, "Invalid eth tx ring type:%d", type);
++ return BE_NOT_OK;
++ break;
++ }
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++ if (!wrb) {
++ ASSERT(wrb);
++ TRACE(DL_ERR, "No free MCC WRBs in create EQ.");
++ status = BE_STATUS_NO_MCC_WRB;
++ goto Error;
++ }
++ /* NIC must be supported by the current config. */
++ ASSERT(pfob->fw_config.nic_ulp_mask);
++
++ /*
++ * The ulp parameter must select a valid NIC ULP
++ * for the current config.
++ */
++ ASSERT((1 << ulp) & pfob->fw_config.nic_ulp_mask);
++
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_ETH_TX_CREATE);
++ fwcmd->header.request.port_number = ex_parameters->port;
++
++ AMAP_SET_BITS_PTR(ETX_CONTEXT, pd_id,
++ &fwcmd->params.request.context, 0);
++
++ n = be_ring_length_to_encoding(length, sizeof(struct ETH_WRB_AMAP));
++ AMAP_SET_BITS_PTR(ETX_CONTEXT, tx_ring_size,
++ &fwcmd->params.request.context, n);
++
++ AMAP_SET_BITS_PTR(ETX_CONTEXT, cq_id_send,
++ &fwcmd->params.request.context, cq_object->cq_id);
++
++ n = pfob->pci_function_number;
++ AMAP_SET_BITS_PTR(ETX_CONTEXT, func, &fwcmd->params.request.context, n);
++
++ fwcmd->params.request.type = type;
++ fwcmd->params.request.ulp_num = (1 << ulp);
++ fwcmd->params.request.num_pages = DIV_ROUND_UP(length, PAGE_SIZE);
++ ASSERT(PAGES_SPANNED(rd->va, rd->length) >=
++ fwcmd->params.request.num_pages);
++
++ /* Create a page list for the FWCMD. */
++ be_rd_to_pa_list(rd, fwcmd->params.request.pages,
++ ARRAY_SIZE(fwcmd->params.request.pages));
++
++ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
++ NULL, NULL, fwcmd, NULL);
++ if (status != BE_SUCCESS) {
++ TRACE(DL_ERR, "MCC to create etx queue failed.");
++ goto Error;
++ }
++ /* save the butler ID */
++ eth_sq->bid = fwcmd->params.response.cid;
++
++ /* add a reference to the corresponding CQ */
++ atomic_inc(&cq_object->ref_count);
++
++Error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
++
++/*
++ This routine destroys an ethernet send queue
++
++ EthSq - EthSq Handle returned from EthSqCreate
++
++ This function always return BE_SUCCESS.
++
++ This function frees memory allocated by EthSqCreate for the EthSq Object.
++
++*/
++int be_eth_sq_destroy(struct be_ethsq_object *eth_sq)
++{
++ int status = 0;
++
++ /* Send fwcmd to destroy the queue. */
++ status = be_function_ring_destroy(eth_sq->parent_function, eth_sq->bid,
++ FWCMD_RING_TYPE_ETH_TX, NULL, NULL, NULL, NULL);
++ ASSERT(status == 0);
++
++ /* Derefence any associated CQs. */
++ atomic_dec(&eth_sq->cq_object->ref_count);
++ return status;
++}
++/*
++ This routine attempts to set the transmit flow control parameters.
++
++ FunctionObject - Handle to a function object
++
++ txfc_enable - transmit flow control enable - true for
++ enable, false for disable
++
++ rxfc_enable - receive flow control enable - true for
++ enable, false for disable
++
++ Returns BE_SUCCESS if successfull, otherwise a useful int error
++ code is returned.
++
++ IRQL: < DISPATCH_LEVEL
++
++ This function always fails in non-privileged machine context.
++*/
++int
++be_eth_set_flow_control(struct be_function_object *pfob,
++ bool txfc_enable, bool rxfc_enable)
++{
++ struct FWCMD_COMMON_SET_FLOW_CONTROL *fwcmd = NULL;
++ struct MCC_WRB_AMAP *wrb = NULL;
++ int status = 0;
++ unsigned long irql;
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++ if (!wrb) {
++ TRACE(DL_ERR, "MCC wrb peek failed.");
++ status = BE_STATUS_NO_MCC_WRB;
++ goto error;
++ }
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_SET_FLOW_CONTROL);
++
++ fwcmd->params.request.rx_flow_control = rxfc_enable;
++ fwcmd->params.request.tx_flow_control = txfc_enable;
++
++ /* Post the f/w command */
++ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
++ NULL, NULL, fwcmd, NULL);
++
++ if (status != 0) {
++ TRACE(DL_ERR, "set flow control fwcmd failed.");
++ goto error;
++ }
++
++error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
++/*
++ This routine attempts to get the transmit flow control parameters.
++
++ pfob - Handle to a function object
++
++ txfc_enable - transmit flow control enable - true for
++ enable, false for disable
++
++ rxfc_enable - receive flow control enable - true for enable,
++ false for disable
++
++ Returns BE_SUCCESS if successfull, otherwise a useful int error code
++ is returned.
++
++ IRQL: < DISPATCH_LEVEL
++
++ This function always fails in non-privileged machine context.
++*/
++int
++be_eth_get_flow_control(struct be_function_object *pfob,
++ bool *txfc_enable, bool *rxfc_enable)
++{
++ struct FWCMD_COMMON_GET_FLOW_CONTROL *fwcmd = NULL;
++ struct MCC_WRB_AMAP *wrb = NULL;
++ int status = 0;
++ unsigned long irql;
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++ if (!wrb) {
++ TRACE(DL_ERR, "MCC wrb peek failed.");
++ status = BE_STATUS_NO_MCC_WRB;
++ goto error;
++ }
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_GET_FLOW_CONTROL);
++
++ /* Post the f/w command */
++ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
++ NULL, NULL, fwcmd, NULL);
++
++ if (status != 0) {
++ TRACE(DL_ERR, "get flow control fwcmd failed.");
++ goto error;
++ }
++
++ *txfc_enable = fwcmd->params.response.tx_flow_control;
++ *rxfc_enable = fwcmd->params.response.rx_flow_control;
++
++error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
++/*
++ *---------------------------------------------------------
++ * Function: be_eth_set_qos
++ * This function sets the ethernet transmit Quality of Service (QoS)
++ * characteristics of BladeEngine for the domain. All ethernet
++ * transmit rings of the domain will evenly share the bandwidth.
++ * The exeception to sharing is the host primary (super) ethernet
++ * transmit ring as well as the host ethernet forwarding ring
++ * for missed offload data.
++ * pfob -
++ * max_bps - the maximum bits per second in units of
++ * 10 Mbps (valid 0-100)
++ * max_pps - the maximum packets per second in units
++ * of 1 Kpps (0 indicates no limit)
++ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
++ *---------------------------------------------------------
++ */
++int
++be_eth_set_qos(struct be_function_object *pfob, u32 max_bps, u32 max_pps)
++{
++ struct FWCMD_COMMON_SET_QOS *fwcmd = NULL;
++ struct MCC_WRB_AMAP *wrb = NULL;
++ int status = 0;
++ unsigned long irql;
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++ if (!wrb) {
++ TRACE(DL_ERR, "MCC wrb peek failed.");
++ status = BE_STATUS_NO_MCC_WRB;
++ goto error;
++ }
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_SET_QOS);
++
++ /* Set fields in fwcmd */
++ fwcmd->params.request.max_bits_per_second_NIC = max_bps;
++ fwcmd->params.request.max_packets_per_second_NIC = max_pps;
++ fwcmd->params.request.valid_flags = QOS_BITS_NIC | QOS_PKTS_NIC;
++
++ /* Post the f/w command */
++ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
++ NULL, NULL, fwcmd, NULL);
++
++ if (status != 0)
++ TRACE(DL_ERR, "network set qos fwcmd failed.");
++
++error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
++/*
++ *---------------------------------------------------------
++ * Function: be_eth_get_qos
++ * This function retrieves the ethernet transmit Quality of Service (QoS)
++ * characteristics for the domain.
++ * max_bps - the maximum bits per second in units of
++ * 10 Mbps (valid 0-100)
++ * max_pps - the maximum packets per second in units of
++ * 1 Kpps (0 indicates no limit)
++ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
++ *---------------------------------------------------------
++ */
++int
++be_eth_get_qos(struct be_function_object *pfob, u32 *max_bps, u32 *max_pps)
++{
++ struct FWCMD_COMMON_GET_QOS *fwcmd = NULL;
++ struct MCC_WRB_AMAP *wrb = NULL;
++ int status = 0;
++ unsigned long irql;
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++ if (!wrb) {
++ TRACE(DL_ERR, "MCC wrb peek failed.");
++ status = BE_STATUS_NO_MCC_WRB;
++ goto error;
++ }
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_GET_QOS);
++
++ /* Post the f/w command */
++ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
++ NULL, NULL, fwcmd, NULL);
++
++ if (status != 0) {
++ TRACE(DL_ERR, "network get qos fwcmd failed.");
++ goto error;
++ }
++
++ *max_bps = fwcmd->params.response.max_bits_per_second_NIC;
++ *max_pps = fwcmd->params.response.max_packets_per_second_NIC;
++
++error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
++/*
++ *---------------------------------------------------------
++ * Function: be_eth_set_frame_size
++ * This function sets the ethernet maximum frame size. The previous
++ * values are returned.
++ * pfob -
++ * tx_frame_size - maximum transmit frame size in bytes
++ * rx_frame_size - maximum receive frame size in bytes
++ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
++ *---------------------------------------------------------
++ */
++int
++be_eth_set_frame_size(struct be_function_object *pfob,
++ u32 *tx_frame_size, u32 *rx_frame_size)
++{
++ struct FWCMD_COMMON_SET_FRAME_SIZE *fwcmd = NULL;
++ struct MCC_WRB_AMAP *wrb = NULL;
++ int status = 0;
++ unsigned long irql;
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++ if (!wrb) {
++ TRACE(DL_ERR, "MCC wrb peek failed.");
++ status = BE_STATUS_NO_MCC_WRB;
++ goto error;
++ }
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_SET_FRAME_SIZE);
++ fwcmd->params.request.max_tx_frame_size = *tx_frame_size;
++ fwcmd->params.request.max_rx_frame_size = *rx_frame_size;
++
++ /* Post the f/w command */
++ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
++ NULL, NULL, fwcmd, NULL);
++
++ if (status != 0) {
++ TRACE(DL_ERR, "network set frame size fwcmd failed.");
++ goto error;
++ }
++
++ *tx_frame_size = fwcmd->params.response.chip_max_tx_frame_size;
++ *rx_frame_size = fwcmd->params.response.chip_max_rx_frame_size;
++
++error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
++
++/*
++ This routine creates a Ethernet receive ring.
++
++ pfob - handle to a function object
++ rq_base_va - base VA for the default receive ring. this must be
++ exactly 8K in length and continguous physical memory.
++ cq_object - handle to a previously created CQ to be associated
++ with the RQ.
++ pp_eth_rq - pointer to an opqaue handle where an eth
++ receive object is returned.
++ Returns BE_SUCCESS if successfull, , otherwise a useful
++ int error code is returned.
++
++ IRQL: < DISPATCH_LEVEL
++ this function allocates a struct be_ethrq_object *object.
++ there must be no more than 1 of these per function object, unless the
++ function object supports RSS (is networking and on the host).
++ the rq_base_va must point to a buffer of exactly 8K.
++ the erx::host_cqid (or host_stor_cqid) register and erx::ring_page registers
++ will be updated as appropriate on return
++*/
++int
++be_eth_rq_create(struct be_function_object *pfob,
++ struct ring_desc *rd, struct be_cq_object *cq_object,
++ struct be_cq_object *bcmc_cq_object,
++ struct be_ethrq_object *eth_rq)
++{
++ int status = 0;
++ struct MCC_WRB_AMAP *wrb = NULL;
++ struct FWCMD_COMMON_ETH_RX_CREATE *fwcmd = NULL;
++ unsigned long irql;
++
++ /* MPU will set the */
++ ASSERT(rd);
++ ASSERT(eth_rq);
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ eth_rq->parent_function = pfob;
++ eth_rq->cq_object = cq_object;
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++ if (!wrb) {
++ TRACE(DL_ERR, "MCC wrb peek failed.");
++ status = BE_STATUS_NO_MCC_WRB;
++ goto Error;
++ }
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_ETH_RX_CREATE);
++
++ fwcmd->params.request.num_pages = 2; /* required length */
++ fwcmd->params.request.cq_id = cq_object->cq_id;
++
++ if (bcmc_cq_object)
++ fwcmd->params.request.bcmc_cq_id = bcmc_cq_object->cq_id;
++ else
++ fwcmd->params.request.bcmc_cq_id = 0xFFFF;
++
++ /* Create a page list for the FWCMD. */
++ be_rd_to_pa_list(rd, fwcmd->params.request.pages,
++ ARRAY_SIZE(fwcmd->params.request.pages));
++
++ /* Post the f/w command */
++ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
++ NULL, NULL, fwcmd, NULL);
++ if (status != BE_SUCCESS) {
++ TRACE(DL_ERR, "fwcmd to map eth rxq frags failed.");
++ goto Error;
++ }
++ /* Save the ring ID for cleanup. */
++ eth_rq->rid = fwcmd->params.response.id;
++
++ atomic_inc(&cq_object->ref_count);
++
++Error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
++/*
++ This routine destroys an Ethernet receive queue
++
++ eth_rq - ethernet receive queue handle returned from eth_rq_create
++
++ Returns BE_SUCCESS on success and an appropriate int on failure.
++
++ This function frees resourcs allocated by EthRqCreate.
++ The erx::host_cqid (or host_stor_cqid) register and erx::ring_page
++ registers will be updated as appropriate on return
++ IRQL: < DISPATCH_LEVEL
++*/
++
++static void be_eth_rq_destroy_internal_cb(void *context, int status,
++ struct MCC_WRB_AMAP *wrb)
++{
++ struct be_ethrq_object *eth_rq = (struct be_ethrq_object *) context;
++
++ if (status != BE_SUCCESS) {
++ TRACE(DL_ERR, "Destroy eth rq failed in internal callback.\n");
++ } else {
++ /* Dereference any CQs associated with this queue. */
++ atomic_dec(&eth_rq->cq_object->ref_count);
++ }
++
++ return;
++}
++
++int be_eth_rq_destroy(struct be_ethrq_object *eth_rq)
++{
++ int status = BE_SUCCESS;
++
++ /* Send fwcmd to destroy the RQ. */
++ status = be_function_ring_destroy(eth_rq->parent_function,
++ eth_rq->rid, FWCMD_RING_TYPE_ETH_RX, NULL, NULL,
++ be_eth_rq_destroy_internal_cb, eth_rq);
++
++ return status;
++}
++
++/*
++ *---------------------------------------------------------------------------
++ * Function: be_eth_rq_destroy_options
++ * Destroys an ethernet receive ring with finer granularity options
++ * than the standard be_eth_rq_destroy() API function.
++ * eth_rq -
++ * flush - Set to 1 to flush the ring, set to 0 to bypass the flush
++ * cb - Callback function on completion
++ * cb_context - Callback context
++ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
++ *----------------------------------------------------------------------------
++ */
++int
++be_eth_rq_destroy_options(struct be_ethrq_object *eth_rq, bool flush,
++ mcc_wrb_cqe_callback cb, void *cb_context)
++{
++ struct FWCMD_COMMON_RING_DESTROY *fwcmd = NULL;
++ struct MCC_WRB_AMAP *wrb = NULL;
++ int status = BE_SUCCESS;
++ struct be_function_object *pfob = NULL;
++ unsigned long irql;
++
++ pfob = eth_rq->parent_function;
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ TRACE(DL_INFO, "Destroy eth_rq ring id:%d, flush:%d", eth_rq->rid,
++ flush);
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++ if (!wrb) {
++ ASSERT(wrb);
++ TRACE(DL_ERR, "No free MCC WRBs in destroy eth_rq ring.");
++ status = BE_STATUS_NO_MCC_WRB;
++ goto Error;
++ }
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_RING_DESTROY);
++
++ fwcmd->params.request.id = eth_rq->rid;
++ fwcmd->params.request.ring_type = FWCMD_RING_TYPE_ETH_RX;
++ fwcmd->params.request.bypass_flush = ((0 == flush) ? 1 : 0);
++
++ /* Post the f/w command */
++ status = be_function_post_mcc_wrb(pfob, wrb, NULL, cb, cb_context,
++ be_eth_rq_destroy_internal_cb, eth_rq, fwcmd, NULL);
++
++ if (status != BE_SUCCESS && status != BE_PENDING) {
++ TRACE(DL_ERR, "eth_rq ring destroy failed. id:%d, flush:%d",
++ eth_rq->rid, flush);
++ goto Error;
++ }
++
++Error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
++/*
++ This routine queries the frag size for erx.
++
++ pfob - handle to a function object
++
++ frag_size_bytes - erx frag size in bytes that is/was set.
++
++ Returns BE_SUCCESS if successfull, otherwise a useful int error
++ code is returned.
++
++ IRQL: < DISPATCH_LEVEL
++
++*/
++int
++be_eth_rq_get_frag_size(struct be_function_object *pfob, u32 *frag_size_bytes)
++{
++ struct FWCMD_ETH_GET_RX_FRAG_SIZE *fwcmd = NULL;
++ struct MCC_WRB_AMAP *wrb = NULL;
++ int status = 0;
++ unsigned long irql;
++
++ ASSERT(frag_size_bytes);
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++ if (!wrb) {
++ TRACE(DL_ERR, "MCC wrb peek failed.");
++ return BE_STATUS_NO_MCC_WRB;
++ }
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, ETH_GET_RX_FRAG_SIZE);
++
++ /* Post the f/w command */
++ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
++ NULL, NULL, fwcmd, NULL);
++
++ if (status != 0) {
++ TRACE(DL_ERR, "get frag size fwcmd failed.");
++ goto error;
++ }
++
++ *frag_size_bytes = 1 << fwcmd->params.response.actual_fragsize_log2;
++
++error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
++/*
++ This routine attempts to set the frag size for erx. If the frag size is
++ already set, the attempt fails and the current frag size is returned.
++
++ pfob - Handle to a function object
++
++ frag_size - Erx frag size in bytes that is/was set.
++
++ current_frag_size_bytes - Pointer to location where currrent frag
++ is to be rturned
++
++ Returns BE_SUCCESS if successfull, otherwise a useful int error
++ code is returned.
++
++ IRQL: < DISPATCH_LEVEL
++
++ This function always fails in non-privileged machine context.
++*/
++int
++be_eth_rq_set_frag_size(struct be_function_object *pfob,
++ u32 frag_size, u32 *frag_size_bytes)
++{
++ struct FWCMD_ETH_SET_RX_FRAG_SIZE *fwcmd = NULL;
++ struct MCC_WRB_AMAP *wrb = NULL;
++ int status = 0;
++ unsigned long irql;
++
++ ASSERT(frag_size_bytes);
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++ if (!wrb) {
++ TRACE(DL_ERR, "MCC wrb peek failed.");
++ status = BE_STATUS_NO_MCC_WRB;
++ goto error;
++ }
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, ETH_SET_RX_FRAG_SIZE);
++
++ ASSERT(frag_size >= 128 && frag_size <= 16 * 1024);
++
++ /* This is the log2 of the fragsize. This is not the exact
++ * ERX encoding. */
++ fwcmd->params.request.new_fragsize_log2 = __ilog2_u32(frag_size);
++
++ /* Post the f/w command */
++ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
++ NULL, NULL, fwcmd, NULL);
++
++ if (status != 0) {
++ TRACE(DL_ERR, "set frag size fwcmd failed.");
++ goto error;
++ }
++
++ *frag_size_bytes = 1 << fwcmd->params.response.actual_fragsize_log2;
++error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
++
++/*
++ This routine gets or sets a mac address for a domain
++ given the port and mac.
++
++ FunctionObject - Function object handle.
++ port1 - Set to TRUE if this function will set/get the Port 1
++ address. Only the host may set this to TRUE.
++ mac1 - Set to TRUE if this function will set/get the
++ MAC 1 address. Only the host may set this to TRUE.
++ write - Set to TRUE if this function should write the mac address.
++ mac_address - Buffer of the mac address to read or write.
++
++ Returns BE_SUCCESS if successfull, otherwise a useful int is returned.
++
++ IRQL: < DISPATCH_LEVEL
++*/
++int be_rxf_mac_address_read_write(struct be_function_object *pfob,
++ bool port1, /* VM must always set to false */
++ bool mac1, /* VM must always set to false */
++ bool mgmt, bool write,
++ bool permanent, u8 *mac_address,
++ mcc_wrb_cqe_callback cb, /* optional */
++ void *cb_context) /* optional */
++{
++ int status = BE_SUCCESS;
++ union {
++ struct FWCMD_COMMON_NTWK_MAC_QUERY *query;
++ struct FWCMD_COMMON_NTWK_MAC_SET *set;
++ } fwcmd = {NULL};
++ struct MCC_WRB_AMAP *wrb = NULL;
++ u32 type = 0;
++ unsigned long irql;
++ struct be_mcc_wrb_response_copy rc;
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ ASSERT(mac_address);
++
++ ASSERT(port1 == false);
++ ASSERT(mac1 == false);
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++ if (!wrb) {
++ TRACE(DL_ERR, "MCC wrb peek failed.");
++ status = BE_STATUS_NO_MCC_WRB;
++ goto Error;
++ }
++
++ if (mgmt) {
++ type = MAC_ADDRESS_TYPE_MANAGEMENT;
++ } else {
++ if (pfob->type == BE_FUNCTION_TYPE_NETWORK)
++ type = MAC_ADDRESS_TYPE_NETWORK;
++ else
++ type = MAC_ADDRESS_TYPE_STORAGE;
++ }
++
++ if (write) {
++ /* Prepares an embedded fwcmd, including
++ * request/response sizes.
++ */
++ fwcmd.set = BE_PREPARE_EMBEDDED_FWCMD(pfob,
++ wrb, COMMON_NTWK_MAC_SET);
++
++ fwcmd.set->params.request.invalidate = 0;
++ fwcmd.set->params.request.mac1 = (mac1 ? 1 : 0);
++ fwcmd.set->params.request.port = (port1 ? 1 : 0);
++ fwcmd.set->params.request.type = type;
++
++ /* Copy the mac address to set. */
++ fwcmd.set->params.request.mac.SizeOfStructure =
++ sizeof(fwcmd.set->params.request.mac);
++ memcpy(fwcmd.set->params.request.mac.MACAddress,
++ mac_address, ETH_ALEN);
++
++ /* Post the f/w command */
++ status = be_function_post_mcc_wrb(pfob, wrb, NULL,
++ cb, cb_context, NULL, NULL, fwcmd.set, NULL);
++
++ } else {
++
++ /*
++ * Prepares an embedded fwcmd, including
++ * request/response sizes.
++ */
++ fwcmd.query = BE_PREPARE_EMBEDDED_FWCMD(pfob,
++ wrb, COMMON_NTWK_MAC_QUERY);
++
++ fwcmd.query->params.request.mac1 = (mac1 ? 1 : 0);
++ fwcmd.query->params.request.port = (port1 ? 1 : 0);
++ fwcmd.query->params.request.type = type;
++ fwcmd.query->params.request.permanent = permanent;
++
++ rc.length = FIELD_SIZEOF(struct FWCMD_COMMON_NTWK_MAC_QUERY,
++ params.response.mac.MACAddress);
++ rc.fwcmd_offset = offsetof(struct FWCMD_COMMON_NTWK_MAC_QUERY,
++ params.response.mac.MACAddress);
++ rc.va = mac_address;
++ /* Post the f/w command (with a copy for the response) */
++ status = be_function_post_mcc_wrb(pfob, wrb, NULL, cb,
++ cb_context, NULL, NULL, fwcmd.query, &rc);
++ }
++
++ if (status < 0) {
++ TRACE(DL_ERR, "mac set/query failed.");
++ goto Error;
++ }
++
++Error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
++/*
++ This routine writes data to context memory.
++
++ pfob - Function object handle.
++ mac_table - Set to the 128-bit multicast address hash table.
++
++ Returns BE_SUCCESS if successfull, otherwise a useful int is returned.
++
++ IRQL: < DISPATCH_LEVEL
++*/
++
++int be_rxf_multicast_config(struct be_function_object *pfob,
++ bool promiscuous, u32 num, u8 *mac_table,
++ mcc_wrb_cqe_callback cb, /* optional */
++ void *cb_context,
++ struct be_multicast_q_ctxt *q_ctxt)
++{
++ int status = BE_SUCCESS;
++ struct FWCMD_COMMON_NTWK_MULTICAST_SET *fwcmd = NULL;
++ struct MCC_WRB_AMAP *wrb = NULL;
++ struct be_generic_q_ctxt *generic_ctxt = NULL;
++ unsigned long irql;
++
++ ASSERT(num <= ARRAY_SIZE(fwcmd->params.request.mac));
++
++ if (num > ARRAY_SIZE(fwcmd->params.request.mac)) {
++ TRACE(DL_ERR, "Too many multicast addresses. BE supports %d.",
++ (int) ARRAY_SIZE(fwcmd->params.request.mac));
++ return BE_NOT_OK;
++ }
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++ if (!wrb) {
++ if (q_ctxt && cb) {
++ wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header;
++ generic_ctxt = (struct be_generic_q_ctxt *) q_ctxt;
++ generic_ctxt->context.bytes = sizeof(*q_ctxt);
++ } else {
++ status = BE_STATUS_NO_MCC_WRB;
++ goto Error;
++ }
++ }
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_NTWK_MULTICAST_SET);
++
++ fwcmd->params.request.promiscuous = promiscuous;
++ if (!promiscuous) {
++ fwcmd->params.request.num_mac = num;
++ if (num > 0) {
++ ASSERT(mac_table);
++ memcpy(fwcmd->params.request.mac,
++ mac_table, ETH_ALEN * num);
++ }
++ }
++
++ /* Post the f/w command */
++ status = be_function_post_mcc_wrb(pfob, wrb, generic_ctxt,
++ cb, cb_context, NULL, NULL, fwcmd, NULL);
++ if (status < 0) {
++ TRACE(DL_ERR, "multicast fwcmd failed.");
++ goto Error;
++ }
++
++Error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
++/*
++ This routine adds or removes a vlan tag from the rxf table.
++
++ FunctionObject - Function object handle.
++ VLanTag - VLan tag to add or remove.
++ Add - Set to TRUE if this will add a vlan tag
++
++ Returns BE_SUCCESS if successfull, otherwise a useful int is returned.
++
++ IRQL: < DISPATCH_LEVEL
++*/
++int be_rxf_vlan_config(struct be_function_object *pfob,
++ bool promiscuous, u32 num, u16 *vlan_tag_array,
++ mcc_wrb_cqe_callback cb, /* optional */
++ void *cb_context,
++ struct be_vlan_q_ctxt *q_ctxt) /* optional */
++{
++ int status = BE_SUCCESS;
++ struct FWCMD_COMMON_NTWK_VLAN_CONFIG *fwcmd = NULL;
++ struct MCC_WRB_AMAP *wrb = NULL;
++ struct be_generic_q_ctxt *generic_ctxt = NULL;
++ unsigned long irql;
++
++ if (num > ARRAY_SIZE(fwcmd->params.request.vlan_tag)) {
++ TRACE(DL_ERR, "Too many VLAN tags.");
++ return BE_NOT_OK;
++ }
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++ if (!wrb) {
++ if (q_ctxt && cb) {
++ wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header;
++ generic_ctxt = (struct be_generic_q_ctxt *) q_ctxt;
++ generic_ctxt->context.bytes = sizeof(*q_ctxt);
++ } else {
++ status = BE_STATUS_NO_MCC_WRB;
++ goto Error;
++ }
++ }
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_NTWK_VLAN_CONFIG);
++
++ fwcmd->params.request.promiscuous = promiscuous;
++ if (!promiscuous) {
++ fwcmd->params.request.num_vlan = num;
++
++ if (num > 0) {
++ ASSERT(vlan_tag_array);
++ memcpy(fwcmd->params.request.vlan_tag, vlan_tag_array,
++ num * sizeof(vlan_tag_array[0]));
++ }
++ }
++
++ /* Post the commadn */
++ status = be_function_post_mcc_wrb(pfob, wrb, generic_ctxt,
++ cb, cb_context, NULL, NULL, fwcmd, NULL);
++ if (status < 0) {
++ TRACE(DL_ERR, "vlan fwcmd failed.");
++ goto Error;
++ }
++
++Error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
++
++int be_rxf_link_status(struct be_function_object *pfob,
++ struct BE_LINK_STATUS *link_status,
++ mcc_wrb_cqe_callback cb,
++ void *cb_context,
++ struct be_link_status_q_ctxt *q_ctxt)
++{
++ struct FWCMD_COMMON_NTWK_LINK_STATUS_QUERY *fwcmd = NULL;
++ struct MCC_WRB_AMAP *wrb = NULL;
++ int status = 0;
++ struct be_generic_q_ctxt *generic_ctxt = NULL;
++ unsigned long irql;
++ struct be_mcc_wrb_response_copy rc;
++
++ ASSERT(link_status);
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++
++ if (!wrb) {
++ if (q_ctxt && cb) {
++ wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header;
++ generic_ctxt = (struct be_generic_q_ctxt *) q_ctxt;
++ generic_ctxt->context.bytes = sizeof(*q_ctxt);
++ } else {
++ status = BE_STATUS_NO_MCC_WRB;
++ goto Error;
++ }
++ }
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb,
++ COMMON_NTWK_LINK_STATUS_QUERY);
++
++ rc.length = FIELD_SIZEOF(struct FWCMD_COMMON_NTWK_LINK_STATUS_QUERY,
++ params.response);
++ rc.fwcmd_offset = offsetof(struct FWCMD_COMMON_NTWK_LINK_STATUS_QUERY,
++ params.response);
++ rc.va = link_status;
++ /* Post or queue the f/w command */
++ status = be_function_post_mcc_wrb(pfob, wrb, generic_ctxt,
++ cb, cb_context, NULL, NULL, fwcmd, &rc);
++
++ if (status < 0) {
++ TRACE(DL_ERR, "link status fwcmd failed.");
++ goto Error;
++ }
++
++Error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
++int
++be_rxf_query_eth_statistics(struct be_function_object *pfob,
++ struct FWCMD_ETH_GET_STATISTICS *va_for_fwcmd,
++ u64 pa_for_fwcmd, mcc_wrb_cqe_callback cb,
++ void *cb_context,
++ struct be_nonembedded_q_ctxt *q_ctxt)
++{
++ struct MCC_WRB_AMAP *wrb = NULL;
++ int status = 0;
++ struct be_generic_q_ctxt *generic_ctxt = NULL;
++ unsigned long irql;
++
++ ASSERT(va_for_fwcmd);
++ ASSERT(pa_for_fwcmd);
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++
++ if (!wrb) {
++ if (q_ctxt && cb) {
++ wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header;
++ generic_ctxt = (struct be_generic_q_ctxt *) q_ctxt;
++ generic_ctxt->context.bytes = sizeof(*q_ctxt);
++ } else {
++ status = BE_STATUS_NO_MCC_WRB;
++ goto Error;
++ }
++ }
++
++ TRACE(DL_INFO, "Query eth stats. fwcmd va:%p pa:0x%08x_%08x",
++ va_for_fwcmd, upper_32_bits(pa_for_fwcmd), (u32)pa_for_fwcmd);
++
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ va_for_fwcmd = BE_PREPARE_NONEMBEDDED_FWCMD(pfob, wrb,
++ va_for_fwcmd, pa_for_fwcmd, ETH_GET_STATISTICS);
++
++ /* Post the f/w command */
++ status = be_function_post_mcc_wrb(pfob, wrb, generic_ctxt,
++ cb, cb_context, NULL, NULL, va_for_fwcmd, NULL);
++ if (status < 0) {
++ TRACE(DL_ERR, "eth stats fwcmd failed.");
++ goto Error;
++ }
++
++Error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
++int
++be_rxf_promiscuous(struct be_function_object *pfob,
++ bool enable_port0, bool enable_port1,
++ mcc_wrb_cqe_callback cb, void *cb_context,
++ struct be_promiscuous_q_ctxt *q_ctxt)
++{
++ struct FWCMD_ETH_PROMISCUOUS *fwcmd = NULL;
++ struct MCC_WRB_AMAP *wrb = NULL;
++ int status = 0;
++ struct be_generic_q_ctxt *generic_ctxt = NULL;
++ unsigned long irql;
++
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++
++ if (!wrb) {
++ if (q_ctxt && cb) {
++ wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header;
++ generic_ctxt = (struct be_generic_q_ctxt *) q_ctxt;
++ generic_ctxt->context.bytes = sizeof(*q_ctxt);
++ } else {
++ status = BE_STATUS_NO_MCC_WRB;
++ goto Error;
++ }
++ }
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, ETH_PROMISCUOUS);
++
++ fwcmd->params.request.port0_promiscuous = enable_port0;
++ fwcmd->params.request.port1_promiscuous = enable_port1;
++
++ /* Post the f/w command */
++ status = be_function_post_mcc_wrb(pfob, wrb, generic_ctxt,
++ cb, cb_context, NULL, NULL, fwcmd, NULL);
++
++ if (status < 0) {
++ TRACE(DL_ERR, "promiscuous fwcmd failed.");
++ goto Error;
++ }
++
++Error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
++
++/*
++ *-------------------------------------------------------------------------
++ * Function: be_rxf_filter_config
++ * Configures BladeEngine ethernet receive filter settings.
++ * pfob -
++ * settings - Pointer to the requested filter settings.
++ * The response from BladeEngine will be placed back
++ * in this structure.
++ * cb - optional
++ * cb_context - optional
++ * q_ctxt - Optional. Pointer to a previously allocated struct.
++ * If the MCC WRB ring is full, this structure is
++ * used to queue the operation. It will be posted
++ * to the MCC ring when space becomes available. All
++ * queued commands will be posted to the ring in
++ * the order they are received. It is always valid
++ * to pass a pointer to a generic
++ * be_generic_q_ctxt. However, the specific
++ * context structs are generally smaller than
++ * the generic struct.
++ * return pend_status - BE_SUCCESS (0) on success.
++ * BE_PENDING (postive value) if the FWCMD
++ * completion is pending. Negative error code on failure.
++ *---------------------------------------------------------------------------
++ */
++int
++be_rxf_filter_config(struct be_function_object *pfob,
++ struct NTWK_RX_FILTER_SETTINGS *settings,
++ mcc_wrb_cqe_callback cb, void *cb_context,
++ struct be_rxf_filter_q_ctxt *q_ctxt)
++{
++ struct FWCMD_COMMON_NTWK_RX_FILTER *fwcmd = NULL;
++ struct MCC_WRB_AMAP *wrb = NULL;
++ int status = 0;
++ struct be_generic_q_ctxt *generic_ctxt = NULL;
++ unsigned long irql;
++ struct be_mcc_wrb_response_copy rc;
++
++ ASSERT(settings);
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++
++ if (!wrb) {
++ if (q_ctxt && cb) {
++ wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header;
++ generic_ctxt = (struct be_generic_q_ctxt *) q_ctxt;
++ generic_ctxt->context.bytes = sizeof(*q_ctxt);
++ } else {
++ status = BE_STATUS_NO_MCC_WRB;
++ goto Error;
++ }
++ }
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_NTWK_RX_FILTER);
++ memcpy(&fwcmd->params.request, settings, sizeof(*settings));
++
++ rc.length = FIELD_SIZEOF(struct FWCMD_COMMON_NTWK_RX_FILTER,
++ params.response);
++ rc.fwcmd_offset = offsetof(struct FWCMD_COMMON_NTWK_RX_FILTER,
++ params.response);
++ rc.va = settings;
++ /* Post or queue the f/w command */
++ status = be_function_post_mcc_wrb(pfob, wrb, generic_ctxt,
++ cb, cb_context, NULL, NULL, fwcmd, &rc);
++
++ if (status < 0) {
++ TRACE(DL_ERR, "RXF/ERX filter config fwcmd failed.");
++ goto Error;
++ }
++
++Error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/etx_context.h linux-2.6.29-rc3.owrt/drivers/staging/benet/etx_context.h
+--- linux-2.6.29.owrt/drivers/staging/benet/etx_context.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/etx_context.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,55 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * Autogenerated by srcgen version: 0127
++ */
++#ifndef __etx_context_amap_h__
++#define __etx_context_amap_h__
++
++/* ETX ring context structure. */
++struct BE_ETX_CONTEXT_AMAP {
++ u8 tx_cidx[11]; /* DWORD 0 */
++ u8 rsvd0[5]; /* DWORD 0 */
++ u8 rsvd1[16]; /* DWORD 0 */
++ u8 tx_pidx[11]; /* DWORD 1 */
++ u8 rsvd2; /* DWORD 1 */
++ u8 tx_ring_size[4]; /* DWORD 1 */
++ u8 pd_id[5]; /* DWORD 1 */
++ u8 pd_id_not_valid; /* DWORD 1 */
++ u8 cq_id_send[10]; /* DWORD 1 */
++ u8 rsvd3[32]; /* DWORD 2 */
++ u8 rsvd4[32]; /* DWORD 3 */
++ u8 cur_bytes[32]; /* DWORD 4 */
++ u8 max_bytes[32]; /* DWORD 5 */
++ u8 time_stamp[32]; /* DWORD 6 */
++ u8 rsvd5[11]; /* DWORD 7 */
++ u8 func; /* DWORD 7 */
++ u8 rsvd6[20]; /* DWORD 7 */
++ u8 cur_txd_count[32]; /* DWORD 8 */
++ u8 max_txd_count[32]; /* DWORD 9 */
++ u8 rsvd7[32]; /* DWORD 10 */
++ u8 rsvd8[32]; /* DWORD 11 */
++ u8 rsvd9[32]; /* DWORD 12 */
++ u8 rsvd10[32]; /* DWORD 13 */
++ u8 rsvd11[32]; /* DWORD 14 */
++ u8 rsvd12[32]; /* DWORD 15 */
++} __packed;
++struct ETX_CONTEXT_AMAP {
++ u32 dw[16];
++};
++
++#endif /* __etx_context_amap_h__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/funcobj.c linux-2.6.29-rc3.owrt/drivers/staging/benet/funcobj.c
+--- linux-2.6.29.owrt/drivers/staging/benet/funcobj.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/funcobj.c 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,565 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++#include "hwlib.h"
++#include "bestatus.h"
++
++
++int
++be_function_internal_query_firmware_config(struct be_function_object *pfob,
++ struct BE_FIRMWARE_CONFIG *config)
++{
++ struct FWCMD_COMMON_FIRMWARE_CONFIG *fwcmd = NULL;
++ struct MCC_WRB_AMAP *wrb = NULL;
++ int status = 0;
++ unsigned long irql;
++ struct be_mcc_wrb_response_copy rc;
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++ if (!wrb) {
++ TRACE(DL_ERR, "MCC wrb peek failed.");
++ status = BE_STATUS_NO_MCC_WRB;
++ goto error;
++ }
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_FIRMWARE_CONFIG);
++
++ rc.length = FIELD_SIZEOF(struct FWCMD_COMMON_FIRMWARE_CONFIG,
++ params.response);
++ rc.fwcmd_offset = offsetof(struct FWCMD_COMMON_FIRMWARE_CONFIG,
++ params.response);
++ rc.va = config;
++
++ /* Post the f/w command */
++ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL,
++ NULL, NULL, NULL, fwcmd, &rc);
++error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
++/*
++ This allocates and initializes a function object based on the information
++ provided by upper layer drivers.
++
++ Returns BE_SUCCESS on success and an appropriate int on failure.
++
++ A function object represents a single BladeEngine (logical) PCI function.
++ That is a function object either represents
++ the networking side of BladeEngine or the iSCSI side of BladeEngine.
++
++ This routine will also detect and create an appropriate PD object for the
++ PCI function as needed.
++*/
++int
++be_function_object_create(u8 __iomem *csr_va, u8 __iomem *db_va,
++ u8 __iomem *pci_va, u32 function_type,
++ struct ring_desc *mailbox, struct be_function_object *pfob)
++{
++ int status;
++
++ ASSERT(pfob); /* not a magic assert */
++ ASSERT(function_type <= 2);
++
++ TRACE(DL_INFO, "Create function object. type:%s object:0x%p",
++ (function_type == BE_FUNCTION_TYPE_ISCSI ? "iSCSI" :
++ (function_type == BE_FUNCTION_TYPE_NETWORK ? "Network" :
++ "Arm")), pfob);
++
++ memset(pfob, 0, sizeof(*pfob));
++
++ pfob->type = function_type;
++ pfob->csr_va = csr_va;
++ pfob->db_va = db_va;
++ pfob->pci_va = pci_va;
++
++ spin_lock_init(&pfob->cq_lock);
++ spin_lock_init(&pfob->post_lock);
++ spin_lock_init(&pfob->mcc_context_lock);
++
++
++ pfob->pci_function_number = 1;
++
++
++ pfob->emulate = false;
++ TRACE(DL_NOTE, "Non-emulation mode");
++ status = be_drive_POST(pfob);
++ if (status != BE_SUCCESS) {
++ TRACE(DL_ERR, "BladeEngine POST failed.");
++ goto error;
++ }
++
++ /* Initialize the mailbox */
++ status = be_mpu_init_mailbox(pfob, mailbox);
++ if (status != BE_SUCCESS) {
++ TRACE(DL_ERR, "Failed to initialize mailbox.");
++ goto error;
++ }
++ /*
++ * Cache the firmware config for ASSERTs in hwclib and later
++ * driver queries.
++ */
++ status = be_function_internal_query_firmware_config(pfob,
++ &pfob->fw_config);
++ if (status != BE_SUCCESS) {
++ TRACE(DL_ERR, "Failed to query firmware config.");
++ goto error;
++ }
++
++error:
++ if (status != BE_SUCCESS) {
++ /* No cleanup necessary */
++ TRACE(DL_ERR, "Failed to create function.");
++ memset(pfob, 0, sizeof(*pfob));
++ }
++ return status;
++}
++
++/*
++ This routine drops the reference count on a given function object. Once
++ the reference count falls to zero, the function object is destroyed and all
++ resources held are freed.
++
++ FunctionObject - The function object to drop the reference to.
++*/
++int be_function_object_destroy(struct be_function_object *pfob)
++{
++ TRACE(DL_INFO, "Destroy pfob. Object:0x%p",
++ pfob);
++
++
++ ASSERT(pfob->mcc == NULL);
++
++ return BE_SUCCESS;
++}
++
++int be_function_cleanup(struct be_function_object *pfob)
++{
++ int status = 0;
++ u32 isr;
++ u32 host_intr;
++ struct PCICFG_HOST_TIMER_INT_CTRL_CSR_AMAP ctrl;
++
++
++ if (pfob->type == BE_FUNCTION_TYPE_NETWORK) {
++ status = be_rxf_multicast_config(pfob, false, 0,
++ NULL, NULL, NULL, NULL);
++ ASSERT(status == BE_SUCCESS);
++ }
++ /* VLAN */
++ status = be_rxf_vlan_config(pfob, false, 0, NULL, NULL, NULL, NULL);
++ ASSERT(status == BE_SUCCESS);
++ /*
++ * MCC Queue -- Switches to mailbox mode. May want to destroy
++ * all but the MCC CQ before this call if polling CQ is much better
++ * performance than polling mailbox register.
++ */
++ if (pfob->mcc)
++ status = be_mcc_ring_destroy(pfob->mcc);
++ /*
++ * If interrupts are disabled, clear any CEV interrupt assertions that
++ * fired after we stopped processing EQs.
++ */
++ ctrl.dw[0] = PCICFG1_READ(pfob, host_timer_int_ctrl);
++ host_intr = AMAP_GET_BITS_PTR(PCICFG_HOST_TIMER_INT_CTRL_CSR,
++ hostintr, ctrl.dw);
++ if (!host_intr)
++ if (pfob->type == BE_FUNCTION_TYPE_NETWORK)
++ isr = CSR_READ(pfob, cev.isr1);
++ else
++ isr = CSR_READ(pfob, cev.isr0);
++ else
++ /* This should never happen... */
++ TRACE(DL_ERR, "function_cleanup called with interrupt enabled");
++ /* Function object destroy */
++ status = be_function_object_destroy(pfob);
++ ASSERT(status == BE_SUCCESS);
++
++ return status;
++}
++
++
++void *
++be_function_prepare_embedded_fwcmd(struct be_function_object *pfob,
++ struct MCC_WRB_AMAP *wrb, u32 payld_len, u32 request_length,
++ u32 response_length, u32 opcode, u32 subsystem)
++{
++ struct FWCMD_REQUEST_HEADER *header = NULL;
++ u32 n;
++
++ ASSERT(wrb);
++
++ n = offsetof(struct BE_MCC_WRB_AMAP, payload)/8;
++ AMAP_SET_BITS_PTR(MCC_WRB, embedded, wrb, 1);
++ AMAP_SET_BITS_PTR(MCC_WRB, payload_length, wrb, min(payld_len, n));
++ header = (struct FWCMD_REQUEST_HEADER *)((u8 *)wrb + n);
++
++ header->timeout = 0;
++ header->domain = 0;
++ header->request_length = max(request_length, response_length);
++ header->opcode = opcode;
++ header->subsystem = subsystem;
++
++ return header;
++}
++
++void *
++be_function_prepare_nonembedded_fwcmd(struct be_function_object *pfob,
++ struct MCC_WRB_AMAP *wrb,
++ void *fwcmd_va, u64 fwcmd_pa,
++ u32 payld_len,
++ u32 request_length,
++ u32 response_length,
++ u32 opcode, u32 subsystem)
++{
++ struct FWCMD_REQUEST_HEADER *header = NULL;
++ u32 n;
++ struct MCC_WRB_PAYLOAD_AMAP *plp;
++
++ ASSERT(wrb);
++ ASSERT(fwcmd_va);
++
++ header = (struct FWCMD_REQUEST_HEADER *) fwcmd_va;
++
++ AMAP_SET_BITS_PTR(MCC_WRB, embedded, wrb, 0);
++ AMAP_SET_BITS_PTR(MCC_WRB, payload_length, wrb, payld_len);
++
++ /*
++ * Assume one fragment. The caller may override the SGL by
++ * rewriting the 0th length and adding more entries. They
++ * will also need to update the sge_count.
++ */
++ AMAP_SET_BITS_PTR(MCC_WRB, sge_count, wrb, 1);
++
++ n = offsetof(struct BE_MCC_WRB_AMAP, payload)/8;
++ plp = (struct MCC_WRB_PAYLOAD_AMAP *)((u8 *)wrb + n);
++ AMAP_SET_BITS_PTR(MCC_WRB_PAYLOAD, sgl[0].length, plp, payld_len);
++ AMAP_SET_BITS_PTR(MCC_WRB_PAYLOAD, sgl[0].pa_lo, plp, (u32)fwcmd_pa);
++ AMAP_SET_BITS_PTR(MCC_WRB_PAYLOAD, sgl[0].pa_hi, plp,
++ upper_32_bits(fwcmd_pa));
++
++ header->timeout = 0;
++ header->domain = 0;
++ header->request_length = max(request_length, response_length);
++ header->opcode = opcode;
++ header->subsystem = subsystem;
++
++ return header;
++}
++
++struct MCC_WRB_AMAP *
++be_function_peek_mcc_wrb(struct be_function_object *pfob)
++{
++ struct MCC_WRB_AMAP *wrb = NULL;
++ u32 offset;
++
++ if (pfob->mcc)
++ wrb = _be_mpu_peek_ring_wrb(pfob->mcc, false);
++ else {
++ offset = offsetof(struct BE_MCC_MAILBOX_AMAP, wrb)/8;
++ wrb = (struct MCC_WRB_AMAP *) ((u8 *) pfob->mailbox.va +
++ offset);
++ }
++
++ if (wrb)
++ memset(wrb, 0, sizeof(struct MCC_WRB_AMAP));
++
++ return wrb;
++}
++
++#if defined(BE_DEBUG)
++void be_function_debug_print_wrb(struct be_function_object *pfob,
++ struct MCC_WRB_AMAP *wrb, void *optional_fwcmd_va,
++ struct be_mcc_wrb_context *wrb_context)
++{
++
++ struct FWCMD_REQUEST_HEADER *header = NULL;
++ u8 embedded;
++ u32 n;
++
++ embedded = AMAP_GET_BITS_PTR(MCC_WRB, embedded, wrb);
++
++ if (embedded) {
++ n = offsetof(struct BE_MCC_WRB_AMAP, payload)/8;
++ header = (struct FWCMD_REQUEST_HEADER *)((u8 *)wrb + n);
++ } else {
++ header = (struct FWCMD_REQUEST_HEADER *) optional_fwcmd_va;
++ }
++
++ /* Save the completed count before posting for a debug assert. */
++
++ if (header) {
++ wrb_context->opcode = header->opcode;
++ wrb_context->subsystem = header->subsystem;
++
++ } else {
++ wrb_context->opcode = 0;
++ wrb_context->subsystem = 0;
++ }
++}
++#else
++#define be_function_debug_print_wrb(a_, b_, c_, d_)
++#endif
++
++int
++be_function_post_mcc_wrb(struct be_function_object *pfob,
++ struct MCC_WRB_AMAP *wrb,
++ struct be_generic_q_ctxt *q_ctxt,
++ mcc_wrb_cqe_callback cb, void *cb_context,
++ mcc_wrb_cqe_callback internal_cb,
++ void *internal_cb_context, void *optional_fwcmd_va,
++ struct be_mcc_wrb_response_copy *rc)
++{
++ int status;
++ struct be_mcc_wrb_context *wrb_context = NULL;
++ u64 *p;
++
++ if (q_ctxt) {
++ /* Initialize context. */
++ q_ctxt->context.internal_cb = internal_cb;
++ q_ctxt->context.internal_cb_context = internal_cb_context;
++ q_ctxt->context.cb = cb;
++ q_ctxt->context.cb_context = cb_context;
++ if (rc) {
++ q_ctxt->context.copy.length = rc->length;
++ q_ctxt->context.copy.fwcmd_offset = rc->fwcmd_offset;
++ q_ctxt->context.copy.va = rc->va;
++ } else
++ q_ctxt->context.copy.length = 0;
++
++ q_ctxt->context.optional_fwcmd_va = optional_fwcmd_va;
++
++ /* Queue this request */
++ status = be_function_queue_mcc_wrb(pfob, q_ctxt);
++
++ goto Error;
++ }
++ /*
++ * Allocate a WRB context struct to hold the callback pointers,
++ * status, etc. This is required if commands complete out of order.
++ */
++ wrb_context = _be_mcc_allocate_wrb_context(pfob);
++ if (!wrb_context) {
++ TRACE(DL_WARN, "Failed to allocate MCC WRB context.");
++ status = BE_STATUS_SYSTEM_RESOURCES;
++ goto Error;
++ }
++ /* Initialize context. */
++ memset(wrb_context, 0, sizeof(*wrb_context));
++ wrb_context->internal_cb = internal_cb;
++ wrb_context->internal_cb_context = internal_cb_context;
++ wrb_context->cb = cb;
++ wrb_context->cb_context = cb_context;
++ if (rc) {
++ wrb_context->copy.length = rc->length;
++ wrb_context->copy.fwcmd_offset = rc->fwcmd_offset;
++ wrb_context->copy.va = rc->va;
++ } else
++ wrb_context->copy.length = 0;
++ wrb_context->wrb = wrb;
++
++ /*
++ * Copy the context pointer into the WRB opaque tag field.
++ * Verify assumption of 64-bit tag with a compile time assert.
++ */
++ p = (u64 *) ((u8 *)wrb + offsetof(struct BE_MCC_WRB_AMAP, tag)/8);
++ *p = (u64)(size_t)wrb_context;
++
++ /* Print info about this FWCMD for debug builds. */
++ be_function_debug_print_wrb(pfob, wrb, optional_fwcmd_va, wrb_context);
++
++ /*
++ * issue the WRB to the MPU as appropriate
++ */
++ if (pfob->mcc) {
++ /*
++ * we're in WRB mode, pass to the mcc layer
++ */
++ status = _be_mpu_post_wrb_ring(pfob->mcc, wrb, wrb_context);
++ } else {
++ /*
++ * we're in mailbox mode
++ */
++ status = _be_mpu_post_wrb_mailbox(pfob, wrb, wrb_context);
++
++ /* mailbox mode always completes synchronously */
++ ASSERT(status != BE_STATUS_PENDING);
++ }
++
++Error:
++
++ return status;
++}
++
++int
++be_function_ring_destroy(struct be_function_object *pfob,
++ u32 id, u32 ring_type, mcc_wrb_cqe_callback cb,
++ void *cb_context, mcc_wrb_cqe_callback internal_cb,
++ void *internal_cb_context)
++{
++
++ struct FWCMD_COMMON_RING_DESTROY *fwcmd = NULL;
++ struct MCC_WRB_AMAP *wrb = NULL;
++ int status = 0;
++ unsigned long irql;
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ TRACE(DL_INFO, "Destroy ring id:%d type:%d", id, ring_type);
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++ if (!wrb) {
++ ASSERT(wrb);
++ TRACE(DL_ERR, "No free MCC WRBs in destroy ring.");
++ status = BE_STATUS_NO_MCC_WRB;
++ goto Error;
++ }
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_RING_DESTROY);
++
++ fwcmd->params.request.id = id;
++ fwcmd->params.request.ring_type = ring_type;
++
++ /* Post the f/w command */
++ status = be_function_post_mcc_wrb(pfob, wrb, NULL, cb, cb_context,
++ internal_cb, internal_cb_context, fwcmd, NULL);
++ if (status != BE_SUCCESS && status != BE_PENDING) {
++ TRACE(DL_ERR, "Ring destroy fwcmd failed. id:%d ring_type:%d",
++ id, ring_type);
++ goto Error;
++ }
++
++Error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
++void
++be_rd_to_pa_list(struct ring_desc *rd, struct PHYS_ADDR *pa_list, u32 max_num)
++{
++ u32 num_pages = PAGES_SPANNED(rd->va, rd->length);
++ u32 i = 0;
++ u64 pa = rd->pa;
++ __le64 lepa;
++
++ ASSERT(pa_list);
++ ASSERT(pa);
++
++ for (i = 0; i < min(num_pages, max_num); i++) {
++ lepa = cpu_to_le64(pa);
++ pa_list[i].lo = (u32)lepa;
++ pa_list[i].hi = upper_32_bits(lepa);
++ pa += PAGE_SIZE;
++ }
++}
++
++
++
++/*-----------------------------------------------------------------------------
++ * Function: be_function_get_fw_version
++ * Retrieves the firmware version on the adpater. If the callback is
++ * NULL this call executes synchronously. If the callback is not NULL,
++ * the returned status will be BE_PENDING if the command was issued
++ * successfully.
++ * pfob -
++ * fwv - Pointer to response buffer if callback is NULL.
++ * cb - Callback function invoked when the FWCMD completes.
++ * cb_context - Passed to the callback function.
++ * return pend_status - BE_SUCCESS (0) on success.
++ * BE_PENDING (postive value) if the FWCMD
++ * completion is pending. Negative error code on failure.
++ *---------------------------------------------------------------------------
++ */
++int
++be_function_get_fw_version(struct be_function_object *pfob,
++ struct FWCMD_COMMON_GET_FW_VERSION_RESPONSE_PAYLOAD *fwv,
++ mcc_wrb_cqe_callback cb, void *cb_context)
++{
++ int status = BE_SUCCESS;
++ struct MCC_WRB_AMAP *wrb = NULL;
++ struct FWCMD_COMMON_GET_FW_VERSION *fwcmd = NULL;
++ unsigned long irql;
++ struct be_mcc_wrb_response_copy rc;
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++ if (!wrb) {
++ TRACE(DL_ERR, "MCC wrb peek failed.");
++ status = BE_STATUS_NO_MCC_WRB;
++ goto Error;
++ }
++
++ if (!cb && !fwv) {
++ TRACE(DL_ERR, "callback and response buffer NULL!");
++ status = BE_NOT_OK;
++ goto Error;
++ }
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_GET_FW_VERSION);
++
++ rc.length = FIELD_SIZEOF(struct FWCMD_COMMON_GET_FW_VERSION,
++ params.response);
++ rc.fwcmd_offset = offsetof(struct FWCMD_COMMON_GET_FW_VERSION,
++ params.response);
++ rc.va = fwv;
++
++ /* Post the f/w command */
++ status = be_function_post_mcc_wrb(pfob, wrb, NULL, cb,
++ cb_context, NULL, NULL, fwcmd, &rc);
++
++Error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
++int
++be_function_queue_mcc_wrb(struct be_function_object *pfob,
++ struct be_generic_q_ctxt *q_ctxt)
++{
++ int status;
++
++ ASSERT(q_ctxt);
++
++ /*
++ * issue the WRB to the MPU as appropriate
++ */
++ if (pfob->mcc) {
++
++ /* We're in ring mode. Queue this item. */
++ pfob->mcc->backlog_length++;
++ list_add_tail(&q_ctxt->context.list, &pfob->mcc->backlog);
++ status = BE_PENDING;
++ } else {
++ status = BE_NOT_OK;
++ }
++ return status;
++}
++
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/fwcmd_common_bmap.h linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_common_bmap.h
+--- linux-2.6.29.owrt/drivers/staging/benet/fwcmd_common_bmap.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_common_bmap.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,717 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * Autogenerated by srcgen version: 0127
++ */
++#ifndef __fwcmd_common_bmap_h__
++#define __fwcmd_common_bmap_h__
++#include "fwcmd_types_bmap.h"
++#include "fwcmd_hdr_bmap.h"
++
++#if defined(__BIG_ENDIAN)
++ /* Physical Address. */
++struct PHYS_ADDR {
++ union {
++ struct {
++ u32 lo; /* DWORD 0 */
++ u32 hi; /* DWORD 1 */
++ } __packed; /* unnamed struct */
++ u32 dw[2]; /* dword union */
++ }; /* unnamed union */
++} __packed ;
++
++
++#else
++ /* Physical Address. */
++struct PHYS_ADDR {
++ union {
++ struct {
++ u32 lo; /* DWORD 0 */
++ u32 hi; /* DWORD 1 */
++ } __packed; /* unnamed struct */
++ u32 dw[2]; /* dword union */
++ }; /* unnamed union */
++} __packed ;
++
++struct BE_LINK_STATUS {
++ u8 mac0_duplex;
++ u8 mac0_speed;
++ u8 mac1_duplex;
++ u8 mac1_speed;
++ u8 mgmt_mac_duplex;
++ u8 mgmt_mac_speed;
++ u8 active_port;
++ u8 rsvd0;
++ u8 mac0_fault;
++ u8 mac1_fault;
++ u16 rsvd1;
++} __packed;
++#endif
++
++struct FWCMD_COMMON_ANON_170_REQUEST {
++ u32 rsvd0;
++} __packed;
++
++union LINK_STATUS_QUERY_PARAMS {
++ struct BE_LINK_STATUS response;
++ struct FWCMD_COMMON_ANON_170_REQUEST request;
++} __packed;
++
++/*
++ * Queries the the link status for all ports. The valid values below
++ * DO NOT indicate that a particular duplex or speed is supported by
++ * BladeEngine. These enumerations simply list all possible duplexes
++ * and speeds for any port. Consult BladeEngine product documentation
++ * for the supported parameters.
++ */
++struct FWCMD_COMMON_NTWK_LINK_STATUS_QUERY {
++ union FWCMD_HEADER header;
++ union LINK_STATUS_QUERY_PARAMS params;
++} __packed;
++
++struct FWCMD_COMMON_ANON_171_REQUEST {
++ u8 type;
++ u8 port;
++ u8 mac1;
++ u8 permanent;
++} __packed;
++
++struct FWCMD_COMMON_ANON_172_RESPONSE {
++ struct MAC_ADDRESS_FORMAT mac;
++} __packed;
++
++union NTWK_MAC_QUERY_PARAMS {
++ struct FWCMD_COMMON_ANON_171_REQUEST request;
++ struct FWCMD_COMMON_ANON_172_RESPONSE response;
++} __packed;
++
++/* Queries one MAC address. */
++struct FWCMD_COMMON_NTWK_MAC_QUERY {
++ union FWCMD_HEADER header;
++ union NTWK_MAC_QUERY_PARAMS params;
++} __packed;
++
++struct MAC_SET_PARAMS_IN {
++ u8 type;
++ u8 port;
++ u8 mac1;
++ u8 invalidate;
++ struct MAC_ADDRESS_FORMAT mac;
++} __packed;
++
++struct MAC_SET_PARAMS_OUT {
++ u32 rsvd0;
++} __packed;
++
++union MAC_SET_PARAMS {
++ struct MAC_SET_PARAMS_IN request;
++ struct MAC_SET_PARAMS_OUT response;
++} __packed;
++
++/* Sets a MAC address. */
++struct FWCMD_COMMON_NTWK_MAC_SET {
++ union FWCMD_HEADER header;
++ union MAC_SET_PARAMS params;
++} __packed;
++
++/* MAC address list. */
++struct NTWK_MULTICAST_MAC_LIST {
++ u8 byte[6];
++} __packed;
++
++struct FWCMD_COMMON_NTWK_MULTICAST_SET_REQUEST_PAYLOAD {
++ u16 num_mac;
++ u8 promiscuous;
++ u8 rsvd0;
++ struct NTWK_MULTICAST_MAC_LIST mac[32];
++} __packed;
++
++struct FWCMD_COMMON_ANON_174_RESPONSE {
++ u32 rsvd0;
++} __packed;
++
++union FWCMD_COMMON_ANON_173_PARAMS {
++ struct FWCMD_COMMON_NTWK_MULTICAST_SET_REQUEST_PAYLOAD request;
++ struct FWCMD_COMMON_ANON_174_RESPONSE response;
++} __packed;
++
++/*
++ * Sets multicast address hash. The MPU will merge the MAC address lists
++ * from all clients, including the networking and storage functions.
++ * This command may fail if the final merged list of MAC addresses exceeds
++ * 32 entries.
++ */
++struct FWCMD_COMMON_NTWK_MULTICAST_SET {
++ union FWCMD_HEADER header;
++ union FWCMD_COMMON_ANON_173_PARAMS params;
++} __packed;
++
++struct FWCMD_COMMON_NTWK_VLAN_CONFIG_REQUEST_PAYLOAD {
++ u16 num_vlan;
++ u8 promiscuous;
++ u8 rsvd0;
++ u16 vlan_tag[32];
++} __packed;
++
++struct FWCMD_COMMON_ANON_176_RESPONSE {
++ u32 rsvd0;
++} __packed;
++
++union FWCMD_COMMON_ANON_175_PARAMS {
++ struct FWCMD_COMMON_NTWK_VLAN_CONFIG_REQUEST_PAYLOAD request;
++ struct FWCMD_COMMON_ANON_176_RESPONSE response;
++} __packed;
++
++/*
++ * Sets VLAN tag filter. The MPU will merge the VLAN tag list from all
++ * clients, including the networking and storage functions. This command
++ * may fail if the final vlan_tag array (from all functions) is longer
++ * than 32 entries.
++ */
++struct FWCMD_COMMON_NTWK_VLAN_CONFIG {
++ union FWCMD_HEADER header;
++ union FWCMD_COMMON_ANON_175_PARAMS params;
++} __packed;
++
++struct RING_DESTROY_REQUEST {
++ u16 ring_type;
++ u16 id;
++ u8 bypass_flush;
++ u8 rsvd0;
++ u16 rsvd1;
++} __packed;
++
++struct FWCMD_COMMON_ANON_190_RESPONSE {
++ u32 rsvd0;
++} __packed;
++
++union FWCMD_COMMON_ANON_189_PARAMS {
++ struct RING_DESTROY_REQUEST request;
++ struct FWCMD_COMMON_ANON_190_RESPONSE response;
++} __packed;
++/*
++ * Command for destroying any ring. The connection(s) using the ring should
++ * be quiesced before destroying the ring.
++ */
++struct FWCMD_COMMON_RING_DESTROY {
++ union FWCMD_HEADER header;
++ union FWCMD_COMMON_ANON_189_PARAMS params;
++} __packed;
++
++struct FWCMD_COMMON_ANON_192_REQUEST {
++ u16 num_pages;
++ u16 rsvd0;
++ struct CQ_CONTEXT_AMAP context;
++ struct PHYS_ADDR pages[4];
++} __packed ;
++
++struct FWCMD_COMMON_ANON_193_RESPONSE {
++ u16 cq_id;
++} __packed ;
++
++union FWCMD_COMMON_ANON_191_PARAMS {
++ struct FWCMD_COMMON_ANON_192_REQUEST request;
++ struct FWCMD_COMMON_ANON_193_RESPONSE response;
++} __packed ;
++
++/*
++ * Command for creating a completion queue. A Completion Queue must span
++ * at least 1 page and at most 4 pages. Each completion queue entry
++ * is 16 bytes regardless of CQ entry format. Thus the ring must be
++ * at least 256 entries deep (corresponding to 1 page) and can be at
++ * most 1024 entries deep (corresponding to 4 pages). The number of
++ * pages posted must contain the CQ ring size as encoded in the context.
++ *
++ */
++struct FWCMD_COMMON_CQ_CREATE {
++ union FWCMD_HEADER header;
++ union FWCMD_COMMON_ANON_191_PARAMS params;
++} __packed ;
++
++struct FWCMD_COMMON_ANON_198_REQUEST {
++ u16 num_pages;
++ u16 rsvd0;
++ struct EQ_CONTEXT_AMAP context;
++ struct PHYS_ADDR pages[8];
++} __packed ;
++
++struct FWCMD_COMMON_ANON_199_RESPONSE {
++ u16 eq_id;
++} __packed ;
++
++union FWCMD_COMMON_ANON_197_PARAMS {
++ struct FWCMD_COMMON_ANON_198_REQUEST request;
++ struct FWCMD_COMMON_ANON_199_RESPONSE response;
++} __packed ;
++
++/*
++ * Command for creating a event queue. An Event Queue must span at least
++ * 1 page and at most 8 pages. The number of pages posted must contain
++ * the EQ ring. The ring is defined by the size of the EQ entries (encoded
++ * in the context) and the number of EQ entries (also encoded in the
++ * context).
++ */
++struct FWCMD_COMMON_EQ_CREATE {
++ union FWCMD_HEADER header;
++ union FWCMD_COMMON_ANON_197_PARAMS params;
++} __packed ;
++
++struct FWCMD_COMMON_ANON_201_REQUEST {
++ u16 cq_id;
++ u16 bcmc_cq_id;
++ u16 num_pages;
++ u16 rsvd0;
++ struct PHYS_ADDR pages[2];
++} __packed;
++
++struct FWCMD_COMMON_ANON_202_RESPONSE {
++ u16 id;
++} __packed;
++
++union FWCMD_COMMON_ANON_200_PARAMS {
++ struct FWCMD_COMMON_ANON_201_REQUEST request;
++ struct FWCMD_COMMON_ANON_202_RESPONSE response;
++} __packed;
++
++/*
++ * Command for creating Ethernet receive ring. An ERX ring contains ETH_RX_D
++ * entries (8 bytes each). An ERX ring must be 1024 entries deep
++ * (corresponding to 2 pages).
++ */
++struct FWCMD_COMMON_ETH_RX_CREATE {
++ union FWCMD_HEADER header;
++ union FWCMD_COMMON_ANON_200_PARAMS params;
++} __packed;
++
++struct FWCMD_COMMON_ANON_204_REQUEST {
++ u16 num_pages;
++ u8 ulp_num;
++ u8 type;
++ struct ETX_CONTEXT_AMAP context;
++ struct PHYS_ADDR pages[8];
++} __packed ;
++
++struct FWCMD_COMMON_ANON_205_RESPONSE {
++ u16 cid;
++ u8 ulp_num;
++ u8 rsvd0;
++} __packed ;
++
++union FWCMD_COMMON_ANON_203_PARAMS {
++ struct FWCMD_COMMON_ANON_204_REQUEST request;
++ struct FWCMD_COMMON_ANON_205_RESPONSE response;
++} __packed ;
++
++/*
++ * Command for creating an Ethernet transmit ring. An ETX ring contains
++ * ETH_WRB entries (16 bytes each). An ETX ring must be at least 256
++ * entries deep (corresponding to 1 page) and at most 2k entries deep
++ * (corresponding to 8 pages).
++ */
++struct FWCMD_COMMON_ETH_TX_CREATE {
++ union FWCMD_HEADER header;
++ union FWCMD_COMMON_ANON_203_PARAMS params;
++} __packed ;
++
++struct FWCMD_COMMON_ANON_222_REQUEST {
++ u16 num_pages;
++ u16 rsvd0;
++ struct MCC_RING_CONTEXT_AMAP context;
++ struct PHYS_ADDR pages[8];
++} __packed ;
++
++struct FWCMD_COMMON_ANON_223_RESPONSE {
++ u16 id;
++} __packed ;
++
++union FWCMD_COMMON_ANON_221_PARAMS {
++ struct FWCMD_COMMON_ANON_222_REQUEST request;
++ struct FWCMD_COMMON_ANON_223_RESPONSE response;
++} __packed ;
++
++/*
++ * Command for creating the MCC ring. An MCC ring must be at least 16
++ * entries deep (corresponding to 1 page) and at most 128 entries deep
++ * (corresponding to 8 pages).
++ */
++struct FWCMD_COMMON_MCC_CREATE {
++ union FWCMD_HEADER header;
++ union FWCMD_COMMON_ANON_221_PARAMS params;
++} __packed ;
++
++struct GET_QOS_IN {
++ u32 qos_params_rsvd;
++} __packed;
++
++struct GET_QOS_OUT {
++ u32 max_bits_per_second_NIC;
++ u32 max_packets_per_second_NIC;
++ u32 max_ios_per_second_iSCSI;
++ u32 max_bytes_per_second_iSCSI;
++ u16 domain_VLAN_tag;
++ u16 fabric_domain_ID;
++ u32 qos_params_oem[4];
++} __packed;
++
++union GET_QOS_PARAMS {
++ struct GET_QOS_IN request;
++ struct GET_QOS_OUT response;
++} __packed;
++
++/* QOS/Bandwidth settings per domain. Applicable only in VMs. */
++struct FWCMD_COMMON_GET_QOS {
++ union FWCMD_HEADER header;
++ union GET_QOS_PARAMS params;
++} __packed;
++
++struct SET_QOS_IN {
++ u32 valid_flags;
++ u32 max_bits_per_second_NIC;
++ u32 max_packets_per_second_NIC;
++ u32 max_ios_per_second_iSCSI;
++ u32 max_bytes_per_second_iSCSI;
++ u16 domain_VLAN_tag;
++ u16 fabric_domain_ID;
++ u32 qos_params_oem[4];
++} __packed;
++
++struct SET_QOS_OUT {
++ u32 qos_params_rsvd;
++} __packed;
++
++union SET_QOS_PARAMS {
++ struct SET_QOS_IN request;
++ struct SET_QOS_OUT response;
++} __packed;
++
++/* QOS/Bandwidth settings per domain. Applicable only in VMs. */
++struct FWCMD_COMMON_SET_QOS {
++ union FWCMD_HEADER header;
++ union SET_QOS_PARAMS params;
++} __packed;
++
++struct SET_FRAME_SIZE_IN {
++ u32 max_tx_frame_size;
++ u32 max_rx_frame_size;
++} __packed;
++
++struct SET_FRAME_SIZE_OUT {
++ u32 chip_max_tx_frame_size;
++ u32 chip_max_rx_frame_size;
++} __packed;
++
++union SET_FRAME_SIZE_PARAMS {
++ struct SET_FRAME_SIZE_IN request;
++ struct SET_FRAME_SIZE_OUT response;
++} __packed;
++
++/* Set frame size command. Only host domain may issue this command. */
++struct FWCMD_COMMON_SET_FRAME_SIZE {
++ union FWCMD_HEADER header;
++ union SET_FRAME_SIZE_PARAMS params;
++} __packed;
++
++struct FORCE_FAILOVER_IN {
++ u32 move_to_port;
++ u32 failover_config;
++} __packed;
++
++struct FWCMD_COMMON_ANON_231_RESPONSE {
++ u32 rsvd0;
++} __packed;
++
++union FWCMD_COMMON_ANON_230_PARAMS {
++ struct FORCE_FAILOVER_IN request;
++ struct FWCMD_COMMON_ANON_231_RESPONSE response;
++} __packed;
++
++/*
++ * Use this command to control failover in BladeEngine. It may be used
++ * to failback to a restored port or to forcibly move traffic from
++ * one port to another. It may also be used to enable or disable the
++ * automatic failover feature. This command can only be issued by domain
++ * 0.
++ */
++struct FWCMD_COMMON_FORCE_FAILOVER {
++ union FWCMD_HEADER header;
++ union FWCMD_COMMON_ANON_230_PARAMS params;
++} __packed;
++
++struct FWCMD_COMMON_ANON_240_REQUEST {
++ u64 context;
++} __packed;
++
++struct FWCMD_COMMON_ANON_241_RESPONSE {
++ u64 context;
++} __packed;
++
++union FWCMD_COMMON_ANON_239_PARAMS {
++ struct FWCMD_COMMON_ANON_240_REQUEST request;
++ struct FWCMD_COMMON_ANON_241_RESPONSE response;
++} __packed;
++
++/*
++ * This command can be used by clients as a no-operation request. Typical
++ * uses for drivers are as a heartbeat mechanism, or deferred processing
++ * catalyst. The ARM will always complete this command with a good completion.
++ * The 64-bit parameter is not touched by the ARM processor.
++ */
++struct FWCMD_COMMON_NOP {
++ union FWCMD_HEADER header;
++ union FWCMD_COMMON_ANON_239_PARAMS params;
++} __packed;
++
++struct NTWK_RX_FILTER_SETTINGS {
++ u8 promiscuous;
++ u8 ip_cksum;
++ u8 tcp_cksum;
++ u8 udp_cksum;
++ u8 pass_err;
++ u8 pass_ckerr;
++ u8 strip_crc;
++ u8 mcast_en;
++ u8 bcast_en;
++ u8 mcast_promiscuous_en;
++ u8 unicast_en;
++ u8 vlan_promiscuous;
++} __packed;
++
++union FWCMD_COMMON_ANON_242_PARAMS {
++ struct NTWK_RX_FILTER_SETTINGS request;
++ struct NTWK_RX_FILTER_SETTINGS response;
++} __packed;
++
++/*
++ * This command is used to modify the ethernet receive filter configuration.
++ * Only domain 0 network function drivers may issue this command. The
++ * applied configuration is returned in the response payload. Note:
++ * Some receive packet filter settings are global on BladeEngine and
++ * can affect both the storage and network function clients that the
++ * BladeEngine hardware and firmware serve. Additionaly, depending
++ * on the revision of BladeEngine, some ethernet receive filter settings
++ * are dependent on others. If a dependency exists between settings
++ * for the BladeEngine revision, and the command request settings do
++ * not meet the dependency requirement, the invalid settings will not
++ * be applied despite the comand succeeding. For example: a driver may
++ * request to enable broadcast packets, but not enable multicast packets.
++ * On early revisions of BladeEngine, there may be no distinction between
++ * broadcast and multicast filters, so broadcast could not be enabled
++ * without enabling multicast. In this scenario, the comand would still
++ * succeed, but the response payload would indicate the previously
++ * configured broadcast and multicast setting.
++ */
++struct FWCMD_COMMON_NTWK_RX_FILTER {
++ union FWCMD_HEADER header;
++ union FWCMD_COMMON_ANON_242_PARAMS params;
++} __packed;
++
++
++struct FWCMD_COMMON_ANON_244_REQUEST {
++ u32 rsvd0;
++} __packed;
++
++struct FWCMD_COMMON_GET_FW_VERSION_RESPONSE_PAYLOAD {
++ u8 firmware_version_string[32];
++ u8 fw_on_flash_version_string[32];
++} __packed;
++
++union FWCMD_COMMON_ANON_243_PARAMS {
++ struct FWCMD_COMMON_ANON_244_REQUEST request;
++ struct FWCMD_COMMON_GET_FW_VERSION_RESPONSE_PAYLOAD response;
++} __packed;
++
++/* This comand retrieves the firmware version. */
++struct FWCMD_COMMON_GET_FW_VERSION {
++ union FWCMD_HEADER header;
++ union FWCMD_COMMON_ANON_243_PARAMS params;
++} __packed;
++
++struct FWCMD_COMMON_ANON_246_REQUEST {
++ u16 tx_flow_control;
++ u16 rx_flow_control;
++} __packed;
++
++struct FWCMD_COMMON_ANON_247_RESPONSE {
++ u32 rsvd0;
++} __packed;
++
++union FWCMD_COMMON_ANON_245_PARAMS {
++ struct FWCMD_COMMON_ANON_246_REQUEST request;
++ struct FWCMD_COMMON_ANON_247_RESPONSE response;
++} __packed;
++
++/*
++ * This comand is used to program BladeEngine flow control behavior.
++ * Only the host networking driver is allowed to use this comand.
++ */
++struct FWCMD_COMMON_SET_FLOW_CONTROL {
++ union FWCMD_HEADER header;
++ union FWCMD_COMMON_ANON_245_PARAMS params;
++} __packed;
++
++struct FWCMD_COMMON_ANON_249_REQUEST {
++ u32 rsvd0;
++} __packed;
++
++struct FWCMD_COMMON_ANON_250_RESPONSE {
++ u16 tx_flow_control;
++ u16 rx_flow_control;
++} __packed;
++
++union FWCMD_COMMON_ANON_248_PARAMS {
++ struct FWCMD_COMMON_ANON_249_REQUEST request;
++ struct FWCMD_COMMON_ANON_250_RESPONSE response;
++} __packed;
++
++/* This comand is used to read BladeEngine flow control settings. */
++struct FWCMD_COMMON_GET_FLOW_CONTROL {
++ union FWCMD_HEADER header;
++ union FWCMD_COMMON_ANON_248_PARAMS params;
++} __packed;
++
++struct EQ_DELAY_PARAMS {
++ u32 eq_id;
++ u32 delay_in_microseconds;
++} __packed;
++
++struct FWCMD_COMMON_ANON_257_REQUEST {
++ u32 num_eq;
++ u32 rsvd0;
++ struct EQ_DELAY_PARAMS delay[16];
++} __packed;
++
++struct FWCMD_COMMON_ANON_258_RESPONSE {
++ u32 delay_resolution_in_microseconds;
++ u32 delay_max_in_microseconds;
++} __packed;
++
++union MODIFY_EQ_DELAY_PARAMS {
++ struct FWCMD_COMMON_ANON_257_REQUEST request;
++ struct FWCMD_COMMON_ANON_258_RESPONSE response;
++} __packed;
++
++/* This comand changes the EQ delay for a given set of EQs. */
++struct FWCMD_COMMON_MODIFY_EQ_DELAY {
++ union FWCMD_HEADER header;
++ union MODIFY_EQ_DELAY_PARAMS params;
++} __packed;
++
++struct FWCMD_COMMON_ANON_260_REQUEST {
++ u32 rsvd0;
++} __packed;
++
++struct BE_FIRMWARE_CONFIG {
++ u16 be_config_number;
++ u16 asic_revision;
++ u32 nic_ulp_mask;
++ u32 tulp_mask;
++ u32 iscsi_ulp_mask;
++ u32 rdma_ulp_mask;
++ u32 rsvd0[4];
++ u32 eth_tx_id_start;
++ u32 eth_tx_id_count;
++ u32 eth_rx_id_start;
++ u32 eth_rx_id_count;
++ u32 tpm_wrbq_id_start;
++ u32 tpm_wrbq_id_count;
++ u32 tpm_defq_id_start;
++ u32 tpm_defq_id_count;
++ u32 iscsi_wrbq_id_start;
++ u32 iscsi_wrbq_id_count;
++ u32 iscsi_defq_id_start;
++ u32 iscsi_defq_id_count;
++ u32 rdma_qp_id_start;
++ u32 rdma_qp_id_count;
++ u32 rsvd1[8];
++} __packed;
++
++union FWCMD_COMMON_ANON_259_PARAMS {
++ struct FWCMD_COMMON_ANON_260_REQUEST request;
++ struct BE_FIRMWARE_CONFIG response;
++} __packed;
++
++/*
++ * This comand queries the current firmware configuration parameters.
++ * The static configuration type is defined by be_config_number. This
++ * differentiates different BladeEngine builds, such as iSCSI Initiator
++ * versus iSCSI Target. For a given static configuration, the Upper
++ * Layer Protocol (ULP) processors may be reconfigured to support different
++ * protocols. Each ULP processor supports one or more protocols. The
++ * masks indicate which processors are configured for each protocol.
++ * For a given static configuration, the number of TCP connections
++ * supported for each protocol may vary. The *_id_start and *_id_count
++ * variables define a linear range of IDs that are available for each
++ * supported protocol. The *_id_count may be used by the driver to allocate
++ * the appropriate number of connection resources. The *_id_start may
++ * be used to map the arbitrary range of IDs to a zero-based range
++ * of indices.
++ */
++struct FWCMD_COMMON_FIRMWARE_CONFIG {
++ union FWCMD_HEADER header;
++ union FWCMD_COMMON_ANON_259_PARAMS params;
++} __packed;
++
++struct FWCMD_COMMON_PORT_EQUALIZATION_PARAMS {
++ u32 emph_lev_sel_port0;
++ u32 emph_lev_sel_port1;
++ u8 xaui_vo_sel;
++ u8 xaui_state;
++ u16 rsvd0;
++ u32 xaui_eq_vector;
++} __packed;
++
++struct FWCMD_COMMON_ANON_262_REQUEST {
++ u32 rsvd0;
++} __packed;
++
++union FWCMD_COMMON_ANON_261_PARAMS {
++ struct FWCMD_COMMON_ANON_262_REQUEST request;
++ struct FWCMD_COMMON_PORT_EQUALIZATION_PARAMS response;
++} __packed;
++
++/*
++ * This comand can be used to read XAUI equalization parameters. The
++ * ARM firmware applies default equalization parameters during initialization.
++ * These parameters may be customer-specific when derived from the
++ * SEEPROM. See SEEPROM_DATA for equalization specific fields.
++ */
++struct FWCMD_COMMON_GET_PORT_EQUALIZATION {
++ union FWCMD_HEADER header;
++ union FWCMD_COMMON_ANON_261_PARAMS params;
++} __packed;
++
++struct FWCMD_COMMON_ANON_264_RESPONSE {
++ u32 rsvd0;
++} __packed;
++
++union FWCMD_COMMON_ANON_263_PARAMS {
++ struct FWCMD_COMMON_PORT_EQUALIZATION_PARAMS request;
++ struct FWCMD_COMMON_ANON_264_RESPONSE response;
++} __packed;
++
++/*
++ * This comand can be used to set XAUI equalization parameters. The ARM
++ * firmware applies default equalization parameters during initialization.
++ * These parameters may be customer-specific when derived from the
++ * SEEPROM. See SEEPROM_DATA for equalization specific fields.
++ */
++struct FWCMD_COMMON_SET_PORT_EQUALIZATION {
++ union FWCMD_HEADER header;
++ union FWCMD_COMMON_ANON_263_PARAMS params;
++} __packed;
++
++#endif /* __fwcmd_common_bmap_h__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/fwcmd_common.h linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_common.h
+--- linux-2.6.29.owrt/drivers/staging/benet/fwcmd_common.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_common.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,222 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * Autogenerated by srcgen version: 0127
++ */
++#ifndef __fwcmd_common_amap_h__
++#define __fwcmd_common_amap_h__
++#include "host_struct.h"
++
++/* --- PHY_LINK_DUPLEX_ENUM --- */
++#define PHY_LINK_DUPLEX_NONE (0)
++#define PHY_LINK_DUPLEX_HALF (1)
++#define PHY_LINK_DUPLEX_FULL (2)
++
++/* --- PHY_LINK_SPEED_ENUM --- */
++#define PHY_LINK_SPEED_ZERO (0) /* No link. */
++#define PHY_LINK_SPEED_10MBPS (1) /* 10 Mbps */
++#define PHY_LINK_SPEED_100MBPS (2) /* 100 Mbps */
++#define PHY_LINK_SPEED_1GBPS (3) /* 1 Gbps */
++#define PHY_LINK_SPEED_10GBPS (4) /* 10 Gbps */
++
++/* --- PHY_LINK_FAULT_ENUM --- */
++#define PHY_LINK_FAULT_NONE (0) /* No fault status
++ available or detected */
++#define PHY_LINK_FAULT_LOCAL (1) /* Local fault detected */
++#define PHY_LINK_FAULT_REMOTE (2) /* Remote fault detected */
++
++/* --- BE_ULP_MASK --- */
++#define BE_ULP0_MASK (1)
++#define BE_ULP1_MASK (2)
++#define BE_ULP2_MASK (4)
++
++/* --- NTWK_ACTIVE_PORT --- */
++#define NTWK_PORT_A (0) /* Port A is currently active */
++#define NTWK_PORT_B (1) /* Port B is currently active */
++#define NTWK_NO_ACTIVE_PORT (15) /* Both ports have lost link */
++
++/* --- NTWK_LINK_TYPE --- */
++#define NTWK_LINK_TYPE_PHYSICAL (0) /* link up/down event
++ applies to BladeEngine's
++ Physical Ports
++ */
++#define NTWK_LINK_TYPE_VIRTUAL (1) /* Virtual link up/down event
++ reported by BladeExchange.
++ This applies only when the
++ VLD feature is enabled
++ */
++
++/*
++ * --- FWCMD_MAC_TYPE_ENUM ---
++ * This enum defines the types of MAC addresses in the RXF MAC Address Table.
++ */
++#define MAC_ADDRESS_TYPE_STORAGE (0) /* Storage MAC Address */
++#define MAC_ADDRESS_TYPE_NETWORK (1) /* Network MAC Address */
++#define MAC_ADDRESS_TYPE_PD (2) /* Protection Domain MAC Addr */
++#define MAC_ADDRESS_TYPE_MANAGEMENT (3) /* Managment MAC Address */
++
++
++/* --- FWCMD_RING_TYPE_ENUM --- */
++#define FWCMD_RING_TYPE_ETH_RX (1) /* Ring created with */
++ /* FWCMD_COMMON_ETH_RX_CREATE. */
++#define FWCMD_RING_TYPE_ETH_TX (2) /* Ring created with */
++ /* FWCMD_COMMON_ETH_TX_CREATE. */
++#define FWCMD_RING_TYPE_ISCSI_WRBQ (3) /* Ring created with */
++ /* FWCMD_COMMON_ISCSI_WRBQ_CREATE. */
++#define FWCMD_RING_TYPE_ISCSI_DEFQ (4) /* Ring created with */
++ /* FWCMD_COMMON_ISCSI_DEFQ_CREATE. */
++#define FWCMD_RING_TYPE_TPM_WRBQ (5) /* Ring created with */
++ /* FWCMD_COMMON_TPM_WRBQ_CREATE. */
++#define FWCMD_RING_TYPE_TPM_DEFQ (6) /* Ring created with */
++ /* FWCMD_COMMONTPM_TDEFQ_CREATE. */
++#define FWCMD_RING_TYPE_TPM_RQ (7) /* Ring created with */
++ /* FWCMD_COMMON_TPM_RQ_CREATE. */
++#define FWCMD_RING_TYPE_MCC (8) /* Ring created with */
++ /* FWCMD_COMMON_MCC_CREATE. */
++#define FWCMD_RING_TYPE_CQ (9) /* Ring created with */
++ /* FWCMD_COMMON_CQ_CREATE. */
++#define FWCMD_RING_TYPE_EQ (10) /* Ring created with */
++ /* FWCMD_COMMON_EQ_CREATE. */
++#define FWCMD_RING_TYPE_QP (11) /* Ring created with */
++ /* FWCMD_RDMA_QP_CREATE. */
++
++
++/* --- ETH_TX_RING_TYPE_ENUM --- */
++#define ETH_TX_RING_TYPE_FORWARDING (1) /* Ethernet ring for
++ forwarding packets */
++#define ETH_TX_RING_TYPE_STANDARD (2) /* Ethernet ring for sending
++ network packets. */
++#define ETH_TX_RING_TYPE_BOUND (3) /* Ethernet ring bound to the
++ port specified in the command
++ header.port_number field.
++ Rings of this type are
++ NOT subject to the
++ failover logic implemented
++ in the BladeEngine.
++ */
++
++/* --- FWCMD_COMMON_QOS_TYPE_ENUM --- */
++#define QOS_BITS_NIC (1) /* max_bits_per_second_NIC */
++ /* field is valid. */
++#define QOS_PKTS_NIC (2) /* max_packets_per_second_NIC */
++ /* field is valid. */
++#define QOS_IOPS_ISCSI (4) /* max_ios_per_second_iSCSI */
++ /*field is valid. */
++#define QOS_VLAN_TAG (8) /* domain_VLAN_tag field
++ is valid. */
++#define QOS_FABRIC_ID (16) /* fabric_domain_ID field
++ is valid. */
++#define QOS_OEM_PARAMS (32) /* qos_params_oem field
++ is valid. */
++#define QOS_TPUT_ISCSI (64) /* max_bytes_per_second_iSCSI
++ field is valid. */
++
++
++/*
++ * --- FAILOVER_CONFIG_ENUM ---
++ * Failover configuration setting used in FWCMD_COMMON_FORCE_FAILOVER
++ */
++#define FAILOVER_CONFIG_NO_CHANGE (0) /* No change to automatic */
++ /* port failover setting. */
++#define FAILOVER_CONFIG_ON (1) /* Automatic port failover
++ on link down is enabled. */
++#define FAILOVER_CONFIG_OFF (2) /* Automatic port failover
++ on link down is disabled. */
++
++/*
++ * --- FAILOVER_PORT_ENUM ---
++ * Failover port setting used in FWCMD_COMMON_FORCE_FAILOVER
++ */
++#define FAILOVER_PORT_A (0) /* Selects port A. */
++#define FAILOVER_PORT_B (1) /* Selects port B. */
++#define FAILOVER_PORT_NONE (15) /* No port change requested. */
++
++
++/*
++ * --- MGMT_FLASHROM_OPCODE ---
++ * Flash ROM operation code
++ */
++#define MGMT_FLASHROM_OPCODE_FLASH (1) /* Commit downloaded data
++ to Flash ROM */
++#define MGMT_FLASHROM_OPCODE_SAVE (2) /* Save downloaded data to
++ ARM's DDR - do not flash */
++#define MGMT_FLASHROM_OPCODE_CLEAR (3) /* Erase specified component
++ from FlashROM */
++#define MGMT_FLASHROM_OPCODE_REPORT (4) /* Read specified component
++ from Flash ROM */
++#define MGMT_FLASHROM_OPCODE_IMAGE_INFO (5) /* Returns size of a
++ component */
++
++/*
++ * --- MGMT_FLASHROM_OPTYPE ---
++ * Flash ROM operation type
++ */
++#define MGMT_FLASHROM_OPTYPE_CODE_FIRMWARE (0) /* Includes ARM firmware,
++ IPSec (optional) and EP
++ firmware */
++#define MGMT_FLASHROM_OPTYPE_CODE_REDBOOT (1)
++#define MGMT_FLASHROM_OPTYPE_CODE_BIOS (2)
++#define MGMT_FLASHROM_OPTYPE_CODE_PXE_BIOS (3)
++#define MGMT_FLASHROM_OPTYPE_CODE_CTRLS (4)
++#define MGMT_FLASHROM_OPTYPE_CFG_IPSEC (5)
++#define MGMT_FLASHROM_OPTYPE_CFG_INI (6)
++#define MGMT_FLASHROM_OPTYPE_ROM_OFFSET_SPECIFIED (7)
++
++/*
++ * --- FLASHROM_TYPE ---
++ * Flash ROM manufacturers supported in the f/w
++ */
++#define INTEL (0)
++#define SPANSION (1)
++#define MICRON (2)
++
++/* --- DDR_CAS_TYPE --- */
++#define CAS_3 (0)
++#define CAS_4 (1)
++#define CAS_5 (2)
++
++/* --- DDR_SIZE_TYPE --- */
++#define SIZE_256MB (0)
++#define SIZE_512MB (1)
++
++/* --- DDR_MODE_TYPE --- */
++#define DDR_NO_ECC (0)
++#define DDR_ECC (1)
++
++/* --- INTERFACE_10GB_TYPE --- */
++#define CX4_TYPE (0)
++#define XFP_TYPE (1)
++
++/* --- BE_CHIP_MAX_MTU --- */
++#define CHIP_MAX_MTU (9000)
++
++/* --- XAUI_STATE_ENUM --- */
++#define XAUI_STATE_ENABLE (0) /* This MUST be the default
++ value for all requests
++ which set/change
++ equalization parameter. */
++#define XAUI_STATE_DISABLE (255) /* The XAUI for both ports
++ may be disabled for EMI
++ tests. There is no
++ provision for turning off
++ individual ports.
++ */
++/* --- BE_ASIC_REVISION --- */
++#define BE_ASIC_REV_A0 (1)
++#define BE_ASIC_REV_A1 (2)
++
++#endif /* __fwcmd_common_amap_h__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/fwcmd_eth_bmap.h linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_eth_bmap.h
+--- linux-2.6.29.owrt/drivers/staging/benet/fwcmd_eth_bmap.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_eth_bmap.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,280 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * Autogenerated by srcgen version: 0127
++ */
++#ifndef __fwcmd_eth_bmap_h__
++#define __fwcmd_eth_bmap_h__
++#include "fwcmd_hdr_bmap.h"
++#include "fwcmd_types_bmap.h"
++
++struct MIB_ETH_STATISTICS_PARAMS_IN {
++ u32 rsvd0;
++} __packed;
++
++struct BE_RXF_STATS {
++ u32 p0recvdtotalbytesLSD; /* DWORD 0 */
++ u32 p0recvdtotalbytesMSD; /* DWORD 1 */
++ u32 p0recvdtotalframes; /* DWORD 2 */
++ u32 p0recvdunicastframes; /* DWORD 3 */
++ u32 p0recvdmulticastframes; /* DWORD 4 */
++ u32 p0recvdbroadcastframes; /* DWORD 5 */
++ u32 p0crcerrors; /* DWORD 6 */
++ u32 p0alignmentsymerrs; /* DWORD 7 */
++ u32 p0pauseframesrecvd; /* DWORD 8 */
++ u32 p0controlframesrecvd; /* DWORD 9 */
++ u32 p0inrangelenerrors; /* DWORD 10 */
++ u32 p0outrangeerrors; /* DWORD 11 */
++ u32 p0frametoolongerrors; /* DWORD 12 */
++ u32 p0droppedaddressmatch; /* DWORD 13 */
++ u32 p0droppedvlanmismatch; /* DWORD 14 */
++ u32 p0ipdroppedtoosmall; /* DWORD 15 */
++ u32 p0ipdroppedtooshort; /* DWORD 16 */
++ u32 p0ipdroppedhdrtoosmall; /* DWORD 17 */
++ u32 p0tcpdroppedlen; /* DWORD 18 */
++ u32 p0droppedrunt; /* DWORD 19 */
++ u32 p0recvd64; /* DWORD 20 */
++ u32 p0recvd65_127; /* DWORD 21 */
++ u32 p0recvd128_256; /* DWORD 22 */
++ u32 p0recvd256_511; /* DWORD 23 */
++ u32 p0recvd512_1023; /* DWORD 24 */
++ u32 p0recvd1518_1522; /* DWORD 25 */
++ u32 p0recvd1522_2047; /* DWORD 26 */
++ u32 p0recvd2048_4095; /* DWORD 27 */
++ u32 p0recvd4096_8191; /* DWORD 28 */
++ u32 p0recvd8192_9216; /* DWORD 29 */
++ u32 p0rcvdipcksmerrs; /* DWORD 30 */
++ u32 p0recvdtcpcksmerrs; /* DWORD 31 */
++ u32 p0recvdudpcksmerrs; /* DWORD 32 */
++ u32 p0recvdnonrsspackets; /* DWORD 33 */
++ u32 p0recvdippackets; /* DWORD 34 */
++ u32 p0recvdchute1packets; /* DWORD 35 */
++ u32 p0recvdchute2packets; /* DWORD 36 */
++ u32 p0recvdchute3packets; /* DWORD 37 */
++ u32 p0recvdipsecpackets; /* DWORD 38 */
++ u32 p0recvdmanagementpackets; /* DWORD 39 */
++ u32 p0xmitbyteslsd; /* DWORD 40 */
++ u32 p0xmitbytesmsd; /* DWORD 41 */
++ u32 p0xmitunicastframes; /* DWORD 42 */
++ u32 p0xmitmulticastframes; /* DWORD 43 */
++ u32 p0xmitbroadcastframes; /* DWORD 44 */
++ u32 p0xmitpauseframes; /* DWORD 45 */
++ u32 p0xmitcontrolframes; /* DWORD 46 */
++ u32 p0xmit64; /* DWORD 47 */
++ u32 p0xmit65_127; /* DWORD 48 */
++ u32 p0xmit128_256; /* DWORD 49 */
++ u32 p0xmit256_511; /* DWORD 50 */
++ u32 p0xmit512_1023; /* DWORD 51 */
++ u32 p0xmit1518_1522; /* DWORD 52 */
++ u32 p0xmit1522_2047; /* DWORD 53 */
++ u32 p0xmit2048_4095; /* DWORD 54 */
++ u32 p0xmit4096_8191; /* DWORD 55 */
++ u32 p0xmit8192_9216; /* DWORD 56 */
++ u32 p0rxfifooverflowdropped; /* DWORD 57 */
++ u32 p0ipseclookupfaileddropped; /* DWORD 58 */
++ u32 p1recvdtotalbytesLSD; /* DWORD 59 */
++ u32 p1recvdtotalbytesMSD; /* DWORD 60 */
++ u32 p1recvdtotalframes; /* DWORD 61 */
++ u32 p1recvdunicastframes; /* DWORD 62 */
++ u32 p1recvdmulticastframes; /* DWORD 63 */
++ u32 p1recvdbroadcastframes; /* DWORD 64 */
++ u32 p1crcerrors; /* DWORD 65 */
++ u32 p1alignmentsymerrs; /* DWORD 66 */
++ u32 p1pauseframesrecvd; /* DWORD 67 */
++ u32 p1controlframesrecvd; /* DWORD 68 */
++ u32 p1inrangelenerrors; /* DWORD 69 */
++ u32 p1outrangeerrors; /* DWORD 70 */
++ u32 p1frametoolongerrors; /* DWORD 71 */
++ u32 p1droppedaddressmatch; /* DWORD 72 */
++ u32 p1droppedvlanmismatch; /* DWORD 73 */
++ u32 p1ipdroppedtoosmall; /* DWORD 74 */
++ u32 p1ipdroppedtooshort; /* DWORD 75 */
++ u32 p1ipdroppedhdrtoosmall; /* DWORD 76 */
++ u32 p1tcpdroppedlen; /* DWORD 77 */
++ u32 p1droppedrunt; /* DWORD 78 */
++ u32 p1recvd64; /* DWORD 79 */
++ u32 p1recvd65_127; /* DWORD 80 */
++ u32 p1recvd128_256; /* DWORD 81 */
++ u32 p1recvd256_511; /* DWORD 82 */
++ u32 p1recvd512_1023; /* DWORD 83 */
++ u32 p1recvd1518_1522; /* DWORD 84 */
++ u32 p1recvd1522_2047; /* DWORD 85 */
++ u32 p1recvd2048_4095; /* DWORD 86 */
++ u32 p1recvd4096_8191; /* DWORD 87 */
++ u32 p1recvd8192_9216; /* DWORD 88 */
++ u32 p1rcvdipcksmerrs; /* DWORD 89 */
++ u32 p1recvdtcpcksmerrs; /* DWORD 90 */
++ u32 p1recvdudpcksmerrs; /* DWORD 91 */
++ u32 p1recvdnonrsspackets; /* DWORD 92 */
++ u32 p1recvdippackets; /* DWORD 93 */
++ u32 p1recvdchute1packets; /* DWORD 94 */
++ u32 p1recvdchute2packets; /* DWORD 95 */
++ u32 p1recvdchute3packets; /* DWORD 96 */
++ u32 p1recvdipsecpackets; /* DWORD 97 */
++ u32 p1recvdmanagementpackets; /* DWORD 98 */
++ u32 p1xmitbyteslsd; /* DWORD 99 */
++ u32 p1xmitbytesmsd; /* DWORD 100 */
++ u32 p1xmitunicastframes; /* DWORD 101 */
++ u32 p1xmitmulticastframes; /* DWORD 102 */
++ u32 p1xmitbroadcastframes; /* DWORD 103 */
++ u32 p1xmitpauseframes; /* DWORD 104 */
++ u32 p1xmitcontrolframes; /* DWORD 105 */
++ u32 p1xmit64; /* DWORD 106 */
++ u32 p1xmit65_127; /* DWORD 107 */
++ u32 p1xmit128_256; /* DWORD 108 */
++ u32 p1xmit256_511; /* DWORD 109 */
++ u32 p1xmit512_1023; /* DWORD 110 */
++ u32 p1xmit1518_1522; /* DWORD 111 */
++ u32 p1xmit1522_2047; /* DWORD 112 */
++ u32 p1xmit2048_4095; /* DWORD 113 */
++ u32 p1xmit4096_8191; /* DWORD 114 */
++ u32 p1xmit8192_9216; /* DWORD 115 */
++ u32 p1rxfifooverflowdropped; /* DWORD 116 */
++ u32 p1ipseclookupfaileddropped; /* DWORD 117 */
++ u32 pxdroppednopbuf; /* DWORD 118 */
++ u32 pxdroppednotxpb; /* DWORD 119 */
++ u32 pxdroppednoipsecbuf; /* DWORD 120 */
++ u32 pxdroppednoerxdescr; /* DWORD 121 */
++ u32 pxdroppednotpredescr; /* DWORD 122 */
++ u32 pxrecvdmanagementportpackets; /* DWORD 123 */
++ u32 pxrecvdmanagementportbytes; /* DWORD 124 */
++ u32 pxrecvdmanagementportpauseframes; /* DWORD 125 */
++ u32 pxrecvdmanagementporterrors; /* DWORD 126 */
++ u32 pxxmitmanagementportpackets; /* DWORD 127 */
++ u32 pxxmitmanagementportbytes; /* DWORD 128 */
++ u32 pxxmitmanagementportpause; /* DWORD 129 */
++ u32 pxxmitmanagementportrxfifooverflow; /* DWORD 130 */
++ u32 pxrecvdipsecipcksmerrs; /* DWORD 131 */
++ u32 pxrecvdtcpsecipcksmerrs; /* DWORD 132 */
++ u32 pxrecvdudpsecipcksmerrs; /* DWORD 133 */
++ u32 pxipsecrunt; /* DWORD 134 */
++ u32 pxipsecaddressmismatchdropped; /* DWORD 135 */
++ u32 pxipsecrxfifooverflowdropped; /* DWORD 136 */
++ u32 pxipsecframestoolong; /* DWORD 137 */
++ u32 pxipsectotalipframes; /* DWORD 138 */
++ u32 pxipseciptoosmall; /* DWORD 139 */
++ u32 pxipseciptooshort; /* DWORD 140 */
++ u32 pxipseciphdrtoosmall; /* DWORD 141 */
++ u32 pxipsectcphdrbad; /* DWORD 142 */
++ u32 pxrecvdipsecchute1; /* DWORD 143 */
++ u32 pxrecvdipsecchute2; /* DWORD 144 */
++ u32 pxrecvdipsecchute3; /* DWORD 145 */
++ u32 pxdropped7frags; /* DWORD 146 */
++ u32 pxdroppedfrags; /* DWORD 147 */
++ u32 pxdroppedinvalidfragring; /* DWORD 148 */
++ u32 pxnumforwardedpackets; /* DWORD 149 */
++} __packed;
++
++union MIB_ETH_STATISTICS_PARAMS {
++ struct MIB_ETH_STATISTICS_PARAMS_IN request;
++ struct BE_RXF_STATS response;
++} __packed;
++
++/*
++ * Query ethernet statistics. All domains may issue this command. The
++ * host domain drivers may optionally reset internal statistic counters
++ * with a query.
++ */
++struct FWCMD_ETH_GET_STATISTICS {
++ union FWCMD_HEADER header;
++ union MIB_ETH_STATISTICS_PARAMS params;
++} __packed;
++
++
++struct FWCMD_ETH_ANON_175_REQUEST {
++ u8 port0_promiscuous;
++ u8 port1_promiscuous;
++ u16 rsvd0;
++} __packed;
++
++struct FWCMD_ETH_ANON_176_RESPONSE {
++ u32 rsvd0;
++} __packed;
++
++union FWCMD_ETH_ANON_174_PARAMS {
++ struct FWCMD_ETH_ANON_175_REQUEST request;
++ struct FWCMD_ETH_ANON_176_RESPONSE response;
++} __packed;
++
++/* Enables/Disables promiscuous ethernet receive mode. */
++struct FWCMD_ETH_PROMISCUOUS {
++ union FWCMD_HEADER header;
++ union FWCMD_ETH_ANON_174_PARAMS params;
++} __packed;
++
++struct FWCMD_ETH_ANON_178_REQUEST {
++ u32 new_fragsize_log2;
++} __packed;
++
++struct FWCMD_ETH_ANON_179_RESPONSE {
++ u32 actual_fragsize_log2;
++} __packed;
++
++union FWCMD_ETH_ANON_177_PARAMS {
++ struct FWCMD_ETH_ANON_178_REQUEST request;
++ struct FWCMD_ETH_ANON_179_RESPONSE response;
++} __packed;
++
++/*
++ * Sets the Ethernet RX fragment size. Only host (domain 0) networking
++ * drivers may issue this command. This call will fail for non-host
++ * protection domains. In this situation the MCC CQ status will indicate
++ * a failure due to insufficient priviledges. The response should be
++ * ignored, and the driver should use the FWCMD_ETH_GET_FRAG_SIZE to
++ * query the existing ethernet receive fragment size. It must use this
++ * fragment size for all fragments in the ethernet receive ring. If
++ * the command succeeds, the driver must use the frag size indicated
++ * in the command response since the requested frag size may not be applied
++ * until the next reboot. When the requested fragsize matches the response
++ * fragsize, this indicates the request was applied immediately.
++ */
++struct FWCMD_ETH_SET_RX_FRAG_SIZE {
++ union FWCMD_HEADER header;
++ union FWCMD_ETH_ANON_177_PARAMS params;
++} __packed;
++
++struct FWCMD_ETH_ANON_181_REQUEST {
++ u32 rsvd0;
++} __packed;
++
++struct FWCMD_ETH_ANON_182_RESPONSE {
++ u32 actual_fragsize_log2;
++} __packed;
++
++union FWCMD_ETH_ANON_180_PARAMS {
++ struct FWCMD_ETH_ANON_181_REQUEST request;
++ struct FWCMD_ETH_ANON_182_RESPONSE response;
++} __packed;
++
++/*
++ * Queries the Ethernet RX fragment size. All domains may issue this
++ * command. The driver should call this command to determine the minimum
++ * required fragment size for the ethernet RX ring buffers. Drivers
++ * may choose to use a larger size for each fragment buffer, but BladeEngine
++ * will use up to the configured minimum required fragsize in each ethernet
++ * receive fragment buffer. For example, if the ethernet receive fragment
++ * size is configured to 4kB, and a driver uses 8kB fragments, a 6kB
++ * ethernet packet received by BladeEngine will be split accross two
++ * of the driver's receive framgents (4kB in one fragment buffer, and
++ * 2kB in the subsequent fragment buffer).
++ */
++struct FWCMD_ETH_GET_RX_FRAG_SIZE {
++ union FWCMD_HEADER header;
++ union FWCMD_ETH_ANON_180_PARAMS params;
++} __packed;
++
++#endif /* __fwcmd_eth_bmap_h__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/fwcmd_hdr_bmap.h linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_hdr_bmap.h
+--- linux-2.6.29.owrt/drivers/staging/benet/fwcmd_hdr_bmap.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_hdr_bmap.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,54 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * Autogenerated by srcgen version: 0127
++ */
++#ifndef __fwcmd_hdr_bmap_h__
++#define __fwcmd_hdr_bmap_h__
++
++struct FWCMD_REQUEST_HEADER {
++ u8 opcode;
++ u8 subsystem;
++ u8 port_number;
++ u8 domain;
++ u32 timeout;
++ u32 request_length;
++ u32 rsvd0;
++} __packed;
++
++struct FWCMD_RESPONSE_HEADER {
++ u8 opcode;
++ u8 subsystem;
++ u8 rsvd0;
++ u8 domain;
++ u8 status;
++ u8 additional_status;
++ u16 rsvd1;
++ u32 response_length;
++ u32 actual_response_length;
++} __packed;
++
++/*
++ * The firmware/driver overwrites the input FWCMD_REQUEST_HEADER with
++ * the output FWCMD_RESPONSE_HEADER.
++ */
++union FWCMD_HEADER {
++ struct FWCMD_REQUEST_HEADER request;
++ struct FWCMD_RESPONSE_HEADER response;
++} __packed;
++
++#endif /* __fwcmd_hdr_bmap_h__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/fwcmd_mcc.h linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_mcc.h
+--- linux-2.6.29.owrt/drivers/staging/benet/fwcmd_mcc.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_mcc.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,94 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * Autogenerated by srcgen version: 0127
++ */
++#ifndef __fwcmd_mcc_amap_h__
++#define __fwcmd_mcc_amap_h__
++#include "fwcmd_opcodes.h"
++/*
++ * Where applicable, a WRB, may contain a list of Scatter-gather elements.
++ * Each element supports a 64 bit address and a 32bit length field.
++ */
++struct BE_MCC_SGE_AMAP {
++ u8 pa_lo[32]; /* DWORD 0 */
++ u8 pa_hi[32]; /* DWORD 1 */
++ u8 length[32]; /* DWORD 2 */
++} __packed;
++struct MCC_SGE_AMAP {
++ u32 dw[3];
++};
++/*
++ * The design of an MCC_SGE allows up to 19 elements to be embedded
++ * in a WRB, supporting 64KB data transfers (assuming a 4KB page size).
++ */
++struct BE_MCC_WRB_PAYLOAD_AMAP {
++ union {
++ struct BE_MCC_SGE_AMAP sgl[19];
++ u8 embedded[59][32]; /* DWORD 0 */
++ };
++} __packed;
++struct MCC_WRB_PAYLOAD_AMAP {
++ u32 dw[59];
++};
++
++/*
++ * This is the structure of the MCC Command WRB for commands
++ * sent to the Management Processing Unit (MPU). See section
++ * for usage in embedded and non-embedded modes.
++ */
++struct BE_MCC_WRB_AMAP {
++ u8 embedded; /* DWORD 0 */
++ u8 rsvd0[2]; /* DWORD 0 */
++ u8 sge_count[5]; /* DWORD 0 */
++ u8 rsvd1[16]; /* DWORD 0 */
++ u8 special[8]; /* DWORD 0 */
++ u8 payload_length[32]; /* DWORD 1 */
++ u8 tag[2][32]; /* DWORD 2 */
++ u8 rsvd2[32]; /* DWORD 4 */
++ struct BE_MCC_WRB_PAYLOAD_AMAP payload;
++} __packed;
++struct MCC_WRB_AMAP {
++ u32 dw[64];
++};
++
++/* This is the structure of the MCC Completion queue entry */
++struct BE_MCC_CQ_ENTRY_AMAP {
++ u8 completion_status[16]; /* DWORD 0 */
++ u8 extended_status[16]; /* DWORD 0 */
++ u8 mcc_tag[2][32]; /* DWORD 1 */
++ u8 rsvd0[27]; /* DWORD 3 */
++ u8 consumed; /* DWORD 3 */
++ u8 completed; /* DWORD 3 */
++ u8 hpi_buffer_completion; /* DWORD 3 */
++ u8 async_event; /* DWORD 3 */
++ u8 valid; /* DWORD 3 */
++} __packed;
++struct MCC_CQ_ENTRY_AMAP {
++ u32 dw[4];
++};
++
++/* Mailbox structures used by the MPU during bootstrap */
++struct BE_MCC_MAILBOX_AMAP {
++ struct BE_MCC_WRB_AMAP wrb;
++ struct BE_MCC_CQ_ENTRY_AMAP cq;
++} __packed;
++struct MCC_MAILBOX_AMAP {
++ u32 dw[68];
++};
++
++#endif /* __fwcmd_mcc_amap_h__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/fwcmd_opcodes.h linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_opcodes.h
+--- linux-2.6.29.owrt/drivers/staging/benet/fwcmd_opcodes.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_opcodes.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,244 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * Autogenerated by srcgen version: 0127
++ */
++#ifndef __fwcmd_opcodes_amap_h__
++#define __fwcmd_opcodes_amap_h__
++
++/*
++ * --- FWCMD_SUBSYSTEMS ---
++ * The commands are grouped into the following subsystems. The subsystem
++ * code along with the opcode uniquely identify a particular fwcmd.
++ */
++#define FWCMD_SUBSYSTEM_RSVD (0) /* This subsystem is reserved. It is */
++ /* never used. */
++#define FWCMD_SUBSYSTEM_COMMON (1) /* CMDs in this group are common to
++ * all subsystems. See
++ * COMMON_SUBSYSTEM_OPCODES for opcodes
++ * and Common Host Configuration CMDs
++ * for the FWCMD descriptions.
++ */
++#define FWCMD_SUBSYSTEM_COMMON_ISCSI (2) /* CMDs in this group are */
++ /*
++ * common to Initiator and Target. See
++ * COMMON_ISCSI_SUBSYSTEM_OPCODES and
++ * Common iSCSI Initiator and Target
++ * CMDs for the command descriptions.
++ */
++#define FWCMD_SUBSYSTEM_ETH (3) /* This subsystem is used to
++ execute Ethernet commands. */
++
++#define FWCMD_SUBSYSTEM_TPM (4) /* This subsystem is used
++ to execute TPM commands. */
++#define FWCMD_SUBSYSTEM_PXE_UNDI (5) /* This subsystem is used
++ * to execute PXE
++ * and UNDI specific commands.
++ */
++
++#define FWCMD_SUBSYSTEM_ISCSI_INI (6) /* This subsystem is used to
++ execute ISCSI Initiator
++ specific commands.
++ */
++#define FWCMD_SUBSYSTEM_ISCSI_TGT (7) /* This subsystem is used
++ to execute iSCSI Target
++ specific commands.between
++ PTL and ARM firmware.
++ */
++#define FWCMD_SUBSYSTEM_MILI_PTL (8) /* This subsystem is used to
++ execute iSCSI Target specific
++ commands.between MILI
++ and PTL. */
++#define FWCMD_SUBSYSTEM_MILI_TMD (9) /* This subsystem is used to
++ execute iSCSI Target specific
++ commands between MILI
++ and TMD. */
++#define FWCMD_SUBSYSTEM_PROXY (11) /* This subsystem is used
++ to execute proxied commands
++ within the host at the
++ explicit request of a
++ non priviledged domain.
++ This 'subsystem' is entirely
++ virtual from the controller
++ and firmware perspective as
++ it is implemented in host
++ drivers.
++ */
++
++/*
++ * --- COMMON_SUBSYSTEM_OPCODES ---
++ * These opcodes are common to both networking and storage PCI
++ * functions. They are used to reserve resources and configure
++ * BladeEngine. These opcodes all use the FWCMD_SUBSYSTEM_COMMON
++ * subsystem code.
++ */
++#define OPCODE_COMMON_NTWK_MAC_QUERY (1)
++#define SUBSYSTEM_COMMON_NTWK_MAC_QUERY (1)
++#define SUBSYSTEM_COMMON_NTWK_MAC_SET (1)
++#define SUBSYSTEM_COMMON_NTWK_MULTICAST_SET (1)
++#define SUBSYSTEM_COMMON_NTWK_VLAN_CONFIG (1)
++#define SUBSYSTEM_COMMON_NTWK_LINK_STATUS_QUERY (1)
++#define SUBSYSTEM_COMMON_READ_FLASHROM (1)
++#define SUBSYSTEM_COMMON_WRITE_FLASHROM (1)
++#define SUBSYSTEM_COMMON_QUERY_MAX_FWCMD_BUFFER_SIZE (1)
++#define SUBSYSTEM_COMMON_ADD_PAGE_TABLES (1)
++#define SUBSYSTEM_COMMON_REMOVE_PAGE_TABLES (1)
++#define SUBSYSTEM_COMMON_RING_DESTROY (1)
++#define SUBSYSTEM_COMMON_CQ_CREATE (1)
++#define SUBSYSTEM_COMMON_EQ_CREATE (1)
++#define SUBSYSTEM_COMMON_ETH_RX_CREATE (1)
++#define SUBSYSTEM_COMMON_ETH_TX_CREATE (1)
++#define SUBSYSTEM_COMMON_ISCSI_DEFQ_CREATE (1)
++#define SUBSYSTEM_COMMON_ISCSI_WRBQ_CREATE (1)
++#define SUBSYSTEM_COMMON_MCC_CREATE (1)
++#define SUBSYSTEM_COMMON_JELL_CONFIG (1)
++#define SUBSYSTEM_COMMON_FORCE_FAILOVER (1)
++#define SUBSYSTEM_COMMON_ADD_TEMPLATE_HEADER_BUFFERS (1)
++#define SUBSYSTEM_COMMON_REMOVE_TEMPLATE_HEADER_BUFFERS (1)
++#define SUBSYSTEM_COMMON_POST_ZERO_BUFFER (1)
++#define SUBSYSTEM_COMMON_GET_QOS (1)
++#define SUBSYSTEM_COMMON_SET_QOS (1)
++#define SUBSYSTEM_COMMON_TCP_GET_STATISTICS (1)
++#define SUBSYSTEM_COMMON_SEEPROM_READ (1)
++#define SUBSYSTEM_COMMON_TCP_STATE_QUERY (1)
++#define SUBSYSTEM_COMMON_GET_CNTL_ATTRIBUTES (1)
++#define SUBSYSTEM_COMMON_NOP (1)
++#define SUBSYSTEM_COMMON_NTWK_RX_FILTER (1)
++#define SUBSYSTEM_COMMON_GET_FW_VERSION (1)
++#define SUBSYSTEM_COMMON_SET_FLOW_CONTROL (1)
++#define SUBSYSTEM_COMMON_GET_FLOW_CONTROL (1)
++#define SUBSYSTEM_COMMON_SET_TCP_PARAMETERS (1)
++#define SUBSYSTEM_COMMON_SET_FRAME_SIZE (1)
++#define SUBSYSTEM_COMMON_GET_FAT (1)
++#define SUBSYSTEM_COMMON_MODIFY_EQ_DELAY (1)
++#define SUBSYSTEM_COMMON_FIRMWARE_CONFIG (1)
++#define SUBSYSTEM_COMMON_ENABLE_DISABLE_DOMAINS (1)
++#define SUBSYSTEM_COMMON_GET_DOMAIN_CONFIG (1)
++#define SUBSYSTEM_COMMON_SET_VLD_CONFIG (1)
++#define SUBSYSTEM_COMMON_GET_VLD_CONFIG (1)
++#define SUBSYSTEM_COMMON_GET_PORT_EQUALIZATION (1)
++#define SUBSYSTEM_COMMON_SET_PORT_EQUALIZATION (1)
++#define SUBSYSTEM_COMMON_RED_CONFIG (1)
++#define OPCODE_COMMON_NTWK_MAC_SET (2)
++#define OPCODE_COMMON_NTWK_MULTICAST_SET (3)
++#define OPCODE_COMMON_NTWK_VLAN_CONFIG (4)
++#define OPCODE_COMMON_NTWK_LINK_STATUS_QUERY (5)
++#define OPCODE_COMMON_READ_FLASHROM (6)
++#define OPCODE_COMMON_WRITE_FLASHROM (7)
++#define OPCODE_COMMON_QUERY_MAX_FWCMD_BUFFER_SIZE (8)
++#define OPCODE_COMMON_ADD_PAGE_TABLES (9)
++#define OPCODE_COMMON_REMOVE_PAGE_TABLES (10)
++#define OPCODE_COMMON_RING_DESTROY (11)
++#define OPCODE_COMMON_CQ_CREATE (12)
++#define OPCODE_COMMON_EQ_CREATE (13)
++#define OPCODE_COMMON_ETH_RX_CREATE (14)
++#define OPCODE_COMMON_ETH_TX_CREATE (15)
++#define OPCODE_COMMON_NET_RESERVED0 (16) /* Reserved */
++#define OPCODE_COMMON_NET_RESERVED1 (17) /* Reserved */
++#define OPCODE_COMMON_NET_RESERVED2 (18) /* Reserved */
++#define OPCODE_COMMON_ISCSI_DEFQ_CREATE (19)
++#define OPCODE_COMMON_ISCSI_WRBQ_CREATE (20)
++#define OPCODE_COMMON_MCC_CREATE (21)
++#define OPCODE_COMMON_JELL_CONFIG (22)
++#define OPCODE_COMMON_FORCE_FAILOVER (23)
++#define OPCODE_COMMON_ADD_TEMPLATE_HEADER_BUFFERS (24)
++#define OPCODE_COMMON_REMOVE_TEMPLATE_HEADER_BUFFERS (25)
++#define OPCODE_COMMON_POST_ZERO_BUFFER (26)
++#define OPCODE_COMMON_GET_QOS (27)
++#define OPCODE_COMMON_SET_QOS (28)
++#define OPCODE_COMMON_TCP_GET_STATISTICS (29)
++#define OPCODE_COMMON_SEEPROM_READ (30)
++#define OPCODE_COMMON_TCP_STATE_QUERY (31)
++#define OPCODE_COMMON_GET_CNTL_ATTRIBUTES (32)
++#define OPCODE_COMMON_NOP (33)
++#define OPCODE_COMMON_NTWK_RX_FILTER (34)
++#define OPCODE_COMMON_GET_FW_VERSION (35)
++#define OPCODE_COMMON_SET_FLOW_CONTROL (36)
++#define OPCODE_COMMON_GET_FLOW_CONTROL (37)
++#define OPCODE_COMMON_SET_TCP_PARAMETERS (38)
++#define OPCODE_COMMON_SET_FRAME_SIZE (39)
++#define OPCODE_COMMON_GET_FAT (40)
++#define OPCODE_COMMON_MODIFY_EQ_DELAY (41)
++#define OPCODE_COMMON_FIRMWARE_CONFIG (42)
++#define OPCODE_COMMON_ENABLE_DISABLE_DOMAINS (43)
++#define OPCODE_COMMON_GET_DOMAIN_CONFIG (44)
++#define OPCODE_COMMON_SET_VLD_CONFIG (45)
++#define OPCODE_COMMON_GET_VLD_CONFIG (46)
++#define OPCODE_COMMON_GET_PORT_EQUALIZATION (47)
++#define OPCODE_COMMON_SET_PORT_EQUALIZATION (48)
++#define OPCODE_COMMON_RED_CONFIG (49)
++
++
++
++/*
++ * --- ETH_SUBSYSTEM_OPCODES ---
++ * These opcodes are used for configuring the Ethernet interfaces. These
++ * opcodes all use the FWCMD_SUBSYSTEM_ETH subsystem code.
++ */
++#define OPCODE_ETH_RSS_CONFIG (1)
++#define OPCODE_ETH_ACPI_CONFIG (2)
++#define SUBSYSTEM_ETH_RSS_CONFIG (3)
++#define SUBSYSTEM_ETH_ACPI_CONFIG (3)
++#define OPCODE_ETH_PROMISCUOUS (3)
++#define SUBSYSTEM_ETH_PROMISCUOUS (3)
++#define SUBSYSTEM_ETH_GET_STATISTICS (3)
++#define SUBSYSTEM_ETH_GET_RX_FRAG_SIZE (3)
++#define SUBSYSTEM_ETH_SET_RX_FRAG_SIZE (3)
++#define OPCODE_ETH_GET_STATISTICS (4)
++#define OPCODE_ETH_GET_RX_FRAG_SIZE (5)
++#define OPCODE_ETH_SET_RX_FRAG_SIZE (6)
++
++
++
++
++
++/*
++ * --- MCC_STATUS_CODE ---
++ * These are the global status codes used by all subsystems
++ */
++#define MCC_STATUS_SUCCESS (0) /* Indicates a successful
++ completion of the command */
++#define MCC_STATUS_INSUFFICIENT_PRIVILEGES (1) /* The client does not have
++ sufficient privileges to
++ execute the command */
++#define MCC_STATUS_INVALID_PARAMETER (2) /* A parameter in the command
++ was invalid. The extended
++ status contains the index
++ of the parameter */
++#define MCC_STATUS_INSUFFICIENT_RESOURCES (3) /* There are insufficient
++ chip resources to execute
++ the command */
++#define MCC_STATUS_QUEUE_FLUSHING (4) /* The command is completing
++ because the queue was
++ getting flushed */
++#define MCC_STATUS_DMA_FAILED (5) /* The command is completing
++ with a DMA error */
++
++/*
++ * --- MGMT_ERROR_CODES ---
++ * Error Codes returned in the status field of the FWCMD response header
++ */
++#define MGMT_STATUS_SUCCESS (0) /* The FWCMD completed
++ without errors */
++#define MGMT_STATUS_FAILED (1) /* Error status in the Status
++ field of the
++ struct FWCMD_RESPONSE_HEADER */
++#define MGMT_STATUS_ILLEGAL_REQUEST (2) /* Invalid FWCMD opcode */
++#define MGMT_STATUS_ILLEGAL_FIELD (3) /* Invalid parameter in
++ the FWCMD payload */
++
++#endif /* __fwcmd_opcodes_amap_h__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/fwcmd_types_bmap.h linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_types_bmap.h
+--- linux-2.6.29.owrt/drivers/staging/benet/fwcmd_types_bmap.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/fwcmd_types_bmap.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,29 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * Autogenerated by srcgen version: 0127
++ */
++#ifndef __fwcmd_types_bmap_h__
++#define __fwcmd_types_bmap_h__
++
++/* MAC address format */
++struct MAC_ADDRESS_FORMAT {
++ u16 SizeOfStructure;
++ u8 MACAddress[6];
++} __packed;
++
++#endif /* __fwcmd_types_bmap_h__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/host_struct.h linux-2.6.29-rc3.owrt/drivers/staging/benet/host_struct.h
+--- linux-2.6.29.owrt/drivers/staging/benet/host_struct.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/host_struct.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,182 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * Autogenerated by srcgen version: 0127
++ */
++#ifndef __host_struct_amap_h__
++#define __host_struct_amap_h__
++#include "be_cm.h"
++#include "be_common.h"
++#include "descriptors.h"
++
++/* --- EQ_COMPLETION_MAJOR_CODE_ENUM --- */
++#define EQ_MAJOR_CODE_COMPLETION (0) /* Completion event on a */
++ /* qcompletion ueue. */
++#define EQ_MAJOR_CODE_ETH (1) /* Affiliated Ethernet Event. */
++#define EQ_MAJOR_CODE_RESERVED (2) /* Reserved */
++#define EQ_MAJOR_CODE_RDMA (3) /* Affiliated RDMA Event. */
++#define EQ_MAJOR_CODE_ISCSI (4) /* Affiliated ISCSI Event */
++#define EQ_MAJOR_CODE_UNAFFILIATED (5) /* Unaffiliated Event */
++
++/* --- EQ_COMPLETION_MINOR_CODE_ENUM --- */
++#define EQ_MINOR_CODE_COMPLETION (0) /* Completion event on a */
++ /* completion queue. */
++#define EQ_MINOR_CODE_OTHER (1) /* Other Event (TBD). */
++
++/* Queue Entry Definition for all 4 byte event queue types. */
++struct BE_EQ_ENTRY_AMAP {
++ u8 Valid; /* DWORD 0 */
++ u8 MajorCode[3]; /* DWORD 0 */
++ u8 MinorCode[12]; /* DWORD 0 */
++ u8 ResourceID[16]; /* DWORD 0 */
++} __packed;
++struct EQ_ENTRY_AMAP {
++ u32 dw[1];
++};
++
++/*
++ * --- ETH_EVENT_CODE ---
++ * These codes are returned by the MPU when one of these events has occurred,
++ * and the event is configured to report to an Event Queue when an event
++ * is detected.
++ */
++#define ETH_EQ_LINK_STATUS (0) /* Link status change event */
++ /* detected. */
++#define ETH_EQ_WATERMARK (1) /* watermark event detected. */
++#define ETH_EQ_MAGIC_PKT (2) /* magic pkt event detected. */
++#define ETH_EQ_ACPI_PKT0 (3) /* ACPI interesting packet */
++ /* detected. */
++#define ETH_EQ_ACPI_PKT1 (3) /* ACPI interesting packet */
++ /* detected. */
++#define ETH_EQ_ACPI_PKT2 (3) /* ACPI interesting packet */
++ /* detected. */
++#define ETH_EQ_ACPI_PKT3 (3) /* ACPI interesting packet */
++ /* detected. */
++
++/*
++ * --- ETH_TX_COMPL_STATUS_ENUM ---
++ * Status codes contained in Ethernet TX completion descriptors.
++ */
++#define ETH_COMP_VALID (0)
++#define ETH_COMP_ERROR (1)
++#define ETH_COMP_INVALID (15)
++
++/*
++ * --- ETH_TX_COMPL_PORT_ENUM ---
++ * Port indicator contained in Ethernet TX completion descriptors.
++ */
++#define ETH_COMP_PORT0 (0)
++#define ETH_COMP_PORT1 (1)
++#define ETH_COMP_MGMT (2)
++
++/*
++ * --- ETH_TX_COMPL_CT_ENUM ---
++ * Completion type indicator contained in Ethernet TX completion descriptors.
++ */
++#define ETH_COMP_ETH (0)
++
++/*
++ * Work request block that the driver issues to the chip for
++ * Ethernet transmissions. All control fields must be valid in each WRB for
++ * a message. The controller, as specified by the flags, optionally writes
++ * an entry to the Completion Ring and generate an event.
++ */
++struct BE_ETH_WRB_AMAP {
++ u8 frag_pa_hi[32]; /* DWORD 0 */
++ u8 frag_pa_lo[32]; /* DWORD 1 */
++ u8 complete; /* DWORD 2 */
++ u8 event; /* DWORD 2 */
++ u8 crc; /* DWORD 2 */
++ u8 forward; /* DWORD 2 */
++ u8 ipsec; /* DWORD 2 */
++ u8 mgmt; /* DWORD 2 */
++ u8 ipcs; /* DWORD 2 */
++ u8 udpcs; /* DWORD 2 */
++ u8 tcpcs; /* DWORD 2 */
++ u8 lso; /* DWORD 2 */
++ u8 last; /* DWORD 2 */
++ u8 vlan; /* DWORD 2 */
++ u8 dbg[3]; /* DWORD 2 */
++ u8 hash_val[3]; /* DWORD 2 */
++ u8 lso_mss[14]; /* DWORD 2 */
++ u8 frag_len[16]; /* DWORD 3 */
++ u8 vlan_tag[16]; /* DWORD 3 */
++} __packed;
++struct ETH_WRB_AMAP {
++ u32 dw[4];
++};
++
++/* This is an Ethernet transmit completion descriptor */
++struct BE_ETH_TX_COMPL_AMAP {
++ u8 user_bytes[16]; /* DWORD 0 */
++ u8 nwh_bytes[8]; /* DWORD 0 */
++ u8 lso; /* DWORD 0 */
++ u8 rsvd0[7]; /* DWORD 0 */
++ u8 wrb_index[16]; /* DWORD 1 */
++ u8 ct[2]; /* DWORD 1 */
++ u8 port[2]; /* DWORD 1 */
++ u8 rsvd1[8]; /* DWORD 1 */
++ u8 status[4]; /* DWORD 1 */
++ u8 rsvd2[16]; /* DWORD 2 */
++ u8 ringid[11]; /* DWORD 2 */
++ u8 hash_val[4]; /* DWORD 2 */
++ u8 valid; /* DWORD 2 */
++ u8 rsvd3[32]; /* DWORD 3 */
++} __packed;
++struct ETH_TX_COMPL_AMAP {
++ u32 dw[4];
++};
++
++/* Ethernet Receive Buffer descriptor */
++struct BE_ETH_RX_D_AMAP {
++ u8 fragpa_hi[32]; /* DWORD 0 */
++ u8 fragpa_lo[32]; /* DWORD 1 */
++} __packed;
++struct ETH_RX_D_AMAP {
++ u32 dw[2];
++};
++
++/* This is an Ethernet Receive Completion Descriptor */
++struct BE_ETH_RX_COMPL_AMAP {
++ u8 vlan_tag[16]; /* DWORD 0 */
++ u8 pktsize[14]; /* DWORD 0 */
++ u8 port; /* DWORD 0 */
++ u8 rsvd0; /* DWORD 0 */
++ u8 err; /* DWORD 1 */
++ u8 rsshp; /* DWORD 1 */
++ u8 ipf; /* DWORD 1 */
++ u8 tcpf; /* DWORD 1 */
++ u8 udpf; /* DWORD 1 */
++ u8 ipcksm; /* DWORD 1 */
++ u8 tcpcksm; /* DWORD 1 */
++ u8 udpcksm; /* DWORD 1 */
++ u8 macdst[6]; /* DWORD 1 */
++ u8 vtp; /* DWORD 1 */
++ u8 vtm; /* DWORD 1 */
++ u8 fragndx[10]; /* DWORD 1 */
++ u8 ct[2]; /* DWORD 1 */
++ u8 ipsec; /* DWORD 1 */
++ u8 numfrags[3]; /* DWORD 1 */
++ u8 rsvd1[31]; /* DWORD 2 */
++ u8 valid; /* DWORD 2 */
++ u8 rsshash[32]; /* DWORD 3 */
++} __packed;
++struct ETH_RX_COMPL_AMAP {
++ u32 dw[4];
++};
++
++#endif /* __host_struct_amap_h__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/hwlib.h linux-2.6.29-rc3.owrt/drivers/staging/benet/hwlib.h
+--- linux-2.6.29.owrt/drivers/staging/benet/hwlib.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/hwlib.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,830 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++#ifndef __hwlib_h__
++#define __hwlib_h__
++
++#include <linux/module.h>
++#include <linux/io.h>
++#include <linux/list.h>
++#include <linux/spinlock.h>
++
++#include "regmap.h" /* srcgen array map output */
++
++#include "asyncmesg.h"
++#include "fwcmd_opcodes.h"
++#include "post_codes.h"
++#include "fwcmd_mcc.h"
++
++#include "fwcmd_types_bmap.h"
++#include "fwcmd_common_bmap.h"
++#include "fwcmd_eth_bmap.h"
++#include "bestatus.h"
++/*
++ *
++ * Macros for reading/writing a protection domain or CSR registers
++ * in BladeEngine.
++ */
++#define PD_READ(fo, field) ioread32((fo)->db_va + \
++ offsetof(struct BE_PROTECTION_DOMAIN_DBMAP_AMAP, field)/8)
++
++#define PD_WRITE(fo, field, val) iowrite32(val, (fo)->db_va + \
++ offsetof(struct BE_PROTECTION_DOMAIN_DBMAP_AMAP, field)/8)
++
++#define CSR_READ(fo, field) ioread32((fo)->csr_va + \
++ offsetof(struct BE_BLADE_ENGINE_CSRMAP_AMAP, field)/8)
++
++#define CSR_WRITE(fo, field, val) iowrite32(val, (fo)->csr_va + \
++ offsetof(struct BE_BLADE_ENGINE_CSRMAP_AMAP, field)/8)
++
++#define PCICFG0_READ(fo, field) ioread32((fo)->pci_va + \
++ offsetof(struct BE_PCICFG0_CSRMAP_AMAP, field)/8)
++
++#define PCICFG0_WRITE(fo, field, val) iowrite32(val, (fo)->pci_va + \
++ offsetof(struct BE_PCICFG0_CSRMAP_AMAP, field)/8)
++
++#define PCICFG1_READ(fo, field) ioread32((fo)->pci_va + \
++ offsetof(struct BE_PCICFG1_CSRMAP_AMAP, field)/8)
++
++#define PCICFG1_WRITE(fo, field, val) iowrite32(val, (fo)->pci_va + \
++ offsetof(struct BE_PCICFG1_CSRMAP_AMAP, field)/8)
++
++#ifdef BE_DEBUG
++#define ASSERT(c) BUG_ON(!(c));
++#else
++#define ASSERT(c)
++#endif
++
++/* debug levels */
++enum BE_DEBUG_LEVELS {
++ DL_ALWAYS = 0, /* cannot be masked */
++ DL_ERR = 0x1, /* errors that should never happen */
++ DL_WARN = 0x2, /* something questionable.
++ recoverable errors */
++ DL_NOTE = 0x4, /* infrequent, important debug info */
++ DL_INFO = 0x8, /* debug information */
++ DL_VERBOSE = 0x10, /* detailed info, such as buffer traces */
++ BE_DL_MIN_VALUE = 0x1, /* this is the min value used */
++ BE_DL_MAX_VALUE = 0x80 /* this is the higheset value used */
++} ;
++
++extern unsigned int trace_level;
++
++#define TRACE(lm, fmt, args...) { \
++ if (trace_level & lm) { \
++ printk(KERN_NOTICE "BE: %s:%d \n" fmt, \
++ __FILE__ , __LINE__ , ## args); \
++ } \
++ }
++
++static inline unsigned int be_trace_set_level(unsigned int level)
++{
++ unsigned int old_level = trace_level;
++ trace_level = level;
++ return old_level;
++}
++
++#define be_trace_get_level() trace_level
++/*
++ * Returns number of pages spanned by the size of data
++ * starting at the given address.
++ */
++#define PAGES_SPANNED(_address, _size) \
++ ((u32)((((size_t)(_address) & (PAGE_SIZE - 1)) + \
++ (_size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
++/* Byte offset into the page corresponding to given address */
++#define OFFSET_IN_PAGE(_addr_) ((size_t)(_addr_) & (PAGE_SIZE-1))
++
++/*
++ * circular subtract.
++ * Returns a - b assuming a circular number system, where a and b are
++ * in range (0, maxValue-1). If a==b, zero is returned so the
++ * highest value possible with this subtraction is maxValue-1.
++ */
++static inline u32 be_subc(u32 a, u32 b, u32 max)
++{
++ ASSERT(a <= max && b <= max);
++ ASSERT(max > 0);
++ return a >= b ? (a - b) : (max - b + a);
++}
++
++static inline u32 be_addc(u32 a, u32 b, u32 max)
++{
++ ASSERT(a < max);
++ ASSERT(max > 0);
++ return (max - a > b) ? (a + b) : (b + a - max);
++}
++
++/* descriptor for a physically contiguous memory used for ring */
++struct ring_desc {
++ u32 length; /* length in bytes */
++ void *va; /* virtual address */
++ u64 pa; /* bus address */
++} ;
++
++/*
++ * This structure stores information about a ring shared between hardware
++ * and software. Each ring is allocated by the driver in the uncached
++ * extension and mapped into BladeEngine's unified table.
++ */
++struct mp_ring {
++ u32 pages; /* queue size in pages */
++ u32 id; /* queue id assigned by beklib */
++ u32 num; /* number of elements in queue */
++ u32 cidx; /* consumer index */
++ u32 pidx; /* producer index -- not used by most rings */
++ u32 itemSize; /* size in bytes of one object */
++
++ void *va; /* The virtual address of the ring.
++ This should be last to allow 32 & 64
++ bit debugger extensions to work. */
++} ;
++
++/*----------- amap bit filed get / set macros and functions -----*/
++/*
++ * Structures defined in the map header files (under fw/amap/) with names
++ * in the format BE_<name>_AMAP are pseudo structures with members
++ * of type u8. These structures are templates that are used in
++ * conjuntion with the structures with names in the format
++ * <name>_AMAP to calculate the bit masks and bit offsets to get or set
++ * bit fields in structures. The structures <name>_AMAP are arrays
++ * of 32 bits words and have the correct size. The following macros
++ * provide convenient ways to get and set the various members
++ * in the structures without using strucctures with bit fields.
++ * Always use the macros AMAP_GET_BITS_PTR and AMAP_SET_BITS_PTR
++ * macros to extract and set various members.
++ */
++
++/*
++ * Returns the a bit mask for the register that is NOT shifted into location.
++ * That means return values always look like: 0x1, 0xFF, 0x7FF, etc...
++ */
++static inline u32 amap_mask(u32 bit_size)
++{
++ return bit_size == 32 ? 0xFFFFFFFF : (1 << bit_size) - 1;
++}
++
++#define AMAP_BIT_MASK(_struct_, field) \
++ amap_mask(AMAP_BIT_SIZE(_struct_, field))
++
++/*
++ * non-optimized set bits function. First clears the bits and then assigns them.
++ * This does not require knowledge of the particular DWORD you are setting.
++ * e.g. AMAP_SET_BITS_PTR (struct, field1, &contextMemory, 123);
++ */
++static inline void
++amap_set(void *ptr, u32 dw_offset, u32 mask, u32 offset, u32 value)
++{
++ u32 *dw = (u32 *)ptr;
++ *(dw + dw_offset) &= ~(mask << offset);
++ *(dw + dw_offset) |= (mask & value) << offset;
++}
++
++#define AMAP_SET_BITS_PTR(_struct_, field, _structPtr_, val) \
++ amap_set(_structPtr_, AMAP_WORD_OFFSET(_struct_, field),\
++ AMAP_BIT_MASK(_struct_, field), \
++ AMAP_BIT_OFFSET(_struct_, field), val)
++/*
++ * Non-optimized routine that gets the bits without knowing the correct DWORD.
++ * e.g. fieldValue = AMAP_GET_BITS_PTR (struct, field1, &contextMemory);
++ */
++static inline u32
++amap_get(void *ptr, u32 dw_offset, u32 mask, u32 offset)
++{
++ u32 *dw = (u32 *)ptr;
++ return mask & (*(dw + dw_offset) >> offset);
++}
++#define AMAP_GET_BITS_PTR(_struct_, field, _structPtr_) \
++ amap_get(_structPtr_, AMAP_WORD_OFFSET(_struct_, field), \
++ AMAP_BIT_MASK(_struct_, field), \
++ AMAP_BIT_OFFSET(_struct_, field))
++
++/* Returns 0-31 representing bit offset within a DWORD of a bitfield. */
++#define AMAP_BIT_OFFSET(_struct_, field) \
++ (offsetof(struct BE_ ## _struct_ ## _AMAP, field) % 32)
++
++/* Returns 0-n representing DWORD offset of bitfield within the structure. */
++#define AMAP_WORD_OFFSET(_struct_, field) \
++ (offsetof(struct BE_ ## _struct_ ## _AMAP, field)/32)
++
++/* Returns size of bitfield in bits. */
++#define AMAP_BIT_SIZE(_struct_, field) \
++ sizeof(((struct BE_ ## _struct_ ## _AMAP*)0)->field)
++
++struct be_mcc_wrb_response_copy {
++ u16 length; /* bytes in response */
++ u16 fwcmd_offset; /* offset within the wrb of the response */
++ void *va; /* user's va to copy response into */
++
++} ;
++typedef void (*mcc_wrb_cqe_callback) (void *context, int status,
++ struct MCC_WRB_AMAP *optional_wrb);
++struct be_mcc_wrb_context {
++
++ mcc_wrb_cqe_callback internal_cb; /* Function to call on
++ completion */
++ void *internal_cb_context; /* Parameter to pass
++ to completion function */
++
++ mcc_wrb_cqe_callback cb; /* Function to call on completion */
++ void *cb_context; /* Parameter to pass to completion function */
++
++ int *users_final_status; /* pointer to a local
++ variable for synchronous
++ commands */
++ struct MCC_WRB_AMAP *wrb; /* pointer to original wrb for embedded
++ commands only */
++ struct list_head next; /* links context structs together in
++ free list */
++
++ struct be_mcc_wrb_response_copy copy; /* Optional parameters to copy
++ embedded response to user's va */
++
++#if defined(BE_DEBUG)
++ u16 subsystem, opcode; /* Track this FWCMD for debug builds. */
++ struct MCC_WRB_AMAP *ring_wrb;
++ u32 consumed_count;
++#endif
++} ;
++
++/*
++ Represents a function object for network or storage. This
++ is used to manage per-function resources like MCC CQs, etc.
++*/
++struct be_function_object {
++
++ u32 magic; /*!< magic for detecting memory corruption. */
++
++ /* PCI BAR mapped addresses */
++ u8 __iomem *csr_va; /* CSR */
++ u8 __iomem *db_va; /* Door Bell */
++ u8 __iomem *pci_va; /* PCI config space */
++ u32 emulate; /* if set, MPU is not available.
++ Emulate everything. */
++ u32 pend_queue_driving; /* if set, drive the queued WRBs
++ after releasing the WRB lock */
++
++ spinlock_t post_lock; /* lock for verifying one thread posting wrbs */
++ spinlock_t cq_lock; /* lock for verifying one thread
++ processing cq */
++ spinlock_t mcc_context_lock; /* lock for protecting mcc
++ context free list */
++ unsigned long post_irq;
++ unsigned long cq_irq;
++
++ u32 type;
++ u32 pci_function_number;
++
++ struct be_mcc_object *mcc; /* mcc rings. */
++
++ struct {
++ struct MCC_MAILBOX_AMAP *va; /* VA to the mailbox */
++ u64 pa; /* PA to the mailbox */
++ u32 length; /* byte length of mailbox */
++
++ /* One default context struct used for posting at
++ * least one MCC_WRB
++ */
++ struct be_mcc_wrb_context default_context;
++ bool default_context_allocated;
++ } mailbox;
++
++ struct {
++
++ /* Wake on lans configured. */
++ u32 wol_bitmask; /* bits 0,1,2,3 are set if
++ corresponding index is enabled */
++ } config;
++
++
++ struct BE_FIRMWARE_CONFIG fw_config;
++} ;
++
++/*
++ Represents an Event Queue
++*/
++struct be_eq_object {
++ u32 magic;
++ atomic_t ref_count;
++
++ struct be_function_object *parent_function;
++
++ struct list_head eq_list;
++ struct list_head cq_list_head;
++
++ u32 eq_id;
++ void *cb_context;
++
++} ;
++
++/*
++ Manages a completion queue
++*/
++struct be_cq_object {
++ u32 magic;
++ atomic_t ref_count;
++
++ struct be_function_object *parent_function;
++ struct be_eq_object *eq_object;
++
++ struct list_head cq_list;
++ struct list_head cqlist_for_eq;
++
++ void *va;
++ u32 num_entries;
++
++ void *cb_context;
++
++ u32 cq_id;
++
++} ;
++
++/*
++ Manages an ethernet send queue
++*/
++struct be_ethsq_object {
++ u32 magic;
++
++ struct list_head list;
++
++ struct be_function_object *parent_function;
++ struct be_cq_object *cq_object;
++ u32 bid;
++
++} ;
++
++/*
++@brief
++ Manages an ethernet receive queue
++*/
++struct be_ethrq_object {
++ u32 magic;
++ struct list_head list;
++ struct be_function_object *parent_function;
++ u32 rid;
++ struct be_cq_object *cq_object;
++ struct be_cq_object *rss_cq_object[4];
++
++} ;
++
++/*
++ Manages an MCC
++*/
++typedef void (*mcc_async_event_callback) (void *context, u32 event_code,
++ void *event);
++struct be_mcc_object {
++ u32 magic;
++
++ struct be_function_object *parent_function;
++ struct list_head mcc_list;
++
++ struct be_cq_object *cq_object;
++
++ /* Async event callback for MCC CQ. */
++ mcc_async_event_callback async_cb;
++ void *async_context;
++
++ struct {
++ struct be_mcc_wrb_context *base;
++ u32 num;
++ struct list_head list_head;
++ } wrb_context;
++
++ struct {
++ struct ring_desc *rd;
++ struct mp_ring ring;
++ } sq;
++
++ struct {
++ struct mp_ring ring;
++ } cq;
++
++ u32 processing; /* flag indicating that one thread
++ is processing CQ */
++ u32 rearm; /* doorbell rearm setting to make
++ sure the active processing thread */
++ /* rearms the CQ if any of the threads requested it. */
++
++ struct list_head backlog;
++ u32 backlog_length;
++ u32 driving_backlog;
++ u32 consumed_index;
++
++} ;
++
++
++/* Queue context header -- the required software information for
++ * queueing a WRB.
++ */
++struct be_queue_driver_context {
++ mcc_wrb_cqe_callback internal_cb; /* Function to call on
++ completion */
++ void *internal_cb_context; /* Parameter to pass
++ to completion function */
++
++ mcc_wrb_cqe_callback cb; /* Function to call on completion */
++ void *cb_context; /* Parameter to pass to completion function */
++
++ struct be_mcc_wrb_response_copy copy; /* Optional parameters to copy
++ embedded response to user's va */
++ void *optional_fwcmd_va;
++ struct list_head list;
++ u32 bytes;
++} ;
++
++/*
++ * Common MCC WRB header that all commands require.
++ */
++struct be_mcc_wrb_header {
++ u8 rsvd[offsetof(struct BE_MCC_WRB_AMAP, payload)/8];
++} ;
++
++/*
++ * All non embedded commands supported by hwlib functions only allow
++ * 1 SGE. This queue context handles them all.
++ */
++struct be_nonembedded_q_ctxt {
++ struct be_queue_driver_context context;
++ struct be_mcc_wrb_header wrb_header;
++ struct MCC_SGE_AMAP sge[1];
++} ;
++
++/*
++ * ------------------------------------------------------------------------
++ * This section contains the specific queue struct for each command.
++ * The user could always provide a be_generic_q_ctxt but this is a
++ * rather large struct. By using the specific struct, memory consumption
++ * can be reduced.
++ * ------------------------------------------------------------------------
++ */
++
++struct be_link_status_q_ctxt {
++ struct be_queue_driver_context context;
++ struct be_mcc_wrb_header wrb_header;
++ struct FWCMD_COMMON_NTWK_LINK_STATUS_QUERY fwcmd;
++} ;
++
++struct be_multicast_q_ctxt {
++ struct be_queue_driver_context context;
++ struct be_mcc_wrb_header wrb_header;
++ struct FWCMD_COMMON_NTWK_MULTICAST_SET fwcmd;
++} ;
++
++
++struct be_vlan_q_ctxt {
++ struct be_queue_driver_context context;
++ struct be_mcc_wrb_header wrb_header;
++ struct FWCMD_COMMON_NTWK_VLAN_CONFIG fwcmd;
++} ;
++
++struct be_promiscuous_q_ctxt {
++ struct be_queue_driver_context context;
++ struct be_mcc_wrb_header wrb_header;
++ struct FWCMD_ETH_PROMISCUOUS fwcmd;
++} ;
++
++struct be_force_failover_q_ctxt {
++ struct be_queue_driver_context context;
++ struct be_mcc_wrb_header wrb_header;
++ struct FWCMD_COMMON_FORCE_FAILOVER fwcmd;
++} ;
++
++
++struct be_rxf_filter_q_ctxt {
++ struct be_queue_driver_context context;
++ struct be_mcc_wrb_header wrb_header;
++ struct FWCMD_COMMON_NTWK_RX_FILTER fwcmd;
++} ;
++
++struct be_eq_modify_delay_q_ctxt {
++ struct be_queue_driver_context context;
++ struct be_mcc_wrb_header wrb_header;
++ struct FWCMD_COMMON_MODIFY_EQ_DELAY fwcmd;
++} ;
++
++/*
++ * The generic context is the largest size that would be required.
++ * It is the software context plus an entire WRB.
++ */
++struct be_generic_q_ctxt {
++ struct be_queue_driver_context context;
++ struct be_mcc_wrb_header wrb_header;
++ struct MCC_WRB_PAYLOAD_AMAP payload;
++} ;
++
++/*
++ * Types for the BE_QUEUE_CONTEXT object.
++ */
++#define BE_QUEUE_INVALID (0)
++#define BE_QUEUE_LINK_STATUS (0xA006)
++#define BE_QUEUE_ETH_STATS (0xA007)
++#define BE_QUEUE_TPM_STATS (0xA008)
++#define BE_QUEUE_TCP_STATS (0xA009)
++#define BE_QUEUE_MULTICAST (0xA00A)
++#define BE_QUEUE_VLAN (0xA00B)
++#define BE_QUEUE_RSS (0xA00C)
++#define BE_QUEUE_FORCE_FAILOVER (0xA00D)
++#define BE_QUEUE_PROMISCUOUS (0xA00E)
++#define BE_QUEUE_WAKE_ON_LAN (0xA00F)
++#define BE_QUEUE_NOP (0xA010)
++
++/* --- BE_FUNCTION_ENUM --- */
++#define BE_FUNCTION_TYPE_ISCSI (0)
++#define BE_FUNCTION_TYPE_NETWORK (1)
++#define BE_FUNCTION_TYPE_ARM (2)
++
++/* --- BE_ETH_TX_RING_TYPE_ENUM --- */
++#define BE_ETH_TX_RING_TYPE_FORWARDING (1) /* Ether ring for forwarding */
++#define BE_ETH_TX_RING_TYPE_STANDARD (2) /* Ether ring for sending */
++ /* network packets. */
++#define BE_ETH_TX_RING_TYPE_BOUND (3) /* Ethernet ring for sending */
++ /* network packets, bound */
++ /* to a physical port. */
++/*
++ * ----------------------------------------------------------------------
++ * API MACROS
++ * ----------------------------------------------------------------------
++ */
++#define BE_FWCMD_NAME(_short_name_) struct FWCMD_##_short_name_
++#define BE_OPCODE_NAME(_short_name_) OPCODE_##_short_name_
++#define BE_SUBSYSTEM_NAME(_short_name_) SUBSYSTEM_##_short_name_
++
++
++#define BE_PREPARE_EMBEDDED_FWCMD(_pfob_, _wrb_, _short_name_) \
++ ((BE_FWCMD_NAME(_short_name_) *) \
++ be_function_prepare_embedded_fwcmd(_pfob_, _wrb_, \
++ sizeof(BE_FWCMD_NAME(_short_name_)), \
++ FIELD_SIZEOF(BE_FWCMD_NAME(_short_name_), params.request), \
++ FIELD_SIZEOF(BE_FWCMD_NAME(_short_name_), params.response), \
++ BE_OPCODE_NAME(_short_name_), \
++ BE_SUBSYSTEM_NAME(_short_name_)));
++
++#define BE_PREPARE_NONEMBEDDED_FWCMD(_pfob_, _wrb_, _iva_, _ipa_, _short_name_)\
++ ((BE_FWCMD_NAME(_short_name_) *) \
++ be_function_prepare_nonembedded_fwcmd(_pfob_, _wrb_, (_iva_), (_ipa_), \
++ sizeof(BE_FWCMD_NAME(_short_name_)), \
++ FIELD_SIZEOF(BE_FWCMD_NAME(_short_name_), params.request), \
++ FIELD_SIZEOF(BE_FWCMD_NAME(_short_name_), params.response), \
++ BE_OPCODE_NAME(_short_name_), \
++ BE_SUBSYSTEM_NAME(_short_name_)));
++
++int be_function_object_create(u8 __iomem *csr_va, u8 __iomem *db_va,
++ u8 __iomem *pci_va, u32 function_type, struct ring_desc *mailbox_rd,
++ struct be_function_object *pfob);
++
++int be_function_object_destroy(struct be_function_object *pfob);
++int be_function_cleanup(struct be_function_object *pfob);
++
++
++int be_function_get_fw_version(struct be_function_object *pfob,
++ struct FWCMD_COMMON_GET_FW_VERSION_RESPONSE_PAYLOAD *fw_version,
++ mcc_wrb_cqe_callback cb, void *cb_context);
++
++
++int be_eq_modify_delay(struct be_function_object *pfob,
++ u32 num_eq, struct be_eq_object **eq_array,
++ u32 *eq_delay_array, mcc_wrb_cqe_callback cb,
++ void *cb_context,
++ struct be_eq_modify_delay_q_ctxt *q_ctxt);
++
++
++
++int be_eq_create(struct be_function_object *pfob,
++ struct ring_desc *rd, u32 eqe_size, u32 num_entries,
++ u32 watermark, u32 timer_delay, struct be_eq_object *eq_object);
++
++int be_eq_destroy(struct be_eq_object *eq);
++
++int be_cq_create(struct be_function_object *pfob,
++ struct ring_desc *rd, u32 length,
++ bool solicited_eventable, bool no_delay,
++ u32 wm_thresh, struct be_eq_object *eq_object,
++ struct be_cq_object *cq_object);
++
++int be_cq_destroy(struct be_cq_object *cq);
++
++int be_mcc_ring_create(struct be_function_object *pfob,
++ struct ring_desc *rd, u32 length,
++ struct be_mcc_wrb_context *context_array,
++ u32 num_context_entries,
++ struct be_cq_object *cq, struct be_mcc_object *mcc);
++int be_mcc_ring_destroy(struct be_mcc_object *mcc_object);
++
++int be_mcc_process_cq(struct be_mcc_object *mcc_object, bool rearm);
++
++int be_mcc_add_async_event_callback(struct be_mcc_object *mcc_object,
++ mcc_async_event_callback cb, void *cb_context);
++
++int be_pci_soft_reset(struct be_function_object *pfob);
++
++
++int be_drive_POST(struct be_function_object *pfob);
++
++
++int be_eth_sq_create(struct be_function_object *pfob,
++ struct ring_desc *rd, u32 length_in_bytes,
++ u32 type, u32 ulp, struct be_cq_object *cq_object,
++ struct be_ethsq_object *eth_sq);
++
++struct be_eth_sq_parameters {
++ u32 port;
++ u32 rsvd0[2];
++} ;
++
++int be_eth_sq_create_ex(struct be_function_object *pfob,
++ struct ring_desc *rd, u32 length_in_bytes,
++ u32 type, u32 ulp, struct be_cq_object *cq_object,
++ struct be_eth_sq_parameters *ex_parameters,
++ struct be_ethsq_object *eth_sq);
++int be_eth_sq_destroy(struct be_ethsq_object *eth_sq);
++
++int be_eth_set_flow_control(struct be_function_object *pfob,
++ bool txfc_enable, bool rxfc_enable);
++
++int be_eth_get_flow_control(struct be_function_object *pfob,
++ bool *txfc_enable, bool *rxfc_enable);
++int be_eth_set_qos(struct be_function_object *pfob, u32 max_bps, u32 max_pps);
++
++int be_eth_get_qos(struct be_function_object *pfob, u32 *max_bps, u32 *max_pps);
++
++int be_eth_set_frame_size(struct be_function_object *pfob,
++ u32 *tx_frame_size, u32 *rx_frame_size);
++
++int be_eth_rq_create(struct be_function_object *pfob,
++ struct ring_desc *rd, struct be_cq_object *cq_object,
++ struct be_cq_object *bcmc_cq_object,
++ struct be_ethrq_object *eth_rq);
++
++int be_eth_rq_destroy(struct be_ethrq_object *eth_rq);
++
++int be_eth_rq_destroy_options(struct be_ethrq_object *eth_rq, bool flush,
++ mcc_wrb_cqe_callback cb, void *cb_context);
++int be_eth_rq_set_frag_size(struct be_function_object *pfob,
++ u32 new_frag_size_bytes, u32 *actual_frag_size_bytes);
++int be_eth_rq_get_frag_size(struct be_function_object *pfob,
++ u32 *frag_size_bytes);
++
++void *be_function_prepare_embedded_fwcmd(struct be_function_object *pfob,
++ struct MCC_WRB_AMAP *wrb,
++ u32 payload_length, u32 request_length,
++ u32 response_length, u32 opcode, u32 subsystem);
++void *be_function_prepare_nonembedded_fwcmd(struct be_function_object *pfob,
++ struct MCC_WRB_AMAP *wrb, void *fwcmd_header_va, u64 fwcmd_header_pa,
++ u32 payload_length, u32 request_length, u32 response_length,
++ u32 opcode, u32 subsystem);
++
++
++struct MCC_WRB_AMAP *
++be_function_peek_mcc_wrb(struct be_function_object *pfob);
++
++int be_rxf_mac_address_read_write(struct be_function_object *pfob,
++ bool port1, bool mac1, bool mgmt,
++ bool write, bool permanent, u8 *mac_address,
++ mcc_wrb_cqe_callback cb,
++ void *cb_context);
++
++int be_rxf_multicast_config(struct be_function_object *pfob,
++ bool promiscuous, u32 num, u8 *mac_table,
++ mcc_wrb_cqe_callback cb,
++ void *cb_context,
++ struct be_multicast_q_ctxt *q_ctxt);
++
++int be_rxf_vlan_config(struct be_function_object *pfob,
++ bool promiscuous, u32 num, u16 *vlan_tag_array,
++ mcc_wrb_cqe_callback cb, void *cb_context,
++ struct be_vlan_q_ctxt *q_ctxt);
++
++
++int be_rxf_link_status(struct be_function_object *pfob,
++ struct BE_LINK_STATUS *link_status,
++ mcc_wrb_cqe_callback cb,
++ void *cb_context,
++ struct be_link_status_q_ctxt *q_ctxt);
++
++
++int be_rxf_query_eth_statistics(struct be_function_object *pfob,
++ struct FWCMD_ETH_GET_STATISTICS *va_for_fwcmd,
++ u64 pa_for_fwcmd, mcc_wrb_cqe_callback cb,
++ void *cb_context,
++ struct be_nonembedded_q_ctxt *q_ctxt);
++
++int be_rxf_promiscuous(struct be_function_object *pfob,
++ bool enable_port0, bool enable_port1,
++ mcc_wrb_cqe_callback cb, void *cb_context,
++ struct be_promiscuous_q_ctxt *q_ctxt);
++
++
++int be_rxf_filter_config(struct be_function_object *pfob,
++ struct NTWK_RX_FILTER_SETTINGS *settings,
++ mcc_wrb_cqe_callback cb,
++ void *cb_context,
++ struct be_rxf_filter_q_ctxt *q_ctxt);
++
++/*
++ * ------------------------------------------------------
++ * internal functions used by hwlib
++ * ------------------------------------------------------
++ */
++
++
++int be_function_ring_destroy(struct be_function_object *pfob,
++ u32 id, u32 ring_type, mcc_wrb_cqe_callback cb,
++ void *cb_context,
++ mcc_wrb_cqe_callback internal_cb,
++ void *internal_callback_context);
++
++int be_function_post_mcc_wrb(struct be_function_object *pfob,
++ struct MCC_WRB_AMAP *wrb,
++ struct be_generic_q_ctxt *q_ctxt,
++ mcc_wrb_cqe_callback cb, void *cb_context,
++ mcc_wrb_cqe_callback internal_cb,
++ void *internal_cb_context, void *optional_fwcmd_va,
++ struct be_mcc_wrb_response_copy *response_copy);
++
++int be_function_queue_mcc_wrb(struct be_function_object *pfob,
++ struct be_generic_q_ctxt *q_ctxt);
++
++/*
++ * ------------------------------------------------------
++ * MCC QUEUE
++ * ------------------------------------------------------
++ */
++
++int be_mpu_init_mailbox(struct be_function_object *pfob, struct ring_desc *rd);
++
++
++struct MCC_WRB_AMAP *
++_be_mpu_peek_ring_wrb(struct be_mcc_object *mcc, bool driving_queue);
++
++struct be_mcc_wrb_context *
++_be_mcc_allocate_wrb_context(struct be_function_object *pfob);
++
++void _be_mcc_free_wrb_context(struct be_function_object *pfob,
++ struct be_mcc_wrb_context *context);
++
++int _be_mpu_post_wrb_mailbox(struct be_function_object *pfob,
++ struct MCC_WRB_AMAP *wrb, struct be_mcc_wrb_context *wrb_context);
++
++int _be_mpu_post_wrb_ring(struct be_mcc_object *mcc,
++ struct MCC_WRB_AMAP *wrb, struct be_mcc_wrb_context *wrb_context);
++
++void be_drive_mcc_wrb_queue(struct be_mcc_object *mcc);
++
++
++/*
++ * ------------------------------------------------------
++ * Ring Sizes
++ * ------------------------------------------------------
++ */
++static inline u32 be_ring_encoding_to_length(u32 encoding, u32 object_size)
++{
++
++ ASSERT(encoding != 1); /* 1 is rsvd */
++ ASSERT(encoding < 16);
++ ASSERT(object_size > 0);
++
++ if (encoding == 0) /* 32k deep */
++ encoding = 16;
++
++ return (1 << (encoding - 1)) * object_size;
++}
++
++static inline
++u32 be_ring_length_to_encoding(u32 length_in_bytes, u32 object_size)
++{
++
++ u32 count, encoding;
++
++ ASSERT(object_size > 0);
++ ASSERT(length_in_bytes % object_size == 0);
++
++ count = length_in_bytes / object_size;
++
++ ASSERT(count > 1);
++ ASSERT(count <= 32 * 1024);
++ ASSERT(length_in_bytes <= 8 * PAGE_SIZE); /* max ring size in UT */
++
++ encoding = __ilog2_u32(count) + 1;
++
++ if (encoding == 16)
++ encoding = 0; /* 32k deep */
++
++ return encoding;
++}
++
++void be_rd_to_pa_list(struct ring_desc *rd, struct PHYS_ADDR *pa_list,
++ u32 max_num);
++#endif /* __hwlib_h__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/Kconfig linux-2.6.29-rc3.owrt/drivers/staging/benet/Kconfig
+--- linux-2.6.29.owrt/drivers/staging/benet/Kconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/Kconfig 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,7 @@
++config BENET
++ tristate "ServerEngines 10Gb NIC - BladeEngine"
++ depends on PCI && INET
++ select INET_LRO
++ help
++ This driver implements the NIC functionality for ServerEngines
++ 10Gb network adapter BladeEngine (EC 3210).
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/MAINTAINERS linux-2.6.29-rc3.owrt/drivers/staging/benet/MAINTAINERS
+--- linux-2.6.29.owrt/drivers/staging/benet/MAINTAINERS 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/MAINTAINERS 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,6 @@
++SERVER ENGINES 10Gbe NIC - BLADE-ENGINE
++P: Subbu Seetharaman
++M: subbus@serverengines.com
++L: netdev@vger.kernel.org
++W: http://www.serverengines.com
++S: Supported
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/Makefile linux-2.6.29-rc3.owrt/drivers/staging/benet/Makefile
+--- linux-2.6.29.owrt/drivers/staging/benet/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/Makefile 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,14 @@
++#
++# Makefile to build the network driver for ServerEngine's BladeEngine
++#
++obj-$(CONFIG_BENET) += benet.o
++
++benet-y := be_init.o \
++ be_int.o \
++ be_netif.o \
++ be_ethtool.o \
++ funcobj.o \
++ cq.o \
++ eq.o \
++ mpu.o \
++ eth.o
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/mpu.c linux-2.6.29-rc3.owrt/drivers/staging/benet/mpu.c
+--- linux-2.6.29.owrt/drivers/staging/benet/mpu.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/mpu.c 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,1364 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++#include <linux/delay.h>
++#include "hwlib.h"
++#include "bestatus.h"
++
++static
++inline void mp_ring_create(struct mp_ring *ring, u32 num, u32 size, void *va)
++{
++ ASSERT(ring);
++ memset(ring, 0, sizeof(struct mp_ring));
++ ring->num = num;
++ ring->pages = DIV_ROUND_UP(num * size, PAGE_SIZE);
++ ring->itemSize = size;
++ ring->va = va;
++}
++
++/*
++ * -----------------------------------------------------------------------
++ * Interface for 2 index rings. i.e. consumer/producer rings
++ * --------------------------------------------------------------------------
++ */
++
++/* Returns number items pending on ring. */
++static inline u32 mp_ring_num_pending(struct mp_ring *ring)
++{
++ ASSERT(ring);
++ if (ring->num == 0)
++ return 0;
++ return be_subc(ring->pidx, ring->cidx, ring->num);
++}
++
++/* Returns number items free on ring. */
++static inline u32 mp_ring_num_empty(struct mp_ring *ring)
++{
++ ASSERT(ring);
++ return ring->num - 1 - mp_ring_num_pending(ring);
++}
++
++/* Consume 1 item */
++static inline void mp_ring_consume(struct mp_ring *ring)
++{
++ ASSERT(ring);
++ ASSERT(ring->pidx != ring->cidx);
++
++ ring->cidx = be_addc(ring->cidx, 1, ring->num);
++}
++
++/* Produce 1 item */
++static inline void mp_ring_produce(struct mp_ring *ring)
++{
++ ASSERT(ring);
++ ring->pidx = be_addc(ring->pidx, 1, ring->num);
++}
++
++/* Consume count items */
++static inline void mp_ring_consume_multiple(struct mp_ring *ring, u32 count)
++{
++ ASSERT(ring);
++ ASSERT(mp_ring_num_pending(ring) >= count);
++ ring->cidx = be_addc(ring->cidx, count, ring->num);
++}
++
++static inline void *mp_ring_item(struct mp_ring *ring, u32 index)
++{
++ ASSERT(ring);
++ ASSERT(index < ring->num);
++ ASSERT(ring->itemSize > 0);
++ return (u8 *) ring->va + index * ring->itemSize;
++}
++
++/* Ptr to produce item */
++static inline void *mp_ring_producer_ptr(struct mp_ring *ring)
++{
++ ASSERT(ring);
++ return mp_ring_item(ring, ring->pidx);
++}
++
++/*
++ * Returns a pointer to the current location in the ring.
++ * This is used for rings with 1 index.
++ */
++static inline void *mp_ring_current(struct mp_ring *ring)
++{
++ ASSERT(ring);
++ ASSERT(ring->pidx == 0); /* not used */
++
++ return mp_ring_item(ring, ring->cidx);
++}
++
++/*
++ * Increment index for rings with only 1 index.
++ * This is used for rings with 1 index.
++ */
++static inline void *mp_ring_next(struct mp_ring *ring)
++{
++ ASSERT(ring);
++ ASSERT(ring->num > 0);
++ ASSERT(ring->pidx == 0); /* not used */
++
++ ring->cidx = be_addc(ring->cidx, 1, ring->num);
++ return mp_ring_current(ring);
++}
++
++/*
++ This routine waits for a previously posted mailbox WRB to be completed.
++ Specifically it waits for the mailbox to say that it's ready to accept
++ more data by setting the LSB of the mailbox pd register to 1.
++
++ pcontroller - The function object to post this data to
++
++ IRQL < DISPATCH_LEVEL
++*/
++static void be_mcc_mailbox_wait(struct be_function_object *pfob)
++{
++ struct MPU_MAILBOX_DB_AMAP mailbox_db;
++ u32 i = 0;
++ u32 ready;
++
++ if (pfob->emulate) {
++ /* No waiting for mailbox in emulated mode. */
++ return;
++ }
++
++ mailbox_db.dw[0] = PD_READ(pfob, mcc_bootstrap_db);
++ ready = AMAP_GET_BITS_PTR(MPU_MAILBOX_DB, ready, &mailbox_db);
++
++ while (ready == false) {
++ if ((++i & 0x3FFFF) == 0) {
++ TRACE(DL_WARN, "Waiting for mailbox ready - %dk polls",
++ i / 1000);
++ }
++ udelay(1);
++ mailbox_db.dw[0] = PD_READ(pfob, mcc_bootstrap_db);
++ ready = AMAP_GET_BITS_PTR(MPU_MAILBOX_DB, ready, &mailbox_db);
++ }
++}
++
++/*
++ This routine tells the MCC mailbox that there is data to processed
++ in the mailbox. It does this by setting the physical address for the
++ mailbox location and clearing the LSB. This routine returns immediately
++ and does not wait for the WRB to be processed.
++
++ pcontroller - The function object to post this data to
++
++ IRQL < DISPATCH_LEVEL
++
++*/
++static void be_mcc_mailbox_notify(struct be_function_object *pfob)
++{
++ struct MPU_MAILBOX_DB_AMAP mailbox_db;
++ u32 pa;
++
++ ASSERT(pfob->mailbox.pa);
++ ASSERT(pfob->mailbox.va);
++
++ /* If emulated, do not ring the mailbox */
++ if (pfob->emulate) {
++ TRACE(DL_WARN, "MPU disabled. Skipping mailbox notify.");
++ return;
++ }
++
++ /* form the higher bits in the address */
++ mailbox_db.dw[0] = 0; /* init */
++ AMAP_SET_BITS_PTR(MPU_MAILBOX_DB, hi, &mailbox_db, 1);
++ AMAP_SET_BITS_PTR(MPU_MAILBOX_DB, ready, &mailbox_db, 0);
++
++ /* bits 34 to 63 */
++ pa = (u32) (pfob->mailbox.pa >> 34);
++ AMAP_SET_BITS_PTR(MPU_MAILBOX_DB, address, &mailbox_db, pa);
++
++ /* Wait for the MPU to be ready */
++ be_mcc_mailbox_wait(pfob);
++
++ /* Ring doorbell 1st time */
++ PD_WRITE(pfob, mcc_bootstrap_db, mailbox_db.dw[0]);
++
++ /* Wait for 1st write to be acknowledged. */
++ be_mcc_mailbox_wait(pfob);
++
++ /* lower bits 30 bits from 4th bit (bits 4 to 33)*/
++ pa = (u32) (pfob->mailbox.pa >> 4) & 0x3FFFFFFF;
++
++ AMAP_SET_BITS_PTR(MPU_MAILBOX_DB, hi, &mailbox_db, 0);
++ AMAP_SET_BITS_PTR(MPU_MAILBOX_DB, ready, &mailbox_db, 0);
++ AMAP_SET_BITS_PTR(MPU_MAILBOX_DB, address, &mailbox_db, pa);
++
++ /* Ring doorbell 2nd time */
++ PD_WRITE(pfob, mcc_bootstrap_db, mailbox_db.dw[0]);
++}
++
++/*
++ This routine tells the MCC mailbox that there is data to processed
++ in the mailbox. It does this by setting the physical address for the
++ mailbox location and clearing the LSB. This routine spins until the
++ MPU writes a 1 into the LSB indicating that the data has been received
++ and is ready to be processed.
++
++ pcontroller - The function object to post this data to
++
++ IRQL < DISPATCH_LEVEL
++*/
++static void
++be_mcc_mailbox_notify_and_wait(struct be_function_object *pfob)
++{
++ /*
++ * Notify it
++ */
++ be_mcc_mailbox_notify(pfob);
++ /*
++ * Now wait for completion of WRB
++ */
++ be_mcc_mailbox_wait(pfob);
++}
++
++void
++be_mcc_process_cqe(struct be_function_object *pfob,
++ struct MCC_CQ_ENTRY_AMAP *cqe)
++{
++ struct be_mcc_wrb_context *wrb_context = NULL;
++ u32 offset, status;
++ u8 *p;
++
++ ASSERT(cqe);
++ /*
++ * A command completed. Commands complete out-of-order.
++ * Determine which command completed from the TAG.
++ */
++ offset = offsetof(struct BE_MCC_CQ_ENTRY_AMAP, mcc_tag)/8;
++ p = (u8 *) cqe + offset;
++ wrb_context = (struct be_mcc_wrb_context *)(void *)(size_t)(*(u64 *)p);
++ ASSERT(wrb_context);
++
++ /*
++ * Perform a response copy if requested.
++ * Only copy data if the FWCMD is successful.
++ */
++ status = AMAP_GET_BITS_PTR(MCC_CQ_ENTRY, completion_status, cqe);
++ if (status == MGMT_STATUS_SUCCESS && wrb_context->copy.length > 0) {
++ ASSERT(wrb_context->wrb);
++ ASSERT(wrb_context->copy.va);
++ p = (u8 *)wrb_context->wrb +
++ offsetof(struct BE_MCC_WRB_AMAP, payload)/8;
++ memcpy(wrb_context->copy.va,
++ (u8 *)p + wrb_context->copy.fwcmd_offset,
++ wrb_context->copy.length);
++ }
++
++ if (status)
++ status = BE_NOT_OK;
++ /* internal callback */
++ if (wrb_context->internal_cb) {
++ wrb_context->internal_cb(wrb_context->internal_cb_context,
++ status, wrb_context->wrb);
++ }
++
++ /* callback */
++ if (wrb_context->cb) {
++ wrb_context->cb(wrb_context->cb_context,
++ status, wrb_context->wrb);
++ }
++ /* Free the context structure */
++ _be_mcc_free_wrb_context(pfob, wrb_context);
++}
++
++void be_drive_mcc_wrb_queue(struct be_mcc_object *mcc)
++{
++ struct be_function_object *pfob = NULL;
++ int status = BE_PENDING;
++ struct be_generic_q_ctxt *q_ctxt;
++ struct MCC_WRB_AMAP *wrb;
++ struct MCC_WRB_AMAP *queue_wrb;
++ u32 length, payload_length, sge_count, embedded;
++ unsigned long irql;
++
++ BUILD_BUG_ON((sizeof(struct be_generic_q_ctxt) <
++ sizeof(struct be_queue_driver_context) +
++ sizeof(struct MCC_WRB_AMAP)));
++ pfob = mcc->parent_function;
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ if (mcc->driving_backlog) {
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return;
++ }
++ /* Acquire the flag to limit 1 thread to redrive posts. */
++ mcc->driving_backlog = 1;
++
++ while (!list_empty(&mcc->backlog)) {
++ wrb = _be_mpu_peek_ring_wrb(mcc, true); /* Driving the queue */
++ if (!wrb)
++ break; /* No space in the ring yet. */
++ /* Get the next queued entry to process. */
++ q_ctxt = list_first_entry(&mcc->backlog,
++ struct be_generic_q_ctxt, context.list);
++ list_del(&q_ctxt->context.list);
++ pfob->mcc->backlog_length--;
++ /*
++ * Compute the required length of the WRB.
++ * Since the queue element may be smaller than
++ * the complete WRB, copy only the required number of bytes.
++ */
++ queue_wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header;
++ embedded = AMAP_GET_BITS_PTR(MCC_WRB, embedded, queue_wrb);
++ if (embedded) {
++ payload_length = AMAP_GET_BITS_PTR(MCC_WRB,
++ payload_length, queue_wrb);
++ length = sizeof(struct be_mcc_wrb_header) +
++ payload_length;
++ } else {
++ sge_count = AMAP_GET_BITS_PTR(MCC_WRB, sge_count,
++ queue_wrb);
++ ASSERT(sge_count == 1); /* only 1 frag. */
++ length = sizeof(struct be_mcc_wrb_header) +
++ sge_count * sizeof(struct MCC_SGE_AMAP);
++ }
++
++ /*
++ * Truncate the length based on the size of the
++ * queue element. Some elements that have output parameters
++ * can be smaller than the payload_length field would
++ * indicate. We really only need to copy the request
++ * parameters, not the response.
++ */
++ length = min(length, (u32) (q_ctxt->context.bytes -
++ offsetof(struct be_generic_q_ctxt, wrb_header)));
++
++ /* Copy the queue element WRB into the ring. */
++ memcpy(wrb, &q_ctxt->wrb_header, length);
++
++ /* Post the wrb. This should not fail assuming we have
++ * enough context structs. */
++ status = be_function_post_mcc_wrb(pfob, wrb, NULL,
++ q_ctxt->context.cb, q_ctxt->context.cb_context,
++ q_ctxt->context.internal_cb,
++ q_ctxt->context.internal_cb_context,
++ q_ctxt->context.optional_fwcmd_va,
++ &q_ctxt->context.copy);
++
++ if (status == BE_SUCCESS) {
++ /*
++ * Synchronous completion. Since it was queued,
++ * we will invoke the callback.
++ * To the user, this is an asynchronous request.
++ */
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++
++ ASSERT(q_ctxt->context.cb);
++
++ q_ctxt->context.cb(
++ q_ctxt->context.cb_context,
++ BE_SUCCESS, NULL);
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ } else if (status != BE_PENDING) {
++ /*
++ * Another resource failed. Should never happen
++ * if we have sufficient MCC_WRB_CONTEXT structs.
++ * Return to head of the queue.
++ */
++ TRACE(DL_WARN, "Failed to post a queued WRB. 0x%x",
++ status);
++ list_add(&q_ctxt->context.list, &mcc->backlog);
++ pfob->mcc->backlog_length++;
++ break;
++ }
++ }
++
++ /* Free the flag to limit 1 thread to redrive posts. */
++ mcc->driving_backlog = 0;
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++}
++
++/* This function asserts that the WRB was consumed in order. */
++#ifdef BE_DEBUG
++u32 be_mcc_wrb_consumed_in_order(struct be_mcc_object *mcc,
++ struct MCC_CQ_ENTRY_AMAP *cqe)
++{
++ struct be_mcc_wrb_context *wrb_context = NULL;
++ u32 wrb_index;
++ u32 wrb_consumed_in_order;
++ u32 offset;
++ u8 *p;
++
++ ASSERT(cqe);
++ /*
++ * A command completed. Commands complete out-of-order.
++ * Determine which command completed from the TAG.
++ */
++ offset = offsetof(struct BE_MCC_CQ_ENTRY_AMAP, mcc_tag)/8;
++ p = (u8 *) cqe + offset;
++ wrb_context = (struct be_mcc_wrb_context *)(void *)(size_t)(*(u64 *)p);
++
++ ASSERT(wrb_context);
++
++ wrb_index = (u32) (((u64)(size_t)wrb_context->ring_wrb -
++ (u64)(size_t)mcc->sq.ring.va) / sizeof(struct MCC_WRB_AMAP));
++
++ ASSERT(wrb_index < mcc->sq.ring.num);
++
++ wrb_consumed_in_order = (u32) (wrb_index == mcc->consumed_index);
++ mcc->consumed_index = be_addc(mcc->consumed_index, 1, mcc->sq.ring.num);
++ return wrb_consumed_in_order;
++}
++#endif
++
++int be_mcc_process_cq(struct be_mcc_object *mcc, bool rearm)
++{
++ struct be_function_object *pfob = NULL;
++ struct MCC_CQ_ENTRY_AMAP *cqe;
++ struct CQ_DB_AMAP db;
++ struct mp_ring *cq_ring = &mcc->cq.ring;
++ struct mp_ring *mp_ring = &mcc->sq.ring;
++ u32 num_processed = 0;
++ u32 consumed = 0, valid, completed, cqe_consumed, async_event;
++
++ pfob = mcc->parent_function;
++
++ spin_lock_irqsave(&pfob->cq_lock, pfob->cq_irq);
++
++ /*
++ * Verify that only one thread is processing the CQ at once.
++ * We cannot hold the lock while processing the CQ due to
++ * the callbacks into the OS. Therefore, this flag is used
++ * to control it. If any of the threads want to
++ * rearm the CQ, we need to honor that.
++ */
++ if (mcc->processing != 0) {
++ mcc->rearm = mcc->rearm || rearm;
++ goto Error;
++ } else {
++ mcc->processing = 1; /* lock processing for this thread. */
++ mcc->rearm = rearm; /* set our rearm setting */
++ }
++
++ spin_unlock_irqrestore(&pfob->cq_lock, pfob->cq_irq);
++
++ cqe = mp_ring_current(cq_ring);
++ valid = AMAP_GET_BITS_PTR(MCC_CQ_ENTRY, valid, cqe);
++ while (valid) {
++
++ if (num_processed >= 8) {
++ /* coalesce doorbells, but free space in cq
++ * ring while processing. */
++ db.dw[0] = 0; /* clear */
++ AMAP_SET_BITS_PTR(CQ_DB, qid, &db, cq_ring->id);
++ AMAP_SET_BITS_PTR(CQ_DB, rearm, &db, false);
++ AMAP_SET_BITS_PTR(CQ_DB, event, &db, false);
++ AMAP_SET_BITS_PTR(CQ_DB, num_popped, &db,
++ num_processed);
++ num_processed = 0;
++
++ PD_WRITE(pfob, cq_db, db.dw[0]);
++ }
++
++ async_event = AMAP_GET_BITS_PTR(MCC_CQ_ENTRY, async_event, cqe);
++ if (async_event) {
++ /* This is an asynchronous event. */
++ struct ASYNC_EVENT_TRAILER_AMAP *async_trailer =
++ (struct ASYNC_EVENT_TRAILER_AMAP *)
++ ((u8 *) cqe + sizeof(struct MCC_CQ_ENTRY_AMAP) -
++ sizeof(struct ASYNC_EVENT_TRAILER_AMAP));
++ u32 event_code;
++ async_event = AMAP_GET_BITS_PTR(ASYNC_EVENT_TRAILER,
++ async_event, async_trailer);
++ ASSERT(async_event == 1);
++
++
++ valid = AMAP_GET_BITS_PTR(ASYNC_EVENT_TRAILER,
++ valid, async_trailer);
++ ASSERT(valid == 1);
++
++ /* Call the async event handler if it is installed. */
++ if (mcc->async_cb) {
++ event_code =
++ AMAP_GET_BITS_PTR(ASYNC_EVENT_TRAILER,
++ event_code, async_trailer);
++ mcc->async_cb(mcc->async_context,
++ (u32) event_code, (void *) cqe);
++ }
++
++ } else {
++ /* This is a completion entry. */
++
++ /* No vm forwarding in this driver. */
++
++ cqe_consumed = AMAP_GET_BITS_PTR(MCC_CQ_ENTRY,
++ consumed, cqe);
++ if (cqe_consumed) {
++ /*
++ * A command on the MCC ring was consumed.
++ * Update the consumer index.
++ * These occur in order.
++ */
++ ASSERT(be_mcc_wrb_consumed_in_order(mcc, cqe));
++ consumed++;
++ }
++
++ completed = AMAP_GET_BITS_PTR(MCC_CQ_ENTRY,
++ completed, cqe);
++ if (completed) {
++ /* A command completed. Use tag to
++ * determine which command. */
++ be_mcc_process_cqe(pfob, cqe);
++ }
++ }
++
++ /* Reset the CQE */
++ AMAP_SET_BITS_PTR(MCC_CQ_ENTRY, valid, cqe, false);
++ num_processed++;
++
++ /* Update our tracking for the CQ ring. */
++ cqe = mp_ring_next(cq_ring);
++ valid = AMAP_GET_BITS_PTR(MCC_CQ_ENTRY, valid, cqe);
++ }
++
++ TRACE(DL_INFO, "num_processed:0x%x, and consumed:0x%x",
++ num_processed, consumed);
++ /*
++ * Grab the CQ lock to synchronize the "rearm" setting for
++ * the doorbell, and for clearing the "processing" flag.
++ */
++ spin_lock_irqsave(&pfob->cq_lock, pfob->cq_irq);
++
++ /*
++ * Rearm the cq. This is done based on the global mcc->rearm
++ * flag which combines the rearm parameter from the current
++ * call to process_cq and any other threads
++ * that tried to process the CQ while this one was active.
++ * This handles the situation where a sync. fwcmd was processing
++ * the CQ while the interrupt/dpc tries to process it.
++ * The sync process gets to continue -- but it is now
++ * responsible for the rearming.
++ */
++ if (num_processed > 0 || mcc->rearm == true) {
++ db.dw[0] = 0; /* clear */
++ AMAP_SET_BITS_PTR(CQ_DB, qid, &db, cq_ring->id);
++ AMAP_SET_BITS_PTR(CQ_DB, rearm, &db, mcc->rearm);
++ AMAP_SET_BITS_PTR(CQ_DB, event, &db, false);
++ AMAP_SET_BITS_PTR(CQ_DB, num_popped, &db, num_processed);
++
++ PD_WRITE(pfob, cq_db, db.dw[0]);
++ }
++ /*
++ * Update the consumer index after ringing the CQ doorbell.
++ * We don't want another thread to post more WRBs before we
++ * have CQ space available.
++ */
++ mp_ring_consume_multiple(mp_ring, consumed);
++
++ /* Clear the processing flag. */
++ mcc->processing = 0;
++
++Error:
++ spin_unlock_irqrestore(&pfob->cq_lock, pfob->cq_irq);
++ /*
++ * Use the local variable to detect if the current thread
++ * holds the WRB post lock. If rearm is false, this is
++ * either a synchronous command, or the upper layer driver is polling
++ * from a thread. We do not drive the queue from that
++ * context since the driver may hold the
++ * wrb post lock already.
++ */
++ if (rearm)
++ be_drive_mcc_wrb_queue(mcc);
++ else
++ pfob->pend_queue_driving = 1;
++
++ return BE_SUCCESS;
++}
++
++/*
++ *============================================================================
++ * P U B L I C R O U T I N E S
++ *============================================================================
++ */
++
++/*
++ This routine creates an MCC object. This object contains an MCC send queue
++ and a CQ private to the MCC.
++
++ pcontroller - Handle to a function object
++
++ EqObject - EQ object that will be used to dispatch this MCC
++
++ ppMccObject - Pointer to an internal Mcc Object returned.
++
++ Returns BE_SUCCESS if successfull,, otherwise a useful error code
++ is returned.
++
++ IRQL < DISPATCH_LEVEL
++
++*/
++int
++be_mcc_ring_create(struct be_function_object *pfob,
++ struct ring_desc *rd, u32 length,
++ struct be_mcc_wrb_context *context_array,
++ u32 num_context_entries,
++ struct be_cq_object *cq, struct be_mcc_object *mcc)
++{
++ int status = 0;
++
++ struct FWCMD_COMMON_MCC_CREATE *fwcmd = NULL;
++ struct MCC_WRB_AMAP *wrb = NULL;
++ u32 num_entries_encoded, n, i;
++ void *va = NULL;
++ unsigned long irql;
++
++ if (length < sizeof(struct MCC_WRB_AMAP) * 2) {
++ TRACE(DL_ERR, "Invalid MCC ring length:%d", length);
++ return BE_NOT_OK;
++ }
++ /*
++ * Reduce the actual ring size to be less than the number
++ * of context entries. This ensures that we run out of
++ * ring WRBs first so the queuing works correctly. We never
++ * queue based on context structs.
++ */
++ if (num_context_entries + 1 <
++ length / sizeof(struct MCC_WRB_AMAP) - 1) {
++
++ u32 max_length =
++ (num_context_entries + 2) * sizeof(struct MCC_WRB_AMAP);
++
++ if (is_power_of_2(max_length))
++ length = __roundup_pow_of_two(max_length+1) / 2;
++ else
++ length = __roundup_pow_of_two(max_length) / 2;
++
++ ASSERT(length <= max_length);
++
++ TRACE(DL_WARN,
++ "MCC ring length reduced based on context entries."
++ " length:%d wrbs:%d context_entries:%d", length,
++ (int) (length / sizeof(struct MCC_WRB_AMAP)),
++ num_context_entries);
++ }
++
++ spin_lock_irqsave(&pfob->post_lock, irql);
++
++ num_entries_encoded =
++ be_ring_length_to_encoding(length, sizeof(struct MCC_WRB_AMAP));
++
++ /* Init MCC object. */
++ memset(mcc, 0, sizeof(*mcc));
++ mcc->parent_function = pfob;
++ mcc->cq_object = cq;
++
++ INIT_LIST_HEAD(&mcc->backlog);
++
++ wrb = be_function_peek_mcc_wrb(pfob);
++ if (!wrb) {
++ ASSERT(wrb);
++ TRACE(DL_ERR, "No free MCC WRBs in create EQ.");
++ status = BE_STATUS_NO_MCC_WRB;
++ goto error;
++ }
++ /* Prepares an embedded fwcmd, including request/response sizes. */
++ fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_MCC_CREATE);
++
++ fwcmd->params.request.num_pages = DIV_ROUND_UP(length, PAGE_SIZE);
++ /*
++ * Program MCC ring context
++ */
++ AMAP_SET_BITS_PTR(MCC_RING_CONTEXT, pdid,
++ &fwcmd->params.request.context, 0);
++ AMAP_SET_BITS_PTR(MCC_RING_CONTEXT, invalid,
++ &fwcmd->params.request.context, false);
++ AMAP_SET_BITS_PTR(MCC_RING_CONTEXT, ring_size,
++ &fwcmd->params.request.context, num_entries_encoded);
++
++ n = cq->cq_id;
++ AMAP_SET_BITS_PTR(MCC_RING_CONTEXT,
++ cq_id, &fwcmd->params.request.context, n);
++ be_rd_to_pa_list(rd, fwcmd->params.request.pages,
++ ARRAY_SIZE(fwcmd->params.request.pages));
++ /* Post the f/w command */
++ status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL,
++ NULL, NULL, fwcmd, NULL);
++ if (status != BE_SUCCESS) {
++ TRACE(DL_ERR, "MCC to create CQ failed.");
++ goto error;
++ }
++ /*
++ * Create a linked list of context structures
++ */
++ mcc->wrb_context.base = context_array;
++ mcc->wrb_context.num = num_context_entries;
++ INIT_LIST_HEAD(&mcc->wrb_context.list_head);
++ memset(context_array, 0,
++ sizeof(struct be_mcc_wrb_context) * num_context_entries);
++ for (i = 0; i < mcc->wrb_context.num; i++) {
++ list_add_tail(&context_array[i].next,
++ &mcc->wrb_context.list_head);
++ }
++
++ /*
++ *
++ * Create an mcc_ring for tracking WRB hw ring
++ */
++ va = rd->va;
++ ASSERT(va);
++ mp_ring_create(&mcc->sq.ring, length / sizeof(struct MCC_WRB_AMAP),
++ sizeof(struct MCC_WRB_AMAP), va);
++ mcc->sq.ring.id = fwcmd->params.response.id;
++ /*
++ * Init a mcc_ring for tracking the MCC CQ.
++ */
++ ASSERT(cq->va);
++ mp_ring_create(&mcc->cq.ring, cq->num_entries,
++ sizeof(struct MCC_CQ_ENTRY_AMAP), cq->va);
++ mcc->cq.ring.id = cq->cq_id;
++
++ /* Force zeroing of CQ. */
++ memset(cq->va, 0, cq->num_entries * sizeof(struct MCC_CQ_ENTRY_AMAP));
++
++ /* Initialize debug index. */
++ mcc->consumed_index = 0;
++
++ atomic_inc(&cq->ref_count);
++ pfob->mcc = mcc;
++
++ TRACE(DL_INFO, "MCC ring created. id:%d bytes:%d cq_id:%d cq_entries:%d"
++ " num_context:%d", mcc->sq.ring.id, length,
++ cq->cq_id, cq->num_entries, num_context_entries);
++
++error:
++ spin_unlock_irqrestore(&pfob->post_lock, irql);
++ if (pfob->pend_queue_driving && pfob->mcc) {
++ pfob->pend_queue_driving = 0;
++ be_drive_mcc_wrb_queue(pfob->mcc);
++ }
++ return status;
++}
++
++/*
++ This routine destroys an MCC send queue
++
++ MccObject - Internal Mcc Object to be destroyed.
++
++ Returns BE_SUCCESS if successfull, otherwise an error code is returned.
++
++ IRQL < DISPATCH_LEVEL
++
++ The caller of this routine must ensure that no other WRB may be posted
++ until this routine returns.
++
++*/
++int be_mcc_ring_destroy(struct be_mcc_object *mcc)
++{
++ int status = 0;
++ struct be_function_object *pfob = mcc->parent_function;
++
++
++ ASSERT(mcc->processing == 0);
++
++ /*
++ * Remove the ring from the function object.
++ * This transitions back to mailbox mode.
++ */
++ pfob->mcc = NULL;
++
++ /* Send fwcmd to destroy the queue. (Using the mailbox.) */
++ status = be_function_ring_destroy(mcc->parent_function, mcc->sq.ring.id,
++ FWCMD_RING_TYPE_MCC, NULL, NULL, NULL, NULL);
++ ASSERT(status == 0);
++
++ /* Release the SQ reference to the CQ */
++ atomic_dec(&mcc->cq_object->ref_count);
++
++ return status;
++}
++
++static void
++mcc_wrb_sync_cb(void *context, int staus, struct MCC_WRB_AMAP *wrb)
++{
++ struct be_mcc_wrb_context *wrb_context =
++ (struct be_mcc_wrb_context *) context;
++ ASSERT(wrb_context);
++ *wrb_context->users_final_status = staus;
++}
++
++/*
++ This routine posts a command to the MCC send queue
++
++ mcc - Internal Mcc Object to be destroyed.
++
++ wrb - wrb to post.
++
++ Returns BE_SUCCESS if successfull, otherwise an error code is returned.
++
++ IRQL < DISPATCH_LEVEL if CompletionCallback is not NULL
++ IRQL <=DISPATCH_LEVEL if CompletionCallback is NULL
++
++ If this routine is called with CompletionCallback != NULL the
++ call is considered to be asynchronous and will return as soon
++ as the WRB is posted to the MCC with BE_PENDING.
++
++ If CompletionCallback is NULL, then this routine will not return until
++ a completion for this MCC command has been processed.
++ If called at DISPATCH_LEVEL the CompletionCallback must be NULL.
++
++ This routine should only be called if the MPU has been boostraped past
++ mailbox mode.
++
++
++*/
++int
++_be_mpu_post_wrb_ring(struct be_mcc_object *mcc, struct MCC_WRB_AMAP *wrb,
++ struct be_mcc_wrb_context *wrb_context)
++{
++
++ struct MCC_WRB_AMAP *ring_wrb = NULL;
++ int status = BE_PENDING;
++ int final_status = BE_PENDING;
++ mcc_wrb_cqe_callback cb = NULL;
++ struct MCC_DB_AMAP mcc_db;
++ u32 embedded;
++
++ ASSERT(mp_ring_num_empty(&mcc->sq.ring) > 0);
++ /*
++ * Input wrb is most likely the next wrb in the ring, since the client
++ * can peek at the address.
++ */
++ ring_wrb = mp_ring_producer_ptr(&mcc->sq.ring);
++ if (wrb != ring_wrb) {
++ /* If not equal, copy it into the ring. */
++ memcpy(ring_wrb, wrb, sizeof(struct MCC_WRB_AMAP));
++ }
++#ifdef BE_DEBUG
++ wrb_context->ring_wrb = ring_wrb;
++#endif
++ embedded = AMAP_GET_BITS_PTR(MCC_WRB, embedded, ring_wrb);
++ if (embedded) {
++ /* embedded commands will have the response within the WRB. */
++ wrb_context->wrb = ring_wrb;
++ } else {
++ /*
++ * non-embedded commands will not have the response
++ * within the WRB, and they may complete out-of-order.
++ * The WRB will not be valid to inspect
++ * during the completion.
++ */
++ wrb_context->wrb = NULL;
++ }
++ cb = wrb_context->cb;
++
++ if (cb == NULL) {
++ /* Assign our internal callback if this is a
++ * synchronous call. */
++ wrb_context->cb = mcc_wrb_sync_cb;
++ wrb_context->cb_context = wrb_context;
++ wrb_context->users_final_status = &final_status;
++ }
++ /* Increment producer index */
++
++ mcc_db.dw[0] = 0; /* initialize */
++ AMAP_SET_BITS_PTR(MCC_DB, rid, &mcc_db, mcc->sq.ring.id);
++ AMAP_SET_BITS_PTR(MCC_DB, numPosted, &mcc_db, 1);
++
++ mp_ring_produce(&mcc->sq.ring);
++ PD_WRITE(mcc->parent_function, mpu_mcc_db, mcc_db.dw[0]);
++ TRACE(DL_INFO, "pidx: %x and cidx: %x.", mcc->sq.ring.pidx,
++ mcc->sq.ring.cidx);
++
++ if (cb == NULL) {
++ int polls = 0; /* At >= 1 us per poll */
++ /* Wait until this command completes, polling the CQ. */
++ do {
++ TRACE(DL_INFO, "FWCMD submitted in the poll mode.");
++ /* Do not rearm CQ in this context. */
++ be_mcc_process_cq(mcc, false);
++
++ if (final_status == BE_PENDING) {
++ if ((++polls & 0x7FFFF) == 0) {
++ TRACE(DL_WARN,
++ "Warning : polling MCC CQ for %d"
++ "ms.", polls / 1000);
++ }
++
++ udelay(1);
++ }
++
++ /* final_status changed when the command completes */
++ } while (final_status == BE_PENDING);
++
++ status = final_status;
++ }
++
++ return status;
++}
++
++struct MCC_WRB_AMAP *
++_be_mpu_peek_ring_wrb(struct be_mcc_object *mcc, bool driving_queue)
++{
++ /* If we have queued items, do not allow a post to bypass the queue. */
++ if (!driving_queue && !list_empty(&mcc->backlog))
++ return NULL;
++
++ if (mp_ring_num_empty(&mcc->sq.ring) <= 0)
++ return NULL;
++ return (struct MCC_WRB_AMAP *) mp_ring_producer_ptr(&mcc->sq.ring);
++}
++
++int
++be_mpu_init_mailbox(struct be_function_object *pfob, struct ring_desc *mailbox)
++{
++ ASSERT(mailbox);
++ pfob->mailbox.va = mailbox->va;
++ pfob->mailbox.pa = cpu_to_le64(mailbox->pa);
++ pfob->mailbox.length = mailbox->length;
++
++ ASSERT(((u32)(size_t)pfob->mailbox.va & 0xf) == 0);
++ ASSERT(((u32)(size_t)pfob->mailbox.pa & 0xf) == 0);
++ /*
++ * Issue the WRB to set MPU endianness
++ */
++ {
++ u64 *endian_check = (u64 *) (pfob->mailbox.va +
++ offsetof(struct BE_MCC_MAILBOX_AMAP, wrb)/8);
++ *endian_check = 0xFF1234FFFF5678FFULL;
++ }
++
++ be_mcc_mailbox_notify_and_wait(pfob);
++
++ return BE_SUCCESS;
++}
++
++
++/*
++ This routine posts a command to the MCC mailbox.
++
++ FuncObj - Function Object to post the WRB on behalf of.
++ wrb - wrb to post.
++ CompletionCallback - Address of a callback routine to invoke once the WRB
++ is completed.
++ CompletionCallbackContext - Opaque context to be passed during the call to
++ the CompletionCallback.
++ Returns BE_SUCCESS if successfull, otherwise an error code is returned.
++
++ IRQL <=DISPATCH_LEVEL if CompletionCallback is NULL
++
++ This routine will block until a completion for this MCC command has been
++ processed. If called at DISPATCH_LEVEL the CompletionCallback must be NULL.
++
++ This routine should only be called if the MPU has not been boostraped past
++ mailbox mode.
++*/
++int
++_be_mpu_post_wrb_mailbox(struct be_function_object *pfob,
++ struct MCC_WRB_AMAP *wrb, struct be_mcc_wrb_context *wrb_context)
++{
++ struct MCC_MAILBOX_AMAP *mailbox = NULL;
++ struct MCC_WRB_AMAP *mb_wrb;
++ struct MCC_CQ_ENTRY_AMAP *mb_cq;
++ u32 offset, status;
++
++ ASSERT(pfob->mcc == NULL);
++ mailbox = pfob->mailbox.va;
++ ASSERT(mailbox);
++
++ offset = offsetof(struct BE_MCC_MAILBOX_AMAP, wrb)/8;
++ mb_wrb = (struct MCC_WRB_AMAP *) (u8 *)mailbox + offset;
++ if (mb_wrb != wrb) {
++ memset(mailbox, 0, sizeof(*mailbox));
++ memcpy(mb_wrb, wrb, sizeof(struct MCC_WRB_AMAP));
++ }
++ /* The callback can inspect the final WRB to get output parameters. */
++ wrb_context->wrb = mb_wrb;
++
++ be_mcc_mailbox_notify_and_wait(pfob);
++
++ /* A command completed. Use tag to determine which command. */
++ offset = offsetof(struct BE_MCC_MAILBOX_AMAP, cq)/8;
++ mb_cq = (struct MCC_CQ_ENTRY_AMAP *) ((u8 *)mailbox + offset);
++ be_mcc_process_cqe(pfob, mb_cq);
++
++ status = AMAP_GET_BITS_PTR(MCC_CQ_ENTRY, completion_status, mb_cq);
++ if (status)
++ status = BE_NOT_OK;
++ return status;
++}
++
++struct be_mcc_wrb_context *
++_be_mcc_allocate_wrb_context(struct be_function_object *pfob)
++{
++ struct be_mcc_wrb_context *context = NULL;
++ unsigned long irq;
++
++ spin_lock_irqsave(&pfob->mcc_context_lock, irq);
++
++ if (!pfob->mailbox.default_context_allocated) {
++ /* Use the single default context that we
++ * always have allocated. */
++ pfob->mailbox.default_context_allocated = true;
++ context = &pfob->mailbox.default_context;
++ } else if (pfob->mcc) {
++ /* Get a context from the free list. If any are available. */
++ if (!list_empty(&pfob->mcc->wrb_context.list_head)) {
++ context = list_first_entry(
++ &pfob->mcc->wrb_context.list_head,
++ struct be_mcc_wrb_context, next);
++ }
++ }
++
++ spin_unlock_irqrestore(&pfob->mcc_context_lock, irq);
++
++ return context;
++}
++
++void
++_be_mcc_free_wrb_context(struct be_function_object *pfob,
++ struct be_mcc_wrb_context *context)
++{
++ unsigned long irq;
++
++ ASSERT(context);
++ /*
++ * Zero during free to try and catch any bugs where the context
++ * is accessed after a free.
++ */
++ memset(context, 0, sizeof(context));
++
++ spin_lock_irqsave(&pfob->mcc_context_lock, irq);
++
++ if (context == &pfob->mailbox.default_context) {
++ /* Free the default context. */
++ ASSERT(pfob->mailbox.default_context_allocated);
++ pfob->mailbox.default_context_allocated = false;
++ } else {
++ /* Add to free list. */
++ ASSERT(pfob->mcc);
++ list_add_tail(&context->next,
++ &pfob->mcc->wrb_context.list_head);
++ }
++
++ spin_unlock_irqrestore(&pfob->mcc_context_lock, irq);
++}
++
++int
++be_mcc_add_async_event_callback(struct be_mcc_object *mcc_object,
++ mcc_async_event_callback cb, void *cb_context)
++{
++ /* Lock against anyone trying to change the callback/context pointers
++ * while being used. */
++ spin_lock_irqsave(&mcc_object->parent_function->cq_lock,
++ mcc_object->parent_function->cq_irq);
++
++ /* Assign the async callback. */
++ mcc_object->async_context = cb_context;
++ mcc_object->async_cb = cb;
++
++ spin_unlock_irqrestore(&mcc_object->parent_function->cq_lock,
++ mcc_object->parent_function->cq_irq);
++
++ return BE_SUCCESS;
++}
++
++#define MPU_EP_CONTROL 0
++#define MPU_EP_SEMAPHORE 0xac
++
++/*
++ *-------------------------------------------------------------------
++ * Function: be_wait_for_POST_complete
++ * Waits until the BladeEngine POST completes (either in error or success).
++ * pfob -
++ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
++ *-------------------------------------------------------------------
++ */
++static int be_wait_for_POST_complete(struct be_function_object *pfob)
++{
++ struct MGMT_HBA_POST_STATUS_STRUCT_AMAP status;
++ int s;
++ u32 post_error, post_stage;
++
++ const u32 us_per_loop = 1000; /* 1000us */
++ const u32 print_frequency_loops = 1000000 / us_per_loop;
++ const u32 max_loops = 60 * print_frequency_loops;
++ u32 loops = 0;
++
++ /*
++ * Wait for arm fw indicating it is done or a fatal error happened.
++ * Note: POST can take some time to complete depending on configuration
++ * settings (consider ARM attempts to acquire an IP address
++ * over DHCP!!!).
++ *
++ */
++ do {
++ status.dw[0] = ioread32(pfob->csr_va + MPU_EP_SEMAPHORE);
++ post_error = AMAP_GET_BITS_PTR(MGMT_HBA_POST_STATUS_STRUCT,
++ error, &status);
++ post_stage = AMAP_GET_BITS_PTR(MGMT_HBA_POST_STATUS_STRUCT,
++ stage, &status);
++ if (0 == (loops % print_frequency_loops)) {
++ /* Print current status */
++ TRACE(DL_INFO, "POST status = 0x%x (stage = 0x%x)",
++ status.dw[0], post_stage);
++ }
++ udelay(us_per_loop);
++ } while ((post_error != 1) &&
++ (post_stage != POST_STAGE_ARMFW_READY) &&
++ (++loops < max_loops));
++
++ if (post_error == 1) {
++ TRACE(DL_ERR, "POST error! Status = 0x%x (stage = 0x%x)",
++ status.dw[0], post_stage);
++ s = BE_NOT_OK;
++ } else if (post_stage != POST_STAGE_ARMFW_READY) {
++ TRACE(DL_ERR, "POST time-out! Status = 0x%x (stage = 0x%x)",
++ status.dw[0], post_stage);
++ s = BE_NOT_OK;
++ } else {
++ s = BE_SUCCESS;
++ }
++ return s;
++}
++
++/*
++ *-------------------------------------------------------------------
++ * Function: be_kickoff_and_wait_for_POST
++ * Interacts with the BladeEngine management processor to initiate POST, and
++ * subsequently waits until POST completes (either in error or success).
++ * The caller must acquire the reset semaphore before initiating POST
++ * to prevent multiple drivers interacting with the management processor.
++ * Once POST is complete the caller must release the reset semaphore.
++ * Callers who only want to wait for POST complete may call
++ * be_wait_for_POST_complete.
++ * pfob -
++ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
++ *-------------------------------------------------------------------
++ */
++static int
++be_kickoff_and_wait_for_POST(struct be_function_object *pfob)
++{
++ struct MGMT_HBA_POST_STATUS_STRUCT_AMAP status;
++ int s;
++
++ const u32 us_per_loop = 1000; /* 1000us */
++ const u32 print_frequency_loops = 1000000 / us_per_loop;
++ const u32 max_loops = 5 * print_frequency_loops;
++ u32 loops = 0;
++ u32 post_error, post_stage;
++
++ /* Wait for arm fw awaiting host ready or a fatal error happened. */
++ TRACE(DL_INFO, "Wait for BladeEngine ready to POST");
++ do {
++ status.dw[0] = ioread32(pfob->csr_va + MPU_EP_SEMAPHORE);
++ post_error = AMAP_GET_BITS_PTR(MGMT_HBA_POST_STATUS_STRUCT,
++ error, &status);
++ post_stage = AMAP_GET_BITS_PTR(MGMT_HBA_POST_STATUS_STRUCT,
++ stage, &status);
++ if (0 == (loops % print_frequency_loops)) {
++ /* Print current status */
++ TRACE(DL_INFO, "POST status = 0x%x (stage = 0x%x)",
++ status.dw[0], post_stage);
++ }
++ udelay(us_per_loop);
++ } while ((post_error != 1) &&
++ (post_stage < POST_STAGE_AWAITING_HOST_RDY) &&
++ (++loops < max_loops));
++
++ if (post_error == 1) {
++ TRACE(DL_ERR, "Pre-POST error! Status = 0x%x (stage = 0x%x)",
++ status.dw[0], post_stage);
++ s = BE_NOT_OK;
++ } else if (post_stage == POST_STAGE_AWAITING_HOST_RDY) {
++ iowrite32(POST_STAGE_HOST_RDY, pfob->csr_va + MPU_EP_SEMAPHORE);
++
++ /* Wait for POST to complete */
++ s = be_wait_for_POST_complete(pfob);
++ } else {
++ /*
++ * Either a timeout waiting for host ready signal or POST has
++ * moved ahead without requiring a host ready signal.
++ * Might as well give POST a chance to complete
++ * (or timeout again).
++ */
++ s = be_wait_for_POST_complete(pfob);
++ }
++ return s;
++}
++
++/*
++ *-------------------------------------------------------------------
++ * Function: be_pci_soft_reset
++ * This function is called to issue a BladeEngine soft reset.
++ * Callers should acquire the soft reset semaphore before calling this
++ * function. Additionaly, callers should ensure they cannot be pre-empted
++ * while the routine executes. Upon completion of this routine, callers
++ * should release the reset semaphore. This routine implicitly waits
++ * for BladeEngine POST to complete.
++ * pfob -
++ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
++ *-------------------------------------------------------------------
++ */
++int be_pci_soft_reset(struct be_function_object *pfob)
++{
++ struct PCICFG_SOFT_RESET_CSR_AMAP soft_reset;
++ struct PCICFG_ONLINE0_CSR_AMAP pciOnline0;
++ struct PCICFG_ONLINE1_CSR_AMAP pciOnline1;
++ struct EP_CONTROL_CSR_AMAP epControlCsr;
++ int status = BE_SUCCESS;
++ u32 i, soft_reset_bit;
++
++ TRACE(DL_NOTE, "PCI reset...");
++
++ /* Issue soft reset #1 to get BladeEngine into a known state. */
++ soft_reset.dw[0] = PCICFG0_READ(pfob, soft_reset);
++ AMAP_SET_BITS_PTR(PCICFG_SOFT_RESET_CSR, softreset, soft_reset.dw, 1);
++ PCICFG0_WRITE(pfob, host_timer_int_ctrl, soft_reset.dw[0]);
++ /*
++ * wait til soft reset is deasserted - hardware
++ * deasserts after some time.
++ */
++ i = 0;
++ do {
++ udelay(50);
++ soft_reset.dw[0] = PCICFG0_READ(pfob, soft_reset);
++ soft_reset_bit = AMAP_GET_BITS_PTR(PCICFG_SOFT_RESET_CSR,
++ softreset, soft_reset.dw);
++ } while (soft_reset_bit && (i++ < 1024));
++ if (soft_reset_bit != 0) {
++ TRACE(DL_ERR, "Soft-reset #1 did not deassert as expected.");
++ status = BE_NOT_OK;
++ goto Error_label;
++ }
++ /* Mask everything */
++ PCICFG0_WRITE(pfob, ue_status_low_mask, 0xFFFFFFFF);
++ PCICFG0_WRITE(pfob, ue_status_hi_mask, 0xFFFFFFFF);
++ /*
++ * Set everything offline except MPU IRAM (it is offline with
++ * the soft-reset, but soft-reset does not reset the PCICFG registers!)
++ */
++ pciOnline0.dw[0] = 0;
++ pciOnline1.dw[0] = 0;
++ AMAP_SET_BITS_PTR(PCICFG_ONLINE1_CSR, mpu_iram_online,
++ pciOnline1.dw, 1);
++ PCICFG0_WRITE(pfob, online0, pciOnline0.dw[0]);
++ PCICFG0_WRITE(pfob, online1, pciOnline1.dw[0]);
++
++ udelay(20000);
++
++ /* Issue soft reset #2. */
++ AMAP_SET_BITS_PTR(PCICFG_SOFT_RESET_CSR, softreset, soft_reset.dw, 1);
++ PCICFG0_WRITE(pfob, host_timer_int_ctrl, soft_reset.dw[0]);
++ /*
++ * wait til soft reset is deasserted - hardware
++ * deasserts after some time.
++ */
++ i = 0;
++ do {
++ udelay(50);
++ soft_reset.dw[0] = PCICFG0_READ(pfob, soft_reset);
++ soft_reset_bit = AMAP_GET_BITS_PTR(PCICFG_SOFT_RESET_CSR,
++ softreset, soft_reset.dw);
++ } while (soft_reset_bit && (i++ < 1024));
++ if (soft_reset_bit != 0) {
++ TRACE(DL_ERR, "Soft-reset #1 did not deassert as expected.");
++ status = BE_NOT_OK;
++ goto Error_label;
++ }
++
++
++ udelay(20000);
++
++ /* Take MPU out of reset. */
++
++ epControlCsr.dw[0] = ioread32(pfob->csr_va + MPU_EP_CONTROL);
++ AMAP_SET_BITS_PTR(EP_CONTROL_CSR, CPU_reset, &epControlCsr, 0);
++ iowrite32((u32)epControlCsr.dw[0], pfob->csr_va + MPU_EP_CONTROL);
++
++ /* Kickoff BE POST and wait for completion */
++ status = be_kickoff_and_wait_for_POST(pfob);
++
++Error_label:
++ return status;
++}
++
++
++/*
++ *-------------------------------------------------------------------
++ * Function: be_pci_reset_required
++ * This private function is called to detect if a host entity is
++ * required to issue a PCI soft reset and subsequently drive
++ * BladeEngine POST. Scenarios where this is required:
++ * 1) BIOS-less configuration
++ * 2) Hot-swap/plug/power-on
++ * pfob -
++ * return true if a reset is required, false otherwise
++ *-------------------------------------------------------------------
++ */
++static bool be_pci_reset_required(struct be_function_object *pfob)
++{
++ struct MGMT_HBA_POST_STATUS_STRUCT_AMAP status;
++ bool do_reset = false;
++ u32 post_error, post_stage;
++
++ /*
++ * Read the POST status register
++ */
++ status.dw[0] = ioread32(pfob->csr_va + MPU_EP_SEMAPHORE);
++ post_error = AMAP_GET_BITS_PTR(MGMT_HBA_POST_STATUS_STRUCT, error,
++ &status);
++ post_stage = AMAP_GET_BITS_PTR(MGMT_HBA_POST_STATUS_STRUCT, stage,
++ &status);
++ if (post_stage <= POST_STAGE_AWAITING_HOST_RDY) {
++ /*
++ * If BladeEngine is waiting for host ready indication,
++ * we want to do a PCI reset.
++ */
++ do_reset = true;
++ }
++
++ return do_reset;
++}
++
++/*
++ *-------------------------------------------------------------------
++ * Function: be_drive_POST
++ * This function is called to drive BladeEngine POST. The
++ * caller should ensure they cannot be pre-empted while this routine executes.
++ * pfob -
++ * return status - BE_SUCCESS (0) on success. Negative error code on failure.
++ *-------------------------------------------------------------------
++ */
++int be_drive_POST(struct be_function_object *pfob)
++{
++ int status;
++
++ if (false != be_pci_reset_required(pfob)) {
++ /* PCI reset is needed (implicitly starts and waits for POST) */
++ status = be_pci_soft_reset(pfob);
++ } else {
++ /* No PCI reset is needed, start POST */
++ status = be_kickoff_and_wait_for_POST(pfob);
++ }
++
++ return status;
++}
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/mpu_context.h linux-2.6.29-rc3.owrt/drivers/staging/benet/mpu_context.h
+--- linux-2.6.29.owrt/drivers/staging/benet/mpu_context.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/mpu_context.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,46 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * Autogenerated by srcgen version: 0127
++ */
++#ifndef __mpu_context_amap_h__
++#define __mpu_context_amap_h__
++
++/*
++ * Management command and control ring context. The MPUs BTLR_CTRL1 CSR
++ * controls the writeback behavior of the producer and consumer index values.
++ */
++struct BE_MCC_RING_CONTEXT_AMAP {
++ u8 con_index[16]; /* DWORD 0 */
++ u8 ring_size[4]; /* DWORD 0 */
++ u8 cq_id[11]; /* DWORD 0 */
++ u8 rsvd0; /* DWORD 0 */
++ u8 prod_index[16]; /* DWORD 1 */
++ u8 pdid[15]; /* DWORD 1 */
++ u8 invalid; /* DWORD 1 */
++ u8 cmd_pending_current[7]; /* DWORD 2 */
++ u8 rsvd1[25]; /* DWORD 2 */
++ u8 hpi_port_cq_id[11]; /* DWORD 3 */
++ u8 rsvd2[5]; /* DWORD 3 */
++ u8 cmd_pending_max[7]; /* DWORD 3 */
++ u8 rsvd3[9]; /* DWORD 3 */
++} __packed;
++struct MCC_RING_CONTEXT_AMAP {
++ u32 dw[4];
++};
++
++#endif /* __mpu_context_amap_h__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/mpu.h linux-2.6.29-rc3.owrt/drivers/staging/benet/mpu.h
+--- linux-2.6.29.owrt/drivers/staging/benet/mpu.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/mpu.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,74 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * Autogenerated by srcgen version: 0127
++ */
++#ifndef __mpu_amap_h__
++#define __mpu_amap_h__
++#include "ep.h"
++
++/* Provide control parameters for the Managment Processor Unit. */
++struct BE_MPU_CSRMAP_AMAP {
++ struct BE_EP_CSRMAP_AMAP ep;
++ u8 rsvd0[128]; /* DWORD 64 */
++ u8 rsvd1[32]; /* DWORD 68 */
++ u8 rsvd2[192]; /* DWORD 69 */
++ u8 rsvd3[192]; /* DWORD 75 */
++ u8 rsvd4[32]; /* DWORD 81 */
++ u8 rsvd5[32]; /* DWORD 82 */
++ u8 rsvd6[32]; /* DWORD 83 */
++ u8 rsvd7[32]; /* DWORD 84 */
++ u8 rsvd8[32]; /* DWORD 85 */
++ u8 rsvd9[32]; /* DWORD 86 */
++ u8 rsvd10[32]; /* DWORD 87 */
++ u8 rsvd11[32]; /* DWORD 88 */
++ u8 rsvd12[32]; /* DWORD 89 */
++ u8 rsvd13[32]; /* DWORD 90 */
++ u8 rsvd14[32]; /* DWORD 91 */
++ u8 rsvd15[32]; /* DWORD 92 */
++ u8 rsvd16[32]; /* DWORD 93 */
++ u8 rsvd17[32]; /* DWORD 94 */
++ u8 rsvd18[32]; /* DWORD 95 */
++ u8 rsvd19[32]; /* DWORD 96 */
++ u8 rsvd20[32]; /* DWORD 97 */
++ u8 rsvd21[32]; /* DWORD 98 */
++ u8 rsvd22[32]; /* DWORD 99 */
++ u8 rsvd23[32]; /* DWORD 100 */
++ u8 rsvd24[32]; /* DWORD 101 */
++ u8 rsvd25[32]; /* DWORD 102 */
++ u8 rsvd26[32]; /* DWORD 103 */
++ u8 rsvd27[32]; /* DWORD 104 */
++ u8 rsvd28[96]; /* DWORD 105 */
++ u8 rsvd29[32]; /* DWORD 108 */
++ u8 rsvd30[32]; /* DWORD 109 */
++ u8 rsvd31[32]; /* DWORD 110 */
++ u8 rsvd32[32]; /* DWORD 111 */
++ u8 rsvd33[32]; /* DWORD 112 */
++ u8 rsvd34[96]; /* DWORD 113 */
++ u8 rsvd35[32]; /* DWORD 116 */
++ u8 rsvd36[32]; /* DWORD 117 */
++ u8 rsvd37[32]; /* DWORD 118 */
++ u8 rsvd38[32]; /* DWORD 119 */
++ u8 rsvd39[32]; /* DWORD 120 */
++ u8 rsvd40[32]; /* DWORD 121 */
++ u8 rsvd41[134][32]; /* DWORD 122 */
++} __packed;
++struct MPU_CSRMAP_AMAP {
++ u32 dw[256];
++};
++
++#endif /* __mpu_amap_h__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/pcicfg.h linux-2.6.29-rc3.owrt/drivers/staging/benet/pcicfg.h
+--- linux-2.6.29.owrt/drivers/staging/benet/pcicfg.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/pcicfg.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,825 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * Autogenerated by srcgen version: 0127
++ */
++#ifndef __pcicfg_amap_h__
++#define __pcicfg_amap_h__
++
++/* Vendor and Device ID Register. */
++struct BE_PCICFG_ID_CSR_AMAP {
++ u8 vendorid[16]; /* DWORD 0 */
++ u8 deviceid[16]; /* DWORD 0 */
++} __packed;
++struct PCICFG_ID_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* IO Bar Register. */
++struct BE_PCICFG_IOBAR_CSR_AMAP {
++ u8 iospace; /* DWORD 0 */
++ u8 rsvd0[7]; /* DWORD 0 */
++ u8 iobar[24]; /* DWORD 0 */
++} __packed;
++struct PCICFG_IOBAR_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* Memory BAR 0 Register. */
++struct BE_PCICFG_MEMBAR0_CSR_AMAP {
++ u8 memspace; /* DWORD 0 */
++ u8 type[2]; /* DWORD 0 */
++ u8 pf; /* DWORD 0 */
++ u8 rsvd0[10]; /* DWORD 0 */
++ u8 membar0[18]; /* DWORD 0 */
++} __packed;
++struct PCICFG_MEMBAR0_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* Memory BAR 1 - Low Address Register. */
++struct BE_PCICFG_MEMBAR1_LO_CSR_AMAP {
++ u8 memspace; /* DWORD 0 */
++ u8 type[2]; /* DWORD 0 */
++ u8 pf; /* DWORD 0 */
++ u8 rsvd0[13]; /* DWORD 0 */
++ u8 membar1lo[15]; /* DWORD 0 */
++} __packed;
++struct PCICFG_MEMBAR1_LO_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* Memory BAR 1 - High Address Register. */
++struct BE_PCICFG_MEMBAR1_HI_CSR_AMAP {
++ u8 membar1hi[32]; /* DWORD 0 */
++} __packed;
++struct PCICFG_MEMBAR1_HI_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* Memory BAR 2 - Low Address Register. */
++struct BE_PCICFG_MEMBAR2_LO_CSR_AMAP {
++ u8 memspace; /* DWORD 0 */
++ u8 type[2]; /* DWORD 0 */
++ u8 pf; /* DWORD 0 */
++ u8 rsvd0[17]; /* DWORD 0 */
++ u8 membar2lo[11]; /* DWORD 0 */
++} __packed;
++struct PCICFG_MEMBAR2_LO_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* Memory BAR 2 - High Address Register. */
++struct BE_PCICFG_MEMBAR2_HI_CSR_AMAP {
++ u8 membar2hi[32]; /* DWORD 0 */
++} __packed;
++struct PCICFG_MEMBAR2_HI_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* Subsystem Vendor and ID (Function 0) Register. */
++struct BE_PCICFG_SUBSYSTEM_ID_F0_CSR_AMAP {
++ u8 subsys_vendor_id[16]; /* DWORD 0 */
++ u8 subsys_id[16]; /* DWORD 0 */
++} __packed;
++struct PCICFG_SUBSYSTEM_ID_F0_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* Subsystem Vendor and ID (Function 1) Register. */
++struct BE_PCICFG_SUBSYSTEM_ID_F1_CSR_AMAP {
++ u8 subsys_vendor_id[16]; /* DWORD 0 */
++ u8 subsys_id[16]; /* DWORD 0 */
++} __packed;
++struct PCICFG_SUBSYSTEM_ID_F1_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* Semaphore Register. */
++struct BE_PCICFG_SEMAPHORE_CSR_AMAP {
++ u8 locked; /* DWORD 0 */
++ u8 rsvd0[31]; /* DWORD 0 */
++} __packed;
++struct PCICFG_SEMAPHORE_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* Soft Reset Register. */
++struct BE_PCICFG_SOFT_RESET_CSR_AMAP {
++ u8 rsvd0[7]; /* DWORD 0 */
++ u8 softreset; /* DWORD 0 */
++ u8 rsvd1[16]; /* DWORD 0 */
++ u8 nec_ll_rcvdetect_i[8]; /* DWORD 0 */
++} __packed;
++struct PCICFG_SOFT_RESET_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* Unrecoverable Error Status (Low) Register. Each bit corresponds to
++ * an internal Unrecoverable Error. These are set by hardware and may be
++ * cleared by writing a one to the respective bit(s) to be cleared. Any
++ * bit being set that is also unmasked will result in Unrecoverable Error
++ * interrupt notification to the host CPU and/or Server Management chip
++ * and the transitioning of BladeEngine to an Offline state.
++ */
++struct BE_PCICFG_UE_STATUS_LOW_CSR_AMAP {
++ u8 cev_ue_status; /* DWORD 0 */
++ u8 ctx_ue_status; /* DWORD 0 */
++ u8 dbuf_ue_status; /* DWORD 0 */
++ u8 erx_ue_status; /* DWORD 0 */
++ u8 host_ue_status; /* DWORD 0 */
++ u8 mpu_ue_status; /* DWORD 0 */
++ u8 ndma_ue_status; /* DWORD 0 */
++ u8 ptc_ue_status; /* DWORD 0 */
++ u8 rdma_ue_status; /* DWORD 0 */
++ u8 rxf_ue_status; /* DWORD 0 */
++ u8 rxips_ue_status; /* DWORD 0 */
++ u8 rxulp0_ue_status; /* DWORD 0 */
++ u8 rxulp1_ue_status; /* DWORD 0 */
++ u8 rxulp2_ue_status; /* DWORD 0 */
++ u8 tim_ue_status; /* DWORD 0 */
++ u8 tpost_ue_status; /* DWORD 0 */
++ u8 tpre_ue_status; /* DWORD 0 */
++ u8 txips_ue_status; /* DWORD 0 */
++ u8 txulp0_ue_status; /* DWORD 0 */
++ u8 txulp1_ue_status; /* DWORD 0 */
++ u8 uc_ue_status; /* DWORD 0 */
++ u8 wdma_ue_status; /* DWORD 0 */
++ u8 txulp2_ue_status; /* DWORD 0 */
++ u8 host1_ue_status; /* DWORD 0 */
++ u8 p0_ob_link_ue_status; /* DWORD 0 */
++ u8 p1_ob_link_ue_status; /* DWORD 0 */
++ u8 host_gpio_ue_status; /* DWORD 0 */
++ u8 mbox_netw_ue_status; /* DWORD 0 */
++ u8 mbox_stor_ue_status; /* DWORD 0 */
++ u8 axgmac0_ue_status; /* DWORD 0 */
++ u8 axgmac1_ue_status; /* DWORD 0 */
++ u8 mpu_intpend_ue_status; /* DWORD 0 */
++} __packed;
++struct PCICFG_UE_STATUS_LOW_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* Unrecoverable Error Status (High) Register. Each bit corresponds to
++ * an internal Unrecoverable Error. These are set by hardware and may be
++ * cleared by writing a one to the respective bit(s) to be cleared. Any
++ * bit being set that is also unmasked will result in Unrecoverable Error
++ * interrupt notification to the host CPU and/or Server Management chip;
++ * and the transitioning of BladeEngine to an Offline state.
++ */
++struct BE_PCICFG_UE_STATUS_HI_CSR_AMAP {
++ u8 jtag_ue_status; /* DWORD 0 */
++ u8 lpcmemhost_ue_status; /* DWORD 0 */
++ u8 mgmt_mac_ue_status; /* DWORD 0 */
++ u8 mpu_iram_ue_status; /* DWORD 0 */
++ u8 pcs0online_ue_status; /* DWORD 0 */
++ u8 pcs1online_ue_status; /* DWORD 0 */
++ u8 pctl0_ue_status; /* DWORD 0 */
++ u8 pctl1_ue_status; /* DWORD 0 */
++ u8 pmem_ue_status; /* DWORD 0 */
++ u8 rr_ue_status; /* DWORD 0 */
++ u8 rxpp_ue_status; /* DWORD 0 */
++ u8 txpb_ue_status; /* DWORD 0 */
++ u8 txp_ue_status; /* DWORD 0 */
++ u8 xaui_ue_status; /* DWORD 0 */
++ u8 arm_ue_status; /* DWORD 0 */
++ u8 ipc_ue_status; /* DWORD 0 */
++ u8 rsvd0[16]; /* DWORD 0 */
++} __packed;
++struct PCICFG_UE_STATUS_HI_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* Unrecoverable Error Mask (Low) Register. Each bit, when set to one,
++ * will mask the associated Unrecoverable Error status bit from notification
++ * of Unrecoverable Error to the host CPU and/or Server Managment chip and the
++ * transitioning of all BladeEngine units to an Offline state.
++ */
++struct BE_PCICFG_UE_STATUS_LOW_MASK_CSR_AMAP {
++ u8 cev_ue_mask; /* DWORD 0 */
++ u8 ctx_ue_mask; /* DWORD 0 */
++ u8 dbuf_ue_mask; /* DWORD 0 */
++ u8 erx_ue_mask; /* DWORD 0 */
++ u8 host_ue_mask; /* DWORD 0 */
++ u8 mpu_ue_mask; /* DWORD 0 */
++ u8 ndma_ue_mask; /* DWORD 0 */
++ u8 ptc_ue_mask; /* DWORD 0 */
++ u8 rdma_ue_mask; /* DWORD 0 */
++ u8 rxf_ue_mask; /* DWORD 0 */
++ u8 rxips_ue_mask; /* DWORD 0 */
++ u8 rxulp0_ue_mask; /* DWORD 0 */
++ u8 rxulp1_ue_mask; /* DWORD 0 */
++ u8 rxulp2_ue_mask; /* DWORD 0 */
++ u8 tim_ue_mask; /* DWORD 0 */
++ u8 tpost_ue_mask; /* DWORD 0 */
++ u8 tpre_ue_mask; /* DWORD 0 */
++ u8 txips_ue_mask; /* DWORD 0 */
++ u8 txulp0_ue_mask; /* DWORD 0 */
++ u8 txulp1_ue_mask; /* DWORD 0 */
++ u8 uc_ue_mask; /* DWORD 0 */
++ u8 wdma_ue_mask; /* DWORD 0 */
++ u8 txulp2_ue_mask; /* DWORD 0 */
++ u8 host1_ue_mask; /* DWORD 0 */
++ u8 p0_ob_link_ue_mask; /* DWORD 0 */
++ u8 p1_ob_link_ue_mask; /* DWORD 0 */
++ u8 host_gpio_ue_mask; /* DWORD 0 */
++ u8 mbox_netw_ue_mask; /* DWORD 0 */
++ u8 mbox_stor_ue_mask; /* DWORD 0 */
++ u8 axgmac0_ue_mask; /* DWORD 0 */
++ u8 axgmac1_ue_mask; /* DWORD 0 */
++ u8 mpu_intpend_ue_mask; /* DWORD 0 */
++} __packed;
++struct PCICFG_UE_STATUS_LOW_MASK_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* Unrecoverable Error Mask (High) Register. Each bit, when set to one,
++ * will mask the associated Unrecoverable Error status bit from notification
++ * of Unrecoverable Error to the host CPU and/or Server Managment chip and the
++ * transitioning of all BladeEngine units to an Offline state.
++ */
++struct BE_PCICFG_UE_STATUS_HI_MASK_CSR_AMAP {
++ u8 jtag_ue_mask; /* DWORD 0 */
++ u8 lpcmemhost_ue_mask; /* DWORD 0 */
++ u8 mgmt_mac_ue_mask; /* DWORD 0 */
++ u8 mpu_iram_ue_mask; /* DWORD 0 */
++ u8 pcs0online_ue_mask; /* DWORD 0 */
++ u8 pcs1online_ue_mask; /* DWORD 0 */
++ u8 pctl0_ue_mask; /* DWORD 0 */
++ u8 pctl1_ue_mask; /* DWORD 0 */
++ u8 pmem_ue_mask; /* DWORD 0 */
++ u8 rr_ue_mask; /* DWORD 0 */
++ u8 rxpp_ue_mask; /* DWORD 0 */
++ u8 txpb_ue_mask; /* DWORD 0 */
++ u8 txp_ue_mask; /* DWORD 0 */
++ u8 xaui_ue_mask; /* DWORD 0 */
++ u8 arm_ue_mask; /* DWORD 0 */
++ u8 ipc_ue_mask; /* DWORD 0 */
++ u8 rsvd0[16]; /* DWORD 0 */
++} __packed;
++struct PCICFG_UE_STATUS_HI_MASK_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* Online Control Register 0. This register controls various units within
++ * BladeEngine being in an Online or Offline state.
++ */
++struct BE_PCICFG_ONLINE0_CSR_AMAP {
++ u8 cev_online; /* DWORD 0 */
++ u8 ctx_online; /* DWORD 0 */
++ u8 dbuf_online; /* DWORD 0 */
++ u8 erx_online; /* DWORD 0 */
++ u8 host_online; /* DWORD 0 */
++ u8 mpu_online; /* DWORD 0 */
++ u8 ndma_online; /* DWORD 0 */
++ u8 ptc_online; /* DWORD 0 */
++ u8 rdma_online; /* DWORD 0 */
++ u8 rxf_online; /* DWORD 0 */
++ u8 rxips_online; /* DWORD 0 */
++ u8 rxulp0_online; /* DWORD 0 */
++ u8 rxulp1_online; /* DWORD 0 */
++ u8 rxulp2_online; /* DWORD 0 */
++ u8 tim_online; /* DWORD 0 */
++ u8 tpost_online; /* DWORD 0 */
++ u8 tpre_online; /* DWORD 0 */
++ u8 txips_online; /* DWORD 0 */
++ u8 txulp0_online; /* DWORD 0 */
++ u8 txulp1_online; /* DWORD 0 */
++ u8 uc_online; /* DWORD 0 */
++ u8 wdma_online; /* DWORD 0 */
++ u8 txulp2_online; /* DWORD 0 */
++ u8 host1_online; /* DWORD 0 */
++ u8 p0_ob_link_online; /* DWORD 0 */
++ u8 p1_ob_link_online; /* DWORD 0 */
++ u8 host_gpio_online; /* DWORD 0 */
++ u8 mbox_netw_online; /* DWORD 0 */
++ u8 mbox_stor_online; /* DWORD 0 */
++ u8 axgmac0_online; /* DWORD 0 */
++ u8 axgmac1_online; /* DWORD 0 */
++ u8 mpu_intpend_online; /* DWORD 0 */
++} __packed;
++struct PCICFG_ONLINE0_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* Online Control Register 1. This register controls various units within
++ * BladeEngine being in an Online or Offline state.
++ */
++struct BE_PCICFG_ONLINE1_CSR_AMAP {
++ u8 jtag_online; /* DWORD 0 */
++ u8 lpcmemhost_online; /* DWORD 0 */
++ u8 mgmt_mac_online; /* DWORD 0 */
++ u8 mpu_iram_online; /* DWORD 0 */
++ u8 pcs0online_online; /* DWORD 0 */
++ u8 pcs1online_online; /* DWORD 0 */
++ u8 pctl0_online; /* DWORD 0 */
++ u8 pctl1_online; /* DWORD 0 */
++ u8 pmem_online; /* DWORD 0 */
++ u8 rr_online; /* DWORD 0 */
++ u8 rxpp_online; /* DWORD 0 */
++ u8 txpb_online; /* DWORD 0 */
++ u8 txp_online; /* DWORD 0 */
++ u8 xaui_online; /* DWORD 0 */
++ u8 arm_online; /* DWORD 0 */
++ u8 ipc_online; /* DWORD 0 */
++ u8 rsvd0[16]; /* DWORD 0 */
++} __packed;
++struct PCICFG_ONLINE1_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* Host Timer Register. */
++struct BE_PCICFG_HOST_TIMER_INT_CTRL_CSR_AMAP {
++ u8 hosttimer[24]; /* DWORD 0 */
++ u8 hostintr; /* DWORD 0 */
++ u8 rsvd0[7]; /* DWORD 0 */
++} __packed;
++struct PCICFG_HOST_TIMER_INT_CTRL_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* Scratchpad Register (for software use). */
++struct BE_PCICFG_SCRATCHPAD_CSR_AMAP {
++ u8 scratchpad[32]; /* DWORD 0 */
++} __packed;
++struct PCICFG_SCRATCHPAD_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* PCI Express Capabilities Register. */
++struct BE_PCICFG_PCIE_CAP_CSR_AMAP {
++ u8 capid[8]; /* DWORD 0 */
++ u8 nextcap[8]; /* DWORD 0 */
++ u8 capver[4]; /* DWORD 0 */
++ u8 devport[4]; /* DWORD 0 */
++ u8 rsvd0[6]; /* DWORD 0 */
++ u8 rsvd1[2]; /* DWORD 0 */
++} __packed;
++struct PCICFG_PCIE_CAP_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* PCI Express Device Capabilities Register. */
++struct BE_PCICFG_PCIE_DEVCAP_CSR_AMAP {
++ u8 payload[3]; /* DWORD 0 */
++ u8 rsvd0[3]; /* DWORD 0 */
++ u8 lo_lat[3]; /* DWORD 0 */
++ u8 l1_lat[3]; /* DWORD 0 */
++ u8 rsvd1[3]; /* DWORD 0 */
++ u8 rsvd2[3]; /* DWORD 0 */
++ u8 pwr_value[8]; /* DWORD 0 */
++ u8 pwr_scale[2]; /* DWORD 0 */
++ u8 rsvd3[4]; /* DWORD 0 */
++} __packed;
++struct PCICFG_PCIE_DEVCAP_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* PCI Express Device Control/Status Registers. */
++struct BE_PCICFG_PCIE_CONTROL_STATUS_CSR_AMAP {
++ u8 CorrErrReportEn; /* DWORD 0 */
++ u8 NonFatalErrReportEn; /* DWORD 0 */
++ u8 FatalErrReportEn; /* DWORD 0 */
++ u8 UnsuppReqReportEn; /* DWORD 0 */
++ u8 EnableRelaxOrder; /* DWORD 0 */
++ u8 Max_Payload_Size[3]; /* DWORD 0 */
++ u8 ExtendTagFieldEnable; /* DWORD 0 */
++ u8 PhantomFnEnable; /* DWORD 0 */
++ u8 AuxPwrPMEnable; /* DWORD 0 */
++ u8 EnableNoSnoop; /* DWORD 0 */
++ u8 Max_Read_Req_Size[3]; /* DWORD 0 */
++ u8 rsvd0; /* DWORD 0 */
++ u8 CorrErrDetect; /* DWORD 0 */
++ u8 NonFatalErrDetect; /* DWORD 0 */
++ u8 FatalErrDetect; /* DWORD 0 */
++ u8 UnsuppReqDetect; /* DWORD 0 */
++ u8 AuxPwrDetect; /* DWORD 0 */
++ u8 TransPending; /* DWORD 0 */
++ u8 rsvd1[10]; /* DWORD 0 */
++} __packed;
++struct PCICFG_PCIE_CONTROL_STATUS_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* PCI Express Link Capabilities Register. */
++struct BE_PCICFG_PCIE_LINK_CAP_CSR_AMAP {
++ u8 MaxLinkSpeed[4]; /* DWORD 0 */
++ u8 MaxLinkWidth[6]; /* DWORD 0 */
++ u8 ASPMSupport[2]; /* DWORD 0 */
++ u8 L0sExitLat[3]; /* DWORD 0 */
++ u8 L1ExitLat[3]; /* DWORD 0 */
++ u8 rsvd0[6]; /* DWORD 0 */
++ u8 PortNum[8]; /* DWORD 0 */
++} __packed;
++struct PCICFG_PCIE_LINK_CAP_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* PCI Express Link Status Register. */
++struct BE_PCICFG_PCIE_LINK_STATUS_CSR_AMAP {
++ u8 ASPMCtl[2]; /* DWORD 0 */
++ u8 rsvd0; /* DWORD 0 */
++ u8 ReadCmplBndry; /* DWORD 0 */
++ u8 LinkDisable; /* DWORD 0 */
++ u8 RetrainLink; /* DWORD 0 */
++ u8 CommonClkConfig; /* DWORD 0 */
++ u8 ExtendSync; /* DWORD 0 */
++ u8 rsvd1[8]; /* DWORD 0 */
++ u8 LinkSpeed[4]; /* DWORD 0 */
++ u8 NegLinkWidth[6]; /* DWORD 0 */
++ u8 LinkTrainErr; /* DWORD 0 */
++ u8 LinkTrain; /* DWORD 0 */
++ u8 SlotClkConfig; /* DWORD 0 */
++ u8 rsvd2[3]; /* DWORD 0 */
++} __packed;
++struct PCICFG_PCIE_LINK_STATUS_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* PCI Express MSI Configuration Register. */
++struct BE_PCICFG_MSI_CSR_AMAP {
++ u8 capid[8]; /* DWORD 0 */
++ u8 nextptr[8]; /* DWORD 0 */
++ u8 tablesize[11]; /* DWORD 0 */
++ u8 rsvd0[3]; /* DWORD 0 */
++ u8 funcmask; /* DWORD 0 */
++ u8 en; /* DWORD 0 */
++} __packed;
++struct PCICFG_MSI_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* MSI-X Table Offset Register. */
++struct BE_PCICFG_MSIX_TABLE_CSR_AMAP {
++ u8 tablebir[3]; /* DWORD 0 */
++ u8 offset[29]; /* DWORD 0 */
++} __packed;
++struct PCICFG_MSIX_TABLE_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* MSI-X PBA Offset Register. */
++struct BE_PCICFG_MSIX_PBA_CSR_AMAP {
++ u8 pbabir[3]; /* DWORD 0 */
++ u8 offset[29]; /* DWORD 0 */
++} __packed;
++struct PCICFG_MSIX_PBA_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* PCI Express MSI-X Message Vector Control Register. */
++struct BE_PCICFG_MSIX_VECTOR_CONTROL_CSR_AMAP {
++ u8 vector_control; /* DWORD 0 */
++ u8 rsvd0[31]; /* DWORD 0 */
++} __packed;
++struct PCICFG_MSIX_VECTOR_CONTROL_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* PCI Express MSI-X Message Data Register. */
++struct BE_PCICFG_MSIX_MSG_DATA_CSR_AMAP {
++ u8 data[16]; /* DWORD 0 */
++ u8 rsvd0[16]; /* DWORD 0 */
++} __packed;
++struct PCICFG_MSIX_MSG_DATA_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* PCI Express MSI-X Message Address Register - High Part. */
++struct BE_PCICFG_MSIX_MSG_ADDR_HI_CSR_AMAP {
++ u8 addr[32]; /* DWORD 0 */
++} __packed;
++struct PCICFG_MSIX_MSG_ADDR_HI_CSR_AMAP {
++ u32 dw[1];
++};
++
++/* PCI Express MSI-X Message Address Register - Low Part. */
++struct BE_PCICFG_MSIX_MSG_ADDR_LO_CSR_AMAP {
++ u8 rsvd0[2]; /* DWORD 0 */
++ u8 addr[30]; /* DWORD 0 */
++} __packed;
++struct PCICFG_MSIX_MSG_ADDR_LO_CSR_AMAP {
++ u32 dw[1];
++};
++
++struct BE_PCICFG_ANON_18_RSVD_AMAP {
++ u8 rsvd0[32]; /* DWORD 0 */
++} __packed;
++struct PCICFG_ANON_18_RSVD_AMAP {
++ u32 dw[1];
++};
++
++struct BE_PCICFG_ANON_19_RSVD_AMAP {
++ u8 rsvd0[32]; /* DWORD 0 */
++} __packed;
++struct PCICFG_ANON_19_RSVD_AMAP {
++ u32 dw[1];
++};
++
++struct BE_PCICFG_ANON_20_RSVD_AMAP {
++ u8 rsvd0[32]; /* DWORD 0 */
++ u8 rsvd1[25][32]; /* DWORD 1 */
++} __packed;
++struct PCICFG_ANON_20_RSVD_AMAP {
++ u32 dw[26];
++};
++
++struct BE_PCICFG_ANON_21_RSVD_AMAP {
++ u8 rsvd0[32]; /* DWORD 0 */
++ u8 rsvd1[1919][32]; /* DWORD 1 */
++} __packed;
++struct PCICFG_ANON_21_RSVD_AMAP {
++ u32 dw[1920];
++};
++
++struct BE_PCICFG_ANON_22_MESSAGE_AMAP {
++ struct BE_PCICFG_MSIX_VECTOR_CONTROL_CSR_AMAP vec_ctrl;
++ struct BE_PCICFG_MSIX_MSG_DATA_CSR_AMAP msg_data;
++ struct BE_PCICFG_MSIX_MSG_ADDR_HI_CSR_AMAP addr_hi;
++ struct BE_PCICFG_MSIX_MSG_ADDR_LO_CSR_AMAP addr_low;
++} __packed;
++struct PCICFG_ANON_22_MESSAGE_AMAP {
++ u32 dw[4];
++};
++
++struct BE_PCICFG_ANON_23_RSVD_AMAP {
++ u8 rsvd0[32]; /* DWORD 0 */
++ u8 rsvd1[895][32]; /* DWORD 1 */
++} __packed;
++struct PCICFG_ANON_23_RSVD_AMAP {
++ u32 dw[896];
++};
++
++/* These PCI Configuration Space registers are for the Storage Function of
++ * BladeEngine (Function 0). In the memory map of the registers below their
++ * table,
++ */
++struct BE_PCICFG0_CSRMAP_AMAP {
++ struct BE_PCICFG_ID_CSR_AMAP id;
++ u8 rsvd0[32]; /* DWORD 1 */
++ u8 rsvd1[32]; /* DWORD 2 */
++ u8 rsvd2[32]; /* DWORD 3 */
++ struct BE_PCICFG_IOBAR_CSR_AMAP iobar;
++ struct BE_PCICFG_MEMBAR0_CSR_AMAP membar0;
++ struct BE_PCICFG_MEMBAR1_LO_CSR_AMAP membar1_lo;
++ struct BE_PCICFG_MEMBAR1_HI_CSR_AMAP membar1_hi;
++ struct BE_PCICFG_MEMBAR2_LO_CSR_AMAP membar2_lo;
++ struct BE_PCICFG_MEMBAR2_HI_CSR_AMAP membar2_hi;
++ u8 rsvd3[32]; /* DWORD 10 */
++ struct BE_PCICFG_SUBSYSTEM_ID_F0_CSR_AMAP subsystem_id;
++ u8 rsvd4[32]; /* DWORD 12 */
++ u8 rsvd5[32]; /* DWORD 13 */
++ u8 rsvd6[32]; /* DWORD 14 */
++ u8 rsvd7[32]; /* DWORD 15 */
++ struct BE_PCICFG_SEMAPHORE_CSR_AMAP semaphore[4];
++ struct BE_PCICFG_SOFT_RESET_CSR_AMAP soft_reset;
++ u8 rsvd8[32]; /* DWORD 21 */
++ struct BE_PCICFG_SCRATCHPAD_CSR_AMAP scratchpad;
++ u8 rsvd9[32]; /* DWORD 23 */
++ u8 rsvd10[32]; /* DWORD 24 */
++ u8 rsvd11[32]; /* DWORD 25 */
++ u8 rsvd12[32]; /* DWORD 26 */
++ u8 rsvd13[32]; /* DWORD 27 */
++ u8 rsvd14[2][32]; /* DWORD 28 */
++ u8 rsvd15[32]; /* DWORD 30 */
++ u8 rsvd16[32]; /* DWORD 31 */
++ u8 rsvd17[8][32]; /* DWORD 32 */
++ struct BE_PCICFG_UE_STATUS_LOW_CSR_AMAP ue_status_low;
++ struct BE_PCICFG_UE_STATUS_HI_CSR_AMAP ue_status_hi;
++ struct BE_PCICFG_UE_STATUS_LOW_MASK_CSR_AMAP ue_status_low_mask;
++ struct BE_PCICFG_UE_STATUS_HI_MASK_CSR_AMAP ue_status_hi_mask;
++ struct BE_PCICFG_ONLINE0_CSR_AMAP online0;
++ struct BE_PCICFG_ONLINE1_CSR_AMAP online1;
++ u8 rsvd18[32]; /* DWORD 46 */
++ u8 rsvd19[32]; /* DWORD 47 */
++ u8 rsvd20[32]; /* DWORD 48 */
++ u8 rsvd21[32]; /* DWORD 49 */
++ struct BE_PCICFG_HOST_TIMER_INT_CTRL_CSR_AMAP host_timer_int_ctrl;
++ u8 rsvd22[32]; /* DWORD 51 */
++ struct BE_PCICFG_PCIE_CAP_CSR_AMAP pcie_cap;
++ struct BE_PCICFG_PCIE_DEVCAP_CSR_AMAP pcie_devcap;
++ struct BE_PCICFG_PCIE_CONTROL_STATUS_CSR_AMAP pcie_control_status;
++ struct BE_PCICFG_PCIE_LINK_CAP_CSR_AMAP pcie_link_cap;
++ struct BE_PCICFG_PCIE_LINK_STATUS_CSR_AMAP pcie_link_status;
++ struct BE_PCICFG_MSI_CSR_AMAP msi;
++ struct BE_PCICFG_MSIX_TABLE_CSR_AMAP msix_table_offset;
++ struct BE_PCICFG_MSIX_PBA_CSR_AMAP msix_pba_offset;
++ u8 rsvd23[32]; /* DWORD 60 */
++ u8 rsvd24[32]; /* DWORD 61 */
++ u8 rsvd25[32]; /* DWORD 62 */
++ u8 rsvd26[32]; /* DWORD 63 */
++ u8 rsvd27[32]; /* DWORD 64 */
++ u8 rsvd28[32]; /* DWORD 65 */
++ u8 rsvd29[32]; /* DWORD 66 */
++ u8 rsvd30[32]; /* DWORD 67 */
++ u8 rsvd31[32]; /* DWORD 68 */
++ u8 rsvd32[32]; /* DWORD 69 */
++ u8 rsvd33[32]; /* DWORD 70 */
++ u8 rsvd34[32]; /* DWORD 71 */
++ u8 rsvd35[32]; /* DWORD 72 */
++ u8 rsvd36[32]; /* DWORD 73 */
++ u8 rsvd37[32]; /* DWORD 74 */
++ u8 rsvd38[32]; /* DWORD 75 */
++ u8 rsvd39[32]; /* DWORD 76 */
++ u8 rsvd40[32]; /* DWORD 77 */
++ u8 rsvd41[32]; /* DWORD 78 */
++ u8 rsvd42[32]; /* DWORD 79 */
++ u8 rsvd43[32]; /* DWORD 80 */
++ u8 rsvd44[32]; /* DWORD 81 */
++ u8 rsvd45[32]; /* DWORD 82 */
++ u8 rsvd46[32]; /* DWORD 83 */
++ u8 rsvd47[32]; /* DWORD 84 */
++ u8 rsvd48[32]; /* DWORD 85 */
++ u8 rsvd49[32]; /* DWORD 86 */
++ u8 rsvd50[32]; /* DWORD 87 */
++ u8 rsvd51[32]; /* DWORD 88 */
++ u8 rsvd52[32]; /* DWORD 89 */
++ u8 rsvd53[32]; /* DWORD 90 */
++ u8 rsvd54[32]; /* DWORD 91 */
++ u8 rsvd55[32]; /* DWORD 92 */
++ u8 rsvd56[832]; /* DWORD 93 */
++ u8 rsvd57[32]; /* DWORD 119 */
++ u8 rsvd58[32]; /* DWORD 120 */
++ u8 rsvd59[32]; /* DWORD 121 */
++ u8 rsvd60[32]; /* DWORD 122 */
++ u8 rsvd61[32]; /* DWORD 123 */
++ u8 rsvd62[32]; /* DWORD 124 */
++ u8 rsvd63[32]; /* DWORD 125 */
++ u8 rsvd64[32]; /* DWORD 126 */
++ u8 rsvd65[32]; /* DWORD 127 */
++ u8 rsvd66[61440]; /* DWORD 128 */
++ struct BE_PCICFG_ANON_22_MESSAGE_AMAP message[32];
++ u8 rsvd67[28672]; /* DWORD 2176 */
++ u8 rsvd68[32]; /* DWORD 3072 */
++ u8 rsvd69[1023][32]; /* DWORD 3073 */
++} __packed;
++struct PCICFG0_CSRMAP_AMAP {
++ u32 dw[4096];
++};
++
++struct BE_PCICFG_ANON_24_RSVD_AMAP {
++ u8 rsvd0[32]; /* DWORD 0 */
++} __packed;
++struct PCICFG_ANON_24_RSVD_AMAP {
++ u32 dw[1];
++};
++
++struct BE_PCICFG_ANON_25_RSVD_AMAP {
++ u8 rsvd0[32]; /* DWORD 0 */
++} __packed;
++struct PCICFG_ANON_25_RSVD_AMAP {
++ u32 dw[1];
++};
++
++struct BE_PCICFG_ANON_26_RSVD_AMAP {
++ u8 rsvd0[32]; /* DWORD 0 */
++} __packed;
++struct PCICFG_ANON_26_RSVD_AMAP {
++ u32 dw[1];
++};
++
++struct BE_PCICFG_ANON_27_RSVD_AMAP {
++ u8 rsvd0[32]; /* DWORD 0 */
++ u8 rsvd1[32]; /* DWORD 1 */
++} __packed;
++struct PCICFG_ANON_27_RSVD_AMAP {
++ u32 dw[2];
++};
++
++struct BE_PCICFG_ANON_28_RSVD_AMAP {
++ u8 rsvd0[32]; /* DWORD 0 */
++ u8 rsvd1[3][32]; /* DWORD 1 */
++} __packed;
++struct PCICFG_ANON_28_RSVD_AMAP {
++ u32 dw[4];
++};
++
++struct BE_PCICFG_ANON_29_RSVD_AMAP {
++ u8 rsvd0[32]; /* DWORD 0 */
++ u8 rsvd1[36][32]; /* DWORD 1 */
++} __packed;
++struct PCICFG_ANON_29_RSVD_AMAP {
++ u32 dw[37];
++};
++
++struct BE_PCICFG_ANON_30_RSVD_AMAP {
++ u8 rsvd0[32]; /* DWORD 0 */
++ u8 rsvd1[1930][32]; /* DWORD 1 */
++} __packed;
++struct PCICFG_ANON_30_RSVD_AMAP {
++ u32 dw[1931];
++};
++
++struct BE_PCICFG_ANON_31_MESSAGE_AMAP {
++ struct BE_PCICFG_MSIX_VECTOR_CONTROL_CSR_AMAP vec_ctrl;
++ struct BE_PCICFG_MSIX_MSG_DATA_CSR_AMAP msg_data;
++ struct BE_PCICFG_MSIX_MSG_ADDR_HI_CSR_AMAP addr_hi;
++ struct BE_PCICFG_MSIX_MSG_ADDR_LO_CSR_AMAP addr_low;
++} __packed;
++struct PCICFG_ANON_31_MESSAGE_AMAP {
++ u32 dw[4];
++};
++
++struct BE_PCICFG_ANON_32_RSVD_AMAP {
++ u8 rsvd0[32]; /* DWORD 0 */
++ u8 rsvd1[895][32]; /* DWORD 1 */
++} __packed;
++struct PCICFG_ANON_32_RSVD_AMAP {
++ u32 dw[896];
++};
++
++/* This PCI configuration space register map is for the Networking Function of
++ * BladeEngine (Function 1).
++ */
++struct BE_PCICFG1_CSRMAP_AMAP {
++ struct BE_PCICFG_ID_CSR_AMAP id;
++ u8 rsvd0[32]; /* DWORD 1 */
++ u8 rsvd1[32]; /* DWORD 2 */
++ u8 rsvd2[32]; /* DWORD 3 */
++ struct BE_PCICFG_IOBAR_CSR_AMAP iobar;
++ struct BE_PCICFG_MEMBAR0_CSR_AMAP membar0;
++ struct BE_PCICFG_MEMBAR1_LO_CSR_AMAP membar1_lo;
++ struct BE_PCICFG_MEMBAR1_HI_CSR_AMAP membar1_hi;
++ struct BE_PCICFG_MEMBAR2_LO_CSR_AMAP membar2_lo;
++ struct BE_PCICFG_MEMBAR2_HI_CSR_AMAP membar2_hi;
++ u8 rsvd3[32]; /* DWORD 10 */
++ struct BE_PCICFG_SUBSYSTEM_ID_F1_CSR_AMAP subsystem_id;
++ u8 rsvd4[32]; /* DWORD 12 */
++ u8 rsvd5[32]; /* DWORD 13 */
++ u8 rsvd6[32]; /* DWORD 14 */
++ u8 rsvd7[32]; /* DWORD 15 */
++ struct BE_PCICFG_SEMAPHORE_CSR_AMAP semaphore[4];
++ struct BE_PCICFG_SOFT_RESET_CSR_AMAP soft_reset;
++ u8 rsvd8[32]; /* DWORD 21 */
++ struct BE_PCICFG_SCRATCHPAD_CSR_AMAP scratchpad;
++ u8 rsvd9[32]; /* DWORD 23 */
++ u8 rsvd10[32]; /* DWORD 24 */
++ u8 rsvd11[32]; /* DWORD 25 */
++ u8 rsvd12[32]; /* DWORD 26 */
++ u8 rsvd13[32]; /* DWORD 27 */
++ u8 rsvd14[2][32]; /* DWORD 28 */
++ u8 rsvd15[32]; /* DWORD 30 */
++ u8 rsvd16[32]; /* DWORD 31 */
++ u8 rsvd17[8][32]; /* DWORD 32 */
++ struct BE_PCICFG_UE_STATUS_LOW_CSR_AMAP ue_status_low;
++ struct BE_PCICFG_UE_STATUS_HI_CSR_AMAP ue_status_hi;
++ struct BE_PCICFG_UE_STATUS_LOW_MASK_CSR_AMAP ue_status_low_mask;
++ struct BE_PCICFG_UE_STATUS_HI_MASK_CSR_AMAP ue_status_hi_mask;
++ struct BE_PCICFG_ONLINE0_CSR_AMAP online0;
++ struct BE_PCICFG_ONLINE1_CSR_AMAP online1;
++ u8 rsvd18[32]; /* DWORD 46 */
++ u8 rsvd19[32]; /* DWORD 47 */
++ u8 rsvd20[32]; /* DWORD 48 */
++ u8 rsvd21[32]; /* DWORD 49 */
++ struct BE_PCICFG_HOST_TIMER_INT_CTRL_CSR_AMAP host_timer_int_ctrl;
++ u8 rsvd22[32]; /* DWORD 51 */
++ struct BE_PCICFG_PCIE_CAP_CSR_AMAP pcie_cap;
++ struct BE_PCICFG_PCIE_DEVCAP_CSR_AMAP pcie_devcap;
++ struct BE_PCICFG_PCIE_CONTROL_STATUS_CSR_AMAP pcie_control_status;
++ struct BE_PCICFG_PCIE_LINK_CAP_CSR_AMAP pcie_link_cap;
++ struct BE_PCICFG_PCIE_LINK_STATUS_CSR_AMAP pcie_link_status;
++ struct BE_PCICFG_MSI_CSR_AMAP msi;
++ struct BE_PCICFG_MSIX_TABLE_CSR_AMAP msix_table_offset;
++ struct BE_PCICFG_MSIX_PBA_CSR_AMAP msix_pba_offset;
++ u8 rsvd23[64]; /* DWORD 60 */
++ u8 rsvd24[32]; /* DWORD 62 */
++ u8 rsvd25[32]; /* DWORD 63 */
++ u8 rsvd26[32]; /* DWORD 64 */
++ u8 rsvd27[32]; /* DWORD 65 */
++ u8 rsvd28[32]; /* DWORD 66 */
++ u8 rsvd29[32]; /* DWORD 67 */
++ u8 rsvd30[32]; /* DWORD 68 */
++ u8 rsvd31[32]; /* DWORD 69 */
++ u8 rsvd32[32]; /* DWORD 70 */
++ u8 rsvd33[32]; /* DWORD 71 */
++ u8 rsvd34[32]; /* DWORD 72 */
++ u8 rsvd35[32]; /* DWORD 73 */
++ u8 rsvd36[32]; /* DWORD 74 */
++ u8 rsvd37[128]; /* DWORD 75 */
++ u8 rsvd38[32]; /* DWORD 79 */
++ u8 rsvd39[1184]; /* DWORD 80 */
++ u8 rsvd40[61792]; /* DWORD 117 */
++ struct BE_PCICFG_ANON_31_MESSAGE_AMAP message[32];
++ u8 rsvd41[28672]; /* DWORD 2176 */
++ u8 rsvd42[32]; /* DWORD 3072 */
++ u8 rsvd43[1023][32]; /* DWORD 3073 */
++} __packed;
++struct PCICFG1_CSRMAP_AMAP {
++ u32 dw[4096];
++};
++
++#endif /* __pcicfg_amap_h__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/post_codes.h linux-2.6.29-rc3.owrt/drivers/staging/benet/post_codes.h
+--- linux-2.6.29.owrt/drivers/staging/benet/post_codes.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/post_codes.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,111 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * Autogenerated by srcgen version: 0127
++ */
++#ifndef __post_codes_amap_h__
++#define __post_codes_amap_h__
++
++/* --- MGMT_HBA_POST_STAGE_ENUM --- */
++#define POST_STAGE_POWER_ON_RESET (0) /* State after a cold or warm boot. */
++#define POST_STAGE_AWAITING_HOST_RDY (1) /* ARM boot code awaiting a
++ go-ahed from the host. */
++#define POST_STAGE_HOST_RDY (2) /* Host has given go-ahed to ARM. */
++#define POST_STAGE_BE_RESET (3) /* Host wants to reset chip, this is a chip
++ workaround */
++#define POST_STAGE_SEEPROM_CS_START (256) /* SEEPROM checksum
++ test start. */
++#define POST_STAGE_SEEPROM_CS_DONE (257) /* SEEPROM checksum test
++ done. */
++#define POST_STAGE_DDR_CONFIG_START (512) /* DDR configuration start. */
++#define POST_STAGE_DDR_CONFIG_DONE (513) /* DDR configuration done. */
++#define POST_STAGE_DDR_CALIBRATE_START (768) /* DDR calibration start. */
++#define POST_STAGE_DDR_CALIBRATE_DONE (769) /* DDR calibration done. */
++#define POST_STAGE_DDR_TEST_START (1024) /* DDR memory test start. */
++#define POST_STAGE_DDR_TEST_DONE (1025) /* DDR memory test done. */
++#define POST_STAGE_REDBOOT_INIT_START (1536) /* Redboot starts execution. */
++#define POST_STAGE_REDBOOT_INIT_DONE (1537) /* Redboot done execution. */
++#define POST_STAGE_FW_IMAGE_LOAD_START (1792) /* Firmware image load to
++ DDR start. */
++#define POST_STAGE_FW_IMAGE_LOAD_DONE (1793) /* Firmware image load
++ to DDR done. */
++#define POST_STAGE_ARMFW_START (2048) /* ARMfw runtime code
++ starts execution. */
++#define POST_STAGE_DHCP_QUERY_START (2304) /* DHCP server query start. */
++#define POST_STAGE_DHCP_QUERY_DONE (2305) /* DHCP server query done. */
++#define POST_STAGE_BOOT_TARGET_DISCOVERY_START (2560) /* Boot Target
++ Discovery Start. */
++#define POST_STAGE_BOOT_TARGET_DISCOVERY_DONE (2561) /* Boot Target
++ Discovery Done. */
++#define POST_STAGE_RC_OPTION_SET (2816) /* Remote configuration
++ option is set in SEEPROM */
++#define POST_STAGE_SWITCH_LINK (2817) /* Wait for link up on switch */
++#define POST_STAGE_SEND_ICDS_MESSAGE (2818) /* Send the ICDS message
++ to switch */
++#define POST_STAGE_PERFROM_TFTP (2819) /* Download xml using TFTP */
++#define POST_STAGE_PARSE_XML (2820) /* Parse XML file */
++#define POST_STAGE_DOWNLOAD_IMAGE (2821) /* Download IMAGE from
++ TFTP server */
++#define POST_STAGE_FLASH_IMAGE (2822) /* Flash the IMAGE */
++#define POST_STAGE_RC_DONE (2823) /* Remote configuration
++ complete */
++#define POST_STAGE_REBOOT_SYSTEM (2824) /* Upgrade IMAGE done,
++ reboot required */
++#define POST_STAGE_MAC_ADDRESS (3072) /* MAC Address Check */
++#define POST_STAGE_ARMFW_READY (49152) /* ARMfw is done with POST
++ and ready. */
++#define POST_STAGE_ARMFW_UE (61440) /* ARMfw has asserted an
++ unrecoverable error. The
++ lower 3 hex digits of the
++ stage code identify the
++ unique error code.
++ */
++
++/* This structure defines the format of the MPU semaphore
++ * register when used for POST.
++ */
++struct BE_MGMT_HBA_POST_STATUS_STRUCT_AMAP {
++ u8 stage[16]; /* DWORD 0 */
++ u8 rsvd0[10]; /* DWORD 0 */
++ u8 iscsi_driver_loaded; /* DWORD 0 */
++ u8 option_rom_installed; /* DWORD 0 */
++ u8 iscsi_ip_conflict; /* DWORD 0 */
++ u8 iscsi_no_ip; /* DWORD 0 */
++ u8 backup_fw; /* DWORD 0 */
++ u8 error; /* DWORD 0 */
++} __packed;
++struct MGMT_HBA_POST_STATUS_STRUCT_AMAP {
++ u32 dw[1];
++};
++
++/* --- MGMT_HBA_POST_DUMMY_BITS_ENUM --- */
++#define POST_BIT_ISCSI_LOADED (26)
++#define POST_BIT_OPTROM_INST (27)
++#define POST_BIT_BAD_IP_ADDR (28)
++#define POST_BIT_NO_IP_ADDR (29)
++#define POST_BIT_BACKUP_FW (30)
++#define POST_BIT_ERROR (31)
++
++/* --- MGMT_HBA_POST_DUMMY_VALUES_ENUM --- */
++#define POST_ISCSI_DRIVER_LOADED (67108864)
++#define POST_OPTROM_INSTALLED (134217728)
++#define POST_ISCSI_IP_ADDRESS_CONFLICT (268435456)
++#define POST_ISCSI_NO_IP_ADDRESS (536870912)
++#define POST_BACKUP_FW_LOADED (1073741824)
++#define POST_FATAL_ERROR (2147483648)
++
++#endif /* __post_codes_amap_h__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/regmap.h linux-2.6.29-rc3.owrt/drivers/staging/benet/regmap.h
+--- linux-2.6.29.owrt/drivers/staging/benet/regmap.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/regmap.h 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,68 @@
++/*
++ * Copyright (C) 2005 - 2008 ServerEngines
++ * All rights reserved.
++ *
++ * 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 full GNU General
++ * Public License is included in this distribution in the file called COPYING.
++ *
++ * Contact Information:
++ * linux-drivers@serverengines.com
++ *
++ * ServerEngines
++ * 209 N. Fair Oaks Ave
++ * Sunnyvale, CA 94085
++ */
++/*
++ * Autogenerated by srcgen version: 0127
++ */
++#ifndef __regmap_amap_h__
++#define __regmap_amap_h__
++#include "pcicfg.h"
++#include "ep.h"
++#include "cev.h"
++#include "mpu.h"
++#include "doorbells.h"
++
++/*
++ * This is the control and status register map for BladeEngine, showing
++ * the relative size and offset of each sub-module. The CSR registers
++ * are identical for the network and storage PCI functions. The
++ * CSR map is shown below, followed by details of each block,
++ * in sub-sections. The sub-sections begin with a description
++ * of CSRs that are instantiated in multiple blocks.
++ */
++struct BE_BLADE_ENGINE_CSRMAP_AMAP {
++ struct BE_MPU_CSRMAP_AMAP mpu;
++ u8 rsvd0[8192]; /* DWORD 256 */
++ u8 rsvd1[8192]; /* DWORD 512 */
++ struct BE_CEV_CSRMAP_AMAP cev;
++ u8 rsvd2[8192]; /* DWORD 1024 */
++ u8 rsvd3[8192]; /* DWORD 1280 */
++ u8 rsvd4[8192]; /* DWORD 1536 */
++ u8 rsvd5[8192]; /* DWORD 1792 */
++ u8 rsvd6[8192]; /* DWORD 2048 */
++ u8 rsvd7[8192]; /* DWORD 2304 */
++ u8 rsvd8[8192]; /* DWORD 2560 */
++ u8 rsvd9[8192]; /* DWORD 2816 */
++ u8 rsvd10[8192]; /* DWORD 3072 */
++ u8 rsvd11[8192]; /* DWORD 3328 */
++ u8 rsvd12[8192]; /* DWORD 3584 */
++ u8 rsvd13[8192]; /* DWORD 3840 */
++ u8 rsvd14[8192]; /* DWORD 4096 */
++ u8 rsvd15[8192]; /* DWORD 4352 */
++ u8 rsvd16[8192]; /* DWORD 4608 */
++ u8 rsvd17[8192]; /* DWORD 4864 */
++ u8 rsvd18[8192]; /* DWORD 5120 */
++ u8 rsvd19[8192]; /* DWORD 5376 */
++ u8 rsvd20[8192]; /* DWORD 5632 */
++ u8 rsvd21[8192]; /* DWORD 5888 */
++ u8 rsvd22[8192]; /* DWORD 6144 */
++ u8 rsvd23[17152][32]; /* DWORD 6400 */
++} __packed;
++struct BLADE_ENGINE_CSRMAP_AMAP {
++ u32 dw[23552];
++};
++
++#endif /* __regmap_amap_h__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/benet/TODO linux-2.6.29-rc3.owrt/drivers/staging/benet/TODO
+--- linux-2.6.29.owrt/drivers/staging/benet/TODO 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/staging/benet/TODO 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,6 @@
++TODO:
++ - remove wrappers around common iowrite functions
++ - full netdev audit of common problems/issues
++
++Please send all patches and questions to Subbu Seetharaman
++<subbus@serverengines.com> and Greg Kroah-Hartman <greg@kroah.com>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/comedi/Kconfig linux-2.6.29-rc3.owrt/drivers/staging/comedi/Kconfig
+--- linux-2.6.29.owrt/drivers/staging/comedi/Kconfig 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/staging/comedi/Kconfig 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,6 @@
+ config COMEDI
+ tristate "Data Acquision support (comedi)"
+ default N
+- depends on m
+ ---help---
+ Enable support a wide range of data acquision devices
+ for Linux.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/Kconfig linux-2.6.29-rc3.owrt/drivers/staging/Kconfig
+--- linux-2.6.29.owrt/drivers/staging/Kconfig 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/staging/Kconfig 2009-05-10 23:48:29.000000000 +0200
+@@ -73,6 +73,8 @@
+
+ source "drivers/staging/rt2870/Kconfig"
+
++source "drivers/staging/benet/Kconfig"
++
+ source "drivers/staging/comedi/Kconfig"
+
+ source "drivers/staging/asus_oled/Kconfig"
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/Makefile linux-2.6.29-rc3.owrt/drivers/staging/Makefile
+--- linux-2.6.29.owrt/drivers/staging/Makefile 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/staging/Makefile 2009-05-10 23:48:29.000000000 +0200
+@@ -19,6 +19,7 @@
+ obj-$(CONFIG_OTUS) += otus/
+ obj-$(CONFIG_RT2860) += rt2860/
+ obj-$(CONFIG_RT2870) += rt2870/
++obj-$(CONFIG_BENET) += benet/
+ obj-$(CONFIG_COMEDI) += comedi/
+ obj-$(CONFIG_ASUS_OLED) += asus_oled/
+ obj-$(CONFIG_PANEL) += panel/
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/meilhaus/Kconfig linux-2.6.29-rc3.owrt/drivers/staging/meilhaus/Kconfig
+--- linux-2.6.29.owrt/drivers/staging/meilhaus/Kconfig 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/staging/meilhaus/Kconfig 2009-05-10 23:48:29.000000000 +0200
+@@ -4,7 +4,6 @@
+
+ menuconfig MEILHAUS
+ tristate "Meilhaus support"
+- depends on m
+ ---help---
+ If you have a Meilhaus card, say Y (or M) here.
+
+@@ -19,7 +18,7 @@
+ config ME0600
+ tristate "Meilhaus ME-600 support"
+ default n
+- depends on PCI && m
++ depends on PCI
+ help
+ This driver supports the Meilhaus ME-600 family of boards
+ that do data collection and multipurpose I/O.
+@@ -30,7 +29,7 @@
+ config ME0900
+ tristate "Meilhaus ME-900 support"
+ default n
+- depends on PCI && m
++ depends on PCI
+ help
+ This driver supports the Meilhaus ME-900 family of boards
+ that do data collection and multipurpose I/O.
+@@ -41,7 +40,7 @@
+ config ME1000
+ tristate "Meilhaus ME-1000 support"
+ default n
+- depends on PCI && m
++ depends on PCI
+ help
+ This driver supports the Meilhaus ME-1000 family of boards
+ that do data collection and multipurpose I/O.
+@@ -52,7 +51,7 @@
+ config ME1400
+ tristate "Meilhaus ME-1400 support"
+ default n
+- depends on PCI && m
++ depends on PCI
+ help
+ This driver supports the Meilhaus ME-1400 family of boards
+ that do data collection and multipurpose I/O.
+@@ -63,7 +62,7 @@
+ config ME1600
+ tristate "Meilhaus ME-1600 support"
+ default n
+- depends on PCI && m
++ depends on PCI
+ help
+ This driver supports the Meilhaus ME-1600 family of boards
+ that do data collection and multipurpose I/O.
+@@ -74,7 +73,7 @@
+ config ME4600
+ tristate "Meilhaus ME-4600 support"
+ default n
+- depends on PCI && m
++ depends on PCI
+ help
+ This driver supports the Meilhaus ME-4600 family of boards
+ that do data collection and multipurpose I/O.
+@@ -85,7 +84,7 @@
+ config ME6000
+ tristate "Meilhaus ME-6000 support"
+ default n
+- depends on PCI && m
++ depends on PCI
+ help
+ This driver supports the Meilhaus ME-6000 family of boards
+ that do data collection and multipurpose I/O.
+@@ -96,7 +95,7 @@
+ config ME8100
+ tristate "Meilhaus ME-8100 support"
+ default n
+- depends on PCI && m
++ depends on PCI
+ help
+ This driver supports the Meilhaus ME-8100 family of boards
+ that do data collection and multipurpose I/O.
+@@ -107,7 +106,7 @@
+ config ME8200
+ tristate "Meilhaus ME-8200 support"
+ default n
+- depends on PCI && m
++ depends on PCI
+ help
+ This driver supports the Meilhaus ME-8200 family of boards
+ that do data collection and multipurpose I/O.
+@@ -118,7 +117,7 @@
+ config MEDUMMY
+ tristate "Meilhaus dummy driver"
+ default n
+- depends on PCI && m
++ depends on PCI
+ help
+ This provides a dummy driver for the Meilhaus driver package
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/panel/panel.c linux-2.6.29-rc3.owrt/drivers/staging/panel/panel.c
+--- linux-2.6.29.owrt/drivers/staging/panel/panel.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/staging/panel/panel.c 2009-05-10 23:48:29.000000000 +0200
+@@ -622,7 +622,7 @@
+ }
+
+ /* sets ctrl & data port bits according to current signals values */
+-static void panel_set_bits(void)
++static void set_bits(void)
+ {
+ set_data_bits();
+ set_ctrl_bits();
+@@ -707,12 +707,12 @@
+ */
+ for (bit = 0; bit < 8; bit++) {
+ bits.cl = BIT_CLR; /* CLK low */
+- panel_set_bits();
++ set_bits();
+ bits.da = byte & 1;
+- panel_set_bits();
++ set_bits();
+ udelay(2); /* maintain the data during 2 us before CLK up */
+ bits.cl = BIT_SET; /* CLK high */
+- panel_set_bits();
++ set_bits();
+ udelay(1); /* maintain the strobe during 1 us */
+ byte >>= 1;
+ }
+@@ -727,7 +727,7 @@
+ /* The backlight is activated by seting the AUTOFEED line to +5V */
+ spin_lock(&pprt_lock);
+ bits.bl = on;
+- panel_set_bits();
++ set_bits();
+ spin_unlock(&pprt_lock);
+ }
+
+@@ -2164,20 +2164,19 @@
+ if (scan_timer.function != NULL)
+ del_timer(&scan_timer);
+
+- if (pprt != NULL) {
+- if (keypad_enabled)
+- misc_deregister(&keypad_dev);
+-
+- if (lcd_enabled) {
+- panel_lcd_print("\x0cLCD driver " PANEL_VERSION
+- "\nunloaded.\x1b[Lc\x1b[Lb\x1b[L-");
+- misc_deregister(&lcd_dev);
+- }
++ if (keypad_enabled)
++ misc_deregister(&keypad_dev);
+
+- /* TODO: free all input signals */
+- parport_release(pprt);
+- parport_unregister_device(pprt);
++ if (lcd_enabled) {
++ panel_lcd_print("\x0cLCD driver " PANEL_VERSION
++ "\nunloaded.\x1b[Lc\x1b[Lb\x1b[L-");
++ misc_deregister(&lcd_dev);
+ }
++
++ /* TODO: free all input signals */
++
++ parport_release(pprt);
++ parport_unregister_device(pprt);
+ parport_unregister_driver(&panel_driver);
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/poch/poch.c linux-2.6.29-rc3.owrt/drivers/staging/poch/poch.c
+--- linux-2.6.29.owrt/drivers/staging/poch/poch.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/staging/poch/poch.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1026,7 +1026,7 @@
+ }
+ break;
+ case POCH_IOC_GET_COUNTERS:
+- if (!access_ok(VERIFY_WRITE, argp, sizeof(struct poch_counters)))
++ if (access_ok(VERIFY_WRITE, argp, sizeof(struct poch_counters)))
+ return -EFAULT;
+
+ spin_lock_irq(&channel->counters_lock);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt.c linux-2.6.29-rc3.owrt/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt.c
+--- linux-2.6.29.owrt/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt.c 2009-05-10 23:48:29.000000000 +0200
+@@ -234,21 +234,20 @@
+ void ieee80211_crypto_deinit(void)
+ {
+ struct list_head *ptr, *n;
+- struct ieee80211_crypto_alg *alg = NULL;
+
+ if (hcrypt == NULL)
+ return;
+
+- list_for_each_safe(ptr, n, &hcrypt->algs) {
+- alg = list_entry(ptr, struct ieee80211_crypto_alg, list);
+- if (alg) {
+- list_del(ptr);
+- printk(KERN_DEBUG
+- "ieee80211_crypt: unregistered algorithm '%s' (deinit)\n",
+- alg->ops->name);
+- kfree(alg);
+- }
++ for (ptr = hcrypt->algs.next, n = ptr->next; ptr != &hcrypt->algs;
++ ptr = n, n = ptr->next) {
++ struct ieee80211_crypto_alg *alg =
++ (struct ieee80211_crypto_alg *) ptr;
++ list_del(ptr);
++ printk(KERN_DEBUG "ieee80211_crypt: unregistered algorithm "
++ "'%s' (deinit)\n", alg->ops->name);
++ kfree(alg);
+ }
++
+ kfree(hcrypt);
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/rtl8187se/Kconfig linux-2.6.29-rc3.owrt/drivers/staging/rtl8187se/Kconfig
+--- linux-2.6.29.owrt/drivers/staging/rtl8187se/Kconfig 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/staging/rtl8187se/Kconfig 2009-05-10 23:48:29.000000000 +0200
+@@ -1,6 +1,5 @@
+ config RTL8187SE
+ tristate "RealTek RTL8187SE Wireless LAN NIC driver"
+ depends on PCI
+- depends on WIRELESS_EXT && COMPAT_NET_DEV_OPS
+ default N
+ ---help---
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/rtl8187se/r8180_core.c linux-2.6.29-rc3.owrt/drivers/staging/rtl8187se/r8180_core.c
+--- linux-2.6.29.owrt/drivers/staging/rtl8187se/r8180_core.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/staging/rtl8187se/r8180_core.c 2009-05-10 23:48:29.000000000 +0200
+@@ -6161,10 +6161,10 @@
+ {
+ pci_unregister_driver (&rtl8180_pci_driver);
+ rtl8180_proc_module_remove();
++ ieee80211_crypto_deinit();
+ ieee80211_crypto_tkip_exit();
+ ieee80211_crypto_ccmp_exit();
+ ieee80211_crypto_wep_exit();
+- ieee80211_crypto_deinit();
+ DMESG("Exiting");
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/usbip/usbip_common.c linux-2.6.29-rc3.owrt/drivers/staging/usbip/usbip_common.c
+--- linux-2.6.29.owrt/drivers/staging/usbip/usbip_common.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/staging/usbip/usbip_common.c 2009-05-10 23:48:29.000000000 +0200
+@@ -406,20 +406,8 @@
+ /*
+ * threads are invoked per one device (per one connection).
+ */
+- int retval;
+-
+- retval = kernel_thread(usbip_thread, (void *)&ud->tcp_rx, 0);
+- if (retval < 0) {
+- printk(KERN_ERR "Creating tcp_rx thread for ud %p failed.\n",
+- ud);
+- return;
+- }
+- retval = kernel_thread(usbip_thread, (void *)&ud->tcp_tx, 0);
+- if (retval < 0) {
+- printk(KERN_ERR "Creating tcp_tx thread for ud %p failed.\n",
+- ud);
+- return;
+- }
++ kernel_thread(usbip_thread, (void *)&ud->tcp_rx, 0);
++ kernel_thread(usbip_thread, (void *)&ud->tcp_tx, 0);
+
+ /* confirm threads are starting */
+ wait_for_completion(&ud->tcp_rx.thread_done);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/staging/winbond/wbusb.c linux-2.6.29-rc3.owrt/drivers/staging/winbond/wbusb.c
+--- linux-2.6.29.owrt/drivers/staging/winbond/wbusb.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/staging/winbond/wbusb.c 2009-05-10 23:48:29.000000000 +0200
+@@ -319,18 +319,16 @@
+ struct usb_device *udev = interface_to_usbdev(intf);
+ struct wbsoft_priv *priv;
+ struct ieee80211_hw *dev;
+- int nr, err;
++ int err;
+
+ usb_get_dev(udev);
+
+ // 20060630.2 Check the device if it already be opened
+- nr = usb_control_msg(udev, usb_rcvctrlpipe( udev, 0 ),
+- 0x01, USB_TYPE_VENDOR|USB_RECIP_DEVICE|USB_DIR_IN,
+- 0x0, 0x400, &ltmp, 4, HZ*100 );
+- if (nr < 0) {
+- err = nr;
++ err = usb_control_msg(udev, usb_rcvctrlpipe( udev, 0 ),
++ 0x01, USB_TYPE_VENDOR|USB_RECIP_DEVICE|USB_DIR_IN,
++ 0x0, 0x400, &ltmp, 4, HZ*100 );
++ if (err)
+ goto error;
+- }
+
+ ltmp = cpu_to_le32(ltmp);
+ if (ltmp) { // Is already initialized?
+@@ -339,10 +337,8 @@
+ }
+
+ dev = ieee80211_alloc_hw(sizeof(*priv), &wbsoft_ops);
+- if (!dev) {
+- err = -ENOMEM;
++ if (!dev)
+ goto error;
+- }
+
+ priv = dev->priv;
+
+@@ -373,11 +369,9 @@
+ }
+
+ dev->extra_tx_headroom = 12; /* FIXME */
+- dev->flags = IEEE80211_HW_SIGNAL_UNSPEC;
+- dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
++ dev->flags = 0;
+
+ dev->channel_change_time = 1000;
+- dev->max_signal = 100;
+ dev->queues = 1;
+
+ dev->wiphy->bands[IEEE80211_BAND_2GHZ] = &wbsoft_band_2GHz;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/atm/cxacru.c linux-2.6.29-rc3.owrt/drivers/usb/atm/cxacru.c
+--- linux-2.6.29.owrt/drivers/usb/atm/cxacru.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/atm/cxacru.c 2009-05-10 23:48:29.000000000 +0200
+@@ -485,7 +485,7 @@
+ usb_err(instance->usbatm, "requested transfer size too large (%d, %d)\n",
+ wbuflen, rbuflen);
+ ret = -ENOMEM;
+- goto err;
++ goto fail;
+ }
+
+ mutex_lock(&instance->cm_serialize);
+@@ -565,7 +565,6 @@
+ dbg("cm %#x", cm);
+ fail:
+ mutex_unlock(&instance->cm_serialize);
+-err:
+ return ret;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/class/cdc-acm.c linux-2.6.29-rc3.owrt/drivers/usb/class/cdc-acm.c
+--- linux-2.6.29.owrt/drivers/usb/class/cdc-acm.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/class/cdc-acm.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1349,6 +1349,9 @@
+ { USB_DEVICE(0x0e8d, 0x0003), /* FIREFLY, MediaTek Inc; andrey.arapov@gmail.com */
+ .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
+ },
++ { USB_DEVICE(0x0e8d, 0x3329), /* i-blue 747, Qstarz BT-Q1000, Holux M-241 */
++ .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
++ },
+ { USB_DEVICE(0x0e8d, 0x3329), /* MediaTek Inc GPS */
+ .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
+ },
+@@ -1376,15 +1379,6 @@
+ { USB_DEVICE(0x0572, 0x1324), /* Conexant USB MODEM RD02-D400 */
+ .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
+ },
+- { USB_DEVICE(0x22b8, 0x6425), /* Motorola MOTOMAGX phones */
+- },
+- { USB_DEVICE(0x0572, 0x1329), /* Hummingbird huc56s (Conexant) */
+- .driver_info = NO_UNION_NORMAL, /* union descriptor misplaced on
+- data interface instead of
+- communications interface.
+- Maybe we should define a new
+- quirk for this. */
+- },
+
+ /* control interfaces with various AT-command sets */
+ { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/class/usbtmc.c linux-2.6.29-rc3.owrt/drivers/usb/class/usbtmc.c
+--- linux-2.6.29.owrt/drivers/usb/class/usbtmc.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/class/usbtmc.c 2009-05-10 23:48:29.000000000 +0200
+@@ -50,7 +50,6 @@
+
+ static struct usb_device_id usbtmc_devices[] = {
+ { USB_INTERFACE_INFO(USB_CLASS_APP_SPEC, 3, 0), },
+- { USB_INTERFACE_INFO(USB_CLASS_APP_SPEC, 3, 1), },
+ { 0, } /* terminating entry */
+ };
+ MODULE_DEVICE_TABLE(usb, usbtmc_devices);
+@@ -107,13 +106,12 @@
+ {
+ struct usb_interface *intf;
+ struct usbtmc_device_data *data;
+- int retval = 0;
++ int retval = -ENODEV;
+
+ intf = usb_find_interface(&usbtmc_driver, iminor(inode));
+ if (!intf) {
+ printk(KERN_ERR KBUILD_MODNAME
+ ": can not find device for minor %d", iminor(inode));
+- retval = -ENODEV;
+ goto exit;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/core/devio.c linux-2.6.29-rc3.owrt/drivers/usb/core/devio.c
+--- linux-2.6.29.owrt/drivers/usb/core/devio.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/core/devio.c 2009-05-10 23:48:29.000000000 +0200
+@@ -359,6 +359,11 @@
+ spin_lock_irqsave(&ps->lock, flags);
+ }
+ spin_unlock_irqrestore(&ps->lock, flags);
++ as = async_getcompleted(ps);
++ while (as) {
++ free_async(as);
++ as = async_getcompleted(ps);
++ }
+ }
+
+ static void destroy_async_on_interface(struct dev_state *ps,
+@@ -638,7 +643,6 @@
+ struct dev_state *ps = file->private_data;
+ struct usb_device *dev = ps->dev;
+ unsigned int ifnum;
+- struct async *as;
+
+ usb_lock_device(dev);
+
+@@ -657,12 +661,6 @@
+ usb_unlock_device(dev);
+ usb_put_dev(dev);
+ put_pid(ps->disc_pid);
+-
+- as = async_getcompleted(ps);
+- while (as) {
+- free_async(as);
+- as = async_getcompleted(ps);
+- }
+ kfree(ps);
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/core/hcd.h linux-2.6.29-rc3.owrt/drivers/usb/core/hcd.h
+--- linux-2.6.29.owrt/drivers/usb/core/hcd.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/core/hcd.h 2009-05-10 23:48:29.000000000 +0200
+@@ -257,6 +257,7 @@
+
+ #ifdef CONFIG_PM
+ extern int usb_hcd_pci_suspend(struct pci_dev *dev, pm_message_t msg);
++extern int usb_hcd_pci_resume_early(struct pci_dev *dev);
+ extern int usb_hcd_pci_resume(struct pci_dev *dev);
+ #endif /* CONFIG_PM */
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/core/hcd-pci.c linux-2.6.29-rc3.owrt/drivers/usb/core/hcd-pci.c
+--- linux-2.6.29.owrt/drivers/usb/core/hcd-pci.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/core/hcd-pci.c 2009-05-10 23:48:29.000000000 +0200
+@@ -298,6 +298,19 @@
+ EXPORT_SYMBOL_GPL(usb_hcd_pci_suspend);
+
+ /**
++ * usb_hcd_pci_resume_early - resume a PCI-based HCD before IRQs are enabled
++ * @dev: USB Host Controller being resumed
++ *
++ * Store this function in the HCD's struct pci_driver as .resume_early.
++ */
++int usb_hcd_pci_resume_early(struct pci_dev *dev)
++{
++ pci_restore_state(dev);
++ return 0;
++}
++EXPORT_SYMBOL_GPL(usb_hcd_pci_resume_early);
++
++/**
+ * usb_hcd_pci_resume - power management resume of a PCI-based HCD
+ * @dev: USB Host Controller being resumed
+ *
+@@ -320,8 +333,6 @@
+ }
+ #endif
+
+- pci_restore_state(dev);
+-
+ hcd = pci_get_drvdata(dev);
+ if (hcd->state != HC_STATE_SUSPENDED) {
+ dev_dbg(hcd->self.controller,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/core/message.c linux-2.6.29-rc3.owrt/drivers/usb/core/message.c
+--- linux-2.6.29.owrt/drivers/usb/core/message.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/core/message.c 2009-05-10 23:48:29.000000000 +0200
+@@ -653,7 +653,7 @@
+ if (result <= 0 && result != -ETIMEDOUT)
+ continue;
+ if (result > 1 && ((u8 *)buf)[1] != type) {
+- result = -ENODATA;
++ result = -EPROTO;
+ continue;
+ }
+ break;
+@@ -696,13 +696,8 @@
+ USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,
+ (USB_DT_STRING << 8) + index, langid, buf, size,
+ USB_CTRL_GET_TIMEOUT);
+- if (result == 0 || result == -EPIPE)
+- continue;
+- if (result > 1 && ((u8 *) buf)[1] != USB_DT_STRING) {
+- result = -ENODATA;
+- continue;
+- }
+- break;
++ if (!(result == 0 || result == -EPIPE))
++ break;
+ }
+ return result;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/gadget/file_storage.c linux-2.6.29-rc3.owrt/drivers/usb/gadget/file_storage.c
+--- linux-2.6.29.owrt/drivers/usb/gadget/file_storage.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/gadget/file_storage.c 2009-05-10 23:48:29.000000000 +0200
+@@ -3879,11 +3879,7 @@
+ mod_data.protocol_type = USB_SC_SCSI;
+ mod_data.protocol_name = "Transparent SCSI";
+
+- /* Some peripheral controllers are known not to be able to
+- * halt bulk endpoints correctly. If one of them is present,
+- * disable stalls.
+- */
+- if (gadget_is_sh(fsg->gadget) || gadget_is_at91(fsg->gadget))
++ if (gadget_is_sh(fsg->gadget))
+ mod_data.can_stall = 0;
+
+ if (mod_data.release == 0xffff) { // Parameter wasn't set
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/gadget/f_obex.c linux-2.6.29-rc3.owrt/drivers/usb/gadget/f_obex.c
+--- linux-2.6.29.owrt/drivers/usb/gadget/f_obex.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/gadget/f_obex.c 2009-05-10 23:48:29.000000000 +0200
+@@ -366,9 +366,9 @@
+ f->hs_descriptors = usb_copy_descriptors(hs_function);
+
+ obex->hs.obex_in = usb_find_endpoint(hs_function,
+- f->hs_descriptors, &obex_hs_ep_in_desc);
++ f->descriptors, &obex_hs_ep_in_desc);
+ obex->hs.obex_out = usb_find_endpoint(hs_function,
+- f->hs_descriptors, &obex_hs_ep_out_desc);
++ f->descriptors, &obex_hs_ep_out_desc);
+ }
+
+ /* Avoid letting this gadget enumerate until the userspace
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/gadget/fsl_qe_udc.c linux-2.6.29-rc3.owrt/drivers/usb/gadget/fsl_qe_udc.c
+--- linux-2.6.29.owrt/drivers/usb/gadget/fsl_qe_udc.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/gadget/fsl_qe_udc.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1622,8 +1622,6 @@
+ nuke(ep, -ESHUTDOWN);
+ ep->desc = NULL;
+ ep->stopped = 1;
+- ep->tx_req = NULL;
+- qe_ep_reset(udc, ep->epnum);
+ spin_unlock_irqrestore(&udc->lock, flags);
+
+ cpm_muram_free(cpm_muram_offset(ep->rxbase));
+@@ -1683,11 +1681,14 @@
+ kfree(req);
+ }
+
+-static int __qe_ep_queue(struct usb_ep *_ep, struct usb_request *_req)
++/* queues (submits) an I/O request to an endpoint */
++static int qe_ep_queue(struct usb_ep *_ep, struct usb_request *_req,
++ gfp_t gfp_flags)
+ {
+ struct qe_ep *ep = container_of(_ep, struct qe_ep, ep);
+ struct qe_req *req = container_of(_req, struct qe_req, req);
+ struct qe_udc *udc;
++ unsigned long flags;
+ int reval;
+
+ udc = ep->udc;
+@@ -1731,7 +1732,7 @@
+ list_add_tail(&req->queue, &ep->queue);
+ dev_vdbg(udc->dev, "gadget have request in %s! %d\n",
+ ep->name, req->req.length);
+-
++ spin_lock_irqsave(&udc->lock, flags);
+ /* push the request to device */
+ if (ep_is_in(ep))
+ reval = ep_req_send(ep, req);
+@@ -1747,22 +1748,9 @@
+ if (ep->dir == USB_DIR_OUT)
+ reval = ep_req_receive(ep, req);
+
+- return 0;
+-}
+-
+-/* queues (submits) an I/O request to an endpoint */
+-static int qe_ep_queue(struct usb_ep *_ep, struct usb_request *_req,
+- gfp_t gfp_flags)
+-{
+- struct qe_ep *ep = container_of(_ep, struct qe_ep, ep);
+- struct qe_udc *udc = ep->udc;
+- unsigned long flags;
+- int ret;
+-
+- spin_lock_irqsave(&udc->lock, flags);
+- ret = __qe_ep_queue(_ep, _req);
+ spin_unlock_irqrestore(&udc->lock, flags);
+- return ret;
++
++ return 0;
+ }
+
+ /* dequeues (cancels, unlinks) an I/O request from an endpoint */
+@@ -2020,7 +2008,7 @@
+ udc->ep0_dir = USB_DIR_IN;
+
+ /* data phase */
+- status = __qe_ep_queue(&ep->ep, &req->req);
++ status = qe_ep_queue(&ep->ep, &req->req, GFP_ATOMIC);
+
+ if (status == 0)
+ return;
+@@ -2163,9 +2151,6 @@
+ {
+ unsigned char i;
+
+- if (udc->usb_state == USB_STATE_DEFAULT)
+- return 0;
+-
+ qe_usb_disable();
+ out_8(&udc->usb_regs->usb_usadr, 0);
+
+@@ -2457,12 +2442,8 @@
+ struct usb_ctlr __iomem *qe_usbregs;
+ qe_usbregs = udc->usb_regs;
+
+- /* Spec says that we must enable the USB controller to change mode. */
++ /* Init the usb register */
+ out_8(&qe_usbregs->usb_usmod, 0x01);
+- /* Mode changed, now disable it, since muram isn't initialized yet. */
+- out_8(&qe_usbregs->usb_usmod, 0x00);
+-
+- /* Initialize the rest. */
+ out_be16(&qe_usbregs->usb_usbmr, 0);
+ out_8(&qe_usbregs->usb_uscom, 0);
+ out_be16(&qe_usbregs->usb_usber, USBER_ALL_CLEAR);
+@@ -2623,10 +2604,6 @@
+ (unsigned long)udc_controller);
+ /* request irq and disable DR */
+ udc_controller->usb_irq = irq_of_parse_and_map(np, 0);
+- if (!udc_controller->usb_irq) {
+- ret = -EINVAL;
+- goto err_noirq;
+- }
+
+ ret = request_irq(udc_controller->usb_irq, qe_udc_irq, 0,
+ driver_name, udc_controller);
+@@ -2648,8 +2625,6 @@
+ err6:
+ free_irq(udc_controller->usb_irq, udc_controller);
+ err5:
+- irq_dispose_mapping(udc_controller->usb_irq);
+-err_noirq:
+ if (udc_controller->nullmap) {
+ dma_unmap_single(udc_controller->gadget.dev.parent,
+ udc_controller->nullp, 256,
+@@ -2673,7 +2648,7 @@
+ iounmap(udc_controller->usb_regs);
+ err1:
+ kfree(udc_controller);
+- udc_controller = NULL;
++
+ return ret;
+ }
+
+@@ -2735,7 +2710,6 @@
+ kfree(ep->txframe);
+
+ free_irq(udc_controller->usb_irq, udc_controller);
+- irq_dispose_mapping(udc_controller->usb_irq);
+
+ tasklet_kill(&udc_controller->rx_tasklet);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/gadget/fsl_usb2_udc.c linux-2.6.29-rc3.owrt/drivers/usb/gadget/fsl_usb2_udc.c
+--- linux-2.6.29.owrt/drivers/usb/gadget/fsl_usb2_udc.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/gadget/fsl_usb2_udc.c 2009-05-10 23:48:29.000000000 +0200
+@@ -404,10 +404,7 @@
+ }
+ if (zlt)
+ tmp |= EP_QUEUE_HEAD_ZLT_SEL;
+-
+ p_QH->max_pkt_length = cpu_to_le32(tmp);
+- p_QH->next_dtd_ptr = 1;
+- p_QH->size_ioc_int_sts = 0;
+
+ return;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/gadget/Kconfig linux-2.6.29-rc3.owrt/drivers/usb/gadget/Kconfig
+--- linux-2.6.29.owrt/drivers/usb/gadget/Kconfig 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/gadget/Kconfig 2009-05-10 23:48:29.000000000 +0200
+@@ -191,7 +191,6 @@
+ boolean "OMAP USB Device Controller"
+ depends on ARCH_OMAP
+ select ISP1301_OMAP if MACH_OMAP_H2 || MACH_OMAP_H3 || MACH_OMAP_H4_OTG
+- select USB_OTG_UTILS if ARCH_OMAP
+ help
+ Many Texas Instruments OMAP processors have flexible full
+ speed USB device controllers, with support for up to 30
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/gadget/pxa25x_udc.c linux-2.6.29-rc3.owrt/drivers/usb/gadget/pxa25x_udc.c
+--- linux-2.6.29.owrt/drivers/usb/gadget/pxa25x_udc.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/gadget/pxa25x_udc.c 2009-05-10 23:48:29.000000000 +0200
+@@ -904,8 +904,8 @@
+
+ /* most IN status is the same, but ISO can't stall */
+ *ep->reg_udccs = UDCCS_BI_TPC|UDCCS_BI_FTF|UDCCS_BI_TUR
+- | (ep->bmAttributes == USB_ENDPOINT_XFER_ISOC
+- ? 0 : UDCCS_BI_SST);
++ | (ep->bmAttributes == USB_ENDPOINT_XFER_ISOC)
++ ? 0 : UDCCS_BI_SST;
+ }
+
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/host/ehci.h linux-2.6.29-rc3.owrt/drivers/usb/host/ehci.h
+--- linux-2.6.29.owrt/drivers/usb/host/ehci.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/host/ehci.h 2009-05-10 23:48:29.000000000 +0200
+@@ -87,10 +87,6 @@
+ int next_uframe; /* scan periodic, start here */
+ unsigned periodic_sched; /* periodic activity count */
+
+- /* list of itds completed while clock_frame was still active */
+- struct list_head cached_itd_list;
+- unsigned clock_frame;
+-
+ /* per root hub port */
+ unsigned long reset_done [EHCI_MAX_ROOT_PORTS];
+
+@@ -224,8 +220,6 @@
+ }
+ }
+
+-static void free_cached_itd_list(struct ehci_hcd *ehci);
+-
+ /*-------------------------------------------------------------------------*/
+
+ #include <linux/usb/ehci_def.h>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/host/ehci-hcd.c linux-2.6.29-rc3.owrt/drivers/usb/host/ehci-hcd.c
+--- linux-2.6.29.owrt/drivers/usb/host/ehci-hcd.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/host/ehci-hcd.c 2009-05-10 23:48:29.000000000 +0200
+@@ -485,7 +485,6 @@
+ * periodic_size can shrink by USBCMD update if hcc_params allows.
+ */
+ ehci->periodic_size = DEFAULT_I_TDPS;
+- INIT_LIST_HEAD(&ehci->cached_itd_list);
+ if ((retval = ehci_mem_init(ehci, GFP_KERNEL)) < 0)
+ return retval;
+
+@@ -498,7 +497,6 @@
+
+ ehci->reclaim = NULL;
+ ehci->next_uframe = -1;
+- ehci->clock_frame = -1;
+
+ /*
+ * dedicate a qh for the async ring head, since we couldn't unlink
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/host/ehci-mem.c linux-2.6.29-rc3.owrt/drivers/usb/host/ehci-mem.c
+--- linux-2.6.29.owrt/drivers/usb/host/ehci-mem.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/host/ehci-mem.c 2009-05-10 23:48:29.000000000 +0200
+@@ -128,7 +128,6 @@
+
+ static void ehci_mem_cleanup (struct ehci_hcd *ehci)
+ {
+- free_cached_itd_list(ehci);
+ if (ehci->async)
+ qh_put (ehci->async);
+ ehci->async = NULL;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/host/ehci-pci.c linux-2.6.29-rc3.owrt/drivers/usb/host/ehci-pci.c
+--- linux-2.6.29.owrt/drivers/usb/host/ehci-pci.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/host/ehci-pci.c 2009-05-10 23:48:29.000000000 +0200
+@@ -432,6 +432,7 @@
+
+ #ifdef CONFIG_PM
+ .suspend = usb_hcd_pci_suspend,
++ .resume_early = usb_hcd_pci_resume_early,
+ .resume = usb_hcd_pci_resume,
+ #endif
+ .shutdown = usb_hcd_pci_shutdown,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/host/ehci-q.c linux-2.6.29-rc3.owrt/drivers/usb/host/ehci-q.c
+--- linux-2.6.29.owrt/drivers/usb/host/ehci-q.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/host/ehci-q.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1095,8 +1095,7 @@
+ prev->qh_next = qh->qh_next;
+ wmb ();
+
+- /* If the controller isn't running, we don't have to wait for it */
+- if (unlikely(!HC_IS_RUNNING(ehci_to_hcd(ehci)->state))) {
++ if (unlikely (ehci_to_hcd(ehci)->state == HC_STATE_HALT)) {
+ /* if (unlikely (qh->reclaim != 0))
+ * this will recurse, probably not much
+ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/host/ehci-sched.c linux-2.6.29-rc3.owrt/drivers/usb/host/ehci-sched.c
+--- linux-2.6.29.owrt/drivers/usb/host/ehci-sched.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/host/ehci-sched.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1004,8 +1004,7 @@
+
+ is_in = (stream->bEndpointAddress & USB_DIR_IN) ? 0x10 : 0;
+ stream->bEndpointAddress &= 0x0f;
+- if (stream->ep)
+- stream->ep->hcpriv = NULL;
++ stream->ep->hcpriv = NULL;
+
+ if (stream->rescheduled) {
+ ehci_info (ehci, "ep%d%s-iso rescheduled "
+@@ -1536,7 +1535,7 @@
+ struct ehci_itd, itd_list);
+ list_move_tail (&itd->itd_list, &stream->td_list);
+ itd->stream = iso_stream_get (stream);
+- itd->urb = urb;
++ itd->urb = usb_get_urb (urb);
+ itd_init (ehci, stream, itd);
+ }
+
+@@ -1645,7 +1644,7 @@
+ (void) disable_periodic(ehci);
+ ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--;
+
+- if (unlikely(list_is_singular(&stream->td_list))) {
++ if (unlikely (list_empty (&stream->td_list))) {
+ ehci_to_hcd(ehci)->self.bandwidth_allocated
+ -= stream->bandwidth;
+ ehci_vdbg (ehci,
+@@ -1654,27 +1653,14 @@
+ (stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out");
+ }
+ iso_stream_put (ehci, stream);
+-
++ /* OK to recycle this ITD now that its completion callback ran. */
+ done:
++ usb_put_urb(urb);
+ itd->urb = NULL;
+- if (ehci->clock_frame != itd->frame || itd->index[7] != -1) {
+- /* OK to recycle this ITD now. */
+- itd->stream = NULL;
+- list_move(&itd->itd_list, &stream->free_list);
+- iso_stream_put(ehci, stream);
+- } else {
+- /* HW might remember this ITD, so we can't recycle it yet.
+- * Move it to a safe place until a new frame starts.
+- */
+- list_move(&itd->itd_list, &ehci->cached_itd_list);
+- if (stream->refcount == 2) {
+- /* If iso_stream_put() were called here, stream
+- * would be freed. Instead, just prevent reuse.
+- */
+- stream->ep->hcpriv = NULL;
+- stream->ep = NULL;
+- }
+- }
++ itd->stream = NULL;
++ list_move(&itd->itd_list, &stream->free_list);
++ iso_stream_put(ehci, stream);
++
+ return retval;
+ }
+
+@@ -1948,7 +1934,7 @@
+ struct ehci_sitd, sitd_list);
+ list_move_tail (&sitd->sitd_list, &stream->td_list);
+ sitd->stream = iso_stream_get (stream);
+- sitd->urb = urb;
++ sitd->urb = usb_get_urb (urb);
+
+ sitd_patch(ehci, stream, sitd, sched, packet);
+ sitd_link (ehci, (next_uframe >> 3) % ehci->periodic_size,
+@@ -2033,7 +2019,7 @@
+ (void) disable_periodic(ehci);
+ ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--;
+
+- if (list_is_singular(&stream->td_list)) {
++ if (list_empty (&stream->td_list)) {
+ ehci_to_hcd(ehci)->self.bandwidth_allocated
+ -= stream->bandwidth;
+ ehci_vdbg (ehci,
+@@ -2044,6 +2030,7 @@
+ iso_stream_put (ehci, stream);
+ /* OK to recycle this SITD now that its completion callback ran. */
+ done:
++ usb_put_urb(urb);
+ sitd->urb = NULL;
+ sitd->stream = NULL;
+ list_move(&sitd->sitd_list, &stream->free_list);
+@@ -2114,20 +2101,6 @@
+
+ /*-------------------------------------------------------------------------*/
+
+-static void free_cached_itd_list(struct ehci_hcd *ehci)
+-{
+- struct ehci_itd *itd, *n;
+-
+- list_for_each_entry_safe(itd, n, &ehci->cached_itd_list, itd_list) {
+- struct ehci_iso_stream *stream = itd->stream;
+- itd->stream = NULL;
+- list_move(&itd->itd_list, &stream->free_list);
+- iso_stream_put(ehci, stream);
+- }
+-}
+-
+-/*-------------------------------------------------------------------------*/
+-
+ static void
+ scan_periodic (struct ehci_hcd *ehci)
+ {
+@@ -2142,17 +2115,10 @@
+ * Touches as few pages as possible: cache-friendly.
+ */
+ now_uframe = ehci->next_uframe;
+- if (HC_IS_RUNNING(ehci_to_hcd(ehci)->state)) {
++ if (HC_IS_RUNNING (ehci_to_hcd(ehci)->state))
+ clock = ehci_readl(ehci, &ehci->regs->frame_index);
+- clock_frame = (clock >> 3) % ehci->periodic_size;
+- } else {
++ else
+ clock = now_uframe + mod - 1;
+- clock_frame = -1;
+- }
+- if (ehci->clock_frame != clock_frame) {
+- free_cached_itd_list(ehci);
+- ehci->clock_frame = clock_frame;
+- }
+ clock %= mod;
+ clock_frame = clock >> 3;
+
+@@ -2311,10 +2277,6 @@
+ /* rescan the rest of this frame, then ... */
+ clock = now;
+ clock_frame = clock >> 3;
+- if (ehci->clock_frame != clock_frame) {
+- free_cached_itd_list(ehci);
+- ehci->clock_frame = clock_frame;
+- }
+ } else {
+ now_uframe++;
+ now_uframe %= mod;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/host/ohci-pci.c linux-2.6.29-rc3.owrt/drivers/usb/host/ohci-pci.c
+--- linux-2.6.29.owrt/drivers/usb/host/ohci-pci.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/host/ohci-pci.c 2009-05-10 23:48:29.000000000 +0200
+@@ -487,6 +487,7 @@
+
+ #ifdef CONFIG_PM
+ .suspend = usb_hcd_pci_suspend,
++ .resume_early = usb_hcd_pci_resume_early,
+ .resume = usb_hcd_pci_resume,
+ #endif
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/host/uhci-hcd.c linux-2.6.29-rc3.owrt/drivers/usb/host/uhci-hcd.c
+--- linux-2.6.29.owrt/drivers/usb/host/uhci-hcd.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/host/uhci-hcd.c 2009-05-10 23:48:29.000000000 +0200
+@@ -942,6 +942,7 @@
+
+ #ifdef CONFIG_PM
+ .suspend = usb_hcd_pci_suspend,
++ .resume_early = usb_hcd_pci_resume_early,
+ .resume = usb_hcd_pci_resume,
+ #endif /* PM */
+ };
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/host/whci/asl.c linux-2.6.29-rc3.owrt/drivers/usb/host/whci/asl.c
+--- linux-2.6.29.owrt/drivers/usb/host/whci/asl.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/host/whci/asl.c 2009-05-10 23:48:29.000000000 +0200
+@@ -170,17 +170,12 @@
+ void asl_update(struct whc *whc, uint32_t wusbcmd)
+ {
+ struct wusbhc *wusbhc = &whc->wusbhc;
+- long t;
+
+ mutex_lock(&wusbhc->mutex);
+ if (wusbhc->active) {
+ whc_write_wusbcmd(whc, wusbcmd, wusbcmd);
+- t = wait_event_timeout(
+- whc->async_list_wq,
+- (le_readl(whc->base + WUSBCMD) & WUSBCMD_ASYNC_UPDATED) == 0,
+- msecs_to_jiffies(1000));
+- if (t == 0)
+- whc_hw_error(whc, "ASL update timeout");
++ wait_event(whc->async_list_wq,
++ (le_readl(whc->base + WUSBCMD) & WUSBCMD_ASYNC_UPDATED) == 0);
+ }
+ mutex_unlock(&wusbhc->mutex);
+ }
+@@ -227,13 +222,13 @@
+ * Now that the ASL is updated, complete the removal of any
+ * removed qsets.
+ */
+- spin_lock_irq(&whc->lock);
++ spin_lock(&whc->lock);
+
+ list_for_each_entry_safe(qset, t, &whc->async_removed_list, list_node) {
+ qset_remove_complete(whc, qset);
+ }
+
+- spin_unlock_irq(&whc->lock);
++ spin_unlock(&whc->lock);
+ }
+
+ /**
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/host/whci/hw.c linux-2.6.29-rc3.owrt/drivers/usb/host/whci/hw.c
+--- linux-2.6.29.owrt/drivers/usb/host/whci/hw.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/host/whci/hw.c 2009-05-10 23:48:29.000000000 +0200
+@@ -87,18 +87,3 @@
+
+ return ret;
+ }
+-
+-/**
+- * whc_hw_error - recover from a hardware error
+- * @whc: the WHCI HC that broke.
+- * @reason: a description of the failure.
+- *
+- * Recover from broken hardware with a full reset.
+- */
+-void whc_hw_error(struct whc *whc, const char *reason)
+-{
+- struct wusbhc *wusbhc = &whc->wusbhc;
+-
+- dev_err(&whc->umc->dev, "hardware error: %s\n", reason);
+- wusbhc_reset_all(wusbhc);
+-}
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/host/whci/pzl.c linux-2.6.29-rc3.owrt/drivers/usb/host/whci/pzl.c
+--- linux-2.6.29.owrt/drivers/usb/host/whci/pzl.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/host/whci/pzl.c 2009-05-10 23:48:29.000000000 +0200
+@@ -183,17 +183,12 @@
+ void pzl_update(struct whc *whc, uint32_t wusbcmd)
+ {
+ struct wusbhc *wusbhc = &whc->wusbhc;
+- long t;
+
+ mutex_lock(&wusbhc->mutex);
+ if (wusbhc->active) {
+ whc_write_wusbcmd(whc, wusbcmd, wusbcmd);
+- t = wait_event_timeout(
+- whc->periodic_list_wq,
+- (le_readl(whc->base + WUSBCMD) & WUSBCMD_PERIODIC_UPDATED) == 0,
+- msecs_to_jiffies(1000));
+- if (t == 0)
+- whc_hw_error(whc, "PZL update timeout");
++ wait_event(whc->periodic_list_wq,
++ (le_readl(whc->base + WUSBCMD) & WUSBCMD_PERIODIC_UPDATED) == 0);
+ }
+ mutex_unlock(&wusbhc->mutex);
+ }
+@@ -255,13 +250,13 @@
+ * Now that the PZL is updated, complete the removal of any
+ * removed qsets.
+ */
+- spin_lock_irq(&whc->lock);
++ spin_lock(&whc->lock);
+
+ list_for_each_entry_safe(qset, t, &whc->periodic_removed_list, list_node) {
+ qset_remove_complete(whc, qset);
+ }
+
+- spin_unlock_irq(&whc->lock);
++ spin_unlock(&whc->lock);
+ }
+
+ /**
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/host/whci/whcd.h linux-2.6.29-rc3.owrt/drivers/usb/host/whci/whcd.h
+--- linux-2.6.29.owrt/drivers/usb/host/whci/whcd.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/host/whci/whcd.h 2009-05-10 23:48:29.000000000 +0200
+@@ -137,7 +137,6 @@
+ /* hw.c */
+ void whc_write_wusbcmd(struct whc *whc, u32 mask, u32 val);
+ int whc_do_gencmd(struct whc *whc, u32 cmd, u32 params, void *addr, size_t len);
+-void whc_hw_error(struct whc *whc, const char *reason);
+
+ /* wusb.c */
+ int whc_wusbhc_start(struct wusbhc *wusbhc);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/image/mdc800.c linux-2.6.29-rc3.owrt/drivers/usb/image/mdc800.c
+--- linux-2.6.29.owrt/drivers/usb/image/mdc800.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/image/mdc800.c 2009-05-10 23:48:29.000000000 +0200
+@@ -499,7 +499,6 @@
+ retval = usb_register_dev(intf, &mdc800_class);
+ if (retval) {
+ dev_err(&intf->dev, "Not able to get a minor for this device.\n");
+- mutex_unlock(&mdc800->io_lock);
+ return -ENODEV;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/Makefile linux-2.6.29-rc3.owrt/drivers/usb/Makefile
+--- linux-2.6.29.owrt/drivers/usb/Makefile 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/Makefile 2009-05-10 23:48:29.000000000 +0200
+@@ -11,7 +11,6 @@
+ obj-$(CONFIG_PCI) += host/
+ obj-$(CONFIG_USB_EHCI_HCD) += host/
+ obj-$(CONFIG_USB_ISP116X_HCD) += host/
+-obj-$(CONFIG_USB_ISP1760_HCD) += host/
+ obj-$(CONFIG_USB_OHCI_HCD) += host/
+ obj-$(CONFIG_USB_UHCI_HCD) += host/
+ obj-$(CONFIG_USB_FHCI_HCD) += host/
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/misc/adutux.c linux-2.6.29-rc3.owrt/drivers/usb/misc/adutux.c
+--- linux-2.6.29.owrt/drivers/usb/misc/adutux.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/misc/adutux.c 2009-05-10 23:48:29.000000000 +0200
+@@ -376,7 +376,7 @@
+ if (dev->open_count <= 0) {
+ dbg(1," %s : device not opened", __func__);
+ retval = -ENODEV;
+- goto unlock;
++ goto exit;
+ }
+
+ adu_release_internal(dev);
+@@ -385,9 +385,9 @@
+ if (!dev->open_count) /* ... and we're the last user */
+ adu_delete(dev);
+ }
+-unlock:
+- mutex_unlock(&adutux_mutex);
++
+ exit:
++ mutex_unlock(&adutux_mutex);
+ dbg(2," %s : leave, return value %d", __func__, retval);
+ return retval;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/misc/vstusb.c linux-2.6.29-rc3.owrt/drivers/usb/misc/vstusb.c
+--- linux-2.6.29.owrt/drivers/usb/misc/vstusb.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/misc/vstusb.c 2009-05-10 23:48:29.000000000 +0200
+@@ -401,7 +401,6 @@
+ }
+
+ if (copy_from_user(buf, buffer, count)) {
+- mutex_unlock(&vstdev->lock);
+ dev_err(&dev->dev, "%s: can't copy_from_user\n", __func__);
+ retval = -EFAULT;
+ goto exit;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/musb/davinci.c linux-2.6.29-rc3.owrt/drivers/usb/musb/davinci.c
+--- linux-2.6.29.owrt/drivers/usb/musb/davinci.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/musb/davinci.c 2009-05-10 23:48:29.000000000 +0200
+@@ -377,8 +377,18 @@
+ u32 revision;
+
+ musb->mregs += DAVINCI_BASE_OFFSET;
++#if 0
++ /* REVISIT there's something odd about clocking, this
++ * didn't appear do the job ...
++ */
++ musb->clock = clk_get(pDevice, "usb");
++ if (IS_ERR(musb->clock))
++ return PTR_ERR(musb->clock);
+
+- clk_enable(musb->clock);
++ status = clk_enable(musb->clock);
++ if (status < 0)
++ return -ENODEV;
++#endif
+
+ /* returns zero if e.g. not clocked */
+ revision = musb_readl(tibase, DAVINCI_USB_VERSION_REG);
+@@ -443,8 +453,5 @@
+ }
+
+ phy_off();
+-
+- clk_disable(musb->clock);
+-
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/musb/musb_core.c linux-2.6.29-rc3.owrt/drivers/usb/musb/musb_core.c
+--- linux-2.6.29.owrt/drivers/usb/musb/musb_core.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/musb/musb_core.c 2009-05-10 23:48:29.000000000 +0200
+@@ -115,7 +115,7 @@
+
+
+ unsigned musb_debug;
+-module_param_named(debug, musb_debug, uint, S_IRUGO | S_IWUSR);
++module_param(musb_debug, uint, S_IRUGO | S_IWUSR);
+ MODULE_PARM_DESC(debug, "Debug message level. Default = 0");
+
+ #define DRIVER_AUTHOR "Mentor Graphics, Texas Instruments, Nokia"
+@@ -767,7 +767,6 @@
+ #ifdef CONFIG_USB_MUSB_HDRC_HCD
+ case OTG_STATE_A_HOST:
+ case OTG_STATE_A_SUSPEND:
+- usb_hcd_resume_root_hub(musb_to_hcd(musb));
+ musb_root_disconnect(musb);
+ if (musb->a_wait_bcon != 0)
+ musb_platform_try_idle(musb, jiffies
+@@ -1816,7 +1815,7 @@
+ #ifdef CONFIG_SYSFS
+ device_remove_file(musb->controller, &dev_attr_mode);
+ device_remove_file(musb->controller, &dev_attr_vbus);
+-#ifdef CONFIG_USB_GADGET_MUSB_HDRC
++#ifdef CONFIG_USB_MUSB_OTG
+ device_remove_file(musb->controller, &dev_attr_srp);
+ #endif
+ #endif
+@@ -2064,7 +2063,7 @@
+ #ifdef CONFIG_SYSFS
+ device_remove_file(musb->controller, &dev_attr_mode);
+ device_remove_file(musb->controller, &dev_attr_vbus);
+-#ifdef CONFIG_USB_GADGET_MUSB_HDRC
++#ifdef CONFIG_USB_MUSB_OTG
+ device_remove_file(musb->controller, &dev_attr_srp);
+ #endif
+ #endif
+@@ -2244,10 +2243,10 @@
+ return platform_driver_probe(&musb_driver, musb_probe);
+ }
+
+-/* make us init after usbcore and i2c (transceivers, regulators, etc)
+- * and before usb gadget and host-side drivers start to register
++/* make us init after usbcore and before usb
++ * gadget and host-side drivers start to register
+ */
+-fs_initcall(musb_init);
++subsys_initcall(musb_init);
+
+ static void __exit musb_cleanup(void)
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/musb/musb_gadget.c linux-2.6.29-rc3.owrt/drivers/usb/musb/musb_gadget.c
+--- linux-2.6.29.owrt/drivers/usb/musb/musb_gadget.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/musb/musb_gadget.c 2009-05-10 23:48:29.000000000 +0200
+@@ -575,7 +575,7 @@
+ struct usb_request *request = &req->request;
+ struct musb_ep *musb_ep = &musb->endpoints[epnum].ep_out;
+ void __iomem *epio = musb->endpoints[epnum].regs;
+- unsigned fifo_count = 0;
++ u16 fifo_count = 0;
+ u16 len = musb_ep->packet_sz;
+
+ csr = musb_readw(epio, MUSB_RXCSR);
+@@ -687,7 +687,7 @@
+ len, fifo_count,
+ musb_ep->packet_sz);
+
+- fifo_count = min_t(unsigned, len, fifo_count);
++ fifo_count = min(len, fifo_count);
+
+ #ifdef CONFIG_USB_TUSB_OMAP_DMA
+ if (tusb_dma_omap() && musb_ep->dma) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/musb/musb_host.c linux-2.6.29-rc3.owrt/drivers/usb/musb/musb_host.c
+--- linux-2.6.29.owrt/drivers/usb/musb/musb_host.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/musb/musb_host.c 2009-05-10 23:48:29.000000000 +0200
+@@ -335,11 +335,16 @@
+ static struct musb_qh *
+ musb_giveback(struct musb_qh *qh, struct urb *urb, int status)
+ {
++ int is_in;
+ struct musb_hw_ep *ep = qh->hw_ep;
+ struct musb *musb = ep->musb;
+- int is_in = usb_pipein(urb->pipe);
+ int ready = qh->is_ready;
+
++ if (ep->is_shared_fifo)
++ is_in = 1;
++ else
++ is_in = usb_pipein(urb->pipe);
++
+ /* save toggle eagerly, for paranoia */
+ switch (qh->type) {
+ case USB_ENDPOINT_XFER_BULK:
+@@ -427,7 +432,7 @@
+ else
+ qh = musb_giveback(qh, urb, urb->status);
+
+- if (qh != NULL && qh->is_ready) {
++ if (qh && qh->is_ready && !list_empty(&qh->hep->urb_list)) {
+ DBG(4, "... next ep%d %cX urb %p\n",
+ hw_ep->epnum, is_in ? 'R' : 'T',
+ next_urb(qh));
+@@ -937,8 +942,8 @@
+ switch (musb->ep0_stage) {
+ case MUSB_EP0_IN:
+ fifo_dest = urb->transfer_buffer + urb->actual_length;
+- fifo_count = min_t(size_t, len, urb->transfer_buffer_length -
+- urb->actual_length);
++ fifo_count = min(len, ((u16) (urb->transfer_buffer_length
++ - urb->actual_length)));
+ if (fifo_count < len)
+ urb->status = -EOVERFLOW;
+
+@@ -971,9 +976,10 @@
+ }
+ /* FALLTHROUGH */
+ case MUSB_EP0_OUT:
+- fifo_count = min_t(size_t, qh->maxpacket,
+- urb->transfer_buffer_length -
+- urb->actual_length);
++ fifo_count = min(qh->maxpacket, ((u16)
++ (urb->transfer_buffer_length
++ - urb->actual_length)));
++
+ if (fifo_count) {
+ fifo_dest = (u8 *) (urb->transfer_buffer
+ + urb->actual_length);
+@@ -1155,8 +1161,7 @@
+ struct urb *urb;
+ struct musb_hw_ep *hw_ep = musb->endpoints + epnum;
+ void __iomem *epio = hw_ep->regs;
+- struct musb_qh *qh = hw_ep->is_shared_fifo ? hw_ep->in_qh
+- : hw_ep->out_qh;
++ struct musb_qh *qh = hw_ep->out_qh;
+ u32 status = 0;
+ void __iomem *mbase = musb->mregs;
+ struct dma_channel *dma;
+@@ -1303,8 +1308,7 @@
+ * packets before updating TXCSR ... other docs disagree ...
+ */
+ /* PIO: start next packet in this URB */
+- if (wLength > qh->maxpacket)
+- wLength = qh->maxpacket;
++ wLength = min(qh->maxpacket, (u16) wLength);
+ musb_write_fifo(hw_ep, wLength, buf);
+ qh->segsize = wLength;
+
+@@ -1863,21 +1867,19 @@
+ }
+ qh->type_reg = type_reg;
+
+- /* Precompute RXINTERVAL/TXINTERVAL register */
++ /* precompute rxinterval/txinterval register */
++ interval = min((u8)16, epd->bInterval); /* log encoding */
+ switch (qh->type) {
+ case USB_ENDPOINT_XFER_INT:
+- /*
+- * Full/low speeds use the linear encoding,
+- * high speed uses the logarithmic encoding.
+- */
+- if (urb->dev->speed <= USB_SPEED_FULL) {
+- interval = max_t(u8, epd->bInterval, 1);
+- break;
++ /* fullspeed uses linear encoding */
++ if (USB_SPEED_FULL == urb->dev->speed) {
++ interval = epd->bInterval;
++ if (!interval)
++ interval = 1;
+ }
+ /* FALLTHROUGH */
+ case USB_ENDPOINT_XFER_ISOC:
+- /* ISO always uses logarithmic encoding */
+- interval = min_t(u8, epd->bInterval, 16);
++ /* iso always uses log encoding */
+ break;
+ default:
+ /* REVISIT we actually want to use NAK limits, hinting to the
+@@ -2035,9 +2037,9 @@
+ goto done;
+
+ /* Any URB not actively programmed into endpoint hardware can be
+- * immediately given back; that's any URB not at the head of an
++ * immediately given back. Such an URB must be at the head of its
+ * endpoint queue, unless someday we get real DMA queues. And even
+- * if it's at the head, it might not be known to the hardware...
++ * then, it might not be known to the hardware...
+ *
+ * Otherwise abort current transfer, pending dma, etc.; urb->status
+ * has already been updated. This is a synchronous abort; it'd be
+@@ -2076,15 +2078,6 @@
+ qh->is_ready = 0;
+ __musb_giveback(musb, urb, 0);
+ qh->is_ready = ready;
+-
+- /* If nothing else (usually musb_giveback) is using it
+- * and its URB list has emptied, recycle this qh.
+- */
+- if (ready && list_empty(&qh->hep->urb_list)) {
+- qh->hep->hcpriv = NULL;
+- list_del(&qh->ring);
+- kfree(qh);
+- }
+ } else
+ ret = musb_cleanup_urb(urb, qh, urb->pipe & USB_DIR_IN);
+ done:
+@@ -2100,15 +2093,14 @@
+ unsigned long flags;
+ struct musb *musb = hcd_to_musb(hcd);
+ u8 is_in = epnum & USB_DIR_IN;
+- struct musb_qh *qh;
+- struct urb *urb;
++ struct musb_qh *qh = hep->hcpriv;
++ struct urb *urb, *tmp;
+ struct list_head *sched;
+
+- spin_lock_irqsave(&musb->lock, flags);
++ if (!qh)
++ return;
+
+- qh = hep->hcpriv;
+- if (qh == NULL)
+- goto exit;
++ spin_lock_irqsave(&musb->lock, flags);
+
+ switch (qh->type) {
+ case USB_ENDPOINT_XFER_CONTROL:
+@@ -2143,28 +2135,13 @@
+
+ /* cleanup */
+ musb_cleanup_urb(urb, qh, urb->pipe & USB_DIR_IN);
++ } else
++ urb = NULL;
+
+- /* Then nuke all the others ... and advance the
+- * queue on hw_ep (e.g. bulk ring) when we're done.
+- */
+- while (!list_empty(&hep->urb_list)) {
+- urb = next_urb(qh);
+- urb->status = -ESHUTDOWN;
+- musb_advance_schedule(musb, urb, qh->hw_ep, is_in);
+- }
+- } else {
+- /* Just empty the queue; the hardware is busy with
+- * other transfers, and since !qh->is_ready nothing
+- * will activate any of these as it advances.
+- */
+- while (!list_empty(&hep->urb_list))
+- __musb_giveback(musb, next_urb(qh), -ESHUTDOWN);
++ /* then just nuke all the others */
++ list_for_each_entry_safe_from(urb, tmp, &hep->urb_list, urb_list)
++ musb_giveback(qh, urb, -ESHUTDOWN);
+
+- hep->hcpriv = NULL;
+- list_del(&qh->ring);
+- kfree(qh);
+- }
+-exit:
+ spin_unlock_irqrestore(&musb->lock, flags);
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/serial/aircable.c linux-2.6.29-rc3.owrt/drivers/usb/serial/aircable.c
+--- linux-2.6.29.owrt/drivers/usb/serial/aircable.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/serial/aircable.c 2009-05-10 23:48:29.000000000 +0200
+@@ -621,9 +621,9 @@
+ goto failed_usb_register;
+ return 0;
+
+-failed_usb_register:
+- usb_serial_deregister(&aircable_device);
+ failed_serial_register:
++ usb_serial_deregister(&aircable_device);
++failed_usb_register:
+ return retval;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/serial/cp2101.c linux-2.6.29-rc3.owrt/drivers/usb/serial/cp2101.c
+--- linux-2.6.29.owrt/drivers/usb/serial/cp2101.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/serial/cp2101.c 2009-05-10 23:48:29.000000000 +0200
+@@ -79,7 +79,6 @@
+ { USB_DEVICE(0x10C4, 0x814A) }, /* West Mountain Radio RIGblaster P&P */
+ { USB_DEVICE(0x10C4, 0x814B) }, /* West Mountain Radio RIGtalk */
+ { USB_DEVICE(0x10C4, 0x815E) }, /* Helicomm IP-Link 1220-DVM */
+- { USB_DEVICE(0x10C4, 0x819F) }, /* MJS USB Toslink Switcher */
+ { USB_DEVICE(0x10C4, 0x81A6) }, /* ThinkOptics WavIt */
+ { USB_DEVICE(0x10C4, 0x81AC) }, /* MSD Dash Hawk */
+ { USB_DEVICE(0x10C4, 0x81C8) }, /* Lipowsky Industrie Elektronik GmbH, Baby-JTAG */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/serial/ftdi_sio.c linux-2.6.29-rc3.owrt/drivers/usb/serial/ftdi_sio.c
+--- linux-2.6.29.owrt/drivers/usb/serial/ftdi_sio.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/serial/ftdi_sio.c 2009-05-10 23:48:29.000000000 +0200
+@@ -662,12 +662,6 @@
+ { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DUSB_PID) },
+ { USB_DEVICE(ALTI2_VID, ALTI2_N3_PID) },
+ { USB_DEVICE(FTDI_VID, DIEBOLD_BCS_SE923_PID) },
+- { USB_DEVICE(FTDI_VID, FTDI_NDI_HUC_PID) },
+- { USB_DEVICE(ATMEL_VID, STK541_PID) },
+- { USB_DEVICE(DE_VID, STB_PID) },
+- { USB_DEVICE(DE_VID, WHT_PID) },
+- { USB_DEVICE(ADI_VID, ADI_GNICE_PID),
+- .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+ { }, /* Optional parameter entry */
+ { } /* Terminating entry */
+ };
+@@ -1070,10 +1064,8 @@
+
+ if (!capable(CAP_SYS_ADMIN)) {
+ if (((new_serial.flags & ~ASYNC_USR_MASK) !=
+- (priv->flags & ~ASYNC_USR_MASK))) {
+- unlock_kernel();
++ (priv->flags & ~ASYNC_USR_MASK)))
+ return -EPERM;
+- }
+ priv->flags = ((priv->flags & ~ASYNC_USR_MASK) |
+ (new_serial.flags & ASYNC_USR_MASK));
+ priv->custom_divisor = new_serial.custom_divisor;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/serial/ftdi_sio.h linux-2.6.29-rc3.owrt/drivers/usb/serial/ftdi_sio.h
+--- linux-2.6.29.owrt/drivers/usb/serial/ftdi_sio.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/serial/ftdi_sio.h 2009-05-10 23:48:29.000000000 +0200
+@@ -844,9 +844,6 @@
+ #define TML_VID 0x1B91 /* Vendor ID */
+ #define TML_USB_SERIAL_PID 0x0064 /* USB - Serial Converter */
+
+-/* NDI Polaris System */
+-#define FTDI_NDI_HUC_PID 0xDA70
+-
+ /* Propox devices */
+ #define FTDI_PROPOX_JTAGCABLEII_PID 0xD738
+
+@@ -893,26 +890,6 @@
+ #define DIEBOLD_BCS_SE923_PID 0xfb99
+
+ /*
+- * Atmel STK541
+- */
+-#define ATMEL_VID 0x03eb /* Vendor ID */
+-#define STK541_PID 0x2109 /* Zigbee Controller */
+-
+-/*
+- * Dresden Elektronic Sensor Terminal Board
+- */
+-#define DE_VID 0x1cf1 /* Vendor ID */
+-#define STB_PID 0x0001 /* Sensor Terminal Board */
+-#define WHT_PID 0x0004 /* Wireless Handheld Terminal */
+-
+-/*
+- * Blackfin gnICE JTAG
+- * http://docs.blackfin.uclinux.org/doku.php?id=hw:jtag:gnice
+- */
+-#define ADI_VID 0x0456
+-#define ADI_GNICE_PID 0xF000
+-
+-/*
+ * BmRequestType: 1100 0000b
+ * bRequest: FTDI_E2_READ
+ * wValue: 0
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/serial/option.c linux-2.6.29-rc3.owrt/drivers/usb/serial/option.c
+--- linux-2.6.29.owrt/drivers/usb/serial/option.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/serial/option.c 2009-05-10 23:48:29.000000000 +0200
+@@ -89,7 +89,6 @@
+ #define OPTION_PRODUCT_ETNA_MODEM_GT 0x7041
+ #define OPTION_PRODUCT_ETNA_MODEM_EX 0x7061
+ #define OPTION_PRODUCT_ETNA_KOI_MODEM 0x7100
+-#define OPTION_PRODUCT_GTM380_MODEM 0x7201
+
+ #define HUAWEI_VENDOR_ID 0x12D1
+ #define HUAWEI_PRODUCT_E600 0x1001
+@@ -198,18 +197,16 @@
+ /* OVATION PRODUCTS */
+ #define NOVATELWIRELESS_PRODUCT_MC727 0x4100
+ #define NOVATELWIRELESS_PRODUCT_MC950D 0x4400
+-#define NOVATELWIRELESS_PRODUCT_U727 0x5010
+
+ /* FUTURE NOVATEL PRODUCTS */
+-#define NOVATELWIRELESS_PRODUCT_EVDO_FULLSPEED 0X6000
+-#define NOVATELWIRELESS_PRODUCT_EVDO_HIGHSPEED 0X6001
+-#define NOVATELWIRELESS_PRODUCT_HSPA_FULLSPEED 0X7000
+-#define NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED 0X7001
+-#define NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED 0X8000
+-#define NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_HIGHSPEED 0X8001
+-#define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED 0X9000
+-#define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_HIGHSPEED 0X9001
+-#define NOVATELWIRELESS_PRODUCT_GLOBAL 0XA001
++#define NOVATELWIRELESS_PRODUCT_EVDO_1 0x6000
++#define NOVATELWIRELESS_PRODUCT_HSPA_1 0x7000
++#define NOVATELWIRELESS_PRODUCT_EMBEDDED_1 0x8000
++#define NOVATELWIRELESS_PRODUCT_GLOBAL_1 0x9000
++#define NOVATELWIRELESS_PRODUCT_EVDO_2 0x6001
++#define NOVATELWIRELESS_PRODUCT_HSPA_2 0x7001
++#define NOVATELWIRELESS_PRODUCT_EMBEDDED_2 0x8001
++#define NOVATELWIRELESS_PRODUCT_GLOBAL_2 0x9001
+
+ /* AMOI PRODUCTS */
+ #define AMOI_VENDOR_ID 0x1614
+@@ -219,27 +216,6 @@
+
+ #define DELL_VENDOR_ID 0x413C
+
+-/* Dell modems */
+-#define DELL_PRODUCT_5700_MINICARD 0x8114
+-#define DELL_PRODUCT_5500_MINICARD 0x8115
+-#define DELL_PRODUCT_5505_MINICARD 0x8116
+-#define DELL_PRODUCT_5700_EXPRESSCARD 0x8117
+-#define DELL_PRODUCT_5510_EXPRESSCARD 0x8118
+-
+-#define DELL_PRODUCT_5700_MINICARD_SPRINT 0x8128
+-#define DELL_PRODUCT_5700_MINICARD_TELUS 0x8129
+-
+-#define DELL_PRODUCT_5720_MINICARD_VZW 0x8133
+-#define DELL_PRODUCT_5720_MINICARD_SPRINT 0x8134
+-#define DELL_PRODUCT_5720_MINICARD_TELUS 0x8135
+-#define DELL_PRODUCT_5520_MINICARD_CINGULAR 0x8136
+-#define DELL_PRODUCT_5520_MINICARD_GENERIC_L 0x8137
+-#define DELL_PRODUCT_5520_MINICARD_GENERIC_I 0x8138
+-
+-#define DELL_PRODUCT_5730_MINICARD_SPRINT 0x8180
+-#define DELL_PRODUCT_5730_MINICARD_TELUS 0x8181
+-#define DELL_PRODUCT_5730_MINICARD_VZW 0x8182
+-
+ #define KYOCERA_VENDOR_ID 0x0c88
+ #define KYOCERA_PRODUCT_KPC650 0x17da
+ #define KYOCERA_PRODUCT_KPC680 0x180a
+@@ -290,13 +266,19 @@
+
+ /* ZTE PRODUCTS */
+ #define ZTE_VENDOR_ID 0x19d2
+-#define ZTE_PRODUCT_MF622 0x0001
+ #define ZTE_PRODUCT_MF628 0x0015
+ #define ZTE_PRODUCT_MF626 0x0031
+ #define ZTE_PRODUCT_CDMA_TECH 0xfffe
+
+-#define BENQ_VENDOR_ID 0x04a5
+-#define BENQ_PRODUCT_H10 0x4068
++/* Ericsson products */
++#define ERICSSON_VENDOR_ID 0x0bdb
++#define ERICSSON_PRODUCT_F3507G 0x1900
++
++/* Pantech products */
++#define PANTECH_VENDOR_ID 0x106c
++#define PANTECH_PRODUCT_PC5740 0x3701
++#define PANTECH_PRODUCT_PC5750 0x3702 /* PX-500 */
++#define PANTECH_PRODUCT_UM150 0x3711
+
+ static struct usb_device_id option_ids[] = {
+ { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
+@@ -323,7 +305,6 @@
+ { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_GT) },
+ { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_EX) },
+ { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_MODEM) },
+- { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GTM380_MODEM) },
+ { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_Q101) },
+ { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_Q111) },
+ { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GLX) },
+@@ -414,37 +395,31 @@
+ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU870D) }, /* Novatel EU850D/EU860D/EU870D */
+ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC950D) }, /* Novatel MC930D/MC950D */
+ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC727) }, /* Novatel MC727/U727/USB727 */
+- { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U727) }, /* Novatel MC727/U727/USB727 */
+- { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_FULLSPEED) }, /* Novatel EVDO product */
+- { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_FULLSPEED) }, /* Novatel HSPA product */
+- { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED) }, /* Novatel EVDO Embedded product */
+- { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED) }, /* Novatel HSPA Embedded product */
+- { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_HIGHSPEED) }, /* Novatel EVDO product */
+- { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED) }, /* Novatel HSPA product */
+- { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_HIGHSPEED) }, /* Novatel EVDO Embedded product */
+- { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_HIGHSPEED) }, /* Novatel HSPA Embedded product */
+- { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_GLOBAL) }, /* Novatel Global product */
++ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_1) }, /* Novatel EVDO product */
++ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_1) }, /* Novatel HSPA product */
++ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EMBEDDED_1) }, /* Novatel Embedded product */
++ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_GLOBAL_1) }, /* Novatel Global product */
++ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_2) }, /* Novatel EVDO product */
++ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_2) }, /* Novatel HSPA product */
++ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EMBEDDED_2) }, /* Novatel Embedded product */
++ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_GLOBAL_2) }, /* Novatel Global product */
+
+ { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01) },
+ { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01A) },
+ { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H02) },
+
+- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite EV620 CDMA/EV-DO */
+- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5500_MINICARD) }, /* Dell Wireless 5500 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
+- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5505_MINICARD) }, /* Dell Wireless 5505 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
+- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_EXPRESSCARD) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO ExpressCard == Novatel Merlin XV620 CDMA/EV-DO */
+- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5510_EXPRESSCARD) }, /* Dell Wireless 5510 Mobile Broadband HSDPA ExpressCard == Novatel Merlin XU870 HSDPA/3G */
+- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD_SPRINT) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite E720 CDMA/EV-DO */
+- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD_TELUS) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite ET620 CDMA/EV-DO */
+- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_VZW) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
+- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_SPRINT) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
+- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_TELUS) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
+- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_CINGULAR) }, /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */
+- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_L) }, /* Dell Wireless HSDPA 5520 */
+- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_I) }, /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */
+- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_SPRINT) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
+- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_TELUS) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
+- { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_VZW) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
++ { USB_DEVICE(DELL_VENDOR_ID, 0x8114) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite EV620 CDMA/EV-DO */
++ { USB_DEVICE(DELL_VENDOR_ID, 0x8115) }, /* Dell Wireless 5500 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
++ { USB_DEVICE(DELL_VENDOR_ID, 0x8116) }, /* Dell Wireless 5505 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
++ { USB_DEVICE(DELL_VENDOR_ID, 0x8117) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO ExpressCard == Novatel Merlin XV620 CDMA/EV-DO */
++ { USB_DEVICE(DELL_VENDOR_ID, 0x8118) }, /* Dell Wireless 5510 Mobile Broadband HSDPA ExpressCard == Novatel Merlin XU870 HSDPA/3G */
++ { USB_DEVICE(DELL_VENDOR_ID, 0x8128) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite E720 CDMA/EV-DO */
++ { USB_DEVICE(DELL_VENDOR_ID, 0x8129) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite ET620 CDMA/EV-DO */
++ { USB_DEVICE(DELL_VENDOR_ID, 0x8133) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
++ { USB_DEVICE(DELL_VENDOR_ID, 0x8136) }, /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */
++ { USB_DEVICE(DELL_VENDOR_ID, 0x8137) }, /* Dell Wireless HSDPA 5520 */
++ { USB_DEVICE(DELL_VENDOR_ID, 0x8138) }, /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */
++ { USB_DEVICE(DELL_VENDOR_ID, 0x8147) }, /* Dell Wireless 5530 Mobile Broadband (3G HSPA) Mini-Card */
+ { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, /* ADU-E100, ADU-310 */
+ { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
+ { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) },
+@@ -509,12 +484,13 @@
+ { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
+ { USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */
+ { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) },
+- { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622) },
+ { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF626) },
+ { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF628) },
+ { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH) },
+- { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) },
+- { USB_DEVICE(0x1da5, 0x4515) }, /* BenQ H20 */
++ { USB_DEVICE(ERICSSON_VENDOR_ID, ERICSSON_PRODUCT_F3507G) },
++ { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_PC5740) },
++ { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_PC5750) },
++ { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_UM150) },
+ { } /* Terminating entry */
+ };
+ MODULE_DEVICE_TABLE(usb, option_ids);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/serial/ti_usb_3410_5052.c linux-2.6.29-rc3.owrt/drivers/usb/serial/ti_usb_3410_5052.c
+--- linux-2.6.29.owrt/drivers/usb/serial/ti_usb_3410_5052.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/serial/ti_usb_3410_5052.c 2009-05-10 23:48:29.000000000 +0200
+@@ -176,7 +176,7 @@
+ /* the array dimension is the number of default entries plus */
+ /* TI_EXTRA_VID_PID_COUNT user defined entries plus 1 terminating */
+ /* null entry */
+-static struct usb_device_id ti_id_table_3410[10+TI_EXTRA_VID_PID_COUNT+1] = {
++static struct usb_device_id ti_id_table_3410[7+TI_EXTRA_VID_PID_COUNT+1] = {
+ { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) },
+ { USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) },
+ { USB_DEVICE(MTS_VENDOR_ID, MTS_GSM_NO_FW_PRODUCT_ID) },
+@@ -185,11 +185,9 @@
+ { USB_DEVICE(MTS_VENDOR_ID, MTS_GSM_PRODUCT_ID) },
+ { USB_DEVICE(MTS_VENDOR_ID, MTS_EDGE_PRODUCT_ID) },
+ { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) },
+- { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) },
+- { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) },
+ };
+
+-static struct usb_device_id ti_id_table_5052[5+TI_EXTRA_VID_PID_COUNT+1] = {
++static struct usb_device_id ti_id_table_5052[4+TI_EXTRA_VID_PID_COUNT+1] = {
+ { USB_DEVICE(TI_VENDOR_ID, TI_5052_BOOT_PRODUCT_ID) },
+ { USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) },
+ { USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) },
+@@ -197,7 +195,7 @@
+ { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) },
+ };
+
+-static struct usb_device_id ti_id_table_combined[14+2*TI_EXTRA_VID_PID_COUNT+1] = {
++static struct usb_device_id ti_id_table_combined[6+2*TI_EXTRA_VID_PID_COUNT+1] = {
+ { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) },
+ { USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) },
+ { USB_DEVICE(MTS_VENDOR_ID, MTS_GSM_NO_FW_PRODUCT_ID) },
+@@ -210,8 +208,6 @@
+ { USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) },
+ { USB_DEVICE(TI_VENDOR_ID, TI_5052_FIRMWARE_PRODUCT_ID) },
+ { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) },
+- { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) },
+- { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) },
+ { }
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/serial/ti_usb_3410_5052.h linux-2.6.29-rc3.owrt/drivers/usb/serial/ti_usb_3410_5052.h
+--- linux-2.6.29.owrt/drivers/usb/serial/ti_usb_3410_5052.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/serial/ti_usb_3410_5052.h 2009-05-10 23:48:29.000000000 +0200
+@@ -30,8 +30,6 @@
+ #define IBM_VENDOR_ID 0x04b3
+ #define TI_3410_PRODUCT_ID 0x3410
+ #define IBM_4543_PRODUCT_ID 0x4543
+-#define IBM_454B_PRODUCT_ID 0x454b
+-#define IBM_454C_PRODUCT_ID 0x454c
+ #define TI_3410_EZ430_ID 0xF430 /* TI ez430 development tool */
+ #define TI_5052_BOOT_PRODUCT_ID 0x5052 /* no EEPROM, no firmware */
+ #define TI_5152_BOOT_PRODUCT_ID 0x5152 /* no EEPROM, no firmware */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/storage/scsiglue.c linux-2.6.29-rc3.owrt/drivers/usb/storage/scsiglue.c
+--- linux-2.6.29.owrt/drivers/usb/storage/scsiglue.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/storage/scsiglue.c 2009-05-10 23:48:29.000000000 +0200
+@@ -64,7 +64,6 @@
+ */
+ #define VENDOR_ID_NOKIA 0x0421
+ #define VENDOR_ID_NIKON 0x04b0
+-#define VENDOR_ID_PENTAX 0x0a17
+ #define VENDOR_ID_MOTOROLA 0x22b8
+
+ /***********************************************************************
+@@ -159,7 +158,6 @@
+ switch (le16_to_cpu(us->pusb_dev->descriptor.idVendor)) {
+ case VENDOR_ID_NOKIA:
+ case VENDOR_ID_NIKON:
+- case VENDOR_ID_PENTAX:
+ case VENDOR_ID_MOTOROLA:
+ if (!(us->fflags & (US_FL_FIX_CAPACITY |
+ US_FL_CAPACITY_OK)))
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/storage/transport.c linux-2.6.29-rc3.owrt/drivers/usb/storage/transport.c
+--- linux-2.6.29.owrt/drivers/usb/storage/transport.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/storage/transport.c 2009-05-10 23:48:29.000000000 +0200
+@@ -558,10 +558,32 @@
+
+ if (srb->result == SAM_STAT_GOOD && scsi_get_resid(srb) == 0) {
+
+- /* The command succeeded. We know this device doesn't
+- * have the last-sector bug, so stop checking it.
++ /* The command succeeded. If the capacity is odd
++ * (i.e., if the sector number is even) then the
++ * "always-even" heuristic would be wrong for this
++ * device. Issue a WARN() so that the kerneloops.org
++ * project will be notified and we will then know to
++ * mark the device with a CAPACITY_OK flag. Hopefully
++ * this will occur for only a few devices.
++ *
++ * Use the sign of us->last_sector_hacks to tell whether
++ * the warning has already been issued; we don't need
++ * more than one warning per device.
+ */
+- us->use_last_sector_hacks = 0;
++ if (!(sector & 1) && us->use_last_sector_hacks > 0) {
++ unsigned vid = le16_to_cpu(
++ us->pusb_dev->descriptor.idVendor);
++ unsigned pid = le16_to_cpu(
++ us->pusb_dev->descriptor.idProduct);
++ unsigned rev = le16_to_cpu(
++ us->pusb_dev->descriptor.bcdDevice);
++
++ WARN(1, "%s: Successful last sector success at %u, "
++ "device %04x:%04x:%04x\n",
++ sdkp->disk->disk_name, sector,
++ vid, pid, rev);
++ us->use_last_sector_hacks = -1;
++ }
+
+ } else {
+ /* The command failed. Allow up to 3 retries in case this
+@@ -577,6 +599,14 @@
+ srb->result = SAM_STAT_CHECK_CONDITION;
+ memcpy(srb->sense_buffer, record_not_found,
+ sizeof(record_not_found));
++
++ /* In theory we might want to issue a WARN() here if the
++ * capacity is even, since it could indicate the device
++ * has the READ CAPACITY bug _and_ the real capacity is
++ * odd. But it could also indicate that the device
++ * simply can't access its last sector, a failure mode
++ * which is surprisingly common. So no warning.
++ */
+ }
+
+ done:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/storage/unusual_devs.h linux-2.6.29-rc3.owrt/drivers/usb/storage/unusual_devs.h
+--- linux-2.6.29.owrt/drivers/usb/storage/unusual_devs.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/storage/unusual_devs.h 2009-05-10 23:48:29.000000000 +0200
+@@ -226,7 +226,7 @@
+ US_FL_MAX_SECTORS_64 ),
+
+ /* Reported by Manuel Osdoba <manuel.osdoba@tu-ilmenau.de> */
+-UNUSUAL_DEV( 0x0421, 0x0492, 0x0452, 0x9999,
++UNUSUAL_DEV( 0x0421, 0x0492, 0x0452, 0x0452,
+ "Nokia",
+ "Nokia 6233",
+ US_SC_DEVICE, US_PR_DEVICE, NULL,
+@@ -907,13 +907,13 @@
+ "Genesys Logic",
+ "USB to IDE Optical",
+ US_SC_DEVICE, US_PR_DEVICE, NULL,
+- US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 | US_FL_IGNORE_RESIDUE ),
++ US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 ),
+
+ UNUSUAL_DEV( 0x05e3, 0x0702, 0x0000, 0xffff,
+ "Genesys Logic",
+ "USB to IDE Disk",
+ US_SC_DEVICE, US_PR_DEVICE, NULL,
+- US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 | US_FL_IGNORE_RESIDUE ),
++ US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 ),
+
+ /* Reported by Ben Efros <ben@pc-doctor.com> */
+ UNUSUAL_DEV( 0x05e3, 0x0723, 0x9451, 0x9451,
+@@ -951,9 +951,7 @@
+ US_FL_FIX_CAPACITY ),
+
+ /* Reported by Richard -=[]=- <micro_flyer@hotmail.com> */
+-/* Change to bcdDeviceMin (0x0100 to 0x0001) reported by
+- * Thomas Bartosik <tbartdev@gmx-topmail.de> */
+-UNUSUAL_DEV( 0x067b, 0x2507, 0x0001, 0x0100,
++UNUSUAL_DEV( 0x067b, 0x2507, 0x0100, 0x0100,
+ "Prolific Technology Inc.",
+ "Mass Storage Device",
+ US_SC_DEVICE, US_PR_DEVICE, NULL,
+@@ -1216,7 +1214,7 @@
+ "Datafab",
+ "KECF-USB",
+ US_SC_DEVICE, US_PR_DEVICE, NULL,
+- US_FL_FIX_INQUIRY | US_FL_FIX_CAPACITY ),
++ US_FL_FIX_INQUIRY ),
+
+ /* Reported by Rauch Wolke <rauchwolke@gmx.net> */
+ UNUSUAL_DEV( 0x07c4, 0xa4a5, 0x0000, 0xffff,
+@@ -1356,6 +1354,21 @@
+ US_SC_DEVICE, US_PR_DEVICE, NULL,
+ US_FL_FIX_INQUIRY ),
+
++
++/* Submitted by Per Winkvist <per.winkvist@uk.com> */
++UNUSUAL_DEV( 0x0a17, 0x006, 0x0000, 0xffff,
++ "Pentax",
++ "Optio S/S4",
++ US_SC_DEVICE, US_PR_DEVICE, NULL,
++ US_FL_FIX_INQUIRY ),
++
++/* Reported by Jaak Ristioja <Ristioja@gmail.com> */
++UNUSUAL_DEV( 0x0a17, 0x006e, 0x0100, 0x0100,
++ "Pentax",
++ "K10D",
++ US_SC_DEVICE, US_PR_DEVICE, NULL,
++ US_FL_FIX_CAPACITY ),
++
+ /* These are virtual windows driver CDs, which the zd1211rw driver
+ * automatically converts into WLAN devices. */
+ UNUSUAL_DEV( 0x0ace, 0x2011, 0x0101, 0x0101,
+@@ -1392,16 +1405,6 @@
+ US_SC_DEVICE, US_PR_DEVICE, NULL,
+ 0 ),
+
+-/* Reported by Jan Dumon <j.dumon@option.com>
+- * This device (wrongly) has a vendor-specific device descriptor.
+- * The entry is needed so usb-storage can bind to it's mass-storage
+- * interface as an interface driver */
+-UNUSUAL_DEV( 0x0af0, 0x7501, 0x0000, 0x0000,
+- "Option",
+- "GI 0431 SD-Card",
+- US_SC_DEVICE, US_PR_DEVICE, NULL,
+- 0 ),
+-
+ /* Reported by Ben Efros <ben@pc-doctor.com> */
+ UNUSUAL_DEV( 0x0bc2, 0x3010, 0x0000, 0x0000,
+ "Seagate",
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/wusbcore/devconnect.c linux-2.6.29-rc3.owrt/drivers/usb/wusbcore/devconnect.c
+--- linux-2.6.29.owrt/drivers/usb/wusbcore/devconnect.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/wusbcore/devconnect.c 2009-05-10 23:48:29.000000000 +0200
+@@ -386,7 +386,6 @@
+ | USB_PORT_STAT_LOW_SPEED | USB_PORT_STAT_HIGH_SPEED);
+ port->change |= USB_PORT_STAT_C_CONNECTION | USB_PORT_STAT_C_ENABLE;
+ if (wusb_dev) {
+- dev_dbg(wusbhc->dev, "disconnecting device from port %d\n", wusb_dev->port_idx);
+ if (!list_empty(&wusb_dev->cack_node))
+ list_del_init(&wusb_dev->cack_node);
+ /* For the one in cack_add() */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/wusbcore/rh.c linux-2.6.29-rc3.owrt/drivers/usb/wusbcore/rh.c
+--- linux-2.6.29.owrt/drivers/usb/wusbcore/rh.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/wusbcore/rh.c 2009-05-10 23:48:29.000000000 +0200
+@@ -100,9 +100,6 @@
+ struct wusb_port *port = wusb_port_by_idx(wusbhc, port_idx);
+ struct wusb_dev *wusb_dev = port->wusb_dev;
+
+- if (wusb_dev == NULL)
+- return -ENOTCONN;
+-
+ port->status |= USB_PORT_STAT_RESET;
+ port->change |= USB_PORT_STAT_C_RESET;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/usb/wusbcore/wa-xfer.c linux-2.6.29-rc3.owrt/drivers/usb/wusbcore/wa-xfer.c
+--- linux-2.6.29.owrt/drivers/usb/wusbcore/wa-xfer.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/usb/wusbcore/wa-xfer.c 2009-05-10 23:48:29.000000000 +0200
+@@ -921,10 +921,8 @@
+ result = -ENODEV;
+ /* FIXME: segmentation broken -- kills DWA */
+ mutex_lock(&wusbhc->mutex); /* get a WUSB dev */
+- if (urb->dev == NULL) {
+- mutex_unlock(&wusbhc->mutex);
++ if (urb->dev == NULL)
+ goto error_dev_gone;
+- }
+ wusb_dev = __wusb_dev_get_by_usb_dev(wusbhc, urb->dev);
+ if (wusb_dev == NULL) {
+ mutex_unlock(&wusbhc->mutex);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/uwb/allocator.c linux-2.6.29-rc3.owrt/drivers/uwb/allocator.c
+--- linux-2.6.29.owrt/drivers/uwb/allocator.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/uwb/allocator.c 2009-05-10 23:48:29.000000000 +0200
+@@ -15,6 +15,7 @@
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
++#include <linux/version.h>
+ #include <linux/kernel.h>
+ #include <linux/uwb.h>
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/uwb/drp.c linux-2.6.29-rc3.owrt/drivers/uwb/drp.c
+--- linux-2.6.29.owrt/drivers/uwb/drp.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/uwb/drp.c 2009-05-10 23:48:29.000000000 +0200
+@@ -66,14 +66,14 @@
+ } else
+ dev_err(&rc->uwb_dev.dev, "SET-DRP-IE: timeout\n");
+
+- spin_lock_bh(&rc->rsvs_lock);
++ spin_lock(&rc->rsvs_lock);
+ if (rc->set_drp_ie_pending > 1) {
+ rc->set_drp_ie_pending = 0;
+ uwb_rsv_queue_update(rc);
+ } else {
+ rc->set_drp_ie_pending = 0;
+ }
+- spin_unlock_bh(&rc->rsvs_lock);
++ spin_unlock(&rc->rsvs_lock);
+ }
+
+ /**
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/uwb/rsv.c linux-2.6.29-rc3.owrt/drivers/uwb/rsv.c
+--- linux-2.6.29.owrt/drivers/uwb/rsv.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/uwb/rsv.c 2009-05-10 23:48:29.000000000 +0200
+@@ -114,8 +114,7 @@
+ devaddr = rsv->target.devaddr;
+ uwb_dev_addr_print(target, sizeof(target), &devaddr);
+
+- dev_dbg(dev, "rsv %s %s -> %s: %s\n",
+- text, owner, target, uwb_rsv_state_str(rsv->state));
++ dev_dbg(dev, "rsv %s -> %s: %s\n", owner, target, uwb_rsv_state_str(rsv->state));
+ }
+
+ static void uwb_rsv_release(struct kref *kref)
+@@ -512,7 +511,8 @@
+
+ if (uwb_rsv_is_owner(rsv))
+ uwb_rsv_put_stream(rsv);
+-
++
++ del_timer_sync(&rsv->timer);
+ uwb_dev_put(rsv->owner);
+ if (rsv->target.type == UWB_RSV_TARGET_DEV)
+ uwb_dev_put(rsv->target.dev);
+@@ -870,7 +870,7 @@
+ */
+ void uwb_rsv_sched_update(struct uwb_rc *rc)
+ {
+- spin_lock_bh(&rc->rsvs_lock);
++ spin_lock(&rc->rsvs_lock);
+ if (!delayed_work_pending(&rc->rsv_update_work)) {
+ if (rc->set_drp_ie_pending > 0) {
+ rc->set_drp_ie_pending++;
+@@ -879,7 +879,7 @@
+ uwb_rsv_queue_update(rc);
+ }
+ unlock:
+- spin_unlock_bh(&rc->rsvs_lock);
++ spin_unlock(&rc->rsvs_lock);
+ }
+
+ /*
+@@ -943,22 +943,13 @@
+
+ mutex_lock(&rc->rsvs_mutex);
+ list_for_each_entry_safe(rsv, t, &rc->reservations, rc_node) {
+- if (rsv->state != UWB_RSV_STATE_NONE)
+- uwb_rsv_set_state(rsv, UWB_RSV_STATE_NONE);
+- del_timer_sync(&rsv->timer);
++ uwb_rsv_remove(rsv);
+ }
+ /* Cancel any postponed update. */
+ rc->set_drp_ie_pending = 0;
+ mutex_unlock(&rc->rsvs_mutex);
+
+ cancel_delayed_work_sync(&rc->rsv_update_work);
+- flush_workqueue(rc->rsv_workq);
+-
+- mutex_lock(&rc->rsvs_mutex);
+- list_for_each_entry_safe(rsv, t, &rc->reservations, rc_node) {
+- uwb_rsv_remove(rsv);
+- }
+- mutex_unlock(&rc->rsvs_mutex);
+ }
+
+ void uwb_rsv_init(struct uwb_rc *rc)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/video/atafb.c linux-2.6.29-rc3.owrt/drivers/video/atafb.c
+--- linux-2.6.29.owrt/drivers/video/atafb.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/video/atafb.c 2009-05-10 23:48:29.000000000 +0200
+@@ -841,7 +841,7 @@
+ tt_dmasnd.ctrl = DMASND_CTRL_OFF;
+ udelay(20); /* wait a while for things to settle down */
+ }
+- mono_moni = (st_mfp.par_dt_reg & 0x80) == 0;
++ mono_moni = (mfp.par_dt_reg & 0x80) == 0;
+
+ tt_get_par(&par);
+ tt_encode_var(&atafb_predefined[0], &par);
+@@ -2035,7 +2035,7 @@
+ tt_dmasnd.ctrl = DMASND_CTRL_OFF;
+ udelay(20); /* wait a while for things to settle down */
+ }
+- mono_moni = (st_mfp.par_dt_reg & 0x80) == 0;
++ mono_moni = (mfp.par_dt_reg & 0x80) == 0;
+
+ stste_get_par(&par);
+ stste_encode_var(&atafb_predefined[0], &par);
+@@ -2086,20 +2086,20 @@
+ return;
+ local_irq_save(flags);
+
+- st_mfp.tim_ct_b = 0x10;
+- st_mfp.active_edge |= 8;
+- st_mfp.tim_ct_b = 0;
+- st_mfp.tim_dt_b = 0xf0;
+- st_mfp.tim_ct_b = 8;
+- while (st_mfp.tim_dt_b > 1) /* TOS does it this way, don't ask why */
++ mfp.tim_ct_b = 0x10;
++ mfp.active_edge |= 8;
++ mfp.tim_ct_b = 0;
++ mfp.tim_dt_b = 0xf0;
++ mfp.tim_ct_b = 8;
++ while (mfp.tim_dt_b > 1) /* TOS does it this way, don't ask why */
+ ;
+- new = st_mfp.tim_dt_b;
++ new = mfp.tim_dt_b;
+ do {
+ udelay(LINE_DELAY);
+ old = new;
+- new = st_mfp.tim_dt_b;
++ new = mfp.tim_dt_b;
+ } while (old != new);
+- st_mfp.tim_ct_b = 0x10;
++ mfp.tim_ct_b = 0x10;
+ udelay(SYNC_DELAY);
+
+ if (atari_switches & ATARI_SWITCH_OVSC_IKBD)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/video/aty/aty128fb.c linux-2.6.29-rc3.owrt/drivers/video/aty/aty128fb.c
+--- linux-2.6.29.owrt/drivers/video/aty/aty128fb.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/video/aty/aty128fb.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1475,7 +1475,7 @@
+ aty128_set_pll(&par->pll, par);
+ aty128_set_fifo(&par->fifo_reg, par);
+
+- config = aty_ld_le32(CNFG_CNTL) & ~3;
++ config = aty_ld_le32(CONFIG_CNTL) & ~3;
+
+ #if defined(__BIG_ENDIAN)
+ if (par->crtc.bpp == 32)
+@@ -1484,7 +1484,7 @@
+ config |= 1; /* make aperture do 16 bit swapping */
+ #endif
+
+- aty_st_le32(CNFG_CNTL, config);
++ aty_st_le32(CONFIG_CNTL, config);
+ aty_st_8(CRTC_EXT_CNTL + 1, 0); /* turn the video back on */
+
+ info->fix.line_length = (par->crtc.vxres * par->crtc.bpp) >> 3;
+@@ -1853,14 +1853,13 @@
+ * Initialisation
+ */
+
+-#ifdef CONFIG_PPC_PMAC__disabled
++#ifdef CONFIG_PPC_PMAC
+ static void aty128_early_resume(void *data)
+ {
+ struct aty128fb_par *par = data;
+
+ if (try_acquire_console_sem())
+ return;
+- pci_restore_state(par->pdev);
+ aty128_do_resume(par->pdev);
+ release_console_sem();
+ }
+@@ -1876,7 +1875,7 @@
+ u32 dac;
+
+ /* Get the chip revision */
+- chip_rev = (aty_ld_le32(CNFG_CNTL) >> 16) & 0x1F;
++ chip_rev = (aty_ld_le32(CONFIG_CNTL) >> 16) & 0x1F;
+
+ strcpy(video_card, "Rage128 XX ");
+ video_card[8] = ent->device >> 8;
+@@ -1908,14 +1907,7 @@
+ /* Indicate sleep capability */
+ if (par->chip_gen == rage_M3) {
+ pmac_call_feature(PMAC_FTR_DEVICE_CAN_WAKE, NULL, 0, 1);
+-#if 0 /* Disable the early video resume hack for now as it's causing problems, among
+- * others we now rely on the PCI core restoring the config space for us, which
+- * isn't the case with that hack, and that code path causes various things to
+- * be called with interrupts off while they shouldn't. I'm leaving the code in
+- * as it can be useful for debugging purposes
+- */
+ pmac_set_early_video_resume(aty128_early_resume, par);
+-#endif
+ }
+
+ /* Find default mode */
+@@ -2065,7 +2057,7 @@
+
+ /* Grab memory size from the card */
+ // How does this relate to the resource length from the PCI hardware?
+- par->vram_size = aty_ld_le32(CNFG_MEMSIZE) & 0x03FFFFFF;
++ par->vram_size = aty_ld_le32(CONFIG_MEMSIZE) & 0x03FFFFFF;
+
+ /* Virtualize the framebuffer */
+ info->screen_base = ioremap(fb_addr, par->vram_size);
+@@ -2373,6 +2365,7 @@
+ static void aty128_set_suspend(struct aty128fb_par *par, int suspend)
+ {
+ u32 pmgt;
++ u16 pwr_command;
+ struct pci_dev *pdev = par->pdev;
+
+ if (!par->pm_reg)
+@@ -2381,8 +2374,6 @@
+ /* Set the chip into the appropriate suspend mode (we use D2,
+ * D3 would require a complete re-initialisation of the chip,
+ * including PCI config registers, clocks, AGP configuration, ...)
+- *
+- * For resume, the core will have already brought us back to D0
+ */
+ if (suspend) {
+ /* Make sure CRTC2 is reset. Remove that the day we decide to
+@@ -2400,9 +2391,17 @@
+ aty_st_le32(BUS_CNTL1, 0x00000010);
+ aty_st_le32(MEM_POWER_MISC, 0x0c830000);
+ mdelay(100);
+-
++ pci_read_config_word(pdev, par->pm_reg+PCI_PM_CTRL, &pwr_command);
+ /* Switch PCI power management to D2 */
+- pci_set_power_state(pdev, PCI_D2);
++ pci_write_config_word(pdev, par->pm_reg+PCI_PM_CTRL,
++ (pwr_command & ~PCI_PM_CTRL_STATE_MASK) | 2);
++ pci_read_config_word(pdev, par->pm_reg+PCI_PM_CTRL, &pwr_command);
++ } else {
++ /* Switch back PCI power management to D0 */
++ mdelay(100);
++ pci_write_config_word(pdev, par->pm_reg+PCI_PM_CTRL, 0);
++ pci_read_config_word(pdev, par->pm_reg+PCI_PM_CTRL, &pwr_command);
++ mdelay(100);
+ }
+ }
+
+@@ -2411,12 +2410,6 @@
+ struct fb_info *info = pci_get_drvdata(pdev);
+ struct aty128fb_par *par = info->par;
+
+- /* Because we may change PCI D state ourselves, we need to
+- * first save the config space content so the core can
+- * restore it properly on resume.
+- */
+- pci_save_state(pdev);
+-
+ /* We don't do anything but D2, for now we return 0, but
+ * we may want to change that. How do we know if the BIOS
+ * can properly take care of D3 ? Also, with swsusp, we
+@@ -2483,11 +2476,6 @@
+ if (pdev->dev.power.power_state.event == PM_EVENT_ON)
+ return 0;
+
+- /* PCI state will have been restored by the core, so
+- * we should be in D0 now with our config space fully
+- * restored
+- */
+-
+ /* Wakeup chip */
+ aty128_set_suspend(par, 0);
+ par->asleep = 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/video/aty/atyfb_base.c linux-2.6.29-rc3.owrt/drivers/video/aty/atyfb_base.c
+--- linux-2.6.29.owrt/drivers/video/aty/atyfb_base.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/video/aty/atyfb_base.c 2009-05-10 23:48:29.000000000 +0200
+@@ -135,7 +135,7 @@
+ #if defined(CONFIG_PM) || defined(CONFIG_PMAC_BACKLIGHT) || \
+ defined (CONFIG_FB_ATY_GENERIC_LCD) || defined(CONFIG_FB_ATY_BACKLIGHT)
+ static const u32 lt_lcd_regs[] = {
+- CNFG_PANEL_LG,
++ CONFIG_PANEL_LG,
+ LCD_GEN_CNTL_LG,
+ DSTN_CONTROL_LG,
+ HFB_PITCH_ADDR_LG,
+@@ -446,7 +446,7 @@
+ par->pll_limits.ecp_max = aty_chips[i].ecp_max;
+ par->features = aty_chips[i].features;
+
+- chip_id = aty_ld_le32(CNFG_CHIP_ID, par);
++ chip_id = aty_ld_le32(CONFIG_CHIP_ID, par);
+ type = chip_id & CFG_CHIP_TYPE;
+ rev = (chip_id & CFG_CHIP_REV) >> 24;
+
+@@ -629,7 +629,7 @@
+ crtc->lcd_index = aty_ld_le32(LCD_INDEX, par);
+ aty_st_le32(LCD_INDEX, crtc->lcd_index, par);
+ }
+- crtc->lcd_config_panel = aty_ld_lcd(CNFG_PANEL, par);
++ crtc->lcd_config_panel = aty_ld_lcd(CONFIG_PANEL, par);
+ crtc->lcd_gen_cntl = aty_ld_lcd(LCD_GEN_CNTL, par);
+
+
+@@ -676,7 +676,7 @@
+ aty_st_le32(CRTC_GEN_CNTL, crtc->gen_cntl & ~(CRTC_EXT_DISP_EN | CRTC_EN), par);
+
+ /* update non-shadow registers first */
+- aty_st_lcd(CNFG_PANEL, crtc->lcd_config_panel, par);
++ aty_st_lcd(CONFIG_PANEL, crtc->lcd_config_panel, par);
+ aty_st_lcd(LCD_GEN_CNTL, crtc->lcd_gen_cntl &
+ ~(CRTC_RW_SELECT | SHADOW_EN | SHADOW_RW_EN), par);
+
+@@ -858,7 +858,7 @@
+ if (!M64_HAS(MOBIL_BUS))
+ crtc->lcd_index |= CRTC2_DISPLAY_DIS;
+
+- crtc->lcd_config_panel = aty_ld_lcd(CNFG_PANEL, par) | 0x4000;
++ crtc->lcd_config_panel = aty_ld_lcd(CONFIG_PANEL, par) | 0x4000;
+ crtc->lcd_gen_cntl = aty_ld_lcd(LCD_GEN_CNTL, par) & ~CRTC_RW_SELECT;
+
+ crtc->lcd_gen_cntl &=
+@@ -1978,7 +1978,7 @@
+
+ return timeout ? 0 : -EIO;
+ }
+-#endif /* CONFIG_PPC_PMAC */
++#endif
+
+ static int atyfb_pci_suspend(struct pci_dev *pdev, pm_message_t state)
+ {
+@@ -2002,15 +2002,9 @@
+ par->asleep = 1;
+ par->lock_blank = 1;
+
+- /* Because we may change PCI D state ourselves, we need to
+- * first save the config space content so the core can
+- * restore it properly on resume.
+- */
+- pci_save_state(pdev);
+-
+ #ifdef CONFIG_PPC_PMAC
+ /* Set chip to "suspend" mode */
+- if (machine_is(powermac) && aty_power_mgmt(1, par)) {
++ if (aty_power_mgmt(1, par)) {
+ par->asleep = 0;
+ par->lock_blank = 0;
+ atyfb_blank(FB_BLANK_UNBLANK, info);
+@@ -2053,15 +2047,11 @@
+
+ acquire_console_sem();
+
+- /* PCI state will have been restored by the core, so
+- * we should be in D0 now with our config space fully
+- * restored
+- */
+-
+ #ifdef CONFIG_PPC_PMAC
+- if (machine_is(powermac) &&
+- pdev->dev.power.power_state.event == PM_EVENT_SUSPEND)
++ if (pdev->dev.power.power_state.event == 2)
+ aty_power_mgmt(0, par);
++#else
++ pci_set_power_state(pdev, PCI_D0);
+ #endif
+
+ aty_resume_chip(info);
+@@ -2264,7 +2254,7 @@
+ if (!M64_HAS(INTEGRATED)) {
+ u32 stat0;
+ u8 dac_type, dac_subtype, clk_type;
+- stat0 = aty_ld_le32(CNFG_STAT0, par);
++ stat0 = aty_ld_le32(CONFIG_STAT0, par);
+ par->bus_type = (stat0 >> 0) & 0x07;
+ par->ram_type = (stat0 >> 3) & 0x07;
+ ramname = aty_gx_ram[par->ram_type];
+@@ -2334,7 +2324,7 @@
+ par->dac_ops = &aty_dac_ct;
+ par->pll_ops = &aty_pll_ct;
+ par->bus_type = PCI;
+- par->ram_type = (aty_ld_le32(CNFG_STAT0, par) & 0x07);
++ par->ram_type = (aty_ld_le32(CONFIG_STAT0, par) & 0x07);
+ ramname = aty_ct_ram[par->ram_type];
+ /* for many chips, the mclk is 67 MHz for SDRAM, 63 MHz otherwise */
+ if (par->pll_limits.mclk == 67 && par->ram_type < SDRAM)
+@@ -2443,7 +2433,7 @@
+ }
+
+ if (M64_HAS(MAGIC_VRAM_SIZE)) {
+- if (aty_ld_le32(CNFG_STAT1, par) & 0x40000000)
++ if (aty_ld_le32(CONFIG_STAT1, par) & 0x40000000)
+ info->fix.smem_len += 0x400000;
+ }
+
+@@ -2956,7 +2946,7 @@
+ * Fix PROMs idea of MEM_CNTL settings...
+ */
+ mem = aty_ld_le32(MEM_CNTL, par);
+- chip_id = aty_ld_le32(CNFG_CHIP_ID, par);
++ chip_id = aty_ld_le32(CONFIG_CHIP_ID, par);
+ if (((chip_id & CFG_CHIP_TYPE) == VT_CHIP_ID) && !((chip_id >> 24) & 1)) {
+ switch (mem & 0x0f) {
+ case 3:
+@@ -2974,7 +2964,7 @@
+ default:
+ break;
+ }
+- if ((aty_ld_le32(CNFG_STAT0, par) & 7) >= SDRAM)
++ if ((aty_ld_le32(CONFIG_STAT0, par) & 7) >= SDRAM)
+ mem &= ~(0x00700000);
+ }
+ mem &= ~(0xcf80e000); /* Turn off all undocumented bits. */
+@@ -3582,7 +3572,7 @@
+ }
+
+ /* Fake pci_id for correct_chipset() */
+- switch (aty_ld_le32(CNFG_CHIP_ID, par) & CFG_CHIP_TYPE) {
++ switch (aty_ld_le32(CONFIG_CHIP_ID, par) & CFG_CHIP_TYPE) {
+ case 0x00d7:
+ par->pci_id = PCI_CHIP_MACH64GX;
+ break;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/video/aty/mach64_ct.c linux-2.6.29-rc3.owrt/drivers/video/aty/mach64_ct.c
+--- linux-2.6.29.owrt/drivers/video/aty/mach64_ct.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/video/aty/mach64_ct.c 2009-05-10 23:48:29.000000000 +0200
+@@ -8,9 +8,6 @@
+ #include <asm/io.h>
+ #include <video/mach64.h>
+ #include "atyfb.h"
+-#ifdef CONFIG_PPC
+-#include <asm/machdep.h>
+-#endif
+
+ #undef DEBUG
+
+@@ -539,14 +536,6 @@
+ pll->ct.xclk_post_div_real = postdividers[xpost_div];
+ pll->ct.mclk_fb_div = q * pll->ct.xclk_post_div_real / 8;
+
+-#ifdef CONFIG_PPC
+- if (machine_is(powermac)) {
+- /* Override PLL_EXT_CNTL & 0x07. */
+- pll->ct.xclk_post_div = xpost_div;
+- pll->ct.xclk_ref_div = 1;
+- }
+-#endif
+-
+ #ifdef DEBUG
+ pllmclk = (1000000 * pll->ct.mclk_fb_mult * pll->ct.mclk_fb_div) /
+ (par->ref_clk_per * pll->ct.pll_ref_div);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/video/aty/radeon_base.c linux-2.6.29-rc3.owrt/drivers/video/aty/radeon_base.c
+--- linux-2.6.29.owrt/drivers/video/aty/radeon_base.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/video/aty/radeon_base.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1936,8 +1936,8 @@
+ OUTREG(CRTC_GEN_CNTL, save_crtc_gen_cntl | CRTC_DISP_REQ_EN_B);
+ mdelay(100);
+
+- aper_base = INREG(CNFG_APER_0_BASE);
+- aper_size = INREG(CNFG_APER_SIZE);
++ aper_base = INREG(CONFIG_APER_0_BASE);
++ aper_size = INREG(CONFIG_APER_SIZE);
+
+ #ifdef SET_MC_FB_FROM_APERTURE
+ /* Set framebuffer to be at the same address as set in PCI BAR */
+@@ -2024,11 +2024,11 @@
+ ~CRTC_H_CUTOFF_ACTIVE_EN);
+ }
+ } else {
+- tmp = INREG(CNFG_MEMSIZE);
++ tmp = INREG(CONFIG_MEMSIZE);
+ }
+
+ /* mem size is bits [28:0], mask off the rest */
+- rinfo->video_ram = tmp & CNFG_MEMSIZE_MASK;
++ rinfo->video_ram = tmp & CONFIG_MEMSIZE_MASK;
+
+ /*
+ * Hack to get around some busted production M6's
+@@ -2228,7 +2228,7 @@
+ */
+ rinfo->errata = 0;
+ if (rinfo->family == CHIP_FAMILY_R300 &&
+- (INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK)
++ (INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK)
+ == CFG_ATI_REV_A11)
+ rinfo->errata |= CHIP_ERRATA_R300_CG;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/video/aty/radeonfb.h linux-2.6.29-rc3.owrt/drivers/video/aty/radeonfb.h
+--- linux-2.6.29.owrt/drivers/video/aty/radeonfb.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/video/aty/radeonfb.h 2009-05-10 23:48:29.000000000 +0200
+@@ -361,6 +361,8 @@
+ #ifdef CONFIG_FB_RADEON_I2C
+ struct radeon_i2c_chan i2c[4];
+ #endif
++
++ u32 cfg_save[64];
+ };
+
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/video/aty/radeon_pm.c linux-2.6.29-rc3.owrt/drivers/video/aty/radeon_pm.c
+--- linux-2.6.29.owrt/drivers/video/aty/radeon_pm.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/video/aty/radeon_pm.c 2009-05-10 23:48:29.000000000 +0200
+@@ -333,7 +333,7 @@
+ if (!rinfo->has_CRTC2) {
+ tmp = INPLL(pllSCLK_CNTL);
+
+- if ((INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK) > CFG_ATI_REV_A13)
++ if ((INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK) > CFG_ATI_REV_A13)
+ tmp &= ~(SCLK_CNTL__FORCE_CP | SCLK_CNTL__FORCE_RB);
+ tmp &= ~(SCLK_CNTL__FORCE_HDP | SCLK_CNTL__FORCE_DISP1 |
+ SCLK_CNTL__FORCE_TOP | SCLK_CNTL__FORCE_SE |
+@@ -468,9 +468,9 @@
+
+ /*RAGE_6::A11 A12 A12N1 A13, RV250::A11 A12, R300*/
+ if ((rinfo->family == CHIP_FAMILY_RV250 &&
+- ((INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13)) ||
++ ((INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13)) ||
+ ((rinfo->family == CHIP_FAMILY_RV100) &&
+- ((INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK) <= CFG_ATI_REV_A13))) {
++ ((INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK) <= CFG_ATI_REV_A13))) {
+ tmp |= SCLK_CNTL__FORCE_CP;
+ tmp |= SCLK_CNTL__FORCE_VIP;
+ }
+@@ -486,7 +486,7 @@
+ /* RV200::A11 A12 RV250::A11 A12 */
+ if (((rinfo->family == CHIP_FAMILY_RV200) ||
+ (rinfo->family == CHIP_FAMILY_RV250)) &&
+- ((INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13))
++ ((INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13))
+ tmp |= SCLK_MORE_CNTL__FORCEON;
+
+ OUTPLL(pllSCLK_MORE_CNTL, tmp);
+@@ -497,7 +497,7 @@
+ /* RV200::A11 A12, RV250::A11 A12 */
+ if (((rinfo->family == CHIP_FAMILY_RV200) ||
+ (rinfo->family == CHIP_FAMILY_RV250)) &&
+- ((INREG(CNFG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13)) {
++ ((INREG(CONFIG_CNTL) & CFG_ATI_REV_ID_MASK) < CFG_ATI_REV_A13)) {
+ tmp = INPLL(pllPLL_PWRMGT_CNTL);
+ tmp |= PLL_PWRMGT_CNTL__TCL_BYPASS_DISABLE;
+ OUTPLL(pllPLL_PWRMGT_CNTL, tmp);
+@@ -702,7 +702,7 @@
+ OUTREG(DISPLAY_BASE_ADDR, rinfo->save_regs[31]);
+ OUTREG(MC_AGP_LOCATION, rinfo->save_regs[32]);
+ OUTREG(CRTC2_DISPLAY_BASE_ADDR, rinfo->save_regs[33]);
+- OUTREG(CNFG_MEMSIZE, rinfo->video_ram);
++ OUTREG(CONFIG_MEMSIZE, rinfo->video_ram);
+
+ OUTREG(DISP_MISC_CNTL, rinfo->save_regs[9]);
+ OUTREG(DISP_PWR_MAN, rinfo->save_regs[10]);
+@@ -1723,7 +1723,7 @@
+ OUTREG(CRTC2_DISPLAY_BASE_ADDR, rinfo->save_regs[33]);
+ OUTREG(MC_FB_LOCATION, rinfo->save_regs[30]);
+ OUTREG(OV0_BASE_ADDR, rinfo->save_regs[80]);
+- OUTREG(CNFG_MEMSIZE, rinfo->video_ram);
++ OUTREG(CONFIG_MEMSIZE, rinfo->video_ram);
+ OUTREG(BUS_CNTL, rinfo->save_regs[36]);
+ OUTREG(BUS_CNTL1, rinfo->save_regs[14]);
+ OUTREG(MPP_TB_CONFIG, rinfo->save_regs[37]);
+@@ -1961,7 +1961,7 @@
+ OUTMC(rinfo, ixMC_CHP_IO_CNTL_B1, rinfo->save_regs[68] /*0x141555ff*/);
+ OUTMC(rinfo, ixMC_IMP_CNTL_0, rinfo->save_regs[71] /*0x00009249*/);
+ OUTREG(MC_IND_INDEX, 0);
+- OUTREG(CNFG_MEMSIZE, rinfo->video_ram);
++ OUTREG(CONFIG_MEMSIZE, rinfo->video_ram);
+
+ mdelay(20);
+ }
+@@ -2361,7 +2361,7 @@
+ OUTMC(rinfo, ixMC_IMP_CNTL_0, 0x00009249);
+ OUTREG(MC_IND_INDEX, 0);
+
+- OUTREG(CNFG_MEMSIZE, rinfo->video_ram);
++ OUTREG(CONFIG_MEMSIZE, rinfo->video_ram);
+
+ radeon_pm_full_reset_sdram(rinfo);
+
+@@ -2507,28 +2507,11 @@
+
+ #endif /* CONFIG_PPC_OF */
+
+-static void radeonfb_whack_power_state(struct radeonfb_info *rinfo, pci_power_t state)
+-{
+- u16 pwr_cmd;
+-
+- for (;;) {
+- pci_read_config_word(rinfo->pdev,
+- rinfo->pm_reg+PCI_PM_CTRL,
+- &pwr_cmd);
+- if (pwr_cmd & 2)
+- break;
+- pwr_cmd = (pwr_cmd & ~PCI_PM_CTRL_STATE_MASK) | 2;
+- pci_write_config_word(rinfo->pdev,
+- rinfo->pm_reg+PCI_PM_CTRL,
+- pwr_cmd);
+- msleep(500);
+- }
+- rinfo->pdev->current_state = state;
+-}
+-
+ static void radeon_set_suspend(struct radeonfb_info *rinfo, int suspend)
+ {
++ u16 pwr_cmd;
+ u32 tmp;
++ int i;
+
+ if (!rinfo->pm_reg)
+ return;
+@@ -2574,19 +2557,32 @@
+ }
+ }
+
++ for (i = 0; i < 64; ++i)
++ pci_read_config_dword(rinfo->pdev, i * 4,
++ &rinfo->cfg_save[i]);
++
+ /* Switch PCI power management to D2. */
+ pci_disable_device(rinfo->pdev);
+- pci_save_state(rinfo->pdev);
+- /* The chip seems to need us to whack the PM register
+- * repeatedly until it sticks. We do that -prior- to
+- * calling pci_set_power_state()
+- */
+- radeonfb_whack_power_state(rinfo, PCI_D2);
+- pci_set_power_state(rinfo->pdev, PCI_D2);
++ for (;;) {
++ pci_read_config_word(
++ rinfo->pdev, rinfo->pm_reg+PCI_PM_CTRL,
++ &pwr_cmd);
++ if (pwr_cmd & 2)
++ break;
++ pci_write_config_word(
++ rinfo->pdev, rinfo->pm_reg+PCI_PM_CTRL,
++ (pwr_cmd & ~PCI_PM_CTRL_STATE_MASK) | 2);
++ mdelay(500);
++ }
+ } else {
+ printk(KERN_DEBUG "radeonfb (%s): switching to D0 state...\n",
+ pci_name(rinfo->pdev));
+
++ /* Switch back PCI powermanagment to D0 */
++ mdelay(200);
++ pci_write_config_word(rinfo->pdev, rinfo->pm_reg+PCI_PM_CTRL, 0);
++ mdelay(500);
++
+ if (rinfo->family <= CHIP_FAMILY_RV250) {
+ /* Reset the SDRAM controller */
+ radeon_pm_full_reset_sdram(rinfo);
+@@ -2602,10 +2598,37 @@
+ }
+ }
+
++static int radeon_restore_pci_cfg(struct radeonfb_info *rinfo)
++{
++ int i;
++ static u32 radeon_cfg_after_resume[64];
++
++ for (i = 0; i < 64; ++i)
++ pci_read_config_dword(rinfo->pdev, i * 4,
++ &radeon_cfg_after_resume[i]);
++
++ if (radeon_cfg_after_resume[PCI_BASE_ADDRESS_0/4]
++ == rinfo->cfg_save[PCI_BASE_ADDRESS_0/4])
++ return 0; /* assume everything is ok */
++
++ for (i = PCI_BASE_ADDRESS_0/4; i < 64; ++i) {
++ if (radeon_cfg_after_resume[i] != rinfo->cfg_save[i])
++ pci_write_config_dword(rinfo->pdev, i * 4,
++ rinfo->cfg_save[i]);
++ }
++ pci_write_config_word(rinfo->pdev, PCI_CACHE_LINE_SIZE,
++ rinfo->cfg_save[PCI_CACHE_LINE_SIZE/4]);
++ pci_write_config_word(rinfo->pdev, PCI_COMMAND,
++ rinfo->cfg_save[PCI_COMMAND/4]);
++ return 1;
++}
++
++
+ int radeonfb_pci_suspend(struct pci_dev *pdev, pm_message_t mesg)
+ {
+ struct fb_info *info = pci_get_drvdata(pdev);
+ struct radeonfb_info *rinfo = info->par;
++ int i;
+
+ if (mesg.event == pdev->dev.power.power_state.event)
+ return 0;
+@@ -2651,11 +2674,6 @@
+ pmac_suspend_agp_for_card(pdev);
+ #endif /* CONFIG_PPC_PMAC */
+
+- /* It's unclear whether or when the generic code will do that, so let's
+- * do it ourselves. We save state before we do any power management
+- */
+- pci_save_state(pdev);
+-
+ /* If we support wakeup from poweroff, we save all regs we can including cfg
+ * space
+ */
+@@ -2680,6 +2698,9 @@
+ mdelay(20);
+ OUTREG(LVDS_GEN_CNTL, INREG(LVDS_GEN_CNTL) & ~(LVDS_DIGON));
+ }
++ // FIXME: Use PCI layer
++ for (i = 0; i < 64; ++i)
++ pci_read_config_dword(pdev, i * 4, &rinfo->cfg_save[i]);
+ pci_disable_device(pdev);
+ }
+ /* If we support D2, we go to it (should be fixed later with a flag forcing
+@@ -2696,13 +2717,6 @@
+ return 0;
+ }
+
+-static int radeon_check_power_loss(struct radeonfb_info *rinfo)
+-{
+- return rinfo->save_regs[4] != INPLL(CLK_PIN_CNTL) ||
+- rinfo->save_regs[2] != INPLL(MCLK_CNTL) ||
+- rinfo->save_regs[3] != INPLL(SCLK_CNTL);
+-}
+-
+ int radeonfb_pci_resume(struct pci_dev *pdev)
+ {
+ struct fb_info *info = pci_get_drvdata(pdev);
+@@ -2721,13 +2735,20 @@
+ printk(KERN_DEBUG "radeonfb (%s): resuming from state: %d...\n",
+ pci_name(pdev), pdev->dev.power.power_state.event);
+
+- /* PCI state will have been restored by the core, so
+- * we should be in D0 now with our config space fully
+- * restored
+- */
++
++ if (pci_enable_device(pdev)) {
++ rc = -ENODEV;
++ printk(KERN_ERR "radeonfb (%s): can't enable PCI device !\n",
++ pci_name(pdev));
++ goto bail;
++ }
++ pci_set_master(pdev);
++
+ if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
+- /* Wakeup chip */
+- if ((rinfo->pm_mode & radeon_pm_off) && radeon_check_power_loss(rinfo)) {
++ /* Wakeup chip. Check from config space if we were powered off
++ * (todo: additionally, check CLK_PIN_CNTL too)
++ */
++ if ((rinfo->pm_mode & radeon_pm_off) && radeon_restore_pci_cfg(rinfo)) {
+ if (rinfo->reinit_func != NULL)
+ rinfo->reinit_func(rinfo);
+ else {
+@@ -2786,13 +2807,12 @@
+ return rc;
+ }
+
+-#ifdef CONFIG_PPC_OF__disabled
++#ifdef CONFIG_PPC_OF
+ static void radeonfb_early_resume(void *data)
+ {
+ struct radeonfb_info *rinfo = data;
+
+ rinfo->no_schedule = 1;
+- pci_restore_state(rinfo->pdev);
+ radeonfb_pci_resume(rinfo->pdev);
+ rinfo->no_schedule = 0;
+ }
+@@ -2859,14 +2879,7 @@
+ */
+ if (rinfo->pm_mode != radeon_pm_none) {
+ pmac_call_feature(PMAC_FTR_DEVICE_CAN_WAKE, rinfo->of_node, 0, 1);
+-#if 0 /* Disable the early video resume hack for now as it's causing problems, among
+- * others we now rely on the PCI core restoring the config space for us, which
+- * isn't the case with that hack, and that code path causes various things to
+- * be called with interrupts off while they shouldn't. I'm leaving the code in
+- * as it can be useful for debugging purposes
+- */
+ pmac_set_early_video_resume(radeonfb_early_resume, rinfo);
+-#endif
+ }
+
+ #if 0
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/video/backlight/da903x_bl.c linux-2.6.29-rc3.owrt/drivers/video/backlight/da903x_bl.c
+--- linux-2.6.29.owrt/drivers/video/backlight/da903x_bl.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/video/backlight/da903x_bl.c 1970-01-01 01:00:00.000000000 +0100
+@@ -1,203 +0,0 @@
+-/*
+- * Backlight driver for Dialog Semiconductor DA9030/DA9034
+- *
+- * Copyright (C) 2008 Compulab, Ltd.
+- * Mike Rapoport <mike@compulab.co.il>
+- *
+- * Copyright (C) 2006-2008 Marvell International Ltd.
+- * Eric Miao <eric.miao@marvell.com>
+- *
+- * 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.
+- */
+-
+-#include <linux/kernel.h>
+-#include <linux/init.h>
+-#include <linux/platform_device.h>
+-#include <linux/fb.h>
+-#include <linux/backlight.h>
+-#include <linux/mfd/da903x.h>
+-
+-#define DA9030_WLED_CONTROL 0x25
+-#define DA9030_WLED_CP_EN (1 << 6)
+-#define DA9030_WLED_TRIM(x) ((x) & 0x7)
+-
+-#define DA9034_WLED_CONTROL1 0x3C
+-#define DA9034_WLED_CONTROL2 0x3D
+-
+-#define DA9034_WLED_BOOST_EN (1 << 5)
+-
+-#define DA9030_MAX_BRIGHTNESS 7
+-#define DA9034_MAX_BRIGHTNESS 0x7f
+-
+-struct da903x_backlight_data {
+- struct device *da903x_dev;
+- int id;
+- int current_brightness;
+-};
+-
+-static int da903x_backlight_set(struct backlight_device *bl, int brightness)
+-{
+- struct da903x_backlight_data *data = bl_get_data(bl);
+- struct device *dev = data->da903x_dev;
+- uint8_t val;
+- int ret = 0;
+-
+- switch (data->id) {
+- case DA9034_ID_WLED:
+- ret = da903x_update(dev, DA9034_WLED_CONTROL1,
+- brightness, 0x7f);
+- if (ret)
+- return ret;
+-
+- if (data->current_brightness && brightness == 0)
+- ret = da903x_clr_bits(dev,
+- DA9034_WLED_CONTROL2,
+- DA9034_WLED_BOOST_EN);
+-
+- if (data->current_brightness == 0 && brightness)
+- ret = da903x_set_bits(dev,
+- DA9034_WLED_CONTROL2,
+- DA9034_WLED_BOOST_EN);
+- break;
+- case DA9030_ID_WLED:
+- val = DA9030_WLED_TRIM(brightness);
+- val |= brightness ? DA9030_WLED_CP_EN : 0;
+- ret = da903x_write(dev, DA9030_WLED_CONTROL, val);
+- break;
+- }
+-
+- if (ret)
+- return ret;
+-
+- data->current_brightness = brightness;
+- return 0;
+-}
+-
+-static int da903x_backlight_update_status(struct backlight_device *bl)
+-{
+- int brightness = bl->props.brightness;
+-
+- if (bl->props.power != FB_BLANK_UNBLANK)
+- brightness = 0;
+-
+- if (bl->props.fb_blank != FB_BLANK_UNBLANK)
+- brightness = 0;
+-
+- return da903x_backlight_set(bl, brightness);
+-}
+-
+-static int da903x_backlight_get_brightness(struct backlight_device *bl)
+-{
+- struct da903x_backlight_data *data = bl_get_data(bl);
+- return data->current_brightness;
+-}
+-
+-static struct backlight_ops da903x_backlight_ops = {
+- .update_status = da903x_backlight_update_status,
+- .get_brightness = da903x_backlight_get_brightness,
+-};
+-
+-static int da903x_backlight_probe(struct platform_device *pdev)
+-{
+- struct da903x_backlight_data *data;
+- struct backlight_device *bl;
+- int max_brightness;
+-
+- data = kzalloc(sizeof(*data), GFP_KERNEL);
+- if (data == NULL)
+- return -ENOMEM;
+-
+- switch (pdev->id) {
+- case DA9030_ID_WLED:
+- max_brightness = DA9030_MAX_BRIGHTNESS;
+- break;
+- case DA9034_ID_WLED:
+- max_brightness = DA9034_MAX_BRIGHTNESS;
+- break;
+- default:
+- dev_err(&pdev->dev, "invalid backlight device ID(%d)\n",
+- pdev->id);
+- kfree(data);
+- return -EINVAL;
+- }
+-
+- data->id = pdev->id;
+- data->da903x_dev = pdev->dev.parent;
+- data->current_brightness = 0;
+-
+- bl = backlight_device_register(pdev->name, data->da903x_dev,
+- data, &da903x_backlight_ops);
+- if (IS_ERR(bl)) {
+- dev_err(&pdev->dev, "failed to register backlight\n");
+- kfree(data);
+- return PTR_ERR(bl);
+- }
+-
+- bl->props.max_brightness = max_brightness;
+- bl->props.brightness = max_brightness;
+-
+- platform_set_drvdata(pdev, bl);
+- backlight_update_status(bl);
+- return 0;
+-}
+-
+-static int da903x_backlight_remove(struct platform_device *pdev)
+-{
+- struct backlight_device *bl = platform_get_drvdata(pdev);
+- struct da903x_backlight_data *data = bl_get_data(bl);
+-
+- backlight_device_unregister(bl);
+- kfree(data);
+- return 0;
+-}
+-
+-#ifdef CONFIG_PM
+-static int da903x_backlight_suspend(struct platform_device *pdev,
+- pm_message_t state)
+-{
+- struct backlight_device *bl = platform_get_drvdata(pdev);
+- return da903x_backlight_set(bl, 0);
+-}
+-
+-static int da903x_backlight_resume(struct platform_device *pdev)
+-{
+- struct backlight_device *bl = platform_get_drvdata(pdev);
+-
+- backlight_update_status(bl);
+- return 0;
+-}
+-#else
+-#define da903x_backlight_suspend NULL
+-#define da903x_backlight_resume NULL
+-#endif
+-
+-static struct platform_driver da903x_backlight_driver = {
+- .driver = {
+- .name = "da903x-backlight",
+- .owner = THIS_MODULE,
+- },
+- .probe = da903x_backlight_probe,
+- .remove = da903x_backlight_remove,
+- .suspend = da903x_backlight_suspend,
+- .resume = da903x_backlight_resume,
+-};
+-
+-static int __init da903x_backlight_init(void)
+-{
+- return platform_driver_register(&da903x_backlight_driver);
+-}
+-module_init(da903x_backlight_init);
+-
+-static void __exit da903x_backlight_exit(void)
+-{
+- platform_driver_unregister(&da903x_backlight_driver);
+-}
+-module_exit(da903x_backlight_exit);
+-
+-MODULE_DESCRIPTION("Backlight Driver for Dialog Semiconductor DA9030/DA9034");
+-MODULE_AUTHOR("Eric Miao <eric.miao@marvell.com>"
+- "Mike Rapoport <mike@compulab.co.il>");
+-MODULE_LICENSE("GPL");
+-MODULE_ALIAS("platform:da903x-backlight");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/video/backlight/da903x.c linux-2.6.29-rc3.owrt/drivers/video/backlight/da903x.c
+--- linux-2.6.29.owrt/drivers/video/backlight/da903x.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt/drivers/video/backlight/da903x.c 2009-05-10 23:48:29.000000000 +0200
+@@ -0,0 +1,203 @@
++/*
++ * Backlight driver for Dialog Semiconductor DA9030/DA9034
++ *
++ * Copyright (C) 2008 Compulab, Ltd.
++ * Mike Rapoport <mike@compulab.co.il>
++ *
++ * Copyright (C) 2006-2008 Marvell International Ltd.
++ * Eric Miao <eric.miao@marvell.com>
++ *
++ * 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.
++ */
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/platform_device.h>
++#include <linux/fb.h>
++#include <linux/backlight.h>
++#include <linux/mfd/da903x.h>
++
++#define DA9030_WLED_CONTROL 0x25
++#define DA9030_WLED_CP_EN (1 << 6)
++#define DA9030_WLED_TRIM(x) ((x) & 0x7)
++
++#define DA9034_WLED_CONTROL1 0x3C
++#define DA9034_WLED_CONTROL2 0x3D
++
++#define DA9034_WLED_BOOST_EN (1 << 5)
++
++#define DA9030_MAX_BRIGHTNESS 7
++#define DA9034_MAX_BRIGHTNESS 0x7f
++
++struct da903x_backlight_data {
++ struct device *da903x_dev;
++ int id;
++ int current_brightness;
++};
++
++static int da903x_backlight_set(struct backlight_device *bl, int brightness)
++{
++ struct da903x_backlight_data *data = bl_get_data(bl);
++ struct device *dev = data->da903x_dev;
++ uint8_t val;
++ int ret = 0;
++
++ switch (data->id) {
++ case DA9034_ID_WLED:
++ ret = da903x_update(dev, DA9034_WLED_CONTROL1,
++ brightness, 0x7f);
++ if (ret)
++ return ret;
++
++ if (data->current_brightness && brightness == 0)
++ ret = da903x_clr_bits(dev,
++ DA9034_WLED_CONTROL2,
++ DA9034_WLED_BOOST_EN);
++
++ if (data->current_brightness == 0 && brightness)
++ ret = da903x_set_bits(dev,
++ DA9034_WLED_CONTROL2,
++ DA9034_WLED_BOOST_EN);
++ break;
++ case DA9030_ID_WLED:
++ val = DA9030_WLED_TRIM(brightness);
++ val |= brightness ? DA9030_WLED_CP_EN : 0;
++ ret = da903x_write(dev, DA9030_WLED_CONTROL, val);
++ break;
++ }
++
++ if (ret)
++ return ret;
++
++ data->current_brightness = brightness;
++ return 0;
++}
++
++static int da903x_backlight_update_status(struct backlight_device *bl)
++{
++ int brightness = bl->props.brightness;
++
++ if (bl->props.power != FB_BLANK_UNBLANK)
++ brightness = 0;
++
++ if (bl->props.fb_blank != FB_BLANK_UNBLANK)
++ brightness = 0;
++
++ return da903x_backlight_set(bl, brightness);
++}
++
++static int da903x_backlight_get_brightness(struct backlight_device *bl)
++{
++ struct da903x_backlight_data *data = bl_get_data(bl);
++ return data->current_brightness;
++}
++
++static struct backlight_ops da903x_backlight_ops = {
++ .update_status = da903x_backlight_update_status,
++ .get_brightness = da903x_backlight_get_brightness,
++};
++
++static int da903x_backlight_probe(struct platform_device *pdev)
++{
++ struct da903x_backlight_data *data;
++ struct backlight_device *bl;
++ int max_brightness;
++
++ data = kzalloc(sizeof(*data), GFP_KERNEL);
++ if (data == NULL)
++ return -ENOMEM;
++
++ switch (pdev->id) {
++ case DA9030_ID_WLED:
++ max_brightness = DA9030_MAX_BRIGHTNESS;
++ break;
++ case DA9034_ID_WLED:
++ max_brightness = DA9034_MAX_BRIGHTNESS;
++ break;
++ default:
++ dev_err(&pdev->dev, "invalid backlight device ID(%d)\n",
++ pdev->id);
++ kfree(data);
++ return -EINVAL;
++ }
++
++ data->id = pdev->id;
++ data->da903x_dev = pdev->dev.parent;
++ data->current_brightness = 0;
++
++ bl = backlight_device_register(pdev->name, data->da903x_dev,
++ data, &da903x_backlight_ops);
++ if (IS_ERR(bl)) {
++ dev_err(&pdev->dev, "failed to register backlight\n");
++ kfree(data);
++ return PTR_ERR(bl);
++ }
++
++ bl->props.max_brightness = max_brightness;
++ bl->props.brightness = max_brightness;
++
++ platform_set_drvdata(pdev, bl);
++ backlight_update_status(bl);
++ return 0;
++}
++
++static int da903x_backlight_remove(struct platform_device *pdev)
++{
++ struct backlight_device *bl = platform_get_drvdata(pdev);
++ struct da903x_backlight_data *data = bl_get_data(bl);
++
++ backlight_device_unregister(bl);
++ kfree(data);
++ return 0;
++}
++
++#ifdef CONFIG_PM
++static int da903x_backlight_suspend(struct platform_device *pdev,
++ pm_message_t state)
++{
++ struct backlight_device *bl = platform_get_drvdata(pdev);
++ return da903x_backlight_set(bl, 0);
++}
++
++static int da903x_backlight_resume(struct platform_device *pdev)
++{
++ struct backlight_device *bl = platform_get_drvdata(pdev);
++
++ backlight_update_status(bl);
++ return 0;
++}
++#else
++#define da903x_backlight_suspend NULL
++#define da903x_backlight_resume NULL
++#endif
++
++static struct platform_driver da903x_backlight_driver = {
++ .driver = {
++ .name = "da903x-backlight",
++ .owner = THIS_MODULE,
++ },
++ .probe = da903x_backlight_probe,
++ .remove = da903x_backlight_remove,
++ .suspend = da903x_backlight_suspend,
++ .resume = da903x_backlight_resume,
++};
++
++static int __init da903x_backlight_init(void)
++{
++ return platform_driver_register(&da903x_backlight_driver);
++}
++module_init(da903x_backlight_init);
++
++static void __exit da903x_backlight_exit(void)
++{
++ platform_driver_unregister(&da903x_backlight_driver);
++}
++module_exit(da903x_backlight_exit);
++
++MODULE_DESCRIPTION("Backlight Driver for Dialog Semiconductor DA9030/DA9034");
++MODULE_AUTHOR("Eric Miao <eric.miao@marvell.com>"
++ "Mike Rapoport <mike@compulab.co.il>");
++MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:da903x-backlight");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/video/backlight/Makefile linux-2.6.29-rc3.owrt/drivers/video/backlight/Makefile
+--- linux-2.6.29.owrt/drivers/video/backlight/Makefile 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/video/backlight/Makefile 2009-05-10 23:48:29.000000000 +0200
+@@ -18,7 +18,7 @@
+ obj-$(CONFIG_BACKLIGHT_PROGEAR) += progear_bl.o
+ obj-$(CONFIG_BACKLIGHT_CARILLO_RANCH) += cr_bllcd.o
+ obj-$(CONFIG_BACKLIGHT_PWM) += pwm_bl.o
+-obj-$(CONFIG_BACKLIGHT_DA903X) += da903x_bl.o
++obj-$(CONFIG_BACKLIGHT_DA903X) += da903x.o
+ obj-$(CONFIG_BACKLIGHT_MBP_NVIDIA) += mbp_nvidia_bl.o
+ obj-$(CONFIG_BACKLIGHT_TOSA) += tosa_bl.o
+ obj-$(CONFIG_BACKLIGHT_SAHARA) += kb3886_bl.o
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/video/bfin-t350mcqb-fb.c linux-2.6.29-rc3.owrt/drivers/video/bfin-t350mcqb-fb.c
+--- linux-2.6.29.owrt/drivers/video/bfin-t350mcqb-fb.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/video/bfin-t350mcqb-fb.c 2009-05-10 23:48:29.000000000 +0200
+@@ -447,7 +447,7 @@
+ return IRQ_HANDLED;
+ }
+
+-static int __devinit bfin_t350mcqb_probe(struct platform_device *pdev)
++static int __init bfin_t350mcqb_probe(struct platform_device *pdev)
+ {
+ struct bfin_t350mcqbfb_info *info;
+ struct fb_info *fbinfo;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/video/fbcmap.c linux-2.6.29-rc3.owrt/drivers/video/fbcmap.c
+--- linux-2.6.29.owrt/drivers/video/fbcmap.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/video/fbcmap.c 2009-05-10 23:48:29.000000000 +0200
+@@ -250,6 +250,10 @@
+ int rc, size = cmap->len * sizeof(u16);
+ struct fb_cmap umap;
+
++ if (cmap->start < 0 || (!info->fbops->fb_setcolreg &&
++ !info->fbops->fb_setcmap))
++ return -EINVAL;
++
+ memset(&umap, 0, sizeof(struct fb_cmap));
+ rc = fb_alloc_cmap(&umap, cmap->len, cmap->transp != NULL);
+ if (rc)
+@@ -258,23 +262,11 @@
+ copy_from_user(umap.green, cmap->green, size) ||
+ copy_from_user(umap.blue, cmap->blue, size) ||
+ (cmap->transp && copy_from_user(umap.transp, cmap->transp, size))) {
+- rc = -EFAULT;
+- goto out;
++ fb_dealloc_cmap(&umap);
++ return -EFAULT;
+ }
+ umap.start = cmap->start;
+- if (!lock_fb_info(info)) {
+- rc = -ENODEV;
+- goto out;
+- }
+- if (cmap->start < 0 || (!info->fbops->fb_setcolreg &&
+- !info->fbops->fb_setcmap)) {
+- rc = -EINVAL;
+- goto out1;
+- }
+ rc = fb_set_cmap(&umap, info);
+-out1:
+- unlock_fb_info(info);
+-out:
+ fb_dealloc_cmap(&umap);
+ return rc;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/video/fbmem.c linux-2.6.29-rc3.owrt/drivers/video/fbmem.c
+--- linux-2.6.29.owrt/drivers/video/fbmem.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/video/fbmem.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1013,139 +1013,132 @@
+ struct fb_var_screeninfo var;
+ struct fb_fix_screeninfo fix;
+ struct fb_con2fbmap con2fb;
+- struct fb_cmap cmap_from;
+ struct fb_cmap_user cmap;
+ struct fb_event event;
+ void __user *argp = (void __user *)arg;
+ long ret = 0;
+
++ fb = info->fbops;
++ if (!fb)
++ return -ENODEV;
++
+ switch (cmd) {
+ case FBIOGET_VSCREENINFO:
+- if (!lock_fb_info(info))
+- return -ENODEV;
+- var = info->var;
+- unlock_fb_info(info);
+-
+- ret = copy_to_user(argp, &var, sizeof(var)) ? -EFAULT : 0;
++ ret = copy_to_user(argp, &info->var,
++ sizeof(var)) ? -EFAULT : 0;
+ break;
+ case FBIOPUT_VSCREENINFO:
+- if (copy_from_user(&var, argp, sizeof(var)))
+- return -EFAULT;
+- if (!lock_fb_info(info))
+- return -ENODEV;
++ if (copy_from_user(&var, argp, sizeof(var))) {
++ ret = -EFAULT;
++ break;
++ }
+ acquire_console_sem();
+ info->flags |= FBINFO_MISC_USEREVENT;
+ ret = fb_set_var(info, &var);
+ info->flags &= ~FBINFO_MISC_USEREVENT;
+ release_console_sem();
+- unlock_fb_info(info);
+- if (!ret && copy_to_user(argp, &var, sizeof(var)))
++ if (ret == 0 && copy_to_user(argp, &var, sizeof(var)))
+ ret = -EFAULT;
+ break;
+ case FBIOGET_FSCREENINFO:
+- if (!lock_fb_info(info))
+- return -ENODEV;
+- fix = info->fix;
+- unlock_fb_info(info);
+-
+- ret = copy_to_user(argp, &fix, sizeof(fix)) ? -EFAULT : 0;
++ ret = copy_to_user(argp, &info->fix,
++ sizeof(fix)) ? -EFAULT : 0;
+ break;
+ case FBIOPUTCMAP:
+ if (copy_from_user(&cmap, argp, sizeof(cmap)))
+- return -EFAULT;
+- ret = fb_set_user_cmap(&cmap, info);
++ ret = -EFAULT;
++ else
++ ret = fb_set_user_cmap(&cmap, info);
+ break;
+ case FBIOGETCMAP:
+ if (copy_from_user(&cmap, argp, sizeof(cmap)))
+- return -EFAULT;
+- if (!lock_fb_info(info))
+- return -ENODEV;
+- cmap_from = info->cmap;
+- unlock_fb_info(info);
+- ret = fb_cmap_to_user(&cmap_from, &cmap);
++ ret = -EFAULT;
++ else
++ ret = fb_cmap_to_user(&info->cmap, &cmap);
+ break;
+ case FBIOPAN_DISPLAY:
+- if (copy_from_user(&var, argp, sizeof(var)))
+- return -EFAULT;
+- if (!lock_fb_info(info))
+- return -ENODEV;
++ if (copy_from_user(&var, argp, sizeof(var))) {
++ ret = -EFAULT;
++ break;
++ }
+ acquire_console_sem();
+ ret = fb_pan_display(info, &var);
+ release_console_sem();
+- unlock_fb_info(info);
+ if (ret == 0 && copy_to_user(argp, &var, sizeof(var)))
+- return -EFAULT;
++ ret = -EFAULT;
+ break;
+ case FBIO_CURSOR:
+ ret = -EINVAL;
+ break;
+ case FBIOGET_CON2FBMAP:
+ if (copy_from_user(&con2fb, argp, sizeof(con2fb)))
+- return -EFAULT;
+- if (con2fb.console < 1 || con2fb.console > MAX_NR_CONSOLES)
+- return -EINVAL;
+- con2fb.framebuffer = -1;
+- event.data = &con2fb;
+-
+- if (!lock_fb_info(info))
+- return -ENODEV;
+- event.info = info;
+- fb_notifier_call_chain(FB_EVENT_GET_CONSOLE_MAP, &event);
+- unlock_fb_info(info);
+-
+- ret = copy_to_user(argp, &con2fb, sizeof(con2fb)) ? -EFAULT : 0;
++ ret = -EFAULT;
++ else if (con2fb.console < 1 || con2fb.console > MAX_NR_CONSOLES)
++ ret = -EINVAL;
++ else {
++ con2fb.framebuffer = -1;
++ event.info = info;
++ event.data = &con2fb;
++ fb_notifier_call_chain(FB_EVENT_GET_CONSOLE_MAP,
++ &event);
++ ret = copy_to_user(argp, &con2fb,
++ sizeof(con2fb)) ? -EFAULT : 0;
++ }
+ break;
+ case FBIOPUT_CON2FBMAP:
+- if (copy_from_user(&con2fb, argp, sizeof(con2fb)))
+- return -EFAULT;
+- if (con2fb.console < 1 || con2fb.console > MAX_NR_CONSOLES)
+- return -EINVAL;
+- if (con2fb.framebuffer < 0 || con2fb.framebuffer >= FB_MAX)
+- return -EINVAL;
++ if (copy_from_user(&con2fb, argp, sizeof(con2fb))) {
++ ret = -EFAULT;
++ break;
++ }
++ if (con2fb.console < 1 || con2fb.console > MAX_NR_CONSOLES) {
++ ret = -EINVAL;
++ break;
++ }
++ if (con2fb.framebuffer < 0 || con2fb.framebuffer >= FB_MAX) {
++ ret = -EINVAL;
++ break;
++ }
+ if (!registered_fb[con2fb.framebuffer])
+ request_module("fb%d", con2fb.framebuffer);
+ if (!registered_fb[con2fb.framebuffer]) {
+ ret = -EINVAL;
+ break;
+ }
+- event.data = &con2fb;
+- if (!lock_fb_info(info))
+- return -ENODEV;
+ event.info = info;
++ event.data = &con2fb;
+ ret = fb_notifier_call_chain(FB_EVENT_SET_CONSOLE_MAP,
+ &event);
+- unlock_fb_info(info);
+ break;
+ case FBIOBLANK:
+- if (!lock_fb_info(info))
+- return -ENODEV;
+ acquire_console_sem();
+ info->flags |= FBINFO_MISC_USEREVENT;
+ ret = fb_blank(info, arg);
+ info->flags &= ~FBINFO_MISC_USEREVENT;
+ release_console_sem();
+- unlock_fb_info(info);
+- break;
++ break;;
+ default:
+- if (!lock_fb_info(info))
+- return -ENODEV;
+- fb = info->fbops;
+- if (fb->fb_ioctl)
+- ret = fb->fb_ioctl(info, cmd, arg);
+- else
++ if (fb->fb_ioctl == NULL)
+ ret = -ENOTTY;
+- unlock_fb_info(info);
++ else
++ ret = fb->fb_ioctl(info, cmd, arg);
+ }
+ return ret;
+ }
+
+ static long fb_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
++__acquires(&info->lock)
++__releases(&info->lock)
+ {
+ struct inode *inode = file->f_path.dentry->d_inode;
+ int fbidx = iminor(inode);
+- struct fb_info *info = registered_fb[fbidx];
++ struct fb_info *info;
++ long ret;
+
+- return do_fb_ioctl(info, cmd, arg);
++ info = registered_fb[fbidx];
++ mutex_lock(&info->lock);
++ ret = do_fb_ioctl(info, cmd, arg);
++ mutex_unlock(&info->lock);
++ return ret;
+ }
+
+ #ifdef CONFIG_COMPAT
+@@ -1264,6 +1257,8 @@
+
+ static long fb_compat_ioctl(struct file *file, unsigned int cmd,
+ unsigned long arg)
++__acquires(&info->lock)
++__releases(&info->lock)
+ {
+ struct inode *inode = file->f_path.dentry->d_inode;
+ int fbidx = iminor(inode);
+@@ -1271,6 +1266,7 @@
+ struct fb_ops *fb = info->fbops;
+ long ret = -ENOIOCTLCMD;
+
++ mutex_lock(&info->lock);
+ switch(cmd) {
+ case FBIOGET_VSCREENINFO:
+ case FBIOPUT_VSCREENINFO:
+@@ -1296,6 +1292,7 @@
+ ret = fb->fb_compat_ioctl(info, cmd, arg);
+ break;
+ }
++ mutex_unlock(&info->lock);
+ return ret;
+ }
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/video/geode/gx1fb_core.c linux-2.6.29-rc3.owrt/drivers/video/geode/gx1fb_core.c
+--- linux-2.6.29.owrt/drivers/video/geode/gx1fb_core.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/video/geode/gx1fb_core.c 2009-05-10 23:48:29.000000000 +0200
+@@ -136,10 +136,13 @@
+ {
+ struct geodefb_par *par = info->par;
+
+- if (info->var.bits_per_pixel == 16)
++ if (info->var.bits_per_pixel == 16) {
+ info->fix.visual = FB_VISUAL_TRUECOLOR;
+- else
++ fb_dealloc_cmap(&info->cmap);
++ } else {
+ info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
++ fb_alloc_cmap(&info->cmap, 1<<info->var.bits_per_pixel, 0);
++ }
+
+ info->fix.line_length = gx1_line_delta(info->var.xres, info->var.bits_per_pixel);
+
+@@ -312,10 +315,6 @@
+ if (!par->panel_x)
+ par->enable_crt = 1; /* fall back to CRT if no panel is specified */
+
+- if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) {
+- framebuffer_release(info);
+- return NULL;
+- }
+ return info;
+ }
+
+@@ -375,11 +374,8 @@
+ release_mem_region(gx1_gx_base() + 0x8300, 0x100);
+ }
+
+- if (info) {
+- fb_dealloc_cmap(&info->cmap);
++ if (info)
+ framebuffer_release(info);
+- }
+-
+ return ret;
+ }
+
+@@ -399,7 +395,6 @@
+ iounmap(par->dc_regs);
+ release_mem_region(gx1_gx_base() + 0x8300, 0x100);
+
+- fb_dealloc_cmap(&info->cmap);
+ pci_set_drvdata(pdev, NULL);
+
+ framebuffer_release(info);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/video/geode/gxfb_core.c linux-2.6.29-rc3.owrt/drivers/video/geode/gxfb_core.c
+--- linux-2.6.29.owrt/drivers/video/geode/gxfb_core.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/video/geode/gxfb_core.c 2009-05-10 23:48:29.000000000 +0200
+@@ -171,10 +171,13 @@
+
+ static int gxfb_set_par(struct fb_info *info)
+ {
+- if (info->var.bits_per_pixel > 8)
++ if (info->var.bits_per_pixel > 8) {
+ info->fix.visual = FB_VISUAL_TRUECOLOR;
+- else
++ fb_dealloc_cmap(&info->cmap);
++ } else {
+ info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
++ fb_alloc_cmap(&info->cmap, 1<<info->var.bits_per_pixel, 0);
++ }
+
+ info->fix.line_length = gx_line_delta(info->var.xres, info->var.bits_per_pixel);
+
+@@ -328,11 +331,6 @@
+
+ info->var.grayscale = 0;
+
+- if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) {
+- framebuffer_release(info);
+- return NULL;
+- }
+-
+ return info;
+ }
+
+@@ -445,10 +443,8 @@
+ pci_release_region(pdev, 1);
+ }
+
+- if (info) {
+- fb_dealloc_cmap(&info->cmap);
++ if (info)
+ framebuffer_release(info);
+- }
+ return ret;
+ }
+
+@@ -471,7 +467,6 @@
+ iounmap(par->gp_regs);
+ pci_release_region(pdev, 1);
+
+- fb_dealloc_cmap(&info->cmap);
+ pci_set_drvdata(pdev, NULL);
+
+ framebuffer_release(info);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/video/geode/lxfb_core.c linux-2.6.29-rc3.owrt/drivers/video/geode/lxfb_core.c
+--- linux-2.6.29.owrt/drivers/video/geode/lxfb_core.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/video/geode/lxfb_core.c 2009-05-10 23:48:29.000000000 +0200
+@@ -278,10 +278,13 @@
+
+ static int lxfb_set_par(struct fb_info *info)
+ {
+- if (info->var.bits_per_pixel > 8)
++ if (info->var.bits_per_pixel > 8) {
+ info->fix.visual = FB_VISUAL_TRUECOLOR;
+- else
++ fb_dealloc_cmap(&info->cmap);
++ } else {
+ info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
++ fb_alloc_cmap(&info->cmap, 1<<info->var.bits_per_pixel, 0);
++ }
+
+ info->fix.line_length = lx_get_pitch(info->var.xres,
+ info->var.bits_per_pixel);
+@@ -448,11 +451,6 @@
+
+ info->pseudo_palette = (void *)par + sizeof(struct lxfb_par);
+
+- if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) {
+- framebuffer_release(info);
+- return NULL;
+- }
+-
+ info->var.grayscale = 0;
+
+ return info;
+@@ -581,10 +579,8 @@
+ pci_release_region(pdev, 3);
+ }
+
+- if (info) {
+- fb_dealloc_cmap(&info->cmap);
++ if (info)
+ framebuffer_release(info);
+- }
+
+ return ret;
+ }
+@@ -608,7 +604,6 @@
+ iounmap(par->vp_regs);
+ pci_release_region(pdev, 3);
+
+- fb_dealloc_cmap(&info->cmap);
+ pci_set_drvdata(pdev, NULL);
+ framebuffer_release(info);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/video/i810/i810_main.c linux-2.6.29-rc3.owrt/drivers/video/i810/i810_main.c
+--- linux-2.6.29.owrt/drivers/video/i810/i810_main.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/video/i810/i810_main.c 2009-05-10 23:48:29.000000000 +0200
+@@ -993,7 +993,6 @@
+ struct i810fb_par *par = info->par;
+ int line_length, vidmem, mode_valid = 0, retval = 0;
+ u32 vyres = var->yres_virtual, vxres = var->xres_virtual;
+-
+ /*
+ * Memory limit
+ */
+@@ -1003,12 +1002,12 @@
+ if (vidmem > par->fb.size) {
+ vyres = par->fb.size/line_length;
+ if (vyres < var->yres) {
+- vyres = info->var.yres;
++ vyres = yres;
+ vxres = par->fb.size/vyres;
+ vxres /= var->bits_per_pixel >> 3;
+ line_length = get_line_length(par, vxres,
+ var->bits_per_pixel);
+- vidmem = line_length * info->var.yres;
++ vidmem = line_length * yres;
+ if (vxres < var->xres) {
+ printk("i810fb: required video memory, "
+ "%d bytes, for %dx%d-%d (virtual) "
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/video/Kconfig linux-2.6.29-rc3.owrt/drivers/video/Kconfig
+--- linux-2.6.29.owrt/drivers/video/Kconfig 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/video/Kconfig 2009-05-10 23:48:29.000000000 +0200
+@@ -41,7 +41,7 @@
+ You need an utility program called fbset to make full use of frame
+ buffer devices. Please read <file:Documentation/fb/framebuffer.txt>
+ and the Framebuffer-HOWTO at
+- <http://www.munted.org.uk/programming/Framebuffer-HOWTO-1.2.html> for more
++ <http://www.tahallah.demon.co.uk/programming/prog.html> for more
+ information.
+
+ Say Y here and to the driver for your graphics board below if you
+@@ -1054,7 +1054,9 @@
+
+ config FB_I810
+ tristate "Intel 810/815 support (EXPERIMENTAL)"
+- depends on EXPERIMENTAL && FB && PCI && X86_32 && AGP_INTEL
++ depends on FB && EXPERIMENTAL && PCI && X86_32
++ select AGP
++ select AGP_INTEL
+ select FB_MODE_HELPERS
+ select FB_CFB_FILLRECT
+ select FB_CFB_COPYAREA
+@@ -1117,7 +1119,9 @@
+
+ config FB_INTEL
+ tristate "Intel 830M/845G/852GM/855GM/865G/915G/945G/945GM/965G/965GM support (EXPERIMENTAL)"
+- depends on EXPERIMENTAL && FB && PCI && X86 && AGP_INTEL
++ depends on FB && EXPERIMENTAL && PCI && X86
++ select AGP
++ select AGP_INTEL
+ select FB_MODE_HELPERS
+ select FB_CFB_FILLRECT
+ select FB_CFB_COPYAREA
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/video/logo/logo_linux_clut224.ppm linux-2.6.29-rc3.owrt/drivers/video/logo/logo_linux_clut224.ppm
+--- linux-2.6.29.owrt/drivers/video/logo/logo_linux_clut224.ppm 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/video/logo/logo_linux_clut224.ppm 2009-05-10 23:48:29.000000000 +0200
+@@ -1,2828 +1,1604 @@
+ P3
+-145 113
++# Standard 224-color Linux logo
++80 80
+ 255
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 3 4 4 6 7 7
+-8 10 10 8 10 10 6 8 8 6 7 7 3 4 4 2 2 2
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 4 5 5 17 18 17
+-27 29 28 35 37 36 40 43 41 43 45 43 40 43 41 37 39 37
+-32 34 33 27 30 29 23 25 24 17 21 21 15 18 18 12 15 15
+-11 13 13 8 10 10 6 7 7 3 4 4 1 1 1 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 13 13 13 32 34 33 49 51 48 60 60 56 58 59 55
+-55 57 54 55 56 53 49 51 48 43 45 43 39 40 39 33 37 35
+-28 31 30 23 27 26 20 23 23 17 20 20 14 17 17 13 16 16
+-11 14 14 10 13 13 10 12 12 9 11 11 8 10 10 6 7 7
+-2 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 6 7 7 12 15 15
+-12 15 15 8 9 9 2 3 3 0 0 0 1 1 1 25 27 26
+-55 56 53 68 70 65 65 66 61 65 66 61 63 64 60 63 64 60
+-58 59 55 51 52 50 47 48 46 41 42 42 35 37 36 30 32 31
+-26 28 27 20 24 24 18 22 22 16 19 19 14 17 17 13 16 16
+-12 15 15 11 14 14 10 13 13 10 12 12 9 11 11 8 10 10
+-8 9 9 6 8 8 3 3 3 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 6 7 7 20 24 24 23 27 26
+-23 27 26 18 22 22 11 13 13 23 24 24 61 63 57 72 73 67
+-72 73 67 68 70 65 68 70 65 68 70 65 63 64 60 58 59 55
+-55 56 53 47 48 46 41 42 42 35 37 36 30 32 31 26 28 27
+-20 24 24 18 22 22 16 20 20 15 19 19 14 17 17 13 16 16
+-12 15 15 12 15 15 11 14 14 10 13 13 10 12 12 9 11 11
+-8 10 10 8 9 9 7 9 9 6 7 7 1 2 2 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 1 1 1 4 5 5 5 6 5 4 5 5
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 15 19 19 40 41 39 53 55 47
+-33 36 34 27 30 29 51 52 50 72 73 67 72 73 67 72 73 67
+-72 73 67 68 70 65 68 70 65 63 64 60 58 59 55 51 52 50
+-47 48 46 40 43 41 33 37 35 30 32 31 26 28 27 20 24 24
+-18 22 22 17 21 21 16 19 19 14 18 18 14 17 17 13 17 17
+-13 16 16 12 15 15 12 15 15 11 14 14 10 13 13 10 12 12
+-9 11 11 8 10 10 8 9 9 7 9 9 6 8 8 3 4 4
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-2 2 2 6 8 8 10 12 12 10 12 12 10 12 12 10 12 12
+-6 8 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 20 23 23 71 71 57 131 127 93
+-115 113 82 63 64 60 72 73 67 72 73 67 72 73 67 72 73 67
+-68 70 65 65 66 61 61 63 57 55 57 54 49 51 48 43 45 43
+-39 40 39 33 36 34 28 31 30 23 27 26 20 24 24 20 23 23
+-17 21 21 16 20 20 15 19 19 15 18 18 14 18 18 14 17 17
+-13 17 17 13 16 16 12 15 15 12 15 15 11 14 14 10 13 13
+-10 12 12 9 11 11 8 10 10 7 9 9 7 9 9 6 8 8
+-4 5 5 0 0 0 0 0 0 0 0 0 1 1 1 6 7 7
+-10 12 12 10 12 12 10 12 12 10 12 12 10 12 12 10 12 12
+-10 12 12 3 4 4 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 18 22 22 71 71 57 144 139 99
+-84 83 72 68 70 65 72 73 67 72 73 67 68 70 65 65 66 61
+-63 64 60 55 57 54 51 52 50 47 48 46 40 43 41 35 37 36
+-30 32 31 27 29 28 23 27 26 20 24 24 18 22 22 17 21 21
+-16 20 20 15 19 19 15 19 19 15 19 19 15 18 18 14 18 18
+-14 17 17 13 17 17 13 16 16 12 15 15 12 15 15 11 14 14
+-10 13 13 9 12 12 9 11 11 8 10 10 7 9 9 6 8 8
+-6 8 8 3 4 4 0 0 0 2 2 2 8 10 10 10 12 12
+-10 12 12 10 12 12 11 13 13 36 38 35 61 61 53 48 49 45
+-10 12 12 7 9 9 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 15 19 19 61 61 53 84 83 72
+-68 70 65 72 73 67 68 70 65 68 70 65 63 64 60 58 59 55
+-51 52 50 47 48 46 41 42 42 37 39 37 32 35 33 28 31 30
+-23 27 26 20 24 24 20 23 23 18 22 22 17 21 21 17 21 21
+-17 21 21 17 21 21 17 20 20 16 20 20 16 20 20 16 19 19
+-15 18 18 14 18 18 13 17 17 13 16 16 12 15 15 12 15 15
+-11 14 14 10 13 13 9 12 12 9 11 11 8 10 10 7 9 9
+-6 8 8 6 8 8 5 6 5 9 11 11 10 12 12 10 12 12
+-19 20 18 82 81 62 149 145 103 160 154 106 142 137 94 96 95 69
+-10 12 12 10 12 12 1 1 1 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 10 12 12 44 46 43 68 70 65
+-72 73 67 68 70 65 68 70 65 63 64 60 55 57 54 49 51 48
+-43 45 43 39 40 39 33 37 35 30 32 31 26 28 27 23 27 26
+-20 24 24 18 22 22 18 22 22 18 22 22 18 22 22 20 23 23
+-20 24 24 23 25 24 23 25 24 22 24 23 20 23 23 18 22 22
+-17 20 20 15 19 19 15 18 18 14 17 17 13 16 16 12 15 15
+-11 14 14 11 13 13 10 12 12 9 11 11 8 10 10 8 9 9
+-7 9 9 7 9 9 10 12 12 10 12 12 10 12 12 71 71 57
+-164 159 111 186 182 128 186 182 128 171 165 117 151 147 98 96 95 69
+-10 12 12 10 12 12 3 3 3 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 8 10 10 63 64 60 68 70 65
+-72 73 67 68 70 65 63 64 60 55 57 54 47 48 46 40 43 41
+-33 37 35 30 32 31 27 29 28 23 27 26 20 24 24 20 23 23
+-18 22 22 18 22 22 20 23 22 21 25 23 23 27 26 27 29 28
+-28 31 30 31 33 31 31 33 31 31 33 31 28 31 30 26 28 27
+-23 25 24 20 23 22 16 20 20 15 18 18 14 17 17 13 16 16
+-12 15 15 11 14 14 10 13 13 10 12 12 9 11 11 8 10 10
+-10 12 12 10 13 13 10 12 12 12 14 14 96 95 69 165 161 109
+-186 182 128 192 187 134 192 187 134 176 171 126 160 154 106 103 101 77
+-10 12 12 10 12 12 5 6 5 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 35 37 36 68 70 65 72 73 67
+-68 70 65 65 66 61 58 59 55 49 51 48 40 43 41 33 37 35
+-28 31 30 23 27 26 20 24 24 20 23 23 18 22 22 18 22 22
+-18 22 22 20 23 23 23 27 26 27 30 29 32 35 33 37 39 37
+-40 43 41 44 46 43 46 47 43 44 46 43 40 43 41 36 38 35
+-31 33 31 27 29 28 22 24 23 17 21 21 15 18 18 14 17 17
+-13 16 16 12 15 15 11 14 14 11 14 14 11 13 13 13 16 16
+-13 16 16 11 14 14 10 12 12 79 78 62 142 137 94 164 159 111
+-178 174 128 192 187 134 192 187 134 176 171 126 160 154 106 96 95 69
+-10 12 12 10 12 12 6 7 7 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 55 57 54 68 70 65 72 73 67
+-68 70 65 63 64 60 55 56 53 43 45 43 35 37 36 28 31 30
+-23 27 26 20 24 24 18 22 22 17 21 21 17 21 21 17 21 21
+-20 24 24 25 27 26 31 33 31 38 39 37 46 47 43 53 55 47
+-61 61 53 66 65 55 66 65 55 66 65 55 61 61 53 53 55 47
+-46 47 43 37 39 37 30 33 30 24 26 24 17 21 21 15 18 18
+-13 17 17 12 15 15 12 15 15 13 16 16 14 18 18 14 18 18
+-14 17 17 12 15 15 30 31 28 118 116 76 134 131 96 160 154 106
+-174 170 121 178 174 128 178 174 128 171 165 117 151 147 98 96 95 69
+-10 12 12 10 12 12 6 8 8 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 63 64 60 68 70 65 68 70 65
+-65 66 61 58 59 55 49 51 48 39 40 39 30 32 31 23 27 26
+-20 24 24 18 22 22 17 21 21 16 20 20 17 21 21 20 23 23
+-25 27 26 32 35 33 43 44 41 53 55 47 66 65 55 75 75 61
+-82 81 62 84 83 72 87 86 72 87 86 72 82 81 62 75 75 61
+-66 65 55 53 55 47 40 41 39 31 33 31 23 25 24 17 20 20
+-14 18 18 13 16 16 12 15 15 12 15 15 13 17 17 14 18 18
+-14 18 18 13 16 16 46 47 43 96 95 69 125 122 87 142 137 94
+-160 154 106 165 161 109 164 159 111 155 149 109 142 137 94 75 75 61
+-10 12 12 10 12 12 6 8 8 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 60 60 56 68 70 65 68 70 65
+-63 64 60 55 57 54 46 47 45 35 37 36 27 30 29 23 25 24
+-18 22 22 17 21 21 16 20 20 17 21 21 18 22 22 23 27 26
+-31 33 31 43 44 41 55 56 53 71 71 57 84 83 72 92 91 72
+-103 101 77 92 91 72 82 81 62 82 81 62 87 86 72 92 91 72
+-84 83 72 71 71 57 55 56 53 43 44 41 30 33 30 22 24 23
+-16 19 19 14 17 17 12 15 15 12 15 15 13 16 16 14 18 18
+-14 18 18 14 17 17 43 44 41 82 81 62 118 116 76 125 122 87
+-142 137 94 144 139 99 144 139 99 134 131 96 118 116 76 53 55 47
+-10 12 12 10 12 12 6 8 8 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 47 48 46 63 64 60 63 64 60
+-55 57 54 49 51 48 40 43 41 32 34 33 26 28 27 20 24 24
+-18 22 22 16 20 20 16 20 20 17 21 21 20 24 24 28 31 30
+-40 41 39 53 55 47 75 75 61 90 89 73 87 86 72 48 49 45
+-14 14 13 2 2 2 1 2 2 1 1 1 1 1 1 2 2 2
+-19 20 18 43 44 41 66 65 55 53 55 47 38 39 37 26 28 27
+-18 22 22 14 18 18 13 16 16 12 15 15 12 15 15 13 17 17
+-14 18 18 14 18 18 30 31 28 66 65 55 96 95 69 103 101 77
+-118 116 76 118 116 76 118 116 76 118 116 76 103 101 77 36 38 35
+-10 12 12 10 12 12 6 7 7 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 28 31 30 55 57 54 51 52 50
+-49 51 48 41 42 42 35 37 36 28 31 30 23 27 26 20 23 23
+-17 21 21 16 20 20 16 20 20 18 22 22 23 27 26 33 36 34
+-48 49 45 71 71 57 82 81 62 43 44 41 8 9 9 6 7 7
+-6 7 7 6 7 7 6 7 7 5 6 5 4 5 5 3 4 4
+-2 3 3 1 2 2 4 5 4 36 38 35 48 49 45 32 35 33
+-21 25 23 16 19 19 13 17 17 12 15 15 12 15 15 13 16 16
+-14 18 18 14 18 18 16 18 16 36 38 35 61 61 53 82 81 62
+-96 95 69 96 95 69 96 95 69 96 95 69 79 78 62 19 20 18
+-10 12 12 10 12 12 4 5 5 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 13 13 13 46 47 45 43 45 43
+-40 43 41 35 37 36 30 32 31 23 27 26 20 24 24 18 22 22
+-17 21 21 16 20 20 17 21 21 20 23 23 27 30 29 40 41 39
+-61 61 53 53 55 47 16 17 16 9 11 11 10 12 12 10 12 12
+-10 12 12 10 12 12 10 12 12 9 11 11 8 10 10 8 9 9
+-6 8 8 5 6 5 4 5 5 2 3 3 19 20 18 38 39 37
+-26 28 27 17 21 21 14 17 17 13 16 16 12 15 15 12 15 15
+-13 17 17 14 18 18 12 15 15 13 12 7 30 31 28 46 47 43
+-53 55 47 66 65 55 66 65 55 53 55 47 36 38 35 10 12 12
+-10 12 12 10 12 12 2 3 3 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 1 1 1 33 37 35 35 37 36
+-32 35 33 28 31 30 23 27 26 20 24 24 18 22 22 17 21 21
+-16 20 20 16 20 20 17 21 21 21 25 23 31 33 31 44 46 43
+-31 33 31 11 13 13 12 14 14 12 15 15 13 16 16 14 17 17
+-14 17 17 14 17 17 14 17 17 13 16 16 12 15 15 12 14 14
+-11 13 13 9 11 11 8 10 10 6 8 8 4 5 5 17 18 17
+-30 33 30 20 23 22 15 18 18 13 16 16 12 15 15 12 14 14
+-13 16 16 14 17 17 14 18 18 11 12 11 7 7 5 16 17 12
+-21 22 20 30 31 28 25 27 25 21 22 20 14 14 13 10 12 12
+-10 12 12 9 11 11 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 18 22 22 27 30 29
+-27 29 28 40 41 39 53 55 47 53 55 47 53 55 47 46 47 43
+-25 27 25 16 20 20 17 21 21 23 25 24 31 33 31 20 20 20
+-12 15 15 14 17 17 15 19 19 16 20 20 17 21 21 18 22 22
+-18 22 22 18 22 22 18 22 22 17 21 21 17 21 21 16 19 19
+-15 18 18 13 16 16 12 15 15 10 12 12 8 10 10 6 8 8
+-21 22 21 22 24 23 15 19 19 13 17 17 13 16 16 12 15 15
+-12 15 15 13 17 17 14 18 18 14 18 18 13 15 14 10 9 6
+-7 7 5 7 7 5 7 7 5 9 11 11 10 12 12 10 12 12
+-10 12 12 6 7 7 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 16 17 12 82 81 62
+-118 116 76 118 116 76 161 156 96 161 156 96 161 156 96 118 116 76
+-118 116 76 96 95 69 53 55 47 22 24 23 14 17 17 13 16 16
+-15 19 19 17 21 21 18 22 22 20 24 24 20 24 24 23 27 26
+-23 27 26 23 27 26 23 27 26 23 27 26 23 27 26 20 24 24
+-20 23 23 17 21 21 16 19 19 14 17 17 12 15 15 10 12 12
+-9 11 11 20 23 22 16 19 19 14 17 17 13 16 16 12 15 15
+-11 14 14 13 16 16 14 17 17 14 18 18 14 17 17 12 15 15
+-10 12 12 10 12 12 10 12 12 10 12 12 10 12 12 10 12 12
+-9 11 11 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 53 55 47 161 156 96
+-161 156 96 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 161 156 96 118 116 76 96 95 69 21 22 20 16 19 19
+-18 22 22 20 24 24 23 27 26 23 27 26 26 28 27 27 30 29
+-27 30 29 18 22 22 12 14 14 8 10 10 9 11 11 17 21 21
+-23 27 26 23 27 26 20 24 24 18 22 22 16 20 20 14 17 17
+-12 14 14 14 17 17 16 20 20 14 17 17 13 17 17 13 16 16
+-12 15 15 12 15 15 13 17 17 14 18 18 14 17 17 13 16 16
+-11 13 13 10 12 12 10 12 12 10 12 12 10 12 12 10 12 12
+-4 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 13 12 7 118 116 76 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 161 156 96 118 116 76 30 31 28
+-20 24 24 23 27 26 27 30 29 28 31 30 30 32 31 23 27 26
+-16 19 19 17 21 21 12 15 15 9 11 11 10 12 12 9 11 11
+-20 24 24 28 31 30 26 28 27 23 27 26 20 24 24 17 21 21
+-15 19 19 13 16 16 16 19 19 14 18 18 14 17 17 13 16 16
+-12 15 15 11 14 14 13 16 16 14 17 17 14 18 18 14 17 17
+-12 15 15 10 12 12 10 12 12 10 12 12 10 12 12 8 9 9
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 82 81 62 161 156 96 230 229 82
+-230 229 82 233 233 100 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 161 156 96 118 116 76
+-27 29 28 27 30 29 30 32 31 30 32 31 23 27 26 20 24 24
+-26 28 27 17 21 21 6 7 7 72 73 67 145 141 105 15 15 15
+-14 17 17 33 37 35 30 32 31 28 31 30 26 28 27 23 27 26
+-20 23 23 16 20 20 15 19 19 14 18 18 14 17 17 13 16 16
+-12 15 15 11 14 14 12 15 15 13 17 17 14 18 18 14 17 17
+-13 16 16 11 13 13 10 12 12 10 12 12 9 11 11 1 1 1
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 16 17 12 161 156 96 230 229 82 230 229 82
+-243 242 120 235 234 117 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 161 156 96
+-82 81 62 28 31 30 28 31 30 27 30 29 28 31 30 30 32 31
+-33 37 35 13 16 16 3 3 3 105 104 92 210 208 158 12 14 14
+-17 21 21 33 37 35 33 37 35 32 35 33 30 32 31 27 30 29
+-23 27 26 20 23 23 17 20 20 15 18 18 14 18 18 13 17 17
+-13 16 16 12 15 15 11 14 14 13 16 16 14 17 17 14 18 18
+-13 17 17 12 15 15 10 12 12 10 12 12 3 4 4 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 96 95 69 230 229 82 230 229 82 244 244 132
+-241 241 143 243 242 120 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-161 156 96 46 47 43 32 35 33 33 37 35 33 37 35 33 37 35
+-40 43 41 23 27 26 1 1 1 2 2 2 24 26 24 14 17 17
+-23 27 26 33 37 35 33 37 35 33 37 35 33 37 35 30 32 31
+-27 30 29 23 27 26 20 23 23 15 18 18 14 18 18 14 17 17
+-13 16 16 12 15 15 11 14 14 12 15 15 13 17 17 14 17 17
+-14 17 17 13 16 16 11 13 13 6 8 8 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 16 17 12 161 156 96 230 229 82 235 234 117 239 239 170
+-239 239 170 236 236 101 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 118 116 76 33 37 35 33 37 35 37 39 37 37 39 37
+-43 45 43 49 51 48 20 24 24 8 10 10 17 20 20 35 37 36
+-33 37 35 40 43 41 37 39 37 35 37 36 33 37 35 33 37 35
+-30 32 31 27 30 29 23 27 26 15 19 19 14 18 18 14 17 17
+-13 17 17 13 16 16 12 15 15 11 14 14 13 16 16 14 17 17
+-14 17 17 13 17 17 11 14 14 4 5 5 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 96 95 69 230 229 82 230 229 82 239 239 170 251 251 187
+-241 241 143 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 161 156 96 36 38 35 33 37 35 33 37 35 33 37 35
+-37 39 37 47 48 46 55 57 54 55 57 54 49 51 48 43 45 43
+-43 45 43 43 45 43 40 43 41 40 43 41 37 39 37 33 37 35
+-33 37 35 28 31 30 26 28 27 16 20 20 15 18 18 14 18 18
+-14 17 17 13 16 16 12 15 15 11 14 14 12 15 15 13 17 17
+-14 17 17 14 17 17 8 10 10 5 7 7 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-16 17 12 230 229 82 230 229 82 243 242 120 251 251 187 251 251 187
+-246 246 123 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 66 65 55 30 32 31 32 35 33 33 37 35
+-33 37 35 37 39 37 40 43 41 47 48 46 49 51 48 51 52 50
+-55 57 54 55 57 54 51 52 50 47 48 46 43 45 43 39 40 39
+-33 37 35 30 32 31 26 28 27 17 21 21 15 19 19 14 18 18
+-14 17 17 13 16 16 12 15 15 12 14 14 11 14 14 13 16 16
+-14 17 17 12 15 15 7 9 9 6 8 8 1 1 1 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-96 95 69 230 229 82 230 229 82 239 239 170 251 251 187 239 239 170
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 96 95 69 27 30 29 28 31 30 30 32 31
+-33 37 35 40 43 41 46 47 45 55 57 54 63 64 60 72 73 67
+-72 73 67 72 73 67 72 73 67 65 66 61 55 57 54 47 48 46
+-39 40 39 32 35 33 27 30 29 17 21 21 15 19 19 15 18 18
+-14 18 18 13 17 17 13 16 16 12 15 15 11 14 14 12 14 14
+-13 16 16 9 11 11 7 9 9 9 11 11 66 65 55 115 113 82
+-21 22 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 12 7
+-230 229 82 230 229 82 236 236 101 251 251 187 251 251 187 246 246 123
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 118 116 76 23 27 26 26 28 27 32 35 33
+-51 52 50 90 89 73 110 109 94 145 141 105 168 163 120 177 172 135
+-177 172 135 188 184 146 188 184 146 181 176 137 194 191 148 188 184 146
+-184 179 149 188 184 146 188 184 146 156 151 111 177 172 135 181 176 137
+-177 172 135 168 163 120 168 163 120 158 153 112 156 151 111 158 153 112
+-156 151 111 158 153 112 177 172 135 188 184 146 188 184 146 194 189 146
+-36 38 35 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 82 81 62
+-230 229 82 230 229 82 244 244 132 251 251 187 244 244 132 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 161 156 96 82 81 62
+-96 95 69 230 229 82 181 178 103 110 109 94 156 151 111 188 184 146
+-188 184 146 197 193 154 188 184 146 184 181 136 188 184 146 168 163 120
+-168 163 120 178 174 128 156 151 111 158 153 112 174 170 121 156 151 111
+-156 151 111 158 153 112 156 151 111 168 163 120 178 174 128 181 176 137
+-176 171 126 178 174 128 184 181 136 176 171 126 178 174 128 184 181 136
+-176 171 126 178 174 128 184 181 136 164 159 111 155 149 109 96 95 69
+-1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 161 156 96
+-230 229 82 230 229 82 244 244 132 244 244 132 236 236 101 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 46 47 43 82 81 62
+-158 153 112 197 193 154 194 189 146 184 181 136 188 184 146 168 163 120
+-156 151 111 137 133 100 131 127 93 137 133 100 137 133 100 158 153 112
+-121 119 87 137 133 100 156 151 111 145 141 105 99 98 80 84 83 72
+-63 64 60 52 53 49 40 43 41 33 36 34 36 38 35 36 38 35
+-38 39 37 43 44 41 43 44 41 46 47 43 48 49 45 48 49 45
+-46 47 43 36 38 35 30 31 28 19 20 18 6 7 7 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 36 38 35 230 229 82
+-230 229 82 230 229 82 246 246 123 236 236 101 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 53 55 47 121 119 87
+-176 171 126 171 165 117 161 156 96 82 81 62 53 55 47 33 37 35
+-39 40 39 63 64 60 99 98 80 121 119 87 137 133 100 177 172 135
+-176 171 126 184 181 136 131 127 93 131 127 93 110 109 94 84 83 72
+-51 52 50 39 40 39 27 29 28 18 22 22 16 19 19 15 19 19
+-15 19 19 14 18 18 14 17 17 13 16 16 12 15 15 11 14 14
+-10 13 13 9 12 12 9 11 11 8 9 9 7 9 9 1 1 1
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 118 116 76 230 229 82
+-230 229 82 230 229 82 236 236 101 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 96 95 69 71 71 57
+-36 38 35 118 116 76 118 116 76 12 15 15 15 18 18 20 24 24
+-33 37 35 55 56 53 84 83 72 110 109 94 145 141 105 110 109 94
+-168 163 120 121 119 87 156 151 111 131 127 93 87 86 72 61 63 57
+-47 48 46 28 31 30 18 22 22 15 19 19 15 18 18 15 19 19
+-15 19 19 14 18 18 14 17 17 13 17 17 13 16 16 12 15 15
+-11 13 13 10 12 12 9 11 11 8 10 10 7 9 9 3 3 3
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 1 1 0 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 161 156 96
+-161 156 96 230 229 82 118 116 76 11 14 14 14 17 17 18 22 22
+-27 30 29 40 43 41 60 60 56 84 83 72 105 104 92 110 109 94
+-110 109 94 110 109 94 99 98 80 90 89 73 68 70 65 47 48 46
+-32 34 33 23 25 24 20 23 23 17 21 21 15 19 19 14 17 17
+-15 19 19 15 18 18 14 18 18 13 17 17 13 16 16 12 15 15
+-11 14 14 10 12 12 9 11 11 8 10 10 7 9 9 4 5 5
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 16 17 12 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 161 156 96 118 116 76 11 13 13 13 16 16 15 19 19
+-20 24 24 30 32 31 40 43 41 51 52 50 63 64 60 72 73 67
+-65 66 61 65 66 61 65 66 61 55 57 54 46 47 45 33 37 35
+-27 29 28 20 24 24 17 21 21 16 20 20 16 20 20 15 19 19
+-15 19 19 15 19 19 14 18 18 14 17 17 13 16 16 12 15 15
+-11 14 14 10 13 13 9 12 12 8 10 10 7 9 9 6 7 7
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 53 55 47 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-161 156 96 118 116 76 53 55 47 10 13 13 12 15 15 14 17 17
+-17 20 20 20 24 24 27 29 28 32 34 33 37 39 37 40 43 41
+-43 45 43 41 42 42 35 37 36 30 32 31 28 31 30 23 27 26
+-20 23 23 17 21 21 16 20 20 16 20 20 16 20 20 16 19 19
+-15 19 19 15 19 19 14 18 18 14 17 17 13 16 16 12 15 15
+-11 14 14 10 13 13 9 12 12 9 11 11 8 10 10 10 12 12
+-1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 82 81 62 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 161 156 96 161 156 96
+-118 116 76 82 81 62 13 14 12 10 13 13 12 15 15 13 17 17
+-15 19 19 16 20 20 20 23 23 20 24 24 23 27 26 26 28 27
+-26 28 27 26 28 27 23 27 26 18 22 22 20 23 23 17 21 21
+-17 21 21 16 20 20 16 20 20 16 20 20 16 20 20 16 19 19
+-15 19 19 15 19 19 15 18 18 14 17 17 13 17 17 13 16 16
+-12 15 15 12 14 14 12 14 14 12 14 14 12 14 14 23 24 24
+-6 8 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 118 116 76 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 161 156 96 161 156 96 118 116 76
+-71 71 57 13 14 12 9 12 12 10 13 13 12 15 15 13 17 17
+-15 18 18 15 19 19 16 20 20 17 21 21 17 21 21 18 22 22
+-18 22 22 18 22 22 17 21 21 16 19 19 15 18 18 14 18 18
+-16 19 19 16 20 20 16 20 20 16 20 20 16 20 20 16 20 20
+-15 19 19 15 19 19 15 18 18 14 18 18 16 20 20 23 25 24
+-17 21 21 25 27 26 47 48 46 47 48 46 51 52 50 72 73 67
+-33 36 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 118 116 76 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 161 156 96 118 116 76 118 116 76 46 47 43
+-9 11 11 9 11 11 10 12 12 11 13 13 12 15 15 14 17 17
+-15 18 18 15 19 19 16 20 20 16 20 20 16 20 20 16 20 20
+-16 20 20 16 20 20 16 20 20 16 20 20 16 20 20 16 20 20
+-15 19 19 16 20 20 16 20 20 16 20 20 16 20 20 16 20 20
+-15 19 19 16 20 20 20 24 24 55 56 53 32 34 33 84 83 72
+-90 89 73 110 109 94 110 109 94 105 104 92 110 109 94 110 109 94
+-72 73 67 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 96 95 69 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 161 156 96 118 116 76 82 81 62 16 17 12 9 11 11
+-9 11 11 9 12 12 10 13 13 12 14 14 13 16 16 14 18 18
+-15 19 19 16 20 20 16 20 20 16 20 20 16 20 20 16 20 20
+-16 20 20 16 20 20 16 20 20 16 20 20 16 20 20 16 20 20
+-16 20 20 16 20 20 16 20 20 16 20 20 16 20 20 16 20 20
+-16 19 19 33 36 34 99 98 80 156 151 111 145 141 105 184 179 149
+-168 163 120 184 179 149 177 172 135 156 151 111 145 141 105 110 109 94
+-90 89 73 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 71 71 57 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 230 229 82
+-230 229 82 161 156 96 230 229 82 230 229 82 230 229 82 161 156 96
+-118 116 76 82 81 62 30 31 28 9 11 11 9 11 11 9 11 11
+-10 12 12 10 13 13 11 14 14 13 16 16 14 17 17 15 18 18
+-15 19 19 16 20 20 16 20 20 16 20 20 16 20 20 16 20 20
+-16 20 20 16 20 20 16 20 20 16 20 20 16 20 20 16 20 20
+-16 20 20 16 20 20 16 20 20 16 20 20 16 20 20 16 20 20
+-18 22 22 58 59 55 137 133 100 197 193 154 214 212 158 210 208 158
+-197 193 154 184 179 149 184 179 149 137 133 100 110 109 94 99 98 80
+-84 83 72 10 10 9 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 16 17 12 230 229 82 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 230 229 82 161 156 96
+-161 156 96 161 156 96 161 156 96 161 156 96 118 116 76 71 71 57
+-21 22 20 12 14 14 11 13 13 10 12 12 10 12 12 10 13 13
+-11 13 13 12 15 15 13 16 16 14 17 17 14 18 18 15 19 19
+-16 20 20 16 20 20 16 20 20 16 20 20 16 20 20 16 20 20
+-16 20 20 16 20 20 16 20 20 16 20 20 16 20 20 16 20 20
+-16 20 20 16 20 20 16 20 20 16 20 20 16 20 20 17 21 21
+-23 27 26 84 83 72 184 179 149 251 251 187 210 208 158 184 179 149
+-184 179 149 156 151 111 110 109 94 84 83 72 63 64 60 51 52 50
+-18 22 22 6 8 8 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 118 116 76 230 229 82
+-230 229 82 230 229 82 230 229 82 230 229 82 161 156 96 161 156 96
+-161 156 96 161 156 96 118 116 76 53 55 47 20 23 22 16 19 19
+-13 16 16 12 15 15 12 14 14 11 14 14 11 14 14 11 14 14
+-12 15 15 13 16 16 14 17 17 15 19 19 16 20 20 17 21 21
+-23 27 26 18 22 22 20 24 24 23 27 26 30 32 31 17 21 21
+-16 20 20 16 20 20 16 20 20 16 20 20 16 20 20 16 20 20
+-16 20 20 16 20 20 16 20 20 16 20 20 16 20 20 16 20 20
+-23 27 26 33 37 35 137 133 100 156 151 111 158 153 112 105 104 92
+-105 104 92 68 70 65 39 40 39 18 22 22 12 14 14 12 15 15
+-9 11 11 4 5 5 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 16 17 12 230 229 82
+-230 229 82 230 229 82 230 229 82 161 156 96 118 116 76 118 116 76
+-118 116 76 66 65 55 43 45 43 32 34 33 25 27 26 20 23 22
+-17 20 20 15 18 18 14 17 17 15 18 18 13 16 16 14 17 17
+-14 18 18 16 20 20 32 34 33 55 57 54 58 59 55 72 73 67
+-105 104 92 55 57 54 65 66 61 63 64 60 40 43 41 33 37 35
+-41 42 42 20 24 24 16 20 20 16 20 20 16 20 20 16 20 20
+-16 20 20 16 20 20 16 20 20 16 20 20 16 20 20 16 20 20
+-17 21 21 26 28 27 30 32 31 35 37 36 68 70 65 39 40 39
+-23 27 26 15 18 18 13 16 16 11 14 14 9 12 12 8 10 10
+-7 9 9 6 7 7 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 36 38 35
+-230 229 82 230 229 82 230 229 82 96 95 69 30 31 28 49 51 48
+-90 89 73 68 70 65 55 57 54 47 48 46 47 48 46 43 45 43
+-32 34 33 43 45 43 43 45 43 23 27 26 25 27 26 40 43 41
+-40 43 41 90 89 73 110 109 94 145 141 105 156 151 111 156 151 111
+-184 179 149 184 179 149 177 172 135 184 179 149 137 133 100 84 83 72
+-105 104 92 63 64 60 49 51 48 47 48 46 28 31 30 18 22 22
+-16 20 20 16 20 20 16 20 20 16 20 20 16 20 20 16 20 20
+-16 20 20 15 19 19 15 19 19 15 19 19 18 22 22 15 19 19
+-13 16 16 12 15 15 11 14 14 10 13 13 9 12 12 9 11 11
+-8 10 10 6 8 8 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-30 31 28 230 229 82 71 71 57 2 2 1 0 0 0 58 59 55
+-105 104 92 84 83 72 65 66 61 84 83 72 110 109 94 110 109 94
+-145 141 105 105 104 92 110 109 94 110 109 94 84 83 72 110 109 94
+-158 153 112 197 193 154 197 193 154 239 239 170 251 251 187 251 251 187
+-251 251 187 251 251 187 251 251 187 251 251 187 210 208 158 197 193 154
+-197 193 154 184 179 149 145 141 105 137 133 100 105 104 92 47 48 46
+-20 23 23 16 20 20 16 20 20 16 20 20 16 20 20 16 20 20
+-16 20 20 16 19 19 15 19 19 15 19 19 14 18 18 14 17 17
+-13 17 17 13 16 16 12 14 14 12 14 14 13 13 13 13 13 13
+-13 13 13 12 12 12 10 10 9 6 7 7 2 2 2 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 65 66 61
+-105 104 92 84 83 72 84 83 72 110 109 94 184 179 149 210 208 158
+-210 208 158 210 208 158 214 212 158 197 193 154 214 212 158 210 208 158
+-251 251 187 251 251 187 251 251 187 251 251 187 251 251 187 251 251 187
+-251 251 187 251 251 187 251 251 187 251 251 187 251 251 187 251 251 187
+-251 251 187 251 251 187 239 239 170 251 251 187 184 179 149 84 83 72
+-26 28 27 16 20 20 16 20 20 16 20 20 16 20 20 16 20 20
+-16 20 20 16 20 20 15 19 19 15 19 19 15 18 18 14 18 18
+-13 17 17 13 16 16 15 15 15 14 14 13 14 14 13 14 14 13
+-13 13 13 13 13 13 12 12 12 12 12 12 12 12 12 3 4 4
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 72 73 67
+-105 104 92 99 98 80 84 83 72 99 98 80 177 172 135 197 193 154
+-251 251 187 251 251 187 251 251 187 251 251 187 251 251 187 251 251 187
+-251 251 187 251 251 187 251 251 187 251 251 187 251 251 187 251 251 187
+-251 251 187 251 251 187 251 251 187 251 251 187 251 251 187 251 251 187
+-251 251 187 251 251 187 251 251 187 214 212 158 197 193 154 99 98 80
+-23 27 26 16 20 20 16 20 20 16 20 20 16 20 20 16 20 20
+-16 20 20 16 20 20 15 19 19 15 19 19 15 18 18 14 18 18
+-14 17 17 16 16 16 16 16 16 16 16 16 15 15 15 14 14 13
+-14 14 13 13 13 13 13 13 13 12 12 12 12 12 12 12 12 12
+-3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 84 83 72
+-110 109 94 99 98 80 72 73 67 63 64 60 99 98 80 177 172 135
+-184 179 149 210 208 158 251 251 187 251 251 187 251 251 187 251 251 187
+-251 251 187 251 251 187 251 251 187 251 251 187 251 251 187 251 251 187
+-251 251 187 251 251 187 251 251 187 251 251 187 251 251 187 251 251 187
+-251 251 187 210 208 158 184 179 149 177 172 135 110 109 94 33 37 35
+-17 21 21 16 20 20 16 20 20 16 20 20 16 20 20 16 20 20
+-16 20 20 16 20 20 15 19 19 15 19 19 15 19 19 14 18 18
+-15 18 18 18 19 18 18 19 18 17 17 17 16 16 16 15 15 15
+-14 14 13 13 13 13 13 13 13 12 12 12 12 12 12 12 12 12
+-10 10 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 105 104 92
+-108 107 93 99 98 80 72 73 67 63 64 60 51 52 50 87 86 72
+-105 104 92 110 109 94 108 107 93 156 151 111 184 179 149 184 179 149
+-197 193 154 197 193 154 197 193 154 184 179 149 184 179 149 177 172 135
+-197 193 154 156 151 111 177 172 135 184 179 149 168 163 120 137 133 100
+-145 141 105 110 109 94 99 98 80 47 48 46 55 57 54 15 19 19
+-16 19 19 16 20 20 16 20 20 16 20 20 16 20 20 16 20 20
+-17 20 20 17 21 21 16 20 20 16 19 19 15 19 19 16 19 19
+-20 20 20 21 22 21 20 20 20 19 20 19 18 19 18 16 16 16
+-15 15 15 14 14 13 13 13 13 13 13 13 12 12 12 12 12 12
+-12 12 12 4 5 5 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 58 59 55 110 109 94
+-105 104 92 90 89 73 72 73 67 55 57 54 43 45 43 39 40 39
+-43 45 43 46 47 45 43 45 43 68 70 65 65 66 61 63 64 60
+-108 107 93 72 73 67 105 104 92 90 89 73 72 73 67 40 43 41
+-72 73 67 68 70 65 68 70 65 58 59 55 63 64 60 49 51 48
+-43 45 43 33 36 34 27 30 29 20 24 24 16 20 20 15 19 19
+-15 19 19 15 19 19 15 19 19 16 19 19 16 20 20 16 20 20
+-17 21 21 20 24 24 20 23 22 17 21 21 17 20 20 20 20 20
+-21 22 21 21 22 21 21 22 21 21 22 21 20 20 20 18 19 18
+-16 16 16 15 15 15 13 13 13 13 13 13 12 12 12 12 12 12
+-12 12 12 10 10 9 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 21 22 21 110 109 94 110 109 94
+-105 104 92 84 83 72 68 70 65 51 52 50 41 42 42 33 37 35
+-28 31 30 23 27 26 20 23 23 18 22 22 17 20 20 25 27 26
+-26 28 27 27 30 29 25 27 26 20 23 23 23 27 26 30 32 31
+-20 24 24 17 21 21 18 22 22 15 19 19 26 28 27 20 23 23
+-14 18 18 15 19 19 15 18 18 15 19 19 15 19 19 15 19 19
+-15 19 19 15 19 19 15 19 19 15 19 19 15 19 19 16 19 19
+-16 20 20 22 24 23 24 26 24 22 24 23 20 23 22 22 24 23
+-24 26 24 24 26 24 23 24 24 22 24 23 21 22 21 19 20 19
+-17 17 17 15 15 15 14 14 13 13 13 13 12 12 12 12 12 12
+-12 12 12 12 12 12 2 2 2 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 2 2 2 99 98 80 110 109 94 108 107 93
+-105 104 92 84 83 72 63 64 60 49 51 48 39 40 39 32 34 33
+-27 30 29 23 25 24 20 23 23 17 20 20 15 19 19 14 18 18
+-14 17 17 13 17 17 13 17 17 13 17 17 13 17 17 13 17 17
+-14 17 17 14 17 17 14 17 17 14 17 17 14 17 17 14 17 17
+-14 18 18 14 18 18 14 18 18 14 18 18 15 18 18 15 19 19
+-15 19 19 15 19 19 15 19 19 15 19 19 15 19 19 15 19 19
+-15 19 19 17 21 21 27 29 28 26 28 27 25 27 26 25 27 26
+-27 29 28 27 29 28 26 28 27 24 26 24 21 22 21 20 20 20
+-18 19 18 16 16 16 14 14 13 13 13 13 12 12 12 12 12 12
+-12 12 12 12 12 12 4 5 5 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 51 52 50 110 109 94 110 109 94 105 104 92
+-90 89 73 72 73 67 55 57 54 43 45 43 35 37 36 30 32 31
+-26 28 27 20 24 24 17 21 21 16 19 19 15 18 18 14 17 17
+-13 16 16 13 16 16 13 16 16 13 16 16 13 16 16 13 16 16
+-13 16 16 13 16 16 13 16 16 13 17 17 13 17 17 14 17 17
+-14 17 17 14 17 17 14 17 17 14 18 18 14 18 18 14 18 18
+-15 18 18 15 18 18 15 19 19 15 19 19 15 19 19 15 19 19
+-15 19 19 15 19 19 27 29 28 32 34 33 28 31 30 27 29 28
+-30 32 31 30 32 31 30 31 28 26 28 27 23 24 24 21 22 21
+-19 20 19 16 16 16 14 14 13 13 13 13 12 12 12 12 12 12
+-12 12 12 12 12 12 6 7 7 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 3 3 3 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 10 10 9 108 107 93 110 109 94 108 107 93 99 98 80
+-84 83 72 63 64 60 49 51 48 40 43 41 33 36 34 27 30 29
+-23 27 26 18 22 22 17 20 20 15 18 18 14 17 17 13 16 16
+-13 16 16 13 16 16 12 15 15 12 15 15 12 15 15 12 15 15
+-13 16 16 13 16 16 13 16 16 13 16 16 13 16 16 13 16 16
+-13 17 17 13 17 17 14 17 17 14 17 17 14 17 17 14 18 18
+-14 18 18 14 18 18 15 18 18 15 18 18 15 19 19 15 19 19
+-15 19 19 15 19 19 17 21 21 33 36 34 32 34 33 31 33 31
+-33 36 34 33 36 34 31 33 31 27 29 28 25 27 26 21 22 21
+-19 20 19 17 17 17 15 15 15 13 13 13 12 12 12 12 12 12
+-12 12 12 12 12 12 8 8 7 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 63 64 60 137 133 100 43 45 43 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 68 70 65 110 109 94 110 109 94 105 104 92 84 83 72
+-68 70 65 55 57 54 43 45 43 35 37 36 30 32 31 26 28 27
+-20 24 24 17 21 21 16 19 19 14 17 17 13 16 16 12 15 15
+-12 15 15 12 15 15 12 15 15 12 15 15 12 15 15 12 15 15
+-12 15 15 12 15 15 12 15 15 12 15 15 12 15 15 13 16 16
+-13 16 16 13 16 16 13 16 16 13 17 17 13 17 17 14 17 17
+-14 17 17 14 17 17 14 18 18 14 18 18 14 18 18 15 18 18
+-15 19 19 15 19 19 15 19 19 20 24 24 32 34 33 35 37 36
+-37 39 37 35 37 36 33 36 34 30 32 31 26 28 27 22 24 23
+-20 20 20 17 17 17 15 15 15 13 13 13 12 12 12 12 12 12
+-12 12 12 12 12 12 8 8 7 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-1 1 1 99 98 80 184 179 149 184 179 149 68 70 65 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-15 15 15 110 109 94 110 109 94 108 107 93 99 98 80 72 73 67
+-61 63 57 49 51 48 39 40 39 33 36 34 27 30 29 23 25 24
+-18 22 22 16 19 19 14 17 17 13 16 16 12 15 15 12 15 15
+-11 14 14 11 14 14 11 14 14 11 14 14 11 14 14 11 14 14
+-11 14 14 11 14 14 12 14 14 12 15 15 12 15 15 12 15 15
+-12 15 15 13 16 16 13 16 16 13 16 16 13 16 16 13 16 16
+-13 17 17 14 17 17 14 17 17 14 17 17 14 18 18 14 18 18
+-14 18 18 15 18 18 15 19 19 15 19 19 30 32 31 38 39 37
+-39 40 39 39 40 39 35 37 36 31 33 31 27 29 28 22 24 23
+-20 20 20 17 17 17 15 15 15 13 13 13 12 12 12 12 12 12
+-12 12 12 12 12 12 8 8 7 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3
+-110 109 94 197 193 154 210 208 158 184 179 149 68 70 65 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-68 70 65 110 109 94 110 109 94 105 104 92 84 83 72 65 66 61
+-51 52 50 43 45 43 35 37 36 30 32 31 25 27 26 20 23 23
+-17 20 20 15 18 18 13 16 16 12 15 15 12 15 15 11 14 14
+-11 14 14 11 14 14 11 13 13 11 13 13 11 13 13 11 13 13
+-11 14 14 11 14 14 11 14 14 11 14 14 11 14 14 11 14 14
+-12 15 15 12 15 15 12 15 15 12 15 15 13 16 16 13 16 16
+-13 16 16 13 16 16 13 17 17 13 17 17 14 17 17 14 17 17
+-14 18 18 14 18 18 14 18 18 16 19 19 37 39 37 41 42 42
+-41 42 42 41 42 42 38 39 37 32 34 33 27 29 28 23 24 24
+-21 22 21 17 17 17 15 15 15 13 13 13 12 12 12 12 12 12
+-12 12 12 12 12 12 8 8 7 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 11 11 11 137 133 100
+-197 193 154 251 251 187 239 239 170 184 179 149 31 33 31 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 12 12
+-110 109 94 110 109 94 105 104 92 90 89 73 72 73 67 58 59 55
+-46 47 45 37 39 37 31 33 31 26 28 27 20 24 24 17 21 21
+-15 18 18 13 16 16 12 15 15 12 14 14 11 13 13 11 13 13
+-10 13 13 10 13 13 10 13 13 10 13 13 10 13 13 10 13 13
+-10 13 13 10 13 13 11 13 13 11 13 13 11 14 14 11 14 14
+-11 14 14 11 14 14 12 14 14 12 15 15 12 15 15 12 15 15
+-13 16 16 13 16 16 13 16 16 13 16 16 13 17 17 13 17 17
+-14 17 17 14 17 17 14 18 18 23 27 26 41 42 42 41 42 42
+-43 45 43 41 42 42 39 40 39 33 36 34 27 29 28 23 24 24
+-21 22 21 17 17 17 15 15 15 13 13 13 12 12 12 12 12 12
+-12 12 12 12 12 12 6 7 7 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 27 29 28 168 163 120 210 208 158
+-251 251 187 251 251 187 210 208 158 137 133 100 1 1 1 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 60 60 56
+-110 109 94 105 104 92 105 104 92 84 83 72 65 66 61 51 52 50
+-40 43 41 33 36 34 27 30 29 23 25 24 18 22 22 16 19 19
+-14 17 17 12 15 15 11 14 14 11 14 14 10 13 13 10 13 13
+-10 13 13 10 12 12 10 12 12 10 12 12 10 12 12 10 12 12
+-10 12 12 10 12 12 10 13 13 10 13 13 10 13 13 11 13 13
+-11 13 13 11 14 14 11 14 14 11 14 14 11 14 14 12 15 15
+-12 15 15 12 15 15 12 15 15 13 16 16 13 16 16 13 16 16
+-13 17 17 13 17 17 14 17 17 32 34 33 43 45 43 43 45 43
+-43 45 43 43 45 43 39 40 39 33 36 34 27 29 28 23 24 24
+-21 22 21 17 17 17 15 15 15 13 13 13 12 12 12 12 12 12
+-12 12 12 12 12 12 6 7 7 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 1 1 1 68 70 65 184 179 149 210 208 158 251 251 187
+-251 251 187 214 212 158 184 179 149 37 39 37 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 6 7 7 105 104 92
+-105 104 92 105 104 92 99 98 80 72 73 67 58 59 55 46 47 45
+-35 37 36 30 32 31 25 27 26 20 23 23 16 19 19 14 17 17
+-12 15 15 12 14 14 11 13 13 10 13 13 10 12 12 10 12 12
+-10 12 12 10 12 12 9 12 12 9 12 12 9 12 12 9 12 12
+-10 12 12 10 12 12 10 12 12 10 12 12 10 12 12 10 13 13
+-10 13 13 10 13 13 11 13 13 11 13 13 11 14 14 11 14 14
+-11 14 14 12 15 15 12 15 15 12 15 15 12 15 15 13 16 16
+-13 16 16 13 16 16 17 20 20 41 42 42 46 47 45 46 47 45
+-46 47 45 43 45 43 40 41 39 33 36 34 27 29 28 23 24 24
+-20 20 20 17 17 17 15 15 15 13 13 13 12 12 12 12 12 12
+-12 12 12 12 12 12 4 5 5 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-15 15 15 110 109 94 197 193 154 214 212 158 251 251 187 251 251 187
+-239 239 170 184 179 149 84 83 72 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 47 48 46 105 104 92
+-105 104 92 99 98 80 84 83 72 68 70 65 51 52 50 40 43 41
+-32 34 33 27 29 28 22 24 23 17 21 21 15 18 18 13 16 16
+-12 15 15 11 13 13 10 13 13 10 12 12 9 12 12 9 12 12
+-9 12 12 9 12 12 9 11 11 9 11 11 9 11 11 9 11 11
+-9 12 12 9 12 12 9 12 12 9 12 12 10 12 12 10 12 12
+-10 12 12 10 12 12 10 13 13 10 13 13 10 13 13 11 13 13
+-11 14 14 11 14 14 11 14 14 12 14 14 12 15 15 12 15 15
+-12 15 15 13 16 16 28 31 30 43 45 43 47 48 46 47 48 46
+-47 48 46 43 45 43 40 41 39 33 36 34 27 29 28 22 24 23
+-20 20 20 17 17 17 15 15 15 13 13 13 12 12 12 12 12 12
+-12 12 12 12 12 12 3 4 4 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 60 60 56
+-177 172 135 197 193 154 251 251 187 251 251 187 251 251 187 251 251 187
+-184 179 149 110 109 94 3 4 4 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 1 1 1 99 98 80 105 104 92
+-99 98 80 87 86 72 84 83 72 63 64 60 46 47 45 35 37 36
+-30 32 31 25 27 26 18 22 22 16 19 19 14 17 17 12 15 15
+-11 14 14 10 13 13 9 12 12 9 12 12 9 11 11 9 11 11
+-9 11 11 9 11 11 9 11 11 9 11 11 9 11 11 9 11 11
+-9 11 11 9 11 11 9 11 11 9 11 11 9 12 12 9 12 12
+-9 12 12 10 12 12 10 12 12 10 12 12 10 13 13 10 13 13
+-10 13 13 11 13 13 11 14 14 11 14 14 11 14 14 12 15 15
+-12 15 15 14 17 17 41 42 42 47 48 46 49 51 48 51 52 50
+-47 48 46 43 45 43 40 41 39 33 36 34 27 29 28 22 24 23
+-19 20 19 16 16 16 14 14 13 13 13 13 12 12 12 12 12 12
+-12 12 12 12 12 12 2 2 2 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 23 24 24 137 133 100 184 179 149
+-210 208 158 251 251 187 251 251 187 251 251 187 251 251 187 184 179 149
+-110 109 94 13 13 13 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 30 32 31 105 104 92 99 98 80
+-84 83 72 84 83 72 72 73 67 55 57 54 41 42 42 32 34 33
+-27 29 28 20 24 24 17 20 20 14 17 17 13 16 16 12 14 14
+-10 13 13 10 12 12 9 11 11 9 11 11 9 11 11 9 11 11
+-9 11 11 9 11 11 9 11 11 9 11 11 9 11 11 9 11 11
+-9 11 11 9 11 11 9 11 11 9 11 11 9 11 11 9 11 11
+-9 11 11 9 12 12 9 12 12 10 12 12 10 12 12 10 12 12
+-10 13 13 10 13 13 10 13 13 11 13 13 11 14 14 11 14 14
+-11 14 14 27 29 28 55 56 53 72 73 67 51 52 50 51 52 50
+-49 51 48 43 45 43 39 40 39 32 34 33 26 28 27 21 22 21
+-19 20 19 16 16 16 18 19 17 13 13 13 12 12 12 12 12 12
+-12 12 12 12 12 12 1 1 1 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 8 8 7 84 83 72 184 179 149 197 193 154 251 251 187
+-251 251 187 251 251 187 251 251 187 251 251 187 184 179 149 145 141 105
+-19 20 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 14 14 13 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 72 73 67 105 104 92 84 83 72
+-72 73 67 84 83 72 68 70 65 49 51 48 39 40 39 30 32 31
+-25 27 26 18 22 22 15 18 18 13 16 16 12 15 15 11 13 13
+-10 12 12 9 11 11 9 11 11 9 11 11 9 11 11 9 11 11
+-9 11 11 9 11 11 9 11 11 9 11 11 9 11 11 9 11 11
+-9 11 11 9 11 11 9 11 11 9 11 11 9 11 11 9 11 11
+-9 11 11 9 11 11 9 11 11 9 12 12 9 12 12 9 12 12
+-10 12 12 10 12 12 10 12 12 10 13 13 10 13 13 11 13 13
+-13 16 16 41 42 42 99 98 80 158 153 112 65 66 61 51 52 50
+-49 51 48 43 45 43 39 40 39 31 33 31 25 27 26 21 22 21
+-21 22 21 68 70 65 55 56 53 13 13 13 12 12 12 12 12 12
+-12 12 12 11 11 11 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3
+-63 64 60 158 153 112 184 179 149 210 208 158 251 251 187 251 251 187
+-251 251 187 251 251 187 251 251 187 184 179 149 137 133 100 27 29 28
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-21 22 21 110 109 94 5 6 5 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 13 13 13 105 104 92 90 89 73 72 73 67
+-68 70 65 84 83 72 63 64 60 46 47 45 35 37 36 27 29 28
+-22 24 23 17 20 20 14 17 17 12 15 15 11 14 14 10 12 12
+-10 12 12 9 11 11 9 11 11 9 11 11 9 11 11 9 11 11
+-9 11 11 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 9 11 11 9 11 11 9 11 11 9 11 11 9 11 11
+-9 11 11 9 11 11 9 11 11 9 11 11 9 11 11 9 11 11
+-9 12 12 9 12 12 10 12 12 10 12 12 10 13 13 10 13 13
+-30 32 31 47 48 46 177 172 135 210 208 158 137 133 100 55 56 53
+-49 51 48 43 45 43 38 39 37 31 33 31 25 27 26 22 24 23
+-110 109 94 184 179 149 63 64 60 13 13 13 12 12 12 12 12 12
+-12 12 12 8 9 9 0 0 0 1 1 1 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 21 22 21 105 104 92
+-184 179 149 210 208 158 251 251 187 251 251 187 251 251 187 251 251 187
+-251 251 187 251 251 187 184 179 149 145 141 105 23 24 24 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-68 70 65 184 179 149 105 104 92 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 51 52 50 99 98 80 84 83 72 63 64 60
+-68 70 65 72 73 67 55 57 54 41 42 42 32 34 33 25 27 26
+-20 23 23 16 19 19 13 16 16 12 14 14 10 13 13 10 12 12
+-9 11 11 9 11 11 9 11 11 9 11 11 9 11 11 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 9 11 11 9 11 11
+-9 11 11 9 11 11 9 11 11 9 11 11 9 11 11 9 11 11
+-9 11 11 9 11 11 9 12 12 9 12 12 10 12 12 17 20 20
+-46 47 45 72 73 67 210 208 158 251 251 187 210 208 158 63 64 60
+-49 51 48 43 45 43 37 39 37 30 32 31 24 26 24 105 104 92
+-210 208 158 197 193 154 47 48 46 13 13 13 12 12 12 12 12 12
+-12 12 12 6 7 7 33 36 34 48 49 45 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 8 8 7 23 24 24 55 56 53 110 109 94
+-210 208 158 251 251 187 251 251 187 251 251 187 251 251 187 251 251 187
+-251 251 187 184 179 149 110 109 94 20 20 20 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-110 109 94 251 251 187 210 208 158 47 48 46 0 0 0 0 0 0
+-0 0 0 1 1 1 90 89 73 90 89 73 72 73 67 55 56 53
+-72 73 67 68 70 65 51 52 50 37 39 37 28 31 30 23 25 24
+-17 21 21 15 18 18 12 15 15 11 14 14 10 13 13 9 12 12
+-9 11 11 9 11 11 9 11 11 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 9 11 11 9 11 11 9 11 11 9 11 11 9 11 11
+-9 11 11 9 11 11 9 11 11 9 12 12 13 16 16 41 42 42
+-49 51 48 110 109 94 251 251 187 251 251 187 251 251 187 105 104 92
+-49 51 48 43 45 43 35 37 36 30 31 28 47 48 46 197 193 154
+-251 251 187 197 193 154 31 33 31 12 12 12 12 12 12 12 12 12
+-12 12 12 51 52 50 184 179 149 72 73 67 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2
+-11 11 11 21 22 21 30 32 31 40 41 39 60 60 56 145 141 105
+-251 251 187 251 251 187 251 251 187 251 251 187 251 251 187 214 212 158
+-184 179 149 110 109 94 13 13 13 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 4 5 4 61 61 53 48 49 45 3 4 3
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-156 151 111 251 251 187 251 251 187 184 179 149 11 11 11 0 0 0
+-0 0 0 26 28 27 99 98 80 84 83 72 60 60 56 43 45 43
+-72 73 67 65 66 61 49 51 48 35 37 36 27 29 28 20 24 24
+-17 20 20 14 17 17 12 15 15 11 13 13 10 12 12 9 11 11
+-9 11 11 9 11 11 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 9 11 11 9 11 11
+-9 11 11 9 11 11 9 11 11 11 13 13 37 39 37 47 48 46
+-51 52 50 184 179 149 251 251 187 251 251 187 251 251 187 145 141 105
+-47 48 46 41 42 42 35 37 36 27 29 28 137 133 100 251 251 187
+-251 251 187 197 193 154 19 20 19 12 12 12 12 12 12 12 12 12
+-27 29 28 184 179 149 214 212 158 63 64 60 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 1 1 1 6 7 7 16 16 16 24 26 24
+-30 32 31 38 39 37 47 48 46 55 57 54 68 70 65 110 109 94
+-197 193 154 251 251 187 251 251 187 251 251 187 210 208 158 184 179 149
+-105 104 92 8 8 7 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 65 66 61 184 179 149 156 151 111
+-30 32 31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-168 163 120 251 251 187 251 251 187 251 251 187 110 109 94 0 0 0
+-0 0 0 60 60 56 84 83 72 68 70 65 51 52 50 38 39 37
+-84 83 72 63 64 60 43 45 43 33 36 34 25 27 26 20 23 22
+-15 18 18 13 16 16 12 14 14 10 13 13 9 12 12 9 11 11
+-9 11 11 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-9 11 11 9 11 11 10 12 12 33 36 34 46 47 45 51 52 50
+-72 73 67 210 208 158 251 251 187 251 251 187 251 251 187 177 172 135
+-47 48 46 41 42 42 35 37 36 37 39 37 184 179 149 251 251 187
+-251 251 187 197 193 154 13 13 13 12 12 12 12 12 12 12 12 12
+-110 109 94 251 251 187 251 251 187 37 39 37 0 0 0 0 0 0
+-0 0 0 21 22 20 2 2 1 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-4 5 5 12 12 12 21 22 21 25 27 26 30 32 31 38 39 37
+-46 47 45 55 56 53 60 60 56 65 66 61 68 70 65 105 104 92
+-110 109 94 197 193 154 210 208 158 197 193 154 184 179 149 84 83 72
+-2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 13 13 13 184 179 149 251 251 187
+-197 193 154 43 44 41 0 0 0 0 0 0 0 0 0 0 0 0
+-145 141 105 251 251 187 251 251 187 251 251 187 214 212 158 43 45 43
+-2 2 2 84 83 72 72 73 67 58 59 55 41 42 42 38 39 37
+-72 73 67 58 59 55 41 42 42 31 33 31 25 27 26 18 22 22
+-14 17 17 12 15 15 12 14 14 10 12 12 9 12 12 9 11 11
+-9 11 11 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 9 12 12 31 33 31 43 45 43 49 51 48 55 56 53
+-110 109 94 251 251 187 251 251 187 251 251 187 251 251 187 168 163 120
+-47 48 46 41 42 42 33 36 34 63 64 60 197 193 154 251 251 187
+-251 251 187 184 179 149 13 13 13 12 12 12 12 12 12 16 16 16
+-197 193 154 251 251 187 239 239 170 20 20 20 0 0 0 2 2 1
+-108 107 93 110 109 94 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 1 1 1 4 5 5 11 11 11 18 19 18
+-22 24 23 26 28 27 32 34 33 39 40 39 46 47 45 51 52 50
+-55 57 54 60 60 56 63 64 60 63 64 60 63 64 60 58 59 55
+-63 64 60 99 98 80 145 141 105 137 133 100 43 45 43 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 3 4 3 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 110 109 94 251 251 187
+-251 251 187 184 179 149 25 27 26 0 0 0 0 0 0 0 0 0
+-99 98 80 251 251 187 251 251 187 251 251 187 251 251 187 156 151 111
+-25 27 26 84 83 72 65 66 61 47 48 46 32 34 33 39 40 39
+-72 73 67 55 57 54 40 41 39 30 32 31 23 25 24 18 22 22
+-14 17 17 12 15 15 11 13 13 10 12 12 9 11 11 9 11 11
+-9 11 11 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-9 11 11 28 31 30 41 42 42 47 48 46 55 56 53 58 59 55
+-137 133 100 251 251 187 251 251 187 251 251 187 210 208 158 137 133 100
+-47 48 46 40 41 39 32 34 33 75 75 61 184 179 149 239 239 170
+-251 251 187 177 172 135 13 13 13 12 12 12 12 12 12 43 44 41
+-197 193 154 251 251 187 210 208 158 10 10 9 0 0 0 84 83 72
+-251 251 187 84 83 72 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+-6 7 7 11 11 11 17 17 17 20 20 20 23 24 24 27 29 28
+-32 34 33 38 39 37 43 45 43 47 48 46 51 52 50 55 56 53
+-58 59 55 58 59 55 55 57 54 55 56 53 47 48 46 41 42 42
+-35 37 36 31 33 31 47 48 46 14 14 13 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 66 65 55 99 98 80 20 20 20
+-0 0 0 0 0 0 0 0 0 0 0 0 43 45 43 214 212 158
+-251 251 187 251 251 187 145 141 105 3 3 3 0 0 0 0 0 0
+-48 49 45 184 179 149 239 239 170 251 251 187 239 239 170 177 172 135
+-84 83 72 72 73 67 55 56 53 39 40 39 26 28 27 39 40 39
+-68 70 65 51 52 50 39 40 39 28 31 30 22 24 23 17 20 20
+-14 17 17 12 14 14 10 13 13 9 11 11 9 11 11 9 11 11
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-27 29 28 40 41 39 46 47 45 51 52 50 55 57 54 63 64 60
+-131 127 93 197 193 154 210 208 158 197 193 154 168 163 120 96 95 69
+-47 48 46 40 41 39 32 34 33 71 71 57 145 141 105 184 179 149
+-184 179 149 131 127 93 13 13 13 12 12 12 12 12 12 48 49 45
+-168 163 120 184 179 149 156 151 111 6 7 7 14 14 13 177 172 135
+-239 239 170 40 41 39 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 3 3 3 6 7 7 11 11 11 16 16 16
+-18 19 18 21 22 21 23 24 24 27 29 28 32 34 33 37 39 37
+-41 42 42 43 45 43 47 48 46 51 52 50 51 52 50 51 52 50
+-51 52 50 49 51 48 46 47 45 40 41 39 32 34 33 25 27 26
+-20 20 20 14 14 13 2 2 2 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 33 36 34 197 193 154 184 179 149
+-41 42 42 0 0 0 0 0 0 0 0 0 3 3 3 184 179 149
+-251 251 187 251 251 187 184 179 149 48 49 45 0 0 0 0 0 0
+-16 17 12 121 119 87 177 172 135 194 189 146 188 184 146 145 141 105
+-82 81 62 63 64 60 46 47 45 31 33 31 21 22 21 35 37 36
+-68 70 65 51 52 50 37 39 37 27 30 29 22 24 23 17 20 20
+-13 16 16 12 14 14 10 13 13 9 11 11 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 25 27 26
+-38 39 37 43 45 43 51 52 50 55 56 53 60 60 56 63 64 60
+-92 91 72 158 153 112 176 171 126 171 165 117 149 143 98 82 81 62
+-44 46 43 38 39 37 30 32 31 71 71 57 131 127 93 160 154 106
+-149 143 98 82 81 62 13 13 13 12 12 12 12 12 12 46 47 43
+-121 119 87 134 131 96 96 95 69 7 7 6 38 39 37 131 127 93
+-145 141 105 12 13 12 0 0 0 1 1 1 3 3 3 6 7 7
+-10 10 9 12 12 12 14 14 13 16 16 16 18 19 18 21 22 21
+-22 24 23 26 28 27 30 31 28 33 36 34 37 39 37 40 41 39
+-41 42 42 43 45 43 46 47 45 46 47 45 46 47 45 43 45 43
+-41 42 42 37 39 37 31 33 31 26 28 27 21 22 21 16 16 16
+-6 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 177 172 135 251 251 187
+-197 193 154 27 29 28 0 0 0 0 0 0 0 0 0 110 109 94
+-239 239 170 239 239 170 184 179 149 87 86 72 2 2 1 0 0 0
+-1 1 1 82 81 62 142 137 94 165 161 109 165 161 109 131 127 93
+-75 75 61 55 56 53 37 39 37 25 27 26 19 20 19 32 34 33
+-65 66 61 49 51 48 35 37 36 27 29 28 20 23 23 16 19 19
+-13 16 16 13 13 13 10 12 12 9 11 11 8 10 10 8 10 10
+-8 9 9 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 22 24 23 35 37 36
+-41 42 42 47 48 46 55 56 53 58 59 55 63 64 60 65 66 61
+-71 71 57 131 127 93 160 154 106 160 154 106 142 137 94 82 81 62
+-46 47 43 40 41 39 33 36 34 66 65 55 125 122 87 149 143 98
+-142 137 94 82 81 62 17 17 17 18 19 17 14 14 13 46 47 43
+-118 116 76 125 122 87 96 95 69 16 17 12 71 71 57 103 101 77
+-82 81 62 11 11 11 11 11 11 13 13 13 14 14 13 14 14 13
+-15 15 15 16 16 16 17 17 17 19 20 19 21 22 21 23 24 24
+-26 28 27 27 29 28 31 33 31 33 36 34 35 37 36 38 39 37
+-39 40 39 39 40 39 38 39 37 37 39 37 35 37 36 31 33 31
+-27 29 28 24 26 24 21 22 21 17 17 17 12 12 12 2 2 2
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 68 70 65 251 251 187
+-251 251 187 156 151 111 2 2 1 0 0 0 0 0 0 43 44 41
+-177 172 135 184 179 149 158 153 112 103 101 77 19 20 18 0 0 0
+-0 0 0 46 47 43 131 127 93 160 154 106 160 154 106 131 127 93
+-71 71 57 43 45 43 30 32 31 21 22 21 16 16 16 26 28 27
+-63 64 60 47 48 46 35 37 36 26 28 27 20 23 23 16 19 19
+-13 16 16 13 13 13 10 12 12 9 11 11 8 10 10 8 10 10
+-7 9 9 7 9 9 8 9 9 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 20 20 20 33 36 34 40 41 39
+-46 47 45 51 52 50 55 57 54 60 60 56 63 64 60 65 66 61
+-66 65 55 118 116 76 151 147 98 165 161 109 151 147 98 121 119 87
+-96 95 69 96 95 69 96 95 69 103 101 77 142 137 94 151 147 98
+-142 137 94 103 101 77 82 81 62 82 81 62 82 81 62 96 95 69
+-131 127 93 142 137 94 103 101 77 46 47 43 96 95 69 118 116 76
+-71 71 57 14 14 13 14 14 13 15 15 15 15 15 15 16 16 16
+-16 16 16 17 17 17 18 19 18 20 20 20 21 22 21 23 24 24
+-25 27 26 27 29 28 30 31 28 30 32 31 31 33 31 31 33 31
+-31 33 31 31 33 31 30 31 28 27 29 28 25 27 26 22 24 23
+-20 20 20 16 16 16 13 13 13 6 7 7 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-58 59 55 68 70 65 8 8 7 0 0 0 10 10 9 210 208 158
+-251 251 187 184 179 149 38 39 37 0 0 0 0 0 0 8 8 7
+-103 101 77 149 143 98 149 143 98 118 116 76 40 41 39 25 27 25
+-53 55 47 82 81 62 144 139 99 165 161 109 165 161 109 142 137 94
+-71 71 57 35 37 36 24 26 24 18 19 18 15 15 15 22 24 23
+-63 64 60 46 47 45 33 36 34 26 28 27 20 23 22 17 18 17
+-12 15 15 11 13 13 10 12 12 9 11 11 8 10 10 8 10 10
+-7 9 9 7 9 9 7 9 9 7 9 9 8 9 9 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 16 16 16 30 31 28 35 37 36 41 42 42
+-47 48 46 55 56 53 58 59 55 63 64 60 65 66 61 65 66 61
+-61 61 53 103 101 77 151 147 98 171 165 117 171 165 117 168 163 120
+-158 153 112 158 153 112 155 149 109 151 147 98 151 147 98 160 154 106
+-151 147 98 149 143 98 142 137 94 149 143 98 149 143 98 149 143 98
+-155 149 109 151 147 98 131 127 93 103 101 77 125 122 87 118 116 76
+-71 71 57 16 16 16 16 16 16 16 16 16 17 17 17 17 17 17
+-17 17 17 17 17 17 18 19 18 19 20 19 20 20 20 21 22 21
+-23 24 24 24 26 24 25 27 26 26 28 27 26 28 27 26 28 27
+-25 27 26 24 26 24 22 24 23 21 22 21 19 20 19 16 16 16
+-14 14 13 8 8 7 1 1 1 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-20 20 20 184 179 149 168 163 120 21 22 21 0 0 0 105 104 92
+-177 172 135 145 141 105 71 71 57 0 0 0 0 0 0 0 0 0
+-66 65 55 131 127 93 151 147 98 142 137 94 118 116 76 121 119 87
+-145 141 105 158 153 112 176 171 126 178 174 128 176 171 126 149 145 103
+-96 95 69 31 33 31 21 22 21 16 16 16 14 14 13 18 19 18
+-60 60 56 46 47 45 33 36 34 25 27 26 21 22 21 15 18 18
+-12 15 15 11 13 13 9 11 11 8 10 10 8 10 10 8 9 9
+-7 9 9 7 9 9 7 9 9 7 9 9 7 9 9 8 9 9
+-8 9 9 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 10 12 12 26 28 27 31 33 31 38 39 37 43 45 43
+-51 52 50 55 56 53 60 60 56 63 64 60 65 66 61 68 70 65
+-63 64 60 96 95 69 158 153 112 178 174 128 188 184 146 194 189 146
+-194 189 146 188 184 146 184 181 136 176 171 126 171 165 117 173 167 111
+-173 167 111 165 161 109 171 165 117 174 170 121 176 171 126 178 174 128
+-178 174 128 174 170 121 160 154 106 149 143 98 149 143 98 125 122 87
+-71 71 57 16 16 16 16 16 16 17 17 17 17 17 17 17 17 17
+-17 17 17 17 17 17 17 17 17 18 19 18 19 20 19 20 20 20
+-21 22 21 21 22 21 21 22 21 22 24 23 21 22 21 21 22 21
+-21 22 21 19 20 19 18 19 18 16 16 16 14 14 13 11 11 11
+-3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 105 104 92 197 193 154 110 109 94 9 9 8 36 38 35
+-121 119 87 131 127 93 96 95 69 18 19 17 30 31 28 66 65 55
+-96 95 69 142 137 94 160 154 106 160 154 106 160 154 106 168 163 120
+-184 181 136 194 191 148 197 193 154 197 193 154 194 189 146 168 163 120
+-125 122 87 46 47 43 18 19 18 15 15 15 13 13 13 14 14 13
+-55 57 54 43 45 43 32 34 33 25 27 26 18 22 22 17 17 17
+-12 14 14 10 12 12 9 11 11 8 10 10 8 9 9 7 9 9
+-6 8 8 7 9 9 7 9 9 7 9 9 7 9 9 7 9 9
+-7 9 9 8 9 9 8 9 9 8 10 10 8 10 10 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 32 34 33 41 42 42 35 37 36 39 40 39 37 39 37
+-35 37 36 55 57 54 60 60 56 63 64 60 65 66 61 65 66 61
+-61 63 57 115 113 82 168 163 120 194 191 148 204 201 155 210 208 158
+-210 208 158 210 208 158 197 193 154 194 189 146 186 182 128 176 171 126
+-174 170 121 176 171 126 186 182 128 190 186 136 194 191 148 197 193 154
+-197 193 154 188 184 146 181 176 137 174 170 121 165 161 109 142 137 94
+-82 81 62 24 26 24 16 16 16 16 16 16 16 16 16 16 16 16
+-17 17 17 17 17 17 17 17 17 17 17 17 18 19 18 19 20 19
+-19 20 19 19 20 19 20 20 20 19 20 19 19 20 19 18 19 18
+-17 17 17 15 15 15 13 13 13 12 12 12 6 7 7 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 17 18 17 137 133 100 115 113 82 53 55 47 19 20 18
+-103 101 77 144 139 99 137 133 100 115 113 82 137 133 100 156 151 111
+-158 153 112 164 159 111 171 165 117 174 170 121 178 174 128 194 189 146
+-204 201 155 214 212 158 214 212 158 214 212 158 210 208 158 188 184 146
+-158 153 112 87 86 72 17 17 17 13 13 13 13 13 13 15 15 15
+-55 56 53 43 45 43 32 34 33 24 26 24 17 20 20 16 16 16
+-12 14 14 10 12 12 8 10 10 8 10 10 7 9 9 6 8 8
+-6 8 8 6 8 8 6 8 8 7 9 9 7 9 9 7 9 9
+-7 9 9 7 9 9 7 9 9 7 9 9 8 9 9 8 10 10
+-8 10 10 8 10 10 8 10 10 8 10 10 8 10 10 8 10 10
+-8 10 10 110 109 94 84 83 72 49 51 48 26 28 27 8 10 10
+-8 9 9 51 52 50 58 59 55 63 64 60 63 64 60 63 64 60
+-66 65 55 134 131 96 181 176 137 210 208 158 214 212 158 239 239 170
+-239 239 170 224 223 159 210 208 158 204 201 155 194 189 146 186 182 128
+-186 182 128 184 181 136 194 189 146 204 201 155 210 208 158 210 208 158
+-210 208 158 210 208 158 197 193 154 190 186 136 176 171 126 155 149 109
+-118 116 76 36 38 35 15 15 15 16 16 16 16 16 16 16 16 16
+-16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 17 17 17
+-17 17 17 17 17 17 17 17 17 16 16 16 16 16 16 15 15 15
+-13 13 13 12 12 12 8 8 7 2 2 2 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 53 55 47 103 101 77 96 95 69 53 55 47
+-103 101 77 158 153 112 177 172 135 184 179 149 188 184 146 197 193 154
+-194 189 146 190 186 136 184 181 136 184 181 136 194 189 146 210 208 158
+-214 212 158 239 239 170 251 251 187 251 251 187 224 223 159 204 201 155
+-177 172 135 121 119 87 30 31 28 13 13 13 12 12 12 39 40 39
+-60 60 56 43 45 43 32 34 33 23 25 24 18 19 18 13 16 16
+-13 13 13 9 11 11 8 10 10 8 9 9 6 8 8 6 8 8
+-6 8 8 6 8 8 6 8 8 6 8 8 6 8 8 7 9 9
+-7 9 9 7 9 9 7 9 9 7 9 9 7 9 9 7 9 9
+-7 9 9 8 9 9 8 9 9 8 10 10 8 10 10 8 10 10
+-14 17 17 197 193 154 158 153 112 55 57 54 7 9 9 7 9 9
+-8 10 10 51 52 50 58 59 55 60 60 56 63 64 60 63 64 60
+-71 71 57 155 149 109 194 191 148 214 212 158 251 251 187 251 251 187
+-251 251 187 251 251 187 239 239 170 210 208 158 197 193 154 190 186 136
+-190 186 136 194 189 146 204 201 155 210 208 158 224 223 159 239 239 170
+-239 239 170 224 223 159 210 208 158 204 201 155 190 186 136 164 159 111
+-125 122 87 40 41 39 15 15 15 15 15 15 15 15 15 15 15 15
+-16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+-16 16 16 16 16 16 15 15 15 14 14 13 13 13 13 12 12 12
+-8 9 9 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 21 22 20 96 95 69 125 122 87 121 119 87
+-144 139 99 177 172 135 197 193 154 210 208 158 214 212 158 214 212 158
+-210 208 158 204 201 155 194 191 148 194 189 146 204 201 155 214 212 158
+-239 239 170 251 251 187 251 251 187 251 251 187 251 251 187 214 212 158
+-188 184 146 145 141 105 53 55 47 12 12 12 15 15 15 63 64 60
+-63 64 60 41 42 42 31 33 31 23 24 24 17 18 17 12 15 15
+-11 13 13 9 11 11 8 9 9 7 9 9 6 8 8 6 8 8
+-6 7 7 6 7 7 6 8 8 6 8 8 6 8 8 6 8 8
+-6 8 8 7 9 9 7 9 9 7 9 9 7 9 9 7 9 9
+-7 9 9 7 9 9 7 9 9 7 9 9 7 9 9 8 8 7
+-43 45 43 251 251 187 156 151 111 8 10 10 7 9 9 7 9 9
+-21 22 21 51 52 50 55 56 53 55 57 54 58 59 55 58 59 55
+-75 75 61 158 153 112 197 193 154 224 223 159 251 251 187 251 251 187
+-251 251 187 251 251 187 251 251 187 214 212 158 204 201 155 194 189 146
+-190 186 136 197 193 154 210 208 158 224 223 159 251 251 187 251 251 187
+-251 251 187 251 251 187 239 239 170 210 208 158 197 193 154 176 171 126
+-125 122 87 36 38 35 14 14 13 14 14 13 15 15 15 15 15 15
+-15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+-15 15 15 14 14 13 13 13 13 12 12 12 10 10 9 3 4 4
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 7 7 5 71 71 57 131 127 93 158 153 112
+-177 172 135 197 193 154 214 212 158 239 239 170 251 251 187 251 251 187
+-238 237 168 210 208 158 204 201 155 197 193 154 204 201 155 214 212 158
+-251 251 187 251 251 187 251 251 187 251 251 187 251 251 187 214 212 158
+-197 193 154 156 151 111 66 65 55 12 12 12 37 39 37 58 59 55
+-58 59 55 41 42 42 31 33 31 22 24 23 17 17 17 12 14 14
+-10 12 12 8 10 10 6 8 8 6 8 8 6 7 7 6 7 7
+-6 7 7 5 7 7 6 7 7 6 7 7 6 8 8 6 8 8
+-6 8 8 6 8 8 6 8 8 7 9 9 7 9 9 7 9 9
+-7 9 9 6 8 8 6 8 8 6 8 8 6 8 8 6 8 8
+-61 63 57 197 193 154 16 19 19 6 8 8 6 8 8 8 9 9
+-41 42 42 47 48 46 51 52 50 51 52 50 55 56 53 55 56 53
+-71 71 57 158 153 112 197 193 154 224 223 159 251 251 187 251 251 187
+-251 251 187 251 251 187 239 239 170 214 212 158 204 201 155 194 189 146
+-190 186 136 197 193 154 210 208 158 239 239 170 251 251 187 251 251 187
+-251 251 187 251 251 187 251 251 187 224 223 159 204 201 155 177 172 135
+-121 119 87 30 31 28 13 13 13 14 14 13 14 14 13 14 14 13
+-14 14 13 14 14 13 15 15 15 15 15 15 14 14 13 13 13 13
+-12 12 12 12 12 12 10 10 9 4 5 5 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 48 49 45 131 127 93 174 170 121
+-194 189 146 210 208 158 239 239 170 251 251 187 251 251 187 251 251 187
+-251 251 187 214 212 158 204 201 155 197 193 154 204 201 155 210 208 158
+-239 239 170 251 251 187 251 251 187 251 251 187 239 239 170 214 212 158
+-194 191 148 156 151 111 71 71 57 19 20 19 51 52 50 51 52 50
+-51 52 50 41 42 42 30 32 31 21 22 21 17 17 17 13 13 13
+-9 11 11 8 9 9 6 8 8 6 7 7 6 7 7 5 7 7
+-5 6 5 5 6 5 5 7 7 5 7 7 6 7 7 6 7 7
+-6 8 8 6 8 8 6 8 8 6 7 7 6 7 7 6 7 7
+-6 7 7 6 8 8 6 8 8 6 8 8 6 8 8 6 8 8
+-55 56 53 43 45 43 6 8 8 6 8 8 6 8 8 47 48 46
+-60 60 56 47 48 46 46 47 45 47 48 46 38 39 37 10 12 12
+-66 65 55 145 141 105 197 193 154 214 212 158 251 251 187 251 251 187
+-251 251 187 251 251 187 224 223 159 210 208 158 194 191 148 184 181 136
+-184 181 136 194 189 146 204 201 155 224 223 159 251 251 187 251 251 187
+-251 251 187 251 251 187 251 251 187 239 239 170 210 208 158 181 176 137
+-115 113 82 21 22 20 13 13 13 13 13 13 13 13 13 13 13 13
+-14 14 13 13 13 13 13 13 13 13 13 13 12 12 12 11 11 11
+-10 10 9 6 7 7 1 1 1 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 2 2 1 66 65 55 144 139 99 178 174 128
+-204 201 155 214 212 158 251 251 187 251 251 187 251 251 187 251 251 187
+-251 251 187 214 212 158 204 201 155 194 191 148 197 193 154 204 201 155
+-214 212 158 239 239 170 239 239 170 239 239 170 214 212 158 210 208 158
+-184 181 136 149 145 103 66 65 55 41 42 42 47 48 46 46 47 45
+-43 45 43 39 40 39 28 31 30 21 22 21 16 16 16 10 12 12
+-8 10 10 6 8 8 6 7 7 6 7 7 5 6 5 5 6 5
+-5 6 5 5 6 5 5 6 5 5 6 5 5 7 7 5 7 7
+-6 7 7 6 7 7 6 7 7 5 7 7 5 7 7 5 7 7
+-5 7 7 6 7 7 6 7 7 6 7 7 6 7 7 6 8 8
+-6 8 8 6 8 8 6 7 7 6 7 7 46 47 45 156 151 111
+-105 104 92 58 59 55 43 45 43 32 34 33 6 8 8 6 8 8
+-49 51 48 125 122 87 181 176 137 204 201 155 214 212 158 239 239 170
+-239 239 170 214 212 158 210 208 158 197 193 154 181 176 137 176 171 126
+-176 171 126 184 181 136 197 193 154 210 208 158 239 239 170 251 251 187
+-251 251 187 251 251 187 251 251 187 251 251 187 210 208 158 177 172 135
+-99 98 80 13 13 13 12 12 12 12 12 12 13 13 13 12 12 12
+-12 12 12 12 12 12 11 11 11 11 11 11 8 9 9 4 5 5
+-1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 1 1 0 61 61 53 142 137 94 181 176 137
+-204 201 155 224 223 159 251 251 187 251 251 187 251 251 187 251 251 187
+-251 251 187 214 212 158 197 193 154 190 186 136 184 181 136 188 184 146
+-197 193 154 204 201 155 210 208 158 210 208 158 204 201 155 194 189 146
+-176 171 126 134 131 96 66 65 55 43 45 43 41 42 42 39 40 39
+-35 37 36 33 36 34 27 29 28 20 20 20 15 15 15 9 11 11
+-8 9 9 6 7 7 5 6 5 5 6 5 4 5 5 4 5 5
+-4 5 5 4 5 5 4 5 5 4 5 5 5 6 5 4 5 5
+-4 5 5 5 6 5 4 5 5 5 6 5 5 6 5 5 6 5
+-5 7 7 5 7 7 5 7 7 5 7 7 5 7 7 5 7 7
+-6 7 7 6 7 7 6 7 7 28 31 30 184 179 149 184 179 149
+-145 141 105 84 83 72 27 29 28 5 7 7 5 6 5 16 16 16
+-43 44 41 96 95 69 158 153 112 188 184 146 204 201 155 210 208 158
+-204 201 155 197 193 154 184 179 149 177 172 135 168 163 120 164 159 111
+-164 159 111 174 170 121 184 181 136 197 193 154 214 212 158 251 251 187
+-251 251 187 251 251 187 251 251 187 251 251 187 210 208 158 177 172 135
+-71 71 57 11 11 11 12 12 12 11 11 11 11 11 11 11 11 11
+-10 10 9 10 10 9 8 8 7 3 4 4 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 31 33 31 121 119 87 176 171 126
+-197 193 154 214 212 158 251 251 187 251 251 187 251 251 187 251 251 187
+-239 239 170 210 208 158 194 189 146 178 174 128 174 170 121 176 171 126
+-177 172 135 181 176 137 184 179 149 184 179 149 181 176 137 178 174 128
+-158 153 112 121 119 87 53 55 47 37 39 37 33 36 34 30 32 31
+-27 29 28 25 27 26 24 26 24 19 20 19 13 13 13 8 10 10
+-6 8 8 6 7 7 5 6 5 4 5 5 4 5 5 4 5 5
+-4 5 5 4 5 5 4 5 5 3 4 4 3 4 4 4 5 5
+-4 5 5 4 5 5 4 5 5 4 5 5 4 5 5 4 5 5
+-5 6 5 5 6 5 5 6 5 5 6 5 5 6 5 5 6 5
+-5 6 5 5 6 5 12 14 14 145 141 105 184 179 149 177 172 135
+-90 89 73 21 22 21 5 6 5 5 6 5 4 5 5 37 39 37
+-38 39 37 61 61 53 134 131 96 168 163 120 184 181 136 188 184 146
+-184 179 149 177 172 135 168 163 120 164 159 111 155 149 109 151 147 98
+-151 147 98 164 159 111 176 171 126 184 179 149 210 208 158 239 239 170
+-251 251 187 251 251 187 251 251 187 239 239 170 210 208 158 158 153 112
+-46 47 43 10 10 9 10 10 9 10 10 9 8 9 9 8 9 9
+-6 7 7 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 13 12 7 82 81 62 158 153 112
+-188 184 146 210 208 158 239 239 170 251 251 187 251 251 187 251 251 187
+-224 223 159 204 201 155 184 181 136 171 165 117 164 159 111 160 154 106
+-158 153 112 164 159 111 168 163 120 168 163 120 168 163 120 164 159 111
+-142 137 94 96 95 69 43 44 41 27 29 28 26 28 27 23 24 24
+-21 22 21 18 19 18 17 17 17 18 19 18 13 13 13 8 8 7
+-6 7 7 5 6 5 4 5 5 3 4 4 3 4 4 3 4 4
+-3 4 4 3 4 4 3 3 3 3 3 3 3 4 4 3 4 4
+-3 4 4 3 4 4 4 5 5 4 5 5 4 5 5 4 5 5
+-4 5 5 4 5 5 4 5 5 4 5 5 4 5 5 4 5 5
+-4 5 5 4 5 5 4 5 5 4 5 5 4 5 5 4 5 5
+-4 5 5 4 5 5 4 5 5 4 5 5 31 33 31 65 66 61
+-37 39 37 38 39 37 96 95 69 144 139 99 168 163 120 174 170 121
+-168 163 120 164 159 111 155 149 109 149 145 103 149 143 98 142 137 94
+-149 143 98 151 147 98 164 159 111 177 172 135 197 193 154 210 208 158
+-251 251 187 251 251 187 251 251 187 239 239 170 197 193 154 137 133 100
+-24 26 24 8 9 9 8 9 9 8 8 7 6 7 7 2 2 2
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 46 47 43 125 122 87
+-176 171 126 197 193 154 210 208 158 239 239 170 251 251 187 239 239 170
+-214 212 158 197 193 154 181 176 137 164 159 111 151 147 98 149 143 98
+-149 143 98 149 143 98 149 145 103 155 149 109 160 154 106 149 143 98
+-118 116 76 82 81 62 30 31 28 21 22 21 19 20 19 17 17 17
+-14 14 13 12 12 12 10 10 9 12 12 12 10 12 12 6 8 8
+-4 5 5 3 4 4 3 4 4 3 4 4 3 3 3 3 3 3
+-3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 2 3 3
+-3 4 4 3 4 4 3 4 4 3 4 4 3 4 4 4 5 5
+-4 5 5 3 4 4 3 4 4 3 4 4 3 4 4 3 4 4
+-4 5 5 4 5 5 4 5 5 4 5 5 4 5 5 4 5 5
+-4 5 5 3 4 4 3 4 4 23 24 24 110 109 94 72 73 67
+-39 40 39 22 24 23 46 47 43 103 101 77 142 137 94 155 149 109
+-160 154 106 155 149 109 149 143 98 142 137 94 142 137 94 142 137 94
+-142 137 94 149 143 98 155 149 109 176 171 126 184 179 149 210 208 158
+-239 239 170 251 251 187 251 251 187 214 212 158 184 179 149 105 104 92
+-10 10 9 6 7 7 3 4 4 1 1 1 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 12 12 9 82 81 62
+-149 145 103 181 176 137 197 193 154 210 208 158 214 212 158 214 212 158
+-210 208 158 197 193 154 177 172 135 158 153 112 149 143 98 142 137 94
+-142 137 94 142 137 94 149 143 98 151 147 98 151 147 98 131 127 93
+-103 101 77 71 71 57 22 24 23 15 15 15 13 13 13 11 11 11
+-8 9 9 6 7 7 6 7 7 4 5 5 8 9 9 6 7 7
+-4 5 5 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2
+-2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3
+-2 3 3 2 3 3 2 3 3 3 4 4 3 4 4 3 4 4
+-3 4 4 3 4 4 3 3 3 3 4 4 3 4 4 3 4 4
+-3 4 4 3 4 4 3 4 4 3 4 4 3 4 4 3 4 4
+-3 4 4 3 4 4 21 22 21 145 141 105 145 141 105 72 73 67
+-17 18 17 3 4 4 21 22 20 66 65 55 118 116 76 142 137 94
+-149 143 98 151 147 98 149 143 98 142 137 94 142 137 94 142 137 94
+-142 137 94 149 143 98 155 149 109 168 163 120 184 179 149 210 208 158
+-239 239 170 251 251 187 251 251 187 210 208 158 177 172 135 71 71 57
+-3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 36 38 35
+-115 113 82 158 153 112 181 176 137 197 193 154 204 201 155 210 208 158
+-204 201 155 188 184 146 177 172 135 164 159 111 149 145 103 142 137 94
+-142 137 94 142 137 94 149 143 98 151 147 98 149 143 98 125 122 87
+-96 95 69 61 61 53 16 17 12 8 9 9 8 8 7 6 7 7
+-4 5 5 3 4 4 3 3 3 3 3 3 3 3 3 5 6 5
+-3 4 4 2 3 3 2 2 2 2 2 2 2 2 2 2 2 2
+-2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2
+-2 2 2 2 2 2 2 3 3 2 3 3 2 3 3 2 3 3
+-3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+-3 3 3 2 3 3 2 3 3 3 4 4 3 4 4 3 4 4
+-3 4 4 3 4 4 3 4 4 8 9 9 8 8 7 3 3 3
+-3 3 3 3 3 3 9 9 8 36 38 35 82 81 62 118 116 76
+-142 137 94 151 147 98 151 147 98 151 147 98 149 143 98 149 143 98
+-149 143 98 151 147 98 160 154 106 176 171 126 188 184 146 210 208 158
+-239 239 170 251 251 187 239 239 170 210 208 158 156 151 111 31 33 31
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 7 5
+-66 65 55 125 122 87 158 153 112 181 176 137 194 189 146 197 193 154
+-197 193 154 184 179 149 177 172 135 168 163 120 156 151 111 151 147 98
+-151 147 98 151 147 98 151 147 98 161 156 96 149 143 98 118 116 76
+-82 81 62 53 55 47 12 12 9 4 5 5 3 4 4 3 3 3
+-3 3 3 3 3 3 2 2 2 2 2 2 1 1 1 1 2 2
+-3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+-1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 1 2 2
+-1 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 3 3
+-2 3 3 2 3 3 2 3 3 2 3 3 2 2 2 2 2 2
+-2 3 3 2 3 3 2 3 3 2 3 3 2 3 3 2 3 3
+-2 3 3 2 3 3 2 3 3 2 3 3 2 3 3 3 3 3
+-3 3 3 3 3 3 72 73 67 61 61 53 53 55 47 96 95 69
+-131 127 93 151 147 98 161 156 96 161 156 96 151 147 98 151 147 98
+-161 156 96 160 154 106 164 159 111 177 172 135 197 193 154 210 208 158
+-239 239 170 251 251 187 224 223 159 197 193 154 131 127 93 9 9 8
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-24 26 24 82 81 62 131 127 93 164 159 111 178 174 128 188 184 146
+-188 184 146 188 184 146 181 176 137 176 171 126 168 163 120 164 159 111
+-160 154 106 160 154 106 160 154 106 160 154 106 151 147 98 125 122 87
+-82 81 62 61 61 53 12 12 9 3 3 3 3 3 3 2 2 2
+-2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+-0 0 0 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 2 2 1 2 2 1 2 2 1 2 2
+-1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+-2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+-2 3 3 2 3 3 2 3 3 2 3 3 2 3 3 2 3 3
+-2 3 3 30 32 31 72 73 67 31 33 31 36 38 35 82 81 62
+-118 116 76 149 143 98 161 156 96 161 156 96 161 156 96 160 154 106
+-165 161 109 165 161 109 176 171 126 188 184 146 204 201 155 214 212 158
+-239 239 170 239 239 170 214 212 158 184 179 149 82 81 62 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-2 2 2 43 44 41 96 95 69 131 127 93 160 154 106 176 171 126
+-184 181 136 184 181 136 184 181 136 181 176 137 178 174 128 174 170 121
+-171 165 117 173 167 111 173 167 111 173 167 111 160 154 106 131 127 93
+-96 95 69 66 65 55 16 17 12 2 2 2 1 1 1 1 1 1
+-1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 2 2 2
+-2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+-2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+-2 2 2 2 2 2 2 2 2 10 9 6 30 31 28 71 71 57
+-118 116 76 149 143 98 165 161 109 165 161 109 165 161 109 173 167 111
+-173 167 111 176 171 126 184 181 136 197 193 154 210 208 158 224 223 159
+-251 251 187 239 239 170 210 208 158 168 163 120 40 41 39 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 13 12 7 61 61 53 96 95 69 131 127 93 160 154 106
+-176 171 126 184 181 136 184 181 136 188 184 146 184 181 136 184 181 136
+-184 181 136 186 182 128 186 182 128 178 174 128 174 170 121 149 145 103
+-118 116 76 82 81 62 21 22 20 1 1 1 1 1 1 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2
+-1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 2 2 2
+-2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+-2 2 2 2 2 2 2 2 2 3 3 3 30 31 28 66 65 55
+-118 116 76 149 143 98 165 161 109 173 167 111 173 167 111 174 170 121
+-186 182 128 190 186 136 197 193 154 210 208 158 224 223 159 251 251 187
+-251 251 187 239 239 170 197 193 154 137 133 100 12 12 9 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 30 31 28 71 71 57 103 101 77 134 131 96
+-164 159 111 176 171 126 184 181 136 188 184 146 194 189 146 197 193 154
+-197 193 154 197 193 154 194 191 148 194 189 146 190 186 136 176 171 126
+-145 141 105 103 101 77 40 41 39 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 1 2 2
+-1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2
+-1 2 2 1 2 2 1 2 2 1 2 2 30 31 28 71 71 57
+-118 116 76 160 154 106 173 167 111 178 174 128 186 182 128 190 186 136
+-194 191 148 204 201 155 210 208 158 224 223 159 251 251 187 251 251 187
+-251 251 187 214 212 158 184 179 149 84 83 72 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 5 5 3 43 44 41 82 81 62 103 101 77
+-142 137 94 165 161 109 178 174 128 190 186 136 197 193 154 204 201 155
+-210 208 158 210 208 158 210 208 158 210 208 158 210 208 158 197 193 154
+-177 172 135 145 141 105 79 78 62 5 4 3 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 2 2 1 2 2 30 31 28 82 81 62
+-142 137 94 165 161 109 178 174 128 190 186 136 194 191 148 204 201 155
+-210 208 158 214 212 158 239 239 170 251 251 187 251 251 187 251 251 187
+-251 251 187 210 208 158 168 163 120 36 38 35 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 16 17 12 53 55 47 82 81 62
+-118 116 76 151 147 98 171 165 117 184 181 136 194 191 148 210 208 158
+-214 212 158 224 223 159 239 239 170 239 239 170 224 223 159 214 212 158
+-197 193 154 176 171 126 115 113 82 24 26 24 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 40 41 39 103 101 77
+-151 147 98 176 171 126 190 186 136 197 193 154 210 208 158 214 212 158
+-239 239 170 251 251 187 251 251 187 251 251 187 251 251 187 251 251 187
+-239 239 170 197 193 154 110 109 94 3 4 3 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 30 31 28 66 65 55
+-96 95 69 125 122 87 160 154 106 178 174 128 194 189 146 204 201 155
+-214 212 158 239 239 170 251 251 187 251 251 187 251 251 187 239 239 170
+-210 208 158 188 184 146 149 145 103 61 61 53 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 61 61 53 131 127 93
+-164 159 111 184 181 136 197 193 154 210 208 158 224 223 159 251 251 187
+-251 251 187 251 251 187 251 251 187 251 251 187 251 251 187 251 251 187
+-210 208 158 168 163 120 43 44 41 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 4 3 2 36 38 35
+-71 71 57 96 95 69 142 137 94 165 161 109 184 181 136 197 193 154
+-210 208 158 239 239 170 251 251 187 251 251 187 251 251 187 251 251 187
+-214 212 158 197 193 154 168 163 120 103 101 77 7 7 5 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-1 1 1 0 0 0 0 0 0 0 0 0 82 81 62 142 137 94
+-174 170 121 194 189 146 210 208 158 224 223 159 251 251 187 251 251 187
+-251 251 187 251 251 187 251 251 187 251 251 187 251 251 187 224 223 159
+-184 179 149 99 98 80 3 3 3 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 7 5
+-43 44 41 82 81 62 118 116 76 142 137 94 171 165 117 190 186 136
+-204 201 155 224 223 159 251 251 187 251 251 187 251 251 187 251 251 187
+-214 212 158 197 193 154 174 170 121 125 122 87 30 31 28 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 3 4 3 82 81 62 149 143 98
+-176 171 126 194 191 148 210 208 158 239 239 170 251 251 187 251 251 187
+-251 251 187 251 251 187 251 251 187 251 251 187 239 239 170 204 201 155
+-145 141 105 30 31 28 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-10 9 6 46 47 43 82 81 62 118 116 76 149 143 98 174 170 121
+-194 189 146 210 208 158 224 223 159 251 251 187 251 251 187 224 223 159
+-210 208 158 194 191 148 174 170 121 134 131 96 53 55 47 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 7 7 5 96 95 69 149 143 98
+-176 171 126 194 191 148 210 208 158 239 239 170 251 251 187 251 251 187
+-251 251 187 251 251 187 251 251 187 239 239 170 210 208 158 177 172 135
+-75 75 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 10 9 6 46 47 43 82 81 62 118 116 76 149 143 98
+-176 171 126 194 191 148 210 208 158 214 212 158 214 212 158 210 208 158
+-197 193 154 184 181 136 164 159 111 131 127 93 53 55 47 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 7 7 5 96 95 69 149 143 98
+-174 170 121 194 189 146 204 201 155 214 212 158 239 239 170 251 251 187
+-251 251 187 251 251 187 239 239 170 210 208 158 184 179 149 110 109 94
+-12 12 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 10 9 6 43 44 41 82 81 62 115 113 82
+-144 139 99 168 163 120 188 184 146 197 193 154 197 193 154 194 189 146
+-184 181 136 174 170 121 151 147 98 118 116 76 36 38 35 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 4 3 2 82 81 62 142 137 94
+-171 165 117 186 182 128 194 191 148 210 208 158 214 212 158 224 223 159
+-239 239 170 224 223 159 210 208 158 184 179 149 137 133 100 36 38 35
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 7 7 5 36 38 35 71 71 57
+-103 101 77 131 127 93 155 149 109 168 163 120 168 163 120 168 163 120
+-164 159 111 149 143 98 125 122 87 82 81 62 13 12 7 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 61 61 53 125 122 87
+-160 154 106 174 170 121 184 181 136 194 189 146 204 201 155 210 208 158
+-210 208 158 204 201 155 184 179 149 145 141 105 61 61 53 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 3 3 2 30 31 28
+-61 61 53 82 81 62 103 101 77 121 119 87 125 122 87 125 122 87
+-118 116 76 103 101 77 79 78 62 24 26 24 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 25 27 25 96 95 69
+-142 137 94 160 154 106 171 165 117 178 174 128 184 181 136 184 181 136
+-181 176 137 177 172 135 145 141 105 75 75 61 5 5 3 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-16 17 12 40 41 39 61 61 53 71 71 57 71 71 57 71 71 57
+-66 65 55 43 44 41 12 12 9 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 46 47 43
+-96 95 69 125 122 87 142 137 94 149 145 103 155 149 109 155 149 109
+-145 141 105 121 119 87 66 65 55 7 7 5 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 1 1 1 16 17 12 24 26 24 25 27 25 19 20 18
+-7 7 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1
+-25 27 25 61 61 53 82 81 62 96 95 69 96 95 69 82 81 62
+-61 61 53 25 27 25 2 2 1 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 5 6 5 13 12 7 10 9 6 3 4 3
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 6 6 6 6 6 6 10 10 10 10 10 10
++ 10 10 10 6 6 6 6 6 6 6 6 6
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 6 6 6 10 10 10 14 14 14
++ 22 22 22 26 26 26 30 30 30 34 34 34
++ 30 30 30 30 30 30 26 26 26 18 18 18
++ 14 14 14 10 10 10 6 6 6 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 1 0 0 1 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 6 6 6 14 14 14 26 26 26 42 42 42
++ 54 54 54 66 66 66 78 78 78 78 78 78
++ 78 78 78 74 74 74 66 66 66 54 54 54
++ 42 42 42 26 26 26 18 18 18 10 10 10
++ 6 6 6 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 1 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 10 10 10
++ 22 22 22 42 42 42 66 66 66 86 86 86
++ 66 66 66 38 38 38 38 38 38 22 22 22
++ 26 26 26 34 34 34 54 54 54 66 66 66
++ 86 86 86 70 70 70 46 46 46 26 26 26
++ 14 14 14 6 6 6 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 1 0 0 1 0 0 1 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 10 10 10 26 26 26
++ 50 50 50 82 82 82 58 58 58 6 6 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 6 6 6 54 54 54 86 86 86 66 66 66
++ 38 38 38 18 18 18 6 6 6 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 6 6 6 22 22 22 50 50 50
++ 78 78 78 34 34 34 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 6 6 6 70 70 70
++ 78 78 78 46 46 46 22 22 22 6 6 6
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 1 0 0 1 0 0 1 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 6 6 6 18 18 18 42 42 42 82 82 82
++ 26 26 26 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 14 14 14
++ 46 46 46 34 34 34 6 6 6 2 2 6
++ 42 42 42 78 78 78 42 42 42 18 18 18
++ 6 6 6 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 1 0 0 0 0 0 1 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 10 10 10 30 30 30 66 66 66 58 58 58
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 26 26 26
++ 86 86 86 101 101 101 46 46 46 10 10 10
++ 2 2 6 58 58 58 70 70 70 34 34 34
++ 10 10 10 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 1 0 0 1 0 0 1 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 14 14 14 42 42 42 86 86 86 10 10 10
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 30 30 30
++ 94 94 94 94 94 94 58 58 58 26 26 26
++ 2 2 6 6 6 6 78 78 78 54 54 54
++ 22 22 22 6 6 6 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 6 6 6
++ 22 22 22 62 62 62 62 62 62 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 26 26 26
++ 54 54 54 38 38 38 18 18 18 10 10 10
++ 2 2 6 2 2 6 34 34 34 82 82 82
++ 38 38 38 14 14 14 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 1 0 0 1 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 6 6 6
++ 30 30 30 78 78 78 30 30 30 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 10 10 10
++ 10 10 10 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 78 78 78
++ 50 50 50 18 18 18 6 6 6 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 1 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 10 10 10
++ 38 38 38 86 86 86 14 14 14 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 54 54 54
++ 66 66 66 26 26 26 6 6 6 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 1 0 0 1 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 14 14 14
++ 42 42 42 82 82 82 2 2 6 2 2 6
++ 2 2 6 6 6 6 10 10 10 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 6 6 6
++ 14 14 14 10 10 10 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 18 18 18
++ 82 82 82 34 34 34 10 10 10 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 1 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 14 14 14
++ 46 46 46 86 86 86 2 2 6 2 2 6
++ 6 6 6 6 6 6 22 22 22 34 34 34
++ 6 6 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 18 18 18 34 34 34
++ 10 10 10 50 50 50 22 22 22 2 2 6
++ 2 2 6 2 2 6 2 2 6 10 10 10
++ 86 86 86 42 42 42 14 14 14 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 1 0 0 1 0 0 1 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 14 14 14
++ 46 46 46 86 86 86 2 2 6 2 2 6
++ 38 38 38 116 116 116 94 94 94 22 22 22
++ 22 22 22 2 2 6 2 2 6 2 2 6
++ 14 14 14 86 86 86 138 138 138 162 162 162
++154 154 154 38 38 38 26 26 26 6 6 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 86 86 86 46 46 46 14 14 14 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 14 14 14
++ 46 46 46 86 86 86 2 2 6 14 14 14
++134 134 134 198 198 198 195 195 195 116 116 116
++ 10 10 10 2 2 6 2 2 6 6 6 6
++101 98 89 187 187 187 210 210 210 218 218 218
++214 214 214 134 134 134 14 14 14 6 6 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 86 86 86 50 50 50 18 18 18 6 6 6
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 1 0 0 0
++ 0 0 1 0 0 1 0 0 1 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 14 14 14
++ 46 46 46 86 86 86 2 2 6 54 54 54
++218 218 218 195 195 195 226 226 226 246 246 246
++ 58 58 58 2 2 6 2 2 6 30 30 30
++210 210 210 253 253 253 174 174 174 123 123 123
++221 221 221 234 234 234 74 74 74 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 70 70 70 58 58 58 22 22 22 6 6 6
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 14 14 14
++ 46 46 46 82 82 82 2 2 6 106 106 106
++170 170 170 26 26 26 86 86 86 226 226 226
++123 123 123 10 10 10 14 14 14 46 46 46
++231 231 231 190 190 190 6 6 6 70 70 70
++ 90 90 90 238 238 238 158 158 158 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 70 70 70 58 58 58 22 22 22 6 6 6
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 1 0 0 0
++ 0 0 1 0 0 1 0 0 1 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 14 14 14
++ 42 42 42 86 86 86 6 6 6 116 116 116
++106 106 106 6 6 6 70 70 70 149 149 149
++128 128 128 18 18 18 38 38 38 54 54 54
++221 221 221 106 106 106 2 2 6 14 14 14
++ 46 46 46 190 190 190 198 198 198 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 74 74 74 62 62 62 22 22 22 6 6 6
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 1 0 0 0
++ 0 0 1 0 0 0 0 0 1 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 14 14 14
++ 42 42 42 94 94 94 14 14 14 101 101 101
++128 128 128 2 2 6 18 18 18 116 116 116
++118 98 46 121 92 8 121 92 8 98 78 10
++162 162 162 106 106 106 2 2 6 2 2 6
++ 2 2 6 195 195 195 195 195 195 6 6 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 74 74 74 62 62 62 22 22 22 6 6 6
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 1 0 0 1
++ 0 0 1 0 0 0 0 0 1 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 10 10 10
++ 38 38 38 90 90 90 14 14 14 58 58 58
++210 210 210 26 26 26 54 38 6 154 114 10
++226 170 11 236 186 11 225 175 15 184 144 12
++215 174 15 175 146 61 37 26 9 2 2 6
++ 70 70 70 246 246 246 138 138 138 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 70 70 70 66 66 66 26 26 26 6 6 6
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 10 10 10
++ 38 38 38 86 86 86 14 14 14 10 10 10
++195 195 195 188 164 115 192 133 9 225 175 15
++239 182 13 234 190 10 232 195 16 232 200 30
++245 207 45 241 208 19 232 195 16 184 144 12
++218 194 134 211 206 186 42 42 42 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 50 50 50 74 74 74 30 30 30 6 6 6
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 10 10 10
++ 34 34 34 86 86 86 14 14 14 2 2 6
++121 87 25 192 133 9 219 162 10 239 182 13
++236 186 11 232 195 16 241 208 19 244 214 54
++246 218 60 246 218 38 246 215 20 241 208 19
++241 208 19 226 184 13 121 87 25 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 50 50 50 82 82 82 34 34 34 10 10 10
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 10 10 10
++ 34 34 34 82 82 82 30 30 30 61 42 6
++180 123 7 206 145 10 230 174 11 239 182 13
++234 190 10 238 202 15 241 208 19 246 218 74
++246 218 38 246 215 20 246 215 20 246 215 20
++226 184 13 215 174 15 184 144 12 6 6 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 26 26 26 94 94 94 42 42 42 14 14 14
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 10 10 10
++ 30 30 30 78 78 78 50 50 50 104 69 6
++192 133 9 216 158 10 236 178 12 236 186 11
++232 195 16 241 208 19 244 214 54 245 215 43
++246 215 20 246 215 20 241 208 19 198 155 10
++200 144 11 216 158 10 156 118 10 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 6 6 6 90 90 90 54 54 54 18 18 18
++ 6 6 6 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 10 10 10
++ 30 30 30 78 78 78 46 46 46 22 22 22
++137 92 6 210 162 10 239 182 13 238 190 10
++238 202 15 241 208 19 246 215 20 246 215 20
++241 208 19 203 166 17 185 133 11 210 150 10
++216 158 10 210 150 10 102 78 10 2 2 6
++ 6 6 6 54 54 54 14 14 14 2 2 6
++ 2 2 6 62 62 62 74 74 74 30 30 30
++ 10 10 10 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 10 10 10
++ 34 34 34 78 78 78 50 50 50 6 6 6
++ 94 70 30 139 102 15 190 146 13 226 184 13
++232 200 30 232 195 16 215 174 15 190 146 13
++168 122 10 192 133 9 210 150 10 213 154 11
++202 150 34 182 157 106 101 98 89 2 2 6
++ 2 2 6 78 78 78 116 116 116 58 58 58
++ 2 2 6 22 22 22 90 90 90 46 46 46
++ 18 18 18 6 6 6 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 10 10 10
++ 38 38 38 86 86 86 50 50 50 6 6 6
++128 128 128 174 154 114 156 107 11 168 122 10
++198 155 10 184 144 12 197 138 11 200 144 11
++206 145 10 206 145 10 197 138 11 188 164 115
++195 195 195 198 198 198 174 174 174 14 14 14
++ 2 2 6 22 22 22 116 116 116 116 116 116
++ 22 22 22 2 2 6 74 74 74 70 70 70
++ 30 30 30 10 10 10 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 6 6 6 18 18 18
++ 50 50 50 101 101 101 26 26 26 10 10 10
++138 138 138 190 190 190 174 154 114 156 107 11
++197 138 11 200 144 11 197 138 11 192 133 9
++180 123 7 190 142 34 190 178 144 187 187 187
++202 202 202 221 221 221 214 214 214 66 66 66
++ 2 2 6 2 2 6 50 50 50 62 62 62
++ 6 6 6 2 2 6 10 10 10 90 90 90
++ 50 50 50 18 18 18 6 6 6 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 10 10 10 34 34 34
++ 74 74 74 74 74 74 2 2 6 6 6 6
++144 144 144 198 198 198 190 190 190 178 166 146
++154 121 60 156 107 11 156 107 11 168 124 44
++174 154 114 187 187 187 190 190 190 210 210 210
++246 246 246 253 253 253 253 253 253 182 182 182
++ 6 6 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 62 62 62
++ 74 74 74 34 34 34 14 14 14 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 10 10 10 22 22 22 54 54 54
++ 94 94 94 18 18 18 2 2 6 46 46 46
++234 234 234 221 221 221 190 190 190 190 190 190
++190 190 190 187 187 187 187 187 187 190 190 190
++190 190 190 195 195 195 214 214 214 242 242 242
++253 253 253 253 253 253 253 253 253 253 253 253
++ 82 82 82 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 14 14 14
++ 86 86 86 54 54 54 22 22 22 6 6 6
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 6 6 6 18 18 18 46 46 46 90 90 90
++ 46 46 46 18 18 18 6 6 6 182 182 182
++253 253 253 246 246 246 206 206 206 190 190 190
++190 190 190 190 190 190 190 190 190 190 190 190
++206 206 206 231 231 231 250 250 250 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++202 202 202 14 14 14 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 42 42 42 86 86 86 42 42 42 18 18 18
++ 6 6 6 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 6 6 6
++ 14 14 14 38 38 38 74 74 74 66 66 66
++ 2 2 6 6 6 6 90 90 90 250 250 250
++253 253 253 253 253 253 238 238 238 198 198 198
++190 190 190 190 190 190 195 195 195 221 221 221
++246 246 246 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 82 82 82 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 78 78 78 70 70 70 34 34 34
++ 14 14 14 6 6 6 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 14 14 14
++ 34 34 34 66 66 66 78 78 78 6 6 6
++ 2 2 6 18 18 18 218 218 218 253 253 253
++253 253 253 253 253 253 253 253 253 246 246 246
++226 226 226 231 231 231 246 246 246 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 178 178 178 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 18 18 18 90 90 90 62 62 62
++ 30 30 30 10 10 10 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 10 10 10 26 26 26
++ 58 58 58 90 90 90 18 18 18 2 2 6
++ 2 2 6 110 110 110 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++250 250 250 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 231 231 231 18 18 18 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 18 18 18 94 94 94
++ 54 54 54 26 26 26 10 10 10 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 6 6 6 22 22 22 50 50 50
++ 90 90 90 26 26 26 2 2 6 2 2 6
++ 14 14 14 195 195 195 250 250 250 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++250 250 250 242 242 242 54 54 54 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 38 38 38
++ 86 86 86 50 50 50 22 22 22 6 6 6
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 6 6 6 14 14 14 38 38 38 82 82 82
++ 34 34 34 2 2 6 2 2 6 2 2 6
++ 42 42 42 195 195 195 246 246 246 253 253 253
++253 253 253 253 253 253 253 253 253 250 250 250
++242 242 242 242 242 242 250 250 250 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 250 250 250 246 246 246 238 238 238
++226 226 226 231 231 231 101 101 101 6 6 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 38 38 38 82 82 82 42 42 42 14 14 14
++ 6 6 6 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 10 10 10 26 26 26 62 62 62 66 66 66
++ 2 2 6 2 2 6 2 2 6 6 6 6
++ 70 70 70 170 170 170 206 206 206 234 234 234
++246 246 246 250 250 250 250 250 250 238 238 238
++226 226 226 231 231 231 238 238 238 250 250 250
++250 250 250 250 250 250 246 246 246 231 231 231
++214 214 214 206 206 206 202 202 202 202 202 202
++198 198 198 202 202 202 182 182 182 18 18 18
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 62 62 62 66 66 66 30 30 30
++ 10 10 10 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 14 14 14 42 42 42 82 82 82 18 18 18
++ 2 2 6 2 2 6 2 2 6 10 10 10
++ 94 94 94 182 182 182 218 218 218 242 242 242
++250 250 250 253 253 253 253 253 253 250 250 250
++234 234 234 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 246 246 246
++238 238 238 226 226 226 210 210 210 202 202 202
++195 195 195 195 195 195 210 210 210 158 158 158
++ 6 6 6 14 14 14 50 50 50 14 14 14
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 6 6 6 86 86 86 46 46 46
++ 18 18 18 6 6 6 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 6 6 6
++ 22 22 22 54 54 54 70 70 70 2 2 6
++ 2 2 6 10 10 10 2 2 6 22 22 22
++166 166 166 231 231 231 250 250 250 253 253 253
++253 253 253 253 253 253 253 253 253 250 250 250
++242 242 242 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 246 246 246
++231 231 231 206 206 206 198 198 198 226 226 226
++ 94 94 94 2 2 6 6 6 6 38 38 38
++ 30 30 30 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 62 62 62 66 66 66
++ 26 26 26 10 10 10 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 10 10 10
++ 30 30 30 74 74 74 50 50 50 2 2 6
++ 26 26 26 26 26 26 2 2 6 106 106 106
++238 238 238 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 246 246 246 218 218 218 202 202 202
++210 210 210 14 14 14 2 2 6 2 2 6
++ 30 30 30 22 22 22 2 2 6 2 2 6
++ 2 2 6 2 2 6 18 18 18 86 86 86
++ 42 42 42 14 14 14 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 14 14 14
++ 42 42 42 90 90 90 22 22 22 2 2 6
++ 42 42 42 2 2 6 18 18 18 218 218 218
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 250 250 250 221 221 221
++218 218 218 101 101 101 2 2 6 14 14 14
++ 18 18 18 38 38 38 10 10 10 2 2 6
++ 2 2 6 2 2 6 2 2 6 78 78 78
++ 58 58 58 22 22 22 6 6 6 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 6 6 6 18 18 18
++ 54 54 54 82 82 82 2 2 6 26 26 26
++ 22 22 22 2 2 6 123 123 123 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 250 250 250
++238 238 238 198 198 198 6 6 6 38 38 38
++ 58 58 58 26 26 26 38 38 38 2 2 6
++ 2 2 6 2 2 6 2 2 6 46 46 46
++ 78 78 78 30 30 30 10 10 10 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 10 10 10 30 30 30
++ 74 74 74 58 58 58 2 2 6 42 42 42
++ 2 2 6 22 22 22 231 231 231 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 250 250 250
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 246 246 246 46 46 46 38 38 38
++ 42 42 42 14 14 14 38 38 38 14 14 14
++ 2 2 6 2 2 6 2 2 6 6 6 6
++ 86 86 86 46 46 46 14 14 14 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 6 6 6 14 14 14 42 42 42
++ 90 90 90 18 18 18 18 18 18 26 26 26
++ 2 2 6 116 116 116 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 250 250 250 238 238 238
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 94 94 94 6 6 6
++ 2 2 6 2 2 6 10 10 10 34 34 34
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 74 74 74 58 58 58 22 22 22 6 6 6
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 10 10 10 26 26 26 66 66 66
++ 82 82 82 2 2 6 38 38 38 6 6 6
++ 14 14 14 210 210 210 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 246 246 246 242 242 242
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 144 144 144 2 2 6
++ 2 2 6 2 2 6 2 2 6 46 46 46
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 42 42 42 74 74 74 30 30 30 10 10 10
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 6 6 6 14 14 14 42 42 42 90 90 90
++ 26 26 26 6 6 6 42 42 42 2 2 6
++ 74 74 74 250 250 250 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 242 242 242 242 242 242
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 182 182 182 2 2 6
++ 2 2 6 2 2 6 2 2 6 46 46 46
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 10 10 10 86 86 86 38 38 38 10 10 10
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 10 10 10 26 26 26 66 66 66 82 82 82
++ 2 2 6 22 22 22 18 18 18 2 2 6
++149 149 149 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 234 234 234 242 242 242
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 206 206 206 2 2 6
++ 2 2 6 2 2 6 2 2 6 38 38 38
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 6 6 6 86 86 86 46 46 46 14 14 14
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 6 6 6
++ 18 18 18 46 46 46 86 86 86 18 18 18
++ 2 2 6 34 34 34 10 10 10 6 6 6
++210 210 210 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 234 234 234 242 242 242
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 221 221 221 6 6 6
++ 2 2 6 2 2 6 6 6 6 30 30 30
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 82 82 82 54 54 54 18 18 18
++ 6 6 6 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 10 10 10
++ 26 26 26 66 66 66 62 62 62 2 2 6
++ 2 2 6 38 38 38 10 10 10 26 26 26
++238 238 238 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 231 231 231 238 238 238
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 231 231 231 6 6 6
++ 2 2 6 2 2 6 10 10 10 30 30 30
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 66 66 66 58 58 58 22 22 22
++ 6 6 6 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 10 10 10
++ 38 38 38 78 78 78 6 6 6 2 2 6
++ 2 2 6 46 46 46 14 14 14 42 42 42
++246 246 246 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 231 231 231 242 242 242
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 234 234 234 10 10 10
++ 2 2 6 2 2 6 22 22 22 14 14 14
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 66 66 66 62 62 62 22 22 22
++ 6 6 6 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 6 6 6 18 18 18
++ 50 50 50 74 74 74 2 2 6 2 2 6
++ 14 14 14 70 70 70 34 34 34 62 62 62
++250 250 250 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 231 231 231 246 246 246
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 234 234 234 14 14 14
++ 2 2 6 2 2 6 30 30 30 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 66 66 66 62 62 62 22 22 22
++ 6 6 6 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 6 6 6 18 18 18
++ 54 54 54 62 62 62 2 2 6 2 2 6
++ 2 2 6 30 30 30 46 46 46 70 70 70
++250 250 250 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 231 231 231 246 246 246
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 226 226 226 10 10 10
++ 2 2 6 6 6 6 30 30 30 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 66 66 66 58 58 58 22 22 22
++ 6 6 6 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 6 6 6 22 22 22
++ 58 58 58 62 62 62 2 2 6 2 2 6
++ 2 2 6 2 2 6 30 30 30 78 78 78
++250 250 250 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 231 231 231 246 246 246
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 206 206 206 2 2 6
++ 22 22 22 34 34 34 18 14 6 22 22 22
++ 26 26 26 18 18 18 6 6 6 2 2 6
++ 2 2 6 82 82 82 54 54 54 18 18 18
++ 6 6 6 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 6 6 6 26 26 26
++ 62 62 62 106 106 106 74 54 14 185 133 11
++210 162 10 121 92 8 6 6 6 62 62 62
++238 238 238 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 231 231 231 246 246 246
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 158 158 158 18 18 18
++ 14 14 14 2 2 6 2 2 6 2 2 6
++ 6 6 6 18 18 18 66 66 66 38 38 38
++ 6 6 6 94 94 94 50 50 50 18 18 18
++ 6 6 6 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 6 6 6
++ 10 10 10 10 10 10 18 18 18 38 38 38
++ 78 78 78 142 134 106 216 158 10 242 186 14
++246 190 14 246 190 14 156 118 10 10 10 10
++ 90 90 90 238 238 238 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 231 231 231 250 250 250
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 246 230 190
++238 204 91 238 204 91 181 142 44 37 26 9
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 38 38 38 46 46 46
++ 26 26 26 106 106 106 54 54 54 18 18 18
++ 6 6 6 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 6 6 6 14 14 14 22 22 22
++ 30 30 30 38 38 38 50 50 50 70 70 70
++106 106 106 190 142 34 226 170 11 242 186 14
++246 190 14 246 190 14 246 190 14 154 114 10
++ 6 6 6 74 74 74 226 226 226 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 231 231 231 250 250 250
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 228 184 62
++241 196 14 241 208 19 232 195 16 38 30 10
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 6 6 6 30 30 30 26 26 26
++203 166 17 154 142 90 66 66 66 26 26 26
++ 6 6 6 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 6 6 6 18 18 18 38 38 38 58 58 58
++ 78 78 78 86 86 86 101 101 101 123 123 123
++175 146 61 210 150 10 234 174 13 246 186 14
++246 190 14 246 190 14 246 190 14 238 190 10
++102 78 10 2 2 6 46 46 46 198 198 198
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 234 234 234 242 242 242
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 224 178 62
++242 186 14 241 196 14 210 166 10 22 18 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 6 6 6 121 92 8
++238 202 15 232 195 16 82 82 82 34 34 34
++ 10 10 10 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 14 14 14 38 38 38 70 70 70 154 122 46
++190 142 34 200 144 11 197 138 11 197 138 11
++213 154 11 226 170 11 242 186 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++225 175 15 46 32 6 2 2 6 22 22 22
++158 158 158 250 250 250 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 250 250 250 242 242 242 224 178 62
++239 182 13 236 186 11 213 154 11 46 32 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 61 42 6 225 175 15
++238 190 10 236 186 11 112 100 78 42 42 42
++ 14 14 14 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 6 6 6
++ 22 22 22 54 54 54 154 122 46 213 154 11
++226 170 11 230 174 11 226 170 11 226 170 11
++236 178 12 242 186 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++241 196 14 184 144 12 10 10 10 2 2 6
++ 6 6 6 116 116 116 242 242 242 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 231 231 231 198 198 198 214 170 54
++236 178 12 236 178 12 210 150 10 137 92 6
++ 18 14 6 2 2 6 2 2 6 2 2 6
++ 6 6 6 70 47 6 200 144 11 236 178 12
++239 182 13 239 182 13 124 112 88 58 58 58
++ 22 22 22 6 6 6 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 10 10 10
++ 30 30 30 70 70 70 180 133 36 226 170 11
++239 182 13 242 186 14 242 186 14 246 186 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 232 195 16 98 70 6 2 2 6
++ 2 2 6 2 2 6 66 66 66 221 221 221
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 206 206 206 198 198 198 214 166 58
++230 174 11 230 174 11 216 158 10 192 133 9
++163 110 8 116 81 8 102 78 10 116 81 8
++167 114 7 197 138 11 226 170 11 239 182 13
++242 186 14 242 186 14 162 146 94 78 78 78
++ 34 34 34 14 14 14 6 6 6 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 6 6 6
++ 30 30 30 78 78 78 190 142 34 226 170 11
++239 182 13 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 241 196 14 203 166 17 22 18 6
++ 2 2 6 2 2 6 2 2 6 38 38 38
++218 218 218 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++250 250 250 206 206 206 198 198 198 202 162 69
++226 170 11 236 178 12 224 166 10 210 150 10
++200 144 11 197 138 11 192 133 9 197 138 11
++210 150 10 226 170 11 242 186 14 246 190 14
++246 190 14 246 186 14 225 175 15 124 112 88
++ 62 62 62 30 30 30 14 14 14 6 6 6
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 10 10 10
++ 30 30 30 78 78 78 174 135 50 224 166 10
++239 182 13 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 241 196 14 139 102 15
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 78 78 78 250 250 250 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++250 250 250 214 214 214 198 198 198 190 150 46
++219 162 10 236 178 12 234 174 13 224 166 10
++216 158 10 213 154 11 213 154 11 216 158 10
++226 170 11 239 182 13 246 190 14 246 190 14
++246 190 14 246 190 14 242 186 14 206 162 42
++101 101 101 58 58 58 30 30 30 14 14 14
++ 6 6 6 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 10 10 10
++ 30 30 30 74 74 74 174 135 50 216 158 10
++236 178 12 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 241 196 14 226 184 13
++ 61 42 6 2 2 6 2 2 6 2 2 6
++ 22 22 22 238 238 238 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 226 226 226 187 187 187 180 133 36
++216 158 10 236 178 12 239 182 13 236 178 12
++230 174 11 226 170 11 226 170 11 230 174 11
++236 178 12 242 186 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 186 14 239 182 13
++206 162 42 106 106 106 66 66 66 34 34 34
++ 14 14 14 6 6 6 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 6 6 6
++ 26 26 26 70 70 70 163 133 67 213 154 11
++236 178 12 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 241 196 14
++190 146 13 18 14 6 2 2 6 2 2 6
++ 46 46 46 246 246 246 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 221 221 221 86 86 86 156 107 11
++216 158 10 236 178 12 242 186 14 246 186 14
++242 186 14 239 182 13 239 182 13 242 186 14
++242 186 14 246 186 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++242 186 14 225 175 15 142 122 72 66 66 66
++ 30 30 30 10 10 10 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 6 6 6
++ 26 26 26 70 70 70 163 133 67 210 150 10
++236 178 12 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++232 195 16 121 92 8 34 34 34 106 106 106
++221 221 221 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++242 242 242 82 82 82 18 14 6 163 110 8
++216 158 10 236 178 12 242 186 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 242 186 14 163 133 67
++ 46 46 46 18 18 18 6 6 6 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 10 10 10
++ 30 30 30 78 78 78 163 133 67 210 150 10
++236 178 12 246 186 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++241 196 14 215 174 15 190 178 144 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 218 218 218
++ 58 58 58 2 2 6 22 18 6 167 114 7
++216 158 10 236 178 12 246 186 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 186 14 242 186 14 190 150 46
++ 54 54 54 22 22 22 6 6 6 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 14 14 14
++ 38 38 38 86 86 86 180 133 36 213 154 11
++236 178 12 246 186 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 232 195 16 190 146 13 214 214 214
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 250 250 250 170 170 170 26 26 26
++ 2 2 6 2 2 6 37 26 9 163 110 8
++219 162 10 239 182 13 246 186 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 186 14 236 178 12 224 166 10 142 122 72
++ 46 46 46 18 18 18 6 6 6 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 6 6 6 18 18 18
++ 50 50 50 109 106 95 192 133 9 224 166 10
++242 186 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++242 186 14 226 184 13 210 162 10 142 110 46
++226 226 226 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++253 253 253 253 253 253 253 253 253 253 253 253
++198 198 198 66 66 66 2 2 6 2 2 6
++ 2 2 6 2 2 6 50 34 6 156 107 11
++219 162 10 239 182 13 246 186 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 242 186 14
++234 174 13 213 154 11 154 122 46 66 66 66
++ 30 30 30 10 10 10 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 6 6 6 22 22 22
++ 58 58 58 154 121 60 206 145 10 234 174 13
++242 186 14 246 186 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 186 14 236 178 12 210 162 10 163 110 8
++ 61 42 6 138 138 138 218 218 218 250 250 250
++253 253 253 253 253 253 253 253 253 250 250 250
++242 242 242 210 210 210 144 144 144 66 66 66
++ 6 6 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 61 42 6 163 110 8
++216 158 10 236 178 12 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 239 182 13 230 174 11 216 158 10
++190 142 34 124 112 88 70 70 70 38 38 38
++ 18 18 18 6 6 6 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 6 6 6 22 22 22
++ 62 62 62 168 124 44 206 145 10 224 166 10
++236 178 12 239 182 13 242 186 14 242 186 14
++246 186 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 236 178 12 216 158 10 175 118 6
++ 80 54 7 2 2 6 6 6 6 30 30 30
++ 54 54 54 62 62 62 50 50 50 38 38 38
++ 14 14 14 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 6 6 6 80 54 7 167 114 7
++213 154 11 236 178 12 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 190 14 242 186 14 239 182 13 239 182 13
++230 174 11 210 150 10 174 135 50 124 112 88
++ 82 82 82 54 54 54 34 34 34 18 18 18
++ 6 6 6 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 6 6 6 18 18 18
++ 50 50 50 158 118 36 192 133 9 200 144 11
++216 158 10 219 162 10 224 166 10 226 170 11
++230 174 11 236 178 12 239 182 13 239 182 13
++242 186 14 246 186 14 246 190 14 246 190 14
++246 190 14 246 190 14 246 190 14 246 190 14
++246 186 14 230 174 11 210 150 10 163 110 8
++104 69 6 10 10 10 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 6 6 6 91 60 6 167 114 7
++206 145 10 230 174 11 242 186 14 246 190 14
++246 190 14 246 190 14 246 186 14 242 186 14
++239 182 13 230 174 11 224 166 10 213 154 11
++180 133 36 124 112 88 86 86 86 58 58 58
++ 38 38 38 22 22 22 10 10 10 6 6 6
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 14 14 14
++ 34 34 34 70 70 70 138 110 50 158 118 36
++167 114 7 180 123 7 192 133 9 197 138 11
++200 144 11 206 145 10 213 154 11 219 162 10
++224 166 10 230 174 11 239 182 13 242 186 14
++246 186 14 246 186 14 246 186 14 246 186 14
++239 182 13 216 158 10 185 133 11 152 99 6
++104 69 6 18 14 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 2 2 6 2 2 6 2 2 6
++ 2 2 6 6 6 6 80 54 7 152 99 6
++192 133 9 219 162 10 236 178 12 239 182 13
++246 186 14 242 186 14 239 182 13 236 178 12
++224 166 10 206 145 10 192 133 9 154 121 60
++ 94 94 94 62 62 62 42 42 42 22 22 22
++ 14 14 14 6 6 6 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 6 6 6
++ 18 18 18 34 34 34 58 58 58 78 78 78
++101 98 89 124 112 88 142 110 46 156 107 11
++163 110 8 167 114 7 175 118 6 180 123 7
++185 133 11 197 138 11 210 150 10 219 162 10
++226 170 11 236 178 12 236 178 12 234 174 13
++219 162 10 197 138 11 163 110 8 130 83 6
++ 91 60 6 10 10 10 2 2 6 2 2 6
++ 18 18 18 38 38 38 38 38 38 38 38 38
++ 38 38 38 38 38 38 38 38 38 38 38 38
++ 38 38 38 38 38 38 26 26 26 2 2 6
++ 2 2 6 6 6 6 70 47 6 137 92 6
++175 118 6 200 144 11 219 162 10 230 174 11
++234 174 13 230 174 11 219 162 10 210 150 10
++192 133 9 163 110 8 124 112 88 82 82 82
++ 50 50 50 30 30 30 14 14 14 6 6 6
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 6 6 6 14 14 14 22 22 22 34 34 34
++ 42 42 42 58 58 58 74 74 74 86 86 86
++101 98 89 122 102 70 130 98 46 121 87 25
++137 92 6 152 99 6 163 110 8 180 123 7
++185 133 11 197 138 11 206 145 10 200 144 11
++180 123 7 156 107 11 130 83 6 104 69 6
++ 50 34 6 54 54 54 110 110 110 101 98 89
++ 86 86 86 82 82 82 78 78 78 78 78 78
++ 78 78 78 78 78 78 78 78 78 78 78 78
++ 78 78 78 82 82 82 86 86 86 94 94 94
++106 106 106 101 101 101 86 66 34 124 80 6
++156 107 11 180 123 7 192 133 9 200 144 11
++206 145 10 200 144 11 192 133 9 175 118 6
++139 102 15 109 106 95 70 70 70 42 42 42
++ 22 22 22 10 10 10 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 6 6 6 10 10 10
++ 14 14 14 22 22 22 30 30 30 38 38 38
++ 50 50 50 62 62 62 74 74 74 90 90 90
++101 98 89 112 100 78 121 87 25 124 80 6
++137 92 6 152 99 6 152 99 6 152 99 6
++138 86 6 124 80 6 98 70 6 86 66 30
++101 98 89 82 82 82 58 58 58 46 46 46
++ 38 38 38 34 34 34 34 34 34 34 34 34
++ 34 34 34 34 34 34 34 34 34 34 34 34
++ 34 34 34 34 34 34 38 38 38 42 42 42
++ 54 54 54 82 82 82 94 86 76 91 60 6
++134 86 6 156 107 11 167 114 7 175 118 6
++175 118 6 167 114 7 152 99 6 121 87 25
++101 98 89 62 62 62 34 34 34 18 18 18
++ 6 6 6 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 6 6 6 6 6 6 10 10 10
++ 18 18 18 22 22 22 30 30 30 42 42 42
++ 50 50 50 66 66 66 86 86 86 101 98 89
++106 86 58 98 70 6 104 69 6 104 69 6
++104 69 6 91 60 6 82 62 34 90 90 90
++ 62 62 62 38 38 38 22 22 22 14 14 14
++ 10 10 10 10 10 10 10 10 10 10 10 10
++ 10 10 10 10 10 10 6 6 6 10 10 10
++ 10 10 10 10 10 10 10 10 10 14 14 14
++ 22 22 22 42 42 42 70 70 70 89 81 66
++ 80 54 7 104 69 6 124 80 6 137 92 6
++134 86 6 116 81 8 100 82 52 86 86 86
++ 58 58 58 30 30 30 14 14 14 6 6 6
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 6 6 6 10 10 10 14 14 14
++ 18 18 18 26 26 26 38 38 38 54 54 54
++ 70 70 70 86 86 86 94 86 76 89 81 66
++ 89 81 66 86 86 86 74 74 74 50 50 50
++ 30 30 30 14 14 14 6 6 6 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 6 6 6 18 18 18 34 34 34 58 58 58
++ 82 82 82 89 81 66 89 81 66 89 81 66
++ 94 86 66 94 86 76 74 74 74 50 50 50
++ 26 26 26 14 14 14 6 6 6 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 6 6 6 6 6 6 14 14 14 18 18 18
++ 30 30 30 38 38 38 46 46 46 54 54 54
++ 50 50 50 42 42 42 30 30 30 18 18 18
++ 10 10 10 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 6 6 6 14 14 14 26 26 26
++ 38 38 38 50 50 50 58 58 58 58 58 58
++ 54 54 54 42 42 42 30 30 30 18 18 18
++ 10 10 10 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 6 6 6
++ 6 6 6 10 10 10 14 14 14 18 18 18
++ 18 18 18 14 14 14 10 10 10 6 6 6
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 6 6 6
++ 14 14 14 18 18 18 22 22 22 22 22 22
++ 18 18 18 14 14 14 10 10 10 6 6 6
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/video/logo/logo_linux_vga16.ppm linux-2.6.29-rc3.owrt/drivers/video/logo/logo_linux_vga16.ppm
+--- linux-2.6.29.owrt/drivers/video/logo/logo_linux_vga16.ppm 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/video/logo/logo_linux_vga16.ppm 2009-05-10 23:48:29.000000000 +0200
+@@ -1,2739 +1,1604 @@
+ P3
+-142 114
++# Standard 16-color Linux logo
++80 80
+ 255
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 85 85 85
+-85 85 85 85 85 85 0 0 0 85 85 85 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 85 85 85 85 85 85 0 0 0 85 85 85 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 0 0 0
+-85 85 85 85 85 85 0 0 0 85 85 85 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 85 85 85 85 85 85 85 85 85 85 85 85
+-0 0 0 85 85 85 85 85 85 0 0 0 85 85 85 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+-85 85 85 85 85 85 0 0 0 85 85 85 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 170 170 170
+-85 85 85 85 85 85 85 85 85 85 85 85 0 0 0 85 85 85
+-0 0 0 85 85 85 85 85 85 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85
+-85 85 85 0 0 0 85 85 85 85 85 85 85 85 85 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 85 85 85 170 170 170 170 85 0 170 170 170 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-85 85 85 85 85 85 85 85 85 85 85 85 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-170 170 170 255 255 85 170 170 170 170 170 170 170 170 170 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 170 170 170
+-255 255 85 170 170 170 170 170 170 170 85 0 85 255 85 170 85 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 85 85 85 170 170 170 170 85 0
+-170 170 170 170 170 170 255 255 85 170 170 170 170 170 170 85 85 85
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 85 85 85 170 85 0 170 170 170
+-170 170 170 170 85 0 170 170 170 170 170 170 170 85 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 85 85 85
+-85 85 85 85 85 85 0 0 0 85 85 85 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 85 85 85 85 85 85 85 255 85
+-255 85 85 85 255 85 170 170 170 170 85 0 170 170 170 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+-85 85 85 85 85 85 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 170 85 0 85 85 85 85 85 85
+-170 170 170 170 85 0 170 170 170 85 85 85 170 85 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 85 85 85
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 85 85 85 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 85 85 85 85 85 85 170 85 0
+-85 85 85 85 85 85 170 85 0 85 255 85 85 85 85 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-85 85 85 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 85 85 85
+-0 0 0 85 85 85 85 85 85 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 170 85 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 85 85 85 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 0 170 0 85 85 85 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-170 85 0 85 255 85 170 85 0 170 85 0 170 85 0 85 255 85
+-170 85 0 170 85 0 0 170 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 170 0 170 85 0
+-255 255 85 170 85 0 255 255 85 255 255 85 255 255 85 170 85 0
+-255 255 85 85 255 85 170 85 0 170 85 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 170 85 0 255 255 85
+-85 255 85 255 255 85 255 255 85 170 85 0 255 255 85 255 255 85
+-255 255 85 170 85 0 255 255 85 85 255 85 170 85 0 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 255 255 85 170 85 0
+-255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 170 85 0
+-255 255 85 255 255 85 255 255 85 255 255 85 170 85 0 85 255 85
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 85 85 85 170 170 170 0 0 0
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 170 85 0 255 255 85 255 255 85
+-255 255 85 255 255 85 170 85 0 255 255 85 85 255 85 255 255 85
+-255 255 85 170 85 0 255 255 85 170 85 0 255 255 85 170 85 0
+-170 85 0 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 0 0 0 85 85 85 170 170 170 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 170 85 0 255 255 85 85 255 85 255 255 85
+-170 170 170 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85
+-255 255 85 255 255 85 85 255 85 255 255 85 255 255 85 255 255 85
+-85 255 85 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 170 85 0 255 255 85 255 255 85 255 255 85
+-255 255 255 255 255 85 255 255 85 170 85 0 255 255 85 170 85 0
+-255 255 85 255 255 85 255 255 85 255 255 85 170 85 0 255 255 85
+-170 85 0 170 85 0 0 170 0 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 170 85 0 85 255 85 255 255 85 170 170 170 255 255 255
+-255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85
+-255 255 85 255 255 85 170 85 0 255 255 85 85 255 85 255 255 85
+-255 255 85 85 255 85 0 0 0 85 85 85 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 85 85 85 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 255 255 85 255 255 85 255 255 85 255 255 255 255 255 85
+-255 255 85 255 255 85 85 255 85 255 255 85 255 255 85 85 255 85
+-255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 170 85 0
+-255 255 85 170 85 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 85 85 85
+-85 85 85 0 0 0 85 85 85 85 85 85 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-170 85 0 170 85 0 255 255 85 255 255 85 255 255 255 170 170 170
+-255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85
+-170 85 0 255 255 85 255 255 85 170 85 0 255 255 85 255 255 85
+-255 255 85 85 255 85 170 85 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 0 0 0
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-255 255 85 85 255 85 255 255 85 170 170 170 255 255 255 255 255 85
+-255 255 85 255 255 85 170 85 0 255 255 85 255 255 85 255 255 85
+-255 255 85 255 255 85 255 255 85 255 255 85 85 255 85 170 85 0
+-255 255 85 170 85 0 170 85 0 0 0 0 85 85 85 0 0 0
+-85 85 85 85 85 85 85 85 85 170 170 170 170 170 170 170 170 170
+-85 255 85 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170
+-170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170
+-170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170
+-170 170 170 170 170 170 170 170 170 170 170 170 255 255 85 170 170 170
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 170 0
+-170 85 0 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85
+-255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85
+-255 255 85 255 255 85 85 255 85 255 255 85 170 85 0 170 85 0
+-170 85 0 85 255 85 255 255 85 85 85 85 170 170 170 170 170 170
+-170 170 170 170 170 170 170 170 170 85 255 85 170 170 170 170 170 170
+-85 85 85 170 170 170 170 170 170 170 85 0 170 170 170 170 170 170
+-85 255 85 170 170 170 170 85 0 170 170 170 85 255 85 255 85 85
+-85 255 85 170 170 170 255 255 85 85 85 85 255 255 85 170 170 170
+-85 255 85 170 170 170 255 255 85 170 170 170 170 170 170 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 85
+-255 255 85 255 255 85 255 255 85 255 255 255 255 255 85 255 255 85
+-255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 170 85 0
+-255 255 85 255 255 85 255 255 85 170 85 0 0 170 0 85 85 85
+-170 170 170 170 170 170 255 255 85 170 170 170 170 170 170 85 255 85
+-255 85 85 85 255 85 85 85 85 255 85 85 85 85 85 170 170 170
+-170 85 0 170 170 170 85 85 85 85 255 85 85 85 85 85 85 85
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-170 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 85
+-170 85 0 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85
+-255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85
+-255 255 85 255 255 85 170 85 0 255 255 85 85 85 85 85 85 85
+-255 255 85 170 170 170 85 85 85 85 85 85 0 0 0 85 85 85
+-0 0 0 85 85 85 85 85 85 170 170 170 170 85 0 170 170 170
+-170 170 170 255 255 85 170 170 170 85 85 85 85 85 85 85 85 85
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 170 85 0 255 255 85
+-255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85
+-255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85
+-255 255 85 255 255 85 255 255 85 170 85 0 170 85 0 0 170 0
+-0 0 0 170 85 0 170 85 0 0 170 0 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 85 85 85 170 170 170 85 85 85
+-170 170 170 85 85 85 85 85 85 170 170 170 170 85 0 85 85 85
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 255 255 85 170 85 0
+-255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 170 85 0
+-255 255 85 255 255 85 255 255 85 170 85 0 255 255 85 255 255 85
+-170 85 0 255 255 85 85 255 85 255 255 85 255 255 85 170 85 0
+-170 85 0 255 255 85 170 85 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 85 85 85 85 85 85 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 255 255 85 255 255 85
+-255 255 85 255 255 85 170 85 0 255 255 85 255 255 85 255 255 85
+-255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85
+-255 255 85 255 255 85 255 255 85 170 85 0 255 255 85 255 255 85
+-85 255 85 170 85 0 0 170 0 85 85 85 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 85 85 85 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 170 0 170 85 0 255 255 85
+-85 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85
+-255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85
+-170 85 0 255 255 85 85 255 85 255 255 85 255 255 85 170 85 0
+-85 255 85 170 85 0 170 85 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 170 85 0 255 255 85 255 255 85
+-255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85
+-255 255 85 170 85 0 255 255 85 85 255 85 255 255 85 170 85 0
+-255 255 85 255 255 85 170 85 0 255 255 85 170 85 0 85 255 85
+-170 85 0 170 85 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 255 255 85 170 85 0
+-255 255 85 170 85 0 255 255 85 170 85 0 255 255 85 85 255 85
+-255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85
+-255 255 85 170 85 0 255 255 85 85 255 85 170 85 0 170 85 0
+-0 170 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 85 85 85 85 85 85 85 85 85 85 85 85
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 170 85 0 255 255 85 255 255 85
+-255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85
+-255 255 85 255 255 85 170 85 0 255 255 85 170 85 0 85 255 85
+-255 255 85 85 255 85 170 85 0 170 85 0 85 255 85 170 85 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 255 255 85 85 255 85
+-255 255 85 255 255 85 85 255 85 255 255 85 255 255 85 255 255 85
+-255 255 85 170 85 0 255 255 85 85 255 85 255 255 85 255 255 85
+-170 85 0 170 85 0 85 255 85 170 85 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 85 85 85 170 170 170 170 170 170 170 170 170
+-170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 85 85 85
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 255 255 85 255 255 85
+-170 85 0 255 255 85 255 255 85 170 85 0 255 255 85 170 85 0
+-255 255 85 85 255 85 170 85 0 255 255 85 170 85 0 85 255 85
+-170 85 0 170 85 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 170 170 170 170 170 170 170 170 170 170 170 170
+-170 170 170 170 170 170 170 170 170 85 85 85 85 85 85 85 85 85
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 170 85 0 255 255 85
+-255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 85 255 85
+-170 85 0 255 255 85 170 85 0 85 255 85 170 85 0 170 85 0
+-0 170 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 170 170 170 170 170 170 255 255 255 170 170 170
+-170 170 170 170 170 170 85 85 85 85 85 85 85 85 85 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 255 85 255 255 85
+-170 85 0 255 255 85 255 255 85 170 85 0 85 255 85 170 85 0
+-255 255 85 170 85 0 0 170 0 170 85 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 170 170 170 170 170 170 170 170 170 85 85 85
+-85 85 85 85 85 85 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 85
+-255 255 85 255 255 85 255 255 85 255 255 85 170 85 0 170 85 0
+-0 170 0 85 85 85 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-255 255 85 255 255 85 170 85 0 0 170 0 85 85 85 85 85 85
+-85 85 85 85 85 85 0 0 0 85 85 85 85 85 85 0 0 0
+-85 85 85 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 85 85 85 85 85 85 170 170 170 170 170 170 85 85 85
+-170 170 170 170 170 170 170 170 170 170 170 170 85 85 85 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 170 85 0 85 85 85 0 0 0 0 0 0 0 0 0
+-85 85 85 85 85 85 85 85 85 85 85 85 170 170 170 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+-170 170 170 170 170 170 170 170 170 170 170 170 255 255 255 255 255 255
+-255 255 255 255 255 255 255 255 255 170 170 170 255 255 255 170 170 170
+-170 170 170 170 170 170 170 170 170 85 85 85 85 85 85 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 170 170 170 170 170 170
+-255 255 255 255 255 255 255 255 255 170 170 170 255 255 255 170 170 170
+-255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+-255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+-255 255 255 255 255 255 170 170 170 255 255 255 170 170 170 85 85 85
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 170 170 170 170 170 170
+-255 255 255 170 170 170 255 255 255 255 255 255 255 255 255 255 255 255
+-255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 170 170 170
+-255 255 255 255 255 255 170 170 170 255 255 255 255 255 255 255 255 255
+-255 255 255 255 255 255 255 255 255 255 255 255 170 170 170 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 170 170 170
+-170 170 170 170 170 170 255 255 255 170 170 170 255 255 255 170 170 170
+-255 255 255 170 170 170 255 255 255 170 170 170 255 255 255 255 255 255
+-255 255 255 170 170 170 255 255 255 170 170 170 255 255 255 170 170 170
+-170 170 170 170 170 170 170 170 170 170 170 170 85 85 85 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-85 85 85 85 85 85 85 85 85 0 0 0 85 85 85 85 85 85
+-85 85 85 85 85 85 85 85 85 170 170 170 170 170 170 170 170 170
+-170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170
+-170 170 170 170 170 170 170 170 170 170 170 170 85 85 85 170 170 170
+-170 170 170 170 170 170 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85
+-170 170 170 85 85 85 85 85 85 85 85 85 0 0 0 85 85 85
+-0 0 0 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 0 0 0
+-85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 170 170 170 85 85 85
+-85 85 85 85 85 85 85 85 85 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 85 85 85 170 170 170 85 85 85
+-85 85 85 85 85 85 85 85 85 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 85 85 85 85 85 85 85 85 85
+-85 85 85 85 85 85 0 0 0 85 85 85 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 85 85 85 170 170 170 85 85 85 85 85 85
+-85 85 85 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 170 170 170 170 170 170
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 170 170 170 85 85 85 85 85 85 85 85 85
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 170 170 170 255 255 255 170 170 170
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 170 170 170
+-170 170 170 255 255 255 170 170 170 170 170 170
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 170 170 170 85 85 85 85 85 85 85 85 85 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 170 170 170 170 170 170
+-255 255 255 255 255 255 170 170 170 170 170 170
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 170 170 170 170 170 170 255 255 255
+-255 255 255 170 170 170 170 170 170 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-170 170 170 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 170 170 170 255 255 255 255 255 255 255 255 255
+-170 170 170 170 170 170 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-170 170 170 170 170 170 255 255 255 255 255 255 255 255 255 170 170 170
+-170 170 170 170 170 170 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 170 170 170 170 170 170
+-170 170 170 255 255 255 255 255 255 255 255 255 170 170 170 170 170 170
+-170 170 170 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 85 85 85
+-85 85 85 85 85 85 85 85 85 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 85 85 85 85 85 85 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 170 170 170 170 170 170 170 170 170
+-255 255 255 255 255 255 255 255 255 255 255 255 170 170 170 170 170 170
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 85 85 85
+-85 85 85 85 85 85 85 85 85 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 85 85 85 85 85 85 85 85 85 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-85 85 85 85 85 85 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 170 170 170 170 170 170 255 255 255 255 255 255 255 255 255
+-255 255 255 255 255 255 170 170 170 170 170 170 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 85 85 85
+-85 85 85 85 85 85 85 85 85 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 170 170 170 255 255 255 85 85 85 85 85 85
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-85 85 85 170 170 170 85 85 85 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-170 170 170 170 170 170 255 255 255 170 170 170 255 255 255 255 255 255
+-255 255 255 255 255 255 170 170 170 170 170 170 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 170 170 170 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 85 85 85 85 85 85 85 85 85
+-85 85 85 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 85 85 85 170 170 170 255 255 255 170 170 170 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 85 85 85
+-255 255 255 170 170 170 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85
+-255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+-170 170 170 170 170 170 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 255 255 255 170 170 170 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 85 85 85 85 85 85 0 0 0
+-85 85 85 85 85 85 0 0 0 85 85 85 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 85 85 85 255 255 255 255 255 255 255 255 255 85 85 85
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 170 170 170
+-255 255 255 170 170 170 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 170 170 170 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 170 170 170
+-170 170 170 255 255 255 255 255 255 255 255 255 255 255 255 170 170 170
+-170 170 170 170 170 170 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-170 170 170 255 255 255 255 255 255 170 170 170 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 85 85 85 85 85 85 0 0 0
+-85 85 85 85 85 85 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 85 85 85
+-85 85 85 170 170 170 255 255 255 255 255 255 255 255 255 85 85 85
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 255 255 255
+-255 255 255 170 170 170 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 170 170 170 170 170 170 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 85 85 85 85 85 85 85 85 85
+-170 170 170 255 255 255 255 255 255 255 255 255 170 170 170 170 170 170
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 170 170 170 170 170 170
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-170 170 170 255 255 255 255 255 255 255 255 255 85 85 85 0 0 0
+-0 0 0 85 85 85 85 85 85 85 85 85 85 85 85 0 0 0
+-85 85 85 85 85 85 0 0 0 85 85 85 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-85 85 85 170 170 170 255 255 255 255 255 255 255 255 255 170 170 170
+-0 0 0 85 85 85 0 0 0 85 85 85 170 170 170 255 255 255
+-255 255 255 170 170 170 85 85 85 0 0 0 0 0 0 0 0 0
+-85 85 85 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 85 85 85
+-0 0 0 85 85 85 85 85 85 0 0 0 85 85 85 85 85 85
+-170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 170 170 170 255 255 255
+-170 170 170 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0
+-0 0 0 85 85 85 85 85 85 0 0 0 85 85 85 0 0 0
+-85 85 85 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 85 85 85
+-85 85 85 255 255 255 255 255 255 255 255 255 170 170 170 170 170 170
+-85 85 85 0 0 0 0 0 0 85 85 85 170 170 170 255 255 255
+-255 255 255 170 170 170 0 0 0 0 0 0 0 0 0 0 0 0
+-170 170 170 255 255 255 170 170 170 0 0 0 0 0 0 0 0 0
+-85 85 85 170 170 170 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-85 85 85 85 85 85 0 0 0 85 85 85 85 85 85 0 0 0
+-85 85 85 85 85 85 170 170 170 85 85 85 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 170 170 170
+-255 255 255 170 170 170 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 170 170 170 255 255 255 255 255 255 255 255 255 170 170 170
+-0 0 0 85 85 85 85 85 85 85 85 85 0 0 0 0 0 0
+-85 85 85 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-170 170 170 170 170 170 255 255 255 170 170 170 255 255 255 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 170 170 170 255 255 255
+-170 170 170 170 170 170 0 0 0 0 0 0 0 0 0 85 85 85
+-170 170 170 255 255 255 255 255 255 0 0 0 0 0 0 85 85 85
+-255 255 255 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 85 85 85
+-85 85 85 0 0 0 85 85 85 85 85 85 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 255 255 255
+-255 255 255 255 255 255 170 170 170 0 0 0 0 0 0 0 0 0
+-85 85 85 170 170 170 255 255 255 170 170 170 170 170 170 170 170 170
+-85 85 85 85 85 85 0 0 0 85 85 85 0 0 0 85 85 85
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 85 85 85
+-85 85 85 170 170 170 255 255 255 170 170 170 170 170 170 85 85 85
+-85 85 85 0 0 0 85 85 85 85 85 85 85 85 85 170 170 170
+-170 170 170 85 85 85 85 85 85 0 0 0 0 0 0 85 85 85
+-170 170 170 170 170 170 85 85 85 0 0 0 0 0 0 170 170 170
+-170 170 170 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 170 170 170 170 170 170
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 170 170 170
+-255 255 255 170 170 170 170 170 170 85 85 85 0 0 0 0 0 0
+-0 0 0 85 85 85 170 170 170 170 170 170 255 255 85 85 85 85
+-85 85 85 85 85 85 85 85 85 0 0 0 0 0 0 0 0 0
+-85 85 85 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 85 85 85 0 0 0 85 85 85
+-85 85 85 170 170 170 170 170 170 170 170 170 170 85 0 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 170 170 170 170 85 0
+-170 170 170 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-170 85 0 170 170 170 85 85 85 0 0 0 85 85 85 85 85 85
+-170 170 170 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 170 170 170 255 255 255
+-170 170 170 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-255 255 255 170 170 170 170 170 170 85 85 85 0 0 0 0 0 0
+-0 0 0 85 85 85 170 85 0 170 170 170 170 170 170 85 85 85
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 85 85 85
+-85 85 85 170 85 0 85 255 85 170 85 0 170 170 170 85 85 85
+-85 85 85 0 0 0 0 0 0 85 85 85 170 85 0 85 255 85
+-170 85 0 85 85 85 0 0 0 85 85 85 0 0 0 85 85 85
+-85 85 85 85 85 85 170 85 0 0 0 0 85 85 85 85 85 85
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 255 255 255
+-255 255 255 170 170 170 0 0 0 0 0 0 0 0 0 0 0 0
+-170 170 170 170 170 170 170 170 170 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 170 170 170 170 85 0 170 170 170 170 85 0
+-85 85 85 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 85 85 85 85 85 85 0 0 0
+-85 85 85 85 85 85 255 85 85 170 170 170 85 255 85 170 85 0
+-85 85 85 85 85 85 170 85 0 85 85 85 170 170 170 85 85 85
+-170 170 170 170 85 0 85 85 85 85 85 85 85 85 85 85 85 85
+-170 85 0 85 255 85 85 85 85 85 85 85 85 85 85 170 85 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 85 85 85 0 0 0 0 0 0 0 0 0 170 170 170
+-255 255 255 170 170 170 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 170 85 0 170 170 170 170 85 0 85 85 85 0 0 0
+-85 85 85 85 85 85 85 255 85 170 170 170 170 170 170 170 85 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85
+-0 0 0 85 85 85 85 85 85 0 0 0 85 85 85 85 85 85
+-85 85 85 85 85 85 85 255 85 255 85 85 170 170 170 170 170 170
+-170 170 170 85 255 85 170 170 170 170 85 0 170 170 170 170 85 0
+-170 170 170 85 85 85 85 255 85 170 85 0 170 170 170 170 85 0
+-170 170 170 170 170 170 170 85 0 85 85 85 85 85 85 85 255 85
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 170 170 170 170 170 170 0 0 0 0 0 0 85 85 85
+-170 170 170 170 170 170 85 85 85 0 0 0 0 0 0 0 0 0
+-85 85 85 85 85 85 255 255 85 85 85 85 85 85 85 85 85 85
+-85 255 85 255 85 85 170 170 170 170 85 0 170 170 170 85 255 85
+-85 85 85 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 85 85 85 85 85 85 0 0 0
+-85 85 85 85 85 85 170 85 0 170 170 170 170 170 170 255 255 85
+-170 170 170 255 85 85 170 170 170 170 170 170 255 255 85 170 170 170
+-85 255 85 170 170 170 255 85 85 170 170 170 170 170 170 170 170 170
+-170 170 170 170 170 170 170 170 170 170 85 0 170 170 170 170 85 0
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 170 170 170 85 85 85 0 0 0 85 85 85
+-85 85 85 170 85 0 85 85 85 0 0 0 85 85 85 85 85 85
+-85 85 85 170 85 0 170 170 170 170 170 170 255 255 85 170 170 170
+-170 170 170 170 170 170 255 255 85 170 170 170 170 170 170 255 85 85
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-85 85 85 85 85 85 0 0 0 85 85 85 85 85 85 85 85 85
+-85 85 85 85 85 85 170 170 170 255 255 85 170 170 170 170 170 170
+-170 170 170 255 255 85 170 170 170 170 170 170 170 170 170 170 85 0
+-170 170 170 255 255 85 170 170 170 255 255 85 170 170 170 255 255 85
+-170 170 170 255 255 85 170 170 170 170 170 170 85 255 85 170 85 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 170 170 170 85 85 85 85 85 85 0 0 0
+-85 85 85 85 85 85 170 170 170 85 85 85 170 170 170 170 85 0
+-170 170 170 85 255 85 170 170 170 170 85 0 170 170 170 170 170 170
+-255 255 85 170 170 170 170 170 170 255 255 255 255 255 85 170 170 170
+-255 255 85 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 85 85 85 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-85 85 85 170 85 0 170 170 170 170 170 170 170 170 170 255 255 255
+-170 170 170 255 255 255 255 255 85 170 170 170 255 255 85 170 170 170
+-255 255 85 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170
+-170 170 170 170 170 170 170 170 170 255 85 85 170 170 170 170 170 170
+-85 85 85 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 85 85 85 170 85 0 85 85 85
+-85 85 85 255 255 85 170 170 170 170 170 170 170 170 170 170 170 170
+-255 255 85 170 170 170 170 170 170 255 255 85 170 170 170 170 170 170
+-170 170 170 255 255 255 255 255 255 170 170 170 255 255 255 170 170 170
+-170 170 170 85 85 85 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 170 170 170 170 170 170 85 85 85 0 0 0 0 0 0
+-0 0 0 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+-85 85 85 85 255 85 170 170 170 255 255 85 255 255 255 255 255 255
+-255 255 255 170 170 170 255 255 255 170 170 170 170 170 170 170 170 170
+-170 170 170 170 170 170 255 255 85 170 170 170 255 255 85 255 255 255
+-255 255 85 255 255 255 255 255 85 170 170 170 170 170 170 170 85 0
+-170 170 170 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 85 85 85
+-85 85 85 170 170 170 255 255 85 170 170 170 255 255 85 170 170 170
+-170 170 170 255 255 85 170 170 170 170 170 170 170 170 170 255 255 85
+-255 255 255 255 255 255 255 255 85 255 255 255 255 255 255 170 170 170
+-255 255 85 85 85 85 85 85 85 0 0 0 0 0 0 85 85 85
+-85 85 85 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-85 85 85 170 170 170 170 170 170 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-85 85 85 170 170 170 170 170 170 170 170 170 255 255 255 170 170 170
+-255 255 255 255 255 255 255 255 255 170 170 170 170 170 170 255 255 85
+-170 170 170 255 255 85 170 170 170 255 255 255 170 170 170 255 255 255
+-255 255 255 255 255 255 170 170 170 255 255 85 170 170 170 255 255 85
+-85 85 85 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 170 85 0 170 170 170
+-255 255 85 170 170 170 170 170 170 255 255 255 255 255 255 255 255 255
+-170 170 170 170 170 170 170 170 170 255 255 85 170 170 170 170 170 170
+-255 255 255 170 170 170 255 255 255 255 255 255 170 170 170 255 255 255
+-170 170 170 170 170 170 85 85 85 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 170 170 170 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 85 85 85 85 85 85 0 0 0
+-85 85 85 170 85 0 255 255 255 170 170 170 255 255 255 255 255 255
+-255 255 85 255 255 255 170 170 170 255 255 85 170 170 170 170 170 170
+-170 170 170 170 170 170 170 170 170 255 255 85 255 255 255 255 255 255
+-170 170 170 255 255 255 255 255 255 170 170 170 170 170 170 170 170 170
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 85 255 85 170 170 170
+-170 170 170 255 255 85 170 170 170 255 255 255 170 170 170 255 255 255
+-255 255 255 255 255 255 255 255 85 170 170 170 170 170 170 255 255 255
+-170 170 170 255 255 255 255 255 255 170 170 170 255 255 255 255 255 85
+-170 170 170 170 85 0 85 85 85 0 0 0 0 0 0 85 85 85
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 85 85 85 0 0 0 0 0 0 0 0 0 85 85 85
+-85 85 85 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 170 170 170 170 170 170 255 255 85 170 170 170 255 255 255
+-255 255 255 170 170 170 255 255 255 170 170 170 170 170 170 255 255 85
+-170 170 170 255 255 85 170 170 170 255 255 255 170 170 170 255 255 255
+-255 255 255 255 255 255 255 255 255 255 255 255 170 170 170 255 255 85
+-85 85 85 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 170 85 0 170 170 170
+-170 170 170 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+-170 170 170 170 170 170 170 170 170 170 170 170 255 255 85 170 170 170
+-255 255 85 255 255 255 170 170 170 255 255 255 170 170 170 170 170 170
+-170 170 170 170 170 170 85 85 85 0 0 0 85 85 85 85 85 85
+-0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85
+-85 85 85 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-85 85 85 85 85 85 170 170 170 170 170 170 255 255 255 170 170 170
+-255 255 255 170 170 170 255 255 85 170 170 170 170 170 170 170 170 170
+-255 85 85 170 170 170 170 170 170 170 170 170 255 255 255 255 255 255
+-170 170 170 255 255 255 255 255 255 170 170 170 255 255 255 170 170 170
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 170 170 170
+-255 255 85 170 170 170 255 255 255 170 170 170 255 255 255 255 255 255
+-255 255 85 255 255 255 170 170 170 255 255 85 170 170 170 170 170 170
+-170 170 170 170 170 170 255 255 85 170 170 170 170 170 170 255 255 85
+-170 170 170 170 85 0 85 85 85 0 0 0 85 85 85 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 170 170 170 170 170 170
+-170 170 170 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 170 170 170 255 255 85 170 170 170 170 170 170
+-255 255 85 170 170 170 170 170 170 170 170 170 170 170 170 255 85 85
+-85 255 85 170 170 170 170 170 170 170 170 170 255 255 85 170 170 170
+-255 255 255 255 255 255 255 255 255 255 255 85 170 170 170 170 170 170
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 255 255 85
+-170 170 170 170 170 170 255 255 255 255 255 255 255 255 255 170 170 170
+-255 255 255 170 170 170 170 170 170 170 170 170 170 170 170 255 85 85
+-170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170
+-170 170 170 85 85 85 85 85 85 0 0 0 85 85 85 0 0 0
+-85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 170 170 170 170 170 170 170 170 170
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 85 85 85 170 85 0 170 170 170 170 170 170 170 170 170
+-170 170 170 170 170 170 170 170 170 170 85 0 170 170 170 85 255 85
+-255 85 85 170 170 170 255 255 85 170 170 170 170 170 170 255 255 255
+-255 255 255 170 170 170 255 255 255 255 255 255 170 170 170 170 170 170
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 170 170 170
+-170 170 170 255 255 85 170 170 170 255 255 85 255 255 255 255 255 255
+-170 170 170 170 170 170 255 255 85 170 170 170 255 85 85 85 255 85
+-170 170 170 170 85 0 170 170 170 170 170 170 255 255 85 170 170 170
+-170 85 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 85 85 85 85 85 85 85 85 85 170 170 170 255 255 85
+-170 170 170 170 85 0 170 170 170 170 170 170 170 85 0 85 85 85
+-170 170 170 170 85 0 85 85 85 170 170 170 170 170 170 170 170 170
+-170 170 170 255 255 255 255 255 255 255 255 85 170 170 170 170 170 170
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 170 85 0
+-170 170 170 170 170 170 255 255 255 170 170 170 255 255 255 170 170 170
+-255 255 255 170 170 170 170 170 170 170 85 0 170 170 170 85 85 85
+-170 170 170 170 170 170 170 85 0 170 170 170 170 85 0 85 85 85
+-85 255 85 85 85 85 0 0 0 0 0 0 0 0 0 85 85 85
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 85 85 85
+-85 85 85 0 0 0 85 85 85 170 85 0 85 85 85 170 170 170
+-170 85 0 170 170 170 85 255 85 170 85 0 170 170 170 85 85 85
+-170 85 0 170 170 170 170 170 170 255 255 85 170 170 170 255 255 255
+-255 255 85 255 255 255 170 170 170 170 170 170 170 170 170 170 85 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 255 255 85
+-170 170 170 255 255 85 170 170 170 170 170 170 85 255 85 170 170 170
+-170 85 0 170 85 0 170 170 170 85 255 85 85 85 85 170 170 170
+-170 85 0 85 85 85 0 0 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 170 170 170 85 85 85
+-0 0 0 0 0 0 0 0 0 85 85 85 170 85 0 85 85 85
+-170 170 170 170 85 0 170 170 170 85 85 85 170 170 170 170 85 0
+-170 170 170 85 255 85 170 85 0 170 170 170 170 170 170 170 170 170
+-255 255 255 170 170 170 255 255 255 255 255 255 170 170 170 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-170 85 0 170 170 170 255 255 85 170 170 170 255 255 255 170 170 170
+-170 170 170 170 170 170 170 170 170 170 85 0 170 170 170 170 85 0
+-170 170 170 85 255 85 170 85 0 170 170 170 170 85 0 85 85 85
+-85 85 85 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 85 85 85
+-85 255 85 170 170 170 170 85 0 170 170 170 170 85 0 85 255 85
+-170 170 170 170 85 0 170 170 170 170 170 170 170 170 170 255 255 85
+-170 170 170 255 255 255 170 170 170 170 170 170 170 170 170 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 170 85 0 85 85 85 170 170 170 255 255 85 170 170 170
+-170 170 170 255 255 85 170 170 170 170 170 170 170 170 170 170 85 0
+-170 170 170 85 85 85 170 170 170 170 85 0 170 170 170 85 85 85
+-170 85 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 170 85 0
+-85 85 85 255 85 85 85 255 85 170 85 0 170 170 170 170 170 170
+-170 85 0 170 170 170 85 85 85 255 255 85 170 170 170 170 170 170
+-255 255 255 170 170 170 255 255 255 255 255 85 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 170 170 170 170 85 0 170 170 170 170 170 170
+-170 170 170 170 170 170 170 170 170 255 255 85 85 85 85 170 170 170
+-85 255 85 255 85 85 170 170 170 85 255 85 255 85 85 85 255 85
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 85 85 85 0 0 0 85 85 85
+-85 85 85 85 255 85 255 85 85 170 170 170 85 255 85 170 85 0
+-170 170 170 170 170 170 255 255 85 170 170 170 170 170 170 255 255 255
+-170 170 170 255 255 255 170 170 170 170 170 170 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 170 170 170 85 85 85 255 255 85
+-170 170 170 255 255 85 170 170 170 170 170 170 170 170 170 255 255 85
+-85 85 85 255 255 85 170 170 170 170 85 0 170 170 170 85 85 85
+-170 85 0 85 85 85 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-170 170 170 170 85 0 170 170 170 170 85 0 170 170 170 170 170 170
+-170 85 0 170 170 170 170 170 170 170 170 170 255 255 85 170 170 170
+-255 255 85 255 255 255 170 170 170 170 170 170 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 170 85 0 85 85 85 170 170 170
+-170 85 0 170 170 170 170 170 170 255 255 85 170 170 170 170 170 170
+-170 170 170 170 170 170 170 170 170 255 255 85 170 170 170 170 85 0
+-85 85 85 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85
+-170 85 0 85 255 85 170 170 170 170 170 170 255 255 85 170 170 170
+-255 255 85 170 170 170 170 170 170 170 170 170 255 255 255 255 255 255
+-255 255 255 170 170 170 255 255 85 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 170 85 0
+-170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 255 255 85
+-170 170 170 255 255 85 170 170 170 170 170 170 170 170 170 170 170 170
+-170 170 170 85 85 85 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-85 85 85 170 85 0 170 170 170 170 85 0 170 170 170 170 170 170
+-170 170 170 255 255 85 170 170 170 255 255 85 170 170 170 255 255 255
+-170 170 170 255 255 255 170 170 170 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 85 85 85
+-170 85 0 170 170 170 170 85 0 255 255 85 170 170 170 170 170 170
+-170 170 170 170 170 170 255 255 85 170 170 170 255 255 85 170 170 170
+-255 255 85 85 85 85 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85
+-85 85 85 170 170 170 255 255 85 170 170 170 255 255 85 170 170 170
+-170 170 170 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+-170 170 170 170 170 170 170 170 170 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 170 0 85 85 85
+-170 85 0 85 255 85 170 170 170 170 170 170 170 170 170 255 255 85
+-255 255 255 170 170 170 255 255 255 170 170 170 255 255 255 170 170 170
+-170 170 170 255 255 85 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-170 85 0 170 170 170 170 170 170 170 170 170 170 170 170 255 255 85
+-170 170 170 255 255 255 170 170 170 255 255 255 170 170 170 255 255 255
+-255 255 255 255 255 85 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-85 85 85 170 85 0 170 170 170 170 170 170 255 255 85 170 170 170
+-170 170 170 255 255 255 255 255 255 255 255 255 170 170 170 255 255 255
+-170 170 170 170 170 170 170 170 170 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 85 255 85
+-170 170 170 255 255 85 170 170 170 255 255 85 255 255 255 255 255 255
+-255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 170 170 170
+-170 170 170 170 170 170 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 85 85 85 85 85 85 170 85 0 170 170 170 170 170 170
+-255 255 85 170 170 170 255 255 255 255 255 85 255 255 255 255 255 255
+-170 170 170 255 255 85 170 170 170 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 170 85 0
+-170 170 170 170 170 170 170 170 170 255 255 255 170 170 170 255 255 255
+-170 170 170 255 255 255 170 170 170 255 255 255 255 255 85 255 255 255
+-170 170 170 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 170 85 0 85 85 85 170 170 170 170 170 170 170 170 170
+-170 170 170 255 255 255 170 170 170 255 255 255 255 255 255 170 170 170
+-255 255 85 170 170 170 170 170 170 170 85 0 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 170 170 170
+-255 255 85 170 170 170 255 255 85 170 170 170 255 255 255 255 255 255
+-255 255 255 255 255 255 255 255 255 255 255 255 170 170 170 170 170 170
+-170 170 170 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 85 85 85 85 85 85 170 85 0 170 170 170
+-255 255 85 170 170 170 255 255 85 255 255 255 170 170 170 255 255 255
+-170 170 170 170 170 170 170 170 170 170 170 170 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 170 170 170
+-170 85 0 170 170 170 255 255 255 170 170 170 255 255 255 170 170 170
+-255 255 255 255 255 255 170 170 170 255 255 255 255 255 85 170 170 170
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 85 85 85 170 85 0 85 85 85 170 170 170
+-170 170 170 170 170 170 170 170 170 170 170 170 255 255 85 170 170 170
+-255 255 85 170 170 170 170 85 0 85 255 85 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 170 85 0
+-170 170 170 170 170 170 255 255 85 170 170 170 255 255 255 255 255 255
+-255 255 85 255 255 255 170 170 170 255 255 255 170 170 170 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85
+-170 85 0 170 170 170 170 170 170 255 255 85 170 170 170 170 170 170
+-170 170 170 170 170 170 170 170 170 170 85 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85
+-255 255 85 170 170 170 170 170 170 170 170 170 255 255 85 170 170 170
+-255 255 255 170 170 170 255 255 85 170 170 170 85 85 85 85 85 85
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85
+-85 85 85 170 85 0 170 170 170 170 170 170 170 170 170 170 170 170
+-170 85 0 170 170 170 170 85 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85
+-170 170 170 170 170 170 255 255 85 170 170 170 170 170 170 170 170 170
+-170 170 170 255 255 255 170 170 170 170 170 170 85 85 85 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-85 85 85 85 85 85 85 85 85 170 85 0 85 85 85 170 85 0
+-85 85 85 85 85 85 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 170 85 0
+-85 85 85 170 85 0 170 170 170 170 170 170 170 170 170 255 255 85
+-170 170 170 170 170 170 170 85 0 85 85 85 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+-85 85 85 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85
+-85 85 85 85 255 85 170 85 0 170 170 170 170 85 0 170 170 170
+-85 85 85 85 85 85 85 85 85 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+-85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+-0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 85 85 85 85 85 85 85 85 85
++ 85 85 85 85 85 85 85 85 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 85 85 85 85 85 85
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 85 85 85 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 85 85 85 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 170 170 170 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 85 85 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++170 170 170 170 170 170 85 85 85 0 0 0
++ 0 0 0 0 0 0 85 85 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 85 85 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 85 85 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 85 85 85 170 170 170 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 170 170 170 170 170 170
++170 170 170 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 85 85 85 170 170 170 170 170 170 170 170 170
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 170 170 170 255 255 255 255 255 255
++255 255 255 170 170 170 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 85 85 85
++170 170 170 170 170 170 255 255 255 255 255 255
++ 0 0 0 0 0 0 0 0 0 0 0 0
++170 170 170 255 255 255 170 170 170 170 170 170
++255 255 255 170 170 170 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 85 85 85
++170 170 170 0 0 0 0 0 0 255 255 255
++ 85 85 85 0 0 0 0 0 0 0 0 0
++255 255 255 170 170 170 0 0 0 85 85 85
++170 170 170 255 255 255 170 170 170 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 85 85 85
++ 85 85 85 0 0 0 0 0 0 170 170 170
++ 85 85 85 0 0 0 0 0 0 0 0 0
++255 255 255 85 85 85 0 0 0 0 0 0
++ 85 85 85 255 255 255 170 170 170 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 85 85 85
++170 170 170 0 0 0 0 0 0 170 170 170
++ 85 85 85 85 85 85 85 85 85 85 85 85
++255 255 255 85 85 85 0 0 0 0 0 0
++ 85 85 85 255 255 255 170 170 170 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++255 255 255 0 0 0 0 0 0 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 0 0 0 0 0 0
++ 85 85 85 255 255 255 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++170 170 170 170 170 170 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 170 170 170 170 170 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 85 85 85 0 0 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 170 85 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 85 85 85 0 0 0
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 170 85 0
++170 85 0 170 85 0 85 85 85 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 85 85 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 85 85 85 0 0 0
++ 85 85 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++170 85 0 170 85 0 170 85 0 170 85 0
++170 85 0 170 85 0 85 85 85 0 0 0
++ 0 0 0 85 85 85 170 170 170 85 85 85
++ 0 0 0 0 0 0 85 85 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 85 85 85 0 0 0
++ 85 85 85 170 85 0 170 85 0 170 85 0
++170 85 0 170 85 0 170 85 0 170 85 0
++170 85 0 170 85 0 170 85 0 170 85 0
++170 170 170 170 170 170 170 170 170 0 0 0
++ 0 0 0 0 0 0 170 170 170 170 170 170
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 85 85 85 170 170 170 170 85 0 170 85 0
++170 85 0 170 85 0 170 85 0 170 85 0
++170 85 0 170 85 0 170 170 170 170 170 170
++170 170 170 170 170 170 170 170 170 85 85 85
++ 0 0 0 0 0 0 85 85 85 85 85 85
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 85 85 85 170 170 170 170 170 170 170 85 0
++170 85 0 170 85 0 170 85 0 170 85 0
++170 170 170 170 170 170 170 170 170 170 170 170
++255 255 255 255 255 255 255 255 255 170 170 170
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 85 85 85
++255 255 255 255 255 255 170 170 170 170 170 170
++170 170 170 170 170 170 170 170 170 170 170 170
++170 170 170 170 170 170 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 170 170 170
++255 255 255 255 255 255 170 170 170 170 170 170
++170 170 170 170 170 170 170 170 170 170 170 170
++170 170 170 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++170 170 170 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 85 85 85 255 255 255
++255 255 255 255 255 255 255 255 255 170 170 170
++170 170 170 170 170 170 170 170 170 170 170 170
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 85 85 85 0 0 0
++ 0 0 0 85 85 85 170 170 170 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 85 85 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 85 85 85 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 170 170 170 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 85 85 85 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 85 85 85 170 170 170 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 85 85 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 170 170 170 170 170 170 170 170 170
++255 255 255 255 255 255 255 255 255 170 170 170
++170 170 170 170 170 170 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++170 170 170 170 170 170 170 170 170 170 170 170
++170 170 170 170 170 170 170 170 170 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++170 170 170 170 170 170 170 170 170 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++170 170 170 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 170 170 170 170 170 170
++170 170 170 170 170 170 170 170 170 85 85 85
++ 0 0 0 0 0 0 85 85 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 85 85 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 85 85 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++170 170 170 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 170 170 170 170 170 170 170 170 170
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 85 85 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 85 85 85 0 0 0
++ 85 85 85 0 0 0 0 0 0 85 85 85
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 170 170 170 170 170 170
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 170 170 170
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++170 170 170 85 85 85 0 0 0 0 0 0
++ 0 0 0 85 85 85 85 85 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 85 85 85
++ 0 0 0 0 0 0 85 85 85 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 170 170 170 0 0 0 85 85 85
++ 85 85 85 0 0 0 85 85 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 85 85 85
++ 0 0 0 85 85 85 170 170 170 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 170 170 170 0 0 0 85 85 85
++ 85 85 85 0 0 0 85 85 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 85 85 85
++ 0 0 0 170 170 170 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 85 85 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 85 85 85 0 0 0
++ 0 0 0 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 170 170 170 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 85 85 85 0 0 0
++ 85 85 85 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 170 170 170 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 85 85 85 0 0 0 0 0 0
++170 170 170 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 170 170 170 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 85 85 85 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 170 170 170 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 170 170 170 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 85 85 85
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 170 170 170 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 85 85 85
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 170 170 170 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 85 85 85 85 85 85
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 170 170 170 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 170 170 170 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 0 0 0
++ 85 85 85 85 85 85 85 85 85 85 85 85
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 0 0 0 170 85 0
++255 255 85 170 85 0 0 0 0 0 0 0
++ 85 85 85 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 170 170 170 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 85 85 85 85 85 85 0 0 0
++ 0 0 0 85 85 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 0 0 0
++ 0 0 0 85 85 85 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 170 170 170 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 85 170 85 0 255 255 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 85 85 85 85 85 85
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++ 0 0 0 0 0 0 85 85 85 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 85
++170 85 0 255 255 85 170 85 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++170 85 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 0 0 0 0 0 0 85 85 85
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 170 85 0
++255 255 85 170 85 0 255 255 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 170 85 0
++255 255 85 170 85 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 0 0 0 0 0 0 0 0 0
++ 85 85 85 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 85
++170 85 0 255 255 85 170 85 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 255 255 85
++170 85 0 255 255 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 0 0 0 0 0 0
++ 0 0 0 85 85 85 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 170 170 170 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 255 255 85 170 85 0
++255 255 85 170 85 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 0 0 0
++ 0 0 0 0 0 0 85 85 85 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 170 170 170 170 170 170 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 170 170 170 170 170 170 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 170 170 170 170 170 170 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 170 170 170 170 170 170 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 0 0 0 0 0 0 0 0 0
++ 85 85 85 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 170 170 170 85 85 85 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 85 85 85 85 85 85
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++170 170 170 85 85 85 85 85 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 170 170 170
++ 85 85 85 0 0 0 0 0 0 170 85 0
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 170 170 170 85 85 85
++ 0 0 0 0 0 0 0 0 0 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++170 170 170 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++170 170 170 85 85 85 85 85 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 170 85 0
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 170 85 0
++170 85 0 170 170 170 255 255 255 255 255 255
++255 255 255 255 255 255 255 255 255 255 255 255
++255 255 255 255 255 255 170 170 170 85 85 85
++ 85 85 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 85 85 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++170 85 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 85 85 85 170 85 0
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 170 85 0 170 85 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 170 85 0
++170 85 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 85 85 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++170 85 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++170 85 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 85 85 85 170 85 0
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 170 85 0 170 85 0 170 85 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 170 85 0 170 85 0
++170 85 0 170 85 0 170 85 0 170 85 0
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 170 85 0
++170 85 0 0 0 0 0 0 0 0 0 0
++ 85 85 85 85 85 85 85 85 85 85 85 85
++ 85 85 85 85 85 85 85 85 85 85 85 85
++ 85 85 85 85 85 85 85 85 85 0 0 0
++ 0 0 0 0 0 0 0 0 0 170 85 0
++170 85 0 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 255 255 85 170 85 0
++170 85 0 170 85 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 170 85 0 170 85 0
++170 85 0 170 85 0 170 85 0 170 85 0
++170 85 0 170 85 0 255 255 85 170 85 0
++255 255 85 170 85 0 170 85 0 170 85 0
++ 85 85 85 85 85 85 85 85 85 85 85 85
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 85 85 85
++ 85 85 85 85 85 85 85 85 85 170 85 0
++170 85 0 170 85 0 170 85 0 255 255 85
++170 85 0 255 255 85 170 85 0 170 85 0
++170 85 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 170 85 0
++170 85 0 170 85 0 170 85 0 170 85 0
++170 85 0 170 85 0 170 85 0 170 85 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 170 85 0
++170 85 0 170 85 0 170 85 0 170 85 0
++170 85 0 170 85 0 170 85 0 170 85 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 170 85 0 170 85 0 170 85 0
++170 85 0 170 85 0 170 85 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++170 85 0 170 85 0 170 85 0 170 85 0
++170 85 0 170 85 0 170 85 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
++ 0 0 0 0 0 0 0 0 0 0 0 0
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/video/pxafb.c linux-2.6.29-rc3.owrt/drivers/video/pxafb.c
+--- linux-2.6.29.owrt/drivers/video/pxafb.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/video/pxafb.c 2009-05-10 23:48:29.000000000 +0200
+@@ -2230,7 +2230,7 @@
+
+ static struct platform_driver pxafb_driver = {
+ .probe = pxafb_probe,
+- .remove = __devexit_p(pxafb_remove),
++ .remove = pxafb_remove,
+ .suspend = pxafb_suspend,
+ .resume = pxafb_resume,
+ .driver = {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/video/sh_mobile_lcdcfb.c linux-2.6.29-rc3.owrt/drivers/video/sh_mobile_lcdcfb.c
+--- linux-2.6.29.owrt/drivers/video/sh_mobile_lcdcfb.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/video/sh_mobile_lcdcfb.c 2009-05-10 23:48:29.000000000 +0200
+@@ -446,6 +446,7 @@
+ {
+ struct sh_mobile_lcdc_chan *ch;
+ struct sh_mobile_lcdc_board_cfg *board_cfg;
++ unsigned long tmp;
+ int k;
+
+ /* tell the board code to disable the panel */
+@@ -455,8 +456,9 @@
+ if (board_cfg->display_off)
+ board_cfg->display_off(board_cfg->board_data);
+
+- /* cleanup deferred io if enabled */
+- if (ch->info.fbdefio) {
++ /* cleanup deferred io if SYS bus */
++ tmp = ch->cfg.sys_bus_cfg.deferred_io_msec;
++ if (ch->ldmt1r_value & (1 << 12) && tmp) {
+ fb_deferred_io_cleanup(&ch->info);
+ ch->info.fbdefio = NULL;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/virtio/virtio_pci.c linux-2.6.29-rc3.owrt/drivers/virtio/virtio_pci.c
+--- linux-2.6.29.owrt/drivers/virtio/virtio_pci.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/virtio/virtio_pci.c 2009-05-10 23:48:29.000000000 +0200
+@@ -192,7 +192,7 @@
+ drv = container_of(vp_dev->vdev.dev.driver,
+ struct virtio_driver, driver);
+
+- if (drv && drv->config_changed)
++ if (drv->config_changed)
+ drv->config_changed(&vp_dev->vdev);
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/w1/masters/w1-gpio.c linux-2.6.29-rc3.owrt/drivers/w1/masters/w1-gpio.c
+--- linux-2.6.29.owrt/drivers/w1/masters/w1-gpio.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/w1/masters/w1-gpio.c 2009-05-10 23:48:29.000000000 +0200
+@@ -39,7 +39,7 @@
+ {
+ struct w1_gpio_platform_data *pdata = data;
+
+- return gpio_get_value(pdata->pin) ? 1 : 0;
++ return gpio_get_value(pdata->pin);
+ }
+
+ static int __init w1_gpio_probe(struct platform_device *pdev)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/w1/slaves/Kconfig linux-2.6.29-rc3.owrt/drivers/w1/slaves/Kconfig
+--- linux-2.6.29.owrt/drivers/w1/slaves/Kconfig 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/w1/slaves/Kconfig 2009-05-10 23:48:29.000000000 +0200
+@@ -16,12 +16,6 @@
+ Say Y here if you want to connect 1-wire
+ simple 64bit memory rom(ds2401/ds2411/ds1990*) to your wire.
+
+-config W1_SLAVE_DS2431
+- tristate "1kb EEPROM family support (DS2431)"
+- help
+- Say Y here if you want to use a 1-wire
+- 1kb EEPROM family device (DS2431)
+-
+ config W1_SLAVE_DS2433
+ tristate "4kb EEPROM family support (DS2433)"
+ help
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/w1/slaves/Makefile linux-2.6.29-rc3.owrt/drivers/w1/slaves/Makefile
+--- linux-2.6.29.owrt/drivers/w1/slaves/Makefile 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/w1/slaves/Makefile 2009-05-10 23:48:29.000000000 +0200
+@@ -4,7 +4,6 @@
+
+ obj-$(CONFIG_W1_SLAVE_THERM) += w1_therm.o
+ obj-$(CONFIG_W1_SLAVE_SMEM) += w1_smem.o
+-obj-$(CONFIG_W1_SLAVE_DS2431) += w1_ds2431.o
+ obj-$(CONFIG_W1_SLAVE_DS2433) += w1_ds2433.o
+ obj-$(CONFIG_W1_SLAVE_DS2760) += w1_ds2760.o
+ obj-$(CONFIG_W1_SLAVE_BQ27000) += w1_bq27000.o
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/w1/slaves/w1_ds2433.c linux-2.6.29-rc3.owrt/drivers/w1/slaves/w1_ds2433.c
+--- linux-2.6.29.owrt/drivers/w1/slaves/w1_ds2433.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/w1/slaves/w1_ds2433.c 2009-05-10 23:48:29.000000000 +0200
+@@ -156,9 +156,6 @@
+ */
+ static int w1_f23_write(struct w1_slave *sl, int addr, int len, const u8 *data)
+ {
+-#ifdef CONFIG_W1_SLAVE_DS2433_CRC
+- struct w1_f23_data *f23 = sl->family_data;
+-#endif
+ u8 wrbuf[4];
+ u8 rdbuf[W1_PAGE_SIZE + 3];
+ u8 es = (addr + len - 1) & 0x1f;
+@@ -199,9 +196,7 @@
+
+ /* Reset the bus to wake up the EEPROM (this may not be needed) */
+ w1_reset_bus(sl->master);
+-#ifdef CONFIG_W1_SLAVE_DS2433_CRC
+- f23->validcrc &= ~(1 << (addr >> W1_PAGE_BITS));
+-#endif
++
+ return 0;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/w1/slaves/w1_therm.c linux-2.6.29-rc3.owrt/drivers/w1/slaves/w1_therm.c
+--- linux-2.6.29.owrt/drivers/w1/slaves/w1_therm.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/w1/slaves/w1_therm.c 2009-05-10 23:48:29.000000000 +0200
+@@ -115,7 +115,7 @@
+
+ static inline int w1_DS18B20_convert_temp(u8 rom[9])
+ {
+- int t = ((s16)rom[1] << 8) | rom[0];
++ s16 t = (rom[1] << 8) | rom[0];
+ t = t*1000/16;
+ return t;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/watchdog/at91rm9200_wdt.c linux-2.6.29-rc3.owrt/drivers/watchdog/at91rm9200_wdt.c
+--- linux-2.6.29.owrt/drivers/watchdog/at91rm9200_wdt.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/watchdog/at91rm9200_wdt.c 2009-05-10 23:48:29.000000000 +0200
+@@ -107,10 +107,10 @@
+ static int at91_wdt_settimeout(int new_time)
+ {
+ /*
+- * All counting occurs at SLOW_CLOCK / 128 = 256 Hz
++ * All counting occurs at SLOW_CLOCK / 128 = 0.256 Hz
+ *
+ * Since WDV is a 16-bit counter, the maximum period is
+- * 65536 / 256 = 256 seconds.
++ * 65536 / 0.256 = 256 seconds.
+ */
+ if ((new_time <= 0) || (new_time > WDT_MAX_TIME))
+ return -EINVAL;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/watchdog/at91sam9_wdt.c linux-2.6.29-rc3.owrt/drivers/watchdog/at91sam9_wdt.c
+--- linux-2.6.29.owrt/drivers/watchdog/at91sam9_wdt.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/watchdog/at91sam9_wdt.c 2009-05-10 23:48:29.000000000 +0200
+@@ -18,7 +18,6 @@
+ #include <linux/errno.h>
+ #include <linux/fs.h>
+ #include <linux/init.h>
+-#include <linux/io.h>
+ #include <linux/kernel.h>
+ #include <linux/miscdevice.h>
+ #include <linux/module.h>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/watchdog/gef_wdt.c linux-2.6.29-rc3.owrt/drivers/watchdog/gef_wdt.c
+--- linux-2.6.29.owrt/drivers/watchdog/gef_wdt.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/watchdog/gef_wdt.c 2009-05-10 23:48:29.000000000 +0200
+@@ -269,7 +269,7 @@
+ bus_clk = 133; /* in MHz */
+
+ freq = fsl_get_sys_freq();
+- if (freq != -1)
++ if (freq > 0)
+ bus_clk = freq;
+
+ /* Map devices registers into memory */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/watchdog/iTCO_vendor_support.c linux-2.6.29-rc3.owrt/drivers/watchdog/iTCO_vendor_support.c
+--- linux-2.6.29.owrt/drivers/watchdog/iTCO_vendor_support.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/watchdog/iTCO_vendor_support.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,7 @@
+ /*
+ * intel TCO vendor specific watchdog driver support
+ *
+- * (c) Copyright 2006-2009 Wim Van Sebroeck <wim@iguana.be>.
++ * (c) Copyright 2006-2008 Wim Van Sebroeck <wim@iguana.be>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+@@ -19,7 +19,7 @@
+
+ /* Module and version information */
+ #define DRV_NAME "iTCO_vendor_support"
+-#define DRV_VERSION "1.03"
++#define DRV_VERSION "1.02"
+ #define PFX DRV_NAME ": "
+
+ /* Includes */
+@@ -77,26 +77,6 @@
+ * 20.6 seconds.
+ */
+
+-static void supermicro_old_pre_start(unsigned long acpibase)
+-{
+- unsigned long val32;
+-
+- /* Bit 13: TCO_EN -> 0 = Disables TCO logic generating an SMI# */
+- val32 = inl(SMI_EN);
+- val32 &= 0xffffdfff; /* Turn off SMI clearing watchdog */
+- outl(val32, SMI_EN); /* Needed to activate watchdog */
+-}
+-
+-static void supermicro_old_pre_stop(unsigned long acpibase)
+-{
+- unsigned long val32;
+-
+- /* Bit 13: TCO_EN -> 1 = Enables the TCO logic to generate SMI# */
+- val32 = inl(SMI_EN);
+- val32 |= 0x00002000; /* Turn on SMI clearing watchdog */
+- outl(val32, SMI_EN); /* Needed to deactivate watchdog */
+-}
+-
+ static void supermicro_old_pre_keepalive(unsigned long acpibase)
+ {
+ /* Reload TCO Timer (done in iTCO_wdt_keepalive) + */
+@@ -248,18 +228,14 @@
+ void iTCO_vendor_pre_start(unsigned long acpibase,
+ unsigned int heartbeat)
+ {
+- if (vendorsupport == SUPERMICRO_OLD_BOARD)
+- supermicro_old_pre_start(acpibase);
+- else if (vendorsupport == SUPERMICRO_NEW_BOARD)
++ if (vendorsupport == SUPERMICRO_NEW_BOARD)
+ supermicro_new_pre_start(heartbeat);
+ }
+ EXPORT_SYMBOL(iTCO_vendor_pre_start);
+
+ void iTCO_vendor_pre_stop(unsigned long acpibase)
+ {
+- if (vendorsupport == SUPERMICRO_OLD_BOARD)
+- supermicro_old_pre_stop(acpibase);
+- else if (vendorsupport == SUPERMICRO_NEW_BOARD)
++ if (vendorsupport == SUPERMICRO_NEW_BOARD)
+ supermicro_new_pre_stop();
+ }
+ EXPORT_SYMBOL(iTCO_vendor_pre_stop);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/watchdog/iTCO_wdt.c linux-2.6.29-rc3.owrt/drivers/watchdog/iTCO_wdt.c
+--- linux-2.6.29.owrt/drivers/watchdog/iTCO_wdt.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/watchdog/iTCO_wdt.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,7 @@
+ /*
+- * intel TCO Watchdog Driver (Used in i82801 and i63xxESB chipsets)
++ * intel TCO Watchdog Driver (Used in i82801 and i6300ESB chipsets)
+ *
+- * (c) Copyright 2006-2009 Wim Van Sebroeck <wim@iguana.be>.
++ * (c) Copyright 2006-2008 Wim Van Sebroeck <wim@iguana.be>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+@@ -63,7 +63,7 @@
+
+ /* Module and version information */
+ #define DRV_NAME "iTCO_wdt"
+-#define DRV_VERSION "1.05"
++#define DRV_VERSION "1.04"
+ #define PFX DRV_NAME ": "
+
+ /* Includes */
+@@ -236,16 +236,16 @@
+
+ /* Address definitions for the TCO */
+ /* TCO base address */
+-#define TCOBASE iTCO_wdt_private.ACPIBASE + 0x60
++#define TCOBASE iTCO_wdt_private.ACPIBASE + 0x60
+ /* SMI Control and Enable Register */
+-#define SMI_EN iTCO_wdt_private.ACPIBASE + 0x30
++#define SMI_EN iTCO_wdt_private.ACPIBASE + 0x30
+
+ #define TCO_RLD TCOBASE + 0x00 /* TCO Timer Reload and Curr. Value */
+ #define TCOv1_TMR TCOBASE + 0x01 /* TCOv1 Timer Initial Value */
+-#define TCO_DAT_IN TCOBASE + 0x02 /* TCO Data In Register */
+-#define TCO_DAT_OUT TCOBASE + 0x03 /* TCO Data Out Register */
+-#define TCO1_STS TCOBASE + 0x04 /* TCO1 Status Register */
+-#define TCO2_STS TCOBASE + 0x06 /* TCO2 Status Register */
++#define TCO_DAT_IN TCOBASE + 0x02 /* TCO Data In Register */
++#define TCO_DAT_OUT TCOBASE + 0x03 /* TCO Data Out Register */
++#define TCO1_STS TCOBASE + 0x04 /* TCO1 Status Register */
++#define TCO2_STS TCOBASE + 0x06 /* TCO2 Status Register */
+ #define TCO1_CNT TCOBASE + 0x08 /* TCO1 Control Register */
+ #define TCO2_CNT TCOBASE + 0x0a /* TCO2 Control Register */
+ #define TCOv2_TMR TCOBASE + 0x12 /* TCOv2 Timer Initial Value */
+@@ -338,6 +338,7 @@
+ static int iTCO_wdt_start(void)
+ {
+ unsigned int val;
++ unsigned long val32;
+
+ spin_lock(&iTCO_wdt_private.io_lock);
+
+@@ -350,6 +351,11 @@
+ return -EIO;
+ }
+
++ /* Bit 13: TCO_EN -> 0 = Disables TCO logic generating an SMI# */
++ val32 = inl(SMI_EN);
++ val32 &= 0xffffdfff; /* Turn off SMI clearing watchdog */
++ outl(val32, SMI_EN);
++
+ /* Force the timer to its reload value by writing to the TCO_RLD
+ register */
+ if (iTCO_wdt_private.iTCO_version == 2)
+@@ -372,6 +378,7 @@
+ static int iTCO_wdt_stop(void)
+ {
+ unsigned int val;
++ unsigned long val32;
+
+ spin_lock(&iTCO_wdt_private.io_lock);
+
+@@ -383,6 +390,11 @@
+ outw(val, TCO1_CNT);
+ val = inw(TCO1_CNT);
+
++ /* Bit 13: TCO_EN -> 1 = Enables the TCO logic to generate SMI# */
++ val32 = inl(SMI_EN);
++ val32 |= 0x00002000;
++ outl(val32, SMI_EN);
++
+ /* Set the NO_REBOOT bit to prevent later reboots, just for sure */
+ iTCO_wdt_set_NO_REBOOT_bit();
+
+@@ -637,7 +649,6 @@
+ int ret;
+ u32 base_address;
+ unsigned long RCBA;
+- unsigned long val32;
+
+ /*
+ * Find the ACPI/PM base I/O address which is the base
+@@ -684,10 +695,6 @@
+ ret = -EIO;
+ goto out;
+ }
+- /* Bit 13: TCO_EN -> 0 = Disables TCO logic generating an SMI# */
+- val32 = inl(SMI_EN);
+- val32 &= 0xffffdfff; /* Turn off SMI clearing watchdog */
+- outl(val32, SMI_EN);
+
+ /* The TCO I/O registers reside in a 32-byte range pointed to
+ by the TCOBASE value */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/watchdog/Kconfig linux-2.6.29-rc3.owrt/drivers/watchdog/Kconfig
+--- linux-2.6.29.owrt/drivers/watchdog/Kconfig 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/watchdog/Kconfig 2009-05-10 23:48:29.000000000 +0200
+@@ -406,7 +406,7 @@
+ ---help---
+ Hardware driver for the intel TCO timer based watchdog devices.
+ These drivers are included in the Intel 82801 I/O Controller
+- Hub family (from ICH0 up to ICH10) and in the Intel 63xxESB
++ Hub family (from ICH0 up to ICH8) and in the Intel 6300ESB
+ controller hub.
+
+ The TCO (Total Cost of Ownership) timer is a watchdog timer
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/watchdog/ks8695_wdt.c linux-2.6.29-rc3.owrt/drivers/watchdog/ks8695_wdt.c
+--- linux-2.6.29.owrt/drivers/watchdog/ks8695_wdt.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/watchdog/ks8695_wdt.c 2009-05-10 23:48:29.000000000 +0200
+@@ -21,7 +21,6 @@
+ #include <linux/watchdog.h>
+ #include <linux/io.h>
+ #include <linux/uaccess.h>
+-#include <mach/timex.h>
+ #include <mach/regs-timer.h>
+
+ #define WDT_DEFAULT_TIME 5 /* seconds */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/watchdog/orion5x_wdt.c linux-2.6.29-rc3.owrt/drivers/watchdog/orion5x_wdt.c
+--- linux-2.6.29.owrt/drivers/watchdog/orion5x_wdt.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/watchdog/orion5x_wdt.c 2009-05-10 23:48:29.000000000 +0200
+@@ -29,7 +29,6 @@
+ #define WDT_EN 0x0010
+ #define WDT_VAL (TIMER_VIRT_BASE + 0x0024)
+
+-#define ORION5X_TCLK 166666667
+ #define WDT_MAX_DURATION (0xffffffff / ORION5X_TCLK)
+ #define WDT_IN_USE 0
+ #define WDT_OK_TO_CLOSE 1
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/watchdog/rc32434_wdt.c linux-2.6.29-rc3.owrt/drivers/watchdog/rc32434_wdt.c
+--- linux-2.6.29.owrt/drivers/watchdog/rc32434_wdt.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/watchdog/rc32434_wdt.c 2009-05-10 23:48:29.000000000 +0200
+@@ -34,89 +34,104 @@
+ #include <asm/time.h>
+ #include <asm/mach-rc32434/integ.h>
+
+-#define VERSION "0.4"
++#define MAX_TIMEOUT 20
++#define RC32434_WDT_INTERVAL (15 * HZ)
++
++#define VERSION "0.2"
+
+ static struct {
++ struct completion stop;
++ int running;
++ struct timer_list timer;
++ int queue;
++ int default_ticks;
+ unsigned long inuse;
+ } rc32434_wdt_device;
+
+ static struct integ __iomem *wdt_reg;
++static int ticks = 100 * HZ;
+
+ static int expect_close;
+-
+-/* Board internal clock speed in Hz,
+- * the watchdog timer ticks at. */
+-extern unsigned int idt_cpu_freq;
+-
+-/* translate wtcompare value to seconds and vice versa */
+-#define WTCOMP2SEC(x) (x / idt_cpu_freq)
+-#define SEC2WTCOMP(x) (x * idt_cpu_freq)
+-
+-/* Use a default timeout of 20s. This should be
+- * safe for CPU clock speeds up to 400MHz, as
+- * ((2 ^ 32) - 1) / (400MHz / 2) = 21s. */
+-#define WATCHDOG_TIMEOUT 20
+-
+-static int timeout = WATCHDOG_TIMEOUT;
++static int timeout;
+
+ static int nowayout = WATCHDOG_NOWAYOUT;
+ module_param(nowayout, int, 0);
+ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
+ __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
+
+-/* apply or and nand masks to data read from addr and write back */
+-#define SET_BITS(addr, or, nand) \
+- writel((readl(&addr) | or) & ~nand, &addr)
+
+ static void rc32434_wdt_start(void)
+ {
+- u32 or, nand;
+-
+- /* zero the counter before enabling */
+- writel(0, &wdt_reg->wtcount);
+-
+- /* don't generate a non-maskable interrupt,
+- * do a warm reset instead */
+- nand = 1 << RC32434_ERR_WNE;
+- or = 1 << RC32434_ERR_WRE;
++ u32 val;
+
+- /* reset the ERRCS timeout bit in case it's set */
+- nand |= 1 << RC32434_ERR_WTO;
++ if (!rc32434_wdt_device.inuse) {
++ writel(0, &wdt_reg->wtcount);
+
+- SET_BITS(wdt_reg->errcs, or, nand);
++ val = RC32434_ERR_WRE;
++ writel(readl(&wdt_reg->errcs) | val, &wdt_reg->errcs);
+
+- /* reset WTC timeout bit and enable WDT */
+- nand = 1 << RC32434_WTC_TO;
+- or = 1 << RC32434_WTC_EN;
+-
+- SET_BITS(wdt_reg->wtc, or, nand);
++ val = RC32434_WTC_EN;
++ writel(readl(&wdt_reg->wtc) | val, &wdt_reg->wtc);
++ }
++ rc32434_wdt_device.running++;
+ }
+
+ static void rc32434_wdt_stop(void)
+ {
+- /* Disable WDT */
+- SET_BITS(wdt_reg->wtc, 0, 1 << RC32434_WTC_EN);
++ u32 val;
++
++ if (rc32434_wdt_device.running) {
++
++ val = ~RC32434_WTC_EN;
++ writel(readl(&wdt_reg->wtc) & val, &wdt_reg->wtc);
++
++ val = ~RC32434_ERR_WRE;
++ writel(readl(&wdt_reg->errcs) & val, &wdt_reg->errcs);
++
++ rc32434_wdt_device.running = 0;
++ }
+ }
+
+-static int rc32434_wdt_set(int new_timeout)
++static void rc32434_wdt_set(int new_timeout)
+ {
+- int max_to = WTCOMP2SEC((u32)-1);
++ u32 cmp = new_timeout * HZ;
++ u32 state, val;
+
+- if (new_timeout < 0 || new_timeout > max_to) {
+- printk(KERN_ERR KBUILD_MODNAME
+- ": timeout value must be between 0 and %d",
+- max_to);
+- return -EINVAL;
+- }
+ timeout = new_timeout;
+- writel(SEC2WTCOMP(timeout), &wdt_reg->wtcompare);
++ /*
++ * store and disable WTC
++ */
++ state = (u32)(readl(&wdt_reg->wtc) & RC32434_WTC_EN);
++ val = ~RC32434_WTC_EN;
++ writel(readl(&wdt_reg->wtc) & val, &wdt_reg->wtc);
+
+- return 0;
++ writel(0, &wdt_reg->wtcount);
++ writel(cmp, &wdt_reg->wtcompare);
++
++ /*
++ * restore WTC
++ */
++
++ writel(readl(&wdt_reg->wtc) | state, &wdt_reg);
+ }
+
+-static void rc32434_wdt_ping(void)
++static void rc32434_wdt_reset(void)
+ {
++ ticks = rc32434_wdt_device.default_ticks;
++}
++
++static void rc32434_wdt_update(unsigned long unused)
++{
++ if (rc32434_wdt_device.running)
++ ticks--;
++
+ writel(0, &wdt_reg->wtcount);
++
++ if (rc32434_wdt_device.queue && ticks)
++ mod_timer(&rc32434_wdt_device.timer,
++ jiffies + RC32434_WDT_INTERVAL);
++ else
++ complete(&rc32434_wdt_device.stop);
+ }
+
+ static int rc32434_wdt_open(struct inode *inode, struct file *file)
+@@ -127,23 +142,19 @@
+ if (nowayout)
+ __module_get(THIS_MODULE);
+
+- rc32434_wdt_start();
+- rc32434_wdt_ping();
+-
+ return nonseekable_open(inode, file);
+ }
+
+ static int rc32434_wdt_release(struct inode *inode, struct file *file)
+ {
+- if (expect_close == 42) {
++ if (expect_close && nowayout == 0) {
+ rc32434_wdt_stop();
+ printk(KERN_INFO KBUILD_MODNAME ": disabling watchdog timer\n");
+ module_put(THIS_MODULE);
+- } else {
++ } else
+ printk(KERN_CRIT KBUILD_MODNAME
+ ": device closed unexpectedly. WDT will not stop !\n");
+- rc32434_wdt_ping();
+- }
++
+ clear_bit(0, &rc32434_wdt_device.inuse);
+ return 0;
+ }
+@@ -163,10 +174,10 @@
+ if (get_user(c, data + i))
+ return -EFAULT;
+ if (c == 'V')
+- expect_close = 42;
++ expect_close = 1;
+ }
+ }
+- rc32434_wdt_ping();
++ rc32434_wdt_update(0);
+ return len;
+ }
+ return 0;
+@@ -186,11 +197,11 @@
+ };
+ switch (cmd) {
+ case WDIOC_KEEPALIVE:
+- rc32434_wdt_ping();
++ rc32434_wdt_reset();
+ break;
+ case WDIOC_GETSTATUS:
+ case WDIOC_GETBOOTSTATUS:
+- value = 0;
++ value = readl(&wdt_reg->wtcount);
+ if (copy_to_user(argp, &value, sizeof(int)))
+ return -EFAULT;
+ break;
+@@ -207,7 +218,6 @@
+ break;
+ case WDIOS_DISABLECARD:
+ rc32434_wdt_stop();
+- break;
+ default:
+ return -EINVAL;
+ }
+@@ -215,9 +225,11 @@
+ case WDIOC_SETTIMEOUT:
+ if (copy_from_user(&new_timeout, argp, sizeof(int)))
+ return -EFAULT;
+- if (rc32434_wdt_set(new_timeout))
++ if (new_timeout < 1)
+ return -EINVAL;
+- /* Fall through */
++ if (new_timeout > MAX_TIMEOUT)
++ return -EINVAL;
++ rc32434_wdt_set(new_timeout);
+ case WDIOC_GETTIMEOUT:
+ return copy_to_user(argp, &timeout, sizeof(int));
+ default:
+@@ -242,15 +254,15 @@
+ .fops = &rc32434_wdt_fops,
+ };
+
+-static char banner[] __devinitdata = KERN_INFO KBUILD_MODNAME
++static char banner[] = KERN_INFO KBUILD_MODNAME
+ ": Watchdog Timer version " VERSION ", timer margin: %d sec\n";
+
+-static int __devinit rc32434_wdt_probe(struct platform_device *pdev)
++static int rc32434_wdt_probe(struct platform_device *pdev)
+ {
+ int ret;
+ struct resource *r;
+
+- r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "rb532_wdt_res");
++ r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "rb500_wdt_res");
+ if (!r) {
+ printk(KERN_ERR KBUILD_MODNAME
+ "failed to retrieve resources\n");
+@@ -265,12 +277,24 @@
+ }
+
+ ret = misc_register(&rc32434_wdt_miscdev);
++
+ if (ret < 0) {
+ printk(KERN_ERR KBUILD_MODNAME
+ "failed to register watchdog device\n");
+ goto unmap;
+ }
+
++ init_completion(&rc32434_wdt_device.stop);
++ rc32434_wdt_device.queue = 0;
++
++ clear_bit(0, &rc32434_wdt_device.inuse);
++
++ setup_timer(&rc32434_wdt_device.timer, rc32434_wdt_update, 0L);
++
++ rc32434_wdt_device.default_ticks = ticks;
++
++ rc32434_wdt_start();
++
+ printk(banner, timeout);
+
+ return 0;
+@@ -280,17 +304,23 @@
+ return ret;
+ }
+
+-static int __devexit rc32434_wdt_remove(struct platform_device *pdev)
++static int rc32434_wdt_remove(struct platform_device *pdev)
+ {
++ if (rc32434_wdt_device.queue) {
++ rc32434_wdt_device.queue = 0;
++ wait_for_completion(&rc32434_wdt_device.stop);
++ }
+ misc_deregister(&rc32434_wdt_miscdev);
++
+ iounmap(wdt_reg);
++
+ return 0;
+ }
+
+ static struct platform_driver rc32434_wdt = {
+ .probe = rc32434_wdt_probe,
+- .remove = __devexit_p(rc32434_wdt_remove),
+- .driver = {
++ .remove = rc32434_wdt_remove,
++ .driver = {
+ .name = "rc32434_wdt",
+ }
+ };
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/xen/balloon.c linux-2.6.29-rc3.owrt/drivers/xen/balloon.c
+--- linux-2.6.29.owrt/drivers/xen/balloon.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/xen/balloon.c 2009-05-10 23:48:29.000000000 +0200
+@@ -498,7 +498,7 @@
+ if (!capable(CAP_SYS_ADMIN))
+ return -EPERM;
+
+- target_bytes = simple_strtoull(buf, &endchar, 0) * 1024;
++ target_bytes = memparse(buf, &endchar);
+
+ balloon_set_new_target(target_bytes >> PAGE_SHIFT);
+
+@@ -508,39 +508,8 @@
+ static SYSDEV_ATTR(target_kb, S_IRUGO | S_IWUSR,
+ show_target_kb, store_target_kb);
+
+-
+-static ssize_t show_target(struct sys_device *dev, struct sysdev_attribute *attr,
+- char *buf)
+-{
+- return sprintf(buf, "%llu\n",
+- (u64)balloon_stats.target_pages << PAGE_SHIFT);
+-}
+-
+-static ssize_t store_target(struct sys_device *dev,
+- struct sysdev_attribute *attr,
+- const char *buf,
+- size_t count)
+-{
+- char *endchar;
+- unsigned long long target_bytes;
+-
+- if (!capable(CAP_SYS_ADMIN))
+- return -EPERM;
+-
+- target_bytes = memparse(buf, &endchar);
+-
+- balloon_set_new_target(target_bytes >> PAGE_SHIFT);
+-
+- return count;
+-}
+-
+-static SYSDEV_ATTR(target, S_IRUGO | S_IWUSR,
+- show_target, store_target);
+-
+-
+ static struct sysdev_attribute *balloon_attrs[] = {
+ &attr_target_kb,
+- &attr_target,
+ };
+
+ static struct attribute *balloon_info_attrs[] = {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/drivers/xen/manage.c linux-2.6.29-rc3.owrt/drivers/xen/manage.c
+--- linux-2.6.29.owrt/drivers/xen/manage.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/drivers/xen/manage.c 2009-05-10 23:48:29.000000000 +0200
+@@ -45,13 +45,6 @@
+ err);
+ return err;
+ }
+- err = sysdev_suspend(PMSG_SUSPEND);
+- if (err) {
+- printk(KERN_ERR "xen_suspend: sysdev_suspend failed: %d\n",
+- err);
+- device_power_up(PMSG_RESUME);
+- return err;
+- }
+
+ xen_mm_pin_all();
+ gnttab_suspend();
+@@ -68,7 +61,6 @@
+ gnttab_resume();
+ xen_mm_unpin_all();
+
+- sysdev_resume();
+ device_power_up(PMSG_RESUME);
+
+ if (!*cancelled) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/aio.c linux-2.6.29-rc3.owrt/fs/aio.c
+--- linux-2.6.29.owrt/fs/aio.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/aio.c 2009-05-10 23:48:29.000000000 +0200
+@@ -443,7 +443,7 @@
+ req->private = NULL;
+ req->ki_iovec = NULL;
+ INIT_LIST_HEAD(&req->ki_run_list);
+- req->ki_eventfd = NULL;
++ req->ki_eventfd = ERR_PTR(-EINVAL);
+
+ /* Check if the completion queue has enough free space to
+ * accept an event from this io.
+@@ -485,6 +485,8 @@
+ {
+ assert_spin_locked(&ctx->ctx_lock);
+
++ if (!IS_ERR(req->ki_eventfd))
++ fput(req->ki_eventfd);
+ if (req->ki_dtor)
+ req->ki_dtor(req);
+ if (req->ki_iovec != &req->ki_inline_vec)
+@@ -506,11 +508,8 @@
+ list_del(&req->ki_list);
+ spin_unlock_irq(&fput_lock);
+
+- /* Complete the fput(s) */
+- if (req->ki_filp != NULL)
+- __fput(req->ki_filp);
+- if (req->ki_eventfd != NULL)
+- __fput(req->ki_eventfd);
++ /* Complete the fput */
++ __fput(req->ki_filp);
+
+ /* Link the iocb into the context's free list */
+ spin_lock_irq(&ctx->ctx_lock);
+@@ -528,14 +527,12 @@
+ */
+ static int __aio_put_req(struct kioctx *ctx, struct kiocb *req)
+ {
+- int schedule_putreq = 0;
+-
+ dprintk(KERN_DEBUG "aio_put(%p): f_count=%ld\n",
+ req, atomic_long_read(&req->ki_filp->f_count));
+
+ assert_spin_locked(&ctx->ctx_lock);
+
+- req->ki_users--;
++ req->ki_users --;
+ BUG_ON(req->ki_users < 0);
+ if (likely(req->ki_users))
+ return 0;
+@@ -543,23 +540,10 @@
+ req->ki_cancel = NULL;
+ req->ki_retry = NULL;
+
+- /*
+- * Try to optimize the aio and eventfd file* puts, by avoiding to
+- * schedule work in case it is not __fput() time. In normal cases,
+- * we would not be holding the last reference to the file*, so
+- * this function will be executed w/out any aio kthread wakeup.
++ /* Must be done under the lock to serialise against cancellation.
++ * Call this aio_fput as it duplicates fput via the fput_work.
+ */
+- if (unlikely(atomic_long_dec_and_test(&req->ki_filp->f_count)))
+- schedule_putreq++;
+- else
+- req->ki_filp = NULL;
+- if (req->ki_eventfd != NULL) {
+- if (unlikely(atomic_long_dec_and_test(&req->ki_eventfd->f_count)))
+- schedule_putreq++;
+- else
+- req->ki_eventfd = NULL;
+- }
+- if (unlikely(schedule_putreq)) {
++ if (unlikely(atomic_long_dec_and_test(&req->ki_filp->f_count))) {
+ get_ioctx(ctx);
+ spin_lock(&fput_lock);
+ list_add(&req->ki_list, &fput_head);
+@@ -587,7 +571,7 @@
+ static struct kioctx *lookup_ioctx(unsigned long ctx_id)
+ {
+ struct mm_struct *mm = current->mm;
+- struct kioctx *ctx, *ret = NULL;
++ struct kioctx *ctx = NULL;
+ struct hlist_node *n;
+
+ rcu_read_lock();
+@@ -595,13 +579,12 @@
+ hlist_for_each_entry_rcu(ctx, n, &mm->ioctx_list, list) {
+ if (ctx->user_id == ctx_id && !ctx->dead) {
+ get_ioctx(ctx);
+- ret = ctx;
+ break;
+ }
+ }
+
+ rcu_read_unlock();
+- return ret;
++ return ctx;
+ }
+
+ /*
+@@ -1026,7 +1009,7 @@
+ * eventfd. The eventfd_signal() function is safe to be called
+ * from IRQ context.
+ */
+- if (iocb->ki_eventfd != NULL)
++ if (!IS_ERR(iocb->ki_eventfd))
+ eventfd_signal(iocb->ki_eventfd, 1);
+
+ put_rq:
+@@ -1625,7 +1608,6 @@
+ req->ki_eventfd = eventfd_fget((int) iocb->aio_resfd);
+ if (IS_ERR(req->ki_eventfd)) {
+ ret = PTR_ERR(req->ki_eventfd);
+- req->ki_eventfd = NULL;
+ goto out_put_req;
+ }
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/binfmt_elf.c linux-2.6.29-rc3.owrt/fs/binfmt_elf.c
+--- linux-2.6.29.owrt/fs/binfmt_elf.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/binfmt_elf.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1225,15 +1225,7 @@
+ magic.elfmag[EI_MAG1] = ELFMAG1;
+ magic.elfmag[EI_MAG2] = ELFMAG2;
+ magic.elfmag[EI_MAG3] = ELFMAG3;
+- /*
+- * Switch to the user "segment" for get_user(),
+- * then put back what elf_core_dump() had in place.
+- */
+- set_fs(USER_DS);
+- if (unlikely(get_user(word, header)))
+- word = 0;
+- set_fs(fs);
+- if (word == magic.cmp)
++ if (get_user(word, header) == 0 && word == magic.cmp)
+ return PAGE_SIZE;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/bio.c linux-2.6.29-rc3.owrt/fs/bio.c
+--- linux-2.6.29.owrt/fs/bio.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/bio.c 2009-05-10 23:48:29.000000000 +0200
+@@ -302,10 +302,9 @@
+ struct bio *bio_alloc_bioset(gfp_t gfp_mask, int nr_iovecs, struct bio_set *bs)
+ {
+ struct bio *bio = NULL;
+- void *uninitialized_var(p);
+
+ if (bs) {
+- p = mempool_alloc(bs->bio_pool, gfp_mask);
++ void *p = mempool_alloc(bs->bio_pool, gfp_mask);
+
+ if (p)
+ bio = p + bs->front_pad;
+@@ -330,7 +329,7 @@
+ }
+ if (unlikely(!bvl)) {
+ if (bs)
+- mempool_free(p, bs->bio_pool);
++ mempool_free(bio, bs->bio_pool);
+ else
+ kfree(bio);
+ bio = NULL;
+@@ -463,12 +462,10 @@
+ if (bio_integrity(bio)) {
+ int ret;
+
+- ret = bio_integrity_clone(b, bio, gfp_mask, fs_bio_set);
++ ret = bio_integrity_clone(b, bio, fs_bio_set);
+
+- if (ret < 0) {
+- bio_put(b);
++ if (ret < 0)
+ return NULL;
+- }
+ }
+
+ return b;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/bio-integrity.c linux-2.6.29-rc3.owrt/fs/bio-integrity.c
+--- linux-2.6.29.owrt/fs/bio-integrity.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/bio-integrity.c 2009-05-10 23:48:29.000000000 +0200
+@@ -140,6 +140,7 @@
+
+ iv = bip_vec_idx(bip, bip->bip_vcnt);
+ BUG_ON(iv == NULL);
++ BUG_ON(iv->bv_page != NULL);
+
+ iv->bv_page = page;
+ iv->bv_len = len;
+@@ -464,7 +465,7 @@
+
+ if (ret) {
+ kunmap_atomic(kaddr, KM_USER0);
+- return ret;
++ break;
+ }
+
+ sectors = bv->bv_len / bi->sector_size;
+@@ -492,13 +493,18 @@
+ struct bio_integrity_payload *bip =
+ container_of(work, struct bio_integrity_payload, bip_work);
+ struct bio *bio = bip->bip_bio;
+- int error;
++ int error = bip->bip_error;
+
+- error = bio_integrity_verify(bio);
++ if (bio_integrity_verify(bio)) {
++ clear_bit(BIO_UPTODATE, &bio->bi_flags);
++ error = -EIO;
++ }
+
+ /* Restore original bio completion handler */
+ bio->bi_end_io = bip->bip_end_io;
+- bio_endio(bio, error);
++
++ if (bio->bi_end_io)
++ bio->bi_end_io(bio, error);
+ }
+
+ /**
+@@ -519,17 +525,7 @@
+
+ BUG_ON(bip->bip_bio != bio);
+
+- /* In case of an I/O error there is no point in verifying the
+- * integrity metadata. Restore original bio end_io handler
+- * and run it.
+- */
+- if (error) {
+- bio->bi_end_io = bip->bip_end_io;
+- bio_endio(bio, error);
+-
+- return;
+- }
+-
++ bip->bip_error = error;
+ INIT_WORK(&bip->bip_work, bio_integrity_verify_fn);
+ queue_work(kintegrityd_wq, &bip->bip_work);
+ }
+@@ -685,20 +681,19 @@
+ * bio_integrity_clone - Callback for cloning bios with integrity metadata
+ * @bio: New bio
+ * @bio_src: Original bio
+- * @gfp_mask: Memory allocation mask
+ * @bs: bio_set to allocate bip from
+ *
+ * Description: Called to allocate a bip when cloning a bio
+ */
+ int bio_integrity_clone(struct bio *bio, struct bio *bio_src,
+- gfp_t gfp_mask, struct bio_set *bs)
++ struct bio_set *bs)
+ {
+ struct bio_integrity_payload *bip_src = bio_src->bi_integrity;
+ struct bio_integrity_payload *bip;
+
+ BUG_ON(bip_src == NULL);
+
+- bip = bio_integrity_alloc_bioset(bio, gfp_mask, bip_src->bip_vcnt, bs);
++ bip = bio_integrity_alloc_bioset(bio, GFP_NOIO, bip_src->bip_vcnt, bs);
+
+ if (bip == NULL)
+ return -EIO;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/async-thread.c linux-2.6.29-rc3.owrt/fs/btrfs/async-thread.c
+--- linux-2.6.29.owrt/fs/btrfs/async-thread.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/async-thread.c 2009-05-10 23:48:29.000000000 +0200
+@@ -16,11 +16,11 @@
+ * Boston, MA 021110-1307, USA.
+ */
+
++#include <linux/version.h>
+ #include <linux/kthread.h>
+ #include <linux/list.h>
+ #include <linux/spinlock.h>
+-#include <linux/freezer.h>
+-#include <linux/ftrace.h>
++# include <linux/freezer.h>
+ #include "async-thread.h"
+
+ #define WORK_QUEUED_BIT 0
+@@ -143,7 +143,6 @@
+ struct btrfs_work *work;
+ do {
+ spin_lock_irq(&worker->lock);
+-again_locked:
+ while (!list_empty(&worker->pending)) {
+ cur = worker->pending.next;
+ work = list_entry(cur, struct btrfs_work, list);
+@@ -166,50 +165,14 @@
+ check_idle_worker(worker);
+
+ }
++ worker->working = 0;
+ if (freezing(current)) {
+- worker->working = 0;
+- spin_unlock_irq(&worker->lock);
+ refrigerator();
+ } else {
++ set_current_state(TASK_INTERRUPTIBLE);
+ spin_unlock_irq(&worker->lock);
+- if (!kthread_should_stop()) {
+- cpu_relax();
+- /*
+- * we've dropped the lock, did someone else
+- * jump_in?
+- */
+- smp_mb();
+- if (!list_empty(&worker->pending))
+- continue;
+-
+- /*
+- * this short schedule allows more work to
+- * come in without the queue functions
+- * needing to go through wake_up_process()
+- *
+- * worker->working is still 1, so nobody
+- * is going to try and wake us up
+- */
+- schedule_timeout(1);
+- smp_mb();
+- if (!list_empty(&worker->pending))
+- continue;
+-
+- /* still no more work?, sleep for real */
+- spin_lock_irq(&worker->lock);
+- set_current_state(TASK_INTERRUPTIBLE);
+- if (!list_empty(&worker->pending))
+- goto again_locked;
+-
+- /*
+- * this makes sure we get a wakeup when someone
+- * adds something new to the queue
+- */
+- worker->working = 0;
+- spin_unlock_irq(&worker->lock);
+-
++ if (!kthread_should_stop())
+ schedule();
+- }
+ __set_current_state(TASK_RUNNING);
+ }
+ } while (!kthread_should_stop());
+@@ -387,14 +350,13 @@
+ {
+ struct btrfs_worker_thread *worker = work->worker;
+ unsigned long flags;
+- int wake = 0;
+
+ if (test_and_set_bit(WORK_QUEUED_BIT, &work->flags))
+ goto out;
+
+ spin_lock_irqsave(&worker->lock, flags);
+- list_add_tail(&work->list, &worker->pending);
+ atomic_inc(&worker->num_pending);
++ list_add_tail(&work->list, &worker->pending);
+
+ /* by definition we're busy, take ourselves off the idle
+ * list
+@@ -406,16 +368,10 @@
+ &worker->workers->worker_list);
+ spin_unlock_irqrestore(&worker->workers->lock, flags);
+ }
+- if (!worker->working) {
+- wake = 1;
+- worker->working = 1;
+- }
+
+ spin_unlock_irqrestore(&worker->lock, flags);
+- if (wake)
+- wake_up_process(worker->task);
+-out:
+
++out:
+ return 0;
+ }
+
+@@ -442,10 +398,9 @@
+ }
+
+ spin_lock_irqsave(&worker->lock, flags);
+-
+- list_add_tail(&work->list, &worker->pending);
+ atomic_inc(&worker->num_pending);
+ check_busy_worker(worker);
++ list_add_tail(&work->list, &worker->pending);
+
+ /*
+ * avoid calling into wake_up_process if this thread has already
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/btrfs_inode.h linux-2.6.29-rc3.owrt/fs/btrfs/btrfs_inode.h
+--- linux-2.6.29.owrt/fs/btrfs/btrfs_inode.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/btrfs_inode.h 2009-05-10 23:48:29.000000000 +0200
+@@ -66,9 +66,6 @@
+ */
+ struct list_head delalloc_inodes;
+
+- /* the space_info for where this inode's data allocations are done */
+- struct btrfs_space_info *space_info;
+-
+ /* full 64 bit generation number, struct vfs_inode doesn't have a big
+ * enough field for this.
+ */
+@@ -97,11 +94,6 @@
+ */
+ u64 delalloc_bytes;
+
+- /* total number of bytes that may be used for this inode for
+- * delalloc
+- */
+- u64 reserved_bytes;
+-
+ /*
+ * the size of the file stored in the metadata on disk. data=ordered
+ * means the in-memory i_size might be larger than the size on disk
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/compression.c linux-2.6.29-rc3.owrt/fs/btrfs/compression.c
+--- linux-2.6.29.owrt/fs/btrfs/compression.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/compression.c 2009-05-10 23:48:29.000000000 +0200
+@@ -32,6 +32,7 @@
+ #include <linux/swap.h>
+ #include <linux/writeback.h>
+ #include <linux/bit_spinlock.h>
++#include <linux/version.h>
+ #include <linux/pagevec.h>
+ #include "compat.h"
+ #include "ctree.h"
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/ctree.c linux-2.6.29-rc3.owrt/fs/btrfs/ctree.c
+--- linux-2.6.29.owrt/fs/btrfs/ctree.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/ctree.c 2009-05-10 23:48:29.000000000 +0200
+@@ -38,62 +38,20 @@
+ static int del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root,
+ struct btrfs_path *path, int level, int slot);
+
+-struct btrfs_path *btrfs_alloc_path(void)
++inline void btrfs_init_path(struct btrfs_path *p)
+ {
+- struct btrfs_path *path;
+- path = kmem_cache_zalloc(btrfs_path_cachep, GFP_NOFS);
+- if (path)
+- path->reada = 1;
+- return path;
++ memset(p, 0, sizeof(*p));
+ }
+
+-/*
+- * set all locked nodes in the path to blocking locks. This should
+- * be done before scheduling
+- */
+-noinline void btrfs_set_path_blocking(struct btrfs_path *p)
+-{
+- int i;
+- for (i = 0; i < BTRFS_MAX_LEVEL; i++) {
+- if (p->nodes[i] && p->locks[i])
+- btrfs_set_lock_blocking(p->nodes[i]);
+- }
+-}
+-
+-/*
+- * reset all the locked nodes in the patch to spinning locks.
+- *
+- * held is used to keep lockdep happy, when lockdep is enabled
+- * we set held to a blocking lock before we go around and
+- * retake all the spinlocks in the path. You can safely use NULL
+- * for held
+- */
+-noinline void btrfs_clear_path_blocking(struct btrfs_path *p,
+- struct extent_buffer *held)
++struct btrfs_path *btrfs_alloc_path(void)
+ {
+- int i;
+-
+-#ifdef CONFIG_DEBUG_LOCK_ALLOC
+- /* lockdep really cares that we take all of these spinlocks
+- * in the right order. If any of the locks in the path are not
+- * currently blocking, it is going to complain. So, make really
+- * really sure by forcing the path to blocking before we clear
+- * the path blocking.
+- */
+- if (held)
+- btrfs_set_lock_blocking(held);
+- btrfs_set_path_blocking(p);
+-#endif
+-
+- for (i = BTRFS_MAX_LEVEL - 1; i >= 0; i--) {
+- if (p->nodes[i] && p->locks[i])
+- btrfs_clear_lock_blocking(p->nodes[i]);
++ struct btrfs_path *path;
++ path = kmem_cache_alloc(btrfs_path_cachep, GFP_NOFS);
++ if (path) {
++ btrfs_init_path(path);
++ path->reada = 1;
+ }
+-
+-#ifdef CONFIG_DEBUG_LOCK_ALLOC
+- if (held)
+- btrfs_clear_lock_blocking(held);
+-#endif
++ return path;
+ }
+
+ /* this also releases the path */
+@@ -277,7 +235,7 @@
+ if (*cow_ret == buf)
+ unlock_orig = 1;
+
+- btrfs_assert_tree_locked(buf);
++ WARN_ON(!btrfs_tree_locked(buf));
+
+ if (parent)
+ parent_start = parent->start;
+@@ -303,7 +261,7 @@
+ trans->transid, level, &ins);
+ BUG_ON(ret);
+ cow = btrfs_init_new_buffer(trans, root, prealloc_dest,
+- buf->len, level);
++ buf->len);
+ } else {
+ cow = btrfs_alloc_free_block(trans, root, buf->len,
+ parent_start,
+@@ -314,8 +272,6 @@
+ if (IS_ERR(cow))
+ return PTR_ERR(cow);
+
+- /* cow is set to blocking by btrfs_init_new_buffer */
+-
+ copy_extent_buffer(cow, buf, 0, 0, cow->len);
+ btrfs_set_header_bytenr(cow, cow->start);
+ btrfs_set_header_generation(cow, trans->transid);
+@@ -432,20 +388,17 @@
+ WARN_ON(1);
+ }
+
++ spin_lock(&root->fs_info->hash_lock);
+ if (btrfs_header_generation(buf) == trans->transid &&
+ btrfs_header_owner(buf) == root->root_key.objectid &&
+ !btrfs_header_flag(buf, BTRFS_HEADER_FLAG_WRITTEN)) {
+ *cow_ret = buf;
++ spin_unlock(&root->fs_info->hash_lock);
+ WARN_ON(prealloc_dest);
+ return 0;
+ }
+-
++ spin_unlock(&root->fs_info->hash_lock);
+ search_start = buf->start & ~((u64)(1024 * 1024 * 1024) - 1);
+-
+- if (parent)
+- btrfs_set_lock_blocking(parent);
+- btrfs_set_lock_blocking(buf);
+-
+ ret = __btrfs_cow_block(trans, root, buf, parent,
+ parent_slot, cow_ret, search_start, 0,
+ prealloc_dest);
+@@ -551,8 +504,6 @@
+ if (parent_nritems == 1)
+ return 0;
+
+- btrfs_set_lock_blocking(parent);
+-
+ for (i = start_slot; i < end_slot; i++) {
+ int close = 1;
+
+@@ -613,7 +564,6 @@
+ search_start = last_block;
+
+ btrfs_tree_lock(cur);
+- btrfs_set_lock_blocking(cur);
+ err = __btrfs_cow_block(trans, root, cur, parent, i,
+ &cur, search_start,
+ min(16 * blocksize,
+@@ -912,7 +862,6 @@
+ return 0;
+
+ mid = path->nodes[level];
+-
+ WARN_ON(!path->locks[level]);
+ WARN_ON(btrfs_header_generation(mid) != trans->transid);
+
+@@ -934,9 +883,8 @@
+
+ /* promote the child to a root */
+ child = read_node_slot(root, mid, 0);
+- BUG_ON(!child);
+ btrfs_tree_lock(child);
+- btrfs_set_lock_blocking(child);
++ BUG_ON(!child);
+ ret = btrfs_cow_block(trans, root, child, mid, 0, &child, 0);
+ BUG_ON(ret);
+
+@@ -952,7 +900,6 @@
+
+ add_root_to_dirty_list(root);
+ btrfs_tree_unlock(child);
+-
+ path->locks[level] = 0;
+ path->nodes[level] = NULL;
+ clean_tree_block(trans, root, mid);
+@@ -977,7 +924,6 @@
+ left = read_node_slot(root, parent, pslot - 1);
+ if (left) {
+ btrfs_tree_lock(left);
+- btrfs_set_lock_blocking(left);
+ wret = btrfs_cow_block(trans, root, left,
+ parent, pslot - 1, &left, 0);
+ if (wret) {
+@@ -988,7 +934,6 @@
+ right = read_node_slot(root, parent, pslot + 1);
+ if (right) {
+ btrfs_tree_lock(right);
+- btrfs_set_lock_blocking(right);
+ wret = btrfs_cow_block(trans, root, right,
+ parent, pslot + 1, &right, 0);
+ if (wret) {
+@@ -1164,8 +1109,6 @@
+ u32 left_nr;
+
+ btrfs_tree_lock(left);
+- btrfs_set_lock_blocking(left);
+-
+ left_nr = btrfs_header_nritems(left);
+ if (left_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) {
+ wret = 1;
+@@ -1212,10 +1155,7 @@
+ */
+ if (right) {
+ u32 right_nr;
+-
+ btrfs_tree_lock(right);
+- btrfs_set_lock_blocking(right);
+-
+ right_nr = btrfs_header_nritems(right);
+ if (right_nr >= BTRFS_NODEPTRS_PER_BLOCK(root) - 1) {
+ wret = 1;
+@@ -1270,7 +1210,8 @@
+ struct btrfs_disk_key disk_key;
+ u32 nritems;
+ u64 search;
+- u64 target;
++ u64 lowest_read;
++ u64 highest_read;
+ u64 nread = 0;
+ int direction = path->reada;
+ struct extent_buffer *eb;
+@@ -1294,7 +1235,8 @@
+ return;
+ }
+
+- target = search;
++ highest_read = search;
++ lowest_read = search;
+
+ nritems = btrfs_header_nritems(node);
+ nr = slot;
+@@ -1314,80 +1256,27 @@
+ break;
+ }
+ search = btrfs_node_blockptr(node, nr);
+- if ((search <= target && target - search <= 65536) ||
+- (search > target && search - target <= 65536)) {
++ if ((search >= lowest_read && search <= highest_read) ||
++ (search < lowest_read && lowest_read - search <= 16384) ||
++ (search > highest_read && search - highest_read <= 16384)) {
+ readahead_tree_block(root, search, blocksize,
+ btrfs_node_ptr_generation(node, nr));
+ nread += blocksize;
+ }
+ nscan++;
+- if ((nread > 65536 || nscan > 32))
++ if (path->reada < 2 && (nread > (64 * 1024) || nscan > 32))
+ break;
+- }
+-}
+-
+-/*
+- * returns -EAGAIN if it had to drop the path, or zero if everything was in
+- * cache
+- */
+-static noinline int reada_for_balance(struct btrfs_root *root,
+- struct btrfs_path *path, int level)
+-{
+- int slot;
+- int nritems;
+- struct extent_buffer *parent;
+- struct extent_buffer *eb;
+- u64 gen;
+- u64 block1 = 0;
+- u64 block2 = 0;
+- int ret = 0;
+- int blocksize;
+
+- parent = path->nodes[level - 1];
+- if (!parent)
+- return 0;
+-
+- nritems = btrfs_header_nritems(parent);
+- slot = path->slots[level];
+- blocksize = btrfs_level_size(root, level);
+-
+- if (slot > 0) {
+- block1 = btrfs_node_blockptr(parent, slot - 1);
+- gen = btrfs_node_ptr_generation(parent, slot - 1);
+- eb = btrfs_find_tree_block(root, block1, blocksize);
+- if (eb && btrfs_buffer_uptodate(eb, gen))
+- block1 = 0;
+- free_extent_buffer(eb);
+- }
+- if (slot < nritems) {
+- block2 = btrfs_node_blockptr(parent, slot + 1);
+- gen = btrfs_node_ptr_generation(parent, slot + 1);
+- eb = btrfs_find_tree_block(root, block2, blocksize);
+- if (eb && btrfs_buffer_uptodate(eb, gen))
+- block2 = 0;
+- free_extent_buffer(eb);
+- }
+- if (block1 || block2) {
+- ret = -EAGAIN;
+- btrfs_release_path(root, path);
+- if (block1)
+- readahead_tree_block(root, block1, blocksize, 0);
+- if (block2)
+- readahead_tree_block(root, block2, blocksize, 0);
++ if (nread > (256 * 1024) || nscan > 128)
++ break;
+
+- if (block1) {
+- eb = read_tree_block(root, block1, blocksize, 0);
+- free_extent_buffer(eb);
+- }
+- if (block1) {
+- eb = read_tree_block(root, block2, blocksize, 0);
+- free_extent_buffer(eb);
+- }
++ if (search < lowest_read)
++ lowest_read = search;
++ if (search > highest_read)
++ highest_read = search;
+ }
+- return ret;
+ }
+
+-
+ /*
+ * when we walk down the tree, it is usually safe to unlock the higher layers
+ * in the tree. The exceptions are when our path goes through slot 0, because
+@@ -1439,32 +1328,6 @@
+ }
+
+ /*
+- * This releases any locks held in the path starting at level and
+- * going all the way up to the root.
+- *
+- * btrfs_search_slot will keep the lock held on higher nodes in a few
+- * corner cases, such as COW of the block at slot zero in the node. This
+- * ignores those rules, and it should only be called when there are no
+- * more updates to be done higher up in the tree.
+- */
+-noinline void btrfs_unlock_up_safe(struct btrfs_path *path, int level)
+-{
+- int i;
+-
+- if (path->keep_locks || path->lowest_level)
+- return;
+-
+- for (i = level; i < BTRFS_MAX_LEVEL; i++) {
+- if (!path->nodes[i])
+- continue;
+- if (!path->locks[i])
+- continue;
+- btrfs_tree_unlock(path->nodes[i]);
+- path->locks[i] = 0;
+- }
+-}
+-
+-/*
+ * look for key in the tree. path is filled in with nodes along the way
+ * if key is found, we return zero and you can find the item in the leaf
+ * level of the path (level 0)
+@@ -1524,30 +1387,32 @@
+ int wret;
+
+ /* is a cow on this block not required */
++ spin_lock(&root->fs_info->hash_lock);
+ if (btrfs_header_generation(b) == trans->transid &&
+ btrfs_header_owner(b) == root->root_key.objectid &&
+ !btrfs_header_flag(b, BTRFS_HEADER_FLAG_WRITTEN)) {
++ spin_unlock(&root->fs_info->hash_lock);
+ goto cow_done;
+ }
++ spin_unlock(&root->fs_info->hash_lock);
+
+ /* ok, we have to cow, is our old prealloc the right
+ * size?
+ */
+ if (prealloc_block.objectid &&
+ prealloc_block.offset != b->len) {
+- btrfs_release_path(root, p);
+ btrfs_free_reserved_extent(root,
+ prealloc_block.objectid,
+ prealloc_block.offset);
+ prealloc_block.objectid = 0;
+- goto again;
+ }
+
+ /*
+ * for higher level blocks, try not to allocate blocks
+ * with the block and the parent locks held.
+ */
+- if (level > 0 && !prealloc_block.objectid) {
++ if (level > 1 && !prealloc_block.objectid &&
++ btrfs_path_lock_waiting(p, level)) {
+ u32 size = b->len;
+ u64 hint = b->start;
+
+@@ -1560,8 +1425,6 @@
+ goto again;
+ }
+
+- btrfs_set_path_blocking(p);
+-
+ wret = btrfs_cow_block(trans, root, b,
+ p->nodes[level + 1],
+ p->slots[level + 1],
+@@ -1583,22 +1446,6 @@
+ if (!p->skip_locking)
+ p->locks[level] = 1;
+
+- btrfs_clear_path_blocking(p, NULL);
+-
+- /*
+- * we have a lock on b and as long as we aren't changing
+- * the tree, there is no way to for the items in b to change.
+- * It is safe to drop the lock on our parent before we
+- * go through the expensive btree search on b.
+- *
+- * If cow is true, then we might be changing slot zero,
+- * which may require changing the parent. So, we can't
+- * drop the lock until after we know which slot we're
+- * operating on.
+- */
+- if (!cow)
+- btrfs_unlock_up_safe(p, level + 1);
+-
+ ret = check_block(root, p, level);
+ if (ret) {
+ ret = -1;
+@@ -1606,7 +1453,6 @@
+ }
+
+ ret = bin_search(b, key, level, &slot);
+-
+ if (level != 0) {
+ if (ret && slot > 0)
+ slot -= 1;
+@@ -1614,16 +1460,7 @@
+ if ((p->search_for_split || ins_len > 0) &&
+ btrfs_header_nritems(b) >=
+ BTRFS_NODEPTRS_PER_BLOCK(root) - 3) {
+- int sret;
+-
+- sret = reada_for_balance(root, p, level);
+- if (sret)
+- goto again;
+-
+- btrfs_set_path_blocking(p);
+- sret = split_node(trans, root, p, level);
+- btrfs_clear_path_blocking(p, NULL);
+-
++ int sret = split_node(trans, root, p, level);
+ BUG_ON(sret > 0);
+ if (sret) {
+ ret = sret;
+@@ -1631,19 +1468,9 @@
+ }
+ b = p->nodes[level];
+ slot = p->slots[level];
+- } else if (ins_len < 0 &&
+- btrfs_header_nritems(b) <
+- BTRFS_NODEPTRS_PER_BLOCK(root) / 4) {
+- int sret;
+-
+- sret = reada_for_balance(root, p, level);
+- if (sret)
+- goto again;
+-
+- btrfs_set_path_blocking(p);
+- sret = balance_level(trans, root, p, level);
+- btrfs_clear_path_blocking(p, NULL);
+-
++ } else if (ins_len < 0) {
++ int sret = balance_level(trans, root, p,
++ level);
+ if (sret) {
+ ret = sret;
+ goto done;
+@@ -1677,7 +1504,7 @@
+ * of the btree by dropping locks before
+ * we read.
+ */
+- if (level > 0) {
++ if (level > 1) {
+ btrfs_release_path(NULL, p);
+ if (tmp)
+ free_extent_buffer(tmp);
+@@ -1692,7 +1519,6 @@
+ free_extent_buffer(tmp);
+ goto again;
+ } else {
+- btrfs_set_path_blocking(p);
+ if (tmp)
+ free_extent_buffer(tmp);
+ if (should_reada)
+@@ -1702,29 +1528,14 @@
+ b = read_node_slot(root, b, slot);
+ }
+ }
+- if (!p->skip_locking) {
+- int lret;
+-
+- btrfs_clear_path_blocking(p, NULL);
+- lret = btrfs_try_spin_lock(b);
+-
+- if (!lret) {
+- btrfs_set_path_blocking(p);
+- btrfs_tree_lock(b);
+- btrfs_clear_path_blocking(p, b);
+- }
+- }
++ if (!p->skip_locking)
++ btrfs_tree_lock(b);
+ } else {
+ p->slots[level] = slot;
+ if (ins_len > 0 &&
+ btrfs_leaf_free_space(root, b) < ins_len) {
+- int sret;
+-
+- btrfs_set_path_blocking(p);
+- sret = split_leaf(trans, root, key,
++ int sret = split_leaf(trans, root, key,
+ p, ins_len, ret == 0);
+- btrfs_clear_path_blocking(p, NULL);
+-
+ BUG_ON(sret > 0);
+ if (sret) {
+ ret = sret;
+@@ -1738,16 +1549,12 @@
+ }
+ ret = 1;
+ done:
+- /*
+- * we don't really know what they plan on doing with the path
+- * from here on, so for now just mark it as blocking
+- */
+- btrfs_set_path_blocking(p);
+ if (prealloc_block.objectid) {
+ btrfs_free_reserved_extent(root,
+ prealloc_block.objectid,
+ prealloc_block.offset);
+ }
++
+ return ret;
+ }
+
+@@ -1771,8 +1578,6 @@
+ ret = btrfs_cow_block(trans, root, eb, NULL, 0, &eb, 0);
+ BUG_ON(ret);
+
+- btrfs_set_lock_blocking(eb);
+-
+ parent = eb;
+ while (1) {
+ level = btrfs_header_level(parent);
+@@ -1797,7 +1602,6 @@
+ eb = read_tree_block(root, bytenr, blocksize,
+ generation);
+ btrfs_tree_lock(eb);
+- btrfs_set_lock_blocking(eb);
+ }
+
+ /*
+@@ -1822,7 +1626,6 @@
+ eb = read_tree_block(root, bytenr, blocksize,
+ generation);
+ btrfs_tree_lock(eb);
+- btrfs_set_lock_blocking(eb);
+ }
+
+ ret = btrfs_cow_block(trans, root, eb, parent, slot,
+@@ -2365,12 +2168,10 @@
+ if (slot >= btrfs_header_nritems(upper) - 1)
+ return 1;
+
+- btrfs_assert_tree_locked(path->nodes[1]);
++ WARN_ON(!btrfs_tree_locked(path->nodes[1]));
+
+ right = read_node_slot(root, upper, slot + 1);
+ btrfs_tree_lock(right);
+- btrfs_set_lock_blocking(right);
+-
+ free_space = btrfs_leaf_free_space(root, right);
+ if (free_space < data_size)
+ goto out_unlock;
+@@ -2562,12 +2363,10 @@
+ if (right_nritems == 0)
+ return 1;
+
+- btrfs_assert_tree_locked(path->nodes[1]);
++ WARN_ON(!btrfs_tree_locked(path->nodes[1]));
+
+ left = read_node_slot(root, path->nodes[1], slot - 1);
+ btrfs_tree_lock(left);
+- btrfs_set_lock_blocking(left);
+-
+ free_space = btrfs_leaf_free_space(root, left);
+ if (free_space < data_size) {
+ ret = 1;
+@@ -3026,12 +2825,6 @@
+ path->keep_locks = 0;
+ BUG_ON(ret);
+
+- /*
+- * make sure any changes to the path from split_leaf leave it
+- * in a blocking state
+- */
+- btrfs_set_path_blocking(path);
+-
+ leaf = path->nodes[0];
+ BUG_ON(btrfs_leaf_free_space(root, leaf) < sizeof(struct btrfs_item));
+
+@@ -3561,7 +3354,6 @@
+ BUG();
+ }
+ out:
+- btrfs_unlock_up_safe(path, 1);
+ return ret;
+ }
+
+@@ -3649,22 +3441,15 @@
+ {
+ int ret;
+ u64 root_gen = btrfs_header_generation(path->nodes[1]);
+- u64 parent_start = path->nodes[1]->start;
+- u64 parent_owner = btrfs_header_owner(path->nodes[1]);
+
+ ret = del_ptr(trans, root, path, 1, path->slots[1]);
+ if (ret)
+ return ret;
+
+- /*
+- * btrfs_free_extent is expensive, we want to make sure we
+- * aren't holding any locks when we call it
+- */
+- btrfs_unlock_up_safe(path, 0);
+-
+ ret = btrfs_free_extent(trans, root, bytenr,
+ btrfs_level_size(root, 0),
+- parent_start, parent_owner,
++ path->nodes[1]->start,
++ btrfs_header_owner(path->nodes[1]),
+ root_gen, 0, 1);
+ return ret;
+ }
+@@ -3936,7 +3721,6 @@
+ */
+ if (slot >= nritems) {
+ path->slots[level] = slot;
+- btrfs_set_path_blocking(path);
+ sret = btrfs_find_next_key(root, path, min_key, level,
+ cache_only, min_trans);
+ if (sret == 0) {
+@@ -3954,20 +3738,16 @@
+ unlock_up(path, level, 1);
+ goto out;
+ }
+- btrfs_set_path_blocking(path);
+ cur = read_node_slot(root, cur, slot);
+
+ btrfs_tree_lock(cur);
+-
+ path->locks[level - 1] = 1;
+ path->nodes[level - 1] = cur;
+ unlock_up(path, level, 1);
+- btrfs_clear_path_blocking(path, NULL);
+ }
+ out:
+ if (ret == 0)
+ memcpy(min_key, &found_key, sizeof(found_key));
+- btrfs_set_path_blocking(path);
+ return ret;
+ }
+
+@@ -4063,7 +3843,6 @@
+ if (ret < 0)
+ return ret;
+
+- btrfs_set_path_blocking(path);
+ nritems = btrfs_header_nritems(path->nodes[0]);
+ /*
+ * by releasing the path above we dropped all our locks. A balance
+@@ -4094,16 +3873,14 @@
+ free_extent_buffer(next);
+ }
+
+- /* the path was set to blocking above */
+ if (level == 1 && (path->locks[1] || path->skip_locking) &&
+ path->reada)
+ reada_for_search(root, path, level, slot, 0);
+
+ next = read_node_slot(root, c, slot);
+ if (!path->skip_locking) {
+- btrfs_assert_tree_locked(c);
++ WARN_ON(!btrfs_tree_locked(c));
+ btrfs_tree_lock(next);
+- btrfs_set_lock_blocking(next);
+ }
+ break;
+ }
+@@ -4120,15 +3897,12 @@
+ path->locks[level] = 1;
+ if (!level)
+ break;
+-
+- btrfs_set_path_blocking(path);
+ if (level == 1 && path->locks[1] && path->reada)
+ reada_for_search(root, path, level, slot, 0);
+ next = read_node_slot(root, next, 0);
+ if (!path->skip_locking) {
+- btrfs_assert_tree_locked(path->nodes[level]);
++ WARN_ON(!btrfs_tree_locked(path->nodes[level]));
+ btrfs_tree_lock(next);
+- btrfs_set_lock_blocking(next);
+ }
+ }
+ done:
+@@ -4153,7 +3927,6 @@
+
+ while (1) {
+ if (path->slots[0] == 0) {
+- btrfs_set_path_blocking(path);
+ ret = btrfs_prev_leaf(root, path);
+ if (ret != 0)
+ return ret;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/ctree.h linux-2.6.29-rc3.owrt/fs/btrfs/ctree.h
+--- linux-2.6.29.owrt/fs/btrfs/ctree.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/ctree.h 2009-05-10 23:48:29.000000000 +0200
+@@ -43,7 +43,11 @@
+
+ #define BTRFS_ACL_NOT_CACHED ((void *)-1)
+
+-#define BTRFS_MAX_LEVEL 8
++#ifdef CONFIG_LOCKDEP
++# define BTRFS_MAX_LEVEL 7
++#else
++# define BTRFS_MAX_LEVEL 8
++#endif
+
+ /* holds pointers to all of the tree roots */
+ #define BTRFS_ROOT_TREE_OBJECTID 1ULL
+@@ -450,11 +454,17 @@
+ __le32 nsec;
+ } __attribute__ ((__packed__));
+
+-enum btrfs_compression_type {
++typedef enum {
+ BTRFS_COMPRESS_NONE = 0,
+ BTRFS_COMPRESS_ZLIB = 1,
+ BTRFS_COMPRESS_LAST = 2,
+-};
++} btrfs_compression_type;
++
++/* we don't understand any encryption methods right now */
++typedef enum {
++ BTRFS_ENCRYPTION_NONE = 0,
++ BTRFS_ENCRYPTION_LAST = 1,
++} btrfs_encryption_type;
+
+ struct btrfs_inode_item {
+ /* nfs style generation number */
+@@ -596,27 +606,13 @@
+
+ struct btrfs_space_info {
+ u64 flags;
+-
+- u64 total_bytes; /* total bytes in the space */
+- u64 bytes_used; /* total bytes used on disk */
+- u64 bytes_pinned; /* total bytes pinned, will be freed when the
+- transaction finishes */
+- u64 bytes_reserved; /* total bytes the allocator has reserved for
+- current allocations */
+- u64 bytes_readonly; /* total bytes that are read only */
+-
+- /* delalloc accounting */
+- u64 bytes_delalloc; /* number of bytes reserved for allocation,
+- this space is not necessarily reserved yet
+- by the allocator */
+- u64 bytes_may_use; /* number of bytes that may be used for
+- delalloc */
+-
+- int full; /* indicates that we cannot allocate any more
+- chunks for this space */
+- int force_alloc; /* set if we need to force a chunk alloc for
+- this space */
+-
++ u64 total_bytes;
++ u64 bytes_used;
++ u64 bytes_pinned;
++ u64 bytes_reserved;
++ u64 bytes_readonly;
++ int full;
++ int force_alloc;
+ struct list_head list;
+
+ /* for block groups in our same type */
+@@ -705,7 +701,9 @@
+ struct btrfs_transaction *running_transaction;
+ wait_queue_head_t transaction_throttle;
+ wait_queue_head_t transaction_wait;
++
+ wait_queue_head_t async_submit_wait;
++ wait_queue_head_t tree_log_wait;
+
+ struct btrfs_super_block super_copy;
+ struct btrfs_super_block super_for_commit;
+@@ -713,6 +711,7 @@
+ struct super_block *sb;
+ struct inode *btree_inode;
+ struct backing_dev_info bdi;
++ spinlock_t hash_lock;
+ struct mutex trans_mutex;
+ struct mutex tree_log_mutex;
+ struct mutex transaction_kthread_mutex;
+@@ -731,6 +730,10 @@
+ atomic_t async_submit_draining;
+ atomic_t nr_async_bios;
+ atomic_t async_delalloc_pages;
++ atomic_t tree_log_writers;
++ atomic_t tree_log_commit;
++ unsigned long tree_log_batch;
++ u64 tree_log_transid;
+
+ /*
+ * this is used by the balancing code to wait for all the pending
+@@ -784,14 +787,7 @@
+ struct list_head dirty_cowonly_roots;
+
+ struct btrfs_fs_devices *fs_devices;
+-
+- /*
+- * the space_info list is almost entirely read only. It only changes
+- * when we add a new raid type to the FS, and that happens
+- * very rarely. RCU is used to protect it.
+- */
+ struct list_head space_info;
+-
+ spinlock_t delalloc_lock;
+ spinlock_t new_trans_lock;
+ u64 delalloc_bytes;
+@@ -837,14 +833,7 @@
+ struct kobject root_kobj;
+ struct completion kobj_unregister;
+ struct mutex objectid_mutex;
+-
+ struct mutex log_mutex;
+- wait_queue_head_t log_writer_wait;
+- wait_queue_head_t log_commit_wait[2];
+- atomic_t log_writers;
+- atomic_t log_commit[2];
+- unsigned long log_transid;
+- unsigned long log_batch;
+
+ u64 objectid;
+ u64 last_trans;
+@@ -1732,8 +1721,7 @@
+ u64 empty_size);
+ struct extent_buffer *btrfs_init_new_buffer(struct btrfs_trans_handle *trans,
+ struct btrfs_root *root,
+- u64 bytenr, u32 blocksize,
+- int level);
++ u64 bytenr, u32 blocksize);
+ int btrfs_alloc_extent(struct btrfs_trans_handle *trans,
+ struct btrfs_root *root,
+ u64 num_bytes, u64 parent, u64 min_bytes,
+@@ -1803,18 +1791,6 @@
+ int btrfs_cleanup_reloc_trees(struct btrfs_root *root);
+ int btrfs_reloc_clone_csums(struct inode *inode, u64 file_pos, u64 len);
+ u64 btrfs_reduce_alloc_profile(struct btrfs_root *root, u64 flags);
+-void btrfs_set_inode_space_info(struct btrfs_root *root, struct inode *ionde);
+-void btrfs_clear_space_info_full(struct btrfs_fs_info *info);
+-
+-int btrfs_check_metadata_free_space(struct btrfs_root *root);
+-int btrfs_check_data_free_space(struct btrfs_root *root, struct inode *inode,
+- u64 bytes);
+-void btrfs_free_reserved_data_space(struct btrfs_root *root,
+- struct inode *inode, u64 bytes);
+-void btrfs_delalloc_reserve_space(struct btrfs_root *root, struct inode *inode,
+- u64 bytes);
+-void btrfs_delalloc_free_space(struct btrfs_root *root, struct inode *inode,
+- u64 bytes);
+ /* ctree.c */
+ int btrfs_previous_item(struct btrfs_root *root,
+ struct btrfs_path *path, u64 min_objectid,
+@@ -1864,9 +1840,7 @@
+ void btrfs_release_path(struct btrfs_root *root, struct btrfs_path *p);
+ struct btrfs_path *btrfs_alloc_path(void);
+ void btrfs_free_path(struct btrfs_path *p);
+-void btrfs_set_path_blocking(struct btrfs_path *p);
+-void btrfs_unlock_up_safe(struct btrfs_path *p, int level);
+-
++void btrfs_init_path(struct btrfs_path *p);
+ int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root,
+ struct btrfs_path *path, int slot, int nr);
+ int btrfs_del_leaf(struct btrfs_trans_handle *trans,
+@@ -2060,6 +2034,8 @@
+ unsigned long btrfs_force_ra(struct address_space *mapping,
+ struct file_ra_state *ra, struct file *file,
+ pgoff_t offset, pgoff_t last_index);
++int btrfs_check_free_space(struct btrfs_root *root, u64 num_required,
++ int for_del);
+ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct page *page);
+ int btrfs_readpage(struct file *file, struct page *page);
+ void btrfs_delete_inode(struct inode *inode);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/disk-io.c linux-2.6.29-rc3.owrt/fs/btrfs/disk-io.c
+--- linux-2.6.29.owrt/fs/btrfs/disk-io.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/disk-io.c 2009-05-10 23:48:29.000000000 +0200
+@@ -16,6 +16,7 @@
+ * Boston, MA 021110-1307, USA.
+ */
+
++#include <linux/version.h>
+ #include <linux/fs.h>
+ #include <linux/blkdev.h>
+ #include <linux/scatterlist.h>
+@@ -75,40 +76,6 @@
+ struct btrfs_work work;
+ };
+
+-/* These are used to set the lockdep class on the extent buffer locks.
+- * The class is set by the readpage_end_io_hook after the buffer has
+- * passed csum validation but before the pages are unlocked.
+- *
+- * The lockdep class is also set by btrfs_init_new_buffer on freshly
+- * allocated blocks.
+- *
+- * The class is based on the level in the tree block, which allows lockdep
+- * to know that lower nodes nest inside the locks of higher nodes.
+- *
+- * We also add a check to make sure the highest level of the tree is
+- * the same as our lockdep setup here. If BTRFS_MAX_LEVEL changes, this
+- * code needs update as well.
+- */
+-#ifdef CONFIG_DEBUG_LOCK_ALLOC
+-# if BTRFS_MAX_LEVEL != 8
+-# error
+-# endif
+-static struct lock_class_key btrfs_eb_class[BTRFS_MAX_LEVEL + 1];
+-static const char *btrfs_eb_name[BTRFS_MAX_LEVEL + 1] = {
+- /* leaf */
+- "btrfs-extent-00",
+- "btrfs-extent-01",
+- "btrfs-extent-02",
+- "btrfs-extent-03",
+- "btrfs-extent-04",
+- "btrfs-extent-05",
+- "btrfs-extent-06",
+- "btrfs-extent-07",
+- /* highest possible level */
+- "btrfs-extent-08",
+-};
+-#endif
+-
+ /*
+ * extents on the btree inode are pretty simple, there's one extent
+ * that covers the entire device
+@@ -381,15 +348,6 @@
+ return ret;
+ }
+
+-#ifdef CONFIG_DEBUG_LOCK_ALLOC
+-void btrfs_set_buffer_lockdep_class(struct extent_buffer *eb, int level)
+-{
+- lockdep_set_class_and_name(&eb->lock,
+- &btrfs_eb_class[level],
+- btrfs_eb_name[level]);
+-}
+-#endif
+-
+ static int btree_readpage_end_io_hook(struct page *page, u64 start, u64 end,
+ struct extent_state *state)
+ {
+@@ -435,8 +393,6 @@
+ }
+ found_level = btrfs_header_level(eb);
+
+- btrfs_set_buffer_lockdep_class(eb, found_level);
+-
+ ret = csum_tree_block(root, eb, 1);
+ if (ret)
+ ret = -EIO;
+@@ -844,7 +800,7 @@
+ ret = btree_read_extent_buffer_pages(root, buf, 0, parent_transid);
+
+ if (ret == 0)
+- set_bit(EXTENT_BUFFER_UPTODATE, &buf->bflags);
++ buf->flags |= EXTENT_UPTODATE;
+ else
+ WARN_ON(1);
+ return buf;
+@@ -857,11 +813,7 @@
+ struct inode *btree_inode = root->fs_info->btree_inode;
+ if (btrfs_header_generation(buf) ==
+ root->fs_info->running_transaction->transid) {
+- btrfs_assert_tree_locked(buf);
+-
+- /* ugh, clear_extent_buffer_dirty can be expensive */
+- btrfs_set_lock_blocking(buf);
+-
++ WARN_ON(!btrfs_tree_locked(buf));
+ clear_extent_buffer_dirty(&BTRFS_I(btree_inode)->io_tree,
+ buf);
+ }
+@@ -898,14 +850,6 @@
+ spin_lock_init(&root->list_lock);
+ mutex_init(&root->objectid_mutex);
+ mutex_init(&root->log_mutex);
+- init_waitqueue_head(&root->log_writer_wait);
+- init_waitqueue_head(&root->log_commit_wait[0]);
+- init_waitqueue_head(&root->log_commit_wait[1]);
+- atomic_set(&root->log_commit[0], 0);
+- atomic_set(&root->log_commit[1], 0);
+- atomic_set(&root->log_writers, 0);
+- root->log_batch = 0;
+- root->log_transid = 0;
+ extent_io_tree_init(&root->dirty_log_pages,
+ fs_info->btree_inode->i_mapping, GFP_NOFS);
+
+@@ -990,16 +934,15 @@
+ return 0;
+ }
+
+-static struct btrfs_root *alloc_log_tree(struct btrfs_trans_handle *trans,
+- struct btrfs_fs_info *fs_info)
++int btrfs_init_log_root_tree(struct btrfs_trans_handle *trans,
++ struct btrfs_fs_info *fs_info)
+ {
+ struct btrfs_root *root;
+ struct btrfs_root *tree_root = fs_info->tree_root;
+- struct extent_buffer *leaf;
+
+ root = kzalloc(sizeof(*root), GFP_NOFS);
+ if (!root)
+- return ERR_PTR(-ENOMEM);
++ return -ENOMEM;
+
+ __setup_root(tree_root->nodesize, tree_root->leafsize,
+ tree_root->sectorsize, tree_root->stripesize,
+@@ -1008,23 +951,12 @@
+ root->root_key.objectid = BTRFS_TREE_LOG_OBJECTID;
+ root->root_key.type = BTRFS_ROOT_ITEM_KEY;
+ root->root_key.offset = BTRFS_TREE_LOG_OBJECTID;
+- /*
+- * log trees do not get reference counted because they go away
+- * before a real commit is actually done. They do store pointers
+- * to file data extents, and those reference counts still get
+- * updated (along with back refs to the log tree).
+- */
+ root->ref_cows = 0;
+
+- leaf = btrfs_alloc_free_block(trans, root, root->leafsize,
+- 0, BTRFS_TREE_LOG_OBJECTID,
+- trans->transid, 0, 0, 0);
+- if (IS_ERR(leaf)) {
+- kfree(root);
+- return ERR_CAST(leaf);
+- }
++ root->node = btrfs_alloc_free_block(trans, root, root->leafsize,
++ 0, BTRFS_TREE_LOG_OBJECTID,
++ trans->transid, 0, 0, 0);
+
+- root->node = leaf;
+ btrfs_set_header_nritems(root->node, 0);
+ btrfs_set_header_level(root->node, 0);
+ btrfs_set_header_bytenr(root->node, root->node->start);
+@@ -1036,48 +968,7 @@
+ BTRFS_FSID_SIZE);
+ btrfs_mark_buffer_dirty(root->node);
+ btrfs_tree_unlock(root->node);
+- return root;
+-}
+-
+-int btrfs_init_log_root_tree(struct btrfs_trans_handle *trans,
+- struct btrfs_fs_info *fs_info)
+-{
+- struct btrfs_root *log_root;
+-
+- log_root = alloc_log_tree(trans, fs_info);
+- if (IS_ERR(log_root))
+- return PTR_ERR(log_root);
+- WARN_ON(fs_info->log_root_tree);
+- fs_info->log_root_tree = log_root;
+- return 0;
+-}
+-
+-int btrfs_add_log_tree(struct btrfs_trans_handle *trans,
+- struct btrfs_root *root)
+-{
+- struct btrfs_root *log_root;
+- struct btrfs_inode_item *inode_item;
+-
+- log_root = alloc_log_tree(trans, root->fs_info);
+- if (IS_ERR(log_root))
+- return PTR_ERR(log_root);
+-
+- log_root->last_trans = trans->transid;
+- log_root->root_key.offset = root->root_key.objectid;
+-
+- inode_item = &log_root->root_item.inode;
+- inode_item->generation = cpu_to_le64(1);
+- inode_item->size = cpu_to_le64(3);
+- inode_item->nlink = cpu_to_le32(1);
+- inode_item->nbytes = cpu_to_le64(root->leafsize);
+- inode_item->mode = cpu_to_le32(S_IFDIR | 0755);
+-
+- btrfs_set_root_bytenr(&log_root->root_item, log_root->node->start);
+- btrfs_set_root_generation(&log_root->root_item, trans->transid);
+-
+- WARN_ON(root->log_root);
+- root->log_root = log_root;
+- root->log_transid = 0;
++ fs_info->log_root_tree = root;
+ return 0;
+ }
+
+@@ -1245,6 +1136,7 @@
+ {
+ struct btrfs_fs_info *info = (struct btrfs_fs_info *)congested_data;
+ int ret = 0;
++ struct list_head *cur;
+ struct btrfs_device *device;
+ struct backing_dev_info *bdi;
+ #if 0
+@@ -1252,7 +1144,8 @@
+ btrfs_congested_async(info, 0))
+ return 1;
+ #endif
+- list_for_each_entry(device, &info->fs_devices->devices, dev_list) {
++ list_for_each(cur, &info->fs_devices->devices) {
++ device = list_entry(cur, struct btrfs_device, dev_list);
+ if (!device->bdev)
+ continue;
+ bdi = blk_get_backing_dev_info(device->bdev);
+@@ -1270,11 +1163,13 @@
+ */
+ static void __unplug_io_fn(struct backing_dev_info *bdi, struct page *page)
+ {
++ struct list_head *cur;
+ struct btrfs_device *device;
+ struct btrfs_fs_info *info;
+
+ info = (struct btrfs_fs_info *)bdi->unplug_io_data;
+- list_for_each_entry(device, &info->fs_devices->devices, dev_list) {
++ list_for_each(cur, &info->fs_devices->devices) {
++ device = list_entry(cur, struct btrfs_device, dev_list);
+ if (!device->bdev)
+ continue;
+
+@@ -1552,6 +1447,7 @@
+ INIT_LIST_HEAD(&fs_info->dead_roots);
+ INIT_LIST_HEAD(&fs_info->hashers);
+ INIT_LIST_HEAD(&fs_info->delalloc_inodes);
++ spin_lock_init(&fs_info->hash_lock);
+ spin_lock_init(&fs_info->delalloc_lock);
+ spin_lock_init(&fs_info->new_trans_lock);
+ spin_lock_init(&fs_info->ref_cache_lock);
+@@ -1639,6 +1535,10 @@
+ init_waitqueue_head(&fs_info->transaction_throttle);
+ init_waitqueue_head(&fs_info->transaction_wait);
+ init_waitqueue_head(&fs_info->async_submit_wait);
++ init_waitqueue_head(&fs_info->tree_log_wait);
++ atomic_set(&fs_info->tree_log_commit, 0);
++ atomic_set(&fs_info->tree_log_writers, 0);
++ fs_info->tree_log_transid = 0;
+
+ __setup_root(4096, 4096, 4096, 4096, tree_root,
+ fs_info, BTRFS_ROOT_TREE_OBJECTID);
+@@ -1727,8 +1627,6 @@
+ * low idle thresh
+ */
+ fs_info->endio_workers.idle_thresh = 4;
+- fs_info->endio_meta_workers.idle_thresh = 4;
+-
+ fs_info->endio_write_workers.idle_thresh = 64;
+ fs_info->endio_meta_write_workers.idle_thresh = 64;
+
+@@ -1822,6 +1720,7 @@
+ ret = find_and_setup_root(tree_root, fs_info,
+ BTRFS_DEV_TREE_OBJECTID, dev_root);
+ dev_root->track_dirty = 1;
++
+ if (ret)
+ goto fail_extent_root;
+
+@@ -1841,13 +1740,13 @@
+ fs_info->system_alloc_profile = fs_info->metadata_alloc_profile;
+ fs_info->cleaner_kthread = kthread_run(cleaner_kthread, tree_root,
+ "btrfs-cleaner");
+- if (IS_ERR(fs_info->cleaner_kthread))
++ if (!fs_info->cleaner_kthread)
+ goto fail_csum_root;
+
+ fs_info->transaction_kthread = kthread_run(transaction_kthread,
+ tree_root,
+ "btrfs-transaction");
+- if (IS_ERR(fs_info->transaction_kthread))
++ if (!fs_info->transaction_kthread)
+ goto fail_cleaner;
+
+ if (btrfs_super_log_root(disk_super) != 0) {
+@@ -1929,14 +1828,13 @@
+ fail_iput:
+ invalidate_inode_pages2(fs_info->btree_inode->i_mapping);
+ iput(fs_info->btree_inode);
+-
++fail:
+ btrfs_close_devices(fs_info->fs_devices);
+ btrfs_mapping_tree_free(&fs_info->mapping_tree);
+- bdi_destroy(&fs_info->bdi);
+
+-fail:
+ kfree(extent_root);
+ kfree(tree_root);
++ bdi_destroy(&fs_info->bdi);
+ kfree(fs_info);
+ kfree(chunk_root);
+ kfree(dev_root);
+@@ -2097,6 +1995,7 @@
+
+ int write_all_supers(struct btrfs_root *root, int max_mirrors)
+ {
++ struct list_head *cur;
+ struct list_head *head = &root->fs_info->fs_devices->devices;
+ struct btrfs_device *dev;
+ struct btrfs_super_block *sb;
+@@ -2112,7 +2011,8 @@
+
+ sb = &root->fs_info->super_for_commit;
+ dev_item = &sb->dev_item;
+- list_for_each_entry(dev, head, dev_list) {
++ list_for_each(cur, head) {
++ dev = list_entry(cur, struct btrfs_device, dev_list);
+ if (!dev->bdev) {
+ total_errors++;
+ continue;
+@@ -2145,7 +2045,8 @@
+ }
+
+ total_errors = 0;
+- list_for_each_entry(dev, head, dev_list) {
++ list_for_each(cur, head) {
++ dev = list_entry(cur, struct btrfs_device, dev_list);
+ if (!dev->bdev)
+ continue;
+ if (!dev->in_fs_metadata || !dev->writeable)
+@@ -2359,9 +2260,7 @@
+ u64 transid = btrfs_header_generation(buf);
+ struct inode *btree_inode = root->fs_info->btree_inode;
+
+- btrfs_set_lock_blocking(buf);
+-
+- btrfs_assert_tree_locked(buf);
++ WARN_ON(!btrfs_tree_locked(buf));
+ if (transid != root->fs_info->generation) {
+ printk(KERN_CRIT "btrfs transid mismatch buffer %llu, "
+ "found %llu running %llu\n",
+@@ -2403,13 +2302,14 @@
+ int ret;
+ ret = btree_read_extent_buffer_pages(root, buf, 0, parent_transid);
+ if (ret == 0)
+- set_bit(EXTENT_BUFFER_UPTODATE, &buf->bflags);
++ buf->flags |= EXTENT_UPTODATE;
+ return ret;
+ }
+
+ int btree_lock_page_hook(struct page *page)
+ {
+ struct inode *inode = page->mapping->host;
++ struct btrfs_root *root = BTRFS_I(inode)->root;
+ struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
+ struct extent_buffer *eb;
+ unsigned long len;
+@@ -2424,7 +2324,9 @@
+ goto out;
+
+ btrfs_tree_lock(eb);
++ spin_lock(&root->fs_info->hash_lock);
+ btrfs_set_header_flag(eb, BTRFS_HEADER_FLAG_WRITTEN);
++ spin_unlock(&root->fs_info->hash_lock);
+ btrfs_tree_unlock(eb);
+ free_extent_buffer(eb);
+ out:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/disk-io.h linux-2.6.29-rc3.owrt/fs/btrfs/disk-io.h
+--- linux-2.6.29.owrt/fs/btrfs/disk-io.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/disk-io.h 2009-05-10 23:48:29.000000000 +0200
+@@ -98,17 +98,5 @@
+ struct btrfs_fs_info *fs_info);
+ int btrfs_init_log_root_tree(struct btrfs_trans_handle *trans,
+ struct btrfs_fs_info *fs_info);
+-int btrfs_add_log_tree(struct btrfs_trans_handle *trans,
+- struct btrfs_root *root);
+ int btree_lock_page_hook(struct page *page);
+-
+-
+-#ifdef CONFIG_DEBUG_LOCK_ALLOC
+-void btrfs_set_buffer_lockdep_class(struct extent_buffer *eb, int level);
+-#else
+-static inline void btrfs_set_buffer_lockdep_class(struct extent_buffer *eb,
+- int level)
+-{
+-}
+-#endif
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/extent_io.c linux-2.6.29-rc3.owrt/fs/btrfs/extent_io.c
+--- linux-2.6.29.owrt/fs/btrfs/extent_io.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/extent_io.c 2009-05-10 23:48:29.000000000 +0200
+@@ -9,6 +9,7 @@
+ #include <linux/spinlock.h>
+ #include <linux/blkdev.h>
+ #include <linux/swap.h>
++#include <linux/version.h>
+ #include <linux/writeback.h>
+ #include <linux/pagevec.h>
+ #include "extent_io.h"
+@@ -30,7 +31,7 @@
+ static LIST_HEAD(states);
+
+ #define LEAK_DEBUG 0
+-#if LEAK_DEBUG
++#ifdef LEAK_DEBUG
+ static DEFINE_SPINLOCK(leak_lock);
+ #endif
+
+@@ -119,7 +120,7 @@
+ static struct extent_state *alloc_extent_state(gfp_t mask)
+ {
+ struct extent_state *state;
+-#if LEAK_DEBUG
++#ifdef LEAK_DEBUG
+ unsigned long flags;
+ #endif
+
+@@ -129,7 +130,7 @@
+ state->state = 0;
+ state->private = 0;
+ state->tree = NULL;
+-#if LEAK_DEBUG
++#ifdef LEAK_DEBUG
+ spin_lock_irqsave(&leak_lock, flags);
+ list_add(&state->leak_list, &states);
+ spin_unlock_irqrestore(&leak_lock, flags);
+@@ -144,11 +145,11 @@
+ if (!state)
+ return;
+ if (atomic_dec_and_test(&state->refs)) {
+-#if LEAK_DEBUG
++#ifdef LEAK_DEBUG
+ unsigned long flags;
+ #endif
+ WARN_ON(state->tree);
+-#if LEAK_DEBUG
++#ifdef LEAK_DEBUG
+ spin_lock_irqsave(&leak_lock, flags);
+ list_del(&state->leak_list);
+ spin_unlock_irqrestore(&leak_lock, flags);
+@@ -415,6 +416,8 @@
+
+ node = tree_insert(&tree->state, prealloc->end, &prealloc->rb_node);
+ if (node) {
++ struct extent_state *found;
++ found = rb_entry(node, struct extent_state, rb_node);
+ free_extent_state(prealloc);
+ return -EEXIST;
+ }
+@@ -2375,6 +2378,11 @@
+ int scanned = 0;
+ int range_whole = 0;
+
++ if (wbc->nonblocking && bdi_write_congested(bdi)) {
++ wbc->encountered_congestion = 1;
++ return 0;
++ }
++
+ pagevec_init(&pvec, 0);
+ if (wbc->range_cyclic) {
+ index = mapping->writeback_index; /* Start from prev offset */
+@@ -2847,98 +2855,6 @@
+ return sector;
+ }
+
+-int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
+- __u64 start, __u64 len, get_extent_t *get_extent)
+-{
+- int ret;
+- u64 off = start;
+- u64 max = start + len;
+- u32 flags = 0;
+- u64 disko = 0;
+- struct extent_map *em = NULL;
+- int end = 0;
+- u64 em_start = 0, em_len = 0;
+- unsigned long emflags;
+- ret = 0;
+-
+- if (len == 0)
+- return -EINVAL;
+-
+- lock_extent(&BTRFS_I(inode)->io_tree, start, start + len,
+- GFP_NOFS);
+- em = get_extent(inode, NULL, 0, off, max - off, 0);
+- if (!em)
+- goto out;
+- if (IS_ERR(em)) {
+- ret = PTR_ERR(em);
+- goto out;
+- }
+- while (!end) {
+- off = em->start + em->len;
+- if (off >= max)
+- end = 1;
+-
+- em_start = em->start;
+- em_len = em->len;
+-
+- disko = 0;
+- flags = 0;
+-
+- switch (em->block_start) {
+- case EXTENT_MAP_LAST_BYTE:
+- end = 1;
+- flags |= FIEMAP_EXTENT_LAST;
+- break;
+- case EXTENT_MAP_HOLE:
+- flags |= FIEMAP_EXTENT_UNWRITTEN;
+- break;
+- case EXTENT_MAP_INLINE:
+- flags |= (FIEMAP_EXTENT_DATA_INLINE |
+- FIEMAP_EXTENT_NOT_ALIGNED);
+- break;
+- case EXTENT_MAP_DELALLOC:
+- flags |= (FIEMAP_EXTENT_DELALLOC |
+- FIEMAP_EXTENT_UNKNOWN);
+- break;
+- default:
+- disko = em->block_start;
+- break;
+- }
+- if (test_bit(EXTENT_FLAG_COMPRESSED, &em->flags))
+- flags |= FIEMAP_EXTENT_ENCODED;
+-
+- emflags = em->flags;
+- free_extent_map(em);
+- em = NULL;
+-
+- if (!end) {
+- em = get_extent(inode, NULL, 0, off, max - off, 0);
+- if (!em)
+- goto out;
+- if (IS_ERR(em)) {
+- ret = PTR_ERR(em);
+- goto out;
+- }
+- emflags = em->flags;
+- }
+- if (test_bit(EXTENT_FLAG_VACANCY, &emflags)) {
+- flags |= FIEMAP_EXTENT_LAST;
+- end = 1;
+- }
+-
+- ret = fiemap_fill_next_extent(fieinfo, em_start, disko,
+- em_len, flags);
+- if (ret)
+- goto out_free;
+- }
+-out_free:
+- free_extent_map(em);
+-out:
+- unlock_extent(&BTRFS_I(inode)->io_tree, start, start + len,
+- GFP_NOFS);
+- return ret;
+-}
+-
+ static inline struct page *extent_buffer_page(struct extent_buffer *eb,
+ unsigned long i)
+ {
+@@ -2976,17 +2892,15 @@
+ gfp_t mask)
+ {
+ struct extent_buffer *eb = NULL;
+-#if LEAK_DEBUG
++#ifdef LEAK_DEBUG
+ unsigned long flags;
+ #endif
+
+ eb = kmem_cache_zalloc(extent_buffer_cache, mask);
+ eb->start = start;
+ eb->len = len;
+- spin_lock_init(&eb->lock);
+- init_waitqueue_head(&eb->lock_wq);
+-
+-#if LEAK_DEBUG
++ mutex_init(&eb->mutex);
++#ifdef LEAK_DEBUG
+ spin_lock_irqsave(&leak_lock, flags);
+ list_add(&eb->leak_list, &buffers);
+ spin_unlock_irqrestore(&leak_lock, flags);
+@@ -2998,7 +2912,7 @@
+
+ static void __free_extent_buffer(struct extent_buffer *eb)
+ {
+-#if LEAK_DEBUG
++#ifdef LEAK_DEBUG
+ unsigned long flags;
+ spin_lock_irqsave(&leak_lock, flags);
+ list_del(&eb->leak_list);
+@@ -3066,7 +2980,8 @@
+ unlock_page(p);
+ }
+ if (uptodate)
+- set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
++ eb->flags |= EXTENT_UPTODATE;
++ eb->flags |= EXTENT_BUFFER_FILLED;
+
+ spin_lock(&tree->buffer_lock);
+ exists = buffer_tree_insert(tree, start, &eb->rb_node);
+@@ -3220,7 +3135,7 @@
+ unsigned long num_pages;
+
+ num_pages = num_extent_pages(eb->start, eb->len);
+- clear_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
++ eb->flags &= ~EXTENT_UPTODATE;
+
+ clear_extent_uptodate(tree, eb->start, eb->start + eb->len - 1,
+ GFP_NOFS);
+@@ -3291,7 +3206,7 @@
+ struct page *page;
+ int pg_uptodate = 1;
+
+- if (test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags))
++ if (eb->flags & EXTENT_UPTODATE)
+ return 1;
+
+ ret = test_range_bit(tree, eb->start, eb->start + eb->len - 1,
+@@ -3327,7 +3242,7 @@
+ struct bio *bio = NULL;
+ unsigned long bio_flags = 0;
+
+- if (test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags))
++ if (eb->flags & EXTENT_UPTODATE)
+ return 0;
+
+ if (test_range_bit(tree, eb->start, eb->start + eb->len - 1,
+@@ -3358,7 +3273,7 @@
+ }
+ if (all_uptodate) {
+ if (start_i == 0)
+- set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
++ eb->flags |= EXTENT_UPTODATE;
+ goto unlock_exit;
+ }
+
+@@ -3394,7 +3309,7 @@
+ }
+
+ if (!ret)
+- set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
++ eb->flags |= EXTENT_UPTODATE;
+ return ret;
+
+ unlock_exit:
+@@ -3491,6 +3406,7 @@
+ unmap_extent_buffer(eb, eb->map_token, km);
+ eb->map_token = NULL;
+ save = 1;
++ WARN_ON(!mutex_is_locked(&eb->mutex));
+ }
+ err = map_private_extent_buffer(eb, start, min_len, token, map,
+ map_start, map_len, km);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/extent_io.h linux-2.6.29-rc3.owrt/fs/btrfs/extent_io.h
+--- linux-2.6.29.owrt/fs/btrfs/extent_io.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/extent_io.h 2009-05-10 23:48:29.000000000 +0200
+@@ -22,10 +22,6 @@
+ /* flags for bio submission */
+ #define EXTENT_BIO_COMPRESSED 1
+
+-/* these are bit numbers for test/set bit */
+-#define EXTENT_BUFFER_UPTODATE 0
+-#define EXTENT_BUFFER_BLOCKING 1
+-
+ /*
+ * page->private values. Every page that is controlled by the extent
+ * map has page->private set to one.
+@@ -99,19 +95,11 @@
+ unsigned long map_start;
+ unsigned long map_len;
+ struct page *first_page;
+- unsigned long bflags;
+ atomic_t refs;
++ int flags;
+ struct list_head leak_list;
+ struct rb_node rb_node;
+-
+- /* the spinlock is used to protect most operations */
+- spinlock_t lock;
+-
+- /*
+- * when we keep the lock held while blocking, waiters go onto
+- * the wq
+- */
+- wait_queue_head_t lock_wq;
++ struct mutex mutex;
+ };
+
+ struct extent_map_tree;
+@@ -205,8 +193,6 @@
+ unsigned from, unsigned to);
+ sector_t extent_bmap(struct address_space *mapping, sector_t iblock,
+ get_extent_t *get_extent);
+-int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
+- __u64 start, __u64 len, get_extent_t *get_extent);
+ int set_range_dirty(struct extent_io_tree *tree, u64 start, u64 end);
+ int set_state_private(struct extent_io_tree *tree, u64 start, u64 private);
+ int get_state_private(struct extent_io_tree *tree, u64 start, u64 *private);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/extent_map.c linux-2.6.29-rc3.owrt/fs/btrfs/extent_map.c
+--- linux-2.6.29.owrt/fs/btrfs/extent_map.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/extent_map.c 2009-05-10 23:48:29.000000000 +0200
+@@ -3,6 +3,7 @@
+ #include <linux/slab.h>
+ #include <linux/module.h>
+ #include <linux/spinlock.h>
++#include <linux/version.h>
+ #include <linux/hardirq.h>
+ #include "extent_map.h"
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/extent-tree.c linux-2.6.29-rc3.owrt/fs/btrfs/extent-tree.c
+--- linux-2.6.29.owrt/fs/btrfs/extent-tree.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/extent-tree.c 2009-05-10 23:48:29.000000000 +0200
+@@ -19,8 +19,7 @@
+ #include <linux/pagemap.h>
+ #include <linux/writeback.h>
+ #include <linux/blkdev.h>
+-#include <linux/sort.h>
+-#include <linux/rcupdate.h>
++#include <linux/version.h>
+ #include "compat.h"
+ #include "hash.h"
+ #include "crc32c.h"
+@@ -31,6 +30,7 @@
+ #include "volumes.h"
+ #include "locking.h"
+ #include "ref-cache.h"
++#include "compat.h"
+
+ #define PENDING_EXTENT_INSERT 0
+ #define PENDING_EXTENT_DELETE 1
+@@ -61,10 +61,6 @@
+ u64 bytenr, u64 num_bytes, int alloc,
+ int mark_free);
+
+-static int do_chunk_alloc(struct btrfs_trans_handle *trans,
+- struct btrfs_root *extent_root, u64 alloc_bytes,
+- u64 flags, int force);
+-
+ static int block_group_bits(struct btrfs_block_group_cache *cache, u64 bits)
+ {
+ return (cache->flags & bits) == bits;
+@@ -330,34 +326,16 @@
+ u64 flags)
+ {
+ struct list_head *head = &info->space_info;
++ struct list_head *cur;
+ struct btrfs_space_info *found;
+-
+- rcu_read_lock();
+- list_for_each_entry_rcu(found, head, list) {
+- if (found->flags == flags) {
+- rcu_read_unlock();
++ list_for_each(cur, head) {
++ found = list_entry(cur, struct btrfs_space_info, list);
++ if (found->flags == flags)
+ return found;
+- }
+ }
+- rcu_read_unlock();
+ return NULL;
+ }
+
+-/*
+- * after adding space to the filesystem, we need to clear the full flags
+- * on all the space infos.
+- */
+-void btrfs_clear_space_info_full(struct btrfs_fs_info *info)
+-{
+- struct list_head *head = &info->space_info;
+- struct btrfs_space_info *found;
+-
+- rcu_read_lock();
+- list_for_each_entry_rcu(found, head, list)
+- found->full = 0;
+- rcu_read_unlock();
+-}
+-
+ static u64 div_factor(u64 num, int factor)
+ {
+ if (factor == 10)
+@@ -1348,25 +1326,8 @@
+ int btrfs_extent_post_op(struct btrfs_trans_handle *trans,
+ struct btrfs_root *root)
+ {
+- u64 start;
+- u64 end;
+- int ret;
+-
+- while(1) {
+- finish_current_insert(trans, root->fs_info->extent_root, 1);
+- del_pending_extents(trans, root->fs_info->extent_root, 1);
+-
+- /* is there more work to do? */
+- ret = find_first_extent_bit(&root->fs_info->pending_del,
+- 0, &start, &end, EXTENT_WRITEBACK);
+- if (!ret)
+- continue;
+- ret = find_first_extent_bit(&root->fs_info->extent_ins,
+- 0, &start, &end, EXTENT_WRITEBACK);
+- if (!ret)
+- continue;
+- break;
+- }
++ finish_current_insert(trans, root->fs_info->extent_root, 1);
++ del_pending_extents(trans, root->fs_info->extent_root, 1);
+ return 0;
+ }
+
+@@ -1564,55 +1525,15 @@
+ return ret;
+ }
+
+-/* when a block goes through cow, we update the reference counts of
+- * everything that block points to. The internal pointers of the block
+- * can be in just about any order, and it is likely to have clusters of
+- * things that are close together and clusters of things that are not.
+- *
+- * To help reduce the seeks that come with updating all of these reference
+- * counts, sort them by byte number before actual updates are done.
+- *
+- * struct refsort is used to match byte number to slot in the btree block.
+- * we sort based on the byte number and then use the slot to actually
+- * find the item.
+- *
+- * struct refsort is smaller than strcut btrfs_item and smaller than
+- * struct btrfs_key_ptr. Since we're currently limited to the page size
+- * for a btree block, there's no way for a kmalloc of refsorts for a
+- * single node to be bigger than a page.
+- */
+-struct refsort {
+- u64 bytenr;
+- u32 slot;
+-};
+-
+-/*
+- * for passing into sort()
+- */
+-static int refsort_cmp(const void *a_void, const void *b_void)
+-{
+- const struct refsort *a = a_void;
+- const struct refsort *b = b_void;
+-
+- if (a->bytenr < b->bytenr)
+- return -1;
+- if (a->bytenr > b->bytenr)
+- return 1;
+- return 0;
+-}
+-
+-
+-noinline int btrfs_inc_ref(struct btrfs_trans_handle *trans,
+- struct btrfs_root *root,
+- struct extent_buffer *orig_buf,
+- struct extent_buffer *buf, u32 *nr_extents)
++int btrfs_inc_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root,
++ struct extent_buffer *orig_buf, struct extent_buffer *buf,
++ u32 *nr_extents)
+ {
+ u64 bytenr;
+ u64 ref_root;
+ u64 orig_root;
+ u64 ref_generation;
+ u64 orig_generation;
+- struct refsort *sorted;
+ u32 nritems;
+ u32 nr_file_extents = 0;
+ struct btrfs_key key;
+@@ -1621,8 +1542,6 @@
+ int level;
+ int ret = 0;
+ int faili = 0;
+- int refi = 0;
+- int slot;
+ int (*process_func)(struct btrfs_trans_handle *, struct btrfs_root *,
+ u64, u64, u64, u64, u64, u64, u64, u64);
+
+@@ -1634,9 +1553,6 @@
+ nritems = btrfs_header_nritems(buf);
+ level = btrfs_header_level(buf);
+
+- sorted = kmalloc(sizeof(struct refsort) * nritems, GFP_NOFS);
+- BUG_ON(!sorted);
+-
+ if (root->ref_cows) {
+ process_func = __btrfs_inc_extent_ref;
+ } else {
+@@ -1649,11 +1565,6 @@
+ process_func = __btrfs_update_extent_ref;
+ }
+
+- /*
+- * we make two passes through the items. In the first pass we
+- * only record the byte number and slot. Then we sort based on
+- * byte number and do the actual work based on the sorted results
+- */
+ for (i = 0; i < nritems; i++) {
+ cond_resched();
+ if (level == 0) {
+@@ -1670,32 +1581,6 @@
+ continue;
+
+ nr_file_extents++;
+- sorted[refi].bytenr = bytenr;
+- sorted[refi].slot = i;
+- refi++;
+- } else {
+- bytenr = btrfs_node_blockptr(buf, i);
+- sorted[refi].bytenr = bytenr;
+- sorted[refi].slot = i;
+- refi++;
+- }
+- }
+- /*
+- * if refi == 0, we didn't actually put anything into the sorted
+- * array and we're done
+- */
+- if (refi == 0)
+- goto out;
+-
+- sort(sorted, refi, sizeof(struct refsort), refsort_cmp, NULL);
+-
+- for (i = 0; i < refi; i++) {
+- cond_resched();
+- slot = sorted[i].slot;
+- bytenr = sorted[i].bytenr;
+-
+- if (level == 0) {
+- btrfs_item_key_to_cpu(buf, &key, slot);
+
+ ret = process_func(trans, root, bytenr,
+ orig_buf->start, buf->start,
+@@ -1704,25 +1589,25 @@
+ key.objectid);
+
+ if (ret) {
+- faili = slot;
++ faili = i;
+ WARN_ON(1);
+ goto fail;
+ }
+ } else {
++ bytenr = btrfs_node_blockptr(buf, i);
+ ret = process_func(trans, root, bytenr,
+ orig_buf->start, buf->start,
+ orig_root, ref_root,
+ orig_generation, ref_generation,
+ level - 1);
+ if (ret) {
+- faili = slot;
++ faili = i;
+ WARN_ON(1);
+ goto fail;
+ }
+ }
+ }
+ out:
+- kfree(sorted);
+ if (nr_extents) {
+ if (level == 0)
+ *nr_extents = nr_file_extents;
+@@ -1731,7 +1616,6 @@
+ }
+ return 0;
+ fail:
+- kfree(sorted);
+ WARN_ON(1);
+ return ret;
+ }
+@@ -1924,6 +1808,7 @@
+ if (!found)
+ return -ENOMEM;
+
++ list_add(&found->list, &info->space_info);
+ INIT_LIST_HEAD(&found->block_groups);
+ init_rwsem(&found->groups_sem);
+ spin_lock_init(&found->lock);
+@@ -1933,11 +1818,9 @@
+ found->bytes_pinned = 0;
+ found->bytes_reserved = 0;
+ found->bytes_readonly = 0;
+- found->bytes_delalloc = 0;
+ found->full = 0;
+ found->force_alloc = 0;
+ *space_info = found;
+- list_add_rcu(&found->list, &info->space_info);
+ return 0;
+ }
+
+@@ -1998,233 +1881,6 @@
+ return flags;
+ }
+
+-static u64 btrfs_get_alloc_profile(struct btrfs_root *root, u64 data)
+-{
+- struct btrfs_fs_info *info = root->fs_info;
+- u64 alloc_profile;
+-
+- if (data) {
+- alloc_profile = info->avail_data_alloc_bits &
+- info->data_alloc_profile;
+- data = BTRFS_BLOCK_GROUP_DATA | alloc_profile;
+- } else if (root == root->fs_info->chunk_root) {
+- alloc_profile = info->avail_system_alloc_bits &
+- info->system_alloc_profile;
+- data = BTRFS_BLOCK_GROUP_SYSTEM | alloc_profile;
+- } else {
+- alloc_profile = info->avail_metadata_alloc_bits &
+- info->metadata_alloc_profile;
+- data = BTRFS_BLOCK_GROUP_METADATA | alloc_profile;
+- }
+-
+- return btrfs_reduce_alloc_profile(root, data);
+-}
+-
+-void btrfs_set_inode_space_info(struct btrfs_root *root, struct inode *inode)
+-{
+- u64 alloc_target;
+-
+- alloc_target = btrfs_get_alloc_profile(root, 1);
+- BTRFS_I(inode)->space_info = __find_space_info(root->fs_info,
+- alloc_target);
+-}
+-
+-/*
+- * for now this just makes sure we have at least 5% of our metadata space free
+- * for use.
+- */
+-int btrfs_check_metadata_free_space(struct btrfs_root *root)
+-{
+- struct btrfs_fs_info *info = root->fs_info;
+- struct btrfs_space_info *meta_sinfo;
+- u64 alloc_target, thresh;
+- int committed = 0, ret;
+-
+- /* get the space info for where the metadata will live */
+- alloc_target = btrfs_get_alloc_profile(root, 0);
+- meta_sinfo = __find_space_info(info, alloc_target);
+-
+-again:
+- spin_lock(&meta_sinfo->lock);
+- if (!meta_sinfo->full)
+- thresh = meta_sinfo->total_bytes * 80;
+- else
+- thresh = meta_sinfo->total_bytes * 95;
+-
+- do_div(thresh, 100);
+-
+- if (meta_sinfo->bytes_used + meta_sinfo->bytes_reserved +
+- meta_sinfo->bytes_pinned + meta_sinfo->bytes_readonly > thresh) {
+- struct btrfs_trans_handle *trans;
+- if (!meta_sinfo->full) {
+- meta_sinfo->force_alloc = 1;
+- spin_unlock(&meta_sinfo->lock);
+-
+- trans = btrfs_start_transaction(root, 1);
+- if (!trans)
+- return -ENOMEM;
+-
+- ret = do_chunk_alloc(trans, root->fs_info->extent_root,
+- 2 * 1024 * 1024, alloc_target, 0);
+- btrfs_end_transaction(trans, root);
+- goto again;
+- }
+- spin_unlock(&meta_sinfo->lock);
+-
+- if (!committed) {
+- committed = 1;
+- trans = btrfs_join_transaction(root, 1);
+- if (!trans)
+- return -ENOMEM;
+- ret = btrfs_commit_transaction(trans, root);
+- if (ret)
+- return ret;
+- goto again;
+- }
+- return -ENOSPC;
+- }
+- spin_unlock(&meta_sinfo->lock);
+-
+- return 0;
+-}
+-
+-/*
+- * This will check the space that the inode allocates from to make sure we have
+- * enough space for bytes.
+- */
+-int btrfs_check_data_free_space(struct btrfs_root *root, struct inode *inode,
+- u64 bytes)
+-{
+- struct btrfs_space_info *data_sinfo;
+- int ret = 0, committed = 0;
+-
+- /* make sure bytes are sectorsize aligned */
+- bytes = (bytes + root->sectorsize - 1) & ~((u64)root->sectorsize - 1);
+-
+- data_sinfo = BTRFS_I(inode)->space_info;
+-again:
+- /* make sure we have enough space to handle the data first */
+- spin_lock(&data_sinfo->lock);
+- if (data_sinfo->total_bytes - data_sinfo->bytes_used -
+- data_sinfo->bytes_delalloc - data_sinfo->bytes_reserved -
+- data_sinfo->bytes_pinned - data_sinfo->bytes_readonly -
+- data_sinfo->bytes_may_use < bytes) {
+- struct btrfs_trans_handle *trans;
+-
+- /*
+- * if we don't have enough free bytes in this space then we need
+- * to alloc a new chunk.
+- */
+- if (!data_sinfo->full) {
+- u64 alloc_target;
+-
+- data_sinfo->force_alloc = 1;
+- spin_unlock(&data_sinfo->lock);
+-
+- alloc_target = btrfs_get_alloc_profile(root, 1);
+- trans = btrfs_start_transaction(root, 1);
+- if (!trans)
+- return -ENOMEM;
+-
+- ret = do_chunk_alloc(trans, root->fs_info->extent_root,
+- bytes + 2 * 1024 * 1024,
+- alloc_target, 0);
+- btrfs_end_transaction(trans, root);
+- if (ret)
+- return ret;
+- goto again;
+- }
+- spin_unlock(&data_sinfo->lock);
+-
+- /* commit the current transaction and try again */
+- if (!committed) {
+- committed = 1;
+- trans = btrfs_join_transaction(root, 1);
+- if (!trans)
+- return -ENOMEM;
+- ret = btrfs_commit_transaction(trans, root);
+- if (ret)
+- return ret;
+- goto again;
+- }
+-
+- printk(KERN_ERR "no space left, need %llu, %llu delalloc bytes"
+- ", %llu bytes_used, %llu bytes_reserved, "
+- "%llu bytes_pinned, %llu bytes_readonly, %llu may use"
+- "%llu total\n", bytes, data_sinfo->bytes_delalloc,
+- data_sinfo->bytes_used, data_sinfo->bytes_reserved,
+- data_sinfo->bytes_pinned, data_sinfo->bytes_readonly,
+- data_sinfo->bytes_may_use, data_sinfo->total_bytes);
+- return -ENOSPC;
+- }
+- data_sinfo->bytes_may_use += bytes;
+- BTRFS_I(inode)->reserved_bytes += bytes;
+- spin_unlock(&data_sinfo->lock);
+-
+- return btrfs_check_metadata_free_space(root);
+-}
+-
+-/*
+- * if there was an error for whatever reason after calling
+- * btrfs_check_data_free_space, call this so we can cleanup the counters.
+- */
+-void btrfs_free_reserved_data_space(struct btrfs_root *root,
+- struct inode *inode, u64 bytes)
+-{
+- struct btrfs_space_info *data_sinfo;
+-
+- /* make sure bytes are sectorsize aligned */
+- bytes = (bytes + root->sectorsize - 1) & ~((u64)root->sectorsize - 1);
+-
+- data_sinfo = BTRFS_I(inode)->space_info;
+- spin_lock(&data_sinfo->lock);
+- data_sinfo->bytes_may_use -= bytes;
+- BTRFS_I(inode)->reserved_bytes -= bytes;
+- spin_unlock(&data_sinfo->lock);
+-}
+-
+-/* called when we are adding a delalloc extent to the inode's io_tree */
+-void btrfs_delalloc_reserve_space(struct btrfs_root *root, struct inode *inode,
+- u64 bytes)
+-{
+- struct btrfs_space_info *data_sinfo;
+-
+- /* get the space info for where this inode will be storing its data */
+- data_sinfo = BTRFS_I(inode)->space_info;
+-
+- /* make sure we have enough space to handle the data first */
+- spin_lock(&data_sinfo->lock);
+- data_sinfo->bytes_delalloc += bytes;
+-
+- /*
+- * we are adding a delalloc extent without calling
+- * btrfs_check_data_free_space first. This happens on a weird
+- * writepage condition, but shouldn't hurt our accounting
+- */
+- if (unlikely(bytes > BTRFS_I(inode)->reserved_bytes)) {
+- data_sinfo->bytes_may_use -= BTRFS_I(inode)->reserved_bytes;
+- BTRFS_I(inode)->reserved_bytes = 0;
+- } else {
+- data_sinfo->bytes_may_use -= bytes;
+- BTRFS_I(inode)->reserved_bytes -= bytes;
+- }
+-
+- spin_unlock(&data_sinfo->lock);
+-}
+-
+-/* called when we are clearing an delalloc extent from the inode's io_tree */
+-void btrfs_delalloc_free_space(struct btrfs_root *root, struct inode *inode,
+- u64 bytes)
+-{
+- struct btrfs_space_info *info;
+-
+- info = BTRFS_I(inode)->space_info;
+-
+- spin_lock(&info->lock);
+- info->bytes_delalloc -= bytes;
+- spin_unlock(&info->lock);
+-}
+-
+ static int do_chunk_alloc(struct btrfs_trans_handle *trans,
+ struct btrfs_root *extent_root, u64 alloc_bytes,
+ u64 flags, int force)
+@@ -2481,12 +2137,13 @@
+ u64 end;
+ u64 priv;
+ u64 search = 0;
++ u64 skipped = 0;
+ struct btrfs_fs_info *info = extent_root->fs_info;
+ struct btrfs_path *path;
+ struct pending_extent_op *extent_op, *tmp;
+ struct list_head insert_list, update_list;
+ int ret;
+- int num_inserts = 0, max_inserts, restart = 0;
++ int num_inserts = 0, max_inserts;
+
+ path = btrfs_alloc_path();
+ INIT_LIST_HEAD(&insert_list);
+@@ -2502,19 +2159,18 @@
+ ret = find_first_extent_bit(&info->extent_ins, search, &start,
+ &end, EXTENT_WRITEBACK);
+ if (ret) {
+- if (restart && !num_inserts &&
+- list_empty(&update_list)) {
+- restart = 0;
++ if (skipped && all && !num_inserts) {
++ skipped = 0;
+ search = 0;
+ continue;
+ }
++ mutex_unlock(&info->extent_ins_mutex);
+ break;
+ }
+
+ ret = try_lock_extent(&info->extent_ins, start, end, GFP_NOFS);
+ if (!ret) {
+- if (all)
+- restart = 1;
++ skipped = 1;
+ search = end + 1;
+ if (need_resched()) {
+ mutex_unlock(&info->extent_ins_mutex);
+@@ -2533,7 +2189,7 @@
+ list_add_tail(&extent_op->list, &insert_list);
+ search = end + 1;
+ if (num_inserts == max_inserts) {
+- restart = 1;
++ mutex_unlock(&info->extent_ins_mutex);
+ break;
+ }
+ } else if (extent_op->type == PENDING_BACKREF_UPDATE) {
+@@ -2549,6 +2205,7 @@
+ * somebody marked this thing for deletion then just unlock it and be
+ * done, the free_extents will handle it
+ */
++ mutex_lock(&info->extent_ins_mutex);
+ list_for_each_entry_safe(extent_op, tmp, &update_list, list) {
+ clear_extent_bits(&info->extent_ins, extent_op->bytenr,
+ extent_op->bytenr + extent_op->num_bytes - 1,
+@@ -2570,10 +2227,6 @@
+ if (!list_empty(&update_list)) {
+ ret = update_backrefs(trans, extent_root, path, &update_list);
+ BUG_ON(ret);
+-
+- /* we may have COW'ed new blocks, so lets start over */
+- if (all)
+- restart = 1;
+ }
+
+ /*
+@@ -2581,9 +2234,9 @@
+ * need to make sure everything is cleaned then reset everything and
+ * go back to the beginning
+ */
+- if (!num_inserts && restart) {
++ if (!num_inserts && all && skipped) {
+ search = 0;
+- restart = 0;
++ skipped = 0;
+ INIT_LIST_HEAD(&update_list);
+ INIT_LIST_HEAD(&insert_list);
+ goto again;
+@@ -2640,19 +2293,27 @@
+ BUG_ON(ret);
+
+ /*
+- * if restart is set for whatever reason we need to go back and start
+- * searching through the pending list again.
+- *
+- * We just inserted some extents, which could have resulted in new
+- * blocks being allocated, which would result in new blocks needing
+- * updates, so if all is set we _must_ restart to get the updated
+- * blocks.
++ * if we broke out of the loop in order to insert stuff because we hit
++ * the maximum number of inserts at a time we can handle, then loop
++ * back and pick up where we left off
+ */
+- if (restart || all) {
++ if (num_inserts == max_inserts) {
++ INIT_LIST_HEAD(&insert_list);
++ INIT_LIST_HEAD(&update_list);
++ num_inserts = 0;
++ goto again;
++ }
++
++ /*
++ * again, if we need to make absolutely sure there are no more pending
++ * extent operations left and we know that we skipped some, go back to
++ * the beginning and do it all again
++ */
++ if (all && skipped) {
+ INIT_LIST_HEAD(&insert_list);
+ INIT_LIST_HEAD(&update_list);
+ search = 0;
+- restart = 0;
++ skipped = 0;
+ num_inserts = 0;
+ goto again;
+ }
+@@ -2886,7 +2547,6 @@
+ if (ret) {
+ if (all && skipped && !nr) {
+ search = 0;
+- skipped = 0;
+ continue;
+ }
+ mutex_unlock(&info->extent_ins_mutex);
+@@ -2973,8 +2633,6 @@
+ goto again;
+ }
+
+- if (!err)
+- finish_current_insert(trans, extent_root, 0);
+ return err;
+ }
+
+@@ -3042,9 +2700,13 @@
+ /* if metadata always pin */
+ if (owner_objectid < BTRFS_FIRST_FREE_OBJECTID) {
+ if (root->root_key.objectid == BTRFS_TREE_LOG_OBJECTID) {
+- mutex_lock(&root->fs_info->pinned_mutex);
+- btrfs_update_pinned_extents(root, bytenr, num_bytes, 1);
+- mutex_unlock(&root->fs_info->pinned_mutex);
++ struct btrfs_block_group_cache *cache;
++
++ /* btrfs_free_reserved_extent */
++ cache = btrfs_lookup_block_group(root->fs_info, bytenr);
++ BUG_ON(!cache);
++ btrfs_add_free_space(cache, bytenr, num_bytes);
++ put_block_group(cache);
+ update_reserved_extents(root, bytenr, num_bytes, 0);
+ return 0;
+ }
+@@ -3125,8 +2787,7 @@
+
+ if (data & BTRFS_BLOCK_GROUP_METADATA) {
+ last_ptr = &root->fs_info->last_alloc;
+- if (!btrfs_test_opt(root, SSD))
+- empty_cluster = 64 * 1024;
++ empty_cluster = 64 * 1024;
+ }
+
+ if ((data & BTRFS_BLOCK_GROUP_DATA) && btrfs_test_opt(root, SSD))
+@@ -3353,18 +3014,16 @@
+ static void dump_space_info(struct btrfs_space_info *info, u64 bytes)
+ {
+ struct btrfs_block_group_cache *cache;
++ struct list_head *l;
+
+ printk(KERN_INFO "space_info has %llu free, is %sfull\n",
+ (unsigned long long)(info->total_bytes - info->bytes_used -
+ info->bytes_pinned - info->bytes_reserved),
+ (info->full) ? "" : "not ");
+- printk(KERN_INFO "space_info total=%llu, pinned=%llu, delalloc=%llu,"
+- " may_use=%llu, used=%llu\n", info->total_bytes,
+- info->bytes_pinned, info->bytes_delalloc, info->bytes_may_use,
+- info->bytes_used);
+
+ down_read(&info->groups_sem);
+- list_for_each_entry(cache, &info->block_groups, list) {
++ list_for_each(l, &info->block_groups) {
++ cache = list_entry(l, struct btrfs_block_group_cache, list);
+ spin_lock(&cache->lock);
+ printk(KERN_INFO "block group %llu has %llu bytes, %llu used "
+ "%llu pinned %llu reserved\n",
+@@ -3388,10 +3047,24 @@
+ {
+ int ret;
+ u64 search_start = 0;
++ u64 alloc_profile;
+ struct btrfs_fs_info *info = root->fs_info;
+
+- data = btrfs_get_alloc_profile(root, data);
++ if (data) {
++ alloc_profile = info->avail_data_alloc_bits &
++ info->data_alloc_profile;
++ data = BTRFS_BLOCK_GROUP_DATA | alloc_profile;
++ } else if (root == root->fs_info->chunk_root) {
++ alloc_profile = info->avail_system_alloc_bits &
++ info->system_alloc_profile;
++ data = BTRFS_BLOCK_GROUP_SYSTEM | alloc_profile;
++ } else {
++ alloc_profile = info->avail_metadata_alloc_bits &
++ info->metadata_alloc_profile;
++ data = BTRFS_BLOCK_GROUP_METADATA | alloc_profile;
++ }
+ again:
++ data = btrfs_reduce_alloc_profile(root, data);
+ /*
+ * the only place that sets empty_size is btrfs_realloc_node, which
+ * is not called recursively on allocations
+@@ -3659,8 +3332,7 @@
+
+ struct extent_buffer *btrfs_init_new_buffer(struct btrfs_trans_handle *trans,
+ struct btrfs_root *root,
+- u64 bytenr, u32 blocksize,
+- int level)
++ u64 bytenr, u32 blocksize)
+ {
+ struct extent_buffer *buf;
+
+@@ -3668,13 +3340,9 @@
+ if (!buf)
+ return ERR_PTR(-ENOMEM);
+ btrfs_set_header_generation(buf, trans->transid);
+- btrfs_set_buffer_lockdep_class(buf, level);
+ btrfs_tree_lock(buf);
+ clean_tree_block(trans, root, buf);
+-
+- btrfs_set_lock_blocking(buf);
+ btrfs_set_buffer_uptodate(buf);
+-
+ if (root->root_key.objectid == BTRFS_TREE_LOG_OBJECTID) {
+ set_extent_dirty(&root->dirty_log_pages, buf->start,
+ buf->start + buf->len - 1, GFP_NOFS);
+@@ -3683,7 +3351,6 @@
+ buf->start + buf->len - 1, GFP_NOFS);
+ }
+ trans->blocks_used++;
+- /* this returns a buffer locked for blocking */
+ return buf;
+ }
+
+@@ -3712,8 +3379,7 @@
+ return ERR_PTR(ret);
+ }
+
+- buf = btrfs_init_new_buffer(trans, root, ins.objectid,
+- blocksize, level);
++ buf = btrfs_init_new_buffer(trans, root, ins.objectid, blocksize);
+ return buf;
+ }
+
+@@ -3722,73 +3388,36 @@
+ {
+ u64 leaf_owner;
+ u64 leaf_generation;
+- struct refsort *sorted;
+ struct btrfs_key key;
+ struct btrfs_file_extent_item *fi;
+ int i;
+ int nritems;
+ int ret;
+- int refi = 0;
+- int slot;
+
+ BUG_ON(!btrfs_is_leaf(leaf));
+ nritems = btrfs_header_nritems(leaf);
+ leaf_owner = btrfs_header_owner(leaf);
+ leaf_generation = btrfs_header_generation(leaf);
+
+- sorted = kmalloc(sizeof(*sorted) * nritems, GFP_NOFS);
+- /* we do this loop twice. The first time we build a list
+- * of the extents we have a reference on, then we sort the list
+- * by bytenr. The second time around we actually do the
+- * extent freeing.
+- */
+ for (i = 0; i < nritems; i++) {
+ u64 disk_bytenr;
+ cond_resched();
+
+ btrfs_item_key_to_cpu(leaf, &key, i);
+-
+- /* only extents have references, skip everything else */
+ if (btrfs_key_type(&key) != BTRFS_EXTENT_DATA_KEY)
+ continue;
+-
+ fi = btrfs_item_ptr(leaf, i, struct btrfs_file_extent_item);
+-
+- /* inline extents live in the btree, they don't have refs */
+ if (btrfs_file_extent_type(leaf, fi) ==
+ BTRFS_FILE_EXTENT_INLINE)
+ continue;
+-
++ /*
++ * FIXME make sure to insert a trans record that
++ * repeats the snapshot del on crash
++ */
+ disk_bytenr = btrfs_file_extent_disk_bytenr(leaf, fi);
+-
+- /* holes don't have refs */
+ if (disk_bytenr == 0)
+ continue;
+
+- sorted[refi].bytenr = disk_bytenr;
+- sorted[refi].slot = i;
+- refi++;
+- }
+-
+- if (refi == 0)
+- goto out;
+-
+- sort(sorted, refi, sizeof(struct refsort), refsort_cmp, NULL);
+-
+- for (i = 0; i < refi; i++) {
+- u64 disk_bytenr;
+-
+- disk_bytenr = sorted[i].bytenr;
+- slot = sorted[i].slot;
+-
+- cond_resched();
+-
+- btrfs_item_key_to_cpu(leaf, &key, slot);
+- if (btrfs_key_type(&key) != BTRFS_EXTENT_DATA_KEY)
+- continue;
+-
+- fi = btrfs_item_ptr(leaf, slot, struct btrfs_file_extent_item);
+-
+ ret = __btrfs_free_extent(trans, root, disk_bytenr,
+ btrfs_file_extent_disk_num_bytes(leaf, fi),
+ leaf->start, leaf_owner, leaf_generation,
+@@ -3799,8 +3428,6 @@
+ wake_up(&root->fs_info->transaction_throttle);
+ cond_resched();
+ }
+-out:
+- kfree(sorted);
+ return 0;
+ }
+
+@@ -3810,25 +3437,9 @@
+ {
+ int i;
+ int ret;
+- struct btrfs_extent_info *info;
+- struct refsort *sorted;
+-
+- if (ref->nritems == 0)
+- return 0;
++ struct btrfs_extent_info *info = ref->extents;
+
+- sorted = kmalloc(sizeof(*sorted) * ref->nritems, GFP_NOFS);
+ for (i = 0; i < ref->nritems; i++) {
+- sorted[i].bytenr = ref->extents[i].bytenr;
+- sorted[i].slot = i;
+- }
+- sort(sorted, ref->nritems, sizeof(struct refsort), refsort_cmp, NULL);
+-
+- /*
+- * the items in the ref were sorted when the ref was inserted
+- * into the ref cache, so this is already in order
+- */
+- for (i = 0; i < ref->nritems; i++) {
+- info = ref->extents + sorted[i].slot;
+ ret = __btrfs_free_extent(trans, root, info->bytenr,
+ info->num_bytes, ref->bytenr,
+ ref->owner, ref->generation,
+@@ -3842,7 +3453,6 @@
+ info++;
+ }
+
+- kfree(sorted);
+ return 0;
+ }
+
+@@ -3887,152 +3497,6 @@
+ }
+
+ /*
+- * this is used while deleting old snapshots, and it drops the refs
+- * on a whole subtree starting from a level 1 node.
+- *
+- * The idea is to sort all the leaf pointers, and then drop the
+- * ref on all the leaves in order. Most of the time the leaves
+- * will have ref cache entries, so no leaf IOs will be required to
+- * find the extents they have references on.
+- *
+- * For each leaf, any references it has are also dropped in order
+- *
+- * This ends up dropping the references in something close to optimal
+- * order for reading and modifying the extent allocation tree.
+- */
+-static noinline int drop_level_one_refs(struct btrfs_trans_handle *trans,
+- struct btrfs_root *root,
+- struct btrfs_path *path)
+-{
+- u64 bytenr;
+- u64 root_owner;
+- u64 root_gen;
+- struct extent_buffer *eb = path->nodes[1];
+- struct extent_buffer *leaf;
+- struct btrfs_leaf_ref *ref;
+- struct refsort *sorted = NULL;
+- int nritems = btrfs_header_nritems(eb);
+- int ret;
+- int i;
+- int refi = 0;
+- int slot = path->slots[1];
+- u32 blocksize = btrfs_level_size(root, 0);
+- u32 refs;
+-
+- if (nritems == 0)
+- goto out;
+-
+- root_owner = btrfs_header_owner(eb);
+- root_gen = btrfs_header_generation(eb);
+- sorted = kmalloc(sizeof(*sorted) * nritems, GFP_NOFS);
+-
+- /*
+- * step one, sort all the leaf pointers so we don't scribble
+- * randomly into the extent allocation tree
+- */
+- for (i = slot; i < nritems; i++) {
+- sorted[refi].bytenr = btrfs_node_blockptr(eb, i);
+- sorted[refi].slot = i;
+- refi++;
+- }
+-
+- /*
+- * nritems won't be zero, but if we're picking up drop_snapshot
+- * after a crash, slot might be > 0, so double check things
+- * just in case.
+- */
+- if (refi == 0)
+- goto out;
+-
+- sort(sorted, refi, sizeof(struct refsort), refsort_cmp, NULL);
+-
+- /*
+- * the first loop frees everything the leaves point to
+- */
+- for (i = 0; i < refi; i++) {
+- u64 ptr_gen;
+-
+- bytenr = sorted[i].bytenr;
+-
+- /*
+- * check the reference count on this leaf. If it is > 1
+- * we just decrement it below and don't update any
+- * of the refs the leaf points to.
+- */
+- ret = drop_snap_lookup_refcount(root, bytenr, blocksize, &refs);
+- BUG_ON(ret);
+- if (refs != 1)
+- continue;
+-
+- ptr_gen = btrfs_node_ptr_generation(eb, sorted[i].slot);
+-
+- /*
+- * the leaf only had one reference, which means the
+- * only thing pointing to this leaf is the snapshot
+- * we're deleting. It isn't possible for the reference
+- * count to increase again later
+- *
+- * The reference cache is checked for the leaf,
+- * and if found we'll be able to drop any refs held by
+- * the leaf without needing to read it in.
+- */
+- ref = btrfs_lookup_leaf_ref(root, bytenr);
+- if (ref && ref->generation != ptr_gen) {
+- btrfs_free_leaf_ref(root, ref);
+- ref = NULL;
+- }
+- if (ref) {
+- ret = cache_drop_leaf_ref(trans, root, ref);
+- BUG_ON(ret);
+- btrfs_remove_leaf_ref(root, ref);
+- btrfs_free_leaf_ref(root, ref);
+- } else {
+- /*
+- * the leaf wasn't in the reference cache, so
+- * we have to read it.
+- */
+- leaf = read_tree_block(root, bytenr, blocksize,
+- ptr_gen);
+- ret = btrfs_drop_leaf_ref(trans, root, leaf);
+- BUG_ON(ret);
+- free_extent_buffer(leaf);
+- }
+- atomic_inc(&root->fs_info->throttle_gen);
+- wake_up(&root->fs_info->transaction_throttle);
+- cond_resched();
+- }
+-
+- /*
+- * run through the loop again to free the refs on the leaves.
+- * This is faster than doing it in the loop above because
+- * the leaves are likely to be clustered together. We end up
+- * working in nice chunks on the extent allocation tree.
+- */
+- for (i = 0; i < refi; i++) {
+- bytenr = sorted[i].bytenr;
+- ret = __btrfs_free_extent(trans, root, bytenr,
+- blocksize, eb->start,
+- root_owner, root_gen, 0, 1);
+- BUG_ON(ret);
+-
+- atomic_inc(&root->fs_info->throttle_gen);
+- wake_up(&root->fs_info->transaction_throttle);
+- cond_resched();
+- }
+-out:
+- kfree(sorted);
+-
+- /*
+- * update the path to show we've processed the entire level 1
+- * node. This will get saved into the root's drop_snapshot_progress
+- * field so these drops are not repeated again if this transaction
+- * commits.
+- */
+- path->slots[1] = nritems;
+- return 0;
+-}
+-
+-/*
+ * helper function for drop_snapshot, this walks down the tree dropping ref
+ * counts as it goes.
+ */
+@@ -4047,6 +3511,7 @@
+ struct extent_buffer *next;
+ struct extent_buffer *cur;
+ struct extent_buffer *parent;
++ struct btrfs_leaf_ref *ref;
+ u32 blocksize;
+ int ret;
+ u32 refs;
+@@ -4073,46 +3538,17 @@
+ if (path->slots[*level] >=
+ btrfs_header_nritems(cur))
+ break;
+-
+- /* the new code goes down to level 1 and does all the
+- * leaves pointed to that node in bulk. So, this check
+- * for level 0 will always be false.
+- *
+- * But, the disk format allows the drop_snapshot_progress
+- * field in the root to leave things in a state where
+- * a leaf will need cleaning up here. If someone crashes
+- * with the old code and then boots with the new code,
+- * we might find a leaf here.
+- */
+ if (*level == 0) {
+ ret = btrfs_drop_leaf_ref(trans, root, cur);
+ BUG_ON(ret);
+ break;
+ }
+-
+- /*
+- * once we get to level one, process the whole node
+- * at once, including everything below it.
+- */
+- if (*level == 1) {
+- ret = drop_level_one_refs(trans, root, path);
+- BUG_ON(ret);
+- break;
+- }
+-
+ bytenr = btrfs_node_blockptr(cur, path->slots[*level]);
+ ptr_gen = btrfs_node_ptr_generation(cur, path->slots[*level]);
+ blocksize = btrfs_level_size(root, *level - 1);
+
+ ret = drop_snap_lookup_refcount(root, bytenr, blocksize, &refs);
+ BUG_ON(ret);
+-
+- /*
+- * if there is more than one reference, we don't need
+- * to read that node to drop any references it has. We
+- * just drop the ref we hold on that node and move on to the
+- * next slot in this level.
+- */
+ if (refs != 1) {
+ parent = path->nodes[*level];
+ root_owner = btrfs_header_owner(parent);
+@@ -4131,12 +3567,46 @@
+
+ continue;
+ }
+-
+ /*
+- * we need to keep freeing things in the next level down.
+- * read the block and loop around to process it
++ * at this point, we have a single ref, and since the
++ * only place referencing this extent is a dead root
++ * the reference count should never go higher.
++ * So, we don't need to check it again
+ */
+- next = read_tree_block(root, bytenr, blocksize, ptr_gen);
++ if (*level == 1) {
++ ref = btrfs_lookup_leaf_ref(root, bytenr);
++ if (ref && ref->generation != ptr_gen) {
++ btrfs_free_leaf_ref(root, ref);
++ ref = NULL;
++ }
++ if (ref) {
++ ret = cache_drop_leaf_ref(trans, root, ref);
++ BUG_ON(ret);
++ btrfs_remove_leaf_ref(root, ref);
++ btrfs_free_leaf_ref(root, ref);
++ *level = 0;
++ break;
++ }
++ }
++ next = btrfs_find_tree_block(root, bytenr, blocksize);
++ if (!next || !btrfs_buffer_uptodate(next, ptr_gen)) {
++ free_extent_buffer(next);
++
++ next = read_tree_block(root, bytenr, blocksize,
++ ptr_gen);
++ cond_resched();
++#if 0
++ /*
++ * this is a debugging check and can go away
++ * the ref should never go all the way down to 1
++ * at this point
++ */
++ ret = lookup_extent_ref(NULL, root, bytenr, blocksize,
++ &refs);
++ BUG_ON(ret);
++ WARN_ON(refs != 1);
++#endif
++ }
+ WARN_ON(*level <= 0);
+ if (path->nodes[*level-1])
+ free_extent_buffer(path->nodes[*level-1]);
+@@ -4161,16 +3631,11 @@
+ root_owner = btrfs_header_owner(parent);
+ root_gen = btrfs_header_generation(parent);
+
+- /*
+- * cleanup and free the reference on the last node
+- * we processed
+- */
+ ret = __btrfs_free_extent(trans, root, bytenr, blocksize,
+ parent->start, root_owner, root_gen,
+ *level, 1);
+ free_extent_buffer(path->nodes[*level]);
+ path->nodes[*level] = NULL;
+-
+ *level += 1;
+ BUG_ON(ret);
+
+@@ -4222,7 +3687,6 @@
+
+ next = read_tree_block(root, bytenr, blocksize, ptr_gen);
+ btrfs_tree_lock(next);
+- btrfs_set_lock_blocking(next);
+
+ ret = btrfs_lookup_extent_ref(trans, root, bytenr, blocksize,
+ &refs);
+@@ -4290,13 +3754,6 @@
+ if (slot < btrfs_header_nritems(path->nodes[i]) - 1) {
+ struct extent_buffer *node;
+ struct btrfs_disk_key disk_key;
+-
+- /*
+- * there is more work to do in this level.
+- * Update the drop_progress marker to reflect
+- * the work we've done so far, and then bump
+- * the slot number
+- */
+ node = path->nodes[i];
+ path->slots[i]++;
+ *level = i;
+@@ -4308,11 +3765,6 @@
+ return 0;
+ } else {
+ struct extent_buffer *parent;
+-
+- /*
+- * this whole node is done, free our reference
+- * on it and go up one level
+- */
+ if (path->nodes[*level] == root->node)
+ parent = path->nodes[*level];
+ else
+@@ -4439,13 +3891,13 @@
+ path = btrfs_alloc_path();
+ BUG_ON(!path);
+
+- btrfs_assert_tree_locked(parent);
++ BUG_ON(!btrfs_tree_locked(parent));
+ parent_level = btrfs_header_level(parent);
+ extent_buffer_get(parent);
+ path->nodes[parent_level] = parent;
+ path->slots[parent_level] = btrfs_header_nritems(parent);
+
+- btrfs_assert_tree_locked(node);
++ BUG_ON(!btrfs_tree_locked(node));
+ level = btrfs_header_level(node);
+ extent_buffer_get(node);
+ path->nodes[level] = node;
+@@ -4992,7 +4444,7 @@
+ u64 lock_end = 0;
+ u64 num_bytes;
+ u64 ext_offset;
+- u64 search_end = (u64)-1;
++ u64 first_pos;
+ u32 nritems;
+ int nr_scaned = 0;
+ int extent_locked = 0;
+@@ -5000,6 +4452,7 @@
+ int ret;
+
+ memcpy(&key, leaf_key, sizeof(key));
++ first_pos = INT_LIMIT(loff_t) - extent_key->offset;
+ if (ref_path->owner_objectid != BTRFS_MULTIPLE_OBJECTIDS) {
+ if (key.objectid < ref_path->owner_objectid ||
+ (key.objectid == ref_path->owner_objectid &&
+@@ -5048,7 +4501,7 @@
+ if ((key.objectid > ref_path->owner_objectid) ||
+ (key.objectid == ref_path->owner_objectid &&
+ key.type > BTRFS_EXTENT_DATA_KEY) ||
+- key.offset >= search_end)
++ (key.offset >= first_pos + extent_key->offset))
+ break;
+ }
+
+@@ -5081,10 +4534,8 @@
+ num_bytes = btrfs_file_extent_num_bytes(leaf, fi);
+ ext_offset = btrfs_file_extent_offset(leaf, fi);
+
+- if (search_end == (u64)-1) {
+- search_end = key.offset - ext_offset +
+- btrfs_file_extent_ram_bytes(leaf, fi);
+- }
++ if (first_pos > key.offset - ext_offset)
++ first_pos = key.offset - ext_offset;
+
+ if (!extent_locked) {
+ lock_start = key.offset;
+@@ -5273,7 +4724,7 @@
+ }
+ skip:
+ if (ref_path->owner_objectid != BTRFS_MULTIPLE_OBJECTIDS &&
+- key.offset >= search_end)
++ key.offset >= first_pos + extent_key->offset)
+ break;
+
+ cond_resched();
+@@ -5327,7 +4778,6 @@
+ ref->bytenr = buf->start;
+ ref->owner = btrfs_header_owner(buf);
+ ref->generation = btrfs_header_generation(buf);
+-
+ ret = btrfs_add_leaf_ref(root, ref, 0);
+ WARN_ON(ret);
+ btrfs_free_leaf_ref(root, ref);
+@@ -5901,9 +5351,7 @@
+ prev_block = block_start;
+ }
+
+- mutex_lock(&extent_root->fs_info->trans_mutex);
+ btrfs_record_root_in_trans(found_root);
+- mutex_unlock(&extent_root->fs_info->trans_mutex);
+ if (ref_path->owner_objectid >= BTRFS_FIRST_FREE_OBJECTID) {
+ /*
+ * try to update data extent references while
+@@ -6341,7 +5789,6 @@
+ int btrfs_free_block_groups(struct btrfs_fs_info *info)
+ {
+ struct btrfs_block_group_cache *block_group;
+- struct btrfs_space_info *space_info;
+ struct rb_node *n;
+
+ spin_lock(&info->block_group_cache_lock);
+@@ -6363,23 +5810,6 @@
+ spin_lock(&info->block_group_cache_lock);
+ }
+ spin_unlock(&info->block_group_cache_lock);
+-
+- /* now that all the block groups are freed, go through and
+- * free all the space_info structs. This is only called during
+- * the final stages of unmount, and so we know nobody is
+- * using them. We call synchronize_rcu() once before we start,
+- * just to be on the safe side.
+- */
+- synchronize_rcu();
+-
+- while(!list_empty(&info->space_info)) {
+- space_info = list_entry(info->space_info.next,
+- struct btrfs_space_info,
+- list);
+-
+- list_del(&space_info->list);
+- kfree(space_info);
+- }
+ return 0;
+ }
+
+@@ -6527,11 +5957,9 @@
+ path = btrfs_alloc_path();
+ BUG_ON(!path);
+
+- spin_lock(&root->fs_info->block_group_cache_lock);
++ btrfs_remove_free_space_cache(block_group);
+ rb_erase(&block_group->cache_node,
+ &root->fs_info->block_group_cache_tree);
+- spin_unlock(&root->fs_info->block_group_cache_lock);
+- btrfs_remove_free_space_cache(block_group);
+ down_write(&block_group->space_info->groups_sem);
+ list_del(&block_group->list);
+ up_write(&block_group->space_info->groups_sem);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/file.c linux-2.6.29-rc3.owrt/fs/btrfs/file.c
+--- linux-2.6.29.owrt/fs/btrfs/file.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/file.c 2009-05-10 23:48:29.000000000 +0200
+@@ -29,6 +29,7 @@
+ #include <linux/writeback.h>
+ #include <linux/statfs.h>
+ #include <linux/compat.h>
++#include <linux/version.h>
+ #include "ctree.h"
+ #include "disk-io.h"
+ #include "transaction.h"
+@@ -1091,24 +1092,19 @@
+ WARN_ON(num_pages > nrptrs);
+ memset(pages, 0, sizeof(struct page *) * nrptrs);
+
+- ret = btrfs_check_data_free_space(root, inode, write_bytes);
++ ret = btrfs_check_free_space(root, write_bytes, 0);
+ if (ret)
+ goto out;
+
+ ret = prepare_pages(root, file, pages, num_pages,
+ pos, first_index, last_index,
+ write_bytes);
+- if (ret) {
+- btrfs_free_reserved_data_space(root, inode,
+- write_bytes);
++ if (ret)
+ goto out;
+- }
+
+ ret = btrfs_copy_from_user(pos, num_pages,
+ write_bytes, pages, buf);
+ if (ret) {
+- btrfs_free_reserved_data_space(root, inode,
+- write_bytes);
+ btrfs_drop_pages(pages, num_pages);
+ goto out;
+ }
+@@ -1116,11 +1112,8 @@
+ ret = dirty_and_release_pages(NULL, root, file, pages,
+ num_pages, pos, write_bytes);
+ btrfs_drop_pages(pages, num_pages);
+- if (ret) {
+- btrfs_free_reserved_data_space(root, inode,
+- write_bytes);
++ if (ret)
+ goto out;
+- }
+
+ if (will_write) {
+ btrfs_fdatawrite_range(inode->i_mapping, pos,
+@@ -1144,8 +1137,6 @@
+ }
+ out:
+ mutex_unlock(&inode->i_mutex);
+- if (ret)
+- err = ret;
+
+ out_nolock:
+ kfree(pages);
+@@ -1224,15 +1215,15 @@
+ }
+ mutex_unlock(&root->fs_info->trans_mutex);
+
+- root->log_batch++;
++ root->fs_info->tree_log_batch++;
+ filemap_fdatawrite(inode->i_mapping);
+ btrfs_wait_ordered_range(inode, 0, (u64)-1);
+- root->log_batch++;
++ root->fs_info->tree_log_batch++;
+
+ /*
+ * ok we haven't committed the transaction yet, lets do a commit
+ */
+- if (file && file->private_data)
++ if (file->private_data)
+ btrfs_ioctl_trans_end(file);
+
+ trans = btrfs_start_transaction(root, 1);
+@@ -1241,7 +1232,7 @@
+ goto out;
+ }
+
+- ret = btrfs_log_dentry_safe(trans, root, dentry);
++ ret = btrfs_log_dentry_safe(trans, root, file->f_dentry);
+ if (ret < 0)
+ goto out;
+
+@@ -1255,7 +1246,7 @@
+ * file again, but that will end up using the synchronization
+ * inside btrfs_sync_log to keep things safe.
+ */
+- mutex_unlock(&dentry->d_inode->i_mutex);
++ mutex_unlock(&file->f_dentry->d_inode->i_mutex);
+
+ if (ret > 0) {
+ ret = btrfs_commit_transaction(trans, root);
+@@ -1263,7 +1254,7 @@
+ btrfs_sync_log(trans, root);
+ ret = btrfs_end_transaction(trans, root);
+ }
+- mutex_lock(&dentry->d_inode->i_mutex);
++ mutex_lock(&file->f_dentry->d_inode->i_mutex);
+ out:
+ return ret > 0 ? EIO : ret;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/inode.c linux-2.6.29-rc3.owrt/fs/btrfs/inode.c
+--- linux-2.6.29.owrt/fs/btrfs/inode.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/inode.c 2009-05-10 23:48:29.000000000 +0200
+@@ -34,6 +34,7 @@
+ #include <linux/statfs.h>
+ #include <linux/compat.h>
+ #include <linux/bit_spinlock.h>
++#include <linux/version.h>
+ #include <linux/xattr.h>
+ #include <linux/posix_acl.h>
+ #include <linux/falloc.h>
+@@ -50,7 +51,6 @@
+ #include "tree-log.h"
+ #include "ref-cache.h"
+ #include "compression.h"
+-#include "locking.h"
+
+ struct btrfs_iget_args {
+ u64 ino;
+@@ -91,14 +91,32 @@
+ u64 start, u64 end, int *page_started,
+ unsigned long *nr_written, int unlock);
+
+-static int btrfs_init_inode_security(struct inode *inode, struct inode *dir)
++/*
++ * a very lame attempt at stopping writes when the FS is 85% full. There
++ * are countless ways this is incorrect, but it is better than nothing.
++ */
++int btrfs_check_free_space(struct btrfs_root *root, u64 num_required,
++ int for_del)
+ {
+- int err;
++ u64 total;
++ u64 used;
++ u64 thresh;
++ int ret = 0;
+
+- err = btrfs_init_acl(inode, dir);
+- if (!err)
+- err = btrfs_xattr_security_init(inode, dir);
+- return err;
++ spin_lock(&root->fs_info->delalloc_lock);
++ total = btrfs_super_total_bytes(&root->fs_info->super_copy);
++ used = btrfs_super_bytes_used(&root->fs_info->super_copy);
++ if (for_del)
++ thresh = total * 90;
++ else
++ thresh = total * 85;
++
++ do_div(thresh, 100);
++
++ if (used + root->fs_info->delalloc_bytes + num_required > thresh)
++ ret = -ENOSPC;
++ spin_unlock(&root->fs_info->delalloc_lock);
++ return ret;
+ }
+
+ /*
+@@ -332,19 +350,6 @@
+ nr_pages = (end >> PAGE_CACHE_SHIFT) - (start >> PAGE_CACHE_SHIFT) + 1;
+ nr_pages = min(nr_pages, (128 * 1024UL) / PAGE_CACHE_SIZE);
+
+- /*
+- * we don't want to send crud past the end of i_size through
+- * compression, that's just a waste of CPU time. So, if the
+- * end of the file is before the start of our current
+- * requested range of bytes, we bail out to the uncompressed
+- * cleanup code that can deal with all of this.
+- *
+- * It isn't really the fastest way to fix things, but this is a
+- * very uncommon corner.
+- */
+- if (actual_end <= start)
+- goto cleanup_and_bail_uncompressed;
+-
+ total_compressed = actual_end - start;
+
+ /* we want to make sure that amount of ram required to uncompress
+@@ -489,7 +494,6 @@
+ goto again;
+ }
+ } else {
+-cleanup_and_bail_uncompressed:
+ /*
+ * No compression, but we still need to write the pages in
+ * the file we've been given so far. redirty the locked
+@@ -1162,7 +1166,6 @@
+ */
+ if (!(old & EXTENT_DELALLOC) && (bits & EXTENT_DELALLOC)) {
+ struct btrfs_root *root = BTRFS_I(inode)->root;
+- btrfs_delalloc_reserve_space(root, inode, end - start + 1);
+ spin_lock(&root->fs_info->delalloc_lock);
+ BTRFS_I(inode)->delalloc_bytes += end - start + 1;
+ root->fs_info->delalloc_bytes += end - start + 1;
+@@ -1196,12 +1199,9 @@
+ (unsigned long long)end - start + 1,
+ (unsigned long long)
+ root->fs_info->delalloc_bytes);
+- btrfs_delalloc_free_space(root, inode, (u64)-1);
+ root->fs_info->delalloc_bytes = 0;
+ BTRFS_I(inode)->delalloc_bytes = 0;
+ } else {
+- btrfs_delalloc_free_space(root, inode,
+- end - start + 1);
+ root->fs_info->delalloc_bytes -= end - start + 1;
+ BTRFS_I(inode)->delalloc_bytes -= end - start + 1;
+ }
+@@ -1324,11 +1324,12 @@
+ struct inode *inode, u64 file_offset,
+ struct list_head *list)
+ {
++ struct list_head *cur;
+ struct btrfs_ordered_sum *sum;
+
+ btrfs_set_trans_block_group(trans, inode);
+-
+- list_for_each_entry(sum, list, list) {
++ list_for_each(cur, list) {
++ sum = list_entry(cur, struct btrfs_ordered_sum, list);
+ btrfs_csum_file_blocks(trans,
+ BTRFS_I(inode)->root->fs_info->csum_root, sum);
+ }
+@@ -2012,7 +2013,6 @@
+ BTRFS_I(inode)->flags = btrfs_inode_flags(leaf, inode_item);
+
+ alloc_group_block = btrfs_inode_block_group(leaf, inode_item);
+-
+ BTRFS_I(inode)->block_group = btrfs_find_block_group(root, 0,
+ alloc_group_block, 0);
+ btrfs_free_path(path);
+@@ -2039,7 +2039,6 @@
+ inode->i_mapping->backing_dev_info = &root->fs_info->bdi;
+ break;
+ default:
+- inode->i_op = &btrfs_special_inode_operations;
+ init_special_inode(inode, inode->i_mode, rdev);
+ break;
+ }
+@@ -2109,7 +2108,6 @@
+ goto failed;
+ }
+
+- btrfs_unlock_up_safe(path, 1);
+ leaf = path->nodes[0];
+ inode_item = btrfs_item_ptr(leaf, path->slots[0],
+ struct btrfs_inode_item);
+@@ -2221,6 +2219,10 @@
+
+ root = BTRFS_I(dir)->root;
+
++ ret = btrfs_check_free_space(root, 1, 1);
++ if (ret)
++ goto fail;
++
+ trans = btrfs_start_transaction(root, 1);
+
+ btrfs_set_trans_block_group(trans, dir);
+@@ -2233,6 +2235,7 @@
+ nr = trans->blocks_used;
+
+ btrfs_end_transaction_throttle(trans, root);
++fail:
+ btrfs_btree_balance_dirty(root, nr);
+ return ret;
+ }
+@@ -2255,6 +2258,10 @@
+ return -ENOTEMPTY;
+ }
+
++ ret = btrfs_check_free_space(root, 1, 1);
++ if (ret)
++ goto fail;
++
+ trans = btrfs_start_transaction(root, 1);
+ btrfs_set_trans_block_group(trans, dir);
+
+@@ -2271,6 +2278,7 @@
+ fail_trans:
+ nr = trans->blocks_used;
+ ret = btrfs_end_transaction_throttle(trans, root);
++fail:
+ btrfs_btree_balance_dirty(root, nr);
+
+ if (ret && !err)
+@@ -2421,8 +2429,6 @@
+ ref->generation = leaf_gen;
+ ref->nritems = 0;
+
+- btrfs_sort_leaf_ref(ref);
+-
+ ret = btrfs_add_leaf_ref(root, ref, 0);
+ WARN_ON(ret);
+ btrfs_free_leaf_ref(root, ref);
+@@ -2470,7 +2476,7 @@
+ struct btrfs_path *path;
+ struct btrfs_key key;
+ struct btrfs_key found_key;
+- u32 found_type = (u8)-1;
++ u32 found_type;
+ struct extent_buffer *leaf;
+ struct btrfs_file_extent_item *fi;
+ u64 extent_start = 0;
+@@ -2497,6 +2503,8 @@
+ key.offset = (u64)-1;
+ key.type = (u8)-1;
+
++ btrfs_init_path(path);
++
+ search_again:
+ ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
+ if (ret < 0)
+@@ -2655,8 +2663,6 @@
+ if (pending_del_nr)
+ goto del_pending;
+ btrfs_release_path(root, path);
+- if (found_type == BTRFS_INODE_ITEM_KEY)
+- break;
+ goto search_again;
+ }
+
+@@ -2673,8 +2679,6 @@
+ BUG_ON(ret);
+ pending_del_nr = 0;
+ btrfs_release_path(root, path);
+- if (found_type == BTRFS_INODE_ITEM_KEY)
+- break;
+ goto search_again;
+ }
+ }
+@@ -2784,7 +2788,7 @@
+ if (size <= hole_start)
+ return 0;
+
+- err = btrfs_check_metadata_free_space(root);
++ err = btrfs_check_free_space(root, 1, 0);
+ if (err)
+ return err;
+
+@@ -2980,7 +2984,6 @@
+ bi->last_trans = 0;
+ bi->logged_trans = 0;
+ bi->delalloc_bytes = 0;
+- bi->reserved_bytes = 0;
+ bi->disk_i_size = 0;
+ bi->flags = 0;
+ bi->index_cnt = (u64)-1;
+@@ -3002,7 +3005,6 @@
+ inode->i_ino = args->ino;
+ init_btrfs_i(inode);
+ BTRFS_I(inode)->root = args->root;
+- btrfs_set_inode_space_info(args->root, inode);
+ return 0;
+ }
+
+@@ -3263,7 +3265,7 @@
+
+ /* Reached end of directory/root. Bump pos past the last item. */
+ if (key_type == BTRFS_DIR_INDEX_KEY)
+- filp->f_pos = INT_LIMIT(off_t);
++ filp->f_pos = INT_LIMIT(typeof(filp->f_pos));
+ else
+ filp->f_pos++;
+ nopos:
+@@ -3423,7 +3425,6 @@
+ BTRFS_I(inode)->index_cnt = 2;
+ BTRFS_I(inode)->root = root;
+ BTRFS_I(inode)->generation = trans->transid;
+- btrfs_set_inode_space_info(root, inode);
+
+ if (mode & S_IFDIR)
+ owner = 0;
+@@ -3457,14 +3458,7 @@
+ root->highest_inode = objectid;
+
+ inode->i_uid = current_fsuid();
+-
+- if (dir && (dir->i_mode & S_ISGID)) {
+- inode->i_gid = dir->i_gid;
+- if (S_ISDIR(mode))
+- mode |= S_ISGID;
+- } else
+- inode->i_gid = current_fsgid();
+-
++ inode->i_gid = current_fsgid();
+ inode->i_mode = mode;
+ inode->i_ino = objectid;
+ inode_set_bytes(inode, 0);
+@@ -3571,7 +3565,7 @@
+ if (!new_valid_dev(rdev))
+ return -EINVAL;
+
+- err = btrfs_check_metadata_free_space(root);
++ err = btrfs_check_free_space(root, 1, 0);
+ if (err)
+ goto fail;
+
+@@ -3592,7 +3586,7 @@
+ if (IS_ERR(inode))
+ goto out_unlock;
+
+- err = btrfs_init_inode_security(inode, dir);
++ err = btrfs_init_acl(inode, dir);
+ if (err) {
+ drop_inode = 1;
+ goto out_unlock;
+@@ -3634,7 +3628,7 @@
+ u64 objectid;
+ u64 index = 0;
+
+- err = btrfs_check_metadata_free_space(root);
++ err = btrfs_check_free_space(root, 1, 0);
+ if (err)
+ goto fail;
+ trans = btrfs_start_transaction(root, 1);
+@@ -3655,7 +3649,7 @@
+ if (IS_ERR(inode))
+ goto out_unlock;
+
+- err = btrfs_init_inode_security(inode, dir);
++ err = btrfs_init_acl(inode, dir);
+ if (err) {
+ drop_inode = 1;
+ goto out_unlock;
+@@ -3702,7 +3696,7 @@
+ return -ENOENT;
+
+ btrfs_inc_nlink(inode);
+- err = btrfs_check_metadata_free_space(root);
++ err = btrfs_check_free_space(root, 1, 0);
+ if (err)
+ goto fail;
+ err = btrfs_set_inode_index(dir, &index);
+@@ -3748,7 +3742,7 @@
+ u64 index = 0;
+ unsigned long nr = 1;
+
+- err = btrfs_check_metadata_free_space(root);
++ err = btrfs_check_free_space(root, 1, 0);
+ if (err)
+ goto out_unlock;
+
+@@ -3778,7 +3772,7 @@
+
+ drop_on_err = 1;
+
+- err = btrfs_init_inode_security(inode, dir);
++ err = btrfs_init_acl(inode, dir);
+ if (err)
+ goto out_fail;
+
+@@ -4164,10 +4158,9 @@
+ return -EINVAL;
+ }
+
+-static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
+- __u64 start, __u64 len)
++static sector_t btrfs_bmap(struct address_space *mapping, sector_t iblock)
+ {
+- return extent_fiemap(inode, fieinfo, start, len, btrfs_get_extent);
++ return extent_bmap(mapping, iblock, btrfs_get_extent);
+ }
+
+ int btrfs_readpage(struct file *file, struct page *page)
+@@ -4230,7 +4223,7 @@
+ {
+ if (PageWriteback(page) || PageDirty(page))
+ return 0;
+- return __btrfs_releasepage(page, gfp_flags & GFP_NOFS);
++ return __btrfs_releasepage(page, gfp_flags);
+ }
+
+ static void btrfs_invalidatepage(struct page *page, unsigned long offset)
+@@ -4305,7 +4298,7 @@
+ u64 page_start;
+ u64 page_end;
+
+- ret = btrfs_check_data_free_space(root, inode, PAGE_CACHE_SIZE);
++ ret = btrfs_check_free_space(root, PAGE_CACHE_SIZE, 0);
+ if (ret)
+ goto out;
+
+@@ -4318,7 +4311,6 @@
+
+ if ((page->mapping != inode->i_mapping) ||
+ (page_start >= size)) {
+- btrfs_free_reserved_data_space(root, inode, PAGE_CACHE_SIZE);
+ /* page got truncated out from underneath us */
+ goto out_unlock;
+ }
+@@ -4601,7 +4593,7 @@
+ if (old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID)
+ return -EXDEV;
+
+- ret = btrfs_check_metadata_free_space(root);
++ ret = btrfs_check_free_space(root, 1, 0);
+ if (ret)
+ goto out_unlock;
+
+@@ -4719,7 +4711,7 @@
+ if (name_len > BTRFS_MAX_INLINE_DATA_SIZE(root))
+ return -ENAMETOOLONG;
+
+- err = btrfs_check_metadata_free_space(root);
++ err = btrfs_check_free_space(root, 1, 0);
+ if (err)
+ goto out_fail;
+
+@@ -4741,7 +4733,7 @@
+ if (IS_ERR(inode))
+ goto out_unlock;
+
+- err = btrfs_init_inode_security(inode, dir);
++ err = btrfs_init_acl(inode, dir);
+ if (err) {
+ drop_inode = 1;
+ goto out_unlock;
+@@ -4995,24 +4987,13 @@
+ .clear_bit_hook = btrfs_clear_bit_hook,
+ };
+
+-/*
+- * btrfs doesn't support the bmap operation because swapfiles
+- * use bmap to make a mapping of extents in the file. They assume
+- * these extents won't change over the life of the file and they
+- * use the bmap result to do IO directly to the drive.
+- *
+- * the btrfs bmap call would return logical addresses that aren't
+- * suitable for IO and they also will change frequently as COW
+- * operations happen. So, swapfile + btrfs == corruption.
+- *
+- * For now we're avoiding this by dropping bmap.
+- */
+ static struct address_space_operations btrfs_aops = {
+ .readpage = btrfs_readpage,
+ .writepage = btrfs_writepage,
+ .writepages = btrfs_writepages,
+ .readpages = btrfs_readpages,
+ .sync_page = block_sync_page,
++ .bmap = btrfs_bmap,
+ .direct_IO = btrfs_direct_IO,
+ .invalidatepage = btrfs_invalidatepage,
+ .releasepage = btrfs_releasepage,
+@@ -5036,7 +5017,6 @@
+ .removexattr = btrfs_removexattr,
+ .permission = btrfs_permission,
+ .fallocate = btrfs_fallocate,
+- .fiemap = btrfs_fiemap,
+ };
+ static struct inode_operations btrfs_special_inode_operations = {
+ .getattr = btrfs_getattr,
+@@ -5052,8 +5032,4 @@
+ .follow_link = page_follow_link_light,
+ .put_link = page_put_link,
+ .permission = btrfs_permission,
+- .setxattr = btrfs_setxattr,
+- .getxattr = btrfs_getxattr,
+- .listxattr = btrfs_listxattr,
+- .removexattr = btrfs_removexattr,
+ };
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/inode-map.c linux-2.6.29-rc3.owrt/fs/btrfs/inode-map.c
+--- linux-2.6.29.owrt/fs/btrfs/inode-map.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/inode-map.c 2009-05-10 23:48:29.000000000 +0200
+@@ -84,6 +84,7 @@
+ search_key.type = 0;
+ search_key.offset = 0;
+
++ btrfs_init_path(path);
+ start_found = 0;
+ ret = btrfs_search_slot(trans, root, &search_key, path, 0, 0);
+ if (ret < 0)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/ioctl.c linux-2.6.29-rc3.owrt/fs/btrfs/ioctl.c
+--- linux-2.6.29.owrt/fs/btrfs/ioctl.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/ioctl.c 2009-05-10 23:48:29.000000000 +0200
+@@ -38,6 +38,7 @@
+ #include <linux/compat.h>
+ #include <linux/bit_spinlock.h>
+ #include <linux/security.h>
++#include <linux/version.h>
+ #include <linux/xattr.h>
+ #include <linux/vmalloc.h>
+ #include "compat.h"
+@@ -70,7 +71,7 @@
+ u64 index = 0;
+ unsigned long nr = 1;
+
+- ret = btrfs_check_metadata_free_space(root);
++ ret = btrfs_check_free_space(root, 1, 0);
+ if (ret)
+ goto fail_commit;
+
+@@ -203,7 +204,7 @@
+ if (!root->ref_cows)
+ return -EINVAL;
+
+- ret = btrfs_check_metadata_free_space(root);
++ ret = btrfs_check_free_space(root, 1, 0);
+ if (ret)
+ goto fail_unlock;
+
+@@ -374,7 +375,7 @@
+ unsigned long i;
+ int ret;
+
+- ret = btrfs_check_data_free_space(root, inode, inode->i_size);
++ ret = btrfs_check_free_space(root, inode->i_size, 0);
+ if (ret)
+ return -ENOSPC;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/Kconfig linux-2.6.29-rc3.owrt/fs/btrfs/Kconfig
+--- linux-2.6.29.owrt/fs/btrfs/Kconfig 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/Kconfig 2009-05-10 23:48:29.000000000 +0200
+@@ -16,16 +16,3 @@
+ module will be called btrfs.
+
+ If unsure, say N.
+-
+-config BTRFS_FS_POSIX_ACL
+- bool "Btrfs POSIX Access Control Lists"
+- depends on BTRFS_FS
+- select FS_POSIX_ACL
+- help
+- POSIX Access Control Lists (ACLs) support permissions for users and
+- groups beyond the owner/group/world scheme.
+-
+- To learn more about Access Control Lists, visit the POSIX ACLs for
+- Linux website <http://acl.bestbits.at/>.
+-
+- If you don't know what Access Control Lists are, say N
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/locking.c linux-2.6.29-rc3.owrt/fs/btrfs/locking.c
+--- linux-2.6.29.owrt/fs/btrfs/locking.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/locking.c 2009-05-10 23:48:29.000000000 +0200
+@@ -25,203 +25,64 @@
+ #include "extent_io.h"
+ #include "locking.h"
+
+-static inline void spin_nested(struct extent_buffer *eb)
+-{
+- spin_lock(&eb->lock);
+-}
+-
+-/*
+- * Setting a lock to blocking will drop the spinlock and set the
+- * flag that forces other procs who want the lock to wait. After
+- * this you can safely schedule with the lock held.
+- */
+-void btrfs_set_lock_blocking(struct extent_buffer *eb)
+-{
+- if (!test_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags)) {
+- set_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags);
+- spin_unlock(&eb->lock);
+- }
+- /* exit with the spin lock released and the bit set */
+-}
+-
+ /*
+- * clearing the blocking flag will take the spinlock again.
+- * After this you can't safely schedule
+- */
+-void btrfs_clear_lock_blocking(struct extent_buffer *eb)
+-{
+- if (test_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags)) {
+- spin_nested(eb);
+- clear_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags);
+- smp_mb__after_clear_bit();
+- }
+- /* exit with the spin lock held */
+-}
+-
+-/*
+- * unfortunately, many of the places that currently set a lock to blocking
+- * don't end up blocking for every long, and often they don't block
+- * at all. For a dbench 50 run, if we don't spin one the blocking bit
+- * at all, the context switch rate can jump up to 400,000/sec or more.
++ * locks the per buffer mutex in an extent buffer. This uses adaptive locks
++ * and the spin is not tuned very extensively. The spinning does make a big
++ * difference in almost every workload, but spinning for the right amount of
++ * time needs some help.
+ *
+- * So, we're still stuck with this crummy spin on the blocking bit,
+- * at least until the most common causes of the short blocks
+- * can be dealt with.
++ * In general, we want to spin as long as the lock holder is doing btree
++ * searches, and we should give up if they are in more expensive code.
+ */
+-static int btrfs_spin_on_block(struct extent_buffer *eb)
++
++int btrfs_tree_lock(struct extent_buffer *eb)
+ {
+ int i;
++
++ if (mutex_trylock(&eb->mutex))
++ return 0;
+ for (i = 0; i < 512; i++) {
+ cpu_relax();
+- if (!test_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags))
+- return 1;
+- if (need_resched())
+- break;
++ if (mutex_trylock(&eb->mutex))
++ return 0;
+ }
++ cpu_relax();
++ mutex_lock_nested(&eb->mutex, BTRFS_MAX_LEVEL - btrfs_header_level(eb));
+ return 0;
+ }
+
+-/*
+- * This is somewhat different from trylock. It will take the
+- * spinlock but if it finds the lock is set to blocking, it will
+- * return without the lock held.
+- *
+- * returns 1 if it was able to take the lock and zero otherwise
+- *
+- * After this call, scheduling is not safe without first calling
+- * btrfs_set_lock_blocking()
+- */
+-int btrfs_try_spin_lock(struct extent_buffer *eb)
++int btrfs_try_tree_lock(struct extent_buffer *eb)
+ {
+- int i;
+-
+- spin_nested(eb);
+- if (!test_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags))
+- return 1;
+- spin_unlock(&eb->lock);
+-
+- /* spin for a bit on the BLOCKING flag */
+- for (i = 0; i < 2; i++) {
+- if (!btrfs_spin_on_block(eb))
+- break;
+-
+- spin_nested(eb);
+- if (!test_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags))
+- return 1;
+- spin_unlock(&eb->lock);
+- }
+- return 0;
++ return mutex_trylock(&eb->mutex);
+ }
+
+-/*
+- * the autoremove wake function will return 0 if it tried to wake up
+- * a process that was already awake, which means that process won't
+- * count as an exclusive wakeup. The waitq code will continue waking
+- * procs until it finds one that was actually sleeping.
+- *
+- * For btrfs, this isn't quite what we want. We want a single proc
+- * to be notified that the lock is ready for taking. If that proc
+- * already happen to be awake, great, it will loop around and try for
+- * the lock.
+- *
+- * So, btrfs_wake_function always returns 1, even when the proc that we
+- * tried to wake up was already awake.
+- */
+-static int btrfs_wake_function(wait_queue_t *wait, unsigned mode,
+- int sync, void *key)
++int btrfs_tree_unlock(struct extent_buffer *eb)
+ {
+- autoremove_wake_function(wait, mode, sync, key);
+- return 1;
++ mutex_unlock(&eb->mutex);
++ return 0;
+ }
+
+-/*
+- * returns with the extent buffer spinlocked.
+- *
+- * This will spin and/or wait as required to take the lock, and then
+- * return with the spinlock held.
+- *
+- * After this call, scheduling is not safe without first calling
+- * btrfs_set_lock_blocking()
+- */
+-int btrfs_tree_lock(struct extent_buffer *eb)
++int btrfs_tree_locked(struct extent_buffer *eb)
+ {
+- DEFINE_WAIT(wait);
+- wait.func = btrfs_wake_function;
+-
+- while(1) {
+- spin_nested(eb);
+-
+- /* nobody is blocking, exit with the spinlock held */
+- if (!test_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags))
+- return 0;
+-
+- /*
+- * we have the spinlock, but the real owner is blocking.
+- * wait for them
+- */
+- spin_unlock(&eb->lock);
+-
+- /*
+- * spin for a bit, and if the blocking flag goes away,
+- * loop around
+- */
+- if (btrfs_spin_on_block(eb))
+- continue;
+-
+- prepare_to_wait_exclusive(&eb->lock_wq, &wait,
+- TASK_UNINTERRUPTIBLE);
+-
+- if (test_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags))
+- schedule();
+-
+- finish_wait(&eb->lock_wq, &wait);
+- }
+- return 0;
++ return mutex_is_locked(&eb->mutex);
+ }
+
+ /*
+- * Very quick trylock, this does not spin or schedule. It returns
+- * 1 with the spinlock held if it was able to take the lock, or it
+- * returns zero if it was unable to take the lock.
+- *
+- * After this call, scheduling is not safe without first calling
+- * btrfs_set_lock_blocking()
++ * btrfs_search_slot uses this to decide if it should drop its locks
++ * before doing something expensive like allocating free blocks for cow.
+ */
+-int btrfs_try_tree_lock(struct extent_buffer *eb)
++int btrfs_path_lock_waiting(struct btrfs_path *path, int level)
+ {
+- if (spin_trylock(&eb->lock)) {
+- if (test_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags)) {
+- /*
+- * we've got the spinlock, but the real owner is
+- * blocking. Drop the spinlock and return failure
+- */
+- spin_unlock(&eb->lock);
+- return 0;
+- }
+- return 1;
++ int i;
++ struct extent_buffer *eb;
++ for (i = level; i <= level + 1 && i < BTRFS_MAX_LEVEL; i++) {
++ eb = path->nodes[i];
++ if (!eb)
++ break;
++ smp_mb();
++ if (!list_empty(&eb->mutex.wait_list))
++ return 1;
+ }
+- /* someone else has the spinlock giveup */
+ return 0;
+ }
+
+-int btrfs_tree_unlock(struct extent_buffer *eb)
+-{
+- /*
+- * if we were a blocking owner, we don't have the spinlock held
+- * just clear the bit and look for waiters
+- */
+- if (test_and_clear_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags))
+- smp_mb__after_clear_bit();
+- else
+- spin_unlock(&eb->lock);
+-
+- if (waitqueue_active(&eb->lock_wq))
+- wake_up(&eb->lock_wq);
+- return 0;
+-}
+-
+-void btrfs_assert_tree_locked(struct extent_buffer *eb)
+-{
+- if (!test_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags))
+- assert_spin_locked(&eb->lock);
+-}
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/locking.h linux-2.6.29-rc3.owrt/fs/btrfs/locking.h
+--- linux-2.6.29.owrt/fs/btrfs/locking.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/locking.h 2009-05-10 23:48:29.000000000 +0200
+@@ -21,11 +21,7 @@
+
+ int btrfs_tree_lock(struct extent_buffer *eb);
+ int btrfs_tree_unlock(struct extent_buffer *eb);
+-
++int btrfs_tree_locked(struct extent_buffer *eb);
+ int btrfs_try_tree_lock(struct extent_buffer *eb);
+-int btrfs_try_spin_lock(struct extent_buffer *eb);
+-
+-void btrfs_set_lock_blocking(struct extent_buffer *eb);
+-void btrfs_clear_lock_blocking(struct extent_buffer *eb);
+-void btrfs_assert_tree_locked(struct extent_buffer *eb);
++int btrfs_path_lock_waiting(struct btrfs_path *path, int level);
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/ordered-data.c linux-2.6.29-rc3.owrt/fs/btrfs/ordered-data.c
+--- linux-2.6.29.owrt/fs/btrfs/ordered-data.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/ordered-data.c 2009-05-10 23:48:29.000000000 +0200
+@@ -613,6 +613,7 @@
+ struct btrfs_sector_sum *sector_sums;
+ struct btrfs_ordered_extent *ordered;
+ struct btrfs_ordered_inode_tree *tree = &BTRFS_I(inode)->ordered_tree;
++ struct list_head *cur;
+ unsigned long num_sectors;
+ unsigned long i;
+ u32 sectorsize = BTRFS_I(inode)->root->sectorsize;
+@@ -623,7 +624,8 @@
+ return 1;
+
+ mutex_lock(&tree->mutex);
+- list_for_each_entry_reverse(ordered_sum, &ordered->list, list) {
++ list_for_each_prev(cur, &ordered->list) {
++ ordered_sum = list_entry(cur, struct btrfs_ordered_sum, list);
+ if (disk_bytenr >= ordered_sum->bytenr) {
+ num_sectors = ordered_sum->len / sectorsize;
+ sector_sums = ordered_sum->sums;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/ref-cache.c linux-2.6.29-rc3.owrt/fs/btrfs/ref-cache.c
+--- linux-2.6.29.owrt/fs/btrfs/ref-cache.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/ref-cache.c 2009-05-10 23:48:29.000000000 +0200
+@@ -17,7 +17,6 @@
+ */
+
+ #include <linux/sched.h>
+-#include <linux/sort.h>
+ #include "ctree.h"
+ #include "ref-cache.h"
+ #include "transaction.h"
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/ref-cache.h linux-2.6.29-rc3.owrt/fs/btrfs/ref-cache.h
+--- linux-2.6.29.owrt/fs/btrfs/ref-cache.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/ref-cache.h 2009-05-10 23:48:29.000000000 +0200
+@@ -73,4 +73,5 @@
+ int btrfs_remove_leaf_refs(struct btrfs_root *root, u64 max_root_gen,
+ int shared);
+ int btrfs_remove_leaf_ref(struct btrfs_root *root, struct btrfs_leaf_ref *ref);
++
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/super.c linux-2.6.29-rc3.owrt/fs/btrfs/super.c
+--- linux-2.6.29.owrt/fs/btrfs/super.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/super.c 2009-05-10 23:48:29.000000000 +0200
+@@ -37,6 +37,7 @@
+ #include <linux/ctype.h>
+ #include <linux/namei.h>
+ #include <linux/miscdevice.h>
++#include <linux/version.h>
+ #include <linux/magic.h>
+ #include "compat.h"
+ #include "ctree.h"
+@@ -379,6 +380,7 @@
+ btrfs_start_delalloc_inodes(root);
+ btrfs_wait_ordered_extents(root, 0);
+
++ btrfs_clean_old_snapshots(root);
+ trans = btrfs_start_transaction(root, 1);
+ ret = btrfs_commit_transaction(trans, root);
+ sb->s_dirt = 0;
+@@ -510,10 +512,6 @@
+ struct btrfs_root *root = btrfs_sb(sb);
+ int ret;
+
+- ret = btrfs_parse_options(root, data);
+- if (ret)
+- return -EINVAL;
+-
+ if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
+ return 0;
+
+@@ -585,18 +583,17 @@
+ struct btrfs_ioctl_vol_args *vol;
+ struct btrfs_fs_devices *fs_devices;
+ int ret = -ENOTTY;
++ int len;
+
+ if (!capable(CAP_SYS_ADMIN))
+ return -EPERM;
+
+ vol = kmalloc(sizeof(*vol), GFP_KERNEL);
+- if (!vol)
+- return -ENOMEM;
+-
+ if (copy_from_user(vol, (void __user *)arg, sizeof(*vol))) {
+ ret = -EFAULT;
+ goto out;
+ }
++ len = strnlen(vol->name, BTRFS_PATH_NAME_MAX);
+
+ switch (cmd) {
+ case BTRFS_IOC_SCAN_DEV:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/transaction.c linux-2.6.29-rc3.owrt/fs/btrfs/transaction.c
+--- linux-2.6.29.owrt/fs/btrfs/transaction.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/transaction.c 2009-05-10 23:48:29.000000000 +0200
+@@ -688,9 +688,7 @@
+ num_bytes -= btrfs_root_used(&dirty->root->root_item);
+ bytes_used = btrfs_root_used(&root->root_item);
+ if (num_bytes) {
+- mutex_lock(&root->fs_info->trans_mutex);
+ btrfs_record_root_in_trans(root);
+- mutex_unlock(&root->fs_info->trans_mutex);
+ btrfs_set_root_used(&root->root_item,
+ bytes_used - num_bytes);
+ }
+@@ -854,9 +852,11 @@
+ {
+ struct btrfs_pending_snapshot *pending;
+ struct list_head *head = &trans->transaction->pending_snapshots;
++ struct list_head *cur;
+ int ret;
+
+- list_for_each_entry(pending, head, list) {
++ list_for_each(cur, head) {
++ pending = list_entry(cur, struct btrfs_pending_snapshot, list);
+ ret = create_pending_snapshot(trans, fs_info, pending);
+ BUG_ON(ret);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/tree-defrag.c linux-2.6.29-rc3.owrt/fs/btrfs/tree-defrag.c
+--- linux-2.6.29.owrt/fs/btrfs/tree-defrag.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/tree-defrag.c 2009-05-10 23:48:29.000000000 +0200
+@@ -74,7 +74,6 @@
+ u32 nritems;
+
+ root_node = btrfs_lock_root_node(root);
+- btrfs_set_lock_blocking(root_node);
+ nritems = btrfs_header_nritems(root_node);
+ root->defrag_max.objectid = 0;
+ /* from above we know this is not a leaf */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/tree-log.c linux-2.6.29-rc3.owrt/fs/btrfs/tree-log.c
+--- linux-2.6.29.owrt/fs/btrfs/tree-log.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/tree-log.c 2009-05-10 23:48:29.000000000 +0200
+@@ -78,6 +78,104 @@
+ */
+
+ /*
++ * btrfs_add_log_tree adds a new per-subvolume log tree into the
++ * tree of log tree roots. This must be called with a tree log transaction
++ * running (see start_log_trans).
++ */
++static int btrfs_add_log_tree(struct btrfs_trans_handle *trans,
++ struct btrfs_root *root)
++{
++ struct btrfs_key key;
++ struct btrfs_root_item root_item;
++ struct btrfs_inode_item *inode_item;
++ struct extent_buffer *leaf;
++ struct btrfs_root *new_root = root;
++ int ret;
++ u64 objectid = root->root_key.objectid;
++
++ leaf = btrfs_alloc_free_block(trans, root, root->leafsize, 0,
++ BTRFS_TREE_LOG_OBJECTID,
++ trans->transid, 0, 0, 0);
++ if (IS_ERR(leaf)) {
++ ret = PTR_ERR(leaf);
++ return ret;
++ }
++
++ btrfs_set_header_nritems(leaf, 0);
++ btrfs_set_header_level(leaf, 0);
++ btrfs_set_header_bytenr(leaf, leaf->start);
++ btrfs_set_header_generation(leaf, trans->transid);
++ btrfs_set_header_owner(leaf, BTRFS_TREE_LOG_OBJECTID);
++
++ write_extent_buffer(leaf, root->fs_info->fsid,
++ (unsigned long)btrfs_header_fsid(leaf),
++ BTRFS_FSID_SIZE);
++ btrfs_mark_buffer_dirty(leaf);
++
++ inode_item = &root_item.inode;
++ memset(inode_item, 0, sizeof(*inode_item));
++ inode_item->generation = cpu_to_le64(1);
++ inode_item->size = cpu_to_le64(3);
++ inode_item->nlink = cpu_to_le32(1);
++ inode_item->nbytes = cpu_to_le64(root->leafsize);
++ inode_item->mode = cpu_to_le32(S_IFDIR | 0755);
++
++ btrfs_set_root_bytenr(&root_item, leaf->start);
++ btrfs_set_root_generation(&root_item, trans->transid);
++ btrfs_set_root_level(&root_item, 0);
++ btrfs_set_root_refs(&root_item, 0);
++ btrfs_set_root_used(&root_item, 0);
++
++ memset(&root_item.drop_progress, 0, sizeof(root_item.drop_progress));
++ root_item.drop_level = 0;
++
++ btrfs_tree_unlock(leaf);
++ free_extent_buffer(leaf);
++ leaf = NULL;
++
++ btrfs_set_root_dirid(&root_item, 0);
++
++ key.objectid = BTRFS_TREE_LOG_OBJECTID;
++ key.offset = objectid;
++ btrfs_set_key_type(&key, BTRFS_ROOT_ITEM_KEY);
++ ret = btrfs_insert_root(trans, root->fs_info->log_root_tree, &key,
++ &root_item);
++ if (ret)
++ goto fail;
++
++ new_root = btrfs_read_fs_root_no_radix(root->fs_info->log_root_tree,
++ &key);
++ BUG_ON(!new_root);
++
++ WARN_ON(root->log_root);
++ root->log_root = new_root;
++
++ /*
++ * log trees do not get reference counted because they go away
++ * before a real commit is actually done. They do store pointers
++ * to file data extents, and those reference counts still get
++ * updated (along with back refs to the log tree).
++ */
++ new_root->ref_cows = 0;
++ new_root->last_trans = trans->transid;
++
++ /*
++ * we need to make sure the root block for this new tree
++ * is marked as dirty in the dirty_log_pages tree. This
++ * is how it gets flushed down to disk at tree log commit time.
++ *
++ * the tree logging mutex keeps others from coming in and changing
++ * the new_root->node, so we can safely access it here
++ */
++ set_extent_dirty(&new_root->dirty_log_pages, new_root->node->start,
++ new_root->node->start + new_root->node->len - 1,
++ GFP_NOFS);
++
++fail:
++ return ret;
++}
++
++/*
+ * start a sub transaction and setup the log tree
+ * this increments the log tree writer count to make the people
+ * syncing the tree wait for us to finish
+@@ -86,14 +184,6 @@
+ struct btrfs_root *root)
+ {
+ int ret;
+-
+- mutex_lock(&root->log_mutex);
+- if (root->log_root) {
+- root->log_batch++;
+- atomic_inc(&root->log_writers);
+- mutex_unlock(&root->log_mutex);
+- return 0;
+- }
+ mutex_lock(&root->fs_info->tree_log_mutex);
+ if (!root->fs_info->log_root_tree) {
+ ret = btrfs_init_log_root_tree(trans, root->fs_info);
+@@ -103,10 +193,9 @@
+ ret = btrfs_add_log_tree(trans, root);
+ BUG_ON(ret);
+ }
++ atomic_inc(&root->fs_info->tree_log_writers);
++ root->fs_info->tree_log_batch++;
+ mutex_unlock(&root->fs_info->tree_log_mutex);
+- root->log_batch++;
+- atomic_inc(&root->log_writers);
+- mutex_unlock(&root->log_mutex);
+ return 0;
+ }
+
+@@ -123,12 +212,13 @@
+ if (!root->log_root)
+ return -ENOENT;
+
+- mutex_lock(&root->log_mutex);
++ mutex_lock(&root->fs_info->tree_log_mutex);
+ if (root->log_root) {
+ ret = 0;
+- atomic_inc(&root->log_writers);
++ atomic_inc(&root->fs_info->tree_log_writers);
++ root->fs_info->tree_log_batch++;
+ }
+- mutex_unlock(&root->log_mutex);
++ mutex_unlock(&root->fs_info->tree_log_mutex);
+ return ret;
+ }
+
+@@ -138,11 +228,10 @@
+ */
+ static int end_log_trans(struct btrfs_root *root)
+ {
+- if (atomic_dec_and_test(&root->log_writers)) {
+- smp_mb();
+- if (waitqueue_active(&root->log_writer_wait))
+- wake_up(&root->log_writer_wait);
+- }
++ atomic_dec(&root->fs_info->tree_log_writers);
++ smp_mb();
++ if (waitqueue_active(&root->fs_info->tree_log_wait))
++ wake_up(&root->fs_info->tree_log_wait);
+ return 0;
+ }
+
+@@ -1615,7 +1704,6 @@
+
+ btrfs_tree_lock(next);
+ clean_tree_block(trans, root, next);
+- btrfs_set_lock_blocking(next);
+ btrfs_wait_tree_block_writeback(next);
+ btrfs_tree_unlock(next);
+
+@@ -1662,7 +1750,6 @@
+ next = path->nodes[*level];
+ btrfs_tree_lock(next);
+ clean_tree_block(trans, root, next);
+- btrfs_set_lock_blocking(next);
+ btrfs_wait_tree_block_writeback(next);
+ btrfs_tree_unlock(next);
+
+@@ -1720,7 +1807,6 @@
+
+ btrfs_tree_lock(next);
+ clean_tree_block(trans, root, next);
+- btrfs_set_lock_blocking(next);
+ btrfs_wait_tree_block_writeback(next);
+ btrfs_tree_unlock(next);
+
+@@ -1793,7 +1879,6 @@
+
+ btrfs_tree_lock(next);
+ clean_tree_block(trans, log, next);
+- btrfs_set_lock_blocking(next);
+ btrfs_wait_tree_block_writeback(next);
+ btrfs_tree_unlock(next);
+
+@@ -1817,65 +1902,26 @@
+ }
+ }
+ btrfs_free_path(path);
++ if (wc->free)
++ free_extent_buffer(log->node);
+ return ret;
+ }
+
+-/*
+- * helper function to update the item for a given subvolumes log root
+- * in the tree of log roots
+- */
+-static int update_log_root(struct btrfs_trans_handle *trans,
+- struct btrfs_root *log)
+-{
+- int ret;
+-
+- if (log->log_transid == 1) {
+- /* insert root item on the first sync */
+- ret = btrfs_insert_root(trans, log->fs_info->log_root_tree,
+- &log->root_key, &log->root_item);
+- } else {
+- ret = btrfs_update_root(trans, log->fs_info->log_root_tree,
+- &log->root_key, &log->root_item);
+- }
+- return ret;
+-}
+-
+-static int wait_log_commit(struct btrfs_root *root, unsigned long transid)
++static int wait_log_commit(struct btrfs_root *log)
+ {
+ DEFINE_WAIT(wait);
+- int index = transid % 2;
++ u64 transid = log->fs_info->tree_log_transid;
+
+- /*
+- * we only allow two pending log transactions at a time,
+- * so we know that if ours is more than 2 older than the
+- * current transaction, we're done
+- */
+ do {
+- prepare_to_wait(&root->log_commit_wait[index],
+- &wait, TASK_UNINTERRUPTIBLE);
+- mutex_unlock(&root->log_mutex);
+- if (root->log_transid < transid + 2 &&
+- atomic_read(&root->log_commit[index]))
++ prepare_to_wait(&log->fs_info->tree_log_wait, &wait,
++ TASK_UNINTERRUPTIBLE);
++ mutex_unlock(&log->fs_info->tree_log_mutex);
++ if (atomic_read(&log->fs_info->tree_log_commit))
+ schedule();
+- finish_wait(&root->log_commit_wait[index], &wait);
+- mutex_lock(&root->log_mutex);
+- } while (root->log_transid < transid + 2 &&
+- atomic_read(&root->log_commit[index]));
+- return 0;
+-}
+-
+-static int wait_for_writer(struct btrfs_root *root)
+-{
+- DEFINE_WAIT(wait);
+- while (atomic_read(&root->log_writers)) {
+- prepare_to_wait(&root->log_writer_wait,
+- &wait, TASK_UNINTERRUPTIBLE);
+- mutex_unlock(&root->log_mutex);
+- if (atomic_read(&root->log_writers))
+- schedule();
+- mutex_lock(&root->log_mutex);
+- finish_wait(&root->log_writer_wait, &wait);
+- }
++ finish_wait(&log->fs_info->tree_log_wait, &wait);
++ mutex_lock(&log->fs_info->tree_log_mutex);
++ } while (transid == log->fs_info->tree_log_transid &&
++ atomic_read(&log->fs_info->tree_log_commit));
+ return 0;
+ }
+
+@@ -1887,114 +1933,57 @@
+ int btrfs_sync_log(struct btrfs_trans_handle *trans,
+ struct btrfs_root *root)
+ {
+- int index1;
+- int index2;
+ int ret;
++ unsigned long batch;
+ struct btrfs_root *log = root->log_root;
+- struct btrfs_root *log_root_tree = root->fs_info->log_root_tree;
+
+- mutex_lock(&root->log_mutex);
+- index1 = root->log_transid % 2;
+- if (atomic_read(&root->log_commit[index1])) {
+- wait_log_commit(root, root->log_transid);
+- mutex_unlock(&root->log_mutex);
+- return 0;
++ mutex_lock(&log->fs_info->tree_log_mutex);
++ if (atomic_read(&log->fs_info->tree_log_commit)) {
++ wait_log_commit(log);
++ goto out;
+ }
+- atomic_set(&root->log_commit[index1], 1);
+-
+- /* wait for previous tree log sync to complete */
+- if (atomic_read(&root->log_commit[(index1 + 1) % 2]))
+- wait_log_commit(root, root->log_transid - 1);
++ atomic_set(&log->fs_info->tree_log_commit, 1);
+
+ while (1) {
+- unsigned long batch = root->log_batch;
+- mutex_unlock(&root->log_mutex);
++ batch = log->fs_info->tree_log_batch;
++ mutex_unlock(&log->fs_info->tree_log_mutex);
+ schedule_timeout_uninterruptible(1);
+- mutex_lock(&root->log_mutex);
+- wait_for_writer(root);
+- if (batch == root->log_batch)
++ mutex_lock(&log->fs_info->tree_log_mutex);
++
++ while (atomic_read(&log->fs_info->tree_log_writers)) {
++ DEFINE_WAIT(wait);
++ prepare_to_wait(&log->fs_info->tree_log_wait, &wait,
++ TASK_UNINTERRUPTIBLE);
++ mutex_unlock(&log->fs_info->tree_log_mutex);
++ if (atomic_read(&log->fs_info->tree_log_writers))
++ schedule();
++ mutex_lock(&log->fs_info->tree_log_mutex);
++ finish_wait(&log->fs_info->tree_log_wait, &wait);
++ }
++ if (batch == log->fs_info->tree_log_batch)
+ break;
+ }
+
+ ret = btrfs_write_and_wait_marked_extents(log, &log->dirty_log_pages);
+ BUG_ON(ret);
+-
+- btrfs_set_root_bytenr(&log->root_item, log->node->start);
+- btrfs_set_root_generation(&log->root_item, trans->transid);
+- btrfs_set_root_level(&log->root_item, btrfs_header_level(log->node));
+-
+- root->log_batch = 0;
+- root->log_transid++;
+- log->log_transid = root->log_transid;
+- smp_mb();
+- /*
+- * log tree has been flushed to disk, new modifications of
+- * the log will be written to new positions. so it's safe to
+- * allow log writers to go in.
+- */
+- mutex_unlock(&root->log_mutex);
+-
+- mutex_lock(&log_root_tree->log_mutex);
+- log_root_tree->log_batch++;
+- atomic_inc(&log_root_tree->log_writers);
+- mutex_unlock(&log_root_tree->log_mutex);
+-
+- ret = update_log_root(trans, log);
+- BUG_ON(ret);
+-
+- mutex_lock(&log_root_tree->log_mutex);
+- if (atomic_dec_and_test(&log_root_tree->log_writers)) {
+- smp_mb();
+- if (waitqueue_active(&log_root_tree->log_writer_wait))
+- wake_up(&log_root_tree->log_writer_wait);
+- }
+-
+- index2 = log_root_tree->log_transid % 2;
+- if (atomic_read(&log_root_tree->log_commit[index2])) {
+- wait_log_commit(log_root_tree, log_root_tree->log_transid);
+- mutex_unlock(&log_root_tree->log_mutex);
+- goto out;
+- }
+- atomic_set(&log_root_tree->log_commit[index2], 1);
+-
+- if (atomic_read(&log_root_tree->log_commit[(index2 + 1) % 2]))
+- wait_log_commit(log_root_tree, log_root_tree->log_transid - 1);
+-
+- wait_for_writer(log_root_tree);
+-
+- ret = btrfs_write_and_wait_marked_extents(log_root_tree,
+- &log_root_tree->dirty_log_pages);
++ ret = btrfs_write_and_wait_marked_extents(root->fs_info->log_root_tree,
++ &root->fs_info->log_root_tree->dirty_log_pages);
+ BUG_ON(ret);
+
+ btrfs_set_super_log_root(&root->fs_info->super_for_commit,
+- log_root_tree->node->start);
++ log->fs_info->log_root_tree->node->start);
+ btrfs_set_super_log_root_level(&root->fs_info->super_for_commit,
+- btrfs_header_level(log_root_tree->node));
+-
+- log_root_tree->log_batch = 0;
+- log_root_tree->log_transid++;
+- smp_mb();
+-
+- mutex_unlock(&log_root_tree->log_mutex);
+-
+- /*
+- * nobody else is going to jump in and write the the ctree
+- * super here because the log_commit atomic below is protecting
+- * us. We must be called with a transaction handle pinning
+- * the running transaction open, so a full commit can't hop
+- * in and cause problems either.
+- */
+- write_ctree_super(trans, root->fs_info->tree_root, 2);
++ btrfs_header_level(log->fs_info->log_root_tree->node));
+
+- atomic_set(&log_root_tree->log_commit[index2], 0);
++ write_ctree_super(trans, log->fs_info->tree_root, 2);
++ log->fs_info->tree_log_transid++;
++ log->fs_info->tree_log_batch = 0;
++ atomic_set(&log->fs_info->tree_log_commit, 0);
+ smp_mb();
+- if (waitqueue_active(&log_root_tree->log_commit_wait[index2]))
+- wake_up(&log_root_tree->log_commit_wait[index2]);
++ if (waitqueue_active(&log->fs_info->tree_log_wait))
++ wake_up(&log->fs_info->tree_log_wait);
+ out:
+- atomic_set(&root->log_commit[index1], 0);
+- smp_mb();
+- if (waitqueue_active(&root->log_commit_wait[index1]))
+- wake_up(&root->log_commit_wait[index1]);
++ mutex_unlock(&log->fs_info->tree_log_mutex);
+ return 0;
+ }
+
+@@ -2030,18 +2019,38 @@
+ start, end, GFP_NOFS);
+ }
+
+- if (log->log_transid > 0) {
+- ret = btrfs_del_root(trans, root->fs_info->log_root_tree,
+- &log->root_key);
+- BUG_ON(ret);
+- }
++ log = root->log_root;
++ ret = btrfs_del_root(trans, root->fs_info->log_root_tree,
++ &log->root_key);
++ BUG_ON(ret);
+ root->log_root = NULL;
+- free_extent_buffer(log->node);
+- kfree(log);
++ kfree(root->log_root);
+ return 0;
+ }
+
+ /*
++ * helper function to update the item for a given subvolumes log root
++ * in the tree of log roots
++ */
++static int update_log_root(struct btrfs_trans_handle *trans,
++ struct btrfs_root *log)
++{
++ u64 bytenr = btrfs_root_bytenr(&log->root_item);
++ int ret;
++
++ if (log->node->start == bytenr)
++ return 0;
++
++ btrfs_set_root_bytenr(&log->root_item, log->node->start);
++ btrfs_set_root_generation(&log->root_item, trans->transid);
++ btrfs_set_root_level(&log->root_item, btrfs_header_level(log->node));
++ ret = btrfs_update_root(trans, log->fs_info->log_root_tree,
++ &log->root_key, &log->root_item);
++ BUG_ON(ret);
++ return ret;
++}
++
++/*
+ * If both a file and directory are logged, and unlinks or renames are
+ * mixed in, we have a few interesting corners:
+ *
+@@ -2702,6 +2711,11 @@
+
+ btrfs_free_path(path);
+ btrfs_free_path(dst_path);
++
++ mutex_lock(&root->fs_info->tree_log_mutex);
++ ret = update_log_root(trans, log);
++ BUG_ON(ret);
++ mutex_unlock(&root->fs_info->tree_log_mutex);
+ out:
+ return 0;
+ }
+@@ -2832,9 +2846,7 @@
+ BUG_ON(!wc.replay_dest);
+
+ wc.replay_dest->log_root = log;
+- mutex_lock(&fs_info->trans_mutex);
+ btrfs_record_root_in_trans(wc.replay_dest);
+- mutex_unlock(&fs_info->trans_mutex);
+ ret = walk_log_tree(trans, log, &wc);
+ BUG_ON(ret);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/volumes.c linux-2.6.29-rc3.owrt/fs/btrfs/volumes.c
+--- linux-2.6.29.owrt/fs/btrfs/volumes.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/volumes.c 2009-05-10 23:48:29.000000000 +0200
+@@ -20,6 +20,7 @@
+ #include <linux/buffer_head.h>
+ #include <linux/blkdev.h>
+ #include <linux/random.h>
++#include <linux/version.h>
+ #include <asm/div64.h>
+ #include "compat.h"
+ #include "ctree.h"
+@@ -103,8 +104,10 @@
+ u64 devid, u8 *uuid)
+ {
+ struct btrfs_device *dev;
++ struct list_head *cur;
+
+- list_for_each_entry(dev, head, dev_list) {
++ list_for_each(cur, head) {
++ dev = list_entry(cur, struct btrfs_device, dev_list);
+ if (dev->devid == devid &&
+ (!uuid || !memcmp(dev->uuid, uuid, BTRFS_UUID_SIZE))) {
+ return dev;
+@@ -115,9 +118,11 @@
+
+ static noinline struct btrfs_fs_devices *find_fsid(u8 *fsid)
+ {
++ struct list_head *cur;
+ struct btrfs_fs_devices *fs_devices;
+
+- list_for_each_entry(fs_devices, &fs_uuids, list) {
++ list_for_each(cur, &fs_uuids) {
++ fs_devices = list_entry(cur, struct btrfs_fs_devices, list);
+ if (memcmp(fsid, fs_devices->fsid, BTRFS_FSID_SIZE) == 0)
+ return fs_devices;
+ }
+@@ -154,7 +159,6 @@
+ loop:
+ spin_lock(&device->io_lock);
+
+-loop_lock:
+ /* take all the bios off the list at once and process them
+ * later on (without the lock held). But, remember the
+ * tail and other pointers so the bios can be properly reinserted
+@@ -204,7 +208,7 @@
+ * is now congested. Back off and let other work structs
+ * run instead
+ */
+- if (pending && bdi_write_congested(bdi) && num_run > 16 &&
++ if (pending && bdi_write_congested(bdi) &&
+ fs_info->fs_devices->open_devices > 1) {
+ struct bio *old_head;
+
+@@ -216,8 +220,7 @@
+ tail->bi_next = old_head;
+ else
+ device->pending_bio_tail = tail;
+-
+- device->running_pending = 1;
++ device->running_pending = 0;
+
+ spin_unlock(&device->io_lock);
+ btrfs_requeue_work(&device->work);
+@@ -226,11 +229,6 @@
+ }
+ if (again)
+ goto loop;
+-
+- spin_lock(&device->io_lock);
+- if (device->pending_bios)
+- goto loop_lock;
+- spin_unlock(&device->io_lock);
+ done:
+ return 0;
+ }
+@@ -347,11 +345,14 @@
+
+ int btrfs_close_extra_devices(struct btrfs_fs_devices *fs_devices)
+ {
+- struct btrfs_device *device, *next;
++ struct list_head *tmp;
++ struct list_head *cur;
++ struct btrfs_device *device;
+
+ mutex_lock(&uuid_mutex);
+ again:
+- list_for_each_entry_safe(device, next, &fs_devices->devices, dev_list) {
++ list_for_each_safe(cur, tmp, &fs_devices->devices) {
++ device = list_entry(cur, struct btrfs_device, dev_list);
+ if (device->in_fs_metadata)
+ continue;
+
+@@ -382,12 +383,14 @@
+
+ static int __btrfs_close_devices(struct btrfs_fs_devices *fs_devices)
+ {
++ struct list_head *cur;
+ struct btrfs_device *device;
+
+ if (--fs_devices->opened > 0)
+ return 0;
+
+- list_for_each_entry(device, &fs_devices->devices, dev_list) {
++ list_for_each(cur, &fs_devices->devices) {
++ device = list_entry(cur, struct btrfs_device, dev_list);
+ if (device->bdev) {
+ close_bdev_exclusive(device->bdev, device->mode);
+ fs_devices->open_devices--;
+@@ -436,6 +439,7 @@
+ {
+ struct block_device *bdev;
+ struct list_head *head = &fs_devices->devices;
++ struct list_head *cur;
+ struct btrfs_device *device;
+ struct block_device *latest_bdev = NULL;
+ struct buffer_head *bh;
+@@ -446,7 +450,8 @@
+ int seeding = 1;
+ int ret = 0;
+
+- list_for_each_entry(device, head, dev_list) {
++ list_for_each(cur, head) {
++ device = list_entry(cur, struct btrfs_device, dev_list);
+ if (device->bdev)
+ continue;
+ if (!device->name)
+@@ -573,7 +578,7 @@
+ *(unsigned long long *)disk_super->fsid,
+ *(unsigned long long *)(disk_super->fsid + 8));
+ }
+- printk(KERN_CONT "devid %llu transid %llu %s\n",
++ printk(KERN_INFO "devid %llu transid %llu %s\n",
+ (unsigned long long)devid, (unsigned long long)transid, path);
+ ret = device_list_add(path, disk_super, devid, fs_devices_ret);
+
+@@ -1012,12 +1017,14 @@
+ }
+
+ if (strcmp(device_path, "missing") == 0) {
++ struct list_head *cur;
+ struct list_head *devices;
+ struct btrfs_device *tmp;
+
+ device = NULL;
+ devices = &root->fs_info->fs_devices->devices;
+- list_for_each_entry(tmp, devices, dev_list) {
++ list_for_each(cur, devices) {
++ tmp = list_entry(cur, struct btrfs_device, dev_list);
+ if (tmp->in_fs_metadata && !tmp->bdev) {
+ device = tmp;
+ break;
+@@ -1273,6 +1280,7 @@
+ struct btrfs_trans_handle *trans;
+ struct btrfs_device *device;
+ struct block_device *bdev;
++ struct list_head *cur;
+ struct list_head *devices;
+ struct super_block *sb = root->fs_info->sb;
+ u64 total_bytes;
+@@ -1296,7 +1304,8 @@
+ mutex_lock(&root->fs_info->volume_mutex);
+
+ devices = &root->fs_info->fs_devices->devices;
+- list_for_each_entry(device, devices, dev_list) {
++ list_for_each(cur, devices) {
++ device = list_entry(cur, struct btrfs_device, dev_list);
+ if (device->bdev == bdev) {
+ ret = -EEXIST;
+ goto error;
+@@ -1374,12 +1383,6 @@
+ ret = btrfs_add_device(trans, root, device);
+ }
+
+- /*
+- * we've got more storage, clear any full flags on the space
+- * infos
+- */
+- btrfs_clear_space_info_full(root->fs_info);
+-
+ unlock_chunks(root);
+ btrfs_commit_transaction(trans, root);
+
+@@ -1465,8 +1468,6 @@
+ device->fs_devices->total_rw_bytes += diff;
+
+ device->total_bytes = new_size;
+- btrfs_clear_space_info_full(device->dev_root->fs_info);
+-
+ return btrfs_update_device(trans, device);
+ }
+
+@@ -1703,6 +1704,7 @@
+ int btrfs_balance(struct btrfs_root *dev_root)
+ {
+ int ret;
++ struct list_head *cur;
+ struct list_head *devices = &dev_root->fs_info->fs_devices->devices;
+ struct btrfs_device *device;
+ u64 old_size;
+@@ -1721,7 +1723,8 @@
+ dev_root = dev_root->fs_info->dev_root;
+
+ /* step one make some room on all the devices */
+- list_for_each_entry(device, devices, dev_list) {
++ list_for_each(cur, devices) {
++ device = list_entry(cur, struct btrfs_device, dev_list);
+ old_size = device->total_bytes;
+ size_to_free = div_factor(old_size, 1);
+ size_to_free = min(size_to_free, (u64)1 * 1024 * 1024);
+@@ -2902,6 +2905,10 @@
+ free_extent_map(em);
+ }
+
++ map = kzalloc(sizeof(*map), GFP_NOFS);
++ if (!map)
++ return -ENOMEM;
++
+ em = alloc_extent_map(GFP_NOFS);
+ if (!em)
+ return -ENOMEM;
+@@ -3110,8 +3117,6 @@
+ if (!sb)
+ return -ENOMEM;
+ btrfs_set_buffer_uptodate(sb);
+- btrfs_set_buffer_lockdep_class(sb, 0);
+-
+ write_extent_buffer(sb, super_copy, 0, BTRFS_SUPER_INFO_SIZE);
+ array_size = btrfs_super_sys_array_size(super_copy);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/xattr.c linux-2.6.29-rc3.owrt/fs/btrfs/xattr.c
+--- linux-2.6.29.owrt/fs/btrfs/xattr.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/xattr.c 2009-05-10 23:48:29.000000000 +0200
+@@ -21,7 +21,6 @@
+ #include <linux/slab.h>
+ #include <linux/rwsem.h>
+ #include <linux/xattr.h>
+-#include <linux/security.h>
+ #include "ctree.h"
+ #include "btrfs_inode.h"
+ #include "transaction.h"
+@@ -46,12 +45,9 @@
+ /* lookup the xattr by name */
+ di = btrfs_lookup_xattr(NULL, root, path, inode->i_ino, name,
+ strlen(name), 0);
+- if (!di) {
++ if (!di || IS_ERR(di)) {
+ ret = -ENODATA;
+ goto out;
+- } else if (IS_ERR(di)) {
+- ret = PTR_ERR(di);
+- goto out;
+ }
+
+ leaf = path->nodes[0];
+@@ -66,14 +62,6 @@
+ ret = -ERANGE;
+ goto out;
+ }
+-
+- /*
+- * The way things are packed into the leaf is like this
+- * |struct btrfs_dir_item|name|data|
+- * where name is the xattr name, so security.foo, and data is the
+- * content of the xattr. data_ptr points to the location in memory
+- * where the data starts in the in memory leaf
+- */
+ data_ptr = (unsigned long)((char *)(di + 1) +
+ btrfs_dir_name_len(leaf, di));
+ read_extent_buffer(leaf, buffer, data_ptr,
+@@ -98,7 +86,7 @@
+ if (!path)
+ return -ENOMEM;
+
+- trans = btrfs_join_transaction(root, 1);
++ trans = btrfs_start_transaction(root, 1);
+ btrfs_set_trans_block_group(trans, inode);
+
+ /* first lets see if we already have this xattr */
+@@ -188,6 +176,7 @@
+ ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
+ if (ret < 0)
+ goto err;
++ ret = 0;
+ advance = 0;
+ while (1) {
+ leaf = path->nodes[0];
+@@ -331,34 +320,3 @@
+ return -EOPNOTSUPP;
+ return __btrfs_setxattr(dentry->d_inode, name, NULL, 0, XATTR_REPLACE);
+ }
+-
+-int btrfs_xattr_security_init(struct inode *inode, struct inode *dir)
+-{
+- int err;
+- size_t len;
+- void *value;
+- char *suffix;
+- char *name;
+-
+- err = security_inode_init_security(inode, dir, &suffix, &value, &len);
+- if (err) {
+- if (err == -EOPNOTSUPP)
+- return 0;
+- return err;
+- }
+-
+- name = kmalloc(XATTR_SECURITY_PREFIX_LEN + strlen(suffix) + 1,
+- GFP_NOFS);
+- if (!name) {
+- err = -ENOMEM;
+- } else {
+- strcpy(name, XATTR_SECURITY_PREFIX);
+- strcpy(name + XATTR_SECURITY_PREFIX_LEN, suffix);
+- err = __btrfs_setxattr(inode, name, value, len, 0);
+- kfree(name);
+- }
+-
+- kfree(suffix);
+- kfree(value);
+- return err;
+-}
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/btrfs/xattr.h linux-2.6.29-rc3.owrt/fs/btrfs/xattr.h
+--- linux-2.6.29.owrt/fs/btrfs/xattr.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/btrfs/xattr.h 2009-05-10 23:48:29.000000000 +0200
+@@ -36,6 +36,4 @@
+ const void *value, size_t size, int flags);
+ extern int btrfs_removexattr(struct dentry *dentry, const char *name);
+
+-extern int btrfs_xattr_security_init(struct inode *inode, struct inode *dir);
+-
+ #endif /* __XATTR__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/buffer.c linux-2.6.29-rc3.owrt/fs/buffer.c
+--- linux-2.6.29.owrt/fs/buffer.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/buffer.c 2009-05-10 23:48:29.000000000 +0200
+@@ -760,9 +760,15 @@
+ * If warn is true, then emit a warning if the page is not uptodate and has
+ * not been truncated.
+ */
+-static void __set_page_dirty(struct page *page,
++static int __set_page_dirty(struct page *page,
+ struct address_space *mapping, int warn)
+ {
++ if (unlikely(!mapping))
++ return !TestSetPageDirty(page);
++
++ if (TestSetPageDirty(page))
++ return 0;
++
+ spin_lock_irq(&mapping->tree_lock);
+ if (page->mapping) { /* Race with truncate? */
+ WARN_ON_ONCE(warn && !PageUptodate(page));
+@@ -771,7 +777,6 @@
+ __inc_zone_page_state(page, NR_FILE_DIRTY);
+ __inc_bdi_stat(mapping->backing_dev_info,
+ BDI_RECLAIMABLE);
+- task_dirty_inc(current);
+ task_io_account_write(PAGE_CACHE_SIZE);
+ }
+ radix_tree_tag_set(&mapping->page_tree,
+@@ -779,6 +784,8 @@
+ }
+ spin_unlock_irq(&mapping->tree_lock);
+ __mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
++
++ return 1;
+ }
+
+ /*
+@@ -808,7 +815,6 @@
+ */
+ int __set_page_dirty_buffers(struct page *page)
+ {
+- int newly_dirty;
+ struct address_space *mapping = page_mapping(page);
+
+ if (unlikely(!mapping))
+@@ -824,12 +830,9 @@
+ bh = bh->b_this_page;
+ } while (bh != head);
+ }
+- newly_dirty = !TestSetPageDirty(page);
+ spin_unlock(&mapping->private_lock);
+
+- if (newly_dirty)
+- __set_page_dirty(page, mapping, 1);
+- return newly_dirty;
++ return __set_page_dirty(page, mapping, 1);
+ }
+ EXPORT_SYMBOL(__set_page_dirty_buffers);
+
+@@ -1258,11 +1261,8 @@
+ return;
+ }
+
+- if (!test_set_buffer_dirty(bh)) {
+- struct page *page = bh->b_page;
+- if (!TestSetPageDirty(page))
+- __set_page_dirty(page, page_mapping(page), 0);
+- }
++ if (!test_set_buffer_dirty(bh))
++ __set_page_dirty(bh->b_page, page_mapping(bh->b_page), 0);
+ }
+
+ /*
+@@ -2688,7 +2688,7 @@
+ struct buffer_head *bh;
+ BUG_ON(fsdata != NULL && page_has_buffers(page));
+
+- if (unlikely(copied < len) && head)
++ if (unlikely(copied < len) && !page_has_buffers(page))
+ attach_nobh_buffers(page, head);
+ if (page_has_buffers(page))
+ return generic_write_end(file, mapping, pos, len,
+@@ -3108,7 +3108,7 @@
+ if (test_clear_buffer_dirty(bh)) {
+ get_bh(bh);
+ bh->b_end_io = end_buffer_write_sync;
+- ret = submit_bh(WRITE, bh);
++ ret = submit_bh(WRITE_SYNC, bh);
+ wait_on_buffer(bh);
+ if (buffer_eopnotsupp(bh)) {
+ clear_buffer_eopnotsupp(bh);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/cifs/CHANGES linux-2.6.29-rc3.owrt/fs/cifs/CHANGES
+--- linux-2.6.29.owrt/fs/cifs/CHANGES 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/cifs/CHANGES 2009-05-10 23:48:29.000000000 +0200
+@@ -1,13 +1,3 @@
+-Version 1.57
+-------------
+-Improve support for multiple security contexts to the same server. We
+-used to use the same "vcnumber" for all connections which could cause
+-the server to treat subsequent connections, especially those that
+-are authenticated as guest, as reconnections, invalidating the earlier
+-user's smb session. This fix allows cifs to mount multiple times to the
+-same server with different userids without risking invalidating earlier
+-established security contexts.
+-
+ Version 1.56
+ ------------
+ Add "forcemandatorylock" mount option to allow user to use mandatory
+@@ -15,12 +5,7 @@
+ support posix byte range locks. Fix query of root inode when prefixpath
+ specified and user does not have access to query information about the
+ top of the share. Fix problem in 2.6.28 resolving DFS paths to
+-Samba servers (worked to Windows). Fix rmdir so that pending search
+-(readdir) requests do not get invalid results which include the now
+-removed directory. Fix oops in cifs_dfs_ref.c when prefixpath is not reachable
+-when using DFS. Add better file create support to servers which support
+-the CIFS POSIX protocol extensions (this adds support for new flags
+-on create, and improves semantics for write of locked ranges).
++Samba servers (worked to Windows).
+
+ Version 1.55
+ ------------
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/cifs/cifsencrypt.c linux-2.6.29-rc3.owrt/fs/cifs/cifsencrypt.c
+--- linux-2.6.29.owrt/fs/cifs/cifsencrypt.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/cifs/cifsencrypt.c 2009-05-10 23:48:29.000000000 +0200
+@@ -48,11 +48,11 @@
+ if ((cifs_pdu == NULL) || (signature == NULL) || (key == NULL))
+ return -EINVAL;
+
+- cifs_MD5_init(&context);
+- cifs_MD5_update(&context, (char *)&key->data, key->len);
+- cifs_MD5_update(&context, cifs_pdu->Protocol, cifs_pdu->smb_buf_length);
++ MD5Init(&context);
++ MD5Update(&context, (char *)&key->data, key->len);
++ MD5Update(&context, cifs_pdu->Protocol, cifs_pdu->smb_buf_length);
+
+- cifs_MD5_final(signature, &context);
++ MD5Final(signature, &context);
+ return 0;
+ }
+
+@@ -96,8 +96,8 @@
+ if ((iov == NULL) || (signature == NULL) || (key == NULL))
+ return -EINVAL;
+
+- cifs_MD5_init(&context);
+- cifs_MD5_update(&context, (char *)&key->data, key->len);
++ MD5Init(&context);
++ MD5Update(&context, (char *)&key->data, key->len);
+ for (i = 0; i < n_vec; i++) {
+ if (iov[i].iov_len == 0)
+ continue;
+@@ -110,13 +110,13 @@
+ if (i == 0) {
+ if (iov[0].iov_len <= 8) /* cmd field at offset 9 */
+ break; /* nothing to sign or corrupt header */
+- cifs_MD5_update(&context, iov[0].iov_base+4,
++ MD5Update(&context, iov[0].iov_base+4,
+ iov[0].iov_len-4);
+ } else
+- cifs_MD5_update(&context, iov[i].iov_base, iov[i].iov_len);
++ MD5Update(&context, iov[i].iov_base, iov[i].iov_len);
+ }
+
+- cifs_MD5_final(signature, &context);
++ MD5Final(signature, &context);
+
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/cifs/cifsfs.h linux-2.6.29-rc3.owrt/fs/cifs/cifsfs.h
+--- linux-2.6.29.owrt/fs/cifs/cifsfs.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/cifs/cifsfs.h 2009-05-10 23:48:29.000000000 +0200
+@@ -100,5 +100,5 @@
+ extern const struct export_operations cifs_export_ops;
+ #endif /* EXPERIMENTAL */
+
+-#define CIFS_VERSION "1.57"
++#define CIFS_VERSION "1.56"
+ #endif /* _CIFSFS_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/cifs/cifsglob.h linux-2.6.29-rc3.owrt/fs/cifs/cifsglob.h
+--- linux-2.6.29.owrt/fs/cifs/cifsglob.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/cifs/cifsglob.h 2009-05-10 23:48:29.000000000 +0200
+@@ -164,12 +164,9 @@
+ /* multiplexed reads or writes */
+ unsigned int maxBuf; /* maxBuf specifies the maximum */
+ /* message size the server can send or receive for non-raw SMBs */
+- unsigned int max_rw; /* maxRw specifies the maximum */
++ unsigned int maxRw; /* maxRw specifies the maximum */
+ /* message size the server can send or receive for */
+ /* SMB_COM_WRITE_RAW or SMB_COM_READ_RAW. */
+- unsigned int max_vcs; /* maximum number of smb sessions, at least
+- those that can be specified uniquely with
+- vcnumbers */
+ char sessid[4]; /* unique token id for this session */
+ /* (returned on Negotiate */
+ int capabilities; /* allow selective disabling of caps by smb sess */
+@@ -213,7 +210,6 @@
+ unsigned overrideSecFlg; /* if non-zero override global sec flags */
+ __u16 ipc_tid; /* special tid for connection to IPC share */
+ __u16 flags;
+- __u16 vcnum;
+ char *serverOS; /* name of operating system underlying server */
+ char *serverNOS; /* name of network operating system of server */
+ char *serverDomain; /* security realm of server */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/cifs/cifsproto.h linux-2.6.29-rc3.owrt/fs/cifs/cifsproto.h
+--- linux-2.6.29.owrt/fs/cifs/cifsproto.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/cifs/cifsproto.h 2009-05-10 23:48:29.000000000 +0200
+@@ -35,14 +35,13 @@
+ extern void cifs_buf_release(void *);
+ extern struct smb_hdr *cifs_small_buf_get(void);
+ extern void cifs_small_buf_release(void *);
+-extern int smb_send(struct TCP_Server_Info *, struct smb_hdr *,
+- unsigned int /* length */);
++extern int smb_send(struct socket *, struct smb_hdr *,
++ unsigned int /* length */ , struct sockaddr *, bool);
+ extern unsigned int _GetXid(void);
+ extern void _FreeXid(unsigned int);
+ #define GetXid() (int)_GetXid(); cFYI(1,("CIFS VFS: in %s as Xid: %d with uid: %d",__func__, xid,current_fsuid()));
+ #define FreeXid(curr_xid) {_FreeXid(curr_xid); cFYI(1,("CIFS VFS: leaving %s (xid = %d) rc = %d",__func__,curr_xid,(int)rc));}
+ extern char *build_path_from_dentry(struct dentry *);
+-extern char *cifs_build_path_to_root(struct cifs_sb_info *cifs_sb);
+ extern char *build_wildcard_path_from_dentry(struct dentry *direntry);
+ /* extern void renew_parental_timestamps(struct dentry *direntry);*/
+ extern int SendReceive(const unsigned int /* xid */ , struct cifsSesInfo *,
+@@ -92,9 +91,6 @@
+ extern __le64 cnvrtDosCifsTm(__u16 date, __u16 time);
+ extern struct timespec cnvrtDosUnixTm(__u16 date, __u16 time);
+
+-extern void posix_fill_in_inode(struct inode *tmp_inode,
+- FILE_UNIX_BASIC_INFO *pData, int isNewInode);
+-extern struct inode *cifs_new_inode(struct super_block *sb, __u64 *inum);
+ extern int cifs_get_inode_info(struct inode **pinode,
+ const unsigned char *search_path,
+ FILE_ALL_INFO *pfile_info,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/cifs/cifssmb.c linux-2.6.29-rc3.owrt/fs/cifs/cifssmb.c
+--- linux-2.6.29.owrt/fs/cifs/cifssmb.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/cifs/cifssmb.c 2009-05-10 23:48:29.000000000 +0200
+@@ -528,15 +528,14 @@
+ server->maxReq = le16_to_cpu(rsp->MaxMpxCount);
+ server->maxBuf = min((__u32)le16_to_cpu(rsp->MaxBufSize),
+ (__u32)CIFSMaxBufSize + MAX_CIFS_HDR_SIZE);
+- server->max_vcs = le16_to_cpu(rsp->MaxNumberVcs);
+ GETU32(server->sessid) = le32_to_cpu(rsp->SessionKey);
+ /* even though we do not use raw we might as well set this
+ accurately, in case we ever find a need for it */
+ if ((le16_to_cpu(rsp->RawMode) & RAW_ENABLE) == RAW_ENABLE) {
+- server->max_rw = 0xFF00;
++ server->maxRw = 0xFF00;
+ server->capabilities = CAP_MPX_MODE | CAP_RAW_MODE;
+ } else {
+- server->max_rw = 0;/* do not need to use raw anyway */
++ server->maxRw = 0;/* we do not need to use raw anyway */
+ server->capabilities = CAP_MPX_MODE;
+ }
+ tmp = (__s16)le16_to_cpu(rsp->ServerTimeZone);
+@@ -639,7 +638,7 @@
+ /* probably no need to store and check maxvcs */
+ server->maxBuf = min(le32_to_cpu(pSMBr->MaxBufferSize),
+ (__u32) CIFSMaxBufSize + MAX_CIFS_HDR_SIZE);
+- server->max_rw = le32_to_cpu(pSMBr->MaxRawSize);
++ server->maxRw = le32_to_cpu(pSMBr->MaxRawSize);
+ cFYI(DBG2, ("Max buf = %d", ses->server->maxBuf));
+ GETU32(ses->server->sessid) = le32_to_cpu(pSMBr->SessionKey);
+ server->capabilities = le32_to_cpu(pSMBr->Capabilities);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/cifs/connect.c linux-2.6.29-rc3.owrt/fs/cifs/connect.c
+--- linux-2.6.29.owrt/fs/cifs/connect.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/cifs/connect.c 2009-05-10 23:48:29.000000000 +0200
+@@ -23,6 +23,7 @@
+ #include <linux/string.h>
+ #include <linux/list.h>
+ #include <linux/wait.h>
++#include <linux/ipv6.h>
+ #include <linux/pagemap.h>
+ #include <linux/ctype.h>
+ #include <linux/utsname.h>
+@@ -34,7 +35,6 @@
+ #include <linux/freezer.h>
+ #include <asm/uaccess.h>
+ #include <asm/processor.h>
+-#include <net/ipv6.h>
+ #include "cifspdu.h"
+ #include "cifsglob.h"
+ #include "cifsproto.h"
+@@ -1354,7 +1354,7 @@
+ }
+
+ static struct TCP_Server_Info *
+-cifs_find_tcp_session(struct sockaddr_storage *addr)
++cifs_find_tcp_session(struct sockaddr *addr)
+ {
+ struct list_head *tmp;
+ struct TCP_Server_Info *server;
+@@ -1374,13 +1374,13 @@
+ if (server->tcpStatus == CifsNew)
+ continue;
+
+- if (addr->ss_family == AF_INET &&
++ if (addr->sa_family == AF_INET &&
+ (addr4->sin_addr.s_addr !=
+ server->addr.sockAddr.sin_addr.s_addr))
+ continue;
+- else if (addr->ss_family == AF_INET6 &&
+- !ipv6_addr_equal(&server->addr.sockAddr6.sin6_addr,
+- &addr6->sin6_addr))
++ else if (addr->sa_family == AF_INET6 &&
++ memcmp(&server->addr.sockAddr6.sin6_addr,
++ &addr6->sin6_addr, sizeof(addr6->sin6_addr)))
+ continue;
+
+ ++server->srv_count;
+@@ -1419,12 +1419,12 @@
+ cifs_get_tcp_session(struct smb_vol *volume_info)
+ {
+ struct TCP_Server_Info *tcp_ses = NULL;
+- struct sockaddr_storage addr;
++ struct sockaddr addr;
+ struct sockaddr_in *sin_server = (struct sockaddr_in *) &addr;
+ struct sockaddr_in6 *sin_server6 = (struct sockaddr_in6 *) &addr;
+ int rc;
+
+- memset(&addr, 0, sizeof(struct sockaddr_storage));
++ memset(&addr, 0, sizeof(struct sockaddr));
+
+ if (volume_info->UNCip && volume_info->UNC) {
+ rc = cifs_inet_pton(AF_INET, volume_info->UNCip,
+@@ -1435,9 +1435,9 @@
+ rc = cifs_inet_pton(AF_INET6, volume_info->UNCip,
+ &sin_server6->sin6_addr.in6_u);
+ if (rc > 0)
+- addr.ss_family = AF_INET6;
++ addr.sa_family = AF_INET6;
+ } else {
+- addr.ss_family = AF_INET;
++ addr.sa_family = AF_INET;
+ }
+
+ if (rc <= 0) {
+@@ -1502,7 +1502,7 @@
+ tcp_ses->tcpStatus = CifsNew;
+ ++tcp_ses->srv_count;
+
+- if (addr.ss_family == AF_INET6) {
++ if (addr.sa_family == AF_INET6) {
+ cFYI(1, ("attempting ipv6 connect"));
+ /* BB should we allow ipv6 on port 139? */
+ /* other OS never observed in Wild doing 139 with v6 */
+@@ -1802,7 +1802,7 @@
+ * user space buffer
+ */
+ socket->sk->sk_rcvtimeo = 7 * HZ;
+- socket->sk->sk_sndtimeo = 5 * HZ;
++ socket->sk->sk_sndtimeo = 3 * HZ;
+
+ /* make the bufsizes depend on wsize/rsize and max requests */
+ if (server->noautotune) {
+@@ -1860,7 +1860,9 @@
+ smb_buf = (struct smb_hdr *)ses_init_buf;
+ /* sizeof RFC1002_SESSION_REQUEST with no scope */
+ smb_buf->smb_buf_length = 0x81000044;
+- rc = smb_send(server, smb_buf, 0x44);
++ rc = smb_send(socket, smb_buf, 0x44,
++ (struct sockaddr *) &server->addr.sockAddr,
++ server->noblocksnd);
+ kfree(ses_init_buf);
+ msleep(1); /* RFC1001 layer in at least one server
+ requires very short break before negprot
+@@ -1953,7 +1955,7 @@
+ * user space buffer
+ */
+ socket->sk->sk_rcvtimeo = 7 * HZ;
+- socket->sk->sk_sndtimeo = 5 * HZ;
++ socket->sk->sk_sndtimeo = 3 * HZ;
+ server->ssocket = socket;
+
+ return rc;
+@@ -2180,33 +2182,6 @@
+ "mount option supported"));
+ }
+
+-static int
+-is_path_accessible(int xid, struct cifsTconInfo *tcon,
+- struct cifs_sb_info *cifs_sb, const char *full_path)
+-{
+- int rc;
+- __u64 inode_num;
+- FILE_ALL_INFO *pfile_info;
+-
+- rc = CIFSGetSrvInodeNumber(xid, tcon, full_path, &inode_num,
+- cifs_sb->local_nls,
+- cifs_sb->mnt_cifs_flags &
+- CIFS_MOUNT_MAP_SPECIAL_CHR);
+- if (rc != -EOPNOTSUPP)
+- return rc;
+-
+- pfile_info = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
+- if (pfile_info == NULL)
+- return -ENOMEM;
+-
+- rc = CIFSSMBQPathInfo(xid, tcon, full_path, pfile_info,
+- 0 /* not legacy */, cifs_sb->local_nls,
+- cifs_sb->mnt_cifs_flags &
+- CIFS_MOUNT_MAP_SPECIAL_CHR);
+- kfree(pfile_info);
+- return rc;
+-}
+-
+ int
+ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
+ char *mount_data, const char *devname)
+@@ -2217,7 +2192,6 @@
+ struct cifsSesInfo *pSesInfo = NULL;
+ struct cifsTconInfo *tcon = NULL;
+ struct TCP_Server_Info *srvTcp = NULL;
+- char *full_path;
+
+ xid = GetXid();
+
+@@ -2454,23 +2428,6 @@
+ cifs_sb->rsize = min(cifs_sb->rsize,
+ (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE));
+
+- if (!rc && cifs_sb->prepathlen) {
+- /* build_path_to_root works only when we have a valid tcon */
+- full_path = cifs_build_path_to_root(cifs_sb);
+- if (full_path == NULL) {
+- rc = -ENOMEM;
+- goto mount_fail_check;
+- }
+- rc = is_path_accessible(xid, tcon, cifs_sb, full_path);
+- if (rc) {
+- cERROR(1, ("Path %s in not accessible: %d",
+- full_path, rc));
+- kfree(full_path);
+- goto mount_fail_check;
+- }
+- kfree(full_path);
+- }
+-
+ /* volume_info->password is freed above when existing session found
+ (in which case it is not needed anymore) but when new sesion is created
+ the password ptr is put in the new session structure (in which case the
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/cifs/dir.c linux-2.6.29-rc3.owrt/fs/cifs/dir.c
+--- linux-2.6.29.owrt/fs/cifs/dir.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/cifs/dir.c 2009-05-10 23:48:29.000000000 +0200
+@@ -3,7 +3,7 @@
+ *
+ * vfs operations that deal with dentries
+ *
+- * Copyright (C) International Business Machines Corp., 2002,2009
++ * Copyright (C) International Business Machines Corp., 2002,2008
+ * Author(s): Steve French (sfrench@us.ibm.com)
+ *
+ * This library is free software; you can redistribute it and/or modify
+@@ -129,89 +129,6 @@
+ return full_path;
+ }
+
+-static int cifs_posix_open(char *full_path, struct inode **pinode,
+- struct super_block *sb, int mode, int oflags,
+- int *poplock, __u16 *pnetfid, int xid)
+-{
+- int rc;
+- __u32 oplock;
+- FILE_UNIX_BASIC_INFO *presp_data;
+- __u32 posix_flags = 0;
+- struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
+-
+- cFYI(1, ("posix open %s", full_path));
+-
+- presp_data = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
+- if (presp_data == NULL)
+- return -ENOMEM;
+-
+-/* So far cifs posix extensions can only map the following flags.
+- There are other valid fmode oflags such as FMODE_LSEEK, FMODE_PREAD, but
+- so far we do not seem to need them, and we can treat them as local only */
+- if ((oflags & (FMODE_READ | FMODE_WRITE)) ==
+- (FMODE_READ | FMODE_WRITE))
+- posix_flags = SMB_O_RDWR;
+- else if (oflags & FMODE_READ)
+- posix_flags = SMB_O_RDONLY;
+- else if (oflags & FMODE_WRITE)
+- posix_flags = SMB_O_WRONLY;
+- if (oflags & O_CREAT)
+- posix_flags |= SMB_O_CREAT;
+- if (oflags & O_EXCL)
+- posix_flags |= SMB_O_EXCL;
+- if (oflags & O_TRUNC)
+- posix_flags |= SMB_O_TRUNC;
+- if (oflags & O_APPEND)
+- posix_flags |= SMB_O_APPEND;
+- if (oflags & O_SYNC)
+- posix_flags |= SMB_O_SYNC;
+- if (oflags & O_DIRECTORY)
+- posix_flags |= SMB_O_DIRECTORY;
+- if (oflags & O_NOFOLLOW)
+- posix_flags |= SMB_O_NOFOLLOW;
+- if (oflags & O_DIRECT)
+- posix_flags |= SMB_O_DIRECT;
+-
+-
+- rc = CIFSPOSIXCreate(xid, cifs_sb->tcon, posix_flags, mode,
+- pnetfid, presp_data, &oplock, full_path,
+- cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
+- CIFS_MOUNT_MAP_SPECIAL_CHR);
+- if (rc)
+- goto posix_open_ret;
+-
+- if (presp_data->Type == cpu_to_le32(-1))
+- goto posix_open_ret; /* open ok, caller does qpathinfo */
+-
+- /* get new inode and set it up */
+- if (!pinode)
+- goto posix_open_ret; /* caller does not need info */
+-
+- *pinode = cifs_new_inode(sb, &presp_data->UniqueId);
+-
+- /* We do not need to close the file if new_inode fails since
+- the caller will retry qpathinfo as long as inode is null */
+- if (*pinode == NULL)
+- goto posix_open_ret;
+-
+- posix_fill_in_inode(*pinode, presp_data, 1);
+-
+-posix_open_ret:
+- kfree(presp_data);
+- return rc;
+-}
+-
+-static void setup_cifs_dentry(struct cifsTconInfo *tcon,
+- struct dentry *direntry,
+- struct inode *newinode)
+-{
+- if (tcon->nocase)
+- direntry->d_op = &cifs_ci_dentry_ops;
+- else
+- direntry->d_op = &cifs_dentry_ops;
+- d_instantiate(direntry, newinode);
+-}
+-
+ /* Inode operations in similar order to how they appear in Linux file fs.h */
+
+ int
+@@ -222,21 +139,14 @@
+ int xid;
+ int create_options = CREATE_NOT_DIR;
+ int oplock = 0;
+- int oflags;
+- /*
+- * BB below access is probably too much for mknod to request
+- * but we have to do query and setpathinfo so requesting
+- * less could fail (unless we want to request getatr and setatr
+- * permissions (only). At least for POSIX we do not have to
+- * request so much.
+- */
+ int desiredAccess = GENERIC_READ | GENERIC_WRITE;
+ __u16 fileHandle;
+ struct cifs_sb_info *cifs_sb;
+- struct cifsTconInfo *tcon;
++ struct cifsTconInfo *pTcon;
+ char *full_path = NULL;
+ FILE_ALL_INFO *buf = NULL;
+ struct inode *newinode = NULL;
++ struct cifsFileInfo *pCifsFile = NULL;
+ struct cifsInodeInfo *pCifsInode;
+ int disposition = FILE_OVERWRITE_IF;
+ bool write_only = false;
+@@ -244,7 +154,7 @@
+ xid = GetXid();
+
+ cifs_sb = CIFS_SB(inode->i_sb);
+- tcon = cifs_sb->tcon;
++ pTcon = cifs_sb->tcon;
+
+ full_path = build_path_from_dentry(direntry);
+ if (full_path == NULL) {
+@@ -252,44 +162,12 @@
+ return -ENOMEM;
+ }
+
+- mode &= ~current->fs->umask;
+- if (oplockEnabled)
+- oplock = REQ_OPLOCK;
+-
+- if (nd && (nd->flags & LOOKUP_OPEN))
+- oflags = nd->intent.open.flags;
+- else
+- oflags = FMODE_READ;
+-
+- if (tcon->unix_ext && (tcon->ses->capabilities & CAP_UNIX) &&
+- (CIFS_UNIX_POSIX_PATH_OPS_CAP &
+- le64_to_cpu(tcon->fsUnixInfo.Capability))) {
+- rc = cifs_posix_open(full_path, &newinode, inode->i_sb,
+- mode, oflags, &oplock, &fileHandle, xid);
+- /* EIO could indicate that (posix open) operation is not
+- supported, despite what server claimed in capability
+- negotation. EREMOTE indicates DFS junction, which is not
+- handled in posix open */
+-
+- if ((rc == 0) && (newinode == NULL))
+- goto cifs_create_get_file_info; /* query inode info */
+- else if (rc == 0) /* success, no need to query */
+- goto cifs_create_set_dentry;
+- else if ((rc != -EIO) && (rc != -EREMOTE) &&
+- (rc != -EOPNOTSUPP)) /* path not found or net err */
+- goto cifs_create_out;
+- /* else fallthrough to retry, using older open call, this is
+- case where server does not support this SMB level, and
+- falsely claims capability (also get here for DFS case
+- which should be rare for path not covered on files) */
+- }
+-
+ if (nd && (nd->flags & LOOKUP_OPEN)) {
+- /* if the file is going to stay open, then we
+- need to set the desired access properly */
++ int oflags = nd->intent.open.flags;
++
+ desiredAccess = 0;
+ if (oflags & FMODE_READ)
+- desiredAccess |= GENERIC_READ; /* is this too little? */
++ desiredAccess |= GENERIC_READ;
+ if (oflags & FMODE_WRITE) {
+ desiredAccess |= GENERIC_WRITE;
+ if (!(oflags & FMODE_READ))
+@@ -308,6 +186,8 @@
+
+ /* BB add processing to set equivalent of mode - e.g. via CreateX with
+ ACLs */
++ if (oplockEnabled)
++ oplock = REQ_OPLOCK;
+
+ buf = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
+ if (buf == NULL) {
+@@ -316,15 +196,17 @@
+ return -ENOMEM;
+ }
+
++ mode &= ~current->fs->umask;
++
+ /*
+ * if we're not using unix extensions, see if we need to set
+ * ATTR_READONLY on the create call
+ */
+- if (!tcon->unix_ext && (mode & S_IWUGO) == 0)
++ if (!pTcon->unix_ext && (mode & S_IWUGO) == 0)
+ create_options |= CREATE_OPTION_READONLY;
+
+ if (cifs_sb->tcon->ses->capabilities & CAP_NT_SMBS)
+- rc = CIFSSMBOpen(xid, tcon, full_path, disposition,
++ rc = CIFSSMBOpen(xid, pTcon, full_path, disposition,
+ desiredAccess, create_options,
+ &fileHandle, &oplock, buf, cifs_sb->local_nls,
+ cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
+@@ -333,119 +215,128 @@
+
+ if (rc == -EIO) {
+ /* old server, retry the open legacy style */
+- rc = SMBLegacyOpen(xid, tcon, full_path, disposition,
++ rc = SMBLegacyOpen(xid, pTcon, full_path, disposition,
+ desiredAccess, create_options,
+ &fileHandle, &oplock, buf, cifs_sb->local_nls,
+ cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
+ }
+ if (rc) {
+ cFYI(1, ("cifs_create returned 0x%x", rc));
+- goto cifs_create_out;
+- }
+-
+- /* If Open reported that we actually created a file
+- then we now have to set the mode if possible */
+- if ((tcon->unix_ext) && (oplock & CIFS_CREATE_ACTION)) {
+- struct cifs_unix_set_info_args args = {
++ } else {
++ /* If Open reported that we actually created a file
++ then we now have to set the mode if possible */
++ if ((pTcon->unix_ext) && (oplock & CIFS_CREATE_ACTION)) {
++ struct cifs_unix_set_info_args args = {
+ .mode = mode,
+ .ctime = NO_CHANGE_64,
+ .atime = NO_CHANGE_64,
+ .mtime = NO_CHANGE_64,
+ .device = 0,
+- };
++ };
+
+- if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
+- args.uid = (__u64) current_fsuid();
+- if (inode->i_mode & S_ISGID)
+- args.gid = (__u64) inode->i_gid;
+- else
+- args.gid = (__u64) current_fsgid();
+- } else {
+- args.uid = NO_CHANGE_64;
+- args.gid = NO_CHANGE_64;
+- }
+- CIFSSMBUnixSetInfo(xid, tcon, full_path, &args,
+- cifs_sb->local_nls,
+- cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
+- } else {
+- /* BB implement mode setting via Windows security
+- descriptors e.g. */
+- /* CIFSSMBWinSetPerms(xid,tcon,path,mode,-1,-1,nls);*/
+-
+- /* Could set r/o dos attribute if mode & 0222 == 0 */
+- }
+-
+-cifs_create_get_file_info:
+- /* server might mask mode so we have to query for it */
+- if (tcon->unix_ext)
+- rc = cifs_get_inode_info_unix(&newinode, full_path,
+- inode->i_sb, xid);
+- else {
+- rc = cifs_get_inode_info(&newinode, full_path, buf,
+- inode->i_sb, xid, &fileHandle);
+- if (newinode) {
+- if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)
+- newinode->i_mode = mode;
+- if ((oplock & CIFS_CREATE_ACTION) &&
+- (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID)) {
+- newinode->i_uid = current_fsuid();
++ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
++ args.uid = (__u64) current_fsuid();
+ if (inode->i_mode & S_ISGID)
+- newinode->i_gid = inode->i_gid;
++ args.gid = (__u64) inode->i_gid;
+ else
+- newinode->i_gid = current_fsgid();
++ args.gid = (__u64) current_fsgid();
++ } else {
++ args.uid = NO_CHANGE_64;
++ args.gid = NO_CHANGE_64;
+ }
++ CIFSSMBUnixSetInfo(xid, pTcon, full_path, &args,
++ cifs_sb->local_nls,
++ cifs_sb->mnt_cifs_flags &
++ CIFS_MOUNT_MAP_SPECIAL_CHR);
++ } else {
++ /* BB implement mode setting via Windows security
++ descriptors e.g. */
++ /* CIFSSMBWinSetPerms(xid,pTcon,path,mode,-1,-1,nls);*/
++
++ /* Could set r/o dos attribute if mode & 0222 == 0 */
+ }
+- }
+
+-cifs_create_set_dentry:
+- if (rc == 0)
+- setup_cifs_dentry(tcon, direntry, newinode);
+- else
+- cFYI(1, ("Create worked, get_inode_info failed rc = %d", rc));
++ /* server might mask mode so we have to query for it */
++ if (pTcon->unix_ext)
++ rc = cifs_get_inode_info_unix(&newinode, full_path,
++ inode->i_sb, xid);
++ else {
++ rc = cifs_get_inode_info(&newinode, full_path,
++ buf, inode->i_sb, xid,
++ &fileHandle);
++ if (newinode) {
++ if (cifs_sb->mnt_cifs_flags &
++ CIFS_MOUNT_DYNPERM)
++ newinode->i_mode = mode;
++ if ((oplock & CIFS_CREATE_ACTION) &&
++ (cifs_sb->mnt_cifs_flags &
++ CIFS_MOUNT_SET_UID)) {
++ newinode->i_uid = current_fsuid();
++ if (inode->i_mode & S_ISGID)
++ newinode->i_gid =
++ inode->i_gid;
++ else
++ newinode->i_gid =
++ current_fsgid();
++ }
++ }
++ }
+
+- /* nfsd case - nfs srv does not set nd */
+- if ((nd == NULL) || (!(nd->flags & LOOKUP_OPEN))) {
+- /* mknod case - do not leave file open */
+- CIFSSMBClose(xid, tcon, fileHandle);
+- } else if (newinode) {
+- struct cifsFileInfo *pCifsFile =
+- kzalloc(sizeof(struct cifsFileInfo), GFP_KERNEL);
+-
+- if (pCifsFile == NULL)
+- goto cifs_create_out;
+- pCifsFile->netfid = fileHandle;
+- pCifsFile->pid = current->tgid;
+- pCifsFile->pInode = newinode;
+- pCifsFile->invalidHandle = false;
+- pCifsFile->closePend = false;
+- init_MUTEX(&pCifsFile->fh_sem);
+- mutex_init(&pCifsFile->lock_mutex);
+- INIT_LIST_HEAD(&pCifsFile->llist);
+- atomic_set(&pCifsFile->wrtPending, 0);
++ if (rc != 0) {
++ cFYI(1,
++ ("Create worked but get_inode_info failed rc = %d",
++ rc));
++ } else {
++ if (pTcon->nocase)
++ direntry->d_op = &cifs_ci_dentry_ops;
++ else
++ direntry->d_op = &cifs_dentry_ops;
++ d_instantiate(direntry, newinode);
++ }
++ if ((nd == NULL /* nfsd case - nfs srv does not set nd */) ||
++ (!(nd->flags & LOOKUP_OPEN))) {
++ /* mknod case - do not leave file open */
++ CIFSSMBClose(xid, pTcon, fileHandle);
++ } else if (newinode) {
++ pCifsFile =
++ kzalloc(sizeof(struct cifsFileInfo), GFP_KERNEL);
++
++ if (pCifsFile == NULL)
++ goto cifs_create_out;
++ pCifsFile->netfid = fileHandle;
++ pCifsFile->pid = current->tgid;
++ pCifsFile->pInode = newinode;
++ pCifsFile->invalidHandle = false;
++ pCifsFile->closePend = false;
++ init_MUTEX(&pCifsFile->fh_sem);
++ mutex_init(&pCifsFile->lock_mutex);
++ INIT_LIST_HEAD(&pCifsFile->llist);
++ atomic_set(&pCifsFile->wrtPending, 0);
+
+- /* set the following in open now
++ /* set the following in open now
+ pCifsFile->pfile = file; */
+- write_lock(&GlobalSMBSeslock);
+- list_add(&pCifsFile->tlist, &tcon->openFileList);
+- pCifsInode = CIFS_I(newinode);
+- if (pCifsInode) {
+- /* if readable file instance put first in list*/
+- if (write_only) {
+- list_add_tail(&pCifsFile->flist,
+- &pCifsInode->openFileList);
+- } else {
+- list_add(&pCifsFile->flist,
+- &pCifsInode->openFileList);
++ write_lock(&GlobalSMBSeslock);
++ list_add(&pCifsFile->tlist, &pTcon->openFileList);
++ pCifsInode = CIFS_I(newinode);
++ if (pCifsInode) {
++ /* if readable file instance put first in list*/
++ if (write_only) {
++ list_add_tail(&pCifsFile->flist,
++ &pCifsInode->openFileList);
++ } else {
++ list_add(&pCifsFile->flist,
++ &pCifsInode->openFileList);
++ }
++ if ((oplock & 0xF) == OPLOCK_EXCLUSIVE) {
++ pCifsInode->clientCanCacheAll = true;
++ pCifsInode->clientCanCacheRead = true;
++ cFYI(1, ("Exclusive Oplock inode %p",
++ newinode));
++ } else if ((oplock & 0xF) == OPLOCK_READ)
++ pCifsInode->clientCanCacheRead = true;
+ }
+- if ((oplock & 0xF) == OPLOCK_EXCLUSIVE) {
+- pCifsInode->clientCanCacheAll = true;
+- pCifsInode->clientCanCacheRead = true;
+- cFYI(1, ("Exclusive Oplock inode %p",
+- newinode));
+- } else if ((oplock & 0xF) == OPLOCK_READ)
+- pCifsInode->clientCanCacheRead = true;
++ write_unlock(&GlobalSMBSeslock);
+ }
+- write_unlock(&GlobalSMBSeslock);
+ }
+ cifs_create_out:
+ kfree(buf);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/cifs/inode.c linux-2.6.29-rc3.owrt/fs/cifs/inode.c
+--- linux-2.6.29.owrt/fs/cifs/inode.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/cifs/inode.c 2009-05-10 23:48:29.000000000 +0200
+@@ -199,49 +199,6 @@
+ pfnd_dat->Gid = cpu_to_le64(pinode->i_gid);
+ }
+
+-/**
+- * cifs_new inode - create new inode, initialize, and hash it
+- * @sb - pointer to superblock
+- * @inum - if valid pointer and serverino is enabled, replace i_ino with val
+- *
+- * Create a new inode, initialize it for CIFS and hash it. Returns the new
+- * inode or NULL if one couldn't be allocated.
+- *
+- * If the share isn't mounted with "serverino" or inum is a NULL pointer then
+- * we'll just use the inode number assigned by new_inode(). Note that this can
+- * mean i_ino collisions since the i_ino assigned by new_inode is not
+- * guaranteed to be unique.
+- */
+-struct inode *
+-cifs_new_inode(struct super_block *sb, __u64 *inum)
+-{
+- struct inode *inode;
+-
+- inode = new_inode(sb);
+- if (inode == NULL)
+- return NULL;
+-
+- /*
+- * BB: Is i_ino == 0 legal? Here, we assume that it is. If it isn't we
+- * stop passing inum as ptr. Are there sanity checks we can use to
+- * ensure that the server is really filling in that field? Also,
+- * if serverino is disabled, perhaps we should be using iunique()?
+- */
+- if (inum && (CIFS_SB(sb)->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM))
+- inode->i_ino = (unsigned long) *inum;
+-
+- /*
+- * must set this here instead of cifs_alloc_inode since VFS will
+- * clobber i_flags
+- */
+- if (sb->s_flags & MS_NOATIME)
+- inode->i_flags |= S_NOATIME | S_NOCMTIME;
+-
+- insert_inode_hash(inode);
+-
+- return inode;
+-}
+-
+ int cifs_get_inode_info_unix(struct inode **pinode,
+ const unsigned char *full_path, struct super_block *sb, int xid)
+ {
+@@ -276,11 +233,22 @@
+
+ /* get new inode */
+ if (*pinode == NULL) {
+- *pinode = cifs_new_inode(sb, &find_data.UniqueId);
++ *pinode = new_inode(sb);
+ if (*pinode == NULL) {
+ rc = -ENOMEM;
+ goto cgiiu_exit;
+ }
++ /* Is an i_ino of zero legal? */
++ /* note ino incremented to unique num in new_inode */
++ /* Are there sanity checks we can use to ensure that
++ the server is really filling in that field? */
++ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
++ (*pinode)->i_ino = (unsigned long)find_data.UniqueId;
++
++ if (sb->s_flags & MS_NOATIME)
++ (*pinode)->i_flags |= S_NOATIME | S_NOCMTIME;
++
++ insert_inode_hash(*pinode);
+ }
+
+ inode = *pinode;
+@@ -497,9 +465,11 @@
+
+ /* get new inode */
+ if (*pinode == NULL) {
+- __u64 inode_num;
+- __u64 *pinum = &inode_num;
+-
++ *pinode = new_inode(sb);
++ if (*pinode == NULL) {
++ rc = -ENOMEM;
++ goto cgii_exit;
++ }
+ /* Is an i_ino of zero legal? Can we use that to check
+ if the server supports returning inode numbers? Are
+ there other sanity checks we can use to ensure that
+@@ -516,26 +486,22 @@
+
+ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
+ int rc1 = 0;
++ __u64 inode_num;
+
+ rc1 = CIFSGetSrvInodeNumber(xid, pTcon,
+- full_path, pinum,
++ full_path, &inode_num,
+ cifs_sb->local_nls,
+ cifs_sb->mnt_cifs_flags &
+ CIFS_MOUNT_MAP_SPECIAL_CHR);
+ if (rc1) {
+ cFYI(1, ("GetSrvInodeNum rc %d", rc1));
+- pinum = NULL;
+ /* BB EOPNOSUPP disable SERVER_INUM? */
+- }
+- } else {
+- pinum = NULL;
+- }
+-
+- *pinode = cifs_new_inode(sb, pinum);
+- if (*pinode == NULL) {
+- rc = -ENOMEM;
+- goto cgii_exit;
+- }
++ } else /* do we need cast or hash to ino? */
++ (*pinode)->i_ino = inode_num;
++ } /* else ino incremented to unique num in new_inode*/
++ if (sb->s_flags & MS_NOATIME)
++ (*pinode)->i_flags |= S_NOATIME | S_NOCMTIME;
++ insert_inode_hash(*pinode);
+ }
+ inode = *pinode;
+ cifsInfo = CIFS_I(inode);
+@@ -655,7 +621,7 @@
+ .lookup = cifs_lookup,
+ };
+
+-char *cifs_build_path_to_root(struct cifs_sb_info *cifs_sb)
++static char *build_path_to_root(struct cifs_sb_info *cifs_sb)
+ {
+ int pplen = cifs_sb->prepathlen;
+ int dfsplen;
+@@ -712,7 +678,7 @@
+ return inode;
+
+ cifs_sb = CIFS_SB(inode->i_sb);
+- full_path = cifs_build_path_to_root(cifs_sb);
++ full_path = build_path_to_root(cifs_sb);
+ if (full_path == NULL)
+ return ERR_PTR(-ENOMEM);
+
+@@ -1051,7 +1017,7 @@
+ return rc;
+ }
+
+-void posix_fill_in_inode(struct inode *tmp_inode,
++static void posix_fill_in_inode(struct inode *tmp_inode,
+ FILE_UNIX_BASIC_INFO *pData, int isNewInode)
+ {
+ struct cifsInodeInfo *cifsInfo = CIFS_I(tmp_inode);
+@@ -1148,14 +1114,24 @@
+ else
+ direntry->d_op = &cifs_dentry_ops;
+
+- newinode = cifs_new_inode(inode->i_sb,
+- &pInfo->UniqueId);
++ newinode = new_inode(inode->i_sb);
+ if (newinode == NULL) {
+ kfree(pInfo);
+ goto mkdir_get_info;
+ }
+
++ /* Is an i_ino of zero legal? */
++ /* Are there sanity checks we can use to ensure that
++ the server is really filling in that field? */
++ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
++ newinode->i_ino =
++ (unsigned long)pInfo->UniqueId;
++ } /* note ino incremented to unique num in new_inode */
++ if (inode->i_sb->s_flags & MS_NOATIME)
++ newinode->i_flags |= S_NOATIME | S_NOCMTIME;
+ newinode->i_nlink = 2;
++
++ insert_inode_hash(newinode);
+ d_instantiate(direntry, newinode);
+
+ /* we already checked in POSIXCreate whether
+@@ -1309,11 +1285,6 @@
+ cifsInode = CIFS_I(direntry->d_inode);
+ cifsInode->time = 0; /* force revalidate to go get info when
+ needed */
+-
+- cifsInode = CIFS_I(inode);
+- cifsInode->time = 0; /* force revalidate to get parent dir info
+- since cached search results now invalid */
+-
+ direntry->d_inode->i_ctime = inode->i_ctime = inode->i_mtime =
+ current_fs_time(inode->i_sb);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/cifs/md5.c linux-2.6.29-rc3.owrt/fs/cifs/md5.c
+--- linux-2.6.29.owrt/fs/cifs/md5.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/cifs/md5.c 2009-05-10 23:48:29.000000000 +0200
+@@ -10,8 +10,8 @@
+ * with every copy.
+ *
+ * To compute the message digest of a chunk of bytes, declare an
+- * MD5Context structure, pass it to cifs_MD5_init, call cifs_MD5_update as
+- * needed on buffers full of bytes, and then call cifs_MD5_final, which
++ * MD5Context structure, pass it to MD5Init, call MD5Update as
++ * needed on buffers full of bytes, and then call MD5Final, which
+ * will fill a supplied 16-byte array with the digest.
+ */
+
+@@ -45,7 +45,7 @@
+ * initialization constants.
+ */
+ void
+-cifs_MD5_init(struct MD5Context *ctx)
++MD5Init(struct MD5Context *ctx)
+ {
+ ctx->buf[0] = 0x67452301;
+ ctx->buf[1] = 0xefcdab89;
+@@ -61,7 +61,7 @@
+ * of bytes.
+ */
+ void
+-cifs_MD5_update(struct MD5Context *ctx, unsigned char const *buf, unsigned len)
++MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len)
+ {
+ register __u32 t;
+
+@@ -110,7 +110,7 @@
+ * 1 0* (64-bit count of bits processed, MSB-first)
+ */
+ void
+-cifs_MD5_final(unsigned char digest[16], struct MD5Context *ctx)
++MD5Final(unsigned char digest[16], struct MD5Context *ctx)
+ {
+ unsigned int count;
+ unsigned char *p;
+@@ -165,7 +165,7 @@
+
+ /*
+ * The core of the MD5 algorithm, this alters an existing MD5 hash to
+- * reflect the addition of 16 longwords of new data. cifs_MD5_update blocks
++ * reflect the addition of 16 longwords of new data. MD5Update blocks
+ * the data and converts bytes into longwords for this routine.
+ */
+ static void
+@@ -267,9 +267,9 @@
+ unsigned char tk[16];
+ struct MD5Context tctx;
+
+- cifs_MD5_init(&tctx);
+- cifs_MD5_update(&tctx, key, key_len);
+- cifs_MD5_final(tk, &tctx);
++ MD5Init(&tctx);
++ MD5Update(&tctx, key, key_len);
++ MD5Final(tk, &tctx);
+
+ key = tk;
+ key_len = 16;
+@@ -287,8 +287,8 @@
+ ctx->k_opad[i] ^= 0x5c;
+ }
+
+- cifs_MD5_init(&ctx->ctx);
+- cifs_MD5_update(&ctx->ctx, ctx->k_ipad, 64);
++ MD5Init(&ctx->ctx);
++ MD5Update(&ctx->ctx, ctx->k_ipad, 64);
+ }
+ #endif
+
+@@ -317,8 +317,8 @@
+ ctx->k_opad[i] ^= 0x5c;
+ }
+
+- cifs_MD5_init(&ctx->ctx);
+- cifs_MD5_update(&ctx->ctx, ctx->k_ipad, 64);
++ MD5Init(&ctx->ctx);
++ MD5Update(&ctx->ctx, ctx->k_ipad, 64);
+ }
+
+ /***********************************************************************
+@@ -328,7 +328,7 @@
+ hmac_md5_update(const unsigned char *text, int text_len,
+ struct HMACMD5Context *ctx)
+ {
+- cifs_MD5_update(&ctx->ctx, text, text_len); /* then text of datagram */
++ MD5Update(&ctx->ctx, text, text_len); /* then text of datagram */
+ }
+
+ /***********************************************************************
+@@ -339,12 +339,12 @@
+ {
+ struct MD5Context ctx_o;
+
+- cifs_MD5_final(digest, &ctx->ctx);
++ MD5Final(digest, &ctx->ctx);
+
+- cifs_MD5_init(&ctx_o);
+- cifs_MD5_update(&ctx_o, ctx->k_opad, 64);
+- cifs_MD5_update(&ctx_o, digest, 16);
+- cifs_MD5_final(digest, &ctx_o);
++ MD5Init(&ctx_o);
++ MD5Update(&ctx_o, ctx->k_opad, 64);
++ MD5Update(&ctx_o, digest, 16);
++ MD5Final(digest, &ctx_o);
+ }
+
+ /***********************************************************
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/cifs/md5.h linux-2.6.29-rc3.owrt/fs/cifs/md5.h
+--- linux-2.6.29.owrt/fs/cifs/md5.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/cifs/md5.h 2009-05-10 23:48:29.000000000 +0200
+@@ -20,10 +20,10 @@
+ };
+ #endif /* _HMAC_MD5_H */
+
+-void cifs_MD5_init(struct MD5Context *context);
+-void cifs_MD5_update(struct MD5Context *context, unsigned char const *buf,
++void MD5Init(struct MD5Context *context);
++void MD5Update(struct MD5Context *context, unsigned char const *buf,
+ unsigned len);
+-void cifs_MD5_final(unsigned char digest[16], struct MD5Context *context);
++void MD5Final(unsigned char digest[16], struct MD5Context *context);
+
+ /* The following definitions come from lib/hmacmd5.c */
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/cifs/readdir.c linux-2.6.29-rc3.owrt/fs/cifs/readdir.c
+--- linux-2.6.29.owrt/fs/cifs/readdir.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/cifs/readdir.c 2009-05-10 23:48:29.000000000 +0200
+@@ -56,34 +56,35 @@
+ }
+ #endif /* DEBUG2 */
+
+-/* Returns 1 if new inode created, 2 if both dentry and inode were */
++/* Returns one if new inode created (which therefore needs to be hashed) */
+ /* Might check in the future if inode number changed so we can rehash inode */
+-static int
+-construct_dentry(struct qstr *qstring, struct file *file,
+- struct inode **ptmp_inode, struct dentry **pnew_dentry,
+- __u64 *inum)
++static int construct_dentry(struct qstr *qstring, struct file *file,
++ struct inode **ptmp_inode, struct dentry **pnew_dentry)
+ {
+- struct dentry *tmp_dentry = NULL;
+- struct super_block *sb = file->f_path.dentry->d_sb;
++ struct dentry *tmp_dentry;
++ struct cifs_sb_info *cifs_sb;
++ struct cifsTconInfo *pTcon;
+ int rc = 0;
+
+ cFYI(1, ("For %s", qstring->name));
++ cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
++ pTcon = cifs_sb->tcon;
+
+ qstring->hash = full_name_hash(qstring->name, qstring->len);
+ tmp_dentry = d_lookup(file->f_path.dentry, qstring);
+ if (tmp_dentry) {
+- /* BB: overwrite old name? i.e. tmp_dentry->d_name and
+- * tmp_dentry->d_name.len??
+- */
+ cFYI(0, ("existing dentry with inode 0x%p",
+ tmp_dentry->d_inode));
+ *ptmp_inode = tmp_dentry->d_inode;
++/* BB overwrite old name? i.e. tmp_dentry->d_name and tmp_dentry->d_name.len??*/
+ if (*ptmp_inode == NULL) {
+- *ptmp_inode = cifs_new_inode(sb, inum);
++ *ptmp_inode = new_inode(file->f_path.dentry->d_sb);
+ if (*ptmp_inode == NULL)
+ return rc;
+ rc = 1;
+ }
++ if (file->f_path.dentry->d_sb->s_flags & MS_NOATIME)
++ (*ptmp_inode)->i_flags |= S_NOATIME | S_NOCMTIME;
+ } else {
+ tmp_dentry = d_alloc(file->f_path.dentry, qstring);
+ if (tmp_dentry == NULL) {
+@@ -92,14 +93,15 @@
+ return rc;
+ }
+
+- if (CIFS_SB(sb)->tcon->nocase)
++ *ptmp_inode = new_inode(file->f_path.dentry->d_sb);
++ if (pTcon->nocase)
+ tmp_dentry->d_op = &cifs_ci_dentry_ops;
+ else
+ tmp_dentry->d_op = &cifs_dentry_ops;
+-
+- *ptmp_inode = cifs_new_inode(sb, inum);
+ if (*ptmp_inode == NULL)
+ return rc;
++ if (file->f_path.dentry->d_sb->s_flags & MS_NOATIME)
++ (*ptmp_inode)->i_flags |= S_NOATIME | S_NOCMTIME;
+ rc = 2;
+ }
+
+@@ -820,7 +822,7 @@
+ /* inode num, inode type and filename returned */
+ static int cifs_get_name_from_search_buf(struct qstr *pqst,
+ char *current_entry, __u16 level, unsigned int unicode,
+- struct cifs_sb_info *cifs_sb, int max_len, __u64 *pinum)
++ struct cifs_sb_info *cifs_sb, int max_len, ino_t *pinum)
+ {
+ int rc = 0;
+ unsigned int len = 0;
+@@ -840,7 +842,9 @@
+ len = strnlen(filename, PATH_MAX);
+ }
+
+- *pinum = pFindData->UniqueId;
++ /* BB fixme - hash low and high 32 bits if not 64 bit arch BB */
++ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
++ *pinum = pFindData->UniqueId;
+ } else if (level == SMB_FIND_FILE_DIRECTORY_INFO) {
+ FILE_DIRECTORY_INFO *pFindData =
+ (FILE_DIRECTORY_INFO *)current_entry;
+@@ -903,7 +907,7 @@
+ struct qstr qstring;
+ struct cifsFileInfo *pCifsF;
+ unsigned int obj_type;
+- __u64 inum;
++ ino_t inum;
+ struct cifs_sb_info *cifs_sb;
+ struct inode *tmp_inode;
+ struct dentry *tmp_dentry;
+@@ -936,18 +940,20 @@
+ if (rc)
+ return rc;
+
+- /* only these two infolevels return valid inode numbers */
+- if (pCifsF->srch_inf.info_level == SMB_FIND_FILE_UNIX ||
+- pCifsF->srch_inf.info_level == SMB_FIND_FILE_ID_FULL_DIR_INFO)
+- rc = construct_dentry(&qstring, file, &tmp_inode, &tmp_dentry,
+- &inum);
+- else
+- rc = construct_dentry(&qstring, file, &tmp_inode, &tmp_dentry,
+- NULL);
+-
++ rc = construct_dentry(&qstring, file, &tmp_inode, &tmp_dentry);
+ if ((tmp_inode == NULL) || (tmp_dentry == NULL))
+ return -ENOMEM;
+
++ if (rc) {
++ /* inode created, we need to hash it with right inode number */
++ if (inum != 0) {
++ /* BB fixme - hash the 2 32 quantities bits together if
++ * necessary BB */
++ tmp_inode->i_ino = inum;
++ }
++ insert_inode_hash(tmp_inode);
++ }
++
+ /* we pass in rc below, indicating whether it is a new inode,
+ so we can figure out whether to invalidate the inode cached
+ data if the file has changed */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/cifs/sess.c linux-2.6.29-rc3.owrt/fs/cifs/sess.c
+--- linux-2.6.29.owrt/fs/cifs/sess.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/cifs/sess.c 2009-05-10 23:48:29.000000000 +0200
+@@ -34,99 +34,15 @@
+ extern void SMBNTencrypt(unsigned char *passwd, unsigned char *c8,
+ unsigned char *p24);
+
+-/* Checks if this is the first smb session to be reconnected after
+- the socket has been reestablished (so we know whether to use vc 0).
+- Called while holding the cifs_tcp_ses_lock, so do not block */
+-static bool is_first_ses_reconnect(struct cifsSesInfo *ses)
+-{
+- struct list_head *tmp;
+- struct cifsSesInfo *tmp_ses;
+-
+- list_for_each(tmp, &ses->server->smb_ses_list) {
+- tmp_ses = list_entry(tmp, struct cifsSesInfo,
+- smb_ses_list);
+- if (tmp_ses->need_reconnect == false)
+- return false;
+- }
+- /* could not find a session that was already connected,
+- this must be the first one we are reconnecting */
+- return true;
+-}
+-
+-/*
+- * vc number 0 is treated specially by some servers, and should be the
+- * first one we request. After that we can use vcnumbers up to maxvcs,
+- * one for each smb session (some Windows versions set maxvcs incorrectly
+- * so maxvc=1 can be ignored). If we have too many vcs, we can reuse
+- * any vc but zero (some servers reset the connection on vcnum zero)
+- *
+- */
+-static __le16 get_next_vcnum(struct cifsSesInfo *ses)
+-{
+- __u16 vcnum = 0;
+- struct list_head *tmp;
+- struct cifsSesInfo *tmp_ses;
+- __u16 max_vcs = ses->server->max_vcs;
+- __u16 i;
+- int free_vc_found = 0;
+-
+- /* Quoting the MS-SMB specification: "Windows-based SMB servers set this
+- field to one but do not enforce this limit, which allows an SMB client
+- to establish more virtual circuits than allowed by this value ... but
+- other server implementations can enforce this limit." */
+- if (max_vcs < 2)
+- max_vcs = 0xFFFF;
+-
+- write_lock(&cifs_tcp_ses_lock);
+- if ((ses->need_reconnect) && is_first_ses_reconnect(ses))
+- goto get_vc_num_exit; /* vcnum will be zero */
+- for (i = ses->server->srv_count - 1; i < max_vcs; i++) {
+- if (i == 0) /* this is the only connection, use vc 0 */
+- break;
+-
+- free_vc_found = 1;
+-
+- list_for_each(tmp, &ses->server->smb_ses_list) {
+- tmp_ses = list_entry(tmp, struct cifsSesInfo,
+- smb_ses_list);
+- if (tmp_ses->vcnum == i) {
+- free_vc_found = 0;
+- break; /* found duplicate, try next vcnum */
+- }
+- }
+- if (free_vc_found)
+- break; /* we found a vcnumber that will work - use it */
+- }
+-
+- if (i == 0)
+- vcnum = 0; /* for most common case, ie if one smb session, use
+- vc zero. Also for case when no free vcnum, zero
+- is safest to send (some clients only send zero) */
+- else if (free_vc_found == 0)
+- vcnum = 1; /* we can not reuse vc=0 safely, since some servers
+- reset all uids on that, but 1 is ok. */
+- else
+- vcnum = i;
+- ses->vcnum = vcnum;
+-get_vc_num_exit:
+- write_unlock(&cifs_tcp_ses_lock);
+-
+- return le16_to_cpu(vcnum);
+-}
+-
+ static __u32 cifs_ssetup_hdr(struct cifsSesInfo *ses, SESSION_SETUP_ANDX *pSMB)
+ {
+ __u32 capabilities = 0;
+
+ /* init fields common to all four types of SessSetup */
+- /* Note that offsets for first seven fields in req struct are same */
+- /* in CIFS Specs so does not matter which of 3 forms of struct */
+- /* that we use in next few lines */
+- /* Note that header is initialized to zero in header_assemble */
++ /* note that header is initialized to zero in header_assemble */
+ pSMB->req.AndXCommand = 0xFF;
+ pSMB->req.MaxBufferSize = cpu_to_le16(ses->server->maxBuf);
+ pSMB->req.MaxMpxCount = cpu_to_le16(ses->server->maxReq);
+- pSMB->req.VcNumber = get_next_vcnum(ses);
+
+ /* Now no need to set SMBFLG_CASELESS or obsolete CANONICAL PATH */
+
+@@ -155,6 +71,7 @@
+ if (ses->capabilities & CAP_UNIX)
+ capabilities |= CAP_UNIX;
+
++ /* BB check whether to init vcnum BB */
+ return capabilities;
+ }
+
+@@ -311,7 +228,7 @@
+
+ kfree(ses->serverOS);
+ /* UTF-8 string will not grow more than four times as big as UCS-16 */
+- ses->serverOS = kzalloc((4 * len) + 2 /* trailing null */, GFP_KERNEL);
++ ses->serverOS = kzalloc(4 * len, GFP_KERNEL);
+ if (ses->serverOS != NULL)
+ cifs_strfromUCS_le(ses->serverOS, (__le16 *)data, len, nls_cp);
+ data += 2 * (len + 1);
+@@ -324,7 +241,7 @@
+ return rc;
+
+ kfree(ses->serverNOS);
+- ses->serverNOS = kzalloc((4 * len) + 2 /* trailing null */, GFP_KERNEL);
++ ses->serverNOS = kzalloc(4 * len, GFP_KERNEL); /* BB this is wrong length FIXME BB */
+ if (ses->serverNOS != NULL) {
+ cifs_strfromUCS_le(ses->serverNOS, (__le16 *)data, len,
+ nls_cp);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/cifs/transport.c linux-2.6.29-rc3.owrt/fs/cifs/transport.c
+--- linux-2.6.29.owrt/fs/cifs/transport.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/cifs/transport.c 2009-05-10 23:48:29.000000000 +0200
+@@ -154,8 +154,81 @@
+ spin_unlock(&GlobalMid_Lock);
+ }
+
++int
++smb_send(struct socket *ssocket, struct smb_hdr *smb_buffer,
++ unsigned int smb_buf_length, struct sockaddr *sin, bool noblocksnd)
++{
++ int rc = 0;
++ int i = 0;
++ struct msghdr smb_msg;
++ struct kvec iov;
++ unsigned len = smb_buf_length + 4;
++
++ if (ssocket == NULL)
++ return -ENOTSOCK; /* BB eventually add reconnect code here */
++ iov.iov_base = smb_buffer;
++ iov.iov_len = len;
++
++ smb_msg.msg_name = sin;
++ smb_msg.msg_namelen = sizeof(struct sockaddr);
++ smb_msg.msg_control = NULL;
++ smb_msg.msg_controllen = 0;
++ if (noblocksnd)
++ smb_msg.msg_flags = MSG_DONTWAIT + MSG_NOSIGNAL;
++ else
++ smb_msg.msg_flags = MSG_NOSIGNAL;
++
++ /* smb header is converted in header_assemble. bcc and rest of SMB word
++ area, and byte area if necessary, is converted to littleendian in
++ cifssmb.c and RFC1001 len is converted to bigendian in smb_send
++ Flags2 is converted in SendReceive */
++
++ smb_buffer->smb_buf_length = cpu_to_be32(smb_buffer->smb_buf_length);
++ cFYI(1, ("Sending smb of length %d", smb_buf_length));
++ dump_smb(smb_buffer, len);
++
++ while (len > 0) {
++ rc = kernel_sendmsg(ssocket, &smb_msg, &iov, 1, len);
++ if ((rc == -ENOSPC) || (rc == -EAGAIN)) {
++ i++;
++ /* smaller timeout here than send2 since smaller size */
++ /* Although it may not be required, this also is smaller
++ oplock break time */
++ if (i > 12) {
++ cERROR(1,
++ ("sends on sock %p stuck for 7 seconds",
++ ssocket));
++ rc = -EAGAIN;
++ break;
++ }
++ msleep(1 << i);
++ continue;
++ }
++ if (rc < 0)
++ break;
++ else
++ i = 0; /* reset i after each successful send */
++ iov.iov_base += rc;
++ iov.iov_len -= rc;
++ len -= rc;
++ }
++
++ if (rc < 0) {
++ cERROR(1, ("Error %d sending data on socket to server", rc));
++ } else {
++ rc = 0;
++ }
++
++ /* Don't want to modify the buffer as a
++ side effect of this call. */
++ smb_buffer->smb_buf_length = smb_buf_length;
++
++ return rc;
++}
++
+ static int
+-smb_sendv(struct TCP_Server_Info *server, struct kvec *iov, int n_vec)
++smb_send2(struct TCP_Server_Info *server, struct kvec *iov, int n_vec,
++ struct sockaddr *sin, bool noblocksnd)
+ {
+ int rc = 0;
+ int i = 0;
+@@ -170,11 +243,11 @@
+ if (ssocket == NULL)
+ return -ENOTSOCK; /* BB eventually add reconnect code here */
+
+- smb_msg.msg_name = (struct sockaddr *) &server->addr.sockAddr;
++ smb_msg.msg_name = sin;
+ smb_msg.msg_namelen = sizeof(struct sockaddr);
+ smb_msg.msg_control = NULL;
+ smb_msg.msg_controllen = 0;
+- if (server->noblocksnd)
++ if (noblocksnd)
+ smb_msg.msg_flags = MSG_DONTWAIT + MSG_NOSIGNAL;
+ else
+ smb_msg.msg_flags = MSG_NOSIGNAL;
+@@ -199,25 +272,7 @@
+ n_vec - first_vec, total_len);
+ if ((rc == -ENOSPC) || (rc == -EAGAIN)) {
+ i++;
+- /* if blocking send we try 3 times, since each can block
+- for 5 seconds. For nonblocking we have to try more
+- but wait increasing amounts of time allowing time for
+- socket to clear. The overall time we wait in either
+- case to send on the socket is about 15 seconds.
+- Similarly we wait for 15 seconds for
+- a response from the server in SendReceive[2]
+- for the server to send a response back for
+- most types of requests (except SMB Write
+- past end of file which can be slow, and
+- blocking lock operations). NFS waits slightly longer
+- than CIFS, but this can make it take longer for
+- nonresponsive servers to be detected and 15 seconds
+- is more than enough time for modern networks to
+- send a packet. In most cases if we fail to send
+- after the retries we will kill the socket and
+- reconnect which may clear the network problem.
+- */
+- if ((i >= 14) || (!server->noblocksnd && (i > 2))) {
++ if (i >= 14) {
+ cERROR(1,
+ ("sends on sock %p stuck for 15 seconds",
+ ssocket));
+@@ -284,18 +339,6 @@
+ return rc;
+ }
+
+-int
+-smb_send(struct TCP_Server_Info *server, struct smb_hdr *smb_buffer,
+- unsigned int smb_buf_length)
+-{
+- struct kvec iov;
+-
+- iov.iov_base = smb_buffer;
+- iov.iov_len = smb_buf_length + 4;
+-
+- return smb_sendv(server, &iov, 1);
+-}
+-
+ static int wait_for_free_request(struct cifsSesInfo *ses, const int long_op)
+ {
+ if (long_op == CIFS_ASYNC_OP) {
+@@ -497,7 +540,9 @@
+ #ifdef CONFIG_CIFS_STATS2
+ atomic_inc(&ses->server->inSend);
+ #endif
+- rc = smb_sendv(ses->server, iov, n_vec);
++ rc = smb_send2(ses->server, iov, n_vec,
++ (struct sockaddr *) &(ses->server->addr.sockAddr),
++ ses->server->noblocksnd);
+ #ifdef CONFIG_CIFS_STATS2
+ atomic_dec(&ses->server->inSend);
+ midQ->when_sent = jiffies;
+@@ -691,7 +736,9 @@
+ #ifdef CONFIG_CIFS_STATS2
+ atomic_inc(&ses->server->inSend);
+ #endif
+- rc = smb_send(ses->server, in_buf, in_buf->smb_buf_length);
++ rc = smb_send(ses->server->ssocket, in_buf, in_buf->smb_buf_length,
++ (struct sockaddr *) &(ses->server->addr.sockAddr),
++ ses->server->noblocksnd);
+ #ifdef CONFIG_CIFS_STATS2
+ atomic_dec(&ses->server->inSend);
+ midQ->when_sent = jiffies;
+@@ -832,7 +879,9 @@
+ mutex_unlock(&ses->server->srv_mutex);
+ return rc;
+ }
+- rc = smb_send(ses->server, in_buf, in_buf->smb_buf_length);
++ rc = smb_send(ses->server->ssocket, in_buf, in_buf->smb_buf_length,
++ (struct sockaddr *) &(ses->server->addr.sockAddr),
++ ses->server->noblocksnd);
+ mutex_unlock(&ses->server->srv_mutex);
+ return rc;
+ }
+@@ -924,7 +973,9 @@
+ #ifdef CONFIG_CIFS_STATS2
+ atomic_inc(&ses->server->inSend);
+ #endif
+- rc = smb_send(ses->server, in_buf, in_buf->smb_buf_length);
++ rc = smb_send(ses->server->ssocket, in_buf, in_buf->smb_buf_length,
++ (struct sockaddr *) &(ses->server->addr.sockAddr),
++ ses->server->noblocksnd);
+ #ifdef CONFIG_CIFS_STATS2
+ atomic_dec(&ses->server->inSend);
+ midQ->when_sent = jiffies;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/compat.c linux-2.6.29-rc3.owrt/fs/compat.c
+--- linux-2.6.29.owrt/fs/compat.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/compat.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1407,7 +1407,7 @@
+ bprm->cred = prepare_exec_creds();
+ if (!bprm->cred)
+ goto out_unlock;
+- check_unsafe_exec(bprm, current->files);
++ check_unsafe_exec(bprm);
+
+ file = open_exec(filename);
+ retval = PTR_ERR(file);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/compat_ioctl.c linux-2.6.29-rc3.owrt/fs/compat_ioctl.c
+--- linux-2.6.29.owrt/fs/compat_ioctl.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/compat_ioctl.c 2009-05-10 23:48:29.000000000 +0200
+@@ -538,7 +538,6 @@
+ * cannot be fixed without breaking all existing apps.
+ */
+ case TUNSETIFF:
+- case TUNGETIFF:
+ case SIOCGIFFLAGS:
+ case SIOCGIFMETRIC:
+ case SIOCGIFMTU:
+@@ -785,7 +784,7 @@
+
+ if (copy_in_user(&sgio->status, &sgio32->status,
+ (4 * sizeof(unsigned char)) +
+- (2 * sizeof(unsigned short)) +
++ (2 * sizeof(unsigned (short))) +
+ (3 * sizeof(int))))
+ return -EFAULT;
+
+@@ -1913,9 +1912,6 @@
+ /* 0x00 */
+ COMPATIBLE_IOCTL(FIBMAP)
+ COMPATIBLE_IOCTL(FIGETBSZ)
+-/* 'X' - originally XFS but some now in the VFS */
+-COMPATIBLE_IOCTL(FIFREEZE)
+-COMPATIBLE_IOCTL(FITHAW)
+ /* RAID */
+ COMPATIBLE_IOCTL(RAID_VERSION)
+ COMPATIBLE_IOCTL(GET_ARRAY_INFO)
+@@ -1941,8 +1937,6 @@
+ /* Big K */
+ COMPATIBLE_IOCTL(PIO_FONT)
+ COMPATIBLE_IOCTL(GIO_FONT)
+-COMPATIBLE_IOCTL(PIO_CMAP)
+-COMPATIBLE_IOCTL(GIO_CMAP)
+ ULONG_IOCTL(KDSIGACCEPT)
+ COMPATIBLE_IOCTL(KDGETKEYCODE)
+ COMPATIBLE_IOCTL(KDSETKEYCODE)
+@@ -1988,11 +1982,6 @@
+ COMPATIBLE_IOCTL(TUNSETDEBUG)
+ COMPATIBLE_IOCTL(TUNSETPERSIST)
+ COMPATIBLE_IOCTL(TUNSETOWNER)
+-COMPATIBLE_IOCTL(TUNSETLINK)
+-COMPATIBLE_IOCTL(TUNSETGROUP)
+-COMPATIBLE_IOCTL(TUNGETFEATURES)
+-COMPATIBLE_IOCTL(TUNSETOFFLOAD)
+-COMPATIBLE_IOCTL(TUNSETTXFILTER)
+ /* Big V */
+ COMPATIBLE_IOCTL(VT_SETMODE)
+ COMPATIBLE_IOCTL(VT_GETMODE)
+@@ -2584,7 +2573,6 @@
+ HANDLE_IOCTL(SIOCGIFTXQLEN, dev_ifsioc)
+ HANDLE_IOCTL(SIOCSIFTXQLEN, dev_ifsioc)
+ HANDLE_IOCTL(TUNSETIFF, dev_ifsioc)
+-HANDLE_IOCTL(TUNGETIFF, dev_ifsioc)
+ HANDLE_IOCTL(SIOCETHTOOL, ethtool_ioctl)
+ HANDLE_IOCTL(SIOCBONDENSLAVE, bond_ioctl)
+ HANDLE_IOCTL(SIOCBONDRELEASE, bond_ioctl)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/dcache.c linux-2.6.29-rc3.owrt/fs/dcache.c
+--- linux-2.6.29.owrt/fs/dcache.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/dcache.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1180,7 +1180,7 @@
+ iput(inode);
+ return res;
+ }
+-EXPORT_SYMBOL(d_obtain_alias);
++EXPORT_SYMBOL_GPL(d_obtain_alias);
+
+ /**
+ * d_splice_alias - splice a disconnected dentry into the tree if one exists
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/devpts/inode.c linux-2.6.29-rc3.owrt/fs/devpts/inode.c
+--- linux-2.6.29.owrt/fs/devpts/inode.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/devpts/inode.c 2009-05-10 23:48:29.000000000 +0200
+@@ -198,6 +198,9 @@
+
+ fsi->ptmx_dentry = dentry;
+ rc = 0;
++
++ printk(KERN_DEBUG "Created ptmx node in devpts ino %lu\n",
++ inode->i_ino);
+ out:
+ mutex_unlock(&root->d_inode->i_mutex);
+ return rc;
+@@ -366,6 +369,8 @@
+ struct pts_fs_info *fsi;
+ struct pts_mount_opts *opts;
+
++ printk(KERN_NOTICE "devpts: newinstance mount\n");
++
+ err = get_sb_nodev(fs_type, flags, data, devpts_fill_super, mnt);
+ if (err)
+ return err;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ecryptfs/crypto.c linux-2.6.29-rc3.owrt/fs/ecryptfs/crypto.c
+--- linux-2.6.29.owrt/fs/ecryptfs/crypto.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ecryptfs/crypto.c 2009-05-10 23:48:29.000000000 +0200
+@@ -946,8 +946,6 @@
+ list_for_each_entry(global_auth_tok,
+ &mount_crypt_stat->global_auth_tok_list,
+ mount_crypt_stat_list) {
+- if (global_auth_tok->flags & ECRYPTFS_AUTH_TOK_FNEK)
+- continue;
+ rc = ecryptfs_add_keysig(crypt_stat, global_auth_tok->sig);
+ if (rc) {
+ printk(KERN_ERR "Error adding keysig; rc = [%d]\n", rc);
+@@ -1324,13 +1322,14 @@
+ }
+
+ static int
+-ecryptfs_write_metadata_to_contents(struct dentry *ecryptfs_dentry,
+- char *virt, size_t virt_len)
++ecryptfs_write_metadata_to_contents(struct ecryptfs_crypt_stat *crypt_stat,
++ struct dentry *ecryptfs_dentry,
++ char *virt)
+ {
+ int rc;
+
+ rc = ecryptfs_write_lower(ecryptfs_dentry->d_inode, virt,
+- 0, virt_len);
++ 0, crypt_stat->num_header_bytes_at_front);
+ if (rc)
+ printk(KERN_ERR "%s: Error attempting to write header "
+ "information to lower file; rc = [%d]\n", __func__,
+@@ -1340,6 +1339,7 @@
+
+ static int
+ ecryptfs_write_metadata_to_xattr(struct dentry *ecryptfs_dentry,
++ struct ecryptfs_crypt_stat *crypt_stat,
+ char *page_virt, size_t size)
+ {
+ int rc;
+@@ -1349,17 +1349,6 @@
+ return rc;
+ }
+
+-static unsigned long ecryptfs_get_zeroed_pages(gfp_t gfp_mask,
+- unsigned int order)
+-{
+- struct page *page;
+-
+- page = alloc_pages(gfp_mask | __GFP_ZERO, order);
+- if (page)
+- return (unsigned long) page_address(page);
+- return 0;
+-}
+-
+ /**
+ * ecryptfs_write_metadata
+ * @ecryptfs_dentry: The eCryptfs dentry
+@@ -1376,9 +1365,7 @@
+ {
+ struct ecryptfs_crypt_stat *crypt_stat =
+ &ecryptfs_inode_to_private(ecryptfs_dentry->d_inode)->crypt_stat;
+- unsigned int order;
+ char *virt;
+- size_t virt_len;
+ size_t size = 0;
+ int rc = 0;
+
+@@ -1394,35 +1381,33 @@
+ rc = -EINVAL;
+ goto out;
+ }
+- virt_len = crypt_stat->num_header_bytes_at_front;
+- order = get_order(virt_len);
+ /* Released in this function */
+- virt = (char *)ecryptfs_get_zeroed_pages(GFP_KERNEL, order);
++ virt = (char *)get_zeroed_page(GFP_KERNEL);
+ if (!virt) {
+ printk(KERN_ERR "%s: Out of memory\n", __func__);
+ rc = -ENOMEM;
+ goto out;
+ }
+- rc = ecryptfs_write_headers_virt(virt, virt_len, &size, crypt_stat,
+- ecryptfs_dentry);
++ rc = ecryptfs_write_headers_virt(virt, PAGE_CACHE_SIZE, &size,
++ crypt_stat, ecryptfs_dentry);
+ if (unlikely(rc)) {
+ printk(KERN_ERR "%s: Error whilst writing headers; rc = [%d]\n",
+ __func__, rc);
+ goto out_free;
+ }
+ if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR)
+- rc = ecryptfs_write_metadata_to_xattr(ecryptfs_dentry, virt,
+- size);
++ rc = ecryptfs_write_metadata_to_xattr(ecryptfs_dentry,
++ crypt_stat, virt, size);
+ else
+- rc = ecryptfs_write_metadata_to_contents(ecryptfs_dentry, virt,
+- virt_len);
++ rc = ecryptfs_write_metadata_to_contents(crypt_stat,
++ ecryptfs_dentry, virt);
+ if (rc) {
+ printk(KERN_ERR "%s: Error writing metadata out to lower file; "
+ "rc = [%d]\n", __func__, rc);
+ goto out_free;
+ }
+ out_free:
+- free_pages((unsigned long)virt, order);
++ free_page((unsigned long)virt);
+ out:
+ return rc;
+ }
+@@ -1731,7 +1716,7 @@
+ {
+ int rc = 0;
+
+- (*copied_name) = kmalloc((name_size + 1), GFP_KERNEL);
++ (*copied_name) = kmalloc((name_size + 2), GFP_KERNEL);
+ if (!(*copied_name)) {
+ rc = -ENOMEM;
+ goto out;
+@@ -1741,7 +1726,7 @@
+ * in printing out the
+ * string in debug
+ * messages */
+- (*copied_name_size) = name_size;
++ (*copied_name_size) = (name_size + 1);
+ out:
+ return rc;
+ }
+@@ -2221,19 +2206,17 @@
+ struct dentry *ecryptfs_dir_dentry,
+ const char *name, size_t name_size)
+ {
+- struct ecryptfs_mount_crypt_stat *mount_crypt_stat =
+- &ecryptfs_superblock_to_private(
+- ecryptfs_dir_dentry->d_sb)->mount_crypt_stat;
+ char *decoded_name;
+ size_t decoded_name_size;
+ size_t packet_size;
+ int rc = 0;
+
+- if ((mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES)
+- && !(mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED)
+- && (name_size > ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX_SIZE)
++ if ((name_size > ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX_SIZE)
+ && (strncmp(name, ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX,
+ ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX_SIZE) == 0)) {
++ struct ecryptfs_mount_crypt_stat *mount_crypt_stat =
++ &ecryptfs_superblock_to_private(
++ ecryptfs_dir_dentry->d_sb)->mount_crypt_stat;
+ const char *orig_name = name;
+ size_t orig_name_size = name_size;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ecryptfs/ecryptfs_kernel.h linux-2.6.29-rc3.owrt/fs/ecryptfs/ecryptfs_kernel.h
+--- linux-2.6.29.owrt/fs/ecryptfs/ecryptfs_kernel.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ecryptfs/ecryptfs_kernel.h 2009-05-10 23:48:29.000000000 +0200
+@@ -328,7 +328,6 @@
+ */
+ struct ecryptfs_global_auth_tok {
+ #define ECRYPTFS_AUTH_TOK_INVALID 0x00000001
+-#define ECRYPTFS_AUTH_TOK_FNEK 0x00000002
+ u32 flags;
+ struct list_head mount_crypt_stat_list;
+ struct key *global_auth_tok_key;
+@@ -620,6 +619,7 @@
+ u32 flags);
+ int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry,
+ struct dentry *lower_dentry,
++ struct ecryptfs_crypt_stat *crypt_stat,
+ struct inode *ecryptfs_dir_inode,
+ struct nameidata *ecryptfs_nd);
+ int ecryptfs_decode_and_decrypt_filename(char **decrypted_name,
+@@ -696,7 +696,7 @@
+ int ecryptfs_add_keysig(struct ecryptfs_crypt_stat *crypt_stat, char *sig);
+ int
+ ecryptfs_add_global_auth_tok(struct ecryptfs_mount_crypt_stat *mount_crypt_stat,
+- char *sig, u32 global_auth_tok_flags);
++ char *sig);
+ int ecryptfs_get_global_auth_tok_for_sig(
+ struct ecryptfs_global_auth_tok **global_auth_tok,
+ struct ecryptfs_mount_crypt_stat *mount_crypt_stat, char *sig);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ecryptfs/inode.c linux-2.6.29-rc3.owrt/fs/ecryptfs/inode.c
+--- linux-2.6.29.owrt/fs/ecryptfs/inode.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ecryptfs/inode.c 2009-05-10 23:48:29.000000000 +0200
+@@ -246,6 +246,7 @@
+ */
+ int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry,
+ struct dentry *lower_dentry,
++ struct ecryptfs_crypt_stat *crypt_stat,
+ struct inode *ecryptfs_dir_inode,
+ struct nameidata *ecryptfs_nd)
+ {
+@@ -253,7 +254,6 @@
+ struct vfsmount *lower_mnt;
+ struct inode *lower_inode;
+ struct ecryptfs_mount_crypt_stat *mount_crypt_stat;
+- struct ecryptfs_crypt_stat *crypt_stat;
+ char *page_virt = NULL;
+ u64 file_size;
+ int rc = 0;
+@@ -314,11 +314,6 @@
+ goto out_free_kmem;
+ }
+ }
+- crypt_stat = &ecryptfs_inode_to_private(
+- ecryptfs_dentry->d_inode)->crypt_stat;
+- /* TODO: lock for crypt_stat comparison */
+- if (!(crypt_stat->flags & ECRYPTFS_POLICY_APPLIED))
+- ecryptfs_set_default_sizes(crypt_stat);
+ rc = ecryptfs_read_and_validate_header_region(page_virt,
+ ecryptfs_dentry->d_inode);
+ if (rc) {
+@@ -367,7 +362,9 @@
+ {
+ char *encrypted_and_encoded_name = NULL;
+ size_t encrypted_and_encoded_name_size;
++ struct ecryptfs_crypt_stat *crypt_stat = NULL;
+ struct ecryptfs_mount_crypt_stat *mount_crypt_stat = NULL;
++ struct ecryptfs_inode_info *inode_info;
+ struct dentry *lower_dir_dentry, *lower_dentry;
+ int rc = 0;
+
+@@ -391,15 +388,26 @@
+ }
+ if (lower_dentry->d_inode)
+ goto lookup_and_interpose;
+- mount_crypt_stat = &ecryptfs_superblock_to_private(
+- ecryptfs_dentry->d_sb)->mount_crypt_stat;
+- if (!(mount_crypt_stat
+- && (mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES)))
++ inode_info = ecryptfs_inode_to_private(ecryptfs_dentry->d_inode);
++ if (inode_info) {
++ crypt_stat = &inode_info->crypt_stat;
++ /* TODO: lock for crypt_stat comparison */
++ if (!(crypt_stat->flags & ECRYPTFS_POLICY_APPLIED))
++ ecryptfs_set_default_sizes(crypt_stat);
++ }
++ if (crypt_stat)
++ mount_crypt_stat = crypt_stat->mount_crypt_stat;
++ else
++ mount_crypt_stat = &ecryptfs_superblock_to_private(
++ ecryptfs_dentry->d_sb)->mount_crypt_stat;
++ if (!(crypt_stat && (crypt_stat->flags & ECRYPTFS_ENCRYPT_FILENAMES))
++ && !(mount_crypt_stat && (mount_crypt_stat->flags
++ & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES)))
+ goto lookup_and_interpose;
+ dput(lower_dentry);
+ rc = ecryptfs_encrypt_and_encode_filename(
+ &encrypted_and_encoded_name, &encrypted_and_encoded_name_size,
+- NULL, mount_crypt_stat, ecryptfs_dentry->d_name.name,
++ crypt_stat, mount_crypt_stat, ecryptfs_dentry->d_name.name,
+ ecryptfs_dentry->d_name.len);
+ if (rc) {
+ printk(KERN_ERR "%s: Error attempting to encrypt and encode "
+@@ -418,7 +426,7 @@
+ }
+ lookup_and_interpose:
+ rc = ecryptfs_lookup_and_interpose_lower(ecryptfs_dentry, lower_dentry,
+- ecryptfs_dir_inode,
++ crypt_stat, ecryptfs_dir_inode,
+ ecryptfs_nd);
+ goto out;
+ out_d_drop:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ecryptfs/keystore.c linux-2.6.29-rc3.owrt/fs/ecryptfs/keystore.c
+--- linux-2.6.29.owrt/fs/ecryptfs/keystore.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ecryptfs/keystore.c 2009-05-10 23:48:29.000000000 +0200
+@@ -2375,7 +2375,7 @@
+
+ int
+ ecryptfs_add_global_auth_tok(struct ecryptfs_mount_crypt_stat *mount_crypt_stat,
+- char *sig, u32 global_auth_tok_flags)
++ char *sig)
+ {
+ struct ecryptfs_global_auth_tok *new_auth_tok;
+ int rc = 0;
+@@ -2389,7 +2389,6 @@
+ goto out;
+ }
+ memcpy(new_auth_tok->sig, sig, ECRYPTFS_SIG_SIZE_HEX);
+- new_auth_tok->flags = global_auth_tok_flags;
+ new_auth_tok->sig[ECRYPTFS_SIG_SIZE_HEX] = '\0';
+ mutex_lock(&mount_crypt_stat->global_auth_tok_list_mutex);
+ list_add(&new_auth_tok->mount_crypt_stat_list,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ecryptfs/main.c linux-2.6.29-rc3.owrt/fs/ecryptfs/main.c
+--- linux-2.6.29.owrt/fs/ecryptfs/main.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ecryptfs/main.c 2009-05-10 23:48:29.000000000 +0200
+@@ -319,7 +319,7 @@
+ case ecryptfs_opt_ecryptfs_sig:
+ sig_src = args[0].from;
+ rc = ecryptfs_add_global_auth_tok(mount_crypt_stat,
+- sig_src, 0);
++ sig_src);
+ if (rc) {
+ printk(KERN_ERR "Error attempting to register "
+ "global sig; rc = [%d]\n", rc);
+@@ -370,8 +370,7 @@
+ ECRYPTFS_SIG_SIZE_HEX] = '\0';
+ rc = ecryptfs_add_global_auth_tok(
+ mount_crypt_stat,
+- mount_crypt_stat->global_default_fnek_sig,
+- ECRYPTFS_AUTH_TOK_FNEK);
++ mount_crypt_stat->global_default_fnek_sig);
+ if (rc) {
+ printk(KERN_ERR "Error attempting to register "
+ "global fnek sig [%s]; rc = [%d]\n",
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/eventpoll.c linux-2.6.29-rc3.owrt/fs/eventpoll.c
+--- linux-2.6.29.owrt/fs/eventpoll.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/eventpoll.c 2009-05-10 23:48:29.000000000 +0200
+@@ -234,6 +234,8 @@
+ /*
+ * Configuration options available inside /proc/sys/fs/epoll/
+ */
++/* Maximum number of epoll devices, per user */
++static int max_user_instances __read_mostly;
+ /* Maximum number of epoll watched descriptors, per user */
+ static int max_user_watches __read_mostly;
+
+@@ -259,6 +261,14 @@
+
+ ctl_table epoll_table[] = {
+ {
++ .procname = "max_user_instances",
++ .data = &max_user_instances,
++ .maxlen = sizeof(int),
++ .mode = 0644,
++ .proc_handler = &proc_dointvec_minmax,
++ .extra1 = &zero,
++ },
++ {
+ .procname = "max_user_watches",
+ .data = &max_user_watches,
+ .maxlen = sizeof(int),
+@@ -481,6 +491,7 @@
+
+ mutex_unlock(&epmutex);
+ mutex_destroy(&ep->mtx);
++ atomic_dec(&ep->user->epoll_devs);
+ free_uid(ep->user);
+ kfree(ep);
+ }
+@@ -570,6 +581,10 @@
+ struct eventpoll *ep;
+
+ user = get_current_user();
++ error = -EMFILE;
++ if (unlikely(atomic_read(&user->epoll_devs) >=
++ max_user_instances))
++ goto free_uid;
+ error = -ENOMEM;
+ ep = kzalloc(sizeof(*ep), GFP_KERNEL);
+ if (unlikely(!ep))
+@@ -1126,6 +1141,7 @@
+ flags & O_CLOEXEC);
+ if (fd < 0)
+ ep_free(ep);
++ atomic_inc(&ep->user->epoll_devs);
+
+ error_return:
+ DNPRINTK(3, (KERN_INFO "[%p] eventpoll: sys_epoll_create(%d) = %d\n",
+@@ -1350,10 +1366,8 @@
+ struct sysinfo si;
+
+ si_meminfo(&si);
+- /*
+- * Allows top 4% of lomem to be allocated for epoll watches (per user).
+- */
+- max_user_watches = (((si.totalram - si.totalhigh) / 25) << PAGE_SHIFT) /
++ max_user_instances = 128;
++ max_user_watches = (((si.totalram - si.totalhigh) / 32) << PAGE_SHIFT) /
+ EP_ITEM_COST;
+
+ /* Initialize the structure used to perform safe poll wait head wake ups */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/exec.c linux-2.6.29-rc3.owrt/fs/exec.c
+--- linux-2.6.29.owrt/fs/exec.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/exec.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1049,32 +1049,16 @@
+ * - the caller must hold current->cred_exec_mutex to protect against
+ * PTRACE_ATTACH
+ */
+-void check_unsafe_exec(struct linux_binprm *bprm, struct files_struct *files)
++void check_unsafe_exec(struct linux_binprm *bprm)
+ {
+- struct task_struct *p = current, *t;
+- unsigned long flags;
+- unsigned n_fs, n_files, n_sighand;
++ struct task_struct *p = current;
+
+ bprm->unsafe = tracehook_unsafe_exec(p);
+
+- n_fs = 1;
+- n_files = 1;
+- n_sighand = 1;
+- lock_task_sighand(p, &flags);
+- for (t = next_thread(p); t != p; t = next_thread(t)) {
+- if (t->fs == p->fs)
+- n_fs++;
+- if (t->files == files)
+- n_files++;
+- n_sighand++;
+- }
+-
+- if (atomic_read(&p->fs->count) > n_fs ||
+- atomic_read(&p->files->count) > n_files ||
+- atomic_read(&p->sighand->count) > n_sighand)
++ if (atomic_read(&p->fs->count) > 1 ||
++ atomic_read(&p->files->count) > 1 ||
++ atomic_read(&p->sighand->count) > 1)
+ bprm->unsafe |= LSM_UNSAFE_SHARE;
+-
+- unlock_task_sighand(p, &flags);
+ }
+
+ /*
+@@ -1289,7 +1273,7 @@
+ bprm->cred = prepare_exec_creds();
+ if (!bprm->cred)
+ goto out_unlock;
+- check_unsafe_exec(bprm, displaced);
++ check_unsafe_exec(bprm);
+
+ file = open_exec(filename);
+ retval = PTR_ERR(file);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ext2/super.c linux-2.6.29-rc3.owrt/fs/ext2/super.c
+--- linux-2.6.29.owrt/fs/ext2/super.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ext2/super.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1185,12 +1185,9 @@
+ es = sbi->s_es;
+ if (((sbi->s_mount_opt & EXT2_MOUNT_XIP) !=
+ (old_mount_opt & EXT2_MOUNT_XIP)) &&
+- invalidate_inodes(sb)) {
+- ext2_warning(sb, __func__, "refusing change of xip flag "
+- "with busy inodes while remounting");
+- sbi->s_mount_opt &= ~EXT2_MOUNT_XIP;
+- sbi->s_mount_opt |= old_mount_opt & EXT2_MOUNT_XIP;
+- }
++ invalidate_inodes(sb))
++ ext2_warning(sb, __func__, "busy inodes while remounting "\
++ "xip remain in cache (no functional problem)");
+ if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
+ return 0;
+ if (*flags & MS_RDONLY) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ext3/namei.c linux-2.6.29-rc3.owrt/fs/ext3/namei.c
+--- linux-2.6.29.owrt/fs/ext3/namei.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ext3/namei.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1358,7 +1358,7 @@
+ struct fake_dirent *fde;
+
+ blocksize = dir->i_sb->s_blocksize;
+- dxtrace(printk(KERN_DEBUG "Creating index: inode %lu\n", dir->i_ino));
++ dxtrace(printk("Creating index\n"));
+ retval = ext3_journal_get_write_access(handle, bh);
+ if (retval) {
+ ext3_std_error(dir->i_sb, retval);
+@@ -1367,19 +1367,6 @@
+ }
+ root = (struct dx_root *) bh->b_data;
+
+- /* The 0th block becomes the root, move the dirents out */
+- fde = &root->dotdot;
+- de = (struct ext3_dir_entry_2 *)((char *)fde +
+- ext3_rec_len_from_disk(fde->rec_len));
+- if ((char *) de >= (((char *) root) + blocksize)) {
+- ext3_error(dir->i_sb, __func__,
+- "invalid rec_len for '..' in inode %lu",
+- dir->i_ino);
+- brelse(bh);
+- return -EIO;
+- }
+- len = ((char *) root) + blocksize - (char *) de;
+-
+ bh2 = ext3_append (handle, dir, &block, &retval);
+ if (!(bh2)) {
+ brelse(bh);
+@@ -1388,6 +1375,11 @@
+ EXT3_I(dir)->i_flags |= EXT3_INDEX_FL;
+ data1 = bh2->b_data;
+
++ /* The 0th block becomes the root, move the dirents out */
++ fde = &root->dotdot;
++ de = (struct ext3_dir_entry_2 *)((char *)fde +
++ ext3_rec_len_from_disk(fde->rec_len));
++ len = ((char *) root) + blocksize - (char *) de;
+ memcpy (data1, de, len);
+ de = (struct ext3_dir_entry_2 *) data1;
+ top = data1 + len;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ext3/super.c linux-2.6.29-rc3.owrt/fs/ext3/super.c
+--- linux-2.6.29.owrt/fs/ext3/super.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ext3/super.c 2009-05-10 23:48:29.000000000 +0200
+@@ -2428,13 +2428,12 @@
+
+ static int ext3_sync_fs(struct super_block *sb, int wait)
+ {
+- tid_t target;
+-
+ sb->s_dirt = 0;
+- if (journal_start_commit(EXT3_SB(sb)->s_journal, &target)) {
+- if (wait)
+- log_wait_commit(EXT3_SB(sb)->s_journal, target);
+- }
++ if (wait)
++ ext3_force_commit(sb);
++ else
++ journal_start_commit(EXT3_SB(sb)->s_journal, NULL);
++
+ return 0;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ext4/balloc.c linux-2.6.29-rc3.owrt/fs/ext4/balloc.c
+--- linux-2.6.29.owrt/fs/ext4/balloc.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ext4/balloc.c 2009-05-10 23:48:29.000000000 +0200
+@@ -609,9 +609,7 @@
+ */
+ int ext4_should_retry_alloc(struct super_block *sb, int *retries)
+ {
+- if (!ext4_has_free_blocks(EXT4_SB(sb), 1) ||
+- (*retries)++ > 3 ||
+- !EXT4_SB(sb)->s_journal)
++ if (!ext4_has_free_blocks(EXT4_SB(sb), 1) || (*retries)++ > 3)
+ return 0;
+
+ jbd_debug(1, "%s: retrying operation after ENOSPC\n", sb->s_id);
+@@ -686,15 +684,15 @@
+ gdp = ext4_get_group_desc(sb, i, NULL);
+ if (!gdp)
+ continue;
+- desc_count += ext4_free_blks_count(sb, gdp);
++ desc_count += le16_to_cpu(gdp->bg_free_blocks_count);
+ brelse(bitmap_bh);
+ bitmap_bh = ext4_read_block_bitmap(sb, i);
+ if (bitmap_bh == NULL)
+ continue;
+
+ x = ext4_count_free(bitmap_bh, sb->s_blocksize);
+- printk(KERN_DEBUG "group %u: stored = %d, counted = %u\n",
+- i, ext4_free_blks_count(sb, gdp), x);
++ printk(KERN_DEBUG "group %lu: stored = %d, counted = %u\n",
++ i, le16_to_cpu(gdp->bg_free_blocks_count), x);
+ bitmap_count += x;
+ }
+ brelse(bitmap_bh);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ext4/ext4.h linux-2.6.29-rc3.owrt/fs/ext4/ext4.h
+--- linux-2.6.29.owrt/fs/ext4/ext4.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ext4/ext4.h 2009-05-10 23:48:29.000000000 +0200
+@@ -868,7 +868,7 @@
+ {
+ unsigned len = le16_to_cpu(dlen);
+
+- if (len == EXT4_MAX_REC_LEN || len == 0)
++ if (len == EXT4_MAX_REC_LEN)
+ return 1 << 16;
+ return len;
+ }
+@@ -1206,11 +1206,8 @@
+
+ static inline loff_t ext4_isize(struct ext4_inode *raw_inode)
+ {
+- if (S_ISREG(le16_to_cpu(raw_inode->i_mode)))
+- return ((loff_t)le32_to_cpu(raw_inode->i_size_high) << 32) |
+- le32_to_cpu(raw_inode->i_size_lo);
+- else
+- return (loff_t) le32_to_cpu(raw_inode->i_size_lo);
++ return ((loff_t)le32_to_cpu(raw_inode->i_size_high) << 32) |
++ le32_to_cpu(raw_inode->i_size_lo);
+ }
+
+ static inline void ext4_isize_set(struct ext4_inode *raw_inode, loff_t i_size)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ext4/extents.c linux-2.6.29-rc3.owrt/fs/ext4/extents.c
+--- linux-2.6.29.owrt/fs/ext4/extents.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ext4/extents.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1122,8 +1122,7 @@
+ struct ext4_extent_idx *ix;
+ struct ext4_extent *ex;
+ ext4_fsblk_t block;
+- int depth; /* Note, NOT eh_depth; depth from top of tree */
+- int ee_len;
++ int depth, ee_len;
+
+ BUG_ON(path == NULL);
+ depth = path->p_depth;
+@@ -1180,8 +1179,7 @@
+ if (bh == NULL)
+ return -EIO;
+ eh = ext_block_hdr(bh);
+- /* subtract from p_depth to get proper eh_depth */
+- if (ext4_ext_check_header(inode, eh, path->p_depth - depth)) {
++ if (ext4_ext_check_header(inode, eh, depth)) {
+ put_bh(bh);
+ return -EIO;
+ }
+@@ -3050,7 +3048,7 @@
+ WARN_ON(ret <= 0);
+ printk(KERN_ERR "%s: ext4_ext_get_blocks "
+ "returned error inode#%lu, block=%u, "
+- "max_blocks=%u", __func__,
++ "max_blocks=%lu", __func__,
+ inode->i_ino, block, max_blocks);
+ #endif
+ ext4_mark_inode_dirty(handle, inode);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ext4/ialloc.c linux-2.6.29-rc3.owrt/fs/ext4/ialloc.c
+--- linux-2.6.29.owrt/fs/ext4/ialloc.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ext4/ialloc.c 2009-05-10 23:48:29.000000000 +0200
+@@ -188,7 +188,7 @@
+ struct ext4_group_desc *gdp;
+ struct ext4_super_block *es;
+ struct ext4_sb_info *sbi;
+- int fatal = 0, err, count, cleared;
++ int fatal = 0, err, count;
+ ext4_group_t flex_group;
+
+ if (atomic_read(&inode->i_count) > 1) {
+@@ -248,10 +248,8 @@
+ goto error_return;
+
+ /* Ok, now we can actually update the inode bitmaps.. */
+- spin_lock(sb_bgl_lock(sbi, block_group));
+- cleared = ext4_clear_bit(bit, bitmap_bh->b_data);
+- spin_unlock(sb_bgl_lock(sbi, block_group));
+- if (!cleared)
++ if (!ext4_clear_bit_atomic(sb_bgl_lock(sbi, block_group),
++ bit, bitmap_bh->b_data))
+ ext4_error(sb, "ext4_free_inode",
+ "bit already cleared for inode %lu", ino);
+ else {
+@@ -698,7 +696,6 @@
+ struct inode *ret;
+ ext4_group_t i;
+ int free = 0;
+- static int once = 1;
+ ext4_group_t flex_group;
+
+ /* Cannot create files in a deleted directory */
+@@ -718,14 +715,6 @@
+
+ if (sbi->s_log_groups_per_flex) {
+ ret2 = find_group_flex(sb, dir, &group);
+- if (ret2 == -1) {
+- ret2 = find_group_other(sb, dir, &group);
+- if (ret2 == 0 && once)
+- once = 0;
+- printk(KERN_NOTICE "ext4: find_group_flex "
+- "failed, fallback succeeded dir %lu\n",
+- dir->i_ino);
+- }
+ goto got_group;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ext4/inode.c linux-2.6.29-rc3.owrt/fs/ext4/inode.c
+--- linux-2.6.29.owrt/fs/ext4/inode.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ext4/inode.c 2009-05-10 23:48:29.000000000 +0200
+@@ -47,10 +47,8 @@
+ static inline int ext4_begin_ordered_truncate(struct inode *inode,
+ loff_t new_size)
+ {
+- return jbd2_journal_begin_ordered_truncate(
+- EXT4_SB(inode->i_sb)->s_journal,
+- &EXT4_I(inode)->jinode,
+- new_size);
++ return jbd2_journal_begin_ordered_truncate(&EXT4_I(inode)->jinode,
++ new_size);
+ }
+
+ static void ext4_invalidatepage(struct page *page, unsigned long offset);
+@@ -362,9 +360,9 @@
+ final = ptrs;
+ } else {
+ ext4_warning(inode->i_sb, "ext4_block_to_path",
+- "block %lu > max in inode %lu",
++ "block %lu > max",
+ i_block + direct_blocks +
+- indirect_blocks + double_blocks, inode->i_ino);
++ indirect_blocks + double_blocks);
+ }
+ if (boundary)
+ *boundary = final - 1 - (i_block & (ptrs - 1));
+@@ -1368,10 +1366,6 @@
+ goto out;
+ }
+
+- /* We cannot recurse into the filesystem as the transaction is already
+- * started */
+- flags |= AOP_FLAG_NOFS;
+-
+ page = grab_cache_page_write_begin(mapping, index, flags);
+ if (!page) {
+ ext4_journal_stop(handle);
+@@ -1381,7 +1375,7 @@
+ *pagep = page;
+
+ ret = block_write_begin(file, mapping, pos, len, flags, pagep, fsdata,
+- ext4_get_block);
++ ext4_get_block);
+
+ if (!ret && ext4_should_journal_data(inode)) {
+ ret = walk_page_buffers(handle, page_buffers(page),
+@@ -2443,7 +2437,6 @@
+ int no_nrwrite_index_update;
+ int pages_written = 0;
+ long pages_skipped;
+- int range_cyclic, cycled = 1, io_done = 0;
+ int needed_blocks, ret = 0, nr_to_writebump = 0;
+ struct ext4_sb_info *sbi = EXT4_SB(mapping->host->i_sb);
+
+@@ -2495,15 +2488,9 @@
+ if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX)
+ range_whole = 1;
+
+- range_cyclic = wbc->range_cyclic;
+- if (wbc->range_cyclic) {
++ if (wbc->range_cyclic)
+ index = mapping->writeback_index;
+- if (index)
+- cycled = 0;
+- wbc->range_start = index << PAGE_CACHE_SHIFT;
+- wbc->range_end = LLONG_MAX;
+- wbc->range_cyclic = 0;
+- } else
++ else
+ index = wbc->range_start >> PAGE_CACHE_SHIFT;
+
+ mpd.wbc = wbc;
+@@ -2517,7 +2504,6 @@
+ wbc->no_nrwrite_index_update = 1;
+ pages_skipped = wbc->pages_skipped;
+
+-retry:
+ while (!ret && wbc->nr_to_write > 0) {
+
+ /*
+@@ -2544,7 +2530,7 @@
+
+ ext4_journal_stop(handle);
+
+- if ((mpd.retval == -ENOSPC) && sbi->s_journal) {
++ if (mpd.retval == -ENOSPC) {
+ /* commit the transaction which would
+ * free blocks released in the transaction
+ * and try again
+@@ -2560,7 +2546,6 @@
+ pages_written += mpd.pages_written;
+ wbc->pages_skipped = pages_skipped;
+ ret = 0;
+- io_done = 1;
+ } else if (wbc->nr_to_write)
+ /*
+ * There is no more writeout needed
+@@ -2569,13 +2554,6 @@
+ */
+ break;
+ }
+- if (!io_done && !cycled) {
+- cycled = 1;
+- index = 0;
+- wbc->range_start = index << PAGE_CACHE_SHIFT;
+- wbc->range_end = mapping->writeback_index - 1;
+- goto retry;
+- }
+ if (pages_skipped != wbc->pages_skipped)
+ printk(KERN_EMERG "This should not happen leaving %s "
+ "with nr_to_write = %ld ret = %d\n",
+@@ -2583,7 +2561,6 @@
+
+ /* Update index */
+ index += pages_written;
+- wbc->range_cyclic = range_cyclic;
+ if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0))
+ /*
+ * set the writeback_index so that range_cyclic
+@@ -2671,9 +2648,6 @@
+ ret = PTR_ERR(handle);
+ goto out;
+ }
+- /* We cannot recurse into the filesystem as the transaction is already
+- * started */
+- flags |= AOP_FLAG_NOFS;
+
+ page = grab_cache_page_write_begin(mapping, index, flags);
+ if (!page) {
+@@ -2847,6 +2821,9 @@
+ filemap_write_and_wait(mapping);
+ }
+
++ BUG_ON(!EXT4_JOURNAL(inode) &&
++ EXT4_I(inode)->i_state & EXT4_STATE_JDATA);
++
+ if (EXT4_JOURNAL(inode) && EXT4_I(inode)->i_state & EXT4_STATE_JDATA) {
+ /*
+ * This is a REALLY heavyweight approach, but the use of
+@@ -3645,7 +3622,7 @@
+ * block pointed to itself, it would have been detached when
+ * the block was cleared. Check for this instead of OOPSing.
+ */
+- if ((EXT4_JOURNAL(inode) == NULL) || bh2jh(this_bh))
++ if (bh2jh(this_bh))
+ ext4_handle_dirty_metadata(handle, inode, this_bh);
+ else
+ ext4_error(inode->i_sb, __func__,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ext4/mballoc.c linux-2.6.29-rc3.owrt/fs/ext4/mballoc.c
+--- linux-2.6.29.owrt/fs/ext4/mballoc.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ext4/mballoc.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1447,7 +1447,7 @@
+ struct ext4_free_extent *gex = &ac->ac_g_ex;
+
+ BUG_ON(ex->fe_len <= 0);
+- BUG_ON(ex->fe_len > EXT4_BLOCKS_PER_GROUP(ac->ac_sb));
++ BUG_ON(ex->fe_len >= EXT4_BLOCKS_PER_GROUP(ac->ac_sb));
+ BUG_ON(ex->fe_start >= EXT4_BLOCKS_PER_GROUP(ac->ac_sb));
+ BUG_ON(ac->ac_status != AC_STATUS_CONTINUE);
+
+@@ -3025,7 +3025,7 @@
+ goto out_err;
+
+ ext4_debug("using block group %u(%d)\n", ac->ac_b_ex.fe_group,
+- ext4_free_blks_count(sb, gdp));
++ gdp->bg_free_blocks_count);
+
+ err = ext4_journal_get_write_access(handle, gdp_bh);
+ if (err)
+@@ -3292,7 +3292,7 @@
+ }
+ BUG_ON(start + size <= ac->ac_o_ex.fe_logical &&
+ start > ac->ac_o_ex.fe_logical);
+- BUG_ON(size <= 0 || size > EXT4_BLOCKS_PER_GROUP(ac->ac_sb));
++ BUG_ON(size <= 0 || size >= EXT4_BLOCKS_PER_GROUP(ac->ac_sb));
+
+ /* now prepare goal request */
+
+@@ -3589,7 +3589,6 @@
+ struct super_block *sb, struct ext4_prealloc_space *pa)
+ {
+ ext4_group_t grp;
+- ext4_fsblk_t grp_blk;
+
+ if (!atomic_dec_and_test(&pa->pa_count) || pa->pa_free != 0)
+ return;
+@@ -3604,12 +3603,8 @@
+ pa->pa_deleted = 1;
+ spin_unlock(&pa->pa_lock);
+
+- grp_blk = pa->pa_pstart;
+- /* If linear, pa_pstart may be in the next group when pa is used up */
+- if (pa->pa_linear)
+- grp_blk--;
+-
+- ext4_get_group_no_and_offset(sb, grp_blk, &grp, NULL);
++ /* -1 is to protect from crossing allocation group */
++ ext4_get_group_no_and_offset(sb, pa->pa_pstart - 1, &grp, NULL);
+
+ /*
+ * possible race:
+@@ -3698,8 +3693,6 @@
+ pa->pa_free = pa->pa_len;
+ atomic_set(&pa->pa_count, 1);
+ spin_lock_init(&pa->pa_lock);
+- INIT_LIST_HEAD(&pa->pa_inode_list);
+- INIT_LIST_HEAD(&pa->pa_group_list);
+ pa->pa_deleted = 0;
+ pa->pa_linear = 0;
+
+@@ -3762,7 +3755,6 @@
+ atomic_set(&pa->pa_count, 1);
+ spin_lock_init(&pa->pa_lock);
+ INIT_LIST_HEAD(&pa->pa_inode_list);
+- INIT_LIST_HEAD(&pa->pa_group_list);
+ pa->pa_deleted = 0;
+ pa->pa_linear = 1;
+
+@@ -4484,26 +4476,23 @@
+ pa->pa_free -= ac->ac_b_ex.fe_len;
+ pa->pa_len -= ac->ac_b_ex.fe_len;
+ spin_unlock(&pa->pa_lock);
++ /*
++ * We want to add the pa to the right bucket.
++ * Remove it from the list and while adding
++ * make sure the list to which we are adding
++ * doesn't grow big.
++ */
++ if (likely(pa->pa_free)) {
++ spin_lock(pa->pa_obj_lock);
++ list_del_rcu(&pa->pa_inode_list);
++ spin_unlock(pa->pa_obj_lock);
++ ext4_mb_add_n_trim(ac);
++ }
+ }
++ ext4_mb_put_pa(ac, ac->ac_sb, pa);
+ }
+ if (ac->alloc_semp)
+ up_read(ac->alloc_semp);
+- if (pa) {
+- /*
+- * We want to add the pa to the right bucket.
+- * Remove it from the list and while adding
+- * make sure the list to which we are adding
+- * doesn't grow big. We need to release
+- * alloc_semp before calling ext4_mb_add_n_trim()
+- */
+- if (pa->pa_linear && likely(pa->pa_free)) {
+- spin_lock(pa->pa_obj_lock);
+- list_del_rcu(&pa->pa_inode_list);
+- spin_unlock(pa->pa_obj_lock);
+- ext4_mb_add_n_trim(ac);
+- }
+- ext4_mb_put_pa(ac, ac->ac_sb, pa);
+- }
+ if (ac->ac_bitmap_page)
+ page_cache_release(ac->ac_bitmap_page);
+ if (ac->ac_buddy_page)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ext4/migrate.c linux-2.6.29-rc3.owrt/fs/ext4/migrate.c
+--- linux-2.6.29.owrt/fs/ext4/migrate.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ext4/migrate.c 2009-05-10 23:48:29.000000000 +0200
+@@ -481,7 +481,7 @@
+ + 1);
+ if (IS_ERR(handle)) {
+ retval = PTR_ERR(handle);
+- return retval;
++ goto err_out;
+ }
+ tmp_inode = ext4_new_inode(handle,
+ inode->i_sb->s_root->d_inode,
+@@ -489,7 +489,8 @@
+ if (IS_ERR(tmp_inode)) {
+ retval = -ENOMEM;
+ ext4_journal_stop(handle);
+- return retval;
++ tmp_inode = NULL;
++ goto err_out;
+ }
+ i_size_write(tmp_inode, i_size_read(inode));
+ /*
+@@ -617,7 +618,8 @@
+
+ ext4_journal_stop(handle);
+
+- iput(tmp_inode);
++ if (tmp_inode)
++ iput(tmp_inode);
+
+ return retval;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ext4/namei.c linux-2.6.29-rc3.owrt/fs/ext4/namei.c
+--- linux-2.6.29.owrt/fs/ext4/namei.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ext4/namei.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1368,7 +1368,7 @@
+ struct fake_dirent *fde;
+
+ blocksize = dir->i_sb->s_blocksize;
+- dxtrace(printk(KERN_DEBUG "Creating index: inode %lu\n", dir->i_ino));
++ dxtrace(printk(KERN_DEBUG "Creating index\n"));
+ retval = ext4_journal_get_write_access(handle, bh);
+ if (retval) {
+ ext4_std_error(dir->i_sb, retval);
+@@ -1377,20 +1377,6 @@
+ }
+ root = (struct dx_root *) bh->b_data;
+
+- /* The 0th block becomes the root, move the dirents out */
+- fde = &root->dotdot;
+- de = (struct ext4_dir_entry_2 *)((char *)fde +
+- ext4_rec_len_from_disk(fde->rec_len));
+- if ((char *) de >= (((char *) root) + blocksize)) {
+- ext4_error(dir->i_sb, __func__,
+- "invalid rec_len for '..' in inode %lu",
+- dir->i_ino);
+- brelse(bh);
+- return -EIO;
+- }
+- len = ((char *) root) + blocksize - (char *) de;
+-
+- /* Allocate new block for the 0th block's dirents */
+ bh2 = ext4_append(handle, dir, &block, &retval);
+ if (!(bh2)) {
+ brelse(bh);
+@@ -1399,6 +1385,11 @@
+ EXT4_I(dir)->i_flags |= EXT4_INDEX_FL;
+ data1 = bh2->b_data;
+
++ /* The 0th block becomes the root, move the dirents out */
++ fde = &root->dotdot;
++ de = (struct ext4_dir_entry_2 *)((char *)fde +
++ ext4_rec_len_from_disk(fde->rec_len));
++ len = ((char *) root) + blocksize - (char *) de;
+ memcpy (data1, de, len);
+ de = (struct ext4_dir_entry_2 *) data1;
+ top = data1 + len;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ext4/resize.c linux-2.6.29-rc3.owrt/fs/ext4/resize.c
+--- linux-2.6.29.owrt/fs/ext4/resize.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ext4/resize.c 2009-05-10 23:48:29.000000000 +0200
+@@ -861,13 +861,12 @@
+ gdp = (struct ext4_group_desc *)((char *)primary->b_data +
+ gdb_off * EXT4_DESC_SIZE(sb));
+
+- memset(gdp, 0, EXT4_DESC_SIZE(sb));
+ ext4_block_bitmap_set(sb, gdp, input->block_bitmap); /* LV FIXME */
+ ext4_inode_bitmap_set(sb, gdp, input->inode_bitmap); /* LV FIXME */
+ ext4_inode_table_set(sb, gdp, input->inode_table); /* LV FIXME */
+ ext4_free_blks_set(sb, gdp, input->free_blocks_count);
+ ext4_free_inodes_set(sb, gdp, EXT4_INODES_PER_GROUP(sb));
+- gdp->bg_flags = cpu_to_le16(EXT4_BG_INODE_ZEROED);
++ gdp->bg_flags |= cpu_to_le16(EXT4_BG_INODE_ZEROED);
+ gdp->bg_checksum = ext4_group_desc_csum(sbi, input->group, gdp);
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ext4/super.c linux-2.6.29-rc3.owrt/fs/ext4/super.c
+--- linux-2.6.29.owrt/fs/ext4/super.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ext4/super.c 2009-05-10 23:48:29.000000000 +0200
+@@ -3046,17 +3046,14 @@
+ static int ext4_sync_fs(struct super_block *sb, int wait)
+ {
+ int ret = 0;
+- tid_t target;
+
+ trace_mark(ext4_sync_fs, "dev %s wait %d", sb->s_id, wait);
+ sb->s_dirt = 0;
+ if (EXT4_SB(sb)->s_journal) {
+- if (jbd2_journal_start_commit(EXT4_SB(sb)->s_journal,
+- &target)) {
+- if (wait)
+- jbd2_log_wait_commit(EXT4_SB(sb)->s_journal,
+- target);
+- }
++ if (wait)
++ ret = ext4_force_commit(sb);
++ else
++ jbd2_journal_start_commit(EXT4_SB(sb)->s_journal, NULL);
+ } else {
+ ext4_commit_super(sb, EXT4_SB(sb)->s_es, wait);
+ }
+@@ -3091,6 +3088,7 @@
+
+ /* Journal blocked and flushed, clear needs_recovery flag. */
+ EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER);
++ ext4_commit_super(sb, EXT4_SB(sb)->s_es, 1);
+ error = ext4_commit_super(sb, EXT4_SB(sb)->s_es, 1);
+ if (error)
+ goto out;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/fat/inode.c linux-2.6.29-rc3.owrt/fs/fat/inode.c
+--- linux-2.6.29.owrt/fs/fat/inode.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/fat/inode.c 2009-05-10 23:48:29.000000000 +0200
+@@ -202,9 +202,9 @@
+ sector_t blocknr;
+
+ /* fat_get_cluster() assumes the requested blocknr isn't truncated. */
+- down_read(&mapping->host->i_alloc_sem);
++ mutex_lock(&mapping->host->i_mutex);
+ blocknr = generic_block_bmap(mapping, block, fat_get_block);
+- up_read(&mapping->host->i_alloc_sem);
++ mutex_unlock(&mapping->host->i_mutex);
+
+ return blocknr;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/fs-writeback.c linux-2.6.29-rc3.owrt/fs/fs-writeback.c
+--- linux-2.6.29.owrt/fs/fs-writeback.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/fs-writeback.c 2009-05-10 23:48:29.000000000 +0200
+@@ -274,7 +274,6 @@
+ int ret;
+
+ BUG_ON(inode->i_state & I_SYNC);
+- WARN_ON(inode->i_state & I_NEW);
+
+ /* Set I_SYNC, reset I_DIRTY */
+ dirty = inode->i_state & I_DIRTY;
+@@ -299,7 +298,6 @@
+ }
+
+ spin_lock(&inode_lock);
+- WARN_ON(inode->i_state & I_NEW);
+ inode->i_state &= ~I_SYNC;
+ if (!(inode->i_state & I_FREEING)) {
+ if (!(inode->i_state & I_DIRTY) &&
+@@ -472,11 +470,6 @@
+ break;
+ }
+
+- if (inode->i_state & I_NEW) {
+- requeue_io(inode);
+- continue;
+- }
+-
+ if (wbc->nonblocking && bdi_write_congested(bdi)) {
+ wbc->encountered_congestion = 1;
+ if (!sb_is_blkdev_sb(sb))
+@@ -538,7 +531,7 @@
+ list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
+ struct address_space *mapping;
+
+- if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW))
++ if (inode->i_state & (I_FREEING|I_WILL_FREE))
+ continue;
+ mapping = inode->i_mapping;
+ if (mapping->nrpages == 0)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/hugetlbfs/inode.c linux-2.6.29-rc3.owrt/fs/hugetlbfs/inode.c
+--- linux-2.6.29.owrt/fs/hugetlbfs/inode.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/hugetlbfs/inode.c 2009-05-10 23:48:29.000000000 +0200
+@@ -108,8 +108,7 @@
+
+ if (hugetlb_reserve_pages(inode,
+ vma->vm_pgoff >> huge_page_order(h),
+- len >> huge_page_shift(h), vma,
+- vma->vm_flags))
++ len >> huge_page_shift(h), vma))
+ goto out;
+
+ ret = 0;
+@@ -948,7 +947,7 @@
+ can_do_mlock());
+ }
+
+-struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag)
++struct file *hugetlb_file_setup(const char *name, size_t size)
+ {
+ int error = -ENOMEM;
+ struct file *file;
+@@ -982,8 +981,7 @@
+
+ error = -ENOMEM;
+ if (hugetlb_reserve_pages(inode, 0,
+- size >> huge_page_shift(hstate_inode(inode)), NULL,
+- acctflag))
++ size >> huge_page_shift(hstate_inode(inode)), NULL))
+ goto out_inode;
+
+ d_instantiate(dentry, inode);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/inode.c linux-2.6.29-rc3.owrt/fs/inode.c
+--- linux-2.6.29.owrt/fs/inode.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/inode.c 2009-05-10 23:48:29.000000000 +0200
+@@ -359,7 +359,6 @@
+ invalidate_inode_buffers(inode);
+ if (!atomic_read(&inode->i_count)) {
+ list_move(&inode->i_list, dispose);
+- WARN_ON(inode->i_state & I_NEW);
+ inode->i_state |= I_FREEING;
+ count++;
+ continue;
+@@ -461,7 +460,6 @@
+ continue;
+ }
+ list_move(&inode->i_list, &freeable);
+- WARN_ON(inode->i_state & I_NEW);
+ inode->i_state |= I_FREEING;
+ nr_pruned++;
+ }
+@@ -658,7 +656,6 @@
+ * just created it (so there can be no old holders
+ * that haven't tested I_LOCK).
+ */
+- WARN_ON((inode->i_state & (I_LOCK|I_NEW)) != (I_LOCK|I_NEW));
+ inode->i_state &= ~(I_LOCK|I_NEW);
+ wake_up_inode(inode);
+ }
+@@ -1148,7 +1145,6 @@
+
+ list_del_init(&inode->i_list);
+ list_del_init(&inode->i_sb_list);
+- WARN_ON(inode->i_state & I_NEW);
+ inode->i_state |= I_FREEING;
+ inodes_stat.nr_inodes--;
+ spin_unlock(&inode_lock);
+@@ -1190,19 +1186,16 @@
+ spin_unlock(&inode_lock);
+ return;
+ }
+- WARN_ON(inode->i_state & I_NEW);
+ inode->i_state |= I_WILL_FREE;
+ spin_unlock(&inode_lock);
+ write_inode_now(inode, 1);
+ spin_lock(&inode_lock);
+- WARN_ON(inode->i_state & I_NEW);
+ inode->i_state &= ~I_WILL_FREE;
+ inodes_stat.nr_unused--;
+ hlist_del_init(&inode->i_hash);
+ }
+ list_del_init(&inode->i_list);
+ list_del_init(&inode->i_sb_list);
+- WARN_ON(inode->i_state & I_NEW);
+ inode->i_state |= I_FREEING;
+ inodes_stat.nr_inodes--;
+ spin_unlock(&inode_lock);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/internal.h linux-2.6.29-rc3.owrt/fs/internal.h
+--- linux-2.6.29.owrt/fs/internal.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/internal.h 2009-05-10 23:48:29.000000000 +0200
+@@ -43,7 +43,7 @@
+ /*
+ * exec.c
+ */
+-extern void check_unsafe_exec(struct linux_binprm *, struct files_struct *);
++extern void check_unsafe_exec(struct linux_binprm *);
+
+ /*
+ * namespace.c
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/jbd/journal.c linux-2.6.29-rc3.owrt/fs/jbd/journal.c
+--- linux-2.6.29.owrt/fs/jbd/journal.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/jbd/journal.c 2009-05-10 23:48:29.000000000 +0200
+@@ -427,7 +427,7 @@
+ }
+
+ /*
+- * Called under j_state_lock. Returns true if a transaction commit was started.
++ * Called under j_state_lock. Returns true if a transaction was started.
+ */
+ int __log_start_commit(journal_t *journal, tid_t target)
+ {
+@@ -495,8 +495,7 @@
+
+ /*
+ * Start a commit of the current running transaction (if any). Returns true
+- * if a transaction is going to be committed (or is currently already
+- * committing), and fills its tid in at *ptid
++ * if a transaction was started, and fills its tid in at *ptid
+ */
+ int journal_start_commit(journal_t *journal, tid_t *ptid)
+ {
+@@ -506,19 +505,15 @@
+ if (journal->j_running_transaction) {
+ tid_t tid = journal->j_running_transaction->t_tid;
+
+- __log_start_commit(journal, tid);
+- /* There's a running transaction and we've just made sure
+- * it's commit has been scheduled. */
+- if (ptid)
++ ret = __log_start_commit(journal, tid);
++ if (ret && ptid)
+ *ptid = tid;
+- ret = 1;
+- } else if (journal->j_committing_transaction) {
++ } else if (journal->j_committing_transaction && ptid) {
+ /*
+ * If ext3_write_super() recently started a commit, then we
+ * have to wait for completion of that transaction
+ */
+- if (ptid)
+- *ptid = journal->j_committing_transaction->t_tid;
++ *ptid = journal->j_committing_transaction->t_tid;
+ ret = 1;
+ }
+ spin_unlock(&journal->j_state_lock);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/jbd2/journal.c linux-2.6.29-rc3.owrt/fs/jbd2/journal.c
+--- linux-2.6.29.owrt/fs/jbd2/journal.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/jbd2/journal.c 2009-05-10 23:48:29.000000000 +0200
+@@ -37,10 +37,10 @@
+ #include <linux/proc_fs.h>
+ #include <linux/debugfs.h>
+ #include <linux/seq_file.h>
+-#include <linux/math64.h>
+
+ #include <asm/uaccess.h>
+ #include <asm/page.h>
++#include <asm/div64.h>
+
+ EXPORT_SYMBOL(jbd2_journal_start);
+ EXPORT_SYMBOL(jbd2_journal_restart);
+@@ -450,7 +450,7 @@
+ }
+
+ /*
+- * Called under j_state_lock. Returns true if a transaction commit was started.
++ * Called under j_state_lock. Returns true if a transaction was started.
+ */
+ int __jbd2_log_start_commit(journal_t *journal, tid_t target)
+ {
+@@ -518,8 +518,7 @@
+
+ /*
+ * Start a commit of the current running transaction (if any). Returns true
+- * if a transaction is going to be committed (or is currently already
+- * committing), and fills its tid in at *ptid
++ * if a transaction was started, and fills its tid in at *ptid
+ */
+ int jbd2_journal_start_commit(journal_t *journal, tid_t *ptid)
+ {
+@@ -529,19 +528,15 @@
+ if (journal->j_running_transaction) {
+ tid_t tid = journal->j_running_transaction->t_tid;
+
+- __jbd2_log_start_commit(journal, tid);
+- /* There's a running transaction and we've just made sure
+- * it's commit has been scheduled. */
+- if (ptid)
++ ret = __jbd2_log_start_commit(journal, tid);
++ if (ret && ptid)
+ *ptid = tid;
+- ret = 1;
+- } else if (journal->j_committing_transaction) {
++ } else if (journal->j_committing_transaction && ptid) {
+ /*
+ * If ext3_write_super() recently started a commit, then we
+ * have to wait for completion of that transaction
+ */
+- if (ptid)
+- *ptid = journal->j_committing_transaction->t_tid;
++ *ptid = journal->j_committing_transaction->t_tid;
+ ret = 1;
+ }
+ spin_unlock(&journal->j_state_lock);
+@@ -851,8 +846,8 @@
+ jiffies_to_msecs(s->stats->u.run.rs_flushing / s->stats->ts_tid));
+ seq_printf(seq, " %ums logging transaction\n",
+ jiffies_to_msecs(s->stats->u.run.rs_logging / s->stats->ts_tid));
+- seq_printf(seq, " %lluus average transaction commit time\n",
+- div_u64(s->journal->j_average_commit_time, 1000));
++ seq_printf(seq, " %luus average transaction commit time\n",
++ do_div(s->journal->j_average_commit_time, 1000));
+ seq_printf(seq, " %lu handles per transaction\n",
+ s->stats->u.run.rs_handle_count / s->stats->ts_tid);
+ seq_printf(seq, " %lu blocks per transaction\n",
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/jbd2/transaction.c linux-2.6.29-rc3.owrt/fs/jbd2/transaction.c
+--- linux-2.6.29.owrt/fs/jbd2/transaction.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/jbd2/transaction.c 2009-05-10 23:48:29.000000000 +0200
+@@ -2129,46 +2129,26 @@
+ }
+
+ /*
+- * File truncate and transaction commit interact with each other in a
+- * non-trivial way. If a transaction writing data block A is
+- * committing, we cannot discard the data by truncate until we have
+- * written them. Otherwise if we crashed after the transaction with
+- * write has committed but before the transaction with truncate has
+- * committed, we could see stale data in block A. This function is a
+- * helper to solve this problem. It starts writeout of the truncated
+- * part in case it is in the committing transaction.
+- *
+- * Filesystem code must call this function when inode is journaled in
+- * ordered mode before truncation happens and after the inode has been
+- * placed on orphan list with the new inode size. The second condition
+- * avoids the race that someone writes new data and we start
+- * committing the transaction after this function has been called but
+- * before a transaction for truncate is started (and furthermore it
+- * allows us to optimize the case where the addition to orphan list
+- * happens in the same transaction as write --- we don't have to write
+- * any data in such case).
++ * This function must be called when inode is journaled in ordered mode
++ * before truncation happens. It starts writeout of truncated part in
++ * case it is in the committing transaction so that we stand to ordered
++ * mode consistency guarantees.
+ */
+-int jbd2_journal_begin_ordered_truncate(journal_t *journal,
+- struct jbd2_inode *jinode,
++int jbd2_journal_begin_ordered_truncate(struct jbd2_inode *inode,
+ loff_t new_size)
+ {
+- transaction_t *inode_trans, *commit_trans;
++ journal_t *journal;
++ transaction_t *commit_trans;
+ int ret = 0;
+
+- /* This is a quick check to avoid locking if not necessary */
+- if (!jinode->i_transaction)
++ if (!inode->i_transaction && !inode->i_next_transaction)
+ goto out;
+- /* Locks are here just to force reading of recent values, it is
+- * enough that the transaction was not committing before we started
+- * a transaction adding the inode to orphan list */
++ journal = inode->i_transaction->t_journal;
+ spin_lock(&journal->j_state_lock);
+ commit_trans = journal->j_committing_transaction;
+ spin_unlock(&journal->j_state_lock);
+- spin_lock(&journal->j_list_lock);
+- inode_trans = jinode->i_transaction;
+- spin_unlock(&journal->j_list_lock);
+- if (inode_trans == commit_trans) {
+- ret = filemap_fdatawrite_range(jinode->i_vfs_inode->i_mapping,
++ if (inode->i_transaction == commit_trans) {
++ ret = filemap_fdatawrite_range(inode->i_vfs_inode->i_mapping,
+ new_size, LLONG_MAX);
+ if (ret)
+ jbd2_journal_abort(journal, ret);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/jffs2/background.c linux-2.6.29-rc3.owrt/fs/jffs2/background.c
+--- linux-2.6.29.owrt/fs/jffs2/background.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/jffs2/background.c 2009-05-10 23:48:29.000000000 +0200
+@@ -95,17 +95,13 @@
+ spin_unlock(&c->erase_completion_lock);
+
+
+- /* Problem - immediately after bootup, the GCD spends a lot
+- * of time in places like jffs2_kill_fragtree(); so much so
+- * that userspace processes (like gdm and X) are starved
+- * despite plenty of cond_resched()s and renicing. Yield()
+- * doesn't help, either (presumably because userspace and GCD
+- * are generally competing for a higher latency resource -
+- * disk).
+- * This forces the GCD to slow the hell down. Pulling an
+- * inode in with read_inode() is much preferable to having
+- * the GC thread get there first. */
+- schedule_timeout_interruptible(msecs_to_jiffies(50));
++ /* This thread is purely an optimisation. But if it runs when
++ other things could be running, it actually makes things a
++ lot worse. Use yield() and put it at the back of the runqueue
++ every time. Especially during boot, pulling an inode in
++ with read_inode() is much preferable to having the GC thread
++ get there first. */
++ yield();
+
+ /* Put_super will send a SIGKILL and then wait on the sem.
+ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/jffs2/readinode.c linux-2.6.29-rc3.owrt/fs/jffs2/readinode.c
+--- linux-2.6.29.owrt/fs/jffs2/readinode.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/jffs2/readinode.c 2009-05-10 23:48:29.000000000 +0200
+@@ -220,7 +220,7 @@
+ struct jffs2_tmp_dnode_info *tn)
+ {
+ uint32_t fn_end = tn->fn->ofs + tn->fn->size;
+- struct jffs2_tmp_dnode_info *this, *ptn;
++ struct jffs2_tmp_dnode_info *this;
+
+ dbg_readinode("insert fragment %#04x-%#04x, ver %u at %08x\n", tn->fn->ofs, fn_end, tn->version, ref_offset(tn->fn->raw));
+
+@@ -251,18 +251,11 @@
+ if (this) {
+ /* If the node is coincident with another at a lower address,
+ back up until the other node is found. It may be relevant */
+- while (this->overlapped) {
+- ptn = tn_prev(this);
+- if (!ptn) {
+- /*
+- * We killed a node which set the overlapped
+- * flags during the scan. Fix it up.
+- */
+- this->overlapped = 0;
+- break;
+- }
+- this = ptn;
+- }
++ while (this->overlapped)
++ this = tn_prev(this);
++
++ /* First node should never be marked overlapped */
++ BUG_ON(!this);
+ dbg_readinode("'this' found %#04x-%#04x (%s)\n", this->fn->ofs, this->fn->ofs + this->fn->size, this->fn ? "data" : "hole");
+ }
+
+@@ -367,17 +360,7 @@
+ }
+ if (!this->overlapped)
+ break;
+-
+- ptn = tn_prev(this);
+- if (!ptn) {
+- /*
+- * We killed a node which set the overlapped
+- * flags during the scan. Fix it up.
+- */
+- this->overlapped = 0;
+- break;
+- }
+- this = ptn;
++ this = tn_prev(this);
+ }
+ }
+
+@@ -473,15 +456,8 @@
+ eat_last(&rii->tn_root, &last->rb);
+ ver_insert(&ver_root, last);
+
+- if (unlikely(last->overlapped)) {
+- if (pen)
+- continue;
+- /*
+- * We killed a node which set the overlapped
+- * flags during the scan. Fix it up.
+- */
+- last->overlapped = 0;
+- }
++ if (unlikely(last->overlapped))
++ continue;
+
+ /* Now we have a bunch of nodes in reverse version
+ order, in the tree at ver_root. Most of the time,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/lockd/clntlock.c linux-2.6.29-rc3.owrt/fs/lockd/clntlock.c
+--- linux-2.6.29.owrt/fs/lockd/clntlock.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/lockd/clntlock.c 2009-05-10 23:48:29.000000000 +0200
+@@ -139,55 +139,6 @@
+ return 0;
+ }
+
+-#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+-static const struct in6_addr *nlmclnt_map_v4addr(const struct sockaddr *sap,
+- struct in6_addr *addr_mapped)
+-{
+- const struct sockaddr_in *sin = (const struct sockaddr_in *)sap;
+-
+- switch (sap->sa_family) {
+- case AF_INET6:
+- return &((const struct sockaddr_in6 *)sap)->sin6_addr;
+- case AF_INET:
+- ipv6_addr_set_v4mapped(sin->sin_addr.s_addr, addr_mapped);
+- return addr_mapped;
+- }
+-
+- return NULL;
+-}
+-
+-/*
+- * If lockd is using a PF_INET6 listener, all incoming requests appear
+- * to come from AF_INET6 remotes. The address of AF_INET remotes are
+- * mapped to AF_INET6 automatically by the network layer. In case the
+- * user passed an AF_INET server address at mount time, ensure both
+- * addresses are AF_INET6 before comparing them.
+- */
+-static int nlmclnt_cmp_addr(const struct nlm_host *host,
+- const struct sockaddr *sap)
+-{
+- const struct in6_addr *addr1;
+- const struct in6_addr *addr2;
+- struct in6_addr addr1_mapped;
+- struct in6_addr addr2_mapped;
+-
+- addr1 = nlmclnt_map_v4addr(nlm_addr(host), &addr1_mapped);
+- if (likely(addr1 != NULL)) {
+- addr2 = nlmclnt_map_v4addr(sap, &addr2_mapped);
+- if (likely(addr2 != NULL))
+- return ipv6_addr_equal(addr1, addr2);
+- }
+-
+- return 0;
+-}
+-#else /* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */
+-static int nlmclnt_cmp_addr(const struct nlm_host *host,
+- const struct sockaddr *sap)
+-{
+- return nlm_cmp_addr(nlm_addr(host), sap);
+-}
+-#endif /* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */
+-
+ /*
+ * The server lockd has called us back to tell us the lock was granted
+ */
+@@ -215,7 +166,7 @@
+ */
+ if (fl_blocked->fl_u.nfs_fl.owner->pid != lock->svid)
+ continue;
+- if (!nlmclnt_cmp_addr(block->b_host, addr))
++ if (!nlm_cmp_addr(nlm_addr(block->b_host), addr))
+ continue;
+ if (nfs_compare_fh(NFS_FH(fl_blocked->fl_file->f_path.dentry->d_inode) ,fh) != 0)
+ continue;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/lockd/svclock.c linux-2.6.29-rc3.owrt/fs/lockd/svclock.c
+--- linux-2.6.29.owrt/fs/lockd/svclock.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/lockd/svclock.c 2009-05-10 23:48:29.000000000 +0200
+@@ -427,7 +427,7 @@
+ goto out;
+ case -EAGAIN:
+ ret = nlm_lck_denied;
+- break;
++ goto out;
+ case FILE_LOCK_DEFERRED:
+ if (wait)
+ break;
+@@ -443,10 +443,6 @@
+ goto out;
+ }
+
+- ret = nlm_lck_denied;
+- if (!wait)
+- goto out;
+-
+ ret = nlm_lck_blocked;
+
+ /* Append to list of blocked */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/Makefile linux-2.6.29-rc3.owrt/fs/Makefile
+--- linux-2.6.29.owrt/fs/Makefile 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/Makefile 2009-05-10 23:48:29.000000000 +0200
+@@ -69,12 +69,10 @@
+ # Do not add any filesystems before this line
+ obj-$(CONFIG_REISERFS_FS) += reiserfs/
+ obj-$(CONFIG_EXT3_FS) += ext3/ # Before ext2 so root fs can be ext3
+-obj-$(CONFIG_EXT2_FS) += ext2/
+-# We place ext4 after ext2 so plain ext2 root fs's are mounted using ext2
+-# unless explicitly requested by rootfstype
+-obj-$(CONFIG_EXT4_FS) += ext4/
++obj-$(CONFIG_EXT4_FS) += ext4/ # Before ext2 so root fs can be ext4
+ obj-$(CONFIG_JBD) += jbd/
+ obj-$(CONFIG_JBD2) += jbd2/
++obj-$(CONFIG_EXT2_FS) += ext2/
+ obj-$(CONFIG_CRAMFS) += cramfs/
+ obj-$(CONFIG_SQUASHFS) += squashfs/
+ obj-y += ramfs/
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/minix/inode.c linux-2.6.29-rc3.owrt/fs/minix/inode.c
+--- linux-2.6.29.owrt/fs/minix/inode.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/minix/inode.c 2009-05-10 23:48:29.000000000 +0200
+@@ -3,7 +3,7 @@
+ *
+ * Copyright (C) 1991, 1992 Linus Torvalds
+ *
+- * Copyright (C) 1996 Gertjan van Wingerde
++ * Copyright (C) 1996 Gertjan van Wingerde (gertjan@cs.vu.nl)
+ * Minix V2 fs support.
+ *
+ * Modified for 680x0 by Andreas Schwab
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/namespace.c linux-2.6.29-rc3.owrt/fs/namespace.c
+--- linux-2.6.29.owrt/fs/namespace.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/namespace.c 2009-05-10 23:48:29.000000000 +0200
+@@ -614,11 +614,9 @@
+ */
+ for_each_possible_cpu(cpu) {
+ struct mnt_writer *cpu_writer = &per_cpu(mnt_writers, cpu);
+- spin_lock(&cpu_writer->lock);
+- if (cpu_writer->mnt != mnt) {
+- spin_unlock(&cpu_writer->lock);
++ if (cpu_writer->mnt != mnt)
+ continue;
+- }
++ spin_lock(&cpu_writer->lock);
+ atomic_add(cpu_writer->count, &mnt->__mnt_writers);
+ cpu_writer->count = 0;
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/nfs/client.c linux-2.6.29-rc3.owrt/fs/nfs/client.c
+--- linux-2.6.29.owrt/fs/nfs/client.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/nfs/client.c 2009-05-10 23:48:29.000000000 +0200
+@@ -255,32 +255,6 @@
+ }
+ return 0;
+ }
+-
+-/*
+- * Test if two ip6 socket addresses refer to the same socket by
+- * comparing relevant fields. The padding bytes specifically, are not
+- * compared. sin6_flowinfo is not compared because it only affects QoS
+- * and sin6_scope_id is only compared if the address is "link local"
+- * because "link local" addresses need only be unique to a specific
+- * link. Conversely, ordinary unicast addresses might have different
+- * sin6_scope_id.
+- *
+- * The caller should ensure both socket addresses are AF_INET6.
+- */
+-static int nfs_sockaddr_cmp_ip6(const struct sockaddr *sa1,
+- const struct sockaddr *sa2)
+-{
+- const struct sockaddr_in6 *saddr1 = (const struct sockaddr_in6 *)sa1;
+- const struct sockaddr_in6 *saddr2 = (const struct sockaddr_in6 *)sa2;
+-
+- if (!ipv6_addr_equal(&saddr1->sin6_addr,
+- &saddr1->sin6_addr))
+- return 0;
+- if (ipv6_addr_scope(&saddr1->sin6_addr) == IPV6_ADDR_SCOPE_LINKLOCAL &&
+- saddr1->sin6_scope_id != saddr2->sin6_scope_id)
+- return 0;
+- return saddr1->sin6_port == saddr2->sin6_port;
+-}
+ #else
+ static int nfs_sockaddr_match_ipaddr4(const struct sockaddr_in *sa1,
+ const struct sockaddr_in *sa2)
+@@ -296,52 +270,9 @@
+ return nfs_sockaddr_match_ipaddr4((const struct sockaddr_in *)sa1,
+ (const struct sockaddr_in *)sa2);
+ }
+-
+-static int nfs_sockaddr_cmp_ip6(const struct sockaddr * sa1,
+- const struct sockaddr * sa2)
+-{
+- return 0;
+-}
+ #endif
+
+ /*
+- * Test if two ip4 socket addresses refer to the same socket, by
+- * comparing relevant fields. The padding bytes specifically, are
+- * not compared.
+- *
+- * The caller should ensure both socket addresses are AF_INET.
+- */
+-static int nfs_sockaddr_cmp_ip4(const struct sockaddr *sa1,
+- const struct sockaddr *sa2)
+-{
+- const struct sockaddr_in *saddr1 = (const struct sockaddr_in *)sa1;
+- const struct sockaddr_in *saddr2 = (const struct sockaddr_in *)sa2;
+-
+- if (saddr1->sin_addr.s_addr != saddr2->sin_addr.s_addr)
+- return 0;
+- return saddr1->sin_port == saddr2->sin_port;
+-}
+-
+-/*
+- * Test if two socket addresses represent the same actual socket,
+- * by comparing (only) relevant fields.
+- */
+-static int nfs_sockaddr_cmp(const struct sockaddr *sa1,
+- const struct sockaddr *sa2)
+-{
+- if (sa1->sa_family != sa2->sa_family)
+- return 0;
+-
+- switch (sa1->sa_family) {
+- case AF_INET:
+- return nfs_sockaddr_cmp_ip4(sa1, sa2);
+- case AF_INET6:
+- return nfs_sockaddr_cmp_ip6(sa1, sa2);
+- }
+- return 0;
+-}
+-
+-/*
+ * Find a client by IP address and protocol version
+ * - returns NULL if no such client
+ */
+@@ -413,10 +344,8 @@
+ static struct nfs_client *nfs_match_client(const struct nfs_client_initdata *data)
+ {
+ struct nfs_client *clp;
+- const struct sockaddr *sap = data->addr;
+
+ list_for_each_entry(clp, &nfs_client_list, cl_share_link) {
+- const struct sockaddr *clap = (struct sockaddr *)&clp->cl_addr;
+ /* Don't match clients that failed to initialise properly */
+ if (clp->cl_cons_state < 0)
+ continue;
+@@ -429,7 +358,7 @@
+ continue;
+
+ /* Match the full socket address */
+- if (!nfs_sockaddr_cmp(sap, clap))
++ if (memcmp(&clp->cl_addr, data->addr, sizeof(clp->cl_addr)) != 0)
+ continue;
+
+ atomic_inc(&clp->cl_count);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/nfs/dir.c linux-2.6.29-rc3.owrt/fs/nfs/dir.c
+--- linux-2.6.29.owrt/fs/nfs/dir.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/nfs/dir.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1892,14 +1892,8 @@
+ cache.cred = cred;
+ cache.jiffies = jiffies;
+ status = NFS_PROTO(inode)->access(inode, &cache);
+- if (status != 0) {
+- if (status == -ESTALE) {
+- nfs_zap_caches(inode);
+- if (!S_ISDIR(inode->i_mode))
+- set_bit(NFS_INO_STALE, &NFS_I(inode)->flags);
+- }
++ if (status != 0)
+ return status;
+- }
+ nfs_access_add_cache(inode, &cache);
+ out:
+ if ((mask & ~cache.mask & (MAY_READ | MAY_WRITE | MAY_EXEC)) == 0)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/nfs/nfs3acl.c linux-2.6.29-rc3.owrt/fs/nfs/nfs3acl.c
+--- linux-2.6.29.owrt/fs/nfs/nfs3acl.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/nfs/nfs3acl.c 2009-05-10 23:48:29.000000000 +0200
+@@ -292,7 +292,7 @@
+ {
+ struct nfs_server *server = NFS_SERVER(inode);
+ struct nfs_fattr fattr;
+- struct page *pages[NFSACL_MAXPAGES];
++ struct page *pages[NFSACL_MAXPAGES] = { };
+ struct nfs3_setaclargs args = {
+ .inode = inode,
+ .mask = NFS_ACL,
+@@ -303,7 +303,7 @@
+ .rpc_argp = &args,
+ .rpc_resp = &fattr,
+ };
+- int status;
++ int status, count;
+
+ status = -EOPNOTSUPP;
+ if (!nfs_server_capable(inode, NFS_CAP_ACLS))
+@@ -319,20 +319,6 @@
+ if (S_ISDIR(inode->i_mode)) {
+ args.mask |= NFS_DFACL;
+ args.acl_default = dfacl;
+- args.len = nfsacl_size(acl, dfacl);
+- } else
+- args.len = nfsacl_size(acl, NULL);
+-
+- if (args.len > NFS_ACL_INLINE_BUFSIZE) {
+- unsigned int npages = 1 + ((args.len - 1) >> PAGE_SHIFT);
+-
+- status = -ENOMEM;
+- do {
+- args.pages[args.npages] = alloc_page(GFP_KERNEL);
+- if (args.pages[args.npages] == NULL)
+- goto out_freepages;
+- args.npages++;
+- } while (args.npages < npages);
+ }
+
+ dprintk("NFS call setacl\n");
+@@ -343,6 +329,10 @@
+ nfs_zap_acl_cache(inode);
+ dprintk("NFS reply setacl: %d\n", status);
+
++ /* pages may have been allocated at the xdr layer. */
++ for (count = 0; count < NFSACL_MAXPAGES && args.pages[count]; count++)
++ __free_page(args.pages[count]);
++
+ switch (status) {
+ case 0:
+ status = nfs_refresh_inode(inode, &fattr);
+@@ -356,11 +346,6 @@
+ case -ENOTSUPP:
+ status = -EOPNOTSUPP;
+ }
+-out_freepages:
+- while (args.npages != 0) {
+- args.npages--;
+- __free_page(args.pages[args.npages]);
+- }
+ out:
+ return status;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/nfs/nfs3xdr.c linux-2.6.29-rc3.owrt/fs/nfs/nfs3xdr.c
+--- linux-2.6.29.owrt/fs/nfs/nfs3xdr.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/nfs/nfs3xdr.c 2009-05-10 23:48:29.000000000 +0200
+@@ -82,10 +82,8 @@
+ #define NFS3_commitres_sz (1+NFS3_wcc_data_sz+2)
+
+ #define ACL3_getaclargs_sz (NFS3_fh_sz+1)
+-#define ACL3_setaclargs_sz (NFS3_fh_sz+1+ \
+- XDR_QUADLEN(NFS_ACL_INLINE_BUFSIZE))
+-#define ACL3_getaclres_sz (1+NFS3_post_op_attr_sz+1+ \
+- XDR_QUADLEN(NFS_ACL_INLINE_BUFSIZE))
++#define ACL3_setaclargs_sz (NFS3_fh_sz+1+2*(2+5*3))
++#define ACL3_getaclres_sz (1+NFS3_post_op_attr_sz+1+2*(2+5*3))
+ #define ACL3_setaclres_sz (1+NFS3_post_op_attr_sz)
+
+ /*
+@@ -705,18 +703,28 @@
+ struct nfs3_setaclargs *args)
+ {
+ struct xdr_buf *buf = &req->rq_snd_buf;
+- unsigned int base;
+- int err;
++ unsigned int base, len_in_head, len = nfsacl_size(
++ (args->mask & NFS_ACL) ? args->acl_access : NULL,
++ (args->mask & NFS_DFACL) ? args->acl_default : NULL);
++ int count, err;
+
+ p = xdr_encode_fhandle(p, NFS_FH(args->inode));
+ *p++ = htonl(args->mask);
+- req->rq_slen = xdr_adjust_iovec(req->rq_svec, p);
+- base = req->rq_slen;
+-
+- if (args->npages != 0)
+- xdr_encode_pages(buf, args->pages, 0, args->len);
+- else
+- req->rq_slen += args->len;
++ base = (char *)p - (char *)buf->head->iov_base;
++ /* put as much of the acls into head as possible. */
++ len_in_head = min_t(unsigned int, buf->head->iov_len - base, len);
++ len -= len_in_head;
++ req->rq_slen = xdr_adjust_iovec(req->rq_svec, p + (len_in_head >> 2));
++
++ for (count = 0; (count << PAGE_SHIFT) < len; count++) {
++ args->pages[count] = alloc_page(GFP_KERNEL);
++ if (!args->pages[count]) {
++ while (count)
++ __free_page(args->pages[--count]);
++ return -ENOMEM;
++ }
++ }
++ xdr_encode_pages(buf, args->pages, 0, len);
+
+ err = nfsacl_encode(buf, base, args->inode,
+ (args->mask & NFS_ACL) ?
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/nfs/nfs4namespace.c linux-2.6.29-rc3.owrt/fs/nfs/nfs4namespace.c
+--- linux-2.6.29.owrt/fs/nfs/nfs4namespace.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/nfs/nfs4namespace.c 2009-05-10 23:48:29.000000000 +0200
+@@ -21,9 +21,7 @@
+ #define NFSDBG_FACILITY NFSDBG_VFS
+
+ /*
+- * Convert the NFSv4 pathname components into a standard posix path.
+- *
+- * Note that the resulting string will be placed at the end of the buffer
++ * Check if fs_root is valid
+ */
+ static inline char *nfs4_pathname_string(const struct nfs4_pathname *pathname,
+ char *buffer, ssize_t buflen)
+@@ -101,20 +99,21 @@
+ {
+ struct vfsmount *mnt = ERR_PTR(-ENOENT);
+ char *mnt_path;
+- unsigned int maxbuflen;
++ int page2len;
+ unsigned int s;
+
+ mnt_path = nfs4_pathname_string(&location->rootpath, page2, PAGE_SIZE);
+ if (IS_ERR(mnt_path))
+ return mnt;
+ mountdata->mnt_path = mnt_path;
+- maxbuflen = mnt_path - 1 - page2;
++ page2 += strlen(mnt_path) + 1;
++ page2len = PAGE_SIZE - strlen(mnt_path) - 1;
+
+ for (s = 0; s < location->nservers; s++) {
+ const struct nfs4_string *buf = &location->servers[s];
+ struct sockaddr_storage addr;
+
+- if (buf->len <= 0 || buf->len >= maxbuflen)
++ if (buf->len <= 0 || buf->len >= PAGE_SIZE)
+ continue;
+
+ mountdata->addr = (struct sockaddr *)&addr;
+@@ -127,8 +126,8 @@
+ continue;
+ nfs_set_port(mountdata->addr, NFS_PORT);
+
+- memcpy(page2, buf->data, buf->len);
+- page2[buf->len] = '\0';
++ strncpy(page2, buf->data, page2len);
++ page2[page2len] = '\0';
+ mountdata->hostname = page2;
+
+ snprintf(page, PAGE_SIZE, "%s:%s",
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/nfsd/nfs4xdr.c linux-2.6.29-rc3.owrt/fs/nfsd/nfs4xdr.c
+--- linux-2.6.29.owrt/fs/nfsd/nfs4xdr.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/nfsd/nfs4xdr.c 2009-05-10 23:48:29.000000000 +0200
+@@ -2596,7 +2596,6 @@
+ [OP_LOOKUPP] = (nfsd4_enc)nfsd4_encode_noop,
+ [OP_NVERIFY] = (nfsd4_enc)nfsd4_encode_noop,
+ [OP_OPEN] = (nfsd4_enc)nfsd4_encode_open,
+- [OP_OPENATTR] = (nfsd4_enc)nfsd4_encode_noop,
+ [OP_OPEN_CONFIRM] = (nfsd4_enc)nfsd4_encode_open_confirm,
+ [OP_OPEN_DOWNGRADE] = (nfsd4_enc)nfsd4_encode_open_downgrade,
+ [OP_PUTFH] = (nfsd4_enc)nfsd4_encode_noop,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/notify/inotify/inotify.c linux-2.6.29-rc3.owrt/fs/notify/inotify/inotify.c
+--- linux-2.6.29.owrt/fs/notify/inotify/inotify.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/notify/inotify/inotify.c 2009-05-10 23:48:29.000000000 +0200
+@@ -156,7 +156,7 @@
+ int ret;
+
+ do {
+- if (unlikely(!idr_pre_get(&ih->idr, GFP_NOFS)))
++ if (unlikely(!idr_pre_get(&ih->idr, GFP_KERNEL)))
+ return -ENOSPC;
+ ret = idr_get_new_above(&ih->idr, watch, ih->last_wd+1, &watch->wd);
+ } while (ret == -EAGAIN);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ocfs2/alloc.c linux-2.6.29-rc3.owrt/fs/ocfs2/alloc.c
+--- linux-2.6.29.owrt/fs/ocfs2/alloc.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ocfs2/alloc.c 2009-05-10 23:48:29.000000000 +0200
+@@ -176,8 +176,7 @@
+
+ BUG_ON(OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL);
+ mlog_bug_on_msg(!ocfs2_sparse_alloc(osb) &&
+- (OCFS2_I(inode)->ip_clusters !=
+- le32_to_cpu(rec->e_cpos)),
++ (OCFS2_I(inode)->ip_clusters != rec->e_cpos),
+ "Device %s, asking for sparse allocation: inode %llu, "
+ "cpos %u, clusters %u\n",
+ osb->dev_str,
+@@ -4797,29 +4796,6 @@
+ return ret;
+ }
+
+-static int ocfs2_replace_extent_rec(struct inode *inode,
+- handle_t *handle,
+- struct ocfs2_path *path,
+- struct ocfs2_extent_list *el,
+- int split_index,
+- struct ocfs2_extent_rec *split_rec)
+-{
+- int ret;
+-
+- ret = ocfs2_path_bh_journal_access(handle, inode, path,
+- path_num_items(path) - 1);
+- if (ret) {
+- mlog_errno(ret);
+- goto out;
+- }
+-
+- el->l_recs[split_index] = *split_rec;
+-
+- ocfs2_journal_dirty(handle, path_leaf_bh(path));
+-out:
+- return ret;
+-}
+-
+ /*
+ * Mark part or all of the extent record at split_index in the leaf
+ * pointed to by path as written. This removes the unwritten
+@@ -4909,9 +4885,7 @@
+
+ if (ctxt.c_contig_type == CONTIG_NONE) {
+ if (ctxt.c_split_covers_rec)
+- ret = ocfs2_replace_extent_rec(inode, handle,
+- path, el,
+- split_index, split_rec);
++ el->l_recs[split_index] = *split_rec;
+ else
+ ret = ocfs2_split_and_insert(inode, handle, path, et,
+ &last_eb_bh, split_index,
+@@ -5416,9 +5390,6 @@
+ goto out;
+ }
+
+- vfs_dq_free_space_nodirty(inode,
+- ocfs2_clusters_to_bytes(inode->i_sb, len));
+-
+ ret = ocfs2_remove_extent(inode, et, cpos, len, handle, meta_ac,
+ dealloc);
+ if (ret) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ocfs2/aops.c linux-2.6.29-rc3.owrt/fs/ocfs2/aops.c
+--- linux-2.6.29.owrt/fs/ocfs2/aops.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ocfs2/aops.c 2009-05-10 23:48:29.000000000 +0200
+@@ -227,7 +227,7 @@
+ size = i_size_read(inode);
+
+ if (size > PAGE_CACHE_SIZE ||
+- size > ocfs2_max_inline_data_with_xattr(inode->i_sb, di)) {
++ size > ocfs2_max_inline_data(inode->i_sb)) {
+ ocfs2_error(inode->i_sb,
+ "Inode %llu has with inline data has bad size: %Lu",
+ (unsigned long long)OCFS2_I(inode)->ip_blkno,
+@@ -1555,7 +1555,6 @@
+ int ret, written = 0;
+ loff_t end = pos + len;
+ struct ocfs2_inode_info *oi = OCFS2_I(inode);
+- struct ocfs2_dinode *di = NULL;
+
+ mlog(0, "Inode %llu, write of %u bytes at off %llu. features: 0x%x\n",
+ (unsigned long long)oi->ip_blkno, len, (unsigned long long)pos,
+@@ -1588,9 +1587,7 @@
+ /*
+ * Check whether the write can fit.
+ */
+- di = (struct ocfs2_dinode *)wc->w_di_bh->b_data;
+- if (mmap_page ||
+- end > ocfs2_max_inline_data_with_xattr(inode->i_sb, di))
++ if (mmap_page || end > ocfs2_max_inline_data(inode->i_sb))
+ return 0;
+
+ do_inline_write:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ocfs2/dcache.c linux-2.6.29-rc3.owrt/fs/ocfs2/dcache.c
+--- linux-2.6.29.owrt/fs/ocfs2/dcache.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ocfs2/dcache.c 2009-05-10 23:48:29.000000000 +0200
+@@ -38,7 +38,6 @@
+ #include "dlmglue.h"
+ #include "file.h"
+ #include "inode.h"
+-#include "super.h"
+
+
+ static int ocfs2_dentry_revalidate(struct dentry *dentry,
+@@ -295,34 +294,6 @@
+ return ret;
+ }
+
+-static DEFINE_SPINLOCK(dentry_list_lock);
+-
+-/* We limit the number of dentry locks to drop in one go. We have
+- * this limit so that we don't starve other users of ocfs2_wq. */
+-#define DL_INODE_DROP_COUNT 64
+-
+-/* Drop inode references from dentry locks */
+-void ocfs2_drop_dl_inodes(struct work_struct *work)
+-{
+- struct ocfs2_super *osb = container_of(work, struct ocfs2_super,
+- dentry_lock_work);
+- struct ocfs2_dentry_lock *dl;
+- int drop_count = DL_INODE_DROP_COUNT;
+-
+- spin_lock(&dentry_list_lock);
+- while (osb->dentry_lock_list && drop_count--) {
+- dl = osb->dentry_lock_list;
+- osb->dentry_lock_list = dl->dl_next;
+- spin_unlock(&dentry_list_lock);
+- iput(dl->dl_inode);
+- kfree(dl);
+- spin_lock(&dentry_list_lock);
+- }
+- if (osb->dentry_lock_list)
+- queue_work(ocfs2_wq, &osb->dentry_lock_work);
+- spin_unlock(&dentry_list_lock);
+-}
+-
+ /*
+ * ocfs2_dentry_iput() and friends.
+ *
+@@ -347,23 +318,16 @@
+ static void ocfs2_drop_dentry_lock(struct ocfs2_super *osb,
+ struct ocfs2_dentry_lock *dl)
+ {
++ iput(dl->dl_inode);
+ ocfs2_simple_drop_lockres(osb, &dl->dl_lockres);
+ ocfs2_lock_res_free(&dl->dl_lockres);
+-
+- /* We leave dropping of inode reference to ocfs2_wq as that can
+- * possibly lead to inode deletion which gets tricky */
+- spin_lock(&dentry_list_lock);
+- if (!osb->dentry_lock_list)
+- queue_work(ocfs2_wq, &osb->dentry_lock_work);
+- dl->dl_next = osb->dentry_lock_list;
+- osb->dentry_lock_list = dl;
+- spin_unlock(&dentry_list_lock);
++ kfree(dl);
+ }
+
+ void ocfs2_dentry_lock_put(struct ocfs2_super *osb,
+ struct ocfs2_dentry_lock *dl)
+ {
+- int unlock;
++ int unlock = 0;
+
+ BUG_ON(dl->dl_count == 0);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ocfs2/dcache.h linux-2.6.29-rc3.owrt/fs/ocfs2/dcache.h
+--- linux-2.6.29.owrt/fs/ocfs2/dcache.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ocfs2/dcache.h 2009-05-10 23:48:29.000000000 +0200
+@@ -29,13 +29,8 @@
+ extern struct dentry_operations ocfs2_dentry_ops;
+
+ struct ocfs2_dentry_lock {
+- /* Use count of dentry lock */
+ unsigned int dl_count;
+- union {
+- /* Linked list of dentry locks to release */
+- struct ocfs2_dentry_lock *dl_next;
+- u64 dl_parent_blkno;
+- };
++ u64 dl_parent_blkno;
+
+ /*
+ * The ocfs2_dentry_lock keeps an inode reference until
+@@ -52,8 +47,6 @@
+ void ocfs2_dentry_lock_put(struct ocfs2_super *osb,
+ struct ocfs2_dentry_lock *dl);
+
+-void ocfs2_drop_dl_inodes(struct work_struct *work);
+-
+ struct dentry *ocfs2_find_local_alias(struct inode *inode, u64 parent_blkno,
+ int skip_unhashed);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ocfs2/dlm/dlmmaster.c linux-2.6.29-rc3.owrt/fs/ocfs2/dlm/dlmmaster.c
+--- linux-2.6.29.owrt/fs/ocfs2/dlm/dlmmaster.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ocfs2/dlm/dlmmaster.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1849,12 +1849,12 @@
+ if (!mle) {
+ if (res->owner != DLM_LOCK_RES_OWNER_UNKNOWN &&
+ res->owner != assert->node_idx) {
+- mlog(ML_ERROR, "DIE! Mastery assert from %u, "
+- "but current owner is %u! (%.*s)\n",
+- assert->node_idx, res->owner, namelen,
+- name);
+- __dlm_print_one_lock_resource(res);
+- BUG();
++ mlog(ML_ERROR, "assert_master from "
++ "%u, but current owner is "
++ "%u! (%.*s)\n",
++ assert->node_idx, res->owner,
++ namelen, name);
++ goto kill;
+ }
+ } else if (mle->type != DLM_MLE_MIGRATION) {
+ if (res->owner != DLM_LOCK_RES_OWNER_UNKNOWN) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ocfs2/dlm/dlmthread.c linux-2.6.29-rc3.owrt/fs/ocfs2/dlm/dlmthread.c
+--- linux-2.6.29.owrt/fs/ocfs2/dlm/dlmthread.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ocfs2/dlm/dlmthread.c 2009-05-10 23:48:29.000000000 +0200
+@@ -181,7 +181,8 @@
+
+ spin_lock(&res->spinlock);
+ /* This ensures that clear refmap is sent after the set */
+- __dlm_wait_on_lockres_flags(res, DLM_LOCK_RES_SETREF_INPROG);
++ __dlm_wait_on_lockres_flags(res, (DLM_LOCK_RES_SETREF_INPROG |
++ DLM_LOCK_RES_MIGRATING));
+ spin_unlock(&res->spinlock);
+
+ /* clear our bit from the master's refmap, ignore errors */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ocfs2/dlm/dlmunlock.c linux-2.6.29-rc3.owrt/fs/ocfs2/dlm/dlmunlock.c
+--- linux-2.6.29.owrt/fs/ocfs2/dlm/dlmunlock.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ocfs2/dlm/dlmunlock.c 2009-05-10 23:48:29.000000000 +0200
+@@ -117,11 +117,11 @@
+ else
+ BUG_ON(res->owner == dlm->node_num);
+
+- spin_lock(&dlm->ast_lock);
++ spin_lock(&dlm->spinlock);
+ /* We want to be sure that we're not freeing a lock
+ * that still has AST's pending... */
+ in_use = !list_empty(&lock->ast_list);
+- spin_unlock(&dlm->ast_lock);
++ spin_unlock(&dlm->spinlock);
+ if (in_use) {
+ mlog(ML_ERROR, "lockres %.*s: Someone is calling dlmunlock "
+ "while waiting for an ast!", res->lockname.len,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ocfs2/dlmglue.c linux-2.6.29-rc3.owrt/fs/ocfs2/dlmglue.c
+--- linux-2.6.29.owrt/fs/ocfs2/dlmglue.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ocfs2/dlmglue.c 2009-05-10 23:48:29.000000000 +0200
+@@ -320,14 +320,9 @@
+ struct ocfs2_lock_res *lockres);
+ static inline void ocfs2_recover_from_dlm_error(struct ocfs2_lock_res *lockres,
+ int convert);
+-#define ocfs2_log_dlm_error(_func, _err, _lockres) do { \
+- if ((_lockres)->l_type != OCFS2_LOCK_TYPE_DENTRY) \
+- mlog(ML_ERROR, "DLM error %d while calling %s on resource %s\n", \
+- _err, _func, _lockres->l_name); \
+- else \
+- mlog(ML_ERROR, "DLM error %d while calling %s on resource %.*s%08x\n", \
+- _err, _func, OCFS2_DENTRY_LOCK_INO_START - 1, (_lockres)->l_name, \
+- (unsigned int)ocfs2_get_dentry_lock_ino(_lockres)); \
++#define ocfs2_log_dlm_error(_func, _err, _lockres) do { \
++ mlog(ML_ERROR, "DLM error %d while calling %s on resource %s\n", \
++ _err, _func, _lockres->l_name); \
+ } while (0)
+ static int ocfs2_downconvert_thread(void *arg);
+ static void ocfs2_downconvert_on_unlock(struct ocfs2_super *osb,
+@@ -2865,10 +2860,6 @@
+ case OCFS2_UNLOCK_CANCEL_CONVERT:
+ mlog(0, "Cancel convert success for %s\n", lockres->l_name);
+ lockres->l_action = OCFS2_AST_INVALID;
+- /* Downconvert thread may have requeued this lock, we
+- * need to wake it. */
+- if (lockres->l_flags & OCFS2_LOCK_BLOCKED)
+- ocfs2_wake_downconvert_thread(ocfs2_get_lockres_osb(lockres));
+ break;
+ case OCFS2_UNLOCK_DROP_LOCK:
+ lockres->l_level = DLM_LOCK_IV;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ocfs2/journal.h linux-2.6.29-rc3.owrt/fs/ocfs2/journal.h
+--- linux-2.6.29.owrt/fs/ocfs2/journal.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ocfs2/journal.h 2009-05-10 23:48:29.000000000 +0200
+@@ -513,10 +513,8 @@
+ static inline int ocfs2_begin_ordered_truncate(struct inode *inode,
+ loff_t new_size)
+ {
+- return jbd2_journal_begin_ordered_truncate(
+- OCFS2_SB(inode->i_sb)->journal->j_journal,
+- &OCFS2_I(inode)->ip_jinode,
+- new_size);
++ return jbd2_journal_begin_ordered_truncate(&OCFS2_I(inode)->ip_jinode,
++ new_size);
+ }
+
+ #endif /* OCFS2_JOURNAL_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ocfs2/namei.c linux-2.6.29-rc3.owrt/fs/ocfs2/namei.c
+--- linux-2.6.29.owrt/fs/ocfs2/namei.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ocfs2/namei.c 2009-05-10 23:48:29.000000000 +0200
+@@ -532,8 +532,7 @@
+
+ fe->i_dyn_features = cpu_to_le16(feat | OCFS2_INLINE_DATA_FL);
+
+- fe->id2.i_data.id_count = cpu_to_le16(
+- ocfs2_max_inline_data_with_xattr(osb->sb, fe));
++ fe->id2.i_data.id_count = cpu_to_le16(ocfs2_max_inline_data(osb->sb));
+ } else {
+ fel = &fe->id2.i_list;
+ fel->l_tree_depth = 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ocfs2/ocfs2_fs.h linux-2.6.29-rc3.owrt/fs/ocfs2/ocfs2_fs.h
+--- linux-2.6.29.owrt/fs/ocfs2/ocfs2_fs.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ocfs2/ocfs2_fs.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1070,6 +1070,12 @@
+ offsetof(struct ocfs2_dinode, id2.i_symlink);
+ }
+
++static inline int ocfs2_max_inline_data(struct super_block *sb)
++{
++ return sb->s_blocksize -
++ offsetof(struct ocfs2_dinode, id2.i_data.id_data);
++}
++
+ static inline int ocfs2_max_inline_data_with_xattr(struct super_block *sb,
+ struct ocfs2_dinode *di)
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ocfs2/ocfs2.h linux-2.6.29-rc3.owrt/fs/ocfs2/ocfs2.h
+--- linux-2.6.29.owrt/fs/ocfs2/ocfs2.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ocfs2/ocfs2.h 2009-05-10 23:48:29.000000000 +0200
+@@ -210,7 +210,6 @@
+ struct ocfs2_slot_info;
+ struct ocfs2_recovery_map;
+ struct ocfs2_quota_recovery;
+-struct ocfs2_dentry_lock;
+ struct ocfs2_super
+ {
+ struct task_struct *commit_task;
+@@ -326,11 +325,6 @@
+ struct list_head blocked_lock_list;
+ unsigned long blocked_lock_count;
+
+- /* List of dentry locks to release. Anyone can add locks to
+- * the list, ocfs2_wq processes the list */
+- struct ocfs2_dentry_lock *dentry_lock_list;
+- struct work_struct dentry_lock_work;
+-
+ wait_queue_head_t osb_mount_event;
+
+ /* Truncate log info */
+@@ -341,9 +335,6 @@
+ struct ocfs2_node_map osb_recovering_orphan_dirs;
+ unsigned int *osb_orphan_wipes;
+ wait_queue_head_t osb_wipe_event;
+-
+- /* used to protect metaecc calculation check of xattr. */
+- spinlock_t osb_xattr_lock;
+ };
+
+ #define OCFS2_SB(sb) ((struct ocfs2_super *)(sb)->s_fs_info)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ocfs2/quota_global.c linux-2.6.29-rc3.owrt/fs/ocfs2/quota_global.c
+--- linux-2.6.29.owrt/fs/ocfs2/quota_global.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ocfs2/quota_global.c 2009-05-10 23:48:29.000000000 +0200
+@@ -754,9 +754,7 @@
+ if (dquot->dq_flags & mask)
+ sync = 1;
+ spin_unlock(&dq_data_lock);
+- /* This is a slight hack but we can't afford getting global quota
+- * lock if we already have a transaction started. */
+- if (!sync || journal_current_handle()) {
++ if (!sync) {
+ status = ocfs2_write_dquot(dquot);
+ goto out;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ocfs2/super.c linux-2.6.29-rc3.owrt/fs/ocfs2/super.c
+--- linux-2.6.29.owrt/fs/ocfs2/super.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ocfs2/super.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1537,13 +1537,6 @@
+ unlock_buffer(*bh);
+ ll_rw_block(READ, 1, bh);
+ wait_on_buffer(*bh);
+- if (!buffer_uptodate(*bh)) {
+- mlog_errno(-EIO);
+- brelse(*bh);
+- *bh = NULL;
+- return -EIO;
+- }
+-
+ return 0;
+ }
+
+@@ -1754,7 +1747,6 @@
+ INIT_LIST_HEAD(&osb->blocked_lock_list);
+ osb->blocked_lock_count = 0;
+ spin_lock_init(&osb->osb_lock);
+- spin_lock_init(&osb->osb_xattr_lock);
+ ocfs2_init_inode_steal_slot(osb);
+
+ atomic_set(&osb->alloc_stats.moves, 0);
+@@ -1895,9 +1887,6 @@
+ INIT_WORK(&journal->j_recovery_work, ocfs2_complete_recovery);
+ journal->j_state = OCFS2_JOURNAL_FREE;
+
+- INIT_WORK(&osb->dentry_lock_work, ocfs2_drop_dl_inodes);
+- osb->dentry_lock_list = NULL;
+-
+ /* get some pseudo constants for clustersize bits */
+ osb->s_clustersize_bits =
+ le32_to_cpu(di->id2.i_super.s_clustersize_bits);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ocfs2/xattr.c linux-2.6.29-rc3.owrt/fs/ocfs2/xattr.c
+--- linux-2.6.29.owrt/fs/ocfs2/xattr.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ocfs2/xattr.c 2009-05-10 23:48:29.000000000 +0200
+@@ -82,14 +82,13 @@
+
+ #define OCFS2_XATTR_ROOT_SIZE (sizeof(struct ocfs2_xattr_def_value_root))
+ #define OCFS2_XATTR_INLINE_SIZE 80
+-#define OCFS2_XATTR_HEADER_GAP 4
+ #define OCFS2_XATTR_FREE_IN_IBODY (OCFS2_MIN_XATTR_INLINE_SIZE \
+ - sizeof(struct ocfs2_xattr_header) \
+- - OCFS2_XATTR_HEADER_GAP)
++ - sizeof(__u32))
+ #define OCFS2_XATTR_FREE_IN_BLOCK(ptr) ((ptr)->i_sb->s_blocksize \
+ - sizeof(struct ocfs2_xattr_block) \
+ - sizeof(struct ocfs2_xattr_header) \
+- - OCFS2_XATTR_HEADER_GAP)
++ - sizeof(__u32))
+
+ static struct ocfs2_xattr_def_value_root def_xv = {
+ .xv.xr_list.l_count = cpu_to_le16(1),
+@@ -275,12 +274,10 @@
+ bucket->bu_blocks, bucket->bu_bhs, 0,
+ NULL);
+ if (!rc) {
+- spin_lock(&OCFS2_SB(bucket->bu_inode->i_sb)->osb_xattr_lock);
+ rc = ocfs2_validate_meta_ecc_bhs(bucket->bu_inode->i_sb,
+ bucket->bu_bhs,
+ bucket->bu_blocks,
+ &bucket_xh(bucket)->xh_check);
+- spin_unlock(&OCFS2_SB(bucket->bu_inode->i_sb)->osb_xattr_lock);
+ if (rc)
+ mlog_errno(rc);
+ }
+@@ -313,11 +310,9 @@
+ {
+ int i;
+
+- spin_lock(&OCFS2_SB(bucket->bu_inode->i_sb)->osb_xattr_lock);
+ ocfs2_compute_meta_ecc_bhs(bucket->bu_inode->i_sb,
+ bucket->bu_bhs, bucket->bu_blocks,
+ &bucket_xh(bucket)->xh_check);
+- spin_unlock(&OCFS2_SB(bucket->bu_inode->i_sb)->osb_xattr_lock);
+
+ for (i = 0; i < bucket->bu_blocks; i++)
+ ocfs2_journal_dirty(handle, bucket->bu_bhs[i]);
+@@ -547,12 +542,8 @@
+ * when blocksize = 512, may reserve one more cluser for
+ * xattr bucket, otherwise reserve one metadata block
+ * for them is ok.
+- * If this is a new directory with inline data,
+- * we choose to reserve the entire inline area for
+- * directory contents and force an external xattr block.
+ */
+ if (dir->i_sb->s_blocksize == OCFS2_MIN_BLOCKSIZE ||
+- (S_ISDIR(mode) && ocfs2_supports_inline_data(osb)) ||
+ (s_size + a_size) > OCFS2_XATTR_FREE_IN_IBODY) {
+ ret = ocfs2_reserve_new_metadata_blocks(osb, 1, xattr_ac);
+ if (ret) {
+@@ -1516,7 +1507,7 @@
+ last += 1;
+ }
+
+- free = min_offs - ((void *)last - xs->base) - OCFS2_XATTR_HEADER_GAP;
++ free = min_offs - ((void *)last - xs->base) - sizeof(__u32);
+ if (free < 0)
+ return -EIO;
+
+@@ -2199,7 +2190,7 @@
+ last += 1;
+ }
+
+- free = min_offs - ((void *)last - xs->base) - OCFS2_XATTR_HEADER_GAP;
++ free = min_offs - ((void *)last - xs->base) - sizeof(__u32);
+ if (free < 0)
+ return 0;
+
+@@ -2601,9 +2592,8 @@
+
+ if (!ret) {
+ /* Update inode ctime. */
+- ret = ocfs2_journal_access_di(ctxt->handle, inode,
+- xis->inode_bh,
+- OCFS2_JOURNAL_ACCESS_WRITE);
++ ret = ocfs2_journal_access(ctxt->handle, inode, xis->inode_bh,
++ OCFS2_JOURNAL_ACCESS_WRITE);
+ if (ret) {
+ mlog_errno(ret);
+ goto out;
+@@ -4739,6 +4729,13 @@
+ vb.vb_xv = (struct ocfs2_xattr_value_root *)
+ (vb.vb_bh->b_data + offset % blocksize);
+
++ ret = ocfs2_xattr_bucket_journal_access(ctxt->handle, bucket,
++ OCFS2_JOURNAL_ACCESS_WRITE);
++ if (ret) {
++ mlog_errno(ret);
++ goto out;
++ }
++
+ /*
+ * From here on out we have to dirty the bucket. The generic
+ * value calls only modify one of the bucket's bhs, but we need
+@@ -4751,18 +4748,12 @@
+ ret = ocfs2_xattr_value_truncate(inode, &vb, len, ctxt);
+ if (ret) {
+ mlog_errno(ret);
+- goto out;
+- }
+-
+- ret = ocfs2_xattr_bucket_journal_access(ctxt->handle, bucket,
+- OCFS2_JOURNAL_ACCESS_WRITE);
+- if (ret) {
+- mlog_errno(ret);
+- goto out;
++ goto out_dirty;
+ }
+
+ xe->xe_value_size = cpu_to_le64(len);
+
++out_dirty:
+ ocfs2_xattr_bucket_journal_dirty(ctxt->handle, bucket);
+
+ out:
+@@ -4795,33 +4786,19 @@
+ char *val,
+ int value_len)
+ {
+- int ret, offset, block_off;
++ int offset;
+ struct ocfs2_xattr_value_root *xv;
+ struct ocfs2_xattr_entry *xe = xs->here;
+- struct ocfs2_xattr_header *xh = bucket_xh(xs->bucket);
+- void *base;
+
+ BUG_ON(!xs->base || !xe || ocfs2_xattr_is_local(xe));
+
+- ret = ocfs2_xattr_bucket_get_name_value(inode, xh,
+- xe - xh->xh_entries,
+- &block_off,
+- &offset);
+- if (ret) {
+- mlog_errno(ret);
+- goto out;
+- }
++ offset = le16_to_cpu(xe->xe_name_offset) +
++ OCFS2_XATTR_SIZE(xe->xe_name_len);
+
+- base = bucket_block(xs->bucket, block_off);
+- xv = (struct ocfs2_xattr_value_root *)(base + offset +
+- OCFS2_XATTR_SIZE(xe->xe_name_len));
++ xv = (struct ocfs2_xattr_value_root *)(xs->base + offset);
+
+- ret = __ocfs2_xattr_set_value_outside(inode, handle,
+- xv, val, value_len);
+- if (ret)
+- mlog_errno(ret);
+-out:
+- return ret;
++ return __ocfs2_xattr_set_value_outside(inode, handle,
++ xv, val, value_len);
+ }
+
+ static int ocfs2_rm_xattr_cluster(struct inode *inode,
+@@ -5084,8 +5061,8 @@
+ xh_free_start = le16_to_cpu(xh->xh_free_start);
+ header_size = sizeof(struct ocfs2_xattr_header) +
+ count * sizeof(struct ocfs2_xattr_entry);
+- max_free = OCFS2_XATTR_BUCKET_SIZE - header_size -
+- le16_to_cpu(xh->xh_name_value_len) - OCFS2_XATTR_HEADER_GAP;
++ max_free = OCFS2_XATTR_BUCKET_SIZE -
++ le16_to_cpu(xh->xh_name_value_len) - header_size;
+
+ mlog_bug_on_msg(header_size > blocksize, "bucket %llu has header size "
+ "of %u which exceed block size\n",
+@@ -5118,7 +5095,7 @@
+ need = 0;
+ }
+
+- free = xh_free_start - header_size - OCFS2_XATTR_HEADER_GAP;
++ free = xh_free_start - header_size;
+ /*
+ * We need to make sure the new name/value pair
+ * can exist in the same block.
+@@ -5151,8 +5128,7 @@
+ }
+
+ xh_free_start = le16_to_cpu(xh->xh_free_start);
+- free = xh_free_start - header_size
+- - OCFS2_XATTR_HEADER_GAP;
++ free = xh_free_start - header_size;
+ if (xh_free_start % blocksize < need)
+ free -= xh_free_start % blocksize;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/pipe.c linux-2.6.29-rc3.owrt/fs/pipe.c
+--- linux-2.6.29.owrt/fs/pipe.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/pipe.c 2009-05-10 23:48:29.000000000 +0200
+@@ -699,12 +699,12 @@
+ int retval;
+
+ mutex_lock(&inode->i_mutex);
++
+ retval = fasync_helper(fd, filp, on, &pipe->fasync_readers);
+- if (retval >= 0) {
++
++ if (retval >= 0)
+ retval = fasync_helper(fd, filp, on, &pipe->fasync_writers);
+- if (retval < 0) /* this can happen only if on == T */
+- fasync_helper(-1, filp, 0, &pipe->fasync_readers);
+- }
++
+ mutex_unlock(&inode->i_mutex);
+
+ if (retval < 0)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/proc/base.c linux-2.6.29-rc3.owrt/fs/proc/base.c
+--- linux-2.6.29.owrt/fs/proc/base.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/proc/base.c 2009-05-10 23:48:29.000000000 +0200
+@@ -3066,6 +3066,7 @@
+ int retval = -ENOENT;
+ ino_t ino;
+ int tid;
++ unsigned long pos = filp->f_pos; /* avoiding "long long" filp->f_pos */
+ struct pid_namespace *ns;
+
+ task = get_proc_task(inode);
+@@ -3082,18 +3083,18 @@
+ goto out_no_task;
+ retval = 0;
+
+- switch ((unsigned long)filp->f_pos) {
++ switch (pos) {
+ case 0:
+ ino = inode->i_ino;
+- if (filldir(dirent, ".", 1, filp->f_pos, ino, DT_DIR) < 0)
++ if (filldir(dirent, ".", 1, pos, ino, DT_DIR) < 0)
+ goto out;
+- filp->f_pos++;
++ pos++;
+ /* fall through */
+ case 1:
+ ino = parent_ino(dentry);
+- if (filldir(dirent, "..", 2, filp->f_pos, ino, DT_DIR) < 0)
++ if (filldir(dirent, "..", 2, pos, ino, DT_DIR) < 0)
+ goto out;
+- filp->f_pos++;
++ pos++;
+ /* fall through */
+ }
+
+@@ -3103,9 +3104,9 @@
+ ns = filp->f_dentry->d_sb->s_fs_info;
+ tid = (int)filp->f_version;
+ filp->f_version = 0;
+- for (task = first_tid(leader, tid, filp->f_pos - 2, ns);
++ for (task = first_tid(leader, tid, pos - 2, ns);
+ task;
+- task = next_tid(task), filp->f_pos++) {
++ task = next_tid(task), pos++) {
+ tid = task_pid_nr_ns(task, ns);
+ if (proc_task_fill_cache(filp, dirent, filldir, task, tid) < 0) {
+ /* returning this tgid failed, save it as the first
+@@ -3116,6 +3117,7 @@
+ }
+ }
+ out:
++ filp->f_pos = pos;
+ put_task_struct(leader);
+ out_no_task:
+ return retval;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/proc/inode.c linux-2.6.29-rc3.owrt/fs/proc/inode.c
+--- linux-2.6.29.owrt/fs/proc/inode.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/proc/inode.c 2009-05-10 23:48:29.000000000 +0200
+@@ -485,10 +485,8 @@
+ }
+ }
+ unlock_new_inode(inode);
+- } else {
++ } else
+ module_put(de->owner);
+- de_put(de);
+- }
+ return inode;
+
+ out_ino:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/proc/page.c linux-2.6.29-rc3.owrt/fs/proc/page.c
+--- linux-2.6.29.owrt/fs/proc/page.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/proc/page.c 2009-05-10 23:48:29.000000000 +0200
+@@ -80,7 +80,7 @@
+ #define KPF_RECLAIM 9
+ #define KPF_BUDDY 10
+
+-#define kpf_copy_bit(flags, dstpos, srcpos) (((flags >> srcpos) & 1) << dstpos)
++#define kpf_copy_bit(flags, srcpos, dstpos) (((flags >> srcpos) & 1) << dstpos)
+
+ static ssize_t kpageflags_read(struct file *file, char __user *buf,
+ size_t count, loff_t *ppos)
+@@ -107,7 +107,7 @@
+ else
+ kflags = ppage->flags;
+
+- uflags = kpf_copy_bit(kflags, KPF_LOCKED, PG_locked) |
++ uflags = kpf_copy_bit(KPF_LOCKED, PG_locked, kflags) |
+ kpf_copy_bit(kflags, KPF_ERROR, PG_error) |
+ kpf_copy_bit(kflags, KPF_REFERENCED, PG_referenced) |
+ kpf_copy_bit(kflags, KPF_UPTODATE, PG_uptodate) |
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ramfs/file-nommu.c linux-2.6.29-rc3.owrt/fs/ramfs/file-nommu.c
+--- linux-2.6.29.owrt/fs/ramfs/file-nommu.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ramfs/file-nommu.c 2009-05-10 23:48:29.000000000 +0200
+@@ -114,9 +114,6 @@
+ if (!pagevec_add(&lru_pvec, page))
+ __pagevec_lru_add_file(&lru_pvec);
+
+- /* prevent the page from being discarded on memory pressure */
+- SetPageDirty(page);
+-
+ unlock_page(page);
+ }
+
+@@ -129,7 +126,6 @@
+ return -EFBIG;
+
+ add_error:
+- pagevec_lru_add_file(&lru_pvec);
+ page_cache_release(pages + loop);
+ for (loop++; loop < npages; loop++)
+ __free_page(pages + loop);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/seq_file.c linux-2.6.29-rc3.owrt/fs/seq_file.c
+--- linux-2.6.29.owrt/fs/seq_file.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/seq_file.c 2009-05-10 23:48:29.000000000 +0200
+@@ -48,78 +48,12 @@
+ */
+ file->f_version = 0;
+
+- /*
+- * seq_files support lseek() and pread(). They do not implement
+- * write() at all, but we clear FMODE_PWRITE here for historical
+- * reasons.
+- *
+- * If a client of seq_files a) implements file.write() and b) wishes to
+- * support pwrite() then that client will need to implement its own
+- * file.open() which calls seq_open() and then sets FMODE_PWRITE.
+- */
+- file->f_mode &= ~FMODE_PWRITE;
++ /* SEQ files support lseek, but not pread/pwrite */
++ file->f_mode &= ~(FMODE_PREAD | FMODE_PWRITE);
+ return 0;
+ }
+ EXPORT_SYMBOL(seq_open);
+
+-static int traverse(struct seq_file *m, loff_t offset)
+-{
+- loff_t pos = 0, index;
+- int error = 0;
+- void *p;
+-
+- m->version = 0;
+- index = 0;
+- m->count = m->from = 0;
+- if (!offset) {
+- m->index = index;
+- return 0;
+- }
+- if (!m->buf) {
+- m->buf = kmalloc(m->size = PAGE_SIZE, GFP_KERNEL);
+- if (!m->buf)
+- return -ENOMEM;
+- }
+- p = m->op->start(m, &index);
+- while (p) {
+- error = PTR_ERR(p);
+- if (IS_ERR(p))
+- break;
+- error = m->op->show(m, p);
+- if (error < 0)
+- break;
+- if (unlikely(error)) {
+- error = 0;
+- m->count = 0;
+- }
+- if (m->count == m->size)
+- goto Eoverflow;
+- if (pos + m->count > offset) {
+- m->from = offset - pos;
+- m->count -= m->from;
+- m->index = index;
+- break;
+- }
+- pos += m->count;
+- m->count = 0;
+- if (pos == offset) {
+- index++;
+- m->index = index;
+- break;
+- }
+- p = m->op->next(m, p, &index);
+- }
+- m->op->stop(m, p);
+- m->index = index;
+- return error;
+-
+-Eoverflow:
+- m->op->stop(m, p);
+- kfree(m->buf);
+- m->buf = kmalloc(m->size <<= 1, GFP_KERNEL);
+- return !m->buf ? -ENOMEM : -EAGAIN;
+-}
+-
+ /**
+ * seq_read - ->read() method for sequential files.
+ * @file: the file to read from
+@@ -139,22 +73,6 @@
+ int err = 0;
+
+ mutex_lock(&m->lock);
+-
+- /* Don't assume *ppos is where we left it */
+- if (unlikely(*ppos != m->read_pos)) {
+- m->read_pos = *ppos;
+- while ((err = traverse(m, *ppos)) == -EAGAIN)
+- ;
+- if (err) {
+- /* With prejudice... */
+- m->read_pos = 0;
+- m->version = 0;
+- m->index = 0;
+- m->count = 0;
+- goto Done;
+- }
+- }
+-
+ /*
+ * seq_file->op->..m_start/m_stop/m_next may do special actions
+ * or optimisations based on the file->f_version, so we want to
+@@ -254,10 +172,8 @@
+ Done:
+ if (!copied)
+ copied = err;
+- else {
++ else
+ *ppos += copied;
+- m->read_pos += copied;
+- }
+ file->f_version = m->version;
+ mutex_unlock(&m->lock);
+ return copied;
+@@ -270,6 +186,63 @@
+ }
+ EXPORT_SYMBOL(seq_read);
+
++static int traverse(struct seq_file *m, loff_t offset)
++{
++ loff_t pos = 0, index;
++ int error = 0;
++ void *p;
++
++ m->version = 0;
++ index = 0;
++ m->count = m->from = 0;
++ if (!offset) {
++ m->index = index;
++ return 0;
++ }
++ if (!m->buf) {
++ m->buf = kmalloc(m->size = PAGE_SIZE, GFP_KERNEL);
++ if (!m->buf)
++ return -ENOMEM;
++ }
++ p = m->op->start(m, &index);
++ while (p) {
++ error = PTR_ERR(p);
++ if (IS_ERR(p))
++ break;
++ error = m->op->show(m, p);
++ if (error < 0)
++ break;
++ if (unlikely(error)) {
++ error = 0;
++ m->count = 0;
++ }
++ if (m->count == m->size)
++ goto Eoverflow;
++ if (pos + m->count > offset) {
++ m->from = offset - pos;
++ m->count -= m->from;
++ m->index = index;
++ break;
++ }
++ pos += m->count;
++ m->count = 0;
++ if (pos == offset) {
++ index++;
++ m->index = index;
++ break;
++ }
++ p = m->op->next(m, p, &index);
++ }
++ m->op->stop(m, p);
++ return error;
++
++Eoverflow:
++ m->op->stop(m, p);
++ kfree(m->buf);
++ m->buf = kmalloc(m->size <<= 1, GFP_KERNEL);
++ return !m->buf ? -ENOMEM : -EAGAIN;
++}
++
+ /**
+ * seq_lseek - ->llseek() method for sequential files.
+ * @file: the file in question
+@@ -292,18 +265,16 @@
+ if (offset < 0)
+ break;
+ retval = offset;
+- if (offset != m->read_pos) {
++ if (offset != file->f_pos) {
+ while ((retval=traverse(m, offset)) == -EAGAIN)
+ ;
+ if (retval) {
+ /* with extreme prejudice... */
+ file->f_pos = 0;
+- m->read_pos = 0;
+ m->version = 0;
+ m->index = 0;
+ m->count = 0;
+ } else {
+- m->read_pos = offset;
+ retval = file->f_pos = offset;
+ }
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/squashfs/block.c linux-2.6.29-rc3.owrt/fs/squashfs/block.c
+--- linux-2.6.29.owrt/fs/squashfs/block.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/squashfs/block.c 2009-05-10 23:48:29.000000000 +0200
+@@ -80,7 +80,7 @@
+ * generated a larger block - this does occasionally happen with zlib).
+ */
+ int squashfs_read_data(struct super_block *sb, void **buffer, u64 index,
+- int length, u64 *next_index, int srclength, int pages)
++ int length, u64 *next_index, int srclength)
+ {
+ struct squashfs_sb_info *msblk = sb->s_fs_info;
+ struct buffer_head **bh;
+@@ -184,7 +184,7 @@
+ offset = 0;
+ }
+
+- if (msblk->stream.avail_out == 0 && page < pages) {
++ if (msblk->stream.avail_out == 0) {
+ msblk->stream.next_out = buffer[page++];
+ msblk->stream.avail_out = PAGE_CACHE_SIZE;
+ }
+@@ -201,20 +201,25 @@
+ zlib_init = 1;
+ }
+
+- zlib_err = zlib_inflate(&msblk->stream, Z_SYNC_FLUSH);
++ zlib_err = zlib_inflate(&msblk->stream, Z_NO_FLUSH);
+
+ if (msblk->stream.avail_in == 0 && k < b)
+ put_bh(bh[k++]);
+ } while (zlib_err == Z_OK);
+
+ if (zlib_err != Z_STREAM_END) {
+- ERROR("zlib_inflate error, data probably corrupt\n");
++ ERROR("zlib_inflate returned unexpected result"
++ " 0x%x, srclength %d, avail_in %d,"
++ " avail_out %d\n", zlib_err, srclength,
++ msblk->stream.avail_in,
++ msblk->stream.avail_out);
+ goto release_mutex;
+ }
+
+ zlib_err = zlib_inflateEnd(&msblk->stream);
+ if (zlib_err != Z_OK) {
+- ERROR("zlib_inflate error, data probably corrupt\n");
++ ERROR("zlib_inflateEnd returned unexpected result 0x%x,"
++ " srclength %d\n", zlib_err, srclength);
+ goto release_mutex;
+ }
+ length = msblk->stream.total_out;
+@@ -263,8 +268,7 @@
+ put_bh(bh[k]);
+
+ read_failure:
+- ERROR("squashfs_read_data failed to read block 0x%llx\n",
+- (unsigned long long) index);
++ ERROR("sb_bread failed reading block 0x%llx\n", cur_index);
+ kfree(bh);
+ return -EIO;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/squashfs/cache.c linux-2.6.29-rc3.owrt/fs/squashfs/cache.c
+--- linux-2.6.29.owrt/fs/squashfs/cache.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/squashfs/cache.c 2009-05-10 23:48:29.000000000 +0200
+@@ -119,7 +119,7 @@
+
+ entry->length = squashfs_read_data(sb, entry->data,
+ block, length, &entry->next_index,
+- cache->block_size, cache->pages);
++ cache->block_size);
+
+ spin_lock(&cache->lock);
+
+@@ -406,7 +406,7 @@
+ for (i = 0; i < pages; i++, buffer += PAGE_CACHE_SIZE)
+ data[i] = buffer;
+ res = squashfs_read_data(sb, data, block, length |
+- SQUASHFS_COMPRESSED_BIT_BLOCK, NULL, length, pages);
++ SQUASHFS_COMPRESSED_BIT_BLOCK, NULL, length);
+ kfree(data);
+ return res;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/squashfs/inode.c linux-2.6.29-rc3.owrt/fs/squashfs/inode.c
+--- linux-2.6.29.owrt/fs/squashfs/inode.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/squashfs/inode.c 2009-05-10 23:48:29.000000000 +0200
+@@ -133,8 +133,7 @@
+ type = le16_to_cpu(sqshb_ino->inode_type);
+ switch (type) {
+ case SQUASHFS_REG_TYPE: {
+- unsigned int frag_offset, frag;
+- int frag_size;
++ unsigned int frag_offset, frag_size, frag;
+ u64 frag_blk;
+ struct squashfs_reg_inode *sqsh_ino = &squashfs_ino.reg;
+
+@@ -176,8 +175,7 @@
+ break;
+ }
+ case SQUASHFS_LREG_TYPE: {
+- unsigned int frag_offset, frag;
+- int frag_size;
++ unsigned int frag_offset, frag_size, frag;
+ u64 frag_blk;
+ struct squashfs_lreg_inode *sqsh_ino = &squashfs_ino.lreg;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/squashfs/squashfs.h linux-2.6.29-rc3.owrt/fs/squashfs/squashfs.h
+--- linux-2.6.29.owrt/fs/squashfs/squashfs.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/squashfs/squashfs.h 2009-05-10 23:48:29.000000000 +0200
+@@ -34,7 +34,7 @@
+
+ /* block.c */
+ extern int squashfs_read_data(struct super_block *, void **, u64, int, u64 *,
+- int, int);
++ int);
+
+ /* cache.c */
+ extern struct squashfs_cache *squashfs_cache_init(char *, int, int);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/squashfs/super.c linux-2.6.29-rc3.owrt/fs/squashfs/super.c
+--- linux-2.6.29.owrt/fs/squashfs/super.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/squashfs/super.c 2009-05-10 23:48:29.000000000 +0200
+@@ -389,7 +389,7 @@
+ return err;
+ }
+
+- printk(KERN_INFO "squashfs: version 4.0 (2009/01/31) "
++ printk(KERN_INFO "squashfs: version 4.0 (2009/01/03) "
+ "Phillip Lougher\n");
+
+ return 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/super.c linux-2.6.29-rc3.owrt/fs/super.c
+--- linux-2.6.29.owrt/fs/super.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/super.c 2009-05-10 23:48:29.000000000 +0200
+@@ -82,22 +82,7 @@
+ * lock ordering than usbfs:
+ */
+ lockdep_set_class(&s->s_lock, &type->s_lock_key);
+- /*
+- * sget() can have s_umount recursion.
+- *
+- * When it cannot find a suitable sb, it allocates a new
+- * one (this one), and tries again to find a suitable old
+- * one.
+- *
+- * In case that succeeds, it will acquire the s_umount
+- * lock of the old one. Since these are clearly distrinct
+- * locks, and this object isn't exposed yet, there's no
+- * risk of deadlocks.
+- *
+- * Annotate this by putting this lock in a different
+- * subclass.
+- */
+- down_write_nested(&s->s_umount, SINGLE_DEPTH_NESTING);
++ down_write(&s->s_umount);
+ s->s_count = S_BIAS;
+ atomic_set(&s->s_active, 1);
+ mutex_init(&s->s_vfs_rename_mutex);
+@@ -316,7 +301,7 @@
+ /*
+ * wait for asynchronous fs operations to finish before going further
+ */
+- async_synchronize_full_domain(&sb->s_async_list);
++ async_synchronize_full_special(&sb->s_async_list);
+
+ /* bad name - it should be evict_inodes() */
+ invalidate_inodes(sb);
+@@ -371,10 +356,8 @@
+ continue;
+ if (!grab_super(old))
+ goto retry;
+- if (s) {
+- up_write(&s->s_umount);
++ if (s)
+ destroy_super(s);
+- }
+ return old;
+ }
+ }
+@@ -389,7 +372,6 @@
+ err = set(s, data);
+ if (err) {
+ spin_unlock(&sb_lock);
+- up_write(&s->s_umount);
+ destroy_super(s);
+ return ERR_PTR(err);
+ }
+@@ -488,7 +470,7 @@
+ sb->s_count++;
+ spin_unlock(&sb_lock);
+ down_read(&sb->s_umount);
+- async_synchronize_full_domain(&sb->s_async_list);
++ async_synchronize_full_special(&sb->s_async_list);
+ if (sb->s_root && (wait || sb->s_dirt))
+ sb->s_op->sync_fs(sb, wait);
+ up_read(&sb->s_umount);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/timerfd.c linux-2.6.29-rc3.owrt/fs/timerfd.c
+--- linux-2.6.29.owrt/fs/timerfd.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/timerfd.c 2009-05-10 23:48:29.000000000 +0200
+@@ -186,9 +186,10 @@
+ BUILD_BUG_ON(TFD_CLOEXEC != O_CLOEXEC);
+ BUILD_BUG_ON(TFD_NONBLOCK != O_NONBLOCK);
+
+- if ((flags & ~TFD_CREATE_FLAGS) ||
+- (clockid != CLOCK_MONOTONIC &&
+- clockid != CLOCK_REALTIME))
++ if (flags & ~(TFD_CLOEXEC | TFD_NONBLOCK))
++ return -EINVAL;
++ if (clockid != CLOCK_MONOTONIC &&
++ clockid != CLOCK_REALTIME)
+ return -EINVAL;
+
+ ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
+@@ -200,7 +201,7 @@
+ hrtimer_init(&ctx->tmr, clockid, HRTIMER_MODE_ABS);
+
+ ufd = anon_inode_getfd("[timerfd]", &timerfd_fops, ctx,
+- flags & TFD_SHARED_FCNTL_FLAGS);
++ flags & (O_CLOEXEC | O_NONBLOCK));
+ if (ufd < 0)
+ kfree(ctx);
+
+@@ -218,8 +219,7 @@
+ if (copy_from_user(&ktmr, utmr, sizeof(ktmr)))
+ return -EFAULT;
+
+- if ((flags & ~TFD_SETTIME_FLAGS) ||
+- !timespec_valid(&ktmr.it_value) ||
++ if (!timespec_valid(&ktmr.it_value) ||
+ !timespec_valid(&ktmr.it_interval))
+ return -EINVAL;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ubifs/budget.c linux-2.6.29-rc3.owrt/fs/ubifs/budget.c
+--- linux-2.6.29.owrt/fs/ubifs/budget.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ubifs/budget.c 2009-05-10 23:48:29.000000000 +0200
+@@ -689,7 +689,7 @@
+ }
+
+ /**
+- * ubifs_get_free_space_nolock - return amount of free space.
++ * ubifs_get_free_space - return amount of free space.
+ * @c: UBIFS file-system description object
+ *
+ * This function calculates amount of free space to report to user-space.
+@@ -704,14 +704,16 @@
+ * traditional file-systems, because they have way less overhead than UBIFS.
+ * So, to keep users happy, UBIFS tries to take the overhead into account.
+ */
+-long long ubifs_get_free_space_nolock(struct ubifs_info *c)
++long long ubifs_get_free_space(struct ubifs_info *c)
+ {
+- int rsvd_idx_lebs, lebs;
++ int min_idx_lebs, rsvd_idx_lebs, lebs;
+ long long available, outstanding, free;
+
+- ubifs_assert(c->min_idx_lebs == ubifs_calc_min_idx_lebs(c));
++ spin_lock(&c->space_lock);
++ min_idx_lebs = c->min_idx_lebs;
++ ubifs_assert(min_idx_lebs == ubifs_calc_min_idx_lebs(c));
+ outstanding = c->budg_data_growth + c->budg_dd_growth;
+- available = ubifs_calc_available(c, c->min_idx_lebs);
++ available = ubifs_calc_available(c, min_idx_lebs);
+
+ /*
+ * When reporting free space to user-space, UBIFS guarantees that it is
+@@ -724,14 +726,15 @@
+ * Note, the calculations below are similar to what we have in
+ * 'do_budget_space()', so refer there for comments.
+ */
+- if (c->min_idx_lebs > c->lst.idx_lebs)
+- rsvd_idx_lebs = c->min_idx_lebs - c->lst.idx_lebs;
++ if (min_idx_lebs > c->lst.idx_lebs)
++ rsvd_idx_lebs = min_idx_lebs - c->lst.idx_lebs;
+ else
+ rsvd_idx_lebs = 0;
+ lebs = c->lst.empty_lebs + c->freeable_cnt + c->idx_gc_cnt -
+ c->lst.taken_empty_lebs;
+ lebs -= rsvd_idx_lebs;
+ available += lebs * (c->dark_wm - c->leb_overhead);
++ spin_unlock(&c->space_lock);
+
+ if (available > outstanding)
+ free = ubifs_reported_space(c, available - outstanding);
+@@ -739,21 +742,3 @@
+ free = 0;
+ return free;
+ }
+-
+-/**
+- * ubifs_get_free_space - return amount of free space.
+- * @c: UBIFS file-system description object
+- *
+- * This function calculates and retuns amount of free space to report to
+- * user-space.
+- */
+-long long ubifs_get_free_space(struct ubifs_info *c)
+-{
+- long long free;
+-
+- spin_lock(&c->space_lock);
+- free = ubifs_get_free_space_nolock(c);
+- spin_unlock(&c->space_lock);
+-
+- return free;
+-}
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ubifs/debug.c linux-2.6.29-rc3.owrt/fs/ubifs/debug.c
+--- linux-2.6.29.owrt/fs/ubifs/debug.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ubifs/debug.c 2009-05-10 23:48:29.000000000 +0200
+@@ -620,11 +620,9 @@
+ c->dark_wm, c->dead_wm, c->max_idx_node_sz);
+ printk(KERN_DEBUG "\tgc_lnum %d, ihead_lnum %d\n",
+ c->gc_lnum, c->ihead_lnum);
+- /* If we are in R/O mode, journal heads do not exist */
+- if (c->jheads)
+- for (i = 0; i < c->jhead_cnt; i++)
+- printk(KERN_DEBUG "\tjhead %d\t LEB %d\n",
+- c->jheads[i].wbuf.jhead, c->jheads[i].wbuf.lnum);
++ for (i = 0; i < c->jhead_cnt; i++)
++ printk(KERN_DEBUG "\tjhead %d\t LEB %d\n",
++ c->jheads[i].wbuf.jhead, c->jheads[i].wbuf.lnum);
+ for (rb = rb_first(&c->buds); rb; rb = rb_next(rb)) {
+ bud = rb_entry(rb, struct ubifs_bud, rb);
+ printk(KERN_DEBUG "\tbud LEB %d\n", bud->lnum);
+@@ -639,7 +637,10 @@
+ /* Print budgeting predictions */
+ available = ubifs_calc_available(c, c->min_idx_lebs);
+ outstanding = c->budg_data_growth + c->budg_dd_growth;
+- free = ubifs_get_free_space_nolock(c);
++ if (available > outstanding)
++ free = ubifs_reported_space(c, available - outstanding);
++ else
++ free = 0;
+ printk(KERN_DEBUG "Budgeting predictions:\n");
+ printk(KERN_DEBUG "\tavailable: %lld, outstanding %lld, free %lld\n",
+ available, outstanding, free);
+@@ -860,65 +861,6 @@
+ }
+
+ /**
+- * dbg_save_space_info - save information about flash space.
+- * @c: UBIFS file-system description object
+- *
+- * This function saves information about UBIFS free space, dirty space, etc, in
+- * order to check it later.
+- */
+-void dbg_save_space_info(struct ubifs_info *c)
+-{
+- struct ubifs_debug_info *d = c->dbg;
+-
+- ubifs_get_lp_stats(c, &d->saved_lst);
+-
+- spin_lock(&c->space_lock);
+- d->saved_free = ubifs_get_free_space_nolock(c);
+- spin_unlock(&c->space_lock);
+-}
+-
+-/**
+- * dbg_check_space_info - check flash space information.
+- * @c: UBIFS file-system description object
+- *
+- * This function compares current flash space information with the information
+- * which was saved when the 'dbg_save_space_info()' function was called.
+- * Returns zero if the information has not changed, and %-EINVAL it it has
+- * changed.
+- */
+-int dbg_check_space_info(struct ubifs_info *c)
+-{
+- struct ubifs_debug_info *d = c->dbg;
+- struct ubifs_lp_stats lst;
+- long long avail, free;
+-
+- spin_lock(&c->space_lock);
+- avail = ubifs_calc_available(c, c->min_idx_lebs);
+- spin_unlock(&c->space_lock);
+- free = ubifs_get_free_space(c);
+-
+- if (free != d->saved_free) {
+- ubifs_err("free space changed from %lld to %lld",
+- d->saved_free, free);
+- goto out;
+- }
+-
+- return 0;
+-
+-out:
+- ubifs_msg("saved lprops statistics dump");
+- dbg_dump_lstats(&d->saved_lst);
+- ubifs_get_lp_stats(c, &lst);
+- ubifs_msg("current lprops statistics dump");
+- dbg_dump_lstats(&d->saved_lst);
+- spin_lock(&c->space_lock);
+- dbg_dump_budg(c);
+- spin_unlock(&c->space_lock);
+- dump_stack();
+- return -EINVAL;
+-}
+-
+-/**
+ * dbg_check_synced_i_size - check synchronized inode size.
+ * @inode: inode to check
+ *
+@@ -1407,7 +1349,7 @@
+ * @c: UBIFS file-system description object
+ * @leaf_cb: called for each leaf node
+ * @znode_cb: called for each indexing node
+- * @priv: private data which is passed to callbacks
++ * @priv: private date which is passed to callbacks
+ *
+ * This function walks the UBIFS index and calls the @leaf_cb for each leaf
+ * node and @znode_cb for each indexing node. Returns zero in case of success
+@@ -2467,7 +2409,7 @@
+ * Root directory for UBIFS stuff in debugfs. Contains sub-directories which
+ * contain the stuff specific to particular file-system mounts.
+ */
+-static struct dentry *dfs_rootdir;
++static struct dentry *debugfs_rootdir;
+
+ /**
+ * dbg_debugfs_init - initialize debugfs file-system.
+@@ -2479,9 +2421,9 @@
+ */
+ int dbg_debugfs_init(void)
+ {
+- dfs_rootdir = debugfs_create_dir("ubifs", NULL);
+- if (IS_ERR(dfs_rootdir)) {
+- int err = PTR_ERR(dfs_rootdir);
++ debugfs_rootdir = debugfs_create_dir("ubifs", NULL);
++ if (IS_ERR(debugfs_rootdir)) {
++ int err = PTR_ERR(debugfs_rootdir);
+ ubifs_err("cannot create \"ubifs\" debugfs directory, "
+ "error %d\n", err);
+ return err;
+@@ -2495,7 +2437,7 @@
+ */
+ void dbg_debugfs_exit(void)
+ {
+- debugfs_remove(dfs_rootdir);
++ debugfs_remove(debugfs_rootdir);
+ }
+
+ static int open_debugfs_file(struct inode *inode, struct file *file)
+@@ -2510,13 +2452,13 @@
+ struct ubifs_info *c = file->private_data;
+ struct ubifs_debug_info *d = c->dbg;
+
+- if (file->f_path.dentry == d->dfs_dump_lprops)
++ if (file->f_path.dentry == d->dump_lprops)
+ dbg_dump_lprops(c);
+- else if (file->f_path.dentry == d->dfs_dump_budg) {
++ else if (file->f_path.dentry == d->dump_budg) {
+ spin_lock(&c->space_lock);
+ dbg_dump_budg(c);
+ spin_unlock(&c->space_lock);
+- } else if (file->f_path.dentry == d->dfs_dump_tnc) {
++ } else if (file->f_path.dentry == d->dump_tnc) {
+ mutex_lock(&c->tnc_mutex);
+ dbg_dump_tnc(c);
+ mutex_unlock(&c->tnc_mutex);
+@@ -2527,7 +2469,7 @@
+ return count;
+ }
+
+-static const struct file_operations dfs_fops = {
++static const struct file_operations debugfs_fops = {
+ .open = open_debugfs_file,
+ .write = write_debugfs_file,
+ .owner = THIS_MODULE,
+@@ -2552,32 +2494,36 @@
+ struct dentry *dent;
+ struct ubifs_debug_info *d = c->dbg;
+
+- sprintf(d->dfs_dir_name, "ubi%d_%d", c->vi.ubi_num, c->vi.vol_id);
+- d->dfs_dir = debugfs_create_dir(d->dfs_dir_name, dfs_rootdir);
+- if (IS_ERR(d->dfs_dir)) {
+- err = PTR_ERR(d->dfs_dir);
++ sprintf(d->debugfs_dir_name, "ubi%d_%d", c->vi.ubi_num, c->vi.vol_id);
++ d->debugfs_dir = debugfs_create_dir(d->debugfs_dir_name,
++ debugfs_rootdir);
++ if (IS_ERR(d->debugfs_dir)) {
++ err = PTR_ERR(d->debugfs_dir);
+ ubifs_err("cannot create \"%s\" debugfs directory, error %d\n",
+- d->dfs_dir_name, err);
++ d->debugfs_dir_name, err);
+ goto out;
+ }
+
+ fname = "dump_lprops";
+- dent = debugfs_create_file(fname, S_IWUGO, d->dfs_dir, c, &dfs_fops);
++ dent = debugfs_create_file(fname, S_IWUGO, d->debugfs_dir, c,
++ &debugfs_fops);
+ if (IS_ERR(dent))
+ goto out_remove;
+- d->dfs_dump_lprops = dent;
++ d->dump_lprops = dent;
+
+ fname = "dump_budg";
+- dent = debugfs_create_file(fname, S_IWUGO, d->dfs_dir, c, &dfs_fops);
++ dent = debugfs_create_file(fname, S_IWUGO, d->debugfs_dir, c,
++ &debugfs_fops);
+ if (IS_ERR(dent))
+ goto out_remove;
+- d->dfs_dump_budg = dent;
++ d->dump_budg = dent;
+
+ fname = "dump_tnc";
+- dent = debugfs_create_file(fname, S_IWUGO, d->dfs_dir, c, &dfs_fops);
++ dent = debugfs_create_file(fname, S_IWUGO, d->debugfs_dir, c,
++ &debugfs_fops);
+ if (IS_ERR(dent))
+ goto out_remove;
+- d->dfs_dump_tnc = dent;
++ d->dump_tnc = dent;
+
+ return 0;
+
+@@ -2585,7 +2531,7 @@
+ err = PTR_ERR(dent);
+ ubifs_err("cannot create \"%s\" debugfs directory, error %d\n",
+ fname, err);
+- debugfs_remove_recursive(d->dfs_dir);
++ debugfs_remove_recursive(d->debugfs_dir);
+ out:
+ return err;
+ }
+@@ -2596,7 +2542,7 @@
+ */
+ void dbg_debugfs_exit_fs(struct ubifs_info *c)
+ {
+- debugfs_remove_recursive(c->dbg->dfs_dir);
++ debugfs_remove_recursive(c->dbg->debugfs_dir);
+ }
+
+ #endif /* CONFIG_UBIFS_FS_DEBUG */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ubifs/debug.h linux-2.6.29-rc3.owrt/fs/ubifs/debug.h
+--- linux-2.6.29.owrt/fs/ubifs/debug.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ubifs/debug.h 2009-05-10 23:48:29.000000000 +0200
+@@ -41,17 +41,15 @@
+ * @chk_lpt_wastage: used by LPT tree size checker
+ * @chk_lpt_lebs: used by LPT tree size checker
+ * @new_nhead_offs: used by LPT tree size checker
+- * @new_ihead_lnum: used by debugging to check @c->ihead_lnum
+- * @new_ihead_offs: used by debugging to check @c->ihead_offs
++ * @new_ihead_lnum: used by debugging to check ihead_lnum
++ * @new_ihead_offs: used by debugging to check ihead_offs
+ *
+- * @saved_lst: saved lprops statistics (used by 'dbg_save_space_info()')
+- * @saved_free: saved free space (used by 'dbg_save_space_info()')
+- *
+- * dfs_dir_name: name of debugfs directory containing this file-system's files
+- * dfs_dir: direntry object of the file-system debugfs directory
+- * dfs_dump_lprops: "dump lprops" debugfs knob
+- * dfs_dump_budg: "dump budgeting information" debugfs knob
+- * dfs_dump_tnc: "dump TNC" debugfs knob
++ * debugfs_dir_name: name of debugfs directory containing this file-system's
++ * files
++ * debugfs_dir: direntry object of the file-system debugfs directory
++ * dump_lprops: "dump lprops" debugfs knob
++ * dump_budg: "dump budgeting information" debugfs knob
++ * dump_tnc: "dump TNC" debugfs knob
+ */
+ struct ubifs_debug_info {
+ void *buf;
+@@ -71,14 +69,11 @@
+ int new_ihead_lnum;
+ int new_ihead_offs;
+
+- struct ubifs_lp_stats saved_lst;
+- long long saved_free;
+-
+- char dfs_dir_name[100];
+- struct dentry *dfs_dir;
+- struct dentry *dfs_dump_lprops;
+- struct dentry *dfs_dump_budg;
+- struct dentry *dfs_dump_tnc;
++ char debugfs_dir_name[100];
++ struct dentry *debugfs_dir;
++ struct dentry *dump_lprops;
++ struct dentry *dump_budg;
++ struct dentry *dump_tnc;
+ };
+
+ #define ubifs_assert(expr) do { \
+@@ -302,8 +297,7 @@
+ dbg_znode_callback znode_cb, void *priv);
+
+ /* Checking functions */
+-void dbg_save_space_info(struct ubifs_info *c);
+-int dbg_check_space_info(struct ubifs_info *c);
++
+ int dbg_check_lprops(struct ubifs_info *c);
+ int dbg_old_index_check_init(struct ubifs_info *c, struct ubifs_zbranch *zroot);
+ int dbg_check_old_index(struct ubifs_info *c, struct ubifs_zbranch *zroot);
+@@ -445,8 +439,6 @@
+
+ #define dbg_walk_index(c, leaf_cb, znode_cb, priv) 0
+ #define dbg_old_index_check_init(c, zroot) 0
+-#define dbg_save_space_info(c) ({})
+-#define dbg_check_space_info(c) 0
+ #define dbg_check_old_index(c, zroot) 0
+ #define dbg_check_cats(c) 0
+ #define dbg_check_ltab(c) 0
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ubifs/dir.c linux-2.6.29-rc3.owrt/fs/ubifs/dir.c
+--- linux-2.6.29.owrt/fs/ubifs/dir.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ubifs/dir.c 2009-05-10 23:48:29.000000000 +0200
+@@ -482,29 +482,30 @@
+ }
+
+ /**
+- * lock_2_inodes - a wrapper for locking two UBIFS inodes.
++ * lock_2_inodes - lock two UBIFS inodes.
+ * @inode1: first inode
+ * @inode2: second inode
+- *
+- * We do not implement any tricks to guarantee strict lock ordering, because
+- * VFS has already done it for us on the @i_mutex. So this is just a simple
+- * wrapper function.
+ */
+ static void lock_2_inodes(struct inode *inode1, struct inode *inode2)
+ {
+- mutex_lock_nested(&ubifs_inode(inode1)->ui_mutex, WB_MUTEX_1);
+- mutex_lock_nested(&ubifs_inode(inode2)->ui_mutex, WB_MUTEX_2);
++ if (inode1->i_ino < inode2->i_ino) {
++ mutex_lock_nested(&ubifs_inode(inode1)->ui_mutex, WB_MUTEX_2);
++ mutex_lock_nested(&ubifs_inode(inode2)->ui_mutex, WB_MUTEX_3);
++ } else {
++ mutex_lock_nested(&ubifs_inode(inode2)->ui_mutex, WB_MUTEX_2);
++ mutex_lock_nested(&ubifs_inode(inode1)->ui_mutex, WB_MUTEX_3);
++ }
+ }
+
+ /**
+- * unlock_2_inodes - a wrapper for unlocking two UBIFS inodes.
++ * unlock_2_inodes - unlock two UBIFS inodes inodes.
+ * @inode1: first inode
+ * @inode2: second inode
+ */
+ static void unlock_2_inodes(struct inode *inode1, struct inode *inode2)
+ {
+- mutex_unlock(&ubifs_inode(inode2)->ui_mutex);
+ mutex_unlock(&ubifs_inode(inode1)->ui_mutex);
++ mutex_unlock(&ubifs_inode(inode2)->ui_mutex);
+ }
+
+ static int ubifs_link(struct dentry *old_dentry, struct inode *dir,
+@@ -526,8 +527,6 @@
+ dbg_gen("dent '%.*s' to ino %lu (nlink %d) in dir ino %lu",
+ dentry->d_name.len, dentry->d_name.name, inode->i_ino,
+ inode->i_nlink, dir->i_ino);
+- ubifs_assert(mutex_is_locked(&dir->i_mutex));
+- ubifs_assert(mutex_is_locked(&inode->i_mutex));
+ err = dbg_check_synced_i_size(inode);
+ if (err)
+ return err;
+@@ -581,8 +580,6 @@
+ dbg_gen("dent '%.*s' from ino %lu (nlink %d) in dir ino %lu",
+ dentry->d_name.len, dentry->d_name.name, inode->i_ino,
+ inode->i_nlink, dir->i_ino);
+- ubifs_assert(mutex_is_locked(&dir->i_mutex));
+- ubifs_assert(mutex_is_locked(&inode->i_mutex));
+ err = dbg_check_synced_i_size(inode);
+ if (err)
+ return err;
+@@ -670,8 +667,7 @@
+
+ dbg_gen("directory '%.*s', ino %lu in dir ino %lu", dentry->d_name.len,
+ dentry->d_name.name, inode->i_ino, dir->i_ino);
+- ubifs_assert(mutex_is_locked(&dir->i_mutex));
+- ubifs_assert(mutex_is_locked(&inode->i_mutex));
++
+ err = check_dir_empty(c, dentry->d_inode);
+ if (err)
+ return err;
+@@ -926,30 +922,59 @@
+ }
+
+ /**
+- * lock_3_inodes - a wrapper for locking three UBIFS inodes.
++ * lock_3_inodes - lock three UBIFS inodes for rename.
+ * @inode1: first inode
+ * @inode2: second inode
+ * @inode3: third inode
+ *
+- * This function is used for 'ubifs_rename()' and @inode1 may be the same as
+- * @inode2 whereas @inode3 may be %NULL.
+- *
+- * We do not implement any tricks to guarantee strict lock ordering, because
+- * VFS has already done it for us on the @i_mutex. So this is just a simple
+- * wrapper function.
++ * For 'ubifs_rename()', @inode1 may be the same as @inode2 whereas @inode3 may
++ * be null.
+ */
+ static void lock_3_inodes(struct inode *inode1, struct inode *inode2,
+ struct inode *inode3)
+ {
+- mutex_lock_nested(&ubifs_inode(inode1)->ui_mutex, WB_MUTEX_1);
+- if (inode2 != inode1)
+- mutex_lock_nested(&ubifs_inode(inode2)->ui_mutex, WB_MUTEX_2);
+- if (inode3)
+- mutex_lock_nested(&ubifs_inode(inode3)->ui_mutex, WB_MUTEX_3);
++ struct inode *i1, *i2, *i3;
++
++ if (!inode3) {
++ if (inode1 != inode2) {
++ lock_2_inodes(inode1, inode2);
++ return;
++ }
++ mutex_lock_nested(&ubifs_inode(inode1)->ui_mutex, WB_MUTEX_1);
++ return;
++ }
++
++ if (inode1 == inode2) {
++ lock_2_inodes(inode1, inode3);
++ return;
++ }
++
++ /* 3 different inodes */
++ if (inode1 < inode2) {
++ i3 = inode2;
++ if (inode1 < inode3) {
++ i1 = inode1;
++ i2 = inode3;
++ } else {
++ i1 = inode3;
++ i2 = inode1;
++ }
++ } else {
++ i3 = inode1;
++ if (inode2 < inode3) {
++ i1 = inode2;
++ i2 = inode3;
++ } else {
++ i1 = inode3;
++ i2 = inode2;
++ }
++ }
++ mutex_lock_nested(&ubifs_inode(i1)->ui_mutex, WB_MUTEX_1);
++ lock_2_inodes(i2, i3);
+ }
+
+ /**
+- * unlock_3_inodes - a wrapper for unlocking three UBIFS inodes for rename.
++ * unlock_3_inodes - unlock three UBIFS inodes for rename.
+ * @inode1: first inode
+ * @inode2: second inode
+ * @inode3: third inode
+@@ -957,11 +982,11 @@
+ static void unlock_3_inodes(struct inode *inode1, struct inode *inode2,
+ struct inode *inode3)
+ {
+- if (inode3)
+- mutex_unlock(&ubifs_inode(inode3)->ui_mutex);
++ mutex_unlock(&ubifs_inode(inode1)->ui_mutex);
+ if (inode1 != inode2)
+ mutex_unlock(&ubifs_inode(inode2)->ui_mutex);
+- mutex_unlock(&ubifs_inode(inode1)->ui_mutex);
++ if (inode3)
++ mutex_unlock(&ubifs_inode(inode3)->ui_mutex);
+ }
+
+ static int ubifs_rename(struct inode *old_dir, struct dentry *old_dentry,
+@@ -995,11 +1020,6 @@
+ "dir ino %lu", old_dentry->d_name.len, old_dentry->d_name.name,
+ old_inode->i_ino, old_dir->i_ino, new_dentry->d_name.len,
+ new_dentry->d_name.name, new_dir->i_ino);
+- ubifs_assert(mutex_is_locked(&old_dir->i_mutex));
+- ubifs_assert(mutex_is_locked(&new_dir->i_mutex));
+- if (unlink)
+- ubifs_assert(mutex_is_locked(&new_inode->i_mutex));
+-
+
+ if (unlink && is_dir) {
+ err = check_dir_empty(c, new_inode);
+@@ -1179,7 +1199,7 @@
+ return 0;
+ }
+
+-const struct inode_operations ubifs_dir_inode_operations = {
++struct inode_operations ubifs_dir_inode_operations = {
+ .lookup = ubifs_lookup,
+ .create = ubifs_create,
+ .link = ubifs_link,
+@@ -1199,7 +1219,7 @@
+ #endif
+ };
+
+-const struct file_operations ubifs_dir_operations = {
++struct file_operations ubifs_dir_operations = {
+ .llseek = ubifs_dir_llseek,
+ .release = ubifs_dir_release,
+ .read = generic_read_dir,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ubifs/file.c linux-2.6.29-rc3.owrt/fs/ubifs/file.c
+--- linux-2.6.29.owrt/fs/ubifs/file.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ubifs/file.c 2009-05-10 23:48:29.000000000 +0200
+@@ -432,6 +432,7 @@
+ int uninitialized_var(err), appending = !!(pos + len > inode->i_size);
+ struct page *page;
+
++
+ ubifs_assert(ubifs_inode(inode)->ui_size == inode->i_size);
+
+ if (unlikely(c->ro_media))
+@@ -1540,7 +1541,7 @@
+ return 0;
+ }
+
+-const struct address_space_operations ubifs_file_address_operations = {
++struct address_space_operations ubifs_file_address_operations = {
+ .readpage = ubifs_readpage,
+ .writepage = ubifs_writepage,
+ .write_begin = ubifs_write_begin,
+@@ -1550,7 +1551,7 @@
+ .releasepage = ubifs_releasepage,
+ };
+
+-const struct inode_operations ubifs_file_inode_operations = {
++struct inode_operations ubifs_file_inode_operations = {
+ .setattr = ubifs_setattr,
+ .getattr = ubifs_getattr,
+ #ifdef CONFIG_UBIFS_FS_XATTR
+@@ -1561,14 +1562,14 @@
+ #endif
+ };
+
+-const struct inode_operations ubifs_symlink_inode_operations = {
++struct inode_operations ubifs_symlink_inode_operations = {
+ .readlink = generic_readlink,
+ .follow_link = ubifs_follow_link,
+ .setattr = ubifs_setattr,
+ .getattr = ubifs_getattr,
+ };
+
+-const struct file_operations ubifs_file_operations = {
++struct file_operations ubifs_file_operations = {
+ .llseek = generic_file_llseek,
+ .read = do_sync_read,
+ .write = do_sync_write,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ubifs/gc.c linux-2.6.29-rc3.owrt/fs/ubifs/gc.c
+--- linux-2.6.29.owrt/fs/ubifs/gc.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ubifs/gc.c 2009-05-10 23:48:29.000000000 +0200
+@@ -31,26 +31,6 @@
+ * to be reused. Garbage collection will cause the number of dirty index nodes
+ * to grow, however sufficient space is reserved for the index to ensure the
+ * commit will never run out of space.
+- *
+- * Notes about dead watermark. At current UBIFS implementation we assume that
+- * LEBs which have less than @c->dead_wm bytes of free + dirty space are full
+- * and not worth garbage-collecting. The dead watermark is one min. I/O unit
+- * size, or min. UBIFS node size, depending on what is greater. Indeed, UBIFS
+- * Garbage Collector has to synchronize the GC head's write buffer before
+- * returning, so this is about wasting one min. I/O unit. However, UBIFS GC can
+- * actually reclaim even very small pieces of dirty space by garbage collecting
+- * enough dirty LEBs, but we do not bother doing this at this implementation.
+- *
+- * Notes about dark watermark. The results of GC work depends on how big are
+- * the UBIFS nodes GC deals with. Large nodes make GC waste more space. Indeed,
+- * if GC move data from LEB A to LEB B and nodes in LEB A are large, GC would
+- * have to waste large pieces of free space at the end of LEB B, because nodes
+- * from LEB A would not fit. And the worst situation is when all nodes are of
+- * maximum size. So dark watermark is the amount of free + dirty space in LEB
+- * which are guaranteed to be reclaimable. If LEB has less space, the GC migh
+- * be unable to reclaim it. So, LEBs with free + dirty greater than dark
+- * watermark are "good" LEBs from GC's point of few. The other LEBs are not so
+- * good, and GC takes extra care when moving them.
+ */
+
+ #include <linux/pagemap.h>
+@@ -401,7 +381,7 @@
+
+ /*
+ * Don't release the LEB until after the next commit, because
+- * it may contain data which is needed for recovery. So
++ * it may contain date which is needed for recovery. So
+ * although we freed this LEB, it will become usable only after
+ * the commit.
+ */
+@@ -830,9 +810,8 @@
+ * ubifs_destroy_idx_gc - destroy idx_gc list.
+ * @c: UBIFS file-system description object
+ *
+- * This function destroys the @c->idx_gc list. It is called when unmounting
+- * so locks are not needed. Returns zero in case of success and a negative
+- * error code in case of failure.
++ * This function destroys the idx_gc list. It is called when unmounting or
++ * remounting read-only so locks are not needed.
+ */
+ void ubifs_destroy_idx_gc(struct ubifs_info *c)
+ {
+@@ -845,6 +824,7 @@
+ list_del(&idx_gc->list);
+ kfree(idx_gc);
+ }
++
+ }
+
+ /**
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ubifs/io.c linux-2.6.29-rc3.owrt/fs/ubifs/io.c
+--- linux-2.6.29.owrt/fs/ubifs/io.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ubifs/io.c 2009-05-10 23:48:29.000000000 +0200
+@@ -29,7 +29,7 @@
+ * would have been wasted for padding to the nearest minimal I/O unit boundary.
+ * Instead, data first goes to the write-buffer and is flushed when the
+ * buffer is full or when it is not used for some time (by timer). This is
+- * similar to the mechanism is used by JFFS2.
++ * similarto the mechanism is used by JFFS2.
+ *
+ * Write-buffers are defined by 'struct ubifs_wbuf' objects and protected by
+ * mutexes defined inside these objects. Since sometimes upper-level code
+@@ -75,7 +75,7 @@
+ * @lnum: logical eraseblock number
+ * @offs: offset within the logical eraseblock
+ * @quiet: print no messages
+- * @must_chk_crc: indicates whether to always check the CRC
++ * @chk_crc: indicates whether to always check the CRC
+ *
+ * This function checks node magic number and CRC checksum. This function also
+ * validates node length to prevent UBIFS from becoming crazy when an attacker
+@@ -83,17 +83,11 @@
+ * node length in the common header could cause UBIFS to read memory outside of
+ * allocated buffer when checking the CRC checksum.
+ *
+- * This function may skip data nodes CRC checking if @c->no_chk_data_crc is
+- * true, which is controlled by corresponding UBIFS mount option. However, if
+- * @must_chk_crc is true, then @c->no_chk_data_crc is ignored and CRC is
+- * checked. Similarly, if @c->always_chk_crc is true, @c->no_chk_data_crc is
+- * ignored and CRC is checked.
+- *
+- * This function returns zero in case of success and %-EUCLEAN in case of bad
+- * CRC or magic.
++ * This function returns zero in case of success %-EUCLEAN in case of bad CRC
++ * or magic.
+ */
+ int ubifs_check_node(const struct ubifs_info *c, const void *buf, int lnum,
+- int offs, int quiet, int must_chk_crc)
++ int offs, int quiet, int chk_crc)
+ {
+ int err = -EINVAL, type, node_len;
+ uint32_t crc, node_crc, magic;
+@@ -129,9 +123,9 @@
+ node_len > c->ranges[type].max_len)
+ goto out_len;
+
+- if (!must_chk_crc && type == UBIFS_DATA_NODE && !c->always_chk_crc &&
+- c->no_chk_data_crc)
+- return 0;
++ if (!chk_crc && type == UBIFS_DATA_NODE && !c->always_chk_crc)
++ if (c->no_chk_data_crc)
++ return 0;
+
+ crc = crc32(UBIFS_CRC32_INIT, buf + 8, node_len - 8);
+ node_crc = le32_to_cpu(ch->crc);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ubifs/journal.c linux-2.6.29-rc3.owrt/fs/ubifs/journal.c
+--- linux-2.6.29.owrt/fs/ubifs/journal.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ubifs/journal.c 2009-05-10 23:48:29.000000000 +0200
+@@ -208,7 +208,7 @@
+ offs = 0;
+
+ out:
+- err = ubifs_wbuf_seek_nolock(wbuf, lnum, offs, wbuf->dtype);
++ err = ubifs_wbuf_seek_nolock(wbuf, lnum, offs, UBI_SHORTTERM);
+ if (err)
+ goto out_unlock;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ubifs/lprops.c linux-2.6.29-rc3.owrt/fs/ubifs/lprops.c
+--- linux-2.6.29.owrt/fs/ubifs/lprops.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ubifs/lprops.c 2009-05-10 23:48:29.000000000 +0200
+@@ -635,10 +635,10 @@
+ * @c: UBIFS file-system description object
+ * @st: return statistics
+ */
+-void ubifs_get_lp_stats(struct ubifs_info *c, struct ubifs_lp_stats *lst)
++void ubifs_get_lp_stats(struct ubifs_info *c, struct ubifs_lp_stats *st)
+ {
+ spin_lock(&c->space_lock);
+- memcpy(lst, &c->lst, sizeof(struct ubifs_lp_stats));
++ memcpy(st, &c->lst, sizeof(struct ubifs_lp_stats));
+ spin_unlock(&c->space_lock);
+ }
+
+@@ -678,9 +678,6 @@
+
+ out:
+ ubifs_release_lprops(c);
+- if (err)
+- ubifs_err("cannot change properties of LEB %d, error %d",
+- lnum, err);
+ return err;
+ }
+
+@@ -717,9 +714,6 @@
+
+ out:
+ ubifs_release_lprops(c);
+- if (err)
+- ubifs_err("cannot update properties of LEB %d, error %d",
+- lnum, err);
+ return err;
+ }
+
+@@ -743,8 +737,6 @@
+ lpp = ubifs_lpt_lookup(c, lnum);
+ if (IS_ERR(lpp)) {
+ err = PTR_ERR(lpp);
+- ubifs_err("cannot read properties of LEB %d, error %d",
+- lnum, err);
+ goto out;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ubifs/lpt_commit.c linux-2.6.29-rc3.owrt/fs/ubifs/lpt_commit.c
+--- linux-2.6.29.owrt/fs/ubifs/lpt_commit.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ubifs/lpt_commit.c 2009-05-10 23:48:29.000000000 +0200
+@@ -556,23 +556,23 @@
+ }
+
+ /**
+- * next_pnode_to_dirty - find next pnode to dirty.
++ * next_pnode - find next pnode.
+ * @c: UBIFS file-system description object
+ * @pnode: pnode
+ *
+- * This function returns the next pnode to dirty or %NULL if there are no more
+- * pnodes. Note that pnodes that have never been written (lnum == 0) are
+- * skipped.
++ * This function returns the next pnode or %NULL if there are no more pnodes.
+ */
+-static struct ubifs_pnode *next_pnode_to_dirty(struct ubifs_info *c,
+- struct ubifs_pnode *pnode)
++static struct ubifs_pnode *next_pnode(struct ubifs_info *c,
++ struct ubifs_pnode *pnode)
+ {
+ struct ubifs_nnode *nnode;
+ int iip;
+
+ /* Try to go right */
+ nnode = pnode->parent;
+- for (iip = pnode->iip + 1; iip < UBIFS_LPT_FANOUT; iip++) {
++ iip = pnode->iip + 1;
++ if (iip < UBIFS_LPT_FANOUT) {
++ /* We assume here that LEB zero is never an LPT LEB */
+ if (nnode->nbranch[iip].lnum)
+ return ubifs_get_pnode(c, nnode, iip);
+ }
+@@ -583,11 +583,8 @@
+ nnode = nnode->parent;
+ if (!nnode)
+ return NULL;
+- for (; iip < UBIFS_LPT_FANOUT; iip++) {
+- if (nnode->nbranch[iip].lnum)
+- break;
+- }
+- } while (iip >= UBIFS_LPT_FANOUT);
++ /* We assume here that LEB zero is never an LPT LEB */
++ } while (iip >= UBIFS_LPT_FANOUT || !nnode->nbranch[iip].lnum);
+
+ /* Go right */
+ nnode = ubifs_get_nnode(c, nnode, iip);
+@@ -596,29 +593,12 @@
+
+ /* Go down to level 1 */
+ while (nnode->level > 1) {
+- for (iip = 0; iip < UBIFS_LPT_FANOUT; iip++) {
+- if (nnode->nbranch[iip].lnum)
+- break;
+- }
+- if (iip >= UBIFS_LPT_FANOUT) {
+- /*
+- * Should not happen, but we need to keep going
+- * if it does.
+- */
+- iip = 0;
+- }
+- nnode = ubifs_get_nnode(c, nnode, iip);
++ nnode = ubifs_get_nnode(c, nnode, 0);
+ if (IS_ERR(nnode))
+ return (void *)nnode;
+ }
+
+- for (iip = 0; iip < UBIFS_LPT_FANOUT; iip++)
+- if (nnode->nbranch[iip].lnum)
+- break;
+- if (iip >= UBIFS_LPT_FANOUT)
+- /* Should not happen, but we need to keep going if it does */
+- iip = 0;
+- return ubifs_get_pnode(c, nnode, iip);
++ return ubifs_get_pnode(c, nnode, 0);
+ }
+
+ /**
+@@ -708,7 +688,7 @@
+ pnode = pnode_lookup(c, 0);
+ while (pnode) {
+ do_make_pnode_dirty(c, pnode);
+- pnode = next_pnode_to_dirty(c, pnode);
++ pnode = next_pnode(c, pnode);
+ if (IS_ERR(pnode))
+ return PTR_ERR(pnode);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ubifs/master.c linux-2.6.29-rc3.owrt/fs/ubifs/master.c
+--- linux-2.6.29.owrt/fs/ubifs/master.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ubifs/master.c 2009-05-10 23:48:29.000000000 +0200
+@@ -354,7 +354,7 @@
+ int err, lnum, offs, len;
+
+ if (c->ro_media)
+- return -EROFS;
++ return -EINVAL;
+
+ lnum = UBIFS_MST_LNUM;
+ offs = c->mst_offs + c->mst_node_alsz;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ubifs/orphan.c linux-2.6.29-rc3.owrt/fs/ubifs/orphan.c
+--- linux-2.6.29.owrt/fs/ubifs/orphan.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ubifs/orphan.c 2009-05-10 23:48:29.000000000 +0200
+@@ -46,7 +46,7 @@
+ * Orphans are accumulated in a rb-tree. When an inode's link count drops to
+ * zero, the inode number is added to the rb-tree. It is removed from the tree
+ * when the inode is deleted. Any new orphans that are in the orphan tree when
+- * the commit is run, are written to the orphan area in 1 or more orphan nodes.
++ * the commit is run, are written to the orphan area in 1 or more orph nodes.
+ * If the orphan area is full, it is consolidated to make space. There is
+ * always enough space because validation prevents the user from creating more
+ * than the maximum number of orphans allowed.
+@@ -231,7 +231,7 @@
+ }
+
+ /**
+- * do_write_orph_node - write a node to the orphan head.
++ * do_write_orph_node - write a node
+ * @c: UBIFS file-system description object
+ * @len: length of node
+ * @atomic: write atomically
+@@ -264,11 +264,11 @@
+ }
+
+ /**
+- * write_orph_node - write an orphan node.
++ * write_orph_node - write an orph node
+ * @c: UBIFS file-system description object
+ * @atomic: write atomically
+ *
+- * This function builds an orphan node from the cnext list and writes it to the
++ * This function builds an orph node from the cnext list and writes it to the
+ * orphan head. On success, %0 is returned, otherwise a negative error code
+ * is returned.
+ */
+@@ -326,11 +326,11 @@
+ }
+
+ /**
+- * write_orph_nodes - write orphan nodes until there are no more to commit.
++ * write_orph_nodes - write orph nodes until there are no more to commit
+ * @c: UBIFS file-system description object
+ * @atomic: write atomically
+ *
+- * This function writes orphan nodes for all the orphans to commit. On success,
++ * This function writes orph nodes for all the orphans to commit. On success,
+ * %0 is returned, otherwise a negative error code is returned.
+ */
+ static int write_orph_nodes(struct ubifs_info *c, int atomic)
+@@ -478,14 +478,14 @@
+ }
+
+ /**
+- * ubifs_clear_orphans - erase all LEBs used for orphans.
++ * clear_orphans - erase all LEBs used for orphans.
+ * @c: UBIFS file-system description object
+ *
+ * If recovery is not required, then the orphans from the previous session
+ * are not needed. This function locates the LEBs used to record
+ * orphans, and un-maps them.
+ */
+-int ubifs_clear_orphans(struct ubifs_info *c)
++static int clear_orphans(struct ubifs_info *c)
+ {
+ int lnum, err;
+
+@@ -547,9 +547,9 @@
+ * do_kill_orphans - remove orphan inodes from the index.
+ * @c: UBIFS file-system description object
+ * @sleb: scanned LEB
+- * @last_cmt_no: cmt_no of last orphan node read is passed and returned here
++ * @last_cmt_no: cmt_no of last orph node read is passed and returned here
+ * @outofdate: whether the LEB is out of date is returned here
+- * @last_flagged: whether the end orphan node is encountered
++ * @last_flagged: whether the end orph node is encountered
+ *
+ * This function is a helper to the 'kill_orphans()' function. It goes through
+ * every orphan node in a LEB and for every inode number recorded, removes
+@@ -580,8 +580,8 @@
+ /*
+ * The commit number on the master node may be less, because
+ * of a failed commit. If there are several failed commits in a
+- * row, the commit number written on orphan nodes will continue
+- * to increase (because the commit number is adjusted here) even
++ * row, the commit number written on orph nodes will continue to
++ * increase (because the commit number is adjusted here) even
+ * though the commit number on the master node stays the same
+ * because the master node has not been re-written.
+ */
+@@ -589,9 +589,9 @@
+ c->cmt_no = cmt_no;
+ if (cmt_no < *last_cmt_no && *last_flagged) {
+ /*
+- * The last orphan node had a higher commit number and
+- * was flagged as the last written for that commit
+- * number. That makes this orphan node, out of date.
++ * The last orph node had a higher commit number and was
++ * flagged as the last written for that commit number.
++ * That makes this orph node, out of date.
+ */
+ if (!first) {
+ ubifs_err("out of order commit number %llu in "
+@@ -658,10 +658,10 @@
+ /*
+ * Orph nodes always start at c->orph_first and are written to each
+ * successive LEB in turn. Generally unused LEBs will have been unmapped
+- * but may contain out of date orphan nodes if the unmap didn't go
+- * through. In addition, the last orphan node written for each commit is
++ * but may contain out of date orph nodes if the unmap didn't go
++ * through. In addition, the last orph node written for each commit is
+ * marked (top bit of orph->cmt_no is set to 1). It is possible that
+- * there are orphan nodes from the next commit (i.e. the commit did not
++ * there are orph nodes from the next commit (i.e. the commit did not
+ * complete successfully). In that case, no orphans will have been lost
+ * due to the way that orphans are written, and any orphans added will
+ * be valid orphans anyway and so can be deleted.
+@@ -718,7 +718,7 @@
+ if (unclean)
+ err = kill_orphans(c);
+ else if (!read_only)
+- err = ubifs_clear_orphans(c);
++ err = clear_orphans(c);
+
+ return err;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ubifs/super.c linux-2.6.29-rc3.owrt/fs/ubifs/super.c
+--- linux-2.6.29.owrt/fs/ubifs/super.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ubifs/super.c 2009-05-10 23:48:29.000000000 +0200
+@@ -397,7 +397,6 @@
+ buf->f_namelen = UBIFS_MAX_NLEN;
+ buf->f_fsid.val[0] = le32_to_cpu(uuid[0]) ^ le32_to_cpu(uuid[2]);
+ buf->f_fsid.val[1] = le32_to_cpu(uuid[1]) ^ le32_to_cpu(uuid[3]);
+- ubifs_assert(buf->f_bfree <= c->block_cnt);
+ return 0;
+ }
+
+@@ -433,24 +432,33 @@
+ int i, err;
+ struct ubifs_info *c = sb->s_fs_info;
+ struct writeback_control wbc = {
+- .sync_mode = WB_SYNC_ALL,
++ .sync_mode = wait ? WB_SYNC_ALL : WB_SYNC_NONE,
+ .range_start = 0,
+ .range_end = LLONG_MAX,
+ .nr_to_write = LONG_MAX,
+ };
+
+ /*
+- * Zero @wait is just an advisory thing to help the file system shove
+- * lots of data into the queues, and there will be the second
++ * Note by akpm about WB_SYNC_NONE used above: zero @wait is just an
++ * advisory thing to help the file system shove lots of data into the
++ * queues. If some gets missed then it'll be picked up on the second
+ * '->sync_fs()' call, with non-zero @wait.
+ */
+- if (!wait)
+- return 0;
+
+ if (sb->s_flags & MS_RDONLY)
+ return 0;
+
+ /*
++ * Synchronize write buffers, because 'ubifs_run_commit()' does not
++ * do this if it waits for an already running commit.
++ */
++ for (i = 0; i < c->jhead_cnt; i++) {
++ err = ubifs_wbuf_sync(&c->jheads[i].wbuf);
++ if (err)
++ return err;
++ }
++
++ /*
+ * VFS calls '->sync_fs()' before synchronizing all dirty inodes and
+ * pages, so synchronize them first, then commit the journal. Strictly
+ * speaking, it is not necessary to commit the journal here,
+@@ -461,16 +469,6 @@
+ */
+ generic_sync_sb_inodes(sb, &wbc);
+
+- /*
+- * Synchronize write buffers, because 'ubifs_run_commit()' does not
+- * do this if it waits for an already running commit.
+- */
+- for (i = 0; i < c->jhead_cnt; i++) {
+- err = ubifs_wbuf_sync(&c->jheads[i].wbuf);
+- if (err)
+- return err;
+- }
+-
+ err = ubifs_run_commit(c);
+ if (err)
+ return err;
+@@ -574,8 +572,15 @@
+ c->ranges[UBIFS_IDX_NODE].max_len = INT_MAX;
+
+ /*
+- * Initialize dead and dark LEB space watermarks. See gc.c for comments
+- * about these values.
++ * Initialize dead and dark LEB space watermarks.
++ *
++ * Dead space is the space which cannot be used. Its watermark is
++ * equivalent to min. I/O unit or minimum node size if it is greater
++ * then min. I/O unit.
++ *
++ * Dark space is the space which might be used, or might not, depending
++ * on which node should be written to the LEB. Its watermark is
++ * equivalent to maximum UBIFS node size.
+ */
+ c->dead_wm = ALIGN(MIN_WRITE_SZ, c->min_io_size);
+ c->dark_wm = ALIGN(UBIFS_MAX_NODE_SZ, c->min_io_size);
+@@ -736,12 +741,12 @@
+ * take_gc_lnum - reserve GC LEB.
+ * @c: UBIFS file-system description object
+ *
+- * This function ensures that the LEB reserved for garbage collection is marked
+- * as "taken" in lprops. We also have to set free space to LEB size and dirty
+- * space to zero, because lprops may contain out-of-date information if the
+- * file-system was un-mounted before it has been committed. This function
+- * returns zero in case of success and a negative error code in case of
+- * failure.
++ * This function ensures that the LEB reserved for garbage collection is
++ * unmapped and is marked as "taken" in lprops. We also have to set free space
++ * to LEB size and dirty space to zero, because lprops may contain out-of-date
++ * information if the file-system was un-mounted before it has been committed.
++ * This function returns zero in case of success and a negative error code in
++ * case of failure.
+ */
+ static int take_gc_lnum(struct ubifs_info *c)
+ {
+@@ -752,6 +757,10 @@
+ return -EINVAL;
+ }
+
++ err = ubifs_leb_unmap(c, c->gc_lnum);
++ if (err)
++ return err;
++
+ /* And we have to tell lprops that this LEB is taken */
+ err = ubifs_change_one_lp(c, c->gc_lnum, c->leb_size, 0,
+ LPROPS_TAKEN, 0, 0);
+@@ -957,16 +966,13 @@
+
+ token = match_token(p, tokens, args);
+ switch (token) {
+- /*
+- * %Opt_fast_unmount and %Opt_norm_unmount options are ignored.
+- * We accepte them in order to be backware-compatible. But this
+- * should be removed at some point.
+- */
+ case Opt_fast_unmount:
+ c->mount_opts.unmount_mode = 2;
++ c->fast_unmount = 1;
+ break;
+ case Opt_norm_unmount:
+ c->mount_opts.unmount_mode = 1;
++ c->fast_unmount = 0;
+ break;
+ case Opt_bulk_read:
+ c->mount_opts.bulk_read = 2;
+@@ -1088,7 +1094,12 @@
+ ubifs_err("insufficient free space to mount in read/write mode");
+ dbg_dump_budg(c);
+ dbg_dump_lprops(c);
+- return -ENOSPC;
++ /*
++ * We return %-EINVAL instead of %-ENOSPC because it seems to
++ * be the closest error code mentioned in the mount function
++ * documentation.
++ */
++ return -EINVAL;
+ }
+ return 0;
+ }
+@@ -1275,19 +1286,10 @@
+ if (err)
+ goto out_orphans;
+ err = ubifs_rcvry_gc_commit(c);
+- } else {
++ } else
+ err = take_gc_lnum(c);
+- if (err)
+- goto out_orphans;
+-
+- /*
+- * GC LEB may contain garbage if there was an unclean
+- * reboot, and it should be un-mapped.
+- */
+- err = ubifs_leb_unmap(c, c->gc_lnum);
+- if (err)
+- return err;
+- }
++ if (err)
++ goto out_orphans;
+
+ err = dbg_check_lprops(c);
+ if (err)
+@@ -1296,16 +1298,6 @@
+ err = ubifs_recover_size(c);
+ if (err)
+ goto out_orphans;
+- } else {
+- /*
+- * Even if we mount read-only, we have to set space in GC LEB
+- * to proper value because this affects UBIFS free space
+- * reporting. We do not want to have a situation when
+- * re-mounting from R/O to R/W changes amount of free space.
+- */
+- err = take_gc_lnum(c);
+- if (err)
+- goto out_orphans;
+ }
+
+ spin_lock(&ubifs_infos_lock);
+@@ -1318,17 +1310,14 @@
+ else {
+ c->need_recovery = 0;
+ ubifs_msg("recovery completed");
+- /* GC LEB has to be empty and taken at this point */
+- ubifs_assert(c->lst.taken_empty_lebs == 1);
+ }
+- } else
+- ubifs_assert(c->lst.taken_empty_lebs == 1);
++ }
+
+- err = dbg_check_filesystem(c);
++ err = dbg_debugfs_init_fs(c);
+ if (err)
+ goto out_infos;
+
+- err = dbg_debugfs_init_fs(c);
++ err = dbg_check_filesystem(c);
+ if (err)
+ goto out_infos;
+
+@@ -1362,6 +1351,7 @@
+ c->uuid[4], c->uuid[5], c->uuid[6], c->uuid[7],
+ c->uuid[8], c->uuid[9], c->uuid[10], c->uuid[11],
+ c->uuid[12], c->uuid[13], c->uuid[14], c->uuid[15]);
++ dbg_msg("fast unmount: %d", c->fast_unmount);
+ dbg_msg("big_lpt %d", c->big_lpt);
+ dbg_msg("log LEBs: %d (%d - %d)",
+ c->log_lebs, UBIFS_LOG_LNUM, c->log_last);
+@@ -1485,8 +1475,10 @@
+ {
+ int err, lnum;
+
++ if (c->ro_media)
++ return -EINVAL;
++
+ mutex_lock(&c->umount_mutex);
+- dbg_save_space_info(c);
+ c->remounting_rw = 1;
+ c->always_chk_crc = 1;
+
+@@ -1522,12 +1514,6 @@
+ err = ubifs_recover_inl_heads(c, c->sbuf);
+ if (err)
+ goto out;
+- } else {
+- /* A readonly mount is not allowed to have orphans */
+- ubifs_assert(c->tot_orphans == 0);
+- err = ubifs_clear_orphans(c);
+- if (err)
+- goto out;
+ }
+
+ if (!(c->mst_node->flags & cpu_to_le32(UBIFS_MST_DIRTY))) {
+@@ -1583,7 +1569,7 @@
+ if (c->need_recovery)
+ err = ubifs_rcvry_gc_commit(c);
+ else
+- err = ubifs_leb_unmap(c, c->gc_lnum);
++ err = take_gc_lnum(c);
+ if (err)
+ goto out;
+
+@@ -1596,9 +1582,8 @@
+ c->vfs_sb->s_flags &= ~MS_RDONLY;
+ c->remounting_rw = 0;
+ c->always_chk_crc = 0;
+- err = dbg_check_space_info(c);
+ mutex_unlock(&c->umount_mutex);
+- return err;
++ return 0;
+
+ out:
+ vfree(c->orph_buf);
+@@ -1618,18 +1603,43 @@
+ }
+
+ /**
++ * commit_on_unmount - commit the journal when un-mounting.
++ * @c: UBIFS file-system description object
++ *
++ * This function is called during un-mounting and re-mounting, and it commits
++ * the journal unless the "fast unmount" mode is enabled.
++ */
++static void commit_on_unmount(struct ubifs_info *c)
++{
++ struct super_block *sb = c->vfs_sb;
++ long long bud_bytes;
++
++ /*
++ * This function is called before the background thread is stopped, so
++ * we may race with ongoing commit, which means we have to take
++ * @c->bud_lock to access @c->bud_bytes.
++ */
++ spin_lock(&c->buds_lock);
++ bud_bytes = c->bud_bytes;
++ spin_unlock(&c->buds_lock);
++
++ if (!c->fast_unmount && !(sb->s_flags & MS_RDONLY) && bud_bytes)
++ ubifs_run_commit(c);
++}
++
++/**
+ * ubifs_remount_ro - re-mount in read-only mode.
+ * @c: UBIFS file-system description object
+ *
+- * We assume VFS has stopped writing. Possibly the background thread could be
+- * running a commit, however kthread_stop will wait in that case.
++ * We rely on VFS to have stopped writing. Possibly the background thread could
++ * be running a commit, however kthread_stop will wait in that case.
+ */
+ static void ubifs_remount_ro(struct ubifs_info *c)
+ {
+ int i, err;
+
+ ubifs_assert(!c->need_recovery);
+- ubifs_assert(!(c->vfs_sb->s_flags & MS_RDONLY));
++ commit_on_unmount(c);
+
+ mutex_lock(&c->umount_mutex);
+ if (c->bgt) {
+@@ -1637,29 +1647,27 @@
+ c->bgt = NULL;
+ }
+
+- dbg_save_space_info(c);
+-
+ for (i = 0; i < c->jhead_cnt; i++) {
+ ubifs_wbuf_sync(&c->jheads[i].wbuf);
+ del_timer_sync(&c->jheads[i].wbuf.timer);
+ }
+
+- c->mst_node->flags &= ~cpu_to_le32(UBIFS_MST_DIRTY);
+- c->mst_node->flags |= cpu_to_le32(UBIFS_MST_NO_ORPHS);
+- c->mst_node->gc_lnum = cpu_to_le32(c->gc_lnum);
+- err = ubifs_write_master(c);
+- if (err)
+- ubifs_ro_mode(c, err);
++ if (!c->ro_media) {
++ c->mst_node->flags &= ~cpu_to_le32(UBIFS_MST_DIRTY);
++ c->mst_node->flags |= cpu_to_le32(UBIFS_MST_NO_ORPHS);
++ c->mst_node->gc_lnum = cpu_to_le32(c->gc_lnum);
++ err = ubifs_write_master(c);
++ if (err)
++ ubifs_ro_mode(c, err);
++ }
+
++ ubifs_destroy_idx_gc(c);
+ free_wbufs(c);
+ vfree(c->orph_buf);
+ c->orph_buf = NULL;
+ vfree(c->ileb_buf);
+ c->ileb_buf = NULL;
+ ubifs_lpt_free(c, 1);
+- err = dbg_check_space_info(c);
+- if (err)
+- ubifs_ro_mode(c, err);
+ mutex_unlock(&c->umount_mutex);
+ }
+
+@@ -1752,20 +1760,11 @@
+ }
+
+ if ((sb->s_flags & MS_RDONLY) && !(*flags & MS_RDONLY)) {
+- if (c->ro_media) {
+- ubifs_msg("cannot re-mount due to prior errors");
+- return -EROFS;
+- }
+ err = ubifs_remount_rw(c);
+ if (err)
+ return err;
+- } else if (!(sb->s_flags & MS_RDONLY) && (*flags & MS_RDONLY)) {
+- if (c->ro_media) {
+- ubifs_msg("cannot re-mount due to prior errors");
+- return -EROFS;
+- }
++ } else if (!(sb->s_flags & MS_RDONLY) && (*flags & MS_RDONLY))
+ ubifs_remount_ro(c);
+- }
+
+ if (c->bulk_read == 1)
+ bu_init(c);
+@@ -1775,11 +1774,10 @@
+ c->bu.buf = NULL;
+ }
+
+- ubifs_assert(c->lst.taken_empty_lebs == 1);
+ return 0;
+ }
+
+-const struct super_operations ubifs_super_operations = {
++struct super_operations ubifs_super_operations = {
+ .alloc_inode = ubifs_alloc_inode,
+ .destroy_inode = ubifs_destroy_inode,
+ .put_super = ubifs_put_super,
+@@ -2046,6 +2044,15 @@
+
+ static void ubifs_kill_sb(struct super_block *sb)
+ {
++ struct ubifs_info *c = sb->s_fs_info;
++
++ /*
++ * We do 'commit_on_unmount()' here instead of 'ubifs_put_super()'
++ * in order to be outside BKL.
++ */
++ if (sb->s_root)
++ commit_on_unmount(c);
++ /* The un-mount routine is actually done in put_super() */
+ generic_shutdown_super(sb);
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ubifs/tnc.c linux-2.6.29-rc3.owrt/fs/ubifs/tnc.c
+--- linux-2.6.29.owrt/fs/ubifs/tnc.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ubifs/tnc.c 2009-05-10 23:48:29.000000000 +0200
+@@ -443,11 +443,6 @@
+ * This function performs that same function as ubifs_read_node except that
+ * it does not require that there is actually a node present and instead
+ * the return code indicates if a node was read.
+- *
+- * Note, this function does not check CRC of data nodes if @c->no_chk_data_crc
+- * is true (it is controlled by corresponding mount option). However, if
+- * @c->always_chk_crc is true, @c->no_chk_data_crc is ignored and CRC is always
+- * checked.
+ */
+ static int try_read_node(const struct ubifs_info *c, void *buf, int type,
+ int len, int lnum, int offs)
+@@ -475,8 +470,9 @@
+ if (node_len != len)
+ return 0;
+
+- if (type == UBIFS_DATA_NODE && !c->always_chk_crc && c->no_chk_data_crc)
+- return 1;
++ if (type == UBIFS_DATA_NODE && !c->always_chk_crc)
++ if (c->no_chk_data_crc)
++ return 0;
+
+ crc = crc32(UBIFS_CRC32_INIT, buf + 8, node_len - 8);
+ node_crc = le32_to_cpu(ch->crc);
+@@ -1510,7 +1506,7 @@
+ *
+ * Note, if the bulk-read buffer length (@bu->buf_len) is known, this function
+ * makes sure bulk-read nodes fit the buffer. Otherwise, this function prepares
+- * maximum possible amount of nodes for bulk-read.
++ * maxumum possible amount of nodes for bulk-read.
+ */
+ int ubifs_tnc_get_bu_keys(struct ubifs_info *c, struct bu_info *bu)
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ubifs/ubifs.h linux-2.6.29-rc3.owrt/fs/ubifs/ubifs.h
+--- linux-2.6.29.owrt/fs/ubifs/ubifs.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ubifs/ubifs.h 2009-05-10 23:48:29.000000000 +0200
+@@ -426,9 +426,9 @@
+ * LEB properties flags.
+ *
+ * LPROPS_UNCAT: not categorized
+- * LPROPS_DIRTY: dirty > free, dirty >= @c->dead_wm, not index
++ * LPROPS_DIRTY: dirty > 0, not index
+ * LPROPS_DIRTY_IDX: dirty + free > @c->min_idx_node_sze and index
+- * LPROPS_FREE: free > 0, dirty < @c->dead_wm, not empty, not index
++ * LPROPS_FREE: free > 0, not empty, not index
+ * LPROPS_HEAP_CNT: number of heaps used for storing categorized LEBs
+ * LPROPS_EMPTY: LEB is empty, not taken
+ * LPROPS_FREEABLE: free + dirty == leb_size, not index, not taken
+@@ -961,6 +961,7 @@
+ * @cs_lock: commit state lock
+ * @cmt_wq: wait queue to sleep on if the log is full and a commit is running
+ *
++ * @fast_unmount: do not run journal commit before un-mounting
+ * @big_lpt: flag that LPT is too big to write whole during commit
+ * @no_chk_data_crc: do not check CRCs when reading data nodes (except during
+ * recovery)
+@@ -1201,6 +1202,7 @@
+ spinlock_t cs_lock;
+ wait_queue_head_t cmt_wq;
+
++ unsigned int fast_unmount:1;
+ unsigned int big_lpt:1;
+ unsigned int no_chk_data_crc:1;
+ unsigned int bulk_read:1;
+@@ -1403,13 +1405,13 @@
+ extern spinlock_t ubifs_infos_lock;
+ extern atomic_long_t ubifs_clean_zn_cnt;
+ extern struct kmem_cache *ubifs_inode_slab;
+-extern const struct super_operations ubifs_super_operations;
+-extern const struct address_space_operations ubifs_file_address_operations;
+-extern const struct file_operations ubifs_file_operations;
+-extern const struct inode_operations ubifs_file_inode_operations;
+-extern const struct file_operations ubifs_dir_operations;
+-extern const struct inode_operations ubifs_dir_inode_operations;
+-extern const struct inode_operations ubifs_symlink_inode_operations;
++extern struct super_operations ubifs_super_operations;
++extern struct address_space_operations ubifs_file_address_operations;
++extern struct file_operations ubifs_file_operations;
++extern struct inode_operations ubifs_file_inode_operations;
++extern struct file_operations ubifs_dir_operations;
++extern struct inode_operations ubifs_dir_inode_operations;
++extern struct inode_operations ubifs_symlink_inode_operations;
+ extern struct backing_dev_info ubifs_backing_dev_info;
+ extern struct ubifs_compressor *ubifs_compressors[UBIFS_COMPR_TYPES_CNT];
+
+@@ -1426,7 +1428,7 @@
+ int ubifs_write_node(struct ubifs_info *c, void *node, int len, int lnum,
+ int offs, int dtype);
+ int ubifs_check_node(const struct ubifs_info *c, const void *buf, int lnum,
+- int offs, int quiet, int must_chk_crc);
++ int offs, int quiet, int chk_crc);
+ void ubifs_prepare_node(struct ubifs_info *c, void *buf, int len, int pad);
+ void ubifs_prep_grp_node(struct ubifs_info *c, void *node, int len, int last);
+ int ubifs_io_init(struct ubifs_info *c);
+@@ -1493,7 +1495,6 @@
+ void ubifs_cancel_ino_op(struct ubifs_info *c, struct inode *inode,
+ struct ubifs_budget_req *req);
+ long long ubifs_get_free_space(struct ubifs_info *c);
+-long long ubifs_get_free_space_nolock(struct ubifs_info *c);
+ int ubifs_calc_min_idx_lebs(struct ubifs_info *c);
+ void ubifs_convert_page_budget(struct ubifs_info *c);
+ long long ubifs_reported_space(const struct ubifs_info *c, long long free);
+@@ -1602,7 +1603,6 @@
+ int ubifs_orphan_start_commit(struct ubifs_info *c);
+ int ubifs_orphan_end_commit(struct ubifs_info *c);
+ int ubifs_mount_orphans(struct ubifs_info *c, int unclean, int read_only);
+-int ubifs_clear_orphans(struct ubifs_info *c);
+
+ /* lpt.c */
+ int ubifs_calc_lpt_geom(struct ubifs_info *c);
+@@ -1646,7 +1646,7 @@
+ const struct ubifs_lprops *lp,
+ int free, int dirty, int flags,
+ int idx_gc_cnt);
+-void ubifs_get_lp_stats(struct ubifs_info *c, struct ubifs_lp_stats *lst);
++void ubifs_get_lp_stats(struct ubifs_info *c, struct ubifs_lp_stats *stats);
+ void ubifs_add_to_cat(struct ubifs_info *c, struct ubifs_lprops *lprops,
+ int cat);
+ void ubifs_replace_cat(struct ubifs_info *c, struct ubifs_lprops *old_lprops,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/ufs/super.c linux-2.6.29-rc3.owrt/fs/ufs/super.c
+--- linux-2.6.29.owrt/fs/ufs/super.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/ufs/super.c 2009-05-10 23:48:29.000000000 +0200
+@@ -41,7 +41,7 @@
+ * Stefan Reinauer <stepan@home.culture.mipt.ru>
+ *
+ * Module usage counts added on 96/04/29 by
+- * Gertjan van Wingerde <gwingerde@gmail.com>
++ * Gertjan van Wingerde <gertjan@cs.vu.nl>
+ *
+ * Clean swab support on 19970406 by
+ * Francois-Rene Rideau <fare@tunes.org>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/xfs/linux-2.6/xfs_buf.c linux-2.6.29-rc3.owrt/fs/xfs/linux-2.6/xfs_buf.c
+--- linux-2.6.29.owrt/fs/xfs/linux-2.6/xfs_buf.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/xfs/linux-2.6/xfs_buf.c 2009-05-10 23:48:29.000000000 +0200
+@@ -34,12 +34,6 @@
+ #include <linux/backing-dev.h>
+ #include <linux/freezer.h>
+
+-#include "xfs_sb.h"
+-#include "xfs_inum.h"
+-#include "xfs_ag.h"
+-#include "xfs_dmapi.h"
+-#include "xfs_mount.h"
+-
+ static kmem_zone_t *xfs_buf_zone;
+ STATIC int xfsbufd(void *);
+ STATIC int xfsbufd_wakeup(int, gfp_t);
+@@ -172,75 +166,6 @@
+ }
+
+ /*
+- * Mapping of multi-page buffers into contiguous virtual space
+- */
+-
+-typedef struct a_list {
+- void *vm_addr;
+- struct a_list *next;
+-} a_list_t;
+-
+-static a_list_t *as_free_head;
+-static int as_list_len;
+-static DEFINE_SPINLOCK(as_lock);
+-
+-/*
+- * Try to batch vunmaps because they are costly.
+- */
+-STATIC void
+-free_address(
+- void *addr)
+-{
+- a_list_t *aentry;
+-
+-#ifdef CONFIG_XEN
+- /*
+- * Xen needs to be able to make sure it can get an exclusive
+- * RO mapping of pages it wants to turn into a pagetable. If
+- * a newly allocated page is also still being vmap()ed by xfs,
+- * it will cause pagetable construction to fail. This is a
+- * quick workaround to always eagerly unmap pages so that Xen
+- * is happy.
+- */
+- vunmap(addr);
+- return;
+-#endif
+-
+- aentry = kmalloc(sizeof(a_list_t), GFP_NOWAIT);
+- if (likely(aentry)) {
+- spin_lock(&as_lock);
+- aentry->next = as_free_head;
+- aentry->vm_addr = addr;
+- as_free_head = aentry;
+- as_list_len++;
+- spin_unlock(&as_lock);
+- } else {
+- vunmap(addr);
+- }
+-}
+-
+-STATIC void
+-purge_addresses(void)
+-{
+- a_list_t *aentry, *old;
+-
+- if (as_free_head == NULL)
+- return;
+-
+- spin_lock(&as_lock);
+- aentry = as_free_head;
+- as_free_head = NULL;
+- as_list_len = 0;
+- spin_unlock(&as_lock);
+-
+- while ((old = aentry) != NULL) {
+- vunmap(aentry->vm_addr);
+- aentry = aentry->next;
+- kfree(old);
+- }
+-}
+-
+-/*
+ * Internal xfs_buf_t object manipulation
+ */
+
+@@ -339,7 +264,7 @@
+ uint i;
+
+ if ((bp->b_flags & XBF_MAPPED) && (bp->b_page_count > 1))
+- free_address(bp->b_addr - bp->b_offset);
++ vm_unmap_ram(bp->b_addr - bp->b_offset, bp->b_page_count);
+
+ for (i = 0; i < bp->b_page_count; i++) {
+ struct page *page = bp->b_pages[i];
+@@ -461,10 +386,8 @@
+ bp->b_addr = page_address(bp->b_pages[0]) + bp->b_offset;
+ bp->b_flags |= XBF_MAPPED;
+ } else if (flags & XBF_MAPPED) {
+- if (as_list_len > 64)
+- purge_addresses();
+- bp->b_addr = vmap(bp->b_pages, bp->b_page_count,
+- VM_MAP, PAGE_KERNEL);
++ bp->b_addr = vm_map_ram(bp->b_pages, bp->b_page_count,
++ -1, PAGE_KERNEL);
+ if (unlikely(bp->b_addr == NULL))
+ return -ENOMEM;
+ bp->b_addr += bp->b_offset;
+@@ -1441,12 +1364,10 @@
+
+ void
+ xfs_free_buftarg(
+- struct xfs_mount *mp,
+- struct xfs_buftarg *btp)
++ xfs_buftarg_t *btp)
+ {
+ xfs_flush_buftarg(btp, 1);
+- if (mp->m_flags & XFS_MOUNT_BARRIER)
+- xfs_blkdev_issue_flush(btp);
++ xfs_blkdev_issue_flush(btp);
+ xfs_free_bufhash(btp);
+ iput(btp->bt_mapping->host);
+
+@@ -1751,8 +1672,6 @@
+ count++;
+ }
+
+- if (as_list_len > 0)
+- purge_addresses();
+ if (count)
+ blk_run_address_space(target->bt_mapping);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/xfs/linux-2.6/xfs_buf.h linux-2.6.29-rc3.owrt/fs/xfs/linux-2.6/xfs_buf.h
+--- linux-2.6.29.owrt/fs/xfs/linux-2.6/xfs_buf.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/xfs/linux-2.6/xfs_buf.h 2009-05-10 23:48:29.000000000 +0200
+@@ -413,7 +413,7 @@
+ * Handling of buftargs.
+ */
+ extern xfs_buftarg_t *xfs_alloc_buftarg(struct block_device *, int);
+-extern void xfs_free_buftarg(struct xfs_mount *, struct xfs_buftarg *);
++extern void xfs_free_buftarg(xfs_buftarg_t *);
+ extern void xfs_wait_buftarg(xfs_buftarg_t *);
+ extern int xfs_setsize_buftarg(xfs_buftarg_t *, unsigned int, unsigned int);
+ extern int xfs_flush_buftarg(xfs_buftarg_t *, int);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/xfs/linux-2.6/xfs_super.c linux-2.6.29-rc3.owrt/fs/xfs/linux-2.6/xfs_super.c
+--- linux-2.6.29.owrt/fs/xfs/linux-2.6/xfs_super.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/xfs/linux-2.6/xfs_super.c 2009-05-10 23:48:29.000000000 +0200
+@@ -734,15 +734,15 @@
+ {
+ if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) {
+ struct block_device *logdev = mp->m_logdev_targp->bt_bdev;
+- xfs_free_buftarg(mp, mp->m_logdev_targp);
++ xfs_free_buftarg(mp->m_logdev_targp);
+ xfs_blkdev_put(logdev);
+ }
+ if (mp->m_rtdev_targp) {
+ struct block_device *rtdev = mp->m_rtdev_targp->bt_bdev;
+- xfs_free_buftarg(mp, mp->m_rtdev_targp);
++ xfs_free_buftarg(mp->m_rtdev_targp);
+ xfs_blkdev_put(rtdev);
+ }
+- xfs_free_buftarg(mp, mp->m_ddev_targp);
++ xfs_free_buftarg(mp->m_ddev_targp);
+ }
+
+ /*
+@@ -811,9 +811,9 @@
+
+ out_free_rtdev_targ:
+ if (mp->m_rtdev_targp)
+- xfs_free_buftarg(mp, mp->m_rtdev_targp);
++ xfs_free_buftarg(mp->m_rtdev_targp);
+ out_free_ddev_targ:
+- xfs_free_buftarg(mp, mp->m_ddev_targp);
++ xfs_free_buftarg(mp->m_ddev_targp);
+ out_close_rtdev:
+ if (rtdev)
+ xfs_blkdev_put(rtdev);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/xfs/linux-2.6/xfs_sync.c linux-2.6.29-rc3.owrt/fs/xfs/linux-2.6/xfs_sync.c
+--- linux-2.6.29.owrt/fs/xfs/linux-2.6/xfs_sync.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/xfs/linux-2.6/xfs_sync.c 2009-05-10 23:48:29.000000000 +0200
+@@ -371,11 +371,7 @@
+ /* flush inodes and push all remaining buffers out to disk */
+ xfs_quiesce_fs(mp);
+
+- /*
+- * Just warn here till VFS can correctly support
+- * read-only remount without racing.
+- */
+- WARN_ON(atomic_read(&mp->m_active_trans) != 0);
++ ASSERT_ALWAYS(atomic_read(&mp->m_active_trans) == 0);
+
+ /* Push the superblock and write an unmount record */
+ error = xfs_log_sbcount(mp, 1);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/xfs/xfs_dfrag.c linux-2.6.29-rc3.owrt/fs/xfs/xfs_dfrag.c
+--- linux-2.6.29.owrt/fs/xfs/xfs_dfrag.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/xfs/xfs_dfrag.c 2009-05-10 23:48:29.000000000 +0200
+@@ -55,11 +55,17 @@
+ struct file *file, *target_file;
+ int error = 0;
+
++ sxp = kmem_alloc(sizeof(xfs_swapext_t), KM_MAYFAIL);
++ if (!sxp) {
++ error = XFS_ERROR(ENOMEM);
++ goto out;
++ }
++
+ /* Pull information for the target fd */
+ file = fget((int)sxp->sx_fdtarget);
+ if (!file) {
+ error = XFS_ERROR(EINVAL);
+- goto out;
++ goto out_free_sxp;
+ }
+
+ if (!(file->f_mode & FMODE_WRITE) || (file->f_flags & O_APPEND)) {
+@@ -103,6 +109,8 @@
+ fput(target_file);
+ out_put_file:
+ fput(file);
++ out_free_sxp:
++ kmem_free(sxp);
+ out:
+ return error;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/xfs/xfs_iget.c linux-2.6.29-rc3.owrt/fs/xfs/xfs_iget.c
+--- linux-2.6.29.owrt/fs/xfs/xfs_iget.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/xfs/xfs_iget.c 2009-05-10 23:48:29.000000000 +0200
+@@ -246,6 +246,9 @@
+ goto out_destroy;
+ }
+
++ if (lock_flags)
++ xfs_ilock(ip, lock_flags);
++
+ /*
+ * Preload the radix tree so we can insert safely under the
+ * write spinlock. Note that we cannot sleep inside the preload
+@@ -253,16 +256,7 @@
+ */
+ if (radix_tree_preload(GFP_KERNEL)) {
+ error = EAGAIN;
+- goto out_destroy;
+- }
+-
+- /*
+- * Because the inode hasn't been added to the radix-tree yet it can't
+- * be found by another thread, so we can do the non-sleeping lock here.
+- */
+- if (lock_flags) {
+- if (!xfs_ilock_nowait(ip, lock_flags))
+- BUG();
++ goto out_unlock;
+ }
+
+ mask = ~(((XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog)) - 1);
+@@ -290,6 +284,7 @@
+ out_preload_end:
+ write_unlock(&pag->pag_ici_lock);
+ radix_tree_preload_end();
++out_unlock:
+ if (lock_flags)
+ xfs_iunlock(ip, lock_flags);
+ out_destroy:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/fs/xfs/xfs_log_recover.c linux-2.6.29-rc3.owrt/fs/xfs/xfs_log_recover.c
+--- linux-2.6.29.owrt/fs/xfs/xfs_log_recover.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/fs/xfs/xfs_log_recover.c 2009-05-10 23:48:29.000000000 +0200
+@@ -70,21 +70,16 @@
+ xfs_buf_t *
+ xlog_get_bp(
+ xlog_t *log,
+- int nbblks)
++ int num_bblks)
+ {
+- if (nbblks <= 0 || nbblks > log->l_logBBsize) {
+- xlog_warn("XFS: Invalid block length (0x%x) given for buffer", nbblks);
+- XFS_ERROR_REPORT("xlog_get_bp(1)",
+- XFS_ERRLEVEL_HIGH, log->l_mp);
+- return NULL;
+- }
++ ASSERT(num_bblks > 0);
+
+ if (log->l_sectbb_log) {
+- if (nbblks > 1)
+- nbblks += XLOG_SECTOR_ROUNDUP_BBCOUNT(log, 1);
+- nbblks = XLOG_SECTOR_ROUNDUP_BBCOUNT(log, nbblks);
++ if (num_bblks > 1)
++ num_bblks += XLOG_SECTOR_ROUNDUP_BBCOUNT(log, 1);
++ num_bblks = XLOG_SECTOR_ROUNDUP_BBCOUNT(log, num_bblks);
+ }
+- return xfs_buf_get_noaddr(BBTOB(nbblks), log->l_mp->m_logdev_targp);
++ return xfs_buf_get_noaddr(BBTOB(num_bblks), log->l_mp->m_logdev_targp);
+ }
+
+ void
+@@ -107,13 +102,6 @@
+ {
+ int error;
+
+- if (nbblks <= 0 || nbblks > log->l_logBBsize) {
+- xlog_warn("XFS: Invalid block length (0x%x) given for buffer", nbblks);
+- XFS_ERROR_REPORT("xlog_bread(1)",
+- XFS_ERRLEVEL_HIGH, log->l_mp);
+- return EFSCORRUPTED;
+- }
+-
+ if (log->l_sectbb_log) {
+ blk_no = XLOG_SECTOR_ROUNDDOWN_BLKNO(log, blk_no);
+ nbblks = XLOG_SECTOR_ROUNDUP_BBCOUNT(log, nbblks);
+@@ -151,13 +139,6 @@
+ {
+ int error;
+
+- if (nbblks <= 0 || nbblks > log->l_logBBsize) {
+- xlog_warn("XFS: Invalid block length (0x%x) given for buffer", nbblks);
+- XFS_ERROR_REPORT("xlog_bwrite(1)",
+- XFS_ERRLEVEL_HIGH, log->l_mp);
+- return EFSCORRUPTED;
+- }
+-
+ if (log->l_sectbb_log) {
+ blk_no = XLOG_SECTOR_ROUNDDOWN_BLKNO(log, blk_no);
+ nbblks = XLOG_SECTOR_ROUNDUP_BBCOUNT(log, nbblks);
+@@ -1455,19 +1436,10 @@
+ item = item->ri_prev;
+
+ if (item->ri_total == 0) { /* first region to be added */
+- if (in_f->ilf_size == 0 ||
+- in_f->ilf_size > XLOG_MAX_REGIONS_IN_ITEM) {
+- xlog_warn(
+- "XFS: bad number of regions (%d) in inode log format",
+- in_f->ilf_size);
+- ASSERT(0);
+- return XFS_ERROR(EIO);
+- }
+-
+- item->ri_total = in_f->ilf_size;
+- item->ri_buf =
+- kmem_zalloc(item->ri_total * sizeof(xfs_log_iovec_t),
+- KM_SLEEP);
++ item->ri_total = in_f->ilf_size;
++ ASSERT(item->ri_total <= XLOG_MAX_REGIONS_IN_ITEM);
++ item->ri_buf = kmem_zalloc((item->ri_total *
++ sizeof(xfs_log_iovec_t)), KM_SLEEP);
+ }
+ ASSERT(item->ri_total > item->ri_cnt);
+ /* Description region is ri_buf[0] */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/acpi/pdc_intel.h linux-2.6.29-rc3.owrt/include/acpi/pdc_intel.h
+--- linux-2.6.29.owrt/include/acpi/pdc_intel.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/acpi/pdc_intel.h 2009-05-10 23:48:29.000000000 +0200
+@@ -14,7 +14,6 @@
+ #define ACPI_PDC_SMP_T_SWCOORD (0x0080)
+ #define ACPI_PDC_C_C1_FFH (0x0100)
+ #define ACPI_PDC_C_C2C3_FFH (0x0200)
+-#define ACPI_PDC_SMP_P_HWCOORD (0x0800)
+
+ #define ACPI_PDC_EST_CAPABILITY_SMP (ACPI_PDC_SMP_C1PT | \
+ ACPI_PDC_C_C1_HALT | \
+@@ -23,7 +22,6 @@
+ #define ACPI_PDC_EST_CAPABILITY_SWSMP (ACPI_PDC_SMP_C1PT | \
+ ACPI_PDC_C_C1_HALT | \
+ ACPI_PDC_SMP_P_SWCOORD | \
+- ACPI_PDC_SMP_P_HWCOORD | \
+ ACPI_PDC_P_FFH)
+
+ #define ACPI_PDC_C_CAPABILITY_SMP (ACPI_PDC_SMP_C2C3 | \
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/asm-frv/pgtable.h linux-2.6.29-rc3.owrt/include/asm-frv/pgtable.h
+--- linux-2.6.29.owrt/include/asm-frv/pgtable.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/asm-frv/pgtable.h 2009-05-10 23:48:29.000000000 +0200
+@@ -478,7 +478,7 @@
+ #define __swp_type(x) (((x).val >> 2) & 0x1f)
+ #define __swp_offset(x) ((x).val >> 8)
+ #define __swp_entry(type, offset) ((swp_entry_t) { ((type) << 2) | ((offset) << 8) })
+-#define __pte_to_swp_entry(_pte) ((swp_entry_t) { (_pte).pte })
++#define __pte_to_swp_entry(pte) ((swp_entry_t) { (pte).pte })
+ #define __swp_entry_to_pte(x) ((pte_t) { (x).val })
+
+ static inline int pte_file(pte_t pte)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/crypto/hash.h linux-2.6.29-rc3.owrt/include/crypto/hash.h
+--- linux-2.6.29.owrt/include/crypto/hash.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/crypto/hash.h 2009-05-10 23:48:29.000000000 +0200
+@@ -222,7 +222,7 @@
+
+ static inline void crypto_free_shash(struct crypto_shash *tfm)
+ {
+- crypto_destroy_tfm(tfm, crypto_shash_tfm(tfm));
++ crypto_free_tfm(crypto_shash_tfm(tfm));
+ }
+
+ static inline unsigned int crypto_shash_alignmask(
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/drm/drm_crtc.h linux-2.6.29-rc3.owrt/include/drm/drm_crtc.h
+--- linux-2.6.29.owrt/include/drm/drm_crtc.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/drm/drm_crtc.h 2009-05-10 23:48:29.000000000 +0200
+@@ -609,7 +609,7 @@
+ extern char *drm_get_dvi_i_select_name(int val);
+ extern char *drm_get_tv_subconnector_name(int val);
+ extern char *drm_get_tv_select_name(int val);
+-extern void drm_fb_release(struct drm_file *file_priv);
++extern void drm_fb_release(struct file *filp);
+ extern int drm_mode_group_init_legacy_group(struct drm_device *dev, struct drm_mode_group *group);
+ extern struct edid *drm_get_edid(struct drm_connector *connector,
+ struct i2c_adapter *adapter);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/drm/drm_crtc_helper.h linux-2.6.29-rc3.owrt/include/drm/drm_crtc_helper.h
+--- linux-2.6.29.owrt/include/drm/drm_crtc_helper.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/drm/drm_crtc_helper.h 2009-05-10 23:48:29.000000000 +0200
+@@ -54,13 +54,13 @@
+ struct drm_display_mode *mode,
+ struct drm_display_mode *adjusted_mode);
+ /* Actually set the mode */
+- int (*mode_set)(struct drm_crtc *crtc, struct drm_display_mode *mode,
+- struct drm_display_mode *adjusted_mode, int x, int y,
+- struct drm_framebuffer *old_fb);
++ void (*mode_set)(struct drm_crtc *crtc, struct drm_display_mode *mode,
++ struct drm_display_mode *adjusted_mode, int x, int y,
++ struct drm_framebuffer *old_fb);
+
+ /* Move the crtc on the current fb to the given position *optional* */
+- int (*mode_set_base)(struct drm_crtc *crtc, int x, int y,
+- struct drm_framebuffer *old_fb);
++ void (*mode_set_base)(struct drm_crtc *crtc, int x, int y,
++ struct drm_framebuffer *old_fb);
+ };
+
+ struct drm_encoder_helper_funcs {
+@@ -76,7 +76,6 @@
+ void (*mode_set)(struct drm_encoder *encoder,
+ struct drm_display_mode *mode,
+ struct drm_display_mode *adjusted_mode);
+- struct drm_crtc *(*get_crtc)(struct drm_encoder *encoder);
+ /* detect for DAC style encoders */
+ enum drm_connector_status (*detect)(struct drm_encoder *encoder,
+ struct drm_connector *connector);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/drm/drm_edid.h linux-2.6.29-rc3.owrt/include/drm/drm_edid.h
+--- linux-2.6.29.owrt/include/drm/drm_edid.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/drm/drm_edid.h 2009-05-10 23:48:29.000000000 +0200
+@@ -58,10 +58,10 @@
+ u8 hsync_pulse_width_lo;
+ u8 vsync_pulse_width_lo:4;
+ u8 vsync_offset_lo:4;
+- u8 vsync_pulse_width_hi:2;
+- u8 vsync_offset_hi:2;
+ u8 hsync_pulse_width_hi:2;
+ u8 hsync_offset_hi:2;
++ u8 vsync_pulse_width_hi:2;
++ u8 vsync_offset_hi:2;
+ u8 width_mm_lo;
+ u8 height_mm_lo;
+ u8 height_mm_hi:4;
+@@ -69,8 +69,8 @@
+ u8 hborder;
+ u8 vborder;
+ u8 unknown0:1;
+- u8 hsync_positive:1;
+ u8 vsync_positive:1;
++ u8 hsync_positive:1;
+ u8 separate_sync:2;
+ u8 stereo:1;
+ u8 unknown6:1;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/drm/drmP.h linux-2.6.29-rc3.owrt/include/drm/drmP.h
+--- linux-2.6.29.owrt/include/drm/drmP.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/drm/drmP.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1321,8 +1321,6 @@
+ struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev,
+ size_t size);
+ void drm_gem_object_handle_free(struct kref *kref);
+-void drm_gem_vm_open(struct vm_area_struct *vma);
+-void drm_gem_vm_close(struct vm_area_struct *vma);
+ int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
+
+ static inline void
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/drm/i915_drm.h linux-2.6.29-rc3.owrt/include/drm/i915_drm.h
+--- linux-2.6.29.owrt/include/drm/i915_drm.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/drm/i915_drm.h 2009-05-10 23:48:29.000000000 +0200
+@@ -261,7 +261,6 @@
+ #define I915_PARAM_LAST_DISPATCH 3
+ #define I915_PARAM_CHIPSET_ID 4
+ #define I915_PARAM_HAS_GEM 5
+-#define I915_PARAM_NUM_FENCES_AVAIL 6
+
+ typedef struct drm_i915_getparam {
+ int param;
+@@ -273,7 +272,6 @@
+ #define I915_SETPARAM_USE_MI_BATCHBUFFER_START 1
+ #define I915_SETPARAM_TEX_LRU_LOG_GRANULARITY 2
+ #define I915_SETPARAM_ALLOW_BATCHBUFFER 3
+-#define I915_SETPARAM_NUM_USED_FENCES 4
+
+ typedef struct drm_i915_setparam {
+ int param;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/aio_abi.h linux-2.6.29-rc3.owrt/include/linux/aio_abi.h
+--- linux-2.6.29.owrt/include/linux/aio_abi.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/aio_abi.h 2009-05-10 23:48:29.000000000 +0200
+@@ -27,7 +27,6 @@
+ #ifndef __LINUX__AIO_ABI_H
+ #define __LINUX__AIO_ABI_H
+
+-#include <linux/types.h>
+ #include <asm/byteorder.h>
+
+ typedef unsigned long aio_context_t;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/async.h linux-2.6.29-rc3.owrt/include/linux/async.h
+--- linux-2.6.29.owrt/include/linux/async.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/async.h 2009-05-10 23:48:29.000000000 +0200
+@@ -17,11 +17,9 @@
+ typedef void (async_func_ptr) (void *data, async_cookie_t cookie);
+
+ extern async_cookie_t async_schedule(async_func_ptr *ptr, void *data);
+-extern async_cookie_t async_schedule_domain(async_func_ptr *ptr, void *data,
+- struct list_head *list);
++extern async_cookie_t async_schedule_special(async_func_ptr *ptr, void *data, struct list_head *list);
+ extern void async_synchronize_full(void);
+-extern void async_synchronize_full_domain(struct list_head *list);
++extern void async_synchronize_full_special(struct list_head *list);
+ extern void async_synchronize_cookie(async_cookie_t cookie);
+-extern void async_synchronize_cookie_domain(async_cookie_t cookie,
+- struct list_head *list);
++extern void async_synchronize_cookie_special(async_cookie_t cookie, struct list_head *list);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/ata.h linux-2.6.29-rc3.owrt/include/linux/ata.h
+--- linux-2.6.29.owrt/include/linux/ata.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/ata.h 2009-05-10 23:48:29.000000000 +0200
+@@ -89,8 +89,6 @@
+ ATA_ID_DLF = 128,
+ ATA_ID_CSFO = 129,
+ ATA_ID_CFA_POWER = 160,
+- ATA_ID_CFA_KEY_MGMT = 162,
+- ATA_ID_CFA_MODES = 163,
+ ATA_ID_ROT_SPEED = 217,
+ ATA_ID_PIO4 = (1 << 1),
+
+@@ -733,17 +731,12 @@
+
+ static inline int ata_id_is_cfa(const u16 *id)
+ {
+- if (id[ATA_ID_CONFIG] == 0x848A) /* Traditional CF */
++ if (id[ATA_ID_CONFIG] == 0x848A) /* Standard CF */
+ return 1;
+- /*
+- * CF specs don't require specific value in the word 0 anymore and yet
+- * they forbid to report the ATA version in the word 80 and require the
+- * CFA feature set support to be indicated in the word 83 in this case.
+- * Unfortunately, some cards only follow either of this requirements,
+- * and while those that don't indicate CFA feature support need some
+- * sort of quirk list, it seems impractical for the ones that do...
+- */
+- if ((id[ATA_ID_COMMAND_SET_2] & 0xC004) == 0x4004)
++ /* Could be CF hiding as standard ATA */
++ if (ata_id_major_version(id) >= 3 &&
++ id[ATA_ID_COMMAND_SET_1] != 0xFFFF &&
++ (id[ATA_ID_COMMAND_SET_1] & (1 << 2)))
+ return 1;
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/atalk.h linux-2.6.29-rc3.owrt/include/linux/atalk.h
+--- linux-2.6.29.owrt/include/linux/atalk.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/atalk.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,6 @@
+ #ifndef __LINUX_ATALK_H__
+ #define __LINUX_ATALK_H__
+
+-#include <linux/types.h>
+ #include <asm/byteorder.h>
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/atmbr2684.h linux-2.6.29-rc3.owrt/include/linux/atmbr2684.h
+--- linux-2.6.29.owrt/include/linux/atmbr2684.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/atmbr2684.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,6 @@
+ #ifndef _LINUX_ATMBR2684_H
+ #define _LINUX_ATMBR2684_H
+
+-#include <linux/types.h>
+ #include <linux/atm.h>
+ #include <linux/if.h> /* For IFNAMSIZ */
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/auto_fs4.h linux-2.6.29-rc3.owrt/include/linux/auto_fs4.h
+--- linux-2.6.29.owrt/include/linux/auto_fs4.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/auto_fs4.h 2009-05-10 23:48:29.000000000 +0200
+@@ -12,7 +12,6 @@
+ #define _LINUX_AUTO_FS4_H
+
+ /* Include common v3 definitions */
+-#include <linux/types.h>
+ #include <linux/auto_fs.h>
+
+ /* autofs v4 definitions */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/bfs_fs.h linux-2.6.29-rc3.owrt/include/linux/bfs_fs.h
+--- linux-2.6.29.owrt/include/linux/bfs_fs.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/bfs_fs.h 2009-05-10 23:48:29.000000000 +0200
+@@ -6,8 +6,6 @@
+ #ifndef _LINUX_BFS_FS_H
+ #define _LINUX_BFS_FS_H
+
+-#include <linux/types.h>
+-
+ #define BFS_BSIZE_BITS 9
+ #define BFS_BSIZE (1<<BFS_BSIZE_BITS)
+
+@@ -19,6 +17,7 @@
+ #define BFS_VDIR 2L
+ #define BFS_VREG 1L
+
++
+ /* BFS inode layout on disk */
+ struct bfs_inode {
+ __le16 i_ino;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/bio.h linux-2.6.29-rc3.owrt/include/linux/bio.h
+--- linux-2.6.29.owrt/include/linux/bio.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/bio.h 2009-05-10 23:48:29.000000000 +0200
+@@ -144,7 +144,7 @@
+ * bit 1 -- rw-ahead when set
+ * bit 2 -- barrier
+ * Insert a serialization point in the IO queue, forcing previously
+- * submitted IO to be completed before this one is issued.
++ * submitted IO to be completed before this oen is issued.
+ * bit 3 -- synchronous I/O hint: the block layer will unplug immediately
+ * Note that this does NOT indicate that the IO itself is sync, just
+ * that the block layer will not postpone issue of this IO by plugging.
+@@ -163,31 +163,12 @@
+ #define BIO_RW 0 /* Must match RW in req flags (blkdev.h) */
+ #define BIO_RW_AHEAD 1 /* Must match FAILFAST in req flags */
+ #define BIO_RW_BARRIER 2
+-#define BIO_RW_SYNCIO 3
+-#define BIO_RW_UNPLUG 4
+-#define BIO_RW_META 5
+-#define BIO_RW_DISCARD 6
+-#define BIO_RW_FAILFAST_DEV 7
+-#define BIO_RW_FAILFAST_TRANSPORT 8
+-#define BIO_RW_FAILFAST_DRIVER 9
+-
+-#define bio_rw_flagged(bio, flag) ((bio)->bi_rw & (1 << (flag)))
+-
+-/*
+- * Old defines, these should eventually be replaced by direct usage of
+- * bio_rw_flagged()
+- */
+-#define bio_barrier(bio) bio_rw_flagged(bio, BIO_RW_BARRIER)
+-#define bio_sync(bio) bio_rw_flagged(bio, BIO_RW_SYNCIO)
+-#define bio_unplug(bio) bio_rw_flagged(bio, BIO_RW_UNPLUG)
+-#define bio_failfast_dev(bio) bio_rw_flagged(bio, BIO_RW_FAILFAST_DEV)
+-#define bio_failfast_transport(bio) \
+- bio_rw_flagged(bio, BIO_RW_FAILFAST_TRANSPORT)
+-#define bio_failfast_driver(bio) \
+- bio_rw_flagged(bio, BIO_RW_FAILFAST_DRIVER)
+-#define bio_rw_ahead(bio) bio_rw_flagged(bio, BIO_RW_AHEAD)
+-#define bio_rw_meta(bio) bio_rw_flagged(bio, BIO_RW_META)
+-#define bio_discard(bio) bio_rw_flagged(bio, BIO_RW_DISCARD)
++#define BIO_RW_SYNC 3
++#define BIO_RW_META 4
++#define BIO_RW_DISCARD 5
++#define BIO_RW_FAILFAST_DEV 6
++#define BIO_RW_FAILFAST_TRANSPORT 7
++#define BIO_RW_FAILFAST_DRIVER 8
+
+ /*
+ * upper 16 bits of bi_rw define the io priority of this bio
+@@ -212,6 +193,15 @@
+ #define bio_offset(bio) bio_iovec((bio))->bv_offset
+ #define bio_segments(bio) ((bio)->bi_vcnt - (bio)->bi_idx)
+ #define bio_sectors(bio) ((bio)->bi_size >> 9)
++#define bio_barrier(bio) ((bio)->bi_rw & (1 << BIO_RW_BARRIER))
++#define bio_sync(bio) ((bio)->bi_rw & (1 << BIO_RW_SYNC))
++#define bio_failfast_dev(bio) ((bio)->bi_rw & (1 << BIO_RW_FAILFAST_DEV))
++#define bio_failfast_transport(bio) \
++ ((bio)->bi_rw & (1 << BIO_RW_FAILFAST_TRANSPORT))
++#define bio_failfast_driver(bio) ((bio)->bi_rw & (1 << BIO_RW_FAILFAST_DRIVER))
++#define bio_rw_ahead(bio) ((bio)->bi_rw & (1 << BIO_RW_AHEAD))
++#define bio_rw_meta(bio) ((bio)->bi_rw & (1 << BIO_RW_META))
++#define bio_discard(bio) ((bio)->bi_rw & (1 << BIO_RW_DISCARD))
+ #define bio_empty_barrier(bio) (bio_barrier(bio) && !bio_has_data(bio) && !bio_discard(bio))
+
+ static inline unsigned int bio_cur_sectors(struct bio *bio)
+@@ -322,6 +312,7 @@
+ void *bip_buf; /* generated integrity data */
+ bio_end_io_t *bip_end_io; /* saved I/O completion fn */
+
++ int bip_error; /* saved I/O error */
+ unsigned int bip_size;
+
+ unsigned short bip_pool; /* pool the ivec came from */
+@@ -449,13 +440,12 @@
+
+ #ifdef CONFIG_HIGHMEM
+ /*
+- * remember never ever reenable interrupts between a bvec_kmap_irq and
+- * bvec_kunmap_irq!
++ * remember to add offset! and never ever reenable interrupts between a
++ * bvec_kmap_irq and bvec_kunmap_irq!!
+ *
+ * This function MUST be inlined - it plays with the CPU interrupt flags.
+ */
+-static __always_inline char *bvec_kmap_irq(struct bio_vec *bvec,
+- unsigned long *flags)
++static inline char *bvec_kmap_irq(struct bio_vec *bvec, unsigned long *flags)
+ {
+ unsigned long addr;
+
+@@ -471,8 +461,7 @@
+ return (char *) addr + bvec->bv_offset;
+ }
+
+-static __always_inline void bvec_kunmap_irq(char *buffer,
+- unsigned long *flags)
++static inline void bvec_kunmap_irq(char *buffer, unsigned long *flags)
+ {
+ unsigned long ptr = (unsigned long) buffer & PAGE_MASK;
+
+@@ -531,7 +520,7 @@
+ extern void bio_integrity_advance(struct bio *, unsigned int);
+ extern void bio_integrity_trim(struct bio *, unsigned int, unsigned int);
+ extern void bio_integrity_split(struct bio *, struct bio_pair *, int);
+-extern int bio_integrity_clone(struct bio *, struct bio *, gfp_t, struct bio_set *);
++extern int bio_integrity_clone(struct bio *, struct bio *, struct bio_set *);
+ extern int bioset_integrity_create(struct bio_set *, int);
+ extern void bioset_integrity_free(struct bio_set *);
+ extern void bio_integrity_init_slab(void);
+@@ -542,7 +531,7 @@
+ #define bioset_integrity_create(a, b) (0)
+ #define bio_integrity_prep(a) (0)
+ #define bio_integrity_enabled(a) (0)
+-#define bio_integrity_clone(a, b, c,d ) (0)
++#define bio_integrity_clone(a, b, c) (0)
+ #define bioset_integrity_free(a) do { } while (0)
+ #define bio_integrity_free(a, b) do { } while (0)
+ #define bio_integrity_endio(a, b) do { } while (0)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/blkdev.h linux-2.6.29-rc3.owrt/include/linux/blkdev.h
+--- linux-2.6.29.owrt/include/linux/blkdev.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/blkdev.h 2009-05-10 23:48:29.000000000 +0200
+@@ -108,7 +108,6 @@
+ __REQ_RW_META, /* metadata io request */
+ __REQ_COPY_USER, /* contains copies of user pages */
+ __REQ_INTEGRITY, /* integrity metadata has been remapped */
+- __REQ_UNPLUG, /* unplug queue on submission */
+ __REQ_NR_BITS, /* stops here */
+ };
+
+@@ -135,7 +134,6 @@
+ #define REQ_RW_META (1 << __REQ_RW_META)
+ #define REQ_COPY_USER (1 << __REQ_COPY_USER)
+ #define REQ_INTEGRITY (1 << __REQ_INTEGRITY)
+-#define REQ_UNPLUG (1 << __REQ_UNPLUG)
+
+ #define BLK_MAX_CDB 16
+
+@@ -451,11 +449,6 @@
+ #define QUEUE_FLAG_STACKABLE 13 /* supports request stacking */
+ #define QUEUE_FLAG_NONROT 14 /* non-rotational device (SSD) */
+ #define QUEUE_FLAG_VIRT QUEUE_FLAG_NONROT /* paravirt device */
+-#define QUEUE_FLAG_IO_STAT 15 /* do IO stats */
+-
+-#define QUEUE_FLAG_DEFAULT ((1 << QUEUE_FLAG_IO_STAT) | \
+- (1 << QUEUE_FLAG_CLUSTER) | \
+- (1 << QUEUE_FLAG_STACKABLE))
+
+ static inline int queue_is_locked(struct request_queue *q)
+ {
+@@ -572,7 +565,6 @@
+ #define blk_queue_stopped(q) test_bit(QUEUE_FLAG_STOPPED, &(q)->queue_flags)
+ #define blk_queue_nomerges(q) test_bit(QUEUE_FLAG_NOMERGES, &(q)->queue_flags)
+ #define blk_queue_nonrot(q) test_bit(QUEUE_FLAG_NONROT, &(q)->queue_flags)
+-#define blk_queue_io_stat(q) test_bit(QUEUE_FLAG_IO_STAT, &(q)->queue_flags)
+ #define blk_queue_flushing(q) ((q)->ordseq)
+ #define blk_queue_stackable(q) \
+ test_bit(QUEUE_FLAG_STACKABLE, &(q)->queue_flags)
+@@ -708,8 +700,6 @@
+ };
+
+ /* This should not be used directly - use rq_for_each_segment */
+-#define for_each_bio(_bio) \
+- for (; _bio; _bio = _bio->bi_next)
+ #define __rq_for_each_bio(_bio, rq) \
+ if ((rq->bio)) \
+ for (_bio = (rq)->bio; _bio; _bio = _bio->bi_next)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/blktrace_api.h linux-2.6.29-rc3.owrt/include/linux/blktrace_api.h
+--- linux-2.6.29.owrt/include/linux/blktrace_api.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/blktrace_api.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,6 @@
+ #ifndef BLKTRACE_H
+ #define BLKTRACE_H
+
+-#include <linux/types.h>
+ #ifdef __KERNEL__
+ #include <linux/blkdev.h>
+ #include <linux/relay.h>
+@@ -15,7 +14,6 @@
+ BLK_TC_WRITE = 1 << 1, /* writes */
+ BLK_TC_BARRIER = 1 << 2, /* barrier */
+ BLK_TC_SYNC = 1 << 3, /* sync IO */
+- BLK_TC_SYNCIO = BLK_TC_SYNC,
+ BLK_TC_QUEUE = 1 << 4, /* queueing/merging */
+ BLK_TC_REQUEUE = 1 << 5, /* requeueing */
+ BLK_TC_ISSUE = 1 << 6, /* issue */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/can/bcm.h linux-2.6.29-rc3.owrt/include/linux/can/bcm.h
+--- linux-2.6.29.owrt/include/linux/can/bcm.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/can/bcm.h 2009-05-10 23:48:29.000000000 +0200
+@@ -14,8 +14,6 @@
+ #ifndef CAN_BCM_H
+ #define CAN_BCM_H
+
+-#include <linux/types.h>
+-
+ /**
+ * struct bcm_msg_head - head of messages to/from the broadcast manager
+ * @opcode: opcode, see enum below.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/capability.h linux-2.6.29-rc3.owrt/include/linux/capability.h
+--- linux-2.6.29.owrt/include/linux/capability.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/capability.h 2009-05-10 23:48:29.000000000 +0200
+@@ -69,6 +69,10 @@
+ #define VFS_CAP_U32 VFS_CAP_U32_2
+ #define VFS_CAP_REVISION VFS_CAP_REVISION_2
+
++#ifdef CONFIG_SECURITY_FILE_CAPABILITIES
++extern int file_caps_enabled;
++#endif
++
+ struct vfs_cap_data {
+ __le32 magic_etc; /* Little endian */
+ struct {
+@@ -92,10 +96,6 @@
+ #define _KERNEL_CAPABILITY_VERSION _LINUX_CAPABILITY_VERSION_3
+ #define _KERNEL_CAPABILITY_U32S _LINUX_CAPABILITY_U32S_3
+
+-#ifdef CONFIG_SECURITY_FILE_CAPABILITIES
+-extern int file_caps_enabled;
+-#endif
+-
+ typedef struct kernel_cap_struct {
+ __u32 cap[_KERNEL_CAPABILITY_U32S];
+ } kernel_cap_t;
+@@ -393,10 +393,8 @@
+ # define CAP_FULL_SET ((kernel_cap_t){{ ~0, ~0 }})
+ # define CAP_INIT_EFF_SET ((kernel_cap_t){{ ~CAP_TO_MASK(CAP_SETPCAP), ~0 }})
+ # define CAP_FS_SET ((kernel_cap_t){{ CAP_FS_MASK_B0, CAP_FS_MASK_B1 } })
+-# define CAP_NFSD_SET ((kernel_cap_t){{ CAP_FS_MASK_B0 \
+- | CAP_TO_MASK(CAP_SYS_RESOURCE) \
+- | CAP_TO_MASK(CAP_MKNOD), \
+- CAP_FS_MASK_B1 } })
++# define CAP_NFSD_SET ((kernel_cap_t){{ CAP_FS_MASK_B0|CAP_TO_MASK(CAP_SYS_RESOURCE), \
++ CAP_FS_MASK_B1 } })
+
+ #endif /* _KERNEL_CAPABILITY_U32S != 2 */
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/cdrom.h linux-2.6.29-rc3.owrt/include/linux/cdrom.h
+--- linux-2.6.29.owrt/include/linux/cdrom.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/cdrom.h 2009-05-10 23:48:29.000000000 +0200
+@@ -11,7 +11,6 @@
+ #ifndef _LINUX_CDROM_H
+ #define _LINUX_CDROM_H
+
+-#include <linux/types.h>
+ #include <asm/byteorder.h>
+
+ /*******************************************************
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/cgroup.h linux-2.6.29-rc3.owrt/include/linux/cgroup.h
+--- linux-2.6.29.owrt/include/linux/cgroup.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/cgroup.h 2009-05-10 23:48:29.000000000 +0200
+@@ -99,7 +99,6 @@
+ while (!atomic_inc_not_zero(&css->refcnt)) {
+ if (test_bit(CSS_REMOVED, &css->flags))
+ return false;
+- cpu_relax();
+ }
+ return true;
+ }
+@@ -378,7 +377,6 @@
+ * - initiating hotplug events
+ */
+ struct mutex hierarchy_mutex;
+- struct lock_class_key subsys_key;
+
+ /*
+ * Link to parent, and list entry in parent's children.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/cgroupstats.h linux-2.6.29-rc3.owrt/include/linux/cgroupstats.h
+--- linux-2.6.29.owrt/include/linux/cgroupstats.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/cgroupstats.h 2009-05-10 23:48:29.000000000 +0200
+@@ -15,7 +15,6 @@
+ #ifndef _LINUX_CGROUPSTATS_H
+ #define _LINUX_CGROUPSTATS_H
+
+-#include <linux/types.h>
+ #include <linux/taskstats.h>
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/clockchips.h linux-2.6.29-rc3.owrt/include/linux/clockchips.h
+--- linux-2.6.29.owrt/include/linux/clockchips.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/clockchips.h 2009-05-10 23:48:29.000000000 +0200
+@@ -36,7 +36,6 @@
+ CLOCK_EVT_NOTIFY_BROADCAST_EXIT,
+ CLOCK_EVT_NOTIFY_SUSPEND,
+ CLOCK_EVT_NOTIFY_RESUME,
+- CLOCK_EVT_NOTIFY_CPU_DYING,
+ CLOCK_EVT_NOTIFY_CPU_DEAD,
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/compiler-gcc.h linux-2.6.29-rc3.owrt/include/linux/compiler-gcc.h
+--- linux-2.6.29.owrt/include/linux/compiler-gcc.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/compiler-gcc.h 2009-05-10 23:48:29.000000000 +0200
+@@ -52,15 +52,7 @@
+ #define __deprecated __attribute__((deprecated))
+ #define __packed __attribute__((packed))
+ #define __weak __attribute__((weak))
+-
+-/*
+- * it doesn't make sense on ARM (currently the only user of __naked) to trace
+- * naked functions because then mcount is called without stack and frame pointer
+- * being set up and there is no chance to restore the lr register to the value
+- * before mcount was called.
+- */
+-#define __naked __attribute__((naked)) notrace
+-
++#define __naked __attribute__((naked))
+ #define __noreturn __attribute__((noreturn))
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/cpufreq.h linux-2.6.29-rc3.owrt/include/linux/cpufreq.h
+--- linux-2.6.29.owrt/include/linux/cpufreq.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/cpufreq.h 2009-05-10 23:48:29.000000000 +0200
+@@ -234,6 +234,7 @@
+ int (*suspend) (struct cpufreq_policy *policy, pm_message_t pmsg);
+ int (*resume) (struct cpufreq_policy *policy);
+ struct freq_attr **attr;
++ bool hide_interface;
+ };
+
+ /* flags */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/crypto.h linux-2.6.29-rc3.owrt/include/linux/crypto.h
+--- linux-2.6.29.owrt/include/linux/crypto.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/crypto.h 2009-05-10 23:48:29.000000000 +0200
+@@ -552,12 +552,7 @@
+ const struct crypto_type *frontend,
+ u32 type, u32 mask);
+ struct crypto_tfm *crypto_alloc_base(const char *alg_name, u32 type, u32 mask);
+-void crypto_destroy_tfm(void *mem, struct crypto_tfm *tfm);
+-
+-static inline void crypto_free_tfm(struct crypto_tfm *tfm)
+-{
+- return crypto_destroy_tfm(tfm, tfm);
+-}
++void crypto_free_tfm(struct crypto_tfm *tfm);
+
+ int alg_test(const char *driver, const char *alg, u32 type, u32 mask);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/dca.h linux-2.6.29-rc3.owrt/include/linux/dca.h
+--- linux-2.6.29.owrt/include/linux/dca.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/dca.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,23 +1,3 @@
+-/*
+- * Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved.
+- *
+- * This program is free software; you can redistribute it and/or modify it
+- * under the terms of the GNU General Public License as published by the Free
+- * Software Foundation; either version 2 of the License, or (at your option)
+- * any later version.
+- *
+- * This program is distributed in the hope that it will be useful, but WITHOUT
+- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+- * more details.
+- *
+- * You should have received a copy of the GNU General Public License along with
+- * this program; if not, write to the Free Software Foundation, Inc., 59
+- * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+- *
+- * The full GNU General Public License is included in this distribution in the
+- * file called COPYING.
+- */
+ #ifndef DCA_H
+ #define DCA_H
+ /* DCA Provider API */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/dcbnl.h linux-2.6.29-rc3.owrt/include/linux/dcbnl.h
+--- linux-2.6.29.owrt/include/linux/dcbnl.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/dcbnl.h 2009-05-10 23:48:29.000000000 +0200
+@@ -20,12 +20,10 @@
+ #ifndef __LINUX_DCBNL_H__
+ #define __LINUX_DCBNL_H__
+
+-#include <linux/types.h>
+-
+ #define DCB_PROTO_VERSION 1
+
+ struct dcbmsg {
+- __u8 dcb_family;
++ unsigned char dcb_family;
+ __u8 cmd;
+ __u16 dcb_pad;
+ };
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/device.h linux-2.6.29-rc3.owrt/include/linux/device.h
+--- linux-2.6.29.owrt/include/linux/device.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/device.h 2009-05-10 23:48:29.000000000 +0200
+@@ -147,8 +147,6 @@
+ extern struct device_driver *driver_find(const char *name,
+ struct bus_type *bus);
+ extern int driver_probe_done(void);
+-extern int wait_for_device_probe(void);
+-
+
+ /* sysfs interface for exporting driver attributes */
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/dlm_plock.h linux-2.6.29-rc3.owrt/include/linux/dlm_plock.h
+--- linux-2.6.29.owrt/include/linux/dlm_plock.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/dlm_plock.h 2009-05-10 23:48:29.000000000 +0200
+@@ -9,8 +9,6 @@
+ #ifndef __DLM_PLOCK_DOT_H__
+ #define __DLM_PLOCK_DOT_H__
+
+-#include <linux/types.h>
+-
+ #define DLM_PLOCK_MISC_NAME "dlm_plock"
+
+ #define DLM_PLOCK_VERSION_MAJOR 1
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/dmaengine.h linux-2.6.29-rc3.owrt/include/linux/dmaengine.h
+--- linux-2.6.29.owrt/include/linux/dmaengine.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/dmaengine.h 2009-05-10 23:48:29.000000000 +0200
+@@ -97,6 +97,7 @@
+
+ /**
+ * struct dma_chan_percpu - the per-CPU part of struct dma_chan
++ * @refcount: local_t used for open-coded "bigref" counting
+ * @memcpy_count: transaction counter
+ * @bytes_transferred: byte counter
+ */
+@@ -113,11 +114,13 @@
+ * @cookie: last cookie value returned to client
+ * @chan_id: channel ID for sysfs
+ * @dev: class device for sysfs
++ * @refcount: kref, used in "bigref" slow-mode
++ * @slow_ref: indicates that the DMA channel is free
++ * @rcu: the DMA channel's RCU head
+ * @device_node: used to add this to the device chan list
+ * @local: per-cpu pointer to a struct dma_chan_percpu
+ * @client-count: how many clients are using this channel
+ * @table_count: number of appearances in the mem-to-mem allocation table
+- * @private: private data for certain client-channel associations
+ */
+ struct dma_chan {
+ struct dma_device *device;
+@@ -131,7 +134,6 @@
+ struct dma_chan_percpu *local;
+ int client_count;
+ int table_count;
+- void *private;
+ };
+
+ /**
+@@ -209,6 +211,8 @@
+ * @global_node: list_head for global dma_device_list
+ * @cap_mask: one or more dma_capability flags
+ * @max_xor: maximum number of xor sources, 0 if no capability
++ * @refcount: reference count
++ * @done: IO completion struct
+ * @dev_id: unique device ID
+ * @dev: struct device reference for dma mapping api
+ * @device_alloc_chan_resources: allocate resources and return the
+@@ -221,7 +225,6 @@
+ * @device_prep_dma_interrupt: prepares an end of chain interrupt operation
+ * @device_prep_slave_sg: prepares a slave dma operation
+ * @device_terminate_all: terminate all pending operations
+- * @device_is_tx_complete: poll for transaction completion
+ * @device_issue_pending: push pending transactions to hardware
+ */
+ struct dma_device {
+@@ -279,18 +282,6 @@
+ }
+ #endif
+
+-#ifdef CONFIG_NET_DMA
+-#define net_dmaengine_get() dmaengine_get()
+-#define net_dmaengine_put() dmaengine_put()
+-#else
+-static inline void net_dmaengine_get(void)
+-{
+-}
+-static inline void net_dmaengine_put(void)
+-{
+-}
+-#endif
+-
+ dma_cookie_t dma_async_memcpy_buf_to_buf(struct dma_chan *chan,
+ void *dest, void *src, size_t len);
+ dma_cookie_t dma_async_memcpy_buf_to_pg(struct dma_chan *chan,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/dn.h linux-2.6.29-rc3.owrt/include/linux/dn.h
+--- linux-2.6.29.owrt/include/linux/dn.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/dn.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,8 +1,6 @@
+ #ifndef _LINUX_DN_H
+ #define _LINUX_DN_H
+
+-#include <linux/types.h>
+-
+ /*
+
+ DECnet Data Structures and Constants
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/dvb/audio.h linux-2.6.29-rc3.owrt/include/linux/dvb/audio.h
+--- linux-2.6.29.owrt/include/linux/dvb/audio.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/dvb/audio.h 2009-05-10 23:48:29.000000000 +0200
+@@ -24,7 +24,12 @@
+ #ifndef _DVBAUDIO_H_
+ #define _DVBAUDIO_H_
+
++#ifdef __KERNEL__
+ #include <linux/types.h>
++#else
++#include <stdint.h>
++#endif
++
+
+ typedef enum {
+ AUDIO_SOURCE_DEMUX, /* Select the demux as the main source */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/dvb/dmx.h linux-2.6.29-rc3.owrt/include/linux/dvb/dmx.h
+--- linux-2.6.29.owrt/include/linux/dvb/dmx.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/dvb/dmx.h 2009-05-10 23:48:29.000000000 +0200
+@@ -24,7 +24,7 @@
+ #ifndef _DVBDMX_H_
+ #define _DVBDMX_H_
+
+-#include <linux/types.h>
++#include <asm/types.h>
+ #ifdef __KERNEL__
+ #include <linux/time.h>
+ #else
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/dvb/frontend.h linux-2.6.29-rc3.owrt/include/linux/dvb/frontend.h
+--- linux-2.6.29.owrt/include/linux/dvb/frontend.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/dvb/frontend.h 2009-05-10 23:48:29.000000000 +0200
+@@ -26,7 +26,8 @@
+ #ifndef _DVBFRONTEND_H_
+ #define _DVBFRONTEND_H_
+
+-#include <linux/types.h>
++#include <asm/types.h>
++
+
+ typedef enum fe_type {
+ FE_QPSK,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/dvb/net.h linux-2.6.29-rc3.owrt/include/linux/dvb/net.h
+--- linux-2.6.29.owrt/include/linux/dvb/net.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/dvb/net.h 2009-05-10 23:48:29.000000000 +0200
+@@ -24,7 +24,8 @@
+ #ifndef _DVBNET_H_
+ #define _DVBNET_H_
+
+-#include <linux/types.h>
++#include <asm/types.h>
++
+
+ struct dvb_net_if {
+ __u16 pid;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/dvb/video.h linux-2.6.29-rc3.owrt/include/linux/dvb/video.h
+--- linux-2.6.29.owrt/include/linux/dvb/video.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/dvb/video.h 2009-05-10 23:48:29.000000000 +0200
+@@ -24,14 +24,17 @@
+ #ifndef _DVBVIDEO_H_
+ #define _DVBVIDEO_H_
+
+-#include <linux/types.h>
+-#ifdef __KERNEL__
+ #include <linux/compiler.h>
++
++#ifdef __KERNEL__
++#include <linux/types.h>
+ #else
++#include <asm/types.h>
+ #include <stdint.h>
+ #include <time.h>
+ #endif
+
++
+ typedef enum {
+ VIDEO_FORMAT_4_3, /* Select 4:3 format */
+ VIDEO_FORMAT_16_9, /* Select 16:9 format. */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/edd.h linux-2.6.29-rc3.owrt/include/linux/edd.h
+--- linux-2.6.29.owrt/include/linux/edd.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/edd.h 2009-05-10 23:48:29.000000000 +0200
+@@ -30,8 +30,6 @@
+ #ifndef _LINUX_EDD_H
+ #define _LINUX_EDD_H
+
+-#include <linux/types.h>
+-
+ #define EDDNR 0x1e9 /* addr of number of edd_info structs at EDDBUF
+ in boot_params - treat this as 1 byte */
+ #define EDDBUF 0xd00 /* addr of edd_info structs in boot_params */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/efs_fs_sb.h linux-2.6.29-rc3.owrt/include/linux/efs_fs_sb.h
+--- linux-2.6.29.owrt/include/linux/efs_fs_sb.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/efs_fs_sb.h 2009-05-10 23:48:29.000000000 +0200
+@@ -9,7 +9,6 @@
+ #ifndef __EFS_FS_SB_H__
+ #define __EFS_FS_SB_H__
+
+-#include <linux/types.h>
+ #include <linux/magic.h>
+
+ /* EFS superblock magic numbers */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/elf-fdpic.h linux-2.6.29-rc3.owrt/include/linux/elf-fdpic.h
+--- linux-2.6.29.owrt/include/linux/elf-fdpic.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/elf-fdpic.h 2009-05-10 23:48:29.000000000 +0200
+@@ -58,13 +58,11 @@
+ #define ELF_FDPIC_FLAG_PRESENT 0x80000000 /* T if this object is present */
+ };
+
+-#ifdef __KERNEL__
+ #ifdef CONFIG_MMU
+ extern void elf_fdpic_arch_lay_out_mm(struct elf_fdpic_params *exec_params,
+ struct elf_fdpic_params *interp_params,
+ unsigned long *start_stack,
+ unsigned long *start_brk);
+ #endif
+-#endif /* __KERNEL__ */
+
+ #endif /* _LINUX_ELF_FDPIC_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/elf.h linux-2.6.29-rc3.owrt/include/linux/elf.h
+--- linux-2.6.29.owrt/include/linux/elf.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/elf.h 2009-05-10 23:48:29.000000000 +0200
+@@ -377,7 +377,6 @@
+ Elf64_Word n_type; /* Content type */
+ } Elf64_Nhdr;
+
+-#ifdef __KERNEL__
+ #if ELF_CLASS == ELFCLASS32
+
+ extern Elf32_Dyn _DYNAMIC [];
+@@ -405,5 +404,5 @@
+ extern int elf_coredump_extra_notes_size(void);
+ extern int elf_coredump_extra_notes_write(struct file *file, loff_t *foffset);
+ #endif
+-#endif /* __KERNEL__ */
++
+ #endif /* _LINUX_ELF_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/errqueue.h linux-2.6.29-rc3.owrt/include/linux/errqueue.h
+--- linux-2.6.29.owrt/include/linux/errqueue.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/errqueue.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,8 +1,6 @@
+ #ifndef _LINUX_ERRQUEUE_H
+ #define _LINUX_ERRQUEUE_H 1
+
+-#include <linux/types.h>
+-
+ struct sock_extended_err
+ {
+ __u32 ee_errno;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/fb.h linux-2.6.29-rc3.owrt/include/linux/fb.h
+--- linux-2.6.29.owrt/include/linux/fb.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/fb.h 2009-05-10 23:48:29.000000000 +0200
+@@ -960,21 +960,6 @@
+ extern int num_registered_fb;
+ extern struct class *fb_class;
+
+-static inline int lock_fb_info(struct fb_info *info)
+-{
+- mutex_lock(&info->lock);
+- if (!info->fbops) {
+- mutex_unlock(&info->lock);
+- return 0;
+- }
+- return 1;
+-}
+-
+-static inline void unlock_fb_info(struct fb_info *info)
+-{
+- mutex_unlock(&info->lock);
+-}
+-
+ static inline void __fb_pad_aligned_buffer(u8 *dst, u32 d_pitch,
+ u8 *src, u32 s_pitch, u32 height)
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/firmware-map.h linux-2.6.29-rc3.owrt/include/linux/firmware-map.h
+--- linux-2.6.29.owrt/include/linux/firmware-map.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/firmware-map.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,7 @@
+ /*
+ * include/linux/firmware-map.h:
+ * Copyright (C) 2008 SUSE LINUX Products GmbH
+- * by Bernhard Walle <bernhard.walle@gmx.de>
++ * by Bernhard Walle <bwalle@suse.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License v2.0 as published by
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/fs.h linux-2.6.29-rc3.owrt/include/linux/fs.h
+--- linux-2.6.29.owrt/include/linux/fs.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/fs.h 2009-05-10 23:48:29.000000000 +0200
+@@ -54,30 +54,24 @@
+ #define MAY_ACCESS 16
+ #define MAY_OPEN 32
+
+-/*
+- * flags in file.f_mode. Note that FMODE_READ and FMODE_WRITE must correspond
+- * to O_WRONLY and O_RDWR via the strange trick in __dentry_open()
+- */
+-
+ /* file is open for reading */
+ #define FMODE_READ ((__force fmode_t)1)
+ /* file is open for writing */
+ #define FMODE_WRITE ((__force fmode_t)2)
+ /* file is seekable */
+ #define FMODE_LSEEK ((__force fmode_t)4)
+-/* file can be accessed using pread */
++/* file can be accessed using pread/pwrite */
+ #define FMODE_PREAD ((__force fmode_t)8)
+-/* file can be accessed using pwrite */
+-#define FMODE_PWRITE ((__force fmode_t)16)
++#define FMODE_PWRITE FMODE_PREAD /* These go hand in hand */
+ /* File is opened for execution with sys_execve / sys_uselib */
+-#define FMODE_EXEC ((__force fmode_t)32)
++#define FMODE_EXEC ((__force fmode_t)16)
+ /* File is opened with O_NDELAY (only set for block devices) */
+-#define FMODE_NDELAY ((__force fmode_t)64)
++#define FMODE_NDELAY ((__force fmode_t)32)
+ /* File is opened with O_EXCL (only set for block devices) */
+-#define FMODE_EXCL ((__force fmode_t)128)
++#define FMODE_EXCL ((__force fmode_t)64)
+ /* File is opened using open(.., 3, ..) and is writeable only for ioctls
+ (specialy hack for floppy.c) */
+-#define FMODE_WRITE_IOCTL ((__force fmode_t)256)
++#define FMODE_WRITE_IOCTL ((__force fmode_t)128)
+
+ /*
+ * Don't update ctime and mtime.
+@@ -93,10 +87,10 @@
+ #define WRITE 1
+ #define READA 2 /* read-ahead - don't block if no resources */
+ #define SWRITE 3 /* for ll_rw_block() - wait for buffer lock */
+-#define READ_SYNC (READ | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG))
++#define READ_SYNC (READ | (1 << BIO_RW_SYNC))
+ #define READ_META (READ | (1 << BIO_RW_META))
+-#define WRITE_SYNC (WRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG))
+-#define SWRITE_SYNC (SWRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG))
++#define WRITE_SYNC (WRITE | (1 << BIO_RW_SYNC))
++#define SWRITE_SYNC (SWRITE | (1 << BIO_RW_SYNC))
+ #define WRITE_BARRIER (WRITE | (1 << BIO_RW_BARRIER))
+ #define DISCARD_NOBARRIER (1 << BIO_RW_DISCARD)
+ #define DISCARD_BARRIER ((1 << BIO_RW_DISCARD) | (1 << BIO_RW_BARRIER))
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/genetlink.h linux-2.6.29-rc3.owrt/include/linux/genetlink.h
+--- linux-2.6.29.owrt/include/linux/genetlink.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/genetlink.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,6 @@
+ #ifndef __LINUX_GENERIC_NETLINK_H
+ #define __LINUX_GENERIC_NETLINK_H
+
+-#include <linux/types.h>
+ #include <linux/netlink.h>
+
+ #define GENL_NAMSIZ 16 /* length of family name */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/gfs2_ondisk.h linux-2.6.29-rc3.owrt/include/linux/gfs2_ondisk.h
+--- linux-2.6.29.owrt/include/linux/gfs2_ondisk.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/gfs2_ondisk.h 2009-05-10 23:48:29.000000000 +0200
+@@ -10,8 +10,6 @@
+ #ifndef __GFS2_ONDISK_DOT_H__
+ #define __GFS2_ONDISK_DOT_H__
+
+-#include <linux/types.h>
+-
+ #define GFS2_MAGIC 0x01161970
+ #define GFS2_BASIC_BLOCK 512
+ #define GFS2_BASIC_BLOCK_SHIFT 9
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/hdreg.h linux-2.6.29-rc3.owrt/include/linux/hdreg.h
+--- linux-2.6.29.owrt/include/linux/hdreg.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/hdreg.h 2009-05-10 23:48:29.000000000 +0200
+@@ -511,6 +511,7 @@
+ unsigned short words69_70[2]; /* reserved words 69-70
+ * future command overlap and queuing
+ */
++ /* HDIO_GET_IDENTITY currently returns only words 0 through 70 */
+ unsigned short words71_74[4]; /* reserved words 71-74
+ * for IDENTIFY PACKET DEVICE command
+ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/hiddev.h linux-2.6.29-rc3.owrt/include/linux/hiddev.h
+--- linux-2.6.29.owrt/include/linux/hiddev.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/hiddev.h 2009-05-10 23:48:29.000000000 +0200
+@@ -27,8 +27,6 @@
+ * Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic
+ */
+
+-#include <linux/types.h>
+-
+ /*
+ * The event structure itself
+ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/hid.h linux-2.6.29-rc3.owrt/include/linux/hid.h
+--- linux-2.6.29.owrt/include/linux/hid.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/hid.h 2009-05-10 23:48:29.000000000 +0200
+@@ -791,7 +791,6 @@
+ __FILE__ , ## arg)
+ #endif /* HID_FF */
+
+-#ifdef __KERNEL__
+ #ifdef CONFIG_HID_COMPAT
+ #define HID_COMPAT_LOAD_DRIVER(name) \
+ /* prototype to avoid sparse warning */ \
+@@ -805,7 +804,6 @@
+ extern void hid_compat_##name(void); \
+ hid_compat_##name(); \
+ } while (0)
+-#endif /* __KERNEL__ */
+
+ #endif
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/hugetlb.h linux-2.6.29-rc3.owrt/include/linux/hugetlb.h
+--- linux-2.6.29.owrt/include/linux/hugetlb.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/hugetlb.h 2009-05-10 23:48:29.000000000 +0200
+@@ -33,8 +33,7 @@
+ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
+ unsigned long address, int write_access);
+ int hugetlb_reserve_pages(struct inode *inode, long from, long to,
+- struct vm_area_struct *vma,
+- int acctflags);
++ struct vm_area_struct *vma);
+ void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed);
+
+ extern unsigned long hugepages_treat_as_movable;
+@@ -139,7 +138,7 @@
+
+ extern const struct file_operations hugetlbfs_file_operations;
+ extern struct vm_operations_struct hugetlb_vm_ops;
+-struct file *hugetlb_file_setup(const char *name, size_t, int);
++struct file *hugetlb_file_setup(const char *name, size_t);
+ int hugetlb_get_quota(struct address_space *mapping, long delta);
+ void hugetlb_put_quota(struct address_space *mapping, long delta);
+
+@@ -159,9 +158,9 @@
+ }
+ #else /* !CONFIG_HUGETLBFS */
+
+-#define is_file_hugepages(file) 0
+-#define set_file_hugepages(file) BUG()
+-#define hugetlb_file_setup(name,size,acctflag) ERR_PTR(-ENOSYS)
++#define is_file_hugepages(file) 0
++#define set_file_hugepages(file) BUG()
++#define hugetlb_file_setup(name,size) ERR_PTR(-ENOSYS)
+
+ #endif /* !CONFIG_HUGETLBFS */
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/i2c-dev.h linux-2.6.29-rc3.owrt/include/linux/i2c-dev.h
+--- linux-2.6.29.owrt/include/linux/i2c-dev.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/i2c-dev.h 2009-05-10 23:48:29.000000000 +0200
+@@ -33,7 +33,7 @@
+ */
+ #define I2C_RETRIES 0x0701 /* number of times a device address should
+ be polled when not acknowledging */
+-#define I2C_TIMEOUT 0x0702 /* set timeout in units of 10 ms */
++#define I2C_TIMEOUT 0x0702 /* set timeout in jiffies - call with int */
+
+ /* NOTE: Slave address is 7 or 10 bits, but 10-bit addresses
+ * are NOT supported! (due to code brokenness)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/i2c.h linux-2.6.29-rc3.owrt/include/linux/i2c.h
+--- linux-2.6.29.owrt/include/linux/i2c.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/i2c.h 2009-05-10 23:48:29.000000000 +0200
+@@ -361,7 +361,7 @@
+ struct mutex bus_lock;
+ struct mutex clist_lock;
+
+- int timeout; /* in jiffies */
++ int timeout;
+ int retries;
+ struct device dev; /* the adapter device */
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/icmpv6.h linux-2.6.29-rc3.owrt/include/linux/icmpv6.h
+--- linux-2.6.29.owrt/include/linux/icmpv6.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/icmpv6.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,6 @@
+ #ifndef _LINUX_ICMPV6_H
+ #define _LINUX_ICMPV6_H
+
+-#include <linux/types.h>
+ #include <asm/byteorder.h>
+
+ struct icmp6hdr {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/ide.h linux-2.6.29-rc3.owrt/include/linux/ide.h
+--- linux-2.6.29.owrt/include/linux/ide.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/ide.h 2009-05-10 23:48:29.000000000 +0200
+@@ -663,7 +663,7 @@
+ #define to_ide_device(dev) container_of(dev, ide_drive_t, gendev)
+
+ #define to_ide_drv(obj, cont_type) \
+- container_of(obj, struct cont_type, dev)
++ container_of(obj, struct cont_type, kref)
+
+ #define ide_drv_g(disk, cont_type) \
+ container_of((disk)->private_data, struct cont_type, driver)
+@@ -797,7 +797,6 @@
+ struct scatterlist *sg_table;
+ int sg_max_nents; /* Maximum number of entries in it */
+ int sg_nents; /* Current number of entries in it */
+- int orig_sg_nents;
+ int sg_dma_direction; /* dma transfer direction */
+
+ /* data phase of the active command (currently only valid for PIO/DMA) */
+@@ -867,7 +866,6 @@
+ unsigned int n_ports;
+ struct device *dev[2];
+ unsigned int (*init_chipset)(struct pci_dev *);
+- irq_handler_t irq_handler;
+ unsigned long host_flags;
+ void *host_priv;
+ ide_hwif_t *cur_port; /* for hosts requiring serialization */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/if_addr.h linux-2.6.29-rc3.owrt/include/linux/if_addr.h
+--- linux-2.6.29.owrt/include/linux/if_addr.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/if_addr.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,6 @@
+ #ifndef __LINUX_IF_ADDR_H
+ #define __LINUX_IF_ADDR_H
+
+-#include <linux/types.h>
+ #include <linux/netlink.h>
+
+ struct ifaddrmsg
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/if_addrlabel.h linux-2.6.29-rc3.owrt/include/linux/if_addrlabel.h
+--- linux-2.6.29.owrt/include/linux/if_addrlabel.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/if_addrlabel.h 2009-05-10 23:48:29.000000000 +0200
+@@ -10,8 +10,6 @@
+ #ifndef __LINUX_IF_ADDRLABEL_H
+ #define __LINUX_IF_ADDRLABEL_H
+
+-#include <linux/types.h>
+-
+ struct ifaddrlblmsg
+ {
+ __u8 ifal_family; /* Address family */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/if_fc.h linux-2.6.29-rc3.owrt/include/linux/if_fc.h
+--- linux-2.6.29.owrt/include/linux/if_fc.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/if_fc.h 2009-05-10 23:48:29.000000000 +0200
+@@ -20,7 +20,6 @@
+ #ifndef _LINUX_IF_FC_H
+ #define _LINUX_IF_FC_H
+
+-#include <linux/types.h>
+
+ #define FC_ALEN 6 /* Octets in one ethernet addr */
+ #define FC_HLEN (sizeof(struct fch_hdr)+sizeof(struct fcllc))
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/if_hippi.h linux-2.6.29-rc3.owrt/include/linux/if_hippi.h
+--- linux-2.6.29.owrt/include/linux/if_hippi.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/if_hippi.h 2009-05-10 23:48:29.000000000 +0200
+@@ -22,7 +22,6 @@
+ #ifndef _LINUX_IF_HIPPI_H
+ #define _LINUX_IF_HIPPI_H
+
+-#include <linux/types.h>
+ #include <asm/byteorder.h>
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/if_link.h linux-2.6.29-rc3.owrt/include/linux/if_link.h
+--- linux-2.6.29.owrt/include/linux/if_link.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/if_link.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,6 @@
+ #ifndef _LINUX_IF_LINK_H
+ #define _LINUX_IF_LINK_H
+
+-#include <linux/types.h>
+ #include <linux/netlink.h>
+
+ /* The struct should be in sync with struct net_device_stats */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/if_ppp.h linux-2.6.29-rc3.owrt/include/linux/if_ppp.h
+--- linux-2.6.29.owrt/include/linux/if_ppp.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/if_ppp.h 2009-05-10 23:48:29.000000000 +0200
+@@ -33,7 +33,6 @@
+ #ifndef _IF_PPP_H_
+ #define _IF_PPP_H_
+
+-#include <linux/types.h>
+ #include <linux/compiler.h>
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/if_strip.h linux-2.6.29-rc3.owrt/include/linux/if_strip.h
+--- linux-2.6.29.owrt/include/linux/if_strip.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/if_strip.h 2009-05-10 23:48:29.000000000 +0200
+@@ -18,8 +18,6 @@
+ #ifndef __LINUX_STRIP_H
+ #define __LINUX_STRIP_H
+
+-#include <linux/types.h>
+-
+ typedef struct {
+ __u8 c[6];
+ } MetricomAddress;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/if_tr.h linux-2.6.29-rc3.owrt/include/linux/if_tr.h
+--- linux-2.6.29.owrt/include/linux/if_tr.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/if_tr.h 2009-05-10 23:48:29.000000000 +0200
+@@ -19,7 +19,6 @@
+ #ifndef _LINUX_IF_TR_H
+ #define _LINUX_IF_TR_H
+
+-#include <linux/types.h>
+ #include <asm/byteorder.h> /* For __be16 */
+
+ /* IEEE 802.5 Token-Ring magic constants. The frame sizes omit the preamble
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/if_tunnel.h linux-2.6.29-rc3.owrt/include/linux/if_tunnel.h
+--- linux-2.6.29.owrt/include/linux/if_tunnel.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/if_tunnel.h 2009-05-10 23:48:29.000000000 +0200
+@@ -2,10 +2,7 @@
+ #define _IF_TUNNEL_H_
+
+ #include <linux/types.h>
+-
+-#ifdef __KERNEL__
+ #include <linux/ip.h>
+-#endif
+
+ #define SIOCGETTUNNEL (SIOCDEVPRIVATE + 0)
+ #define SIOCADDTUNNEL (SIOCDEVPRIVATE + 1)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/if_vlan.h linux-2.6.29-rc3.owrt/include/linux/if_vlan.h
+--- linux-2.6.29.owrt/include/linux/if_vlan.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/if_vlan.h 2009-05-10 23:48:29.000000000 +0200
+@@ -210,7 +210,6 @@
+
+ /* Move the mac addresses to the beginning of the new header. */
+ memmove(skb->data, skb->data + VLAN_HLEN, 2 * VLAN_ETH_ALEN);
+- skb->mac_header -= VLAN_HLEN;
+
+ /* first, the ethernet type */
+ veth->h_vlan_proto = htons(ETH_P_8021Q);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/igmp.h linux-2.6.29-rc3.owrt/include/linux/igmp.h
+--- linux-2.6.29.owrt/include/linux/igmp.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/igmp.h 2009-05-10 23:48:29.000000000 +0200
+@@ -16,7 +16,6 @@
+ #ifndef _LINUX_IGMP_H
+ #define _LINUX_IGMP_H
+
+-#include <linux/types.h>
+ #include <asm/byteorder.h>
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/inet_diag.h linux-2.6.29-rc3.owrt/include/linux/inet_diag.h
+--- linux-2.6.29.owrt/include/linux/inet_diag.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/inet_diag.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,8 +1,6 @@
+ #ifndef _INET_DIAG_H_
+ #define _INET_DIAG_H_ 1
+
+-#include <linux/types.h>
+-
+ /* Just some random number */
+ #define TCPDIAG_GETSOCK 18
+ #define DCCPDIAG_GETSOCK 19
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/init_task.h linux-2.6.29-rc3.owrt/include/linux/init_task.h
+--- linux-2.6.29.owrt/include/linux/init_task.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/init_task.h 2009-05-10 23:48:29.000000000 +0200
+@@ -48,11 +48,12 @@
+ .posix_timers = LIST_HEAD_INIT(sig.posix_timers), \
+ .cpu_timers = INIT_CPU_TIMERS(sig.cpu_timers), \
+ .rlim = INIT_RLIMITS, \
+- .cputimer = { \
+- .cputime = INIT_CPUTIME, \
+- .running = 0, \
+- .lock = __SPIN_LOCK_UNLOCKED(sig.cputimer.lock), \
+- }, \
++ .cputime = { .totals = { \
++ .utime = cputime_zero, \
++ .stime = cputime_zero, \
++ .sum_exec_runtime = 0, \
++ .lock = __SPIN_LOCK_UNLOCKED(sig.cputime.totals.lock), \
++ }, }, \
+ }
+
+ extern struct nsproxy init_nsproxy;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/intel-iommu.h linux-2.6.29-rc3.owrt/include/linux/intel-iommu.h
+--- linux-2.6.29.owrt/include/linux/intel-iommu.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/intel-iommu.h 2009-05-10 23:48:29.000000000 +0200
+@@ -194,7 +194,6 @@
+ /* FSTS_REG */
+ #define DMA_FSTS_PPF ((u32)2)
+ #define DMA_FSTS_PFO ((u32)1)
+-#define DMA_FSTS_IQE (1 << 4)
+ #define dma_fsts_fault_record_index(s) (((s) >> 8) & 0xff)
+
+ /* FRCD_REG, 32 bits access */
+@@ -329,7 +328,7 @@
+ unsigned int size_order, u64 type,
+ int non_present_entry_flush);
+
+-extern int qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu);
++extern void qi_submit_sync(struct qi_desc *desc, struct intel_iommu *iommu);
+
+ extern void *intel_alloc_coherent(struct device *, size_t, dma_addr_t *, gfp_t);
+ extern void intel_free_coherent(struct device *, size_t, void *, dma_addr_t);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/io-mapping.h linux-2.6.29-rc3.owrt/include/linux/io-mapping.h
+--- linux-2.6.29.owrt/include/linux/io-mapping.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/io-mapping.h 2009-05-10 23:48:29.000000000 +0200
+@@ -30,13 +30,10 @@
+ * See Documentation/io_mapping.txt
+ */
+
+-#ifdef CONFIG_HAVE_ATOMIC_IOMAP
++/* this struct isn't actually defined anywhere */
++struct io_mapping;
+
+-struct io_mapping {
+- resource_size_t base;
+- unsigned long size;
+- pgprot_t prot;
+-};
++#ifdef CONFIG_HAVE_ATOMIC_IOMAP
+
+ /*
+ * For small address space machines, mapping large objects
+@@ -46,40 +43,23 @@
+ */
+
+ static inline struct io_mapping *
+-io_mapping_create_wc(resource_size_t base, unsigned long size)
++io_mapping_create_wc(unsigned long base, unsigned long size)
+ {
+- struct io_mapping *iomap;
+-
+- if (!is_io_mapping_possible(base, size))
+- return NULL;
+-
+- iomap = kmalloc(sizeof(*iomap), GFP_KERNEL);
+- if (!iomap)
+- return NULL;
+-
+- iomap->base = base;
+- iomap->size = size;
+- iomap->prot = pgprot_writecombine(__pgprot(__PAGE_KERNEL));
+- return iomap;
++ return (struct io_mapping *) base;
+ }
+
+ static inline void
+ io_mapping_free(struct io_mapping *mapping)
+ {
+- kfree(mapping);
+ }
+
+ /* Atomic map/unmap */
+ static inline void *
+ io_mapping_map_atomic_wc(struct io_mapping *mapping, unsigned long offset)
+ {
+- resource_size_t phys_addr;
+- unsigned long pfn;
+-
+- BUG_ON(offset >= mapping->size);
+- phys_addr = mapping->base + offset;
+- pfn = (unsigned long) (phys_addr >> PAGE_SHIFT);
+- return iomap_atomic_prot_pfn(pfn, KM_USER0, mapping->prot);
++ offset += (unsigned long) mapping;
++ return iomap_atomic_prot_pfn(offset >> PAGE_SHIFT, KM_USER0,
++ __pgprot(__PAGE_KERNEL_WC));
+ }
+
+ static inline void
+@@ -91,12 +71,8 @@
+ static inline void *
+ io_mapping_map_wc(struct io_mapping *mapping, unsigned long offset)
+ {
+- resource_size_t phys_addr;
+-
+- BUG_ON(offset >= mapping->size);
+- phys_addr = mapping->base + offset;
+-
+- return ioremap_wc(phys_addr, PAGE_SIZE);
++ offset += (unsigned long) mapping;
++ return ioremap_wc(offset, PAGE_SIZE);
+ }
+
+ static inline void
+@@ -107,12 +83,9 @@
+
+ #else
+
+-/* this struct isn't actually defined anywhere */
+-struct io_mapping;
+-
+ /* Create the io_mapping object*/
+ static inline struct io_mapping *
+-io_mapping_create_wc(resource_size_t base, unsigned long size)
++io_mapping_create_wc(unsigned long base, unsigned long size)
+ {
+ return (struct io_mapping *) ioremap_wc(base, size);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/ip6_tunnel.h linux-2.6.29-rc3.owrt/include/linux/ip6_tunnel.h
+--- linux-2.6.29.owrt/include/linux/ip6_tunnel.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/ip6_tunnel.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,8 +1,6 @@
+ #ifndef _IP6_TUNNEL_H
+ #define _IP6_TUNNEL_H
+
+-#include <linux/types.h>
+-
+ #define IPV6_TLV_TNL_ENCAP_LIMIT 4
+ #define IPV6_DEFAULT_TNL_ENCAP_LIMIT 4
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/ipv6.h linux-2.6.29-rc3.owrt/include/linux/ipv6.h
+--- linux-2.6.29.owrt/include/linux/ipv6.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/ipv6.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,6 @@
+ #ifndef _IPV6_H
+ #define _IPV6_H
+
+-#include <linux/types.h>
+ #include <linux/in6.h>
+ #include <asm/byteorder.h>
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/ipv6_route.h linux-2.6.29-rc3.owrt/include/linux/ipv6_route.h
+--- linux-2.6.29.owrt/include/linux/ipv6_route.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/ipv6_route.h 2009-05-10 23:48:29.000000000 +0200
+@@ -13,8 +13,6 @@
+ #ifndef _LINUX_IPV6_ROUTE_H
+ #define _LINUX_IPV6_ROUTE_H
+
+-#include <linux/types.h>
+-
+ #define RTF_DEFAULT 0x00010000 /* default - learned via ND */
+ #define RTF_ALLONLINK 0x00020000 /* (deprecated and will be removed)
+ fallback, no routers on link */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/ipx.h linux-2.6.29-rc3.owrt/include/linux/ipx.h
+--- linux-2.6.29.owrt/include/linux/ipx.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/ipx.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,6 +1,5 @@
+ #ifndef _IPX_H_
+ #define _IPX_H_
+-#include <linux/types.h>
+ #include <linux/sockios.h>
+ #include <linux/socket.h>
+ #define IPX_NODE_LEN 6
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/irda.h linux-2.6.29-rc3.owrt/include/linux/irda.h
+--- linux-2.6.29.owrt/include/linux/irda.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/irda.h 2009-05-10 23:48:29.000000000 +0200
+@@ -25,8 +25,6 @@
+ #ifndef KERNEL_IRDA_H
+ #define KERNEL_IRDA_H
+
+-#include <linux/types.h>
+-
+ /* Please do *not* add any #include in this file, this file is
+ * included as-is in user space.
+ * Please fix the calling file to properly included needed files before
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/jbd2.h linux-2.6.29-rc3.owrt/include/linux/jbd2.h
+--- linux-2.6.29.owrt/include/linux/jbd2.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/jbd2.h 2009-05-10 23:48:29.000000000 +0200
+@@ -308,8 +308,7 @@
+ int val = (expr); \
+ if (!val) { \
+ printk(KERN_ERR \
+- "JBD2 unexpected failure: %s: %s;\n", \
+- __func__, #expr); \
++ "EXT3-fs unexpected failure: %s;\n",# expr); \
+ printk(KERN_ERR why "\n"); \
+ } \
+ val; \
+@@ -1150,8 +1149,7 @@
+ extern int jbd2_journal_bmap(journal_t *, unsigned long, unsigned long long *);
+ extern int jbd2_journal_force_commit(journal_t *);
+ extern int jbd2_journal_file_inode(handle_t *handle, struct jbd2_inode *inode);
+-extern int jbd2_journal_begin_ordered_truncate(journal_t *journal,
+- struct jbd2_inode *inode, loff_t new_size);
++extern int jbd2_journal_begin_ordered_truncate(struct jbd2_inode *inode, loff_t new_size);
+ extern void jbd2_journal_init_jbd_inode(struct jbd2_inode *jinode, struct inode *inode);
+ extern void jbd2_journal_release_jbd_inode(journal_t *journal, struct jbd2_inode *jinode);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/Kbuild linux-2.6.29-rc3.owrt/include/linux/Kbuild
+--- linux-2.6.29.owrt/include/linux/Kbuild 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/Kbuild 2009-05-10 23:48:29.000000000 +0200
+@@ -41,7 +41,6 @@
+ header-y += bfs_fs.h
+ header-y += blkpg.h
+ header-y += bpqether.h
+-header-y += bsg.h
+ header-y += can.h
+ header-y += cdk.h
+ header-y += chio.h
+@@ -52,7 +51,6 @@
+ header-y += cgroupstats.h
+ header-y += cramfs_fs.h
+ header-y += cycx_cfm.h
+-header-y += dcbnl.h
+ header-y += dlmconstants.h
+ header-y += dlm_device.h
+ header-y += dlm_netlink.h
+@@ -91,6 +89,7 @@
+ header-y += if_slip.h
+ header-y += if_strip.h
+ header-y += if_tun.h
++header-y += if_tunnel.h
+ header-y += in_route.h
+ header-y += ioctl.h
+ header-y += ip6_tunnel.h
+@@ -236,7 +235,6 @@
+ unifdef-y += if_pppol2tp.h
+ unifdef-y += if_pppox.h
+ unifdef-y += if_tr.h
+-unifdef-y += if_tunnel.h
+ unifdef-y += if_vlan.h
+ unifdef-y += igmp.h
+ unifdef-y += inet_diag.h
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/kernel.h linux-2.6.29-rc3.owrt/include/linux/kernel.h
+--- linux-2.6.29.owrt/include/linux/kernel.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/kernel.h 2009-05-10 23:48:29.000000000 +0200
+@@ -480,8 +480,7 @@
+ /*
+ * swap - swap value of @a and @b
+ */
+-#define swap(a, b) \
+- do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
++#define swap(a, b) ({ typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; })
+
+ /**
+ * container_of - cast a member of a structure out to the containing structure
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/kprobes.h linux-2.6.29-rc3.owrt/include/linux/kprobes.h
+--- linux-2.6.29.owrt/include/linux/kprobes.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/kprobes.h 2009-05-10 23:48:29.000000000 +0200
+@@ -49,13 +49,6 @@
+
+ /* Attach to insert probes on any functions which should be ignored*/
+ #define __kprobes __attribute__((__section__(".kprobes.text"))) notrace
+-#else /* CONFIG_KPROBES */
+-typedef int kprobe_opcode_t;
+-struct arch_specific_insn {
+- int dummy;
+-};
+-#define __kprobes notrace
+-#endif /* CONFIG_KPROBES */
+
+ struct kprobe;
+ struct pt_regs;
+@@ -138,6 +131,23 @@
+ /* For backward compatibility with old code using JPROBE_ENTRY() */
+ #define JPROBE_ENTRY(handler) (handler)
+
++DECLARE_PER_CPU(struct kprobe *, current_kprobe);
++DECLARE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
++
++#ifdef CONFIG_KRETPROBES
++extern void arch_prepare_kretprobe(struct kretprobe_instance *ri,
++ struct pt_regs *regs);
++extern int arch_trampoline_kprobe(struct kprobe *p);
++#else /* CONFIG_KRETPROBES */
++static inline void arch_prepare_kretprobe(struct kretprobe *rp,
++ struct pt_regs *regs)
++{
++}
++static inline int arch_trampoline_kprobe(struct kprobe *p)
++{
++ return 0;
++}
++#endif /* CONFIG_KRETPROBES */
+ /*
+ * Function-return probe -
+ * Note:
+@@ -178,25 +188,6 @@
+ unsigned long range;
+ };
+
+-#ifdef CONFIG_KPROBES
+-DECLARE_PER_CPU(struct kprobe *, current_kprobe);
+-DECLARE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
+-
+-#ifdef CONFIG_KRETPROBES
+-extern void arch_prepare_kretprobe(struct kretprobe_instance *ri,
+- struct pt_regs *regs);
+-extern int arch_trampoline_kprobe(struct kprobe *p);
+-#else /* CONFIG_KRETPROBES */
+-static inline void arch_prepare_kretprobe(struct kretprobe *rp,
+- struct pt_regs *regs)
+-{
+-}
+-static inline int arch_trampoline_kprobe(struct kprobe *p)
+-{
+- return 0;
+-}
+-#endif /* CONFIG_KRETPROBES */
+-
+ extern struct kretprobe_blackpoint kretprobe_blacklist[];
+
+ static inline void kretprobe_assert(struct kretprobe_instance *ri,
+@@ -273,6 +264,10 @@
+
+ #else /* CONFIG_KPROBES */
+
++#define __kprobes notrace
++struct jprobe;
++struct kretprobe;
++
+ static inline struct kprobe *get_kprobe(void *addr)
+ {
+ return NULL;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/kvm.h linux-2.6.29-rc3.owrt/include/linux/kvm.h
+--- linux-2.6.29.owrt/include/linux/kvm.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/kvm.h 2009-05-10 23:48:29.000000000 +0200
+@@ -58,10 +58,10 @@
+ __u32 pad;
+ union {
+ char dummy[512]; /* reserving space */
+-#ifdef __KVM_HAVE_PIT
++#ifdef CONFIG_X86
+ struct kvm_pic_state pic;
+ #endif
+-#ifdef __KVM_HAVE_IOAPIC
++#if defined(CONFIG_X86) || defined(CONFIG_IA64)
+ struct kvm_ioapic_state ioapic;
+ #endif
+ } chip;
+@@ -384,16 +384,16 @@
+ #define KVM_CAP_MP_STATE 14
+ #define KVM_CAP_COALESCED_MMIO 15
+ #define KVM_CAP_SYNC_MMU 16 /* Changes to host mmap are reflected in guest */
+-#ifdef __KVM_HAVE_DEVICE_ASSIGNMENT
++#if defined(CONFIG_X86)||defined(CONFIG_IA64)
+ #define KVM_CAP_DEVICE_ASSIGNMENT 17
+ #endif
+ #define KVM_CAP_IOMMU 18
+-#ifdef __KVM_HAVE_MSI
++#if defined(CONFIG_X86)
+ #define KVM_CAP_DEVICE_MSI 20
+ #endif
+ /* Bug in KVM_SET_USER_MEMORY_REGION fixed: */
+ #define KVM_CAP_DESTROY_MEMORY_REGION_WORKS 21
+-#ifdef __KVM_HAVE_USER_NMI
++#if defined(CONFIG_X86)
+ #define KVM_CAP_USER_NMI 22
+ #endif
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/kvm_host.h linux-2.6.29-rc3.owrt/include/linux/kvm_host.h
+--- linux-2.6.29.owrt/include/linux/kvm_host.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/kvm_host.h 2009-05-10 23:48:29.000000000 +0200
+@@ -285,7 +285,6 @@
+ struct kvm *kvm_arch_create_vm(void);
+ void kvm_arch_destroy_vm(struct kvm *kvm);
+ void kvm_free_all_assigned_devices(struct kvm *kvm);
+-void kvm_arch_sync_events(struct kvm *kvm);
+
+ int kvm_cpu_get_interrupt(struct kvm_vcpu *v);
+ int kvm_cpu_has_interrupt(struct kvm_vcpu *v);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/libata.h linux-2.6.29-rc3.owrt/include/linux/libata.h
+--- linux-2.6.29.owrt/include/linux/libata.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/libata.h 2009-05-10 23:48:29.000000000 +0200
+@@ -275,7 +275,7 @@
+ * advised to wait only for the following duration before
+ * doing SRST.
+ */
+- ATA_TMOUT_PMP_SRST_WAIT = 5000,
++ ATA_TMOUT_PMP_SRST_WAIT = 1000,
+
+ /* ATA bus states */
+ BUS_UNKNOWN = 0,
+@@ -380,7 +380,6 @@
+ ATA_HORKAGE_ATAPI_MOD16_DMA = (1 << 11), /* use ATAPI DMA for commands
+ not multiple of 16 bytes */
+ ATA_HORKAGE_FIRMWARE_WARN = (1 << 12), /* firwmare update warning */
+- ATA_HORKAGE_1_5_GBPS = (1 << 13), /* force 1.5 Gbps */
+
+ /* DMA mask for user DMA control: User visible values; DO NOT
+ renumber */
+@@ -530,7 +529,6 @@
+ unsigned long flags; /* ATA_QCFLAG_xxx */
+ unsigned int tag;
+ unsigned int n_elem;
+- unsigned int orig_n_elem;
+
+ int dma_dir;
+
+@@ -582,7 +580,7 @@
+ acpi_handle acpi_handle;
+ union acpi_object *gtf_cache;
+ #endif
+- /* n_sector is CLEAR_BEGIN, read comment above CLEAR_BEGIN */
++ /* n_sector is used as CLEAR_OFFSET, read comment above CLEAR_OFFSET */
+ u64 n_sectors; /* size of device, if ATA */
+ unsigned int class; /* ATA_DEV_xxx */
+ unsigned long unpark_deadline;
+@@ -607,22 +605,20 @@
+ u16 heads; /* Number of heads */
+ u16 sectors; /* Number of sectors per track */
+
++ /* error history */
++ int spdn_cnt;
++ struct ata_ering ering;
++
+ union {
+ u16 id[ATA_ID_WORDS]; /* IDENTIFY xxx DEVICE data */
+ u32 gscr[SATA_PMP_GSCR_DWORDS]; /* PMP GSCR block */
+ };
+-
+- /* error history */
+- int spdn_cnt;
+- /* ering is CLEAR_END, read comment above CLEAR_END */
+- struct ata_ering ering;
+ };
+
+-/* Fields between ATA_DEVICE_CLEAR_BEGIN and ATA_DEVICE_CLEAR_END are
+- * cleared to zero on ata_dev_init().
++/* Offset into struct ata_device. Fields above it are maintained
++ * acress device init. Fields below are zeroed.
+ */
+-#define ATA_DEVICE_CLEAR_BEGIN offsetof(struct ata_device, n_sectors)
+-#define ATA_DEVICE_CLEAR_END offsetof(struct ata_device, ering)
++#define ATA_DEVICE_CLEAR_OFFSET offsetof(struct ata_device, n_sectors)
+
+ struct ata_eh_info {
+ struct ata_device *dev; /* offending device */
+@@ -751,8 +747,7 @@
+ acpi_handle acpi_handle;
+ struct ata_acpi_gtm __acpi_init_gtm; /* use ata_acpi_init_gtm() */
+ #endif
+- /* owned by EH */
+- u8 sector_buf[ATA_SECT_SIZE] ____cacheline_aligned;
++ u8 sector_buf[ATA_SECT_SIZE]; /* owned by EH */
+ };
+
+ /* The following initializer overrides a method to NULL whether one of
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/lockd/lockd.h linux-2.6.29-rc3.owrt/include/linux/lockd/lockd.h
+--- linux-2.6.29.owrt/include/linux/lockd/lockd.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/lockd/lockd.h 2009-05-10 23:48:29.000000000 +0200
+@@ -346,7 +346,6 @@
+ return sin1->sin_addr.s_addr == sin2->sin_addr.s_addr;
+ }
+
+-#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+ static inline int __nlm_cmp_addr6(const struct sockaddr *sap1,
+ const struct sockaddr *sap2)
+ {
+@@ -354,13 +353,6 @@
+ const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sap2;
+ return ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr);
+ }
+-#else /* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */
+-static inline int __nlm_cmp_addr6(const struct sockaddr *sap1,
+- const struct sockaddr *sap2)
+-{
+- return 0;
+-}
+-#endif /* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */
+
+ /*
+ * Compare two host addresses
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/minix_fs.h linux-2.6.29-rc3.owrt/include/linux/minix_fs.h
+--- linux-2.6.29.owrt/include/linux/minix_fs.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/minix_fs.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,6 @@
+ #ifndef _LINUX_MINIX_FS_H
+ #define _LINUX_MINIX_FS_H
+
+-#include <linux/types.h>
+ #include <linux/magic.h>
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/mm.h linux-2.6.29-rc3.owrt/include/linux/mm.h
+--- linux-2.6.29.owrt/include/linux/mm.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/mm.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1041,23 +1041,10 @@
+ typedef int (*work_fn_t)(unsigned long, unsigned long, void *);
+ extern void work_with_active_regions(int nid, work_fn_t work_fn, void *data);
+ extern void sparse_memory_present_with_active_regions(int nid);
+-#endif /* CONFIG_ARCH_POPULATES_NODE_MAP */
+-
+-#if !defined(CONFIG_ARCH_POPULATES_NODE_MAP) && \
+- !defined(CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID)
+-static inline int __early_pfn_to_nid(unsigned long pfn)
+-{
+- return 0;
+-}
+-#else
+-/* please see mm/page_alloc.c */
+-extern int __meminit early_pfn_to_nid(unsigned long pfn);
+-#ifdef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID
+-/* there is a per-arch backend function. */
+-extern int __meminit __early_pfn_to_nid(unsigned long pfn);
++#ifndef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID
++extern int early_pfn_to_nid(unsigned long pfn);
+ #endif /* CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID */
+-#endif
+-
++#endif /* CONFIG_ARCH_POPULATES_NODE_MAP */
+ extern void set_dma_reserve(unsigned long new_dma_reserve);
+ extern void memmap_init_zone(unsigned long, int, unsigned long,
+ unsigned long, enum memmap_context);
+@@ -1142,7 +1129,8 @@
+ unsigned long flag, unsigned long pgoff);
+ extern unsigned long mmap_region(struct file *file, unsigned long addr,
+ unsigned long len, unsigned long flags,
+- unsigned int vm_flags, unsigned long pgoff);
++ unsigned int vm_flags, unsigned long pgoff,
++ int accountable);
+
+ static inline unsigned long do_mmap(struct file *file, unsigned long addr,
+ unsigned long len, unsigned long prot,
+@@ -1172,7 +1160,6 @@
+
+ /* mm/page-writeback.c */
+ int write_one_page(struct page *page, int wait);
+-void task_dirty_inc(struct task_struct *tsk);
+
+ /* readahead.c */
+ #define VM_MAX_READAHEAD 128 /* kbytes */
+@@ -1318,6 +1305,5 @@
+
+ extern void *alloc_locked_buffer(size_t size);
+ extern void free_locked_buffer(void *buffer, size_t size);
+-extern void release_locked_buffer(void *buffer, size_t size);
+ #endif /* __KERNEL__ */
+ #endif /* _LINUX_MM_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/mm_types.h linux-2.6.29-rc3.owrt/include/linux/mm_types.h
+--- linux-2.6.29.owrt/include/linux/mm_types.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/mm_types.h 2009-05-10 23:48:29.000000000 +0200
+@@ -276,7 +276,4 @@
+ #endif
+ };
+
+-/* Future-safe accessor for struct mm_struct's cpu_vm_mask. */
+-#define mm_cpumask(mm) (&(mm)->cpu_vm_mask)
+-
+ #endif /* _LINUX_MM_TYPES_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/mmzone.h linux-2.6.29-rc3.owrt/include/linux/mmzone.h
+--- linux-2.6.29.owrt/include/linux/mmzone.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/mmzone.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1071,7 +1071,7 @@
+ #endif /* CONFIG_SPARSEMEM */
+
+ #ifdef CONFIG_NODES_SPAN_OTHER_NODES
+-bool early_pfn_in_nid(unsigned long pfn, int nid);
++#define early_pfn_in_nid(pfn, nid) (early_pfn_to_nid(pfn) == (nid))
+ #else
+ #define early_pfn_in_nid(pfn, nid) (1)
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/module.h linux-2.6.29-rc3.owrt/include/linux/module.h
+--- linux-2.6.29.owrt/include/linux/module.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/module.h 2009-05-10 23:48:29.000000000 +0200
+@@ -219,6 +219,11 @@
+
+ #endif
+
++struct module_ref
++{
++ local_t count;
++} ____cacheline_aligned;
++
+ enum module_state
+ {
+ MODULE_STATE_LIVE,
+@@ -339,11 +344,8 @@
+ /* Destruction function. */
+ void (*exit)(void);
+
+-#ifdef CONFIG_SMP
+- char *refptr;
+-#else
+- local_t ref;
+-#endif
++ /* Reference counts */
++ struct module_ref ref[NR_CPUS];
+ #endif
+ };
+ #ifndef MODULE_ARCH_INIT
+@@ -393,21 +395,13 @@
+ #define symbol_put(x) __symbol_put(MODULE_SYMBOL_PREFIX #x)
+ void symbol_put_addr(void *addr);
+
+-static inline local_t *__module_ref_addr(struct module *mod, int cpu)
+-{
+-#ifdef CONFIG_SMP
+- return (local_t *) (mod->refptr + per_cpu_offset(cpu));
+-#else
+- return &mod->ref;
+-#endif
+-}
+-
+ /* Sometimes we know we already have a refcount, and it's easier not
+ to handle the error case (which only happens with rmmod --wait). */
+ static inline void __module_get(struct module *module)
+ {
+ if (module) {
+- local_inc(__module_ref_addr(module, get_cpu()));
++ BUG_ON(module_refcount(module) == 0);
++ local_inc(&module->ref[get_cpu()].count);
+ put_cpu();
+ }
+ }
+@@ -419,7 +413,7 @@
+ if (module) {
+ unsigned int cpu = get_cpu();
+ if (likely(module_is_live(module)))
+- local_inc(__module_ref_addr(module, cpu));
++ local_inc(&module->ref[cpu].count);
+ else
+ ret = 0;
+ put_cpu();
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/msdos_fs.h linux-2.6.29-rc3.owrt/include/linux/msdos_fs.h
+--- linux-2.6.29.owrt/include/linux/msdos_fs.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/msdos_fs.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,6 @@
+ #ifndef _LINUX_MSDOS_FS_H
+ #define _LINUX_MSDOS_FS_H
+
+-#include <linux/types.h>
+ #include <linux/magic.h>
+ #include <asm/byteorder.h>
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/neighbour.h linux-2.6.29-rc3.owrt/include/linux/neighbour.h
+--- linux-2.6.29.owrt/include/linux/neighbour.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/neighbour.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,6 @@
+ #ifndef __LINUX_NEIGHBOUR_H
+ #define __LINUX_NEIGHBOUR_H
+
+-#include <linux/types.h>
+ #include <linux/netlink.h>
+
+ struct ndmsg
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/netdevice.h linux-2.6.29-rc3.owrt/include/linux/netdevice.h
+--- linux-2.6.29.owrt/include/linux/netdevice.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/netdevice.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1081,7 +1081,6 @@
+ extern int register_netdevice_notifier(struct notifier_block *nb);
+ extern int unregister_netdevice_notifier(struct notifier_block *nb);
+ extern int init_dummy_netdev(struct net_device *dev);
+-extern void netdev_resync_ops(struct net_device *dev);
+
+ extern int call_netdevice_notifiers(unsigned long val, struct net_device *dev);
+ extern struct net_device *dev_get_by_index(struct net *net, int ifindex);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/netfilter/xt_conntrack.h linux-2.6.29-rc3.owrt/include/linux/netfilter/xt_conntrack.h
+--- linux-2.6.29.owrt/include/linux/netfilter/xt_conntrack.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/netfilter/xt_conntrack.h 2009-05-10 23:48:29.000000000 +0200
+@@ -5,7 +5,6 @@
+ #ifndef _XT_CONNTRACK_H
+ #define _XT_CONNTRACK_H
+
+-#include <linux/types.h>
+ #include <linux/netfilter/nf_conntrack_tuple_common.h>
+
+ #define XT_CONNTRACK_STATE_BIT(ctinfo) (1 << ((ctinfo)%IP_CT_IS_REPLY+1))
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/netfilter/xt_NFLOG.h linux-2.6.29-rc3.owrt/include/linux/netfilter/xt_NFLOG.h
+--- linux-2.6.29.owrt/include/linux/netfilter/xt_NFLOG.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/netfilter/xt_NFLOG.h 2009-05-10 23:48:29.000000000 +0200
+@@ -2,7 +2,7 @@
+ #define _XT_NFLOG_TARGET
+
+ #define XT_NFLOG_DEFAULT_GROUP 0x1
+-#define XT_NFLOG_DEFAULT_THRESHOLD 0
++#define XT_NFLOG_DEFAULT_THRESHOLD 1
+
+ #define XT_NFLOG_MASK 0x0
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/nfsacl.h linux-2.6.29-rc3.owrt/include/linux/nfsacl.h
+--- linux-2.6.29.owrt/include/linux/nfsacl.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/nfsacl.h 2009-05-10 23:48:29.000000000 +0200
+@@ -37,9 +37,6 @@
+ #define NFSACL_MAXPAGES ((2*(8+12*NFS_ACL_MAX_ENTRIES) + PAGE_SIZE-1) \
+ >> PAGE_SHIFT)
+
+-#define NFS_ACL_MAX_ENTRIES_INLINE (5)
+-#define NFS_ACL_INLINE_BUFSIZE ((2*(2+3*NFS_ACL_MAX_ENTRIES_INLINE)) << 2)
+-
+ static inline unsigned int
+ nfsacl_size(struct posix_acl *acl_access, struct posix_acl *acl_default)
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/nfsd/export.h linux-2.6.29-rc3.owrt/include/linux/nfsd/export.h
+--- linux-2.6.29.owrt/include/linux/nfsd/export.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/nfsd/export.h 2009-05-10 23:48:29.000000000 +0200
+@@ -10,8 +10,9 @@
+ #ifndef NFSD_EXPORT_H
+ #define NFSD_EXPORT_H
+
+-# include <linux/types.h>
++#include <asm/types.h>
+ #ifdef __KERNEL__
++# include <linux/types.h>
+ # include <linux/in.h>
+ #endif
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/nfsd/nfsfh.h linux-2.6.29-rc3.owrt/include/linux/nfsd/nfsfh.h
+--- linux-2.6.29.owrt/include/linux/nfsd/nfsfh.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/nfsd/nfsfh.h 2009-05-10 23:48:29.000000000 +0200
+@@ -14,8 +14,9 @@
+ #ifndef _LINUX_NFSD_FH_H
+ #define _LINUX_NFSD_FH_H
+
+-# include <linux/types.h>
++#include <asm/types.h>
+ #ifdef __KERNEL__
++# include <linux/types.h>
+ # include <linux/string.h>
+ # include <linux/fs.h>
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/nfsd/syscall.h linux-2.6.29-rc3.owrt/include/linux/nfsd/syscall.h
+--- linux-2.6.29.owrt/include/linux/nfsd/syscall.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/nfsd/syscall.h 2009-05-10 23:48:29.000000000 +0200
+@@ -9,8 +9,9 @@
+ #ifndef NFSD_SYSCALL_H
+ #define NFSD_SYSCALL_H
+
+-# include <linux/types.h>
++#include <asm/types.h>
+ #ifdef __KERNEL__
++# include <linux/types.h>
+ # include <linux/in.h>
+ #endif
+ #include <linux/posix_types.h>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/nfs_idmap.h linux-2.6.29-rc3.owrt/include/linux/nfs_idmap.h
+--- linux-2.6.29.owrt/include/linux/nfs_idmap.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/nfs_idmap.h 2009-05-10 23:48:29.000000000 +0200
+@@ -37,8 +37,6 @@
+ #ifndef NFS_IDMAP_H
+ #define NFS_IDMAP_H
+
+-#include <linux/types.h>
+-
+ /* XXX from bits/utmp.h */
+ #define IDMAP_NAMESZ 128
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/nfs_xdr.h linux-2.6.29-rc3.owrt/include/linux/nfs_xdr.h
+--- linux-2.6.29.owrt/include/linux/nfs_xdr.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/nfs_xdr.h 2009-05-10 23:48:29.000000000 +0200
+@@ -406,8 +406,6 @@
+ int mask;
+ struct posix_acl * acl_access;
+ struct posix_acl * acl_default;
+- size_t len;
+- unsigned int npages;
+ struct page ** pages;
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/nubus.h linux-2.6.29-rc3.owrt/include/linux/nubus.h
+--- linux-2.6.29.owrt/include/linux/nubus.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/nubus.h 2009-05-10 23:48:29.000000000 +0200
+@@ -12,7 +12,6 @@
+ #ifndef LINUX_NUBUS_H
+ #define LINUX_NUBUS_H
+
+-#include <linux/types.h>
+ #ifdef __KERNEL__
+ #include <asm/nubus.h>
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/pci.h linux-2.6.29-rc3.owrt/include/linux/pci.h
+--- linux-2.6.29.owrt/include/linux/pci.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/pci.h 2009-05-10 23:48:29.000000000 +0200
+@@ -684,7 +684,7 @@
+ void pci_disable_rom(struct pci_dev *pdev);
+ void __iomem __must_check *pci_map_rom(struct pci_dev *pdev, size_t *size);
+ void pci_unmap_rom(struct pci_dev *pdev, void __iomem *rom);
+-size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size);
++size_t pci_get_rom_size(void __iomem *rom, size_t size);
+
+ /* Power management related routines */
+ int pci_save_state(struct pci_dev *dev);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/pci_ids.h linux-2.6.29-rc3.owrt/include/linux/pci_ids.h
+--- linux-2.6.29.owrt/include/linux/pci_ids.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/pci_ids.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1312,7 +1312,6 @@
+ #define PCI_DEVICE_ID_VIA_VT3351 0x0351
+ #define PCI_DEVICE_ID_VIA_VT3364 0x0364
+ #define PCI_DEVICE_ID_VIA_8371_0 0x0391
+-#define PCI_DEVICE_ID_VIA_6415 0x0415
+ #define PCI_DEVICE_ID_VIA_8501_0 0x0501
+ #define PCI_DEVICE_ID_VIA_82C561 0x0561
+ #define PCI_DEVICE_ID_VIA_82C586_1 0x0571
+@@ -1445,7 +1444,6 @@
+ #define PCI_DEVICE_ID_DIGI_DF_M_E 0x0071
+ #define PCI_DEVICE_ID_DIGI_DF_M_IOM2_A 0x0072
+ #define PCI_DEVICE_ID_DIGI_DF_M_A 0x0073
+-#define PCI_DEVICE_ID_DIGI_NEO_8 0x00B1
+ #define PCI_DEVICE_ID_NEO_2DB9 0x00C8
+ #define PCI_DEVICE_ID_NEO_2DB9PRI 0x00C9
+ #define PCI_DEVICE_ID_NEO_2RJ45 0x00CA
+@@ -2323,9 +2321,6 @@
+ #define PCI_DEVICE_ID_INTEL_82378 0x0484
+ #define PCI_DEVICE_ID_INTEL_I960 0x0960
+ #define PCI_DEVICE_ID_INTEL_I960RM 0x0962
+-#define PCI_DEVICE_ID_INTEL_8257X_SOL 0x1062
+-#define PCI_DEVICE_ID_INTEL_82573E_SOL 0x1085
+-#define PCI_DEVICE_ID_INTEL_82573L_SOL 0x108F
+ #define PCI_DEVICE_ID_INTEL_82815_MC 0x1130
+ #define PCI_DEVICE_ID_INTEL_82815_CGC 0x1132
+ #define PCI_DEVICE_ID_INTEL_82092AA_0 0x1221
+@@ -2430,7 +2425,6 @@
+ #define PCI_DEVICE_ID_INTEL_ICH7_0 0x27b8
+ #define PCI_DEVICE_ID_INTEL_ICH7_1 0x27b9
+ #define PCI_DEVICE_ID_INTEL_ICH7_30 0x27b0
+-#define PCI_DEVICE_ID_INTEL_TGP_LPC 0x27bc
+ #define PCI_DEVICE_ID_INTEL_ICH7_31 0x27bd
+ #define PCI_DEVICE_ID_INTEL_ICH7_17 0x27da
+ #define PCI_DEVICE_ID_INTEL_ICH7_19 0x27dd
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/phonet.h linux-2.6.29-rc3.owrt/include/linux/phonet.h
+--- linux-2.6.29.owrt/include/linux/phonet.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/phonet.h 2009-05-10 23:48:29.000000000 +0200
+@@ -23,8 +23,6 @@
+ #ifndef LINUX_PHONET_H
+ #define LINUX_PHONET_H
+
+-#include <linux/types.h>
+-
+ /* Automatic protocol selection */
+ #define PN_PROTO_TRANSPORT 0
+ /* Phonet datagram socket */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/pkt_cls.h linux-2.6.29-rc3.owrt/include/linux/pkt_cls.h
+--- linux-2.6.29.owrt/include/linux/pkt_cls.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/pkt_cls.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,6 @@
+ #ifndef __LINUX_PKT_CLS_H
+ #define __LINUX_PKT_CLS_H
+
+-#include <linux/types.h>
+ #include <linux/pkt_sched.h>
+
+ /* I think i could have done better macros ; for now this is stolen from
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/pkt_sched.h linux-2.6.29-rc3.owrt/include/linux/pkt_sched.h
+--- linux-2.6.29.owrt/include/linux/pkt_sched.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/pkt_sched.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,8 +1,6 @@
+ #ifndef __LINUX_PKT_SCHED_H
+ #define __LINUX_PKT_SCHED_H
+
+-#include <linux/types.h>
+-
+ /* Logical priority bands not depending on specific packet scheduler.
+ Every scheduler will map them to real traffic classes, if it has
+ no more precise mechanism to classify packets.
+@@ -544,7 +542,7 @@
+
+ struct tc_drr_stats
+ {
+- __u32 deficit;
++ u32 deficit;
+ };
+
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/pm.h linux-2.6.29-rc3.owrt/include/linux/pm.h
+--- linux-2.6.29.owrt/include/linux/pm.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/pm.h 2009-05-10 23:48:29.000000000 +0200
+@@ -381,12 +381,10 @@
+
+ #ifdef CONFIG_PM_SLEEP
+ extern void device_pm_lock(void);
+-extern int sysdev_resume(void);
+ extern void device_power_up(pm_message_t state);
+ extern void device_resume(pm_message_t state);
+
+ extern void device_pm_unlock(void);
+-extern int sysdev_suspend(pm_message_t state);
+ extern int device_power_down(pm_message_t state);
+ extern int device_suspend(pm_message_t state);
+ extern int device_prepare_suspend(pm_message_t state);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/ppp_defs.h linux-2.6.29-rc3.owrt/include/linux/ppp_defs.h
+--- linux-2.6.29.owrt/include/linux/ppp_defs.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/ppp_defs.h 2009-05-10 23:48:29.000000000 +0200
+@@ -25,8 +25,6 @@
+ * OR MODIFICATIONS.
+ */
+
+-#include <linux/types.h>
+-
+ /*
+ * ==FILEVERSION 20000114==
+ *
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/raid/md_p.h linux-2.6.29-rc3.owrt/include/linux/raid/md_p.h
+--- linux-2.6.29.owrt/include/linux/raid/md_p.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/raid/md_p.h 2009-05-10 23:48:29.000000000 +0200
+@@ -15,8 +15,6 @@
+ #ifndef _MD_P_H
+ #define _MD_P_H
+
+-#include <linux/types.h>
+-
+ /*
+ * RAID superblock.
+ *
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/random.h linux-2.6.29-rc3.owrt/include/linux/random.h
+--- linux-2.6.29.owrt/include/linux/random.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/random.h 2009-05-10 23:48:29.000000000 +0200
+@@ -7,7 +7,6 @@
+ #ifndef _LINUX_RANDOM_H
+ #define _LINUX_RANDOM_H
+
+-#include <linux/types.h>
+ #include <linux/ioctl.h>
+ #include <linux/irqnr.h>
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/rcuclassic.h linux-2.6.29-rc3.owrt/include/linux/rcuclassic.h
+--- linux-2.6.29.owrt/include/linux/rcuclassic.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/rcuclassic.h 2009-05-10 23:48:29.000000000 +0200
+@@ -181,10 +181,4 @@
+ #define rcu_enter_nohz() do { } while (0)
+ #define rcu_exit_nohz() do { } while (0)
+
+-/* A context switch is a grace period for rcuclassic. */
+-static inline int rcu_blocking_is_gp(void)
+-{
+- return num_online_cpus() == 1;
+-}
+-
+ #endif /* __LINUX_RCUCLASSIC_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/rcupdate.h linux-2.6.29-rc3.owrt/include/linux/rcupdate.h
+--- linux-2.6.29.owrt/include/linux/rcupdate.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/rcupdate.h 2009-05-10 23:48:29.000000000 +0200
+@@ -52,9 +52,6 @@
+ void (*func)(struct rcu_head *head);
+ };
+
+-/* Internal to kernel, but needed by rcupreempt.h. */
+-extern int rcu_scheduler_active;
+-
+ #if defined(CONFIG_CLASSIC_RCU)
+ #include <linux/rcuclassic.h>
+ #elif defined(CONFIG_TREE_RCU)
+@@ -268,7 +265,6 @@
+
+ /* Internal to kernel */
+ extern void rcu_init(void);
+-extern void rcu_scheduler_starting(void);
+ extern int rcu_needs_cpu(int cpu);
+
+ #endif /* __LINUX_RCUPDATE_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/rcupreempt.h linux-2.6.29-rc3.owrt/include/linux/rcupreempt.h
+--- linux-2.6.29.owrt/include/linux/rcupreempt.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/rcupreempt.h 2009-05-10 23:48:29.000000000 +0200
+@@ -142,19 +142,4 @@
+ #define rcu_exit_nohz() do { } while (0)
+ #endif /* CONFIG_NO_HZ */
+
+-/*
+- * A context switch is a grace period for rcupreempt synchronize_rcu()
+- * only during early boot, before the scheduler has been initialized.
+- * So, how the heck do we get a context switch? Well, if the caller
+- * invokes synchronize_rcu(), they are willing to accept a context
+- * switch, so we simply pretend that one happened.
+- *
+- * After boot, there might be a blocked or preempted task in an RCU
+- * read-side critical section, so we cannot then take the fastpath.
+- */
+-static inline int rcu_blocking_is_gp(void)
+-{
+- return num_online_cpus() == 1 && !rcu_scheduler_active;
+-}
+-
+ #endif /* __LINUX_RCUPREEMPT_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/rcutree.h linux-2.6.29-rc3.owrt/include/linux/rcutree.h
+--- linux-2.6.29.owrt/include/linux/rcutree.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/rcutree.h 2009-05-10 23:48:29.000000000 +0200
+@@ -326,10 +326,4 @@
+ }
+ #endif /* CONFIG_NO_HZ */
+
+-/* A context switch is a grace period for rcutree. */
+-static inline int rcu_blocking_is_gp(void)
+-{
+- return num_online_cpus() == 1;
+-}
+-
+ #endif /* __LINUX_RCUTREE_H */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/rtnetlink.h linux-2.6.29-rc3.owrt/include/linux/rtnetlink.h
+--- linux-2.6.29.owrt/include/linux/rtnetlink.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/rtnetlink.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,6 @@
+ #ifndef __LINUX_RTNETLINK_H
+ #define __LINUX_RTNETLINK_H
+
+-#include <linux/types.h>
+ #include <linux/netlink.h>
+ #include <linux/if_link.h>
+ #include <linux/if_addr.h>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/sched.h linux-2.6.29-rc3.owrt/include/linux/sched.h
+--- linux-2.6.29.owrt/include/linux/sched.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/sched.h 2009-05-10 23:48:29.000000000 +0200
+@@ -453,33 +453,23 @@
+ cputime_t utime;
+ cputime_t stime;
+ unsigned long long sum_exec_runtime;
++ spinlock_t lock;
+ };
+ /* Alternate field names when used to cache expirations. */
+ #define prof_exp stime
+ #define virt_exp utime
+ #define sched_exp sum_exec_runtime
+
+-#define INIT_CPUTIME \
+- (struct task_cputime) { \
+- .utime = cputime_zero, \
+- .stime = cputime_zero, \
+- .sum_exec_runtime = 0, \
+- }
+-
+ /**
+- * struct thread_group_cputimer - thread group interval timer counts
+- * @cputime: thread group interval timers.
+- * @running: non-zero when there are timers running and
+- * @cputime receives updates.
+- * @lock: lock for fields in this struct.
++ * struct thread_group_cputime - thread group interval timer counts
++ * @totals: thread group interval timers; substructure for
++ * uniprocessor kernel, per-cpu for SMP kernel.
+ *
+ * This structure contains the version of task_cputime, above, that is
+- * used for thread group CPU timer calculations.
++ * used for thread group CPU clock calculations.
+ */
+-struct thread_group_cputimer {
+- struct task_cputime cputime;
+- int running;
+- spinlock_t lock;
++struct thread_group_cputime {
++ struct task_cputime totals;
+ };
+
+ /*
+@@ -528,10 +518,10 @@
+ cputime_t it_prof_incr, it_virt_incr;
+
+ /*
+- * Thread group totals for process CPU timers.
+- * See thread_group_cputimer(), et al, for details.
++ * Thread group totals for process CPU clocks.
++ * See thread_group_cputime(), et al, for details.
+ */
+- struct thread_group_cputimer cputimer;
++ struct thread_group_cputime cputime;
+
+ /* Earliest-expiration cache. */
+ struct task_cputime cputime_expires;
+@@ -568,7 +558,7 @@
+ * Live threads maintain their own counters and add to these
+ * in __exit_signal, except for the group leader.
+ */
+- cputime_t utime, stime, cutime, cstime;
++ cputime_t cutime, cstime;
+ cputime_t gtime;
+ cputime_t cgtime;
+ unsigned long nvcsw, nivcsw, cnvcsw, cnivcsw;
+@@ -577,14 +567,6 @@
+ struct task_io_accounting ioac;
+
+ /*
+- * Cumulative ns of schedule CPU time fo dead threads in the
+- * group, not including a zombie group leader, (This only differs
+- * from jiffies_to_ns(utime + stime) if sched_clock uses something
+- * other than jiffies.)
+- */
+- unsigned long long sum_sched_runtime;
+-
+- /*
+ * We don't bother to synchronize most readers of this at all,
+ * because there is no reader checking a limit that actually needs
+ * to get both rlim_cur and rlim_max atomically, and either one
+@@ -648,6 +630,7 @@
+ atomic_t inotify_devs; /* How many inotify devs does this user have opened? */
+ #endif
+ #ifdef CONFIG_EPOLL
++ atomic_t epoll_devs; /* The number of epoll descriptors currently open */
+ atomic_t epoll_watches; /* The number of file descriptors currently watched */
+ #endif
+ #ifdef CONFIG_POSIX_MQUEUE
+@@ -1419,9 +1402,6 @@
+ #endif
+ };
+
+-/* Future-safe accessor for struct task_struct's cpus_allowed. */
+-#define tsk_cpumask(tsk) (&(tsk)->cpus_allowed)
+-
+ /*
+ * Priority of a process goes from 0..MAX_PRIO-1, valid RT
+ * priority is 0..MAX_RT_PRIO-1, and SCHED_NORMAL/SCHED_BATCH
+@@ -2203,14 +2183,27 @@
+ /*
+ * Thread group CPU time accounting.
+ */
+-void thread_group_cputime(struct task_struct *tsk, struct task_cputime *times);
+-void thread_group_cputimer(struct task_struct *tsk, struct task_cputime *times);
++
++static inline
++void thread_group_cputime(struct task_struct *tsk, struct task_cputime *times)
++{
++ struct task_cputime *totals = &tsk->signal->cputime.totals;
++ unsigned long flags;
++
++ spin_lock_irqsave(&totals->lock, flags);
++ *times = *totals;
++ spin_unlock_irqrestore(&totals->lock, flags);
++}
+
+ static inline void thread_group_cputime_init(struct signal_struct *sig)
+ {
+- sig->cputimer.cputime = INIT_CPUTIME;
+- spin_lock_init(&sig->cputimer.lock);
+- sig->cputimer.running = 0;
++ sig->cputime.totals = (struct task_cputime){
++ .utime = cputime_zero,
++ .stime = cputime_zero,
++ .sum_exec_runtime = 0,
++ };
++
++ spin_lock_init(&sig->cputime.totals.lock);
+ }
+
+ static inline void thread_group_cputime_free(struct signal_struct *sig)
+@@ -2294,13 +2287,9 @@
+ extern int sched_group_set_rt_period(struct task_group *tg,
+ long rt_period_us);
+ extern long sched_group_rt_period(struct task_group *tg);
+-extern int sched_rt_can_attach(struct task_group *tg, struct task_struct *tsk);
+ #endif
+ #endif
+
+-extern int task_can_switch_user(struct user_struct *up,
+- struct task_struct *tsk);
+-
+ #ifdef CONFIG_TASK_XACCT
+ static inline void add_rchar(struct task_struct *tsk, ssize_t amt)
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/seq_file.h linux-2.6.29-rc3.owrt/include/linux/seq_file.h
+--- linux-2.6.29.owrt/include/linux/seq_file.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/seq_file.h 2009-05-10 23:48:29.000000000 +0200
+@@ -19,7 +19,6 @@
+ size_t from;
+ size_t count;
+ loff_t index;
+- loff_t read_pos;
+ u64 version;
+ struct mutex lock;
+ const struct seq_operations *op;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/serial_core.h linux-2.6.29-rc3.owrt/include/linux/serial_core.h
+--- linux-2.6.29.owrt/include/linux/serial_core.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/serial_core.h 2009-05-10 23:48:29.000000000 +0200
+@@ -296,7 +296,6 @@
+ #define UPF_HARDPPS_CD ((__force upf_t) (1 << 11))
+ #define UPF_LOW_LATENCY ((__force upf_t) (1 << 13))
+ #define UPF_BUGGY_UART ((__force upf_t) (1 << 14))
+-#define UPF_NO_TXEN_TEST ((__force upf_t) (1 << 15))
+ #define UPF_MAGIC_MULTIPLIER ((__force upf_t) (1 << 16))
+ #define UPF_CONS_FLOW ((__force upf_t) (1 << 23))
+ #define UPF_SHARE_IRQ ((__force upf_t) (1 << 24))
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/serio.h linux-2.6.29-rc3.owrt/include/linux/serio.h
+--- linux-2.6.29.owrt/include/linux/serio.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/serio.h 2009-05-10 23:48:29.000000000 +0200
+@@ -212,7 +212,7 @@
+ #define SERIO_FUJITSU 0x35
+ #define SERIO_ZHENHUA 0x36
+ #define SERIO_INEXIO 0x37
+-#define SERIO_TOUCHIT213 0x38
++#define SERIO_TOUCHIT213 0x37
+ #define SERIO_W8001 0x39
+
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/signalfd.h linux-2.6.29-rc3.owrt/include/linux/signalfd.h
+--- linux-2.6.29.owrt/include/linux/signalfd.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/signalfd.h 2009-05-10 23:48:29.000000000 +0200
+@@ -8,7 +8,6 @@
+ #ifndef _LINUX_SIGNALFD_H
+ #define _LINUX_SIGNALFD_H
+
+-#include <linux/types.h>
+ /* For O_CLOEXEC and O_NONBLOCK */
+ #include <linux/fcntl.h>
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/skbuff.h linux-2.6.29-rc3.owrt/include/linux/skbuff.h
+--- linux-2.6.29.owrt/include/linux/skbuff.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/skbuff.h 2009-05-10 23:48:29.000000000 +0200
+@@ -434,6 +434,15 @@
+ void *here);
+ extern void skb_under_panic(struct sk_buff *skb, int len,
+ void *here);
++extern void skb_truesize_bug(struct sk_buff *skb);
++
++static inline void skb_truesize_check(struct sk_buff *skb)
++{
++ int len = sizeof(struct sk_buff) + skb->len;
++
++ if (unlikely((int)skb->truesize < len))
++ skb_truesize_bug(skb);
++}
+
+ extern int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb,
+ int getfrag(void *from, char *to, int offset,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/slab_def.h linux-2.6.29-rc3.owrt/include/linux/slab_def.h
+--- linux-2.6.29.owrt/include/linux/slab_def.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/slab_def.h 2009-05-10 23:48:29.000000000 +0200
+@@ -43,7 +43,10 @@
+ i++;
+ #include <linux/kmalloc_sizes.h>
+ #undef CACHE
+- return NULL;
++ {
++ extern void __you_cannot_kmalloc_that_much(void);
++ __you_cannot_kmalloc_that_much();
++ }
+ found:
+ #ifdef CONFIG_ZONE_DMA
+ if (flags & GFP_DMA)
+@@ -74,7 +77,10 @@
+ i++;
+ #include <linux/kmalloc_sizes.h>
+ #undef CACHE
+- return NULL;
++ {
++ extern void __you_cannot_kmalloc_that_much(void);
++ __you_cannot_kmalloc_that_much();
++ }
+ found:
+ #ifdef CONFIG_ZONE_DMA
+ if (flags & GFP_DMA)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/slab.h linux-2.6.29-rc3.owrt/include/linux/slab.h
+--- linux-2.6.29.owrt/include/linux/slab.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/slab.h 2009-05-10 23:48:29.000000000 +0200
+@@ -127,7 +127,6 @@
+ void * __must_check __krealloc(const void *, size_t, gfp_t);
+ void * __must_check krealloc(const void *, size_t, gfp_t);
+ void kfree(const void *);
+-void kzfree(const void *);
+ size_t ksize(const void *);
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/soundcard.h linux-2.6.29-rc3.owrt/include/linux/soundcard.h
+--- linux-2.6.29.owrt/include/linux/soundcard.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/soundcard.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1045,36 +1045,50 @@
+ */
+ #define LOCL_STARTAUDIO 1
+
+-#if !defined(__KERNEL__) || defined(USE_SEQ_MACROS)
++#if (!defined(__KERNEL__) && !defined(KERNEL) && !defined(INKERNEL) && !defined(_KERNEL)) || defined(USE_SEQ_MACROS)
+ /*
+ * Some convenience macros to simplify programming of the
+ * /dev/sequencer interface
+ *
+- * This is a legacy interface for applications written against
+- * the OSSlib-3.8 style interface. It is no longer possible
+- * to actually link against OSSlib with this header, but we
+- * still provide these macros for programs using them.
+- *
+- * If you want to use OSSlib, it is recommended that you get
+- * the GPL version of OSS-4.x and build against that version
+- * of the header.
+- *
+- * We redefine the extern keyword so that make headers_check
+- * does not complain about SEQ_USE_EXTBUF.
++ * These macros define the API which should be used when possible.
+ */
+ #define SEQ_DECLAREBUF() SEQ_USE_EXTBUF()
+
+ void seqbuf_dump(void); /* This function must be provided by programs */
+
+-#define SEQ_PM_DEFINES int __foo_bar___
+-
+-#define SEQ_LOAD_GMINSTR(dev, instr)
+-#define SEQ_LOAD_GMDRUM(dev, drum)
++extern int OSS_init(int seqfd, int buflen);
++extern void OSS_seqbuf_dump(int fd, unsigned char *buf, int buflen);
++extern void OSS_seq_advbuf(int len, int fd, unsigned char *buf, int buflen);
++extern void OSS_seq_needbuf(int len, int fd, unsigned char *buf, int buflen);
++extern void OSS_patch_caching(int dev, int chn, int patch,
++ int fd, unsigned char *buf, int buflen);
++extern void OSS_drum_caching(int dev, int chn, int patch,
++ int fd, unsigned char *buf, int buflen);
++extern void OSS_write_patch(int fd, unsigned char *buf, int len);
++extern int OSS_write_patch2(int fd, unsigned char *buf, int len);
+
+-#define _SEQ_EXTERN extern
+-#define SEQ_USE_EXTBUF() \
+- _SEQ_EXTERN unsigned char _seqbuf[]; \
+- _SEQ_EXTERN int _seqbuflen; _SEQ_EXTERN int _seqbufptr
++#define SEQ_PM_DEFINES int __foo_bar___
++#ifdef OSSLIB
++# define SEQ_USE_EXTBUF() \
++ extern unsigned char *_seqbuf; \
++ extern int _seqbuflen;extern int _seqbufptr
++# define SEQ_DEFINEBUF(len) SEQ_USE_EXTBUF();static int _requested_seqbuflen=len
++# define _SEQ_ADVBUF(len) OSS_seq_advbuf(len, seqfd, _seqbuf, _seqbuflen)
++# define _SEQ_NEEDBUF(len) OSS_seq_needbuf(len, seqfd, _seqbuf, _seqbuflen)
++# define SEQ_DUMPBUF() OSS_seqbuf_dump(seqfd, _seqbuf, _seqbuflen)
++
++# define SEQ_LOAD_GMINSTR(dev, instr) \
++ OSS_patch_caching(dev, -1, instr, seqfd, _seqbuf, _seqbuflen)
++# define SEQ_LOAD_GMDRUM(dev, drum) \
++ OSS_drum_caching(dev, -1, drum, seqfd, _seqbuf, _seqbuflen)
++#else /* !OSSLIB */
++
++# define SEQ_LOAD_GMINSTR(dev, instr)
++# define SEQ_LOAD_GMDRUM(dev, drum)
++
++# define SEQ_USE_EXTBUF() \
++ extern unsigned char _seqbuf[]; \
++ extern int _seqbuflen;extern int _seqbufptr
+
+ #ifndef USE_SIMPLE_MACROS
+ /* Sample seqbuf_dump() implementation:
+@@ -1117,6 +1131,7 @@
+ */
+ #define _SEQ_NEEDBUF(len) /* empty */
+ #endif
++#endif /* !OSSLIB */
+
+ #define SEQ_VOLUME_MODE(dev, mode) {_SEQ_NEEDBUF(8);\
+ _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
+@@ -1200,8 +1215,14 @@
+ _CHN_COMMON(dev, MIDI_CHN_PRESSURE, chn, pressure, 0, 0)
+
+ #define SEQ_SET_PATCH SEQ_PGM_CHANGE
+-#define SEQ_PGM_CHANGE(dev, chn, patch) \
++#ifdef OSSLIB
++# define SEQ_PGM_CHANGE(dev, chn, patch) \
++ {OSS_patch_caching(dev, chn, patch, seqfd, _seqbuf, _seqbuflen); \
++ _CHN_COMMON(dev, MIDI_PGM_CHANGE, chn, patch, 0, 0);}
++#else
++# define SEQ_PGM_CHANGE(dev, chn, patch) \
+ _CHN_COMMON(dev, MIDI_PGM_CHANGE, chn, patch, 0, 0)
++#endif
+
+ #define SEQ_CONTROL(dev, chn, controller, value) \
+ _CHN_COMMON(dev, MIDI_CTL_CHANGE, chn, controller, 0, value)
+@@ -1279,12 +1300,19 @@
+ /*
+ * Patch loading.
+ */
+-#define SEQ_WRPATCH(patchx, len) \
++#ifdef OSSLIB
++# define SEQ_WRPATCH(patchx, len) \
++ OSS_write_patch(seqfd, (char*)(patchx), len)
++# define SEQ_WRPATCH2(patchx, len) \
++ OSS_write_patch2(seqfd, (char*)(patchx), len)
++#else
++# define SEQ_WRPATCH(patchx, len) \
+ {if (_seqbufptr) SEQ_DUMPBUF();\
+ if (write(seqfd, (char*)(patchx), len)==-1) \
+ perror("Write patch: /dev/sequencer");}
+-#define SEQ_WRPATCH2(patchx, len) \
++# define SEQ_WRPATCH2(patchx, len) \
+ (SEQ_DUMPBUF(), write(seqfd, (char*)(patchx), len))
++#endif
+
+ #endif
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/sound.h linux-2.6.29-rc3.owrt/include/linux/sound.h
+--- linux-2.6.29.owrt/include/linux/sound.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/sound.h 2009-05-10 23:48:29.000000000 +0200
+@@ -25,7 +25,6 @@
+ #define SND_DEV_AMIDI 13 /* Like /dev/midi (obsolete) */
+ #define SND_DEV_ADMMIDI 14 /* Like /dev/dmmidi (onsolete) */
+
+-#ifdef __KERNEL__
+ /*
+ * Sound core interface functions
+ */
+@@ -41,4 +40,3 @@
+ extern void unregister_sound_mixer(int unit);
+ extern void unregister_sound_midi(int unit);
+ extern void unregister_sound_dsp(int unit);
+-#endif /* __KERNEL__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/spi/spi_bitbang.h linux-2.6.29-rc3.owrt/include/linux/spi/spi_bitbang.h
+--- linux-2.6.29.owrt/include/linux/spi/spi_bitbang.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/spi/spi_bitbang.h 2009-05-10 23:48:29.000000000 +0200
+@@ -83,13 +83,6 @@
+ * int getmiso(struct spi_device *);
+ * void spidelay(unsigned);
+ *
+- * setsck()'s is_on parameter is a zero/nonzero boolean.
+- *
+- * setmosi()'s is_on parameter is a zero/nonzero boolean.
+- *
+- * getmiso() is required to return 0 or 1 only. Any other value is invalid
+- * and will result in improper operation.
+- *
+ * A non-inlined routine would call bitbang_txrx_*() routines. The
+ * main loop could easily compile down to a handful of instructions,
+ * especially if the delay is a NOP (to run at peak speed).
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/spi/spidev.h linux-2.6.29-rc3.owrt/include/linux/spi/spidev.h
+--- linux-2.6.29.owrt/include/linux/spi/spidev.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/spi/spidev.h 2009-05-10 23:48:29.000000000 +0200
+@@ -22,7 +22,6 @@
+ #ifndef SPIDEV_H
+ #define SPIDEV_H
+
+-#include <linux/types.h>
+
+ /* User space versions of kernel symbols for SPI clocking modes,
+ * matching <linux/spi/spi.h>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/spinlock.h linux-2.6.29-rc3.owrt/include/linux/spinlock.h
+--- linux-2.6.29.owrt/include/linux/spinlock.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/spinlock.h 2009-05-10 23:48:29.000000000 +0200
+@@ -124,12 +124,7 @@
+ #ifdef CONFIG_GENERIC_LOCKBREAK
+ #define spin_is_contended(lock) ((lock)->break_lock)
+ #else
+-
+-#ifdef __raw_spin_is_contended
+ #define spin_is_contended(lock) __raw_spin_is_contended(&(lock)->raw_lock)
+-#else
+-#define spin_is_contended(lock) (((void)(lock), 0))
+-#endif /*__raw_spin_is_contended*/
+ #endif
+
+ /**
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/synclink.h linux-2.6.29-rc3.owrt/include/linux/synclink.h
+--- linux-2.6.29.owrt/include/linux/synclink.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/synclink.h 2009-05-10 23:48:29.000000000 +0200
+@@ -13,8 +13,6 @@
+ #define _SYNCLINK_H_
+ #define SYNCLINK_H_VERSION 3.6
+
+-#include <linux/types.h>
+-
+ #define BIT0 0x0001
+ #define BIT1 0x0002
+ #define BIT2 0x0004
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/syscalls.h linux-2.6.29-rc3.owrt/include/linux/syscalls.h
+--- linux-2.6.29.owrt/include/linux/syscalls.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/syscalls.h 2009-05-10 23:48:29.000000000 +0200
+@@ -95,47 +95,42 @@
+ #define __SC_TEST5(t5, a5, ...) __SC_TEST(t5); __SC_TEST4(__VA_ARGS__)
+ #define __SC_TEST6(t6, a6, ...) __SC_TEST(t6); __SC_TEST5(__VA_ARGS__)
+
+-#define SYSCALL_DEFINE0(name) asmlinkage long sys_##name(void)
+-#define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
+-#define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
+-#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
+-#define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
+-#define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
+-#define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
++#define SYSCALL_DEFINE0(name) asmlinkage long sys_##name(void)
++#define SYSCALL_DEFINE1(...) SYSCALL_DEFINEx(1, __VA_ARGS__)
++#define SYSCALL_DEFINE2(...) SYSCALL_DEFINEx(2, __VA_ARGS__)
++#define SYSCALL_DEFINE3(...) SYSCALL_DEFINEx(3, __VA_ARGS__)
++#define SYSCALL_DEFINE4(...) SYSCALL_DEFINEx(4, __VA_ARGS__)
++#define SYSCALL_DEFINE5(...) SYSCALL_DEFINEx(5, __VA_ARGS__)
++#define SYSCALL_DEFINE6(...) SYSCALL_DEFINEx(6, __VA_ARGS__)
+
+ #ifdef CONFIG_PPC64
+ #define SYSCALL_ALIAS(alias, name) \
+ asm ("\t.globl " #alias "\n\t.set " #alias ", " #name "\n" \
+ "\t.globl ." #alias "\n\t.set ." #alias ", ." #name)
+ #else
+-#ifdef CONFIG_ALPHA
+-#define SYSCALL_ALIAS(alias, name) \
+- asm ( #alias " = " #name "\n\t.globl " #alias)
+-#else
+ #define SYSCALL_ALIAS(alias, name) \
+ asm ("\t.globl " #alias "\n\t.set " #alias ", " #name)
+ #endif
+-#endif
+
+ #ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
+
+ #define SYSCALL_DEFINE(name) static inline long SYSC_##name
+ #define SYSCALL_DEFINEx(x, name, ...) \
+- asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__)); \
+- static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__)); \
+- asmlinkage long SyS##name(__SC_LONG##x(__VA_ARGS__)) \
++ asmlinkage long sys_##name(__SC_DECL##x(__VA_ARGS__)); \
++ static inline long SYSC_##name(__SC_DECL##x(__VA_ARGS__)); \
++ asmlinkage long SyS_##name(__SC_LONG##x(__VA_ARGS__)) \
+ { \
+ __SC_TEST##x(__VA_ARGS__); \
+- return (long) SYSC##name(__SC_CAST##x(__VA_ARGS__)); \
++ return (long) SYSC_##name(__SC_CAST##x(__VA_ARGS__)); \
+ } \
+- SYSCALL_ALIAS(sys##name, SyS##name); \
+- static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__))
++ SYSCALL_ALIAS(sys_##name, SyS_##name); \
++ static inline long SYSC_##name(__SC_DECL##x(__VA_ARGS__))
+
+ #else /* CONFIG_HAVE_SYSCALL_WRAPPERS */
+
+ #define SYSCALL_DEFINE(name) asmlinkage long sys_##name
+ #define SYSCALL_DEFINEx(x, name, ...) \
+- asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))
++ asmlinkage long sys_##name(__SC_DECL##x(__VA_ARGS__))
+
+ #endif /* CONFIG_HAVE_SYSCALL_WRAPPERS */
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/taskstats.h linux-2.6.29-rc3.owrt/include/linux/taskstats.h
+--- linux-2.6.29.owrt/include/linux/taskstats.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/taskstats.h 2009-05-10 23:48:29.000000000 +0200
+@@ -16,8 +16,6 @@
+ #ifndef _LINUX_TASKSTATS_H
+ #define _LINUX_TASKSTATS_H
+
+-#include <linux/types.h>
+-
+ /* Format for per-task data returned to userland when
+ * - a task exits
+ * - listener requests stats for a task
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/tc_act/tc_gact.h linux-2.6.29-rc3.owrt/include/linux/tc_act/tc_gact.h
+--- linux-2.6.29.owrt/include/linux/tc_act/tc_gact.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/tc_act/tc_gact.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,6 @@
+ #ifndef __LINUX_TC_GACT_H
+ #define __LINUX_TC_GACT_H
+
+-#include <linux/types.h>
+ #include <linux/pkt_cls.h>
+
+ #define TCA_ACT_GACT 5
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/tc_act/tc_mirred.h linux-2.6.29-rc3.owrt/include/linux/tc_act/tc_mirred.h
+--- linux-2.6.29.owrt/include/linux/tc_act/tc_mirred.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/tc_act/tc_mirred.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,6 @@
+ #ifndef __LINUX_TC_MIR_H
+ #define __LINUX_TC_MIR_H
+
+-#include <linux/types.h>
+ #include <linux/pkt_cls.h>
+
+ #define TCA_ACT_MIRRED 8
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/tc_act/tc_pedit.h linux-2.6.29-rc3.owrt/include/linux/tc_act/tc_pedit.h
+--- linux-2.6.29.owrt/include/linux/tc_act/tc_pedit.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/tc_act/tc_pedit.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,6 @@
+ #ifndef __LINUX_TC_PED_H
+ #define __LINUX_TC_PED_H
+
+-#include <linux/types.h>
+ #include <linux/pkt_cls.h>
+
+ #define TCA_ACT_PEDIT 7
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/tc_ematch/tc_em_cmp.h linux-2.6.29-rc3.owrt/include/linux/tc_ematch/tc_em_cmp.h
+--- linux-2.6.29.owrt/include/linux/tc_ematch/tc_em_cmp.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/tc_ematch/tc_em_cmp.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,6 @@
+ #ifndef __LINUX_TC_EM_CMP_H
+ #define __LINUX_TC_EM_CMP_H
+
+-#include <linux/types.h>
+ #include <linux/pkt_cls.h>
+
+ struct tcf_em_cmp
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/tc_ematch/tc_em_meta.h linux-2.6.29-rc3.owrt/include/linux/tc_ematch/tc_em_meta.h
+--- linux-2.6.29.owrt/include/linux/tc_ematch/tc_em_meta.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/tc_ematch/tc_em_meta.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,6 @@
+ #ifndef __LINUX_TC_EM_META_H
+ #define __LINUX_TC_EM_META_H
+
+-#include <linux/types.h>
+ #include <linux/pkt_cls.h>
+
+ enum
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/tc_ematch/tc_em_nbyte.h linux-2.6.29-rc3.owrt/include/linux/tc_ematch/tc_em_nbyte.h
+--- linux-2.6.29.owrt/include/linux/tc_ematch/tc_em_nbyte.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/tc_ematch/tc_em_nbyte.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,6 @@
+ #ifndef __LINUX_TC_EM_NBYTE_H
+ #define __LINUX_TC_EM_NBYTE_H
+
+-#include <linux/types.h>
+ #include <linux/pkt_cls.h>
+
+ struct tcf_em_nbyte
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/tc_ematch/tc_em_text.h linux-2.6.29-rc3.owrt/include/linux/tc_ematch/tc_em_text.h
+--- linux-2.6.29.owrt/include/linux/tc_ematch/tc_em_text.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/tc_ematch/tc_em_text.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,7 +1,6 @@
+ #ifndef __LINUX_TC_EM_TEXT_H
+ #define __LINUX_TC_EM_TEXT_H
+
+-#include <linux/types.h>
+ #include <linux/pkt_cls.h>
+
+ #define TC_EM_TEXT_ALGOSIZ 16
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/timerfd.h linux-2.6.29-rc3.owrt/include/linux/timerfd.h
+--- linux-2.6.29.owrt/include/linux/timerfd.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/timerfd.h 2009-05-10 23:48:29.000000000 +0200
+@@ -11,21 +11,13 @@
+ /* For O_CLOEXEC and O_NONBLOCK */
+ #include <linux/fcntl.h>
+
+-/*
+- * CAREFUL: Check include/asm-generic/fcntl.h when defining
+- * new flags, since they might collide with O_* ones. We want
+- * to re-use O_* flags that couldn't possibly have a meaning
+- * from eventfd, in order to leave a free define-space for
+- * shared O_* flags.
+- */
++/* Flags for timerfd_settime. */
+ #define TFD_TIMER_ABSTIME (1 << 0)
++
++/* Flags for timerfd_create. */
+ #define TFD_CLOEXEC O_CLOEXEC
+ #define TFD_NONBLOCK O_NONBLOCK
+
+-#define TFD_SHARED_FCNTL_FLAGS (TFD_CLOEXEC | TFD_NONBLOCK)
+-/* Flags for timerfd_create. */
+-#define TFD_CREATE_FLAGS TFD_SHARED_FCNTL_FLAGS
+-/* Flags for timerfd_settime. */
+-#define TFD_SETTIME_FLAGS TFD_TIMER_ABSTIME
+
+ #endif /* _LINUX_TIMERFD_H */
++
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/usb/cdc.h linux-2.6.29-rc3.owrt/include/linux/usb/cdc.h
+--- linux-2.6.29.owrt/include/linux/usb/cdc.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/usb/cdc.h 2009-05-10 23:48:29.000000000 +0200
+@@ -9,8 +9,6 @@
+ #ifndef __LINUX_USB_CDC_H
+ #define __LINUX_USB_CDC_H
+
+-#include <linux/types.h>
+-
+ #define USB_CDC_SUBCLASS_ACM 0x02
+ #define USB_CDC_SUBCLASS_ETHERNET 0x06
+ #define USB_CDC_SUBCLASS_WHCM 0x08
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/usb/gadgetfs.h linux-2.6.29-rc3.owrt/include/linux/usb/gadgetfs.h
+--- linux-2.6.29.owrt/include/linux/usb/gadgetfs.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/usb/gadgetfs.h 2009-05-10 23:48:29.000000000 +0200
+@@ -18,7 +18,7 @@
+ #ifndef __LINUX_USB_GADGETFS_H
+ #define __LINUX_USB_GADGETFS_H
+
+-#include <linux/types.h>
++#include <asm/types.h>
+ #include <asm/ioctl.h>
+
+ #include <linux/usb/ch9.h>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/user_namespace.h linux-2.6.29-rc3.owrt/include/linux/user_namespace.h
+--- linux-2.6.29.owrt/include/linux/user_namespace.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/user_namespace.h 2009-05-10 23:48:29.000000000 +0200
+@@ -13,7 +13,6 @@
+ struct kref kref;
+ struct hlist_head uidhash_table[UIDHASH_SZ];
+ struct user_struct *creator;
+- struct work_struct destroyer;
+ };
+
+ extern struct user_namespace init_user_ns;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/video_decoder.h linux-2.6.29-rc3.owrt/include/linux/video_decoder.h
+--- linux-2.6.29.owrt/include/linux/video_decoder.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/video_decoder.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,8 +1,6 @@
+ #ifndef _LINUX_VIDEO_DECODER_H
+ #define _LINUX_VIDEO_DECODER_H
+
+-#include <linux/types.h>
+-
+ #define HAVE_VIDEO_DECODER 1
+
+ struct video_decoder_capability { /* this name is too long */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/videodev.h linux-2.6.29-rc3.owrt/include/linux/videodev.h
+--- linux-2.6.29.owrt/include/linux/videodev.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/videodev.h 2009-05-10 23:48:29.000000000 +0200
+@@ -12,7 +12,6 @@
+ #ifndef __LINUX_VIDEODEV_H
+ #define __LINUX_VIDEODEV_H
+
+-#include <linux/types.h>
+ #include <linux/ioctl.h>
+ #include <linux/videodev2.h>
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/video_encoder.h linux-2.6.29-rc3.owrt/include/linux/video_encoder.h
+--- linux-2.6.29.owrt/include/linux/video_encoder.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/video_encoder.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,8 +1,6 @@
+ #ifndef _LINUX_VIDEO_ENCODER_H
+ #define _LINUX_VIDEO_ENCODER_H
+
+-#include <linux/types.h>
+-
+ struct video_encoder_capability { /* this name is too long */
+ __u32 flags;
+ #define VIDEO_ENCODER_PAL 1 /* can encode PAL signal */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/virtio_blk.h linux-2.6.29-rc3.owrt/include/linux/virtio_blk.h
+--- linux-2.6.29.owrt/include/linux/virtio_blk.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/virtio_blk.h 2009-05-10 23:48:29.000000000 +0200
+@@ -2,7 +2,6 @@
+ #define _LINUX_VIRTIO_BLK_H
+ /* This header is BSD licensed so anyone can use the definitions to implement
+ * compatible drivers/servers. */
+-#include <linux/types.h>
+ #include <linux/virtio_config.h>
+
+ /* The ID for virtio_block */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/virtio_console.h linux-2.6.29-rc3.owrt/include/linux/virtio_console.h
+--- linux-2.6.29.owrt/include/linux/virtio_console.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/virtio_console.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,6 +1,5 @@
+ #ifndef _LINUX_VIRTIO_CONSOLE_H
+ #define _LINUX_VIRTIO_CONSOLE_H
+-#include <linux/types.h>
+ #include <linux/virtio_config.h>
+ /* This header, excluding the #ifdef __KERNEL__ part, is BSD licensed so
+ * anyone can use the definitions to implement compatible drivers/servers. */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/virtio_net.h linux-2.6.29-rc3.owrt/include/linux/virtio_net.h
+--- linux-2.6.29.owrt/include/linux/virtio_net.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/virtio_net.h 2009-05-10 23:48:29.000000000 +0200
+@@ -2,7 +2,6 @@
+ #define _LINUX_VIRTIO_NET_H
+ /* This header is BSD licensed so anyone can use the definitions to implement
+ * compatible drivers/servers. */
+-#include <linux/types.h>
+ #include <linux/virtio_config.h>
+
+ /* The ID for virtio_net */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/vmalloc.h linux-2.6.29-rc3.owrt/include/linux/vmalloc.h
+--- linux-2.6.29.owrt/include/linux/vmalloc.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/vmalloc.h 2009-05-10 23:48:29.000000000 +0200
+@@ -84,10 +84,6 @@
+ unsigned long flags, void *caller);
+ extern struct vm_struct *__get_vm_area(unsigned long size, unsigned long flags,
+ unsigned long start, unsigned long end);
+-extern struct vm_struct *__get_vm_area_caller(unsigned long size,
+- unsigned long flags,
+- unsigned long start, unsigned long end,
+- void *caller);
+ extern struct vm_struct *get_vm_area_node(unsigned long size,
+ unsigned long flags, int node,
+ gfp_t gfp_mask);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/linux/wait.h linux-2.6.29-rc3.owrt/include/linux/wait.h
+--- linux-2.6.29.owrt/include/linux/wait.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/linux/wait.h 2009-05-10 23:48:29.000000000 +0200
+@@ -132,8 +132,6 @@
+ list_del(&old->task_list);
+ }
+
+-void __wake_up_common(wait_queue_head_t *q, unsigned int mode,
+- int nr_exclusive, int sync, void *key);
+ void __wake_up(wait_queue_head_t *q, unsigned int mode, int nr, void *key);
+ extern void __wake_up_locked(wait_queue_head_t *q, unsigned int mode);
+ extern void __wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr);
+@@ -335,19 +333,16 @@
+ for (;;) { \
+ prepare_to_wait_exclusive(&wq, &__wait, \
+ TASK_INTERRUPTIBLE); \
+- if (condition) { \
+- finish_wait(&wq, &__wait); \
++ if (condition) \
+ break; \
+- } \
+ if (!signal_pending(current)) { \
+ schedule(); \
+ continue; \
+ } \
+ ret = -ERESTARTSYS; \
+- abort_exclusive_wait(&wq, &__wait, \
+- TASK_INTERRUPTIBLE, NULL); \
+ break; \
+ } \
++ finish_wait(&wq, &__wait); \
+ } while (0)
+
+ #define wait_event_interruptible_exclusive(wq, condition) \
+@@ -436,8 +431,6 @@
+ void prepare_to_wait(wait_queue_head_t *q, wait_queue_t *wait, int state);
+ void prepare_to_wait_exclusive(wait_queue_head_t *q, wait_queue_t *wait, int state);
+ void finish_wait(wait_queue_head_t *q, wait_queue_t *wait);
+-void abort_exclusive_wait(wait_queue_head_t *q, wait_queue_t *wait,
+- unsigned int mode, void *key);
+ int autoremove_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key);
+ int wake_bit_function(wait_queue_t *wait, unsigned mode, int sync, void *key);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/media/v4l2-device.h linux-2.6.29-rc3.owrt/include/media/v4l2-device.h
+--- linux-2.6.29.owrt/include/media/v4l2-device.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/media/v4l2-device.h 2009-05-10 23:48:29.000000000 +0200
+@@ -94,16 +94,16 @@
+ /* Call the specified callback for all subdevs matching grp_id (if 0, then
+ match them all). Ignore any errors. Note that you cannot add or delete
+ a subdev while walking the subdevs list. */
+-#define v4l2_device_call_all(dev, grpid, o, f, args...) \
++#define v4l2_device_call_all(dev, grp_id, o, f, args...) \
+ __v4l2_device_call_subdevs(dev, \
+- !(grpid) || sd->grp_id == (grpid), o, f , ##args)
++ !(grp_id) || sd->grp_id == (grp_id), o, f , ##args)
+
+ /* Call the specified callback for all subdevs matching grp_id (if 0, then
+ match them all). If the callback returns an error other than 0 or
+ -ENOIOCTLCMD, then return with that error code. Note that you cannot
+ add or delete a subdev while walking the subdevs list. */
+-#define v4l2_device_call_until_err(dev, grpid, o, f, args...) \
++#define v4l2_device_call_until_err(dev, grp_id, o, f, args...) \
+ __v4l2_device_call_subdevs_until_err(dev, \
+- !(grpid) || sd->grp_id == (grpid), o, f , ##args)
++ !(grp_id) || sd->grp_id == (grp_id), o, f , ##args)
+
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/media/videobuf-dma-sg.h linux-2.6.29-rc3.owrt/include/media/videobuf-dma-sg.h
+--- linux-2.6.29.owrt/include/media/videobuf-dma-sg.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/media/videobuf-dma-sg.h 2009-05-10 23:48:29.000000000 +0200
+@@ -49,7 +49,7 @@
+ * does memory allocation too using vmalloc_32().
+ *
+ * videobuf_dma_*()
+- * see Documentation/PCI/PCI-DMA-mapping.txt, these functions to
++ * see Documentation/DMA-mapping.txt, these functions to
+ * basically the same. The map function does also build a
+ * scatterlist for the buffer (and unmap frees it ...)
+ *
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/mtd/inftl-user.h linux-2.6.29-rc3.owrt/include/mtd/inftl-user.h
+--- linux-2.6.29.owrt/include/mtd/inftl-user.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/mtd/inftl-user.h 2009-05-10 23:48:29.000000000 +0200
+@@ -6,8 +6,6 @@
+ #ifndef __MTD_INFTL_USER_H__
+ #define __MTD_INFTL_USER_H__
+
+-#include <linux/types.h>
+-
+ #define OSAK_VERSION 0x5120
+ #define PERCENTUSED 98
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/mtd/ubi-user.h linux-2.6.29-rc3.owrt/include/mtd/ubi-user.h
+--- linux-2.6.29.owrt/include/mtd/ubi-user.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/mtd/ubi-user.h 2009-05-10 23:48:29.000000000 +0200
+@@ -40,37 +40,37 @@
+ * UBI volume creation
+ * ~~~~~~~~~~~~~~~~~~~
+ *
+- * UBI volumes are created via the %UBI_IOCMKVOL ioctl command of UBI character
++ * UBI volumes are created via the %UBI_IOCMKVOL IOCTL command of UBI character
+ * device. A &struct ubi_mkvol_req object has to be properly filled and a
+- * pointer to it has to be passed to the ioctl.
++ * pointer to it has to be passed to the IOCTL.
+ *
+ * UBI volume deletion
+ * ~~~~~~~~~~~~~~~~~~~
+ *
+- * To delete a volume, the %UBI_IOCRMVOL ioctl command of the UBI character
++ * To delete a volume, the %UBI_IOCRMVOL IOCTL command of the UBI character
+ * device should be used. A pointer to the 32-bit volume ID hast to be passed
+- * to the ioctl.
++ * to the IOCTL.
+ *
+ * UBI volume re-size
+ * ~~~~~~~~~~~~~~~~~~
+ *
+- * To re-size a volume, the %UBI_IOCRSVOL ioctl command of the UBI character
++ * To re-size a volume, the %UBI_IOCRSVOL IOCTL command of the UBI character
+ * device should be used. A &struct ubi_rsvol_req object has to be properly
+- * filled and a pointer to it has to be passed to the ioctl.
++ * filled and a pointer to it has to be passed to the IOCTL.
+ *
+ * UBI volumes re-name
+ * ~~~~~~~~~~~~~~~~~~~
+ *
+ * To re-name several volumes atomically at one go, the %UBI_IOCRNVOL command
+ * of the UBI character device should be used. A &struct ubi_rnvol_req object
+- * has to be properly filled and a pointer to it has to be passed to the ioctl.
++ * has to be properly filled and a pointer to it has to be passed to the IOCTL.
+ *
+ * UBI volume update
+ * ~~~~~~~~~~~~~~~~~
+ *
+- * Volume update should be done via the %UBI_IOCVOLUP ioctl command of the
++ * Volume update should be done via the %UBI_IOCVOLUP IOCTL command of the
+ * corresponding UBI volume character device. A pointer to a 64-bit update
+- * size should be passed to the ioctl. After this, UBI expects user to write
++ * size should be passed to the IOCTL. After this, UBI expects user to write
+ * this number of bytes to the volume character device. The update is finished
+ * when the claimed number of bytes is passed. So, the volume update sequence
+ * is something like:
+@@ -80,58 +80,14 @@
+ * write(fd, buf, image_size);
+ * close(fd);
+ *
+- * Logical eraseblock erase
++ * Atomic eraseblock change
+ * ~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+- * To erase a logical eraseblock, the %UBI_IOCEBER ioctl command of the
+- * corresponding UBI volume character device should be used. This command
+- * unmaps the requested logical eraseblock, makes sure the corresponding
+- * physical eraseblock is successfully erased, and returns.
+- *
+- * Atomic logical eraseblock change
+- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+- *
+- * Atomic logical eraseblock change operation is called using the %UBI_IOCEBCH
+- * ioctl command of the corresponding UBI volume character device. A pointer to
+- * a &struct ubi_leb_change_req object has to be passed to the ioctl. Then the
+- * user is expected to write the requested amount of bytes (similarly to what
+- * should be done in case of the "volume update" ioctl).
+- *
+- * Logical eraseblock map
+- * ~~~~~~~~~~~~~~~~~~~~~
+- *
+- * To map a logical eraseblock to a physical eraseblock, the %UBI_IOCEBMAP
+- * ioctl command should be used. A pointer to a &struct ubi_map_req object is
+- * expected to be passed. The ioctl maps the requested logical eraseblock to
+- * a physical eraseblock and returns. Only non-mapped logical eraseblocks can
+- * be mapped. If the logical eraseblock specified in the request is already
+- * mapped to a physical eraseblock, the ioctl fails and returns error.
+- *
+- * Logical eraseblock unmap
+- * ~~~~~~~~~~~~~~~~~~~~~~~~
+- *
+- * To unmap a logical eraseblock to a physical eraseblock, the %UBI_IOCEBUNMAP
+- * ioctl command should be used. The ioctl unmaps the logical eraseblocks,
+- * schedules corresponding physical eraseblock for erasure, and returns. Unlike
+- * the "LEB erase" command, it does not wait for the physical eraseblock being
+- * erased. Note, the side effect of this is that if an unclean reboot happens
+- * after the unmap ioctl returns, you may find the LEB mapped again to the same
+- * physical eraseblock after the UBI is run again.
+- *
+- * Check if logical eraseblock is mapped
+- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+- *
+- * To check if a logical eraseblock is mapped to a physical eraseblock, the
+- * %UBI_IOCEBISMAP ioctl command should be used. It returns %0 if the LEB is
+- * not mapped, and %1 if it is mapped.
+- *
+- * Set an UBI volume property
+- * ~~~~~~~~~~~~~~~~~~~~~~~~~
+- *
+- * To set an UBI volume property the %UBI_IOCSETPROP ioctl command should be
+- * used. A pointer to a &struct ubi_set_prop_req object is expected to be
+- * passed. The object describes which property should be set, and to which value
+- * it should be set.
++ * Atomic eraseblock change operation is done via the %UBI_IOCEBCH IOCTL
++ * command of the corresponding UBI volume character device. A pointer to
++ * &struct ubi_leb_change_req has to be passed to the IOCTL. Then the user is
++ * expected to write the requested amount of bytes. This is similar to the
++ * "volume update" IOCTL.
+ */
+
+ /*
+@@ -145,7 +101,7 @@
+ /* Maximum volume name length */
+ #define UBI_MAX_VOLUME_NAME 127
+
+-/* ioctl commands of UBI character devices */
++/* IOCTL commands of UBI character devices */
+
+ #define UBI_IOC_MAGIC 'o'
+
+@@ -158,7 +114,7 @@
+ /* Re-name volumes */
+ #define UBI_IOCRNVOL _IOW(UBI_IOC_MAGIC, 3, struct ubi_rnvol_req)
+
+-/* ioctl commands of the UBI control character device */
++/* IOCTL commands of the UBI control character device */
+
+ #define UBI_CTRL_IOC_MAGIC 'o'
+
+@@ -167,24 +123,16 @@
+ /* Detach an MTD device */
+ #define UBI_IOCDET _IOW(UBI_CTRL_IOC_MAGIC, 65, int32_t)
+
+-/* ioctl commands of UBI volume character devices */
++/* IOCTL commands of UBI volume character devices */
+
+ #define UBI_VOL_IOC_MAGIC 'O'
+
+ /* Start UBI volume update */
+ #define UBI_IOCVOLUP _IOW(UBI_VOL_IOC_MAGIC, 0, int64_t)
+-/* LEB erasure command, used for debugging, disabled by default */
++/* An eraseblock erasure command, used for debugging, disabled by default */
+ #define UBI_IOCEBER _IOW(UBI_VOL_IOC_MAGIC, 1, int32_t)
+-/* Atomic LEB change command */
++/* An atomic eraseblock change command */
+ #define UBI_IOCEBCH _IOW(UBI_VOL_IOC_MAGIC, 2, int32_t)
+-/* Map LEB command */
+-#define UBI_IOCEBMAP _IOW(UBI_VOL_IOC_MAGIC, 3, struct ubi_map_req)
+-/* Unmap LEB command */
+-#define UBI_IOCEBUNMAP _IOW(UBI_VOL_IOC_MAGIC, 4, int32_t)
+-/* Check if LEB is mapped command */
+-#define UBI_IOCEBISMAP _IOR(UBI_VOL_IOC_MAGIC, 5, int32_t)
+-/* Set an UBI volume property */
+-#define UBI_IOCSETPROP _IOW(UBI_VOL_IOC_MAGIC, 6, struct ubi_set_prop_req)
+
+ /* Maximum MTD device name length supported by UBI */
+ #define MAX_UBI_MTD_NAME_LEN 127
+@@ -220,16 +168,6 @@
+ UBI_STATIC_VOLUME = 4,
+ };
+
+-/*
+- * UBI set property ioctl constants
+- *
+- * @UBI_PROP_DIRECT_WRITE: allow / disallow user to directly write and
+- * erase individual eraseblocks on dynamic volumes
+- */
+-enum {
+- UBI_PROP_DIRECT_WRITE = 1,
+-};
+-
+ /**
+ * struct ubi_attach_req - attach MTD device request.
+ * @ubi_num: UBI device number to create
+@@ -367,8 +305,8 @@
+ } __attribute__ ((packed));
+
+ /**
+- * struct ubi_leb_change_req - a data structure used in atomic LEB change
+- * requests.
++ * struct ubi_leb_change_req - a data structure used in atomic logical
++ * eraseblock change requests.
+ * @lnum: logical eraseblock number to change
+ * @bytes: how many bytes will be written to the logical eraseblock
+ * @dtype: data type (%UBI_LONGTERM, %UBI_SHORTTERM, %UBI_UNKNOWN)
+@@ -381,30 +319,4 @@
+ int8_t padding[7];
+ } __attribute__ ((packed));
+
+-/**
+- * struct ubi_map_req - a data structure used in map LEB requests.
+- * @lnum: logical eraseblock number to unmap
+- * @dtype: data type (%UBI_LONGTERM, %UBI_SHORTTERM, %UBI_UNKNOWN)
+- * @padding: reserved for future, not used, has to be zeroed
+- */
+-struct ubi_map_req {
+- int32_t lnum;
+- int8_t dtype;
+- int8_t padding[3];
+-} __attribute__ ((packed));
+-
+-
+-/**
+- * struct ubi_set_prop_req - a data structure used to set an ubi volume
+- * property.
+- * @property: property to set (%UBI_PROP_DIRECT_WRITE)
+- * @padding: reserved for future, not used, has to be zeroed
+- * @value: value to set
+- */
+-struct ubi_set_prop_req {
+- uint8_t property;
+- uint8_t padding[7];
+- uint64_t value;
+-} __attribute__ ((packed));
+-
+ #endif /* __UBI_USER_H__ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/net/inet_hashtables.h linux-2.6.29-rc3.owrt/include/net/inet_hashtables.h
+--- linux-2.6.29.owrt/include/net/inet_hashtables.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/net/inet_hashtables.h 2009-05-10 23:48:29.000000000 +0200
+@@ -182,7 +182,7 @@
+ size = 2048;
+ if (nr_pcpus >= 32)
+ size = 4096;
+- if (sizeof(spinlock_t) != 0) {
++ if (sizeof(rwlock_t) != 0) {
+ #ifdef CONFIG_NUMA
+ if (size * sizeof(spinlock_t) > PAGE_SIZE)
+ hashinfo->ehash_locks = vmalloc(size * sizeof(spinlock_t));
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/net/netfilter/nf_conntrack_core.h linux-2.6.29-rc3.owrt/include/net/netfilter/nf_conntrack_core.h
+--- linux-2.6.29.owrt/include/net/netfilter/nf_conntrack_core.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/net/netfilter/nf_conntrack_core.h 2009-05-10 23:48:29.000000000 +0200
+@@ -59,11 +59,10 @@
+ struct nf_conn *ct = (struct nf_conn *)skb->nfct;
+ int ret = NF_ACCEPT;
+
+- if (ct && ct != &nf_conntrack_untracked) {
++ if (ct) {
+ if (!nf_ct_is_confirmed(ct) && !nf_ct_is_dying(ct))
+ ret = __nf_conntrack_confirm(skb);
+- if (likely(ret == NF_ACCEPT))
+- nf_ct_deliver_cached_events(ct);
++ nf_ct_deliver_cached_events(ct);
+ }
+ return ret;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/net/net_namespace.h linux-2.6.29-rc3.owrt/include/net/net_namespace.h
+--- linux-2.6.29.owrt/include/net/net_namespace.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/net/net_namespace.h 2009-05-10 23:48:29.000000000 +0200
+@@ -109,6 +109,11 @@
+ #ifdef CONFIG_NET_NS
+ extern void __put_net(struct net *net);
+
++static inline int net_alive(struct net *net)
++{
++ return net && atomic_read(&net->count);
++}
++
+ static inline struct net *get_net(struct net *net)
+ {
+ atomic_inc(&net->count);
+@@ -140,6 +145,11 @@
+ }
+ #else
+
++static inline int net_alive(struct net *net)
++{
++ return 1;
++}
++
+ static inline struct net *get_net(struct net *net)
+ {
+ return net;
+@@ -224,23 +234,6 @@
+ void (*exit)(struct net *net);
+ };
+
+-/*
+- * Use these carefully. If you implement a network device and it
+- * needs per network namespace operations use device pernet operations,
+- * otherwise use pernet subsys operations.
+- *
+- * This is critically important. Most of the network code cleanup
+- * runs with the assumption that dev_remove_pack has been called so no
+- * new packets will arrive during and after the cleanup functions have
+- * been called. dev_remove_pack is not per namespace so instead the
+- * guarantee of no more packets arriving in a network namespace is
+- * provided by ensuring that all network devices and all sockets have
+- * left the network namespace before the cleanup methods are called.
+- *
+- * For the longest time the ipv4 icmp code was registered as a pernet
+- * device which caused kernel oops, and panics during network
+- * namespace cleanup. So please don't get this wrong.
+- */
+ extern int register_pernet_subsys(struct pernet_operations *);
+ extern void unregister_pernet_subsys(struct pernet_operations *);
+ extern int register_pernet_gen_subsys(int *id, struct pernet_operations *);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/net/sock.h linux-2.6.29-rc3.owrt/include/net/sock.h
+--- linux-2.6.29.owrt/include/net/sock.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/net/sock.h 2009-05-10 23:48:29.000000000 +0200
+@@ -860,6 +860,7 @@
+
+ static inline void sk_wmem_free_skb(struct sock *sk, struct sk_buff *skb)
+ {
++ skb_truesize_check(skb);
+ sock_set_flag(sk, SOCK_QUEUE_SHRUNK);
+ sk->sk_wmem_queued -= skb->truesize;
+ sk_mem_uncharge(sk, skb->truesize);
+@@ -1307,7 +1308,7 @@
+
+ static inline gfp_t gfp_any(void)
+ {
+- return in_softirq() ? GFP_ATOMIC : GFP_KERNEL;
++ return in_atomic() ? GFP_ATOMIC : GFP_KERNEL;
+ }
+
+ static inline long sock_rcvtimeo(const struct sock *sk, int noblock)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/scsi/fc/fc_fcoe.h linux-2.6.29-rc3.owrt/include/scsi/fc/fc_fcoe.h
+--- linux-2.6.29.owrt/include/scsi/fc/fc_fcoe.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/scsi/fc/fc_fcoe.h 2009-05-10 23:48:29.000000000 +0200
+@@ -31,6 +31,10 @@
+ #define ETH_P_FCOE 0x8906 /* FCOE ether type */
+ #endif
+
++#ifndef ETH_P_8021Q
++#define ETH_P_8021Q 0x8100
++#endif
++
+ /*
+ * FC_FCOE_OUI hasn't been standardized yet. XXX TBD.
+ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/scsi/fc/fc_fs.h linux-2.6.29-rc3.owrt/include/scsi/fc/fc_fs.h
+--- linux-2.6.29.owrt/include/scsi/fc/fc_fs.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/scsi/fc/fc_fs.h 2009-05-10 23:48:29.000000000 +0200
+@@ -337,9 +337,4 @@
+ FC_RJT_VENDOR = 0xff, /* vendor specific reject */
+ };
+
+-/* default timeout values */
+-
+-#define FC_DEF_E_D_TOV 2000UL
+-#define FC_DEF_R_A_TOV 10000UL
+-
+ #endif /* _FC_FS_H_ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/scsi/libfc.h linux-2.6.29-rc3.owrt/include/scsi/libfc.h
+--- linux-2.6.29.owrt/include/scsi/libfc.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/scsi/libfc.h 2009-05-10 23:48:29.000000000 +0200
+@@ -68,6 +68,9 @@
+ /*
+ * FC HBA status
+ */
++#define FC_PAUSE (1 << 1)
++#define FC_LINK_UP (1 << 0)
++
+ enum fc_lport_state {
+ LPORT_ST_NONE = 0,
+ LPORT_ST_FLOGI,
+@@ -336,17 +339,31 @@
+
+ struct libfc_function_template {
+
++ /**
++ * Mandatory Fields
++ *
++ * These handlers must be implemented by the LLD.
++ */
++
+ /*
+ * Interface to send a FC frame
+- *
+- * STATUS: REQUIRED
+ */
+ int (*frame_send)(struct fc_lport *lp, struct fc_frame *fp);
+
+- /*
+- * Interface to send ELS/CT frames
++ /**
++ * Optional Fields
+ *
+- * STATUS: OPTIONAL
++ * The LLD may choose to implement any of the following handlers.
++ * If LLD doesn't specify hander and leaves its pointer NULL then
++ * the default libfc function will be used for that handler.
++ */
++
++ /**
++ * ELS/CT interfaces
++ */
++
++ /*
++ * elsct_send - sends ELS/CT frame
+ */
+ struct fc_seq *(*elsct_send)(struct fc_lport *lport,
+ struct fc_rport *rport,
+@@ -356,6 +373,9 @@
+ struct fc_frame *fp,
+ void *arg),
+ void *arg, u32 timer_msec);
++ /**
++ * Exhance Manager interfaces
++ */
+
+ /*
+ * Send the FC frame payload using a new exchange and sequence.
+@@ -387,8 +407,6 @@
+ * timer_msec argument is specified. The timer is canceled when
+ * it fires or when the exchange is done. The exchange timeout handler
+ * is registered by EM layer.
+- *
+- * STATUS: OPTIONAL
+ */
+ struct fc_seq *(*exch_seq_send)(struct fc_lport *lp,
+ struct fc_frame *fp,
+@@ -400,18 +418,14 @@
+ void *arg, unsigned int timer_msec);
+
+ /*
+- * Send a frame using an existing sequence and exchange.
+- *
+- * STATUS: OPTIONAL
++ * send a frame using existing sequence and exchange.
+ */
+ int (*seq_send)(struct fc_lport *lp, struct fc_seq *sp,
+ struct fc_frame *fp);
+
+ /*
+- * Send an ELS response using infomation from a previous
+- * exchange and sequence.
+- *
+- * STATUS: OPTIONAL
++ * Send ELS response using mainly infomation
++ * in exchange and sequence in EM layer.
+ */
+ void (*seq_els_rsp_send)(struct fc_seq *sp, enum fc_els_cmd els_cmd,
+ struct fc_seq_els_data *els_data);
+@@ -423,8 +437,6 @@
+ * A timer_msec can be specified for abort timeout, if non-zero
+ * timer_msec value is specified then exchange resp handler
+ * will be called with timeout error if no response to abort.
+- *
+- * STATUS: OPTIONAL
+ */
+ int (*seq_exch_abort)(const struct fc_seq *req_sp,
+ unsigned int timer_msec);
+@@ -432,8 +444,6 @@
+ /*
+ * Indicate that an exchange/sequence tuple is complete and the memory
+ * allocated for the related objects may be freed.
+- *
+- * STATUS: OPTIONAL
+ */
+ void (*exch_done)(struct fc_seq *sp);
+
+@@ -441,8 +451,6 @@
+ * Assigns a EM and a free XID for an new exchange and then
+ * allocates a new exchange and sequence pair.
+ * The fp can be used to determine free XID.
+- *
+- * STATUS: OPTIONAL
+ */
+ struct fc_exch *(*exch_get)(struct fc_lport *lp, struct fc_frame *fp);
+
+@@ -450,16 +458,12 @@
+ * Release previously assigned XID by exch_get API.
+ * The LLD may implement this if XID is assigned by LLD
+ * in exch_get().
+- *
+- * STATUS: OPTIONAL
+ */
+ void (*exch_put)(struct fc_lport *lp, struct fc_exch_mgr *mp,
+ u16 ex_id);
+
+ /*
+ * Start a new sequence on the same exchange/sequence tuple.
+- *
+- * STATUS: OPTIONAL
+ */
+ struct fc_seq *(*seq_start_next)(struct fc_seq *sp);
+
+@@ -467,38 +471,26 @@
+ * Reset an exchange manager, completing all sequences and exchanges.
+ * If s_id is non-zero, reset only exchanges originating from that FID.
+ * If d_id is non-zero, reset only exchanges sending to that FID.
+- *
+- * STATUS: OPTIONAL
+ */
+- void (*exch_mgr_reset)(struct fc_lport *,
++ void (*exch_mgr_reset)(struct fc_exch_mgr *,
+ u32 s_id, u32 d_id);
+
+- /*
+- * Flush the rport work queue. Generally used before shutdown.
+- *
+- * STATUS: OPTIONAL
+- */
+ void (*rport_flush_queue)(void);
++ /**
++ * Local Port interfaces
++ */
+
+ /*
+- * Receive a frame for a local port.
+- *
+- * STATUS: OPTIONAL
++ * Receive a frame to a local port.
+ */
+ void (*lport_recv)(struct fc_lport *lp, struct fc_seq *sp,
+ struct fc_frame *fp);
+
+- /*
+- * Reset the local port.
+- *
+- * STATUS: OPTIONAL
+- */
+ int (*lport_reset)(struct fc_lport *);
+
+- /*
+- * Create a remote port
++ /**
++ * Remote Port interfaces
+ */
+- struct fc_rport *(*rport_create)(struct fc_disc_port *);
+
+ /*
+ * Initiates the RP state machine. It is called from the LP module.
+@@ -508,72 +500,57 @@
+ * - PLOGI
+ * - PRLI
+ * - RTV
+- *
+- * STATUS: OPTIONAL
+ */
+ int (*rport_login)(struct fc_rport *rport);
+
+ /*
+ * Logoff, and remove the rport from the transport if
+ * it had been added. This will send a LOGO to the target.
+- *
+- * STATUS: OPTIONAL
+ */
+ int (*rport_logoff)(struct fc_rport *rport);
+
+ /*
+ * Recieve a request from a remote port.
+- *
+- * STATUS: OPTIONAL
+ */
+ void (*rport_recv_req)(struct fc_seq *, struct fc_frame *,
+ struct fc_rport *);
+
+- /*
+- * lookup an rport by it's port ID.
+- *
+- * STATUS: OPTIONAL
+- */
+ struct fc_rport *(*rport_lookup)(const struct fc_lport *, u32);
+
++ /**
++ * FCP interfaces
++ */
++
+ /*
+ * Send a fcp cmd from fsp pkt.
+ * Called with the SCSI host lock unlocked and irqs disabled.
+ *
+ * The resp handler is called when FCP_RSP received.
+ *
+- * STATUS: OPTIONAL
+ */
+ int (*fcp_cmd_send)(struct fc_lport *lp, struct fc_fcp_pkt *fsp,
+ void (*resp)(struct fc_seq *, struct fc_frame *fp,
+ void *arg));
+
+ /*
+- * Cleanup the FCP layer, used durring link down and reset
+- *
+- * STATUS: OPTIONAL
++ * Used at least durring linkdown and reset
+ */
+ void (*fcp_cleanup)(struct fc_lport *lp);
+
+ /*
+ * Abort all I/O on a local port
+- *
+- * STATUS: OPTIONAL
+ */
+ void (*fcp_abort_io)(struct fc_lport *lp);
+
+- /*
+- * Receive a request for the discovery layer.
+- *
+- * STATUS: OPTIONAL
++ /**
++ * Discovery interfaces
+ */
++
+ void (*disc_recv_req)(struct fc_seq *,
+ struct fc_frame *, struct fc_lport *);
+
+ /*
+ * Start discovery for a local port.
+- *
+- * STATUS: OPTIONAL
+ */
+ void (*disc_start)(void (*disc_callback)(struct fc_lport *,
+ enum fc_disc_event),
+@@ -582,8 +559,6 @@
+ /*
+ * Stop discovery for a given lport. This will remove
+ * all discovered rports
+- *
+- * STATUS: OPTIONAL
+ */
+ void (*disc_stop) (struct fc_lport *);
+
+@@ -591,8 +566,6 @@
+ * Stop discovery for a given lport. This will block
+ * until all discovered rports are deleted from the
+ * FC transport class
+- *
+- * STATUS: OPTIONAL
+ */
+ void (*disc_stop_final) (struct fc_lport *);
+ };
+@@ -630,8 +603,7 @@
+
+ /* Operational Information */
+ struct libfc_function_template tt;
+- u8 link_up;
+- u8 qfull;
++ u16 link_status;
+ enum fc_lport_state state;
+ unsigned long boot_time;
+
+@@ -665,7 +637,7 @@
+ struct delayed_work disc_work;
+ };
+
+-/*
++/**
+ * FC_LPORT HELPER FUNCTIONS
+ *****************************/
+ static inline void *lport_priv(const struct fc_lport *lp)
+@@ -697,7 +669,7 @@
+ }
+
+
+-/*
++/**
+ * LOCAL PORT LAYER
+ *****************************/
+ int fc_lport_init(struct fc_lport *lp);
+@@ -732,6 +704,12 @@
+ void fc_linkdown(struct fc_lport *);
+
+ /*
++ * Pause and unpause traffic.
++ */
++void fc_pause(struct fc_lport *);
++void fc_unpause(struct fc_lport *);
++
++/*
+ * Configure the local port.
+ */
+ int fc_lport_config(struct fc_lport *);
+@@ -747,19 +725,19 @@
+ int fc_set_mfs(struct fc_lport *lp, u32 mfs);
+
+
+-/*
++/**
+ * REMOTE PORT LAYER
+ *****************************/
+ int fc_rport_init(struct fc_lport *lp);
+ void fc_rport_terminate_io(struct fc_rport *rp);
+
+-/*
++/**
+ * DISCOVERY LAYER
+ *****************************/
+ int fc_disc_init(struct fc_lport *lp);
+
+
+-/*
++/**
+ * SCSI LAYER
+ *****************************/
+ /*
+@@ -820,7 +798,7 @@
+ */
+ void fc_fcp_destroy(struct fc_lport *);
+
+-/*
++/**
+ * ELS/CT interface
+ *****************************/
+ /*
+@@ -829,7 +807,7 @@
+ int fc_elsct_init(struct fc_lport *lp);
+
+
+-/*
++/**
+ * EXCHANGE MANAGER LAYER
+ *****************************/
+ /*
+@@ -938,7 +916,7 @@
+ * If s_id is non-zero, reset only exchanges originating from that FID.
+ * If d_id is non-zero, reset only exchanges sending to that FID.
+ */
+-void fc_exch_mgr_reset(struct fc_lport *, u32 s_id, u32 d_id);
++void fc_exch_mgr_reset(struct fc_exch_mgr *, u32 s_id, u32 d_id);
+
+ /*
+ * Functions for fc_functions_template
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/scsi/libfcoe.h linux-2.6.29-rc3.owrt/include/scsi/libfcoe.h
+--- linux-2.6.29.owrt/include/scsi/libfcoe.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/scsi/libfcoe.h 2009-05-10 23:48:29.000000000 +0200
+@@ -46,7 +46,6 @@
+ struct net_device *phys_dev; /* device with ethtool_ops */
+ struct packet_type fcoe_packet_type;
+ struct sk_buff_head fcoe_pending_queue;
+- u8 fcoe_pending_queue_active;
+
+ u8 dest_addr[ETH_ALEN];
+ u8 ctl_src_addr[ETH_ALEN];
+@@ -59,10 +58,16 @@
+ u8 address_mode;
+ };
+
++static inline struct fcoe_softc *fcoe_softc(
++ const struct fc_lport *lp)
++{
++ return (struct fcoe_softc *)lport_priv(lp);
++}
++
+ static inline struct net_device *fcoe_netdev(
+ const struct fc_lport *lp)
+ {
+- return ((struct fcoe_softc *)lport_priv(lp))->real_dev;
++ return fcoe_softc(lp)->real_dev;
+ }
+
+ static inline struct fcoe_hdr *skb_fcoe_header(const struct sk_buff *skb)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/sound/hdsp.h linux-2.6.29-rc3.owrt/include/sound/hdsp.h
+--- linux-2.6.29.owrt/include/sound/hdsp.h 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/sound/hdsp.h 2009-05-10 23:48:29.000000000 +0200
+@@ -19,8 +19,6 @@
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+-#include <linux/types.h>
+-
+ #define HDSP_MATRIX_MIXER_SIZE 2048
+
+ enum HDSP_IO_Type {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/video/aty128.h linux-2.6.29-rc3.owrt/include/video/aty128.h
+--- linux-2.6.29.owrt/include/video/aty128.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/video/aty128.h 2009-05-10 23:48:29.000000000 +0200
+@@ -21,9 +21,9 @@
+ #define I2C_CNTL_1 0x0094
+ #define PALETTE_INDEX 0x00b0
+ #define PALETTE_DATA 0x00b4
+-#define CNFG_CNTL 0x00e0
++#define CONFIG_CNTL 0x00e0
+ #define GEN_RESET_CNTL 0x00f0
+-#define CNFG_MEMSIZE 0x00f8
++#define CONFIG_MEMSIZE 0x00f8
+ #define MEM_CNTL 0x0140
+ #define MEM_POWER_MISC 0x015c
+ #define AGP_BASE 0x0170
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/video/mach64.h linux-2.6.29-rc3.owrt/include/video/mach64.h
+--- linux-2.6.29.owrt/include/video/mach64.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/video/mach64.h 2009-05-10 23:48:29.000000000 +0200
+@@ -103,7 +103,7 @@
+ #define CUR_HORZ_VERT_OFF 0x0070 /* Dword offset 0_1C */
+ #define CUR2_HORZ_VERT_OFF 0x0070 /* Dword offset 0_1C */
+
+-#define CNFG_PANEL_LG 0x0074 /* Dword offset 0_1D (LG) */
++#define CONFIG_PANEL_LG 0x0074 /* Dword offset 0_1D (LG) */
+
+ /* General I/O Control */
+ #define GP_IO 0x0078 /* Dword offset 0_1E */
+@@ -146,8 +146,8 @@
+ #define CLOCK_SEL_CNTL 0x0090 /* Dword offset 0_24 */
+
+ /* Configuration */
+-#define CNFG_STAT1 0x0094 /* Dword offset 0_25 */
+-#define CNFG_STAT2 0x0098 /* Dword offset 0_26 */
++#define CONFIG_STAT1 0x0094 /* Dword offset 0_25 */
++#define CONFIG_STAT2 0x0098 /* Dword offset 0_26 */
+
+ /* Bus Control */
+ #define BUS_CNTL 0x00A0 /* Dword offset 0_28 */
+@@ -190,9 +190,9 @@
+ #define POWER_MANAGEMENT_LG 0x00D8 /* Dword offset 0_36 (LG) */
+
+ /* Configuration */
+-#define CNFG_CNTL 0x00DC /* Dword offset 0_37 (CT, ET, VT) */
+-#define CNFG_CHIP_ID 0x00E0 /* Dword offset 0_38 */
+-#define CNFG_STAT0 0x00E4 /* Dword offset 0_39 */
++#define CONFIG_CNTL 0x00DC /* Dword offset 0_37 (CT, ET, VT) */
++#define CONFIG_CHIP_ID 0x00E0 /* Dword offset 0_38 */
++#define CONFIG_STAT0 0x00E4 /* Dword offset 0_39 */
+
+ /* Test and Debug */
+ #define CRC_SIG 0x00E8 /* Dword offset 0_3A */
+@@ -851,17 +851,17 @@
+ #define PLL_YCLK_CNTL 0x29
+ #define PM_DYN_CLK_CNTL 0x2A
+
+-/* CNFG_CNTL register constants */
++/* CONFIG_CNTL register constants */
+ #define APERTURE_4M_ENABLE 1
+ #define APERTURE_8M_ENABLE 2
+ #define VGA_APERTURE_ENABLE 4
+
+-/* CNFG_STAT0 register constants (GX, CX) */
++/* CONFIG_STAT0 register constants (GX, CX) */
+ #define CFG_BUS_TYPE 0x00000007
+ #define CFG_MEM_TYPE 0x00000038
+ #define CFG_INIT_DAC_TYPE 0x00000e00
+
+-/* CNFG_STAT0 register constants (CT, ET, VT) */
++/* CONFIG_STAT0 register constants (CT, ET, VT) */
+ #define CFG_MEM_TYPE_xT 0x00000007
+
+ #define ISA 0
+@@ -942,7 +942,7 @@
+ #define PCI_ATI_VENDOR_ID 0x1002
+
+
+-/* CNFG_CHIP_ID register constants */
++/* CONFIG_CHIP_ID register constants */
+ #define CFG_CHIP_TYPE 0x0000FFFF
+ #define CFG_CHIP_CLASS 0x00FF0000
+ #define CFG_CHIP_REV 0xFF000000
+@@ -951,7 +951,7 @@
+ #define CFG_CHIP_MINOR 0xC0000000
+
+
+-/* Chip IDs read from CNFG_CHIP_ID */
++/* Chip IDs read from CONFIG_CHIP_ID */
+
+ /* mach64GX family */
+ #define GX_CHIP_ID 0xD7 /* mach64GX (ATI888GX00) */
+@@ -1254,7 +1254,7 @@
+ #define CRTC2_DISPLAY_DIS 0x00000400
+
+ /* LCD register indices */
+-#define CNFG_PANEL 0x00
++#define CONFIG_PANEL 0x00
+ #define LCD_GEN_CNTL 0x01
+ #define DSTN_CONTROL 0x02
+ #define HFB_PITCH_ADDR 0x03
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/video/radeon.h linux-2.6.29-rc3.owrt/include/video/radeon.h
+--- linux-2.6.29.owrt/include/video/radeon.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/video/radeon.h 2009-05-10 23:48:29.000000000 +0200
+@@ -11,13 +11,13 @@
+ #define HI_STAT 0x004C
+ #define BUS_CNTL1 0x0034
+ #define I2C_CNTL_1 0x0094
+-#define CNFG_CNTL 0x00E0
+-#define CNFG_MEMSIZE 0x00F8
+-#define CNFG_APER_0_BASE 0x0100
+-#define CNFG_APER_1_BASE 0x0104
+-#define CNFG_APER_SIZE 0x0108
+-#define CNFG_REG_1_BASE 0x010C
+-#define CNFG_REG_APER_SIZE 0x0110
++#define CONFIG_CNTL 0x00E0
++#define CONFIG_MEMSIZE 0x00F8
++#define CONFIG_APER_0_BASE 0x0100
++#define CONFIG_APER_1_BASE 0x0104
++#define CONFIG_APER_SIZE 0x0108
++#define CONFIG_REG_1_BASE 0x010C
++#define CONFIG_REG_APER_SIZE 0x0110
+ #define PAD_AGPINPUT_DELAY 0x0164
+ #define PAD_CTLR_STRENGTH 0x0168
+ #define PAD_CTLR_UPDATE 0x016C
+@@ -509,7 +509,7 @@
+ /* CLOCK_CNTL_INDEX bit constants */
+ #define PLL_WR_EN 0x00000080
+
+-/* CNFG_CNTL bit constants */
++/* CONFIG_CNTL bit constants */
+ #define CFG_VGA_RAM_EN 0x00000100
+ #define CFG_ATI_REV_ID_MASK (0xf << 16)
+ #define CFG_ATI_REV_A11 (0 << 16)
+@@ -980,7 +980,7 @@
+
+ /* masks */
+
+-#define CNFG_MEMSIZE_MASK 0x1f000000
++#define CONFIG_MEMSIZE_MASK 0x1f000000
+ #define MEM_CFG_TYPE 0x40000000
+ #define DST_OFFSET_MASK 0x003fffff
+ #define DST_PITCH_MASK 0x3fc00000
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/video/sisfb.h linux-2.6.29-rc3.owrt/include/video/sisfb.h
+--- linux-2.6.29.owrt/include/video/sisfb.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/video/sisfb.h 2009-05-10 23:48:29.000000000 +0200
+@@ -21,8 +21,8 @@
+ #ifndef _LINUX_SISFB_H_
+ #define _LINUX_SISFB_H_
+
+-#include <linux/types.h>
+ #include <asm/ioctl.h>
++#include <asm/types.h>
+
+ /**********************************************/
+ /* PUBLIC */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/include/video/uvesafb.h linux-2.6.29-rc3.owrt/include/video/uvesafb.h
+--- linux-2.6.29.owrt/include/video/uvesafb.h 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/include/video/uvesafb.h 2009-05-10 23:48:29.000000000 +0200
+@@ -1,8 +1,6 @@
+ #ifndef _UVESAFB_H
+ #define _UVESAFB_H
+
+-#include <linux/types.h>
+-
+ struct v86_regs {
+ __u32 ebx;
+ __u32 ecx;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/init/do_mounts.c linux-2.6.29-rc3.owrt/init/do_mounts.c
+--- linux-2.6.29.owrt/init/do_mounts.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/init/do_mounts.c 2009-05-10 23:48:29.000000000 +0200
+@@ -370,14 +370,10 @@
+ ssleep(root_delay);
+ }
+
+- /*
+- * wait for the known devices to complete their probing
+- *
+- * Note: this is a potential source of long boot delays.
+- * For example, it is not atypical to wait 5 seconds here
+- * for the touchpad of a laptop to initialize.
+- */
+- wait_for_device_probe();
++ /* wait for the known devices to complete their probing */
++ while (driver_probe_done() != 0)
++ msleep(100);
++ async_synchronize_full();
+
+ md_run_setup();
+
+@@ -403,7 +399,6 @@
+ while (driver_probe_done() != 0 ||
+ (ROOT_DEV = name_to_dev_t(saved_root_name)) == 0)
+ msleep(100);
+- async_synchronize_full();
+ }
+
+ is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/init/do_mounts_md.c linux-2.6.29-rc3.owrt/init/do_mounts_md.c
+--- linux-2.6.29.owrt/init/do_mounts_md.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/init/do_mounts_md.c 2009-05-10 23:48:29.000000000 +0200
+@@ -281,9 +281,8 @@
+ */
+ printk(KERN_INFO "md: Waiting for all devices to be available before autodetect\n");
+ printk(KERN_INFO "md: If you don't use raid, use raid=noautodetect\n");
+-
+- wait_for_device_probe();
+-
++ while (driver_probe_done() < 0)
++ msleep(100);
+ fd = sys_open("/dev/md0", 0, 0);
+ if (fd >= 0) {
+ sys_ioctl(fd, RAID_AUTORUN, raid_autopart);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/init/Kconfig linux-2.6.29-rc3.owrt/init/Kconfig
+--- linux-2.6.29.owrt/init/Kconfig 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/init/Kconfig 2009-05-10 23:48:29.000000000 +0200
+@@ -675,9 +675,6 @@
+ config SYSCTL
+ bool
+
+-config ANON_INODES
+- bool
+-
+ menuconfig EMBEDDED
+ bool "Configure standard kernel features (for small systems)"
+ help
+@@ -783,6 +780,18 @@
+ This option allows to disable the internal PC-Speaker
+ support, saving some memory.
+
++config COMPAT_BRK
++ bool "Disable heap randomization"
++ default y
++ help
++ Randomizing heap placement makes heap exploits harder, but it
++ also breaks ancient binaries (including anything libc5 based).
++ This option changes the bootup default to heap randomization
++ disabled, and can be overriden runtime by setting
++ /proc/sys/kernel/randomize_va_space to 2.
++
++ On non-ancient distros (post-2000 ones) N is usually a safe choice.
++
+ config BASE_FULL
+ default y
+ bool "Enable full-sized data structures for core" if EMBEDDED
+@@ -800,6 +809,9 @@
+ support for "fast userspace mutexes". The resulting kernel may not
+ run glibc-based applications correctly.
+
++config ANON_INODES
++ bool
++
+ config EPOLL
+ bool "Enable eventpoll support" if EMBEDDED
+ default y
+@@ -885,18 +897,6 @@
+ SLUB sysfs support. /sys/slab will not exist and there will be
+ no support for cache validation etc.
+
+-config COMPAT_BRK
+- bool "Disable heap randomization"
+- default y
+- help
+- Randomizing heap placement makes heap exploits harder, but it
+- also breaks ancient binaries (including anything libc5 based).
+- This option changes the bootup default to heap randomization
+- disabled, and can be overriden runtime by setting
+- /proc/sys/kernel/randomize_va_space to 2.
+-
+- On non-ancient distros (post-2000 ones) N is usually a safe choice.
+-
+ choice
+ prompt "Choose SLAB allocator"
+ default SLUB
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/init/main.c linux-2.6.29-rc3.owrt/init/main.c
+--- linux-2.6.29.owrt/init/main.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/init/main.c 2009-05-10 23:48:29.000000000 +0200
+@@ -97,7 +97,7 @@
+ extern void tc_init(void);
+ #endif
+
+-enum system_states system_state __read_mostly;
++enum system_states system_state;
+ EXPORT_SYMBOL(system_state);
+
+ /*
+@@ -463,7 +463,6 @@
+ * at least once to get things moving:
+ */
+ init_idle_bootup_task(current);
+- rcu_scheduler_starting();
+ preempt_enable_no_resched();
+ schedule();
+ preempt_disable();
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/ipc/shm.c linux-2.6.29-rc3.owrt/ipc/shm.c
+--- linux-2.6.29.owrt/ipc/shm.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/ipc/shm.c 2009-05-10 23:48:29.000000000 +0200
+@@ -340,7 +340,6 @@
+ struct file * file;
+ char name[13];
+ int id;
+- int acctflag = 0;
+
+ if (size < SHMMIN || size > ns->shm_ctlmax)
+ return -EINVAL;
+@@ -365,19 +364,18 @@
+
+ sprintf (name, "SYSV%08x", key);
+ if (shmflg & SHM_HUGETLB) {
+- /* hugetlb_file_setup applies strict accounting */
+- if (shmflg & SHM_NORESERVE)
+- acctflag = VM_NORESERVE;
+- file = hugetlb_file_setup(name, size, acctflag);
++ /* hugetlb_file_setup takes care of mlock user accounting */
++ file = hugetlb_file_setup(name, size);
+ shp->mlock_user = current_user();
+ } else {
++ int acctflag = VM_ACCOUNT;
+ /*
+ * Do not allow no accounting for OVERCOMMIT_NEVER, even
+ * if it's asked for.
+ */
+ if ((shmflg & SHM_NORESERVE) &&
+ sysctl_overcommit_memory != OVERCOMMIT_NEVER)
+- acctflag = VM_NORESERVE;
++ acctflag = 0;
+ file = shmem_file_setup(name, size, acctflag);
+ }
+ error = PTR_ERR(file);
+@@ -567,15 +565,11 @@
+ struct hstate *h = hstate_file(shp->shm_file);
+ *rss += pages_per_huge_page(h) * mapping->nrpages;
+ } else {
+-#ifdef CONFIG_SHMEM
+ struct shmem_inode_info *info = SHMEM_I(inode);
+ spin_lock(&info->lock);
+ *rss += inode->i_mapping->nrpages;
+ *swp += info->swapped;
+ spin_unlock(&info->lock);
+-#else
+- *rss += inode->i_mapping->nrpages;
+-#endif
+ }
+
+ total++;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/async.c linux-2.6.29-rc3.owrt/kernel/async.c
+--- linux-2.6.29.owrt/kernel/async.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/async.c 2009-05-10 23:48:29.000000000 +0200
+@@ -54,7 +54,6 @@
+ #include <linux/sched.h>
+ #include <linux/init.h>
+ #include <linux/kthread.h>
+-#include <linux/delay.h>
+ #include <asm/atomic.h>
+
+ static async_cookie_t next_cookie = 1;
+@@ -133,23 +132,21 @@
+ entry = list_first_entry(&async_pending, struct async_entry, list);
+
+ /* 2) move it to the running queue */
+- list_move_tail(&entry->list, entry->running);
++ list_del(&entry->list);
++ list_add_tail(&entry->list, &async_running);
+ spin_unlock_irqrestore(&async_lock, flags);
+
+ /* 3) run it (and print duration)*/
+ if (initcall_debug && system_state == SYSTEM_BOOTING) {
+- printk("calling %lli_%pF @ %i\n", (long long)entry->cookie,
+- entry->func, task_pid_nr(current));
++ printk("calling %lli_%pF @ %i\n", entry->cookie, entry->func, task_pid_nr(current));
+ calltime = ktime_get();
+ }
+ entry->func(entry->data, entry->cookie);
+ if (initcall_debug && system_state == SYSTEM_BOOTING) {
+ rettime = ktime_get();
+ delta = ktime_sub(rettime, calltime);
+- printk("initcall %lli_%pF returned 0 after %lld usecs\n",
+- (long long)entry->cookie,
+- entry->func,
+- (long long)ktime_to_ns(delta) >> 10);
++ printk("initcall %lli_%pF returned 0 after %lld usecs\n", entry->cookie,
++ entry->func, ktime_to_ns(delta) >> 10);
+ }
+
+ /* 4) remove it from the running queue */
+@@ -208,44 +205,18 @@
+ return newcookie;
+ }
+
+-/**
+- * async_schedule - schedule a function for asynchronous execution
+- * @ptr: function to execute asynchronously
+- * @data: data pointer to pass to the function
+- *
+- * Returns an async_cookie_t that may be used for checkpointing later.
+- * Note: This function may be called from atomic or non-atomic contexts.
+- */
+ async_cookie_t async_schedule(async_func_ptr *ptr, void *data)
+ {
+- return __async_schedule(ptr, data, &async_running);
++ return __async_schedule(ptr, data, &async_pending);
+ }
+ EXPORT_SYMBOL_GPL(async_schedule);
+
+-/**
+- * async_schedule_domain - schedule a function for asynchronous execution within a certain domain
+- * @ptr: function to execute asynchronously
+- * @data: data pointer to pass to the function
+- * @running: running list for the domain
+- *
+- * Returns an async_cookie_t that may be used for checkpointing later.
+- * @running may be used in the async_synchronize_*_domain() functions
+- * to wait within a certain synchronization domain rather than globally.
+- * A synchronization domain is specified via the running queue @running to use.
+- * Note: This function may be called from atomic or non-atomic contexts.
+- */
+-async_cookie_t async_schedule_domain(async_func_ptr *ptr, void *data,
+- struct list_head *running)
++async_cookie_t async_schedule_special(async_func_ptr *ptr, void *data, struct list_head *running)
+ {
+ return __async_schedule(ptr, data, running);
+ }
+-EXPORT_SYMBOL_GPL(async_schedule_domain);
++EXPORT_SYMBOL_GPL(async_schedule_special);
+
+-/**
+- * async_synchronize_full - synchronize all asynchronous function calls
+- *
+- * This function waits until all asynchronous function calls have been done.
+- */
+ void async_synchronize_full(void)
+ {
+ do {
+@@ -254,30 +225,13 @@
+ }
+ EXPORT_SYMBOL_GPL(async_synchronize_full);
+
+-/**
+- * async_synchronize_full_domain - synchronize all asynchronous function within a certain domain
+- * @list: running list to synchronize on
+- *
+- * This function waits until all asynchronous function calls for the
+- * synchronization domain specified by the running list @list have been done.
+- */
+-void async_synchronize_full_domain(struct list_head *list)
++void async_synchronize_full_special(struct list_head *list)
+ {
+- async_synchronize_cookie_domain(next_cookie, list);
++ async_synchronize_cookie_special(next_cookie, list);
+ }
+-EXPORT_SYMBOL_GPL(async_synchronize_full_domain);
++EXPORT_SYMBOL_GPL(async_synchronize_full_special);
+
+-/**
+- * async_synchronize_cookie_domain - synchronize asynchronous function calls within a certain domain with cookie checkpointing
+- * @cookie: async_cookie_t to use as checkpoint
+- * @running: running list to synchronize on
+- *
+- * This function waits until all asynchronous function calls for the
+- * synchronization domain specified by the running list @list submitted
+- * prior to @cookie have been done.
+- */
+-void async_synchronize_cookie_domain(async_cookie_t cookie,
+- struct list_head *running)
++void async_synchronize_cookie_special(async_cookie_t cookie, struct list_head *running)
+ {
+ ktime_t starttime, delta, endtime;
+
+@@ -293,22 +247,14 @@
+ delta = ktime_sub(endtime, starttime);
+
+ printk("async_continuing @ %i after %lli usec\n",
+- task_pid_nr(current),
+- (long long)ktime_to_ns(delta) >> 10);
++ task_pid_nr(current), ktime_to_ns(delta) >> 10);
+ }
+ }
+-EXPORT_SYMBOL_GPL(async_synchronize_cookie_domain);
++EXPORT_SYMBOL_GPL(async_synchronize_cookie_special);
+
+-/**
+- * async_synchronize_cookie - synchronize asynchronous function calls with cookie checkpointing
+- * @cookie: async_cookie_t to use as checkpoint
+- *
+- * This function waits until all asynchronous function calls prior to @cookie
+- * have been done.
+- */
+ void async_synchronize_cookie(async_cookie_t cookie)
+ {
+- async_synchronize_cookie_domain(cookie, &async_running);
++ async_synchronize_cookie_special(cookie, &async_running);
+ }
+ EXPORT_SYMBOL_GPL(async_synchronize_cookie);
+
+@@ -369,11 +315,7 @@
+ ec = atomic_read(&entry_count);
+
+ while (tc < ec && tc < MAX_THREADS) {
+- if (IS_ERR(kthread_run(async_thread, NULL, "async/%i",
+- tc))) {
+- msleep(100);
+- continue;
+- }
++ kthread_run(async_thread, NULL, "async/%i", tc);
+ atomic_inc(&thread_count);
+ tc++;
+ }
+@@ -388,9 +330,7 @@
+ static int __init async_init(void)
+ {
+ if (async_enabled)
+- if (IS_ERR(kthread_run(async_manager_thread, NULL,
+- "async/mgr")))
+- async_enabled = 0;
++ kthread_run(async_manager_thread, NULL, "async/mgr");
+ return 0;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/cgroup.c linux-2.6.29-rc3.owrt/kernel/cgroup.c
+--- linux-2.6.29.owrt/kernel/cgroup.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/cgroup.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1115,15 +1115,13 @@
+ }
+ write_unlock(&css_set_lock);
+
+- if (!list_empty(&root->root_list)) {
+- list_del(&root->root_list);
+- root_count--;
+- }
++ list_del(&root->root_list);
++ root_count--;
+
+ mutex_unlock(&cgroup_mutex);
+
+- kill_litter_super(sb);
+ kfree(root);
++ kill_litter_super(sb);
+ }
+
+ static struct file_system_type cgroup_fs_type = {
+@@ -2351,7 +2349,7 @@
+ for (i = 0; i < CGROUP_SUBSYS_COUNT; i++) {
+ struct cgroup_subsys *ss = subsys[i];
+ if (ss->root == root)
+- mutex_lock(&ss->hierarchy_mutex);
++ mutex_lock_nested(&ss->hierarchy_mutex, i);
+ }
+ }
+
+@@ -2436,9 +2434,7 @@
+
+ err_remove:
+
+- cgroup_lock_hierarchy(root);
+ list_del(&cgrp->sibling);
+- cgroup_unlock_hierarchy(root);
+ root->number_of_cgroups--;
+
+ err_destroy:
+@@ -2511,7 +2507,7 @@
+ for_each_subsys(cgrp->root, ss) {
+ struct cgroup_subsys_state *css = cgrp->subsys[ss->subsys_id];
+ int refcnt;
+- while (1) {
++ do {
+ /* We can only remove a CSS with a refcnt==1 */
+ refcnt = atomic_read(&css->refcnt);
+ if (refcnt > 1) {
+@@ -2525,10 +2521,7 @@
+ * css_tryget() to spin until we set the
+ * CSS_REMOVED bits or abort
+ */
+- if (atomic_cmpxchg(&css->refcnt, refcnt, 0) == refcnt)
+- break;
+- cpu_relax();
+- }
++ } while (atomic_cmpxchg(&css->refcnt, refcnt, 0) != refcnt);
+ }
+ done:
+ for_each_subsys(cgrp->root, ss) {
+@@ -2637,7 +2630,6 @@
+ BUG_ON(!list_empty(&init_task.tasks));
+
+ mutex_init(&ss->hierarchy_mutex);
+- lockdep_set_class(&ss->hierarchy_mutex, &ss->subsys_key);
+ ss->active = 1;
+ }
+
+@@ -2999,21 +2991,20 @@
+ mutex_unlock(&cgroup_mutex);
+ return 0;
+ }
++ task_lock(tsk);
++ cg = tsk->cgroups;
++ parent = task_cgroup(tsk, subsys->subsys_id);
+
+ /* Pin the hierarchy */
+- if (!atomic_inc_not_zero(&root->sb->s_active)) {
++ if (!atomic_inc_not_zero(&parent->root->sb->s_active)) {
+ /* We race with the final deactivate_super() */
+ mutex_unlock(&cgroup_mutex);
+ return 0;
+ }
+
+ /* Keep the cgroup alive */
+- task_lock(tsk);
+- parent = task_cgroup(tsk, subsys->subsys_id);
+- cg = tsk->cgroups;
+ get_css_set(cg);
+ task_unlock(tsk);
+-
+ mutex_unlock(&cgroup_mutex);
+
+ /* Now do the VFS work to create a cgroup */
+@@ -3052,7 +3043,7 @@
+ mutex_unlock(&inode->i_mutex);
+ put_css_set(cg);
+
+- deactivate_super(root->sb);
++ deactivate_super(parent->root->sb);
+ /* The cgroup is still accessible in the VFS, but
+ * we're not going to try to rmdir() it at this
+ * point. */
+@@ -3078,7 +3069,7 @@
+ mutex_lock(&cgroup_mutex);
+ put_css_set(cg);
+ mutex_unlock(&cgroup_mutex);
+- deactivate_super(root->sb);
++ deactivate_super(parent->root->sb);
+ return ret;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/cpuset.c linux-2.6.29-rc3.owrt/kernel/cpuset.c
+--- linux-2.6.29.owrt/kernel/cpuset.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/cpuset.c 2009-05-10 23:48:29.000000000 +0200
+@@ -61,14 +61,6 @@
+ #include <linux/cgroup.h>
+
+ /*
+- * Workqueue for cpuset related tasks.
+- *
+- * Using kevent workqueue may cause deadlock when memory_migrate
+- * is set. So we create a separate workqueue thread for cpuset.
+- */
+-static struct workqueue_struct *cpuset_wq;
+-
+-/*
+ * Tracks how many cpusets are currently defined in system.
+ * When there is only one cpuset (the root cpuset) we can
+ * short circuit some hooks.
+@@ -839,7 +831,7 @@
+ */
+ static void async_rebuild_sched_domains(void)
+ {
+- queue_work(cpuset_wq, &rebuild_sched_domains_work);
++ schedule_work(&rebuild_sched_domains_work);
+ }
+
+ /*
+@@ -2119,9 +2111,6 @@
+
+ hotcpu_notifier(cpuset_track_online_cpus, 0);
+ hotplug_memory_notifier(cpuset_track_online_nodes, 10);
+-
+- cpuset_wq = create_singlethread_workqueue("cpuset");
+- BUG_ON(!cpuset_wq);
+ }
+
+ /**
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/exit.c linux-2.6.29-rc3.owrt/kernel/exit.c
+--- linux-2.6.29.owrt/kernel/exit.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/exit.c 2009-05-10 23:48:29.000000000 +0200
+@@ -118,8 +118,6 @@
+ * We won't ever get here for the group leader, since it
+ * will have been the last reference on the signal_struct.
+ */
+- sig->utime = cputime_add(sig->utime, task_utime(tsk));
+- sig->stime = cputime_add(sig->stime, task_stime(tsk));
+ sig->gtime = cputime_add(sig->gtime, task_gtime(tsk));
+ sig->min_flt += tsk->min_flt;
+ sig->maj_flt += tsk->maj_flt;
+@@ -128,7 +126,6 @@
+ sig->inblock += task_io_get_inblock(tsk);
+ sig->oublock += task_io_get_oublock(tsk);
+ task_io_accounting_add(&sig->ioac, &tsk->ioac);
+- sig->sum_sched_runtime += tsk->se.sum_exec_runtime;
+ sig = NULL; /* Marker for below. */
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/fork.c linux-2.6.29-rc3.owrt/kernel/fork.c
+--- linux-2.6.29.owrt/kernel/fork.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/fork.c 2009-05-10 23:48:29.000000000 +0200
+@@ -852,14 +852,13 @@
+ sig->tty_old_pgrp = NULL;
+ sig->tty = NULL;
+
+- sig->utime = sig->stime = sig->cutime = sig->cstime = cputime_zero;
++ sig->cutime = sig->cstime = cputime_zero;
+ sig->gtime = cputime_zero;
+ sig->cgtime = cputime_zero;
+ sig->nvcsw = sig->nivcsw = sig->cnvcsw = sig->cnivcsw = 0;
+ sig->min_flt = sig->maj_flt = sig->cmin_flt = sig->cmaj_flt = 0;
+ sig->inblock = sig->oublock = sig->cinblock = sig->coublock = 0;
+ task_io_accounting_init(&sig->ioac);
+- sig->sum_sched_runtime = 0;
+ taskstats_tgid_init(sig);
+
+ task_lock(current->group_leader);
+@@ -1007,7 +1006,6 @@
+ * triggers too late. This doesn't hurt, the check is only there
+ * to stop root fork bombs.
+ */
+- retval = -EAGAIN;
+ if (nr_threads >= max_threads)
+ goto bad_fork_cleanup_count;
+
+@@ -1096,7 +1094,7 @@
+ #ifdef CONFIG_DEBUG_MUTEXES
+ p->blocked_on = NULL; /* not blocked yet */
+ #endif
+- if (unlikely(current->ptrace))
++ if (unlikely(ptrace_reparented(current)))
+ ptrace_fork(p, clone_flags);
+
+ /* Perform scheduler related setup. Assign this task to a CPU. */
+@@ -1180,6 +1178,10 @@
+ #endif
+ clear_all_latency_tracing(p);
+
++ /* Our parent execution domain becomes current domain
++ These must match for thread signalling to apply */
++ p->parent_exec_id = p->self_exec_id;
++
+ /* ok, now we should be set up.. */
+ p->exit_signal = (clone_flags & CLONE_THREAD) ? -1 : (clone_flags & CSIGNAL);
+ p->pdeath_signal = 0;
+@@ -1217,13 +1219,10 @@
+ set_task_cpu(p, smp_processor_id());
+
+ /* CLONE_PARENT re-uses the old parent */
+- if (clone_flags & (CLONE_PARENT|CLONE_THREAD)) {
++ if (clone_flags & (CLONE_PARENT|CLONE_THREAD))
+ p->real_parent = current->real_parent;
+- p->parent_exec_id = current->parent_exec_id;
+- } else {
++ else
+ p->real_parent = current;
+- p->parent_exec_id = current->self_exec_id;
+- }
+
+ spin_lock(&current->sighand->siglock);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/futex.c linux-2.6.29-rc3.owrt/kernel/futex.c
+--- linux-2.6.29.owrt/kernel/futex.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/futex.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1165,7 +1165,6 @@
+ u32 val, ktime_t *abs_time, u32 bitset, int clockrt)
+ {
+ struct task_struct *curr = current;
+- struct restart_block *restart;
+ DECLARE_WAITQUEUE(wait, curr);
+ struct futex_hash_bucket *hb;
+ struct futex_q q;
+@@ -1217,13 +1216,11 @@
+
+ if (!ret)
+ goto retry;
+- goto out;
++ return ret;
+ }
+ ret = -EWOULDBLOCK;
+- if (unlikely(uval != val)) {
+- queue_unlock(&q, hb);
+- goto out_put_key;
+- }
++ if (uval != val)
++ goto out_unlock_put_key;
+
+ /* Only actually queue if *uaddr contained val. */
+ queue_me(&q, hb);
+@@ -1287,38 +1284,38 @@
+ */
+
+ /* If we were woken (and unqueued), we succeeded, whatever. */
+- ret = 0;
+ if (!unqueue_me(&q))
+- goto out_put_key;
+- ret = -ETIMEDOUT;
++ return 0;
+ if (rem)
+- goto out_put_key;
++ return -ETIMEDOUT;
+
+ /*
+ * We expect signal_pending(current), but another thread may
+ * have handled it for us already.
+ */
+- ret = -ERESTARTSYS;
+ if (!abs_time)
+- goto out_put_key;
+-
+- restart = &current_thread_info()->restart_block;
+- restart->fn = futex_wait_restart;
+- restart->futex.uaddr = (u32 *)uaddr;
+- restart->futex.val = val;
+- restart->futex.time = abs_time->tv64;
+- restart->futex.bitset = bitset;
+- restart->futex.flags = 0;
+-
+- if (fshared)
+- restart->futex.flags |= FLAGS_SHARED;
+- if (clockrt)
+- restart->futex.flags |= FLAGS_CLOCKRT;
+-
+- ret = -ERESTART_RESTARTBLOCK;
++ return -ERESTARTSYS;
++ else {
++ struct restart_block *restart;
++ restart = &current_thread_info()->restart_block;
++ restart->fn = futex_wait_restart;
++ restart->futex.uaddr = (u32 *)uaddr;
++ restart->futex.val = val;
++ restart->futex.time = abs_time->tv64;
++ restart->futex.bitset = bitset;
++ restart->futex.flags = 0;
++
++ if (fshared)
++ restart->futex.flags |= FLAGS_SHARED;
++ if (clockrt)
++ restart->futex.flags |= FLAGS_CLOCKRT;
++ return -ERESTART_RESTARTBLOCK;
++ }
+
+-out_put_key:
++out_unlock_put_key:
++ queue_unlock(&q, hb);
+ put_futex_key(fshared, &q.key);
++
+ out:
+ return ret;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/hrtimer.c linux-2.6.29-rc3.owrt/kernel/hrtimer.c
+--- linux-2.6.29.owrt/kernel/hrtimer.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/hrtimer.c 2009-05-10 23:48:29.000000000 +0200
+@@ -501,13 +501,6 @@
+ continue;
+ timer = rb_entry(base->first, struct hrtimer, node);
+ expires = ktime_sub(hrtimer_get_expires(timer), base->offset);
+- /*
+- * clock_was_set() has changed base->offset so the
+- * result might be negative. Fix it up to prevent a
+- * false positive in clockevents_program_event()
+- */
+- if (expires.tv64 < 0)
+- expires.tv64 = 0;
+ if (expires.tv64 < cpu_base->expires_next.tv64)
+ cpu_base->expires_next = expires;
+ }
+@@ -1165,29 +1158,6 @@
+
+ #ifdef CONFIG_HIGH_RES_TIMERS
+
+-static int force_clock_reprogram;
+-
+-/*
+- * After 5 iteration's attempts, we consider that hrtimer_interrupt()
+- * is hanging, which could happen with something that slows the interrupt
+- * such as the tracing. Then we force the clock reprogramming for each future
+- * hrtimer interrupts to avoid infinite loops and use the min_delta_ns
+- * threshold that we will overwrite.
+- * The next tick event will be scheduled to 3 times we currently spend on
+- * hrtimer_interrupt(). This gives a good compromise, the cpus will spend
+- * 1/4 of their time to process the hrtimer interrupts. This is enough to
+- * let it running without serious starvation.
+- */
+-
+-static inline void
+-hrtimer_interrupt_hanging(struct clock_event_device *dev,
+- ktime_t try_time)
+-{
+- force_clock_reprogram = 1;
+- dev->min_delta_ns = (unsigned long)try_time.tv64 * 3;
+- printk(KERN_WARNING "hrtimer: interrupt too slow, "
+- "forcing clock min delta to %lu ns\n", dev->min_delta_ns);
+-}
+ /*
+ * High resolution timer interrupt
+ * Called with interrupts disabled
+@@ -1197,7 +1167,6 @@
+ struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases);
+ struct hrtimer_clock_base *base;
+ ktime_t expires_next, now;
+- int nr_retries = 0;
+ int i;
+
+ BUG_ON(!cpu_base->hres_active);
+@@ -1205,10 +1174,6 @@
+ dev->next_event.tv64 = KTIME_MAX;
+
+ retry:
+- /* 5 retries is enough to notice a hang */
+- if (!(++nr_retries % 5))
+- hrtimer_interrupt_hanging(dev, ktime_sub(ktime_get(), now));
+-
+ now = ktime_get();
+
+ expires_next.tv64 = KTIME_MAX;
+@@ -1261,7 +1226,7 @@
+
+ /* Reprogramming necessary ? */
+ if (expires_next.tv64 != KTIME_MAX) {
+- if (tick_program_event(expires_next, force_clock_reprogram))
++ if (tick_program_event(expires_next, 0))
+ goto retry;
+ }
+ }
+@@ -1615,10 +1580,6 @@
+ break;
+
+ #ifdef CONFIG_HOTPLUG_CPU
+- case CPU_DYING:
+- case CPU_DYING_FROZEN:
+- clockevents_notify(CLOCK_EVT_NOTIFY_CPU_DYING, &scpu);
+- break;
+ case CPU_DEAD:
+ case CPU_DEAD_FROZEN:
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/irq/chip.c linux-2.6.29-rc3.owrt/kernel/irq/chip.c
+--- linux-2.6.29.owrt/kernel/irq/chip.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/irq/chip.c 2009-05-10 23:48:29.000000000 +0200
+@@ -383,7 +383,6 @@
+ out_unlock:
+ spin_unlock(&desc->lock);
+ }
+-EXPORT_SYMBOL_GPL(handle_level_irq);
+
+ /**
+ * handle_fasteoi_irq - irq handler for transparent controllers
+@@ -594,7 +593,6 @@
+ }
+ spin_unlock_irqrestore(&desc->lock, flags);
+ }
+-EXPORT_SYMBOL_GPL(__set_irq_handler);
+
+ void
+ set_irq_chip_and_handler(unsigned int irq, struct irq_chip *chip,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/irq/numa_migrate.c linux-2.6.29-rc3.owrt/kernel/irq/numa_migrate.c
+--- linux-2.6.29.owrt/kernel/irq/numa_migrate.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/irq/numa_migrate.c 2009-05-10 23:48:29.000000000 +0200
+@@ -71,7 +71,7 @@
+ desc = irq_desc_ptrs[irq];
+
+ if (desc && old_desc != desc)
+- goto out_unlock;
++ goto out_unlock;
+
+ node = cpu_to_node(cpu);
+ desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node);
+@@ -84,15 +84,10 @@
+ init_copy_one_irq_desc(irq, old_desc, desc, cpu);
+
+ irq_desc_ptrs[irq] = desc;
+- spin_unlock_irqrestore(&sparse_irq_lock, flags);
+
+ /* free the old one */
+ free_one_irq_desc(old_desc, desc);
+- spin_unlock(&old_desc->lock);
+ kfree(old_desc);
+- spin_lock(&desc->lock);
+-
+- return desc;
+
+ out_unlock:
+ spin_unlock_irqrestore(&sparse_irq_lock, flags);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/itimer.c linux-2.6.29-rc3.owrt/kernel/itimer.c
+--- linux-2.6.29.owrt/kernel/itimer.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/itimer.c 2009-05-10 23:48:29.000000000 +0200
+@@ -62,7 +62,7 @@
+ struct task_cputime cputime;
+ cputime_t utime;
+
+- thread_group_cputimer(tsk, &cputime);
++ thread_group_cputime(tsk, &cputime);
+ utime = cputime.utime;
+ if (cputime_le(cval, utime)) { /* about to fire */
+ cval = jiffies_to_cputime(1);
+@@ -82,7 +82,7 @@
+ struct task_cputime times;
+ cputime_t ptime;
+
+- thread_group_cputimer(tsk, &times);
++ thread_group_cputime(tsk, &times);
+ ptime = cputime_add(times.utime, times.stime);
+ if (cputime_le(cval, ptime)) { /* about to fire */
+ cval = jiffies_to_cputime(1);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/kexec.c linux-2.6.29-rc3.owrt/kernel/kexec.c
+--- linux-2.6.29.owrt/kernel/kexec.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/kexec.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1465,11 +1465,6 @@
+ error = device_power_down(PMSG_FREEZE);
+ if (error)
+ goto Enable_irqs;
+-
+- /* Suspend system devices */
+- error = sysdev_suspend(PMSG_FREEZE);
+- if (error)
+- goto Power_up_devices;
+ } else
+ #endif
+ {
+@@ -1482,8 +1477,6 @@
+
+ #ifdef CONFIG_KEXEC_JUMP
+ if (kexec_image->preserve_context) {
+- sysdev_resume();
+- Power_up_devices:
+ device_power_up(PMSG_RESTORE);
+ Enable_irqs:
+ local_irq_enable();
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/Makefile linux-2.6.29-rc3.owrt/kernel/Makefile
+--- linux-2.6.29.owrt/kernel/Makefile 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/Makefile 2009-05-10 23:48:29.000000000 +0200
+@@ -51,7 +51,6 @@
+ obj-$(CONFIG_MODULES) += module.o
+ obj-$(CONFIG_KALLSYMS) += kallsyms.o
+ obj-$(CONFIG_PM) += power/
+-obj-$(CONFIG_FREEZER) += power/
+ obj-$(CONFIG_BSD_PROCESS_ACCT) += acct.o
+ obj-$(CONFIG_KEXEC) += kexec.o
+ obj-$(CONFIG_BACKTRACE_SELF_TEST) += backtracetest.o
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/module.c linux-2.6.29-rc3.owrt/kernel/module.c
+--- linux-2.6.29.owrt/kernel/module.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/module.c 2009-05-10 23:48:29.000000000 +0200
+@@ -573,13 +573,13 @@
+ /* Init the unload section of the module. */
+ static void module_unload_init(struct module *mod)
+ {
+- int cpu;
++ unsigned int i;
+
+ INIT_LIST_HEAD(&mod->modules_which_use_me);
+- for_each_possible_cpu(cpu)
+- local_set(__module_ref_addr(mod, cpu), 0);
++ for (i = 0; i < NR_CPUS; i++)
++ local_set(&mod->ref[i].count, 0);
+ /* Hold reference count during initialization. */
+- local_set(__module_ref_addr(mod, raw_smp_processor_id()), 1);
++ local_set(&mod->ref[raw_smp_processor_id()].count, 1);
+ /* Backwards compatibility macros put refcount during init. */
+ mod->waiter = current;
+ }
+@@ -717,11 +717,10 @@
+
+ unsigned int module_refcount(struct module *mod)
+ {
+- unsigned int total = 0;
+- int cpu;
++ unsigned int i, total = 0;
+
+- for_each_possible_cpu(cpu)
+- total += local_read(__module_ref_addr(mod, cpu));
++ for (i = 0; i < NR_CPUS; i++)
++ total += local_read(&mod->ref[i].count);
+ return total;
+ }
+ EXPORT_SYMBOL(module_refcount);
+@@ -895,7 +894,7 @@
+ {
+ if (module) {
+ unsigned int cpu = get_cpu();
+- local_dec(__module_ref_addr(module, cpu));
++ local_dec(&module->ref[cpu].count);
+ /* Maybe they're waiting for us to drop reference? */
+ if (unlikely(!module_is_live(module)))
+ wake_up_process(module->waiter);
+@@ -1465,10 +1464,7 @@
+ kfree(mod->args);
+ if (mod->percpu)
+ percpu_modfree(mod->percpu);
+-#if defined(CONFIG_MODULE_UNLOAD) && defined(CONFIG_SMP)
+- if (mod->refptr)
+- percpu_modfree(mod->refptr);
+-#endif
++
+ /* Free lock-classes: */
+ lockdep_free_key_range(mod->module_core, mod->core_size);
+
+@@ -2074,14 +2070,6 @@
+ /* Module has been moved. */
+ mod = (void *)sechdrs[modindex].sh_addr;
+
+-#if defined(CONFIG_MODULE_UNLOAD) && defined(CONFIG_SMP)
+- mod->refptr = percpu_modalloc(sizeof(local_t), __alignof__(local_t),
+- mod->name);
+- if (!mod->refptr) {
+- err = -ENOMEM;
+- goto free_init;
+- }
+-#endif
+ /* Now we've moved module, initialize linked lists, etc. */
+ module_unload_init(mod);
+
+@@ -2288,14 +2276,9 @@
+ ftrace_release(mod->module_core, mod->core_size);
+ free_unload:
+ module_unload_free(mod);
+- free_init:
+-#if defined(CONFIG_MODULE_UNLOAD) && defined(CONFIG_SMP)
+- percpu_modfree(mod->refptr);
+-#endif
+ module_free(mod, mod->module_init);
+ free_core:
+ module_free(mod, mod->module_core);
+- /* mod will be freed with core. Don't access it beyond this line! */
+ free_percpu:
+ if (percpu)
+ percpu_modfree(percpu);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/posix-cpu-timers.c linux-2.6.29-rc3.owrt/kernel/posix-cpu-timers.c
+--- linux-2.6.29.owrt/kernel/posix-cpu-timers.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/posix-cpu-timers.c 2009-05-10 23:48:29.000000000 +0200
+@@ -230,71 +230,6 @@
+ return 0;
+ }
+
+-void thread_group_cputime(struct task_struct *tsk, struct task_cputime *times)
+-{
+- struct sighand_struct *sighand;
+- struct signal_struct *sig;
+- struct task_struct *t;
+-
+- *times = INIT_CPUTIME;
+-
+- rcu_read_lock();
+- sighand = rcu_dereference(tsk->sighand);
+- if (!sighand)
+- goto out;
+-
+- sig = tsk->signal;
+-
+- t = tsk;
+- do {
+- times->utime = cputime_add(times->utime, t->utime);
+- times->stime = cputime_add(times->stime, t->stime);
+- times->sum_exec_runtime += t->se.sum_exec_runtime;
+-
+- t = next_thread(t);
+- } while (t != tsk);
+-
+- times->utime = cputime_add(times->utime, sig->utime);
+- times->stime = cputime_add(times->stime, sig->stime);
+- times->sum_exec_runtime += sig->sum_sched_runtime;
+-out:
+- rcu_read_unlock();
+-}
+-
+-static void update_gt_cputime(struct task_cputime *a, struct task_cputime *b)
+-{
+- if (cputime_gt(b->utime, a->utime))
+- a->utime = b->utime;
+-
+- if (cputime_gt(b->stime, a->stime))
+- a->stime = b->stime;
+-
+- if (b->sum_exec_runtime > a->sum_exec_runtime)
+- a->sum_exec_runtime = b->sum_exec_runtime;
+-}
+-
+-void thread_group_cputimer(struct task_struct *tsk, struct task_cputime *times)
+-{
+- struct thread_group_cputimer *cputimer = &tsk->signal->cputimer;
+- struct task_cputime sum;
+- unsigned long flags;
+-
+- spin_lock_irqsave(&cputimer->lock, flags);
+- if (!cputimer->running) {
+- cputimer->running = 1;
+- /*
+- * The POSIX timer interface allows for absolute time expiry
+- * values through the TIMER_ABSTIME flag, therefore we have
+- * to synchronize the timer to the clock every time we start
+- * it.
+- */
+- thread_group_cputime(tsk, &sum);
+- update_gt_cputime(&cputimer->cputime, &sum);
+- }
+- *times = cputimer->cputime;
+- spin_unlock_irqrestore(&cputimer->lock, flags);
+-}
+-
+ /*
+ * Sample a process (thread group) clock for the given group_leader task.
+ * Must be called with tasklist_lock held for reading.
+@@ -522,7 +457,7 @@
+ {
+ struct task_cputime cputime;
+
+- thread_group_cputimer(tsk, &cputime);
++ thread_group_cputime(tsk, &cputime);
+ cleanup_timers(tsk->signal->cpu_timers,
+ cputime.utime, cputime.stime, cputime.sum_exec_runtime);
+ }
+@@ -681,33 +616,6 @@
+ }
+
+ /*
+- * Sample a process (thread group) timer for the given group_leader task.
+- * Must be called with tasklist_lock held for reading.
+- */
+-static int cpu_timer_sample_group(const clockid_t which_clock,
+- struct task_struct *p,
+- union cpu_time_count *cpu)
+-{
+- struct task_cputime cputime;
+-
+- thread_group_cputimer(p, &cputime);
+- switch (CPUCLOCK_WHICH(which_clock)) {
+- default:
+- return -EINVAL;
+- case CPUCLOCK_PROF:
+- cpu->cpu = cputime_add(cputime.utime, cputime.stime);
+- break;
+- case CPUCLOCK_VIRT:
+- cpu->cpu = cputime.utime;
+- break;
+- case CPUCLOCK_SCHED:
+- cpu->sched = cputime.sum_exec_runtime + task_delta_exec(p);
+- break;
+- }
+- return 0;
+-}
+-
+-/*
+ * Guts of sys_timer_settime for CPU timers.
+ * This is called with the timer locked and interrupts disabled.
+ * If we return TIMER_RETRY, it's necessary to release the timer's lock
+@@ -768,7 +676,7 @@
+ if (CPUCLOCK_PERTHREAD(timer->it_clock)) {
+ cpu_clock_sample(timer->it_clock, p, &val);
+ } else {
+- cpu_timer_sample_group(timer->it_clock, p, &val);
++ cpu_clock_sample_group(timer->it_clock, p, &val);
+ }
+
+ if (old) {
+@@ -916,7 +824,7 @@
+ read_unlock(&tasklist_lock);
+ goto dead;
+ } else {
+- cpu_timer_sample_group(timer->it_clock, p, &now);
++ cpu_clock_sample_group(timer->it_clock, p, &now);
+ clear_dead = (unlikely(p->exit_state) &&
+ thread_group_empty(p));
+ }
+@@ -1056,19 +964,6 @@
+ }
+ }
+
+-static void stop_process_timers(struct task_struct *tsk)
+-{
+- struct thread_group_cputimer *cputimer = &tsk->signal->cputimer;
+- unsigned long flags;
+-
+- if (!cputimer->running)
+- return;
+-
+- spin_lock_irqsave(&cputimer->lock, flags);
+- cputimer->running = 0;
+- spin_unlock_irqrestore(&cputimer->lock, flags);
+-}
+-
+ /*
+ * Check for any per-thread CPU timers that have fired and move them
+ * off the tsk->*_timers list onto the firing list. Per-thread timers
+@@ -1092,15 +987,13 @@
+ sig->rlim[RLIMIT_CPU].rlim_cur == RLIM_INFINITY &&
+ list_empty(&timers[CPUCLOCK_VIRT]) &&
+ cputime_eq(sig->it_virt_expires, cputime_zero) &&
+- list_empty(&timers[CPUCLOCK_SCHED])) {
+- stop_process_timers(tsk);
++ list_empty(&timers[CPUCLOCK_SCHED]))
+ return;
+- }
+
+ /*
+ * Collect the current process totals.
+ */
+- thread_group_cputimer(tsk, &cputime);
++ thread_group_cputime(tsk, &cputime);
+ utime = cputime.utime;
+ ptime = cputime_add(utime, cputime.stime);
+ sum_sched_runtime = cputime.sum_exec_runtime;
+@@ -1271,7 +1164,7 @@
+ clear_dead_task(timer, now);
+ goto out_unlock;
+ }
+- cpu_timer_sample_group(timer->it_clock, p, &now);
++ cpu_clock_sample_group(timer->it_clock, p, &now);
+ bump_cpu_timer(timer, now);
+ /* Leave the tasklist_lock locked for the call below. */
+ }
+@@ -1366,7 +1259,7 @@
+ if (!task_cputime_zero(&sig->cputime_expires)) {
+ struct task_cputime group_sample;
+
+- thread_group_cputimer(tsk, &group_sample);
++ thread_group_cputime(tsk, &group_sample);
+ if (task_cputime_expired(&group_sample, &sig->cputime_expires))
+ return 1;
+ }
+@@ -1448,7 +1341,7 @@
+ struct list_head *head;
+
+ BUG_ON(clock_idx == CPUCLOCK_SCHED);
+- cpu_timer_sample_group(clock_idx, tsk, &now);
++ cpu_clock_sample_group(clock_idx, tsk, &now);
+
+ if (oldval) {
+ if (!cputime_eq(*oldval, cputime_zero)) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/power/console.c linux-2.6.29-rc3.owrt/kernel/power/console.c
+--- linux-2.6.29.owrt/kernel/power/console.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/power/console.c 2009-05-10 23:48:29.000000000 +0200
+@@ -78,12 +78,6 @@
+ }
+ set_console(orig_fgconsole);
+ release_console_sem();
+-
+- if (vt_waitactive(orig_fgconsole)) {
+- pr_debug("Resume: Can't switch VCs.");
+- return;
+- }
+-
+ kmsg_redirect = orig_kmsg;
+ }
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/power/disk.c linux-2.6.29-rc3.owrt/kernel/power/disk.c
+--- linux-2.6.29.owrt/kernel/power/disk.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/power/disk.c 2009-05-10 23:48:29.000000000 +0200
+@@ -227,12 +227,6 @@
+ "aborting hibernation\n");
+ goto Enable_irqs;
+ }
+- sysdev_suspend(PMSG_FREEZE);
+- if (error) {
+- printk(KERN_ERR "PM: Some devices failed to power down, "
+- "aborting hibernation\n");
+- goto Power_up_devices;
+- }
+
+ if (hibernation_test(TEST_CORE))
+ goto Power_up;
+@@ -248,11 +242,9 @@
+ if (!in_suspend)
+ platform_leave(platform_mode);
+ Power_up:
+- sysdev_resume();
+ /* NOTE: device_power_up() is just a resume() for devices
+ * that suspended with irqs off ... no overall powerup.
+ */
+- Power_up_devices:
+ device_power_up(in_suspend ?
+ (error ? PMSG_RECOVER : PMSG_THAW) : PMSG_RESTORE);
+ Enable_irqs:
+@@ -343,7 +335,6 @@
+ "aborting resume\n");
+ goto Enable_irqs;
+ }
+- sysdev_suspend(PMSG_QUIESCE);
+ /* We'll ignore saved state, but this gets preempt count (etc) right */
+ save_processor_state();
+ error = restore_highmem();
+@@ -366,7 +357,6 @@
+ swsusp_free();
+ restore_processor_state();
+ touch_softlockup_watchdog();
+- sysdev_resume();
+ device_power_up(PMSG_RECOVER);
+ Enable_irqs:
+ local_irq_enable();
+@@ -450,7 +440,6 @@
+ local_irq_disable();
+ error = device_power_down(PMSG_HIBERNATE);
+ if (!error) {
+- sysdev_suspend(PMSG_HIBERNATE);
+ hibernation_ops->enter();
+ /* We should never get here */
+ while (1);
+@@ -606,12 +595,6 @@
+ unsigned int flags;
+
+ /*
+- * If the user said "noresume".. bail out early.
+- */
+- if (noresume)
+- return 0;
+-
+- /*
+ * name_to_dev_t() below takes a sysfs buffer mutex when sysfs
+ * is configured into the kernel. Since the regular hibernate
+ * trigger path is via sysfs which takes a buffer mutex before
+@@ -627,11 +610,6 @@
+ mutex_unlock(&pm_mutex);
+ return -ENOENT;
+ }
+- /*
+- * Some device discovery might still be in progress; we need
+- * to wait for this to finish.
+- */
+- wait_for_device_probe();
+ swsusp_resume_device = name_to_dev_t(resume_file);
+ pr_debug("PM: Resume from partition %s\n", resume_file);
+ } else {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/power/main.c linux-2.6.29-rc3.owrt/kernel/power/main.c
+--- linux-2.6.29.owrt/kernel/power/main.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/power/main.c 2009-05-10 23:48:29.000000000 +0200
+@@ -57,6 +57,16 @@
+ #ifdef CONFIG_PM_DEBUG
+ int pm_test_level = TEST_NONE;
+
++static int suspend_test(int level)
++{
++ if (pm_test_level == level) {
++ printk(KERN_INFO "suspend debug: Waiting for 5 seconds.\n");
++ mdelay(5000);
++ return 1;
++ }
++ return 0;
++}
++
+ static const char * const pm_tests[__TEST_AFTER_LAST] = {
+ [TEST_NONE] = "none",
+ [TEST_CORE] = "core",
+@@ -115,24 +125,14 @@
+ }
+
+ power_attr(pm_test);
+-#endif /* CONFIG_PM_DEBUG */
++#else /* !CONFIG_PM_DEBUG */
++static inline int suspend_test(int level) { return 0; }
++#endif /* !CONFIG_PM_DEBUG */
+
+ #endif /* CONFIG_PM_SLEEP */
+
+ #ifdef CONFIG_SUSPEND
+
+-static int suspend_test(int level)
+-{
+-#ifdef CONFIG_PM_DEBUG
+- if (pm_test_level == level) {
+- printk(KERN_INFO "suspend debug: Waiting for 5 seconds.\n");
+- mdelay(5000);
+- return 1;
+- }
+-#endif /* !CONFIG_PM_DEBUG */
+- return 0;
+-}
+-
+ #ifdef CONFIG_PM_TEST_SUSPEND
+
+ /*
+@@ -298,12 +298,8 @@
+ goto Done;
+ }
+
+- error = sysdev_suspend(PMSG_SUSPEND);
+- if (!error) {
+- if (!suspend_test(TEST_CORE))
+- error = suspend_ops->enter(state);
+- sysdev_resume();
+- }
++ if (!suspend_test(TEST_CORE))
++ error = suspend_ops->enter(state);
+
+ device_power_up(PMSG_RESUME);
+ Done:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/power/Makefile linux-2.6.29-rc3.owrt/kernel/power/Makefile
+--- linux-2.6.29.owrt/kernel/power/Makefile 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/power/Makefile 2009-05-10 23:48:29.000000000 +0200
+@@ -3,7 +3,7 @@
+ EXTRA_CFLAGS += -DDEBUG
+ endif
+
+-obj-$(CONFIG_PM) += main.o
++obj-y := main.o
+ obj-$(CONFIG_PM_SLEEP) += console.o
+ obj-$(CONFIG_FREEZER) += process.o
+ obj-$(CONFIG_HIBERNATION) += swsusp.o disk.o snapshot.o swap.o user.o
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/power/swap.c linux-2.6.29-rc3.owrt/kernel/power/swap.c
+--- linux-2.6.29.owrt/kernel/power/swap.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/power/swap.c 2009-05-10 23:48:29.000000000 +0200
+@@ -60,7 +60,6 @@
+ static int submit(int rw, pgoff_t page_off, struct page *page,
+ struct bio **bio_chain)
+ {
+- const int bio_rw = rw | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG);
+ struct bio *bio;
+
+ bio = bio_alloc(__GFP_WAIT | __GFP_HIGH, 1);
+@@ -81,7 +80,7 @@
+ bio_get(bio);
+
+ if (bio_chain == NULL) {
+- submit_bio(bio_rw, bio);
++ submit_bio(rw | (1 << BIO_RW_SYNC), bio);
+ wait_on_page_locked(page);
+ if (rw == READ)
+ bio_set_pages_dirty(bio);
+@@ -91,7 +90,7 @@
+ get_page(page); /* These pages are freed later */
+ bio->bi_private = *bio_chain;
+ *bio_chain = bio;
+- submit_bio(bio_rw, bio);
++ submit_bio(rw | (1 << BIO_RW_SYNC), bio);
+ }
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/power/user.c linux-2.6.29-rc3.owrt/kernel/power/user.c
+--- linux-2.6.29.owrt/kernel/power/user.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/power/user.c 2009-05-10 23:48:29.000000000 +0200
+@@ -95,15 +95,15 @@
+ data->swap = swsusp_resume_device ?
+ swap_type_of(swsusp_resume_device, 0, NULL) : -1;
+ data->mode = O_RDONLY;
+- error = pm_notifier_call_chain(PM_HIBERNATION_PREPARE);
++ error = pm_notifier_call_chain(PM_RESTORE_PREPARE);
+ if (error)
+- pm_notifier_call_chain(PM_POST_HIBERNATION);
++ pm_notifier_call_chain(PM_POST_RESTORE);
+ } else {
+ data->swap = -1;
+ data->mode = O_WRONLY;
+- error = pm_notifier_call_chain(PM_RESTORE_PREPARE);
++ error = pm_notifier_call_chain(PM_HIBERNATION_PREPARE);
+ if (error)
+- pm_notifier_call_chain(PM_POST_RESTORE);
++ pm_notifier_call_chain(PM_POST_HIBERNATION);
+ }
+ if (error)
+ atomic_inc(&snapshot_device_available);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/printk.c linux-2.6.29-rc3.owrt/kernel/printk.c
+--- linux-2.6.29.owrt/kernel/printk.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/printk.c 2009-05-10 23:48:29.000000000 +0200
+@@ -73,6 +73,7 @@
+ * driver system.
+ */
+ static DECLARE_MUTEX(console_sem);
++static DECLARE_MUTEX(secondary_console_sem);
+ struct console *console_drivers;
+ EXPORT_SYMBOL_GPL(console_drivers);
+
+@@ -890,14 +891,12 @@
+ printk("Suspending console(s) (use no_console_suspend to debug)\n");
+ acquire_console_sem();
+ console_suspended = 1;
+- up(&console_sem);
+ }
+
+ void resume_console(void)
+ {
+ if (!console_suspend_enabled)
+ return;
+- down(&console_sem);
+ console_suspended = 0;
+ release_console_sem();
+ }
+@@ -913,9 +912,11 @@
+ void acquire_console_sem(void)
+ {
+ BUG_ON(in_interrupt());
+- down(&console_sem);
+- if (console_suspended)
++ if (console_suspended) {
++ down(&secondary_console_sem);
+ return;
++ }
++ down(&console_sem);
+ console_locked = 1;
+ console_may_schedule = 1;
+ }
+@@ -925,10 +926,6 @@
+ {
+ if (down_trylock(&console_sem))
+ return -1;
+- if (console_suspended) {
+- up(&console_sem);
+- return -1;
+- }
+ console_locked = 1;
+ console_may_schedule = 0;
+ return 0;
+@@ -982,7 +979,7 @@
+ unsigned wake_klogd = 0;
+
+ if (console_suspended) {
+- up(&console_sem);
++ up(&secondary_console_sem);
+ return;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/profile.c linux-2.6.29-rc3.owrt/kernel/profile.c
+--- linux-2.6.29.owrt/kernel/profile.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/profile.c 2009-05-10 23:48:29.000000000 +0200
+@@ -114,15 +114,12 @@
+ if (!slab_is_available()) {
+ prof_buffer = alloc_bootmem(buffer_bytes);
+ alloc_bootmem_cpumask_var(&prof_cpu_mask);
+- cpumask_copy(prof_cpu_mask, cpu_possible_mask);
+ return 0;
+ }
+
+ if (!alloc_cpumask_var(&prof_cpu_mask, GFP_KERNEL))
+ return -ENOMEM;
+
+- cpumask_copy(prof_cpu_mask, cpu_possible_mask);
+-
+ prof_buffer = kzalloc(buffer_bytes, GFP_KERNEL);
+ if (prof_buffer)
+ return 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/rcuclassic.c linux-2.6.29-rc3.owrt/kernel/rcuclassic.c
+--- linux-2.6.29.owrt/kernel/rcuclassic.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/rcuclassic.c 2009-05-10 23:48:29.000000000 +0200
+@@ -679,8 +679,8 @@
+ void rcu_check_callbacks(int cpu, int user)
+ {
+ if (user ||
+- (idle_cpu(cpu) && rcu_scheduler_active &&
+- !in_softirq() && hardirq_count() <= (1 << HARDIRQ_SHIFT))) {
++ (idle_cpu(cpu) && !in_softirq() &&
++ hardirq_count() <= (1 << HARDIRQ_SHIFT))) {
+
+ /*
+ * Get here if this CPU took its interrupt from user
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/rcupdate.c linux-2.6.29-rc3.owrt/kernel/rcupdate.c
+--- linux-2.6.29.owrt/kernel/rcupdate.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/rcupdate.c 2009-05-10 23:48:29.000000000 +0200
+@@ -44,7 +44,6 @@
+ #include <linux/cpu.h>
+ #include <linux/mutex.h>
+ #include <linux/module.h>
+-#include <linux/kernel_stat.h>
+
+ enum rcu_barrier {
+ RCU_BARRIER_STD,
+@@ -56,7 +55,6 @@
+ static atomic_t rcu_barrier_cpu_count;
+ static DEFINE_MUTEX(rcu_barrier_mutex);
+ static struct completion rcu_barrier_completion;
+-int rcu_scheduler_active __read_mostly;
+
+ /*
+ * Awaken the corresponding synchronize_rcu() instance now that a
+@@ -82,10 +80,6 @@
+ void synchronize_rcu(void)
+ {
+ struct rcu_synchronize rcu;
+-
+- if (rcu_blocking_is_gp())
+- return;
+-
+ init_completion(&rcu.completion);
+ /* Will wake me after RCU finished. */
+ call_rcu(&rcu.head, wakeme_after_rcu);
+@@ -181,9 +175,3 @@
+ __rcu_init();
+ }
+
+-void rcu_scheduler_starting(void)
+-{
+- WARN_ON(num_online_cpus() != 1);
+- WARN_ON(nr_context_switches() > 0);
+- rcu_scheduler_active = 1;
+-}
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/rcupreempt.c linux-2.6.29-rc3.owrt/kernel/rcupreempt.c
+--- linux-2.6.29.owrt/kernel/rcupreempt.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/rcupreempt.c 2009-05-10 23:48:29.000000000 +0200
+@@ -1181,9 +1181,6 @@
+ {
+ struct rcu_synchronize rcu;
+
+- if (num_online_cpus() == 1)
+- return; /* blocking is gp if only one CPU! */
+-
+ init_completion(&rcu.completion);
+ /* Will wake me after RCU finished. */
+ call_rcu_sched(&rcu.head, wakeme_after_rcu);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/rcutree.c linux-2.6.29-rc3.owrt/kernel/rcutree.c
+--- linux-2.6.29.owrt/kernel/rcutree.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/rcutree.c 2009-05-10 23:48:29.000000000 +0200
+@@ -948,8 +948,8 @@
+ void rcu_check_callbacks(int cpu, int user)
+ {
+ if (user ||
+- (idle_cpu(cpu) && rcu_scheduler_active &&
+- !in_softirq() && hardirq_count() <= (1 << HARDIRQ_SHIFT))) {
++ (idle_cpu(cpu) && !in_softirq() &&
++ hardirq_count() <= (1 << HARDIRQ_SHIFT))) {
+
+ /*
+ * Get here if this CPU took its interrupt from user
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/sched.c linux-2.6.29-rc3.owrt/kernel/sched.c
+--- linux-2.6.29.owrt/kernel/sched.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/sched.c 2009-05-10 23:48:29.000000000 +0200
+@@ -223,7 +223,7 @@
+ {
+ ktime_t now;
+
+- if (!rt_bandwidth_enabled() || rt_b->rt_runtime == RUNTIME_INF)
++ if (rt_bandwidth_enabled() && rt_b->rt_runtime == RUNTIME_INF)
+ return;
+
+ if (hrtimer_active(&rt_b->rt_period_timer))
+@@ -3880,24 +3880,19 @@
+ int cpu = smp_processor_id();
+
+ if (stop_tick) {
++ cpumask_set_cpu(cpu, nohz.cpu_mask);
+ cpu_rq(cpu)->in_nohz_recently = 1;
+
+- if (!cpu_active(cpu)) {
+- if (atomic_read(&nohz.load_balancer) != cpu)
+- return 0;
+-
+- /*
+- * If we are going offline and still the leader,
+- * give up!
+- */
++ /*
++ * If we are going offline and still the leader, give up!
++ */
++ if (!cpu_active(cpu) &&
++ atomic_read(&nohz.load_balancer) == cpu) {
+ if (atomic_cmpxchg(&nohz.load_balancer, cpu, -1) != cpu)
+ BUG();
+-
+ return 0;
+ }
+
+- cpumask_set_cpu(cpu, nohz.cpu_mask);
+-
+ /* time for ilb owner also to sleep */
+ if (cpumask_weight(nohz.cpu_mask) == num_online_cpus()) {
+ if (atomic_read(&nohz.load_balancer) == cpu)
+@@ -4692,8 +4687,8 @@
+ * started to run but is not in state TASK_RUNNING. try_to_wake_up() returns
+ * zero in this (rare) case, and we handle it by continuing to scan the queue.
+ */
+-void __wake_up_common(wait_queue_head_t *q, unsigned int mode,
+- int nr_exclusive, int sync, void *key)
++static void __wake_up_common(wait_queue_head_t *q, unsigned int mode,
++ int nr_exclusive, int sync, void *key)
+ {
+ wait_queue_t *curr, *next;
+
+@@ -6945,26 +6940,20 @@
+
+ static void rq_attach_root(struct rq *rq, struct root_domain *rd)
+ {
+- struct root_domain *old_rd = NULL;
+ unsigned long flags;
+
+ spin_lock_irqsave(&rq->lock, flags);
+
+ if (rq->rd) {
+- old_rd = rq->rd;
++ struct root_domain *old_rd = rq->rd;
+
+ if (cpumask_test_cpu(rq->cpu, old_rd->online))
+ set_rq_offline(rq);
+
+ cpumask_clear_cpu(rq->cpu, old_rd->span);
+
+- /*
+- * If we dont want to free the old_rt yet then
+- * set old_rd to NULL to skip the freeing later
+- * in this function:
+- */
+- if (!atomic_dec_and_test(&old_rd->refcount))
+- old_rd = NULL;
++ if (atomic_dec_and_test(&old_rd->refcount))
++ free_rootdomain(old_rd);
+ }
+
+ atomic_inc(&rd->refcount);
+@@ -6975,9 +6964,6 @@
+ set_rq_online(rq);
+
+ spin_unlock_irqrestore(&rq->lock, flags);
+-
+- if (old_rd)
+- free_rootdomain(old_rd);
+ }
+
+ static int __init_refok init_rootdomain(struct root_domain *rd, bool bootmem)
+@@ -9225,16 +9211,6 @@
+
+ return ret;
+ }
+-
+-int sched_rt_can_attach(struct task_group *tg, struct task_struct *tsk)
+-{
+- /* Don't accept realtime tasks when there is no way for them to run */
+- if (rt_task(tsk) && tg->rt_bandwidth.rt_runtime == 0)
+- return 0;
+-
+- return 1;
+-}
+-
+ #else /* !CONFIG_RT_GROUP_SCHED */
+ static int sched_rt_global_constraints(void)
+ {
+@@ -9328,7 +9304,8 @@
+ struct task_struct *tsk)
+ {
+ #ifdef CONFIG_RT_GROUP_SCHED
+- if (!sched_rt_can_attach(cgroup_tg(cgrp), tsk))
++ /* Don't accept realtime tasks when there is no way for them to run */
++ if (rt_task(tsk) && cgroup_tg(cgrp)->rt_bandwidth.rt_runtime == 0)
+ return -EINVAL;
+ #else
+ /* We don't support RT-tasks being in separate groups */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/sched_fair.c linux-2.6.29-rc3.owrt/kernel/sched_fair.c
+--- linux-2.6.29.owrt/kernel/sched_fair.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/sched_fair.c 2009-05-10 23:48:29.000000000 +0200
+@@ -719,7 +719,7 @@
+ __enqueue_entity(cfs_rq, se);
+ }
+
+-static void __clear_buddies(struct cfs_rq *cfs_rq, struct sched_entity *se)
++static void clear_buddies(struct cfs_rq *cfs_rq, struct sched_entity *se)
+ {
+ if (cfs_rq->last == se)
+ cfs_rq->last = NULL;
+@@ -728,12 +728,6 @@
+ cfs_rq->next = NULL;
+ }
+
+-static void clear_buddies(struct cfs_rq *cfs_rq, struct sched_entity *se)
+-{
+- for_each_sched_entity(se)
+- __clear_buddies(cfs_rq_of(se), se);
+-}
+-
+ static void
+ dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int sleep)
+ {
+@@ -774,14 +768,8 @@
+
+ ideal_runtime = sched_slice(cfs_rq, curr);
+ delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime;
+- if (delta_exec > ideal_runtime) {
++ if (delta_exec > ideal_runtime)
+ resched_task(rq_of(cfs_rq)->curr);
+- /*
+- * The current task ran long enough, ensure it doesn't get
+- * re-elected due to buddy favours.
+- */
+- clear_buddies(cfs_rq, curr);
+- }
+ }
+
+ static void
+@@ -1464,11 +1452,6 @@
+
+ do {
+ se = pick_next_entity(cfs_rq);
+- /*
+- * If se was a buddy, clear it so that it will have to earn
+- * the favour again.
+- */
+- __clear_buddies(cfs_rq, se);
+ set_next_entity(cfs_rq, se);
+ cfs_rq = group_cfs_rq(se);
+ } while (cfs_rq);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/sched_rt.c linux-2.6.29-rc3.owrt/kernel/sched_rt.c
+--- linux-2.6.29.owrt/kernel/sched_rt.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/sched_rt.c 2009-05-10 23:48:29.000000000 +0200
+@@ -968,8 +968,8 @@
+ if ((this_cpu != -1) && cpu_isset(this_cpu, *mask))
+ return this_cpu;
+
+- first = cpumask_first(mask);
+- if (first < nr_cpu_ids)
++ first = first_cpu(*mask);
++ if (first != NR_CPUS)
+ return first;
+
+ return -1;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/sched_stats.h linux-2.6.29-rc3.owrt/kernel/sched_stats.h
+--- linux-2.6.29.owrt/kernel/sched_stats.h 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/sched_stats.h 2009-05-10 23:48:29.000000000 +0200
+@@ -296,21 +296,19 @@
+ static inline void account_group_user_time(struct task_struct *tsk,
+ cputime_t cputime)
+ {
+- struct thread_group_cputimer *cputimer;
++ struct task_cputime *times;
++ struct signal_struct *sig;
+
+ /* tsk == current, ensure it is safe to use ->signal */
+ if (unlikely(tsk->exit_state))
+ return;
+
+- cputimer = &tsk->signal->cputimer;
+-
+- if (!cputimer->running)
+- return;
++ sig = tsk->signal;
++ times = &sig->cputime.totals;
+
+- spin_lock(&cputimer->lock);
+- cputimer->cputime.utime =
+- cputime_add(cputimer->cputime.utime, cputime);
+- spin_unlock(&cputimer->lock);
++ spin_lock(&times->lock);
++ times->utime = cputime_add(times->utime, cputime);
++ spin_unlock(&times->lock);
+ }
+
+ /**
+@@ -326,21 +324,19 @@
+ static inline void account_group_system_time(struct task_struct *tsk,
+ cputime_t cputime)
+ {
+- struct thread_group_cputimer *cputimer;
++ struct task_cputime *times;
++ struct signal_struct *sig;
+
+ /* tsk == current, ensure it is safe to use ->signal */
+ if (unlikely(tsk->exit_state))
+ return;
+
+- cputimer = &tsk->signal->cputimer;
+-
+- if (!cputimer->running)
+- return;
++ sig = tsk->signal;
++ times = &sig->cputime.totals;
+
+- spin_lock(&cputimer->lock);
+- cputimer->cputime.stime =
+- cputime_add(cputimer->cputime.stime, cputime);
+- spin_unlock(&cputimer->lock);
++ spin_lock(&times->lock);
++ times->stime = cputime_add(times->stime, cputime);
++ spin_unlock(&times->lock);
+ }
+
+ /**
+@@ -356,7 +352,7 @@
+ static inline void account_group_exec_runtime(struct task_struct *tsk,
+ unsigned long long ns)
+ {
+- struct thread_group_cputimer *cputimer;
++ struct task_cputime *times;
+ struct signal_struct *sig;
+
+ sig = tsk->signal;
+@@ -365,12 +361,9 @@
+ if (unlikely(!sig))
+ return;
+
+- cputimer = &sig->cputimer;
+-
+- if (!cputimer->running)
+- return;
++ times = &sig->cputime.totals;
+
+- spin_lock(&cputimer->lock);
+- cputimer->cputime.sum_exec_runtime += ns;
+- spin_unlock(&cputimer->lock);
++ spin_lock(&times->lock);
++ times->sum_exec_runtime += ns;
++ spin_unlock(&times->lock);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/seccomp.c linux-2.6.29-rc3.owrt/kernel/seccomp.c
+--- linux-2.6.29.owrt/kernel/seccomp.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/seccomp.c 2009-05-10 23:48:29.000000000 +0200
+@@ -8,7 +8,6 @@
+
+ #include <linux/seccomp.h>
+ #include <linux/sched.h>
+-#include <linux/compat.h>
+
+ /* #define SECCOMP_DEBUG 1 */
+ #define NR_SECCOMP_MODES 1
+@@ -23,7 +22,7 @@
+ 0, /* null terminated */
+ };
+
+-#ifdef CONFIG_COMPAT
++#ifdef TIF_32BIT
+ static int mode1_syscalls_32[] = {
+ __NR_seccomp_read_32, __NR_seccomp_write_32, __NR_seccomp_exit_32, __NR_seccomp_sigreturn_32,
+ 0, /* null terminated */
+@@ -38,8 +37,8 @@
+ switch (mode) {
+ case 1:
+ syscall = mode1_syscalls;
+-#ifdef CONFIG_COMPAT
+- if (is_compat_task())
++#ifdef TIF_32BIT
++ if (test_thread_flag(TIF_32BIT))
+ syscall = mode1_syscalls_32;
+ #endif
+ do {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/signal.c linux-2.6.29-rc3.owrt/kernel/signal.c
+--- linux-2.6.29.owrt/kernel/signal.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/signal.c 2009-05-10 23:48:29.000000000 +0200
+@@ -909,9 +909,7 @@
+ }
+ #endif
+ printk("\n");
+- preempt_disable();
+ show_regs(regs);
+- preempt_enable();
+ }
+
+ static int __init setup_print_fatal_signals(char *str)
+@@ -1367,6 +1365,7 @@
+ struct siginfo info;
+ unsigned long flags;
+ struct sighand_struct *psig;
++ struct task_cputime cputime;
+ int ret = sig;
+
+ BUG_ON(sig == -1);
+@@ -1396,10 +1395,9 @@
+ info.si_uid = __task_cred(tsk)->uid;
+ rcu_read_unlock();
+
+- info.si_utime = cputime_to_clock_t(cputime_add(tsk->utime,
+- tsk->signal->utime));
+- info.si_stime = cputime_to_clock_t(cputime_add(tsk->stime,
+- tsk->signal->stime));
++ thread_group_cputime(tsk, &cputime);
++ info.si_utime = cputime_to_jiffies(cputime.utime);
++ info.si_stime = cputime_to_jiffies(cputime.stime);
+
+ info.si_status = tsk->exit_code & 0x7f;
+ if (tsk->exit_code & 0x80)
+@@ -1575,15 +1573,7 @@
+ read_lock(&tasklist_lock);
+ if (may_ptrace_stop()) {
+ do_notify_parent_cldstop(current, CLD_TRAPPED);
+- /*
+- * Don't want to allow preemption here, because
+- * sys_ptrace() needs this task to be inactive.
+- *
+- * XXX: implement read_unlock_no_resched().
+- */
+- preempt_disable();
+ read_unlock(&tasklist_lock);
+- preempt_enable_no_resched();
+ schedule();
+ } else {
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/smp.c linux-2.6.29-rc3.owrt/kernel/smp.c
+--- linux-2.6.29.owrt/kernel/smp.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/smp.c 2009-05-10 23:48:29.000000000 +0200
+@@ -18,7 +18,6 @@
+ enum {
+ CSD_FLAG_WAIT = 0x01,
+ CSD_FLAG_ALLOC = 0x02,
+- CSD_FLAG_LOCK = 0x04,
+ };
+
+ struct call_function_data {
+@@ -187,9 +186,6 @@
+ if (data_flags & CSD_FLAG_WAIT) {
+ smp_wmb();
+ data->flags &= ~CSD_FLAG_WAIT;
+- } else if (data_flags & CSD_FLAG_LOCK) {
+- smp_wmb();
+- data->flags &= ~CSD_FLAG_LOCK;
+ } else if (data_flags & CSD_FLAG_ALLOC)
+ kfree(data);
+ }
+@@ -200,8 +196,6 @@
+ }
+ }
+
+-static DEFINE_PER_CPU(struct call_single_data, csd_data);
+-
+ /*
+ * smp_call_function_single - Run a function on a specific CPU
+ * @func: The function to run. This must be fast and non-blocking.
+@@ -230,38 +224,14 @@
+ func(info);
+ local_irq_restore(flags);
+ } else if ((unsigned)cpu < nr_cpu_ids && cpu_online(cpu)) {
+- struct call_single_data *data;
++ struct call_single_data *data = NULL;
+
+ if (!wait) {
+- /*
+- * We are calling a function on a single CPU
+- * and we are not going to wait for it to finish.
+- * We first try to allocate the data, but if we
+- * fail, we fall back to use a per cpu data to pass
+- * the information to that CPU. Since all callers
+- * of this code will use the same data, we must
+- * synchronize the callers to prevent a new caller
+- * from corrupting the data before the callee
+- * can access it.
+- *
+- * The CSD_FLAG_LOCK is used to let us know when
+- * the IPI handler is done with the data.
+- * The first caller will set it, and the callee
+- * will clear it. The next caller must wait for
+- * it to clear before we set it again. This
+- * will make sure the callee is done with the
+- * data before a new caller will use it.
+- */
+ data = kmalloc(sizeof(*data), GFP_ATOMIC);
+ if (data)
+ data->flags = CSD_FLAG_ALLOC;
+- else {
+- data = &per_cpu(csd_data, me);
+- while (data->flags & CSD_FLAG_LOCK)
+- cpu_relax();
+- data->flags = CSD_FLAG_LOCK;
+- }
+- } else {
++ }
++ if (!data) {
+ data = &d;
+ data->flags = CSD_FLAG_WAIT;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/softirq.c linux-2.6.29-rc3.owrt/kernel/softirq.c
+--- linux-2.6.29.owrt/kernel/softirq.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/softirq.c 2009-05-10 23:48:29.000000000 +0200
+@@ -626,7 +626,6 @@
+ preempt_enable_no_resched();
+ cond_resched();
+ preempt_disable();
+- rcu_qsctr_inc((long)__bind_cpu);
+ }
+ preempt_enable();
+ set_current_state(TASK_INTERRUPTIBLE);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/sys.c linux-2.6.29-rc3.owrt/kernel/sys.c
+--- linux-2.6.29.owrt/kernel/sys.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/sys.c 2009-05-10 23:48:29.000000000 +0200
+@@ -559,7 +559,7 @@
+ abort_creds(new);
+ return retval;
+ }
+-
++
+ /*
+ * change the user struct in a credentials set to match the new UID
+ */
+@@ -571,11 +571,6 @@
+ if (!new_user)
+ return -EAGAIN;
+
+- if (!task_can_switch_user(new_user, current)) {
+- free_uid(new_user);
+- return -EINVAL;
+- }
+-
+ if (atomic_read(&new_user->processes) >=
+ current->signal->rlim[RLIMIT_NPROC].rlim_cur &&
+ new_user != INIT_USER) {
+@@ -636,11 +631,10 @@
+ goto error;
+ }
+
+- if (new->uid != old->uid) {
+- retval = set_user(new);
+- if (retval < 0)
+- goto error;
+- }
++ retval = -EAGAIN;
++ if (new->uid != old->uid && set_user(new) < 0)
++ goto error;
++
+ if (ruid != (uid_t) -1 ||
+ (euid != (uid_t) -1 && euid != old->uid))
+ new->suid = new->euid;
+@@ -686,10 +680,9 @@
+ retval = -EPERM;
+ if (capable(CAP_SETUID)) {
+ new->suid = new->uid = uid;
+- if (uid != old->uid) {
+- retval = set_user(new);
+- if (retval < 0)
+- goto error;
++ if (uid != old->uid && set_user(new) < 0) {
++ retval = -EAGAIN;
++ goto error;
+ }
+ } else if (uid != old->uid && uid != new->suid) {
+ goto error;
+@@ -741,13 +734,11 @@
+ goto error;
+ }
+
++ retval = -EAGAIN;
+ if (ruid != (uid_t) -1) {
+ new->uid = ruid;
+- if (ruid != old->uid) {
+- retval = set_user(new);
+- if (retval < 0)
+- goto error;
+- }
++ if (ruid != old->uid && set_user(new) < 0)
++ goto error;
+ }
+ if (euid != (uid_t) -1)
+ new->euid = euid;
+@@ -1534,14 +1525,22 @@
+ return -EINVAL;
+ if (copy_from_user(&new_rlim, rlim, sizeof(*rlim)))
+ return -EFAULT;
+- if (new_rlim.rlim_cur > new_rlim.rlim_max)
+- return -EINVAL;
+ old_rlim = current->signal->rlim + resource;
+ if ((new_rlim.rlim_max > old_rlim->rlim_max) &&
+ !capable(CAP_SYS_RESOURCE))
+ return -EPERM;
+- if (resource == RLIMIT_NOFILE && new_rlim.rlim_max > sysctl_nr_open)
+- return -EPERM;
++
++ if (resource == RLIMIT_NOFILE) {
++ if (new_rlim.rlim_max == RLIM_INFINITY)
++ new_rlim.rlim_max = sysctl_nr_open;
++ if (new_rlim.rlim_cur == RLIM_INFINITY)
++ new_rlim.rlim_cur = sysctl_nr_open;
++ if (new_rlim.rlim_max > sysctl_nr_open)
++ return -EPERM;
++ }
++
++ if (new_rlim.rlim_cur > new_rlim.rlim_max)
++ return -EINVAL;
+
+ retval = security_task_setrlimit(resource, &new_rlim);
+ if (retval)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/sysctl.c linux-2.6.29-rc3.owrt/kernel/sysctl.c
+--- linux-2.6.29.owrt/kernel/sysctl.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/sysctl.c 2009-05-10 23:48:29.000000000 +0200
+@@ -101,7 +101,6 @@
+
+ static int zero;
+ static int one = 1;
+-static unsigned long one_ul = 1;
+ static int one_hundred = 100;
+
+ /* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */
+@@ -975,7 +974,7 @@
+ .mode = 0644,
+ .proc_handler = &dirty_background_bytes_handler,
+ .strategy = &sysctl_intvec,
+- .extra1 = &one_ul,
++ .extra1 = &one,
+ },
+ {
+ .ctl_name = VM_DIRTY_RATIO,
+@@ -996,7 +995,7 @@
+ .mode = 0644,
+ .proc_handler = &dirty_bytes_handler,
+ .strategy = &sysctl_intvec,
+- .extra1 = &one_ul,
++ .extra1 = &one,
+ },
+ {
+ .procname = "dirty_writeback_centisecs",
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/time/tick-common.c linux-2.6.29-rc3.owrt/kernel/time/tick-common.c
+--- linux-2.6.29.owrt/kernel/time/tick-common.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/time/tick-common.c 2009-05-10 23:48:29.000000000 +0200
+@@ -274,21 +274,6 @@
+ }
+
+ /*
+- * Transfer the do_timer job away from a dying cpu.
+- *
+- * Called with interrupts disabled.
+- */
+-static void tick_handover_do_timer(int *cpup)
+-{
+- if (*cpup == tick_do_timer_cpu) {
+- int cpu = cpumask_first(cpu_online_mask);
+-
+- tick_do_timer_cpu = (cpu < nr_cpu_ids) ? cpu :
+- TICK_DO_TIMER_NONE;
+- }
+-}
+-
+-/*
+ * Shutdown an event device on a given cpu:
+ *
+ * This is called on a life CPU, when a CPU is dead. So we cannot
+@@ -312,6 +297,13 @@
+ clockevents_exchange_device(dev, NULL);
+ td->evtdev = NULL;
+ }
++ /* Transfer the do_timer job away from this cpu */
++ if (*cpup == tick_do_timer_cpu) {
++ int cpu = cpumask_first(cpu_online_mask);
++
++ tick_do_timer_cpu = (cpu < nr_cpu_ids) ? cpu :
++ TICK_DO_TIMER_NONE;
++ }
+ spin_unlock_irqrestore(&tick_device_lock, flags);
+ }
+
+@@ -365,10 +357,6 @@
+ tick_broadcast_oneshot_control(reason);
+ break;
+
+- case CLOCK_EVT_NOTIFY_CPU_DYING:
+- tick_handover_do_timer(dev);
+- break;
+-
+ case CLOCK_EVT_NOTIFY_CPU_DEAD:
+ tick_shutdown_broadcast_oneshot(dev);
+ tick_shutdown_broadcast(dev);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/trace/ftrace.c linux-2.6.29-rc3.owrt/kernel/trace/ftrace.c
+--- linux-2.6.29.owrt/kernel/trace/ftrace.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/trace/ftrace.c 2009-05-10 23:48:29.000000000 +0200
+@@ -17,7 +17,6 @@
+ #include <linux/clocksource.h>
+ #include <linux/kallsyms.h>
+ #include <linux/seq_file.h>
+-#include <linux/suspend.h>
+ #include <linux/debugfs.h>
+ #include <linux/hardirq.h>
+ #include <linux/kthread.h>
+@@ -1737,12 +1736,9 @@
+ {
+ struct task_struct *p;
+
+- rcu_read_lock();
+ do_each_pid_task(pid, PIDTYPE_PID, p) {
+ clear_tsk_trace_trace(p);
+ } while_each_pid_task(pid, PIDTYPE_PID, p);
+- rcu_read_unlock();
+-
+ put_pid(pid);
+ }
+
+@@ -1750,11 +1746,9 @@
+ {
+ struct task_struct *p;
+
+- rcu_read_lock();
+ do_each_pid_task(pid, PIDTYPE_PID, p) {
+ set_tsk_trace_trace(p);
+ } while_each_pid_task(pid, PIDTYPE_PID, p);
+- rcu_read_unlock();
+ }
+
+ static void clear_ftrace_pid_task(struct pid **pid)
+@@ -1971,7 +1965,6 @@
+ #ifdef CONFIG_FUNCTION_GRAPH_TRACER
+
+ static atomic_t ftrace_graph_active;
+-static struct notifier_block ftrace_suspend_notifier;
+
+ int ftrace_graph_entry_stub(struct ftrace_graph_ent *trace)
+ {
+@@ -2033,7 +2026,7 @@
+ static int start_graph_tracing(void)
+ {
+ struct ftrace_ret_stack **ret_stack_list;
+- int ret, cpu;
++ int ret;
+
+ ret_stack_list = kmalloc(FTRACE_RETSTACK_ALLOC_SIZE *
+ sizeof(struct ftrace_ret_stack *),
+@@ -2042,10 +2035,6 @@
+ if (!ret_stack_list)
+ return -ENOMEM;
+
+- /* The cpu_boot init_task->ret_stack will never be freed */
+- for_each_online_cpu(cpu)
+- ftrace_graph_init_task(idle_task(cpu));
+-
+ do {
+ ret = alloc_retstack_tasklist(ret_stack_list);
+ } while (ret == -EAGAIN);
+@@ -2054,27 +2043,6 @@
+ return ret;
+ }
+
+-/*
+- * Hibernation protection.
+- * The state of the current task is too much unstable during
+- * suspend/restore to disk. We want to protect against that.
+- */
+-static int
+-ftrace_suspend_notifier_call(struct notifier_block *bl, unsigned long state,
+- void *unused)
+-{
+- switch (state) {
+- case PM_HIBERNATION_PREPARE:
+- pause_graph_tracing();
+- break;
+-
+- case PM_POST_HIBERNATION:
+- unpause_graph_tracing();
+- break;
+- }
+- return NOTIFY_DONE;
+-}
+-
+ int register_ftrace_graph(trace_func_graph_ret_t retfunc,
+ trace_func_graph_ent_t entryfunc)
+ {
+@@ -2082,9 +2050,6 @@
+
+ mutex_lock(&ftrace_sysctl_lock);
+
+- ftrace_suspend_notifier.notifier_call = ftrace_suspend_notifier_call;
+- register_pm_notifier(&ftrace_suspend_notifier);
+-
+ atomic_inc(&ftrace_graph_active);
+ ret = start_graph_tracing();
+ if (ret) {
+@@ -2110,7 +2075,6 @@
+ ftrace_graph_return = (trace_func_graph_ret_t)ftrace_stub;
+ ftrace_graph_entry = ftrace_graph_entry_stub;
+ ftrace_shutdown(FTRACE_STOP_FUNC_RET);
+- unregister_pm_notifier(&ftrace_suspend_notifier);
+
+ mutex_unlock(&ftrace_sysctl_lock);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/trace/Kconfig linux-2.6.29-rc3.owrt/kernel/trace/Kconfig
+--- linux-2.6.29.owrt/kernel/trace/Kconfig 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/trace/Kconfig 2009-05-10 23:48:29.000000000 +0200
+@@ -52,7 +52,6 @@
+ depends on HAVE_FUNCTION_TRACER
+ depends on DEBUG_KERNEL
+ select FRAME_POINTER
+- select KALLSYMS
+ select TRACING
+ select CONTEXT_SWITCH_TRACER
+ help
+@@ -239,7 +238,6 @@
+ depends on DEBUG_KERNEL
+ select FUNCTION_TRACER
+ select STACKTRACE
+- select KALLSYMS
+ help
+ This special tracer records the maximum stack footprint of the
+ kernel and displays it in debugfs/tracing/stack_trace.
+@@ -304,27 +302,4 @@
+ functioning properly. It will do tests on all the configured
+ tracers of ftrace.
+
+-config MMIOTRACE
+- bool "Memory mapped IO tracing"
+- depends on HAVE_MMIOTRACE_SUPPORT && DEBUG_KERNEL && PCI
+- select TRACING
+- help
+- Mmiotrace traces Memory Mapped I/O access and is meant for
+- debugging and reverse engineering. It is called from the ioremap
+- implementation and works via page faults. Tracing is disabled by
+- default and can be enabled at run-time.
+-
+- See Documentation/tracers/mmiotrace.txt.
+- If you are not helping to develop drivers, say N.
+-
+-config MMIOTRACE_TEST
+- tristate "Test module for mmiotrace"
+- depends on MMIOTRACE && m
+- help
+- This is a dumb module for testing mmiotrace. It is very dangerous
+- as it will write garbage to IO memory starting at a given address.
+- However, it should be safe to use on e.g. unused portion of VRAM.
+-
+- Say N, unless you absolutely know what you are doing.
+-
+ endmenu
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/trace/ring_buffer.c linux-2.6.29-rc3.owrt/kernel/trace/ring_buffer.c
+--- linux-2.6.29.owrt/kernel/trace/ring_buffer.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/trace/ring_buffer.c 2009-05-10 23:48:29.000000000 +0200
+@@ -246,7 +246,7 @@
+ return 0;
+ }
+
+-#define BUF_PAGE_SIZE (PAGE_SIZE - offsetof(struct buffer_data_page, data))
++#define BUF_PAGE_SIZE (PAGE_SIZE - sizeof(struct buffer_data_page))
+
+ /*
+ * head_page == tail_page && head == tail then buffer is empty.
+@@ -1025,8 +1025,12 @@
+ }
+
+ if (next_page == head_page) {
+- if (!(buffer->flags & RB_FL_OVERWRITE))
++ if (!(buffer->flags & RB_FL_OVERWRITE)) {
++ /* reset write */
++ if (tail <= BUF_PAGE_SIZE)
++ local_set(&tail_page->write, tail);
+ goto out_unlock;
++ }
+
+ /* tail_page has not moved yet? */
+ if (tail_page == cpu_buffer->tail_page) {
+@@ -1101,10 +1105,6 @@
+ return event;
+
+ out_unlock:
+- /* reset write */
+- if (tail <= BUF_PAGE_SIZE)
+- local_set(&tail_page->write, tail);
+-
+ __raw_spin_unlock(&cpu_buffer->lock);
+ local_irq_restore(flags);
+ return NULL;
+@@ -2174,9 +2174,6 @@
+
+ cpu_buffer->overrun = 0;
+ cpu_buffer->entries = 0;
+-
+- cpu_buffer->write_stamp = 0;
+- cpu_buffer->read_stamp = 0;
+ }
+
+ /**
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/trace/trace.c linux-2.6.29-rc3.owrt/kernel/trace/trace.c
+--- linux-2.6.29.owrt/kernel/trace/trace.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/trace/trace.c 2009-05-10 23:48:29.000000000 +0200
+@@ -40,7 +40,7 @@
+
+ #define TRACE_BUFFER_FLAGS (RB_FL_OVERWRITE)
+
+-unsigned long __read_mostly tracing_max_latency;
++unsigned long __read_mostly tracing_max_latency = (cycle_t)ULONG_MAX;
+ unsigned long __read_mostly tracing_thresh;
+
+ /*
+@@ -3736,7 +3736,7 @@
+ * it if we decide to change what log level the ftrace dump
+ * should be at.
+ */
+-#define KERN_TRACE KERN_EMERG
++#define KERN_TRACE KERN_INFO
+
+ static void
+ trace_printk_seq(struct trace_seq *s)
+@@ -3770,7 +3770,6 @@
+ dump_ran = 1;
+
+ /* No turning back! */
+- tracing_off();
+ ftrace_kill();
+
+ for_each_tracing_cpu(cpu) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/trace/trace_irqsoff.c linux-2.6.29-rc3.owrt/kernel/trace/trace_irqsoff.c
+--- linux-2.6.29.owrt/kernel/trace/trace_irqsoff.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/trace/trace_irqsoff.c 2009-05-10 23:48:29.000000000 +0200
+@@ -380,7 +380,6 @@
+
+ static void __irqsoff_tracer_init(struct trace_array *tr)
+ {
+- tracing_max_latency = 0;
+ irqsoff_trace = tr;
+ /* make sure that the tracer is visible */
+ smp_wmb();
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/trace/trace_mmiotrace.c linux-2.6.29-rc3.owrt/kernel/trace/trace_mmiotrace.c
+--- linux-2.6.29.owrt/kernel/trace/trace_mmiotrace.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/trace/trace_mmiotrace.c 2009-05-10 23:48:29.000000000 +0200
+@@ -9,7 +9,6 @@
+ #include <linux/kernel.h>
+ #include <linux/mmiotrace.h>
+ #include <linux/pci.h>
+-#include <asm/atomic.h>
+
+ #include "trace.h"
+
+@@ -20,7 +19,6 @@
+ static struct trace_array *mmio_trace_array;
+ static bool overrun_detected;
+ static unsigned long prev_overruns;
+-static atomic_t dropped_count;
+
+ static void mmio_reset_data(struct trace_array *tr)
+ {
+@@ -123,11 +121,11 @@
+
+ static unsigned long count_overruns(struct trace_iterator *iter)
+ {
+- unsigned long cnt = atomic_xchg(&dropped_count, 0);
++ unsigned long cnt = 0;
+ unsigned long over = ring_buffer_overruns(iter->tr->buffer);
+
+ if (over > prev_overruns)
+- cnt += over - prev_overruns;
++ cnt = over - prev_overruns;
+ prev_overruns = over;
+ return cnt;
+ }
+@@ -312,10 +310,8 @@
+
+ event = ring_buffer_lock_reserve(tr->buffer, sizeof(*entry),
+ &irq_flags);
+- if (!event) {
+- atomic_inc(&dropped_count);
++ if (!event)
+ return;
+- }
+ entry = ring_buffer_event_data(event);
+ tracing_generic_entry_update(&entry->ent, 0, preempt_count());
+ entry->ent.type = TRACE_MMIO_RW;
+@@ -342,10 +338,8 @@
+
+ event = ring_buffer_lock_reserve(tr->buffer, sizeof(*entry),
+ &irq_flags);
+- if (!event) {
+- atomic_inc(&dropped_count);
++ if (!event)
+ return;
+- }
+ entry = ring_buffer_event_data(event);
+ tracing_generic_entry_update(&entry->ent, 0, preempt_count());
+ entry->ent.type = TRACE_MMIO_MAP;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/trace/trace_sched_wakeup.c linux-2.6.29-rc3.owrt/kernel/trace/trace_sched_wakeup.c
+--- linux-2.6.29.owrt/kernel/trace/trace_sched_wakeup.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/trace/trace_sched_wakeup.c 2009-05-10 23:48:29.000000000 +0200
+@@ -333,7 +333,6 @@
+
+ static int wakeup_tracer_init(struct trace_array *tr)
+ {
+- tracing_max_latency = 0;
+ wakeup_trace = tr;
+ start_wakeup_tracer(tr);
+ return 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/trace/trace_selftest.c linux-2.6.29-rc3.owrt/kernel/trace/trace_selftest.c
+--- linux-2.6.29.owrt/kernel/trace/trace_selftest.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/trace/trace_selftest.c 2009-05-10 23:48:29.000000000 +0200
+@@ -23,20 +23,10 @@
+ {
+ struct ring_buffer_event *event;
+ struct trace_entry *entry;
+- unsigned int loops = 0;
+
+ while ((event = ring_buffer_consume(tr->buffer, cpu, NULL))) {
+ entry = ring_buffer_event_data(event);
+
+- /*
+- * The ring buffer is a size of trace_buf_size, if
+- * we loop more than the size, there's something wrong
+- * with the ring buffer.
+- */
+- if (loops++ > trace_buf_size) {
+- printk(KERN_CONT ".. bad ring buffer ");
+- goto failed;
+- }
+ if (!trace_valid_entry(entry)) {
+ printk(KERN_CONT ".. invalid entry %d ",
+ entry->type);
+@@ -67,20 +57,11 @@
+
+ cnt = ring_buffer_entries(tr->buffer);
+
+- /*
+- * The trace_test_buffer_cpu runs a while loop to consume all data.
+- * If the calling tracer is broken, and is constantly filling
+- * the buffer, this will run forever, and hard lock the box.
+- * We disable the ring buffer while we do this test to prevent
+- * a hard lock up.
+- */
+- tracing_off();
+ for_each_possible_cpu(cpu) {
+ ret = trace_test_buffer_cpu(tr, cpu);
+ if (ret)
+ break;
+ }
+- tracing_on();
+ __raw_spin_unlock(&ftrace_max_lock);
+ local_irq_restore(flags);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/tsacct.c linux-2.6.29-rc3.owrt/kernel/tsacct.c
+--- linux-2.6.29.owrt/kernel/tsacct.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/tsacct.c 2009-05-10 23:48:29.000000000 +0200
+@@ -122,10 +122,8 @@
+ if (likely(tsk->mm)) {
+ cputime_t time, dtime;
+ struct timeval value;
+- unsigned long flags;
+ u64 delta;
+
+- local_irq_save(flags);
+ time = tsk->stime + tsk->utime;
+ dtime = cputime_sub(time, tsk->acct_timexpd);
+ jiffies_to_timeval(cputime_to_jiffies(dtime), &value);
+@@ -133,12 +131,10 @@
+ delta = delta * USEC_PER_SEC + value.tv_usec;
+
+ if (delta == 0)
+- goto out;
++ return;
+ tsk->acct_timexpd = time;
+ tsk->acct_rss_mem1 += delta * get_mm_rss(tsk->mm);
+ tsk->acct_vm_mem1 += delta * tsk->mm->total_vm;
+- out:
+- local_irq_restore(flags);
+ }
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/user.c linux-2.6.29-rc3.owrt/kernel/user.c
+--- linux-2.6.29.owrt/kernel/user.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/user.c 2009-05-10 23:48:29.000000000 +0200
+@@ -72,7 +72,6 @@
+ static void uid_hash_remove(struct user_struct *up)
+ {
+ hlist_del_init(&up->uidhash_node);
+- put_user_ns(up->user_ns);
+ }
+
+ static struct user_struct *uid_hash_find(uid_t uid, struct hlist_head *hashent)
+@@ -286,12 +285,14 @@
+ /* work function to remove sysfs directory for a user and free up
+ * corresponding structures.
+ */
+-static void cleanup_user_struct(struct work_struct *w)
++static void remove_user_sysfs_dir(struct work_struct *w)
+ {
+ struct user_struct *up = container_of(w, struct user_struct, work);
+ unsigned long flags;
+ int remove_user = 0;
+
++ if (up->user_ns != &init_user_ns)
++ return;
+ /* Make uid_hash_remove() + sysfs_remove_file() + kobject_del()
+ * atomic.
+ */
+@@ -310,11 +311,9 @@
+ if (!remove_user)
+ goto done;
+
+- if (up->user_ns == &init_user_ns) {
+- kobject_uevent(&up->kobj, KOBJ_REMOVE);
+- kobject_del(&up->kobj);
+- kobject_put(&up->kobj);
+- }
++ kobject_uevent(&up->kobj, KOBJ_REMOVE);
++ kobject_del(&up->kobj);
++ kobject_put(&up->kobj);
+
+ sched_destroy_user(up);
+ key_put(up->uid_keyring);
+@@ -335,7 +334,8 @@
+ atomic_inc(&up->__count);
+ spin_unlock_irqrestore(&uidhash_lock, flags);
+
+- INIT_WORK(&up->work, cleanup_user_struct);
++ put_user_ns(up->user_ns);
++ INIT_WORK(&up->work, remove_user_sysfs_dir);
+ schedule_work(&up->work);
+ }
+
+@@ -357,29 +357,12 @@
+ sched_destroy_user(up);
+ key_put(up->uid_keyring);
+ key_put(up->session_keyring);
++ put_user_ns(up->user_ns);
+ kmem_cache_free(uid_cachep, up);
+ }
+
+ #endif
+
+-#if defined(CONFIG_RT_GROUP_SCHED) && defined(CONFIG_USER_SCHED)
+-/*
+- * We need to check if a setuid can take place. This function should be called
+- * before successfully completing the setuid.
+- */
+-int task_can_switch_user(struct user_struct *up, struct task_struct *tsk)
+-{
+-
+- return sched_rt_can_attach(up->tg, tsk);
+-
+-}
+-#else
+-int task_can_switch_user(struct user_struct *up, struct task_struct *tsk)
+-{
+- return 1;
+-}
+-#endif
+-
+ /*
+ * Locate the user_struct for the passed UID. If found, take a ref on it. The
+ * caller must undo that ref with free_uid().
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/user_namespace.c linux-2.6.29-rc3.owrt/kernel/user_namespace.c
+--- linux-2.6.29.owrt/kernel/user_namespace.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/user_namespace.c 2009-05-10 23:48:29.000000000 +0200
+@@ -60,25 +60,12 @@
+ return 0;
+ }
+
+-/*
+- * Deferred destructor for a user namespace. This is required because
+- * free_user_ns() may be called with uidhash_lock held, but we need to call
+- * back to free_uid() which will want to take the lock again.
+- */
+-static void free_user_ns_work(struct work_struct *work)
+-{
+- struct user_namespace *ns =
+- container_of(work, struct user_namespace, destroyer);
+- free_uid(ns->creator);
+- kfree(ns);
+-}
+-
+ void free_user_ns(struct kref *kref)
+ {
+- struct user_namespace *ns =
+- container_of(kref, struct user_namespace, kref);
++ struct user_namespace *ns;
+
+- INIT_WORK(&ns->destroyer, free_user_ns_work);
+- schedule_work(&ns->destroyer);
++ ns = container_of(kref, struct user_namespace, kref);
++ free_uid(ns->creator);
++ kfree(ns);
+ }
+ EXPORT_SYMBOL(free_user_ns);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/kernel/wait.c linux-2.6.29-rc3.owrt/kernel/wait.c
+--- linux-2.6.29.owrt/kernel/wait.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/kernel/wait.c 2009-05-10 23:48:29.000000000 +0200
+@@ -91,15 +91,6 @@
+ }
+ EXPORT_SYMBOL(prepare_to_wait_exclusive);
+
+-/*
+- * finish_wait - clean up after waiting in a queue
+- * @q: waitqueue waited on
+- * @wait: wait descriptor
+- *
+- * Sets current thread back to running state and removes
+- * the wait descriptor from the given waitqueue if still
+- * queued.
+- */
+ void finish_wait(wait_queue_head_t *q, wait_queue_t *wait)
+ {
+ unsigned long flags;
+@@ -126,39 +117,6 @@
+ }
+ EXPORT_SYMBOL(finish_wait);
+
+-/*
+- * abort_exclusive_wait - abort exclusive waiting in a queue
+- * @q: waitqueue waited on
+- * @wait: wait descriptor
+- * @state: runstate of the waiter to be woken
+- * @key: key to identify a wait bit queue or %NULL
+- *
+- * Sets current thread back to running state and removes
+- * the wait descriptor from the given waitqueue if still
+- * queued.
+- *
+- * Wakes up the next waiter if the caller is concurrently
+- * woken up through the queue.
+- *
+- * This prevents waiter starvation where an exclusive waiter
+- * aborts and is woken up concurrently and noone wakes up
+- * the next waiter.
+- */
+-void abort_exclusive_wait(wait_queue_head_t *q, wait_queue_t *wait,
+- unsigned int mode, void *key)
+-{
+- unsigned long flags;
+-
+- __set_current_state(TASK_RUNNING);
+- spin_lock_irqsave(&q->lock, flags);
+- if (!list_empty(&wait->task_list))
+- list_del_init(&wait->task_list);
+- else if (waitqueue_active(q))
+- __wake_up_common(q, mode, 1, 0, key);
+- spin_unlock_irqrestore(&q->lock, flags);
+-}
+-EXPORT_SYMBOL(abort_exclusive_wait);
+-
+ int autoremove_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key)
+ {
+ int ret = default_wake_function(wait, mode, sync, key);
+@@ -219,20 +177,17 @@
+ __wait_on_bit_lock(wait_queue_head_t *wq, struct wait_bit_queue *q,
+ int (*action)(void *), unsigned mode)
+ {
+- do {
+- int ret;
++ int ret = 0;
+
++ do {
+ prepare_to_wait_exclusive(wq, &q->wait, mode);
+- if (!test_bit(q->key.bit_nr, q->key.flags))
+- continue;
+- ret = action(q->key.flags);
+- if (!ret)
+- continue;
+- abort_exclusive_wait(wq, &q->wait, mode, &q->key);
+- return ret;
++ if (test_bit(q->key.bit_nr, q->key.flags)) {
++ if ((ret = (*action)(q->key.flags)))
++ break;
++ }
+ } while (test_and_set_bit(q->key.bit_nr, q->key.flags));
+ finish_wait(wq, &q->wait);
+- return 0;
++ return ret;
+ }
+ EXPORT_SYMBOL(__wait_on_bit_lock);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/lib/bitmap.c linux-2.6.29-rc3.owrt/lib/bitmap.c
+--- linux-2.6.29.owrt/lib/bitmap.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/lib/bitmap.c 2009-05-10 23:48:29.000000000 +0200
+@@ -948,15 +948,15 @@
+ */
+ int bitmap_find_free_region(unsigned long *bitmap, int bits, int order)
+ {
+- int pos, end; /* scans bitmap by regions of size order */
++ int pos; /* scans bitmap by regions of size order */
+
+- for (pos = 0 ; (end = pos + (1 << order)) <= bits; pos = end) {
+- if (!__reg_op(bitmap, pos, order, REG_OP_ISFREE))
+- continue;
+- __reg_op(bitmap, pos, order, REG_OP_ALLOC);
+- return pos;
+- }
+- return -ENOMEM;
++ for (pos = 0; pos < bits; pos += (1 << order))
++ if (__reg_op(bitmap, pos, order, REG_OP_ISFREE))
++ break;
++ if (pos == bits)
++ return -ENOMEM;
++ __reg_op(bitmap, pos, order, REG_OP_ALLOC);
++ return pos;
+ }
+ EXPORT_SYMBOL(bitmap_find_free_region);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/lib/idr.c linux-2.6.29-rc3.owrt/lib/idr.c
+--- linux-2.6.29.owrt/lib/idr.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/lib/idr.c 2009-05-10 23:48:29.000000000 +0200
+@@ -449,7 +449,6 @@
+
+ n = idp->layers * IDR_BITS;
+ p = idp->top;
+- rcu_assign_pointer(idp->top, NULL);
+ max = 1 << n;
+
+ id = 0;
+@@ -468,6 +467,7 @@
+ p = *--paa;
+ }
+ }
++ rcu_assign_pointer(idp->top, NULL);
+ idp->layers = 0;
+ }
+ EXPORT_SYMBOL(idr_remove_all);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/lib/Kconfig.debug linux-2.6.29-rc3.owrt/lib/Kconfig.debug
+--- linux-2.6.29.owrt/lib/Kconfig.debug 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/lib/Kconfig.debug 2009-05-10 23:48:29.000000000 +0200
+@@ -838,7 +838,7 @@
+
+ If unsure, say N.
+
+-config BUILD_DOCSRC
++menuconfig BUILD_DOCSRC
+ bool "Build targets in Documentation/ tree"
+ depends on HEADERS_CHECK
+ help
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/lib/smp_processor_id.c linux-2.6.29-rc3.owrt/lib/smp_processor_id.c
+--- linux-2.6.29.owrt/lib/smp_processor_id.c 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/lib/smp_processor_id.c 2009-05-10 23:48:29.000000000 +0200
+@@ -22,7 +22,7 @@
+ * Kernel threads bound to a single CPU can safely use
+ * smp_processor_id():
+ */
+- if (cpumask_equal(&current->cpus_allowed, cpumask_of(this_cpu)))
++ if (cpus_equal(current->cpus_allowed, cpumask_of_cpu(this_cpu)))
+ goto out;
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/.mailmap linux-2.6.29-rc3.owrt/.mailmap
+--- linux-2.6.29.owrt/.mailmap 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/.mailmap 2009-05-10 23:48:29.000000000 +0200
+@@ -92,7 +92,6 @@
+ Rui Saraiva <rmps@joel.ist.utl.pt>
+ Sachin P Sant <ssant@in.ibm.com>
+ Sam Ravnborg <sam@mars.ravnborg.org>
+-Sascha Hauer <s.hauer@pengutronix.de>
+ S.Çağlar Onur <caglar@pardus.org.tr>
+ Simon Kelley <simon@thekelleys.org.uk>
+ Stéphane Witzmann <stephane.witzmann@ubpmes.univ-bpclermont.fr>
+@@ -101,7 +100,6 @@
+ Thomas Graf <tgraf@suug.ch>
+ Tony Luck <tony.luck@intel.com>
+ Tsuneo Yoshioka <Tsuneo.Yoshioka@f-secure.com>
+-Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de>
+-Uwe Kleine-König <ukl@pengutronix.de>
+ Uwe Kleine-König <Uwe.Kleine-Koenig@digi.com>
++Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de>
+ Valdis Kletnieks <Valdis.Kletnieks@vt.edu>
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/MAINTAINERS linux-2.6.29-rc3.owrt/MAINTAINERS
+--- linux-2.6.29.owrt/MAINTAINERS 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/MAINTAINERS 2009-05-10 23:48:33.000000000 +0200
+@@ -692,13 +692,6 @@
+ L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
+ S: Maintained
+
+-ARM/NUVOTON W90X900 ARM ARCHITECTURE
+-P: Wan ZongShun
+-M: mcuos.com@gmail.com
+-L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
+-W: http://www.mcuos.com
+-S: Maintained
+-
+ ARPD SUPPORT
+ P: Jonathan Layes
+ L: netdev@vger.kernel.org
+@@ -918,7 +911,7 @@
+ BLACKFIN ARCHITECTURE
+ P: Bryan Wu
+ M: cooloney@kernel.org
+-L: uclinux-dist-devel@blackfin.uclinux.org
++L: uclinux-dist-devel@blackfin.uclinux.org (subscribers-only)
+ W: http://blackfin.uclinux.org
+ S: Supported
+
+@@ -1028,14 +1021,6 @@
+ W: http://bu3sch.de/btgpio.php
+ S: Maintained
+
+-BTRFS FILE SYSTEM
+-P: Chris Mason
+-M: chris.mason@oracle.com
+-L: linux-btrfs@vger.kernel.org
+-W: http://btrfs.wiki.kernel.org/
+-T: git kernel.org:/pub/scm/linux/kernel/git/mason/btrfs-unstable.git
+-S: Maintained
+-
+ BTTV VIDEO4LINUX DRIVER
+ P: Mauro Carvalho Chehab
+ M: mchehab@infradead.org
+@@ -1209,8 +1194,6 @@
+ CONTROL GROUPS (CGROUPS)
+ P: Paul Menage
+ M: menage@google.com
+-P: Li Zefan
+-M: lizf@cn.fujitsu.com
+ L: containers@lists.linux-foundation.org
+ S: Maintained
+
+@@ -1469,6 +1452,8 @@
+ S: Supported
+
+ DOCUMENTATION (/Documentation directory)
++P: Michael Kerrisk
++M: mtk.manpages@gmail.com
+ P: Randy Dunlap
+ M: rdunlap@xenotime.net
+ L: linux-doc@vger.kernel.org
+@@ -1910,10 +1895,10 @@
+ S: Maintained
+
+ HARD DRIVE ACTIVE PROTECTION SYSTEM (HDAPS) DRIVER
+-P: Frank Seidel
+-M: frank@f-seidel.de
+-L: lm-sensors@lm-sensors.org
+-W: http://www.kernel.org/pub/linux/kernel/people/fseidel/hdaps/
++P: Robert Love
++M: rlove@rlove.org
++M: linux-kernel@vger.kernel.org
++W: http://www.kernel.org/pub/linux/kernel/people/rml/hdaps/
+ S: Maintained
+
+ GSPCA FINEPIX SUBDRIVER
+@@ -2011,7 +1996,7 @@
+
+ HIBERNATION (aka Software Suspend, aka swsusp)
+ P: Pavel Machek
+-M: pavel@ucw.cz
++M: pavel@suse.cz
+ P: Rafael J. Wysocki
+ M: rjw@sisk.pl
+ L: linux-pm@lists.linux-foundation.org
+@@ -2232,7 +2217,7 @@
+ M: sean.hefty@intel.com
+ P: Hal Rosenstock
+ M: hal.rosenstock@gmail.com
+-L: general@lists.openfabrics.org (moderated for non-subscribers)
++L: general@lists.openfabrics.org
+ W: http://www.openib.org/
+ T: git kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
+ S: Supported
+@@ -2467,7 +2452,7 @@
+
+ ISDN SUBSYSTEM
+ P: Karsten Keil
+-M: isdn@linux-pingi.de
++M: kkeil@suse.de
+ L: isdn4linux@listserv.isdn4linux.de (subscribers-only)
+ W: http://www.isdn4linux.de
+ T: git kernel.org:/pub/scm/linux/kernel/kkeil/isdn-2.6.git
+@@ -2856,6 +2841,8 @@
+ MAC80211
+ P: Johannes Berg
+ M: johannes@sipsolutions.net
++P: Michael Wu
++M: flamingice@sourmilk.net
+ L: linux-wireless@vger.kernel.org
+ W: http://linuxwireless.org/
+ T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git
+@@ -2882,7 +2869,7 @@
+ M: mtk.manpages@gmail.com
+ W: http://www.kernel.org/doc/man-pages
+ L: linux-man@vger.kernel.org
+-S: Maintained
++S: Supported
+
+ MARVELL LIBERTAS WIRELESS DRIVER
+ P: Dan Williams
+@@ -3337,8 +3324,8 @@
+ M: jeremy@xensource.com
+ P: Chris Wright
+ M: chrisw@sous-sol.org
+-P: Alok Kataria
+-M: akataria@vmware.com
++P: Zachary Amsden
++M: zach@vmware.com
+ P: Rusty Russell
+ M: rusty@rustcorp.com.au
+ L: virtualization@lists.osdl.org
+@@ -3355,8 +3342,10 @@
+ PARISC ARCHITECTURE
+ P: Kyle McMartin
+ M: kyle@mcmartin.ca
+-P: Helge Deller
+-M: deller@gmx.de
++P: Matthew Wilcox
++M: matthew@wil.cx
++P: Grant Grundler
++M: grundler@parisc-linux.org
+ L: linux-parisc@vger.kernel.org
+ W: http://www.parisc-linux.org/
+ T: git kernel.org:/pub/scm/linux/kernel/git/kyle/parisc-2.6.git
+@@ -3547,12 +3536,6 @@
+ PXA MMCI DRIVER
+ S: Orphan
+
+-PXA RTC DRIVER
+-P: Robert Jarzmik
+-M: robert.jarzmik@free.fr
+-L: rtc-linux@googlegroups.com
+-S: Maintained
+-
+ QLOGIC QLA2XXX FC-SCSI DRIVER
+ P: Andrew Vasquez
+ M: linux-driver@qlogic.com
+@@ -3881,15 +3864,6 @@
+ T: git kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git
+ S: Supported
+
+-SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER
+-P: Sathya Perla
+-M: sathyap@serverengines.com
+-P: Subbu Seetharaman
+-M: subbus@serverengines.com
+-L: netdev@vger.kernel.org
+-W: http://www.serverengines.com
+-S: Supported
+-
+ SFC NETWORK DRIVER
+ P: Steve Hodgson
+ P: Ben Hutchings
+@@ -4189,7 +4163,7 @@
+ P: Len Brown
+ M: len.brown@intel.com
+ P: Pavel Machek
+-M: pavel@ucw.cz
++M: pavel@suse.cz
+ P: Rafael J. Wysocki
+ M: rjw@sisk.pl
+ L: linux-pm@lists.linux-foundation.org
+@@ -4310,8 +4284,8 @@
+ M: srajiv@linux.vnet.ibm.com
+ W: http://tpmdd.sourceforge.net
+ P: Marcel Selhorst
+-M: m.selhorst@sirrix.com
+-W: http://www.sirrix.com
++M: tpm@selhorst.net
++W: http://www.prosec.rub.de/tpm/
+ L: tpmdd-devel@lists.sourceforge.net (moderated for non-subscribers)
+ S: Maintained
+
+@@ -4874,7 +4848,6 @@
+ M: mingo@redhat.com
+ P: H. Peter Anvin
+ M: hpa@zytor.com
+-M: x86@kernel.org
+ L: linux-kernel@vger.kernel.org
+ T: git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git
+ S: Maintained
+@@ -4941,11 +4914,11 @@
+ S: Maintained
+
+ ZR36067 VIDEO FOR LINUX DRIVER
++P: Ronald Bultje
++M: rbultje@ronald.bitfreak.net
+ L: mjpeg-users@lists.sourceforge.net
+-L: linux-media@vger.kernel.org
+ W: http://mjpeg.sourceforge.net/driver-zoran/
+-T: Mercurial http://linuxtv.org/hg/v4l-dvb
+-S: Odd Fixes
++S: Maintained
+
+ ZS DECSTATION Z85C30 SERIAL DRIVER
+ P: Maciej W. Rozycki
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/Makefile linux-2.6.29-rc3.owrt/Makefile
+--- linux-2.6.29.owrt/Makefile 2009-05-10 22:04:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt/Makefile 2009-05-10 23:48:33.000000000 +0200
+@@ -2,7 +2,7 @@
+ PATCHLEVEL = 6
+ SUBLEVEL = 29
+ EXTRAVERSION =
+-NAME = Temporary Tasmanian Devil
++NAME = Erotic Pickled Herring
+
+ # *DOCUMENTATION*
+ # To see a list of typical targets execute "make help"
+@@ -389,7 +389,6 @@
+ # output directory.
+ outputmakefile:
+ ifneq ($(KBUILD_SRC),)
+- $(Q)ln -fsn $(srctree) source
+ $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
+ $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
+ endif
+@@ -569,12 +568,6 @@
+ # disable pointer signed / unsigned warnings in gcc 4.0
+ KBUILD_CFLAGS += $(call cc-option,-Wno-pointer-sign,)
+
+-# disable invalid "can't wrap" optimzations for signed / pointers
+-KBUILD_CFLAGS += $(call cc-option,-fwrapv)
+-
+-# revert to pre-gcc-4.4 behaviour of .eh_frame
+-KBUILD_CFLAGS += $(call cc-option,-fno-dwarf2-cfi-asm)
+-
+ # Add user supplied CPPFLAGS, AFLAGS and CFLAGS as the last assignments
+ # But warn user when we do so
+ warn-assign = \
+@@ -913,18 +906,12 @@
+ # and if the SCM is know a tag from the SCM is appended.
+ # The appended tag is determined by the SCM used.
+ #
+-# .scmversion is used when generating rpm packages so we do not loose
+-# the version information from the SCM when we do the build of the kernel
+-# from the copied source
++# Currently, only git is supported.
++# Other SCMs can edit scripts/setlocalversion and add the appropriate
++# checks as needed.
+ ifdef CONFIG_LOCALVERSION_AUTO
+-
+-ifeq ($(wildcard .scmversion),)
+- _localver-auto = $(shell $(CONFIG_SHELL) \
+- $(srctree)/scripts/setlocalversion $(srctree))
+-else
+- _localver-auto = $(shell cat .scmversion 2> /dev/null)
+-endif
+-
++ _localver-auto = $(shell $(CONFIG_SHELL) \
++ $(srctree)/scripts/setlocalversion $(srctree))
+ localver-auto = $(LOCALVERSION)$(_localver-auto)
+ endif
+
+@@ -962,6 +949,7 @@
+ mkdir -p include2; \
+ ln -fsn $(srctree)/include/asm-$(SRCARCH) include2/asm; \
+ fi
++ ln -fsn $(srctree) source
+ endif
+
+ # prepare2 creates a makefile if using a separate output directory
+@@ -1552,7 +1540,7 @@
+ cmd_depmod = \
+ if [ -r System.map -a -x $(DEPMOD) ]; then \
+ $(DEPMOD) -ae -F System.map \
+- $(if $(strip $(INSTALL_MOD_PATH)), -b $(INSTALL_MOD_PATH) ) \
++ $(if $(strip $(INSTALL_MOD_PATH)), -b $(INSTALL_MOD_PATH) -r) \
+ $(KERNELRELEASE); \
+ fi
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/mm/fremap.c linux-2.6.29-rc3.owrt/mm/fremap.c
+--- linux-2.6.29.owrt/mm/fremap.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/mm/fremap.c 2009-05-10 23:48:33.000000000 +0200
+@@ -198,7 +198,7 @@
+ flags &= MAP_NONBLOCK;
+ get_file(file);
+ addr = mmap_region(file, start, size,
+- flags, vma->vm_flags, pgoff);
++ flags, vma->vm_flags, pgoff, 1);
+ fput(file);
+ if (IS_ERR_VALUE(addr)) {
+ err = addr;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/mm/hugetlb.c linux-2.6.29-rc3.owrt/mm/hugetlb.c
+--- linux-2.6.29.owrt/mm/hugetlb.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/mm/hugetlb.c 2009-05-10 23:48:33.000000000 +0200
+@@ -2269,18 +2269,12 @@
+
+ int hugetlb_reserve_pages(struct inode *inode,
+ long from, long to,
+- struct vm_area_struct *vma,
+- int acctflag)
++ struct vm_area_struct *vma)
+ {
+ long ret, chg;
+ struct hstate *h = hstate_inode(inode);
+
+- /*
+- * Only apply hugepage reservation if asked. At fault time, an
+- * attempt will be made for VM_NORESERVE to allocate a page
+- * and filesystem quota without using reserves
+- */
+- if (acctflag & VM_NORESERVE)
++ if (vma && vma->vm_flags & VM_NORESERVE)
+ return 0;
+
+ /*
+@@ -2305,31 +2299,13 @@
+ if (chg < 0)
+ return chg;
+
+- /* There must be enough filesystem quota for the mapping */
+ if (hugetlb_get_quota(inode->i_mapping, chg))
+ return -ENOSPC;
+-
+- /*
+- * Check enough hugepages are available for the reservation.
+- * Hand back the quota if there are not
+- */
+ ret = hugetlb_acct_memory(h, chg);
+ if (ret < 0) {
+ hugetlb_put_quota(inode->i_mapping, chg);
+ return ret;
+ }
+-
+- /*
+- * Account for the reservations made. Shared mappings record regions
+- * that have reservations as they are shared by multiple VMAs.
+- * When the last VMA disappears, the region map says how much
+- * the reservation was and the page cache tells how much of
+- * the reservation was consumed. Private mappings are per-VMA and
+- * only the consumed reservations are tracked. When the VMA
+- * disappears, the original reservation is the VMA size and the
+- * consumed reservations are stored in the map. Hence, nothing
+- * else has to be done for private mappings here
+- */
+ if (!vma || vma->vm_flags & VM_SHARED)
+ region_add(&inode->i_mapping->private_list, from, to);
+ return 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/mm/memcontrol.c linux-2.6.29-rc3.owrt/mm/memcontrol.c
+--- linux-2.6.29.owrt/mm/memcontrol.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/mm/memcontrol.c 2009-05-10 23:48:33.000000000 +0200
+@@ -202,7 +202,6 @@
+
+ static void mem_cgroup_get(struct mem_cgroup *mem);
+ static void mem_cgroup_put(struct mem_cgroup *mem);
+-static struct mem_cgroup *parent_mem_cgroup(struct mem_cgroup *mem);
+
+ static void mem_cgroup_charge_statistics(struct mem_cgroup *mem,
+ struct page_cgroup *pc,
+@@ -1685,7 +1684,7 @@
+ /* This is for making all *used* pages to be on LRU. */
+ lru_add_drain_all();
+ ret = 0;
+- for_each_node_state(node, N_HIGH_MEMORY) {
++ for_each_node_state(node, N_POSSIBLE) {
+ for (zid = 0; !ret && zid < MAX_NR_ZONES; zid++) {
+ enum lru_list l;
+ for_each_lru(l) {
+@@ -2194,23 +2193,10 @@
+
+ static void mem_cgroup_put(struct mem_cgroup *mem)
+ {
+- if (atomic_dec_and_test(&mem->refcnt)) {
+- struct mem_cgroup *parent = parent_mem_cgroup(mem);
++ if (atomic_dec_and_test(&mem->refcnt))
+ __mem_cgroup_free(mem);
+- if (parent)
+- mem_cgroup_put(parent);
+- }
+ }
+
+-/*
+- * Returns the parent mem_cgroup in memcgroup hierarchy with hierarchy enabled.
+- */
+-static struct mem_cgroup *parent_mem_cgroup(struct mem_cgroup *mem)
+-{
+- if (!mem->res.parent)
+- return NULL;
+- return mem_cgroup_from_res_counter(mem->res.parent, res);
+-}
+
+ #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP
+ static void __init enable_swap_cgroup(void)
+@@ -2249,13 +2235,6 @@
+ if (parent && parent->use_hierarchy) {
+ res_counter_init(&mem->res, &parent->res);
+ res_counter_init(&mem->memsw, &parent->memsw);
+- /*
+- * We increment refcnt of the parent to ensure that we can
+- * safely access it on res_counter_charge/uncharge.
+- * This refcnt will be decremented when freeing this
+- * mem_cgroup(see mem_cgroup_put).
+- */
+- mem_cgroup_get(parent);
+ } else {
+ res_counter_init(&mem->res, NULL);
+ res_counter_init(&mem->memsw, NULL);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/mm/memory.c linux-2.6.29-rc3.owrt/mm/memory.c
+--- linux-2.6.29.owrt/mm/memory.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/mm/memory.c 2009-05-10 23:48:33.000000000 +0200
+@@ -2000,7 +2000,7 @@
+ * Don't let another task, with possibly unlocked vma,
+ * keep the mlocked page.
+ */
+- if ((vma->vm_flags & VM_LOCKED) && old_page) {
++ if (vma->vm_flags & VM_LOCKED) {
+ lock_page(old_page); /* for LRU manipulation */
+ clear_page_mlock(old_page);
+ unlock_page(old_page);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/mm/migrate.c linux-2.6.29-rc3.owrt/mm/migrate.c
+--- linux-2.6.29.owrt/mm/migrate.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/mm/migrate.c 2009-05-10 23:48:33.000000000 +0200
+@@ -1129,7 +1129,7 @@
+ struct vm_area_struct *vma;
+ int err = 0;
+
+- for (vma = mm->mmap; vma && !err; vma = vma->vm_next) {
++ for(vma = mm->mmap; vma->vm_next && !err; vma = vma->vm_next) {
+ if (vma->vm_ops && vma->vm_ops->migrate) {
+ err = vma->vm_ops->migrate(vma, to, from, flags);
+ if (err)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/mm/mlock.c linux-2.6.29-rc3.owrt/mm/mlock.c
+--- linux-2.6.29.owrt/mm/mlock.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/mm/mlock.c 2009-05-10 23:48:33.000000000 +0200
+@@ -294,10 +294,14 @@
+ *
+ * return number of pages [> 0] to be removed from locked_vm on success
+ * of "special" vmas.
++ *
++ * return negative error if vma spanning @start-@range disappears while
++ * mmap semaphore is dropped. Unlikely?
+ */
+ long mlock_vma_pages_range(struct vm_area_struct *vma,
+ unsigned long start, unsigned long end)
+ {
++ struct mm_struct *mm = vma->vm_mm;
+ int nr_pages = (end - start) / PAGE_SIZE;
+ BUG_ON(!(vma->vm_flags & VM_LOCKED));
+
+@@ -310,11 +314,20 @@
+ if (!((vma->vm_flags & (VM_DONTEXPAND | VM_RESERVED)) ||
+ is_vm_hugetlb_page(vma) ||
+ vma == get_gate_vma(current))) {
++ long error;
++ downgrade_write(&mm->mmap_sem);
+
+- __mlock_vma_pages_range(vma, start, end, 1);
++ error = __mlock_vma_pages_range(vma, start, end, 1);
+
+- /* Hide errors from mmap() and other callers */
+- return 0;
++ up_read(&mm->mmap_sem);
++ /* vma can change or disappear */
++ down_write(&mm->mmap_sem);
++ vma = find_vma(mm, start);
++ /* non-NULL vma must contain @start, but need to check @end */
++ if (!vma || end > vma->vm_end)
++ return -ENOMEM;
++
++ return 0; /* hide other errors from mmap(), et al */
+ }
+
+ /*
+@@ -425,14 +438,41 @@
+ vma->vm_flags = newflags;
+
+ if (lock) {
++ /*
++ * mmap_sem is currently held for write. Downgrade the write
++ * lock to a read lock so that other faults, mmap scans, ...
++ * while we fault in all pages.
++ */
++ downgrade_write(&mm->mmap_sem);
++
+ ret = __mlock_vma_pages_range(vma, start, end, 1);
+
+- if (ret > 0) {
++ /*
++ * Need to reacquire mmap sem in write mode, as our callers
++ * expect this. We have no support for atomically upgrading
++ * a sem to write, so we need to check for ranges while sem
++ * is unlocked.
++ */
++ up_read(&mm->mmap_sem);
++ /* vma can change or disappear */
++ down_write(&mm->mmap_sem);
++ *prev = find_vma(mm, start);
++ /* non-NULL *prev must contain @start, but need to check @end */
++ if (!(*prev) || end > (*prev)->vm_end)
++ ret = -ENOMEM;
++ else if (ret > 0) {
+ mm->locked_vm -= ret;
+ ret = 0;
+ } else
+ ret = __mlock_posix_error_return(ret); /* translate if needed */
+ } else {
++ /*
++ * TODO: for unlocking, pages will already be resident, so
++ * we don't need to wait for allocations/reclaim/pagein, ...
++ * However, unlocking a very large region can still take a
++ * while. Should we downgrade the semaphore for both lock
++ * AND unlock ?
++ */
+ __mlock_vma_pages_range(vma, start, end, 0);
+ }
+
+@@ -660,7 +700,7 @@
+ return buffer;
+ }
+
+-void release_locked_buffer(void *buffer, size_t size)
++void free_locked_buffer(void *buffer, size_t size)
+ {
+ unsigned long pgsz = PAGE_ALIGN(size) >> PAGE_SHIFT;
+
+@@ -670,11 +710,6 @@
+ current->mm->locked_vm -= pgsz;
+
+ up_write(&current->mm->mmap_sem);
+-}
+-
+-void free_locked_buffer(void *buffer, size_t size)
+-{
+- release_locked_buffer(buffer, size);
+
+ kfree(buffer);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/mm/mmap.c linux-2.6.29-rc3.owrt/mm/mmap.c
+--- linux-2.6.29.owrt/mm/mmap.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/mm/mmap.c 2009-05-10 23:48:33.000000000 +0200
+@@ -658,9 +658,6 @@
+ validate_mm(mm);
+ }
+
+-/* Flags that can be inherited from an existing mapping when merging */
+-#define VM_MERGEABLE_FLAGS (VM_CAN_NONLINEAR)
+-
+ /*
+ * If the vma has a ->close operation then the driver probably needs to release
+ * per-vma resources, so we don't attempt to merge those.
+@@ -668,7 +665,7 @@
+ static inline int is_mergeable_vma(struct vm_area_struct *vma,
+ struct file *file, unsigned long vm_flags)
+ {
+- if ((vma->vm_flags ^ vm_flags) & ~VM_MERGEABLE_FLAGS)
++ if (vma->vm_flags != vm_flags)
+ return 0;
+ if (vma->vm_file != file)
+ return 0;
+@@ -918,6 +915,7 @@
+ struct inode *inode;
+ unsigned int vm_flags;
+ int error;
++ int accountable = 1;
+ unsigned long reqprot = prot;
+
+ /*
+@@ -1018,6 +1016,8 @@
+ return -EPERM;
+ vm_flags &= ~VM_MAYEXEC;
+ }
++ if (is_file_hugepages(file))
++ accountable = 0;
+
+ if (!file->f_op || !file->f_op->mmap)
+ return -ENODEV;
+@@ -1050,7 +1050,8 @@
+ if (error)
+ return error;
+
+- return mmap_region(file, addr, len, flags, vm_flags, pgoff);
++ return mmap_region(file, addr, len, flags, vm_flags, pgoff,
++ accountable);
+ }
+ EXPORT_SYMBOL(do_mmap_pgoff);
+
+@@ -1086,25 +1087,10 @@
+ mapping_cap_account_dirty(vma->vm_file->f_mapping);
+ }
+
+-/*
+- * We account for memory if it's a private writeable mapping,
+- * not hugepages and VM_NORESERVE wasn't set.
+- */
+-static inline int accountable_mapping(struct file *file, unsigned int vm_flags)
+-{
+- /*
+- * hugetlb has its own accounting separate from the core VM
+- * VM_HUGETLB may not be set yet so we cannot check for that flag.
+- */
+- if (file && is_file_hugepages(file))
+- return 0;
+-
+- return (vm_flags & (VM_NORESERVE | VM_SHARED | VM_WRITE)) == VM_WRITE;
+-}
+-
+ unsigned long mmap_region(struct file *file, unsigned long addr,
+ unsigned long len, unsigned long flags,
+- unsigned int vm_flags, unsigned long pgoff)
++ unsigned int vm_flags, unsigned long pgoff,
++ int accountable)
+ {
+ struct mm_struct *mm = current->mm;
+ struct vm_area_struct *vma, *prev;
+@@ -1128,38 +1114,38 @@
+ if (!may_expand_vm(mm, len >> PAGE_SHIFT))
+ return -ENOMEM;
+
+- /*
+- * Set 'VM_NORESERVE' if we should not account for the
+- * memory use of this mapping.
+- */
+- if ((flags & MAP_NORESERVE)) {
+- /* We honor MAP_NORESERVE if allowed to overcommit */
+- if (sysctl_overcommit_memory != OVERCOMMIT_NEVER)
+- vm_flags |= VM_NORESERVE;
++ if (flags & MAP_NORESERVE)
++ vm_flags |= VM_NORESERVE;
+
+- /* hugetlb applies strict overcommit unless MAP_NORESERVE */
+- if (file && is_file_hugepages(file))
+- vm_flags |= VM_NORESERVE;
++ if (accountable && (!(flags & MAP_NORESERVE) ||
++ sysctl_overcommit_memory == OVERCOMMIT_NEVER)) {
++ if (vm_flags & VM_SHARED) {
++ /* Check memory availability in shmem_file_setup? */
++ vm_flags |= VM_ACCOUNT;
++ } else if (vm_flags & VM_WRITE) {
++ /*
++ * Private writable mapping: check memory availability
++ */
++ charged = len >> PAGE_SHIFT;
++ if (security_vm_enough_memory(charged))
++ return -ENOMEM;
++ vm_flags |= VM_ACCOUNT;
++ }
+ }
+
+ /*
+- * Private writable mapping: check memory availability
++ * Can we just expand an old private anonymous mapping?
++ * The VM_SHARED test is necessary because shmem_zero_setup
++ * will create the file object for a shared anonymous map below.
+ */
+- if (accountable_mapping(file, vm_flags)) {
+- charged = len >> PAGE_SHIFT;
+- if (security_vm_enough_memory(charged))
+- return -ENOMEM;
+- vm_flags |= VM_ACCOUNT;
++ if (!file && !(vm_flags & VM_SHARED)) {
++ vma = vma_merge(mm, prev, addr, addr + len, vm_flags,
++ NULL, NULL, pgoff, NULL);
++ if (vma)
++ goto out;
+ }
+
+ /*
+- * Can we just expand an old mapping?
+- */
+- vma = vma_merge(mm, prev, addr, addr + len, vm_flags, NULL, file, pgoff, NULL);
+- if (vma)
+- goto out;
+-
+- /*
+ * Determine the object being mapped and call the appropriate
+ * specific mapper. the address has already been validated, but
+ * not unmapped, but the maps are removed from the list.
+@@ -1200,6 +1186,14 @@
+ goto free_vma;
+ }
+
++ /* We set VM_ACCOUNT in a shared mapping's vm_flags, to inform
++ * shmem_zero_setup (perhaps called through /dev/zero's ->mmap)
++ * that memory reservation must be checked; but that reservation
++ * belongs to shared memory object, not to vma: so now clear it.
++ */
++ if ((vm_flags & (VM_SHARED|VM_ACCOUNT)) == (VM_SHARED|VM_ACCOUNT))
++ vma->vm_flags &= ~VM_ACCOUNT;
++
+ /* Can addr have changed??
+ *
+ * Answer: Yes, several device drivers can do it in their
+@@ -1212,8 +1206,17 @@
+ if (vma_wants_writenotify(vma))
+ vma->vm_page_prot = vm_get_page_prot(vm_flags & ~VM_SHARED);
+
+- vma_link(mm, vma, prev, rb_link, rb_parent);
+- file = vma->vm_file;
++ if (file && vma_merge(mm, prev, addr, vma->vm_end,
++ vma->vm_flags, NULL, file, pgoff, vma_policy(vma))) {
++ mpol_put(vma_policy(vma));
++ kmem_cache_free(vm_area_cachep, vma);
++ fput(file);
++ if (vm_flags & VM_EXECUTABLE)
++ removed_exe_file_vma(mm);
++ } else {
++ vma_link(mm, vma, prev, rb_link, rb_parent);
++ file = vma->vm_file;
++ }
+
+ /* Once vma denies write, undo our temporary denial count */
+ if (correct_wcount)
+@@ -2084,8 +2087,12 @@
+ unsigned long end;
+
+ /* mm's last user has gone, and its about to be pulled down */
++ arch_exit_mmap(mm);
+ mmu_notifier_release(mm);
+
++ if (!mm->mmap) /* Can happen if dup_mmap() received an OOM */
++ return;
++
+ if (mm->locked_vm) {
+ vma = mm->mmap;
+ while (vma) {
+@@ -2094,13 +2101,7 @@
+ vma = vma->vm_next;
+ }
+ }
+-
+- arch_exit_mmap(mm);
+-
+ vma = mm->mmap;
+- if (!vma) /* Can happen if dup_mmap() received an OOM */
+- return;
+-
+ lru_add_drain();
+ flush_cache_mm(mm);
+ tlb = tlb_gather_mmu(mm, 1);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/mm/mprotect.c linux-2.6.29-rc3.owrt/mm/mprotect.c
+--- linux-2.6.29.owrt/mm/mprotect.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/mm/mprotect.c 2009-05-10 23:48:33.000000000 +0200
+@@ -151,11 +151,10 @@
+ /*
+ * If we make a private mapping writable we increase our commit;
+ * but (without finer accounting) cannot reduce our commit if we
+- * make it unwritable again. hugetlb mapping were accounted for
+- * even if read-only so there is no need to account for them here
++ * make it unwritable again.
+ */
+ if (newflags & VM_WRITE) {
+- if (!(oldflags & (VM_ACCOUNT|VM_WRITE|VM_HUGETLB|
++ if (!(oldflags & (VM_ACCOUNT|VM_WRITE|
+ VM_SHARED|VM_NORESERVE))) {
+ charged = nrpages;
+ if (security_vm_enough_memory(charged))
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/mm/page_alloc.c linux-2.6.29-rc3.owrt/mm/page_alloc.c
+--- linux-2.6.29.owrt/mm/page_alloc.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/mm/page_alloc.c 2009-05-10 23:48:33.000000000 +0200
+@@ -2989,7 +2989,7 @@
+ * was used and there are no special requirements, this is a convenient
+ * alternative
+ */
+-int __meminit __early_pfn_to_nid(unsigned long pfn)
++int __meminit early_pfn_to_nid(unsigned long pfn)
+ {
+ int i;
+
+@@ -3000,33 +3000,10 @@
+ if (start_pfn <= pfn && pfn < end_pfn)
+ return early_node_map[i].nid;
+ }
+- /* This is a memory hole */
+- return -1;
+-}
+-#endif /* CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID */
+-
+-int __meminit early_pfn_to_nid(unsigned long pfn)
+-{
+- int nid;
+
+- nid = __early_pfn_to_nid(pfn);
+- if (nid >= 0)
+- return nid;
+- /* just returns 0 */
+ return 0;
+ }
+-
+-#ifdef CONFIG_NODES_SPAN_OTHER_NODES
+-bool __meminit early_pfn_in_nid(unsigned long pfn, int node)
+-{
+- int nid;
+-
+- nid = __early_pfn_to_nid(pfn);
+- if (nid >= 0 && nid != node)
+- return false;
+- return true;
+-}
+-#endif
++#endif /* CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID */
+
+ /* Basic iterator support to walk early_node_map[] */
+ #define for_each_active_range_index_in_nid(i, nid) \
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/mm/page_cgroup.c linux-2.6.29-rc3.owrt/mm/page_cgroup.c
+--- linux-2.6.29.owrt/mm/page_cgroup.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/mm/page_cgroup.c 2009-05-10 23:48:33.000000000 +0200
+@@ -114,8 +114,7 @@
+ nid = page_to_nid(pfn_to_page(pfn));
+ table_size = sizeof(struct page_cgroup) * PAGES_PER_SECTION;
+ if (slab_is_available()) {
+- base = kmalloc_node(table_size,
+- GFP_KERNEL | __GFP_NOWARN, nid);
++ base = kmalloc_node(table_size, GFP_KERNEL, nid);
+ if (!base)
+ base = vmalloc_node(table_size, nid);
+ } else {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/mm/page_io.c linux-2.6.29-rc3.owrt/mm/page_io.c
+--- linux-2.6.29.owrt/mm/page_io.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/mm/page_io.c 2009-05-10 23:48:33.000000000 +0200
+@@ -111,7 +111,7 @@
+ goto out;
+ }
+ if (wbc->sync_mode == WB_SYNC_ALL)
+- rw |= (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG);
++ rw |= (1 << BIO_RW_SYNC);
+ count_vm_event(PSWPOUT);
+ set_page_writeback(page);
+ unlock_page(page);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/mm/page-writeback.c linux-2.6.29-rc3.owrt/mm/page-writeback.c
+--- linux-2.6.29.owrt/mm/page-writeback.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/mm/page-writeback.c 2009-05-10 23:48:33.000000000 +0200
+@@ -209,7 +209,7 @@
+ struct file *filp, void __user *buffer, size_t *lenp,
+ loff_t *ppos)
+ {
+- unsigned long old_bytes = vm_dirty_bytes;
++ int old_bytes = vm_dirty_bytes;
+ int ret;
+
+ ret = proc_doulongvec_minmax(table, write, filp, buffer, lenp, ppos);
+@@ -240,7 +240,7 @@
+ }
+ EXPORT_SYMBOL_GPL(bdi_writeout_inc);
+
+-void task_dirty_inc(struct task_struct *tsk)
++static inline void task_dirty_inc(struct task_struct *tsk)
+ {
+ prop_inc_single(&vm_dirties, &tsk->dirties);
+ }
+@@ -1051,25 +1051,13 @@
+ }
+ }
+
+- if (nr_to_write > 0) {
+- nr_to_write--;
+- if (nr_to_write == 0 &&
+- wbc->sync_mode == WB_SYNC_NONE) {
+- /*
+- * We stop writing back only if we are
+- * not doing integrity sync. In case of
+- * integrity sync we have to keep going
+- * because someone may be concurrently
+- * dirtying pages, and we might have
+- * synced a lot of newly appeared dirty
+- * pages, but have not synced all of the
+- * old dirty pages.
+- */
++ if (wbc->sync_mode == WB_SYNC_NONE) {
++ wbc->nr_to_write--;
++ if (wbc->nr_to_write <= 0) {
+ done = 1;
+ break;
+ }
+ }
+-
+ if (wbc->nonblocking && bdi_write_congested(bdi)) {
+ wbc->encountered_congestion = 1;
+ done = 1;
+@@ -1079,7 +1067,7 @@
+ pagevec_release(&pvec);
+ cond_resched();
+ }
+- if (!cycled && !done) {
++ if (!cycled) {
+ /*
+ * range_cyclic:
+ * We hit the last page and there is more work to be done: wrap
+@@ -1230,7 +1218,6 @@
+ __inc_zone_page_state(page, NR_FILE_DIRTY);
+ __inc_bdi_stat(mapping->backing_dev_info,
+ BDI_RECLAIMABLE);
+- task_dirty_inc(current);
+ task_io_account_write(PAGE_CACHE_SIZE);
+ }
+ radix_tree_tag_set(&mapping->page_tree,
+@@ -1263,7 +1250,7 @@
+ * If the mapping doesn't provide a set_page_dirty a_op, then
+ * just fall through and assume that it wants buffer_heads.
+ */
+-int set_page_dirty(struct page *page)
++static int __set_page_dirty(struct page *page)
+ {
+ struct address_space *mapping = page_mapping(page);
+
+@@ -1281,6 +1268,14 @@
+ }
+ return 0;
+ }
++
++int set_page_dirty(struct page *page)
++{
++ int ret = __set_page_dirty(page);
++ if (ret)
++ task_dirty_inc(current);
++ return ret;
++}
+ EXPORT_SYMBOL(set_page_dirty);
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/mm/rmap.c linux-2.6.29-rc3.owrt/mm/rmap.c
+--- linux-2.6.29.owrt/mm/rmap.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/mm/rmap.c 2009-05-10 23:48:33.000000000 +0200
+@@ -1072,8 +1072,7 @@
+ spin_lock(&mapping->i_mmap_lock);
+ vma_prio_tree_foreach(vma, &iter, &mapping->i_mmap, pgoff, pgoff) {
+ if (MLOCK_PAGES && unlikely(unlock)) {
+- if (!((vma->vm_flags & VM_LOCKED) &&
+- page_mapped_in_vma(page, vma)))
++ if (!(vma->vm_flags & VM_LOCKED))
+ continue; /* must visit all vmas */
+ ret = SWAP_MLOCK;
+ } else {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/mm/shmem.c linux-2.6.29-rc3.owrt/mm/shmem.c
+--- linux-2.6.29.owrt/mm/shmem.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/mm/shmem.c 2009-05-10 23:48:33.000000000 +0200
+@@ -169,13 +169,13 @@
+ */
+ static inline int shmem_acct_size(unsigned long flags, loff_t size)
+ {
+- return (flags & VM_NORESERVE) ?
+- 0 : security_vm_enough_memory_kern(VM_ACCT(size));
++ return (flags & VM_ACCOUNT) ?
++ security_vm_enough_memory_kern(VM_ACCT(size)) : 0;
+ }
+
+ static inline void shmem_unacct_size(unsigned long flags, loff_t size)
+ {
+- if (!(flags & VM_NORESERVE))
++ if (flags & VM_ACCOUNT)
+ vm_unacct_memory(VM_ACCT(size));
+ }
+
+@@ -187,13 +187,13 @@
+ */
+ static inline int shmem_acct_block(unsigned long flags)
+ {
+- return (flags & VM_NORESERVE) ?
+- security_vm_enough_memory_kern(VM_ACCT(PAGE_CACHE_SIZE)) : 0;
++ return (flags & VM_ACCOUNT) ?
++ 0 : security_vm_enough_memory_kern(VM_ACCT(PAGE_CACHE_SIZE));
+ }
+
+ static inline void shmem_unacct_blocks(unsigned long flags, long pages)
+ {
+- if (flags & VM_NORESERVE)
++ if (!(flags & VM_ACCOUNT))
+ vm_unacct_memory(pages * VM_ACCT(PAGE_CACHE_SIZE));
+ }
+
+@@ -1515,8 +1515,8 @@
+ return 0;
+ }
+
+-static struct inode *shmem_get_inode(struct super_block *sb, int mode,
+- dev_t dev, unsigned long flags)
++static struct inode *
++shmem_get_inode(struct super_block *sb, int mode, dev_t dev)
+ {
+ struct inode *inode;
+ struct shmem_inode_info *info;
+@@ -1537,7 +1537,6 @@
+ info = SHMEM_I(inode);
+ memset(info, 0, (char *)inode - (char *)info);
+ spin_lock_init(&info->lock);
+- info->flags = flags & VM_NORESERVE;
+ INIT_LIST_HEAD(&info->swaplist);
+
+ switch (mode & S_IFMT) {
+@@ -1780,10 +1779,9 @@
+ static int
+ shmem_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
+ {
+- struct inode *inode;
++ struct inode *inode = shmem_get_inode(dir->i_sb, mode, dev);
+ int error = -ENOSPC;
+
+- inode = shmem_get_inode(dir->i_sb, mode, dev, VM_NORESERVE);
+ if (inode) {
+ error = security_inode_init_security(inode, dir, NULL, NULL,
+ NULL);
+@@ -1922,7 +1920,7 @@
+ if (len > PAGE_CACHE_SIZE)
+ return -ENAMETOOLONG;
+
+- inode = shmem_get_inode(dir->i_sb, S_IFLNK|S_IRWXUGO, 0, VM_NORESERVE);
++ inode = shmem_get_inode(dir->i_sb, S_IFLNK|S_IRWXUGO, 0);
+ if (!inode)
+ return -ENOSPC;
+
+@@ -2334,7 +2332,7 @@
+ sb->s_flags |= MS_POSIXACL;
+ #endif
+
+- inode = shmem_get_inode(sb, S_IFDIR | sbinfo->mode, 0, VM_NORESERVE);
++ inode = shmem_get_inode(sb, S_IFDIR | sbinfo->mode, 0);
+ if (!inode)
+ goto failed;
+ inode->i_uid = sbinfo->uid;
+@@ -2576,12 +2574,12 @@
+ return 0;
+ }
+
+-#define shmem_vm_ops generic_file_vm_ops
+-#define shmem_file_operations ramfs_file_operations
+-#define shmem_get_inode(sb, mode, dev, flags) ramfs_get_inode(sb, mode, dev)
+-#define shmem_acct_size(flags, size) 0
+-#define shmem_unacct_size(flags, size) do {} while (0)
+-#define SHMEM_MAX_BYTES LLONG_MAX
++#define shmem_file_operations ramfs_file_operations
++#define shmem_vm_ops generic_file_vm_ops
++#define shmem_get_inode ramfs_get_inode
++#define shmem_acct_size(a, b) 0
++#define shmem_unacct_size(a, b) do {} while (0)
++#define SHMEM_MAX_BYTES LLONG_MAX
+
+ #endif /* CONFIG_SHMEM */
+
+@@ -2600,7 +2598,7 @@
+ * shmem_file_setup - get an unlinked file living in tmpfs
+ * @name: name for dentry (to be seen in /proc/<pid>/maps
+ * @size: size to be set for the file
+- * @flags: VM_NORESERVE suppresses pre-accounting of the entire object size
++ * @flags: vm_flags
+ */
+ struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags)
+ {
+@@ -2634,10 +2632,13 @@
+ goto put_dentry;
+
+ error = -ENOSPC;
+- inode = shmem_get_inode(root->d_sb, S_IFREG | S_IRWXUGO, 0, flags);
++ inode = shmem_get_inode(root->d_sb, S_IFREG | S_IRWXUGO, 0);
+ if (!inode)
+ goto close_file;
+
++#ifdef CONFIG_SHMEM
++ SHMEM_I(inode)->flags = flags & VM_ACCOUNT;
++#endif
+ d_instantiate(dentry, inode);
+ inode->i_size = size;
+ inode->i_nlink = 0; /* It is unlinked */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/mm/slab.c linux-2.6.29-rc3.owrt/mm/slab.c
+--- linux-2.6.29.owrt/mm/slab.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/mm/slab.c 2009-05-10 23:48:33.000000000 +0200
+@@ -4457,4 +4457,3 @@
+
+ return obj_size(virt_to_cache(objp));
+ }
+-EXPORT_SYMBOL(ksize);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/mm/slob.c linux-2.6.29-rc3.owrt/mm/slob.c
+--- linux-2.6.29.owrt/mm/slob.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/mm/slob.c 2009-05-10 23:48:33.000000000 +0200
+@@ -521,7 +521,6 @@
+ } else
+ return sp->page.private;
+ }
+-EXPORT_SYMBOL(ksize);
+
+ struct kmem_cache {
+ unsigned int size, align;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/mm/slub.c linux-2.6.29-rc3.owrt/mm/slub.c
+--- linux-2.6.29.owrt/mm/slub.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/mm/slub.c 2009-05-10 23:48:33.000000000 +0200
+@@ -1996,7 +1996,7 @@
+ static void free_kmem_cache_cpu(struct kmem_cache_cpu *c, int cpu)
+ {
+ if (c < per_cpu(kmem_cache_cpu, cpu) ||
+- c >= per_cpu(kmem_cache_cpu, cpu) + NR_KMEM_CACHE_CPU) {
++ c > per_cpu(kmem_cache_cpu, cpu) + NR_KMEM_CACHE_CPU) {
+ kfree(c);
+ return;
+ }
+@@ -2736,7 +2736,6 @@
+ */
+ return s->size;
+ }
+-EXPORT_SYMBOL(ksize);
+
+ void kfree(const void *x)
+ {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/mm/swapfile.c linux-2.6.29-rc3.owrt/mm/swapfile.c
+--- linux-2.6.29.owrt/mm/swapfile.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/mm/swapfile.c 2009-05-10 23:48:33.000000000 +0200
+@@ -635,7 +635,7 @@
+
+ if (!bdev) {
+ if (bdev_p)
+- *bdev_p = bdget(sis->bdev->bd_dev);
++ *bdev_p = sis->bdev;
+
+ spin_unlock(&swap_lock);
+ return i;
+@@ -647,7 +647,7 @@
+ struct swap_extent, list);
+ if (se->start_block == offset) {
+ if (bdev_p)
+- *bdev_p = bdget(sis->bdev->bd_dev);
++ *bdev_p = sis->bdev;
+
+ spin_unlock(&swap_lock);
+ bdput(bdev);
+@@ -698,10 +698,8 @@
+ pte_t *pte;
+ int ret = 1;
+
+- if (mem_cgroup_try_charge_swapin(vma->vm_mm, page, GFP_KERNEL, &ptr)) {
++ if (mem_cgroup_try_charge_swapin(vma->vm_mm, page, GFP_KERNEL, &ptr))
+ ret = -ENOMEM;
+- goto out_nolock;
+- }
+
+ pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl);
+ if (unlikely(!pte_same(*pte, swp_entry_to_pte(entry)))) {
+@@ -725,7 +723,6 @@
+ activate_page(page);
+ out:
+ pte_unmap_unlock(pte, ptl);
+-out_nolock:
+ return ret;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/mm/util.c linux-2.6.29-rc3.owrt/mm/util.c
+--- linux-2.6.29.owrt/mm/util.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/mm/util.c 2009-05-10 23:48:33.000000000 +0200
+@@ -129,26 +129,6 @@
+ }
+ EXPORT_SYMBOL(krealloc);
+
+-/**
+- * kzfree - like kfree but zero memory
+- * @p: object to free memory of
+- *
+- * The memory of the object @p points to is zeroed before freed.
+- * If @p is %NULL, kzfree() does nothing.
+- */
+-void kzfree(const void *p)
+-{
+- size_t ks;
+- void *mem = (void *)p;
+-
+- if (unlikely(ZERO_OR_NULL_PTR(mem)))
+- return;
+- ks = ksize(mem);
+- memset(mem, 0, ks);
+- kfree(mem);
+-}
+-EXPORT_SYMBOL(kzfree);
+-
+ /*
+ * strndup_user - duplicate an existing string from user space
+ * @s: The string to duplicate
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/mm/vmalloc.c linux-2.6.29-rc3.owrt/mm/vmalloc.c
+--- linux-2.6.29.owrt/mm/vmalloc.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/mm/vmalloc.c 2009-05-10 23:48:33.000000000 +0200
+@@ -323,7 +323,6 @@
+ unsigned long addr;
+ int purged = 0;
+
+- BUG_ON(!size);
+ BUG_ON(size & ~PAGE_MASK);
+
+ va = kmalloc_node(sizeof(struct vmap_area),
+@@ -335,9 +334,6 @@
+ addr = ALIGN(vstart, align);
+
+ spin_lock(&vmap_area_lock);
+- if (addr + size - 1 < addr)
+- goto overflow;
+-
+ /* XXX: could have a last_hole cache */
+ n = vmap_area_root.rb_node;
+ if (n) {
+@@ -369,8 +365,6 @@
+
+ while (addr + size > first->va_start && addr + size <= vend) {
+ addr = ALIGN(first->va_end + PAGE_SIZE, align);
+- if (addr + size - 1 < addr)
+- goto overflow;
+
+ n = rb_next(&first->rb_node);
+ if (n)
+@@ -381,7 +375,6 @@
+ }
+ found:
+ if (addr + size > vend) {
+-overflow:
+ spin_unlock(&vmap_area_lock);
+ if (!purged) {
+ purge_vmap_area_lazy();
+@@ -505,7 +498,6 @@
+ static DEFINE_SPINLOCK(purge_lock);
+ LIST_HEAD(valist);
+ struct vmap_area *va;
+- struct vmap_area *n_va;
+ int nr = 0;
+
+ /*
+@@ -545,7 +537,7 @@
+
+ if (nr) {
+ spin_lock(&vmap_area_lock);
+- list_for_each_entry_safe(va, n_va, &valist, purge_list)
++ list_for_each_entry(va, &valist, purge_list)
+ __free_vmap_area(va);
+ spin_unlock(&vmap_area_lock);
+ }
+@@ -1020,8 +1012,6 @@
+ void unmap_kernel_range(unsigned long addr, unsigned long size)
+ {
+ unsigned long end = addr + size;
+-
+- flush_cache_vunmap(addr, end);
+ vunmap_page_range(addr, end);
+ flush_tlb_kernel_range(addr, end);
+ }
+@@ -1117,14 +1107,6 @@
+ }
+ EXPORT_SYMBOL_GPL(__get_vm_area);
+
+-struct vm_struct *__get_vm_area_caller(unsigned long size, unsigned long flags,
+- unsigned long start, unsigned long end,
+- void *caller)
+-{
+- return __get_vm_area_node(size, flags, start, end, -1, GFP_KERNEL,
+- caller);
+-}
+-
+ /**
+ * get_vm_area - reserve a contiguous kernel virtual area
+ * @size: size of the area
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/mm/vmscan.c linux-2.6.29-rc3.owrt/mm/vmscan.c
+--- linux-2.6.29.owrt/mm/vmscan.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/mm/vmscan.c 2009-05-10 23:48:33.000000000 +0200
+@@ -1262,6 +1262,7 @@
+ * Move the pages to the [file or anon] inactive list.
+ */
+ pagevec_init(&pvec, 1);
++ pgmoved = 0;
+ lru = LRU_BASE + file * LRU_FILE;
+
+ spin_lock_irq(&zone->lru_lock);
+@@ -1273,7 +1274,6 @@
+ */
+ reclaim_stat->recent_rotated[!!file] += pgmoved;
+
+- pgmoved = 0;
+ while (!list_empty(&l_inactive)) {
+ page = lru_to_page(&l_inactive);
+ prefetchw_prev_lru_page(page, &l_inactive, flags);
+@@ -1469,7 +1469,7 @@
+ int file = is_file_lru(l);
+ int scan;
+
+- scan = zone_nr_pages(zone, sc, l);
++ scan = zone_page_state(zone, NR_LRU_BASE + l);
+ if (priority) {
+ scan >>= priority;
+ scan = (scan * percent[file]) / 100;
+@@ -2057,31 +2057,31 @@
+ int pass, struct scan_control *sc)
+ {
+ struct zone *zone;
+- unsigned long ret = 0;
++ unsigned long nr_to_scan, ret = 0;
++ enum lru_list l;
+
+ for_each_zone(zone) {
+- enum lru_list l;
+
+ if (!populated_zone(zone))
+ continue;
++
+ if (zone_is_all_unreclaimable(zone) && prio != DEF_PRIORITY)
+ continue;
+
+ for_each_evictable_lru(l) {
+- enum zone_stat_item ls = NR_LRU_BASE + l;
+- unsigned long lru_pages = zone_page_state(zone, ls);
+-
+ /* For pass = 0, we don't shrink the active list */
+- if (pass == 0 && (l == LRU_ACTIVE_ANON ||
+- l == LRU_ACTIVE_FILE))
++ if (pass == 0 &&
++ (l == LRU_ACTIVE || l == LRU_ACTIVE_FILE))
+ continue;
+
+- zone->lru[l].nr_scan += (lru_pages >> prio) + 1;
++ zone->lru[l].nr_scan +=
++ (zone_page_state(zone, NR_LRU_BASE + l)
++ >> prio) + 1;
+ if (zone->lru[l].nr_scan >= nr_pages || pass > 3) {
+- unsigned long nr_to_scan;
+-
+ zone->lru[l].nr_scan = 0;
+- nr_to_scan = min(nr_pages, lru_pages);
++ nr_to_scan = min(nr_pages,
++ zone_page_state(zone,
++ NR_LRU_BASE + l));
+ ret += shrink_list(l, nr_to_scan, zone,
+ sc, prio);
+ if (ret >= nr_pages)
+@@ -2089,6 +2089,7 @@
+ }
+ }
+ }
++
+ return ret;
+ }
+
+@@ -2111,6 +2112,7 @@
+ .may_swap = 0,
+ .swap_cluster_max = nr_pages,
+ .may_writepage = 1,
++ .swappiness = vm_swappiness,
+ .isolate_pages = isolate_pages_global,
+ };
+
+@@ -2144,8 +2146,10 @@
+ int prio;
+
+ /* Force reclaiming mapped pages in the passes #3 and #4 */
+- if (pass > 2)
++ if (pass > 2) {
+ sc.may_swap = 1;
++ sc.swappiness = 100;
++ }
+
+ for (prio = DEF_PRIORITY; prio >= 0; prio--) {
+ unsigned long nr_to_scan = nr_pages - ret;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/802/tr.c linux-2.6.29-rc3.owrt/net/802/tr.c
+--- linux-2.6.29.owrt/net/802/tr.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/802/tr.c 2009-05-10 23:48:33.000000000 +0200
+@@ -668,5 +668,3 @@
+
+ EXPORT_SYMBOL(tr_type_trans);
+ EXPORT_SYMBOL(alloc_trdev);
+-
+-MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/8021q/vlan_core.c linux-2.6.29-rc3.owrt/net/8021q/vlan_core.c
+--- linux-2.6.29.owrt/net/8021q/vlan_core.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/8021q/vlan_core.c 2009-05-10 23:48:33.000000000 +0200
+@@ -1,16 +1,12 @@
+ #include <linux/skbuff.h>
+ #include <linux/netdevice.h>
+ #include <linux/if_vlan.h>
+-#include <linux/netpoll.h>
+ #include "vlan.h"
+
+ /* VLAN rx hw acceleration helper. This acts like netif_{rx,receive_skb}(). */
+ int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp,
+ u16 vlan_tci, int polling)
+ {
+- if (netpoll_rx(skb))
+- return NET_RX_DROP;
+-
+ if (skb_bond_should_drop(skb))
+ goto drop;
+
+@@ -104,9 +100,6 @@
+ {
+ int err = NET_RX_SUCCESS;
+
+- if (netpoll_receive_skb(skb))
+- return NET_RX_DROP;
+-
+ switch (vlan_gro_common(napi, grp, vlan_tci, skb)) {
+ case -1:
+ return netif_receive_skb(skb);
+@@ -133,9 +126,6 @@
+ if (!skb)
+ goto out;
+
+- if (netpoll_receive_skb(skb))
+- goto out;
+-
+ err = NET_RX_SUCCESS;
+
+ switch (vlan_gro_common(napi, grp, vlan_tci, skb)) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/8021q/vlan_dev.c linux-2.6.29-rc3.owrt/net/8021q/vlan_dev.c
+--- linux-2.6.29.owrt/net/8021q/vlan_dev.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/8021q/vlan_dev.c 2009-05-10 23:48:33.000000000 +0200
+@@ -553,7 +553,7 @@
+ int err = 0;
+
+ if (netif_device_present(real_dev) && ops->ndo_neigh_setup)
+- err = ops->ndo_neigh_setup(real_dev, pa);
++ err = ops->ndo_neigh_setup(dev, pa);
+
+ return err;
+ }
+@@ -639,7 +639,6 @@
+ dev->hard_header_len = real_dev->hard_header_len + VLAN_HLEN;
+ dev->netdev_ops = &vlan_netdev_ops;
+ }
+- netdev_resync_ops(dev);
+
+ if (is_vlan_dev(real_dev))
+ subclass = 1;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/9p/protocol.c linux-2.6.29-rc3.owrt/net/9p/protocol.c
+--- linux-2.6.29.owrt/net/9p/protocol.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/9p/protocol.c 2009-05-10 23:48:33.000000000 +0200
+@@ -29,7 +29,6 @@
+ #include <linux/errno.h>
+ #include <linux/uaccess.h>
+ #include <linux/sched.h>
+-#include <linux/types.h>
+ #include <net/9p/9p.h>
+ #include <net/9p/client.h>
+ #include "protocol.h"
+@@ -161,32 +160,29 @@
+ break;
+ case 'w':{
+ int16_t *val = va_arg(ap, int16_t *);
+- __le16 le_val;
+- if (pdu_read(pdu, &le_val, sizeof(le_val))) {
++ if (pdu_read(pdu, val, sizeof(*val))) {
+ errcode = -EFAULT;
+ break;
+ }
+- *val = le16_to_cpu(le_val);
++ *val = cpu_to_le16(*val);
+ }
+ break;
+ case 'd':{
+ int32_t *val = va_arg(ap, int32_t *);
+- __le32 le_val;
+- if (pdu_read(pdu, &le_val, sizeof(le_val))) {
++ if (pdu_read(pdu, val, sizeof(*val))) {
+ errcode = -EFAULT;
+ break;
+ }
+- *val = le32_to_cpu(le_val);
++ *val = cpu_to_le32(*val);
+ }
+ break;
+ case 'q':{
+ int64_t *val = va_arg(ap, int64_t *);
+- __le64 le_val;
+- if (pdu_read(pdu, &le_val, sizeof(le_val))) {
++ if (pdu_read(pdu, val, sizeof(*val))) {
+ errcode = -EFAULT;
+ break;
+ }
+- *val = le64_to_cpu(le_val);
++ *val = cpu_to_le64(*val);
+ }
+ break;
+ case 's':{
+@@ -366,19 +362,19 @@
+ }
+ break;
+ case 'w':{
+- __le16 val = cpu_to_le16(va_arg(ap, int));
++ int16_t val = va_arg(ap, int);
+ if (pdu_write(pdu, &val, sizeof(val)))
+ errcode = -EFAULT;
+ }
+ break;
+ case 'd':{
+- __le32 val = cpu_to_le32(va_arg(ap, int32_t));
++ int32_t val = va_arg(ap, int32_t);
+ if (pdu_write(pdu, &val, sizeof(val)))
+ errcode = -EFAULT;
+ }
+ break;
+ case 'q':{
+- __le64 val = cpu_to_le64(va_arg(ap, int64_t));
++ int64_t val = va_arg(ap, int64_t);
+ if (pdu_write(pdu, &val, sizeof(val)))
+ errcode = -EFAULT;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/bridge/br_forward.c linux-2.6.29-rc3.owrt/net/bridge/br_forward.c
+--- linux-2.6.29.owrt/net/bridge/br_forward.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/bridge/br_forward.c 2009-05-10 23:48:33.000000000 +0200
+@@ -67,11 +67,6 @@
+ {
+ struct net_device *indev;
+
+- if (skb_warn_if_lro(skb)) {
+- kfree_skb(skb);
+- return;
+- }
+-
+ indev = skb->dev;
+ skb->dev = to->dev;
+ skb_forward_csum(skb);
+@@ -94,7 +89,7 @@
+ /* called with rcu_read_lock */
+ void br_forward(const struct net_bridge_port *to, struct sk_buff *skb)
+ {
+- if (should_deliver(to, skb)) {
++ if (!skb_warn_if_lro(skb) && should_deliver(to, skb)) {
+ __br_forward(to, skb);
+ return;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/core/dev.c linux-2.6.29-rc3.owrt/net/core/dev.c
+--- linux-2.6.29.owrt/net/core/dev.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/core/dev.c 2009-05-10 23:48:33.000000000 +0200
+@@ -1093,7 +1093,7 @@
+ /*
+ * Enable NET_DMA
+ */
+- net_dmaengine_get();
++ dmaengine_get();
+
+ /*
+ * Initialize multicasting status
+@@ -1175,7 +1175,7 @@
+ /*
+ * Shutdown NET_DMA
+ */
+- net_dmaengine_put();
++ dmaengine_put();
+
+ return 0;
+ }
+@@ -2274,6 +2274,12 @@
+
+ rcu_read_lock();
+
++ /* Don't receive packets in an exiting network namespace */
++ if (!net_alive(dev_net(skb->dev))) {
++ kfree_skb(skb);
++ goto out;
++ }
++
+ #ifdef CONFIG_NET_CLS_ACT
+ if (skb->tc_verd & TC_NCLS) {
+ skb->tc_verd = CLR_TC_NCLS(skb->tc_verd);
+@@ -2489,9 +2495,6 @@
+
+ int napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
+ {
+- if (netpoll_receive_skb(skb))
+- return NET_RX_DROP;
+-
+ switch (__napi_gro_receive(napi, skb)) {
+ case -1:
+ return netif_receive_skb(skb);
+@@ -2562,9 +2565,6 @@
+ if (!skb)
+ goto out;
+
+- if (netpoll_receive_skb(skb))
+- goto out;
+-
+ err = NET_RX_SUCCESS;
+
+ switch (__napi_gro_receive(napi, skb)) {
+@@ -2595,9 +2595,9 @@
+ local_irq_disable();
+ skb = __skb_dequeue(&queue->input_pkt_queue);
+ if (!skb) {
++ __napi_complete(napi);
+ local_irq_enable();
+- napi_complete(napi);
+- goto out;
++ break;
+ }
+ local_irq_enable();
+
+@@ -2606,7 +2606,6 @@
+
+ napi_gro_flush(napi);
+
+-out:
+ return work;
+ }
+
+@@ -2679,7 +2678,7 @@
+ struct sk_buff *skb, *next;
+
+ list_del_init(&napi->dev_list);
+- kfree_skb(napi->skb);
++ kfree(napi->skb);
+
+ for (skb = napi->gro_list; skb; skb = next) {
+ next = skb->next;
+@@ -4290,39 +4289,6 @@
+ }
+ EXPORT_SYMBOL(netdev_fix_features);
+
+-/* Some devices need to (re-)set their netdev_ops inside
+- * ->init() or similar. If that happens, we have to setup
+- * the compat pointers again.
+- */
+-void netdev_resync_ops(struct net_device *dev)
+-{
+-#ifdef CONFIG_COMPAT_NET_DEV_OPS
+- const struct net_device_ops *ops = dev->netdev_ops;
+-
+- dev->init = ops->ndo_init;
+- dev->uninit = ops->ndo_uninit;
+- dev->open = ops->ndo_open;
+- dev->change_rx_flags = ops->ndo_change_rx_flags;
+- dev->set_rx_mode = ops->ndo_set_rx_mode;
+- dev->set_multicast_list = ops->ndo_set_multicast_list;
+- dev->set_mac_address = ops->ndo_set_mac_address;
+- dev->validate_addr = ops->ndo_validate_addr;
+- dev->do_ioctl = ops->ndo_do_ioctl;
+- dev->set_config = ops->ndo_set_config;
+- dev->change_mtu = ops->ndo_change_mtu;
+- dev->neigh_setup = ops->ndo_neigh_setup;
+- dev->tx_timeout = ops->ndo_tx_timeout;
+- dev->get_stats = ops->ndo_get_stats;
+- dev->vlan_rx_register = ops->ndo_vlan_rx_register;
+- dev->vlan_rx_add_vid = ops->ndo_vlan_rx_add_vid;
+- dev->vlan_rx_kill_vid = ops->ndo_vlan_rx_kill_vid;
+-#ifdef CONFIG_NET_POLL_CONTROLLER
+- dev->poll_controller = ops->ndo_poll_controller;
+-#endif
+-#endif
+-}
+-EXPORT_SYMBOL(netdev_resync_ops);
+-
+ /**
+ * register_netdevice - register a network device
+ * @dev: device to register
+@@ -4367,7 +4333,27 @@
+ * This is temporary until all network devices are converted.
+ */
+ if (dev->netdev_ops) {
+- netdev_resync_ops(dev);
++ const struct net_device_ops *ops = dev->netdev_ops;
++
++ dev->init = ops->ndo_init;
++ dev->uninit = ops->ndo_uninit;
++ dev->open = ops->ndo_open;
++ dev->change_rx_flags = ops->ndo_change_rx_flags;
++ dev->set_rx_mode = ops->ndo_set_rx_mode;
++ dev->set_multicast_list = ops->ndo_set_multicast_list;
++ dev->set_mac_address = ops->ndo_set_mac_address;
++ dev->validate_addr = ops->ndo_validate_addr;
++ dev->do_ioctl = ops->ndo_do_ioctl;
++ dev->set_config = ops->ndo_set_config;
++ dev->change_mtu = ops->ndo_change_mtu;
++ dev->tx_timeout = ops->ndo_tx_timeout;
++ dev->get_stats = ops->ndo_get_stats;
++ dev->vlan_rx_register = ops->ndo_vlan_rx_register;
++ dev->vlan_rx_add_vid = ops->ndo_vlan_rx_add_vid;
++ dev->vlan_rx_kill_vid = ops->ndo_vlan_rx_kill_vid;
++#ifdef CONFIG_NET_POLL_CONTROLLER
++ dev->poll_controller = ops->ndo_poll_controller;
++#endif
+ } else {
+ char drivername[64];
+ pr_info("%s (%s): not using net_device_ops yet\n",
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/core/neighbour.c linux-2.6.29-rc3.owrt/net/core/neighbour.c
+--- linux-2.6.29.owrt/net/core/neighbour.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/core/neighbour.c 2009-05-10 23:48:33.000000000 +0200
+@@ -1994,8 +1994,8 @@
+ if (!net_eq(neigh_parms_net(p), net))
+ continue;
+
+- if (nidx < neigh_skip)
+- goto next;
++ if (nidx++ < neigh_skip)
++ continue;
+
+ if (neightbl_fill_param_info(skb, tbl, p,
+ NETLINK_CB(cb->skb).pid,
+@@ -2003,8 +2003,6 @@
+ RTM_NEWNEIGHTBL,
+ NLM_F_MULTI) <= 0)
+ goto out;
+- next:
+- nidx++;
+ }
+
+ neigh_skip = 0;
+@@ -2084,10 +2082,12 @@
+ if (h > s_h)
+ s_idx = 0;
+ for (n = tbl->hash_buckets[h], idx = 0; n; n = n->next) {
++ int lidx;
+ if (dev_net(n->dev) != net)
+ continue;
+- if (idx < s_idx)
+- goto next;
++ lidx = idx++;
++ if (lidx < s_idx)
++ continue;
+ if (neigh_fill_info(skb, n, NETLINK_CB(cb->skb).pid,
+ cb->nlh->nlmsg_seq,
+ RTM_NEWNEIGH,
+@@ -2096,8 +2096,6 @@
+ rc = -1;
+ goto out;
+ }
+- next:
+- idx++;
+ }
+ }
+ read_unlock_bh(&tbl->lock);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/core/net_namespace.c linux-2.6.29-rc3.owrt/net/core/net_namespace.c
+--- linux-2.6.29.owrt/net/core/net_namespace.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/core/net_namespace.c 2009-05-10 23:48:33.000000000 +0200
+@@ -32,14 +32,24 @@
+ {
+ /* Must be called with net_mutex held */
+ struct pernet_operations *ops;
+- int error = 0;
++ int error;
++ struct net_generic *ng;
+
+ atomic_set(&net->count, 1);
+-
+ #ifdef NETNS_REFCNT_DEBUG
+ atomic_set(&net->use_count, 0);
+ #endif
+
++ error = -ENOMEM;
++ ng = kzalloc(sizeof(struct net_generic) +
++ INITIAL_NET_GEN_PTRS * sizeof(void *), GFP_KERNEL);
++ if (ng == NULL)
++ goto out;
++
++ ng->len = INITIAL_NET_GEN_PTRS;
++ rcu_assign_pointer(net->gen, ng);
++
++ error = 0;
+ list_for_each_entry(ops, &pernet_list, list) {
+ if (ops->init) {
+ error = ops->init(net);
+@@ -60,50 +70,24 @@
+ }
+
+ rcu_barrier();
++ kfree(ng);
+ goto out;
+ }
+
+-static struct net_generic *net_alloc_generic(void)
+-{
+- struct net_generic *ng;
+- size_t generic_size = sizeof(struct net_generic) +
+- INITIAL_NET_GEN_PTRS * sizeof(void *);
+-
+- ng = kzalloc(generic_size, GFP_KERNEL);
+- if (ng)
+- ng->len = INITIAL_NET_GEN_PTRS;
+-
+- return ng;
+-}
+-
+ #ifdef CONFIG_NET_NS
+ static struct kmem_cache *net_cachep;
+ static struct workqueue_struct *netns_wq;
+
+ static struct net *net_alloc(void)
+ {
+- struct net *net = NULL;
+- struct net_generic *ng;
+-
+- ng = net_alloc_generic();
+- if (!ng)
+- goto out;
+-
+- net = kmem_cache_zalloc(net_cachep, GFP_KERNEL);
+- if (!net)
+- goto out_free;
+-
+- rcu_assign_pointer(net->gen, ng);
+-out:
+- return net;
+-
+-out_free:
+- kfree(ng);
+- goto out;
++ return kmem_cache_zalloc(net_cachep, GFP_KERNEL);
+ }
+
+ static void net_free(struct net *net)
+ {
++ if (!net)
++ return;
++
+ #ifdef NETNS_REFCNT_DEBUG
+ if (unlikely(atomic_read(&net->use_count) != 0)) {
+ printk(KERN_EMERG "network namespace not free! Usage: %d\n",
+@@ -128,28 +112,27 @@
+ err = -ENOMEM;
+ new_net = net_alloc();
+ if (!new_net)
+- goto out_err;
++ goto out;
+
+ mutex_lock(&net_mutex);
+ err = setup_net(new_net);
+- if (!err) {
+- rtnl_lock();
+- list_add_tail(&new_net->list, &net_namespace_list);
+- rtnl_unlock();
+- }
+- mutex_unlock(&net_mutex);
+-
+ if (err)
+- goto out_free;
++ goto out_unlock;
++
++ rtnl_lock();
++ list_add_tail(&new_net->list, &net_namespace_list);
++ rtnl_unlock();
++
++
++out_unlock:
++ mutex_unlock(&net_mutex);
+ out:
+ put_net(old_net);
++ if (err) {
++ net_free(new_net);
++ new_net = ERR_PTR(err);
++ }
+ return new_net;
+-
+-out_free:
+- net_free(new_net);
+-out_err:
+- new_net = ERR_PTR(err);
+- goto out;
+ }
+
+ static void cleanup_net(struct work_struct *work)
+@@ -157,6 +140,9 @@
+ struct pernet_operations *ops;
+ struct net *net;
+
++ /* Be very certain incoming network packets will not find us */
++ rcu_barrier();
++
+ net = container_of(work, struct net, work);
+
+ mutex_lock(&net_mutex);
+@@ -202,7 +188,6 @@
+
+ static int __init net_ns_init(void)
+ {
+- struct net_generic *ng;
+ int err;
+
+ printk(KERN_INFO "net_namespace: %zd bytes\n", sizeof(struct net));
+@@ -217,12 +202,6 @@
+ panic("Could not create netns workq");
+ #endif
+
+- ng = net_alloc_generic();
+- if (!ng)
+- panic("Could not allocate generic netns");
+-
+- rcu_assign_pointer(init_net.gen, ng);
+-
+ mutex_lock(&net_mutex);
+ err = setup_net(&init_net);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/core/net-sysfs.c linux-2.6.29-rc3.owrt/net/core/net-sysfs.c
+--- linux-2.6.29.owrt/net/core/net-sysfs.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/core/net-sysfs.c 2009-05-10 23:48:33.000000000 +0200
+@@ -77,9 +77,7 @@
+ if (endp == buf)
+ goto err;
+
+- if (!rtnl_trylock())
+- return -ERESTARTSYS;
+-
++ rtnl_lock();
+ if (dev_isalive(net)) {
+ if ((ret = (*set)(net, new)) == 0)
+ ret = len;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/core/skbuff.c linux-2.6.29-rc3.owrt/net/core/skbuff.c
+--- linux-2.6.29.owrt/net/core/skbuff.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/core/skbuff.c 2009-05-10 23:48:33.000000000 +0200
+@@ -220,6 +220,14 @@
+ BUG();
+ }
+
++void skb_truesize_bug(struct sk_buff *skb)
++{
++ WARN(net_ratelimit(), KERN_ERR "SKB BUG: Invalid truesize (%u) "
++ "len=%u, sizeof(sk_buff)=%Zd\n",
++ skb->truesize, skb->len, sizeof(struct sk_buff));
++}
++EXPORT_SYMBOL(skb_truesize_bug);
++
+ /* Allocate a new skbuff. We do this ourselves so we can fill in a few
+ * 'private' fields and also do memory statistics to find all the
+ * [BEEP] leaks.
+@@ -2293,10 +2301,10 @@
+ return 0;
+
+ next_skb:
+- block_limit = skb_headlen(st->cur_skb) + st->stepped_offset;
++ block_limit = skb_headlen(st->cur_skb);
+
+ if (abs_offset < block_limit) {
+- *data = st->cur_skb->data + (abs_offset - st->stepped_offset);
++ *data = st->cur_skb->data + abs_offset;
+ return block_limit - abs_offset;
+ }
+
+@@ -2331,15 +2339,14 @@
+ st->frag_data = NULL;
+ }
+
+- if (st->root_skb == st->cur_skb &&
+- skb_shinfo(st->root_skb)->frag_list) {
+- st->cur_skb = skb_shinfo(st->root_skb)->frag_list;
+- st->frag_idx = 0;
+- goto next_skb;
+- } else if (st->cur_skb->next) {
++ if (st->cur_skb->next) {
+ st->cur_skb = st->cur_skb->next;
+ st->frag_idx = 0;
+ goto next_skb;
++ } else if (st->root_skb == st->cur_skb &&
++ skb_shinfo(st->root_skb)->frag_list) {
++ st->cur_skb = skb_shinfo(st->root_skb)->frag_list;
++ goto next_skb;
+ }
+
+ return 0;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/core/sock.c linux-2.6.29-rc3.owrt/net/core/sock.c
+--- linux-2.6.29.owrt/net/core/sock.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/core/sock.c 2009-05-10 23:48:33.000000000 +0200
+@@ -696,8 +696,6 @@
+ if (len < 0)
+ return -EINVAL;
+
+- memset(&v, 0, sizeof(v));
+-
+ switch(optname) {
+ case SO_DEBUG:
+ v.val = sock_flag(sk, SOCK_DBG);
+@@ -1137,6 +1135,7 @@
+ {
+ struct sock *sk = skb->sk;
+
++ skb_truesize_check(skb);
+ atomic_sub(skb->truesize, &sk->sk_rmem_alloc);
+ sk_mem_uncharge(skb->sk, skb->truesize);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv4/cipso_ipv4.c linux-2.6.29-rc3.owrt/net/ipv4/cipso_ipv4.c
+--- linux-2.6.29.owrt/net/ipv4/cipso_ipv4.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv4/cipso_ipv4.c 2009-05-10 23:48:33.000000000 +0200
+@@ -3,16 +3,11 @@
+ *
+ * This is an implementation of the CIPSO 2.2 protocol as specified in
+ * draft-ietf-cipso-ipsecurity-01.txt with additional tag types as found in
+- * FIPS-188. While CIPSO never became a full IETF RFC standard many vendors
++ * FIPS-188, copies of both documents can be found in the Documentation
++ * directory. While CIPSO never became a full IETF RFC standard many vendors
+ * have chosen to adopt the protocol and over the years it has become a
+ * de-facto standard for labeled networking.
+ *
+- * The CIPSO draft specification can be found in the kernel's Documentation
+- * directory as well as the following URL:
+- * http://netlabel.sourceforge.net/files/draft-ietf-cipso-ipsecurity-01.txt
+- * The FIPS-188 specification can be found at the following URL:
+- * http://www.itl.nist.gov/fipspubs/fip188.htm
+- *
+ * Author: Paul Moore <paul.moore@hp.com>
+ *
+ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv4/icmp.c linux-2.6.29-rc3.owrt/net/ipv4/icmp.c
+--- linux-2.6.29.owrt/net/ipv4/icmp.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv4/icmp.c 2009-05-10 23:48:33.000000000 +0200
+@@ -1205,7 +1205,7 @@
+
+ int __init icmp_init(void)
+ {
+- return register_pernet_subsys(&icmp_sk_ops);
++ return register_pernet_device(&icmp_sk_ops);
+ }
+
+ EXPORT_SYMBOL(icmp_err_convert);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv4/ipconfig.c linux-2.6.29-rc3.owrt/net/ipv4/ipconfig.c
+--- linux-2.6.29.owrt/net/ipv4/ipconfig.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv4/ipconfig.c 2009-05-10 23:48:33.000000000 +0200
+@@ -1268,9 +1268,6 @@
+ static int __init ip_auto_config(void)
+ {
+ __be32 addr;
+-#ifdef IPCONFIG_DYNAMIC
+- int retries = CONF_OPEN_RETRIES;
+-#endif
+
+ #ifdef CONFIG_PROC_FS
+ proc_net_fops_create(&init_net, "pnp", S_IRUGO, &pnp_seq_fops);
+@@ -1307,6 +1304,9 @@
+ #endif
+ ic_first_dev->next) {
+ #ifdef IPCONFIG_DYNAMIC
++
++ int retries = CONF_OPEN_RETRIES;
++
+ if (ic_dynamic() < 0) {
+ ic_close_devs();
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv4/ip_fragment.c linux-2.6.29-rc3.owrt/net/ipv4/ip_fragment.c
+--- linux-2.6.29.owrt/net/ipv4/ip_fragment.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv4/ip_fragment.c 2009-05-10 23:48:33.000000000 +0200
+@@ -463,7 +463,6 @@
+ static int ip_frag_reasm(struct ipq *qp, struct sk_buff *prev,
+ struct net_device *dev)
+ {
+- struct net *net = container_of(qp->q.net, struct net, ipv4.frags);
+ struct iphdr *iph;
+ struct sk_buff *fp, *head = qp->q.fragments;
+ int len;
+@@ -549,7 +548,7 @@
+ iph = ip_hdr(head);
+ iph->frag_off = 0;
+ iph->tot_len = htons(len);
+- IP_INC_STATS_BH(net, IPSTATS_MIB_REASMOKS);
++ IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_REASMOKS);
+ qp->q.fragments = NULL;
+ return 0;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv4/tcp.c linux-2.6.29-rc3.owrt/net/ipv4/tcp.c
+--- linux-2.6.29.owrt/net/ipv4/tcp.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv4/tcp.c 2009-05-10 23:48:33.000000000 +0200
+@@ -524,8 +524,7 @@
+ struct tcp_splice_state *tss = rd_desc->arg.data;
+ int ret;
+
+- ret = skb_splice_bits(skb, offset, tss->pipe, min(rd_desc->count, len),
+- tss->flags);
++ ret = skb_splice_bits(skb, offset, tss->pipe, rd_desc->count, tss->flags);
+ if (ret > 0)
+ rd_desc->count -= ret;
+ return ret;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv4/tcp_input.c linux-2.6.29-rc3.owrt/net/ipv4/tcp_input.c
+--- linux-2.6.29.owrt/net/ipv4/tcp_input.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv4/tcp_input.c 2009-05-10 23:48:34.000000000 +0200
+@@ -1374,8 +1374,7 @@
+
+ static int tcp_shifted_skb(struct sock *sk, struct sk_buff *skb,
+ struct tcp_sacktag_state *state,
+- unsigned int pcount, int shifted, int mss,
+- int dup_sack)
++ unsigned int pcount, int shifted, int mss)
+ {
+ struct tcp_sock *tp = tcp_sk(sk);
+ struct sk_buff *prev = tcp_write_queue_prev(sk, skb);
+@@ -1411,7 +1410,7 @@
+ }
+
+ /* We discard results */
+- tcp_sacktag_one(skb, sk, state, dup_sack, pcount);
++ tcp_sacktag_one(skb, sk, state, 0, pcount);
+
+ /* Difference in this won't matter, both ACKed by the same cumul. ACK */
+ TCP_SKB_CB(prev)->sacked |= (TCP_SKB_CB(skb)->sacked & TCPCB_EVER_RETRANS);
+@@ -1562,7 +1561,7 @@
+
+ if (!skb_shift(prev, skb, len))
+ goto fallback;
+- if (!tcp_shifted_skb(sk, skb, state, pcount, len, mss, dup_sack))
++ if (!tcp_shifted_skb(sk, skb, state, pcount, len, mss))
+ goto out;
+
+ /* Hole filled allows collapsing with the next as well, this is very
+@@ -1581,7 +1580,7 @@
+ len = skb->len;
+ if (skb_shift(prev, skb, len)) {
+ pcount += tcp_skb_pcount(skb);
+- tcp_shifted_skb(sk, skb, state, tcp_skb_pcount(skb), len, mss, 0);
++ tcp_shifted_skb(sk, skb, state, tcp_skb_pcount(skb), len, mss);
+ }
+
+ out:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv4/tcp_ipv4.c linux-2.6.29-rc3.owrt/net/ipv4/tcp_ipv4.c
+--- linux-2.6.29.owrt/net/ipv4/tcp_ipv4.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv4/tcp_ipv4.c 2009-05-10 23:48:34.000000000 +0200
+@@ -2443,7 +2443,7 @@
+ void __init tcp_v4_init(void)
+ {
+ inet_hashinfo_init(&tcp_hashinfo);
+- if (register_pernet_subsys(&tcp_sk_ops))
++ if (register_pernet_device(&tcp_sk_ops))
+ panic("Failed to create the TCP control socket.\n");
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv4/tcp_output.c linux-2.6.29-rc3.owrt/net/ipv4/tcp_output.c
+--- linux-2.6.29.owrt/net/ipv4/tcp_output.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv4/tcp_output.c 2009-05-10 23:48:34.000000000 +0200
+@@ -663,10 +663,14 @@
+ th->urg_ptr = 0;
+
+ /* The urg_mode check is necessary during a below snd_una win probe */
+- if (unlikely(tcp_urg_mode(tp) &&
+- between(tp->snd_up, tcb->seq + 1, tcb->seq + 0xFFFF))) {
+- th->urg_ptr = htons(tp->snd_up - tcb->seq);
+- th->urg = 1;
++ if (unlikely(tcp_urg_mode(tp))) {
++ if (between(tp->snd_up, tcb->seq + 1, tcb->seq + 0xFFFF)) {
++ th->urg_ptr = htons(tp->snd_up - tcb->seq);
++ th->urg = 1;
++ } else if (after(tcb->seq + 0xFFFF, tp->snd_nxt)) {
++ th->urg_ptr = 0xFFFF;
++ th->urg = 1;
++ }
+ }
+
+ tcp_options_write((__be32 *)(th + 1), tp, &opts, &md5_hash_location);
+@@ -2023,6 +2027,7 @@
+ last_lost = tp->snd_una;
+ }
+
++ /* First pass: retransmit lost packets. */
+ tcp_for_write_queue_from(skb, sk) {
+ __u8 sacked = TCP_SKB_CB(skb)->sacked;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv4/tcp_scalable.c linux-2.6.29-rc3.owrt/net/ipv4/tcp_scalable.c
+--- linux-2.6.29.owrt/net/ipv4/tcp_scalable.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv4/tcp_scalable.c 2009-05-10 23:48:34.000000000 +0200
+@@ -1,6 +1,6 @@
+ /* Tom Kelly's Scalable TCP
+ *
+- * See http://www.deneholme.net/tom/scalable/
++ * See htt://www-lce.eng.cam.ac.uk/~ctk21/scalable/
+ *
+ * John Heffner <jheffner@sc.edu>
+ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv4/udp.c linux-2.6.29-rc3.owrt/net/ipv4/udp.c
+--- linux-2.6.29.owrt/net/ipv4/udp.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv4/udp.c 2009-05-10 23:48:34.000000000 +0200
+@@ -120,11 +120,8 @@
+ atomic_t udp_memory_allocated;
+ EXPORT_SYMBOL(udp_memory_allocated);
+
+-#define PORTS_PER_CHAIN (65536 / UDP_HTABLE_SIZE)
+-
+ static int udp_lib_lport_inuse(struct net *net, __u16 num,
+ const struct udp_hslot *hslot,
+- unsigned long *bitmap,
+ struct sock *sk,
+ int (*saddr_comp)(const struct sock *sk1,
+ const struct sock *sk2))
+@@ -135,17 +132,12 @@
+ sk_nulls_for_each(sk2, node, &hslot->head)
+ if (net_eq(sock_net(sk2), net) &&
+ sk2 != sk &&
+- (bitmap || sk2->sk_hash == num) &&
++ sk2->sk_hash == num &&
+ (!sk2->sk_reuse || !sk->sk_reuse) &&
+ (!sk2->sk_bound_dev_if || !sk->sk_bound_dev_if
+ || sk2->sk_bound_dev_if == sk->sk_bound_dev_if) &&
+- (*saddr_comp)(sk, sk2)) {
+- if (bitmap)
+- __set_bit(sk2->sk_hash / UDP_HTABLE_SIZE,
+- bitmap);
+- else
+- return 1;
+- }
++ (*saddr_comp)(sk, sk2))
++ return 1;
+ return 0;
+ }
+
+@@ -168,47 +160,32 @@
+ if (!snum) {
+ int low, high, remaining;
+ unsigned rand;
+- unsigned short first, last;
+- DECLARE_BITMAP(bitmap, PORTS_PER_CHAIN);
++ unsigned short first;
+
+ inet_get_local_port_range(&low, &high);
+ remaining = (high - low) + 1;
+
+ rand = net_random();
+- first = (((u64)rand * remaining) >> 32) + low;
+- /*
+- * force rand to be an odd multiple of UDP_HTABLE_SIZE
+- */
+- rand = (rand | 1) * UDP_HTABLE_SIZE;
+- for (last = first + UDP_HTABLE_SIZE; first != last; first++) {
+- hslot = &udptable->hash[udp_hashfn(net, first)];
+- bitmap_zero(bitmap, PORTS_PER_CHAIN);
++ snum = first = rand % remaining + low;
++ rand |= 1;
++ for (;;) {
++ hslot = &udptable->hash[udp_hashfn(net, snum)];
+ spin_lock_bh(&hslot->lock);
+- udp_lib_lport_inuse(net, snum, hslot, bitmap, sk,
+- saddr_comp);
+-
+- snum = first;
+- /*
+- * Iterate on all possible values of snum for this hash.
+- * Using steps of an odd multiple of UDP_HTABLE_SIZE
+- * give us randomization and full range coverage.
+- */
+- do {
+- if (low <= snum && snum <= high &&
+- !test_bit(snum / UDP_HTABLE_SIZE, bitmap))
+- goto found;
+- snum += rand;
+- } while (snum != first);
++ if (!udp_lib_lport_inuse(net, snum, hslot, sk, saddr_comp))
++ break;
+ spin_unlock_bh(&hslot->lock);
++ do {
++ snum = snum + rand;
++ } while (snum < low || snum > high);
++ if (snum == first)
++ goto fail;
+ }
+- goto fail;
+ } else {
+ hslot = &udptable->hash[udp_hashfn(net, snum)];
+ spin_lock_bh(&hslot->lock);
+- if (udp_lib_lport_inuse(net, snum, hslot, NULL, sk, saddr_comp))
++ if (udp_lib_lport_inuse(net, snum, hslot, sk, saddr_comp))
+ goto fail_unlock;
+ }
+-found:
+ inet_sk(sk)->num = snum;
+ sk->sk_hash = snum;
+ if (sk_unhashed(sk)) {
+@@ -1015,11 +992,9 @@
+
+ if ((rc = sock_queue_rcv_skb(sk, skb)) < 0) {
+ /* Note that an ENOMEM error is charged twice */
+- if (rc == -ENOMEM) {
++ if (rc == -ENOMEM)
+ UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_RCVBUFERRORS,
+ is_udplite);
+- atomic_inc(&sk->sk_drops);
+- }
+ goto drop;
+ }
+
+@@ -1231,10 +1206,11 @@
+ int proto)
+ {
+ struct sock *sk;
+- struct udphdr *uh;
++ struct udphdr *uh = udp_hdr(skb);
+ unsigned short ulen;
+ struct rtable *rt = (struct rtable*)skb->dst;
+- __be32 saddr, daddr;
++ __be32 saddr = ip_hdr(skb)->saddr;
++ __be32 daddr = ip_hdr(skb)->daddr;
+ struct net *net = dev_net(skb->dev);
+
+ /*
+@@ -1243,7 +1219,6 @@
+ if (!pskb_may_pull(skb, sizeof(struct udphdr)))
+ goto drop; /* No space for header. */
+
+- uh = udp_hdr(skb);
+ ulen = ntohs(uh->len);
+ if (ulen > skb->len)
+ goto short_packet;
+@@ -1258,9 +1233,6 @@
+ if (udp4_csum_init(skb, uh, proto))
+ goto csum_error;
+
+- saddr = ip_hdr(skb)->saddr;
+- daddr = ip_hdr(skb)->daddr;
+-
+ if (rt->rt_flags & (RTCF_BROADCAST|RTCF_MULTICAST))
+ return __udp4_lib_mcast_deliver(net, skb, uh,
+ saddr, daddr, udptable);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv6/addrconf.c linux-2.6.29-rc3.owrt/net/ipv6/addrconf.c
+--- linux-2.6.29.owrt/net/ipv6/addrconf.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv6/addrconf.c 2009-05-10 23:48:34.000000000 +0200
+@@ -493,17 +493,15 @@
+ read_unlock(&dev_base_lock);
+ }
+
+-static int addrconf_fixup_forwarding(struct ctl_table *table, int *p, int old)
++static void addrconf_fixup_forwarding(struct ctl_table *table, int *p, int old)
+ {
+ struct net *net;
+
+ net = (struct net *)table->extra2;
+ if (p == &net->ipv6.devconf_dflt->forwarding)
+- return 0;
+-
+- if (!rtnl_trylock())
+- return -ERESTARTSYS;
++ return;
+
++ rtnl_lock();
+ if (p == &net->ipv6.devconf_all->forwarding) {
+ __s32 newf = net->ipv6.devconf_all->forwarding;
+ net->ipv6.devconf_dflt->forwarding = newf;
+@@ -514,7 +512,6 @@
+
+ if (*p)
+ rt6_purge_dflt_routers(net);
+- return 1;
+ }
+ #endif
+
+@@ -2611,6 +2608,9 @@
+
+ ASSERT_RTNL();
+
++ if ((dev->flags & IFF_LOOPBACK) && how == 1)
++ how = 0;
++
+ rt6_ifdown(net, dev);
+ neigh_ifdown(&nd_tbl, dev);
+
+@@ -3983,7 +3983,7 @@
+ ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
+
+ if (write)
+- ret = addrconf_fixup_forwarding(ctl, valp, val);
++ addrconf_fixup_forwarding(ctl, valp, val);
+ return ret;
+ }
+
+@@ -4019,7 +4019,8 @@
+ }
+
+ *valp = new;
+- return addrconf_fixup_forwarding(table, valp, val);
++ addrconf_fixup_forwarding(table, valp, val);
++ return 1;
+ }
+
+ static struct addrconf_sysctl_table
+@@ -4249,7 +4250,7 @@
+ .procname = "mc_forwarding",
+ .data = &ipv6_devconf.mc_forwarding,
+ .maxlen = sizeof(int),
+- .mode = 0444,
++ .mode = 0644,
+ .proc_handler = proc_dointvec,
+ },
+ #endif
+@@ -4445,6 +4446,25 @@
+
+ EXPORT_SYMBOL(unregister_inet6addr_notifier);
+
++static void addrconf_net_exit(struct net *net)
++{
++ struct net_device *dev;
++
++ rtnl_lock();
++ /* clean dev list */
++ for_each_netdev(net, dev) {
++ if (__in6_dev_get(dev) == NULL)
++ continue;
++ addrconf_ifdown(dev, 1);
++ }
++ addrconf_ifdown(net->loopback_dev, 2);
++ rtnl_unlock();
++}
++
++static struct pernet_operations addrconf_net_ops = {
++ .exit = addrconf_net_exit,
++};
++
+ /*
+ * Init / cleanup code
+ */
+@@ -4486,6 +4506,10 @@
+ if (err)
+ goto errlo;
+
++ err = register_pernet_device(&addrconf_net_ops);
++ if (err)
++ return err;
++
+ register_netdevice_notifier(&ipv6_dev_notf);
+
+ addrconf_verify(0);
+@@ -4515,22 +4539,15 @@
+ void addrconf_cleanup(void)
+ {
+ struct inet6_ifaddr *ifa;
+- struct net_device *dev;
+ int i;
+
+ unregister_netdevice_notifier(&ipv6_dev_notf);
++ unregister_pernet_device(&addrconf_net_ops);
++
+ unregister_pernet_subsys(&addrconf_ops);
+
+ rtnl_lock();
+
+- /* clean dev list */
+- for_each_netdev(&init_net, dev) {
+- if (__in6_dev_get(dev) == NULL)
+- continue;
+- addrconf_ifdown(dev, 1);
+- }
+- addrconf_ifdown(init_net.loopback_dev, 2);
+-
+ /*
+ * Check hash table.
+ */
+@@ -4551,4 +4568,6 @@
+
+ del_timer(&addr_chk_timer);
+ rtnl_unlock();
++
++ unregister_pernet_subsys(&addrconf_net_ops);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv6/af_inet6.c linux-2.6.29-rc3.owrt/net/ipv6/af_inet6.c
+--- linux-2.6.29.owrt/net/ipv6/af_inet6.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv6/af_inet6.c 2009-05-10 23:48:34.000000000 +0200
+@@ -72,10 +72,6 @@
+ static struct list_head inetsw6[SOCK_MAX];
+ static DEFINE_SPINLOCK(inetsw6_lock);
+
+-static int disable_ipv6 = 0;
+-module_param_named(disable, disable_ipv6, int, 0);
+-MODULE_PARM_DESC(disable, "Disable IPv6 such that it is non-functional");
+-
+ static __inline__ struct ipv6_pinfo *inet6_sk_generic(struct sock *sk)
+ {
+ const int offset = sk->sk_prot->obj_size - sizeof(struct ipv6_pinfo);
+@@ -995,21 +991,10 @@
+ {
+ struct sk_buff *dummy_skb;
+ struct list_head *r;
+- int err = 0;
++ int err;
+
+ BUILD_BUG_ON(sizeof(struct inet6_skb_parm) > sizeof(dummy_skb->cb));
+
+- /* Register the socket-side information for inet6_create. */
+- for(r = &inetsw6[0]; r < &inetsw6[SOCK_MAX]; ++r)
+- INIT_LIST_HEAD(r);
+-
+- if (disable_ipv6) {
+- printk(KERN_INFO
+- "IPv6: Loaded, but administratively disabled, "
+- "reboot required to enable\n");
+- goto out;
+- }
+-
+ err = proto_register(&tcpv6_prot, 1);
+ if (err)
+ goto out;
+@@ -1027,6 +1012,10 @@
+ goto out_unregister_udplite_proto;
+
+
++ /* Register the socket-side information for inet6_create. */
++ for(r = &inetsw6[0]; r < &inetsw6[SOCK_MAX]; ++r)
++ INIT_LIST_HEAD(r);
++
+ /* We MUST register RAW sockets before we create the ICMP6,
+ * IGMP6, or NDISC control sockets.
+ */
+@@ -1192,9 +1181,6 @@
+
+ static void __exit inet6_exit(void)
+ {
+- if (disable_ipv6)
+- return;
+-
+ /* First of all disallow new sockets creation. */
+ sock_unregister(PF_INET6);
+ /* Disallow any further netlink messages */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv6/icmp.c linux-2.6.29-rc3.owrt/net/ipv6/icmp.c
+--- linux-2.6.29.owrt/net/ipv6/icmp.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv6/icmp.c 2009-05-10 23:48:34.000000000 +0200
+@@ -443,10 +443,10 @@
+ if (xfrm_decode_session_reverse(skb, &fl2, AF_INET6))
+ goto relookup_failed;
+
+- if (ip6_dst_lookup(sk, &dst2, &fl2))
++ if (ip6_dst_lookup(sk, &dst2, &fl))
+ goto relookup_failed;
+
+- err = xfrm_lookup(net, &dst2, &fl2, sk, XFRM_LOOKUP_ICMP);
++ err = xfrm_lookup(net, &dst2, &fl, sk, XFRM_LOOKUP_ICMP);
+ switch (err) {
+ case 0:
+ dst_release(dst);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv6/inet6_hashtables.c linux-2.6.29-rc3.owrt/net/ipv6/inet6_hashtables.c
+--- linux-2.6.29.owrt/net/ipv6/inet6_hashtables.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv6/inet6_hashtables.c 2009-05-10 23:48:34.000000000 +0200
+@@ -258,11 +258,11 @@
+
+ if (twp != NULL) {
+ *twp = tw;
+- NET_INC_STATS_BH(net, LINUX_MIB_TIMEWAITRECYCLED);
++ NET_INC_STATS_BH(twsk_net(tw), LINUX_MIB_TIMEWAITRECYCLED);
+ } else if (tw != NULL) {
+ /* Silly. Should hash-dance instead... */
+ inet_twsk_deschedule(tw, death_row);
+- NET_INC_STATS_BH(net, LINUX_MIB_TIMEWAITRECYCLED);
++ NET_INC_STATS_BH(twsk_net(tw), LINUX_MIB_TIMEWAITRECYCLED);
+
+ inet_twsk_put(tw);
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv6/ip6_flowlabel.c linux-2.6.29-rc3.owrt/net/ipv6/ip6_flowlabel.c
+--- linux-2.6.29.owrt/net/ipv6/ip6_flowlabel.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv6/ip6_flowlabel.c 2009-05-10 23:48:34.000000000 +0200
+@@ -323,21 +323,17 @@
+ fl_create(struct net *net, struct in6_flowlabel_req *freq, char __user *optval,
+ int optlen, int *err_p)
+ {
+- struct ip6_flowlabel *fl = NULL;
++ struct ip6_flowlabel *fl;
+ int olen;
+ int addr_type;
+ int err;
+
+- olen = optlen - CMSG_ALIGN(sizeof(*freq));
+- err = -EINVAL;
+- if (olen > 64 * 1024)
+- goto done;
+-
+ err = -ENOMEM;
+ fl = kzalloc(sizeof(*fl), GFP_KERNEL);
+ if (fl == NULL)
+ goto done;
+
++ olen = optlen - CMSG_ALIGN(sizeof(*freq));
+ if (olen > 0) {
+ struct msghdr msg;
+ struct flowi flowi;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv6/ip6_input.c linux-2.6.29-rc3.owrt/net/ipv6/ip6_input.c
+--- linux-2.6.29.owrt/net/ipv6/ip6_input.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv6/ip6_input.c 2009-05-10 23:48:34.000000000 +0200
+@@ -255,7 +255,6 @@
+ * IPv6 multicast router mode is now supported ;)
+ */
+ if (dev_net(skb->dev)->ipv6.devconf_all->mc_forwarding &&
+- !(ipv6_addr_type(&hdr->daddr) & IPV6_ADDR_LINKLOCAL) &&
+ likely(!(IP6CB(skb)->flags & IP6SKB_FORWARDED))) {
+ /*
+ * Okay, we try to forward - split and duplicate
+@@ -317,6 +316,7 @@
+ }
+
+ if (skb2) {
++ skb2->dev = skb2->dst->dev;
+ ip6_mr_input(skb2);
+ }
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv6/ip6mr.c linux-2.6.29-rc3.owrt/net/ipv6/ip6mr.c
+--- linux-2.6.29.owrt/net/ipv6/ip6mr.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv6/ip6mr.c 2009-05-10 23:48:34.000000000 +0200
+@@ -48,7 +48,6 @@
+ #include <linux/pim.h>
+ #include <net/addrconf.h>
+ #include <linux/netfilter_ipv6.h>
+-#include <net/ip6_checksum.h>
+
+ /* Big lock, protecting vif table, mrt cache and mroute socket state.
+ Note that the changes are semaphored via rtnl_lock.
+@@ -366,9 +365,7 @@
+ pim = (struct pimreghdr *)skb_transport_header(skb);
+ if (pim->type != ((PIM_VERSION << 4) | PIM_REGISTER) ||
+ (pim->flags & PIM_NULL_REGISTER) ||
+- (csum_ipv6_magic(&ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr,
+- sizeof(*pim), IPPROTO_PIM,
+- csum_partial((void *)pim, sizeof(*pim), 0)) &&
++ (ip_compute_csum((void *)pim, sizeof(*pim)) != 0 &&
+ csum_fold(skb_checksum(skb, 0, skb->len, 0))))
+ goto drop;
+
+@@ -395,7 +392,7 @@
+ skb_pull(skb, (u8 *)encap - skb->data);
+ skb_reset_network_header(skb);
+ skb->dev = reg_dev;
+- skb->protocol = htons(ETH_P_IPV6);
++ skb->protocol = htons(ETH_P_IP);
+ skb->ip_summed = 0;
+ skb->pkt_type = PACKET_HOST;
+ dst_release(skb->dst);
+@@ -484,7 +481,6 @@
+ {
+ struct mif_device *v;
+ struct net_device *dev;
+- struct inet6_dev *in6_dev;
+ if (vifi < 0 || vifi >= net->ipv6.maxvif)
+ return -EADDRNOTAVAIL;
+
+@@ -517,10 +513,6 @@
+
+ dev_set_allmulti(dev, -1);
+
+- in6_dev = __in6_dev_get(dev);
+- if (in6_dev)
+- in6_dev->cnf.mc_forwarding--;
+-
+ if (v->flags & MIFF_REGISTER)
+ unregister_netdevice(dev);
+
+@@ -630,7 +622,6 @@
+ int vifi = vifc->mif6c_mifi;
+ struct mif_device *v = &net->ipv6.vif6_table[vifi];
+ struct net_device *dev;
+- struct inet6_dev *in6_dev;
+ int err;
+
+ /* Is vif busy ? */
+@@ -671,10 +662,6 @@
+ return -EINVAL;
+ }
+
+- in6_dev = __in6_dev_get(dev);
+- if (in6_dev)
+- in6_dev->cnf.mc_forwarding++;
+-
+ /*
+ * Fill in the VIF structures
+ */
+@@ -851,6 +838,8 @@
+
+ skb->dst = dst_clone(pkt->dst);
+ skb->ip_summed = CHECKSUM_UNNECESSARY;
++
++ skb_pull(skb, sizeof(struct ipv6hdr));
+ }
+
+ if (net->ipv6.mroute6_sk == NULL) {
+@@ -1233,10 +1222,8 @@
+
+ rtnl_lock();
+ write_lock_bh(&mrt_lock);
+- if (likely(net->ipv6.mroute6_sk == NULL)) {
++ if (likely(net->ipv6.mroute6_sk == NULL))
+ net->ipv6.mroute6_sk = sk;
+- net->ipv6.devconf_all->mc_forwarding++;
+- }
+ else
+ err = -EADDRINUSE;
+ write_unlock_bh(&mrt_lock);
+@@ -1255,7 +1242,6 @@
+ if (sk == net->ipv6.mroute6_sk) {
+ write_lock_bh(&mrt_lock);
+ net->ipv6.mroute6_sk = NULL;
+- net->ipv6.devconf_all->mc_forwarding--;
+ write_unlock_bh(&mrt_lock);
+
+ mroute_clean_tables(net);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv6/ip6_output.c linux-2.6.29-rc3.owrt/net/ipv6/ip6_output.c
+--- linux-2.6.29.owrt/net/ipv6/ip6_output.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv6/ip6_output.c 2009-05-10 23:48:34.000000000 +0200
+@@ -1105,18 +1105,6 @@
+ return err;
+ }
+
+-static inline struct ipv6_opt_hdr *ip6_opt_dup(struct ipv6_opt_hdr *src,
+- gfp_t gfp)
+-{
+- return src ? kmemdup(src, (src->hdrlen + 1) * 8, gfp) : NULL;
+-}
+-
+-static inline struct ipv6_rt_hdr *ip6_rthdr_dup(struct ipv6_rt_hdr *src,
+- gfp_t gfp)
+-{
+- return src ? kmemdup(src, (src->hdrlen + 1) * 8, gfp) : NULL;
+-}
+-
+ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
+ int offset, int len, int odd, struct sk_buff *skb),
+ void *from, int length, int transhdrlen,
+@@ -1142,37 +1130,17 @@
+ * setup for corking
+ */
+ if (opt) {
+- if (WARN_ON(np->cork.opt))
++ if (np->cork.opt == NULL) {
++ np->cork.opt = kmalloc(opt->tot_len,
++ sk->sk_allocation);
++ if (unlikely(np->cork.opt == NULL))
++ return -ENOBUFS;
++ } else if (np->cork.opt->tot_len < opt->tot_len) {
++ printk(KERN_DEBUG "ip6_append_data: invalid option length\n");
+ return -EINVAL;
+-
+- np->cork.opt = kmalloc(opt->tot_len, sk->sk_allocation);
+- if (unlikely(np->cork.opt == NULL))
+- return -ENOBUFS;
+-
+- np->cork.opt->tot_len = opt->tot_len;
+- np->cork.opt->opt_flen = opt->opt_flen;
+- np->cork.opt->opt_nflen = opt->opt_nflen;
+-
+- np->cork.opt->dst0opt = ip6_opt_dup(opt->dst0opt,
+- sk->sk_allocation);
+- if (opt->dst0opt && !np->cork.opt->dst0opt)
+- return -ENOBUFS;
+-
+- np->cork.opt->dst1opt = ip6_opt_dup(opt->dst1opt,
+- sk->sk_allocation);
+- if (opt->dst1opt && !np->cork.opt->dst1opt)
+- return -ENOBUFS;
+-
+- np->cork.opt->hopopt = ip6_opt_dup(opt->hopopt,
+- sk->sk_allocation);
+- if (opt->hopopt && !np->cork.opt->hopopt)
+- return -ENOBUFS;
+-
+- np->cork.opt->srcrt = ip6_rthdr_dup(opt->srcrt,
+- sk->sk_allocation);
+- if (opt->srcrt && !np->cork.opt->srcrt)
+- return -ENOBUFS;
+-
++ }
++ memcpy(np->cork.opt, opt, opt->tot_len);
++ inet->cork.flags |= IPCORK_OPT;
+ /* need source address above miyazawa*/
+ }
+ dst_hold(&rt->u.dst);
+@@ -1199,7 +1167,8 @@
+ } else {
+ rt = (struct rt6_info *)inet->cork.dst;
+ fl = &inet->cork.fl;
+- opt = np->cork.opt;
++ if (inet->cork.flags & IPCORK_OPT)
++ opt = np->cork.opt;
+ transhdrlen = 0;
+ exthdrlen = 0;
+ mtu = inet->cork.fragsize;
+@@ -1438,15 +1407,9 @@
+
+ static void ip6_cork_release(struct inet_sock *inet, struct ipv6_pinfo *np)
+ {
+- if (np->cork.opt) {
+- kfree(np->cork.opt->dst0opt);
+- kfree(np->cork.opt->dst1opt);
+- kfree(np->cork.opt->hopopt);
+- kfree(np->cork.opt->srcrt);
+- kfree(np->cork.opt);
+- np->cork.opt = NULL;
+- }
+-
++ inet->cork.flags &= ~IPCORK_OPT;
++ kfree(np->cork.opt);
++ np->cork.opt = NULL;
+ if (inet->cork.dst) {
+ dst_release(inet->cork.dst);
+ inet->cork.dst = NULL;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv6/ip6_tunnel.c linux-2.6.29-rc3.owrt/net/ipv6/ip6_tunnel.c
+--- linux-2.6.29.owrt/net/ipv6/ip6_tunnel.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv6/ip6_tunnel.c 2009-05-10 23:48:34.000000000 +0200
+@@ -249,8 +249,8 @@
+ }
+
+ t = netdev_priv(dev);
+- t->parms = *p;
+ ip6_tnl_dev_init(dev);
++ t->parms = *p;
+
+ if ((err = register_netdevice(dev)) < 0)
+ goto failed_free;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c linux-2.6.29-rc3.owrt/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c
+--- linux-2.6.29.owrt/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c 2009-05-10 23:48:34.000000000 +0200
+@@ -49,19 +49,8 @@
+ static const u_int8_t invmap[] = {
+ [ICMPV6_ECHO_REQUEST - 128] = ICMPV6_ECHO_REPLY + 1,
+ [ICMPV6_ECHO_REPLY - 128] = ICMPV6_ECHO_REQUEST + 1,
+- [ICMPV6_NI_QUERY - 128] = ICMPV6_NI_REPLY + 1,
+- [ICMPV6_NI_REPLY - 128] = ICMPV6_NI_QUERY +1
+-};
+-
+-static const u_int8_t noct_valid_new[] = {
+- [ICMPV6_MGM_QUERY - 130] = 1,
+- [ICMPV6_MGM_REPORT -130] = 1,
+- [ICMPV6_MGM_REDUCTION - 130] = 1,
+- [NDISC_ROUTER_SOLICITATION - 130] = 1,
+- [NDISC_ROUTER_ADVERTISEMENT - 130] = 1,
+- [NDISC_NEIGHBOUR_SOLICITATION - 130] = 1,
+- [NDISC_NEIGHBOUR_ADVERTISEMENT - 130] = 1,
+- [ICMPV6_MLD2_REPORT - 130] = 1
++ [ICMPV6_NI_QUERY - 128] = ICMPV6_NI_QUERY + 1,
++ [ICMPV6_NI_REPLY - 128] = ICMPV6_NI_REPLY +1
+ };
+
+ static bool icmpv6_invert_tuple(struct nf_conntrack_tuple *tuple,
+@@ -189,7 +178,6 @@
+ {
+ const struct icmp6hdr *icmp6h;
+ struct icmp6hdr _ih;
+- int type;
+
+ icmp6h = skb_header_pointer(skb, dataoff, sizeof(_ih), &_ih);
+ if (icmp6h == NULL) {
+@@ -201,21 +189,11 @@
+
+ if (net->ct.sysctl_checksum && hooknum == NF_INET_PRE_ROUTING &&
+ nf_ip6_checksum(skb, hooknum, dataoff, IPPROTO_ICMPV6)) {
+- if (LOG_INVALID(net, IPPROTO_ICMPV6))
+- nf_log_packet(PF_INET6, 0, skb, NULL, NULL, NULL,
+- "nf_ct_icmpv6: ICMPv6 checksum failed ");
++ nf_log_packet(PF_INET6, 0, skb, NULL, NULL, NULL,
++ "nf_ct_icmpv6: ICMPv6 checksum failed\n");
+ return -NF_ACCEPT;
+ }
+
+- type = icmp6h->icmp6_type - 130;
+- if (type >= 0 && type < sizeof(noct_valid_new) &&
+- noct_valid_new[type]) {
+- skb->nfct = &nf_conntrack_untracked.ct_general;
+- skb->nfctinfo = IP_CT_NEW;
+- nf_conntrack_get(skb->nfct);
+- return NF_ACCEPT;
+- }
+-
+ /* is not error message ? */
+ if (icmp6h->icmp6_type >= 128)
+ return NF_ACCEPT;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv6/netfilter/nf_conntrack_reasm.c linux-2.6.29-rc3.owrt/net/ipv6/netfilter/nf_conntrack_reasm.c
+--- linux-2.6.29.owrt/net/ipv6/netfilter/nf_conntrack_reasm.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv6/netfilter/nf_conntrack_reasm.c 2009-05-10 23:48:34.000000000 +0200
+@@ -528,14 +528,14 @@
+ if (!ipv6_ext_hdr(nexthdr)) {
+ return -1;
+ }
+- if (nexthdr == NEXTHDR_NONE) {
+- pr_debug("next header is none\n");
+- return -1;
+- }
+ if (len < (int)sizeof(struct ipv6_opt_hdr)) {
+ pr_debug("too short\n");
+ return -1;
+ }
++ if (nexthdr == NEXTHDR_NONE) {
++ pr_debug("next header is none\n");
++ return -1;
++ }
+ if (skb_copy_bits(skb, start, &hdr, sizeof(hdr)))
+ BUG();
+ if (nexthdr == NEXTHDR_AUTH)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv6/reassembly.c linux-2.6.29-rc3.owrt/net/ipv6/reassembly.c
+--- linux-2.6.29.owrt/net/ipv6/reassembly.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv6/reassembly.c 2009-05-10 23:48:34.000000000 +0200
+@@ -452,7 +452,6 @@
+ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev,
+ struct net_device *dev)
+ {
+- struct net *net = container_of(fq->q.net, struct net, ipv6.frags);
+ struct sk_buff *fp, *head = fq->q.fragments;
+ int payload_len;
+ unsigned int nhoff;
+@@ -552,7 +551,8 @@
+ head->csum);
+
+ rcu_read_lock();
+- IP6_INC_STATS_BH(net, __in6_dev_get(dev), IPSTATS_MIB_REASMOKS);
++ IP6_INC_STATS_BH(dev_net(dev),
++ __in6_dev_get(dev), IPSTATS_MIB_REASMOKS);
+ rcu_read_unlock();
+ fq->q.fragments = NULL;
+ return 1;
+@@ -566,7 +566,8 @@
+ printk(KERN_DEBUG "ip6_frag_reasm: no memory for reassembly\n");
+ out_fail:
+ rcu_read_lock();
+- IP6_INC_STATS_BH(net, __in6_dev_get(dev), IPSTATS_MIB_REASMFAILS);
++ IP6_INC_STATS_BH(dev_net(dev),
++ __in6_dev_get(dev), IPSTATS_MIB_REASMFAILS);
+ rcu_read_unlock();
+ return -1;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv6/route.c linux-2.6.29-rc3.owrt/net/ipv6/route.c
+--- linux-2.6.29.owrt/net/ipv6/route.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv6/route.c 2009-05-10 23:48:34.000000000 +0200
+@@ -794,7 +794,7 @@
+ .proto = iph->nexthdr,
+ };
+
+- if (rt6_need_strict(&iph->daddr) && skb->dev->type != ARPHRD_PIMREG)
++ if (rt6_need_strict(&iph->daddr))
+ flags |= RT6_LOOKUP_F_IFACE;
+
+ skb->dst = fib6_rule_lookup(net, &fl, flags, ip6_pol_route_input);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/ipv6/sit.c linux-2.6.29-rc3.owrt/net/ipv6/sit.c
+--- linux-2.6.29.owrt/net/ipv6/sit.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/ipv6/sit.c 2009-05-10 23:48:34.000000000 +0200
+@@ -188,9 +188,9 @@
+ }
+
+ nt = netdev_priv(dev);
++ ipip6_tunnel_init(dev);
+
+ nt->parms = *parms;
+- ipip6_tunnel_init(dev);
+
+ if (parms->i_flags & SIT_ISATAP)
+ dev->priv_flags |= IFF_ISATAP;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/mac80211/tx.c linux-2.6.29-rc3.owrt/net/mac80211/tx.c
+--- linux-2.6.29.owrt/net/mac80211/tx.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/mac80211/tx.c 2009-05-10 23:48:34.000000000 +0200
+@@ -752,8 +752,6 @@
+ skb_copy_queue_mapping(frag, first);
+
+ frag->do_not_encrypt = first->do_not_encrypt;
+- frag->dev = first->dev;
+- frag->iif = first->iif;
+
+ pos += copylen;
+ left -= copylen;
+@@ -1345,8 +1343,6 @@
+ list) {
+ if (!netif_running(sdata->dev))
+ continue;
+- if (sdata->vif.type != NL80211_IFTYPE_AP)
+- continue;
+ if (compare_ether_addr(sdata->dev->dev_addr,
+ hdr->addr2)) {
+ dev_hold(sdata->dev);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/netfilter/nf_conntrack_core.c linux-2.6.29-rc3.owrt/net/netfilter/nf_conntrack_core.c
+--- linux-2.6.29.owrt/net/netfilter/nf_conntrack_core.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/netfilter/nf_conntrack_core.c 2009-05-10 23:48:34.000000000 +0200
+@@ -734,7 +734,7 @@
+ NF_CT_ASSERT(skb->nfct);
+
+ ret = l4proto->packet(ct, skb, dataoff, ctinfo, pf, hooknum);
+- if (ret <= 0) {
++ if (ret < 0) {
+ /* Invalid: inverse of the return code tells
+ * the netfilter core what to do */
+ pr_debug("nf_conntrack_in: Can't track with proto module\n");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/netfilter/nf_conntrack_netlink.c linux-2.6.29-rc3.owrt/net/netfilter/nf_conntrack_netlink.c
+--- linux-2.6.29.owrt/net/netfilter/nf_conntrack_netlink.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/netfilter/nf_conntrack_netlink.c 2009-05-10 23:48:34.000000000 +0200
+@@ -434,7 +434,7 @@
+ } else
+ return NOTIFY_DONE;
+
+- if (!item->report && !nfnetlink_has_listeners(group))
++ if (!nfnetlink_has_listeners(group))
+ return NOTIFY_DONE;
+
+ skb = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
+@@ -1215,16 +1215,6 @@
+ }
+ }
+
+-#ifdef CONFIG_NF_NAT_NEEDED
+- if (cda[CTA_NAT_SEQ_ADJ_ORIG] || cda[CTA_NAT_SEQ_ADJ_REPLY]) {
+- err = ctnetlink_change_nat_seq_adj(ct, cda);
+- if (err < 0) {
+- rcu_read_unlock();
+- goto err;
+- }
+- }
+-#endif
+-
+ if (cda[CTA_PROTOINFO]) {
+ err = ctnetlink_change_protoinfo(ct, cda);
+ if (err < 0) {
+@@ -1502,8 +1492,7 @@
+ } else
+ return NOTIFY_DONE;
+
+- if (!item->report &&
+- !nfnetlink_has_listeners(NFNLGRP_CONNTRACK_EXP_NEW))
++ if (!nfnetlink_has_listeners(NFNLGRP_CONNTRACK_EXP_NEW))
+ return NOTIFY_DONE;
+
+ skb = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
+@@ -1780,7 +1769,6 @@
+ goto out;
+ }
+
+- exp->class = 0;
+ exp->expectfn = NULL;
+ exp->flags = 0;
+ exp->master = ct;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/netfilter/nf_conntrack_proto_tcp.c linux-2.6.29-rc3.owrt/net/netfilter/nf_conntrack_proto_tcp.c
+--- linux-2.6.29.owrt/net/netfilter/nf_conntrack_proto_tcp.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/netfilter/nf_conntrack_proto_tcp.c 2009-05-10 23:48:34.000000000 +0200
+@@ -859,7 +859,7 @@
+ */
+ if (nf_ct_kill(ct))
+ return -NF_REPEAT;
+- return NF_DROP;
++ return -NF_DROP;
+ }
+ /* Fall through */
+ case TCP_CONNTRACK_IGNORE:
+@@ -892,7 +892,7 @@
+ nf_log_packet(pf, 0, skb, NULL, NULL, NULL,
+ "nf_ct_tcp: killing out of sync session ");
+ nf_ct_kill(ct);
+- return NF_DROP;
++ return -NF_DROP;
+ }
+ ct->proto.tcp.last_index = index;
+ ct->proto.tcp.last_dir = dir;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/netfilter/nfnetlink_log.c linux-2.6.29-rc3.owrt/net/netfilter/nfnetlink_log.c
+--- linux-2.6.29.owrt/net/netfilter/nfnetlink_log.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/netfilter/nfnetlink_log.c 2009-05-10 23:48:34.000000000 +0200
+@@ -39,7 +39,7 @@
+ #endif
+
+ #define NFULNL_NLBUFSIZ_DEFAULT NLMSG_GOODSIZE
+-#define NFULNL_TIMEOUT_DEFAULT 100 /* every second */
++#define NFULNL_TIMEOUT_DEFAULT HZ /* every second */
+ #define NFULNL_QTHRESH_DEFAULT 100 /* 100 packets */
+ #define NFULNL_COPY_RANGE_MAX 0xFFFF /* max packet size is limited by 16-bit struct nfattr nfa_len field */
+
+@@ -590,10 +590,8 @@
+
+ qthreshold = inst->qthreshold;
+ /* per-rule qthreshold overrides per-instance */
+- if (li->u.ulog.qthreshold)
+- if (qthreshold > li->u.ulog.qthreshold)
+- qthreshold = li->u.ulog.qthreshold;
+-
++ if (qthreshold > li->u.ulog.qthreshold)
++ qthreshold = li->u.ulog.qthreshold;
+
+ switch (inst->copy_mode) {
+ case NFULNL_COPY_META:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/netfilter/x_tables.c linux-2.6.29-rc3.owrt/net/netfilter/x_tables.c
+--- linux-2.6.29.owrt/net/netfilter/x_tables.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/netfilter/x_tables.c 2009-05-10 23:48:34.000000000 +0200
+@@ -827,143 +827,59 @@
+ .release = seq_release_net,
+ };
+
+-/*
+- * Traverse state for ip{,6}_{tables,matches} for helping crossing
+- * the multi-AF mutexes.
+- */
+-struct nf_mttg_trav {
+- struct list_head *head, *curr;
+- uint8_t class, nfproto;
+-};
+-
+-enum {
+- MTTG_TRAV_INIT,
+- MTTG_TRAV_NFP_UNSPEC,
+- MTTG_TRAV_NFP_SPEC,
+- MTTG_TRAV_DONE,
+-};
+-
+-static void *xt_mttg_seq_next(struct seq_file *seq, void *v, loff_t *ppos,
+- bool is_target)
+-{
+- static const uint8_t next_class[] = {
+- [MTTG_TRAV_NFP_UNSPEC] = MTTG_TRAV_NFP_SPEC,
+- [MTTG_TRAV_NFP_SPEC] = MTTG_TRAV_DONE,
+- };
+- struct nf_mttg_trav *trav = seq->private;
+-
+- switch (trav->class) {
+- case MTTG_TRAV_INIT:
+- trav->class = MTTG_TRAV_NFP_UNSPEC;
+- mutex_lock(&xt[NFPROTO_UNSPEC].mutex);
+- trav->head = trav->curr = is_target ?
+- &xt[NFPROTO_UNSPEC].target : &xt[NFPROTO_UNSPEC].match;
+- break;
+- case MTTG_TRAV_NFP_UNSPEC:
+- trav->curr = trav->curr->next;
+- if (trav->curr != trav->head)
+- break;
+- mutex_unlock(&xt[NFPROTO_UNSPEC].mutex);
+- mutex_lock(&xt[trav->nfproto].mutex);
+- trav->head = trav->curr = is_target ?
+- &xt[trav->nfproto].target : &xt[trav->nfproto].match;
+- trav->class = next_class[trav->class];
+- break;
+- case MTTG_TRAV_NFP_SPEC:
+- trav->curr = trav->curr->next;
+- if (trav->curr != trav->head)
+- break;
+- /* fallthru, _stop will unlock */
+- default:
+- return NULL;
+- }
+-
+- if (ppos != NULL)
+- ++*ppos;
+- return trav;
+-}
+-
+-static void *xt_mttg_seq_start(struct seq_file *seq, loff_t *pos,
+- bool is_target)
++static void *xt_match_seq_start(struct seq_file *seq, loff_t *pos)
+ {
+- struct nf_mttg_trav *trav = seq->private;
+- unsigned int j;
++ struct proc_dir_entry *pde = (struct proc_dir_entry *)seq->private;
++ u_int16_t af = (unsigned long)pde->data;
+
+- trav->class = MTTG_TRAV_INIT;
+- for (j = 0; j < *pos; ++j)
+- if (xt_mttg_seq_next(seq, NULL, NULL, is_target) == NULL)
+- return NULL;
+- return trav;
++ mutex_lock(&xt[af].mutex);
++ return seq_list_start(&xt[af].match, *pos);
+ }
+
+-static void xt_mttg_seq_stop(struct seq_file *seq, void *v)
++static void *xt_match_seq_next(struct seq_file *seq, void *v, loff_t *pos)
+ {
+- struct nf_mttg_trav *trav = seq->private;
++ struct proc_dir_entry *pde = (struct proc_dir_entry *)seq->private;
++ u_int16_t af = (unsigned long)pde->data;
+
+- switch (trav->class) {
+- case MTTG_TRAV_NFP_UNSPEC:
+- mutex_unlock(&xt[NFPROTO_UNSPEC].mutex);
+- break;
+- case MTTG_TRAV_NFP_SPEC:
+- mutex_unlock(&xt[trav->nfproto].mutex);
+- break;
+- }
++ return seq_list_next(v, &xt[af].match, pos);
+ }
+
+-static void *xt_match_seq_start(struct seq_file *seq, loff_t *pos)
++static void xt_match_seq_stop(struct seq_file *seq, void *v)
+ {
+- return xt_mttg_seq_start(seq, pos, false);
+-}
++ struct proc_dir_entry *pde = seq->private;
++ u_int16_t af = (unsigned long)pde->data;
+
+-static void *xt_match_seq_next(struct seq_file *seq, void *v, loff_t *ppos)
+-{
+- return xt_mttg_seq_next(seq, v, ppos, false);
++ mutex_unlock(&xt[af].mutex);
+ }
+
+ static int xt_match_seq_show(struct seq_file *seq, void *v)
+ {
+- const struct nf_mttg_trav *trav = seq->private;
+- const struct xt_match *match;
++ struct xt_match *match = list_entry(v, struct xt_match, list);
+
+- switch (trav->class) {
+- case MTTG_TRAV_NFP_UNSPEC:
+- case MTTG_TRAV_NFP_SPEC:
+- if (trav->curr == trav->head)
+- return 0;
+- match = list_entry(trav->curr, struct xt_match, list);
+- return (*match->name == '\0') ? 0 :
+- seq_printf(seq, "%s\n", match->name);
+- }
+- return 0;
++ if (strlen(match->name))
++ return seq_printf(seq, "%s\n", match->name);
++ else
++ return 0;
+ }
+
+ static const struct seq_operations xt_match_seq_ops = {
+ .start = xt_match_seq_start,
+ .next = xt_match_seq_next,
+- .stop = xt_mttg_seq_stop,
++ .stop = xt_match_seq_stop,
+ .show = xt_match_seq_show,
+ };
+
+ static int xt_match_open(struct inode *inode, struct file *file)
+ {
+- struct seq_file *seq;
+- struct nf_mttg_trav *trav;
+ int ret;
+
+- trav = kmalloc(sizeof(*trav), GFP_KERNEL);
+- if (trav == NULL)
+- return -ENOMEM;
+-
+ ret = seq_open(file, &xt_match_seq_ops);
+- if (ret < 0) {
+- kfree(trav);
+- return ret;
+- }
++ if (!ret) {
++ struct seq_file *seq = file->private_data;
+
+- seq = file->private_data;
+- seq->private = trav;
+- trav->nfproto = (unsigned long)PDE(inode)->data;
+- return 0;
++ seq->private = PDE(inode);
++ }
++ return ret;
+ }
+
+ static const struct file_operations xt_match_ops = {
+@@ -971,63 +887,62 @@
+ .open = xt_match_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+- .release = seq_release_private,
++ .release = seq_release,
+ };
+
+ static void *xt_target_seq_start(struct seq_file *seq, loff_t *pos)
+ {
+- return xt_mttg_seq_start(seq, pos, true);
++ struct proc_dir_entry *pde = (struct proc_dir_entry *)seq->private;
++ u_int16_t af = (unsigned long)pde->data;
++
++ mutex_lock(&xt[af].mutex);
++ return seq_list_start(&xt[af].target, *pos);
+ }
+
+-static void *xt_target_seq_next(struct seq_file *seq, void *v, loff_t *ppos)
++static void *xt_target_seq_next(struct seq_file *seq, void *v, loff_t *pos)
+ {
+- return xt_mttg_seq_next(seq, v, ppos, true);
++ struct proc_dir_entry *pde = (struct proc_dir_entry *)seq->private;
++ u_int16_t af = (unsigned long)pde->data;
++
++ return seq_list_next(v, &xt[af].target, pos);
++}
++
++static void xt_target_seq_stop(struct seq_file *seq, void *v)
++{
++ struct proc_dir_entry *pde = seq->private;
++ u_int16_t af = (unsigned long)pde->data;
++
++ mutex_unlock(&xt[af].mutex);
+ }
+
+ static int xt_target_seq_show(struct seq_file *seq, void *v)
+ {
+- const struct nf_mttg_trav *trav = seq->private;
+- const struct xt_target *target;
++ struct xt_target *target = list_entry(v, struct xt_target, list);
+
+- switch (trav->class) {
+- case MTTG_TRAV_NFP_UNSPEC:
+- case MTTG_TRAV_NFP_SPEC:
+- if (trav->curr == trav->head)
+- return 0;
+- target = list_entry(trav->curr, struct xt_target, list);
+- return (*target->name == '\0') ? 0 :
+- seq_printf(seq, "%s\n", target->name);
+- }
+- return 0;
++ if (strlen(target->name))
++ return seq_printf(seq, "%s\n", target->name);
++ else
++ return 0;
+ }
+
+ static const struct seq_operations xt_target_seq_ops = {
+ .start = xt_target_seq_start,
+ .next = xt_target_seq_next,
+- .stop = xt_mttg_seq_stop,
++ .stop = xt_target_seq_stop,
+ .show = xt_target_seq_show,
+ };
+
+ static int xt_target_open(struct inode *inode, struct file *file)
+ {
+- struct seq_file *seq;
+- struct nf_mttg_trav *trav;
+ int ret;
+
+- trav = kmalloc(sizeof(*trav), GFP_KERNEL);
+- if (trav == NULL)
+- return -ENOMEM;
+-
+ ret = seq_open(file, &xt_target_seq_ops);
+- if (ret < 0) {
+- kfree(trav);
+- return ret;
+- }
++ if (!ret) {
++ struct seq_file *seq = file->private_data;
+
+- seq = file->private_data;
+- seq->private = trav;
+- trav->nfproto = (unsigned long)PDE(inode)->data;
+- return 0;
++ seq->private = PDE(inode);
++ }
++ return ret;
+ }
+
+ static const struct file_operations xt_target_ops = {
+@@ -1035,7 +950,7 @@
+ .open = xt_target_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+- .release = seq_release_private,
++ .release = seq_release,
+ };
+
+ #define FORMAT_TABLES "_tables_names"
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/netfilter/xt_recent.c linux-2.6.29-rc3.owrt/net/netfilter/xt_recent.c
+--- linux-2.6.29.owrt/net/netfilter/xt_recent.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/netfilter/xt_recent.c 2009-05-10 23:48:34.000000000 +0200
+@@ -542,7 +542,7 @@
+ struct recent_entry *e;
+ char buf[sizeof("+b335:1d35:1e55:dead:c0de:1715:5afe:c0de")];
+ const char *c = buf;
+- union nf_inet_addr addr = {};
++ union nf_inet_addr addr;
+ u_int16_t family;
+ bool add, succ;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/netfilter/xt_sctp.c linux-2.6.29-rc3.owrt/net/netfilter/xt_sctp.c
+--- linux-2.6.29.owrt/net/netfilter/xt_sctp.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/netfilter/xt_sctp.c 2009-05-10 23:48:34.000000000 +0200
+@@ -105,7 +105,7 @@
+
+ switch (chunk_match_type) {
+ case SCTP_CHUNK_MATCH_ALL:
+- return SCTP_CHUNKMAP_IS_CLEAR(chunkmapcopy);
++ return SCTP_CHUNKMAP_IS_CLEAR(info->chunkmap);
+ case SCTP_CHUNK_MATCH_ANY:
+ return false;
+ case SCTP_CHUNK_MATCH_ONLY:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/netlink/af_netlink.c linux-2.6.29-rc3.owrt/net/netlink/af_netlink.c
+--- linux-2.6.29.owrt/net/netlink/af_netlink.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/netlink/af_netlink.c 2009-05-10 23:48:34.000000000 +0200
+@@ -1084,13 +1084,6 @@
+ return 0;
+ }
+
+-/**
+- * netlink_set_err - report error to broadcast listeners
+- * @ssk: the kernel netlink socket, as returned by netlink_kernel_create()
+- * @pid: the PID of a process that we want to skip (if any)
+- * @groups: the broadcast group that will notice the error
+- * @code: error code, must be negative (as usual in kernelspace)
+- */
+ void netlink_set_err(struct sock *ssk, u32 pid, u32 group, int code)
+ {
+ struct netlink_set_err_data info;
+@@ -1100,8 +1093,7 @@
+ info.exclude_sk = ssk;
+ info.pid = pid;
+ info.group = group;
+- /* sk->sk_err wants a positive error value */
+- info.code = -code;
++ info.code = code;
+
+ read_lock(&nl_table_lock);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/packet/af_packet.c linux-2.6.29-rc3.owrt/net/packet/af_packet.c
+--- linux-2.6.29.owrt/net/packet/af_packet.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/packet/af_packet.c 2009-05-10 23:48:34.000000000 +0200
+@@ -77,7 +77,6 @@
+ #include <linux/poll.h>
+ #include <linux/module.h>
+ #include <linux/init.h>
+-#include <linux/mutex.h>
+
+ #ifdef CONFIG_INET
+ #include <net/inet_common.h>
+@@ -176,7 +175,6 @@
+ #endif
+ struct packet_type prot_hook;
+ spinlock_t bind_lock;
+- struct mutex pg_vec_lock;
+ unsigned int running:1, /* prot_hook is attached*/
+ auxdata:1,
+ origdev:1;
+@@ -223,13 +221,13 @@
+ h.raw = po->pg_vec[pg_vec_pos] + (frame_offset * po->frame_size);
+ switch (po->tp_version) {
+ case TPACKET_V1:
+- if (status != (h.h1->tp_status ? TP_STATUS_USER :
+- TP_STATUS_KERNEL))
++ if (status != h.h1->tp_status ? TP_STATUS_USER :
++ TP_STATUS_KERNEL)
+ return NULL;
+ break;
+ case TPACKET_V2:
+- if (status != (h.h2->tp_status ? TP_STATUS_USER :
+- TP_STATUS_KERNEL))
++ if (status != h.h2->tp_status ? TP_STATUS_USER :
++ TP_STATUS_KERNEL)
+ return NULL;
+ break;
+ }
+@@ -1074,7 +1072,6 @@
+ */
+
+ spin_lock_init(&po->bind_lock);
+- mutex_init(&po->pg_vec_lock);
+ po->prot_hook.func = packet_rcv;
+ po->pkt_type = PACKET_MASK_ANY & ~(1 << PACKET_LOOPBACK);
+
+@@ -1889,7 +1886,6 @@
+ synchronize_net();
+
+ err = -EBUSY;
+- mutex_lock(&po->pg_vec_lock);
+ if (closing || atomic_read(&po->mapped) == 0) {
+ err = 0;
+ #define XC(a, b) ({ __typeof__ ((a)) __t; __t = (a); (a) = (b); __t; })
+@@ -1911,7 +1907,6 @@
+ if (atomic_read(&po->mapped))
+ printk(KERN_DEBUG "packet_mmap: vma is busy: %d\n", atomic_read(&po->mapped));
+ }
+- mutex_unlock(&po->pg_vec_lock);
+
+ spin_lock(&po->bind_lock);
+ if (was_running && !po->running) {
+@@ -1944,7 +1939,7 @@
+
+ size = vma->vm_end - vma->vm_start;
+
+- mutex_lock(&po->pg_vec_lock);
++ lock_sock(sk);
+ if (po->pg_vec == NULL)
+ goto out;
+ if (size != po->pg_vec_len*po->pg_vec_pages*PAGE_SIZE)
+@@ -1967,7 +1962,7 @@
+ err = 0;
+
+ out:
+- mutex_unlock(&po->pg_vec_lock);
++ release_sock(sk);
+ return err;
+ }
+ #endif
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/phonet/pep.c linux-2.6.29-rc3.owrt/net/phonet/pep.c
+--- linux-2.6.29.owrt/net/phonet/pep.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/phonet/pep.c 2009-05-10 23:48:34.000000000 +0200
+@@ -553,7 +553,7 @@
+ {
+ struct pep_sock *pn = pep_sk(sk);
+ struct sock *sknode;
+- struct pnpipehdr *hdr;
++ struct pnpipehdr *hdr = pnp_hdr(skb);
+ struct sockaddr_pn dst;
+ int err = NET_RX_SUCCESS;
+ u8 pipe_handle;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/phonet/pep-gprs.c linux-2.6.29-rc3.owrt/net/phonet/pep-gprs.c
+--- linux-2.6.29.owrt/net/phonet/pep-gprs.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/phonet/pep-gprs.c 2009-05-10 23:48:34.000000000 +0200
+@@ -207,6 +207,7 @@
+ dev->name, err);
+ dev->stats.tx_aborted_errors++;
+ dev->stats.tx_errors++;
++ dev_kfree_skb(skb);
+ } else {
+ dev->stats.tx_packets++;
+ dev->stats.tx_bytes += len;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/rxrpc/af_rxrpc.c linux-2.6.29-rc3.owrt/net/rxrpc/af_rxrpc.c
+--- linux-2.6.29.owrt/net/rxrpc/af_rxrpc.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/rxrpc/af_rxrpc.c 2009-05-10 23:48:34.000000000 +0200
+@@ -284,13 +284,13 @@
+ if (IS_ERR(trans)) {
+ call = ERR_CAST(trans);
+ trans = NULL;
+- goto out_notrans;
++ goto out;
+ }
+ } else {
+ trans = rx->trans;
+ if (!trans) {
+ call = ERR_PTR(-ENOTCONN);
+- goto out_notrans;
++ goto out;
+ }
+ atomic_inc(&trans->usage);
+ }
+@@ -315,7 +315,6 @@
+ rxrpc_put_bundle(trans, bundle);
+ out:
+ rxrpc_put_transport(trans);
+-out_notrans:
+ release_sock(&rx->sk);
+ _leave(" = %p", call);
+ return call;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/sched/act_police.c linux-2.6.29-rc3.owrt/net/sched/act_police.c
+--- linux-2.6.29.owrt/net/sched/act_police.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/sched/act_police.c 2009-05-10 23:48:34.000000000 +0200
+@@ -183,6 +183,13 @@
+ if (R_tab == NULL)
+ goto failure;
+
++ if (!est && (ret == ACT_P_CREATED ||
++ !gen_estimator_active(&police->tcf_bstats,
++ &police->tcf_rate_est))) {
++ err = -EINVAL;
++ goto failure;
++ }
++
+ if (parm->peakrate.rate) {
+ P_tab = qdisc_get_rtab(&parm->peakrate,
+ tb[TCA_POLICE_PEAKRATE]);
+@@ -198,12 +205,6 @@
+ &police->tcf_lock, est);
+ if (err)
+ goto failure_unlock;
+- } else if (tb[TCA_POLICE_AVRATE] &&
+- (ret == ACT_P_CREATED ||
+- !gen_estimator_active(&police->tcf_bstats,
+- &police->tcf_rate_est))) {
+- err = -EINVAL;
+- goto failure_unlock;
+ }
+
+ /* No failure allowed after this point */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/sched/sch_drr.c linux-2.6.29-rc3.owrt/net/sched/sch_drr.c
+--- linux-2.6.29.owrt/net/sched/sch_drr.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/sched/sch_drr.c 2009-05-10 23:48:34.000000000 +0200
+@@ -66,15 +66,11 @@
+ {
+ struct drr_sched *q = qdisc_priv(sch);
+ struct drr_class *cl = (struct drr_class *)*arg;
+- struct nlattr *opt = tca[TCA_OPTIONS];
+ struct nlattr *tb[TCA_DRR_MAX + 1];
+ u32 quantum;
+ int err;
+
+- if (!opt)
+- return -EINVAL;
+-
+- err = nla_parse_nested(tb, TCA_DRR_MAX, opt, drr_policy);
++ err = nla_parse_nested(tb, TCA_DRR_MAX, tca[TCA_OPTIONS], drr_policy);
+ if (err < 0)
+ return err;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/sctp/endpointola.c linux-2.6.29-rc3.owrt/net/sctp/endpointola.c
+--- linux-2.6.29.owrt/net/sctp/endpointola.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/sctp/endpointola.c 2009-05-10 23:48:34.000000000 +0200
+@@ -111,8 +111,7 @@
+ if (sctp_addip_enable) {
+ auth_chunks->chunks[0] = SCTP_CID_ASCONF;
+ auth_chunks->chunks[1] = SCTP_CID_ASCONF_ACK;
+- auth_chunks->param_hdr.length =
+- htons(sizeof(sctp_paramhdr_t) + 2);
++ auth_chunks->param_hdr.length += htons(2);
+ }
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/sctp/protocol.c linux-2.6.29-rc3.owrt/net/sctp/protocol.c
+--- linux-2.6.29.owrt/net/sctp/protocol.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/sctp/protocol.c 2009-05-10 23:48:34.000000000 +0200
+@@ -717,20 +717,15 @@
+ static int sctp_ctl_sock_init(void)
+ {
+ int err;
+- sa_family_t family = PF_INET;
++ sa_family_t family;
+
+ if (sctp_get_pf_specific(PF_INET6))
+ family = PF_INET6;
++ else
++ family = PF_INET;
+
+ err = inet_ctl_sock_create(&sctp_ctl_sock, family,
+ SOCK_SEQPACKET, IPPROTO_SCTP, &init_net);
+-
+- /* If IPv6 socket could not be created, try the IPv4 socket */
+- if (err < 0 && family == PF_INET6)
+- err = inet_ctl_sock_create(&sctp_ctl_sock, AF_INET,
+- SOCK_SEQPACKET, IPPROTO_SCTP,
+- &init_net);
+-
+ if (err < 0) {
+ printk(KERN_ERR
+ "SCTP: Failed to create the SCTP control socket.\n");
+@@ -1327,8 +1322,9 @@
+ out:
+ return status;
+ err_v6_add_protocol:
+- sctp_v4_del_protocol();
++ sctp_v6_del_protocol();
+ err_add_protocol:
++ sctp_v4_del_protocol();
+ inet_ctl_sock_destroy(sctp_ctl_sock);
+ err_ctl_sock_init:
+ sctp_v6_protosw_exit();
+@@ -1339,6 +1335,7 @@
+ sctp_v4_pf_exit();
+ sctp_v6_pf_exit();
+ sctp_sysctl_unregister();
++ list_del(&sctp_af_inet.list);
+ free_pages((unsigned long)sctp_port_hashtable,
+ get_order(sctp_port_hashsize *
+ sizeof(struct sctp_bind_hashbucket)));
+@@ -1386,6 +1383,7 @@
+ sctp_v4_pf_exit();
+
+ sctp_sysctl_unregister();
++ list_del(&sctp_af_inet.list);
+
+ free_pages((unsigned long)sctp_assoc_hashtable,
+ get_order(sctp_assoc_hashsize *
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/sctp/sm_sideeffect.c linux-2.6.29-rc3.owrt/net/sctp/sm_sideeffect.c
+--- linux-2.6.29.owrt/net/sctp/sm_sideeffect.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/sctp/sm_sideeffect.c 2009-05-10 23:48:34.000000000 +0200
+@@ -787,48 +787,36 @@
+ struct sctp_association *asoc,
+ struct sctp_chunk *chunk)
+ {
++ struct sctp_operr_chunk *operr_chunk;
+ struct sctp_errhdr *err_hdr;
+- struct sctp_ulpevent *ev;
+-
+- while (chunk->chunk_end > chunk->skb->data) {
+- err_hdr = (struct sctp_errhdr *)(chunk->skb->data);
+
+- ev = sctp_ulpevent_make_remote_error(asoc, chunk, 0,
+- GFP_ATOMIC);
+- if (!ev)
+- return;
+-
+- sctp_ulpq_tail_event(&asoc->ulpq, ev);
++ operr_chunk = (struct sctp_operr_chunk *)chunk->chunk_hdr;
++ err_hdr = &operr_chunk->err_hdr;
+
+- switch (err_hdr->cause) {
+- case SCTP_ERROR_UNKNOWN_CHUNK:
+- {
+- sctp_chunkhdr_t *unk_chunk_hdr;
+-
+- unk_chunk_hdr = (sctp_chunkhdr_t *)err_hdr->variable;
+- switch (unk_chunk_hdr->type) {
+- /* ADDIP 4.1 A9) If the peer responds to an ASCONF with
+- * an ERROR chunk reporting that it did not recognized
+- * the ASCONF chunk type, the sender of the ASCONF MUST
+- * NOT send any further ASCONF chunks and MUST stop its
+- * T-4 timer.
+- */
+- case SCTP_CID_ASCONF:
+- if (asoc->peer.asconf_capable == 0)
+- break;
+-
+- asoc->peer.asconf_capable = 0;
+- sctp_add_cmd_sf(cmds, SCTP_CMD_TIMER_STOP,
++ switch (err_hdr->cause) {
++ case SCTP_ERROR_UNKNOWN_CHUNK:
++ {
++ struct sctp_chunkhdr *unk_chunk_hdr;
++
++ unk_chunk_hdr = (struct sctp_chunkhdr *)err_hdr->variable;
++ switch (unk_chunk_hdr->type) {
++ /* ADDIP 4.1 A9) If the peer responds to an ASCONF with an
++ * ERROR chunk reporting that it did not recognized the ASCONF
++ * chunk type, the sender of the ASCONF MUST NOT send any
++ * further ASCONF chunks and MUST stop its T-4 timer.
++ */
++ case SCTP_CID_ASCONF:
++ asoc->peer.asconf_capable = 0;
++ sctp_add_cmd_sf(cmds, SCTP_CMD_TIMER_STOP,
+ SCTP_TO(SCTP_EVENT_TIMEOUT_T4_RTO));
+- break;
+- default:
+- break;
+- }
+ break;
+- }
+ default:
+ break;
+ }
++ break;
++ }
++ default:
++ break;
+ }
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/sctp/sm_statefuns.c linux-2.6.29-rc3.owrt/net/sctp/sm_statefuns.c
+--- linux-2.6.29.owrt/net/sctp/sm_statefuns.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/sctp/sm_statefuns.c 2009-05-10 23:48:34.000000000 +0200
+@@ -3163,6 +3163,7 @@
+ sctp_cmd_seq_t *commands)
+ {
+ struct sctp_chunk *chunk = arg;
++ struct sctp_ulpevent *ev;
+
+ if (!sctp_vtag_verify(chunk, asoc))
+ return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
+@@ -3172,10 +3173,21 @@
+ return sctp_sf_violation_chunklen(ep, asoc, type, arg,
+ commands);
+
+- sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_OPERR,
+- SCTP_CHUNK(chunk));
++ while (chunk->chunk_end > chunk->skb->data) {
++ ev = sctp_ulpevent_make_remote_error(asoc, chunk, 0,
++ GFP_ATOMIC);
++ if (!ev)
++ goto nomem;
+
++ sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP,
++ SCTP_ULPEVENT(ev));
++ sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_OPERR,
++ SCTP_CHUNK(chunk));
++ }
+ return SCTP_DISPOSITION_CONSUME;
++
++nomem:
++ return SCTP_DISPOSITION_NOMEM;
+ }
+
+ /*
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/sunrpc/Kconfig linux-2.6.29-rc3.owrt/net/sunrpc/Kconfig
+--- linux-2.6.29.owrt/net/sunrpc/Kconfig 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/sunrpc/Kconfig 2009-05-10 23:48:34.000000000 +0200
+@@ -6,7 +6,7 @@
+
+ config SUNRPC_XPRT_RDMA
+ tristate
+- depends on SUNRPC && INFINIBAND && INFINIBAND_ADDR_TRANS && EXPERIMENTAL
++ depends on SUNRPC && INFINIBAND && EXPERIMENTAL
+ default SUNRPC && INFINIBAND
+ help
+ This option allows the NFS client and server to support
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/sunrpc/sched.c linux-2.6.29-rc3.owrt/net/sunrpc/sched.c
+--- linux-2.6.29.owrt/net/sunrpc/sched.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/sunrpc/sched.c 2009-05-10 23:48:34.000000000 +0200
+@@ -293,6 +293,11 @@
+ rpc_clear_queued(task);
+ if (rpc_test_and_set_running(task))
+ return;
++ /* We might have raced */
++ if (RPC_IS_QUEUED(task)) {
++ rpc_clear_running(task);
++ return;
++ }
+ if (RPC_IS_ASYNC(task)) {
+ int status;
+
+@@ -602,9 +607,7 @@
+ */
+ static void __rpc_execute(struct rpc_task *task)
+ {
+- struct rpc_wait_queue *queue;
+- int task_is_async = RPC_IS_ASYNC(task);
+- int status = 0;
++ int status = 0;
+
+ dprintk("RPC: %5u __rpc_execute flags=0x%x\n",
+ task->tk_pid, task->tk_flags);
+@@ -644,25 +647,15 @@
+ */
+ if (!RPC_IS_QUEUED(task))
+ continue;
+- /*
+- * The queue->lock protects against races with
+- * rpc_make_runnable().
+- *
+- * Note that once we clear RPC_TASK_RUNNING on an asynchronous
+- * rpc_task, rpc_make_runnable() can assign it to a
+- * different workqueue. We therefore cannot assume that the
+- * rpc_task pointer may still be dereferenced.
+- */
+- queue = task->tk_waitqueue;
+- spin_lock_bh(&queue->lock);
+- if (!RPC_IS_QUEUED(task)) {
+- spin_unlock_bh(&queue->lock);
++ rpc_clear_running(task);
++ if (RPC_IS_ASYNC(task)) {
++ /* Careful! we may have raced... */
++ if (RPC_IS_QUEUED(task))
++ return;
++ if (rpc_test_and_set_running(task))
++ return;
+ continue;
+ }
+- rpc_clear_running(task);
+- spin_unlock_bh(&queue->lock);
+- if (task_is_async)
+- return;
+
+ /* sync task: sleep here */
+ dprintk("RPC: %5u sync task going to sleep\n", task->tk_pid);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/sunrpc/xprt.c linux-2.6.29-rc3.owrt/net/sunrpc/xprt.c
+--- linux-2.6.29.owrt/net/sunrpc/xprt.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/sunrpc/xprt.c 2009-05-10 23:48:34.000000000 +0200
+@@ -663,7 +663,7 @@
+ xprt, (xprt_connected(xprt) ? "is" : "is not"));
+
+ if (!xprt_bound(xprt)) {
+- task->tk_status = -EAGAIN;
++ task->tk_status = -EIO;
+ return;
+ }
+ if (!xprt_lock_write(xprt, task))
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/sunrpc/xprtsock.c linux-2.6.29-rc3.owrt/net/sunrpc/xprtsock.c
+--- linux-2.6.29.owrt/net/sunrpc/xprtsock.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/sunrpc/xprtsock.c 2009-05-10 23:48:34.000000000 +0200
+@@ -467,7 +467,7 @@
+ int err, sent = 0;
+
+ if (unlikely(!sock))
+- return -ENOTSOCK;
++ return -ENOTCONN;
+
+ clear_bit(SOCK_ASYNC_NOSPACE, &sock->flags);
+ if (base != 0) {
+@@ -577,8 +577,6 @@
+ req->rq_svec->iov_base,
+ req->rq_svec->iov_len);
+
+- if (!xprt_bound(xprt))
+- return -ENOTCONN;
+ status = xs_sendpages(transport->sock,
+ xs_addr(xprt),
+ xprt->addrlen, xdr,
+@@ -596,10 +594,6 @@
+ }
+
+ switch (status) {
+- case -ENOTSOCK:
+- status = -ENOTCONN;
+- /* Should we call xs_close() here? */
+- break;
+ case -EAGAIN:
+ xs_nospace(task);
+ break;
+@@ -699,10 +693,6 @@
+ }
+
+ switch (status) {
+- case -ENOTSOCK:
+- status = -ENOTCONN;
+- /* Should we call xs_close() here? */
+- break;
+ case -EAGAIN:
+ xs_nospace(task);
+ break;
+@@ -1533,7 +1523,7 @@
+ struct socket *sock = transport->sock;
+ int err, status = -EIO;
+
+- if (xprt->shutdown)
++ if (xprt->shutdown || !xprt_bound(xprt))
+ goto out;
+
+ /* Start by resetting any existing state */
+@@ -1574,7 +1564,7 @@
+ struct socket *sock = transport->sock;
+ int err, status = -EIO;
+
+- if (xprt->shutdown)
++ if (xprt->shutdown || !xprt_bound(xprt))
+ goto out;
+
+ /* Start by resetting any existing state */
+@@ -1658,9 +1648,6 @@
+ write_unlock_bh(&sk->sk_callback_lock);
+ }
+
+- if (!xprt_bound(xprt))
+- return -ENOTCONN;
+-
+ /* Tell the socket layer to start connecting... */
+ xprt->stat.connect_count++;
+ xprt->stat.connect_start = jiffies;
+@@ -1681,7 +1668,7 @@
+ struct socket *sock = transport->sock;
+ int err, status = -EIO;
+
+- if (xprt->shutdown)
++ if (xprt->shutdown || !xprt_bound(xprt))
+ goto out;
+
+ if (!sock) {
+@@ -1741,7 +1728,7 @@
+ struct socket *sock = transport->sock;
+ int err, status = -EIO;
+
+- if (xprt->shutdown)
++ if (xprt->shutdown || !xprt_bound(xprt))
+ goto out;
+
+ if (!sock) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/wimax/debugfs.c linux-2.6.29-rc3.owrt/net/wimax/debugfs.c
+--- linux-2.6.29.owrt/net/wimax/debugfs.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/wimax/debugfs.c 2009-05-10 23:48:34.000000000 +0200
+@@ -28,6 +28,17 @@
+ #include "debug-levels.h"
+
+
++/* Debug framework control of debug levels */
++struct d_level D_LEVEL[] = {
++ D_SUBMODULE_DEFINE(debugfs),
++ D_SUBMODULE_DEFINE(id_table),
++ D_SUBMODULE_DEFINE(op_msg),
++ D_SUBMODULE_DEFINE(op_reset),
++ D_SUBMODULE_DEFINE(op_rfkill),
++ D_SUBMODULE_DEFINE(stack),
++};
++size_t D_LEVEL_SIZE = ARRAY_SIZE(D_LEVEL);
++
+ #define __debugfs_register(prefix, name, parent) \
+ do { \
+ result = d_level_register_debugfs(prefix, name, parent); \
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/wimax/id-table.c linux-2.6.29-rc3.owrt/net/wimax/id-table.c
+--- linux-2.6.29.owrt/net/wimax/id-table.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/wimax/id-table.c 2009-05-10 23:48:34.000000000 +0200
+@@ -94,13 +94,12 @@
+ list_for_each_entry(wimax_dev, &wimax_id_table, id_table_node) {
+ if (wimax_dev->net_dev->ifindex == ifindex) {
+ dev_hold(wimax_dev->net_dev);
+- goto found;
++ break;
+ }
+ }
+- wimax_dev = NULL;
+- d_printf(1, NULL, "wimax: no devices found with ifindex %d\n",
+- ifindex);
+-found:
++ if (wimax_dev == NULL)
++ d_printf(1, NULL, "wimax: no devices found with ifindex %d\n",
++ ifindex);
+ spin_unlock(&wimax_id_table_lock);
+ d_fnend(3, NULL, "(info %p ifindex %d) = %p\n",
+ info, ifindex, wimax_dev);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/wimax/stack.c linux-2.6.29-rc3.owrt/net/wimax/stack.c
+--- linux-2.6.29.owrt/net/wimax/stack.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/wimax/stack.c 2009-05-10 23:48:34.000000000 +0200
+@@ -516,19 +516,6 @@
+ }
+ EXPORT_SYMBOL_GPL(wimax_dev_rm);
+
+-
+-/* Debug framework control of debug levels */
+-struct d_level D_LEVEL[] = {
+- D_SUBMODULE_DEFINE(debugfs),
+- D_SUBMODULE_DEFINE(id_table),
+- D_SUBMODULE_DEFINE(op_msg),
+- D_SUBMODULE_DEFINE(op_reset),
+- D_SUBMODULE_DEFINE(op_rfkill),
+- D_SUBMODULE_DEFINE(stack),
+-};
+-size_t D_LEVEL_SIZE = ARRAY_SIZE(D_LEVEL);
+-
+-
+ struct genl_family wimax_gnl_family = {
+ .id = GENL_ID_GENERATE,
+ .name = "WiMAX",
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/wireless/Kconfig linux-2.6.29-rc3.owrt/net/wireless/Kconfig
+--- linux-2.6.29.owrt/net/wireless/Kconfig 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/wireless/Kconfig 2009-05-10 23:48:34.000000000 +0200
+@@ -102,13 +102,3 @@
+
+ config LIB80211_CRYPT_TKIP
+ tristate
+-
+-config LIB80211_DEBUG
+- bool "lib80211 debugging messages"
+- depends on LIB80211
+- default n
+- ---help---
+- You can enable this if you want verbose debugging messages
+- from lib80211.
+-
+- If unsure, say N.
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/wireless/lib80211_crypt_ccmp.c linux-2.6.29-rc3.owrt/net/wireless/lib80211_crypt_ccmp.c
+--- linux-2.6.29.owrt/net/wireless/lib80211_crypt_ccmp.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/wireless/lib80211_crypt_ccmp.c 2009-05-10 23:48:34.000000000 +0200
+@@ -337,7 +337,6 @@
+ pos += 8;
+
+ if (ccmp_replay_check(pn, key->rx_pn)) {
+-#ifdef CONFIG_LIB80211_DEBUG
+ if (net_ratelimit()) {
+ printk(KERN_DEBUG "CCMP: replay detected: STA=%pM "
+ "previous PN %02x%02x%02x%02x%02x%02x "
+@@ -347,7 +346,6 @@
+ key->rx_pn[3], key->rx_pn[4], key->rx_pn[5],
+ pn[0], pn[1], pn[2], pn[3], pn[4], pn[5]);
+ }
+-#endif
+ key->dot11RSNAStatsCCMPReplays++;
+ return -4;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/wireless/lib80211_crypt_tkip.c linux-2.6.29-rc3.owrt/net/wireless/lib80211_crypt_tkip.c
+--- linux-2.6.29.owrt/net/wireless/lib80211_crypt_tkip.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/wireless/lib80211_crypt_tkip.c 2009-05-10 23:48:34.000000000 +0200
+@@ -465,14 +465,12 @@
+ pos += 8;
+
+ if (tkip_replay_check(iv32, iv16, tkey->rx_iv32, tkey->rx_iv16)) {
+-#ifdef CONFIG_LIB80211_DEBUG
+ if (net_ratelimit()) {
+ printk(KERN_DEBUG "TKIP: replay detected: STA=%pM"
+ " previous TSC %08x%04x received TSC "
+ "%08x%04x\n", hdr->addr2,
+ tkey->rx_iv32, tkey->rx_iv16, iv32, iv16);
+ }
+-#endif
+ tkey->dot11RSNAStatsTKIPReplays++;
+ return -4;
+ }
+@@ -507,12 +505,10 @@
+ * it needs to be recalculated for the next packet. */
+ tkey->rx_phase1_done = 0;
+ }
+-#ifdef CONFIG_LIB80211_DEBUG
+ if (net_ratelimit()) {
+ printk(KERN_DEBUG "TKIP: ICV error detected: STA="
+ "%pM\n", hdr->addr2);
+ }
+-#endif
+ tkey->dot11RSNAStatsTKIPICVErrors++;
+ return -5;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/wireless/nl80211.c linux-2.6.29-rc3.owrt/net/wireless/nl80211.c
+--- linux-2.6.29.owrt/net/wireless/nl80211.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/wireless/nl80211.c 2009-05-10 23:48:34.000000000 +0200
+@@ -1908,11 +1908,6 @@
+ if (err)
+ return err;
+
+- if (!drv->ops->get_mesh_params) {
+- err = -EOPNOTSUPP;
+- goto out;
+- }
+-
+ /* Get the mesh params */
+ rtnl_lock();
+ err = drv->ops->get_mesh_params(&drv->wiphy, dev, &cur_params);
+@@ -2022,11 +2017,6 @@
+ if (err)
+ return err;
+
+- if (!drv->ops->set_mesh_params) {
+- err = -EOPNOTSUPP;
+- goto out;
+- }
+-
+ /* This makes sure that there aren't more than 32 mesh config
+ * parameters (otherwise our bitfield scheme would not work.) */
+ BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32);
+@@ -2071,7 +2061,6 @@
+ err = drv->ops->set_mesh_params(&drv->wiphy, dev, &cfg, mask);
+ rtnl_unlock();
+
+- out:
+ /* cleanup */
+ cfg80211_put_dev(drv);
+ dev_put(dev);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/wireless/reg.c linux-2.6.29-rc3.owrt/net/wireless/reg.c
+--- linux-2.6.29.owrt/net/wireless/reg.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/wireless/reg.c 2009-05-10 23:48:34.000000000 +0200
+@@ -380,8 +380,7 @@
+
+ freq_diff = freq_range->end_freq_khz - freq_range->start_freq_khz;
+
+- if (freq_range->end_freq_khz <= freq_range->start_freq_khz ||
+- freq_range->max_bandwidth_khz > freq_diff)
++ if (freq_diff <= 0 || freq_range->max_bandwidth_khz > freq_diff)
+ return false;
+
+ return true;
+@@ -499,7 +498,6 @@
+ * calculate the number of reg rules we will need. We will need one
+ * for each channel subband */
+ while (country_ie_len >= 3) {
+- int end_channel = 0;
+ struct ieee80211_country_ie_triplet *triplet =
+ (struct ieee80211_country_ie_triplet *) country_ie;
+ int cur_sub_max_channel = 0, cur_channel = 0;
+@@ -511,25 +509,9 @@
+ continue;
+ }
+
+- /* 2 GHz */
+- if (triplet->chans.first_channel <= 14)
+- end_channel = triplet->chans.first_channel +
+- triplet->chans.num_channels;
+- else
+- /*
+- * 5 GHz -- For example in country IEs if the first
+- * channel given is 36 and the number of channels is 4
+- * then the individual channel numbers defined for the
+- * 5 GHz PHY by these parameters are: 36, 40, 44, and 48
+- * and not 36, 37, 38, 39.
+- *
+- * See: http://tinyurl.com/11d-clarification
+- */
+- end_channel = triplet->chans.first_channel +
+- (4 * (triplet->chans.num_channels - 1));
+-
+ cur_channel = triplet->chans.first_channel;
+- cur_sub_max_channel = end_channel;
++ cur_sub_max_channel = ieee80211_channel_to_frequency(
++ cur_channel + triplet->chans.num_channels);
+
+ /* Basic sanity check */
+ if (cur_sub_max_channel < cur_channel)
+@@ -608,6 +590,15 @@
+ end_channel = triplet->chans.first_channel +
+ triplet->chans.num_channels;
+ else
++ /*
++ * 5 GHz -- For example in country IEs if the first
++ * channel given is 36 and the number of channels is 4
++ * then the individual channel numbers defined for the
++ * 5 GHz PHY by these parameters are: 36, 40, 44, and 48
++ * and not 36, 37, 38, 39.
++ *
++ * See: http://tinyurl.com/11d-clarification
++ */
+ end_channel = triplet->chans.first_channel +
+ (4 * (triplet->chans.num_channels - 1));
+
+@@ -1285,7 +1276,7 @@
+ if (intersected_rd) {
+ printk(KERN_DEBUG "cfg80211: We intersect both of these "
+ "and get:\n");
+- print_regdomain_info(intersected_rd);
++ print_regdomain_info(rd);
+ return;
+ }
+ printk(KERN_DEBUG "cfg80211: Intersection between both failed\n");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/net/xfrm/xfrm_state.c linux-2.6.29-rc3.owrt/net/xfrm/xfrm_state.c
+--- linux-2.6.29.owrt/net/xfrm/xfrm_state.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/net/xfrm/xfrm_state.c 2009-05-10 23:48:34.000000000 +0200
+@@ -748,51 +748,12 @@
+ schedule_work(&net->xfrm.state_hash_work);
+ }
+
+-static void xfrm_state_look_at(struct xfrm_policy *pol, struct xfrm_state *x,
+- struct flowi *fl, unsigned short family,
+- xfrm_address_t *daddr, xfrm_address_t *saddr,
+- struct xfrm_state **best, int *acq_in_progress,
+- int *error)
+-{
+- /* Resolution logic:
+- * 1. There is a valid state with matching selector. Done.
+- * 2. Valid state with inappropriate selector. Skip.
+- *
+- * Entering area of "sysdeps".
+- *
+- * 3. If state is not valid, selector is temporary, it selects
+- * only session which triggered previous resolution. Key
+- * manager will do something to install a state with proper
+- * selector.
+- */
+- if (x->km.state == XFRM_STATE_VALID) {
+- if ((x->sel.family &&
+- !xfrm_selector_match(&x->sel, fl, x->sel.family)) ||
+- !security_xfrm_state_pol_flow_match(x, pol, fl))
+- return;
+-
+- if (!*best ||
+- (*best)->km.dying > x->km.dying ||
+- ((*best)->km.dying == x->km.dying &&
+- (*best)->curlft.add_time < x->curlft.add_time))
+- *best = x;
+- } else if (x->km.state == XFRM_STATE_ACQ) {
+- *acq_in_progress = 1;
+- } else if (x->km.state == XFRM_STATE_ERROR ||
+- x->km.state == XFRM_STATE_EXPIRED) {
+- if (xfrm_selector_match(&x->sel, fl, x->sel.family) &&
+- security_xfrm_state_pol_flow_match(x, pol, fl))
+- *error = -ESRCH;
+- }
+-}
+-
+ struct xfrm_state *
+ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,
+ struct flowi *fl, struct xfrm_tmpl *tmpl,
+ struct xfrm_policy *pol, int *err,
+ unsigned short family)
+ {
+- static xfrm_address_t saddr_wildcard = { };
+ struct net *net = xp_net(pol);
+ unsigned int h;
+ struct hlist_node *entry;
+@@ -812,27 +773,40 @@
+ xfrm_state_addr_check(x, daddr, saddr, family) &&
+ tmpl->mode == x->props.mode &&
+ tmpl->id.proto == x->id.proto &&
+- (tmpl->id.spi == x->id.spi || !tmpl->id.spi))
+- xfrm_state_look_at(pol, x, fl, family, daddr, saddr,
+- &best, &acquire_in_progress, &error);
+- }
+- if (best)
+- goto found;
+-
+- h = xfrm_dst_hash(net, daddr, &saddr_wildcard, tmpl->reqid, family);
+- hlist_for_each_entry(x, entry, net->xfrm.state_bydst+h, bydst) {
+- if (x->props.family == family &&
+- x->props.reqid == tmpl->reqid &&
+- !(x->props.flags & XFRM_STATE_WILDRECV) &&
+- xfrm_state_addr_check(x, daddr, saddr, family) &&
+- tmpl->mode == x->props.mode &&
+- tmpl->id.proto == x->id.proto &&
+- (tmpl->id.spi == x->id.spi || !tmpl->id.spi))
+- xfrm_state_look_at(pol, x, fl, family, daddr, saddr,
+- &best, &acquire_in_progress, &error);
++ (tmpl->id.spi == x->id.spi || !tmpl->id.spi)) {
++ /* Resolution logic:
++ 1. There is a valid state with matching selector.
++ Done.
++ 2. Valid state with inappropriate selector. Skip.
++
++ Entering area of "sysdeps".
++
++ 3. If state is not valid, selector is temporary,
++ it selects only session which triggered
++ previous resolution. Key manager will do
++ something to install a state with proper
++ selector.
++ */
++ if (x->km.state == XFRM_STATE_VALID) {
++ if ((x->sel.family && !xfrm_selector_match(&x->sel, fl, x->sel.family)) ||
++ !security_xfrm_state_pol_flow_match(x, pol, fl))
++ continue;
++ if (!best ||
++ best->km.dying > x->km.dying ||
++ (best->km.dying == x->km.dying &&
++ best->curlft.add_time < x->curlft.add_time))
++ best = x;
++ } else if (x->km.state == XFRM_STATE_ACQ) {
++ acquire_in_progress = 1;
++ } else if (x->km.state == XFRM_STATE_ERROR ||
++ x->km.state == XFRM_STATE_EXPIRED) {
++ if (xfrm_selector_match(&x->sel, fl, x->sel.family) &&
++ security_xfrm_state_pol_flow_match(x, pol, fl))
++ error = -ESRCH;
++ }
++ }
+ }
+
+-found:
+ x = best;
+ if (!x && !error && !acquire_in_progress) {
+ if (tmpl->id.spi &&
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/README linux-2.6.29-rc3.owrt/README
+--- linux-2.6.29.owrt/README 2009-05-10 22:04:37.000000000 +0200
++++ linux-2.6.29-rc3.owrt/README 2009-05-10 23:48:34.000000000 +0200
+@@ -188,7 +188,7 @@
+ values to random values.
+
+ You can find more information on using the Linux kernel config tools
+- in Documentation/kbuild/kconfig.txt.
++ in Documentation/kbuild/make-configs.txt.
+
+ NOTES on "make config":
+ - having unnecessary drivers will make the kernel bigger, and can
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/scripts/bootgraph.pl linux-2.6.29-rc3.owrt/scripts/bootgraph.pl
+--- linux-2.6.29.owrt/scripts/bootgraph.pl 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/scripts/bootgraph.pl 2009-05-10 23:48:34.000000000 +0200
+@@ -51,7 +51,7 @@
+
+ while (<>) {
+ my $line = $_;
+- if ($line =~ /([0-9\.]+)\] calling ([a-zA-Z0-9\_\.]+)\+/) {
++ if ($line =~ /([0-9\.]+)\] calling ([a-zA-Z0-9\_]+)\+/) {
+ my $func = $2;
+ if ($done == 0) {
+ $start{$func} = $1;
+@@ -87,7 +87,7 @@
+ $count = $count + 1;
+ }
+
+- if ($line =~ /([0-9\.]+)\] initcall ([a-zA-Z0-9\_\.]+)\+.*returned/) {
++ if ($line =~ /([0-9\.]+)\] initcall ([a-zA-Z0-9\_]+)\+.*returned/) {
+ if ($done == 0) {
+ $end{$2} = $1;
+ $maxtime = $1;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/scripts/checkpatch.pl linux-2.6.29-rc3.owrt/scripts/checkpatch.pl
+--- linux-2.6.29.owrt/scripts/checkpatch.pl 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/scripts/checkpatch.pl 2009-05-10 23:48:34.000000000 +0200
+@@ -10,7 +10,7 @@
+ my $P = $0;
+ $P =~ s@.*/@@g;
+
+-my $V = '0.28';
++my $V = '0.27';
+
+ use Getopt::Long qw(:config no_auto_abbrev);
+
+@@ -110,8 +110,7 @@
+ __iomem|
+ __must_check|
+ __init_refok|
+- __kprobes|
+- __ref
++ __kprobes
+ }x;
+ our $Attribute = qr{
+ const|
+@@ -1241,8 +1240,7 @@
+ $realfile =~ s@^([^/]*)/@@;
+
+ $p1_prefix = $1;
+- if (!$file && $tree && $p1_prefix ne '' &&
+- -e "$root/$p1_prefix") {
++ if ($tree && $p1_prefix ne '' && -e "$root/$p1_prefix") {
+ WARN("patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n");
+ }
+
+@@ -1585,9 +1583,9 @@
+ }
+ # TEST: allow direct testing of the attribute matcher.
+ if ($dbg_attr) {
+- if ($line =~ /^.\s*$Modifier\s*$/) {
++ if ($line =~ /^.\s*$Attribute\s*$/) {
+ ERROR("TEST: is attr\n" . $herecurr);
+- } elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
++ } elsif ($dbg_attr > 1 && $line =~ /^.+($Attribute)/) {
+ ERROR("TEST: is not attr ($1 is)\n". $herecurr);
+ }
+ next;
+@@ -1659,7 +1657,7 @@
+
+ # * goes on variable not on type
+ # (char*[ const])
+- if ($line =~ m{\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\)}) {
++ if ($line =~ m{\($NonptrType(\s*\*[\s\*]*(?:$Modifier\s*)*)\)}) {
+ my ($from, $to) = ($1, $1);
+
+ # Should start with a space.
+@@ -1674,7 +1672,7 @@
+ if ($from ne $to) {
+ ERROR("\"(foo$from)\" should be \"(foo$to)\"\n" . $herecurr);
+ }
+- } elsif ($line =~ m{\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident)}) {
++ } elsif ($line =~ m{\b$NonptrType(\s*\*[\s\*]*(?:$Modifier\s*)?)($Ident)}) {
+ my ($from, $to, $ident) = ($1, $1, $2);
+
+ # Should start with a space.
+@@ -1687,8 +1685,8 @@
+ # Modifiers should have spaces.
+ $to =~ s/(\b$Modifier$)/$1 /;
+
+- #print "from<$from> to<$to> ident<$ident>\n";
+- if ($from ne $to && $ident !~ /^$Modifier$/) {
++ #print "from<$from> to<$to>\n";
++ if ($from ne $to) {
+ ERROR("\"foo${from}bar\" should be \"foo${to}bar\"\n" . $herecurr);
+ }
+ }
+@@ -1887,11 +1885,11 @@
+ if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
+ ERROR("space required before that '$op' $at\n" . $hereptr);
+ }
+- if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
++ if ($op eq '*' && $cc =~/\s*const\b/) {
+ # A unary '*' may be const
+
+ } elsif ($ctx =~ /.xW/) {
+- ERROR("Aspace prohibited after that '$op' $at\n" . $hereptr);
++ ERROR("space prohibited after that '$op' $at\n" . $hereptr);
+ }
+
+ # unary ++ and unary -- are allowed no space on one side.
+@@ -2562,7 +2560,7 @@
+ if ($line =~ /\bin_atomic\s*\(/) {
+ if ($realfile =~ m@^drivers/@) {
+ ERROR("do not use in_atomic in drivers\n" . $herecurr);
+- } elsif ($realfile !~ m@^kernel/@) {
++ } else {
+ WARN("use of in_atomic() is incorrect outside core kernel code\n" . $herecurr);
+ }
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/scripts/kconfig/conf.c linux-2.6.29-rc3.owrt/scripts/kconfig/conf.c
+--- linux-2.6.29.owrt/scripts/kconfig/conf.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/scripts/kconfig/conf.c 2009-05-10 23:48:34.000000000 +0200
+@@ -11,7 +11,6 @@
+ #include <time.h>
+ #include <unistd.h>
+ #include <sys/stat.h>
+-#include <sys/time.h>
+
+ #define LKC_DIRECT_LINK
+ #include "lkc.h"
+@@ -465,22 +464,9 @@
+ input_mode = set_yes;
+ break;
+ case 'r':
+- {
+- struct timeval now;
+- unsigned int seed;
+-
+- /*
+- * Use microseconds derived seed,
+- * compensate for systems where it may be zero
+- */
+- gettimeofday(&now, NULL);
+-
+- seed = (unsigned int)((now.tv_sec + 1) * (now.tv_usec + 1));
+- srand(seed);
+-
+ input_mode = set_random;
++ srand(time(NULL));
+ break;
+- }
+ case 'h':
+ printf(_("See README for usage info\n"));
+ exit(0);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/scripts/kconfig/confdata.c linux-2.6.29-rc3.owrt/scripts/kconfig/confdata.c
+--- linux-2.6.29.owrt/scripts/kconfig/confdata.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/scripts/kconfig/confdata.c 2009-05-10 23:48:34.000000000 +0200
+@@ -843,7 +843,7 @@
+ default:
+ continue;
+ }
+- if (!(sym_is_choice(sym) && mode == def_random))
++ if (!sym_is_choice(sym) || mode != def_random)
+ sym->flags |= SYMBOL_DEF_USER;
+ break;
+ default:
+@@ -856,49 +856,28 @@
+
+ if (mode != def_random)
+ return;
+- /*
+- * We have different type of choice blocks.
+- * If curr.tri equal to mod then we can select several
+- * choice symbols in one block.
+- * In this case we do nothing.
+- * If curr.tri equal yes then only one symbol can be
+- * selected in a choice block and we set it to yes,
+- * and the rest to no.
+- */
++
+ for_all_symbols(i, csym) {
+ if (sym_has_value(csym) || !sym_is_choice(csym))
+ continue;
+
+ sym_calc_value(csym);
+-
+- if (csym->curr.tri != yes)
+- continue;
+-
+ prop = sym_get_choice_prop(csym);
+-
+- /* count entries in choice block */
+- cnt = 0;
+- expr_list_for_each_sym(prop->expr, e, sym)
+- cnt++;
+-
+- /*
+- * find a random value and set it to yes,
+- * set the rest to no so we have only one set
+- */
+- def = (rand() % cnt);
+-
+- cnt = 0;
+- expr_list_for_each_sym(prop->expr, e, sym) {
+- if (def == cnt++) {
+- sym->def[S_DEF_USER].tri = yes;
+- csym->def[S_DEF_USER].val = sym;
+- }
+- else {
+- sym->def[S_DEF_USER].tri = no;
++ def = -1;
++ while (1) {
++ cnt = 0;
++ expr_list_for_each_sym(prop->expr, e, sym) {
++ if (sym->visible == no)
++ continue;
++ if (def == cnt++) {
++ csym->def[S_DEF_USER].val = sym;
++ break;
++ }
+ }
++ if (def >= 0 || cnt < 2)
++ break;
++ def = (rand() % cnt) + 1;
+ }
+ csym->flags |= SYMBOL_DEF_USER;
+- /* clear VALID to get value calculated */
+- csym->flags &= ~(SYMBOL_VALID);
+ }
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/scripts/kernel-doc linux-2.6.29-rc3.owrt/scripts/kernel-doc
+--- linux-2.6.29.owrt/scripts/kernel-doc 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/scripts/kernel-doc 2009-05-10 23:48:34.000000000 +0200
+@@ -1827,40 +1827,6 @@
+ $state = 0;
+ }
+
+-sub syscall_munge() {
+- my $void = 0;
+-
+- $prototype =~ s@[\r\n\t]+@ @gos; # strip newlines/CR's/tabs
+-## if ($prototype =~ m/SYSCALL_DEFINE0\s*\(\s*(a-zA-Z0-9_)*\s*\)/) {
+- if ($prototype =~ m/SYSCALL_DEFINE0/) {
+- $void = 1;
+-## $prototype = "long sys_$1(void)";
+- }
+-
+- $prototype =~ s/SYSCALL_DEFINE.*\(/long sys_/; # fix return type & func name
+- if ($prototype =~ m/long (sys_.*?),/) {
+- $prototype =~ s/,/\(/;
+- } elsif ($void) {
+- $prototype =~ s/\)/\(void\)/;
+- }
+-
+- # now delete all of the odd-number commas in $prototype
+- # so that arg types & arg names don't have a comma between them
+- my $count = 0;
+- my $len = length($prototype);
+- if ($void) {
+- $len = 0; # skip the for-loop
+- }
+- for (my $ix = 0; $ix < $len; $ix++) {
+- if (substr($prototype, $ix, 1) eq ',') {
+- $count++;
+- if ($count % 2 == 1) {
+- substr($prototype, $ix, 1) = ' ';
+- }
+- }
+- }
+-}
+-
+ sub process_state3_function($$) {
+ my $x = shift;
+ my $file = shift;
+@@ -1873,15 +1839,11 @@
+ elsif ($x =~ /([^\{]*)/) {
+ $prototype .= $1;
+ }
+-
+ if (($x =~ /\{/) || ($x =~ /\#\s*define/) || ($x =~ /;/)) {
+ $prototype =~ s@/\*.*?\*/@@gos; # strip comments.
+ $prototype =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
+ $prototype =~ s@^\s+@@gos; # strip leading spaces
+- if ($prototype =~ /SYSCALL_DEFINE/) {
+- syscall_munge();
+- }
+- dump_function($prototype, $file);
++ dump_function($prototype,$file);
+ reset_state();
+ }
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/scripts/markup_oops.pl linux-2.6.29-rc3.owrt/scripts/markup_oops.pl
+--- linux-2.6.29.owrt/scripts/markup_oops.pl 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/scripts/markup_oops.pl 2009-05-10 23:48:34.000000000 +0200
+@@ -1,4 +1,4 @@
+-#!/usr/bin/perl
++#!/usr/bin/perl -w
+
+ use File::Basename;
+
+@@ -29,151 +29,27 @@
+ my $target = "0";
+ my $function;
+ my $module = "";
+-my $func_offset = 0;
++my $func_offset;
+ my $vmaoffset = 0;
+
+-my %regs;
+-
+-
+-sub parse_x86_regs
+-{
+- my ($line) = @_;
+- if ($line =~ /EAX: ([0-9a-f]+) EBX: ([0-9a-f]+) ECX: ([0-9a-f]+) EDX: ([0-9a-f]+)/) {
+- $regs{"%eax"} = $1;
+- $regs{"%ebx"} = $2;
+- $regs{"%ecx"} = $3;
+- $regs{"%edx"} = $4;
+- }
+- if ($line =~ /ESI: ([0-9a-f]+) EDI: ([0-9a-f]+) EBP: ([0-9a-f]+) ESP: ([0-9a-f]+)/) {
+- $regs{"%esi"} = $1;
+- $regs{"%edi"} = $2;
+- $regs{"%esp"} = $4;
+- }
+- if ($line =~ /RAX: ([0-9a-f]+) RBX: ([0-9a-f]+) RCX: ([0-9a-f]+)/) {
+- $regs{"%eax"} = $1;
+- $regs{"%ebx"} = $2;
+- $regs{"%ecx"} = $3;
+- }
+- if ($line =~ /RDX: ([0-9a-f]+) RSI: ([0-9a-f]+) RDI: ([0-9a-f]+)/) {
+- $regs{"%edx"} = $1;
+- $regs{"%esi"} = $2;
+- $regs{"%edi"} = $3;
+- }
+- if ($line =~ /RBP: ([0-9a-f]+) R08: ([0-9a-f]+) R09: ([0-9a-f]+)/) {
+- $regs{"%r08"} = $2;
+- $regs{"%r09"} = $3;
+- }
+- if ($line =~ /R10: ([0-9a-f]+) R11: ([0-9a-f]+) R12: ([0-9a-f]+)/) {
+- $regs{"%r10"} = $1;
+- $regs{"%r11"} = $2;
+- $regs{"%r12"} = $3;
+- }
+- if ($line =~ /R13: ([0-9a-f]+) R14: ([0-9a-f]+) R15: ([0-9a-f]+)/) {
+- $regs{"%r13"} = $1;
+- $regs{"%r14"} = $2;
+- $regs{"%r15"} = $3;
+- }
+-}
+-
+-sub reg_name
+-{
+- my ($reg) = @_;
+- $reg =~ s/r(.)x/e\1x/;
+- $reg =~ s/r(.)i/e\1i/;
+- $reg =~ s/r(.)p/e\1p/;
+- return $reg;
+-}
+-
+-sub process_x86_regs
+-{
+- my ($line, $cntr) = @_;
+- my $str = "";
+- if (length($line) < 40) {
+- return ""; # not an asm istruction
+- }
+-
+- # find the arguments to the instruction
+- if ($line =~ /([0-9a-zA-Z\,\%\(\)\-\+]+)$/) {
+- $lastword = $1;
+- } else {
+- return "";
+- }
+-
+- # we need to find the registers that get clobbered,
+- # since their value is no longer relevant for previous
+- # instructions in the stream.
+-
+- $clobber = $lastword;
+- # first, remove all memory operands, they're read only
+- $clobber =~ s/\([a-z0-9\%\,]+\)//g;
+- # then, remove everything before the comma, thats the read part
+- $clobber =~ s/.*\,//g;
+-
+- # if this is the instruction that faulted, we haven't actually done
+- # the write yet... nothing is clobbered.
+- if ($cntr == 0) {
+- $clobber = "";
+- }
+-
+- foreach $reg (keys(%regs)) {
+- my $clobberprime = reg_name($clobber);
+- my $lastwordprime = reg_name($lastword);
+- my $val = $regs{$reg};
+- if ($val =~ /^[0]+$/) {
+- $val = "0";
+- } else {
+- $val =~ s/^0*//;
+- }
+-
+- # first check if we're clobbering this register; if we do
+- # we print it with a =>, and then delete its value
+- if ($clobber =~ /$reg/ || $clobberprime =~ /$reg/) {
+- if (length($val) > 0) {
+- $str = $str . " $reg => $val ";
+- }
+- $regs{$reg} = "";
+- $val = "";
+- }
+- # now check if we're reading this register
+- if ($lastword =~ /$reg/ || $lastwordprime =~ /$reg/) {
+- if (length($val) > 0) {
+- $str = $str . " $reg = $val ";
+- }
+- }
+- }
+- return $str;
+-}
+-
+-# parse the oops
+ while (<STDIN>) {
+ my $line = $_;
+ if ($line =~ /EIP: 0060:\[\<([a-z0-9]+)\>\]/) {
+ $target = $1;
+ }
+- if ($line =~ /RIP: 0010:\[\<([a-z0-9]+)\>\]/) {
+- $target = $1;
+- }
+ if ($line =~ /EIP is at ([a-zA-Z0-9\_]+)\+(0x[0-9a-f]+)\/0x[a-f0-9]/) {
+ $function = $1;
+ $func_offset = $2;
+ }
+- if ($line =~ /RIP: 0010:\[\<[0-9a-f]+\>\] \[\<[0-9a-f]+\>\] ([a-zA-Z0-9\_]+)\+(0x[0-9a-f]+)\/0x[a-f0-9]/) {
+- $function = $1;
+- $func_offset = $2;
+- }
+
+ # check if it's a module
+ if ($line =~ /EIP is at ([a-zA-Z0-9\_]+)\+(0x[0-9a-f]+)\/0x[a-f0-9]+\W\[([a-zA-Z0-9\_\-]+)\]/) {
+ $module = $3;
+ }
+- if ($line =~ /RIP: 0010:\[\<[0-9a-f]+\>\] \[\<[0-9a-f]+\>\] ([a-zA-Z0-9\_]+)\+(0x[0-9a-f]+)\/0x[a-f0-9]+\W\[([a-zA-Z0-9\_\-]+)\]/) {
+- $module = $3;
+- }
+- parse_x86_regs($line);
+ }
+
+ my $decodestart = hex($target) - hex($func_offset);
+-my $decodestop = hex($target) + 8192;
++my $decodestop = $decodestart + 8192;
+ if ($target eq "0") {
+ print "No oops found!\n";
+ print "Usage: \n";
+@@ -208,7 +84,6 @@
+ my $state = 0;
+ my $center = 0;
+ my @lines;
+-my @reglines;
+
+ sub InRange {
+ my ($address, $target) = @_;
+@@ -313,36 +188,16 @@
+
+ my $i;
+
+-
+-# start annotating the registers in the asm.
+-# this goes from the oopsing point back, so that the annotator
+-# can track (opportunistically) which registers got written and
+-# whos value no longer is relevant.
+-
+-$i = $center;
+-while ($i >= $start) {
+- $reglines[$i] = process_x86_regs($lines[$i], $center - $i);
+- $i = $i - 1;
+-}
+-
++my $fulltext = "";
+ $i = $start;
+ while ($i < $finish) {
+- my $line;
+ if ($i == $center) {
+- $line = "*$lines[$i] ";
++ $fulltext = $fulltext . "*$lines[$i] <----- faulting instruction\n";
+ } else {
+- $line = " $lines[$i] ";
+- }
+- print $line;
+- if (defined($reglines[$i]) && length($reglines[$i]) > 0) {
+- my $c = 60 - length($line);
+- while ($c > 0) { print " "; $c = $c - 1; };
+- print "| $reglines[$i]";
++ $fulltext = $fulltext . " $lines[$i]\n";
+ }
+- if ($i == $center) {
+- print "<--- faulting instruction";
+- }
+- print "\n";
+ $i = $i +1;
+ }
+
++print $fulltext;
++
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/scripts/mod/file2alias.c linux-2.6.29-rc3.owrt/scripts/mod/file2alias.c
+--- linux-2.6.29.owrt/scripts/mod/file2alias.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/scripts/mod/file2alias.c 2009-05-10 23:48:34.000000000 +0200
+@@ -210,7 +210,6 @@
+ static int do_hid_entry(const char *filename,
+ struct hid_device_id *id, char *alias)
+ {
+- id->bus = TO_NATIVE(id->bus);
+ id->vendor = TO_NATIVE(id->vendor);
+ id->product = TO_NATIVE(id->product);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/scripts/package/Makefile linux-2.6.29-rc3.owrt/scripts/package/Makefile
+--- linux-2.6.29.owrt/scripts/package/Makefile 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/scripts/package/Makefile 2009-05-10 23:48:34.000000000 +0200
+@@ -35,10 +35,9 @@
+ rpm-pkg rpm: $(objtree)/kernel.spec FORCE
+ $(MAKE) clean
+ $(PREV) ln -sf $(srctree) $(KERNELPATH)
+- $(CONFIG_SHELL) $(srctree)/scripts/setlocalversion > $(objtree)/.scmversion
+ $(PREV) tar -cz $(RCS_TAR_IGNORE) -f $(KERNELPATH).tar.gz $(KERNELPATH)/.
+ $(PREV) rm $(KERNELPATH)
+- rm -f $(objtree)/.scmversion
++
+ set -e; \
+ $(CONFIG_SHELL) $(srctree)/scripts/mkversion > $(objtree)/.tmp_version
+ set -e; \
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/scripts/package/mkspec linux-2.6.29-rc3.owrt/scripts/package/mkspec
+--- linux-2.6.29.owrt/scripts/package/mkspec 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/scripts/package/mkspec 2009-05-10 23:48:34.000000000 +0200
+@@ -86,17 +86,9 @@
+ echo 'cp System.map $RPM_BUILD_ROOT'"/boot/System.map-$KERNELRELEASE"
+
+ echo 'cp .config $RPM_BUILD_ROOT'"/boot/config-$KERNELRELEASE"
+-
+-echo "%ifnarch ppc64"
+-echo 'cp vmlinux vmlinux.orig'
+-echo 'bzip2 -9 vmlinux'
+-echo 'mv vmlinux.bz2 $RPM_BUILD_ROOT'"/boot/vmlinux-$KERNELRELEASE.bz2"
+-echo 'mv vmlinux.orig vmlinux'
+-echo "%endif"
+-
+ echo ""
+ echo "%clean"
+-echo 'rm -rf $RPM_BUILD_ROOT'
++echo '#echo -rf $RPM_BUILD_ROOT'
+ echo ""
+ echo "%files"
+ echo '%defattr (-, root, root)'
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/scripts/setlocalversion linux-2.6.29-rc3.owrt/scripts/setlocalversion
+--- linux-2.6.29.owrt/scripts/setlocalversion 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/scripts/setlocalversion 2009-05-10 23:48:34.000000000 +0200
+@@ -58,7 +58,14 @@
+ # Check for svn and a svn repo.
+ if rev=`svn info 2>/dev/null | grep '^Last Changed Rev'`; then
+ rev=`echo $rev | awk '{print $NF}'`
+- printf -- '-svn%s' "$rev"
++ changes=`svn status 2>/dev/null | grep '^[AMD]' | wc -l`
++
++ # Are there uncommitted changes?
++ if [ $changes != 0 ]; then
++ printf -- '-svn%s%s' "$rev" -dirty
++ else
++ printf -- '-svn%s' "$rev"
++ fi
+
+ # All done with svn
+ exit
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/scripts/tags.sh linux-2.6.29-rc3.owrt/scripts/tags.sh
+--- linux-2.6.29.owrt/scripts/tags.sh 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/scripts/tags.sh 2009-05-10 23:48:34.000000000 +0200
+@@ -76,10 +76,7 @@
+
+ all_kconfigs()
+ {
+- for arch in $ALLSOURCE_ARCHS; do
+- find_sources $arch 'Kconfig*'
+- done
+- find_other_sources 'Kconfig*'
++ find_sources $ALLSOURCE_ARCHS 'Kconfig*'
+ }
+
+ all_defconfigs()
+@@ -102,8 +99,7 @@
+ -I ____cacheline_internodealigned_in_smp \
+ -I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL \
+ --extra=+f --c-kinds=+px \
+- --regex-asm='/^ENTRY\(([^)]*)\).*/\1/' \
+- --regex-c='/^SYSCALL_DEFINE[[:digit:]]?\(([^,)]*).*/sys_\1/'
++ --regex-asm='/^ENTRY\(([^)]*)\).*/\1/'
+
+ all_kconfigs | xargs $1 -a \
+ --langdef=kconfig --language-force=kconfig \
+@@ -121,9 +117,7 @@
+
+ emacs()
+ {
+- all_sources | xargs $1 -a \
+- --regex='/^ENTRY(\([^)]*\)).*/\1/' \
+- --regex='/^SYSCALL_DEFINE[0-9]?(\([^,)]*\).*/sys_\1/'
++ all_sources | xargs $1 -a
+
+ all_kconfigs | xargs $1 -a \
+ --regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/\3/'
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/scripts/unifdef.c linux-2.6.29-rc3.owrt/scripts/unifdef.c
+--- linux-2.6.29.owrt/scripts/unifdef.c 2009-05-10 22:04:38.000000000 +0200
++++ linux-2.6.29-rc3.owrt/scripts/unifdef.c 2009-05-10 23:48:34.000000000 +0200
+@@ -206,7 +206,7 @@
+ static void error(const char *);
+ static int findsym(const char *);
+ static void flushline(bool);
+-static Linetype get_line(void);
++static Linetype getline(void);
+ static Linetype ifeval(const char **);
+ static void ignoreoff(void);
+ static void ignoreon(void);
+@@ -512,7 +512,7 @@
+
+ for (;;) {
+ linenum++;
+- lineval = get_line();
++ lineval = getline();
+ trans_table[ifstate[depth]][lineval]();
+ debug("process %s -> %s depth %d",
+ linetype_name[lineval],
+@@ -526,7 +526,7 @@
+ * help from skipcomment().
+ */
+ static Linetype
+-get_line(void)
++getline(void)
+ {
+ const char *cp;
+ int cursym;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/security/selinux/netlabel.c linux-2.6.29-rc3.owrt/security/selinux/netlabel.c
+--- linux-2.6.29.owrt/security/selinux/netlabel.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/security/selinux/netlabel.c 2009-05-10 23:48:34.000000000 +0200
+@@ -386,12 +386,11 @@
+ if (!S_ISSOCK(inode->i_mode) ||
+ ((mask & (MAY_WRITE | MAY_APPEND)) == 0))
+ return 0;
++
+ sock = SOCKET_I(inode);
+ sk = sock->sk;
+- if (sk == NULL)
+- return 0;
+ sksec = sk->sk_security;
+- if (sksec == NULL || sksec->nlbl_state != NLBL_REQUIRE)
++ if (sksec->nlbl_state != NLBL_REQUIRE)
+ return 0;
+
+ local_bh_disable();
+@@ -491,10 +490,8 @@
+ lock_sock(sk);
+ rc = netlbl_sock_getattr(sk, &secattr);
+ release_sock(sk);
+- if (rc == 0)
++ if (rc == 0 && secattr.flags != NETLBL_SECATTR_NONE)
+ rc = -EACCES;
+- else if (rc == -ENOMSG)
+- rc = 0;
+ netlbl_secattr_destroy(&secattr);
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/security/smack/smackfs.c linux-2.6.29-rc3.owrt/security/smack/smackfs.c
+--- linux-2.6.29.owrt/security/smack/smackfs.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/security/smack/smackfs.c 2009-05-10 23:48:34.000000000 +0200
+@@ -650,6 +650,10 @@
+
+ return skp;
+ }
++/*
++#define BEMASK 0x80000000
++*/
++#define BEMASK 0x00000001
+ #define BEBITS (sizeof(__be32) * 8)
+
+ /*
+@@ -659,10 +663,12 @@
+ {
+ struct smk_netlbladdr *skp = (struct smk_netlbladdr *) v;
+ unsigned char *hp = (char *) &skp->smk_host.sin_addr.s_addr;
+- int maskn;
+- u32 temp_mask = be32_to_cpu(skp->smk_mask.s_addr);
++ __be32 bebits;
++ int maskn = 0;
+
+- for (maskn = 0; temp_mask; temp_mask <<= 1, maskn++);
++ for (bebits = BEMASK; bebits != 0; maskn++, bebits <<= 1)
++ if ((skp->smk_mask.s_addr & bebits) == 0)
++ break;
+
+ seq_printf(s, "%u.%u.%u.%u/%d %s\n",
+ hp[0], hp[1], hp[2], hp[3], maskn, skp->smk_label);
+@@ -696,42 +702,6 @@
+ }
+
+ /**
+- * smk_netlbladdr_insert
+- * @new : netlabel to insert
+- *
+- * This helper insert netlabel in the smack_netlbladdrs list
+- * sorted by netmask length (longest to smallest)
+- */
+-static void smk_netlbladdr_insert(struct smk_netlbladdr *new)
+-{
+- struct smk_netlbladdr *m;
+-
+- if (smack_netlbladdrs == NULL) {
+- smack_netlbladdrs = new;
+- return;
+- }
+-
+- /* the comparison '>' is a bit hacky, but works */
+- if (new->smk_mask.s_addr > smack_netlbladdrs->smk_mask.s_addr) {
+- new->smk_next = smack_netlbladdrs;
+- smack_netlbladdrs = new;
+- return;
+- }
+- for (m = smack_netlbladdrs; m != NULL; m = m->smk_next) {
+- if (m->smk_next == NULL) {
+- m->smk_next = new;
+- return;
+- }
+- if (new->smk_mask.s_addr > m->smk_next->smk_mask.s_addr) {
+- new->smk_next = m->smk_next;
+- m->smk_next = new;
+- return;
+- }
+- }
+-}
+-
+-
+-/**
+ * smk_write_netlbladdr - write() for /smack/netlabel
+ * @filp: file pointer, not actually used
+ * @buf: where to get the data from
+@@ -754,9 +724,8 @@
+ struct netlbl_audit audit_info;
+ struct in_addr mask;
+ unsigned int m;
+- u32 mask_bits = (1<<31);
++ __be32 bebits = BEMASK;
+ __be32 nsa;
+- u32 temp_mask;
+
+ /*
+ * Must have privilege.
+@@ -792,13 +761,10 @@
+ if (sp == NULL)
+ return -EINVAL;
+
+- for (temp_mask = 0; m > 0; m--) {
+- temp_mask |= mask_bits;
+- mask_bits >>= 1;
++ for (mask.s_addr = 0; m > 0; m--) {
++ mask.s_addr |= bebits;
++ bebits <<= 1;
+ }
+- mask.s_addr = cpu_to_be32(temp_mask);
+-
+- newname.sin_addr.s_addr &= mask.s_addr;
+ /*
+ * Only allow one writer at a time. Writes should be
+ * quite rare and small in any case.
+@@ -806,7 +772,6 @@
+ mutex_lock(&smk_netlbladdr_lock);
+
+ nsa = newname.sin_addr.s_addr;
+- /* try to find if the prefix is already in the list */
+ for (skp = smack_netlbladdrs; skp != NULL; skp = skp->smk_next)
+ if (skp->smk_host.sin_addr.s_addr == nsa &&
+ skp->smk_mask.s_addr == mask.s_addr)
+@@ -822,8 +787,9 @@
+ rc = 0;
+ skp->smk_host.sin_addr.s_addr = newname.sin_addr.s_addr;
+ skp->smk_mask.s_addr = mask.s_addr;
++ skp->smk_next = smack_netlbladdrs;
+ skp->smk_label = sp;
+- smk_netlbladdr_insert(skp);
++ smack_netlbladdrs = skp;
+ }
+ } else {
+ rc = netlbl_cfg_unlbl_static_del(&init_net, NULL,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/security/smack/smack_lsm.c linux-2.6.29-rc3.owrt/security/smack/smack_lsm.c
+--- linux-2.6.29.owrt/security/smack/smack_lsm.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/security/smack/smack_lsm.c 2009-05-10 23:48:34.000000000 +0200
+@@ -1498,31 +1498,58 @@
+ * looks for host based access restrictions
+ *
+ * This version will only be appropriate for really small
+- * sets of single label hosts.
++ * sets of single label hosts. Because of the masking
++ * it cannot shortcut out on the first match. There are
++ * numerious ways to address the problem, but none of them
++ * have been applied here.
+ *
+ * Returns the label of the far end or NULL if it's not special.
+ */
+ static char *smack_host_label(struct sockaddr_in *sip)
+ {
+ struct smk_netlbladdr *snp;
++ char *bestlabel = NULL;
+ struct in_addr *siap = &sip->sin_addr;
++ struct in_addr *liap;
++ struct in_addr *miap;
++ struct in_addr bestmask;
+
+ if (siap->s_addr == 0)
+ return NULL;
+
++ bestmask.s_addr = 0;
++
+ for (snp = smack_netlbladdrs; snp != NULL; snp = snp->smk_next) {
++ liap = &snp->smk_host.sin_addr;
++ miap = &snp->smk_mask;
++ /*
++ * If the addresses match after applying the list entry mask
++ * the entry matches the address. If it doesn't move along to
++ * the next entry.
++ */
++ if ((liap->s_addr & miap->s_addr) !=
++ (siap->s_addr & miap->s_addr))
++ continue;
+ /*
+- * we break after finding the first match because
+- * the list is sorted from longest to shortest mask
+- * so we have found the most specific match
++ * If the list entry mask identifies a single address
++ * it can't get any more specific.
+ */
+- if ((&snp->smk_host.sin_addr)->s_addr ==
+- (siap->s_addr & (&snp->smk_mask)->s_addr)) {
++ if (miap->s_addr == 0xffffffff)
+ return snp->smk_label;
+- }
++ /*
++ * If the list entry mask is less specific than the best
++ * already found this entry is uninteresting.
++ */
++ if ((miap->s_addr | bestmask.s_addr) == bestmask.s_addr)
++ continue;
++ /*
++ * This is better than any entry found so far.
++ */
++ bestmask.s_addr = miap->s_addr;
++ bestlabel = snp->smk_label;
+ }
+
+- return NULL;
++ return bestlabel;
+ }
+
+ /**
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/arm/aaci.c linux-2.6.29-rc3.owrt/sound/arm/aaci.c
+--- linux-2.6.29.owrt/sound/arm/aaci.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/arm/aaci.c 2009-05-10 23:48:34.000000000 +0200
+@@ -90,7 +90,7 @@
+ */
+ do {
+ v = readl(aaci->base + AACI_SLFR);
+- } while ((v & (SLFR_1TXB|SLFR_2TXB)) && --timeout);
++ } while ((v & (SLFR_1TXB|SLFR_2TXB)) && timeout--);
+
+ if (!timeout)
+ dev_err(&aaci->dev->dev,
+@@ -126,7 +126,7 @@
+ */
+ do {
+ v = readl(aaci->base + AACI_SLFR);
+- } while ((v & SLFR_1TXB) && --timeout);
++ } while ((v & SLFR_1TXB) && timeout--);
+
+ if (!timeout) {
+ dev_err(&aaci->dev->dev, "timeout on slot 1 TX busy\n");
+@@ -147,7 +147,7 @@
+ do {
+ cond_resched();
+ v = readl(aaci->base + AACI_SLFR) & (SLFR_1RXV|SLFR_2RXV);
+- } while ((v != (SLFR_1RXV|SLFR_2RXV)) && --timeout);
++ } while ((v != (SLFR_1RXV|SLFR_2RXV)) && timeout--);
+
+ if (!timeout) {
+ dev_err(&aaci->dev->dev, "timeout on RX valid\n");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/core/jack.c linux-2.6.29-rc3.owrt/sound/core/jack.c
+--- linux-2.6.29.owrt/sound/core/jack.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/core/jack.c 2009-05-10 23:48:34.000000000 +0200
+@@ -47,7 +47,7 @@
+ int err;
+
+ snprintf(jack->name, sizeof(jack->name), "%s %s",
+- card->shortname, jack->id);
++ card->longname, jack->id);
+ jack->input_dev->name = jack->name;
+
+ /* Default to the sound card device. */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/core/oss/mixer_oss.c linux-2.6.29-rc3.owrt/sound/core/oss/mixer_oss.c
+--- linux-2.6.29.owrt/sound/core/oss/mixer_oss.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/core/oss/mixer_oss.c 2009-05-10 23:48:34.000000000 +0200
+@@ -692,9 +692,6 @@
+ snd_mixer_oss_put_volume1_vol(fmixer, pslot, slot->numid[SNDRV_MIXER_OSS_ITEM_PVOLUME], left, right);
+ if (slot->present & SNDRV_MIXER_OSS_PRESENT_CVOLUME)
+ snd_mixer_oss_put_volume1_vol(fmixer, pslot, slot->numid[SNDRV_MIXER_OSS_ITEM_CVOLUME], left, right);
+- } else if (slot->present & SNDRV_MIXER_OSS_PRESENT_CVOLUME) {
+- snd_mixer_oss_put_volume1_vol(fmixer, pslot,
+- slot->numid[SNDRV_MIXER_OSS_ITEM_CVOLUME], left, right);
+ } else if (slot->present & SNDRV_MIXER_OSS_PRESENT_GVOLUME) {
+ snd_mixer_oss_put_volume1_vol(fmixer, pslot, slot->numid[SNDRV_MIXER_OSS_ITEM_GVOLUME], left, right);
+ } else if (slot->present & SNDRV_MIXER_OSS_PRESENT_GLOBAL) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/core/oss/pcm_oss.c linux-2.6.29-rc3.owrt/sound/core/oss/pcm_oss.c
+--- linux-2.6.29.owrt/sound/core/oss/pcm_oss.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/core/oss/pcm_oss.c 2009-05-10 23:48:34.000000000 +0200
+@@ -1767,7 +1767,7 @@
+ AFMT_S8 | AFMT_U16_LE |
+ AFMT_U16_BE |
+ AFMT_S32_LE | AFMT_S32_BE |
+- AFMT_S24_LE | AFMT_S24_BE |
++ AFMT_S24_LE | AFMT_S24_LE |
+ AFMT_S24_PACKED;
+ params = kmalloc(sizeof(*params), GFP_KERNEL);
+ if (!params)
+@@ -2872,7 +2872,7 @@
+ setup = kmalloc(sizeof(*setup), GFP_KERNEL);
+ if (! setup) {
+ buffer->error = -ENOMEM;
+- mutex_unlock(&pstr->oss.setup_mutex);
++ mutex_lock(&pstr->oss.setup_mutex);
+ return;
+ }
+ if (pstr->oss.setup_list == NULL)
+@@ -2886,7 +2886,7 @@
+ if (! template.task_name) {
+ kfree(setup);
+ buffer->error = -ENOMEM;
+- mutex_unlock(&pstr->oss.setup_mutex);
++ mutex_lock(&pstr->oss.setup_mutex);
+ return;
+ }
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/core/oss/rate.c linux-2.6.29-rc3.owrt/sound/core/oss/rate.c
+--- linux-2.6.29.owrt/sound/core/oss/rate.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/core/oss/rate.c 2009-05-10 23:48:34.000000000 +0200
+@@ -157,7 +157,7 @@
+ while (dst_frames1 > 0) {
+ S1 = S2;
+ if (src_frames1-- > 0) {
+- S2 = *src;
++ S1 = *src;
+ src += src_step;
+ }
+ if (pos & ~R_MASK) {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/core/sgbuf.c linux-2.6.29-rc3.owrt/sound/core/sgbuf.c
+--- linux-2.6.29.owrt/sound/core/sgbuf.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/core/sgbuf.c 2009-05-10 23:48:34.000000000 +0200
+@@ -38,10 +38,6 @@
+ if (! sgbuf)
+ return -EINVAL;
+
+- if (dmab->area)
+- vunmap(dmab->area);
+- dmab->area = NULL;
+-
+ tmpb.dev.type = SNDRV_DMA_TYPE_DEV;
+ tmpb.dev.dev = sgbuf->dev;
+ for (i = 0; i < sgbuf->pages; i++) {
+@@ -52,6 +48,9 @@
+ tmpb.bytes = (sgbuf->table[i].addr & ~PAGE_MASK) << PAGE_SHIFT;
+ snd_dma_free_pages(&tmpb);
+ }
++ if (dmab->area)
++ vunmap(dmab->area);
++ dmab->area = NULL;
+
+ kfree(sgbuf->table);
+ kfree(sgbuf->page_table);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/drivers/mtpav.c linux-2.6.29-rc3.owrt/sound/drivers/mtpav.c
+--- linux-2.6.29.owrt/sound/drivers/mtpav.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/drivers/mtpav.c 2009-05-10 23:48:34.000000000 +0200
+@@ -706,6 +706,7 @@
+ mtp_card->card = card;
+ mtp_card->irq = -1;
+ mtp_card->share_irq = 0;
++ mtp_card->inmidiport = 0xffffffff;
+ mtp_card->inmidistate = 0;
+ mtp_card->outmidihwport = 0xffffffff;
+ init_timer(&mtp_card->timer);
+@@ -718,8 +719,6 @@
+ if (err < 0)
+ goto __error;
+
+- mtp_card->inmidiport = mtp_card->num_ports + MTPAV_PIDX_BROADCAST;
+-
+ err = snd_mtpav_get_ISA(mtp_card);
+ if (err < 0)
+ goto __error;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/isa/opl3sa2.c linux-2.6.29-rc3.owrt/sound/isa/opl3sa2.c
+--- linux-2.6.29.owrt/sound/isa/opl3sa2.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/isa/opl3sa2.c 2009-05-10 23:48:34.000000000 +0200
+@@ -550,27 +550,21 @@
+ #ifdef CONFIG_PM
+ static int snd_opl3sa2_suspend(struct snd_card *card, pm_message_t state)
+ {
+- if (card) {
+- struct snd_opl3sa2 *chip = card->private_data;
++ struct snd_opl3sa2 *chip = card->private_data;
+
+- snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+- chip->wss->suspend(chip->wss);
+- /* power down */
+- snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D3);
+- }
++ snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
++ chip->wss->suspend(chip->wss);
++ /* power down */
++ snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D3);
+
+ return 0;
+ }
+
+ static int snd_opl3sa2_resume(struct snd_card *card)
+ {
+- struct snd_opl3sa2 *chip;
++ struct snd_opl3sa2 *chip = card->private_data;
+ int i;
+
+- if (!card)
+- return 0;
+-
+- chip = card->private_data;
+ /* power up */
+ snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D0);
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/oss/dmasound/dmasound_atari.c linux-2.6.29-rc3.owrt/sound/oss/dmasound/dmasound_atari.c
+--- linux-2.6.29.owrt/sound/oss/dmasound/dmasound_atari.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/oss/dmasound/dmasound_atari.c 2009-05-10 23:48:34.000000000 +0200
+@@ -847,23 +847,23 @@
+ of events. So all we need to keep the music playing is
+ to provide the sound hardware with new data upon
+ an interrupt from timer A. */
+- st_mfp.tim_ct_a = 0; /* ++roman: Stop timer before programming! */
+- st_mfp.tim_dt_a = 1; /* Cause interrupt after first event. */
+- st_mfp.tim_ct_a = 8; /* Turn on event counting. */
++ mfp.tim_ct_a = 0; /* ++roman: Stop timer before programming! */
++ mfp.tim_dt_a = 1; /* Cause interrupt after first event. */
++ mfp.tim_ct_a = 8; /* Turn on event counting. */
+ /* Register interrupt handler. */
+ if (request_irq(IRQ_MFP_TIMA, AtaInterrupt, IRQ_TYPE_SLOW, "DMA sound",
+ AtaInterrupt))
+ return 0;
+- st_mfp.int_en_a |= 0x20; /* Turn interrupt on. */
+- st_mfp.int_mk_a |= 0x20;
++ mfp.int_en_a |= 0x20; /* Turn interrupt on. */
++ mfp.int_mk_a |= 0x20;
+ return 1;
+ }
+
+ #ifdef MODULE
+ static void AtaIrqCleanUp(void)
+ {
+- st_mfp.tim_ct_a = 0; /* stop timer */
+- st_mfp.int_en_a &= ~0x20; /* turn interrupt off */
++ mfp.tim_ct_a = 0; /* stop timer */
++ mfp.int_en_a &= ~0x20; /* turn interrupt off */
+ free_irq(IRQ_MFP_TIMA, AtaInterrupt);
+ }
+ #endif /* MODULE */
+@@ -1599,7 +1599,7 @@
+ is_falcon = 0;
+ } else
+ return -ENODEV;
+- if ((st_mfp.int_en_a & st_mfp.int_mk_a & 0x20) == 0)
++ if ((mfp.int_en_a & mfp.int_mk_a & 0x20) == 0)
+ return dmasound_init();
+ else {
+ printk("DMA sound driver: Timer A interrupt already in use\n");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/pci/aw2/aw2-alsa.c linux-2.6.29-rc3.owrt/sound/pci/aw2/aw2-alsa.c
+--- linux-2.6.29.owrt/sound/pci/aw2/aw2-alsa.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/pci/aw2/aw2-alsa.c 2009-05-10 23:48:34.000000000 +0200
+@@ -165,7 +165,7 @@
+ MODULE_PARM_DESC(enable, "Enable Audiowerk2 soundcard.");
+
+ static struct pci_device_id snd_aw2_ids[] = {
+- {PCI_VENDOR_ID_SAA7146, PCI_DEVICE_ID_SAA7146, 0, 0,
++ {PCI_VENDOR_ID_SAA7146, PCI_DEVICE_ID_SAA7146, PCI_ANY_ID, PCI_ANY_ID,
+ 0, 0, 0},
+ {0}
+ };
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/pci/emu10k1/emu10k1_main.c linux-2.6.29-rc3.owrt/sound/pci/emu10k1/emu10k1_main.c
+--- linux-2.6.29.owrt/sound/pci/emu10k1/emu10k1_main.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/pci/emu10k1/emu10k1_main.c 2009-05-10 23:48:34.000000000 +0200
+@@ -1528,7 +1528,6 @@
+ .ca0151_chip = 1,
+ .spk71 = 1,
+ .spdif_bug = 1,
+- .invert_shared_spdif = 1, /* digital/analog switch swapped */
+ .ac97_chip = 1} ,
+ {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10021102,
+ .driver = "Audigy2", .name = "SB Audigy 2 Platinum [SB0240P]",
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/pci/hda/hda_codec.c linux-2.6.29-rc3.owrt/sound/pci/hda/hda_codec.c
+--- linux-2.6.29.owrt/sound/pci/hda/hda_codec.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/pci/hda/hda_codec.c 2009-05-10 23:48:34.000000000 +0200
+@@ -487,6 +487,7 @@
+ {
+ struct hda_bus *bus;
+ int err;
++ char qname[8];
+ static struct snd_device_ops dev_ops = {
+ .dev_register = snd_hda_bus_dev_register,
+ .dev_free = snd_hda_bus_dev_free,
+@@ -516,12 +517,10 @@
+ mutex_init(&bus->cmd_mutex);
+ INIT_LIST_HEAD(&bus->codec_list);
+
+- snprintf(bus->workq_name, sizeof(bus->workq_name),
+- "hd-audio%d", card->number);
+- bus->workq = create_singlethread_workqueue(bus->workq_name);
++ snprintf(qname, sizeof(qname), "hda%d", card->number);
++ bus->workq = create_workqueue(qname);
+ if (!bus->workq) {
+- snd_printk(KERN_ERR "cannot create workqueue %s\n",
+- bus->workq_name);
++ snd_printk(KERN_ERR "cannot create workqueue %s\n", qname);
+ kfree(bus);
+ return -ENOMEM;
+ }
+@@ -3088,16 +3087,6 @@
+ }
+ EXPORT_SYMBOL_HDA(snd_hda_multi_out_dig_prepare);
+
+-int snd_hda_multi_out_dig_cleanup(struct hda_codec *codec,
+- struct hda_multi_out *mout)
+-{
+- mutex_lock(&codec->spdif_mutex);
+- cleanup_dig_out_stream(codec, mout->dig_out_nid);
+- mutex_unlock(&codec->spdif_mutex);
+- return 0;
+-}
+-EXPORT_SYMBOL_HDA(snd_hda_multi_out_dig_cleanup);
+-
+ /*
+ * release the digital out
+ */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/pci/hda/hda_codec.h linux-2.6.29-rc3.owrt/sound/pci/hda/hda_codec.h
+--- linux-2.6.29.owrt/sound/pci/hda/hda_codec.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/pci/hda/hda_codec.h 2009-05-10 23:48:34.000000000 +0200
+@@ -614,7 +614,6 @@
+
+ /* unsolicited event queue */
+ struct hda_bus_unsolicited *unsol;
+- char workq_name[16];
+ struct workqueue_struct *workq; /* common workqueue for codecs */
+
+ /* assigned PCMs */
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/pci/hda/hda_hwdep.c linux-2.6.29-rc3.owrt/sound/pci/hda/hda_hwdep.c
+--- linux-2.6.29.owrt/sound/pci/hda/hda_hwdep.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/pci/hda/hda_hwdep.c 2009-05-10 23:48:34.000000000 +0200
+@@ -175,7 +175,7 @@
+ err = snd_hda_codec_build_controls(codec);
+ if (err < 0)
+ return err;
+- return snd_card_register(codec->bus->card);
++ return 0;
+ }
+
+ /*
+@@ -277,19 +277,18 @@
+ {
+ struct snd_hwdep *hwdep = dev_get_drvdata(dev);
+ struct hda_codec *codec = hwdep->private_data;
+- struct hda_verb *v;
+- int nid, verb, param;
++ char *p;
++ struct hda_verb verb, *v;
+
+- if (sscanf(buf, "%i %i %i", &nid, &verb, &param) != 3)
+- return -EINVAL;
+- if (!nid || !verb)
++ verb.nid = simple_strtoul(buf, &p, 0);
++ verb.verb = simple_strtoul(p, &p, 0);
++ verb.param = simple_strtoul(p, &p, 0);
++ if (!verb.nid || !verb.verb || !verb.param)
+ return -EINVAL;
+ v = snd_array_new(&codec->init_verbs);
+ if (!v)
+ return -ENOMEM;
+- v->nid = nid;
+- v->verb = verb;
+- v->param = param;
++ *v = verb;
+ return count;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/pci/hda/hda_intel.c linux-2.6.29-rc3.owrt/sound/pci/hda/hda_intel.c
+--- linux-2.6.29.owrt/sound/pci/hda/hda_intel.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/pci/hda/hda_intel.c 2009-05-10 23:48:34.000000000 +0200
+@@ -1947,13 +1947,16 @@
+ return 0;
+ }
+
++static int azx_resume_early(struct pci_dev *pci)
++{
++ return pci_restore_state(pci);
++}
++
+ static int azx_resume(struct pci_dev *pci)
+ {
+ struct snd_card *card = pci_get_drvdata(pci);
+ struct azx *chip = card->private_data;
+
+- pci_set_power_state(pci, PCI_D0);
+- pci_restore_state(pci);
+ if (pci_enable_device(pci) < 0) {
+ printk(KERN_ERR "hda-intel: pci_enable_device failed, "
+ "disabling device\n");
+@@ -2059,31 +2062,26 @@
+ {
+ const struct snd_pci_quirk *q;
+
+- switch (fix) {
+- case POS_FIX_LPIB:
+- case POS_FIX_POSBUF:
+- return fix;
+- }
+-
+- /* Check VIA/ATI HD Audio Controller exist */
+- switch (chip->driver_type) {
+- case AZX_DRIVER_VIA:
+- case AZX_DRIVER_ATI:
++ /* Check VIA HD Audio Controller exist */
++ if (chip->pci->vendor == PCI_VENDOR_ID_VIA &&
++ chip->pci->device == VIA_HDAC_DEVICE_ID) {
+ chip->via_dmapos_patch = 1;
+ /* Use link position directly, avoid any transfer problem. */
+ return POS_FIX_LPIB;
+ }
+ chip->via_dmapos_patch = 0;
+
+- q = snd_pci_quirk_lookup(chip->pci, position_fix_list);
+- if (q) {
+- printk(KERN_INFO
+- "hda_intel: position_fix set to %d "
+- "for device %04x:%04x\n",
+- q->value, q->subvendor, q->subdevice);
+- return q->value;
++ if (fix == POS_FIX_AUTO) {
++ q = snd_pci_quirk_lookup(chip->pci, position_fix_list);
++ if (q) {
++ printk(KERN_INFO
++ "hda_intel: position_fix set to %d "
++ "for device %04x:%04x\n",
++ q->value, q->subvendor, q->subdevice);
++ return q->value;
++ }
+ }
+- return POS_FIX_AUTO;
++ return fix;
+ }
+
+ /*
+@@ -2100,8 +2098,6 @@
+ SND_PCI_QUIRK(0x1028, 0x20ac, "Dell Studio Desktop", 0x01),
+ /* including bogus ALC268 in slot#2 that conflicts with ALC888 */
+ SND_PCI_QUIRK(0x17c0, 0x4085, "Medion MD96630", 0x01),
+- /* conflict of ALC268 in slot#3 (digital I/O); a temporary fix */
+- SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba laptop", 0x03),
+ {}
+ };
+
+@@ -2215,17 +2211,9 @@
+ gcap = azx_readw(chip, GCAP);
+ snd_printdd("chipset global capabilities = 0x%x\n", gcap);
+
+- /* ATI chips seems buggy about 64bit DMA addresses */
+- if (chip->driver_type == AZX_DRIVER_ATI)
+- gcap &= ~0x01;
+-
+ /* allow 64bit DMA address if supported by H/W */
+ if ((gcap & 0x01) && !pci_set_dma_mask(pci, DMA_64BIT_MASK))
+ pci_set_consistent_dma_mask(pci, DMA_64BIT_MASK);
+- else {
+- pci_set_dma_mask(pci, DMA_32BIT_MASK);
+- pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK);
+- }
+
+ /* read number of streams from GCAP register instead of using
+ * hardcoded value
+@@ -2480,6 +2468,7 @@
+ .remove = __devexit_p(azx_remove),
+ #ifdef CONFIG_PM
+ .suspend = azx_suspend,
++ .resume_early = azx_resume_early,
+ .resume = azx_resume,
+ #endif
+ };
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/pci/hda/hda_local.h linux-2.6.29-rc3.owrt/sound/pci/hda/hda_local.h
+--- linux-2.6.29.owrt/sound/pci/hda/hda_local.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/pci/hda/hda_local.h 2009-05-10 23:48:34.000000000 +0200
+@@ -251,8 +251,6 @@
+ unsigned int stream_tag,
+ unsigned int format,
+ struct snd_pcm_substream *substream);
+-int snd_hda_multi_out_dig_cleanup(struct hda_codec *codec,
+- struct hda_multi_out *mout);
+ int snd_hda_multi_out_analog_open(struct hda_codec *codec,
+ struct hda_multi_out *mout,
+ struct snd_pcm_substream *substream,
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/pci/hda/hda_proc.c linux-2.6.29-rc3.owrt/sound/pci/hda/hda_proc.c
+--- linux-2.6.29.owrt/sound/pci/hda/hda_proc.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/pci/hda/hda_proc.c 2009-05-10 23:48:34.000000000 +0200
+@@ -399,8 +399,7 @@
+ {
+ int c, curr = -1;
+
+- if (conn_len > 1 && wid_type != AC_WID_AUD_MIX &&
+- wid_type != AC_WID_VOL_KNB)
++ if (conn_len > 1 && wid_type != AC_WID_AUD_MIX)
+ curr = snd_hda_codec_read(codec, nid, 0,
+ AC_VERB_GET_CONNECT_SEL, 0);
+ snd_iprintf(buffer, " Connection: %d\n", conn_len);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/pci/hda/patch_analog.c linux-2.6.29-rc3.owrt/sound/pci/hda/patch_analog.c
+--- linux-2.6.29.owrt/sound/pci/hda/patch_analog.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/pci/hda/patch_analog.c 2009-05-10 23:48:34.000000000 +0200
+@@ -275,14 +275,6 @@
+ format, substream);
+ }
+
+-static int ad198x_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
+- struct hda_codec *codec,
+- struct snd_pcm_substream *substream)
+-{
+- struct ad198x_spec *spec = codec->spec;
+- return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
+-}
+-
+ /*
+ * Analog capture
+ */
+@@ -341,8 +333,7 @@
+ .ops = {
+ .open = ad198x_dig_playback_pcm_open,
+ .close = ad198x_dig_playback_pcm_close,
+- .prepare = ad198x_dig_playback_pcm_prepare,
+- .cleanup = ad198x_dig_playback_pcm_cleanup
++ .prepare = ad198x_dig_playback_pcm_prepare
+ },
+ };
+
+@@ -1894,8 +1885,8 @@
+ #define AD1988_SPDIF_OUT_HDMI 0x0b
+ #define AD1988_SPDIF_IN 0x07
+
+-static hda_nid_t ad1989b_slave_dig_outs[] = {
+- AD1988_SPDIF_OUT, AD1988_SPDIF_OUT_HDMI, 0
++static hda_nid_t ad1989b_slave_dig_outs[2] = {
++ AD1988_SPDIF_OUT, AD1988_SPDIF_OUT_HDMI
+ };
+
+ static struct hda_input_mux ad1988_6stack_capture_source = {
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/pci/hda/patch_conexant.c linux-2.6.29-rc3.owrt/sound/pci/hda/patch_conexant.c
+--- linux-2.6.29.owrt/sound/pci/hda/patch_conexant.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/pci/hda/patch_conexant.c 2009-05-10 23:48:34.000000000 +0200
+@@ -347,7 +347,6 @@
+ &spec->cur_mux[adc_idx]);
+ }
+
+-#ifdef CONFIG_SND_JACK
+ static int conexant_add_jack(struct hda_codec *codec,
+ hda_nid_t nid, int type)
+ {
+@@ -395,6 +394,7 @@
+
+ static int conexant_init_jacks(struct hda_codec *codec)
+ {
++#ifdef CONFIG_SND_JACK
+ struct conexant_spec *spec = codec->spec;
+ int i;
+
+@@ -422,19 +422,10 @@
+ ++hv;
+ }
+ }
++#endif
+ return 0;
+
+ }
+-#else
+-static inline void conexant_report_jack(struct hda_codec *codec, hda_nid_t nid)
+-{
+-}
+-
+-static inline int conexant_init_jacks(struct hda_codec *codec)
+-{
+- return 0;
+-}
+-#endif
+
+ static int conexant_init(struct hda_codec *codec)
+ {
+@@ -1575,7 +1566,6 @@
+ SND_PCI_QUIRK(0x103c, 0x30a5, "HP DV5200T/DV8000T", CXT5047_LAPTOP_HP),
+ SND_PCI_QUIRK(0x103c, 0x30b2, "HP DV2000T/DV3000T", CXT5047_LAPTOP),
+ SND_PCI_QUIRK(0x103c, 0x30b5, "HP DV2000Z", CXT5047_LAPTOP),
+- SND_PCI_QUIRK(0x103c, 0x30cf, "HP DV6700", CXT5047_LAPTOP),
+ SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba P100", CXT5047_LAPTOP_EAPD),
+ {}
+ };
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/pci/hda/patch_intelhdmi.c linux-2.6.29-rc3.owrt/sound/pci/hda/patch_intelhdmi.c
+--- linux-2.6.29.owrt/sound/pci/hda/patch_intelhdmi.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/pci/hda/patch_intelhdmi.c 2009-05-10 23:48:34.000000000 +0200
+@@ -49,6 +49,11 @@
+ {} /* terminator */
+ };
+
++static struct hda_verb pinout_disable_verb[] = {
++ {PIN_NID, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00},
++ {}
++};
++
+ static struct hda_verb unsolicited_response_verb[] = {
+ {PIN_NID, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN |
+ INTEL_HDMI_EVENT_TAG},
+@@ -243,6 +248,10 @@
+
+ static void hdmi_enable_output(struct hda_codec *codec)
+ {
++ /* Enable Audio InfoFrame Transmission */
++ hdmi_set_dip_index(codec, PIN_NID, 0x0, 0x0);
++ snd_hda_codec_write(codec, PIN_NID, 0, AC_VERB_SET_HDMI_DIP_XMIT,
++ AC_DIPXMIT_BEST);
+ /* Unmute */
+ if (get_wcaps(codec, PIN_NID) & AC_WCAP_OUT_AMP)
+ snd_hda_codec_write(codec, PIN_NID, 0,
+@@ -251,24 +260,17 @@
+ snd_hda_sequence_write(codec, pinout_enable_verb);
+ }
+
+-/*
+- * Enable Audio InfoFrame Transmission
+- */
+-static void hdmi_start_infoframe_trans(struct hda_codec *codec)
++static void hdmi_disable_output(struct hda_codec *codec)
+ {
+- hdmi_set_dip_index(codec, PIN_NID, 0x0, 0x0);
+- snd_hda_codec_write(codec, PIN_NID, 0, AC_VERB_SET_HDMI_DIP_XMIT,
+- AC_DIPXMIT_BEST);
+-}
++ snd_hda_sequence_write(codec, pinout_disable_verb);
++ if (get_wcaps(codec, PIN_NID) & AC_WCAP_OUT_AMP)
++ snd_hda_codec_write(codec, PIN_NID, 0,
++ AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
+
+-/*
+- * Disable Audio InfoFrame Transmission
+- */
+-static void hdmi_stop_infoframe_trans(struct hda_codec *codec)
+-{
+- hdmi_set_dip_index(codec, PIN_NID, 0x0, 0x0);
+- snd_hda_codec_write(codec, PIN_NID, 0, AC_VERB_SET_HDMI_DIP_XMIT,
+- AC_DIPXMIT_DISABLE);
++ /*
++ * FIXME: noises may arise when playing music after reloading the
++ * kernel module, until the next X restart or monitor repower.
++ */
+ }
+
+ static int hdmi_get_channel_count(struct hda_codec *codec)
+@@ -366,16 +368,11 @@
+ struct hdmi_audio_infoframe *ai)
+ {
+ u8 *params = (u8 *)ai;
+- u8 sum = 0;
+ int i;
+
+ hdmi_debug_dip_size(codec);
+ hdmi_clear_dip_buffers(codec); /* be paranoid */
+
+- for (i = 0; i < sizeof(ai); i++)
+- sum += params[i];
+- ai->checksum = - sum;
+-
+ hdmi_set_dip_index(codec, PIN_NID, 0x0, 0x0);
+ for (i = 0; i < sizeof(ai); i++)
+ hdmi_write_dip_byte(codec, PIN_NID, params[i]);
+@@ -422,16 +419,12 @@
+ /*
+ * CA defaults to 0 for basic stereo audio
+ */
+- if (channels <= 2)
++ if (!eld->eld_ver)
+ return 0;
+-
+- /*
+- * HDMI sink's ELD info cannot always be retrieved for now, e.g.
+- * in console or for audio devices. Assume the highest speakers
+- * configuration, to _not_ prohibit multi-channel audio playback.
+- */
+ if (!eld->spk_alloc)
+- eld->spk_alloc = 0xffff;
++ return 0;
++ if (channels <= 2)
++ return 0;
+
+ /*
+ * expand ELD's speaker allocation mask
+@@ -492,7 +485,6 @@
+ hdmi_setup_channel_mapping(codec, &ai);
+
+ hdmi_fill_audio_infoframe(codec, &ai);
+- hdmi_start_infoframe_trans(codec);
+ }
+
+
+@@ -570,7 +562,7 @@
+ {
+ struct intel_hdmi_spec *spec = codec->spec;
+
+- hdmi_stop_infoframe_trans(codec);
++ hdmi_disable_output(codec);
+
+ return snd_hda_multi_out_dig_close(codec, &spec->multiout);
+ }
+@@ -590,6 +582,8 @@
+
+ hdmi_setup_audio_infoframe(codec, substream);
+
++ hdmi_enable_output(codec);
++
+ return 0;
+ }
+
+@@ -634,7 +628,8 @@
+
+ static int intel_hdmi_init(struct hda_codec *codec)
+ {
+- hdmi_enable_output(codec);
++ /* disable audio output as early as possible */
++ hdmi_disable_output(codec);
+
+ snd_hda_sequence_write(codec, unsolicited_response_verb);
+
+@@ -684,7 +679,6 @@
+ { .id = 0x80862801, .name = "G45 DEVBLC", .patch = patch_intel_hdmi },
+ { .id = 0x80862802, .name = "G45 DEVCTG", .patch = patch_intel_hdmi },
+ { .id = 0x80862803, .name = "G45 DEVELK", .patch = patch_intel_hdmi },
+- { .id = 0x80862804, .name = "G45 DEVIBX", .patch = patch_intel_hdmi },
+ { .id = 0x10951392, .name = "SiI1392 HDMI", .patch = patch_intel_hdmi },
+ {} /* terminator */
+ };
+@@ -693,7 +687,6 @@
+ MODULE_ALIAS("snd-hda-codec-id:80862801");
+ MODULE_ALIAS("snd-hda-codec-id:80862802");
+ MODULE_ALIAS("snd-hda-codec-id:80862803");
+-MODULE_ALIAS("snd-hda-codec-id:80862804");
+ MODULE_ALIAS("snd-hda-codec-id:10951392");
+
+ MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/pci/hda/patch_realtek.c linux-2.6.29-rc3.owrt/sound/pci/hda/patch_realtek.c
+--- linux-2.6.29.owrt/sound/pci/hda/patch_realtek.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/pci/hda/patch_realtek.c 2009-05-10 23:48:34.000000000 +0200
+@@ -1037,7 +1037,6 @@
+ case 0x10ec0267:
+ case 0x10ec0268:
+ case 0x10ec0269:
+- case 0x10ec0272:
+ case 0x10ec0660:
+ case 0x10ec0662:
+ case 0x10ec0663:
+@@ -1066,7 +1065,6 @@
+ case 0x10ec0882:
+ case 0x10ec0883:
+ case 0x10ec0885:
+- case 0x10ec0887:
+ case 0x10ec0889:
+ snd_hda_codec_write(codec, 0x20, 0,
+ AC_VERB_SET_COEF_INDEX, 7);
+@@ -7014,15 +7012,12 @@
+ break;
+ case 0x106b1000: /* iMac 24 */
+ case 0x106b2800: /* AppleTV */
+- case 0x106b3e00: /* iMac 24 Aluminium */
+ board_config = ALC885_IMAC24;
+ break;
+- case 0x106b00a0: /* MacBookPro3,1 - Another revision */
+ case 0x106b00a1: /* Macbook (might be wrong - PCI SSID?) */
+ case 0x106b00a4: /* MacbookPro4,1 */
+ case 0x106b2c00: /* Macbook Pro rev3 */
+ case 0x106b3600: /* Macbook 3.1 */
+- case 0x106b3800: /* MacbookPro4,1 - latter revision */
+ board_config = ALC885_MBP3;
+ break;
+ default:
+@@ -8470,8 +8465,6 @@
+ ALC888_ACER_ASPIRE_4930G),
+ SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
+ ALC888_ACER_ASPIRE_4930G),
+- SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
+- ALC888_ACER_ASPIRE_4930G),
+ SND_PCI_QUIRK(0x1025, 0, "Acer laptop", ALC883_ACER), /* default Acer */
+ SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
+ SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG),
+@@ -8481,7 +8474,6 @@
+ SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),
+ SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
+ SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
+- SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
+ SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),
+ SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
+ SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
+@@ -8521,8 +8513,6 @@
+ SND_PCI_QUIRK(0x1558, 0, "Clevo laptop", ALC883_LAPTOP_EAPD),
+ SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
+ SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
+- SND_PCI_QUIRK(0x1734, 0x1107, "FSC AMILO Xi2550",
+- ALC883_FUJITSU_PI2515),
+ SND_PCI_QUIRK(0x1734, 0x1108, "Fujitsu AMILO Pi2515", ALC883_FUJITSU_PI2515),
+ SND_PCI_QUIRK(0x1734, 0x113d, "Fujitsu AMILO Xa3530",
+ ALC888_FUJITSU_XA3530),
+@@ -10557,7 +10547,6 @@
+ SND_PCI_QUIRK(0x103c, 0x1309, "HP xw4*00", ALC262_HP_BPC),
+ SND_PCI_QUIRK(0x103c, 0x130a, "HP xw6*00", ALC262_HP_BPC),
+ SND_PCI_QUIRK(0x103c, 0x130b, "HP xw8*00", ALC262_HP_BPC),
+- SND_PCI_QUIRK(0x103c, 0x170b, "HP xw*", ALC262_HP_BPC),
+ SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
+ SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF),
+ SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL),
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/pci/hda/patch_sigmatel.c linux-2.6.29-rc3.owrt/sound/pci/hda/patch_sigmatel.c
+--- linux-2.6.29.owrt/sound/pci/hda/patch_sigmatel.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/pci/hda/patch_sigmatel.c 2009-05-10 23:48:34.000000000 +0200
+@@ -1207,7 +1207,7 @@
+ "LFE Playback Volume",
+ "Side Playback Volume",
+ "Headphone Playback Volume",
+- "Headphone2 Playback Volume",
++ "Headphone Playback Volume",
+ "Speaker Playback Volume",
+ "External Speaker Playback Volume",
+ "Speaker2 Playback Volume",
+@@ -1221,7 +1221,7 @@
+ "LFE Playback Switch",
+ "Side Playback Switch",
+ "Headphone Playback Switch",
+- "Headphone2 Playback Switch",
++ "Headphone Playback Switch",
+ "Speaker Playback Switch",
+ "External Speaker Playback Switch",
+ "Speaker2 Playback Switch",
+@@ -1799,13 +1799,11 @@
+ SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f2,
+ "HP dv5", STAC_HP_M4),
+ SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f4,
+- "HP dv7", STAC_HP_DV5),
++ "HP dv7", STAC_HP_M4),
+ SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f7,
+ "HP dv4", STAC_HP_DV5),
+ SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30fc,
+ "HP dv7", STAC_HP_M4),
+- SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3600,
+- "HP dv5", STAC_HP_DV5),
+ SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3603,
+ "HP dv5", STAC_HP_DV5),
+ SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a,
+@@ -2442,14 +2440,6 @@
+ stream_tag, format, substream);
+ }
+
+-static int stac92xx_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
+- struct hda_codec *codec,
+- struct snd_pcm_substream *substream)
+-{
+- struct sigmatel_spec *spec = codec->spec;
+- return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
+-}
+-
+
+ /*
+ * Analog capture callbacks
+@@ -2494,8 +2484,7 @@
+ .ops = {
+ .open = stac92xx_dig_playback_pcm_open,
+ .close = stac92xx_dig_playback_pcm_close,
+- .prepare = stac92xx_dig_playback_pcm_prepare,
+- .cleanup = stac92xx_dig_playback_pcm_cleanup
++ .prepare = stac92xx_dig_playback_pcm_prepare
+ },
+ };
+
+@@ -2550,8 +2539,6 @@
+
+ info->name = "STAC92xx Analog";
+ info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_playback;
+- info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
+- spec->multiout.dac_nids[0];
+ info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_analog_capture;
+ info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
+ info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = spec->num_adcs;
+@@ -3516,7 +3503,6 @@
+ if (! spec->autocfg.line_outs)
+ return 0; /* can't find valid pin config */
+
+-#if 0 /* FIXME: temporarily disabled */
+ /* If we have no real line-out pin and multiple hp-outs, HPs should
+ * be set up as multi-channel outputs.
+ */
+@@ -3536,7 +3522,6 @@
+ spec->autocfg.line_out_type = AUTO_PIN_HP_OUT;
+ spec->autocfg.hp_outs = 0;
+ }
+-#endif /* FIXME: temporarily disabled */
+ if (spec->autocfg.mono_out_pin) {
+ int dir = get_wcaps(codec, spec->autocfg.mono_out_pin) &
+ (AC_WCAP_OUT_AMP | AC_WCAP_IN_AMP);
+@@ -4991,7 +4976,7 @@
+ case STAC_DELL_M4_3:
+ spec->num_dmics = 1;
+ spec->num_smuxes = 0;
+- spec->num_dmuxes = 1;
++ spec->num_dmuxes = 0;
+ break;
+ default:
+ spec->num_dmics = STAC92HD71BXX_NUM_DMICS;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/pci/intel8x0.c linux-2.6.29-rc3.owrt/sound/pci/intel8x0.c
+--- linux-2.6.29.owrt/sound/pci/intel8x0.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/pci/intel8x0.c 2009-05-10 23:48:34.000000000 +0200
+@@ -617,7 +617,7 @@
+ int time = 100;
+ if (chip->buggy_semaphore)
+ return 0; /* just ignore ... */
+- while (--time && (igetdword(chip, ICHREG(ALI_CAS)) & ALI_CAS_SEM_BUSY))
++ while (time-- && (igetdword(chip, ICHREG(ALI_CAS)) & ALI_CAS_SEM_BUSY))
+ udelay(1);
+ if (! time && ! chip->in_ac97_init)
+ snd_printk(KERN_WARNING "ali_codec_semaphore timeout\n");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/pci/mixart/mixart.c linux-2.6.29-rc3.owrt/sound/pci/mixart/mixart.c
+--- linux-2.6.29.owrt/sound/pci/mixart/mixart.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/pci/mixart/mixart.c 2009-05-10 23:48:34.000000000 +0200
+@@ -607,7 +607,6 @@
+ /* set the format to the board */
+ err = mixart_set_format(stream, format);
+ if(err < 0) {
+- mutex_unlock(&mgr->setup_mutex);
+ return err;
+ }
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/pci/oxygen/virtuoso.c linux-2.6.29-rc3.owrt/sound/pci/oxygen/virtuoso.c
+--- linux-2.6.29.owrt/sound/pci/oxygen/virtuoso.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/pci/oxygen/virtuoso.c 2009-05-10 23:48:34.000000000 +0200
+@@ -26,7 +26,7 @@
+ * SPI 0 -> 1st PCM1796 (front)
+ * SPI 1 -> 2nd PCM1796 (surround)
+ * SPI 2 -> 3rd PCM1796 (center/LFE)
+- * SPI 4 -> 4th PCM1796 (back)
++ * SPI 4 -> 4th PCM1796 (back) and EEPROM self-destruct (do not use!)
+ *
+ * GPIO 2 -> M0 of CS5381
+ * GPIO 3 -> M1 of CS5381
+@@ -207,6 +207,12 @@
+ static inline void pcm1796_write_spi(struct oxygen *chip, unsigned int codec,
+ u8 reg, u8 value)
+ {
++ /*
++ * We don't want to do writes on SPI 4 because the EEPROM, which shares
++ * the same pin, might get confused and broken. We'd better take care
++ * that the driver works with the default register values ...
++ */
++#if 0
+ /* maps ALSA channel pair number to SPI output */
+ static const u8 codec_map[4] = {
+ 0, 1, 2, 4
+@@ -217,6 +223,7 @@
+ (codec_map[codec] << OXYGEN_SPI_CODEC_SHIFT) |
+ OXYGEN_SPI_CEN_LATCH_CLOCK_HI,
+ (reg << 8) | value);
++#endif
+ }
+
+ static inline void pcm1796_write_i2c(struct oxygen *chip, unsigned int codec,
+@@ -750,6 +757,9 @@
+
+ static int xonar_d2_control_filter(struct snd_kcontrol_new *template)
+ {
++ if (!strncmp(template->name, "Master Playback ", 16))
++ /* disable volume/mute because they would require SPI writes */
++ return 1;
+ if (!strncmp(template->name, "CD Capture ", 11))
+ /* CD in is actually connected to the video in pin */
+ template->private_value ^= AC97_CD ^ AC97_VIDEO;
+@@ -840,9 +850,8 @@
+ .dac_volume_min = 0x0f,
+ .dac_volume_max = 0xff,
+ .misc_flags = OXYGEN_MISC_MIDI,
+- .function_flags = OXYGEN_FUNCTION_SPI |
+- OXYGEN_FUNCTION_ENABLE_SPI_4_5,
+- .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
++ .function_flags = OXYGEN_FUNCTION_SPI,
++ .dac_i2s_format = OXYGEN_I2S_FORMAT_I2S,
+ .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/pci/pcxhr/pcxhr.h linux-2.6.29-rc3.owrt/sound/pci/pcxhr/pcxhr.h
+--- linux-2.6.29.owrt/sound/pci/pcxhr/pcxhr.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/pci/pcxhr/pcxhr.h 2009-05-10 23:48:34.000000000 +0200
+@@ -97,12 +97,12 @@
+ int capture_chips;
+ int fw_file_set;
+ int firmware_num;
+- unsigned int is_hr_stereo:1;
+- unsigned int board_has_aes1:1; /* if 1 board has AES1 plug and SRC */
+- unsigned int board_has_analog:1; /* if 0 the board is digital only */
+- unsigned int board_has_mic:1; /* if 1 the board has microphone input */
+- unsigned int board_aes_in_192k:1;/* if 1 the aes input plugs do support 192kHz */
+- unsigned int mono_capture:1; /* if 1 the board does mono capture */
++ int is_hr_stereo:1;
++ int board_has_aes1:1; /* if 1 board has AES1 plug and SRC */
++ int board_has_analog:1; /* if 0 the board is digital only */
++ int board_has_mic:1; /* if 1 the board has microphone input */
++ int board_aes_in_192k:1;/* if 1 the aes input plugs do support 192kHz */
++ int mono_capture:1; /* if 1 the board does mono capture */
+
+ struct snd_dma_buffer hostport;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/soc/atmel/atmel_ssc_dai.c linux-2.6.29-rc3.owrt/sound/soc/atmel/atmel_ssc_dai.c
+--- linux-2.6.29.owrt/sound/soc/atmel/atmel_ssc_dai.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/soc/atmel/atmel_ssc_dai.c 2009-05-10 23:48:34.000000000 +0200
+@@ -10,7 +10,7 @@
+ * Based on at91-ssc.c by
+ * Frank Mandarino <fmandarino@endrelia.com>
+ * Based on pxa2xx Platform drivers by
+- * Liam Girdwood <lrg@slimlogic.co.uk>
++ * Liam Girdwood <liam.girdwood@wolfsonmicro.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/soc/atmel/atmel_ssc_dai.h linux-2.6.29-rc3.owrt/sound/soc/atmel/atmel_ssc_dai.h
+--- linux-2.6.29.owrt/sound/soc/atmel/atmel_ssc_dai.h 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/soc/atmel/atmel_ssc_dai.h 2009-05-10 23:48:34.000000000 +0200
+@@ -10,7 +10,7 @@
+ * Based on at91-ssc.c by
+ * Frank Mandarino <fmandarino@endrelia.com>
+ * Based on pxa2xx Platform drivers by
+- * Liam Girdwood <lrg@slimlogic.co.uk>
++ * Liam Girdwood <liam.girdwood@wolfsonmicro.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/soc/codecs/tlv320aic3x.c linux-2.6.29-rc3.owrt/sound/soc/codecs/tlv320aic3x.c
+--- linux-2.6.29.owrt/sound/soc/codecs/tlv320aic3x.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/soc/codecs/tlv320aic3x.c 2009-05-10 23:48:34.000000000 +0200
+@@ -165,13 +165,10 @@
+ struct snd_ctl_elem_value *ucontrol)
+ {
+ struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol);
+- struct soc_mixer_control *mc =
+- (struct soc_mixer_control *)kcontrol->private_value;
+- unsigned int reg = mc->reg;
+- unsigned int shift = mc->shift;
+- int max = mc->max;
+- unsigned int mask = (1 << fls(max)) - 1;
+- unsigned int invert = mc->invert;
++ int reg = kcontrol->private_value & 0xff;
++ int shift = (kcontrol->private_value >> 8) & 0x0f;
++ int mask = (kcontrol->private_value >> 16) & 0xff;
++ int invert = (kcontrol->private_value >> 24) & 0x01;
+ unsigned short val, val_mask;
+ int ret;
+ struct snd_soc_dapm_path *path;
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/soc/codecs/wm8350.c linux-2.6.29-rc3.owrt/sound/soc/codecs/wm8350.c
+--- linux-2.6.29.owrt/sound/soc/codecs/wm8350.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/soc/codecs/wm8350.c 2009-05-10 23:48:34.000000000 +0200
+@@ -3,7 +3,7 @@
+ *
+ * Copyright (C) 2007, 2008 Wolfson Microelectronics PLC.
+ *
+- * Author: Liam Girdwood <lrg@slimlogic.co.uk>
++ * Author: Liam Girdwood <lg@opensource.wolfsonmicro.com>
+ *
+ * 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
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/soc/codecs/wm8753.c linux-2.6.29-rc3.owrt/sound/soc/codecs/wm8753.c
+--- linux-2.6.29.owrt/sound/soc/codecs/wm8753.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/soc/codecs/wm8753.c 2009-05-10 23:48:34.000000000 +0200
+@@ -1451,14 +1451,7 @@
+ },
+ };
+
+-struct snd_soc_dai wm8753_dai[] = {
+- {
+- .name = "WM8753 DAI 0",
+- },
+- {
+- .name = "WM8753 DAI 1",
+- },
+-};
++struct snd_soc_dai wm8753_dai[2];
+ EXPORT_SYMBOL_GPL(wm8753_dai);
+
+ static void wm8753_set_dai_mode(struct snd_soc_codec *codec, unsigned int mode)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/soc/codecs/wm8990.c linux-2.6.29-rc3.owrt/sound/soc/codecs/wm8990.c
+--- linux-2.6.29.owrt/sound/soc/codecs/wm8990.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/soc/codecs/wm8990.c 2009-05-10 23:48:34.000000000 +0200
+@@ -2,7 +2,8 @@
+ * wm8990.c -- WM8990 ALSA Soc Audio driver
+ *
+ * Copyright 2008 Wolfson Microelectronics PLC.
+- * Author: Liam Girdwood <lrg@slimlogic.co.uk>
++ * Author: Liam Girdwood
++ * lg@opensource.wolfsonmicro.com or linux@wolfsonmicro.com
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+@@ -176,9 +177,7 @@
+ struct snd_ctl_elem_value *ucontrol)
+ {
+ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
+- struct soc_mixer_control *mc =
+- (struct soc_mixer_control *)kcontrol->private_value;
+- int reg = mc->reg;
++ int reg = kcontrol->private_value & 0xff;
+ int ret;
+ u16 val;
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/soc/omap/omap-mcbsp.c linux-2.6.29-rc3.owrt/sound/soc/omap/omap-mcbsp.c
+--- linux-2.6.29.owrt/sound/soc/omap/omap-mcbsp.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/soc/omap/omap-mcbsp.c 2009-05-10 23:48:34.000000000 +0200
+@@ -302,10 +302,6 @@
+ regs->spcr1 |= RINTM(3);
+ regs->rcr2 |= RFIG;
+ regs->xcr2 |= XFIG;
+- if (cpu_is_omap2430() || cpu_is_omap34xx()) {
+- regs->xccr = DXENDLY(1) | XDMAEN;
+- regs->rccr = RFULL_CYCLE | RDMAEN;
+- }
+
+ switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
+ case SND_SOC_DAIFMT_I2S:
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/soc/omap/omap-pcm.c linux-2.6.29-rc3.owrt/sound/soc/omap/omap-pcm.c
+--- linux-2.6.29.owrt/sound/soc/omap/omap-pcm.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/soc/omap/omap-pcm.c 2009-05-10 23:48:34.000000000 +0200
+@@ -175,10 +175,9 @@
+ {
+ struct snd_pcm_runtime *runtime = substream->runtime;
+ struct omap_runtime_data *prtd = runtime->private_data;
+- unsigned long flags;
+ int ret = 0;
+
+- spin_lock_irqsave(&prtd->lock, flags);
++ spin_lock_irq(&prtd->lock);
+ switch (cmd) {
+ case SNDRV_PCM_TRIGGER_START:
+ case SNDRV_PCM_TRIGGER_RESUME:
+@@ -196,7 +195,7 @@
+ default:
+ ret = -EINVAL;
+ }
+- spin_unlock_irqrestore(&prtd->lock, flags);
++ spin_unlock_irq(&prtd->lock);
+
+ return ret;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/soc/omap/sdp3430.c linux-2.6.29-rc3.owrt/sound/soc/omap/sdp3430.c
+--- linux-2.6.29.owrt/sound/soc/omap/sdp3430.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/soc/omap/sdp3430.c 2009-05-10 23:48:34.000000000 +0200
+@@ -91,7 +91,7 @@
+ };
+
+ /* Audio machine driver */
+-static struct snd_soc_card snd_soc_sdp3430 = {
++static struct snd_soc_machine snd_soc_machine_sdp3430 = {
+ .name = "SDP3430",
+ .platform = &omap_soc_platform,
+ .dai_link = &sdp3430_dai,
+@@ -100,7 +100,7 @@
+
+ /* Audio subsystem */
+ static struct snd_soc_device sdp3430_snd_devdata = {
+- .card = &snd_soc_sdp3430,
++ .machine = &snd_soc_machine_sdp3430,
+ .codec_dev = &soc_codec_dev_twl4030,
+ };
+
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/soc/soc-core.c linux-2.6.29-rc3.owrt/sound/soc/soc-core.c
+--- linux-2.6.29.owrt/sound/soc/soc-core.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/soc/soc-core.c 2009-05-10 23:48:34.000000000 +0200
+@@ -1385,10 +1385,7 @@
+
+ mutex_lock(&codec->mutex);
+ #ifdef CONFIG_SND_SOC_AC97_BUS
+- /* Only instantiate AC97 if not already done by the adaptor
+- * for the generic AC97 subsystem.
+- */
+- if (ac97 && strcmp(codec->name, "AC97") != 0) {
++ if (ac97) {
+ ret = soc_ac97_dev_register(codec);
+ if (ret < 0) {
+ printk(KERN_ERR "asoc: AC97 device register failed\n");
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/usb/usbaudio.c linux-2.6.29-rc3.owrt/sound/usb/usbaudio.c
+--- linux-2.6.29.owrt/sound/usb/usbaudio.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/usb/usbaudio.c 2009-05-10 23:48:34.000000000 +0200
+@@ -2524,6 +2524,7 @@
+ * build the rate table and bitmap flags
+ */
+ int r, idx;
++ unsigned int nonzero_rates = 0;
+
+ fp->rate_table = kmalloc(sizeof(int) * nr_rates, GFP_KERNEL);
+ if (fp->rate_table == NULL) {
+@@ -2531,27 +2532,24 @@
+ return -1;
+ }
+
+- fp->nr_rates = 0;
+- fp->rate_min = fp->rate_max = 0;
++ fp->nr_rates = nr_rates;
++ fp->rate_min = fp->rate_max = combine_triple(&fmt[8]);
+ for (r = 0, idx = offset + 1; r < nr_rates; r++, idx += 3) {
+ unsigned int rate = combine_triple(&fmt[idx]);
+- if (!rate)
+- continue;
+ /* C-Media CM6501 mislabels its 96 kHz altsetting */
+ if (rate == 48000 && nr_rates == 1 &&
+- (chip->usb_id == USB_ID(0x0d8c, 0x0201) ||
+- chip->usb_id == USB_ID(0x0d8c, 0x0102)) &&
++ chip->usb_id == USB_ID(0x0d8c, 0x0201) &&
+ fp->altsetting == 5 && fp->maxpacksize == 392)
+ rate = 96000;
+- fp->rate_table[fp->nr_rates] = rate;
+- if (!fp->rate_min || rate < fp->rate_min)
++ fp->rate_table[r] = rate;
++ nonzero_rates |= rate;
++ if (rate < fp->rate_min)
+ fp->rate_min = rate;
+- if (!fp->rate_max || rate > fp->rate_max)
++ else if (rate > fp->rate_max)
+ fp->rate_max = rate;
+ fp->rates |= snd_pcm_rate_to_rate_bit(rate);
+- fp->nr_rates++;
+ }
+- if (!fp->nr_rates) {
++ if (!nonzero_rates) {
+ hwc_debug("All rates were zero. Skipping format!\n");
+ return -1;
+ }
+@@ -2968,7 +2966,6 @@
+ return -EINVAL;
+ }
+ alts = &iface->altsetting[fp->altset_idx];
+- fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize);
+ usb_set_interface(chip->dev, fp->iface, 0);
+ init_usb_pitch(chip->dev, fp->iface, alts, fp);
+ init_usb_sample_rate(chip->dev, fp->iface, alts, fp, fp->rate_max);
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/sound/usb/usbmidi.c linux-2.6.29-rc3.owrt/sound/usb/usbmidi.c
+--- linux-2.6.29.owrt/sound/usb/usbmidi.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/sound/usb/usbmidi.c 2009-05-10 23:48:34.000000000 +0200
+@@ -1625,7 +1625,6 @@
+ }
+
+ ep_info.out_ep = get_endpoint(hostif, 2)->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
+- ep_info.out_interval = 0;
+ ep_info.out_cables = endpoint->out_cables & 0x5555;
+ err = snd_usbmidi_out_endpoint_create(umidi, &ep_info, &umidi->endpoints[0]);
+ if (err < 0)
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/virt/kvm/iommu.c linux-2.6.29-rc3.owrt/virt/kvm/iommu.c
+--- linux-2.6.29.owrt/virt/kvm/iommu.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/virt/kvm/iommu.c 2009-05-10 23:48:34.000000000 +0200
+@@ -73,13 +73,14 @@
+ {
+ int i, r = 0;
+
++ down_read(&kvm->slots_lock);
+ for (i = 0; i < kvm->nmemslots; i++) {
+ r = kvm_iommu_map_pages(kvm, kvm->memslots[i].base_gfn,
+ kvm->memslots[i].npages);
+ if (r)
+ break;
+ }
+-
++ up_read(&kvm->slots_lock);
+ return r;
+ }
+
+@@ -189,11 +190,12 @@
+ static int kvm_iommu_unmap_memslots(struct kvm *kvm)
+ {
+ int i;
+-
++ down_read(&kvm->slots_lock);
+ for (i = 0; i < kvm->nmemslots; i++) {
+ kvm_iommu_put_pages(kvm, kvm->memslots[i].base_gfn,
+ kvm->memslots[i].npages);
+ }
++ up_read(&kvm->slots_lock);
+
+ return 0;
+ }
+diff -ruN --exclude='*.rej' --exclude='*.orig' linux-2.6.29.owrt/virt/kvm/kvm_main.c linux-2.6.29-rc3.owrt/virt/kvm/kvm_main.c
+--- linux-2.6.29.owrt/virt/kvm/kvm_main.c 2009-05-10 22:04:39.000000000 +0200
++++ linux-2.6.29-rc3.owrt/virt/kvm/kvm_main.c 2009-05-10 23:48:34.000000000 +0200
+@@ -173,6 +173,7 @@
+ assigned_dev->host_irq_disabled = false;
+ }
+ mutex_unlock(&assigned_dev->kvm->lock);
++ kvm_put_kvm(assigned_dev->kvm);
+ }
+
+ static irqreturn_t kvm_assigned_dev_intr(int irq, void *dev_id)
+@@ -180,6 +181,8 @@
+ struct kvm_assigned_dev_kernel *assigned_dev =
+ (struct kvm_assigned_dev_kernel *) dev_id;
+
++ kvm_get_kvm(assigned_dev->kvm);
++
+ schedule_work(&assigned_dev->interrupt_work);
+
+ disable_irq_nosync(irq);
+@@ -210,7 +213,6 @@
+ }
+ }
+
+-/* The function implicit hold kvm->lock mutex due to cancel_work_sync() */
+ static void kvm_free_assigned_irq(struct kvm *kvm,
+ struct kvm_assigned_dev_kernel *assigned_dev)
+ {
+@@ -226,24 +228,11 @@
+ if (!assigned_dev->irq_requested_type)
+ return;
+
+- /*
+- * In kvm_free_device_irq, cancel_work_sync return true if:
+- * 1. work is scheduled, and then cancelled.
+- * 2. work callback is executed.
+- *
+- * The first one ensured that the irq is disabled and no more events
+- * would happen. But for the second one, the irq may be enabled (e.g.
+- * for MSI). So we disable irq here to prevent further events.
+- *
+- * Notice this maybe result in nested disable if the interrupt type is
+- * INTx, but it's OK for we are going to free it.
+- *
+- * If this function is a part of VM destroy, please ensure that till
+- * now, the kvm state is still legal for probably we also have to wait
+- * interrupt_work done.
+- */
+- disable_irq_nosync(assigned_dev->host_irq);
+- cancel_work_sync(&assigned_dev->interrupt_work);
++ if (cancel_work_sync(&assigned_dev->interrupt_work))
++ /* We had pending work. That means we will have to take
++ * care of kvm_put_kvm.
++ */
++ kvm_put_kvm(kvm);
+
+ free_irq(assigned_dev->host_irq, (void *)assigned_dev);
+
+@@ -296,8 +285,8 @@
+
+ if (irqchip_in_kernel(kvm)) {
+ if (!msi2intx &&
+- (adev->irq_requested_type & KVM_ASSIGNED_DEV_HOST_MSI)) {
+- free_irq(adev->host_irq, (void *)adev);
++ adev->irq_requested_type & KVM_ASSIGNED_DEV_HOST_MSI) {
++ free_irq(adev->host_irq, (void *)kvm);
+ pci_disable_msi(adev->dev);
+ }
+
+@@ -466,7 +455,6 @@
+ struct kvm_assigned_dev_kernel *match;
+ struct pci_dev *dev;
+
+- down_read(&kvm->slots_lock);
+ mutex_lock(&kvm->lock);
+
+ match = kvm_find_assigned_dev(&kvm->arch.assigned_dev_head,
+@@ -528,7 +516,6 @@
+
+ out:
+ mutex_unlock(&kvm->lock);
+- up_read(&kvm->slots_lock);
+ return r;
+ out_list_del:
+ list_del(&match->list);
+@@ -540,7 +527,6 @@
+ out_free:
+ kfree(match);
+ mutex_unlock(&kvm->lock);
+- up_read(&kvm->slots_lock);
+ return r;
+ }
+ #endif
+@@ -803,19 +789,11 @@
+ return young;
+ }
+
+-static void kvm_mmu_notifier_release(struct mmu_notifier *mn,
+- struct mm_struct *mm)
+-{
+- struct kvm *kvm = mmu_notifier_to_kvm(mn);
+- kvm_arch_flush_shadow(kvm);
+-}
+-
+ static const struct mmu_notifier_ops kvm_mmu_notifier_ops = {
+ .invalidate_page = kvm_mmu_notifier_invalidate_page,
+ .invalidate_range_start = kvm_mmu_notifier_invalidate_range_start,
+ .invalidate_range_end = kvm_mmu_notifier_invalidate_range_end,
+ .clear_flush_young = kvm_mmu_notifier_clear_flush_young,
+- .release = kvm_mmu_notifier_release,
+ };
+ #endif /* CONFIG_MMU_NOTIFIER && KVM_ARCH_WANT_MMU_NOTIFIER */
+
+@@ -905,7 +883,6 @@
+ {
+ struct mm_struct *mm = kvm->mm;
+
+- kvm_arch_sync_events(kvm);
+ spin_lock(&kvm_lock);
+ list_del(&kvm->vm_list);
+ spin_unlock(&kvm_lock);
diff --git a/target/linux/s3c24xx/patches-2.6.29/001-merge-openmoko.patch b/target/linux/s3c24xx/patches-2.6.29/001-merge-openmoko.patch
new file mode 100644
index 0000000000..59ce604ea4
--- /dev/null
+++ b/target/linux/s3c24xx/patches-2.6.29/001-merge-openmoko.patch
@@ -0,0 +1,96426 @@
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/include/asm/fiq.h linux-2.6.29-rc3.owrt.om/arch/arm/include/asm/fiq.h
+--- linux-2.6.29-rc3.owrt/arch/arm/include/asm/fiq.h 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/include/asm/fiq.h 2009-05-10 22:27:59.000000000 +0200
+@@ -29,8 +29,9 @@
+ extern int claim_fiq(struct fiq_handler *f);
+ extern void release_fiq(struct fiq_handler *f);
+ extern void set_fiq_handler(void *start, unsigned int length);
+-extern void set_fiq_regs(struct pt_regs *regs);
+-extern void get_fiq_regs(struct pt_regs *regs);
++extern void set_fiq_c_handler(void (*handler)(void));
++extern void __attribute__((naked)) set_fiq_regs(struct pt_regs *regs);
++extern void __attribute__((naked)) get_fiq_regs(struct pt_regs *regs);
+ extern void enable_fiq(int fiq);
+ extern void disable_fiq(int fiq);
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/include/asm/hardware/tzic-sp890.h linux-2.6.29-rc3.owrt.om/arch/arm/include/asm/hardware/tzic-sp890.h
+--- linux-2.6.29-rc3.owrt/arch/arm/include/asm/hardware/tzic-sp890.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/include/asm/hardware/tzic-sp890.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,22 @@
++#ifndef __SP890_TZIC_H__
++#define __SP890_TZIC_H__
++
++#define SP890_TZIC_UNLOCK_MAGIC (0x0ACCE550)
++
++#define SP890_TZIC_FIQSTATUS 0
++#define SP890_TZIC_RAWINTR 4
++#define SP890_TZIC_INTSELECT 8
++#define SP890_TZIC_FIQENABLE 0xc
++#define SP890_TZIC_FIQENCLEAR 0x10
++#define SP890_TZIC_FIQBYPASS 0x14
++#define SP890_TZIC_PROTECTION 0x18
++#define SP890_TZIC_LOCK 0x1c
++#define SP890_TZIC_LOCKSTATUS 0x20
++#define SP890_TZIC_ITCR 0x300
++#define SP890_TZIC_ITIP1 0x304
++#define SP890_TZIC_ITIP2 0x308
++#define SP890_TZIC_ITOP1 0x30c
++#define SP890_TZIC_ITOP2 0x310
++#define SP890_TZIC_PERIPHIDO 0xfe0
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/include/asm/irqflags.h linux-2.6.29-rc3.owrt.om/arch/arm/include/asm/irqflags.h
+--- linux-2.6.29-rc3.owrt/arch/arm/include/asm/irqflags.h 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/include/asm/irqflags.h 2009-05-10 22:27:59.000000000 +0200
+@@ -5,6 +5,16 @@
+
+ #include <asm/ptrace.h>
+
++#ifdef CONFIG_FIND_IRQ_BLOCKERS
++void iblock_start(void);
++void iblock_end(void);
++void iblock_end_maybe(unsigned long flags);
++#else
++#define iblock_start()
++#define iblock_end()
++#define iblock_end_maybe(x)
++#endif
++
+ /*
+ * CPU interrupt mask handling.
+ */
+@@ -31,6 +41,7 @@
+ #define raw_local_irq_save(x) \
+ ({ \
+ unsigned long temp; \
++ iblock_start(); \
+ (void) (&temp == &x); \
+ __asm__ __volatile__( \
+ "mrs %0, cpsr @ local_irq_save\n" \
+@@ -47,6 +58,7 @@
+ #define raw_local_irq_enable() \
+ ({ \
+ unsigned long temp; \
++ iblock_end(); \
+ __asm__ __volatile__( \
+ "mrs %0, cpsr @ local_irq_enable\n" \
+ " bic %0, %0, #128\n" \
+@@ -62,6 +74,7 @@
+ #define raw_local_irq_disable() \
+ ({ \
+ unsigned long temp; \
++ iblock_start(); \
+ __asm__ __volatile__( \
+ "mrs %0, cpsr @ local_irq_disable\n" \
+ " orr %0, %0, #128\n" \
+@@ -117,11 +130,12 @@
+ * restore saved IRQ & FIQ state
+ */
+ #define raw_local_irq_restore(x) \
++ ({ iblock_end_maybe(x); \
+ __asm__ __volatile__( \
+ "msr cpsr_c, %0 @ local_irq_restore\n" \
+ : \
+ : "r" (x) \
+- : "memory", "cc")
++ : "memory", "cc"); })
+
+ #define raw_irqs_disabled_flags(flags) \
+ ({ \
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/include/asm/kexec.h linux-2.6.29-rc3.owrt.om/arch/arm/include/asm/kexec.h
+--- linux-2.6.29-rc3.owrt/arch/arm/include/asm/kexec.h 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/include/asm/kexec.h 2009-05-10 22:27:59.000000000 +0200
+@@ -1,8 +1,6 @@
+ #ifndef _ARM_KEXEC_H
+ #define _ARM_KEXEC_H
+
+-#ifdef CONFIG_KEXEC
+-
+ /* Maximum physical address we can use pages from */
+ #define KEXEC_SOURCE_MEMORY_LIMIT (-1UL)
+ /* Maximum address we can reach in physical address mode */
+@@ -14,6 +12,10 @@
+
+ #define KEXEC_ARCH KEXEC_ARCH_ARM
+
++#define KEXEC_BOOT_PARAMS_SIZE 1536
++
++#ifdef CONFIG_KEXEC
++
+ #define KEXEC_ARM_ATAGS_OFFSET 0x1000
+ #define KEXEC_ARM_ZIMAGE_OFFSET 0x8000
+
+@@ -29,3 +31,4 @@
+ #endif /* CONFIG_KEXEC */
+
+ #endif /* _ARM_KEXEC_H */
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/Kconfig linux-2.6.29-rc3.owrt.om/arch/arm/Kconfig
+--- linux-2.6.29-rc3.owrt/arch/arm/Kconfig 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/Kconfig 2009-05-10 22:27:59.000000000 +0200
+@@ -1086,7 +1086,8 @@
+
+ menu "CPU Power Management"
+
+-if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP || ARCH_IMX || ARCH_PXA)
++if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP || ARCH_IMX || ARCH_PXA || \
++ ARCH_S3C64XX)
+
+ source "drivers/cpufreq/Kconfig"
+
+@@ -1126,6 +1127,10 @@
+ default y
+ select CPU_FREQ_DEFAULT_GOV_USERSPACE
+
++config CPU_FREQ_S3C64XX
++ bool "CPUfreq support for S3C64xx CPUs"
++ depends on CPU_FREQ && CPU_S3C6410
++
+ endif
+
+ source "drivers/cpuidle/Kconfig"
+@@ -1305,6 +1310,8 @@
+
+ source "drivers/uwb/Kconfig"
+
++source "drivers/ar6000/Kconfig"
++
+ source "drivers/mmc/Kconfig"
+
+ source "drivers/memstick/Kconfig"
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/kernel/fiq.c linux-2.6.29-rc3.owrt.om/arch/arm/kernel/fiq.c
+--- linux-2.6.29-rc3.owrt/arch/arm/kernel/fiq.c 2009-05-10 22:08:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/kernel/fiq.c 2009-05-10 22:27:59.000000000 +0200
+@@ -8,6 +8,8 @@
+ *
+ * FIQ support re-written by Russell King to be more generic
+ *
++ * FIQ handler in C supoprt written by Andy Green <andy@openmoko.com>
++ *
+ * We now properly support a method by which the FIQ handlers can
+ * be stacked onto the vector. We still do not support sharing
+ * the FIQ vector itself.
+@@ -124,6 +126,83 @@
+ : "r" (&regs->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | FIQ_MODE));
+ }
+
++/* -------- FIQ handler in C ---------
++ *
++ * Major Caveats for using this
++ * ---------------------------
++ * *
++ * * 1) it CANNOT touch any vmalloc()'d memory, only memory
++ * that was kmalloc()'d. Static allocations in the monolithic kernel
++ * are kmalloc()'d so they are okay. You can touch memory-mapped IO, but
++ * the pointer for it has to have been stored in kmalloc'd memory. The
++ * reason for this is simple: every now and then Linux turns off interrupts
++ * and reorders the paging tables. If a FIQ happens during this time, the
++ * virtual memory space can be partly or entirely disordered or missing.
++ *
++ * 2) Because vmalloc() is used when a module is inserted, THIS FIQ
++ * ISR HAS TO BE IN THE MONOLITHIC KERNEL, not a module. But the way
++ * it is set up, you can all to enable and disable it from your module
++ * and intercommunicate with it through struct fiq_ipc
++ * fiq_ipc which you can define in
++ * asm/archfiq_ipc_type.h. The reason is the same as above, a
++ * FIQ could happen while even the ISR is not present in virtual memory
++ * space due to pagetables being changed at the time.
++ *
++ * 3) You can't call any Linux API code except simple macros
++ * - understand that FIQ can come in at any time, no matter what
++ * state of undress the kernel may privately be in, thinking it
++ * locked the door by turning off interrupts... FIQ is an
++ * unstoppable monster force (which is its value)
++ * - they are not vmalloc()'d memory safe
++ * - they might do crazy stuff like sleep: FIQ pisses fire and
++ * is not interested in 'sleep' that the weak seem to need
++ * - calling APIs from FIQ can re-enter un-renterable things
++ * - summary: you cannot interoperate with linux APIs directly in the FIQ ISR
++ *
++ * If you follow these rules, it is fantastic, an extremely powerful, solid,
++ * genuine hard realtime feature.
++ */
++
++static void (*current_fiq_c_isr)(void);
++#define FIQ_C_ISR_STACK_SIZE 256
++
++static void __attribute__((naked)) __jump_to_isr(void)
++{
++ asm __volatile__ ("mov pc, r8");
++}
++
++
++static void __attribute__((naked)) __actual_isr(void)
++{
++ asm __volatile__ (
++ "stmdb sp!, {r0-r12, lr};"
++ "mov fp, sp;"
++ );
++
++ current_fiq_c_isr();
++
++ asm __volatile__ (
++ "ldmia sp!, {r0-r12, lr};"
++ "subs pc, lr, #4;"
++ );
++}
++
++void set_fiq_c_handler(void (*isr)(void))
++{
++ struct pt_regs regs;
++
++ memset(&regs, 0, sizeof(regs));
++ regs.ARM_r8 = (unsigned long) __actual_isr;
++ regs.ARM_sp = 0xffff001c + FIQ_C_ISR_STACK_SIZE;
++
++ set_fiq_handler(__jump_to_isr, 4);
++
++ current_fiq_c_isr = isr;
++
++ set_fiq_regs(&regs);
++}
++/* -------- FIQ handler in C ---------*/
++
+ int claim_fiq(struct fiq_handler *f)
+ {
+ int ret = 0;
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/kernel/iblock.c linux-2.6.29-rc3.owrt.om/arch/arm/kernel/iblock.c
+--- linux-2.6.29-rc3.owrt/arch/arm/kernel/iblock.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/kernel/iblock.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,158 @@
++/*
++ *
++ * /sys/kernel/iblock/
++ * All times are in microseconds (us).
++ *
++ * - limit
++ * Interrupt blocking time reporting limit, in microseconds.
++ * 0 disables reporting. Auto-resets to zero after reporting.
++ *
++ * - max
++ * Maximum blocking time recorded. Reset to zero by writing anything.
++ *
++ * - test
++ * Force a delay with interrupts disabled.
++ *
++ */
++
++
++#include <linux/kernel.h>
++#include <linux/sysfs.h>
++#include <linux/kobject.h>
++#include <linux/device.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++#include <asm/irqflags.h>
++
++
++unsigned long s3c2410_gettimeoffset(void);
++
++
++static unsigned long iblock_t0;
++int iblock_limit;
++static int iblock_max;
++
++
++void iblock_start(void)
++{
++ unsigned long flags;
++
++ raw_local_save_flags(flags);
++ if (raw_irqs_disabled_flags(flags))
++ return;
++ iblock_t0 = s3c2410_gettimeoffset();
++}
++EXPORT_SYMBOL_GPL(iblock_start);
++
++void iblock_end(void)
++{
++ unsigned long flags;
++ unsigned long t, us;
++
++ raw_local_save_flags(flags);
++ if (!raw_irqs_disabled_flags(flags))
++ return;
++ if (!iblock_t0)
++ return;
++ t = s3c2410_gettimeoffset();
++ us = t-iblock_t0;
++ if (us > 40000000)
++ return;
++ if (us > iblock_max)
++ iblock_max = us;
++ if (!iblock_limit)
++ return;
++ if (us < iblock_limit)
++ return;
++// iblock_limit = 0;
++ printk(KERN_ERR "interrupts were disabled for %lu us !\n", us);
++// WARN_ON(1);
++}
++EXPORT_SYMBOL_GPL(iblock_end);
++
++void iblock_end_maybe(unsigned long flags)
++{
++ if (raw_irqs_disabled_flags(flags))
++ return;
++ iblock_end();
++}
++EXPORT_SYMBOL_GPL(iblock_end_maybe);
++
++static ssize_t limit_read(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ return sprintf(buf, "%u us\n", iblock_limit);
++}
++
++
++static ssize_t limit_write(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ unsigned long tmp;
++ char *end;
++
++ tmp = simple_strtoul(buf, &end, 0);
++ if (end == buf)
++ return -EINVAL;
++ iblock_limit = tmp;
++ return count;
++}
++
++
++static ssize_t max_read(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ return sprintf(buf, "%u us\n", iblock_max);
++}
++
++
++static ssize_t max_write(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ iblock_max = 0;
++ return count;
++}
++
++
++static ssize_t test_write(struct device *dev,
++ struct device_attribute *attr, const char *buf, size_t count)
++{
++ unsigned long tmp, flags;
++ char *end;
++
++ tmp = simple_strtoul(buf, &end, 0);
++ if (end == buf)
++ return -EINVAL;
++ local_irq_save(flags);
++ udelay(tmp);
++ local_irq_restore(flags);
++ return count;
++}
++
++
++static DEVICE_ATTR(limit, 0644, limit_read, limit_write);
++static DEVICE_ATTR(max, 0644, max_read, max_write);
++static DEVICE_ATTR(test, 0200, NULL, test_write);
++
++
++static struct attribute *sysfs_entries[] = {
++ &dev_attr_limit.attr,
++ &dev_attr_max.attr,
++ &dev_attr_test.attr,
++ NULL
++};
++
++
++static struct attribute_group attr_group = {
++ .name = "iblock",
++ .attrs = sysfs_entries,
++};
++
++
++static int __devinit iblock_init(void)
++{
++ return sysfs_create_group(kernel_kobj, &attr_group);
++}
++
++
++module_init(iblock_init);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/kernel/irq.c linux-2.6.29-rc3.owrt.om/arch/arm/kernel/irq.c
+--- linux-2.6.29-rc3.owrt/arch/arm/kernel/irq.c 2009-05-10 22:08:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/kernel/irq.c 2009-05-10 22:27:59.000000000 +0200
+@@ -104,6 +104,11 @@
+ .lock = SPIN_LOCK_UNLOCKED
+ };
+
++#ifdef CONFIG_FIND_IRQ_BLOCKERS
++extern int iblock_limit;
++unsigned long s3c2410_gettimeoffset(void);
++#endif
++
+ /*
+ * do_IRQ handles all hardware IRQ's. Decoded IRQs should not
+ * come via this function. Instead, they should provide their
+@@ -112,9 +117,15 @@
+ asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
+ {
+ struct pt_regs *old_regs = set_irq_regs(regs);
+-
++#ifdef CONFIG_FIND_IRQ_BLOCKERS
++ unsigned long us;
++#endif
+ irq_enter();
+
++#ifdef CONFIG_FIND_IRQ_BLOCKERS
++ us = s3c2410_gettimeoffset();
++#endif
++
+ /*
+ * Some hardware gives randomly wrong interrupts. Rather
+ * than crashing, do something sensible.
+@@ -124,6 +135,12 @@
+ else
+ generic_handle_irq(irq);
+
++#ifdef CONFIG_FIND_IRQ_BLOCKERS
++ us = s3c2410_gettimeoffset() - us;
++
++ if (iblock_limit && us > iblock_limit && us < 10000000)
++ printk(KERN_ERR "asm_do_IRQ(%u): %lu us\n", irq, us);
++#endif
+ /* AT91 specific workaround */
+ irq_finish(irq);
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/kernel/Makefile linux-2.6.29-rc3.owrt.om/arch/arm/kernel/Makefile
+--- linux-2.6.29-rc3.owrt/arch/arm/kernel/Makefile 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/kernel/Makefile 2009-05-10 22:27:59.000000000 +0200
+@@ -44,5 +44,6 @@
+
+ head-y := head$(MMUEXT).o
+ obj-$(CONFIG_DEBUG_LL) += debug.o
++obj-$(CONFIG_FIND_IRQ_BLOCKERS) += iblock.o
+
+ extra-y := $(head-y) init_task.o vmlinux.lds
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/kernel/vmlinux.lds.S linux-2.6.29-rc3.owrt.om/arch/arm/kernel/vmlinux.lds.S
+--- linux-2.6.29-rc3.owrt/arch/arm/kernel/vmlinux.lds.S 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/kernel/vmlinux.lds.S 2009-05-10 22:27:59.000000000 +0200
+@@ -106,6 +106,8 @@
+ *(.got) /* Global offset table */
+ }
+
++ NOTES
++
+ RODATA
+
+ _etext = .; /* End of text and rodata section */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/dma.c linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/dma.c
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/dma.c 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/dma.c 2009-05-10 22:27:59.000000000 +0200
+@@ -17,18 +17,20 @@
+ #include <linux/sysdev.h>
+ #include <linux/serial_core.h>
+
++#include <mach/map.h>
+ #include <mach/dma.h>
+
+ #include <plat/cpu.h>
+-#include <plat/dma.h>
++#include <plat/dma-plat.h>
+
+ #include <plat/regs-serial.h>
+ #include <mach/regs-gpio.h>
+ #include <plat/regs-ac97.h>
++#include <plat/regs-dma.h>
+ #include <mach/regs-mem.h>
+ #include <mach/regs-lcd.h>
+ #include <mach/regs-sdi.h>
+-#include <asm/plat-s3c24xx/regs-iis.h>
++#include <plat/regs-iis.h>
+ #include <plat/regs-spi.h>
+
+ static struct s3c24xx_dma_map __initdata s3c2410_dma_mappings[] = {
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/audio.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/audio.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/audio.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/audio.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,45 +0,0 @@
+-/* arch/arm/mach-s3c2410/include/mach/audio.h
+- *
+- * Copyright (c) 2004-2005 Simtec Electronics
+- * http://www.simtec.co.uk/products/SWLINUX/
+- * Ben Dooks <ben@simtec.co.uk>
+- *
+- * S3C24XX - Audio platfrom_device info
+- *
+- * 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.
+-*/
+-
+-#ifndef __ASM_ARCH_AUDIO_H
+-#define __ASM_ARCH_AUDIO_H __FILE__
+-
+-/* struct s3c24xx_iis_ops
+- *
+- * called from the s3c24xx audio core to deal with the architecture
+- * or the codec's setup and control.
+- *
+- * the pointer to itself is passed through in case the caller wants to
+- * embed this in an larger structure for easy reference to it's context.
+-*/
+-
+-struct s3c24xx_iis_ops {
+- struct module *owner;
+-
+- int (*startup)(struct s3c24xx_iis_ops *me);
+- void (*shutdown)(struct s3c24xx_iis_ops *me);
+- int (*suspend)(struct s3c24xx_iis_ops *me);
+- int (*resume)(struct s3c24xx_iis_ops *me);
+-
+- int (*open)(struct s3c24xx_iis_ops *me, struct snd_pcm_substream *strm);
+- int (*close)(struct s3c24xx_iis_ops *me, struct snd_pcm_substream *strm);
+- int (*prepare)(struct s3c24xx_iis_ops *me, struct snd_pcm_substream *strm, struct snd_pcm_runtime *rt);
+-};
+-
+-struct s3c24xx_platdata_iis {
+- const char *codec_clk;
+- struct s3c24xx_iis_ops *ops;
+- int (*match_dev)(struct device *dev);
+-};
+-
+-#endif /* __ASM_ARCH_AUDIO_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/dma.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/dma.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/dma.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/dma.h 2009-05-10 22:27:59.000000000 +0200
+@@ -3,7 +3,7 @@
+ * Copyright (C) 2003,2004,2006 Simtec Electronics
+ * Ben Dooks <ben@simtec.co.uk>
+ *
+- * Samsung S3C241XX DMA support
++ * Samsung S3C24XX DMA support
+ *
+ * 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
+@@ -13,8 +13,8 @@
+ #ifndef __ASM_ARCH_DMA_H
+ #define __ASM_ARCH_DMA_H __FILE__
+
++#include <plat/dma.h>
+ #include <linux/sysdev.h>
+-#include <mach/hardware.h>
+
+ #define MAX_DMA_TRANSFER_SIZE 0x100000 /* Data Unit is half word */
+
+@@ -55,9 +55,9 @@
+
+ /* we have 4 dma channels */
+ #ifndef CONFIG_CPU_S3C2443
+-#define S3C2410_DMA_CHANNELS (4)
++#define S3C_DMA_CHANNELS (4)
+ #else
+-#define S3C2410_DMA_CHANNELS (6)
++#define S3C_DMA_CHANNELS (6)
+ #endif
+
+ /* types */
+@@ -68,7 +68,6 @@
+ S3C2410_DMA_PAUSED
+ };
+
+-
+ /* enum s3c2410_dma_loadst
+ *
+ * This represents the state of the DMA engine, wrt to the loaded / running
+@@ -104,32 +103,6 @@
+ S3C2410_DMALOAD_1LOADED_1RUNNING,
+ };
+
+-enum s3c2410_dma_buffresult {
+- S3C2410_RES_OK,
+- S3C2410_RES_ERR,
+- S3C2410_RES_ABORT
+-};
+-
+-enum s3c2410_dmasrc {
+- S3C2410_DMASRC_HW, /* source is memory */
+- S3C2410_DMASRC_MEM /* source is hardware */
+-};
+-
+-/* enum s3c2410_chan_op
+- *
+- * operation codes passed to the DMA code by the user, and also used
+- * to inform the current channel owner of any changes to the system state
+-*/
+-
+-enum s3c2410_chan_op {
+- S3C2410_DMAOP_START,
+- S3C2410_DMAOP_STOP,
+- S3C2410_DMAOP_PAUSE,
+- S3C2410_DMAOP_RESUME,
+- S3C2410_DMAOP_FLUSH,
+- S3C2410_DMAOP_TIMEOUT, /* internal signal to handler */
+- S3C2410_DMAOP_STARTED, /* indicate channel started */
+-};
+
+ /* flags */
+
+@@ -137,19 +110,18 @@
+ * waiting for reloads */
+ #define S3C2410_DMAF_AUTOSTART (1<<1) /* auto-start if buffer queued */
+
++#define S3C2410_DMAF_CIRCULAR (0x00) /* circular enqueue not supp. */
++
+ /* dma buffer */
+
+-struct s3c2410_dma_client {
+- char *name;
+-};
++struct s3c2410_dma_buf;
+
+-/* s3c2410_dma_buf_s
++/* s3c2410_dma_buf
+ *
+ * internally used buffer structure to describe a queued or running
+ * buffer.
+ */
+
+-struct s3c2410_dma_buf;
+ struct s3c2410_dma_buf {
+ struct s3c2410_dma_buf *next;
+ int magic; /* magic */
+@@ -161,20 +133,6 @@
+
+ /* [1] is this updated for both recv/send modes? */
+
+-struct s3c2410_dma_chan;
+-
+-/* s3c2410_dma_cbfn_t
+- *
+- * buffer callback routine type
+-*/
+-
+-typedef void (*s3c2410_dma_cbfn_t)(struct s3c2410_dma_chan *,
+- void *buf, int size,
+- enum s3c2410_dma_buffresult result);
+-
+-typedef int (*s3c2410_dma_opfn_t)(struct s3c2410_dma_chan *,
+- enum s3c2410_chan_op );
+-
+ struct s3c2410_dma_stats {
+ unsigned long loads;
+ unsigned long timeout_longest;
+@@ -206,10 +164,10 @@
+
+ /* channel configuration */
+ enum s3c2410_dmasrc source;
++ enum dma_ch req_ch;
+ unsigned long dev_addr;
+ unsigned long load_timeout;
+ unsigned int flags; /* channel flags */
+- unsigned int hw_cfg; /* last hw config */
+
+ struct s3c24xx_dma_map *map; /* channel hw maps */
+
+@@ -236,213 +194,12 @@
+ struct sys_device dev;
+ };
+
+-/* the currently allocated channel information */
+-extern struct s3c2410_dma_chan s3c2410_chans[];
+-
+-/* note, we don't really use dma_device_t at the moment */
+ typedef unsigned long dma_device_t;
+
+-/* functions --------------------------------------------------------------- */
+-
+-/* s3c2410_dma_request
+- *
+- * request a dma channel exclusivley
+-*/
+-
+-extern int s3c2410_dma_request(unsigned int channel,
+- struct s3c2410_dma_client *, void *dev);
+-
+-
+-/* s3c2410_dma_ctrl
+- *
+- * change the state of the dma channel
+-*/
+-
+-extern int s3c2410_dma_ctrl(unsigned int channel, enum s3c2410_chan_op op);
+-
+-/* s3c2410_dma_setflags
+- *
+- * set the channel's flags to a given state
+-*/
+-
+-extern int s3c2410_dma_setflags(unsigned int channel,
+- unsigned int flags);
+-
+-/* s3c2410_dma_free
+- *
+- * free the dma channel (will also abort any outstanding operations)
+-*/
+-
+-extern int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *);
+-
+-/* s3c2410_dma_enqueue
+- *
+- * place the given buffer onto the queue of operations for the channel.
+- * The buffer must be allocated from dma coherent memory, or the Dcache/WB
+- * drained before the buffer is given to the DMA system.
+-*/
+-
+-extern int s3c2410_dma_enqueue(unsigned int channel, void *id,
+- dma_addr_t data, int size);
+-
+-/* s3c2410_dma_config
+- *
+- * configure the dma channel
+-*/
+-
+-extern int s3c2410_dma_config(unsigned int channel, int xferunit, int dcon);
+-
+-/* s3c2410_dma_devconfig
+- *
+- * configure the device we're talking to
+-*/
+-
+-extern int s3c2410_dma_devconfig(int channel, enum s3c2410_dmasrc source,
+- int hwcfg, unsigned long devaddr);
+-
+-/* s3c2410_dma_getposition
+- *
+- * get the position that the dma transfer is currently at
+-*/
+-
+-extern int s3c2410_dma_getposition(unsigned int channel,
+- dma_addr_t *src, dma_addr_t *dest);
+-
+-extern int s3c2410_dma_set_opfn(unsigned int, s3c2410_dma_opfn_t rtn);
+-extern int s3c2410_dma_set_buffdone_fn(unsigned int, s3c2410_dma_cbfn_t rtn);
+-
+-/* DMA Register definitions */
+-
+-#define S3C2410_DMA_DISRC (0x00)
+-#define S3C2410_DMA_DISRCC (0x04)
+-#define S3C2410_DMA_DIDST (0x08)
+-#define S3C2410_DMA_DIDSTC (0x0C)
+-#define S3C2410_DMA_DCON (0x10)
+-#define S3C2410_DMA_DSTAT (0x14)
+-#define S3C2410_DMA_DCSRC (0x18)
+-#define S3C2410_DMA_DCDST (0x1C)
+-#define S3C2410_DMA_DMASKTRIG (0x20)
+-#define S3C2412_DMA_DMAREQSEL (0x24)
+-#define S3C2443_DMA_DMAREQSEL (0x24)
+-
+-#define S3C2410_DISRCC_INC (1<<0)
+-#define S3C2410_DISRCC_APB (1<<1)
+-
+-#define S3C2410_DMASKTRIG_STOP (1<<2)
+-#define S3C2410_DMASKTRIG_ON (1<<1)
+-#define S3C2410_DMASKTRIG_SWTRIG (1<<0)
+-
+-#define S3C2410_DCON_DEMAND (0<<31)
+-#define S3C2410_DCON_HANDSHAKE (1<<31)
+-#define S3C2410_DCON_SYNC_PCLK (0<<30)
+-#define S3C2410_DCON_SYNC_HCLK (1<<30)
+-
+-#define S3C2410_DCON_INTREQ (1<<29)
+-
+-#define S3C2410_DCON_CH0_XDREQ0 (0<<24)
+-#define S3C2410_DCON_CH0_UART0 (1<<24)
+-#define S3C2410_DCON_CH0_SDI (2<<24)
+-#define S3C2410_DCON_CH0_TIMER (3<<24)
+-#define S3C2410_DCON_CH0_USBEP1 (4<<24)
+-
+-#define S3C2410_DCON_CH1_XDREQ1 (0<<24)
+-#define S3C2410_DCON_CH1_UART1 (1<<24)
+-#define S3C2410_DCON_CH1_I2SSDI (2<<24)
+-#define S3C2410_DCON_CH1_SPI (3<<24)
+-#define S3C2410_DCON_CH1_USBEP2 (4<<24)
+-
+-#define S3C2410_DCON_CH2_I2SSDO (0<<24)
+-#define S3C2410_DCON_CH2_I2SSDI (1<<24)
+-#define S3C2410_DCON_CH2_SDI (2<<24)
+-#define S3C2410_DCON_CH2_TIMER (3<<24)
+-#define S3C2410_DCON_CH2_USBEP3 (4<<24)
+-
+-#define S3C2410_DCON_CH3_UART2 (0<<24)
+-#define S3C2410_DCON_CH3_SDI (1<<24)
+-#define S3C2410_DCON_CH3_SPI (2<<24)
+-#define S3C2410_DCON_CH3_TIMER (3<<24)
+-#define S3C2410_DCON_CH3_USBEP4 (4<<24)
+-
+-#define S3C2410_DCON_SRCSHIFT (24)
+-#define S3C2410_DCON_SRCMASK (7<<24)
+-
+-#define S3C2410_DCON_BYTE (0<<20)
+-#define S3C2410_DCON_HALFWORD (1<<20)
+-#define S3C2410_DCON_WORD (2<<20)
+-
+-#define S3C2410_DCON_AUTORELOAD (0<<22)
+-#define S3C2410_DCON_NORELOAD (1<<22)
+-#define S3C2410_DCON_HWTRIG (1<<23)
+-
+-#ifdef CONFIG_CPU_S3C2440
+-#define S3C2440_DIDSTC_CHKINT (1<<2)
+-
+-#define S3C2440_DCON_CH0_I2SSDO (5<<24)
+-#define S3C2440_DCON_CH0_PCMIN (6<<24)
+-
+-#define S3C2440_DCON_CH1_PCMOUT (5<<24)
+-#define S3C2440_DCON_CH1_SDI (6<<24)
+-
+-#define S3C2440_DCON_CH2_PCMIN (5<<24)
+-#define S3C2440_DCON_CH2_MICIN (6<<24)
+-
+-#define S3C2440_DCON_CH3_MICIN (5<<24)
+-#define S3C2440_DCON_CH3_PCMOUT (6<<24)
+-#endif
+-
+-#ifdef CONFIG_CPU_S3C2412
+-
+-#define S3C2412_DMAREQSEL_SRC(x) ((x)<<1)
+-
+-#define S3C2412_DMAREQSEL_HW (1)
+-
+-#define S3C2412_DMAREQSEL_SPI0TX S3C2412_DMAREQSEL_SRC(0)
+-#define S3C2412_DMAREQSEL_SPI0RX S3C2412_DMAREQSEL_SRC(1)
+-#define S3C2412_DMAREQSEL_SPI1TX S3C2412_DMAREQSEL_SRC(2)
+-#define S3C2412_DMAREQSEL_SPI1RX S3C2412_DMAREQSEL_SRC(3)
+-#define S3C2412_DMAREQSEL_I2STX S3C2412_DMAREQSEL_SRC(4)
+-#define S3C2412_DMAREQSEL_I2SRX S3C2412_DMAREQSEL_SRC(5)
+-#define S3C2412_DMAREQSEL_TIMER S3C2412_DMAREQSEL_SRC(9)
+-#define S3C2412_DMAREQSEL_SDI S3C2412_DMAREQSEL_SRC(10)
+-#define S3C2412_DMAREQSEL_USBEP1 S3C2412_DMAREQSEL_SRC(13)
+-#define S3C2412_DMAREQSEL_USBEP2 S3C2412_DMAREQSEL_SRC(14)
+-#define S3C2412_DMAREQSEL_USBEP3 S3C2412_DMAREQSEL_SRC(15)
+-#define S3C2412_DMAREQSEL_USBEP4 S3C2412_DMAREQSEL_SRC(16)
+-#define S3C2412_DMAREQSEL_XDREQ0 S3C2412_DMAREQSEL_SRC(17)
+-#define S3C2412_DMAREQSEL_XDREQ1 S3C2412_DMAREQSEL_SRC(18)
+-#define S3C2412_DMAREQSEL_UART0_0 S3C2412_DMAREQSEL_SRC(19)
+-#define S3C2412_DMAREQSEL_UART0_1 S3C2412_DMAREQSEL_SRC(20)
+-#define S3C2412_DMAREQSEL_UART1_0 S3C2412_DMAREQSEL_SRC(21)
+-#define S3C2412_DMAREQSEL_UART1_1 S3C2412_DMAREQSEL_SRC(22)
+-#define S3C2412_DMAREQSEL_UART2_0 S3C2412_DMAREQSEL_SRC(23)
+-#define S3C2412_DMAREQSEL_UART2_1 S3C2412_DMAREQSEL_SRC(24)
+-
+-#endif
+-
+-#define S3C2443_DMAREQSEL_SRC(x) ((x)<<1)
+-
+-#define S3C2443_DMAREQSEL_HW (1)
+
+-#define S3C2443_DMAREQSEL_SPI0TX S3C2443_DMAREQSEL_SRC(0)
+-#define S3C2443_DMAREQSEL_SPI0RX S3C2443_DMAREQSEL_SRC(1)
+-#define S3C2443_DMAREQSEL_SPI1TX S3C2443_DMAREQSEL_SRC(2)
+-#define S3C2443_DMAREQSEL_SPI1RX S3C2443_DMAREQSEL_SRC(3)
+-#define S3C2443_DMAREQSEL_I2STX S3C2443_DMAREQSEL_SRC(4)
+-#define S3C2443_DMAREQSEL_I2SRX S3C2443_DMAREQSEL_SRC(5)
+-#define S3C2443_DMAREQSEL_TIMER S3C2443_DMAREQSEL_SRC(9)
+-#define S3C2443_DMAREQSEL_SDI S3C2443_DMAREQSEL_SRC(10)
+-#define S3C2443_DMAREQSEL_XDREQ0 S3C2443_DMAREQSEL_SRC(17)
+-#define S3C2443_DMAREQSEL_XDREQ1 S3C2443_DMAREQSEL_SRC(18)
+-#define S3C2443_DMAREQSEL_UART0_0 S3C2443_DMAREQSEL_SRC(19)
+-#define S3C2443_DMAREQSEL_UART0_1 S3C2443_DMAREQSEL_SRC(20)
+-#define S3C2443_DMAREQSEL_UART1_0 S3C2443_DMAREQSEL_SRC(21)
+-#define S3C2443_DMAREQSEL_UART1_1 S3C2443_DMAREQSEL_SRC(22)
+-#define S3C2443_DMAREQSEL_UART2_0 S3C2443_DMAREQSEL_SRC(23)
+-#define S3C2443_DMAREQSEL_UART2_1 S3C2443_DMAREQSEL_SRC(24)
+-#define S3C2443_DMAREQSEL_UART3_0 S3C2443_DMAREQSEL_SRC(25)
+-#define S3C2443_DMAREQSEL_UART3_1 S3C2443_DMAREQSEL_SRC(26)
+-#define S3C2443_DMAREQSEL_PCMOUT S3C2443_DMAREQSEL_SRC(27)
+-#define S3C2443_DMAREQSEL_PCMIN S3C2443_DMAREQSEL_SRC(28)
+-#define S3C2443_DMAREQSEL_MICIN S3C2443_DMAREQSEL_SRC(29)
++static int s3c_dma_has_circular(void)
++{
++ return 0;
++}
+
+ #endif /* __ASM_ARCH_DMA_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/gpio-core.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/gpio-core.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/gpio-core.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/gpio-core.h 2009-05-10 22:27:59.000000000 +0200
+@@ -15,20 +15,7 @@
+ #ifndef __ASM_ARCH_GPIO_CORE_H
+ #define __ASM_ARCH_GPIO_CORE_H __FILE__
+
++/* currently we just include the platform support */
+ #include <plat/gpio-core.h>
+-#include <mach/regs-gpio.h>
+-
+-extern struct s3c_gpio_chip s3c24xx_gpios[];
+-
+-static inline struct s3c_gpio_chip *s3c_gpiolib_getchip(unsigned int pin)
+-{
+- struct s3c_gpio_chip *chip;
+-
+- if (pin > S3C2410_GPG10)
+- return NULL;
+-
+- chip = &s3c24xx_gpios[pin/32];
+- return (S3C2410_GPIO_OFFSET(pin) > chip->chip.ngpio) ? chip : NULL;
+-}
+
+ #endif /* __ASM_ARCH_GPIO_CORE_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/gpio.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/gpio.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/gpio.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/gpio.h 2009-05-10 22:27:59.000000000 +0200
+@@ -22,4 +22,13 @@
+
+ #define ARCH_NR_GPIOS (256 + CONFIG_S3C24XX_GPIO_EXTRA)
+
++/* These two defines should be removed as soon as the
++ * generic irq handling makes it upstream */
++#include <mach/hardware.h>
++#define irq_to_gpio(irq) s3c2410_gpio_irq2pin(irq)
++/* -- cut to here when generic irq makes it */
++
+ #include <asm-generic/gpio.h>
++#include <mach/gpio-nrs.h>
++
++#define S3C_GPIO_END (S3C2410_GPIO_BANKH + 32)
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/gpio-nrs.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/gpio-nrs.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/gpio-nrs.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/gpio-nrs.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,23 @@
++/* arch/arm/mach-s3c2410/include/mach/gpio-nrs.h
++ *
++ * Copyright (c) 2008 Simtec Electronics
++ * http://armlinux.simtec.co.uk/
++ * Ben Dooks <ben@simtec.co.uk>
++ *
++ * S3C2410 - GPIO bank numbering
++ *
++ * 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.
++*/
++
++#define S3C2410_GPIONO(bank,offset) ((bank) + (offset))
++
++#define S3C2410_GPIO_BANKA (32*0)
++#define S3C2410_GPIO_BANKB (32*1)
++#define S3C2410_GPIO_BANKC (32*2)
++#define S3C2410_GPIO_BANKD (32*3)
++#define S3C2410_GPIO_BANKE (32*4)
++#define S3C2410_GPIO_BANKF (32*5)
++#define S3C2410_GPIO_BANKG (32*6)
++#define S3C2410_GPIO_BANKH (32*7)
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/gta01.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/gta01.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/gta01.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/gta01.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,76 @@
++#ifndef _GTA01_H
++#define _GTA01_H
++
++#include <mach/regs-gpio.h>
++#include <mach/irqs.h>
++
++/* Different hardware revisions, passed in ATAG_REVISION by u-boot */
++#define GTA01v3_SYSTEM_REV 0x00000130
++#define GTA01v4_SYSTEM_REV 0x00000140
++#define GTA01Bv2_SYSTEM_REV 0x00000220
++#define GTA01Bv3_SYSTEM_REV 0x00000230
++#define GTA01Bv4_SYSTEM_REV 0x00000240
++
++/* Backlight */
++
++extern void gta01bl_deferred_resume(void);
++
++struct gta01bl_machinfo {
++ unsigned int default_intensity;
++ unsigned int max_intensity;
++ unsigned int limit_mask;
++ unsigned int defer_resume_backlight;
++};
++
++/* Definitions common to all revisions */
++#define GTA01_GPIO_BACKLIGHT S3C2410_GPB0
++#define GTA01_GPIO_GPS_PWRON S3C2410_GPB1
++#define GTA01_GPIO_MODEM_RST S3C2410_GPB6
++#define GTA01_GPIO_MODEM_ON S3C2410_GPB7
++#define GTA01_GPIO_LCD_RESET S3C2410_GPC6
++#define GTA01_GPIO_PMU_IRQ S3C2410_GPG8
++#define GTA01_GPIO_JACK_INSERT S3C2410_GPF4
++#define GTA01_GPIO_nSD_DETECT S3C2410_GPF5
++#define GTA01_GPIO_AUX_KEY S3C2410_GPF6
++#define GTA01_GPIO_HOLD_KEY S3C2410_GPF7
++#define GTA01_GPIO_VIBRATOR_ON S3C2410_GPG11
++
++#define GTA01_IRQ_MODEM IRQ_EINT1
++#define GTA01_IRQ_JACK_INSERT IRQ_EINT4
++#define GTA01_IRQ_nSD_DETECT IRQ_EINT5
++#define GTA01_IRQ_AUX_KEY IRQ_EINT6
++#define GTA01_IRQ_PCF50606 IRQ_EINT16
++
++/* GTA01v3 */
++#define GTA01v3_GPIO_nGSM_EN S3C2410_GPG9
++
++/* GTA01v4 */
++#define GTA01_GPIO_MODEM_DNLOAD S3C2410_GPG0
++
++/* GTA01Bv2 */
++#define GTA01Bv2_GPIO_nGSM_EN S3C2410_GPF2
++#define GTA01Bv2_GPIO_VIBRATOR_ON S3C2410_GPB10
++
++/* GTA01Bv3 */
++#define GTA01_GPIO_GPS_EN_3V3 S3C2410_GPG9
++
++#define GTA01_GPIO_SDMMC_ON S3C2410_GPB2
++#define GTA01_GPIO_BT_EN S3C2410_GPB5
++#define GTA01_GPIO_AB_DETECT S3C2410_GPB8
++#define GTA01_GPIO_USB_PULLUP S3C2410_GPB9
++#define GTA01_GPIO_USB_ATTACH S3C2410_GPB10
++
++#define GTA01_GPIO_GPS_EN_2V8 S3C2410_GPG9
++#define GTA01_GPIO_GPS_EN_3V S3C2410_GPG10
++#define GTA01_GPIO_GPS_RESET S3C2410_GPC0
++
++/* GTA01Bv4 */
++#define GTA01Bv4_GPIO_nNAND_WP S3C2410_GPA16
++#define GTA01Bv4_GPIO_VIBRATOR_ON S3C2410_GPB3
++#define GTA01Bv4_GPIO_PMU_IRQ S3C2410_GPG1
++
++#define GTA01Bv4_IRQ_PCF50606 IRQ_EINT9
++
++extern struct pcf50606 *gta01_pcf;
++
++#endif /* _GTA01_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/gta02-pm-wlan.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/gta02-pm-wlan.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/gta02-pm-wlan.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/gta02-pm-wlan.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,10 @@
++#ifndef __MACH_GTA02_PM_WLAN_H
++#define __MACH_GTA02_PM_WLAN_H
++
++void gta02_wlan_reset(int assert_reset);
++int gta02_wlan_query_rfkill_lock(void);
++void gta02_wlan_query_rfkill_unlock(void);
++void gta02_wlan_set_rfkill_cb(int (*cb)(void *user, int on), void *user);
++void gta02_wlan_clear_rfkill_cb(void);
++
++#endif /* __MACH_GTA02_PM_WLAN_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/hardware.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/hardware.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/hardware.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/hardware.h 2009-05-10 22:27:59.000000000 +0200
+@@ -131,7 +131,4 @@
+
+ /* machine specific hardware definitions should go after this */
+
+-/* currently here until moved into config (todo) */
+-#define CONFIG_NO_MULTIWORD_IO
+-
+ #endif /* __ASM_ARCH_HARDWARE_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/io.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/io.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/io.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/io.h 2009-05-10 22:27:59.000000000 +0200
+@@ -9,7 +9,7 @@
+ #ifndef __ASM_ARM_ARCH_IO_H
+ #define __ASM_ARM_ARCH_IO_H
+
+-#include <mach/hardware.h>
++#include <mach/map.h>
+
+ #define IO_SPACE_LIMIT 0xffffffff
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/irqs.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/irqs.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/irqs.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/irqs.h 2009-05-10 22:27:59.000000000 +0200
+@@ -80,7 +80,7 @@
+ #define IRQ_EINT22 S3C2410_IRQ(50)
+ #define IRQ_EINT23 S3C2410_IRQ(51)
+
+-
++#define IRQ_EINT_BIT(x) ((x) - IRQ_EINT4 + 4)
+ #define IRQ_EINT(x) (((x) >= 4) ? (IRQ_EINT4 + (x) - 4) : (IRQ_EINT0 + (x)))
+
+ #define IRQ_LCD_FIFO S3C2410_IRQ(52)
+@@ -153,9 +153,9 @@
+ #define IRQ_S3C2443_AC97 S3C2410_IRQSUB(28)
+
+ #ifdef CONFIG_CPU_S3C2443
+-#define NR_IRQS (IRQ_S3C2443_AC97+1)
++#define _NR_IRQS (IRQ_S3C2443_AC97+1)
+ #else
+-#define NR_IRQS (IRQ_S3C2440_AC97+1)
++#define _NR_IRQS (IRQ_S3C2440_AC97+1)
+ #endif
+
+ /* compatibility define. */
+@@ -167,4 +167,33 @@
+ /* Our FIQs are routable from IRQ_EINT0 to IRQ_ADCPARENT */
+ #define FIQ_START IRQ_EINT0
+
++
++/*
++ * The next 16 interrupts are for board specific purposes. Since
++ * the kernel can only run on one machine at a time, we can re-use
++ * these. If you need more, increase IRQ_BOARD_END, but keep it
++ * within sensible limits.
++ */
++#define IRQ_BOARD_START _NR_IRQS
++#define IRQ_BOARD_END (_NR_IRQS + 10)
++
++#if defined(CONFIG_MACH_NEO1973_GTA02)
++#define NR_IRQS (IRQ_BOARD_END)
++#else
++#define NR_IRQS (IRQ_BOARD_START)
++#endif
++
++/* Neo1973 GTA02 interrupts */
++#define NEO1973_GTA02_IRQ(x) (IRQ_BOARD_START + (x))
++#define IRQ_GLAMO(x) NEO1973_GTA02_IRQ(x)
++#define IRQ_GLAMO_HOSTBUS IRQ_GLAMO(0)
++#define IRQ_GLAMO_JPEG IRQ_GLAMO(1)
++#define IRQ_GLAMO_MPEG IRQ_GLAMO(2)
++#define IRQ_GLAMO_MPROC1 IRQ_GLAMO(3)
++#define IRQ_GLAMO_MPROC0 IRQ_GLAMO(4)
++#define IRQ_GLAMO_CMDQUEUE IRQ_GLAMO(5)
++#define IRQ_GLAMO_2D IRQ_GLAMO(6)
++#define IRQ_GLAMO_MMC IRQ_GLAMO(7)
++#define IRQ_GLAMO_RISC IRQ_GLAMO(8)
++
+ #endif /* __ASM_ARCH_IRQ_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/map.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/map.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/map.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/map.h 2009-05-10 22:27:59.000000000 +0200
+@@ -84,7 +84,6 @@
+
+ #define S3C24XX_PA_IRQ S3C2410_PA_IRQ
+ #define S3C24XX_PA_MEMCTRL S3C2410_PA_MEMCTRL
+-#define S3C24XX_PA_USBHOST S3C2410_PA_USBHOST
+ #define S3C24XX_PA_DMA S3C2410_PA_DMA
+ #define S3C24XX_PA_CLKPWR S3C2410_PA_CLKPWR
+ #define S3C24XX_PA_LCD S3C2410_PA_LCD
+@@ -102,6 +101,7 @@
+
+ #define S3C_PA_IIC S3C2410_PA_IIC
+ #define S3C_PA_UART S3C24XX_PA_UART
++#define S3C_PA_USBHOST S3C2410_PA_USBHOST
+ #define S3C_PA_HSMMC0 S3C2443_PA_HSMMC
+
+ #endif /* __ASM_ARCH_MAP_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/mci.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/mci.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/mci.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/mci.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,13 @@
++#ifndef _ARCH_MCI_H
++#define _ARCH_MCI_H
++
++struct s3c24xx_mci_pdata {
++ unsigned int gpio_detect;
++ unsigned int gpio_wprotect;
++ unsigned long ocr_avail;
++ unsigned int do_dma;
++ void (*set_power)(unsigned char power_mode,
++ unsigned short vdd);
++};
++
++#endif /* _ARCH_NCI_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/neo1973-pm-gsm.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/neo1973-pm-gsm.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/neo1973-pm-gsm.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/neo1973-pm-gsm.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1 @@
++extern int gta_gsm_interrupts;
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/regs-gpio.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/regs-gpio.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/regs-gpio.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/regs-gpio.h 2009-05-10 22:27:59.000000000 +0200
+@@ -14,16 +14,7 @@
+ #ifndef __ASM_ARCH_REGS_GPIO_H
+ #define __ASM_ARCH_REGS_GPIO_H
+
+-#define S3C2410_GPIONO(bank,offset) ((bank) + (offset))
+-
+-#define S3C2410_GPIO_BANKA (32*0)
+-#define S3C2410_GPIO_BANKB (32*1)
+-#define S3C2410_GPIO_BANKC (32*2)
+-#define S3C2410_GPIO_BANKD (32*3)
+-#define S3C2410_GPIO_BANKE (32*4)
+-#define S3C2410_GPIO_BANKF (32*5)
+-#define S3C2410_GPIO_BANKG (32*6)
+-#define S3C2410_GPIO_BANKH (32*7)
++#include <mach/gpio-nrs.h>
+
+ #ifdef CONFIG_CPU_S3C2400
+ #define S3C24XX_GPIO_BASE(x) S3C2400_GPIO_BASE(x)
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/regs-sdi.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/regs-sdi.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/regs-sdi.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/regs-sdi.h 2009-05-10 22:27:59.000000000 +0200
+@@ -30,6 +30,7 @@
+ #define S3C2410_SDIFSTA (0x38)
+
+ #define S3C2410_SDIDATA (0x3C)
++#define S3C2410_SDIDATA_BYTE (0x3C)
+ #define S3C2410_SDIIMSK (0x40)
+
+ #define S3C2440_SDIDATA (0x40)
+@@ -37,6 +38,8 @@
+
+ #define S3C2440_SDICON_SDRESET (1<<8)
+ #define S3C2440_SDICON_MMCCLOCK (1<<5)
++#define S3C2440_SDIDATA_BYTE (0x48)
++
+ #define S3C2410_SDICON_BYTEORDER (1<<4)
+ #define S3C2410_SDICON_SDIOIRQ (1<<3)
+ #define S3C2410_SDICON_RWAITEN (1<<2)
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/s3c24xx-serial.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/s3c24xx-serial.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/s3c24xx-serial.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/s3c24xx-serial.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,5 @@
++#include <linux/resume-dependency.h>
++
++extern void s3c24xx_serial_console_set_silence(int silence);
++extern void s3c24xx_serial_register_resume_dependency(struct resume_dependency *
++ resume_dependency, int uart_index);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/spi-gpio.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/spi-gpio.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/spi-gpio.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/spi-gpio.h 2009-05-10 22:27:59.000000000 +0200
+@@ -21,7 +21,8 @@
+ int num_chipselect;
+ int bus_num;
+
+- void (*chip_select)(struct s3c2410_spigpio_info *spi, int cs);
++ int non_blocking_transfer;
++ void (*chip_select)(struct s3c2410_spigpio_info *spi, int csid, int cs);
+ };
+
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/ts.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/ts.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/ts.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/ts.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,35 @@
++/* arch/arm/mach-s3c2410/include/mach/ts.h
++ *
++ * Copyright (c) 2005 Arnaud Patard <arnaud.patard@rtp-net.org>
++ *
++ *
++ * 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.
++ *
++ *
++ * Changelog:
++ * 24-Mar-2005 RTP Created file
++ * 03-Aug-2005 RTP Renamed to ts.h
++ */
++
++#ifndef __ASM_ARM_TS_H
++#define __ASM_ARM_TS_H
++
++#include <../drivers/input/touchscreen/ts_filter.h>
++
++struct s3c2410_ts_mach_info {
++ /* Touchscreen delay. */
++ int delay;
++ /* Prescaler value. */
++ int presc;
++ /*
++ * Null-terminated array of pointers to filter APIs and configurations
++ * we want to use. In the same order they will be applied.
++ */
++ const struct ts_filter_chain_configuration *filter_config;
++};
++
++void set_s3c2410ts_info(const struct s3c2410_ts_mach_info *hard_s3c2410ts_info);
++
++#endif /* __ASM_ARM_TS_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/usb-control.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/usb-control.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/include/mach/usb-control.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/include/mach/usb-control.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,41 +0,0 @@
+-/* arch/arm/mach-s3c2410/include/mach/usb-control.h
+- *
+- * Copyright (c) 2004 Simtec Electronics
+- * Ben Dooks <ben@simtec.co.uk>
+- *
+- * S3C2410 - usb port information
+- *
+- * 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.
+-*/
+-
+-#ifndef __ASM_ARCH_USBCONTROL_H
+-#define __ASM_ARCH_USBCONTROL_H "arch/arm/mach-s3c2410/include/mach/usb-control.h"
+-
+-#define S3C_HCDFLG_USED (1)
+-
+-struct s3c2410_hcd_port {
+- unsigned char flags;
+- unsigned char power;
+- unsigned char oc_status;
+- unsigned char oc_changed;
+-};
+-
+-struct s3c2410_hcd_info {
+- struct usb_hcd *hcd;
+- struct s3c2410_hcd_port port[2];
+-
+- void (*power_control)(int port, int to);
+- void (*enable_oc)(struct s3c2410_hcd_info *, int on);
+- void (*report_oc)(struct s3c2410_hcd_info *, int ports);
+-};
+-
+-static void inline s3c2410_usb_report_oc(struct s3c2410_hcd_info *info, int ports)
+-{
+- if (info->report_oc != NULL) {
+- (info->report_oc)(info, ports);
+- }
+-}
+-
+-#endif /*__ASM_ARCH_USBCONTROL_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/Kconfig linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/Kconfig
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/Kconfig 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/Kconfig 2009-05-10 22:27:59.000000000 +0200
+@@ -10,6 +10,7 @@
+ select CPU_ARM920T
+ select S3C2410_CLOCK
+ select S3C2410_GPIO
++ select S3C_PWM
+ select CPU_LLSERIAL_S3C2410
+ select S3C2410_PM if PM
+ help
+@@ -45,6 +46,7 @@
+ Internal node for machines with an BAST style IDE
+ interface
+
++
+ menu "S3C2410 Machines"
+
+ config ARCH_SMDK2410
+@@ -59,6 +61,7 @@
+ bool "IPAQ H1940"
+ select CPU_S3C2410
+ select PM_H1940 if PM
++ select S3C_DEV_USB_HOST
+ help
+ Say Y here if you are using the HP IPAQ H1940
+
+@@ -70,6 +73,7 @@
+ config MACH_N30
+ bool "Acer N30 family"
+ select CPU_S3C2410
++ select S3C_DEV_USB_HOST
+ help
+ Say Y here if you want suppt for the Acer N30, Acer N35,
+ Navman PiN570, Yakumo AlphaX or Airis NC05 PDAs.
+@@ -82,6 +86,7 @@
+ select MACH_BAST_IDE
+ select S3C24XX_DCLK
+ select ISA
++ select S3C_DEV_USB_HOST
+ help
+ Say Y here if you are using the Simtec Electronics EB2410ITX
+ development board (also known as BAST)
+@@ -89,6 +94,7 @@
+ config MACH_OTOM
+ bool "NexVision OTOM Board"
+ select CPU_S3C2410
++ select S3C_DEV_USB_HOST
+ help
+ Say Y here if you are using the Nex Vision OTOM board
+
+@@ -96,6 +102,7 @@
+ bool "AML M5900 Series"
+ select CPU_S3C2410
+ select PM_SIMTEC if PM
++ select S3C_DEV_USB_HOST
+ help
+ Say Y here if you are using the American Microsystems M5900 Series
+ <http://www.amltd.com>
+@@ -111,6 +118,7 @@
+ config MACH_TCT_HAMMER
+ bool "TCT Hammer Board"
+ select CPU_S3C2410
++ select S3C_DEV_USB_HOST
+ help
+ Say Y here if you are using the TinCanTools Hammer Board
+ <http://www.tincantools.com>
+@@ -128,7 +136,27 @@
+ config MACH_QT2410
+ bool "QT2410"
+ select CPU_S3C2410
++ select DISPLAY_JBT6K74
+ help
+ Say Y here if you are using the Armzone QT2410
+
++config MACH_NEO1973_GTA01
++ bool "FIC Neo1973 GSM Phone (GTA01 Hardware)"
++ select CPU_S3C2410
++ select MACH_NEO1973
++ select S3C_DEV_USB_HOST
++ select MFD_PCF50606
++ select INPUT_PCF50606_PMU
++ select PCF50606_ADC
++ select PCF50606_GPIO
++ select RTC_DRV_PCF50606
++ select REGULATOR_PCF50606
++ select CHARGER_PCF50606
++ select PCF50606_WATCHDOG
++ select POWER_SUPPLY
++ select BATTERY_GTA01
++
++ help
++ Say Y here if you are using the FIC Neo1973 GSM Phone
++
+ endmenu
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/mach-gta01.c linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/mach-gta01.c
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/mach-gta01.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/mach-gta01.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,1008 @@
++/*
++ * linux/arch/arm/mach-s3c2410/mach-gta01.c
++ *
++ * S3C2410 Machine Support for the FIC Neo1973 GTA01
++ *
++ * Copyright (C) 2006-2007 by Openmoko, Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/interrupt.h>
++#include <linux/list.h>
++#include <linux/timer.h>
++#include <linux/init.h>
++#include <linux/workqueue.h>
++#include <linux/platform_device.h>
++#include <linux/i2c.h>
++#include <linux/serial_core.h>
++#include <mach/ts.h>
++#include <linux/spi/spi.h>
++#include <linux/spi/spi_bitbang.h>
++#include <linux/mmc/mmc.h>
++#include <linux/mmc/host.h>
++
++#include <linux/mtd/mtd.h>
++#include <linux/mtd/nand.h>
++#include <linux/mtd/nand_ecc.h>
++#include <linux/mtd/partitions.h>
++
++#include <linux/mmc/host.h>
++
++#include <linux/mfd/pcf50606/core.h>
++#include <linux/mfd/pcf50606/pmic.h>
++#include <linux/mfd/pcf50606/mbc.h>
++#include <linux/mfd/pcf50606/adc.h>
++
++#include <linux/gta01_battery.h>
++
++#include <linux/regulator/machine.h>
++#include <linux/regulator/consumer.h>
++
++
++#include <asm/mach/arch.h>
++#include <asm/mach/map.h>
++#include <asm/mach/irq.h>
++
++#include <mach/hardware.h>
++#include <mach/io.h>
++#include <asm/irq.h>
++#include <asm/mach-types.h>
++
++#include <mach/regs-gpio.h>
++#include <mach/fb.h>
++#include <mach/spi.h>
++#include <mach/spi-gpio.h>
++#include <mach/cpu.h>
++
++#include <mach/gta01.h>
++
++#include <plat/regs-serial.h>
++#include <plat/nand.h>
++#include <plat/devs.h>
++#include <plat/cpu.h>
++#include <plat/pm.h>
++#include <plat/udc.h>
++#include <plat/iic.h>
++#include <plat/mci.h>
++#include <asm/plat-s3c24xx/neo1973.h>
++#include <plat/usb-control.h>
++#include <mach/neo1973-pm-gsm.h>
++
++#include <linux/jbt6k74.h>
++
++#include <../drivers/input/touchscreen/ts_filter_chain.h>
++#ifdef CONFIG_TOUCHSCREEN_FILTER
++#include <../drivers/input/touchscreen/ts_filter_linear.h>
++#include <../drivers/input/touchscreen/ts_filter_mean.h>
++#include <../drivers/input/touchscreen/ts_filter_median.h>
++#include <../drivers/input/touchscreen/ts_filter_group.h>
++#endif
++
++
++static struct map_desc gta01_iodesc[] __initdata = {
++ {
++ .virtual = 0xe0000000,
++ .pfn = __phys_to_pfn(S3C2410_CS3+0x01000000),
++ .length = SZ_1M,
++ .type = MT_DEVICE
++ },
++};
++
++#define UCON S3C2410_UCON_DEFAULT
++#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
++#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
++/* UFCON for the gta01 sets the FIFO trigger level at 4, not 8 */
++#define UFCON_GTA01_PORT0 S3C2410_UFCON_FIFOMODE
++
++static struct s3c2410_uartcfg gta01_uartcfgs[] = {
++ [0] = {
++ .hwport = 0,
++ .flags = 0,
++ .ucon = UCON,
++ .ulcon = ULCON,
++ .ufcon = UFCON_GTA01_PORT0,
++ },
++ [1] = {
++ .hwport = 1,
++ .flags = 0,
++ .ucon = UCON,
++ .ulcon = ULCON,
++ .ufcon = UFCON,
++ },
++};
++
++/* TODO */
++static void gta01_pmu_event_callback(struct pcf50606 *pcf, int irq)
++{
++ /*TODO : Handle ACD here */
++}
++
++/* FIXME : Goes away when ACD is handled above */
++#if 0
++static int pmu_callback(struct device *dev, unsigned int feature,
++ enum pmu_event event)
++{
++ switch (feature) {
++ case PCF50606_FEAT_ACD:
++ switch (event) {
++ case PMU_EVT_INSERT:
++ pcf50606_charge_fast(pcf50606_global, 1);
++ break;
++ case PMU_EVT_REMOVE:
++ pcf50606_charge_fast(pcf50606_global, 0);
++ break;
++ default:
++ break;
++ }
++ break;
++ default:
++ break;
++ }
++
++ return 0;
++}
++#endif
++
++struct pcf50606 *gta01_pcf;
++
++static struct platform_device gta01_pm_gsm_dev = {
++ .name = "neo1973-pm-gsm",
++};
++
++static struct platform_device gta01_pm_bt_dev = {
++ .name = "neo1973-pm-bt",
++};
++static struct platform_device gta01_pm_gps_dev = {
++ .name = "neo1973-pm-gps",
++};
++
++static struct regulator_consumer_supply ioreg_consumers[] = {
++ {
++ .dev = &gta01_pm_gps_dev.dev,
++ .supply = "GPS_2V8",
++ },
++};
++
++static struct regulator_consumer_supply d1reg_consumers[] = {
++ {
++ .dev = &gta01_pm_gps_dev.dev,
++ .supply = "GPS_3V",
++ },
++ {
++ .dev = &gta01_pm_bt_dev.dev,
++ .supply = "BT_3V1",
++ },
++};
++
++static struct regulator_consumer_supply dcd_consumers[] = {
++ {
++ .dev = &gta01_pm_gps_dev.dev,
++ .supply = "GPS_3V3",
++ },
++ {
++ .dev = &gta01_pm_gps_dev.dev,
++ .supply = "GPS_1V5",
++ },
++};
++
++static struct regulator_consumer_supply d2reg_consumers[] = {
++ {
++ .dev = &gta01_pm_gps_dev.dev,
++ .supply = "GPS_2V5",
++ },
++ {
++ .dev = &s3c_device_sdi.dev,
++ .supply = "SD_3V3",
++ },
++};
++
++static int gta01_bat_get_charging_status(void)
++{
++ struct pcf50606 *pcf = gta01_pcf;
++ u8 mbcc1, chgmod;
++
++ mbcc1 = pcf50606_reg_read(pcf, PCF50606_REG_MBCC1);
++ chgmod = mbcc1 & PCF50606_MBCC1_CHGMOD_MASK;
++
++ if (chgmod == PCF50606_MBCC1_CHGMOD_IDLE)
++ return 0;
++ else
++ return 1;
++}
++
++static int gta01_bat_get_voltage(void)
++{
++ struct pcf50606 *pcf = gta01_pcf;
++ u16 adc, mv = 0;
++
++ adc = pcf50606_adc_sync_read(pcf, PCF50606_ADCMUX_BATVOLT_RES);
++ mv = (adc * 6000) / 1024;
++
++ return mv;
++}
++
++static int gta01_bat_get_current(void)
++{
++ struct pcf50606 *pcf = gta01_pcf;
++ u16 adc_battvolt, adc_adcin1;
++ s32 res;
++
++ adc_battvolt = pcf50606_adc_sync_read(pcf, PCF50606_ADCMUX_BATVOLT_SUBTR);
++ adc_adcin1 = pcf50606_adc_sync_read(pcf, PCF50606_ADCMUX_ADCIN1_SUBTR);
++ res = (adc_adcin1 - adc_battvolt) * 2400;
++
++ /*rsense is 220 milli */
++ return (res * 1000) / (220 * 1024);
++}
++
++static struct gta01_bat_platform_data gta01_bat_pdata = {
++ .get_charging_status = gta01_bat_get_charging_status,
++ .get_voltage = gta01_bat_get_voltage,
++ .get_current = gta01_bat_get_current,
++};
++
++struct platform_device gta01_bat = {
++ .name = "gta01_battery",
++ .id = -1,
++ .dev = {
++ .platform_data = &gta01_bat_pdata,
++ }
++};
++
++static void gta01_pcf_probe_done(struct pcf50606 *pcf)
++{
++ gta01_pcf = pcf;
++ gta01_bat.dev.parent = pcf->dev;
++ platform_device_register(&gta01_bat);
++}
++
++static int gps_registered_regulators = 0;
++
++static void gta01_pmu_regulator_registered(struct pcf50606 *pcf, int id)
++{
++ switch(id) {
++ case PCF50606_REGULATOR_D1REG:
++ platform_device_register(&gta01_pm_bt_dev);
++ gps_registered_regulators++;
++ break;
++ case PCF50606_REGULATOR_D2REG:
++ gps_registered_regulators++;
++ break;
++ case PCF50606_REGULATOR_IOREG:
++ case PCF50606_REGULATOR_DCD:
++ gps_registered_regulators++;
++ break;
++ }
++
++ /* All GPS related regulators registered ? */
++ if (gps_registered_regulators == 4)
++ platform_device_register(&gta01_pm_gps_dev);
++
++}
++
++static struct pcf50606_platform_data gta01_pcf_pdata = {
++ .resumers = {
++ [0] = PCF50606_INT1_ALARM |
++ PCF50606_INT1_ONKEYF |
++ PCF50606_INT1_EXTONR,
++ [1] = PCF50606_INT2_CHGWD10S |
++ PCF50606_INT2_CHGPROT |
++ PCF50606_INT2_CHGERR,
++ [2] = PCF50606_INT3_LOWBAT |
++ PCF50606_INT3_HIGHTMP |
++ PCF50606_INT3_ACDINS,
++ },
++ .mbc_event_callback = gta01_pmu_event_callback,
++ .reg_init_data = {
++ [PCF50606_REGULATOR_D1REG] = {
++ .constraints = {
++ .min_uV = 3000000,
++ .max_uV = 3150000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .apply_uV = 1,
++ },
++ .num_consumer_supplies = ARRAY_SIZE(d1reg_consumers),
++ .consumer_supplies = d1reg_consumers,
++ },
++
++ [PCF50606_REGULATOR_D2REG] = {
++ .constraints = {
++ .min_uV = 1650000,
++ .max_uV = 3300000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
++ .apply_uV = 1,
++ },
++ .num_consumer_supplies = ARRAY_SIZE(d2reg_consumers),
++ .consumer_supplies = d2reg_consumers,
++
++ },
++
++ [PCF50606_REGULATOR_D3REG] = {
++ .constraints = {
++ .min_uV = 1800000,
++ .max_uV = 2100000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .state_mem = {
++ .enabled = 1,
++ },
++ },
++ .num_consumer_supplies = 0,
++ },
++
++ [PCF50606_REGULATOR_DCD] = {
++ .constraints = {
++ .min_uV = 1500000,
++ .max_uV = 1500000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .apply_uV = 1,
++ },
++ .num_consumer_supplies = ARRAY_SIZE(dcd_consumers),
++ .consumer_supplies = dcd_consumers,
++ },
++
++ [PCF50606_REGULATOR_DCDE] = {
++ .constraints = {
++ .min_uV = 3300000,
++ .max_uV = 3300000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .apply_uV = 1,
++ .state_mem = {
++ .enabled = 1,
++ },
++ },
++ .num_consumer_supplies = 0,
++ },
++
++ [PCF50606_REGULATOR_DCUD] = {
++ .constraints = {
++ .min_uV = 2100000,
++ .max_uV = 2100000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .apply_uV = 1,
++ .state_mem = {
++ .enabled = 1,
++ },
++ },
++ .num_consumer_supplies = 0,
++ },
++
++ [PCF50606_REGULATOR_IOREG] = {
++ .constraints = {
++ .min_uV = 3300000,
++ .max_uV = 3300000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .apply_uV = 1,
++ },
++ .num_consumer_supplies = ARRAY_SIZE(ioreg_consumers),
++ .consumer_supplies = ioreg_consumers,
++
++ },
++
++ [PCF50606_REGULATOR_LPREG] = {
++ .constraints = {
++ .min_uV = 3300000,
++ .max_uV = 3300000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .apply_uV = 1,
++ },
++ .num_consumer_supplies = 0,
++ },
++ },
++ .probe_done = gta01_pcf_probe_done,
++ .regulator_registered = gta01_pmu_regulator_registered,
++};
++
++static void cfg_pmu_vrail(struct regulator_init_data *vrail,
++ unsigned int suspend_on, unsigned int min,
++ unsigned int max)
++{
++ vrail->constraints.state_mem.enabled = suspend_on;
++ vrail->constraints.min_uV = min;
++ vrail->constraints.max_uV = min;
++ vrail->constraints.apply_uV = 1;
++}
++
++static void mangle_pmu_pdata_by_system_rev(void)
++{
++ struct regulator_init_data *reg_init_data;
++
++ reg_init_data = gta01_pcf_pdata.reg_init_data;
++
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA01Bv4_SYSTEM_REV:
++
++ /* FIXME : gta01_pcf_pdata.used_features |= PCF50606_FEAT_ACD; */
++ break;
++ case GTA01Bv3_SYSTEM_REV:
++ case GTA01Bv2_SYSTEM_REV:
++ reg_init_data[PCF50606_REGULATOR_D3REG].constraints.state_mem.enabled = 1;
++ break;
++ case GTA01v4_SYSTEM_REV:
++ cfg_pmu_vrail(&reg_init_data[PCF50606_REGULATOR_DCUD],
++ 1, 18000000, 1800000);
++ cfg_pmu_vrail(&reg_init_data[PCF50606_REGULATOR_D1REG],
++ 0, 3000000, 3000000);
++ cfg_pmu_vrail(&reg_init_data[PCF50606_REGULATOR_D3REG],
++ 0, 2800000, 2800000);
++ cfg_pmu_vrail(&reg_init_data[PCF50606_REGULATOR_DCD],
++ 0, 3500000, 3500000);
++ break;
++ case GTA01v3_SYSTEM_REV:
++ cfg_pmu_vrail(&reg_init_data[PCF50606_REGULATOR_D1REG],
++ 0, 3000000, 3000000);
++ cfg_pmu_vrail(&reg_init_data[PCF50606_REGULATOR_D2REG],
++ 0, 3300000, 3300000);
++ cfg_pmu_vrail(&reg_init_data[PCF50606_REGULATOR_D3REG],
++ 0, 3300000, 3300000);
++ cfg_pmu_vrail(&reg_init_data[PCF50606_REGULATOR_DCD],
++ 0, 3300000, 3300000);
++ cfg_pmu_vrail(&reg_init_data[PCF50606_REGULATOR_DCUD],
++ 1, 1800000, 1800000);
++ cfg_pmu_vrail(&reg_init_data[PCF50606_REGULATOR_IOREG],
++ 0, 2800000, 2800000);
++ break;
++ }
++}
++
++static void gta01_power_off(void)
++{
++ pcf50606_reg_write(gta01_pcf, PCF50606_REG_OOCC1,
++ PCF50606_OOCC1_GOSTDBY);
++}
++
++/* LCD driver info */
++
++/* Configuration for 480x640 toppoly TD028TTEC1.
++ * Do not mark this as __initdata or it will break! */
++static struct s3c2410fb_display gta01_displays[] = {
++ {
++ .type = S3C2410_LCDCON1_TFT,
++ .width = 43,
++ .height = 58,
++ .xres = 480,
++ .yres = 640,
++ .bpp = 16,
++
++ .pixclock = 40000, /* HCLK/4 */
++ .left_margin = 104,
++ .right_margin = 8,
++ .hsync_len = 8,
++ .upper_margin = 2,
++ .lower_margin = 16,
++ .vsync_len = 2,
++ .lcdcon5 = S3C2410_LCDCON5_FRM565 |
++ S3C2410_LCDCON5_INVVCLK |
++ S3C2410_LCDCON5_INVVLINE |
++ S3C2410_LCDCON5_INVVFRAME |
++ S3C2410_LCDCON5_PWREN |
++ S3C2410_LCDCON5_HWSWP,
++ },
++ {
++ .type = S3C2410_LCDCON1_TFT,
++ .width = 43,
++ .height = 58,
++ .xres = 480,
++ .yres = 640,
++ .bpp = 32,
++
++ .pixclock = 40000, /* HCLK/4 */
++ .left_margin = 104,
++ .right_margin = 8,
++ .hsync_len = 8,
++ .upper_margin = 2,
++ .lower_margin = 16,
++ .vsync_len = 2,
++ .lcdcon5 = S3C2410_LCDCON5_FRM565 |
++ S3C2410_LCDCON5_INVVCLK |
++ S3C2410_LCDCON5_INVVLINE |
++ S3C2410_LCDCON5_INVVFRAME |
++ S3C2410_LCDCON5_PWREN |
++ S3C2410_LCDCON5_HWSWP,
++ },
++ {
++ .type = S3C2410_LCDCON1_TFT,
++ .width = 43,
++ .height = 58,
++ .xres = 240,
++ .yres = 320,
++ .bpp = 16,
++
++ .pixclock = 40000, /* HCLK/4 */
++ .left_margin = 104,
++ .right_margin = 8,
++ .hsync_len = 8,
++ .upper_margin = 2,
++ .lower_margin = 16,
++ .vsync_len = 2,
++ .lcdcon5 = S3C2410_LCDCON5_FRM565 |
++ S3C2410_LCDCON5_INVVCLK |
++ S3C2410_LCDCON5_INVVLINE |
++ S3C2410_LCDCON5_INVVFRAME |
++ S3C2410_LCDCON5_PWREN |
++ S3C2410_LCDCON5_HWSWP,
++ },
++};
++
++static struct s3c2410fb_mach_info gta01_lcd_cfg __initdata = {
++ .displays = gta01_displays,
++ .num_displays = ARRAY_SIZE(gta01_displays),
++ .default_display = 0,
++
++ .lpcsel = ((0xCE6) & ~7) | 1<<4,
++};
++
++static struct platform_device *gta01_devices[] __initdata = {
++ &s3c_device_usb,
++ &s3c_device_lcd,
++ &s3c_device_wdt,
++ &s3c_device_i2c0,
++ &s3c_device_iis,
++ &s3c_device_sdi,
++ &s3c_device_usbgadget,
++ &s3c_device_nand,
++ &s3c_device_ts,
++};
++
++static struct s3c2410_nand_set gta01_nand_sets[] = {
++ [0] = {
++ .name = "neo1973-nand",
++ .nr_chips = 1,
++ .flags = S3C2410_NAND_BBT,
++ },
++};
++
++static struct s3c2410_platform_nand gta01_nand_info = {
++ .tacls = 20,
++ .twrph0 = 60,
++ .twrph1 = 20,
++ .nr_sets = ARRAY_SIZE(gta01_nand_sets),
++ .sets = gta01_nand_sets,
++};
++
++static struct regulator *s3c_sdi_regulator;
++
++static void gta01_mmc_set_power(unsigned char power_mode, unsigned short vdd)
++{
++ int bit;
++ int mv = 1700; /* 1.7V for MMC_VDD_165_195 */
++ struct regulator *regulator;
++
++ printk(KERN_DEBUG "mmc_set_power(power_mode=%u, vdd=%u)\n",
++ power_mode, vdd);
++
++ if (!s3c_sdi_regulator) {
++ s3c_sdi_regulator =
++ regulator_get(&s3c_device_sdi.dev, "SD_3V3");
++ if (!s3c_sdi_regulator) {
++ printk(KERN_ERR "gta01_mmc_set_power : Cannot get regulator");
++ return;
++ }
++ }
++
++ regulator = s3c_sdi_regulator;
++
++ return;
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA01v3_SYSTEM_REV:
++ switch (power_mode) {
++ case MMC_POWER_OFF:
++ regulator_disable(regulator);
++ break;
++ case MMC_POWER_ON:
++ /* translate MMC_VDD_* VDD bit to mv */
++ for (bit = 8; bit != 24; bit++)
++ if (vdd == (1 << bit))
++ mv += 100 * (bit - 4);
++ regulator_set_voltage(regulator, mv * 1000, mv * 10000);
++ break;
++ case MMC_POWER_UP:
++ regulator_enable(regulator);
++ break;
++ }
++ break;
++ case GTA01v4_SYSTEM_REV:
++ case GTA01Bv2_SYSTEM_REV:
++ case GTA01Bv3_SYSTEM_REV:
++ case GTA01Bv4_SYSTEM_REV:
++ switch (power_mode) {
++ case MMC_POWER_OFF:
++ neo1973_gpb_setpin(GTA01_GPIO_SDMMC_ON, 1);
++ break;
++ case MMC_POWER_ON:
++ neo1973_gpb_setpin(GTA01_GPIO_SDMMC_ON, 0);
++ break;
++ }
++ break;
++ }
++
++ if (regulator)
++ regulator_put(regulator);
++}
++
++static struct s3c24xx_mci_pdata gta01_mmc_cfg = {
++ .gpio_detect = GTA01_GPIO_nSD_DETECT,
++ .set_power = &gta01_mmc_set_power,
++ .ocr_avail = MMC_VDD_165_195|MMC_VDD_20_21|
++ MMC_VDD_21_22|MMC_VDD_22_23|MMC_VDD_23_24|
++ MMC_VDD_24_25|MMC_VDD_25_26|MMC_VDD_26_27|
++ MMC_VDD_27_28|MMC_VDD_28_29|MMC_VDD_29_30|
++ MMC_VDD_30_31|MMC_VDD_31_32|MMC_VDD_32_33,
++};
++
++static void gta01_udc_command(enum s3c2410_udc_cmd_e cmd)
++{
++ printk(KERN_DEBUG "%s(%d)\n", __func__, cmd);
++
++ switch (cmd) {
++ case S3C2410_UDC_P_ENABLE:
++ neo1973_gpb_setpin(GTA01_GPIO_USB_PULLUP, 1);
++ break;
++ case S3C2410_UDC_P_DISABLE:
++ neo1973_gpb_setpin(GTA01_GPIO_USB_PULLUP, 0);
++ break;
++ default:
++ break;
++ }
++}
++
++/* use a work queue, since I2C API inherently schedules
++ * and we get called in hardirq context from UDC driver */
++
++struct vbus_draw {
++ struct work_struct work;
++ int ma;
++};
++static struct vbus_draw gta01_udc_vbus_drawer;
++
++static void __gta01_udc_vbus_draw(struct work_struct *work)
++{
++ /*
++ * This is a fix to work around boot-time ordering problems if the
++ * s3c2410_udc is initialized before the pcf50606 driver has defined
++ * pcf50606_global
++ */
++ if (!gta01_pcf)
++ return;
++
++ if (gta01_udc_vbus_drawer.ma >= 500) {
++ /* enable fast charge */
++ printk(KERN_DEBUG "udc: enabling fast charge\n");
++ pcf50606_charge_fast(gta01_pcf, 1);
++ } else {
++ /* disable fast charge */
++ printk(KERN_DEBUG "udc: disabling fast charge\n");
++ pcf50606_charge_fast(gta01_pcf, 0);
++ }
++}
++
++static void gta01_udc_vbus_draw(unsigned int ma)
++{
++ gta01_udc_vbus_drawer.ma = ma;
++ schedule_work(&gta01_udc_vbus_drawer.work);
++}
++
++static struct s3c2410_udc_mach_info gta01_udc_cfg = {
++ .vbus_draw = gta01_udc_vbus_draw,
++};
++
++/* Touchscreen configuration. */
++
++#ifdef CONFIG_TOUCHSCREEN_FILTER
++const static struct ts_filter_group_configuration gta01_ts_group = {
++ .length = 12,
++ .close_enough = 10,
++ .threshold = 6, /* At least half of the points in a group. */
++ .attempts = 10,
++};
++
++const static struct ts_filter_median_configuration gta01_ts_median = {
++ .extent = 20,
++ .decimation_below = 3,
++ .decimation_threshold = 8 * 3,
++ .decimation_above = 4,
++};
++
++const static struct ts_filter_mean_configuration gta01_ts_mean = {
++ .length = 4,
++};
++
++const static struct ts_filter_linear_configuration gta01_ts_linear = {
++ .constants = {1, 0, 0, 0, 1, 0, 1}, /* Don't modify coords. */
++ .coord0 = 0,
++ .coord1 = 1,
++};
++#endif
++
++const static struct ts_filter_chain_configuration gta01_filter_configuration[] =
++{
++#ifdef CONFIG_TOUCHSCREEN_FILTER
++ {&ts_filter_group_api, &gta01_ts_group.config},
++ {&ts_filter_median_api, &gta01_ts_median.config},
++ {&ts_filter_mean_api, &gta01_ts_mean.config},
++ {&ts_filter_linear_api, &gta01_ts_linear.config},
++#endif
++ {NULL, NULL},
++};
++
++const static struct s3c2410_ts_mach_info gta01_ts_cfg = {
++ .delay = 10000,
++ .presc = 0xff, /* slow as we can go */
++ .filter_config = gta01_filter_configuration,
++};
++
++/* SPI */
++
++static void gta01_jbt6k74_reset(int devidx, int level)
++{
++ /* empty place holder; gta01 does not yet use this */
++ printk(KERN_DEBUG "gta01_jbt6k74_reset\n");
++}
++
++static void gta01_jbt6k74_resuming(int devidx)
++{
++ gta01bl_deferred_resume();
++}
++
++const struct jbt6k74_platform_data gta01_jbt6k74_pdata = {
++ .reset = gta01_jbt6k74_reset,
++ .resuming = gta01_jbt6k74_resuming,
++};
++
++static struct spi_board_info gta01_spi_board_info[] = {
++ {
++ .modalias = "jbt6k74",
++ .platform_data = &gta01_jbt6k74_pdata,
++ /* controller_data */
++ /* irq */
++ .max_speed_hz = 10 * 1000 * 1000,
++ .bus_num = 1,
++ /* chip_select */
++ },
++};
++
++static void spi_gpio_cs(struct s3c2410_spigpio_info *spi, int csidx, int cs)
++{
++ switch (cs) {
++ case BITBANG_CS_ACTIVE:
++ s3c2410_gpio_setpin(S3C2410_GPG3, 0);
++ break;
++ case BITBANG_CS_INACTIVE:
++ s3c2410_gpio_setpin(S3C2410_GPG3, 1);
++ break;
++ }
++}
++
++static struct s3c2410_spigpio_info spi_gpio_cfg = {
++ .pin_clk = S3C2410_GPG7,
++ .pin_mosi = S3C2410_GPG6,
++ .pin_miso = S3C2410_GPG5,
++ .chip_select = &spi_gpio_cs,
++ .num_chipselect = 2, /*** Should be 1 or 2 for gta01? ***/
++};
++
++static struct resource s3c_spi_lcm_resource[] = {
++ [0] = {
++ .start = S3C2410_GPG3,
++ .end = S3C2410_GPG3,
++ },
++ [1] = {
++ .start = S3C2410_GPG5,
++ .end = S3C2410_GPG5,
++ },
++ [2] = {
++ .start = S3C2410_GPG6,
++ .end = S3C2410_GPG6,
++ },
++ [3] = {
++ .start = S3C2410_GPG7,
++ .end = S3C2410_GPG7,
++ },
++};
++
++struct platform_device s3c_device_spi_lcm = {
++ .name = "spi_s3c24xx_gpio",
++ .id = 1,
++ .num_resources = ARRAY_SIZE(s3c_spi_lcm_resource),
++ .resource = s3c_spi_lcm_resource,
++ .dev = {
++ .platform_data = &spi_gpio_cfg,
++ },
++};
++
++static struct gta01bl_machinfo backlight_machinfo = {
++ .default_intensity = 1,
++ .max_intensity = 1,
++ .limit_mask = 1,
++ .defer_resume_backlight = 1,
++};
++
++static struct resource gta01_bl_resources[] = {
++ [0] = {
++ .start = GTA01_GPIO_BACKLIGHT,
++ .end = GTA01_GPIO_BACKLIGHT,
++ },
++};
++
++struct platform_device gta01_bl_dev = {
++ .name = "gta01-bl",
++ .num_resources = ARRAY_SIZE(gta01_bl_resources),
++ .resource = gta01_bl_resources,
++ .dev = {
++ .platform_data = &backlight_machinfo,
++ },
++};
++
++static struct resource gta01_led_resources[] = {
++ [0] = {
++ .start = GTA01_GPIO_VIBRATOR_ON,
++ .end = GTA01_GPIO_VIBRATOR_ON,
++ },
++};
++
++struct platform_device gta01_led_dev = {
++ .name = "neo1973-vibrator",
++ .num_resources = ARRAY_SIZE(gta01_led_resources),
++ .resource = gta01_led_resources,
++};
++
++static struct resource gta01_button_resources[] = {
++ [0] = {
++ .start = GTA01_GPIO_AUX_KEY,
++ .end = GTA01_GPIO_AUX_KEY,
++ },
++ [1] = {
++ .start = GTA01_GPIO_HOLD_KEY,
++ .end = GTA01_GPIO_HOLD_KEY,
++ },
++ [2] = {
++ .start = GTA01_GPIO_JACK_INSERT,
++ .end = GTA01_GPIO_JACK_INSERT,
++ },
++};
++
++struct platform_device gta01_button_dev = {
++ .name = "neo1973-button",
++ .num_resources = ARRAY_SIZE(gta01_button_resources),
++ .resource = gta01_button_resources,
++};
++
++/* USB */
++static struct s3c2410_hcd_info gta01_usb_info = {
++ .port[0] = {
++ .flags = S3C_HCDFLG_USED,
++ },
++ .port[1] = {
++ .flags = 0,
++ },
++};
++
++static void __init gta01_map_io(void)
++{
++ s3c24xx_init_io(gta01_iodesc, ARRAY_SIZE(gta01_iodesc));
++ s3c24xx_init_clocks(12*1000*1000);
++ s3c24xx_init_uarts(gta01_uartcfgs, ARRAY_SIZE(gta01_uartcfgs));
++}
++
++static irqreturn_t gta01_modem_irq(int irq, void *param)
++{
++ printk(KERN_DEBUG "GSM wakeup interrupt (IRQ %d)\n", irq);
++ gta_gsm_interrupts++;
++ return IRQ_HANDLED;
++}
++
++static struct i2c_board_info gta01_i2c_devs[] __initdata = {
++ {
++ I2C_BOARD_INFO("pcf50606", 0x08),
++ .irq = GTA01_IRQ_PCF50606,
++ .platform_data = &gta01_pcf_pdata,
++ },
++ {
++ I2C_BOARD_INFO("lm4857", 0x7c),
++ },
++ {
++ I2C_BOARD_INFO("wm8753", 0x1a),
++ },
++};
++
++static void __init gta01_machine_init(void)
++{
++ int rc;
++
++ if (S3C_SYSTEM_REV_ATAG == GTA01v4_SYSTEM_REV ||
++ S3C_SYSTEM_REV_ATAG == GTA01Bv2_SYSTEM_REV ||
++ S3C_SYSTEM_REV_ATAG == GTA01Bv3_SYSTEM_REV ||
++ S3C_SYSTEM_REV_ATAG == GTA01Bv4_SYSTEM_REV) {
++ gta01_udc_cfg.udc_command = gta01_udc_command;
++ gta01_mmc_cfg.ocr_avail = MMC_VDD_32_33;
++ }
++
++ s3c_device_usb.dev.platform_data = &gta01_usb_info;
++ s3c_device_nand.dev.platform_data = &gta01_nand_info;
++ s3c_device_sdi.dev.platform_data = &gta01_mmc_cfg;
++
++ s3c24xx_fb_set_platdata(&gta01_lcd_cfg);
++
++ INIT_WORK(&gta01_udc_vbus_drawer.work, __gta01_udc_vbus_draw);
++ s3c24xx_udc_set_platdata(&gta01_udc_cfg);
++ s3c_i2c0_set_platdata(NULL);
++ set_s3c2410ts_info(&gta01_ts_cfg);
++
++ /* Set LCD_RESET / XRES to high */
++ s3c2410_gpio_cfgpin(S3C2410_GPC6, S3C2410_GPIO_OUTPUT);
++ s3c2410_gpio_setpin(S3C2410_GPC6, 1);
++
++ /* SPI chip select is gpio output */
++ s3c2410_gpio_cfgpin(S3C2410_GPG3, S3C2410_GPIO_OUTPUT);
++ s3c2410_gpio_setpin(S3C2410_GPG3, 1);
++ platform_device_register(&s3c_device_spi_lcm);
++
++ platform_device_register(&gta01_bl_dev);
++ platform_device_register(&gta01_button_dev);
++ platform_device_register(&gta01_pm_gsm_dev);
++
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA01v3_SYSTEM_REV:
++ case GTA01v4_SYSTEM_REV:
++ /* just use the default (GTA01_IRQ_PCF50606) */
++ break;
++ case GTA01Bv2_SYSTEM_REV:
++ case GTA01Bv3_SYSTEM_REV:
++ /* just use the default (GTA01_IRQ_PCF50606) */
++ gta01_led_resources[0].start =
++ gta01_led_resources[0].end = GTA01Bv2_GPIO_VIBRATOR_ON;
++ break;
++ case GTA01Bv4_SYSTEM_REV:
++ gta01_i2c_devs[0].irq = GTA01Bv4_IRQ_PCF50606;
++ gta01_led_resources[0].start =
++ gta01_led_resources[0].end = GTA01Bv4_GPIO_VIBRATOR_ON;
++ break;
++ }
++ mangle_pmu_pdata_by_system_rev();
++ i2c_register_board_info(0, gta01_i2c_devs, ARRAY_SIZE(gta01_i2c_devs));
++ spi_register_board_info(gta01_spi_board_info, ARRAY_SIZE(gta01_spi_board_info));
++
++ platform_device_register(&gta01_led_dev);
++
++ platform_add_devices(gta01_devices, ARRAY_SIZE(gta01_devices));
++
++ s3c_pm_init();
++
++ set_irq_type(GTA01_IRQ_MODEM, IRQ_TYPE_EDGE_RISING);
++ rc = request_irq(GTA01_IRQ_MODEM, gta01_modem_irq, IRQF_DISABLED,
++ "modem", NULL);
++ enable_irq_wake(GTA01_IRQ_MODEM);
++ printk(KERN_DEBUG "Enabled GSM wakeup IRQ %d (rc=%d)\n",
++ GTA01_IRQ_MODEM, rc);
++
++ pm_power_off = &gta01_power_off;
++}
++
++MACHINE_START(NEO1973_GTA01, "GTA01")
++ .phys_io = S3C2410_PA_UART,
++ .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
++ .boot_params = S3C2410_SDRAM_PA + 0x100,
++ .map_io = gta01_map_io,
++ .init_irq = s3c24xx_init_irq,
++ .init_machine = gta01_machine_init,
++ .timer = &s3c24xx_timer,
++MACHINE_END
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/mach-h1940.c linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/mach-h1940.c
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/mach-h1940.c 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/mach-h1940.c 2009-05-10 22:27:59.000000000 +0200
+@@ -131,6 +131,11 @@
+ .vbus_pin_inverted = 1,
+ };
+
++static struct s3c2410_ts_mach_info h1940_ts_cfg __initdata = {
++ .delay = 10000,
++ .presc = 49,
++ .oversampling_shift = 2,
++};
+
+ /**
+ * Set lcd on or off
+@@ -188,6 +193,7 @@
+ &s3c_device_i2c0,
+ &s3c_device_iis,
+ &s3c_device_usbgadget,
++ &s3c_device_ts,
+ &s3c_device_leds,
+ &s3c_device_bluetooth,
+ };
+@@ -203,7 +209,7 @@
+ #ifdef CONFIG_PM_H1940
+ memcpy(phys_to_virt(H1940_SUSPEND_RESUMEAT), h1940_pm_return, 1024);
+ #endif
+- s3c2410_pm_init();
++ s3c_pm_init();
+ }
+
+ static void __init h1940_init_irq(void)
+@@ -216,6 +222,7 @@
+ u32 tmp;
+
+ s3c24xx_fb_set_platdata(&h1940_fb_info);
++ set_s3c2410ts_info(&h1940_ts_cfg);
+ s3c24xx_udc_set_platdata(&h1940_udc_cfg);
+ s3c_i2c0_set_platdata(NULL);
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/mach-qt2410.c linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/mach-qt2410.c
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/mach-qt2410.c 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/mach-qt2410.c 2009-05-10 22:27:59.000000000 +0200
+@@ -1,6 +1,6 @@
+ /* linux/arch/arm/mach-s3c2410/mach-qt2410.c
+ *
+- * Copyright (C) 2006 by OpenMoko, Inc.
++ * Copyright (C) 2006 by Openmoko, Inc.
+ * Author: Harald Welte <laforge@openmoko.org>
+ * All rights reserved.
+ *
+@@ -214,7 +214,7 @@
+
+ /* SPI */
+
+-static void spi_gpio_cs(struct s3c2410_spigpio_info *spi, int cs)
++static void spi_gpio_cs(struct s3c2410_spigpio_info *spi, int csidx, int cs)
+ {
+ switch (cs) {
+ case BITBANG_CS_ACTIVE:
+@@ -321,6 +321,24 @@
+
+ __setup("tft=", qt2410_tft_setup);
+
++static struct resource qt2410_button_resources[] = {
++ [0] = {
++ .start = S3C2410_GPF0,
++ .end = S3C2410_GPF0,
++ },
++ [1] = {
++ .start = S3C2410_GPF2,
++ .end = S3C2410_GPF2,
++ },
++};
++
++struct platform_device qt2410_button_dev = {
++ .name ="qt2410-button",
++ .num_resources = ARRAY_SIZE(qt2410_button_resources),
++ .resource = qt2410_button_resources,
++};
++
++
+ static void __init qt2410_map_io(void)
+ {
+ s3c24xx_init_io(qt2410_iodesc, ARRAY_SIZE(qt2410_iodesc));
+@@ -355,7 +373,7 @@
+ s3c2410_gpio_cfgpin(S3C2410_GPB5, S3C2410_GPIO_OUTPUT);
+
+ platform_add_devices(qt2410_devices, ARRAY_SIZE(qt2410_devices));
+- s3c2410_pm_init();
++ s3c_pm_init();
+ }
+
+ MACHINE_START(QT2410, "QT2410")
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/Makefile linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/Makefile
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/Makefile 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/Makefile 2009-05-10 22:27:59.000000000 +0200
+@@ -15,6 +15,7 @@
+ obj-$(CONFIG_CPU_S3C2410_DMA) += dma.o
+ obj-$(CONFIG_S3C2410_PM) += pm.o sleep.o
+ obj-$(CONFIG_S3C2410_GPIO) += gpio.o
++#obj-$(CONFIG_S3C2410_CLOCK) += clock.o
+
+ # Machine support
+
+@@ -37,3 +38,5 @@
+ # machine additions
+
+ obj-$(CONFIG_MACH_BAST_IDE) += bast-ide.o
++obj-$(CONFIG_MACH_NEO1973_GTA01)+= mach-gta01.o
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/pm.c linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/pm.c
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2410/pm.c 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2410/pm.c 2009-05-10 22:27:59.000000000 +0200
+@@ -37,21 +37,14 @@
+ #include <plat/cpu.h>
+ #include <plat/pm.h>
+
+-#ifdef CONFIG_S3C2410_PM_DEBUG
+-extern void pm_dbg(const char *fmt, ...);
+-#define DBG(fmt...) pm_dbg(fmt)
+-#else
+-#define DBG(fmt...) printk(KERN_DEBUG fmt)
+-#endif
+-
+ static void s3c2410_pm_prepare(void)
+ {
+ /* ensure at least GSTATUS3 has the resume address */
+
+- __raw_writel(virt_to_phys(s3c2410_cpu_resume), S3C2410_GSTATUS3);
++ __raw_writel(virt_to_phys(s3c_cpu_resume), S3C2410_GSTATUS3);
+
+- DBG("GSTATUS3 0x%08x\n", __raw_readl(S3C2410_GSTATUS3));
+- DBG("GSTATUS4 0x%08x\n", __raw_readl(S3C2410_GSTATUS4));
++ S3C_PMDBG("GSTATUS3 0x%08x\n", __raw_readl(S3C2410_GSTATUS3));
++ S3C_PMDBG("GSTATUS4 0x%08x\n", __raw_readl(S3C2410_GSTATUS4));
+
+ if (machine_is_h1940()) {
+ void *base = phys_to_virt(H1940_SUSPEND_CHECK);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2412/dma.c linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2412/dma.c
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2412/dma.c 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2412/dma.c 2009-05-10 22:27:59.000000000 +0200
+@@ -20,17 +20,18 @@
+
+ #include <mach/dma.h>
+
+-#include <plat/dma.h>
++#include <plat/dma-plat.h>
+ #include <plat/cpu.h>
+
+ #include <plat/regs-serial.h>
+ #include <mach/regs-gpio.h>
+ #include <plat/regs-ac97.h>
++#include <plat/regs-dma.h>
+ #include <mach/regs-mem.h>
+ #include <mach/regs-lcd.h>
+ #include <mach/regs-sdi.h>
+-#include <asm/plat-s3c24xx/regs-s3c2412-iis.h>
+-#include <asm/plat-s3c24xx/regs-iis.h>
++#include <plat/regs-s3c2412-iis.h>
++#include <plat/regs-iis.h>
+ #include <plat/regs-spi.h>
+
+ #define MAP(x) { (x)| DMA_CH_VALID, (x)| DMA_CH_VALID, (x)| DMA_CH_VALID, (x)| DMA_CH_VALID }
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2412/Kconfig linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2412/Kconfig
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2412/Kconfig 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2412/Kconfig 2009-05-10 22:27:59.000000000 +0200
+@@ -38,6 +38,7 @@
+ config MACH_JIVE
+ bool "Logitech Jive"
+ select CPU_S3C2412
++ select S3C_DEV_USB_HOST
+ help
+ Say Y here if you are using the Logitech Jive.
+
+@@ -50,6 +51,7 @@
+ select CPU_S3C2412
+ select MACH_S3C2413
+ select MACH_SMDK
++ select S3C_DEV_USB_HOST
+ help
+ Say Y here if you are using an SMDK2413
+
+@@ -72,6 +74,7 @@
+ config MACH_VSTMS
+ bool "VMSTMS"
+ select CPU_S3C2412
++ select S3C_DEV_USB_HOST
+ help
+ Say Y here if you are using an VSTMS board
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2412/mach-jive.c linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2412/mach-jive.c
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2412/mach-jive.c 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2412/mach-jive.c 2009-05-10 22:27:59.000000000 +0200
+@@ -494,7 +494,7 @@
+ * correct address to resume from. */
+
+ __raw_writel(0x2BED, S3C2412_INFORM0);
+- __raw_writel(virt_to_phys(s3c2410_cpu_resume), S3C2412_INFORM1);
++ __raw_writel(virt_to_phys(s3c_cpu_resume), S3C2412_INFORM1);
+
+ return 0;
+ }
+@@ -630,7 +630,7 @@
+
+ /* initialise the power management now we've setup everything. */
+
+- s3c2410_pm_init();
++ s3c_pm_init();
+
+ s3c_device_nand.dev.platform_data = &jive_nand_info;
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2412/pm.c linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2412/pm.c
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2412/pm.c 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2412/pm.c 2009-05-10 22:27:59.000000000 +0200
+@@ -85,7 +85,7 @@
+
+ static int s3c2412_pm_suspend(struct sys_device *dev, pm_message_t state)
+ {
+- s3c2410_pm_do_save(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep));
++ s3c_pm_do_save(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep));
+ return 0;
+ }
+
+@@ -98,7 +98,7 @@
+ tmp |= S3C2412_PWRCFG_STANDBYWFI_IDLE;
+ __raw_writel(tmp, S3C2412_PWRCFG);
+
+- s3c2410_pm_do_restore(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep));
++ s3c_pm_do_restore(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep));
+ return 0;
+ }
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2412/s3c2412.c linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2412/s3c2412.c
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2412/s3c2412.c 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2412/s3c2412.c 2009-05-10 22:27:59.000000000 +0200
+@@ -231,5 +231,8 @@
+ {
+ printk("S3C2412: Initialising architecture\n");
+
++ /* make sure SD/MMC driver can distinguish 2412 from 2410 */
++ s3c_device_sdi.name = "s3c2412-sdi";
++
+ return sysdev_register(&s3c2412_sysdev);
+ }
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2440/dma.c linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2440/dma.c
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2440/dma.c 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2440/dma.c 2009-05-10 22:27:59.000000000 +0200
+@@ -17,18 +17,20 @@
+ #include <linux/sysdev.h>
+ #include <linux/serial_core.h>
+
++#include <mach/map.h>
+ #include <mach/dma.h>
+
+-#include <plat/dma.h>
++#include <plat/dma-plat.h>
+ #include <plat/cpu.h>
+
+ #include <plat/regs-serial.h>
+ #include <mach/regs-gpio.h>
+ #include <plat/regs-ac97.h>
++#include <plat/regs-dma.h>
+ #include <mach/regs-mem.h>
+ #include <mach/regs-lcd.h>
+ #include <mach/regs-sdi.h>
+-#include <asm/plat-s3c24xx/regs-iis.h>
++#include <plat/regs-iis.h>
+ #include <plat/regs-spi.h>
+
+ static struct s3c24xx_dma_map __initdata s3c2440_dma_mappings[] = {
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2440/Kconfig linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2440/Kconfig
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2440/Kconfig 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2440/Kconfig 2009-05-10 22:27:59.000000000 +0200
+@@ -23,7 +23,6 @@
+ help
+ Support for S3C2440 specific DMA code5A
+
+-
+ menu "S3C2440 Machines"
+
+ config MACH_ANUBIS
+@@ -33,6 +32,7 @@
+ select PM_SIMTEC if PM
+ select HAVE_PATA_PLATFORM
+ select S3C24XX_GPIO_EXTRA64
++ select S3C_DEV_USB_HOST
+ help
+ Say Y here if you are using the Simtec Electronics ANUBIS
+ development system
+@@ -43,6 +43,7 @@
+ select S3C24XX_DCLK
+ select PM_SIMTEC if PM
+ select S3C24XX_GPIO_EXTRA128
++ select S3C_DEV_USB_HOST
+ help
+ Say Y here if you are using the Simtec IM2440D20 module, also
+ known as the Osiris.
+@@ -58,12 +59,14 @@
+ bool "SMDK2440"
+ select CPU_S3C2440
+ select MACH_SMDK
++ select S3C_DEV_USB_HOST
+ help
+ Say Y here if you are using the SMDK2440.
+
+ config MACH_NEXCODER_2440
+ bool "NexVision NEXCODER 2440 Light Board"
+ select CPU_S3C2440
++ select S3C_DEV_USB_HOST
+ help
+ Say Y here if you are using the Nex Vision NEXCODER 2440 Light Board
+
+@@ -76,8 +79,17 @@
+ config MACH_AT2440EVB
+ bool "Avantech AT2440EVB development board"
+ select CPU_S3C2440
++ select S3C_DEV_USB_HOST
+ help
+ Say Y here if you are using the AT2440EVB development board
+
++config NEO1973_GTA02_2440
++ bool "Old FIC Neo1973 GTA02 hardware using S3C2440 CPU"
++ depends on MACH_NEO1973_GTA02
++ select CPU_S3C2440
++ help
++ Say Y here if you are using an early hardware revision
++ of the FIC/Openmoko Neo1973 GTA02 GSM Phone.
++
+ endmenu
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2440/mach-rx3715.c linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2440/mach-rx3715.c
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2440/mach-rx3715.c 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2440/mach-rx3715.c 2009-05-10 22:27:59.000000000 +0200
+@@ -203,7 +203,7 @@
+ #ifdef CONFIG_PM_H1940
+ memcpy(phys_to_virt(H1940_SUSPEND_RESUMEAT), h1940_pm_return, 1024);
+ #endif
+- s3c2410_pm_init();
++ s3c_pm_init();
+
+ s3c24xx_fb_set_platdata(&rx3715_fb_info);
+ platform_add_devices(rx3715_devices, ARRAY_SIZE(rx3715_devices));
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2440/Makefile linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2440/Makefile
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2440/Makefile 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2440/Makefile 2009-05-10 22:27:59.000000000 +0200
+@@ -22,3 +22,5 @@
+ obj-$(CONFIG_ARCH_S3C2440) += mach-smdk2440.o
+ obj-$(CONFIG_MACH_NEXCODER_2440) += mach-nexcoder.o
+ obj-$(CONFIG_MACH_AT2440EVB) += mach-at2440evb.o
++obj-$(CONFIG_MACH_HXD8) += mach-hxd8.o
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2440/s3c2440.c linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2440/s3c2440.c
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2440/s3c2440.c 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2440/s3c2440.c 2009-05-10 22:27:59.000000000 +0200
+@@ -46,6 +46,9 @@
+ s3c_device_wdt.resource[1].start = IRQ_S3C2440_WDT;
+ s3c_device_wdt.resource[1].end = IRQ_S3C2440_WDT;
+
++ /* make sure SD/MMC driver can distinguish 2440 from 2410 */
++ s3c_device_sdi.name = "s3c2440-sdi";
++
+ /* register our system device for everything else */
+
+ return sysdev_register(&s3c2440_sysdev);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2442/include/mach/gta02.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2442/include/mach/gta02.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2442/include/mach/gta02.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2442/include/mach/gta02.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,85 @@
++#ifndef _GTA02_H
++#define _GTA02_H
++
++#include <mach/regs-gpio.h>
++#include <mach/irqs.h>
++
++/* Different hardware revisions, passed in ATAG_REVISION by u-boot */
++#define GTA02v1_SYSTEM_REV 0x00000310
++#define GTA02v2_SYSTEM_REV 0x00000320
++#define GTA02v3_SYSTEM_REV 0x00000330
++#define GTA02v4_SYSTEM_REV 0x00000340
++#define GTA02v5_SYSTEM_REV 0x00000350
++#define GTA02v6_SYSTEM_REV 0x00000360
++
++#define GTA02_GPIO_n3DL_GSM S3C2410_GPA13 /* v1 + v2 + v3 only */
++
++#define GTA02_GPIO_PWR_LED1 S3C2410_GPB0
++#define GTA02_GPIO_PWR_LED2 S3C2410_GPB1
++#define GTA02_GPIO_AUX_LED S3C2410_GPB2
++#define GTA02_GPIO_VIBRATOR_ON S3C2410_GPB3
++#define GTA02_GPIO_MODEM_RST S3C2410_GPB5
++#define GTA02_GPIO_BT_EN S3C2410_GPB6
++#define GTA02_GPIO_MODEM_ON S3C2410_GPB7
++#define GTA02_GPIO_EXTINT8 S3C2410_GPB8
++#define GTA02_GPIO_USB_PULLUP S3C2410_GPB9
++
++#define GTA02_GPIO_PIO5 S3C2410_GPC5 /* v3 + v4 only */
++#define GTA02v3_GPIO_nG1_CS S3C2410_GPD12 /* v3 + v4 only */
++#define GTA02v3_GPIO_nG2_CS S3C2410_GPD13 /* v3 + v4 only */
++#define GTA02v5_GPIO_HDQ S3C2410_GPD14 /* v5 + */
++
++#define GTA02_GPIO_nG1_INT S3C2410_GPF0
++#define GTA02_GPIO_IO1 S3C2410_GPF1
++#define GTA02_GPIO_PIO_2 S3C2410_GPF2 /* v2 + v3 + v4 only */
++#define GTA02_GPIO_JACK_INSERT S3C2410_GPF4
++#define GTA02_GPIO_WLAN_GPIO1 S3C2410_GPF5 /* v2 + v3 + v4 only */
++#define GTA02_GPIO_AUX_KEY S3C2410_GPF6
++#define GTA02_GPIO_HOLD_KEY S3C2410_GPF7
++
++#define GTA02_GPIO_3D_IRQ S3C2410_GPG4
++#define GTA02v2_GPIO_nG2_INT S3C2410_GPG8 /* v2 + v3 + v4 only */
++#define GTA02v3_GPIO_nUSB_OC S3C2410_GPG9 /* v3 + v4 only */
++#define GTA02v3_GPIO_nUSB_FLT S3C2410_GPG10 /* v3 + v4 only */
++#define GTA02v3_GPIO_nGSM_OC S3C2410_GPG11 /* v3 + v4 only */
++
++#define GTA02_GPIO_AMP_SHUT S3C2440_GPJ1 /* v2 + v3 + v4 only */
++#define GTA02v1_GPIO_WLAN_GPIO10 S3C2440_GPJ2
++#define GTA02_GPIO_HP_IN S3C2440_GPJ2 /* v2 + v3 + v4 only */
++#define GTA02_GPIO_INT0 S3C2440_GPJ3 /* v2 + v3 + v4 only */
++#define GTA02_GPIO_nGSM_EN S3C2440_GPJ4
++#define GTA02_GPIO_3D_RESET S3C2440_GPJ5
++#define GTA02_GPIO_nDL_GSM S3C2440_GPJ6 /* v4 + v5 only */
++#define GTA02_GPIO_WLAN_GPIO0 S3C2440_GPJ7
++#define GTA02v1_GPIO_BAT_ID S3C2440_GPJ8
++#define GTA02_GPIO_KEEPACT S3C2440_GPJ8
++#define GTA02v1_GPIO_HP_IN S3C2440_GPJ10
++#define GTA02_CHIP_PWD S3C2440_GPJ11 /* v2 + v3 + v4 only */
++#define GTA02_GPIO_nWLAN_RESET S3C2440_GPJ12 /* v2 + v3 + v4 only */
++
++#define GTA02_IRQ_GSENSOR_1 IRQ_EINT0
++#define GTA02_IRQ_MODEM IRQ_EINT1
++#define GTA02_IRQ_PIO_2 IRQ_EINT2 /* v2 + v3 + v4 only */
++#define GTA02_IRQ_nJACK_INSERT IRQ_EINT4
++#define GTA02_IRQ_WLAN_GPIO1 IRQ_EINT5
++#define GTA02_IRQ_AUX IRQ_EINT6
++#define GTA02_IRQ_nHOLD IRQ_EINT7
++#define GTA02_IRQ_PCF50633 IRQ_EINT9
++#define GTA02_IRQ_3D IRQ_EINT12
++#define GTA02_IRQ_GSENSOR_2 IRQ_EINT16 /* v2 + v3 + v4 only */
++#define GTA02v3_IRQ_nUSB_OC IRQ_EINT17 /* v3 + v4 only */
++#define GTA02v3_IRQ_nUSB_FLT IRQ_EINT18 /* v3 + v4 only */
++#define GTA02v3_IRQ_nGSM_OC IRQ_EINT19 /* v3 + v4 only */
++
++/* returns 00 000 on GTA02 A5 and earlier, A6 returns 01 001 */
++#define GTA02_PCB_ID1_0 S3C2410_GPC13
++#define GTA02_PCB_ID1_1 S3C2410_GPC15
++#define GTA02_PCB_ID1_2 S3C2410_GPD0
++#define GTA02_PCB_ID2_0 S3C2410_GPD3
++#define GTA02_PCB_ID2_1 S3C2410_GPD4
++
++int gta02_get_pcb_revision(void);
++
++extern struct pcf50633 *gta02_pcf;
++
++#endif /* _GTA02_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2442/Kconfig linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2442/Kconfig
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2442/Kconfig 2009-05-10 22:05:02.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2442/Kconfig 2009-05-10 22:27:59.000000000 +0200
+@@ -11,6 +11,7 @@
+ select S3C2410_CLOCK
+ select S3C2410_GPIO
+ select S3C2410_PM if PM
++ select S3C2440_DMA if S3C2410_DMA
+ select CPU_S3C244X
+ select CPU_LLSERIAL_S3C2440
+ help
+@@ -24,6 +25,20 @@
+ depends on ARCH_S3C2440
+ select CPU_S3C2442
+
++config MACH_NEO1973_GTA02
++ bool "FIC Neo1973 GSM Phone (GTA02 Hardware)"
++ select CPU_S3C2442
++ select MFD_PCF50633
++ select PCF50633_GPIO
++ select I2C
++ select POWER_SUPPLY
++ select MACH_NEO1973
++ select S3C_PWM
++ select FIQ
++ select S3C_DEV_USB_HOST
++ help
++ Say Y here if you are using the FIC Neo1973 GSM Phone
++
+
+ endmenu
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2442/mach-gta02.c linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2442/mach-gta02.c
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2442/mach-gta02.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2442/mach-gta02.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,1706 @@
++/*
++ * linux/arch/arm/mach-s3c2440/mach-gta02.c
++ *
++ * S3C2440 Machine Support for the FIC GTA02 (Neo1973)
++ *
++ * Copyright (C) 2006-2007 by Openmoko, Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/interrupt.h>
++#include <linux/list.h>
++#include <linux/delay.h>
++#include <linux/timer.h>
++#include <linux/init.h>
++#include <linux/workqueue.h>
++#include <linux/platform_device.h>
++#include <linux/serial_core.h>
++#include <linux/spi/spi.h>
++#include <linux/spi/glamo.h>
++#include <linux/spi/spi_bitbang.h>
++#include <linux/mmc/host.h>
++
++#include <linux/mtd/mtd.h>
++#include <linux/mtd/nand.h>
++#include <linux/mtd/nand_ecc.h>
++#include <linux/mtd/partitions.h>
++#include <linux/mtd/physmap.h>
++
++#include <linux/i2c.h>
++#include <linux/backlight.h>
++#include <linux/regulator/machine.h>
++
++#include <linux/mfd/pcf50633/core.h>
++#include <linux/mfd/pcf50633/mbc.h>
++#include <linux/mfd/pcf50633/adc.h>
++#include <linux/mfd/pcf50633/gpio.h>
++#include <linux/mfd/pcf50633/pmic.h>
++
++#include <linux/lis302dl.h>
++
++#include <asm/mach/arch.h>
++#include <asm/mach/map.h>
++#include <asm/mach/irq.h>
++
++#include <mach/hardware.h>
++#include <mach/io.h>
++#include <asm/irq.h>
++#include <asm/mach-types.h>
++
++#include <mach/regs-irq.h>
++#include <mach/regs-gpio.h>
++#include <mach/regs-gpioj.h>
++#include <mach/fb.h>
++#include <mach/mci.h>
++#include <mach/ts.h>
++#include <mach/spi.h>
++#include <mach/spi-gpio.h>
++#include <mach/regs-mem.h>
++#include <mach/spi-gpio.h>
++#include <plat/pwm.h>
++#include <mach/cpu.h>
++
++#include <mach/gta02.h>
++
++#include <plat/regs-serial.h>
++#include <plat/nand.h>
++#include <plat/devs.h>
++#include <plat/cpu.h>
++#include <plat/pm.h>
++#include <plat/udc.h>
++#include <plat/iic.h>
++#include <plat/usb-control.h>
++#include <asm/plat-s3c24xx/neo1973.h>
++#include <mach/neo1973-pm-gsm.h>
++#include <mach/gta02-pm-wlan.h>
++#include <plat/regs-timer.h>
++
++#include <linux/jbt6k74.h>
++
++#include <linux/glamofb.h>
++
++#include <linux/hdq.h>
++#include <linux/bq27000_battery.h>
++
++#include "../plat-s3c24xx/neo1973_pm_gps.h"
++
++#include <../drivers/input/touchscreen/ts_filter_chain.h>
++#ifdef CONFIG_TOUCHSCREEN_FILTER
++#include <../drivers/input/touchscreen/ts_filter_linear.h>
++#include <../drivers/input/touchscreen/ts_filter_mean.h>
++#include <../drivers/input/touchscreen/ts_filter_median.h>
++#include <../drivers/input/touchscreen/ts_filter_group.h>
++#endif
++
++#include <asm/fiq.h>
++
++#include <linux/neo1973_vibrator.h>
++
++/* arbitrates which sensor IRQ owns the shared SPI bus */
++static spinlock_t motion_irq_lock;
++
++
++/* -------------------------------------------------------------------------------
++ * GTA02 FIQ related
++ *
++ * Calls into vibrator and hdq and based on the return values
++ * determines if we the FIQ source be kept alive
++ */
++
++#define DIVISOR_FROM_US(x) ((x) << 3)
++
++#ifdef CONFIG_HDQ_GPIO_BITBANG
++#define FIQ_DIVISOR_HDQ DIVISOR_FROM_US(HDQ_SAMPLE_PERIOD_US)
++extern int hdq_fiq_handler(void);
++#endif
++
++#ifdef CONFIG_LEDS_NEO1973_VIBRATOR
++#define FIQ_DIVISOR_VIBRATOR DIVISOR_FROM_US(100)
++extern int neo1973_vibrator_fiq_handler(void);
++#endif
++
++/* Global data related to our fiq source */
++static u32 gta02_fiq_ack_mask;
++static struct s3c2410_pwm gta02_fiq_pwm_timer;
++static u16 gta02_fiq_timer_index;
++static int gta02_fiq_irq;
++
++static void gta02_fiq_handler(void)
++{
++ u16 divisor = 0xffff;
++
++ /* Vibrator servicing */
++
++ /* disable further timer interrupts if nobody has any work
++ * or adjust rate according to who still has work
++ *
++ * CAUTION: it means forground code must disable FIQ around
++ * its own non-atomic S3C2410_INTMSK changes... not common
++ * thankfully and taken care of by the fiq-basis patch
++ */
++
++#ifdef CONFIG_LEDS_NEO1973_VIBRATOR
++ if (neo1973_vibrator_fiq_handler())
++ divisor = FIQ_DIVISOR_VIBRATOR;
++#endif
++
++#ifdef CONFIG_HDQ_GPIO_BITBANG
++ if (hdq_fiq_handler())
++ divisor = FIQ_DIVISOR_HDQ;
++#endif
++
++ if (divisor == 0xffff) /* mask the fiq irq source */
++ __raw_writel(__raw_readl(S3C2410_INTMSK) | gta02_fiq_ack_mask,
++ S3C2410_INTMSK);
++ else /* still working, maybe at a different rate */
++ __raw_writel(divisor, S3C2410_TCNTB(gta02_fiq_timer_index));
++
++ __raw_writel(gta02_fiq_ack_mask, S3C2410_SRCPND);
++}
++
++static void gta02_fiq_kick(void)
++{
++ unsigned long flags;
++ u32 tcon;
++
++ /* we have to take care about FIQ because this modification is
++ * non-atomic, FIQ could come in after the read and before the
++ * writeback and its changes to the register would be lost
++ * (platform INTMSK mod code is taken care of already)
++ */
++ local_save_flags(flags);
++ local_fiq_disable();
++ /* allow FIQs to resume */
++ __raw_writel(__raw_readl(S3C2410_INTMSK) &
++ ~(1 << (gta02_fiq_irq - S3C2410_CPUIRQ_OFFSET)),
++ S3C2410_INTMSK);
++ tcon = __raw_readl(S3C2410_TCON) & ~S3C2410_TCON_T3START;
++ /* fake the timer to a count of 1 */
++ __raw_writel(1, S3C2410_TCNTB(gta02_fiq_timer_index));
++ __raw_writel(tcon | S3C2410_TCON_T3MANUALUPD, S3C2410_TCON);
++ __raw_writel(tcon | S3C2410_TCON_T3MANUALUPD | S3C2410_TCON_T3START,
++ S3C2410_TCON);
++ __raw_writel(tcon | S3C2410_TCON_T3START, S3C2410_TCON);
++ local_irq_restore(flags);
++}
++
++static int gta02_fiq_enable(void)
++{
++ int irq_index_fiq = IRQ_TIMER3;
++ int rc = 0;
++
++ local_fiq_disable();
++
++ gta02_fiq_irq = irq_index_fiq;
++ gta02_fiq_ack_mask = 1 << (irq_index_fiq - S3C2410_CPUIRQ_OFFSET);
++ gta02_fiq_timer_index = (irq_index_fiq - IRQ_TIMER0);
++
++ /* set up the timer to operate as a pwm device */
++
++ rc = s3c2410_pwm_init(&gta02_fiq_pwm_timer);
++ if (rc)
++ goto bail;
++
++ gta02_fiq_pwm_timer.timerid = PWM0 + gta02_fiq_timer_index;
++ gta02_fiq_pwm_timer.prescaler = (6 - 1) / 2;
++ gta02_fiq_pwm_timer.divider = S3C2410_TCFG1_MUX3_DIV2;
++ /* default rate == ~32us */
++ gta02_fiq_pwm_timer.counter = gta02_fiq_pwm_timer.comparer = 3000;
++
++ rc = s3c2410_pwm_enable(&gta02_fiq_pwm_timer);
++ if (rc)
++ goto bail;
++
++ s3c2410_pwm_start(&gta02_fiq_pwm_timer);
++
++ /* let our selected interrupt be a magic FIQ interrupt */
++ __raw_writel(gta02_fiq_ack_mask, S3C2410_INTMOD);
++
++ /* it's ready to go as soon as we unmask the source in S3C2410_INTMSK */
++ local_fiq_enable();
++
++ set_fiq_c_handler(gta02_fiq_handler);
++
++ return 0;
++
++bail:
++ printk(KERN_ERR "Could not initialize FIQ for GTA02: %d\n", rc);
++
++ return rc;
++}
++
++static void gta02_fiq_disable(void)
++{
++ __raw_writel(0, S3C2410_INTMOD);
++ local_fiq_disable();
++ gta02_fiq_irq = 0; /* no active source interrupt now either */
++
++}
++/* -------------------- /GTA02 FIQ Handler ------------------------------------- */
++
++/*
++ * this gets called every 1ms when we paniced.
++ */
++
++static long gta02_panic_blink(long count)
++{
++ long delay = 0;
++ static long last_blink;
++ static char led;
++
++ if (count - last_blink < 100) /* 200ms period, fast blink */
++ return 0;
++
++ led ^= 1;
++ s3c2410_gpio_cfgpin(GTA02_GPIO_AUX_LED, S3C2410_GPIO_OUTPUT);
++ neo1973_gpb_setpin(GTA02_GPIO_AUX_LED, led);
++
++ last_blink = count;
++ return delay;
++}
++
++
++/**
++ * returns PCB revision information in b9,b8 and b2,b1,b0
++ * Pre-GTA02 A6 returns 0x000
++ * GTA02 A6 returns 0x101
++ * ...
++ */
++
++int gta02_get_pcb_revision(void)
++{
++ int n;
++ int u = 0;
++ static unsigned long pinlist[] = {
++ GTA02_PCB_ID1_0,
++ GTA02_PCB_ID1_1,
++ GTA02_PCB_ID1_2,
++ GTA02_PCB_ID2_0,
++ GTA02_PCB_ID2_1,
++ };
++ static int pin_offset[] = {
++ 0, 1, 2, 8, 9
++ };
++
++ for (n = 0 ; n < ARRAY_SIZE(pinlist); n++) {
++ /*
++ * set the PCB version GPIO to be pulled-down input
++ * force low briefly first
++ */
++ s3c2410_gpio_cfgpin(pinlist[n], S3C2410_GPIO_OUTPUT);
++ s3c2410_gpio_setpin(pinlist[n], 0);
++ /* misnomer: it is a pullDOWN in 2442 */
++ s3c2410_gpio_pullup(pinlist[n], 1);
++ s3c2410_gpio_cfgpin(pinlist[n], S3C2410_GPIO_INPUT);
++
++ udelay(10);
++
++ if (s3c2410_gpio_getpin(pinlist[n]))
++ u |= 1 << pin_offset[n];
++
++ /*
++ * when not being interrogated, all of the revision GPIO
++ * are set to output HIGH without pulldown so no current flows
++ * if they are NC or pulled up.
++ */
++ s3c2410_gpio_setpin(pinlist[n], 1);
++ s3c2410_gpio_cfgpin(pinlist[n], S3C2410_GPIO_OUTPUT);
++ /* misnomer: it is a pullDOWN in 2442 */
++ s3c2410_gpio_pullup(pinlist[n], 0);
++ }
++
++ return u;
++}
++
++struct platform_device gta02_version_device = {
++ .name = "neo1973-version",
++ .num_resources = 0,
++};
++
++struct platform_device gta02_resume_reason_device = {
++ .name = "neo1973-resume",
++ .num_resources = 0,
++};
++
++struct platform_device gta02_memconfig_device = {
++ .name = "neo1973-memconfig",
++ .num_resources = 0,
++};
++
++static struct map_desc gta02_iodesc[] __initdata = {
++ {
++ .virtual = 0xe0000000,
++ .pfn = __phys_to_pfn(S3C2410_CS3+0x01000000),
++ .length = SZ_1M,
++ .type = MT_DEVICE
++ },
++};
++
++#define UCON (S3C2410_UCON_DEFAULT | S3C2443_UCON_RXERR_IRQEN)
++#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
++#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
++
++static struct s3c2410_uartcfg gta02_uartcfgs[] = {
++ [0] = {
++ .hwport = 0,
++ .flags = 0,
++ .ucon = UCON,
++ .ulcon = ULCON,
++ .ufcon = UFCON,
++ },
++ [1] = {
++ .hwport = 1,
++ .flags = 0,
++ .ucon = UCON,
++ .ulcon = ULCON,
++ .ufcon = UFCON,
++ },
++ [2] = {
++ .hwport = 2,
++ .flags = 0,
++ .ucon = UCON,
++ .ulcon = ULCON,
++ .ufcon = UFCON,
++ },
++
++};
++
++struct pcf50633 *gta02_pcf;
++
++#ifdef CONFIG_CHARGER_PCF50633
++static int gta02_get_charger_online_status(void)
++{
++ struct pcf50633 *pcf = gta02_pcf;
++
++ return pcf50633_mbc_get_status(pcf) & PCF50633_MBC_USB_ONLINE;
++}
++
++static int gta02_get_charger_active_status(void)
++{
++ struct pcf50633 *pcf = gta02_pcf;
++
++ return pcf50633_mbc_get_status(pcf) & PCF50633_MBC_USB_ACTIVE;
++}
++
++#define ADC_NOM_CHG_DETECT_1A 6
++#define ADC_NOM_CHG_DETECT_USB 43
++
++static void
++gta02_configure_pmu_for_charger(struct pcf50633 *pcf, void *unused, int res)
++{
++ int ma;
++
++ /* Interpret charger type */
++ if (res < ((ADC_NOM_CHG_DETECT_USB + ADC_NOM_CHG_DETECT_1A) / 2)) {
++
++ /* Stop GPO driving out now that we have a IA charger */
++ pcf50633_gpio_set(pcf, PCF50633_GPO, 0);
++
++ ma = 1000;
++ } else
++ ma = 100;
++
++ pcf50633_mbc_usb_curlim_set(pcf, ma);
++}
++
++static struct delayed_work gta02_charger_work;
++static int gta02_usb_vbus_draw;
++
++static void gta02_charger_worker(struct work_struct *work)
++{
++ struct pcf50633 *pcf = gta02_pcf;
++
++ if (gta02_usb_vbus_draw) {
++ pcf50633_mbc_usb_curlim_set(pcf, gta02_usb_vbus_draw);
++ return;
++ } else {
++#ifdef CONFIG_PCF50633_ADC
++ pcf50633_adc_async_read(pcf,
++ PCF50633_ADCC1_MUX_ADCIN1,
++ PCF50633_ADCC1_AVERAGE_16,
++ gta02_configure_pmu_for_charger, NULL);
++#else
++ /* If the PCF50633 ADC is disabled we fallback to a 100mA limit for safety. */
++ pcf50633_mbc_usb_curlim_set(pcf, 100);
++#endif
++ return;
++ }
++}
++
++#define GTA02_CHARGER_CONFIGURE_TIMEOUT ((3000 * HZ) / 1000)
++static void gta02_pmu_event_callback(struct pcf50633 *pcf, int irq)
++{
++ if (irq == PCF50633_IRQ_USBINS) {
++ schedule_delayed_work(&gta02_charger_work,
++ GTA02_CHARGER_CONFIGURE_TIMEOUT);
++ return;
++ } else if (irq == PCF50633_IRQ_USBREM) {
++ cancel_delayed_work_sync(&gta02_charger_work);
++ gta02_usb_vbus_draw = 0;
++ }
++}
++
++static void gta02_pmu_force_shutdown(struct pcf50633 *pcf)
++{
++ pcf50633_reg_set_bit_mask(pcf, PCF50633_REG_OOCSHDWN,
++ PCF50633_OOCSHDWN_GOSTDBY, PCF50633_OOCSHDWN_GOSTDBY);
++}
++
++
++static void gta02_udc_vbus_draw(unsigned int ma)
++{
++ if (!gta02_pcf)
++ return;
++
++ gta02_usb_vbus_draw = ma;
++
++ schedule_delayed_work(&gta02_charger_work,
++ GTA02_CHARGER_CONFIGURE_TIMEOUT);
++}
++#else /* !CONFIG_CHARGER_PCF50633 */
++#define gta02_get_charger_online_status NULL
++#define gta02_get_charger_active_status NULL
++#define gta02_pmu_event_callback NULL
++#define gta02_udc_vbus_draw NULL
++#endif
++
++static struct platform_device gta01_pm_gps_dev = {
++ .name = "neo1973-pm-gps",
++};
++
++static struct platform_device gta01_pm_bt_dev = {
++ .name = "neo1973-pm-bt",
++};
++
++static struct platform_device gta02_pm_gsm_dev = {
++ .name = "neo1973-pm-gsm",
++};
++
++/* this is called when pc50633 is probed, unfortunately quite late in the
++ * day since it is an I2C bus device. Here we can belatedly define some
++ * platform devices with the advantage that we can mark the pcf50633 as the
++ * parent. This makes them get suspended and resumed with their parent
++ * the pcf50633 still around.
++ */
++
++static struct platform_device gta02_glamo_dev;
++static void mangle_glamo_res_by_system_rev(void);
++
++static void gta02_pmu_attach_child_devices(struct pcf50633 *pcf);
++static void gta02_pmu_regulator_registered(struct pcf50633 *pcf, int id);
++
++static struct platform_device gta02_pm_wlan_dev = {
++ .name = "gta02-pm-wlan",
++};
++
++static struct regulator_consumer_supply ldo4_consumers[] = {
++ {
++ .dev = &gta01_pm_bt_dev.dev,
++ .supply = "BT_3V2",
++ },
++};
++
++static struct regulator_consumer_supply ldo5_consumers[] = {
++ {
++ .dev = &gta01_pm_gps_dev.dev,
++ .supply = "RF_3V",
++ },
++};
++
++/*
++ * We need this dummy thing to fill the regulator consumers
++ */
++static struct platform_device gta02_mmc_dev = {
++ /* details filled in by glamo core */
++};
++
++static struct regulator_consumer_supply hcldo_consumers[] = {
++ {
++ .dev = &gta02_mmc_dev.dev,
++ .supply = "SD_3V3",
++ },
++};
++
++static char *gta02_batteries[] = {
++ "battery",
++};
++
++struct pcf50633_platform_data gta02_pcf_pdata = {
++ .resumers = {
++ [0] = PCF50633_INT1_USBINS |
++ PCF50633_INT1_USBREM |
++ PCF50633_INT1_ALARM,
++ [1] = PCF50633_INT2_ONKEYF,
++ [2] = PCF50633_INT3_ONKEY1S,
++ [3] = PCF50633_INT4_LOWSYS |
++ PCF50633_INT4_LOWBAT |
++ PCF50633_INT4_HIGHTMP,
++ },
++
++ .batteries = gta02_batteries,
++ .num_batteries = ARRAY_SIZE(gta02_batteries),
++ .charging_restart_interval = (900 * HZ),
++ .chg_ref_current_ma = 1000,
++
++ .reg_init_data = {
++ [PCF50633_REGULATOR_AUTO] = {
++ .constraints = {
++ .name = "IO_3V3",
++ .min_uV = 3300000,
++ .max_uV = 3300000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .boot_on = 1,
++ .apply_uV = 1,
++ .state_mem = {
++ .enabled = 1,
++ },
++ },
++ .num_consumer_supplies = 0,
++ },
++ [PCF50633_REGULATOR_DOWN1] = {
++ .constraints = {
++ .name = "CORE_1V3",
++ .min_uV = 1300000,
++ .max_uV = 1600000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .boot_on = 1,
++ .apply_uV = 1,
++ },
++ .num_consumer_supplies = 0,
++ },
++ [PCF50633_REGULATOR_DOWN2] = {
++ .constraints = {
++ .name = "IO_1V8",
++ .min_uV = 1800000,
++ .max_uV = 1800000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .apply_uV = 1,
++ .boot_on = 1,
++ .state_mem = {
++ .enabled = 1,
++ },
++ },
++ .num_consumer_supplies = 0,
++ },
++ [PCF50633_REGULATOR_HCLDO] = {
++ .constraints = {
++ .name = "SD_3V3",
++ .min_uV = 2000000,
++ .max_uV = 3300000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
++ .boot_on = 1,
++ },
++ .num_consumer_supplies = 1,
++ .consumer_supplies = hcldo_consumers,
++ },
++ [PCF50633_REGULATOR_LDO1] = {
++ .constraints = {
++ .name = "GSENSOR_3V3",
++ .min_uV = 1300000,
++ .max_uV = 1300000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .apply_uV = 1,
++ },
++ .num_consumer_supplies = 0,
++ },
++ [PCF50633_REGULATOR_LDO2] = {
++ .constraints = {
++ .name = "CODEC_3V3",
++ .min_uV = 3300000,
++ .max_uV = 3300000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .apply_uV = 1,
++ },
++ .num_consumer_supplies = 0,
++ },
++ [PCF50633_REGULATOR_LDO3] = {
++ .constraints = {
++ .min_uV = 3000000,
++ .max_uV = 3000000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .apply_uV = 1,
++ },
++ .num_consumer_supplies = 0,
++ },
++ [PCF50633_REGULATOR_LDO4] = {
++ .constraints = {
++ .name = "BT_3V2",
++ .min_uV = 3200000,
++ .max_uV = 3200000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .apply_uV = 1,
++ },
++ .num_consumer_supplies = 1,
++ .consumer_supplies = ldo4_consumers,
++ },
++ [PCF50633_REGULATOR_LDO5] = {
++ .constraints = {
++ .name = "RF_3V",
++ .min_uV = 1500000,
++ .max_uV = 1500000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .apply_uV = 1,
++ .state_mem = {
++ .enabled = 1,
++ },
++ },
++ .num_consumer_supplies = 1,
++ .consumer_supplies = ldo5_consumers,
++ },
++ [PCF50633_REGULATOR_LDO6] = {
++ .constraints = {
++ .name = "LCM_3V",
++ .min_uV = 0,
++ .max_uV = 3300000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ },
++ .num_consumer_supplies = 0,
++ },
++ [PCF50633_REGULATOR_MEMLDO] = {
++ .constraints = {
++ .min_uV = 1800000,
++ .max_uV = 1800000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .state_mem = {
++ .enabled = 1,
++ },
++ },
++ .num_consumer_supplies = 0,
++ },
++
++ },
++ .probe_done = gta02_pmu_attach_child_devices,
++ .regulator_registered = gta02_pmu_regulator_registered,
++ .mbc_event_callback = gta02_pmu_event_callback,
++ .force_shutdown = gta02_pmu_force_shutdown,
++};
++
++static void mangle_pmu_pdata_by_system_rev(void)
++{
++ struct regulator_init_data *reg_init_data;
++
++ reg_init_data = gta02_pcf_pdata.reg_init_data;
++
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA02v1_SYSTEM_REV:
++ /* FIXME: this is only in v1 due to wrong PMU variant */
++ reg_init_data[PCF50633_REGULATOR_DOWN2]
++ .constraints.state_mem.enabled = 1;
++ break;
++ case GTA02v2_SYSTEM_REV:
++ case GTA02v3_SYSTEM_REV:
++ case GTA02v4_SYSTEM_REV:
++ case GTA02v5_SYSTEM_REV:
++ case GTA02v6_SYSTEM_REV:
++ reg_init_data[PCF50633_REGULATOR_LDO1]
++ .constraints.min_uV = 3300000;
++ reg_init_data[PCF50633_REGULATOR_LDO1]
++ .constraints.min_uV = 3300000;
++ reg_init_data[PCF50633_REGULATOR_LDO1]
++ .constraints.state_mem.enabled = 0;
++
++ reg_init_data[PCF50633_REGULATOR_LDO5]
++ .constraints.min_uV = 3000000;
++ reg_init_data[PCF50633_REGULATOR_LDO5]
++ .constraints.max_uV = 3000000;
++
++ reg_init_data[PCF50633_REGULATOR_LDO6]
++ .constraints.min_uV = 3000000;
++ reg_init_data[PCF50633_REGULATOR_LDO6]
++ .constraints.max_uV = 3000000;
++ reg_init_data[PCF50633_REGULATOR_LDO6]
++ .constraints.apply_uV = 1;
++ break;
++ default:
++ break;
++ }
++}
++
++#ifdef CONFIG_HDQ_GPIO_BITBANG
++/* BQ27000 Battery */
++
++struct bq27000_platform_data bq27000_pdata = {
++ .name = "battery",
++ .rsense_mohms = 20,
++ .hdq_read = hdq_read,
++ .hdq_write = hdq_write,
++ .hdq_initialized = hdq_initialized,
++ .get_charger_online_status = gta02_get_charger_online_status,
++ .get_charger_active_status = gta02_get_charger_active_status
++};
++
++struct platform_device bq27000_battery_device = {
++ .name = "bq27000-battery",
++ .dev = {
++ .platform_data = &bq27000_pdata,
++ },
++};
++
++/* HDQ */
++
++static void gta02_hdq_attach_child_devices(struct device *parent_device)
++{
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA02v5_SYSTEM_REV:
++ case GTA02v6_SYSTEM_REV:
++ bq27000_battery_device.dev.parent = parent_device;
++ platform_device_register(&bq27000_battery_device);
++ break;
++ default:
++ break;
++ }
++}
++
++static void gta02_hdq_gpio_direction_out(void)
++{
++ s3c2410_gpio_cfgpin(GTA02v5_GPIO_HDQ, S3C2410_GPIO_OUTPUT);
++}
++
++static void gta02_hdq_gpio_direction_in(void)
++{
++ s3c2410_gpio_cfgpin(GTA02v5_GPIO_HDQ, S3C2410_GPIO_INPUT);
++}
++
++static void gta02_hdq_gpio_set_value(int val)
++{
++
++ s3c2410_gpio_setpin(GTA02v5_GPIO_HDQ, val);
++}
++
++static int gta02_hdq_gpio_get_value(void)
++{
++ return s3c2410_gpio_getpin(GTA02v5_GPIO_HDQ);
++}
++
++static struct resource gta02_hdq_resources[] = {
++ [0] = {
++ .start = GTA02v5_GPIO_HDQ,
++ .end = GTA02v5_GPIO_HDQ,
++ },
++};
++
++struct hdq_platform_data gta02_hdq_platform_data = {
++ .attach_child_devices = gta02_hdq_attach_child_devices,
++ .gpio_dir_out = gta02_hdq_gpio_direction_out,
++ .gpio_dir_in = gta02_hdq_gpio_direction_in,
++ .gpio_set = gta02_hdq_gpio_set_value,
++ .gpio_get = gta02_hdq_gpio_get_value,
++
++ .enable_fiq = gta02_fiq_enable,
++ .disable_fiq = gta02_fiq_disable,
++ .kick_fiq = gta02_fiq_kick,
++
++};
++
++struct platform_device gta02_hdq_device = {
++ .name = "hdq",
++ .num_resources = 1,
++ .resource = gta02_hdq_resources,
++ .dev = {
++ .platform_data = &gta02_hdq_platform_data,
++ },
++};
++#endif
++
++
++#ifdef CONFIG_LEDS_NEO1973_VIBRATOR
++/* vibrator (child of FIQ) */
++
++static struct resource gta02_vibrator_resources[] = {
++ [0] = {
++ .start = GTA02_GPIO_VIBRATOR_ON,
++ .end = GTA02_GPIO_VIBRATOR_ON,
++ },
++};
++struct neo1973_vib_platform_data gta02_vib_pdata = {
++ .enable_fiq = gta02_fiq_enable,
++ .disable_fiq = gta02_fiq_disable,
++ .kick_fiq = gta02_fiq_kick,
++};
++
++static struct platform_device gta02_vibrator_dev = {
++ .name = "neo1973-vibrator",
++ .num_resources = ARRAY_SIZE(gta02_vibrator_resources),
++ .resource = gta02_vibrator_resources,
++ .dev = {
++ .platform_data = &gta02_vib_pdata,
++ },
++};
++#endif
++
++/* NOR Flash */
++
++#define GTA02_FLASH_BASE 0x18000000 /* GCS3 */
++#define GTA02_FLASH_SIZE 0x200000 /* 2MBytes */
++
++static struct physmap_flash_data gta02_nor_flash_data = {
++ .width = 2,
++};
++
++static struct resource gta02_nor_flash_resource = {
++ .start = GTA02_FLASH_BASE,
++ .end = GTA02_FLASH_BASE + GTA02_FLASH_SIZE - 1,
++ .flags = IORESOURCE_MEM,
++};
++
++static struct platform_device gta02_nor_flash = {
++ .name = "physmap-flash",
++ .id = 0,
++ .dev = {
++ .platform_data = &gta02_nor_flash_data,
++ },
++ .resource = &gta02_nor_flash_resource,
++ .num_resources = 1,
++};
++
++
++struct platform_device s3c24xx_pwm_device = {
++ .name = "s3c24xx_pwm",
++ .num_resources = 0,
++};
++
++static struct i2c_board_info gta02_i2c_devs[] __initdata = {
++ {
++ I2C_BOARD_INFO("pcf50633", 0x73),
++ .irq = GTA02_IRQ_PCF50633,
++ .platform_data = &gta02_pcf_pdata,
++ },
++ {
++ I2C_BOARD_INFO("wm8753", 0x1a),
++ },
++};
++
++static struct s3c2410_nand_set gta02_nand_sets[] = {
++ [0] = {
++ .name = "neo1973-nand",
++ .nr_chips = 1,
++ .flags = S3C2410_NAND_BBT,
++ },
++};
++
++/* choose a set of timings derived from S3C@2442B MCP54
++ * data sheet (K5D2G13ACM-D075 MCP Memory)
++ */
++
++static struct s3c2410_platform_nand gta02_nand_info = {
++ .tacls = 0,
++ .twrph0 = 25,
++ .twrph1 = 15,
++ .nr_sets = ARRAY_SIZE(gta02_nand_sets),
++ .sets = gta02_nand_sets,
++ .software_ecc = 1,
++};
++
++
++static void gta02_s3c_mmc_set_power(unsigned char power_mode,
++ unsigned short vdd)
++{
++ static int is_on = -1;
++ int on;
++
++ on = power_mode == MMC_POWER_ON || power_mode == MMC_POWER_UP;
++ if (is_on != on)
++ gta02_wlan_reset(!on);
++ is_on = on;
++}
++
++
++static struct s3c24xx_mci_pdata gta02_s3c_mmc_cfg = {
++ .set_power = gta02_s3c_mmc_set_power,
++};
++
++static void gta02_udc_command(enum s3c2410_udc_cmd_e cmd)
++{
++ switch (cmd) {
++ case S3C2410_UDC_P_ENABLE:
++ printk(KERN_DEBUG "%s S3C2410_UDC_P_ENABLE\n", __func__);
++ neo1973_gpb_setpin(GTA02_GPIO_USB_PULLUP, 1);
++ break;
++ case S3C2410_UDC_P_DISABLE:
++ printk(KERN_DEBUG "%s S3C2410_UDC_P_DISABLE\n", __func__);
++ neo1973_gpb_setpin(GTA02_GPIO_USB_PULLUP, 0);
++ break;
++ case S3C2410_UDC_P_RESET:
++ printk(KERN_DEBUG "%s S3C2410_UDC_P_RESET\n", __func__);
++ /* FIXME! */
++ break;
++ default:
++ break;
++ }
++}
++
++/* get PMU to set USB current limit accordingly */
++
++static struct s3c2410_udc_mach_info gta02_udc_cfg = {
++ .vbus_draw = gta02_udc_vbus_draw,
++ .udc_command = gta02_udc_command,
++
++};
++
++
++/* Touchscreen configuration. */
++
++#ifdef CONFIG_TOUCHSCREEN_FILTER
++const static struct ts_filter_group_configuration gta02_ts_group = {
++ .length = 12,
++ .close_enough = 10,
++ .threshold = 6, /* At least half of the points in a group. */
++ .attempts = 10,
++};
++
++const static struct ts_filter_median_configuration gta02_ts_median = {
++ .extent = 20,
++ .decimation_below = 3,
++ .decimation_threshold = 8 * 3,
++ .decimation_above = 4,
++};
++
++const static struct ts_filter_mean_configuration gta02_ts_mean = {
++ .length = 4,
++};
++
++const static struct ts_filter_linear_configuration gta02_ts_linear = {
++ .constants = {1, 0, 0, 0, 1, 0, 1}, /* Don't modify coords. */
++ .coord0 = 0,
++ .coord1 = 1,
++};
++#endif
++
++const static struct ts_filter_chain_configuration gta02_filter_configuration[] =
++{
++#ifdef CONFIG_TOUCHSCREEN_FILTER
++ {&ts_filter_group_api, &gta02_ts_group.config},
++ {&ts_filter_median_api, &gta02_ts_median.config},
++ {&ts_filter_mean_api, &gta02_ts_mean.config},
++ {&ts_filter_linear_api, &gta02_ts_linear.config},
++#endif
++ {NULL, NULL},
++};
++
++const static struct s3c2410_ts_mach_info gta02_ts_cfg = {
++ .delay = 10000,
++ .presc = 0xff, /* slow as we can go */
++ .filter_config = gta02_filter_configuration,
++};
++
++
++
++static void gta02_bl_set_intensity(int intensity)
++{
++ struct pcf50633 *pcf = gta02_pcf;
++ int old_intensity = pcf50633_reg_read(pcf, PCF50633_REG_LEDOUT);
++ int ret;
++
++ intensity >>= 2;
++
++ /*
++ * One code path that leads here is from a kernel panic. Trying to turn
++ * the backlight on just gives us a nearly endless stream of complaints
++ * and accomplishes nothing. We can't win. Just give up.
++ *
++ * In the unlikely event that there's another path leading here while
++ * we're atomic, we print at least a warning.
++ */
++ if (in_atomic()) {
++ printk(KERN_ERR
++ "gta02_bl_set_intensity called while atomic\n");
++ return;
++ }
++
++ if (!(pcf50633_reg_read(pcf, PCF50633_REG_LEDENA) & 3))
++ old_intensity = 0;
++ else
++ old_intensity = pcf50633_reg_read(pcf, PCF50633_REG_LEDOUT);
++
++ if (intensity == old_intensity)
++ return;
++
++ /* We can't do this anywhere else */
++ pcf50633_reg_write(pcf, PCF50633_REG_LEDDIM, 5);
++
++ /*
++ * The PCF50633 cannot handle LEDOUT = 0 (datasheet p60)
++ * if seen, you have to re-enable the LED unit
++ */
++ if (!intensity || !old_intensity)
++ pcf50633_reg_write(pcf, PCF50633_REG_LEDENA, 0);
++
++ if (!intensity) /* illegal to set LEDOUT to 0 */
++ ret = pcf50633_reg_set_bit_mask(pcf, PCF50633_REG_LEDOUT, 0x3f,
++ 2);
++ else
++ ret = pcf50633_reg_set_bit_mask(pcf, PCF50633_REG_LEDOUT, 0x3f,
++ intensity);
++
++ if (intensity)
++ pcf50633_reg_write(pcf, PCF50633_REG_LEDENA, 2);
++
++}
++
++static struct generic_bl_info gta02_bl_info = {
++ .name = "gta02-bl",
++ .max_intensity = 0xff,
++ .default_intensity = 0xff,
++ .set_bl_intensity = gta02_bl_set_intensity,
++};
++
++static struct platform_device gta02_bl_dev = {
++ .name = "generic-bl",
++ .id = 1,
++ .dev = {
++ .platform_data = &gta02_bl_info,
++ },
++};
++
++/* SPI: LCM control interface attached to Glamo3362 */
++
++static void gta02_jbt6k74_reset(int devidx, int level)
++{
++ glamo_lcm_reset(level);
++}
++
++static void gta02_jbt6k74_probe_completed(struct device *dev)
++{
++ struct pcf50633 *pcf = gta02_pcf;
++
++ /* Switch on backlight. Qi does not do it for us */
++ pcf50633_reg_write(pcf, PCF50633_REG_LEDOUT, 0x01);
++ pcf50633_reg_write(pcf, PCF50633_REG_LEDENA, 0x00);
++ pcf50633_reg_write(pcf, PCF50633_REG_LEDDIM, 0x01);
++ pcf50633_reg_write(pcf, PCF50633_REG_LEDENA, 0x01);
++
++ gta02_bl_dev.dev.parent = dev;
++ platform_device_register(&gta02_bl_dev);
++}
++
++const struct jbt6k74_platform_data jbt6k74_pdata = {
++ .reset = gta02_jbt6k74_reset,
++ .probe_completed = gta02_jbt6k74_probe_completed,
++};
++
++#if 0 /* currently this is not used and we use gpio spi */
++static struct glamo_spi_info glamo_spi_cfg = {
++ .board_size = ARRAY_SIZE(gta02_spi_board_info),
++ .board_info = gta02_spi_board_info,
++};
++#endif /* 0 */
++
++static struct glamo_spigpio_info glamo_spigpio_cfg = {
++ .pin_clk = GLAMO_GPIO10_OUTPUT,
++ .pin_mosi = GLAMO_GPIO11_OUTPUT,
++ .pin_cs = GLAMO_GPIO12_OUTPUT,
++ .pin_miso = 0,
++ .bus_num = 2,
++};
++
++/*----------- SPI: Accelerometers attached to SPI of s3c244x ----------------- */
++
++void gta02_lis302dl_suspend_io(struct lis302dl_info *lis, int resume)
++{
++ struct lis302dl_platform_data *pdata = lis->pdata;
++
++ if (!resume) {
++ /*
++ * we don't want to power them with a high level
++ * because GSENSOR_3V3 is not up during suspend
++ */
++ s3c2410_gpio_setpin(pdata->pin_chip_select, 0);
++ s3c2410_gpio_setpin(pdata->pin_clk, 0);
++ s3c2410_gpio_setpin(pdata->pin_mosi, 0);
++ /* misnomer: it is a pullDOWN in 2442 */
++ s3c2410_gpio_pullup(pdata->pin_miso, 1);
++ return;
++ }
++
++ /* back to normal */
++ s3c2410_gpio_setpin(pdata->pin_chip_select, 1);
++ s3c2410_gpio_setpin(pdata->pin_clk, 1);
++ /* misnomer: it is a pullDOWN in 2442 */
++ s3c2410_gpio_pullup(pdata->pin_miso, 0);
++
++ s3c2410_gpio_cfgpin(pdata->pin_chip_select, S3C2410_GPIO_OUTPUT);
++ s3c2410_gpio_cfgpin(pdata->pin_clk, S3C2410_GPIO_OUTPUT);
++ s3c2410_gpio_cfgpin(pdata->pin_mosi, S3C2410_GPIO_OUTPUT);
++ s3c2410_gpio_cfgpin(pdata->pin_miso, S3C2410_GPIO_INPUT);
++
++}
++
++struct lis302dl_platform_data lis302_pdata_top = {
++ .name = "lis302-1 (top)",
++ .pin_chip_select= S3C2410_GPD12,
++ .pin_clk = S3C2410_GPG7,
++ .pin_mosi = S3C2410_GPG6,
++ .pin_miso = S3C2410_GPG5,
++ .interrupt = GTA02_IRQ_GSENSOR_1,
++ .open_drain = 1, /* altered at runtime by PCB rev */
++ .lis302dl_suspend_io = gta02_lis302dl_suspend_io,
++};
++
++struct lis302dl_platform_data lis302_pdata_bottom = {
++ .name = "lis302-2 (bottom)",
++ .pin_chip_select= S3C2410_GPD13,
++ .pin_clk = S3C2410_GPG7,
++ .pin_mosi = S3C2410_GPG6,
++ .pin_miso = S3C2410_GPG5,
++ .interrupt = GTA02_IRQ_GSENSOR_2,
++ .open_drain = 1, /* altered at runtime by PCB rev */
++ .lis302dl_suspend_io = gta02_lis302dl_suspend_io,
++};
++
++static struct spi_board_info gta02_spi_board_info[] = {
++ {
++ .modalias = "jbt6k74",
++ /* platform_data */
++ .platform_data = &jbt6k74_pdata,
++ /* controller_data */
++ /* irq */
++ .max_speed_hz = 100 * 1000,
++ .bus_num = 2,
++ /* chip_select */
++ },
++ {
++ .modalias = "lis302dl",
++ /* platform_data */
++ .platform_data = &lis302_pdata_top,
++ /* controller_data */
++ /* irq */
++ .max_speed_hz = 100 * 1000,
++ .bus_num = 3,
++ .chip_select = 0,
++ },
++
++ {
++ .modalias = "lis302dl",
++ /* platform_data */
++ .platform_data = &lis302_pdata_bottom,
++ /* controller_data */
++ /* irq */
++ .max_speed_hz = 100 * 1000,
++ .bus_num = 3,
++ .chip_select = 1,
++ },
++
++};
++
++static void gta02_lis302_chip_select(struct s3c2410_spigpio_info *info, int csid, int cs)
++{
++
++ /*
++ * Huh... "quirk"... CS on this device is not really "CS" like you can
++ * expect.
++ *
++ * When it is 0 it selects SPI interface mode.
++ * When it is 1 it selects I2C interface mode.
++ *
++ * Because we have 2 devices on one interface we have to make sure
++ * that the "disabled" device (actually in I2C mode) don't think we're
++ * talking to it.
++ *
++ * When we talk to the "enabled" device, the "disabled" device sees
++ * the clocks as I2C clocks, creating havoc.
++ *
++ * I2C sees MOSI going LOW while CLK HIGH as a START action, thus we
++ * must ensure this is never issued.
++ */
++
++ int cs_gpio, other_cs_gpio;
++
++ cs_gpio = csid ? S3C2410_GPD13 : S3C2410_GPD12;
++ other_cs_gpio = (1 - csid) ? S3C2410_GPD13 : S3C2410_GPD12;
++
++
++ if (cs == BITBANG_CS_ACTIVE) {
++ s3c2410_gpio_setpin(other_cs_gpio, 1);
++ s3c2410_gpio_setpin(cs_gpio, 1);
++ s3c2410_gpio_setpin(info->pin_clk, 1);
++ s3c2410_gpio_setpin(cs_gpio, 0);
++ } else {
++ s3c2410_gpio_setpin(cs_gpio, 1);
++ s3c2410_gpio_setpin(other_cs_gpio, 1);
++ }
++}
++
++static struct s3c2410_spigpio_info gta02_spigpio_cfg = {
++ .pin_clk = S3C2410_GPG7,
++ .pin_mosi = S3C2410_GPG6,
++ .pin_miso = S3C2410_GPG5,
++ .bus_num = 3,
++ .num_chipselect = 2,
++ .chip_select = gta02_lis302_chip_select,
++ .non_blocking_transfer = 1,
++};
++
++static struct platform_device gta02_spi_gpio_dev = {
++ .name = "spi_s3c24xx_gpio",
++ .dev = {
++ .platform_data = &gta02_spigpio_cfg,
++ },
++};
++
++/*----------- / SPI: Accelerometers attached to SPI of s3c244x ----------------- */
++
++static struct resource gta02_led_resources[] = {
++ {
++ .name = "gta02-power:orange",
++ .start = GTA02_GPIO_PWR_LED1,
++ .end = GTA02_GPIO_PWR_LED1,
++ }, {
++ .name = "gta02-power:blue",
++ .start = GTA02_GPIO_PWR_LED2,
++ .end = GTA02_GPIO_PWR_LED2,
++ }, {
++ .name = "gta02-aux:red",
++ .start = GTA02_GPIO_AUX_LED,
++ .end = GTA02_GPIO_AUX_LED,
++ },
++};
++
++struct platform_device gta02_led_dev = {
++ .name = "gta02-led",
++ .num_resources = ARRAY_SIZE(gta02_led_resources),
++ .resource = gta02_led_resources,
++};
++
++static struct resource gta02_button_resources[] = {
++ [0] = {
++ .start = GTA02_GPIO_AUX_KEY,
++ .end = GTA02_GPIO_AUX_KEY,
++ },
++ [1] = {
++ .start = GTA02_GPIO_HOLD_KEY,
++ .end = GTA02_GPIO_HOLD_KEY,
++ },
++ [2] = {
++ .start = GTA02_GPIO_JACK_INSERT,
++ .end = GTA02_GPIO_JACK_INSERT,
++ },
++ [3] = {
++ .start = 0,
++ .end = 0,
++ },
++ [4] = {
++ .start = 0,
++ .end = 0,
++ },
++};
++
++static struct platform_device gta02_button_dev = {
++ .name = "neo1973-button",
++ .num_resources = ARRAY_SIZE(gta02_button_resources),
++ .resource = gta02_button_resources,
++};
++
++
++static struct platform_device gta02_pm_usbhost_dev = {
++ .name = "neo1973-pm-host",
++};
++
++
++/* USB */
++static struct s3c2410_hcd_info gta02_usb_info = {
++ .port[0] = {
++ .flags = S3C_HCDFLG_USED,
++ },
++ .port[1] = {
++ .flags = 0,
++ },
++};
++
++static int glamo_irq_is_wired(void)
++{
++ int rc;
++ int count = 0;
++
++ /*
++ * GTA02 S-Media IRQs prior to A5 are broken due to a lack of
++ * a pullup on the INT# line. Check for the bad behaviour.
++ */
++ s3c2410_gpio_setpin(S3C2410_GPG4, 0);
++ s3c2410_gpio_cfgpin(S3C2410_GPG4, S3C2410_GPG4_OUTP);
++ s3c2410_gpio_cfgpin(S3C2410_GPG4, S3C2410_GPG4_INP);
++ /*
++ * we force it low ourselves for a moment and resume being input.
++ * If there is a pullup, it won't stay low for long. But if the
++ * level converter is there as on < A5 revision, the weak keeper
++ * on the input of the LC will hold the line low indefinitiely
++ */
++ do
++ rc = s3c2410_gpio_getpin(S3C2410_GPG4);
++ while ((!rc) && ((count++) < 10));
++ if (rc) { /* it got pulled back up, it's good */
++ printk(KERN_INFO "Detected S-Media IRQ# pullup, "
++ "enabling interrupt\n");
++ return 0;
++ } else /* Gah we can't work with this level converter */
++ printk(KERN_WARNING "** Detected bad IRQ# circuit found"
++ " on pre-A5 GTA02: S-Media interrupt disabled **\n");
++ return -ENODEV;
++}
++
++static int gta02_glamo_can_set_mmc_power(void)
++{
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA02v3_SYSTEM_REV:
++ case GTA02v4_SYSTEM_REV:
++ case GTA02v5_SYSTEM_REV:
++ case GTA02v6_SYSTEM_REV:
++ return 1;
++ }
++
++ return 0;
++}
++
++/* Smedia Glamo 3362 */
++
++/*
++ * we crank down SD Card clock dynamically when GPS is powered
++ */
++
++static int gta02_glamo_mci_use_slow(void)
++{
++ return neo1973_pm_gps_is_on();
++}
++
++static void gta02_glamo_external_reset(int level)
++{
++ s3c2410_gpio_setpin(GTA02_GPIO_3D_RESET, level);
++ s3c2410_gpio_cfgpin(GTA02_GPIO_3D_RESET, S3C2410_GPIO_OUTPUT);
++}
++
++static struct glamofb_platform_data gta02_glamo_pdata = {
++ .width = 43,
++ .height = 58,
++ /* 24.5MHz --> 40.816ns */
++ .pixclock = 40816,
++ .left_margin = 8,
++ .right_margin = 16,
++ .upper_margin = 2,
++ .lower_margin = 16,
++ .hsync_len = 8,
++ .vsync_len = 2,
++ .fb_mem_size = 0x400000, /* glamo has 8 megs of SRAM. we use 4 */
++ .xres = {
++ .min = 240,
++ .max = 640,
++ .defval = 480,
++ },
++ .yres = {
++ .min = 320,
++ .max = 640,
++ .defval = 640,
++ },
++ .bpp = {
++ .min = 16,
++ .max = 16,
++ .defval = 16,
++ },
++ //.spi_info = &glamo_spi_cfg,
++ .spigpio_info = &glamo_spigpio_cfg,
++
++ /* glamo MMC function platform data */
++ .mmc_dev = &gta02_mmc_dev,
++ .glamo_can_set_mci_power = gta02_glamo_can_set_mmc_power,
++ .glamo_mci_use_slow = gta02_glamo_mci_use_slow,
++ .glamo_irq_is_wired = glamo_irq_is_wired,
++ .glamo_external_reset = gta02_glamo_external_reset
++};
++
++static struct resource gta02_glamo_resources[] = {
++ [0] = {
++ .start = S3C2410_CS1,
++ .end = S3C2410_CS1 + 0x1000000 - 1,
++ .flags = IORESOURCE_MEM,
++ },
++ [1] = {
++ .start = GTA02_IRQ_3D,
++ .end = GTA02_IRQ_3D,
++ .flags = IORESOURCE_IRQ,
++ },
++ [2] = {
++ .start = GTA02_GPIO_3D_RESET,
++ .end = GTA02_GPIO_3D_RESET,
++ },
++};
++
++static struct platform_device gta02_glamo_dev = {
++ .name = "glamo3362",
++ .num_resources = ARRAY_SIZE(gta02_glamo_resources),
++ .resource = gta02_glamo_resources,
++ .dev = {
++ .platform_data = &gta02_glamo_pdata,
++ },
++};
++
++static void mangle_glamo_res_by_system_rev(void)
++{
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA02v1_SYSTEM_REV:
++ break;
++ default:
++ gta02_glamo_resources[2].start = GTA02_GPIO_3D_RESET;
++ gta02_glamo_resources[2].end = GTA02_GPIO_3D_RESET;
++ break;
++ }
++
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA02v1_SYSTEM_REV:
++ case GTA02v2_SYSTEM_REV:
++ case GTA02v3_SYSTEM_REV:
++ /* case GTA02v4_SYSTEM_REV: - FIXME: handle this later */
++ /* The hardware is missing a pull-up resistor and thus can't
++ * support the Smedia Glamo IRQ */
++ gta02_glamo_resources[1].start = 0;
++ gta02_glamo_resources[1].end = 0;
++ break;
++ }
++}
++
++static void __init gta02_map_io(void)
++{
++ s3c24xx_init_io(gta02_iodesc, ARRAY_SIZE(gta02_iodesc));
++ s3c24xx_init_clocks(12000000);
++ s3c24xx_init_uarts(gta02_uartcfgs, ARRAY_SIZE(gta02_uartcfgs));
++}
++
++static irqreturn_t gta02_modem_irq(int irq, void *param)
++{
++ printk(KERN_DEBUG "modem wakeup interrupt\n");
++ gta_gsm_interrupts++;
++ return IRQ_HANDLED;
++}
++
++static irqreturn_t ar6000_wow_irq(int irq, void *param)
++{
++ printk(KERN_DEBUG "ar6000_wow interrupt\n");
++ return IRQ_HANDLED;
++}
++
++/*
++ * hardware_ecc=1|0
++ */
++static char hardware_ecc_str[4] __initdata = "";
++
++static int __init hardware_ecc_setup(char *str)
++{
++ if (str)
++ strlcpy(hardware_ecc_str, str, sizeof(hardware_ecc_str));
++ return 1;
++}
++
++__setup("hardware_ecc=", hardware_ecc_setup);
++
++/* these are the guys that don't need to be children of PMU */
++
++static struct platform_device *gta02_devices[] __initdata = {
++ &gta02_version_device,
++ &s3c_device_usb,
++ &s3c_device_wdt,
++ &gta02_memconfig_device,
++ &s3c_device_sdi,
++ &s3c_device_usbgadget,
++ &s3c_device_nand,
++ &gta02_nor_flash,
++
++ &s3c24xx_pwm_device,
++ &gta02_led_dev,
++ &gta02_pm_wlan_dev, /* not dependent on PMU */
++
++ &s3c_device_iis,
++ &s3c_device_i2c0,
++};
++
++/* these guys DO need to be children of PMU */
++
++static struct platform_device *gta02_devices_pmu_children[] = {
++ &s3c_device_ts, /* input 1 */
++ &gta02_pm_gsm_dev,
++ &gta02_pm_usbhost_dev,
++ &gta02_spi_gpio_dev, /* input 2 and 3 */
++ &gta02_button_dev, /* input 4 */
++ &gta02_resume_reason_device,
++};
++
++static void gta02_pmu_regulator_registered(struct pcf50633 *pcf, int id)
++{
++ struct platform_device *regulator, *pdev;
++
++ gta02_pcf = pcf;
++
++ regulator = pcf->regulator_pdev[id];
++
++ switch(id) {
++ case PCF50633_REGULATOR_LDO4:
++ pdev = &gta01_pm_bt_dev;
++ break;
++ case PCF50633_REGULATOR_LDO5:
++ pdev = &gta01_pm_gps_dev;
++ break;
++ case PCF50633_REGULATOR_HCLDO:
++ pdev = &gta02_glamo_dev;
++ break;
++ default:
++ return;
++ }
++
++ pdev->dev.parent = &regulator->dev;
++ platform_device_register(pdev);
++}
++
++/* this is called when pc50633 is probed, unfortunately quite late in the
++ * day since it is an I2C bus device. Here we can belatedly define some
++ * platform devices with the advantage that we can mark the pcf50633 as the
++ * parent. This makes them get suspended and resumed with their parent
++ * the pcf50633 still around.
++ */
++
++static void gta02_pmu_attach_child_devices(struct pcf50633 *pcf)
++{
++ int n;
++
++ for (n = 0; n < ARRAY_SIZE(gta02_devices_pmu_children); n++)
++ gta02_devices_pmu_children[n]->dev.parent = pcf->dev;
++
++ mangle_glamo_res_by_system_rev();
++ platform_add_devices(gta02_devices_pmu_children,
++ ARRAY_SIZE(gta02_devices_pmu_children));
++}
++
++static void gta02_poweroff(void)
++{
++ pcf50633_reg_set_bit_mask(gta02_pcf, PCF50633_REG_OOCSHDWN,
++ PCF50633_OOCSHDWN_GOSTDBY, PCF50633_OOCSHDWN_GOSTDBY);
++}
++
++static void __init gta02_machine_init(void)
++{
++ int rc;
++
++ /* set the panic callback to make AUX blink fast */
++ panic_blink = gta02_panic_blink;
++
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA02v6_SYSTEM_REV:
++ /* we need push-pull interrupt from motion sensors */
++ lis302_pdata_top.open_drain = 0;
++ lis302_pdata_bottom.open_drain = 0;
++ break;
++ default:
++ break;
++ }
++
++ spin_lock_init(&motion_irq_lock);
++
++#ifdef CONFIG_CHARGER_PCF50633
++ INIT_DELAYED_WORK(&gta02_charger_work, gta02_charger_worker);
++#endif
++
++ /* Glamo chip select optimization */
++/* *((u32 *)(S3C2410_MEMREG(((1 + 1) << 2)))) = 0x1280; */
++
++ /* do not force soft ecc if we are asked to use hardware_ecc */
++ if (hardware_ecc_str[0] == '1')
++ gta02_nand_info.software_ecc = 0;
++
++ s3c_device_usb.dev.platform_data = &gta02_usb_info;
++ s3c_device_nand.dev.platform_data = &gta02_nand_info;
++ s3c_device_sdi.dev.platform_data = &gta02_s3c_mmc_cfg;
++
++ /* acc sensor chip selects */
++ s3c2410_gpio_setpin(S3C2410_GPD12, 1);
++ s3c2410_gpio_cfgpin(S3C2410_GPD12, S3C2410_GPIO_OUTPUT);
++ s3c2410_gpio_setpin(S3C2410_GPD13, 1);
++ s3c2410_gpio_cfgpin(S3C2410_GPD13, S3C2410_GPIO_OUTPUT);
++
++ s3c24xx_udc_set_platdata(&gta02_udc_cfg);
++ s3c_i2c0_set_platdata(NULL);
++ set_s3c2410ts_info(&gta02_ts_cfg);
++
++ mangle_glamo_res_by_system_rev();
++
++ i2c_register_board_info(0, gta02_i2c_devs, ARRAY_SIZE(gta02_i2c_devs));
++ spi_register_board_info(gta02_spi_board_info,
++ ARRAY_SIZE(gta02_spi_board_info));
++
++ mangle_pmu_pdata_by_system_rev();
++
++ platform_add_devices(gta02_devices, ARRAY_SIZE(gta02_devices));
++
++ s3c_pm_init();
++
++ /* Make sure the modem can wake us up */
++ set_irq_type(GTA02_IRQ_MODEM, IRQ_TYPE_EDGE_RISING);
++ rc = request_irq(GTA02_IRQ_MODEM, gta02_modem_irq, IRQF_DISABLED,
++ "modem", NULL);
++ if (rc < 0)
++ printk(KERN_ERR "GTA02: can't request GSM modem wakeup IRQ\n");
++ enable_irq_wake(GTA02_IRQ_MODEM);
++
++ /* Make sure the wifi module can wake us up*/
++ set_irq_type(GTA02_IRQ_WLAN_GPIO1, IRQ_TYPE_EDGE_RISING);
++ rc = request_irq(GTA02_IRQ_WLAN_GPIO1, ar6000_wow_irq, IRQF_DISABLED,
++ "ar6000", NULL);
++
++ if (rc < 0)
++ printk(KERN_ERR "GTA02: can't request ar6k wakeup IRQ\n");
++ enable_irq_wake(GTA02_IRQ_WLAN_GPIO1);
++
++ pm_power_off = gta02_poweroff;
++
++ /* Register the HDQ and vibrator as children of pwm device */
++#ifdef CONFIG_HDQ_GPIO_BITBANG
++ gta02_hdq_device.dev.parent = &s3c24xx_pwm_device.dev;
++ platform_device_register(&gta02_hdq_device);
++#endif
++#ifdef CONFIG_LEDS_NEO1973_VIBRATOR
++ gta02_vibrator_dev.dev.parent = &s3c24xx_pwm_device.dev;
++ platform_device_register(&gta02_vibrator_dev);
++#endif
++}
++
++void DEBUG_LED(int n)
++{
++// int *p = NULL;
++ switch (n) {
++ case 0:
++ neo1973_gpb_setpin(GTA02_GPIO_PWR_LED1, 1);
++ break;
++ case 1:
++ neo1973_gpb_setpin(GTA02_GPIO_PWR_LED2, 1);
++ break;
++ default:
++ neo1973_gpb_setpin(GTA02_GPIO_AUX_LED, 1);
++ break;
++ }
++// printk(KERN_ERR"die %d\n", *p);
++}
++EXPORT_SYMBOL_GPL(DEBUG_LED);
++
++MACHINE_START(NEO1973_GTA02, "GTA02")
++ .phys_io = S3C2410_PA_UART,
++ .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
++ .boot_params = S3C2410_SDRAM_PA + 0x100,
++ .map_io = gta02_map_io,
++ .init_irq = s3c24xx_init_irq,
++ .init_machine = gta02_machine_init,
++ .timer = &s3c24xx_timer,
++MACHINE_END
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2442/Makefile linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2442/Makefile
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2442/Makefile 2009-05-10 22:05:02.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2442/Makefile 2009-05-10 22:27:59.000000000 +0200
+@@ -9,8 +9,11 @@
+ obj-n :=
+ obj- :=
+
++obj-$(CONFIG_S3C2440_C_FIQ) += fiq_c_isr.o
++
+ obj-$(CONFIG_CPU_S3C2442) += s3c2442.o
+ obj-$(CONFIG_CPU_S3C2442) += clock.o
++obj-$(CONFIG_MACH_NEO1973_GTA02) += mach-gta02.o
+
+ # Machine support
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2442/s3c2442.c linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2442/s3c2442.c
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2442/s3c2442.c 2009-05-10 22:05:02.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2442/s3c2442.c 2009-05-10 22:27:59.000000000 +0200
+@@ -21,6 +21,7 @@
+
+ #include <plat/s3c2442.h>
+ #include <plat/cpu.h>
++#include <plat/devs.h>
+
+ static struct sys_device s3c2442_sysdev = {
+ .cls = &s3c2442_sysclass,
+@@ -30,5 +31,8 @@
+ {
+ printk("S3C2442: Initialising architecture\n");
+
++ /* make sure SD/MMC driver can distinguish 2440 from 2410 */
++ s3c_device_sdi.name = "s3c2440-sdi";
++
+ return sysdev_register(&s3c2442_sysdev);
+ }
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2443/dma.c linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2443/dma.c
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c2443/dma.c 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c2443/dma.c 2009-05-10 22:27:59.000000000 +0200
+@@ -20,16 +20,17 @@
+
+ #include <mach/dma.h>
+
+-#include <plat/dma.h>
++#include <plat/dma-plat.h>
+ #include <plat/cpu.h>
+
+ #include <plat/regs-serial.h>
+ #include <mach/regs-gpio.h>
+ #include <plat/regs-ac97.h>
++#include <plat/regs-dma.h>
+ #include <mach/regs-mem.h>
+ #include <mach/regs-lcd.h>
+ #include <mach/regs-sdi.h>
+-#include <asm/plat-s3c24xx/regs-iis.h>
++#include <plat/regs-iis.h>
+ #include <plat/regs-spi.h>
+
+ #define MAP(x) { \
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c24a0/include/mach/io.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c24a0/include/mach/io.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c24a0/include/mach/io.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c24a0/include/mach/io.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,16 @@
++/* arch/arm/mach-s3c24a0/include/mach/io.h
++ *
++ * Copyright 2008 Simtec Electronics
++ * Ben Dooks <ben-linux@fluff.org>
++ *
++ * IO access and mapping routines for the S3C24A0
++ */
++
++#ifndef __ASM_ARM_ARCH_IO_H
++#define __ASM_ARM_ARCH_IO_H
++
++/* No current ISA/PCI bus support. */
++#define __io(a) ((void __iomem *)(a))
++#define __mem_pci(a) (a)
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c24a0/include/mach/irqs.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c24a0/include/mach/irqs.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c24a0/include/mach/irqs.h 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c24a0/include/mach/irqs.h 2009-05-10 22:27:59.000000000 +0200
+@@ -70,6 +70,8 @@
+ #define IRQ_EINT17 S3C2410_IRQ(49)
+ #define IRQ_EINT18 S3C2410_IRQ(50)
+
++#define IRQ_EINT_BIT(x) ((x) - IRQ_EINT00)
++
+ /* SUB IRQS */
+ #define IRQ_S3CUART_RX0 S3C2410_IRQ(51) /* 67 */
+ #define IRQ_S3CUART_TX0 S3C2410_IRQ(52)
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6400/include/mach/dma.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6400/include/mach/dma.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6400/include/mach/dma.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6400/include/mach/dma.h 2009-05-10 22:27:59.000000000 +0200
+@@ -11,6 +11,63 @@
+ #ifndef __ASM_ARCH_DMA_H
+ #define __ASM_ARCH_DMA_H __FILE__
+
+-/* currently nothing here, placeholder */
++#define S3C_DMA_CHANNELS (16)
++
++/* see mach-s3c2410/dma.h for notes on dma channel numbers */
++
++/* Note, for the S3C64XX architecture we keep the DMACH_
++ * defines in the order they are allocated to [S]DMA0/[S]DMA1
++ * so that is easy to do DHACH_ -> DMA controller conversion
++ */
++enum dma_ch {
++ /* DMA0/SDMA0 */
++ DMACH_UART0 = 0,
++ DMACH_UART0_SRC2,
++ DMACH_UART1,
++ DMACH_UART1_SRC2,
++ DMACH_UART2,
++ DMACH_UART2_SRC2,
++ DMACH_UART3,
++ DMACH_UART3_SRC2,
++ DMACH_PCM0_TX,
++ DMACH_PCM0_RX,
++ DMACH_I2S0_OUT,
++ DMACH_I2S0_IN,
++ DMACH_SPI0_TX,
++ DMACH_SPI0_RX,
++ DMACH_HSI_I2SV40_TX,
++ DMACH_HSI_I2SV40_RX,
++
++ /* DMA1/SDMA1 */
++ DMACH_PCM1_TX = 16,
++ DMACH_PCM1_RX,
++ DMACH_I2S1_OUT,
++ DMACH_I2S1_IN,
++ DMACH_SPI1_TX,
++ DMACH_SPI1_RX,
++ DMACH_AC97_PCMOUT,
++ DMACH_AC97_PCMIN,
++ DMACH_AC97_MICIN,
++ DMACH_PWM,
++ DMACH_IRDA,
++ DMACH_EXTERNAL,
++ DMACH_RES1,
++ DMACH_RES2,
++ DMACH_SECURITY_RX, /* SDMA1 only */
++ DMACH_SECURITY_TX, /* SDMA1 only */
++ DMACH_MAX /* the end */
++};
++
++static __inline__ int s3c_dma_has_circular(void)
++{
++ /* we will be supporting ciruclar buffers as soon as we have DMA
++ * engine support.
++ */
++ return 1;
++}
++
++#define S3C2410_DMAF_CIRCULAR (1 << 0)
++
++#include <plat/dma.h>
+
+ #endif /* __ASM_ARCH_IRQ_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6400/include/mach/map.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6400/include/mach/map.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6400/include/mach/map.h 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6400/include/mach/map.h 2009-05-10 22:27:59.000000000 +0200
+@@ -40,6 +40,8 @@
+
+ #define S3C64XX_PA_FB (0x77100000)
+ #define S3C64XX_PA_SYSCON (0x7E00F000)
++#define S3C64XX_PA_IIS0 (0x7F002000)
++#define S3C64XX_PA_IIS1 (0x7F003000)
+ #define S3C64XX_PA_TIMER (0x7F006000)
+ #define S3C64XX_PA_IIC0 (0x7F004000)
+ #define S3C64XX_PA_IIC1 (0x7F00F000)
+@@ -49,12 +51,21 @@
+ #define S3C64XX_SZ_GPIO SZ_4K
+
+ #define S3C64XX_PA_SDRAM (0x50000000)
++#define S3C64XX_PA_TZIC0 (0x71000000)
++#define S3C64XX_PA_TZIC1 (0x71100000)
+ #define S3C64XX_PA_VIC0 (0x71200000)
+ #define S3C64XX_PA_VIC1 (0x71300000)
+
++#define S3C64XX_PA_MODEM (0x74108000)
++#define S3C64XX_VA_MODEM S3C_ADDR(0x00600000)
++
++#define S3C64XX_PA_USBHOST (0x74300000)
++
+ /* place VICs close together */
+ #define S3C_VA_VIC0 (S3C_VA_IRQ + 0x00)
+ #define S3C_VA_VIC1 (S3C_VA_IRQ + 0x10000)
++#define S3C_VA_TZIC0 (S3C_VA_IRQ + 0x20000)
++#define S3C_VA_TZIC1 (S3C_VA_IRQ + 0x30000)
+
+ /* compatibiltiy defines. */
+ #define S3C_PA_TIMER S3C64XX_PA_TIMER
+@@ -64,5 +75,12 @@
+ #define S3C_PA_IIC S3C64XX_PA_IIC0
+ #define S3C_PA_IIC1 S3C64XX_PA_IIC1
+ #define S3C_PA_FB S3C64XX_PA_FB
++#define S3C_PA_USBHOST S3C64XX_PA_USBHOST
++
++#define S3C64XX_VA_OTG S3C_VA_OTG
++#define S3C64XX_PA_OTG (0x7C000000)
++
++#define S3C64XX_VA_OTGSFR S3C_VA_OTGSFR
++#define S3C64XX_PA_OTGSFR (0x7C100000)
+
+ #endif /* __ASM_ARCH_6400_MAP_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6400/include/mach/regs-clock.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6400/include/mach/regs-clock.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6400/include/mach/regs-clock.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6400/include/mach/regs-clock.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,16 @@
++/* linux/arch/arm/mach-s3c6400/include/mach/regs-clock.h
++ *
++ * Copyright 2008 Openmoko, Inc.
++ * Copyright 2008 Simtec Electronics
++ * http://armlinux.simtec.co.uk/
++ * Ben Dooks <ben@simtec.co.uk>
++ *
++ * S3C64XX - clock register compatibility with s3c24xx
++ *
++ * 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.
++*/
++
++#include <plat/regs-clock.h>
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6400/include/mach/system.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6400/include/mach/system.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6400/include/mach/system.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6400/include/mach/system.h 2009-05-10 22:27:59.000000000 +0200
+@@ -11,9 +11,29 @@
+ #ifndef __ASM_ARCH_SYSTEM_H
+ #define __ASM_ARCH_SYSTEM_H __FILE__
+
++#include <linux/io.h>
++#include <mach/map.h>
++
++#include <plat/regs-sys.h>
++#include <plat/regs-syscon-power.h>
++
+ static void arch_idle(void)
+ {
+- /* nothing here yet */
++ unsigned long flags;
++ u32 mode;
++
++ /* ensure that if we execute the cpu idle sequence that we
++ * go into idle mode instead of powering off. */
++
++ local_irq_save(flags);
++ mode = __raw_readl(S3C64XX_PWR_CFG);
++ mode &= ~S3C64XX_PWRCFG_CFG_WFI_MASK;
++ mode |= S3C64XX_PWRCFG_CFG_WFI_IDLE;
++ __raw_writel(mode, S3C64XX_PWR_CFG);
++
++ local_irq_restore(flags);
++
++ cpu_do_idle();
+ }
+
+ static void arch_reset(char mode)
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6410/include/mach/om-3d7k.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6410/include/mach/om-3d7k.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6410/include/mach/om-3d7k.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6410/include/mach/om-3d7k.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,98 @@
++/*
++ * 3D7K GPIO Mappings
++ *
++ * (C) 2008 by Openmoko Inc.
++ * Author: Andy Green <andy@openmoko.com>
++ * All rights reserved.
++ *
++ * 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
++ *
++ */
++
++#ifndef _OM_3D7K_H
++#define _OM_3D7K_H
++
++#include <mach/gpio.h>
++#include <mach/irqs.h>
++#include <linux/mfd/pcf50633/core.h>
++
++extern struct pcf50633 *om_3d7k_pcf;
++
++/* ATAG_REVISION from bootloader */
++#define OM_3D7Kv1_SYSTEM_REV 0x00000001
++
++#define OM_3D7K_GPIO_VIBRATOR_ON S3C64XX_GPF(13)
++#define OM_3D7K_GPIO_CLKOUT S3C64XX_GPF(14)
++
++#define OM_3D7K_GPIO_ACCEL_MISO S3C64XX_GPC(0)
++#define OM_3D7K_GPIO_ACCEL_CLK S3C64XX_GPC(1)
++#define OM_3D7K_GPIO_ACCEL_MOSI S3C64XX_GPC(2)
++
++#define OM_3D7K_GPIO_LCM_MISO S3C64XX_GPC(4)
++#define OM_3D7K_GPIO_LCM_CLK S3C64XX_GPC(5)
++#define OM_3D7K_GPIO_LCM_MOSI S3C64XX_GPC(6)
++#define OM_3D7K_GPIO_LCM_CS S3C64XX_GPC(7)
++
++#define OM_3D7K_GPIO_BTPCM_SHARED_SCLK S3C64XX_GPE(0)
++#define OM_3D7K_GPIO_BTPCM_SHARED_EXTCLK S3C64XX_GPE(1)
++#define OM_3D7K_GPIO_BTPCM_SHARED_FSYNC S3C64XX_GPE(2)
++#define OM_3D7K_GPIO_BTPCM_SHARED_SIN S3C64XX_GPE(3)
++#define OM_3D7K_GPIO_BTPCM_SHARED_SOUT S3C64XX_GPE(4)
++
++#define OM_3D7K_GPIO_WLAN_RESET S3C64XX_GPH(6)
++#define OM_3D7K_GPIO_HDQ S3C64XX_GPH(7)
++#define OM_3D7K_GPIO_WLAN_PWRDN S3C64XX_GPH(8)
++
++#define OM_3D7K_GPIO_VERSION2 S3C64XX_GPI(0)
++#define OM_3D7K_GPIO_VERSION1 S3C64XX_GPI(1)
++#define OM_3D7K_GPIO_VERSION0 S3C64XX_GPI(8)
++
++#define OM_3D7K_GPIO_NWLAN_POWER S3C64XX_GPK(0)
++#define OM_3D7K_GPIO_MODEM_ON S3C64XX_GPK(2)
++#define OM_3D7K_GPIO_LED_TRIG S3C64XX_GPK(3)
++#define OM_3D7K_GPIO_LED_EN S3C64XX_GPK(4)
++#define OM_3D7K_GPIO_LCM_RESET S3C64XX_GPK(6)
++
++#define OM_3D7K_GPIO_LCM_SD S3C64XX_GPL(0)
++
++#define OM_3D7K_GPIO_TP_RESET S3C64XX_GPM(0)
++#define OM_3D7K_GPIO_GPS_LNA_EN S3C64XX_GPM(2)
++
++#define OM_3D7K_GPIO_USB_FLT S3C64XX_GPM(4)
++#define OM_3D7K_GPIO_USB_OC S3C64XX_GPM(5)
++
++#define OM_3D7K_GPIO_ACCEL_INT1 S3C64XX_GPN(0)
++#define OM_3D7K_GPIO_KEY_MINUS S3C64XX_GPN(1)
++#define OM_3D7K_GPIO_KEY_PLUS S3C64XX_GPN(2)
++#define OM_3D7K_GPIO_PWR_IND S3C64XX_GPN(3)
++#define OM_3D7K_GPIO_PWR_IRQ S3C64XX_GPN(4)
++#define OM_3D7K_GPIO_TOUCH S3C64XX_GPN(5)
++#define OM_3D7K_GPIO_JACK_INSERT S3C64XX_GPN(6)
++#define OM_3D7K_GPIO_GPS_INT S3C64XX_GPN(7)
++#define OM_3D7K_GPIO_HOLD S3C64XX_GPN(8)
++#define OM_3D7K_GPIO_WLAN_WAKEUP S3C64XX_GPN(9)
++#define OM_3D7K_GPIO_ACCEL_INT2 S3C64XX_GPN(10)
++#define OM_3D7K_GPIO_IO1 S3C64XX_GPN(11)
++#define OM_3D7K_GPIO_NONKEYWAKE S3C64XX_GPN(12)
++
++#define OM_3D7K_GPIO_N_MODEM_RESET S3C64XX_GPO(1)
++
++#define OM_3D7K_IRQ_GSENSOR_1 S3C_EINT(0)
++#define OM_3D7K_IRQ_KEY_MINUS S3C_EINT(1)
++#define OM_3D7K_IRQ_KEY_PLUS S3C_EINT(2)
++#define OM_3D7K_IRQ_PWR_IND S3C_EINT(3)
++#define OM_3D7K_IRQ_PMU S3C_EINT(4)
++#define OM_3D7K_IRQ_TOUCH S3C_EINT(5)
++#define OM_3D7K_IRQ_JACK_INSERT S3C_EINT(6)
++#define OM_3D7K_IRQ_GPS_INT S3C_EINT(7)
++#define OM_3D7K_IRQ_NHOLD S3C_EINT(8)
++#define OM_3D7K_IRQ_WLAN_WAKEUP S3C_EINT(9)
++#define OM_3D7K_IRQ_GSENSOR_2 S3C_EINT(10)
++#define OM_3D7K_IRQ_IO1 S3C_EINT(11)
++#define OM_3D7K_IRQ_NONKEYWAKE S3C_EINT(12)
++
++#define OM_3D7K_IRQ_LED IRQ_EINT_GROUP(6, 9)
++
++#endif /* _OM_3D7K_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6410/include/mach/spi-gpio.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6410/include/mach/spi-gpio.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6410/include/mach/spi-gpio.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6410/include/mach/spi-gpio.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,28 @@
++/* arch/arm/mach-s3c6400/include/mach/spi-gpio.h
++ *
++ * Copyright (c) 2006 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ *
++ * S3C64XX - SPI Controller platfrom_device info
++ *
++ * 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.
++*/
++
++#ifndef __ASM_ARCH_SPIGPIO_H
++#define __ASM_ARCH_SPIGPIO_H __FILE__
++
++struct s3c64xx_spigpio_info {
++ unsigned long pin_clk;
++ unsigned long pin_mosi;
++ unsigned long pin_miso;
++
++ int bus_num;
++ int num_chipselect;
++
++ void (*chip_select)(struct s3c64xx_spigpio_info *spi, int csid, int cs);
++};
++
++
++#endif /* __ASM_ARCH_SPIGPIO_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6410/Kconfig linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6410/Kconfig
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6410/Kconfig 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6410/Kconfig 2009-05-10 22:27:59.000000000 +0200
+@@ -26,6 +26,7 @@
+ select S3C_DEV_HSMMC1
+ select S3C_DEV_I2C1
+ select S3C_DEV_FB
++ select S3C_DEV_USB_HOST
+ select S3C6410_SETUP_SDHCI
+ select S3C64XX_SETUP_I2C1
+ select S3C64XX_SETUP_FB_24BPP
+@@ -60,3 +61,25 @@
+ channels 0 and 1 are the same.
+
+ endchoice
++
++config MACH_OM_3D7K
++ bool "Openmoko 3D7K Phone"
++ select CPU_S3C6410
++ select S3C_DEV_HSMMC
++ select S3C_DEV_HSMMC1
++ select S3C_DEV_I2C1
++ select S3C_DEV_USB_HOST
++ select S3C6410_SETUP_SDHCI
++ select S3C64XX_SETUP_I2C1
++ select S3C_DEV_FB
++ select S3C_DEV_CAMIF
++ select S3C64XX_SETUP_FB_24BPP
++# select SENSORS_PCF50633
++ select POWER_SUPPLY
++ select HDQ_GPIO_BITBANG
++ select S3C_PWM
++ select FIQ
++ select MACH_NEO1973
++ help
++ Machine support for the Openmoko 3D7K Phone
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6410/mach-om-3d7k.c linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6410/mach-om-3d7k.c
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6410/mach-om-3d7k.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6410/mach-om-3d7k.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,1196 @@
++/* linux/arch/arm/mach-s3c6410/mach-om-3d7k.c
++ *
++ * Copyright 2008 Openmoko, Inc.
++ * Andy Green <andy@openmoko.org>
++ *
++ * based on mach_smdk6410.c which is
++ *
++ * Copyright 2008 Openmoko, Inc.
++ * Copyright 2008 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ * http://armlinux.simtec.co.uk/
++ *
++ * 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.
++ *
++*/
++
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/interrupt.h>
++#include <linux/list.h>
++#include <linux/timer.h>
++#include <linux/init.h>
++#include <linux/serial_core.h>
++#include <linux/platform_device.h>
++#include <linux/io.h>
++#include <linux/i2c.h>
++#include <linux/fb.h>
++#include <linux/delay.h>
++#include <linux/lis302dl.h>
++#include <linux/lp5521.h>
++#include <linux/spi/spi_bitbang.h>
++#include <linux/l1k002.h>
++#include <linux/pcap7200.h>
++#include <linux/bq27000_battery.h>
++#include <linux/hdq.h>
++#include <linux/jbt6k74.h>
++
++#include <video/platform_lcd.h>
++
++#include <asm/mach/arch.h>
++#include <asm/mach/map.h>
++#include <asm/mach/irq.h>
++
++#include <mach/hardware.h>
++#include <asm/hardware/vic.h>
++#include <asm/hardware/tzic-sp890.h>
++#include <mach/map.h>
++#include <mach/regs-fb.h>
++#include <mach/spi-gpio.h>
++
++#include <asm/irq.h>
++#include <asm/mach-types.h>
++#include <asm/fiq.h>
++
++#include <plat/regs-serial.h>
++#include <plat/regs-timer.h>
++#include <plat/regs-gpio.h>
++#include <plat/iic.h>
++#include <plat/fb.h>
++#include <plat/gpio-cfg.h>
++#include <plat/pm.h>
++#include <plat/pwm.h>
++
++#include <plat/s3c6410.h>
++#include <plat/clock.h>
++#include <plat/devs.h>
++#include <plat/cpu.h>
++#include <plat/tzic-sp890.h>
++#include <plat/usb-control.h>
++
++/* #include <plat/udc.h> */
++#include <linux/i2c.h>
++#include <linux/backlight.h>
++#include <linux/regulator/machine.h>
++
++#include <mach/om-3d7k.h>
++
++#include <linux/mfd/pcf50633/core.h>
++#include <linux/mfd/pcf50633/mbc.h>
++#include <linux/mfd/pcf50633/adc.h>
++#include <linux/mfd/pcf50633/gpio.h>
++#include <linux/mfd/pcf50633/pmic.h>
++
++#include <plat/regs-usb-hs-otg.h>
++
++extern struct platform_device s3c_device_usbgadget;
++extern struct platform_device s3c_device_camif; /* @@@ change plat/devs.h */
++
++
++/* -------------------------------------------------------------------------------
++ * OM_3D7K FIQ related
++ *
++ * Calls into vibrator and hdq and based on the return values
++ * determines if we the FIQ source be kept alive
++ */
++
++#define DIVISOR_FROM_US(x) ((x) * 23)
++
++#ifdef CONFIG_HDQ_GPIO_BITBANG
++#define FIQ_DIVISOR_HDQ DIVISOR_FROM_US(HDQ_SAMPLE_PERIOD_US)
++extern int hdq_fiq_handler(void);
++#endif
++
++/* Global data related to our fiq source */
++static u32 om_3d7k_fiq_ack_mask;
++static u32 om_3d7k_fiq_mod_mask;
++static struct s3c2410_pwm om_3d7k_fiq_pwm_timer;
++static u16 om_3d7k_fiq_timer_index;
++static int om_3d7k_fiq_irq;
++
++/* Convinience defines */
++#define S3C6410_INTMSK (S3C_VA_VIC0 + VIC_INT_ENABLE)
++#define S3C6410_INTMOD (S3C_VA_VIC0 + VIC_INT_SELECT)
++
++
++
++static void om_3d7k_fiq_handler(void)
++{
++ u16 divisor = 0xffff;
++
++ /* Vibrator servicing */
++
++ /* disable further timer interrupts if nobody has any work
++ * or adjust rate according to who still has work
++ *
++ * CAUTION: it means forground code must disable FIQ around
++ * its own non-atomic S3C2410_INTMSK changes... not common
++ * thankfully and taken care of by the fiq-basis patch
++ */
++
++#ifdef CONFIG_HDQ_GPIO_BITBANG
++ if (hdq_fiq_handler())
++ divisor = (u16)FIQ_DIVISOR_HDQ;
++#endif
++
++ if (divisor == 0xffff) /* mask the fiq irq source */
++ __raw_writel((__raw_readl(S3C64XX_TINT_CSTAT) & 0x1f) & ~(1 << 3),
++ S3C64XX_TINT_CSTAT);
++ else /* still working, maybe at a different rate */
++ __raw_writel(divisor, S3C2410_TCNTB(om_3d7k_fiq_timer_index));
++
++ __raw_writel((__raw_readl(S3C64XX_TINT_CSTAT) & 0x1f ) | 1 << 8 , S3C64XX_TINT_CSTAT);
++
++}
++
++static void om_3d7k_fiq_kick(void)
++{
++ unsigned long flags;
++ u32 tcon;
++
++ /* we have to take care about FIQ because this modification is
++ * non-atomic, FIQ could come in after the read and before the
++ * writeback and its changes to the register would be lost
++ * (platform INTMSK mod code is taken care of already)
++ */
++ local_save_flags(flags);
++ local_fiq_disable();
++ /* allow FIQs to resume */
++ __raw_writel((__raw_readl(S3C64XX_TINT_CSTAT) & 0x1f)| 1 << 3,
++ S3C64XX_TINT_CSTAT);
++
++ tcon = __raw_readl(S3C2410_TCON) & ~S3C2410_TCON_T3START;
++ /* fake the timer to a count of 1 */
++ __raw_writel(1, S3C2410_TCNTB(om_3d7k_fiq_timer_index));
++ __raw_writel(tcon | S3C2410_TCON_T3MANUALUPD, S3C2410_TCON);
++ __raw_writel(tcon | S3C2410_TCON_T3MANUALUPD | S3C2410_TCON_T3START,
++ S3C2410_TCON);
++ __raw_writel(tcon | S3C2410_TCON_T3START, S3C2410_TCON);
++ local_irq_restore(flags);
++}
++
++static int om_3d7k_fiq_enable(void)
++{
++ int irq_index_fiq = IRQ_TIMER3_VIC;
++ int rc = 0;
++
++ local_fiq_disable();
++
++ om_3d7k_fiq_irq = irq_index_fiq;
++ om_3d7k_fiq_ack_mask = 1 << 3;
++ om_3d7k_fiq_mod_mask = 1 << 27;
++ om_3d7k_fiq_timer_index = 3;
++
++ /* set up the timer to operate as a pwm device */
++
++ rc = s3c2410_pwm_init(&om_3d7k_fiq_pwm_timer);
++ if (rc)
++ goto bail;
++
++ om_3d7k_fiq_pwm_timer.timerid = PWM0 + om_3d7k_fiq_timer_index;
++ om_3d7k_fiq_pwm_timer.prescaler = ((6 - 1) / 2);
++ om_3d7k_fiq_pwm_timer.divider = S3C64XX_TCFG1_MUX_DIV2 << S3C2410_TCFG1_SHIFT(3);
++ /* default rate == ~32us */
++ om_3d7k_fiq_pwm_timer.counter = om_3d7k_fiq_pwm_timer.comparer = 3000;
++
++ rc = s3c2410_pwm_enable(&om_3d7k_fiq_pwm_timer);
++ if (rc)
++ goto bail;
++
++ /* let our selected interrupt be a magic FIQ interrupt */
++ __raw_writel(om_3d7k_fiq_mod_mask, S3C6410_INTMSK + 4);
++ __raw_writel(om_3d7k_fiq_mod_mask, S3C6410_INTMOD);
++ __raw_writel(om_3d7k_fiq_mod_mask, S3C6410_INTMSK);
++
++ __raw_writel(SP890_TZIC_UNLOCK_MAGIC, S3C64XX_VA_TZIC0_LOCK);
++ __raw_writel(om_3d7k_fiq_mod_mask, S3C64XX_VA_TZIC0_FIQENABLE);
++ __raw_writel(om_3d7k_fiq_mod_mask, S3C64XX_VA_TZIC0_INTSELECT);
++
++ s3c2410_pwm_start(&om_3d7k_fiq_pwm_timer);
++
++ /* it's ready to go as soon as we unmask the source in S3C2410_INTMSK */
++ local_fiq_enable();
++
++ set_fiq_c_handler(om_3d7k_fiq_handler);
++
++ if (rc < 0)
++ goto bail;
++
++ return 0;
++bail:
++ printk(KERN_ERR "Count not initialize FIQ for OM_3D7K %d \n", rc);
++ return rc;
++}
++
++static void om_3d7k_fiq_disable(void)
++{
++ __raw_writel(0, S3C6410_INTMOD);
++ local_fiq_disable();
++ om_3d7k_fiq_irq = 0; /* no active source interrupt now either */
++
++}
++/* -------------------- /OM_3D7K FIQ Handler ------------------------------------- */
++
++#define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK
++#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
++#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
++
++static struct s3c2410_uartcfg om_3d7k_uartcfgs[] __initdata = {
++ [0] = {
++ .hwport = 0,
++ .flags = 0,
++ .ucon = 0x3c5,
++ .ulcon = 0x03,
++ .ufcon = 0x51,
++ },
++ [1] = {
++ .hwport = 1,
++ .flags = 0,
++ .ucon = 0x3c5,
++ .ulcon = 0x03,
++ .ufcon = 0x51,
++ },
++ [2] = {
++ .hwport = 2,
++ .flags = 0,
++ .ucon = 0x3c5,
++ .ulcon = 0x03,
++ .ufcon = 0x51,
++ },
++ [3] = {
++ .hwport = 3,
++ .flags = 0,
++ .ucon = 0x3c5,
++ .ulcon = 0x03,
++ .ufcon = 0x51,
++ },
++};
++
++
++/*
++ * Situation is that Linux SPI can't work in an interrupt context, so we
++ * implement our own bitbang here. Arbitration is needed because not only
++ * can this interrupt happen at any time even if foreground wants to use
++ * the bitbang API from Linux, but multiple motion sensors can be on the
++ * same SPI bus, and multiple interrupts can happen.
++ *
++ * Foreground / interrupt arbitration is okay because the interrupts are
++ * disabled around all the foreground SPI code.
++ *
++ * Interrupt / Interrupt arbitration is evidently needed, otherwise we
++ * lose edge-triggered service after a while due to the two sensors sharing
++ * the SPI bus having irqs at the same time eventually.
++ *
++ * Servicing is typ 75 - 100us at 400MHz.
++ */
++
++/* #define DEBUG_SPEW_MS */
++#define MG_PER_SAMPLE 18
++
++struct lis302dl_platform_data lis302_pdata;
++
++/*
++ * generic SPI RX and TX bitbang
++ * only call with interrupts off!
++ */
++
++static void __3d7k_lis302dl_bitbang(struct lis302dl_info *lis, u8 *tx,
++ int tx_bytes, u8 *rx, int rx_bytes)
++{
++ struct lis302dl_platform_data *pdata = lis->pdata;
++ int n;
++ u8 shifter = 0;
++
++ gpio_direction_output(pdata->pin_chip_select, 1);
++ gpio_direction_output(pdata->pin_clk, 1);
++ gpio_direction_output(pdata->pin_chip_select, 0);
++
++ /* send the register index, r/w and autoinc bits */
++ for (n = 0; n < (tx_bytes << 3); n++) {
++ if (!(n & 7))
++ shifter = ~tx[n >> 3];
++ gpio_direction_output(pdata->pin_clk, 0);
++ gpio_direction_output(pdata->pin_mosi, !(shifter & 0x80));
++ gpio_direction_output(pdata->pin_clk, 1);
++ shifter <<= 1;
++ }
++
++ for (n = 0; n < (rx_bytes << 3); n++) { /* 8 bits each */
++ gpio_direction_output(pdata->pin_clk, 0);
++ shifter <<= 1;
++ if (gpio_direction_input(pdata->pin_miso))
++ shifter |= 1;
++ if ((n & 7) == 7)
++ rx[n >> 3] = shifter;
++ gpio_direction_output(pdata->pin_clk, 1);
++ }
++ gpio_direction_output(pdata->pin_chip_select, 1);
++}
++
++
++static int om_3d7k_lis302dl_bitbang_read_reg(struct lis302dl_info *lis, u8 reg)
++{
++ u8 data = 0xc0 | reg; /* read, autoincrement */
++ unsigned long flags;
++
++ local_irq_save(flags);
++
++ __3d7k_lis302dl_bitbang(lis, &data, 1, &data, 1);
++
++ local_irq_restore(flags);
++
++ return data;
++}
++
++static void om_3d7k_lis302dl_bitbang_write_reg(struct lis302dl_info *lis, u8 reg,
++ u8 val)
++{
++ u8 data[2] = { 0x00 | reg, val }; /* write, no autoincrement */
++ unsigned long flags;
++
++ local_irq_save(flags);
++
++ __3d7k_lis302dl_bitbang(lis, &data[0], 2, NULL, 0);
++
++ local_irq_restore(flags);
++
++}
++
++
++void om_3d7k_lis302dl_suspend_io(struct lis302dl_info *lis, int resume)
++{
++ struct lis302dl_platform_data *pdata = lis->pdata;
++
++ if (!resume) {
++ /*
++ * we don't want to power them with a high level
++ * because GSENSOR_3V3 is not up during suspend
++ */
++ gpio_direction_output(pdata->pin_chip_select, 0);
++ gpio_direction_output(pdata->pin_clk, 0);
++ gpio_direction_output(pdata->pin_mosi, 0);
++ s3c_gpio_setpull(pdata->pin_miso, S3C_GPIO_PULL_DOWN);
++
++ return;
++ }
++
++ /* back to normal */
++ gpio_direction_output(pdata->pin_chip_select, 1);
++ gpio_direction_output(pdata->pin_clk, 1);
++ s3c_gpio_setpull(pdata->pin_miso, S3C_GPIO_PULL_NONE);
++
++ s3c_gpio_cfgpin(pdata->pin_chip_select, S3C_GPIO_SFN(1));
++ s3c_gpio_cfgpin(pdata->pin_clk, S3C_GPIO_SFN(1));
++ s3c_gpio_cfgpin(pdata->pin_mosi, S3C_GPIO_SFN(1));
++ s3c_gpio_cfgpin(pdata->pin_miso, S3C_GPIO_SFN(0));
++
++}
++#if 0
++struct lis302dl_platform_data lis302_pdata = {
++ .name = "lis302",
++ .pin_chip_select= S3C64XX_GPC(3), /* NC */
++ .pin_clk = OM_3D7K_GPIO_ACCEL_CLK,
++ .pin_mosi = OM_3D7K_GPIO_ACCEL_MOSI,
++ .pin_miso = OM_3D7K_GPIO_ACCEL_MISO,
++ .interrupt = OM_3D7K_IRQ_GSENSOR_1,
++ .open_drain = 0,
++ .lis302dl_bitbang = __3d7k_lis302dl_bitbang,
++ .lis302dl_bitbang_reg_read = om_3d7k_lis302dl_bitbang_read_reg,
++ .lis302dl_bitbang_reg_write = om_3d7k_lis302dl_bitbang_write_reg,
++ .lis302dl_suspend_io = om_3d7k_lis302dl_suspend_io,
++};
++
++static struct platform_device s3c_device_spi_acc1 = {
++ .name = "lis302dl",
++ .id = 1,
++ .dev = {
++ .platform_data = &lis302_pdata,
++ },
++};
++
++#endif
++
++/* framebuffer and LCD setup. */
++
++/* GPF15 = LCD backlight control
++ * GPF13 => Panel power
++ * GPN5 = LCD nRESET signal
++ * PWM_TOUT1 => backlight brightness
++ */
++
++static void om_3d7k_lcd_power_set(struct plat_lcd_data *pd,
++ unsigned int power)
++{
++
++}
++
++static struct plat_lcd_data om_3d7k_lcd_power_data = {
++ .set_power = om_3d7k_lcd_power_set,
++};
++
++static struct platform_device om_3d7k_lcd_powerdev = {
++ .name = "platform-lcd",
++ .dev.parent = &s3c_device_fb.dev,
++ .dev.platform_data = &om_3d7k_lcd_power_data,
++};
++
++static struct s3c_fb_pd_win om_3d7k_fb_win0 = {
++ /* this is to ensure we use win0 */
++ .win_mode = {
++ .pixclock = 40816,
++ .left_margin = 8,
++ .right_margin = 16,
++ .upper_margin = 2,
++ .lower_margin = 16,
++ .hsync_len = 8,
++ .vsync_len = 2,
++ .xres = 480,
++ .yres = 640,
++ },
++ .max_bpp = 32,
++ .default_bpp = 16,
++};
++
++static void om_3d7k_fb_gpio_setup(void)
++{
++ unsigned int gpio;
++
++ /* GPI0, GPI1, GPI8 are for hardware version contrl.
++ * They should be set as input in order to prevent
++ * current leaking
++ */
++ for (gpio = S3C64XX_GPI(2); gpio <= S3C64XX_GPI(15); gpio++) {
++ if (gpio != S3C64XX_GPI(8)) {
++ s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
++ s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
++ }
++ }
++
++ for (gpio = S3C64XX_GPJ(0); gpio <= S3C64XX_GPJ(11); gpio++) {
++ s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
++ s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
++ }
++}
++
++static struct s3c_fb_platdata om_3d7k_lcd_pdata __initdata = {
++ .setup_gpio = om_3d7k_fb_gpio_setup,
++ .win[0] = &om_3d7k_fb_win0,
++ .vidcon0 = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB,
++ .vidcon1 = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,
++};
++
++
++struct map_desc om_3d7k_6410_iodesc[] = {};
++
++static struct resource om_3d7k_button_resources[] = {
++ [0] = {
++ .start = 0,
++ .end = 0,
++ },
++ [1] = {
++ .start = OM_3D7K_GPIO_HOLD,
++ .end = OM_3D7K_GPIO_HOLD,
++ },
++ [2] = {
++ .start = OM_3D7K_GPIO_JACK_INSERT,
++ .end = OM_3D7K_GPIO_JACK_INSERT,
++ },
++ [3] = {
++ .start = OM_3D7K_GPIO_KEY_PLUS,
++ .end = OM_3D7K_GPIO_KEY_PLUS,
++ },
++ [4] = {
++ .start = OM_3D7K_GPIO_KEY_MINUS,
++ .end = OM_3D7K_GPIO_KEY_MINUS,
++ },
++};
++
++static struct platform_device om_3d7k_button_dev = {
++ .name = "neo1973-button",
++ .num_resources = ARRAY_SIZE(om_3d7k_button_resources),
++ .resource = om_3d7k_button_resources,
++};
++
++
++/********************** PMU ***************************/
++/*
++ * OM_3D7K PMU Mapping info
++ *
++ * name maxcurr default Nom consumers
++ *
++ * AUTO 1100mA ON 3.3V 3.3V Main 3.3V rail
++ * DOWN1 500mA ON 1.2V 1.2V CPU VddARM, VddINT, VddMPLL, VddOTGI
++ * DOWN2 500mA ON 1.8V 1.8V CPU VddAlive via LDO, Memories, WLAN
++ * LED 25mA OFF 18V Backlight
++ * HCLDO 200mA OFF 2.8V Camera 2V8
++ * LDO1 50mA ON 3.3V 3.3V Accel
++ * LDO2 50mA OFF 1.5V Camera 1V5
++ * LDO3 50mA OFF 3.3V CODEC 3.3V
++ * LDO4 150mA ON 2.8V 2.7V uSD power
++ * LDO5 150mA OFF 3.0V GPS 3V
++ * LDO6 50mA ON 3.0V 3.0V LCM 3V
++ *
++ */
++
++
++/* PMU driver info */
++
++
++static struct regulator_consumer_supply ldo4_consumers[] = {
++ {
++ .dev = &s3c_device_hsmmc0.dev,
++ .supply = "SD_3V",
++ },
++};
++
++static struct platform_device om_3d7k_features_dev = {
++ .name = "om-3d7k",
++};
++
++static struct regulator_consumer_supply ldo5_consumers[] = {
++ {
++ .dev = &om_3d7k_features_dev.dev,
++ .supply = "RF_3V",
++ },
++};
++
++
++static void om_3d7k_pmu_event_callback(struct pcf50633 *pcf, int irq)
++{
++#if 0
++ if (irq == PCF50633_IRQ_USBINS) {
++ schedule_delayed_work(&om_3d7k_charger_work,
++ GTA02_CHARGER_CONFIGURE_TIMEOUT);
++ return;
++ } else if (irq == PCF50633_IRQ_USBREM) {
++ cancel_delayed_work_sync(&om_3d7k_charger_work);
++ pcf50633_mbc_usb_curlim_set(pcf, 0);
++ om_3d7k_usb_vbus_draw = 0;
++ }
++
++ bq27000_charging_state_change(&bq27000_battery_device);
++#endif
++}
++
++static void om_3d7k_pcf50633_attach_child_devices(struct pcf50633 *pcf);
++static void om_3d7k_pmu_regulator_registered(struct pcf50633 *pcf, int id);
++
++/* Global reference */
++struct pcf50633 *om_3d7k_pcf;
++
++struct pcf50633_platform_data om_3d7k_pcf_pdata = {
++
++ .resumers = {
++ [0] = PCF50633_INT1_USBINS |
++ PCF50633_INT1_USBREM |
++ PCF50633_INT1_ALARM,
++ [1] = PCF50633_INT2_ONKEYF,
++ [2] = PCF50633_INT3_ONKEY1S
++ },
++ .chg_ref_current_ma = 1000,
++ .reg_init_data = {
++ /* OM_3D7K: Main 3.3V rail */
++ [PCF50633_REGULATOR_AUTO] = {
++ .constraints = {
++ .min_uV = 3300000,
++ .max_uV = 3300000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .apply_uV = 1,
++ .state_mem = {
++ .enabled = 1,
++ },
++ },
++ .num_consumer_supplies = 0,
++ },
++ /* OM_3D7K: CPU core power */
++ [PCF50633_REGULATOR_DOWN1] = {
++ .constraints = {
++ .min_uV = 900000,
++ .max_uV = 1200000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .apply_uV = 1,
++ },
++ .num_consumer_supplies = 0,
++ },
++ /* OM_3D7K: Memories */
++ [PCF50633_REGULATOR_DOWN2] = {
++ .constraints = {
++ .min_uV = 1800000,
++ .max_uV = 1800000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .apply_uV = 1,
++ .state_mem = {
++ .enabled = 1,
++ },
++ },
++ .num_consumer_supplies = 0,
++ },
++ /* OM_3D7K: Camera 2V8 */
++ [PCF50633_REGULATOR_HCLDO] = {
++ .constraints = {
++ .min_uV = 2800000,
++ .max_uV = 2800000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ },
++ .num_consumer_supplies = 0,
++/* .consumer_supplies = hcldo_consumers, */
++ },
++
++ /* OM_3D7K: Accel 3V3 */
++ [PCF50633_REGULATOR_LDO1] = {
++ .constraints = {
++ .min_uV = 3300000,
++ .max_uV = 3300000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .apply_uV = 1,
++ },
++ .num_consumer_supplies = 0,
++ },
++ /* OM_3D7K: Camera 1V5 */
++ [PCF50633_REGULATOR_LDO2] = {
++ .constraints = {
++ .min_uV = 1500000,
++ .max_uV = 1500000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .apply_uV = 1,
++ },
++ .num_consumer_supplies = 0,
++ },
++ /* OM_3D7K: Codec 3.3V */
++ [PCF50633_REGULATOR_LDO3] = {
++ .constraints = {
++ .min_uV = 3300000,
++ .max_uV = 3300000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .apply_uV = 1,
++ .always_on = 1,
++ },
++ .num_consumer_supplies = 0,
++ },
++ /* OM_3D7K: uSD Power */
++ [PCF50633_REGULATOR_LDO4] = {
++ .constraints = {
++ .min_uV = 3000000,
++ .max_uV = 3000000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .apply_uV = 1,
++ },
++ .num_consumer_supplies = 1,
++ .consumer_supplies = ldo4_consumers,
++ },
++ /* OM_3D7K: GPS 3V */
++ [PCF50633_REGULATOR_LDO5] = {
++ .constraints = {
++ .min_uV = 3000000,
++ .max_uV = 3000000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .apply_uV = 1,
++ },
++ .num_consumer_supplies = 1,
++ .consumer_supplies = ldo5_consumers,
++ },
++ /* OM_3D7K: LCM 3V */
++ [PCF50633_REGULATOR_LDO6] = {
++ .constraints = {
++ .min_uV = 3000000,
++ .max_uV = 3000000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .state_mem = {
++ .enabled = 1,
++ },
++ },
++ .num_consumer_supplies = 0,
++ },
++ /* power for memories in suspend */
++ [PCF50633_REGULATOR_MEMLDO] = {
++ .constraints = {
++ .min_uV = 1800000,
++ .max_uV = 1800000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .state_mem = {
++ .enabled = 1,
++ },
++ },
++ .num_consumer_supplies = 0,
++ },
++
++ },
++ .probe_done = om_3d7k_pcf50633_attach_child_devices,
++ .regulator_registered = om_3d7k_pmu_regulator_registered,
++ .mbc_event_callback = om_3d7k_pmu_event_callback,
++};
++
++static void om_3d7k_bl_set_intensity(int intensity)
++{
++ struct pcf50633 *pcf = om_3d7k_pcf;
++ int old_intensity = pcf50633_reg_read(pcf, PCF50633_REG_LEDOUT);
++ int ret;
++
++ intensity >>= 2;
++
++ /*
++ * One code path that leads here is from a kernel panic. Trying to turn
++ * the backlight on just gives us a nearly endless stream of complaints
++ * and accomplishes nothing. We can't win. Just give up.
++ *
++ * In the unlikely event that there's another path leading here while
++ * we're atomic, we print at least a warning.
++ */
++ if (in_atomic()) {
++ printk(KERN_ERR
++ "3d7k_bl_set_intensity called while atomic\n");
++ return;
++ }
++
++ old_intensity = pcf50633_reg_read(pcf, PCF50633_REG_LEDOUT);
++ if (intensity == old_intensity)
++ return;
++
++ /* We can't do this anywhere else */
++ pcf50633_reg_write(pcf, PCF50633_REG_LEDDIM, 5);
++
++ if (!(pcf50633_reg_read(pcf, PCF50633_REG_LEDENA) & 3))
++ old_intensity = 0;
++
++ /*
++ * The PCF50633 cannot handle LEDOUT = 0 (datasheet p60)
++ * if seen, you have to re-enable the LED unit
++ */
++ if (!intensity || !old_intensity)
++ pcf50633_reg_write(pcf, PCF50633_REG_LEDENA, 0);
++
++ if (!intensity) /* illegal to set LEDOUT to 0 */
++ ret = pcf50633_reg_set_bit_mask(pcf, PCF50633_REG_LEDOUT, 0x3f,
++ 2);
++ else
++ ret = pcf50633_reg_set_bit_mask(pcf, PCF50633_REG_LEDOUT, 0x3f,
++ intensity);
++
++ if (intensity)
++ pcf50633_reg_write(pcf, PCF50633_REG_LEDENA, 2);
++
++}
++
++static struct generic_bl_info om_3d7k_bl_info = {
++ .name = "om-3d7k-bl",
++ .max_intensity = 0xff,
++ .default_intensity = 0x7f,
++ .set_bl_intensity = om_3d7k_bl_set_intensity,
++};
++
++static struct platform_device om_3d7k_bl_dev = {
++ .name = "generic-bl",
++ .id = 1,
++ .dev = {
++ .platform_data = &om_3d7k_bl_info,
++ },
++};
++
++/* BQ27000 Battery */
++static int om_3d7k_get_charger_online_status(void)
++{
++ struct pcf50633 *pcf = om_3d7k_pcf;
++
++ return pcf50633_mbc_get_status(pcf) & PCF50633_MBC_USB_ONLINE;
++}
++
++static int om_3d7k_get_charger_active_status(void)
++{
++ struct pcf50633 *pcf = om_3d7k_pcf;
++
++ return pcf50633_mbc_get_status(pcf) & PCF50633_MBC_USB_ACTIVE;
++}
++
++
++struct bq27000_platform_data bq27000_pdata = {
++ .name = "battery",
++ .rsense_mohms = 20,
++ .hdq_read = hdq_read,
++ .hdq_write = hdq_write,
++ .hdq_initialized = hdq_initialized,
++ .get_charger_online_status = om_3d7k_get_charger_online_status,
++ .get_charger_active_status = om_3d7k_get_charger_active_status
++};
++
++struct platform_device bq27000_battery_device = {
++ .name = "bq27000-battery",
++ .dev = {
++ .platform_data = &bq27000_pdata,
++ },
++};
++
++#ifdef CONFIG_HDQ_GPIO_BITBANG
++/* HDQ */
++
++static void om_3d7k_hdq_attach_child_devices(struct device *parent_device)
++{
++ bq27000_battery_device.dev.parent = parent_device;
++ platform_device_register(&bq27000_battery_device);
++}
++
++static void om_3d7k_hdq_gpio_direction_out(void)
++{
++ unsigned long con;
++ void __iomem *regcon = S3C64XX_GPH_BASE;
++
++ con = __raw_readl(regcon);
++ con &= ~(0xf << 28);
++ con |= 0x01 << 28;
++ __raw_writel(con, regcon);
++
++ /* Set pull-up enabled */
++ con = __raw_readl(regcon + 0x0c);
++ con |= 3 << 14;
++ __raw_writel(con, regcon + 0x0c);
++}
++
++static void om_3d7k_hdq_gpio_direction_in(void)
++{
++ unsigned long con;
++ void __iomem *regcon = S3C64XX_GPH_BASE;
++
++ con = __raw_readl(regcon);
++ con &= ~(0xf << 28);
++ __raw_writel(con, regcon);
++}
++
++static void om_3d7k_hdq_gpio_set_value(int val)
++{
++ u32 dat;
++ void __iomem *base = S3C64XX_GPH_BASE;
++
++ dat = __raw_readl(base + 0x08);
++ if (val)
++ dat |= 1 << 7;
++ else
++ dat &= ~(1 << 7);
++
++ __raw_writel(dat, base + 0x08);
++}
++
++static int om_3d7k_hdq_gpio_get_value(void)
++{
++ u32 dat;
++ void *base = S3C64XX_GPH_BASE;
++
++ dat = __raw_readl(base + 0x08);
++
++ return dat & (1 << 7);
++}
++
++static struct resource om_3d7k_hdq_resources[] = {
++ [0] = {
++ .start = S3C64XX_GPH(7),
++ .end = S3C64XX_GPH(7),
++ },
++};
++
++struct hdq_platform_data om_3d7k_hdq_platform_data = {
++ .attach_child_devices = om_3d7k_hdq_attach_child_devices,
++ .gpio_dir_out = om_3d7k_hdq_gpio_direction_out,
++ .gpio_dir_in = om_3d7k_hdq_gpio_direction_in,
++ .gpio_set = om_3d7k_hdq_gpio_set_value,
++ .gpio_get = om_3d7k_hdq_gpio_get_value,
++
++ .enable_fiq = om_3d7k_fiq_enable,
++ .disable_fiq = om_3d7k_fiq_disable,
++ .kick_fiq = om_3d7k_fiq_kick,
++
++};
++
++struct platform_device om_3d7k_hdq_device = {
++ .name = "hdq",
++ .num_resources = 1,
++ .resource = om_3d7k_hdq_resources,
++ .dev = {
++ .platform_data = &om_3d7k_hdq_platform_data,
++ },
++};
++#endif
++
++static void om_3d7k_lp5521_chip_enable(int level)
++{
++ gpio_direction_output(OM_3D7K_GPIO_LED_EN, level);
++ udelay(500);
++}
++
++static struct lp5521_platform_data om_3d7k_lp5521_pdata = {
++ .channels = {
++ [LP5521_BLUE] = LP5521_CONNECTED,
++ [LP5521_GREEN] = LP5521_CONNECTED,
++ [LP5521_RED] = LP5521_NC,
++ },
++ .ext_enable = om_3d7k_lp5521_chip_enable,
++};
++
++static void om_3d7k_pcap7200_reset(void)
++{
++ gpio_direction_output(OM_3D7K_GPIO_TP_RESET, 1);
++ udelay(10);
++ gpio_direction_output(OM_3D7K_GPIO_TP_RESET, 0);
++}
++
++static struct pcap7200_platform_data om_3d7k_pcap7200_pdata = {
++ .mode = MULTI_TOUCH,
++ .reset = om_3d7k_pcap7200_reset,
++};
++
++static struct i2c_board_info om_3d7k_i2c_devs[] __initdata = {
++ {
++ I2C_BOARD_INFO("pcf50633", 0x73),
++ .irq = OM_3D7K_IRQ_PMU,
++ .platform_data = &om_3d7k_pcf_pdata,
++ },
++ {
++ I2C_BOARD_INFO("pcap7200", 0x0a),
++ .irq = OM_3D7K_IRQ_TOUCH,
++ .platform_data = &om_3d7k_pcap7200_pdata,
++ },
++ {
++ I2C_BOARD_INFO("lp5521", 0x32),
++ /* mark this temporarily, since LED INT is connected
++ * to EXT group6_9, the handling of EXT group1~group9
++ * is not implemented. Besides, we don't need this IRQ
++ * now
++ */
++#if 0
++ .irq = OM_3D7K_IRQ_LED,
++#endif
++ .platform_data = &om_3d7k_lp5521_pdata,
++ },
++ {
++ I2C_BOARD_INFO("wm8753", 0x1a),
++ },
++};
++
++struct platform_device s3c24xx_pwm_device = {
++ .name = "s3c24xx_pwm",
++ .num_resources = 0,
++};
++
++struct platform_device om_3d7k_device_spi_lcm;
++
++static struct platform_device *om_3d7k_devices[] __initdata = {
++ &s3c_device_fb,
++ &s3c_device_i2c0,
++ &om_3d7k_device_spi_lcm,
++ &s3c_device_usbgadget,
++ &s3c24xx_pwm_device,
++#ifdef CONFIG_S3C_DEV_CAMIF
++ &s3c_device_camif,
++#endif
++};
++
++
++static void om_3d7k_pmu_regulator_registered(struct pcf50633 *pcf, int id)
++{
++ struct platform_device *regulator, *pdev;
++
++ regulator = pcf->regulator_pdev[id];
++
++ switch(id) {
++ case PCF50633_REGULATOR_LDO4:
++ pdev = &s3c_device_hsmmc0; /* uSD card */
++ break;
++ case PCF50633_REGULATOR_LDO5: /* GPS regulator */
++ pdev = &om_3d7k_features_dev;
++ break;
++ case PCF50633_REGULATOR_LDO6:
++ pdev = &om_3d7k_lcd_powerdev;
++ break;
++ default:
++ return;
++ }
++
++ pdev->dev.parent = &regulator->dev;
++ platform_device_register(pdev);
++}
++
++static struct platform_device *om_3d7k_devices_pmu_children[] = {
++ &om_3d7k_button_dev,
++// &s3c_device_spi_acc1, /* relies on PMU reg for power */
++ &s3c_device_usb,
++};
++
++/* this is called when pc50633 is probed, unfortunately quite late in the
++ * day since it is an I2C bus device. Here we can belatedly define some
++ * platform devices with the advantage that we can mark the pcf50633 as the
++ * parent. This makes them get suspended and resumed with their parent
++ * the pcf50633 still around.
++ */
++
++static void om_3d7k_pcf50633_attach_child_devices(struct pcf50633 *pcf)
++{
++ int n;
++
++ om_3d7k_pcf = pcf;
++
++ for (n = 0; n < ARRAY_SIZE(om_3d7k_devices_pmu_children); n++)
++ om_3d7k_devices_pmu_children[n]->dev.parent = pcf->dev;
++
++ platform_add_devices(om_3d7k_devices_pmu_children,
++ ARRAY_SIZE(om_3d7k_devices_pmu_children));
++
++ /* backlight device should be registered until pcf50633 probe is done */
++ om_3d7k_bl_dev.dev.parent = &om_3d7k_device_spi_lcm.dev;
++ platform_device_register(&om_3d7k_bl_dev);
++
++ /* Switch on backlight. Qi does not do it for us */
++ pcf50633_reg_write(pcf, PCF50633_REG_LEDENA, 0x00);
++ pcf50633_reg_write(pcf, PCF50633_REG_LEDDIM, 0x01);
++ pcf50633_reg_write(pcf, PCF50633_REG_LEDENA, 0x01);
++}
++
++static void om_3d7k_l1k002_pwronoff(int level)
++{
++ gpio_direction_output(OM_3D7K_GPIO_LCM_SD, 1);
++ udelay(15);
++
++ gpio_direction_output(OM_3D7K_GPIO_LCM_RESET, !!level);
++
++ if (level){
++ udelay(15);
++ gpio_direction_output(OM_3D7K_GPIO_LCM_SD, 0);
++ }
++}
++
++const struct l1k002_platform_data om_3d7k_l1k002_pdata = {
++ .pwr_onoff = om_3d7k_l1k002_pwronoff,
++};
++
++static struct spi_board_info om_3d7k_spi_board_info[] = {
++ {
++ .modalias = "l1k002",
++ .platform_data = &om_3d7k_l1k002_pdata,
++ /* controller_data */
++ /* irq */
++ .max_speed_hz = 10 * 1000 * 1000,
++ .bus_num = 1,
++ /* chip_select */
++ },
++};
++
++static void om_3d7k_jbt6k74_probe_completed(struct device *dev)
++{
++ dev_info(dev, "device attached\n");
++}
++
++const struct jbt6k74_platform_data jbt6k74_pdata = {
++ .probe_completed = om_3d7k_jbt6k74_probe_completed,
++};
++
++static struct spi_board_info alt_om_3d7k_spi_board_info[] = {
++ {
++ .modalias = "jbt6k74",
++ .platform_data = &jbt6k74_pdata,
++ /* controller_data */
++ /* irq */
++ .max_speed_hz = 100 * 1000,
++ .bus_num = 1,
++ /* chip_select */
++ },
++};
++
++static void spi_gpio_cs(struct s3c64xx_spigpio_info *spi, int csidx, int cs)
++{
++ switch (cs) {
++ case BITBANG_CS_ACTIVE:
++ gpio_direction_output(OM_3D7K_GPIO_LCM_CS, 0);
++ break;
++ case BITBANG_CS_INACTIVE:
++ gpio_direction_output(OM_3D7K_GPIO_LCM_CS, 1);
++ break;
++ }
++}
++
++static struct s3c64xx_spigpio_info spi_gpio_cfg = {
++ .pin_clk = OM_3D7K_GPIO_LCM_CLK,
++ .pin_mosi = OM_3D7K_GPIO_LCM_MOSI,
++ /* no pinout to MISO */
++ .chip_select = &spi_gpio_cs,
++ .num_chipselect = 1,
++ .bus_num = 1,
++};
++
++struct platform_device om_3d7k_device_spi_lcm = {
++ .name = "spi_s3c64xx_gpio",
++ .id = 1,
++ .dev = {
++ .platform_data = &spi_gpio_cfg,
++ },
++};
++
++static int attached_lcm;
++
++static int __init om3d7k_lcm_probe(char *s)
++{
++ if (!strcmp(s, "jbt6k74"))
++ attached_lcm = 1;
++
++ return 1;
++}
++__setup("om_3d7k_lcm=", om3d7k_lcm_probe);
++
++extern void s3c64xx_init_io(struct map_desc *, int);
++
++struct s3c_plat_otg_data s3c_hs_otg_plat_data = {
++ .phyclk = 0
++};
++
++/* USB */
++static struct s3c2410_hcd_info om3d7k_usb_info = {
++ .port[0] = {
++ .flags = S3C_HCDFLG_USED,
++ },
++ .port[1] = {
++ .flags = 0,
++ },
++};
++
++static void __init om_3d7k_map_io(void)
++{
++ s3c64xx_init_io(om_3d7k_6410_iodesc, ARRAY_SIZE(om_3d7k_6410_iodesc));
++ s3c24xx_init_clocks(12000000);
++ s3c24xx_init_uarts(om_3d7k_uartcfgs, ARRAY_SIZE(om_3d7k_uartcfgs));
++}
++
++static void __init om_3d7k_machine_init(void)
++{
++ s3c_pm_init();
++
++ s3c_device_usb.dev.platform_data = &om3d7k_usb_info;
++ s3c_device_usbgadget.dev.platform_data = &s3c_hs_otg_plat_data;
++
++ s3c_i2c0_set_platdata(NULL);
++ s3c_fb_set_platdata(&om_3d7k_lcd_pdata);
++
++ i2c_register_board_info(0, om_3d7k_i2c_devs,
++ ARRAY_SIZE(om_3d7k_i2c_devs));
++ if (attached_lcm)
++ spi_register_board_info(alt_om_3d7k_spi_board_info,
++ ARRAY_SIZE(alt_om_3d7k_spi_board_info));
++ else
++ spi_register_board_info(om_3d7k_spi_board_info,
++ ARRAY_SIZE(om_3d7k_spi_board_info));
++
++ platform_add_devices(om_3d7k_devices, ARRAY_SIZE(om_3d7k_devices));
++
++ /* Register the HDQ and vibrator as children of pwm device */
++ om_3d7k_hdq_device.dev.parent = &s3c24xx_pwm_device.dev;
++ platform_device_register(&om_3d7k_hdq_device);
++}
++
++MACHINE_START(OM_3D7K, "OM-3D7K")
++ /* Maintainer: Andy Green <andy@openmoko.com> */
++ .phys_io = S3C_PA_UART & 0xfff00000,
++ .io_pg_offst = (((u32)S3C_VA_UART) >> 18) & 0xfffc,
++ .boot_params = S3C64XX_PA_SDRAM + 0x100,
++
++ .init_irq = s3c6410_init_irq,
++ .map_io = om_3d7k_map_io,
++ .init_machine = om_3d7k_machine_init,
++ .timer = &s3c24xx_timer,
++MACHINE_END
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6410/mach-smdk6410.c linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6410/mach-smdk6410.c
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6410/mach-smdk6410.c 2009-05-10 22:08:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6410/mach-smdk6410.c 2009-05-10 22:27:59.000000000 +0200
+@@ -39,14 +39,20 @@
+ #include <asm/mach-types.h>
+
+ #include <plat/regs-serial.h>
++#include <plat/regs-modem.h>
++#include <plat/regs-gpio.h>
++#include <plat/regs-sys.h>
+ #include <plat/iic.h>
+ #include <plat/fb.h>
++#include <plat/pm.h>
+
+ #include <plat/s3c6410.h>
+ #include <plat/clock.h>
+ #include <plat/devs.h>
+ #include <plat/cpu.h>
+
++#include <plat/regs-usb-hs-otg.h>
++
+ #define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK
+ #define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
+ #define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
+@@ -141,7 +147,10 @@
+ &s3c_device_i2c0,
+ &s3c_device_i2c1,
+ &s3c_device_fb,
++ &s3c_device_usb,
+ &smdk6410_lcd_powerdev,
++ &s3c_device_usbgadget,
++
+ };
+
+ static struct i2c_board_info i2c_devs0[] __initdata = {
+@@ -155,13 +164,36 @@
+
+ static void __init smdk6410_map_io(void)
+ {
++ u32 tmp;
++
+ s3c64xx_init_io(smdk6410_iodesc, ARRAY_SIZE(smdk6410_iodesc));
+ s3c24xx_init_clocks(12000000);
+ s3c24xx_init_uarts(smdk6410_uartcfgs, ARRAY_SIZE(smdk6410_uartcfgs));
++
++ /* set the LCD type */
++
++ tmp = __raw_readl(S3C64XX_SPCON);
++ tmp &= ~S3C64XX_SPCON_LCD_SEL_MASK;
++ tmp |= S3C64XX_SPCON_LCD_SEL_RGB;
++ __raw_writel(tmp, S3C64XX_SPCON);
++
++ /* remove the lcd bypass */
++ tmp = __raw_readl(S3C64XX_MODEM_MIFPCON);
++ tmp &= ~MIFPCON_LCD_BYPASS;
++ __raw_writel(tmp, S3C64XX_MODEM_MIFPCON);
+ }
+
++struct s3c_plat_otg_data s3c_hs_otg_plat_data = {
++ .phyclk = REF_CLK_OSCC
++};
++
++
+ static void __init smdk6410_machine_init(void)
+ {
++ s3c_pm_init();
++
++ s3c_device_usbgadget.dev.platform_data = &s3c_hs_otg_plat_data;
++
+ s3c_i2c0_set_platdata(NULL);
+ s3c_i2c1_set_platdata(NULL);
+ s3c_fb_set_platdata(&smdk6410_lcd_pdata);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6410/Makefile linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6410/Makefile
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6410/Makefile 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6410/Makefile 2009-05-10 22:27:59.000000000 +0200
+@@ -21,3 +21,6 @@
+ # machine support
+
+ obj-$(CONFIG_MACH_SMDK6410) += mach-smdk6410.o
++obj-$(CONFIG_MACH_OM_3D7K) += mach-om-3d7k.o \
++ om-3d7k-features.o
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6410/om-3d7k-features.c linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6410/om-3d7k-features.c
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6410/om-3d7k-features.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6410/om-3d7k-features.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,273 @@
++/*
++ * Support for features of Openmoko 3D7K
++ *
++ * (C) 2008 by Openmoko Inc.
++ * Author: Andy Green <andy@openmoko.com>
++ * All rights reserved.
++ *
++ * Somewhat based on the GTA01 / 02 neo1973_pm_ stuff mainly by Harald Welte
++ *
++ * 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
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/delay.h>
++#include <linux/platform_device.h>
++
++#include <mach/hardware.h>
++#include <mach/om-3d7k.h>
++#include <asm/mach-types.h>
++
++#include <linux/regulator/consumer.h>
++#include <linux/mfd/pcf50633/core.h>
++#include <linux/mfd/pcf50633/gpio.h>
++#include <linux/mmc/host.h>
++
++#include <plat/sdhci.h>
++#include <plat/devs.h>
++
++#include <plat/gpio-cfg.h>
++
++enum feature {
++ OM_3D7K_GSM, /* GSM module */
++ OM_3D7K_USBHOST, /* USB Host power generation */
++ OM_3D7K_VIB, /* Vibrator */
++
++ OM_3D7K_FEATURE_COUNT /* always last */
++};
++
++
++struct om_3d7k_feature_info {
++ const char * name;
++ int depower_on_suspend;
++ int on;
++};
++
++static struct om_3d7k_feature_info feature_info[OM_3D7K_FEATURE_COUNT] = {
++ [OM_3D7K_GSM] = { "gsm_power", 0, 0 },
++ [OM_3D7K_USBHOST] = { "usbhost_power", 1, 0 },
++ [OM_3D7K_VIB] = { "vibrator_power", 1, 0 },
++};
++
++static struct regulator *gps_regulator;
++
++
++
++static void om_3d7k_features_pwron_set_on(enum feature feature)
++{
++ switch (feature) {
++ case OM_3D7K_GSM:
++ /* give power to GSM module */
++ s3c_gpio_setpull(OM_3D7K_GPIO_N_MODEM_RESET, S3C_GPIO_PULL_NONE);
++ s3c_gpio_setpull(OM_3D7K_GPIO_MODEM_ON, S3C_GPIO_PULL_NONE);
++ s3c_gpio_cfgpin(OM_3D7K_GPIO_N_MODEM_RESET, S3C_GPIO_SFN(1));
++ s3c_gpio_cfgpin(OM_3D7K_GPIO_MODEM_ON, S3C_GPIO_SFN(1));
++ gpio_direction_output(OM_3D7K_GPIO_N_MODEM_RESET, 0);
++ gpio_direction_output(OM_3D7K_GPIO_MODEM_ON, 1);
++ msleep(10);
++ gpio_direction_output(OM_3D7K_GPIO_MODEM_ON, 0);
++ msleep(150);
++ gpio_direction_output(OM_3D7K_GPIO_N_MODEM_RESET, 1);
++ msleep(300);
++ gpio_direction_output(OM_3D7K_GPIO_MODEM_ON, 1);
++ break;
++ case OM_3D7K_USBHOST:
++ pcf50633_gpio_set(om_3d7k_pcf, PCF50633_GPO, 1);
++ break;
++ case OM_3D7K_VIB:
++ gpio_direction_output(OM_3D7K_GPIO_VIBRATOR_ON, 1);
++ break;
++ default:
++ break;
++ }
++}
++
++static void om_3d7k_features_pwron_set_off(enum feature feature)
++{
++ switch (feature) {
++ case OM_3D7K_GSM:
++ /* remove power from WLAN / BT module */
++ s3c_gpio_cfgpin(OM_3D7K_GPIO_MODEM_ON, S3C_GPIO_SFN(1));
++ gpio_direction_output(OM_3D7K_GPIO_MODEM_ON, 0);
++ msleep(1100);
++ gpio_direction_output(OM_3D7K_GPIO_MODEM_ON, 1);
++ break;
++ case OM_3D7K_USBHOST:
++ pcf50633_gpio_set(om_3d7k_pcf, PCF50633_GPO, 0);
++ break;
++ case OM_3D7K_VIB:
++ gpio_direction_output(OM_3D7K_GPIO_VIBRATOR_ON, 0);
++ break;
++ default:
++ break;
++ }
++}
++
++static void om_3d7k_features_pwron_set(enum feature feature, int on)
++{
++ if ((on) && (!feature_info[feature].on))
++ om_3d7k_features_pwron_set_on(feature);
++ else
++ if ((!on) && (feature_info[feature].on))
++ om_3d7k_features_pwron_set_off(feature);
++}
++
++static ssize_t om_3d7k_feature_read(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ int on;
++ int feature = 0;
++ int hit = 0;
++
++ while (!hit && feature < OM_3D7K_FEATURE_COUNT) {
++ if (!strcmp(attr->attr.name, feature_info[feature].name))
++ hit = 1;
++ else
++ feature++;
++ }
++
++ if (!hit)
++ return -EINVAL;
++
++ switch (feature) {
++ case OM_3D7K_USBHOST:
++ on = pcf50633_gpio_get(om_3d7k_pcf, PCF50633_GPO);
++ break;
++ default:
++ on = feature_info[feature].on;
++ }
++
++ *buf++ = '0' + on;
++ *buf++='\n';
++ *buf = '\0';
++
++ return 3;
++}
++
++static ssize_t om_3d7k_feature_write(struct device *dev,
++ struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ int on = !!simple_strtoul(buf, NULL, 10);
++ int feature = 0;
++ int hit = 0;
++
++ while (!hit && feature < OM_3D7K_FEATURE_COUNT) {
++ if (!strcmp(attr->attr.name, feature_info[feature].name))
++ hit = 1;
++ else
++ feature++;
++ }
++
++ if (!hit)
++ return -EINVAL;
++
++ om_3d7k_features_pwron_set(feature, on);
++ feature_info[feature].on = on;
++
++ return count;
++}
++
++
++static DEVICE_ATTR(gsm_power, 0644, om_3d7k_feature_read,
++ om_3d7k_feature_write);
++
++static DEVICE_ATTR(usbhost_power, 0644, om_3d7k_feature_read,
++ om_3d7k_feature_write);
++
++static DEVICE_ATTR(vibrator_power, 0644, om_3d7k_feature_read,
++ om_3d7k_feature_write);
++
++
++static struct attribute *om_3d7k_features_sysfs_entries[] = {
++ &dev_attr_gsm_power.attr,
++ &dev_attr_usbhost_power.attr,
++ &dev_attr_vibrator_power.attr,
++ NULL
++};
++
++
++static struct attribute_group om_3d7k_features_attr_group = {
++ .name = NULL,
++ .attrs = om_3d7k_features_sysfs_entries,
++};
++
++static int __init om_3d7k_features_probe(struct platform_device *pdev)
++{
++ gps_regulator = regulator_get(&pdev->dev, "RF_3V");
++ dev_info(&pdev->dev, "starting\n");
++
++ return sysfs_create_group(&pdev->dev.kobj,
++ &om_3d7k_features_attr_group);
++}
++
++static int om_3d7k_features_remove(struct platform_device *pdev)
++{
++
++ regulator_put(gps_regulator);
++ sysfs_remove_group(&pdev->dev.kobj, &om_3d7k_features_attr_group);
++
++ return 0;
++}
++
++
++#ifdef CONFIG_PM
++static int om_3d7k_features_suspend(struct platform_device *pdev,
++ pm_message_t state)
++{
++ int feature;
++
++ for (feature = 0; feature < OM_3D7K_FEATURE_COUNT; feature++)
++ if (feature_info[feature].depower_on_suspend)
++ om_3d7k_features_pwron_set_off(feature);
++
++ return 0;
++}
++
++static int om_3d7k_features_resume(struct platform_device *pdev)
++{
++ int feature;
++
++ for (feature = 0; feature < OM_3D7K_FEATURE_COUNT; feature++)
++ if (feature_info[feature].depower_on_suspend)
++ if (feature_info[feature].on)
++ om_3d7k_features_pwron_set_on(feature);
++
++ return 0;
++}
++#else
++#define om_3d7k_features_suspend NULL
++#define om_3d7k_features_resume NULL
++#endif
++
++static struct platform_driver om_3d7k_features_driver = {
++ .probe = om_3d7k_features_probe,
++ .remove = om_3d7k_features_remove,
++ .suspend = om_3d7k_features_suspend,
++ .resume = om_3d7k_features_resume,
++ .driver = {
++ .name = "om-3d7k",
++ },
++};
++
++static int __devinit om_3d7k_features_init(void)
++{
++ return platform_driver_register(&om_3d7k_features_driver);
++}
++
++static void om_3d7k_features_exit(void)
++{
++ platform_driver_unregister(&om_3d7k_features_driver);
++}
++
++module_init(om_3d7k_features_init);
++module_exit(om_3d7k_features_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Andy Green <andy@openmoko.com>");
++MODULE_DESCRIPTION("Openmoko OM_3D7K Feature Driver");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6410/setup-sdhci.c linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6410/setup-sdhci.c
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-s3c6410/setup-sdhci.c 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-s3c6410/setup-sdhci.c 2009-05-10 22:27:59.000000000 +0200
+@@ -48,7 +48,8 @@
+ s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
+ }
+
+- s3c_gpio_setpull(S3C64XX_GPG(6), S3C_GPIO_PULL_UP);
++ /* FIXME this needs defining in machine as to if we even have CD */
++ s3c_gpio_setpull(S3C64XX_GPG(6), S3C_GPIO_PULL_DOWN);
+ s3c_gpio_cfgpin(S3C64XX_GPG(6), S3C_GPIO_SFN(2));
+ }
+
+@@ -79,7 +80,7 @@
+ else
+ ctrl3 = (S3C_SDHCI_CTRL3_FCSEL1 | S3C_SDHCI_CTRL3_FCSEL0);
+
+- printk(KERN_INFO "%s: CTRL 2=%08x, 3=%08x\n", __func__, ctrl2, ctrl3);
++ printk(KERN_INFO "%s: %p CTRL 2=%08x, 3=%08x\n", __func__, r, ctrl2, ctrl3);
+ writel(ctrl2, r + S3C_SDHCI_CONTROL2);
+ writel(ctrl3, r + S3C_SDHCI_CONTROL3);
+ }
+@@ -94,9 +95,9 @@
+ /* Set all the necessary GPG pins to special-function 0 */
+ for (gpio = S3C64XX_GPH(0); gpio < end; gpio++) {
+ s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
+- s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
++ s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);
+ }
+
+- s3c_gpio_setpull(S3C64XX_GPG(6), S3C_GPIO_PULL_UP);
+- s3c_gpio_cfgpin(S3C64XX_GPG(6), S3C_GPIO_SFN(3));
++// s3c_gpio_setpull(S3C64XX_GPG(6), S3C_GPIO_PULL_UP);
++// s3c_gpio_cfgpin(S3C64XX_GPG(6), S3C_GPIO_SFN(3));
+ }
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/mach-shark/include/mach/io.h linux-2.6.29-rc3.owrt.om/arch/arm/mach-shark/include/mach/io.h
+--- linux-2.6.29-rc3.owrt/arch/arm/mach-shark/include/mach/io.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/mach-shark/include/mach/io.h 2009-05-10 22:27:59.000000000 +0200
+@@ -14,7 +14,7 @@
+ #define PCIO_BASE 0xe0000000
+ #define IO_SPACE_LIMIT 0xffffffff
+
+-#define __io(a) ((void __iomem *)(PCIO_BASE + (a)))
++#define __io(a) __typesafe_io(PCIO_BASE + (a))
+ #define __mem_pci(addr) (addr)
+
+ #endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/Makefile linux-2.6.29-rc3.owrt.om/arch/arm/Makefile
+--- linux-2.6.29-rc3.owrt/arch/arm/Makefile 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/Makefile 2009-05-10 22:27:59.000000000 +0200
+@@ -55,7 +55,8 @@
+ arch-$(CONFIG_CPU_32v6K) :=-D__LINUX_ARM_ARCH__=6 $(call cc-option,-march=armv6k,-march=armv5t -Wa$(comma)-march=armv6k)
+ endif
+ arch-$(CONFIG_CPU_32v5) :=-D__LINUX_ARM_ARCH__=5 $(call cc-option,-march=armv5te,-march=armv4t)
+-arch-$(CONFIG_CPU_32v4T) :=-D__LINUX_ARM_ARCH__=4 -march=armv4t
++# We can't load armv4t modules, but still need to assemble some armv4t code to be linked in.
++arch-$(CONFIG_CPU_32v4T) :=-D__LINUX_ARM_ARCH__=4 -march=armv4 -Wa,-march=armv4t
+ arch-$(CONFIG_CPU_32v4) :=-D__LINUX_ARM_ARCH__=4 -march=armv4
+ arch-$(CONFIG_CPU_32v3) :=-D__LINUX_ARM_ARCH__=3 -march=armv3
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/dev-camif.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/dev-camif.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/dev-camif.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/dev-camif.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,65 @@
++/* linux/arch/arm/plat-s3c/dev-camif.c
++ *
++ * Copyright 2009 Openmoko, Inc.
++ * Werner Almesberger <werner@openmoko.org>
++ *
++ * based on dev-hsmmc.c which is
++ *
++ * Copyright (c) 2008 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ * http://armlinux.simtec.co.uk/
++ *
++ * S3C series device definition for camera interface devices
++ *
++ * 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.
++*/
++
++#include <linux/kernel.h>
++#include <linux/platform_device.h>
++#include <linux/mmc/host.h>
++
++#include <mach/map.h>
++#include <plat/devs.h>
++#include <plat/cpu.h>
++
++
++#define S3C6400_PA_CAMIF 0x78000000
++#define S3C24XX_SZ_CAMIF (0x1000)
++
++
++static struct resource s3c_camif_resource[] = {
++ [0] = {
++ .start = S3C6400_PA_CAMIF,
++ .end = S3C6400_PA_CAMIF + S3C24XX_SZ_CAMIF - 1,
++ .flags = IORESOURCE_MEM,
++ },
++ [1] = {
++ .start = IRQ_CAMIF_C,
++ .end = IRQ_CAMIF_C,
++ .flags = IORESOURCE_IRQ,
++ },
++ [2] = {
++ .start = IRQ_CAMIF_P,
++ .end = IRQ_CAMIF_P,
++ .flags = IORESOURCE_IRQ,
++ }
++
++};
++
++static u64 s3c_device_camif_dmamask = 0xffffffffUL;
++
++struct platform_device s3c_device_camif = {
++ .name = "s3c-camif",
++ .id = -1,
++ .num_resources = ARRAY_SIZE(s3c_camif_resource),
++ .resource = s3c_camif_resource,
++ .dev = {
++ .dma_mask = &s3c_device_camif_dmamask,
++ .coherent_dma_mask = 0xffffffffUL
++ }
++};
++
++EXPORT_SYMBOL(s3c_device_camif);
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/dev-i2c0.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/dev-i2c0.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/dev-i2c0.c 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/dev-i2c0.c 2009-05-10 22:27:59.000000000 +0200
+@@ -51,8 +51,8 @@
+ .flags = 0,
+ .slave_addr = 0x10,
+ .bus_freq = 100*1000,
+- .max_freq = 400*1000,
+- .sda_delay = S3C2410_IICLC_SDA_DELAY5 | S3C2410_IICLC_FILTER_ON,
++ .max_freq = 100*1000,
++ .sda_delay = S3C2410_IICLC_SDA_DELAY15 | S3C2410_IICLC_FILTER_ON,
+ };
+
+ void __init s3c_i2c0_set_platdata(struct s3c2410_platform_i2c *pd)
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/dev-usb.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/dev-usb.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/dev-usb.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/dev-usb.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,50 @@
++/* linux/arch/arm/plat-s3c/dev-usb.c
++ *
++ * Copyright 2008 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ * http://armlinux.simtec.co.uk/
++ *
++ * S3C series device definition for USB host
++ *
++ * 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.
++*/
++
++#include <linux/kernel.h>
++#include <linux/string.h>
++#include <linux/platform_device.h>
++
++#include <mach/irqs.h>
++#include <mach/map.h>
++
++#include <plat/devs.h>
++
++
++static struct resource s3c_usb_resource[] = {
++ [0] = {
++ .start = S3C_PA_USBHOST,
++ .end = S3C_PA_USBHOST + 0x100 - 1,
++ .flags = IORESOURCE_MEM,
++ },
++ [1] = {
++ .start = IRQ_USBH,
++ .end = IRQ_USBH,
++ .flags = IORESOURCE_IRQ,
++ }
++};
++
++static u64 s3c_device_usb_dmamask = 0xffffffffUL;
++
++struct platform_device s3c_device_usb = {
++ .name = "s3c-ohci",
++ .id = -1,
++ .num_resources = ARRAY_SIZE(s3c_usb_resource),
++ .resource = s3c_usb_resource,
++ .dev = {
++ .dma_mask = &s3c_device_usb_dmamask,
++ .coherent_dma_mask = 0xffffffffUL
++ }
++};
++
++EXPORT_SYMBOL(s3c_device_usb);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/dma.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/dma.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/dma.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/dma.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,86 @@
++/* linux/arch/arm/plat-s3c/dma.c
++ *
++ * Copyright (c) 2003-2005,2006,2009 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ * http://armlinux.simtec.co.uk/
++ *
++ * S3C DMA core
++ *
++ * 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.
++*/
++
++struct s3c2410_dma_buf;
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/errno.h>
++
++#include <mach/dma.h>
++#include <mach/irqs.h>
++
++#include <plat/dma-plat.h>
++
++/* dma channel state information */
++struct s3c2410_dma_chan s3c2410_chans[S3C_DMA_CHANNELS];
++struct s3c2410_dma_chan *s3c_dma_chan_map[DMACH_MAX];
++
++/* s3c_dma_lookup_channel
++ *
++ * change the dma channel number given into a real dma channel id
++*/
++
++struct s3c2410_dma_chan *s3c_dma_lookup_channel(unsigned int channel)
++{
++ if (channel & DMACH_LOW_LEVEL)
++ return &s3c2410_chans[channel & ~DMACH_LOW_LEVEL];
++ else
++ return s3c_dma_chan_map[channel];
++}
++
++/* do we need to protect the settings of the fields from
++ * irq?
++*/
++
++int s3c2410_dma_set_opfn(unsigned int channel, s3c2410_dma_opfn_t rtn)
++{
++ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
++
++ if (chan == NULL)
++ return -EINVAL;
++
++ pr_debug("%s: chan=%p, op rtn=%p\n", __func__, chan, rtn);
++
++ chan->op_fn = rtn;
++
++ return 0;
++}
++EXPORT_SYMBOL(s3c2410_dma_set_opfn);
++
++int s3c2410_dma_set_buffdone_fn(unsigned int channel, s3c2410_dma_cbfn_t rtn)
++{
++ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
++
++ if (chan == NULL)
++ return -EINVAL;
++
++ pr_debug("%s: chan=%p, callback rtn=%p\n", __func__, chan, rtn);
++
++ chan->callback_fn = rtn;
++
++ return 0;
++}
++EXPORT_SYMBOL(s3c2410_dma_set_buffdone_fn);
++
++int s3c2410_dma_setflags(unsigned int channel, unsigned int flags)
++{
++ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
++
++ if (chan == NULL)
++ return -EINVAL;
++
++ chan->flags = flags;
++ return 0;
++}
++EXPORT_SYMBOL(s3c2410_dma_setflags);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/gpio.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/gpio.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/gpio.c 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/gpio.c 2009-05-10 22:27:59.000000000 +0200
+@@ -16,7 +16,7 @@
+ #include <linux/io.h>
+ #include <linux/gpio.h>
+
+-#include <plat/gpio-core.h>
++#include <mach/gpio-core.h>
+
+ #ifdef CONFIG_S3C_GPIO_TRACK
+ struct s3c_gpio_chip *s3c_gpios[S3C_GPIO_END];
+@@ -140,6 +140,15 @@
+ if (!gc->get)
+ gc->get = s3c_gpiolib_get;
+
++#ifdef CONFIG_PM
++ if (chip->pm != NULL) {
++ if (!chip->pm->save || !chip->pm->resume)
++ printk(KERN_ERR "gpio: %s has missing PM functions\n",
++ gc->label);
++ } else
++ printk(KERN_ERR "gpio: %s has no PM function\n", gc->label);
++#endif
++
+ /* gpiochip_add() prints own failure message on error. */
+ ret = gpiochip_add(gc);
+ if (ret >= 0)
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/gpio-config.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/gpio-config.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/gpio-config.c 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/gpio-config.c 2009-05-10 22:27:59.000000000 +0200
+@@ -13,6 +13,7 @@
+ */
+
+ #include <linux/kernel.h>
++#include <linux/module.h>
+ #include <linux/gpio.h>
+ #include <linux/io.h>
+
+@@ -38,6 +39,7 @@
+
+ return ret;
+ }
++EXPORT_SYMBOL(s3c_gpio_cfgpin);
+
+ int s3c_gpio_setpull(unsigned int pin, s3c_gpio_pull_t pull)
+ {
+@@ -56,6 +58,7 @@
+
+ return ret;
+ }
++EXPORT_SYMBOL(s3c_gpio_setpull);
+
+ #ifdef CONFIG_S3C_GPIO_CFG_S3C24XX
+ int s3c_gpio_setcfg_s3c24xx_banka(struct s3c_gpio_chip *chip,
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/mach/cpu.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/mach/cpu.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/mach/cpu.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/mach/cpu.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,165 @@
++/*
++ * arch/arm/plat-s3c/include/mach/cpu.h
++ *
++ * S3C cpu type detection
++ *
++ * Copyright (C) 2008 Samsung Electronics
++ * Kyungmin Park <kyungmin.park@samsung.com>
++ *
++ * Derived from OMAP cpu.h
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ */
++
++#ifndef __ASM_ARCH_S3C_CPU_H
++#define __ASM_ARCH_S3C_CPU_H
++
++extern unsigned int system_rev;
++
++#define S3C_SYSTEM_REV_ATAG (system_rev & 0xffff)
++#define S3C_SYSTEM_REV_CPU (system_rev & 0xffff0000)
++
++/*
++ * cpu_is_s3c24xx(): True for s3c2400, s3c2410, s3c2440 and so on
++ * cpu_is_s3c241x(): True fro s3c2410, s3c2412
++ * cpu_is_s3c244x(): True fro s3c2440, s3c2442, s3c2443
++ * cpu_is_s3c64xx(): True for s3c6400, s3c6410
++ */
++#define GET_S3C_CLASS ((system_rev >> 24) & 0xff)
++
++#define IS_S3C_CLASS(class, id) \
++static inline int is_s3c ##class (void) \
++{ \
++ return (GET_S3C_CLASS == (id)) ? 1 : 0; \
++}
++
++#define GET_S3C_SUBCLASS ((system_rev >> 20) & 0xfff)
++
++#define IS_S3C_SUBCLASS(subclass, id) \
++static inline int is_s3c ##subclass (void) \
++{ \
++ return (GET_S3C_SUBCLASS == (id)) ? 1 : 0; \
++}
++
++IS_S3C_CLASS(24xx, 0x24)
++IS_S3C_CLASS(64xx, 0x64)
++
++IS_S3C_SUBCLASS(241x, 0x241)
++IS_S3C_SUBCLASS(244x, 0x244)
++
++#define cpu_is_s3c24xx() 0
++#define cpu_is_s3c241x() 0
++#define cpu_is_s3c244x() 0
++#define cpu_is_s3c64xx() 0
++
++#if defined(CONFIG_ARCH_S3C2410)
++# undef cpu_is_s3c24xx
++# undef cpu_is_s3c241x
++# undef cpu_is_s3c244x
++# define cpu_is_s3c24xx() is_s3c24xx()
++# define cpu_is_s3c241x() is_s3c241x()
++# define cpu_is_s3c244x() is_s3c244x()
++#endif
++
++#if defined(CONFIG_ARCH_S3C64XX)
++# undef cpu_is_s3c64xx
++# define cpu_is_s3c64xx() is_s3c64xx()
++#endif
++
++/*
++ * Macros to detect individual cpu types.
++ * cpu_is_s3c2410(): True for s3c2410
++ * cpu_is_s3c2440(): True for s3c2440
++ * cpu_is_s3c6400(): True for s3c6400
++ * cpu_is_s3c6410(): True for s3c6410
++ *
++ * Exception:
++ * Store Revision A to 1
++ * s3c2410a -> s3c2411
++ * s3c2440a -> s3c2441
++ */
++
++#define GET_S3C_TYPE ((system_rev >> 16) & 0xffff)
++
++#define IS_S3C_TYPE(type, id) \
++static inline int is_s3c ##type (void) \
++{ \
++ return (GET_S3C_TYPE == (id)) ? 1 : 0; \
++}
++
++IS_S3C_TYPE(2400, 0x2400)
++IS_S3C_TYPE(2410, 0x2410)
++IS_S3C_TYPE(2410a, 0x2411)
++IS_S3C_TYPE(2412, 0x2412)
++IS_S3C_TYPE(2440, 0x2440)
++IS_S3C_TYPE(2440a, 0x2441)
++IS_S3C_TYPE(2442, 0x2442)
++IS_S3C_TYPE(2443, 0x2443)
++IS_S3C_TYPE(6400, 0x6400)
++IS_S3C_TYPE(6410, 0x6410)
++
++#define cpu_is_s3c2400() 0
++#define cpu_is_s3c2410() 0
++#define cpu_is_s3c2410a() 0
++#define cpu_is_s3c2412() 0
++#define cpu_is_s3c2440() 0
++#define cpu_is_s3c2440a() 0
++#define cpu_is_s3c2442() 0
++#define cpu_is_s3c2443() 0
++#define cpu_is_s3c6400() 0
++#define cpu_is_s3c6410() 0
++
++#if defined(CONFIG_ARCH_S3C2410)
++# undef cpu_is_s3c2400
++# define cpu_is_s3c2400() is_s3c2400()
++#endif
++
++#if defined(CONFIG_CPU_S3C2410)
++# undef cpu_is_s3c2410
++# undef cpu_is_s3c2410a
++# define cpu_is_s3c2410() is_s3c2410()
++# define cpu_is_s3c2410a() is_s3c2410a()
++#endif
++
++#if defined(CONFIG_CPU_S3C2412)
++# undef cpu_is_s3c2412
++# define cpu_is_s3c2412() is_s3c2412()
++#endif
++
++#if defined(CONFIG_CPU_S3C2440)
++# undef cpu_is_s3c2440
++# undef cpu_is_s3c2440a
++# define cpu_is_s3c2440() is_s3c2440()
++# define cpu_is_s3c2440a() is_s3c2440a()
++#endif
++
++#if defined(CONFIG_CPU_S3C2442)
++# undef cpu_is_s3c2442
++# define cpu_is_s3c2442() is_s3c2442()
++#endif
++
++#if defined(CONFIG_CPU_S3C2443)
++# undef cpu_is_s3c2443
++# define cpu_is_s3c2443() is_s3c2443()
++#endif
++
++#if defined(CONFIG_ARCH_S3C64XX)
++# undef cpu_is_s3c6400
++# undef cpu_is_s3c6410
++# define cpu_is_s3c6400() is_s3c6400()
++# define cpu_is_s3c6410() is_s3c6410()
++#endif
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/mach/io.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/mach/io.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/mach/io.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/mach/io.h 2009-05-10 22:27:59.000000000 +0200
+@@ -10,6 +10,7 @@
+ #define __ASM_ARM_ARCH_IO_H
+
+ /* No current ISA/PCI bus support. */
++
+ #define __io(a) __typesafe_io(a)
+ #define __mem_pci(a) (a)
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/audio.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/audio.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/audio.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/audio.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,45 @@
++/* arch/arm/mach-s3c2410/include/mach/audio.h
++ *
++ * Copyright (c) 2004-2005 Simtec Electronics
++ * http://www.simtec.co.uk/products/SWLINUX/
++ * Ben Dooks <ben@simtec.co.uk>
++ *
++ * S3C24XX - Audio platfrom_device info
++ *
++ * 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.
++*/
++
++#ifndef __ASM_ARCH_AUDIO_H
++#define __ASM_ARCH_AUDIO_H __FILE__
++
++/* struct s3c24xx_iis_ops
++ *
++ * called from the s3c24xx audio core to deal with the architecture
++ * or the codec's setup and control.
++ *
++ * the pointer to itself is passed through in case the caller wants to
++ * embed this in an larger structure for easy reference to it's context.
++*/
++
++struct s3c24xx_iis_ops {
++ struct module *owner;
++
++ int (*startup)(struct s3c24xx_iis_ops *me);
++ void (*shutdown)(struct s3c24xx_iis_ops *me);
++ int (*suspend)(struct s3c24xx_iis_ops *me);
++ int (*resume)(struct s3c24xx_iis_ops *me);
++
++ int (*open)(struct s3c24xx_iis_ops *me, struct snd_pcm_substream *strm);
++ int (*close)(struct s3c24xx_iis_ops *me, struct snd_pcm_substream *strm);
++ int (*prepare)(struct s3c24xx_iis_ops *me, struct snd_pcm_substream *strm, struct snd_pcm_runtime *rt);
++};
++
++struct s3c24xx_platdata_iis {
++ const char *codec_clk;
++ struct s3c24xx_iis_ops *ops;
++ int (*match_dev)(struct device *dev);
++};
++
++#endif /* __ASM_ARCH_AUDIO_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/clock.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/clock.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/clock.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/clock.h 2009-05-10 22:27:59.000000000 +0200
+@@ -50,6 +50,7 @@
+ extern struct clk clk_ext;
+
+ /* S3C64XX specific clocks */
++extern struct clk clk_h2;
+ extern struct clk clk_27m;
+ extern struct clk clk_48m;
+
+@@ -80,6 +81,7 @@
+
+ /* S3C64XX specific functions and clocks */
+
++extern int s3c64xx_hclk_ctrl(struct clk *clk, int enable);
+ extern int s3c64xx_sclk_ctrl(struct clk *clk, int enable);
+
+ /* Init for pwm clock code */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/cpu.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/cpu.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/cpu.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/cpu.h 2009-05-10 22:27:59.000000000 +0200
+@@ -69,3 +69,6 @@
+ extern struct sysdev_class s3c2440_sysclass;
+ extern struct sysdev_class s3c2442_sysclass;
+ extern struct sysdev_class s3c2443_sysclass;
++extern struct sysdev_class s3c6410_sysclass;
++extern struct sysdev_class s3c64xx_sysclass;
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/devs.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/devs.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/devs.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/devs.h 2009-05-10 22:27:59.000000000 +0200
+@@ -16,6 +16,10 @@
+ unsigned long nr_resources;
+ };
+
++struct s3c_plat_otg_data {
++ int phyclk;
++};
++
+ extern struct s3c24xx_uart_resources s3c2410_uart_resources[];
+ extern struct s3c24xx_uart_resources s3c64xx_uart_resources[];
+
+@@ -45,10 +49,11 @@
+
+ extern struct platform_device s3c_device_usbgadget;
+
++extern struct platform_device s3c_device_ts;
++
+ /* s3c2440 specific devices */
+
+ #ifdef CONFIG_CPU_S3C2440
+
+ extern struct platform_device s3c_device_camif;
+-
+ #endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/dma-core.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/dma-core.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/dma-core.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/dma-core.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,22 @@
++/* arch/arm/plat-s3c/include/plat/dma.h
++ *
++ * Copyright 2008 Openmoko, Inc.
++ * Copyright 2008 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ * http://armlinux.simtec.co.uk/
++ *
++ * Samsung S3C DMA core support
++ *
++ * 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.
++*/
++
++extern struct s3c2410_dma_chan *s3c_dma_lookup_channel(unsigned int channel);
++
++extern struct s3c2410_dma_chan *s3c_dma_chan_map[];
++
++/* the currently allocated channel information */
++extern struct s3c2410_dma_chan s3c2410_chans[];
++
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/dma.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/dma.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/dma.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/dma.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,128 @@
++/* arch/arm/plat-s3c/include/plat/dma.h
++ *
++ * Copyright (C) 2003,2004,2006 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ *
++ * Samsung S3C DMA support
++ *
++ * 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.
++*/
++
++enum s3c2410_dma_buffresult {
++ S3C2410_RES_OK,
++ S3C2410_RES_ERR,
++ S3C2410_RES_ABORT
++};
++
++enum s3c2410_dmasrc {
++ S3C2410_DMASRC_HW, /* source is memory */
++ S3C2410_DMASRC_MEM /* source is hardware */
++};
++
++/* enum s3c2410_chan_op
++ *
++ * operation codes passed to the DMA code by the user, and also used
++ * to inform the current channel owner of any changes to the system state
++*/
++
++enum s3c2410_chan_op {
++ S3C2410_DMAOP_START,
++ S3C2410_DMAOP_STOP,
++ S3C2410_DMAOP_PAUSE,
++ S3C2410_DMAOP_RESUME,
++ S3C2410_DMAOP_FLUSH,
++ S3C2410_DMAOP_TIMEOUT, /* internal signal to handler */
++ S3C2410_DMAOP_STARTED, /* indicate channel started */
++};
++
++struct s3c2410_dma_client {
++ char *name;
++};
++
++struct s3c2410_dma_chan;
++
++/* s3c2410_dma_cbfn_t
++ *
++ * buffer callback routine type
++*/
++
++typedef void (*s3c2410_dma_cbfn_t)(struct s3c2410_dma_chan *,
++ void *buf, int size,
++ enum s3c2410_dma_buffresult result);
++
++typedef int (*s3c2410_dma_opfn_t)(struct s3c2410_dma_chan *,
++ enum s3c2410_chan_op );
++
++
++
++/* s3c2410_dma_request
++ *
++ * request a dma channel exclusivley
++*/
++
++extern int s3c2410_dma_request(unsigned int channel,
++ struct s3c2410_dma_client *, void *dev);
++
++
++/* s3c2410_dma_ctrl
++ *
++ * change the state of the dma channel
++*/
++
++extern int s3c2410_dma_ctrl(unsigned int channel, enum s3c2410_chan_op op);
++
++/* s3c2410_dma_setflags
++ *
++ * set the channel's flags to a given state
++*/
++
++extern int s3c2410_dma_setflags(unsigned int channel,
++ unsigned int flags);
++
++/* s3c2410_dma_free
++ *
++ * free the dma channel (will also abort any outstanding operations)
++*/
++
++extern int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *);
++
++/* s3c2410_dma_enqueue
++ *
++ * place the given buffer onto the queue of operations for the channel.
++ * The buffer must be allocated from dma coherent memory, or the Dcache/WB
++ * drained before the buffer is given to the DMA system.
++*/
++
++extern int s3c2410_dma_enqueue(unsigned int channel, void *id,
++ dma_addr_t data, int size);
++
++
++/* s3c2410_dma_config
++ *
++ * configure the dma channel
++*/
++
++extern int s3c2410_dma_config(unsigned int channel, int xferunit);
++
++/* s3c2410_dma_devconfig
++ *
++ * configure the device we're talking to
++*/
++
++extern int s3c2410_dma_devconfig(int channel, enum s3c2410_dmasrc source,
++ unsigned long devaddr);
++
++/* s3c2410_dma_getposition
++ *
++ * get the position that the dma transfer is currently at
++*/
++
++extern int s3c2410_dma_getposition(unsigned int channel,
++ dma_addr_t *src, dma_addr_t *dest);
++
++extern int s3c2410_dma_set_opfn(unsigned int, s3c2410_dma_opfn_t rtn);
++extern int s3c2410_dma_set_buffdone_fn(unsigned int, s3c2410_dma_cbfn_t rtn);
++
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/gpio-core.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/gpio-core.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/gpio-core.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/gpio-core.h 2009-05-10 22:27:59.000000000 +0200
+@@ -20,6 +20,19 @@
+ * specific code.
+ */
+
++struct s3c_gpio_chip;
++
++/**
++ * struct s3c_gpio_pm - power management (suspend/resume) information
++ * @save: Routine to save the state of the GPIO block
++ * @resume: Routine to resume the GPIO block.
++ */
++struct s3c_gpio_pm {
++ void (*save)(struct s3c_gpio_chip *chip);
++ void (*resume)(struct s3c_gpio_chip *chip);
++};
++
++
+ struct s3c_gpio_cfg;
+
+ /**
+@@ -27,6 +40,7 @@
+ * @chip: The chip structure to be exported via gpiolib.
+ * @base: The base pointer to the gpio configuration registers.
+ * @config: special function and pull-resistor control information.
++ * @pm_save: Save information for suspend/resume support.
+ *
+ * This wrapper provides the necessary information for the Samsung
+ * specific gpios being registered with gpiolib.
+@@ -34,7 +48,11 @@
+ struct s3c_gpio_chip {
+ struct gpio_chip chip;
+ struct s3c_gpio_cfg *config;
++ struct s3c_gpio_pm *pm;
+ void __iomem *base;
++#ifdef CONFIG_PM
++ u32 pm_save[4];
++#endif
+ };
+
+ static inline struct s3c_gpio_chip *to_s3c_gpio(struct gpio_chip *gpc)
+@@ -75,3 +93,16 @@
+
+ static inline void s3c_gpiolib_track(struct s3c_gpio_chip *chip) { }
+ #endif
++
++#ifdef CONFIG_PM
++extern struct s3c_gpio_pm s3c_gpio_pm_1bit;
++extern struct s3c_gpio_pm s3c_gpio_pm_2bit;
++extern struct s3c_gpio_pm s3c_gpio_pm_4bit;
++#define __gpio_pm(x) x
++#else
++#define s3c_gpio_pm_1bit NULL
++#define s3c_gpio_pm_2bit NULL
++#define s3c_gpio_pm_4bit NULL
++#define __gpio_pm(x) NULL
++
++#endif /* CONFIG_PM */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/map-base.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/map-base.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/map-base.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/map-base.h 2009-05-10 22:27:59.000000000 +0200
+@@ -36,5 +36,7 @@
+ #define S3C_VA_TIMER S3C_ADDR(0x00300000) /* timer block */
+ #define S3C_VA_WATCHDOG S3C_ADDR(0x00400000) /* watchdog */
+ #define S3C_VA_UART S3C_ADDR(0x01000000) /* UART */
++#define S3C_VA_OTG S3C_ADDR(0x03900000) /* OTG */
++#define S3C_VA_OTGSFR S3C_ADDR(0x03a00000) /* OTGSFR */
+
+ #endif /* __ASM_PLAT_MAP_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/nand.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/nand.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/nand.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/nand.h 2009-05-10 22:27:59.000000000 +0200
+@@ -21,11 +21,14 @@
+ * partitions = mtd partition list
+ */
+
++#define S3C2410_NAND_BBT 0x0001
++
+ struct s3c2410_nand_set {
+ unsigned int disable_ecc : 1;
+
+ int nr_chips;
+ int nr_partitions;
++ unsigned int flags;
+ char *name;
+ int *nr_map;
+ struct mtd_partition *partitions;
+@@ -44,6 +47,9 @@
+ int nr_sets;
+ struct s3c2410_nand_set *sets;
+
++ /* force software_ecc at runtime */
++ int software_ecc;
++
+ void (*select_chip)(struct s3c2410_nand_set *,
+ int chip);
+ };
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/pm.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/pm.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/pm.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/pm.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,184 @@
++/* linux/include/asm-arm/plat-s3c24xx/pm.h
++ *
++ * Copyright (c) 2004 Simtec Electronics
++ * http://armlinux.simtec.co.uk/
++ * Written by Ben Dooks, <ben@simtec.co.uk>
++ *
++ * 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.
++*/
++
++#include <linux/sysdev.h>
++
++/* s3c_pm_init
++ *
++ * called from board at initialisation time to setup the power
++ * management
++*/
++
++#ifdef CONFIG_PM
++
++extern __init int s3c_pm_init(void);
++
++#else
++
++static inline int s3c_pm_init(void)
++{
++ return 0;
++}
++#endif
++
++/* configuration for the IRQ mask over sleep */
++extern unsigned long s3c_irqwake_intmask;
++extern unsigned long s3c_irqwake_eintmask;
++
++/* IRQ masks for IRQs allowed to go to sleep (see irq.c) */
++extern unsigned long s3c_irqwake_intallow;
++extern unsigned long s3c_irqwake_eintallow;
++
++/* per-cpu sleep functions */
++
++extern void (*pm_cpu_prep)(void);
++extern void (*pm_cpu_sleep)(void);
++
++/* Flags for PM Control */
++
++extern unsigned long s3c_pm_flags;
++
++extern unsigned char pm_uart_udivslot; /* true to save UART UDIVSLOT */
++
++/* from sleep.S */
++
++extern int s3c_cpu_save(unsigned long *saveblk);
++extern void s3c_cpu_resume(void);
++
++extern void s3c2410_cpu_suspend(void);
++
++extern unsigned long s3c_sleep_save_phys;
++
++/* sleep save info */
++
++/**
++ * struct sleep_save - save information for shared peripherals.
++ * @reg: Pointer to the register to save.
++ * @val: Holder for the value saved from reg.
++ *
++ * This describes a list of registers which is used by the pm core and
++ * other subsystem to save and restore register values over suspend.
++ */
++struct sleep_save {
++ void __iomem *reg;
++ unsigned long val;
++};
++
++#define SAVE_ITEM(x) \
++ { .reg = (x) }
++
++/**
++ * struct pm_uart_save - save block for core UART
++ * @ulcon: Save value for S3C2410_ULCON
++ * @ucon: Save value for S3C2410_UCON
++ * @ufcon: Save value for S3C2410_UFCON
++ * @umcon: Save value for S3C2410_UMCON
++ * @ubrdiv: Save value for S3C2410_UBRDIV
++ *
++ * Save block for UART registers to be held over sleep and restored if they
++ * are needed (say by debug).
++*/
++struct pm_uart_save {
++ u32 ulcon;
++ u32 ucon;
++ u32 ufcon;
++ u32 umcon;
++ u32 ubrdiv;
++ u32 udivslot;
++};
++
++/* helper functions to save/restore lists of registers. */
++
++extern void s3c_pm_do_save(struct sleep_save *ptr, int count);
++extern void s3c_pm_do_restore(struct sleep_save *ptr, int count);
++extern void s3c_pm_do_restore_core(struct sleep_save *ptr, int count);
++
++#ifdef CONFIG_PM
++extern int s3c_irqext_wake(unsigned int irqno, unsigned int state);
++extern int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state);
++extern int s3c24xx_irq_resume(struct sys_device *dev);
++#else
++#define s3c_irqext_wake NULL
++#define s3c24xx_irq_suspend NULL
++#define s3c24xx_irq_resume NULL
++#endif
++
++/* PM debug functions */
++
++#ifdef CONFIG_S3C2410_PM_DEBUG
++/**
++ * s3c_pm_dbg() - low level debug function for use in suspend/resume.
++ * @msg: The message to print.
++ *
++ * This function is used mainly to debug the resume process before the system
++ * can rely on printk/console output. It uses the low-level debugging output
++ * routine printascii() to do its work.
++ */
++extern void s3c_pm_dbg(const char *msg, ...);
++
++#define S3C_PMDBG(fmt...) s3c_pm_dbg(fmt)
++#else
++#define S3C_PMDBG(fmt...) printk(KERN_DEBUG fmt)
++#endif
++
++#ifdef CONFIG_S3C_PM_DEBUG_LED_SMDK
++/**
++ * s3c_pm_debug_smdkled() - Debug PM suspend/resume via SMDK Board LEDs
++ * @set: set bits for the state of the LEDs
++ * @clear: clear bits for the state of the LEDs.
++ */
++extern void s3c_pm_debug_smdkled(u32 set, u32 clear);
++
++#else
++static inline void s3c_pm_debug_smdkled(u32 set, u32 clear) { }
++#endif /* CONFIG_S3C_PM_DEBUG_LED_SMDK */
++
++/* suspend memory checking */
++
++#ifdef CONFIG_S3C2410_PM_CHECK
++extern void s3c_pm_check_prepare(void);
++extern void s3c_pm_check_restore(void);
++extern void s3c_pm_check_cleanup(void);
++extern void s3c_pm_check_store(void);
++#else
++#define s3c_pm_check_prepare() do { } while(0)
++#define s3c_pm_check_restore() do { } while(0)
++#define s3c_pm_check_cleanup() do { } while(0)
++#define s3c_pm_check_store() do { } while(0)
++#endif
++
++/**
++ * s3c_pm_configure_extint() - ensure pins are correctly set for IRQ
++ *
++ * Setup all the necessary GPIO pins for waking the system on external
++ * interrupt.
++ */
++extern void s3c_pm_configure_extint(void);
++
++/**
++ * s3c_pm_restore_gpios() - restore the state of the gpios after sleep.
++ *
++ * Restore the state of the GPIO pins after sleep, which may involve ensuring
++ * that we do not glitch the state of the pins from that the bootloader's
++ * resume code has done.
++*/
++extern void s3c_pm_restore_gpios(void);
++
++/**
++ * s3c_pm_save_gpios() - save the state of the GPIOs for restoring after sleep.
++ *
++ * Save the GPIO states for resotration on resume. See s3c_pm_restore_gpios().
++ */
++extern void s3c_pm_save_gpios(void);
++
++extern void s3c_pm_save_core(void);
++extern void s3c_pm_restore_core(void);
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/pwm.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/pwm.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/pwm.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/pwm.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,45 @@
++#ifndef __S3C2410_PWM_H
++#define __S3C2410_PWM_H
++
++#include <linux/err.h>
++#include <linux/platform_device.h>
++#include <linux/clk.h>
++
++#include <mach/io.h>
++#include <mach/hardware.h>
++#include <asm/mach-types.h>
++#include <plat/regs-timer.h>
++
++enum pwm_timer {
++ PWM0,
++ PWM1,
++ PWM2,
++ PWM3,
++ PWM4
++};
++
++struct s3c2410_pwm {
++ enum pwm_timer timerid;
++ struct clk *pclk;
++ unsigned long pclk_rate;
++ unsigned long prescaler;
++ unsigned long divider;
++ unsigned long counter;
++ unsigned long comparer;
++};
++
++struct s3c24xx_pwm_platform_data{
++ /* callback to attach platform children (to enforce suspend / resume
++ * ordering */
++ void (*attach_child_devices)(struct device *parent_device);
++};
++
++int s3c2410_pwm_init(struct s3c2410_pwm *s3c2410_pwm);
++int s3c2410_pwm_enable(struct s3c2410_pwm *s3c2410_pwm);
++int s3c2410_pwm_disable(struct s3c2410_pwm *s3c2410_pwm);
++int s3c2410_pwm_start(struct s3c2410_pwm *s3c2410_pwm);
++int s3c2410_pwm_stop(struct s3c2410_pwm *s3c2410_pwm);
++int s3c2410_pwm_duty_cycle(int reg_value, struct s3c2410_pwm *s3c2410_pwm);
++int s3c2410_pwm_dumpregs(void);
++
++#endif /* __S3C2410_PWM_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/regs-s3c2412-iis.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/regs-s3c2412-iis.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/regs-s3c2412-iis.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/regs-s3c2412-iis.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,75 @@
++/* linux/include/asm-arm/plat-s3c24xx/regs-s3c2412-iis.h
++ *
++ * Copyright 2007 Simtec Electronics <linux@simtec.co.uk>
++ * http://armlinux.simtec.co.uk/
++ *
++ * 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.
++ *
++ * S3C2412 IIS register definition
++*/
++
++#ifndef __ASM_ARCH_REGS_S3C2412_IIS_H
++#define __ASM_ARCH_REGS_S3C2412_IIS_H
++
++#define S3C2412_IISCON (0x00)
++#define S3C2412_IISMOD (0x04)
++#define S3C2412_IISFIC (0x08)
++#define S3C2412_IISPSR (0x0C)
++#define S3C2412_IISTXD (0x10)
++#define S3C2412_IISRXD (0x14)
++
++#define S3C2412_IISCON_LRINDEX (1 << 11)
++#define S3C2412_IISCON_TXFIFO_EMPTY (1 << 10)
++#define S3C2412_IISCON_RXFIFO_EMPTY (1 << 9)
++#define S3C2412_IISCON_TXFIFO_FULL (1 << 8)
++#define S3C2412_IISCON_RXFIFO_FULL (1 << 7)
++#define S3C2412_IISCON_TXDMA_PAUSE (1 << 6)
++#define S3C2412_IISCON_RXDMA_PAUSE (1 << 5)
++#define S3C2412_IISCON_TXCH_PAUSE (1 << 4)
++#define S3C2412_IISCON_RXCH_PAUSE (1 << 3)
++#define S3C2412_IISCON_TXDMA_ACTIVE (1 << 2)
++#define S3C2412_IISCON_RXDMA_ACTIVE (1 << 1)
++#define S3C2412_IISCON_IIS_ACTIVE (1 << 0)
++
++#define S3C64XX_IISMOD_IMS_PCLK (0 << 10)
++#define S3C64XX_IISMOD_IMS_SYSMUX (1 << 10)
++
++#define S3C2412_IISMOD_MASTER_INTERNAL (0 << 10)
++#define S3C2412_IISMOD_MASTER_EXTERNAL (1 << 10)
++#define S3C2412_IISMOD_SLAVE (2 << 10)
++#define S3C2412_IISMOD_MASTER_MASK (3 << 10)
++#define S3C2412_IISMOD_MODE_TXONLY (0 << 8)
++#define S3C2412_IISMOD_MODE_RXONLY (1 << 8)
++#define S3C2412_IISMOD_MODE_TXRX (2 << 8)
++#define S3C2412_IISMOD_MODE_MASK (3 << 8)
++#define S3C2412_IISMOD_LR_LLOW (0 << 7)
++#define S3C2412_IISMOD_LR_RLOW (1 << 7)
++#define S3C2412_IISMOD_SDF_IIS (0 << 5)
++#define S3C2412_IISMOD_SDF_MSB (1 << 5)
++#define S3C2412_IISMOD_SDF_LSB (2 << 5)
++#define S3C2412_IISMOD_SDF_MASK (3 << 5)
++#define S3C2412_IISMOD_RCLK_256FS (0 << 3)
++#define S3C2412_IISMOD_RCLK_512FS (1 << 3)
++#define S3C2412_IISMOD_RCLK_384FS (2 << 3)
++#define S3C2412_IISMOD_RCLK_768FS (3 << 3)
++#define S3C2412_IISMOD_RCLK_MASK (3 << 3)
++#define S3C2412_IISMOD_BCLK_32FS (0 << 1)
++#define S3C2412_IISMOD_BCLK_48FS (1 << 1)
++#define S3C2412_IISMOD_BCLK_16FS (2 << 1)
++#define S3C2412_IISMOD_BCLK_24FS (3 << 1)
++#define S3C2412_IISMOD_BCLK_MASK (3 << 1)
++#define S3C2412_IISMOD_8BIT (1 << 0)
++
++#define S3C2412_IISPSR_PSREN (1 << 15)
++
++#define S3C2412_IISFIC_TXFLUSH (1 << 15)
++#define S3C2412_IISFIC_RXFLUSH (1 << 7)
++#define S3C2412_IISFIC_TXCOUNT(x) (((x) >> 8) & 0xf)
++#define S3C2412_IISFIC_RXCOUNT(x) (((x) >> 0) & 0xf)
++
++
++
++#endif /* __ASM_ARCH_REGS_S3C2412_IIS_H */
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/regs-serial.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/regs-serial.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/regs-serial.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/regs-serial.h 2009-05-10 22:27:59.000000000 +0200
+@@ -189,6 +189,11 @@
+
+ #define S3C2443_DIVSLOT (0x2C)
+
++/* S3C64XX interrupt registers. */
++#define S3C64XX_UINTP 0x30
++#define S3C64XX_UINTSP 0x34
++#define S3C64XX_UINTM 0x38
++
+ #ifndef __ASSEMBLY__
+
+ /* struct s3c24xx_uart_clksrc
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/regs-timer.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/regs-timer.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/regs-timer.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/regs-timer.h 2009-05-10 22:27:59.000000000 +0200
+@@ -10,6 +10,8 @@
+ * S3C2410 Timer configuration
+ */
+
++#include <plat/map-base.h>
++
+ #ifndef __ASM_ARCH_REGS_TIMER_H
+ #define __ASM_ARCH_REGS_TIMER_H
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/regs-usb-hs-otg.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/regs-usb-hs-otg.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/regs-usb-hs-otg.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/regs-usb-hs-otg.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,360 @@
++/* linux/include/asm-arm/arch-s3c2410/regs-udc.h
++ *
++ * Copyright (C) 2008 Samsung Electronics
++ * Copyright (C) 2004 Herbert Poetzl <herbert@13thfloor.at>
++ *
++ * This include file is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++*/
++
++#ifndef __ASM_ARCH_REGS_USB_HS_OTG_H
++#define __ASM_ARCH_REGS_USB_HS_OTG_H
++
++/* USB2.0 OTG Controller register */
++#define S3C_USBOTG_PHYREG(x) ((x) + 0x100000 /* S3C64XX_VA_OTGSFR */)
++#define S3C_USBOTG_PHYPWR S3C_USBOTG_PHYREG(0x0)
++#define S3C_USBOTG_PHYCLK S3C_USBOTG_PHYREG(0x4)
++#define S3C_USBOTG_RSTCON S3C_USBOTG_PHYREG(0x8)
++
++/* USB2.0 OTG Controller register */
++/* Core Global Registers */
++#define S3C_USBOTGREG(x) ((x) /*+ S3C64XX_VA_OTG */)
++/* OTG Control & Status */
++#define S3C_UDC_OTG_GOTGCTL S3C_USBOTGREG(0x000)
++/* OTG Interrupt */
++#define S3C_UDC_OTG_GOTGINT S3C_USBOTGREG(0x004)
++/* Core AHB Configuration */
++#define S3C_UDC_OTG_GAHBCFG S3C_USBOTGREG(0x008)
++/* Core USB Configuration */
++#define S3C_UDC_OTG_GUSBCFG S3C_USBOTGREG(0x00C)
++/* Core Reset */
++#define S3C_UDC_OTG_GRSTCTL S3C_USBOTGREG(0x010)
++/* Core Interrupt */
++#define S3C_UDC_OTG_GINTSTS S3C_USBOTGREG(0x014)
++/* Core Interrupt Mask */
++#define S3C_UDC_OTG_GINTMSK S3C_USBOTGREG(0x018)
++/* Receive Status Debug Read/Status Read */
++#define S3C_UDC_OTG_GRXSTSR S3C_USBOTGREG(0x01C)
++/* Receive Status Debug Pop/Status Pop */
++#define S3C_UDC_OTG_GRXSTSP S3C_USBOTGREG(0x020)
++/* Receive FIFO Size */
++#define S3C_UDC_OTG_GRXFSIZ S3C_USBOTGREG(0x024)
++/* Non-Periodic Transmit FIFO Size */
++#define S3C_UDC_OTG_GNPTXFSIZ S3C_USBOTGREG(0x028)
++/* Non-Periodic Transmit FIFO/Queue Status */
++#define S3C_UDC_OTG_GNPTXSTS S3C_USBOTGREG(0x02C)
++
++/* Host Periodic Transmit FIFO Size */
++#define S3C_UDC_OTG_HPTXFSIZ S3C_USBOTGREG(0x100)
++/* Device Periodic Transmit FIFO-1 Size */
++#define S3C_UDC_OTG_DPTXFSIZ1 S3C_USBOTGREG(0x104)
++/* Device Periodic Transmit FIFO-2 Size */
++#define S3C_UDC_OTG_DPTXFSIZ2 S3C_USBOTGREG(0x108)
++/* Device Periodic Transmit FIFO-3 Size */
++#define S3C_UDC_OTG_DPTXFSIZ3 S3C_USBOTGREG(0x10C)
++/* Device Periodic Transmit FIFO-4 Size */
++#define S3C_UDC_OTG_DPTXFSIZ4 S3C_USBOTGREG(0x110)
++/* Device Periodic Transmit FIFO-5 Size */
++#define S3C_UDC_OTG_DPTXFSIZ5 S3C_USBOTGREG(0x114)
++/* Device Periodic Transmit FIFO-6 Size */
++#define S3C_UDC_OTG_DPTXFSIZ6 S3C_USBOTGREG(0x118)
++/* Device Periodic Transmit FIFO-7 Size */
++#define S3C_UDC_OTG_DPTXFSIZ7 S3C_USBOTGREG(0x11C)
++/* Device Periodic Transmit FIFO-8 Size */
++#define S3C_UDC_OTG_DPTXFSIZ8 S3C_USBOTGREG(0x120)
++/* Device Periodic Transmit FIFO-9 Size */
++#define S3C_UDC_OTG_DPTXFSIZ9 S3C_USBOTGREG(0x124)
++/* Device Periodic Transmit FIFO-10 Size */
++#define S3C_UDC_OTG_DPTXFSIZ10 S3C_USBOTGREG(0x128)
++/* Device Periodic Transmit FIFO-11 Size */
++#define S3C_UDC_OTG_DPTXFSIZ11 S3C_USBOTGREG(0x12C)
++/* Device Periodic Transmit FIFO-12 Size */
++#define S3C_UDC_OTG_DPTXFSIZ12 S3C_USBOTGREG(0x130)
++/* Device Periodic Transmit FIFO-13 Size */
++#define S3C_UDC_OTG_DPTXFSIZ13 S3C_USBOTGREG(0x134)
++/* Device Periodic Transmit FIFO-14 Size */
++#define S3C_UDC_OTG_DPTXFSIZ14 S3C_USBOTGREG(0x138)
++/* Device Periodic Transmit FIFO-15 Size */
++#define S3C_UDC_OTG_DPTXFSIZ15 S3C_USBOTGREG(0x13C)
++
++/* Host Mode Registers
++ * Host Global Registers */
++/* Host Configuration */
++#define S3C_UDC_OTG_HCFG S3C_USBOTGREG(0x400)
++/* Host Frame Interval */
++#define S3C_UDC_OTG_HFIR S3C_USBOTGREG(0x404)
++/* Host Frame Number/Frame Time Remaining */
++#define S3C_UDC_OTG_HFNUM S3C_USBOTGREG(0x408)
++/* Host Periodic Transmit FIFO/Queue Status */
++#define S3C_UDC_OTG_HPTXSTS S3C_USBOTGREG(0x410)
++/* Host All Channels Interrupt */
++#define S3C_UDC_OTG_HAINT S3C_USBOTGREG(0x414)
++/* Host All Channels Interrupt Mask */
++#define S3C_UDC_OTG_HAINTMSK S3C_USBOTGREG(0x418)
++
++/* Host Port Control & Status Registers */
++#define S3C_UDC_OTG_HPRT S3C_USBOTGREG(0x440)
++
++/* Host Channel-Specific Registers */
++/* Host Channel-0 Characteristics */
++#define S3C_UDC_OTG_HCCHAR0 S3C_USBOTGREG(0x500)
++/* Host Channel-0 Split Control */
++#define S3C_UDC_OTG_HCSPLT0 S3C_USBOTGREG(0x504)
++/* Host Channel-0 Interrupt */
++#define S3C_UDC_OTG_HCINT0 S3C_USBOTGREG(0x508)
++/* Host Channel-0 Interrupt Mask */
++#define S3C_UDC_OTG_HCINTMSK0 S3C_USBOTGREG(0x50C)
++/* Host Channel-0 Transfer Size */
++#define S3C_UDC_OTG_HCTSIZ0 S3C_USBOTGREG(0x510)
++/* Host Channel-0 DMA Address */
++#define S3C_UDC_OTG_HCDMA0 S3C_USBOTGREG(0x514)
++
++/* Device Mode Registers
++ * Device Global Registers */
++/* Device Configuration */
++#define S3C_UDC_OTG_DCFG S3C_USBOTGREG(0x800)
++/* Device Control */
++#define S3C_UDC_OTG_DCTL S3C_USBOTGREG(0x804)
++/* Device Status */
++#define S3C_UDC_OTG_DSTS S3C_USBOTGREG(0x808)
++/* Device IN Endpoint Common Interrupt Mask */
++#define S3C_UDC_OTG_DIEPMSK S3C_USBOTGREG(0x810)
++/* Device OUT Endpoint Common Interrupt Mask */
++#define S3C_UDC_OTG_DOEPMSK S3C_USBOTGREG(0x814)
++/* Device All Endpoints Interrupt */
++#define S3C_UDC_OTG_DAINT S3C_USBOTGREG(0x818)
++/* Device All Endpoints Interrupt Mask */
++#define S3C_UDC_OTG_DAINTMSK S3C_USBOTGREG(0x81C)
++/* Device IN Token Sequence Learning Queue Read 1 */
++#define S3C_UDC_OTG_DTKNQR1 S3C_USBOTGREG(0x820)
++/* Device IN Token Sequence Learning Queue Read 2 */
++#define S3C_UDC_OTG_DTKNQR2 S3C_USBOTGREG(0x824)
++/* Device VBUS Discharge Time */
++#define S3C_UDC_OTG_DVBUSDIS S3C_USBOTGREG(0x828)
++/* Device VBUS Pulsing Time */
++#define S3C_UDC_OTG_DVBUSPULSE S3C_USBOTGREG(0x82C)
++/* Device IN Token Sequence Learning Queue Read 3 */
++#define S3C_UDC_OTG_DTKNQR3 S3C_USBOTGREG(0x830)
++/* Device IN Token Sequence Learning Queue Read 4 */
++#define S3C_UDC_OTG_DTKNQR4 S3C_USBOTGREG(0x834)
++
++/* Device Logical IN Endpoint-Specific Registers */
++/* Device IN Endpoint 0 Control */
++#define S3C_UDC_OTG_DIEPCTL0 S3C_USBOTGREG(0x900)
++/* Device IN Endpoint 0 Interrupt */
++#define S3C_UDC_OTG_DIEPINT0 S3C_USBOTGREG(0x908)
++/* Device IN Endpoint 0 Transfer Size */
++#define S3C_UDC_OTG_DIEPTSIZ0 S3C_USBOTGREG(0x910)
++/* Device IN Endpoint 0 DMA Address */
++#define S3C_UDC_OTG_DIEPDMA0 S3C_USBOTGREG(0x914)
++
++/* Device IN Endpoint 2 Control */
++#define S3C_UDC_OTG_DIEPCTL2 S3C_USBOTGREG(0x940)
++/* Device IN Endpoint 2 Interrupt */
++#define S3C_UDC_OTG_DIEPINT2 S3C_USBOTGREG(0x948)
++/* Device IN Endpoint 2 Transfer Size */
++#define S3C_UDC_OTG_DIEPTSIZ2 S3C_USBOTGREG(0x950)
++/* Device IN Endpoint 2 DMA Address */
++#define S3C_UDC_OTG_DIEPDMA2 S3C_USBOTGREG(0x954)
++
++/* Device IN Endpoint 3 Control */
++#define S3C_UDC_OTG_DIEPCTL3 S3C_USBOTGREG(0x960)
++/* Device IN Endpoint 3 Interrupt */
++#define S3C_UDC_OTG_DIEPINT3 S3C_USBOTGREG(0x968)
++/* Device IN Endpoint 3 Transfer Size */
++#define S3C_UDC_OTG_DIEPTSIZ3 S3C_USBOTGREG(0x970)
++/* Device IN Endpoint 3 DMA Address */
++#define S3C_UDC_OTG_DIEPDMA3 S3C_USBOTGREG(0x974)
++
++/* Device Logical OUT Endpoint-Specific Registers */
++/* Device OUT Endpoint 0 Control */
++#define S3C_UDC_OTG_DOEPCTL0 S3C_USBOTGREG(0xB00)
++/* Device OUT Endpoint 0 Interrupt */
++#define S3C_UDC_OTG_DOEPINT0 S3C_USBOTGREG(0xB08)
++/* Device OUT Endpoint 0 Transfer Size */
++#define S3C_UDC_OTG_DOEPTSIZ0 S3C_USBOTGREG(0xB10)
++/* Device OUT Endpoint 0 DMA Address */
++#define S3C_UDC_OTG_DOEPDMA0 S3C_USBOTGREG(0xB14)
++
++/* Device OUT Endpoint 1 Control */
++#define S3C_UDC_OTG_DOEPCTL1 S3C_USBOTGREG(0xB20)
++/* Device OUT Endpoint 1 Interrupt */
++#define S3C_UDC_OTG_DOEPINT1 S3C_USBOTGREG(0xB28)
++/* Device OUT Endpoint 1 Transfer Size */
++#define S3C_UDC_OTG_DOEPTSIZ1 S3C_USBOTGREG(0xB30)
++/* Device OUT Endpoint 1 DMA Address */
++#define S3C_UDC_OTG_DOEPDMA1 S3C_USBOTGREG(0xB34)
++
++/* Endpoint FIFO address */
++#define S3C_UDC_OTG_EP0_FIFO S3C_USBOTGREG(0x1000)
++#define S3C_UDC_OTG_EP1_FIFO S3C_USBOTGREG(0x2000)
++#define S3C_UDC_OTG_EP2_FIFO S3C_USBOTGREG(0x3000)
++#define S3C_UDC_OTG_EP3_FIFO S3C_USBOTGREG(0x4000)
++#define S3C_UDC_OTG_EP4_FIFO S3C_USBOTGREG(0x5000)
++#define S3C_UDC_OTG_EP5_FIFO S3C_USBOTGREG(0x6000)
++#define S3C_UDC_OTG_EP6_FIFO S3C_USBOTGREG(0x7000)
++#define S3C_UDC_OTG_EP7_FIFO S3C_USBOTGREG(0x8000)
++#define S3C_UDC_OTG_EP8_FIFO S3C_USBOTGREG(0x9000)
++
++/* S3C_USBOTG_PHYPWR */
++#define OTG_ENABLE (0x0<<4)
++#define OTG_DISABLE (0x1<<4)
++#define ANALOG_PWR_UP (0x0<<3)
++#define ANALOG_PWR_DOWN (0x1<<3)
++#define SUSPEND_DISABLE (0x0<<0)
++#define SUSPEND_ENABLE (0x1<<0)
++
++/* S3C_USBOTG_PHYCLK */
++#define REF_CLK_CRYSTAL (0x0<<5)
++#define REF_CLK_OSCC (0x1<<5)
++
++/* S3C_USBOTG_RSTCON */
++#define SW_RST_OFF (0x0<<0)
++#define SW_RST_ON (0x1<<0)
++
++/* S3C_UDC_OTG_GOTGCTL */
++#define B_SESSION_VALID (0x1<<19)
++#define A_SESSION_VALID (0x1<<18)
++
++/* S3C_UDC_OTG_GAHBCFG */
++#define PTXFE_HALF (0x0<<8)
++#define PTXFE_ZERO (0x1<<8)
++#define NPTXFE_HALF (0x0<<7)
++#define NPTXFE_ZERO (0x1<<7)
++#define MODE_SLAVE (0x0<<5)
++#define MODE_DMA (0x1<<5)
++#define BURST_SINGLE (0x0<<1)
++#define BURST_INCR (0x1<<1)
++#define BURST_INCR4 (0x3<<1)
++#define BURST_INCR8 (0x5<<1)
++#define BURST_INCR16 (0x7<<1)
++#define GBL_INT_UNMASK (0x1<<0)
++#define GBL_INT_MASK (0x0<<0)
++
++/* S3C_UDC_OTG_GUSBCFG */
++#define PHY_CLK_480M (0x0<<15)
++#define PHY_CLK_48M (0x1<<15)
++#define TXFIFO_RE_DIS (0x0<<14)
++#define TXFIFO_RE_EN (0x1<<14)
++#define TURN_AROUND (0x5<<10)
++#define HNP_DISABLE (0x0<<9)
++#define HNP_ENABLE (0x1<<9)
++#define SRP_DISABLE (0x0<<8)
++#define SRP_ENABLE (0x1<<8)
++#define ULPI_DDR (0x0<<7)
++#define HS_UTMI (0x0<<6)
++#define INTERF_UTMI (0x0<<4)
++#define INTERF_ULPI (0x1<<4)
++#define PHY_INTERF_8 (0x0<<3)
++#define PHY_INTERF_16 (0x1<<3)
++#define TIME_OUT_CAL (0x7<<0)
++
++/* S3C_UDC_OTG_GRSTCTL */
++#define AHB_MASTER_IDLE (1u<<31)
++#define CORE_SOFT_RESET (0x1<<0)
++
++/* S3C_UDC_OTG_GINTSTS/S3C_UDC_OTG_GINTMSK core interrupt register */
++#define INT_RESUME (0x1<<31)
++#define INT_DISCONN (0x1<<29)
++#define INT_CONN_CNG (0x1<<28)
++#define INT_OUT_EP (0x1<<19)
++#define INT_IN_EP (0x1<<18)
++#define INT_ENUMDONE (0x1<<13)
++#define INT_RESET (0x1<<12)
++#define INT_SUSPEND (0x1<<11)
++#define INT_EARLY_SUSPEND (0x1<<10)
++#define INT_TX_FIFO_EMPTY (0x1<<5)
++#define INT_RX_FIFO_NOT_EMPTY (0x1<<4)
++#define INT_SOF (0x1<<3)
++#define INT_DEV_MODE (0x0<<0)
++#define INT_HOST_MODE (0x1<<1)
++
++#define FULL_SPEED_CONTROL_PKT_SIZE 8
++#define FULL_SPEED_BULK_PKT_SIZE 64
++
++#define HIGH_SPEED_CONTROL_PKT_SIZE 64
++#define HIGH_SPEED_BULK_PKT_SIZE 512
++
++/* S3C_UDC_OTG_DSTS */
++#define RX_FIFO_SIZE (2048<<0)
++#define NPTX_FIFO_START_ADDR (RX_FIFO_SIZE<<0)
++#define NPTX_FIFO_SIZE (2048<<16)
++#define PTX_FIFO_SIZE (2048<<16)
++#define USB_HIGH_30_60MHZ (0x0<<1)
++#define USB_FULL_30_60MHZ (0x1<<1)
++#define USB_LOW_6MHZ (0x2<<1)
++#define USB_FULL_48MHZ (0x3<<1)
++
++/* S3C_UDC_OTG_GRXSTSP */
++#define BYTE_COUNT(x) ((x & (0x7FF<<4)) >> 4)
++#define PKT_STS(x) ((x & (0xF<<17)) >> 17)
++#define EP_NUM(x) (x & 0xF)
++
++#define OUT_PKT_RECEIVED (0x2)
++#define OUT_COMPLELTED (0x3)
++#define SETUP_COMPLETED (0x4)
++#define SETUP_PKT_RECEIVED (0x6)
++
++/* S3C_UDC_OTG_DCFG */
++#define EP_MIS_CNT(x) (x<<18)
++#define DEVICE_ADDR(x) (x<<4)
++#define SPEED_2_HIGH (0x0<<0)
++#define SPEED_2_FULL (0x1<<0)
++#define SPEED_1_LOW (0x2<<0)
++#define SPEED_1_FULL (0x3<<0)
++
++/* S3C_UDC_OTG_DCTL device control register */
++#define NORMAL_OPERATION (0x1<<0)
++#define SOFT_DISCONNECT (0x1<<1)
++
++/* S3C_UDC_OTG_DSTS */
++#define ENUM_SPEED(x) (x & (0x3<<1))
++#define FRAME_CNT(x) (x & (0x3ff<<8))
++
++/* S3C_UDC_OTG_DAINT device all endpoint interrupt register */
++#define S3C_UDC_INT_IN_EP0 (0x1<<0)
++#define S3C_UDC_INT_IN_EP2 (0x1<<2)
++#define S3C_UDC_INT_IN_EP3 (0x1<<3)
++#define S3C_UDC_INT_OUT_EP0 (0x1<<16)
++#define S3C_UDC_INT_OUT_EP1 (0x1<<17)
++#define S3C_UDC_INT_OUT_EP4 (0x1<<20)
++
++/* S3C_UDC_OTG_DIEPCTL0/DOEPCTL0 device control
++ IN/OUT endpoint 0 control register */
++#define DEPCTL_EPENA (0x1<<31)
++#define DEPCTL_EPDIS (0x1<<30)
++#define DEPCTL_SNAK (0x1<<27)
++#define DEPCTL_CNAK (0x1<<26)
++#define DEPCTL_CTRL_TYPE (0x0<<18)
++#define DEPCTL_ISO_TYPE (0x1<<18)
++#define DEPCTL_BULK_TYPE (0x2<<18)
++#define DEPCTL_INTR_TYPE (0x3<<18)
++#define DEPCTL_USBACTEP (0x1<<15)
++#define DEPCTL0_MPS_64 (0x0<<0)
++#define DEPCTL0_MPS_32 (0x1<<0)
++#define DEPCTL0_MPS_16 (0x2<<0)
++#define DEPCTL0_MPS_8 (0x3<<0)
++
++/* S3C_UDC_OTG_DIEPINTn */
++#define IN_EP_NAK_EFF (0x1<<6)
++#define IN_TK_EPMIS (0x1<<5)
++#define IN_TK_TXFEMP (0x1<<4)
++#define IN_EP_TIMEOUT (0x1<<3)
++
++/* S3C_UDC_OTG_DOEPINTn */
++#define BACK2BACK_SETUP (0x1<<6)
++#define OUT_TK_EP_DIS (0x1<<4)
++#define SETUP_PHASE_DONE (0x1<<3)
++
++/* S3C_UDC_OTG_DIEPINTn/DOEPINTn */
++#define AHB_ERROR (0x1<<2)
++#define EPDISBLD (0x1<<1)
++#define TRANSFER_DONE (0x1<<0)
++
++/* S3C_UDC_OTG_DIEPTSIZn */
++#define PKT_CNT(x) (x<<19)
++#define XFERSIZE(x) (x<<0)
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/sdhci.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/sdhci.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/sdhci.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/sdhci.h 2009-05-10 22:27:59.000000000 +0200
+@@ -29,6 +29,7 @@
+ * is necessary the controllers and/or GPIO blocks require the
+ * changing of driver-strength and other controls dependant on
+ * the card and speed of operation.
++ * sdhci_host: Pointer kept during init, allows presence change notification
+ *
+ * Initialisation data specific to either the machine or the platform
+ * for the device driver to use or call-back when configuring gpio or
+@@ -45,8 +46,11 @@
+ void __iomem *regbase,
+ struct mmc_ios *ios,
+ struct mmc_card *card);
++ struct sdhci_host * sdhci_host;
+ };
+
++extern void sdhci_s3c_force_presence_change(struct platform_device *pdev);
++
+ /**
+ * s3c_sdhci0_set_platdata - Set platform data for S3C SDHCI device.
+ * @pd: Platform data to register to device.
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/usb-control.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/usb-control.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/include/plat/usb-control.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/include/plat/usb-control.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,41 @@
++/* arch/arm/plat-s3c/include/plat/usb-control.h
++ *
++ * Copyright (c) 2004 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ *
++ * S3C2410 - usb port information
++ *
++ * 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.
++*/
++
++#ifndef __ASM_ARCH_USBCONTROL_H
++#define __ASM_ARCH_USBCONTROL_H "arch/arm/plat-s3c/include/plat/usb-control.h"
++
++#define S3C_HCDFLG_USED (1)
++
++struct s3c2410_hcd_port {
++ unsigned char flags;
++ unsigned char power;
++ unsigned char oc_status;
++ unsigned char oc_changed;
++};
++
++struct s3c2410_hcd_info {
++ struct usb_hcd *hcd;
++ struct s3c2410_hcd_port port[2];
++
++ void (*power_control)(int port, int to);
++ void (*enable_oc)(struct s3c2410_hcd_info *, int on);
++ void (*report_oc)(struct s3c2410_hcd_info *, int ports);
++};
++
++static void inline s3c2410_usb_report_oc(struct s3c2410_hcd_info *info, int ports)
++{
++ if (info->report_oc != NULL) {
++ (info->report_oc)(info, ports);
++ }
++}
++
++#endif /*__ASM_ARCH_USBCONTROL_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/init.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/init.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/init.c 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/init.c 2009-05-10 22:27:59.000000000 +0200
+@@ -31,6 +31,34 @@
+
+ static struct cpu_table *cpu;
+
++static void __init set_system_rev(unsigned int idcode)
++{
++ /*
++ * system_rev encoding is as follows
++ * system_rev & 0xff000000 -> S3C Class (24xx/64xx)
++ * system_rev & 0xfff00000 -> S3C Sub Class (241x/244x)
++ * system_rev & 0xffff0000 -> S3C Type (2410/2440/6400/6410)
++ *
++ * Remaining[15:0] are preserved from the value set by ATAG
++ *
++ * Exception:
++ * Store Revision A to 1 such as
++ * s3c2410A to s3c2411
++ * s3c2440A to s3c2441
++ */
++
++ system_rev &= 0xffff;
++ system_rev |= (idcode & 0x0ffff000) << 4;
++
++ if (idcode == 0x32410002 || idcode == 0x32440001)
++ system_rev |= (0x1 << 16);
++ if (idcode == 0x32440aaa /* s3c2442 */
++ || idcode == 0x32440aab) /* s3c2442b */
++ system_rev |= (0x2 << 16);
++ if (idcode == 0x0) /* s3c2400 */
++ system_rev |= (0x2400 << 16);
++}
++
+ static struct cpu_table * __init s3c_lookup_cpu(unsigned long idcode,
+ struct cpu_table *tab,
+ unsigned int count)
+@@ -53,6 +81,8 @@
+ panic("Unknown S3C24XX CPU");
+ }
+
++ set_system_rev(idcode);
++
+ printk("CPU %s (id 0x%08lx)\n", cpu->name, idcode);
+
+ if (cpu->map_io == NULL || cpu->init == NULL) {
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/Kconfig linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/Kconfig
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/Kconfig 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/Kconfig 2009-05-10 22:27:59.000000000 +0200
+@@ -71,6 +71,15 @@
+ Resume code. See <file:Documentation/arm/Samsung-S3C24XX/Suspend.txt>
+ for more information.
+
++config S3C_PM_DEBUG_LED_SMDK
++ bool "SMDK LED suspend/resume debugging"
++ depends on PM && (MACH_SMDK6410)
++ help
++ Say Y here to enable the use of the SMDK LEDs on the baseboard
++ for debugging of the state of the suspend and resume process.
++
++ Note, this currently only works for S3C64XX based SMDK boards.
++
+ config S3C2410_PM_CHECK
+ bool "S3C2410 PM Suspend Memory CRC"
+ depends on PM && CRC32
+@@ -150,6 +159,18 @@
+ Internal configuration to enable S3C64XX style GPIO configuration
+ functions.
+
++# DMA
++
++config S3C_DMA
++ bool
++ help
++ Internal configuration for S3C DMA core
++
++config S3C_PWM
++ bool
++ help
++ PWM timer code for the S3C2410, and similar processors
++
+ # device definitions to compile in
+
+ config S3C_DEV_HSMMC
+@@ -172,4 +193,14 @@
+ help
+ Compile in platform device definition for framebuffer
+
++config S3C_DEV_USB_HOST
++ bool
++ help
++ Compile in platform device definition for USB host.
++
++config S3C_DEV_CAMIF
++ bool
++ help
++ Compile in platform device definitions for camera interface code
++
+ endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/Makefile linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/Makefile
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/Makefile 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/Makefile 2009-05-10 22:27:59.000000000 +0200
+@@ -18,6 +18,16 @@
+ obj-y += gpio.o
+ obj-y += gpio-config.o
+
++# DMA support
++
++obj-$(CONFIG_S3C_DMA) += dma.o
++
++# PM support
++
++obj-$(CONFIG_PM) += pm.o
++obj-$(CONFIG_PM) += pm-gpio.o
++obj-$(CONFIG_S3C2410_PM_CHECK) += pm-check.o
++
+ # devices
+
+ obj-$(CONFIG_S3C_DEV_HSMMC) += dev-hsmmc.o
+@@ -25,3 +35,9 @@
+ obj-y += dev-i2c0.o
+ obj-$(CONFIG_S3C_DEV_I2C1) += dev-i2c1.o
+ obj-$(CONFIG_S3C_DEV_FB) += dev-fb.o
++obj-$(CONFIG_S3C_DEV_USB_HOST) += dev-usb.o
++obj-$(CONFIG_S3C_DEV_CAMIF) += dev-camif.o
++
++obj-$(CONFIG_S3C_PWM) += pwm.o
++obj-$(CONFIG_S3C_DMA) += dma.o
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/pm.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/pm.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/pm.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/pm.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,375 @@
++/* linux/arch/arm/plat-s3c/pm.c
++ *
++ * Copyright 2008 Openmoko, Inc.
++ * Copyright 2004,2006,2008 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ * http://armlinux.simtec.co.uk/
++ *
++ * S3C common power management (suspend to ram) support.
++ *
++ * 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.
++*/
++
++#include <linux/init.h>
++#include <linux/suspend.h>
++#include <linux/errno.h>
++#include <linux/delay.h>
++#include <linux/serial_core.h>
++#include <linux/io.h>
++
++#include <asm/cacheflush.h>
++#include <mach/hardware.h>
++#include <mach/map.h>
++
++#include <plat/regs-serial.h>
++#include <mach/regs-clock.h>
++#include <mach/regs-irq.h>
++#include <asm/irq.h>
++
++#include <plat/pm.h>
++#include <plat/pm-core.h>
++
++/* for external use */
++
++unsigned long s3c_pm_flags;
++
++/* Debug code:
++ *
++ * This code supports debug output to the low level UARTs for use on
++ * resume before the console layer is available.
++*/
++
++#ifdef CONFIG_S3C2410_PM_DEBUG
++extern void printascii(const char *);
++
++void s3c_pm_dbg(const char *fmt, ...)
++{
++ va_list va;
++ char buff[256];
++
++ va_start(va, fmt);
++ vsprintf(buff, fmt, va);
++ va_end(va);
++
++ printascii(buff);
++}
++
++static inline void s3c_pm_debug_init(void)
++{
++ /* restart uart clocks so we can use them to output */
++ s3c_pm_debug_init_uart();
++}
++
++#else
++#define s3c_pm_debug_init() do { } while(0)
++
++#endif /* CONFIG_S3C2410_PM_DEBUG */
++
++/* Save the UART configurations if we are configured for debug. */
++
++unsigned char pm_uart_udivslot;
++
++#ifdef CONFIG_S3C2410_PM_DEBUG
++
++struct pm_uart_save uart_save[CONFIG_SERIAL_SAMSUNG_UARTS];
++
++static void s3c_pm_save_uart(unsigned int uart, struct pm_uart_save *save)
++{
++ void __iomem *regs = S3C_VA_UARTx(uart);
++
++ save->ulcon = __raw_readl(regs + S3C2410_ULCON);
++ save->ucon = __raw_readl(regs + S3C2410_UCON);
++ save->ufcon = __raw_readl(regs + S3C2410_UFCON);
++ save->umcon = __raw_readl(regs + S3C2410_UMCON);
++ save->ubrdiv = __raw_readl(regs + S3C2410_UBRDIV);
++
++ if (pm_uart_udivslot)
++ save->udivslot = __raw_readl(regs + S3C2443_DIVSLOT);
++
++ S3C_PMDBG("UART[%d]: ULCON=%04x, UCON=%04x, UFCON=%04x, UBRDIV=%04x\n",
++ uart, save->ulcon, save->ucon, save->ufcon, save->ubrdiv);
++}
++
++static void s3c_pm_save_uarts(void)
++{
++ struct pm_uart_save *save = uart_save;
++ unsigned int uart;
++
++ for (uart = 0; uart < CONFIG_SERIAL_SAMSUNG_UARTS; uart++, save++)
++ s3c_pm_save_uart(uart, save);
++}
++
++static void s3c_pm_restore_uart(unsigned int uart, struct pm_uart_save *save)
++{
++ void __iomem *regs = S3C_VA_UARTx(uart);
++
++ s3c_pm_arch_update_uart(regs, save);
++
++ __raw_writel(save->ulcon, regs + S3C2410_ULCON);
++ __raw_writel(save->ucon, regs + S3C2410_UCON);
++ __raw_writel(save->ufcon, regs + S3C2410_UFCON);
++ __raw_writel(save->umcon, regs + S3C2410_UMCON);
++ __raw_writel(save->ubrdiv, regs + S3C2410_UBRDIV);
++
++ if (pm_uart_udivslot)
++ __raw_writel(save->udivslot, regs + S3C2443_DIVSLOT);
++}
++
++static void s3c_pm_restore_uarts(void)
++{
++ struct pm_uart_save *save = uart_save;
++ unsigned int uart;
++
++ for (uart = 0; uart < CONFIG_SERIAL_SAMSUNG_UARTS; uart++, save++)
++ s3c_pm_restore_uart(uart, save);
++}
++#else
++static void s3c_pm_save_uarts(void) { }
++static void s3c_pm_restore_uarts(void) { }
++#endif
++
++/* The IRQ ext-int code goes here, it is too small to currently bother
++ * with its own file. */
++
++unsigned long s3c_irqwake_intmask = 0xffffffffL;
++unsigned long s3c_irqwake_eintmask = 0xffffffffL;
++
++int s3c_irqext_wake(unsigned int irqno, unsigned int state)
++{
++ unsigned long bit = 1L << IRQ_EINT_BIT(irqno);
++
++ if (!(s3c_irqwake_eintallow & bit))
++ return -ENOENT;
++
++ printk(KERN_INFO "wake %s for irq %d\n",
++ state ? "enabled" : "disabled", irqno);
++
++ if (!state)
++ s3c_irqwake_eintmask |= bit;
++ else
++ s3c_irqwake_eintmask &= ~bit;
++
++ return 0;
++}
++
++/* helper functions to save and restore register state */
++
++/**
++ * s3c_pm_do_save() - save a set of registers for restoration on resume.
++ * @ptr: Pointer to an array of registers.
++ * @count: Size of the ptr array.
++ *
++ * Run through the list of registers given, saving their contents in the
++ * array for later restoration when we wakeup.
++ */
++void s3c_pm_do_save(struct sleep_save *ptr, int count)
++{
++ for (; count > 0; count--, ptr++) {
++ ptr->val = __raw_readl(ptr->reg);
++ S3C_PMDBG("saved %p value %08lx\n", ptr->reg, ptr->val);
++ }
++}
++
++/**
++ * s3c_pm_do_restore() - restore register values from the save list.
++ * @ptr: Pointer to an array of registers.
++ * @count: Size of the ptr array.
++ *
++ * Restore the register values saved from s3c_pm_do_save().
++ *
++ * Note, we do not use S3C_PMDBG() in here, as the system may not have
++ * restore the UARTs state yet
++*/
++
++void s3c_pm_do_restore(struct sleep_save *ptr, int count)
++{
++ for (; count > 0; count--, ptr++) {
++ printk(KERN_DEBUG "restore %p (restore %08lx, was %08x)\n",
++ ptr->reg, ptr->val, __raw_readl(ptr->reg));
++
++ __raw_writel(ptr->val, ptr->reg);
++ }
++}
++
++/**
++ * s3c_pm_do_restore_core() - early restore register values from save list.
++ *
++ * This is similar to s3c_pm_do_restore() except we try and minimise the
++ * side effects of the function in case registers that hardware might need
++ * to work has been restored.
++ *
++ * WARNING: Do not put any debug in here that may effect memory or use
++ * peripherals, as things may be changing!
++*/
++
++void s3c_pm_do_restore_core(struct sleep_save *ptr, int count)
++{
++ for (; count > 0; count--, ptr++)
++ __raw_writel(ptr->val, ptr->reg);
++}
++
++/* s3c2410_pm_show_resume_irqs
++ *
++ * print any IRQs asserted at resume time (ie, we woke from)
++*/
++static void s3c_pm_show_resume_irqs(int start, unsigned long which,
++ unsigned long mask)
++{
++ int i;
++
++ which &= ~mask;
++
++ for (i = 0; i <= 31; i++) {
++ if (which & (1L<<i)) {
++ S3C_PMDBG("IRQ %d asserted at resume\n", start+i);
++ }
++ }
++}
++
++
++void (*pm_cpu_prep)(void);
++void (*pm_cpu_sleep)(void);
++
++#define any_allowed(mask, allow) (((mask) & (allow)) != (allow))
++
++/* s3c_pm_enter
++ *
++ * central control for sleep/resume process
++*/
++
++static int s3c_pm_enter(suspend_state_t state)
++{
++ unsigned long regs_save[16];
++
++ /* ensure the debug is initialised (if enabled) */
++
++ s3c_pm_debug_init();
++
++ S3C_PMDBG("%s(%d)\n", __func__, state);
++
++ if (pm_cpu_prep == NULL || pm_cpu_sleep == NULL) {
++ printk(KERN_ERR "%s: error: no cpu sleep function\n", __func__);
++ return -EINVAL;
++ }
++
++ /* check if we have anything to wake-up with... bad things seem
++ * to happen if you suspend with no wakeup (system will often
++ * require a full power-cycle)
++ */
++
++ if (!any_allowed(s3c_irqwake_intmask, s3c_irqwake_intallow) &&
++ !any_allowed(s3c_irqwake_eintmask, s3c_irqwake_eintallow)) {
++ printk(KERN_ERR "%s: No wake-up sources!\n", __func__);
++ printk(KERN_ERR "%s: Aborting sleep\n", __func__);
++ return -EINVAL;
++ }
++
++ /* store the physical address of the register recovery block */
++
++ s3c_sleep_save_phys = virt_to_phys(regs_save);
++
++ S3C_PMDBG("s3c_sleep_save_phys=0x%08lx\n", s3c_sleep_save_phys);
++
++ /* save all necessary core registers not covered by the drivers */
++
++ s3c_pm_save_gpios();
++ s3c_pm_save_uarts();
++ s3c_pm_save_core();
++
++ /* set the irq configuration for wake */
++
++ s3c_pm_configure_extint();
++
++ S3C_PMDBG("sleep: irq wakeup masks: %08lx,%08lx\n",
++ s3c_irqwake_intmask, s3c_irqwake_eintmask);
++
++ s3c_pm_arch_prepare_irqs();
++
++ /* call cpu specific preparation */
++
++ pm_cpu_prep();
++
++ /* flush cache back to ram */
++
++ flush_cache_all();
++
++ s3c_pm_check_store();
++
++ /* send the cpu to sleep... */
++
++ s3c_pm_arch_stop_clocks();
++
++ /* s3c2410_cpu_save will also act as our return point from when
++ * we resume as it saves its own register state, so use the return
++ * code to differentiate return from save and return from sleep */
++
++ if (s3c_cpu_save(regs_save) == 0) {
++ flush_cache_all();
++ pm_cpu_sleep();
++ }
++
++ /* restore the cpu state using the kernel's cpu init code. */
++
++ cpu_init();
++
++ /* restore the system state */
++
++ s3c_pm_restore_core();
++ s3c_pm_restore_uarts();
++ s3c_pm_restore_gpios();
++
++ s3c_pm_debug_init();
++
++ /* check what irq (if any) restored the system */
++
++ s3c_pm_arch_show_resume_irqs();
++
++ S3C_PMDBG("%s: post sleep, preparing to return\n", __func__);
++
++ s3c_pm_check_restore();
++
++ /* LEDs should now be 1110 */
++ s3c_pm_debug_smdkled(1 << 1, 0);
++
++ /* ok, let's return from sleep */
++
++ S3C_PMDBG("S3C PM Resume (post-restore)\n");
++ return 0;
++}
++
++static int s3c_pm_prepare(void)
++{
++ /* prepare check area if configured */
++
++ s3c_pm_check_prepare();
++ return 0;
++}
++
++static void s3c_pm_finish(void)
++{
++ s3c_pm_check_cleanup();
++}
++
++static struct platform_suspend_ops s3c_pm_ops = {
++ .enter = s3c_pm_enter,
++ .prepare = s3c_pm_prepare,
++ .finish = s3c_pm_finish,
++ .valid = suspend_valid_only_mem,
++};
++
++/* s3c_pm_init
++ *
++ * Attach the power management functions. This should be called
++ * from the board specific initialisation if the board supports
++ * it.
++*/
++
++int __init s3c_pm_init(void)
++{
++ printk("S3C Power Management, Copyright 2004 Simtec Electronics\n");
++
++ suspend_set_ops(&s3c_pm_ops);
++ return 0;
++}
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/pm-check.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/pm-check.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/pm-check.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/pm-check.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,242 @@
++/* linux/arch/arm/plat-s3c/pm-check.c
++ * originally in linux/arch/arm/plat-s3c24xx/pm.c
++ *
++ * Copyright (c) 2004,2006,2008 Simtec Electronics
++ * http://armlinux.simtec.co.uk
++ * Ben Dooks <ben@simtec.co.uk>
++ *
++ * S3C Power Mangament - suspend/resume memory corruptiuon check.
++ *
++ * 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.
++*/
++
++#include <linux/kernel.h>
++#include <linux/suspend.h>
++#include <linux/init.h>
++#include <linux/crc32.h>
++#include <linux/ioport.h>
++
++#include <plat/pm.h>
++
++#if CONFIG_S3C2410_PM_CHECK_CHUNKSIZE < 1
++#error CONFIG_S3C2410_PM_CHECK_CHUNKSIZE must be a positive non-zero value
++#endif
++
++/* suspend checking code...
++ *
++ * this next area does a set of crc checks over all the installed
++ * memory, so the system can verify if the resume was ok.
++ *
++ * CONFIG_S3C2410_PM_CHECK_CHUNKSIZE defines the block-size for the CRC,
++ * increasing it will mean that the area corrupted will be less easy to spot,
++ * and reducing the size will cause the CRC save area to grow
++*/
++
++#define CHECK_CHUNKSIZE (CONFIG_S3C2410_PM_CHECK_CHUNKSIZE * 1024)
++
++static u32 crc_size; /* size needed for the crc block */
++static u32 *crcs; /* allocated over suspend/resume */
++
++typedef u32 *(run_fn_t)(struct resource *ptr, u32 *arg);
++
++/* s3c_pm_run_res
++ *
++ * go through the given resource list, and look for system ram
++*/
++
++static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
++{
++ while (ptr != NULL) {
++ if (ptr->child != NULL)
++ s3c_pm_run_res(ptr->child, fn, arg);
++
++ if ((ptr->flags & IORESOURCE_MEM) &&
++ strcmp(ptr->name, "System RAM") == 0) {
++ S3C_PMDBG("Found system RAM at %08lx..%08lx\n",
++ (unsigned long)ptr->start,
++ (unsigned long)ptr->end);
++ arg = (fn)(ptr, arg);
++ }
++
++ ptr = ptr->sibling;
++ }
++}
++
++static void s3c_pm_run_sysram(run_fn_t fn, u32 *arg)
++{
++ s3c_pm_run_res(&iomem_resource, fn, arg);
++}
++
++static u32 *s3c_pm_countram(struct resource *res, u32 *val)
++{
++ u32 size = (u32)(res->end - res->start)+1;
++
++ size += CHECK_CHUNKSIZE-1;
++ size /= CHECK_CHUNKSIZE;
++
++ S3C_PMDBG("Area %08lx..%08lx, %d blocks\n",
++ (unsigned long)res->start, (unsigned long)res->end, size);
++
++ *val += size * sizeof(u32);
++ return val;
++}
++
++/* s3c_pm_prepare_check
++ *
++ * prepare the necessary information for creating the CRCs. This
++ * must be done before the final save, as it will require memory
++ * allocating, and thus touching bits of the kernel we do not
++ * know about.
++*/
++
++void s3c_pm_check_prepare(void)
++{
++ crc_size = 0;
++
++ s3c_pm_run_sysram(s3c_pm_countram, &crc_size);
++
++ S3C_PMDBG("s3c_pm_prepare_check: %u checks needed\n", crc_size);
++
++ crcs = kmalloc(crc_size+4, GFP_KERNEL);
++ if (crcs == NULL)
++ printk(KERN_ERR "Cannot allocated CRC save area\n");
++}
++
++static u32 *s3c_pm_makecheck(struct resource *res, u32 *val)
++{
++ unsigned long addr, left;
++
++ for (addr = res->start; addr < res->end;
++ addr += CHECK_CHUNKSIZE) {
++ left = res->end - addr;
++
++ if (left > CHECK_CHUNKSIZE)
++ left = CHECK_CHUNKSIZE;
++
++ *val = crc32_le(~0, phys_to_virt(addr), left);
++ val++;
++ }
++
++ return val;
++}
++
++/* s3c_pm_check_store
++ *
++ * compute the CRC values for the memory blocks before the final
++ * sleep.
++*/
++
++void s3c_pm_check_store(void)
++{
++ if (crcs != NULL)
++ s3c_pm_run_sysram(s3c_pm_makecheck, crcs);
++}
++
++/* in_region
++ *
++ * return TRUE if the area defined by ptr..ptr+size contains the
++ * what..what+whatsz
++*/
++
++static inline int in_region(void *ptr, int size, void *what, size_t whatsz)
++{
++ if ((what+whatsz) < ptr)
++ return 0;
++
++ if (what > (ptr+size))
++ return 0;
++
++ return 1;
++}
++
++/**
++ * s3c_pm_runcheck() - helper to check a resource on restore.
++ * @res: The resource to check
++ * @vak: Pointer to list of CRC32 values to check.
++ *
++ * Called from the s3c_pm_check_restore() via s3c_pm_run_sysram(), this
++ * function runs the given memory resource checking it against the stored
++ * CRC to ensure that memory is restored. The function tries to skip as
++ * many of the areas used during the suspend process.
++ */
++static u32 *s3c_pm_runcheck(struct resource *res, u32 *val)
++{
++ void *save_at = phys_to_virt(s3c_sleep_save_phys);
++ unsigned long addr;
++ unsigned long left;
++ void *stkpage;
++ void *ptr;
++ u32 calc;
++
++ stkpage = (void *)((u32)&calc & ~PAGE_MASK);
++
++ for (addr = res->start; addr < res->end;
++ addr += CHECK_CHUNKSIZE) {
++ left = res->end - addr;
++
++ if (left > CHECK_CHUNKSIZE)
++ left = CHECK_CHUNKSIZE;
++
++ ptr = phys_to_virt(addr);
++
++ if (in_region(ptr, left, stkpage, 4096)) {
++ S3C_PMDBG("skipping %08lx, has stack in\n", addr);
++ goto skip_check;
++ }
++
++ if (in_region(ptr, left, crcs, crc_size)) {
++ S3C_PMDBG("skipping %08lx, has crc block in\n", addr);
++ goto skip_check;
++ }
++
++ if (in_region(ptr, left, save_at, 32*4 )) {
++ S3C_PMDBG("skipping %08lx, has save block in\n", addr);
++ goto skip_check;
++ }
++
++ /* calculate and check the checksum */
++
++ calc = crc32_le(~0, ptr, left);
++ if (calc != *val) {
++ printk(KERN_ERR "Restore CRC error at "
++ "%08lx (%08x vs %08x)\n", addr, calc, *val);
++
++ S3C_PMDBG("Restore CRC error at %08lx (%08x vs %08x)\n",
++ addr, calc, *val);
++ }
++
++ skip_check:
++ val++;
++ }
++
++ return val;
++}
++
++/**
++ * s3c_pm_check_restore() - memory check called on resume
++ *
++ * check the CRCs after the restore event and free the memory used
++ * to hold them
++*/
++void s3c_pm_check_restore(void)
++{
++ if (crcs != NULL)
++ s3c_pm_run_sysram(s3c_pm_runcheck, crcs);
++}
++
++/**
++ * s3c_pm_check_cleanup() - free memory resources
++ *
++ * Free the resources that where allocated by the suspend
++ * memory check code. We do this separately from the
++ * s3c_pm_check_restore() function as we cannot call any
++ * functions that might sleep during that resume.
++ */
++void s3c_pm_check_cleanup(void)
++{
++ kfree(crcs);
++ crcs = NULL;
++}
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/pm-gpio.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/pm-gpio.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/pm-gpio.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/pm-gpio.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,378 @@
++/* linux/arch/arm/plat-s3c/pm-gpio.c
++ *
++ * Copyright 2008 Openmoko, Inc.
++ * Copyright 2008 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ * http://armlinux.simtec.co.uk/
++ *
++ * S3C series GPIO PM code
++ *
++ * 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.
++*/
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/io.h>
++#include <linux/gpio.h>
++
++#include <mach/gpio-core.h>
++#include <plat/pm.h>
++
++/* PM GPIO helpers */
++
++#define OFFS_CON (0x00)
++#define OFFS_DAT (0X04)
++#define OFFS_UP (0X08)
++
++static void s3c_gpio_pm_1bit_save(struct s3c_gpio_chip *chip)
++{
++ chip->pm_save[0] = __raw_readl(chip->base + OFFS_CON);
++ chip->pm_save[1] = __raw_readl(chip->base + OFFS_DAT);
++}
++
++static void s3c_gpio_pm_1bit_resume(struct s3c_gpio_chip *chip)
++{
++ void __iomem *base = chip->base;
++ u32 old_gpcon = __raw_readl(base + OFFS_CON);
++ u32 old_gpdat = __raw_readl(base + OFFS_DAT);
++ u32 gps_gpcon = chip->pm_save[0];
++ u32 gps_gpdat = chip->pm_save[1];
++ u32 gpcon;
++
++ /* GPACON only has one bit per control / data and no PULLUPs.
++ * GPACON[x] = 0 => Output, 1 => SFN */
++
++ /* first set all SFN bits to SFN */
++
++ gpcon = old_gpcon | gps_gpcon;
++ __raw_writel(gpcon, base + OFFS_CON);
++
++ /* now set all the other bits */
++
++ __raw_writel(gps_gpdat, base + OFFS_DAT);
++ __raw_writel(gps_gpcon, base + OFFS_CON);
++
++ S3C_PMDBG("%s: CON %08x => %08x, DAT %08x => %08x\n",
++ chip->chip.label, old_gpcon, gps_gpcon, old_gpdat, gps_gpdat);
++}
++
++struct s3c_gpio_pm s3c_gpio_pm_1bit = {
++ .save = s3c_gpio_pm_1bit_save,
++ .resume = s3c_gpio_pm_1bit_resume,
++};
++
++static void s3c_gpio_pm_2bit_save(struct s3c_gpio_chip *chip)
++{
++ chip->pm_save[0] = __raw_readl(chip->base + OFFS_CON);
++ chip->pm_save[1] = __raw_readl(chip->base + OFFS_DAT);
++ chip->pm_save[2] = __raw_readl(chip->base + OFFS_UP);
++}
++
++/* Test whether the given masked+shifted bits of an GPIO configuration
++ * are one of the SFN (special function) modes. */
++
++static inline int is_sfn(unsigned long con)
++{
++ return con >= 2;
++}
++
++/* Test if the given masked+shifted GPIO configuration is an input */
++
++static inline int is_in(unsigned long con)
++{
++ return con == 0;
++}
++
++/* Test if the given masked+shifted GPIO configuration is an output */
++
++static inline int is_out(unsigned long con)
++{
++ return con == 1;
++}
++
++/**
++ * s3c_gpio_pm_2bit_resume() - restore the given GPIO bank
++ * @chip: The chip information to resume.
++ *
++ * Restore one of the GPIO banks that was saved during suspend. This is
++ * not as simple as once thought, due to the possibility of glitches
++ * from the order that the CON and DAT registers are set in.
++ *
++ * The three states the pin can be are {IN,OUT,SFN} which gives us 9
++ * combinations of changes to check. Three of these, if the pin stays
++ * in the same configuration can be discounted. This leaves us with
++ * the following:
++ *
++ * { IN => OUT } Change DAT first
++ * { IN => SFN } Change CON first
++ * { OUT => SFN } Change CON first, so new data will not glitch
++ * { OUT => IN } Change CON first, so new data will not glitch
++ * { SFN => IN } Change CON first
++ * { SFN => OUT } Change DAT first, so new data will not glitch [1]
++ *
++ * We do not currently deal with the UP registers as these control
++ * weak resistors, so a small delay in change should not need to bring
++ * these into the calculations.
++ *
++ * [1] this assumes that writing to a pin DAT whilst in SFN will set the
++ * state for when it is next output.
++ */
++static void s3c_gpio_pm_2bit_resume(struct s3c_gpio_chip *chip)
++{
++ void __iomem *base = chip->base;
++ u32 old_gpcon = __raw_readl(base + OFFS_CON);
++ u32 old_gpdat = __raw_readl(base + OFFS_DAT);
++ u32 gps_gpcon = chip->pm_save[0];
++ u32 gps_gpdat = chip->pm_save[1];
++ u32 gpcon, old, new, mask;
++ u32 change_mask = 0x0;
++ int nr;
++
++ /* restore GPIO pull-up settings */
++ __raw_writel(chip->pm_save[2], base + OFFS_UP);
++
++ /* Create a change_mask of all the items that need to have
++ * their CON value changed before their DAT value, so that
++ * we minimise the work between the two settings.
++ */
++
++ for (nr = 0, mask = 0x03; nr < 32; nr += 2, mask <<= 2) {
++ old = (old_gpcon & mask) >> nr;
++ new = (gps_gpcon & mask) >> nr;
++
++ /* If there is no change, then skip */
++
++ if (old == new)
++ continue;
++
++ /* If both are special function, then skip */
++
++ if (is_sfn(old) && is_sfn(new))
++ continue;
++
++ /* Change is IN => OUT, do not change now */
++
++ if (is_in(old) && is_out(new))
++ continue;
++
++ /* Change is SFN => OUT, do not change now */
++
++ if (is_sfn(old) && is_out(new))
++ continue;
++
++ /* We should now be at the case of IN=>SFN,
++ * OUT=>SFN, OUT=>IN, SFN=>IN. */
++
++ change_mask |= mask;
++ }
++
++
++ /* Write the new CON settings */
++
++ gpcon = old_gpcon & ~change_mask;
++ gpcon |= gps_gpcon & change_mask;
++
++ __raw_writel(gpcon, base + OFFS_CON);
++
++ /* Now change any items that require DAT,CON */
++
++ __raw_writel(gps_gpdat, base + OFFS_DAT);
++ __raw_writel(gps_gpcon, base + OFFS_CON);
++
++ S3C_PMDBG("%s: CON %08x => %08x, DAT %08x => %08x\n",
++ chip->chip.label, old_gpcon, gps_gpcon, old_gpdat, gps_gpdat);
++}
++
++struct s3c_gpio_pm s3c_gpio_pm_2bit = {
++ .save = s3c_gpio_pm_2bit_save,
++ .resume = s3c_gpio_pm_2bit_resume,
++};
++
++#ifdef CONFIG_ARCH_S3C64XX
++static void s3c_gpio_pm_4bit_save(struct s3c_gpio_chip *chip)
++{
++ chip->pm_save[1] = __raw_readl(chip->base + OFFS_CON);
++ chip->pm_save[2] = __raw_readl(chip->base + OFFS_DAT);
++ chip->pm_save[3] = __raw_readl(chip->base + OFFS_UP);
++
++ if (chip->chip.ngpio > 8)
++ chip->pm_save[0] = __raw_readl(chip->base - 4);
++}
++
++static u32 s3c_gpio_pm_4bit_mask(u32 old_gpcon, u32 gps_gpcon)
++{
++ u32 old, new, mask;
++ u32 change_mask = 0x0;
++ int nr;
++
++ for (nr = 0, mask = 0x0f; nr < 16; nr += 4, mask <<= 4) {
++ old = (old_gpcon & mask) >> nr;
++ new = (gps_gpcon & mask) >> nr;
++
++ /* If there is no change, then skip */
++
++ if (old == new)
++ continue;
++
++ /* If both are special function, then skip */
++
++ if (is_sfn(old) && is_sfn(new))
++ continue;
++
++ /* Change is IN => OUT, do not change now */
++
++ if (is_in(old) && is_out(new))
++ continue;
++
++ /* Change is SFN => OUT, do not change now */
++
++ if (is_sfn(old) && is_out(new))
++ continue;
++
++ /* We should now be at the case of IN=>SFN,
++ * OUT=>SFN, OUT=>IN, SFN=>IN. */
++
++ change_mask |= mask;
++ }
++
++ return change_mask;
++}
++
++static void s3c_gpio_pm_4bit_con(struct s3c_gpio_chip *chip, int index)
++{
++ void __iomem *con = chip->base + (index * 4);
++ u32 old_gpcon = __raw_readl(con);
++ u32 gps_gpcon = chip->pm_save[index + 1];
++ u32 gpcon, mask;
++
++ mask = s3c_gpio_pm_4bit_mask(old_gpcon, gps_gpcon);
++
++ gpcon = old_gpcon & ~mask;
++ gpcon |= gps_gpcon & mask;
++
++ __raw_writel(gpcon, con);
++}
++
++static void s3c_gpio_pm_4bit_resume(struct s3c_gpio_chip *chip)
++{
++ void __iomem *base = chip->base;
++ u32 old_gpcon[2];
++ u32 old_gpdat = __raw_readl(base + OFFS_DAT);
++ u32 gps_gpdat = chip->pm_save[2];
++
++ /* First, modify the CON settings */
++
++ old_gpcon[0] = 0;
++ old_gpcon[1] = __raw_readl(base + OFFS_CON);
++
++ s3c_gpio_pm_4bit_con(chip, 0);
++ if (chip->chip.ngpio > 8) {
++ old_gpcon[0] = __raw_readl(base - 4);
++ s3c_gpio_pm_4bit_con(chip, -1);
++ }
++
++ /* Now change the configurations that require DAT,CON */
++
++ __raw_writel(chip->pm_save[2], base + OFFS_DAT);
++ __raw_writel(chip->pm_save[1], base + OFFS_CON);
++ if (chip->chip.ngpio > 8)
++ __raw_writel(chip->pm_save[0], base - 4);
++
++ __raw_writel(chip->pm_save[2], base + OFFS_DAT);
++ __raw_writel(chip->pm_save[3], base + OFFS_UP);
++
++ if (chip->chip.ngpio > 8) {
++ S3C_PMDBG("%s: CON4 %08x,%08x => %08x,%08x, DAT %08x => %08x\n",
++ chip->chip.label, old_gpcon[0], old_gpcon[1],
++ __raw_readl(base - 4),
++ __raw_readl(base + OFFS_CON),
++ old_gpdat, gps_gpdat);
++ } else
++ S3C_PMDBG("%s: CON4 %08x => %08x, DAT %08x => %08x\n",
++ chip->chip.label, old_gpcon[1],
++ __raw_readl(base + OFFS_CON),
++ old_gpdat, gps_gpdat);
++}
++
++struct s3c_gpio_pm s3c_gpio_pm_4bit = {
++ .save = s3c_gpio_pm_4bit_save,
++ .resume = s3c_gpio_pm_4bit_resume,
++};
++#endif /* CONFIG_ARCH_S3C64XX */
++
++/**
++ * s3c_pm_save_gpio() - save gpio chip data for suspend
++ * @ourchip: The chip for suspend.
++ */
++static void s3c_pm_save_gpio(struct s3c_gpio_chip *ourchip)
++{
++ struct s3c_gpio_pm *pm = ourchip->pm;
++
++ if (pm == NULL || pm->save == NULL)
++ S3C_PMDBG("%s: no pm for %s\n", __func__, ourchip->chip.label);
++ else
++ pm->save(ourchip);
++}
++
++/**
++ * s3c_pm_save_gpios() - Save the state of the GPIO banks.
++ *
++ * For all the GPIO banks, save the state of each one ready for going
++ * into a suspend mode.
++ */
++void s3c_pm_save_gpios(void)
++{
++ struct s3c_gpio_chip *ourchip;
++ unsigned int gpio_nr;
++
++ for (gpio_nr = 0; gpio_nr < S3C_GPIO_END; gpio_nr++) {
++ ourchip = s3c_gpiolib_getchip(gpio_nr);
++ if (!ourchip)
++ continue;
++
++ s3c_pm_save_gpio(ourchip);
++
++ S3C_PMDBG("%s: save %08x,%08x,%08x,%08x\n",
++ ourchip->chip.label,
++ ourchip->pm_save[0],
++ ourchip->pm_save[1],
++ ourchip->pm_save[2],
++ ourchip->pm_save[3]);
++
++ gpio_nr += ourchip->chip.ngpio;
++ gpio_nr += CONFIG_S3C_GPIO_SPACE;
++ }
++}
++
++/**
++ * s3c_pm_resume_gpio() - restore gpio chip data after suspend
++ * @ourchip: The suspended chip.
++ */
++static void s3c_pm_resume_gpio(struct s3c_gpio_chip *ourchip)
++{
++ struct s3c_gpio_pm *pm = ourchip->pm;
++
++ if (pm == NULL || pm->resume == NULL)
++ S3C_PMDBG("%s: no pm for %s\n", __func__, ourchip->chip.label);
++ else
++ pm->resume(ourchip);
++}
++
++void s3c_pm_restore_gpios(void)
++{
++ struct s3c_gpio_chip *ourchip;
++ unsigned int gpio_nr;
++
++ for (gpio_nr = 0; gpio_nr < S3C_GPIO_END; gpio_nr++) {
++ ourchip = s3c_gpiolib_getchip(gpio_nr);
++ if (!ourchip)
++ continue;
++
++ s3c_pm_resume_gpio(ourchip);
++
++ gpio_nr += ourchip->chip.ngpio;
++ gpio_nr += CONFIG_S3C_GPIO_SPACE;
++ }
++}
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/pwm.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/pwm.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/pwm.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/pwm.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,288 @@
++/*
++ * arch/arm/plat-s3c/pwm.c
++ *
++ * Copyright (c) by Javi Roman <javiroman@kernel-labs.org>
++ * for the Openmoko Project.
++ *
++ * S3C2410A SoC PWM support
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/clk.h>
++#include <linux/device.h>
++#include <mach/hardware.h>
++#include <plat/regs-timer.h>
++#include <plat/pwm.h>
++#include <asm/io.h>
++
++#ifdef CONFIG_PM
++ static unsigned long standby_reg_tcon;
++ static unsigned long standby_reg_tcfg0;
++ static unsigned long standby_reg_tcfg1;
++#endif
++
++int s3c2410_pwm_disable(struct s3c2410_pwm *pwm)
++{
++ unsigned long tcon;
++
++ /* stop timer */
++ tcon = __raw_readl(S3C2410_TCON);
++ tcon &= 0xffffff00;
++ __raw_writel(tcon, S3C2410_TCON);
++
++ clk_disable(pwm->pclk);
++ clk_put(pwm->pclk);
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(s3c2410_pwm_disable);
++
++int s3c2410_pwm_init(struct s3c2410_pwm *pwm)
++{
++ pwm->pclk = clk_get(NULL, "timers");
++ if (IS_ERR(pwm->pclk))
++ return PTR_ERR(pwm->pclk);
++
++ clk_enable(pwm->pclk);
++ pwm->pclk_rate = clk_get_rate(pwm->pclk);
++ return 0;
++}
++EXPORT_SYMBOL_GPL(s3c2410_pwm_init);
++
++int s3c2410_pwm_enable(struct s3c2410_pwm *pwm)
++{
++ unsigned long tcfg0, tcfg1, tcnt, tcmp;
++
++ /* control registers bits */
++ tcfg1 = __raw_readl(S3C2410_TCFG1);
++ tcfg0 = __raw_readl(S3C2410_TCFG0);
++
++ /* divider & scaler slection */
++ switch (pwm->timerid) {
++ case PWM0:
++ tcfg1 &= ~S3C2410_TCFG1_MUX0_MASK;
++ tcfg0 &= ~S3C2410_TCFG_PRESCALER0_MASK;
++ break;
++ case PWM1:
++ tcfg1 &= ~S3C2410_TCFG1_MUX1_MASK;
++ tcfg0 &= ~S3C2410_TCFG_PRESCALER0_MASK;
++ break;
++ case PWM2:
++ tcfg1 &= ~S3C2410_TCFG1_MUX2_MASK;
++ tcfg0 &= ~S3C2410_TCFG_PRESCALER1_MASK;
++ break;
++ case PWM3:
++ tcfg1 &= ~S3C2410_TCFG1_MUX3_MASK;
++ tcfg0 &= ~S3C2410_TCFG_PRESCALER1_MASK;
++ break;
++ case PWM4:
++ /* timer four is not capable of doing PWM */
++ break;
++ default:
++ clk_disable(pwm->pclk);
++ clk_put(pwm->pclk);
++ return -1;
++ }
++
++ /* divider & scaler values */
++ tcfg1 |= pwm->divider;
++ __raw_writel(tcfg1, S3C2410_TCFG1);
++
++ switch (pwm->timerid) {
++ case PWM0:
++ case PWM1:
++ tcfg0 |= pwm->prescaler;
++ __raw_writel(tcfg0, S3C2410_TCFG0);
++ break;
++ default:
++ if ((tcfg0 | pwm->prescaler) != tcfg0) {
++ printk(KERN_WARNING "not changing prescaler of PWM %u,"
++ " since it's shared with timer4 (clock tick)\n",
++ pwm->timerid);
++ }
++ break;
++ }
++
++ /* timer count and compare buffer initial values */
++ tcnt = pwm->counter;
++ tcmp = pwm->comparer;
++
++ __raw_writel(tcnt, S3C2410_TCNTB(pwm->timerid));
++ __raw_writel(tcmp, S3C2410_TCMPB(pwm->timerid));
++
++ /* ensure timer is stopped */
++ s3c2410_pwm_stop(pwm);
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(s3c2410_pwm_enable);
++
++int s3c2410_pwm_start(struct s3c2410_pwm *pwm)
++{
++ unsigned long tcon;
++
++ tcon = __raw_readl(S3C2410_TCON);
++
++ switch (pwm->timerid) {
++ case PWM0:
++ tcon |= S3C2410_TCON_T0START;
++ tcon &= ~S3C2410_TCON_T0MANUALUPD;
++ break;
++ case PWM1:
++ tcon |= S3C2410_TCON_T1START;
++ tcon &= ~S3C2410_TCON_T1MANUALUPD;
++ break;
++ case PWM2:
++ tcon |= S3C2410_TCON_T2START;
++ tcon &= ~S3C2410_TCON_T2MANUALUPD;
++ break;
++ case PWM3:
++ tcon |= S3C2410_TCON_T3START;
++ tcon &= ~S3C2410_TCON_T3MANUALUPD;
++ break;
++ case PWM4:
++ /* timer four is not capable of doing PWM */
++ default:
++ return -ENODEV;
++ }
++
++ __raw_writel(tcon, S3C2410_TCON);
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(s3c2410_pwm_start);
++
++int s3c2410_pwm_stop(struct s3c2410_pwm *pwm)
++{
++ unsigned long tcon;
++
++ tcon = __raw_readl(S3C2410_TCON);
++
++ switch (pwm->timerid) {
++ case PWM0:
++ tcon &= ~0x00000000;
++ tcon |= S3C2410_TCON_T0RELOAD;
++ tcon |= S3C2410_TCON_T0MANUALUPD;
++ break;
++ case PWM1:
++ tcon &= ~0x00000080;
++ tcon |= S3C2410_TCON_T1RELOAD;
++ tcon |= S3C2410_TCON_T1MANUALUPD;
++ break;
++ case PWM2:
++ tcon &= ~0x00000800;
++ tcon |= S3C2410_TCON_T2RELOAD;
++ tcon |= S3C2410_TCON_T2MANUALUPD;
++ break;
++ case PWM3:
++ tcon &= ~0x00008000;
++ tcon |= S3C2410_TCON_T3RELOAD;
++ tcon |= S3C2410_TCON_T3MANUALUPD;
++ break;
++ case PWM4:
++ /* timer four is not capable of doing PWM */
++ default:
++ return -ENODEV;
++ }
++
++ __raw_writel(tcon, S3C2410_TCON);
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(s3c2410_pwm_stop);
++
++int s3c2410_pwm_duty_cycle(int reg_value, struct s3c2410_pwm *pwm)
++{
++ __raw_writel(reg_value, S3C2410_TCMPB(pwm->timerid));
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(s3c2410_pwm_duty_cycle);
++
++int s3c2410_pwm_dumpregs(void)
++{
++ printk(KERN_INFO "TCON: %08lx, TCFG0: %08lx, TCFG1: %08lx\n",
++ (unsigned long) __raw_readl(S3C2410_TCON),
++ (unsigned long) __raw_readl(S3C2410_TCFG0),
++ (unsigned long) __raw_readl(S3C2410_TCFG1));
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(s3c2410_pwm_dumpregs);
++
++static int __init s3c24xx_pwm_probe(struct platform_device *pdev)
++{
++ struct s3c24xx_pwm_platform_data *pdata = pdev->dev.platform_data;
++
++ dev_info(&pdev->dev, "s3c24xx_pwm is registered \n");
++
++ /* if platform was interested, give him a chance to register
++ * platform devices that switch power with us as the parent
++ * at registration time -- ensures suspend / resume ordering
++ */
++ if (pdata)
++ if (pdata->attach_child_devices)
++ (pdata->attach_child_devices)(&pdev->dev);
++
++ return 0;
++}
++
++#ifdef CONFIG_PM
++static int s3c24xx_pwm_suspend(struct platform_device *pdev, pm_message_t state)
++{
++ /* PWM config should be kept in suspending */
++ standby_reg_tcon = __raw_readl(S3C2410_TCON);
++ standby_reg_tcfg0 = __raw_readl(S3C2410_TCFG0);
++ standby_reg_tcfg1 = __raw_readl(S3C2410_TCFG1);
++
++ return 0;
++}
++
++static int s3c24xx_pwm_resume(struct platform_device *pdev)
++{
++ __raw_writel(standby_reg_tcon, S3C2410_TCON);
++ __raw_writel(standby_reg_tcfg0, S3C2410_TCFG0);
++ __raw_writel(standby_reg_tcfg1, S3C2410_TCFG1);
++
++ return 0;
++}
++#else
++#define s3c24xx_pwm_suspend NULL
++#define s3c24xx_pwm_resume NULL
++#endif
++
++static struct platform_driver s3c24xx_pwm_driver = {
++ .driver = {
++ .name = "s3c24xx_pwm",
++ .owner = THIS_MODULE,
++ },
++ .probe = s3c24xx_pwm_probe,
++ .suspend = s3c24xx_pwm_suspend,
++ .resume = s3c24xx_pwm_resume,
++};
++
++static int __init s3c24xx_pwm_init(void)
++{
++ return platform_driver_register(&s3c24xx_pwm_driver);
++}
++
++static void __exit s3c24xx_pwm_exit(void)
++{
++}
++
++MODULE_AUTHOR("Javi Roman <javiroman@kernel-labs.org>");
++MODULE_LICENSE("GPL");
++
++module_init(s3c24xx_pwm_init);
++module_exit(s3c24xx_pwm_exit);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/time.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/time.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c/time.c 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c/time.c 2009-05-10 22:27:59.000000000 +0200
+@@ -97,7 +97,7 @@
+ * IRQs are disabled before entering here from do_gettimeofday()
+ */
+
+-static unsigned long s3c2410_gettimeoffset (void)
++unsigned long s3c2410_gettimeoffset (void)
+ {
+ unsigned long tdone;
+ unsigned long tval;
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/clock-dclk.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/clock-dclk.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/clock-dclk.c 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/clock-dclk.c 2009-05-10 22:27:59.000000000 +0200
+@@ -18,6 +18,7 @@
+
+ #include <mach/regs-clock.h>
+ #include <mach/regs-gpio.h>
++#include <mach/hardware.h>
+
+ #include <plat/clock.h>
+ #include <plat/cpu.h>
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/common-smdk.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/common-smdk.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/common-smdk.c 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/common-smdk.c 2009-05-10 22:27:59.000000000 +0200
+@@ -201,5 +201,5 @@
+
+ platform_add_devices(smdk_devs, ARRAY_SIZE(smdk_devs));
+
+- s3c2410_pm_init();
++ s3c_pm_init();
+ }
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/cpu.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/cpu.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/cpu.c 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/cpu.c 2009-05-10 22:27:59.000000000 +0200
+@@ -61,6 +61,7 @@
+ static const char name_s3c2412[] = "S3C2412";
+ static const char name_s3c2440[] = "S3C2440";
+ static const char name_s3c2442[] = "S3C2442";
++static const char name_s3c2442b[] = "S3C2442B";
+ static const char name_s3c2443[] = "S3C2443";
+ static const char name_s3c2410a[] = "S3C2410A";
+ static const char name_s3c2440a[] = "S3C2440A";
+@@ -112,6 +113,15 @@
+ .name = name_s3c2442
+ },
+ {
++ .idcode = 0x32440aab,
++ .idmask = 0xffffffff,
++ .map_io = s3c244x_map_io,
++ .init_clocks = s3c244x_init_clocks,
++ .init_uarts = s3c244x_init_uarts,
++ .init = s3c2442_init,
++ .name = name_s3c2442b
++ },
++ {
+ .idcode = 0x32412001,
+ .idmask = 0xffffffff,
+ .map_io = s3c2412_map_io,
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/devs.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/devs.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/devs.c 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/devs.c 2009-05-10 22:27:59.000000000 +0200
+@@ -26,6 +26,8 @@
+ #include <asm/mach/irq.h>
+ #include <mach/fb.h>
+ #include <mach/hardware.h>
++#include <mach/ts.h>
++#include <asm/io.h>
+ #include <asm/irq.h>
+
+ #include <plat/regs-serial.h>
+@@ -136,36 +138,6 @@
+ struct platform_device *s3c24xx_uart_devs[4] = {
+ };
+
+-/* USB Host Controller */
+-
+-static struct resource s3c_usb_resource[] = {
+- [0] = {
+- .start = S3C24XX_PA_USBHOST,
+- .end = S3C24XX_PA_USBHOST + S3C24XX_SZ_USBHOST - 1,
+- .flags = IORESOURCE_MEM,
+- },
+- [1] = {
+- .start = IRQ_USBH,
+- .end = IRQ_USBH,
+- .flags = IORESOURCE_IRQ,
+- }
+-};
+-
+-static u64 s3c_device_usb_dmamask = 0xffffffffUL;
+-
+-struct platform_device s3c_device_usb = {
+- .name = "s3c2410-ohci",
+- .id = -1,
+- .num_resources = ARRAY_SIZE(s3c_usb_resource),
+- .resource = s3c_usb_resource,
+- .dev = {
+- .dma_mask = &s3c_device_usb_dmamask,
+- .coherent_dma_mask = 0xffffffffUL
+- }
+-};
+-
+-EXPORT_SYMBOL(s3c_device_usb);
+-
+ /* LCD Controller */
+
+ static struct resource s3c_lcd_resource[] = {
+@@ -229,6 +201,24 @@
+
+ EXPORT_SYMBOL(s3c_device_nand);
+
++/* Touchscreen */
++struct platform_device s3c_device_ts = {
++ .name = "s3c2410-ts",
++ .id = -1,
++};
++
++EXPORT_SYMBOL(s3c_device_ts);
++
++static struct s3c2410_ts_mach_info s3c2410ts_info;
++
++void set_s3c2410ts_info(const struct s3c2410_ts_mach_info *hard_s3c2410ts_info)
++{
++ memcpy(&s3c2410ts_info, hard_s3c2410ts_info,
++ sizeof(struct s3c2410_ts_mach_info));
++ s3c_device_ts.dev.platform_data = &s3c2410ts_info;
++}
++EXPORT_SYMBOL(set_s3c2410ts_info);
++
+ /* USB Device (Gadget)*/
+
+ static struct resource s3c_usbgadget_resource[] = {
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/dma.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/dma.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/dma.c 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/dma.c 2009-05-10 22:27:59.000000000 +0200
+@@ -31,10 +31,11 @@
+ #include <asm/irq.h>
+ #include <mach/hardware.h>
+ #include <mach/dma.h>
+-
+ #include <mach/map.h>
+
+-#include <plat/dma.h>
++#include <plat/dma-core.h>
++#include <plat/regs-dma.h>
++#include <plat/dma-plat.h>
+
+ /* io map for dma */
+ static void __iomem *dma_base;
+@@ -44,8 +45,6 @@
+
+ static struct s3c24xx_dma_selection dma_sel;
+
+-/* dma channel state information */
+-struct s3c2410_dma_chan s3c2410_chans[S3C2410_DMA_CHANNELS];
+
+ /* debugging functions */
+
+@@ -135,21 +134,6 @@
+ #define dbg_showchan(chan) do { } while(0)
+ #endif /* CONFIG_S3C2410_DMA_DEBUG */
+
+-static struct s3c2410_dma_chan *dma_chan_map[DMACH_MAX];
+-
+-/* lookup_dma_channel
+- *
+- * change the dma channel number given into a real dma channel id
+-*/
+-
+-static struct s3c2410_dma_chan *lookup_dma_channel(unsigned int channel)
+-{
+- if (channel & DMACH_LOW_LEVEL)
+- return &s3c2410_chans[channel & ~DMACH_LOW_LEVEL];
+- else
+- return dma_chan_map[channel];
+-}
+-
+ /* s3c2410_dma_stats_timeout
+ *
+ * Update DMA stats from timeout info
+@@ -214,8 +198,6 @@
+ return 0;
+ }
+
+-
+-
+ /* s3c2410_dma_loadbuffer
+ *
+ * load a buffer, and update the channel state
+@@ -453,7 +435,7 @@
+ int s3c2410_dma_enqueue(unsigned int channel, void *id,
+ dma_addr_t data, int size)
+ {
+- struct s3c2410_dma_chan *chan = lookup_dma_channel(channel);
++ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
+ struct s3c2410_dma_buf *buf;
+ unsigned long flags;
+
+@@ -804,7 +786,7 @@
+
+ int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *client)
+ {
+- struct s3c2410_dma_chan *chan = lookup_dma_channel(channel);
++ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
+ unsigned long flags;
+
+ if (chan == NULL)
+@@ -836,7 +818,7 @@
+ chan->irq_claimed = 0;
+
+ if (!(channel & DMACH_LOW_LEVEL))
+- dma_chan_map[channel] = NULL;
++ s3c_dma_chan_map[channel] = NULL;
+
+ local_irq_restore(flags);
+
+@@ -995,7 +977,7 @@
+ int
+ s3c2410_dma_ctrl(unsigned int channel, enum s3c2410_chan_op op)
+ {
+- struct s3c2410_dma_chan *chan = lookup_dma_channel(channel);
++ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
+
+ if (chan == NULL)
+ return -EINVAL;
+@@ -1038,14 +1020,13 @@
+ /* s3c2410_dma_config
+ *
+ * xfersize: size of unit in bytes (1,2,4)
+- * dcon: base value of the DCONx register
+ */
+
+ int s3c2410_dma_config(unsigned int channel,
+- int xferunit,
+- int dcon)
++ int xferunit)
+ {
+- struct s3c2410_dma_chan *chan = lookup_dma_channel(channel);
++ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
++ unsigned int dcon;
+
+ pr_debug("%s: chan=%d, xfer_unit=%d, dcon=%08x\n",
+ __func__, channel, xferunit, dcon);
+@@ -1055,10 +1036,33 @@
+
+ pr_debug("%s: Initial dcon is %08x\n", __func__, dcon);
+
+- dcon |= chan->dcon & dma_sel.dcon_mask;
++ dcon = chan->dcon & dma_sel.dcon_mask;
+
+ pr_debug("%s: New dcon is %08x\n", __func__, dcon);
+
++ switch (chan->req_ch) {
++ case DMACH_I2S_IN:
++ case DMACH_I2S_OUT:
++ case DMACH_PCM_IN:
++ case DMACH_PCM_OUT:
++ case DMACH_MIC_IN:
++ default:
++ dcon |= S3C2410_DCON_HANDSHAKE;
++ dcon |= S3C2410_DCON_SYNC_PCLK;
++ break;
++
++ case DMACH_SDI:
++ /* note, ensure if need HANDSHAKE or not */
++ dcon |= S3C2410_DCON_SYNC_PCLK;
++ break;
++
++ case DMACH_XD0:
++ case DMACH_XD1:
++ dcon |= S3C2410_DCON_HANDSHAKE;
++ dcon |= S3C2410_DCON_SYNC_HCLK;
++ break;
++ }
++
+ switch (xferunit) {
+ case 1:
+ dcon |= S3C2410_DCON_BYTE;
+@@ -1089,10 +1093,10 @@
+ }
+
+ EXPORT_SYMBOL(s3c2410_dma_config);
+-
++#if 0 /* moved to plat-s3c? */
+ int s3c2410_dma_setflags(unsigned int channel, unsigned int flags)
+ {
+- struct s3c2410_dma_chan *chan = lookup_dma_channel(channel);
++ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
+
+ if (chan == NULL)
+ return -EINVAL;
+@@ -1105,43 +1109,7 @@
+ }
+
+ EXPORT_SYMBOL(s3c2410_dma_setflags);
+-
+-
+-/* do we need to protect the settings of the fields from
+- * irq?
+-*/
+-
+-int s3c2410_dma_set_opfn(unsigned int channel, s3c2410_dma_opfn_t rtn)
+-{
+- struct s3c2410_dma_chan *chan = lookup_dma_channel(channel);
+-
+- if (chan == NULL)
+- return -EINVAL;
+-
+- pr_debug("%s: chan=%p, op rtn=%p\n", __func__, chan, rtn);
+-
+- chan->op_fn = rtn;
+-
+- return 0;
+-}
+-
+-EXPORT_SYMBOL(s3c2410_dma_set_opfn);
+-
+-int s3c2410_dma_set_buffdone_fn(unsigned int channel, s3c2410_dma_cbfn_t rtn)
+-{
+- struct s3c2410_dma_chan *chan = lookup_dma_channel(channel);
+-
+- if (chan == NULL)
+- return -EINVAL;
+-
+- pr_debug("%s: chan=%p, callback rtn=%p\n", __func__, chan, rtn);
+-
+- chan->callback_fn = rtn;
+-
+- return 0;
+-}
+-
+-EXPORT_SYMBOL(s3c2410_dma_set_buffdone_fn);
++#endif
+
+ /* s3c2410_dma_devconfig
+ *
+@@ -1150,29 +1118,38 @@
+ * source: S3C2410_DMASRC_HW: source is hardware
+ * S3C2410_DMASRC_MEM: source is memory
+ *
+- * hwcfg: the value for xxxSTCn register,
+- * bit 0: 0=increment pointer, 1=leave pointer
+- * bit 1: 0=source is AHB, 1=source is APB
+- *
+ * devaddr: physical address of the source
+ */
+
+ int s3c2410_dma_devconfig(int channel,
+ enum s3c2410_dmasrc source,
+- int hwcfg,
+ unsigned long devaddr)
+ {
+- struct s3c2410_dma_chan *chan = lookup_dma_channel(channel);
++ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
++ unsigned int hwcfg;
+
+ if (chan == NULL)
+ return -EINVAL;
+
+- pr_debug("%s: source=%d, hwcfg=%08x, devaddr=%08lx\n",
+- __func__, (int)source, hwcfg, devaddr);
++ pr_debug("%s: source=%d, devaddr=%08lx\n",
++ __func__, (int)source, devaddr);
+
+ chan->source = source;
+ chan->dev_addr = devaddr;
+- chan->hw_cfg = hwcfg;
++
++ switch (chan->req_ch) {
++ case DMACH_XD0:
++ case DMACH_XD1:
++ hwcfg = 0; /* AHB */
++ break;
++
++ default:
++ hwcfg = S3C2410_DISRCC_APB;
++ }
++
++ /* always assume our peripheral desintation is a fixed
++ * address in memory. */
++ hwcfg |= S3C2410_DISRCC_INC;
+
+ switch (source) {
+ case S3C2410_DMASRC_HW:
+@@ -1219,7 +1196,7 @@
+
+ int s3c2410_dma_getposition(unsigned int channel, dma_addr_t *src, dma_addr_t *dst)
+ {
+- struct s3c2410_dma_chan *chan = lookup_dma_channel(channel);
++ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
+
+ if (chan == NULL)
+ return -EINVAL;
+@@ -1278,8 +1255,8 @@
+
+ printk(KERN_INFO "dma%d: restoring configuration\n", cp->number);
+
+- s3c2410_dma_config(no, cp->xfer_unit, cp->dcon);
+- s3c2410_dma_devconfig(no, cp->source, cp->hw_cfg, cp->dev_addr);
++ s3c2410_dma_config(no, cp->xfer_unit);
++ s3c2410_dma_devconfig(no, cp->source, cp->dev_addr);
+
+ /* re-select the dma source for this channel */
+
+@@ -1476,7 +1453,8 @@
+ found:
+ dmach = &s3c2410_chans[ch];
+ dmach->map = ch_map;
+- dma_chan_map[channel] = dmach;
++ dmach->req_ch = channel;
++ s3c_dma_chan_map[channel] = dmach;
+
+ /* select the channel */
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/gpio.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/gpio.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/gpio.c 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/gpio.c 2009-05-10 22:27:59.000000000 +0200
+@@ -32,6 +32,7 @@
+ #include <asm/irq.h>
+
+ #include <mach/regs-gpio.h>
++#include <mach/regs-gpioj.h>
+
+ void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function)
+ {
+@@ -215,3 +216,423 @@
+ }
+
+ EXPORT_SYMBOL(s3c2410_gpio_irq2pin);
++
++static void pretty_dump(u32 cfg, u32 state, u32 pull,
++ const char ** function_names_2,
++ const char ** function_names_3,
++ const char * prefix,
++ int count)
++{
++ int n;
++ const char *tag_type = NULL,
++ *tag_state = NULL,
++ *tag_pulldown = NULL,
++ * level0 = "0",
++ * level1 = "1";
++
++ for (n = 0; n < count; n++) {
++ switch ((cfg >> (2 * n)) & 3) {
++ case 0:
++ tag_type = "input ";
++ break;
++ case 1:
++ tag_type = "OUTPUT ";
++ break;
++ case 2:
++ if (function_names_2) {
++ if (function_names_2[n])
++ tag_type = function_names_2[n];
++ else
++ tag_type = "*** ILLEGAL CFG (2) *** ";
++ } else
++ tag_type = "(function) ";
++ break;
++ default:
++ if (function_names_3) {
++ if (function_names_3[n])
++ tag_type = function_names_3[n];
++ else
++ tag_type = "*** ILLEGAL CFG (3) *** ";
++ } else
++ tag_type = "(function) ";
++ break;
++ }
++ if ((state >> n) & 1)
++ tag_state = level1;
++ else
++ tag_state = level0;
++
++ if (((pull >> n) & 1))
++ tag_pulldown = "";
++ else
++ tag_pulldown = "(pulldown)";
++
++ printk(KERN_INFO"%s%02d: %s %s %s\n", prefix, n, tag_type,
++ tag_state, tag_pulldown);
++ }
++ printk(KERN_INFO"\n");
++}
++
++static void pretty_dump_a(u32 cfg, u32 state,
++ const char ** function_names,
++ const char * prefix,
++ int count)
++{
++ int n;
++ const char *tag_type = NULL,
++ *tag_state = NULL,
++ * level0 = "0",
++ * level1 = "1";
++
++ for (n = 0; n < count; n++) {
++ switch ((cfg >> n) & 1) {
++ case 0:
++ tag_type = "OUTPUT ";
++ break;
++ default:
++ if (function_names) {
++ if (function_names[n])
++ tag_type = function_names[n];
++ else
++ tag_type = "*** ILLEGAL CFG *** ";
++ } else
++ tag_type = "(function) ";
++ break;
++ }
++ if ((state >> n) & 1)
++ tag_state = level1;
++ else
++ tag_state = level0;
++
++ printk(KERN_INFO"%s%02d: %s %s\n", prefix, n, tag_type,
++ tag_state);
++ }
++ printk(KERN_INFO"\n");
++}
++
++static const char * funcs_a[] = {
++ "ADDR0 ",
++ "ADDR16 ",
++ "ADDR17 ",
++ "ADDR18 ",
++ "ADDR19 ",
++ "ADDR20 ",
++ "ADDR21 ",
++ "ADDR22 ",
++ "ADDR23 ",
++ "ADDR24 ",
++ "ADDR25 ",
++ "ADDR26 ",
++ "nGCS[1] ",
++ "nGCS[2] ",
++ "nGCS[3] ",
++ "nGCS[4] ",
++ "nGCS[5] ",
++ "CLE ",
++ "ALE ",
++ "nFWE ",
++ "nFRE ",
++ "nRSTOUT ",
++ "nFCE ",
++ NULL,
++ NULL
++};
++
++
++static const char * funcs_b2[] = {
++ "TOUT0 ",
++ "TOUT1 ",
++ "TOUT2 ",
++ "TOUT3 ",
++ "TCLK[0] ",
++ "nXBACK ",
++ "nXBREQ ",
++ "nXDACK1 ",
++ "nXDREQ1 ",
++ "nXDACK0 ",
++ "nXDREQ0 ",
++};
++static const char * funcs_b3[] = {
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++};
++
++static const char * funcs_c2[] = {
++ "LEND ",
++ "VCLK ",
++ "VLINE ",
++ "VFRAME ",
++ "VM ",
++ "LCD_LPCOE ",
++ "LCD_LPCREV ",
++ "LCD_LPCREVB",
++ "VD[0] ",
++ "VD[1] ",
++ "VD[2] ",
++ "VD[3] ",
++ "VD[4] ",
++ "VD[5] ",
++ "VD[6] ",
++ "VD[7] ",
++};
++static const char * funcs_c3[] = {
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ "I2SSDI ",
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++};
++
++static const char * funcs_d2[] = {
++ "VD[8] ",
++ "VD[9] ",
++ "VD[10] ",
++ "VD[11] ",
++ "VD[12] ",
++ "VD[13] ",
++ "VD[14] ",
++ "VD[15] ",
++ "VD[16] ",
++ "VD[17] ",
++ "VD[18] ",
++ "VD[19] ",
++ "VD[20] ",
++ "VD[21] ",
++ "VD[22] ",
++ "VD[23] ",
++};
++static const char * funcs_d3[] = {
++ "nSPICS1 ",
++ "SPICLK1 ",
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ "SPIMISO1 ",
++ "SPIMOSI1 ",
++ "SPICLK1 ",
++ NULL,
++ NULL,
++ NULL,
++ "nSS1 ",
++ "nSS0 ",
++};
++
++static const char * funcs_e2[] = {
++ "I2SLRCK ",
++ "I2SSCLK ",
++ "CDCLK ",
++ "I2SDI ",
++ "I2SDO ",
++ "SDCLK ",
++ "SDCMD ",
++ "SDDAT0 ",
++ "SDDAT1 ",
++ "SDDAT2 ",
++ "SDDAT3 ",
++ "SPIMISO0 ",
++ "SPIMOSI0 ",
++ "SPICLK0 ",
++ "IICSCL ",
++ "IICSDA ",
++};
++static const char * funcs_e3[] = {
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++};
++
++static const char * funcs_f2[] = {
++ "EINT[0] ",
++ "EINT[1] ",
++ "EINT[2] ",
++ "EINT[3] ",
++ "EINT[4] ",
++ "EINT[5] ",
++ "EINT[6] ",
++ "EINT[7] ",
++};
++static const char * funcs_f3[] = {
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++};
++
++
++static const char * funcs_g2[] = {
++ "EINT[8] ",
++ "EINT[9] ",
++ "EINT[10] ",
++ "EINT[11] ",
++ "EINT[12] ",
++ "EINT[13] ",
++ "EINT[14] ",
++ "EINT[15] ",
++ "EINT[16] ",
++ "EINT[17] ",
++ "EINT[18] ",
++ "EINT[19] ",
++ "EINT[20] ",
++ "EINT[21] ",
++ "EINT[22] ",
++ "EINT[23] ",
++};
++static const char * funcs_g3[] = {
++ NULL,
++ NULL,
++ "nSS0 ",
++ "nSS1 ",
++ "LCD_PWRDN ",
++ "SPIMISO1 ",
++ "SPIMOSI1 ",
++ "SPICLK1 ",
++ NULL,
++ "nRTS1 ",
++ "nCTS1 ",
++ "TCLK[1] ",
++ "nSPICS0 ",
++ NULL,
++ NULL,
++ NULL,
++};
++
++static const char * funcs_h2[] = {
++ "nCTS0 ",
++ "nRTS0 ",
++ "TXD[0] ",
++ "RXD[0] ",
++ "TXD[1] ",
++ "RXD[1] ",
++ "TXD[2] ",
++ "RXD[2] ",
++ "UEXTCLK ",
++ "CLKOUT0 ",
++ "CLKOUT1 ",
++};
++static const char * funcs_h3[] = {
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ "nRTS1 ",
++ "nCTS1 ",
++ NULL,
++ "nSPICS0 ",
++ NULL,
++};
++
++static const char * funcs_j2[] = {
++ "CAMDATA[0] ",
++ "CAMDATA[1] ",
++ "CAMDATA[2] ",
++ "CAMDATA[3] ",
++ "CAMDATA[4] ",
++ "CAMDATA[5] ",
++ "CAMDATA[6] ",
++ "CAMDATA[7] ",
++ "CAMPCLK ",
++ "CAMVSYNC ",
++ "CAMHREF ",
++ "CAMCLKOUT ",
++ "CAMRESET ",
++};
++static const char * funcs_j3[] = {
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++};
++
++/* used to dump GPIO states at suspend */
++void s3c24xx_dump_gpio_states(void)
++{
++ pretty_dump_a(__raw_readl(S3C2410_GPACON),
++ __raw_readl(S3C2410_GPADAT),
++ funcs_a, "GPA", 25);
++ pretty_dump(__raw_readl(S3C2410_GPBCON),
++ __raw_readl(S3C2410_GPBDAT),
++ __raw_readl(S3C2410_GPBUP),
++ funcs_b2, funcs_b3, "GPB", 11);
++ pretty_dump(__raw_readl(S3C2410_GPCCON),
++ __raw_readl(S3C2410_GPCDAT),
++ __raw_readl(S3C2410_GPCUP),
++ funcs_c2, funcs_c3, "GPC", 16);
++ pretty_dump(__raw_readl(S3C2410_GPDCON),
++ __raw_readl(S3C2410_GPDDAT),
++ __raw_readl(S3C2410_GPDUP),
++ funcs_d2, funcs_d3, "GPD", 16);
++ pretty_dump(__raw_readl(S3C2410_GPECON),
++ __raw_readl(S3C2410_GPEDAT),
++ __raw_readl(S3C2410_GPEUP),
++ funcs_e2, funcs_e3, "GPE", 16);
++ pretty_dump(__raw_readl(S3C2410_GPFCON),
++ __raw_readl(S3C2410_GPFDAT),
++ __raw_readl(S3C2410_GPFUP),
++ funcs_f2, funcs_f3, "GPF", 8);
++ pretty_dump(__raw_readl(S3C2410_GPGCON),
++ __raw_readl(S3C2410_GPGDAT),
++ __raw_readl(S3C2410_GPGUP),
++ funcs_g2, funcs_g3, "GPG", 16);
++ pretty_dump(__raw_readl(S3C2410_GPHCON),
++ __raw_readl(S3C2410_GPHDAT),
++ __raw_readl(S3C2410_GPHUP),
++ funcs_h2, funcs_h3, "GPH", 11);
++ pretty_dump(__raw_readl(S3C2440_GPJCON),
++ __raw_readl(S3C2440_GPJDAT),
++ __raw_readl(S3C2440_GPJUP),
++ funcs_j2, funcs_j3, "GPJ", 13);
++
++}
++EXPORT_SYMBOL(s3c24xx_dump_gpio_states);
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/gpiolib.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/gpiolib.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/gpiolib.c 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/gpiolib.c 2009-05-10 22:27:59.000000000 +0200
+@@ -22,6 +22,7 @@
+ #include <plat/gpio-core.h>
+ #include <mach/hardware.h>
+ #include <asm/irq.h>
++#include <plat/pm.h>
+
+ #include <mach/regs-gpio.h>
+
+@@ -78,6 +79,7 @@
+ struct s3c_gpio_chip s3c24xx_gpios[] = {
+ [0] = {
+ .base = S3C24XX_GPIO_BASE(S3C2410_GPA0),
++ .pm = __gpio_pm(&s3c_gpio_pm_1bit),
+ .chip = {
+ .base = S3C2410_GPA0,
+ .owner = THIS_MODULE,
+@@ -89,6 +91,7 @@
+ },
+ [1] = {
+ .base = S3C24XX_GPIO_BASE(S3C2410_GPB0),
++ .pm = __gpio_pm(&s3c_gpio_pm_2bit),
+ .chip = {
+ .base = S3C2410_GPB0,
+ .owner = THIS_MODULE,
+@@ -98,6 +101,7 @@
+ },
+ [2] = {
+ .base = S3C24XX_GPIO_BASE(S3C2410_GPC0),
++ .pm = __gpio_pm(&s3c_gpio_pm_2bit),
+ .chip = {
+ .base = S3C2410_GPC0,
+ .owner = THIS_MODULE,
+@@ -107,6 +111,7 @@
+ },
+ [3] = {
+ .base = S3C24XX_GPIO_BASE(S3C2410_GPD0),
++ .pm = __gpio_pm(&s3c_gpio_pm_2bit),
+ .chip = {
+ .base = S3C2410_GPD0,
+ .owner = THIS_MODULE,
+@@ -116,6 +121,7 @@
+ },
+ [4] = {
+ .base = S3C24XX_GPIO_BASE(S3C2410_GPE0),
++ .pm = __gpio_pm(&s3c_gpio_pm_2bit),
+ .chip = {
+ .base = S3C2410_GPE0,
+ .label = "GPIOE",
+@@ -125,6 +131,7 @@
+ },
+ [5] = {
+ .base = S3C24XX_GPIO_BASE(S3C2410_GPF0),
++ .pm = __gpio_pm(&s3c_gpio_pm_2bit),
+ .chip = {
+ .base = S3C2410_GPF0,
+ .owner = THIS_MODULE,
+@@ -135,12 +142,23 @@
+ },
+ [6] = {
+ .base = S3C24XX_GPIO_BASE(S3C2410_GPG0),
++ .pm = __gpio_pm(&s3c_gpio_pm_2bit),
+ .chip = {
+ .base = S3C2410_GPG0,
+ .owner = THIS_MODULE,
+ .label = "GPIOG",
+- .ngpio = 10,
+ .to_irq = s3c24xx_gpiolib_bankg_toirq,
++ .ngpio = 16,
++ },
++ },
++ [7] = {
++ .base = S3C24XX_GPIO_BASE(S3C2410_GPH0),
++ .pm = __gpio_pm(&s3c_gpio_pm_2bit),
++ .chip = {
++ .base = S3C2410_GPH0,
++ .owner = THIS_MODULE,
++ .label = "GPIOH",
++ .ngpio = 11,
+ },
+ },
+ };
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/gta02_pm_wlan.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/gta02_pm_wlan.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/gta02_pm_wlan.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/gta02_pm_wlan.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,222 @@
++/*
++ * GTA02 WLAN power management
++ *
++ * (C) 2008, 2009 by Openmoko Inc.
++ * Author: Andy Green <andy@openmoko.com>
++ * All rights reserved.
++ *
++ * 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
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/mutex.h>
++#include <linux/platform_device.h>
++
++#include <mach/hardware.h>
++#include <asm/mach-types.h>
++#include <asm/plat-s3c24xx/neo1973.h>
++
++#include <mach/gta02.h>
++#include <mach/gta02-pm-wlan.h>
++#include <mach/regs-gpio.h>
++#include <mach/regs-gpioj.h>
++
++#include <linux/delay.h>
++#include <linux/rfkill.h>
++
++
++/* ----- Module hardware reset ("power") ----------------------------------- */
++
++
++void gta02_wlan_reset(int assert_reset)
++{
++ if (assert_reset) {
++ s3c2410_gpio_setpin(GTA02_GPIO_nWLAN_RESET, 0);
++ msleep(200); /* probably excessive but we don't have specs */
++ } else {
++ s3c2410_gpio_setpin(GTA02_GPIO_nWLAN_RESET, 1);
++ }
++}
++
++#ifdef CONFIG_PM
++static int gta02_wlan_suspend(struct platform_device *pdev, pm_message_t state)
++{
++ dev_dbg(&pdev->dev, "suspending\n");
++
++ return 0;
++}
++
++static int gta02_wlan_resume(struct platform_device *pdev)
++{
++ dev_dbg(&pdev->dev, "resuming\n");
++
++ return 0;
++}
++#else
++#define gta02_wlan_suspend NULL
++#define gta02_wlan_resume NULL
++#endif
++
++
++/* ----- rfkill ------------------------------------------------------------ */
++
++/*
++ * S3C MCI handles suspend/resume through device removal/insertion. In order to
++ * preserve rfkill state, as required in clause 7 of section 3.1 in rfkill.txt,
++ * we therefore need to maintain rfkill state outside the driver.
++ *
++ * This platform driver is as good a place as any other.
++ */
++
++static int (*gta02_wlan_rfkill_cb)(void *user, int on);
++static void *gta02_wlan_rfkill_user;
++static DEFINE_MUTEX(gta02_wlan_rfkill_lock);
++static int gta02_wlan_rfkill_on;
++
++
++/*
++ * gta02_wlan_query_rfkill_lock is used to obtain the rfkill state before the
++ * driver is ready to process rfkill callbacks. To prevent the state from
++ * changing until the driver has completed its initialization, we grab and hold
++ * the rfkill lock.
++ *
++ * A call to gta02_wlan_query_rfkill_lock must be followed by either
++ * - a call to gta02_wlan_set_rfkill_cb, to complete the setup, or
++ * - a call to gta02_wlan_query_rfkill_unlock to abort the setup process.
++ */
++
++int gta02_wlan_query_rfkill_lock(void)
++{
++ mutex_lock(&gta02_wlan_rfkill_lock);
++ return gta02_wlan_rfkill_on;
++}
++EXPORT_SYMBOL_GPL(gta02_wlan_query_rfkill_lock);
++
++void gta02_wlan_query_rfkill_unlock(void)
++{
++ mutex_unlock(&gta02_wlan_rfkill_lock);
++}
++EXPORT_SYMBOL_GPL(gta02_wlan_query_rfkill_unlock);
++
++
++void gta02_wlan_set_rfkill_cb(int (*cb)(void *user, int on), void *user)
++{
++ BUG_ON(!mutex_is_locked(&gta02_wlan_rfkill_lock));
++ BUG_ON(gta02_wlan_rfkill_cb);
++ gta02_wlan_rfkill_cb = cb;
++ gta02_wlan_rfkill_user = user;
++ mutex_unlock(&gta02_wlan_rfkill_lock);
++}
++EXPORT_SYMBOL_GPL(gta02_wlan_set_rfkill_cb);
++
++void gta02_wlan_clear_rfkill_cb(void)
++{
++ mutex_lock(&gta02_wlan_rfkill_lock);
++ BUG_ON(!gta02_wlan_rfkill_cb);
++ gta02_wlan_rfkill_cb = NULL;
++ mutex_unlock(&gta02_wlan_rfkill_lock);
++}
++EXPORT_SYMBOL_GPL(gta02_wlan_clear_rfkill_cb);
++
++static int gta02_wlan_toggle_radio(void *data, enum rfkill_state state)
++{
++ struct device *dev = data;
++ int on = state == RFKILL_STATE_UNBLOCKED;
++ int res = 0;
++
++ dev_dbg(dev, "gta02_wlan_toggle_radio: state %d (%p)\n",
++ state, gta02_wlan_rfkill_cb);
++ mutex_lock(&gta02_wlan_rfkill_lock);
++ if (gta02_wlan_rfkill_cb)
++ res = gta02_wlan_rfkill_cb(gta02_wlan_rfkill_user, on);
++ if (!res)
++ gta02_wlan_rfkill_on = on;
++ mutex_unlock(&gta02_wlan_rfkill_lock);
++ return res;
++}
++
++
++/* ----- Initialization/removal -------------------------------------------- */
++
++
++static int __init gta02_wlan_probe(struct platform_device *pdev)
++{
++ /* default-on for now */
++ const int default_state = 1;
++ struct rfkill *rfkill;
++ int error;
++
++ if (!machine_is_neo1973_gta02())
++ return -EINVAL;
++
++ dev_info(&pdev->dev, "starting\n");
++
++ s3c2410_gpio_cfgpin(GTA02_GPIO_nWLAN_RESET, S3C2410_GPIO_OUTPUT);
++ gta02_wlan_reset(1);
++ gta02_wlan_reset(0);
++
++ rfkill = rfkill_allocate(&pdev->dev, RFKILL_TYPE_WLAN);
++ rfkill->name = "ar6000";
++ rfkill->data = &pdev->dev;
++ rfkill->state = default_state ? RFKILL_STATE_ON : RFKILL_STATE_OFF;
++ /*
++ * If the WLAN driver somehow managed to get activated before we're
++ * ready, the driver is now in an unknown state, which isn't something
++ * we're prepared to handle. This can't happen, so just fail hard.
++ */
++ BUG_ON(gta02_wlan_rfkill_cb);
++ gta02_wlan_rfkill_on = default_state;
++ rfkill->toggle_radio = gta02_wlan_toggle_radio;
++
++ error = rfkill_register(rfkill);
++ if (error) {
++ rfkill_free(rfkill);
++ return error;
++ }
++
++ dev_set_drvdata(&pdev->dev, rfkill);
++
++ return 0;
++}
++
++static int gta02_wlan_remove(struct platform_device *pdev)
++{
++ struct rfkill *rfkill = dev_get_drvdata(&pdev->dev);
++
++ rfkill_unregister(rfkill);
++ rfkill_free(rfkill);
++
++ return 0;
++}
++
++static struct platform_driver gta02_wlan_driver = {
++ .probe = gta02_wlan_probe,
++ .remove = gta02_wlan_remove,
++ .suspend = gta02_wlan_suspend,
++ .resume = gta02_wlan_resume,
++ .driver = {
++ .name = "gta02-pm-wlan",
++ },
++};
++
++static int __devinit gta02_wlan_init(void)
++{
++ return platform_driver_register(&gta02_wlan_driver);
++}
++
++static void gta02_wlan_exit(void)
++{
++ platform_driver_unregister(&gta02_wlan_driver);
++}
++
++module_init(gta02_wlan_init);
++module_exit(gta02_wlan_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Andy Green <andy@openmoko.com>");
++MODULE_DESCRIPTION("Openmoko GTA02 WLAN power management");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/include/plat/dma.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/include/plat/dma.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/include/plat/dma.h 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/include/plat/dma.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,82 +0,0 @@
+-/* linux/include/asm-arm/plat-s3c24xx/dma.h
+- *
+- * Copyright (C) 2006 Simtec Electronics
+- * Ben Dooks <ben@simtec.co.uk>
+- *
+- * Samsung S3C24XX DMA support
+- *
+- * 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.
+-*/
+-
+-extern struct sysdev_class dma_sysclass;
+-extern struct s3c2410_dma_chan s3c2410_chans[S3C2410_DMA_CHANNELS];
+-
+-#define DMA_CH_VALID (1<<31)
+-#define DMA_CH_NEVER (1<<30)
+-
+-struct s3c24xx_dma_addr {
+- unsigned long from;
+- unsigned long to;
+-};
+-
+-/* struct s3c24xx_dma_map
+- *
+- * this holds the mapping information for the channel selected
+- * to be connected to the specified device
+-*/
+-
+-struct s3c24xx_dma_map {
+- const char *name;
+- struct s3c24xx_dma_addr hw_addr;
+-
+- unsigned long channels[S3C2410_DMA_CHANNELS];
+- unsigned long channels_rx[S3C2410_DMA_CHANNELS];
+-};
+-
+-struct s3c24xx_dma_selection {
+- struct s3c24xx_dma_map *map;
+- unsigned long map_size;
+- unsigned long dcon_mask;
+-
+- void (*select)(struct s3c2410_dma_chan *chan,
+- struct s3c24xx_dma_map *map);
+-
+- void (*direction)(struct s3c2410_dma_chan *chan,
+- struct s3c24xx_dma_map *map,
+- enum s3c2410_dmasrc dir);
+-};
+-
+-extern int s3c24xx_dma_init_map(struct s3c24xx_dma_selection *sel);
+-
+-/* struct s3c24xx_dma_order_ch
+- *
+- * channel map for one of the `enum dma_ch` dma channels. the list
+- * entry contains a set of low-level channel numbers, orred with
+- * DMA_CH_VALID, which are checked in the order in the array.
+-*/
+-
+-struct s3c24xx_dma_order_ch {
+- unsigned int list[S3C2410_DMA_CHANNELS]; /* list of channels */
+- unsigned int flags; /* flags */
+-};
+-
+-/* struct s3c24xx_dma_order
+- *
+- * information provided by either the core or the board to give the
+- * dma system a hint on how to allocate channels
+-*/
+-
+-struct s3c24xx_dma_order {
+- struct s3c24xx_dma_order_ch channels[DMACH_MAX];
+-};
+-
+-extern int s3c24xx_dma_order_set(struct s3c24xx_dma_order *map);
+-
+-/* DMA init code, called from the cpu support code */
+-
+-extern int s3c2410_dma_init(void);
+-
+-extern int s3c24xx_dma_init(unsigned int channels, unsigned int irq,
+- unsigned int stride);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/include/plat/dma-plat.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/include/plat/dma-plat.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/include/plat/dma-plat.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/include/plat/dma-plat.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,84 @@
++/* linux/arch/arm/plat-s3c24xx/include/plat/dma-plat.h
++ *
++ * Copyright (C) 2006 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ *
++ * Samsung S3C24XX DMA support
++ *
++ * 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.
++*/
++
++#include <plat/dma-core.h>
++
++extern struct sysdev_class dma_sysclass;
++extern struct s3c2410_dma_chan s3c2410_chans[S3C_DMA_CHANNELS];
++
++#define DMA_CH_VALID (1<<31)
++#define DMA_CH_NEVER (1<<30)
++
++struct s3c24xx_dma_addr {
++ unsigned long from;
++ unsigned long to;
++};
++
++/* struct s3c24xx_dma_map
++ *
++ * this holds the mapping information for the channel selected
++ * to be connected to the specified device
++*/
++
++struct s3c24xx_dma_map {
++ const char *name;
++ struct s3c24xx_dma_addr hw_addr;
++
++ unsigned long channels[S3C_DMA_CHANNELS];
++ unsigned long channels_rx[S3C_DMA_CHANNELS];
++};
++
++struct s3c24xx_dma_selection {
++ struct s3c24xx_dma_map *map;
++ unsigned long map_size;
++ unsigned long dcon_mask;
++
++ void (*select)(struct s3c2410_dma_chan *chan,
++ struct s3c24xx_dma_map *map);
++
++ void (*direction)(struct s3c2410_dma_chan *chan,
++ struct s3c24xx_dma_map *map,
++ enum s3c2410_dmasrc dir);
++};
++
++extern int s3c24xx_dma_init_map(struct s3c24xx_dma_selection *sel);
++
++/* struct s3c24xx_dma_order_ch
++ *
++ * channel map for one of the `enum dma_ch` dma channels. the list
++ * entry contains a set of low-level channel numbers, orred with
++ * DMA_CH_VALID, which are checked in the order in the array.
++*/
++
++struct s3c24xx_dma_order_ch {
++ unsigned int list[S3C_DMA_CHANNELS]; /* list of channels */
++ unsigned int flags; /* flags */
++};
++
++/* struct s3c24xx_dma_order
++ *
++ * information provided by either the core or the board to give the
++ * dma system a hint on how to allocate channels
++*/
++
++struct s3c24xx_dma_order {
++ struct s3c24xx_dma_order_ch channels[DMACH_MAX];
++};
++
++extern int s3c24xx_dma_order_set(struct s3c24xx_dma_order *map);
++
++/* DMA init code, called from the cpu support code */
++
++extern int s3c2410_dma_init(void);
++
++extern int s3c24xx_dma_init(unsigned int channels, unsigned int irq,
++ unsigned int stride);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/include/plat/irq.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/include/plat/irq.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/include/plat/irq.h 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/include/plat/irq.h 2009-05-10 22:27:59.000000000 +0200
+@@ -10,6 +10,13 @@
+ * published by the Free Software Foundation.
+ */
+
++#include <linux/io.h>
++
++#include <mach/irqs.h>
++#include <mach/hardware.h>
++#include <mach/regs-irq.h>
++#include <mach/regs-gpio.h>
++
+ #define irqdbf(x...)
+ #define irqdbf2(x...)
+
+@@ -25,8 +32,15 @@
+ {
+ unsigned long mask;
+ unsigned long submask;
++#ifdef CONFIG_S3C2440_C_FIQ
++ unsigned long flags;
++#endif
+
+ submask = __raw_readl(S3C2410_INTSUBMSK);
++#ifdef CONFIG_S3C2440_C_FIQ
++ local_save_flags(flags);
++ local_fiq_disable();
++#endif
+ mask = __raw_readl(S3C2410_INTMSK);
+
+ submask |= (1UL << (irqno - IRQ_S3CUART_RX0));
+@@ -39,6 +53,9 @@
+
+ /* write back masks */
+ __raw_writel(submask, S3C2410_INTSUBMSK);
++#ifdef CONFIG_S3C2440_C_FIQ
++ local_irq_restore(flags);
++#endif
+
+ }
+
+@@ -47,8 +64,15 @@
+ {
+ unsigned long mask;
+ unsigned long submask;
++#ifdef CONFIG_S3C2440_C_FIQ
++ unsigned long flags;
++#endif
+
+ submask = __raw_readl(S3C2410_INTSUBMSK);
++#ifdef CONFIG_S3C2440_C_FIQ
++ local_save_flags(flags);
++ local_fiq_disable();
++#endif
+ mask = __raw_readl(S3C2410_INTMSK);
+
+ submask &= ~(1UL << (irqno - IRQ_S3CUART_RX0));
+@@ -57,6 +81,9 @@
+ /* write back masks */
+ __raw_writel(submask, S3C2410_INTSUBMSK);
+ __raw_writel(mask, S3C2410_INTMSK);
++#ifdef CONFIG_S3C2440_C_FIQ
++ local_irq_restore(flags);
++#endif
+ }
+
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/include/plat/map.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/include/plat/map.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/include/plat/map.h 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/include/plat/map.h 2009-05-10 22:27:59.000000000 +0200
+@@ -31,6 +31,8 @@
+ #define S3C24XX_SZ_UART SZ_1M
+ #define S3C_UART_OFFSET (0x4000)
+
++#define S3C_VA_UARTx(uart) (S3C_VA_UART + ((uart * S3C_UART_OFFSET)))
++
+ /* Timers */
+ #define S3C24XX_VA_TIMER S3C_VA_TIMER
+ #define S3C2410_PA_TIMER (0x51000000)
+@@ -56,7 +58,6 @@
+ #define S3C24XX_SZ_SPI SZ_1M
+ #define S3C24XX_SZ_SDI SZ_1M
+ #define S3C24XX_SZ_NAND SZ_1M
+-#define S3C24XX_SZ_USBHOST SZ_1M
+
+ /* GPIO ports */
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/include/plat/pm-core.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/include/plat/pm-core.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/include/plat/pm-core.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/include/plat/pm-core.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,64 @@
++/* linux/arch/arm/plat-s3c24xx/include/plat/pll.h
++ *
++ * Copyright 2008 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ * http://armlinux.simtec.co.uk/
++ *
++ * S3C24xx - PM core support for arch/arm/plat-s3c/pm.c
++ *
++ * 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.
++ */
++
++static inline void s3c_pm_debug_init_uart(void)
++{
++ unsigned long tmp = __raw_readl(S3C2410_CLKCON);
++
++ /* re-start uart clocks */
++ tmp |= S3C2410_CLKCON_UART0;
++ tmp |= S3C2410_CLKCON_UART1;
++ tmp |= S3C2410_CLKCON_UART2;
++
++ __raw_writel(tmp, S3C2410_CLKCON);
++ udelay(10);
++}
++
++static inline void s3c_pm_arch_prepare_irqs(void)
++{
++ __raw_writel(s3c_irqwake_intmask, S3C2410_INTMSK);
++ __raw_writel(s3c_irqwake_eintmask, S3C2410_EINTMASK);
++
++ /* ack any outstanding external interrupts before we go to sleep */
++
++ __raw_writel(__raw_readl(S3C2410_EINTPEND), S3C2410_EINTPEND);
++ __raw_writel(__raw_readl(S3C2410_INTPND), S3C2410_INTPND);
++ __raw_writel(__raw_readl(S3C2410_SRCPND), S3C2410_SRCPND);
++
++}
++
++static inline void s3c_pm_arch_stop_clocks(void)
++{
++ __raw_writel(0x00, S3C2410_CLKCON); /* turn off clocks over sleep */
++}
++
++static void s3c_pm_show_resume_irqs(int start, unsigned long which,
++ unsigned long mask);
++
++static inline void s3c_pm_arch_show_resume_irqs(void)
++{
++ S3C_PMDBG("post sleep: IRQs 0x%08x, 0x%08x\n",
++ __raw_readl(S3C2410_SRCPND),
++ __raw_readl(S3C2410_EINTPEND));
++
++ s3c_pm_show_resume_irqs(IRQ_EINT0, __raw_readl(S3C2410_SRCPND),
++ s3c_irqwake_intmask);
++
++ s3c_pm_show_resume_irqs(IRQ_EINT4-4, __raw_readl(S3C2410_EINTPEND),
++ s3c_irqwake_eintmask);
++}
++
++static inline void s3c_pm_arch_update_uart(void __iomem *regs,
++ struct pm_uart_save *save)
++{
++}
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/include/plat/pm.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/include/plat/pm.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/include/plat/pm.h 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/include/plat/pm.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,73 +0,0 @@
+-/* linux/include/asm-arm/plat-s3c24xx/pm.h
+- *
+- * Copyright (c) 2004 Simtec Electronics
+- * Written by Ben Dooks, <ben@simtec.co.uk>
+- *
+- * 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.
+-*/
+-
+-/* s3c2410_pm_init
+- *
+- * called from board at initialisation time to setup the power
+- * management
+-*/
+-
+-#ifdef CONFIG_PM
+-
+-extern __init int s3c2410_pm_init(void);
+-
+-#else
+-
+-static inline int s3c2410_pm_init(void)
+-{
+- return 0;
+-}
+-#endif
+-
+-/* configuration for the IRQ mask over sleep */
+-extern unsigned long s3c_irqwake_intmask;
+-extern unsigned long s3c_irqwake_eintmask;
+-
+-/* IRQ masks for IRQs allowed to go to sleep (see irq.c) */
+-extern unsigned long s3c_irqwake_intallow;
+-extern unsigned long s3c_irqwake_eintallow;
+-
+-/* per-cpu sleep functions */
+-
+-extern void (*pm_cpu_prep)(void);
+-extern void (*pm_cpu_sleep)(void);
+-
+-/* Flags for PM Control */
+-
+-extern unsigned long s3c_pm_flags;
+-
+-/* from sleep.S */
+-
+-extern int s3c2410_cpu_save(unsigned long *saveblk);
+-extern void s3c2410_cpu_suspend(void);
+-extern void s3c2410_cpu_resume(void);
+-
+-extern unsigned long s3c2410_sleep_save_phys;
+-
+-/* sleep save info */
+-
+-struct sleep_save {
+- void __iomem *reg;
+- unsigned long val;
+-};
+-
+-#define SAVE_ITEM(x) \
+- { .reg = (x) }
+-
+-extern void s3c2410_pm_do_save(struct sleep_save *ptr, int count);
+-extern void s3c2410_pm_do_restore(struct sleep_save *ptr, int count);
+-
+-#ifdef CONFIG_PM
+-extern int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state);
+-extern int s3c24xx_irq_resume(struct sys_device *dev);
+-#else
+-#define s3c24xx_irq_suspend NULL
+-#define s3c24xx_irq_resume NULL
+-#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/include/plat/regs-dma.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/include/plat/regs-dma.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/include/plat/regs-dma.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/include/plat/regs-dma.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,145 @@
++/* arch/arm/mach-s3c2410/include/mach/dma.h
++ *
++ * Copyright (C) 2003,2004,2006 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ *
++ * Samsung S3C24XX DMA support
++ *
++ * 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.
++*/
++
++/* DMA Register definitions */
++
++#define S3C2410_DMA_DISRC (0x00)
++#define S3C2410_DMA_DISRCC (0x04)
++#define S3C2410_DMA_DIDST (0x08)
++#define S3C2410_DMA_DIDSTC (0x0C)
++#define S3C2410_DMA_DCON (0x10)
++#define S3C2410_DMA_DSTAT (0x14)
++#define S3C2410_DMA_DCSRC (0x18)
++#define S3C2410_DMA_DCDST (0x1C)
++#define S3C2410_DMA_DMASKTRIG (0x20)
++#define S3C2412_DMA_DMAREQSEL (0x24)
++#define S3C2443_DMA_DMAREQSEL (0x24)
++
++#define S3C2410_DISRCC_INC (1<<0)
++#define S3C2410_DISRCC_APB (1<<1)
++
++#define S3C2410_DMASKTRIG_STOP (1<<2)
++#define S3C2410_DMASKTRIG_ON (1<<1)
++#define S3C2410_DMASKTRIG_SWTRIG (1<<0)
++
++#define S3C2410_DCON_DEMAND (0<<31)
++#define S3C2410_DCON_HANDSHAKE (1<<31)
++#define S3C2410_DCON_SYNC_PCLK (0<<30)
++#define S3C2410_DCON_SYNC_HCLK (1<<30)
++
++#define S3C2410_DCON_INTREQ (1<<29)
++
++#define S3C2410_DCON_CH0_XDREQ0 (0<<24)
++#define S3C2410_DCON_CH0_UART0 (1<<24)
++#define S3C2410_DCON_CH0_SDI (2<<24)
++#define S3C2410_DCON_CH0_TIMER (3<<24)
++#define S3C2410_DCON_CH0_USBEP1 (4<<24)
++
++#define S3C2410_DCON_CH1_XDREQ1 (0<<24)
++#define S3C2410_DCON_CH1_UART1 (1<<24)
++#define S3C2410_DCON_CH1_I2SSDI (2<<24)
++#define S3C2410_DCON_CH1_SPI (3<<24)
++#define S3C2410_DCON_CH1_USBEP2 (4<<24)
++
++#define S3C2410_DCON_CH2_I2SSDO (0<<24)
++#define S3C2410_DCON_CH2_I2SSDI (1<<24)
++#define S3C2410_DCON_CH2_SDI (2<<24)
++#define S3C2410_DCON_CH2_TIMER (3<<24)
++#define S3C2410_DCON_CH2_USBEP3 (4<<24)
++
++#define S3C2410_DCON_CH3_UART2 (0<<24)
++#define S3C2410_DCON_CH3_SDI (1<<24)
++#define S3C2410_DCON_CH3_SPI (2<<24)
++#define S3C2410_DCON_CH3_TIMER (3<<24)
++#define S3C2410_DCON_CH3_USBEP4 (4<<24)
++
++#define S3C2410_DCON_SRCSHIFT (24)
++#define S3C2410_DCON_SRCMASK (7<<24)
++
++#define S3C2410_DCON_BYTE (0<<20)
++#define S3C2410_DCON_HALFWORD (1<<20)
++#define S3C2410_DCON_WORD (2<<20)
++
++#define S3C2410_DCON_AUTORELOAD (0<<22)
++#define S3C2410_DCON_NORELOAD (1<<22)
++#define S3C2410_DCON_HWTRIG (1<<23)
++
++#if defined(CONFIG_CPU_S3C2440) || defined(CONFIG_CPU_S3C2442)
++#define S3C2440_DIDSTC_CHKINT (1<<2)
++
++#define S3C2440_DCON_CH0_I2SSDO (5<<24)
++#define S3C2440_DCON_CH0_PCMIN (6<<24)
++
++#define S3C2440_DCON_CH1_PCMOUT (5<<24)
++#define S3C2440_DCON_CH1_SDI (6<<24)
++
++#define S3C2440_DCON_CH2_PCMIN (5<<24)
++#define S3C2440_DCON_CH2_MICIN (6<<24)
++
++#define S3C2440_DCON_CH3_MICIN (5<<24)
++#define S3C2440_DCON_CH3_PCMOUT (6<<24)
++#endif
++
++#ifdef CONFIG_CPU_S3C2412
++
++#define S3C2412_DMAREQSEL_SRC(x) ((x)<<1)
++
++#define S3C2412_DMAREQSEL_HW (1)
++
++#define S3C2412_DMAREQSEL_SPI0TX S3C2412_DMAREQSEL_SRC(0)
++#define S3C2412_DMAREQSEL_SPI0RX S3C2412_DMAREQSEL_SRC(1)
++#define S3C2412_DMAREQSEL_SPI1TX S3C2412_DMAREQSEL_SRC(2)
++#define S3C2412_DMAREQSEL_SPI1RX S3C2412_DMAREQSEL_SRC(3)
++#define S3C2412_DMAREQSEL_I2STX S3C2412_DMAREQSEL_SRC(4)
++#define S3C2412_DMAREQSEL_I2SRX S3C2412_DMAREQSEL_SRC(5)
++#define S3C2412_DMAREQSEL_TIMER S3C2412_DMAREQSEL_SRC(9)
++#define S3C2412_DMAREQSEL_SDI S3C2412_DMAREQSEL_SRC(10)
++#define S3C2412_DMAREQSEL_USBEP1 S3C2412_DMAREQSEL_SRC(13)
++#define S3C2412_DMAREQSEL_USBEP2 S3C2412_DMAREQSEL_SRC(14)
++#define S3C2412_DMAREQSEL_USBEP3 S3C2412_DMAREQSEL_SRC(15)
++#define S3C2412_DMAREQSEL_USBEP4 S3C2412_DMAREQSEL_SRC(16)
++#define S3C2412_DMAREQSEL_XDREQ0 S3C2412_DMAREQSEL_SRC(17)
++#define S3C2412_DMAREQSEL_XDREQ1 S3C2412_DMAREQSEL_SRC(18)
++#define S3C2412_DMAREQSEL_UART0_0 S3C2412_DMAREQSEL_SRC(19)
++#define S3C2412_DMAREQSEL_UART0_1 S3C2412_DMAREQSEL_SRC(20)
++#define S3C2412_DMAREQSEL_UART1_0 S3C2412_DMAREQSEL_SRC(21)
++#define S3C2412_DMAREQSEL_UART1_1 S3C2412_DMAREQSEL_SRC(22)
++#define S3C2412_DMAREQSEL_UART2_0 S3C2412_DMAREQSEL_SRC(23)
++#define S3C2412_DMAREQSEL_UART2_1 S3C2412_DMAREQSEL_SRC(24)
++
++#endif
++
++#define S3C2443_DMAREQSEL_SRC(x) ((x)<<1)
++
++#define S3C2443_DMAREQSEL_HW (1)
++
++#define S3C2443_DMAREQSEL_SPI0TX S3C2443_DMAREQSEL_SRC(0)
++#define S3C2443_DMAREQSEL_SPI0RX S3C2443_DMAREQSEL_SRC(1)
++#define S3C2443_DMAREQSEL_SPI1TX S3C2443_DMAREQSEL_SRC(2)
++#define S3C2443_DMAREQSEL_SPI1RX S3C2443_DMAREQSEL_SRC(3)
++#define S3C2443_DMAREQSEL_I2STX S3C2443_DMAREQSEL_SRC(4)
++#define S3C2443_DMAREQSEL_I2SRX S3C2443_DMAREQSEL_SRC(5)
++#define S3C2443_DMAREQSEL_TIMER S3C2443_DMAREQSEL_SRC(9)
++#define S3C2443_DMAREQSEL_SDI S3C2443_DMAREQSEL_SRC(10)
++#define S3C2443_DMAREQSEL_XDREQ0 S3C2443_DMAREQSEL_SRC(17)
++#define S3C2443_DMAREQSEL_XDREQ1 S3C2443_DMAREQSEL_SRC(18)
++#define S3C2443_DMAREQSEL_UART0_0 S3C2443_DMAREQSEL_SRC(19)
++#define S3C2443_DMAREQSEL_UART0_1 S3C2443_DMAREQSEL_SRC(20)
++#define S3C2443_DMAREQSEL_UART1_0 S3C2443_DMAREQSEL_SRC(21)
++#define S3C2443_DMAREQSEL_UART1_1 S3C2443_DMAREQSEL_SRC(22)
++#define S3C2443_DMAREQSEL_UART2_0 S3C2443_DMAREQSEL_SRC(23)
++#define S3C2443_DMAREQSEL_UART2_1 S3C2443_DMAREQSEL_SRC(24)
++#define S3C2443_DMAREQSEL_UART3_0 S3C2443_DMAREQSEL_SRC(25)
++#define S3C2443_DMAREQSEL_UART3_1 S3C2443_DMAREQSEL_SRC(26)
++#define S3C2443_DMAREQSEL_PCMOUT S3C2443_DMAREQSEL_SRC(27)
++#define S3C2443_DMAREQSEL_PCMIN S3C2443_DMAREQSEL_SRC(28)
++#define S3C2443_DMAREQSEL_MICIN S3C2443_DMAREQSEL_SRC(29)
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/include/plat/regs-iis.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/include/plat/regs-iis.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/include/plat/regs-iis.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/include/plat/regs-iis.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,77 @@
++/* arch/arm/mach-s3c2410/include/mach/regs-iis.h
++ *
++ * Copyright (c) 2003 Simtec Electronics <linux@simtec.co.uk>
++ * http://www.simtec.co.uk/products/SWLINUX/
++ *
++ * 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.
++ *
++ * S3C2410 IIS register definition
++*/
++
++#ifndef __ASM_ARCH_REGS_IIS_H
++#define __ASM_ARCH_REGS_IIS_H
++
++#define S3C2410_IISCON (0x00)
++
++#define S3C2410_IISCON_LRINDEX (1<<8)
++#define S3C2410_IISCON_TXFIFORDY (1<<7)
++#define S3C2410_IISCON_RXFIFORDY (1<<6)
++#define S3C2410_IISCON_TXDMAEN (1<<5)
++#define S3C2410_IISCON_RXDMAEN (1<<4)
++#define S3C2410_IISCON_TXIDLE (1<<3)
++#define S3C2410_IISCON_RXIDLE (1<<2)
++#define S3C2410_IISCON_PSCEN (1<<1)
++#define S3C2410_IISCON_IISEN (1<<0)
++
++#define S3C2410_IISMOD (0x04)
++
++#define S3C2440_IISMOD_MPLL (1<<9)
++#define S3C2410_IISMOD_SLAVE (1<<8)
++#define S3C2410_IISMOD_NOXFER (0<<6)
++#define S3C2410_IISMOD_RXMODE (1<<6)
++#define S3C2410_IISMOD_TXMODE (2<<6)
++#define S3C2410_IISMOD_TXRXMODE (3<<6)
++#define S3C2410_IISMOD_LR_LLOW (0<<5)
++#define S3C2410_IISMOD_LR_RLOW (1<<5)
++#define S3C2410_IISMOD_IIS (0<<4)
++#define S3C2410_IISMOD_MSB (1<<4)
++#define S3C2410_IISMOD_8BIT (0<<3)
++#define S3C2410_IISMOD_16BIT (1<<3)
++#define S3C2410_IISMOD_BITMASK (1<<3)
++#define S3C2410_IISMOD_256FS (0<<2)
++#define S3C2410_IISMOD_384FS (1<<2)
++#define S3C2410_IISMOD_16FS (0<<0)
++#define S3C2410_IISMOD_32FS (1<<0)
++#define S3C2410_IISMOD_48FS (2<<0)
++#define S3C2410_IISMOD_FS_MASK (3<<0)
++
++#define S3C2410_IISPSR (0x08)
++#define S3C2410_IISPSR_INTMASK (31<<5)
++#define S3C2410_IISPSR_INTSHIFT (5)
++#define S3C2410_IISPSR_EXTMASK (31<<0)
++#define S3C2410_IISPSR_EXTSHFIT (0)
++
++#define S3C2410_IISFCON (0x0c)
++
++#define S3C2410_IISFCON_TXDMA (1<<15)
++#define S3C2410_IISFCON_RXDMA (1<<14)
++#define S3C2410_IISFCON_TXENABLE (1<<13)
++#define S3C2410_IISFCON_RXENABLE (1<<12)
++#define S3C2410_IISFCON_TXMASK (0x3f << 6)
++#define S3C2410_IISFCON_TXSHIFT (6)
++#define S3C2410_IISFCON_RXMASK (0x3f)
++#define S3C2410_IISFCON_RXSHIFT (0)
++
++#define S3C2400_IISFCON_TXDMA (1<<11)
++#define S3C2400_IISFCON_RXDMA (1<<10)
++#define S3C2400_IISFCON_TXENABLE (1<<9)
++#define S3C2400_IISFCON_RXENABLE (1<<8)
++#define S3C2400_IISFCON_TXMASK (0x07 << 4)
++#define S3C2400_IISFCON_TXSHIFT (4)
++#define S3C2400_IISFCON_RXMASK (0x07)
++#define S3C2400_IISFCON_RXSHIFT (0)
++
++#define S3C2410_IISFIFO (0x10)
++#endif /* __ASM_ARCH_REGS_IIS_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/irq.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/irq.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/irq.c 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/irq.c 2009-05-10 22:27:59.000000000 +0200
+@@ -1,6 +1,6 @@
+ /* linux/arch/arm/plat-s3c24xx/irq.c
+ *
+- * Copyright (c) 2003,2004 Simtec Electronics
++ * Copyright (c) 2003,2004 Simtec Electronics
+ * Ben Dooks <ben@simtec.co.uk>
+ *
+ * This program is free software; you can redistribute it and/or modify
+@@ -16,38 +16,6 @@
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+- *
+- * Changelog:
+- *
+- * 22-Jul-2004 Ben Dooks <ben@simtec.co.uk>
+- * Fixed compile warnings
+- *
+- * 22-Jul-2004 Roc Wu <cooloney@yahoo.com.cn>
+- * Fixed s3c_extirq_type
+- *
+- * 21-Jul-2004 Arnaud Patard (Rtp) <arnaud.patard@rtp-net.org>
+- * Addition of ADC/TC demux
+- *
+- * 04-Oct-2004 Klaus Fetscher <k.fetscher@fetron.de>
+- * Fix for set_irq_type() on low EINT numbers
+- *
+- * 05-Oct-2004 Ben Dooks <ben@simtec.co.uk>
+- * Tidy up KF's patch and sort out new release
+- *
+- * 05-Oct-2004 Ben Dooks <ben@simtec.co.uk>
+- * Add support for power management controls
+- *
+- * 04-Nov-2004 Ben Dooks
+- * Fix standard IRQ wake for EINT0..4 and RTC
+- *
+- * 22-Feb-2005 Ben Dooks
+- * Fixed edge-triggering on ADC IRQ
+- *
+- * 28-Jun-2005 Ben Dooks
+- * Mark IRQ_LCD valid
+- *
+- * 25-Jul-2005 Ben Dooks
+- * Split the S3C2440 IRQ code to separate file
+ */
+
+ #include <linux/init.h>
+@@ -55,11 +23,8 @@
+ #include <linux/interrupt.h>
+ #include <linux/ioport.h>
+ #include <linux/sysdev.h>
+-#include <linux/io.h>
+
+-#include <mach/hardware.h>
+ #include <asm/irq.h>
+-
+ #include <asm/mach/irq.h>
+
+ #include <plat/regs-irqtype.h>
+@@ -70,76 +35,24 @@
+ #include <plat/pm.h>
+ #include <plat/irq.h>
+
+-/* wakeup irq control */
+-
+-#ifdef CONFIG_PM
+-
+-/* state for IRQs over sleep */
+-
+-/* default is to allow for EINT0..EINT15, and IRQ_RTC as wakeup sources
+- *
+- * set bit to 1 in allow bitfield to enable the wakeup settings on it
+-*/
+-
+-unsigned long s3c_irqwake_intallow = 1L << (IRQ_RTC - IRQ_EINT0) | 0xfL;
+-unsigned long s3c_irqwake_intmask = 0xffffffffL;
+-unsigned long s3c_irqwake_eintallow = 0x0000fff0L;
+-unsigned long s3c_irqwake_eintmask = 0xffffffffL;
+-
+-int
+-s3c_irq_wake(unsigned int irqno, unsigned int state)
+-{
+- unsigned long irqbit = 1 << (irqno - IRQ_EINT0);
+-
+- if (!(s3c_irqwake_intallow & irqbit))
+- return -ENOENT;
+-
+- printk(KERN_INFO "wake %s for irq %d\n",
+- state ? "enabled" : "disabled", irqno);
+-
+- if (!state)
+- s3c_irqwake_intmask |= irqbit;
+- else
+- s3c_irqwake_intmask &= ~irqbit;
+-
+- return 0;
+-}
+-
+-static int
+-s3c_irqext_wake(unsigned int irqno, unsigned int state)
+-{
+- unsigned long bit = 1L << (irqno - EXTINT_OFF);
+-
+- if (!(s3c_irqwake_eintallow & bit))
+- return -ENOENT;
+-
+- printk(KERN_INFO "wake %s for irq %d\n",
+- state ? "enabled" : "disabled", irqno);
+-
+- if (!state)
+- s3c_irqwake_eintmask |= bit;
+- else
+- s3c_irqwake_eintmask &= ~bit;
+-
+- return 0;
+-}
+-
+-#else
+-#define s3c_irqext_wake NULL
+-#define s3c_irq_wake NULL
+-#endif
+-
+-
+ static void
+ s3c_irq_mask(unsigned int irqno)
+ {
+ unsigned long mask;
+-
++#ifdef CONFIG_S3C2440_C_FIQ
++ unsigned long flags;
++#endif
+ irqno -= IRQ_EINT0;
+-
++#ifdef CONFIG_S3C2440_C_FIQ
++ local_save_flags(flags);
++ local_fiq_disable();
++#endif
+ mask = __raw_readl(S3C2410_INTMSK);
+ mask |= 1UL << irqno;
+ __raw_writel(mask, S3C2410_INTMSK);
++#ifdef CONFIG_S3C2440_C_FIQ
++ local_irq_restore(flags);
++#endif
+ }
+
+ static inline void
+@@ -156,9 +69,19 @@
+ {
+ unsigned long bitval = 1UL << (irqno - IRQ_EINT0);
+ unsigned long mask;
++#ifdef CONFIG_S3C2440_C_FIQ
++ unsigned long flags;
++#endif
+
++#ifdef CONFIG_S3C2440_C_FIQ
++ local_save_flags(flags);
++ local_fiq_disable();
++#endif
+ mask = __raw_readl(S3C2410_INTMSK);
+ __raw_writel(mask|bitval, S3C2410_INTMSK);
++#ifdef CONFIG_S3C2440_C_FIQ
++ local_irq_restore(flags);
++#endif
+
+ __raw_writel(bitval, S3C2410_SRCPND);
+ __raw_writel(bitval, S3C2410_INTPND);
+@@ -169,15 +92,25 @@
+ s3c_irq_unmask(unsigned int irqno)
+ {
+ unsigned long mask;
++#ifdef CONFIG_S3C2440_C_FIQ
++ unsigned long flags;
++#endif
+
+ if (irqno != IRQ_TIMER4 && irqno != IRQ_EINT8t23)
+ irqdbf2("s3c_irq_unmask %d\n", irqno);
+
+ irqno -= IRQ_EINT0;
+
++#ifdef CONFIG_S3C2440_C_FIQ
++ local_save_flags(flags);
++ local_fiq_disable();
++#endif
+ mask = __raw_readl(S3C2410_INTMSK);
+ mask &= ~(1UL << irqno);
+ __raw_writel(mask, S3C2410_INTMSK);
++#ifdef CONFIG_S3C2440_C_FIQ
++ local_irq_restore(flags);
++#endif
+ }
+
+ struct irq_chip s3c_irq_level_chip = {
+@@ -590,59 +523,6 @@
+ }
+ }
+
+-#ifdef CONFIG_PM
+-
+-static struct sleep_save irq_save[] = {
+- SAVE_ITEM(S3C2410_INTMSK),
+- SAVE_ITEM(S3C2410_INTSUBMSK),
+-};
+-
+-/* the extint values move between the s3c2410/s3c2440 and the s3c2412
+- * so we use an array to hold them, and to calculate the address of
+- * the register at run-time
+-*/
+-
+-static unsigned long save_extint[3];
+-static unsigned long save_eintflt[4];
+-static unsigned long save_eintmask;
+-
+-int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state)
+-{
+- unsigned int i;
+-
+- for (i = 0; i < ARRAY_SIZE(save_extint); i++)
+- save_extint[i] = __raw_readl(S3C24XX_EXTINT0 + (i*4));
+-
+- for (i = 0; i < ARRAY_SIZE(save_eintflt); i++)
+- save_eintflt[i] = __raw_readl(S3C24XX_EINFLT0 + (i*4));
+-
+- s3c2410_pm_do_save(irq_save, ARRAY_SIZE(irq_save));
+- save_eintmask = __raw_readl(S3C24XX_EINTMASK);
+-
+- return 0;
+-}
+-
+-int s3c24xx_irq_resume(struct sys_device *dev)
+-{
+- unsigned int i;
+-
+- for (i = 0; i < ARRAY_SIZE(save_extint); i++)
+- __raw_writel(save_extint[i], S3C24XX_EXTINT0 + (i*4));
+-
+- for (i = 0; i < ARRAY_SIZE(save_eintflt); i++)
+- __raw_writel(save_eintflt[i], S3C24XX_EINFLT0 + (i*4));
+-
+- s3c2410_pm_do_restore(irq_save, ARRAY_SIZE(irq_save));
+- __raw_writel(save_eintmask, S3C24XX_EINTMASK);
+-
+- return 0;
+-}
+-
+-#else
+-#define s3c24xx_irq_suspend NULL
+-#define s3c24xx_irq_resume NULL
+-#endif
+-
+ /* s3c24xx_init_irq
+ *
+ * Initialise S3C2410 IRQ system
+@@ -673,26 +553,26 @@
+
+ last = 0;
+ for (i = 0; i < 4; i++) {
+- pend = __raw_readl(S3C2410_INTPND);
++ pend = __raw_readl(S3C2410_SUBSRCPND);
+
+ if (pend == 0 || pend == last)
+ break;
+
+- __raw_writel(pend, S3C2410_SRCPND);
+- __raw_writel(pend, S3C2410_INTPND);
+- printk("irq: clearing pending status %08x\n", (int)pend);
++ printk("irq: clearing subpending status %08x\n", (int)pend);
++ __raw_writel(pend, S3C2410_SUBSRCPND);
+ last = pend;
+ }
+
+ last = 0;
+ for (i = 0; i < 4; i++) {
+- pend = __raw_readl(S3C2410_SUBSRCPND);
++ pend = __raw_readl(S3C2410_INTPND);
+
+ if (pend == 0 || pend == last)
+ break;
+
+- printk("irq: clearing subpending status %08x\n", (int)pend);
+- __raw_writel(pend, S3C2410_SUBSRCPND);
++ __raw_writel(pend, S3C2410_SRCPND);
++ __raw_writel(pend, S3C2410_INTPND);
++ printk("irq: clearing pending status %08x\n", (int)pend);
+ last = pend;
+ }
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/irq-pm.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/irq-pm.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/irq-pm.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/irq-pm.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,118 @@
++/* linux/arch/arm/plat-s3c24xx/irq-om.c
++ *
++ * Copyright (c) 2003,2004 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ * http://armlinux.simtec.co.uk/
++ *
++ * S3C24XX - IRQ PM code
++ *
++ * 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.
++ */
++
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/interrupt.h>
++#include <linux/sysdev.h>
++#include <linux/irq.h>
++
++#include <plat/cpu.h>
++#include <plat/pm.h>
++#include <plat/irq.h>
++
++/* state for IRQs over sleep */
++
++/* default is to allow for EINT0..EINT15, and IRQ_RTC as wakeup sources
++ *
++ * set bit to 1 in allow bitfield to enable the wakeup settings on it
++*/
++
++unsigned long s3c_irqwake_intallow = 1L << (IRQ_RTC - IRQ_EINT0) | 0xfL;
++unsigned long s3c_irqwake_eintallow = 0x0000fff0L;
++
++int s3c_irq_wake(unsigned int irqno, unsigned int state)
++{
++ unsigned long irqbit = 1 << (irqno - IRQ_EINT0);
++
++ if (!(s3c_irqwake_intallow & irqbit))
++ return -ENOENT;
++
++ printk(KERN_INFO "wake %s for irq %d\n",
++ state ? "enabled" : "disabled", irqno);
++
++ if (!state)
++ s3c_irqwake_intmask |= irqbit;
++ else
++ s3c_irqwake_intmask &= ~irqbit;
++
++ return 0;
++}
++
++static struct sleep_save irq_save[] = {
++ SAVE_ITEM(S3C2410_INTMSK),
++ SAVE_ITEM(S3C2410_INTSUBMSK),
++};
++
++/* the extint values move between the s3c2410/s3c2440 and the s3c2412
++ * so we use an array to hold them, and to calculate the address of
++ * the register at run-time
++*/
++
++static unsigned long save_extint[3];
++static unsigned long save_eintflt[4];
++static unsigned long save_eintmask;
++
++int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state)
++{
++ unsigned int i;
++
++ for (i = 0; i < ARRAY_SIZE(save_extint); i++)
++ save_extint[i] = __raw_readl(S3C24XX_EXTINT0 + (i*4));
++
++ for (i = 0; i < ARRAY_SIZE(save_eintflt); i++)
++ save_eintflt[i] = __raw_readl(S3C24XX_EINFLT0 + (i*4));
++
++ s3c_pm_do_save(irq_save, ARRAY_SIZE(irq_save));
++ save_eintmask = __raw_readl(S3C24XX_EINTMASK);
++
++ return 0;
++}
++
++int s3c24xx_irq_resume(struct sys_device *dev)
++{
++ unsigned int i, irq;
++ unsigned long eintpnd;
++ struct irq_desc *desc;
++
++ for (i = 0; i < ARRAY_SIZE(save_extint); i++)
++ __raw_writel(save_extint[i], S3C24XX_EXTINT0 + (i*4));
++
++ for (i = 0; i < ARRAY_SIZE(save_eintflt); i++)
++ __raw_writel(save_eintflt[i], S3C24XX_EINFLT0 + (i*4));
++
++ s3c_pm_do_restore(irq_save, ARRAY_SIZE(irq_save));
++ __raw_writel(save_eintmask, S3C24XX_EINTMASK);
++
++ /*
++ * ACK those interrupts which are now masked and pending.
++ * Level interrupts if not ACKed here, create an interrupt storm
++ * because they are not handled at all.
++ */
++
++ eintpnd = __raw_readl(S3C24XX_EINTPEND);
++
++ eintpnd &= save_eintmask;
++ eintpnd &= ~0xff; /* ignore lower irqs */
++
++ while (eintpnd) {
++ irq = __ffs(eintpnd);
++ eintpnd &= ~(1 << irq);
++
++ irq += (IRQ_EINT4 - 4);
++ desc = irq_to_desc(irq);
++ desc->chip->ack(irq);
++ }
++
++ return 0;
++}
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/Kconfig linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/Kconfig
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/Kconfig 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/Kconfig 2009-05-10 22:27:59.000000000 +0200
+@@ -10,6 +10,7 @@
+ default y
+ select NO_IOPORT
+ select ARCH_REQUIRE_GPIOLIB
++ select S3C_GPIO_TRACK
+ help
+ Base platform code for any Samsung S3C24XX device
+
+@@ -30,7 +31,7 @@
+
+ config CPU_S3C244X
+ bool
+- depends on ARCH_S3C2410 && (CPU_S3C2440 || CPU_S3C2442)
++ default y if CPU_S3C2440 || CPU_S3C2442
+ help
+ Support for S3C2440 and S3C2442 Samsung Mobile CPU based systems.
+
+@@ -71,6 +72,7 @@
+ config S3C2410_DMA
+ bool "S3C2410 DMA support"
+ depends on ARCH_S3C2410
++ select S3C_DMA
+ help
+ S3C2410 DMA support. This is needed for drivers like sound which
+ use the S3C2410's DMA system to move data to and from the
+@@ -111,4 +113,12 @@
+ help
+ Common machine code for SMDK2410 and SMDK2440
+
++config MACH_NEO1973
++ bool
++ select RFKILL
++ select SERIAL_SAMSUNG
++ select SERIAL_SAMSUNG_CONSOLE
++ help
++ Common machine code for Neo1973 hardware
++
+ endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/Makefile linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/Makefile
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/Makefile 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/Makefile 2009-05-10 22:27:59.000000000 +0200
+@@ -27,6 +27,7 @@
+ obj-$(CONFIG_CPU_S3C244X) += s3c244x-clock.o
+ obj-$(CONFIG_PM_SIMTEC) += pm-simtec.o
+ obj-$(CONFIG_PM) += pm.o
++obj-$(CONFIG_PM) += irq-pm.o
+ obj-$(CONFIG_PM) += sleep.o
+ obj-$(CONFIG_HAVE_PWM) += pwm.o
+ obj-$(CONFIG_S3C2410_CLOCK) += s3c2410-clock.o
+@@ -44,3 +45,9 @@
+ # machine common support
+
+ obj-$(CONFIG_MACH_SMDK) += common-smdk.o
++obj-$(CONFIG_MACH_NEO1973) += \
++ neo1973_pm_gsm.o \
++ neo1973_pm_gps.o \
++ neo1973_pm_bt.o \
++ gta02_pm_wlan.o \
++ neo1973_shadow.o
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/neo1973_pm_bt.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/neo1973_pm_bt.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/neo1973_pm_bt.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/neo1973_pm_bt.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,339 @@
++/*
++ * Bluetooth PM code for the FIC Neo1973 GSM Phone
++ *
++ * (C) 2007 by Openmoko Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * All rights reserved.
++ *
++ * 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
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/platform_device.h>
++#include <linux/rfkill.h>
++#include <linux/err.h>
++
++#include <mach/hardware.h>
++#include <asm/mach-types.h>
++#include <asm/plat-s3c24xx/neo1973.h>
++
++/* For GTA01 */
++#include <mach/gta01.h>
++#include <linux/pcf50606.h>
++
++/* For GTA02 */
++#include <mach/gta02.h>
++#include <linux/mfd/pcf50633/gpio.h>
++
++#include <linux/regulator/consumer.h>
++
++#define DRVMSG "FIC Neo1973 Bluetooth Power Management"
++
++struct gta01_pm_bt_data {
++ struct regulator *regulator;
++ struct rfkill *rfkill;
++ int pre_resume_state;
++};
++
++static ssize_t bt_read(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ int ret = 0;
++ struct gta01_pm_bt_data *bt_data = dev_get_drvdata(dev);
++
++ if (!strcmp(attr->attr.name, "power_on")) {
++ if (machine_is_neo1973_gta01()) {
++ ret = regulator_is_enabled(bt_data->regulator);
++ } else if (machine_is_neo1973_gta02()) {
++ if (s3c2410_gpio_getpin(GTA02_GPIO_BT_EN))
++ ret = 1;
++ }
++ } else if (!strcmp(attr->attr.name, "reset")) {
++ if (machine_is_neo1973_gta01()) {
++ if (s3c2410_gpio_getpin(GTA01_GPIO_BT_EN) == 0)
++ ret = 1;
++ } else if (machine_is_neo1973_gta02()) {
++ if (s3c2410_gpio_getpin(GTA02_GPIO_BT_EN) == 0)
++ ret = 1;
++ }
++ }
++
++ if (!ret) {
++ return strlcpy(buf, "0\n", 3);
++ } else {
++ return strlcpy(buf, "1\n", 3);
++ }
++}
++
++static void __gta02_pm_bt_toggle_radio(struct device *dev, unsigned int on)
++{
++ struct gta01_pm_bt_data *bt_data = dev_get_drvdata(dev);
++
++ dev_info(dev, "__gta02_pm_bt_toggle_radio %d\n", on);
++
++ if (machine_is_neo1973_gta02()) {
++
++ bt_data = dev_get_drvdata(dev);
++
++ neo1973_gpb_setpin(GTA02_GPIO_BT_EN, !on);
++
++ if (on) {
++ if (!regulator_is_enabled(bt_data->regulator))
++ regulator_enable(bt_data->regulator);
++ } else {
++ if (regulator_is_enabled(bt_data->regulator))
++ regulator_disable(bt_data->regulator);
++ }
++
++ neo1973_gpb_setpin(GTA02_GPIO_BT_EN, on);
++ }
++}
++
++
++static int bt_rfkill_toggle_radio(void *data, enum rfkill_state state)
++{
++ struct device *dev = data;
++ unsigned long on = (state == RFKILL_STATE_ON);
++ struct gta01_pm_bt_data *bt_data = dev_get_drvdata(dev);
++
++ if (machine_is_neo1973_gta01()) {
++ /* if we are powering up, assert reset, then power,
++ * then release reset */
++ if (on) {
++ neo1973_gpb_setpin(GTA01_GPIO_BT_EN, 0);
++ if (!regulator_is_enabled(bt_data->regulator))
++ regulator_enable(bt_data->regulator);
++ } else {
++ if (regulator_is_enabled(bt_data->regulator))
++ regulator_disable(bt_data->regulator);
++ }
++ neo1973_gpb_setpin(GTA01_GPIO_BT_EN, on);
++ } else if (machine_is_neo1973_gta02())
++ __gta02_pm_bt_toggle_radio(dev, on);
++
++ return 0;
++}
++
++static ssize_t bt_write(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ unsigned long on = simple_strtoul(buf, NULL, 10);
++ struct gta01_pm_bt_data *bt_data = dev_get_drvdata(dev);
++
++ if (!strcmp(attr->attr.name, "power_on")) {
++ enum rfkill_state state = on ? RFKILL_STATE_ON : RFKILL_STATE_OFF;
++ bt_rfkill_toggle_radio(dev, state);
++ bt_data->rfkill->state = state;
++
++ if (machine_is_neo1973_gta01()) {
++ /* if we are powering up, assert reset, then power,
++ * then release reset */
++ if (on) {
++ neo1973_gpb_setpin(GTA01_GPIO_BT_EN, 0);
++ if (!regulator_is_enabled(bt_data->regulator))
++ regulator_enable(bt_data->regulator);
++ } else {
++ if (regulator_is_enabled(bt_data->regulator))
++ regulator_disable(bt_data->regulator);
++ }
++
++ neo1973_gpb_setpin(GTA01_GPIO_BT_EN, on);
++ } else if (machine_is_neo1973_gta02())
++ __gta02_pm_bt_toggle_radio(dev, on);
++
++ } else if (!strcmp(attr->attr.name, "reset")) {
++ /* reset is low-active, so we need to invert */
++ if (machine_is_neo1973_gta01()) {
++ neo1973_gpb_setpin(GTA01_GPIO_BT_EN, on ? 0 : 1);
++ } else if (machine_is_neo1973_gta02()) {
++ neo1973_gpb_setpin(GTA02_GPIO_BT_EN, on ? 0 : 1);
++ }
++ }
++
++ return count;
++}
++
++static DEVICE_ATTR(power_on, 0644, bt_read, bt_write);
++static DEVICE_ATTR(reset, 0644, bt_read, bt_write);
++
++#ifdef CONFIG_PM
++static int gta01_bt_suspend(struct platform_device *pdev, pm_message_t state)
++{
++ struct gta01_pm_bt_data *bt_data = dev_get_drvdata(&pdev->dev);
++
++ dev_dbg(&pdev->dev, DRVMSG ": suspending\n");
++
++ if (machine_is_neo1973_gta01()) {
++ if (regulator_is_enabled(bt_data->regulator))
++ regulator_disable(bt_data->regulator);
++ } else if (machine_is_neo1973_gta02()) {
++ bt_data->pre_resume_state =
++ s3c2410_gpio_getpin(GTA02_GPIO_BT_EN);
++ __gta02_pm_bt_toggle_radio(&pdev->dev, 0);
++ }
++
++ return 0;
++}
++
++static int gta01_bt_resume(struct platform_device *pdev)
++{
++ struct gta01_pm_bt_data *bt_data = dev_get_drvdata(&pdev->dev);
++ dev_dbg(&pdev->dev, DRVMSG ": resuming\n");
++
++ if (machine_is_neo1973_gta02()) {
++ __gta02_pm_bt_toggle_radio(&pdev->dev,
++ bt_data->pre_resume_state);
++ }
++
++ return 0;
++}
++#else
++#define gta01_bt_suspend NULL
++#define gta01_bt_resume NULL
++#endif
++
++static struct attribute *gta01_bt_sysfs_entries[] = {
++ &dev_attr_power_on.attr,
++ &dev_attr_reset.attr,
++ NULL
++};
++
++static struct attribute_group gta01_bt_attr_group = {
++ .name = NULL,
++ .attrs = gta01_bt_sysfs_entries,
++};
++
++static int __init gta01_bt_probe(struct platform_device *pdev)
++{
++ struct rfkill *rfkill;
++ struct regulator *regulator;
++ struct gta01_pm_bt_data *bt_data;
++ int ret;
++
++ dev_info(&pdev->dev, DRVMSG ": starting\n");
++
++ bt_data = kzalloc(sizeof(*bt_data), GFP_KERNEL);
++ dev_set_drvdata(&pdev->dev, bt_data);
++
++ if (machine_is_neo1973_gta01()) {
++ /* we make sure that the voltage is off */
++ regulator = regulator_get(&pdev->dev, "BT_3V1");
++ if (IS_ERR(regulator))
++ return -ENODEV;
++
++ bt_data->regulator = regulator;
++
++ /* this tests the true physical state of the regulator... */
++ if (regulator_is_enabled(regulator)) {
++ /*
++ * but these only operate on the logical state of the
++ * regulator... so we need to logicaly "adopt" it on
++ * to turn it off
++ */
++ regulator_enable(regulator);
++ regulator_disable(regulator);
++ }
++
++ /* we pull reset to low to make sure that the chip doesn't
++ * drain power through the reset line */
++ neo1973_gpb_setpin(GTA01_GPIO_BT_EN, 0);
++ } else if (machine_is_neo1973_gta02()) {
++ regulator = regulator_get(&pdev->dev, "BT_3V2");
++ if (IS_ERR(regulator))
++ return -ENODEV;
++
++ bt_data->regulator = regulator;
++
++ /* this tests the true physical state of the regulator... */
++ if (regulator_is_enabled(regulator)) {
++ /*
++ * but these only operate on the logical state of the
++ * regulator... so we need to logicaly "adopt" it on
++ * to turn it off
++ */
++ regulator_enable(regulator);
++ regulator_disable(regulator);
++ }
++
++ /* we pull reset to low to make sure that the chip doesn't
++ * drain power through the reset line */
++ neo1973_gpb_setpin(GTA02_GPIO_BT_EN, 0);
++ }
++
++ rfkill = rfkill_allocate(&pdev->dev, RFKILL_TYPE_BLUETOOTH);
++
++ rfkill->name = pdev->name;
++ rfkill->data = &pdev->dev;
++ rfkill->state = RFKILL_STATE_OFF;
++ rfkill->toggle_radio = bt_rfkill_toggle_radio;
++
++ ret = rfkill_register(rfkill);
++ if (ret) {
++ dev_err(&pdev->dev, "Failed to register rfkill\n");
++ return ret;
++ }
++
++ bt_data->rfkill = rfkill;
++
++ return sysfs_create_group(&pdev->dev.kobj, &gta01_bt_attr_group);
++}
++
++static int gta01_bt_remove(struct platform_device *pdev)
++{
++ struct gta01_pm_bt_data *bt_data = dev_get_drvdata(&pdev->dev);
++ struct regulator *regulator;
++
++ sysfs_remove_group(&pdev->dev.kobj, &gta01_bt_attr_group);
++
++ if (bt_data->rfkill) {
++ rfkill_unregister(bt_data->rfkill);
++ rfkill_free(bt_data->rfkill);
++ }
++
++ if (!bt_data || !bt_data->regulator)
++ return 0;
++
++ regulator = bt_data->regulator;
++
++ /* Make sure regulator is disabled before calling regulator_put */
++ if (regulator_is_enabled(regulator))
++ regulator_disable(regulator);
++
++ regulator_put(regulator);
++
++ kfree(bt_data);
++
++ return 0;
++}
++
++static struct platform_driver gta01_bt_driver = {
++ .probe = gta01_bt_probe,
++ .remove = gta01_bt_remove,
++ .suspend = gta01_bt_suspend,
++ .resume = gta01_bt_resume,
++ .driver = {
++ .name = "neo1973-pm-bt",
++ },
++};
++
++static int __devinit gta01_bt_init(void)
++{
++ return platform_driver_register(&gta01_bt_driver);
++}
++
++static void gta01_bt_exit(void)
++{
++ platform_driver_unregister(&gta01_bt_driver);
++}
++
++module_init(gta01_bt_init);
++module_exit(gta01_bt_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
++MODULE_DESCRIPTION(DRVMSG);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/neo1973_pm_gps.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/neo1973_pm_gps.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/neo1973_pm_gps.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/neo1973_pm_gps.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,803 @@
++/*
++ * GPS Power Management code for the FIC Neo1973 GSM Phone
++ *
++ * (C) 2007-2009 by Openmoko Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * All rights reserved.
++ *
++ * 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
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/delay.h>
++#include <linux/platform_device.h>
++
++#include <mach/hardware.h>
++#include <mach/cpu.h>
++
++#include <asm/mach-types.h>
++
++#include <asm/plat-s3c24xx/neo1973.h>
++
++/* For GTA01 */
++#include <mach/gta01.h>
++#include <linux/mfd/pcf50606/core.h>
++#include <linux/mfd/pcf50606/gpo.h>
++
++/* For GTA02 */
++#include <mach/gta02.h>
++#include <linux/mfd/pcf50633/core.h>
++#include <linux/mfd/pcf50633/pmic.h>
++
++#include <linux/regulator/consumer.h>
++#include <linux/err.h>
++
++enum gta01_pm_gps_supplies {
++
++ /* GTA01 */
++ GTA01_GPS_REG_2V8,
++ GTA01_GPS_REG_3V,
++ GTA01_GPS_REG_3V3,
++ GTA01_GPS_REG_1V5,
++ GTA01_GPS_REG_2V5,
++
++ /* GTA02 */
++ GTA02_GPS_REG_RF_3V,
++
++ /* Always last */
++ GTA01_GPS_NUM_REG
++};
++
++struct neo1973_pm_gps_data {
++#ifdef CONFIG_PM
++ int keep_on_in_suspend;
++#endif
++ int power_was_on; /* For GTA02 only */
++ int regulator_state[GTA01_GPS_NUM_REG];
++ struct regulator *regulator[GTA01_GPS_NUM_REG];
++};
++
++static struct neo1973_pm_gps_data neo1973_gps;
++
++int neo1973_pm_gps_is_on(void)
++{
++ return neo1973_gps.power_was_on;
++}
++EXPORT_SYMBOL_GPL(neo1973_pm_gps_is_on);
++
++#ifdef CONFIG_MACH_NEO1973_GTA01
++
++/* This is the 2.8V supply for the RTC crystal, the mail clock crystal and
++ * the input to VDD_RF */
++static void gps_power_2v8_set(int on)
++{
++ struct regulator *regulator = neo1973_gps.regulator[GTA01_GPS_REG_2V8];
++
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA01v3_SYSTEM_REV:
++ case GTA01v4_SYSTEM_REV:
++ if (on)
++ regulator_enable(regulator);
++ else
++ regulator_disable(regulator);
++ neo1973_gps.regulator_state[GTA01_GPS_REG_2V8] = on;
++ break;
++ case GTA01Bv2_SYSTEM_REV:
++ s3c2410_gpio_setpin(GTA01_GPIO_GPS_EN_2V8, on);
++ break;
++ case GTA01Bv3_SYSTEM_REV:
++ case GTA01Bv4_SYSTEM_REV:
++ break;
++ }
++}
++
++static int gps_power_2v8_get(void)
++{
++ int ret = 0;
++ struct regulator *regulator = neo1973_gps.regulator[GTA01_GPS_REG_2V8];
++
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA01v3_SYSTEM_REV:
++ case GTA01v4_SYSTEM_REV:
++ ret = regulator_is_enabled(regulator);
++ break;
++ case GTA01Bv2_SYSTEM_REV:
++ if (s3c2410_gpio_getpin(GTA01_GPIO_GPS_EN_2V8))
++ ret = 1;
++ break;
++ case GTA01Bv3_SYSTEM_REV:
++ case GTA01Bv4_SYSTEM_REV:
++ break;
++ }
++
++ return ret;
++}
++
++/* This is the 3V supply (AVDD) for the external RF frontend (LNA bias) */
++static void gps_power_3v_set(int on)
++{
++ struct regulator *regulator = neo1973_gps.regulator[GTA01_GPS_REG_3V];
++
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA01v3_SYSTEM_REV:
++ case GTA01v4_SYSTEM_REV:
++ if (on)
++ regulator_enable(regulator);
++ else
++ regulator_disable(regulator);
++ neo1973_gps.regulator_state[GTA01_GPS_REG_3V] = on;
++ break;
++ case GTA01Bv2_SYSTEM_REV:
++ case GTA01Bv3_SYSTEM_REV:
++ case GTA01Bv4_SYSTEM_REV:
++ s3c2410_gpio_setpin(GTA01_GPIO_GPS_EN_3V, on);
++ break;
++ }
++}
++
++static int gps_power_3v_get(void)
++{
++ int ret = 0;
++ struct regulator *regulator = neo1973_gps.regulator[GTA01_GPS_REG_3V];
++
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA01v3_SYSTEM_REV:
++ case GTA01v4_SYSTEM_REV:
++ ret = regulator_is_enabled(regulator);
++ break;
++ case GTA01Bv2_SYSTEM_REV:
++ case GTA01Bv3_SYSTEM_REV:
++ case GTA01Bv4_SYSTEM_REV:
++ if (s3c2410_gpio_getpin(GTA01_GPIO_GPS_EN_3V))
++ ret = 1;
++ break;
++ }
++
++ return ret;
++}
++
++/* This is the 3.3V supply for VDD_IO and VDD_LPREG input */
++static void gps_power_3v3_set(int on)
++{
++ struct regulator *regulator = neo1973_gps.regulator[GTA01_GPS_REG_3V3];
++
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA01v3_SYSTEM_REV:
++ case GTA01v4_SYSTEM_REV:
++ case GTA01Bv2_SYSTEM_REV:
++ if (on)
++ regulator_enable(regulator);
++ else
++ regulator_disable(regulator);
++ neo1973_gps.regulator_state[GTA01_GPS_REG_3V3] = on;
++ break;
++ case GTA01Bv3_SYSTEM_REV:
++ case GTA01Bv4_SYSTEM_REV:
++ s3c2410_gpio_setpin(GTA01_GPIO_GPS_EN_3V3, on);
++ break;
++ }
++}
++
++static int gps_power_3v3_get(void)
++{
++ int ret = 0;
++ struct regulator *regulator = neo1973_gps.regulator[GTA01_GPS_REG_3V3];
++
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA01v3_SYSTEM_REV:
++ case GTA01v4_SYSTEM_REV:
++ case GTA01Bv2_SYSTEM_REV:
++ ret = regulator_is_enabled(regulator);
++ break;
++ case GTA01Bv3_SYSTEM_REV:
++ case GTA01Bv4_SYSTEM_REV:
++ if (s3c2410_gpio_getpin(GTA01_GPIO_GPS_EN_3V3))
++ ret = 1;
++ break;
++ }
++
++ return ret;
++}
++
++/* This is the 2.5V supply for VDD_PLLREG and VDD_COREREG input */
++static void gps_power_2v5_set(int on)
++{
++ struct regulator *regulator = neo1973_gps.regulator[GTA01_GPS_REG_2V5];
++
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA01v3_SYSTEM_REV:
++ /* This is CORE_1V8 and cannot be disabled */
++ break;
++ case GTA01v4_SYSTEM_REV:
++ case GTA01Bv2_SYSTEM_REV:
++ case GTA01Bv3_SYSTEM_REV:
++ case GTA01Bv4_SYSTEM_REV:
++ if (on)
++ regulator_enable(regulator);
++ else
++ regulator_disable(regulator);
++ neo1973_gps.regulator_state[GTA01_GPS_REG_2V5] = on;
++ break;
++ }
++}
++
++static int gps_power_2v5_get(void)
++{
++ int ret = 0;
++ struct regulator *regulator = neo1973_gps.regulator[GTA01_GPS_REG_2V5];
++
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA01v3_SYSTEM_REV:
++ /* This is CORE_1V8 and cannot be disabled */
++ ret = 1;
++ break;
++ case GTA01v4_SYSTEM_REV:
++ case GTA01Bv2_SYSTEM_REV:
++ case GTA01Bv3_SYSTEM_REV:
++ case GTA01Bv4_SYSTEM_REV:
++ ret = regulator_is_enabled(regulator);
++ break;
++ }
++
++ return ret;
++}
++
++/* This is the 1.5V supply for VDD_CORE */
++static void gps_power_1v5_set(int on)
++{
++ struct regulator *regulator = neo1973_gps.regulator[GTA01_GPS_REG_1V5];
++
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA01v3_SYSTEM_REV:
++ case GTA01v4_SYSTEM_REV:
++ case GTA01Bv2_SYSTEM_REV:
++ /* This is switched via 2v5 */
++ break;
++ case GTA01Bv3_SYSTEM_REV:
++ case GTA01Bv4_SYSTEM_REV:
++ if (on)
++ regulator_enable(regulator);
++ else
++ regulator_disable(regulator);
++ neo1973_gps.regulator_state[GTA01_GPS_REG_1V5] = on;
++ break;
++ }
++}
++
++static int gps_power_1v5_get(void)
++{
++ int ret = 0;
++ struct regulator *regulator = neo1973_gps.regulator[GTA01_GPS_REG_1V5];
++
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA01v3_SYSTEM_REV:
++ case GTA01v4_SYSTEM_REV:
++ case GTA01Bv2_SYSTEM_REV:
++ /* This is switched via 2v5 */
++ ret = 1;
++ break;
++ case GTA01Bv3_SYSTEM_REV:
++ case GTA01Bv4_SYSTEM_REV:
++ ret = regulator_is_enabled(regulator);
++ break;
++ }
++
++ return ret;
++}
++#endif
++
++/* This is the POWERON pin */
++static void gps_pwron_set(int on)
++{
++
++ if (machine_is_neo1973_gta01())
++ neo1973_gpb_setpin(GTA01_GPIO_GPS_PWRON, on);
++
++ if (machine_is_neo1973_gta02()) {
++ if (on) {
++ /* return UART pins to being UART pins */
++ s3c2410_gpio_cfgpin(S3C2410_GPH4, S3C2410_GPH4_TXD1);
++ /* remove pulldown now it won't be floating any more */
++ s3c2410_gpio_pullup(S3C2410_GPH5, 0);
++
++ if (!neo1973_gps.power_was_on)
++ regulator_enable(neo1973_gps.regulator[
++ GTA02_GPS_REG_RF_3V]);
++ return;
++ }
++
++ /*
++ * take care not to power unpowered GPS from UART TX
++ * return them to GPIO and force low
++ */
++ s3c2410_gpio_cfgpin(S3C2410_GPH4, S3C2410_GPH4_OUTP);
++ s3c2410_gpio_setpin(S3C2410_GPH4, 0);
++ /* don't let RX from unpowered GPS float */
++ s3c2410_gpio_pullup(S3C2410_GPH5, 1);
++ if (neo1973_gps.power_was_on)
++ regulator_disable(neo1973_gps.regulator[
++ GTA02_GPS_REG_RF_3V]);
++ }
++}
++
++static int gps_pwron_get(void)
++{
++ if (machine_is_neo1973_gta01())
++ return !!s3c2410_gpio_getpin(GTA01_GPIO_GPS_PWRON);
++
++ if (machine_is_neo1973_gta02())
++ return regulator_is_enabled(neo1973_gps.regulator[GTA02_GPS_REG_RF_3V]);
++ return -1;
++}
++
++
++#ifdef CONFIG_MACH_NEO1973_GTA01
++static void gps_rst_set(int on);
++static int gps_rst_get(void);
++#endif
++
++#ifdef CONFIG_PM
++/* This is the flag for keeping gps ON during suspend */
++static void gps_keep_on_in_suspend_set(int on)
++{
++ neo1973_gps.keep_on_in_suspend = on;
++}
++
++static int gps_keep_on_in_suspend_get(void)
++{
++ return neo1973_gps.keep_on_in_suspend;
++}
++#endif
++
++static ssize_t power_gps_read(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ int ret = 0;
++
++ if (!strcmp(attr->attr.name, "power_on") ||
++ !strcmp(attr->attr.name, "pwron")) {
++ ret = gps_pwron_get();
++#ifdef CONFIG_PM
++ } else if (!strcmp(attr->attr.name, "keep_on_in_suspend")) {
++ ret = gps_keep_on_in_suspend_get();
++#endif
++#ifdef CONFIG_MACH_NEO1973_GTA01
++ } else if (!strcmp(attr->attr.name, "power_avdd_3v")) {
++ ret = gps_power_3v_get();
++ } else if (!strcmp(attr->attr.name, "power_tcxo_2v8")) {
++ ret = gps_power_2v8_get();
++ } else if (!strcmp(attr->attr.name, "reset")) {
++ ret = gps_rst_get();
++ } else if (!strcmp(attr->attr.name, "power_lp_io_3v3")) {
++ ret = gps_power_3v3_get();
++ } else if (!strcmp(attr->attr.name, "power_pll_core_2v5")) {
++ ret = gps_power_2v5_get();
++ } else if (!strcmp(attr->attr.name, "power_core_1v5") ||
++ !strcmp(attr->attr.name, "power_vdd_core_1v5")) {
++ ret = gps_power_1v5_get();
++#endif
++ }
++ if (ret)
++ return strlcpy(buf, "1\n", 3);
++ else
++ return strlcpy(buf, "0\n", 3);
++}
++
++static ssize_t power_gps_write(struct device *dev,
++ struct device_attribute *attr, const char *buf,
++ size_t count)
++{
++ unsigned long on = simple_strtoul(buf, NULL, 10);
++
++ if (!strcmp(attr->attr.name, "power_on") ||
++ !strcmp(attr->attr.name, "pwron")) {
++ gps_pwron_set(on);
++ neo1973_gps.power_was_on = !!on;
++#ifdef CONFIG_PM
++ } else if (!strcmp(attr->attr.name, "keep_on_in_suspend")) {
++ gps_keep_on_in_suspend_set(on);
++#endif
++#ifdef CONFIG_MACH_NEO1973_GTA01
++ } else if (!strcmp(attr->attr.name, "power_avdd_3v")) {
++ gps_power_3v_set(on);
++ } else if (!strcmp(attr->attr.name, "power_tcxo_2v8")) {
++ gps_power_2v8_set(on);
++ } else if (!strcmp(attr->attr.name, "reset")) {
++ gps_rst_set(on);
++ } else if (!strcmp(attr->attr.name, "power_lp_io_3v3")) {
++ gps_power_3v3_set(on);
++ } else if (!strcmp(attr->attr.name, "power_pll_core_2v5")) {
++ gps_power_2v5_set(on);
++ } else if (!strcmp(attr->attr.name, "power_core_1v5") ||
++ !strcmp(attr->attr.name, "power_vdd_core_1v5")) {
++ gps_power_1v5_set(on);
++#endif
++ }
++ return count;
++}
++
++
++#ifdef CONFIG_MACH_NEO1973_GTA01
++
++/* This is the nRESET pin */
++static void gps_rst_set(int on)
++{
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA01v3_SYSTEM_REV:
++ pcf50606_gpo_set_active(gta01_pcf, PCF50606_GPO1, on);
++ break;
++ case GTA01v4_SYSTEM_REV:
++ case GTA01Bv2_SYSTEM_REV:
++ case GTA01Bv3_SYSTEM_REV:
++ case GTA01Bv4_SYSTEM_REV:
++ s3c2410_gpio_setpin(GTA01_GPIO_GPS_RESET, on);
++ break;
++ }
++}
++
++static int gps_rst_get(void)
++{
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA01v3_SYSTEM_REV:
++ return pcf50606_gpo_get_active(gta01_pcf, PCF50606_GPO1);
++ break;
++ case GTA01v4_SYSTEM_REV:
++ case GTA01Bv2_SYSTEM_REV:
++ case GTA01Bv3_SYSTEM_REV:
++ case GTA01Bv4_SYSTEM_REV:
++ if (s3c2410_gpio_getpin(GTA01_GPIO_GPS_RESET))
++ return 1;
++ break;
++ }
++
++ return 0;
++}
++
++
++static void gps_power_sequence_up(void)
++{
++ /* According to PMB2520 Data Sheet, Rev. 2006-06-05,
++ * Chapter 4.2.2 */
++
++ /* nRESET must be asserted low */
++ gps_rst_set(0);
++
++ /* POWERON must be de-asserted (low) */
++ gps_pwron_set(0);
++
++ /* Apply VDD_IO and VDD_LPREG_IN */
++ gps_power_3v3_set(1);
++
++ /* VDD_COREREG_IN, VDD_PLLREG_IN */
++ gps_power_1v5_set(1);
++ gps_power_2v5_set(1);
++
++ /* and VDD_RF may be applied */
++ gps_power_2v8_set(1);
++
++ /* We need to enable AVDD, since in GTA01Bv3 it is
++ * shared with RFREG_IN */
++ gps_power_3v_set(1);
++
++ msleep(3); /* Is 3ms enough? */
++
++ /* De-asert nRESET */
++ gps_rst_set(1);
++
++ /* Switch power on */
++ gps_pwron_set(1);
++
++}
++
++static void gps_power_sequence_down(void)
++{
++ /* According to PMB2520 Data Sheet, Rev. 2006-06-05,
++ * Chapter 4.2.3.1 */
++ gps_pwron_set(0);
++
++ /* Don't disable AVDD before PWRON is cleared, since
++ * in GTA01Bv3, AVDD and RFREG_IN are shared */
++ if (neo1973_gps.regulator_state[GTA01_GPS_REG_3V])
++ gps_power_3v_set(0);
++
++ /* Remove VDD_COREREG_IN, VDD_PLLREG_IN and VDD_REFREG_IN */
++ if (neo1973_gps.regulator_state[GTA01_GPS_REG_1V5])
++ gps_power_1v5_set(0);
++ if (neo1973_gps.regulator_state[GTA01_GPS_REG_2V5])
++ gps_power_2v5_set(0);
++ if (neo1973_gps.regulator_state[GTA01_GPS_REG_2V8])
++ gps_power_2v8_set(0);
++
++ /* Remove VDD_LPREG_IN and VDD_IO */
++ if (neo1973_gps.regulator_state[GTA01_GPS_REG_3V3])
++ gps_power_3v3_set(0);
++
++}
++
++static ssize_t power_sequence_read(struct device *dev,
++ struct device_attribute *attr,
++ char *buf)
++{
++ return strlcpy(buf, "power_up power_down\n", PAGE_SIZE);
++}
++
++static ssize_t power_sequence_write(struct device *dev,
++ struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ dev_dbg(dev, "wrote: '%s'\n", buf);
++
++ if (!strncmp(buf, "power_up", 8))
++ gps_power_sequence_up();
++ else if (!strncmp(buf, "power_down", 10))
++ gps_power_sequence_down();
++ else
++ return -EINVAL;
++
++ return count;
++}
++
++static DEVICE_ATTR(power_tcxo_2v8, 0644, power_gps_read, power_gps_write);
++static DEVICE_ATTR(power_avdd_3v, 0644, power_gps_read, power_gps_write);
++static DEVICE_ATTR(reset, 0644, power_gps_read, power_gps_write);
++static DEVICE_ATTR(power_lp_io_3v3, 0644, power_gps_read, power_gps_write);
++static DEVICE_ATTR(power_pll_core_2v5, 0644, power_gps_read, power_gps_write);
++static DEVICE_ATTR(power_core_1v5, 0644, power_gps_read, power_gps_write);
++static DEVICE_ATTR(power_vdd_core_1v5, 0644, power_gps_read, power_gps_write);
++static DEVICE_ATTR(power_sequence, 0644, power_sequence_read,
++ power_sequence_write);
++#endif
++
++#ifdef CONFIG_PM
++static int gta01_pm_gps_suspend(struct platform_device *pdev,
++ pm_message_t state)
++{
++#ifdef CONFIG_MACH_NEO1973_GTA01
++ if (machine_is_neo1973_gta01())
++ /* FIXME */
++ gps_power_sequence_down();
++#endif
++ if (machine_is_neo1973_gta02()) {
++ if (!neo1973_gps.keep_on_in_suspend ||
++ !neo1973_gps.power_was_on)
++ gps_pwron_set(0);
++ else
++ dev_warn(&pdev->dev, "GTA02: keeping gps ON "
++ "during suspend\n");
++ }
++
++ return 0;
++}
++
++static int gta01_pm_gps_resume(struct platform_device *pdev)
++{
++#ifdef CONFIG_MACH_NEO1973_GTA01
++ if (machine_is_neo1973_gta01())
++ if (neo1973_gps.power_was_on)
++ gps_power_sequence_up();
++#endif
++ if (machine_is_neo1973_gta02())
++ if (!neo1973_gps.keep_on_in_suspend && neo1973_gps.power_was_on)
++ gps_pwron_set(1);
++
++ return 0;
++}
++
++static DEVICE_ATTR(keep_on_in_suspend, 0644, power_gps_read, power_gps_write);
++#else
++#define gta01_pm_gps_suspend NULL
++#define gta01_pm_gps_resume NULL
++#endif
++
++static DEVICE_ATTR(power_on, 0644, power_gps_read, power_gps_write);
++static DEVICE_ATTR(pwron, 0644, power_gps_read, power_gps_write);
++
++
++static struct attribute *gta01_gps_sysfs_entries[] = {
++ &dev_attr_power_on.attr,
++ &dev_attr_pwron.attr,
++#ifdef CONFIG_MACH_NEO1973_GTA01
++ &dev_attr_power_avdd_3v.attr,
++ &dev_attr_reset.attr,
++ &dev_attr_power_lp_io_3v3.attr,
++ &dev_attr_power_pll_core_2v5.attr,
++ &dev_attr_power_sequence.attr,
++ NULL, /* power_core_1v5 */
++ NULL, /* power_vdd_core_1v5 */
++#endif
++ NULL /* terminating entry */
++};
++
++static struct attribute_group gta01_gps_attr_group = {
++ .name = NULL,
++ .attrs = gta01_gps_sysfs_entries,
++};
++
++static struct attribute *gta02_gps_sysfs_entries[] = {
++ &dev_attr_power_on.attr,
++#ifdef CONFIG_PM
++ &dev_attr_keep_on_in_suspend.attr,
++#endif
++ NULL
++};
++
++static struct attribute_group gta02_gps_attr_group = {
++ .name = NULL,
++ .attrs = gta02_gps_sysfs_entries,
++};
++
++static int __init gta01_pm_gps_probe(struct platform_device *pdev)
++{
++ int ret;
++#ifdef CONFIG_MACH_NEO1973_GTA01
++ int entries = ARRAY_SIZE(gta01_gps_sysfs_entries);
++#endif
++
++ if (machine_is_neo1973_gta01()) {
++ s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_PWRON, S3C2410_GPIO_OUTPUT);
++
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA01v3_SYSTEM_REV:
++ break;
++ case GTA01v4_SYSTEM_REV:
++ s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_RESET,
++ S3C2410_GPIO_OUTPUT);
++ break;
++ case GTA01Bv3_SYSTEM_REV:
++ case GTA01Bv4_SYSTEM_REV:
++ s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_EN_3V3,
++ S3C2410_GPIO_OUTPUT);
++ /* fallthrough */
++ case GTA01Bv2_SYSTEM_REV:
++ s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_EN_2V8,
++ S3C2410_GPIO_OUTPUT);
++ s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_EN_3V,
++ S3C2410_GPIO_OUTPUT);
++ s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_RESET,
++ S3C2410_GPIO_OUTPUT);
++ break;
++ default:
++ dev_warn(&pdev->dev, "Unknown GTA01 Revision 0x%x, "
++ "AGPS PM features not available!!!\n",
++ system_rev);
++ return -1;
++ break;
++ }
++
++#ifdef CONFIG_MACH_NEO1973_GTA01
++
++ neo1973_gps.regulator[GTA01_GPS_REG_2V8] =
++ regulator_get(&pdev->dev, "GPS_2V8");
++ neo1973_gps.regulator[GTA01_GPS_REG_3V] =
++ regulator_get(&pdev->dev, "GPS_3V");
++ neo1973_gps.regulator[GTA01_GPS_REG_3V3] =
++ regulator_get(&pdev->dev, "GPS_3V3");
++ neo1973_gps.regulator[GTA01_GPS_REG_1V5] =
++ regulator_get(&pdev->dev, "GPS_1V5");
++ neo1973_gps.regulator[GTA01_GPS_REG_2V5] =
++ regulator_get(&pdev->dev, "GPS_2V5");
++
++ gps_power_sequence_down();
++
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA01v3_SYSTEM_REV:
++ case GTA01v4_SYSTEM_REV:
++ case GTA01Bv2_SYSTEM_REV:
++ gta01_gps_sysfs_entries[entries-3] =
++ &dev_attr_power_tcxo_2v8.attr;
++ break;
++ case GTA01Bv3_SYSTEM_REV:
++ case GTA01Bv4_SYSTEM_REV:
++ gta01_gps_sysfs_entries[entries-3] =
++ &dev_attr_power_core_1v5.attr;
++ gta01_gps_sysfs_entries[entries-2] =
++ &dev_attr_power_vdd_core_1v5.attr;
++ break;
++ }
++#endif
++ ret = sysfs_create_group(&pdev->dev.kobj,
++ &gta01_gps_attr_group);
++ if (ret)
++ return ret;
++ return bus_create_device_link(&platform_bus_type,
++ &pdev->dev.kobj, "gta01-pm-gps.0");
++ }
++
++ if (machine_is_neo1973_gta02()) {
++
++ neo1973_gps.regulator[GTA02_GPS_REG_RF_3V] = regulator_get(
++ &pdev->dev, "RF_3V");
++ if (IS_ERR(neo1973_gps.regulator)) {
++ dev_err(&pdev->dev, "probe failed %ld\n",
++ PTR_ERR(neo1973_gps.regulator));
++
++ return PTR_ERR(neo1973_gps.regulator);
++ }
++
++ dev_info(&pdev->dev, "starting\n");
++
++ /*
++ * Here we should call the code that handles the set GPS power
++ * off action. But, the regulator API does not allow us to
++ * reassert regulator state, and when we read the regulator API
++ * logical state, it can differ from the actual state, So
++ * a workaround for this is to just set the regulator off in the
++ * PMU directly. Because that's different from normal flow, we
++ * have to reproduce other things from the OFF action here too.
++ */
++
++ /*
++ * u-boot enables LDO5 (GPS), which doesn't make sense and
++ * causes confusion. We therefore disable the regulator here.
++ */
++ pcf50633_reg_write(gta02_pcf, PCF50633_REG_LDO5ENA, 0);
++
++ /*
++ * take care not to power unpowered GPS from UART TX
++ * return them to GPIO and force low
++ */
++ s3c2410_gpio_cfgpin(S3C2410_GPH4, S3C2410_GPH4_OUTP);
++ s3c2410_gpio_setpin(S3C2410_GPH4, 0);
++ /* don't let RX from unpowered GPS float */
++ s3c2410_gpio_pullup(S3C2410_GPH5, 1);
++
++ return sysfs_create_group(&pdev->dev.kobj,
++ &gta02_gps_attr_group);
++ }
++ return -1;
++}
++
++static int gta01_pm_gps_remove(struct platform_device *pdev)
++{
++ if (machine_is_neo1973_gta01()) {
++#ifdef CONFIG_MACH_NEO1973_GTA01
++ int i;
++
++ gps_power_sequence_down();
++ /* Now disable all regulators */
++ for (i = 0; i < GTA01_GPS_NUM_REG; i++) {
++ regulator_put(neo1973_gps.regulator[i]);
++ }
++#endif
++ bus_remove_device_link(&platform_bus_type, "gta01-pm-gps.0");
++ sysfs_remove_group(&pdev->dev.kobj, &gta01_gps_attr_group);
++ }
++
++ if (machine_is_neo1973_gta02()) {
++ regulator_put(neo1973_gps.regulator[GTA02_GPS_REG_RF_3V]);
++ sysfs_remove_group(&pdev->dev.kobj, &gta02_gps_attr_group);
++ }
++ return 0;
++}
++
++static struct platform_driver gta01_pm_gps_driver = {
++ .probe = gta01_pm_gps_probe,
++ .remove = gta01_pm_gps_remove,
++ .suspend = gta01_pm_gps_suspend,
++ .resume = gta01_pm_gps_resume,
++ .driver = {
++ .name = "neo1973-pm-gps",
++ },
++};
++
++static int __devinit gta01_pm_gps_init(void)
++{
++ return platform_driver_register(&gta01_pm_gps_driver);
++}
++
++static void gta01_pm_gps_exit(void)
++{
++ platform_driver_unregister(&gta01_pm_gps_driver);
++}
++
++module_init(gta01_pm_gps_init);
++module_exit(gta01_pm_gps_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
++MODULE_DESCRIPTION("FIC Neo1973 GPS Power Management");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/neo1973_pm_gps.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/neo1973_pm_gps.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/neo1973_pm_gps.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/neo1973_pm_gps.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1 @@
++extern int neo1973_pm_gps_is_on(void);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,380 @@
++/*
++ * GSM Management code for the FIC Neo1973 GSM Phone
++ *
++ * (C) 2007 by Openmoko Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * All rights reserved.
++ *
++ * 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
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/platform_device.h>
++#include <linux/console.h>
++#include <linux/errno.h>
++#include <linux/interrupt.h>
++#include <linux/delay.h>
++
++#include <mach/gpio.h>
++#include <asm/mach-types.h>
++#include <mach/gta01.h>
++#include <asm/plat-s3c24xx/neo1973.h>
++#include <mach/s3c24xx-serial.h>
++
++#include <mach/hardware.h>
++#include <mach/cpu.h>
++
++/* For GTA02 */
++#include <mach/gta02.h>
++#include <linux/mfd/pcf50633/gpio.h>
++#include <mach/regs-gpio.h>
++#include <mach/regs-gpioj.h>
++
++int gta_gsm_interrupts;
++EXPORT_SYMBOL(gta_gsm_interrupts);
++
++extern void s3c24xx_serial_console_set_silence(int);
++
++struct gta01pm_priv {
++ int gpio_ngsm_en;
++ int gpio_ndl_gsm;
++
++ struct console *con;
++};
++
++static struct gta01pm_priv gta01_gsm;
++
++static struct console *find_s3c24xx_console(void)
++{
++ struct console *con;
++
++ acquire_console_sem();
++
++ for (con = console_drivers; con; con = con->next) {
++ if (!strcmp(con->name, "ttySAC"))
++ break;
++ }
++
++ release_console_sem();
++
++ return con;
++}
++
++static ssize_t gsm_read(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ if (!strcmp(attr->attr.name, "power_on")) {
++ if (gta01_gsm.gpio_ngsm_en) {
++ if (!s3c2410_gpio_getpin(gta01_gsm.gpio_ngsm_en))
++ goto out_1;
++ } else if (machine_is_neo1973_gta02())
++ if (pcf50633_gpio_get(gta02_pcf, PCF50633_GPIO2))
++ goto out_1;
++ } else if (!strcmp(attr->attr.name, "download")) {
++ if (machine_is_neo1973_gta01()) {
++ if (s3c2410_gpio_getpin(GTA01_GPIO_MODEM_DNLOAD))
++ goto out_1;
++ } else if (machine_is_neo1973_gta02()) {
++ if (!s3c2410_gpio_getpin(GTA02_GPIO_nDL_GSM))
++ goto out_1;
++ }
++ } else if (!strcmp(attr->attr.name, "flowcontrolled")) {
++ if (s3c2410_gpio_getcfg(S3C2410_GPH1) == S3C2410_GPIO_OUTPUT)
++ goto out_1;
++ }
++
++ return strlcpy(buf, "0\n", 3);
++out_1:
++ return strlcpy(buf, "1\n", 3);
++}
++
++static void gsm_on_off(struct device *dev, int on)
++{
++ if (!on) {
++ if (machine_is_neo1973_gta02()) {
++ /*
++ * Do not drive into powered-down GSM side
++ * GTA02 only, because on GTA01 maybe serial
++ * is used otherwise.
++ */
++ s3c2410_gpio_cfgpin(S3C2410_GPH1, S3C2410_GPIO_INPUT);
++ s3c2410_gpio_cfgpin(S3C2410_GPH2, S3C2410_GPIO_INPUT);
++
++ pcf50633_gpio_set(gta02_pcf, PCF50633_GPIO2, 0);
++ }
++
++ if (gta01_gsm.gpio_ngsm_en)
++ s3c2410_gpio_setpin(gta01_gsm.gpio_ngsm_en, 1);
++
++ if (gta01_gsm.con) {
++ s3c24xx_serial_console_set_silence(0);
++ console_start(gta01_gsm.con);
++
++ dev_dbg(dev, "powered down GTA01 GSM, enabling "
++ "serial console\n");
++ }
++
++ return;
++ }
++
++ if (gta01_gsm.con) {
++ dev_dbg(dev, "powering up GSM, thus "
++ "disconnecting serial console\n");
++
++ console_stop(gta01_gsm.con);
++ s3c24xx_serial_console_set_silence(1);
++ }
++
++ /* allow UART to talk to GSM side now we will power it */
++ s3c2410_gpio_cfgpin(S3C2410_GPH1, S3C2410_GPH1_nRTS0);
++ s3c2410_gpio_cfgpin(S3C2410_GPH2, S3C2410_GPH2_TXD0);
++
++ if (gta01_gsm.gpio_ngsm_en)
++ s3c2410_gpio_setpin(gta01_gsm.gpio_ngsm_en, 0);
++
++ if (machine_is_neo1973_gta02())
++ pcf50633_gpio_set(gta02_pcf, PCF50633_GPIO2, 7);
++
++ msleep(100);
++
++ neo1973_gpb_setpin(GTA01_GPIO_MODEM_ON, 1);
++ msleep(500);
++ neo1973_gpb_setpin(GTA01_GPIO_MODEM_ON, 0);
++
++ /*
++ * workaround for calypso firmware moko10 and earlier,
++ * without this it will leave IRQ line high after
++ * booting
++ */
++ s3c2410_gpio_setpin(S3C2410_GPH1, 1);
++ s3c2410_gpio_cfgpin(S3C2410_GPH1, S3C2410_GPH1_OUTP);
++ msleep(1000);
++ s3c2410_gpio_cfgpin(S3C2410_GPH1, S3C2410_GPH1_nRTS0);
++
++}
++
++static ssize_t gsm_write(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ unsigned long on = simple_strtoul(buf, NULL, 10);
++
++ if (!strcmp(attr->attr.name, "power_on")) {
++ gsm_on_off(dev, on);
++
++ return count;
++ }
++
++ if (!strcmp(attr->attr.name, "download")) {
++ if (machine_is_neo1973_gta01())
++ s3c2410_gpio_setpin(GTA01_GPIO_MODEM_DNLOAD, on);
++
++ if (machine_is_neo1973_gta02()) {
++ /*
++ * the keyboard / buttons driver requests and enables
++ * the JACK_INSERT IRQ. We have to take care about
++ * not enabling and disabling the IRQ when it was
++ * already in that state or we get "unblanaced IRQ"
++ * kernel warnings and stack dumps. So we use the
++ * copy of the ndl_gsm state to figure out if we should
++ * enable or disable the jack interrupt
++ */
++ if (on) {
++ if (gta01_gsm.gpio_ndl_gsm)
++ disable_irq(gpio_to_irq(
++ GTA02_GPIO_JACK_INSERT));
++ } else {
++ if (!gta01_gsm.gpio_ndl_gsm)
++ enable_irq(gpio_to_irq(
++ GTA02_GPIO_JACK_INSERT));
++ }
++
++ gta01_gsm.gpio_ndl_gsm = !on;
++ s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, !on);
++ }
++
++ return count;
++ }
++
++ if (!strcmp(attr->attr.name, "flowcontrolled")) {
++ if (on) {
++ gta_gsm_interrupts = 0;
++ s3c2410_gpio_setpin(S3C2410_GPH1, 1);
++ s3c2410_gpio_cfgpin(S3C2410_GPH1, S3C2410_GPH1_OUTP);
++ } else
++ s3c2410_gpio_cfgpin(S3C2410_GPH1, S3C2410_GPH1_nRTS0);
++ }
++
++ return count;
++}
++
++static DEVICE_ATTR(power_on, 0644, gsm_read, gsm_write);
++static DEVICE_ATTR(reset, 0644, gsm_read, gsm_write);
++static DEVICE_ATTR(download, 0644, gsm_read, gsm_write);
++static DEVICE_ATTR(flowcontrolled, 0644, gsm_read, gsm_write);
++
++#ifdef CONFIG_PM
++
++static int gta01_gsm_resume(struct platform_device *pdev);
++static int gta01_gsm_suspend(struct platform_device *pdev, pm_message_t state)
++{
++ /* GPIO state is saved/restored by S3C2410 core GPIO driver, so we
++ * don't need to do much here. */
++
++ /* If flowcontrol asserted, abort if GSM already interrupted */
++ if (s3c2410_gpio_getcfg(S3C2410_GPH1) == S3C2410_GPIO_OUTPUT) {
++ if (gta_gsm_interrupts)
++ goto busy;
++ }
++
++ /* disable DL GSM to prevent jack_insert becoming 'floating' */
++ if (machine_is_neo1973_gta02())
++ s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, 1);
++ return 0;
++
++busy:
++ return -EBUSY;
++}
++
++static int
++gta01_gsm_suspend_late(struct platform_device *pdev, pm_message_t state)
++{
++ /* Last chance: abort if GSM already interrupted */
++ if (s3c2410_gpio_getcfg(S3C2410_GPH1) == S3C2410_GPIO_OUTPUT) {
++ if (gta_gsm_interrupts)
++ return -EBUSY;
++ }
++ return 0;
++}
++
++static int gta01_gsm_resume(struct platform_device *pdev)
++{
++ /* GPIO state is saved/restored by S3C2410 core GPIO driver, so we
++ * don't need to do much here. */
++
++ /* Make sure that the kernel console on the serial port is still
++ * disabled. FIXME: resume ordering race with serial driver! */
++ if (gta01_gsm.con && s3c2410_gpio_getpin(GTA01_GPIO_MODEM_ON))
++ console_stop(gta01_gsm.con);
++
++ if (machine_is_neo1973_gta02())
++ s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, gta01_gsm.gpio_ndl_gsm);
++
++ return 0;
++}
++#else
++#define gta01_gsm_suspend NULL
++#define gta01_gsm_suspend_late NULL
++#define gta01_gsm_resume NULL
++#endif /* CONFIG_PM */
++
++static struct attribute *gta01_gsm_sysfs_entries[] = {
++ &dev_attr_power_on.attr,
++ &dev_attr_reset.attr,
++ &dev_attr_download.attr,
++ &dev_attr_flowcontrolled.attr,
++ NULL
++};
++
++static struct attribute_group gta01_gsm_attr_group = {
++ .name = NULL,
++ .attrs = gta01_gsm_sysfs_entries,
++};
++
++static int __init gta01_gsm_probe(struct platform_device *pdev)
++{
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA01v3_SYSTEM_REV:
++ gta01_gsm.gpio_ngsm_en = GTA01v3_GPIO_nGSM_EN;
++ break;
++ case GTA01v4_SYSTEM_REV:
++ gta01_gsm.gpio_ngsm_en = 0;
++ break;
++ case GTA01Bv2_SYSTEM_REV:
++ case GTA01Bv3_SYSTEM_REV:
++ case GTA01Bv4_SYSTEM_REV:
++ gta01_gsm.gpio_ngsm_en = GTA01Bv2_GPIO_nGSM_EN;
++ s3c2410_gpio_setpin(GTA01v3_GPIO_nGSM_EN, 0);
++ break;
++ case GTA02v1_SYSTEM_REV:
++ case GTA02v2_SYSTEM_REV:
++ case GTA02v3_SYSTEM_REV:
++ case GTA02v4_SYSTEM_REV:
++ case GTA02v5_SYSTEM_REV:
++ case GTA02v6_SYSTEM_REV:
++ gta01_gsm.gpio_ngsm_en = 0;
++ break;
++ default:
++ dev_warn(&pdev->dev, "Unknown Neo1973 Revision 0x%x, "
++ "some PM features not available!!!\n",
++ system_rev);
++ break;
++ }
++
++ switch (S3C_SYSTEM_REV_ATAG) {
++ case GTA01v4_SYSTEM_REV:
++ case GTA01Bv2_SYSTEM_REV:
++ gta01_gsm_sysfs_entries[ARRAY_SIZE(gta01_gsm_sysfs_entries)-2] =
++ &dev_attr_download.attr;
++ break;
++ default:
++ break;
++ }
++
++ if (machine_is_neo1973_gta01()) {
++ gta01_gsm.con = find_s3c24xx_console();
++ if (!gta01_gsm.con)
++ dev_warn(&pdev->dev,
++ "cannot find S3C24xx console driver\n");
++ } else
++ gta01_gsm.con = NULL;
++
++ /* note that download initially disabled, and enforce that */
++ gta01_gsm.gpio_ndl_gsm = 1;
++ if (machine_is_neo1973_gta02())
++ s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, 1);
++
++ /* GSM is to be initially off (at boot, or if this module inserted) */
++ gsm_on_off(&pdev->dev, 0);
++
++ return sysfs_create_group(&pdev->dev.kobj, &gta01_gsm_attr_group);
++}
++
++static int gta01_gsm_remove(struct platform_device *pdev)
++{
++ sysfs_remove_group(&pdev->dev.kobj, &gta01_gsm_attr_group);
++
++ return 0;
++}
++
++static struct platform_driver gta01_gsm_driver = {
++ .probe = gta01_gsm_probe,
++ .remove = gta01_gsm_remove,
++ .suspend = gta01_gsm_suspend,
++ .suspend_late = gta01_gsm_suspend_late,
++ .resume = gta01_gsm_resume,
++ .driver = {
++ .name = "neo1973-pm-gsm",
++ },
++};
++
++static int __devinit gta01_gsm_init(void)
++{
++ return platform_driver_register(&gta01_gsm_driver);
++}
++
++static void gta01_gsm_exit(void)
++{
++ platform_driver_unregister(&gta01_gsm_driver);
++}
++
++module_init(gta01_gsm_init);
++module_exit(gta01_gsm_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
++MODULE_DESCRIPTION("FIC Neo1973 GSM Power Management");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/neo1973_shadow.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/neo1973_shadow.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/neo1973_shadow.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/neo1973_shadow.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,88 @@
++/*
++ * include/asm-arm/plat-s3c24xx/neo1973.h
++ *
++ * Common utility code for GTA01 and GTA02
++ *
++ * Copyright (C) 2008 by Openmoko, Inc.
++ * Author: Holger Hans Peter Freyther <freyther@openmoko.org>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/io.h>
++#include <linux/irq.h>
++
++#include <asm/gpio.h>
++#include <mach/regs-gpio.h>
++#include <asm/plat-s3c24xx/neo1973.h>
++
++/**
++ * Shadow GPIO bank B handling. For the LEDs we need to keep track of the state
++ * in software. The s3c2410_gpio_setpin must not be used for GPIOs on bank B
++ */
++static unsigned long gpb_mask;
++static unsigned long gpb_state;
++
++void neo1973_gpb_add_shadow_gpio(unsigned int gpio)
++{
++ unsigned long offset = S3C2410_GPIO_OFFSET(gpio);
++ unsigned long flags;
++
++ local_irq_save(flags);
++ gpb_mask |= 1L << offset;
++ local_irq_restore(flags);
++}
++EXPORT_SYMBOL(neo1973_gpb_add_shadow_gpio);
++
++static void set_shadow_gpio(unsigned long offset, unsigned int value)
++{
++ unsigned long state = value != 0;
++
++ gpb_state &= ~(1L << offset);
++ gpb_state |= state << offset;
++}
++
++void neo1973_gpb_setpin(unsigned int pin, unsigned to)
++{
++ void __iomem *base = S3C24XX_GPIO_BASE(S3C2410_GPB0);
++ unsigned long offset = S3C2410_GPIO_OFFSET(pin);
++ unsigned long flags;
++ unsigned long dat;
++
++ BUG_ON(base != S3C24XX_GPIO_BASE(pin));
++
++ local_irq_save(flags);
++ dat = __raw_readl(base + 0x04);
++
++ /* Add the shadow values */
++ dat &= ~gpb_mask;
++ dat |= gpb_state;
++
++ /* Do the operation like s3c2410_gpio_setpin */
++ dat &= ~(1L << offset);
++ dat |= to << offset;
++
++ /* Update the shadow state */
++ if ((1L << offset) & gpb_mask)
++ set_shadow_gpio(offset, to);
++
++ __raw_writel(dat, base + 0x04);
++ local_irq_restore(flags);
++}
++EXPORT_SYMBOL(neo1973_gpb_setpin);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/pm.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/pm.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/pm.c 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/pm.c 2009-05-10 22:27:59.000000000 +0200
+@@ -31,28 +31,20 @@
+ #include <linux/errno.h>
+ #include <linux/time.h>
+ #include <linux/interrupt.h>
+-#include <linux/crc32.h>
+-#include <linux/ioport.h>
+ #include <linux/serial_core.h>
+ #include <linux/io.h>
+
+-#include <asm/cacheflush.h>
+-#include <mach/hardware.h>
+-
+ #include <plat/regs-serial.h>
+ #include <mach/regs-clock.h>
+ #include <mach/regs-gpio.h>
+ #include <mach/regs-mem.h>
+ #include <mach/regs-irq.h>
++#include <mach/hardware.h>
+
+ #include <asm/mach/time.h>
+
+ #include <plat/pm.h>
+
+-/* for external use */
+-
+-unsigned long s3c_pm_flags;
+-
+ #define PFX "s3c24xx-pm: "
+
+ static struct sleep_save core_save[] = {
+@@ -84,364 +76,17 @@
+ SAVE_ITEM(S3C2410_CLKSLOW),
+ };
+
+-static struct gpio_sleep {
+- void __iomem *base;
+- unsigned int gpcon;
+- unsigned int gpdat;
+- unsigned int gpup;
+-} gpio_save[] = {
+- [0] = {
+- .base = S3C2410_GPACON,
+- },
+- [1] = {
+- .base = S3C2410_GPBCON,
+- },
+- [2] = {
+- .base = S3C2410_GPCCON,
+- },
+- [3] = {
+- .base = S3C2410_GPDCON,
+- },
+- [4] = {
+- .base = S3C2410_GPECON,
+- },
+- [5] = {
+- .base = S3C2410_GPFCON,
+- },
+- [6] = {
+- .base = S3C2410_GPGCON,
+- },
+- [7] = {
+- .base = S3C2410_GPHCON,
+- },
+-};
+-
+ static struct sleep_save misc_save[] = {
+ SAVE_ITEM(S3C2410_DCLKCON),
+ };
+
+-#ifdef CONFIG_S3C2410_PM_DEBUG
+-
+-#define SAVE_UART(va) \
+- SAVE_ITEM((va) + S3C2410_ULCON), \
+- SAVE_ITEM((va) + S3C2410_UCON), \
+- SAVE_ITEM((va) + S3C2410_UFCON), \
+- SAVE_ITEM((va) + S3C2410_UMCON), \
+- SAVE_ITEM((va) + S3C2410_UBRDIV)
+-
+-static struct sleep_save uart_save[] = {
+- SAVE_UART(S3C24XX_VA_UART0),
+- SAVE_UART(S3C24XX_VA_UART1),
+-#ifndef CONFIG_CPU_S3C2400
+- SAVE_UART(S3C24XX_VA_UART2),
+-#endif
+-};
+-
+-/* debug
+- *
+- * we send the debug to printascii() to allow it to be seen if the
+- * system never wakes up from the sleep
+-*/
+-
+-extern void printascii(const char *);
+-
+-void pm_dbg(const char *fmt, ...)
+-{
+- va_list va;
+- char buff[256];
+-
+- va_start(va, fmt);
+- vsprintf(buff, fmt, va);
+- va_end(va);
+-
+- printascii(buff);
+-}
+-
+-static void s3c2410_pm_debug_init(void)
+-{
+- unsigned long tmp = __raw_readl(S3C2410_CLKCON);
+-
+- /* re-start uart clocks */
+- tmp |= S3C2410_CLKCON_UART0;
+- tmp |= S3C2410_CLKCON_UART1;
+- tmp |= S3C2410_CLKCON_UART2;
+-
+- __raw_writel(tmp, S3C2410_CLKCON);
+- udelay(10);
+-}
+-
+-#define DBG(fmt...) pm_dbg(fmt)
+-#else
+-#define DBG(fmt...) printk(KERN_DEBUG fmt)
+-
+-#define s3c2410_pm_debug_init() do { } while(0)
+-
+-static struct sleep_save uart_save[] = {};
+-#endif
+-
+-#if defined(CONFIG_S3C2410_PM_CHECK) && CONFIG_S3C2410_PM_CHECK_CHUNKSIZE != 0
+-
+-/* suspend checking code...
+- *
+- * this next area does a set of crc checks over all the installed
+- * memory, so the system can verify if the resume was ok.
+- *
+- * CONFIG_S3C2410_PM_CHECK_CHUNKSIZE defines the block-size for the CRC,
+- * increasing it will mean that the area corrupted will be less easy to spot,
+- * and reducing the size will cause the CRC save area to grow
+-*/
+-
+-#define CHECK_CHUNKSIZE (CONFIG_S3C2410_PM_CHECK_CHUNKSIZE * 1024)
+-
+-static u32 crc_size; /* size needed for the crc block */
+-static u32 *crcs; /* allocated over suspend/resume */
+-
+-typedef u32 *(run_fn_t)(struct resource *ptr, u32 *arg);
+-
+-/* s3c2410_pm_run_res
+- *
+- * go thorugh the given resource list, and look for system ram
+-*/
+-
+-static void s3c2410_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg)
+-{
+- while (ptr != NULL) {
+- if (ptr->child != NULL)
+- s3c2410_pm_run_res(ptr->child, fn, arg);
+-
+- if ((ptr->flags & IORESOURCE_MEM) &&
+- strcmp(ptr->name, "System RAM") == 0) {
+- DBG("Found system RAM at %08lx..%08lx\n",
+- ptr->start, ptr->end);
+- arg = (fn)(ptr, arg);
+- }
+-
+- ptr = ptr->sibling;
+- }
+-}
+-
+-static void s3c2410_pm_run_sysram(run_fn_t fn, u32 *arg)
+-{
+- s3c2410_pm_run_res(&iomem_resource, fn, arg);
+-}
+-
+-static u32 *s3c2410_pm_countram(struct resource *res, u32 *val)
+-{
+- u32 size = (u32)(res->end - res->start)+1;
+-
+- size += CHECK_CHUNKSIZE-1;
+- size /= CHECK_CHUNKSIZE;
+-
+- DBG("Area %08lx..%08lx, %d blocks\n", res->start, res->end, size);
+-
+- *val += size * sizeof(u32);
+- return val;
+-}
+-
+-/* s3c2410_pm_prepare_check
+- *
+- * prepare the necessary information for creating the CRCs. This
+- * must be done before the final save, as it will require memory
+- * allocating, and thus touching bits of the kernel we do not
+- * know about.
+-*/
+-
+-static void s3c2410_pm_check_prepare(void)
+-{
+- crc_size = 0;
+-
+- s3c2410_pm_run_sysram(s3c2410_pm_countram, &crc_size);
+-
+- DBG("s3c2410_pm_prepare_check: %u checks needed\n", crc_size);
+-
+- crcs = kmalloc(crc_size+4, GFP_KERNEL);
+- if (crcs == NULL)
+- printk(KERN_ERR "Cannot allocated CRC save area\n");
+-}
+-
+-static u32 *s3c2410_pm_makecheck(struct resource *res, u32 *val)
+-{
+- unsigned long addr, left;
+-
+- for (addr = res->start; addr < res->end;
+- addr += CHECK_CHUNKSIZE) {
+- left = res->end - addr;
+-
+- if (left > CHECK_CHUNKSIZE)
+- left = CHECK_CHUNKSIZE;
+-
+- *val = crc32_le(~0, phys_to_virt(addr), left);
+- val++;
+- }
+-
+- return val;
+-}
+-
+-/* s3c2410_pm_check_store
+- *
+- * compute the CRC values for the memory blocks before the final
+- * sleep.
+-*/
+-
+-static void s3c2410_pm_check_store(void)
+-{
+- if (crcs != NULL)
+- s3c2410_pm_run_sysram(s3c2410_pm_makecheck, crcs);
+-}
+-
+-/* in_region
+- *
+- * return TRUE if the area defined by ptr..ptr+size contatins the
+- * what..what+whatsz
+-*/
+-
+-static inline int in_region(void *ptr, int size, void *what, size_t whatsz)
+-{
+- if ((what+whatsz) < ptr)
+- return 0;
+-
+- if (what > (ptr+size))
+- return 0;
+-
+- return 1;
+-}
+-
+-static u32 *s3c2410_pm_runcheck(struct resource *res, u32 *val)
+-{
+- void *save_at = phys_to_virt(s3c2410_sleep_save_phys);
+- unsigned long addr;
+- unsigned long left;
+- void *ptr;
+- u32 calc;
+-
+- for (addr = res->start; addr < res->end;
+- addr += CHECK_CHUNKSIZE) {
+- left = res->end - addr;
+-
+- if (left > CHECK_CHUNKSIZE)
+- left = CHECK_CHUNKSIZE;
+-
+- ptr = phys_to_virt(addr);
+-
+- if (in_region(ptr, left, crcs, crc_size)) {
+- DBG("skipping %08lx, has crc block in\n", addr);
+- goto skip_check;
+- }
+-
+- if (in_region(ptr, left, save_at, 32*4 )) {
+- DBG("skipping %08lx, has save block in\n", addr);
+- goto skip_check;
+- }
+-
+- /* calculate and check the checksum */
+-
+- calc = crc32_le(~0, ptr, left);
+- if (calc != *val) {
+- printk(KERN_ERR PFX "Restore CRC error at "
+- "%08lx (%08x vs %08x)\n", addr, calc, *val);
+-
+- DBG("Restore CRC error at %08lx (%08x vs %08x)\n",
+- addr, calc, *val);
+- }
+-
+- skip_check:
+- val++;
+- }
+-
+- return val;
+-}
+-
+-/* s3c2410_pm_check_restore
+- *
+- * check the CRCs after the restore event and free the memory used
+- * to hold them
+-*/
+-
+-static void s3c2410_pm_check_restore(void)
+-{
+- if (crcs != NULL) {
+- s3c2410_pm_run_sysram(s3c2410_pm_runcheck, crcs);
+- kfree(crcs);
+- crcs = NULL;
+- }
+-}
+-
+-#else
+-
+-#define s3c2410_pm_check_prepare() do { } while(0)
+-#define s3c2410_pm_check_restore() do { } while(0)
+-#define s3c2410_pm_check_store() do { } while(0)
+-#endif
+-
+-/* helper functions to save and restore register state */
+-
+-void s3c2410_pm_do_save(struct sleep_save *ptr, int count)
+-{
+- for (; count > 0; count--, ptr++) {
+- ptr->val = __raw_readl(ptr->reg);
+- DBG("saved %p value %08lx\n", ptr->reg, ptr->val);
+- }
+-}
+-
+-/* s3c2410_pm_do_restore
+- *
+- * restore the system from the given list of saved registers
+- *
+- * Note, we do not use DBG() in here, as the system may not have
+- * restore the UARTs state yet
+-*/
+-
+-void s3c2410_pm_do_restore(struct sleep_save *ptr, int count)
+-{
+- for (; count > 0; count--, ptr++) {
+- printk(KERN_DEBUG "restore %p (restore %08lx, was %08x)\n",
+- ptr->reg, ptr->val, __raw_readl(ptr->reg));
+-
+- __raw_writel(ptr->val, ptr->reg);
+- }
+-}
+-
+-/* s3c2410_pm_do_restore_core
+- *
+- * similar to s3c2410_pm_do_restore_core
+- *
+- * WARNING: Do not put any debug in here that may effect memory or use
+- * peripherals, as things may be changing!
+-*/
+-
+-static void s3c2410_pm_do_restore_core(struct sleep_save *ptr, int count)
+-{
+- for (; count > 0; count--, ptr++) {
+- __raw_writel(ptr->val, ptr->reg);
+- }
+-}
+-
+-/* s3c2410_pm_show_resume_irqs
+- *
+- * print any IRQs asserted at resume time (ie, we woke from)
+-*/
+-
+-static void s3c2410_pm_show_resume_irqs(int start, unsigned long which,
+- unsigned long mask)
+-{
+- int i;
+-
+- which &= ~mask;
+-
+- for (i = 0; i <= 31; i++) {
+- if ((which) & (1L<<i)) {
+- DBG("IRQ %d asserted at resume\n", start+i);
+- }
+- }
+-}
+-
+-/* s3c2410_pm_check_resume_pin
++/* s3c_pm_check_resume_pin
+ *
+ * check to see if the pin is configured correctly for sleep mode, and
+ * make any necessary adjustments if it is not
+ */
+
+-static void s3c2410_pm_check_resume_pin(unsigned int pin, unsigned int irqoffs)
++static void s3c_pm_check_resume_pin(unsigned int pin, unsigned int irqoffs)
+ {
+ unsigned long irqstate;
+ unsigned long pinstate;
+@@ -456,21 +101,21 @@
+
+ if (!irqstate) {
+ if (pinstate == S3C2410_GPIO_IRQ)
+- DBG("Leaving IRQ %d (pin %d) enabled\n", irq, pin);
++ S3C_PMDBG("Leaving IRQ %d (pin %d) enabled\n", irq, pin);
+ } else {
+ if (pinstate == S3C2410_GPIO_IRQ) {
+- DBG("Disabling IRQ %d (pin %d)\n", irq, pin);
++ S3C_PMDBG("Disabling IRQ %d (pin %d)\n", irq, pin);
+ s3c2410_gpio_cfgpin(pin, S3C2410_GPIO_INPUT);
+ }
+ }
+ }
+
+-/* s3c2410_pm_configure_extint
++/* s3c_pm_configure_extint
+ *
+ * configure all external interrupt pins
+ */
+
+-static void s3c2410_pm_configure_extint(void)
++void s3c_pm_configure_extint(void)
+ {
+ int pin;
+
+@@ -480,336 +125,24 @@
+ */
+
+ for (pin = S3C2410_GPF0; pin <= S3C2410_GPF7; pin++) {
+- s3c2410_pm_check_resume_pin(pin, pin - S3C2410_GPF0);
++ s3c_pm_check_resume_pin(pin, pin - S3C2410_GPF0);
+ }
+
+ for (pin = S3C2410_GPG0; pin <= S3C2410_GPG7; pin++) {
+- s3c2410_pm_check_resume_pin(pin, (pin - S3C2410_GPG0)+8);
+- }
+-}
+-
+-/* offsets for CON/DAT/UP registers */
+-
+-#define OFFS_CON (S3C2410_GPACON - S3C2410_GPACON)
+-#define OFFS_DAT (S3C2410_GPADAT - S3C2410_GPACON)
+-#define OFFS_UP (S3C2410_GPBUP - S3C2410_GPBCON)
+-
+-/* s3c2410_pm_save_gpios()
+- *
+- * Save the state of the GPIOs
+- */
+-
+-static void s3c2410_pm_save_gpios(void)
+-{
+- struct gpio_sleep *gps = gpio_save;
+- unsigned int gpio;
+-
+- for (gpio = 0; gpio < ARRAY_SIZE(gpio_save); gpio++, gps++) {
+- void __iomem *base = gps->base;
+-
+- gps->gpcon = __raw_readl(base + OFFS_CON);
+- gps->gpdat = __raw_readl(base + OFFS_DAT);
+-
+- if (gpio > 0)
+- gps->gpup = __raw_readl(base + OFFS_UP);
+-
+- }
+-}
+-
+-/* Test whether the given masked+shifted bits of an GPIO configuration
+- * are one of the SFN (special function) modes. */
+-
+-static inline int is_sfn(unsigned long con)
+-{
+- return (con == 2 || con == 3);
+-}
+-
+-/* Test if the given masked+shifted GPIO configuration is an input */
+-
+-static inline int is_in(unsigned long con)
+-{
+- return con == 0;
+-}
+-
+-/* Test if the given masked+shifted GPIO configuration is an output */
+-
+-static inline int is_out(unsigned long con)
+-{
+- return con == 1;
+-}
+-
+-/* s3c2410_pm_restore_gpio()
+- *
+- * Restore one of the GPIO banks that was saved during suspend. This is
+- * not as simple as once thought, due to the possibility of glitches
+- * from the order that the CON and DAT registers are set in.
+- *
+- * The three states the pin can be are {IN,OUT,SFN} which gives us 9
+- * combinations of changes to check. Three of these, if the pin stays
+- * in the same configuration can be discounted. This leaves us with
+- * the following:
+- *
+- * { IN => OUT } Change DAT first
+- * { IN => SFN } Change CON first
+- * { OUT => SFN } Change CON first, so new data will not glitch
+- * { OUT => IN } Change CON first, so new data will not glitch
+- * { SFN => IN } Change CON first
+- * { SFN => OUT } Change DAT first, so new data will not glitch [1]
+- *
+- * We do not currently deal with the UP registers as these control
+- * weak resistors, so a small delay in change should not need to bring
+- * these into the calculations.
+- *
+- * [1] this assumes that writing to a pin DAT whilst in SFN will set the
+- * state for when it is next output.
+- */
+-
+-static void s3c2410_pm_restore_gpio(int index, struct gpio_sleep *gps)
+-{
+- void __iomem *base = gps->base;
+- unsigned long gps_gpcon = gps->gpcon;
+- unsigned long gps_gpdat = gps->gpdat;
+- unsigned long old_gpcon;
+- unsigned long old_gpdat;
+- unsigned long old_gpup = 0x0;
+- unsigned long gpcon;
+- int nr;
+-
+- old_gpcon = __raw_readl(base + OFFS_CON);
+- old_gpdat = __raw_readl(base + OFFS_DAT);
+-
+- if (base == S3C2410_GPACON) {
+- /* GPACON only has one bit per control / data and no PULLUPs.
+- * GPACON[x] = 0 => Output, 1 => SFN */
+-
+- /* first set all SFN bits to SFN */
+-
+- gpcon = old_gpcon | gps->gpcon;
+- __raw_writel(gpcon, base + OFFS_CON);
+-
+- /* now set all the other bits */
+-
+- __raw_writel(gps_gpdat, base + OFFS_DAT);
+- __raw_writel(gps_gpcon, base + OFFS_CON);
+- } else {
+- unsigned long old, new, mask;
+- unsigned long change_mask = 0x0;
+-
+- old_gpup = __raw_readl(base + OFFS_UP);
+-
+- /* Create a change_mask of all the items that need to have
+- * their CON value changed before their DAT value, so that
+- * we minimise the work between the two settings.
+- */
+-
+- for (nr = 0, mask = 0x03; nr < 32; nr += 2, mask <<= 2) {
+- old = (old_gpcon & mask) >> nr;
+- new = (gps_gpcon & mask) >> nr;
+-
+- /* If there is no change, then skip */
+-
+- if (old == new)
+- continue;
+-
+- /* If both are special function, then skip */
+-
+- if (is_sfn(old) && is_sfn(new))
+- continue;
+-
+- /* Change is IN => OUT, do not change now */
+-
+- if (is_in(old) && is_out(new))
+- continue;
+-
+- /* Change is SFN => OUT, do not change now */
+-
+- if (is_sfn(old) && is_out(new))
+- continue;
+-
+- /* We should now be at the case of IN=>SFN,
+- * OUT=>SFN, OUT=>IN, SFN=>IN. */
+-
+- change_mask |= mask;
+- }
+-
+- /* Write the new CON settings */
+-
+- gpcon = old_gpcon & ~change_mask;
+- gpcon |= gps_gpcon & change_mask;
+-
+- __raw_writel(gpcon, base + OFFS_CON);
+-
+- /* Now change any items that require DAT,CON */
+-
+- __raw_writel(gps_gpdat, base + OFFS_DAT);
+- __raw_writel(gps_gpcon, base + OFFS_CON);
+- __raw_writel(gps->gpup, base + OFFS_UP);
++ s3c_pm_check_resume_pin(pin, (pin - S3C2410_GPG0)+8);
+ }
+-
+- DBG("GPIO[%d] CON %08lx => %08lx, DAT %08lx => %08lx\n",
+- index, old_gpcon, gps_gpcon, old_gpdat, gps_gpdat);
+ }
+
+
+-/** s3c2410_pm_restore_gpios()
+- *
+- * Restore the state of the GPIOs
+- */
+-
+-static void s3c2410_pm_restore_gpios(void)
++void s3c_pm_restore_core(void)
+ {
+- struct gpio_sleep *gps = gpio_save;
+- int gpio;
+-
+- for (gpio = 0; gpio < ARRAY_SIZE(gpio_save); gpio++, gps++) {
+- s3c2410_pm_restore_gpio(gpio, gps);
+- }
++ s3c_pm_do_restore_core(core_save, ARRAY_SIZE(core_save));
++ s3c_pm_do_restore(misc_save, ARRAY_SIZE(misc_save));
+ }
+
+-void (*pm_cpu_prep)(void);
+-void (*pm_cpu_sleep)(void);
+-
+-#define any_allowed(mask, allow) (((mask) & (allow)) != (allow))
+-
+-/* s3c2410_pm_enter
+- *
+- * central control for sleep/resume process
+-*/
+-
+-static int s3c2410_pm_enter(suspend_state_t state)
++void s3c_pm_save_core(void)
+ {
+- unsigned long regs_save[16];
+-
+- /* ensure the debug is initialised (if enabled) */
+-
+- s3c2410_pm_debug_init();
+-
+- DBG("s3c2410_pm_enter(%d)\n", state);
+-
+- if (pm_cpu_prep == NULL || pm_cpu_sleep == NULL) {
+- printk(KERN_ERR PFX "error: no cpu sleep functions set\n");
+- return -EINVAL;
+- }
+-
+- /* check if we have anything to wake-up with... bad things seem
+- * to happen if you suspend with no wakeup (system will often
+- * require a full power-cycle)
+- */
+-
+- if (!any_allowed(s3c_irqwake_intmask, s3c_irqwake_intallow) &&
+- !any_allowed(s3c_irqwake_eintmask, s3c_irqwake_eintallow)) {
+- printk(KERN_ERR PFX "No sources enabled for wake-up!\n");
+- printk(KERN_ERR PFX "Aborting sleep\n");
+- return -EINVAL;
+- }
+-
+- /* prepare check area if configured */
+-
+- s3c2410_pm_check_prepare();
+-
+- /* store the physical address of the register recovery block */
+-
+- s3c2410_sleep_save_phys = virt_to_phys(regs_save);
+-
+- DBG("s3c2410_sleep_save_phys=0x%08lx\n", s3c2410_sleep_save_phys);
+-
+- /* save all necessary core registers not covered by the drivers */
+-
+- s3c2410_pm_save_gpios();
+- s3c2410_pm_do_save(misc_save, ARRAY_SIZE(misc_save));
+- s3c2410_pm_do_save(core_save, ARRAY_SIZE(core_save));
+- s3c2410_pm_do_save(uart_save, ARRAY_SIZE(uart_save));
+-
+- /* set the irq configuration for wake */
+-
+- s3c2410_pm_configure_extint();
+-
+- DBG("sleep: irq wakeup masks: %08lx,%08lx\n",
+- s3c_irqwake_intmask, s3c_irqwake_eintmask);
+-
+- __raw_writel(s3c_irqwake_intmask, S3C2410_INTMSK);
+- __raw_writel(s3c_irqwake_eintmask, S3C2410_EINTMASK);
+-
+- /* ack any outstanding external interrupts before we go to sleep */
+-
+- __raw_writel(__raw_readl(S3C2410_EINTPEND), S3C2410_EINTPEND);
+- __raw_writel(__raw_readl(S3C2410_INTPND), S3C2410_INTPND);
+- __raw_writel(__raw_readl(S3C2410_SRCPND), S3C2410_SRCPND);
+-
+- /* call cpu specific preparation */
+-
+- pm_cpu_prep();
+-
+- /* flush cache back to ram */
+-
+- flush_cache_all();
+-
+- s3c2410_pm_check_store();
+-
+- /* send the cpu to sleep... */
+-
+- __raw_writel(0x00, S3C2410_CLKCON); /* turn off clocks over sleep */
+-
+- /* s3c2410_cpu_save will also act as our return point from when
+- * we resume as it saves its own register state, so use the return
+- * code to differentiate return from save and return from sleep */
+-
+- if (s3c2410_cpu_save(regs_save) == 0) {
+- flush_cache_all();
+- pm_cpu_sleep();
+- }
+-
+- /* restore the cpu state */
+-
+- cpu_init();
+-
+- /* restore the system state */
+-
+- s3c2410_pm_do_restore_core(core_save, ARRAY_SIZE(core_save));
+- s3c2410_pm_do_restore(misc_save, ARRAY_SIZE(misc_save));
+- s3c2410_pm_do_restore(uart_save, ARRAY_SIZE(uart_save));
+- s3c2410_pm_restore_gpios();
+-
+- s3c2410_pm_debug_init();
+-
+- /* check what irq (if any) restored the system */
+-
+- DBG("post sleep: IRQs 0x%08x, 0x%08x\n",
+- __raw_readl(S3C2410_SRCPND),
+- __raw_readl(S3C2410_EINTPEND));
+-
+- s3c2410_pm_show_resume_irqs(IRQ_EINT0, __raw_readl(S3C2410_SRCPND),
+- s3c_irqwake_intmask);
+-
+- s3c2410_pm_show_resume_irqs(IRQ_EINT4-4, __raw_readl(S3C2410_EINTPEND),
+- s3c_irqwake_eintmask);
+-
+- DBG("post sleep, preparing to return\n");
+-
+- s3c2410_pm_check_restore();
+-
+- /* ok, let's return from sleep */
+-
+- DBG("S3C2410 PM Resume (post-restore)\n");
+- return 0;
++ s3c_pm_do_save(misc_save, ARRAY_SIZE(misc_save));
++ s3c_pm_do_save(core_save, ARRAY_SIZE(core_save));
+ }
+
+-static struct platform_suspend_ops s3c2410_pm_ops = {
+- .enter = s3c2410_pm_enter,
+- .valid = suspend_valid_only_mem,
+-};
+-
+-/* s3c2410_pm_init
+- *
+- * Attach the power management functions. This should be called
+- * from the board specific initialisation if the board supports
+- * it.
+-*/
+-
+-int __init s3c2410_pm_init(void)
+-{
+- printk("S3C2410 Power Management, (c) 2004 Simtec Electronics\n");
+-
+- suspend_set_ops(&s3c2410_pm_ops);
+- return 0;
+-}
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/pm-simtec.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/pm-simtec.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/pm-simtec.c 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/pm-simtec.c 2009-05-10 22:27:59.000000000 +0200
+@@ -61,7 +61,7 @@
+
+ __raw_writel(gstatus4, S3C2410_GSTATUS4);
+
+- return s3c2410_pm_init();
++ return s3c_pm_init();
+ }
+
+ arch_initcall(pm_simtec_init);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/pwm-clock.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/pwm-clock.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/pwm-clock.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/pwm-clock.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,437 @@
++/* linux/arch/arm/plat-s3c24xx/pwm-clock.c
++ *
++ * Copyright (c) 2007 Simtec Electronics
++ * Copyright (c) 2007, 2008 Ben Dooks
++ * Ben Dooks <ben-linux@fluff.org>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License.
++*/
++
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/list.h>
++#include <linux/errno.h>
++#include <linux/clk.h>
++#include <linux/err.h>
++#include <linux/io.h>
++
++#include <mach/hardware.h>
++#include <asm/irq.h>
++
++#include <mach/regs-clock.h>
++#include <mach/regs-gpio.h>
++
++#include <asm/plat-s3c24xx/clock.h>
++#include <asm/plat-s3c24xx/cpu.h>
++
++#include <asm/plat-s3c/regs-timer.h>
++
++/* Each of the timers 0 through 5 go through the following
++ * clock tree, with the inputs depending on the timers.
++ *
++ * pclk ---- [ prescaler 0 ] -+---> timer 0
++ * +---> timer 1
++ *
++ * pclk ---- [ prescaler 1 ] -+---> timer 2
++ * +---> timer 3
++ * \---> timer 4
++ *
++ * Which are fed into the timers as so:
++ *
++ * prescaled 0 ---- [ div 2,4,8,16 ] ---\
++ * [mux] -> timer 0
++ * tclk 0 ------------------------------/
++ *
++ * prescaled 0 ---- [ div 2,4,8,16 ] ---\
++ * [mux] -> timer 1
++ * tclk 0 ------------------------------/
++ *
++ *
++ * prescaled 1 ---- [ div 2,4,8,16 ] ---\
++ * [mux] -> timer 2
++ * tclk 1 ------------------------------/
++ *
++ * prescaled 1 ---- [ div 2,4,8,16 ] ---\
++ * [mux] -> timer 3
++ * tclk 1 ------------------------------/
++ *
++ * prescaled 1 ---- [ div 2,4,8, 16 ] --\
++ * [mux] -> timer 4
++ * tclk 1 ------------------------------/
++ *
++ * Since the mux and the divider are tied together in the
++ * same register space, it is impossible to set the parent
++ * and the rate at the same time. To avoid this, we add an
++ * intermediate 'prescaled-and-divided' clock to select
++ * as the parent for the timer input clock called tdiv.
++ *
++ * prescaled clk --> pwm-tdiv ---\
++ * [ mux ] --> timer X
++ * tclk -------------------------/
++*/
++
++static unsigned long clk_pwm_scaler_getrate(struct clk *clk)
++{
++ unsigned long tcfg0 = __raw_readl(S3C2410_TCFG0);
++
++ if (clk->id == 1) {
++ tcfg0 &= S3C2410_TCFG_PRESCALER1_MASK;
++ tcfg0 >>= S3C2410_TCFG_PRESCALER1_SHIFT;
++ } else {
++ tcfg0 &= S3C2410_TCFG_PRESCALER0_MASK;
++ }
++
++ return clk_get_rate(clk->parent) / (tcfg0 + 1);
++}
++
++/* TODO - add set rate calls. */
++
++static struct clk clk_timer_scaler[] = {
++ [0] = {
++ .name = "pwm-scaler0",
++ .id = -1,
++ .get_rate = clk_pwm_scaler_getrate,
++ },
++ [1] = {
++ .name = "pwm-scaler1",
++ .id = -1,
++ .get_rate = clk_pwm_scaler_getrate,
++ },
++};
++
++static struct clk clk_timer_tclk[] = {
++ [0] = {
++ .name = "pwm-tclk0",
++ .id = -1,
++ },
++ [1] = {
++ .name = "pwm-tclk1",
++ .id = -1,
++ },
++};
++
++struct pwm_tdiv_clk {
++ struct clk clk;
++ unsigned int divisor;
++};
++
++static inline struct pwm_tdiv_clk *to_tdiv(struct clk *clk)
++{
++ return container_of(clk, struct pwm_tdiv_clk, clk);
++}
++
++static inline unsigned long tcfg_to_divisor(unsigned long tcfg1)
++{
++ return 1 << (1 + tcfg1);
++}
++
++static unsigned long clk_pwm_tdiv_get_rate(struct clk *clk)
++{
++ unsigned long tcfg1 = __raw_readl(S3C2410_TCFG1);
++ unsigned int divisor;
++
++ tcfg1 >>= S3C2410_TCFG1_SHIFT(clk->id);
++ tcfg1 &= S3C2410_TCFG1_MUX_MASK;
++
++ if (tcfg1 == S3C2410_TCFG1_MUX_TCLK)
++ divisor = to_tdiv(clk)->divisor;
++ else
++ divisor = tcfg_to_divisor(tcfg1);
++
++ return clk_get_rate(clk->parent) / divisor;
++}
++
++static unsigned long clk_pwm_tdiv_round_rate(struct clk *clk,
++ unsigned long rate)
++{
++ unsigned long parent_rate;
++ unsigned long divisor;
++
++ parent_rate = clk_get_rate(clk->parent);
++ divisor = parent_rate / rate;
++
++ if (divisor <= 2)
++ divisor = 2;
++ else if (divisor <= 4)
++ divisor = 4;
++ else if (divisor <= 8)
++ divisor = 8;
++ else
++ divisor = 16;
++
++ return parent_rate / divisor;
++}
++
++static unsigned long clk_pwm_tdiv_bits(struct pwm_tdiv_clk *divclk)
++{
++ unsigned long bits;
++
++ switch (divclk->divisor) {
++ case 2:
++ bits = S3C2410_TCFG1_MUX_DIV2;
++ break;
++ case 4:
++ bits = S3C2410_TCFG1_MUX_DIV4;
++ break;
++ case 8:
++ bits = S3C2410_TCFG1_MUX_DIV8;
++ break;
++ case 16:
++ default:
++ bits = S3C2410_TCFG1_MUX_DIV16;
++ break;
++ }
++
++ return bits;
++}
++
++static void clk_pwm_tdiv_update(struct pwm_tdiv_clk *divclk)
++{
++ unsigned long tcfg1 = __raw_readl(S3C2410_TCFG1);
++ unsigned long bits = clk_pwm_tdiv_bits(divclk);
++ unsigned long flags;
++ unsigned long shift = S3C2410_TCFG1_SHIFT(divclk->clk.id);
++
++ local_irq_save(flags);
++
++ tcfg1 = __raw_readl(S3C2410_TCFG1);
++ tcfg1 &= ~(S3C2410_TCFG1_MUX_MASK << shift);
++ tcfg1 |= bits << shift;
++ __raw_writel(tcfg1, S3C2410_TCFG1);
++
++ local_irq_restore(flags);
++}
++
++static int clk_pwm_tdiv_set_rate(struct clk *clk, unsigned long rate)
++{
++ struct pwm_tdiv_clk *divclk = to_tdiv(clk);
++ unsigned long tcfg1 = __raw_readl(S3C2410_TCFG1);
++ unsigned long parent_rate = clk_get_rate(clk->parent);
++ unsigned long divisor;
++
++ tcfg1 >>= S3C2410_TCFG1_SHIFT(clk->id);
++ tcfg1 &= S3C2410_TCFG1_MUX_MASK;
++
++ rate = clk_round_rate(clk, rate);
++ divisor = parent_rate / rate;
++
++ if (divisor > 16)
++ return -EINVAL;
++
++ divclk->divisor = divisor;
++
++ /* Update the current MUX settings if we are currently
++ * selected as the clock source for this clock. */
++
++ if (tcfg1 != S3C2410_TCFG1_MUX_TCLK)
++ clk_pwm_tdiv_update(divclk);
++
++ return 0;
++}
++
++static struct pwm_tdiv_clk clk_timer_tdiv[] = {
++ [0] = {
++ .clk = {
++ .name = "pwm-tdiv",
++ .parent = &clk_timer_scaler[0],
++ .get_rate = clk_pwm_tdiv_get_rate,
++ .set_rate = clk_pwm_tdiv_set_rate,
++ .round_rate = clk_pwm_tdiv_round_rate,
++ },
++ },
++ [1] = {
++ .clk = {
++ .name = "pwm-tdiv",
++ .parent = &clk_timer_scaler[0],
++ .get_rate = clk_pwm_tdiv_get_rate,
++ .set_rate = clk_pwm_tdiv_set_rate,
++ .round_rate = clk_pwm_tdiv_round_rate,
++ }
++ },
++ [2] = {
++ .clk = {
++ .name = "pwm-tdiv",
++ .parent = &clk_timer_scaler[1],
++ .get_rate = clk_pwm_tdiv_get_rate,
++ .set_rate = clk_pwm_tdiv_set_rate,
++ .round_rate = clk_pwm_tdiv_round_rate,
++ },
++ },
++ [3] = {
++ .clk = {
++ .name = "pwm-tdiv",
++ .parent = &clk_timer_scaler[1],
++ .get_rate = clk_pwm_tdiv_get_rate,
++ .set_rate = clk_pwm_tdiv_set_rate,
++ .round_rate = clk_pwm_tdiv_round_rate,
++ },
++ },
++ [4] = {
++ .clk = {
++ .name = "pwm-tdiv",
++ .parent = &clk_timer_scaler[1],
++ .get_rate = clk_pwm_tdiv_get_rate,
++ .set_rate = clk_pwm_tdiv_set_rate,
++ .round_rate = clk_pwm_tdiv_round_rate,
++ },
++ },
++};
++
++static int __init clk_pwm_tdiv_register(unsigned int id)
++{
++ struct pwm_tdiv_clk *divclk = &clk_timer_tdiv[id];
++ unsigned long tcfg1 = __raw_readl(S3C2410_TCFG1);
++
++ tcfg1 >>= S3C2410_TCFG1_SHIFT(id);
++ tcfg1 &= S3C2410_TCFG1_MUX_MASK;
++
++ divclk->clk.id = id;
++ divclk->divisor = tcfg_to_divisor(tcfg1);
++
++ return s3c24xx_register_clock(&divclk->clk);
++}
++
++static inline struct clk *s3c24xx_pwmclk_tclk(unsigned int id)
++{
++ return (id >= 2) ? &clk_timer_tclk[1] : &clk_timer_tclk[0];
++}
++
++static inline struct clk *s3c24xx_pwmclk_tdiv(unsigned int id)
++{
++ return &clk_timer_tdiv[id].clk;
++}
++
++static int clk_pwm_tin_set_parent(struct clk *clk, struct clk *parent)
++{
++ unsigned int id = clk->id;
++ unsigned long tcfg1;
++ unsigned long flags;
++ unsigned long bits;
++ unsigned long shift = S3C2410_TCFG1_SHIFT(id);
++
++ if (parent == s3c24xx_pwmclk_tclk(id))
++ bits = S3C2410_TCFG1_MUX_TCLK << shift;
++ else if (parent == s3c24xx_pwmclk_tdiv(id))
++ bits = clk_pwm_tdiv_bits(to_tdiv(parent)) << shift;
++ else
++ return -EINVAL;
++
++ clk->parent = parent;
++
++ local_irq_save(flags);
++
++ tcfg1 = __raw_readl(S3C2410_TCFG1);
++ tcfg1 &= ~(S3C2410_TCFG1_MUX_MASK << shift);
++ __raw_writel(tcfg1 | bits, S3C2410_TCFG1);
++
++ local_irq_restore(flags);
++
++ return 0;
++}
++
++static struct clk clk_tin[] = {
++ [0] = {
++ .name = "pwm-tin",
++ .id = 0,
++ .set_parent = clk_pwm_tin_set_parent,
++ },
++ [1] = {
++ .name = "pwm-tin",
++ .id = 1,
++ .set_parent = clk_pwm_tin_set_parent,
++ },
++ [2] = {
++ .name = "pwm-tin",
++ .id = 2,
++ .set_parent = clk_pwm_tin_set_parent,
++ },
++ [3] = {
++ .name = "pwm-tin",
++ .id = 3,
++ .set_parent = clk_pwm_tin_set_parent,
++ },
++ [4] = {
++ .name = "pwm-tin",
++ .id = 4,
++ .set_parent = clk_pwm_tin_set_parent,
++ },
++};
++
++static __init int clk_pwm_tin_register(struct clk *pwm)
++{
++ unsigned long tcfg1 = __raw_readl(S3C2410_TCFG1);
++ unsigned int id = pwm->id;
++
++ struct clk *parent;
++ int ret;
++
++ ret = s3c24xx_register_clock(pwm);
++ if (ret < 0)
++ return ret;
++
++ tcfg1 >>= S3C2410_TCFG1_SHIFT(id);
++ tcfg1 &= S3C2410_TCFG1_MUX_MASK;
++
++ if (tcfg1 == S3C2410_TCFG1_MUX_TCLK)
++ parent = s3c24xx_pwmclk_tclk(id);
++ else
++ parent = s3c24xx_pwmclk_tdiv(id);
++
++ return clk_set_parent(pwm, parent);
++}
++
++static __init int s3c24xx_pwmclk_init(void)
++{
++ struct clk *clk_timers;
++ unsigned int clk;
++ int ret;
++
++ clk_timers = clk_get(NULL, "timers");
++ if (IS_ERR(clk_timers)) {
++ printk(KERN_ERR "%s: no parent clock\n", __func__);
++ return -EINVAL;
++ }
++
++ for (clk = 0; clk < ARRAY_SIZE(clk_timer_scaler); clk++) {
++ clk_timer_scaler[clk].parent = clk_timers;
++ ret = s3c24xx_register_clock(&clk_timer_scaler[clk]);
++ if (ret < 0) {
++ printk(KERN_ERR "error adding pwm scaler%d clock\n", clk);
++ goto err;
++ }
++ }
++
++ for (clk = 0; clk < ARRAY_SIZE(clk_timer_tclk); clk++) {
++ ret = s3c24xx_register_clock(&clk_timer_tclk[clk]);
++ if (ret < 0) {
++ printk(KERN_ERR "error adding pww tclk%d\n", clk);
++ goto err;
++ }
++ }
++
++ for (clk = 0; clk < ARRAY_SIZE(clk_timer_tdiv); clk++) {
++ ret = clk_pwm_tdiv_register(clk);
++ if (ret < 0) {
++ printk(KERN_ERR "error adding pwm%d tdiv clock\n", clk);
++ goto err;
++ }
++ }
++
++ for (clk = 0; clk < ARRAY_SIZE(clk_tin); clk++) {
++ ret = clk_pwm_tin_register(&clk_tin[clk]);
++ if (ret < 0) {
++ printk(KERN_ERR "error adding pwm%d tin clock\n", clk);
++ goto err;
++ }
++ }
++
++ return 0;
++
++ err:
++ return ret;
++}
++
++arch_initcall(s3c24xx_pwmclk_init);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/s3c244x.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/s3c244x.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/s3c244x.c 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/s3c244x.c 2009-05-10 22:27:59.000000000 +0200
+@@ -59,6 +59,8 @@
+ s3c24xx_init_uartdevs("s3c2440-uart", s3c2410_uart_resources, cfg, no);
+ }
+
++extern struct platform_device s3c_device_ts;
++
+ void __init s3c244x_map_io(void)
+ {
+ /* register our io-tables */
+@@ -70,6 +72,7 @@
+ s3c_device_sdi.name = "s3c2440-sdi";
+ s3c_device_i2c0.name = "s3c2440-i2c";
+ s3c_device_nand.name = "s3c2440-nand";
++ s3c_device_ts.name = "s3c2440-ts";
+ s3c_device_usbgadget.name = "s3c2440-usbgadget";
+ }
+
+@@ -145,13 +148,13 @@
+
+ static int s3c244x_suspend(struct sys_device *dev, pm_message_t state)
+ {
+- s3c2410_pm_do_save(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep));
++ s3c_pm_do_save(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep));
+ return 0;
+ }
+
+ static int s3c244x_resume(struct sys_device *dev)
+ {
+- s3c2410_pm_do_restore(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep));
++ s3c_pm_do_restore(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep));
+ return 0;
+ }
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/sleep.S linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/sleep.S
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/sleep.S 2009-05-10 22:05:03.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/sleep.S 2009-05-10 22:27:59.000000000 +0200
+@@ -41,7 +41,7 @@
+
+ .text
+
+- /* s3c2410_cpu_save
++ /* s3c_cpu_save
+ *
+ * save enough of the CPU state to allow us to re-start
+ * pm.c code. as we store items like the sp/lr, we will
+@@ -59,7 +59,7 @@
+ * 1 => resumed from sleep
+ */
+
+-ENTRY(s3c2410_cpu_save)
++ENTRY(s3c_cpu_save)
+ stmfd sp!, { r4 - r12, lr }
+
+ @@ store co-processor registers
+@@ -84,7 +84,7 @@
+ .ltorg
+
+ @@ the next bits sit in the .data segment, even though they
+- @@ happen to be code... the s3c2410_sleep_save_phys needs to be
++ @@ happen to be code... the s3c_sleep_save_phys needs to be
+ @@ accessed by the resume code before it can restore the MMU.
+ @@ This means that the variable has to be close enough for the
+ @@ code to read it... since the .text segment needs to be RO,
+@@ -92,19 +92,19 @@
+
+ .data
+
+- .global s3c2410_sleep_save_phys
+-s3c2410_sleep_save_phys:
++ .global s3c_sleep_save_phys
++s3c_sleep_save_phys:
+ .word 0
+
+
+ /* sleep magic, to allow the bootloader to check for an valid
+ * image to resume to. Must be the first word before the
+- * s3c2410_cpu_resume entry.
++ * s3c_cpu_resume entry.
+ */
+
+ .word 0x2bedf00d
+
+- /* s3c2410_cpu_resume
++ /* s3c_cpu_resume
+ *
+ * resume code entry for bootloader to call
+ *
+@@ -113,7 +113,7 @@
+ * must not write to the code segment (code is read-only)
+ */
+
+-ENTRY(s3c2410_cpu_resume)
++ENTRY(s3c_cpu_resume)
+ mov r0, #PSR_I_BIT | PSR_F_BIT | SVC_MODE
+ msr cpsr_c, r0
+
+@@ -145,7 +145,7 @@
+ mcr p15, 0, r1, c8, c7, 0 @@ invalidate I & D TLBs
+ mcr p15, 0, r1, c7, c7, 0 @@ invalidate I & D caches
+
+- ldr r0, s3c2410_sleep_save_phys @ address of restore block
++ ldr r0, s3c_sleep_save_phys @ address of restore block
+ ldmia r0, { r4 - r13 }
+
+ mcr p15, 0, r4, c13, c0, 0 @ PID
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/time.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/time.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c24xx/time.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c24xx/time.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,480 @@
++/* linux/arch/arm/plat-s3c24xx/time.c
++ *
++ * Copyright (C) 2003-2005 Simtec Electronics
++ * Ben Dooks, <ben@simtec.co.uk>
++ *
++ * dyn_tick support by Andrzej Zaborowski based on omap_dyn_tick_timer.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ */
++
++#include <linux/kernel.h>
++#include <linux/sched.h>
++#include <linux/init.h>
++#include <linux/interrupt.h>
++#include <linux/irq.h>
++#include <linux/err.h>
++#include <linux/clk.h>
++
++#include <asm/system.h>
++#include <asm/leds.h>
++#include <asm/mach-types.h>
++
++#include <asm/io.h>
++#include <asm/irq.h>
++#include <mach/map.h>
++#include <asm/plat-s3c/regs-timer.h>
++#include <mach/regs-irq.h>
++#include <asm/mach/time.h>
++
++#include <asm/plat-s3c24xx/clock.h>
++#include <asm/plat-s3c24xx/cpu.h>
++
++static unsigned long timer_startval;
++static unsigned long timer_usec_ticks;
++static struct work_struct resume_work;
++
++unsigned long pclk;
++struct clk *clk;
++
++#define TIMER_USEC_SHIFT 16
++
++/* we use the shifted arithmetic to work out the ratio of timer ticks
++ * to usecs, as often the peripheral clock is not a nice even multiple
++ * of 1MHz.
++ *
++ * shift of 14 and 15 are too low for the 12MHz, 16 seems to be ok
++ * for the current HZ value of 200 without producing overflows.
++ *
++ * Original patch by Dimitry Andric, updated by Ben Dooks
++*/
++
++
++/* timer_mask_usec_ticks
++ *
++ * given a clock and divisor, make the value to pass into timer_ticks_to_usec
++ * to scale the ticks into usecs
++*/
++
++static inline unsigned long
++timer_mask_usec_ticks(unsigned long scaler, unsigned long pclk)
++{
++ unsigned long den = pclk / 1000;
++
++ return ((1000 << TIMER_USEC_SHIFT) * scaler + (den >> 1)) / den;
++}
++
++/* timer_ticks_to_usec
++ *
++ * convert timer ticks to usec.
++*/
++
++static inline unsigned long timer_ticks_to_usec(unsigned long ticks)
++{
++ unsigned long res;
++
++ res = ticks * timer_usec_ticks;
++ res += 1 << (TIMER_USEC_SHIFT - 4); /* round up slightly */
++
++ return res >> TIMER_USEC_SHIFT;
++}
++
++/***
++ * Returns microsecond since last clock interrupt. Note that interrupts
++ * will have been disabled by do_gettimeoffset()
++ * IRQs are disabled before entering here from do_gettimeofday()
++ */
++
++#define SRCPND_TIMER4 (1<<(IRQ_TIMER4 - IRQ_EINT0))
++
++unsigned long s3c2410_gettimeoffset (void)
++{
++ unsigned long tdone;
++ unsigned long irqpend;
++ unsigned long tval;
++
++ /* work out how many ticks have gone since last timer interrupt */
++
++ tval = __raw_readl(S3C2410_TCNTO(4));
++ tdone = timer_startval - tval;
++
++ /* check to see if there is an interrupt pending */
++
++ irqpend = __raw_readl(S3C2410_SRCPND);
++ if (irqpend & SRCPND_TIMER4) {
++ /* re-read the timer, and try and fix up for the missed
++ * interrupt. Note, the interrupt may go off before the
++ * timer has re-loaded from wrapping.
++ */
++
++ tval = __raw_readl(S3C2410_TCNTO(4));
++ tdone = timer_startval - tval;
++
++ if (tval != 0)
++ tdone += timer_startval;
++ }
++
++ return timer_ticks_to_usec(tdone);
++}
++
++
++/*
++ * IRQ handler for the timer
++ */
++static irqreturn_t
++s3c2410_timer_interrupt(int irq, void *dev_id)
++{
++ timer_tick();
++ return IRQ_HANDLED;
++}
++
++static struct irqaction s3c2410_timer_irq = {
++ .name = "S3C2410 Timer Tick",
++ .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
++ .handler = s3c2410_timer_interrupt,
++};
++
++#define use_tclk1_12() ( \
++ machine_is_bast() || \
++ machine_is_vr1000() || \
++ machine_is_anubis() || \
++ machine_is_osiris() )
++
++/*
++ * Set up timer interrupt, and return the current time in seconds.
++ *
++ * Currently we only use timer4, as it is the only timer which has no
++ * other function that can be exploited externally
++ */
++static void s3c2410_timer_setup (void)
++{
++ unsigned long tcon;
++ unsigned long tcnt;
++ unsigned long tcfg1;
++ unsigned long tcfg0;
++
++ tcnt = 0xffff; /* default value for tcnt */
++
++ /* read the current timer configuration bits */
++
++ tcon = __raw_readl(S3C2410_TCON);
++ tcfg1 = __raw_readl(S3C2410_TCFG1);
++ tcfg0 = __raw_readl(S3C2410_TCFG0);
++
++ /* configure the system for whichever machine is in use */
++
++ if (use_tclk1_12()) {
++ /* timer is at 12MHz, scaler is 1 */
++ timer_usec_ticks = timer_mask_usec_ticks(1, 12000000);
++ tcnt = 12000000 / HZ;
++
++ tcfg1 &= ~S3C2410_TCFG1_MUX4_MASK;
++ tcfg1 |= S3C2410_TCFG1_MUX4_TCLK1;
++ } else {
++ /* since values around 50 to
++ * 70MHz are not values we can directly generate the timer
++ * value from, we need to pre-scale and divide before using it.
++ *
++ * for instance, using 50.7MHz and dividing by 6 gives 8.45MHz
++ * (8.45 ticks per usec)
++ */
++
++ /* configure clock tick */
++ timer_usec_ticks = timer_mask_usec_ticks(6, pclk);
++ printk("timer_usec_ticks = %lu\n", timer_usec_ticks);
++
++ tcfg1 &= ~S3C2410_TCFG1_MUX4_MASK;
++ tcfg1 |= S3C2410_TCFG1_MUX4_DIV2;
++
++ tcfg0 &= ~S3C2410_TCFG_PRESCALER1_MASK;
++ tcfg0 |= ((6 - 1) / 2) << S3C2410_TCFG_PRESCALER1_SHIFT;
++
++ tcnt = (pclk / 6) / HZ;
++ }
++
++ /* timers reload after counting zero, so reduce the count by 1 */
++
++ tcnt--;
++
++ printk("timer tcon=%08lx, tcnt %04lx, tcfg %08lx,%08lx, usec %08lx\n",
++ tcon, tcnt, tcfg0, tcfg1, timer_usec_ticks);
++
++ /* check to see if timer is within 16bit range... */
++ if (tcnt > 0xffff) {
++ panic("setup_timer: HZ is too small, cannot configure timer!");
++ return;
++ }
++
++ __raw_writel(tcfg1, S3C2410_TCFG1);
++ __raw_writel(tcfg0, S3C2410_TCFG0);
++
++ timer_startval = tcnt;
++ __raw_writel(tcnt, S3C2410_TCNTB(4));
++
++ /* ensure timer is stopped... */
++
++ tcon &= ~(7<<20);
++ tcon |= S3C2410_TCON_T4RELOAD;
++ tcon |= S3C2410_TCON_T4MANUALUPD;
++
++ __raw_writel(tcon, S3C2410_TCON);
++ __raw_writel(tcnt, S3C2410_TCNTB(4));
++ __raw_writel(tcnt, S3C2410_TCMPB(4));
++
++ /* start the timer running */
++ tcon |= S3C2410_TCON_T4START;
++ tcon &= ~S3C2410_TCON_T4MANUALUPD;
++ __raw_writel(tcon, S3C2410_TCON);
++
++ __raw_writel(__raw_readl(S3C2410_INTMSK) & (~(1UL << 14)),
++ S3C2410_INTMSK);
++
++}
++
++struct sys_timer s3c24xx_timer;
++static void timer_resume_work(struct work_struct *work)
++{
++ clk_enable(clk);
++
++#ifdef CONFIG_NO_IDLE_HZ
++ if (s3c24xx_timer.dyn_tick->state & DYN_TICK_ENABLED)
++ s3c24xx_timer.dyn_tick->enable();
++ else
++#endif
++ s3c2410_timer_setup();
++}
++
++static void __init s3c2410_timer_init (void)
++{
++ if (!use_tclk1_12()) {
++ /* for the h1940 (and others), we use the pclk from the core
++ * to generate the timer values.
++ */
++
++ /* this is used as default if no other timer can be found */
++ clk = clk_get(NULL, "timers");
++ if (IS_ERR(clk))
++ panic("failed to get clock for system timer");
++
++ clk_enable(clk);
++
++ pclk = clk_get_rate(clk);
++ printk("pclk = %lu\n", pclk);
++ }
++
++ INIT_WORK(&resume_work, timer_resume_work);
++ s3c2410_timer_setup();
++ setup_irq(IRQ_TIMER4, &s3c2410_timer_irq);
++}
++
++static void s3c2410_timer_resume_work(struct work_struct *work)
++{
++ s3c2410_timer_setup();
++}
++
++static void s3c2410_timer_resume(void)
++{
++ static DECLARE_WORK(work, s3c2410_timer_resume_work);
++ int res;
++
++ res = schedule_work(&work);
++ if (!res)
++ printk(KERN_ERR
++ "s3c2410_timer_resume_work already queued ???\n");
++}
++
++#ifdef CONFIG_NO_IDLE_HZ
++/*
++ * We'll set a constant prescaler so we don't have to bother setting it
++ * when reprogramming and so that we avoid costly divisions.
++ *
++ * (2 * HZ) << INPUT_FREQ_SHIFT is the desired frequency after prescaler.
++ * At HZ == 200, HZ * 1024 should work for PCLKs of up to ~53.5 MHz.
++ */
++#define INPUT_FREQ_SHIFT 9
++
++static int ticks_last;
++static int ticks_left;
++static uint32_t tcnto_last;
++
++static inline int s3c24xx_timer_read(void)
++{
++ uint32_t tcnto = __raw_readl(S3C2410_TCNTO(4));
++
++ /*
++ * WARNING: sometimes we get called before TCNTB has been
++ * loaded into the counter and TCNTO then returns its previous
++ * value and kill us, so don't do anything before counter is
++ * reloaded.
++ */
++ if (unlikely(tcnto == tcnto_last))
++ return ticks_last;
++
++ tcnto_last = -1;
++ return tcnto <<
++ ((__raw_readl(S3C2410_TCFG1) >> S3C2410_TCFG1_MUX4_SHIFT) & 3);
++}
++
++static inline void s3c24xx_timer_program(int ticks)
++{
++ uint32_t tcon = __raw_readl(S3C2410_TCON) & ~(7 << 20);
++ uint32_t tcfg1 = __raw_readl(S3C2410_TCFG1) & ~S3C2410_TCFG1_MUX4_MASK;
++
++ /* Just make sure the timer is stopped. */
++ __raw_writel(tcon, S3C2410_TCON);
++
++ /* TODO: add likely()ies / unlikely()ies */
++ if (ticks >> 18) {
++ ticks_last = min(ticks, 0xffff << 3);
++ ticks_left = ticks - ticks_last;
++ __raw_writel(tcfg1 | S3C2410_TCFG1_MUX4_DIV16, S3C2410_TCFG1);
++ __raw_writel(ticks_last >> 3, S3C2410_TCNTB(4));
++ } else if (ticks >> 17) {
++ ticks_last = ticks;
++ ticks_left = 0;
++ __raw_writel(tcfg1 | S3C2410_TCFG1_MUX4_DIV8, S3C2410_TCFG1);
++ __raw_writel(ticks_last >> 2, S3C2410_TCNTB(4));
++ } else if (ticks >> 16) {
++ ticks_last = ticks;
++ ticks_left = 0;
++ __raw_writel(tcfg1 | S3C2410_TCFG1_MUX4_DIV4, S3C2410_TCFG1);
++ __raw_writel(ticks_last >> 1, S3C2410_TCNTB(4));
++ } else {
++ ticks_last = ticks;
++ ticks_left = 0;
++ __raw_writel(tcfg1 | S3C2410_TCFG1_MUX4_DIV2, S3C2410_TCFG1);
++ __raw_writel(ticks_last >> 0, S3C2410_TCNTB(4));
++ }
++
++ tcnto_last = __raw_readl(S3C2410_TCNTO(4));
++ __raw_writel(tcon | S3C2410_TCON_T4MANUALUPD,
++ S3C2410_TCON);
++ __raw_writel(tcon | S3C2410_TCON_T4START,
++ S3C2410_TCON);
++}
++
++/*
++ * If we have already waited all the time we were supposed to wait,
++ * kick the timer, setting the longest allowed timeout value just
++ * for time-keeping.
++ */
++static inline void s3c24xx_timer_program_idle(void)
++{
++ s3c24xx_timer_program(0xffff << 3);
++}
++
++static inline void s3c24xx_timer_update(int restart)
++{
++ int ticks_cur = s3c24xx_timer_read();
++ int jiffies_elapsed = (ticks_last - ticks_cur) >> INPUT_FREQ_SHIFT;
++ int subjiffy = ticks_last - (jiffies_elapsed << INPUT_FREQ_SHIFT);
++
++ if (restart) {
++ if (ticks_left >= (1 << INPUT_FREQ_SHIFT))
++ s3c24xx_timer_program(ticks_left);
++ else
++ s3c24xx_timer_program_idle();
++ ticks_last += subjiffy;
++ } else
++ ticks_last = subjiffy;
++
++ while (jiffies_elapsed --)
++ timer_tick();
++}
++
++/* Called when the timer expires. */
++static irqreturn_t s3c24xx_timer_handler(int irq, void *dev_id)
++{
++ tcnto_last = -1;
++ s3c24xx_timer_update(1);
++
++ return IRQ_HANDLED;
++}
++
++/* Called to update jiffies with time elapsed. */
++static irqreturn_t s3c24xx_timer_handler_dyn_tick(int irq, void *dev_id)
++{
++ s3c24xx_timer_update(0);
++
++ return IRQ_HANDLED;
++}
++
++/*
++ * Programs the next timer interrupt needed. Called when dynamic tick is
++ * enabled, and to reprogram the ticks to skip from pm_idle. The CPU goes
++ * to sleep directly after this.
++ */
++static void s3c24xx_timer_reprogram_dyn_tick(unsigned long next_jiffies)
++{
++ int subjiffy_left = ticks_last - s3c24xx_timer_read();
++
++ s3c24xx_timer_program(max((int) next_jiffies, 1) << INPUT_FREQ_SHIFT);
++ ticks_last += subjiffy_left;
++}
++
++static unsigned long s3c24xx_timer_offset_dyn_tick(void)
++{
++ /* TODO */
++ return 0;
++}
++
++static int s3c24xx_timer_enable_dyn_tick(void)
++{
++ /* Set our constant prescaler. */
++ uint32_t tcfg0 = __raw_readl(S3C2410_TCFG0);
++ int prescaler =
++ max(min(256, (int) pclk / (HZ << (INPUT_FREQ_SHIFT + 1))), 1);
++
++ tcfg0 &= ~S3C2410_TCFG_PRESCALER1_MASK;
++ tcfg0 |= (prescaler - 1) << S3C2410_TCFG_PRESCALER1_SHIFT;
++ __raw_writel(tcfg0, S3C2410_TCFG0);
++
++ /* Override handlers. */
++ s3c2410_timer_irq.handler = s3c24xx_timer_handler;
++ s3c24xx_timer.offset = s3c24xx_timer_offset_dyn_tick;
++
++ printk(KERN_INFO "dyn_tick enabled on s3c24xx timer 4, "
++ "%li Hz pclk with prescaler %i\n", pclk, prescaler);
++
++ s3c24xx_timer_program_idle();
++
++ return 0;
++}
++
++static int s3c24xx_timer_disable_dyn_tick(void)
++{
++ s3c2410_timer_irq.handler = s3c2410_timer_interrupt;
++ s3c24xx_timer.offset = s3c2410_gettimeoffset;
++ s3c2410_timer_setup();
++
++ return 0;
++}
++
++static struct dyn_tick_timer s3c24xx_dyn_tick_timer = {
++ .enable = s3c24xx_timer_enable_dyn_tick,
++ .disable = s3c24xx_timer_disable_dyn_tick,
++ .reprogram = s3c24xx_timer_reprogram_dyn_tick,
++ .handler = s3c24xx_timer_handler_dyn_tick,
++};
++#endif /* CONFIG_NO_IDLE_HZ */
++
++struct sys_timer s3c24xx_timer = {
++ .init = s3c2410_timer_init,
++ .offset = s3c2410_gettimeoffset,
++ .resume = s3c2410_timer_resume,
++#ifdef CONFIG_NO_IDLE_HZ
++ .dyn_tick = &s3c24xx_dyn_tick_timer,
++#endif
++};
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/clock.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/clock.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/clock.c 2009-05-10 22:08:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/clock.c 2009-05-10 22:27:59.000000000 +0200
+@@ -27,6 +27,12 @@
+ #include <plat/devs.h>
+ #include <plat/clock.h>
+
++struct clk clk_h2 = {
++ .name = "hclk2",
++ .id = -1,
++ .rate = 0,
++};
++
+ struct clk clk_27m = {
+ .name = "clk_27m",
+ .id = -1,
+@@ -83,7 +89,7 @@
+ return s3c64xx_gate(S3C_PCLK_GATE, clk, enable);
+ }
+
+-static int s3c64xx_hclk_ctrl(struct clk *clk, int enable)
++int s3c64xx_hclk_ctrl(struct clk *clk, int enable)
+ {
+ return s3c64xx_gate(S3C_HCLK_GATE, clk, enable);
+ }
+@@ -152,6 +158,30 @@
+ .parent = &clk_48m,
+ .enable = s3c64xx_sclk_ctrl,
+ .ctrlbit = S3C_CLKCON_SCLK_MMC2_48,
++ }, {
++ .name = "dma0",
++ .id = -1,
++ .parent = &clk_h,
++ .enable = s3c64xx_hclk_ctrl,
++ .ctrlbit = S3C_CLKCON_HCLK_DMA0,
++ }, {
++ .name = "dma1",
++ .id = -1,
++ .parent = &clk_h,
++ .enable = s3c64xx_hclk_ctrl,
++ .ctrlbit = S3C_CLKCON_HCLK_DMA1,
++ }, {
++ .name = "dma2",
++ .id = -1,
++ .parent = &clk_h,
++ .enable = s3c64xx_hclk_ctrl,
++ .ctrlbit = S3C_CLKCON_HCLK_SDMA0,
++ }, {
++ .name = "dma3",
++ .id = -1,
++ .parent = &clk_h,
++ .enable = s3c64xx_hclk_ctrl,
++ .ctrlbit = S3C_CLKCON_HCLK_SDMA1,
+ },
+ };
+
+@@ -246,6 +276,7 @@
+ &clk_epll,
+ &clk_27m,
+ &clk_48m,
++ &clk_h2,
+ };
+
+ void s3c64xx_register_clocks(void)
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/cpu.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/cpu.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/cpu.c 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/cpu.c 2009-05-10 22:27:59.000000000 +0200
+@@ -16,6 +16,7 @@
+ #include <linux/module.h>
+ #include <linux/interrupt.h>
+ #include <linux/ioport.h>
++#include <linux/sysdev.h>
+ #include <linux/serial_core.h>
+ #include <linux/platform_device.h>
+ #include <linux/io.h>
+@@ -96,9 +97,34 @@
+ .pfn = __phys_to_pfn(S3C64XX_PA_GPIO),
+ .length = SZ_4K,
+ .type = MT_DEVICE,
+- },
++ }, {
++ .virtual = (unsigned long)S3C64XX_VA_MODEM,
++ .pfn = __phys_to_pfn(S3C64XX_PA_MODEM),
++ .length = SZ_4K,
++ .type = MT_DEVICE,
++ }, {
++ .virtual = (unsigned long)S3C_VA_TZIC0,
++ .pfn = __phys_to_pfn(S3C64XX_PA_TZIC0),
++ .length = SZ_4K,
++ .type = MT_DEVICE,
++ }, {
++ .virtual = (unsigned long)S3C_VA_TZIC1,
++ .pfn = __phys_to_pfn(S3C64XX_PA_TZIC1),
++ .length = SZ_4K,
++ .type = MT_DEVICE,
++ }
+ };
+
++
++struct sysdev_class s3c64xx_sysclass = {
++ .name = "s3c64xx-core",
++};
++
++static struct sys_device s3c64xx_sysdev = {
++ .cls = &s3c64xx_sysclass,
++};
++
++
+ /* read cpu identification code */
+
+ void __init s3c64xx_init_io(struct map_desc *mach_desc, int size)
+@@ -112,3 +138,11 @@
+ idcode = __raw_readl(S3C_VA_SYS + 0x118);
+ s3c_init_cpu(idcode, cpu_ids, ARRAY_SIZE(cpu_ids));
+ }
++
++static __init int s3c64xx_sysdev_init(void)
++{
++ sysdev_class_register(&s3c64xx_sysclass);
++ return sysdev_register(&s3c64xx_sysdev);
++}
++
++core_initcall(s3c64xx_sysdev_init);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/cpufreq.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/cpufreq.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/cpufreq.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/cpufreq.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,225 @@
++/* linux/arch/arm/plat-s3c64xx/cpufreq.c
++ *
++ * Copyright 2009 Wolfson Microelectronics plc
++ *
++ * S3C64XX CPUfreq Support
++ *
++ * 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.
++ */
++
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/init.h>
++#include <linux/cpufreq.h>
++#include <linux/clk.h>
++#include <linux/err.h>
++#include <linux/regulator/consumer.h>
++
++#include <mach/cpu.h>
++
++static struct clk *armclk;
++static struct regulator *vddarm;
++
++struct s3c64xx_dvfs {
++ unsigned int vddarm_min;
++ unsigned int vddarm_max;
++};
++
++static struct s3c64xx_dvfs s3c6410_dvfs_table[] = {
++ [0] = { 1000000, 1000000 },
++ [1] = { 1000000, 1050000 },
++ [2] = { 1050000, 1100000 },
++ [3] = { 1050000, 1150000 },
++ [4] = { 1250000, 1350000 },
++};
++
++static struct cpufreq_frequency_table s3c6410_freq_table[] = {
++ { 0, 66000 },
++ { 0, 133000 },
++ { 1, 222000 },
++ { 1, 266000 },
++ { 2, 333000 },
++ { 2, 400000 },
++ { 3, 532000 },
++ { 3, 533000 },
++ { 4, 667000 },
++ { 0, CPUFREQ_TABLE_END },
++};
++
++/* Data tables for current CPU and maximum index into it */
++static struct cpufreq_frequency_table *s3c64xx_freq_table;
++static struct s3c64xx_dvfs *s3c64xx_dvfs_table;
++
++static int s3c64xx_cpufreq_verify_speed(struct cpufreq_policy *policy)
++{
++ if (policy->cpu != 0)
++ return -EINVAL;
++
++ return cpufreq_frequency_table_verify(policy, s3c64xx_freq_table);
++}
++
++static unsigned int s3c64xx_cpufreq_get_speed(unsigned int cpu)
++{
++ if (cpu != 0)
++ return 0;
++
++ return clk_get_rate(armclk) / 1000;
++}
++
++static int s3c64xx_cpufreq_set_target(struct cpufreq_policy *policy,
++ unsigned int target_freq,
++ unsigned int relation)
++{
++ int ret = 0;
++ unsigned int i;
++ struct cpufreq_freqs freqs;
++ struct s3c64xx_dvfs *dvfs;
++
++ ret = cpufreq_frequency_table_target(policy, s3c64xx_freq_table,
++ target_freq, relation, &i);
++ if (ret != 0)
++ return ret;
++
++ freqs.cpu = 0;
++ freqs.old = clk_get_rate(armclk) / 1000;
++ freqs.new = s3c64xx_freq_table[i].frequency;
++ freqs.flags = 0;
++ dvfs = &s3c64xx_dvfs_table[s3c64xx_freq_table[i].index];
++
++ if (freqs.old == freqs.new)
++ return 0;
++
++ pr_debug("cpufreq: Transition %d-%dkHz\n", freqs.old, freqs.new);
++
++ cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
++
++#ifdef CONFIG_REGULATOR
++ if (vddarm && freqs.new > freqs.old) {
++ ret = regulator_set_voltage(vddarm,
++ dvfs->vddarm_min,
++ dvfs->vddarm_max);
++ if (ret != 0) {
++ pr_err("cpufreq: Failed to set VDDARM for %dkHz: %d\n",
++ freqs.new, ret);
++ goto err;
++ }
++ }
++#endif
++
++ ret = clk_set_rate(armclk, freqs.new * 1000);
++ if (ret < 0) {
++ pr_err("cpufreq: Failed to set rate %dkHz: %d\n",
++ freqs.new, ret);
++ goto err;
++ }
++
++#ifdef CONFIG_REGULATOR
++ if (vddarm && freqs.new < freqs.old) {
++ ret = regulator_set_voltage(vddarm,
++ dvfs->vddarm_min,
++ dvfs->vddarm_max);
++ if (ret != 0) {
++ pr_err("cpufreq: Failed to set VDDARM for %dkHz: %d\n",
++ freqs.new, ret);
++ goto err_clk;
++ }
++ }
++#endif
++
++ cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
++
++ pr_debug("cpufreq: Set actual frequency %lukHz\n",
++ clk_get_rate(armclk) / 1000);
++
++ return 0;
++
++err_clk:
++ if (clk_set_rate(armclk, freqs.old * 1000) < 0)
++ pr_err("Failed to restore original clock rate\n");
++err:
++ cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
++
++ return ret;
++}
++
++
++static int __init s3c64xx_cpufreq_driver_init(struct cpufreq_policy *policy)
++{
++ int ret;
++ struct cpufreq_frequency_table *freq;;
++
++ if (policy->cpu != 0)
++ return -EINVAL;
++
++ if (cpu_is_s3c6410()) {
++ s3c64xx_freq_table = s3c6410_freq_table;
++ s3c64xx_dvfs_table = s3c6410_dvfs_table;
++ }
++
++ if (s3c64xx_freq_table == NULL) {
++ pr_err("cpufreq: No frequency information for this CPU\n");
++ return -ENODEV;
++ }
++
++ armclk = clk_get(NULL, "armclk");
++ if (IS_ERR(armclk)) {
++ pr_err("cpufreq: Unable to obtain ARMCLK: %ld\n",
++ PTR_ERR(armclk));
++ return PTR_ERR(armclk);
++ }
++
++#ifdef CONFIG_REGULATOR
++ vddarm = regulator_get(NULL, "vddarm");
++ if (IS_ERR(vddarm)) {
++ ret = PTR_ERR(vddarm);
++ pr_err("cpufreq: Failed to obtain VDDARM: %d\n", ret);
++ pr_err("cpufreq: Only frequency scaling available\n");
++ vddarm = NULL;
++ }
++#endif
++
++ /* Check for frequencies we can generate */
++ freq = s3c64xx_freq_table;
++ while (freq->frequency != CPUFREQ_TABLE_END) {
++ unsigned long r;
++
++ r = clk_round_rate(armclk, freq->frequency * 1000);
++ r /= 1000;
++
++ if (r != freq->frequency)
++ freq->frequency = CPUFREQ_ENTRY_INVALID;
++
++ freq++;
++ }
++
++ policy->cur = clk_get_rate(armclk) / 1000;
++ policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL;
++
++ ret = cpufreq_frequency_table_cpuinfo(policy, s3c64xx_freq_table);
++ if (ret == 0)
++ return ret;
++
++ pr_err("cpufreq: Failed to configure frequency table: %d\n", ret);
++
++ regulator_put(vddarm);
++ clk_put(armclk);
++ return ret;
++}
++
++static struct cpufreq_driver s3c64xx_cpufreq_driver = {
++ .owner = THIS_MODULE,
++ .flags = 0,
++ .verify = s3c64xx_cpufreq_verify_speed,
++ .target = s3c64xx_cpufreq_set_target,
++ .get = s3c64xx_cpufreq_get_speed,
++ .init = s3c64xx_cpufreq_driver_init,
++ .name = "s3c64xx",
++};
++
++static int __init s3c64xx_cpufreq_init(void)
++{
++ return cpufreq_register_driver(&s3c64xx_cpufreq_driver);
++}
++module_init(s3c64xx_cpufreq_init);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/dev-usbgadget.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/dev-usbgadget.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/dev-usbgadget.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/dev-usbgadget.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,32 @@
++/* Base S3C64XX usbgadget resource and device definitions */
++
++#include <linux/kernel.h>
++#include <linux/interrupt.h>
++#include <linux/platform_device.h>
++#include <linux/ioport.h>
++
++#include <mach/map.h>
++#include <plat/map-base.h>
++#include <plat/devs.h>
++#include <plat/irqs.h>
++
++static struct resource s3c_usbgadget_resource[] = {
++ [0] = {
++ .start = S3C64XX_PA_OTG,
++ .end = S3C64XX_PA_OTG + 0x200000 - 1,
++ .flags = IORESOURCE_MEM,
++ },
++ [1] = {
++ .start = IRQ_OTG,
++ .end = IRQ_OTG,
++ .flags = IORESOURCE_IRQ,
++ }
++};
++
++struct platform_device s3c_device_usbgadget = {
++ .name = "s3c-otg-usbgadget",
++ .id = -1,
++ .num_resources = ARRAY_SIZE(s3c_usbgadget_resource),
++ .resource = s3c_usbgadget_resource,
++};
++EXPORT_SYMBOL(s3c_device_usbgadget);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/dma.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/dma.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/dma.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/dma.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,728 @@
++/* linux/arch/arm/plat-s3c64xx/dma.c
++ *
++ * Copyright 2009 Openmoko, Inc.
++ * Copyright 2009 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ * http://armlinux.simtec.co.uk/
++ *
++ * S3C64XX DMA core
++ *
++ * 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.
++*/
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/interrupt.h>
++#include <linux/dmapool.h>
++#include <linux/sysdev.h>
++#include <linux/errno.h>
++#include <linux/delay.h>
++#include <linux/clk.h>
++#include <linux/err.h>
++#include <linux/io.h>
++
++#include <mach/dma.h>
++#include <mach/irqs.h>
++
++#include <plat/dma-plat.h>
++
++#include <plat/pl080.h>
++#include <mach/map.h>
++#include <plat/regs-sys.h>
++
++#define DEBUG
++
++#undef pr_debug
++#define pr_debug(x...) printk(x)
++
++/* dma channel state information */
++
++
++struct s3c64xx_dmac {
++ struct sys_device sysdev;
++ struct clk *clk;
++ void __iomem *regs;
++ struct s3c2410_dma_chan *channels;
++ enum dma_ch chanbase;
++};
++
++/* pool to provide LLI buffers */
++static struct dma_pool *dma_pool;
++
++/* Debug configuration and code */
++
++static unsigned char debug_show_buffs = 0;
++
++static void dbg_showchan(struct s3c2410_dma_chan *chan)
++{
++ pr_debug("DMA%d: %08x->%08x L %08x C %08x,%08x S %08x\n",
++ chan->number,
++ readl(chan->regs + PL080_CH_SRC_ADDR),
++ readl(chan->regs + PL080_CH_DST_ADDR),
++ readl(chan->regs + PL080_CH_LLI),
++ readl(chan->regs + PL080_CH_CONTROL),
++ readl(chan->regs + PL080S_CH_CONTROL2),
++ readl(chan->regs + PL080S_CH_CONFIG));
++}
++
++static void show_lli(struct pl080_lli *lli)
++{
++ pr_debug("LLI[%p] %08x->%08x, NL %08x C %08x,%08x\n",
++ lli, lli->src_addr, lli->dst_addr, lli->next_lli,
++ lli->control0, lli->control1);
++}
++
++static void dbg_showbuffs(struct s3c2410_dma_chan *chan)
++{
++ struct s3c64xx_dma_buff *ptr;
++ struct s3c64xx_dma_buff *end;
++
++ pr_debug("DMA%d: buffs next %p, curr %p, end %p\n",
++ chan->number, chan->next, chan->curr, chan->end);
++
++ ptr = chan->next;
++ end = chan->end;
++
++ if (debug_show_buffs) {
++ for (; ptr != NULL; ptr = ptr->next) {
++ pr_debug("DMA%d: %08x ",
++ chan->number, ptr->lli_dma);
++ show_lli(ptr->lli);
++ }
++ }
++}
++
++/* End of Debug */
++
++static struct s3c2410_dma_chan *s3c64xx_dma_map_channel(unsigned int channel)
++{
++ struct s3c2410_dma_chan *chan;
++ unsigned int start, offs;
++
++ start = 0;
++
++ if (channel >= DMACH_PCM1_TX)
++ start = 8;
++
++ for (offs = 0; offs < 8; offs++) {
++ chan = &s3c2410_chans[start + offs];
++ if (!chan->in_use)
++ goto found;
++ }
++
++ return NULL;
++
++found:
++ s3c_dma_chan_map[channel] = chan;
++ return chan;
++}
++
++int s3c2410_dma_config(unsigned int channel, int xferunit)
++{
++ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
++
++ if (chan == NULL)
++ return -EINVAL;
++
++ switch (xferunit) {
++ case 1:
++ chan->hw_width = 0;
++ break;
++ case 2:
++ chan->hw_width = 1;
++ break;
++ case 4:
++ chan->hw_width = 2;
++ break;
++ default:
++ printk(KERN_ERR "%s: illegal width %d\n", __func__, xferunit);
++ return -EINVAL;
++ }
++
++ return 0;
++}
++EXPORT_SYMBOL(s3c2410_dma_config);
++
++static void s3c64xx_dma_fill_lli(struct s3c2410_dma_chan *chan,
++ struct pl080_lli *lli,
++ dma_addr_t data, int size)
++{
++ dma_addr_t src, dst;
++ u32 control0, control1;
++
++ switch (chan->source) {
++ case S3C2410_DMASRC_HW:
++ src = chan->dev_addr;
++ dst = data;
++ control0 = PL080_CONTROL_SRC_AHB2;
++ control0 |= (u32)chan->hw_width << PL080_CONTROL_SWIDTH_SHIFT;
++ control0 |= 2 << PL080_CONTROL_DWIDTH_SHIFT;
++ control0 |= PL080_CONTROL_DST_INCR;
++ break;
++
++ case S3C2410_DMASRC_MEM:
++ src = data;
++ dst = chan->dev_addr;
++ control0 = PL080_CONTROL_DST_AHB2;
++ control0 |= (u32)chan->hw_width << PL080_CONTROL_DWIDTH_SHIFT;
++ control0 |= 2 << PL080_CONTROL_SWIDTH_SHIFT;
++ control0 |= PL080_CONTROL_SRC_INCR;
++ break;
++ default:
++ BUG();
++ }
++
++ /* todo - burst control */
++
++ control1 = size / 4; /* TODO - calculate */
++ control0 |= PL080_CONTROL_PROT_SYS; /* always in priv. mode */
++ control0 |= PL080_CONTROL_TC_IRQ_EN; /* always fire IRQ */
++
++ lli->src_addr = src;
++ lli->dst_addr = dst;
++ lli->next_lli = 0;
++ lli->control0 = control0;
++ lli->control1 = control1;
++}
++
++static void s3c64xx_lli_to_regs(struct s3c2410_dma_chan *chan,
++ struct pl080_lli *lli)
++{
++ void __iomem *regs = chan->regs;
++
++ pr_debug("%s: LLI %p => regs\n", __func__, lli);
++ show_lli(lli);
++
++ writel(lli->src_addr, regs + PL080_CH_SRC_ADDR);
++ writel(lli->dst_addr, regs + PL080_CH_DST_ADDR);
++ writel(lli->next_lli, regs + PL080_CH_LLI);
++ writel(lli->control0, regs + PL080_CH_CONTROL);
++ writel(lli->control1, regs + PL080S_CH_CONTROL2);
++}
++
++static int s3c64xx_dma_start(struct s3c2410_dma_chan *chan)
++{
++ struct s3c64xx_dmac *dmac = chan->dmac;
++ u32 config;
++ u32 bit = chan->bit;
++
++ dbg_showchan(chan);
++
++ pr_debug("%s: clearing interrupts\n", __func__);
++
++ /* clear interrupts */
++ writel(bit, dmac->regs + PL080_TC_CLEAR);
++ writel(bit, dmac->regs + PL080_ERR_CLEAR);
++
++ pr_debug("%s: starting channel\n", __func__);
++
++ config = readl(chan->regs + PL080S_CH_CONFIG);
++ config |= PL080_CONFIG_ENABLE;
++
++ pr_debug("%s: writing config %08x\n", __func__, config);
++ writel(config, chan->regs + PL080S_CH_CONFIG);
++
++ return 0;
++}
++
++static int s3c64xx_dma_stop(struct s3c2410_dma_chan *chan)
++{
++ u32 config;
++ int timeout;
++
++ pr_debug("%s: stopping channel\n", __func__);
++
++ dbg_showchan(chan);
++
++ config = readl(chan->regs + PL080S_CH_CONFIG);
++ config |= PL080_CONFIG_HALT;
++ writel(config, chan->regs + PL080S_CH_CONFIG);
++
++ timeout = 1000;
++ do {
++ config = readl(chan->regs + PL080S_CH_CONFIG);
++ pr_debug("%s: %d - config %08x\n", __func__, timeout, config);
++ if (config & PL080_CONFIG_ACTIVE)
++ udelay(100);
++ else
++ break;
++ } while (--timeout > 0);
++
++ if (config & PL080_CONFIG_ACTIVE) {
++ printk(KERN_ERR "%s: channel still active\n", __func__);
++ return -EFAULT;
++ }
++
++ config = readl(chan->regs + PL080S_CH_CONFIG);
++ config &= ~PL080_CONFIG_ENABLE;
++ writel(config, chan->regs + PL080S_CH_CONFIG);
++
++ return 0;
++}
++
++static inline void s3c64xx_dma_bufffdone(struct s3c2410_dma_chan *chan,
++ struct s3c64xx_dma_buff *buf,
++ enum s3c2410_dma_buffresult result)
++{
++ if (chan->callback_fn != NULL)
++ (chan->callback_fn)(chan, buf->pw, 0, result);
++}
++
++static void s3c64xx_dma_freebuff(struct s3c64xx_dma_buff *buff)
++{
++ dma_pool_free(dma_pool, buff->lli, buff->lli_dma);
++ kfree(buff);
++}
++
++static int s3c64xx_dma_flush(struct s3c2410_dma_chan *chan)
++{
++ struct s3c64xx_dma_buff *buff, *next;
++ u32 config;
++
++ dbg_showchan(chan);
++
++ pr_debug("%s: flushing channel\n", __func__);
++
++ config = readl(chan->regs + PL080S_CH_CONFIG);
++ config &= ~PL080_CONFIG_ENABLE;
++ writel(config, chan->regs + PL080S_CH_CONFIG);
++
++ /* dump all the buffers associated with this channel */
++
++ for (buff = chan->curr; buff != NULL; buff = next) {
++ next = buff->next;
++ pr_debug("%s: buff %p (next %p)\n", __func__, buff, buff->next);
++
++ s3c64xx_dma_bufffdone(chan, buff, S3C2410_RES_ABORT);
++ s3c64xx_dma_freebuff(buff);
++ }
++
++ chan->curr = chan->next = chan->end = NULL;
++
++ return 0;
++}
++
++int s3c2410_dma_ctrl(unsigned int channel, enum s3c2410_chan_op op)
++{
++ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
++
++ WARN_ON(!chan);
++ if (!chan)
++ return -EINVAL;
++
++ switch (op) {
++ case S3C2410_DMAOP_START:
++ return s3c64xx_dma_start(chan);
++
++ case S3C2410_DMAOP_STOP:
++ return s3c64xx_dma_stop(chan);
++
++ case S3C2410_DMAOP_FLUSH:
++ return s3c64xx_dma_flush(chan);
++
++ /* belive PAUSE/RESUME are no-ops */
++ case S3C2410_DMAOP_PAUSE:
++ case S3C2410_DMAOP_RESUME:
++ case S3C2410_DMAOP_STARTED:
++ case S3C2410_DMAOP_TIMEOUT:
++ return 0;
++ }
++
++ return -ENOENT;
++}
++EXPORT_SYMBOL(s3c2410_dma_ctrl);
++
++/* s3c2410_dma_enque
++ *
++ */
++
++int s3c2410_dma_enqueue(unsigned int channel, void *id,
++ dma_addr_t data, int size)
++{
++ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
++ struct s3c64xx_dma_buff *next;
++ struct s3c64xx_dma_buff *buff;
++ struct pl080_lli *lli;
++ int ret;
++
++ WARN_ON(!chan);
++ if (!chan)
++ return -EINVAL;
++
++ buff = kzalloc(sizeof(struct s3c64xx_dma_buff), GFP_KERNEL);
++ if (!buff) {
++ printk(KERN_ERR "%s: no memory for buffer\n", __func__);
++ return -ENOMEM;
++ }
++
++ lli = dma_pool_alloc(dma_pool, GFP_KERNEL, &buff->lli_dma);
++ if (!lli) {
++ printk(KERN_ERR "%s: no memory for lli\n", __func__);
++ ret = -ENOMEM;
++ goto err_buff;
++ }
++
++ pr_debug("%s: buff %p, dp %08x lli (%p, %08x) %d\n",
++ __func__, buff, data, lli, (u32)buff->lli_dma, size);
++
++ buff->lli = lli;
++ buff->pw = id;
++
++ s3c64xx_dma_fill_lli(chan, lli, data, size);
++
++ if ((next = chan->next) != NULL) {
++ struct s3c64xx_dma_buff *end = chan->end;
++ struct pl080_lli *endlli = end->lli;
++
++ pr_debug("enquing onto channel\n");
++
++ end->next = buff;
++ endlli->next_lli = buff->lli_dma;
++
++ if (chan->flags & S3C2410_DMAF_CIRCULAR) {
++ struct s3c64xx_dma_buff *curr = chan->curr;
++ lli->next_lli = curr->lli_dma;
++ }
++
++ if (next == chan->curr) {
++ writel(buff->lli_dma, chan->regs + PL080_CH_LLI);
++ chan->next = buff;
++ }
++
++ show_lli(endlli);
++ chan->end = buff;
++ } else {
++ pr_debug("enquing onto empty channel\n");
++
++ chan->curr = buff;
++ chan->next = buff;
++ chan->end = buff;
++
++ s3c64xx_lli_to_regs(chan, lli);
++ }
++
++ show_lli(lli);
++
++ dbg_showchan(chan);
++ dbg_showbuffs(chan);
++ return 0;
++
++err_buff:
++ kfree(buff);
++ return ret;
++}
++
++EXPORT_SYMBOL(s3c2410_dma_enqueue);
++
++
++int s3c2410_dma_devconfig(int channel,
++ enum s3c2410_dmasrc source,
++ unsigned long devaddr)
++{
++ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
++ u32 peripheral;
++ u32 config = 0;
++
++ printk("%s: channel %d, source %d, dev %08lx, chan %p\n",
++ __func__, channel, source, devaddr, chan);
++
++ WARN_ON(!chan);
++ if (!chan)
++ return -EINVAL;
++
++ peripheral = (chan->peripheral & 0xf);
++ chan->source = source;
++ chan->dev_addr = devaddr;
++
++ pr_debug("%s: peripheral %d\n", __func__, peripheral);
++
++ switch (source) {
++ case S3C2410_DMASRC_HW:
++ config = 2 << PL080_CONFIG_FLOW_CONTROL_SHIFT;
++ config |= peripheral << PL080_CONFIG_SRC_SEL_SHIFT;
++ break;
++ case S3C2410_DMASRC_MEM:
++ config = 1 << PL080_CONFIG_FLOW_CONTROL_SHIFT;
++ config |= peripheral << PL080_CONFIG_DST_SEL_SHIFT;
++ break;
++ default:
++ printk(KERN_ERR "%s: bad source\n", __func__);
++ return -EINVAL;
++ }
++
++ /* allow TC and ERR interrupts */
++ config |= PL080_CONFIG_TC_IRQ_MASK;
++ config |= PL080_CONFIG_ERR_IRQ_MASK;
++
++ pr_debug("%s: config %08x\n", __func__, config);
++
++ writel(config, chan->regs + PL080S_CH_CONFIG);
++
++ return 0;
++}
++EXPORT_SYMBOL(s3c2410_dma_devconfig);
++
++
++int s3c2410_dma_getposition(unsigned int channel,
++ dma_addr_t *src, dma_addr_t *dst)
++{
++ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
++
++ WARN_ON(!chan);
++ if (!chan)
++ return -EINVAL;
++
++ if (src != NULL)
++ *src = readl(chan->regs + PL080_CH_SRC_ADDR);
++
++ if (dst != NULL)
++ *dst = readl(chan->regs + PL080_CH_DST_ADDR);
++
++ return 0;
++}
++EXPORT_SYMBOL(s3c2410_dma_getposition);
++
++/* s3c2410_request_dma
++ *
++ * get control of an dma channel
++*/
++
++int s3c2410_dma_request(unsigned int channel,
++ struct s3c2410_dma_client *client,
++ void *dev)
++{
++ struct s3c2410_dma_chan *chan;
++ unsigned long flags;
++
++ pr_debug("dma%d: s3c2410_request_dma: client=%s, dev=%p\n",
++ channel, client->name, dev);
++
++ local_irq_save(flags);
++
++ chan = s3c64xx_dma_map_channel(channel);
++ if (chan == NULL) {
++ local_irq_restore(flags);
++ return -EBUSY;
++ }
++
++ dbg_showchan(chan);
++
++ chan->client = client;
++ chan->in_use = 1;
++ chan->peripheral = channel;
++
++ local_irq_restore(flags);
++
++ /* need to setup */
++
++ pr_debug("%s: channel initialised, %p\n", __func__, chan);
++
++ return chan->number | DMACH_LOW_LEVEL;
++}
++
++EXPORT_SYMBOL(s3c2410_dma_request);
++
++/* s3c2410_dma_free
++ *
++ * release the given channel back to the system, will stop and flush
++ * any outstanding transfers, and ensure the channel is ready for the
++ * next claimant.
++ *
++ * Note, although a warning is currently printed if the freeing client
++ * info is not the same as the registrant's client info, the free is still
++ * allowed to go through.
++*/
++
++int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *client)
++{
++ struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
++ unsigned long flags;
++
++ if (chan == NULL)
++ return -EINVAL;
++
++ local_irq_save(flags);
++
++ if (chan->client != client) {
++ printk(KERN_WARNING "dma%d: possible free from different client (channel %p, passed %p)\n",
++ channel, chan->client, client);
++ }
++
++ /* sort out stopping and freeing the channel */
++
++
++ chan->client = NULL;
++ chan->in_use = 0;
++
++ if (!(channel & DMACH_LOW_LEVEL))
++ s3c_dma_chan_map[channel] = NULL;
++
++ local_irq_restore(flags);
++
++ return 0;
++}
++
++EXPORT_SYMBOL(s3c2410_dma_free);
++
++
++static void s3c64xx_dma_tcirq(struct s3c64xx_dmac *dmac, int offs)
++{
++ struct s3c2410_dma_chan *chan = dmac->channels + offs;
++
++ /* note, we currently do not bother to work out which buffer
++ * or buffers have been completed since the last tc-irq. */
++
++ if (chan->callback_fn)
++ (chan->callback_fn)(chan, chan->curr->pw, 0, S3C2410_RES_OK);
++}
++
++static void s3c64xx_dma_errirq(struct s3c64xx_dmac *dmac, int offs)
++{
++ printk(KERN_DEBUG "%s: offs %d\n", __func__, offs);
++}
++
++static irqreturn_t s3c64xx_dma_irq(int irq, void *pw)
++{
++ struct s3c64xx_dmac *dmac = pw;
++ u32 tcstat, errstat;
++ u32 bit;
++ int offs;
++
++ tcstat = readl(dmac->regs + PL080_TC_STATUS);
++ errstat = readl(dmac->regs + PL080_ERR_STATUS);
++
++ for (offs = 0, bit = 1; offs < 8; offs++, bit <<= 1) {
++ if (tcstat & bit) {
++ writel(bit, dmac->regs + PL080_TC_CLEAR);
++ s3c64xx_dma_tcirq(dmac, offs);
++ }
++
++ if (errstat & bit) {
++ s3c64xx_dma_errirq(dmac, offs);
++ writel(bit, dmac->regs + PL080_ERR_CLEAR);
++ }
++ }
++
++ return IRQ_HANDLED;
++}
++
++static struct sysdev_class dma_sysclass = {
++ .name = "s3c64xx-dma",
++};
++
++static int s3c64xx_dma_init1(int chno, enum dma_ch chbase,
++ int irq, unsigned int base)
++{
++ struct s3c2410_dma_chan *chptr = &s3c2410_chans[chno];
++ struct s3c64xx_dmac *dmac;
++ char clkname[16];
++ void __iomem *regs;
++ void __iomem *regptr;
++ int err, ch;
++
++ dmac = kzalloc(sizeof(struct s3c64xx_dmac), GFP_KERNEL);
++ if (!dmac) {
++ printk(KERN_ERR "%s: failed to alloc mem\n", __func__);
++ return -ENOMEM;
++ }
++
++ dmac->sysdev.id = chno / 8;
++ dmac->sysdev.cls = &dma_sysclass;
++
++ err = sysdev_register(&dmac->sysdev);
++ if (err) {
++ printk(KERN_ERR "%s: failed to register sysdevice\n", __func__);
++ goto err_alloc;
++ }
++
++ regs = ioremap(base, 0x200);
++ if (!regs) {
++ printk(KERN_ERR "%s: failed to ioremap()\n", __func__);
++ err = -ENXIO;
++ goto err_dev;
++ }
++
++ snprintf(clkname, sizeof(clkname), "dma%d", dmac->sysdev.id);
++
++ dmac->clk = clk_get(NULL, clkname);
++ if (IS_ERR(dmac->clk)) {
++ printk(KERN_ERR "%s: failed to get clock %s\n", __func__, clkname);
++ err = PTR_ERR(dmac->clk);
++ goto err_map;
++ }
++
++ clk_enable(dmac->clk);
++
++ dmac->regs = regs;
++ dmac->chanbase = chbase;
++ dmac->channels = chptr;
++
++ err = request_irq(irq, s3c64xx_dma_irq, 0, "DMA", dmac);
++ if (err < 0) {
++ printk(KERN_ERR "%s: failed to get irq\n", __func__);
++ goto err_clk;
++ }
++
++ regptr = regs + PL080_Cx_BASE(0);
++
++ for (ch = 0; ch < 8; ch++, chno++, chptr++) {
++ printk(KERN_INFO "%s: registering DMA %d (%p)\n",
++ __func__, chno, regptr);
++
++ chptr->bit = 1 << ch;
++ chptr->number = chno;
++ chptr->dmac = dmac;
++ chptr->regs = regptr;
++ regptr += PL008_Cx_STRIDE;
++ }
++
++ /* for the moment, permanently enable the controller */
++ writel(PL080_CONFIG_ENABLE, regs + PL080_CONFIG);
++
++ printk(KERN_INFO "PL080: IRQ %d, at %p\n", irq, regs);
++
++ return 0;
++
++err_clk:
++ clk_disable(dmac->clk);
++ clk_put(dmac->clk);
++err_map:
++ iounmap(regs);
++err_dev:
++ sysdev_unregister(&dmac->sysdev);
++err_alloc:
++ kfree(dmac);
++ return err;
++}
++
++static int __init s3c64xx_dma_init(void)
++{
++ int ret;
++
++ printk(KERN_INFO "%s: Registering DMA channels\n", __func__);
++
++ dma_pool = dma_pool_create("DMA-LLI", NULL, 32, 16, 0);
++ if (!dma_pool) {
++ printk(KERN_ERR "%s: failed to create pool\n", __func__);
++ return -ENOMEM;
++ }
++
++ ret = sysdev_class_register(&dma_sysclass);
++ if (ret) {
++ printk(KERN_ERR "%s: failed to create sysclass\n", __func__);
++ return -ENOMEM;
++ }
++
++ /* Set all DMA configuration to be DMA, not SDMA */
++ writel(0xffffff, S3C_SYSREG(0x110));
++
++ /* Register standard DMA controlers */
++ s3c64xx_dma_init1(0, DMACH_UART0, IRQ_DMA0, 0x75000000);
++ s3c64xx_dma_init1(8, DMACH_PCM1_TX, IRQ_DMA1, 0x75100000);
++
++ return 0;
++}
++
++arch_initcall(s3c64xx_dma_init);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/dma-fake.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/dma-fake.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/dma-fake.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/dma-fake.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,36 @@
++/* linux/arch/arm/plat-s3c64xx/dma.c
++ *
++ * Copyright 2009 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ *
++ * S3C64XX DMA core - fake
++ *
++ * http://armlinux.simtec.co.uk/
++ *
++ * 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.
++*/
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/sched.h>
++#include <linux/spinlock.h>
++#include <linux/interrupt.h>
++#include <linux/sysdev.h>
++#include <linux/slab.h>
++#include <linux/errno.h>
++#include <linux/io.h>
++
++#include <asm/system.h>
++#include <asm/irq.h>
++#include <mach/hardware.h>
++#include <mach/dma.h>
++
++
++int s3c2410_dma_ctrl(unsigned int channel, enum s3c2410_chan_op op)
++{
++ return 0;
++}
++
++EXPORT_SYMBOL(s3c2410_dma_ctrl);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/gpiolib.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/gpiolib.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/gpiolib.c 2009-05-10 22:08:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/gpiolib.c 2009-05-10 22:27:59.000000000 +0200
+@@ -18,6 +18,7 @@
+
+ #include <mach/map.h>
+ #include <mach/gpio.h>
++#include <mach/irqs.h>
+ #include <mach/gpio-core.h>
+
+ #include <plat/gpio-cfg.h>
+@@ -321,6 +322,11 @@
+ .get_pull = s3c_gpio_getpull_updown,
+ };
+
++static int s3c_gpiolib_bankn_toirq(struct gpio_chip *chip, unsigned offset)
++{
++ return S3C_EINT(0) + offset;
++}
++
+ static struct s3c_gpio_chip gpio_2bit[] = {
+ {
+ .base = S3C64XX_GPF_BASE,
+@@ -353,6 +359,7 @@
+ .base = S3C64XX_GPN(0),
+ .ngpio = S3C64XX_GPIO_N_NR,
+ .label = "GPN",
++ .to_irq = s3c_gpiolib_bankn_toirq,
+ },
+ }, {
+ .base = S3C64XX_GPO_BASE,
+@@ -385,12 +392,19 @@
+ {
+ chip->chip.direction_input = s3c64xx_gpiolib_4bit_input;
+ chip->chip.direction_output = s3c64xx_gpiolib_4bit_output;
++ chip->pm = __gpio_pm(&s3c_gpio_pm_4bit);
+ }
+
+ static __init void s3c64xx_gpiolib_add_4bit2(struct s3c_gpio_chip *chip)
+ {
+ chip->chip.direction_input = s3c64xx_gpiolib_4bit2_input;
+ chip->chip.direction_output = s3c64xx_gpiolib_4bit2_output;
++ chip->pm = __gpio_pm(&s3c_gpio_pm_4bit);
++}
++
++static __init void s3c64xx_gpiolib_add_2bit(struct s3c_gpio_chip *chip)
++{
++ chip->pm = __gpio_pm(&s3c_gpio_pm_2bit);
+ }
+
+ static __init void s3c64xx_gpiolib_add(struct s3c_gpio_chip *chips,
+@@ -412,7 +426,8 @@
+ s3c64xx_gpiolib_add(gpio_4bit2, ARRAY_SIZE(gpio_4bit2),
+ s3c64xx_gpiolib_add_4bit2);
+
+- s3c64xx_gpiolib_add(gpio_2bit, ARRAY_SIZE(gpio_2bit), NULL);
++ s3c64xx_gpiolib_add(gpio_2bit, ARRAY_SIZE(gpio_2bit),
++ s3c64xx_gpiolib_add_2bit);
+
+ return 0;
+ }
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/dma-plat.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/dma-plat.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/dma-plat.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/dma-plat.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,70 @@
++/* linux/arch/arm/plat-s3c64xx/include/plat/dma-plat.h
++ *
++ * Copyright 2009 Openmoko, Inc.
++ * Copyright 2009 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ * http://armlinux.simtec.co.uk/
++ *
++ * S3C64XX DMA core
++ *
++ * 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.
++*/
++
++#define DMACH_LOW_LEVEL (1<<28) /* use this to specifiy hardware ch no */
++
++struct s3c64xx_dma_buff;
++
++/** s3c64xx_dma_buff - S3C64XX DMA buffer descriptor
++ * @next: Pointer to next buffer in queue or ring.
++ * @pw: Client provided identifier
++ * @lli: Pointer to hardware descriptor this buffer is associated with.
++ * @lli_dma: Hardare address of the descriptor.
++ */
++struct s3c64xx_dma_buff {
++ struct s3c64xx_dma_buff *next;
++
++ void *pw;
++ struct pl080_lli *lli;
++ dma_addr_t lli_dma;
++};
++
++struct s3c64xx_dmac;
++
++struct s3c2410_dma_chan {
++ unsigned char number; /* number of this dma channel */
++ unsigned char in_use; /* channel allocated */
++ unsigned char bit; /* bit for enable/disable/etc */
++ unsigned char hw_width;
++ unsigned char peripheral;
++
++ unsigned int flags;
++ enum s3c2410_dmasrc source;
++
++
++ dma_addr_t dev_addr;
++
++ struct s3c2410_dma_client *client;
++ struct s3c64xx_dmac *dmac; /* pointer to controller */
++
++ void __iomem *regs;
++
++ /* cdriver callbacks */
++ s3c2410_dma_cbfn_t callback_fn; /* buffer done callback */
++ s3c2410_dma_opfn_t op_fn; /* channel op callback */
++
++ /* buffer list and information */
++ struct s3c64xx_dma_buff *curr; /* current dma buffer */
++ struct s3c64xx_dma_buff *next; /* next buffer to load */
++ struct s3c64xx_dma_buff *end; /* end of queue */
++
++ /* note, when channel is running in circular mode, curr is the
++ * first buffer enqueued, end is the last and curr is where the
++ * last buffer-done event is set-at. The buffers are not freed
++ * and the last buffer hardware descriptor points back to the
++ * first.
++ */
++};
++
++#include <plat/dma-core.h>
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/irqs.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/irqs.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/irqs.h 2009-05-10 22:08:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/irqs.h 2009-05-10 22:27:59.000000000 +0200
+@@ -148,6 +148,7 @@
+ /* compatibility for device defines */
+
+ #define IRQ_IIC1 IRQ_S3C6410_IIC1
++#define IRQ_USBH IRQ_UHOST
+
+ /* Since the IRQ_EINT(x) are a linear mapping on current s3c64xx series
+ * we just defined them as an IRQ_EINT(x) macro from S3C_IRQ_EINT_BASE
+@@ -157,6 +158,7 @@
+
+ #define S3C_EINT(x) ((x) + S3C_IRQ_EINT_BASE)
+ #define IRQ_EINT(x) S3C_EINT(x)
++#define IRQ_EINT_BIT(x) ((x) - S3C_EINT(0))
+
+ /* Next the external interrupt groups. These are similar to the IRQ_EINT(x)
+ * that they are sourced from the GPIO pins but with a different scheme for
+@@ -197,5 +199,6 @@
+
+ #define NR_IRQS (IRQ_EINT_GROUP9_BASE + IRQ_EINT_GROUP9_NR + 1)
+
++#define FIQ_START S3C_IRQ(0)
+ #endif /* __ASM_PLAT_S3C64XX_IRQS_H */
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/pl080.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/pl080.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/pl080.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/pl080.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,110 @@
++/* arch/arm/include/asm/hardware/pl080.h
++ *
++ * Copyright 2008 Openmoko, Inc.
++ * Copyright 2008 Simtec Electronics
++ * http://armlinux.simtec.co.uk/
++ * Ben Dooks <ben@simtec.co.uk>
++ *
++ * ARM PrimeCell PL080 DMA controller
++ *
++ * 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.
++*/
++
++/* Note, there are some Samsung updates to this controller block which
++ * make it not entierly compatible with the PL080 specification from
++ * ARM. When in doubt, check the Samsung documentation first.
++ *
++ * The Samsung defines are PL080S, and add an extra controll register,
++ * the ability to move more than 2^11 counts of data and some extra
++ * OneNAND features.
++*/
++
++#define PL080_INT_STATUS (0x00)
++#define PL080_TC_STATUS (0x04)
++#define PL080_TC_CLEAR (0x08)
++#define PL080_ERR_STATUS (0x0C)
++#define PL080_ERR_CLEAR (0x10)
++#define PL080_RAW_TC_STATUS (0x14)
++#define PL080_RAW_ERR_STATUS (0x18)
++#define PL080_EN_CHAN (0x1c)
++#define PL080_SOFT_BREQ (0x20)
++#define PL080_SOFT_SREQ (0x24)
++#define PL080_SOFT_LBREQ (0x28)
++#define PL080_SOFT_LSREQ (0x2C)
++
++#define PL080_CONFIG (0x30)
++#define PL080_CONFIG_M2_BE (1 << 2)
++#define PL080_CONFIG_M1_BE (1 << 1)
++#define PL080_CONFIG_ENABLE (1 << 0)
++
++#define PL080_SYNC (0x34)
++
++/* Per channel configuration registers */
++
++#define PL008_Cx_STRIDE (0x20)
++#define PL080_Cx_BASE(x) ((0x100 + (x * 0x20)))
++#define PL080_Cx_SRC_ADDR(x) ((0x100 + (x * 0x20)))
++#define PL080_Cx_DST_ADDR(x) ((0x104 + (x * 0x20)))
++#define PL080_Cx_LLI(x) ((0x108 + (x * 0x20)))
++#define PL080_Cx_CONTROL(x) ((0x10C + (x * 0x20)))
++#define PL080_Cx_CONFIG(x) ((0x110 + (x * 0x20)))
++#define PL080S_Cx_CONTROL2(x) ((0x110 + (x * 0x20)))
++#define PL080S_Cx_CONFIG(x) ((0x114 + (x * 0x20)))
++
++#define PL080_CH_SRC_ADDR (0x00)
++#define PL080_CH_DST_ADDR (0x04)
++#define PL080_CH_LLI (0x08)
++#define PL080_CH_CONTROL (0x0C)
++#define PL080_CH_CONFIG (0x10)
++#define PL080S_CH_CONTROL2 (0x10)
++#define PL080S_CH_CONFIG (0x14)
++
++#define PL080_LLI_ADDR_MASK (0x3fffffff << 2)
++#define PL080_LLI_ADDR_SHIFT (2)
++#define PL080_LLI_LM_AHB2 (1 << 0)
++
++#define PL080_CONTROL_TC_IRQ_EN (1 << 31)
++#define PL080_CONTROL_PROT_MASK (0x7 << 28)
++#define PL080_CONTROL_PROT_SHIFT (28)
++#define PL080_CONTROL_PROT_SYS (1 << 28)
++#define PL080_CONTROL_DST_INCR (1 << 27)
++#define PL080_CONTROL_SRC_INCR (1 << 26)
++#define PL080_CONTROL_DST_AHB2 (1 << 25)
++#define PL080_CONTROL_SRC_AHB2 (1 << 24)
++#define PL080_CONTROL_DWIDTH_MASK (0x7 << 21)
++#define PL080_CONTROL_DWIDTH_SHIFT (21)
++#define PL080_CONTROL_SWIDTH_MASK (0x7 << 18)
++#define PL080_CONTROL_SWIDTH_SHIFT (18)
++#define PL080_CONTROL_DB_SIZE_MASK (0x7 << 15)
++#define PL080_CONTROL_DB_SIZE_SHIFT (15)
++#define PL080_CONTROL_SB_SIZE_MASK (0x7 << 12)
++#define PL080_CONTROL_SB_SIZE_SHIFT (12)
++#define PL080_CONTROL_TRANSFER_SIZE_MASK (0xfff << 0)
++#define PL080_CONTROL_TRANSFER_SIZE_SHIFT (0)
++
++#define PL080_CONFIG_HALT (1 << 18)
++#define PL080_CONFIG_ACTIVE (1 << 17)
++#define PL080_CONFIG_LOCK (1 << 16)
++#define PL080_CONFIG_TC_IRQ_MASK (1 << 15)
++#define PL080_CONFIG_ERR_IRQ_MASK (1 << 14)
++#define PL080_CONFIG_FLOW_CONTROL_MASK (0x7 << 11)
++#define PL080_CONFIG_FLOW_CONTROL_SHIFT (11)
++#define PL080_CONFIG_DST_SEL_MASK (0xf << 6)
++#define PL080_CONFIG_DST_SEL_SHIFT (6)
++#define PL080_CONFIG_SRC_SEL_MASK (0xf << 1)
++#define PL080_CONFIG_SRC_SEL_SHIFT (1)
++#define PL080_CONFIG_ENABLE (1 << 0)
++
++
++/* DMA linked list chain structure */
++
++struct pl080_lli {
++ u32 src_addr;
++ u32 dst_addr;
++ u32 next_lli;
++ u32 control0;
++ u32 control1;
++};
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/pm-core.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/pm-core.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/pm-core.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/pm-core.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,106 @@
++/* linux/arch/arm/plat-s3c64xx/include/plat/pm-core.h
++ *
++ * Copyright 2008 Openmoko, Inc.
++ * Copyright 2008 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ * http://armlinux.simtec.co.uk/
++ *
++ * S3C64XX - PM core support for arch/arm/plat-s3c/pm.c
++ *
++ * 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.
++ */
++
++#include <plat/regs-gpio.h>
++
++static inline void s3c_pm_debug_init_uart(void)
++{
++ u32 tmp = __raw_readl(S3C_PCLK_GATE);
++
++ /* As a note, since the S3C64XX UARTs generally have multiple
++ * clock sources, we simply enable PCLK at the moment and hope
++ * that the resume settings for the UART are suitable for the
++ * use with PCLK.
++ */
++
++ tmp |= S3C_CLKCON_PCLK_UART0;
++ tmp |= S3C_CLKCON_PCLK_UART1;
++ tmp |= S3C_CLKCON_PCLK_UART2;
++ tmp |= S3C_CLKCON_PCLK_UART3;
++
++ __raw_writel(tmp, S3C_PCLK_GATE);
++ udelay(10);
++}
++
++static inline void s3c_pm_arch_clear_vic(void __iomem *base)
++{
++ __raw_writel(~0, base + VIC_INT_ENABLE_CLEAR);
++ __raw_writel(~0, base + VIC_INT_SOFT_CLEAR);
++}
++
++static inline void s3c_pm_arch_prepare_irqs(void)
++{
++ /* shutdown the VICs */
++ s3c_pm_arch_clear_vic(S3C_VA_VIC0);
++ s3c_pm_arch_clear_vic(S3C_VA_VIC1);
++
++ /* clear any pending EINT0 interrupts */
++ __raw_writel(__raw_readl(S3C64XX_EINT0PEND), S3C64XX_EINT0PEND);
++}
++
++static inline void s3c_pm_arch_stop_clocks(void)
++{
++}
++
++static inline void s3c_pm_arch_show_resume_irqs(void)
++{
++}
++
++/* make these defines, we currently do not have any need to change
++ * the IRQ wake controls depending on the CPU we are running on */
++
++#define s3c_irqwake_eintallow ((1 << 28) - 1)
++#define s3c_irqwake_intallow (0)
++
++static inline void s3c_pm_arch_update_uart(void __iomem *regs,
++ struct pm_uart_save *save)
++{
++ u32 ucon = __raw_readl(regs + S3C2410_UCON);
++ u32 ucon_clk = ucon & S3C6400_UCON_CLKMASK;
++ u32 save_clk = save->ucon & S3C6400_UCON_CLKMASK;
++ u32 new_ucon;
++ u32 delta;
++
++ /* S3C64XX UART blocks only support level interrupts, so ensure that
++ * when we restore unused UART blocks we force the level interrupt
++ * settigs. */
++ save->ucon |= S3C2410_UCON_TXILEVEL | S3C2410_UCON_RXILEVEL;
++
++ /* We have a constraint on changing the clock type of the UART
++ * between UCLKx and PCLK, so ensure that when we restore UCON
++ * that the CLK field is correctly modified if the bootloader
++ * has changed anything.
++ */
++ if (ucon_clk != save_clk) {
++ new_ucon = save->ucon;
++ delta = ucon_clk ^ save_clk;
++
++ /* change from UCLKx => wrong PCLK,
++ * either UCLK can be tested for by a bit-test
++ * with UCLK0 */
++ if (ucon_clk & S3C6400_UCON_UCLK0 &&
++ !(save_clk & S3C6400_UCON_UCLK0) &&
++ delta & S3C6400_UCON_PCLK2) {
++ new_ucon &= ~S3C6400_UCON_UCLK0;
++ } else if (delta == S3C6400_UCON_PCLK2) {
++ /* as an precaution, don't change from
++ * PCLK2 => PCLK or vice-versa */
++ new_ucon ^= S3C6400_UCON_PCLK2;
++ }
++
++ S3C_PMDBG("ucon change %04x => %04x (save=%04x)\n",
++ ucon, new_ucon, save->ucon);
++ save->ucon = new_ucon;
++ }
++}
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/regs-camif.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/regs-camif.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/regs-camif.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/regs-camif.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,460 @@
++/* arch/arm/plat-s3c64xx/include/plat/regs-camif.h
++ *
++ * Copyright (c) 2003 Simtec Electronics <linux@simtec.co.uk>
++ * http://www.simtec.co.uk/products/SWLINUX/
++ *
++ * 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.
++*/
++
++
++#ifndef ___ASM_ARCH_REGS_CAMIF_H
++#define ___ASM_ARCH_REGS_CAMIF_H
++
++#define S3C_CAMIFREG(x) (x)
++
++/*************************************************************************
++ * Macro part
++ ************************************************************************/
++#define S3C_CISRCFMT_SOURCEHSIZE(x) ((x) << 16)
++#define S3C_CISRCFMT_GET_SOURCEHSIZE(x) (((x) >> 16) & 0x1FFFF)
++#define S3C_CISRCFMT_SOURCEVSIZE(x) ((x) << 0)
++#define S3C_CISRCFMT_GET_SOURCEVSIZE(x) (((x) >> 0) & 0x1FFF)
++
++#define S3C_CIWDOFST_WINHOROFST(x) ((x) << 16)
++#define S3C_CIWDOFST_GET_WINHOROFST(x) (((x) >> 16) & 0x7FF)
++#define S3C_CIWDOFST_WINVEROFST(x) ((x) << 0)
++#define S3C_CIWDOFST_GET_WINVEROFST(x) (((x) >> 0) & 0x7FF)
++
++#define S3C_CIDOWSFT2_WINHOROFST2(x) ((x) << 16)
++#define S3C_CIDOWSFT2_GET_WINHOROFST2(x) (((x) >> 16) & 0x7FF)
++#define S3C_CIDOWSFT2_WINVEROFST2(x) ((x) << 0)
++#define S3C_CIDOWSFT2_GET_WINVEROFST2(x) (((x) >> 0) & 0x7FF)
++
++#define S3C_CICOTRGFMT_TARGETHSIZE_CO(x) ((x) << 16)
++#define S3C_CICOTRGFMT_GET_TARGETHSIZE_CO(x) (((x) >> 16) & 0x1FFF)
++
++#define S3C_CICOTRGFMT_TARGETVSIZE_CO(x) ((x) << 0)
++#define S3C_CICOTRGFMT_GET_TARGETVSIZE_CO(x) (((x) >> 0) & 0x1FFF)
++
++#define S3C_CICOCTRL_YBURST1_CO(x) ((x) << 19)
++#define S3C_CICOCTRL_YBURST2_CO(x) ((x) << 14)
++#define S3C_CICOCTRL_CBURST1_CO(x) ((x) << 9)
++#define S3C_CICOCTRL_CBURST2_CO(x) ((x) << 4)
++
++#define S3C_CICOSCPRERATIO_SHFACTOR_CO(x) ((x) << 28)
++#define S3C_CICOSCPRERATIO_GET_SHFACTOR_CO(x) (((x) >> 28) & 0x7F)
++#define S3C_CICOSCPRERATIO_PREHORRATIO_CO(x) ((x) << 16)
++#define S3C_CICOSCPRERATIO_GET_PREHORRATIO_CO(x) (((x) >> 16) & 0x7F)
++#define S3C_CICOSCPRERATIO_PREVERRATIO_CO(x) ((x) << 0)
++#define S3C_CICOSCPRERATIO_GET_PREVERRATIO_CO(x) (((x) >> 0) & 0x7F)
++
++#define S3C_CICOSCPREDST_PREDSTWIDTH_CO(x) ((x) << 16)
++#define S3C_CICOSCPREDST_GET_PREDSTWIDTH_CO(x) (((x) >> 16) & 0x7FF)
++#define S3C_CICOSCPREDST_PREDSTHEIGHT_CO(x) ((x) << 0)
++#define S3C_CICOSCPREDST_GET_PREDSTHEIGHT_CO(x) (((x) >> 0) & 0x7FF)
++
++#define S3C_CICOSCCTRL_MAINHORRATIO_CO(x) ((x) << 16)
++#define S3C_CICOSCCTRL_GET_MAINHORRATIO_CO(x) (((x) >> 16) & 0x1FF)
++#define S3C_CICOSCCTRL_MAINVERRATIO_CO(x) ((x) << 0)
++
++#define S3C_CICOSTATUS_FRAMECNT_CO(x) ((x) << 26)
++#define S3C_CICOSTATUS_GET_FRAMECNT_CO(x) (((x) >> 26) & 0x3)
++
++#define S3C_CIPRTRGFMT_TARGETHSIZE_PR(x) ((x) << 16)
++#define S3C_CIPRTRGFMT_GET_TARGETHSIZE_PR(x) (((x) >> 16) & 0x1FFF)
++
++#define S3C_CIPRTRGFMT_GET_ROT90_PR(x) (((x) >> 13) & 0x1)
++
++#define S3C_CIPRTRGFMT_TARGETVSIZE_PR(x) ((x) << 0)
++#define S3C_CIPRTRGFMT_GET_TARGETVSIZE_PR(x) (((x) >> 0) & 0x1FFF)
++
++#define S3C_CIPRSCPRERATIO_SHFACTOR_PR(x) ((x) << 28)
++#define S3C_CIPRSCPRERATIO_GET_SHFACTOR_PR(x) (((x) >> 28) & 0xF)
++#define S3C_CIPRSCPRERATIO_PREHORRATIO_PR(x) ((x) << 16)
++#define S3C_CIPRSCPRERATIO_GET_PREHORRATIO_PR(x) (((x) >> 16) & 0x7F)
++#define S3C_CIPRSCPRERATIO_PREVERRATIO_PR(x) ((x) << 0)
++#define S3C_CIPRSCPRERATIO_GET_PREVERRATIO_PR(x) (((x) >> 0) & 0x7F)
++
++#define S3C_CIPRSCPREDST_PREDSTWIDTH_PR(x) ((x) << 16)
++#define S3C_CIPRSCPREDST_GET_PREDSTWIDTH_PR(x) (((x) >> 16) & 0xFFF)
++#define S3C_CIPRSCPREDST_PREDSTHEIGHT_PR(x) ((x) << 0)
++#define S3C_CIPRSCPREDST_GET_PREDSTHEIGHT_PR(x) (((x) >> 0) & 0xFFF)
++
++#define S3C_CIPRSCCTRL_MAINHORRATIO_PR(x) ((x) << 16)
++#define S3C_CIPRSCCTRL_GET_MAINHORRATIO_PR(x) (((x) >> 16) && 0x1FF)
++#define S3C_CIPRSCCTRL_MAINVERRATIO_PR(x) ((x) << 0)
++#define S3C_CIPRSCCTRL_GET_MAINVERRATIO_PR(x) (((x) >> 0) && 0x1FF)
++
++/*************************************************************************
++ * Bit definition part
++ ************************************************************************/
++/* Windows Offset Register */
++#define S3C_CIWDOFST_WINOFSEN (1 << 31)
++#define S3C_CIWDOFST_CLROVCOFIY (1 << 30)
++#define S3C_CIWDOFST_CLROVRLB_CO (1 << 29)
++#define S3C_CIWDOFST_CLROVRLB_PR (1 << 28)
++#define S3C_CIWDOFST_CLROVPRFIY (1 << 27)
++#define S3C_CIWDOFST_CLROVCOFICB (1 << 15)
++#define S3C_CIWDOFST_CLROVCOFICR (1 << 14)
++#define S3C_CIWDOFST_CLROVPRFICB (1 << 13)
++#define S3C_CIWDOFST_CLROVPRFICR (1 << 12)
++
++/* Global Control Register */
++#define S3C_CIGCTRL_SWRST (1 << 31)
++#define S3C_CIGCTRL_CAMRST (1 << 30)
++
++#if defined (CONFIG_CPU_S3C6400) || defined (CONFIG_CPU_S3C6410)
++#define S3C_CIGCTRL_IRQ_LEVEL (1 << 20)
++#endif
++
++#define S3C_CIGCTRL_TESTPATTERN_VER_INC (3 << 27)
++#define S3C_CIGCTRL_TESTPATTERN_HOR_INC (2 << 27)
++#define S3C_CIGCTRL_TESTPATTERN_COLOR_BAR (1 << 27)
++#define S3C_CIGCTRL_TESTPATTERN_NORMAL (0 << 27)
++
++#define S3C_CIGCTRL_INVPOLPCLK (1 << 26)
++#define S3C_CIGCTRL_INVPOLVSYNC (1 << 25)
++#define S3C_CIGCTRL_INVPOLHREF (1 << 24)
++#define S3C_CIGCTRL_IRQ_OVFEN (1 << 22)
++#define S3C_CIGCTRL_HREF_MASK (1 << 21)
++#define S3C_CIGCTRL_IRQ_LEVEL (1 << 20)
++#define S3C_CIGCTRL_IRQ_CLR_C (1 << 19)
++#define S3C_CIGCTRL_IRQ_CLR_P (1 << 18)
++
++/* Codec Target Format Register */
++#if defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2450) || defined(CONFIG_CPU_S3C2416)
++#define S3C_CICOTRGFMT_IN422_422 (1 << 31)
++#define S3C_CICOTRGFMT_IN422_420 (0 << 31)
++#define S3C_CICOTRGFMT_OUT422_422 (1 << 30)
++#define S3C_CICOTRGFMT_OUT422_420 (0 << 30)
++
++#elif defined(CONFIG_CPU_S3C6400) || defined(CONFIG_CPU_S3C6410)
++#define S3C_CICOTRGFMT_OUTFORMAT_RGBOUT (3 << 29)
++#define S3C_CICOTRGFMT_OUTFORMAT_YCBCR422OUTINTERLEAVE (2 << 29)
++#define S3C_CICOTRGFMT_OUTFORMAT_YCBCR422OUT (1 << 29)
++#define S3C_CICOTRGFMT_OUTFORMAT_YCBCR420OUT (0 << 29)
++#endif
++
++#define S3C_CICOTRGFMT_INTERLEAVE_ON (1 << 29)
++#define S3C_CICOTRGFMT_INTERLEAVE_OFF (0 << 29)
++
++#define S3C_CICOTRGFMT_FLIP_180 (3 << 14)
++#define S3C_CICOTRGFMT_FLIP_Y_MIRROR (2 << 14)
++#define S3C_CICOTRGFMT_FLIP_X_MIRROR (1 << 14)
++#define S3C_CICOTRGFMT_FLIP_NORMAL (0 << 14)
++
++/* Codec DMA Control Register */
++#define S3C_CICOCTRL_LASTIRQEN (1 << 2)
++#define S3C_CICOCTRL_ORDER422_CRYCBY (3 << 0)
++#define S3C_CICOCTRL_ORDER422_CBYCRY (2 << 0)
++#define S3C_CICOCTRL_ORDER422_YCRYCB (1 << 0)
++#define S3C_CICOCTRL_ORDER422_YCBYCR (0 << 0)
++
++/* Codec Main-Scaler Control Register */
++#define S3C_CICOSCCTRL_SCALERBYPASS_CO (1 << 31)
++#define S3C_CICOSCCTRL_SCALEUP_H (1 << 30)
++#define S3C_CICOSCCTRL_SCALEUP_V (1 << 29)
++
++#define S3C_CICOSCCTRL_CSCR2Y_WIDE (1 << 28)
++#define S3C_CICOSCCTRL_CSCR2Y_NARROW (0 << 28)
++
++#define S3C_CICOSCCTRL_CSCY2R_WIDE (1 << 27)
++#define S3C_CICOSCCTRL_CSCY2R_NARROW (0 << 27)
++
++#define S3C_CICOSCCTRL_LCDPATHEN_FIFO (1 << 26)
++#define S3C_CICOSCCTRL_LCDPATHEN_DMA (0 << 26)
++
++#define S3C_CICOSCCTRL_INTERLACE_INTERLACE (1 << 25)
++#define S3C_CICOSCCTRL_INTERLACE_PROGRESSIVE (0 << 25)
++
++#define S3C_CICOSCCTRL_COSCALERSTART (1 << 15)
++
++#define S3C_CICOSCCTRL_INRGB_FMT_RGB888 (2 << 13)
++#define S3C_CICOSCCTRL_INRGB_FMT_RGB666 (1 << 13)
++#define S3C_CICOSCCTRL_INRGB_FMT_RGB565 (0 << 13)
++
++#define S3C_CICOSCCTRL_OUTRGB_FMT_RGB888 (2 << 11)
++#define S3C_CICOSCCTRL_OUTRGB_FMT_RGB666 (1 << 11)
++#define S3C_CICOSCCTRL_OUTRGB_FMT_RGB565 (0 << 11)
++
++#define S3C_CICOSCCTRL_EXTRGB_EXTENSION (1 << 10)
++#define S3C_CICOSCCTRL_EXTRGB_NORMAL (0 << 10)
++
++/* Codec Status Register */
++#define S3C_CICOSTATUS_OVFIY_CO (1 << 31)
++#define S3C_CICOSTATUS_OVFICB_CO (1 << 30)
++#define S3C_CICOSTATUS_OVFICR_CO (1 << 29)
++#define S3C_CICOSTATUS_VSYNC (1 << 28)
++#define S3C_CICOSTATUS_WINOFSTEN_CO (1 << 25)
++#define S3C_CICOSTATUS_IMGCPTEN_CAMIF (1 << 22)
++#define S3C_CICOSTATUS_IMGCPTEN_COSC (1 << 21)
++#define S3C_CICOSTATUS_VSYNC_A (1 << 20)
++#define S3C_CICOSTATUS_VSYNC_B (1 << 19)
++#define S3C_CICOSTATUS_OVRLB_CO (1 << 18)
++#define S3C_CICOSTATUS_FRAMEEND_CO (1 << 17)
++
++/* Preview Target Format Register */
++#define S3C_CIPRTRGFMT_FLIPMD_180ROT (3 << 14)
++#define S3C_CIPRTRGFMT_FLIPMD_YMIRROR (2 << 14)
++#define S3C_CIPRTRGFMT_FLIPMD_XMIRROR (1 << 14)
++#define S3C_CIPRTRGFMT_FLIPMD_NORMAL (0 << 14)
++
++#define S3C_CIPRTRGFMT_ROT90_ROTATE (1 << 13)
++#define S3C_CIPRTRGFMT_ROT90_BYPASS (0 << 13)
++
++/* Preview DMA Control Register */
++#define S3C_CIPRCTRL_LASTIRQEN_ENABLE (1 << 2)
++#define S3C_CIPRCTRL_LASTIRQEN_NORMAL (0 << 2)
++
++#define S3C_CIPRCTRL_ORDER422_CRYCBY (3 << 0)
++#define S3C_CIPRCTRL_ORDER422_CBYCRY (2 << 0)
++#define S3C_CIPRCTRL_ORDER422_YCRYCB (1 << 0)
++#define S3C_CIPRCTRL_ORDER422_YCBYCR (0 << 0)
++
++/* Preview Main-Scaler Control Register */
++#define S3C_CIPRSCCTRL_SAMPLE_PR (1 << 31)
++
++#define S3C_CIPRSCCTRL_RGBFORMAT_24 (1 << 30)
++#define S3C_CIPRSCCTRL_RGBFORMAT_16 (0 << 30)
++
++#define S3C_CIPRSCCTRL_START (1 << 15)
++
++#define S3C_CIPRSCCTRL_INRGB_FMT_PR_RGB888 (2 << 13)
++#define S3C_CIPRSCCTRL_INRGB_FMT_PR_RGB666 (1 << 13)
++#define S3C_CIPRSCCTRL_INRGB_FMT_PR_RGB565 (0 << 13)
++
++#define S3C_CIPRSCCTRL_OUTRGB_FMT_PR_RGB888 (2 << 11)
++#define S3C_CIPRSCCTRL_OUTRGB_FMT_PR_RGB666 (1 << 11)
++#define S3C_CIPRSCCTRL_OUTRGB_FMT_PR_RGB565 (0 << 11)
++
++/* Preview Status Register */
++#if defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2450) || defined(CONFIG_CPU_S3C2416)
++#define S3C_CIPRSTATUS_OVFICB_PR (1 << 31)
++#define S3C_CIPRSTATUS_OVFICR_PR (1 << 30)
++
++#elif defined CONFIG_CPU_S3C6400 || defined CONFIG_CPU_S3C6410
++#define S3C_CIPRSTATUS_OVFIY_PR (1 << 31)
++#define S3C_CIPRSTATUS_OVFICB_PR (1 << 30)
++#define S3C_CIPRSTATUS_OVFICR_PR (1 << 29)
++#endif
++
++/* Image Capture Enable Register */
++#define S3C_CIIMGCPT_IMGCPTEN (1 << 31)
++#define S3C_CIIMGCPT_IMGCPTEN_COSC (1 << 30)
++#define S3C_CIIMGCPT_IMGCPTEN_PRSC (1 << 29)
++
++#define S3C_CIIMGCPT_CPT_CODMA_SEL_RGB (1 << 26)
++#define S3C_CIIMGCPT_CPT_CODMA_SEL_YUV (0 << 26)
++
++#if defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2450) || defined(CONFIG_CPU_S3C2416)
++#define S3C_CIIMGCPT_CPT_CODMA_RGBFMT_24 (1 << 25)
++#define S3C_CIIMGCPT_CPT_CODMA_RGBFMT_16 (0 << 25)
++#define S3C_CIIMGCPT_CPT_CODMA_ENABLE (1 << 24)
++#define S3C_CIIMGCPT_CPT_CODMA_DISABLE (0 << 24)
++#define S3C_CIIMGCPT_CPT_CODMA_MOD_CNT (1 << 18)
++#define S3C_CIIMGCPT_CPT_CODMA_MOD_EN (0 << 18)
++
++#elif defined CONFIG_CPU_S3C6400 || defined CONFIG_CPU_S3C6410
++#define S3C_CIIMGCPT_CPT_FREN_CO_ENABLE (1 << 25)
++#define S3C_CIIMGCPT_CPT_FREN_CO_DISABLE (0 << 25)
++#define S3C_CIIMGCPT_CPT_FREN_PR_ENABLE (1 << 24)
++#define S3C_CIIMGCPT_CPT_FREN_PR_DISABLE (0 << 24)
++#define S3C_CIIMGCPT_CPT_FRMOD_CNT (1 << 18)
++#define S3C_CIIMGCPT_CPT_FRMOD_EN (0 << 18)
++#endif
++
++/* Image Effects Register */
++#define S3C_CIIMGEFF_IE_ON_PR_ENABLE (1 << 31)
++#define S3C_CIIMGEFF_IE_ON_PR_DISABLE (0 << 31)
++
++#define S3C_CIIMGEFF_IE_ON_CO_ENABLE (1 << 30)
++#define S3C_CIIMGEFF_IE_ON_CO_DISABLE (0 << 30)
++
++#define S3C_CIIMGEFF_IE_AFTER_SC_BEFORE (0 << 29)
++#define S3C_CIIMGEFF_IE_AFTER_SC_AFTER (1 << 29)
++
++#define S3C_CIIMGEFF_FIN_SILHOUETTE (5 << 26)
++#define S3C_CIIMGEFF_FIN_EMBOSSING (4 << 26)
++#define S3C_CIIMGEFF_FIN_ARTFREEZE (3 << 26)
++#define S3C_CIIMGEFF_FIN_NEGATIVE (2 << 26)
++#define S3C_CIIMGEFF_FIN_ARBITRARY (1 << 26)
++#define S3C_CIIMGEFF_FIN_BYPASS (0 << 26)
++
++/* MSDMA for Codec Source Image Width Register */
++#define S3C_MSCOWIDTH_AUTOLOAD_ENABLE (1 << 31)
++#define S3C_MSCOWIDTH_AUTOLOAD_DISABLE (0 << 31)
++
++#define S3C_MSCOWIDTH_ADDR_CH_ENABLE (1 << 30)
++#define S3C_MSCOWIDTH_ADDR_CH_DISABLE (0 << 30)
++
++/* MSDMA Control Register */
++#if defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2450) || defined(CONFIG_CPU_S3C2416)
++#define S3C_CIMSCTRL_INTERLEAVE_MS_INTERLEAVE (1 << 5)
++#define S3C_CIMSCTRL_INTERLEAVE_MS_NONINTERLEAVE (0 << 5)
++#define S3C_CIMSCTRL_ORDER422_MS_CRYCBY (3 << 3)
++#define S3C_CIMSCTRL_ORDER422_MS_CBYCRY (2 << 3)
++#define S3C_CIMSCTRL_ORDER422_MS_YCRYCB (1 << 3)
++#define S3C_CIMSCTRL_ORDER422_MS_YCBYCR (0 << 3)
++#define S3C_CIMSCTRL_SEL_DMA_CAM_MEMORY (1 << 2)
++#define S3C_CIMSCTRL_SEL_DMA_CAM_EXTCAM (0 << 2)
++#define S3C_CIMSCTRL_SRC420_MS_420 (1 << 1)
++#define S3C_CIMSCTRL_SRC420_MS_422 (0 << 1)
++#define S3C_CIMSCTRL_ENVID_MS_SET (1 << 0)
++
++#elif defined CONFIG_CPU_S3C6400 || defined CONFIG_CPU_S3C6410
++#define S3C_MSCOCTRL_BC_SEL_FRAME (0 << 10)
++#define S3C_MSCOCTRL_BC_SEL_FIELD (1 << 10)
++#define S3C_MSCOCTRL_BUFFER_INI_0 (0 << 8)
++#define S3C_MSCOCTRL_BUFFER_INI_1 (1 << 8)
++#define S3C_MSCOCTRL_TRG_MODE_SOFT (0 << 7)
++#define S3C_MSCOCTRL_TRG_MODE_HARD (1 << 7)
++#define S3C_MSCOCTRL_ORDER422_M_C_YCBYCR (0 << 4)
++#define S3C_MSCOCTRL_ORDER422_M_C_YCRYCB (1 << 4)
++#define S3C_MSCOCTRL_ORDER422_M_C_CBYCRY (2 << 4)
++#define S3C_MSCOCTRL_ORDER422_M_C_CRYCBY (3 << 4)
++#define S3C_MSCOCTRL_SEL_DMA_CAM_C_EXTCAM (0 << 3)
++#define S3C_MSCOCTRL_SEL_DMA_CAM_C_MEMORY (1 << 3)
++#define S3C_MSCOCTRL_INFORMAT_M_C_420 (0 << 1)
++#define S3C_MSCOCTRL_INFORMAT_M_C_422 (1 << 1)
++#define S3C_MSCOCTRL_INFORMAT_M_C_422_INT (2 << 1)
++#define S3C_MSCOCTRL_INFORMAT_M_C_RGB (3 << 1)
++#define S3C_MSCOCTRL_ENVID_M_C_SET (1 << 0)
++#define S3C_MSPRCTRL_BC_SEL_FIELD (0 << 10)
++#define S3C_MSPRCTRL_BC_SEL_FRAME (1 << 10)
++#define S3C_MSPRCTRL_BUFFER_INI_0 (0 << 8)
++#define S3C_MSPRCTRL_BUFFER_INI_1 (1 << 8)
++#define S3C_MSPRCTRL_TRG_MODE_SOFT (0 << 7)
++#define S3C_MSPRCTRL_TRG_MODE_HARD (1 << 7)
++#define S3C_MSPRCTRL_ORDER422_M_P_YCBYCR (0 << 4)
++#define S3C_MSPRCTRL_ORDER422_M_P_YCRYCB (1 << 4)
++#define S3C_MSPRCTRL_ORDER422_M_P_CBYCRY (2 << 4)
++#define S3C_MSPRCTRL_ORDER422_M_P_CRYCBY (3 << 4)
++#define S3C_MSPRCTRL_SEL_DMA_CAM_P_EXTCAM (0 << 3)
++#define S3C_MSPRCTRL_SEL_DMA_CAM_P_MEMORY (1 << 3)
++#define S3C_MSPRCTRL_INFORMAT_M_P_420 (0 << 1)
++#define S3C_MSPRCTRL_INFORMAT_M_P_422 (1 << 1)
++#define S3C_MSPRCTRL_INFORMAT_M_P_422_INT (2 << 1)
++#define S3C_MSPRCTRL_INFORMAT_M_P_RGB (3 << 1)
++#define S3C_MSPRCTRL_ENVID_M_P_SET (1 << 0)
++#endif
++
++/*************************************************************************
++ * Register part
++ ************************************************************************/
++#define S3C_CICOYSA(__x) S3C_CAMIFREG(0x18 + (__x) * 4)
++#define S3C_CICOCBSA(__x) S3C_CAMIFREG(0x28 + (__x) * 4)
++#define S3C_CICOCRSA(__x) S3C_CAMIFREG(0x38 + (__x) * 4)
++#define S3C_CIPRCLRSA(__x) S3C_CAMIFREG(0x6C + (__x) * 4)
++#define S3C_CIPRYSA(__x) S3C_CAMIFREG(0x6C + (__x) * 4)
++#define S3C_CIPRCBSA(__x) S3C_CAMIFREG(0x7C + (__x) * 4)
++#define S3C_CIPRCRSA(__x) S3C_CAMIFREG(0x8C + (__x) * 4)
++
++#define S3C_CISRCFMT S3C_CAMIFREG(0x00)
++#define S3C_CIWDOFST S3C_CAMIFREG(0x04)
++#define S3C_CIGCTRL S3C_CAMIFREG(0x08)
++#define S3C_CIDOWSFT2 S3C_CAMIFREG(0x14)
++#define S3C_CICOYSA1 S3C_CAMIFREG(0x18)
++#define S3C_CICOYSA2 S3C_CAMIFREG(0x1C)
++#define S3C_CICOYSA3 S3C_CAMIFREG(0x20)
++#define S3C_CICOYSA4 S3C_CAMIFREG(0x24)
++#define S3C_CICOCBSA1 S3C_CAMIFREG(0x28)
++#define S3C_CICOCBSA2 S3C_CAMIFREG(0x2C)
++#define S3C_CICOCBSA3 S3C_CAMIFREG(0x30)
++#define S3C_CICOCBSA4 S3C_CAMIFREG(0x34)
++#define S3C_CICOCRSA1 S3C_CAMIFREG(0x38)
++#define S3C_CICOCRSA2 S3C_CAMIFREG(0x3C)
++#define S3C_CICOCRSA3 S3C_CAMIFREG(0x40)
++#define S3C_CICOCRSA4 S3C_CAMIFREG(0x44)
++#define S3C_CICOTRGFMT S3C_CAMIFREG(0x48) /* CODEC target format */
++#define S3C_CICOCTRL S3C_CAMIFREG(0x4C) /* CODEC DMA control register */
++#define S3C_CICOSCPRERATIO S3C_CAMIFREG(0x50) /* CODEC pre-scaler control register 1 */
++#define S3C_CICOSCPREDST S3C_CAMIFREG(0x54) /* CODEC pre-scaler control register 2 */
++#define S3C_CICOSCCTRL S3C_CAMIFREG(0x58) /* CODEC main-scaler control */
++#define S3C_CICOTAREA S3C_CAMIFREG(0x5C) /* CODEC DMA target area register */
++#define S3C_CICOSTATUS S3C_CAMIFREG(0x64) /* CODEC status register */
++
++#if defined (CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2450) || defined(CONFIG_CPU_S3C2416)
++#define S3C_CIPRCLRSA1 S3C_CAMIFREG(0x6C) /* RGB 1st frame start address for preview DMA */
++#define S3C_CIPRCLRSA2 S3C_CAMIFREG(0x70) /* RGB 2nd frame start address for preview DMA */
++#define S3C_CIPRCLRSA3 S3C_CAMIFREG(0x74) /* RGB 3rd frame start address for preview DMA */
++#define S3C_CIPRCLRSA4 S3C_CAMIFREG(0x78) /* RGB 4th frame start address for preview DMA */
++#define S3C_CIPRTRGFMT S3C_CAMIFREG(0x7C) /* PREVIEW target format register */
++#define S3C_CIPRCTRL S3C_CAMIFREG(0x80) /* PREVIEW DMA control register */
++#define S3C_CIPRSCPRERATIO S3C_CAMIFREG(0x84) /* PREVIEW pre-scaler control register 1 */
++#define S3C_CIPRSCPREDST S3C_CAMIFREG(0x88) /* PREVIEW pre-scaler control register 2 */
++#define S3C_CIPRSCCTRL S3C_CAMIFREG(0x8C) /* PREVIEW main-scaler control register */
++#define S3C_CIPRTAREA S3C_CAMIFREG(0x90) /* PREVIEW DMA target area register */
++#define S3C_CIPRSTATUS S3C_CAMIFREG(0x98) /* PREVIEW status register */
++#define S3C_CIIMGCPT S3C_CAMIFREG(0xA0) /* image capture enable register */
++#define S3C_CICOCPTSEQ S3C_CAMIFREG(0xA4) /* CODEC capture sequence register */
++#define S3C_CICOSCOS S3C_CAMIFREG(0xA8) /* CODEC scan line offset register */
++#define S3C_CIIMGEFF S3C_CAMIFREG(0xB0) /* image effect register */
++#define S3C_CIMSYSA S3C_CAMIFREG(0xB4) /* MSDMA Y start address register */
++#define S3C_CIMSCBSA S3C_CAMIFREG(0xB8) /* MSDMA CB start address register */
++#define S3C_CIMSCRSA S3C_CAMIFREG(0xBC) /* MSDMA CR start address register */
++#define S3C_CIMSYEND S3C_CAMIFREG(0xC0) /* MSDMA Y end address register */
++#define S3C_CIMSCBEND S3C_CAMIFREG(0xC4) /* MSDMA CB end address register */
++#define S3C_CIMSCREND S3C_CAMIFREG(0xC8) /* MSDMA CR end address register */
++#define S3C_CIMSYOFF S3C_CAMIFREG(0xCC) /* MSDMA Y offset register */
++#define S3C_CIMSCBOFF S3C_CAMIFREG(0xD0) /* MSDMA CB offset register */
++#define S3C_CIMSCROFF S3C_CAMIFREG(0xD4) /* MSDMA CR offset register */
++#define S3C_CIMSWIDTH S3C_CAMIFREG(0xD8) /* MSDMA source image width register */
++#define S3C_CIMSCTRL S3C_CAMIFREG(0xDC) /* MSDMA control register */
++
++#elif defined CONFIG_CPU_S3C6400 || defined CONFIG_CPU_S3C6410
++#define S3C_CIPRYSA1 S3C_CAMIFREG(0x6C) /* 1st frame start address for preview DMA */
++#define S3C_CIPRYSA2 S3C_CAMIFREG(0x70) /* 2nd frame start address for preview DMA */
++#define S3C_CIPRYSA3 S3C_CAMIFREG(0x74) /* 3rd frame start address for preview DMA */
++#define S3C_CIPRYSA4 S3C_CAMIFREG(0x78) /* 4th frame start address for preview DMA */
++#define S3C_CIPRCBSA1 S3C_CAMIFREG(0x7C) /* 1st frame start address for preview DMA */
++#define S3C_CIPRCBSA2 S3C_CAMIFREG(0x80) /* 2nd frame start address for preview DMA */
++#define S3C_CIPRCBSA3 S3C_CAMIFREG(0x84) /* 3rd frame start address for preview DMA */
++#define S3C_CIPRCBSA4 S3C_CAMIFREG(0x88) /* 4th frame start address for preview DMA */
++#define S3C_CIPRCRSA1 S3C_CAMIFREG(0x8C) /* 1st frame start address for preview DMA */
++#define S3C_CIPRCRSA2 S3C_CAMIFREG(0x90) /* 2nd frame start address for preview DMA */
++#define S3C_CIPRCRSA3 S3C_CAMIFREG(0x94) /* 3rd frame start address for preview DMA */
++#define S3C_CIPRCRSA4 S3C_CAMIFREG(0x98) /* 4th frame start address for preview DMA */
++#define S3C_CIPRTRGFMT S3C_CAMIFREG(0x9C) /* PREVIEW target format register */
++#define S3C_CIPRCTRL S3C_CAMIFREG(0xA0) /* PREVIEW DMA control register */
++#define S3C_CIPRSCPRERATIO S3C_CAMIFREG(0xA4) /* PREVIEW pre-scaler control register 1 */
++#define S3C_CIPRSCPREDST S3C_CAMIFREG(0xA8) /* PREVIEW pre-scaler control register 2 */
++#define S3C_CIPRSCCTRL S3C_CAMIFREG(0xAC) /* PREVIEW main-scaler control register */
++#define S3C_CIPRTAREA S3C_CAMIFREG(0xB0) /* PREVIEW DMA target area register */
++#define S3C_CIPRSTATUS S3C_CAMIFREG(0xB8) /* PREVIEW status register */
++#define S3C_CIIMGCPT S3C_CAMIFREG(0xC0) /* image capture enable register */
++#define S3C_CICOCPTSEQ S3C_CAMIFREG(0xC4) /* CODEC capture sequence register */
++#define S3C_CIIMGEFF S3C_CAMIFREG(0xD0) /* image effect register */
++#define S3C_MSCOY0SA S3C_CAMIFREG(0xD4) /* MSDMA for CODEC Y start address register */
++#define S3C_MSCOCB0SA S3C_CAMIFREG(0xD8) /* MSDMA for CODEC CB start address register */
++#define S3C_MSCOCR0SA S3C_CAMIFREG(0xDC) /* MSDMA for CODEC CR start address register */
++#define S3C_MSCOY0END S3C_CAMIFREG(0xE0) /* MSDMA for CODEC Y end address register */
++#define S3C_MSCOCB0END S3C_CAMIFREG(0xE4) /* MSDMA for CODEC CB end address register */
++#define S3C_MSCOCR0END S3C_CAMIFREG(0xE8) /* MSDMA for CODEC CR end address register */
++#define S3C_MSCOYOFF S3C_CAMIFREG(0xEC) /* MSDMA for CODEC Y offset register */
++#define S3C_MSCOCBOFF S3C_CAMIFREG(0xF0) /* MSDMA for CODEC CB offset register */
++#define S3C_MSCOCROFF S3C_CAMIFREG(0xF4) /* MSDMA for CODEC CR offset register */
++#define S3C_MSCOWIDTH S3C_CAMIFREG(0xF8) /* MSDMA for CODEC source image width register */
++#define S3C_MSCOCTRL S3C_CAMIFREG(0xFC) /* MSDMA for CODEC control register */
++#define S3C_MSPRY0SA S3C_CAMIFREG(0x100) /* MSDMA for PREVIEW Y0 start address register */
++#define S3C_MSPRCB0SA S3C_CAMIFREG(0x104) /* MSDMA for PREVIEW CB0 start address register */
++#define S3C_MSPRCR0SA S3C_CAMIFREG(0x108) /* MSDMA for PREVIEW CR0 start address register */
++#define S3C_MSPRY0END S3C_CAMIFREG(0x10C) /* MSDMA for PREVIEW Y0 end address register */
++#define S3C_MSPRCB0END S3C_CAMIFREG(0x110) /* MSDMA for PREVIEW CB0 end address register */
++#define S3C_MSPRCR0END S3C_CAMIFREG(0x114) /* MSDMA for PREVIEW CR0 end address register */
++#define S3C_MSPRYOFF S3C_CAMIFREG(0x118) /* MSDMA for PREVIEW Y offset register */
++#define S3C_MSPRCBOFF S3C_CAMIFREG(0x11C) /* MSDMA for PREVIEW CB offset register */
++#define S3C_MSPRCROFF S3C_CAMIFREG(0x120) /* MSDMA for PREVIEW CR offset register */
++#define S3C_MSPRWIDTH S3C_CAMIFREG(0x124) /* MSDMA for PREVIEW source image width register */
++#define S3C_CIMSCTRL S3C_CAMIFREG(0x128) /* MSDMA for PREVIEW control register */
++#define S3C_CICOSCOSY S3C_CAMIFREG(0x12C) /* CODEC scan line Y offset register */
++#define S3C_CICOSCOSCB S3C_CAMIFREG(0x130) /* CODEC scan line CB offset register */
++#define S3C_CICOSCOSCR S3C_CAMIFREG(0x134) /* CODEC scan line CR offset register */
++#define S3C_CIPRSCOSY S3C_CAMIFREG(0x138) /* PREVIEW scan line Y offset register */
++#define S3C_CIPRSCOSCB S3C_CAMIFREG(0x13C) /* PREVIEW scan line CB offset register */
++#define S3C_CIPRSCOSCR S3C_CAMIFREG(0x140) /* PREVIEW scan line CR offset register */
++#endif
++
++#endif /* ___ASM_ARCH_REGS_CAMIF_H */
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/regs-clock.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/regs-clock.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/regs-clock.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/regs-clock.h 2009-05-10 22:27:59.000000000 +0200
+@@ -32,6 +32,7 @@
+ #define S3C_HCLK_GATE S3C_CLKREG(0x30)
+ #define S3C_PCLK_GATE S3C_CLKREG(0x34)
+ #define S3C_SCLK_GATE S3C_CLKREG(0x38)
++#define S3C_MEM0_GATE S3C_CLKREG(0x3C)
+
+ /* CLKDIV0 */
+ #define S3C6400_CLKDIV0_MFC_MASK (0xf << 28)
+@@ -88,10 +89,10 @@
+
+ /* HCLK GATE Registers */
+ #define S3C_CLKCON_HCLK_BUS (1<<30)
+-#define S3C_CLKCON_HCLK_SECUR (1<<29)
+-#define S3C_CLKCON_HCLK_SDMA1 (1<<28)
+-#define S3C_CLKCON_HCLK_SDMA2 (1<<27)
+-#define S3C_CLKCON_HCLK_UHOST (1<<26)
++#define S3C_CLKCON_HCLK_UHOST (1<<29)
++#define S3C_CLKCON_HCLK_SECUR (1<<28)
++#define S3C_CLKCON_HCLK_SDMA1 (1<<27)
++#define S3C_CLKCON_HCLK_SDMA0 (1<<26)
+ #define S3C_CLKCON_HCLK_IROM (1<<25)
+ #define S3C_CLKCON_HCLK_DDR1 (1<<24)
+ #define S3C_CLKCON_HCLK_DDR0 (1<<23)
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/regs-gpio.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/regs-gpio.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/regs-gpio.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/regs-gpio.h 2009-05-10 22:27:59.000000000 +0200
+@@ -13,23 +13,175 @@
+
+ /* Base addresses for each of the banks */
+
+-#define S3C64XX_GPA_BASE (S3C64XX_VA_GPIO + 0x0000)
+-#define S3C64XX_GPB_BASE (S3C64XX_VA_GPIO + 0x0020)
+-#define S3C64XX_GPC_BASE (S3C64XX_VA_GPIO + 0x0040)
+-#define S3C64XX_GPD_BASE (S3C64XX_VA_GPIO + 0x0060)
+-#define S3C64XX_GPE_BASE (S3C64XX_VA_GPIO + 0x0080)
+-#define S3C64XX_GPF_BASE (S3C64XX_VA_GPIO + 0x00A0)
+-#define S3C64XX_GPG_BASE (S3C64XX_VA_GPIO + 0x00C0)
+-#define S3C64XX_GPH_BASE (S3C64XX_VA_GPIO + 0x00E0)
+-#define S3C64XX_GPI_BASE (S3C64XX_VA_GPIO + 0x0100)
+-#define S3C64XX_GPJ_BASE (S3C64XX_VA_GPIO + 0x0120)
+-#define S3C64XX_GPK_BASE (S3C64XX_VA_GPIO + 0x0800)
+-#define S3C64XX_GPL_BASE (S3C64XX_VA_GPIO + 0x0810)
+-#define S3C64XX_GPM_BASE (S3C64XX_VA_GPIO + 0x0820)
+-#define S3C64XX_GPN_BASE (S3C64XX_VA_GPIO + 0x0830)
+-#define S3C64XX_GPO_BASE (S3C64XX_VA_GPIO + 0x0140)
+-#define S3C64XX_GPP_BASE (S3C64XX_VA_GPIO + 0x0160)
+-#define S3C64XX_GPQ_BASE (S3C64XX_VA_GPIO + 0x0180)
++#define S3C64XX_GPIOREG(reg) (S3C64XX_VA_GPIO + (reg))
++
++#define S3C64XX_GPA_BASE S3C64XX_GPIOREG(0x0000)
++#define S3C64XX_GPB_BASE S3C64XX_GPIOREG(0x0020)
++#define S3C64XX_GPC_BASE S3C64XX_GPIOREG(0x0040)
++#define S3C64XX_GPD_BASE S3C64XX_GPIOREG(0x0060)
++#define S3C64XX_GPE_BASE S3C64XX_GPIOREG(0x0080)
++#define S3C64XX_GPF_BASE S3C64XX_GPIOREG(0x00A0)
++#define S3C64XX_GPG_BASE S3C64XX_GPIOREG(0x00C0)
++#define S3C64XX_GPH_BASE S3C64XX_GPIOREG(0x00E0)
++#define S3C64XX_GPI_BASE S3C64XX_GPIOREG(0x0100)
++#define S3C64XX_GPJ_BASE S3C64XX_GPIOREG(0x0120)
++#define S3C64XX_GPK_BASE S3C64XX_GPIOREG(0x0800)
++#define S3C64XX_GPL_BASE S3C64XX_GPIOREG(0x0810)
++#define S3C64XX_GPM_BASE S3C64XX_GPIOREG(0x0820)
++#define S3C64XX_GPN_BASE S3C64XX_GPIOREG(0x0830)
++#define S3C64XX_GPO_BASE S3C64XX_GPIOREG(0x0140)
++#define S3C64XX_GPP_BASE S3C64XX_GPIOREG(0x0160)
++#define S3C64XX_GPQ_BASE S3C64XX_GPIOREG(0x0180)
++
++/* SPCON */
++
++#define S3C64XX_SPCON S3C64XX_GPIOREG(0x1A0)
++
++#define S3C64XX_SPCON_DRVCON_CAM_MASK (0x3 << 30)
++#define S3C64XX_SPCON_DRVCON_CAM_SHIFT (30)
++#define S3C64XX_SPCON_DRVCON_CAM_2mA (0x0 << 30)
++#define S3C64XX_SPCON_DRVCON_CAM_4mA (0x1 << 30)
++#define S3C64XX_SPCON_DRVCON_CAM_7mA (0x2 << 30)
++#define S3C64XX_SPCON_DRVCON_CAM_9mA (0x3 << 30)
++
++#define S3C64XX_SPCON_DRVCON_HSSPI_MASK (0x3 << 28)
++#define S3C64XX_SPCON_DRVCON_HSSPI_SHIFT (28)
++#define S3C64XX_SPCON_DRVCON_HSSPI_2mA (0x0 << 28)
++#define S3C64XX_SPCON_DRVCON_HSSPI_4mA (0x1 << 28)
++#define S3C64XX_SPCON_DRVCON_HSSPI_7mA (0x2 << 28)
++#define S3C64XX_SPCON_DRVCON_HSSPI_9mA (0x3 << 28)
++
++#define S3C64XX_SPCON_DRVCON_HSMMC_MASK (0x3 << 26)
++#define S3C64XX_SPCON_DRVCON_HSMMC_SHIFT (26)
++#define S3C64XX_SPCON_DRVCON_HSMMC_2mA (0x0 << 26)
++#define S3C64XX_SPCON_DRVCON_HSMMC_4mA (0x1 << 26)
++#define S3C64XX_SPCON_DRVCON_HSMMC_7mA (0x2 << 26)
++#define S3C64XX_SPCON_DRVCON_HSMMC_9mA (0x3 << 26)
++
++#define S3C64XX_SPCON_DRVCON_LCD_MASK (0x3 << 24)
++#define S3C64XX_SPCON_DRVCON_LCD_SHIFT (24)
++#define S3C64XX_SPCON_DRVCON_LCD_2mA (0x0 << 24)
++#define S3C64XX_SPCON_DRVCON_LCD_4mA (0x1 << 24)
++#define S3C64XX_SPCON_DRVCON_LCD_7mA (0x2 << 24)
++#define S3C64XX_SPCON_DRVCON_LCD_9mA (0x3 << 24)
++
++#define S3C64XX_SPCON_DRVCON_MODEM_MASK (0x3 << 22)
++#define S3C64XX_SPCON_DRVCON_MODEM_SHIFT (22)
++#define S3C64XX_SPCON_DRVCON_MODEM_2mA (0x0 << 22)
++#define S3C64XX_SPCON_DRVCON_MODEM_4mA (0x1 << 22)
++#define S3C64XX_SPCON_DRVCON_MODEM_7mA (0x2 << 22)
++#define S3C64XX_SPCON_DRVCON_MODEM_9mA (0x3 << 22)
++
++#define S3C64XX_SPCON_nRSTOUT_OEN (1 << 21)
++
++#define S3C64XX_SPCON_DRVCON_SPICLK1_MASK (0x3 << 18)
++#define S3C64XX_SPCON_DRVCON_SPICLK1_SHIFT (18)
++#define S3C64XX_SPCON_DRVCON_SPICLK1_2mA (0x0 << 18)
++#define S3C64XX_SPCON_DRVCON_SPICLK1_4mA (0x1 << 18)
++#define S3C64XX_SPCON_DRVCON_SPICLK1_7mA (0x2 << 18)
++#define S3C64XX_SPCON_DRVCON_SPICLK1_9mA (0x3 << 18)
++
++#define S3C64XX_SPCON_MEM1_DQS_PUD_MASK (0x3 << 16)
++#define S3C64XX_SPCON_MEM1_DQS_PUD_SHIFT (16)
++#define S3C64XX_SPCON_MEM1_DQS_PUD_DISABLED (0x0 << 16)
++#define S3C64XX_SPCON_MEM1_DQS_PUD_DOWN (0x1 << 16)
++#define S3C64XX_SPCON_MEM1_DQS_PUD_UP (0x2 << 16)
++
++#define S3C64XX_SPCON_MEM1_D_PUD1_MASK (0x3 << 14)
++#define S3C64XX_SPCON_MEM1_D_PUD1_SHIFT (14)
++#define S3C64XX_SPCON_MEM1_D_PUD1_DISABLED (0x0 << 14)
++#define S3C64XX_SPCON_MEM1_D_PUD1_DOWN (0x1 << 14)
++#define S3C64XX_SPCON_MEM1_D_PUD1_UP (0x2 << 14)
++
++#define S3C64XX_SPCON_MEM1_D_PUD0_MASK (0x3 << 12)
++#define S3C64XX_SPCON_MEM1_D_PUD0_SHIFT (12)
++#define S3C64XX_SPCON_MEM1_D_PUD0_DISABLED (0x0 << 12)
++#define S3C64XX_SPCON_MEM1_D_PUD0_DOWN (0x1 << 12)
++#define S3C64XX_SPCON_MEM1_D_PUD0_UP (0x2 << 12)
++
++#define S3C64XX_SPCON_MEM0_D_PUD_MASK (0x3 << 8)
++#define S3C64XX_SPCON_MEM0_D_PUD_SHIFT (8)
++#define S3C64XX_SPCON_MEM0_D_PUD_DISABLED (0x0 << 8)
++#define S3C64XX_SPCON_MEM0_D_PUD_DOWN (0x1 << 8)
++#define S3C64XX_SPCON_MEM0_D_PUD_UP (0x2 << 8)
++
++#define S3C64XX_SPCON_USBH_DMPD (1 << 7)
++#define S3C64XX_SPCON_USBH_DPPD (1 << 6)
++#define S3C64XX_SPCON_USBH_PUSW2 (1 << 5)
++#define S3C64XX_SPCON_USBH_PUSW1 (1 << 4)
++#define S3C64XX_SPCON_USBH_SUSPND (1 << 3)
++
++#define S3C64XX_SPCON_LCD_SEL_MASK (0x3 << 0)
++#define S3C64XX_SPCON_LCD_SEL_SHIFT (0)
++#define S3C64XX_SPCON_LCD_SEL_HOST (0x0 << 0)
++#define S3C64XX_SPCON_LCD_SEL_RGB (0x1 << 0)
++#define S3C64XX_SPCON_LCD_SEL_606_656 (0x2 << 0)
++
++
++/* External interrupt registers */
++
++#define S3C64XX_EINT12CON S3C64XX_GPIOREG(0x200)
++#define S3C64XX_EINT34CON S3C64XX_GPIOREG(0x204)
++#define S3C64XX_EINT56CON S3C64XX_GPIOREG(0x208)
++#define S3C64XX_EINT78CON S3C64XX_GPIOREG(0x20C)
++#define S3C64XX_EINT9CON S3C64XX_GPIOREG(0x210)
++
++#define S3C64XX_EINT12FLTCON S3C64XX_GPIOREG(0x220)
++#define S3C64XX_EINT34FLTCON S3C64XX_GPIOREG(0x224)
++#define S3C64XX_EINT56FLTCON S3C64XX_GPIOREG(0x228)
++#define S3C64XX_EINT78FLTCON S3C64XX_GPIOREG(0x22C)
++#define S3C64XX_EINT9FLTCON S3C64XX_GPIOREG(0x230)
++
++#define S3C64XX_EINT12MASK S3C64XX_GPIOREG(0x240)
++#define S3C64XX_EINT34MASK S3C64XX_GPIOREG(0x244)
++#define S3C64XX_EINT56MASK S3C64XX_GPIOREG(0x248)
++#define S3C64XX_EINT78MASK S3C64XX_GPIOREG(0x24C)
++#define S3C64XX_EINT9MASK S3C64XX_GPIOREG(0x250)
++
++#define S3C64XX_EINT12PEND S3C64XX_GPIOREG(0x260)
++#define S3C64XX_EINT34PEND S3C64XX_GPIOREG(0x264)
++#define S3C64XX_EINT56PEND S3C64XX_GPIOREG(0x268)
++#define S3C64XX_EINT78PEND S3C64XX_GPIOREG(0x26C)
++#define S3C64XX_EINT9PEND S3C64XX_GPIOREG(0x270)
++
++#define S3C64XX_PRIORITY S3C64XX_GPIOREG(0x280)
++#define S3C64XX_PRIORITY_ARB(x) (1 << (x))
++
++#define S3C64XX_SERVICE S3C64XX_GPIOREG(0x284)
++#define S3C64XX_SERVICEPEND S3C64XX_GPIOREG(0x288)
++
++#define S3C64XX_EINT0CON0 S3C64XX_GPIOREG(0x900)
++#define S3C64XX_EINT0CON1 S3C64XX_GPIOREG(0x904)
++#define S3C64XX_EINT0FLTCON0 S3C64XX_GPIOREG(0x910)
++#define S3C64XX_EINT0FLTCON1 S3C64XX_GPIOREG(0x914)
++#define S3C64XX_EINT0FLTCON2 S3C64XX_GPIOREG(0x918)
++#define S3C64XX_EINT0FLTCON3 S3C64XX_GPIOREG(0x91C)
++
++#define S3C64XX_EINT0MASK S3C64XX_GPIOREG(0x920)
++#define S3C64XX_EINT0PEND S3C64XX_GPIOREG(0x924)
++
++/* GPIO sleep configuration */
++
++#define S3C64XX_SPCONSLP S3C64XX_GPIOREG(0x880)
++
++#define S3C64XX_SPCONSLP_TDO_PULLDOWN (1 << 14)
++#define S3C64XX_SPCONSLP_CKE1INIT (1 << 5)
++
++#define S3C64XX_SPCONSLP_RSTOUT_MASK (0x3 << 12)
++#define S3C64XX_SPCONSLP_RSTOUT_OUT0 (0x0 << 12)
++#define S3C64XX_SPCONSLP_RSTOUT_OUT1 (0x1 << 12)
++#define S3C64XX_SPCONSLP_RSTOUT_HIZ (0x2 << 12)
++
++#define S3C64XX_SPCONSLP_KPCOL_MASK (0x3 << 0)
++#define S3C64XX_SPCONSLP_KPCOL_OUT0 (0x0 << 0)
++#define S3C64XX_SPCONSLP_KPCOL_OUT1 (0x1 << 0)
++#define S3C64XX_SPCONSLP_KPCOL_INP (0x2 << 0)
++
++
++#define S3C64XX_SLPEN S3C64XX_GPIOREG(0x930)
++
++#define S3C64XX_SLPEN_USE_xSLP (1 << 0)
++#define S3C64XX_SLPEN_CFG_BYSLPEN (1 << 1)
+
+ #endif /* __ASM_PLAT_S3C64XX_REGS_GPIO_H */
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/regs-gpio-memport.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/regs-gpio-memport.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/regs-gpio-memport.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/regs-gpio-memport.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,25 @@
++/* linux/arch/arm/plat-s3c64xx/include/mach/regs-gpio-memport.h
++ *
++ * Copyright 2008 Openmoko, Inc.
++ * Copyright 2008 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ * http://armlinux.simtec.co.uk/
++ *
++ * S3C64XX - GPIO memory port register definitions
++ */
++
++#ifndef __ASM_PLAT_S3C64XX_REGS_GPIO_MEMPORT_H
++#define __ASM_PLAT_S3C64XX_REGS_GPIO_MEMPORT_H __FILE__
++
++#define S3C64XX_MEM0CONSTOP S3C64XX_GPIOREG(0x1B0)
++#define S3C64XX_MEM1CONSTOP S3C64XX_GPIOREG(0x1B4)
++
++#define S3C64XX_MEM0CONSLP0 S3C64XX_GPIOREG(0x1C0)
++#define S3C64XX_MEM0CONSLP1 S3C64XX_GPIOREG(0x1C4)
++#define S3C64XX_MEM1CONSLP S3C64XX_GPIOREG(0x1C8)
++
++#define S3C64XX_MEM0DRVCON S3C64XX_GPIOREG(0x1D0)
++#define S3C64XX_MEM1DRVCON S3C64XX_GPIOREG(0x1D4)
++
++#endif /* __ASM_PLAT_S3C64XX_REGS_GPIO_MEMPORT_H */
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/regs-modem.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/regs-modem.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/regs-modem.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/regs-modem.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,31 @@
++/* arch/arm/plat-s3c64xx/include/plat/regs-modem.h
++ *
++ * Copyright 2008 Openmoko, Inc.
++ * Copyright 2008 Simtec Electronics
++ * http://armlinux.simtec.co.uk/
++ * Ben Dooks <ben@simtec.co.uk>
++ *
++ * S3C64XX - modem block registers
++ *
++ * 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.
++*/
++
++#ifndef __PLAT_S3C64XX_REGS_MODEM_H
++#define __PLAT_S3C64XX_REGS_MODEM_H __FILE__
++
++#define S3C64XX_MODEMREG(x) (S3C64XX_VA_MODEM + (x))
++
++#define S3C64XX_MODEM_INT2AP S3C64XX_MODEMREG(0x0)
++#define S3C64XX_MODEM_INT2MODEM S3C64XX_MODEMREG(0x4)
++#define S3C64XX_MODEM_MIFCON S3C64XX_MODEMREG(0x8)
++#define S3C64XX_MODEM_MIFPCON S3C64XX_MODEMREG(0xC)
++#define S3C64XX_MODEM_INTCLR S3C64XX_MODEMREG(0x10)
++#define S3C64XX_MODEM_DMA_TXADDR S3C64XX_MODEMREG(0x14)
++#define S3C64XX_MODEM_DMA_RXADDR S3C64XX_MODEMREG(0x18)
++
++#define MIFPCON_INT2M_LEVEL (1 << 4)
++#define MIFPCON_LCD_BYPASS (1 << 3)
++
++#endif /* __PLAT_S3C64XX_REGS_MODEM_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/regs-syscon-power.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/regs-syscon-power.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/regs-syscon-power.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/regs-syscon-power.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,116 @@
++/* arch/arm/plat-s3c64xx/include/plat/regs-syscon-power.h
++ *
++ * Copyright 2008 Openmoko, Inc.
++ * Copyright 2008 Simtec Electronics
++ * http://armlinux.simtec.co.uk/
++ * Ben Dooks <ben@simtec.co.uk>
++ *
++ * S3C64XX - syscon power and sleep control registers
++ *
++ * 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.
++*/
++
++#ifndef __PLAT_S3C64XX_REGS_SYSCON_POWER_H
++#define __PLAT_S3C64XX_REGS_SYSCON_POWER_H __FILE__
++
++#define S3C64XX_PWR_CFG S3C_SYSREG(0x804)
++
++#define S3C64XX_PWRCFG_OSC_OTG_DISABLE (1 << 17)
++#define S3C64XX_PWRCFG_MMC2_DISABLE (1 << 16)
++#define S3C64XX_PWRCFG_MMC1_DISABLE (1 << 15)
++#define S3C64XX_PWRCFG_MMC0_DISABLE (1 << 14)
++#define S3C64XX_PWRCFG_HSI_DISABLE (1 << 13)
++#define S3C64XX_PWRCFG_TS_DISABLE (1 << 12)
++#define S3C64XX_PWRCFG_RTC_TICK_DISABLE (1 << 11)
++#define S3C64XX_PWRCFG_RTC_ALARM_DISABLE (1 << 10)
++#define S3C64XX_PWRCFG_MSM_DISABLE (1 << 9)
++#define S3C64XX_PWRCFG_KEY_DISABLE (1 << 8)
++#define S3C64XX_PWRCFG_BATF_DISABLE (1 << 7)
++
++#define S3C64XX_PWRCFG_CFG_WFI_MASK (0x3 << 5)
++#define S3C64XX_PWRCFG_CFG_WFI_SHIFT (5)
++#define S3C64XX_PWRCFG_CFG_WFI_IGNORE (0x0 << 5)
++#define S3C64XX_PWRCFG_CFG_WFI_IDLE (0x1 << 5)
++#define S3C64XX_PWRCFG_CFG_WFI_STOP (0x2 << 5)
++#define S3C64XX_PWRCFG_CFG_WFI_SLEEP (0x3 << 5)
++
++#define S3C64XX_PWRCFG_CFG_BATFLT_MASK (0x3 << 3)
++#define S3C64XX_PWRCFG_CFG_BATFLT_SHIFT (3)
++#define S3C64XX_PWRCFG_CFG_BATFLT_IGNORE (0x0 << 3)
++#define S3C64XX_PWRCFG_CFG_BATFLT_IRQ (0x1 << 3)
++#define S3C64XX_PWRCFG_CFG_BATFLT_SLEEP (0x3 << 3)
++
++#define S3C64XX_PWRCFG_CFG_BAT_WAKE (1 << 2)
++#define S3C64XX_PWRCFG_OSC27_EN (1 << 0)
++
++#define S3C64XX_EINT_MASK S3C_SYSREG(0x808)
++
++#define S3C64XX_NORMAL_CFG S3C_SYSREG(0x810)
++
++#define S3C64XX_NORMALCFG_IROM_ON (1 << 30)
++#define S3C64XX_NORMALCFG_DOMAIN_ETM_ON (1 << 16)
++#define S3C64XX_NORMALCFG_DOMAIN_S_ON (1 << 15)
++#define S3C64XX_NORMALCFG_DOMAIN_F_ON (1 << 14)
++#define S3C64XX_NORMALCFG_DOMAIN_P_ON (1 << 13)
++#define S3C64XX_NORMALCFG_DOMAIN_I_ON (1 << 12)
++#define S3C64XX_NORMALCFG_DOMAIN_G_ON (1 << 10)
++#define S3C64XX_NORMALCFG_DOMAIN_V_ON (1 << 9)
++
++#define S3C64XX_STOP_CFG S3C_SYSREG(0x814)
++
++#define S3C64XX_STOPCFG_MEMORY_ARM_ON (1 << 29)
++#define S3C64XX_STOPCFG_TOP_MEMORY_ON (1 << 20)
++#define S3C64XX_STOPCFG_ARM_LOGIC_ON (1 << 17)
++#define S3C64XX_STOPCFG_TOP_LOGIC_ON (1 << 8)
++#define S3C64XX_STOPCFG_OSC_EN (1 << 0)
++
++#define S3C64XX_SLEEP_CFG S3C_SYSREG(0x818)
++
++#define S3C64XX_SLEEPCFG_OSC_EN (1 << 0)
++
++#define S3C64XX_STOP_MEM_CFG S3C_SYSREG(0x81c)
++
++#define S3C64XX_STOPMEMCFG_MODEMIF_RETAIN (1 << 6)
++#define S3C64XX_STOPMEMCFG_HOSTIF_RETAIN (1 << 5)
++#define S3C64XX_STOPMEMCFG_OTG_RETAIN (1 << 4)
++#define S3C64XX_STOPMEMCFG_HSMCC_RETAIN (1 << 3)
++#define S3C64XX_STOPMEMCFG_IROM_RETAIN (1 << 2)
++#define S3C64XX_STOPMEMCFG_IRDA_RETAIN (1 << 1)
++#define S3C64XX_STOPMEMCFG_NFCON_RETAIN (1 << 0)
++
++#define S3C64XX_OSC_STABLE S3C_SYSREG(0x824)
++#define S3C64XX_PWR_STABLE S3C_SYSREG(0x828)
++
++#define S3C64XX_WAKEUP_STAT S3C_SYSREG(0x908)
++
++#define S3C64XX_WAKEUPSTAT_MMC2 (1 << 11)
++#define S3C64XX_WAKEUPSTAT_MMC1 (1 << 10)
++#define S3C64XX_WAKEUPSTAT_MMC0 (1 << 9)
++#define S3C64XX_WAKEUPSTAT_HSI (1 << 8)
++#define S3C64XX_WAKEUPSTAT_BATFLT (1 << 6)
++#define S3C64XX_WAKEUPSTAT_MSM (1 << 5)
++#define S3C64XX_WAKEUPSTAT_KEY (1 << 4)
++#define S3C64XX_WAKEUPSTAT_TS (1 << 3)
++#define S3C64XX_WAKEUPSTAT_RTC_TICK (1 << 2)
++#define S3C64XX_WAKEUPSTAT_RTC_ALARM (1 << 1)
++#define S3C64XX_WAKEUPSTAT_EINT (1 << 0)
++
++#define S3C64XX_BLK_PWR_STAT S3C_SYSREG(0x90c)
++
++#define S3C64XX_BLKPWRSTAT_G (1 << 7)
++#define S3C64XX_BLKPWRSTAT_ETM (1 << 6)
++#define S3C64XX_BLKPWRSTAT_S (1 << 5)
++#define S3C64XX_BLKPWRSTAT_F (1 << 4)
++#define S3C64XX_BLKPWRSTAT_P (1 << 3)
++#define S3C64XX_BLKPWRSTAT_I (1 << 2)
++#define S3C64XX_BLKPWRSTAT_V (1 << 1)
++#define S3C64XX_BLKPWRSTAT_TOP (1 << 0)
++
++#define S3C64XX_INFORM0 S3C_SYSREG(0xA00)
++#define S3C64XX_INFORM1 S3C_SYSREG(0xA04)
++#define S3C64XX_INFORM2 S3C_SYSREG(0xA08)
++#define S3C64XX_INFORM3 S3C_SYSREG(0xA0C)
++
++#endif /* __PLAT_S3C64XX_REGS_SYSCON_POWER_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/regs-sys.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/regs-sys.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/regs-sys.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/regs-sys.h 2009-05-10 22:27:59.000000000 +0200
+@@ -17,6 +17,10 @@
+
+ #define S3C_SYSREG(x) (S3C_VA_SYS + (x))
+
++#define S3C64XX_AHB_CON0 S3C_SYSREG(0x100)
++#define S3C64XX_AHB_CON1 S3C_SYSREG(0x104)
++#define S3C64XX_AHB_CON2 S3C_SYSREG(0x108)
++
+ #define S3C64XX_OTHERS S3C_SYSREG(0x900)
+
+ #define S3C64XX_OTHERS_USBMASK (1 << 16)
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/tzic-sp890.h linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/tzic-sp890.h
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/include/plat/tzic-sp890.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/include/plat/tzic-sp890.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,21 @@
++#ifndef __S3C64XX_TZIC_SP890_H__
++#define __S3C64XX_TZIC_SP890_H__
++
++
++#define S3C64XX_VA_TZIC0_FIQ_STATUS (S3C_VA_TZIC0 + SP890_TZIC_FIQSTATUS)
++#define S3C64XX_VA_TZIC0_RAWINTR (S3C_VA_TZIC0 + SP890_TZIC_RAWINTR)
++#define S3C64XX_VA_TZIC0_INTSELECT (S3C_VA_TZIC0 + SP890_TZIC_INTSELECT)
++#define S3C64XX_VA_TZIC0_FIQENABLE (S3C_VA_TZIC0 + SP890_TZIC_FIQENABLE)
++#define S3C64XX_VA_TZIC0_FIQENCLEAR (S3C_VA_TZIC0 + SP890_TZIC_FIQENCLEAR)
++#define S3C64XX_VA_TZIC0_FIQBYPASS (S3C_VA_TZIC0 + SP890_TZIC_FIQBYPASS)
++#define S3C64XX_VA_TZIC0_FPROTECTION (S3C_VA_TZIC0 + SP890_TZIC_PROTECTION)
++#define S3C64XX_VA_TZIC0_LOCK (S3C_VA_TZIC0 + SP890_TZIC_LOCK)
++#define S3C64XX_VA_TZIC0_LOCKSTATUS (S3C_VA_TZIC0 + SP890_TZIC_LOCKSTATUS)
++#define S3C64XX_VA_TZIC0_ITCR (S3C_VA_TZIC0 + SP890_TZIC_ITCR)
++#define S3C64XX_VA_TZIC0_ITIP1 (S3C_VA_TZIC0 + SP890_TZIC_ITIP1)
++#define S3C64XX_VA_TZIC0_ITIP2 (S3C_VA_TZIC0 + SP890_TZIC_ITIP2)
++#define S3C64XX_VA_TZIC0_ITOP1 (S3C_VA_TZIC0 + SP890_TZIC_ITOP1)
++#define S3C64XX_VA_TZIC0_ITOP2 (S3C_VA_TZIC0 + SP890_TZIC_ITOP2)
++#define S3C64XX_VA_TZIC0_PERIPHIDO (S3C_VA_TZIC0 + SP890_TZIC_PERIPHIDO)
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/irq.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/irq.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/irq.c 2009-05-10 22:08:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/irq.c 2009-05-10 22:27:59.000000000 +0200
+@@ -14,12 +14,14 @@
+
+ #include <linux/kernel.h>
+ #include <linux/interrupt.h>
++#include <linux/serial_core.h>
+ #include <linux/irq.h>
+ #include <linux/io.h>
+
+ #include <asm/hardware/vic.h>
+
+ #include <mach/map.h>
++#include <plat/regs-serial.h>
+ #include <plat/regs-timer.h>
+ #include <plat/cpu.h>
+
+@@ -135,9 +137,6 @@
+ }
+
+ /* UART interrupt registers, not worth adding to seperate include header */
+-#define S3C64XX_UINTP 0x30
+-#define S3C64XX_UINTSP 0x34
+-#define S3C64XX_UINTM 0x38
+
+ static void s3c_irq_uart_mask(unsigned int irq)
+ {
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/irq-eint.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/irq-eint.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/irq-eint.c 2009-05-10 22:08:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/irq-eint.c 2009-05-10 22:27:59.000000000 +0200
+@@ -14,29 +14,20 @@
+
+ #include <linux/kernel.h>
+ #include <linux/interrupt.h>
++#include <linux/gpio.h>
+ #include <linux/irq.h>
+ #include <linux/io.h>
++#include <linux/gpio.h>
+
+ #include <asm/hardware/vic.h>
+
+ #include <plat/regs-irqtype.h>
++#include <plat/regs-gpio.h>
++#include <plat/gpio-cfg.h>
+
+ #include <mach/map.h>
+ #include <plat/cpu.h>
+-
+-/* GPIO is 0x7F008xxx, */
+-#define S3C64XX_GPIOREG(x) (S3C64XX_VA_GPIO + (x))
+-
+-#define S3C64XX_EINT0CON0 S3C64XX_GPIOREG(0x900)
+-#define S3C64XX_EINT0CON1 S3C64XX_GPIOREG(0x904)
+-#define S3C64XX_EINT0FLTCON0 S3C64XX_GPIOREG(0x910)
+-#define S3C64XX_EINT0FLTCON1 S3C64XX_GPIOREG(0x914)
+-#define S3C64XX_EINT0FLTCON2 S3C64XX_GPIOREG(0x918)
+-#define S3C64XX_EINT0FLTCON3 S3C64XX_GPIOREG(0x91C)
+-
+-#define S3C64XX_EINT0MASK S3C64XX_GPIOREG(0x920)
+-#define S3C64XX_EINT0PEND S3C64XX_GPIOREG(0x924)
+-
++#include <plat/pm.h>
+
+ #define eint_offset(irq) ((irq) - IRQ_EINT(0))
+ #define eint_irq_to_bit(irq) (1 << eint_offset(irq))
+@@ -55,7 +46,7 @@
+ u32 mask;
+
+ mask = __raw_readl(S3C64XX_EINT0MASK);
+- mask |= eint_irq_to_bit(irq);
++ mask &= ~eint_irq_to_bit(irq);
+ __raw_writel(mask, S3C64XX_EINT0MASK);
+ }
+
+@@ -74,6 +65,7 @@
+ static int s3c_irq_eint_set_type(unsigned int irq, unsigned int type)
+ {
+ int offs = eint_offset(irq);
++ int pin;
+ int shift;
+ u32 ctrl, mask;
+ u32 newvalue = 0;
+@@ -125,6 +117,14 @@
+ ctrl |= newvalue << shift;
+ __raw_writel(ctrl, reg);
+
++ /* set the GPIO pin appropriately */
++
++ if (offs < 23)
++ pin = S3C64XX_GPN(offs);
++ else
++ pin = S3C64XX_GPM(offs - 23);
++
++ s3c_gpio_cfgpin(pin, S3C_GPIO_SFN(2));
+ return 0;
+ }
+
+@@ -135,6 +135,7 @@
+ .mask_ack = s3c_irq_eint_maskack,
+ .ack = s3c_irq_eint_ack,
+ .set_type = s3c_irq_eint_set_type,
++ .set_wake = s3c_irqext_wake,
+ };
+
+ /* s3c_irq_demux_eint
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/irq-pm.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/irq-pm.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/irq-pm.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/irq-pm.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,173 @@
++/* arch/arm/plat-s3c64xx/irq-pm.c
++ *
++ * Copyright 2008 Openmoko, Inc.
++ * Copyright 2008 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ * http://armlinux.simtec.co.uk/
++ *
++ * S3C64XX - Interrupt handling Power Management
++ *
++ * 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.
++ */
++
++#include <linux/kernel.h>
++#include <linux/sysdev.h>
++#include <linux/interrupt.h>
++#include <linux/serial_core.h>
++#include <linux/irq.h>
++#include <linux/io.h>
++
++#include <asm/hardware/vic.h>
++
++#include <mach/map.h>
++
++#include <plat/regs-serial.h>
++#include <plat/regs-timer.h>
++#include <plat/regs-gpio.h>
++#include <plat/cpu.h>
++#include <plat/pm.h>
++
++/* We handled all the IRQ types in this code, to save having to make several
++ * small files to handle each different type separately. Having the EINT_GRP
++ * code here shouldn't be as much bloat as the IRQ table space needed when
++ * they are enabled. The added benefit is we ensure that these registers are
++ * in the same state as we suspended.
++ */
++
++static struct sleep_save irq_save[] = {
++ SAVE_ITEM(S3C64XX_PRIORITY),
++ SAVE_ITEM(S3C64XX_EINT0CON0),
++ SAVE_ITEM(S3C64XX_EINT0CON1),
++ SAVE_ITEM(S3C64XX_EINT0FLTCON0),
++ SAVE_ITEM(S3C64XX_EINT0FLTCON1),
++ SAVE_ITEM(S3C64XX_EINT0FLTCON2),
++ SAVE_ITEM(S3C64XX_EINT0FLTCON3),
++ SAVE_ITEM(S3C64XX_EINT0MASK),
++ SAVE_ITEM(S3C64XX_TINT_CSTAT),
++};
++
++static struct irq_grp_save {
++ u32 fltcon;
++ u32 con;
++ u32 mask;
++} eint_grp_save[5];
++
++struct irq_vic_save {
++ u32 int_select;
++ u32 int_enable;
++ u32 soft_int;
++ u32 protect;
++ u32 vect_addr[32];
++ u32 vect_cntl[32];
++};
++
++static struct irq_vic_save irq_pm_vic0_save;
++static struct irq_vic_save irq_pm_vic1_save;
++
++static u32 irq_uart_mask[CONFIG_SERIAL_SAMSUNG_UARTS];
++
++static void s3c64xx_vic_save(void __iomem *base, struct irq_vic_save *save)
++{
++ int v;
++
++ save->int_select = readl(base + VIC_INT_SELECT);
++ save->int_enable = readl(base + VIC_INT_ENABLE);
++ save->soft_int = readl(base + VIC_INT_SOFT);
++ save->protect = readl(base + VIC_PROTECT);
++
++ S3C_PMDBG("%s: select=%08x, enable=%08x, protect=%08x\n", __func__,
++ save->int_select, save->int_enable, save->protect);
++
++ for (v = 0; v < ARRAY_SIZE(save->vect_addr); v++) {
++ save->vect_addr[v] = readl(base + VIC_VECT_ADDR0 + (v * 4));
++ save->vect_cntl[v] = readl(base + VIC_VECT_CNTL0 + (v * 4));
++ }
++}
++
++static void s3c64xx_vic_restore(void __iomem *base, struct irq_vic_save *save)
++{
++ int v;
++
++ writel(save->int_select, base + VIC_INT_SELECT);
++ writel(save->protect, base + VIC_PROTECT);
++
++ /* set the enabled ints and then clear the non-enabled */
++ writel(save->int_enable, base + VIC_INT_ENABLE);
++ writel(~save->int_enable, base + VIC_INT_ENABLE_CLEAR);
++
++ /* and the same for the soft-int register */
++
++ writel(save->soft_int, base + VIC_INT_SOFT);
++ writel(~save->soft_int, base + VIC_INT_SOFT_CLEAR);
++
++ S3C_PMDBG("%s: vic int_enable=%08x\n", __func__, readl(base + VIC_INT_ENABLE));
++
++ for (v = 0; v < ARRAY_SIZE(save->vect_addr); v++) {
++ writel(save->vect_addr[v], base + VIC_VECT_ADDR0 + (v * 4));
++ writel(save->vect_cntl[v], base + VIC_VECT_CNTL0 + (v * 4));
++ }
++}
++
++static int s3c64xx_irq_pm_suspend(struct sys_device *dev, pm_message_t state)
++{
++ struct irq_grp_save *grp = eint_grp_save;
++ int i;
++
++ S3C_PMDBG("%s: suspending IRQs\n", __func__);
++
++ s3c64xx_vic_save(S3C_VA_VIC0, &irq_pm_vic0_save);
++ s3c64xx_vic_save(S3C_VA_VIC1, &irq_pm_vic1_save);
++
++ s3c_pm_do_save(irq_save, ARRAY_SIZE(irq_save));
++
++ for (i = 0; i < CONFIG_SERIAL_SAMSUNG_UARTS; i++)
++ irq_uart_mask[i] = __raw_readl(S3C_VA_UARTx(i) + S3C64XX_UINTM);
++
++ for (i = 0; i < ARRAY_SIZE(eint_grp_save); i++, grp++) {
++ grp->con = __raw_readl(S3C64XX_EINT12CON + (i * 4));
++ grp->mask = __raw_readl(S3C64XX_EINT12MASK + (i * 4));
++ grp->fltcon = __raw_readl(S3C64XX_EINT12FLTCON + (i * 4));
++ }
++
++ return 0;
++}
++
++static int s3c64xx_irq_pm_resume(struct sys_device *dev)
++{
++ struct irq_grp_save *grp = eint_grp_save;
++ int i;
++
++ S3C_PMDBG("%s: resuming IRQs\n", __func__);
++
++ s3c_pm_do_restore(irq_save, ARRAY_SIZE(irq_save));
++
++ s3c64xx_vic_restore(S3C_VA_VIC0, &irq_pm_vic0_save);
++ s3c64xx_vic_restore(S3C_VA_VIC1, &irq_pm_vic1_save);
++
++ for (i = 0; i < CONFIG_SERIAL_SAMSUNG_UARTS; i++)
++ __raw_writel(irq_uart_mask[i], S3C_VA_UARTx(i) + S3C64XX_UINTM);
++
++ for (i = 0; i < ARRAY_SIZE(eint_grp_save); i++, grp++) {
++ __raw_writel(grp->con, S3C64XX_EINT12CON + (i * 4));
++ __raw_writel(grp->mask, S3C64XX_EINT12MASK + (i * 4));
++ __raw_writel(grp->fltcon, S3C64XX_EINT12FLTCON + (i * 4));
++ }
++
++ S3C_PMDBG("%s: IRQ configuration restored\n", __func__);
++ return 0;
++}
++
++static struct sysdev_driver s3c64xx_irq_driver = {
++ .suspend = s3c64xx_irq_pm_suspend,
++ .resume = s3c64xx_irq_pm_resume,
++};
++
++static int __init s3c64xx_irq_pm_init(void)
++{
++ return sysdev_driver_register(&s3c64xx_sysclass, &s3c64xx_irq_driver);
++}
++
++arch_initcall(s3c64xx_irq_pm_init);
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/Kconfig linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/Kconfig
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/Kconfig 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/Kconfig 2009-05-10 22:27:59.000000000 +0200
+@@ -19,6 +19,8 @@
+ select S3C_GPIO_PULL_UPDOWN
+ select S3C_GPIO_CFG_S3C24XX
+ select S3C_GPIO_CFG_S3C64XX
++ select USB_ARCH_HAS_OHCI
++ select S3C64XX_SETUP_USBOTG
+ help
+ Base platform code for any Samsung S3C64XX device
+
+@@ -38,6 +40,10 @@
+ Common clock support code for the S3C6400 that is shared
+ by other CPUs in the series, such as the S3C6410.
+
++config S3C64XX_DMA
++ bool "S3C64XX DMA"
++ select S3C_DMA
++
+ # platform specific device setup
+
+ config S3C64XX_SETUP_I2C0
+@@ -59,4 +65,10 @@
+ help
+ Common setup code for S3C64XX with an 24bpp RGB display helper.
+
++config S3C64XX_SETUP_USBOTG
++ bool
++ help
++ Common setup code for S3C64XX with USB OTG
++
++
+ endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/Makefile linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/Makefile
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/Makefile 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/Makefile 2009-05-10 22:27:59.000000000 +0200
+@@ -24,8 +24,22 @@
+ obj-$(CONFIG_CPU_S3C6400_INIT) += s3c6400-init.o
+ obj-$(CONFIG_CPU_S3C6400_CLOCK) += s3c6400-clock.o
+
++# DMA support
++
++obj-$(CONFIG_S3C64XX_DMA) += dma.o
++
++# PM support
++
++obj-$(CONFIG_PM) += pm.o
++obj-$(CONFIG_PM) += sleep.o
++obj-$(CONFIG_PM) += irq-pm.o
++
++obj-$(CONFIG_CPU_FREQ_S3C64XX) += cpufreq.o
++
+ # Device setup
+
+ obj-$(CONFIG_S3C64XX_SETUP_I2C0) += setup-i2c0.o
+ obj-$(CONFIG_S3C64XX_SETUP_I2C1) += setup-i2c1.o
+ obj-$(CONFIG_S3C64XX_SETUP_FB_24BPP) += setup-fb-24bpp.o
++obj-$(CONFIG_S3C64XX_SETUP_USBOTG) += dev-usbgadget.o
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/pm.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/pm.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/pm.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/pm.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,177 @@
++/* linux/arch/arm/plat-s3c64xx/pm.c
++ *
++ * Copyright 2008 Openmoko, Inc.
++ * Copyright 2008 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ * http://armlinux.simtec.co.uk/
++ *
++ * S3C64XX CPU PM support.
++ *
++ * 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.
++*/
++
++#include <linux/init.h>
++#include <linux/suspend.h>
++#include <linux/serial_core.h>
++#include <linux/io.h>
++
++#include <mach/map.h>
++
++#include <plat/pm.h>
++#include <plat/regs-sys.h>
++#include <plat/regs-gpio.h>
++#include <plat/regs-clock.h>
++#include <plat/regs-modem.h>
++#include <plat/regs-syscon-power.h>
++#include <plat/regs-gpio-memport.h>
++
++#ifdef CONFIG_S3C_PM_DEBUG_LED_SMDK
++#include <plat/gpio-bank-n.h>
++
++void s3c_pm_debug_smdkled(u32 set, u32 clear)
++{
++ unsigned long flags;
++ u32 reg;
++
++ local_irq_save(flags);
++ reg = __raw_readl(S3C64XX_GPNCON);
++ reg &= ~(S3C64XX_GPN_CONMASK(12) | S3C64XX_GPN_CONMASK(13) |
++ S3C64XX_GPN_CONMASK(14) | S3C64XX_GPN_CONMASK(15));
++ reg |= S3C64XX_GPN_OUTPUT(12) | S3C64XX_GPN_OUTPUT(13) |
++ S3C64XX_GPN_OUTPUT(14) | S3C64XX_GPN_OUTPUT(15);
++ __raw_writel(reg, S3C64XX_GPNCON);
++
++ reg = __raw_readl(S3C64XX_GPNDAT);
++ reg &= ~(clear << 12);
++ reg |= set << 12;
++ __raw_writel(reg, S3C64XX_GPNDAT);
++
++ local_irq_restore(flags);
++}
++#endif
++
++static struct sleep_save core_save[] = {
++ SAVE_ITEM(S3C_APLL_LOCK),
++ SAVE_ITEM(S3C_MPLL_LOCK),
++ SAVE_ITEM(S3C_EPLL_LOCK),
++ SAVE_ITEM(S3C_CLK_SRC),
++ SAVE_ITEM(S3C_CLK_DIV0),
++ SAVE_ITEM(S3C_CLK_DIV1),
++ SAVE_ITEM(S3C_CLK_DIV2),
++ SAVE_ITEM(S3C_CLK_OUT),
++ SAVE_ITEM(S3C_HCLK_GATE),
++ SAVE_ITEM(S3C_PCLK_GATE),
++ SAVE_ITEM(S3C_SCLK_GATE),
++ SAVE_ITEM(S3C_MEM0_GATE),
++
++ SAVE_ITEM(S3C_EPLL_CON1),
++ SAVE_ITEM(S3C_EPLL_CON0),
++
++ SAVE_ITEM(S3C64XX_MEM0DRVCON),
++ SAVE_ITEM(S3C64XX_MEM1DRVCON),
++
++#ifndef CONFIG_CPU_FREQ
++ SAVE_ITEM(S3C_APLL_CON),
++ SAVE_ITEM(S3C_MPLL_CON),
++#endif
++};
++
++static struct sleep_save misc_save[] = {
++ SAVE_ITEM(S3C64XX_AHB_CON0),
++ SAVE_ITEM(S3C64XX_AHB_CON1),
++ SAVE_ITEM(S3C64XX_AHB_CON2),
++
++ SAVE_ITEM(S3C64XX_MODEM_MIFPCON),
++ SAVE_ITEM(S3C64XX_SPCON),
++
++ SAVE_ITEM(S3C64XX_MEM0CONSTOP),
++ SAVE_ITEM(S3C64XX_MEM1CONSTOP),
++ SAVE_ITEM(S3C64XX_MEM0CONSLP0),
++ SAVE_ITEM(S3C64XX_MEM0CONSLP1),
++ SAVE_ITEM(S3C64XX_MEM1CONSLP),
++};
++
++void s3c_pm_configure_extint(void)
++{
++ __raw_writel(s3c_irqwake_eintmask, S3C64XX_EINT_MASK);
++}
++
++void s3c_pm_restore_core(void)
++{
++ __raw_writel(0, S3C64XX_EINT_MASK);
++
++ s3c_pm_debug_smdkled(1 << 2, 0);
++
++ s3c_pm_do_restore_core(core_save, ARRAY_SIZE(core_save));
++ s3c_pm_do_restore(misc_save, ARRAY_SIZE(misc_save));
++}
++
++void s3c_pm_save_core(void)
++{
++ s3c_pm_do_save(misc_save, ARRAY_SIZE(misc_save));
++ s3c_pm_do_save(core_save, ARRAY_SIZE(core_save));
++}
++
++/* since both s3c6400 and s3c6410 share the same sleep pm calls, we
++ * put the per-cpu code in here until any new cpu comes along and changes
++ * this.
++ */
++
++#include <plat/regs-gpio.h>
++
++static void s3c64xx_cpu_suspend(void)
++{
++ unsigned long tmp;
++
++ /* set our standby method to sleep */
++
++ tmp = __raw_readl(S3C64XX_PWR_CFG);
++ tmp &= ~S3C64XX_PWRCFG_CFG_WFI_MASK;
++ tmp |= S3C64XX_PWRCFG_CFG_WFI_SLEEP;
++ __raw_writel(tmp, S3C64XX_PWR_CFG);
++
++ /* clear any old wakeup */
++
++ __raw_writel(__raw_readl(S3C64XX_WAKEUP_STAT),
++ S3C64XX_WAKEUP_STAT);
++
++ /* set the LED state to 0110 over sleep */
++ s3c_pm_debug_smdkled(3 << 1, 0xf);
++
++ /* issue the standby signal into the pm unit. Note, we
++ * issue a write-buffer drain just in case */
++
++ tmp = 0;
++
++ asm("b 1f\n\t"
++ ".align 5\n\t"
++ "1:\n\t"
++ "mcr p15, 0, %0, c7, c10, 5\n\t"
++ "mcr p15, 0, %0, c7, c10, 4\n\t"
++ "mcr p15, 0, %0, c7, c0, 4" :: "r" (tmp));
++
++ /* we should never get past here */
++
++ panic("sleep resumed to originator?");
++}
++
++static void s3c64xx_pm_prepare(void)
++{
++ /* store address of resume. */
++ __raw_writel(virt_to_phys(s3c_cpu_resume), S3C64XX_INFORM0);
++
++ /* ensure previous wakeup state is cleared before sleeping */
++ __raw_writel(__raw_readl(S3C64XX_WAKEUP_STAT), S3C64XX_WAKEUP_STAT);
++}
++
++static int s3c64xx_pm_init(void)
++{
++ pm_cpu_prep = s3c64xx_pm_prepare;
++ pm_cpu_sleep = s3c64xx_cpu_suspend;
++ pm_uart_udivslot = 1;
++ return 0;
++}
++
++arch_initcall(s3c64xx_pm_init);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/s3c6400-clock.c linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/s3c6400-clock.c
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/s3c6400-clock.c 2009-05-10 22:08:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/s3c6400-clock.c 2009-05-10 22:27:59.000000000 +0200
+@@ -24,6 +24,7 @@
+
+ #include <mach/hardware.h>
+ #include <mach/map.h>
++#include <mach/cpu.h>
+
+ #include <plat/cpu-freq.h>
+
+@@ -88,6 +89,80 @@
+ .sources = &clk_src_apll,
+ };
+
++static u32 clk_arm_div_mask(void)
++{
++ if (cpu_is_s3c6400())
++ return S3C6400_CLKDIV0_ARM_MASK;
++
++ if (cpu_is_s3c6410())
++ return S3C6410_CLKDIV0_ARM_MASK;
++
++ return 0;
++}
++
++static unsigned long s3c64xx_clk_arm_get_rate(struct clk *clk)
++{
++ unsigned long rate = clk_get_rate(clk->parent);
++ u32 val;
++
++ val = __raw_readl(S3C_CLK_DIV0);
++ val &= clk_arm_div_mask();
++
++ return rate / (val + 1);
++}
++
++static unsigned long s3c64xx_clk_arm_round_rate(struct clk *clk,
++ unsigned long rate)
++{
++ unsigned long parent = clk_get_rate(clk->parent);
++ int div;
++ int max = clk_arm_div_mask() + 1;
++
++ if (parent < rate)
++ return parent;
++
++ div = parent / rate;
++
++ if (div < 1)
++ div = 1;
++ if (div > max)
++ div = max;
++
++ return parent / div;
++}
++
++static int s3c64xx_clk_arm_set_rate(struct clk *clk, unsigned long rate)
++{
++ unsigned int div;
++ u32 val;
++ unsigned long flags;
++
++ div = (clk_get_rate(clk->parent) / rate) - 1;
++
++ if (div > clk_arm_div_mask())
++ return -EINVAL;
++
++ local_irq_save(flags);
++
++ val = __raw_readl(S3C_CLK_DIV0);
++ val &= ~clk_arm_div_mask();
++ val |= div;
++
++ __raw_writel(val, S3C_CLK_DIV0);
++ local_irq_restore(flags);
++
++ return 0;
++}
++
++static struct clk clk_arm = {
++ .name = "armclk",
++ .id = -1,
++ .parent = &clk_mout_apll.clk,
++ .round_rate = &s3c64xx_clk_arm_round_rate,
++ .get_rate = s3c64xx_clk_arm_get_rate,
++ .set_rate = s3c64xx_clk_arm_set_rate,
++};
++
+ struct clk clk_fout_epll = {
+ .name = "fout_epll",
+ .id = -1,
+@@ -239,10 +314,12 @@
+
+ rate = clk_round_rate(clk, rate);
+ div = clk_get_rate(clk->parent) / rate;
++ if (div > 16)
++ return -EINVAL;
+
+ val = __raw_readl(reg);
+- val &= ~sclk->mask;
+- val |= (rate - 1) << sclk->shift;
++ val &= ~(0xf << sclk->divider_shift);
++ val |= (div - 1) << sclk->divider_shift;
+ __raw_writel(val, reg);
+
+ return 0;
+@@ -282,7 +359,7 @@
+ if (rate > parent_rate)
+ rate = parent_rate;
+ else {
+- div = rate / parent_rate;
++ div = parent_rate / rate;
+
+ if (div == 0)
+ div = 1;
+@@ -351,7 +428,7 @@
+
+ static struct clksrc_clk clk_usbhost = {
+ .clk = {
+- .name = "usb-host-bus",
++ .name = "usb-bus-host",
+ .id = -1,
+ .ctrlbit = S3C_CLKCON_SCLK_UHOST,
+ .enable = s3c64xx_sclk_ctrl,
+@@ -518,6 +595,55 @@
+ .reg_divider = S3C_CLK_DIV2,
+ };
+
++static struct clk *clkset_camera_list[] = {
++ &clk_h2,
++};
++
++static struct clk_sources clkset_camera = {
++ .sources = clkset_camera_list,
++ .nr_sources = ARRAY_SIZE(clkset_camera_list),
++};
++
++static struct clksrc_clk clk_camera = {
++ .clk = {
++ .name = "camera",
++ .id = -1,
++ .ctrlbit = S3C_CLKCON_SCLK_CAM,
++ .enable = s3c64xx_sclk_ctrl,
++ .set_parent = s3c64xx_setparent_clksrc,
++ .get_rate = s3c64xx_getrate_clksrc,
++ .set_rate = s3c64xx_setrate_clksrc,
++ .round_rate = s3c64xx_roundrate_clksrc,
++ },
++ .shift = 0,
++ .mask = 0,
++ .sources = &clkset_camera,
++ .divider_shift = S3C6400_CLKDIV0_CAM_SHIFT,
++ .reg_divider = S3C_CLK_DIV0,
++};
++
++static struct clk *clkset_camif_list[] = {
++ &clk_h,
++};
++
++static struct clk_sources clkset_camif = {
++ .sources = clkset_camif_list,
++ .nr_sources = ARRAY_SIZE(clkset_camif_list),
++};
++
++static struct clksrc_clk clk_camif = {
++ .clk = {
++ .name = "camif",
++ .id = -1,
++ .ctrlbit = S3C_CLKCON_HCLK_CAMIF,
++ .enable = s3c64xx_hclk_ctrl,
++ .set_parent = s3c64xx_setparent_clksrc,
++ },
++ .shift = 0,
++ .mask = 0,
++ .sources = &clkset_camif,
++};
++
+ /* Clock initialisation code */
+
+ static struct clksrc_clk *init_parents[] = {
+@@ -534,6 +660,8 @@
+ &clk_audio0,
+ &clk_audio1,
+ &clk_irda,
++ &clk_camif,
++ &clk_camera,
+ };
+
+ static void __init_or_cpufreq s3c6400_set_clksrc(struct clksrc_clk *clk)
+@@ -606,6 +734,7 @@
+ clk_fout_epll.rate = epll;
+ clk_fout_apll.rate = apll;
+
++ clk_h2.rate = hclk2;
+ clk_h.rate = hclk;
+ clk_p.rate = pclk;
+ clk_f.rate = fclk;
+@@ -633,6 +762,9 @@
+ &clk_audio0.clk,
+ &clk_audio1.clk,
+ &clk_irda.clk,
++ &clk_camera.clk,
++ &clk_camif.clk,
++ &clk_arm,
+ };
+
+ void __init s3c6400_register_clocks(void)
+@@ -650,6 +782,5 @@
+ }
+ }
+
+- clk_mpll.parent = &clk_mout_mpll.clk;
+ clk_epll.parent = &clk_mout_epll.clk;
+ }
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/sleep.S linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/sleep.S
+--- linux-2.6.29-rc3.owrt/arch/arm/plat-s3c64xx/sleep.S 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/arch/arm/plat-s3c64xx/sleep.S 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,143 @@
++/* linux/0arch/arm/plat-s3c64xx/sleep.S
++ *
++ * Copyright 2008 Openmoko, Inc.
++ * Copyright 2008 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ * http://armlinux.simtec.co.uk/
++ *
++ * S3C64XX CPU sleep code
++ *
++ * 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.
++*/
++
++#include <linux/linkage.h>
++#include <asm/assembler.h>
++#include <mach/map.h>
++
++#undef S3C64XX_VA_GPIO
++#define S3C64XX_VA_GPIO (0x0)
++
++#include <plat/regs-gpio.h>
++#include <plat/gpio-bank-n.h>
++
++#define LL_UART (S3C_PA_UART + (0x400 * CONFIG_S3C_LOWLEVEL_UART_PORT))
++
++ .text
++
++ /* s3c_cpu_save
++ *
++ * Save enough processor state to allow the restart of the pm.c
++ * code after resume.
++ *
++ * entry:
++ * r0 = pointer to the save block
++ * exit:
++ * r0 = exit code: 1 => stored data
++ * 0 => resumed from sleep
++ */
++
++ENTRY(s3c_cpu_save)
++ stmfd sp!, { r4 - r12, lr }
++
++ mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID
++ mrc p15, 0, r5, c3, c0, 0 @ Domain ID
++ mrc p15, 0, r6, c2, c0, 0 @ Translation Table BASE0
++ mrc p15, 0, r7, c2, c0, 1 @ Translation Table BASE1
++ mrc p15, 0, r8, c2, c0, 2 @ Translation Table Control
++ mrc p15, 0, r9, c1, c0, 0 @ Control register
++ mrc p15, 0, r10, c1, c0, 1 @ Auxiliary control register
++ mrc p15, 0, r11, c1, c0, 2 @ Co-processor access controls
++
++ stmia r0, { r4 - r13 } @ Save CP registers and SP
++ mov r0, #0
++ ldmfd sp, { r4 - r12, pc } @ return, not disturbing SP
++
++ @@ return to the caller, after the MMU is turned on.
++ @@ restore the last bits of the stack and return.
++resume_with_mmu:
++ mov r0, #1
++ ldmfd sp!, { r4 - r12, pc } @ return, from sp from s3c_cpu_save
++
++ .data
++
++ /* the next bit is code, but it requires easy access to the
++ * s3c_sleep_save_phys data before the MMU is switched on, so
++ * we store the code that needs this variable in the .data where
++ * the value can be written to (the .text segment is RO).
++ */
++
++ .global s3c_sleep_save_phys
++s3c_sleep_save_phys:
++ .word 0
++
++ /* Sleep magic, the word before the resume entry point so that the
++ * bootloader can check for a resumeable image. */
++
++ .word 0x2bedf00d
++
++ /* s3c_cpu_reusme
++ *
++ * This is the entry point, stored by whatever method the bootloader
++ * requires to get the kernel runnign again. This code expects to be
++ * entered with no caches live and the MMU disabled. It will then
++ * restore the MMU and other basic CP registers saved and restart
++ * the kernel C code to finish the resume code.
++ */
++
++ENTRY(s3c_cpu_resume)
++ msr cpsr_c, #PSR_I_BIT | PSR_F_BIT | SVC_MODE
++ ldr r2, =LL_UART /* for debug */
++
++#ifdef CONFIG_S3C_PM_DEBUG_LED_SMDK
++ /* Initialise the GPIO state if we are debugging via the SMDK LEDs,
++ * as the uboot version supplied resets these to inputs during the
++ * resume checks.
++ */
++
++ ldr r3, =S3C64XX_PA_GPIO
++ ldr r0, [ r3, #S3C64XX_GPNCON ]
++ bic r0, r0, #(S3C64XX_GPN_CONMASK(12) | S3C64XX_GPN_CONMASK(13) | \
++ S3C64XX_GPN_CONMASK(14) | S3C64XX_GPN_CONMASK(15))
++ orr r0, r0, #(S3C64XX_GPN_OUTPUT(12) | S3C64XX_GPN_OUTPUT(13) | \
++ S3C64XX_GPN_OUTPUT(14) | S3C64XX_GPN_OUTPUT(15))
++ str r0, [ r3, #S3C64XX_GPNCON ]
++
++ ldr r0, [ r3, #S3C64XX_GPNDAT ]
++ bic r0, r0, #0xf << 12 @ GPN12..15
++ orr r0, r0, #1 << 15 @ GPN15
++ str r0, [ r3, #S3C64XX_GPNDAT ]
++#endif
++
++ /* __v6_setup from arch/arm/mm/proc-v6.S, ensure that the caches
++ * are thoroughly cleaned just in case the bootloader didn't do it
++ * for us. */
++ mov r0, #0
++ mcr p15, 0, r0, c7, c14, 0 @ clean+invalidate D cache
++ mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache
++ mcr p15, 0, r0, c7, c15, 0 @ clean+invalidate cache
++ mcr p15, 0, r0, c7, c10, 4 @ drain write buffer
++ @@mcr p15, 0, r0, c8, c7, 0 @ invalidate I + D TLBs
++ @@mcr p15, 0, r0, c7, c7, 0 @ Invalidate I + D caches
++
++ ldr r0, s3c_sleep_save_phys
++ ldmia r0, { r4 - r13 }
++
++ mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID
++ mcr p15, 0, r5, c3, c0, 0 @ Domain ID
++ mcr p15, 0, r6, c2, c0, 0 @ Translation Table BASE0
++ mcr p15, 0, r7, c2, c0, 1 @ Translation Table BASE1
++ mcr p15, 0, r8, c2, c0, 2 @ Translation Table Control
++ mcr p15, 0, r10, c1, c0, 1 @ Auxiliary control register
++
++ mov r0, #0 @ restore copro access controls
++ mcr p15, 0, r11, c1, c0, 2 @ Co-processor access controls
++ mcr p15, 0, r0, c7, c5, 4
++
++ ldr r2, =resume_with_mmu
++ mcr p15, 0, r9, c1, c0, 0 /* turn mmu back on */
++ nop
++ mov pc, r2 /* jump back */
++
++ .end
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/arch/arm/tools/mach-types linux-2.6.29-rc3.owrt.om/arch/arm/tools/mach-types
+--- linux-2.6.29-rc3.owrt/arch/arm/tools/mach-types 2009-05-10 22:08:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/arch/arm/tools/mach-types 2009-05-10 22:27:59.000000000 +0200
+@@ -1994,3 +1994,5 @@
+ blaze MACH_BLAZE BLAZE 2004
+ linkstation_ls_hgl MACH_LINKSTATION_LS_HGL LINKSTATION_LS_HGL 2005
+ htcvenus MACH_HTCVENUS HTCVENUS 2006
++om_3d7k MACH_OM_3D7K OM_3D7K 2120
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/build linux-2.6.29-rc3.owrt.om/build
+--- linux-2.6.29-rc3.owrt/build 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/build 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,128 @@
++#!/bin/sh
++#
++# Kernel building helper script (C)2008 Openmoko, Inc
++# Andy Green <andy@openmoko.org>
++#
++# Licensed under GPLv3 or later
++#
++#
++# you need to run this from the top level source dir, but it creates all
++# object files into a subdir given in the first argument, eg
++#
++# ./build GTA02
++#
++# this radically speeds up swapping between build contexts. Note the config
++# for each build lives in the subdir.
++
++PARALLEL=16
++
++if [ -z "$1" ] ; then
++ echo "Specify the build subdir, eg, GTA02 which contains the .config"
++ echo "and will hold the object files"
++ exit 1
++fi
++
++mkdir -p $1
++
++if [ -z "$CROSS_COMPILE" ]; then
++ export CROSS_COMPILE=/usr/local/openmoko/arm/bin/arm-angstrom-linux-gnueabi-
++fi
++make O=$1 ARCH=arm silentoldconfig
++
++#
++# figure out what we are building
++#
++
++PRODUCT=
++
++if [ ! -z "`grep CONFIG_MACH_NEO1973_GTA01=y $1/.config`" ] ; then
++ START=30008000
++ PRODUCT=GTA01
++fi
++
++if [ ! -z "`grep CONFIG_MACH_NEO1973_GTA02=y $1/.config`" ] ; then
++ START=30008000
++ PRODUCT=GTA02
++fi
++
++if [ ! -z "`grep CONFIG_MACH_OM_3D7K=y $1/.config`" ] ; then
++ START=50008000
++ PRODUCT=OM_3D7K
++fi
++
++if [ ! -z "`grep CONFIG_MACH_SMDK6410=y $1/.config`" ] ; then
++ START=50008000
++ PRODUCT=SMDK6410
++fi
++
++if [ ! -z "`grep CONFIG_MACH_M800=y $1/.config`" ] ; then
++ START=30008000
++ PRODUCT=M800
++fi
++
++if [ -z "$PRODUCT" ] ; then
++ echo "Unable to figure out what we are building from the config"
++ exit 1
++fi
++
++#
++# check that we are in a valid branch
++#
++
++if git branch | head -n1 | grep -q "* (no branch)"; then
++ cat <<EOF 1>&2
++There is no branch in the local copy of the repository right now!
++Hint: type git-branch, make sure you are in a valid branch and then try again
++EOF
++ exit 1
++fi;
++
++#
++# get the branch and head hash for the version we are building to
++# allow source tracability
++#
++
++VERSION=
++if [ -d .git ] ; then
++ HEAD=`git show --pretty=oneline | head -n1 | cut -d' ' -f1 | cut -b1-16`
++ BRANCH=`git branch | grep ^\* | cut -d' ' -f2 | sed s/-hist//g`
++ VERSION=-$PRODUCT\_$BRANCH
++fi
++
++
++echo $MKIMAGECMD
++
++#
++# actually make it
++#
++
++if make -j$PARALLEL O=$1 ARCH=arm CONFIG_DEBUG_SECTION_MISMATCH=y EXTRAVERSION=$VERSION; then
++
++ #
++ # if the build is happy, postprocess it by strip and with U-Boot header wrapper
++ # you can get mkimage from U-Boot or Qi build
++ #
++
++ ${CROSS_COMPILE}objcopy -O binary -R .note -R .comment -S $1/arch/arm/boot/compressed/vmlinux $1/linux.bin
++ mkimage -A arm -O linux -T kernel -C none -a $START -e $START -n "OM $PRODUCT $BRANCH""_$HEAD" -d $1/linux.bin $1/uImage-$PRODUCT.bin
++
++ # we can see if it is an "moredrivers" build by looking for USB Eth gadget
++ # if it is then keep a stamped copy of last build
++
++ if [ ! -z "`grep CONFIG_USB_USBNET=y $1/.config`" ] ; then
++ rm -f $1/uImage-moredrivers-$PRODUCT*.bin $1/modules-$PRODUCT*.tar.gz
++ cp $1/uImage-$PRODUCT.bin $1/uImage-moredrivers$VERSION-$HEAD.bin
++ rm -rf $1/staging
++ mkdir -p $1/staging
++ if [ ! -z "$2" ] ; then
++ make O=$1 ARCH=arm modules_install INSTALL_MOD_PATH=staging
++ cd $1/staging
++ tar czf ../modules$VERSION-$HEAD.tar.gz .
++ cd ../..
++ fi
++ fi
++ exit 0
++else
++ exit 1
++fi
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/dfu-kern linux-2.6.29-rc3.owrt.om/dfu-kern
+--- linux-2.6.29-rc3.owrt/dfu-kern 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/dfu-kern 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,16 @@
++#!/bin/bash
++
++if [ -z "$1" ] ; then
++ echo "Usage: $0 <DEVICE> eg, $0 GTA02"
++ exit 1
++fi
++
++NAME=`echo $1 | cut -d'-' -f1`
++
++../../dfu-util/src/dfu-util -a 3 -d 0x1d50:0x5119 -D $1/uImage-$NAME.bin
++if [ $? -eq 1 ] ; then
++../../dfu-util/src/dfu-util -a 3 -d 0x1d50:0x5120 -D $1/uImage-$NAME.bin
++../../dfu-util/src/dfu-util -a 3 -d 0x1d50:0x5119 -D $1/uImage-$NAME.bin
++fi
++
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/Documentation/arm/Samsung-S3C24XX/Suspend.txt linux-2.6.29-rc3.owrt.om/Documentation/arm/Samsung-S3C24XX/Suspend.txt
+--- linux-2.6.29-rc3.owrt/Documentation/arm/Samsung-S3C24XX/Suspend.txt 2009-05-10 22:05:01.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/Documentation/arm/Samsung-S3C24XX/Suspend.txt 2009-05-10 22:27:59.000000000 +0200
+@@ -40,13 +40,13 @@
+ Machine Support
+ ---------------
+
+- The machine specific functions must call the s3c2410_pm_init() function
++ The machine specific functions must call the s3c_pm_init() function
+ to say that its bootloader is capable of resuming. This can be as
+ simple as adding the following to the machine's definition:
+
+- INITMACHINE(s3c2410_pm_init)
++ INITMACHINE(s3c_pm_init)
+
+- A board can do its own setup before calling s3c2410_pm_init, if it
++ A board can do its own setup before calling s3c_pm_init, if it
+ needs to setup anything else for power management support.
+
+ There is currently no support for over-riding the default method of
+@@ -74,7 +74,7 @@
+
+ enable_irq_wake(IRQ_EINT0);
+
+- s3c2410_pm_init();
++ s3c_pm_init();
+ }
+
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/ar6000_drv.c linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/ar6000_drv.c
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/ar6000_drv.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/ar6000_drv.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,3128 @@
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++/*
++ * This driver is a pseudo ethernet driver to access the Atheros AR6000
++ * WLAN Device
++ */
++static const char athId[] __attribute__ ((unused)) = "$Id: //depot/sw/releases/olca2.0-GPL/host/os/linux/ar6000_drv.c#2 $";
++
++#include "ar6000_drv.h"
++#include "htc.h"
++
++MODULE_LICENSE("GPL and additional rights");
++
++#ifndef REORG_APTC_HEURISTICS
++#undef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++#endif /* REORG_APTC_HEURISTICS */
++
++#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++#define APTC_TRAFFIC_SAMPLING_INTERVAL 100 /* msec */
++#define APTC_UPPER_THROUGHPUT_THRESHOLD 3000 /* Kbps */
++#define APTC_LOWER_THROUGHPUT_THRESHOLD 2000 /* Kbps */
++
++typedef struct aptc_traffic_record {
++ A_BOOL timerScheduled;
++ struct timeval samplingTS;
++ unsigned long bytesReceived;
++ unsigned long bytesTransmitted;
++} APTC_TRAFFIC_RECORD;
++
++A_TIMER aptcTimer;
++APTC_TRAFFIC_RECORD aptcTR;
++#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
++
++int bmienable = 0;
++unsigned int bypasswmi = 0;
++unsigned int debuglevel = 0;
++int tspecCompliance = 1;
++unsigned int busspeedlow = 0;
++unsigned int onebitmode = 0;
++unsigned int skipflash = 0;
++unsigned int wmitimeout = 2;
++unsigned int wlanNodeCaching = 1;
++unsigned int enableuartprint = 0;
++unsigned int logWmiRawMsgs = 0;
++unsigned int enabletimerwar = 0;
++unsigned int mbox_yield_limit = 99;
++int reduce_credit_dribble = 1 + HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_ONE_HALF;
++int allow_trace_signal = 0;
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++unsigned int testmode =0;
++#endif
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
++module_param(bmienable, int, 0644);
++module_param(bypasswmi, int, 0644);
++module_param(debuglevel, int, 0644);
++module_param(tspecCompliance, int, 0644);
++module_param(onebitmode, int, 0644);
++module_param(busspeedlow, int, 0644);
++module_param(skipflash, int, 0644);
++module_param(wmitimeout, int, 0644);
++module_param(wlanNodeCaching, int, 0644);
++module_param(logWmiRawMsgs, int, 0644);
++module_param(enableuartprint, int, 0644);
++module_param(enabletimerwar, int, 0644);
++module_param(mbox_yield_limit, int, 0644);
++module_param(reduce_credit_dribble, int, 0644);
++module_param(allow_trace_signal, int, 0644);
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++module_param(testmode, int, 0644);
++#endif
++#else
++
++#define __user
++/* for linux 2.4 and lower */
++MODULE_PARM(bmienable,"i");
++MODULE_PARM(bypasswmi,"i");
++MODULE_PARM(debuglevel, "i");
++MODULE_PARM(onebitmode,"i");
++MODULE_PARM(busspeedlow, "i");
++MODULE_PARM(skipflash, "i");
++MODULE_PARM(wmitimeout, "i");
++MODULE_PARM(wlanNodeCaching, "i");
++MODULE_PARM(enableuartprint,"i");
++MODULE_PARM(logWmiRawMsgs, "i");
++MODULE_PARM(enabletimerwar,"i");
++MODULE_PARM(mbox_yield_limit,"i");
++MODULE_PARM(reduce_credit_dribble,"i");
++MODULE_PARM(allow_trace_signal,"i");
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++MODULE_PARM(testmode, "i");
++#endif
++#endif
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
++/* in 2.6.10 and later this is now a pointer to a uint */
++unsigned int _mboxnum = HTC_MAILBOX_NUM_MAX;
++#define mboxnum &_mboxnum
++#else
++unsigned int mboxnum = HTC_MAILBOX_NUM_MAX;
++#endif
++
++#ifdef CONFIG_AR6000_WLAN_RESET
++unsigned int resetok = 1;
++#else
++unsigned int resetok = 0;
++#endif
++
++#ifdef DEBUG
++A_UINT32 g_dbg_flags = DBG_DEFAULTS;
++unsigned int debugflags = 0;
++int debugdriver = 1;
++unsigned int debughtc = 128;
++unsigned int debugbmi = 1;
++unsigned int debughif = 2;
++unsigned int txcreditsavailable[HTC_MAILBOX_NUM_MAX] = {0};
++unsigned int txcreditsconsumed[HTC_MAILBOX_NUM_MAX] = {0};
++unsigned int txcreditintrenable[HTC_MAILBOX_NUM_MAX] = {0};
++unsigned int txcreditintrenableaggregate[HTC_MAILBOX_NUM_MAX] = {0};
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
++module_param(debugflags, int, 0644);
++module_param(debugdriver, int, 0644);
++module_param(debughtc, int, 0644);
++module_param(debugbmi, int, 0644);
++module_param(debughif, int, 0644);
++module_param(resetok, int, 0644);
++module_param_array(txcreditsavailable, int, mboxnum, 0644);
++module_param_array(txcreditsconsumed, int, mboxnum, 0644);
++module_param_array(txcreditintrenable, int, mboxnum, 0644);
++module_param_array(txcreditintrenableaggregate, int, mboxnum, 0644);
++#else
++/* linux 2.4 and lower */
++MODULE_PARM(debugflags,"i");
++MODULE_PARM(debugdriver, "i");
++MODULE_PARM(debughtc, "i");
++MODULE_PARM(debugbmi, "i");
++MODULE_PARM(debughif, "i");
++MODULE_PARM(resetok, "i");
++MODULE_PARM(txcreditsavailable, "0-3i");
++MODULE_PARM(txcreditsconsumed, "0-3i");
++MODULE_PARM(txcreditintrenable, "0-3i");
++MODULE_PARM(txcreditintrenableaggregate, "0-3i");
++#endif
++
++#endif /* DEBUG */
++
++unsigned int tx_attempt[HTC_MAILBOX_NUM_MAX] = {0};
++unsigned int tx_post[HTC_MAILBOX_NUM_MAX] = {0};
++unsigned int tx_complete[HTC_MAILBOX_NUM_MAX] = {0};
++unsigned int hifBusRequestNumMax = 40;
++unsigned int war23838_disabled = 0;
++#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++unsigned int enableAPTCHeuristics = 1;
++#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
++module_param_array(tx_attempt, int, mboxnum, 0644);
++module_param_array(tx_post, int, mboxnum, 0644);
++module_param_array(tx_complete, int, mboxnum, 0644);
++module_param(hifBusRequestNumMax, int, 0644);
++module_param(war23838_disabled, int, 0644);
++#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++module_param(enableAPTCHeuristics, int, 0644);
++#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
++#else
++MODULE_PARM(tx_attempt, "0-3i");
++MODULE_PARM(tx_post, "0-3i");
++MODULE_PARM(tx_complete, "0-3i");
++MODULE_PARM(hifBusRequestNumMax, "i");
++MODULE_PARM(war23838_disabled, "i");
++#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++MODULE_PARM(enableAPTCHeuristics, "i");
++#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
++#endif
++
++#ifdef BLOCK_TX_PATH_FLAG
++int blocktx = 0;
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
++module_param(blocktx, int, 0644);
++#else
++MODULE_PARM(blocktx, "i");
++#endif
++#endif /* BLOCK_TX_PATH_FLAG */
++
++// TODO move to arsoft_c
++USER_RSSI_THOLD rssi_map[12];
++
++int reconnect_flag = 0;
++
++DECLARE_WAIT_QUEUE_HEAD(ar6000_scan_queue);
++
++/* Function declarations */
++static int ar6000_init_module(void);
++static void ar6000_cleanup_module(void);
++
++int ar6000_init(struct net_device *dev);
++static int ar6000_open(struct net_device *dev);
++static int ar6000_close(struct net_device *dev);
++static void ar6000_init_control_info(AR_SOFTC_T *ar);
++static int ar6000_data_tx(struct sk_buff *skb, struct net_device *dev);
++
++static void ar6000_destroy(struct net_device *dev, unsigned int unregister);
++static void ar6000_detect_error(unsigned long ptr);
++static struct net_device_stats *ar6000_get_stats(struct net_device *dev);
++static struct iw_statistics *ar6000_get_iwstats(struct net_device * dev);
++
++/*
++ * HTC service connection handlers
++ */
++static void ar6000_avail_ev(HTC_HANDLE HTCHandle);
++
++static void ar6000_unavail_ev(void *Instance);
++
++static void ar6000_target_failure(void *Instance, A_STATUS Status);
++
++static void ar6000_rx(void *Context, HTC_PACKET *pPacket);
++
++static void ar6000_rx_refill(void *Context,HTC_ENDPOINT_ID Endpoint);
++
++static void ar6000_tx_complete(void *Context, HTC_PACKET *pPacket);
++
++static void ar6000_tx_queue_full(void *Context, HTC_ENDPOINT_ID Endpoint);
++
++static void ar6000_tx_queue_avail(void *Context, HTC_ENDPOINT_ID Endpoint);
++
++/*
++ * Static variables
++ */
++
++static struct net_device *ar6000_devices[MAX_AR6000];
++extern struct iw_handler_def ath_iw_handler_def;
++DECLARE_WAIT_QUEUE_HEAD(arEvent);
++static void ar6000_cookie_init(AR_SOFTC_T *ar);
++static void ar6000_cookie_cleanup(AR_SOFTC_T *ar);
++static void ar6000_free_cookie(AR_SOFTC_T *ar, struct ar_cookie * cookie);
++static struct ar_cookie *ar6000_alloc_cookie(AR_SOFTC_T *ar);
++static void ar6000_TxDataCleanup(AR_SOFTC_T *ar);
++
++#ifdef USER_KEYS
++static A_STATUS ar6000_reinstall_keys(AR_SOFTC_T *ar,A_UINT8 key_op_ctrl);
++#endif
++
++
++static struct ar_cookie s_ar_cookie_mem[MAX_COOKIE_NUM];
++
++#define HOST_INTEREST_ITEM_ADDRESS(ar, item) \
++((ar->arTargetType == TARGET_TYPE_AR6001) ? \
++ AR6001_HOST_INTEREST_ITEM_ADDRESS(item) : \
++ AR6002_HOST_INTEREST_ITEM_ADDRESS(item))
++
++
++/* Debug log support */
++
++/*
++ * Flag to govern whether the debug logs should be parsed in the kernel
++ * or reported to the application.
++ */
++#ifdef DEBUG
++#define REPORT_DEBUG_LOGS_TO_APP
++#endif
++
++A_STATUS
++ar6000_set_host_app_area(AR_SOFTC_T *ar)
++{
++ A_UINT32 address, data;
++ struct host_app_area_s host_app_area;
++
++ /* Fetch the address of the host_app_area_s instance in the host interest area */
++ address = HOST_INTEREST_ITEM_ADDRESS(ar, hi_app_host_interest);
++ if (ar6000_ReadRegDiag(ar->arHifDevice, &address, &data) != A_OK) {
++ return A_ERROR;
++ }
++ address = data;
++ host_app_area.wmi_protocol_ver = WMI_PROTOCOL_VERSION;
++ if (ar6000_WriteDataDiag(ar->arHifDevice, address,
++ (A_UCHAR *)&host_app_area,
++ sizeof(struct host_app_area_s)) != A_OK)
++ {
++ return A_ERROR;
++ }
++
++ return A_OK;
++}
++
++A_UINT32
++dbglog_get_debug_hdr_ptr(AR_SOFTC_T *ar)
++{
++ A_UINT32 param;
++ A_UINT32 address;
++ A_STATUS status;
++
++ address = HOST_INTEREST_ITEM_ADDRESS(ar, hi_dbglog_hdr);
++ if ((status = ar6000_ReadDataDiag(ar->arHifDevice, address,
++ (A_UCHAR *)&param, 4)) != A_OK)
++ {
++ param = 0;
++ }
++
++ return param;
++}
++
++/*
++ * The dbglog module has been initialized. Its ok to access the relevant
++ * data stuctures over the diagnostic window.
++ */
++void
++ar6000_dbglog_init_done(AR_SOFTC_T *ar)
++{
++ ar->dbglog_init_done = TRUE;
++}
++
++A_UINT32
++dbglog_get_debug_fragment(A_INT8 *datap, A_UINT32 len, A_UINT32 limit)
++{
++ A_INT32 *buffer;
++ A_UINT32 count;
++ A_UINT32 numargs;
++ A_UINT32 length;
++ A_UINT32 fraglen;
++
++ count = fraglen = 0;
++ buffer = (A_INT32 *)datap;
++ length = (limit >> 2);
++
++ if (len <= limit) {
++ fraglen = len;
++ } else {
++ while (count < length) {
++ numargs = DBGLOG_GET_NUMARGS(buffer[count]);
++ fraglen = (count << 2);
++ count += numargs + 1;
++ }
++ }
++
++ return fraglen;
++}
++
++void
++dbglog_parse_debug_logs(A_INT8 *datap, A_UINT32 len)
++{
++ A_INT32 *buffer;
++ A_UINT32 count;
++ A_UINT32 timestamp;
++ A_UINT32 debugid;
++ A_UINT32 moduleid;
++ A_UINT32 numargs;
++ A_UINT32 length;
++
++ count = 0;
++ buffer = (A_INT32 *)datap;
++ length = (len >> 2);
++ while (count < length) {
++ debugid = DBGLOG_GET_DBGID(buffer[count]);
++ moduleid = DBGLOG_GET_MODULEID(buffer[count]);
++ numargs = DBGLOG_GET_NUMARGS(buffer[count]);
++ timestamp = DBGLOG_GET_TIMESTAMP(buffer[count]);
++ switch (numargs) {
++ case 0:
++ AR_DEBUG_PRINTF("%d %d (%d)\n", moduleid, debugid, timestamp);
++ break;
++
++ case 1:
++ AR_DEBUG_PRINTF("%d %d (%d): 0x%x\n", moduleid, debugid,
++ timestamp, buffer[count+1]);
++ break;
++
++ case 2:
++ AR_DEBUG_PRINTF("%d %d (%d): 0x%x, 0x%x\n", moduleid, debugid,
++ timestamp, buffer[count+1], buffer[count+2]);
++ break;
++
++ default:
++ AR_DEBUG_PRINTF("Invalid args: %d\n", numargs);
++ }
++ count += numargs + 1;
++ }
++}
++
++int
++ar6000_dbglog_get_debug_logs(AR_SOFTC_T *ar)
++{
++ struct dbglog_hdr_s debug_hdr;
++ struct dbglog_buf_s debug_buf;
++ A_UINT32 address;
++ A_UINT32 length;
++ A_UINT32 dropped;
++ A_UINT32 firstbuf;
++ A_UINT32 debug_hdr_ptr;
++
++ if (!ar->dbglog_init_done) return A_ERROR;
++
++#ifndef CONFIG_AR6000_WLAN_DEBUG
++ return 0;
++#endif
++
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++
++ if (ar->dbgLogFetchInProgress) {
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ return A_EBUSY;
++ }
++
++ /* block out others */
++ ar->dbgLogFetchInProgress = TRUE;
++
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++
++ debug_hdr_ptr = dbglog_get_debug_hdr_ptr(ar);
++ printk("debug_hdr_ptr: 0x%x\n", debug_hdr_ptr);
++
++ /* Get the contents of the ring buffer */
++ if (debug_hdr_ptr) {
++ address = debug_hdr_ptr;
++ length = sizeof(struct dbglog_hdr_s);
++ ar6000_ReadDataDiag(ar->arHifDevice, address,
++ (A_UCHAR *)&debug_hdr, length);
++ address = (A_UINT32)debug_hdr.dbuf;
++ firstbuf = address;
++ dropped = debug_hdr.dropped;
++ length = sizeof(struct dbglog_buf_s);
++ ar6000_ReadDataDiag(ar->arHifDevice, address,
++ (A_UCHAR *)&debug_buf, length);
++
++ do {
++ address = (A_UINT32)debug_buf.buffer;
++ length = debug_buf.length;
++ if ((length) && (debug_buf.length <= debug_buf.bufsize)) {
++ /* Rewind the index if it is about to overrun the buffer */
++ if (ar->log_cnt > (DBGLOG_HOST_LOG_BUFFER_SIZE - length)) {
++ ar->log_cnt = 0;
++ }
++ if(A_OK != ar6000_ReadDataDiag(ar->arHifDevice, address,
++ (A_UCHAR *)&ar->log_buffer[ar->log_cnt], length))
++ {
++ break;
++ }
++ ar6000_dbglog_event(ar, dropped, &ar->log_buffer[ar->log_cnt], length);
++ ar->log_cnt += length;
++ } else {
++ AR_DEBUG_PRINTF("Length: %d (Total size: %d)\n",
++ debug_buf.length, debug_buf.bufsize);
++ }
++
++ address = (A_UINT32)debug_buf.next;
++ length = sizeof(struct dbglog_buf_s);
++ if(A_OK != ar6000_ReadDataDiag(ar->arHifDevice, address,
++ (A_UCHAR *)&debug_buf, length))
++ {
++ break;
++ }
++
++ } while (address != firstbuf);
++ }
++
++ ar->dbgLogFetchInProgress = FALSE;
++
++ return A_OK;
++}
++
++void
++ar6000_dbglog_event(AR_SOFTC_T *ar, A_UINT32 dropped,
++ A_INT8 *buffer, A_UINT32 length)
++{
++#ifdef REPORT_DEBUG_LOGS_TO_APP
++ #define MAX_WIRELESS_EVENT_SIZE 252
++ /*
++ * Break it up into chunks of MAX_WIRELESS_EVENT_SIZE bytes of messages.
++ * There seems to be a limitation on the length of message that could be
++ * transmitted to the user app via this mechanism.
++ */
++ A_UINT32 send, sent;
++
++ sent = 0;
++ send = dbglog_get_debug_fragment(&buffer[sent], length - sent,
++ MAX_WIRELESS_EVENT_SIZE);
++ while (send) {
++ ar6000_send_event_to_app(ar, WMIX_DBGLOG_EVENTID, &buffer[sent], send);
++ sent += send;
++ send = dbglog_get_debug_fragment(&buffer[sent], length - sent,
++ MAX_WIRELESS_EVENT_SIZE);
++ }
++#else
++ AR_DEBUG_PRINTF("Dropped logs: 0x%x\nDebug info length: %d\n",
++ dropped, length);
++
++ /* Interpret the debug logs */
++ dbglog_parse_debug_logs(buffer, length);
++#endif /* REPORT_DEBUG_LOGS_TO_APP */
++}
++
++
++
++static int __init
++ar6000_init_module(void)
++{
++ static int probed = 0;
++ A_STATUS status;
++ HTC_INIT_INFO initInfo;
++
++ A_MEMZERO(&initInfo,sizeof(initInfo));
++ initInfo.AddInstance = ar6000_avail_ev;
++ initInfo.DeleteInstance = ar6000_unavail_ev;
++ initInfo.TargetFailure = ar6000_target_failure;
++
++
++#ifdef DEBUG
++ /* Set the debug flags if specified at load time */
++ if(debugflags != 0)
++ {
++ g_dbg_flags = debugflags;
++ }
++#endif
++
++ if (probed) {
++ return -ENODEV;
++ }
++ probed++;
++
++#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++ memset(&aptcTR, 0, sizeof(APTC_TRAFFIC_RECORD));
++#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
++
++#ifdef CONFIG_HOST_GPIO_SUPPORT
++ ar6000_gpio_init();
++#endif /* CONFIG_HOST_GPIO_SUPPORT */
++
++ status = HTCInit(&initInfo);
++ if(status != A_OK)
++ return -ENODEV;
++
++ return 0;
++}
++
++static void __exit
++ar6000_cleanup_module(void)
++{
++ int i = 0;
++ struct net_device *ar6000_netdev;
++
++#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++ /* Delete the Adaptive Power Control timer */
++ if (timer_pending(&aptcTimer)) {
++ del_timer_sync(&aptcTimer);
++ }
++#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
++
++ for (i=0; i < MAX_AR6000; i++) {
++ if (ar6000_devices[i] != NULL) {
++ ar6000_netdev = ar6000_devices[i];
++ ar6000_devices[i] = NULL;
++ ar6000_destroy(ar6000_netdev, 1);
++ }
++ }
++
++ /* shutting down HTC will cause the HIF layer to detach from the
++ * underlying bus driver which will cause the subsequent deletion of
++ * all HIF and HTC instances */
++ HTCShutDown();
++
++ AR_DEBUG_PRINTF("ar6000_cleanup: success\n");
++}
++
++#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++void
++aptcTimerHandler(unsigned long arg)
++{
++ A_UINT32 numbytes;
++ A_UINT32 throughput;
++ AR_SOFTC_T *ar;
++ A_STATUS status;
++
++ ar = (AR_SOFTC_T *)arg;
++ A_ASSERT(ar != NULL);
++ A_ASSERT(!timer_pending(&aptcTimer));
++
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++
++ /* Get the number of bytes transferred */
++ numbytes = aptcTR.bytesTransmitted + aptcTR.bytesReceived;
++ aptcTR.bytesTransmitted = aptcTR.bytesReceived = 0;
++
++ /* Calculate and decide based on throughput thresholds */
++ throughput = ((numbytes * 8)/APTC_TRAFFIC_SAMPLING_INTERVAL); /* Kbps */
++ if (throughput < APTC_LOWER_THROUGHPUT_THRESHOLD) {
++ /* Enable Sleep and delete the timer */
++ A_ASSERT(ar->arWmiReady == TRUE);
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ status = wmi_powermode_cmd(ar->arWmi, REC_POWER);
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ A_ASSERT(status == A_OK);
++ aptcTR.timerScheduled = FALSE;
++ } else {
++ A_TIMEOUT_MS(&aptcTimer, APTC_TRAFFIC_SAMPLING_INTERVAL, 0);
++ }
++
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++}
++#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
++
++
++
++/* set HTC block size, assume BMI is already initialized */
++A_STATUS ar6000_SetHTCBlockSize(AR_SOFTC_T *ar)
++{
++ A_STATUS status;
++ A_UINT32 blocksizes[HTC_MAILBOX_NUM_MAX];
++
++ do {
++ /* get the block sizes */
++ status = HIFConfigureDevice(ar->arHifDevice, HIF_DEVICE_GET_MBOX_BLOCK_SIZE,
++ blocksizes, sizeof(blocksizes));
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF("Failed to get block size info from HIF layer...\n");
++ break;
++ }
++ /* note: we actually get the block size for mailbox 1, for SDIO the block
++ * size on mailbox 0 is artificially set to 1 */
++ /* must be a power of 2 */
++ A_ASSERT((blocksizes[1] & (blocksizes[1] - 1)) == 0);
++
++ /* set the host interest area for the block size */
++ status = BMIWriteMemory(ar->arHifDevice,
++ HOST_INTEREST_ITEM_ADDRESS(ar, hi_mbox_io_block_sz),
++ (A_UCHAR *)&blocksizes[1],
++ 4);
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF("BMIWriteMemory for IO block size failed \n");
++ break;
++ }
++
++ AR_DEBUG_PRINTF("Block Size Set: %d (target address:0x%X)\n",
++ blocksizes[1], HOST_INTEREST_ITEM_ADDRESS(ar, hi_mbox_io_block_sz));
++
++ /* set the host interest area for the mbox ISR yield limit */
++ status = BMIWriteMemory(ar->arHifDevice,
++ HOST_INTEREST_ITEM_ADDRESS(ar, hi_mbox_isr_yield_limit),
++ (A_UCHAR *)&mbox_yield_limit,
++ 4);
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF("BMIWriteMemory for yield limit failed \n");
++ break;
++ }
++
++ } while (FALSE);
++
++ return status;
++}
++
++static void free_raw_buffers(AR_SOFTC_T *ar)
++{
++ int i, j;
++
++ for (i = 0; i != HTC_RAW_STREAM_NUM_MAX; i++) {
++ for (j = 0; j != RAW_HTC_READ_BUFFERS_NUM; j++)
++ kfree(ar->raw_htc_read_buffer[i][j]);
++ for (j = 0; j != RAW_HTC_WRITE_BUFFERS_NUM; j++)
++ kfree(ar->raw_htc_write_buffer[i][j]);
++ }
++}
++
++static int alloc_raw_buffers(AR_SOFTC_T *ar)
++{
++ int i, j;
++ raw_htc_buffer *b;
++
++ for (i = 0; i != HTC_RAW_STREAM_NUM_MAX; i++) {
++ for (j = 0; j != RAW_HTC_READ_BUFFERS_NUM; j++) {
++ b = kzalloc(sizeof(*b), GFP_KERNEL);
++ if (!b)
++ return -ENOMEM;
++ ar->raw_htc_read_buffer[i][j] = b;
++ }
++ for (j = 0; j != RAW_HTC_WRITE_BUFFERS_NUM; j++) {
++ b = kzalloc(sizeof(*b), GFP_KERNEL);
++ if (!b)
++ return -ENOMEM;
++ ar->raw_htc_write_buffer[i][j] = b;
++ }
++ }
++ return 0;
++}
++
++/*
++ * HTC Event handlers
++ */
++static void
++ar6000_avail_ev(HTC_HANDLE HTCHandle)
++{
++ int i;
++ struct net_device *dev;
++ AR_SOFTC_T *ar;
++ int device_index = 0;
++
++ AR_DEBUG_PRINTF("ar6000_available\n");
++
++ for (i=0; i < MAX_AR6000; i++) {
++ if (ar6000_devices[i] == NULL) {
++ break;
++ }
++ }
++
++ if (i == MAX_AR6000) {
++ AR_DEBUG_PRINTF("ar6000_available: max devices reached\n");
++ return;
++ }
++
++ /* Save this. It gives a bit better readability especially since */
++ /* we use another local "i" variable below. */
++ device_index = i;
++
++ A_ASSERT(HTCHandle != NULL);
++
++ dev = alloc_etherdev(sizeof(AR_SOFTC_T));
++ if (dev == NULL) {
++ AR_DEBUG_PRINTF("ar6000_available: can't alloc etherdev\n");
++ return;
++ }
++
++ ether_setup(dev);
++
++ if (netdev_priv(dev) == NULL) {
++ printk(KERN_CRIT "ar6000_available: Could not allocate memory\n");
++ return;
++ }
++
++ A_MEMZERO(netdev_priv(dev), sizeof(AR_SOFTC_T));
++
++ ar = (AR_SOFTC_T *)netdev_priv(dev);
++ ar->arNetDev = dev;
++ ar->arHtcTarget = HTCHandle;
++ ar->arHifDevice = HTCGetHifDevice(HTCHandle);
++ ar->arWlanState = WLAN_ENABLED;
++ ar->arRadioSwitch = WLAN_ENABLED;
++ ar->arDeviceIndex = device_index;
++
++ A_INIT_TIMER(&ar->arHBChallengeResp.timer, ar6000_detect_error, dev);
++ ar->arHBChallengeResp.seqNum = 0;
++ ar->arHBChallengeResp.outstanding = FALSE;
++ ar->arHBChallengeResp.missCnt = 0;
++ ar->arHBChallengeResp.frequency = AR6000_HB_CHALLENGE_RESP_FREQ_DEFAULT;
++ ar->arHBChallengeResp.missThres = AR6000_HB_CHALLENGE_RESP_MISS_THRES_DEFAULT;
++
++ ar6000_init_control_info(ar);
++ init_waitqueue_head(&arEvent);
++ sema_init(&ar->arSem, 1);
++
++ if (alloc_raw_buffers(ar)) {
++ free_raw_buffers(ar);
++ /*
++ * @@@ Clean up our own mess, but for anything else, cheerfully mimick
++ * the beautiful error non-handling of the rest of this function.
++ */
++ return;
++ }
++
++#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++ A_INIT_TIMER(&aptcTimer, aptcTimerHandler, ar);
++#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
++
++ /*
++ * If requested, perform some magic which requires no cooperation from
++ * the Target. It causes the Target to ignore flash and execute to the
++ * OS from ROM.
++ *
++ * This is intended to support recovery from a corrupted flash on Targets
++ * that support flash.
++ */
++ if (skipflash)
++ {
++ ar6000_reset_device_skipflash(ar->arHifDevice);
++ }
++
++ BMIInit();
++ {
++ struct bmi_target_info targ_info;
++
++ if (BMIGetTargetInfo(ar->arHifDevice, &targ_info) != A_OK) {
++ return;
++ }
++
++ ar->arVersion.target_ver = targ_info.target_ver;
++ ar->arTargetType = targ_info.target_type;
++ }
++
++ if (enableuartprint) {
++ A_UINT32 param;
++ param = 1;
++ if (BMIWriteMemory(ar->arHifDevice,
++ HOST_INTEREST_ITEM_ADDRESS(ar, hi_serial_enable),
++ (A_UCHAR *)&param,
++ 4)!= A_OK)
++ {
++ AR_DEBUG_PRINTF("BMIWriteMemory for enableuartprint failed \n");
++ return ;
++ }
++ AR_DEBUG_PRINTF("Serial console prints enabled\n");
++ }
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++ if(testmode) {
++ ar->arTargetMode = AR6000_TCMD_MODE;
++ }else {
++ ar->arTargetMode = AR6000_WLAN_MODE;
++ }
++#endif
++ if (enabletimerwar) {
++ A_UINT32 param;
++
++ if (BMIReadMemory(ar->arHifDevice,
++ HOST_INTEREST_ITEM_ADDRESS(ar, hi_option_flag),
++ (A_UCHAR *)&param,
++ 4)!= A_OK)
++ {
++ AR_DEBUG_PRINTF("BMIReadMemory for enabletimerwar failed \n");
++ return;
++ }
++
++ param |= HI_OPTION_TIMER_WAR;
++
++ if (BMIWriteMemory(ar->arHifDevice,
++ HOST_INTEREST_ITEM_ADDRESS(ar, hi_option_flag),
++ (A_UCHAR *)&param,
++ 4) != A_OK)
++ {
++ AR_DEBUG_PRINTF("BMIWriteMemory for enabletimerwar failed \n");
++ return;
++ }
++ AR_DEBUG_PRINTF("Timer WAR enabled\n");
++ }
++
++
++ /* since BMIInit is called in the driver layer, we have to set the block
++ * size here for the target */
++
++ if (A_FAILED(ar6000_SetHTCBlockSize(ar))) {
++ return;
++ }
++
++ spin_lock_init(&ar->arLock);
++
++ /* Don't install the init function if BMI is requested */
++ if(!bmienable)
++ {
++ dev->init = ar6000_init;
++ } else {
++ AR_DEBUG_PRINTF(" BMI enabled \n");
++ }
++
++ dev->open = &ar6000_open;
++ dev->stop = &ar6000_close;
++ dev->hard_start_xmit = &ar6000_data_tx;
++ dev->get_stats = &ar6000_get_stats;
++
++ /* dev->tx_timeout = ar6000_tx_timeout; */
++ dev->do_ioctl = &ar6000_ioctl;
++ dev->watchdog_timeo = AR6000_TX_TIMEOUT;
++ ar6000_ioctl_iwsetup(&ath_iw_handler_def);
++ dev->wireless_handlers = &ath_iw_handler_def;
++ ath_iw_handler_def.get_wireless_stats = ar6000_get_iwstats; /*Displayed via proc fs */
++
++ /*
++ * We need the OS to provide us with more headroom in order to
++ * perform dix to 802.3, WMI header encap, and the HTC header
++ */
++ dev->hard_header_len = ETH_HLEN + sizeof(ATH_LLC_SNAP_HDR) +
++ sizeof(WMI_DATA_HDR) + HTC_HEADER_LEN;
++
++ /* This runs the init function */
++ SET_NETDEV_DEV(dev, HIFGetOSDevice(ar->arHifDevice));
++ if (register_netdev(dev)) {
++ AR_DEBUG_PRINTF("ar6000_avail: register_netdev failed\n");
++ ar6000_destroy(dev, 0);
++ return;
++ }
++
++ HTCSetInstance(ar->arHtcTarget, ar);
++
++ /* We only register the device in the global list if we succeed. */
++ /* If the device is in the global list, it will be destroyed */
++ /* when the module is unloaded. */
++ ar6000_devices[device_index] = dev;
++
++ AR_DEBUG_PRINTF("ar6000_avail: name=%s htcTarget=0x%x, dev=0x%x (%d), ar=0x%x\n",
++ dev->name, (A_UINT32)HTCHandle, (A_UINT32)dev, device_index,
++ (A_UINT32)ar);
++}
++
++static void ar6000_target_failure(void *Instance, A_STATUS Status)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)Instance;
++ WMI_TARGET_ERROR_REPORT_EVENT errEvent;
++ static A_BOOL sip = FALSE;
++
++ if (Status != A_OK) {
++ if (timer_pending(&ar->arHBChallengeResp.timer)) {
++ A_UNTIMEOUT(&ar->arHBChallengeResp.timer);
++ }
++
++ /* try dumping target assertion information (if any) */
++ ar6000_dump_target_assert_info(ar->arHifDevice,ar->arTargetType);
++
++ /*
++ * Fetch the logs from the target via the diagnostic
++ * window.
++ */
++ ar6000_dbglog_get_debug_logs(ar);
++
++ /* Report the error only once */
++ if (!sip) {
++ sip = TRUE;
++ errEvent.errorVal = WMI_TARGET_COM_ERR |
++ WMI_TARGET_FATAL_ERR;
++#ifdef SEND_EVENT_TO_APP
++ ar6000_send_event_to_app(ar, WMI_ERROR_REPORT_EVENTID,
++ (A_UINT8 *)&errEvent,
++ sizeof(WMI_TARGET_ERROR_REPORT_EVENT));
++#endif
++ }
++ }
++}
++
++static void
++ar6000_unavail_ev(void *Instance)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)Instance;
++ /* NULL out it's entry in the global list */
++ ar6000_devices[ar->arDeviceIndex] = NULL;
++ ar6000_destroy(ar->arNetDev, 1);
++}
++
++/*
++ * We need to differentiate between the surprise and planned removal of the
++ * device because of the following consideration:
++ * - In case of surprise removal, the hcd already frees up the pending
++ * for the device and hence there is no need to unregister the function
++ * driver inorder to get these requests. For planned removal, the function
++ * driver has to explictly unregister itself to have the hcd return all the
++ * pending requests before the data structures for the devices are freed up.
++ * Note that as per the current implementation, the function driver will
++ * end up releasing all the devices since there is no API to selectively
++ * release a particular device.
++ * - Certain commands issued to the target can be skipped for surprise
++ * removal since they will anyway not go through.
++ */
++static void
++ar6000_destroy(struct net_device *dev, unsigned int unregister)
++{
++ AR_SOFTC_T *ar;
++
++ AR_DEBUG_PRINTF("+ar6000_destroy \n");
++
++ if((dev == NULL) || ((ar = netdev_priv(dev)) == NULL))
++ {
++ AR_DEBUG_PRINTF("%s(): Failed to get device structure.\n", __func__);
++ return;
++ }
++
++ /* Clear the tx counters */
++ memset(tx_attempt, 0, sizeof(tx_attempt));
++ memset(tx_post, 0, sizeof(tx_post));
++ memset(tx_complete, 0, sizeof(tx_complete));
++
++ /* Free up the device data structure */
++ if (unregister) {
++ unregister_netdev(dev);
++ } else {
++ ar6000_close(dev);
++ }
++
++ free_raw_buffers(ar);
++
++#ifndef free_netdev
++ kfree(dev);
++#else
++ free_netdev(dev);
++#endif
++
++ AR_DEBUG_PRINTF("-ar6000_destroy \n");
++}
++
++static void ar6000_detect_error(unsigned long ptr)
++{
++ struct net_device *dev = (struct net_device *)ptr;
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_TARGET_ERROR_REPORT_EVENT errEvent;
++
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++
++ if (ar->arHBChallengeResp.outstanding) {
++ ar->arHBChallengeResp.missCnt++;
++ } else {
++ ar->arHBChallengeResp.missCnt = 0;
++ }
++
++ if (ar->arHBChallengeResp.missCnt > ar->arHBChallengeResp.missThres) {
++ /* Send Error Detect event to the application layer and do not reschedule the error detection module timer */
++ ar->arHBChallengeResp.missCnt = 0;
++ ar->arHBChallengeResp.seqNum = 0;
++ errEvent.errorVal = WMI_TARGET_COM_ERR | WMI_TARGET_FATAL_ERR;
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++#ifdef SEND_EVENT_TO_APP
++ ar6000_send_event_to_app(ar, WMI_ERROR_REPORT_EVENTID,
++ (A_UINT8 *)&errEvent,
++ sizeof(WMI_TARGET_ERROR_REPORT_EVENT));
++#endif
++ return;
++ }
++
++ /* Generate the sequence number for the next challenge */
++ ar->arHBChallengeResp.seqNum++;
++ ar->arHBChallengeResp.outstanding = TRUE;
++
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++
++ /* Send the challenge on the control channel */
++ if (wmi_get_challenge_resp_cmd(ar->arWmi, ar->arHBChallengeResp.seqNum, DRV_HB_CHALLENGE) != A_OK) {
++ AR_DEBUG_PRINTF("Unable to send heart beat challenge\n");
++ }
++
++
++ /* Reschedule the timer for the next challenge */
++ A_TIMEOUT_MS(&ar->arHBChallengeResp.timer, ar->arHBChallengeResp.frequency * 1000, 0);
++}
++
++void ar6000_init_profile_info(AR_SOFTC_T *ar)
++{
++ ar->arSsidLen = 0;
++ A_MEMZERO(ar->arSsid, sizeof(ar->arSsid));
++ ar->arNetworkType = INFRA_NETWORK;
++ ar->arDot11AuthMode = OPEN_AUTH;
++ ar->arAuthMode = NONE_AUTH;
++ ar->arPairwiseCrypto = NONE_CRYPT;
++ ar->arPairwiseCryptoLen = 0;
++ ar->arGroupCrypto = NONE_CRYPT;
++ ar->arGroupCryptoLen = 0;
++ A_MEMZERO(ar->arWepKeyList, sizeof(ar->arWepKeyList));
++ A_MEMZERO(ar->arReqBssid, sizeof(ar->arReqBssid));
++ A_MEMZERO(ar->arBssid, sizeof(ar->arBssid));
++ ar->arBssChannel = 0;
++}
++
++static void
++ar6000_init_control_info(AR_SOFTC_T *ar)
++{
++ ar->arWmiEnabled = FALSE;
++ ar6000_init_profile_info(ar);
++ ar->arDefTxKeyIndex = 0;
++ A_MEMZERO(ar->arWepKeyList, sizeof(ar->arWepKeyList));
++ ar->arChannelHint = 0;
++ ar->arListenInterval = MAX_LISTEN_INTERVAL;
++ ar->arVersion.host_ver = AR6K_SW_VERSION;
++ ar->arRssi = 0;
++ ar->arTxPwr = 0;
++ ar->arTxPwrSet = FALSE;
++ ar->arSkipScan = 0;
++ ar->arBeaconInterval = 0;
++ ar->arBitRate = 0;
++ ar->arMaxRetries = 0;
++ ar->arWmmEnabled = TRUE;
++}
++
++static int
++ar6000_open(struct net_device *dev)
++{
++ /* Wake up the queues */
++ netif_start_queue(dev);
++
++ return 0;
++}
++
++static int
++ar6000_close(struct net_device *dev)
++{
++ AR_SOFTC_T *ar = netdev_priv(dev);
++
++ /* Stop the transmit queues */
++ netif_stop_queue(dev);
++
++ /* Disable the target and the interrupts associated with it */
++ if (ar->arWmiReady == TRUE)
++ {
++ if (!bypasswmi)
++ {
++ if (ar->arConnected == TRUE || ar->arConnectPending == TRUE)
++ {
++ AR_DEBUG_PRINTF("%s(): Disconnect\n", __func__);
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ ar6000_init_profile_info(ar);
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ wmi_disconnect_cmd(ar->arWmi);
++ }
++
++ ar6000_dbglog_get_debug_logs(ar);
++ ar->arWmiReady = FALSE;
++ ar->arConnected = FALSE;
++ ar->arConnectPending = FALSE;
++ wmi_shutdown(ar->arWmi);
++ ar->arWmiEnabled = FALSE;
++ ar->arWmi = NULL;
++ ar->arWlanState = WLAN_ENABLED;
++#ifdef USER_KEYS
++ ar->user_savedkeys_stat = USER_SAVEDKEYS_STAT_INIT;
++ ar->user_key_ctrl = 0;
++#endif
++ }
++
++ AR_DEBUG_PRINTF("%s(): WMI stopped\n", __func__);
++ }
++ else
++ {
++ AR_DEBUG_PRINTF("%s(): WMI not ready 0x%08x 0x%08x\n",
++ __func__, (unsigned int) ar, (unsigned int) ar->arWmi);
++
++ /* Shut down WMI if we have started it */
++ if(ar->arWmiEnabled == TRUE)
++ {
++ AR_DEBUG_PRINTF("%s(): Shut down WMI\n", __func__);
++ wmi_shutdown(ar->arWmi);
++ ar->arWmiEnabled = FALSE;
++ ar->arWmi = NULL;
++ }
++ }
++
++ /* stop HTC */
++ HTCStop(ar->arHtcTarget);
++
++ /* set the instance to NULL so we do not get called back on remove incase we
++ * we're explicity destroyed by module unload */
++ HTCSetInstance(ar->arHtcTarget, NULL);
++
++ if (resetok) {
++ /* try to reset the device if we can
++ * The driver may have been configure NOT to reset the target during
++ * a debug session */
++ AR_DEBUG_PRINTF(" Attempting to reset target on instance destroy.... \n");
++ ar6000_reset_device(ar->arHifDevice, ar->arTargetType);
++ } else {
++ AR_DEBUG_PRINTF(" Host does not want target reset. \n");
++ }
++
++ /* Done with cookies */
++ ar6000_cookie_cleanup(ar);
++
++ /* Cleanup BMI */
++ BMIInit();
++
++ return 0;
++}
++
++/* connect to a service */
++static A_STATUS ar6000_connectservice(AR_SOFTC_T *ar,
++ HTC_SERVICE_CONNECT_REQ *pConnect,
++ WMI_PRI_STREAM_ID WmiStreamID,
++ char *pDesc)
++{
++ A_STATUS status;
++ HTC_SERVICE_CONNECT_RESP response;
++
++ do {
++
++ A_MEMZERO(&response,sizeof(response));
++
++ status = HTCConnectService(ar->arHtcTarget,
++ pConnect,
++ &response);
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF(" Failed to connect to %s service status:%d \n", pDesc, status);
++ break;
++ }
++
++ if (WmiStreamID == WMI_NOT_MAPPED) {
++ /* done */
++ break;
++ }
++
++ /* set endpoint mapping for the WMI stream in the driver layer */
++ arSetWMIStream2EndpointIDMap(ar,WmiStreamID,response.Endpoint);
++
++ } while (FALSE);
++
++ return status;
++}
++
++static void ar6000_TxDataCleanup(AR_SOFTC_T *ar)
++{
++ /* flush all the data (non-control) streams
++ * we only flush packets that are tagged as data, we leave any control packets that
++ * were in the TX queues alone */
++ HTCFlushEndpoint(ar->arHtcTarget,
++ arWMIStream2EndpointID(ar,WMI_BEST_EFFORT_PRI),
++ AR6K_DATA_PKT_TAG);
++ HTCFlushEndpoint(ar->arHtcTarget,
++ arWMIStream2EndpointID(ar,WMI_LOW_PRI),
++ AR6K_DATA_PKT_TAG);
++ HTCFlushEndpoint(ar->arHtcTarget,
++ arWMIStream2EndpointID(ar,WMI_HIGH_PRI),
++ AR6K_DATA_PKT_TAG);
++ HTCFlushEndpoint(ar->arHtcTarget,
++ arWMIStream2EndpointID(ar,WMI_HIGHEST_PRI),
++ AR6K_DATA_PKT_TAG);
++}
++
++/* This function does one time initialization for the lifetime of the device */
++int ar6000_init(struct net_device *dev)
++{
++ AR_SOFTC_T *ar;
++ A_STATUS status;
++ A_INT32 timeleft;
++
++ if((ar = netdev_priv(dev)) == NULL)
++ {
++ return(-EIO);
++ }
++
++ /* Do we need to finish the BMI phase */
++ if(BMIDone(ar->arHifDevice) != A_OK)
++ {
++ return -EIO;
++ }
++
++ if (!bypasswmi)
++ {
++#if 0 /* TBDXXX */
++ if (ar->arVersion.host_ver != ar->arVersion.target_ver) {
++ A_PRINTF("WARNING: Host version 0x%x does not match Target "
++ " version 0x%x!\n",
++ ar->arVersion.host_ver, ar->arVersion.target_ver);
++ }
++#endif
++
++ /* Indicate that WMI is enabled (although not ready yet) */
++ ar->arWmiEnabled = TRUE;
++ if ((ar->arWmi = wmi_init((void *) ar)) == NULL)
++ {
++ AR_DEBUG_PRINTF("%s() Failed to initialize WMI.\n", __func__);
++ return(-EIO);
++ }
++
++ AR_DEBUG_PRINTF("%s() Got WMI @ 0x%08x.\n", __func__,
++ (unsigned int) ar->arWmi);
++ }
++
++ do {
++ HTC_SERVICE_CONNECT_REQ connect;
++
++ /* the reason we have to wait for the target here is that the driver layer
++ * has to init BMI in order to set the host block size,
++ */
++ status = HTCWaitTarget(ar->arHtcTarget);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ A_MEMZERO(&connect,sizeof(connect));
++ /* meta data is unused for now */
++ connect.pMetaData = NULL;
++ connect.MetaDataLength = 0;
++ /* these fields are the same for all service endpoints */
++ connect.EpCallbacks.pContext = ar;
++ connect.EpCallbacks.EpTxComplete = ar6000_tx_complete;
++ connect.EpCallbacks.EpRecv = ar6000_rx;
++ connect.EpCallbacks.EpRecvRefill = ar6000_rx_refill;
++ connect.EpCallbacks.EpSendFull = ar6000_tx_queue_full;
++ connect.EpCallbacks.EpSendAvail = ar6000_tx_queue_avail;
++ /* set the max queue depth so that our ar6000_tx_queue_full handler gets called.
++ * Linux has the peculiarity of not providing flow control between the
++ * NIC and the network stack. There is no API to indicate that a TX packet
++ * was sent which could provide some back pressure to the network stack.
++ * Under linux you would have to wait till the network stack consumed all sk_buffs
++ * before any back-flow kicked in. Which isn't very friendly.
++ * So we have to manage this ourselves */
++ connect.MaxSendQueueDepth = 32;
++
++ /* connect to control service */
++ connect.ServiceID = WMI_CONTROL_SVC;
++ status = ar6000_connectservice(ar,
++ &connect,
++ WMI_CONTROL_PRI,
++ "WMI CONTROL");
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ /* for the remaining data services set the connection flag to reduce dribbling,
++ * if configured to do so */
++ if (reduce_credit_dribble) {
++ connect.ConnectionFlags |= HTC_CONNECT_FLAGS_REDUCE_CREDIT_DRIBBLE;
++ /* the credit dribble trigger threshold is (reduce_credit_dribble - 1) for a value
++ * of 0-3 */
++ connect.ConnectionFlags &= ~HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_MASK;
++ connect.ConnectionFlags |=
++ ((A_UINT16)reduce_credit_dribble - 1) & HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_MASK;
++ }
++ /* connect to best-effort service */
++ connect.ServiceID = WMI_DATA_BE_SVC;
++
++ status = ar6000_connectservice(ar,
++ &connect,
++ WMI_BEST_EFFORT_PRI,
++ "WMI DATA BE");
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ /* connect to back-ground
++ * map this to WMI LOW_PRI */
++ connect.ServiceID = WMI_DATA_BK_SVC;
++ status = ar6000_connectservice(ar,
++ &connect,
++ WMI_LOW_PRI,
++ "WMI DATA BK");
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ /* connect to Video service, map this to
++ * to HI PRI */
++ connect.ServiceID = WMI_DATA_VI_SVC;
++ status = ar6000_connectservice(ar,
++ &connect,
++ WMI_HIGH_PRI,
++ "WMI DATA VI");
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ /* connect to VO service, this is currently not
++ * mapped to a WMI priority stream due to historical reasons.
++ * WMI originally defined 3 priorities over 3 mailboxes
++ * We can change this when WMI is reworked so that priorities are not
++ * dependent on mailboxes */
++ connect.ServiceID = WMI_DATA_VO_SVC;
++ status = ar6000_connectservice(ar,
++ &connect,
++ WMI_HIGHEST_PRI,
++ "WMI DATA VO");
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ A_ASSERT(arWMIStream2EndpointID(ar,WMI_CONTROL_PRI) != 0);
++ A_ASSERT(arWMIStream2EndpointID(ar,WMI_BEST_EFFORT_PRI) != 0);
++ A_ASSERT(arWMIStream2EndpointID(ar,WMI_LOW_PRI) != 0);
++ A_ASSERT(arWMIStream2EndpointID(ar,WMI_HIGH_PRI) != 0);
++ A_ASSERT(arWMIStream2EndpointID(ar,WMI_HIGHEST_PRI) != 0);
++ } while (FALSE);
++
++ if (A_FAILED(status)) {
++ return (-EIO);
++ }
++
++ /*
++ * give our connected endpoints some buffers
++ */
++ ar6000_rx_refill(ar, arWMIStream2EndpointID(ar,WMI_CONTROL_PRI));
++
++ ar6000_rx_refill(ar, arWMIStream2EndpointID(ar,WMI_BEST_EFFORT_PRI));
++
++ /*
++ * We will post the receive buffers only for SPE testing and so we are
++ * making it conditional on the 'bypasswmi' flag.
++ */
++ if (bypasswmi) {
++ ar6000_rx_refill(ar,arWMIStream2EndpointID(ar,WMI_LOW_PRI));
++ ar6000_rx_refill(ar,arWMIStream2EndpointID(ar,WMI_HIGH_PRI));
++ }
++
++ /* setup credit distribution */
++ ar6000_setup_credit_dist(ar->arHtcTarget, &ar->arCreditStateInfo);
++
++ /* Since cookies are used for HTC transports, they should be */
++ /* initialized prior to enabling HTC. */
++ ar6000_cookie_init(ar);
++
++ /* start HTC */
++ status = HTCStart(ar->arHtcTarget);
++
++ if (status != A_OK) {
++ if (ar->arWmiEnabled == TRUE) {
++ wmi_shutdown(ar->arWmi);
++ ar->arWmiEnabled = FALSE;
++ ar->arWmi = NULL;
++ }
++ ar6000_cookie_cleanup(ar);
++ return -EIO;
++ }
++
++ if (!bypasswmi) {
++ /* Wait for Wmi event to be ready */
++ timeleft = wait_event_interruptible_timeout(arEvent,
++ (ar->arWmiReady == TRUE), wmitimeout * HZ);
++
++ if(!timeleft || signal_pending(current))
++ {
++ AR_DEBUG_PRINTF("WMI is not ready or wait was interrupted\n");
++#if defined(DWSIM) /* TBDXXX */
++ AR_DEBUG_PRINTF(".....but proceed anyway.\n");
++#else
++ return -EIO;
++#endif
++ }
++
++ AR_DEBUG_PRINTF("%s() WMI is ready\n", __func__);
++
++ /* Communicate the wmi protocol verision to the target */
++ if ((ar6000_set_host_app_area(ar)) != A_OK) {
++ AR_DEBUG_PRINTF("Unable to set the host app area\n");
++ }
++ }
++
++ ar->arNumDataEndPts = 1;
++
++ return(0);
++}
++
++
++void
++ar6000_bitrate_rx(void *devt, A_INT32 rateKbps)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
++
++ ar->arBitRate = rateKbps;
++ wake_up(&arEvent);
++}
++
++void
++ar6000_ratemask_rx(void *devt, A_UINT16 ratemask)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
++
++ ar->arRateMask = ratemask;
++ wake_up(&arEvent);
++}
++
++void
++ar6000_txPwr_rx(void *devt, A_UINT8 txPwr)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
++
++ ar->arTxPwr = txPwr;
++ wake_up(&arEvent);
++}
++
++
++void
++ar6000_channelList_rx(void *devt, A_INT8 numChan, A_UINT16 *chanList)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
++
++ A_MEMCPY(ar->arChannelList, chanList, numChan * sizeof (A_UINT16));
++ ar->arNumChannels = numChan;
++
++ wake_up(&arEvent);
++}
++
++A_UINT8
++ar6000_ibss_map_epid(struct sk_buff *skb, struct net_device *dev, A_UINT32 * mapNo)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ A_UINT8 *datap;
++ ATH_MAC_HDR *macHdr;
++ A_UINT32 i, eptMap;
++
++ (*mapNo) = 0;
++ datap = A_NETBUF_DATA(skb);
++ macHdr = (ATH_MAC_HDR *)(datap + sizeof(WMI_DATA_HDR));
++ if (IEEE80211_IS_MULTICAST(macHdr->dstMac)) {
++ return ENDPOINT_2;
++ }
++
++ eptMap = -1;
++ for (i = 0; i < ar->arNodeNum; i ++) {
++ if (IEEE80211_ADDR_EQ(macHdr->dstMac, ar->arNodeMap[i].macAddress)) {
++ (*mapNo) = i + 1;
++ ar->arNodeMap[i].txPending ++;
++ return ar->arNodeMap[i].epId;
++ }
++
++ if ((eptMap == -1) && !ar->arNodeMap[i].txPending) {
++ eptMap = i;
++ }
++ }
++
++ if (eptMap == -1) {
++ eptMap = ar->arNodeNum;
++ ar->arNodeNum ++;
++ A_ASSERT(ar->arNodeNum <= MAX_NODE_NUM);
++ }
++
++ A_MEMCPY(ar->arNodeMap[eptMap].macAddress, macHdr->dstMac, IEEE80211_ADDR_LEN);
++
++ for (i = ENDPOINT_2; i <= ENDPOINT_5; i ++) {
++ if (!ar->arTxPending[i]) {
++ ar->arNodeMap[eptMap].epId = i;
++ break;
++ }
++ // No free endpoint is available, start redistribution on the inuse endpoints.
++ if (i == ENDPOINT_5) {
++ ar->arNodeMap[eptMap].epId = ar->arNexEpId;
++ ar->arNexEpId ++;
++ if (ar->arNexEpId > ENDPOINT_5) {
++ ar->arNexEpId = ENDPOINT_2;
++ }
++ }
++ }
++
++ (*mapNo) = eptMap + 1;
++ ar->arNodeMap[eptMap].txPending ++;
++
++ return ar->arNodeMap[eptMap].epId;
++}
++
++#ifdef DEBUG
++static void ar6000_dump_skb(struct sk_buff *skb)
++{
++ u_char *ch;
++ for (ch = A_NETBUF_DATA(skb);
++ (A_UINT32)ch < ((A_UINT32)A_NETBUF_DATA(skb) +
++ A_NETBUF_LEN(skb)); ch++)
++ {
++ AR_DEBUG_PRINTF("%2.2x ", *ch);
++ }
++ AR_DEBUG_PRINTF("\n");
++}
++#endif
++
++static int
++ar6000_data_tx(struct sk_buff *skb, struct net_device *dev)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_PRI_STREAM_ID streamID = WMI_NOT_MAPPED;
++ A_UINT32 mapNo = 0;
++ int len;
++ struct ar_cookie *cookie;
++ A_BOOL checkAdHocPsMapping = FALSE;
++
++#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)
++ skb->list = NULL;
++#endif
++
++ AR_DEBUG2_PRINTF("ar6000_data_tx start - skb=0x%x, data=0x%x, len=0x%x\n",
++ (A_UINT32)skb, (A_UINT32)A_NETBUF_DATA(skb),
++ A_NETBUF_LEN(skb));
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++ /* TCMD doesnt support any data, free the buf and return */
++ if(ar->arTargetMode == AR6000_TCMD_MODE) {
++ A_NETBUF_FREE(skb);
++ return 0;
++ }
++#endif
++ do {
++
++ if (ar->arWmiReady == FALSE && bypasswmi == 0) {
++ break;
++ }
++
++#ifdef BLOCK_TX_PATH_FLAG
++ if (blocktx) {
++ break;
++ }
++#endif /* BLOCK_TX_PATH_FLAG */
++
++ if (ar->arWmiEnabled) {
++ if (A_NETBUF_HEADROOM(skb) < dev->hard_header_len) {
++ struct sk_buff *newbuf;
++ /*
++ * We really should have gotten enough headroom but sometimes
++ * we still get packets with not enough headroom. Copy the packet.
++ */
++ len = A_NETBUF_LEN(skb);
++ newbuf = A_NETBUF_ALLOC(len);
++ if (newbuf == NULL) {
++ break;
++ }
++ A_NETBUF_PUT(newbuf, len);
++ A_MEMCPY(A_NETBUF_DATA(newbuf), A_NETBUF_DATA(skb), len);
++ A_NETBUF_FREE(skb);
++ skb = newbuf;
++ /* fall through and assemble header */
++ }
++
++ if (wmi_dix_2_dot3(ar->arWmi, skb) != A_OK) {
++ AR_DEBUG_PRINTF("ar6000_data_tx - wmi_dix_2_dot3 failed\n");
++ break;
++ }
++
++ if (wmi_data_hdr_add(ar->arWmi, skb, DATA_MSGTYPE) != A_OK) {
++ AR_DEBUG_PRINTF("ar6000_data_tx - wmi_data_hdr_add failed\n");
++ break;
++ }
++
++ if ((ar->arNetworkType == ADHOC_NETWORK) &&
++ ar->arIbssPsEnable && ar->arConnected) {
++ /* flag to check adhoc mapping once we take the lock below: */
++ checkAdHocPsMapping = TRUE;
++
++ } else {
++ /* get the stream mapping */
++ if (ar->arWmmEnabled) {
++ streamID = wmi_get_stream_id(ar->arWmi,
++ wmi_implicit_create_pstream(ar->arWmi, skb, UPLINK_TRAFFIC, UNDEFINED_PRI));
++ } else {
++ streamID = WMI_BEST_EFFORT_PRI;
++ }
++ }
++
++ } else {
++ struct iphdr *ipHdr;
++ /*
++ * the endpoint is directly based on the TOS field in the IP
++ * header **** only for testing ******
++ */
++ ipHdr = A_NETBUF_DATA(skb) + sizeof(ATH_MAC_HDR);
++ /* here we map the TOS field to an endpoint number, this is for
++ * the endpointping test application */
++ streamID = IP_TOS_TO_WMI_PRI(ipHdr->tos);
++ }
++
++ } while (FALSE);
++
++ /* did we succeed ? */
++ if ((streamID == WMI_NOT_MAPPED) && !checkAdHocPsMapping) {
++ /* cleanup and exit */
++ A_NETBUF_FREE(skb);
++ AR6000_STAT_INC(ar, tx_dropped);
++ AR6000_STAT_INC(ar, tx_aborted_errors);
++ return 0;
++ }
++
++ cookie = NULL;
++
++ /* take the lock to protect driver data */
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++
++ do {
++
++ if (checkAdHocPsMapping) {
++ streamID = ar6000_ibss_map_epid(skb, dev, &mapNo);
++ }
++
++ A_ASSERT(streamID != WMI_NOT_MAPPED);
++
++ /* validate that the endpoint is connected */
++ if (arWMIStream2EndpointID(ar,streamID) == 0) {
++ AR_DEBUG_PRINTF("Stream %d is NOT mapped!\n",streamID);
++ break;
++ }
++ /* allocate resource for this packet */
++ cookie = ar6000_alloc_cookie(ar);
++
++ if (cookie != NULL) {
++ /* update counts while the lock is held */
++ ar->arTxPending[streamID]++;
++ ar->arTotalTxDataPending++;
++ }
++
++ } while (FALSE);
++
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++
++ if (cookie != NULL) {
++ cookie->arc_bp[0] = (A_UINT32)skb;
++ cookie->arc_bp[1] = mapNo;
++ SET_HTC_PACKET_INFO_TX(&cookie->HtcPkt,
++ cookie,
++ A_NETBUF_DATA(skb),
++ A_NETBUF_LEN(skb),
++ arWMIStream2EndpointID(ar,streamID),
++ AR6K_DATA_PKT_TAG);
++
++#ifdef DEBUG
++ if (debugdriver >= 3) {
++ ar6000_dump_skb(skb);
++ }
++#endif
++ /* HTC interface is asynchronous, if this fails, cleanup will happen in
++ * the ar6000_tx_complete callback */
++ HTCSendPkt(ar->arHtcTarget, &cookie->HtcPkt);
++ } else {
++ /* no packet to send, cleanup */
++ A_NETBUF_FREE(skb);
++ AR6000_STAT_INC(ar, tx_dropped);
++ AR6000_STAT_INC(ar, tx_aborted_errors);
++ }
++
++ return 0;
++}
++
++#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++static void
++tvsub(register struct timeval *out, register struct timeval *in)
++{
++ if((out->tv_usec -= in->tv_usec) < 0) {
++ out->tv_sec--;
++ out->tv_usec += 1000000;
++ }
++ out->tv_sec -= in->tv_sec;
++}
++
++void
++applyAPTCHeuristics(AR_SOFTC_T *ar)
++{
++ A_UINT32 duration;
++ A_UINT32 numbytes;
++ A_UINT32 throughput;
++ struct timeval ts;
++ A_STATUS status;
++
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++
++ if ((enableAPTCHeuristics) && (!aptcTR.timerScheduled)) {
++ do_gettimeofday(&ts);
++ tvsub(&ts, &aptcTR.samplingTS);
++ duration = ts.tv_sec * 1000 + ts.tv_usec / 1000; /* ms */
++ numbytes = aptcTR.bytesTransmitted + aptcTR.bytesReceived;
++
++ if (duration > APTC_TRAFFIC_SAMPLING_INTERVAL) {
++ /* Initialize the time stamp and byte count */
++ aptcTR.bytesTransmitted = aptcTR.bytesReceived = 0;
++ do_gettimeofday(&aptcTR.samplingTS);
++
++ /* Calculate and decide based on throughput thresholds */
++ throughput = ((numbytes * 8) / duration);
++ if (throughput > APTC_UPPER_THROUGHPUT_THRESHOLD) {
++ /* Disable Sleep and schedule a timer */
++ A_ASSERT(ar->arWmiReady == TRUE);
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ status = wmi_powermode_cmd(ar->arWmi, MAX_PERF_POWER);
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ A_TIMEOUT_MS(&aptcTimer, APTC_TRAFFIC_SAMPLING_INTERVAL, 0);
++ aptcTR.timerScheduled = TRUE;
++ }
++ }
++ }
++
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++}
++#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
++
++static void
++ar6000_tx_queue_full(void *Context, HTC_ENDPOINT_ID Endpoint)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *) Context;
++
++ if (Endpoint == arWMIStream2EndpointID(ar,WMI_CONTROL_PRI)) {
++ if (!bypasswmi) {
++ /* under normal WMI if this is getting full, then something is running rampant
++ * the host should not be exhausting the WMI queue with too many commands
++ * the only exception to this is during testing using endpointping */
++
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ /* set flag to handle subsequent messages */
++ ar->arWMIControlEpFull = TRUE;
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ AR_DEBUG_PRINTF("WMI Control Endpoint is FULL!!! \n");
++ }
++ } else {
++ /* one of the data endpoints queues is getting full..need to stop network stack
++ * the queue will resume after credits received */
++ netif_stop_queue(ar->arNetDev);
++ }
++}
++
++static void
++ar6000_tx_queue_avail(void *Context, HTC_ENDPOINT_ID Endpoint)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)Context;
++
++ if (Endpoint == arWMIStream2EndpointID(ar,WMI_CONTROL_PRI)) {
++ /* FIXME: what do for it? */
++ } else {
++ /* Wake up interface, rescheduling prevented. */
++ if (ar->arConnected == TRUE || bypasswmi)
++ netif_wake_queue(ar->arNetDev);
++ }
++}
++
++static void
++ar6000_tx_complete(void *Context, HTC_PACKET *pPacket)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)Context;
++ void *cookie = (void *)pPacket->pPktContext;
++ struct sk_buff *skb = NULL;
++ A_UINT32 mapNo = 0;
++ A_STATUS status;
++ struct ar_cookie * ar_cookie;
++ WMI_PRI_STREAM_ID streamID;
++ A_BOOL wakeEvent = FALSE;
++
++ status = pPacket->Status;
++ ar_cookie = (struct ar_cookie *)cookie;
++ skb = (struct sk_buff *)ar_cookie->arc_bp[0];
++ streamID = arEndpoint2WMIStreamID(ar,pPacket->Endpoint);
++ mapNo = ar_cookie->arc_bp[1];
++
++ A_ASSERT(skb);
++ A_ASSERT(pPacket->pBuffer == A_NETBUF_DATA(skb));
++
++ if (A_SUCCESS(status)) {
++ A_ASSERT(pPacket->ActualLength == A_NETBUF_LEN(skb));
++ }
++
++ AR_DEBUG2_PRINTF("ar6000_tx_complete skb=0x%x data=0x%x len=0x%x sid=%d ",
++ (A_UINT32)skb, (A_UINT32)pPacket->pBuffer,
++ pPacket->ActualLength,
++ streamID);
++
++ /* lock the driver as we update internal state */
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++
++ ar->arTxPending[streamID]--;
++
++ if ((streamID != WMI_CONTROL_PRI) || bypasswmi) {
++ ar->arTotalTxDataPending--;
++ }
++
++ if (streamID == WMI_CONTROL_PRI)
++ {
++ if (ar->arWMIControlEpFull) {
++ /* since this packet completed, the WMI EP is no longer full */
++ ar->arWMIControlEpFull = FALSE;
++ }
++
++ if (ar->arTxPending[streamID] == 0) {
++ wakeEvent = TRUE;
++ }
++ }
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF("%s() -TX ERROR, status: 0x%x\n", __func__,
++ status);
++ AR6000_STAT_INC(ar, tx_errors);
++ } else {
++ AR_DEBUG2_PRINTF("OK\n");
++ AR6000_STAT_INC(ar, tx_packets);
++ ar->arNetStats.tx_bytes += A_NETBUF_LEN(skb);
++#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++ aptcTR.bytesTransmitted += a_netbuf_to_len(skb);
++ applyAPTCHeuristics(ar);
++#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
++ }
++
++ // TODO this needs to be looked at
++ if ((ar->arNetworkType == ADHOC_NETWORK) && ar->arIbssPsEnable
++ && (streamID != WMI_CONTROL_PRI) && mapNo)
++ {
++ mapNo --;
++ ar->arNodeMap[mapNo].txPending --;
++
++ if (!ar->arNodeMap[mapNo].txPending && (mapNo == (ar->arNodeNum - 1))) {
++ A_UINT32 i;
++ for (i = ar->arNodeNum; i > 0; i --) {
++ if (!ar->arNodeMap[i - 1].txPending) {
++ A_MEMZERO(&ar->arNodeMap[i - 1], sizeof(struct ar_node_mapping));
++ ar->arNodeNum --;
++ } else {
++ break;
++ }
++ }
++ }
++ }
++
++ /* Freeing a cookie should not be contingent on either of */
++ /* these flags, just if we have a cookie or not. */
++ /* Can we even get here without a cookie? Fix later. */
++ if (ar->arWmiReady == TRUE || (bypasswmi))
++ {
++ ar6000_free_cookie(ar, cookie);
++ }
++
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++
++ /* lock is released, we can freely call other kernel APIs */
++
++ /* this indirectly frees the HTC_PACKET */
++ A_NETBUF_FREE(skb);
++
++ if (wakeEvent) {
++ wake_up(&arEvent);
++ }
++}
++
++/*
++ * Receive event handler. This is called by HTC when a packet is received
++ */
++int pktcount;
++static void
++ar6000_rx(void *Context, HTC_PACKET *pPacket)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)Context;
++ struct sk_buff *skb = (struct sk_buff *)pPacket->pPktContext;
++ int minHdrLen;
++ A_STATUS status = pPacket->Status;
++ WMI_PRI_STREAM_ID streamID = arEndpoint2WMIStreamID(ar,pPacket->Endpoint);
++ HTC_ENDPOINT_ID ept = pPacket->Endpoint;
++
++ A_ASSERT((status != A_OK) || (pPacket->pBuffer == (A_NETBUF_DATA(skb) + HTC_HEADER_LEN)));
++
++ AR_DEBUG2_PRINTF("ar6000_rx ar=0x%x sid=%d, skb=0x%x, data=0x%x, len=0x%x ",
++ (A_UINT32)ar, streamID, (A_UINT32)skb, (A_UINT32)pPacket->pBuffer,
++ pPacket->ActualLength);
++ if (status != A_OK) {
++ AR_DEBUG2_PRINTF("ERR\n");
++ } else {
++ AR_DEBUG2_PRINTF("OK\n");
++ }
++
++ /* take lock to protect buffer counts
++ * and adaptive power throughput state */
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++
++ ar->arRxBuffers[streamID]--;
++
++ if (A_SUCCESS(status)) {
++ AR6000_STAT_INC(ar, rx_packets);
++ ar->arNetStats.rx_bytes += pPacket->ActualLength;
++#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++ aptcTR.bytesReceived += a_netbuf_to_len(skb);
++ applyAPTCHeuristics(ar);
++#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
++
++ A_NETBUF_PUT(skb, pPacket->ActualLength + HTC_HEADER_LEN);
++ A_NETBUF_PULL(skb, HTC_HEADER_LEN);
++
++#ifdef DEBUG
++ if (debugdriver >= 2) {
++ ar6000_dump_skb(skb);
++ }
++#endif /* DEBUG */
++ }
++
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++
++ if (status != A_OK) {
++ AR6000_STAT_INC(ar, rx_errors);
++ A_NETBUF_FREE(skb);
++ } else if (ar->arWmiEnabled == TRUE) {
++ if (streamID == WMI_CONTROL_PRI) {
++ /*
++ * this is a wmi control msg
++ */
++ wmi_control_rx(ar->arWmi, skb);
++ } else {
++ WMI_DATA_HDR *dhdr = (WMI_DATA_HDR *)A_NETBUF_DATA(skb);
++ if (WMI_DATA_HDR_IS_MSG_TYPE(dhdr, CNTL_MSGTYPE)) {
++ /*
++ * this is a wmi control msg
++ */
++ /* strip off WMI hdr */
++ wmi_data_hdr_remove(ar->arWmi, skb);
++ wmi_control_rx(ar->arWmi, skb);
++ } else {
++ /*
++ * this is a wmi data packet
++ */
++ minHdrLen = sizeof (WMI_DATA_HDR) + sizeof(ATH_MAC_HDR) +
++ sizeof(ATH_LLC_SNAP_HDR);
++
++ if ((pPacket->ActualLength < minHdrLen) ||
++ (pPacket->ActualLength > AR6000_BUFFER_SIZE))
++ {
++ /*
++ * packet is too short or too long
++ */
++ AR_DEBUG_PRINTF("TOO SHORT or TOO LONG\n");
++ AR6000_STAT_INC(ar, rx_errors);
++ AR6000_STAT_INC(ar, rx_length_errors);
++ A_NETBUF_FREE(skb);
++ } else {
++ if (ar->arWmmEnabled) {
++ wmi_implicit_create_pstream(ar->arWmi, skb,
++ DNLINK_TRAFFIC, UNDEFINED_PRI);
++ }
++#if 0
++ /* Access RSSI values here */
++ AR_DEBUG_PRINTF("RSSI %d\n",
++ ((WMI_DATA_HDR *) A_NETBUF_DATA(skb))->rssi);
++#endif
++ wmi_data_hdr_remove(ar->arWmi, skb);
++ wmi_dot3_2_dix(ar->arWmi, skb);
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
++ /*
++ * extra push and memcpy, for eth_type_trans() of 2.4 kernel
++ * will pull out hard_header_len bytes of the skb.
++ */
++ A_NETBUF_PUSH(skb, sizeof(WMI_DATA_HDR) + sizeof(ATH_LLC_SNAP_HDR) + HTC_HEADER_LEN);
++ A_MEMCPY(A_NETBUF_DATA(skb), A_NETBUF_DATA(skb) + sizeof(WMI_DATA_HDR) +
++ sizeof(ATH_LLC_SNAP_HDR) + HTC_HEADER_LEN, sizeof(ATH_MAC_HDR));
++#endif
++ if ((ar->arNetDev->flags & IFF_UP) == IFF_UP)
++ {
++ skb->dev = ar->arNetDev;
++ skb->protocol = eth_type_trans(skb, ar->arNetDev);
++ netif_rx(skb);
++ }
++ else
++ {
++ A_NETBUF_FREE(skb);
++ }
++ }
++ }
++ }
++ } else {
++ if ((ar->arNetDev->flags & IFF_UP) == IFF_UP)
++ {
++ skb->dev = ar->arNetDev;
++ skb->protocol = eth_type_trans(skb, ar->arNetDev);
++ netif_rx(skb);
++ }
++ else
++ {
++ A_NETBUF_FREE(skb);
++ }
++ }
++
++ if (status != A_ECANCELED) {
++ /*
++ * HTC provides A_ECANCELED status when it doesn't want to be refilled
++ * (probably due to a shutdown)
++ */
++ ar6000_rx_refill(Context, ept);
++ }
++
++
++}
++
++static void
++ar6000_rx_refill(void *Context, HTC_ENDPOINT_ID Endpoint)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)Context;
++ void *osBuf;
++ int RxBuffers;
++ int buffersToRefill;
++ HTC_PACKET *pPacket;
++ WMI_PRI_STREAM_ID streamId = arEndpoint2WMIStreamID(ar,Endpoint);
++
++ buffersToRefill = (int)AR6000_MAX_RX_BUFFERS -
++ (int)ar->arRxBuffers[streamId];
++
++ if (buffersToRefill <= 0) {
++ /* fast return, nothing to fill */
++ return;
++ }
++
++ AR_DEBUG2_PRINTF("ar6000_rx_refill: providing htc with %d buffers at eid=%d\n",
++ buffersToRefill, Endpoint);
++
++ for (RxBuffers = 0; RxBuffers < buffersToRefill; RxBuffers++) {
++ osBuf = A_NETBUF_ALLOC(AR6000_BUFFER_SIZE);
++ if (NULL == osBuf) {
++ break;
++ }
++ /* the HTC packet wrapper is at the head of the reserved area
++ * in the skb */
++ pPacket = (HTC_PACKET *)(A_NETBUF_HEAD(osBuf));
++ /* set re-fill info */
++ SET_HTC_PACKET_INFO_RX_REFILL(pPacket,osBuf,A_NETBUF_DATA(osBuf),AR6000_BUFFER_SIZE,Endpoint);
++ /* add this packet */
++ HTCAddReceivePkt(ar->arHtcTarget, pPacket);
++ }
++
++ /* update count */
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ ar->arRxBuffers[streamId] += RxBuffers;
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++}
++
++static struct net_device_stats *
++ar6000_get_stats(struct net_device *dev)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ return &ar->arNetStats;
++}
++
++static struct iw_statistics *
++ar6000_get_iwstats(struct net_device * dev)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ TARGET_STATS *pStats = &ar->arTargetStats;
++ struct iw_statistics * pIwStats = &ar->arIwStats;
++
++ if ((ar->arWmiReady == FALSE)
++ /*
++ * The in_atomic function is used to determine if the scheduling is
++ * allowed in the current context or not. This was introduced in 2.6
++ * From what I have read on the differences between 2.4 and 2.6, the
++ * 2.4 kernel did not support preemption and so this check might not
++ * be required for 2.4 kernels.
++ */
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
++ || (in_atomic())
++#endif
++ )
++ {
++ pIwStats->status = 0;
++ pIwStats->qual.qual = 0;
++ pIwStats->qual.level =0;
++ pIwStats->qual.noise = 0;
++ pIwStats->discard.code =0;
++ pIwStats->discard.retries=0;
++ pIwStats->miss.beacon =0;
++ return pIwStats;
++ }
++ if (down_interruptible(&ar->arSem)) {
++ pIwStats->status = 0;
++ return pIwStats;
++ }
++
++
++ ar->statsUpdatePending = TRUE;
++
++ if(wmi_get_stats_cmd(ar->arWmi) != A_OK) {
++ up(&ar->arSem);
++ pIwStats->status = 0;
++ return pIwStats;
++ }
++
++ wait_event_interruptible_timeout(arEvent, ar->statsUpdatePending == FALSE, wmitimeout * HZ);
++
++ if (signal_pending(current)) {
++ AR_DEBUG_PRINTF("ar6000 : WMI get stats timeout \n");
++ up(&ar->arSem);
++ pIwStats->status = 0;
++ return pIwStats;
++ }
++ pIwStats->status = 1 ;
++ pIwStats->qual.qual = pStats->cs_aveBeacon_rssi;
++ pIwStats->qual.level =pStats->cs_aveBeacon_rssi + 161; /* noise is -95 dBm */
++ pIwStats->qual.noise = pStats->noise_floor_calibation;
++ pIwStats->discard.code = pStats->rx_decrypt_err;
++ pIwStats->discard.retries = pStats->tx_retry_cnt;
++ pIwStats->miss.beacon = pStats->cs_bmiss_cnt;
++ up(&ar->arSem);
++ return pIwStats;
++}
++
++void
++ar6000_ready_event(void *devt, A_UINT8 *datap, A_UINT8 phyCap)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
++ struct net_device *dev = ar->arNetDev;
++
++ ar->arWmiReady = TRUE;
++ wake_up(&arEvent);
++ A_MEMCPY(dev->dev_addr, datap, AR6000_ETH_ADDR_LEN);
++ AR_DEBUG_PRINTF("mac address = %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n",
++ dev->dev_addr[0], dev->dev_addr[1],
++ dev->dev_addr[2], dev->dev_addr[3],
++ dev->dev_addr[4], dev->dev_addr[5]);
++
++ ar->arPhyCapability = phyCap;
++}
++
++A_UINT8
++ar6000_iptos_to_userPriority(A_UINT8 *pkt)
++{
++ struct iphdr *ipHdr = (struct iphdr *)pkt;
++ A_UINT8 userPriority;
++
++ /*
++ * IP Tos format :
++ * (Refer Pg 57 WMM-test-plan-v1.2)
++ * IP-TOS - 8bits
++ * : DSCP(6-bits) ECN(2-bits)
++ * : DSCP - P2 P1 P0 X X X
++ * where (P2 P1 P0) form 802.1D
++ */
++ userPriority = ipHdr->tos >> 5;
++ return (userPriority & 0x7);
++}
++
++void
++ar6000_connect_event(AR_SOFTC_T *ar, A_UINT16 channel, A_UINT8 *bssid,
++ A_UINT16 listenInterval, A_UINT16 beaconInterval,
++ NETWORK_TYPE networkType, A_UINT8 beaconIeLen,
++ A_UINT8 assocReqLen, A_UINT8 assocRespLen,
++ A_UINT8 *assocInfo)
++{
++ union iwreq_data wrqu;
++ int i, beacon_ie_pos, assoc_resp_ie_pos, assoc_req_ie_pos;
++ static const char *tag1 = "ASSOCINFO(ReqIEs=";
++ static const char *tag2 = "ASSOCRESPIE=";
++ static const char *beaconIetag = "BEACONIE=";
++ char buf[WMI_CONTROL_MSG_MAX_LEN * 2 + sizeof(tag1)];
++ char *pos;
++ A_UINT8 key_op_ctrl;
++
++ A_MEMCPY(ar->arBssid, bssid, sizeof(ar->arBssid));
++ ar->arBssChannel = channel;
++
++ A_PRINTF("AR6000 connected event on freq %d ", channel);
++ A_PRINTF("with bssid %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x "
++ " listenInterval=%d, beaconInterval = %d, beaconIeLen = %d assocReqLen=%d"
++ " assocRespLen =%d\n",
++ bssid[0], bssid[1], bssid[2],
++ bssid[3], bssid[4], bssid[5],
++ listenInterval, beaconInterval,
++ beaconIeLen, assocReqLen, assocRespLen);
++ if (networkType & ADHOC_NETWORK) {
++ if (networkType & ADHOC_CREATOR) {
++ A_PRINTF("Network: Adhoc (Creator)\n");
++ } else {
++ A_PRINTF("Network: Adhoc (Joiner)\n");
++ }
++ } else {
++ A_PRINTF("Network: Infrastructure\n");
++ }
++
++ if (beaconIeLen && (sizeof(buf) > (9 + beaconIeLen * 2))) {
++ AR_DEBUG_PRINTF("\nBeaconIEs= ");
++
++ beacon_ie_pos = 0;
++ A_MEMZERO(buf, sizeof(buf));
++ sprintf(buf, "%s", beaconIetag);
++ pos = buf + 9;
++ for (i = beacon_ie_pos; i < beacon_ie_pos + beaconIeLen; i++) {
++ AR_DEBUG_PRINTF("%2.2x ", assocInfo[i]);
++ sprintf(pos, "%2.2x", assocInfo[i]);
++ pos += 2;
++ }
++ AR_DEBUG_PRINTF("\n");
++
++ A_MEMZERO(&wrqu, sizeof(wrqu));
++ wrqu.data.length = strlen(buf);
++ wireless_send_event(ar->arNetDev, IWEVCUSTOM, &wrqu, buf);
++ }
++
++ if (assocRespLen && (sizeof(buf) > (12 + (assocRespLen * 2))))
++ {
++ assoc_resp_ie_pos = beaconIeLen + assocReqLen +
++ sizeof(A_UINT16) + /* capinfo*/
++ sizeof(A_UINT16) + /* status Code */
++ sizeof(A_UINT16) ; /* associd */
++ A_MEMZERO(buf, sizeof(buf));
++ sprintf(buf, "%s", tag2);
++ pos = buf + 12;
++ AR_DEBUG_PRINTF("\nAssocRespIEs= ");
++ /*
++ * The Association Response Frame w.o. the WLAN header is delivered to
++ * the host, so skip over to the IEs
++ */
++ for (i = assoc_resp_ie_pos; i < assoc_resp_ie_pos + assocRespLen - 6; i++)
++ {
++ AR_DEBUG_PRINTF("%2.2x ", assocInfo[i]);
++ sprintf(pos, "%2.2x", assocInfo[i]);
++ pos += 2;
++ }
++ AR_DEBUG_PRINTF("\n");
++
++ A_MEMZERO(&wrqu, sizeof(wrqu));
++ wrqu.data.length = strlen(buf);
++ wireless_send_event(ar->arNetDev, IWEVCUSTOM, &wrqu, buf);
++ }
++
++ if (assocReqLen && (sizeof(buf) > (17 + (assocReqLen * 2)))) {
++ /*
++ * assoc Request includes capability and listen interval. Skip these.
++ */
++ assoc_req_ie_pos = beaconIeLen +
++ sizeof(A_UINT16) + /* capinfo*/
++ sizeof(A_UINT16); /* listen interval */
++
++ A_MEMZERO(buf, sizeof(buf));
++ sprintf(buf, "%s", tag1);
++ pos = buf + 17;
++ AR_DEBUG_PRINTF("AssocReqIEs= ");
++ for (i = assoc_req_ie_pos; i < assoc_req_ie_pos + assocReqLen - 4; i++) {
++ AR_DEBUG_PRINTF("%2.2x ", assocInfo[i]);
++ sprintf(pos, "%2.2x", assocInfo[i]);
++ pos += 2;;
++ }
++ AR_DEBUG_PRINTF("\n");
++
++ A_MEMZERO(&wrqu, sizeof(wrqu));
++ wrqu.data.length = strlen(buf);
++ wireless_send_event(ar->arNetDev, IWEVCUSTOM, &wrqu, buf);
++ }
++
++#ifdef USER_KEYS
++ if (ar->user_savedkeys_stat == USER_SAVEDKEYS_STAT_RUN &&
++ ar->user_saved_keys.keyOk == TRUE)
++ {
++
++ key_op_ctrl = KEY_OP_VALID_MASK & ~KEY_OP_INIT_TSC;
++ if (ar->user_key_ctrl & AR6000_USER_SETKEYS_RSC_UNCHANGED) {
++ key_op_ctrl &= ~KEY_OP_INIT_RSC;
++ } else {
++ key_op_ctrl |= KEY_OP_INIT_RSC;
++ }
++ ar6000_reinstall_keys(ar, key_op_ctrl);
++ }
++#endif /* USER_KEYS */
++
++ /* flush data queues */
++ ar6000_TxDataCleanup(ar);
++
++ netif_start_queue(ar->arNetDev);
++
++ if ((OPEN_AUTH == ar->arDot11AuthMode) &&
++ (NONE_AUTH == ar->arAuthMode) &&
++ (WEP_CRYPT == ar->arPairwiseCrypto))
++ {
++ if (!ar->arConnected) {
++ ar6000_install_static_wep_keys(ar);
++ }
++ }
++
++ ar->arConnected = TRUE;
++ ar->arConnectPending = FALSE;
++
++ reconnect_flag = 0;
++
++ A_MEMZERO(&wrqu, sizeof(wrqu));
++ A_MEMCPY(wrqu.addr.sa_data, bssid, IEEE80211_ADDR_LEN);
++ wrqu.addr.sa_family = ARPHRD_ETHER;
++ wireless_send_event(ar->arNetDev, SIOCGIWAP, &wrqu, NULL);
++ if ((ar->arNetworkType == ADHOC_NETWORK) && ar->arIbssPsEnable) {
++ A_MEMZERO(ar->arNodeMap, sizeof(ar->arNodeMap));
++ ar->arNodeNum = 0;
++ ar->arNexEpId = ENDPOINT_2;
++ }
++
++}
++
++void ar6000_set_numdataendpts(AR_SOFTC_T *ar, A_UINT32 num)
++{
++ A_ASSERT(num <= (HTC_MAILBOX_NUM_MAX - 1));
++ ar->arNumDataEndPts = num;
++}
++
++void
++ar6000_disconnect_event(AR_SOFTC_T *ar, A_UINT8 reason, A_UINT8 *bssid,
++ A_UINT8 assocRespLen, A_UINT8 *assocInfo, A_UINT16 protocolReasonStatus)
++{
++ A_UINT8 i;
++
++ A_PRINTF("AR6000 disconnected");
++ if (bssid[0] || bssid[1] || bssid[2] || bssid[3] || bssid[4] || bssid[5]) {
++ A_PRINTF(" from %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x ",
++ bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5]);
++ }
++ A_PRINTF("\n");
++
++ AR_DEBUG_PRINTF("\nDisconnect Reason is %d", reason);
++ AR_DEBUG_PRINTF("\nProtocol Reason/Status Code is %d", protocolReasonStatus);
++ AR_DEBUG_PRINTF("\nAssocResp Frame = %s",
++ assocRespLen ? " " : "NULL");
++ for (i = 0; i < assocRespLen; i++) {
++ if (!(i % 0x10)) {
++ AR_DEBUG_PRINTF("\n");
++ }
++ AR_DEBUG_PRINTF("%2.2x ", assocInfo[i]);
++ }
++ AR_DEBUG_PRINTF("\n");
++ /*
++ * If the event is due to disconnect cmd from the host, only they the target
++ * would stop trying to connect. Under any other condition, target would
++ * keep trying to connect.
++ *
++ */
++ if( reason == DISCONNECT_CMD)
++ {
++ ar->arConnectPending = FALSE;
++ } else {
++ ar->arConnectPending = TRUE;
++ if (((reason == ASSOC_FAILED) && (protocolReasonStatus == 0x11)) ||
++ ((reason == ASSOC_FAILED) && (protocolReasonStatus == 0x0) && (reconnect_flag == 1))) {
++ ar->arConnected = TRUE;
++ return;
++ }
++ }
++ ar->arConnected = FALSE;
++
++ if( (reason != CSERV_DISCONNECT) || (reconnect_flag != 1) ) {
++ reconnect_flag = 0;
++ }
++
++#ifdef USER_KEYS
++ if (reason != CSERV_DISCONNECT)
++ {
++ ar->user_savedkeys_stat = USER_SAVEDKEYS_STAT_INIT;
++ ar->user_key_ctrl = 0;
++ }
++#endif /* USER_KEYS */
++
++ netif_stop_queue(ar->arNetDev);
++ A_MEMZERO(ar->arBssid, sizeof(ar->arBssid));
++ ar->arBssChannel = 0;
++ ar->arBeaconInterval = 0;
++
++ ar6000_TxDataCleanup(ar);
++}
++
++void
++ar6000_regDomain_event(AR_SOFTC_T *ar, A_UINT32 regCode)
++{
++ A_PRINTF("AR6000 Reg Code = 0x%x\n", regCode);
++ ar->arRegCode = regCode;
++}
++
++void
++ar6000_neighborReport_event(AR_SOFTC_T *ar, int numAps, WMI_NEIGHBOR_INFO *info)
++{
++ static const char *tag = "PRE-AUTH";
++ char buf[128];
++ union iwreq_data wrqu;
++ int i;
++
++ AR_DEBUG_PRINTF("AR6000 Neighbor Report Event\n");
++ for (i=0; i < numAps; info++, i++) {
++ AR_DEBUG_PRINTF("bssid %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x ",
++ info->bssid[0], info->bssid[1], info->bssid[2],
++ info->bssid[3], info->bssid[4], info->bssid[5]);
++ if (info->bssFlags & WMI_PREAUTH_CAPABLE_BSS) {
++ AR_DEBUG_PRINTF("preauth-cap");
++ }
++ if (info->bssFlags & WMI_PMKID_VALID_BSS) {
++ AR_DEBUG_PRINTF(" pmkid-valid\n");
++ continue; /* we skip bss if the pmkid is already valid */
++ }
++ AR_DEBUG_PRINTF("\n");
++ snprintf(buf, sizeof(buf), "%s%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x",
++ tag,
++ info->bssid[0], info->bssid[1], info->bssid[2],
++ info->bssid[3], info->bssid[4], info->bssid[5],
++ i, info->bssFlags);
++ A_MEMZERO(&wrqu, sizeof(wrqu));
++ wrqu.data.length = strlen(buf);
++ wireless_send_event(ar->arNetDev, IWEVCUSTOM, &wrqu, buf);
++ }
++}
++
++void
++ar6000_tkip_micerr_event(AR_SOFTC_T *ar, A_UINT8 keyid, A_BOOL ismcast)
++{
++ static const char *tag = "MLME-MICHAELMICFAILURE.indication";
++ char buf[128];
++ union iwreq_data wrqu;
++
++ A_PRINTF("AR6000 TKIP MIC error received for keyid %d %scast\n",
++ keyid, ismcast ? "multi": "uni");
++ snprintf(buf, sizeof(buf), "%s(keyid=%d %scat)", tag, keyid,
++ ismcast ? "multi" : "uni");
++ memset(&wrqu, 0, sizeof(wrqu));
++ wrqu.data.length = strlen(buf);
++ wireless_send_event(ar->arNetDev, IWEVCUSTOM, &wrqu, buf);
++}
++
++void
++ar6000_scanComplete_event(AR_SOFTC_T *ar, A_STATUS status)
++{
++ AR_DEBUG_PRINTF("AR6000 scan complete: %d\n", status);
++
++ ar->scan_complete = 1;
++ wake_up_interruptible(&ar6000_scan_queue);
++}
++
++void
++ar6000_targetStats_event(AR_SOFTC_T *ar, WMI_TARGET_STATS *pTarget)
++{
++ TARGET_STATS *pStats = &ar->arTargetStats;
++ A_UINT8 ac;
++
++ /*A_PRINTF("AR6000 updating target stats\n");*/
++ pStats->tx_packets += pTarget->txrxStats.tx_stats.tx_packets;
++ pStats->tx_bytes += pTarget->txrxStats.tx_stats.tx_bytes;
++ pStats->tx_unicast_pkts += pTarget->txrxStats.tx_stats.tx_unicast_pkts;
++ pStats->tx_unicast_bytes += pTarget->txrxStats.tx_stats.tx_unicast_bytes;
++ pStats->tx_multicast_pkts += pTarget->txrxStats.tx_stats.tx_multicast_pkts;
++ pStats->tx_multicast_bytes += pTarget->txrxStats.tx_stats.tx_multicast_bytes;
++ pStats->tx_broadcast_pkts += pTarget->txrxStats.tx_stats.tx_broadcast_pkts;
++ pStats->tx_broadcast_bytes += pTarget->txrxStats.tx_stats.tx_broadcast_bytes;
++ pStats->tx_rts_success_cnt += pTarget->txrxStats.tx_stats.tx_rts_success_cnt;
++ for(ac = 0; ac < WMM_NUM_AC; ac++)
++ pStats->tx_packet_per_ac[ac] += pTarget->txrxStats.tx_stats.tx_packet_per_ac[ac];
++ pStats->tx_errors += pTarget->txrxStats.tx_stats.tx_errors;
++ pStats->tx_failed_cnt += pTarget->txrxStats.tx_stats.tx_failed_cnt;
++ pStats->tx_retry_cnt += pTarget->txrxStats.tx_stats.tx_retry_cnt;
++ pStats->tx_rts_fail_cnt += pTarget->txrxStats.tx_stats.tx_rts_fail_cnt;
++ pStats->tx_unicast_rate = wmi_get_rate(pTarget->txrxStats.tx_stats.tx_unicast_rate);
++
++ pStats->rx_packets += pTarget->txrxStats.rx_stats.rx_packets;
++ pStats->rx_bytes += pTarget->txrxStats.rx_stats.rx_bytes;
++ pStats->rx_unicast_pkts += pTarget->txrxStats.rx_stats.rx_unicast_pkts;
++ pStats->rx_unicast_bytes += pTarget->txrxStats.rx_stats.rx_unicast_bytes;
++ pStats->rx_multicast_pkts += pTarget->txrxStats.rx_stats.rx_multicast_pkts;
++ pStats->rx_multicast_bytes += pTarget->txrxStats.rx_stats.rx_multicast_bytes;
++ pStats->rx_broadcast_pkts += pTarget->txrxStats.rx_stats.rx_broadcast_pkts;
++ pStats->rx_broadcast_bytes += pTarget->txrxStats.rx_stats.rx_broadcast_bytes;
++ pStats->rx_fragment_pkt += pTarget->txrxStats.rx_stats.rx_fragment_pkt;
++ pStats->rx_errors += pTarget->txrxStats.rx_stats.rx_errors;
++ pStats->rx_crcerr += pTarget->txrxStats.rx_stats.rx_crcerr;
++ pStats->rx_key_cache_miss += pTarget->txrxStats.rx_stats.rx_key_cache_miss;
++ pStats->rx_decrypt_err += pTarget->txrxStats.rx_stats.rx_decrypt_err;
++ pStats->rx_duplicate_frames += pTarget->txrxStats.rx_stats.rx_duplicate_frames;
++ pStats->rx_unicast_rate = wmi_get_rate(pTarget->txrxStats.rx_stats.rx_unicast_rate);
++
++
++ pStats->tkip_local_mic_failure
++ += pTarget->txrxStats.tkipCcmpStats.tkip_local_mic_failure;
++ pStats->tkip_counter_measures_invoked
++ += pTarget->txrxStats.tkipCcmpStats.tkip_counter_measures_invoked;
++ pStats->tkip_replays += pTarget->txrxStats.tkipCcmpStats.tkip_replays;
++ pStats->tkip_format_errors += pTarget->txrxStats.tkipCcmpStats.tkip_format_errors;
++ pStats->ccmp_format_errors += pTarget->txrxStats.tkipCcmpStats.ccmp_format_errors;
++ pStats->ccmp_replays += pTarget->txrxStats.tkipCcmpStats.ccmp_replays;
++
++
++ pStats->power_save_failure_cnt += pTarget->pmStats.power_save_failure_cnt;
++ pStats->noise_floor_calibation = pTarget->noise_floor_calibation;
++
++ pStats->cs_bmiss_cnt += pTarget->cservStats.cs_bmiss_cnt;
++ pStats->cs_lowRssi_cnt += pTarget->cservStats.cs_lowRssi_cnt;
++ pStats->cs_connect_cnt += pTarget->cservStats.cs_connect_cnt;
++ pStats->cs_disconnect_cnt += pTarget->cservStats.cs_disconnect_cnt;
++ pStats->cs_aveBeacon_snr = pTarget->cservStats.cs_aveBeacon_snr;
++ pStats->cs_aveBeacon_rssi = pTarget->cservStats.cs_aveBeacon_rssi;
++ pStats->cs_lastRoam_msec = pTarget->cservStats.cs_lastRoam_msec;
++ pStats->cs_snr = pTarget->cservStats.cs_snr;
++ pStats->cs_rssi = pTarget->cservStats.cs_rssi;
++
++ pStats->lq_val = pTarget->lqVal;
++
++ pStats->wow_num_pkts_dropped += pTarget->wowStats.wow_num_pkts_dropped;
++ pStats->wow_num_host_pkt_wakeups += pTarget->wowStats.wow_num_host_pkt_wakeups;
++ pStats->wow_num_host_event_wakeups += pTarget->wowStats.wow_num_host_event_wakeups;
++ pStats->wow_num_events_discarded += pTarget->wowStats.wow_num_events_discarded;
++
++ ar->statsUpdatePending = FALSE;
++ wake_up(&arEvent);
++}
++
++void
++ar6000_rssiThreshold_event(AR_SOFTC_T *ar, WMI_RSSI_THRESHOLD_VAL newThreshold, A_INT16 rssi)
++{
++ USER_RSSI_THOLD userRssiThold;
++
++ userRssiThold.tag = rssi_map[newThreshold].tag;
++ userRssiThold.rssi = rssi;
++ AR_DEBUG2_PRINTF("rssi Threshold range = %d tag = %d rssi = %d\n", newThreshold, userRssiThold.tag, rssi);
++#ifdef SEND_EVENT_TO_APP
++ ar6000_send_event_to_app(ar, WMI_RSSI_THRESHOLD_EVENTID,(A_UINT8 *)&userRssiThold, sizeof(USER_RSSI_THOLD));
++#endif
++}
++
++
++void
++ar6000_hbChallengeResp_event(AR_SOFTC_T *ar, A_UINT32 cookie, A_UINT32 source)
++{
++ if (source == APP_HB_CHALLENGE) {
++ /* Report it to the app in case it wants a positive acknowledgement */
++#ifdef SEND_EVENT_TO_APP
++ ar6000_send_event_to_app(ar, WMIX_HB_CHALLENGE_RESP_EVENTID,
++ (A_UINT8 *)&cookie, sizeof(cookie));
++#endif
++ } else {
++ /* This would ignore the replys that come in after their due time */
++ if (cookie == ar->arHBChallengeResp.seqNum) {
++ ar->arHBChallengeResp.outstanding = FALSE;
++ }
++ }
++}
++
++
++void
++ar6000_reportError_event(AR_SOFTC_T *ar, WMI_TARGET_ERROR_VAL errorVal)
++{
++ char *errString[] = {
++ [WMI_TARGET_PM_ERR_FAIL] "WMI_TARGET_PM_ERR_FAIL",
++ [WMI_TARGET_KEY_NOT_FOUND] "WMI_TARGET_KEY_NOT_FOUND",
++ [WMI_TARGET_DECRYPTION_ERR] "WMI_TARGET_DECRYPTION_ERR",
++ [WMI_TARGET_BMISS] "WMI_TARGET_BMISS",
++ [WMI_PSDISABLE_NODE_JOIN] "WMI_PSDISABLE_NODE_JOIN"
++ };
++
++ A_PRINTF("AR6000 Error on Target. Error = 0x%x\n", errorVal);
++
++ /* One error is reported at a time, and errorval is a bitmask */
++ if(errorVal & (errorVal - 1))
++ return;
++
++ A_PRINTF("AR6000 Error type = ");
++ switch(errorVal)
++ {
++ case WMI_TARGET_PM_ERR_FAIL:
++ case WMI_TARGET_KEY_NOT_FOUND:
++ case WMI_TARGET_DECRYPTION_ERR:
++ case WMI_TARGET_BMISS:
++ case WMI_PSDISABLE_NODE_JOIN:
++ A_PRINTF("%s\n", errString[errorVal]);
++ break;
++ default:
++ A_PRINTF("INVALID\n");
++ break;
++ }
++
++}
++
++
++void
++ar6000_cac_event(AR_SOFTC_T *ar, A_UINT8 ac, A_UINT8 cacIndication,
++ A_UINT8 statusCode, A_UINT8 *tspecSuggestion)
++{
++ WMM_TSPEC_IE *tspecIe;
++
++ /*
++ * This is the TSPEC IE suggestion from AP.
++ * Suggestion provided by AP under some error
++ * cases, could be helpful for the host app.
++ * Check documentation.
++ */
++ tspecIe = (WMM_TSPEC_IE *)tspecSuggestion;
++
++ /*
++ * What do we do, if we get TSPEC rejection? One thought
++ * that comes to mind is implictly delete the pstream...
++ */
++ A_PRINTF("AR6000 CAC notification. "
++ "AC = %d, cacIndication = 0x%x, statusCode = 0x%x\n",
++ ac, cacIndication, statusCode);
++}
++
++#define AR6000_PRINT_BSSID(_pBss) do { \
++ A_PRINTF("%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x ",\
++ (_pBss)[0],(_pBss)[1],(_pBss)[2],(_pBss)[3],\
++ (_pBss)[4],(_pBss)[5]); \
++} while(0)
++
++void
++ar6000_roam_tbl_event(AR_SOFTC_T *ar, WMI_TARGET_ROAM_TBL *pTbl)
++{
++ A_UINT8 i;
++
++ A_PRINTF("ROAM TABLE NO OF ENTRIES is %d ROAM MODE is %d\n",
++ pTbl->numEntries, pTbl->roamMode);
++ for (i= 0; i < pTbl->numEntries; i++) {
++ A_PRINTF("[%d]bssid %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x ", i,
++ pTbl->bssRoamInfo[i].bssid[0], pTbl->bssRoamInfo[i].bssid[1],
++ pTbl->bssRoamInfo[i].bssid[2],
++ pTbl->bssRoamInfo[i].bssid[3],
++ pTbl->bssRoamInfo[i].bssid[4],
++ pTbl->bssRoamInfo[i].bssid[5]);
++ A_PRINTF("RSSI %d RSSIDT %d LAST RSSI %d UTIL %d ROAM_UTIL %d"
++ " BIAS %d\n",
++ pTbl->bssRoamInfo[i].rssi,
++ pTbl->bssRoamInfo[i].rssidt,
++ pTbl->bssRoamInfo[i].last_rssi,
++ pTbl->bssRoamInfo[i].util,
++ pTbl->bssRoamInfo[i].roam_util,
++ pTbl->bssRoamInfo[i].bias);
++ }
++}
++
++void
++ar6000_wow_list_event(struct ar6_softc *ar, A_UINT8 num_filters, WMI_GET_WOW_LIST_REPLY *wow_reply)
++{
++ A_UINT8 i,j;
++
++ /*Each event now contains exactly one filter, see bug 26613*/
++ A_PRINTF("WOW pattern %d of %d patterns\n", wow_reply->this_filter_num, wow_reply->num_filters);
++ A_PRINTF("wow mode = %s host mode = %s\n",
++ (wow_reply->wow_mode == 0? "disabled":"enabled"),
++ (wow_reply->host_mode == 1 ? "awake":"asleep"));
++
++
++ /*If there are no patterns, the reply will only contain generic
++ WoW information. Pattern information will exist only if there are
++ patterns present. Bug 26716*/
++
++ /* If this event contains pattern information, display it*/
++ if (wow_reply->this_filter_num) {
++ i=0;
++ A_PRINTF("id=%d size=%d offset=%d\n",
++ wow_reply->wow_filters[i].wow_filter_id,
++ wow_reply->wow_filters[i].wow_filter_size,
++ wow_reply->wow_filters[i].wow_filter_offset);
++ A_PRINTF("wow pattern = ");
++ for (j=0; j< wow_reply->wow_filters[i].wow_filter_size; j++) {
++ A_PRINTF("%2.2x",wow_reply->wow_filters[i].wow_filter_pattern[j]);
++ }
++
++ A_PRINTF("\nwow mask = ");
++ for (j=0; j< wow_reply->wow_filters[i].wow_filter_size; j++) {
++ A_PRINTF("%2.2x",wow_reply->wow_filters[i].wow_filter_mask[j]);
++ }
++ A_PRINTF("\n");
++ }
++}
++
++/*
++ * Report the Roaming related data collected on the target
++ */
++void
++ar6000_display_roam_time(WMI_TARGET_ROAM_TIME *p)
++{
++ A_PRINTF("Disconnect Data : BSSID: ");
++ AR6000_PRINT_BSSID(p->disassoc_bssid);
++ A_PRINTF(" RSSI %d DISASSOC Time %d NO_TXRX_TIME %d\n",
++ p->disassoc_bss_rssi,p->disassoc_time,
++ p->no_txrx_time);
++ A_PRINTF("Connect Data: BSSID: ");
++ AR6000_PRINT_BSSID(p->assoc_bssid);
++ A_PRINTF(" RSSI %d ASSOC Time %d TXRX_TIME %d\n",
++ p->assoc_bss_rssi,p->assoc_time,
++ p->allow_txrx_time);
++ A_PRINTF("Last Data Tx Time (b4 Disassoc) %d "\
++ "First Data Tx Time (after Assoc) %d\n",
++ p->last_data_txrx_time, p->first_data_txrx_time);
++}
++
++void
++ar6000_roam_data_event(AR_SOFTC_T *ar, WMI_TARGET_ROAM_DATA *p)
++{
++ switch (p->roamDataType) {
++ case ROAM_DATA_TIME:
++ ar6000_display_roam_time(&p->u.roamTime);
++ break;
++ default:
++ break;
++ }
++}
++
++void
++ar6000_bssInfo_event_rx(AR_SOFTC_T *ar, A_UINT8 *datap, int len)
++{
++ struct sk_buff *skb;
++ WMI_BSS_INFO_HDR *bih = (WMI_BSS_INFO_HDR *)datap;
++
++
++ if (!ar->arMgmtFilter) {
++ return;
++ }
++ if (((ar->arMgmtFilter & IEEE80211_FILTER_TYPE_BEACON) &&
++ (bih->frameType != BEACON_FTYPE)) ||
++ ((ar->arMgmtFilter & IEEE80211_FILTER_TYPE_PROBE_RESP) &&
++ (bih->frameType != PROBERESP_FTYPE)))
++ {
++ return;
++ }
++
++ if ((skb = A_NETBUF_ALLOC_RAW(len)) != NULL) {
++
++ A_NETBUF_PUT(skb, len);
++ A_MEMCPY(A_NETBUF_DATA(skb), datap, len);
++ skb->dev = ar->arNetDev;
++ printk("MAC RAW...\n");
++// skb->mac.raw = A_NETBUF_DATA(skb);
++ skb->ip_summed = CHECKSUM_NONE;
++ skb->pkt_type = PACKET_OTHERHOST;
++ skb->protocol = __constant_htons(0x0019);
++ netif_rx(skb);
++ }
++}
++
++A_UINT32 wmiSendCmdNum;
++
++A_STATUS
++ar6000_control_tx(void *devt, void *osbuf, WMI_PRI_STREAM_ID streamID)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
++ A_STATUS status = A_OK;
++ struct ar_cookie *cookie = NULL;
++ int i;
++
++ /* take lock to protect ar6000_alloc_cookie() */
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++
++ do {
++
++ AR_DEBUG2_PRINTF("ar_contrstatus = ol_tx: skb=0x%x, len=0x%x, sid=%d\n",
++ (A_UINT32)osbuf, A_NETBUF_LEN(osbuf), streamID);
++
++ if ((streamID == WMI_CONTROL_PRI) && (ar->arWMIControlEpFull)) {
++ /* control endpoint is full, don't allocate resources, we
++ * are just going to drop this packet */
++ cookie = NULL;
++ AR_DEBUG_PRINTF(" WMI Control EP full, dropping packet : 0x%X, len:%d \n",
++ (A_UINT32)osbuf, A_NETBUF_LEN(osbuf));
++ } else {
++ cookie = ar6000_alloc_cookie(ar);
++ }
++
++ if (cookie == NULL) {
++ status = A_NO_MEMORY;
++ break;
++ }
++
++ if(logWmiRawMsgs) {
++ A_PRINTF("WMI cmd send, msgNo %d :", wmiSendCmdNum);
++ for(i = 0; i < a_netbuf_to_len(osbuf); i++)
++ A_PRINTF("%x ", ((A_UINT8 *)a_netbuf_to_data(osbuf))[i]);
++ A_PRINTF("\n");
++ }
++
++ wmiSendCmdNum++;
++
++ } while (FALSE);
++
++ if (cookie != NULL) {
++ /* got a structure to send it out on */
++ ar->arTxPending[streamID]++;
++
++ if (streamID != WMI_CONTROL_PRI) {
++ ar->arTotalTxDataPending++;
++ }
++ }
++
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++
++ if (cookie != NULL) {
++ cookie->arc_bp[0] = (A_UINT32)osbuf;
++ cookie->arc_bp[1] = 0;
++ SET_HTC_PACKET_INFO_TX(&cookie->HtcPkt,
++ cookie,
++ A_NETBUF_DATA(osbuf),
++ A_NETBUF_LEN(osbuf),
++ arWMIStream2EndpointID(ar,streamID),
++ AR6K_CONTROL_PKT_TAG);
++ /* this interface is asynchronous, if there is an error, cleanup will happen in the
++ * TX completion callback */
++ HTCSendPkt(ar->arHtcTarget, &cookie->HtcPkt);
++ status = A_OK;
++ }
++
++ return status;
++}
++
++/* indicate tx activity or inactivity on a WMI stream */
++void ar6000_indicate_tx_activity(void *devt, A_UINT8 TrafficClass, A_BOOL Active)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
++ WMI_PRI_STREAM_ID streamid;
++
++ if (ar->arWmiEnabled) {
++ streamid = wmi_get_stream_id(ar->arWmi, TrafficClass);
++ } else {
++ /* for mbox ping testing, the traffic class is mapped directly as a stream ID,
++ * see handling of AR6000_XIOCTL_TRAFFIC_ACTIVITY_CHANGE in ioctl.c */
++ streamid = (WMI_PRI_STREAM_ID)TrafficClass;
++ }
++
++ /* notify HTC, this may cause credit distribution changes */
++
++ HTCIndicateActivityChange(ar->arHtcTarget,
++ arWMIStream2EndpointID(ar,streamid),
++ Active);
++
++}
++
++module_init(ar6000_init_module);
++module_exit(ar6000_cleanup_module);
++
++/* Init cookie queue */
++static void
++ar6000_cookie_init(AR_SOFTC_T *ar)
++{
++ A_UINT32 i;
++
++ ar->arCookieList = NULL;
++ A_MEMZERO(s_ar_cookie_mem, sizeof(s_ar_cookie_mem));
++
++ for (i = 0; i < MAX_COOKIE_NUM; i++) {
++ ar6000_free_cookie(ar, &s_ar_cookie_mem[i]);
++ }
++}
++
++/* cleanup cookie queue */
++static void
++ar6000_cookie_cleanup(AR_SOFTC_T *ar)
++{
++ /* It is gone .... */
++ ar->arCookieList = NULL;
++}
++
++/* Init cookie queue */
++static void
++ar6000_free_cookie(AR_SOFTC_T *ar, struct ar_cookie * cookie)
++{
++ /* Insert first */
++ A_ASSERT(ar != NULL);
++ A_ASSERT(cookie != NULL);
++ cookie->arc_list_next = ar->arCookieList;
++ ar->arCookieList = cookie;
++}
++
++/* cleanup cookie queue */
++static struct ar_cookie *
++ar6000_alloc_cookie(AR_SOFTC_T *ar)
++{
++ struct ar_cookie *cookie;
++
++ cookie = ar->arCookieList;
++ if(cookie != NULL)
++ {
++ ar->arCookieList = cookie->arc_list_next;
++ }
++
++ return cookie;
++}
++
++#ifdef SEND_EVENT_TO_APP
++/*
++ * This function is used to send event which come from taget to
++ * the application. The buf which send to application is include
++ * the event ID and event content.
++ */
++#define EVENT_ID_LEN 2
++void ar6000_send_event_to_app(AR_SOFTC_T *ar, A_UINT16 eventId,
++ A_UINT8 *datap, int len)
++{
++
++#if (WIRELESS_EXT >= 15)
++
++/* note: IWEVCUSTOM only exists in wireless extensions after version 15 */
++
++ char *buf;
++ A_UINT16 size;
++ union iwreq_data wrqu;
++
++ size = len + EVENT_ID_LEN;
++
++ if (size > IW_CUSTOM_MAX) {
++ AR_DEBUG_PRINTF("WMI event ID : 0x%4.4X, len = %d too big for IWEVCUSTOM (max=%d) \n",
++ eventId, size, IW_CUSTOM_MAX);
++ return;
++ }
++
++ buf = A_MALLOC_NOWAIT(size);
++ A_MEMZERO(buf, size);
++ A_MEMCPY(buf, &eventId, EVENT_ID_LEN);
++ A_MEMCPY(buf+EVENT_ID_LEN, datap, len);
++
++ //AR_DEBUG_PRINTF("event ID = %d,len = %d\n",*(A_UINT16*)buf, size);
++ A_MEMZERO(&wrqu, sizeof(wrqu));
++ wrqu.data.length = size;
++ wireless_send_event(ar->arNetDev, IWEVCUSTOM, &wrqu, buf);
++
++ A_FREE(buf);
++#endif
++
++
++}
++#endif
++
++
++void
++ar6000_tx_retry_err_event(void *devt)
++{
++ AR_DEBUG2_PRINTF("Tx retries reach maximum!\n");
++}
++
++void
++ar6000_snrThresholdEvent_rx(void *devt, WMI_SNR_THRESHOLD_VAL newThreshold, A_UINT8 snr)
++{
++ AR_DEBUG2_PRINTF("snr threshold range %d, snr %d\n", newThreshold, snr);
++}
++
++void
++ar6000_lqThresholdEvent_rx(void *devt, WMI_LQ_THRESHOLD_VAL newThreshold, A_UINT8 lq)
++{
++ AR_DEBUG2_PRINTF("lq threshold range %d, lq %d\n", newThreshold, lq);
++}
++
++
++
++A_UINT32
++a_copy_to_user(void *to, const void *from, A_UINT32 n)
++{
++ return(copy_to_user(to, from, n));
++}
++
++A_UINT32
++a_copy_from_user(void *to, const void *from, A_UINT32 n)
++{
++ return(copy_from_user(to, from, n));
++}
++
++
++A_STATUS
++ar6000_get_driver_cfg(struct net_device *dev,
++ A_UINT16 cfgParam,
++ void *result)
++{
++
++ A_STATUS ret = 0;
++
++ switch(cfgParam)
++ {
++ case AR6000_DRIVER_CFG_GET_WLANNODECACHING:
++ *((A_UINT32 *)result) = wlanNodeCaching;
++ break;
++ case AR6000_DRIVER_CFG_LOG_RAW_WMI_MSGS:
++ *((A_UINT32 *)result) = logWmiRawMsgs;
++ break;
++ default:
++ ret = EINVAL;
++ break;
++ }
++
++ return ret;
++}
++
++void
++ar6000_keepalive_rx(void *devt, A_UINT8 configured)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
++
++ ar->arKeepaliveConfigured = configured;
++ wake_up(&arEvent);
++}
++
++void
++ar6000_pmkid_list_event(void *devt, A_UINT8 numPMKID, WMI_PMKID *pmkidList)
++{
++ A_UINT8 i, j;
++
++ A_PRINTF("Number of Cached PMKIDs is %d\n", numPMKID);
++
++ for (i = 0; i < numPMKID; i++) {
++ A_PRINTF("\nPMKID %d ", i);
++ for (j = 0; j < WMI_PMKID_LEN; j++) {
++ A_PRINTF("%2.2x", pmkidList->pmkid[j]);
++ }
++ pmkidList++;
++ }
++}
++
++#ifdef USER_KEYS
++static A_STATUS
++
++ar6000_reinstall_keys(AR_SOFTC_T *ar, A_UINT8 key_op_ctrl)
++{
++ A_STATUS status = A_OK;
++ struct ieee80211req_key *uik = &ar->user_saved_keys.ucast_ik;
++ struct ieee80211req_key *bik = &ar->user_saved_keys.bcast_ik;
++ CRYPTO_TYPE keyType = ar->user_saved_keys.keyType;
++
++ if (IEEE80211_CIPHER_CCKM_KRK != uik->ik_type) {
++ if (NONE_CRYPT == keyType) {
++ goto _reinstall_keys_out;
++ }
++
++ if (uik->ik_keylen) {
++ status = wmi_addKey_cmd(ar->arWmi, uik->ik_keyix,
++ ar->user_saved_keys.keyType, PAIRWISE_USAGE,
++ uik->ik_keylen, (A_UINT8 *)&uik->ik_keyrsc,
++ uik->ik_keydata, key_op_ctrl, SYNC_BEFORE_WMIFLAG);
++ }
++
++ } else {
++ status = wmi_add_krk_cmd(ar->arWmi, uik->ik_keydata);
++ }
++
++ if (IEEE80211_CIPHER_CCKM_KRK != bik->ik_type) {
++ if (NONE_CRYPT == keyType) {
++ goto _reinstall_keys_out;
++ }
++
++ if (bik->ik_keylen) {
++ status = wmi_addKey_cmd(ar->arWmi, bik->ik_keyix,
++ ar->user_saved_keys.keyType, GROUP_USAGE,
++ bik->ik_keylen, (A_UINT8 *)&bik->ik_keyrsc,
++ bik->ik_keydata, key_op_ctrl, NO_SYNC_WMIFLAG);
++ }
++ } else {
++ status = wmi_add_krk_cmd(ar->arWmi, bik->ik_keydata);
++ }
++
++_reinstall_keys_out:
++ ar->user_savedkeys_stat = USER_SAVEDKEYS_STAT_INIT;
++ ar->user_key_ctrl = 0;
++
++ return status;
++}
++#endif /* USER_KEYS */
++
++
++void
++ar6000_dset_open_req(
++ void *context,
++ A_UINT32 id,
++ A_UINT32 targHandle,
++ A_UINT32 targReplyFn,
++ A_UINT32 targReplyArg)
++{
++}
++
++void
++ar6000_dset_close(
++ void *context,
++ A_UINT32 access_cookie)
++{
++ return;
++}
++
++void
++ar6000_dset_data_req(
++ void *context,
++ A_UINT32 accessCookie,
++ A_UINT32 offset,
++ A_UINT32 length,
++ A_UINT32 targBuf,
++ A_UINT32 targReplyFn,
++ A_UINT32 targReplyArg)
++{
++}
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/ar6000_drv.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/ar6000_drv.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/ar6000_drv.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/ar6000_drv.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,360 @@
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef _AR6000_H_
++#define _AR6000_H_
++
++#include <linux/version.h>
++
++
++#include <linux/autoconf.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/spinlock.h>
++#include <linux/skbuff.h>
++#include <linux/if_ether.h>
++#include <linux/netdevice.h>
++#include <linux/etherdevice.h>
++#include <net/iw_handler.h>
++#include <linux/if_arp.h>
++#include <linux/ip.h>
++#include <linux/semaphore.h>
++#include <linux/wireless.h>
++#include <linux/module.h>
++#include <asm/io.h>
++
++#include <a_config.h>
++#include <athdefs.h>
++#include "a_types.h"
++#include "a_osapi.h"
++#include "htc_api.h"
++#include "wmi.h"
++#include "a_drv.h"
++#include "bmi.h"
++#include <ieee80211.h>
++#include <ieee80211_ioctl.h>
++#include <wlan_api.h>
++#include <wmi_api.h>
++#include "gpio_api.h"
++#include "gpio.h"
++#include <host_version.h>
++#include <linux/rtnetlink.h>
++#include <linux/init.h>
++#include <linux/moduleparam.h>
++#include "AR6Khwreg.h"
++#include "ar6000_api.h"
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++#include <testcmd.h>
++#endif
++
++#include "targaddrs.h"
++#include "dbglog_api.h"
++#include "ar6000_diag.h"
++#include "common_drv.h"
++
++#ifndef __dev_put
++#define __dev_put(dev) dev_put(dev)
++#endif
++
++#ifdef USER_KEYS
++
++#define USER_SAVEDKEYS_STAT_INIT 0
++#define USER_SAVEDKEYS_STAT_RUN 1
++
++// TODO this needs to move into the AR_SOFTC struct
++struct USER_SAVEDKEYS {
++ struct ieee80211req_key ucast_ik;
++ struct ieee80211req_key bcast_ik;
++ CRYPTO_TYPE keyType;
++ A_BOOL keyOk;
++};
++#endif
++
++#define DBG_INFO 0x00000001
++#define DBG_ERROR 0x00000002
++#define DBG_WARNING 0x00000004
++#define DBG_SDIO 0x00000008
++#define DBG_HIF 0x00000010
++#define DBG_HTC 0x00000020
++#define DBG_WMI 0x00000040
++#define DBG_WMI2 0x00000080
++#define DBG_DRIVER 0x00000100
++
++#define DBG_DEFAULTS (DBG_ERROR|DBG_WARNING)
++
++
++#ifdef DEBUG
++#define AR_DEBUG_PRINTF(args...) if (debugdriver) A_PRINTF(args);
++#define AR_DEBUG2_PRINTF(args...) if (debugdriver >= 2) A_PRINTF(args);
++extern int debugdriver;
++#else
++#define AR_DEBUG_PRINTF(args...)
++#define AR_DEBUG2_PRINTF(args...)
++#endif
++
++A_STATUS ar6000_ReadRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data);
++A_STATUS ar6000_WriteRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data);
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#define MAX_AR6000 1
++#define AR6000_MAX_RX_BUFFERS 16
++#define AR6000_BUFFER_SIZE 1664
++#define AR6000_TX_TIMEOUT 10
++#define AR6000_ETH_ADDR_LEN 6
++#define AR6000_MAX_ENDPOINTS 4
++#define MAX_NODE_NUM 15
++#define MAX_COOKIE_NUM 150
++#define AR6000_HB_CHALLENGE_RESP_FREQ_DEFAULT 1
++#define AR6000_HB_CHALLENGE_RESP_MISS_THRES_DEFAULT 1
++
++enum {
++ DRV_HB_CHALLENGE = 0,
++ APP_HB_CHALLENGE
++};
++
++/* HTC RAW streams */
++typedef enum _HTC_RAW_STREAM_ID {
++ HTC_RAW_STREAM_NOT_MAPPED = -1,
++ HTC_RAW_STREAM_0 = 0,
++ HTC_RAW_STREAM_1 = 1,
++ HTC_RAW_STREAM_2 = 2,
++ HTC_RAW_STREAM_3 = 3,
++ HTC_RAW_STREAM_NUM_MAX
++} HTC_RAW_STREAM_ID;
++
++#define RAW_HTC_READ_BUFFERS_NUM 4
++#define RAW_HTC_WRITE_BUFFERS_NUM 4
++
++typedef struct {
++ int currPtr;
++ int length;
++ unsigned char data[AR6000_BUFFER_SIZE];
++ HTC_PACKET HTCPacket;
++} raw_htc_buffer;
++
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++/*
++ * add TCMD_MODE besides wmi and bypasswmi
++ * in TCMD_MODE, only few TCMD releated wmi commands
++ * counld be hanlder
++ */
++enum {
++ AR6000_WMI_MODE = 0,
++ AR6000_BYPASS_MODE,
++ AR6000_TCMD_MODE,
++ AR6000_WLAN_MODE
++};
++#endif /* CONFIG_HOST_TCMD_SUPPORT */
++
++struct ar_wep_key {
++ A_UINT8 arKeyIndex;
++ A_UINT8 arKeyLen;
++ A_UINT8 arKey[64];
++} ;
++
++struct ar_node_mapping {
++ A_UINT8 macAddress[6];
++ A_UINT8 epId;
++ A_UINT8 txPending;
++};
++
++struct ar_cookie {
++ A_UINT32 arc_bp[2]; /* Must be first field */
++ HTC_PACKET HtcPkt; /* HTC packet wrapper */
++ struct ar_cookie *arc_list_next;
++};
++
++struct ar_hb_chlng_resp {
++ A_TIMER timer;
++ A_UINT32 frequency;
++ A_UINT32 seqNum;
++ A_BOOL outstanding;
++ A_UINT8 missCnt;
++ A_UINT8 missThres;
++};
++
++typedef struct ar6_softc {
++ struct net_device *arNetDev; /* net_device pointer */
++ void *arWmi;
++ int arTxPending[WMI_PRI_MAX_COUNT];
++ int arTotalTxDataPending;
++ A_UINT8 arNumDataEndPts;
++ A_BOOL arWmiEnabled;
++ A_BOOL arWmiReady;
++ A_BOOL arConnected;
++ A_BOOL arRadioSwitch;
++ HTC_HANDLE arHtcTarget;
++ void *arHifDevice;
++ spinlock_t arLock;
++ struct semaphore arSem;
++ int arRxBuffers[WMI_PRI_MAX_COUNT];
++ int arSsidLen;
++ u_char arSsid[32];
++ A_UINT8 arNetworkType;
++ A_UINT8 arDot11AuthMode;
++ A_UINT8 arAuthMode;
++ A_UINT8 arPairwiseCrypto;
++ A_UINT8 arPairwiseCryptoLen;
++ A_UINT8 arGroupCrypto;
++ A_UINT8 arGroupCryptoLen;
++ A_UINT8 arDefTxKeyIndex;
++ struct ar_wep_key arWepKeyList[WMI_MAX_KEY_INDEX + 1];
++ A_UINT8 arBssid[6];
++ A_UINT8 arReqBssid[6];
++ A_UINT16 arChannelHint;
++ A_UINT16 arBssChannel;
++ A_UINT16 arListenInterval;
++ struct ar6000_version arVersion;
++ A_UINT32 arTargetType;
++ A_INT8 arRssi;
++ A_UINT8 arTxPwr;
++ A_BOOL arTxPwrSet;
++ A_INT32 arBitRate;
++ struct net_device_stats arNetStats;
++ struct iw_statistics arIwStats;
++ A_INT8 arNumChannels;
++ A_UINT16 arChannelList[32];
++ A_UINT32 arRegCode;
++ A_BOOL statsUpdatePending;
++ TARGET_STATS arTargetStats;
++ A_INT8 arMaxRetries;
++ A_UINT8 arPhyCapability;
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++ A_UINT8 tcmdRxReport;
++ A_UINT32 tcmdRxTotalPkt;
++ A_INT32 tcmdRxRssi;
++ A_UINT32 tcmdPm;
++ A_UINT32 arTargetMode;
++#endif
++ AR6000_WLAN_STATE arWlanState;
++ struct ar_node_mapping arNodeMap[MAX_NODE_NUM];
++ A_UINT8 arIbssPsEnable;
++ A_UINT8 arNodeNum;
++ A_UINT8 arNexEpId;
++ struct ar_cookie *arCookieList;
++ A_UINT16 arRateMask;
++ A_UINT8 arSkipScan;
++ A_UINT16 arBeaconInterval;
++ A_BOOL arConnectPending;
++ A_BOOL arWmmEnabled;
++ struct ar_hb_chlng_resp arHBChallengeResp;
++ A_UINT8 arKeepaliveConfigured;
++ A_UINT32 arMgmtFilter;
++ HTC_ENDPOINT_ID arWmi2EpMapping[WMI_PRI_MAX_COUNT];
++ WMI_PRI_STREAM_ID arEp2WmiMapping[ENDPOINT_MAX];
++#ifdef HTC_RAW_INTERFACE
++ HTC_ENDPOINT_ID arRaw2EpMapping[HTC_RAW_STREAM_NUM_MAX];
++ HTC_RAW_STREAM_ID arEp2RawMapping[ENDPOINT_MAX];
++ struct semaphore raw_htc_read_sem[HTC_RAW_STREAM_NUM_MAX];
++ struct semaphore raw_htc_write_sem[HTC_RAW_STREAM_NUM_MAX];
++ wait_queue_head_t raw_htc_read_queue[HTC_RAW_STREAM_NUM_MAX];
++ wait_queue_head_t raw_htc_write_queue[HTC_RAW_STREAM_NUM_MAX];
++ raw_htc_buffer *raw_htc_read_buffer[HTC_RAW_STREAM_NUM_MAX][RAW_HTC_READ_BUFFERS_NUM];
++ raw_htc_buffer *raw_htc_write_buffer[HTC_RAW_STREAM_NUM_MAX][RAW_HTC_WRITE_BUFFERS_NUM];
++ A_BOOL write_buffer_available[HTC_RAW_STREAM_NUM_MAX];
++ A_BOOL read_buffer_available[HTC_RAW_STREAM_NUM_MAX];
++#endif
++ A_BOOL arRawIfInit;
++ int arDeviceIndex;
++ COMMON_CREDIT_STATE_INFO arCreditStateInfo;
++ A_BOOL arWMIControlEpFull;
++ A_BOOL dbgLogFetchInProgress;
++ A_UCHAR log_buffer[DBGLOG_HOST_LOG_BUFFER_SIZE];
++ A_UINT32 log_cnt;
++ A_UINT32 dbglog_init_done;
++ A_UINT32 arConnectCtrlFlags;
++ A_UINT32 scan_complete;
++#ifdef USER_KEYS
++ A_INT32 user_savedkeys_stat;
++ A_UINT32 user_key_ctrl;
++ struct USER_SAVEDKEYS user_saved_keys;
++#endif
++} AR_SOFTC_T;
++
++
++#define arWMIStream2EndpointID(ar,wmi) (ar)->arWmi2EpMapping[(wmi)]
++#define arSetWMIStream2EndpointIDMap(ar,wmi,ep) \
++{ (ar)->arWmi2EpMapping[(wmi)] = (ep); \
++ (ar)->arEp2WmiMapping[(ep)] = (wmi); }
++#define arEndpoint2WMIStreamID(ar,ep) (ar)->arEp2WmiMapping[(ep)]
++
++#define arRawIfEnabled(ar) (ar)->arRawIfInit
++#define arRawStream2EndpointID(ar,raw) (ar)->arRaw2EpMapping[(raw)]
++#define arSetRawStream2EndpointIDMap(ar,raw,ep) \
++{ (ar)->arRaw2EpMapping[(raw)] = (ep); \
++ (ar)->arEp2RawMapping[(ep)] = (raw); }
++#define arEndpoint2RawStreamID(ar,ep) (ar)->arEp2RawMapping[(ep)]
++
++struct ar_giwscan_param {
++ char *current_ev;
++ char *end_buf;
++ A_BOOL firstPass;
++};
++
++#define AR6000_STAT_INC(ar, stat) (ar->arNetStats.stat++)
++
++#define AR6000_SPIN_LOCK(lock, param) do { \
++ if (irqs_disabled()) { \
++ AR_DEBUG_PRINTF("IRQs disabled:AR6000_LOCK\n"); \
++ } \
++ spin_lock_bh(lock); \
++} while (0)
++
++#define AR6000_SPIN_UNLOCK(lock, param) do { \
++ if (irqs_disabled()) { \
++ AR_DEBUG_PRINTF("IRQs disabled: AR6000_UNLOCK\n"); \
++ } \
++ spin_unlock_bh(lock); \
++} while (0)
++
++int ar6000_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
++int ar6000_ioctl_dispatcher(struct net_device *dev, struct ifreq *rq, int cmd);
++void ar6000_ioctl_iwsetup(struct iw_handler_def *def);
++void ar6000_gpio_init(void);
++void ar6000_init_profile_info(AR_SOFTC_T *ar);
++void ar6000_install_static_wep_keys(AR_SOFTC_T *ar);
++int ar6000_init(struct net_device *dev);
++int ar6000_dbglog_get_debug_logs(AR_SOFTC_T *ar);
++A_STATUS ar6000_SetHTCBlockSize(AR_SOFTC_T *ar);
++
++#ifdef HTC_RAW_INTERFACE
++
++#ifndef __user
++#define __user
++#endif
++
++int ar6000_htc_raw_open(AR_SOFTC_T *ar);
++int ar6000_htc_raw_close(AR_SOFTC_T *ar);
++ssize_t ar6000_htc_raw_read(AR_SOFTC_T *ar,
++ HTC_RAW_STREAM_ID StreamID,
++ char __user *buffer, size_t count);
++ssize_t ar6000_htc_raw_write(AR_SOFTC_T *ar,
++ HTC_RAW_STREAM_ID StreamID,
++ char __user *buffer, size_t count);
++
++#endif /* HTC_RAW_INTERFACE */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _AR6000_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/ar6000_raw_if.c linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/ar6000_raw_if.c
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/ar6000_raw_if.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/ar6000_raw_if.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,440 @@
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "ar6000_drv.h"
++
++#ifdef HTC_RAW_INTERFACE
++
++static void
++ar6000_htc_raw_read_cb(void *Context, HTC_PACKET *pPacket)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)Context;
++ raw_htc_buffer *busy;
++ HTC_RAW_STREAM_ID streamID;
++
++ busy = (raw_htc_buffer *)pPacket->pPktContext;
++ A_ASSERT(busy != NULL);
++
++ if (pPacket->Status == A_ECANCELED) {
++ /*
++ * HTC provides A_ECANCELED status when it doesn't want to be refilled
++ * (probably due to a shutdown)
++ */
++ return;
++ }
++
++ streamID = arEndpoint2RawStreamID(ar,pPacket->Endpoint);
++ A_ASSERT(streamID != HTC_RAW_STREAM_NOT_MAPPED);
++
++#ifdef CF
++ if (down_trylock(&ar->raw_htc_read_sem[streamID])) {
++#else
++ if (down_interruptible(&ar->raw_htc_read_sem[streamID])) {
++#endif /* CF */
++ AR_DEBUG2_PRINTF("Unable to down the semaphore\n");
++ }
++
++ A_ASSERT((pPacket->Status != A_OK) ||
++ (pPacket->pBuffer == (busy->data + HTC_HEADER_LEN)));
++
++ busy->length = pPacket->ActualLength + HTC_HEADER_LEN;
++ busy->currPtr = HTC_HEADER_LEN;
++ ar->read_buffer_available[streamID] = TRUE;
++ //AR_DEBUG_PRINTF("raw read cb: 0x%X 0x%X \n", busy->currPtr,busy->length);
++ up(&ar->raw_htc_read_sem[streamID]);
++
++ /* Signal the waiting process */
++ AR_DEBUG2_PRINTF("Waking up the StreamID(%d) read process\n", streamID);
++ wake_up_interruptible(&ar->raw_htc_read_queue[streamID]);
++}
++
++static void
++ar6000_htc_raw_write_cb(void *Context, HTC_PACKET *pPacket)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)Context;
++ raw_htc_buffer *free;
++ HTC_RAW_STREAM_ID streamID;
++
++ free = (raw_htc_buffer *)pPacket->pPktContext;
++ A_ASSERT(free != NULL);
++
++ if (pPacket->Status == A_ECANCELED) {
++ /*
++ * HTC provides A_ECANCELED status when it doesn't want to be refilled
++ * (probably due to a shutdown)
++ */
++ return;
++ }
++
++ streamID = arEndpoint2RawStreamID(ar,pPacket->Endpoint);
++ A_ASSERT(streamID != HTC_RAW_STREAM_NOT_MAPPED);
++
++#ifdef CF
++ if (down_trylock(&ar->raw_htc_write_sem[streamID])) {
++#else
++ if (down_interruptible(&ar->raw_htc_write_sem[streamID])) {
++#endif
++ AR_DEBUG2_PRINTF("Unable to down the semaphore\n");
++ }
++
++ A_ASSERT(pPacket->pBuffer == (free->data + HTC_HEADER_LEN));
++
++ free->length = 0;
++ ar->write_buffer_available[streamID] = TRUE;
++ up(&ar->raw_htc_write_sem[streamID]);
++
++ /* Signal the waiting process */
++ AR_DEBUG2_PRINTF("Waking up the StreamID(%d) write process\n", streamID);
++ wake_up_interruptible(&ar->raw_htc_write_queue[streamID]);
++}
++
++/* connect to a service */
++static A_STATUS ar6000_connect_raw_service(AR_SOFTC_T *ar,
++ HTC_RAW_STREAM_ID StreamID)
++{
++ A_STATUS status;
++ HTC_SERVICE_CONNECT_RESP response;
++ A_UINT8 streamNo;
++ HTC_SERVICE_CONNECT_REQ connect;
++
++ do {
++
++ A_MEMZERO(&connect,sizeof(connect));
++ /* pass the stream ID as meta data to the RAW streams service */
++ streamNo = (A_UINT8)StreamID;
++ connect.pMetaData = &streamNo;
++ connect.MetaDataLength = sizeof(A_UINT8);
++ /* these fields are the same for all endpoints */
++ connect.EpCallbacks.pContext = ar;
++ connect.EpCallbacks.EpTxComplete = ar6000_htc_raw_write_cb;
++ connect.EpCallbacks.EpRecv = ar6000_htc_raw_read_cb;
++ /* simple interface, we don't need these optional callbacks */
++ connect.EpCallbacks.EpRecvRefill = NULL;
++ connect.EpCallbacks.EpSendFull = NULL;
++ connect.EpCallbacks.EpSendAvail = NULL;
++ connect.MaxSendQueueDepth = RAW_HTC_WRITE_BUFFERS_NUM;
++
++ /* connect to the raw streams service, we may be able to get 1 or more
++ * connections, depending on WHAT is running on the target */
++ connect.ServiceID = HTC_RAW_STREAMS_SVC;
++
++ A_MEMZERO(&response,sizeof(response));
++
++ /* try to connect to the raw stream, it is okay if this fails with
++ * status HTC_SERVICE_NO_MORE_EP */
++ status = HTCConnectService(ar->arHtcTarget,
++ &connect,
++ &response);
++
++ if (A_FAILED(status)) {
++ if (response.ConnectRespCode == HTC_SERVICE_NO_MORE_EP) {
++ AR_DEBUG_PRINTF("HTC RAW , No more streams allowed \n");
++ status = A_OK;
++ }
++ break;
++ }
++
++ /* set endpoint mapping for the RAW HTC streams */
++ arSetRawStream2EndpointIDMap(ar,StreamID,response.Endpoint);
++
++ AR_DEBUG_PRINTF("HTC RAW : stream ID: %d, endpoint: %d\n",
++ StreamID, arRawStream2EndpointID(ar,StreamID));
++
++ } while (FALSE);
++
++ return status;
++}
++
++int ar6000_htc_raw_open(AR_SOFTC_T *ar)
++{
++ A_STATUS status;
++ int streamID, endPt, count2;
++ raw_htc_buffer *buffer;
++ HTC_SERVICE_ID servicepriority;
++
++ A_ASSERT(ar->arHtcTarget != NULL);
++
++ /* wait for target */
++ status = HTCWaitTarget(ar->arHtcTarget);
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF("HTCWaitTarget failed (%d)\n", status);
++ return -ENODEV;
++ }
++
++ for (endPt = 0; endPt < ENDPOINT_MAX; endPt++) {
++ ar->arEp2RawMapping[endPt] = HTC_RAW_STREAM_NOT_MAPPED;
++ }
++
++ for (streamID = HTC_RAW_STREAM_0; streamID < HTC_RAW_STREAM_NUM_MAX; streamID++) {
++ /* Initialize the data structures */
++ init_MUTEX(&ar->raw_htc_read_sem[streamID]);
++ init_MUTEX(&ar->raw_htc_write_sem[streamID]);
++ init_waitqueue_head(&ar->raw_htc_read_queue[streamID]);
++ init_waitqueue_head(&ar->raw_htc_write_queue[streamID]);
++
++ /* try to connect to the raw service */
++ status = ar6000_connect_raw_service(ar,streamID);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ if (arRawStream2EndpointID(ar,streamID) == 0) {
++ break;
++ }
++
++ for (count2 = 0; count2 < RAW_HTC_READ_BUFFERS_NUM; count2 ++) {
++ /* Initialize the receive buffers */
++ buffer = ar->raw_htc_write_buffer[streamID][count2];
++ memset(buffer, 0, sizeof(raw_htc_buffer));
++ buffer = ar->raw_htc_read_buffer[streamID][count2];
++ memset(buffer, 0, sizeof(raw_htc_buffer));
++
++ SET_HTC_PACKET_INFO_RX_REFILL(&buffer->HTCPacket,
++ buffer,
++ buffer->data,
++ AR6000_BUFFER_SIZE,
++ arRawStream2EndpointID(ar,streamID));
++
++ /* Queue buffers to HTC for receive */
++ if ((status = HTCAddReceivePkt(ar->arHtcTarget, &buffer->HTCPacket)) != A_OK)
++ {
++ BMIInit();
++ return -EIO;
++ }
++ }
++
++ for (count2 = 0; count2 < RAW_HTC_WRITE_BUFFERS_NUM; count2 ++) {
++ /* Initialize the receive buffers */
++ buffer = ar->raw_htc_write_buffer[streamID][count2];
++ memset(buffer, 0, sizeof(raw_htc_buffer));
++ }
++
++ ar->read_buffer_available[streamID] = FALSE;
++ ar->write_buffer_available[streamID] = TRUE;
++ }
++
++ if (A_FAILED(status)) {
++ return -EIO;
++ }
++
++ AR_DEBUG_PRINTF("HTC RAW, number of streams the target supports: %d \n", streamID);
++
++ servicepriority = HTC_RAW_STREAMS_SVC; /* only 1 */
++
++ /* set callbacks and priority list */
++ HTCSetCreditDistribution(ar->arHtcTarget,
++ ar,
++ NULL, /* use default */
++ NULL, /* use default */
++ &servicepriority,
++ 1);
++
++ /* Start the HTC component */
++ if ((status = HTCStart(ar->arHtcTarget)) != A_OK) {
++ BMIInit();
++ return -EIO;
++ }
++
++ (ar)->arRawIfInit = TRUE;
++
++ return 0;
++}
++
++int ar6000_htc_raw_close(AR_SOFTC_T *ar)
++{
++ A_PRINTF("ar6000_htc_raw_close called \n");
++ HTCStop(ar->arHtcTarget);
++
++ /* reset the device */
++ ar6000_reset_device(ar->arHifDevice, ar->arTargetType);
++ /* Initialize the BMI component */
++ BMIInit();
++
++ return 0;
++}
++
++raw_htc_buffer *
++get_filled_buffer(AR_SOFTC_T *ar, HTC_RAW_STREAM_ID StreamID)
++{
++ int count;
++ raw_htc_buffer *busy;
++
++ /* Check for data */
++ for (count = 0; count < RAW_HTC_READ_BUFFERS_NUM; count ++) {
++ busy = ar->raw_htc_read_buffer[StreamID][count];
++ if (busy->length) {
++ break;
++ }
++ }
++ if (busy->length) {
++ ar->read_buffer_available[StreamID] = TRUE;
++ } else {
++ ar->read_buffer_available[StreamID] = FALSE;
++ }
++
++ return busy;
++}
++
++ssize_t ar6000_htc_raw_read(AR_SOFTC_T *ar, HTC_RAW_STREAM_ID StreamID,
++ char __user *buffer, size_t length)
++{
++ int readPtr;
++ raw_htc_buffer *busy;
++
++ if (arRawStream2EndpointID(ar,StreamID) == 0) {
++ AR_DEBUG_PRINTF("StreamID(%d) not connected! \n", StreamID);
++ return -EFAULT;
++ }
++
++ if (down_interruptible(&ar->raw_htc_read_sem[StreamID])) {
++ return -ERESTARTSYS;
++ }
++
++ busy = get_filled_buffer(ar,StreamID);
++ while (!ar->read_buffer_available[StreamID]) {
++ up(&ar->raw_htc_read_sem[StreamID]);
++
++ /* Wait for the data */
++ AR_DEBUG2_PRINTF("Sleeping StreamID(%d) read process\n", StreamID);
++ if (wait_event_interruptible(ar->raw_htc_read_queue[StreamID],
++ ar->read_buffer_available[StreamID]))
++ {
++ return -EINTR;
++ }
++ if (down_interruptible(&ar->raw_htc_read_sem[StreamID])) {
++ return -ERESTARTSYS;
++ }
++ busy = get_filled_buffer(ar,StreamID);
++ }
++
++ /* Read the data */
++ readPtr = busy->currPtr;
++ if (length > busy->length - HTC_HEADER_LEN) {
++ length = busy->length - HTC_HEADER_LEN;
++ }
++ if (copy_to_user(buffer, &busy->data[readPtr], length)) {
++ up(&ar->raw_htc_read_sem[StreamID]);
++ return -EFAULT;
++ }
++
++ busy->currPtr += length;
++
++ //AR_DEBUG_PRINTF("raw read ioctl: currPTR : 0x%X 0x%X \n", busy->currPtr,busy->length);
++
++ if (busy->currPtr == busy->length)
++ {
++ busy->currPtr = 0;
++ busy->length = 0;
++ HTC_PACKET_RESET_RX(&busy->HTCPacket);
++ //AR_DEBUG_PRINTF("raw read ioctl: ep for packet:%d \n", busy->HTCPacket.Endpoint);
++ HTCAddReceivePkt(ar->arHtcTarget, &busy->HTCPacket);
++ }
++ ar->read_buffer_available[StreamID] = FALSE;
++ up(&ar->raw_htc_read_sem[StreamID]);
++
++ return length;
++}
++
++static raw_htc_buffer *
++get_free_buffer(AR_SOFTC_T *ar, HTC_ENDPOINT_ID StreamID)
++{
++ int count;
++ raw_htc_buffer *free;
++
++ free = NULL;
++ for (count = 0; count < RAW_HTC_WRITE_BUFFERS_NUM; count ++) {
++ free = ar->raw_htc_write_buffer[StreamID][count];
++ if (free->length == 0) {
++ break;
++ }
++ }
++ if (!free->length) {
++ ar->write_buffer_available[StreamID] = TRUE;
++ } else {
++ ar->write_buffer_available[StreamID] = FALSE;
++ }
++
++ return free;
++}
++
++ssize_t ar6000_htc_raw_write(AR_SOFTC_T *ar, HTC_RAW_STREAM_ID StreamID,
++ char __user *buffer, size_t length)
++{
++ int writePtr;
++ raw_htc_buffer *free;
++
++ if (arRawStream2EndpointID(ar,StreamID) == 0) {
++ AR_DEBUG_PRINTF("StreamID(%d) not connected! \n", StreamID);
++ return -EFAULT;
++ }
++
++ if (down_interruptible(&ar->raw_htc_write_sem[StreamID])) {
++ return -ERESTARTSYS;
++ }
++
++ /* Search for a free buffer */
++ free = get_free_buffer(ar,StreamID);
++
++ /* Check if there is space to write else wait */
++ while (!ar->write_buffer_available[StreamID]) {
++ up(&ar->raw_htc_write_sem[StreamID]);
++
++ /* Wait for buffer to become free */
++ AR_DEBUG2_PRINTF("Sleeping StreamID(%d) write process\n", StreamID);
++ if (wait_event_interruptible(ar->raw_htc_write_queue[StreamID],
++ ar->write_buffer_available[StreamID]))
++ {
++ return -EINTR;
++ }
++ if (down_interruptible(&ar->raw_htc_write_sem[StreamID])) {
++ return -ERESTARTSYS;
++ }
++ free = get_free_buffer(ar,StreamID);
++ }
++
++ /* Send the data */
++ writePtr = HTC_HEADER_LEN;
++ if (length > (AR6000_BUFFER_SIZE - HTC_HEADER_LEN)) {
++ length = AR6000_BUFFER_SIZE - HTC_HEADER_LEN;
++ }
++
++ if (copy_from_user(&free->data[writePtr], buffer, length)) {
++ up(&ar->raw_htc_read_sem[StreamID]);
++ return -EFAULT;
++ }
++
++ free->length = length;
++
++ SET_HTC_PACKET_INFO_TX(&free->HTCPacket,
++ free,
++ &free->data[writePtr],
++ length,
++ arRawStream2EndpointID(ar,StreamID),
++ AR6K_DATA_PKT_TAG);
++
++ HTCSendPkt(ar->arHtcTarget,&free->HTCPacket);
++
++ ar->write_buffer_available[StreamID] = FALSE;
++ up(&ar->raw_htc_write_sem[StreamID]);
++
++ return length;
++}
++#endif /* HTC_RAW_INTERFACE */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/ar6xapi_linux.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/ar6xapi_linux.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/ar6xapi_linux.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/ar6xapi_linux.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,128 @@
++#ifndef _AR6XAPI_LINUX_H
++#define _AR6XAPI_LINUX_H
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++struct ar6_softc;
++
++void ar6000_ready_event(void *devt, A_UINT8 *datap, A_UINT8 phyCap);
++A_UINT8 ar6000_iptos_to_userPriority(A_UINT8 *pkt);
++A_STATUS ar6000_control_tx(void *devt, void *osbuf, WMI_PRI_STREAM_ID streamID);
++void ar6000_connect_event(struct ar6_softc *ar, A_UINT16 channel,
++ A_UINT8 *bssid, A_UINT16 listenInterval,
++ A_UINT16 beaconInterval, NETWORK_TYPE networkType,
++ A_UINT8 beaconIeLen, A_UINT8 assocReqLen,
++ A_UINT8 assocRespLen,A_UINT8 *assocInfo);
++void ar6000_disconnect_event(struct ar6_softc *ar, A_UINT8 reason,
++ A_UINT8 *bssid, A_UINT8 assocRespLen,
++ A_UINT8 *assocInfo, A_UINT16 protocolReasonStatus);
++void ar6000_tkip_micerr_event(struct ar6_softc *ar, A_UINT8 keyid,
++ A_BOOL ismcast);
++void ar6000_bitrate_rx(void *devt, A_INT32 rateKbps);
++void ar6000_channelList_rx(void *devt, A_INT8 numChan, A_UINT16 *chanList);
++void ar6000_regDomain_event(struct ar6_softc *ar, A_UINT32 regCode);
++void ar6000_txPwr_rx(void *devt, A_UINT8 txPwr);
++void ar6000_keepalive_rx(void *devt, A_UINT8 configured);
++void ar6000_neighborReport_event(struct ar6_softc *ar, int numAps,
++ WMI_NEIGHBOR_INFO *info);
++void ar6000_set_numdataendpts(struct ar6_softc *ar, A_UINT32 num);
++void ar6000_scanComplete_event(struct ar6_softc *ar, A_STATUS status);
++void ar6000_targetStats_event(struct ar6_softc *ar, WMI_TARGET_STATS *pStats);
++void ar6000_rssiThreshold_event(struct ar6_softc *ar,
++ WMI_RSSI_THRESHOLD_VAL newThreshold,
++ A_INT16 rssi);
++void ar6000_reportError_event(struct ar6_softc *, WMI_TARGET_ERROR_VAL errorVal);
++void ar6000_cac_event(struct ar6_softc *ar, A_UINT8 ac, A_UINT8 cac_indication,
++ A_UINT8 statusCode, A_UINT8 *tspecSuggestion);
++void ar6000_hbChallengeResp_event(struct ar6_softc *, A_UINT32 cookie, A_UINT32 source);
++void
++ar6000_roam_tbl_event(struct ar6_softc *ar, WMI_TARGET_ROAM_TBL *pTbl);
++
++void
++ar6000_roam_data_event(struct ar6_softc *ar, WMI_TARGET_ROAM_DATA *p);
++
++void
++ar6000_wow_list_event(struct ar6_softc *ar, A_UINT8 num_filters,
++ WMI_GET_WOW_LIST_REPLY *wow_reply);
++
++void ar6000_pmkid_list_event(void *devt, A_UINT8 numPMKID,
++ WMI_PMKID *pmkidList);
++
++void ar6000_gpio_intr_rx(A_UINT32 intr_mask, A_UINT32 input_values);
++void ar6000_gpio_data_rx(A_UINT32 reg_id, A_UINT32 value);
++void ar6000_gpio_ack_rx(void);
++
++void ar6000_dbglog_init_done(struct ar6_softc *ar);
++
++#ifdef SEND_EVENT_TO_APP
++void ar6000_send_event_to_app(struct ar6_softc *ar, A_UINT16 eventId, A_UINT8 *datap, int len);
++#endif
++
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++void ar6000_tcmd_rx_report_event(void *devt, A_UINT8 * results, int len);
++#endif
++
++void ar6000_tx_retry_err_event(void *devt);
++
++void ar6000_snrThresholdEvent_rx(void *devt,
++ WMI_SNR_THRESHOLD_VAL newThreshold,
++ A_UINT8 snr);
++
++void ar6000_lqThresholdEvent_rx(void *devt, WMI_LQ_THRESHOLD_VAL range, A_UINT8 lqVal);
++
++
++void ar6000_ratemask_rx(void *devt, A_UINT16 ratemask);
++
++A_STATUS ar6000_get_driver_cfg(struct net_device *dev,
++ A_UINT16 cfgParam,
++ void *result);
++void ar6000_bssInfo_event_rx(struct ar6_softc *ar, A_UINT8 *data, int len);
++
++void ar6000_dbglog_event(struct ar6_softc *ar, A_UINT32 dropped,
++ A_INT8 *buffer, A_UINT32 length);
++
++int ar6000_dbglog_get_debug_logs(struct ar6_softc *ar);
++
++void ar6000_indicate_tx_activity(void *devt, A_UINT8 trafficClass, A_BOOL Active);
++
++void ar6000_dset_open_req(void *devt,
++ A_UINT32 id,
++ A_UINT32 targ_handle,
++ A_UINT32 targ_reply_fn,
++ A_UINT32 targ_reply_arg);
++void ar6000_dset_close(void *devt, A_UINT32 access_cookie);
++void ar6000_dset_data_req(void *devt,
++ A_UINT32 access_cookie,
++ A_UINT32 offset,
++ A_UINT32 length,
++ A_UINT32 targ_buf,
++ A_UINT32 targ_reply_fn,
++ A_UINT32 targ_reply_arg);
++
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/athdrv_linux.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/athdrv_linux.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/athdrv_linux.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/athdrv_linux.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,993 @@
++/*
++ * Copyright (c) 2004-2006 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef _ATHDRV_LINUX_H
++#define _ATHDRV_LINUX_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++/*
++ * There are two types of ioctl's here: Standard ioctls and
++ * eXtended ioctls. All extended ioctls (XIOCTL) are multiplexed
++ * off of the single ioctl command, AR6000_IOCTL_EXTENDED. The
++ * arguments for every XIOCTL starts with a 32-bit command word
++ * that is used to select which extended ioctl is in use. After
++ * the command word are command-specific arguments.
++ */
++
++/* Linux standard Wireless Extensions, private ioctl interfaces */
++#define IEEE80211_IOCTL_SETPARAM (SIOCIWFIRSTPRIV+0)
++#define IEEE80211_IOCTL_GETPARAM (SIOCIWFIRSTPRIV+1)
++#define IEEE80211_IOCTL_SETKEY (SIOCIWFIRSTPRIV+2)
++#define IEEE80211_IOCTL_SETWMMPARAMS (SIOCIWFIRSTPRIV+3)
++#define IEEE80211_IOCTL_DELKEY (SIOCIWFIRSTPRIV+4)
++#define IEEE80211_IOCTL_GETWMMPARAMS (SIOCIWFIRSTPRIV+5)
++#define IEEE80211_IOCTL_SETOPTIE (SIOCIWFIRSTPRIV+6)
++#define IEEE80211_IOCTL_SETMLME (SIOCIWFIRSTPRIV+7)
++//#define IEEE80211_IOCTL_GETOPTIE (SIOCIWFIRSTPRIV+7)
++#define IEEE80211_IOCTL_ADDPMKID (SIOCIWFIRSTPRIV+8)
++//#define IEEE80211_IOCTL_SETAUTHALG (SIOCIWFIRSTPRIV+10)
++#define IEEE80211_IOCTL_LASTONE (SIOCIWFIRSTPRIV+9)
++
++
++
++/* ====WMI Ioctls==== */
++/*
++ *
++ * Many ioctls simply provide WMI services to application code:
++ * an application makes such an ioctl call with a set of arguments
++ * that are packaged into the corresponding WMI message, and sent
++ * to the Target.
++ */
++
++#define AR6000_IOCTL_WMI_GETREV (SIOCIWFIRSTPRIV+10)
++/*
++ * arguments:
++ * ar6000_version *revision
++ */
++
++#define AR6000_IOCTL_WMI_SETPWR (SIOCIWFIRSTPRIV+11)
++/*
++ * arguments:
++ * WMI_POWER_MODE_CMD pwrModeCmd (see include/wmi.h)
++ * uses: WMI_SET_POWER_MODE_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SETSCAN (SIOCIWFIRSTPRIV+12)
++/*
++ * arguments:
++ * WMI_SCAN_PARAMS_CMD scanParams (see include/wmi.h)
++ * uses: WMI_SET_SCAN_PARAMS_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SETLISTENINT (SIOCIWFIRSTPRIV+13)
++/*
++ * arguments:
++ * UINT32 listenInterval
++ * uses: WMI_SET_LISTEN_INT_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SETBSSFILTER (SIOCIWFIRSTPRIV+14)
++/*
++ * arguments:
++ * WMI_BSS_FILTER filter (see include/wmi.h)
++ * uses: WMI_SET_BSS_FILTER_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SET_CHANNELPARAMS (SIOCIWFIRSTPRIV+16)
++/*
++ * arguments:
++ * WMI_CHANNEL_PARAMS_CMD chParams
++ * uses: WMI_SET_CHANNEL_PARAMS_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SET_PROBEDSSID (SIOCIWFIRSTPRIV+17)
++/*
++ * arguments:
++ * WMI_PROBED_SSID_CMD probedSsids (see include/wmi.h)
++ * uses: WMI_SETPROBED_SSID_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SET_PMPARAMS (SIOCIWFIRSTPRIV+18)
++/*
++ * arguments:
++ * WMI_POWER_PARAMS_CMD powerParams (see include/wmi.h)
++ * uses: WMI_SET_POWER_PARAMS_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SET_BADAP (SIOCIWFIRSTPRIV+19)
++/*
++ * arguments:
++ * WMI_ADD_BAD_AP_CMD badAPs (see include/wmi.h)
++ * uses: WMI_ADD_BAD_AP_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_GET_QOS_QUEUE (SIOCIWFIRSTPRIV+20)
++/*
++ * arguments:
++ * ar6000_queuereq queueRequest (see below)
++ */
++
++#define AR6000_IOCTL_WMI_CREATE_QOS (SIOCIWFIRSTPRIV+21)
++/*
++ * arguments:
++ * WMI_CREATE_PSTREAM createPstreamCmd (see include/wmi.h)
++ * uses: WMI_CREATE_PSTREAM_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_DELETE_QOS (SIOCIWFIRSTPRIV+22)
++/*
++ * arguments:
++ * WMI_DELETE_PSTREAM_CMD deletePstreamCmd (see include/wmi.h)
++ * uses: WMI_DELETE_PSTREAM_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SET_SNRTHRESHOLD (SIOCIWFIRSTPRIV+23)
++/*
++ * arguments:
++ * WMI_SNR_THRESHOLD_PARAMS_CMD thresholdParams (see include/wmi.h)
++ * uses: WMI_SNR_THRESHOLD_PARAMS_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SET_ERROR_REPORT_BITMASK (SIOCIWFIRSTPRIV+24)
++/*
++ * arguments:
++ * WMI_TARGET_ERROR_REPORT_BITMASK errorReportBitMask (see include/wmi.h)
++ * uses: WMI_TARGET_ERROR_REPORT_BITMASK_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_GET_TARGET_STATS (SIOCIWFIRSTPRIV+25)
++/*
++ * arguments:
++ * TARGET_STATS *targetStats (see below)
++ * uses: WMI_GET_STATISTICS_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SET_ASSOC_INFO (SIOCIWFIRSTPRIV+26)
++/*
++ * arguments:
++ * WMI_SET_ASSOC_INFO_CMD setAssocInfoCmd
++ * uses: WMI_SET_ASSOC_INFO_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SET_ACCESS_PARAMS (SIOCIWFIRSTPRIV+27)
++/*
++ * arguments:
++ * WMI_SET_ACCESS_PARAMS_CMD setAccessParams (see include/wmi.h)
++ * uses: WMI_SET_ACCESS_PARAMS_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SET_BMISS_TIME (SIOCIWFIRSTPRIV+28)
++/*
++ * arguments:
++ * UINT32 beaconMissTime
++ * uses: WMI_SET_BMISS_TIME_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SET_DISC_TIMEOUT (SIOCIWFIRSTPRIV+29)
++/*
++ * arguments:
++ * WMI_DISC_TIMEOUT_CMD disconnectTimeoutCmd (see include/wmi.h)
++ * uses: WMI_SET_DISC_TIMEOUT_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SET_IBSS_PM_CAPS (SIOCIWFIRSTPRIV+30)
++/*
++ * arguments:
++ * WMI_IBSS_PM_CAPS_CMD ibssPowerMgmtCapsCmd
++ * uses: WMI_SET_IBSS_PM_CAPS_CMDID
++ */
++
++/*
++ * There is a very small space available for driver-private
++ * wireless ioctls. In order to circumvent this limitation,
++ * we multiplex a bunch of ioctls (XIOCTLs) on top of a
++ * single AR6000_IOCTL_EXTENDED ioctl.
++ */
++#define AR6000_IOCTL_EXTENDED (SIOCIWFIRSTPRIV+31)
++
++
++/* ====BMI Extended Ioctls==== */
++
++#define AR6000_XIOCTL_BMI_DONE 1
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_BMI_DONE)
++ * uses: BMI_DONE
++ */
++
++#define AR6000_XIOCTL_BMI_READ_MEMORY 2
++/*
++ * arguments:
++ * union {
++ * struct {
++ * UINT32 cmd (AR6000_XIOCTL_BMI_READ_MEMORY)
++ * UINT32 address
++ * UINT32 length
++ * }
++ * char results[length]
++ * }
++ * uses: BMI_READ_MEMORY
++ */
++
++#define AR6000_XIOCTL_BMI_WRITE_MEMORY 3
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_BMI_WRITE_MEMORY)
++ * UINT32 address
++ * UINT32 length
++ * char data[length]
++ * uses: BMI_WRITE_MEMORY
++ */
++
++#define AR6000_XIOCTL_BMI_EXECUTE 4
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_BMI_EXECUTE)
++ * UINT32 TargetAddress
++ * UINT32 parameter
++ * uses: BMI_EXECUTE
++ */
++
++#define AR6000_XIOCTL_BMI_SET_APP_START 5
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_BMI_SET_APP_START)
++ * UINT32 TargetAddress
++ * uses: BMI_SET_APP_START
++ */
++
++#define AR6000_XIOCTL_BMI_READ_SOC_REGISTER 6
++/*
++ * arguments:
++ * union {
++ * struct {
++ * UINT32 cmd (AR6000_XIOCTL_BMI_READ_SOC_REGISTER)
++ * UINT32 TargetAddress, 32-bit aligned
++ * }
++ * UINT32 result
++ * }
++ * uses: BMI_READ_SOC_REGISTER
++ */
++
++#define AR6000_XIOCTL_BMI_WRITE_SOC_REGISTER 7
++/*
++ * arguments:
++ * struct {
++ * UINT32 cmd (AR6000_XIOCTL_BMI_WRITE_SOC_REGISTER)
++ * UINT32 TargetAddress, 32-bit aligned
++ * UINT32 newValue
++ * }
++ * uses: BMI_WRITE_SOC_REGISTER
++ */
++
++#define AR6000_XIOCTL_BMI_TEST 8
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_BMI_TEST)
++ * UINT32 address
++ * UINT32 length
++ * UINT32 count
++ */
++
++
++
++/* Historical Host-side DataSet support */
++#define AR6000_XIOCTL_UNUSED9 9
++#define AR6000_XIOCTL_UNUSED10 10
++#define AR6000_XIOCTL_UNUSED11 11
++
++/* ====Misc Extended Ioctls==== */
++
++#define AR6000_XIOCTL_FORCE_TARGET_RESET 12
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_FORCE_TARGET_RESET)
++ */
++
++
++#ifdef HTC_RAW_INTERFACE
++/* HTC Raw Interface Ioctls */
++#define AR6000_XIOCTL_HTC_RAW_OPEN 13
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_HTC_RAW_OPEN)
++ */
++
++#define AR6000_XIOCTL_HTC_RAW_CLOSE 14
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_HTC_RAW_CLOSE)
++ */
++
++#define AR6000_XIOCTL_HTC_RAW_READ 15
++/*
++ * arguments:
++ * union {
++ * struct {
++ * UINT32 cmd (AR6000_XIOCTL_HTC_RAW_READ)
++ * UINT32 mailboxID
++ * UINT32 length
++ * }
++ * results[length]
++ * }
++ */
++
++#define AR6000_XIOCTL_HTC_RAW_WRITE 16
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_HTC_RAW_WRITE)
++ * UINT32 mailboxID
++ * UINT32 length
++ * char buffer[length]
++ */
++#endif /* HTC_RAW_INTERFACE */
++
++#define AR6000_XIOCTL_CHECK_TARGET_READY 17
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_CHECK_TARGET_READY)
++ */
++
++
++
++/* ====GPIO (General Purpose I/O) Extended Ioctls==== */
++
++#define AR6000_XIOCTL_GPIO_OUTPUT_SET 18
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_GPIO_OUTPUT_SET)
++ * ar6000_gpio_output_set_cmd_s (see below)
++ * uses: WMIX_GPIO_OUTPUT_SET_CMDID
++ */
++
++#define AR6000_XIOCTL_GPIO_INPUT_GET 19
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_GPIO_INPUT_GET)
++ * uses: WMIX_GPIO_INPUT_GET_CMDID
++ */
++
++#define AR6000_XIOCTL_GPIO_REGISTER_SET 20
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_GPIO_REGISTER_SET)
++ * ar6000_gpio_register_cmd_s (see below)
++ * uses: WMIX_GPIO_REGISTER_SET_CMDID
++ */
++
++#define AR6000_XIOCTL_GPIO_REGISTER_GET 21
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_GPIO_REGISTER_GET)
++ * ar6000_gpio_register_cmd_s (see below)
++ * uses: WMIX_GPIO_REGISTER_GET_CMDID
++ */
++
++#define AR6000_XIOCTL_GPIO_INTR_ACK 22
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_GPIO_INTR_ACK)
++ * ar6000_cpio_intr_ack_cmd_s (see below)
++ * uses: WMIX_GPIO_INTR_ACK_CMDID
++ */
++
++#define AR6000_XIOCTL_GPIO_INTR_WAIT 23
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_GPIO_INTR_WAIT)
++ */
++
++
++
++/* ====more wireless commands==== */
++
++#define AR6000_XIOCTL_SET_ADHOC_BSSID 24
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_SET_ADHOC_BSSID)
++ * WMI_SET_ADHOC_BSSID_CMD setAdHocBssidCmd (see include/wmi.h)
++ */
++
++#define AR6000_XIOCTL_SET_OPT_MODE 25
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_SET_OPT_MODE)
++ * WMI_SET_OPT_MODE_CMD setOptModeCmd (see include/wmi.h)
++ * uses: WMI_SET_OPT_MODE_CMDID
++ */
++
++#define AR6000_XIOCTL_OPT_SEND_FRAME 26
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_OPT_SEND_FRAME)
++ * WMI_OPT_TX_FRAME_CMD optTxFrameCmd (see include/wmi.h)
++ * uses: WMI_OPT_TX_FRAME_CMDID
++ */
++
++#define AR6000_XIOCTL_SET_ADHOC_BEACON_INTVAL 27
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_SET_ADHOC_BEACON_INTVAL)
++ * WMI_BEACON_INT_CMD beaconIntCmd (see include/wmi.h)
++ * uses: WMI_SET_BEACON_INT_CMDID
++ */
++
++
++#define IEEE80211_IOCTL_SETAUTHALG 28
++
++
++#define AR6000_XIOCTL_SET_VOICE_PKT_SIZE 29
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_SET_VOICE_PKT_SIZE)
++ * WMI_SET_VOICE_PKT_SIZE_CMD setVoicePktSizeCmd (see include/wmi.h)
++ * uses: WMI_SET_VOICE_PKT_SIZE_CMDID
++ */
++
++
++#define AR6000_XIOCTL_SET_MAX_SP 30
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_SET_MAX_SP)
++ * WMI_SET_MAX_SP_LEN_CMD maxSPLen(see include/wmi.h)
++ * uses: WMI_SET_MAX_SP_LEN_CMDID
++ */
++
++#define AR6000_XIOCTL_WMI_GET_ROAM_TBL 31
++
++#define AR6000_XIOCTL_WMI_SET_ROAM_CTRL 32
++
++#define AR6000_XIOCTRL_WMI_SET_POWERSAVE_TIMERS 33
++
++
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTRL_WMI_SET_POWERSAVE_TIMERS)
++ * WMI_SET_POWERSAVE_TIMERS_CMD powerSaveTimers(see include/wmi.h)
++ * WMI_SET_POWERSAVE_TIMERS_CMDID
++ */
++
++#define AR6000_XIOCTRL_WMI_GET_POWER_MODE 34
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTRL_WMI_GET_POWER_MODE)
++ */
++
++#define AR6000_XIOCTRL_WMI_SET_WLAN_STATE 35
++typedef enum {
++ WLAN_DISABLED,
++ WLAN_ENABLED
++} AR6000_WLAN_STATE;
++/*
++ * arguments:
++ * enable/disable
++ */
++
++#define AR6000_XIOCTL_WMI_GET_ROAM_DATA 36
++
++#define AR6000_XIOCTL_WMI_SETRETRYLIMITS 37
++/*
++ * arguments:
++ * WMI_SET_RETRY_LIMITS_CMD ibssSetRetryLimitsCmd
++ * uses: WMI_SET_RETRY_LIMITS_CMDID
++ */
++
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++/* ====extended commands for radio test ==== */
++
++#define AR6000_XIOCTL_TCMD_CONT_TX 38
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_TCMD_CONT_TX)
++ * WMI_TCMD_CONT_TX_CMD contTxCmd (see include/wmi.h)
++ * uses: WMI_TCMD_CONT_TX_CMDID
++ */
++
++#define AR6000_XIOCTL_TCMD_CONT_RX 39
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_TCMD_CONT_RX)
++ * WMI_TCMD_CONT_RX_CMD rxCmd (see include/wmi.h)
++ * uses: WMI_TCMD_CONT_RX_CMDID
++ */
++
++#define AR6000_XIOCTL_TCMD_PM 40
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_TCMD_PM)
++ * WMI_TCMD_PM_CMD pmCmd (see include/wmi.h)
++ * uses: WMI_TCMD_PM_CMDID
++ */
++
++#endif /* CONFIG_HOST_TCMD_SUPPORT */
++
++#define AR6000_XIOCTL_WMI_STARTSCAN 41
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_WMI_STARTSCAN)
++ * UINT8 scanType
++ * UINT8 scanConnected
++ * A_BOOL forceFgScan
++ * uses: WMI_START_SCAN_CMDID
++ */
++
++#define AR6000_XIOCTL_WMI_SETFIXRATES 42
++
++#define AR6000_XIOCTL_WMI_GETFIXRATES 43
++
++
++#define AR6000_XIOCTL_WMI_SET_RSSITHRESHOLD 44
++/*
++ * arguments:
++ * WMI_RSSI_THRESHOLD_PARAMS_CMD thresholdParams (see include/wmi.h)
++ * uses: WMI_RSSI_THRESHOLD_PARAMS_CMDID
++ */
++
++#define AR6000_XIOCTL_WMI_CLR_RSSISNR 45
++/*
++ * arguments:
++ * WMI_CLR_RSSISNR_CMD thresholdParams (see include/wmi.h)
++ * uses: WMI_CLR_RSSISNR_CMDID
++ */
++
++#define AR6000_XIOCTL_WMI_SET_LQTHRESHOLD 46
++/*
++ * arguments:
++ * WMI_LQ_THRESHOLD_PARAMS_CMD thresholdParams (see include/wmi.h)
++ * uses: WMI_LQ_THRESHOLD_PARAMS_CMDID
++ */
++
++#define AR6000_XIOCTL_WMI_SET_RTS 47
++/*
++ * arguments:
++ * WMI_SET_RTS_MODE_CMD (see include/wmi.h)
++ * uses: WMI_SET_RTS_MODE_CMDID
++ */
++
++#define AR6000_XIOCTL_WMI_SET_LPREAMBLE 48
++
++#define AR6000_XIOCTL_WMI_SET_AUTHMODE 49
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_WMI_SET_AUTHMODE)
++ * UINT8 mode
++ * uses: WMI_SET_RECONNECT_AUTH_MODE_CMDID
++ */
++
++#define AR6000_XIOCTL_WMI_SET_REASSOCMODE 50
++
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_WMI_SET_WMM)
++ * UINT8 mode
++ * uses: WMI_SET_WMM_CMDID
++ */
++#define AR6000_XIOCTL_WMI_SET_WMM 51
++
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_WMI_SET_HB_CHALLENGE_RESP_PARAMS)
++ * UINT32 frequency
++ * UINT8 threshold
++ */
++#define AR6000_XIOCTL_WMI_SET_HB_CHALLENGE_RESP_PARAMS 52
++
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_WMI_GET_HB_CHALLENGE_RESP)
++ * UINT32 cookie
++ */
++#define AR6000_XIOCTL_WMI_GET_HB_CHALLENGE_RESP 53
++
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_WMI_GET_RD)
++ * UINT32 regDomain
++ */
++#define AR6000_XIOCTL_WMI_GET_RD 54
++
++#define AR6000_XIOCTL_DIAG_READ 55
++
++#define AR6000_XIOCTL_DIAG_WRITE 56
++
++/*
++ * arguments cmd (AR6000_XIOCTL_SET_TXOP)
++ * WMI_TXOP_CFG txopEnable
++ */
++#define AR6000_XIOCTL_WMI_SET_TXOP 57
++
++#ifdef USER_KEYS
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_USER_SETKEYS)
++ * UINT32 keyOpCtrl
++ * uses AR6000_USER_SETKEYS_INFO
++ */
++#define AR6000_XIOCTL_USER_SETKEYS 58
++#endif /* USER_KEYS */
++
++#define AR6000_XIOCTL_WMI_SET_KEEPALIVE 59
++/*
++ * arguments:
++ * UINT8 cmd (AR6000_XIOCTL_WMI_SET_KEEPALIVE)
++ * UINT8 keepaliveInterval
++ * uses: WMI_SET_KEEPALIVE_CMDID
++ */
++
++#define AR6000_XIOCTL_WMI_GET_KEEPALIVE 60
++/*
++ * arguments:
++ * UINT8 cmd (AR6000_XIOCTL_WMI_GET_KEEPALIVE)
++ * UINT8 keepaliveInterval
++ * A_BOOL configured
++ * uses: WMI_GET_KEEPALIVE_CMDID
++ */
++
++/* ====ROM Patching Extended Ioctls==== */
++
++#define AR6000_XIOCTL_BMI_ROMPATCH_INSTALL 61
++/*
++ * arguments:
++ * union {
++ * struct {
++ * UINT32 cmd (AR6000_XIOCTL_BMI_ROMPATCH_INSTALL)
++ * UINT32 ROM Address
++ * UINT32 RAM Address
++ * UINT32 number of bytes
++ * UINT32 activate? (0 or 1)
++ * }
++ * A_UINT32 resulting rompatch ID
++ * }
++ * uses: BMI_ROMPATCH_INSTALL
++ */
++
++#define AR6000_XIOCTL_BMI_ROMPATCH_UNINSTALL 62
++/*
++ * arguments:
++ * struct {
++ * UINT32 cmd (AR6000_XIOCTL_BMI_ROMPATCH_UNINSTALL)
++ * UINT32 rompatch ID
++ * }
++ * uses: BMI_ROMPATCH_UNINSTALL
++ */
++
++#define AR6000_XIOCTL_BMI_ROMPATCH_ACTIVATE 63
++/*
++ * arguments:
++ * struct {
++ * UINT32 cmd (AR6000_XIOCTL_BMI_ROMPATCH_ACTIVATE)
++ * UINT32 rompatch count
++ * UINT32 rompatch IDs[rompatch count]
++ * }
++ * uses: BMI_ROMPATCH_ACTIVATE
++ */
++
++#define AR6000_XIOCTL_BMI_ROMPATCH_DEACTIVATE 64
++/*
++ * arguments:
++ * struct {
++ * UINT32 cmd (AR6000_XIOCTL_BMI_ROMPATCH_DEACTIVATE)
++ * UINT32 rompatch count
++ * UINT32 rompatch IDs[rompatch count]
++ * }
++ * uses: BMI_ROMPATCH_DEACTIVATE
++ */
++
++#define AR6000_XIOCTL_WMI_SET_APPIE 65
++/*
++ * arguments:
++ * struct {
++ * UINT32 cmd (AR6000_XIOCTL_WMI_SET_APPIE)
++ * UINT32 app_frmtype;
++ * UINT32 app_buflen;
++ * UINT8 app_buf[];
++ * }
++ */
++#define AR6000_XIOCTL_WMI_SET_MGMT_FRM_RX_FILTER 66
++/*
++ * arguments:
++ * A_UINT32 filter_type;
++ */
++
++#define AR6000_XIOCTL_DBGLOG_CFG_MODULE 67
++
++#define AR6000_XIOCTL_DBGLOG_GET_DEBUG_LOGS 68
++
++#define AR6000_XIOCTL_WMI_SET_WSC_STATUS 70
++/*
++ * arguments:
++ * A_UINT32 wsc_status;
++ * (WSC_REG_INACTIVE or WSC_REG_ACTIVE)
++ */
++
++/*
++ * arguments:
++ * struct {
++ * A_UINT8 streamType;
++ * A_UINT8 status;
++ * }
++ * uses: WMI_SET_BT_STATUS_CMDID
++ */
++#define AR6000_XIOCTL_WMI_SET_BT_STATUS 71
++
++/*
++ * arguments:
++ * struct {
++ * A_UINT8 paramType;
++ * union {
++ * A_UINT8 noSCOPkts;
++ * BT_PARAMS_A2DP a2dpParams;
++ * BT_COEX_REGS regs;
++ * };
++ * }
++ * uses: WMI_SET_BT_PARAM_CMDID
++ */
++#define AR6000_XIOCTL_WMI_SET_BT_PARAMS 72
++
++#define AR6000_XIOCTL_WMI_SET_HOST_SLEEP_MODE 73
++#define AR6000_XIOCTL_WMI_SET_WOW_MODE 74
++#define AR6000_XIOCTL_WMI_GET_WOW_LIST 75
++#define AR6000_XIOCTL_WMI_ADD_WOW_PATTERN 76
++#define AR6000_XIOCTL_WMI_DEL_WOW_PATTERN 77
++
++
++
++#define AR6000_XIOCTL_TARGET_INFO 78
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_TARGET_INFO)
++ * A_UINT32 TargetVersion (returned)
++ * A_UINT32 TargetType (returned)
++ * (See also bmi_msg.h target_ver and target_type)
++ */
++
++#define AR6000_XIOCTL_DUMP_HTC_CREDIT_STATE 79
++/*
++ * arguments:
++ * none
++ */
++
++#define AR6000_XIOCTL_TRAFFIC_ACTIVITY_CHANGE 80
++/*
++ * This ioctl is used to emulate traffic activity
++ * timeouts. Activity/inactivity will trigger the driver
++ * to re-balance credits.
++ *
++ * arguments:
++ * ar6000_traffic_activity_change
++ */
++
++#define AR6000_XIOCTL_WMI_SET_CONNECT_CTRL_FLAGS 81
++/*
++ * This ioctl is used to set the connect control flags
++ *
++ * arguments:
++ * A_UINT32 connectCtrlFlags
++ */
++
++#define AR6000_XIOCTL_WMI_SET_AKMP_PARAMS 82
++/*
++ * This IOCTL sets any Authentication,Key Management and Protection
++ * related parameters. This is used along with the information set in
++ * Connect Command.
++ * Currently this enables Multiple PMKIDs to an AP.
++ *
++ * arguments:
++ * struct {
++ * A_UINT32 akmpInfo;
++ * }
++ * uses: WMI_SET_AKMP_PARAMS_CMD
++ */
++
++#define AR6000_XIOCTL_WMI_GET_PMKID_LIST 83
++
++#define AR6000_XIOCTL_WMI_SET_PMKID_LIST 84
++/*
++ * This IOCTL is used to set a list of PMKIDs. This list of
++ * PMKIDs is used in the [Re]AssocReq Frame. This list is used
++ * only if the MultiPMKID option is enabled via the
++ * AR6000_XIOCTL_WMI_SET_AKMP_PARAMS IOCTL.
++ *
++ * arguments:
++ * struct {
++ * A_UINT32 numPMKID;
++ * WMI_PMKID pmkidList[WMI_MAX_PMKID_CACHE];
++ * }
++ * uses: WMI_SET_PMKIDLIST_CMD
++ */
++
++/* Historical DSETPATCH support for INI patches */
++#define AR6000_XIOCTL_UNUSED90 90
++
++
++
++/* used by AR6000_IOCTL_WMI_GETREV */
++struct ar6000_version {
++ A_UINT32 host_ver;
++ A_UINT32 target_ver;
++};
++
++/* used by AR6000_IOCTL_WMI_GET_QOS_QUEUE */
++struct ar6000_queuereq {
++ A_UINT8 trafficClass;
++ A_UINT16 activeTsids;
++};
++
++/* used by AR6000_IOCTL_WMI_GET_TARGET_STATS */
++typedef struct targetStats_t {
++ A_UINT64 tx_packets;
++ A_UINT64 tx_bytes;
++ A_UINT64 tx_unicast_pkts;
++ A_UINT64 tx_unicast_bytes;
++ A_UINT64 tx_multicast_pkts;
++ A_UINT64 tx_multicast_bytes;
++ A_UINT64 tx_broadcast_pkts;
++ A_UINT64 tx_broadcast_bytes;
++ A_UINT64 tx_rts_success_cnt;
++ A_UINT64 tx_packet_per_ac[4];
++
++ A_UINT64 tx_errors;
++ A_UINT64 tx_failed_cnt;
++ A_UINT64 tx_retry_cnt;
++ A_UINT64 tx_rts_fail_cnt;
++ A_INT32 tx_unicast_rate;
++ A_UINT64 rx_packets;
++ A_UINT64 rx_bytes;
++ A_UINT64 rx_unicast_pkts;
++ A_UINT64 rx_unicast_bytes;
++ A_UINT64 rx_multicast_pkts;
++ A_UINT64 rx_multicast_bytes;
++ A_UINT64 rx_broadcast_pkts;
++ A_UINT64 rx_broadcast_bytes;
++ A_UINT64 rx_fragment_pkt;
++
++ A_UINT64 rx_errors;
++ A_UINT64 rx_crcerr;
++ A_UINT64 rx_key_cache_miss;
++ A_UINT64 rx_decrypt_err;
++ A_UINT64 rx_duplicate_frames;
++ A_INT32 rx_unicast_rate;
++
++ A_UINT64 tkip_local_mic_failure;
++ A_UINT64 tkip_counter_measures_invoked;
++ A_UINT64 tkip_replays;
++ A_UINT64 tkip_format_errors;
++ A_UINT64 ccmp_format_errors;
++ A_UINT64 ccmp_replays;
++
++ A_UINT64 power_save_failure_cnt;
++ A_INT16 noise_floor_calibation;
++
++ A_UINT64 cs_bmiss_cnt;
++ A_UINT64 cs_lowRssi_cnt;
++ A_UINT64 cs_connect_cnt;
++ A_UINT64 cs_disconnect_cnt;
++ A_UINT8 cs_aveBeacon_snr;
++ A_INT16 cs_aveBeacon_rssi;
++ A_UINT8 cs_lastRoam_msec;
++ A_UINT8 cs_snr;
++ A_INT16 cs_rssi;
++
++ A_UINT32 lq_val;
++
++ A_UINT32 wow_num_pkts_dropped;
++ A_UINT8 wow_num_host_pkt_wakeups;
++ A_UINT8 wow_num_host_event_wakeups;
++ A_UINT16 wow_num_events_discarded;
++
++}TARGET_STATS;
++
++typedef struct targetStats_cmd_t {
++ TARGET_STATS targetStats;
++ int clearStats;
++} TARGET_STATS_CMD;
++
++/* used by AR6000_XIOCTL_USER_SETKEYS */
++
++/*
++ * Setting this bit to 1 doesnot initialize the RSC on the firmware
++ */
++#define AR6000_XIOCTL_USER_SETKEYS_RSC_CTRL 1
++#define AR6000_USER_SETKEYS_RSC_UNCHANGED 0x00000002
++
++typedef struct {
++ A_UINT32 keyOpCtrl; /* Bit Map of Key Mgmt Ctrl Flags */
++} AR6000_USER_SETKEYS_INFO;
++
++
++/* used by AR6000_XIOCTL_GPIO_OUTPUT_SET */
++struct ar6000_gpio_output_set_cmd_s {
++ A_UINT32 set_mask;
++ A_UINT32 clear_mask;
++ A_UINT32 enable_mask;
++ A_UINT32 disable_mask;
++};
++
++/*
++ * used by AR6000_XIOCTL_GPIO_REGISTER_GET and AR6000_XIOCTL_GPIO_REGISTER_SET
++ */
++struct ar6000_gpio_register_cmd_s {
++ A_UINT32 gpioreg_id;
++ A_UINT32 value;
++};
++
++/* used by AR6000_XIOCTL_GPIO_INTR_ACK */
++struct ar6000_gpio_intr_ack_cmd_s {
++ A_UINT32 ack_mask;
++};
++
++/* used by AR6000_XIOCTL_GPIO_INTR_WAIT */
++struct ar6000_gpio_intr_wait_cmd_s {
++ A_UINT32 intr_mask;
++ A_UINT32 input_values;
++};
++
++/* used by the AR6000_XIOCTL_DBGLOG_CFG_MODULE */
++typedef struct ar6000_dbglog_module_config_s {
++ A_UINT32 valid;
++ A_UINT16 mmask;
++ A_UINT16 tsr;
++ A_BOOL rep;
++ A_UINT16 size;
++} DBGLOG_MODULE_CONFIG;
++
++typedef struct user_rssi_thold_t {
++ A_INT16 tag;
++ A_INT16 rssi;
++} USER_RSSI_THOLD;
++
++typedef struct user_rssi_params_t {
++ A_UINT8 weight;
++ A_UINT32 pollTime;
++ USER_RSSI_THOLD tholds[12];
++} USER_RSSI_PARAMS;
++
++/*
++ * Host driver may have some config parameters. Typically, these
++ * config params are one time config parameters. These could
++ * correspond to any of the underlying modules. Host driver exposes
++ * an api for the underlying modules to get this config.
++ */
++#define AR6000_DRIVER_CFG_BASE 0x8000
++
++/* Should driver perform wlan node caching? */
++#define AR6000_DRIVER_CFG_GET_WLANNODECACHING 0x8001
++/*Should we log raw WMI msgs */
++#define AR6000_DRIVER_CFG_LOG_RAW_WMI_MSGS 0x8002
++
++/* used by AR6000_XIOCTL_DIAG_READ & AR6000_XIOCTL_DIAG_WRITE */
++struct ar6000_diag_window_cmd_s {
++ unsigned int addr;
++ unsigned int value;
++};
++
++
++struct ar6000_traffic_activity_change {
++ A_UINT32 StreamID; /* stream ID to indicate activity change */
++ A_UINT32 Active; /* active (1) or inactive (0) */
++};
++
++#ifdef __cplusplus
++}
++#endif
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/athtypes_linux.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/athtypes_linux.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/athtypes_linux.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/athtypes_linux.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,47 @@
++/*
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/os/linux/include/athtypes_linux.h#1 $
++ *
++ * This file contains the definitions of the basic atheros data types.
++ * It is used to map the data types in atheros files to a platform specific
++ * type.
++ *
++ * Copyright 2003-2005 Atheros Communications, Inc., All Rights Reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef _ATHTYPES_LINUX_H_
++#define _ATHTYPES_LINUX_H_
++
++#ifdef __KERNEL__
++#include <linux/types.h>
++#endif
++
++typedef int8_t A_INT8;
++typedef int16_t A_INT16;
++typedef int32_t A_INT32;
++typedef int64_t A_INT64;
++
++typedef u_int8_t A_UINT8;
++typedef u_int16_t A_UINT16;
++typedef u_int32_t A_UINT32;
++typedef u_int64_t A_UINT64;
++
++typedef int A_BOOL;
++typedef char A_CHAR;
++typedef unsigned char A_UCHAR;
++typedef unsigned long A_ATH_TIMER;
++
++
++#endif /* _ATHTYPES_LINUX_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/config_linux.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/config_linux.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/config_linux.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/config_linux.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,44 @@
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef _CONFIG_LINUX_H_
++#define _CONFIG_LINUX_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*
++ * Host-side GPIO support is optional.
++ * If run-time access to GPIO pins is not required, then
++ * this should be changed to #undef.
++ */
++#define CONFIG_HOST_GPIO_SUPPORT
++
++/*
++ * Host side Test Command support
++ */
++#define CONFIG_HOST_TCMD_SUPPORT
++
++#define USE_4BYTE_REGISTER_ACCESS
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/debug_linux.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/debug_linux.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/debug_linux.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/debug_linux.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,86 @@
++/*
++ * Copyright (c) 2004-2006 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef _DEBUG_LINUX_H_
++#define _DEBUG_LINUX_H_
++
++#define DBG_DEFAULTS (DBG_ERROR|DBG_WARNING)
++
++extern A_UINT32 g_dbg_flags;
++
++#define DBGFMT "%s() : "
++#define DBGARG __func__
++#define DBGFN A_PRINTF
++
++/* ------- Debug related stuff ------- */
++enum {
++ ATH_DEBUG_SEND = 0x0001,
++ ATH_DEBUG_RECV = 0x0002,
++ ATH_DEBUG_SYNC = 0x0004,
++ ATH_DEBUG_DUMP = 0x0008,
++ ATH_DEBUG_IRQ = 0x0010,
++ ATH_DEBUG_TRC = 0x0020,
++ ATH_DEBUG_WARN = 0x0040,
++ ATH_DEBUG_ERR = 0x0080,
++ ATH_LOG_INF = 0x0100,
++ ATH_DEBUG_BMI = 0x0110,
++ ATH_DEBUG_WMI = 0x0120,
++ ATH_DEBUG_HIF = 0x0140,
++ ATH_DEBUG_HTC = 0x0180,
++ ATH_DEBUG_WLAN = 0x1000,
++ ATH_LOG_ERR = 0x1010,
++ ATH_DEBUG_ANY = 0xFFFF,
++};
++
++#ifdef DEBUG
++
++#define A_DPRINTF(f, a) \
++ if(g_dbg_flags & (f)) \
++ { \
++ DBGFN a ; \
++ }
++
++
++// TODO FIX usage of A_PRINTF!
++#define AR_DEBUG_LVL_CHECK(lvl) (debughtc & (lvl))
++#define AR_DEBUG_PRINTBUF(buffer, length, desc) do { \
++ if (debughtc & ATH_DEBUG_DUMP) { \
++ DebugDumpBytes(buffer, length,desc); \
++ } \
++} while(0)
++#define PRINTX_ARG(arg...) arg
++#define AR_DEBUG_PRINTF(flags, args) do { \
++ if (debughtc & (flags)) { \
++ A_PRINTF(KERN_ALERT PRINTX_ARG args); \
++ } \
++} while (0)
++#define AR_DEBUG_ASSERT(test) do { \
++ if (!(test)) { \
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Debug Assert Caught, File %s, Line: %d, Test:%s \n",__FILE__, __LINE__,#test)); \
++ } \
++} while(0)
++extern int debughtc;
++#else
++#define AR_DEBUG_PRINTF(flags, args)
++#define AR_DEBUG_PRINTBUF(buffer, length, desc)
++#define AR_DEBUG_ASSERT(test)
++#define AR_DEBUG_LVL_CHECK(lvl) 0
++#define A_DPRINTF(f, a)
++#endif
++
++#endif /* _DEBUG_LINUX_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/ioctl.c linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/ioctl.c
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/ioctl.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/ioctl.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,2540 @@
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "ar6000_drv.h"
++
++static A_UINT8 bcast_mac[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
++static A_UINT8 null_mac[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
++extern USER_RSSI_THOLD rssi_map[12];
++extern unsigned int wmitimeout;
++extern A_WAITQUEUE_HEAD arEvent;
++extern int tspecCompliance;
++extern int bmienable;
++extern int bypasswmi;
++
++static int
++ar6000_ioctl_get_roam_tbl(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if(wmi_get_roam_tbl_cmd(ar->arWmi) != A_OK) {
++ return -EIO;
++ }
++
++ return 0;
++}
++
++static int
++ar6000_ioctl_get_roam_data(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++
++ /* currently assume only roam times are required */
++ if(wmi_get_roam_data_cmd(ar->arWmi, ROAM_DATA_TIME) != A_OK) {
++ return -EIO;
++ }
++
++
++ return 0;
++}
++
++static int
++ar6000_ioctl_set_roam_ctrl(struct net_device *dev, char *userdata)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_SET_ROAM_CTRL_CMD cmd;
++ A_UINT8 size = sizeof(cmd);
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++
++ if (copy_from_user(&cmd, userdata, size)) {
++ return -EFAULT;
++ }
++
++ if (cmd.roamCtrlType == WMI_SET_HOST_BIAS) {
++ if (cmd.info.bssBiasInfo.numBss > 1) {
++ size += (cmd.info.bssBiasInfo.numBss - 1) * sizeof(WMI_BSS_BIAS);
++ }
++ }
++
++ if (copy_from_user(&cmd, userdata, size)) {
++ return -EFAULT;
++ }
++
++ if(wmi_set_roam_ctrl_cmd(ar->arWmi, &cmd, size) != A_OK) {
++ return -EIO;
++ }
++
++ return 0;
++}
++
++static int
++ar6000_ioctl_set_powersave_timers(struct net_device *dev, char *userdata)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_POWERSAVE_TIMERS_POLICY_CMD cmd;
++ A_UINT8 size = sizeof(cmd);
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, userdata, size)) {
++ return -EFAULT;
++ }
++
++ if (copy_from_user(&cmd, userdata, size)) {
++ return -EFAULT;
++ }
++
++ if(wmi_set_powersave_timers_cmd(ar->arWmi, &cmd, size) != A_OK) {
++ return -EIO;
++ }
++
++ return 0;
++}
++
++static int
++ar6000_ioctl_set_wmm(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_SET_WMM_CMD cmd;
++ A_STATUS ret;
++
++ if ((dev->flags & IFF_UP) != IFF_UP) {
++ return -EIO;
++ }
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, (char *)((unsigned int*)rq->ifr_data + 1),
++ sizeof(cmd)))
++ {
++ return -EFAULT;
++ }
++
++ if (cmd.status == WMI_WMM_ENABLED) {
++ ar->arWmmEnabled = TRUE;
++ } else {
++ ar->arWmmEnabled = FALSE;
++ }
++
++ ret = wmi_set_wmm_cmd(ar->arWmi, cmd.status);
++
++ switch (ret) {
++ case A_OK:
++ return 0;
++ case A_EBUSY :
++ return -EBUSY;
++ case A_NO_MEMORY:
++ return -ENOMEM;
++ case A_EINVAL:
++ default:
++ return -EFAULT;
++ }
++}
++
++static int
++ar6000_ioctl_set_txop(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_SET_WMM_TXOP_CMD cmd;
++ A_STATUS ret;
++
++ if ((dev->flags & IFF_UP) != IFF_UP) {
++ return -EIO;
++ }
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, (char *)((unsigned int*)rq->ifr_data + 1),
++ sizeof(cmd)))
++ {
++ return -EFAULT;
++ }
++
++ ret = wmi_set_wmm_txop(ar->arWmi, cmd.txopEnable);
++
++ switch (ret) {
++ case A_OK:
++ return 0;
++ case A_EBUSY :
++ return -EBUSY;
++ case A_NO_MEMORY:
++ return -ENOMEM;
++ case A_EINVAL:
++ default:
++ return -EFAULT;
++ }
++}
++
++static int
++ar6000_ioctl_get_rd(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ A_STATUS ret = 0;
++
++ if ((dev->flags & IFF_UP) != IFF_UP || ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if(copy_to_user((char *)((unsigned int*)rq->ifr_data + 1),
++ &ar->arRegCode, sizeof(ar->arRegCode)))
++ ret = -EFAULT;
++
++ return ret;
++}
++
++
++/* Get power mode command */
++static int
++ar6000_ioctl_get_power_mode(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_POWER_MODE_CMD power_mode;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ power_mode.powerMode = wmi_get_power_mode_cmd(ar->arWmi);
++ if (copy_to_user(rq->ifr_data, &power_mode, sizeof(WMI_POWER_MODE_CMD))) {
++ ret = -EFAULT;
++ }
++
++ return ret;
++}
++
++
++static int
++ar6000_ioctl_set_channelParams(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_CHANNEL_PARAMS_CMD cmd, *cmdp;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++
++ if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ if (cmd.numChannels > 1) {
++ cmdp = A_MALLOC(130);
++ if (copy_from_user(cmdp, rq->ifr_data,
++ sizeof (*cmdp) +
++ ((cmd.numChannels - 1) * sizeof(A_UINT16))))
++ {
++ kfree(cmdp);
++ return -EFAULT;
++ }
++ } else {
++ cmdp = &cmd;
++ }
++
++ if ((ar->arPhyCapability == WMI_11G_CAPABILITY) &&
++ ((cmdp->phyMode == WMI_11A_MODE) || (cmdp->phyMode == WMI_11AG_MODE)))
++ {
++ ret = -EINVAL;
++ }
++
++ if (!ret &&
++ (wmi_set_channelParams_cmd(ar->arWmi, cmdp->scanParam, cmdp->phyMode,
++ cmdp->numChannels, cmdp->channelList)
++ != A_OK))
++ {
++ ret = -EIO;
++ }
++
++ if (cmd.numChannels > 1) {
++ kfree(cmdp);
++ }
++
++ return ret;
++}
++
++static int
++ar6000_ioctl_set_snr_threshold(struct net_device *dev, struct ifreq *rq)
++{
++
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_SNR_THRESHOLD_PARAMS_CMD cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ if( wmi_set_snr_threshold_params(ar->arWmi, &cmd) != A_OK ) {
++ ret = -EIO;
++ }
++
++ return ret;
++}
++
++static int
++ar6000_ioctl_set_rssi_threshold(struct net_device *dev, struct ifreq *rq)
++{
++#define SWAP_THOLD(thold1, thold2) do { \
++ USER_RSSI_THOLD tmpThold; \
++ tmpThold.tag = thold1.tag; \
++ tmpThold.rssi = thold1.rssi; \
++ thold1.tag = thold2.tag; \
++ thold1.rssi = thold2.rssi; \
++ thold2.tag = tmpThold.tag; \
++ thold2.rssi = tmpThold.rssi; \
++} while (0)
++
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_RSSI_THRESHOLD_PARAMS_CMD cmd;
++ USER_RSSI_PARAMS rssiParams;
++ A_INT32 i, j;
++
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user((char *)&rssiParams, (char *)((unsigned int *)rq->ifr_data + 1), sizeof(USER_RSSI_PARAMS))) {
++ return -EFAULT;
++ }
++ cmd.weight = rssiParams.weight;
++ cmd.pollTime = rssiParams.pollTime;
++
++ A_MEMCPY(rssi_map, &rssiParams.tholds, sizeof(rssi_map));
++ /*
++ * only 6 elements, so use bubble sorting, in ascending order
++ */
++ for (i = 5; i > 0; i--) {
++ for (j = 0; j < i; j++) { /* above tholds */
++ if (rssi_map[j+1].rssi < rssi_map[j].rssi) {
++ SWAP_THOLD(rssi_map[j+1], rssi_map[j]);
++ } else if (rssi_map[j+1].rssi == rssi_map[j].rssi) {
++ return EFAULT;
++ }
++ }
++ }
++ for (i = 11; i > 6; i--) {
++ for (j = 6; j < i; j++) { /* below tholds */
++ if (rssi_map[j+1].rssi < rssi_map[j].rssi) {
++ SWAP_THOLD(rssi_map[j+1], rssi_map[j]);
++ } else if (rssi_map[j+1].rssi == rssi_map[j].rssi) {
++ return EFAULT;
++ }
++ }
++ }
++
++#ifdef DEBUG
++ for (i = 0; i < 12; i++) {
++ AR_DEBUG2_PRINTF("thold[%d].tag: %d, thold[%d].rssi: %d \n",
++ i, rssi_map[i].tag, i, rssi_map[i].rssi);
++ }
++#endif
++ cmd.thresholdAbove1_Val = rssi_map[0].rssi;
++ cmd.thresholdAbove2_Val = rssi_map[1].rssi;
++ cmd.thresholdAbove3_Val = rssi_map[2].rssi;
++ cmd.thresholdAbove4_Val = rssi_map[3].rssi;
++ cmd.thresholdAbove5_Val = rssi_map[4].rssi;
++ cmd.thresholdAbove6_Val = rssi_map[5].rssi;
++ cmd.thresholdBelow1_Val = rssi_map[6].rssi;
++ cmd.thresholdBelow2_Val = rssi_map[7].rssi;
++ cmd.thresholdBelow3_Val = rssi_map[8].rssi;
++ cmd.thresholdBelow4_Val = rssi_map[9].rssi;
++ cmd.thresholdBelow5_Val = rssi_map[10].rssi;
++ cmd.thresholdBelow6_Val = rssi_map[11].rssi;
++
++ if( wmi_set_rssi_threshold_params(ar->arWmi, &cmd) != A_OK ) {
++ ret = -EIO;
++ }
++
++ return ret;
++}
++
++static int
++ar6000_ioctl_set_lq_threshold(struct net_device *dev, struct ifreq *rq)
++{
++
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_LQ_THRESHOLD_PARAMS_CMD cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, (char *)((unsigned int *)rq->ifr_data + 1), sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ if( wmi_set_lq_threshold_params(ar->arWmi, &cmd) != A_OK ) {
++ ret = -EIO;
++ }
++
++ return ret;
++}
++
++
++static int
++ar6000_ioctl_set_probedSsid(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_PROBED_SSID_CMD cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ if (wmi_probedSsid_cmd(ar->arWmi, cmd.entryIndex, cmd.flag, cmd.ssidLength,
++ cmd.ssid) != A_OK)
++ {
++ ret = -EIO;
++ }
++
++ return ret;
++}
++
++static int
++ar6000_ioctl_set_badAp(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_ADD_BAD_AP_CMD cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++
++ if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ if (cmd.badApIndex > WMI_MAX_BAD_AP_INDEX) {
++ return -EIO;
++ }
++
++ if (A_MEMCMP(cmd.bssid, null_mac, AR6000_ETH_ADDR_LEN) == 0) {
++ /*
++ * This is a delete badAP.
++ */
++ if (wmi_deleteBadAp_cmd(ar->arWmi, cmd.badApIndex) != A_OK) {
++ ret = -EIO;
++ }
++ } else {
++ if (wmi_addBadAp_cmd(ar->arWmi, cmd.badApIndex, cmd.bssid) != A_OK) {
++ ret = -EIO;
++ }
++ }
++
++ return ret;
++}
++
++static int
++ar6000_ioctl_create_qos(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_CREATE_PSTREAM_CMD cmd;
++ A_STATUS ret;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++
++ if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ ret = wmi_verify_tspec_params(&cmd, tspecCompliance);
++ if (ret == A_OK)
++ ret = wmi_create_pstream_cmd(ar->arWmi, &cmd);
++
++ switch (ret) {
++ case A_OK:
++ return 0;
++ case A_EBUSY :
++ return -EBUSY;
++ case A_NO_MEMORY:
++ return -ENOMEM;
++ case A_EINVAL:
++ default:
++ return -EFAULT;
++ }
++}
++
++static int
++ar6000_ioctl_delete_qos(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_DELETE_PSTREAM_CMD cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ ret = wmi_delete_pstream_cmd(ar->arWmi, cmd.trafficClass, cmd.tsid);
++
++ switch (ret) {
++ case A_OK:
++ return 0;
++ case A_EBUSY :
++ return -EBUSY;
++ case A_NO_MEMORY:
++ return -ENOMEM;
++ case A_EINVAL:
++ default:
++ return -EFAULT;
++ }
++}
++
++static int
++ar6000_ioctl_get_qos_queue(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ struct ar6000_queuereq qreq;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if( copy_from_user(&qreq, rq->ifr_data,
++ sizeof(struct ar6000_queuereq)))
++ return -EFAULT;
++
++ qreq.activeTsids = wmi_get_mapped_qos_queue(ar->arWmi, qreq.trafficClass);
++
++ if (copy_to_user(rq->ifr_data, &qreq,
++ sizeof(struct ar6000_queuereq)))
++ {
++ ret = -EFAULT;
++ }
++
++ return ret;
++}
++
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++static A_STATUS
++ar6000_ioctl_tcmd_get_rx_report(struct net_device *dev,
++ struct ifreq *rq, A_UINT8 *data, A_UINT32 len)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ A_UINT32 buf[2];
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++ ar->tcmdRxReport = 0;
++ if (wmi_test_cmd(ar->arWmi, data, len) != A_OK) {
++ up(&ar->arSem);
++ return -EIO;
++ }
++
++ wait_event_interruptible_timeout(arEvent, ar->tcmdRxReport != 0, wmitimeout * HZ);
++
++ if (signal_pending(current)) {
++ ret = -EINTR;
++ }
++
++ buf[0] = ar->tcmdRxTotalPkt;
++ buf[1] = ar->tcmdRxRssi;
++ if (!ret && copy_to_user(rq->ifr_data, buf, sizeof(buf))) {
++ ret = -EFAULT;
++ }
++
++ up(&ar->arSem);
++
++ return ret;
++}
++
++void
++ar6000_tcmd_rx_report_event(void *devt, A_UINT8 * results, int len)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
++ TCMD_CONT_RX * rx_rep = (TCMD_CONT_RX *)results;
++
++ ar->tcmdRxTotalPkt = rx_rep->u.report.totalPkt;
++ ar->tcmdRxRssi = rx_rep->u.report.rssiInDBm;
++ ar->tcmdRxReport = 1;
++
++ wake_up(&arEvent);
++}
++#endif /* CONFIG_HOST_TCMD_SUPPORT*/
++
++static int
++ar6000_ioctl_set_error_report_bitmask(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_TARGET_ERROR_REPORT_BITMASK cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ ret = wmi_set_error_report_bitmask(ar->arWmi, cmd.bitmask);
++
++ return (ret==0 ? ret : -EINVAL);
++}
++
++static int
++ar6000_clear_target_stats(struct net_device *dev)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ TARGET_STATS *pStats = &ar->arTargetStats;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ A_MEMZERO(pStats, sizeof(TARGET_STATS));
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ return ret;
++}
++
++static int
++ar6000_ioctl_get_target_stats(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ TARGET_STATS_CMD cmd;
++ TARGET_STATS *pStats = &ar->arTargetStats;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++ if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
++ return -EFAULT;
++ }
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++
++ ar->statsUpdatePending = TRUE;
++
++ if(wmi_get_stats_cmd(ar->arWmi) != A_OK) {
++ up(&ar->arSem);
++ return -EIO;
++ }
++
++ wait_event_interruptible_timeout(arEvent, ar->statsUpdatePending == FALSE, wmitimeout * HZ);
++
++ if (signal_pending(current)) {
++ ret = -EINTR;
++ }
++
++ if (!ret && copy_to_user(rq->ifr_data, pStats, sizeof(*pStats))) {
++ ret = -EFAULT;
++ }
++
++ if (cmd.clearStats == 1) {
++ ret = ar6000_clear_target_stats(dev);
++ }
++
++ up(&ar->arSem);
++
++ return ret;
++}
++
++static int
++ar6000_ioctl_set_access_params(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_SET_ACCESS_PARAMS_CMD cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ if (wmi_set_access_params_cmd(ar->arWmi, cmd.txop, cmd.eCWmin, cmd.eCWmax,
++ cmd.aifsn) == A_OK)
++ {
++ ret = 0;
++ } else {
++ ret = -EINVAL;
++ }
++
++ return (ret);
++}
++
++static int
++ar6000_ioctl_set_disconnect_timeout(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_DISC_TIMEOUT_CMD cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ if (wmi_disctimeout_cmd(ar->arWmi, cmd.disconnectTimeout) == A_OK)
++ {
++ ret = 0;
++ } else {
++ ret = -EINVAL;
++ }
++
++ return (ret);
++}
++
++static int
++ar6000_xioctl_set_voice_pkt_size(struct net_device *dev, char * userdata)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_SET_VOICE_PKT_SIZE_CMD cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ if (wmi_set_voice_pkt_size_cmd(ar->arWmi, cmd.voicePktSize) == A_OK)
++ {
++ ret = 0;
++ } else {
++ ret = -EINVAL;
++ }
++
++
++ return (ret);
++}
++
++static int
++ar6000_xioctl_set_max_sp_len(struct net_device *dev, char * userdata)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_SET_MAX_SP_LEN_CMD cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ if (wmi_set_max_sp_len_cmd(ar->arWmi, cmd.maxSPLen) == A_OK)
++ {
++ ret = 0;
++ } else {
++ ret = -EINVAL;
++ }
++
++ return (ret);
++}
++
++
++static int
++ar6000_xioctl_set_bt_status_cmd(struct net_device *dev, char * userdata)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_SET_BT_STATUS_CMD cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ if (wmi_set_bt_status_cmd(ar->arWmi, cmd.streamType, cmd.status) == A_OK)
++ {
++ ret = 0;
++ } else {
++ ret = -EINVAL;
++ }
++
++ return (ret);
++}
++
++static int
++ar6000_xioctl_set_bt_params_cmd(struct net_device *dev, char * userdata)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_SET_BT_PARAMS_CMD cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ if (wmi_set_bt_params_cmd(ar->arWmi, &cmd) == A_OK)
++ {
++ ret = 0;
++ } else {
++ ret = -EINVAL;
++ }
++
++ return (ret);
++}
++
++#ifdef CONFIG_HOST_GPIO_SUPPORT
++struct ar6000_gpio_intr_wait_cmd_s gpio_intr_results;
++/* gpio_reg_results and gpio_data_available are protected by arSem */
++static struct ar6000_gpio_register_cmd_s gpio_reg_results;
++static A_BOOL gpio_data_available; /* Requested GPIO data available */
++static A_BOOL gpio_intr_available; /* GPIO interrupt info available */
++static A_BOOL gpio_ack_received; /* GPIO ack was received */
++
++/* Host-side initialization for General Purpose I/O support */
++void ar6000_gpio_init(void)
++{
++ gpio_intr_available = FALSE;
++ gpio_data_available = FALSE;
++ gpio_ack_received = FALSE;
++}
++
++/*
++ * Called when a GPIO interrupt is received from the Target.
++ * intr_values shows which GPIO pins have interrupted.
++ * input_values shows a recent value of GPIO pins.
++ */
++void
++ar6000_gpio_intr_rx(A_UINT32 intr_mask, A_UINT32 input_values)
++{
++ gpio_intr_results.intr_mask = intr_mask;
++ gpio_intr_results.input_values = input_values;
++ *((volatile A_BOOL *)&gpio_intr_available) = TRUE;
++ wake_up(&arEvent);
++}
++
++/*
++ * This is called when a response is received from the Target
++ * for a previous or ar6000_gpio_input_get or ar6000_gpio_register_get
++ * call.
++ */
++void
++ar6000_gpio_data_rx(A_UINT32 reg_id, A_UINT32 value)
++{
++ gpio_reg_results.gpioreg_id = reg_id;
++ gpio_reg_results.value = value;
++ *((volatile A_BOOL *)&gpio_data_available) = TRUE;
++ wake_up(&arEvent);
++}
++
++/*
++ * This is called when an acknowledgement is received from the Target
++ * for a previous or ar6000_gpio_output_set or ar6000_gpio_register_set
++ * call.
++ */
++void
++ar6000_gpio_ack_rx(void)
++{
++ gpio_ack_received = TRUE;
++ wake_up(&arEvent);
++}
++
++A_STATUS
++ar6000_gpio_output_set(struct net_device *dev,
++ A_UINT32 set_mask,
++ A_UINT32 clear_mask,
++ A_UINT32 enable_mask,
++ A_UINT32 disable_mask)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ gpio_ack_received = FALSE;
++ return wmi_gpio_output_set(ar->arWmi,
++ set_mask, clear_mask, enable_mask, disable_mask);
++}
++
++static A_STATUS
++ar6000_gpio_input_get(struct net_device *dev)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ *((volatile A_BOOL *)&gpio_data_available) = FALSE;
++ return wmi_gpio_input_get(ar->arWmi);
++}
++
++static A_STATUS
++ar6000_gpio_register_set(struct net_device *dev,
++ A_UINT32 gpioreg_id,
++ A_UINT32 value)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ gpio_ack_received = FALSE;
++ return wmi_gpio_register_set(ar->arWmi, gpioreg_id, value);
++}
++
++static A_STATUS
++ar6000_gpio_register_get(struct net_device *dev,
++ A_UINT32 gpioreg_id)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ *((volatile A_BOOL *)&gpio_data_available) = FALSE;
++ return wmi_gpio_register_get(ar->arWmi, gpioreg_id);
++}
++
++static A_STATUS
++ar6000_gpio_intr_ack(struct net_device *dev,
++ A_UINT32 ack_mask)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ gpio_intr_available = FALSE;
++ return wmi_gpio_intr_ack(ar->arWmi, ack_mask);
++}
++#endif /* CONFIG_HOST_GPIO_SUPPORT */
++
++int ar6000_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ HIF_DEVICE *hifDevice = ar->arHifDevice;
++ int ret, param, param2;
++ unsigned int address = 0;
++ unsigned int length = 0;
++ unsigned char *buffer;
++ char *userdata;
++ A_UINT32 connectCtrlFlags;
++
++
++ static WMI_SCAN_PARAMS_CMD scParams = {0, 0, 0, 0, 0,
++ WMI_SHORTSCANRATIO_DEFAULT,
++ DEFAULT_SCAN_CTRL_FLAGS,
++ 0};
++ WMI_SET_AKMP_PARAMS_CMD akmpParams;
++ WMI_SET_PMKID_LIST_CMD pmkidInfo;
++
++ if (cmd == AR6000_IOCTL_EXTENDED)
++ {
++ /*
++ * This allows for many more wireless ioctls than would otherwise
++ * be available. Applications embed the actual ioctl command in
++ * the first word of the parameter block, and use the command
++ * AR6000_IOCTL_EXTENDED_CMD on the ioctl call.
++ */
++ get_user(cmd, (int *)rq->ifr_data);
++ userdata = (char *)(((unsigned int *)rq->ifr_data)+1);
++ }
++ else
++ {
++ userdata = (char *)rq->ifr_data;
++ }
++
++ if ((ar->arWlanState == WLAN_DISABLED) &&
++ ((cmd != AR6000_XIOCTRL_WMI_SET_WLAN_STATE) &&
++ (cmd != AR6000_XIOCTL_DIAG_READ) &&
++ (cmd != AR6000_XIOCTL_DIAG_WRITE)))
++ {
++ return -EIO;
++ }
++
++ ret = 0;
++ switch(cmd)
++ {
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++ case AR6000_XIOCTL_TCMD_CONT_TX:
++ {
++ TCMD_CONT_TX txCmd;
++
++ if (ar->tcmdPm == TCMD_PM_SLEEP) {
++ A_PRINTF("Can NOT send tx tcmd when target is asleep! \n");
++ return -EFAULT;
++ }
++
++ if(copy_from_user(&txCmd, userdata, sizeof(TCMD_CONT_TX)))
++ return -EFAULT;
++ wmi_test_cmd(ar->arWmi,(A_UINT8 *)&txCmd, sizeof(TCMD_CONT_TX));
++ }
++ break;
++ case AR6000_XIOCTL_TCMD_CONT_RX:
++ {
++ TCMD_CONT_RX rxCmd;
++
++ if (ar->tcmdPm == TCMD_PM_SLEEP) {
++ A_PRINTF("Can NOT send rx tcmd when target is asleep! \n");
++ return -EFAULT;
++ }
++ if(copy_from_user(&rxCmd, userdata, sizeof(TCMD_CONT_RX)))
++ return -EFAULT;
++ switch(rxCmd.act)
++ {
++ case TCMD_CONT_RX_PROMIS:
++ case TCMD_CONT_RX_FILTER:
++ case TCMD_CONT_RX_SETMAC:
++ wmi_test_cmd(ar->arWmi,(A_UINT8 *)&rxCmd,
++ sizeof(TCMD_CONT_RX));
++ break;
++ case TCMD_CONT_RX_REPORT:
++ ar6000_ioctl_tcmd_get_rx_report(dev, rq,
++ (A_UINT8 *)&rxCmd, sizeof(TCMD_CONT_RX));
++ break;
++ default:
++ A_PRINTF("Unknown Cont Rx mode: %d\n",rxCmd.act);
++ return -EINVAL;
++ }
++ }
++ break;
++ case AR6000_XIOCTL_TCMD_PM:
++ {
++ TCMD_PM pmCmd;
++
++ if(copy_from_user(&pmCmd, userdata, sizeof(TCMD_PM)))
++ return -EFAULT;
++ ar->tcmdPm = pmCmd.mode;
++ wmi_test_cmd(ar->arWmi, (A_UINT8*)&pmCmd, sizeof(TCMD_PM));
++ }
++ break;
++#endif /* CONFIG_HOST_TCMD_SUPPORT */
++
++ case AR6000_XIOCTL_BMI_DONE:
++ if(bmienable)
++ {
++ ret = ar6000_init(dev);
++ }
++ else
++ {
++ ret = BMIDone(hifDevice);
++ }
++ break;
++
++ case AR6000_XIOCTL_BMI_READ_MEMORY:
++ get_user(address, (unsigned int *)userdata);
++ get_user(length, (unsigned int *)userdata + 1);
++ AR_DEBUG_PRINTF("Read Memory (address: 0x%x, length: %d)\n",
++ address, length);
++ if ((buffer = (unsigned char *)A_MALLOC(length)) != NULL) {
++ A_MEMZERO(buffer, length);
++ ret = BMIReadMemory(hifDevice, address, buffer, length);
++ if (copy_to_user(rq->ifr_data, buffer, length)) {
++ ret = -EFAULT;
++ }
++ A_FREE(buffer);
++ } else {
++ ret = -ENOMEM;
++ }
++ break;
++
++ case AR6000_XIOCTL_BMI_WRITE_MEMORY:
++ get_user(address, (unsigned int *)userdata);
++ get_user(length, (unsigned int *)userdata + 1);
++ AR_DEBUG_PRINTF("Write Memory (address: 0x%x, length: %d)\n",
++ address, length);
++ if ((buffer = (unsigned char *)A_MALLOC(length)) != NULL) {
++ A_MEMZERO(buffer, length);
++ if (copy_from_user(buffer, &userdata[sizeof(address) +
++ sizeof(length)], length))
++ {
++ ret = -EFAULT;
++ } else {
++ ret = BMIWriteMemory(hifDevice, address, buffer, length);
++ }
++ A_FREE(buffer);
++ } else {
++ ret = -ENOMEM;
++ }
++ break;
++
++ case AR6000_XIOCTL_BMI_TEST:
++ AR_DEBUG_PRINTF("No longer supported\n");
++ ret = -EOPNOTSUPP;
++ break;
++
++ case AR6000_XIOCTL_BMI_EXECUTE:
++ get_user(address, (unsigned int *)userdata);
++ get_user(param, (unsigned int *)userdata + 1);
++ AR_DEBUG_PRINTF("Execute (address: 0x%x, param: %d)\n",
++ address, param);
++ ret = BMIExecute(hifDevice, address, &param);
++ put_user(param, (unsigned int *)rq->ifr_data); /* return value */
++ break;
++
++ case AR6000_XIOCTL_BMI_SET_APP_START:
++ get_user(address, (unsigned int *)userdata);
++ AR_DEBUG_PRINTF("Set App Start (address: 0x%x)\n", address);
++ ret = BMISetAppStart(hifDevice, address);
++ break;
++
++ case AR6000_XIOCTL_BMI_READ_SOC_REGISTER:
++ get_user(address, (unsigned int *)userdata);
++ ret = BMIReadSOCRegister(hifDevice, address, &param);
++ put_user(param, (unsigned int *)rq->ifr_data); /* return value */
++ break;
++
++ case AR6000_XIOCTL_BMI_WRITE_SOC_REGISTER:
++ get_user(address, (unsigned int *)userdata);
++ get_user(param, (unsigned int *)userdata + 1);
++ ret = BMIWriteSOCRegister(hifDevice, address, param);
++ break;
++
++#ifdef HTC_RAW_INTERFACE
++ case AR6000_XIOCTL_HTC_RAW_OPEN:
++ ret = A_OK;
++ if (!arRawIfEnabled(ar)) {
++ /* make sure block size is set in case the target was reset since last
++ * BMI phase (i.e. flashup downloads) */
++ ret = ar6000_SetHTCBlockSize(ar);
++ if (A_FAILED(ret)) {
++ break;
++ }
++ /* Terminate the BMI phase */
++ ret = BMIDone(hifDevice);
++ if (ret == A_OK) {
++ ret = ar6000_htc_raw_open(ar);
++ }
++ }
++ break;
++
++ case AR6000_XIOCTL_HTC_RAW_CLOSE:
++ if (arRawIfEnabled(ar)) {
++ ret = ar6000_htc_raw_close(ar);
++ arRawIfEnabled(ar) = FALSE;
++ } else {
++ ret = A_ERROR;
++ }
++ break;
++
++ case AR6000_XIOCTL_HTC_RAW_READ:
++ if (arRawIfEnabled(ar)) {
++ unsigned int streamID;
++ get_user(streamID, (unsigned int *)userdata);
++ get_user(length, (unsigned int *)userdata + 1);
++ buffer = rq->ifr_data + sizeof(length);
++ ret = ar6000_htc_raw_read(ar, (HTC_RAW_STREAM_ID)streamID,
++ buffer, length);
++ put_user(ret, (unsigned int *)rq->ifr_data);
++ } else {
++ ret = A_ERROR;
++ }
++ break;
++
++ case AR6000_XIOCTL_HTC_RAW_WRITE:
++ if (arRawIfEnabled(ar)) {
++ unsigned int streamID;
++ get_user(streamID, (unsigned int *)userdata);
++ get_user(length, (unsigned int *)userdata + 1);
++ buffer = userdata + sizeof(streamID) + sizeof(length);
++ ret = ar6000_htc_raw_write(ar, (HTC_RAW_STREAM_ID)streamID,
++ buffer, length);
++ put_user(ret, (unsigned int *)rq->ifr_data);
++ } else {
++ ret = A_ERROR;
++ }
++ break;
++#endif /* HTC_RAW_INTERFACE */
++
++ case AR6000_IOCTL_WMI_GETREV:
++ {
++ if (copy_to_user(rq->ifr_data, &ar->arVersion,
++ sizeof(ar->arVersion)))
++ {
++ ret = -EFAULT;
++ }
++ break;
++ }
++ case AR6000_IOCTL_WMI_SETPWR:
++ {
++ WMI_POWER_MODE_CMD pwrModeCmd;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&pwrModeCmd, userdata,
++ sizeof(pwrModeCmd)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_powermode_cmd(ar->arWmi, pwrModeCmd.powerMode)
++ != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_IOCTL_WMI_SET_IBSS_PM_CAPS:
++ {
++ WMI_IBSS_PM_CAPS_CMD ibssPmCaps;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&ibssPmCaps, userdata,
++ sizeof(ibssPmCaps)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_ibsspmcaps_cmd(ar->arWmi, ibssPmCaps.power_saving, ibssPmCaps.ttl,
++ ibssPmCaps.atim_windows, ibssPmCaps.timeout_value) != A_OK)
++ {
++ ret = -EIO;
++ }
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ ar->arIbssPsEnable = ibssPmCaps.power_saving;
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ }
++ break;
++ }
++ case AR6000_IOCTL_WMI_SET_PMPARAMS:
++ {
++ WMI_POWER_PARAMS_CMD pmParams;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&pmParams, userdata,
++ sizeof(pmParams)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_pmparams_cmd(ar->arWmi, pmParams.idle_period,
++ pmParams.pspoll_number,
++ pmParams.dtim_policy) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_IOCTL_WMI_SETSCAN:
++ {
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&scParams, userdata,
++ sizeof(scParams)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (CAN_SCAN_IN_CONNECT(scParams.scanCtrlFlags)) {
++ ar->arSkipScan = FALSE;
++ } else {
++ ar->arSkipScan = TRUE;
++ }
++
++ if (wmi_scanparams_cmd(ar->arWmi, scParams.fg_start_period,
++ scParams.fg_end_period,
++ scParams.bg_period,
++ scParams.minact_chdwell_time,
++ scParams.maxact_chdwell_time,
++ scParams.pas_chdwell_time,
++ scParams.shortScanRatio,
++ scParams.scanCtrlFlags,
++ scParams.max_dfsch_act_time) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_IOCTL_WMI_SETLISTENINT:
++ {
++ WMI_LISTEN_INT_CMD listenCmd;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&listenCmd, userdata,
++ sizeof(listenCmd)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_listeninterval_cmd(ar->arWmi, listenCmd.listenInterval, listenCmd.numBeacons) != A_OK) {
++ ret = -EIO;
++ } else {
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ ar->arListenInterval = param;
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ }
++
++ }
++ break;
++ }
++ case AR6000_IOCTL_WMI_SET_BMISS_TIME:
++ {
++ WMI_BMISS_TIME_CMD bmissCmd;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&bmissCmd, userdata,
++ sizeof(bmissCmd)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_bmisstime_cmd(ar->arWmi, bmissCmd.bmissTime, bmissCmd.numBeacons) != A_OK) {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_IOCTL_WMI_SETBSSFILTER:
++ {
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else {
++
++ get_user(param, (unsigned char *)userdata);
++ get_user(param2, (unsigned int *)(userdata + 1));
++ printk("SETBSSFILTER: filter 0x%x, mask: 0x%x\n", param, param2);
++ if (wmi_bssfilter_cmd(ar->arWmi, param, param2) != A_OK) {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_IOCTL_WMI_SET_SNRTHRESHOLD:
++ {
++ ret = ar6000_ioctl_set_snr_threshold(dev, rq);
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_RSSITHRESHOLD:
++ {
++ ret = ar6000_ioctl_set_rssi_threshold(dev, rq);
++ break;
++ }
++ case AR6000_XIOCTL_WMI_CLR_RSSISNR:
++ {
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ }
++ ret = wmi_clr_rssi_snr(ar->arWmi);
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_LQTHRESHOLD:
++ {
++ ret = ar6000_ioctl_set_lq_threshold(dev, rq);
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_LPREAMBLE:
++ {
++ WMI_SET_LPREAMBLE_CMD setLpreambleCmd;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&setLpreambleCmd, userdata,
++ sizeof(setLpreambleCmd)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_set_lpreamble_cmd(ar->arWmi, setLpreambleCmd.status)
++ != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_RTS:
++ {
++ WMI_SET_RTS_CMD rtsCmd;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&rtsCmd, userdata,
++ sizeof(rtsCmd)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_set_rts_cmd(ar->arWmi, rtsCmd.threshold)
++ != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_WMM:
++ {
++ ret = ar6000_ioctl_set_wmm(dev, rq);
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_TXOP:
++ {
++ ret = ar6000_ioctl_set_txop(dev, rq);
++ break;
++ }
++ case AR6000_XIOCTL_WMI_GET_RD:
++ {
++ ret = ar6000_ioctl_get_rd(dev, rq);
++ break;
++ }
++ case AR6000_IOCTL_WMI_SET_CHANNELPARAMS:
++ {
++ ret = ar6000_ioctl_set_channelParams(dev, rq);
++ break;
++ }
++ case AR6000_IOCTL_WMI_SET_PROBEDSSID:
++ {
++ ret = ar6000_ioctl_set_probedSsid(dev, rq);
++ break;
++ }
++ case AR6000_IOCTL_WMI_SET_BADAP:
++ {
++ ret = ar6000_ioctl_set_badAp(dev, rq);
++ break;
++ }
++ case AR6000_IOCTL_WMI_CREATE_QOS:
++ {
++ ret = ar6000_ioctl_create_qos(dev, rq);
++ break;
++ }
++ case AR6000_IOCTL_WMI_DELETE_QOS:
++ {
++ ret = ar6000_ioctl_delete_qos(dev, rq);
++ break;
++ }
++ case AR6000_IOCTL_WMI_GET_QOS_QUEUE:
++ {
++ ret = ar6000_ioctl_get_qos_queue(dev, rq);
++ break;
++ }
++ case AR6000_IOCTL_WMI_GET_TARGET_STATS:
++ {
++ ret = ar6000_ioctl_get_target_stats(dev, rq);
++ break;
++ }
++ case AR6000_IOCTL_WMI_SET_ERROR_REPORT_BITMASK:
++ {
++ ret = ar6000_ioctl_set_error_report_bitmask(dev, rq);
++ break;
++ }
++ case AR6000_IOCTL_WMI_SET_ASSOC_INFO:
++ {
++ WMI_SET_ASSOC_INFO_CMD cmd;
++ A_UINT8 assocInfo[WMI_MAX_ASSOC_INFO_LEN];
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else {
++ get_user(cmd.ieType, userdata);
++ if (cmd.ieType >= WMI_MAX_ASSOC_INFO_TYPE) {
++ ret = -EIO;
++ } else {
++ get_user(cmd.bufferSize, userdata + 1);
++ if (cmd.bufferSize > WMI_MAX_ASSOC_INFO_LEN) {
++ ret = -EFAULT;
++ break;
++ }
++ if (copy_from_user(assocInfo, userdata + 2,
++ cmd.bufferSize))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_associnfo_cmd(ar->arWmi, cmd.ieType,
++ cmd.bufferSize,
++ assocInfo) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ }
++ }
++ break;
++ }
++ case AR6000_IOCTL_WMI_SET_ACCESS_PARAMS:
++ {
++ ret = ar6000_ioctl_set_access_params(dev, rq);
++ break;
++ }
++ case AR6000_IOCTL_WMI_SET_DISC_TIMEOUT:
++ {
++ ret = ar6000_ioctl_set_disconnect_timeout(dev, rq);
++ break;
++ }
++ case AR6000_XIOCTL_FORCE_TARGET_RESET:
++ {
++ if (ar->arHtcTarget)
++ {
++// HTCForceReset(htcTarget);
++ }
++ else
++ {
++ AR_DEBUG_PRINTF("ar6000_ioctl cannot attempt reset.\n");
++ }
++ break;
++ }
++ case AR6000_XIOCTL_TARGET_INFO:
++ case AR6000_XIOCTL_CHECK_TARGET_READY: /* backwards compatibility */
++ {
++ /* If we made it to here, then the Target exists and is ready. */
++
++ if (cmd == AR6000_XIOCTL_TARGET_INFO) {
++ if (copy_to_user((A_UINT32 *)rq->ifr_data, &ar->arVersion.target_ver,
++ sizeof(ar->arVersion.target_ver)))
++ {
++ ret = -EFAULT;
++ }
++ if (copy_to_user(((A_UINT32 *)rq->ifr_data)+1, &ar->arTargetType,
++ sizeof(ar->arTargetType)))
++ {
++ ret = -EFAULT;
++ }
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_HB_CHALLENGE_RESP_PARAMS:
++ {
++ WMI_SET_HB_CHALLENGE_RESP_PARAMS_CMD hbparam;
++
++ if (copy_from_user(&hbparam, userdata, sizeof(hbparam)))
++ {
++ ret = -EFAULT;
++ } else {
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ /* Start a cyclic timer with the parameters provided. */
++ if (hbparam.frequency) {
++ ar->arHBChallengeResp.frequency = hbparam.frequency;
++ }
++ if (hbparam.threshold) {
++ ar->arHBChallengeResp.missThres = hbparam.threshold;
++ }
++
++ /* Delete the pending timer and start a new one */
++ if (timer_pending(&ar->arHBChallengeResp.timer)) {
++ A_UNTIMEOUT(&ar->arHBChallengeResp.timer);
++ }
++ A_TIMEOUT_MS(&ar->arHBChallengeResp.timer, ar->arHBChallengeResp.frequency * 1000, 0);
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_GET_HB_CHALLENGE_RESP:
++ {
++ A_UINT32 cookie;
++
++ if (copy_from_user(&cookie, userdata, sizeof(cookie))) {
++ return -EFAULT;
++ }
++
++ /* Send the challenge on the control channel */
++ if (wmi_get_challenge_resp_cmd(ar->arWmi, cookie, APP_HB_CHALLENGE) != A_OK) {
++ return -EIO;
++ }
++ break;
++ }
++#ifdef USER_KEYS
++ case AR6000_XIOCTL_USER_SETKEYS:
++ {
++
++ ar->user_savedkeys_stat = USER_SAVEDKEYS_STAT_RUN;
++
++ if (copy_from_user(&ar->user_key_ctrl, userdata,
++ sizeof(ar->user_key_ctrl)))
++ {
++ return -EFAULT;
++ }
++
++ A_PRINTF("ar6000 USER set key %x\n", ar->user_key_ctrl);
++ break;
++ }
++#endif /* USER_KEYS */
++
++#ifdef CONFIG_HOST_GPIO_SUPPORT
++ case AR6000_XIOCTL_GPIO_OUTPUT_SET:
++ {
++ struct ar6000_gpio_output_set_cmd_s gpio_output_set_cmd;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++
++ if (copy_from_user(&gpio_output_set_cmd, userdata,
++ sizeof(gpio_output_set_cmd)))
++ {
++ ret = -EFAULT;
++ } else {
++ ret = ar6000_gpio_output_set(dev,
++ gpio_output_set_cmd.set_mask,
++ gpio_output_set_cmd.clear_mask,
++ gpio_output_set_cmd.enable_mask,
++ gpio_output_set_cmd.disable_mask);
++ if (ret != A_OK) {
++ ret = EIO;
++ }
++ }
++ up(&ar->arSem);
++ break;
++ }
++ case AR6000_XIOCTL_GPIO_INPUT_GET:
++ {
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++
++ ret = ar6000_gpio_input_get(dev);
++ if (ret != A_OK) {
++ up(&ar->arSem);
++ return -EIO;
++ }
++
++ /* Wait for Target to respond. */
++ wait_event_interruptible(arEvent, gpio_data_available);
++ if (signal_pending(current)) {
++ ret = -EINTR;
++ } else {
++ A_ASSERT(gpio_reg_results.gpioreg_id == GPIO_ID_NONE);
++
++ if (copy_to_user(userdata, &gpio_reg_results.value,
++ sizeof(gpio_reg_results.value)))
++ {
++ ret = -EFAULT;
++ }
++ }
++ up(&ar->arSem);
++ break;
++ }
++ case AR6000_XIOCTL_GPIO_REGISTER_SET:
++ {
++ struct ar6000_gpio_register_cmd_s gpio_register_cmd;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++
++ if (copy_from_user(&gpio_register_cmd, userdata,
++ sizeof(gpio_register_cmd)))
++ {
++ ret = -EFAULT;
++ } else {
++ ret = ar6000_gpio_register_set(dev,
++ gpio_register_cmd.gpioreg_id,
++ gpio_register_cmd.value);
++ if (ret != A_OK) {
++ ret = EIO;
++ }
++
++ /* Wait for acknowledgement from Target */
++ wait_event_interruptible(arEvent, gpio_ack_received);
++ if (signal_pending(current)) {
++ ret = -EINTR;
++ }
++ }
++ up(&ar->arSem);
++ break;
++ }
++ case AR6000_XIOCTL_GPIO_REGISTER_GET:
++ {
++ struct ar6000_gpio_register_cmd_s gpio_register_cmd;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++
++ if (copy_from_user(&gpio_register_cmd, userdata,
++ sizeof(gpio_register_cmd)))
++ {
++ ret = -EFAULT;
++ } else {
++ ret = ar6000_gpio_register_get(dev, gpio_register_cmd.gpioreg_id);
++ if (ret != A_OK) {
++ up(&ar->arSem);
++ return -EIO;
++ }
++
++ /* Wait for Target to respond. */
++ wait_event_interruptible(arEvent, gpio_data_available);
++ if (signal_pending(current)) {
++ ret = -EINTR;
++ } else {
++ A_ASSERT(gpio_register_cmd.gpioreg_id == gpio_reg_results.gpioreg_id);
++ if (copy_to_user(userdata, &gpio_reg_results,
++ sizeof(gpio_reg_results)))
++ {
++ ret = -EFAULT;
++ }
++ }
++ }
++ up(&ar->arSem);
++ break;
++ }
++ case AR6000_XIOCTL_GPIO_INTR_ACK:
++ {
++ struct ar6000_gpio_intr_ack_cmd_s gpio_intr_ack_cmd;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++
++ if (copy_from_user(&gpio_intr_ack_cmd, userdata,
++ sizeof(gpio_intr_ack_cmd)))
++ {
++ ret = -EFAULT;
++ } else {
++ ret = ar6000_gpio_intr_ack(dev, gpio_intr_ack_cmd.ack_mask);
++ if (ret != A_OK) {
++ ret = EIO;
++ }
++ }
++ up(&ar->arSem);
++ break;
++ }
++ case AR6000_XIOCTL_GPIO_INTR_WAIT:
++ {
++ /* Wait for Target to report an interrupt. */
++ dev_hold(dev);
++ rtnl_unlock();
++ wait_event_interruptible(arEvent, gpio_intr_available);
++ rtnl_lock();
++ __dev_put(dev);
++
++ if (signal_pending(current)) {
++ ret = -EINTR;
++ } else {
++ if (copy_to_user(userdata, &gpio_intr_results,
++ sizeof(gpio_intr_results)))
++ {
++ ret = -EFAULT;
++ }
++ }
++ break;
++ }
++#endif /* CONFIG_HOST_GPIO_SUPPORT */
++
++ case AR6000_XIOCTL_DBGLOG_CFG_MODULE:
++ {
++ struct ar6000_dbglog_module_config_s config;
++
++ if (copy_from_user(&config, userdata, sizeof(config))) {
++ return -EFAULT;
++ }
++
++ /* Send the challenge on the control channel */
++ if (wmi_config_debug_module_cmd(ar->arWmi, config.mmask,
++ config.tsr, config.rep,
++ config.size, config.valid) != A_OK)
++ {
++ return -EIO;
++ }
++ break;
++ }
++
++ case AR6000_XIOCTL_DBGLOG_GET_DEBUG_LOGS:
++ {
++ /* Send the challenge on the control channel */
++ if (ar6000_dbglog_get_debug_logs(ar) != A_OK)
++ {
++ return -EIO;
++ }
++ break;
++ }
++
++ case AR6000_XIOCTL_SET_ADHOC_BSSID:
++ {
++ WMI_SET_ADHOC_BSSID_CMD adhocBssid;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&adhocBssid, userdata,
++ sizeof(adhocBssid)))
++ {
++ ret = -EFAULT;
++ } else if (A_MEMCMP(adhocBssid.bssid, bcast_mac,
++ AR6000_ETH_ADDR_LEN) == 0)
++ {
++ ret = -EFAULT;
++ } else {
++
++ A_MEMCPY(ar->arReqBssid, adhocBssid.bssid, sizeof(ar->arReqBssid));
++ }
++ break;
++ }
++
++ case AR6000_XIOCTL_SET_OPT_MODE:
++ {
++ WMI_SET_OPT_MODE_CMD optModeCmd;
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&optModeCmd, userdata,
++ sizeof(optModeCmd)))
++ {
++ ret = -EFAULT;
++ } else if (ar->arConnected && optModeCmd.optMode == SPECIAL_ON) {
++ ret = -EFAULT;
++
++ } else if (wmi_set_opt_mode_cmd(ar->arWmi, optModeCmd.optMode)
++ != A_OK)
++ {
++ ret = -EIO;
++ }
++ break;
++ }
++
++ case AR6000_XIOCTL_OPT_SEND_FRAME:
++ {
++ WMI_OPT_TX_FRAME_CMD optTxFrmCmd;
++ A_UINT8 data[MAX_OPT_DATA_LEN];
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&optTxFrmCmd, userdata,
++ sizeof(optTxFrmCmd)))
++ {
++ ret = -EFAULT;
++ } else if (copy_from_user(data,
++ userdata+sizeof(WMI_OPT_TX_FRAME_CMD)-1,
++ optTxFrmCmd.optIEDataLen))
++ {
++ ret = -EFAULT;
++ } else {
++ ret = wmi_opt_tx_frame_cmd(ar->arWmi,
++ optTxFrmCmd.frmType,
++ optTxFrmCmd.dstAddr,
++ optTxFrmCmd.bssid,
++ optTxFrmCmd.optIEDataLen,
++ data);
++ }
++
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SETRETRYLIMITS:
++ {
++ WMI_SET_RETRY_LIMITS_CMD setRetryParams;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&setRetryParams, userdata,
++ sizeof(setRetryParams)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_set_retry_limits_cmd(ar->arWmi, setRetryParams.frameType,
++ setRetryParams.trafficClass,
++ setRetryParams.maxRetries,
++ setRetryParams.enableNotify) != A_OK)
++ {
++ ret = -EIO;
++ }
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ ar->arMaxRetries = setRetryParams.maxRetries;
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ }
++ break;
++ }
++
++ case AR6000_XIOCTL_SET_ADHOC_BEACON_INTVAL:
++ {
++ WMI_BEACON_INT_CMD bIntvlCmd;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&bIntvlCmd, userdata,
++ sizeof(bIntvlCmd)))
++ {
++ ret = -EFAULT;
++ } else if (wmi_set_adhoc_bconIntvl_cmd(ar->arWmi, bIntvlCmd.beaconInterval)
++ != A_OK)
++ {
++ ret = -EIO;
++ }
++ break;
++ }
++ case IEEE80211_IOCTL_SETAUTHALG:
++ {
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ struct ieee80211req_authalg req;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&req, userdata,
++ sizeof(struct ieee80211req_authalg)))
++ {
++ ret = -EFAULT;
++ } else if (req.auth_alg == AUTH_ALG_OPEN_SYSTEM) {
++ ar->arDot11AuthMode = OPEN_AUTH;
++ ar->arPairwiseCrypto = NONE_CRYPT;
++ ar->arGroupCrypto = NONE_CRYPT;
++ } else if (req.auth_alg == AUTH_ALG_LEAP) {
++ ar->arDot11AuthMode = LEAP_AUTH;
++ } else {
++ ret = -EIO;
++ }
++ break;
++ }
++
++ case AR6000_XIOCTL_SET_VOICE_PKT_SIZE:
++ ret = ar6000_xioctl_set_voice_pkt_size(dev, userdata);
++ break;
++
++ case AR6000_XIOCTL_SET_MAX_SP:
++ ret = ar6000_xioctl_set_max_sp_len(dev, userdata);
++ break;
++
++ case AR6000_XIOCTL_WMI_GET_ROAM_TBL:
++ ret = ar6000_ioctl_get_roam_tbl(dev, rq);
++ break;
++ case AR6000_XIOCTL_WMI_SET_ROAM_CTRL:
++ ret = ar6000_ioctl_set_roam_ctrl(dev, userdata);
++ break;
++ case AR6000_XIOCTRL_WMI_SET_POWERSAVE_TIMERS:
++ ret = ar6000_ioctl_set_powersave_timers(dev, userdata);
++ break;
++ case AR6000_XIOCTRL_WMI_GET_POWER_MODE:
++ ret = ar6000_ioctl_get_power_mode(dev, rq);
++ break;
++ case AR6000_XIOCTRL_WMI_SET_WLAN_STATE:
++ get_user(ar->arWlanState, (unsigned int *)userdata);
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ break;
++ }
++
++ if (ar->arWlanState == WLAN_ENABLED) {
++ /* Enable foreground scanning */
++ if (wmi_scanparams_cmd(ar->arWmi, scParams.fg_start_period,
++ scParams.fg_end_period,
++ scParams.bg_period,
++ scParams.minact_chdwell_time,
++ scParams.maxact_chdwell_time,
++ scParams.pas_chdwell_time,
++ scParams.shortScanRatio,
++ scParams.scanCtrlFlags,
++ scParams.max_dfsch_act_time) != A_OK)
++ {
++ ret = -EIO;
++ }
++ if (ar->arSsidLen) {
++ ar->arConnectPending = TRUE;
++ if (wmi_connect_cmd(ar->arWmi, ar->arNetworkType,
++ ar->arDot11AuthMode, ar->arAuthMode,
++ ar->arPairwiseCrypto,
++ ar->arPairwiseCryptoLen,
++ ar->arGroupCrypto, ar->arGroupCryptoLen,
++ ar->arSsidLen, ar->arSsid,
++ ar->arReqBssid, ar->arChannelHint,
++ ar->arConnectCtrlFlags) != A_OK)
++ {
++ ret = -EIO;
++ ar->arConnectPending = FALSE;
++ }
++ }
++ } else {
++ /* Disconnect from the AP and disable foreground scanning */
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ if (ar->arConnected == TRUE || ar->arConnectPending == TRUE) {
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ wmi_disconnect_cmd(ar->arWmi);
++ } else {
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ }
++
++ if (wmi_scanparams_cmd(ar->arWmi, 0xFFFF, 0, 0, 0, 0, 0, 0, 0xFF, 0) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ break;
++ case AR6000_XIOCTL_WMI_GET_ROAM_DATA:
++ ret = ar6000_ioctl_get_roam_data(dev, rq);
++ break;
++ case AR6000_XIOCTL_WMI_SET_BT_STATUS:
++ ret = ar6000_xioctl_set_bt_status_cmd(dev, userdata);
++ break;
++ case AR6000_XIOCTL_WMI_SET_BT_PARAMS:
++ ret = ar6000_xioctl_set_bt_params_cmd(dev, userdata);
++ break;
++ case AR6000_XIOCTL_WMI_STARTSCAN:
++ {
++ WMI_START_SCAN_CMD setStartScanCmd;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&setStartScanCmd, userdata,
++ sizeof(setStartScanCmd)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_startscan_cmd(ar->arWmi, setStartScanCmd.scanType,
++ setStartScanCmd.forceFgScan,
++ setStartScanCmd.isLegacy,
++ setStartScanCmd.homeDwellTime,
++ setStartScanCmd.forceScanInterval) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SETFIXRATES:
++ {
++ WMI_FIX_RATES_CMD setFixRatesCmd;
++ A_STATUS returnStatus;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&setFixRatesCmd, userdata,
++ sizeof(setFixRatesCmd)))
++ {
++ ret = -EFAULT;
++ } else {
++ returnStatus = wmi_set_fixrates_cmd(ar->arWmi, setFixRatesCmd.fixRateMask);
++ if (returnStatus == A_EINVAL)
++ {
++ ret = -EINVAL;
++ }
++ else if(returnStatus != A_OK) {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++
++ case AR6000_XIOCTL_WMI_GETFIXRATES:
++ {
++ WMI_FIX_RATES_CMD getFixRatesCmd;
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++ /* Used copy_from_user/copy_to_user to access user space data */
++ if (copy_from_user(&getFixRatesCmd, userdata, sizeof(getFixRatesCmd))) {
++ ret = -EFAULT;
++ } else {
++ ar->arRateMask = 0xFFFF;
++
++ if (wmi_get_ratemask_cmd(ar->arWmi) != A_OK) {
++ up(&ar->arSem);
++ return -EIO;
++ }
++
++ wait_event_interruptible_timeout(arEvent, ar->arRateMask != 0xFFFF, wmitimeout * HZ);
++
++ if (signal_pending(current)) {
++ ret = -EINTR;
++ }
++
++ if (!ret) {
++ getFixRatesCmd.fixRateMask = ar->arRateMask;
++ }
++
++ if(copy_to_user(userdata, &getFixRatesCmd, sizeof(getFixRatesCmd))) {
++ ret = -EFAULT;
++ }
++
++ up(&ar->arSem);
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_AUTHMODE:
++ {
++ WMI_SET_AUTH_MODE_CMD setAuthMode;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&setAuthMode, userdata,
++ sizeof(setAuthMode)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_set_authmode_cmd(ar->arWmi, setAuthMode.mode) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_REASSOCMODE:
++ {
++ WMI_SET_REASSOC_MODE_CMD setReassocMode;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&setReassocMode, userdata,
++ sizeof(setReassocMode)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_set_reassocmode_cmd(ar->arWmi, setReassocMode.mode) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_XIOCTL_DIAG_READ:
++ {
++ A_UINT32 addr, data;
++ get_user(addr, (unsigned int *)userdata);
++ if (ar6000_ReadRegDiag(ar->arHifDevice, &addr, &data) != A_OK) {
++ ret = -EIO;
++ }
++ put_user(data, (unsigned int *)userdata + 1);
++ break;
++ }
++ case AR6000_XIOCTL_DIAG_WRITE:
++ {
++ A_UINT32 addr, data;
++ get_user(addr, (unsigned int *)userdata);
++ get_user(data, (unsigned int *)userdata + 1);
++ if (ar6000_WriteRegDiag(ar->arHifDevice, &addr, &data) != A_OK) {
++ ret = -EIO;
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_KEEPALIVE:
++ {
++ WMI_SET_KEEPALIVE_CMD setKeepAlive;
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ } else if (copy_from_user(&setKeepAlive, userdata,
++ sizeof(setKeepAlive))){
++ ret = -EFAULT;
++ } else {
++ if (wmi_set_keepalive_cmd(ar->arWmi, setKeepAlive.keepaliveInterval) != A_OK) {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_GET_KEEPALIVE:
++ {
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_GET_KEEPALIVE_CMD getKeepAlive;
++ int ret = 0;
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++ if (copy_from_user(&getKeepAlive, userdata,sizeof(getKeepAlive))) {
++ ret = -EFAULT;
++ } else {
++ getKeepAlive.keepaliveInterval = wmi_get_keepalive_cmd(ar->arWmi);
++ ar->arKeepaliveConfigured = 0xFF;
++ if (wmi_get_keepalive_configured(ar->arWmi) != A_OK){
++ up(&ar->arSem);
++ return -EIO;
++ }
++ wait_event_interruptible_timeout(arEvent, ar->arKeepaliveConfigured != 0xFF, wmitimeout * HZ);
++ if (signal_pending(current)) {
++ ret = -EINTR;
++ }
++
++ if (!ret) {
++ getKeepAlive.configured = ar->arKeepaliveConfigured;
++ }
++ if (copy_to_user(userdata, &getKeepAlive, sizeof(getKeepAlive))) {
++ ret = -EFAULT;
++ }
++ up(&ar->arSem);
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_APPIE:
++ {
++ WMI_SET_APPIE_CMD appIEcmd;
++ A_UINT8 appIeInfo[IEEE80211_APPIE_FRAME_MAX_LEN];
++ A_UINT32 fType,ieLen;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++ get_user(fType, (A_UINT32 *)userdata);
++ appIEcmd.mgmtFrmType = fType;
++ if (appIEcmd.mgmtFrmType >= IEEE80211_APPIE_NUM_OF_FRAME) {
++ ret = -EIO;
++ } else {
++ get_user(ieLen, (A_UINT32 *)(userdata + 4));
++ appIEcmd.ieLen = ieLen;
++ if (appIEcmd.ieLen > IEEE80211_APPIE_FRAME_MAX_LEN) {
++ ret = -EIO;
++ break;
++ }
++ if (copy_from_user(appIeInfo, userdata + 8, appIEcmd.ieLen)) {
++ ret = -EFAULT;
++ } else {
++ if (wmi_set_appie_cmd(ar->arWmi, appIEcmd.mgmtFrmType,
++ appIEcmd.ieLen, appIeInfo) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_MGMT_FRM_RX_FILTER:
++ {
++ WMI_BSS_FILTER_CMD cmd;
++ A_UINT32 filterType;
++
++ if (copy_from_user(&filterType, userdata, sizeof(A_UINT32)))
++ {
++ return -EFAULT;
++ }
++ if (filterType & (IEEE80211_FILTER_TYPE_BEACON |
++ IEEE80211_FILTER_TYPE_PROBE_RESP))
++ {
++ cmd.bssFilter = ALL_BSS_FILTER;
++ } else {
++ cmd.bssFilter = NONE_BSS_FILTER;
++ }
++ if (wmi_bssfilter_cmd(ar->arWmi, cmd.bssFilter, 0) != A_OK) {
++ ret = -EIO;
++ }
++
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ ar->arMgmtFilter = filterType;
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_WSC_STATUS:
++ {
++ A_UINT32 wsc_status;
++
++ if (copy_from_user(&wsc_status, userdata, sizeof(A_UINT32)))
++ {
++ return -EFAULT;
++ }
++ if (wmi_set_wsc_status_cmd(ar->arWmi, wsc_status) != A_OK) {
++ ret = -EIO;
++ }
++ break;
++ }
++ case AR6000_XIOCTL_BMI_ROMPATCH_INSTALL:
++ {
++ A_UINT32 ROM_addr;
++ A_UINT32 RAM_addr;
++ A_UINT32 nbytes;
++ A_UINT32 do_activate;
++ A_UINT32 rompatch_id;
++
++ get_user(ROM_addr, (A_UINT32 *)userdata);
++ get_user(RAM_addr, (A_UINT32 *)userdata + 1);
++ get_user(nbytes, (A_UINT32 *)userdata + 2);
++ get_user(do_activate, (A_UINT32 *)userdata + 3);
++ AR_DEBUG_PRINTF("Install rompatch from ROM: 0x%x to RAM: 0x%x length: %d\n",
++ ROM_addr, RAM_addr, nbytes);
++ ret = BMIrompatchInstall(hifDevice, ROM_addr, RAM_addr,
++ nbytes, do_activate, &rompatch_id);
++ if (ret == A_OK) {
++ put_user(rompatch_id, (unsigned int *)rq->ifr_data); /* return value */
++ }
++ break;
++ }
++
++ case AR6000_XIOCTL_BMI_ROMPATCH_UNINSTALL:
++ {
++ A_UINT32 rompatch_id;
++
++ get_user(rompatch_id, (A_UINT32 *)userdata);
++ AR_DEBUG_PRINTF("UNinstall rompatch_id %d\n", rompatch_id);
++ ret = BMIrompatchUninstall(hifDevice, rompatch_id);
++ break;
++ }
++
++ case AR6000_XIOCTL_BMI_ROMPATCH_ACTIVATE:
++ case AR6000_XIOCTL_BMI_ROMPATCH_DEACTIVATE:
++ {
++ A_UINT32 rompatch_count;
++
++ get_user(rompatch_count, (A_UINT32 *)userdata);
++ AR_DEBUG_PRINTF("Change rompatch activation count=%d\n", rompatch_count);
++ length = sizeof(A_UINT32) * rompatch_count;
++ if ((buffer = (unsigned char *)A_MALLOC(length)) != NULL) {
++ A_MEMZERO(buffer, length);
++ if (copy_from_user(buffer, &userdata[sizeof(rompatch_count)], length))
++ {
++ ret = -EFAULT;
++ } else {
++ if (cmd == AR6000_XIOCTL_BMI_ROMPATCH_ACTIVATE) {
++ ret = BMIrompatchActivate(hifDevice, rompatch_count, (A_UINT32 *)buffer);
++ } else {
++ ret = BMIrompatchDeactivate(hifDevice, rompatch_count, (A_UINT32 *)buffer);
++ }
++ }
++ A_FREE(buffer);
++ } else {
++ ret = -ENOMEM;
++ }
++
++ break;
++ }
++
++ case AR6000_XIOCTL_WMI_SET_HOST_SLEEP_MODE:
++ {
++ WMI_SET_HOST_SLEEP_MODE_CMD setHostSleepMode;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&setHostSleepMode, userdata,
++ sizeof(setHostSleepMode)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_set_host_sleep_mode_cmd(ar->arWmi,
++ &setHostSleepMode) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_WOW_MODE:
++ {
++ WMI_SET_WOW_MODE_CMD setWowMode;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&setWowMode, userdata,
++ sizeof(setWowMode)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_set_wow_mode_cmd(ar->arWmi,
++ &setWowMode) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_GET_WOW_LIST:
++ {
++ WMI_GET_WOW_LIST_CMD getWowList;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&getWowList, userdata,
++ sizeof(getWowList)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_get_wow_list_cmd(ar->arWmi,
++ &getWowList) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_ADD_WOW_PATTERN:
++ {
++#define WOW_PATTERN_SIZE 64
++#define WOW_MASK_SIZE 64
++
++ WMI_ADD_WOW_PATTERN_CMD cmd;
++ A_UINT8 mask_data[WOW_PATTERN_SIZE]={0};
++ A_UINT8 pattern_data[WOW_PATTERN_SIZE]={0};
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else {
++
++ if(copy_from_user(&cmd, userdata,
++ sizeof(WMI_ADD_WOW_PATTERN_CMD)))
++ return -EFAULT;
++ if (copy_from_user(pattern_data,
++ userdata + 3,
++ cmd.filter_size)){
++ ret = -EFAULT;
++ break;
++ }
++ if (copy_from_user(mask_data,
++ (userdata + 3 + cmd.filter_size),
++ cmd.filter_size)){
++ ret = -EFAULT;
++ break;
++ } else {
++ if (wmi_add_wow_pattern_cmd(ar->arWmi,
++ &cmd, pattern_data, mask_data, cmd.filter_size) != A_OK){
++ ret = -EIO;
++ }
++ }
++ }
++#undef WOW_PATTERN_SIZE
++#undef WOW_MASK_SIZE
++ break;
++ }
++ case AR6000_XIOCTL_WMI_DEL_WOW_PATTERN:
++ {
++ WMI_DEL_WOW_PATTERN_CMD delWowPattern;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&delWowPattern, userdata,
++ sizeof(delWowPattern)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_del_wow_pattern_cmd(ar->arWmi,
++ &delWowPattern) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_XIOCTL_DUMP_HTC_CREDIT_STATE:
++ if (ar->arHtcTarget != NULL) {
++ HTCDumpCreditStates(ar->arHtcTarget);
++ }
++ break;
++ case AR6000_XIOCTL_TRAFFIC_ACTIVITY_CHANGE:
++ if (ar->arHtcTarget != NULL) {
++ struct ar6000_traffic_activity_change data;
++
++ if (copy_from_user(&data, userdata, sizeof(data)))
++ {
++ return -EFAULT;
++ }
++ /* note, this is used for testing (mbox ping testing), indicate activity
++ * change using the stream ID as the traffic class */
++ ar6000_indicate_tx_activity(ar,
++ (A_UINT8)data.StreamID,
++ data.Active ? TRUE : FALSE);
++ }
++ break;
++ case AR6000_XIOCTL_WMI_SET_CONNECT_CTRL_FLAGS:
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&connectCtrlFlags, userdata,
++ sizeof(connectCtrlFlags)))
++ {
++ ret = -EFAULT;
++ } else {
++ ar->arConnectCtrlFlags = connectCtrlFlags;
++ }
++ break;
++ case AR6000_XIOCTL_WMI_SET_AKMP_PARAMS:
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&akmpParams, userdata,
++ sizeof(WMI_SET_AKMP_PARAMS_CMD)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_set_akmp_params_cmd(ar->arWmi, &akmpParams) != A_OK) {
++ ret = -EIO;
++ }
++ }
++ break;
++ case AR6000_XIOCTL_WMI_SET_PMKID_LIST:
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else {
++ if (copy_from_user(&pmkidInfo.numPMKID, userdata,
++ sizeof(pmkidInfo.numPMKID)))
++ {
++ ret = -EFAULT;
++ break;
++ }
++ if (copy_from_user(&pmkidInfo.pmkidList,
++ userdata + sizeof(pmkidInfo.numPMKID),
++ pmkidInfo.numPMKID * sizeof(WMI_PMKID)))
++ {
++ ret = -EFAULT;
++ break;
++ }
++ if (wmi_set_pmkid_list_cmd(ar->arWmi, &pmkidInfo) != A_OK) {
++ ret = -EIO;
++ }
++ }
++ break;
++ case AR6000_XIOCTL_WMI_GET_PMKID_LIST:
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else {
++ if (wmi_get_pmkid_list_cmd(ar->arWmi) != A_OK) {
++ ret = -EIO;
++ }
++ }
++ break;
++ default:
++ ret = -EOPNOTSUPP;
++ }
++ return ret;
++}
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/netbuf.c linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/netbuf.c
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/netbuf.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/netbuf.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,225 @@
++
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++#include <linux/kernel.h>
++#include <linux/skbuff.h>
++#include <a_config.h>
++#include "athdefs.h"
++#include "a_types.h"
++#include "a_osapi.h"
++#include "htc_packet.h"
++
++#define AR6000_DATA_OFFSET 64
++
++void a_netbuf_enqueue(A_NETBUF_QUEUE_T *q, void *pkt)
++{
++ skb_queue_tail((struct sk_buff_head *) q, (struct sk_buff *) pkt);
++}
++
++void a_netbuf_prequeue(A_NETBUF_QUEUE_T *q, void *pkt)
++{
++ skb_queue_head((struct sk_buff_head *) q, (struct sk_buff *) pkt);
++}
++
++void *a_netbuf_dequeue(A_NETBUF_QUEUE_T *q)
++{
++ return((void *) skb_dequeue((struct sk_buff_head *) q));
++}
++
++int a_netbuf_queue_size(A_NETBUF_QUEUE_T *q)
++{
++ return(skb_queue_len((struct sk_buff_head *) q));
++}
++
++int a_netbuf_queue_empty(A_NETBUF_QUEUE_T *q)
++{
++ return(skb_queue_empty((struct sk_buff_head *) q));
++}
++
++void a_netbuf_queue_init(A_NETBUF_QUEUE_T *q)
++{
++ skb_queue_head_init((struct sk_buff_head *) q);
++}
++
++void *
++a_netbuf_alloc(int size)
++{
++ struct sk_buff *skb;
++ skb = dev_alloc_skb(AR6000_DATA_OFFSET + sizeof(HTC_PACKET) + size);
++ skb_reserve(skb, AR6000_DATA_OFFSET + sizeof(HTC_PACKET));
++ return ((void *)skb);
++}
++
++/*
++ * Allocate an SKB w.o. any encapsulation requirement.
++ */
++void *
++a_netbuf_alloc_raw(int size)
++{
++ struct sk_buff *skb;
++
++ skb = dev_alloc_skb(size);
++
++ return ((void *)skb);
++}
++
++void
++a_netbuf_free(void *bufPtr)
++{
++ struct sk_buff *skb = (struct sk_buff *)bufPtr;
++
++ dev_kfree_skb(skb);
++}
++
++A_UINT32
++a_netbuf_to_len(void *bufPtr)
++{
++ return (((struct sk_buff *)bufPtr)->len);
++}
++
++void *
++a_netbuf_to_data(void *bufPtr)
++{
++ return (((struct sk_buff *)bufPtr)->data);
++}
++
++/*
++ * Add len # of bytes to the beginning of the network buffer
++ * pointed to by bufPtr
++ */
++A_STATUS
++a_netbuf_push(void *bufPtr, A_INT32 len)
++{
++ skb_push((struct sk_buff *)bufPtr, len);
++
++ return A_OK;
++}
++
++/*
++ * Add len # of bytes to the beginning of the network buffer
++ * pointed to by bufPtr and also fill with data
++ */
++A_STATUS
++a_netbuf_push_data(void *bufPtr, char *srcPtr, A_INT32 len)
++{
++ skb_push((struct sk_buff *) bufPtr, len);
++ A_MEMCPY(((struct sk_buff *)bufPtr)->data, srcPtr, len);
++
++ return A_OK;
++}
++
++/*
++ * Add len # of bytes to the end of the network buffer
++ * pointed to by bufPtr
++ */
++A_STATUS
++a_netbuf_put(void *bufPtr, A_INT32 len)
++{
++ skb_put((struct sk_buff *)bufPtr, len);
++
++ return A_OK;
++}
++
++/*
++ * Add len # of bytes to the end of the network buffer
++ * pointed to by bufPtr and also fill with data
++ */
++A_STATUS
++a_netbuf_put_data(void *bufPtr, char *srcPtr, A_INT32 len)
++{
++ char *start = ((struct sk_buff *)bufPtr)->data +
++ ((struct sk_buff *)bufPtr)->len;
++ skb_put((struct sk_buff *)bufPtr, len);
++ A_MEMCPY(start, srcPtr, len);
++
++ return A_OK;
++}
++
++
++/*
++ * Trim the network buffer pointed to by bufPtr to len # of bytes
++ */
++A_STATUS
++a_netbuf_setlen(void *bufPtr, A_INT32 len)
++{
++ skb_trim((struct sk_buff *)bufPtr, len);
++
++ return A_OK;
++}
++
++/*
++ * Chop of len # of bytes from the end of the buffer.
++ */
++A_STATUS
++a_netbuf_trim(void *bufPtr, A_INT32 len)
++{
++ skb_trim((struct sk_buff *)bufPtr, ((struct sk_buff *)bufPtr)->len - len);
++
++ return A_OK;
++}
++
++/*
++ * Chop of len # of bytes from the end of the buffer and return the data.
++ */
++A_STATUS
++a_netbuf_trim_data(void *bufPtr, char *dstPtr, A_INT32 len)
++{
++ char *start = ((struct sk_buff *)bufPtr)->data +
++ (((struct sk_buff *)bufPtr)->len - len);
++
++ A_MEMCPY(dstPtr, start, len);
++ skb_trim((struct sk_buff *)bufPtr, ((struct sk_buff *)bufPtr)->len - len);
++
++ return A_OK;
++}
++
++
++/*
++ * Returns the number of bytes available to a a_netbuf_push()
++ */
++A_INT32
++a_netbuf_headroom(void *bufPtr)
++{
++ return (skb_headroom((struct sk_buff *)bufPtr));
++}
++
++/*
++ * Removes specified number of bytes from the beginning of the buffer
++ */
++A_STATUS
++a_netbuf_pull(void *bufPtr, A_INT32 len)
++{
++ skb_pull((struct sk_buff *)bufPtr, len);
++
++ return A_OK;
++}
++
++/*
++ * Removes specified number of bytes from the beginning of the buffer
++ * and return the data
++ */
++A_STATUS
++a_netbuf_pull_data(void *bufPtr, char *dstPtr, A_INT32 len)
++{
++ A_MEMCPY(dstPtr, ((struct sk_buff *)bufPtr)->data, len);
++ skb_pull((struct sk_buff *)bufPtr, len);
++
++ return A_OK;
++}
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/osapi_linux.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/osapi_linux.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/osapi_linux.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/osapi_linux.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,319 @@
++/*
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/os/linux/include/osapi_linux.h#1 $
++ *
++ * This file contains the definitions of the basic atheros data types.
++ * It is used to map the data types in atheros files to a platform specific
++ * type.
++ *
++ * Copyright 2003-2005 Atheros Communications, Inc., All Rights Reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef _OSAPI_LINUX_H_
++#define _OSAPI_LINUX_H_
++
++#ifdef __KERNEL__
++
++#include <linux/version.h>
++#include <linux/types.h>
++#include <linux/kernel.h>
++#include <linux/string.h>
++#include <linux/skbuff.h>
++#include <linux/netdevice.h>
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
++#include <linux/jiffies.h>
++#endif
++#include <linux/timer.h>
++#include <linux/delay.h>
++#include <linux/wait.h>
++#ifdef KERNEL_2_4
++#include <asm/arch/irq.h>
++#include <asm/irq.h>
++#endif
++
++#ifdef __GNUC__
++#define __ATTRIB_PACK __attribute__ ((packed))
++#define __ATTRIB_PRINTF __attribute__ ((format (printf, 1, 2)))
++#define __ATTRIB_NORETURN __attribute__ ((noreturn))
++#ifndef INLINE
++#define INLINE __inline__
++#endif
++#else /* Not GCC */
++#define __ATTRIB_PACK
++#define __ATTRIB_PRINTF
++#define __ATTRIB_NORETURN
++#ifndef INLINE
++#define INLINE __inline
++#endif
++#endif /* End __GNUC__ */
++
++#define PREPACK
++#define POSTPACK __ATTRIB_PACK
++
++/*
++ * Endianes macros
++ */
++#define A_BE2CPU8(x) ntohb(x)
++#define A_BE2CPU16(x) ntohs(x)
++#define A_BE2CPU32(x) ntohl(x)
++
++#define A_LE2CPU8(x) (x)
++#define A_LE2CPU16(x) (x)
++#define A_LE2CPU32(x) (x)
++
++#define A_CPU2BE8(x) htonb(x)
++#define A_CPU2BE16(x) htons(x)
++#define A_CPU2BE32(x) htonl(x)
++
++#define A_MEMCPY(dst, src, len) memcpy((A_UINT8 *)(dst), (src), (len))
++#define A_MEMZERO(addr, len) memset(addr, 0, len)
++#define A_MEMCMP(addr1, addr2, len) memcmp((addr1), (addr2), (len))
++#define A_MALLOC(size) kmalloc((size), GFP_KERNEL)
++#define A_MALLOC_NOWAIT(size) kmalloc((size), GFP_ATOMIC)
++#define A_FREE(addr) kfree(addr)
++#define A_PRINTF(args...) printk(args)
++
++/* Mutual Exclusion */
++typedef spinlock_t A_MUTEX_T;
++#define A_MUTEX_INIT(mutex) spin_lock_init(mutex)
++#define A_MUTEX_LOCK(mutex) spin_lock_bh(mutex)
++#define A_MUTEX_UNLOCK(mutex) spin_unlock_bh(mutex)
++#define A_IS_MUTEX_VALID(mutex) TRUE /* okay to return true, since A_MUTEX_DELETE does nothing */
++#define A_MUTEX_DELETE(mutex) /* spin locks are not kernel resources so nothing to free.. */
++
++/* Get current time in ms adding a constant offset (in ms) */
++#define A_GET_MS(offset) \
++ (jiffies + ((offset) / 1000) * HZ)
++
++/*
++ * Timer Functions
++ */
++#define A_MDELAY(msecs) mdelay(msecs)
++typedef struct timer_list A_TIMER;
++
++#define A_INIT_TIMER(pTimer, pFunction, pArg) do { \
++ init_timer(pTimer); \
++ (pTimer)->function = (pFunction); \
++ (pTimer)->data = (unsigned long)(pArg); \
++} while (0)
++
++/*
++ * Start a Timer that elapses after 'periodMSec' milli-seconds
++ * Support is provided for a one-shot timer. The 'repeatFlag' is
++ * ignored.
++ */
++#define A_TIMEOUT_MS(pTimer, periodMSec, repeatFlag) do { \
++ if (repeatFlag) { \
++ printk("\n" __FILE__ ":%d: Timer Repeat requested\n",__LINE__); \
++ panic("Timer Repeat"); \
++ } \
++ mod_timer((pTimer), jiffies + HZ * (periodMSec) / 1000); \
++} while (0)
++
++/*
++ * Cancel the Timer.
++ */
++#define A_UNTIMEOUT(pTimer) do { \
++ del_timer((pTimer)); \
++} while (0)
++
++#define A_DELETE_TIMER(pTimer) do { \
++} while (0)
++
++/*
++ * Wait Queue related functions
++ */
++typedef wait_queue_head_t A_WAITQUEUE_HEAD;
++#define A_INIT_WAITQUEUE_HEAD(head) init_waitqueue_head(head)
++#ifndef wait_event_interruptible_timeout
++#define __wait_event_interruptible_timeout(wq, condition, ret) \
++do { \
++ wait_queue_t __wait; \
++ init_waitqueue_entry(&__wait, current); \
++ \
++ add_wait_queue(&wq, &__wait); \
++ for (;;) { \
++ set_current_state(TASK_INTERRUPTIBLE); \
++ if (condition) \
++ break; \
++ if (!signal_pending(current)) { \
++ ret = schedule_timeout(ret); \
++ if (!ret) \
++ break; \
++ continue; \
++ } \
++ ret = -ERESTARTSYS; \
++ break; \
++ } \
++ current->state = TASK_RUNNING; \
++ remove_wait_queue(&wq, &__wait); \
++} while (0)
++
++#define wait_event_interruptible_timeout(wq, condition, timeout) \
++({ \
++ long __ret = timeout; \
++ if (!(condition)) \
++ __wait_event_interruptible_timeout(wq, condition, __ret); \
++ __ret; \
++})
++#endif /* wait_event_interruptible_timeout */
++
++#define A_WAIT_EVENT_INTERRUPTIBLE_TIMEOUT(head, condition, timeout) do { \
++ wait_event_interruptible_timeout(head, condition, timeout); \
++} while (0)
++
++#define A_WAKE_UP(head) wake_up(head)
++
++#ifdef DEBUG
++#define A_ASSERT(expr) \
++ if (!(expr)) { \
++ printk(KERN_ALERT "\n" __FILE__ ":%d: Assertion " #expr " failed!\n",__LINE__); \
++ panic(#expr); \
++ }
++
++#else
++#define A_ASSERT(expr)
++#endif /* DEBUG */
++
++/*
++ * Initialization of the network buffer subsystem
++ */
++#define A_NETBUF_INIT()
++
++/*
++ * Network buffer queue support
++ */
++typedef struct sk_buff_head A_NETBUF_QUEUE_T;
++
++#define A_NETBUF_QUEUE_INIT(q) \
++ a_netbuf_queue_init(q)
++
++#define A_NETBUF_ENQUEUE(q, pkt) \
++ a_netbuf_enqueue((q), (pkt))
++#define A_NETBUF_PREQUEUE(q, pkt) \
++ a_netbuf_prequeue((q), (pkt))
++#define A_NETBUF_DEQUEUE(q) \
++ (a_netbuf_dequeue(q))
++#define A_NETBUF_QUEUE_SIZE(q) \
++ a_netbuf_queue_size(q)
++#define A_NETBUF_QUEUE_EMPTY(q) \
++ a_netbuf_queue_empty(q)
++
++/*
++ * Network buffer support
++ */
++#define A_NETBUF_ALLOC(size) \
++ a_netbuf_alloc(size)
++#define A_NETBUF_ALLOC_RAW(size) \
++ a_netbuf_alloc_raw(size)
++#define A_NETBUF_FREE(bufPtr) \
++ a_netbuf_free(bufPtr)
++#define A_NETBUF_DATA(bufPtr) \
++ a_netbuf_to_data(bufPtr)
++#define A_NETBUF_LEN(bufPtr) \
++ a_netbuf_to_len(bufPtr)
++#define A_NETBUF_PUSH(bufPtr, len) \
++ a_netbuf_push(bufPtr, len)
++#define A_NETBUF_PUT(bufPtr, len) \
++ a_netbuf_put(bufPtr, len)
++#define A_NETBUF_TRIM(bufPtr,len) \
++ a_netbuf_trim(bufPtr, len)
++#define A_NETBUF_PULL(bufPtr, len) \
++ a_netbuf_pull(bufPtr, len)
++#define A_NETBUF_HEADROOM(bufPtr)\
++ a_netbuf_headroom(bufPtr)
++#define A_NETBUF_SETLEN(bufPtr,len) \
++ a_netbuf_setlen(bufPtr, len)
++
++/* Add data to end of a buffer */
++#define A_NETBUF_PUT_DATA(bufPtr, srcPtr, len) \
++ a_netbuf_put_data(bufPtr, srcPtr, len)
++
++/* Add data to start of the buffer */
++#define A_NETBUF_PUSH_DATA(bufPtr, srcPtr, len) \
++ a_netbuf_push_data(bufPtr, srcPtr, len)
++
++/* Remove data at start of the buffer */
++#define A_NETBUF_PULL_DATA(bufPtr, dstPtr, len) \
++ a_netbuf_pull_data(bufPtr, dstPtr, len)
++
++/* Remove data from the end of the buffer */
++#define A_NETBUF_TRIM_DATA(bufPtr, dstPtr, len) \
++ a_netbuf_trim_data(bufPtr, dstPtr, len)
++
++/* View data as "size" contiguous bytes of type "t" */
++#define A_NETBUF_VIEW_DATA(bufPtr, t, size) \
++ (t )( ((struct skbuf *)(bufPtr))->data)
++
++/* return the beginning of the headroom for the buffer */
++#define A_NETBUF_HEAD(bufPtr) \
++ ((((struct sk_buff *)(bufPtr))->head))
++
++/*
++ * OS specific network buffer access routines
++ */
++void *a_netbuf_alloc(int size);
++void *a_netbuf_alloc_raw(int size);
++void a_netbuf_free(void *bufPtr);
++void *a_netbuf_to_data(void *bufPtr);
++A_UINT32 a_netbuf_to_len(void *bufPtr);
++A_STATUS a_netbuf_push(void *bufPtr, A_INT32 len);
++A_STATUS a_netbuf_push_data(void *bufPtr, char *srcPtr, A_INT32 len);
++A_STATUS a_netbuf_put(void *bufPtr, A_INT32 len);
++A_STATUS a_netbuf_put_data(void *bufPtr, char *srcPtr, A_INT32 len);
++A_STATUS a_netbuf_pull(void *bufPtr, A_INT32 len);
++A_STATUS a_netbuf_pull_data(void *bufPtr, char *dstPtr, A_INT32 len);
++A_STATUS a_netbuf_trim(void *bufPtr, A_INT32 len);
++A_STATUS a_netbuf_trim_data(void *bufPtr, char *dstPtr, A_INT32 len);
++A_STATUS a_netbuf_setlen(void *bufPtr, A_INT32 len);
++A_INT32 a_netbuf_headroom(void *bufPtr);
++void a_netbuf_enqueue(A_NETBUF_QUEUE_T *q, void *pkt);
++void a_netbuf_prequeue(A_NETBUF_QUEUE_T *q, void *pkt);
++void *a_netbuf_dequeue(A_NETBUF_QUEUE_T *q);
++int a_netbuf_queue_size(A_NETBUF_QUEUE_T *q);
++int a_netbuf_queue_empty(A_NETBUF_QUEUE_T *q);
++int a_netbuf_queue_empty(A_NETBUF_QUEUE_T *q);
++void a_netbuf_queue_init(A_NETBUF_QUEUE_T *q);
++
++/*
++ * Kernel v.s User space functions
++ */
++A_UINT32 a_copy_to_user(void *to, const void *from, A_UINT32 n);
++A_UINT32 a_copy_from_user(void *to, const void *from, A_UINT32 n);
++
++#else /* __KERNEL__ */
++
++#ifdef __GNUC__
++#define __ATTRIB_PACK __attribute__ ((packed))
++#define __ATTRIB_PRINTF __attribute__ ((format (printf, 1, 2)))
++#define __ATTRIB_NORETURN __attribute__ ((noreturn))
++#ifndef INLINE
++#define INLINE __inline__
++#endif
++#else /* Not GCC */
++#define __ATTRIB_PACK
++#define __ATTRIB_PRINTF
++#define __ATTRIB_NORETURN
++#ifndef INLINE
++#define INLINE __inline
++#endif
++#endif /* End __GNUC__ */
++
++#define PREPACK
++#define POSTPACK __ATTRIB_PACK
++
++#endif /* __KERNEL__ */
++
++#endif /* _OSAPI_LINUX_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/wireless_ext.c linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/wireless_ext.c
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/ar6000/wireless_ext.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/ar6000/wireless_ext.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,1979 @@
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "ar6000_drv.h"
++
++static A_UINT8 bcast_mac[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
++static void ar6000_set_quality(struct iw_quality *iq, A_INT8 rssi);
++extern unsigned int wmitimeout;
++extern A_WAITQUEUE_HEAD arEvent;
++extern wait_queue_head_t ar6000_scan_queue;
++
++/*
++ * Encode a WPA or RSN information element as a custom
++ * element using the hostap format.
++ */
++static u_int
++encode_ie(void *buf, size_t bufsize,
++ const u_int8_t *ie, size_t ielen,
++ const char *leader, size_t leader_len)
++{
++ u_int8_t *p;
++ int i;
++
++ if (bufsize < leader_len)
++ return 0;
++ p = buf;
++ memcpy(p, leader, leader_len);
++ bufsize -= leader_len;
++ p += leader_len;
++ for (i = 0; i < ielen && bufsize > 2; i++)
++ p += sprintf(p, "%02x", ie[i]);
++ return (i == ielen ? p - (u_int8_t *)buf : 0);
++}
++
++void
++ar6000_scan_node(void *arg, bss_t *ni)
++{
++ struct iw_event iwe;
++#if WIRELESS_EXT > 14
++ char buf[64*2 + 30];
++#endif
++ struct ar_giwscan_param *param;
++ A_CHAR *current_ev;
++ A_CHAR *end_buf;
++ struct ieee80211_common_ie *cie;
++ struct iw_request_info info;
++
++ info.cmd = 0;
++ info.flags = 0;
++
++ param = (struct ar_giwscan_param *)arg;
++
++ if (param->current_ev >= param->end_buf) {
++ return;
++ }
++ if ((param->firstPass == TRUE) &&
++ ((ni->ni_cie.ie_wpa == NULL) && (ni->ni_cie.ie_rsn == NULL))) {
++ /*
++ * Only forward wpa bss's in first pass
++ */
++ return;
++ }
++
++ if ((param->firstPass == FALSE) &&
++ ((ni->ni_cie.ie_wpa != NULL) || (ni->ni_cie.ie_rsn != NULL))) {
++ /*
++ * Only forward non-wpa bss's in 2nd pass
++ */
++ return;
++ }
++
++ current_ev = param->current_ev;
++ end_buf = param->end_buf;
++
++ cie = &ni->ni_cie;
++
++ A_MEMZERO(&iwe, sizeof(iwe));
++ iwe.cmd = SIOCGIWAP;
++ iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
++ A_MEMCPY(iwe.u.ap_addr.sa_data, ni->ni_macaddr, 6);
++ current_ev = iwe_stream_add_event(&info, current_ev, end_buf, &iwe,
++ IW_EV_ADDR_LEN);
++
++ A_MEMZERO(&iwe, sizeof(iwe));
++ iwe.cmd = SIOCGIWESSID;
++ iwe.u.data.flags = 1;
++ iwe.u.data.length = cie->ie_ssid[1];
++ current_ev = iwe_stream_add_point(&info, current_ev, end_buf, &iwe,
++ &cie->ie_ssid[2]);
++
++ if (cie->ie_capInfo & (IEEE80211_CAPINFO_ESS|IEEE80211_CAPINFO_IBSS)) {
++ A_MEMZERO(&iwe, sizeof(iwe));
++ iwe.cmd = SIOCGIWMODE;
++ iwe.u.mode = cie->ie_capInfo & IEEE80211_CAPINFO_ESS ?
++ IW_MODE_MASTER : IW_MODE_ADHOC;
++ current_ev = iwe_stream_add_event(&info, current_ev, end_buf, &iwe,
++ IW_EV_UINT_LEN);
++ }
++
++ A_MEMZERO(&iwe, sizeof(iwe));
++ iwe.cmd = SIOCGIWFREQ;
++ iwe.u.freq.m = cie->ie_chan * 100000;
++ iwe.u.freq.e = 1;
++ current_ev = iwe_stream_add_event(&info, current_ev, end_buf, &iwe,
++ IW_EV_FREQ_LEN);
++
++ A_MEMZERO(&iwe, sizeof(iwe));
++ iwe.cmd = IWEVQUAL;
++ ar6000_set_quality(&iwe.u.qual, ni->ni_snr);
++ current_ev = iwe_stream_add_event(&info, current_ev, end_buf, &iwe,
++ IW_EV_QUAL_LEN);
++
++ A_MEMZERO(&iwe, sizeof(iwe));
++ iwe.cmd = SIOCGIWENCODE;
++ if (cie->ie_capInfo & IEEE80211_CAPINFO_PRIVACY) {
++ iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
++ } else {
++ iwe.u.data.flags = IW_ENCODE_DISABLED;
++ }
++ iwe.u.data.length = 0;
++ current_ev = iwe_stream_add_point(&info, current_ev, end_buf, &iwe, "");
++
++ A_MEMZERO(&iwe, sizeof(iwe));
++ iwe.cmd = IWEVCUSTOM;
++ snprintf(buf, sizeof(buf), "bcn_int=%d", cie->ie_beaconInt);
++ iwe.u.data.length = strlen(buf);
++ current_ev = iwe_stream_add_point(&info, current_ev, end_buf, &iwe, buf);
++
++ if (cie->ie_wpa != NULL) {
++ static const char wpa_leader[] = "wpa_ie=";
++
++ A_MEMZERO(&iwe, sizeof(iwe));
++ iwe.cmd = IWEVCUSTOM;
++ iwe.u.data.length = encode_ie(buf, sizeof(buf), cie->ie_wpa,
++ cie->ie_wpa[1]+2,
++ wpa_leader, sizeof(wpa_leader)-1);
++
++ if (iwe.u.data.length != 0) {
++ current_ev = iwe_stream_add_point(&info, current_ev, end_buf, &iwe,
++ buf);
++ }
++ }
++
++ if (cie->ie_rsn != NULL && cie->ie_rsn[0] == IEEE80211_ELEMID_RSN) {
++ static const char rsn_leader[] = "rsn_ie=";
++
++ A_MEMZERO(&iwe, sizeof(iwe));
++ iwe.cmd = IWEVCUSTOM;
++ iwe.u.data.length = encode_ie(buf, sizeof(buf), cie->ie_rsn,
++ cie->ie_rsn[1]+2,
++ rsn_leader, sizeof(rsn_leader)-1);
++
++ if (iwe.u.data.length != 0) {
++ current_ev = iwe_stream_add_point(&info, current_ev, end_buf, &iwe,
++ buf);
++ }
++ }
++
++ if (cie->ie_wmm != NULL) {
++ static const char wmm_leader[] = "wmm_ie=";
++
++ A_MEMZERO(&iwe, sizeof(iwe));
++ iwe.cmd = IWEVCUSTOM;
++ iwe.u.data.length = encode_ie(buf, sizeof(buf), cie->ie_wmm,
++ cie->ie_wmm[1]+2,
++ wmm_leader, sizeof(wmm_leader)-1);
++ if (iwe.u.data.length != 0) {
++ current_ev = iwe_stream_add_point(&info, current_ev, end_buf, &iwe,
++ buf);
++ }
++ }
++
++ if (cie->ie_ath != NULL) {
++ static const char ath_leader[] = "ath_ie=";
++
++ A_MEMZERO(&iwe, sizeof(iwe));
++ iwe.cmd = IWEVCUSTOM;
++ iwe.u.data.length = encode_ie(buf, sizeof(buf), cie->ie_ath,
++ cie->ie_ath[1]+2,
++ ath_leader, sizeof(ath_leader)-1);
++ if (iwe.u.data.length != 0) {
++ current_ev = iwe_stream_add_point(&info, current_ev, end_buf, &iwe,
++ buf);
++ }
++ }
++
++ param->current_ev = current_ev;
++}
++
++int
++ar6000_ioctl_giwscan(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_point *data, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ struct ar_giwscan_param param;
++ int i;
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ param.current_ev = extra;
++ param.end_buf = extra + IW_SCAN_MAX_DATA;
++ param.firstPass = TRUE;
++
++ /*
++ * Do two passes to insure WPA scan candidates
++ * are sorted to the front. This is a hack to deal with
++ * the wireless extensions capping scan results at
++ * IW_SCAN_MAX_DATA bytes. In densely populated environments
++ * it's easy to overflow this buffer (especially with WPA/RSN
++ * information elements). Note this sorting hack does not
++ * guarantee we won't overflow anyway.
++ */
++ for (i = 0; i < 2; i++) {
++ /*
++ * Translate data to WE format.
++ */
++ wmi_iterate_nodes(ar->arWmi, ar6000_scan_node, &param);
++ param.firstPass = FALSE;
++ if (param.current_ev >= param.end_buf) {
++ data->length = param.current_ev - extra;
++ return -E2BIG;
++ }
++ }
++
++ data->length = param.current_ev - extra;
++ return 0;
++}
++
++extern int reconnect_flag;
++/* SIOCSIWESSID */
++static int
++ar6000_ioctl_siwessid(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_point *data, char *ssid)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ A_STATUS status;
++ A_UINT8 arNetworkType;
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ /*
++ * iwconfig passes a string with length excluding any trailing NUL.
++ * FIXME: we should be able to set an ESSID of 32 bytes, yet things fall
++ * over badly if we do. So we limit the ESSID to 31 bytes.
++ */
++ if (data->flags && (!data->length || data->length >= sizeof(ar->arSsid))) {
++ /*
++ * ssid is invalid
++ */
++ return -EINVAL;
++ }
++ /* Added for bug 25178, return an IOCTL error instead of target returning
++ Illegal parameter error when either the BSSID or channel is missing
++ and we cannot scan during connect.
++ */
++ if (data->flags) {
++ if (ar->arSkipScan == TRUE &&
++ (ar->arChannelHint == 0 ||
++ (!ar->arReqBssid[0] && !ar->arReqBssid[1] && !ar->arReqBssid[2] &&
++ !ar->arReqBssid[3] && !ar->arReqBssid[4] && !ar->arReqBssid[5])))
++ {
++ return -EINVAL;
++ }
++ }
++
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++
++ if (ar->arTxPending[WMI_CONTROL_PRI]) {
++ /*
++ * sleep until the command queue drains
++ */
++ wait_event_interruptible_timeout(arEvent,
++ ar->arTxPending[WMI_CONTROL_PRI] == 0, wmitimeout * HZ);
++ if (signal_pending(current)) {
++ return -EINTR;
++ }
++ }
++
++ if (!data->flags) {
++ arNetworkType = ar->arNetworkType;
++ ar6000_init_profile_info(ar);
++ ar->arNetworkType = arNetworkType;
++ }
++
++ /*
++ * The original logic here prevented a disconnect if issuing an "essid off"
++ * if no ESSID was set, presumably to prevent sending multiple disconnects
++ * to the WMI.
++ *
++ * Unfortunately, this also meant that no disconnect was sent when we were
++ * already connected, but the profile has been changed since (which also
++ * clears the ESSID as a reminder that the WMI needs updating.)
++ *
++ * The "1 ||" makes sure we always disconnect or reconnect. The WMI doesn't
++ * seem to mind being sent multiple disconnects.
++ */
++ if (1 || (ar->arSsidLen) || (!data->flags))
++ {
++ if ((!data->flags) ||
++ (A_MEMCMP(ar->arSsid, ssid, ar->arSsidLen) != 0) ||
++ (ar->arSsidLen != (data->length)))
++ {
++ /*
++ * SSID set previously or essid off has been issued.
++ *
++ * Disconnect Command is issued in two cases after wmi is ready
++ * (1) ssid is different from the previous setting
++ * (2) essid off has been issued
++ *
++ */
++ if (ar->arWmiReady == TRUE) {
++ reconnect_flag = 0;
++ status = wmi_disconnect_cmd(ar->arWmi);
++ A_MEMZERO(ar->arSsid, sizeof(ar->arSsid));
++ ar->arSsidLen = 0;
++ if (ar->arSkipScan == FALSE) {
++ A_MEMZERO(ar->arReqBssid, sizeof(ar->arReqBssid));
++ }
++ if (!data->flags) {
++ up(&ar->arSem);
++ return 0;
++ }
++ } else {
++ up(&ar->arSem);
++ }
++ }
++ else
++ {
++ /*
++ * SSID is same, so we assume profile hasn't changed.
++ * If the interface is up and wmi is ready, we issue
++ * a reconnect cmd. Issue a reconnect only we are already
++ * connected.
++ */
++ if((ar->arConnected == TRUE) && (ar->arWmiReady == TRUE))
++ {
++ reconnect_flag = TRUE;
++ status = wmi_reconnect_cmd(ar->arWmi,ar->arReqBssid,
++ ar->arChannelHint);
++ up(&ar->arSem);
++ if (status != A_OK) {
++ return -EIO;
++ }
++ return 0;
++ }
++ else{
++ /*
++ * Dont return if connect is pending.
++ */
++ if(!(ar->arConnectPending)) {
++ up(&ar->arSem);
++ return 0;
++ }
++ }
++ }
++ }
++
++ ar->arSsidLen = data->length;
++ A_MEMCPY(ar->arSsid, ssid, ar->arSsidLen);
++
++ /* The ssid length check prevents second "essid off" from the user,
++ to be treated as a connect cmd. The second "essid off" is ignored.
++ */
++ if((ar->arWmiReady == TRUE) && (ar->arSsidLen > 0) )
++ {
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ if (SHARED_AUTH == ar->arDot11AuthMode) {
++ ar6000_install_static_wep_keys(ar);
++ }
++ AR_DEBUG_PRINTF("Connect called with authmode %d dot11 auth %d"\
++ " PW crypto %d PW crypto Len %d GRP crypto %d"\
++ " GRP crypto Len %d\n",
++ ar->arAuthMode, ar->arDot11AuthMode,
++ ar->arPairwiseCrypto, ar->arPairwiseCryptoLen,
++ ar->arGroupCrypto, ar->arGroupCryptoLen);
++ reconnect_flag = 0;
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ status = wmi_connect_cmd(ar->arWmi, ar->arNetworkType,
++ ar->arDot11AuthMode, ar->arAuthMode,
++ ar->arPairwiseCrypto, ar->arPairwiseCryptoLen,
++ ar->arGroupCrypto,ar->arGroupCryptoLen,
++ ar->arSsidLen, ar->arSsid,
++ ar->arReqBssid, ar->arChannelHint,
++ ar->arConnectCtrlFlags);
++
++
++ up(&ar->arSem);
++
++ if (status != A_OK) {
++ return -EIO;
++ }
++ ar->arConnectPending = TRUE;
++ }else{
++ up(&ar->arSem);
++ }
++ return 0;
++}
++
++/* SIOCGIWESSID */
++static int
++ar6000_ioctl_giwessid(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_point *data, char *essid)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ data->flags = 1;
++ data->length = ar->arSsidLen;
++ A_MEMCPY(essid, ar->arSsid, ar->arSsidLen);
++
++ return 0;
++}
++
++
++void ar6000_install_static_wep_keys(AR_SOFTC_T *ar)
++{
++ A_UINT8 index;
++ A_UINT8 keyUsage;
++
++ for (index = WMI_MIN_KEY_INDEX; index <= WMI_MAX_KEY_INDEX; index++) {
++ if (ar->arWepKeyList[index].arKeyLen) {
++ keyUsage = GROUP_USAGE;
++ if (index == ar->arDefTxKeyIndex) {
++ keyUsage |= TX_USAGE;
++ }
++ wmi_addKey_cmd(ar->arWmi,
++ index,
++ WEP_CRYPT,
++ keyUsage,
++ ar->arWepKeyList[index].arKeyLen,
++ NULL,
++ ar->arWepKeyList[index].arKey, KEY_OP_INIT_VAL,
++ NO_SYNC_WMIFLAG);
++ }
++ }
++}
++
++int
++ar6000_ioctl_delkey(struct net_device *dev, struct iw_request_info *info,
++ void *w, char *extra)
++{
++ return 0;
++}
++
++int
++ar6000_ioctl_setmlme(struct net_device *dev, struct iw_request_info *info,
++ void *w, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ struct ieee80211req_mlme *mlme = (struct ieee80211req_mlme *)extra;
++
++ if ((ar->arWmiReady == FALSE) || (ar->arConnected != TRUE))
++ return -EIO;
++
++ switch (mlme->im_op) {
++ case IEEE80211_MLME_DISASSOC:
++ case IEEE80211_MLME_DEAUTH:
++ /* Not Supported */
++ break;
++ default:
++ break;
++ }
++ return 0;
++}
++
++
++int
++ar6000_ioctl_setwmmparams(struct net_device *dev, struct iw_request_info *info,
++ void *w, char *extra)
++{
++ return -EIO; /* for now */
++}
++
++int
++ar6000_ioctl_getwmmparams(struct net_device *dev, struct iw_request_info *info,
++ void *w, char *extra)
++{
++ return -EIO; /* for now */
++}
++
++int ar6000_ioctl_setoptie(struct net_device *dev, struct iw_request_info *info,
++ struct iw_point *data, char *extra)
++{
++ /* The target generates the WPA/RSN IE */
++ return 0;
++}
++
++int
++ar6000_ioctl_setauthalg(struct net_device *dev, struct iw_request_info *info,
++ void *w, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ struct ieee80211req_authalg *req = (struct ieee80211req_authalg *)extra;
++ int ret = 0;
++
++
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++
++ if (req->auth_alg == AUTH_ALG_OPEN_SYSTEM) {
++ ar->arDot11AuthMode = OPEN_AUTH;
++ } else if (req->auth_alg == AUTH_ALG_LEAP) {
++ ar->arDot11AuthMode = LEAP_AUTH;
++ ar->arPairwiseCrypto = WEP_CRYPT;
++ ar->arGroupCrypto = WEP_CRYPT;
++ } else {
++ ret = -EIO;
++ }
++
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++
++ return ret;
++}
++static int
++ar6000_ioctl_addpmkid(struct net_device *dev, struct iw_request_info *info,
++ void *w, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ struct ieee80211req_addpmkid *req = (struct ieee80211req_addpmkid *)extra;
++ A_STATUS status;
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ AR_DEBUG_PRINTF("Add pmkid for %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x en=%d\n",
++ req->pi_bssid[0], req->pi_bssid[1], req->pi_bssid[2],
++ req->pi_bssid[3], req->pi_bssid[4], req->pi_bssid[5],
++ req->pi_enable);
++
++ status = wmi_setPmkid_cmd(ar->arWmi, req->pi_bssid, req->pi_pmkid,
++ req->pi_enable);
++
++ if (status != A_OK) {
++ return -EIO;
++ }
++
++ return 0;
++}
++
++/*
++ * SIOCSIWRATE
++ */
++int
++ar6000_ioctl_siwrate(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_param *rrq, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ A_UINT32 kbps;
++
++ if (rrq->fixed) {
++ kbps = rrq->value / 1000; /* rrq->value is in bps */
++ } else {
++ kbps = -1; /* -1 indicates auto rate */
++ }
++ if(kbps != -1 && wmi_validate_bitrate(ar->arWmi, kbps) == A_EINVAL)
++ {
++ AR_DEBUG_PRINTF("BitRate is not Valid %d\n", kbps);
++ return -EINVAL;
++ }
++ ar->arBitRate = kbps;
++ if(ar->arWmiReady == TRUE)
++ {
++ if (wmi_set_bitrate_cmd(ar->arWmi, kbps) != A_OK) {
++ return -EINVAL;
++ }
++ }
++ return 0;
++}
++
++/*
++ * SIOCGIWRATE
++ */
++int
++ar6000_ioctl_giwrate(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_param *rrq, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ int ret = 0;
++
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++ if(ar->arWmiReady == TRUE)
++ {
++ ar->arBitRate = 0xFFFF;
++ if (wmi_get_bitrate_cmd(ar->arWmi) != A_OK) {
++ up(&ar->arSem);
++ return -EIO;
++ }
++ wait_event_interruptible_timeout(arEvent, ar->arBitRate != 0xFFFF, wmitimeout * HZ);
++ if (signal_pending(current)) {
++ ret = -EINTR;
++ }
++ }
++ /* If the interface is down or wmi is not ready or the target is not
++ connected - return the value stored in the device structure */
++ if (!ret) {
++ if (ar->arBitRate == -1) {
++ rrq->fixed = TRUE;
++ rrq->value = 0;
++ } else {
++ rrq->value = ar->arBitRate * 1000;
++ }
++ }
++
++ up(&ar->arSem);
++
++ return ret;
++}
++
++/*
++ * SIOCSIWTXPOW
++ */
++static int
++ar6000_ioctl_siwtxpow(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_param *rrq, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ A_UINT8 dbM;
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ if (ar->arRadioSwitch == WLAN_ENABLED
++ && rrq->disabled) {
++ if (wmi_switch_radio(ar->arWmi, WLAN_DISABLED) < 0)
++ return -EIO;
++ ar->arRadioSwitch = WLAN_DISABLED;
++ } else if (ar->arRadioSwitch == WLAN_DISABLED
++ && !rrq->disabled) {
++ if (wmi_switch_radio(ar->arWmi, WLAN_ENABLED) < 0)
++ return -EIO;
++ ar->arRadioSwitch = WLAN_ENABLED;
++ }
++
++ if (rrq->fixed) {
++ if (rrq->flags != IW_TXPOW_DBM) {
++ return -EOPNOTSUPP;
++ }
++ ar->arTxPwr= dbM = rrq->value;
++ ar->arTxPwrSet = TRUE;
++ } else {
++ ar->arTxPwr = dbM = 0;
++ ar->arTxPwrSet = FALSE;
++ }
++ if(ar->arWmiReady == TRUE)
++ {
++ AR_DEBUG_PRINTF("Set tx pwr cmd %d dbM\n", dbM);
++ wmi_set_txPwr_cmd(ar->arWmi, dbM);
++ }
++ return 0;
++}
++
++/*
++ * SIOCGIWTXPOW
++ */
++int
++ar6000_ioctl_giwtxpow(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_param *rrq, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ int ret = 0;
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ if (ar->arRadioSwitch == WLAN_DISABLED) {
++ rrq->disabled = 1;
++ return 0;
++ }
++
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++ if((ar->arWmiReady == TRUE) && (ar->arConnected == TRUE))
++ {
++ ar->arTxPwr = 0;
++
++ if (wmi_get_txPwr_cmd(ar->arWmi) != A_OK) {
++ up(&ar->arSem);
++ return -EIO;
++ }
++
++ wait_event_interruptible_timeout(arEvent, ar->arTxPwr != 0, wmitimeout * HZ);
++
++ if (signal_pending(current)) {
++ ret = -EINTR;
++ }
++ }
++ /* If the interace is down or wmi is not ready or target is not connected
++ then return value stored in the device structure */
++
++ if (!ret) {
++ if (ar->arTxPwrSet == TRUE) {
++ rrq->fixed = TRUE;
++ }
++ rrq->value = ar->arTxPwr;
++ rrq->flags = IW_TXPOW_DBM;
++ }
++
++ up(&ar->arSem);
++
++ return ret;
++}
++
++/*
++ * SIOCSIWRETRY
++ * since iwconfig only provides us with one max retry value, we use it
++ * to apply to data frames of the BE traffic class.
++ */
++static int
++ar6000_ioctl_siwretry(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_param *rrq, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ if (rrq->disabled) {
++ return -EOPNOTSUPP;
++ }
++
++ if ((rrq->flags & IW_RETRY_TYPE) != IW_RETRY_LIMIT) {
++ return -EOPNOTSUPP;
++ }
++
++ if ( !(rrq->value >= WMI_MIN_RETRIES) || !(rrq->value <= WMI_MAX_RETRIES)) {
++ return - EINVAL;
++ }
++ if(ar->arWmiReady == TRUE)
++ {
++ if (wmi_set_retry_limits_cmd(ar->arWmi, DATA_FRAMETYPE, WMM_AC_BE,
++ rrq->value, 0) != A_OK){
++ return -EINVAL;
++ }
++ }
++ ar->arMaxRetries = rrq->value;
++ return 0;
++}
++
++/*
++ * SIOCGIWRETRY
++ */
++static int
++ar6000_ioctl_giwretry(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_param *rrq, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ rrq->disabled = 0;
++ switch (rrq->flags & IW_RETRY_TYPE) {
++ case IW_RETRY_LIFETIME:
++ return -EOPNOTSUPP;
++ break;
++ case IW_RETRY_LIMIT:
++ rrq->flags = IW_RETRY_LIMIT;
++ switch (rrq->flags & IW_RETRY_MODIFIER) {
++ case IW_RETRY_MIN:
++ rrq->flags |= IW_RETRY_MIN;
++ rrq->value = WMI_MIN_RETRIES;
++ break;
++ case IW_RETRY_MAX:
++ rrq->flags |= IW_RETRY_MAX;
++ rrq->value = ar->arMaxRetries;
++ break;
++ }
++ break;
++ }
++ return 0;
++}
++
++/*
++ * SIOCSIWENCODE
++ */
++static int
++ar6000_ioctl_siwencode(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_point *erq, char *keybuf)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ int index;
++ A_INT32 auth = ar->arDot11AuthMode;
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ index = erq->flags & IW_ENCODE_INDEX;
++
++ if (index && (((index - 1) < WMI_MIN_KEY_INDEX) ||
++ ((index - 1) > WMI_MAX_KEY_INDEX)))
++ {
++ return -EIO;
++ }
++
++ if (erq->flags & IW_ENCODE_DISABLED) {
++ /*
++ * Encryption disabled
++ */
++ if (index) {
++ /*
++ * If key index was specified then clear the specified key
++ */
++ index--;
++ A_MEMZERO(ar->arWepKeyList[index].arKey,
++ sizeof(ar->arWepKeyList[index].arKey));
++ ar->arWepKeyList[index].arKeyLen = 0;
++ }
++ ar->arDot11AuthMode = OPEN_AUTH;
++ ar->arPairwiseCrypto = NONE_CRYPT;
++ ar->arGroupCrypto = NONE_CRYPT;
++ ar->arAuthMode = NONE_AUTH;
++ } else {
++ /*
++ * Enabling WEP encryption
++ */
++ if (index) {
++ index--; /* keyindex is off base 1 in iwconfig */
++ }
++
++ if (erq->flags & IW_ENCODE_OPEN) {
++ auth = OPEN_AUTH;
++ } else if (erq->flags & IW_ENCODE_RESTRICTED) {
++ auth = SHARED_AUTH;
++ }
++
++ if (erq->length) {
++ if (!IEEE80211_IS_VALID_WEP_CIPHER_LEN(erq->length)) {
++ return -EIO;
++ }
++
++ A_MEMZERO(ar->arWepKeyList[index].arKey,
++ sizeof(ar->arWepKeyList[index].arKey));
++ A_MEMCPY(ar->arWepKeyList[index].arKey, keybuf, erq->length);
++ ar->arWepKeyList[index].arKeyLen = erq->length;
++ } else {
++ if (ar->arWepKeyList[index].arKeyLen == 0) {
++ return -EIO;
++ }
++ ar->arDefTxKeyIndex = index;
++ }
++
++ ar->arPairwiseCrypto = WEP_CRYPT;
++ ar->arGroupCrypto = WEP_CRYPT;
++ ar->arDot11AuthMode = auth;
++ ar->arAuthMode = NONE_AUTH;
++ }
++
++ /*
++ * profile has changed. Erase ssid to signal change
++ */
++ A_MEMZERO(ar->arSsid, sizeof(ar->arSsid));
++ ar->arSsidLen = 0;
++
++ return 0;
++}
++
++static int
++ar6000_ioctl_giwencode(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_point *erq, char *key)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ A_UINT8 keyIndex;
++ struct ar_wep_key *wk;
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ if (ar->arPairwiseCrypto == NONE_CRYPT) {
++ erq->length = 0;
++ erq->flags = IW_ENCODE_DISABLED;
++ } else {
++ /* get the keyIndex */
++ keyIndex = erq->flags & IW_ENCODE_INDEX;
++ if (0 == keyIndex) {
++ keyIndex = ar->arDefTxKeyIndex;
++ } else if ((keyIndex - 1 < WMI_MIN_KEY_INDEX) ||
++ (keyIndex - 1 > WMI_MAX_KEY_INDEX))
++ {
++ keyIndex = WMI_MIN_KEY_INDEX;
++ } else {
++ keyIndex--;
++ }
++ erq->flags = keyIndex + 1;
++ erq->flags |= IW_ENCODE_ENABLED;
++ wk = &ar->arWepKeyList[keyIndex];
++ if (erq->length > wk->arKeyLen) {
++ erq->length = wk->arKeyLen;
++ }
++ if (wk->arKeyLen) {
++ A_MEMCPY(key, wk->arKey, erq->length);
++ }
++ if (ar->arDot11AuthMode == OPEN_AUTH) {
++ erq->flags |= IW_ENCODE_OPEN;
++ } else if (ar->arDot11AuthMode == SHARED_AUTH) {
++ erq->flags |= IW_ENCODE_RESTRICTED;
++ }
++ }
++
++ return 0;
++}
++
++static int ar6000_ioctl_siwpower(struct net_device *dev,
++ struct iw_request_info *info,
++ union iwreq_data *wrqu, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_POWER_MODE power_mode;
++
++ if (wrqu->power.disabled)
++ power_mode = MAX_PERF_POWER;
++ else
++ power_mode = REC_POWER;
++
++ if (wmi_powermode_cmd(ar->arWmi, power_mode) < 0)
++ return -EIO;
++
++ return 0;
++}
++
++static int ar6000_ioctl_giwpower(struct net_device *dev,
++ struct iw_request_info *info,
++ union iwreq_data *wrqu, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ /*
++ * FIXME:
++ * https://docs.openmoko.org/trac/ticket/2267
++ * When starting wpa_supplicant the kernel oopses.
++ * The following condition avoids the oops.
++ * Remove this comment to bless this solution.
++ */
++ if (ar->arWlanState == WLAN_DISABLED || ar->arWmiReady == FALSE)
++ return -EIO;
++
++ return wmi_get_power_mode_cmd(ar->arWmi);
++}
++
++static int ar6000_ioctl_siwgenie(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_point *dwrq,
++ char *extra)
++{
++ /* The target does that for us */
++ return 0;
++}
++
++static int ar6000_ioctl_giwgenie(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_point *dwrq,
++ char *extra)
++{
++ return 0;
++}
++
++static int ar6000_ioctl_siwauth(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_param *param,
++ char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ int reset = 0;
++
++ switch (param->flags & IW_AUTH_INDEX) {
++ case IW_AUTH_WPA_VERSION:
++ if (param->value & IW_AUTH_WPA_VERSION_DISABLED) {
++ ar->arAuthMode = NONE_AUTH;
++ }
++ if (param->value & IW_AUTH_WPA_VERSION_WPA) {
++ ar->arAuthMode = WPA_AUTH;
++ }
++ if (param->value & IW_AUTH_WPA_VERSION_WPA2) {
++ ar->arAuthMode = WPA2_AUTH;
++ }
++
++ reset = 1;
++ break;
++ case IW_AUTH_CIPHER_PAIRWISE:
++ if (param->value & IW_AUTH_CIPHER_NONE) {
++ ar->arPairwiseCrypto = NONE_CRYPT;
++ }
++ if (param->value & IW_AUTH_CIPHER_WEP40) {
++ ar->arPairwiseCrypto = WEP_CRYPT;
++ }
++ if (param->value & IW_AUTH_CIPHER_TKIP) {
++ ar->arPairwiseCrypto = TKIP_CRYPT;
++ }
++ if (param->value & IW_AUTH_CIPHER_CCMP) {
++ ar->arPairwiseCrypto = AES_CRYPT;
++ }
++
++ reset = 1;
++ break;
++ case IW_AUTH_CIPHER_GROUP:
++ if (param->value & IW_AUTH_CIPHER_NONE) {
++ ar->arGroupCrypto = NONE_CRYPT;
++ }
++ if (param->value & IW_AUTH_CIPHER_WEP40) {
++ ar->arGroupCrypto = WEP_CRYPT;
++ }
++ if (param->value & IW_AUTH_CIPHER_TKIP) {
++ ar->arGroupCrypto = TKIP_CRYPT;
++ }
++ if (param->value & IW_AUTH_CIPHER_CCMP) {
++ ar->arGroupCrypto = AES_CRYPT;
++ }
++
++ reset = 1;
++ break;
++ case IW_AUTH_KEY_MGMT:
++ if (param->value & IW_AUTH_KEY_MGMT_PSK) {
++ if (ar->arAuthMode == WPA_AUTH) {
++ ar->arAuthMode = WPA_PSK_AUTH;
++ } else if (ar->arAuthMode == WPA2_AUTH) {
++ ar->arAuthMode = WPA2_PSK_AUTH;
++ }
++
++ reset = 1;
++ }
++ break;
++
++ case IW_AUTH_TKIP_COUNTERMEASURES:
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++ wmi_set_tkip_countermeasures_cmd(ar->arWmi, param->value);
++ break;
++
++ case IW_AUTH_DROP_UNENCRYPTED:
++ break;
++
++ case IW_AUTH_80211_AUTH_ALG:
++ if (param->value & IW_AUTH_ALG_OPEN_SYSTEM) {
++ ar->arDot11AuthMode = OPEN_AUTH;
++ }
++ if (param->value & IW_AUTH_ALG_SHARED_KEY) {
++ ar->arDot11AuthMode = SHARED_AUTH;
++ }
++ if (param->value & IW_AUTH_ALG_LEAP) {
++ ar->arDot11AuthMode = LEAP_AUTH;
++ ar->arPairwiseCrypto = WEP_CRYPT;
++ ar->arGroupCrypto = WEP_CRYPT;
++ }
++
++ reset = 1;
++ break;
++
++ case IW_AUTH_WPA_ENABLED:
++ reset = 1;
++ break;
++
++ case IW_AUTH_RX_UNENCRYPTED_EAPOL:
++ break;
++
++ case IW_AUTH_PRIVACY_INVOKED:
++ break;
++
++ default:
++ printk("%s(): Unknown flag 0x%x\n", __FUNCTION__, param->flags);
++ return -EOPNOTSUPP;
++ }
++
++ if (reset) {
++ A_MEMZERO(ar->arSsid, sizeof(ar->arSsid));
++ ar->arSsidLen = 0;
++ }
++
++ return 0;
++}
++
++static int ar6000_ioctl_giwauth(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_param *dwrq,
++ char *extra)
++{
++ return 0;
++}
++
++static int ar6000_ioctl_siwencodeext(struct net_device *dev,
++ struct iw_request_info *info,
++ union iwreq_data *wrqu,
++ char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ struct iw_point *encoding = &wrqu->encoding;
++ struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
++ int alg = ext->alg, idx;
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ /* Determine and validate the key index */
++ idx = (encoding->flags & IW_ENCODE_INDEX) - 1;
++ if (idx) {
++ if (idx < 0 || idx > 3)
++ return -EINVAL;
++ }
++
++ if ((alg == IW_ENCODE_ALG_TKIP) || (alg == IW_ENCODE_ALG_CCMP)) {
++ struct ieee80211req_key ik;
++ KEY_USAGE key_usage;
++ CRYPTO_TYPE key_type = NONE_CRYPT;
++ int status;
++
++ ar->user_saved_keys.keyOk = FALSE;
++
++ if (alg == IW_ENCODE_ALG_TKIP) {
++ key_type = TKIP_CRYPT;
++ ik.ik_type = IEEE80211_CIPHER_TKIP;
++ } else {
++ key_type = AES_CRYPT;
++ ik.ik_type = IEEE80211_CIPHER_AES_CCM;
++ }
++
++ ik.ik_keyix = idx;
++ ik.ik_keylen = ext->key_len;
++ ik.ik_flags = IEEE80211_KEY_RECV;
++ if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {
++ ik.ik_flags |= IEEE80211_KEY_XMIT
++ | IEEE80211_KEY_DEFAULT;
++ }
++
++ if (ext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID) {
++ memcpy(&ik.ik_keyrsc, ext->rx_seq, 8);
++ }
++
++ memcpy(ik.ik_keydata, ext->key, ext->key_len);
++
++ ar->user_saved_keys.keyType = key_type;
++ if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {
++ key_usage = GROUP_USAGE;
++ memset(ik.ik_macaddr, 0, ETH_ALEN);
++ memcpy(&ar->user_saved_keys.bcast_ik, &ik,
++ sizeof(struct ieee80211req_key));
++ } else {
++ key_usage = PAIRWISE_USAGE;
++ memcpy(ik.ik_macaddr, ext->addr.sa_data, ETH_ALEN);
++ memcpy(&ar->user_saved_keys.ucast_ik, &ik,
++ sizeof(struct ieee80211req_key));
++ }
++
++ status = wmi_addKey_cmd(ar->arWmi, ik.ik_keyix, key_type,
++ key_usage, ik.ik_keylen,
++ (A_UINT8 *)&ik.ik_keyrsc,
++ ik.ik_keydata,
++ KEY_OP_INIT_VAL, SYNC_BEFORE_WMIFLAG);
++
++ if (status < 0)
++ return -EIO;
++
++ ar->user_saved_keys.keyOk = TRUE;
++
++ return 0;
++
++ } else {
++ /* WEP falls back to SIWENCODE */
++ return -EOPNOTSUPP;
++ }
++
++ return 0;
++}
++
++
++static int ar6000_ioctl_giwencodeext(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_point *dwrq,
++ char *extra)
++{
++ return 0;
++}
++
++
++static int
++ar6000_ioctl_setparam(struct net_device *dev,
++ struct iw_request_info *info,
++ void *erq, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ int *i = (int *)extra;
++ int param = i[0];
++ int value = i[1];
++ int ret = 0;
++ A_BOOL profChanged = FALSE;
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ switch (param) {
++ case IEEE80211_PARAM_WPA:
++ switch (value) {
++ case WPA_MODE_WPA1:
++ ar->arAuthMode = WPA_AUTH;
++ profChanged = TRUE;
++ break;
++ case WPA_MODE_WPA2:
++ ar->arAuthMode = WPA2_AUTH;
++ profChanged = TRUE;
++ break;
++ case WPA_MODE_NONE:
++ ar->arAuthMode = NONE_AUTH;
++ profChanged = TRUE;
++ break;
++ default:
++ printk("IEEE80211_PARAM_WPA: Unknown value %d\n", value);
++ }
++ break;
++ case IEEE80211_PARAM_AUTHMODE:
++ switch(value) {
++ case IEEE80211_AUTH_WPA_PSK:
++ if (WPA_AUTH == ar->arAuthMode) {
++ ar->arAuthMode = WPA_PSK_AUTH;
++ profChanged = TRUE;
++ } else if (WPA2_AUTH == ar->arAuthMode) {
++ ar->arAuthMode = WPA2_PSK_AUTH;
++ profChanged = TRUE;
++ } else {
++ AR_DEBUG_PRINTF("Error - Setting PSK mode when WPA "\
++ "param was set to %d\n",
++ ar->arAuthMode);
++ ret = -1;
++ }
++ break;
++ case IEEE80211_AUTH_WPA_CCKM:
++ if (WPA2_AUTH == ar->arAuthMode) {
++ ar->arAuthMode = WPA2_AUTH_CCKM;
++ } else {
++ ar->arAuthMode = WPA_AUTH_CCKM;
++ }
++ break;
++ default:
++ break;
++ }
++ break;
++ case IEEE80211_PARAM_UCASTCIPHER:
++ switch (value) {
++ case IEEE80211_CIPHER_AES_CCM:
++ ar->arPairwiseCrypto = AES_CRYPT;
++ profChanged = TRUE;
++ break;
++ case IEEE80211_CIPHER_TKIP:
++ ar->arPairwiseCrypto = TKIP_CRYPT;
++ profChanged = TRUE;
++ break;
++ case IEEE80211_CIPHER_WEP:
++ ar->arPairwiseCrypto = WEP_CRYPT;
++ profChanged = TRUE;
++ break;
++ case IEEE80211_CIPHER_NONE:
++ ar->arPairwiseCrypto = NONE_CRYPT;
++ profChanged = TRUE;
++ break;
++ }
++ break;
++ case IEEE80211_PARAM_UCASTKEYLEN:
++ if (!IEEE80211_IS_VALID_WEP_CIPHER_LEN(value)) {
++ ret = -EIO;
++ } else {
++ ar->arPairwiseCryptoLen = value;
++ }
++ break;
++ case IEEE80211_PARAM_MCASTCIPHER:
++ switch (value) {
++ case IEEE80211_CIPHER_AES_CCM:
++ ar->arGroupCrypto = AES_CRYPT;
++ profChanged = TRUE;
++ break;
++ case IEEE80211_CIPHER_TKIP:
++ ar->arGroupCrypto = TKIP_CRYPT;
++ profChanged = TRUE;
++ break;
++ case IEEE80211_CIPHER_WEP:
++ ar->arGroupCrypto = WEP_CRYPT;
++ profChanged = TRUE;
++ break;
++ case IEEE80211_CIPHER_NONE:
++ ar->arGroupCrypto = NONE_CRYPT;
++ profChanged = TRUE;
++ break;
++ }
++ break;
++ case IEEE80211_PARAM_MCASTKEYLEN:
++ if (!IEEE80211_IS_VALID_WEP_CIPHER_LEN(value)) {
++ ret = -EIO;
++ } else {
++ ar->arGroupCryptoLen = value;
++ }
++ break;
++ case IEEE80211_PARAM_COUNTERMEASURES:
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++ wmi_set_tkip_countermeasures_cmd(ar->arWmi, value);
++ break;
++ default:
++ break;
++ }
++
++ if (profChanged == TRUE) {
++ /*
++ * profile has changed. Erase ssid to signal change
++ */
++ A_MEMZERO(ar->arSsid, sizeof(ar->arSsid));
++ ar->arSsidLen = 0;
++ }
++
++ return ret;
++}
++
++int
++ar6000_ioctl_getparam(struct net_device *dev, struct iw_request_info *info,
++ void *w, char *extra)
++{
++ return -EIO; /* for now */
++}
++
++int
++ar6000_ioctl_setkey(struct net_device *dev, struct iw_request_info *info,
++ void *w, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ struct ieee80211req_key *ik = (struct ieee80211req_key *)extra;
++ KEY_USAGE keyUsage;
++ A_STATUS status;
++ CRYPTO_TYPE keyType = NONE_CRYPT;
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ ar->user_saved_keys.keyOk = FALSE;
++
++ if ( 0 == memcmp(ik->ik_macaddr, "\x00\x00\x00\x00\x00\x00",
++ IEEE80211_ADDR_LEN)) {
++ keyUsage = GROUP_USAGE;
++ A_MEMCPY(&ar->user_saved_keys.bcast_ik, ik,
++ sizeof(struct ieee80211req_key));
++ } else {
++ keyUsage = PAIRWISE_USAGE;
++ A_MEMCPY(&ar->user_saved_keys.ucast_ik, ik,
++ sizeof(struct ieee80211req_key));
++ }
++
++ switch (ik->ik_type) {
++ case IEEE80211_CIPHER_WEP:
++ keyType = WEP_CRYPT;
++ break;
++ case IEEE80211_CIPHER_TKIP:
++ keyType = TKIP_CRYPT;
++ break;
++ case IEEE80211_CIPHER_AES_CCM:
++ keyType = AES_CRYPT;
++ break;
++ default:
++ break;
++ }
++ ar->user_saved_keys.keyType = keyType;
++
++ if (IEEE80211_CIPHER_CCKM_KRK != ik->ik_type) {
++ if (NONE_CRYPT == keyType) {
++ return -EIO;
++ }
++
++ status = wmi_addKey_cmd(ar->arWmi, ik->ik_keyix, keyType, keyUsage,
++ ik->ik_keylen, (A_UINT8 *)&ik->ik_keyrsc,
++ ik->ik_keydata, KEY_OP_INIT_VAL,
++ SYNC_BEFORE_WMIFLAG);
++
++ if (status != A_OK) {
++ return -EIO;
++ }
++ } else {
++ status = wmi_add_krk_cmd(ar->arWmi, ik->ik_keydata);
++ }
++
++ ar->user_saved_keys.keyOk = TRUE;
++
++ return 0;
++}
++
++
++/*
++ * SIOCGIWNAME
++ */
++int
++ar6000_ioctl_giwname(struct net_device *dev,
++ struct iw_request_info *info,
++ char *name, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ switch (ar->arPhyCapability) {
++ case (WMI_11A_CAPABILITY):
++ strncpy(name, "AR6000 802.11a", IFNAMSIZ);
++ break;
++ case (WMI_11G_CAPABILITY):
++ strncpy(name, "AR6000 802.11g", IFNAMSIZ);
++ break;
++ case (WMI_11AG_CAPABILITY):
++ strncpy(name, "AR6000 802.11ag", IFNAMSIZ);
++ break;
++ default:
++ strncpy(name, "AR6000 802.11", IFNAMSIZ);
++ break;
++ }
++
++ return 0;
++}
++
++/*
++ * SIOCSIWFREQ
++ */
++int
++ar6000_ioctl_siwfreq(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_freq *freq, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ /*
++ * We support limiting the channels via wmiconfig.
++ *
++ * We use this command to configure the channel hint for the connect cmd
++ * so it is possible the target will end up connecting to a different
++ * channel.
++ */
++ if (freq->e > 1) {
++ return -EINVAL;
++ } else if (freq->e == 1) {
++ ar->arChannelHint = freq->m / 100000;
++ } else {
++ ar->arChannelHint = wlan_ieee2freq(freq->m);
++ }
++
++ A_PRINTF("channel hint set to %d\n", ar->arChannelHint);
++ return 0;
++}
++
++/*
++ * SIOCGIWFREQ
++ */
++int
++ar6000_ioctl_giwfreq(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_freq *freq, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ if (ar->arConnected != TRUE) {
++ return -EINVAL;
++ }
++
++ freq->m = ar->arBssChannel * 100000;
++ freq->e = 1;
++
++ return 0;
++}
++
++/*
++ * SIOCSIWMODE
++ */
++int
++ar6000_ioctl_siwmode(struct net_device *dev,
++ struct iw_request_info *info,
++ __u32 *mode, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ switch (*mode) {
++ case IW_MODE_INFRA:
++ ar->arNetworkType = INFRA_NETWORK;
++ break;
++ case IW_MODE_ADHOC:
++ ar->arNetworkType = ADHOC_NETWORK;
++ break;
++ default:
++ return -EINVAL;
++ }
++
++ return 0;
++}
++
++/*
++ * SIOCGIWMODE
++ */
++int
++ar6000_ioctl_giwmode(struct net_device *dev,
++ struct iw_request_info *info,
++ __u32 *mode, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ switch (ar->arNetworkType) {
++ case INFRA_NETWORK:
++ *mode = IW_MODE_INFRA;
++ break;
++ case ADHOC_NETWORK:
++ *mode = IW_MODE_ADHOC;
++ break;
++ default:
++ return -EIO;
++ }
++ return 0;
++}
++
++/*
++ * SIOCSIWSENS
++ */
++int
++ar6000_ioctl_siwsens(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_param *sens, char *extra)
++{
++ return 0;
++}
++
++/*
++ * SIOCGIWSENS
++ */
++int
++ar6000_ioctl_giwsens(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_param *sens, char *extra)
++{
++ sens->value = 0;
++ sens->fixed = 1;
++
++ return 0;
++}
++
++/*
++ * SIOCGIWRANGE
++ */
++int
++ar6000_ioctl_giwrange(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_point *data, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ struct iw_range *range = (struct iw_range *) extra;
++ int i, ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++ ar->arNumChannels = -1;
++ A_MEMZERO(ar->arChannelList, sizeof (ar->arChannelList));
++
++ if (wmi_get_channelList_cmd(ar->arWmi) != A_OK) {
++ up(&ar->arSem);
++ return -EIO;
++ }
++
++ wait_event_interruptible_timeout(arEvent, ar->arNumChannels != -1, wmitimeout * HZ);
++
++ if (signal_pending(current)) {
++ up(&ar->arSem);
++ return -EINTR;
++ }
++
++ data->length = sizeof(struct iw_range);
++ A_MEMZERO(range, sizeof(struct iw_range));
++
++ range->txpower_capa = IW_TXPOW_DBM;
++
++ range->min_pmp = 1 * 1024;
++ range->max_pmp = 65535 * 1024;
++ range->min_pmt = 1 * 1024;
++ range->max_pmt = 1000 * 1024;
++ range->pmp_flags = IW_POWER_PERIOD;
++ range->pmt_flags = IW_POWER_TIMEOUT;
++ range->pm_capa = 0;
++
++ range->we_version_compiled = WIRELESS_EXT;
++ range->we_version_source = 13;
++
++ range->retry_capa = IW_RETRY_LIMIT;
++ range->retry_flags = IW_RETRY_LIMIT;
++ range->min_retry = 0;
++ range->max_retry = 255;
++
++ range->num_frequency = range->num_channels = ar->arNumChannels;
++ for (i = 0; i < ar->arNumChannels; i++) {
++ range->freq[i].i = wlan_freq2ieee(ar->arChannelList[i]);
++ range->freq[i].m = ar->arChannelList[i] * 100000;
++ range->freq[i].e = 1;
++ /*
++ * Linux supports max of 32 channels, bail out once you
++ * reach the max.
++ */
++ if (i == IW_MAX_FREQUENCIES) {
++ break;
++ }
++ }
++
++ /* Max quality is max field value minus noise floor */
++ range->max_qual.qual = 0xff - 161;
++
++ /*
++ * In order to use dBm measurements, 'level' must be lower
++ * than any possible measurement (see iw_print_stats() in
++ * wireless tools). It's unclear how this is meant to be
++ * done, but setting zero in these values forces dBm and
++ * the actual numbers are not used.
++ */
++ range->max_qual.level = 0;
++ range->max_qual.noise = 0;
++
++ range->sensitivity = 3;
++
++ range->max_encoding_tokens = 4;
++ /* XXX query driver to find out supported key sizes */
++ range->num_encoding_sizes = 3;
++ range->encoding_size[0] = 5; /* 40-bit */
++ range->encoding_size[1] = 13; /* 104-bit */
++ range->encoding_size[2] = 16; /* 128-bit */
++
++ range->num_bitrates = 0;
++
++ /* estimated maximum TCP throughput values (bps) */
++ range->throughput = 22000000;
++
++ range->min_rts = 0;
++ range->max_rts = 2347;
++ range->min_frag = 256;
++ range->max_frag = 2346;
++
++ up(&ar->arSem);
++
++ return ret;
++}
++
++
++/*
++ * SIOCSIWAP
++ * This ioctl is used to set the desired bssid for the connect command.
++ */
++int
++ar6000_ioctl_siwap(struct net_device *dev,
++ struct iw_request_info *info,
++ struct sockaddr *ap_addr, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ if (ap_addr->sa_family != ARPHRD_ETHER) {
++ return -EIO;
++ }
++
++ if (A_MEMCMP(&ap_addr->sa_data, bcast_mac, AR6000_ETH_ADDR_LEN) == 0) {
++ A_MEMZERO(ar->arReqBssid, sizeof(ar->arReqBssid));
++ } else {
++ A_MEMCPY(ar->arReqBssid, &ap_addr->sa_data, sizeof(ar->arReqBssid));
++ }
++
++ return 0;
++}
++
++/*
++ * SIOCGIWAP
++ */
++int
++ar6000_ioctl_giwap(struct net_device *dev,
++ struct iw_request_info *info,
++ struct sockaddr *ap_addr, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ if (ar->arConnected != TRUE) {
++ return -EINVAL;
++ }
++
++ A_MEMCPY(&ap_addr->sa_data, ar->arBssid, sizeof(ar->arBssid));
++ ap_addr->sa_family = ARPHRD_ETHER;
++
++ return 0;
++}
++
++/*
++ * SIOCGIWAPLIST
++ */
++int
++ar6000_ioctl_iwaplist(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_point *data, char *extra)
++{
++ return -EIO; /* for now */
++}
++
++/*
++ * SIOCSIWSCAN
++ */
++int
++ar6000_ioctl_siwscan(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_point *data, char *extra)
++{
++#define ACT_DWELLTIME_DEFAULT 105
++#define HOME_TXDRAIN_TIME 100
++#define SCAN_INT HOME_TXDRAIN_TIME + ACT_DWELLTIME_DEFAULT
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ /* We ask for everything from the target */
++ if (wmi_bssfilter_cmd(ar->arWmi, ALL_BSS_FILTER, 0) != A_OK) {
++ printk("Couldn't set filtering\n");
++ ret = -EIO;
++ }
++
++ if (wmi_startscan_cmd(ar->arWmi, WMI_LONG_SCAN, FALSE, FALSE, \
++ HOME_TXDRAIN_TIME, SCAN_INT) != A_OK) {
++ ret = -EIO;
++ }
++
++ ar->scan_complete = 0;
++ wait_event_interruptible_timeout(ar6000_scan_queue, ar->scan_complete,
++ 5 * HZ);
++
++ if (wmi_bssfilter_cmd(ar->arWmi, NONE_BSS_FILTER, 0) != A_OK) {
++ printk("Couldn't set filtering\n");
++ ret = -EIO;
++ }
++
++ return ret;
++#undef ACT_DWELLTIME_DEFAULT
++#undef HOME_TXDRAIN_TIME
++#undef SCAN_INT
++}
++
++
++/*
++ * Units are in db above the noise floor. That means the
++ * rssi values reported in the tx/rx descriptors in the
++ * driver are the SNR expressed in db.
++ *
++ * If you assume that the noise floor is -95, which is an
++ * excellent assumption 99.5 % of the time, then you can
++ * derive the absolute signal level (i.e. -95 + rssi).
++ * There are some other slight factors to take into account
++ * depending on whether the rssi measurement is from 11b,
++ * 11g, or 11a. These differences are at most 2db and
++ * can be documented.
++ *
++ * NB: various calculations are based on the orinoco/wavelan
++ * drivers for compatibility
++ */
++static void
++ar6000_set_quality(struct iw_quality *iq, A_INT8 rssi)
++{
++ if (rssi < 0) {
++ iq->qual = 0;
++ } else {
++ iq->qual = rssi;
++ }
++
++ /* NB: max is 94 because noise is hardcoded to 161 */
++ if (iq->qual > 94)
++ iq->qual = 94;
++
++ iq->noise = 161; /* -95dBm */
++ iq->level = iq->noise + iq->qual;
++ iq->updated = 7;
++}
++
++
++/* Structures to export the Wireless Handlers */
++static const iw_handler ath_handlers[] = {
++ (iw_handler) NULL, /* SIOCSIWCOMMIT */
++ (iw_handler) ar6000_ioctl_giwname, /* SIOCGIWNAME */
++ (iw_handler) NULL, /* SIOCSIWNWID */
++ (iw_handler) NULL, /* SIOCGIWNWID */
++ (iw_handler) ar6000_ioctl_siwfreq, /* SIOCSIWFREQ */
++ (iw_handler) ar6000_ioctl_giwfreq, /* SIOCGIWFREQ */
++ (iw_handler) ar6000_ioctl_siwmode, /* SIOCSIWMODE */
++ (iw_handler) ar6000_ioctl_giwmode, /* SIOCGIWMODE */
++ (iw_handler) ar6000_ioctl_siwsens, /* SIOCSIWSENS */
++ (iw_handler) ar6000_ioctl_giwsens, /* SIOCGIWSENS */
++ (iw_handler) NULL /* not _used */, /* SIOCSIWRANGE */
++ (iw_handler) ar6000_ioctl_giwrange, /* SIOCGIWRANGE */
++ (iw_handler) NULL /* not used */, /* SIOCSIWPRIV */
++ (iw_handler) NULL /* kernel code */, /* SIOCGIWPRIV */
++ (iw_handler) NULL /* not used */, /* SIOCSIWSTATS */
++ (iw_handler) NULL /* kernel code */, /* SIOCGIWSTATS */
++ (iw_handler) NULL, /* SIOCSIWSPY */
++ (iw_handler) NULL, /* SIOCGIWSPY */
++ (iw_handler) NULL, /* SIOCSIWTHRSPY */
++ (iw_handler) NULL, /* SIOCGIWTHRSPY */
++ (iw_handler) ar6000_ioctl_siwap, /* SIOCSIWAP */
++ (iw_handler) ar6000_ioctl_giwap, /* SIOCGIWAP */
++ (iw_handler) NULL, /* -- hole -- */
++ (iw_handler) ar6000_ioctl_iwaplist, /* SIOCGIWAPLIST */
++ (iw_handler) ar6000_ioctl_siwscan, /* SIOCSIWSCAN */
++ (iw_handler) ar6000_ioctl_giwscan, /* SIOCGIWSCAN */
++ (iw_handler) ar6000_ioctl_siwessid, /* SIOCSIWESSID */
++ (iw_handler) ar6000_ioctl_giwessid, /* SIOCGIWESSID */
++ (iw_handler) NULL, /* SIOCSIWNICKN */
++ (iw_handler) NULL, /* SIOCGIWNICKN */
++ (iw_handler) NULL, /* -- hole -- */
++ (iw_handler) NULL, /* -- hole -- */
++ (iw_handler) ar6000_ioctl_siwrate, /* SIOCSIWRATE */
++ (iw_handler) ar6000_ioctl_giwrate, /* SIOCGIWRATE */
++ (iw_handler) NULL, /* SIOCSIWRTS */
++ (iw_handler) NULL, /* SIOCGIWRTS */
++ (iw_handler) NULL, /* SIOCSIWFRAG */
++ (iw_handler) NULL, /* SIOCGIWFRAG */
++ (iw_handler) ar6000_ioctl_siwtxpow, /* SIOCSIWTXPOW */
++ (iw_handler) ar6000_ioctl_giwtxpow, /* SIOCGIWTXPOW */
++ (iw_handler) ar6000_ioctl_siwretry, /* SIOCSIWRETRY */
++ (iw_handler) ar6000_ioctl_giwretry, /* SIOCGIWRETRY */
++ (iw_handler) ar6000_ioctl_siwencode, /* SIOCSIWENCODE */
++ (iw_handler) ar6000_ioctl_giwencode, /* SIOCGIWENCODE */
++ (iw_handler) ar6000_ioctl_siwpower, /* SIOCSIWPOWER */
++ (iw_handler) ar6000_ioctl_giwpower, /* SIOCGIWPOWER */
++ (iw_handler) NULL, /* -- hole -- */
++ (iw_handler) NULL, /* -- hole -- */
++ (iw_handler) ar6000_ioctl_siwgenie, /* SIOCSIWGENIE */
++ (iw_handler) ar6000_ioctl_giwgenie, /* SIOCGIWGENIE */
++ (iw_handler) ar6000_ioctl_siwauth, /* SIOCSIWAUTH */
++ (iw_handler) ar6000_ioctl_giwauth, /* SIOCGIWAUTH */
++ (iw_handler) ar6000_ioctl_siwencodeext,/* SIOCSIWENCODEEXT */
++ (iw_handler) ar6000_ioctl_giwencodeext,/* SIOCGIWENCODEEXT */
++ (iw_handler) NULL, /* SIOCSIWPMKSA */
++};
++
++static const iw_handler ath_priv_handlers[] = {
++ (iw_handler) ar6000_ioctl_setparam, /* SIOCWFIRSTPRIV+0 */
++ (iw_handler) ar6000_ioctl_getparam, /* SIOCWFIRSTPRIV+1 */
++ (iw_handler) ar6000_ioctl_setkey, /* SIOCWFIRSTPRIV+2 */
++ (iw_handler) ar6000_ioctl_setwmmparams, /* SIOCWFIRSTPRIV+3 */
++ (iw_handler) ar6000_ioctl_delkey, /* SIOCWFIRSTPRIV+4 */
++ (iw_handler) ar6000_ioctl_getwmmparams, /* SIOCWFIRSTPRIV+5 */
++ (iw_handler) ar6000_ioctl_setoptie, /* SIOCWFIRSTPRIV+6 */
++ (iw_handler) ar6000_ioctl_setmlme, /* SIOCWFIRSTPRIV+7 */
++ (iw_handler) ar6000_ioctl_addpmkid, /* SIOCWFIRSTPRIV+8 */
++};
++
++#define IW_PRIV_TYPE_KEY \
++ (IW_PRIV_TYPE_BYTE | sizeof(struct ieee80211req_key))
++#define IW_PRIV_TYPE_DELKEY \
++ (IW_PRIV_TYPE_BYTE | sizeof(struct ieee80211req_del_key))
++#define IW_PRIV_TYPE_MLME \
++ (IW_PRIV_TYPE_BYTE | sizeof(struct ieee80211req_mlme))
++#define IW_PRIV_TYPE_ADDPMKID \
++ (IW_PRIV_TYPE_BYTE | sizeof(struct ieee80211req_addpmkid))
++
++static const struct iw_priv_args ar6000_priv_args[] = {
++ { IEEE80211_IOCTL_SETKEY,
++ IW_PRIV_TYPE_KEY | IW_PRIV_SIZE_FIXED, 0, "setkey"},
++ { IEEE80211_IOCTL_DELKEY,
++ IW_PRIV_TYPE_DELKEY | IW_PRIV_SIZE_FIXED, 0, "delkey"},
++ { IEEE80211_IOCTL_SETPARAM,
++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "setparam"},
++ { IEEE80211_IOCTL_GETPARAM,
++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getparam"},
++ { IEEE80211_IOCTL_SETWMMPARAMS,
++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 4, 0, "setwmmparams"},
++ { IEEE80211_IOCTL_GETWMMPARAMS,
++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getwmmparams"},
++ { IEEE80211_IOCTL_SETOPTIE,
++ IW_PRIV_TYPE_BYTE, 0, "setie"},
++ { IEEE80211_IOCTL_SETMLME,
++ IW_PRIV_TYPE_MLME, 0, "setmlme"},
++ { IEEE80211_IOCTL_ADDPMKID,
++ IW_PRIV_TYPE_ADDPMKID | IW_PRIV_SIZE_FIXED, 0, "addpmkid"},
++};
++
++void ar6000_ioctl_iwsetup(struct iw_handler_def *def)
++{
++ def->private_args = (struct iw_priv_args *)ar6000_priv_args;
++ def->num_private_args = ARRAY_SIZE(ar6000_priv_args);
++}
++
++struct iw_handler_def ath_iw_handler_def = {
++ .standard = (iw_handler *)ath_handlers,
++ .num_standard = ARRAY_SIZE(ath_handlers),
++ .private = (iw_handler *)ath_priv_handlers,
++ .num_private = ARRAY_SIZE(ath_priv_handlers),
++};
++
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/bmi/bmi.c linux-2.6.29-rc3.owrt.om/drivers/ar6000/bmi/bmi.c
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/bmi/bmi.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/bmi/bmi.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,657 @@
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "hif.h"
++#include "bmi.h"
++#include "htc_api.h"
++#include "bmi_internal.h"
++
++/*
++Although we had envisioned BMI to run on top of HTC, this is not what the
++final implementation boiled down to on dragon. Its a part of BSP and does
++not use the HTC protocol either. On the host side, however, we were still
++living with the original idea. I think the time has come to accept the truth
++and separate it from HTC which has been carrying BMI's burden all this while.
++It shall make HTC state machine relatively simpler
++*/
++
++/* APIs visible to the driver */
++void
++BMIInit(void)
++{
++ bmiDone = FALSE;
++}
++
++A_STATUS
++BMIDone(HIF_DEVICE *device)
++{
++ A_STATUS status;
++ A_UINT32 cid;
++
++ if (bmiDone) {
++ AR_DEBUG_PRINTF (ATH_DEBUG_BMI, ("BMIDone skipped\n"));
++ return A_OK;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Done: Enter (device: 0x%p)\n", device));
++ bmiDone = TRUE;
++ cid = BMI_DONE;
++
++ status = bmiBufferSend(device, (A_UCHAR *)&cid, sizeof(cid));
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
++ return A_ERROR;
++ }
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Done: Exit\n"));
++
++ return A_OK;
++}
++
++A_STATUS
++BMIGetTargetInfo(HIF_DEVICE *device, struct bmi_target_info *targ_info)
++{
++ A_STATUS status;
++ A_UINT32 cid;
++
++ if (bmiDone) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Get Target Info: Enter (device: 0x%p)\n", device));
++ cid = BMI_GET_TARGET_INFO;
++
++ status = bmiBufferSend(device, (A_UCHAR *)&cid, sizeof(cid));
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
++ return A_ERROR;
++ }
++
++ status = bmiBufferReceive(device, (A_UCHAR *)&targ_info->target_ver,
++ sizeof(targ_info->target_ver));
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read Target Version from the device\n"));
++ return A_ERROR;
++ }
++
++ if (targ_info->target_ver == TARGET_VERSION_SENTINAL) {
++ /* Determine how many bytes are in the Target's targ_info */
++ status = bmiBufferReceive(device, (A_UCHAR *)&targ_info->target_info_byte_count,
++ sizeof(targ_info->target_info_byte_count));
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read Target Info Byte Count from the device\n"));
++ return A_ERROR;
++ }
++
++ /*
++ * The Target's targ_info doesn't match the Host's targ_info.
++ * We need to do some backwards compatibility work to make this OK.
++ */
++ A_ASSERT(targ_info->target_info_byte_count == sizeof(*targ_info));
++
++ /* Read the remainder of the targ_info */
++ status = bmiBufferReceive(device,
++ ((A_UCHAR *)targ_info)+sizeof(targ_info->target_info_byte_count),
++ sizeof(*targ_info)-sizeof(targ_info->target_info_byte_count));
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read Target Info (%d bytes) from the device\n",
++ targ_info->target_info_byte_count));
++ return A_ERROR;
++ }
++ } else {
++ /*
++ * Target must be an AR6001 whose firmware does not
++ * support BMI_GET_TARGET_INFO. Construct the data
++ * that it would have sent.
++ */
++ targ_info->target_info_byte_count = sizeof(targ_info);
++ targ_info->target_type = TARGET_TYPE_AR6001;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Get Target Info: Exit (ver: 0x%x type: 0x%x)\n",
++ targ_info->target_ver, targ_info->target_type));
++ printk("BMI Get Target Info: Exit (ver: 0x%x type: 0x%x)\n",
++ targ_info->target_ver, targ_info->target_type);
++
++ return A_OK;
++}
++
++A_STATUS
++BMIReadMemory(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UCHAR *buffer,
++ A_UINT32 length)
++{
++ A_UINT32 cid;
++ A_STATUS status;
++ A_UINT32 offset;
++ A_UINT32 remaining, rxlen;
++ static A_UCHAR data[BMI_DATASZ_MAX + sizeof(cid) + sizeof(address) + sizeof(length)];
++ memset (&data, 0, BMI_DATASZ_MAX + sizeof(cid) + sizeof(address) + sizeof(length));
++
++ if (bmiDone) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
++ ("BMI Read Memory: Enter (device: 0x%p, address: 0x%x, length: %d)\n",
++ device, address, length));
++
++ cid = BMI_READ_MEMORY;
++
++ remaining = length;
++
++ while (remaining)
++ {
++ rxlen = (remaining < BMI_DATASZ_MAX) ? remaining : BMI_DATASZ_MAX;
++ offset = 0;
++ A_MEMCPY(&data[offset], &cid, sizeof(cid));
++ offset += sizeof(cid);
++ A_MEMCPY(&data[offset], &address, sizeof(address));
++ offset += sizeof(address);
++ A_MEMCPY(&data[offset], &rxlen, sizeof(rxlen));
++ offset += sizeof(length);
++
++ status = bmiBufferSend(device, data, offset);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
++ return A_ERROR;
++ }
++ status = bmiBufferReceive(device, data, rxlen);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read from the device\n"));
++ return A_ERROR;
++ }
++ A_MEMCPY(&buffer[length - remaining], data, rxlen);
++ remaining -= rxlen; address += rxlen;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Read Memory: Exit\n"));
++ return A_OK;
++}
++
++A_STATUS
++BMIWriteMemory(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UCHAR *buffer,
++ A_UINT32 length)
++{
++ A_UINT32 cid;
++ A_STATUS status;
++ A_UINT32 offset;
++ A_UINT32 remaining, txlen;
++ const A_UINT32 header = sizeof(cid) + sizeof(address) + sizeof(length);
++ static A_UCHAR data[BMI_DATASZ_MAX + sizeof(cid) + sizeof(address) + sizeof(length)];
++ memset (&data, 0, header);
++
++ if (bmiDone) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
++ ("BMI Write Memory: Enter (device: 0x%p, address: 0x%x, length: %d)\n",
++ device, address, length));
++
++ cid = BMI_WRITE_MEMORY;
++
++ remaining = length;
++ while (remaining)
++ {
++ txlen = (remaining < (BMI_DATASZ_MAX - header)) ?
++ remaining : (BMI_DATASZ_MAX - header);
++ offset = 0;
++ A_MEMCPY(&data[offset], &cid, sizeof(cid));
++ offset += sizeof(cid);
++ A_MEMCPY(&data[offset], &address, sizeof(address));
++ offset += sizeof(address);
++ A_MEMCPY(&data[offset], &txlen, sizeof(txlen));
++ offset += sizeof(txlen);
++ A_MEMCPY(&data[offset], &buffer[length - remaining], txlen);
++ offset += txlen;
++ status = bmiBufferSend(device, data, offset);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
++ return A_ERROR;
++ }
++ remaining -= txlen; address += txlen;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Write Memory: Exit\n"));
++
++ return A_OK;
++}
++
++A_STATUS
++BMIExecute(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UINT32 *param)
++{
++ A_UINT32 cid;
++ A_STATUS status;
++ A_UINT32 offset;
++ static A_UCHAR data[sizeof(cid) + sizeof(address) + sizeof(*param)];
++ memset (&data, 0, sizeof(cid) + sizeof(address) + sizeof(*param));
++
++ if (bmiDone) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
++ ("BMI Execute: Enter (device: 0x%p, address: 0x%x, param: %d)\n",
++ device, address, *param));
++
++ cid = BMI_EXECUTE;
++
++ offset = 0;
++ A_MEMCPY(&data[offset], &cid, sizeof(cid));
++ offset += sizeof(cid);
++ A_MEMCPY(&data[offset], &address, sizeof(address));
++ offset += sizeof(address);
++ A_MEMCPY(&data[offset], param, sizeof(*param));
++ offset += sizeof(*param);
++ status = bmiBufferSend(device, data, offset);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
++ return A_ERROR;
++ }
++
++ status = bmiBufferReceive(device, data, sizeof(*param));
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read from the device\n"));
++ return A_ERROR;
++ }
++
++ A_MEMCPY(param, data, sizeof(*param));
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Execute: Exit (param: %d)\n", *param));
++ return A_OK;
++}
++
++A_STATUS
++BMISetAppStart(HIF_DEVICE *device,
++ A_UINT32 address)
++{
++ A_UINT32 cid;
++ A_STATUS status;
++ A_UINT32 offset;
++ static A_UCHAR data[sizeof(cid) + sizeof(address)];
++ memset (&data, 0, sizeof(cid) + sizeof(address));
++
++ if (bmiDone) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
++ ("BMI Set App Start: Enter (device: 0x%p, address: 0x%x)\n",
++ device, address));
++
++ cid = BMI_SET_APP_START;
++
++ offset = 0;
++ A_MEMCPY(&data[offset], &cid, sizeof(cid));
++ offset += sizeof(cid);
++ A_MEMCPY(&data[offset], &address, sizeof(address));
++ offset += sizeof(address);
++ status = bmiBufferSend(device, data, offset);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Set App Start: Exit\n"));
++ return A_OK;
++}
++
++A_STATUS
++BMIReadSOCRegister(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UINT32 *param)
++{
++ A_UINT32 cid;
++ A_STATUS status;
++ A_UINT32 offset;
++ static A_UCHAR data[sizeof(cid) + sizeof(address)];
++ memset (&data, 0, sizeof(cid) + sizeof(address));
++
++ if (bmiDone) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
++ ("BMI Read SOC Register: Enter (device: 0x%p, address: 0x%x)\n",
++ device, address));
++
++ cid = BMI_READ_SOC_REGISTER;
++
++ offset = 0;
++ A_MEMCPY(&data[offset], &cid, sizeof(cid));
++ offset += sizeof(cid);
++ A_MEMCPY(&data[offset], &address, sizeof(address));
++ offset += sizeof(address);
++
++ status = bmiBufferSend(device, data, offset);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
++ return A_ERROR;
++ }
++
++ status = bmiBufferReceive(device, data, sizeof(*param));
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read from the device\n"));
++ return A_ERROR;
++ }
++ A_MEMCPY(param, data, sizeof(*param));
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Read SOC Register: Exit (value: %d)\n", *param));
++ return A_OK;
++}
++
++A_STATUS
++BMIWriteSOCRegister(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UINT32 param)
++{
++ A_UINT32 cid;
++ A_STATUS status;
++ A_UINT32 offset;
++ static A_UCHAR data[sizeof(cid) + sizeof(address) + sizeof(param)];
++
++ memset (&data, 0, sizeof(cid) + sizeof(address) + sizeof(param));
++
++ if (bmiDone) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
++ ("BMI Write SOC Register: Enter (device: 0x%p, address: 0x%x, param: %d)\n",
++ device, address, param));
++
++ cid = BMI_WRITE_SOC_REGISTER;
++
++ offset = 0;
++ A_MEMCPY(&data[offset], &cid, sizeof(cid));
++ offset += sizeof(cid);
++ A_MEMCPY(&data[offset], &address, sizeof(address));
++ offset += sizeof(address);
++ A_MEMCPY(&data[offset], &param, sizeof(param));
++ offset += sizeof(param);
++ status = bmiBufferSend(device, data, offset);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Read SOC Register: Exit\n"));
++ return A_OK;
++}
++
++A_STATUS
++BMIrompatchInstall(HIF_DEVICE *device,
++ A_UINT32 ROM_addr,
++ A_UINT32 RAM_addr,
++ A_UINT32 nbytes,
++ A_UINT32 do_activate,
++ A_UINT32 *rompatch_id)
++{
++ A_UINT32 cid;
++ A_STATUS status;
++ A_UINT32 offset;
++ static A_UCHAR data[sizeof(cid) + sizeof(ROM_addr) + sizeof(RAM_addr) +
++ sizeof(nbytes) + sizeof(do_activate)];
++
++ memset (&data, 0, sizeof(cid) + sizeof(ROM_addr) + sizeof(RAM_addr) +
++ sizeof(nbytes) + sizeof(do_activate));
++
++ if (bmiDone) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
++ ("BMI rompatch Install: Enter (device: 0x%p, ROMaddr: 0x%x, RAMaddr: 0x%x length: %d activate: %d)\n",
++ device, ROM_addr, RAM_addr, nbytes, do_activate));
++
++ cid = BMI_ROMPATCH_INSTALL;
++
++ offset = 0;
++ A_MEMCPY(&data[offset], &cid, sizeof(cid));
++ offset += sizeof(cid);
++ A_MEMCPY(&data[offset], &ROM_addr, sizeof(ROM_addr));
++ offset += sizeof(ROM_addr);
++ A_MEMCPY(&data[offset], &RAM_addr, sizeof(RAM_addr));
++ offset += sizeof(RAM_addr);
++ A_MEMCPY(&data[offset], &nbytes, sizeof(nbytes));
++ offset += sizeof(nbytes);
++ A_MEMCPY(&data[offset], &do_activate, sizeof(do_activate));
++ offset += sizeof(do_activate);
++ status = bmiBufferSend(device, data, offset);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
++ return A_ERROR;
++ }
++
++ status = bmiBufferReceive(device, (A_UCHAR *)rompatch_id, sizeof(*rompatch_id));
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read from the device\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI rompatch Install: (rompatch_id=%d)\n", *rompatch_id));
++ return A_OK;
++}
++
++A_STATUS
++BMIrompatchUninstall(HIF_DEVICE *device,
++ A_UINT32 rompatch_id)
++{
++ A_UINT32 cid;
++ A_STATUS status;
++ A_UINT32 offset;
++ static A_UCHAR data[sizeof(cid) + sizeof(rompatch_id)];
++ memset (&data, 0, sizeof(cid) + sizeof(rompatch_id));
++
++ if (bmiDone) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
++ ("BMI rompatch Uninstall: Enter (device: 0x%p, rompatch_id: %d)\n",
++ device, rompatch_id));
++
++ cid = BMI_ROMPATCH_UNINSTALL;
++
++ offset = 0;
++ A_MEMCPY(&data[offset], &cid, sizeof(cid));
++ offset += sizeof(cid);
++ A_MEMCPY(&data[offset], &rompatch_id, sizeof(rompatch_id));
++ offset += sizeof(rompatch_id);
++ status = bmiBufferSend(device, data, offset);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI rompatch UNinstall: (rompatch_id=0x%x)\n", rompatch_id));
++ return A_OK;
++}
++
++static A_STATUS
++_BMIrompatchChangeActivation(HIF_DEVICE *device,
++ A_UINT32 rompatch_count,
++ A_UINT32 *rompatch_list,
++ A_UINT32 do_activate)
++{
++ A_UINT32 cid;
++ A_STATUS status;
++ A_UINT32 offset;
++ static A_UCHAR data[BMI_DATASZ_MAX + sizeof(cid) + sizeof(rompatch_count)];
++ A_UINT32 length;
++
++ memset (&data, 0, BMI_DATASZ_MAX + sizeof(cid) + sizeof(rompatch_count));
++
++ if (bmiDone) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
++ ("BMI Change rompatch Activation: Enter (device: 0x%p, count: %d)\n",
++ device, rompatch_count));
++
++ cid = do_activate ? BMI_ROMPATCH_ACTIVATE : BMI_ROMPATCH_DEACTIVATE;
++
++ offset = 0;
++ A_MEMCPY(&data[offset], &cid, sizeof(cid));
++ offset += sizeof(cid);
++ A_MEMCPY(&data[offset], &rompatch_count, sizeof(rompatch_count));
++ offset += sizeof(rompatch_count);
++ length = rompatch_count * sizeof(*rompatch_list);
++ A_MEMCPY(&data[offset], rompatch_list, length);
++ offset += length;
++ status = bmiBufferSend(device, data, offset);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Change rompatch Activation: Exit\n"));
++
++ return A_OK;
++}
++
++A_STATUS
++BMIrompatchActivate(HIF_DEVICE *device,
++ A_UINT32 rompatch_count,
++ A_UINT32 *rompatch_list)
++{
++ return _BMIrompatchChangeActivation(device, rompatch_count, rompatch_list, 1);
++}
++
++A_STATUS
++BMIrompatchDeactivate(HIF_DEVICE *device,
++ A_UINT32 rompatch_count,
++ A_UINT32 *rompatch_list)
++{
++ return _BMIrompatchChangeActivation(device, rompatch_count, rompatch_list, 0);
++}
++
++/* BMI Access routines */
++A_STATUS
++bmiBufferSend(HIF_DEVICE *device,
++ A_UCHAR *buffer,
++ A_UINT32 length)
++{
++ A_STATUS status;
++ A_UINT32 timeout;
++ A_UINT32 address;
++ static A_UINT32 cmdCredits;
++ A_UINT32 mboxAddress[HTC_MAILBOX_NUM_MAX];
++
++ HIFConfigureDevice(device, HIF_DEVICE_GET_MBOX_ADDR,
++ &mboxAddress, sizeof(mboxAddress));
++
++ cmdCredits = 0;
++ timeout = BMI_COMMUNICATION_TIMEOUT;
++
++ while(timeout-- && !cmdCredits) {
++ /* Read the counter register to get the command credits */
++ address = COUNT_DEC_ADDRESS + (HTC_MAILBOX_NUM_MAX + ENDPOINT1) * 4;
++ /* hit the credit counter with a 4-byte access, the first byte read will hit the counter and cause
++ * a decrement, while the remaining 3 bytes has no effect. The rationale behind this is to
++ * make all HIF accesses 4-byte aligned */
++ status = HIFReadWrite(device, address, (A_UINT8 *)&cmdCredits, 4,
++ HIF_RD_SYNC_BYTE_INC, NULL);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to decrement the command credit count register\n"));
++ return A_ERROR;
++ }
++ /* the counter is only 8=bits, ignore anything in the upper 3 bytes */
++ cmdCredits &= 0xFF;
++ }
++
++ if (cmdCredits) {
++ address = mboxAddress[ENDPOINT1];
++ status = HIFReadWrite(device, address, buffer, length,
++ HIF_WR_SYNC_BYTE_INC, NULL);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to send the BMI data to the device\n"));
++ return A_ERROR;
++ }
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("BMI Communication timeout\n"));
++ return A_ERROR;
++ }
++
++ return status;
++}
++
++A_STATUS
++bmiBufferReceive(HIF_DEVICE *device,
++ A_UCHAR *buffer,
++ A_UINT32 length)
++{
++ A_STATUS status;
++ A_UINT32 address;
++ A_UINT32 timeout;
++ static A_UINT32 cmdCredits;
++ A_UINT32 mboxAddress[HTC_MAILBOX_NUM_MAX];
++
++ HIFConfigureDevice(device, HIF_DEVICE_GET_MBOX_ADDR,
++ &mboxAddress, sizeof(mboxAddress));
++
++ cmdCredits = 0;
++ timeout = BMI_COMMUNICATION_TIMEOUT;
++ while(timeout-- && !cmdCredits) {
++ /* Read the counter register to get the command credits */
++ address = COUNT_ADDRESS + (HTC_MAILBOX_NUM_MAX + ENDPOINT1) * 1;
++ /* read the counter using a 4-byte read. Since the counter is NOT auto-decrementing,
++ * we can read this counter multiple times using a non-incrementing address mode.
++ * The rationale here is to make all HIF accesses a multiple of 4 bytes */
++ status = HIFReadWrite(device, address, (A_UINT8 *)&cmdCredits, sizeof(cmdCredits),
++ HIF_RD_SYNC_BYTE_FIX, NULL);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read the command credit count register\n"));
++ return A_ERROR;
++ }
++ /* we did a 4-byte read to the same count register so mask off upper bytes */
++ cmdCredits &= 0xFF;
++ status = A_ERROR;
++ }
++
++ if (cmdCredits) {
++ address = mboxAddress[ENDPOINT1];
++ status = HIFReadWrite(device, address, buffer, length,
++ HIF_RD_SYNC_BYTE_INC, NULL);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read the BMI data from the device\n"));
++ return A_ERROR;
++ }
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Communication timeout\n"));
++ return A_ERROR;
++ }
++
++ return status;
++}
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/bmi/bmi_internal.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/bmi/bmi_internal.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/bmi/bmi_internal.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/bmi/bmi_internal.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,45 @@
++#ifndef BMI_INTERNAL_H
++#define BMI_INTERNAL_H
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "a_config.h"
++#include "athdefs.h"
++#include "a_types.h"
++#include "a_osapi.h"
++#include "a_debug.h"
++#include "AR6Khwreg.h"
++#include "bmi_msg.h"
++
++#define BMI_COMMUNICATION_TIMEOUT 100000
++
++/* ------ Global Variable Declarations ------- */
++A_BOOL bmiDone;
++
++A_STATUS
++bmiBufferSend(HIF_DEVICE *device,
++ A_UCHAR *buffer,
++ A_UINT32 length);
++
++A_STATUS
++bmiBufferReceive(HIF_DEVICE *device,
++ A_UCHAR *buffer,
++ A_UINT32 length);
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/hif/hif2.c linux-2.6.29-rc3.owrt.om/drivers/ar6000/hif/hif2.c
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/hif/hif2.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/hif/hif2.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,768 @@
++/*
++ * hif2.c - HIF layer re-implementation for the Linux SDIO stack
++ *
++ * Copyright (C) 2008, 2009 by OpenMoko, Inc.
++ * Written by Werner Almesberger <werner@openmoko.org>
++ * All Rights Reserved
++ *
++ * 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;
++ *
++ * Based on:
++ *
++ * @abstract: HIF layer reference implementation for Atheros SDIO stack
++ * @notice: Copyright (c) 2004-2006 Atheros Communications Inc.
++ */
++
++
++#include <linux/kernel.h>
++#include <linux/kthread.h>
++#include <linux/list.h>
++#include <linux/wait.h>
++#include <linux/spinlock.h>
++#include <linux/mutex.h>
++#include <linux/sched.h>
++#include <linux/mmc/sdio_func.h>
++#include <linux/mmc/sdio.h>
++#include <linux/mmc/sdio_ids.h>
++
++#include "athdefs.h"
++#include "a_types.h"
++#include "hif.h"
++
++
++/* @@@ Hack - this wants cleaning up */
++
++#ifdef CONFIG_MACH_NEO1973_GTA02
++
++#include <mach/gta02-pm-wlan.h>
++
++#else /* CONFIG_MACH_NEO1973_GTA02 */
++
++#define gta02_wlan_query_rfkill_lock() 1
++#define gta02_wlan_set_rfkill_cb(cb, hif) ((void) cb)
++#define gta02_wlan_query_rfkill_unlock()
++#define gta02_wlan_clear_rfkill_cb()
++
++#endif /* !CONFIG_MACH_NEO1973_GTA02 */
++
++
++/*
++ * KNOWN BUGS:
++ *
++ * - HIF_DEVICE_IRQ_ASYNC_SYNC doesn't work yet (gets MMC errors)
++ * - latency can reach hundreds of ms, probably because of scheduling delays
++ * - packets go through about three queues before finally hitting the network
++ */
++
++/*
++ * Differences from Atheros' HIFs:
++ *
++ * - synchronous and asynchronous requests may get reordered with respect to
++ * each other, e.g., if HIFReadWrite returns for an asynchronous request and
++ * then HIFReadWrite is called for a synchronous request, the synchronous
++ * request may be executed before the asynchronous request.
++ *
++ * - request queue locking seems unnecessarily complex in the Atheros HIFs.
++ *
++ * - Atheros mask interrupts by calling sdio_claim_irq/sdio_release_irq, which
++ * can cause quite a bit of overhead. This HIF has its own light-weight
++ * interrupt masking.
++ *
++ * - Atheros call deviceInsertedHandler from a thread spawned off the probe or
++ * device insertion function. The original explanation for the Atheros SDIO
++ * stack said that this is done because a delay is needed to let the chip
++ * complete initialization. There is indeed a one second delay in the thread.
++ *
++ * The Atheros Linux SDIO HIF removes the delay and only retains the thread.
++ * Experimentally removing the thread didn't show any conflicts, so let's get
++ * rid of it for good.
++ *
++ * - The Atheros SDIO stack with Samuel's driver sets SDIO_CCCR_POWER in
++ * SDIO_POWER_EMPC. Atheros' Linux SDIO code apparently doesn't. We don't
++ * either, and this seems to work fine.
++ * @@@ Need to check this with Atheros.
++ */
++
++
++#define MBOXES 4
++
++#define HIF_MBOX_BLOCK_SIZE 128
++#define HIF_MBOX_BASE_ADDR 0x800
++#define HIF_MBOX_WIDTH 0x800
++#define HIF_MBOX_START_ADDR(mbox) \
++ (HIF_MBOX_BASE_ADDR+(mbox)*HIF_MBOX_WIDTH)
++
++
++struct hif_device {
++ void *htc_handle;
++ struct sdio_func *func;
++
++ /*
++ * @@@ our sweet little bit of bogosity - the mechanism that lets us
++ * use the SDIO stack from softirqs. This really wants to use skbs.
++ */
++ struct list_head queue;
++ spinlock_t queue_lock;
++ struct task_struct *io_task;
++ wait_queue_head_t wait;
++
++ /*
++ * activate_lock protects "active" and the activation/deactivation
++ * process itself.
++ *
++ * Relation to other locks: The SDIO function can be claimed while
++ * activate_lock is being held, but trying to acquire activate_lock
++ * while having ownership of the SDIO function could cause a deadlock.
++ */
++ int active;
++ struct mutex activate_lock;
++};
++
++struct hif_request {
++ struct list_head list;
++ struct sdio_func *func;
++ int (*read)(struct sdio_func *func,
++ void *dst, unsigned int addr, int count);
++ int (*write)(struct sdio_func *func,
++ unsigned int addr, void *src, int count);
++ void *buf;
++ unsigned long addr;
++ int len;
++ A_STATUS (*completion)(void *context, A_STATUS status);
++ void *context;
++};
++
++
++static HTC_CALLBACKS htcCallbacks;
++
++/*
++ * shutdown_lock prevents recursion through HIFShutDownDevice
++ */
++static DEFINE_MUTEX(shutdown_lock);
++
++
++/* ----- Request processing ------------------------------------------------ */
++
++
++static A_STATUS process_request(struct hif_request *req)
++{
++ int ret;
++ A_STATUS status;
++
++ dev_dbg(&req->func->dev, "process_request(req %p)\n", req);
++ sdio_claim_host(req->func);
++ if (req->read) {
++ ret = req->read(req->func, req->buf, req->addr, req->len);
++ } else {
++ ret = req->write(req->func, req->addr, req->buf, req->len);
++ }
++ sdio_release_host(req->func);
++ status = ret ? A_ERROR : A_OK;
++ if (req->completion)
++ req->completion(req->context, status);
++ kfree(req);
++ return status;
++}
++
++
++static void enqueue_request(struct hif_device *hif, struct hif_request *req)
++{
++ unsigned long flags;
++
++ dev_dbg(&req->func->dev, "enqueue_request(req %p)\n", req);
++ spin_lock_irqsave(&hif->queue_lock, flags);
++ list_add_tail(&req->list, &hif->queue);
++ spin_unlock_irqrestore(&hif->queue_lock, flags);
++ wake_up(&hif->wait);
++}
++
++
++static struct hif_request *dequeue_request(struct hif_device *hif)
++{
++ struct hif_request *req;
++ unsigned long flags;
++
++ spin_lock_irqsave(&hif->queue_lock, flags);
++ if (list_empty(&hif->queue))
++ req = NULL;
++ else {
++ req = list_first_entry(&hif->queue,
++ struct hif_request, list);
++ list_del(&req->list);
++ }
++ spin_unlock_irqrestore(&hif->queue_lock, flags);
++ return req;
++}
++
++
++static void wait_queue_empty(struct hif_device *hif)
++{
++ unsigned long flags;
++ int empty;
++
++ while (1) {
++ spin_lock_irqsave(&hif->queue_lock, flags);
++ empty = list_empty(&hif->queue);
++ spin_unlock_irqrestore(&hif->queue_lock, flags);
++ if (empty)
++ break;
++ else
++ yield();
++ }
++}
++
++
++static int io(void *data)
++{
++ struct hif_device *hif = data;
++ struct sched_param param = { .sched_priority = 2 };
++ /* one priority level slower than ksdioirqd (which is at 1) */
++ DEFINE_WAIT(wait);
++ struct hif_request *req;
++
++ sched_setscheduler(current, SCHED_FIFO, &param);
++
++ while (1) {
++ while (1) {
++ /*
++ * Since we never use signals here, one might think
++ * that this ought to be TASK_UNINTERRUPTIBLE. However,
++ * such a task would increase the load average and,
++ * worse, it would trigger the softlockup check.
++ */
++ prepare_to_wait(&hif->wait, &wait, TASK_INTERRUPTIBLE);
++ if (kthread_should_stop()) {
++ finish_wait(&hif->wait, &wait);
++ return 0;
++ }
++ req = dequeue_request(hif);
++ if (req)
++ break;
++ schedule();
++ }
++ finish_wait(&hif->wait, &wait);
++
++ (void) process_request(req);
++ }
++ return 0;
++}
++
++
++A_STATUS HIFReadWrite(HIF_DEVICE *hif, A_UINT32 address, A_UCHAR *buffer,
++ A_UINT32 length, A_UINT32 request, void *context)
++{
++ struct device *dev = HIFGetOSDevice(hif);
++ struct hif_request *req;
++
++ dev_dbg(dev, "HIFReadWrite(device %p, address 0x%x, buffer %p, "
++ "length %d, request 0x%x, context %p)\n",
++ hif, address, buffer, length, request, context);
++
++ BUG_ON(!(request & (HIF_SYNCHRONOUS | HIF_ASYNCHRONOUS)));
++ BUG_ON(!(request & (HIF_BYTE_BASIS | HIF_BLOCK_BASIS)));
++ BUG_ON(!(request & (HIF_READ | HIF_WRITE)));
++ BUG_ON(!(request & HIF_EXTENDED_IO));
++
++ if (address >= HIF_MBOX_START_ADDR(0) &&
++ address < HIF_MBOX_START_ADDR(MBOXES+1)) {
++ BUG_ON(length > HIF_MBOX_WIDTH);
++ /* Adjust the address so that the last byte falls on the EOM
++ address. */
++ address += HIF_MBOX_WIDTH-length;
++ }
++
++ req = kzalloc(sizeof(*req), GFP_ATOMIC);
++ if (!req) {
++ if (request & HIF_ASYNCHRONOUS)
++ htcCallbacks.rwCompletionHandler(context, A_ERROR);
++ return A_ERROR;
++ }
++
++ req->func = hif->func;
++ req->addr = address;
++ req->buf = buffer;
++ req->len = length;
++
++ if (request & HIF_READ) {
++ if (request & HIF_FIXED_ADDRESS)
++ req->read = sdio_readsb;
++ else
++ req->read = sdio_memcpy_fromio;
++ } else {
++ if (request & HIF_FIXED_ADDRESS)
++ req->write = sdio_writesb;
++ else
++ req->write = sdio_memcpy_toio;
++ }
++
++ if (!(request & HIF_ASYNCHRONOUS))
++ return process_request(req);
++
++ req->completion = htcCallbacks.rwCompletionHandler;
++ req->context = context;
++ enqueue_request(hif, req);
++
++ return A_OK;
++}
++
++
++/* ----- Interrupt handling ------------------------------------------------ */
++
++/*
++ * Volatile ought to be good enough to make gcc do the right thing on S3C24xx.
++ * No need to use atomic or put barriers, keeping the code more readable.
++ *
++ * Warning: this story changes if going SMP/SMT.
++ */
++
++static volatile int masked = 1;
++static volatile int pending;
++static volatile int in_interrupt;
++
++
++static void ar6000_do_irq(struct sdio_func *func)
++{
++ HIF_DEVICE *hif = sdio_get_drvdata(func);
++ struct device *dev = HIFGetOSDevice(hif);
++ A_STATUS status;
++
++ dev_dbg(dev, "ar6000_do_irq -> %p\n", htcCallbacks.dsrHandler);
++
++ status = htcCallbacks.dsrHandler(hif->htc_handle);
++ BUG_ON(status != A_OK);
++}
++
++
++static void sdio_ar6000_irq(struct sdio_func *func)
++{
++ HIF_DEVICE *hif = sdio_get_drvdata(func);
++ struct device *dev = HIFGetOSDevice(hif);
++
++ dev_dbg(dev, "sdio_ar6000_irq\n");
++
++ in_interrupt = 1;
++ if (masked) {
++ in_interrupt = 0;
++ pending++;
++ return;
++ }
++ /*
++ * @@@ This is ugly. If we don't drop the lock, we'll deadlock when
++ * the handler tries to do SDIO. So there are four choices:
++ *
++ * 1) Break the call chain by calling the callback from a workqueue.
++ * Ugh.
++ * 2) Make process_request aware that we already have the lock.
++ * 3) Drop the lock. Which is ugly but should be safe as long as we're
++ * making sure the device doesn't go away.
++ * 4) Change the AR6k driver such that it only issues asynchronous
++ * quests when called from an interrupt.
++ *
++ * Solution 2) is probably the best for now. Will try it later.
++ */
++ sdio_release_host(func);
++ ar6000_do_irq(func);
++ sdio_claim_host(func);
++ in_interrupt = 0;
++}
++
++
++void HIFAckInterrupt(HIF_DEVICE *hif)
++{
++ struct device *dev = HIFGetOSDevice(hif);
++
++ dev_dbg(dev, "HIFAckInterrupt\n");
++ /* do nothing */
++}
++
++
++void HIFUnMaskInterrupt(HIF_DEVICE *hif)
++{
++ struct device *dev = HIFGetOSDevice(hif);
++
++ dev_dbg(dev, "HIFUnMaskInterrupt\n");
++ do {
++ masked = 1;
++ if (pending) {
++ pending = 0;
++ ar6000_do_irq(hif->func);
++ /* We may take an interrupt before unmasking and thus
++ get it pending. In this case, we just loop back. */
++ }
++ masked = 0;
++ }
++ while (pending);
++}
++
++
++void HIFMaskInterrupt(HIF_DEVICE *hif)
++{
++ struct device *dev = HIFGetOSDevice(hif);
++
++ dev_dbg(dev, "HIFMaskInterrupt\n");
++ /*
++ * Since sdio_ar6000_irq can also be called from a process context, we
++ * may conceivably end up racing with it. Thus, we need to wait until
++ * we can be sure that no concurrent interrupt processing is going on
++ * before we return.
++ *
++ * Note: this may be a bit on the paranoid side - the callers may
++ * actually be nice enough to disable scheduling. Check later.
++ */
++ masked = 1;
++ while (in_interrupt)
++ yield();
++}
++
++
++/* ----- HIF API glue functions -------------------------------------------- */
++
++
++struct device *HIFGetOSDevice(HIF_DEVICE *hif)
++{
++ return &hif->func->dev;
++}
++
++
++void HIFSetHandle(void *hif_handle, void *handle)
++{
++ HIF_DEVICE *hif = (HIF_DEVICE *) hif_handle;
++
++ hif->htc_handle = handle;
++}
++
++
++/* ----- Device configuration (HIF side) ----------------------------------- */
++
++
++A_STATUS HIFConfigureDevice(HIF_DEVICE *hif,
++ HIF_DEVICE_CONFIG_OPCODE opcode, void *config, A_UINT32 configLen)
++{
++ struct device *dev = HIFGetOSDevice(hif);
++ HIF_DEVICE_IRQ_PROCESSING_MODE *ipm_cfg = config;
++ A_UINT32 *mbs_cfg = config;
++ int i;
++
++ dev_dbg(dev, "HIFConfigureDevice\n");
++
++ switch (opcode) {
++ case HIF_DEVICE_GET_MBOX_BLOCK_SIZE:
++ for (i = 0; i != MBOXES; i++)
++ mbs_cfg[i] = HIF_MBOX_BLOCK_SIZE;
++ break;
++ case HIF_DEVICE_GET_MBOX_ADDR:
++ for (i = 0; i != MBOXES; i++)
++ mbs_cfg[i] = HIF_MBOX_START_ADDR(i);
++ break;
++ case HIF_DEVICE_GET_IRQ_PROC_MODE:
++ *ipm_cfg = HIF_DEVICE_IRQ_SYNC_ONLY;
++// *ipm_cfg = HIF_DEVICE_IRQ_ASYNC_SYNC;
++ break;
++ default:
++ return A_ERROR;
++ }
++ return A_OK;
++}
++
++
++/* ----- Device probe and removal (Linux side) ----------------------------- */
++
++
++static int ar6000_do_activate(struct hif_device *hif)
++{
++ struct sdio_func *func = hif->func;
++ struct device *dev = &func->dev;
++ int ret;
++
++ dev_dbg(dev, "ar6000_do_activate\n");
++
++ sdio_claim_host(func);
++ sdio_enable_func(func);
++
++ INIT_LIST_HEAD(&hif->queue);
++ init_waitqueue_head(&hif->wait);
++ spin_lock_init(&hif->queue_lock);
++
++ ret = sdio_set_block_size(func, HIF_MBOX_BLOCK_SIZE);
++ if (ret < 0) {
++ dev_err(dev, "sdio_set_block_size returns %d\n", ret);
++ goto out_enabled;
++ }
++ ret = sdio_claim_irq(func, sdio_ar6000_irq);
++ if (ret) {
++ dev_err(dev, "sdio_claim_irq returns %d\n", ret);
++ goto out_enabled;
++ }
++ /* Set SDIO_BUS_CD_DISABLE in SDIO_CCCR_IF ? */
++#if 0
++ sdio_f0_writeb(func, SDIO_CCCR_CAP_E4MI, SDIO_CCCR_CAPS, &ret);
++ if (ret) {
++ dev_err(dev, "sdio_f0_writeb(SDIO_CCCR_CAPS) returns %d\n",
++ ret);
++ goto out_got_irq;
++ }
++#else
++ if (0) /* avoid warning */
++ goto out_got_irq;
++#endif
++
++ sdio_release_host(func);
++
++ hif->io_task = kthread_run(io, hif, "ar6000_io");
++ ret = IS_ERR(hif->io_task);
++ if (ret) {
++ dev_err(dev, "kthread_run(ar6000_io): %d\n", ret);
++ goto out_func_ready;
++ }
++
++ ret = htcCallbacks.deviceInsertedHandler(hif);
++ if (ret == A_OK)
++ return 0;
++
++ dev_err(dev, "deviceInsertedHandler: %d\n", ret);
++
++ ret = kthread_stop(hif->io_task);
++ if (ret)
++ dev_err(dev, "kthread_stop (ar6000_io): %d\n", ret);
++
++out_func_ready:
++ sdio_claim_host(func);
++
++out_got_irq:
++ sdio_release_irq(func);
++
++out_enabled:
++ sdio_disable_func(func);
++ sdio_release_host(func);
++
++ return ret;
++}
++
++
++static void ar6000_do_deactivate(struct hif_device *hif)
++{
++ struct sdio_func *func = hif->func;
++ struct device *dev = &func->dev;
++ int ret;
++
++ dev_dbg(dev, "ar6000_do_deactivate\n");
++ if (!hif->active)
++ return;
++
++ if (mutex_trylock(&shutdown_lock)) {
++ /*
++ * Funny, Atheros' HIF does this call, but this just puts us in
++ * a recursion through HTCShutDown/HIFShutDown if unloading the
++ * module.
++ *
++ * However, we need it for suspend/resume. See the comment at
++ * HIFShutDown, below.
++ */
++ ret = htcCallbacks.deviceRemovedHandler(hif->htc_handle, A_OK);
++ if (ret != A_OK)
++ dev_err(dev, "deviceRemovedHandler: %d\n", ret);
++ mutex_unlock(&shutdown_lock);
++ }
++ wait_queue_empty(hif);
++ ret = kthread_stop(hif->io_task);
++ if (ret)
++ dev_err(dev, "kthread_stop (ar6000_io): %d\n", ret);
++ sdio_claim_host(func);
++ sdio_release_irq(func);
++ sdio_disable_func(func);
++ sdio_release_host(func);
++}
++
++
++static int ar6000_activate(struct hif_device *hif)
++{
++ int ret = 0;
++
++ dev_dbg(&hif->func->dev, "ar6000_activate\n");
++ mutex_lock(&hif->activate_lock);
++ if (!hif->active) {
++ ret = ar6000_do_activate(hif);
++ if (ret) {
++ printk(KERN_ERR "%s: Failed to activate %d\n",
++ __func__, ret);
++ goto out;
++ }
++ hif->active = 1;
++ }
++out:
++ mutex_unlock(&hif->activate_lock);
++ return ret;
++}
++
++
++static void ar6000_deactivate(struct hif_device *hif)
++{
++ dev_dbg(&hif->func->dev, "ar6000_deactivate\n");
++ mutex_lock(&hif->activate_lock);
++ if (hif->active) {
++ ar6000_do_deactivate(hif);
++ hif->active = 0;
++ }
++ mutex_unlock(&hif->activate_lock);
++}
++
++
++static int ar6000_rfkill_cb(void *data, int on)
++{
++ struct hif_device *hif = data;
++ struct sdio_func *func = hif->func;
++ struct device *dev = &func->dev;
++
++ dev_dbg(dev, "ar6000_rfkill_cb: on %d\n", on);
++ if (on)
++ return ar6000_activate(hif);
++ ar6000_deactivate(hif);
++ return 0;
++}
++
++
++static int sdio_ar6000_probe(struct sdio_func *func,
++ const struct sdio_device_id *id)
++{
++ struct device *dev = &func->dev;
++ struct hif_device *hif;
++ int ret = 0;
++
++ dev_dbg(dev, "sdio_ar6000_probe\n");
++ BUG_ON(!htcCallbacks.deviceInsertedHandler);
++
++ hif = kzalloc(sizeof(*hif), GFP_KERNEL);
++ if (!hif)
++ return -ENOMEM;
++
++ sdio_set_drvdata(func, hif);
++ hif->func = func;
++ mutex_init(&hif->activate_lock);
++ hif->active = 0;
++
++ if (gta02_wlan_query_rfkill_lock())
++ ret = ar6000_activate(hif);
++ if (!ret) {
++ gta02_wlan_set_rfkill_cb(ar6000_rfkill_cb, hif);
++ return 0;
++ }
++ gta02_wlan_query_rfkill_unlock();
++ sdio_set_drvdata(func, NULL);
++ kfree(hif);
++ return ret;
++}
++
++
++static void sdio_ar6000_remove(struct sdio_func *func)
++{
++ struct device *dev = &func->dev;
++ HIF_DEVICE *hif = sdio_get_drvdata(func);
++
++ dev_dbg(dev, "sdio_ar6000_remove\n");
++ gta02_wlan_clear_rfkill_cb();
++ ar6000_deactivate(hif);
++ sdio_set_drvdata(func, NULL);
++ kfree(hif);
++}
++
++
++/* ----- Device registration/unregistration (called by HIF) ---------------- */
++
++
++#define ATHEROS_SDIO_DEVICE(id, offset) \
++ SDIO_DEVICE(SDIO_VENDOR_ID_ATHEROS, SDIO_DEVICE_ID_ATHEROS_##id | (offset))
++
++static const struct sdio_device_id sdio_ar6000_ids[] = {
++ { ATHEROS_SDIO_DEVICE(AR6002, 0) },
++ { ATHEROS_SDIO_DEVICE(AR6002, 0x1) },
++ { ATHEROS_SDIO_DEVICE(AR6001, 0x8) },
++ { ATHEROS_SDIO_DEVICE(AR6001, 0x9) },
++ { ATHEROS_SDIO_DEVICE(AR6001, 0xa) },
++ { ATHEROS_SDIO_DEVICE(AR6001, 0xb) },
++ { /* end: all zeroes */ },
++};
++
++MODULE_DEVICE_TABLE(sdio, sdio_ar6000_ids);
++
++
++static struct sdio_driver sdio_ar6000_driver = {
++ .probe = sdio_ar6000_probe,
++ .remove = sdio_ar6000_remove,
++ .name = "sdio_ar6000",
++ .id_table = sdio_ar6000_ids,
++};
++
++
++int HIFInit(HTC_CALLBACKS *callbacks)
++{
++ int ret;
++
++ BUG_ON(!callbacks);
++
++ printk(KERN_DEBUG "HIFInit\n");
++ htcCallbacks = *callbacks;
++
++ ret = sdio_register_driver(&sdio_ar6000_driver);
++ if (ret) {
++ printk(KERN_ERR
++ "sdio_register_driver(sdio_ar6000_driver): %d\n", ret);
++ return A_ERROR;
++ }
++
++ return 0;
++}
++
++
++/*
++ * We have four possible call chains here:
++ *
++ * System shutdown/reboot:
++ *
++ * kernel_restart_prepare ...> device_shutdown ... > s3cmci_shutdown ->
++ * mmc_remove_host ..> sdio_bus_remove -> sdio_ar6000_remove ->
++ * ar6000_deactivate -> ar6000_do_deactivate ->
++ * deviceRemovedHandler (HTCTargetRemovedHandler) -> HIFShutDownDevice
++ *
++ * This is roughly the same sequence as suspend, described below.
++ *
++ * Module removal:
++ *
++ * sys_delete_module -> ar6000_cleanup_module -> HTCShutDown ->
++ * HIFShutDownDevice -> sdio_unregister_driver ...> sdio_bus_remove ->
++ * sdio_ar6000_remove -> ar6000_deactivate -> ar6000_do_deactivate
++ *
++ * In this case, HIFShutDownDevice must call sdio_unregister_driver to
++ * notify the driver about its removal. ar6000_do_deactivate must not call
++ * deviceRemovedHandler, because that would loop back into HIFShutDownDevice.
++ *
++ * Suspend:
++ *
++ * device_suspend ...> s3cmci_suspend ...> sdio_bus_remove ->
++ * sdio_ar6000_remove -> ar6000_deactivate -> ar6000_do_deactivate ->
++ * deviceRemovedHandler (HTCTargetRemovedHandler) -> HIFShutDownDevice
++ *
++ * We must call deviceRemovedHandler to inform the ar6k stack that the device
++ * has been removed. Since HTCTargetRemovedHandler calls back into
++ * HIFShutDownDevice, we must also prevent the call to
++ * sdio_unregister_driver, or we'd end up recursing into the SDIO stack,
++ * eventually deadlocking somewhere.
++ *
++ * rfkill:
++ *
++ * rfkill_state_store -> rfkill_toggle_radio -> gta02_wlan_toggle_radio ->
++ * ar6000_rfkill_cb -> ar6000_deactivate -> ar6000_do_deactivate ->
++ * deviceRemovedHandler (HTCTargetRemovedHandler) -> HIFShutDownDevice
++ *
++ * This is similar to suspend - only the entry point changes.
++ */
++
++void HIFShutDownDevice(HIF_DEVICE *hif)
++{
++ /* Beware, HTCShutDown calls us with hif == NULL ! */
++ if (mutex_trylock(&shutdown_lock)) {
++ sdio_unregister_driver(&sdio_ar6000_driver);
++ mutex_unlock(&shutdown_lock);
++ }
++}
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/hif/hif.c linux-2.6.29-rc3.owrt.om/drivers/ar6000/hif/hif.c
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/hif/hif.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/hif/hif.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,824 @@
++/*
++ * @file: hif.c
++ *
++ * @abstract: HIF layer reference implementation for Atheros SDIO stack
++ *
++ * @notice: Copyright (c) 2004-2006 Atheros Communications Inc.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "hif_internal.h"
++
++/* ------ Static Variables ------ */
++
++/* ------ Global Variable Declarations ------- */
++SD_PNP_INFO Ids[] = {
++ {
++ .SDIO_ManufacturerID = MANUFACTURER_ID_AR6001_BASE | 0xB,
++ .SDIO_ManufacturerCode = MANUFACTURER_CODE,
++ .SDIO_FunctionClass = FUNCTION_CLASS,
++ .SDIO_FunctionNo = 1
++ },
++ {
++ .SDIO_ManufacturerID = MANUFACTURER_ID_AR6001_BASE | 0xA,
++ .SDIO_ManufacturerCode = MANUFACTURER_CODE,
++ .SDIO_FunctionClass = FUNCTION_CLASS,
++ .SDIO_FunctionNo = 1
++ },
++ {
++ .SDIO_ManufacturerID = MANUFACTURER_ID_AR6001_BASE | 0x9,
++ .SDIO_ManufacturerCode = MANUFACTURER_CODE,
++ .SDIO_FunctionClass = FUNCTION_CLASS,
++ .SDIO_FunctionNo = 1
++ },
++ {
++ .SDIO_ManufacturerID = MANUFACTURER_ID_AR6001_BASE | 0x8,
++ .SDIO_ManufacturerCode = MANUFACTURER_CODE,
++ .SDIO_FunctionClass = FUNCTION_CLASS,
++ .SDIO_FunctionNo = 1
++ },
++ {
++ .SDIO_ManufacturerID = MANUFACTURER_ID_AR6002_BASE | 0x0,
++ .SDIO_ManufacturerCode = MANUFACTURER_CODE,
++ .SDIO_FunctionClass = FUNCTION_CLASS,
++ .SDIO_FunctionNo = 1
++ },
++ {
++ .SDIO_ManufacturerID = MANUFACTURER_ID_AR6002_BASE | 0x1,
++ .SDIO_ManufacturerCode = MANUFACTURER_CODE,
++ .SDIO_FunctionClass = FUNCTION_CLASS,
++ .SDIO_FunctionNo = 1
++ },
++ {
++ } //list is null termintaed
++};
++
++TARGET_FUNCTION_CONTEXT FunctionContext = {
++ .function.Version = CT_SDIO_STACK_VERSION_CODE,
++ .function.pName = "sdio_wlan",
++ .function.MaxDevices = 1,
++ .function.NumDevices = 0,
++ .function.pIds = Ids,
++ .function.pProbe = hifDeviceInserted,
++ .function.pRemove = hifDeviceRemoved,
++ .function.pSuspend = NULL,
++ .function.pResume = NULL,
++ .function.pWake = NULL,
++ .function.pContext = &FunctionContext,
++};
++
++HIF_DEVICE hifDevice[HIF_MAX_DEVICES];
++HTC_CALLBACKS htcCallbacks;
++BUS_REQUEST busRequest[BUS_REQUEST_MAX_NUM];
++static BUS_REQUEST *s_busRequestFreeQueue = NULL;
++OS_CRITICALSECTION lock;
++extern A_UINT32 onebitmode;
++extern A_UINT32 busspeedlow;
++
++#ifdef DEBUG
++extern A_UINT32 debughif;
++#define ATH_DEBUG_ERROR 1
++#define ATH_DEBUG_WARN 2
++#define ATH_DEBUG_TRACE 3
++#define _AR_DEBUG_PRINTX_ARG(arg...) arg
++#define AR_DEBUG_PRINTF(lvl, args)\
++ {if (lvl <= debughif)\
++ A_PRINTF(KERN_ALERT _AR_DEBUG_PRINTX_ARG args);\
++ }
++#else
++#define AR_DEBUG_PRINTF(lvl, args)
++#endif
++
++static BUS_REQUEST *hifAllocateBusRequest(void);
++static void hifFreeBusRequest(BUS_REQUEST *busrequest);
++static THREAD_RETURN insert_helper_func(POSKERNEL_HELPER pHelper);
++static void ResetAllCards(void);
++
++/* ------ Functions ------ */
++int HIFInit(HTC_CALLBACKS *callbacks)
++{
++ SDIO_STATUS status;
++ DBG_ASSERT(callbacks != NULL);
++
++ /* Store the callback and event handlers */
++ htcCallbacks.deviceInsertedHandler = callbacks->deviceInsertedHandler;
++ htcCallbacks.deviceRemovedHandler = callbacks->deviceRemovedHandler;
++ htcCallbacks.deviceSuspendHandler = callbacks->deviceSuspendHandler;
++ htcCallbacks.deviceResumeHandler = callbacks->deviceResumeHandler;
++ htcCallbacks.deviceWakeupHandler = callbacks->deviceWakeupHandler;
++ htcCallbacks.rwCompletionHandler = callbacks->rwCompletionHandler;
++ htcCallbacks.dsrHandler = callbacks->dsrHandler;
++
++ CriticalSectionInit(&lock);
++
++ /* Register with bus driver core */
++ status = SDIO_RegisterFunction(&FunctionContext.function);
++ DBG_ASSERT(SDIO_SUCCESS(status));
++
++ return(0);
++}
++
++A_STATUS
++HIFReadWrite(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UCHAR *buffer,
++ A_UINT32 length,
++ A_UINT32 request,
++ void *context)
++{
++ A_UINT8 rw;
++ A_UINT8 mode;
++ A_UINT8 funcNo;
++ A_UINT8 opcode;
++ A_UINT16 count;
++ SDREQUEST *sdrequest;
++ SDIO_STATUS sdiostatus;
++ BUS_REQUEST *busrequest;
++ A_STATUS status = A_OK;
++
++ DBG_ASSERT(device != NULL);
++ DBG_ASSERT(device->handle != NULL);
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Device: %p\n", device));
++
++ do {
++ busrequest = hifAllocateBusRequest();
++ if (busrequest == NULL) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR, ("HIF Unable to allocate bus request\n"));
++ status = A_NO_RESOURCE;
++ break;
++ }
++
++ sdrequest = busrequest->request;
++ busrequest->context = context;
++
++ sdrequest->pDataBuffer = buffer;
++ if (request & HIF_SYNCHRONOUS) {
++ sdrequest->Flags = SDREQ_FLAGS_RESP_SDIO_R5 | SDREQ_FLAGS_DATA_TRANS;
++ sdrequest->pCompleteContext = NULL;
++ sdrequest->pCompletion = NULL;
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Execution mode: Synchronous\n"));
++ } else if (request & HIF_ASYNCHRONOUS) {
++ sdrequest->Flags = SDREQ_FLAGS_RESP_SDIO_R5 | SDREQ_FLAGS_DATA_TRANS |
++ SDREQ_FLAGS_TRANS_ASYNC;
++ sdrequest->pCompleteContext = busrequest;
++ sdrequest->pCompletion = hifRWCompletionHandler;
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Execution mode: Asynchronous\n"));
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
++ ("Invalid execution mode: 0x%08x\n", request));
++ status = A_EINVAL;
++ break;
++ }
++
++ if (request & HIF_EXTENDED_IO) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Command type: CMD53\n"));
++ sdrequest->Command = CMD53;
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
++ ("Invalid command type: 0x%08x\n", request));
++ status = A_EINVAL;
++ break;
++ }
++
++ if (request & HIF_BLOCK_BASIS) {
++ mode = CMD53_BLOCK_BASIS;
++ sdrequest->BlockLen = HIF_MBOX_BLOCK_SIZE;
++ sdrequest->BlockCount = length / HIF_MBOX_BLOCK_SIZE;
++ count = sdrequest->BlockCount;
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
++ ("Block mode (BlockLen: %d, BlockCount: %d)\n",
++ sdrequest->BlockLen, sdrequest->BlockCount));
++ } else if (request & HIF_BYTE_BASIS) {
++ mode = CMD53_BYTE_BASIS;
++ sdrequest->BlockLen = length;
++ sdrequest->BlockCount = 1;
++ count = sdrequest->BlockLen;
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
++ ("Byte mode (BlockLen: %d, BlockCount: %d)\n",
++ sdrequest->BlockLen, sdrequest->BlockCount));
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
++ ("Invalid data mode: 0x%08x\n", request));
++ status = A_EINVAL;
++ break;
++ }
++
++#if 0
++ /* useful for checking register accesses */
++ if (length & 0x3) {
++ A_PRINTF(KERN_ALERT"HIF (%s) is not a multiple of 4 bytes, addr:0x%X, len:%d\n",
++ request & HIF_WRITE ? "write":"read", address, length);
++ }
++#endif
++
++ if ((address >= HIF_MBOX_START_ADDR(0)) &&
++ (address <= HIF_MBOX_END_ADDR(3)))
++ {
++
++ DBG_ASSERT(length <= HIF_MBOX_WIDTH);
++
++ /*
++ * Mailbox write. Adjust the address so that the last byte
++ * falls on the EOM address.
++ */
++ address += (HIF_MBOX_WIDTH - length);
++ }
++
++
++
++ if (request & HIF_WRITE) {
++ rw = CMD53_WRITE;
++ sdrequest->Flags |= SDREQ_FLAGS_DATA_WRITE;
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Direction: Write\n"));
++ } else if (request & HIF_READ) {
++ rw = CMD53_READ;
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Direction: Read\n"));
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
++ ("Invalid direction: 0x%08x\n", request));
++ status = A_EINVAL;
++ break;
++ }
++
++ if (request & HIF_FIXED_ADDRESS) {
++ opcode = CMD53_FIXED_ADDRESS;
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Address mode: Fixed\n"));
++ } else if (request & HIF_INCREMENTAL_ADDRESS) {
++ opcode = CMD53_INCR_ADDRESS;
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Address mode: Incremental\n"));
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
++ ("Invalid address mode: 0x%08x\n", request));
++ status = A_EINVAL;
++ break;
++ }
++
++ funcNo = SDDEVICE_GET_SDIO_FUNCNO(device->handle);
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Function number: %d\n", funcNo));
++ SDIO_SET_CMD53_ARG(sdrequest->Argument, rw, funcNo,
++ mode, opcode, address, count);
++
++ /* Send the command out */
++ sdiostatus = SDDEVICE_CALL_REQUEST_FUNC(device->handle, sdrequest);
++
++ if (!SDIO_SUCCESS(sdiostatus)) {
++ status = A_ERROR;
++ }
++
++ } while (FALSE);
++
++ if (A_FAILED(status) || (request & HIF_SYNCHRONOUS)) {
++ if (busrequest != NULL) {
++ hifFreeBusRequest(busrequest);
++ }
++ }
++
++ if (A_FAILED(status) && (request & HIF_ASYNCHRONOUS)) {
++ /* call back async handler on failure */
++ htcCallbacks.rwCompletionHandler(context, status);
++ }
++
++ return status;
++}
++
++A_STATUS
++HIFConfigureDevice(HIF_DEVICE *device, HIF_DEVICE_CONFIG_OPCODE opcode,
++ void *config, A_UINT32 configLen)
++{
++ A_UINT32 count;
++
++ switch(opcode) {
++ case HIF_DEVICE_GET_MBOX_BLOCK_SIZE:
++ ((A_UINT32 *)config)[0] = HIF_MBOX0_BLOCK_SIZE;
++ ((A_UINT32 *)config)[1] = HIF_MBOX1_BLOCK_SIZE;
++ ((A_UINT32 *)config)[2] = HIF_MBOX2_BLOCK_SIZE;
++ ((A_UINT32 *)config)[3] = HIF_MBOX3_BLOCK_SIZE;
++ break;
++
++ case HIF_DEVICE_GET_MBOX_ADDR:
++ for (count = 0; count < 4; count ++) {
++ ((A_UINT32 *)config)[count] = HIF_MBOX_START_ADDR(count);
++ }
++ break;
++ case HIF_DEVICE_GET_IRQ_PROC_MODE:
++ /* the SDIO stack allows the interrupts to be processed either way, ASYNC or SYNC */
++ *((HIF_DEVICE_IRQ_PROCESSING_MODE *)config) = HIF_DEVICE_IRQ_ASYNC_SYNC;
++ break;
++ default:
++ AR_DEBUG_PRINTF(ATH_DEBUG_WARN,
++ ("Unsupported configuration opcode: %d\n", opcode));
++ return A_ERROR;
++ }
++
++ return A_OK;
++}
++
++void
++HIFShutDownDevice(HIF_DEVICE *device)
++{
++ A_UINT8 data;
++ A_UINT32 count;
++ SDIO_STATUS status;
++ SDCONFIG_BUS_MODE_DATA busSettings;
++ SDCONFIG_FUNC_ENABLE_DISABLE_DATA fData;
++
++ if (device != NULL) {
++ DBG_ASSERT(device->handle != NULL);
++
++ /* Remove the allocated current if any */
++ status = SDLIB_IssueConfig(device->handle,
++ SDCONFIG_FUNC_FREE_SLOT_CURRENT, NULL, 0);
++ DBG_ASSERT(SDIO_SUCCESS(status));
++
++ /* Disable the card */
++ fData.EnableFlags = SDCONFIG_DISABLE_FUNC;
++ fData.TimeOut = 1;
++ status = SDLIB_IssueConfig(device->handle, SDCONFIG_FUNC_ENABLE_DISABLE,
++ &fData, sizeof(fData));
++ DBG_ASSERT(SDIO_SUCCESS(status));
++
++ /* Perform a soft I/O reset */
++ data = SDIO_IO_RESET;
++ status = SDLIB_IssueCMD52(device->handle, 0, SDIO_IO_ABORT_REG,
++ &data, 1, 1);
++ DBG_ASSERT(SDIO_SUCCESS(status));
++
++ /*
++ * WAR - Codetelligence driver does not seem to shutdown correctly in 1
++ * bit mode. By default it configures the HC in the 4 bit. Its later in
++ * our driver that we switch to 1 bit mode. If we try to shutdown, the
++ * driver hangs so we revert to 4 bit mode, to be transparent to the
++ * underlying bus driver.
++ */
++ if (onebitmode) {
++ ZERO_OBJECT(busSettings);
++ busSettings.BusModeFlags = SDDEVICE_GET_BUSMODE_FLAGS(device->handle);
++ SDCONFIG_SET_BUS_WIDTH(busSettings.BusModeFlags,
++ SDCONFIG_BUS_WIDTH_4_BIT);
++
++ /* Issue config request to change the bus width to 4 bit */
++ status = SDLIB_IssueConfig(device->handle, SDCONFIG_BUS_MODE_CTRL,
++ &busSettings,
++ sizeof(SDCONFIG_BUS_MODE_DATA));
++ DBG_ASSERT(SDIO_SUCCESS(status));
++ }
++
++ /* Free the bus requests */
++ for (count = 0; count < BUS_REQUEST_MAX_NUM; count ++) {
++ SDDeviceFreeRequest(device->handle, busRequest[count].request);
++ }
++ /* Clean up the queue */
++ s_busRequestFreeQueue = NULL;
++ } else {
++ /* since we are unloading the driver anyways, reset all cards in case the SDIO card
++ * is externally powered and we are unloading the SDIO stack. This avoids the problem when
++ * the SDIO stack is reloaded and attempts are made to re-enumerate a card that is already
++ * enumerated */
++ ResetAllCards();
++ /* Unregister with bus driver core */
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
++ ("Unregistering with the bus driver\n"));
++ status = SDIO_UnregisterFunction(&FunctionContext.function);
++ DBG_ASSERT(SDIO_SUCCESS(status));
++ }
++}
++
++void
++hifRWCompletionHandler(SDREQUEST *request)
++{
++ A_STATUS status;
++ void *context;
++ BUS_REQUEST *busrequest;
++
++ if (SDIO_SUCCESS(request->Status)) {
++ status = A_OK;
++ } else {
++ status = A_ERROR;
++ }
++
++ DBG_ASSERT(status == A_OK);
++ busrequest = (BUS_REQUEST *) request->pCompleteContext;
++ context = (void *) busrequest->context;
++ /* free the request before calling the callback, in case the
++ * callback submits another request, this guarantees that
++ * there is at least 1 free request available everytime the callback
++ * is invoked */
++ hifFreeBusRequest(busrequest);
++ htcCallbacks.rwCompletionHandler(context, status);
++}
++
++void
++hifIRQHandler(void *context)
++{
++ A_STATUS status;
++ HIF_DEVICE *device;
++
++ device = (HIF_DEVICE *)context;
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Device: %p\n", device));
++ status = htcCallbacks.dsrHandler(device->htc_handle);
++ DBG_ASSERT(status == A_OK);
++}
++
++BOOL
++hifDeviceInserted(SDFUNCTION *function, SDDEVICE *handle)
++{
++ BOOL enabled;
++ A_UINT8 data;
++ A_UINT32 count;
++ HIF_DEVICE *device;
++ SDIO_STATUS status;
++ A_UINT16 maxBlocks;
++ A_UINT16 maxBlockSize;
++ SDCONFIG_BUS_MODE_DATA busSettings;
++ SDCONFIG_FUNC_ENABLE_DISABLE_DATA fData;
++ TARGET_FUNCTION_CONTEXT *functionContext;
++ SDCONFIG_FUNC_SLOT_CURRENT_DATA slotCurrent;
++ SD_BUSCLOCK_RATE currentBusClock;
++
++ DBG_ASSERT(function != NULL);
++ DBG_ASSERT(handle != NULL);
++
++ device = addHifDevice(handle);
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Device: %p\n", device));
++ functionContext = (TARGET_FUNCTION_CONTEXT *)function->pContext;
++
++ /*
++ * Issue commands to get the manufacturer ID and stuff and compare it
++ * against the rev Id derived from the ID registered during the
++ * initialization process. Report the device only in the case there
++ * is a match. In the case od SDIO, the bus driver has already queried
++ * these details so we just need to use their data structures to get the
++ * relevant values. Infact, the driver has already matched it against
++ * the Ids that we registered with it so we dont need to the step here.
++ */
++
++ /* Configure the SDIO Bus Width */
++ if (onebitmode) {
++ data = SDIO_BUS_WIDTH_1_BIT;
++ status = SDLIB_IssueCMD52(handle, 0, SDIO_BUS_IF_REG, &data, 1, 1);
++ if (!SDIO_SUCCESS(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
++ ("Unable to set the bus width to 1 bit\n"));
++ return FALSE;
++ }
++ }
++
++ /* Get current bus flags */
++ ZERO_OBJECT(busSettings);
++
++ busSettings.BusModeFlags = SDDEVICE_GET_BUSMODE_FLAGS(handle);
++ if (onebitmode) {
++ SDCONFIG_SET_BUS_WIDTH(busSettings.BusModeFlags,
++ SDCONFIG_BUS_WIDTH_1_BIT);
++ }
++
++ /* get the current operating clock, the bus driver sets us up based
++ * on what our CIS reports and what the host controller can handle
++ * we can use this to determine whether we want to drop our clock rate
++ * down */
++ currentBusClock = SDDEVICE_GET_OPER_CLOCK(handle);
++ busSettings.ClockRate = currentBusClock;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
++ ("HIF currently running at: %d \n",currentBusClock));
++
++ /* see if HIF wants to run at a lower clock speed, we may already be
++ * at that lower clock speed */
++ if (currentBusClock > (SDIO_CLOCK_FREQUENCY_DEFAULT >> busspeedlow)) {
++ busSettings.ClockRate = SDIO_CLOCK_FREQUENCY_DEFAULT >> busspeedlow;
++ AR_DEBUG_PRINTF(ATH_DEBUG_WARN,
++ ("HIF overriding clock to %d \n",busSettings.ClockRate));
++ }
++
++ /* Issue config request to override clock rate */
++ status = SDLIB_IssueConfig(handle, SDCONFIG_FUNC_CHANGE_BUS_MODE, &busSettings,
++ sizeof(SDCONFIG_BUS_MODE_DATA));
++ if (!SDIO_SUCCESS(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
++ ("Unable to configure the host clock\n"));
++ return FALSE;
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
++ ("Configured clock: %d, Maximum clock: %d\n",
++ busSettings.ActualClockRate,
++ SDDEVICE_GET_MAX_CLOCK(handle)));
++ }
++
++ /*
++ * Check if the target supports block mode. This result of this check
++ * can be used to implement the HIFReadWrite API.
++ */
++ if (SDDEVICE_GET_SDIO_FUNC_MAXBLKSIZE(handle)) {
++ /* Limit block size to operational block limit or card function
++ capability */
++ maxBlockSize = min(SDDEVICE_GET_OPER_BLOCK_LEN(handle),
++ SDDEVICE_GET_SDIO_FUNC_MAXBLKSIZE(handle));
++
++ /* check if the card support multi-block transfers */
++ if (!(SDDEVICE_GET_SDIOCARD_CAPS(handle) & SDIO_CAPS_MULTI_BLOCK)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Byte basis only\n"));
++
++ /* Limit block size to max byte basis */
++ maxBlockSize = min(maxBlockSize,
++ (A_UINT16)SDIO_MAX_LENGTH_BYTE_BASIS);
++ maxBlocks = 1;
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Multi-block capable\n"));
++ maxBlocks = SDDEVICE_GET_OPER_BLOCKS(handle);
++ status = SDLIB_SetFunctionBlockSize(handle, HIF_MBOX_BLOCK_SIZE);
++ if (!SDIO_SUCCESS(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
++ ("Failed to set block size. Err:%d\n", status));
++ return FALSE;
++ }
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
++ ("Bytes Per Block: %d bytes, Block Count:%d \n",
++ maxBlockSize, maxBlocks));
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
++ ("Function does not support Block Mode!\n"));
++ return FALSE;
++ }
++
++ /* Allocate the slot current */
++ status = SDLIB_GetDefaultOpCurrent(handle, &slotCurrent.SlotCurrent);
++ if (SDIO_SUCCESS(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Allocating Slot current: %d mA\n",
++ slotCurrent.SlotCurrent));
++ status = SDLIB_IssueConfig(handle, SDCONFIG_FUNC_ALLOC_SLOT_CURRENT,
++ &slotCurrent, sizeof(slotCurrent));
++ if (!SDIO_SUCCESS(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
++ ("Failed to allocate slot current %d\n", status));
++ return FALSE;
++ }
++ }
++
++ /* Enable the dragon function */
++ count = 0;
++ enabled = FALSE;
++ fData.TimeOut = 1;
++ fData.EnableFlags = SDCONFIG_ENABLE_FUNC;
++ while ((count++ < SDWLAN_ENABLE_DISABLE_TIMEOUT) && !enabled)
++ {
++ /* Enable dragon */
++ status = SDLIB_IssueConfig(handle, SDCONFIG_FUNC_ENABLE_DISABLE,
++ &fData, sizeof(fData));
++ if (!SDIO_SUCCESS(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
++ ("Attempting to enable the card again\n"));
++ continue;
++ }
++
++ /* Mark the status as enabled */
++ enabled = TRUE;
++ }
++
++ /* Check if we were succesful in enabling the target */
++ if (!enabled) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
++ ("Failed to communicate with the target\n"));
++ return FALSE;
++ }
++
++ /* Allocate the bus requests to be used later */
++ A_MEMZERO(busRequest, sizeof(busRequest));
++ for (count = 0; count < BUS_REQUEST_MAX_NUM; count ++) {
++ if ((busRequest[count].request = SDDeviceAllocRequest(handle)) == NULL){
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR, ("Unable to allocate memory\n"));
++ /* TODO: Free the memory that has already been allocated */
++ return FALSE;
++ }
++ hifFreeBusRequest(&busRequest[count]);
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
++ ("0x%08x = busRequest[%d].request = 0x%08x\n",
++ (unsigned int) &busRequest[count], count,
++ (unsigned int) busRequest[count].request));
++ }
++
++ /* Schedule a worker to handle device inserted, this is a temporary workaround
++ * to fix a deadlock if the device fails to intialize in the insertion handler
++ * The failure causes the instance to shutdown the HIF layer and unregister the
++ * function driver within the busdriver probe context which can deadlock
++ *
++ * NOTE: we cannot use the default work queue because that would block
++ * SD bus request processing for all synchronous I/O. We must use a kernel
++ * thread that is creating using the helper library.
++ * */
++
++ if (SDIO_SUCCESS(SDLIB_OSCreateHelper(&device->insert_helper,
++ insert_helper_func,
++ device))) {
++ device->helper_started = TRUE;
++ }
++
++ return TRUE;
++}
++
++static THREAD_RETURN insert_helper_func(POSKERNEL_HELPER pHelper)
++{
++
++ /*
++ * Adding a wait of around a second before we issue the very first
++ * command to dragon. During the process of loading/unloading the
++ * driver repeatedly it was observed that we get a data timeout
++ * while accessing function 1 registers in the chip. The theory at
++ * this point is that some initialization delay in dragon is
++ * causing the SDIO state in dragon core to be not ready even after
++ * the ready bit indicates that function 1 is ready. Accomodating
++ * for this behavior by adding some delay in the driver before it
++ * issues the first command after switching on dragon. Need to
++ * investigate this a bit more - TODO
++ */
++
++ A_MDELAY(1000);
++ /* Inform HTC */
++ if ((htcCallbacks.deviceInsertedHandler(SD_GET_OS_HELPER_CONTEXT(pHelper))) != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Device rejected\n"));
++ }
++
++ return 0;
++}
++
++void
++HIFAckInterrupt(HIF_DEVICE *device)
++{
++ SDIO_STATUS status;
++ DBG_ASSERT(device != NULL);
++ DBG_ASSERT(device->handle != NULL);
++
++ /* Acknowledge our function IRQ */
++ status = SDLIB_IssueConfig(device->handle, SDCONFIG_FUNC_ACK_IRQ,
++ NULL, 0);
++ DBG_ASSERT(SDIO_SUCCESS(status));
++}
++
++void
++HIFUnMaskInterrupt(HIF_DEVICE *device)
++{
++ SDIO_STATUS status;
++
++ DBG_ASSERT(device != NULL);
++ DBG_ASSERT(device->handle != NULL);
++
++ /* Register the IRQ Handler */
++ SDDEVICE_SET_IRQ_HANDLER(device->handle, hifIRQHandler, device);
++
++ /* Unmask our function IRQ */
++ status = SDLIB_IssueConfig(device->handle, SDCONFIG_FUNC_UNMASK_IRQ,
++ NULL, 0);
++ DBG_ASSERT(SDIO_SUCCESS(status));
++}
++
++void HIFMaskInterrupt(HIF_DEVICE *device)
++{
++ SDIO_STATUS status;
++ DBG_ASSERT(device != NULL);
++ DBG_ASSERT(device->handle != NULL);
++
++ /* Mask our function IRQ */
++ status = SDLIB_IssueConfig(device->handle, SDCONFIG_FUNC_MASK_IRQ,
++ NULL, 0);
++ DBG_ASSERT(SDIO_SUCCESS(status));
++
++ /* Unregister the IRQ Handler */
++ SDDEVICE_SET_IRQ_HANDLER(device->handle, NULL, NULL);
++}
++
++static BUS_REQUEST *hifAllocateBusRequest(void)
++{
++ BUS_REQUEST *busrequest;
++
++ /* Acquire lock */
++ CriticalSectionAcquire(&lock);
++
++ /* Remove first in list */
++ if((busrequest = s_busRequestFreeQueue) != NULL)
++ {
++ s_busRequestFreeQueue = busrequest->next;
++ }
++
++ /* Release lock */
++ CriticalSectionRelease(&lock);
++
++ return busrequest;
++}
++
++static void
++hifFreeBusRequest(BUS_REQUEST *busrequest)
++{
++ DBG_ASSERT(busrequest != NULL);
++
++ /* Acquire lock */
++ CriticalSectionAcquire(&lock);
++
++ /* Insert first in list */
++ busrequest->next = s_busRequestFreeQueue;
++ s_busRequestFreeQueue = busrequest;
++
++ /* Release lock */
++ CriticalSectionRelease(&lock);
++}
++
++void
++hifDeviceRemoved(SDFUNCTION *function, SDDEVICE *handle)
++{
++ A_STATUS status;
++ HIF_DEVICE *device;
++ DBG_ASSERT(function != NULL);
++ DBG_ASSERT(handle != NULL);
++
++ device = getHifDevice(handle);
++ status = htcCallbacks.deviceRemovedHandler(device->htc_handle, A_OK);
++
++ /* cleanup the helper thread */
++ if (device->helper_started) {
++ SDLIB_OSDeleteHelper(&device->insert_helper);
++ device->helper_started = FALSE;
++ }
++
++ delHifDevice(handle);
++ DBG_ASSERT(status == A_OK);
++}
++
++HIF_DEVICE *
++addHifDevice(SDDEVICE *handle)
++{
++ DBG_ASSERT(handle != NULL);
++ hifDevice[0].handle = handle;
++ return &hifDevice[0];
++}
++
++HIF_DEVICE *
++getHifDevice(SDDEVICE *handle)
++{
++ DBG_ASSERT(handle != NULL);
++ return &hifDevice[0];
++}
++
++void
++delHifDevice(SDDEVICE *handle)
++{
++ DBG_ASSERT(handle != NULL);
++ hifDevice[0].handle = NULL;
++}
++
++struct device*
++HIFGetOSDevice(HIF_DEVICE *device)
++{
++ return &device->handle->Device->dev;
++}
++
++static void ResetAllCards(void)
++{
++ UINT8 data;
++ SDIO_STATUS status;
++ int i;
++
++ data = SDIO_IO_RESET;
++
++ /* set the I/O CARD reset bit:
++ * NOTE: we are exploiting a "feature" of the SDIO core that resets the core when you
++ * set the RES bit in the SDIO_IO_ABORT register. This bit however "normally" resets the
++ * I/O functions leaving the SDIO core in the same state (as per SDIO spec).
++ * In this design, this reset can be used to reset the SDIO core itself */
++ for (i = 0; i < HIF_MAX_DEVICES; i++) {
++ if (hifDevice[i].handle != NULL) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
++ ("Issuing I/O Card reset for instance: %d \n",i));
++ /* set the I/O Card reset bit */
++ status = SDLIB_IssueCMD52(hifDevice[i].handle,
++ 0, /* function 0 space */
++ SDIO_IO_ABORT_REG,
++ &data,
++ 1, /* 1 byte */
++ TRUE); /* write */
++ }
++ }
++
++}
++
++void HIFSetHandle(void *hif_handle, void *handle)
++{
++ HIF_DEVICE *device = (HIF_DEVICE *) hif_handle;
++
++ device->htc_handle = handle;
++
++ return;
++}
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/hif/hif_internal.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/hif/hif_internal.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/hif/hif_internal.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/hif/hif_internal.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,102 @@
++/*
++ * @file: hif_internal.h
++ *
++ * @abstract: internal header file for hif layer
++ *
++ * @notice: Copyright (c) 2004-2006 Atheros Communications Inc.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include <linux/sdio/ctsystem.h>
++#include <linux/sdio/sdio_busdriver.h>
++#include <linux/sdio/_sdio_defs.h>
++#include <linux/sdio/sdio_lib.h>
++#include "a_config.h"
++#include "athdefs.h"
++#include "a_types.h"
++#include "a_osapi.h"
++#include "hif.h"
++
++#define MANUFACTURER_ID_AR6001_BASE 0x100
++#define MANUFACTURER_ID_AR6002_BASE 0x200
++#define FUNCTION_CLASS 0x0
++#define MANUFACTURER_CODE 0x271
++
++#define BUS_REQUEST_MAX_NUM 64
++
++#define SDIO_CLOCK_FREQUENCY_DEFAULT 25000000
++#define SDWLAN_ENABLE_DISABLE_TIMEOUT 20
++#define FLAGS_CARD_ENAB 0x02
++#define FLAGS_CARD_IRQ_UNMSK 0x04
++
++#define HIF_MBOX_BLOCK_SIZE 128
++#define HIF_MBOX_BASE_ADDR 0x800
++#define HIF_MBOX_WIDTH 0x800
++#define HIF_MBOX0_BLOCK_SIZE 1
++#define HIF_MBOX1_BLOCK_SIZE HIF_MBOX_BLOCK_SIZE
++#define HIF_MBOX2_BLOCK_SIZE HIF_MBOX_BLOCK_SIZE
++#define HIF_MBOX3_BLOCK_SIZE HIF_MBOX_BLOCK_SIZE
++
++#define HIF_MBOX_START_ADDR(mbox) \
++ HIF_MBOX_BASE_ADDR + mbox * HIF_MBOX_WIDTH
++
++#define HIF_MBOX_END_ADDR(mbox) \
++ HIF_MBOX_START_ADDR(mbox) + HIF_MBOX_WIDTH - 1
++
++struct hif_device {
++ SDDEVICE *handle;
++ void *htc_handle;
++ OSKERNEL_HELPER insert_helper;
++ BOOL helper_started;
++};
++
++typedef struct target_function_context {
++ SDFUNCTION function; /* function description of the bus driver */
++ OS_SEMAPHORE instanceSem; /* instance lock. Unused */
++ SDLIST instanceList; /* list of instances. Unused */
++} TARGET_FUNCTION_CONTEXT;
++
++typedef struct bus_request {
++ struct bus_request *next;
++ SDREQUEST *request;
++ void *context;
++} BUS_REQUEST;
++
++BOOL
++hifDeviceInserted(SDFUNCTION *function, SDDEVICE *device);
++
++void
++hifDeviceRemoved(SDFUNCTION *function, SDDEVICE *device);
++
++SDREQUEST *
++hifAllocateDeviceRequest(SDDEVICE *device);
++
++void
++hifFreeDeviceRequest(SDREQUEST *request);
++
++void
++hifRWCompletionHandler(SDREQUEST *request);
++
++void
++hifIRQHandler(void *context);
++
++HIF_DEVICE *
++addHifDevice(SDDEVICE *handle);
++
++HIF_DEVICE *
++getHifDevice(SDDEVICE *handle);
++
++void
++delHifDevice(SDDEVICE *handle);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/htc/ar6k.c linux-2.6.29-rc3.owrt.om/drivers/ar6000/htc/ar6k.c
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/htc/ar6k.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/htc/ar6k.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,991 @@
++/*
++ * AR6K device layer that handles register level I/O
++ *
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++#include "a_config.h"
++#include "athdefs.h"
++#include "a_types.h"
++#include "AR6Khwreg.h"
++#include "a_osapi.h"
++#include "a_debug.h"
++#include "hif.h"
++#include "htc_packet.h"
++#include "ar6k.h"
++
++#define MAILBOX_FOR_BLOCK_SIZE 1
++
++extern A_UINT32 resetok;
++
++static A_STATUS DevEnableInterrupts(AR6K_DEVICE *pDev);
++static A_STATUS DevDisableInterrupts(AR6K_DEVICE *pDev);
++
++#define LOCK_AR6K(p) A_MUTEX_LOCK(&(p)->Lock);
++#define UNLOCK_AR6K(p) A_MUTEX_UNLOCK(&(p)->Lock);
++
++void AR6KFreeIOPacket(AR6K_DEVICE *pDev, HTC_PACKET *pPacket)
++{
++ LOCK_AR6K(pDev);
++ HTC_PACKET_ENQUEUE(&pDev->RegisterIOList,pPacket);
++ UNLOCK_AR6K(pDev);
++}
++
++HTC_PACKET *AR6KAllocIOPacket(AR6K_DEVICE *pDev)
++{
++ HTC_PACKET *pPacket;
++
++ LOCK_AR6K(pDev);
++ pPacket = HTC_PACKET_DEQUEUE(&pDev->RegisterIOList);
++ UNLOCK_AR6K(pDev);
++
++ return pPacket;
++}
++
++A_STATUS DevSetup(AR6K_DEVICE *pDev)
++{
++ A_UINT32 mailboxaddrs[AR6K_MAILBOXES];
++ A_UINT32 blocksizes[AR6K_MAILBOXES];
++ A_STATUS status = A_OK;
++ int i;
++
++ AR_DEBUG_ASSERT(AR6K_IRQ_PROC_REGS_SIZE == 16);
++ AR_DEBUG_ASSERT(AR6K_IRQ_ENABLE_REGS_SIZE == 4);
++
++ do {
++ /* give a handle to HIF for this target */
++ HIFSetHandle(pDev->HIFDevice, (void *)pDev);
++ /* initialize our free list of IO packets */
++ INIT_HTC_PACKET_QUEUE(&pDev->RegisterIOList);
++ A_MUTEX_INIT(&pDev->Lock);
++
++ /* get the addresses for all 4 mailboxes */
++ status = HIFConfigureDevice(pDev->HIFDevice, HIF_DEVICE_GET_MBOX_ADDR,
++ mailboxaddrs, sizeof(mailboxaddrs));
++
++ if (status != A_OK) {
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++
++ /* carve up register I/O packets (these are for ASYNC register I/O ) */
++ for (i = 0; i < AR6K_MAX_REG_IO_BUFFERS; i++) {
++ HTC_PACKET *pIOPacket;
++ pIOPacket = &pDev->RegIOBuffers[i].HtcPacket;
++ SET_HTC_PACKET_INFO_RX_REFILL(pIOPacket,
++ pDev,
++ pDev->RegIOBuffers[i].Buffer,
++ AR6K_REG_IO_BUFFER_SIZE,
++ 0); /* don't care */
++ AR6KFreeIOPacket(pDev,pIOPacket);
++ }
++
++ /* get the address of the mailbox we are using */
++ pDev->MailboxAddress = mailboxaddrs[HTC_MAILBOX];
++
++ /* get the block sizes */
++ status = HIFConfigureDevice(pDev->HIFDevice, HIF_DEVICE_GET_MBOX_BLOCK_SIZE,
++ blocksizes, sizeof(blocksizes));
++
++ if (status != A_OK) {
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++
++ /* note: we actually get the block size of a mailbox other than 0, for SDIO the block
++ * size on mailbox 0 is artificially set to 1. So we use the block size that is set
++ * for the other 3 mailboxes */
++ pDev->BlockSize = blocksizes[MAILBOX_FOR_BLOCK_SIZE];
++ /* must be a power of 2 */
++ AR_DEBUG_ASSERT((pDev->BlockSize & (pDev->BlockSize - 1)) == 0);
++
++ /* assemble mask, used for padding to a block */
++ pDev->BlockMask = pDev->BlockSize - 1;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("BlockSize: %d, MailboxAddress:0x%X \n",
++ pDev->BlockSize, pDev->MailboxAddress));
++
++ pDev->GetPendingEventsFunc = NULL;
++ /* see if the HIF layer implements the get pending events function */
++ HIFConfigureDevice(pDev->HIFDevice,
++ HIF_DEVICE_GET_PENDING_EVENTS_FUNC,
++ &pDev->GetPendingEventsFunc,
++ sizeof(pDev->GetPendingEventsFunc));
++
++ /* assume we can process HIF interrupt events asynchronously */
++ pDev->HifIRQProcessingMode = HIF_DEVICE_IRQ_ASYNC_SYNC;
++
++ /* see if the HIF layer overrides this assumption */
++ HIFConfigureDevice(pDev->HIFDevice,
++ HIF_DEVICE_GET_IRQ_PROC_MODE,
++ &pDev->HifIRQProcessingMode,
++ sizeof(pDev->HifIRQProcessingMode));
++
++ switch (pDev->HifIRQProcessingMode) {
++ case HIF_DEVICE_IRQ_SYNC_ONLY:
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("HIF Interrupt processing is SYNC ONLY\n"));
++ break;
++ case HIF_DEVICE_IRQ_ASYNC_SYNC:
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("HIF Interrupt processing is ASYNC and SYNC\n"));
++ break;
++ default:
++ AR_DEBUG_ASSERT(FALSE);
++ }
++
++ pDev->HifMaskUmaskRecvEvent = NULL;
++
++ /* see if the HIF layer implements the mask/unmask recv events function */
++ HIFConfigureDevice(pDev->HIFDevice,
++ HIF_DEVICE_GET_RECV_EVENT_MASK_UNMASK_FUNC,
++ &pDev->HifMaskUmaskRecvEvent,
++ sizeof(pDev->HifMaskUmaskRecvEvent));
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("HIF special overrides : 0x%X , 0x%X\n",
++ (A_UINT32)pDev->GetPendingEventsFunc, (A_UINT32)pDev->HifMaskUmaskRecvEvent));
++
++ status = DevDisableInterrupts(pDev);
++
++ } while (FALSE);
++
++ if (A_FAILED(status)) {
++ /* make sure handle is cleared */
++ HIFSetHandle(pDev->HIFDevice, NULL);
++ }
++
++ return status;
++
++}
++
++static A_STATUS DevEnableInterrupts(AR6K_DEVICE *pDev)
++{
++ A_STATUS status;
++ AR6K_IRQ_ENABLE_REGISTERS regs;
++
++ LOCK_AR6K(pDev);
++
++ /* Enable all the interrupts except for the dragon interrupt */
++ pDev->IrqEnableRegisters.int_status_enable = INT_STATUS_ENABLE_ERROR_SET(0x01) |
++ INT_STATUS_ENABLE_CPU_SET(0x01) |
++ INT_STATUS_ENABLE_COUNTER_SET(0x01);
++
++ if (NULL == pDev->GetPendingEventsFunc) {
++ pDev->IrqEnableRegisters.int_status_enable |= INT_STATUS_ENABLE_MBOX_DATA_SET(0x01);
++ } else {
++ /* The HIF layer provided us with a pending events function which means that
++ * the detection of pending mbox messages is handled in the HIF layer.
++ * This is the case for the SPI2 interface.
++ * In the normal case we enable MBOX interrupts, for the case
++ * with HIFs that offer this mechanism, we keep these interrupts
++ * masked */
++ pDev->IrqEnableRegisters.int_status_enable &= ~INT_STATUS_ENABLE_MBOX_DATA_SET(0x01);
++ }
++
++
++ /* Set up the CPU Interrupt Status Register */
++ pDev->IrqEnableRegisters.cpu_int_status_enable = CPU_INT_STATUS_ENABLE_BIT_SET(0x00);
++
++ /* Set up the Error Interrupt Status Register */
++ pDev->IrqEnableRegisters.error_status_enable =
++ ERROR_STATUS_ENABLE_RX_UNDERFLOW_SET(0x01) |
++ ERROR_STATUS_ENABLE_TX_OVERFLOW_SET(0x01);
++
++ /* Set up the Counter Interrupt Status Register (only for debug interrupt to catch fatal errors) */
++ pDev->IrqEnableRegisters.counter_int_status_enable =
++ COUNTER_INT_STATUS_ENABLE_BIT_SET(AR6K_TARGET_DEBUG_INTR_MASK);
++
++ /* copy into our temp area */
++ A_MEMCPY(&regs,&pDev->IrqEnableRegisters,AR6K_IRQ_ENABLE_REGS_SIZE);
++
++ UNLOCK_AR6K(pDev);
++
++ /* always synchronous */
++ status = HIFReadWrite(pDev->HIFDevice,
++ INT_STATUS_ENABLE_ADDRESS,
++ &regs.int_status_enable,
++ AR6K_IRQ_ENABLE_REGS_SIZE,
++ HIF_WR_SYNC_BYTE_INC,
++ NULL);
++
++ if (status != A_OK) {
++ /* Can't write it for some reason */
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("Failed to update interrupt control registers err: %d\n", status));
++
++ }
++
++ return status;
++}
++
++static A_STATUS DevDisableInterrupts(AR6K_DEVICE *pDev)
++{
++ AR6K_IRQ_ENABLE_REGISTERS regs;
++
++ LOCK_AR6K(pDev);
++ /* Disable all interrupts */
++ pDev->IrqEnableRegisters.int_status_enable = 0;
++ pDev->IrqEnableRegisters.cpu_int_status_enable = 0;
++ pDev->IrqEnableRegisters.error_status_enable = 0;
++ pDev->IrqEnableRegisters.counter_int_status_enable = 0;
++ /* copy into our temp area */
++ A_MEMCPY(&regs,&pDev->IrqEnableRegisters,AR6K_IRQ_ENABLE_REGS_SIZE);
++
++ UNLOCK_AR6K(pDev);
++
++ /* always synchronous */
++ return HIFReadWrite(pDev->HIFDevice,
++ INT_STATUS_ENABLE_ADDRESS,
++ &regs.int_status_enable,
++ AR6K_IRQ_ENABLE_REGS_SIZE,
++ HIF_WR_SYNC_BYTE_INC,
++ NULL);
++}
++
++/* enable device interrupts */
++A_STATUS DevUnmaskInterrupts(AR6K_DEVICE *pDev)
++{
++ /* Unmask the host controller interrupts */
++ HIFUnMaskInterrupt(pDev->HIFDevice);
++
++ return DevEnableInterrupts(pDev);
++}
++
++/* disable all device interrupts */
++A_STATUS DevMaskInterrupts(AR6K_DEVICE *pDev)
++{
++ A_STATUS status;
++
++ status = DevDisableInterrupts(pDev);
++
++ if (A_SUCCESS(status)) {
++ /* Disable the interrupt at the HIF layer */
++ HIFMaskInterrupt(pDev->HIFDevice);
++ }
++
++ return status;
++}
++
++/* callback when our fetch to enable/disable completes */
++static void DevDoEnableDisableRecvAsyncHandler(void *Context, HTC_PACKET *pPacket)
++{
++ AR6K_DEVICE *pDev = (AR6K_DEVICE *)Context;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("+DevDoEnableDisableRecvAsyncHandler: (dev: 0x%X)\n", (A_UINT32)pDev));
++
++ if (A_FAILED(pPacket->Status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ (" Failed to disable receiver, status:%d \n", pPacket->Status));
++ }
++ /* free this IO packet */
++ AR6KFreeIOPacket(pDev,pPacket);
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("-DevDoEnableDisableRecvAsyncHandler \n"));
++}
++
++/* disable packet reception (used in case the host runs out of buffers)
++ * this is the "override" method when the HIF reports another methods to
++ * disable recv events */
++static A_STATUS DevDoEnableDisableRecvOverride(AR6K_DEVICE *pDev, A_BOOL EnableRecv, A_BOOL AsyncMode)
++{
++ A_STATUS status = A_OK;
++ HTC_PACKET *pIOPacket = NULL;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("DevDoEnableDisableRecvOverride: Enable:%d Mode:%d\n",
++ EnableRecv,AsyncMode));
++
++ do {
++
++ if (AsyncMode) {
++
++ pIOPacket = AR6KAllocIOPacket(pDev);
++
++ if (NULL == pIOPacket) {
++ status = A_NO_MEMORY;
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++
++ /* stick in our completion routine when the I/O operation completes */
++ pIOPacket->Completion = DevDoEnableDisableRecvAsyncHandler;
++ pIOPacket->pContext = pDev;
++
++ /* call the HIF layer override and do this asynchronously */
++ status = pDev->HifMaskUmaskRecvEvent(pDev->HIFDevice,
++ EnableRecv ? HIF_UNMASK_RECV : HIF_MASK_RECV,
++ pIOPacket);
++ break;
++ }
++
++ /* if we get here we are doing it synchronously */
++ status = pDev->HifMaskUmaskRecvEvent(pDev->HIFDevice,
++ EnableRecv ? HIF_UNMASK_RECV : HIF_MASK_RECV,
++ NULL);
++
++ } while (FALSE);
++
++ if (A_FAILED(status) && (pIOPacket != NULL)) {
++ AR6KFreeIOPacket(pDev,pIOPacket);
++ }
++
++ return status;
++}
++
++/* disable packet reception (used in case the host runs out of buffers)
++ * this is the "normal" method using the interrupt enable registers through
++ * the host I/F */
++static A_STATUS DevDoEnableDisableRecvNormal(AR6K_DEVICE *pDev, A_BOOL EnableRecv, A_BOOL AsyncMode)
++{
++ A_STATUS status = A_OK;
++ HTC_PACKET *pIOPacket = NULL;
++ AR6K_IRQ_ENABLE_REGISTERS regs;
++
++ /* take the lock to protect interrupt enable shadows */
++ LOCK_AR6K(pDev);
++
++ if (EnableRecv) {
++ pDev->IrqEnableRegisters.int_status_enable |= INT_STATUS_ENABLE_MBOX_DATA_SET(0x01);
++ } else {
++ pDev->IrqEnableRegisters.int_status_enable &= ~INT_STATUS_ENABLE_MBOX_DATA_SET(0x01);
++ }
++
++ /* copy into our temp area */
++ A_MEMCPY(&regs,&pDev->IrqEnableRegisters,AR6K_IRQ_ENABLE_REGS_SIZE);
++ UNLOCK_AR6K(pDev);
++
++ do {
++
++ if (AsyncMode) {
++
++ pIOPacket = AR6KAllocIOPacket(pDev);
++
++ if (NULL == pIOPacket) {
++ status = A_NO_MEMORY;
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++
++ /* copy values to write to our async I/O buffer */
++ A_MEMCPY(pIOPacket->pBuffer,&regs,AR6K_IRQ_ENABLE_REGS_SIZE);
++
++ /* stick in our completion routine when the I/O operation completes */
++ pIOPacket->Completion = DevDoEnableDisableRecvAsyncHandler;
++ pIOPacket->pContext = pDev;
++
++ /* write it out asynchronously */
++ HIFReadWrite(pDev->HIFDevice,
++ INT_STATUS_ENABLE_ADDRESS,
++ pIOPacket->pBuffer,
++ AR6K_IRQ_ENABLE_REGS_SIZE,
++ HIF_WR_ASYNC_BYTE_INC,
++ pIOPacket);
++ break;
++ }
++
++ /* if we get here we are doing it synchronously */
++
++ status = HIFReadWrite(pDev->HIFDevice,
++ INT_STATUS_ENABLE_ADDRESS,
++ &regs.int_status_enable,
++ AR6K_IRQ_ENABLE_REGS_SIZE,
++ HIF_WR_SYNC_BYTE_INC,
++ NULL);
++
++ } while (FALSE);
++
++ if (A_FAILED(status) && (pIOPacket != NULL)) {
++ AR6KFreeIOPacket(pDev,pIOPacket);
++ }
++
++ return status;
++}
++
++
++A_STATUS DevStopRecv(AR6K_DEVICE *pDev, A_BOOL AsyncMode)
++{
++ if (NULL == pDev->HifMaskUmaskRecvEvent) {
++ return DevDoEnableDisableRecvNormal(pDev,FALSE,AsyncMode);
++ } else {
++ return DevDoEnableDisableRecvOverride(pDev,FALSE,AsyncMode);
++ }
++}
++
++A_STATUS DevEnableRecv(AR6K_DEVICE *pDev, A_BOOL AsyncMode)
++{
++ if (NULL == pDev->HifMaskUmaskRecvEvent) {
++ return DevDoEnableDisableRecvNormal(pDev,TRUE,AsyncMode);
++ } else {
++ return DevDoEnableDisableRecvOverride(pDev,TRUE,AsyncMode);
++ }
++}
++
++void DevDumpRegisters(AR6K_IRQ_PROC_REGISTERS *pIrqProcRegs,
++ AR6K_IRQ_ENABLE_REGISTERS *pIrqEnableRegs)
++{
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP, ("\n<------- Register Table -------->\n"));
++
++ if (pIrqProcRegs != NULL) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
++ ("Int Status: 0x%x\n",pIrqProcRegs->host_int_status));
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
++ ("CPU Int Status: 0x%x\n",pIrqProcRegs->cpu_int_status));
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
++ ("Error Int Status: 0x%x\n",pIrqProcRegs->error_int_status));
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
++ ("Counter Int Status: 0x%x\n",pIrqProcRegs->counter_int_status));
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
++ ("Mbox Frame: 0x%x\n",pIrqProcRegs->mbox_frame));
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
++ ("Rx Lookahead Valid: 0x%x\n",pIrqProcRegs->rx_lookahead_valid));
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
++ ("Rx Lookahead 0: 0x%x\n",pIrqProcRegs->rx_lookahead[0]));
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
++ ("Rx Lookahead 1: 0x%x\n",pIrqProcRegs->rx_lookahead[1]));
++ }
++
++ if (pIrqEnableRegs != NULL) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
++ ("Int Status Enable: 0x%x\n",pIrqEnableRegs->int_status_enable));
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
++ ("Counter Int Status Enable: 0x%x\n",pIrqEnableRegs->counter_int_status_enable));
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP, ("<------------------------------->\n"));
++ }
++}
++
++
++#ifdef MBOXHW_UNIT_TEST
++
++
++/* This is a mailbox hardware unit test that must be called in a schedulable context
++ * This test is very simple, it will send a list of buffers with a counting pattern
++ * and the target will invert the data and send the message back
++ *
++ * the unit test has the following constraints:
++ *
++ * The target has at least 8 buffers of 256 bytes each. The host will send
++ * the following pattern of buffers in rapid succession :
++ *
++ * 1 buffer - 128 bytes
++ * 1 buffer - 256 bytes
++ * 1 buffer - 512 bytes
++ * 1 buffer - 1024 bytes
++ *
++ * The host will send the buffers to one mailbox and wait for buffers to be reflected
++ * back from the same mailbox. The target sends the buffers FIFO order.
++ * Once the final buffer has been received for a mailbox, the next mailbox is tested.
++ *
++ *
++ * Note: To simplifythe test , we assume that the chosen buffer sizes
++ * will fall on a nice block pad
++ *
++ * It is expected that higher-order tests will be written to stress the mailboxes using
++ * a message-based protocol (with some performance timming) that can create more
++ * randomness in the packets sent over mailboxes.
++ *
++ * */
++
++#define A_ROUND_UP_PWR2(x, align) (((int) (x) + ((align)-1)) & ~((align)-1))
++
++#define BUFFER_BLOCK_PAD 128
++
++#if 0
++#define BUFFER1 128
++#define BUFFER2 256
++#define BUFFER3 512
++#define BUFFER4 1024
++#endif
++
++#if 1
++#define BUFFER1 80
++#define BUFFER2 200
++#define BUFFER3 444
++#define BUFFER4 800
++#endif
++
++#define TOTAL_BYTES (A_ROUND_UP_PWR2(BUFFER1,BUFFER_BLOCK_PAD) + \
++ A_ROUND_UP_PWR2(BUFFER2,BUFFER_BLOCK_PAD) + \
++ A_ROUND_UP_PWR2(BUFFER3,BUFFER_BLOCK_PAD) + \
++ A_ROUND_UP_PWR2(BUFFER4,BUFFER_BLOCK_PAD) )
++
++#define TEST_BYTES (BUFFER1 + BUFFER2 + BUFFER3 + BUFFER4)
++
++#define TEST_CREDITS_RECV_TIMEOUT 100
++
++static A_UINT8 g_Buffer[TOTAL_BYTES];
++static A_UINT32 g_MailboxAddrs[AR6K_MAILBOXES];
++static A_UINT32 g_BlockSizes[AR6K_MAILBOXES];
++
++#define BUFFER_PROC_LIST_DEPTH 4
++
++typedef struct _BUFFER_PROC_LIST{
++ A_UINT8 *pBuffer;
++ A_UINT32 length;
++}BUFFER_PROC_LIST;
++
++
++#define PUSH_BUFF_PROC_ENTRY(pList,len,pCurrpos) \
++{ \
++ (pList)->pBuffer = (pCurrpos); \
++ (pList)->length = (len); \
++ (pCurrpos) += (len); \
++ (pList)++; \
++}
++
++/* a simple and crude way to send different "message" sizes */
++static void AssembleBufferList(BUFFER_PROC_LIST *pList)
++{
++ A_UINT8 *pBuffer = g_Buffer;
++
++#if BUFFER_PROC_LIST_DEPTH < 4
++#error "Buffer processing list depth is not deep enough!!"
++#endif
++
++ PUSH_BUFF_PROC_ENTRY(pList,BUFFER1,pBuffer);
++ PUSH_BUFF_PROC_ENTRY(pList,BUFFER2,pBuffer);
++ PUSH_BUFF_PROC_ENTRY(pList,BUFFER3,pBuffer);
++ PUSH_BUFF_PROC_ENTRY(pList,BUFFER4,pBuffer);
++
++}
++
++#define FILL_ZERO TRUE
++#define FILL_COUNTING FALSE
++static void InitBuffers(A_BOOL Zero)
++{
++ A_UINT16 *pBuffer16 = (A_UINT16 *)g_Buffer;
++ int i;
++
++ /* fill buffer with 16 bit counting pattern or zeros */
++ for (i = 0; i < (TOTAL_BYTES / 2) ; i++) {
++ if (!Zero) {
++ pBuffer16[i] = (A_UINT16)i;
++ } else {
++ pBuffer16[i] = 0;
++ }
++ }
++}
++
++
++static A_BOOL CheckOneBuffer(A_UINT16 *pBuffer16, int Length)
++{
++ int i;
++ A_UINT16 startCount;
++ A_BOOL success = TRUE;
++
++ /* get the starting count */
++ startCount = pBuffer16[0];
++ /* invert it, this is the expected value */
++ startCount = ~startCount;
++ /* scan the buffer and verify */
++ for (i = 0; i < (Length / 2) ; i++,startCount++) {
++ /* target will invert all the data */
++ if ((A_UINT16)pBuffer16[i] != (A_UINT16)~startCount) {
++ success = FALSE;
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Invalid Data Got:0x%X, Expecting:0x%X (offset:%d, total:%d) \n",
++ pBuffer16[i], ((A_UINT16)~startCount), i, Length));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("0x%X 0x%X 0x%X 0x%X \n",
++ pBuffer16[i], pBuffer16[i + 1], pBuffer16[i + 2],pBuffer16[i+3]));
++ break;
++ }
++ }
++
++ return success;
++}
++
++static A_BOOL CheckBuffers(void)
++{
++ int i;
++ A_BOOL success = TRUE;
++ BUFFER_PROC_LIST checkList[BUFFER_PROC_LIST_DEPTH];
++
++ /* assemble the list */
++ AssembleBufferList(checkList);
++
++ /* scan the buffers and verify */
++ for (i = 0; i < BUFFER_PROC_LIST_DEPTH ; i++) {
++ success = CheckOneBuffer((A_UINT16 *)checkList[i].pBuffer, checkList[i].length);
++ if (!success) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Buffer : 0x%X, Length:%d failed verify \n",
++ (A_UINT32)checkList[i].pBuffer, checkList[i].length));
++ break;
++ }
++ }
++
++ return success;
++}
++
++ /* find the end marker for the last buffer we will be sending */
++static A_UINT16 GetEndMarker(void)
++{
++ A_UINT8 *pBuffer;
++ BUFFER_PROC_LIST checkList[BUFFER_PROC_LIST_DEPTH];
++
++ /* fill up buffers with the normal counting pattern */
++ InitBuffers(FILL_COUNTING);
++
++ /* assemble the list we will be sending down */
++ AssembleBufferList(checkList);
++ /* point to the last 2 bytes of the last buffer */
++ pBuffer = &(checkList[BUFFER_PROC_LIST_DEPTH - 1].pBuffer[(checkList[BUFFER_PROC_LIST_DEPTH - 1].length) - 2]);
++
++ /* the last count in the last buffer is the marker */
++ return (A_UINT16)pBuffer[0] | ((A_UINT16)pBuffer[1] << 8);
++}
++
++#define ATH_PRINT_OUT_ZONE ATH_DEBUG_ERR
++
++/* send the ordered buffers to the target */
++static A_STATUS SendBuffers(AR6K_DEVICE *pDev, int mbox)
++{
++ A_STATUS status = A_OK;
++ A_UINT32 request = HIF_WR_SYNC_BLOCK_INC;
++ BUFFER_PROC_LIST sendList[BUFFER_PROC_LIST_DEPTH];
++ int i;
++ int totalBytes = 0;
++ int paddedLength;
++ int totalwPadding = 0;
++
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Sending buffers on mailbox : %d \n",mbox));
++
++ /* fill buffer with counting pattern */
++ InitBuffers(FILL_COUNTING);
++
++ /* assemble the order in which we send */
++ AssembleBufferList(sendList);
++
++ for (i = 0; i < BUFFER_PROC_LIST_DEPTH; i++) {
++
++ /* we are doing block transfers, so we need to pad everything to a block size */
++ paddedLength = (sendList[i].length + (g_BlockSizes[mbox] - 1)) &
++ (~(g_BlockSizes[mbox] - 1));
++
++ /* send each buffer synchronously */
++ status = HIFReadWrite(pDev->HIFDevice,
++ g_MailboxAddrs[mbox],
++ sendList[i].pBuffer,
++ paddedLength,
++ request,
++ NULL);
++ if (status != A_OK) {
++ break;
++ }
++ totalBytes += sendList[i].length;
++ totalwPadding += paddedLength;
++ }
++
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Sent %d bytes (%d padded bytes) to mailbox : %d \n",totalBytes,totalwPadding,mbox));
++
++ return status;
++}
++
++/* poll the mailbox credit counter until we get a credit or timeout */
++static A_STATUS GetCredits(AR6K_DEVICE *pDev, int mbox, int *pCredits)
++{
++ A_STATUS status = A_OK;
++ int timeout = TEST_CREDITS_RECV_TIMEOUT;
++ A_UINT8 credits = 0;
++ A_UINT32 address;
++
++ while (TRUE) {
++
++ /* Read the counter register to get credits, this auto-decrements */
++ address = COUNT_DEC_ADDRESS + (AR6K_MAILBOXES + mbox) * 4;
++ status = HIFReadWrite(pDev->HIFDevice, address, &credits, sizeof(credits),
++ HIF_RD_SYNC_BYTE_FIX, NULL);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("Unable to decrement the command credit count register (mbox=%d)\n",mbox));
++ status = A_ERROR;
++ break;
++ }
++
++ if (credits) {
++ break;
++ }
++
++ timeout--;
++
++ if (timeout <= 0) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ (" Timeout reading credit registers (mbox=%d, address:0x%X) \n",mbox,address));
++ status = A_ERROR;
++ break;
++ }
++
++ /* delay a little, target may not be ready */
++ msleep(1000);
++
++ }
++
++ if (status == A_OK) {
++ *pCredits = credits;
++ }
++
++ return status;
++}
++
++
++/* wait for the buffers to come back */
++static A_STATUS RecvBuffers(AR6K_DEVICE *pDev, int mbox)
++{
++ A_STATUS status = A_OK;
++ A_UINT32 request = HIF_RD_SYNC_BLOCK_INC;
++ BUFFER_PROC_LIST recvList[BUFFER_PROC_LIST_DEPTH];
++ int curBuffer;
++ int credits;
++ int i;
++ int totalBytes = 0;
++ int paddedLength;
++ int totalwPadding = 0;
++
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Waiting for buffers on mailbox : %d \n",mbox));
++
++ /* zero the buffers */
++ InitBuffers(FILL_ZERO);
++
++ /* assemble the order in which we should receive */
++ AssembleBufferList(recvList);
++
++ curBuffer = 0;
++
++ while (curBuffer < BUFFER_PROC_LIST_DEPTH) {
++
++ /* get number of buffers that have been completed, this blocks
++ * until we get at least 1 credit or it times out */
++ status = GetCredits(pDev, mbox, &credits);
++
++ if (status != A_OK) {
++ break;
++ }
++
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Got %d messages on mailbox : %d \n",credits, mbox));
++
++ /* get all the buffers that are sitting on the queue */
++ for (i = 0; i < credits; i++) {
++ AR_DEBUG_ASSERT(curBuffer < BUFFER_PROC_LIST_DEPTH);
++ /* recv the current buffer synchronously, the buffers should come back in
++ * order... with padding applied by the target */
++ paddedLength = (recvList[curBuffer].length + (g_BlockSizes[mbox] - 1)) &
++ (~(g_BlockSizes[mbox] - 1));
++
++ status = HIFReadWrite(pDev->HIFDevice,
++ g_MailboxAddrs[mbox],
++ recvList[curBuffer].pBuffer,
++ paddedLength,
++ request,
++ NULL);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Failed to read %d bytes on mailbox:%d : address:0x%X \n",
++ recvList[curBuffer].length, mbox, g_MailboxAddrs[mbox]));
++ break;
++ }
++
++ totalwPadding += paddedLength;
++ totalBytes += recvList[curBuffer].length;
++ curBuffer++;
++ }
++
++ if (status != A_OK) {
++ break;
++ }
++ /* go back and get some more */
++ credits = 0;
++ }
++
++ if (totalBytes != TEST_BYTES) {
++ AR_DEBUG_ASSERT(FALSE);
++ } else {
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Got all buffers on mbox:%d total recv :%d (w/Padding : %d) \n",
++ mbox, totalBytes, totalwPadding));
++ }
++
++ return status;
++
++
++}
++
++static A_STATUS DoOneMboxHWTest(AR6K_DEVICE *pDev, int mbox)
++{
++ A_STATUS status;
++
++ do {
++ /* send out buffers */
++ status = SendBuffers(pDev,mbox);
++
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Sending buffers Failed : %d mbox:%d\n",status,mbox));
++ break;
++ }
++
++ /* go get them, this will block */
++ status = RecvBuffers(pDev, mbox);
++
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Recv buffers Failed : %d mbox:%d\n",status,mbox));
++ break;
++ }
++
++ /* check the returned data patterns */
++ if (!CheckBuffers()) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Buffer Verify Failed : mbox:%d\n",mbox));
++ status = A_ERROR;
++ break;
++ }
++
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, (" Send/Recv success! mailbox : %d \n",mbox));
++
++ } while (FALSE);
++
++ return status;
++}
++
++/* here is where the test starts */
++A_STATUS DoMboxHWTest(AR6K_DEVICE *pDev)
++{
++ int i;
++ A_STATUS status;
++ int credits = 0;
++ A_UINT8 params[4];
++ int numBufs;
++ int bufferSize;
++ A_UINT16 temp;
++
++
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, (" DoMboxHWTest START - \n"));
++
++ do {
++ /* get the addresses for all 4 mailboxes */
++ status = HIFConfigureDevice(pDev->HIFDevice, HIF_DEVICE_GET_MBOX_ADDR,
++ g_MailboxAddrs, sizeof(g_MailboxAddrs));
++
++ if (status != A_OK) {
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++
++ /* get the block sizes */
++ status = HIFConfigureDevice(pDev->HIFDevice, HIF_DEVICE_GET_MBOX_BLOCK_SIZE,
++ g_BlockSizes, sizeof(g_BlockSizes));
++
++ if (status != A_OK) {
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++
++ /* note, the HIF layer usually reports mbox 0 to have a block size of
++ * 1, but our test wants to run in block-mode for all mailboxes, so we treat all mailboxes
++ * the same. */
++ g_BlockSizes[0] = g_BlockSizes[1];
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Block Size to use: %d \n",g_BlockSizes[0]));
++
++ if (g_BlockSizes[1] > BUFFER_BLOCK_PAD) {
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("%d Block size is too large for buffer pad %d\n",
++ g_BlockSizes[1], BUFFER_BLOCK_PAD));
++ break;
++ }
++
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Waiting for target.... \n"));
++
++ /* the target lets us know it is ready by giving us 1 credit on
++ * mailbox 0 */
++ status = GetCredits(pDev, 0, &credits);
++
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Failed to wait for target ready \n"));
++ break;
++ }
++
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Target is ready ...\n"));
++
++ /* read the first 4 scratch registers */
++ status = HIFReadWrite(pDev->HIFDevice,
++ SCRATCH_ADDRESS,
++ params,
++ 4,
++ HIF_RD_SYNC_BYTE_INC,
++ NULL);
++
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Failed to wait get parameters \n"));
++ break;
++ }
++
++ numBufs = params[0];
++ bufferSize = (int)(((A_UINT16)params[2] << 8) | (A_UINT16)params[1]);
++
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE,
++ ("Target parameters: bufs per mailbox:%d, buffer size:%d bytes (total space: %d, minimum required space (w/padding): %d) \n",
++ numBufs, bufferSize, (numBufs * bufferSize), TOTAL_BYTES));
++
++ if ((numBufs * bufferSize) < TOTAL_BYTES) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Not Enough buffer space to run test! need:%d, got:%d \n",
++ TOTAL_BYTES, (numBufs*bufferSize)));
++ status = A_ERROR;
++ break;
++ }
++
++ temp = GetEndMarker();
++
++ status = HIFReadWrite(pDev->HIFDevice,
++ SCRATCH_ADDRESS + 4,
++ (A_UINT8 *)&temp,
++ 2,
++ HIF_WR_SYNC_BYTE_INC,
++ NULL);
++
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Failed to write end marker \n"));
++ break;
++ }
++
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("End Marker: 0x%X \n",temp));
++
++ temp = (A_UINT16)g_BlockSizes[1];
++ /* convert to a mask */
++ temp = temp - 1;
++ status = HIFReadWrite(pDev->HIFDevice,
++ SCRATCH_ADDRESS + 6,
++ (A_UINT8 *)&temp,
++ 2,
++ HIF_WR_SYNC_BYTE_INC,
++ NULL);
++
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Failed to write block mask \n"));
++ break;
++ }
++
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Set Block Mask: 0x%X \n",temp));
++
++ /* execute the test on each mailbox */
++ for (i = 0; i < AR6K_MAILBOXES; i++) {
++ status = DoOneMboxHWTest(pDev, i);
++ if (status != A_OK) {
++ break;
++ }
++ }
++
++ } while (FALSE);
++
++ if (status == A_OK) {
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, (" DoMboxHWTest DONE - SUCCESS! - \n"));
++ } else {
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, (" DoMboxHWTest DONE - FAILED! - \n"));
++ }
++ /* don't let HTC_Start continue, the target is actually not running any HTC code */
++ return A_ERROR;
++}
++#endif
++
++
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/htc/ar6k_events.c linux-2.6.29-rc3.owrt.om/drivers/ar6000/htc/ar6k_events.c
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/htc/ar6k_events.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/htc/ar6k_events.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,638 @@
++/*
++ * AR6K Driver layer event handling (i.e. interrupts, message polling)
++ *
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++#include "a_config.h"
++#include "athdefs.h"
++#include "a_types.h"
++#include "AR6Khwreg.h"
++#include "a_osapi.h"
++#include "a_debug.h"
++#include "hif.h"
++#include "htc_packet.h"
++#include "ar6k.h"
++
++extern void AR6KFreeIOPacket(AR6K_DEVICE *pDev, HTC_PACKET *pPacket);
++extern HTC_PACKET *AR6KAllocIOPacket(AR6K_DEVICE *pDev);
++
++static A_STATUS DevServiceDebugInterrupt(AR6K_DEVICE *pDev);
++
++#define DELAY_PER_INTERVAL_MS 10 /* 10 MS delay per polling interval */
++
++/* completion routine for ALL HIF layer async I/O */
++A_STATUS DevRWCompletionHandler(void *context, A_STATUS status)
++{
++ HTC_PACKET *pPacket = (HTC_PACKET *)context;
++
++ COMPLETE_HTC_PACKET(pPacket,status);
++
++ return A_OK;
++}
++
++/* mailbox recv message polling */
++A_STATUS DevPollMboxMsgRecv(AR6K_DEVICE *pDev,
++ A_UINT32 *pLookAhead,
++ int TimeoutMS)
++{
++ A_STATUS status = A_OK;
++ int timeout = TimeoutMS/DELAY_PER_INTERVAL_MS;
++
++ AR_DEBUG_ASSERT(timeout > 0);
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("+DevPollMboxMsgRecv \n"));
++
++ while (TRUE) {
++
++ if (pDev->GetPendingEventsFunc != NULL)
++ {
++
++ HIF_PENDING_EVENTS_INFO events;
++
++ /* the HIF layer uses a special mechanism to get events, do this
++ * synchronously */
++ status = pDev->GetPendingEventsFunc(pDev->HIFDevice,
++ &events,
++ NULL);
++ if (A_FAILED(status))
++ {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Failed to get pending events \n"));
++ break;
++ }
++
++ if (events.Events & HIF_RECV_MSG_AVAIL)
++ {
++ /* there is a message available, the lookahead should be valid now */
++ *pLookAhead = events.LookAhead;
++
++ break;
++ }
++ }
++ else
++ {
++
++ /* this is the standard HIF way.... */
++ /* load the register table */
++ status = HIFReadWrite(pDev->HIFDevice,
++ HOST_INT_STATUS_ADDRESS,
++ (A_UINT8 *)&pDev->IrqProcRegisters,
++ AR6K_IRQ_PROC_REGS_SIZE,
++ HIF_RD_SYNC_BYTE_INC,
++ NULL);
++
++ if (A_FAILED(status))
++ {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Failed to read register table \n"));
++ break;
++ }
++
++ /* check for MBOX data and valid lookahead */
++ if (pDev->IrqProcRegisters.host_int_status & (1 << HTC_MAILBOX))
++ {
++ if (pDev->IrqProcRegisters.rx_lookahead_valid & (1 << HTC_MAILBOX))
++ {
++ /* mailbox has a message and the look ahead is valid */
++ *pLookAhead = pDev->IrqProcRegisters.rx_lookahead[HTC_MAILBOX];
++ break;
++ }
++ }
++
++ }
++
++ timeout--;
++
++ if (timeout <= 0)
++ {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, (" Timeout waiting for recv message \n"));
++ status = A_ERROR;
++
++ /* check if the target asserted */
++ if ( pDev->IrqProcRegisters.counter_int_status & AR6K_TARGET_DEBUG_INTR_MASK) {
++ /* target signaled an assert, process this pending interrupt
++ * this will call the target failure handler */
++ DevServiceDebugInterrupt(pDev);
++ }
++
++ break;
++ }
++
++ /* delay a little */
++ msleep(DELAY_PER_INTERVAL_MS);
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,(" Retry Mbox Poll : %d \n",timeout));
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("-DevPollMboxMsgRecv \n"));
++
++ return status;
++}
++
++static A_STATUS DevServiceCPUInterrupt(AR6K_DEVICE *pDev)
++{
++ A_STATUS status;
++ A_UINT8 cpu_int_status;
++ A_UINT8 regBuffer[4];
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ, ("CPU Interrupt\n"));
++ cpu_int_status = pDev->IrqProcRegisters.cpu_int_status &
++ pDev->IrqEnableRegisters.cpu_int_status_enable;
++ AR_DEBUG_ASSERT(cpu_int_status);
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,
++ ("Valid interrupt source(s) in CPU_INT_STATUS: 0x%x\n",
++ cpu_int_status));
++
++ /* Clear the interrupt */
++ pDev->IrqProcRegisters.cpu_int_status &= ~cpu_int_status; /* W1C */
++
++ /* set up the register transfer buffer to hit the register 4 times , this is done
++ * to make the access 4-byte aligned to mitigate issues with host bus interconnects that
++ * restrict bus transfer lengths to be a multiple of 4-bytes */
++
++ /* set W1C value to clear the interrupt, this hits the register first */
++ regBuffer[0] = cpu_int_status;
++ /* the remaining 4 values are set to zero which have no-effect */
++ regBuffer[1] = 0;
++ regBuffer[2] = 0;
++ regBuffer[3] = 0;
++
++ status = HIFReadWrite(pDev->HIFDevice,
++ CPU_INT_STATUS_ADDRESS,
++ regBuffer,
++ 4,
++ HIF_WR_SYNC_BYTE_FIX,
++ NULL);
++
++ AR_DEBUG_ASSERT(status == A_OK);
++ return status;
++}
++
++
++static A_STATUS DevServiceErrorInterrupt(AR6K_DEVICE *pDev)
++{
++ A_STATUS status;
++ A_UINT8 error_int_status;
++ A_UINT8 regBuffer[4];
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ, ("Error Interrupt\n"));
++ error_int_status = pDev->IrqProcRegisters.error_int_status & 0x0F;
++ AR_DEBUG_ASSERT(error_int_status);
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,
++ ("Valid interrupt source(s) in ERROR_INT_STATUS: 0x%x\n",
++ error_int_status));
++
++ if (ERROR_INT_STATUS_WAKEUP_GET(error_int_status)) {
++ /* Wakeup */
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ, ("Error : Wakeup\n"));
++ }
++
++ if (ERROR_INT_STATUS_RX_UNDERFLOW_GET(error_int_status)) {
++ /* Rx Underflow */
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Error : Rx Underflow\n"));
++ }
++
++ if (ERROR_INT_STATUS_TX_OVERFLOW_GET(error_int_status)) {
++ /* Tx Overflow */
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Error : Tx Overflow\n"));
++ }
++
++ /* Clear the interrupt */
++ pDev->IrqProcRegisters.error_int_status &= ~error_int_status; /* W1C */
++
++ /* set up the register transfer buffer to hit the register 4 times , this is done
++ * to make the access 4-byte aligned to mitigate issues with host bus interconnects that
++ * restrict bus transfer lengths to be a multiple of 4-bytes */
++
++ /* set W1C value to clear the interrupt, this hits the register first */
++ regBuffer[0] = error_int_status;
++ /* the remaining 4 values are set to zero which have no-effect */
++ regBuffer[1] = 0;
++ regBuffer[2] = 0;
++ regBuffer[3] = 0;
++
++ status = HIFReadWrite(pDev->HIFDevice,
++ ERROR_INT_STATUS_ADDRESS,
++ regBuffer,
++ 4,
++ HIF_WR_SYNC_BYTE_FIX,
++ NULL);
++
++ AR_DEBUG_ASSERT(status == A_OK);
++ return status;
++}
++
++static A_STATUS DevServiceDebugInterrupt(AR6K_DEVICE *pDev)
++{
++ A_UINT32 dummy;
++ A_STATUS status;
++
++ /* Send a target failure event to the application */
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Target debug interrupt\n"));
++
++ if (pDev->TargetFailureCallback != NULL) {
++ pDev->TargetFailureCallback(pDev->HTCContext);
++ }
++
++ /* clear the interrupt , the debug error interrupt is
++ * counter 0 */
++ /* read counter to clear interrupt */
++ status = HIFReadWrite(pDev->HIFDevice,
++ COUNT_DEC_ADDRESS,
++ (A_UINT8 *)&dummy,
++ 4,
++ HIF_RD_SYNC_BYTE_INC,
++ NULL);
++
++ AR_DEBUG_ASSERT(status == A_OK);
++ return status;
++}
++
++static A_STATUS DevServiceCounterInterrupt(AR6K_DEVICE *pDev)
++{
++ A_UINT8 counter_int_status;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ, ("Counter Interrupt\n"));
++
++ counter_int_status = pDev->IrqProcRegisters.counter_int_status &
++ pDev->IrqEnableRegisters.counter_int_status_enable;
++
++ AR_DEBUG_ASSERT(counter_int_status);
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,
++ ("Valid interrupt source(s) in COUNTER_INT_STATUS: 0x%x\n",
++ counter_int_status));
++
++ /* Check if the debug interrupt is pending */
++ if (counter_int_status & AR6K_TARGET_DEBUG_INTR_MASK) {
++ return DevServiceDebugInterrupt(pDev);
++ }
++
++ return A_OK;
++}
++
++/* callback when our fetch to get interrupt status registers completes */
++static void DevGetEventAsyncHandler(void *Context, HTC_PACKET *pPacket)
++{
++ AR6K_DEVICE *pDev = (AR6K_DEVICE *)Context;
++ A_UINT32 lookAhead = 0;
++ A_BOOL otherInts = FALSE;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("+DevGetEventAsyncHandler: (dev: 0x%X)\n", (A_UINT32)pDev));
++
++ do {
++
++ if (A_FAILED(pPacket->Status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ (" GetEvents I/O request failed, status:%d \n", pPacket->Status));
++ /* bail out, don't unmask HIF interrupt */
++ break;
++ }
++
++ if (pDev->GetPendingEventsFunc != NULL) {
++ /* the HIF layer collected the information for us */
++ HIF_PENDING_EVENTS_INFO *pEvents = (HIF_PENDING_EVENTS_INFO *)pPacket->pBuffer;
++ if (pEvents->Events & HIF_RECV_MSG_AVAIL) {
++ lookAhead = pEvents->LookAhead;
++ if (0 == lookAhead) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" DevGetEventAsyncHandler1, lookAhead is zero! \n"));
++ }
++ }
++ if (pEvents->Events & HIF_OTHER_EVENTS) {
++ otherInts = TRUE;
++ }
++ } else {
++ /* standard interrupt table handling.... */
++ AR6K_IRQ_PROC_REGISTERS *pReg = (AR6K_IRQ_PROC_REGISTERS *)pPacket->pBuffer;
++ A_UINT8 host_int_status;
++
++ host_int_status = pReg->host_int_status & pDev->IrqEnableRegisters.int_status_enable;
++
++ if (host_int_status & (1 << HTC_MAILBOX)) {
++ host_int_status &= ~(1 << HTC_MAILBOX);
++ if (pReg->rx_lookahead_valid & (1 << HTC_MAILBOX)) {
++ /* mailbox has a message and the look ahead is valid */
++ lookAhead = pReg->rx_lookahead[HTC_MAILBOX];
++ if (0 == lookAhead) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" DevGetEventAsyncHandler2, lookAhead is zero! \n"));
++ }
++ }
++ }
++
++ if (host_int_status) {
++ /* there are other interrupts to handle */
++ otherInts = TRUE;
++ }
++ }
++
++ if (otherInts || (lookAhead == 0)) {
++ /* if there are other interrupts to process, we cannot do this in the async handler so
++ * ack the interrupt which will cause our sync handler to run again
++ * if however there are no more messages, we can now ack the interrupt */
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,
++ (" Acking interrupt from DevGetEventAsyncHandler (otherints:%d, lookahead:0x%X)\n",
++ otherInts, lookAhead));
++ HIFAckInterrupt(pDev->HIFDevice);
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,
++ (" DevGetEventAsyncHandler : detected another message, lookahead :0x%X \n",
++ lookAhead));
++ /* lookahead is non-zero and there are no other interrupts to service,
++ * go get the next message */
++ pDev->MessagePendingCallback(pDev->HTCContext, lookAhead, NULL);
++ }
++
++ } while (FALSE);
++
++ /* free this IO packet */
++ AR6KFreeIOPacket(pDev,pPacket);
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("-DevGetEventAsyncHandler \n"));
++}
++
++/* called by the HTC layer when it wants us to check if the device has any more pending
++ * recv messages, this starts off a series of async requests to read interrupt registers */
++A_STATUS DevCheckPendingRecvMsgsAsync(void *context)
++{
++ AR6K_DEVICE *pDev = (AR6K_DEVICE *)context;
++ A_STATUS status = A_OK;
++ HTC_PACKET *pIOPacket;
++
++ /* this is called in an ASYNC only context, we may NOT block, sleep or call any apis that can
++ * cause us to switch contexts */
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("+DevCheckPendingRecvMsgsAsync: (dev: 0x%X)\n", (A_UINT32)pDev));
++
++ do {
++
++ if (HIF_DEVICE_IRQ_SYNC_ONLY == pDev->HifIRQProcessingMode) {
++ /* break the async processing chain right here, no need to continue.
++ * The DevDsrHandler() will handle things in a loop when things are driven
++ * synchronously */
++ break;
++ }
++ /* first allocate one of our HTC packets we created for async I/O
++ * we reuse HTC packet definitions so that we can use the completion mechanism
++ * in DevRWCompletionHandler() */
++ pIOPacket = AR6KAllocIOPacket(pDev);
++
++ if (NULL == pIOPacket) {
++ /* there should be only 1 asynchronous request out at a time to read these registers
++ * so this should actually never happen */
++ status = A_NO_MEMORY;
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++
++ /* stick in our completion routine when the I/O operation completes */
++ pIOPacket->Completion = DevGetEventAsyncHandler;
++ pIOPacket->pContext = pDev;
++
++ if (pDev->GetPendingEventsFunc) {
++ /* HIF layer has it's own mechanism, pass the IO to it.. */
++ status = pDev->GetPendingEventsFunc(pDev->HIFDevice,
++ (HIF_PENDING_EVENTS_INFO *)pIOPacket->pBuffer,
++ pIOPacket);
++
++ } else {
++ /* standard way, read the interrupt register table asynchronously again */
++ status = HIFReadWrite(pDev->HIFDevice,
++ HOST_INT_STATUS_ADDRESS,
++ pIOPacket->pBuffer,
++ AR6K_IRQ_PROC_REGS_SIZE,
++ HIF_RD_ASYNC_BYTE_INC,
++ pIOPacket);
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,(" Async IO issued to get interrupt status...\n"));
++ } while (FALSE);
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("-DevCheckPendingRecvMsgsAsync \n"));
++
++ return status;
++}
++
++/* process pending interrupts synchronously */
++static A_STATUS ProcessPendingIRQs(AR6K_DEVICE *pDev, A_BOOL *pDone, A_BOOL *pASyncProcessing)
++{
++ A_STATUS status = A_OK;
++ A_UINT8 host_int_status = 0;
++ A_UINT32 lookAhead = 0;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("+ProcessPendingIRQs: (dev: 0x%X)\n", (A_UINT32)pDev));
++
++ /*** NOTE: the HIF implementation guarantees that the context of this call allows
++ * us to perform SYNCHRONOUS I/O, that is we can block, sleep or call any API that
++ * can block or switch thread/task ontexts.
++ * This is a fully schedulable context.
++ * */
++ do {
++
++ if (pDev->GetPendingEventsFunc != NULL) {
++ HIF_PENDING_EVENTS_INFO events;
++
++ /* the HIF layer uses a special mechanism to get events
++ * get this synchronously */
++ status = pDev->GetPendingEventsFunc(pDev->HIFDevice,
++ &events,
++ NULL);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ if (events.Events & HIF_RECV_MSG_AVAIL) {
++ lookAhead = events.LookAhead;
++ if (0 == lookAhead) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" ProcessPendingIRQs1 lookAhead is zero! \n"));
++ }
++ }
++
++ if (!(events.Events & HIF_OTHER_EVENTS) ||
++ !(pDev->IrqEnableRegisters.int_status_enable & OTHER_INTS_ENABLED)) {
++ /* no need to read the register table, no other interesting interrupts.
++ * Some interfaces (like SPI) can shadow interrupt sources without
++ * requiring the host to do a full table read */
++ break;
++ }
++
++ /* otherwise fall through and read the register table */
++ }
++
++ /*
++ * Read the first 28 bytes of the HTC register table. This will yield us
++ * the value of different int status registers and the lookahead
++ * registers.
++ * length = sizeof(int_status) + sizeof(cpu_int_status) +
++ * sizeof(error_int_status) + sizeof(counter_int_status) +
++ * sizeof(mbox_frame) + sizeof(rx_lookahead_valid) +
++ * sizeof(hole) + sizeof(rx_lookahead) +
++ * sizeof(int_status_enable) + sizeof(cpu_int_status_enable) +
++ * sizeof(error_status_enable) +
++ * sizeof(counter_int_status_enable);
++ *
++ */
++ status = HIFReadWrite(pDev->HIFDevice,
++ HOST_INT_STATUS_ADDRESS,
++ (A_UINT8 *)&pDev->IrqProcRegisters,
++ AR6K_IRQ_PROC_REGS_SIZE,
++ HIF_RD_SYNC_BYTE_INC,
++ NULL);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_IRQ)) {
++ DevDumpRegisters(&pDev->IrqProcRegisters,
++ &pDev->IrqEnableRegisters);
++ }
++
++ /* Update only those registers that are enabled */
++ host_int_status = pDev->IrqProcRegisters.host_int_status &
++ pDev->IrqEnableRegisters.int_status_enable;
++
++ if (NULL == pDev->GetPendingEventsFunc) {
++ /* only look at mailbox status if the HIF layer did not provide this function,
++ * on some HIF interfaces reading the RX lookahead is not valid to do */
++ if (host_int_status & (1 << HTC_MAILBOX)) {
++ /* mask out pending mailbox value, we use "lookAhead" as the real flag for
++ * mailbox processing below */
++ host_int_status &= ~(1 << HTC_MAILBOX);
++ if (pDev->IrqProcRegisters.rx_lookahead_valid & (1 << HTC_MAILBOX)) {
++ /* mailbox has a message and the look ahead is valid */
++ lookAhead = pDev->IrqProcRegisters.rx_lookahead[HTC_MAILBOX];
++ if (0 == lookAhead) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" ProcessPendingIRQs2, lookAhead is zero! \n"));
++ }
++ }
++ }
++ } else {
++ /* not valid to check if the HIF has another mechanism for reading mailbox pending status*/
++ host_int_status &= ~(1 << HTC_MAILBOX);
++ }
++
++ } while (FALSE);
++
++
++ do {
++
++ /* did the interrupt status fetches succeed? */
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ if ((0 == host_int_status) && (0 == lookAhead)) {
++ /* nothing to process, the caller can use this to break out of a loop */
++ *pDone = TRUE;
++ break;
++ }
++
++ if (lookAhead != 0) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("Pending mailbox message, LookAhead: 0x%X\n",lookAhead));
++ /* Mailbox Interrupt, the HTC layer may issue async requests to empty the
++ * mailbox...
++ * When emptying the recv mailbox we use the async handler above called from the
++ * completion routine of the callers read request. This can improve performance
++ * by reducing context switching when we rapidly pull packets */
++ status = pDev->MessagePendingCallback(pDev->HTCContext, lookAhead, pASyncProcessing);
++ if (A_FAILED(status)) {
++ break;
++ }
++ }
++
++ /* now handle the rest of them */
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,
++ (" Valid interrupt source(s) for OTHER interrupts: 0x%x\n",
++ host_int_status));
++
++ if (HOST_INT_STATUS_CPU_GET(host_int_status)) {
++ /* CPU Interrupt */
++ status = DevServiceCPUInterrupt(pDev);
++ if (A_FAILED(status)){
++ break;
++ }
++ }
++
++ if (HOST_INT_STATUS_ERROR_GET(host_int_status)) {
++ /* Error Interrupt */
++ status = DevServiceErrorInterrupt(pDev);
++ if (A_FAILED(status)){
++ break;
++ }
++ }
++
++ if (HOST_INT_STATUS_COUNTER_GET(host_int_status)) {
++ /* Counter Interrupt */
++ status = DevServiceCounterInterrupt(pDev);
++ if (A_FAILED(status)){
++ break;
++ }
++ }
++
++ } while (FALSE);
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("-ProcessPendingIRQs: (done:%d, async:%d) status=%d \n",
++ *pDone, *pASyncProcessing, status));
++
++ return status;
++}
++
++
++/* Synchronousinterrupt handler, this handler kicks off all interrupt processing.*/
++A_STATUS DevDsrHandler(void *context)
++{
++ AR6K_DEVICE *pDev = (AR6K_DEVICE *)context;
++ A_STATUS status = A_OK;
++ A_BOOL done = FALSE;
++ A_BOOL asyncProc = FALSE;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("+DevDsrHandler: (dev: 0x%X)\n", (A_UINT32)pDev));
++
++
++ while (!done) {
++ status = ProcessPendingIRQs(pDev, &done, &asyncProc);
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ if (HIF_DEVICE_IRQ_SYNC_ONLY == pDev->HifIRQProcessingMode) {
++ /* the HIF layer does not allow async IRQ processing, override the asyncProc flag */
++ asyncProc = FALSE;
++ /* this will cause us to re-enter ProcessPendingIRQ() and re-read interrupt status registers.
++ * this has a nice side effect of blocking us until all async read requests are completed.
++ * This behavior is required on some HIF implementations that do not allow ASYNC
++ * processing in interrupt handlers (like Windows CE) */
++ }
++
++ if (asyncProc) {
++ /* the function performed some async I/O for performance, we
++ need to exit the ISR immediately, the check below will prevent the interrupt from being
++ Ack'd while we handle it asynchronously */
++ break;
++ }
++
++ }
++
++ if (A_SUCCESS(status) && !asyncProc) {
++ /* Ack the interrupt only if :
++ * 1. we did not get any errors in processing interrupts
++ * 2. there are no outstanding async processing requests */
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,(" Acking interrupt from DevDsrHandler \n"));
++ HIFAckInterrupt(pDev->HIFDevice);
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("-DevDsrHandler \n"));
++ return A_OK;
++}
++
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/htc/ar6k.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/htc/ar6k.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/htc/ar6k.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/htc/ar6k.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,191 @@
++/*
++ *
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef AR6K_H_
++#define AR6K_H_
++
++#define AR6K_MAILBOXES 4
++
++/* HTC runs over mailbox 0 */
++#define HTC_MAILBOX 0
++
++#define AR6K_TARGET_DEBUG_INTR_MASK 0x01
++
++#define OTHER_INTS_ENABLED (INT_STATUS_ENABLE_ERROR_MASK | \
++ INT_STATUS_ENABLE_CPU_MASK | \
++ INT_STATUS_ENABLE_COUNTER_MASK)
++
++//#define MBOXHW_UNIT_TEST 1
++
++#include "athstartpack.h"
++typedef PREPACK struct _AR6K_IRQ_PROC_REGISTERS {
++ A_UINT8 host_int_status;
++ A_UINT8 cpu_int_status;
++ A_UINT8 error_int_status;
++ A_UINT8 counter_int_status;
++ A_UINT8 mbox_frame;
++ A_UINT8 rx_lookahead_valid;
++ A_UINT8 hole[2];
++ A_UINT32 rx_lookahead[2];
++} POSTPACK AR6K_IRQ_PROC_REGISTERS;
++
++#define AR6K_IRQ_PROC_REGS_SIZE sizeof(AR6K_IRQ_PROC_REGISTERS)
++
++
++
++typedef PREPACK struct _AR6K_IRQ_ENABLE_REGISTERS {
++ A_UINT8 int_status_enable;
++ A_UINT8 cpu_int_status_enable;
++ A_UINT8 error_status_enable;
++ A_UINT8 counter_int_status_enable;
++} POSTPACK AR6K_IRQ_ENABLE_REGISTERS;
++
++#include "athendpack.h"
++
++#define AR6K_IRQ_ENABLE_REGS_SIZE sizeof(AR6K_IRQ_ENABLE_REGISTERS)
++
++#define AR6K_REG_IO_BUFFER_SIZE 32
++#define AR6K_MAX_REG_IO_BUFFERS 8
++
++/* buffers for ASYNC I/O */
++typedef struct AR6K_ASYNC_REG_IO_BUFFER {
++ HTC_PACKET HtcPacket; /* we use an HTC packet as a wrapper for our async register-based I/O */
++ A_UINT8 Buffer[AR6K_REG_IO_BUFFER_SIZE];
++} AR6K_ASYNC_REG_IO_BUFFER;
++
++typedef struct _AR6K_DEVICE {
++ A_MUTEX_T Lock;
++ AR6K_IRQ_PROC_REGISTERS IrqProcRegisters;
++ AR6K_IRQ_ENABLE_REGISTERS IrqEnableRegisters;
++ void *HIFDevice;
++ A_UINT32 BlockSize;
++ A_UINT32 BlockMask;
++ A_UINT32 MailboxAddress;
++ HIF_PENDING_EVENTS_FUNC GetPendingEventsFunc;
++ void *HTCContext;
++ HTC_PACKET_QUEUE RegisterIOList;
++ AR6K_ASYNC_REG_IO_BUFFER RegIOBuffers[AR6K_MAX_REG_IO_BUFFERS];
++ void (*TargetFailureCallback)(void *Context);
++ A_STATUS (*MessagePendingCallback)(void *Context, A_UINT32 LookAhead, A_BOOL *pAsyncProc);
++ HIF_DEVICE_IRQ_PROCESSING_MODE HifIRQProcessingMode;
++ HIF_MASK_UNMASK_RECV_EVENT HifMaskUmaskRecvEvent;
++} AR6K_DEVICE;
++
++#define IS_DEV_IRQ_PROCESSING_ASYNC_ALLOWED(pDev) ((pDev)->HifIRQProcessingMode != HIF_DEVICE_IRQ_SYNC_ONLY)
++
++A_STATUS DevSetup(AR6K_DEVICE *pDev);
++A_STATUS DevUnmaskInterrupts(AR6K_DEVICE *pDev);
++A_STATUS DevMaskInterrupts(AR6K_DEVICE *pDev);
++A_STATUS DevPollMboxMsgRecv(AR6K_DEVICE *pDev,
++ A_UINT32 *pLookAhead,
++ int TimeoutMS);
++A_STATUS DevRWCompletionHandler(void *context, A_STATUS status);
++A_STATUS DevDsrHandler(void *context);
++A_STATUS DevCheckPendingRecvMsgsAsync(void *context);
++void DevDumpRegisters(AR6K_IRQ_PROC_REGISTERS *pIrqProcRegs,
++ AR6K_IRQ_ENABLE_REGISTERS *pIrqEnableRegs);
++
++#define DEV_STOP_RECV_ASYNC TRUE
++#define DEV_STOP_RECV_SYNC FALSE
++#define DEV_ENABLE_RECV_ASYNC TRUE
++#define DEV_ENABLE_RECV_SYNC FALSE
++A_STATUS DevStopRecv(AR6K_DEVICE *pDev, A_BOOL ASyncMode);
++A_STATUS DevEnableRecv(AR6K_DEVICE *pDev, A_BOOL ASyncMode);
++
++static INLINE A_STATUS DevSendPacket(AR6K_DEVICE *pDev, HTC_PACKET *pPacket, A_UINT32 SendLength) {
++ A_UINT32 paddedLength;
++ A_BOOL sync = (pPacket->Completion == NULL) ? TRUE : FALSE;
++ A_STATUS status;
++
++ /* adjust the length to be a multiple of block size if appropriate */
++ paddedLength = (SendLength + (pDev->BlockMask)) &
++ (~(pDev->BlockMask));
++#if 0 // BufferLength may not be set in , fix this...
++ if (paddedLength > pPacket->BufferLength) {
++ AR_DEBUG_ASSERT(FALSE);
++ if (pPacket->Completion != NULL) {
++ COMPLETE_HTC_PACKET(pPacket,A_EINVAL);
++ }
++ return A_EINVAL;
++ }
++#endif
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND,
++ ("DevSendPacket, Padded Length: %d Mbox:0x%X (mode:%s)\n",
++ paddedLength,
++ pDev->MailboxAddress,
++ sync ? "SYNC" : "ASYNC"));
++
++ status = HIFReadWrite(pDev->HIFDevice,
++ pDev->MailboxAddress,
++ pPacket->pBuffer,
++ paddedLength, /* the padded length */
++ sync ? HIF_WR_SYNC_BLOCK_INC : HIF_WR_ASYNC_BLOCK_INC,
++ sync ? NULL : pPacket); /* pass the packet as the context to the HIF request */
++
++ if (sync) {
++ pPacket->Status = status;
++ }
++
++ return status;
++}
++
++static INLINE A_STATUS DevRecvPacket(AR6K_DEVICE *pDev, HTC_PACKET *pPacket, A_UINT32 RecvLength) {
++ A_UINT32 paddedLength;
++ A_STATUS status;
++ A_BOOL sync = (pPacket->Completion == NULL) ? TRUE : FALSE;
++
++ /* adjust the length to be a multiple of block size if appropriate */
++ paddedLength = (RecvLength + (pDev->BlockMask)) &
++ (~(pDev->BlockMask));
++ if (paddedLength > pPacket->BufferLength) {
++ AR_DEBUG_ASSERT(FALSE);
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("DevRecvPacket, Not enough space for padlen:%d recvlen:%d bufferlen:%d \n",
++ paddedLength,RecvLength,pPacket->BufferLength));
++ if (pPacket->Completion != NULL) {
++ COMPLETE_HTC_PACKET(pPacket,A_EINVAL);
++ }
++ return A_EINVAL;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,
++ ("DevRecvPacket, Padded Length: %d Mbox:0x%X (mode:%s)\n",
++ paddedLength,
++ pDev->MailboxAddress,
++ sync ? "SYNC" : "ASYNC"));
++
++ status = HIFReadWrite(pDev->HIFDevice,
++ pDev->MailboxAddress,
++ pPacket->pBuffer,
++ paddedLength,
++ sync ? HIF_RD_SYNC_BLOCK_INC : HIF_RD_ASYNC_BLOCK_INC,
++ sync ? NULL : pPacket); /* pass the packet as the context to the HIF request */
++
++ if (sync) {
++ pPacket->Status = status;
++ }
++
++ return status;
++}
++
++#ifdef MBOXHW_UNIT_TEST
++A_STATUS DoMboxHWTest(AR6K_DEVICE *pDev);
++#endif
++
++#endif /*AR6K_H_*/
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/htc/htc.c linux-2.6.29-rc3.owrt.om/drivers/ar6000/htc/htc.c
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/htc/htc.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/htc/htc.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,508 @@
++/*
++ *
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "htc_internal.h"
++
++
++static HTC_INIT_INFO HTCInitInfo = {NULL,NULL,NULL};
++static A_BOOL HTCInitialized = FALSE;
++
++static A_STATUS HTCTargetInsertedHandler(void *hif_handle);
++static A_STATUS HTCTargetRemovedHandler(void *handle, A_STATUS status);
++static void HTCReportFailure(void *Context);
++
++/* Initializes the HTC layer */
++A_STATUS HTCInit(HTC_INIT_INFO *pInitInfo)
++{
++ HTC_CALLBACKS htcCallbacks;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCInit: Enter\n"));
++ if (HTCInitialized) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCInit: Exit\n"));
++ return A_OK;
++ }
++
++ A_MEMCPY(&HTCInitInfo,pInitInfo,sizeof(HTC_INIT_INFO));
++
++ A_MEMZERO(&htcCallbacks, sizeof(HTC_CALLBACKS));
++
++ /* setup HIF layer callbacks */
++ htcCallbacks.deviceInsertedHandler = HTCTargetInsertedHandler;
++ htcCallbacks.deviceRemovedHandler = HTCTargetRemovedHandler;
++ /* the device layer handles these */
++ htcCallbacks.rwCompletionHandler = DevRWCompletionHandler;
++ htcCallbacks.dsrHandler = DevDsrHandler;
++ HIFInit(&htcCallbacks);
++ HTCInitialized = TRUE;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCInit: Exit\n"));
++ return A_OK;
++}
++
++void HTCFreeControlBuffer(HTC_TARGET *target, HTC_PACKET *pPacket, HTC_PACKET_QUEUE *pList)
++{
++ LOCK_HTC(target);
++ HTC_PACKET_ENQUEUE(pList,pPacket);
++ UNLOCK_HTC(target);
++}
++
++HTC_PACKET *HTCAllocControlBuffer(HTC_TARGET *target, HTC_PACKET_QUEUE *pList)
++{
++ HTC_PACKET *pPacket;
++
++ LOCK_HTC(target);
++ pPacket = HTC_PACKET_DEQUEUE(pList);
++ UNLOCK_HTC(target);
++
++ return pPacket;
++}
++
++/* cleanup the HTC instance */
++static void HTCCleanup(HTC_TARGET *target)
++{
++ if (A_IS_MUTEX_VALID(&target->HTCLock)) {
++ A_MUTEX_DELETE(&target->HTCLock);
++ }
++
++ if (A_IS_MUTEX_VALID(&target->HTCRxLock)) {
++ A_MUTEX_DELETE(&target->HTCRxLock);
++ }
++
++ if (A_IS_MUTEX_VALID(&target->HTCTxLock)) {
++ A_MUTEX_DELETE(&target->HTCTxLock);
++ }
++ /* free our instance */
++ A_FREE(target);
++}
++
++/* registered target arrival callback from the HIF layer */
++static A_STATUS HTCTargetInsertedHandler(void *hif_handle)
++{
++ HTC_TARGET *target = NULL;
++ A_STATUS status;
++ int i;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("htcTargetInserted - Enter\n"));
++
++ do {
++
++ /* allocate target memory */
++ if ((target = (HTC_TARGET *)A_MALLOC(sizeof(HTC_TARGET))) == NULL) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to allocate memory\n"));
++ status = A_ERROR;
++ break;
++ }
++
++ A_MEMZERO(target, sizeof(HTC_TARGET));
++ A_MUTEX_INIT(&target->HTCLock);
++ A_MUTEX_INIT(&target->HTCRxLock);
++ A_MUTEX_INIT(&target->HTCTxLock);
++ INIT_HTC_PACKET_QUEUE(&target->ControlBufferTXFreeList);
++ INIT_HTC_PACKET_QUEUE(&target->ControlBufferRXFreeList);
++
++ /* give device layer the hif device handle */
++ target->Device.HIFDevice = hif_handle;
++ /* give the device layer our context (for event processing)
++ * the device layer will register it's own context with HIF
++ * so we need to set this so we can fetch it in the target remove handler */
++ target->Device.HTCContext = target;
++ /* set device layer target failure callback */
++ target->Device.TargetFailureCallback = HTCReportFailure;
++ /* set device layer recv message pending callback */
++ target->Device.MessagePendingCallback = HTCRecvMessagePendingHandler;
++ target->EpWaitingForBuffers = ENDPOINT_MAX;
++
++ /* setup device layer */
++ status = DevSetup(&target->Device);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ /* carve up buffers/packets for control messages */
++ for (i = 0; i < NUM_CONTROL_RX_BUFFERS; i++) {
++ HTC_PACKET *pControlPacket;
++ pControlPacket = &target->HTCControlBuffers[i].HtcPacket;
++ SET_HTC_PACKET_INFO_RX_REFILL(pControlPacket,
++ target,
++ target->HTCControlBuffers[i].Buffer,
++ HTC_CONTROL_BUFFER_SIZE,
++ ENDPOINT_0);
++ HTC_FREE_CONTROL_RX(target,pControlPacket);
++ }
++
++ for (;i < NUM_CONTROL_BUFFERS;i++) {
++ HTC_PACKET *pControlPacket;
++ pControlPacket = &target->HTCControlBuffers[i].HtcPacket;
++ INIT_HTC_PACKET_INFO(pControlPacket,
++ target->HTCControlBuffers[i].Buffer,
++ HTC_CONTROL_BUFFER_SIZE);
++ HTC_FREE_CONTROL_TX(target,pControlPacket);
++ }
++
++ } while (FALSE);
++
++ if (A_SUCCESS(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, (" calling AddInstance callback \n"));
++ /* announce ourselves */
++ HTCInitInfo.AddInstance((HTC_HANDLE)target);
++ } else {
++ if (target != NULL) {
++ HTCCleanup(target);
++ }
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("htcTargetInserted - Exit\n"));
++
++ return status;
++}
++
++/* registered removal callback from the HIF layer */
++static A_STATUS HTCTargetRemovedHandler(void *handle, A_STATUS status)
++{
++ HTC_TARGET *target;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+HTCTargetRemovedHandler handle:0x%X \n",(A_UINT32)handle));
++
++ if (NULL == handle) {
++ /* this could be NULL in the event that target initialization failed */
++ return A_OK;
++ }
++
++ target = ((AR6K_DEVICE *)handle)->HTCContext;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, (" removing target:0x%X instance:0x%X ... \n",
++ (A_UINT32)target, (A_UINT32)target->pInstanceContext));
++
++ if (target->pInstanceContext != NULL) {
++ /* let upper layer know, it needs to call HTCStop() */
++ HTCInitInfo.DeleteInstance(target->pInstanceContext);
++ }
++
++ HIFShutDownDevice(target->Device.HIFDevice);
++
++ HTCCleanup(target);
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-HTCTargetRemovedHandler \n"));
++ return A_OK;
++}
++
++/* get the low level HIF device for the caller , the caller may wish to do low level
++ * HIF requests */
++void *HTCGetHifDevice(HTC_HANDLE HTCHandle)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++ return target->Device.HIFDevice;
++}
++
++/* set the instance block for this HTC handle, so that on removal, the blob can be
++ * returned to the caller */
++void HTCSetInstance(HTC_HANDLE HTCHandle, void *Instance)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++
++ target->pInstanceContext = Instance;
++}
++
++/* wait for the target to arrive (sends HTC Ready message)
++ * this operation is fully synchronous and the message is polled for */
++A_STATUS HTCWaitTarget(HTC_HANDLE HTCHandle)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++ A_STATUS status;
++ HTC_PACKET *pPacket = NULL;
++ HTC_READY_MSG *pRdyMsg;
++ HTC_SERVICE_CONNECT_REQ connect;
++ HTC_SERVICE_CONNECT_RESP resp;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCWaitTarget - Enter (target:0x%X) \n", (A_UINT32)target));
++
++ do {
++
++#ifdef MBOXHW_UNIT_TEST
++
++ status = DoMboxHWTest(&target->Device);
++
++ if (status != A_OK) {
++ break;
++ }
++
++#endif
++
++ /* we should be getting 1 control message that the target is ready */
++ status = HTCWaitforControlMessage(target, &pPacket);
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, (" Target Not Available!!\n"));
++ break;
++ }
++
++ /* we controlled the buffer creation so it has to be properly aligned */
++ pRdyMsg = (HTC_READY_MSG *)pPacket->pBuffer;
++
++ if ((pRdyMsg->MessageID != HTC_MSG_READY_ID) ||
++ (pPacket->ActualLength < sizeof(HTC_READY_MSG))) {
++ /* this message is not valid */
++ AR_DEBUG_ASSERT(FALSE);
++ status = A_EPROTO;
++ break;
++ }
++
++ if (pRdyMsg->CreditCount == 0 || pRdyMsg->CreditSize == 0) {
++ /* this message is not valid */
++ AR_DEBUG_ASSERT(FALSE);
++ status = A_EPROTO;
++ break;
++ }
++
++ target->TargetCredits = pRdyMsg->CreditCount;
++ target->TargetCreditSize = pRdyMsg->CreditSize;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, (" Target Ready: credits: %d credit size: %d\n",
++ target->TargetCredits, target->TargetCreditSize));
++
++ /* setup our pseudo HTC control endpoint connection */
++ A_MEMZERO(&connect,sizeof(connect));
++ A_MEMZERO(&resp,sizeof(resp));
++ connect.EpCallbacks.pContext = target;
++ connect.EpCallbacks.EpTxComplete = HTCControlTxComplete;
++ connect.EpCallbacks.EpRecv = HTCControlRecv;
++ connect.EpCallbacks.EpRecvRefill = NULL; /* not needed */
++ connect.EpCallbacks.EpSendFull = NULL; /* not needed */
++ connect.EpCallbacks.EpSendAvail = NULL; /* not needed */
++ connect.MaxSendQueueDepth = NUM_CONTROL_BUFFERS;
++ connect.ServiceID = HTC_CTRL_RSVD_SVC;
++
++ /* connect fake service */
++ status = HTCConnectService((HTC_HANDLE)target,
++ &connect,
++ &resp);
++
++ if (!A_FAILED(status)) {
++ break;
++ }
++
++ } while (FALSE);
++
++ if (pPacket != NULL) {
++ HTC_FREE_CONTROL_RX(target,pPacket);
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCWaitTarget - Exit\n"));
++
++ return status;
++}
++
++
++
++/* Start HTC, enable interrupts and let the target know host has finished setup */
++A_STATUS HTCStart(HTC_HANDLE HTCHandle)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++ HTC_PACKET *pPacket;
++ A_STATUS status;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCStart Enter\n"));
++
++ /* now that we are starting, push control receive buffers into the
++ * HTC control endpoint */
++
++ while (1) {
++ pPacket = HTC_ALLOC_CONTROL_RX(target);
++ if (NULL == pPacket) {
++ break;
++ }
++ HTCAddReceivePkt((HTC_HANDLE)target,pPacket);
++ }
++
++ do {
++
++ AR_DEBUG_ASSERT(target->InitCredits != NULL);
++ AR_DEBUG_ASSERT(target->EpCreditDistributionListHead != NULL);
++ AR_DEBUG_ASSERT(target->EpCreditDistributionListHead->pNext != NULL);
++
++ /* call init credits callback to do the distribution ,
++ * NOTE: the first entry in the distribution list is ENDPOINT_0, so
++ * we pass the start of the list after this one. */
++ target->InitCredits(target->pCredDistContext,
++ target->EpCreditDistributionListHead->pNext,
++ target->TargetCredits);
++
++ if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_TRC)) {
++ DumpCreditDistStates(target);
++ }
++
++ /* the caller is done connecting to services, so we can indicate to the
++ * target that the setup phase is complete */
++ status = HTCSendSetupComplete(target);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ /* unmask interrupts */
++ status = DevUnmaskInterrupts(&target->Device);
++
++ if (A_FAILED(status)) {
++ HTCStop(target);
++ }
++
++ } while (FALSE);
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCStart Exit\n"));
++ return status;
++}
++
++
++/* stop HTC communications, i.e. stop interrupt reception, and flush all queued buffers */
++void HTCStop(HTC_HANDLE HTCHandle)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+HTCStop \n"));
++
++ /* mark that we are shutting down .. */
++ target->HTCStateFlags |= HTC_STATE_STOPPING;
++
++ /* Masking interrupts is a synchronous operation, when this function returns
++ * all pending HIF I/O has completed, we can safely flush the queues */
++ DevMaskInterrupts(&target->Device);
++
++ /* flush all send packets */
++ HTCFlushSendPkts(target);
++ /* flush all recv buffers */
++ HTCFlushRecvBuffers(target);
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-HTCStop \n"));
++}
++
++/* undo what was done in HTCInit() */
++void HTCShutDown(void)
++{
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+HTCShutDown: \n"));
++ HTCInitialized = FALSE;
++ /* undo HTCInit */
++ HIFShutDownDevice(NULL);
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-HTCShutDown: \n"));
++}
++
++void HTCDumpCreditStates(HTC_HANDLE HTCHandle)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++
++ LOCK_HTC_TX(target);
++
++ DumpCreditDistStates(target);
++
++ UNLOCK_HTC_TX(target);
++}
++
++/* report a target failure from the device, this is a callback from the device layer
++ * which uses a mechanism to report errors from the target (i.e. special interrupts) */
++static void HTCReportFailure(void *Context)
++{
++ HTC_TARGET *target = (HTC_TARGET *)Context;
++
++ target->TargetFailure = TRUE;
++
++ if ((target->pInstanceContext != NULL) && (HTCInitInfo.TargetFailure != NULL)) {
++ /* let upper layer know, it needs to call HTCStop() */
++ HTCInitInfo.TargetFailure(target->pInstanceContext, A_ERROR);
++ }
++}
++
++void DebugDumpBytes(A_UCHAR *buffer, A_UINT16 length, char *pDescription)
++{
++ A_CHAR stream[60];
++ A_UINT32 i;
++ A_UINT16 offset, count;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, ("<---------Dumping %d Bytes : %s ------>\n", length, pDescription));
++
++ count = 0;
++ offset = 0;
++ for(i = 0; i < length; i++) {
++ sprintf(stream + offset, "%2.2X ", buffer[i]);
++ count ++;
++ offset += 3;
++
++ if(count == 16) {
++ count = 0;
++ offset = 0;
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, ("[H]: %s\n", stream));
++ A_MEMZERO(stream, 60);
++ }
++ }
++
++ if(offset != 0) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, ("[H]: %s\n", stream));
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, ("<------------------------------------------------->\n"));
++}
++
++A_BOOL HTCGetEndpointStatistics(HTC_HANDLE HTCHandle,
++ HTC_ENDPOINT_ID Endpoint,
++ HTC_ENDPOINT_STAT_ACTION Action,
++ HTC_ENDPOINT_STATS *pStats)
++{
++
++#ifdef HTC_EP_STAT_PROFILING
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++ A_BOOL clearStats = FALSE;
++ A_BOOL sample = FALSE;
++
++ switch (Action) {
++ case HTC_EP_STAT_SAMPLE :
++ sample = TRUE;
++ break;
++ case HTC_EP_STAT_SAMPLE_AND_CLEAR :
++ sample = TRUE;
++ clearStats = TRUE;
++ break;
++ case HTC_EP_STAT_CLEAR :
++ clearStats = TRUE;
++ break;
++ default:
++ break;
++ }
++
++ A_ASSERT(Endpoint < ENDPOINT_MAX);
++
++ /* lock out TX and RX while we sample and/or clear */
++ LOCK_HTC_TX(target);
++ LOCK_HTC_RX(target);
++
++ if (sample) {
++ A_ASSERT(pStats != NULL);
++ /* return the stats to the caller */
++ A_MEMCPY(pStats, &target->EndPoint[Endpoint].EndPointStats, sizeof(HTC_ENDPOINT_STATS));
++ }
++
++ if (clearStats) {
++ /* reset stats */
++ A_MEMZERO(&target->EndPoint[Endpoint].EndPointStats, sizeof(HTC_ENDPOINT_STATS));
++ }
++
++ UNLOCK_HTC_RX(target);
++ UNLOCK_HTC_TX(target);
++
++ return TRUE;
++#else
++ return FALSE;
++#endif
++}
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/htc/htc_debug.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/htc/htc_debug.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/htc/htc_debug.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/htc/htc_debug.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,65 @@
++#ifndef HTC_DEBUG_H_
++#define HTC_DEBUG_H_
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++/* ------- Debug related stuff ------- */
++enum {
++ ATH_DEBUG_SEND = 0x0001,
++ ATH_DEBUG_RECV = 0x0002,
++ ATH_DEBUG_SYNC = 0x0004,
++ ATH_DEBUG_DUMP = 0x0008,
++ ATH_DEBUG_IRQ = 0x0010,
++ ATH_DEBUG_TRC = 0x0020,
++ ATH_DEBUG_WARN = 0x0040,
++ ATH_DEBUG_ERR = 0x0080,
++ ATH_DEBUG_ANY = 0xFFFF,
++};
++
++#ifdef DEBUG
++
++// TODO FIX usage of A_PRINTF!
++#define AR_DEBUG_LVL_CHECK(lvl) (debughtc & (lvl))
++#define AR_DEBUG_PRINTBUF(buffer, length, desc) do { \
++ if (debughtc & ATH_DEBUG_DUMP) { \
++ DebugDumpBytes(buffer, length,desc); \
++ } \
++} while(0)
++#define PRINTX_ARG(arg...) arg
++#define AR_DEBUG_PRINTF(flags, args) do { \
++ if (debughtc & (flags)) { \
++ A_PRINTF(KERN_ALERT PRINTX_ARG args); \
++ } \
++} while (0)
++#define AR_DEBUG_ASSERT(test) do { \
++ if (!(test)) { \
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Debug Assert Caught, File %s, Line: %d, Test:%s \n",__FILE__, __LINE__,#test)); \
++ } \
++} while(0)
++extern int debughtc;
++#else
++#define AR_DEBUG_PRINTF(flags, args)
++#define AR_DEBUG_PRINTBUF(buffer, length, desc)
++#define AR_DEBUG_ASSERT(test)
++#define AR_DEBUG_LVL_CHECK(lvl) 0
++#endif
++
++void DebugDumpBytes(A_UCHAR *buffer, A_UINT16 length, char *pDescription);
++
++#endif /*HTC_DEBUG_H_*/
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/htc/htc_internal.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/htc/htc_internal.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/htc/htc_internal.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/htc/htc_internal.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,168 @@
++/*
++ *
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef _HTC_INTERNAL_H_
++#define _HTC_INTERNAL_H_
++
++/* for debugging, uncomment this to capture the last frame header, on frame header
++ * processing errors, the last frame header is dump for comparison */
++//#define HTC_CAPTURE_LAST_FRAME
++
++//#define HTC_EP_STAT_PROFILING
++
++#ifdef __cplusplus
++extern "C" {
++#endif /* __cplusplus */
++
++/* Header files */
++#include "a_config.h"
++#include "athdefs.h"
++#include "a_types.h"
++#include "a_osapi.h"
++#include "a_debug.h"
++#include "htc.h"
++#include "htc_api.h"
++#include "bmi_msg.h"
++#include "hif.h"
++#include "ar6k.h"
++
++/* HTC operational parameters */
++#define HTC_TARGET_RESPONSE_TIMEOUT 2000 /* in ms */
++#define HTC_TARGET_DEBUG_INTR_MASK 0x01
++#define HTC_TARGET_CREDIT_INTR_MASK 0xF0
++
++typedef struct _HTC_ENDPOINT {
++ HTC_SERVICE_ID ServiceID; /* service ID this endpoint is bound to
++ non-zero value means this endpoint is in use */
++ HTC_PACKET_QUEUE TxQueue; /* HTC frame buffer TX queue */
++ HTC_PACKET_QUEUE RxBuffers; /* HTC frame buffer RX list */
++ HTC_ENDPOINT_CREDIT_DIST CreditDist; /* credit distribution structure (exposed to driver layer) */
++ HTC_EP_CALLBACKS EpCallBacks; /* callbacks associated with this endpoint */
++ int MaxTxQueueDepth; /* max depth of the TX queue before we need to
++ call driver's full handler */
++ int CurrentTxQueueDepth; /* current TX queue depth */
++ int MaxMsgLength; /* max length of endpoint message */
++#ifdef HTC_EP_STAT_PROFILING
++ HTC_ENDPOINT_STATS EndPointStats; /* endpoint statistics */
++#endif
++} HTC_ENDPOINT;
++
++#ifdef HTC_EP_STAT_PROFILING
++#define INC_HTC_EP_STAT(p,stat,count) (p)->EndPointStats.stat += (count);
++#else
++#define INC_HTC_EP_STAT(p,stat,count)
++#endif
++
++#define HTC_SERVICE_TX_PACKET_TAG HTC_TX_PACKET_TAG_INTERNAL
++
++#define NUM_CONTROL_BUFFERS 8
++#define NUM_CONTROL_TX_BUFFERS 2
++#define NUM_CONTROL_RX_BUFFERS (NUM_CONTROL_BUFFERS - NUM_CONTROL_TX_BUFFERS)
++
++#define HTC_CONTROL_BUFFER_SIZE (HTC_MAX_CONTROL_MESSAGE_LENGTH + HTC_HDR_LENGTH)
++
++typedef struct HTC_CONTROL_BUFFER {
++ HTC_PACKET HtcPacket;
++ A_UINT8 Buffer[HTC_CONTROL_BUFFER_SIZE];
++} HTC_CONTROL_BUFFER;
++
++/* our HTC target state */
++typedef struct _HTC_TARGET {
++ HTC_ENDPOINT EndPoint[ENDPOINT_MAX];
++ HTC_CONTROL_BUFFER HTCControlBuffers[NUM_CONTROL_BUFFERS];
++ HTC_ENDPOINT_CREDIT_DIST *EpCreditDistributionListHead;
++ HTC_PACKET_QUEUE ControlBufferTXFreeList;
++ HTC_PACKET_QUEUE ControlBufferRXFreeList;
++ HTC_CREDIT_DIST_CALLBACK DistributeCredits;
++ HTC_CREDIT_INIT_CALLBACK InitCredits;
++ void *pCredDistContext;
++ int TargetCredits;
++ int TargetCreditSize;
++ A_MUTEX_T HTCLock;
++ A_MUTEX_T HTCRxLock;
++ A_MUTEX_T HTCTxLock;
++ AR6K_DEVICE Device; /* AR6K - specific state */
++ A_UINT32 HTCStateFlags;
++ HTC_ENDPOINT_ID EpWaitingForBuffers;
++ A_BOOL TargetFailure;
++ void *pInstanceContext;
++#define HTC_STATE_WAIT_BUFFERS (1 << 0)
++#define HTC_STATE_STOPPING (1 << 1)
++#ifdef HTC_CAPTURE_LAST_FRAME
++ HTC_FRAME_HDR LastFrameHdr; /* useful for debugging */
++ A_UINT8 LastTrailer[256];
++ A_UINT8 LastTrailerLength;
++#endif
++} HTC_TARGET;
++
++#define HTC_STOPPING(t) ((t)->HTCStateFlags & HTC_STATE_STOPPING)
++#define LOCK_HTC(t) A_MUTEX_LOCK(&(t)->HTCLock);
++#define UNLOCK_HTC(t) A_MUTEX_UNLOCK(&(t)->HTCLock);
++#define LOCK_HTC_RX(t) A_MUTEX_LOCK(&(t)->HTCRxLock);
++#define UNLOCK_HTC_RX(t) A_MUTEX_UNLOCK(&(t)->HTCRxLock);
++#define LOCK_HTC_TX(t) A_MUTEX_LOCK(&(t)->HTCTxLock);
++#define UNLOCK_HTC_TX(t) A_MUTEX_UNLOCK(&(t)->HTCTxLock);
++
++#define GET_HTC_TARGET_FROM_HANDLE(hnd) ((HTC_TARGET *)(hnd))
++#define HTC_RECYCLE_RX_PKT(target,p) \
++{ \
++ HTC_PACKET_RESET_RX(pPacket); \
++ HTCAddReceivePkt((HTC_HANDLE)(target),(p)); \
++}
++
++/* internal HTC functions */
++void HTCControlTxComplete(void *Context, HTC_PACKET *pPacket);
++void HTCControlRecv(void *Context, HTC_PACKET *pPacket);
++A_STATUS HTCWaitforControlMessage(HTC_TARGET *target, HTC_PACKET **ppControlPacket);
++HTC_PACKET *HTCAllocControlBuffer(HTC_TARGET *target, HTC_PACKET_QUEUE *pList);
++void HTCFreeControlBuffer(HTC_TARGET *target, HTC_PACKET *pPacket, HTC_PACKET_QUEUE *pList);
++A_STATUS HTCIssueSend(HTC_TARGET *target, HTC_PACKET *pPacket, A_UINT8 Flags);
++A_STATUS HTCIssueRecv(HTC_TARGET *target, HTC_PACKET *pPacket);
++void HTCRecvCompleteHandler(void *Context, HTC_PACKET *pPacket);
++A_STATUS HTCRecvMessagePendingHandler(void *Context, A_UINT32 LookAhead, A_BOOL *pAsyncProc);
++void HTCProcessCreditRpt(HTC_TARGET *target, HTC_CREDIT_REPORT *pRpt, int NumEntries, HTC_ENDPOINT_ID FromEndpoint);
++A_STATUS HTCSendSetupComplete(HTC_TARGET *target);
++void HTCFlushRecvBuffers(HTC_TARGET *target);
++void HTCFlushSendPkts(HTC_TARGET *target);
++void DumpCreditDist(HTC_ENDPOINT_CREDIT_DIST *pEPDist);
++void DumpCreditDistStates(HTC_TARGET *target);
++void DebugDumpBytes(A_UCHAR *buffer, A_UINT16 length, char *pDescription);
++
++static INLINE HTC_PACKET *HTC_ALLOC_CONTROL_TX(HTC_TARGET *target) {
++ HTC_PACKET *pPacket = HTCAllocControlBuffer(target,&target->ControlBufferTXFreeList);
++ if (pPacket != NULL) {
++ /* set payload pointer area with some headroom */
++ pPacket->pBuffer = pPacket->pBufferStart + HTC_HDR_LENGTH;
++ }
++ return pPacket;
++}
++
++#define HTC_FREE_CONTROL_TX(t,p) HTCFreeControlBuffer((t),(p),&(t)->ControlBufferTXFreeList)
++#define HTC_ALLOC_CONTROL_RX(t) HTCAllocControlBuffer((t),&(t)->ControlBufferRXFreeList)
++#define HTC_FREE_CONTROL_RX(t,p) \
++{ \
++ HTC_PACKET_RESET_RX(p); \
++ HTCFreeControlBuffer((t),(p),&(t)->ControlBufferRXFreeList); \
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _HTC_INTERNAL_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/htc/htc_recv.c linux-2.6.29-rc3.owrt.om/drivers/ar6000/htc/htc_recv.c
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/htc/htc_recv.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/htc/htc_recv.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,703 @@
++/*
++ *
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "htc_internal.h"
++
++#define HTCIssueRecv(t, p) \
++ DevRecvPacket(&(t)->Device, \
++ (p), \
++ (p)->ActualLength)
++
++#define DO_RCV_COMPLETION(t,p,e) \
++{ \
++ if ((p)->ActualLength > 0) { \
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV, (" completing packet 0x%X (%d bytes) on ep : %d \n", \
++ (A_UINT32)(p), (p)->ActualLength, (p)->Endpoint)); \
++ (e)->EpCallBacks.EpRecv((e)->EpCallBacks.pContext, \
++ (p)); \
++ } else { \
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV, (" recycling empty packet \n")); \
++ HTC_RECYCLE_RX_PKT((t), (p)); \
++ } \
++}
++
++#ifdef HTC_EP_STAT_PROFILING
++#define HTC_RX_STAT_PROFILE(t,ep,lookAhead) \
++{ \
++ LOCK_HTC_RX((t)); \
++ INC_HTC_EP_STAT((ep), RxReceived, 1); \
++ if ((lookAhead) != 0) { \
++ INC_HTC_EP_STAT((ep), RxLookAheads, 1); \
++ } \
++ UNLOCK_HTC_RX((t)); \
++}
++#else
++#define HTC_RX_STAT_PROFILE(t,ep,lookAhead)
++#endif
++
++static INLINE A_STATUS HTCProcessTrailer(HTC_TARGET *target,
++ A_UINT8 *pBuffer,
++ int Length,
++ A_UINT32 *pNextLookAhead,
++ HTC_ENDPOINT_ID FromEndpoint)
++{
++ HTC_RECORD_HDR *pRecord;
++ A_UINT8 *pRecordBuf;
++ HTC_LOOKAHEAD_REPORT *pLookAhead;
++ A_UINT8 *pOrigBuffer;
++ int origLength;
++ A_STATUS status;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("+HTCProcessTrailer (length:%d) \n", Length));
++
++ if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_RECV)) {
++ AR_DEBUG_PRINTBUF(pBuffer,Length,"Recv Trailer");
++ }
++
++ pOrigBuffer = pBuffer;
++ origLength = Length;
++ status = A_OK;
++
++ while (Length > 0) {
++
++ if (Length < sizeof(HTC_RECORD_HDR)) {
++ status = A_EPROTO;
++ break;
++ }
++ /* these are byte aligned structs */
++ pRecord = (HTC_RECORD_HDR *)pBuffer;
++ Length -= sizeof(HTC_RECORD_HDR);
++ pBuffer += sizeof(HTC_RECORD_HDR);
++
++ if (pRecord->Length > Length) {
++ /* no room left in buffer for record */
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ (" invalid record length: %d (id:%d) buffer has: %d bytes left \n",
++ pRecord->Length, pRecord->RecordID, Length));
++ status = A_EPROTO;
++ break;
++ }
++ /* start of record follows the header */
++ pRecordBuf = pBuffer;
++
++ switch (pRecord->RecordID) {
++ case HTC_RECORD_CREDITS:
++ AR_DEBUG_ASSERT(pRecord->Length >= sizeof(HTC_CREDIT_REPORT));
++ HTCProcessCreditRpt(target,
++ (HTC_CREDIT_REPORT *)pRecordBuf,
++ pRecord->Length / (sizeof(HTC_CREDIT_REPORT)),
++ FromEndpoint);
++ break;
++ case HTC_RECORD_LOOKAHEAD:
++ AR_DEBUG_ASSERT(pRecord->Length >= sizeof(HTC_LOOKAHEAD_REPORT));
++ pLookAhead = (HTC_LOOKAHEAD_REPORT *)pRecordBuf;
++ if ((pLookAhead->PreValid == ((~pLookAhead->PostValid) & 0xFF)) &&
++ (pNextLookAhead != NULL)) {
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,
++ (" LookAhead Report Found (pre valid:0x%X, post valid:0x%X) \n",
++ pLookAhead->PreValid,
++ pLookAhead->PostValid));
++
++ /* look ahead bytes are valid, copy them over */
++ ((A_UINT8 *)pNextLookAhead)[0] = pLookAhead->LookAhead[0];
++ ((A_UINT8 *)pNextLookAhead)[1] = pLookAhead->LookAhead[1];
++ ((A_UINT8 *)pNextLookAhead)[2] = pLookAhead->LookAhead[2];
++ ((A_UINT8 *)pNextLookAhead)[3] = pLookAhead->LookAhead[3];
++
++ if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_RECV)) {
++ DebugDumpBytes((A_UINT8 *)pNextLookAhead,4,"Next Look Ahead");
++ }
++ }
++ break;
++ default:
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, (" unhandled record: id:%d length:%d \n",
++ pRecord->RecordID, pRecord->Length));
++ break;
++ }
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ /* advance buffer past this record for next time around */
++ pBuffer += pRecord->Length;
++ Length -= pRecord->Length;
++ }
++
++ if (A_FAILED(status)) {
++ DebugDumpBytes(pOrigBuffer,origLength,"BAD Recv Trailer");
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("-HTCProcessTrailer \n"));
++ return status;
++
++}
++
++/* process a received message (i.e. strip off header, process any trailer data)
++ * note : locks must be released when this function is called */
++static A_STATUS HTCProcessRecvHeader(HTC_TARGET *target, HTC_PACKET *pPacket, A_UINT32 *pNextLookAhead)
++{
++ A_UINT8 temp;
++ A_UINT8 *pBuf;
++ A_STATUS status = A_OK;
++ A_UINT16 payloadLen;
++ A_UINT32 lookAhead;
++
++ pBuf = pPacket->pBuffer;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("+HTCProcessRecvHeader \n"));
++
++ if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_RECV)) {
++ AR_DEBUG_PRINTBUF(pBuf,pPacket->ActualLength,"HTC Recv PKT");
++ }
++
++ do {
++ /* note, we cannot assume the alignment of pBuffer, so we use the safe macros to
++ * retrieve 16 bit fields */
++ payloadLen = A_GET_UINT16_FIELD(pBuf, HTC_FRAME_HDR, PayloadLen);
++
++ ((A_UINT8 *)&lookAhead)[0] = pBuf[0];
++ ((A_UINT8 *)&lookAhead)[1] = pBuf[1];
++ ((A_UINT8 *)&lookAhead)[2] = pBuf[2];
++ ((A_UINT8 *)&lookAhead)[3] = pBuf[3];
++
++ if (lookAhead != pPacket->HTCReserved) {
++ /* somehow the lookahead that gave us the full read length did not
++ * reflect the actual header in the pending message */
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("HTCProcessRecvHeader, lookahead mismatch! \n"));
++ DebugDumpBytes((A_UINT8 *)&pPacket->HTCReserved,4,"Expected Message LookAhead");
++ DebugDumpBytes(pBuf,sizeof(HTC_FRAME_HDR),"Current Frame Header");
++#ifdef HTC_CAPTURE_LAST_FRAME
++ DebugDumpBytes((A_UINT8 *)&target->LastFrameHdr,sizeof(HTC_FRAME_HDR),"Last Frame Header");
++ if (target->LastTrailerLength != 0) {
++ DebugDumpBytes(target->LastTrailer,
++ target->LastTrailerLength,
++ "Last trailer");
++ }
++#endif
++ status = A_EPROTO;
++ break;
++ }
++
++ /* get flags */
++ temp = A_GET_UINT8_FIELD(pBuf, HTC_FRAME_HDR, Flags);
++
++ if (temp & HTC_FLAGS_RECV_TRAILER) {
++ /* this packet has a trailer */
++
++ /* extract the trailer length in control byte 0 */
++ temp = A_GET_UINT8_FIELD(pBuf, HTC_FRAME_HDR, ControlBytes[0]);
++
++ if ((temp < sizeof(HTC_RECORD_HDR)) || (temp > payloadLen)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("HTCProcessRecvHeader, invalid header (payloadlength should be :%d, CB[0] is:%d) \n",
++ payloadLen, temp));
++ status = A_EPROTO;
++ break;
++ }
++
++ /* process trailer data that follows HDR + application payload */
++ status = HTCProcessTrailer(target,
++ (pBuf + HTC_HDR_LENGTH + payloadLen - temp),
++ temp,
++ pNextLookAhead,
++ pPacket->Endpoint);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++#ifdef HTC_CAPTURE_LAST_FRAME
++ A_MEMCPY(target->LastTrailer, (pBuf + HTC_HDR_LENGTH + payloadLen - temp), temp);
++ target->LastTrailerLength = temp;
++#endif
++ /* trim length by trailer bytes */
++ pPacket->ActualLength -= temp;
++ }
++#ifdef HTC_CAPTURE_LAST_FRAME
++ else {
++ target->LastTrailerLength = 0;
++ }
++#endif
++
++ /* if we get to this point, the packet is good */
++ /* remove header and adjust length */
++ pPacket->pBuffer += HTC_HDR_LENGTH;
++ pPacket->ActualLength -= HTC_HDR_LENGTH;
++
++ } while (FALSE);
++
++ if (A_FAILED(status)) {
++ /* dump the whole packet */
++ DebugDumpBytes(pBuf,pPacket->ActualLength,"BAD HTC Recv PKT");
++ } else {
++#ifdef HTC_CAPTURE_LAST_FRAME
++ A_MEMCPY(&target->LastFrameHdr,pBuf,sizeof(HTC_FRAME_HDR));
++#endif
++ if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_RECV)) {
++ if (pPacket->ActualLength > 0) {
++ AR_DEBUG_PRINTBUF(pPacket->pBuffer,pPacket->ActualLength,"HTC - Application Msg");
++ }
++ }
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("-HTCProcessRecvHeader \n"));
++ return status;
++}
++
++/* asynchronous completion handler for recv packet fetching, when the device layer
++ * completes a read request, it will call this completion handler */
++void HTCRecvCompleteHandler(void *Context, HTC_PACKET *pPacket)
++{
++ HTC_TARGET *target = (HTC_TARGET *)Context;
++ HTC_ENDPOINT *pEndpoint;
++ A_UINT32 nextLookAhead = 0;
++ A_STATUS status;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("+HTCRecvCompleteHandler (status:%d, ep:%d) \n",
++ pPacket->Status, pPacket->Endpoint));
++
++ AR_DEBUG_ASSERT(pPacket->Endpoint < ENDPOINT_MAX);
++ pEndpoint = &target->EndPoint[pPacket->Endpoint];
++ pPacket->Completion = NULL;
++
++ /* get completion status */
++ status = pPacket->Status;
++
++ do {
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("HTCRecvCompleteHandler: request failed (status:%d, ep:%d) \n",
++ pPacket->Status, pPacket->Endpoint));
++ break;
++ }
++ /* process the header for any trailer data */
++ status = HTCProcessRecvHeader(target,pPacket,&nextLookAhead);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++ /* was there a lookahead for the next packet? */
++ if (nextLookAhead != 0) {
++ A_STATUS nextStatus;
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,
++ ("HTCRecvCompleteHandler - next look ahead was non-zero : 0x%X \n",
++ nextLookAhead));
++ /* we have another packet, get the next packet fetch started (pipelined) before
++ * we call into the endpoint's callback, this will start another async request */
++ nextStatus = HTCRecvMessagePendingHandler(target,nextLookAhead,NULL);
++ if (A_EPROTO == nextStatus) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("Next look ahead from recv header was INVALID\n"));
++ DebugDumpBytes((A_UINT8 *)&nextLookAhead,
++ 4,
++ "BAD lookahead from lookahead report");
++ }
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,
++ ("HTCRecvCompleteHandler - rechecking for more messages...\n"));
++ /* if we did not get anything on the look-ahead,
++ * call device layer to asynchronously re-check for messages. If we can keep the async
++ * processing going we get better performance. If there is a pending message we will keep processing
++ * messages asynchronously which should pipeline things nicely */
++ DevCheckPendingRecvMsgsAsync(&target->Device);
++ }
++
++ HTC_RX_STAT_PROFILE(target,pEndpoint,nextLookAhead);
++ DO_RCV_COMPLETION(target,pPacket,pEndpoint);
++
++ } while (FALSE);
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("HTCRecvCompleteHandler , message fetch failed (status = %d) \n",
++ status));
++ /* recyle this packet */
++ HTC_RECYCLE_RX_PKT(target, pPacket);
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("-HTCRecvCompleteHandler\n"));
++}
++
++/* synchronously wait for a control message from the target,
++ * This function is used at initialization time ONLY. At init messages
++ * on ENDPOINT 0 are expected. */
++A_STATUS HTCWaitforControlMessage(HTC_TARGET *target, HTC_PACKET **ppControlPacket)
++{
++ A_STATUS status;
++ A_UINT32 lookAhead;
++ HTC_PACKET *pPacket = NULL;
++ HTC_FRAME_HDR *pHdr;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("+HTCWaitforControlMessage \n"));
++
++ do {
++
++ *ppControlPacket = NULL;
++
++ /* call the polling function to see if we have a message */
++ status = DevPollMboxMsgRecv(&target->Device,
++ &lookAhead,
++ HTC_TARGET_RESPONSE_TIMEOUT);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,
++ ("HTCWaitforControlMessage : lookAhead : 0x%X \n", lookAhead));
++
++ /* check the lookahead */
++ pHdr = (HTC_FRAME_HDR *)&lookAhead;
++
++ if (pHdr->EndpointID != ENDPOINT_0) {
++ /* unexpected endpoint number, should be zero */
++ AR_DEBUG_ASSERT(FALSE);
++ status = A_EPROTO;
++ break;
++ }
++
++ if (A_FAILED(status)) {
++ /* bad message */
++ AR_DEBUG_ASSERT(FALSE);
++ status = A_EPROTO;
++ break;
++ }
++
++ pPacket = HTC_ALLOC_CONTROL_RX(target);
++
++ if (pPacket == NULL) {
++ AR_DEBUG_ASSERT(FALSE);
++ status = A_NO_MEMORY;
++ break;
++ }
++
++ pPacket->HTCReserved = lookAhead;
++ pPacket->ActualLength = pHdr->PayloadLen + HTC_HDR_LENGTH;
++
++ if (pPacket->ActualLength > pPacket->BufferLength) {
++ AR_DEBUG_ASSERT(FALSE);
++ status = A_EPROTO;
++ break;
++ }
++
++ /* we want synchronous operation */
++ pPacket->Completion = NULL;
++
++ /* get the message from the device, this will block */
++ status = HTCIssueRecv(target, pPacket);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ /* process receive header */
++ status = HTCProcessRecvHeader(target,pPacket,NULL);
++
++ pPacket->Status = status;
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("HTCWaitforControlMessage, HTCProcessRecvHeader failed (status = %d) \n",
++ status));
++ break;
++ }
++
++ /* give the caller this control message packet, they are responsible to free */
++ *ppControlPacket = pPacket;
++
++ } while (FALSE);
++
++ if (A_FAILED(status)) {
++ if (pPacket != NULL) {
++ /* cleanup buffer on error */
++ HTC_FREE_CONTROL_RX(target,pPacket);
++ }
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("-HTCWaitforControlMessage \n"));
++
++ return status;
++}
++
++/* callback when device layer or lookahead report parsing detects a pending message */
++A_STATUS HTCRecvMessagePendingHandler(void *Context, A_UINT32 LookAhead, A_BOOL *pAsyncProc)
++{
++ HTC_TARGET *target = (HTC_TARGET *)Context;
++ A_STATUS status = A_OK;
++ HTC_PACKET *pPacket = NULL;
++ HTC_FRAME_HDR *pHdr;
++ HTC_ENDPOINT *pEndpoint;
++ A_BOOL asyncProc = FALSE;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("+HTCRecvMessagePendingHandler LookAhead:0x%X \n",LookAhead));
++
++ if (IS_DEV_IRQ_PROCESSING_ASYNC_ALLOWED(&target->Device)) {
++ /* We use async mode to get the packets if the device layer supports it.
++ * The device layer interfaces with HIF in which HIF may have restrictions on
++ * how interrupts are processed */
++ asyncProc = TRUE;
++ }
++
++ if (pAsyncProc != NULL) {
++ /* indicate to caller how we decided to process this */
++ *pAsyncProc = asyncProc;
++ }
++
++ while (TRUE) {
++
++ pHdr = (HTC_FRAME_HDR *)&LookAhead;
++
++ if (pHdr->EndpointID >= ENDPOINT_MAX) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Invalid Endpoint in look-ahead: %d \n",pHdr->EndpointID));
++ /* invalid endpoint */
++ status = A_EPROTO;
++ break;
++ }
++
++ if (pHdr->PayloadLen > HTC_MAX_PAYLOAD_LENGTH) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Payload length %d exceeds max HTC : %d !\n",
++ pHdr->PayloadLen, HTC_MAX_PAYLOAD_LENGTH));
++ status = A_EPROTO;
++ break;
++ }
++
++ pEndpoint = &target->EndPoint[pHdr->EndpointID];
++
++ if (0 == pEndpoint->ServiceID) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Endpoint %d is not connected !\n",pHdr->EndpointID));
++ /* endpoint isn't even connected */
++ status = A_EPROTO;
++ break;
++ }
++
++ /* lock RX to get a buffer */
++ LOCK_HTC_RX(target);
++
++ /* get a packet from the endpoint recv queue */
++ pPacket = HTC_PACKET_DEQUEUE(&pEndpoint->RxBuffers);
++
++ if (NULL == pPacket) {
++ /* check for refill handler */
++ if (pEndpoint->EpCallBacks.EpRecvRefill != NULL) {
++ UNLOCK_HTC_RX(target);
++ /* call the re-fill handler */
++ pEndpoint->EpCallBacks.EpRecvRefill(pEndpoint->EpCallBacks.pContext,
++ pHdr->EndpointID);
++ LOCK_HTC_RX(target);
++ /* check if we have more buffers */
++ pPacket = HTC_PACKET_DEQUEUE(&pEndpoint->RxBuffers);
++ /* fall through */
++ }
++ }
++
++ if (NULL == pPacket) {
++ /* this is not an error, we simply need to mark that we are waiting for buffers.*/
++ target->HTCStateFlags |= HTC_STATE_WAIT_BUFFERS;
++ target->EpWaitingForBuffers = pHdr->EndpointID;
++ status = A_NO_MEMORY;
++ }
++
++ UNLOCK_HTC_RX(target);
++
++ if (A_FAILED(status)) {
++ /* no buffers */
++ break;
++ }
++
++ AR_DEBUG_ASSERT(pPacket->Endpoint == pHdr->EndpointID);
++
++ /* make sure this message can fit in the endpoint buffer */
++ if ((pHdr->PayloadLen + HTC_HDR_LENGTH) > pPacket->BufferLength) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("Payload Length Error : header reports payload of: %d, endpoint buffer size: %d \n",
++ pHdr->PayloadLen, pPacket->BufferLength));
++ status = A_EPROTO;
++ break;
++ }
++
++ pPacket->HTCReserved = LookAhead; /* set expected look ahead */
++ /* set the amount of data to fetch */
++ pPacket->ActualLength = pHdr->PayloadLen + HTC_HDR_LENGTH;
++
++ if (asyncProc) {
++ /* we use async mode to get the packet if the device layer supports it
++ * set our callback and context */
++ pPacket->Completion = HTCRecvCompleteHandler;
++ pPacket->pContext = target;
++ } else {
++ /* fully synchronous */
++ pPacket->Completion = NULL;
++ }
++
++ /* go fetch the packet */
++ status = HTCIssueRecv(target, pPacket);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ if (asyncProc) {
++ /* we did this asynchronously so we can get out of the loop, the asynch processing
++ * creates a chain of requests to continue processing pending messages in the
++ * context of callbacks */
++ break;
++ }
++
++ /* in the sync case, we process the packet, check lookaheads and then repeat */
++
++ LookAhead = 0;
++ status = HTCProcessRecvHeader(target,pPacket,&LookAhead);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ HTC_RX_STAT_PROFILE(target,pEndpoint,LookAhead);
++ DO_RCV_COMPLETION(target,pPacket,pEndpoint);
++
++ pPacket = NULL;
++
++ if (0 == LookAhead) {
++ break;
++ }
++
++ }
++
++ if (A_NO_MEMORY == status) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ (" Endpoint :%d has no buffers, blocking receiver to prevent overrun.. \n",
++ pHdr->EndpointID));
++ /* try to stop receive at the device layer */
++ DevStopRecv(&target->Device, asyncProc ? DEV_STOP_RECV_ASYNC : DEV_STOP_RECV_SYNC);
++ status = A_OK;
++ } else if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("Failed to get pending message : LookAhead Value: 0x%X (status = %d) \n",
++ LookAhead, status));
++ if (pPacket != NULL) {
++ /* clean up packet on error */
++ HTC_RECYCLE_RX_PKT(target, pPacket);
++ }
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("-HTCRecvMessagePendingHandler \n"));
++
++ return status;
++}
++
++/* Makes a buffer available to the HTC module */
++A_STATUS HTCAddReceivePkt(HTC_HANDLE HTCHandle, HTC_PACKET *pPacket)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++ HTC_ENDPOINT *pEndpoint;
++ A_BOOL unblockRecv = FALSE;
++ A_STATUS status = A_OK;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND,
++ ("+- HTCAddReceivePkt: endPointId: %d, buffer: 0x%X, length: %d\n",
++ pPacket->Endpoint, (A_UINT32)pPacket->pBuffer, pPacket->BufferLength));
++
++ do {
++
++ if (HTC_STOPPING(target)) {
++ status = A_ECANCELED;
++ break;
++ }
++
++ AR_DEBUG_ASSERT(pPacket->Endpoint < ENDPOINT_MAX);
++
++ pEndpoint = &target->EndPoint[pPacket->Endpoint];
++
++ LOCK_HTC_RX(target);
++
++ /* store receive packet */
++ HTC_PACKET_ENQUEUE(&pEndpoint->RxBuffers, pPacket);
++
++ /* check if we are blocked waiting for a new buffer */
++ if (target->HTCStateFlags & HTC_STATE_WAIT_BUFFERS) {
++ if (target->EpWaitingForBuffers == pPacket->Endpoint) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,(" receiver was blocked on ep:%d, unblocking.. \n",
++ target->EpWaitingForBuffers));
++ target->HTCStateFlags &= ~HTC_STATE_WAIT_BUFFERS;
++ target->EpWaitingForBuffers = ENDPOINT_MAX;
++ unblockRecv = TRUE;
++ }
++ }
++
++ UNLOCK_HTC_RX(target);
++
++ if (unblockRecv && !HTC_STOPPING(target)) {
++ /* TODO : implement a buffer threshold count? */
++ DevEnableRecv(&target->Device,DEV_ENABLE_RECV_SYNC);
++ }
++
++ } while (FALSE);
++
++ return status;
++}
++
++static void HTCFlushEndpointRX(HTC_TARGET *target, HTC_ENDPOINT *pEndpoint)
++{
++ HTC_PACKET *pPacket;
++
++ LOCK_HTC_RX(target);
++
++ while (1) {
++ pPacket = HTC_PACKET_DEQUEUE(&pEndpoint->RxBuffers);
++ if (NULL == pPacket) {
++ break;
++ }
++ UNLOCK_HTC_RX(target);
++ pPacket->Status = A_ECANCELED;
++ pPacket->ActualLength = 0;
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV, (" Flushing RX packet:0x%X, length:%d, ep:%d \n",
++ (A_UINT32)pPacket, pPacket->BufferLength, pPacket->Endpoint));
++ /* give the packet back */
++ pEndpoint->EpCallBacks.EpRecv(pEndpoint->EpCallBacks.pContext,
++ pPacket);
++ LOCK_HTC_RX(target);
++ }
++
++ UNLOCK_HTC_RX(target);
++
++
++}
++
++void HTCFlushRecvBuffers(HTC_TARGET *target)
++{
++ HTC_ENDPOINT *pEndpoint;
++ int i;
++
++ /* NOTE: no need to flush endpoint 0, these buffers were
++ * allocated as part of the HTC struct */
++ for (i = ENDPOINT_1; i < ENDPOINT_MAX; i++) {
++ pEndpoint = &target->EndPoint[i];
++ if (pEndpoint->ServiceID == 0) {
++ /* not in use.. */
++ continue;
++ }
++ HTCFlushEndpointRX(target,pEndpoint);
++ }
++
++
++}
++
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/htc/htc_send.c linux-2.6.29-rc3.owrt.om/drivers/ar6000/htc/htc_send.c
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/htc/htc_send.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/htc/htc_send.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,538 @@
++/*
++ *
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "htc_internal.h"
++
++#define DO_EP_TX_COMPLETION(ep,p) \
++{ \
++ (p)->Completion = NULL; \
++ (ep)->EpCallBacks.EpTxComplete((ep)->EpCallBacks.pContext,(p)); \
++}
++
++
++/* call the distribute credits callback with the distribution */
++#define DO_DISTRIBUTION(t,reason,description,pList) \
++{ \
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND, \
++ (" calling distribute function (%s) (dfn:0x%X, ctxt:0x%X, dist:0x%X) \n", \
++ (description), \
++ (A_UINT32)(t)->DistributeCredits, \
++ (A_UINT32)(t)->pCredDistContext, \
++ (A_UINT32)pList)); \
++ (t)->DistributeCredits((t)->pCredDistContext, \
++ (pList), \
++ (reason)); \
++}
++
++/* our internal send packet completion handler when packets are submited to the AR6K device
++ * layer */
++static void HTCSendPktCompletionHandler(void *Context, HTC_PACKET *pPacket)
++{
++ HTC_TARGET *target = (HTC_TARGET *)Context;
++ HTC_ENDPOINT *pEndpoint = &target->EndPoint[pPacket->Endpoint];
++
++
++ if (A_FAILED(pPacket->Status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("HTCSendPktCompletionHandler: request failed (status:%d, ep:%d) \n",
++ pPacket->Status, pPacket->Endpoint));
++ }
++ /* first, fixup the head room we allocated */
++ pPacket->pBuffer += HTC_HDR_LENGTH;
++ /* do completion */
++ DO_EP_TX_COMPLETION(pEndpoint,pPacket);
++}
++
++A_STATUS HTCIssueSend(HTC_TARGET *target, HTC_PACKET *pPacket, A_UINT8 SendFlags)
++{
++ A_STATUS status;
++ A_UINT8 *pHdrBuf;
++ A_BOOL sync = FALSE;
++
++ /* caller always provides headrooom */
++ pPacket->pBuffer -= HTC_HDR_LENGTH;
++ pHdrBuf = pPacket->pBuffer;
++ /* setup frame header */
++ A_SET_UINT16_FIELD(pHdrBuf,HTC_FRAME_HDR,PayloadLen,(A_UINT16)pPacket->ActualLength);
++ A_SET_UINT8_FIELD(pHdrBuf,HTC_FRAME_HDR,Flags,SendFlags);
++ A_SET_UINT8_FIELD(pHdrBuf,HTC_FRAME_HDR,EndpointID, (A_UINT8)pPacket->Endpoint);
++
++ if (pPacket->Completion == NULL) {
++ /* mark that this request was synchronously issued */
++ sync = TRUE;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND,
++ ("+-HTCIssueSend: transmit length : %d (%s) \n",
++ pPacket->ActualLength + HTC_HDR_LENGTH,
++ sync ? "SYNC" : "ASYNC" ));
++
++ /* send message to device */
++ status = DevSendPacket(&target->Device,
++ pPacket,
++ pPacket->ActualLength + HTC_HDR_LENGTH);
++
++ if (sync) {
++ /* use local sync variable. If this was issued asynchronously, pPacket is no longer
++ * safe to access. */
++ pPacket->pBuffer += HTC_HDR_LENGTH;
++ }
++
++ /* if this request was asynchronous, the packet completion routine will be invoked by
++ * the device layer when the HIF layer completes the request */
++
++ return status;
++}
++
++/* try to send the current packet or a packet at the head of the TX queue,
++ * if there are no credits, the packet remains in the queue. */
++static void HTCTrySend(HTC_TARGET *target,
++ HTC_PACKET *pPacketToSend,
++ HTC_ENDPOINT_ID ep)
++{
++ HTC_PACKET *pPacket;
++ HTC_ENDPOINT *pEndpoint;
++ int creditsRequired;
++ A_UINT8 sendFlags;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND,("+HTCTrySend (pPkt:0x%X)\n",(A_UINT32)pPacketToSend));
++
++ pEndpoint = &target->EndPoint[ep];
++
++ LOCK_HTC_TX(target);
++
++ if (pPacketToSend != NULL) {
++ /* caller supplied us a packet to queue to the tail of the HTC TX queue before
++ * we check the tx queue */
++ HTC_PACKET_ENQUEUE(&pEndpoint->TxQueue,pPacketToSend);
++ pEndpoint->CurrentTxQueueDepth++;
++ }
++
++ /* now drain the TX queue for transmission as long as we have enough
++ * credits */
++
++ while (1) {
++
++ if (HTC_QUEUE_EMPTY(&pEndpoint->TxQueue)) {
++ /* nothing in the queue */
++ break;
++ }
++
++ sendFlags = 0;
++
++ /* get packet at head, but don't remove it */
++ pPacket = HTC_GET_PKT_AT_HEAD(&pEndpoint->TxQueue);
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND,(" Got head packet:0x%X , Queue Depth: %d\n",
++ (A_UINT32)pPacket, pEndpoint->CurrentTxQueueDepth));
++
++ /* figure out how many credits this message requires */
++ creditsRequired = pPacket->ActualLength + HTC_HDR_LENGTH;
++ creditsRequired += target->TargetCreditSize - 1;
++ creditsRequired /= target->TargetCreditSize;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND,(" Creds Required:%d Got:%d\n",
++ creditsRequired, pEndpoint->CreditDist.TxCredits));
++
++ if (pEndpoint->CreditDist.TxCredits < creditsRequired) {
++
++ /* not enough credits */
++
++ if (pPacket->Endpoint == ENDPOINT_0) {
++ /* leave it in the queue */
++ break;
++ }
++ /* invoke the registered distribution function only if this is not
++ * endpoint 0, we let the driver layer provide more credits if it can.
++ * We pass the credit distribution list starting at the endpoint in question
++ * */
++
++ /* set how many credits we need */
++ pEndpoint->CreditDist.TxCreditsSeek =
++ creditsRequired - pEndpoint->CreditDist.TxCredits;
++ DO_DISTRIBUTION(target,
++ HTC_CREDIT_DIST_SEEK_CREDITS,
++ "Seek Credits",
++ &pEndpoint->CreditDist);
++
++ pEndpoint->CreditDist.TxCreditsSeek = 0;
++
++ if (pEndpoint->CreditDist.TxCredits < creditsRequired) {
++ /* still not enough credits to send, leave packet in the queue */
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND,
++ (" Not enough credits for ep %d leaving packet in queue..\n",
++ pPacket->Endpoint));
++ break;
++ }
++
++ }
++
++ pEndpoint->CreditDist.TxCredits -= creditsRequired;
++ INC_HTC_EP_STAT(pEndpoint, TxCreditsConsummed, creditsRequired);
++
++ /* check if we need credits */
++ if (pEndpoint->CreditDist.TxCredits < pEndpoint->CreditDist.TxCreditsPerMaxMsg) {
++ sendFlags |= HTC_FLAGS_NEED_CREDIT_UPDATE;
++ INC_HTC_EP_STAT(pEndpoint, TxCreditLowIndications, 1);
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND,(" Host Needs Credits \n"));
++ }
++
++ /* now we can fully dequeue */
++ pPacket = HTC_PACKET_DEQUEUE(&pEndpoint->TxQueue);
++ pEndpoint->CurrentTxQueueDepth--;
++
++ INC_HTC_EP_STAT(pEndpoint, TxIssued, 1);
++
++ UNLOCK_HTC_TX(target);
++
++ HTCIssueSend(target, pPacket, sendFlags);
++
++ LOCK_HTC_TX(target);
++
++ /* go back and check for more messages */
++ }
++
++ if (pEndpoint->CurrentTxQueueDepth >= pEndpoint->MaxTxQueueDepth) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND, (" Endpoint %d, TX queue is full, Depth:%d, Max:%d \n",
++ ep, pEndpoint->CurrentTxQueueDepth, pEndpoint->MaxTxQueueDepth));
++ UNLOCK_HTC_TX(target);
++ /* queue is now full, let caller know */
++ if (pEndpoint->EpCallBacks.EpSendFull != NULL) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND, (" Calling driver's send full callback.... \n"));
++ pEndpoint->EpCallBacks.EpSendFull(pEndpoint->EpCallBacks.pContext, ep);
++ }
++ } else {
++ UNLOCK_HTC_TX(target);
++ /* queue is now available for new packet, let caller know */
++ if (pEndpoint->EpCallBacks.EpSendAvail)
++ pEndpoint->EpCallBacks.EpSendAvail(pEndpoint->EpCallBacks.pContext, ep);
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND,("-HTCTrySend: \n"));
++}
++
++/* HTC API - HTCSendPkt */
++A_STATUS HTCSendPkt(HTC_HANDLE HTCHandle, HTC_PACKET *pPacket)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++ HTC_ENDPOINT *pEndpoint;
++ HTC_ENDPOINT_ID ep;
++ A_STATUS status = A_OK;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND,
++ ("+HTCSendPkt: Enter endPointId: %d, buffer: 0x%X, length: %d \n",
++ pPacket->Endpoint, (A_UINT32)pPacket->pBuffer, pPacket->ActualLength));
++
++ ep = pPacket->Endpoint;
++ AR_DEBUG_ASSERT(ep < ENDPOINT_MAX);
++ pEndpoint = &target->EndPoint[ep];
++
++ do {
++
++ if (HTC_STOPPING(target)) {
++ status = A_ECANCELED;
++ pPacket->Status = status;
++ DO_EP_TX_COMPLETION(pEndpoint,pPacket);
++ break;
++ }
++ /* everything sent through this interface is asynchronous */
++ /* fill in HTC completion routines */
++ pPacket->Completion = HTCSendPktCompletionHandler;
++ pPacket->pContext = target;
++
++ HTCTrySend(target, pPacket, ep);
++
++ } while (FALSE);
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND, ("-HTCSendPkt \n"));
++
++ return status;
++}
++
++
++/* check TX queues to drain because of credit distribution update */
++static INLINE void HTCCheckEndpointTxQueues(HTC_TARGET *target)
++{
++ HTC_ENDPOINT *pEndpoint;
++ HTC_ENDPOINT_CREDIT_DIST *pDistItem;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND, ("+HTCCheckEndpointTxQueues \n"));
++ pDistItem = target->EpCreditDistributionListHead;
++
++ /* run through the credit distribution list to see
++ * if there are packets queued
++ * NOTE: no locks need to be taken since the distribution list
++ * is not dynamic (cannot be re-ordered) and we are not modifying any state */
++ while (pDistItem != NULL) {
++ pEndpoint = (HTC_ENDPOINT *)pDistItem->pHTCReserved;
++
++ if (pEndpoint->CurrentTxQueueDepth > 0) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND, (" Ep %d has %d credits and %d Packets in TX Queue \n",
++ pDistItem->Endpoint, pEndpoint->CreditDist.TxCredits, pEndpoint->CurrentTxQueueDepth));
++ /* try to start the stalled queue, this list is ordered by priority.
++ * Highest priority queue get's processed first, if there are credits available the
++ * highest priority queue will get a chance to reclaim credits from lower priority
++ * ones */
++ HTCTrySend(target, NULL, pDistItem->Endpoint);
++ }
++
++ pDistItem = pDistItem->pNext;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND, ("-HTCCheckEndpointTxQueues \n"));
++}
++
++/* process credit reports and call distribution function */
++void HTCProcessCreditRpt(HTC_TARGET *target, HTC_CREDIT_REPORT *pRpt, int NumEntries, HTC_ENDPOINT_ID FromEndpoint)
++{
++ int i;
++ HTC_ENDPOINT *pEndpoint;
++ int totalCredits = 0;
++ A_BOOL doDist = FALSE;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND, ("+HTCProcessCreditRpt, Credit Report Entries:%d \n", NumEntries));
++
++ /* lock out TX while we update credits */
++ LOCK_HTC_TX(target);
++
++ for (i = 0; i < NumEntries; i++, pRpt++) {
++ if (pRpt->EndpointID >= ENDPOINT_MAX) {
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++
++ pEndpoint = &target->EndPoint[pRpt->EndpointID];
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND, (" Endpoint %d got %d credits \n",
++ pRpt->EndpointID, pRpt->Credits));
++
++
++#ifdef HTC_EP_STAT_PROFILING
++
++ INC_HTC_EP_STAT(pEndpoint, TxCreditRpts, 1);
++ INC_HTC_EP_STAT(pEndpoint, TxCreditsReturned, pRpt->Credits);
++
++ if (FromEndpoint == pRpt->EndpointID) {
++ /* this credit report arrived on the same endpoint indicating it arrived in an RX
++ * packet */
++ INC_HTC_EP_STAT(pEndpoint, TxCreditsFromRx, pRpt->Credits);
++ INC_HTC_EP_STAT(pEndpoint, TxCreditRptsFromRx, 1);
++ } else if (FromEndpoint == ENDPOINT_0) {
++ /* this credit arrived on endpoint 0 as a NULL message */
++ INC_HTC_EP_STAT(pEndpoint, TxCreditsFromEp0, pRpt->Credits);
++ INC_HTC_EP_STAT(pEndpoint, TxCreditRptsFromEp0, 1);
++ } else {
++ /* arrived on another endpoint */
++ INC_HTC_EP_STAT(pEndpoint, TxCreditsFromOther, pRpt->Credits);
++ INC_HTC_EP_STAT(pEndpoint, TxCreditRptsFromOther, 1);
++ }
++
++#endif
++
++ if (ENDPOINT_0 == pRpt->EndpointID) {
++ /* always give endpoint 0 credits back */
++ pEndpoint->CreditDist.TxCredits += pRpt->Credits;
++ } else {
++ /* for all other endpoints, update credits to distribute, the distribution function
++ * will handle giving out credits back to the endpoints */
++ pEndpoint->CreditDist.TxCreditsToDist += pRpt->Credits;
++ /* flag that we have to do the distribution */
++ doDist = TRUE;
++ }
++
++ totalCredits += pRpt->Credits;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND, (" Report indicated %d credits to distribute \n", totalCredits));
++
++ if (doDist) {
++ /* this was a credit return based on a completed send operations
++ * note, this is done with the lock held */
++ DO_DISTRIBUTION(target,
++ HTC_CREDIT_DIST_SEND_COMPLETE,
++ "Send Complete",
++ target->EpCreditDistributionListHead->pNext);
++ }
++
++ UNLOCK_HTC_TX(target);
++
++ if (totalCredits) {
++ HTCCheckEndpointTxQueues(target);
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND, ("-HTCProcessCreditRpt \n"));
++}
++
++/* flush endpoint TX queue */
++static void HTCFlushEndpointTX(HTC_TARGET *target, HTC_ENDPOINT *pEndpoint, HTC_TX_TAG Tag)
++{
++ HTC_PACKET *pPacket;
++ HTC_PACKET_QUEUE discardQueue;
++
++ /* initialize the discard queue */
++ INIT_HTC_PACKET_QUEUE(&discardQueue);
++
++ LOCK_HTC_TX(target);
++
++ /* interate from the front of the TX queue and flush out packets */
++ ITERATE_OVER_LIST_ALLOW_REMOVE(&pEndpoint->TxQueue, pPacket, HTC_PACKET, ListLink) {
++
++ /* check for removal */
++ if ((HTC_TX_PACKET_TAG_ALL == Tag) || (Tag == pPacket->PktInfo.AsTx.Tag)) {
++ /* remove from queue */
++ HTC_PACKET_REMOVE(pPacket);
++ /* add it to the discard pile */
++ HTC_PACKET_ENQUEUE(&discardQueue, pPacket);
++ pEndpoint->CurrentTxQueueDepth--;
++ }
++
++ } ITERATE_END;
++
++ UNLOCK_HTC_TX(target);
++
++ /* empty the discard queue */
++ while (1) {
++ pPacket = HTC_PACKET_DEQUEUE(&discardQueue);
++ if (NULL == pPacket) {
++ break;
++ }
++ pPacket->Status = A_ECANCELED;
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, (" Flushing TX packet:0x%X, length:%d, ep:%d tag:0x%X \n",
++ (A_UINT32)pPacket, pPacket->ActualLength, pPacket->Endpoint, pPacket->PktInfo.AsTx.Tag));
++ DO_EP_TX_COMPLETION(pEndpoint,pPacket);
++ }
++
++}
++
++void DumpCreditDist(HTC_ENDPOINT_CREDIT_DIST *pEPDist)
++{
++#ifdef DEBUG
++ HTC_ENDPOINT *pEndpoint = (HTC_ENDPOINT *)pEPDist->pHTCReserved;
++#endif
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, ("--- EP : %d ServiceID: 0x%X --------------\n",
++ pEPDist->Endpoint, pEPDist->ServiceID));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" this:0x%X next:0x%X prev:0x%X\n",
++ (A_UINT32)pEPDist, (A_UINT32)pEPDist->pNext, (A_UINT32)pEPDist->pPrev));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" DistFlags : 0x%X \n", pEPDist->DistFlags));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCreditsNorm : %d \n", pEPDist->TxCreditsNorm));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCreditsMin : %d \n", pEPDist->TxCreditsMin));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCredits : %d \n", pEPDist->TxCredits));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCreditsAssigned : %d \n", pEPDist->TxCreditsAssigned));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCreditsSeek : %d \n", pEPDist->TxCreditsSeek));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCreditSize : %d \n", pEPDist->TxCreditSize));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCreditsPerMaxMsg : %d \n", pEPDist->TxCreditsPerMaxMsg));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCreditsToDist : %d \n", pEPDist->TxCreditsToDist));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxQueueDepth : %d \n", pEndpoint->CurrentTxQueueDepth));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, ("----------------------------------------------------\n"));
++}
++
++void DumpCreditDistStates(HTC_TARGET *target)
++{
++ HTC_ENDPOINT_CREDIT_DIST *pEPList = target->EpCreditDistributionListHead;
++
++ while (pEPList != NULL) {
++ DumpCreditDist(pEPList);
++ pEPList = pEPList->pNext;
++ }
++
++ if (target->DistributeCredits != NULL) {
++ DO_DISTRIBUTION(target,
++ HTC_DUMP_CREDIT_STATE,
++ "Dump State",
++ NULL);
++ }
++}
++
++/* flush all send packets from all endpoint queues */
++void HTCFlushSendPkts(HTC_TARGET *target)
++{
++ HTC_ENDPOINT *pEndpoint;
++ int i;
++
++ DumpCreditDistStates(target);
++
++ for (i = ENDPOINT_0; i < ENDPOINT_MAX; i++) {
++ pEndpoint = &target->EndPoint[i];
++ if (pEndpoint->ServiceID == 0) {
++ /* not in use.. */
++ continue;
++ }
++ HTCFlushEndpointTX(target,pEndpoint,HTC_TX_PACKET_TAG_ALL);
++ }
++
++}
++
++/* HTC API to flush an endpoint's TX queue*/
++void HTCFlushEndpoint(HTC_HANDLE HTCHandle, HTC_ENDPOINT_ID Endpoint, HTC_TX_TAG Tag)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++ HTC_ENDPOINT *pEndpoint = &target->EndPoint[Endpoint];
++
++ if (pEndpoint->ServiceID == 0) {
++ AR_DEBUG_ASSERT(FALSE);
++ /* not in use.. */
++ return;
++ }
++
++ HTCFlushEndpointTX(target, pEndpoint, Tag);
++}
++
++/* HTC API to indicate activity to the credit distribution function */
++void HTCIndicateActivityChange(HTC_HANDLE HTCHandle,
++ HTC_ENDPOINT_ID Endpoint,
++ A_BOOL Active)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++ HTC_ENDPOINT *pEndpoint = &target->EndPoint[Endpoint];
++ A_BOOL doDist = FALSE;
++
++ if (pEndpoint->ServiceID == 0) {
++ AR_DEBUG_ASSERT(FALSE);
++ /* not in use.. */
++ return;
++ }
++
++ LOCK_HTC_TX(target);
++
++ if (Active) {
++ if (!(pEndpoint->CreditDist.DistFlags & HTC_EP_ACTIVE)) {
++ /* mark active now */
++ pEndpoint->CreditDist.DistFlags |= HTC_EP_ACTIVE;
++ doDist = TRUE;
++ }
++ } else {
++ if (pEndpoint->CreditDist.DistFlags & HTC_EP_ACTIVE) {
++ /* mark inactive now */
++ pEndpoint->CreditDist.DistFlags &= ~HTC_EP_ACTIVE;
++ doDist = TRUE;
++ }
++ }
++
++ if (doDist) {
++ /* do distribution again based on activity change
++ * note, this is done with the lock held */
++ DO_DISTRIBUTION(target,
++ HTC_CREDIT_DIST_ACTIVITY_CHANGE,
++ "Activity Change",
++ target->EpCreditDistributionListHead->pNext);
++ }
++
++ UNLOCK_HTC_TX(target);
++
++}
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/htc/htc_services.c linux-2.6.29-rc3.owrt.om/drivers/ar6000/htc/htc_services.c
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/htc/htc_services.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/htc/htc_services.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,403 @@
++/*
++ *
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "htc_internal.h"
++
++void HTCControlTxComplete(void *Context, HTC_PACKET *pPacket)
++{
++ /* not implemented
++ * we do not send control TX frames during normal runtime, only during setup */
++ AR_DEBUG_ASSERT(FALSE);
++}
++
++ /* callback when a control message arrives on this endpoint */
++void HTCControlRecv(void *Context, HTC_PACKET *pPacket)
++{
++ AR_DEBUG_ASSERT(pPacket->Endpoint == ENDPOINT_0);
++
++ /* the only control messages we are expecting are NULL messages (credit resports), which should
++ * never get here */
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("HTCControlRecv, got message with length:%d \n",
++ pPacket->ActualLength + HTC_HDR_LENGTH));
++
++ /* dump header and message */
++ DebugDumpBytes(pPacket->pBuffer - HTC_HDR_LENGTH,
++ pPacket->ActualLength + HTC_HDR_LENGTH,
++ "Unexpected ENDPOINT 0 Message");
++
++ HTC_RECYCLE_RX_PKT((HTC_TARGET*)Context,pPacket);
++}
++
++A_STATUS HTCSendSetupComplete(HTC_TARGET *target)
++{
++ HTC_PACKET *pSendPacket = NULL;
++ A_STATUS status;
++ HTC_SETUP_COMPLETE_MSG *pSetupComplete;
++
++ do {
++ /* allocate a packet to send to the target */
++ pSendPacket = HTC_ALLOC_CONTROL_TX(target);
++
++ if (NULL == pSendPacket) {
++ status = A_NO_MEMORY;
++ break;
++ }
++
++ /* assemble setup complete message */
++ pSetupComplete = (HTC_SETUP_COMPLETE_MSG *)pSendPacket->pBuffer;
++ A_MEMZERO(pSetupComplete,sizeof(HTC_SETUP_COMPLETE_MSG));
++ pSetupComplete->MessageID = HTC_MSG_SETUP_COMPLETE_ID;
++
++ SET_HTC_PACKET_INFO_TX(pSendPacket,
++ NULL,
++ (A_UINT8 *)pSetupComplete,
++ sizeof(HTC_SETUP_COMPLETE_MSG),
++ ENDPOINT_0,
++ HTC_SERVICE_TX_PACKET_TAG);
++
++ /* we want synchronous operation */
++ pSendPacket->Completion = NULL;
++ /* send the message */
++ status = HTCIssueSend(target,pSendPacket,0);
++
++ } while (FALSE);
++
++ if (pSendPacket != NULL) {
++ HTC_FREE_CONTROL_TX(target,pSendPacket);
++ }
++
++ return status;
++}
++
++
++A_STATUS HTCConnectService(HTC_HANDLE HTCHandle,
++ HTC_SERVICE_CONNECT_REQ *pConnectReq,
++ HTC_SERVICE_CONNECT_RESP *pConnectResp)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++ A_STATUS status = A_OK;
++ HTC_PACKET *pRecvPacket = NULL;
++ HTC_PACKET *pSendPacket = NULL;
++ HTC_CONNECT_SERVICE_RESPONSE_MSG *pResponseMsg;
++ HTC_CONNECT_SERVICE_MSG *pConnectMsg;
++ HTC_ENDPOINT_ID assignedEndpoint = ENDPOINT_MAX;
++ HTC_ENDPOINT *pEndpoint;
++ int maxMsgSize = 0;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+HTCConnectService, target:0x%X SvcID:0x%X \n",
++ (A_UINT32)target, pConnectReq->ServiceID));
++
++ do {
++
++ AR_DEBUG_ASSERT(pConnectReq->ServiceID != 0);
++
++ if (HTC_CTRL_RSVD_SVC == pConnectReq->ServiceID) {
++ /* special case for pseudo control service */
++ assignedEndpoint = ENDPOINT_0;
++ maxMsgSize = HTC_MAX_CONTROL_MESSAGE_LENGTH;
++ } else {
++ /* allocate a packet to send to the target */
++ pSendPacket = HTC_ALLOC_CONTROL_TX(target);
++
++ if (NULL == pSendPacket) {
++ AR_DEBUG_ASSERT(FALSE);
++ status = A_NO_MEMORY;
++ break;
++ }
++ /* assemble connect service message */
++ pConnectMsg = (HTC_CONNECT_SERVICE_MSG *)pSendPacket->pBuffer;
++ AR_DEBUG_ASSERT(pConnectMsg != NULL);
++ A_MEMZERO(pConnectMsg,sizeof(HTC_CONNECT_SERVICE_MSG));
++ pConnectMsg->MessageID = HTC_MSG_CONNECT_SERVICE_ID;
++ pConnectMsg->ServiceID = pConnectReq->ServiceID;
++ pConnectMsg->ConnectionFlags = pConnectReq->ConnectionFlags;
++ /* check caller if it wants to transfer meta data */
++ if ((pConnectReq->pMetaData != NULL) &&
++ (pConnectReq->MetaDataLength <= HTC_SERVICE_META_DATA_MAX_LENGTH)) {
++ /* copy meta data into message buffer (after header ) */
++ A_MEMCPY((A_UINT8 *)pConnectMsg + sizeof(HTC_CONNECT_SERVICE_MSG),
++ pConnectReq->pMetaData,
++ pConnectReq->MetaDataLength);
++ pConnectMsg->ServiceMetaLength = pConnectReq->MetaDataLength;
++ }
++
++ SET_HTC_PACKET_INFO_TX(pSendPacket,
++ NULL,
++ (A_UINT8 *)pConnectMsg,
++ sizeof(HTC_CONNECT_SERVICE_MSG) + pConnectMsg->ServiceMetaLength,
++ ENDPOINT_0,
++ HTC_SERVICE_TX_PACKET_TAG);
++
++ /* we want synchronous operation */
++ pSendPacket->Completion = NULL;
++
++ status = HTCIssueSend(target,pSendPacket,0);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ /* wait for response */
++ status = HTCWaitforControlMessage(target, &pRecvPacket);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++ /* we controlled the buffer creation so it has to be properly aligned */
++ pResponseMsg = (HTC_CONNECT_SERVICE_RESPONSE_MSG *)pRecvPacket->pBuffer;
++
++ if ((pResponseMsg->MessageID != HTC_MSG_CONNECT_SERVICE_RESPONSE_ID) ||
++ (pRecvPacket->ActualLength < sizeof(HTC_CONNECT_SERVICE_RESPONSE_MSG))) {
++ /* this message is not valid */
++ AR_DEBUG_ASSERT(FALSE);
++ status = A_EPROTO;
++ break;
++ }
++
++ pConnectResp->ConnectRespCode = pResponseMsg->Status;
++ /* check response status */
++ if (pResponseMsg->Status != HTC_SERVICE_SUCCESS) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ (" Target failed service 0x%X connect request (status:%d)\n",
++ pResponseMsg->ServiceID, pResponseMsg->Status));
++ status = A_EPROTO;
++ break;
++ }
++
++ assignedEndpoint = pResponseMsg->EndpointID;
++ maxMsgSize = pResponseMsg->MaxMsgSize;
++
++ if ((pConnectResp->pMetaData != NULL) &&
++ (pResponseMsg->ServiceMetaLength > 0) &&
++ (pResponseMsg->ServiceMetaLength <= HTC_SERVICE_META_DATA_MAX_LENGTH)) {
++ /* caller supplied a buffer and the target responded with data */
++ int copyLength = min((int)pConnectResp->BufferLength, (int)pResponseMsg->ServiceMetaLength);
++ /* copy the meta data */
++ A_MEMCPY(pConnectResp->pMetaData,
++ ((A_UINT8 *)pResponseMsg) + sizeof(HTC_CONNECT_SERVICE_RESPONSE_MSG),
++ copyLength);
++ pConnectResp->ActualLength = copyLength;
++ }
++
++ }
++
++ /* the rest of these are parameter checks so set the error status */
++ status = A_EPROTO;
++
++ if (assignedEndpoint >= ENDPOINT_MAX) {
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++
++ if (0 == maxMsgSize) {
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++
++ pEndpoint = &target->EndPoint[assignedEndpoint];
++
++ if (pEndpoint->ServiceID != 0) {
++ /* endpoint already in use! */
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++
++ /* return assigned endpoint to caller */
++ pConnectResp->Endpoint = assignedEndpoint;
++ pConnectResp->MaxMsgLength = maxMsgSize;
++
++ /* setup the endpoint */
++ pEndpoint->ServiceID = pConnectReq->ServiceID; /* this marks the endpoint in use */
++ pEndpoint->MaxTxQueueDepth = pConnectReq->MaxSendQueueDepth;
++ pEndpoint->MaxMsgLength = maxMsgSize;
++ /* copy all the callbacks */
++ pEndpoint->EpCallBacks = pConnectReq->EpCallbacks;
++ INIT_HTC_PACKET_QUEUE(&pEndpoint->RxBuffers);
++ INIT_HTC_PACKET_QUEUE(&pEndpoint->TxQueue);
++ /* set the credit distribution info for this endpoint, this information is
++ * passed back to the credit distribution callback function */
++ pEndpoint->CreditDist.ServiceID = pConnectReq->ServiceID;
++ pEndpoint->CreditDist.pHTCReserved = pEndpoint;
++ pEndpoint->CreditDist.Endpoint = assignedEndpoint;
++ pEndpoint->CreditDist.TxCreditSize = target->TargetCreditSize;
++ pEndpoint->CreditDist.TxCreditsPerMaxMsg = maxMsgSize / target->TargetCreditSize;
++
++ if (0 == pEndpoint->CreditDist.TxCreditsPerMaxMsg) {
++ pEndpoint->CreditDist.TxCreditsPerMaxMsg = 1;
++ }
++
++ status = A_OK;
++
++ } while (FALSE);
++
++ if (pSendPacket != NULL) {
++ HTC_FREE_CONTROL_TX(target,pSendPacket);
++ }
++
++ if (pRecvPacket != NULL) {
++ HTC_FREE_CONTROL_RX(target,pRecvPacket);
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-HTCConnectService \n"));
++
++ return status;
++}
++
++static void AddToEndpointDistList(HTC_TARGET *target, HTC_ENDPOINT_CREDIT_DIST *pEpDist)
++{
++ HTC_ENDPOINT_CREDIT_DIST *pCurEntry,*pLastEntry;
++
++ if (NULL == target->EpCreditDistributionListHead) {
++ target->EpCreditDistributionListHead = pEpDist;
++ pEpDist->pNext = NULL;
++ pEpDist->pPrev = NULL;
++ return;
++ }
++
++ /* queue to the end of the list, this does not have to be very
++ * fast since this list is built at startup time */
++ pCurEntry = target->EpCreditDistributionListHead;
++
++ while (pCurEntry) {
++ pLastEntry = pCurEntry;
++ pCurEntry = pCurEntry->pNext;
++ }
++
++ pLastEntry->pNext = pEpDist;
++ pEpDist->pPrev = pLastEntry;
++ pEpDist->pNext = NULL;
++}
++
++
++
++/* default credit init callback */
++static void HTCDefaultCreditInit(void *Context,
++ HTC_ENDPOINT_CREDIT_DIST *pEPList,
++ int TotalCredits)
++{
++ HTC_ENDPOINT_CREDIT_DIST *pCurEpDist;
++ int totalEps = 0;
++ int creditsPerEndpoint;
++
++ pCurEpDist = pEPList;
++ /* first run through the list and figure out how many endpoints we are dealing with */
++ while (pCurEpDist != NULL) {
++ pCurEpDist = pCurEpDist->pNext;
++ totalEps++;
++ }
++
++ /* even distribution */
++ creditsPerEndpoint = TotalCredits/totalEps;
++
++ pCurEpDist = pEPList;
++ /* run through the list and set minimum and normal credits and
++ * provide the endpoint with some credits to start */
++ while (pCurEpDist != NULL) {
++
++ if (creditsPerEndpoint < pCurEpDist->TxCreditsPerMaxMsg) {
++ /* too many endpoints and not enough credits */
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++ /* our minimum is set for at least 1 max message */
++ pCurEpDist->TxCreditsMin = pCurEpDist->TxCreditsPerMaxMsg;
++ /* this value is ignored by our credit alg, since we do
++ * not dynamically adjust credits, this is the policy of
++ * the "default" credit distribution, something simple and easy */
++ pCurEpDist->TxCreditsNorm = 0xFFFF;
++ /* give the endpoint minimum credits */
++ pCurEpDist->TxCredits = creditsPerEndpoint;
++ pCurEpDist->TxCreditsAssigned = creditsPerEndpoint;
++ pCurEpDist = pCurEpDist->pNext;
++ }
++
++}
++
++/* default credit distribution callback, NOTE, this callback holds the TX lock */
++void HTCDefaultCreditDist(void *Context,
++ HTC_ENDPOINT_CREDIT_DIST *pEPDistList,
++ HTC_CREDIT_DIST_REASON Reason)
++{
++ HTC_ENDPOINT_CREDIT_DIST *pCurEpDist;
++
++ if (Reason == HTC_CREDIT_DIST_SEND_COMPLETE) {
++ pCurEpDist = pEPDistList;
++ /* simple distribution */
++ while (pCurEpDist != NULL) {
++ if (pCurEpDist->TxCreditsToDist > 0) {
++ /* just give the endpoint back the credits */
++ pCurEpDist->TxCredits += pCurEpDist->TxCreditsToDist;
++ pCurEpDist->TxCreditsToDist = 0;
++ }
++ pCurEpDist = pCurEpDist->pNext;
++ }
++ }
++
++ /* note we do not need to handle the other reason codes as this is a very
++ * simple distribution scheme, no need to seek for more credits or handle inactivity */
++}
++
++void HTCSetCreditDistribution(HTC_HANDLE HTCHandle,
++ void *pCreditDistContext,
++ HTC_CREDIT_DIST_CALLBACK CreditDistFunc,
++ HTC_CREDIT_INIT_CALLBACK CreditInitFunc,
++ HTC_SERVICE_ID ServicePriorityOrder[],
++ int ListLength)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++ int i;
++ int ep;
++
++ if (CreditInitFunc != NULL) {
++ /* caller has supplied their own distribution functions */
++ target->InitCredits = CreditInitFunc;
++ AR_DEBUG_ASSERT(CreditDistFunc != NULL);
++ target->DistributeCredits = CreditDistFunc;
++ target->pCredDistContext = pCreditDistContext;
++ } else {
++ /* caller wants HTC to do distribution */
++ /* if caller wants service to handle distributions then
++ * it must set both of these to NULL! */
++ AR_DEBUG_ASSERT(CreditDistFunc == NULL);
++ target->InitCredits = HTCDefaultCreditInit;
++ target->DistributeCredits = HTCDefaultCreditDist;
++ target->pCredDistContext = target;
++ }
++
++ /* always add HTC control endpoint first, we only expose the list after the
++ * first one, this is added for TX queue checking */
++ AddToEndpointDistList(target, &target->EndPoint[ENDPOINT_0].CreditDist);
++
++ /* build the list of credit distribution structures in priority order
++ * supplied by the caller, these will follow endpoint 0 */
++ for (i = 0; i < ListLength; i++) {
++ /* match services with endpoints and add the endpoints to the distribution list
++ * in FIFO order */
++ for (ep = ENDPOINT_1; ep < ENDPOINT_MAX; ep++) {
++ if (target->EndPoint[ep].ServiceID == ServicePriorityOrder[i]) {
++ /* queue this one to the list */
++ AddToEndpointDistList(target, &target->EndPoint[ep].CreditDist);
++ break;
++ }
++ }
++ AR_DEBUG_ASSERT(ep < ENDPOINT_MAX);
++ }
++
++}
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/a_config.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/a_config.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/a_config.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/a_config.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,27 @@
++#ifndef _A_CONFIG_H_
++#define _A_CONFIG_H_
++/*
++ * Copyright (c) 2004-2005 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++/*
++ * This file contains software configuration options that enables
++ * specific software "features"
++ */
++#include "../ar6000/config_linux.h"
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/a_debug.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/a_debug.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/a_debug.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/a_debug.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,41 @@
++#ifndef _A_DEBUG_H_
++#define _A_DEBUG_H_
++/*
++ * Copyright (c) 2004-2006 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include <a_types.h>
++#include <a_osapi.h>
++
++#define DBG_INFO 0x00000001
++#define DBG_ERROR 0x00000002
++#define DBG_WARNING 0x00000004
++#define DBG_SDIO 0x00000008
++#define DBG_HIF 0x00000010
++#define DBG_HTC 0x00000020
++#define DBG_WMI 0x00000040
++#define DBG_WMI2 0x00000080
++#define DBG_DRIVER 0x00000100
++
++#define DBG_DEFAULTS (DBG_ERROR|DBG_WARNING)
++
++#include "../ar6000/debug_linux.h"
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/a_drv_api.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/a_drv_api.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/a_drv_api.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/a_drv_api.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,185 @@
++#ifndef _A_DRV_API_H_
++#define _A_DRV_API_H_
++/*
++ * Copyright (c) 2004-2006 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/****************************************************************************/
++/****************************************************************************/
++/** **/
++/** WMI related hooks **/
++/** **/
++/****************************************************************************/
++/****************************************************************************/
++
++#include <ar6000_api.h>
++
++#define A_WMI_CHANNELLIST_RX(devt, numChan, chanList) \
++ ar6000_channelList_rx((devt), (numChan), (chanList))
++
++#define A_WMI_SET_NUMDATAENDPTS(devt, num) \
++ ar6000_set_numdataendpts((devt), (num))
++
++#define A_WMI_CONTROL_TX(devt, osbuf, streamID) \
++ ar6000_control_tx((devt), (osbuf), (streamID))
++
++#define A_WMI_TARGETSTATS_EVENT(devt, pStats) \
++ ar6000_targetStats_event((devt), (pStats))
++
++#define A_WMI_SCANCOMPLETE_EVENT(devt, status) \
++ ar6000_scanComplete_event((devt), (status))
++
++#ifdef CONFIG_HOST_DSET_SUPPORT
++
++#define A_WMI_DSET_DATA_REQ(devt, access_cookie, offset, length, targ_buf, targ_reply_fn, targ_reply_arg) \
++ ar6000_dset_data_req((devt), (access_cookie), (offset), (length), (targ_buf), (targ_reply_fn), (targ_reply_arg))
++
++#define A_WMI_DSET_CLOSE(devt, access_cookie) \
++ ar6000_dset_close((devt), (access_cookie))
++
++#endif
++
++#define A_WMI_DSET_OPEN_REQ(devt, id, targ_handle, targ_reply_fn, targ_reply_arg) \
++ ar6000_dset_open_req((devt), (id), (targ_handle), (targ_reply_fn), (targ_reply_arg))
++
++#define A_WMI_CONNECT_EVENT(devt, channel, bssid, listenInterval, beaconInterval, networkType, beaconIeLen, assocReqLen, assocRespLen, assocInfo) \
++ ar6000_connect_event((devt), (channel), (bssid), (listenInterval), (beaconInterval), (networkType), (beaconIeLen), (assocReqLen), (assocRespLen), (assocInfo))
++
++#define A_WMI_REGDOMAIN_EVENT(devt, regCode) \
++ ar6000_regDomain_event((devt), (regCode))
++
++#define A_WMI_NEIGHBORREPORT_EVENT(devt, numAps, info) \
++ ar6000_neighborReport_event((devt), (numAps), (info))
++
++#define A_WMI_DISCONNECT_EVENT(devt, reason, bssid, assocRespLen, assocInfo, protocolReasonStatus) \
++ ar6000_disconnect_event((devt), (reason), (bssid), (assocRespLen), (assocInfo), (protocolReasonStatus))
++
++#define A_WMI_TKIP_MICERR_EVENT(devt, keyid, ismcast) \
++ ar6000_tkip_micerr_event((devt), (keyid), (ismcast))
++
++#define A_WMI_BITRATE_RX(devt, rateKbps) \
++ ar6000_bitrate_rx((devt), (rateKbps))
++
++#define A_WMI_TXPWR_RX(devt, txPwr) \
++ ar6000_txPwr_rx((devt), (txPwr))
++
++#define A_WMI_READY_EVENT(devt, datap, phyCap) \
++ ar6000_ready_event((devt), (datap), (phyCap))
++
++#define A_WMI_DBGLOG_INIT_DONE(ar) \
++ ar6000_dbglog_init_done(ar);
++
++#define A_WMI_RSSI_THRESHOLD_EVENT(devt, newThreshold, rssi) \
++ ar6000_rssiThreshold_event((devt), (newThreshold), (rssi))
++
++#define A_WMI_REPORT_ERROR_EVENT(devt, errorVal) \
++ ar6000_reportError_event((devt), (errorVal))
++
++#define A_WMI_ROAM_TABLE_EVENT(devt, pTbl) \
++ ar6000_roam_tbl_event((devt), (pTbl))
++
++#define A_WMI_ROAM_DATA_EVENT(devt, p) \
++ ar6000_roam_data_event((devt), (p))
++
++#define A_WMI_WOW_LIST_EVENT(devt, num_filters, wow_filters) \
++ ar6000_wow_list_event((devt), (num_filters), (wow_filters))
++
++#define A_WMI_CAC_EVENT(devt, ac, cac_indication, statusCode, tspecSuggestion) \
++ ar6000_cac_event((devt), (ac), (cac_indication), (statusCode), (tspecSuggestion))
++
++#define A_WMI_IPTOS_TO_USERPRIORITY(pkt) \
++ ar6000_iptos_to_userPriority((pkt))
++
++#define A_WMI_PMKID_LIST_EVENT(devt, num_pmkid, pmkid_list) \
++ ar6000_pmkid_list_event((devt), (num_pmkid), (pmkid_list))
++
++#ifdef CONFIG_HOST_GPIO_SUPPORT
++
++#define A_WMI_GPIO_INTR_RX(intr_mask, input_values) \
++ ar6000_gpio_intr_rx((intr_mask), (input_values))
++
++#define A_WMI_GPIO_DATA_RX(reg_id, value) \
++ ar6000_gpio_data_rx((reg_id), (value))
++
++#define A_WMI_GPIO_ACK_RX() \
++ ar6000_gpio_ack_rx()
++
++#endif
++
++#ifdef SEND_EVENT_TO_APP
++
++#define A_WMI_SEND_EVENT_TO_APP(ar, eventId, datap, len) \
++ ar6000_send_event_to_app((ar), (eventId), (datap), (len))
++
++#else
++
++#define A_WMI_SEND_EVENT_TO_APP(ar, eventId, datap, len)
++
++#endif
++
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++#define A_WMI_TCMD_RX_REPORT_EVENT(devt, results, len) \
++ ar6000_tcmd_rx_report_event((devt), (results), (len))
++#endif
++
++#define A_WMI_HBCHALLENGERESP_EVENT(devt, cookie, source) \
++ ar6000_hbChallengeResp_event((devt), (cookie), (source))
++
++#define A_WMI_TX_RETRY_ERR_EVENT(devt) \
++ ar6000_tx_retry_err_event((devt))
++
++#define A_WMI_SNR_THRESHOLD_EVENT_RX(devt, newThreshold, snr) \
++ ar6000_snrThresholdEvent_rx((devt), (newThreshold), (snr))
++
++#define A_WMI_LQ_THRESHOLD_EVENT_RX(devt, range, lqVal) \
++ ar6000_lqThresholdEvent_rx((devt), (range), (lqVal))
++
++#define A_WMI_RATEMASK_RX(devt, ratemask) \
++ ar6000_ratemask_rx((devt), (ratemask))
++
++#define A_WMI_KEEPALIVE_RX(devt, configured) \
++ ar6000_keepalive_rx((devt), (configured))
++
++#define A_WMI_BSSINFO_EVENT_RX(ar, datp, len) \
++ ar6000_bssInfo_event_rx((ar), (datap), (len))
++
++#define A_WMI_DBGLOG_EVENT(ar, dropped, buffer, length) \
++ ar6000_dbglog_event((ar), (dropped), (buffer), (length));
++
++#define A_WMI_STREAM_TX_ACTIVE(devt,trafficClass) \
++ ar6000_indicate_tx_activity((devt),(trafficClass), TRUE)
++
++#define A_WMI_STREAM_TX_INACTIVE(devt,trafficClass) \
++ ar6000_indicate_tx_activity((devt),(trafficClass), FALSE)
++
++/****************************************************************************/
++/****************************************************************************/
++/** **/
++/** HTC related hooks **/
++/** **/
++/****************************************************************************/
++/****************************************************************************/
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/a_drv.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/a_drv.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/a_drv.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/a_drv.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,28 @@
++#ifndef _A_DRV_H_
++#define _A_DRV_H_
++/*
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/include/a_drv.h#1 $
++ *
++ * This file contains the definitions of the basic atheros data types.
++ * It is used to map the data types in atheros files to a platform specific
++ * type.
++ *
++ * Copyright 2003-2005 Atheros Communications, Inc., All Rights Reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "../ar6000/athdrv_linux.h"
++
++#endif /* _ADRV_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/a_osapi.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/a_osapi.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/a_osapi.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/a_osapi.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,28 @@
++#ifndef _A_OSAPI_H_
++#define _A_OSAPI_H_
++/*
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/include/a_osapi.h#1 $
++ *
++ * This file contains the definitions of the basic atheros data types.
++ * It is used to map the data types in atheros files to a platform specific
++ * type.
++ *
++ * Copyright 2003-2005 Atheros Communications, Inc., All Rights Reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "../ar6000/osapi_linux.h"
++
++#endif /* _OSAPI_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/ar6000_api.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/ar6000_api.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/ar6000_api.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/ar6000_api.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,29 @@
++#ifndef _AR6000_API_H_
++#define _AR6000_API_H_
++/*
++ * Copyright (c) 2004-2005 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * This file contains the API to access the OS dependent atheros host driver
++ * by the WMI or WLAN generic modules.
++ *
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/include/ar6000_api.h#1 $
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "../ar6000/ar6xapi_linux.h"
++
++#endif /* _AR6000_API_H */
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/ar6000_diag.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/ar6000_diag.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/ar6000_diag.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/ar6000_diag.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,38 @@
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef AR6000_DIAG_H_
++#define AR6000_DIAG_H_
++
++
++A_STATUS
++ar6000_ReadRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data);
++
++A_STATUS
++ar6000_WriteRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data);
++
++A_STATUS
++ar6000_ReadDataDiag(HIF_DEVICE *hifDevice, A_UINT32 address,
++ A_UCHAR *data, A_UINT32 length);
++
++A_STATUS
++ar6000_WriteDataDiag(HIF_DEVICE *hifDevice, A_UINT32 address,
++ A_UCHAR *data, A_UINT32 length);
++
++#endif /*AR6000_DIAG_H_*/
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/AR6001_regdump.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/AR6001_regdump.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/AR6001_regdump.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/AR6001_regdump.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,100 @@
++/*
++ * Copyright (c) 2006 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ */
++
++#ifndef __AR6000_REGDUMP_H__
++#define __AR6000_REGDUMP_H__
++
++#if !defined(__ASSEMBLER__)
++/*
++ * Target CPU state at the time of failure is reflected
++ * in a register dump, which the Host can fetch through
++ * the diagnostic window.
++ */
++
++struct MIPS_exception_frame_s {
++ A_UINT32 pc; /* Program Counter */
++ A_UINT32 at; /* MIPS General Purpose registers */
++ A_UINT32 v0;
++ A_UINT32 v1;
++ A_UINT32 a0;
++ A_UINT32 a1;
++ A_UINT32 a2;
++ A_UINT32 a3;
++ A_UINT32 t0;
++ A_UINT32 t1;
++ A_UINT32 t2;
++ A_UINT32 t3;
++ A_UINT32 t4;
++ A_UINT32 t5;
++ A_UINT32 t6;
++ A_UINT32 t7;
++ A_UINT32 s0;
++ A_UINT32 s1;
++ A_UINT32 s2;
++ A_UINT32 s3;
++ A_UINT32 s4;
++ A_UINT32 s5;
++ A_UINT32 s6;
++ A_UINT32 s7;
++ A_UINT32 t8;
++ A_UINT32 t9;
++ A_UINT32 k0;
++ A_UINT32 k1;
++ A_UINT32 gp;
++ A_UINT32 sp;
++ A_UINT32 s8;
++ A_UINT32 ra;
++ A_UINT32 cause; /* Selected coprocessor regs */
++ A_UINT32 status;
++};
++typedef struct MIPS_exception_frame_s CPU_exception_frame_t;
++
++#endif
++
++/*
++ * Offsets into MIPS_exception_frame structure, for use in assembler code
++ * MUST MATCH C STRUCTURE ABOVE
++ */
++#define RD_pc 0
++#define RD_at 1
++#define RD_v0 2
++#define RD_v1 3
++#define RD_a0 4
++#define RD_a1 5
++#define RD_a2 6
++#define RD_a3 7
++#define RD_t0 8
++#define RD_t1 9
++#define RD_t2 10
++#define RD_t3 11
++#define RD_t4 12
++#define RD_t5 13
++#define RD_t6 14
++#define RD_t7 15
++#define RD_s0 16
++#define RD_s1 17
++#define RD_s2 18
++#define RD_s3 19
++#define RD_s4 20
++#define RD_s5 21
++#define RD_s6 22
++#define RD_s7 23
++#define RD_t8 24
++#define RD_t9 25
++#define RD_k0 26
++#define RD_k1 27
++#define RD_gp 28
++#define RD_sp 29
++#define RD_s8 30
++#define RD_ra 31
++#define RD_cause 32
++#define RD_status 33
++
++#define RD_SIZE (34*4) /* Space for this number of words */
++
++#endif /* __AR6000_REGDUMP_H__ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/AR6Khwreg.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/AR6Khwreg.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/AR6Khwreg.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/AR6Khwreg.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,147 @@
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ * This file contains the definitions for AR6001 registers
++ * that may be directly manipulated by Host software.
++ */
++
++#ifndef __AR6KHWREG_H__
++#define __AR6KHWREG_H__
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/* Host registers */
++#define HOST_INT_STATUS_ADDRESS 0x00000400
++#define CPU_INT_STATUS_ADDRESS 0x00000401
++#define ERROR_INT_STATUS_ADDRESS 0x00000402
++#define INT_STATUS_ENABLE_ADDRESS 0x00000418
++#define CPU_INT_STATUS_ENABLE_ADDRESS 0x00000419
++#define COUNT_ADDRESS 0x00000420
++#define COUNT_DEC_ADDRESS 0x00000440
++#define WINDOW_DATA_ADDRESS 0x00000474
++#define WINDOW_WRITE_ADDR_ADDRESS 0x00000478
++#define WINDOW_READ_ADDR_ADDRESS 0x0000047c
++
++/* Target addresses */
++#define RESET_CONTROL_ADDRESS 0x0c000000
++#define MC_REMAP_VALID_ADDRESS 0x0c004080
++#define MC_REMAP_SIZE_ADDRESS 0x0c004100
++#define MC_REMAP_COMPARE_ADDRESS 0x0c004180
++#define MC_REMAP_TARGET_ADDRESS 0x0c004200
++#define LOCAL_COUNT_ADDRESS 0x0c014080
++#define LOCAL_SCRATCH_ADDRESS 0x0c0140c0
++
++
++#define INT_STATUS_ENABLE_ERROR_MSB 7
++#define INT_STATUS_ENABLE_ERROR_LSB 7
++#define INT_STATUS_ENABLE_ERROR_MASK 0x00000080
++#define INT_STATUS_ENABLE_ERROR_GET(x) (((x) & INT_STATUS_ENABLE_ERROR_MASK) >> INT_STATUS_ENABLE_ERROR_LSB)
++#define INT_STATUS_ENABLE_ERROR_SET(x) (((x) << INT_STATUS_ENABLE_ERROR_LSB) & INT_STATUS_ENABLE_ERROR_MASK)
++
++#define INT_STATUS_ENABLE_CPU_MSB 6
++#define INT_STATUS_ENABLE_CPU_LSB 6
++#define INT_STATUS_ENABLE_CPU_MASK 0x00000040
++#define INT_STATUS_ENABLE_CPU_GET(x) (((x) & INT_STATUS_ENABLE_CPU_MASK) >> INT_STATUS_ENABLE_CPU_LSB)
++#define INT_STATUS_ENABLE_CPU_SET(x) (((x) << INT_STATUS_ENABLE_CPU_LSB) & INT_STATUS_ENABLE_CPU_MASK)
++
++#define INT_STATUS_ENABLE_COUNTER_MSB 4
++#define INT_STATUS_ENABLE_COUNTER_LSB 4
++#define INT_STATUS_ENABLE_COUNTER_MASK 0x00000010
++#define INT_STATUS_ENABLE_COUNTER_GET(x) (((x) & INT_STATUS_ENABLE_COUNTER_MASK) >> INT_STATUS_ENABLE_COUNTER_LSB)
++#define INT_STATUS_ENABLE_COUNTER_SET(x) (((x) << INT_STATUS_ENABLE_COUNTER_LSB) & INT_STATUS_ENABLE_COUNTER_MASK)
++
++#define INT_STATUS_ENABLE_MBOX_DATA_MSB 3
++#define INT_STATUS_ENABLE_MBOX_DATA_LSB 0
++#define INT_STATUS_ENABLE_MBOX_DATA_MASK 0x0000000f
++#define INT_STATUS_ENABLE_MBOX_DATA_GET(x) (((x) & INT_STATUS_ENABLE_MBOX_DATA_MASK) >> INT_STATUS_ENABLE_MBOX_DATA_LSB)
++#define INT_STATUS_ENABLE_MBOX_DATA_SET(x) (((x) << INT_STATUS_ENABLE_MBOX_DATA_LSB) & INT_STATUS_ENABLE_MBOX_DATA_MASK)
++
++#define ERROR_STATUS_ENABLE_RX_UNDERFLOW_MSB 1
++#define ERROR_STATUS_ENABLE_RX_UNDERFLOW_LSB 1
++#define ERROR_STATUS_ENABLE_RX_UNDERFLOW_MASK 0x00000002
++#define ERROR_STATUS_ENABLE_RX_UNDERFLOW_GET(x) (((x) & ERROR_STATUS_ENABLE_RX_UNDERFLOW_MASK) >> ERROR_STATUS_ENABLE_RX_UNDERFLOW_LSB)
++#define ERROR_STATUS_ENABLE_RX_UNDERFLOW_SET(x) (((x) << ERROR_STATUS_ENABLE_RX_UNDERFLOW_LSB) & ERROR_STATUS_ENABLE_RX_UNDERFLOW_MASK)
++
++#define ERROR_STATUS_ENABLE_TX_OVERFLOW_MSB 0
++#define ERROR_STATUS_ENABLE_TX_OVERFLOW_LSB 0
++#define ERROR_STATUS_ENABLE_TX_OVERFLOW_MASK 0x00000001
++#define ERROR_STATUS_ENABLE_TX_OVERFLOW_GET(x) (((x) & ERROR_STATUS_ENABLE_TX_OVERFLOW_MASK) >> ERROR_STATUS_ENABLE_TX_OVERFLOW_LSB)
++#define ERROR_STATUS_ENABLE_TX_OVERFLOW_SET(x) (((x) << ERROR_STATUS_ENABLE_TX_OVERFLOW_LSB) & ERROR_STATUS_ENABLE_TX_OVERFLOW_MASK)
++
++
++#define CPU_INT_STATUS_ENABLE_BIT_MSB 7
++#define CPU_INT_STATUS_ENABLE_BIT_LSB 0
++#define CPU_INT_STATUS_ENABLE_BIT_MASK 0x000000ff
++#define CPU_INT_STATUS_ENABLE_BIT_GET(x) (((x) & CPU_INT_STATUS_ENABLE_BIT_MASK) >> CPU_INT_STATUS_ENABLE_BIT_LSB)
++#define CPU_INT_STATUS_ENABLE_BIT_SET(x) (((x) << CPU_INT_STATUS_ENABLE_BIT_LSB) & CPU_INT_STATUS_ENABLE_BIT_MASK)
++
++#define COUNTER_INT_STATUS_ENABLE_BIT_MSB 7
++#define COUNTER_INT_STATUS_ENABLE_BIT_LSB 0
++#define COUNTER_INT_STATUS_ENABLE_BIT_MASK 0x000000ff
++#define COUNTER_INT_STATUS_ENABLE_BIT_GET(x) (((x) & COUNTER_INT_STATUS_ENABLE_BIT_MASK) >> COUNTER_INT_STATUS_ENABLE_BIT_LSB)
++#define COUNTER_INT_STATUS_ENABLE_BIT_SET(x) (((x) << COUNTER_INT_STATUS_ENABLE_BIT_LSB) & COUNTER_INT_STATUS_ENABLE_BIT_MASK)
++
++#define ERROR_INT_STATUS_WAKEUP_MSB 2
++#define ERROR_INT_STATUS_WAKEUP_LSB 2
++#define ERROR_INT_STATUS_WAKEUP_MASK 0x00000004
++#define ERROR_INT_STATUS_WAKEUP_GET(x) (((x) & ERROR_INT_STATUS_WAKEUP_MASK) >> ERROR_INT_STATUS_WAKEUP_LSB)
++#define ERROR_INT_STATUS_WAKEUP_SET(x) (((x) << ERROR_INT_STATUS_WAKEUP_LSB) & ERROR_INT_STATUS_WAKEUP_MASK)
++
++#define ERROR_INT_STATUS_RX_UNDERFLOW_MSB 1
++#define ERROR_INT_STATUS_RX_UNDERFLOW_LSB 1
++#define ERROR_INT_STATUS_RX_UNDERFLOW_MASK 0x00000002
++#define ERROR_INT_STATUS_RX_UNDERFLOW_GET(x) (((x) & ERROR_INT_STATUS_RX_UNDERFLOW_MASK) >> ERROR_INT_STATUS_RX_UNDERFLOW_LSB)
++#define ERROR_INT_STATUS_RX_UNDERFLOW_SET(x) (((x) << ERROR_INT_STATUS_RX_UNDERFLOW_LSB) & ERROR_INT_STATUS_RX_UNDERFLOW_MASK)
++
++#define ERROR_INT_STATUS_TX_OVERFLOW_MSB 0
++#define ERROR_INT_STATUS_TX_OVERFLOW_LSB 0
++#define ERROR_INT_STATUS_TX_OVERFLOW_MASK 0x00000001
++#define ERROR_INT_STATUS_TX_OVERFLOW_GET(x) (((x) & ERROR_INT_STATUS_TX_OVERFLOW_MASK) >> ERROR_INT_STATUS_TX_OVERFLOW_LSB)
++#define ERROR_INT_STATUS_TX_OVERFLOW_SET(x) (((x) << ERROR_INT_STATUS_TX_OVERFLOW_LSB) & ERROR_INT_STATUS_TX_OVERFLOW_MASK)
++
++#define HOST_INT_STATUS_ERROR_MSB 7
++#define HOST_INT_STATUS_ERROR_LSB 7
++#define HOST_INT_STATUS_ERROR_MASK 0x00000080
++#define HOST_INT_STATUS_ERROR_GET(x) (((x) & HOST_INT_STATUS_ERROR_MASK) >> HOST_INT_STATUS_ERROR_LSB)
++#define HOST_INT_STATUS_ERROR_SET(x) (((x) << HOST_INT_STATUS_ERROR_LSB) & HOST_INT_STATUS_ERROR_MASK)
++
++#define HOST_INT_STATUS_CPU_MSB 6
++#define HOST_INT_STATUS_CPU_LSB 6
++#define HOST_INT_STATUS_CPU_MASK 0x00000040
++#define HOST_INT_STATUS_CPU_GET(x) (((x) & HOST_INT_STATUS_CPU_MASK) >> HOST_INT_STATUS_CPU_LSB)
++#define HOST_INT_STATUS_CPU_SET(x) (((x) << HOST_INT_STATUS_CPU_LSB) & HOST_INT_STATUS_CPU_MASK)
++
++#define HOST_INT_STATUS_COUNTER_MSB 4
++#define HOST_INT_STATUS_COUNTER_LSB 4
++#define HOST_INT_STATUS_COUNTER_MASK 0x00000010
++#define HOST_INT_STATUS_COUNTER_GET(x) (((x) & HOST_INT_STATUS_COUNTER_MASK) >> HOST_INT_STATUS_COUNTER_LSB)
++#define HOST_INT_STATUS_COUNTER_SET(x) (((x) << HOST_INT_STATUS_COUNTER_LSB) & HOST_INT_STATUS_COUNTER_MASK)
++
++#define RESET_CONTROL_WARM_RST_MSB 7
++#define RESET_CONTROL_WARM_RST_LSB 7
++#define RESET_CONTROL_WARM_RST_MASK 0x00000080
++#define RESET_CONTROL_WARM_RST_GET(x) (((x) & RESET_CONTROL_WARM_RST_MASK) >> RESET_CONTROL_WARM_RST_LSB)
++#define RESET_CONTROL_WARM_RST_SET(x) (((x) << RESET_CONTROL_WARM_RST_LSB) & RESET_CONTROL_WARM_RST_MASK)
++
++#define RESET_CONTROL_COLD_RST_MSB 8
++#define RESET_CONTROL_COLD_RST_LSB 8
++#define RESET_CONTROL_COLD_RST_MASK 0x00000100
++#define RESET_CONTROL_COLD_RST_GET(x) (((x) & RESET_CONTROL_COLD_RST_MASK) >> RESET_CONTROL_COLD_RST_LSB)
++#define RESET_CONTROL_COLD_RST_SET(x) (((x) << RESET_CONTROL_COLD_RST_LSB) & RESET_CONTROL_COLD_RST_MASK)
++
++#define RESET_CAUSE_LAST_MSB 2
++#define RESET_CAUSE_LAST_LSB 0
++#define RESET_CAUSE_LAST_MASK 0x00000007
++#define RESET_CAUSE_LAST_GET(x) (((x) & RESET_CAUSE_LAST_MASK) >> RESET_CAUSE_LAST_LSB)
++#define RESET_CAUSE_LAST_SET(x) (((x) << RESET_CAUSE_LAST_LSB) & RESET_CAUSE_LAST_MASK)
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* __AR6KHWREG_H__ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/AR6K_version.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/AR6K_version.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/AR6K_version.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/AR6K_version.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,36 @@
++#define __VER_MAJOR_ 2
++#define __VER_MINOR_ 0
++#define __VER_PATCH_ 0
++
++
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ * The makear6ksdk script (used for release builds) modifies the following line.
++ */
++#define __BUILD_NUMBER_ 18
++
++
++/* Format of the version number. */
++#define VER_MAJOR_BIT_OFFSET 28
++#define VER_MINOR_BIT_OFFSET 24
++#define VER_PATCH_BIT_OFFSET 16
++#define VER_BUILD_NUM_BIT_OFFSET 0
++
++
++/*
++ * The version has the following format:
++ * Bits 28-31: Major version
++ * Bits 24-27: Minor version
++ * Bits 16-23: Patch version
++ * Bits 0-15: Build number (automatically generated during build process )
++ * E.g. Build 1.1.3.7 would be represented as 0x11030007.
++ *
++ * DO NOT split the following macro into multiple lines as this may confuse the build scripts.
++ */
++#define AR6K_SW_VERSION ( ( __VER_MAJOR_ << VER_MAJOR_BIT_OFFSET ) + ( __VER_MINOR_ << VER_MINOR_BIT_OFFSET ) + ( __VER_PATCH_ << VER_PATCH_BIT_OFFSET ) + ( __BUILD_NUMBER_ << VER_BUILD_NUM_BIT_OFFSET ) )
++
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/AR6K_version.h.NEW linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/AR6K_version.h.NEW
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/AR6K_version.h.NEW 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/AR6K_version.h.NEW 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,36 @@
++#define __VER_MAJOR_ 2
++#define __VER_MINOR_ 0
++#define __VER_PATCH_ 0
++
++
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ * The makear6ksdk script (used for release builds) modifies the following line.
++ */
++#define __BUILD_NUMBER_ 18
++
++
++/* Format of the version number. */
++#define VER_MAJOR_BIT_OFFSET 28
++#define VER_MINOR_BIT_OFFSET 24
++#define VER_PATCH_BIT_OFFSET 16
++#define VER_BUILD_NUM_BIT_OFFSET 0
++
++
++/*
++ * The version has the following format:
++ * Bits 28-31: Major version
++ * Bits 24-27: Minor version
++ * Bits 16-23: Patch version
++ * Bits 0-15: Build number (automatically generated during build process )
++ * E.g. Build 1.1.3.7 would be represented as 0x11030007.
++ *
++ * DO NOT split the following macro into multiple lines as this may confuse the build scripts.
++ */
++#define AR6K_SW_VERSION ( ( __VER_MAJOR_ << VER_MAJOR_BIT_OFFSET ) + ( __VER_MINOR_ << VER_MINOR_BIT_OFFSET ) + ( __VER_PATCH_ << VER_PATCH_BIT_OFFSET ) + ( __BUILD_NUMBER_ << VER_BUILD_NUM_BIT_OFFSET ) )
++
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/athdefs.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/athdefs.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/athdefs.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/athdefs.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,85 @@
++#ifndef __ATHDEFS_H__
++#define __ATHDEFS_H__
++
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ * This file contains definitions that may be used across both
++ * Host and Target software. Nothing here is module-dependent
++ * or platform-dependent.
++ */
++
++/*
++ * Generic error codes that can be used by hw, sta, ap, sim, dk
++ * and any other environments. Since these are enums, feel free to
++ * add any more codes that you need.
++ */
++
++typedef enum {
++ A_ERROR = -1, /* Generic error return */
++ A_OK = 0, /* success */
++ /* Following values start at 1 */
++ A_DEVICE_NOT_FOUND, /* not able to find PCI device */
++ A_NO_MEMORY, /* not able to allocate memory, not available */
++ A_MEMORY_NOT_AVAIL, /* memory region is not free for mapping */
++ A_NO_FREE_DESC, /* no free descriptors available */
++ A_BAD_ADDRESS, /* address does not match descriptor */
++ A_WIN_DRIVER_ERROR, /* used in NT_HW version, if problem at init */
++ A_REGS_NOT_MAPPED, /* registers not correctly mapped */
++ A_EPERM, /* Not superuser */
++ A_EACCES, /* Access denied */
++ A_ENOENT, /* No such entry, search failed, etc. */
++ A_EEXIST, /* The object already exists (can't create) */
++ A_EFAULT, /* Bad address fault */
++ A_EBUSY, /* Object is busy */
++ A_EINVAL, /* Invalid parameter */
++ A_EMSGSIZE, /* Inappropriate message buffer length */
++ A_ECANCELED, /* Operation canceled */
++ A_ENOTSUP, /* Operation not supported */
++ A_ECOMM, /* Communication error on send */
++ A_EPROTO, /* Protocol error */
++ A_ENODEV, /* No such device */
++ A_EDEVNOTUP, /* device is not UP */
++ A_NO_RESOURCE, /* No resources for requested operation */
++ A_HARDWARE, /* Hardware failure */
++ A_PENDING, /* Asynchronous routine; will send up results la
++ter (typically in callback) */
++ A_EBADCHANNEL, /* The channel cannot be used */
++ A_DECRYPT_ERROR, /* Decryption error */
++ A_PHY_ERROR, /* RX PHY error */
++ A_CONSUMED /* Object was consumed */
++} A_STATUS;
++
++#define A_SUCCESS(x) (x == A_OK)
++#define A_FAILED(x) (!A_SUCCESS(x))
++
++#ifndef TRUE
++#define TRUE 1
++#endif
++
++#ifndef FALSE
++#define FALSE 0
++#endif
++
++/*
++ * The following definition is WLAN specific definition
++ */
++typedef enum {
++ MODE_11A = 0, /* 11a Mode */
++ MODE_11G = 1, /* 11g + 11b Mode */
++ MODE_11B = 2, /* 11b Mode */
++ MODE_11GONLY = 3, /* 11g only Mode */
++ MODE_UNKNOWN = 4,
++ MODE_MAX = 4
++} WLAN_PHY_MODE;
++
++typedef enum {
++ WLAN_11A_CAPABILITY = 1,
++ WLAN_11G_CAPABILITY = 2,
++ WLAN_11AG_CAPABILITY = 3,
++}WLAN_CAPABILITY;
++
++#endif /* __ATHDEFS_H__ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/athdrv.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/athdrv.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/athdrv.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/athdrv.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,32 @@
++/*
++ * Copyright (c) 2004-2006 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef _ATHDRV_H_
++#define _ATHDRV_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _ATHDRV_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/athendpack.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/athendpack.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/athendpack.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/athendpack.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,41 @@
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ * @file: athendpack.h
++ *
++ * @abstract: end compiler-specific structure packing
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++#ifdef VXWORKS
++#endif /* VXWORKS */
++
++#ifdef LINUX
++#endif /* LINUX */
++
++#ifdef QNX
++#endif /* QNX */
++
++#ifdef INTEGRITY
++#include "integrity/athendpack_integrity.h"
++#endif /* INTEGRITY */
++
++#ifdef NUCLEUS
++#endif /* NUCLEUS */
++
++#ifdef UNDER_CE
++#include "../os/wince/include/athendpack_wince.h"
++#endif /* WINCE */
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/athstartpack.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/athstartpack.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/athstartpack.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/athstartpack.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,42 @@
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ * @file: athstartpack.h
++ *
++ * @abstract: start compiler-specific structure packing
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifdef VXWORKS
++#endif /* VXWORKS */
++
++#ifdef LINUX
++#endif /* LINUX */
++
++#ifdef QNX
++#endif /* QNX */
++
++#ifdef INTEGRITY
++#include "integrity/athstartpack_integrity.h"
++#endif /* INTEGRITY */
++
++#ifdef NUCLEUS
++#endif /* NUCLEUS */
++
++#ifdef UNDER_CE
++#include "../os/wince/include/athstartpack_wince.h"
++#endif /* WINCE */
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/a_types.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/a_types.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/a_types.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/a_types.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,28 @@
++#ifndef _A_TYPES_H_
++#define _A_TYPES_H_
++/*
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/include/a_types.h#1 $
++ *
++ * This file contains the definitions of the basic atheros data types.
++ * It is used to map the data types in atheros files to a platform specific
++ * type.
++ *
++ * Copyright 2003-2005 Atheros Communications, Inc., All Rights Reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "../ar6000/athtypes_linux.h"
++
++#endif /* _ATHTYPES_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/bmi.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/bmi.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/bmi.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/bmi.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,100 @@
++#ifndef _BMI_H_
++#define _BMI_H_
++/*
++ * Copyright (c) 2004-2005 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ * BMI declarations and prototypes
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif /* __cplusplus */
++
++/* Header files */
++#include "a_config.h"
++#include "athdefs.h"
++#include "a_types.h"
++#include "hif.h"
++#include "a_osapi.h"
++#include "bmi_msg.h"
++
++void
++BMIInit(void);
++
++A_STATUS
++BMIDone(HIF_DEVICE *device);
++
++A_STATUS
++BMIGetTargetInfo(HIF_DEVICE *device, struct bmi_target_info *targ_info);
++
++A_STATUS
++BMIReadMemory(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UCHAR *buffer,
++ A_UINT32 length);
++
++A_STATUS
++BMIWriteMemory(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UCHAR *buffer,
++ A_UINT32 length);
++
++A_STATUS
++BMIExecute(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UINT32 *param);
++
++A_STATUS
++BMISetAppStart(HIF_DEVICE *device,
++ A_UINT32 address);
++
++A_STATUS
++BMIReadSOCRegister(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UINT32 *param);
++
++A_STATUS
++BMIWriteSOCRegister(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UINT32 param);
++
++A_STATUS
++BMIrompatchInstall(HIF_DEVICE *device,
++ A_UINT32 ROM_addr,
++ A_UINT32 RAM_addr,
++ A_UINT32 nbytes,
++ A_UINT32 do_activate,
++ A_UINT32 *patch_id);
++
++A_STATUS
++BMIrompatchUninstall(HIF_DEVICE *device,
++ A_UINT32 rompatch_id);
++
++A_STATUS
++BMIrompatchActivate(HIF_DEVICE *device,
++ A_UINT32 rompatch_count,
++ A_UINT32 *rompatch_list);
++
++A_STATUS
++BMIrompatchDeactivate(HIF_DEVICE *device,
++ A_UINT32 rompatch_count,
++ A_UINT32 *rompatch_list);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _BMI_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/bmi_msg.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/bmi_msg.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/bmi_msg.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/bmi_msg.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,199 @@
++#ifndef __BMI_MSG_H__
++#define __BMI_MSG_H__
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++/*
++ * Bootloader Messaging Interface (BMI)
++ *
++ * BMI is a very simple messaging interface used during initialization
++ * to read memory, write memory, execute code, and to define an
++ * application entry PC.
++ *
++ * It is used to download an application to AR6K, to provide
++ * patches to code that is already resident on AR6K, and generally
++ * to examine and modify state. The Host has an opportunity to use
++ * BMI only once during bootup. Once the Host issues a BMI_DONE
++ * command, this opportunity ends.
++ *
++ * The Host writes BMI requests to mailbox0, and reads BMI responses
++ * from mailbox0. BMI requests all begin with a command
++ * (see below for specific commands), and are followed by
++ * command-specific data.
++ *
++ * Flow control:
++ * The Host can only issue a command once the Target gives it a
++ * "BMI Command Credit", using AR6K Counter #4. As soon as the
++ * Target has completed a command, it issues another BMI Command
++ * Credit (so the Host can issue the next command).
++ *
++ * BMI handles all required Target-side cache flushing.
++ */
++
++
++/* Maximum data size used for BMI transfers */
++#define BMI_DATASZ_MAX 32
++
++/* BMI Commands */
++
++#define BMI_NO_COMMAND 0
++
++#define BMI_DONE 1
++ /*
++ * Semantics: Host is done using BMI
++ * Request format:
++ * A_UINT32 command (BMI_DONE)
++ * Response format: none
++ */
++
++#define BMI_READ_MEMORY 2
++ /*
++ * Semantics: Host reads AR6K memory
++ * Request format:
++ * A_UINT32 command (BMI_READ_MEMORY)
++ * A_UINT32 address
++ * A_UINT32 length, at most BMI_DATASZ_MAX
++ * Response format:
++ * A_UINT8 data[length]
++ */
++
++#define BMI_WRITE_MEMORY 3
++ /*
++ * Semantics: Host writes AR6K memory
++ * Request format:
++ * A_UINT32 command (BMI_WRITE_MEMORY)
++ * A_UINT32 address
++ * A_UINT32 length, at most BMI_DATASZ_MAX
++ * A_UINT8 data[length]
++ * Response format: none
++ */
++
++#define BMI_EXECUTE 4
++ /*
++ * Semantics: Causes AR6K to execute code
++ * Request format:
++ * A_UINT32 command (BMI_EXECUTE)
++ * A_UINT32 address
++ * A_UINT32 parameter
++ * Response format:
++ * A_UINT32 return value
++ */
++
++#define BMI_SET_APP_START 5
++ /*
++ * Semantics: Set Target application starting address
++ * Request format:
++ * A_UINT32 command (BMI_SET_APP_START)
++ * A_UINT32 address
++ * Response format: none
++ */
++
++#define BMI_READ_SOC_REGISTER 6
++ /*
++ * Semantics: Read a 32-bit Target SOC register.
++ * Request format:
++ * A_UINT32 command (BMI_READ_REGISTER)
++ * A_UINT32 address
++ * Response format:
++ * A_UINT32 value
++ */
++
++#define BMI_WRITE_SOC_REGISTER 7
++ /*
++ * Semantics: Write a 32-bit Target SOC register.
++ * Request format:
++ * A_UINT32 command (BMI_WRITE_REGISTER)
++ * A_UINT32 address
++ * A_UINT32 value
++ *
++ * Response format: none
++ */
++
++#define BMI_GET_TARGET_ID 8
++#define BMI_GET_TARGET_INFO 8
++ /*
++ * Semantics: Fetch the 4-byte Target information
++ * Request format:
++ * A_UINT32 command (BMI_GET_TARGET_ID/INFO)
++ * Response format1 (old firmware):
++ * A_UINT32 TargetVersionID
++ * Response format2 (newer firmware):
++ * A_UINT32 TARGET_VERSION_SENTINAL
++ * struct bmi_target_info;
++ */
++
++struct bmi_target_info {
++ A_UINT32 target_info_byte_count; /* size of this structure */
++ A_UINT32 target_ver; /* Target Version ID */
++ A_UINT32 target_type; /* Target type */
++};
++#define TARGET_VERSION_SENTINAL 0xffffffff
++#define TARGET_TYPE_AR6001 1
++#define TARGET_TYPE_AR6002 2
++
++
++#define BMI_ROMPATCH_INSTALL 9
++ /*
++ * Semantics: Install a ROM Patch.
++ * Request format:
++ * A_UINT32 command (BMI_ROMPATCH_INSTALL)
++ * A_UINT32 Target ROM Address
++ * A_UINT32 Target RAM Address
++ * A_UINT32 Size, in bytes
++ * A_UINT32 Activate? 1-->activate;
++ * 0-->install but do not activate
++ * Response format:
++ * A_UINT32 PatchID
++ */
++
++#define BMI_ROMPATCH_UNINSTALL 10
++ /*
++ * Semantics: Uninstall a previously-installed ROM Patch,
++ * automatically deactivating, if necessary.
++ * Request format:
++ * A_UINT32 command (BMI_ROMPATCH_UNINSTALL)
++ * A_UINT32 PatchID
++ *
++ * Response format: none
++ */
++
++#define BMI_ROMPATCH_ACTIVATE 11
++ /*
++ * Semantics: Activate a list of previously-installed ROM Patches.
++ * Request format:
++ * A_UINT32 command (BMI_ROMPATCH_ACTIVATE)
++ * A_UINT32 rompatch_count
++ * A_UINT32 PatchID[rompatch_count]
++ *
++ * Response format: none
++ */
++
++#define BMI_ROMPATCH_DEACTIVATE 12
++ /*
++ * Semantics: Deactivate a list of active ROM Patches.
++ * Request format:
++ * A_UINT32 command (BMI_ROMPATCH_DEACTIVATE)
++ * A_UINT32 rompatch_count
++ * A_UINT32 PatchID[rompatch_count]
++ *
++ * Response format: none
++ */
++
++
++#endif /* __BMI_MSG_H__ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/common_drv.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/common_drv.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/common_drv.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/common_drv.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,61 @@
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++
++#ifndef COMMON_DRV_H_
++#define COMMON_DRV_H_
++
++#include "hif.h"
++#include "htc_packet.h"
++
++
++
++/* structure that is the state information for the default credit distribution callback
++ * drivers should instantiate (zero-init as well) this structure in their driver instance
++ * and pass it as a context to the HTC credit distribution functions */
++typedef struct _COMMON_CREDIT_STATE_INFO {
++ int TotalAvailableCredits; /* total credits in the system at startup */
++ int CurrentFreeCredits; /* credits available in the pool that have not been
++ given out to endpoints */
++ HTC_ENDPOINT_CREDIT_DIST *pLowestPriEpDist; /* pointer to the lowest priority endpoint dist struct */
++} COMMON_CREDIT_STATE_INFO;
++
++
++/* HTC TX packet tagging definitions */
++#define AR6K_CONTROL_PKT_TAG HTC_TX_PACKET_TAG_USER_DEFINED
++#define AR6K_DATA_PKT_TAG (AR6K_CONTROL_PKT_TAG + 1)
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/* OS-independent APIs */
++A_STATUS ar6000_setup_credit_dist(HTC_HANDLE HTCHandle, COMMON_CREDIT_STATE_INFO *pCredInfo);
++A_STATUS ar6000_ReadRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data);
++A_STATUS ar6000_WriteRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data);
++A_STATUS ar6000_ReadDataDiag(HIF_DEVICE *hifDevice, A_UINT32 address, A_UCHAR *data, A_UINT32 length);
++A_STATUS ar6000_reset_device(HIF_DEVICE *hifDevice, A_UINT32 TargetType);
++void ar6000_dump_target_assert_info(HIF_DEVICE *hifDevice, A_UINT32 TargetType);
++A_STATUS ar6000_reset_device_skipflash(HIF_DEVICE *hifDevice);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /*COMMON_DRV_H_*/
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/dbglog_api.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/dbglog_api.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/dbglog_api.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/dbglog_api.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,46 @@
++#ifndef _DBGLOG_API_H_
++#define _DBGLOG_API_H_
++/*
++ * Copyright (c) 2004-2006 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ * This file contains host side debug primitives.
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include "dbglog.h"
++
++#define DBGLOG_HOST_LOG_BUFFER_SIZE DBGLOG_LOG_BUFFER_SIZE
++
++#define DBGLOG_GET_DBGID(arg) \
++ ((arg & DBGLOG_DBGID_MASK) >> DBGLOG_DBGID_OFFSET)
++
++#define DBGLOG_GET_MODULEID(arg) \
++ ((arg & DBGLOG_MODULEID_MASK) >> DBGLOG_MODULEID_OFFSET)
++
++#define DBGLOG_GET_NUMARGS(arg) \
++ ((arg & DBGLOG_NUM_ARGS_MASK) >> DBGLOG_NUM_ARGS_OFFSET)
++
++#define DBGLOG_GET_TIMESTAMP(arg) \
++ ((arg & DBGLOG_TIMESTAMP_MASK) >> DBGLOG_TIMESTAMP_OFFSET)
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _DBGLOG_API_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/dbglog.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/dbglog.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/dbglog.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/dbglog.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,107 @@
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ * This file contains the definitions and data structures associated with
++ * the log based debug mechanism.
++ *
++ */
++
++#ifndef _DBGLOG_H_
++#define _DBGLOG_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#define DBGLOG_TIMESTAMP_OFFSET 0
++#define DBGLOG_TIMESTAMP_MASK 0x0000FFFF /* Bit 0-15. Contains bit
++ 8-23 of the LF0 timer */
++#define DBGLOG_DBGID_OFFSET 16
++#define DBGLOG_DBGID_MASK 0x03FF0000 /* Bit 16-25 */
++#define DBGLOG_DBGID_NUM_MAX 256 /* Upper limit is width of mask */
++
++#define DBGLOG_MODULEID_OFFSET 26
++#define DBGLOG_MODULEID_MASK 0x3C000000 /* Bit 26-29 */
++#define DBGLOG_MODULEID_NUM_MAX 16 /* Upper limit is width of mask */
++
++/*
++ * Please ensure that the definition of any new module intrduced is captured
++ * between the DBGLOG_MODULEID_START and DBGLOG_MODULEID_END defines. The
++ * structure is required for the parser to correctly pick up the values for
++ * different modules.
++ */
++#define DBGLOG_MODULEID_START
++#define DBGLOG_MODULEID_INF 0
++#define DBGLOG_MODULEID_WMI 1
++#define DBGLOG_MODULEID_CSERV 2
++#define DBGLOG_MODULEID_PM 3
++#define DBGLOG_MODULEID_TXRX_MGMTBUF 4
++#define DBGLOG_MODULEID_TXRX_TXBUF 5
++#define DBGLOG_MODULEID_TXRX_RXBUF 6
++#define DBGLOG_MODULEID_WOW 7
++#define DBGLOG_MODULEID_WHAL 8
++#define DBGLOG_MODULEID_END
++
++#define DBGLOG_NUM_ARGS_OFFSET 30
++#define DBGLOG_NUM_ARGS_MASK 0xC0000000 /* Bit 30-31 */
++#define DBGLOG_NUM_ARGS_MAX 2 /* Upper limit is width of mask */
++
++#define DBGLOG_MODULE_LOG_ENABLE_OFFSET 0
++#define DBGLOG_MODULE_LOG_ENABLE_MASK 0x0000FFFF
++
++#define DBGLOG_REPORTING_ENABLED_OFFSET 16
++#define DBGLOG_REPORTING_ENABLED_MASK 0x00010000
++
++#define DBGLOG_TIMESTAMP_RESOLUTION_OFFSET 17
++#define DBGLOG_TIMESTAMP_RESOLUTION_MASK 0x000E0000
++
++#define DBGLOG_REPORT_SIZE_OFFSET 20
++#define DBGLOG_REPORT_SIZE_MASK 0x3FF00000
++
++#define DBGLOG_LOG_BUFFER_SIZE 1500
++#define DBGLOG_DBGID_DEFINITION_LEN_MAX 64
++
++struct dbglog_buf_s {
++ struct dbglog_buf_s *next;
++ A_INT8 *buffer;
++ A_UINT32 bufsize;
++ A_UINT32 length;
++ A_UINT32 count;
++ A_UINT32 free;
++};
++
++struct dbglog_hdr_s {
++ struct dbglog_buf_s *dbuf;
++ A_UINT32 dropped;
++};
++
++struct dbglog_config_s {
++ A_UINT32 cfgvalid; /* Mask with valid config bits */
++ union {
++ /* TODO: Take care of endianness */
++ struct {
++ A_UINT32 mmask:16; /* Mask of modules with logging on */
++ A_UINT32 rep:1; /* Reporting enabled or not */
++ A_UINT32 tsr:3; /* Time stamp resolution. Def: 1 ms */
++ A_UINT32 size:10; /* Report size in number of messages */
++ A_UINT32 reserved:2;
++ } dbglog_config;
++
++ A_UINT32 value;
++ } u;
++};
++
++#define cfgmmask u.dbglog_config.mmask
++#define cfgrep u.dbglog_config.rep
++#define cfgtsr u.dbglog_config.tsr
++#define cfgsize u.dbglog_config.size
++#define cfgvalue u.value
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _DBGLOG_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/dbglog_id.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/dbglog_id.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/dbglog_id.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/dbglog_id.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,307 @@
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ * This file contains the definitions of the debug identifiers for different
++ * modules.
++ *
++ */
++
++#ifndef _DBGLOG_ID_H_
++#define _DBGLOG_ID_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*
++ * The nomenclature for the debug identifiers is MODULE_DESCRIPTION.
++ * Please ensure that the definition of any new debugid introduced is captured
++ * between the <MODULE>_DBGID_DEFINITION_START and
++ * <MODULE>_DBGID_DEFINITION_END defines. The structure is required for the
++ * parser to correctly pick up the values for different debug identifiers.
++ */
++
++/* INF debug identifier definitions */
++#define INF_DBGID_DEFINITION_START
++#define INF_ASSERTION_FAILED 1
++#define INF_TARGET_ID 2
++#define INF_DBGID_DEFINITION_END
++
++/* WMI debug identifier definitions */
++#define WMI_DBGID_DEFINITION_START
++#define WMI_CMD_RX_XTND_PKT_TOO_SHORT 1
++#define WMI_EXTENDED_CMD_NOT_HANDLED 2
++#define WMI_CMD_RX_PKT_TOO_SHORT 3
++#define WMI_CALLING_WMI_EXTENSION_FN 4
++#define WMI_CMD_NOT_HANDLED 5
++#define WMI_IN_SYNC 6
++#define WMI_TARGET_WMI_SYNC_CMD 7
++#define WMI_SET_SNR_THRESHOLD_PARAMS 8
++#define WMI_SET_RSSI_THRESHOLD_PARAMS 9
++#define WMI_SET_LQ_TRESHOLD_PARAMS 10
++#define WMI_TARGET_CREATE_PSTREAM_CMD 11
++#define WMI_WI_DTM_INUSE 12
++#define WMI_TARGET_DELETE_PSTREAM_CMD 13
++#define WMI_TARGET_IMPLICIT_DELETE_PSTREAM_CMD 14
++#define WMI_TARGET_GET_BIT_RATE_CMD 15
++#define WMI_GET_RATE_MASK_CMD_FIX_RATE_MASK_IS 16
++#define WMI_TARGET_GET_AVAILABLE_CHANNELS_CMD 17
++#define WMI_TARGET_GET_TX_PWR_CMD 18
++#define WMI_FREE_EVBUF_WMIBUF 19
++#define WMI_FREE_EVBUF_DATABUF 20
++#define WMI_FREE_EVBUF_BADFLAG 21
++#define WMI_HTC_RX_ERROR_DATA_PACKET 22
++#define WMI_HTC_RX_SYNC_PAUSING_FOR_MBOX 23
++#define WMI_INCORRECT_WMI_DATA_HDR_DROPPING_PKT 24
++#define WMI_SENDING_READY_EVENT 25
++#define WMI_SETPOWER_MDOE_TO_MAXPERF 26
++#define WMI_SETPOWER_MDOE_TO_REC 27
++#define WMI_BSSINFO_EVENT_FROM 28
++#define WMI_TARGET_GET_STATS_CMD 29
++#define WMI_SENDING_SCAN_COMPLETE_EVENT 30
++#define WMI_SENDING_RSSI_INDB_THRESHOLD_EVENT 31
++#define WMI_SENDING_RSSI_INDBM_THRESHOLD_EVENT 32
++#define WMI_SENDING_LINK_QUALITY_THRESHOLD_EVENT 33
++#define WMI_SENDING_ERROR_REPORT_EVENT 34
++#define WMI_SENDING_CAC_EVENT 35
++#define WMI_TARGET_GET_ROAM_TABLE_CMD 36
++#define WMI_TARGET_GET_ROAM_DATA_CMD 37
++#define WMI_SENDING_GPIO_INTR_EVENT 38
++#define WMI_SENDING_GPIO_ACK_EVENT 39
++#define WMI_SENDING_GPIO_DATA_EVENT 40
++#define WMI_CMD_RX 41
++#define WMI_CMD_RX_XTND 42
++#define WMI_EVENT_SEND 43
++#define WMI_EVENT_SEND_XTND 44
++#define WMI_DBGID_DEFINITION_END
++
++/* CSERV debug identifier definitions */
++#define CSERV_DBGID_DEFINITION_START
++#define CSERV_BEGIN_SCAN1 1
++#define CSERV_BEGIN_SCAN2 2
++#define CSERV_END_SCAN1 3
++#define CSERV_END_SCAN2 4
++#define CSERV_CHAN_SCAN_START 5
++#define CSERV_CHAN_SCAN_STOP 6
++#define CSERV_CHANNEL_OPPPORTUNITY 7
++#define CSERV_NC_TIMEOUT 8
++#define CSERV_BACK_HOME 10
++#define CSERV_CHMGR_CH_CALLBACK1 11
++#define CSERV_CHMGR_CH_CALLBACK2 12
++#define CSERV_CHMGR_CH_CALLBACK3 13
++#define CSERV_SET_SCAN_PARAMS1 14
++#define CSERV_SET_SCAN_PARAMS2 15
++#define CSERV_SET_SCAN_PARAMS3 16
++#define CSERV_SET_SCAN_PARAMS4 17
++#define CSERV_ABORT_SCAN 18
++#define CSERV_NEWSTATE 19
++#define CSERV_MINCHMGR_OP_END 20
++#define CSERV_CHMGR_OP_END 21
++#define CSERV_DISCONNECT_TIMEOUT 22
++#define CSERV_ROAM_TIMEOUT 23
++#define CSERV_FORCE_SCAN1 24
++#define CSERV_FORCE_SCAN2 25
++#define CSERV_FORCE_SCAN3 26
++#define CSERV_UTIL_TIMEOUT 27
++#define CSERV_RSSIPOLLER 28
++#define CSERV_RETRY_CONNECT_TIMEOUT 29
++#define CSERV_RSSIINDBMPOLLER 30
++#define CSERV_BGSCAN_ENABLE 31
++#define CSERV_BGSCAN_DISABLE 32
++#define CSERV_WLAN_START_SCAN_CMD1 33
++#define CSERV_WLAN_START_SCAN_CMD2 34
++#define CSERV_WLAN_START_SCAN_CMD3 35
++#define CSERV_START_SCAN_CMD 36
++#define CSERV_START_FORCE_SCAN 37
++#define CSERV_NEXT_CHAN 38
++#define CSERV_SET_REGCODE 39
++#define CSERV_START_ADHOC 40
++#define CSERV_ADHOC_AT_HOME 41
++#define CSERV_OPT_AT_HOME 42
++#define CSERV_WLAN_CONNECT_CMD 43
++#define CSERV_WLAN_RECONNECT_CMD 44
++#define CSERV_WLAN_DISCONNECT_CMD 45
++#define CSERV_BSS_CHANGE_CHANNEL 46
++#define CSERV_BEACON_RX 47
++#define CSERV_KEEPALIVE_CHECK 48
++#define CSERV_RC_BEGIN_SCAN 49
++#define CSERV_RC_SCAN_START 50
++#define CSERV_RC_SCAN_STOP 51
++#define CSERV_RC_NEXT 52
++#define CSERV_RC_SCAN_END 53
++#define CSERV_PROBE_CALLBACK 54
++#define CSERV_ROAM1 55
++#define CSERV_ROAM2 56
++#define CSERV_ROAM3 57
++#define CSERV_CONNECT_EVENT 58
++#define CSERV_DISCONNECT_EVENT 59
++#define CSERV_BMISS_HANDLER1 60
++#define CSERV_BMISS_HANDLER2 61
++#define CSERV_BMISS_HANDLER3 62
++#define CSERV_LOWRSSI_HANDLER 63
++#define CSERV_WLAN_SET_PMKID_CMD 64
++#define CSERV_RECONNECT_REQUEST 65
++#define CSERV_KEYSPLUMBED_EVENT 66
++#define CSERV_NEW_REG 67
++#define CSERV_SET_RSSI_THOLD 68
++#define CSERV_RSSITHRESHOLDCHECK 69
++#define CSERV_RSSIINDBMTHRESHOLDCHECK 70
++#define CSERV_WLAN_SET_OPT_CMD1 71
++#define CSERV_WLAN_SET_OPT_CMD2 72
++#define CSERV_WLAN_SET_OPT_CMD3 73
++#define CSERV_WLAN_SET_OPT_CMD4 74
++#define CSERV_SCAN_CONNECT_STOP 75
++#define CSERV_BMISS_HANDLER4 76
++#define CSERV_INITIALIZE_TIMER 77
++#define CSERV_ARM_TIMER 78
++#define CSERV_DISARM_TIMER 79
++#define CSERV_UNINITIALIZE_TIMER 80
++#define CSERV_DISCONNECT_EVENT2 81
++#define CSERV_SCAN_CONNECT_START 82
++#define CSERV_BSSINFO_MEMORY_ALLOC_FAILED 83
++#define CSERV_SET_SCAN_PARAMS5 84
++#define CSERV_DBGID_DEFINITION_END
++
++/* TXRX debug identifier definitions */
++#define TXRX_TXBUF_DBGID_DEFINITION_START
++#define TXRX_TXBUF_ALLOCATE_BUF 1
++#define TXRX_TXBUF_QUEUE_BUF_TO_MBOX 2
++#define TXRX_TXBUF_QUEUE_BUF_TO_TXQ 3
++#define TXRX_TXBUF_TXQ_DEPTH 4
++#define TXRX_TXBUF_IBSS_QUEUE_TO_SFQ 5
++#define TXRX_TXBUF_IBSS_QUEUE_TO_TXQ_FRM_SFQ 6
++#define TXRX_TXBUF_INITIALIZE_TIMER 7
++#define TXRX_TXBUF_ARM_TIMER 8
++#define TXRX_TXBUF_DISARM_TIMER 9
++#define TXRX_TXBUF_UNINITIALIZE_TIMER 10
++#define TXRX_TXBUF_DBGID_DEFINITION_END
++
++#define TXRX_RXBUF_DBGID_DEFINITION_START
++#define TXRX_RXBUF_ALLOCATE_BUF 1
++#define TXRX_RXBUF_QUEUE_TO_HOST 2
++#define TXRX_RXBUF_QUEUE_TO_WLAN 3
++#define TXRX_RXBUF_ZERO_LEN_BUF 4
++#define TXRX_RXBUF_QUEUE_TO_HOST_LASTBUF_IN_RXCHAIN 5
++#define TXRX_RXBUF_LASTBUF_IN_RXCHAIN_ZEROBUF 6
++#define TXRX_RXBUF_QUEUE_EMPTY_QUEUE_TO_WLAN 7
++#define TXRX_RXBUF_SEND_TO_RECV_MGMT 8
++#define TXRX_RXBUF_SEND_TO_IEEE_LAYER 9
++#define TXRX_RXBUF_DBGID_DEFINITION_END
++
++#define TXRX_MGMTBUF_DBGID_DEFINITION_START
++#define TXRX_MGMTBUF_ALLOCATE_BUF 1
++#define TXRX_MGMTBUF_ALLOCATE_SM_BUF 2
++#define TXRX_MGMTBUF_ALLOCATE_RMBUF 3
++#define TXRX_MGMTBUF_GET_BUF 4
++#define TXRX_MGMTBUF_GET_SM_BUF 5
++#define TXRX_MGMTBUF_QUEUE_BUF_TO_TXQ 6
++#define TXRX_MGMTBUF_REAPED_BUF 7
++#define TXRX_MGMTBUF_REAPED_SM_BUF 8
++#define TXRX_MGMTBUF_WAIT_FOR_TXQ_DRAIN 9
++#define TXRX_MGMTBUF_WAIT_FOR_TXQ_SFQ_DRAIN 10
++#define TXRX_MGMTBUF_ENQUEUE_INTO_SFQ 11
++#define TXRX_MGMTBUF_DEQUEUE_FROM_SFQ 12
++#define TXRX_MGMTBUF_PAUSE_TXQ 13
++#define TXRX_MGMTBUF_RESUME_TXQ 14
++#define TXRX_MGMTBUF_WAIT_FORTXQ_DRAIN_TIMEOUT 15
++#define TXRX_MGMTBUF_DRAINQ 16
++#define TXRX_MGMTBUF_INDICATE_Q_DRAINED 17
++#define TXRX_MGMTBUF_DBGID_DEFINITION_END
++
++/* PM (Power Module) debug identifier definitions */
++#define PM_DBGID_DEFINITION_START
++#define PM_INIT 1
++#define PM_ENABLE 2
++#define PM_SET_STATE 3
++#define PM_SET_POWERMODE 4
++#define PM_CONN_NOTIFY 5
++#define PM_REF_COUNT_NEGATIVE 6
++#define PM_APSD_ENABLE 7
++#define PM_UPDATE_APSD_STATE 8
++#define PM_CHAN_OP_REQ 9
++#define PM_SET_MY_BEACON_POLICY 10
++#define PM_SET_ALL_BEACON_POLICY 11
++#define PM_SET_PM_PARAMS1 12
++#define PM_SET_PM_PARAMS2 13
++#define PM_ADHOC_SET_PM_CAPS_FAIL 14
++#define PM_ADHOC_UNKNOWN_IBSS_ATTRIB_ID 15
++#define PM_DBGID_DEFINITION_END
++
++/* Wake on Wireless debug identifier definitions */
++#define WOW_DBGID_DEFINITION_START
++#define WOW_INIT 1
++#define WOW_GET_CONFIG_DSET 2
++#define WOW_NO_CONFIG_DSET 3
++#define WOW_INVALID_CONFIG_DSET 4
++#define WOW_USE_DEFAULT_CONFIG 5
++#define WOW_SETUP_GPIO 6
++#define WOW_INIT_DONE 7
++#define WOW_SET_GPIO_PIN 8
++#define WOW_CLEAR_GPIO_PIN 9
++#define WOW_SET_WOW_MODE_CMD 10
++#define WOW_SET_HOST_MODE_CMD 11
++#define WOW_ADD_WOW_PATTERN_CMD 12
++#define WOW_NEW_WOW_PATTERN_AT_INDEX 13
++#define WOW_DEL_WOW_PATTERN_CMD 14
++#define WOW_LIST_CONTAINS_PATTERNS 15
++#define WOW_GET_WOW_LIST_CMD 16
++#define WOW_INVALID_FILTER_ID 17
++#define WOW_INVALID_FILTER_LISTID 18
++#define WOW_NO_VALID_FILTER_AT_ID 19
++#define WOW_NO_VALID_LIST_AT_ID 20
++#define WOW_NUM_PATTERNS_EXCEEDED 21
++#define WOW_NUM_LISTS_EXCEEDED 22
++#define WOW_GET_WOW_STATS 23
++#define WOW_CLEAR_WOW_STATS 24
++#define WOW_WAKEUP_HOST 25
++#define WOW_EVENT_WAKEUP_HOST 26
++#define WOW_EVENT_DISCARD 27
++#define WOW_PATTERN_MATCH 28
++#define WOW_PATTERN_NOT_MATCH 29
++#define WOW_PATTERN_NOT_MATCH_OFFSET 30
++#define WOW_DISABLED_HOST_ASLEEP 31
++#define WOW_ENABLED_HOST_ASLEEP_NO_PATTERNS 32
++#define WOW_ENABLED_HOST_ASLEEP_NO_MATCH_FOUND 33
++#define WOW_DBGID_DEFINITION_END
++
++/* WHAL debug identifier definitions */
++#define WHAL_DBGID_DEFINITION_START
++#define WHAL_ERROR_ANI_CONTROL 1
++#define WHAL_ERROR_CHIP_TEST1 2
++#define WHAL_ERROR_CHIP_TEST2 3
++#define WHAL_ERROR_EEPROM_CHECKSUM 4
++#define WHAL_ERROR_EEPROM_MACADDR 5
++#define WHAL_ERROR_INTERRUPT_HIU 6
++#define WHAL_ERROR_KEYCACHE_RESET 7
++#define WHAL_ERROR_KEYCACHE_SET 8
++#define WHAL_ERROR_KEYCACHE_TYPE 9
++#define WHAL_ERROR_KEYCACHE_TKIPENTRY 10
++#define WHAL_ERROR_KEYCACHE_WEPLENGTH 11
++#define WHAL_ERROR_PHY_INVALID_CHANNEL 12
++#define WHAL_ERROR_POWER_AWAKE 13
++#define WHAL_ERROR_POWER_SET 14
++#define WHAL_ERROR_RECV_STOPDMA 15
++#define WHAL_ERROR_RECV_STOPPCU 16
++#define WHAL_ERROR_RESET_CHANNF1 17
++#define WHAL_ERROR_RESET_CHANNF2 18
++#define WHAL_ERROR_RESET_PM 19
++#define WHAL_ERROR_RESET_OFFSETCAL 20
++#define WHAL_ERROR_RESET_RFGRANT 21
++#define WHAL_ERROR_RESET_RXFRAME 22
++#define WHAL_ERROR_RESET_STOPDMA 23
++#define WHAL_ERROR_RESET_RECOVER 24
++#define WHAL_ERROR_XMIT_COMPUTE 25
++#define WHAL_ERROR_XMIT_NOQUEUE 26
++#define WHAL_ERROR_XMIT_ACTIVEQUEUE 27
++#define WHAL_ERROR_XMIT_BADTYPE 28
++#define WHAL_DBGID_DEFINITION_END
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _DBGLOG_ID_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/dl_list.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/dl_list.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/dl_list.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/dl_list.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,114 @@
++/*
++ *
++ * Double-link list definitions (adapted from Atheros SDIO stack)
++ *
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++#ifndef __DL_LIST_H___
++#define __DL_LIST_H___
++
++#define A_CONTAINING_STRUCT(address, struct_type, field_name)\
++ ((struct_type *)((A_UINT32)(address) - (A_UINT32)(&((struct_type *)0)->field_name)))
++
++/* list functions */
++/* pointers for the list */
++typedef struct _DL_LIST {
++ struct _DL_LIST *pPrev;
++ struct _DL_LIST *pNext;
++}DL_LIST, *PDL_LIST;
++/*
++ * DL_LIST_INIT , initialize doubly linked list
++*/
++#define DL_LIST_INIT(pList)\
++ {(pList)->pPrev = pList; (pList)->pNext = pList;}
++
++#define DL_LIST_IS_EMPTY(pList) (((pList)->pPrev == (pList)) && ((pList)->pNext == (pList)))
++#define DL_LIST_GET_ITEM_AT_HEAD(pList) (pList)->pNext
++#define DL_LIST_GET_ITEM_AT_TAIL(pList) (pList)->pPrev
++/*
++ * ITERATE_OVER_LIST pStart is the list, pTemp is a temp list member
++ * NOT: do not use this function if the items in the list are deleted inside the
++ * iteration loop
++*/
++#define ITERATE_OVER_LIST(pStart, pTemp) \
++ for((pTemp) =(pStart)->pNext; pTemp != (pStart); (pTemp) = (pTemp)->pNext)
++
++
++/* safe iterate macro that allows the item to be removed from the list
++ * the iteration continues to the next item in the list
++ */
++#define ITERATE_OVER_LIST_ALLOW_REMOVE(pStart,pItem,st,offset) \
++{ \
++ PDL_LIST pTemp; \
++ pTemp = (pStart)->pNext; \
++ while (pTemp != (pStart)) { \
++ (pItem) = A_CONTAINING_STRUCT(pTemp,st,offset); \
++ pTemp = pTemp->pNext; \
++
++#define ITERATE_END }}
++
++/*
++ * DL_ListInsertTail - insert pAdd to the end of the list
++*/
++static INLINE PDL_LIST DL_ListInsertTail(PDL_LIST pList, PDL_LIST pAdd) {
++ /* insert at tail */
++ pAdd->pPrev = pList->pPrev;
++ pAdd->pNext = pList;
++ pList->pPrev->pNext = pAdd;
++ pList->pPrev = pAdd;
++ return pAdd;
++}
++
++/*
++ * DL_ListInsertHead - insert pAdd into the head of the list
++*/
++static INLINE PDL_LIST DL_ListInsertHead(PDL_LIST pList, PDL_LIST pAdd) {
++ /* insert at head */
++ pAdd->pPrev = pList;
++ pAdd->pNext = pList->pNext;
++ pList->pNext->pPrev = pAdd;
++ pList->pNext = pAdd;
++ return pAdd;
++}
++
++#define DL_ListAdd(pList,pItem) DL_ListInsertHead((pList),(pItem))
++/*
++ * DL_ListRemove - remove pDel from list
++*/
++static INLINE PDL_LIST DL_ListRemove(PDL_LIST pDel) {
++ pDel->pNext->pPrev = pDel->pPrev;
++ pDel->pPrev->pNext = pDel->pNext;
++ /* point back to itself just to be safe, incase remove is called again */
++ pDel->pNext = pDel;
++ pDel->pPrev = pDel;
++ return pDel;
++}
++
++/*
++ * DL_ListRemoveItemFromHead - get a list item from the head
++*/
++static INLINE PDL_LIST DL_ListRemoveItemFromHead(PDL_LIST pList) {
++ PDL_LIST pItem = NULL;
++ if (pList->pNext != pList) {
++ pItem = pList->pNext;
++ /* remove the first item from head */
++ DL_ListRemove(pItem);
++ }
++ return pItem;
++}
++
++#endif /* __DL_LIST_H___ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/dset_api.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/dset_api.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/dset_api.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/dset_api.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,63 @@
++/*
++ * Copyright (c) 2004-2006 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/include/dset_api.h#1 $
++ *
++ * Host-side DataSet API.
++ *
++ */
++
++#ifndef _DSET_API_H_
++#define _DSET_API_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif /* __cplusplus */
++
++/*
++ * Host-side DataSet support is optional, and is not
++ * currently required for correct operation. To disable
++ * Host-side DataSet support, set this to 0.
++ */
++#ifndef CONFIG_HOST_DSET_SUPPORT
++#define CONFIG_HOST_DSET_SUPPORT 1
++#endif
++
++/* Called to send a DataSet Open Reply back to the Target. */
++A_STATUS wmi_dset_open_reply(struct wmi_t *wmip,
++ A_UINT32 status,
++ A_UINT32 access_cookie,
++ A_UINT32 size,
++ A_UINT32 version,
++ A_UINT32 targ_handle,
++ A_UINT32 targ_reply_fn,
++ A_UINT32 targ_reply_arg);
++
++/* Called to send a DataSet Data Reply back to the Target. */
++A_STATUS wmi_dset_data_reply(struct wmi_t *wmip,
++ A_UINT32 status,
++ A_UINT8 *host_buf,
++ A_UINT32 length,
++ A_UINT32 targ_buf,
++ A_UINT32 targ_reply_fn,
++ A_UINT32 targ_reply_arg);
++
++#ifdef __cplusplus
++}
++#endif /* __cplusplus */
++
++
++#endif /* _DSET_API_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/dsetid.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/dsetid.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/dsetid.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/dsetid.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,110 @@
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ */
++
++#ifndef __DSETID_H__
++#define __DSETID_H__
++
++/* Well-known DataSet IDs */
++#define DSETID_UNUSED 0x00000000
++#define DSETID_BOARD_DATA 0x00000001 /* Cal and board data */
++#define DSETID_REGDB 0x00000002 /* Regulatory Database */
++#define DSETID_POWER_CONTROL 0x00000003 /* TX Pwr Lim & Ant Gain */
++#define DSETID_USER_CONFIG 0x00000004 /* User Configuration */
++
++#define DSETID_ANALOG_CONTROL_DATA_START 0x00000005
++#define DSETID_ANALOG_CONTROL_DATA_END 0x00000025
++/*
++ * Get DSETID for various reference clock speeds.
++ * For each speed there are three DataSets that correspond
++ * to the three columns of bank6 data (addr, 11a, 11b/g).
++ * This macro returns the dsetid of the first of those
++ * three DataSets.
++ */
++#define ANALOG_CONTROL_DATA_DSETID(refclk) \
++ (DSETID_ANALOG_CONTROL_DATA_START + 3*refclk)
++
++/*
++ * There are TWO STARTUP_PATCH DataSets.
++ * DSETID_STARTUP_PATCH is historical, and was applied before BMI on
++ * earlier systems. On AR6002, it is applied after BMI, just like
++ * DSETID_STARTUP_PATCH2.
++ */
++#define DSETID_STARTUP_PATCH 0x00000026
++#define DSETID_GPIO_CONFIG_PATCH 0x00000027
++#define DSETID_WLANREGS 0x00000028 /* override wlan regs */
++#define DSETID_STARTUP_PATCH2 0x00000029
++
++#define DSETID_WOW_CONFIG 0x00000090 /* WoW Configuration */
++
++/* Add WHAL_INI_DATA_ID to DSETID_INI_DATA for a specific WHAL INI table. */
++#define DSETID_INI_DATA 0x00000100
++/* Reserved for WHAL INI Tables: 0x100..0x11f */
++#define DSETID_INI_DATA_END 0x0000011f
++
++#define DSETID_VENDOR_START 0x00010000 /* Vendor-defined DataSets */
++
++#define DSETID_INDEX_END 0xfffffffe /* Reserved to indicate the
++ end of a memory-based
++ DataSet Index */
++#define DSETID_INDEX_FREE 0xffffffff /* An unused index entry */
++
++/*
++ * PATCH DataSet format:
++ * A list of patches, terminated by a patch with
++ * address=PATCH_END.
++ *
++ * This allows for patches to be stored in flash.
++ */
++struct patch_s {
++ A_UINT32 *address;
++ A_UINT32 data;
++};
++
++/*
++ * Skip some patches. Can be used to erase a single patch in a
++ * patch DataSet without having to re-write the DataSet. May
++ * also be used to embed information for use by subsequent
++ * patch code. The "data" in a PATCH_SKIP tells how many
++ * bytes of length "patch_s" to skip.
++ */
++#define PATCH_SKIP ((A_UINT32 *)0x00000000)
++
++/*
++ * Execute code at the address specified by "data".
++ * The address of the patch structure is passed as
++ * the one parameter.
++ */
++#define PATCH_CODE_ABS ((A_UINT32 *)0x00000001)
++
++/*
++ * Same as PATCH_CODE_ABS, but treat "data" as an
++ * offset from the start of the patch word.
++ */
++#define PATCH_CODE_REL ((A_UINT32 *)0x00000002)
++
++/* Mark the end of this patch DataSet. */
++#define PATCH_END ((A_UINT32 *)0xffffffff)
++
++/*
++ * A DataSet which contains a Binary Patch to some other DataSet
++ * uses the original dsetid with the DSETID_BPATCH_FLAG bit set.
++ * Such a BPatch DataSet consists of BPatch metadata followed by
++ * the bdiff bytes. BPatch metadata consists of a single 32-bit
++ * word that contains the size of the BPatched final image.
++ *
++ * To create a suitable bdiff DataSet, use bdiff in host/tools/bdiff
++ * to create "diffs":
++ * bdiff -q -O -nooldmd5 -nonewmd5 -d ORIGfile NEWfile diffs
++ * Then add BPatch metadata to the start of "diffs".
++ *
++ * NB: There are some implementation-induced restrictions
++ * on which DataSets can be BPatched.
++ */
++#define DSETID_BPATCH_FLAG 0x80000000
++
++#endif /* __DSETID_H__ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/dset_internal.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/dset_internal.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/dset_internal.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/dset_internal.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,39 @@
++/*
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ */
++
++#ifndef __DSET_INTERNAL_H__
++#define __DSET_INTERNAL_H__
++
++/*
++ * Internal dset definitions, common for DataSet layer.
++ */
++
++#define DSET_TYPE_STANDARD 0
++#define DSET_TYPE_BPATCHED 1
++#define DSET_TYPE_COMPRESSED 2
++
++/* Dataset descriptor */
++
++typedef struct dset_descriptor_s {
++ struct dset_descriptor_s *next; /* List link. NULL only at the last
++ descriptor */
++ A_UINT16 id; /* Dset ID */
++ A_UINT16 size; /* Dset size. */
++ void *DataPtr; /* Pointer to raw data for standard
++ DataSet or pointer to original
++ dset_descriptor for patched
++ DataSet */
++ A_UINT32 data_type; /* DSET_TYPE_*, above */
++
++ void *AuxPtr; /* Additional data that might
++ needed for data_type. For
++ example, pointer to patch
++ Dataset descriptor for BPatch. */
++} dset_descriptor_t;
++
++#endif /* __DSET_INTERNAL_H__ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/gpio_api.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/gpio_api.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/gpio_api.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/gpio_api.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,57 @@
++#ifndef _GPIO_API_H_
++#define _GPIO_API_H_
++/*
++ * Copyright 2005 Atheros Communications, Inc., All Rights Reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++/*
++ * Host-side General Purpose I/O API.
++ *
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/include/gpio_api.h#1 $
++ */
++
++/*
++ * Send a command to the Target in order to change output on GPIO pins.
++ */
++A_STATUS wmi_gpio_output_set(struct wmi_t *wmip,
++ A_UINT32 set_mask,
++ A_UINT32 clear_mask,
++ A_UINT32 enable_mask,
++ A_UINT32 disable_mask);
++
++/*
++ * Send a command to the Target requesting input state of GPIO pins.
++ */
++A_STATUS wmi_gpio_input_get(struct wmi_t *wmip);
++
++/*
++ * Send a command to the Target to change the value of a GPIO register.
++ */
++A_STATUS wmi_gpio_register_set(struct wmi_t *wmip,
++ A_UINT32 gpioreg_id,
++ A_UINT32 value);
++
++/*
++ * Send a command to the Target to fetch the value of a GPIO register.
++ */
++A_STATUS wmi_gpio_register_get(struct wmi_t *wmip, A_UINT32 gpioreg_id);
++
++/*
++ * Send a command to the Target, acknowledging some GPIO interrupts.
++ */
++A_STATUS wmi_gpio_intr_ack(struct wmi_t *wmip, A_UINT32 ack_mask);
++
++#endif /* _GPIO_API_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/gpio.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/gpio.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/gpio.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/gpio.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,34 @@
++/*
++ * Copyright (c) 2005 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ */
++
++#if defined(AR6001)
++#define GPIO_PIN_COUNT 18
++#else
++#define GPIO_PIN_COUNT 18
++#endif
++
++/*
++ * Possible values for WMIX_GPIO_SET_REGISTER_CMDID.
++ * NB: These match hardware order, so that addresses can
++ * easily be computed.
++ */
++#define GPIO_ID_OUT 0x00000000
++#define GPIO_ID_OUT_W1TS 0x00000001
++#define GPIO_ID_OUT_W1TC 0x00000002
++#define GPIO_ID_ENABLE 0x00000003
++#define GPIO_ID_ENABLE_W1TS 0x00000004
++#define GPIO_ID_ENABLE_W1TC 0x00000005
++#define GPIO_ID_IN 0x00000006
++#define GPIO_ID_STATUS 0x00000007
++#define GPIO_ID_STATUS_W1TS 0x00000008
++#define GPIO_ID_STATUS_W1TC 0x00000009
++#define GPIO_ID_PIN0 0x0000000a
++#define GPIO_ID_PIN(n) (GPIO_ID_PIN0+(n))
++
++#define GPIO_LAST_REGISTER_ID GPIO_ID_PIN(17)
++#define GPIO_ID_NONE 0xffffffff
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/hif.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/hif.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/hif.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/hif.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,296 @@
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ * HIF specific declarations and prototypes
++ */
++
++#ifndef _HIF_H_
++#define _HIF_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif /* __cplusplus */
++
++/* Header files */
++#include "a_config.h"
++#include "athdefs.h"
++#include "a_types.h"
++#include "a_osapi.h"
++
++typedef struct htc_callbacks HTC_CALLBACKS;
++typedef struct hif_device HIF_DEVICE;
++
++/*
++ * direction - Direction of transfer (HIF_READ/HIF_WRITE).
++ */
++#define HIF_READ 0x00000001
++#define HIF_WRITE 0x00000002
++#define HIF_DIR_MASK (HIF_READ | HIF_WRITE)
++
++/*
++ * type - An interface may support different kind of read/write commands.
++ * The command type is divided into a basic and an extended command
++ * and can be specified using HIF_BASIC_IO/HIF_EXTENDED_IO.
++ */
++#define HIF_BASIC_IO 0x00000004
++#define HIF_EXTENDED_IO 0x00000008
++#define HIF_TYPE_MASK (HIF_BASIC_IO | HIF_EXTENDED_IO)
++
++/*
++ * emode - This indicates the whether the command is to be executed in a
++ * blocking or non-blocking fashion (HIF_SYNCHRONOUS/
++ * HIF_ASYNCHRONOUS). The read/write data paths in HTC have been
++ * implemented using the asynchronous mode allowing the the bus
++ * driver to indicate the completion of operation through the
++ * registered callback routine. The requirement primarily comes
++ * from the contexts these operations get called from (a driver's
++ * transmit context or the ISR context in case of receive).
++ * Support for both of these modes is essential.
++ */
++#define HIF_SYNCHRONOUS 0x00000010
++#define HIF_ASYNCHRONOUS 0x00000020
++#define HIF_EMODE_MASK (HIF_SYNCHRONOUS | HIF_ASYNCHRONOUS)
++
++/*
++ * dmode - An interface may support different kinds of commands based on
++ * the tradeoff between the amount of data it can carry and the
++ * setup time. Byte and Block modes are supported (HIF_BYTE_BASIS/
++ * HIF_BLOCK_BASIS). In case of latter, the data is rounded off
++ * to the nearest block size by padding. The size of the block is
++ * configurable at compile time using the HIF_BLOCK_SIZE and is
++ * negotiated with the target during initialization after the
++ * dragon interrupts are enabled.
++ */
++#define HIF_BYTE_BASIS 0x00000040
++#define HIF_BLOCK_BASIS 0x00000080
++#define HIF_DMODE_MASK (HIF_BYTE_BASIS | HIF_BLOCK_BASIS)
++
++/*
++ * amode - This indicates if the address has to be incremented on dragon
++ * after every read/write operation (HIF?FIXED_ADDRESS/
++ * HIF_INCREMENTAL_ADDRESS).
++ */
++#define HIF_FIXED_ADDRESS 0x00000100
++#define HIF_INCREMENTAL_ADDRESS 0x00000200
++#define HIF_AMODE_MASK (HIF_FIXED_ADDRESS | HIF_INCREMENTAL_ADDRESS)
++
++#define HIF_WR_ASYNC_BYTE_FIX \
++ (HIF_WRITE | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_FIXED_ADDRESS)
++#define HIF_WR_ASYNC_BYTE_INC \
++ (HIF_WRITE | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS)
++#define HIF_WR_ASYNC_BLOCK_INC \
++ (HIF_WRITE | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | HIF_BLOCK_BASIS | HIF_INCREMENTAL_ADDRESS)
++#define HIF_WR_SYNC_BYTE_FIX \
++ (HIF_WRITE | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_FIXED_ADDRESS)
++#define HIF_WR_SYNC_BYTE_INC \
++ (HIF_WRITE | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS)
++#define HIF_WR_SYNC_BLOCK_INC \
++ (HIF_WRITE | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | HIF_BLOCK_BASIS | HIF_INCREMENTAL_ADDRESS)
++#define HIF_RD_SYNC_BYTE_INC \
++ (HIF_READ | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS)
++#define HIF_RD_SYNC_BYTE_FIX \
++ (HIF_READ | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_FIXED_ADDRESS)
++#define HIF_RD_ASYNC_BYTE_FIX \
++ (HIF_READ | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_FIXED_ADDRESS)
++#define HIF_RD_ASYNC_BLOCK_FIX \
++ (HIF_READ | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | HIF_BLOCK_BASIS | HIF_FIXED_ADDRESS)
++#define HIF_RD_ASYNC_BYTE_INC \
++ (HIF_READ | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS)
++#define HIF_RD_ASYNC_BLOCK_INC \
++ (HIF_READ | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | HIF_BLOCK_BASIS | HIF_INCREMENTAL_ADDRESS)
++#define HIF_RD_SYNC_BLOCK_INC \
++ (HIF_READ | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | HIF_BLOCK_BASIS | HIF_INCREMENTAL_ADDRESS)
++
++
++typedef enum {
++ HIF_DEVICE_POWER_STATE = 0,
++ HIF_DEVICE_GET_MBOX_BLOCK_SIZE,
++ HIF_DEVICE_GET_MBOX_ADDR,
++ HIF_DEVICE_GET_PENDING_EVENTS_FUNC,
++ HIF_DEVICE_GET_IRQ_PROC_MODE,
++ HIF_DEVICE_GET_RECV_EVENT_MASK_UNMASK_FUNC,
++} HIF_DEVICE_CONFIG_OPCODE;
++
++/*
++ * HIF CONFIGURE definitions:
++ *
++ * HIF_DEVICE_GET_MBOX_BLOCK_SIZE
++ * input : none
++ * output : array of 4 A_UINT32s
++ * notes: block size is returned for each mailbox (4)
++ *
++ * HIF_DEVICE_GET_MBOX_ADDR
++ * input : none
++ * output : array of 4 A_UINT32
++ * notes: address is returned for each mailbox (4) in the array
++ *
++ * HIF_DEVICE_GET_PENDING_EVENTS_FUNC
++ * input : none
++ * output: HIF_PENDING_EVENTS_FUNC function pointer
++ * notes: this is optional for the HIF layer, if the request is
++ * not handled then it indicates that the upper layer can use
++ * the standard device methods to get pending events (IRQs, mailbox messages etc..)
++ * otherwise it can call the function pointer to check pending events.
++ *
++ * HIF_DEVICE_GET_IRQ_PROC_MODE
++ * input : none
++ * output : HIF_DEVICE_IRQ_PROCESSING_MODE (interrupt processing mode)
++ * note: the hif layer interfaces with the underlying OS-specific bus driver. The HIF
++ * layer can report whether IRQ processing is requires synchronous behavior or
++ * can be processed using asynchronous bus requests (typically faster).
++ *
++ * HIF_DEVICE_GET_RECV_EVENT_MASK_UNMASK_FUNC
++ * input :
++ * output : HIF_MASK_UNMASK_RECV_EVENT function pointer
++ * notes: this is optional for the HIF layer. The HIF layer may require a special mechanism
++ * to mask receive message events. The upper layer can call this pointer when it needs
++ * to mask/unmask receive events (in case it runs out of buffers).
++ *
++ *
++ */
++
++typedef enum {
++ HIF_DEVICE_IRQ_SYNC_ONLY, /* for HIF implementations that require the DSR to process all
++ interrupts before returning */
++ HIF_DEVICE_IRQ_ASYNC_SYNC, /* for HIF implementations that allow DSR to process interrupts
++ using ASYNC I/O (that is HIFAckInterrupt can be called at a
++ later time */
++} HIF_DEVICE_IRQ_PROCESSING_MODE;
++
++#define HIF_MAX_DEVICES 1
++
++struct htc_callbacks {
++ A_UCHAR *name;
++ A_UINT32 id;
++ A_STATUS (* deviceInsertedHandler)(void *hif_handle);
++ A_STATUS (* deviceRemovedHandler)(void *htc_handle, A_STATUS status);
++ A_STATUS (* deviceSuspendHandler)(void *htc_handle);
++ A_STATUS (* deviceResumeHandler)(void *htc_handle);
++ A_STATUS (* deviceWakeupHandler)(void *htc_handle);
++ A_STATUS (* rwCompletionHandler)(void *context, A_STATUS status);
++ A_STATUS (* dsrHandler)(void *htc_handle);
++};
++
++
++#define HIF_OTHER_EVENTS (1 << 0) /* other interrupts (non-Recv) are pending, host
++ needs to read the register table to figure out what */
++#define HIF_RECV_MSG_AVAIL (1 << 1) /* pending recv packet */
++
++typedef struct _HIF_PENDING_EVENTS_INFO {
++ A_UINT32 Events;
++ A_UINT32 LookAhead;
++} HIF_PENDING_EVENTS_INFO;
++
++ /* function to get pending events , some HIF modules use special mechanisms
++ * to detect packet available and other interrupts */
++typedef A_STATUS ( *HIF_PENDING_EVENTS_FUNC)(HIF_DEVICE *device,
++ HIF_PENDING_EVENTS_INFO *pEvents,
++ void *AsyncContext);
++
++#define HIF_MASK_RECV TRUE
++#define HIF_UNMASK_RECV FALSE
++ /* function to mask recv events */
++typedef A_STATUS ( *HIF_MASK_UNMASK_RECV_EVENT)(HIF_DEVICE *device,
++ A_BOOL Mask,
++ void *AsyncContext);
++
++
++/*
++ * This API is used by the HTC layer to initialize the HIF layer and to
++ * register different callback routines. Support for following events has
++ * been captured - DSR, Read/Write completion, Device insertion/removal,
++ * Device suspension/resumption/wakeup. In addition to this, the API is
++ * also used to register the name and the revision of the chip. The latter
++ * can be used to verify the revision of the chip read from the device
++ * before reporting it to HTC.
++ */
++int HIFInit(HTC_CALLBACKS *callbacks);
++
++/*
++ * This API is used to provide the read/write interface over the specific bus
++ * interface.
++ * address - Starting address in the dragon's address space. For mailbox
++ * writes, it refers to the start of the mbox boundary. It should
++ * be ensured that the last byte falls on the mailbox's EOM. For
++ * mailbox reads, it refers to the end of the mbox boundary.
++ * buffer - Pointer to the buffer containg the data to be transmitted or
++ * received.
++ * length - Amount of data to be transmitted or received.
++ * request - Characterizes the attributes of the command.
++ */
++A_STATUS
++HIFReadWrite(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UCHAR *buffer,
++ A_UINT32 length,
++ A_UINT32 request,
++ void *context);
++
++/*
++ * This can be initiated from the unload driver context ie when the HTCShutdown
++ * routine is called.
++ */
++void HIFShutDownDevice(HIF_DEVICE *device);
++
++/*
++ * This should translate to an acknowledgment to the bus driver indicating that
++ * the previous interrupt request has been serviced and the all the relevant
++ * sources have been cleared. HTC is ready to process more interrupts.
++ * This should prevent the bus driver from raising an interrupt unless the
++ * previous one has been serviced and acknowledged using the previous API.
++ */
++void HIFAckInterrupt(HIF_DEVICE *device);
++
++void HIFMaskInterrupt(HIF_DEVICE *device);
++
++void HIFUnMaskInterrupt(HIF_DEVICE *device);
++
++/*
++ * This set of functions are to be used by the bus driver to notify
++ * the HIF module about various events.
++ * These are not implemented if the bus driver provides an alternative
++ * way for this notification though callbacks for instance.
++ */
++int HIFInsertEventNotify(void);
++
++int HIFRemoveEventNotify(void);
++
++int HIFIRQEventNotify(void);
++
++int HIFRWCompleteEventNotify(void);
++
++/*
++ * This function associates a opaque handle with the HIF layer
++ * to be used in communication with upper layer i.e. HTC.
++ * This would normaly be a pointer to htc_target data structure.
++ */
++void HIFSetHandle(void *hif_handle, void *handle);
++
++A_STATUS
++HIFConfigureDevice(HIF_DEVICE *device, HIF_DEVICE_CONFIG_OPCODE opcode,
++ void *config, A_UINT32 configLen);
++
++
++struct device;
++struct device*
++HIFGetOSDevice(HIF_DEVICE *device);
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _HIF_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/host_version.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/host_version.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/host_version.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/host_version.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,49 @@
++#ifndef _HOST_VERSION_H_
++#define _HOST_VERSION_H_
++/*
++ * Copyright (c) 2004-2005 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * This file contains version information for the sample host driver for the
++ * AR6000 chip
++ *
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/include/host_version.h#2 $
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <AR6K_version.h>
++
++/*
++ * The version number is made up of major, minor, patch and build
++ * numbers. These are 16 bit numbers. The build and release script will
++ * set the build number using a Perforce counter. Here the build number is
++ * set to 9999 so that builds done without the build-release script are easily
++ * identifiable.
++ */
++
++#define ATH_SW_VER_MAJOR __VER_MAJOR_
++#define ATH_SW_VER_MINOR __VER_MINOR_
++#define ATH_SW_VER_PATCH __VER_PATCH_
++#define ATH_SW_VER_BUILD 9999
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _HOST_VERSION_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/htc_api.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/htc_api.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/htc_api.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/htc_api.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,439 @@
++/*
++ *
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef _HTC_API_H_
++#define _HTC_API_H_
++
++#include <htc.h>
++#include <htc_services.h>
++#include "htc_packet.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif /* __cplusplus */
++
++/* TODO.. for BMI */
++#define ENDPOINT1 0
++// TODO -remove me, but we have to fix BMI first
++#define HTC_MAILBOX_NUM_MAX 4
++
++
++/* ------ Endpoint IDS ------ */
++typedef enum
++{
++ ENDPOINT_UNUSED = -1,
++ ENDPOINT_0 = 0,
++ ENDPOINT_1 = 1,
++ ENDPOINT_2 = 2,
++ ENDPOINT_3,
++ ENDPOINT_4,
++ ENDPOINT_5,
++ ENDPOINT_6,
++ ENDPOINT_7,
++ ENDPOINT_8,
++ ENDPOINT_MAX,
++} HTC_ENDPOINT_ID;
++
++/* this is the amount of header room required by users of HTC */
++#define HTC_HEADER_LEN HTC_HDR_LENGTH
++
++typedef void *HTC_HANDLE;
++
++typedef A_UINT16 HTC_SERVICE_ID;
++
++typedef struct _HTC_INIT_INFO {
++ void (*AddInstance)(HTC_HANDLE);
++ void (*DeleteInstance)(void *Instance);
++ void (*TargetFailure)(void *Instance, A_STATUS Status);
++} HTC_INIT_INFO;
++
++/* per service connection send completion */
++typedef void (*HTC_EP_SEND_PKT_COMPLETE)(void *,HTC_PACKET *);
++/* per service connection pkt received */
++typedef void (*HTC_EP_RECV_PKT)(void *,HTC_PACKET *);
++
++/* Optional per service connection receive buffer re-fill callback,
++ * On some OSes (like Linux) packets are allocated from a global pool and indicated up
++ * to the network stack. The driver never gets the packets back from the OS. For these OSes
++ * a refill callback can be used to allocate and re-queue buffers into HTC.
++ *
++ * On other OSes, the network stack can call into the driver's OS-specifc "return_packet" handler and
++ * the driver can re-queue these buffers into HTC. In this regard a refill callback is
++ * unnecessary */
++typedef void (*HTC_EP_RECV_REFILL)(void *, HTC_ENDPOINT_ID Endpoint);
++
++/* Optional per service connection callback when a send queue is full. This can occur if the
++ * host continues queueing up TX packets faster than credits can arrive
++ * To prevent the host (on some Oses like Linux) from continuously queueing packets
++ * and consuming resources, this callback is provided so that that the host
++ * can disable TX in the subsystem (i.e. network stack)
++ * Other OSes require a "per-packet" indication_RAW_STREAM_NUM_MAX for each completed TX packet, this
++ * closed loop mechanism will prevent the network stack from overunning the NIC */
++typedef void (*HTC_EP_SEND_QUEUE_FULL)(void *, HTC_ENDPOINT_ID Endpoint);
++/* Optional per service connection callback when a send queue is available for receive new packet. */
++typedef void (*HTC_EP_SEND_QUEUE_AVAIL)(void *, HTC_ENDPOINT_ID Endpoint);
++
++typedef struct _HTC_EP_CALLBACKS {
++ void *pContext; /* context for each callback */
++ HTC_EP_SEND_PKT_COMPLETE EpTxComplete; /* tx completion callback for connected endpoint */
++ HTC_EP_RECV_PKT EpRecv; /* receive callback for connected endpoint */
++ HTC_EP_RECV_REFILL EpRecvRefill; /* OPTIONAL receive re-fill callback for connected endpoint */
++ HTC_EP_SEND_QUEUE_FULL EpSendFull; /* OPTIONAL send full callback */
++ HTC_EP_SEND_QUEUE_AVAIL EpSendAvail; /* OPTIONAL send available callback */
++} HTC_EP_CALLBACKS;
++
++/* service connection information */
++typedef struct _HTC_SERVICE_CONNECT_REQ {
++ HTC_SERVICE_ID ServiceID; /* service ID to connect to */
++ A_UINT16 ConnectionFlags; /* connection flags, see htc protocol definition */
++ A_UINT8 *pMetaData; /* ptr to optional service-specific meta-data */
++ A_UINT8 MetaDataLength; /* optional meta data length */
++ HTC_EP_CALLBACKS EpCallbacks; /* endpoint callbacks */
++ int MaxSendQueueDepth; /* maximum depth of any send queue */
++} HTC_SERVICE_CONNECT_REQ;
++
++/* service connection response information */
++typedef struct _HTC_SERVICE_CONNECT_RESP {
++ A_UINT8 *pMetaData; /* caller supplied buffer to optional meta-data */
++ A_UINT8 BufferLength; /* length of caller supplied buffer */
++ A_UINT8 ActualLength; /* actual length of meta data */
++ HTC_ENDPOINT_ID Endpoint; /* endpoint to communicate over */
++ int MaxMsgLength; /* max length of all messages over this endpoint */
++ A_UINT8 ConnectRespCode; /* connect response code from target */
++} HTC_SERVICE_CONNECT_RESP;
++
++/* endpoint distribution structure */
++typedef struct _HTC_ENDPOINT_CREDIT_DIST {
++ struct _HTC_ENDPOINT_CREDIT_DIST *pNext;
++ struct _HTC_ENDPOINT_CREDIT_DIST *pPrev;
++ HTC_SERVICE_ID ServiceID; /* Service ID (set by HTC) */
++ HTC_ENDPOINT_ID Endpoint; /* endpoint for this distribution struct (set by HTC) */
++ A_UINT32 DistFlags; /* distribution flags, distribution function can
++ set default activity using SET_EP_ACTIVE() macro */
++ int TxCreditsNorm; /* credits for normal operation, anything above this
++ indicates the endpoint is over-subscribed, this field
++ is only relevant to the credit distribution function */
++ int TxCreditsMin; /* floor for credit distribution, this field is
++ only relevant to the credit distribution function */
++ int TxCreditsAssigned; /* number of credits assigned to this EP, this field
++ is only relevant to the credit dist function */
++ int TxCredits; /* current credits available, this field is used by
++ HTC to determine whether a message can be sent or
++ must be queued */
++ int TxCreditsToDist; /* pending credits to distribute on this endpoint, this
++ is set by HTC when credit reports arrive.
++ The credit distribution functions sets this to zero
++ when it distributes the credits */
++ int TxCreditsSeek; /* this is the number of credits that the current pending TX
++ packet needs to transmit. This is set by HTC when
++ and endpoint needs credits in order to transmit */
++ int TxCreditSize; /* size in bytes of each credit (set by HTC) */
++ int TxCreditsPerMaxMsg; /* credits required for a maximum sized messages (set by HTC) */
++ void *pHTCReserved; /* reserved for HTC use */
++} HTC_ENDPOINT_CREDIT_DIST;
++
++#define HTC_EP_ACTIVE (1 << 31)
++
++/* macro to check if an endpoint has gone active, useful for credit
++ * distributions */
++#define IS_EP_ACTIVE(epDist) ((epDist)->DistFlags & HTC_EP_ACTIVE)
++#define SET_EP_ACTIVE(epDist) (epDist)->DistFlags |= HTC_EP_ACTIVE
++
++ /* credit distibution code that is passed into the distrbution function,
++ * there are mandatory and optional codes that must be handled */
++typedef enum _HTC_CREDIT_DIST_REASON {
++ HTC_CREDIT_DIST_SEND_COMPLETE = 0, /* credits available as a result of completed
++ send operations (MANDATORY) resulting in credit reports */
++ HTC_CREDIT_DIST_ACTIVITY_CHANGE = 1, /* a change in endpoint activity occured (OPTIONAL) */
++ HTC_CREDIT_DIST_SEEK_CREDITS, /* an endpoint needs to "seek" credits (OPTIONAL) */
++ HTC_DUMP_CREDIT_STATE /* for debugging, dump any state information that is kept by
++ the distribution function */
++} HTC_CREDIT_DIST_REASON;
++
++typedef void (*HTC_CREDIT_DIST_CALLBACK)(void *Context,
++ HTC_ENDPOINT_CREDIT_DIST *pEPList,
++ HTC_CREDIT_DIST_REASON Reason);
++
++typedef void (*HTC_CREDIT_INIT_CALLBACK)(void *Context,
++ HTC_ENDPOINT_CREDIT_DIST *pEPList,
++ int TotalCredits);
++
++ /* endpoint statistics action */
++typedef enum _HTC_ENDPOINT_STAT_ACTION {
++ HTC_EP_STAT_SAMPLE = 0, /* only read statistics */
++ HTC_EP_STAT_SAMPLE_AND_CLEAR = 1, /* sample and immediately clear statistics */
++ HTC_EP_STAT_CLEAR /* clear only */
++} HTC_ENDPOINT_STAT_ACTION;
++
++ /* endpoint statistics */
++typedef struct _HTC_ENDPOINT_STATS {
++ A_UINT32 TxCreditLowIndications; /* number of times the host set the credit-low flag in a send message on
++ this endpoint */
++ A_UINT32 TxIssued; /* running count of TX packets issued */
++ A_UINT32 TxCreditRpts; /* running count of total credit reports received for this endpoint */
++ A_UINT32 TxCreditRptsFromRx;
++ A_UINT32 TxCreditRptsFromOther;
++ A_UINT32 TxCreditRptsFromEp0;
++ A_UINT32 TxCreditsFromRx; /* count of credits received via Rx packets on this endpoint */
++ A_UINT32 TxCreditsFromOther; /* count of credits received via another endpoint */
++ A_UINT32 TxCreditsFromEp0; /* count of credits received via another endpoint */
++ A_UINT32 TxCreditsConsummed; /* count of consummed credits */
++ A_UINT32 TxCreditsReturned; /* count of credits returned */
++ A_UINT32 RxReceived; /* count of RX packets received */
++ A_UINT32 RxLookAheads; /* count of lookahead records
++ found in messages received on this endpoint */
++} HTC_ENDPOINT_STATS;
++
++/* ------ Function Prototypes ------ */
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Initialize HTC
++ @function name: HTCInit
++ @input: pInfo - initialization information
++ @output:
++ @return: A_OK on success
++ @notes: The caller initializes global HTC state and registers various instance
++ notification callbacks (see HTC_INIT_INFO).
++
++ @example:
++ @see also: HTCShutdown
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++A_STATUS HTCInit(HTC_INIT_INFO *pInfo);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Get the underlying HIF device handle
++ @function name: HTCGetHifDevice
++ @input: HTCHandle - handle passed into the AddInstance callback
++ @output:
++ @return: opaque HIF device handle usable in HIF API calls.
++ @notes:
++ @example:
++ @see also:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++void *HTCGetHifDevice(HTC_HANDLE HTCHandle);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Set the associated instance for the HTC handle
++ @function name: HTCSetInstance
++ @input: HTCHandle - handle passed into the AddInstance callback
++ Instance - caller supplied instance object
++ @output:
++ @return:
++ @notes: Caller must set the instance information for the HTC handle in order to receive
++ notifications for instance deletion (DeleteInstance callback is called) and for target
++ failure notification.
++ @example:
++ @see also:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++void HTCSetInstance(HTC_HANDLE HTCHandle, void *Instance);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Set credit distribution parameters
++ @function name: HTCSetCreditDistribution
++ @input: HTCHandle - HTC handle
++ pCreditDistCont - caller supplied context to pass into distribution functions
++ CreditDistFunc - Distribution function callback
++ CreditDistInit - Credit Distribution initialization callback
++ ServicePriorityOrder - Array containing list of service IDs, lowest index is highest
++ priority
++ ListLength - number of elements in ServicePriorityOrder
++ @output:
++ @return:
++ @notes: The user can set a custom credit distribution function to handle special requirements
++ for each endpoint. A default credit distribution routine can be used by setting
++ CreditInitFunc to NULL. The default credit distribution is only provided for simple
++ "fair" credit distribution without regard to any prioritization.
++
++ @example:
++ @see also:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++void HTCSetCreditDistribution(HTC_HANDLE HTCHandle,
++ void *pCreditDistContext,
++ HTC_CREDIT_DIST_CALLBACK CreditDistFunc,
++ HTC_CREDIT_INIT_CALLBACK CreditInitFunc,
++ HTC_SERVICE_ID ServicePriorityOrder[],
++ int ListLength);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Wait for the target to indicate the HTC layer is ready
++ @function name: HTCWaitTarget
++ @input: HTCHandle - HTC handle
++ @output:
++ @return:
++ @notes: This API blocks until the target responds with an HTC ready message.
++ The caller should not connect services until the target has indicated it is
++ ready.
++ @example:
++ @see also: HTCConnectService
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++A_STATUS HTCWaitTarget(HTC_HANDLE HTCHandle);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Start target service communications
++ @function name: HTCStart
++ @input: HTCHandle - HTC handle
++ @output:
++ @return:
++ @notes: This API indicates to the target that the service connection phase is complete
++ and the target can freely start all connected services. This API should only be
++ called AFTER all service connections have been made. TCStart will issue a
++ SETUP_COMPLETE message to the target to indicate that all service connections
++ have been made and the target can start communicating over the endpoints.
++ @example:
++ @see also: HTCConnectService
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++A_STATUS HTCStart(HTC_HANDLE HTCHandle);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Add receive packet to HTC
++ @function name: HTCAddReceivePkt
++ @input: HTCHandle - HTC handle
++ pPacket - HTC receive packet to add
++ @output:
++ @return: A_OK on success
++ @notes: user must supply HTC packets for capturing incomming HTC frames. The caller
++ must initialize each HTC packet using the SET_HTC_PACKET_INFO_RX_REFILL()
++ macro.
++ @example:
++ @see also:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++A_STATUS HTCAddReceivePkt(HTC_HANDLE HTCHandle, HTC_PACKET *pPacket);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Connect to an HTC service
++ @function name: HTCConnectService
++ @input: HTCHandle - HTC handle
++ pReq - connection details
++ @output: pResp - connection response
++ @return:
++ @notes: Service connections must be performed before HTCStart. User provides callback handlers
++ for various endpoint events.
++ @example:
++ @see also: HTCStart
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++A_STATUS HTCConnectService(HTC_HANDLE HTCHandle,
++ HTC_SERVICE_CONNECT_REQ *pReq,
++ HTC_SERVICE_CONNECT_RESP *pResp);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Send an HTC packet
++ @function name: HTCSendPkt
++ @input: HTCHandle - HTC handle
++ pPacket - packet to send
++ @output:
++ @return: A_OK
++ @notes: Caller must initialize packet using SET_HTC_PACKET_INFO_TX() macro.
++ This interface is fully asynchronous. On error, HTC SendPkt will
++ call the registered Endpoint callback to cleanup the packet.
++ @example:
++ @see also: HTCFlushEndpoint
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++A_STATUS HTCSendPkt(HTC_HANDLE HTCHandle, HTC_PACKET *pPacket);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Stop HTC service communications
++ @function name: HTCStop
++ @input: HTCHandle - HTC handle
++ @output:
++ @return:
++ @notes: HTC communications is halted. All receive and pending TX packets will
++ be flushed.
++ @example:
++ @see also:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++void HTCStop(HTC_HANDLE HTCHandle);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Shutdown HTC
++ @function name: HTCShutdown
++ @input:
++ @output:
++ @return:
++ @notes: This cleans up all resources allocated by HTCInit().
++ @example:
++ @see also: HTCInit
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++void HTCShutDown(void);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Flush pending TX packets
++ @function name: HTCFlushEndpoint
++ @input: HTCHandle - HTC handle
++ Endpoint - Endpoint to flush
++ Tag - flush tag
++ @output:
++ @return:
++ @notes: The Tag parameter is used to selectively flush packets with matching tags.
++ The value of 0 forces all packets to be flush regardless of tag.
++ @example:
++ @see also: HTCSendPkt
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++void HTCFlushEndpoint(HTC_HANDLE HTCHandle, HTC_ENDPOINT_ID Endpoint, HTC_TX_TAG Tag);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Dump credit distribution state
++ @function name: HTCDumpCreditStates
++ @input: HTCHandle - HTC handle
++ @output:
++ @return:
++ @notes: This dumps all credit distribution information to the debugger
++ @example:
++ @see also:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++void HTCDumpCreditStates(HTC_HANDLE HTCHandle);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Indicate a traffic activity change on an endpoint
++ @function name: HTCIndicateActivityChange
++ @input: HTCHandle - HTC handle
++ Endpoint - endpoint in which activity has changed
++ Active - TRUE if active, FALSE if it has become inactive
++ @output:
++ @return:
++ @notes: This triggers the registered credit distribution function to
++ re-adjust credits for active/inactive endpoints.
++ @example:
++ @see also:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++void HTCIndicateActivityChange(HTC_HANDLE HTCHandle,
++ HTC_ENDPOINT_ID Endpoint,
++ A_BOOL Active);
++
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Get endpoint statistics
++ @function name: HTCGetEndpointStatistics
++ @input: HTCHandle - HTC handle
++ Endpoint - Endpoint identifier
++ Action - action to take with statistics
++ @output:
++ pStats - statistics that were sampled (can be NULL if Action is HTC_EP_STAT_CLEAR)
++
++ @return: TRUE if statistics profiling is enabled, otherwise FALSE.
++
++ @notes: Statistics is a compile-time option and this function may return FALSE
++ if HTC is not compiled with profiling.
++
++ The caller can specify the statistic "action" to take when sampling
++ the statistics. This includes:
++
++ HTC_EP_STAT_SAMPLE: The pStats structure is filled with the current values.
++ HTC_EP_STAT_SAMPLE_AND_CLEAR: The structure is filled and the current statistics
++ are cleared.
++ HTC_EP_STAT_CLEA : the statistics are cleared, the called can pass a NULL value for
++ pStats
++
++ @example:
++ @see also:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++A_BOOL HTCGetEndpointStatistics(HTC_HANDLE HTCHandle,
++ HTC_ENDPOINT_ID Endpoint,
++ HTC_ENDPOINT_STAT_ACTION Action,
++ HTC_ENDPOINT_STATS *pStats);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _HTC_API_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/htc.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/htc.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/htc.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/htc.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,190 @@
++/*
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ */
++
++
++#ifndef __HTC_H__
++#define __HTC_H__
++
++#ifndef ATH_TARGET
++#include "athstartpack.h"
++#endif
++
++#define A_OFFSETOF(type,field) (int)(&(((type *)NULL)->field))
++
++#define ASSEMBLE_UNALIGNED_UINT16(p,highbyte,lowbyte) \
++ (((A_UINT16)(((A_UINT8 *)(p))[(highbyte)])) << 8 | (A_UINT16)(((A_UINT8 *)(p))[(lowbyte)]))
++
++/* alignment independent macros (little-endian) to fetch UINT16s or UINT8s from a
++ * structure using only the type and field name.
++ * Use these macros if there is the potential for unaligned buffer accesses. */
++#define A_GET_UINT16_FIELD(p,type,field) \
++ ASSEMBLE_UNALIGNED_UINT16(p,\
++ A_OFFSETOF(type,field) + 1, \
++ A_OFFSETOF(type,field))
++
++#define A_SET_UINT16_FIELD(p,type,field,value) \
++{ \
++ ((A_UINT8 *)(p))[A_OFFSETOF(type,field)] = (A_UINT8)(value); \
++ ((A_UINT8 *)(p))[A_OFFSETOF(type,field) + 1] = (A_UINT8)((value) >> 8); \
++}
++
++#define A_GET_UINT8_FIELD(p,type,field) \
++ ((A_UINT8 *)(p))[A_OFFSETOF(type,field)]
++
++#define A_SET_UINT8_FIELD(p,type,field,value) \
++ ((A_UINT8 *)(p))[A_OFFSETOF(type,field)] = (value)
++
++/****** DANGER DANGER ***************
++ *
++ * The frame header length and message formats defined herein were
++ * selected to accommodate optimal alignment for target processing. This reduces code
++ * size and improves performance.
++ *
++ * Any changes to the header length may alter the alignment and cause exceptions
++ * on the target. When adding to the message structures insure that fields are
++ * properly aligned.
++ *
++ */
++
++/* HTC frame header */
++typedef PREPACK struct _HTC_FRAME_HDR{
++ /* do not remove or re-arrange these fields, these are minimally required
++ * to take advantage of 4-byte lookaheads in some hardware implementations */
++ A_UINT8 EndpointID;
++ A_UINT8 Flags;
++ A_UINT16 PayloadLen; /* length of data (including trailer) that follows the header */
++
++ /***** end of 4-byte lookahead ****/
++
++ A_UINT8 ControlBytes[2];
++
++ /* message payload starts after the header */
++
++} POSTPACK HTC_FRAME_HDR;
++
++/* frame header flags */
++#define HTC_FLAGS_NEED_CREDIT_UPDATE (1 << 0)
++#define HTC_FLAGS_RECV_TRAILER (1 << 1)
++
++
++#define HTC_HDR_LENGTH (sizeof(HTC_FRAME_HDR))
++#define HTC_MAX_TRAILER_LENGTH 255
++#define HTC_MAX_PAYLOAD_LENGTH (2048 - sizeof(HTC_FRAME_HDR))
++
++/* HTC control message IDs */
++typedef enum {
++ HTC_MSG_READY_ID = 1,
++ HTC_MSG_CONNECT_SERVICE_ID = 2,
++ HTC_MSG_CONNECT_SERVICE_RESPONSE_ID = 3,
++ HTC_MSG_SETUP_COMPLETE_ID = 4,
++} HTC_MSG_IDS;
++
++#define HTC_MAX_CONTROL_MESSAGE_LENGTH 256
++
++/* base message ID header */
++typedef PREPACK struct {
++ A_UINT16 MessageID;
++} POSTPACK HTC_UNKNOWN_MSG;
++
++/* HTC ready message
++ * direction : target-to-host */
++typedef PREPACK struct {
++ A_UINT16 MessageID; /* ID */
++ A_UINT16 CreditCount; /* number of credits the target can offer */
++ A_UINT16 CreditSize; /* size of each credit */
++ A_UINT8 MaxEndpoints; /* maximum number of endpoints the target has resources for */
++ A_UINT8 _Pad1;
++} POSTPACK HTC_READY_MSG;
++
++#define HTC_SERVICE_META_DATA_MAX_LENGTH 128
++
++/* connect service
++ * direction : host-to-target */
++typedef PREPACK struct {
++ A_UINT16 MessageID;
++ A_UINT16 ServiceID; /* service ID of the service to connect to */
++ A_UINT16 ConnectionFlags; /* connection flags */
++
++#define HTC_CONNECT_FLAGS_REDUCE_CREDIT_DRIBBLE (1 << 2) /* reduce credit dribbling when
++ the host needs credits */
++#define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_MASK (0x3)
++#define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_ONE_FOURTH 0x0
++#define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_ONE_HALF 0x1
++#define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_THREE_FOURTHS 0x2
++#define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_UNITY 0x3
++
++ A_UINT8 ServiceMetaLength; /* length of meta data that follows */
++ A_UINT8 _Pad1;
++
++ /* service-specific meta data starts after the header */
++
++} POSTPACK HTC_CONNECT_SERVICE_MSG;
++
++/* connect response
++ * direction : target-to-host */
++typedef PREPACK struct {
++ A_UINT16 MessageID;
++ A_UINT16 ServiceID; /* service ID that the connection request was made */
++ A_UINT8 Status; /* service connection status */
++ A_UINT8 EndpointID; /* assigned endpoint ID */
++ A_UINT16 MaxMsgSize; /* maximum expected message size on this endpoint */
++ A_UINT8 ServiceMetaLength; /* length of meta data that follows */
++ A_UINT8 _Pad1;
++
++ /* service-specific meta data starts after the header */
++
++} POSTPACK HTC_CONNECT_SERVICE_RESPONSE_MSG;
++
++typedef PREPACK struct {
++ A_UINT16 MessageID;
++ /* currently, no other fields */
++} POSTPACK HTC_SETUP_COMPLETE_MSG;
++
++
++/* connect response status codes */
++#define HTC_SERVICE_SUCCESS 0 /* success */
++#define HTC_SERVICE_NOT_FOUND 1 /* service could not be found */
++#define HTC_SERVICE_FAILED 2 /* specific service failed the connect */
++#define HTC_SERVICE_NO_RESOURCES 3 /* no resources (i.e. no more endpoints) */
++#define HTC_SERVICE_NO_MORE_EP 4 /* specific service is not allowing any more
++ endpoints */
++
++/* report record IDs */
++typedef enum {
++ HTC_RECORD_NULL = 0,
++ HTC_RECORD_CREDITS = 1,
++ HTC_RECORD_LOOKAHEAD = 2,
++} HTC_RPT_IDS;
++
++typedef PREPACK struct {
++ A_UINT8 RecordID; /* Record ID */
++ A_UINT8 Length; /* Length of record */
++} POSTPACK HTC_RECORD_HDR;
++
++typedef PREPACK struct {
++ A_UINT8 EndpointID; /* Endpoint that owns these credits */
++ A_UINT8 Credits; /* credits to report since last report */
++} POSTPACK HTC_CREDIT_REPORT;
++
++typedef PREPACK struct {
++ A_UINT8 PreValid; /* pre valid guard */
++ A_UINT8 LookAhead[4]; /* 4 byte lookahead */
++ A_UINT8 PostValid; /* post valid guard */
++
++ /* NOTE: the LookAhead array is guarded by a PreValid and Post Valid guard bytes.
++ * The PreValid bytes must equal the inverse of the PostValid byte */
++
++} POSTPACK HTC_LOOKAHEAD_REPORT;
++
++#ifndef ATH_TARGET
++#include "athendpack.h"
++#endif
++
++
++#endif /* __HTC_H__ */
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/htc_packet.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/htc_packet.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/htc_packet.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/htc_packet.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,138 @@
++/*
++ *
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef HTC_PACKET_H_
++#define HTC_PACKET_H_
++
++
++#include "dl_list.h"
++
++struct _HTC_PACKET;
++
++typedef void (* HTC_PACKET_COMPLETION)(void *,struct _HTC_PACKET *);
++
++typedef A_UINT16 HTC_TX_TAG;
++
++typedef struct _HTC_TX_PACKET_INFO {
++ HTC_TX_TAG Tag; /* tag used to selective flush packets */
++} HTC_TX_PACKET_INFO;
++
++#define HTC_TX_PACKET_TAG_ALL 0 /* a tag of zero is reserved and used to flush ALL packets */
++#define HTC_TX_PACKET_TAG_INTERNAL 1 /* internal tags start here */
++#define HTC_TX_PACKET_TAG_USER_DEFINED (HTC_TX_PACKET_TAG_INTERNAL + 9) /* user-defined tags start here */
++
++typedef struct _HTC_RX_PACKET_INFO {
++ A_UINT32 Unused; /* for future use and to make compilers happy */
++} HTC_RX_PACKET_INFO;
++
++/* wrapper around endpoint-specific packets */
++typedef struct _HTC_PACKET {
++ DL_LIST ListLink; /* double link */
++ void *pPktContext; /* caller's per packet specific context */
++
++ A_UINT8 *pBufferStart; /* the true buffer start , the caller can
++ store the real buffer start here. In
++ receive callbacks, the HTC layer sets pBuffer
++ to the start of the payload past the header. This
++ field allows the caller to reset pBuffer when it
++ recycles receive packets back to HTC */
++ /*
++ * Pointer to the start of the buffer. In the transmit
++ * direction this points to the start of the payload. In the
++ * receive direction, however, the buffer when queued up
++ * points to the start of the HTC header but when returned
++ * to the caller points to the start of the payload
++ */
++ A_UINT8 *pBuffer; /* payload start (RX/TX) */
++ A_UINT32 BufferLength; /* length of buffer */
++ A_UINT32 ActualLength; /* actual length of payload */
++ int Endpoint; /* endpoint that this packet was sent/recv'd from */
++ A_STATUS Status; /* completion status */
++ union {
++ HTC_TX_PACKET_INFO AsTx; /* Tx Packet specific info */
++ HTC_RX_PACKET_INFO AsRx; /* Rx Packet specific info */
++ } PktInfo;
++
++ /* the following fields are for internal HTC use */
++ HTC_PACKET_COMPLETION Completion; /* completion */
++ void *pContext; /* HTC private completion context */
++ A_UINT32 HTCReserved; /* reserved */
++} HTC_PACKET;
++
++
++
++#define COMPLETE_HTC_PACKET(p,status) \
++{ \
++ (p)->Status = (status); \
++ (p)->Completion((p)->pContext,(p)); \
++}
++
++#define INIT_HTC_PACKET_INFO(p,b,len) \
++{ \
++ (p)->pBufferStart = (b); \
++ (p)->BufferLength = (len); \
++}
++
++/* macro to set an initial RX packet for refilling HTC */
++#define SET_HTC_PACKET_INFO_RX_REFILL(p,c,b,len,ep) \
++{ \
++ (p)->pPktContext = (c); \
++ (p)->pBuffer = (b); \
++ (p)->pBufferStart = (b); \
++ (p)->BufferLength = (len); \
++ (p)->Endpoint = (ep); \
++}
++
++/* fast macro to recycle an RX packet that will be re-queued to HTC */
++#define HTC_PACKET_RESET_RX(p) \
++ (p)->pBuffer = (p)->pBufferStart
++
++/* macro to set packet parameters for TX */
++#define SET_HTC_PACKET_INFO_TX(p,c,b,len,ep,tag) \
++{ \
++ (p)->pPktContext = (c); \
++ (p)->pBuffer = (b); \
++ (p)->ActualLength = (len); \
++ (p)->Endpoint = (ep); \
++ (p)->PktInfo.AsTx.Tag = (tag); \
++}
++
++/* HTC Packet Queueing Macros */
++typedef DL_LIST HTC_PACKET_QUEUE;
++/* initialize queue */
++#define INIT_HTC_PACKET_QUEUE(pQ) DL_LIST_INIT((pQ))
++/* enqueue HTC packet to the tail of the queue */
++#define HTC_PACKET_ENQUEUE(pQ,p) DL_ListInsertTail((pQ),&(p)->ListLink)
++/* test if a queue is empty */
++#define HTC_QUEUE_EMPTY(pQ) DL_LIST_IS_EMPTY((pQ))
++/* get packet at head without removing it */
++#define HTC_GET_PKT_AT_HEAD(pQ) A_CONTAINING_STRUCT((DL_LIST_GET_ITEM_AT_HEAD(pQ)),HTC_PACKET,ListLink);
++/* remove a packet from the current list it is linked to */
++#define HTC_PACKET_REMOVE(p) DL_ListRemove(&(p)->ListLink)
++
++/* dequeue an HTC packet from the head of the queue */
++static INLINE HTC_PACKET *HTC_PACKET_DEQUEUE(HTC_PACKET_QUEUE *queue) {
++ DL_LIST *pItem = DL_ListRemoveItemFromHead(queue);
++ if (pItem != NULL) {
++ return A_CONTAINING_STRUCT(pItem, HTC_PACKET, ListLink);
++ }
++ return NULL;
++}
++
++#endif /*HTC_PACKET_H_*/
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/htc_services.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/htc_services.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/htc_services.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/htc_services.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,37 @@
++/*
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ */
++
++#ifndef __HTC_SERVICES_H__
++#define __HTC_SERVICES_H__
++
++/* Current service IDs */
++
++typedef enum {
++ RSVD_SERVICE_GROUP = 0,
++ WMI_SERVICE_GROUP = 1,
++
++ HTC_TEST_GROUP = 254,
++ HTC_SERVICE_GROUP_LAST = 255
++}HTC_SERVICE_GROUP_IDS;
++
++#define MAKE_SERVICE_ID(group,index) \
++ (int)(((int)group << 8) | (int)(index))
++
++/* NOTE: service ID of 0x0000 is reserved and should never be used */
++#define HTC_CTRL_RSVD_SVC MAKE_SERVICE_ID(RSVD_SERVICE_GROUP,1)
++#define WMI_CONTROL_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP,0)
++#define WMI_DATA_BE_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP,1)
++#define WMI_DATA_BK_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP,2)
++#define WMI_DATA_VI_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP,3)
++#define WMI_DATA_VO_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP,4)
++#define WMI_MAX_SERVICES 5
++
++/* raw stream service (i.e. flash, tcmd, calibration apps) */
++#define HTC_RAW_STREAMS_SVC MAKE_SERVICE_ID(HTC_TEST_GROUP,0)
++
++#endif /*HTC_SERVICES_H_*/
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/ieee80211.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/ieee80211.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/ieee80211.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/ieee80211.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,342 @@
++/*-
++ * Copyright (c) 2001 Atsushi Onoe
++ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting
++ * Copyright (c) 2006 Atheros Communications, Inc.
++ *
++ * Wireless Network driver for Atheros AR6001
++ * All rights reserved.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ *
++ */
++#ifndef _NET80211_IEEE80211_H_
++#define _NET80211_IEEE80211_H_
++
++#include "athstartpack.h"
++
++/*
++ * 802.11 protocol definitions.
++ */
++
++#define IEEE80211_ADDR_LEN 6 /* size of 802.11 address */
++/* is 802.11 address multicast/broadcast? */
++#define IEEE80211_IS_MULTICAST(_a) (*(_a) & 0x01)
++#define IEEE80211_ADDR_EQ(addr1, addr2) \
++ (A_MEMCMP(addr1, addr2, IEEE80211_ADDR_LEN) == 0)
++
++#define IEEE80211_KEYBUF_SIZE 16
++#define IEEE80211_MICBUF_SIZE (8+8) /* space for both tx and rx */
++
++/*
++ * NB: these values are ordered carefully; there are lots of
++ * of implications in any reordering. In particular beware
++ * that 4 is not used to avoid conflicting with IEEE80211_F_PRIVACY.
++ */
++#define IEEE80211_CIPHER_WEP 0
++#define IEEE80211_CIPHER_TKIP 1
++#define IEEE80211_CIPHER_AES_OCB 2
++#define IEEE80211_CIPHER_AES_CCM 3
++#define IEEE80211_CIPHER_CKIP 5
++#define IEEE80211_CIPHER_CCKM_KRK 6
++#define IEEE80211_CIPHER_NONE 7 /* pseudo value */
++
++#define IEEE80211_CIPHER_MAX (IEEE80211_CIPHER_NONE+1)
++
++#define IEEE80211_IS_VALID_WEP_CIPHER_LEN(len) \
++ (((len) == 5) || ((len) == 13) || ((len) == 16))
++
++
++
++/*
++ * generic definitions for IEEE 802.11 frames
++ */
++PREPACK struct ieee80211_frame {
++ A_UINT8 i_fc[2];
++ A_UINT8 i_dur[2];
++ A_UINT8 i_addr1[IEEE80211_ADDR_LEN];
++ A_UINT8 i_addr2[IEEE80211_ADDR_LEN];
++ A_UINT8 i_addr3[IEEE80211_ADDR_LEN];
++ A_UINT8 i_seq[2];
++ /* possibly followed by addr4[IEEE80211_ADDR_LEN]; */
++ /* see below */
++} POSTPACK;
++
++#define IEEE80211_FC0_VERSION_MASK 0x03
++#define IEEE80211_FC0_VERSION_SHIFT 0
++#define IEEE80211_FC0_VERSION_0 0x00
++#define IEEE80211_FC0_TYPE_MASK 0x0c
++#define IEEE80211_FC0_TYPE_SHIFT 2
++#define IEEE80211_FC0_TYPE_MGT 0x00
++#define IEEE80211_FC0_TYPE_CTL 0x04
++#define IEEE80211_FC0_TYPE_DATA 0x08
++
++#define IEEE80211_FC0_SUBTYPE_MASK 0xf0
++#define IEEE80211_FC0_SUBTYPE_SHIFT 4
++/* for TYPE_MGT */
++#define IEEE80211_FC0_SUBTYPE_ASSOC_REQ 0x00
++#define IEEE80211_FC0_SUBTYPE_ASSOC_RESP 0x10
++#define IEEE80211_FC0_SUBTYPE_REASSOC_REQ 0x20
++#define IEEE80211_FC0_SUBTYPE_REASSOC_RESP 0x30
++#define IEEE80211_FC0_SUBTYPE_PROBE_REQ 0x40
++#define IEEE80211_FC0_SUBTYPE_PROBE_RESP 0x50
++#define IEEE80211_FC0_SUBTYPE_BEACON 0x80
++#define IEEE80211_FC0_SUBTYPE_ATIM 0x90
++#define IEEE80211_FC0_SUBTYPE_DISASSOC 0xa0
++#define IEEE80211_FC0_SUBTYPE_AUTH 0xb0
++#define IEEE80211_FC0_SUBTYPE_DEAUTH 0xc0
++/* for TYPE_CTL */
++#define IEEE80211_FC0_SUBTYPE_PS_POLL 0xa0
++#define IEEE80211_FC0_SUBTYPE_RTS 0xb0
++#define IEEE80211_FC0_SUBTYPE_CTS 0xc0
++#define IEEE80211_FC0_SUBTYPE_ACK 0xd0
++#define IEEE80211_FC0_SUBTYPE_CF_END 0xe0
++#define IEEE80211_FC0_SUBTYPE_CF_END_ACK 0xf0
++/* for TYPE_DATA (bit combination) */
++#define IEEE80211_FC0_SUBTYPE_DATA 0x00
++#define IEEE80211_FC0_SUBTYPE_CF_ACK 0x10
++#define IEEE80211_FC0_SUBTYPE_CF_POLL 0x20
++#define IEEE80211_FC0_SUBTYPE_CF_ACPL 0x30
++#define IEEE80211_FC0_SUBTYPE_NODATA 0x40
++#define IEEE80211_FC0_SUBTYPE_CFACK 0x50
++#define IEEE80211_FC0_SUBTYPE_CFPOLL 0x60
++#define IEEE80211_FC0_SUBTYPE_CF_ACK_CF_ACK 0x70
++#define IEEE80211_FC0_SUBTYPE_QOS 0x80
++#define IEEE80211_FC0_SUBTYPE_QOS_NULL 0xc0
++
++#define IEEE80211_FC1_DIR_MASK 0x03
++#define IEEE80211_FC1_DIR_NODS 0x00 /* STA->STA */
++#define IEEE80211_FC1_DIR_TODS 0x01 /* STA->AP */
++#define IEEE80211_FC1_DIR_FROMDS 0x02 /* AP ->STA */
++#define IEEE80211_FC1_DIR_DSTODS 0x03 /* AP ->AP */
++
++#define IEEE80211_FC1_MORE_FRAG 0x04
++#define IEEE80211_FC1_RETRY 0x08
++#define IEEE80211_FC1_PWR_MGT 0x10
++#define IEEE80211_FC1_MORE_DATA 0x20
++#define IEEE80211_FC1_WEP 0x40
++#define IEEE80211_FC1_ORDER 0x80
++
++#define IEEE80211_SEQ_FRAG_MASK 0x000f
++#define IEEE80211_SEQ_FRAG_SHIFT 0
++#define IEEE80211_SEQ_SEQ_MASK 0xfff0
++#define IEEE80211_SEQ_SEQ_SHIFT 4
++
++#define IEEE80211_NWID_LEN 32
++
++/*
++ * 802.11 rate set.
++ */
++#define IEEE80211_RATE_SIZE 8 /* 802.11 standard */
++#define IEEE80211_RATE_MAXSIZE 15 /* max rates we'll handle */
++
++#define WMM_NUM_AC 4 /* 4 AC categories */
++
++#define WMM_PARAM_ACI_M 0x60 /* Mask for ACI field */
++#define WMM_PARAM_ACI_S 5 /* Shift for ACI field */
++#define WMM_PARAM_ACM_M 0x10 /* Mask for ACM bit */
++#define WMM_PARAM_ACM_S 4 /* Shift for ACM bit */
++#define WMM_PARAM_AIFSN_M 0x0f /* Mask for aifsn field */
++#define WMM_PARAM_LOGCWMIN_M 0x0f /* Mask for CwMin field (in log) */
++#define WMM_PARAM_LOGCWMAX_M 0xf0 /* Mask for CwMax field (in log) */
++#define WMM_PARAM_LOGCWMAX_S 4 /* Shift for CwMax field */
++
++#define WMM_AC_TO_TID(_ac) ( \
++ ((_ac) == WMM_AC_VO) ? 6 : \
++ ((_ac) == WMM_AC_VI) ? 5 : \
++ ((_ac) == WMM_AC_BK) ? 1 : \
++ 0)
++
++#define TID_TO_WMM_AC(_tid) ( \
++ ((_tid) < 1) ? WMM_AC_BE : \
++ ((_tid) < 3) ? WMM_AC_BK : \
++ ((_tid) < 6) ? WMM_AC_VI : \
++ WMM_AC_VO)
++/*
++ * Management information element payloads.
++ */
++
++enum {
++ IEEE80211_ELEMID_SSID = 0,
++ IEEE80211_ELEMID_RATES = 1,
++ IEEE80211_ELEMID_FHPARMS = 2,
++ IEEE80211_ELEMID_DSPARMS = 3,
++ IEEE80211_ELEMID_CFPARMS = 4,
++ IEEE80211_ELEMID_TIM = 5,
++ IEEE80211_ELEMID_IBSSPARMS = 6,
++ IEEE80211_ELEMID_COUNTRY = 7,
++ IEEE80211_ELEMID_CHALLENGE = 16,
++ /* 17-31 reserved for challenge text extension */
++ IEEE80211_ELEMID_PWRCNSTR = 32,
++ IEEE80211_ELEMID_PWRCAP = 33,
++ IEEE80211_ELEMID_TPCREQ = 34,
++ IEEE80211_ELEMID_TPCREP = 35,
++ IEEE80211_ELEMID_SUPPCHAN = 36,
++ IEEE80211_ELEMID_CHANSWITCH = 37,
++ IEEE80211_ELEMID_MEASREQ = 38,
++ IEEE80211_ELEMID_MEASREP = 39,
++ IEEE80211_ELEMID_QUIET = 40,
++ IEEE80211_ELEMID_IBSSDFS = 41,
++ IEEE80211_ELEMID_ERP = 42,
++ IEEE80211_ELEMID_RSN = 48,
++ IEEE80211_ELEMID_XRATES = 50,
++ IEEE80211_ELEMID_TPC = 150,
++ IEEE80211_ELEMID_CCKM = 156,
++ IEEE80211_ELEMID_VENDOR = 221, /* vendor private */
++};
++
++#define ATH_OUI 0x7f0300 /* Atheros OUI */
++#define ATH_OUI_TYPE 0x01
++#define ATH_OUI_SUBTYPE 0x01
++#define ATH_OUI_VERSION 0x00
++
++#define WPA_OUI 0xf25000
++#define WPA_OUI_TYPE 0x01
++#define WPA_VERSION 1 /* current supported version */
++
++#define WPA_CSE_NULL 0x00
++#define WPA_CSE_WEP40 0x01
++#define WPA_CSE_TKIP 0x02
++#define WPA_CSE_CCMP 0x04
++#define WPA_CSE_WEP104 0x05
++
++#define WPA_ASE_NONE 0x00
++#define WPA_ASE_8021X_UNSPEC 0x01
++#define WPA_ASE_8021X_PSK 0x02
++
++#define RSN_OUI 0xac0f00
++#define RSN_VERSION 1 /* current supported version */
++
++#define RSN_CSE_NULL 0x00
++#define RSN_CSE_WEP40 0x01
++#define RSN_CSE_TKIP 0x02
++#define RSN_CSE_WRAP 0x03
++#define RSN_CSE_CCMP 0x04
++#define RSN_CSE_WEP104 0x05
++
++#define RSN_ASE_NONE 0x00
++#define RSN_ASE_8021X_UNSPEC 0x01
++#define RSN_ASE_8021X_PSK 0x02
++
++#define RSN_CAP_PREAUTH 0x01
++
++#define WMM_OUI 0xf25000
++#define WMM_OUI_TYPE 0x02
++#define WMM_INFO_OUI_SUBTYPE 0x00
++#define WMM_PARAM_OUI_SUBTYPE 0x01
++#define WMM_VERSION 1
++
++/* WMM stream classes */
++#define WMM_NUM_AC 4
++#define WMM_AC_BE 0 /* best effort */
++#define WMM_AC_BK 1 /* background */
++#define WMM_AC_VI 2 /* video */
++#define WMM_AC_VO 3 /* voice */
++
++/* TSPEC related */
++#define ACTION_CATEGORY_CODE_TSPEC 17
++#define ACTION_CODE_TSPEC_ADDTS 0
++#define ACTION_CODE_TSPEC_ADDTS_RESP 1
++#define ACTION_CODE_TSPEC_DELTS 2
++
++typedef enum {
++ TSPEC_STATUS_CODE_ADMISSION_ACCEPTED = 0,
++ TSPEC_STATUS_CODE_ADDTS_INVALID_PARAMS = 0x1,
++ TSPEC_STATUS_CODE_ADDTS_REQUEST_REFUSED = 0x3,
++ TSPEC_STATUS_CODE_UNSPECIFIED_QOS_RELATED_FAILURE = 0xC8,
++ TSPEC_STATUS_CODE_REQUESTED_REFUSED_POLICY_CONFIGURATION = 0xC9,
++ TSPEC_STATUS_CODE_INSUFFCIENT_BANDWIDTH = 0xCA,
++ TSPEC_STATUS_CODE_INVALID_PARAMS = 0xCB,
++ TSPEC_STATUS_CODE_DELTS_SENT = 0x30,
++ TSPEC_STATUS_CODE_DELTS_RECV = 0x31,
++} TSPEC_STATUS_CODE;
++
++/*
++ * WMM/802.11e Tspec Element
++ */
++typedef PREPACK struct wmm_tspec_ie_t {
++ A_UINT8 elementId;
++ A_UINT8 len;
++ A_UINT8 oui[3];
++ A_UINT8 ouiType;
++ A_UINT8 ouiSubType;
++ A_UINT8 version;
++ A_UINT16 tsInfo_info;
++ A_UINT8 tsInfo_reserved;
++ A_UINT16 nominalMSDU;
++ A_UINT16 maxMSDU;
++ A_UINT32 minServiceInt;
++ A_UINT32 maxServiceInt;
++ A_UINT32 inactivityInt;
++ A_UINT32 suspensionInt;
++ A_UINT32 serviceStartTime;
++ A_UINT32 minDataRate;
++ A_UINT32 meanDataRate;
++ A_UINT32 peakDataRate;
++ A_UINT32 maxBurstSize;
++ A_UINT32 delayBound;
++ A_UINT32 minPhyRate;
++ A_UINT16 sba;
++ A_UINT16 mediumTime;
++} POSTPACK WMM_TSPEC_IE;
++
++
++/*
++ * BEACON management packets
++ *
++ * octet timestamp[8]
++ * octet beacon interval[2]
++ * octet capability information[2]
++ * information element
++ * octet elemid
++ * octet length
++ * octet information[length]
++ */
++
++#define IEEE80211_BEACON_INTERVAL(beacon) \
++ ((beacon)[8] | ((beacon)[9] << 8))
++#define IEEE80211_BEACON_CAPABILITY(beacon) \
++ ((beacon)[10] | ((beacon)[11] << 8))
++
++#define IEEE80211_CAPINFO_ESS 0x0001
++#define IEEE80211_CAPINFO_IBSS 0x0002
++#define IEEE80211_CAPINFO_CF_POLLABLE 0x0004
++#define IEEE80211_CAPINFO_CF_POLLREQ 0x0008
++#define IEEE80211_CAPINFO_PRIVACY 0x0010
++#define IEEE80211_CAPINFO_SHORT_PREAMBLE 0x0020
++#define IEEE80211_CAPINFO_PBCC 0x0040
++#define IEEE80211_CAPINFO_CHNL_AGILITY 0x0080
++/* bits 8-9 are reserved */
++#define IEEE80211_CAPINFO_SHORT_SLOTTIME 0x0400
++#define IEEE80211_CAPINFO_APSD 0x0800
++/* bit 12 is reserved */
++#define IEEE80211_CAPINFO_DSSSOFDM 0x2000
++/* bits 14-15 are reserved */
++
++/*
++ * Authentication Modes
++ */
++
++enum ieee80211_authmode {
++ IEEE80211_AUTH_NONE = 0,
++ IEEE80211_AUTH_OPEN = 1,
++ IEEE80211_AUTH_SHARED = 2,
++ IEEE80211_AUTH_8021X = 3,
++ IEEE80211_AUTH_AUTO = 4, /* auto-select/accept */
++ /* NB: these are used only for ioctls */
++ IEEE80211_AUTH_WPA = 5, /* WPA/RSN w/ 802.1x */
++ IEEE80211_AUTH_WPA_PSK = 6, /* WPA/RSN w/ PSK */
++ IEEE80211_AUTH_WPA_CCKM = 7, /* WPA/RSN IE w/ CCKM */
++};
++
++#include "athendpack.h"
++
++#endif /* _NET80211_IEEE80211_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/ieee80211_ioctl.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/ieee80211_ioctl.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/ieee80211_ioctl.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/ieee80211_ioctl.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,163 @@
++/*
++ * Copyright (c) 2004-2005 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ *
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/os/linux/include/ieee80211_ioctl.h#1 $
++ */
++
++#ifndef _IEEE80211_IOCTL_H_
++#define _IEEE80211_IOCTL_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*
++ * Extracted from the MADWIFI net80211/ieee80211_ioctl.h
++ */
++
++/*
++ * WPA/RSN get/set key request. Specify the key/cipher
++ * type and whether the key is to be used for sending and/or
++ * receiving. The key index should be set only when working
++ * with global keys (use IEEE80211_KEYIX_NONE for ``no index'').
++ * Otherwise a unicast/pairwise key is specified by the bssid
++ * (on a station) or mac address (on an ap). They key length
++ * must include any MIC key data; otherwise it should be no
++ more than IEEE80211_KEYBUF_SIZE.
++ */
++struct ieee80211req_key {
++ u_int8_t ik_type; /* key/cipher type */
++ u_int8_t ik_pad;
++ u_int16_t ik_keyix; /* key index */
++ u_int8_t ik_keylen; /* key length in bytes */
++ u_int8_t ik_flags;
++#define IEEE80211_KEY_XMIT 0x01
++#define IEEE80211_KEY_RECV 0x02
++#define IEEE80211_KEY_DEFAULT 0x80 /* default xmit key */
++ u_int8_t ik_macaddr[IEEE80211_ADDR_LEN];
++ u_int64_t ik_keyrsc; /* key receive sequence counter */
++ u_int64_t ik_keytsc; /* key transmit sequence counter */
++ u_int8_t ik_keydata[IEEE80211_KEYBUF_SIZE+IEEE80211_MICBUF_SIZE];
++};
++/*
++ * Delete a key either by index or address. Set the index
++ * to IEEE80211_KEYIX_NONE when deleting a unicast key.
++ */
++struct ieee80211req_del_key {
++ u_int8_t idk_keyix; /* key index */
++ u_int8_t idk_macaddr[IEEE80211_ADDR_LEN];
++};
++/*
++ * MLME state manipulation request. IEEE80211_MLME_ASSOC
++ * only makes sense when operating as a station. The other
++ * requests can be used when operating as a station or an
++ * ap (to effect a station).
++ */
++struct ieee80211req_mlme {
++ u_int8_t im_op; /* operation to perform */
++#define IEEE80211_MLME_ASSOC 1 /* associate station */
++#define IEEE80211_MLME_DISASSOC 2 /* disassociate station */
++#define IEEE80211_MLME_DEAUTH 3 /* deauthenticate station */
++#define IEEE80211_MLME_AUTHORIZE 4 /* authorize station */
++#define IEEE80211_MLME_UNAUTHORIZE 5 /* unauthorize station */
++ u_int16_t im_reason; /* 802.11 reason code */
++ u_int8_t im_macaddr[IEEE80211_ADDR_LEN];
++};
++
++struct ieee80211req_addpmkid {
++ u_int8_t pi_bssid[IEEE80211_ADDR_LEN];
++ u_int8_t pi_enable;
++ u_int8_t pi_pmkid[16];
++};
++
++#define AUTH_ALG_OPEN_SYSTEM 0x01
++#define AUTH_ALG_SHARED_KEY 0x02
++#define AUTH_ALG_LEAP 0x04
++
++struct ieee80211req_authalg {
++ u_int8_t auth_alg;
++};
++
++/*
++ * Request to add an IE to a Management Frame
++ */
++enum{
++ IEEE80211_APPIE_FRAME_BEACON = 0,
++ IEEE80211_APPIE_FRAME_PROBE_REQ = 1,
++ IEEE80211_APPIE_FRAME_PROBE_RESP = 2,
++ IEEE80211_APPIE_FRAME_ASSOC_REQ = 3,
++ IEEE80211_APPIE_FRAME_ASSOC_RESP = 4,
++ IEEE80211_APPIE_NUM_OF_FRAME = 5
++};
++
++/*
++ * The Maximum length of the IE that can be added to a Management frame
++ */
++#define IEEE80211_APPIE_FRAME_MAX_LEN 78
++
++struct ieee80211req_getset_appiebuf {
++ u_int32_t app_frmtype; /* management frame type for which buffer is added */
++ u_int32_t app_buflen; /*application supplied buffer length */
++ u_int8_t app_buf[];
++};
++
++/*
++ * The following definitions are used by an application to set filter
++ * for receiving management frames
++ */
++enum {
++ IEEE80211_FILTER_TYPE_BEACON = 0x1,
++ IEEE80211_FILTER_TYPE_PROBE_REQ = 0x2,
++ IEEE80211_FILTER_TYPE_PROBE_RESP = 0x4,
++ IEEE80211_FILTER_TYPE_ASSOC_REQ = 0x8,
++ IEEE80211_FILTER_TYPE_ASSOC_RESP = 0x10,
++ IEEE80211_FILTER_TYPE_AUTH = 0x20,
++ IEEE80211_FILTER_TYPE_DEAUTH = 0x40,
++ IEEE80211_FILTER_TYPE_DISASSOC = 0x80,
++ IEEE80211_FILTER_TYPE_ALL = 0xFF /* used to check the valid filter bits */
++};
++
++struct ieee80211req_set_filter {
++ u_int32_t app_filterype; /* management frame filter type */
++};
++
++enum {
++ IEEE80211_PARAM_AUTHMODE = 3, /* Authentication Mode */
++ IEEE80211_PARAM_MCASTCIPHER = 5,
++ IEEE80211_PARAM_MCASTKEYLEN = 6, /* multicast key length */
++ IEEE80211_PARAM_UCASTCIPHER = 8,
++ IEEE80211_PARAM_UCASTKEYLEN = 9, /* unicast key length */
++ IEEE80211_PARAM_WPA = 10, /* WPA mode (0,1,2) */
++ IEEE80211_PARAM_ROAMING = 12, /* roaming mode */
++ IEEE80211_PARAM_PRIVACY = 13, /* privacy invoked */
++ IEEE80211_PARAM_COUNTERMEASURES = 14, /* WPA/TKIP countermeasures */
++ IEEE80211_PARAM_DROPUNENCRYPTED = 15, /* discard unencrypted frames */
++};
++
++/*
++ * Values for IEEE80211_PARAM_WPA
++ */
++#define WPA_MODE_WPA1 1
++#define WPA_MODE_WPA2 2
++#define WPA_MODE_AUTO 3
++#define WPA_MODE_NONE 4
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _IEEE80211_IOCTL_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/ieee80211_node.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/ieee80211_node.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/ieee80211_node.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/ieee80211_node.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,77 @@
++/*-
++ * Copyright (c) 2001 Atsushi Onoe
++ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting
++ * Copyright (c) 2006 Atheros Communications, Inc.
++ *
++ * Wireless Network driver for Atheros AR6001
++ * All rights reserved.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ *
++ */
++#ifndef _IEEE80211_NODE_H_
++#define _IEEE80211_NODE_H_
++
++/*
++ * Node locking definitions.
++ */
++#define IEEE80211_NODE_LOCK_INIT(_nt) A_MUTEX_INIT(&(_nt)->nt_nodelock)
++#define IEEE80211_NODE_LOCK_DESTROY(_nt)
++#define IEEE80211_NODE_LOCK(_nt) A_MUTEX_LOCK(&(_nt)->nt_nodelock)
++#define IEEE80211_NODE_UNLOCK(_nt) A_MUTEX_UNLOCK(&(_nt)->nt_nodelock)
++#define IEEE80211_NODE_LOCK_BH(_nt) A_MUTEX_LOCK(&(_nt)->nt_nodelock)
++#define IEEE80211_NODE_UNLOCK_BH(_nt) A_MUTEX_UNLOCK(&(_nt)->nt_nodelock)
++#define IEEE80211_NODE_LOCK_ASSERT(_nt)
++
++/*
++ * Node reference counting definitions.
++ *
++ * ieee80211_node_initref initialize the reference count to 1
++ * ieee80211_node_incref add a reference
++ * ieee80211_node_decref remove a reference
++ * ieee80211_node_dectestref remove a reference and return 1 if this
++ * is the last reference, otherwise 0
++ * ieee80211_node_refcnt reference count for printing (only)
++ */
++#define ieee80211_node_initref(_ni) ((_ni)->ni_refcnt = 1)
++#define ieee80211_node_incref(_ni) ((_ni)->ni_refcnt++)
++#define ieee80211_node_decref(_ni) ((_ni)->ni_refcnt--)
++#define ieee80211_node_dectestref(_ni) (((_ni)->ni_refcnt--) == 0)
++#define ieee80211_node_refcnt(_ni) ((_ni)->ni_refcnt)
++
++#define IEEE80211_NODE_HASHSIZE 32
++/* simple hash is enough for variation of macaddr */
++#define IEEE80211_NODE_HASH(addr) \
++ (((const A_UINT8 *)(addr))[IEEE80211_ADDR_LEN - 1] % \
++ IEEE80211_NODE_HASHSIZE)
++
++/*
++ * Table of ieee80211_node instances. Each ieee80211com
++ * has at least one for holding the scan candidates.
++ * When operating as an access point or in ibss mode there
++ * is a second table for associated stations or neighbors.
++ */
++struct ieee80211_node_table {
++ void *nt_wmip; /* back reference */
++ A_MUTEX_T nt_nodelock; /* on node table */
++ struct bss *nt_node_first; /* information of all nodes */
++ struct bss *nt_node_last; /* information of all nodes */
++ struct bss *nt_hash[IEEE80211_NODE_HASHSIZE];
++ const char *nt_name; /* for debugging */
++ A_UINT32 nt_scangen; /* gen# for timeout scan */
++ A_TIMER nt_inact_timer;
++ A_UINT8 isTimerArmed; /* is the node timer armed */
++};
++
++#define WLAN_NODE_INACT_TIMEOUT_MSEC 10000
++
++#endif /* _IEEE80211_NODE_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/ini_dset.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/ini_dset.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/ini_dset.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/ini_dset.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,40 @@
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ */
++#ifndef _INI_DSET_H_
++#define _INI_DSET_H_
++
++/*
++ * Each of these represents a WHAL INI table, which consists
++ * of an "address column" followed by 1 or more "value columns".
++ *
++ * Software uses the base WHAL_INI_DATA_ID+column to access a
++ * DataSet that holds a particular column of data.
++ */
++typedef enum {
++ WHAL_INI_DATA_ID_NULL =0,
++ WHAL_INI_DATA_ID_MODE_SPECIFIC =1, /* 2,3 */
++ WHAL_INI_DATA_ID_COMMON =4, /* 5 */
++ WHAL_INI_DATA_ID_BB_RFGAIN =6, /* 7,8 */
++ WHAL_INI_DATA_ID_ANALOG_BANK1 =9, /* 10 */
++ WHAL_INI_DATA_ID_ANALOG_BANK2 =11, /* 12 */
++ WHAL_INI_DATA_ID_ANALOG_BANK3 =13, /* 14, 15 */
++ WHAL_INI_DATA_ID_ANALOG_BANK6 =16, /* 17, 18 */
++ WHAL_INI_DATA_ID_ANALOG_BANK7 =19, /* 20 */
++ WHAL_INI_DATA_ID_MODE_OVERRIDES =21, /* 22,23 */
++ WHAL_INI_DATA_ID_COMMON_OVERRIDES =24, /* 25 */
++
++ WHAL_INI_DATA_ID_MAX =25
++} WHAL_INI_DATA_ID;
++
++typedef PREPACK struct {
++ A_UINT16 freqIndex; // 1 - A mode 2 - B or G mode 0 - common
++ A_UINT16 offset;
++ A_UINT32 newValue;
++} POSTPACK INI_DSET_REG_OVERRIDE;
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/regDb.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/regDb.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/regDb.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/regDb.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,19 @@
++/*
++ * Copyright (c) 2005 Atheros Communications, Inc.
++ * All rights reserved.
++ *
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ * This module contains the header files for regulatory module,
++ * which include the DB schema and DB values.
++ * $Id:
++ */
++
++#ifndef __REG_DB_H__
++#define __REG_DB_H__
++
++#include "./regulatory/reg_dbschema.h"
++#include "./regulatory/reg_dbvalues.h"
++
++#endif /* __REG_DB_H__ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/regdump.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/regdump.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/regdump.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/regdump.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,33 @@
++#ifndef __REGDUMP_H__
++#define __REGDUMP_H__
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ */
++#if defined(AR6001)
++#include "AR6001/AR6001_regdump.h"
++#endif
++#if defined(AR6002)
++#include "AR6002/AR6002_regdump.h"
++#endif
++
++#if !defined(__ASSEMBLER__)
++/*
++ * Target CPU state at the time of failure is reflected
++ * in a register dump, which the Host can fetch through
++ * the diagnostic window.
++ */
++struct register_dump_s {
++ A_UINT32 target_id; /* Target ID */
++ A_UINT32 assline; /* Line number (if assertion failure) */
++ A_UINT32 pc; /* Program Counter at time of exception */
++ A_UINT32 badvaddr; /* Virtual address causing exception */
++ CPU_exception_frame_t exc_frame; /* CPU-specific exception info */
++
++ /* Could copy top of stack here, too.... */
++};
++#endif /* __ASSEMBLER__ */
++#endif /* __REGDUMP_H__ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/targaddrs.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/targaddrs.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/targaddrs.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/targaddrs.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,158 @@
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ */
++
++#ifndef __TARGADDRS_H__
++#define __TARGADDRS_H__
++#if defined(AR6001)
++#include "AR6001/addrs.h"
++#endif
++#if defined(AR6002)
++#include "AR6002/addrs.h"
++#endif
++
++/*
++ * AR6K option bits, to enable/disable various features.
++ * By default, all option bits are 0.
++ * These bits can be set in LOCAL_SCRATCH register 0.
++ */
++#define AR6K_OPTION_BMI_DISABLE 0x01 /* Disable BMI comm with Host */
++#define AR6K_OPTION_SERIAL_ENABLE 0x02 /* Enable serial port msgs */
++#define AR6K_OPTION_WDT_DISABLE 0x04 /* WatchDog Timer override */
++#define AR6K_OPTION_SLEEP_DISABLE 0x08 /* Disable system sleep */
++#define AR6K_OPTION_STOP_BOOT 0x10 /* Stop boot processes (for ATE) */
++#define AR6K_OPTION_ENABLE_NOANI 0x20 /* Operate without ANI */
++#define AR6K_OPTION_DSET_DISABLE 0x40 /* Ignore DataSets */
++#define AR6K_OPTION_IGNORE_FLASH 0x80 /* Ignore flash during bootup */
++
++/*
++ * xxx_HOST_INTEREST_ADDRESS is the address in Target RAM of the
++ * host_interest structure. It must match the address of the _host_interest
++ * symbol (see linker script).
++ *
++ * Host Interest is shared between Host and Target in order to coordinate
++ * between the two, and is intended to remain constant (with additions only
++ * at the end) across software releases.
++ */
++#define AR6001_HOST_INTEREST_ADDRESS 0x80000600
++#define AR6002_HOST_INTEREST_ADDRESS 0x00500400
++
++#define HOST_INTEREST_MAX_SIZE 0x100
++
++#if !defined(__ASSEMBLER__)
++struct register_dump_s;
++struct dbglog_hdr_s;
++
++/*
++ * These are items that the Host may need to access
++ * via BMI or via the Diagnostic Window. The position
++ * of items in this structure must remain constant
++ * across firmware revisions!
++ *
++ * Types for each item must be fixed size across
++ * target and host platforms.
++ *
++ * More items may be added at the end.
++ */
++struct host_interest_s {
++ /*
++ * Pointer to application-defined area, if any.
++ * Set by Target application during startup.
++ */
++ A_UINT32 hi_app_host_interest; /* 0x00 */
++
++ /* Pointer to register dump area, valid after Target crash. */
++ A_UINT32 hi_failure_state; /* 0x04 */
++
++ /* Pointer to debug logging header */
++ A_UINT32 hi_dbglog_hdr; /* 0x08 */
++
++ /* Indicates whether or not flash is present on Target.
++ * NB: flash_is_present indicator is here not just
++ * because it might be of interest to the Host; but
++ * also because it's set early on by Target's startup
++ * asm code and we need it to have a special RAM address
++ * so that it doesn't get reinitialized with the rest
++ * of data.
++ */
++ A_UINT32 hi_flash_is_present; /* 0x0c */
++
++ /*
++ * General-purpose flag bits, similar to AR6000_OPTION_* flags.
++ * Can be used by application rather than by OS.
++ */
++ A_UINT32 hi_option_flag; /* 0x10 */
++
++ /*
++ * Boolean that determines whether or not to
++ * display messages on the serial port.
++ */
++ A_UINT32 hi_serial_enable; /* 0x14 */
++
++ /* Start address of Flash DataSet index, if any */
++ A_UINT32 hi_dset_list_head; /* 0x18 */
++
++ /* Override Target application start address */
++ A_UINT32 hi_app_start; /* 0x1c */
++
++ /* Clock and voltage tuning */
++ A_UINT32 hi_skip_clock_init; /* 0x20 */
++ A_UINT32 hi_core_clock_setting; /* 0x24 */
++ A_UINT32 hi_cpu_clock_setting; /* 0x28 */
++ A_UINT32 hi_system_sleep_setting; /* 0x2c */
++ A_UINT32 hi_xtal_control_setting; /* 0x30 */
++ A_UINT32 hi_pll_ctrl_setting_24ghz; /* 0x34 */
++ A_UINT32 hi_pll_ctrl_setting_5ghz; /* 0x38 */
++ A_UINT32 hi_ref_voltage_trim_setting; /* 0x3c */
++ A_UINT32 hi_clock_info; /* 0x40 */
++
++ /*
++ * Flash configuration overrides, used only
++ * when firmware is not executing from flash.
++ * (When using flash, modify the global variables
++ * with equivalent names.)
++ */
++ A_UINT32 hi_bank0_addr_value; /* 0x44 */
++ A_UINT32 hi_bank0_read_value; /* 0x48 */
++ A_UINT32 hi_bank0_write_value; /* 0x4c */
++ A_UINT32 hi_bank0_config_value; /* 0x50 */
++
++ /* Pointer to Board Data */
++ A_UINT32 hi_board_data; /* 0x54 */
++ A_UINT32 hi_board_data_initialized; /* 0x58 */
++
++ A_UINT32 hi_dset_RAM_index_table; /* 0x5c */
++
++ A_UINT32 hi_desired_baud_rate; /* 0x60 */
++ A_UINT32 hi_dbglog_config; /* 0x64 */
++ A_UINT32 hi_end_RAM_reserve_sz; /* 0x68 */
++ A_UINT32 hi_mbox_io_block_sz; /* 0x6c */
++
++ A_UINT32 hi_num_bpatch_streams; /* 0x70 */
++ A_UINT32 hi_mbox_isr_yield_limit; /* 0x74 */
++
++ A_UINT32 hi_refclk_hz; /* 0x78 */
++};
++
++/* Bits defined in hi_option_flag */
++#define HI_OPTION_TIMER_WAR 1 /* not really used */
++
++/*
++ * Intended for use by Host software, this macro returns the Target RAM
++ * address of any item in the host_interest structure.
++ * Example: target_addr = AR6001_HOST_INTEREST_ITEM_ADDRESS(hi_board_data);
++ */
++#define AR6001_HOST_INTEREST_ITEM_ADDRESS(item) \
++ ((A_UINT32)&((((struct host_interest_s *)(AR6001_HOST_INTEREST_ADDRESS))->item)))
++
++#define AR6002_HOST_INTEREST_ITEM_ADDRESS(item) \
++ ((A_UINT32)&((((struct host_interest_s *)(AR6002_HOST_INTEREST_ADDRESS))->item)))
++
++
++#endif /* !__ASSEMBLER__ */
++
++#endif /* __TARGADDRS_H__ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/testcmd.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/testcmd.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/testcmd.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/testcmd.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,144 @@
++/*
++ * Copyright (c) 2004-2005 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ */
++
++#ifndef TESTCMD_H_
++#define TESTCMD_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++typedef enum {
++ ZEROES_PATTERN = 0,
++ ONES_PATTERN,
++ REPEATING_10,
++ PN7_PATTERN,
++ PN9_PATTERN,
++ PN15_PATTERN
++}TX_DATA_PATTERN;
++
++/* Continous tx
++ mode : TCMD_CONT_TX_OFF - Disabling continous tx
++ TCMD_CONT_TX_SINE - Enable continuous unmodulated tx
++ TCMD_CONT_TX_FRAME- Enable continuous modulated tx
++ freq : Channel freq in Mhz. (e.g 2412 for channel 1 in 11 g)
++dataRate: 0 - 1 Mbps
++ 1 - 2 Mbps
++ 2 - 5.5 Mbps
++ 3 - 11 Mbps
++ 4 - 6 Mbps
++ 5 - 9 Mbps
++ 6 - 12 Mbps
++ 7 - 18 Mbps
++ 8 - 24 Mbps
++ 9 - 36 Mbps
++ 10 - 28 Mbps
++ 11 - 54 Mbps
++ txPwr: Tx power in dBm[5 -11] for unmod Tx, [5-14] for mod Tx
++antenna: 1 - one antenna
++ 2 - two antenna
++Note : Enable/disable continuous tx test cmd works only when target is awake.
++*/
++
++typedef enum {
++ TCMD_CONT_TX_OFF = 0,
++ TCMD_CONT_TX_SINE,
++ TCMD_CONT_TX_FRAME,
++ TCMD_CONT_TX_TX99,
++ TCMD_CONT_TX_TX100
++} TCMD_CONT_TX_MODE;
++
++typedef PREPACK struct {
++ A_UINT32 testCmdId;
++ A_UINT32 mode;
++ A_UINT32 freq;
++ A_UINT32 dataRate;
++ A_INT32 txPwr;
++ A_UINT32 antenna;
++ A_UINT32 enANI;
++ A_UINT32 scramblerOff;
++ A_UINT32 aifsn;
++ A_UINT16 pktSz;
++ A_UINT16 txPattern;
++} POSTPACK TCMD_CONT_TX;
++
++#define TCMD_TXPATTERN_ZERONE 0x1
++#define TCMD_TXPATTERN_ZERONE_DIS_SCRAMBLE 0x2
++
++/* Continuous Rx
++ act: TCMD_CONT_RX_PROMIS - promiscuous mode (accept all incoming frames)
++ TCMD_CONT_RX_FILTER - filter mode (accept only frames with dest
++ address equal specified
++ mac address (set via act =3)
++ TCMD_CONT_RX_REPORT off mode (disable cont rx mode and get the
++ report from the last cont
++ Rx test)
++
++ TCMD_CONT_RX_SETMAC - set MacAddr mode (sets the MAC address for the
++ target. This Overrides
++ the default MAC address.)
++
++*/
++typedef enum {
++ TCMD_CONT_RX_PROMIS =0,
++ TCMD_CONT_RX_FILTER,
++ TCMD_CONT_RX_REPORT,
++ TCMD_CONT_RX_SETMAC
++} TCMD_CONT_RX_ACT;
++
++typedef PREPACK struct {
++ A_UINT32 testCmdId;
++ A_UINT32 act;
++ A_UINT32 enANI;
++ PREPACK union {
++ struct PREPACK TCMD_CONT_RX_PARA {
++ A_UINT32 freq;
++ A_UINT32 antenna;
++ } POSTPACK para;
++ struct PREPACK TCMD_CONT_RX_REPORT {
++ A_UINT32 totalPkt;
++ A_INT32 rssiInDBm;
++ } POSTPACK report;
++ struct PREPACK TCMD_CONT_RX_MAC {
++ A_UCHAR addr[ATH_MAC_LEN];
++ } POSTPACK mac;
++ } POSTPACK u;
++} POSTPACK TCMD_CONT_RX;
++
++/* Force sleep/wake test cmd
++ mode: TCMD_PM_WAKEUP - Wakeup the target
++ TCMD_PM_SLEEP - Force the target to sleep.
++ */
++typedef enum {
++ TCMD_PM_WAKEUP = 1, /* be consistent with target */
++ TCMD_PM_SLEEP
++} TCMD_PM_MODE;
++
++typedef PREPACK struct {
++ A_UINT32 testCmdId;
++ A_UINT32 mode;
++} POSTPACK TCMD_PM;
++
++typedef enum{
++ TCMD_CONT_TX_ID,
++ TCMD_CONT_RX_ID,
++ TCMD_PM_ID
++ } TCMD_ID;
++
++typedef PREPACK union {
++ TCMD_CONT_TX contTx;
++ TCMD_CONT_RX contRx;
++ TCMD_PM pm ;
++} POSTPACK TEST_CMD;
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* TESTCMD_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/wlan_api.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/wlan_api.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/wlan_api.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/wlan_api.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,101 @@
++#ifndef _HOST_WLAN_API_H_
++#define _HOST_WLAN_API_H_
++/*
++ * Copyright (c) 2004-2005 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * This file contains the API for the host wlan module
++ *
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/include/wlan_api.h#1 $
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++struct ieee80211_node_table;
++struct ieee80211_frame;
++
++struct ieee80211_common_ie {
++ A_UINT16 ie_chan;
++ A_UINT8 *ie_tstamp;
++ A_UINT8 *ie_ssid;
++ A_UINT8 *ie_rates;
++ A_UINT8 *ie_xrates;
++ A_UINT8 *ie_country;
++ A_UINT8 *ie_wpa;
++ A_UINT8 *ie_rsn;
++ A_UINT8 *ie_wmm;
++ A_UINT8 *ie_ath;
++ A_UINT16 ie_capInfo;
++ A_UINT16 ie_beaconInt;
++ A_UINT8 *ie_tim;
++ A_UINT8 *ie_chswitch;
++ A_UINT8 ie_erp;
++ A_UINT8 *ie_wsc;
++};
++
++typedef struct bss {
++ A_UINT8 ni_macaddr[6];
++ A_UINT8 ni_snr;
++ A_INT16 ni_rssi;
++ struct bss *ni_list_next;
++ struct bss *ni_list_prev;
++ struct bss *ni_hash_next;
++ struct bss *ni_hash_prev;
++ struct ieee80211_common_ie ni_cie;
++ A_UINT8 *ni_buf;
++ struct ieee80211_node_table *ni_table;
++ A_UINT32 ni_refcnt;
++ int ni_scangen;
++ A_UINT32 ni_tstamp;
++} bss_t;
++
++typedef void wlan_node_iter_func(void *arg, bss_t *);
++
++bss_t *wlan_node_alloc(struct ieee80211_node_table *nt, int wh_size);
++void wlan_node_free(bss_t *ni);
++void wlan_setup_node(struct ieee80211_node_table *nt, bss_t *ni,
++ const A_UINT8 *macaddr);
++bss_t *wlan_find_node(struct ieee80211_node_table *nt, const A_UINT8 *macaddr);
++void wlan_node_reclaim(struct ieee80211_node_table *nt, bss_t *ni);
++void wlan_free_allnodes(struct ieee80211_node_table *nt);
++void wlan_iterate_nodes(struct ieee80211_node_table *nt, wlan_node_iter_func *f,
++ void *arg);
++
++void wlan_node_table_init(void *wmip, struct ieee80211_node_table *nt);
++void wlan_node_table_reset(struct ieee80211_node_table *nt);
++void wlan_node_table_cleanup(struct ieee80211_node_table *nt);
++
++A_STATUS wlan_parse_beacon(A_UINT8 *buf, int framelen,
++ struct ieee80211_common_ie *cie);
++
++A_UINT16 wlan_ieee2freq(int chan);
++A_UINT32 wlan_freq2ieee(A_UINT16 freq);
++
++
++bss_t *
++wlan_find_Ssidnode (struct ieee80211_node_table *nt, A_UCHAR *pSsid,
++ A_UINT32 ssidLength, A_BOOL bIsWPA2);
++
++void
++wlan_node_return (struct ieee80211_node_table *nt, bss_t *ni);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _HOST_WLAN_API_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/wlan_dset.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/wlan_dset.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/wlan_dset.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/wlan_dset.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,20 @@
++/*
++ * Copyright (c) 2007 Atheros Communications, Inc.
++ * All rights reserved.
++ *
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ */
++
++#ifndef __WLAN_DSET_H__
++#define __WKAN_DSET_H__
++
++typedef PREPACK struct wow_config_dset {
++
++ A_UINT8 valid_dset;
++ A_UINT8 gpio_enable;
++ A_UINT16 gpio_pin;
++} POSTPACK WOW_CONFIG_DSET;
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/wmi_api.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/wmi_api.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/wmi_api.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/wmi_api.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,260 @@
++#ifndef _WMI_API_H_
++#define _WMI_API_H_
++/*
++ * Copyright (c) 2004-2006 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * This file contains the definitions for the Wireless Module Interface (WMI).
++ *
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/include/wmi_api.h#2 $
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*
++ * IP QoS Field definitions according to 802.1p
++ */
++#define BEST_EFFORT_PRI 0
++#define BACKGROUND_PRI 1
++#define EXCELLENT_EFFORT_PRI 3
++#define CONTROLLED_LOAD_PRI 4
++#define VIDEO_PRI 5
++#define VOICE_PRI 6
++#define NETWORK_CONTROL_PRI 7
++#define MAX_NUM_PRI 8
++
++#define UNDEFINED_PRI (0xff)
++
++/* simple mapping of IP TOS field to a WMI priority stream
++ * this mapping was taken from the original linux driver implementation
++ * The operation maps the following
++ *
++ * */
++#define IP_TOS_TO_WMI_PRI(tos) \
++ ((WMI_PRI_STREAM_ID)(((tos) >> 1) & 0x03))
++
++#define WMI_IMPLICIT_PSTREAM_INACTIVITY_INT 5000 /* 5 seconds */
++
++
++struct wmi_t;
++
++void *wmi_init(void *devt);
++
++void wmi_qos_state_init(struct wmi_t *wmip);
++void wmi_shutdown(struct wmi_t *wmip);
++A_UINT16 wmi_get_mapped_qos_queue(struct wmi_t *, A_UINT8);
++A_STATUS wmi_dix_2_dot3(struct wmi_t *wmip, void *osbuf);
++A_STATUS wmi_data_hdr_add(struct wmi_t *wmip, void *osbuf, A_UINT8 msgType);
++A_STATUS wmi_dot3_2_dix(struct wmi_t *wmip, void *osbuf);
++A_STATUS wmi_data_hdr_remove(struct wmi_t *wmip, void *osbuf);
++A_STATUS wmi_syncpoint(struct wmi_t *wmip);
++A_STATUS wmi_syncpoint_reset(struct wmi_t *wmip);
++WMI_PRI_STREAM_ID wmi_get_stream_id(struct wmi_t *wmip, A_UINT8 trafficClass);
++A_UINT8 wmi_implicit_create_pstream(struct wmi_t *wmip, void *osbuf, A_UINT8 dir, A_UINT8 up);
++
++A_STATUS wmi_control_rx(struct wmi_t *wmip, void *osbuf);
++void wmi_iterate_nodes(struct wmi_t *wmip, wlan_node_iter_func *f, void *arg);
++void wmi_free_allnodes(struct wmi_t *wmip);
++bss_t *wmi_find_node(struct wmi_t *wmip, const A_UINT8 *macaddr);
++
++
++typedef enum {
++ NO_SYNC_WMIFLAG = 0,
++ SYNC_BEFORE_WMIFLAG, /* transmit all queued data before cmd */
++ SYNC_AFTER_WMIFLAG, /* any new data waits until cmd execs */
++ SYNC_BOTH_WMIFLAG,
++ END_WMIFLAG /* end marker */
++} WMI_SYNC_FLAG;
++
++A_STATUS wmi_cmd_send(struct wmi_t *wmip, void *osbuf, WMI_COMMAND_ID cmdId,
++ WMI_SYNC_FLAG flag);
++A_STATUS wmi_connect_cmd(struct wmi_t *wmip,
++ NETWORK_TYPE netType,
++ DOT11_AUTH_MODE dot11AuthMode,
++ AUTH_MODE authMode,
++ CRYPTO_TYPE pairwiseCrypto,
++ A_UINT8 pairwiseCryptoLen,
++ CRYPTO_TYPE groupCrypto,
++ A_UINT8 groupCryptoLen,
++ int ssidLength,
++ A_UCHAR *ssid,
++ A_UINT8 *bssid,
++ A_UINT16 channel,
++ A_UINT32 ctrl_flags);
++A_STATUS wmi_reconnect_cmd(struct wmi_t *wmip,
++ A_UINT8 *bssid,
++ A_UINT16 channel);
++A_STATUS wmi_disconnect_cmd(struct wmi_t *wmip);
++A_STATUS wmi_getrev_cmd(struct wmi_t *wmip);
++A_STATUS wmi_startscan_cmd(struct wmi_t *wmip, WMI_SCAN_TYPE scanType,
++ A_BOOL forceFgScan, A_BOOL isLegacy,
++ A_UINT32 homeDwellTime, A_UINT32 forceScanInterval);
++A_STATUS wmi_scanparams_cmd(struct wmi_t *wmip, A_UINT16 fg_start_sec,
++ A_UINT16 fg_end_sec, A_UINT16 bg_sec,
++ A_UINT16 minact_chdw_msec,
++ A_UINT16 maxact_chdw_msec, A_UINT16 pas_chdw_msec,
++ A_UINT8 shScanRatio, A_UINT8 scanCtrlFlags,
++ A_UINT32 max_dfsch_act_time);
++A_STATUS wmi_bssfilter_cmd(struct wmi_t *wmip, A_UINT8 filter, A_UINT32 ieMask);
++A_STATUS wmi_probedSsid_cmd(struct wmi_t *wmip, A_UINT8 index, A_UINT8 flag,
++ A_UINT8 ssidLength, A_UCHAR *ssid);
++A_STATUS wmi_listeninterval_cmd(struct wmi_t *wmip, A_UINT16 listenInterval, A_UINT16 listenBeacons);
++A_STATUS wmi_bmisstime_cmd(struct wmi_t *wmip, A_UINT16 bmisstime, A_UINT16 bmissbeacons);
++A_STATUS wmi_associnfo_cmd(struct wmi_t *wmip, A_UINT8 ieType,
++ A_UINT8 ieLen, A_UINT8 *ieInfo);
++A_STATUS wmi_powermode_cmd(struct wmi_t *wmip, A_UINT8 powerMode);
++A_STATUS wmi_ibsspmcaps_cmd(struct wmi_t *wmip, A_UINT8 pmEnable, A_UINT8 ttl,
++ A_UINT16 atim_windows, A_UINT16 timeout_value);
++A_STATUS wmi_pmparams_cmd(struct wmi_t *wmip, A_UINT16 idlePeriod,
++ A_UINT16 psPollNum, A_UINT16 dtimPolicy);
++A_STATUS wmi_disctimeout_cmd(struct wmi_t *wmip, A_UINT8 timeout);
++A_STATUS wmi_sync_cmd(struct wmi_t *wmip, A_UINT8 syncNumber);
++A_STATUS wmi_create_pstream_cmd(struct wmi_t *wmip, WMI_CREATE_PSTREAM_CMD *pstream);
++A_STATUS wmi_delete_pstream_cmd(struct wmi_t *wmip, A_UINT8 trafficClass, A_UINT8 streamID);
++A_STATUS wmi_set_bitrate_cmd(struct wmi_t *wmip, A_INT32 rate);
++A_STATUS wmi_get_bitrate_cmd(struct wmi_t *wmip);
++A_INT8 wmi_validate_bitrate(struct wmi_t *wmip, A_INT32 rate);
++A_STATUS wmi_get_regDomain_cmd(struct wmi_t *wmip);
++A_STATUS wmi_get_channelList_cmd(struct wmi_t *wmip);
++A_STATUS wmi_set_channelParams_cmd(struct wmi_t *wmip, A_UINT8 scanParam,
++ WMI_PHY_MODE mode, A_INT8 numChan,
++ A_UINT16 *channelList);
++
++A_STATUS wmi_set_snr_threshold_params(struct wmi_t *wmip,
++ WMI_SNR_THRESHOLD_PARAMS_CMD *snrCmd);
++A_STATUS wmi_set_rssi_threshold_params(struct wmi_t *wmip,
++ WMI_RSSI_THRESHOLD_PARAMS_CMD *rssiCmd);
++A_STATUS wmi_clr_rssi_snr(struct wmi_t *wmip);
++A_STATUS wmi_set_lq_threshold_params(struct wmi_t *wmip,
++ WMI_LQ_THRESHOLD_PARAMS_CMD *lqCmd);
++A_STATUS wmi_set_rts_cmd(struct wmi_t *wmip, A_UINT16 threshold);
++A_STATUS wmi_set_lpreamble_cmd(struct wmi_t *wmip, A_UINT8 status);
++
++A_STATUS wmi_set_error_report_bitmask(struct wmi_t *wmip, A_UINT32 bitmask);
++
++A_STATUS wmi_get_challenge_resp_cmd(struct wmi_t *wmip, A_UINT32 cookie,
++ A_UINT32 source);
++A_STATUS wmi_config_debug_module_cmd(struct wmi_t *wmip, A_UINT16 mmask,
++ A_UINT16 tsr, A_BOOL rep, A_UINT16 size,
++ A_UINT32 valid);
++A_STATUS wmi_get_stats_cmd(struct wmi_t *wmip);
++A_STATUS wmi_addKey_cmd(struct wmi_t *wmip, A_UINT8 keyIndex,
++ CRYPTO_TYPE keyType, A_UINT8 keyUsage,
++ A_UINT8 keyLength,A_UINT8 *keyRSC,
++ A_UINT8 *keyMaterial, A_UINT8 key_op_ctrl,
++ WMI_SYNC_FLAG sync_flag);
++A_STATUS wmi_add_krk_cmd(struct wmi_t *wmip, A_UINT8 *krk);
++A_STATUS wmi_delete_krk_cmd(struct wmi_t *wmip);
++A_STATUS wmi_deleteKey_cmd(struct wmi_t *wmip, A_UINT8 keyIndex);
++A_STATUS wmi_set_akmp_params_cmd(struct wmi_t *wmip,
++ WMI_SET_AKMP_PARAMS_CMD *akmpParams);
++A_STATUS wmi_get_pmkid_list_cmd(struct wmi_t *wmip);
++A_STATUS wmi_set_pmkid_list_cmd(struct wmi_t *wmip,
++ WMI_SET_PMKID_LIST_CMD *pmkInfo);
++A_STATUS wmi_set_txPwr_cmd(struct wmi_t *wmip, A_UINT8 dbM);
++A_STATUS wmi_get_txPwr_cmd(struct wmi_t *wmip);
++A_STATUS wmi_switch_radio(struct wmi_t *wmip, A_UINT8 on);
++A_STATUS wmi_addBadAp_cmd(struct wmi_t *wmip, A_UINT8 apIndex, A_UINT8 *bssid);
++A_STATUS wmi_deleteBadAp_cmd(struct wmi_t *wmip, A_UINT8 apIndex);
++A_STATUS wmi_set_tkip_countermeasures_cmd(struct wmi_t *wmip, A_BOOL en);
++A_STATUS wmi_setPmkid_cmd(struct wmi_t *wmip, A_UINT8 *bssid, A_UINT8 *pmkId,
++ A_BOOL set);
++A_STATUS wmi_set_access_params_cmd(struct wmi_t *wmip, A_UINT16 txop,
++ A_UINT8 eCWmin, A_UINT8 eCWmax,
++ A_UINT8 aifsn);
++A_STATUS wmi_set_retry_limits_cmd(struct wmi_t *wmip, A_UINT8 frameType,
++ A_UINT8 trafficClass, A_UINT8 maxRetries,
++ A_UINT8 enableNotify);
++
++void wmi_get_current_bssid(struct wmi_t *wmip, A_UINT8 *bssid);
++
++A_STATUS wmi_get_roam_tbl_cmd(struct wmi_t *wmip);
++A_STATUS wmi_get_roam_data_cmd(struct wmi_t *wmip, A_UINT8 roamDataType);
++A_STATUS wmi_set_roam_ctrl_cmd(struct wmi_t *wmip, WMI_SET_ROAM_CTRL_CMD *p,
++ A_UINT8 size);
++A_STATUS wmi_set_powersave_timers_cmd(struct wmi_t *wmip,
++ WMI_POWERSAVE_TIMERS_POLICY_CMD *pCmd,
++ A_UINT8 size);
++
++A_STATUS wmi_set_opt_mode_cmd(struct wmi_t *wmip, A_UINT8 optMode);
++A_STATUS wmi_opt_tx_frame_cmd(struct wmi_t *wmip,
++ A_UINT8 frmType,
++ A_UINT8 *dstMacAddr,
++ A_UINT8 *bssid,
++ A_UINT16 optIEDataLen,
++ A_UINT8 *optIEData);
++
++A_STATUS wmi_set_adhoc_bconIntvl_cmd(struct wmi_t *wmip, A_UINT16 intvl);
++A_STATUS wmi_set_voice_pkt_size_cmd(struct wmi_t *wmip, A_UINT16 voicePktSize);
++A_STATUS wmi_set_max_sp_len_cmd(struct wmi_t *wmip, A_UINT8 maxSpLen);
++A_UINT8 convert_userPriority_to_trafficClass(A_UINT8 userPriority);
++A_UINT8 wmi_get_power_mode_cmd(struct wmi_t *wmip);
++A_STATUS wmi_verify_tspec_params(WMI_CREATE_PSTREAM_CMD *pCmd, A_BOOL tspecCompliance);
++
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++A_STATUS wmi_test_cmd(struct wmi_t *wmip, A_UINT8 *buf, A_UINT32 len);
++#endif
++
++A_STATUS wmi_set_bt_status_cmd(struct wmi_t *wmip, A_UINT8 streamType, A_UINT8 status);
++A_STATUS wmi_set_bt_params_cmd(struct wmi_t *wmip, WMI_SET_BT_PARAMS_CMD* cmd);
++
++
++/*
++ * This function is used to configure the fix rates mask to the target.
++ */
++A_STATUS wmi_set_fixrates_cmd(struct wmi_t *wmip, A_INT16 fixRatesMask);
++A_STATUS wmi_get_ratemask_cmd(struct wmi_t *wmip);
++
++A_STATUS wmi_set_authmode_cmd(struct wmi_t *wmip, A_UINT8 mode);
++
++A_STATUS wmi_set_reassocmode_cmd(struct wmi_t *wmip, A_UINT8 mode);
++
++A_STATUS wmi_set_wmm_cmd(struct wmi_t *wmip, WMI_WMM_STATUS status);
++A_STATUS wmi_set_wmm_txop(struct wmi_t *wmip, WMI_TXOP_CFG txEnable);
++
++A_STATUS wmi_get_keepalive_configured(struct wmi_t *wmip);
++A_UINT8 wmi_get_keepalive_cmd(struct wmi_t *wmip);
++A_STATUS wmi_set_keepalive_cmd(struct wmi_t *wmip, A_UINT8 keepaliveInterval);
++
++A_STATUS wmi_set_appie_cmd(struct wmi_t *wmip, A_UINT8 mgmtFrmType,
++ A_UINT8 ieLen,A_UINT8 *ieInfo);
++
++A_STATUS wmi_set_halparam_cmd(struct wmi_t *wmip, A_UINT8 *cmd, A_UINT16 dataLen);
++A_INT32 wmi_get_rate(A_INT8 rateindex);
++
++/*Wake on Wireless WMI commands*/
++A_STATUS wmi_set_host_sleep_mode_cmd(struct wmi_t *wmip, WMI_SET_HOST_SLEEP_MODE_CMD *cmd);
++A_STATUS wmi_set_wow_mode_cmd(struct wmi_t *wmip, WMI_SET_WOW_MODE_CMD *cmd);
++A_STATUS wmi_get_wow_list_cmd(struct wmi_t *wmip, WMI_GET_WOW_LIST_CMD *cmd);
++A_STATUS wmi_add_wow_pattern_cmd(struct wmi_t *wmip,
++ WMI_ADD_WOW_PATTERN_CMD *cmd, A_UINT8* pattern, A_UINT8* mask, A_UINT8 pattern_size);
++A_STATUS wmi_del_wow_pattern_cmd(struct wmi_t *wmip,
++ WMI_DEL_WOW_PATTERN_CMD *cmd);
++A_STATUS wmi_set_wsc_status_cmd(struct wmi_t *wmip, A_UINT32 status);
++
++bss_t *
++wmi_find_Ssidnode (struct wmi_t *wmip, A_UCHAR *pSsid,
++ A_UINT32 ssidLength, A_BOOL bIsWPA2);
++
++void
++wmi_node_return (struct wmi_t *wmip, bss_t *bss);
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _WMI_API_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/wmi.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/wmi.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/wmi.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/wmi.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,1743 @@
++/*
++ * Copyright (c) 2004-2006 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ * This file contains the definitions of the WMI protocol specified in the
++ * Wireless Module Interface (WMI). It includes definitions of all the
++ * commands and events. Commands are messages from the host to the WM.
++ * Events and Replies are messages from the WM to the host.
++ *
++ * Ownership of correctness in regards to WMI commands
++ * belongs to the host driver and the WM is not required to validate
++ * parameters for value, proper range, or any other checking.
++ *
++ */
++
++#ifndef _WMI_H_
++#define _WMI_H_
++
++#ifndef ATH_TARGET
++#include "athstartpack.h"
++#endif
++
++#include "wmix.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#define WMI_PROTOCOL_VERSION 0x0002
++#define WMI_PROTOCOL_REVISION 0x0000
++
++#define ATH_MAC_LEN 6 /* length of mac in bytes */
++#define WMI_CMD_MAX_LEN 100
++#define WMI_CONTROL_MSG_MAX_LEN 256
++#define WMI_OPT_CONTROL_MSG_MAX_LEN 1536
++#define IS_ETHERTYPE(_typeOrLen) ((_typeOrLen) >= 0x0600)
++#define RFC1042OUI {0x00, 0x00, 0x00}
++
++#define IP_ETHERTYPE 0x0800
++
++#define WMI_IMPLICIT_PSTREAM 0xFF
++#define WMI_MAX_THINSTREAM 15
++
++struct host_app_area_s {
++ A_UINT32 wmi_protocol_ver;
++};
++
++/*
++ * Data Path
++ */
++typedef PREPACK struct {
++ A_UINT8 dstMac[ATH_MAC_LEN];
++ A_UINT8 srcMac[ATH_MAC_LEN];
++ A_UINT16 typeOrLen;
++} POSTPACK ATH_MAC_HDR;
++
++typedef PREPACK struct {
++ A_UINT8 dsap;
++ A_UINT8 ssap;
++ A_UINT8 cntl;
++ A_UINT8 orgCode[3];
++ A_UINT16 etherType;
++} POSTPACK ATH_LLC_SNAP_HDR;
++
++typedef enum {
++ DATA_MSGTYPE = 0x0,
++ CNTL_MSGTYPE,
++ SYNC_MSGTYPE
++} WMI_MSG_TYPE;
++
++
++typedef PREPACK struct {
++ A_INT8 rssi;
++ A_UINT8 info; /* WMI_MSG_TYPE in lower 2 bits - b1b0 */
++ /* UP in next 3 bits - b4b3b2 */
++#define WMI_DATA_HDR_MSG_TYPE_MASK 0x03
++#define WMI_DATA_HDR_MSG_TYPE_SHIFT 0
++#define WMI_DATA_HDR_UP_MASK 0x07
++#define WMI_DATA_HDR_UP_SHIFT 2
++#define WMI_DATA_HDR_IS_MSG_TYPE(h, t) (((h)->info & (WMI_DATA_HDR_MSG_TYPE_MASK)) == (t))
++} POSTPACK WMI_DATA_HDR;
++
++
++#define WMI_DATA_HDR_SET_MSG_TYPE(h, t) (h)->info = (((h)->info & ~(WMI_DATA_HDR_MSG_TYPE_MASK << WMI_DATA_HDR_MSG_TYPE_SHIFT)) | (t << WMI_DATA_HDR_MSG_TYPE_SHIFT))
++#define WMI_DATA_HDR_SET_UP(h, p) (h)->info = (((h)->info & ~(WMI_DATA_HDR_UP_MASK << WMI_DATA_HDR_UP_SHIFT)) | (p << WMI_DATA_HDR_UP_SHIFT))
++
++/*
++ * Control Path
++ */
++typedef PREPACK struct {
++ A_UINT16 commandId;
++} POSTPACK WMI_CMD_HDR; /* used for commands and events */
++
++/*
++ * List of Commnands
++ */
++typedef enum {
++ WMI_CONNECT_CMDID = 0x0001,
++ WMI_RECONNECT_CMDID,
++ WMI_DISCONNECT_CMDID,
++ WMI_SYNCHRONIZE_CMDID,
++ WMI_CREATE_PSTREAM_CMDID,
++ WMI_DELETE_PSTREAM_CMDID,
++ WMI_START_SCAN_CMDID,
++ WMI_SET_SCAN_PARAMS_CMDID,
++ WMI_SET_BSS_FILTER_CMDID,
++ WMI_SET_PROBED_SSID_CMDID,
++ WMI_SET_LISTEN_INT_CMDID,
++ WMI_SET_BMISS_TIME_CMDID,
++ WMI_SET_DISC_TIMEOUT_CMDID,
++ WMI_GET_CHANNEL_LIST_CMDID,
++ WMI_SET_BEACON_INT_CMDID,
++ WMI_GET_STATISTICS_CMDID,
++ WMI_SET_CHANNEL_PARAMS_CMDID,
++ WMI_SET_POWER_MODE_CMDID,
++ WMI_SET_IBSS_PM_CAPS_CMDID,
++ WMI_SET_POWER_PARAMS_CMDID,
++ WMI_SET_POWERSAVE_TIMERS_POLICY_CMDID,
++ WMI_ADD_CIPHER_KEY_CMDID,
++ WMI_DELETE_CIPHER_KEY_CMDID,
++ WMI_ADD_KRK_CMDID,
++ WMI_DELETE_KRK_CMDID,
++ WMI_SET_PMKID_CMDID,
++ WMI_SET_TX_PWR_CMDID,
++ WMI_GET_TX_PWR_CMDID,
++ WMI_SET_ASSOC_INFO_CMDID,
++ WMI_ADD_BAD_AP_CMDID,
++ WMI_DELETE_BAD_AP_CMDID,
++ WMI_SET_TKIP_COUNTERMEASURES_CMDID,
++ WMI_RSSI_THRESHOLD_PARAMS_CMDID,
++ WMI_TARGET_ERROR_REPORT_BITMASK_CMDID,
++ WMI_SET_ACCESS_PARAMS_CMDID,
++ WMI_SET_RETRY_LIMITS_CMDID,
++ WMI_SET_OPT_MODE_CMDID,
++ WMI_OPT_TX_FRAME_CMDID,
++ WMI_SET_VOICE_PKT_SIZE_CMDID,
++ WMI_SET_MAX_SP_LEN_CMDID,
++ WMI_SET_ROAM_CTRL_CMDID,
++ WMI_GET_ROAM_TBL_CMDID,
++ WMI_GET_ROAM_DATA_CMDID,
++ WMI_ENABLE_RM_CMDID,
++ WMI_SET_MAX_OFFHOME_DURATION_CMDID,
++ WMI_EXTENSION_CMDID, /* Non-wireless extensions */
++ WMI_SNR_THRESHOLD_PARAMS_CMDID,
++ WMI_LQ_THRESHOLD_PARAMS_CMDID,
++ WMI_SET_LPREAMBLE_CMDID,
++ WMI_SET_RTS_CMDID,
++ WMI_CLR_RSSI_SNR_CMDID,
++ WMI_SET_FIXRATES_CMDID,
++ WMI_GET_FIXRATES_CMDID,
++ WMI_SET_AUTH_MODE_CMDID,
++ WMI_SET_REASSOC_MODE_CMDID,
++ WMI_SET_WMM_CMDID,
++ WMI_SET_WMM_TXOP_CMDID,
++ WMI_TEST_CMDID,
++ WMI_SET_BT_STATUS_CMDID,
++ WMI_SET_BT_PARAMS_CMDID,
++
++ WMI_SET_KEEPALIVE_CMDID,
++ WMI_GET_KEEPALIVE_CMDID,
++ WMI_SET_APPIE_CMDID,
++ WMI_GET_APPIE_CMDID,
++ WMI_SET_WSC_STATUS_CMDID,
++
++ /* Wake on Wireless */
++ WMI_SET_HOST_SLEEP_MODE_CMDID,
++ WMI_SET_WOW_MODE_CMDID,
++ WMI_GET_WOW_LIST_CMDID,
++ WMI_ADD_WOW_PATTERN_CMDID,
++ WMI_DEL_WOW_PATTERN_CMDID,
++ WMI_SET_MAC_ADDRESS_CMDID,
++ WMI_SET_AKMP_PARAMS_CMDID,
++ WMI_SET_PMKID_LIST_CMDID,
++ WMI_GET_PMKID_LIST_CMDID,
++
++ /*
++ * Developer commands starts at 0xF000
++ */
++ WMI_SET_BITRATE_CMDID = 0xF000,
++ WMI_GET_BITRATE_CMDID,
++ WMI_SET_WHALPARAM_CMDID,
++
++} WMI_COMMAND_ID;
++
++/*
++ * Frame Types
++ */
++typedef enum {
++ WMI_FRAME_BEACON = 0,
++ WMI_FRAME_PROBE_REQ,
++ WMI_FRAME_PROBE_RESP,
++ WMI_FRAME_ASSOC_REQ,
++ WMI_FRAME_ASSOC_RESP,
++ WMI_NUM_MGMT_FRAME
++} WMI_MGMT_FRAME_TYPE;
++
++/*
++ * Connect Command
++ */
++typedef enum {
++ INFRA_NETWORK = 0x01,
++ ADHOC_NETWORK = 0x02,
++ ADHOC_CREATOR = 0x04,
++} NETWORK_TYPE;
++
++typedef enum {
++ OPEN_AUTH = 0x01,
++ SHARED_AUTH = 0x02,
++ LEAP_AUTH = 0x04, /* different from IEEE_AUTH_MODE definitions */
++} DOT11_AUTH_MODE;
++
++typedef enum {
++ NONE_AUTH = 0x01,
++ WPA_AUTH = 0x02,
++ WPA_PSK_AUTH = 0x03,
++ WPA2_AUTH = 0x04,
++ WPA2_PSK_AUTH = 0x05,
++ WPA_AUTH_CCKM = 0x06,
++ WPA2_AUTH_CCKM = 0x07,
++} AUTH_MODE;
++
++typedef enum {
++ NONE_CRYPT = 0x01,
++ WEP_CRYPT = 0x02,
++ TKIP_CRYPT = 0x03,
++ AES_CRYPT = 0x04,
++} CRYPTO_TYPE;
++
++#define WMI_MIN_CRYPTO_TYPE NONE_CRYPT
++#define WMI_MAX_CRYPTO_TYPE (AES_CRYPT + 1)
++
++#define WMI_MIN_KEY_INDEX 0
++#define WMI_MAX_KEY_INDEX 3
++
++#define WMI_MAX_KEY_LEN 32
++
++#define WMI_MAX_SSID_LEN 32
++
++typedef enum {
++ CONNECT_ASSOC_POLICY_USER = 0x0001,
++ CONNECT_SEND_REASSOC = 0x0002,
++ CONNECT_IGNORE_WPAx_GROUP_CIPHER = 0x0004,
++ CONNECT_PROFILE_MATCH_DONE = 0x0008,
++ CONNECT_IGNORE_AAC_BEACON = 0x0010,
++ CONNECT_CSA_FOLLOW_BSS = 0x0020,
++} WMI_CONNECT_CTRL_FLAGS_BITS;
++
++#define DEFAULT_CONNECT_CTRL_FLAGS (CONNECT_CSA_FOLLOW_BSS)
++
++typedef PREPACK struct {
++ A_UINT8 networkType;
++ A_UINT8 dot11AuthMode;
++ A_UINT8 authMode;
++ A_UINT8 pairwiseCryptoType;
++ A_UINT8 pairwiseCryptoLen;
++ A_UINT8 groupCryptoType;
++ A_UINT8 groupCryptoLen;
++ A_UINT8 ssidLength;
++ A_UCHAR ssid[WMI_MAX_SSID_LEN];
++ A_UINT16 channel;
++ A_UINT8 bssid[ATH_MAC_LEN];
++ A_UINT32 ctrl_flags;
++} POSTPACK WMI_CONNECT_CMD;
++
++/*
++ * WMI_RECONNECT_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT16 channel; /* hint */
++ A_UINT8 bssid[ATH_MAC_LEN]; /* mandatory if set */
++} POSTPACK WMI_RECONNECT_CMD;
++
++/*
++ * WMI_ADD_CIPHER_KEY_CMDID
++ */
++typedef enum {
++ PAIRWISE_USAGE = 0x00,
++ GROUP_USAGE = 0x01,
++ TX_USAGE = 0x02, /* default Tx Key - Static WEP only */
++} KEY_USAGE;
++
++/*
++ * Bit Flag
++ * Bit 0 - Initialise TSC - default is Initialize
++ */
++#define KEY_OP_INIT_TSC 0x01
++#define KEY_OP_INIT_RSC 0x02
++
++#define KEY_OP_INIT_VAL 0x03 /* Default Initialise the TSC & RSC */
++#define KEY_OP_VALID_MASK 0x03
++
++typedef PREPACK struct {
++ A_UINT8 keyIndex;
++ A_UINT8 keyType;
++ A_UINT8 keyUsage; /* KEY_USAGE */
++ A_UINT8 keyLength;
++ A_UINT8 keyRSC[8]; /* key replay sequence counter */
++ A_UINT8 key[WMI_MAX_KEY_LEN];
++ A_UINT8 key_op_ctrl; /* Additional Key Control information */
++} POSTPACK WMI_ADD_CIPHER_KEY_CMD;
++
++/*
++ * WMI_DELETE_CIPHER_KEY_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT8 keyIndex;
++} POSTPACK WMI_DELETE_CIPHER_KEY_CMD;
++
++#define WMI_KRK_LEN 16
++/*
++ * WMI_ADD_KRK_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT8 krk[WMI_KRK_LEN];
++} POSTPACK WMI_ADD_KRK_CMD;
++
++/*
++ * WMI_SET_TKIP_COUNTERMEASURES_CMDID
++ */
++typedef enum {
++ WMI_TKIP_CM_DISABLE = 0x0,
++ WMI_TKIP_CM_ENABLE = 0x1,
++} WMI_TKIP_CM_CONTROL;
++
++typedef PREPACK struct {
++ A_UINT8 cm_en; /* WMI_TKIP_CM_CONTROL */
++} POSTPACK WMI_SET_TKIP_COUNTERMEASURES_CMD;
++
++/*
++ * WMI_SET_PMKID_CMDID
++ */
++
++#define WMI_PMKID_LEN 16
++
++typedef enum {
++ PMKID_DISABLE = 0,
++ PMKID_ENABLE = 1,
++} PMKID_ENABLE_FLG;
++
++typedef PREPACK struct {
++ A_UINT8 bssid[ATH_MAC_LEN];
++ A_UINT8 enable; /* PMKID_ENABLE_FLG */
++ A_UINT8 pmkid[WMI_PMKID_LEN];
++} POSTPACK WMI_SET_PMKID_CMD;
++
++/*
++ * WMI_START_SCAN_CMD
++ */
++typedef enum {
++ WMI_LONG_SCAN = 0,
++ WMI_SHORT_SCAN = 1,
++} WMI_SCAN_TYPE;
++
++typedef PREPACK struct {
++ A_BOOL forceFgScan;
++ A_BOOL isLegacy; /* For Legacy Cisco AP compatibility */
++ A_UINT32 homeDwellTime; /* Maximum duration in the home channel(milliseconds) */
++ A_UINT32 forceScanInterval; /* Time interval between scans (milliseconds)*/
++ A_UINT8 scanType; /* WMI_SCAN_TYPE */
++} POSTPACK WMI_START_SCAN_CMD;
++
++/*
++ * WMI_SET_SCAN_PARAMS_CMDID
++ */
++#define WMI_SHORTSCANRATIO_DEFAULT 3
++typedef enum {
++ CONNECT_SCAN_CTRL_FLAGS = 0x01, /* set if can scan in the Connect cmd */
++ SCAN_CONNECTED_CTRL_FLAGS = 0x02, /* set if scan for the SSID it is */
++ /* already connected to */
++ ACTIVE_SCAN_CTRL_FLAGS = 0x04, /* set if enable active scan */
++ ROAM_SCAN_CTRL_FLAGS = 0x08, /* set if enable roam scan when bmiss and lowrssi */
++ REPORT_BSSINFO_CTRL_FLAGS = 0x10, /* set if follows customer BSSINFO reporting rule */
++ ENABLE_AUTO_CTRL_FLAGS = 0x20, /* if disabled, target doesn't
++ scan after a disconnect event */
++ ENABLE_SCAN_ABORT_EVENT = 0x40 /* Scan complete event with canceled status will be generated when a scan is prempted before it gets completed */
++
++} WMI_SCAN_CTRL_FLAGS_BITS;
++
++#define CAN_SCAN_IN_CONNECT(flags) (flags & CONNECT_SCAN_CTRL_FLAGS)
++#define CAN_SCAN_CONNECTED(flags) (flags & SCAN_CONNECTED_CTRL_FLAGS)
++#define ENABLE_ACTIVE_SCAN(flags) (flags & ACTIVE_SCAN_CTRL_FLAGS)
++#define ENABLE_ROAM_SCAN(flags) (flags & ROAM_SCAN_CTRL_FLAGS)
++#define CONFIG_REPORT_BSSINFO(flags) (flags & REPORT_BSSINFO_CTRL_FLAGS)
++#define IS_AUTO_SCAN_ENABLED(flags) (flags & ENABLE_AUTO_CTRL_FLAGS)
++#define SCAN_ABORT_EVENT_ENABLED(flags) (flags & ENABLE_SCAN_ABORT_EVENT)
++
++#define DEFAULT_SCAN_CTRL_FLAGS (CONNECT_SCAN_CTRL_FLAGS| SCAN_CONNECTED_CTRL_FLAGS| ACTIVE_SCAN_CTRL_FLAGS| ROAM_SCAN_CTRL_FLAGS | ENABLE_AUTO_CTRL_FLAGS)
++
++
++typedef PREPACK struct {
++ A_UINT16 fg_start_period; /* seconds */
++ A_UINT16 fg_end_period; /* seconds */
++ A_UINT16 bg_period; /* seconds */
++ A_UINT16 maxact_chdwell_time; /* msec */
++ A_UINT16 pas_chdwell_time; /* msec */
++ A_UINT8 shortScanRatio; /* how many shorts scan for one long */
++ A_UINT8 scanCtrlFlags;
++ A_UINT16 minact_chdwell_time; /* msec */
++ A_UINT32 max_dfsch_act_time; /* msecs */
++} POSTPACK WMI_SCAN_PARAMS_CMD;
++
++/*
++ * WMI_SET_BSS_FILTER_CMDID
++ */
++typedef enum {
++ NONE_BSS_FILTER = 0x0, /* no beacons forwarded */
++ ALL_BSS_FILTER, /* all beacons forwarded */
++ PROFILE_FILTER, /* only beacons matching profile */
++ ALL_BUT_PROFILE_FILTER, /* all but beacons matching profile */
++ CURRENT_BSS_FILTER, /* only beacons matching current BSS */
++ ALL_BUT_BSS_FILTER, /* all but beacons matching BSS */
++ PROBED_SSID_FILTER, /* beacons matching probed ssid */
++ LAST_BSS_FILTER, /* marker only */
++} WMI_BSS_FILTER;
++
++typedef PREPACK struct {
++ A_UINT8 bssFilter; /* see WMI_BSS_FILTER */
++ A_UINT32 ieMask;
++} POSTPACK WMI_BSS_FILTER_CMD;
++
++/*
++ * WMI_SET_PROBED_SSID_CMDID
++ */
++#define MAX_PROBED_SSID_INDEX 5
++
++typedef enum {
++ DISABLE_SSID_FLAG = 0, /* disables entry */
++ SPECIFIC_SSID_FLAG = 0x01, /* probes specified ssid */
++ ANY_SSID_FLAG = 0x02, /* probes for any ssid */
++} WMI_SSID_FLAG;
++
++typedef PREPACK struct {
++ A_UINT8 entryIndex; /* 0 to MAX_PROBED_SSID_INDEX */
++ A_UINT8 flag; /* WMI_SSID_FLG */
++ A_UINT8 ssidLength;
++ A_UINT8 ssid[32];
++} POSTPACK WMI_PROBED_SSID_CMD;
++
++/*
++ * WMI_SET_LISTEN_INT_CMDID
++ * The Listen interval is between 15 and 3000 TUs
++ */
++#define MIN_LISTEN_INTERVAL 15
++#define MAX_LISTEN_INTERVAL 5000
++#define MIN_LISTEN_BEACONS 1
++#define MAX_LISTEN_BEACONS 50
++
++typedef PREPACK struct {
++ A_UINT16 listenInterval;
++ A_UINT16 numBeacons;
++} POSTPACK WMI_LISTEN_INT_CMD;
++
++/*
++ * WMI_SET_BEACON_INT_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT16 beaconInterval;
++} POSTPACK WMI_BEACON_INT_CMD;
++
++/*
++ * WMI_SET_BMISS_TIME_CMDID
++ * valid values are between 1000 and 5000 TUs
++ */
++
++#define MIN_BMISS_TIME 1000
++#define MAX_BMISS_TIME 5000
++#define MIN_BMISS_BEACONS 1
++#define MAX_BMISS_BEACONS 50
++
++typedef PREPACK struct {
++ A_UINT16 bmissTime;
++ A_UINT16 numBeacons;
++} POSTPACK WMI_BMISS_TIME_CMD;
++
++/*
++ * WMI_SET_POWER_MODE_CMDID
++ */
++typedef enum {
++ REC_POWER = 0x01,
++ MAX_PERF_POWER,
++} WMI_POWER_MODE;
++
++typedef PREPACK struct {
++ A_UINT8 powerMode; /* WMI_POWER_MODE */
++} POSTPACK WMI_POWER_MODE_CMD;
++
++/*
++ * WMI_SET_POWER_PARAMS_CMDID
++ */
++typedef enum {
++ IGNORE_DTIM = 0x01,
++ NORMAL_DTIM = 0x02,
++ STICK_DTIM = 0x03,
++} WMI_DTIM_POLICY;
++
++typedef PREPACK struct {
++ A_UINT16 idle_period; /* msec */
++ A_UINT16 pspoll_number;
++ A_UINT16 dtim_policy;
++} POSTPACK WMI_POWER_PARAMS_CMD;
++
++typedef PREPACK struct {
++ A_UINT8 power_saving;
++ A_UINT8 ttl; /* number of beacon periods */
++ A_UINT16 atim_windows; /* msec */
++ A_UINT16 timeout_value; /* msec */
++} POSTPACK WMI_IBSS_PM_CAPS_CMD;
++
++/*
++ * WMI_SET_POWERSAVE_TIMERS_POLICY_CMDID
++ */
++typedef enum {
++ IGNORE_TIM_ALL_QUEUES_APSD = 0,
++ PROCESS_TIM_ALL_QUEUES_APSD = 1,
++ IGNORE_TIM_SIMULATED_APSD = 2,
++ PROCESS_TIM_SIMULATED_APSD = 3,
++} APSD_TIM_POLICY;
++
++typedef PREPACK struct {
++ A_UINT16 psPollTimeout; /* msec */
++ A_UINT16 triggerTimeout; /* msec */
++ A_UINT32 apsdTimPolicy; /* TIM behavior with ques APSD enabled. Default is IGNORE_TIM_ALL_QUEUES_APSD */
++ A_UINT32 simulatedAPSDTimPolicy; /* TIM behavior with simulated APSD enabled. Default is PROCESS_TIM_SIMULATED_APSD */
++} POSTPACK WMI_POWERSAVE_TIMERS_POLICY_CMD;
++
++/*
++ * WMI_SET_VOICE_PKT_SIZE_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT16 voicePktSize;
++} POSTPACK WMI_SET_VOICE_PKT_SIZE_CMD;
++
++/*
++ * WMI_SET_MAX_SP_LEN_CMDID
++ */
++typedef enum {
++ DELIVER_ALL_PKT = 0x0,
++ DELIVER_2_PKT = 0x1,
++ DELIVER_4_PKT = 0x2,
++ DELIVER_6_PKT = 0x3,
++} APSD_SP_LEN_TYPE;
++
++typedef PREPACK struct {
++ A_UINT8 maxSPLen;
++} POSTPACK WMI_SET_MAX_SP_LEN_CMD;
++
++/*
++ * WMI_SET_DISC_TIMEOUT_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT8 disconnectTimeout; /* seconds */
++} POSTPACK WMI_DISC_TIMEOUT_CMD;
++
++typedef enum {
++ UPLINK_TRAFFIC = 0,
++ DNLINK_TRAFFIC = 1,
++ BIDIR_TRAFFIC = 2,
++} DIR_TYPE;
++
++typedef enum {
++ DISABLE_FOR_THIS_AC = 0,
++ ENABLE_FOR_THIS_AC = 1,
++ ENABLE_FOR_ALL_AC = 2,
++} VOICEPS_CAP_TYPE;
++
++typedef enum {
++ TRAFFIC_TYPE_APERIODIC = 0,
++ TRAFFIC_TYPE_PERIODIC = 1,
++}TRAFFIC_TYPE;
++
++/*
++ * WMI_CREATE_PSTREAM_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT32 minServiceInt; /* in milli-sec */
++ A_UINT32 maxServiceInt; /* in milli-sec */
++ A_UINT32 inactivityInt; /* in milli-sec */
++ A_UINT32 suspensionInt; /* in milli-sec */
++ A_UINT32 serviceStartTime;
++ A_UINT32 minDataRate; /* in bps */
++ A_UINT32 meanDataRate; /* in bps */
++ A_UINT32 peakDataRate; /* in bps */
++ A_UINT32 maxBurstSize;
++ A_UINT32 delayBound;
++ A_UINT32 minPhyRate; /* in bps */
++ A_UINT32 sba;
++ A_UINT32 mediumTime;
++ A_UINT16 nominalMSDU; /* in octects */
++ A_UINT16 maxMSDU; /* in octects */
++ A_UINT8 trafficClass;
++ A_UINT8 trafficType; /* TRAFFIC_TYPE */
++ A_UINT8 trafficDirection; /* TRAFFIC_DIR */
++ A_UINT8 voicePSCapability; /* VOICEPS_CAP_TYPE */
++ A_UINT8 tsid;
++ A_UINT8 userPriority; /* 802.1D user priority */
++} POSTPACK WMI_CREATE_PSTREAM_CMD;
++
++/*
++ * WMI_DELETE_PSTREAM_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT8 trafficClass;
++ A_UINT8 tsid;
++} POSTPACK WMI_DELETE_PSTREAM_CMD;
++
++/*
++ * WMI_SET_CHANNEL_PARAMS_CMDID
++ */
++typedef enum {
++ WMI_11A_MODE = 0x1,
++ WMI_11G_MODE = 0x2,
++ WMI_11AG_MODE = 0x3,
++ WMI_11B_MODE = 0x4,
++ WMI_11GONLY_MODE = 0x5,
++} WMI_PHY_MODE;
++
++#define WMI_MAX_CHANNELS 32
++
++typedef PREPACK struct {
++ A_UINT8 reserved1;
++ A_UINT8 scanParam; /* set if enable scan */
++ A_UINT8 phyMode; /* see WMI_PHY_MODE */
++ A_UINT8 numChannels; /* how many channels follow */
++ A_UINT16 channelList[1]; /* channels in Mhz */
++} POSTPACK WMI_CHANNEL_PARAMS_CMD;
++
++
++/*
++ * WMI_RSSI_THRESHOLD_PARAMS_CMDID
++ * Setting the polltime to 0 would disable polling.
++ * Threshold values are in the ascending order, and should agree to:
++ * (lowThreshold_lowerVal < lowThreshold_upperVal < highThreshold_lowerVal
++ * < highThreshold_upperVal)
++ */
++
++typedef PREPACK struct WMI_RSSI_THRESHOLD_PARAMS{
++ A_UINT32 pollTime; /* Polling time as a factor of LI */
++ A_INT16 thresholdAbove1_Val; /* lowest of upper */
++ A_INT16 thresholdAbove2_Val;
++ A_INT16 thresholdAbove3_Val;
++ A_INT16 thresholdAbove4_Val;
++ A_INT16 thresholdAbove5_Val;
++ A_INT16 thresholdAbove6_Val; /* highest of upper */
++ A_INT16 thresholdBelow1_Val; /* lowest of bellow */
++ A_INT16 thresholdBelow2_Val;
++ A_INT16 thresholdBelow3_Val;
++ A_INT16 thresholdBelow4_Val;
++ A_INT16 thresholdBelow5_Val;
++ A_INT16 thresholdBelow6_Val; /* highest of bellow */
++ A_UINT8 weight; /* "alpha" */
++ A_UINT8 reserved[3];
++} POSTPACK WMI_RSSI_THRESHOLD_PARAMS_CMD;
++
++/*
++ * WMI_SNR_THRESHOLD_PARAMS_CMDID
++ * Setting the polltime to 0 would disable polling.
++ */
++
++typedef PREPACK struct WMI_SNR_THRESHOLD_PARAMS{
++ A_UINT32 pollTime; /* Polling time as a factor of LI */
++ A_UINT8 weight; /* "alpha" */
++ A_UINT8 thresholdAbove1_Val; /* lowest of uppper*/
++ A_UINT8 thresholdAbove2_Val;
++ A_UINT8 thresholdAbove3_Val;
++ A_UINT8 thresholdAbove4_Val; /* highest of upper */
++ A_UINT8 thresholdBelow1_Val; /* lowest of bellow */
++ A_UINT8 thresholdBelow2_Val;
++ A_UINT8 thresholdBelow3_Val;
++ A_UINT8 thresholdBelow4_Val; /* highest of bellow */
++ A_UINT8 reserved[3];
++} POSTPACK WMI_SNR_THRESHOLD_PARAMS_CMD;
++
++/*
++ * WMI_LQ_THRESHOLD_PARAMS_CMDID
++ */
++typedef PREPACK struct WMI_LQ_THRESHOLD_PARAMS {
++ A_UINT8 enable;
++ A_UINT8 thresholdAbove1_Val;
++ A_UINT8 thresholdAbove2_Val;
++ A_UINT8 thresholdAbove3_Val;
++ A_UINT8 thresholdAbove4_Val;
++ A_UINT8 thresholdBelow1_Val;
++ A_UINT8 thresholdBelow2_Val;
++ A_UINT8 thresholdBelow3_Val;
++ A_UINT8 thresholdBelow4_Val;
++ A_UINT8 reserved[3];
++} POSTPACK WMI_LQ_THRESHOLD_PARAMS_CMD;
++
++typedef enum {
++ WMI_LPREAMBLE_DISABLED = 0,
++ WMI_LPREAMBLE_ENABLED
++} WMI_LPREAMBLE_STATUS;
++
++typedef PREPACK struct {
++ A_UINT8 status;
++}POSTPACK WMI_SET_LPREAMBLE_CMD;
++
++typedef PREPACK struct {
++ A_UINT16 threshold;
++}POSTPACK WMI_SET_RTS_CMD;
++
++/*
++ * WMI_TARGET_ERROR_REPORT_BITMASK_CMDID
++ * Sets the error reporting event bitmask in target. Target clears it
++ * upon an error. Subsequent errors are counted, but not reported
++ * via event, unless the bitmask is set again.
++ */
++typedef PREPACK struct {
++ A_UINT32 bitmask;
++} POSTPACK WMI_TARGET_ERROR_REPORT_BITMASK;
++
++/*
++ * WMI_SET_TX_PWR_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT8 dbM; /* in dbM units */
++} POSTPACK WMI_SET_TX_PWR_CMD, WMI_TX_PWR_REPLY;
++
++/*
++ * WMI_SET_ASSOC_INFO_CMDID
++ *
++ * A maximum of 2 private IEs can be sent in the [Re]Assoc request.
++ * A 3rd one, the CCX version IE can also be set from the host.
++ */
++#define WMI_MAX_ASSOC_INFO_TYPE 2
++#define WMI_CCX_VER_IE 2 /* ieType to set CCX Version IE */
++
++#define WMI_MAX_ASSOC_INFO_LEN 240
++
++typedef PREPACK struct {
++ A_UINT8 ieType;
++ A_UINT8 bufferSize;
++ A_UINT8 assocInfo[1]; /* up to WMI_MAX_ASSOC_INFO_LEN */
++} POSTPACK WMI_SET_ASSOC_INFO_CMD;
++
++
++/*
++ * WMI_GET_TX_PWR_CMDID does not take any parameters
++ */
++
++/*
++ * WMI_ADD_BAD_AP_CMDID
++ */
++#define WMI_MAX_BAD_AP_INDEX 1
++
++typedef PREPACK struct {
++ A_UINT8 badApIndex; /* 0 to WMI_MAX_BAD_AP_INDEX */
++ A_UINT8 bssid[ATH_MAC_LEN];
++} POSTPACK WMI_ADD_BAD_AP_CMD;
++
++/*
++ * WMI_DELETE_BAD_AP_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT8 badApIndex; /* 0 to WMI_MAX_BAD_AP_INDEX */
++} POSTPACK WMI_DELETE_BAD_AP_CMD;
++
++/*
++ * WMI_SET_ACCESS_PARAMS_CMDID
++ */
++#define WMI_DEFAULT_TXOP_ACPARAM 0 /* implies one MSDU */
++#define WMI_DEFAULT_ECWMIN_ACPARAM 4 /* corresponds to CWmin of 15 */
++#define WMI_DEFAULT_ECWMAX_ACPARAM 10 /* corresponds to CWmax of 1023 */
++#define WMI_MAX_CW_ACPARAM 15 /* maximum eCWmin or eCWmax */
++#define WMI_DEFAULT_AIFSN_ACPARAM 2
++#define WMI_MAX_AIFSN_ACPARAM 15
++typedef PREPACK struct {
++ A_UINT16 txop; /* in units of 32 usec */
++ A_UINT8 eCWmin;
++ A_UINT8 eCWmax;
++ A_UINT8 aifsn;
++} POSTPACK WMI_SET_ACCESS_PARAMS_CMD;
++
++
++/*
++ * WMI_SET_RETRY_LIMITS_CMDID
++ *
++ * This command is used to customize the number of retries the
++ * wlan device will perform on a given frame.
++ */
++#define WMI_MIN_RETRIES 2
++#define WMI_MAX_RETRIES 13
++typedef enum {
++ MGMT_FRAMETYPE = 0,
++ CONTROL_FRAMETYPE = 1,
++ DATA_FRAMETYPE = 2
++} WMI_FRAMETYPE;
++
++typedef PREPACK struct {
++ A_UINT8 frameType; /* WMI_FRAMETYPE */
++ A_UINT8 trafficClass; /* applies only to DATA_FRAMETYPE */
++ A_UINT8 maxRetries;
++ A_UINT8 enableNotify;
++} POSTPACK WMI_SET_RETRY_LIMITS_CMD;
++
++/*
++ * WMI_SET_ROAM_CTRL_CMDID
++ *
++ * This command is used to influence the Roaming behaviour
++ * Set the host biases of the BSSs before setting the roam mode as bias
++ * based.
++ */
++
++/*
++ * Different types of Roam Control
++ */
++
++typedef enum {
++ WMI_FORCE_ROAM = 1, /* Roam to the specified BSSID */
++ WMI_SET_ROAM_MODE = 2, /* default ,progd bias, no roam */
++ WMI_SET_HOST_BIAS = 3, /* Set the Host Bias */
++ WMI_SET_LOWRSSI_SCAN_PARAMS = 4, /* Set lowrssi Scan parameters */
++} WMI_ROAM_CTRL_TYPE;
++
++#define WMI_MIN_ROAM_CTRL_TYPE WMI_FORCE_ROAM
++#define WMI_MAX_ROAM_CTRL_TYPE WMI_SET_LOWRSSI_SCAN_PARAMS
++
++/*
++ * ROAM MODES
++ */
++
++typedef enum {
++ WMI_DEFAULT_ROAM_MODE = 1, /* RSSI based ROAM */
++ WMI_HOST_BIAS_ROAM_MODE = 2, /* HOST BIAS based ROAM */
++ WMI_LOCK_BSS_MODE = 3 /* Lock to the Current BSS - no Roam */
++} WMI_ROAM_MODE;
++
++/*
++ * BSS HOST BIAS INFO
++ */
++
++typedef PREPACK struct {
++ A_UINT8 bssid[ATH_MAC_LEN];
++ A_INT8 bias;
++} POSTPACK WMI_BSS_BIAS;
++
++typedef PREPACK struct {
++ A_UINT8 numBss;
++ WMI_BSS_BIAS bssBias[1];
++} POSTPACK WMI_BSS_BIAS_INFO;
++
++typedef PREPACK struct WMI_LOWRSSI_SCAN_PARAMS {
++ A_UINT16 lowrssi_scan_period;
++ A_INT16 lowrssi_scan_threshold;
++ A_INT16 lowrssi_roam_threshold;
++ A_UINT8 roam_rssi_floor;
++ A_UINT8 reserved[1]; /* For alignment */
++} POSTPACK WMI_LOWRSSI_SCAN_PARAMS;
++
++typedef PREPACK struct {
++ PREPACK union {
++ A_UINT8 bssid[ATH_MAC_LEN]; /* WMI_FORCE_ROAM */
++ A_UINT8 roamMode; /* WMI_SET_ROAM_MODE */
++ WMI_BSS_BIAS_INFO bssBiasInfo; /* WMI_SET_HOST_BIAS */
++ WMI_LOWRSSI_SCAN_PARAMS lrScanParams;
++ } POSTPACK info;
++ A_UINT8 roamCtrlType ;
++} POSTPACK WMI_SET_ROAM_CTRL_CMD;
++
++/*
++ * WMI_ENABLE_RM_CMDID
++ */
++typedef PREPACK struct {
++ A_BOOL enable_radio_measurements;
++} POSTPACK WMI_ENABLE_RM_CMD;
++
++/*
++ * WMI_SET_MAX_OFFHOME_DURATION_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT8 max_offhome_duration;
++} POSTPACK WMI_SET_MAX_OFFHOME_DURATION_CMD;
++
++typedef PREPACK struct {
++ A_UINT32 frequency;
++ A_UINT8 threshold;
++} POSTPACK WMI_SET_HB_CHALLENGE_RESP_PARAMS_CMD;
++
++typedef enum {
++ BT_STREAM_UNDEF = 0,
++ BT_STREAM_SCO, /* SCO stream */
++ BT_STREAM_A2DP, /* A2DP stream */
++ BT_STREAM_MAX
++} BT_STREAM_TYPE;
++
++typedef enum {
++ BT_PARAM_SCO = 1, /* SCO stream parameters */
++ BT_PARAM_A2DP, /* A2DP stream parameters */
++ BT_PARAM_MISC, /* miscellaneous parameters */
++ BT_PARAM_REGS, /* co-existence register parameters */
++ BT_PARAM_MAX
++} BT_PARAM_TYPE;
++
++typedef enum {
++ BT_STATUS_UNDEF = 0,
++ BT_STATUS_START,
++ BT_STATUS_STOP,
++ BT_STATUS_RESUME,
++ BT_STATUS_SUSPEND,
++ BT_STATUS_MAX
++} BT_STREAM_STATUS;
++
++typedef PREPACK struct {
++ A_UINT8 streamType;
++ A_UINT8 status;
++} POSTPACK WMI_SET_BT_STATUS_CMD;
++
++typedef PREPACK struct {
++ A_UINT8 noSCOPkts;
++ A_UINT8 pspollTimeout;
++ A_UINT8 stompbt;
++} POSTPACK BT_PARAMS_SCO;
++
++typedef PREPACK struct {
++ A_UINT32 period;
++ A_UINT32 dutycycle;
++ A_UINT8 stompbt;
++} POSTPACK BT_PARAMS_A2DP;
++
++typedef PREPACK struct {
++ A_UINT32 mode;
++ A_UINT32 scoWghts;
++ A_UINT32 a2dpWghts;
++ A_UINT32 genWghts;
++ A_UINT32 mode2;
++ A_UINT8 setVal;
++} POSTPACK BT_COEX_REGS;
++
++typedef enum {
++ WLAN_PROTECT_POLICY = 1,
++ WLAN_COEX_CTRL_FLAGS
++} BT_PARAMS_MISC_TYPE;
++
++typedef enum {
++ WLAN_PROTECT_PER_STREAM = 0x01, /* default */
++ WLAN_PROTECT_ANY_TX = 0x02
++} WLAN_PROTECT_FLAGS;
++
++
++#define WLAN_DISABLE_COEX_IN_DISCONNECT 0x01 /* default */
++#define WLAN_KEEP_COEX_IN_DISCONNECT 0x02
++#define WLAN_STOMPBT_IN_DISCONNECT 0x04
++
++#define WLAN_DISABLE_COEX_IN_ROAM 0x10 /* default */
++#define WLAN_KEEP_COEX_IN_ROAM 0x20
++#define WLAN_STOMPBT_IN_ROAM 0x40
++
++#define WLAN_DISABLE_COEX_IN_SCAN 0x100 /* default */
++#define WLAN_KEEP_COEX_IN_SCAN 0x200
++#define WLAN_STOMPBT_IN_SCAN 0x400
++
++#define WLAN_DISABLE_COEX_BT_OFF 0x1000 /* default */
++#define WLAN_KEEP_COEX_BT_OFF 0x2000
++#define WLAN_STOMPBT_BT_OFF 0x4000
++
++typedef PREPACK struct {
++ A_UINT32 period;
++ A_UINT32 dutycycle;
++ A_UINT8 stompbt;
++ A_UINT8 policy;
++} POSTPACK WLAN_PROTECT_POLICY_TYPE;
++
++typedef PREPACK struct {
++ PREPACK union {
++ WLAN_PROTECT_POLICY_TYPE protectParams;
++ A_UINT16 wlanCtrlFlags;
++ } POSTPACK info;
++ A_UINT8 paramType;
++} POSTPACK BT_PARAMS_MISC;
++
++typedef PREPACK struct {
++ PREPACK union {
++ BT_PARAMS_SCO scoParams;
++ BT_PARAMS_A2DP a2dpParams;
++ BT_PARAMS_MISC miscParams;
++ BT_COEX_REGS regs;
++ } POSTPACK info;
++ A_UINT8 paramType;
++} POSTPACK WMI_SET_BT_PARAMS_CMD;
++
++/*
++ * Command Replies
++ */
++
++/*
++ * WMI_GET_CHANNEL_LIST_CMDID reply
++ */
++typedef PREPACK struct {
++ A_UINT8 reserved1;
++ A_UINT8 numChannels; /* number of channels in reply */
++ A_UINT16 channelList[1]; /* channel in Mhz */
++} POSTPACK WMI_CHANNEL_LIST_REPLY;
++
++typedef enum {
++ A_SUCCEEDED = A_OK,
++ A_FAILED_DELETE_STREAM_DOESNOT_EXIST=250,
++ A_SUCCEEDED_MODIFY_STREAM=251,
++ A_FAILED_INVALID_STREAM = 252,
++ A_FAILED_MAX_THINSTREAMS = 253,
++ A_FAILED_CREATE_REMOVE_PSTREAM_FIRST = 254,
++} PSTREAM_REPLY_STATUS;
++
++/*
++ * List of Events (target to host)
++ */
++typedef enum {
++ WMI_READY_EVENTID = 0x1001,
++ WMI_CONNECT_EVENTID,
++ WMI_DISCONNECT_EVENTID,
++ WMI_BSSINFO_EVENTID,
++ WMI_CMDERROR_EVENTID,
++ WMI_REGDOMAIN_EVENTID,
++ WMI_PSTREAM_TIMEOUT_EVENTID,
++ WMI_NEIGHBOR_REPORT_EVENTID,
++ WMI_TKIP_MICERR_EVENTID,
++ WMI_SCAN_COMPLETE_EVENTID,
++ WMI_REPORT_STATISTICS_EVENTID,
++ WMI_RSSI_THRESHOLD_EVENTID,
++ WMI_ERROR_REPORT_EVENTID,
++ WMI_OPT_RX_FRAME_EVENTID,
++ WMI_REPORT_ROAM_TBL_EVENTID,
++ WMI_EXTENSION_EVENTID,
++ WMI_CAC_EVENTID,
++ WMI_SNR_THRESHOLD_EVENTID,
++ WMI_LQ_THRESHOLD_EVENTID,
++ WMI_TX_RETRY_ERR_EVENTID,
++ WMI_REPORT_ROAM_DATA_EVENTID,
++ WMI_TEST_EVENTID,
++ WMI_APLIST_EVENTID,
++ WMI_GET_WOW_LIST_EVENTID,
++ WMI_GET_PMKID_LIST_EVENTID
++} WMI_EVENT_ID;
++
++typedef enum {
++ WMI_11A_CAPABILITY = 1,
++ WMI_11G_CAPABILITY = 2,
++ WMI_11AG_CAPABILITY = 3,
++} WMI_PHY_CAPABILITY;
++
++typedef PREPACK struct {
++ A_UINT8 macaddr[ATH_MAC_LEN];
++ A_UINT8 phyCapability; /* WMI_PHY_CAPABILITY */
++} POSTPACK WMI_READY_EVENT;
++
++/*
++ * Connect Event
++ */
++typedef PREPACK struct {
++ A_UINT16 channel;
++ A_UINT8 bssid[ATH_MAC_LEN];
++ A_UINT16 listenInterval;
++ A_UINT16 beaconInterval;
++ A_UINT32 networkType;
++ A_UINT8 beaconIeLen;
++ A_UINT8 assocReqLen;
++ A_UINT8 assocRespLen;
++ A_UINT8 assocInfo[1];
++} POSTPACK WMI_CONNECT_EVENT;
++
++/*
++ * Disconnect Event
++ */
++typedef enum {
++ NO_NETWORK_AVAIL = 0x01,
++ LOST_LINK = 0x02, /* bmiss */
++ DISCONNECT_CMD = 0x03,
++ BSS_DISCONNECTED = 0x04,
++ AUTH_FAILED = 0x05,
++ ASSOC_FAILED = 0x06,
++ NO_RESOURCES_AVAIL = 0x07,
++ CSERV_DISCONNECT = 0x08,
++ INVALID_PROFILE = 0x0a,
++ DOT11H_CHANNEL_SWITCH = 0x0b,
++} WMI_DISCONNECT_REASON;
++
++typedef PREPACK struct {
++ A_UINT16 protocolReasonStatus; /* reason code, see 802.11 spec. */
++ A_UINT8 bssid[ATH_MAC_LEN]; /* set if known */
++ A_UINT8 disconnectReason ; /* see WMI_DISCONNECT_REASON */
++ A_UINT8 assocRespLen;
++ A_UINT8 assocInfo[1];
++} POSTPACK WMI_DISCONNECT_EVENT;
++
++/*
++ * BSS Info Event.
++ * Mechanism used to inform host of the presence and characteristic of
++ * wireless networks present. Consists of bss info header followed by
++ * the beacon or probe-response frame body. The 802.11 header is not included.
++ */
++typedef enum {
++ BEACON_FTYPE = 0x1,
++ PROBERESP_FTYPE,
++ ACTION_MGMT_FTYPE,
++} WMI_BI_FTYPE;
++
++enum {
++ BSS_ELEMID_CHANSWITCH = 0x01,
++ BSS_ELEMID_ATHEROS = 0x02,
++};
++
++typedef PREPACK struct {
++ A_UINT16 channel;
++ A_UINT8 frameType; /* see WMI_BI_FTYPE */
++ A_UINT8 snr;
++ A_INT16 rssi;
++ A_UINT8 bssid[ATH_MAC_LEN];
++ A_UINT32 ieMask;
++} POSTPACK WMI_BSS_INFO_HDR;
++
++/*
++ * Command Error Event
++ */
++typedef enum {
++ INVALID_PARAM = 0x01,
++ ILLEGAL_STATE = 0x02,
++ INTERNAL_ERROR = 0x03,
++} WMI_ERROR_CODE;
++
++typedef PREPACK struct {
++ A_UINT16 commandId;
++ A_UINT8 errorCode;
++} POSTPACK WMI_CMD_ERROR_EVENT;
++
++/*
++ * New Regulatory Domain Event
++ */
++typedef PREPACK struct {
++ A_UINT32 regDomain;
++} POSTPACK WMI_REG_DOMAIN_EVENT;
++
++typedef PREPACK struct {
++ A_UINT8 trafficClass;
++} POSTPACK WMI_PSTREAM_TIMEOUT_EVENT;
++
++/*
++ * The WMI_NEIGHBOR_REPORT Event is generated by the target to inform
++ * the host of BSS's it has found that matches the current profile.
++ * It can be used by the host to cache PMKs and/to initiate pre-authentication
++ * if the BSS supports it. The first bssid is always the current associated
++ * BSS.
++ * The bssid and bssFlags information repeats according to the number
++ * or APs reported.
++ */
++typedef enum {
++ WMI_DEFAULT_BSS_FLAGS = 0x00,
++ WMI_PREAUTH_CAPABLE_BSS = 0x01,
++ WMI_PMKID_VALID_BSS = 0x02,
++} WMI_BSS_FLAGS;
++
++typedef PREPACK struct {
++ A_UINT8 bssid[ATH_MAC_LEN];
++ A_UINT8 bssFlags; /* see WMI_BSS_FLAGS */
++} POSTPACK WMI_NEIGHBOR_INFO;
++
++typedef PREPACK struct {
++ A_INT8 numberOfAps;
++ WMI_NEIGHBOR_INFO neighbor[1];
++} POSTPACK WMI_NEIGHBOR_REPORT_EVENT;
++
++/*
++ * TKIP MIC Error Event
++ */
++typedef PREPACK struct {
++ A_UINT8 keyid;
++ A_UINT8 ismcast;
++} POSTPACK WMI_TKIP_MICERR_EVENT;
++
++/*
++ * WMI_SCAN_COMPLETE_EVENTID - no parameters (old), staus parameter (new)
++ */
++typedef PREPACK struct {
++ A_STATUS status;
++} POSTPACK WMI_SCAN_COMPLETE_EVENT;
++
++#define MAX_OPT_DATA_LEN 1400
++
++/*
++ * WMI_SET_ADHOC_BSSID_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT8 bssid[ATH_MAC_LEN];
++} POSTPACK WMI_SET_ADHOC_BSSID_CMD;
++
++/*
++ * WMI_SET_OPT_MODE_CMDID
++ */
++typedef enum {
++ SPECIAL_OFF,
++ SPECIAL_ON,
++} OPT_MODE_TYPE;
++
++typedef PREPACK struct {
++ A_UINT8 optMode;
++} POSTPACK WMI_SET_OPT_MODE_CMD;
++
++/*
++ * WMI_TX_OPT_FRAME_CMDID
++ */
++typedef enum {
++ OPT_PROBE_REQ = 0x01,
++ OPT_PROBE_RESP = 0x02,
++ OPT_CPPP_START = 0x03,
++ OPT_CPPP_STOP = 0x04,
++} WMI_OPT_FTYPE;
++
++typedef PREPACK struct {
++ A_UINT16 optIEDataLen;
++ A_UINT8 frmType;
++ A_UINT8 dstAddr[ATH_MAC_LEN];
++ A_UINT8 bssid[ATH_MAC_LEN];
++ A_UINT8 reserved; /* For alignment */
++ A_UINT8 optIEData[1];
++} POSTPACK WMI_OPT_TX_FRAME_CMD;
++
++/*
++ * Special frame receive Event.
++ * Mechanism used to inform host of the receiption of the special frames.
++ * Consists of special frame info header followed by special frame body.
++ * The 802.11 header is not included.
++ */
++typedef PREPACK struct {
++ A_UINT16 channel;
++ A_UINT8 frameType; /* see WMI_OPT_FTYPE */
++ A_INT8 snr;
++ A_UINT8 srcAddr[ATH_MAC_LEN];
++ A_UINT8 bssid[ATH_MAC_LEN];
++} POSTPACK WMI_OPT_RX_INFO_HDR;
++
++/*
++ * Reporting statistics.
++ */
++typedef PREPACK struct {
++ A_UINT32 tx_packets;
++ A_UINT32 tx_bytes;
++ A_UINT32 tx_unicast_pkts;
++ A_UINT32 tx_unicast_bytes;
++ A_UINT32 tx_multicast_pkts;
++ A_UINT32 tx_multicast_bytes;
++ A_UINT32 tx_broadcast_pkts;
++ A_UINT32 tx_broadcast_bytes;
++ A_UINT32 tx_rts_success_cnt;
++ A_UINT32 tx_packet_per_ac[4];
++ A_UINT32 tx_errors_per_ac[4];
++
++ A_UINT32 tx_errors;
++ A_UINT32 tx_failed_cnt;
++ A_UINT32 tx_retry_cnt;
++ A_UINT32 tx_rts_fail_cnt;
++ A_INT32 tx_unicast_rate;
++}POSTPACK tx_stats_t;
++
++typedef PREPACK struct {
++ A_UINT32 rx_packets;
++ A_UINT32 rx_bytes;
++ A_UINT32 rx_unicast_pkts;
++ A_UINT32 rx_unicast_bytes;
++ A_UINT32 rx_multicast_pkts;
++ A_UINT32 rx_multicast_bytes;
++ A_UINT32 rx_broadcast_pkts;
++ A_UINT32 rx_broadcast_bytes;
++ A_UINT32 rx_fragment_pkt;
++
++ A_UINT32 rx_errors;
++ A_UINT32 rx_crcerr;
++ A_UINT32 rx_key_cache_miss;
++ A_UINT32 rx_decrypt_err;
++ A_UINT32 rx_duplicate_frames;
++ A_INT32 rx_unicast_rate;
++}POSTPACK rx_stats_t;
++
++typedef PREPACK struct {
++ A_UINT32 tkip_local_mic_failure;
++ A_UINT32 tkip_counter_measures_invoked;
++ A_UINT32 tkip_replays;
++ A_UINT32 tkip_format_errors;
++ A_UINT32 ccmp_format_errors;
++ A_UINT32 ccmp_replays;
++}POSTPACK tkip_ccmp_stats_t;
++
++typedef PREPACK struct {
++ A_UINT32 power_save_failure_cnt;
++}POSTPACK pm_stats_t;
++
++typedef PREPACK struct {
++ A_UINT32 cs_bmiss_cnt;
++ A_UINT32 cs_lowRssi_cnt;
++ A_UINT16 cs_connect_cnt;
++ A_UINT16 cs_disconnect_cnt;
++ A_INT16 cs_aveBeacon_rssi;
++ A_UINT16 cs_roam_count;
++ A_UINT16 cs_rssi;
++ A_UINT8 cs_snr;
++ A_UINT8 cs_aveBeacon_snr;
++ A_UINT8 cs_lastRoam_msec;
++} POSTPACK cserv_stats_t;
++
++typedef PREPACK struct {
++ tx_stats_t tx_stats;
++ rx_stats_t rx_stats;
++ tkip_ccmp_stats_t tkipCcmpStats;
++}POSTPACK wlan_net_stats_t;
++
++typedef PREPACK struct {
++ A_UINT32 wow_num_pkts_dropped;
++ A_UINT16 wow_num_events_discarded;
++ A_UINT8 wow_num_host_pkt_wakeups;
++ A_UINT8 wow_num_host_event_wakeups;
++} POSTPACK wlan_wow_stats_t;
++
++typedef PREPACK struct {
++ A_UINT32 lqVal;
++ A_INT32 noise_floor_calibation;
++ pm_stats_t pmStats;
++ wlan_net_stats_t txrxStats;
++ wlan_wow_stats_t wowStats;
++ cserv_stats_t cservStats;
++} POSTPACK WMI_TARGET_STATS;
++
++/*
++ * WMI_RSSI_THRESHOLD_EVENTID.
++ * Indicate the RSSI events to host. Events are indicated when we breach a
++ * thresold value.
++ */
++typedef enum{
++ WMI_RSSI_THRESHOLD1_ABOVE = 0,
++ WMI_RSSI_THRESHOLD2_ABOVE,
++ WMI_RSSI_THRESHOLD3_ABOVE,
++ WMI_RSSI_THRESHOLD4_ABOVE,
++ WMI_RSSI_THRESHOLD5_ABOVE,
++ WMI_RSSI_THRESHOLD6_ABOVE,
++ WMI_RSSI_THRESHOLD1_BELOW,
++ WMI_RSSI_THRESHOLD2_BELOW,
++ WMI_RSSI_THRESHOLD3_BELOW,
++ WMI_RSSI_THRESHOLD4_BELOW,
++ WMI_RSSI_THRESHOLD5_BELOW,
++ WMI_RSSI_THRESHOLD6_BELOW
++}WMI_RSSI_THRESHOLD_VAL;
++
++typedef PREPACK struct {
++ A_INT16 rssi;
++ A_UINT8 range;
++}POSTPACK WMI_RSSI_THRESHOLD_EVENT;
++
++/*
++ * WMI_ERROR_REPORT_EVENTID
++ */
++typedef enum{
++ WMI_TARGET_PM_ERR_FAIL = 0x00000001,
++ WMI_TARGET_KEY_NOT_FOUND = 0x00000002,
++ WMI_TARGET_DECRYPTION_ERR = 0x00000004,
++ WMI_TARGET_BMISS = 0x00000008,
++ WMI_PSDISABLE_NODE_JOIN = 0x00000010,
++ WMI_TARGET_COM_ERR = 0x00000020,
++ WMI_TARGET_FATAL_ERR = 0x00000040
++} WMI_TARGET_ERROR_VAL;
++
++typedef PREPACK struct {
++ A_UINT32 errorVal;
++}POSTPACK WMI_TARGET_ERROR_REPORT_EVENT;
++
++typedef PREPACK struct {
++ A_UINT8 retrys;
++}POSTPACK WMI_TX_RETRY_ERR_EVENT;
++
++typedef enum{
++ WMI_SNR_THRESHOLD1_ABOVE = 1,
++ WMI_SNR_THRESHOLD1_BELOW,
++ WMI_SNR_THRESHOLD2_ABOVE,
++ WMI_SNR_THRESHOLD2_BELOW,
++ WMI_SNR_THRESHOLD3_ABOVE,
++ WMI_SNR_THRESHOLD3_BELOW,
++ WMI_SNR_THRESHOLD4_ABOVE,
++ WMI_SNR_THRESHOLD4_BELOW
++} WMI_SNR_THRESHOLD_VAL;
++
++typedef PREPACK struct {
++ A_UINT8 range; /* WMI_SNR_THRESHOLD_VAL */
++ A_UINT8 snr;
++}POSTPACK WMI_SNR_THRESHOLD_EVENT;
++
++typedef enum{
++ WMI_LQ_THRESHOLD1_ABOVE = 1,
++ WMI_LQ_THRESHOLD1_BELOW,
++ WMI_LQ_THRESHOLD2_ABOVE,
++ WMI_LQ_THRESHOLD2_BELOW,
++ WMI_LQ_THRESHOLD3_ABOVE,
++ WMI_LQ_THRESHOLD3_BELOW,
++ WMI_LQ_THRESHOLD4_ABOVE,
++ WMI_LQ_THRESHOLD4_BELOW
++} WMI_LQ_THRESHOLD_VAL;
++
++typedef PREPACK struct {
++ A_INT32 lq;
++ A_UINT8 range; /* WMI_LQ_THRESHOLD_VAL */
++}POSTPACK WMI_LQ_THRESHOLD_EVENT;
++/*
++ * WMI_REPORT_ROAM_TBL_EVENTID
++ */
++#define MAX_ROAM_TBL_CAND 5
++
++typedef PREPACK struct {
++ A_INT32 roam_util;
++ A_UINT8 bssid[ATH_MAC_LEN];
++ A_INT8 rssi;
++ A_INT8 rssidt;
++ A_INT8 last_rssi;
++ A_INT8 util;
++ A_INT8 bias;
++ A_UINT8 reserved; /* For alignment */
++} POSTPACK WMI_BSS_ROAM_INFO;
++
++
++typedef PREPACK struct {
++ A_UINT16 roamMode;
++ A_UINT16 numEntries;
++ WMI_BSS_ROAM_INFO bssRoamInfo[1];
++} POSTPACK WMI_TARGET_ROAM_TBL;
++
++/*
++ * WMI_CAC_EVENTID
++ */
++typedef enum {
++ CAC_INDICATION_ADMISSION = 0x00,
++ CAC_INDICATION_ADMISSION_RESP = 0x01,
++ CAC_INDICATION_DELETE = 0x02,
++ CAC_INDICATION_NO_RESP = 0x03,
++}CAC_INDICATION;
++
++#define WMM_TSPEC_IE_LEN 63
++
++typedef PREPACK struct {
++ A_UINT8 ac;
++ A_UINT8 cac_indication;
++ A_UINT8 statusCode;
++ A_UINT8 tspecSuggestion[WMM_TSPEC_IE_LEN];
++}POSTPACK WMI_CAC_EVENT;
++
++/*
++ * WMI_APLIST_EVENTID
++ */
++
++typedef enum {
++ APLIST_VER1 = 1,
++} APLIST_VER;
++
++typedef PREPACK struct {
++ A_UINT8 bssid[ATH_MAC_LEN];
++ A_UINT16 channel;
++} POSTPACK WMI_AP_INFO_V1;
++
++typedef PREPACK union {
++ WMI_AP_INFO_V1 apInfoV1;
++} POSTPACK WMI_AP_INFO;
++
++typedef PREPACK struct {
++ A_UINT8 apListVer;
++ A_UINT8 numAP;
++ WMI_AP_INFO apList[1];
++} POSTPACK WMI_APLIST_EVENT;
++
++/*
++ * developer commands
++ */
++
++/*
++ * WMI_SET_BITRATE_CMDID
++ *
++ * Get bit rate cmd uses same definition as set bit rate cmd
++ */
++typedef enum {
++ RATE_AUTO = -1,
++ RATE_1Mb = 0,
++ RATE_2Mb = 1,
++ RATE_5_5Mb = 2,
++ RATE_11Mb = 3,
++ RATE_6Mb = 4,
++ RATE_9Mb = 5,
++ RATE_12Mb = 6,
++ RATE_18Mb = 7,
++ RATE_24Mb = 8,
++ RATE_36Mb = 9,
++ RATE_48Mb = 10,
++ RATE_54Mb = 11,
++} WMI_BIT_RATE;
++
++typedef PREPACK struct {
++ A_INT8 rateIndex; /* see WMI_BIT_RATE */
++} POSTPACK WMI_BIT_RATE_CMD, WMI_BIT_RATE_REPLY;
++
++/*
++ * WMI_SET_FIXRATES_CMDID
++ *
++ * Get fix rates cmd uses same definition as set fix rates cmd
++ */
++typedef enum {
++ FIX_RATE_1Mb = 0x1,
++ FIX_RATE_2Mb = 0x2,
++ FIX_RATE_5_5Mb = 0x4,
++ FIX_RATE_11Mb = 0x8,
++ FIX_RATE_6Mb = 0x10,
++ FIX_RATE_9Mb = 0x20,
++ FIX_RATE_12Mb = 0x40,
++ FIX_RATE_18Mb = 0x80,
++ FIX_RATE_24Mb = 0x100,
++ FIX_RATE_36Mb = 0x200,
++ FIX_RATE_48Mb = 0x400,
++ FIX_RATE_54Mb = 0x800,
++} WMI_FIX_RATES_MASK;
++
++typedef PREPACK struct {
++ A_UINT16 fixRateMask; /* see WMI_BIT_RATE */
++} POSTPACK WMI_FIX_RATES_CMD, WMI_FIX_RATES_REPLY;
++
++/*
++ * WMI_SET_RECONNECT_AUTH_MODE_CMDID
++ *
++ * Set authentication mode
++ */
++typedef enum {
++ RECONN_DO_AUTH = 0x00,
++ RECONN_NOT_AUTH = 0x01
++} WMI_AUTH_MODE;
++
++typedef PREPACK struct {
++ A_UINT8 mode;
++} POSTPACK WMI_SET_AUTH_MODE_CMD;
++
++/*
++ * WMI_SET_REASSOC_MODE_CMDID
++ *
++ * Set authentication mode
++ */
++typedef enum {
++ REASSOC_DO_DISASSOC = 0x00,
++ REASSOC_DONOT_DISASSOC = 0x01
++} WMI_REASSOC_MODE;
++
++typedef PREPACK struct {
++ A_UINT8 mode;
++}POSTPACK WMI_SET_REASSOC_MODE_CMD;
++
++typedef enum {
++ ROAM_DATA_TIME = 1, /* Get The Roam Time Data */
++} ROAM_DATA_TYPE;
++
++typedef PREPACK struct {
++ A_UINT32 disassoc_time;
++ A_UINT32 no_txrx_time;
++ A_UINT32 assoc_time;
++ A_UINT32 allow_txrx_time;
++ A_UINT32 last_data_txrx_time;
++ A_UINT32 first_data_txrx_time;
++ A_UINT8 disassoc_bssid[ATH_MAC_LEN];
++ A_INT8 disassoc_bss_rssi;
++ A_UINT8 assoc_bssid[ATH_MAC_LEN];
++ A_INT8 assoc_bss_rssi;
++} POSTPACK WMI_TARGET_ROAM_TIME;
++
++typedef PREPACK struct {
++ PREPACK union {
++ WMI_TARGET_ROAM_TIME roamTime;
++ } POSTPACK u;
++ A_UINT8 roamDataType ;
++} POSTPACK WMI_TARGET_ROAM_DATA;
++
++typedef enum {
++ WMI_WMM_DISABLED = 0,
++ WMI_WMM_ENABLED
++} WMI_WMM_STATUS;
++
++typedef PREPACK struct {
++ A_UINT8 status;
++}POSTPACK WMI_SET_WMM_CMD;
++
++typedef enum {
++ WMI_TXOP_DISABLED = 0,
++ WMI_TXOP_ENABLED
++} WMI_TXOP_CFG;
++
++typedef PREPACK struct {
++ A_UINT8 txopEnable;
++}POSTPACK WMI_SET_WMM_TXOP_CMD;
++
++typedef PREPACK struct {
++ A_UINT8 keepaliveInterval;
++} POSTPACK WMI_SET_KEEPALIVE_CMD;
++
++typedef PREPACK struct {
++ A_BOOL configured;
++ A_UINT8 keepaliveInterval;
++} POSTPACK WMI_GET_KEEPALIVE_CMD;
++
++/*
++ * Add Application specified IE to a management frame
++ */
++#define WMI_MAX_IE_LEN 78
++
++typedef PREPACK struct {
++ A_UINT8 mgmtFrmType; /* one of WMI_MGMT_FRAME_TYPE */
++ A_UINT8 ieLen; /* Length of the IE that should be added to the MGMT frame */
++ A_UINT8 ieInfo[1];
++} POSTPACK WMI_SET_APPIE_CMD;
++
++/*
++ * Notify the WSC registration status to the target
++ */
++#define WSC_REG_ACTIVE 1
++#define WSC_REG_INACTIVE 0
++/* Generic Hal Interface for setting hal paramters. */
++/* Add new Set HAL Param cmdIds here for newer params */
++typedef enum {
++ WHAL_SETCABTO_CMDID = 1,
++}WHAL_CMDID;
++
++typedef PREPACK struct {
++ A_UINT8 cabTimeOut;
++} POSTPACK WHAL_SETCABTO_PARAM;
++
++typedef PREPACK struct {
++ A_UINT8 whalCmdId;
++ A_UINT8 data[1];
++} POSTPACK WHAL_PARAMCMD;
++
++
++#define WOW_MAX_FILTER_LISTS 1 /*4*/
++#define WOW_MAX_FILTERS_PER_LIST 4
++#define WOW_PATTERN_SIZE 64
++#define WOW_MASK_SIZE 64
++
++typedef PREPACK struct {
++ A_UINT8 wow_valid_filter;
++ A_UINT8 wow_filter_id;
++ A_UINT8 wow_filter_size;
++ A_UINT8 wow_filter_offset;
++ A_UINT8 wow_filter_mask[WOW_MASK_SIZE];
++ A_UINT8 wow_filter_pattern[WOW_PATTERN_SIZE];
++} POSTPACK WOW_FILTER;
++
++
++typedef PREPACK struct {
++ A_UINT8 wow_valid_list;
++ A_UINT8 wow_list_id;
++ A_UINT8 wow_num_filters;
++ A_UINT8 wow_total_list_size;
++ WOW_FILTER list[WOW_MAX_FILTERS_PER_LIST];
++} POSTPACK WOW_FILTER_LIST;
++
++typedef PREPACK struct {
++ A_BOOL awake;
++ A_BOOL asleep;
++} POSTPACK WMI_SET_HOST_SLEEP_MODE_CMD;
++
++typedef PREPACK struct {
++ A_BOOL enable_wow;
++} POSTPACK WMI_SET_WOW_MODE_CMD;
++
++typedef PREPACK struct {
++ A_UINT8 filter_list_id;
++} POSTPACK WMI_GET_WOW_LIST_CMD;
++
++/*
++ * WMI_GET_WOW_LIST_CMD reply
++ */
++typedef PREPACK struct {
++ A_UINT8 num_filters; /* number of patterns in reply */
++ A_UINT8 this_filter_num; /* this is filter # x of total num_filters */
++ A_UINT8 wow_mode;
++ A_UINT8 host_mode;
++ WOW_FILTER wow_filters[1];
++} POSTPACK WMI_GET_WOW_LIST_REPLY;
++
++typedef PREPACK struct {
++ A_UINT8 filter_list_id;
++ A_UINT8 filter_size;
++ A_UINT8 filter_offset;
++ A_UINT8 filter[1];
++} POSTPACK WMI_ADD_WOW_PATTERN_CMD;
++
++typedef PREPACK struct {
++ A_UINT16 filter_list_id;
++ A_UINT16 filter_id;
++} POSTPACK WMI_DEL_WOW_PATTERN_CMD;
++
++typedef PREPACK struct {
++ A_UINT8 macaddr[ATH_MAC_LEN];
++} POSTPACK WMI_SET_MAC_ADDRESS_CMD;
++
++/*
++ * WMI_SET_AKMP_PARAMS_CMD
++ */
++
++#define WMI_AKMP_MULTI_PMKID_EN 0x000001
++
++typedef PREPACK struct {
++ A_UINT32 akmpInfo;
++} POSTPACK WMI_SET_AKMP_PARAMS_CMD;
++
++typedef PREPACK struct {
++ A_UINT8 pmkid[WMI_PMKID_LEN];
++} POSTPACK WMI_PMKID;
++
++/*
++ * WMI_SET_PMKID_LIST_CMD
++ */
++#define WMI_MAX_PMKID_CACHE 8
++
++typedef PREPACK struct {
++ A_UINT32 numPMKID;
++ WMI_PMKID pmkidList[WMI_MAX_PMKID_CACHE];
++} POSTPACK WMI_SET_PMKID_LIST_CMD;
++
++/*
++ * WMI_GET_PMKID_LIST_CMD Reply
++ * Following the Number of PMKIDs is the list of PMKIDs
++ */
++typedef PREPACK struct {
++ A_UINT32 numPMKID;
++ WMI_PMKID pmkidList[1];
++} POSTPACK WMI_PMKID_LIST_REPLY;
++
++/* index used for priority streams */
++typedef enum {
++ WMI_NOT_MAPPED = -1,
++ WMI_CONTROL_PRI = 0,
++ WMI_BEST_EFFORT_PRI = 1,
++ WMI_LOW_PRI = 2,
++ WMI_HIGH_PRI = 3,
++ WMI_HIGHEST_PRI,
++ WMI_PRI_MAX_COUNT
++} WMI_PRI_STREAM_ID;
++
++#ifndef ATH_TARGET
++#include "athendpack.h"
++#endif
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _WMI_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/include/wmix.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/wmix.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/include/wmix.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/include/wmix.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,233 @@
++/*
++ * Copyright (c) 2004-2005 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ * This file contains extensions of the WMI protocol specified in the
++ * Wireless Module Interface (WMI). It includes definitions of all
++ * extended commands and events. Extensions include useful commands
++ * that are not directly related to wireless activities. They may
++ * be hardware-specific, and they might not be supported on all
++ * implementations.
++ *
++ * Extended WMIX commands are encapsulated in a WMI message with
++ * cmd=WMI_EXTENSION_CMD.
++ *
++ */
++
++#ifndef _WMIX_H_
++#define _WMIX_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#ifndef ATH_TARGET
++#include "athstartpack.h"
++#endif
++
++#include "dbglog.h"
++
++/*
++ * Extended WMI commands are those that are needed during wireless
++ * operation, but which are not really wireless commands. This allows,
++ * for instance, platform-specific commands. Extended WMI commands are
++ * embedded in a WMI command message with WMI_COMMAND_ID=WMI_EXTENSION_CMDID.
++ * Extended WMI events are similarly embedded in a WMI event message with
++ * WMI_EVENT_ID=WMI_EXTENSION_EVENTID.
++ */
++typedef PREPACK struct {
++ A_UINT32 commandId;
++} POSTPACK WMIX_CMD_HDR;
++
++typedef enum {
++ WMIX_DSETOPEN_REPLY_CMDID = 0x2001,
++ WMIX_DSETDATA_REPLY_CMDID,
++ WMIX_GPIO_OUTPUT_SET_CMDID,
++ WMIX_GPIO_INPUT_GET_CMDID,
++ WMIX_GPIO_REGISTER_SET_CMDID,
++ WMIX_GPIO_REGISTER_GET_CMDID,
++ WMIX_GPIO_INTR_ACK_CMDID,
++ WMIX_HB_CHALLENGE_RESP_CMDID,
++ WMIX_DBGLOG_CFG_MODULE_CMDID,
++} WMIX_COMMAND_ID;
++
++typedef enum {
++ WMIX_DSETOPENREQ_EVENTID = 0x3001,
++ WMIX_DSETCLOSE_EVENTID,
++ WMIX_DSETDATAREQ_EVENTID,
++ WMIX_GPIO_INTR_EVENTID,
++ WMIX_GPIO_DATA_EVENTID,
++ WMIX_GPIO_ACK_EVENTID,
++ WMIX_HB_CHALLENGE_RESP_EVENTID,
++ WMIX_DBGLOG_EVENTID,
++} WMIX_EVENT_ID;
++
++/*
++ * =============DataSet support=================
++ */
++
++/*
++ * WMIX_DSETOPENREQ_EVENTID
++ * DataSet Open Request Event
++ */
++typedef PREPACK struct {
++ A_UINT32 dset_id;
++ A_UINT32 targ_dset_handle; /* echo'ed, not used by Host, */
++ A_UINT32 targ_reply_fn; /* echo'ed, not used by Host, */
++ A_UINT32 targ_reply_arg; /* echo'ed, not used by Host, */
++} POSTPACK WMIX_DSETOPENREQ_EVENT;
++
++/*
++ * WMIX_DSETCLOSE_EVENTID
++ * DataSet Close Event
++ */
++typedef PREPACK struct {
++ A_UINT32 access_cookie;
++} POSTPACK WMIX_DSETCLOSE_EVENT;
++
++/*
++ * WMIX_DSETDATAREQ_EVENTID
++ * DataSet Data Request Event
++ */
++typedef PREPACK struct {
++ A_UINT32 access_cookie;
++ A_UINT32 offset;
++ A_UINT32 length;
++ A_UINT32 targ_buf; /* echo'ed, not used by Host, */
++ A_UINT32 targ_reply_fn; /* echo'ed, not used by Host, */
++ A_UINT32 targ_reply_arg; /* echo'ed, not used by Host, */
++} POSTPACK WMIX_DSETDATAREQ_EVENT;
++
++typedef PREPACK struct {
++ A_UINT32 status;
++ A_UINT32 targ_dset_handle;
++ A_UINT32 targ_reply_fn;
++ A_UINT32 targ_reply_arg;
++ A_UINT32 access_cookie;
++ A_UINT32 size;
++ A_UINT32 version;
++} POSTPACK WMIX_DSETOPEN_REPLY_CMD;
++
++typedef PREPACK struct {
++ A_UINT32 status;
++ A_UINT32 targ_buf;
++ A_UINT32 targ_reply_fn;
++ A_UINT32 targ_reply_arg;
++ A_UINT32 length;
++ A_UINT8 buf[1];
++} POSTPACK WMIX_DSETDATA_REPLY_CMD;
++
++
++/*
++ * =============GPIO support=================
++ * All masks are 18-bit masks with bit N operating on GPIO pin N.
++ */
++
++#include "gpio.h"
++
++/*
++ * Set GPIO pin output state.
++ * In order for output to be driven, a pin must be enabled for output.
++ * This can be done during initialization through the GPIO Configuration
++ * DataSet, or during operation with the enable_mask.
++ *
++ * If a request is made to simultaneously set/clear or set/disable or
++ * clear/disable or disable/enable, results are undefined.
++ */
++typedef PREPACK struct {
++ A_UINT32 set_mask; /* pins to set */
++ A_UINT32 clear_mask; /* pins to clear */
++ A_UINT32 enable_mask; /* pins to enable for output */
++ A_UINT32 disable_mask; /* pins to disable/tristate */
++} POSTPACK WMIX_GPIO_OUTPUT_SET_CMD;
++
++/*
++ * Set a GPIO register. For debug/exceptional cases.
++ * Values for gpioreg_id are GPIO_REGISTER_IDs, defined in a
++ * platform-dependent header.
++ */
++typedef PREPACK struct {
++ A_UINT32 gpioreg_id; /* GPIO register ID */
++ A_UINT32 value; /* value to write */
++} POSTPACK WMIX_GPIO_REGISTER_SET_CMD;
++
++/* Get a GPIO register. For debug/exceptional cases. */
++typedef PREPACK struct {
++ A_UINT32 gpioreg_id; /* GPIO register to read */
++} POSTPACK WMIX_GPIO_REGISTER_GET_CMD;
++
++/*
++ * Host acknowledges and re-arms GPIO interrupts. A single
++ * message should be used to acknowledge all interrupts that
++ * were delivered in an earlier WMIX_GPIO_INTR_EVENT message.
++ */
++typedef PREPACK struct {
++ A_UINT32 ack_mask; /* interrupts to acknowledge */
++} POSTPACK WMIX_GPIO_INTR_ACK_CMD;
++
++/*
++ * Target informs Host of GPIO interrupts that have ocurred since the
++ * last WMIX_GIPO_INTR_ACK_CMD was received. Additional information --
++ * the current GPIO input values is provided -- in order to support
++ * use of a GPIO interrupt as a Data Valid signal for other GPIO pins.
++ */
++typedef PREPACK struct {
++ A_UINT32 intr_mask; /* pending GPIO interrupts */
++ A_UINT32 input_values; /* recent GPIO input values */
++} POSTPACK WMIX_GPIO_INTR_EVENT;
++
++/*
++ * Target responds to Host's earlier WMIX_GPIO_INPUT_GET_CMDID request
++ * using a GPIO_DATA_EVENT with
++ * value set to the mask of GPIO pin inputs and
++ * reg_id set to GPIO_ID_NONE
++ *
++ *
++ * Target responds to Hosts's earlier WMIX_GPIO_REGISTER_GET_CMDID request
++ * using a GPIO_DATA_EVENT with
++ * value set to the value of the requested register and
++ * reg_id identifying the register (reflects the original request)
++ * NB: reg_id supports the future possibility of unsolicited
++ * WMIX_GPIO_DATA_EVENTs (for polling GPIO input), and it may
++ * simplify Host GPIO support.
++ */
++typedef PREPACK struct {
++ A_UINT32 value;
++ A_UINT32 reg_id;
++} POSTPACK WMIX_GPIO_DATA_EVENT;
++
++/*
++ * =============Error Detection support=================
++ */
++
++/*
++ * WMIX_HB_CHALLENGE_RESP_CMDID
++ * Heartbeat Challenge Response command
++ */
++typedef PREPACK struct {
++ A_UINT32 cookie;
++ A_UINT32 source;
++} POSTPACK WMIX_HB_CHALLENGE_RESP_CMD;
++
++/*
++ * WMIX_HB_CHALLENGE_RESP_EVENTID
++ * Heartbeat Challenge Response Event
++ */
++#define WMIX_HB_CHALLENGE_RESP_EVENT WMIX_HB_CHALLENGE_RESP_CMD
++
++typedef PREPACK struct {
++ struct dbglog_config_s config;
++} POSTPACK WMIX_DBGLOG_CFG_MODULE_CMD;
++
++#ifndef ATH_TARGET
++#include "athendpack.h"
++#endif
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _WMIX_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/Kconfig linux-2.6.29-rc3.owrt.om/drivers/ar6000/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/Kconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/Kconfig 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,31 @@
++config AR6000_WLAN
++ tristate "AR6000 wireless networking over SDIO"
++ depends on MMC
++ select WIRELESS_EXT
++ default m
++ help
++ good luck.
++
++config AR6000_WLAN_DEBUG
++ bool "Enable retrieval of firmware debugging information"
++ depends on AR6000_WLAN
++ default n
++ help
++ The AR6k firmware maintains a log of debugging events that
++ gets flushed to the host on various occasions. Retrieval of
++ this data is very slow, taking several seconds.
++
++ If in doubt, say N.
++
++config AR6000_WLAN_RESET
++ bool "Soft-reset when shutting down"
++ depends on AR6000_WLAN
++ default n
++ help
++ The AR6k module can be explicitly reset when shutting down
++ the device. This adds a delay of about two seconds to suspend,
++ module removal, and so on. Since the WLAN SDIO function is
++ generally disabled soon thereafter anyway, this reset seems
++ superfluous.
++
++ If in doubt, say N.
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/Makefile linux-2.6.29-rc3.owrt.om/drivers/ar6000/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/Makefile 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,38 @@
++REV ?= 2
++
++PWD := $(shell pwd)
++
++EXTRA_CFLAGS += -I$(src)/include
++
++EXTRA_CFLAGS += -DLINUX -D__KERNEL__ -DHTC_RAW_INTERFACE\
++ -DTCMD -DUSER_KEYS \
++ -DNO_SYNC_FLUSH #\
++ -DMULTIPLE_FRAMES_PER_INTERRUPT -DAR6000REV$(REV) \
++ -DBLOCK_TX_PATH_FLAG \
++ -DSDIO \
++
++EXTRA_CFLAGS += -DKERNEL_2_6
++
++obj-$(CONFIG_AR6000_WLAN) += ar6000.o
++
++ar6000-objs += htc/ar6k.o \
++ htc/ar6k_events.o \
++ htc/htc_send.o \
++ htc/htc_recv.o \
++ htc/htc_services.o \
++ htc/htc.o \
++ hif/hif2.o \
++ bmi/bmi.o \
++ ar6000/ar6000_drv.o \
++ ar6000/ar6000_raw_if.o \
++ ar6000/netbuf.o \
++ ar6000/wireless_ext.o \
++ ar6000/ioctl.o \
++ miscdrv/common_drv.o \
++ miscdrv/credit_dist.o \
++ wmi/wmi.o \
++ wlan/wlan_node.o \
++ wlan/wlan_recv_beacon.o \
++ wlan/wlan_utils.o
++
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/miscdrv/common_drv.c linux-2.6.29-rc3.owrt.om/drivers/ar6000/miscdrv/common_drv.c
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/miscdrv/common_drv.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/miscdrv/common_drv.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,467 @@
++
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "a_config.h"
++#include "athdefs.h"
++#include "a_types.h"
++#include "AR6Khwreg.h"
++#include "targaddrs.h"
++#include "a_osapi.h"
++#include "hif.h"
++#include "htc_api.h"
++#include "bmi.h"
++#include "bmi_msg.h"
++#include "common_drv.h"
++#include "a_debug.h"
++#include "targaddrs.h"
++
++#define HOST_INTEREST_ITEM_ADDRESS(target, item) \
++(((TargetType) == TARGET_TYPE_AR6001) ? \
++ AR6001_HOST_INTEREST_ITEM_ADDRESS(item) : \
++ AR6002_HOST_INTEREST_ITEM_ADDRESS(item))
++
++
++/* Compile the 4BYTE version of the window register setup routine,
++ * This mitigates host interconnect issues with non-4byte aligned bus requests, some
++ * interconnects use bus adapters that impose strict limitations.
++ * Since diag window access is not intended for performance critical operations, the 4byte mode should
++ * be satisfactory even though it generates 4X the bus activity. */
++
++#ifdef USE_4BYTE_REGISTER_ACCESS
++
++ /* set the window address register (using 4-byte register access ). */
++A_STATUS ar6000_SetAddressWindowRegister(HIF_DEVICE *hifDevice, A_UINT32 RegisterAddr, A_UINT32 Address)
++{
++ A_STATUS status;
++ A_UINT8 addrValue[4];
++ int i;
++
++ /* write bytes 1,2,3 of the register to set the upper address bytes, the LSB is written
++ * last to initiate the access cycle */
++
++ for (i = 1; i <= 3; i++) {
++ /* fill the buffer with the address byte value we want to hit 4 times*/
++ addrValue[0] = ((A_UINT8 *)&Address)[i];
++ addrValue[1] = addrValue[0];
++ addrValue[2] = addrValue[0];
++ addrValue[3] = addrValue[0];
++
++ /* hit each byte of the register address with a 4-byte write operation to the same address,
++ * this is a harmless operation */
++ status = HIFReadWrite(hifDevice,
++ RegisterAddr+i,
++ addrValue,
++ 4,
++ HIF_WR_SYNC_BYTE_FIX,
++ NULL);
++ if (status != A_OK) {
++ break;
++ }
++ }
++
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Cannot write initial bytes of 0x%x to window reg: 0x%X \n",
++ RegisterAddr, Address));
++ return status;
++ }
++
++ /* write the address register again, this time write the whole 4-byte value.
++ * The effect here is that the LSB write causes the cycle to start, the extra
++ * 3 byte write to bytes 1,2,3 has no effect since we are writing the same values again */
++ status = HIFReadWrite(hifDevice,
++ RegisterAddr,
++ (A_UCHAR *)(&Address),
++ 4,
++ HIF_WR_SYNC_BYTE_INC,
++ NULL);
++
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Cannot write 0x%x to window reg: 0x%X \n",
++ RegisterAddr, Address));
++ return status;
++ }
++
++ return A_OK;
++
++
++
++}
++
++
++#else
++
++ /* set the window address register */
++A_STATUS ar6000_SetAddressWindowRegister(HIF_DEVICE *hifDevice, A_UINT32 RegisterAddr, A_UINT32 Address)
++{
++ A_STATUS status;
++
++ /* write bytes 1,2,3 of the register to set the upper address bytes, the LSB is written
++ * last to initiate the access cycle */
++ status = HIFReadWrite(hifDevice,
++ RegisterAddr+1, /* write upper 3 bytes */
++ ((A_UCHAR *)(&Address))+1,
++ sizeof(A_UINT32)-1,
++ HIF_WR_SYNC_BYTE_INC,
++ NULL);
++
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Cannot write initial bytes of 0x%x to window reg: 0x%X \n",
++ RegisterAddr, Address));
++ return status;
++ }
++
++ /* write the LSB of the register, this initiates the operation */
++ status = HIFReadWrite(hifDevice,
++ RegisterAddr,
++ (A_UCHAR *)(&Address),
++ sizeof(A_UINT8),
++ HIF_WR_SYNC_BYTE_INC,
++ NULL);
++
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Cannot write 0x%x to window reg: 0x%X \n",
++ RegisterAddr, Address));
++ return status;
++ }
++
++ return A_OK;
++}
++
++#endif
++
++/*
++ * Read from the AR6000 through its diagnostic window.
++ * No cooperation from the Target is required for this.
++ */
++A_STATUS
++ar6000_ReadRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data)
++{
++ A_STATUS status;
++
++ /* set window register to start read cycle */
++ status = ar6000_SetAddressWindowRegister(hifDevice,
++ WINDOW_READ_ADDR_ADDRESS,
++ *address);
++
++ if (status != A_OK) {
++ return status;
++ }
++
++ /* read the data */
++ status = HIFReadWrite(hifDevice,
++ WINDOW_DATA_ADDRESS,
++ (A_UCHAR *)data,
++ sizeof(A_UINT32),
++ HIF_RD_SYNC_BYTE_INC,
++ NULL);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Cannot read from WINDOW_DATA_ADDRESS\n"));
++ return status;
++ }
++
++ return status;
++}
++
++
++/*
++ * Write to the AR6000 through its diagnostic window.
++ * No cooperation from the Target is required for this.
++ */
++A_STATUS
++ar6000_WriteRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data)
++{
++ A_STATUS status;
++
++ /* set write data */
++ status = HIFReadWrite(hifDevice,
++ WINDOW_DATA_ADDRESS,
++ (A_UCHAR *)data,
++ sizeof(A_UINT32),
++ HIF_WR_SYNC_BYTE_INC,
++ NULL);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Cannot write 0x%x to WINDOW_DATA_ADDRESS\n", *data));
++ return status;
++ }
++
++ /* set window register, which starts the write cycle */
++ return ar6000_SetAddressWindowRegister(hifDevice,
++ WINDOW_WRITE_ADDR_ADDRESS,
++ *address);
++}
++
++A_STATUS
++ar6000_ReadDataDiag(HIF_DEVICE *hifDevice, A_UINT32 address,
++ A_UCHAR *data, A_UINT32 length)
++{
++ A_UINT32 count;
++ A_STATUS status = A_OK;
++
++ for (count = 0; count < length; count += 4, address += 4) {
++ if ((status = ar6000_ReadRegDiag(hifDevice, &address,
++ (A_UINT32 *)&data[count])) != A_OK)
++ {
++ break;
++ }
++ }
++
++ return status;
++}
++
++A_STATUS
++ar6000_WriteDataDiag(HIF_DEVICE *hifDevice, A_UINT32 address,
++ A_UCHAR *data, A_UINT32 length)
++{
++ A_UINT32 count;
++ A_STATUS status = A_OK;
++
++ for (count = 0; count < length; count += 4, address += 4) {
++ if ((status = ar6000_WriteRegDiag(hifDevice, &address,
++ (A_UINT32 *)&data[count])) != A_OK)
++ {
++ break;
++ }
++ }
++
++ return status;
++}
++
++A_STATUS
++ar6000_reset_device_skipflash(HIF_DEVICE *hifDevice)
++{
++ int i;
++ struct forceROM_s {
++ A_UINT32 addr;
++ A_UINT32 data;
++ };
++ struct forceROM_s *ForceROM;
++ int szForceROM;
++ A_UINT32 instruction;
++
++ static struct forceROM_s ForceROM_REV2[] = {
++ /* NB: This works for old REV2 ROM (old). */
++ {0x00001ff0, 0x175b0027}, /* jump instruction at 0xa0001ff0 */
++ {0x00001ff4, 0x00000000}, /* nop instruction at 0xa0001ff4 */
++
++ {MC_REMAP_TARGET_ADDRESS, 0x00001ff0}, /* remap to 0xa0001ff0 */
++ {MC_REMAP_COMPARE_ADDRESS, 0x01000040},/* ...from 0xbfc00040 */
++ {MC_REMAP_SIZE_ADDRESS, 0x00000000}, /* ...1 cache line */
++ {MC_REMAP_VALID_ADDRESS, 0x00000001}, /* ...remap is valid */
++
++ {LOCAL_COUNT_ADDRESS+0x10, 0}, /* clear BMI credit counter */
++
++ {RESET_CONTROL_ADDRESS, RESET_CONTROL_WARM_RST_MASK},
++ };
++
++ static struct forceROM_s ForceROM_NEW[] = {
++ /* NB: This works for AR6000 ROM REV3 and beyond. */
++ {LOCAL_SCRATCH_ADDRESS, AR6K_OPTION_IGNORE_FLASH},
++ {LOCAL_COUNT_ADDRESS+0x10, 0}, /* clear BMI credit counter */
++ {RESET_CONTROL_ADDRESS, RESET_CONTROL_WARM_RST_MASK},
++ };
++
++ /*
++ * Examine a semi-arbitrary instruction that's different
++ * in REV2 and other revisions.
++ * NB: If a Host port does not require simultaneous support
++ * for multiple revisions of Target ROM, this code can be elided.
++ */
++ (void)ar6000_ReadDataDiag(hifDevice, 0x01000040,
++ (A_UCHAR *)&instruction, 4);
++
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("instruction=0x%x\n", instruction));
++
++ if (instruction == 0x3c1aa200) {
++ /* It's an old ROM */
++ ForceROM = ForceROM_REV2;
++ szForceROM = sizeof(ForceROM_REV2)/sizeof(*ForceROM);
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Using OLD method\n"));
++ } else {
++ ForceROM = ForceROM_NEW;
++ szForceROM = sizeof(ForceROM_NEW)/sizeof(*ForceROM);
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Using NEW method\n"));
++ }
++
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Force Target to execute from ROM....\n"));
++ for (i = 0; i < szForceROM; i++)
++ {
++ if (ar6000_WriteRegDiag(hifDevice,
++ &ForceROM[i].addr,
++ &ForceROM[i].data) != A_OK)
++ {
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Cannot force Target to execute ROM!\n"));
++ return A_ERROR;
++ }
++ }
++
++ msleep(50); /* delay to allow dragon to come to BMI phase */
++ return A_OK;
++}
++
++/* reset device */
++A_STATUS ar6000_reset_device(HIF_DEVICE *hifDevice, A_UINT32 TargetType)
++{
++
++#if !defined(DWSIM)
++ A_STATUS status = A_OK;
++ A_UINT32 address;
++ A_UINT32 data;
++
++ do {
++
++ // address = RESET_CONTROL_ADDRESS;
++ data = RESET_CONTROL_COLD_RST_MASK;
++
++ /* Hardcode the address of RESET_CONTROL_ADDRESS based on the target type */
++ if (TargetType == TARGET_TYPE_AR6001) {
++ address = 0x0C000000;
++ } else {
++ if (TargetType == TARGET_TYPE_AR6002) {
++ address = 0x00004000;
++ } else {
++ A_ASSERT(0);
++ }
++ }
++
++ status = ar6000_WriteRegDiag(hifDevice, &address, &data);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ /*
++ * Read back the RESET CAUSE register to ensure that the cold reset
++ * went through.
++ */
++ msleep(2000); /* 2 second delay to allow things to settle down */
++
++
++ // address = RESET_CAUSE_ADDRESS;
++ /* Hardcode the address of RESET_CAUSE_ADDRESS based on the target type */
++ if (TargetType == TARGET_TYPE_AR6001) {
++ address = 0x0C0000CC;
++ } else {
++ if (TargetType == TARGET_TYPE_AR6002) {
++ address = 0x000040C0;
++ } else {
++ A_ASSERT(0);
++ }
++ }
++
++ data = 0;
++ status = ar6000_ReadRegDiag(hifDevice, &address, &data);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Reset Cause readback: 0x%X \n",data));
++ data &= RESET_CAUSE_LAST_MASK;
++ if (data != 2) {
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Unable to cold reset the target \n"));
++ }
++
++ } while (FALSE);
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Failed to reset target \n"));
++ }
++#endif
++ return A_OK;
++}
++
++#define REG_DUMP_COUNT_AR6001 38 /* WORDs, derived from AR6001_regdump.h */
++#define REG_DUMP_COUNT_AR6002 32 /* WORDs, derived from AR6002_regdump.h */
++
++
++#if REG_DUMP_COUNT_AR6001 <= REG_DUMP_COUNT_AR6002
++#define REGISTER_DUMP_LEN_MAX REG_DUMP_COUNT_AR6002
++#else
++#define REGISTER_DUMP_LEN_MAX REG_DUMP_COUNT_AR6001
++#endif
++
++void ar6000_dump_target_assert_info(HIF_DEVICE *hifDevice, A_UINT32 TargetType)
++{
++ A_UINT32 address;
++ A_UINT32 regDumpArea = 0;
++ A_STATUS status;
++ A_UINT32 regDumpValues[REGISTER_DUMP_LEN_MAX];
++ A_UINT32 regDumpCount = 0;
++ A_UINT32 i;
++
++ do {
++
++ /* the reg dump pointer is copied to the host interest area */
++ address = HOST_INTEREST_ITEM_ADDRESS(TargetType, hi_failure_state);
++
++ if (TargetType == TARGET_TYPE_AR6001) {
++ /* for AR6001, this is a fixed location because the ptr is actually stuck in cache,
++ * this may be fixed in later firmware versions */
++ address = 0x18a0;
++ regDumpCount = REG_DUMP_COUNT_AR6001;
++
++ } else if (TargetType == TARGET_TYPE_AR6002) {
++
++ regDumpCount = REG_DUMP_COUNT_AR6002;
++
++ } else {
++ A_ASSERT(0);
++ }
++
++ /* read RAM location through diagnostic window */
++ status = ar6000_ReadRegDiag(hifDevice, &address, &regDumpArea);
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("AR6K: Failed to get ptr to register dump area \n"));
++ break;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("AR6K: Location of register dump data: 0x%X \n",regDumpArea));
++
++ if (regDumpArea == 0) {
++ /* no reg dump */
++ break;
++ }
++
++ if (TargetType == TARGET_TYPE_AR6001) {
++ regDumpArea &= 0x0FFFFFFF; /* convert to physical address in target memory */
++ }
++
++ /* fetch register dump data */
++ status = ar6000_ReadDataDiag(hifDevice,
++ regDumpArea,
++ (A_UCHAR *)&regDumpValues[0],
++ regDumpCount * (sizeof(A_UINT32)));
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("AR6K: Failed to get register dump \n"));
++ break;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("AR6K: Register Dump: \n"));
++
++ for (i = 0; i < regDumpCount; i++) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" %d : 0x%8.8X \n",i, regDumpValues[i]));
++ }
++
++ } while (FALSE);
++
++}
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/miscdrv/credit_dist.c linux-2.6.29-rc3.owrt.om/drivers/ar6000/miscdrv/credit_dist.c
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/miscdrv/credit_dist.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/miscdrv/credit_dist.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,346 @@
++
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "a_config.h"
++#include "athdefs.h"
++#include "a_types.h"
++#include "a_osapi.h"
++#include "a_debug.h"
++#include "htc_api.h"
++#include "common_drv.h"
++
++/********* CREDIT DISTRIBUTION FUNCTIONS ******************************************/
++
++#define NO_VO_SERVICE 1 /* currently WMI only uses 3 data streams, so we leave VO service inactive */
++
++#ifdef NO_VO_SERVICE
++#define DATA_SVCS_USED 3
++#else
++#define DATA_SVCS_USED 4
++#endif
++
++static void RedistributeCredits(COMMON_CREDIT_STATE_INFO *pCredInfo,
++ HTC_ENDPOINT_CREDIT_DIST *pEPDistList);
++
++static void SeekCredits(COMMON_CREDIT_STATE_INFO *pCredInfo,
++ HTC_ENDPOINT_CREDIT_DIST *pEPDistList);
++
++/* reduce an ep's credits back to a set limit */
++static INLINE void ReduceCredits(COMMON_CREDIT_STATE_INFO *pCredInfo,
++ HTC_ENDPOINT_CREDIT_DIST *pEpDist,
++ int Limit)
++{
++ int credits;
++
++ /* set the new limit */
++ pEpDist->TxCreditsAssigned = Limit;
++
++ if (pEpDist->TxCredits <= Limit) {
++ return;
++ }
++
++ /* figure out how much to take away */
++ credits = pEpDist->TxCredits - Limit;
++ /* take them away */
++ pEpDist->TxCredits -= credits;
++ pCredInfo->CurrentFreeCredits += credits;
++}
++
++/* give an endpoint some credits from the free credit pool */
++#define GiveCredits(pCredInfo,pEpDist,credits) \
++{ \
++ (pEpDist)->TxCredits += (credits); \
++ (pEpDist)->TxCreditsAssigned += (credits); \
++ (pCredInfo)->CurrentFreeCredits -= (credits); \
++}
++
++
++/* default credit init callback.
++ * This function is called in the context of HTCStart() to setup initial (application-specific)
++ * credit distributions */
++static void ar6000_credit_init(void *Context,
++ HTC_ENDPOINT_CREDIT_DIST *pEPList,
++ int TotalCredits)
++{
++ HTC_ENDPOINT_CREDIT_DIST *pCurEpDist;
++ int count;
++ COMMON_CREDIT_STATE_INFO *pCredInfo = (COMMON_CREDIT_STATE_INFO *)Context;
++
++ pCredInfo->CurrentFreeCredits = TotalCredits;
++ pCredInfo->TotalAvailableCredits = TotalCredits;
++
++ pCurEpDist = pEPList;
++
++ /* run through the list and initialize */
++ while (pCurEpDist != NULL) {
++
++ /* set minimums for each endpoint */
++ pCurEpDist->TxCreditsMin = pCurEpDist->TxCreditsPerMaxMsg;
++
++ if (pCurEpDist->ServiceID == WMI_CONTROL_SVC) {
++ /* give control service some credits */
++ GiveCredits(pCredInfo,pCurEpDist,pCurEpDist->TxCreditsMin);
++ /* control service is always marked active, it never goes inactive EVER */
++ SET_EP_ACTIVE(pCurEpDist);
++ } else if (pCurEpDist->ServiceID == WMI_DATA_BK_SVC) {
++ /* this is the lowest priority data endpoint, save this off for easy access */
++ pCredInfo->pLowestPriEpDist = pCurEpDist;
++ }
++
++ /* Streams have to be created (explicit | implicit)for all kinds
++ * of traffic. BE endpoints are also inactive in the beginning.
++ * When BE traffic starts it creates implicit streams that
++ * redistributes credits.
++ */
++
++ /* note, all other endpoints have minimums set but are initially given NO credits.
++ * Credits will be distributed as traffic activity demands */
++ pCurEpDist = pCurEpDist->pNext;
++ }
++
++ if (pCredInfo->CurrentFreeCredits <= 0) {
++ AR_DEBUG_PRINTF(ATH_LOG_INF, ("Not enough credits (%d) to do credit distributions \n", TotalCredits));
++ A_ASSERT(FALSE);
++ return;
++ }
++
++ /* reset list */
++ pCurEpDist = pEPList;
++ /* now run through the list and set max operating credit limits for everyone */
++ while (pCurEpDist != NULL) {
++ if (pCurEpDist->ServiceID == WMI_CONTROL_SVC) {
++ /* control service max is just 1 max message */
++ pCurEpDist->TxCreditsNorm = pCurEpDist->TxCreditsPerMaxMsg;
++ } else {
++ /* for the remaining data endpoints, we assume that each TxCreditsPerMaxMsg are
++ * the same.
++ * We use a simple calculation here, we take the remaining credits and
++ * determine how many max messages this can cover and then set each endpoint's
++ * normal value equal to half this amount.
++ * */
++ count = (pCredInfo->CurrentFreeCredits/pCurEpDist->TxCreditsPerMaxMsg) * pCurEpDist->TxCreditsPerMaxMsg;
++ count = count >> 1;
++ count = max(count,pCurEpDist->TxCreditsPerMaxMsg);
++ /* set normal */
++ pCurEpDist->TxCreditsNorm = count;
++
++ }
++ pCurEpDist = pCurEpDist->pNext;
++ }
++
++}
++
++
++/* default credit distribution callback
++ * This callback is invoked whenever endpoints require credit distributions.
++ * A lock is held while this function is invoked, this function shall NOT block.
++ * The pEPDistList is a list of distribution structures in prioritized order as
++ * defined by the call to the HTCSetCreditDistribution() api.
++ *
++ */
++static void ar6000_credit_distribute(void *Context,
++ HTC_ENDPOINT_CREDIT_DIST *pEPDistList,
++ HTC_CREDIT_DIST_REASON Reason)
++{
++ HTC_ENDPOINT_CREDIT_DIST *pCurEpDist;
++ COMMON_CREDIT_STATE_INFO *pCredInfo = (COMMON_CREDIT_STATE_INFO *)Context;
++
++ switch (Reason) {
++ case HTC_CREDIT_DIST_SEND_COMPLETE :
++ pCurEpDist = pEPDistList;
++ /* we are given the start of the endpoint distribution list.
++ * There may be one or more endpoints to service.
++ * Run through the list and distribute credits */
++ while (pCurEpDist != NULL) {
++
++ if (pCurEpDist->TxCreditsToDist > 0) {
++ /* return the credits back to the endpoint */
++ pCurEpDist->TxCredits += pCurEpDist->TxCreditsToDist;
++ /* always zero out when we are done */
++ pCurEpDist->TxCreditsToDist = 0;
++
++ if (pCurEpDist->TxCredits > pCurEpDist->TxCreditsAssigned) {
++ /* reduce to the assigned limit, previous credit reductions
++ * could have caused the limit to change */
++ ReduceCredits(pCredInfo, pCurEpDist, pCurEpDist->TxCreditsAssigned);
++ }
++
++ if (pCurEpDist->TxCredits > pCurEpDist->TxCreditsNorm) {
++ /* oversubscribed endpoints need to reduce back to normal */
++ ReduceCredits(pCredInfo, pCurEpDist, pCurEpDist->TxCreditsNorm);
++ }
++ }
++
++ pCurEpDist = pCurEpDist->pNext;
++ }
++
++ A_ASSERT(pCredInfo->CurrentFreeCredits <= pCredInfo->TotalAvailableCredits);
++
++ break;
++
++ case HTC_CREDIT_DIST_ACTIVITY_CHANGE :
++ RedistributeCredits(pCredInfo,pEPDistList);
++ break;
++ case HTC_CREDIT_DIST_SEEK_CREDITS :
++ SeekCredits(pCredInfo,pEPDistList);
++ break;
++ case HTC_DUMP_CREDIT_STATE :
++ AR_DEBUG_PRINTF(ATH_LOG_INF, ("Credit Distribution, total : %d, free : %d\n",
++ pCredInfo->TotalAvailableCredits, pCredInfo->CurrentFreeCredits));
++ break;
++ default:
++ break;
++
++ }
++
++}
++
++/* redistribute credits based on activity change */
++static void RedistributeCredits(COMMON_CREDIT_STATE_INFO *pCredInfo,
++ HTC_ENDPOINT_CREDIT_DIST *pEPDistList)
++{
++ HTC_ENDPOINT_CREDIT_DIST *pCurEpDist = pEPDistList;
++
++ /* walk through the list and remove credits from inactive endpoints */
++ while (pCurEpDist != NULL) {
++
++ if (pCurEpDist->ServiceID != WMI_CONTROL_SVC) {
++ if (!IS_EP_ACTIVE(pCurEpDist)) {
++ /* EP is inactive, reduce credits back to zero */
++ ReduceCredits(pCredInfo, pCurEpDist, 0);
++ }
++ }
++
++ /* NOTE in the active case, we do not need to do anything further,
++ * when an EP goes active and needs credits, HTC will call into
++ * our distribution function using a reason code of HTC_CREDIT_DIST_SEEK_CREDITS */
++
++ pCurEpDist = pCurEpDist->pNext;
++ }
++
++ A_ASSERT(pCredInfo->CurrentFreeCredits <= pCredInfo->TotalAvailableCredits);
++
++}
++
++/* HTC has an endpoint that needs credits, pEPDist is the endpoint in question */
++static void SeekCredits(COMMON_CREDIT_STATE_INFO *pCredInfo,
++ HTC_ENDPOINT_CREDIT_DIST *pEPDist)
++{
++ HTC_ENDPOINT_CREDIT_DIST *pCurEpDist;
++ int credits = 0;
++ int need;
++
++ do {
++
++ if (pEPDist->ServiceID == WMI_CONTROL_SVC) {
++ /* we never oversubscribe on the control service, this is not
++ * a high performance path and the target never holds onto control
++ * credits for too long */
++ break;
++ }
++
++ /* for all other services, we follow a simple algorithm of
++ * 1. checking the free pool for credits
++ * 2. checking lower priority endpoints for credits to take */
++
++ if (pCredInfo->CurrentFreeCredits >= 2 * pEPDist->TxCreditsSeek) {
++ /* try to give more credits than it needs */
++ credits = 2 * pEPDist->TxCreditsSeek;
++ } else {
++ /* give what we can */
++ credits = min(pCredInfo->CurrentFreeCredits,pEPDist->TxCreditsSeek);
++ }
++
++ if (credits >= pEPDist->TxCreditsSeek) {
++ /* we found some to fullfill the seek request */
++ break;
++ }
++
++ /* we don't have enough in the free pool, try taking away from lower priority services
++ *
++ * The rule for taking away credits:
++ * 1. Only take from lower priority endpoints
++ * 2. Only take what is allocated above the minimum (never starve an endpoint completely)
++ * 3. Only take what you need.
++ *
++ * */
++
++ /* starting at the lowest priority */
++ pCurEpDist = pCredInfo->pLowestPriEpDist;
++
++ /* work backwards until we hit the endpoint again */
++ while (pCurEpDist != pEPDist) {
++ /* calculate how many we need so far */
++ need = pEPDist->TxCreditsSeek - pCredInfo->CurrentFreeCredits;
++
++ if ((pCurEpDist->TxCreditsAssigned - need) > pCurEpDist->TxCreditsMin) {
++ /* the current one has been allocated more than it's minimum and it
++ * has enough credits assigned above it's minimum to fullfill our need
++ * try to take away just enough to fullfill our need */
++ ReduceCredits(pCredInfo,
++ pCurEpDist,
++ pCurEpDist->TxCreditsAssigned - need);
++
++ if (pCredInfo->CurrentFreeCredits >= pEPDist->TxCreditsSeek) {
++ /* we have enough */
++ break;
++ }
++ }
++
++ pCurEpDist = pCurEpDist->pPrev;
++ }
++
++ /* return what we can get */
++ credits = min(pCredInfo->CurrentFreeCredits,pEPDist->TxCreditsSeek);
++
++ } while (FALSE);
++
++ /* did we find some credits? */
++ if (credits) {
++ /* give what we can */
++ GiveCredits(pCredInfo, pEPDist, credits);
++ }
++
++}
++
++/* initialize and setup credit distribution */
++A_STATUS ar6000_setup_credit_dist(HTC_HANDLE HTCHandle, COMMON_CREDIT_STATE_INFO *pCredInfo)
++{
++ HTC_SERVICE_ID servicepriority[5];
++
++ A_MEMZERO(pCredInfo,sizeof(COMMON_CREDIT_STATE_INFO));
++
++ servicepriority[0] = WMI_CONTROL_SVC; /* highest */
++ servicepriority[1] = WMI_DATA_VO_SVC;
++ servicepriority[2] = WMI_DATA_VI_SVC;
++ servicepriority[3] = WMI_DATA_BE_SVC;
++ servicepriority[4] = WMI_DATA_BK_SVC; /* lowest */
++
++ /* set callbacks and priority list */
++ HTCSetCreditDistribution(HTCHandle,
++ pCredInfo,
++ ar6000_credit_distribute,
++ ar6000_credit_init,
++ servicepriority,
++ 5);
++
++ return A_OK;
++}
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/wlan/wlan_node.c linux-2.6.29-rc3.owrt.om/drivers/ar6000/wlan/wlan_node.c
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/wlan/wlan_node.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/wlan/wlan_node.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,371 @@
++/*-
++ * Copyright (c) 2001 Atsushi Onoe
++ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting
++ * Copyright (c) 2004-2005 Atheros Communications
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * 3. The name of the author may not be used to endorse or promote products
++ * derived from this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * GNU General Public License ("GPL") version 2 as published by the Free
++ * Software Foundation.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ *
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/wlan/src/wlan_node.c#1 $
++ */
++/*
++ * IEEE 802.11 node handling support.
++ */
++#include <a_config.h>
++#include <athdefs.h>
++#include <a_types.h>
++#include <a_osapi.h>
++#include <a_debug.h>
++#include <ieee80211.h>
++#include <wlan_api.h>
++#include <ieee80211_node.h>
++#include <htc_api.h>
++#include <wmi.h>
++#include <wmi_api.h>
++
++static void wlan_node_timeout(A_ATH_TIMER arg);
++static bss_t * _ieee80211_find_node(struct ieee80211_node_table *nt,
++ const A_UINT8 *macaddr);
++
++bss_t *
++wlan_node_alloc(struct ieee80211_node_table *nt, int wh_size)
++{
++ bss_t *ni;
++
++ ni = A_MALLOC_NOWAIT(sizeof(bss_t));
++
++ if (ni != NULL) {
++ ni->ni_buf = A_MALLOC_NOWAIT(wh_size);
++ if (ni->ni_buf == NULL) {
++ A_FREE(ni);
++ ni = NULL;
++ return ni;
++ }
++ } else {
++ return ni;
++ }
++
++ /* Make sure our lists are clean */
++ ni->ni_list_next = NULL;
++ ni->ni_list_prev = NULL;
++ ni->ni_hash_next = NULL;
++ ni->ni_hash_prev = NULL;
++
++ //
++ // ni_scangen never initialized before and during suspend/resume of winmobile, customer (LG/SEMCO) identified
++ // that some junk has been stored in this, due to this scan list didn't properly updated
++ //
++ ni->ni_scangen = 0;
++
++ return ni;
++}
++
++void
++wlan_node_free(bss_t *ni)
++{
++ if (ni->ni_buf != NULL) {
++ A_FREE(ni->ni_buf);
++ }
++ A_FREE(ni);
++}
++
++void
++wlan_setup_node(struct ieee80211_node_table *nt, bss_t *ni,
++ const A_UINT8 *macaddr)
++{
++ int hash;
++
++ A_MEMCPY(ni->ni_macaddr, macaddr, IEEE80211_ADDR_LEN);
++ hash = IEEE80211_NODE_HASH(macaddr);
++ ieee80211_node_initref(ni); /* mark referenced */
++
++ ni->ni_tstamp = A_GET_MS(WLAN_NODE_INACT_TIMEOUT_MSEC);
++ IEEE80211_NODE_LOCK_BH(nt);
++
++ /* Insert at the end of the node list */
++ ni->ni_list_next = NULL;
++ ni->ni_list_prev = nt->nt_node_last;
++ if(nt->nt_node_last != NULL)
++ {
++ nt->nt_node_last->ni_list_next = ni;
++ }
++ nt->nt_node_last = ni;
++ if(nt->nt_node_first == NULL)
++ {
++ nt->nt_node_first = ni;
++ }
++
++ /* Insert into the hash list i.e. the bucket */
++ if((ni->ni_hash_next = nt->nt_hash[hash]) != NULL)
++ {
++ nt->nt_hash[hash]->ni_hash_prev = ni;
++ }
++ ni->ni_hash_prev = NULL;
++ nt->nt_hash[hash] = ni;
++
++ if (!nt->isTimerArmed) {
++ A_TIMEOUT_MS(&nt->nt_inact_timer, WLAN_NODE_INACT_TIMEOUT_MSEC, 0);
++ nt->isTimerArmed = TRUE;
++ }
++
++ IEEE80211_NODE_UNLOCK_BH(nt);
++}
++
++static bss_t *
++_ieee80211_find_node(struct ieee80211_node_table *nt,
++ const A_UINT8 *macaddr)
++{
++ bss_t *ni;
++ int hash;
++
++ IEEE80211_NODE_LOCK_ASSERT(nt);
++
++ hash = IEEE80211_NODE_HASH(macaddr);
++ for(ni = nt->nt_hash[hash]; ni; ni = ni->ni_hash_next) {
++ if (IEEE80211_ADDR_EQ(ni->ni_macaddr, macaddr)) {
++ ieee80211_node_incref(ni); /* mark referenced */
++ return ni;
++ }
++ }
++ return NULL;
++}
++
++bss_t *
++wlan_find_node(struct ieee80211_node_table *nt, const A_UINT8 *macaddr)
++{
++ bss_t *ni;
++
++ IEEE80211_NODE_LOCK(nt);
++ ni = _ieee80211_find_node(nt, macaddr);
++ IEEE80211_NODE_UNLOCK(nt);
++ return ni;
++}
++
++/*
++ * Reclaim a node. If this is the last reference count then
++ * do the normal free work. Otherwise remove it from the node
++ * table and mark it gone by clearing the back-reference.
++ */
++void
++wlan_node_reclaim(struct ieee80211_node_table *nt, bss_t *ni)
++{
++ IEEE80211_NODE_LOCK(nt);
++
++ if(ni->ni_list_prev == NULL)
++ {
++ /* First in list so fix the list head */
++ nt->nt_node_first = ni->ni_list_next;
++ }
++ else
++ {
++ ni->ni_list_prev->ni_list_next = ni->ni_list_next;
++ }
++
++ if(ni->ni_list_next == NULL)
++ {
++ /* Last in list so fix list tail */
++ nt->nt_node_last = ni->ni_list_prev;
++ }
++ else
++ {
++ ni->ni_list_next->ni_list_prev = ni->ni_list_prev;
++ }
++
++ if(ni->ni_hash_prev == NULL)
++ {
++ /* First in list so fix the list head */
++ int hash;
++ hash = IEEE80211_NODE_HASH(ni->ni_macaddr);
++ nt->nt_hash[hash] = ni->ni_hash_next;
++ }
++ else
++ {
++ ni->ni_hash_prev->ni_hash_next = ni->ni_hash_next;
++ }
++
++ if(ni->ni_hash_next != NULL)
++ {
++ ni->ni_hash_next->ni_hash_prev = ni->ni_hash_prev;
++ }
++ wlan_node_free(ni);
++
++ IEEE80211_NODE_UNLOCK(nt);
++}
++
++static void
++wlan_node_dec_free(bss_t *ni)
++{
++ if (ieee80211_node_dectestref(ni)) {
++ wlan_node_free(ni);
++ }
++}
++
++void
++wlan_free_allnodes(struct ieee80211_node_table *nt)
++{
++ bss_t *ni;
++
++ while ((ni = nt->nt_node_first) != NULL) {
++ wlan_node_reclaim(nt, ni);
++ }
++}
++
++void
++wlan_iterate_nodes(struct ieee80211_node_table *nt, wlan_node_iter_func *f,
++ void *arg)
++{
++ bss_t *ni;
++ A_UINT32 gen;
++
++ gen = ++nt->nt_scangen;
++
++ IEEE80211_NODE_LOCK(nt);
++ for (ni = nt->nt_node_first; ni; ni = ni->ni_list_next) {
++ if (ni->ni_scangen != gen) {
++ ni->ni_scangen = gen;
++ (void) ieee80211_node_incref(ni);
++ (*f)(arg, ni);
++ wlan_node_dec_free(ni);
++ }
++ }
++ IEEE80211_NODE_UNLOCK(nt);
++}
++
++/*
++ * Node table support.
++ */
++void
++wlan_node_table_init(void *wmip, struct ieee80211_node_table *nt)
++{
++ int i;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_WLAN, ("node table = 0x%x\n", (A_UINT32)nt));
++ IEEE80211_NODE_LOCK_INIT(nt);
++
++ nt->nt_node_first = nt->nt_node_last = NULL;
++ for(i = 0; i < IEEE80211_NODE_HASHSIZE; i++)
++ {
++ nt->nt_hash[i] = NULL;
++ }
++ A_INIT_TIMER(&nt->nt_inact_timer, wlan_node_timeout, nt);
++ nt->isTimerArmed = FALSE;
++ nt->nt_wmip = wmip;
++}
++
++static void
++wlan_node_timeout(A_ATH_TIMER arg)
++{
++ struct ieee80211_node_table *nt = (struct ieee80211_node_table *)arg;
++ bss_t *bss, *nextBss;
++ A_UINT8 myBssid[IEEE80211_ADDR_LEN], reArmTimer = FALSE;
++
++ wmi_get_current_bssid(nt->nt_wmip, myBssid);
++
++ bss = nt->nt_node_first;
++ while (bss != NULL)
++ {
++ nextBss = bss->ni_list_next;
++ if (A_MEMCMP(myBssid, bss->ni_macaddr, sizeof(myBssid)) != 0)
++ {
++
++ if (bss->ni_tstamp <= A_GET_MS(0))
++ {
++ /*
++ * free up all but the current bss - if set
++ */
++ wlan_node_reclaim(nt, bss);
++ }
++ else
++ {
++ /*
++ * Re-arm timer, only when we have a bss other than
++ * current bss AND it is not aged-out.
++ */
++ reArmTimer = TRUE;
++ }
++ }
++ bss = nextBss;
++ }
++
++ if(reArmTimer)
++ A_TIMEOUT_MS(&nt->nt_inact_timer, WLAN_NODE_INACT_TIMEOUT_MSEC, 0);
++
++ nt->isTimerArmed = reArmTimer;
++}
++
++void
++wlan_node_table_cleanup(struct ieee80211_node_table *nt)
++{
++ A_UNTIMEOUT(&nt->nt_inact_timer);
++ A_DELETE_TIMER(&nt->nt_inact_timer);
++ wlan_free_allnodes(nt);
++ IEEE80211_NODE_LOCK_DESTROY(nt);
++}
++
++bss_t *
++wlan_find_Ssidnode (struct ieee80211_node_table *nt, A_UCHAR *pSsid,
++ A_UINT32 ssidLength, A_BOOL bIsWPA2)
++{
++ bss_t *ni = NULL;
++ A_UCHAR *pIESsid = NULL;
++
++ IEEE80211_NODE_LOCK (nt);
++
++ for (ni = nt->nt_node_first; ni; ni = ni->ni_list_next) {
++ pIESsid = ni->ni_cie.ie_ssid;
++ if (pIESsid[1] <= 32) {
++
++ // Step 1 : Check SSID
++ if (0x00 == memcmp (pSsid, &pIESsid[2], ssidLength)) {
++
++ // Step 2 : if SSID matches, check WPA or WPA2
++ if (TRUE == bIsWPA2 && NULL != ni->ni_cie.ie_rsn) {
++ ieee80211_node_incref (ni); /* mark referenced */
++ IEEE80211_NODE_UNLOCK (nt);
++ return ni;
++ }
++ if (FALSE == bIsWPA2 && NULL != ni->ni_cie.ie_wpa) {
++ ieee80211_node_incref(ni); /* mark referenced */
++ IEEE80211_NODE_UNLOCK (nt);
++ return ni;
++ }
++ }
++ }
++ }
++
++ IEEE80211_NODE_UNLOCK (nt);
++
++ return NULL;
++}
++
++void
++wlan_node_return (struct ieee80211_node_table *nt, bss_t *ni)
++{
++ IEEE80211_NODE_LOCK (nt);
++ wlan_node_dec_free (ni);
++ IEEE80211_NODE_UNLOCK (nt);
++}
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/wlan/wlan_recv_beacon.c linux-2.6.29-rc3.owrt.om/drivers/ar6000/wlan/wlan_recv_beacon.c
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/wlan/wlan_recv_beacon.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/wlan/wlan_recv_beacon.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,192 @@
++/*-
++ * Copyright (c) 2001 Atsushi Onoe
++ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * 3. The name of the author may not be used to endorse or promote products
++ * derived from this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * GNU General Public License ("GPL") version 2 as published by the Free
++ * Software Foundation.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++/*
++ * IEEE 802.11 input handling.
++ */
++
++#include "a_config.h"
++#include "athdefs.h"
++#include "a_types.h"
++#include "a_osapi.h"
++#include <wmi.h>
++#include <ieee80211.h>
++#include <wlan_api.h>
++
++#define IEEE80211_VERIFY_LENGTH(_len, _minlen) do { \
++ if ((_len) < (_minlen)) { \
++ return A_EINVAL; \
++ } \
++} while (0)
++
++#define IEEE80211_VERIFY_ELEMENT(__elem, __maxlen) do { \
++ if ((__elem) == NULL) { \
++ return A_EINVAL; \
++ } \
++ if ((__elem)[1] > (__maxlen)) { \
++ return A_EINVAL; \
++ } \
++} while (0)
++
++
++/* unaligned little endian access */
++#define LE_READ_2(p) \
++ ((A_UINT16) \
++ ((((A_UINT8 *)(p))[0] ) | (((A_UINT8 *)(p))[1] << 8)))
++
++#define LE_READ_4(p) \
++ ((A_UINT32) \
++ ((((A_UINT8 *)(p))[0] ) | (((A_UINT8 *)(p))[1] << 8) | \
++ (((A_UINT8 *)(p))[2] << 16) | (((A_UINT8 *)(p))[3] << 24)))
++
++
++static int __inline
++iswpaoui(const A_UINT8 *frm)
++{
++ return frm[1] > 3 && LE_READ_4(frm+2) == ((WPA_OUI_TYPE<<24)|WPA_OUI);
++}
++
++static int __inline
++iswmmoui(const A_UINT8 *frm)
++{
++ return frm[1] > 3 && LE_READ_4(frm+2) == ((WMM_OUI_TYPE<<24)|WMM_OUI);
++}
++
++static int __inline
++iswmmparam(const A_UINT8 *frm)
++{
++ return frm[1] > 5 && frm[6] == WMM_PARAM_OUI_SUBTYPE;
++}
++
++static int __inline
++iswmminfo(const A_UINT8 *frm)
++{
++ return frm[1] > 5 && frm[6] == WMM_INFO_OUI_SUBTYPE;
++}
++
++static int __inline
++isatherosoui(const A_UINT8 *frm)
++{
++ return frm[1] > 3 && LE_READ_4(frm+2) == ((ATH_OUI_TYPE<<24)|ATH_OUI);
++}
++
++static int __inline
++iswscoui(const A_UINT8 *frm)
++{
++ return frm[1] > 3 && LE_READ_4(frm+2) == ((0x04<<24)|WPA_OUI);
++}
++
++A_STATUS
++wlan_parse_beacon(A_UINT8 *buf, int framelen, struct ieee80211_common_ie *cie)
++{
++ A_UINT8 *frm, *efrm;
++
++ frm = buf;
++ efrm = (A_UINT8 *) (frm + framelen);
++
++ /*
++ * beacon/probe response frame format
++ * [8] time stamp
++ * [2] beacon interval
++ * [2] capability information
++ * [tlv] ssid
++ * [tlv] supported rates
++ * [tlv] country information
++ * [tlv] parameter set (FH/DS)
++ * [tlv] erp information
++ * [tlv] extended supported rates
++ * [tlv] WMM
++ * [tlv] WPA or RSN
++ * [tlv] Atheros Advanced Capabilities
++ */
++ IEEE80211_VERIFY_LENGTH(efrm - frm, 12);
++ A_MEMZERO(cie, sizeof(*cie));
++
++ cie->ie_tstamp = frm; frm += 8;
++ cie->ie_beaconInt = A_LE2CPU16(*(A_UINT16 *)frm); frm += 2;
++ cie->ie_capInfo = A_LE2CPU16(*(A_UINT16 *)frm); frm += 2;
++ cie->ie_chan = 0;
++
++ while (frm < efrm) {
++ switch (*frm) {
++ case IEEE80211_ELEMID_SSID:
++ cie->ie_ssid = frm;
++ break;
++ case IEEE80211_ELEMID_RATES:
++ cie->ie_rates = frm;
++ break;
++ case IEEE80211_ELEMID_COUNTRY:
++ cie->ie_country = frm;
++ break;
++ case IEEE80211_ELEMID_FHPARMS:
++ break;
++ case IEEE80211_ELEMID_DSPARMS:
++ cie->ie_chan = frm[2];
++ break;
++ case IEEE80211_ELEMID_TIM:
++ cie->ie_tim = frm;
++ break;
++ case IEEE80211_ELEMID_IBSSPARMS:
++ break;
++ case IEEE80211_ELEMID_XRATES:
++ cie->ie_xrates = frm;
++ break;
++ case IEEE80211_ELEMID_ERP:
++ if (frm[1] != 1) {
++ //A_PRINTF("Discarding ERP Element - Bad Len\n");
++ return A_EINVAL;
++ }
++ cie->ie_erp = frm[2];
++ break;
++ case IEEE80211_ELEMID_RSN:
++ cie->ie_rsn = frm;
++ break;
++ case IEEE80211_ELEMID_VENDOR:
++ if (iswpaoui(frm)) {
++ cie->ie_wpa = frm;
++ } else if (iswmmoui(frm)) {
++ cie->ie_wmm = frm;
++ } else if (isatherosoui(frm)) {
++ cie->ie_ath = frm;
++ } else if(iswscoui(frm)) {
++ cie->ie_wsc = frm;
++ }
++ break;
++ default:
++ break;
++ }
++ frm += frm[1] + 2;
++ }
++ IEEE80211_VERIFY_ELEMENT(cie->ie_rates, IEEE80211_RATE_MAXSIZE);
++ IEEE80211_VERIFY_ELEMENT(cie->ie_ssid, IEEE80211_NWID_LEN);
++
++ return A_OK;
++}
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/wlan/wlan_utils.c linux-2.6.29-rc3.owrt.om/drivers/ar6000/wlan/wlan_utils.c
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/wlan/wlan_utils.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/wlan/wlan_utils.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,59 @@
++/*
++ * Copyright (c) 2004-2005 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * This module implements frequently used wlan utilies
++ *
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/wlan/src/wlan_utils.c#1 $
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include <a_config.h>
++#include <athdefs.h>
++#include <a_types.h>
++#include <a_osapi.h>
++
++/*
++ * converts ieee channel number to frequency
++ */
++A_UINT16
++wlan_ieee2freq(int chan)
++{
++ if (chan == 14) {
++ return 2484;
++ }
++ if (chan < 14) { /* 0-13 */
++ return (2407 + (chan*5));
++ }
++ if (chan < 27) { /* 15-26 */
++ return (2512 + ((chan-15)*20));
++ }
++ return (5000 + (chan*5));
++}
++
++/*
++ * Converts MHz frequency to IEEE channel number.
++ */
++A_UINT32
++wlan_freq2ieee(A_UINT16 freq)
++{
++ if (freq == 2484)
++ return 14;
++ if (freq < 2484)
++ return (freq - 2407) / 5;
++ if (freq < 5000)
++ return 15 + ((freq - 2512) / 20);
++ return (freq - 5000) / 5;
++}
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/wmi/wmi.c linux-2.6.29-rc3.owrt.om/drivers/ar6000/wmi/wmi.c
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/wmi/wmi.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/wmi/wmi.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,3954 @@
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * This module implements the hardware independent layer of the
++ * Wireless Module Interface (WMI) protocol.
++ *
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/wmi/wmi.c#3 $
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include <a_config.h>
++#include <athdefs.h>
++#include <a_types.h>
++#include <a_osapi.h>
++#include "htc.h"
++#include "htc_api.h"
++#include "wmi.h"
++#include <ieee80211.h>
++#include <ieee80211_node.h>
++#include <wlan_api.h>
++#include <wmi_api.h>
++#include "dset_api.h"
++#include "gpio_api.h"
++#include "wmi_host.h"
++#include "a_drv.h"
++#include "a_drv_api.h"
++#include "a_debug.h"
++#include "dbglog_api.h"
++
++static A_STATUS wmi_ready_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++
++static A_STATUS wmi_connect_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_disconnect_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_tkip_micerr_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_bssInfo_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_opt_frame_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_pstream_timeout_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_sync_point(struct wmi_t *wmip);
++
++static A_STATUS wmi_bitrate_reply_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_ratemask_reply_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_channelList_reply_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_regDomain_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_txPwr_reply_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++static A_STATUS wmi_neighborReport_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++
++static A_STATUS wmi_dset_open_req_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++#ifdef CONFIG_HOST_DSET_SUPPORT
++static A_STATUS wmi_dset_close_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++static A_STATUS wmi_dset_data_req_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++#endif /* CONFIG_HOST_DSET_SUPPORT */
++
++
++static A_STATUS wmi_scanComplete_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_errorEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++static A_STATUS wmi_statsEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++static A_STATUS wmi_rssiThresholdEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++static A_STATUS wmi_hbChallengeResp_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++static A_STATUS wmi_reportErrorEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++static A_STATUS wmi_cac_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++static A_STATUS wmi_roam_tbl_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_roam_data_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_get_wow_list_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS
++wmi_get_pmkid_list_event_rx(struct wmi_t *wmip, A_UINT8 *datap, A_UINT32 len);
++
++#ifdef CONFIG_HOST_GPIO_SUPPORT
++static A_STATUS wmi_gpio_intr_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++static A_STATUS wmi_gpio_data_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++static A_STATUS wmi_gpio_ack_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++#endif /* CONFIG_HOST_GPIO_SUPPORT */
++
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++static A_STATUS
++wmi_tcmd_test_report_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++#endif
++
++static A_STATUS
++wmi_txRetryErrEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++
++static A_STATUS
++wmi_snrThresholdEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++
++static A_STATUS
++wmi_lqThresholdEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++
++static A_BOOL
++wmi_is_bitrate_index_valid(struct wmi_t *wmip, A_UINT32 rateIndex);
++
++static A_STATUS
++wmi_aplistEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++
++static A_STATUS
++wmi_dbglog_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++
++static A_STATUS wmi_keepalive_reply_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++
++int wps_enable;
++static const A_INT32 wmi_rateTable[] = {
++ 1000,
++ 2000,
++ 5500,
++ 11000,
++ 6000,
++ 9000,
++ 12000,
++ 18000,
++ 24000,
++ 36000,
++ 48000,
++ 54000,
++ 0};
++
++#define MODE_A_SUPPORT_RATE_START 4
++#define MODE_A_SUPPORT_RATE_STOP 11
++
++#define MODE_GONLY_SUPPORT_RATE_START MODE_A_SUPPORT_RATE_START
++#define MODE_GONLY_SUPPORT_RATE_STOP MODE_A_SUPPORT_RATE_STOP
++
++#define MODE_B_SUPPORT_RATE_START 0
++#define MODE_B_SUPPORT_RATE_STOP 3
++
++#define MODE_G_SUPPORT_RATE_START 0
++#define MODE_G_SUPPORT_RATE_STOP 11
++
++#define MAX_NUMBER_OF_SUPPORT_RATES (MODE_G_SUPPORT_RATE_STOP + 1)
++
++/* 802.1d to AC mapping. Refer pg 57 of WMM-test-plan-v1.2 */
++const A_UINT8 up_to_ac[]= {
++ WMM_AC_BE,
++ WMM_AC_BK,
++ WMM_AC_BK,
++ WMM_AC_BE,
++ WMM_AC_VI,
++ WMM_AC_VI,
++ WMM_AC_VO,
++ WMM_AC_VO,
++ };
++
++void *
++wmi_init(void *devt)
++{
++ struct wmi_t *wmip;
++
++ wmip = A_MALLOC(sizeof(struct wmi_t));
++ if (wmip == NULL) {
++ return (NULL);
++ }
++ A_MEMZERO(wmip, sizeof(*wmip));
++ A_MUTEX_INIT(&wmip->wmi_lock);
++ wmip->wmi_devt = devt;
++ wlan_node_table_init(wmip, &wmip->wmi_scan_table);
++ wmi_qos_state_init(wmip);
++ wmip->wmi_powerMode = REC_POWER;
++ wmip->wmi_phyMode = WMI_11G_MODE;
++
++ return (wmip);
++}
++
++void
++wmi_qos_state_init(struct wmi_t *wmip)
++{
++ A_UINT8 i;
++
++ if (wmip == NULL) {
++ return;
++ }
++ LOCK_WMI(wmip);
++
++ /* Initialize QoS States */
++ wmip->wmi_numQoSStream = 0;
++
++ wmip->wmi_fatPipeExists = 0;
++
++ for (i=0; i < WMM_NUM_AC; i++) {
++ wmip->wmi_streamExistsForAC[i]=0;
++ }
++
++ /* Initialize the static Wmi stream Pri to WMM AC mappings Arrays */
++ WMI_INIT_WMISTREAM_AC_MAP(wmip);
++
++ UNLOCK_WMI(wmip);
++
++ A_WMI_SET_NUMDATAENDPTS(wmip->wmi_devt, 1);
++}
++
++void
++wmi_shutdown(struct wmi_t *wmip)
++{
++ if (wmip != NULL) {
++ wlan_node_table_cleanup(&wmip->wmi_scan_table);
++ if (A_IS_MUTEX_VALID(&wmip->wmi_lock)) {
++ A_MUTEX_DELETE(&wmip->wmi_lock);
++ }
++ A_FREE(wmip);
++ }
++}
++
++/*
++ * performs DIX to 802.3 encapsulation for transmit packets.
++ * uses passed in buffer. Returns buffer or NULL if failed.
++ * Assumes the entire DIX header is contigous and that there is
++ * enough room in the buffer for a 802.3 mac header and LLC+SNAP headers.
++ */
++A_STATUS
++wmi_dix_2_dot3(struct wmi_t *wmip, void *osbuf)
++{
++ A_UINT8 *datap;
++ A_UINT16 typeorlen;
++ ATH_MAC_HDR macHdr;
++ ATH_LLC_SNAP_HDR *llcHdr;
++
++ A_ASSERT(osbuf != NULL);
++
++ if (A_NETBUF_HEADROOM(osbuf) <
++ (sizeof(ATH_LLC_SNAP_HDR) + sizeof(WMI_DATA_HDR)))
++ {
++ return A_NO_MEMORY;
++ }
++
++ datap = A_NETBUF_DATA(osbuf);
++
++ typeorlen = *(A_UINT16 *)(datap + ATH_MAC_LEN + ATH_MAC_LEN);
++
++ if (!IS_ETHERTYPE(A_BE2CPU16(typeorlen))) {
++ /*
++ * packet is already in 802.3 format - return success
++ */
++ A_DPRINTF(DBG_WMI, (DBGFMT "packet already 802.3\n", DBGARG));
++ return (A_OK);
++ }
++
++ /*
++ * Save mac fields and length to be inserted later
++ */
++ A_MEMCPY(macHdr.dstMac, datap, ATH_MAC_LEN);
++ A_MEMCPY(macHdr.srcMac, datap + ATH_MAC_LEN, ATH_MAC_LEN);
++ macHdr.typeOrLen = A_CPU2BE16(A_NETBUF_LEN(osbuf) - sizeof(ATH_MAC_HDR) +
++ sizeof(ATH_LLC_SNAP_HDR));
++
++ /*
++ * Make room for LLC+SNAP headers
++ */
++ if (A_NETBUF_PUSH(osbuf, sizeof(ATH_LLC_SNAP_HDR)) != A_OK) {
++ return A_NO_MEMORY;
++ }
++
++ datap = A_NETBUF_DATA(osbuf);
++
++ A_MEMCPY(datap, &macHdr, sizeof (ATH_MAC_HDR));
++
++ llcHdr = (ATH_LLC_SNAP_HDR *)(datap + sizeof(ATH_MAC_HDR));
++ llcHdr->dsap = 0xAA;
++ llcHdr->ssap = 0xAA;
++ llcHdr->cntl = 0x03;
++ llcHdr->orgCode[0] = 0x0;
++ llcHdr->orgCode[1] = 0x0;
++ llcHdr->orgCode[2] = 0x0;
++ llcHdr->etherType = typeorlen;
++
++ return (A_OK);
++}
++
++/*
++ * Adds a WMI data header
++ * Assumes there is enough room in the buffer to add header.
++ */
++A_STATUS
++wmi_data_hdr_add(struct wmi_t *wmip, void *osbuf, A_UINT8 msgType)
++{
++ WMI_DATA_HDR *dtHdr;
++
++ A_ASSERT(osbuf != NULL);
++
++ if (A_NETBUF_PUSH(osbuf, sizeof(WMI_DATA_HDR)) != A_OK) {
++ return A_NO_MEMORY;
++ }
++
++ dtHdr = (WMI_DATA_HDR *)A_NETBUF_DATA(osbuf);
++ dtHdr->info = msgType;
++ dtHdr->rssi = 0;
++
++ return (A_OK);
++}
++
++A_UINT8 wmi_implicit_create_pstream(struct wmi_t *wmip, void *osbuf, A_UINT8 dir, A_UINT8 up)
++{
++ A_UINT8 *datap;
++ A_UINT8 trafficClass = WMM_AC_BE, userPriority = up;
++ ATH_LLC_SNAP_HDR *llcHdr;
++ A_UINT16 ipType = IP_ETHERTYPE;
++ WMI_DATA_HDR *dtHdr;
++ WMI_CREATE_PSTREAM_CMD cmd;
++ A_BOOL streamExists = FALSE;
++
++ A_ASSERT(osbuf != NULL);
++
++ datap = A_NETBUF_DATA(osbuf);
++
++ if (up == UNDEFINED_PRI) {
++ llcHdr = (ATH_LLC_SNAP_HDR *)(datap + sizeof(WMI_DATA_HDR) +
++ sizeof(ATH_MAC_HDR));
++
++ if (llcHdr->etherType == A_CPU2BE16(ipType)) {
++ /* Extract the endpoint info from the TOS field in the IP header */
++ userPriority = A_WMI_IPTOS_TO_USERPRIORITY(((A_UINT8 *)llcHdr) + sizeof(ATH_LLC_SNAP_HDR));
++ }
++ }
++
++ if (userPriority < MAX_NUM_PRI) {
++ trafficClass = convert_userPriority_to_trafficClass(userPriority);
++ }
++
++ dtHdr = (WMI_DATA_HDR *)datap;
++ if(dir==UPLINK_TRAFFIC)
++ dtHdr->info |= (userPriority & WMI_DATA_HDR_UP_MASK) << WMI_DATA_HDR_UP_SHIFT; /* lower 3-bits are 802.1d priority */
++
++ LOCK_WMI(wmip);
++ streamExists = wmip->wmi_fatPipeExists;
++ UNLOCK_WMI(wmip);
++
++ if (!(streamExists & (1 << trafficClass))) {
++
++ A_MEMZERO(&cmd, sizeof(cmd));
++ cmd.trafficClass = trafficClass;
++ cmd.userPriority = userPriority;
++ cmd.inactivityInt = WMI_IMPLICIT_PSTREAM_INACTIVITY_INT;
++ /* Implicit streams are created with TSID 0xFF */
++ cmd.tsid = WMI_IMPLICIT_PSTREAM;
++ wmi_create_pstream_cmd(wmip, &cmd);
++ }
++
++ return trafficClass;
++}
++
++WMI_PRI_STREAM_ID
++wmi_get_stream_id(struct wmi_t *wmip, A_UINT8 trafficClass)
++{
++ return WMI_ACCESSCATEGORY_WMISTREAM(wmip, trafficClass);
++}
++
++/*
++ * performs 802.3 to DIX encapsulation for received packets.
++ * Assumes the entire 802.3 header is contigous.
++ */
++A_STATUS
++wmi_dot3_2_dix(struct wmi_t *wmip, void *osbuf)
++{
++ A_UINT8 *datap;
++ ATH_MAC_HDR macHdr;
++ ATH_LLC_SNAP_HDR *llcHdr;
++
++ A_ASSERT(osbuf != NULL);
++ datap = A_NETBUF_DATA(osbuf);
++
++ A_MEMCPY(&macHdr, datap, sizeof(ATH_MAC_HDR));
++ llcHdr = (ATH_LLC_SNAP_HDR *)(datap + sizeof(ATH_MAC_HDR));
++ macHdr.typeOrLen = llcHdr->etherType;
++
++ if (A_NETBUF_PULL(osbuf, sizeof(ATH_LLC_SNAP_HDR)) != A_OK) {
++ return A_NO_MEMORY;
++ }
++
++ datap = A_NETBUF_DATA(osbuf);
++
++ A_MEMCPY(datap, &macHdr, sizeof (ATH_MAC_HDR));
++
++ return (A_OK);
++}
++
++/*
++ * Removes a WMI data header
++ */
++A_STATUS
++wmi_data_hdr_remove(struct wmi_t *wmip, void *osbuf)
++{
++ A_ASSERT(osbuf != NULL);
++
++ return (A_NETBUF_PULL(osbuf, sizeof(WMI_DATA_HDR)));
++}
++
++void
++wmi_iterate_nodes(struct wmi_t *wmip, wlan_node_iter_func *f, void *arg)
++{
++ wlan_iterate_nodes(&wmip->wmi_scan_table, f, arg);
++}
++
++/*
++ * WMI Extended Event received from Target.
++ */
++A_STATUS
++wmi_control_rx_xtnd(struct wmi_t *wmip, void *osbuf)
++{
++ WMIX_CMD_HDR *cmd;
++ A_UINT16 id;
++ A_UINT8 *datap;
++ A_UINT32 len;
++ A_STATUS status = A_OK;
++
++ if (A_NETBUF_LEN(osbuf) < sizeof(WMIX_CMD_HDR)) {
++ A_DPRINTF(DBG_WMI, (DBGFMT "bad packet 1\n", DBGARG));
++ wmip->wmi_stats.cmd_len_err++;
++ A_NETBUF_FREE(osbuf);
++ return A_ERROR;
++ }
++
++ cmd = (WMIX_CMD_HDR *)A_NETBUF_DATA(osbuf);
++ id = cmd->commandId;
++
++ if (A_NETBUF_PULL(osbuf, sizeof(WMIX_CMD_HDR)) != A_OK) {
++ A_DPRINTF(DBG_WMI, (DBGFMT "bad packet 2\n", DBGARG));
++ wmip->wmi_stats.cmd_len_err++;
++ A_NETBUF_FREE(osbuf);
++ return A_ERROR;
++ }
++
++ datap = A_NETBUF_DATA(osbuf);
++ len = A_NETBUF_LEN(osbuf);
++
++ switch (id) {
++ case (WMIX_DSETOPENREQ_EVENTID):
++ status = wmi_dset_open_req_rx(wmip, datap, len);
++ break;
++#ifdef CONFIG_HOST_DSET_SUPPORT
++ case (WMIX_DSETCLOSE_EVENTID):
++ status = wmi_dset_close_rx(wmip, datap, len);
++ break;
++ case (WMIX_DSETDATAREQ_EVENTID):
++ status = wmi_dset_data_req_rx(wmip, datap, len);
++ break;
++#endif /* CONFIG_HOST_DSET_SUPPORT */
++#ifdef CONFIG_HOST_GPIO_SUPPORT
++ case (WMIX_GPIO_INTR_EVENTID):
++ wmi_gpio_intr_rx(wmip, datap, len);
++ break;
++ case (WMIX_GPIO_DATA_EVENTID):
++ wmi_gpio_data_rx(wmip, datap, len);
++ break;
++ case (WMIX_GPIO_ACK_EVENTID):
++ wmi_gpio_ack_rx(wmip, datap, len);
++ break;
++#endif /* CONFIG_HOST_GPIO_SUPPORT */
++ case (WMIX_HB_CHALLENGE_RESP_EVENTID):
++ wmi_hbChallengeResp_rx(wmip, datap, len);
++ break;
++ case (WMIX_DBGLOG_EVENTID):
++ wmi_dbglog_event_rx(wmip, datap, len);
++ break;
++ default:
++ A_DPRINTF(DBG_WMI|DBG_ERROR,
++ (DBGFMT "Unknown id 0x%x\n", DBGARG, id));
++ wmip->wmi_stats.cmd_id_err++;
++ status = A_ERROR;
++ break;
++ }
++
++ return status;
++}
++
++/*
++ * Control Path
++ */
++A_UINT32 cmdRecvNum;
++
++A_STATUS
++wmi_control_rx(struct wmi_t *wmip, void *osbuf)
++{
++ WMI_CMD_HDR *cmd;
++ A_UINT16 id;
++ A_UINT8 *datap;
++ A_UINT32 len, i, loggingReq;
++ A_STATUS status = A_OK;
++
++ A_ASSERT(osbuf != NULL);
++ if (A_NETBUF_LEN(osbuf) < sizeof(WMI_CMD_HDR)) {
++ A_DPRINTF(DBG_WMI, (DBGFMT "bad packet 1\n", DBGARG));
++ wmip->wmi_stats.cmd_len_err++;
++ A_NETBUF_FREE(osbuf);
++ return A_ERROR;
++ }
++
++ cmd = (WMI_CMD_HDR *)A_NETBUF_DATA(osbuf);
++ id = cmd->commandId;
++
++ if (A_NETBUF_PULL(osbuf, sizeof(WMI_CMD_HDR)) != A_OK) {
++ A_DPRINTF(DBG_WMI, (DBGFMT "bad packet 2\n", DBGARG));
++ wmip->wmi_stats.cmd_len_err++;
++ A_NETBUF_FREE(osbuf);
++ return A_ERROR;
++ }
++
++ datap = A_NETBUF_DATA(osbuf);
++ len = A_NETBUF_LEN(osbuf);
++
++ ar6000_get_driver_cfg(wmip->wmi_devt,
++ AR6000_DRIVER_CFG_LOG_RAW_WMI_MSGS,
++ &loggingReq);
++
++ if(loggingReq) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("WMI %d \n",id));
++ AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("WMI recv, MsgNo %d : ", cmdRecvNum));
++ for(i = 0; i < len; i++)
++ AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("%x ", datap[i]));
++ AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("\n"));
++ }
++
++ LOCK_WMI(wmip);
++ cmdRecvNum++;
++ UNLOCK_WMI(wmip);
++
++ switch (id) {
++ case (WMI_GET_BITRATE_CMDID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_GET_BITRATE_CMDID\n", DBGARG));
++ status = wmi_bitrate_reply_rx(wmip, datap, len);
++ break;
++ case (WMI_GET_CHANNEL_LIST_CMDID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_GET_CHANNEL_LIST_CMDID\n", DBGARG));
++ status = wmi_channelList_reply_rx(wmip, datap, len);
++ break;
++ case (WMI_GET_TX_PWR_CMDID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_GET_TX_PWR_CMDID\n", DBGARG));
++ status = wmi_txPwr_reply_rx(wmip, datap, len);
++ break;
++ case (WMI_READY_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_READY_EVENTID\n", DBGARG));
++ status = wmi_ready_event_rx(wmip, datap, len);
++ A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
++ A_WMI_DBGLOG_INIT_DONE(wmip->wmi_devt);
++ break;
++ case (WMI_CONNECT_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_CONNECT_EVENTID\n", DBGARG));
++ status = wmi_connect_event_rx(wmip, datap, len);
++ A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
++ break;
++ case (WMI_DISCONNECT_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_DISCONNECT_EVENTID\n", DBGARG));
++ status = wmi_disconnect_event_rx(wmip, datap, len);
++ A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
++ break;
++ case (WMI_TKIP_MICERR_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_TKIP_MICERR_EVENTID\n", DBGARG));
++ status = wmi_tkip_micerr_event_rx(wmip, datap, len);
++ break;
++ case (WMI_BSSINFO_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_BSSINFO_EVENTID\n", DBGARG));
++ status = wmi_bssInfo_event_rx(wmip, datap, len);
++ A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
++ break;
++ case (WMI_REGDOMAIN_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_REGDOMAIN_EVENTID\n", DBGARG));
++ status = wmi_regDomain_event_rx(wmip, datap, len);
++ break;
++ case (WMI_PSTREAM_TIMEOUT_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_PSTREAM_TIMEOUT_EVENTID\n", DBGARG));
++ status = wmi_pstream_timeout_event_rx(wmip, datap, len);
++ /* pstreams are fatpipe abstractions that get implicitly created.
++ * User apps only deal with thinstreams. creation of a thinstream
++ * by the user or data traffic flow in an AC triggers implicit
++ * pstream creation. Do we need to send this event to App..?
++ * no harm in sending it.
++ */
++ A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
++ break;
++ case (WMI_NEIGHBOR_REPORT_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_NEIGHBOR_REPORT_EVENTID\n", DBGARG));
++ status = wmi_neighborReport_event_rx(wmip, datap, len);
++ break;
++ case (WMI_SCAN_COMPLETE_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_SCAN_COMPLETE_EVENTID\n", DBGARG));
++ status = wmi_scanComplete_rx(wmip, datap, len);
++ A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
++ break;
++ case (WMI_CMDERROR_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_CMDERROR_EVENTID\n", DBGARG));
++ status = wmi_errorEvent_rx(wmip, datap, len);
++ break;
++ case (WMI_REPORT_STATISTICS_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_REPORT_STATISTICS_EVENTID\n", DBGARG));
++ status = wmi_statsEvent_rx(wmip, datap, len);
++ break;
++ case (WMI_RSSI_THRESHOLD_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_RSSI_THRESHOLD_EVENTID\n", DBGARG));
++ status = wmi_rssiThresholdEvent_rx(wmip, datap, len);
++ break;
++ case (WMI_ERROR_REPORT_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_ERROR_REPORT_EVENTID\n", DBGARG));
++ status = wmi_reportErrorEvent_rx(wmip, datap, len);
++ A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
++ break;
++ case (WMI_OPT_RX_FRAME_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_OPT_RX_FRAME_EVENTID\n", DBGARG));
++ status = wmi_opt_frame_event_rx(wmip, datap, len);
++ break;
++ case (WMI_REPORT_ROAM_TBL_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_REPORT_ROAM_TBL_EVENTID\n", DBGARG));
++ status = wmi_roam_tbl_event_rx(wmip, datap, len);
++ break;
++ case (WMI_EXTENSION_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_EXTENSION_EVENTID\n", DBGARG));
++ status = wmi_control_rx_xtnd(wmip, osbuf);
++ break;
++ case (WMI_CAC_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_CAC_EVENTID\n", DBGARG));
++ status = wmi_cac_event_rx(wmip, datap, len);
++ break;
++ case (WMI_REPORT_ROAM_DATA_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_REPORT_ROAM_DATA_EVENTID\n", DBGARG));
++ status = wmi_roam_data_event_rx(wmip, datap, len);
++ break;
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++ case (WMI_TEST_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_TEST_EVENTID\n", DBGARG));
++ status = wmi_tcmd_test_report_rx(wmip, datap, len);
++ break;
++#endif
++ case (WMI_GET_FIXRATES_CMDID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_GET_FIXRATES_CMDID\n", DBGARG));
++ status = wmi_ratemask_reply_rx(wmip, datap, len);
++ break;
++ case (WMI_TX_RETRY_ERR_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_TX_RETRY_ERR_EVENTID\n", DBGARG));
++ status = wmi_txRetryErrEvent_rx(wmip, datap, len);
++ A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
++ break;
++ case (WMI_SNR_THRESHOLD_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_SNR_THRESHOLD_EVENTID\n", DBGARG));
++ status = wmi_snrThresholdEvent_rx(wmip, datap, len);
++ A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
++ break;
++ case (WMI_LQ_THRESHOLD_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_LQ_THRESHOLD_EVENTID\n", DBGARG));
++ status = wmi_lqThresholdEvent_rx(wmip, datap, len);
++ A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
++ break;
++ case (WMI_APLIST_EVENTID):
++ AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("Received APLIST Event\n"));
++ status = wmi_aplistEvent_rx(wmip, datap, len);
++ break;
++ case (WMI_GET_KEEPALIVE_CMDID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_GET_KEEPALIVE_CMDID\n", DBGARG));
++ status = wmi_keepalive_reply_rx(wmip, datap, len);
++ break;
++ case (WMI_GET_WOW_LIST_EVENTID):
++ status = wmi_get_wow_list_event_rx(wmip, datap, len);
++ break;
++ case (WMI_GET_PMKID_LIST_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_GET_PMKID_LIST Event\n", DBGARG));
++ status = wmi_get_pmkid_list_event_rx(wmip, datap, len);
++ break;
++ default:
++ A_DPRINTF(DBG_WMI|DBG_ERROR,
++ (DBGFMT "Unknown id 0x%x\n", DBGARG, id));
++ wmip->wmi_stats.cmd_id_err++;
++ status = A_ERROR;
++ break;
++ }
++
++ A_NETBUF_FREE(osbuf);
++
++ return status;
++}
++
++static A_STATUS
++wmi_ready_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_READY_EVENT *ev = (WMI_READY_EVENT *)datap;
++
++ if (len < sizeof(WMI_READY_EVENT)) {
++ return A_EINVAL;
++ }
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++ wmip->wmi_ready = TRUE;
++ A_WMI_READY_EVENT(wmip->wmi_devt, ev->macaddr, ev->phyCapability);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_connect_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_CONNECT_EVENT *ev;
++
++ if (len < sizeof(WMI_CONNECT_EVENT)) {
++ return A_EINVAL;
++ }
++ ev = (WMI_CONNECT_EVENT *)datap;
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "freq %d bssid %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n",
++ DBGARG, ev->channel,
++ ev->bssid[0], ev->bssid[1], ev->bssid[2],
++ ev->bssid[3], ev->bssid[4], ev->bssid[5]));
++
++ A_MEMCPY(wmip->wmi_bssid, ev->bssid, ATH_MAC_LEN);
++
++ A_WMI_CONNECT_EVENT(wmip->wmi_devt, ev->channel, ev->bssid,
++ ev->listenInterval, ev->beaconInterval,
++ ev->networkType, ev->beaconIeLen,
++ ev->assocReqLen, ev->assocRespLen,
++ ev->assocInfo);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_regDomain_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_REG_DOMAIN_EVENT *ev;
++
++ if (len < sizeof(*ev)) {
++ return A_EINVAL;
++ }
++ ev = (WMI_REG_DOMAIN_EVENT *)datap;
++
++ A_WMI_REGDOMAIN_EVENT(wmip->wmi_devt, ev->regDomain);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_neighborReport_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_NEIGHBOR_REPORT_EVENT *ev;
++ int numAps;
++
++ if (len < sizeof(*ev)) {
++ return A_EINVAL;
++ }
++ ev = (WMI_NEIGHBOR_REPORT_EVENT *)datap;
++ numAps = ev->numberOfAps;
++
++ if (len < (int)(sizeof(*ev) + ((numAps - 1) * sizeof(WMI_NEIGHBOR_INFO)))) {
++ return A_EINVAL;
++ }
++
++ A_WMI_NEIGHBORREPORT_EVENT(wmip->wmi_devt, numAps, ev->neighbor);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_disconnect_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_DISCONNECT_EVENT *ev;
++
++ if (len < sizeof(WMI_DISCONNECT_EVENT)) {
++ return A_EINVAL;
++ }
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ ev = (WMI_DISCONNECT_EVENT *)datap;
++
++ A_MEMZERO(wmip->wmi_bssid, sizeof(wmip->wmi_bssid));
++
++ A_WMI_DISCONNECT_EVENT(wmip->wmi_devt, ev->disconnectReason, ev->bssid,
++ ev->assocRespLen, ev->assocInfo, ev->protocolReasonStatus);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_tkip_micerr_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_TKIP_MICERR_EVENT *ev;
++
++ if (len < sizeof(*ev)) {
++ return A_EINVAL;
++ }
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ ev = (WMI_TKIP_MICERR_EVENT *)datap;
++ A_WMI_TKIP_MICERR_EVENT(wmip->wmi_devt, ev->keyid, ev->ismcast);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_bssInfo_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ bss_t *bss;
++ WMI_BSS_INFO_HDR *bih;
++ A_UINT8 *buf;
++ A_UINT32 nodeCachingAllowed;
++
++ if (len <= sizeof(WMI_BSS_INFO_HDR)) {
++ return A_EINVAL;
++ }
++
++ A_WMI_BSSINFO_EVENT_RX(wmip->wmi_devt, datap, len);
++ /* What is driver config for wlan node caching? */
++ if(ar6000_get_driver_cfg(wmip->wmi_devt,
++ AR6000_DRIVER_CFG_GET_WLANNODECACHING,
++ &nodeCachingAllowed) != A_OK) {
++ return A_EINVAL;
++ }
++
++ if(!nodeCachingAllowed) {
++ return A_OK;
++ }
++
++
++ bih = (WMI_BSS_INFO_HDR *)datap;
++ buf = datap + sizeof(WMI_BSS_INFO_HDR);
++ len -= sizeof(WMI_BSS_INFO_HDR);
++
++ A_DPRINTF(DBG_WMI2, (DBGFMT "bssInfo event - ch %u, rssi %02x, "
++ "bssid \"%02x:%02x:%02x:%02x:%02x:%02x\"\n", DBGARG,
++ bih->channel, (unsigned char) bih->rssi, bih->bssid[0],
++ bih->bssid[1], bih->bssid[2], bih->bssid[3], bih->bssid[4],
++ bih->bssid[5]));
++
++ if(wps_enable && (bih->frameType == PROBERESP_FTYPE) ) {
++ printk("%s() A_OK 2\n", __FUNCTION__);
++ return A_OK;
++ }
++
++ bss = wlan_find_node(&wmip->wmi_scan_table, bih->bssid);
++ if (bss != NULL) {
++ /*
++ * Free up the node. Not the most efficient process given
++ * we are about to allocate a new node but it is simple and should be
++ * adequate.
++ */
++ wlan_node_reclaim(&wmip->wmi_scan_table, bss);
++ }
++
++ bss = wlan_node_alloc(&wmip->wmi_scan_table, len);
++ if (bss == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ bss->ni_snr = bih->snr;
++ bss->ni_rssi = bih->rssi;
++ A_ASSERT(bss->ni_buf != NULL);
++ A_MEMCPY(bss->ni_buf, buf, len);
++
++ if (wlan_parse_beacon(bss->ni_buf, len, &bss->ni_cie) != A_OK) {
++ wlan_node_free(bss);
++ return A_EINVAL;
++ }
++
++ /*
++ * Update the frequency in ie_chan, overwriting of channel number
++ * which is done in wlan_parse_beacon
++ */
++ bss->ni_cie.ie_chan = bih->channel;
++ wlan_setup_node(&wmip->wmi_scan_table, bss, bih->bssid);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_opt_frame_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ bss_t *bss;
++ WMI_OPT_RX_INFO_HDR *bih;
++ A_UINT8 *buf;
++
++ if (len <= sizeof(WMI_OPT_RX_INFO_HDR)) {
++ return A_EINVAL;
++ }
++
++ bih = (WMI_OPT_RX_INFO_HDR *)datap;
++ buf = datap + sizeof(WMI_OPT_RX_INFO_HDR);
++ len -= sizeof(WMI_OPT_RX_INFO_HDR);
++
++ A_DPRINTF(DBG_WMI2, (DBGFMT "opt frame event %2.2x:%2.2x\n", DBGARG,
++ bih->bssid[4], bih->bssid[5]));
++
++ bss = wlan_find_node(&wmip->wmi_scan_table, bih->bssid);
++ if (bss != NULL) {
++ /*
++ * Free up the node. Not the most efficient process given
++ * we are about to allocate a new node but it is simple and should be
++ * adequate.
++ */
++ wlan_node_reclaim(&wmip->wmi_scan_table, bss);
++ }
++
++ bss = wlan_node_alloc(&wmip->wmi_scan_table, len);
++ if (bss == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ bss->ni_snr = bih->snr;
++ bss->ni_cie.ie_chan = bih->channel;
++ A_ASSERT(bss->ni_buf != NULL);
++ A_MEMCPY(bss->ni_buf, buf, len);
++ wlan_setup_node(&wmip->wmi_scan_table, bss, bih->bssid);
++
++ return A_OK;
++}
++
++ /* This event indicates inactivity timeout of a fatpipe(pstream)
++ * at the target
++ */
++static A_STATUS
++wmi_pstream_timeout_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_PSTREAM_TIMEOUT_EVENT *ev;
++
++ if (len < sizeof(WMI_PSTREAM_TIMEOUT_EVENT)) {
++ return A_EINVAL;
++ }
++
++ A_DPRINTF(DBG_WMI, (DBGFMT "wmi_pstream_timeout_event_rx\n", DBGARG));
++
++ ev = (WMI_PSTREAM_TIMEOUT_EVENT *)datap;
++
++ /* When the pstream (fat pipe == AC) timesout, it means there were no
++ * thinStreams within this pstream & it got implicitly created due to
++ * data flow on this AC. We start the inactivity timer only for
++ * implicitly created pstream. Just reset the host state.
++ */
++ /* Set the activeTsids for this AC to 0 */
++ LOCK_WMI(wmip);
++ wmip->wmi_streamExistsForAC[ev->trafficClass]=0;
++ wmip->wmi_fatPipeExists &= ~(1 << ev->trafficClass);
++ UNLOCK_WMI(wmip);
++
++ /*Indicate inactivity to driver layer for this fatpipe (pstream)*/
++ A_WMI_STREAM_TX_INACTIVE(wmip->wmi_devt, ev->trafficClass);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_bitrate_reply_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_BIT_RATE_CMD *reply;
++ A_INT32 rate;
++
++ if (len < sizeof(WMI_BIT_RATE_CMD)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_BIT_RATE_CMD *)datap;
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "Enter - rateindex %d\n", DBGARG, reply->rateIndex));
++
++ if (reply->rateIndex == RATE_AUTO) {
++ rate = RATE_AUTO;
++ } else {
++ rate = wmi_rateTable[(A_UINT32) reply->rateIndex];
++ }
++
++ A_WMI_BITRATE_RX(wmip->wmi_devt, rate);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_ratemask_reply_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_FIX_RATES_CMD *reply;
++
++ if (len < sizeof(WMI_BIT_RATE_CMD)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_FIX_RATES_CMD *)datap;
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "Enter - fixed rate mask %x\n", DBGARG, reply->fixRateMask));
++
++ A_WMI_RATEMASK_RX(wmip->wmi_devt, reply->fixRateMask);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_channelList_reply_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_CHANNEL_LIST_REPLY *reply;
++
++ if (len < sizeof(WMI_CHANNEL_LIST_REPLY)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_CHANNEL_LIST_REPLY *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_CHANNELLIST_RX(wmip->wmi_devt, reply->numChannels,
++ reply->channelList);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_txPwr_reply_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_TX_PWR_REPLY *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_TX_PWR_REPLY *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_TXPWR_RX(wmip->wmi_devt, reply->dbM);
++
++ return A_OK;
++}
++static A_STATUS
++wmi_keepalive_reply_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_GET_KEEPALIVE_CMD *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_GET_KEEPALIVE_CMD *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_KEEPALIVE_RX(wmip->wmi_devt, reply->configured);
++
++ return A_OK;
++}
++
++
++static A_STATUS
++wmi_dset_open_req_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMIX_DSETOPENREQ_EVENT *dsetopenreq;
++
++ if (len < sizeof(WMIX_DSETOPENREQ_EVENT)) {
++ return A_EINVAL;
++ }
++ dsetopenreq = (WMIX_DSETOPENREQ_EVENT *)datap;
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "Enter - dset_id=0x%x\n", DBGARG, dsetopenreq->dset_id));
++ A_WMI_DSET_OPEN_REQ(wmip->wmi_devt,
++ dsetopenreq->dset_id,
++ dsetopenreq->targ_dset_handle,
++ dsetopenreq->targ_reply_fn,
++ dsetopenreq->targ_reply_arg);
++
++ return A_OK;
++}
++
++#ifdef CONFIG_HOST_DSET_SUPPORT
++static A_STATUS
++wmi_dset_close_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMIX_DSETCLOSE_EVENT *dsetclose;
++
++ if (len < sizeof(WMIX_DSETCLOSE_EVENT)) {
++ return A_EINVAL;
++ }
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ dsetclose = (WMIX_DSETCLOSE_EVENT *)datap;
++ A_WMI_DSET_CLOSE(wmip->wmi_devt, dsetclose->access_cookie);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_dset_data_req_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMIX_DSETDATAREQ_EVENT *dsetdatareq;
++
++ if (len < sizeof(WMIX_DSETDATAREQ_EVENT)) {
++ return A_EINVAL;
++ }
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ dsetdatareq = (WMIX_DSETDATAREQ_EVENT *)datap;
++ A_WMI_DSET_DATA_REQ(wmip->wmi_devt,
++ dsetdatareq->access_cookie,
++ dsetdatareq->offset,
++ dsetdatareq->length,
++ dsetdatareq->targ_buf,
++ dsetdatareq->targ_reply_fn,
++ dsetdatareq->targ_reply_arg);
++
++ return A_OK;
++}
++#endif /* CONFIG_HOST_DSET_SUPPORT */
++
++static A_STATUS
++wmi_scanComplete_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_SCAN_COMPLETE_EVENT *ev;
++
++ ev = (WMI_SCAN_COMPLETE_EVENT *)datap;
++ A_WMI_SCANCOMPLETE_EVENT(wmip->wmi_devt, ev->status);
++
++ return A_OK;
++}
++
++/*
++ * Target is reporting a programming error. This is for
++ * developer aid only. Target only checks a few common violations
++ * and it is responsibility of host to do all error checking.
++ * Behavior of target after wmi error event is undefined.
++ * A reset is recommended.
++ */
++static A_STATUS
++wmi_errorEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_CMD_ERROR_EVENT *ev;
++
++ ev = (WMI_CMD_ERROR_EVENT *)datap;
++ AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("Programming Error: cmd=%d ", ev->commandId));
++ switch (ev->errorCode) {
++ case (INVALID_PARAM):
++ AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("Illegal Parameter\n"));
++ break;
++ case (ILLEGAL_STATE):
++ AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("Illegal State\n"));
++ break;
++ case (INTERNAL_ERROR):
++ AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("Internal Error\n"));
++ break;
++ }
++
++ return A_OK;
++}
++
++
++static A_STATUS
++wmi_statsEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_TARGET_STATS *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_TARGET_STATS *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_TARGETSTATS_EVENT(wmip->wmi_devt, reply);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_rssiThresholdEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_RSSI_THRESHOLD_EVENT *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_RSSI_THRESHOLD_EVENT *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_RSSI_THRESHOLD_EVENT(wmip->wmi_devt, reply->range, reply->rssi);
++
++ return A_OK;
++}
++
++
++static A_STATUS
++wmi_reportErrorEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_TARGET_ERROR_REPORT_EVENT *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_TARGET_ERROR_REPORT_EVENT *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_REPORT_ERROR_EVENT(wmip->wmi_devt, reply->errorVal);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_cac_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_CAC_EVENT *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_CAC_EVENT *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_CAC_EVENT(wmip->wmi_devt, reply->ac,
++ reply->cac_indication, reply->statusCode,
++ reply->tspecSuggestion);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_hbChallengeResp_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMIX_HB_CHALLENGE_RESP_EVENT *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMIX_HB_CHALLENGE_RESP_EVENT *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "wmi: challenge response event\n", DBGARG));
++
++ A_WMI_HBCHALLENGERESP_EVENT(wmip->wmi_devt, reply->cookie, reply->source);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_roam_tbl_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_TARGET_ROAM_TBL *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_TARGET_ROAM_TBL *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_ROAM_TABLE_EVENT(wmip->wmi_devt, reply);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_roam_data_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_TARGET_ROAM_DATA *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_TARGET_ROAM_DATA *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_ROAM_DATA_EVENT(wmip->wmi_devt, reply);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_txRetryErrEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_TX_RETRY_ERR_EVENT *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_TX_RETRY_ERR_EVENT *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_TX_RETRY_ERR_EVENT(wmip->wmi_devt);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_snrThresholdEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_SNR_THRESHOLD_EVENT *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_SNR_THRESHOLD_EVENT *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_SNR_THRESHOLD_EVENT_RX(wmip->wmi_devt, reply->range, reply->snr);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_lqThresholdEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_LQ_THRESHOLD_EVENT *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_LQ_THRESHOLD_EVENT *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_LQ_THRESHOLD_EVENT_RX(wmip->wmi_devt, reply->range, reply->lq);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_aplistEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ A_UINT16 ap_info_entry_size;
++ WMI_APLIST_EVENT *ev = (WMI_APLIST_EVENT *)datap;
++ WMI_AP_INFO_V1 *ap_info_v1;
++ A_UINT8 i;
++
++ if (len < sizeof(WMI_APLIST_EVENT)) {
++ return A_EINVAL;
++ }
++
++ if (ev->apListVer == APLIST_VER1) {
++ ap_info_entry_size = sizeof(WMI_AP_INFO_V1);
++ ap_info_v1 = (WMI_AP_INFO_V1 *)ev->apList;
++ } else {
++ return A_EINVAL;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("Number of APs in APLIST Event is %d\n", ev->numAP));
++ if (len < (int)(sizeof(WMI_APLIST_EVENT) +
++ (ev->numAP - 1) * ap_info_entry_size))
++ {
++ return A_EINVAL;
++ }
++
++ /*
++ * AP List Ver1 Contents
++ */
++ for (i = 0; i < ev->numAP; i++) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("AP#%d BSSID %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x "\
++ "Channel %d\n", i,
++ ap_info_v1->bssid[0], ap_info_v1->bssid[1],
++ ap_info_v1->bssid[2], ap_info_v1->bssid[3],
++ ap_info_v1->bssid[4], ap_info_v1->bssid[5],
++ ap_info_v1->channel));
++ ap_info_v1++;
++ }
++ return A_OK;
++}
++
++static A_STATUS
++wmi_dbglog_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ A_UINT32 dropped;
++
++ dropped = *((A_UINT32 *)datap);
++ datap += sizeof(dropped);
++ len -= sizeof(dropped);
++ A_WMI_DBGLOG_EVENT(wmip->wmi_devt, dropped, datap, len);
++ return A_OK;
++}
++
++#ifdef CONFIG_HOST_GPIO_SUPPORT
++static A_STATUS
++wmi_gpio_intr_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMIX_GPIO_INTR_EVENT *gpio_intr = (WMIX_GPIO_INTR_EVENT *)datap;
++
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "Enter - intrmask=0x%x input=0x%x.\n", DBGARG,
++ gpio_intr->intr_mask, gpio_intr->input_values));
++
++ A_WMI_GPIO_INTR_RX(gpio_intr->intr_mask, gpio_intr->input_values);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_gpio_data_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMIX_GPIO_DATA_EVENT *gpio_data = (WMIX_GPIO_DATA_EVENT *)datap;
++
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "Enter - reg=%d value=0x%x\n", DBGARG,
++ gpio_data->reg_id, gpio_data->value));
++
++ A_WMI_GPIO_DATA_RX(gpio_data->reg_id, gpio_data->value);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_gpio_ack_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_GPIO_ACK_RX();
++
++ return A_OK;
++}
++#endif /* CONFIG_HOST_GPIO_SUPPORT */
++
++/*
++ * Called to send a wmi command. Command specific data is already built
++ * on osbuf and current osbuf->data points to it.
++ */
++A_STATUS
++wmi_cmd_send(struct wmi_t *wmip, void *osbuf, WMI_COMMAND_ID cmdId,
++ WMI_SYNC_FLAG syncflag)
++{
++#define IS_LONG_CMD(cmdId) ((cmdId == WMI_OPT_TX_FRAME_CMDID) || (cmdId == WMI_ADD_WOW_PATTERN_CMDID))
++ WMI_CMD_HDR *cHdr;
++ WMI_PRI_STREAM_ID streamID = WMI_CONTROL_PRI;
++
++ A_ASSERT(osbuf != NULL);
++
++ if (syncflag >= END_WMIFLAG) {
++ return A_EINVAL;
++ }
++
++ if ((syncflag == SYNC_BEFORE_WMIFLAG) || (syncflag == SYNC_BOTH_WMIFLAG)) {
++ /*
++ * We want to make sure all data currently queued is transmitted before
++ * the cmd execution. Establish a new sync point.
++ */
++ wmi_sync_point(wmip);
++ }
++
++ if (A_NETBUF_PUSH(osbuf, sizeof(WMI_CMD_HDR)) != A_OK) {
++ return A_NO_MEMORY;
++ }
++
++ cHdr = (WMI_CMD_HDR *)A_NETBUF_DATA(osbuf);
++ cHdr->commandId = cmdId;
++
++ /*
++ * Send cmd, some via control pipe, others via data pipe
++ */
++ if (IS_LONG_CMD(cmdId)) {
++ wmi_data_hdr_add(wmip, osbuf, CNTL_MSGTYPE);
++ // TODO ... these can now go through the control endpoint via HTC 2.0
++ streamID = WMI_BEST_EFFORT_PRI;
++ }
++ A_WMI_CONTROL_TX(wmip->wmi_devt, osbuf, streamID);
++
++ if ((syncflag == SYNC_AFTER_WMIFLAG) || (syncflag == SYNC_BOTH_WMIFLAG)) {
++ /*
++ * We want to make sure all new data queued waits for the command to
++ * execute. Establish a new sync point.
++ */
++ wmi_sync_point(wmip);
++ }
++ return (A_OK);
++#undef IS_LONG_CMD
++}
++
++A_STATUS
++wmi_cmd_send_xtnd(struct wmi_t *wmip, void *osbuf, WMI_COMMAND_ID cmdId,
++ WMI_SYNC_FLAG syncflag)
++{
++ WMIX_CMD_HDR *cHdr;
++
++ if (A_NETBUF_PUSH(osbuf, sizeof(WMIX_CMD_HDR)) != A_OK) {
++ return A_NO_MEMORY;
++ }
++
++ cHdr = (WMIX_CMD_HDR *)A_NETBUF_DATA(osbuf);
++ cHdr->commandId = cmdId;
++
++ return wmi_cmd_send(wmip, osbuf, WMI_EXTENSION_CMDID, syncflag);
++}
++
++A_STATUS
++wmi_connect_cmd(struct wmi_t *wmip, NETWORK_TYPE netType,
++ DOT11_AUTH_MODE dot11AuthMode, AUTH_MODE authMode,
++ CRYPTO_TYPE pairwiseCrypto, A_UINT8 pairwiseCryptoLen,
++ CRYPTO_TYPE groupCrypto,A_UINT8 groupCryptoLen,
++ int ssidLength, A_UCHAR *ssid,
++ A_UINT8 *bssid, A_UINT16 channel, A_UINT32 ctrl_flags)
++{
++ void *osbuf;
++ WMI_CONNECT_CMD *cc;
++
++ if ((pairwiseCrypto == NONE_CRYPT) && (groupCrypto != NONE_CRYPT)) {
++ return A_EINVAL;
++ }
++ if ((pairwiseCrypto != NONE_CRYPT) && (groupCrypto == NONE_CRYPT)) {
++ return A_EINVAL;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(WMI_CONNECT_CMD));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(WMI_CONNECT_CMD));
++
++ cc = (WMI_CONNECT_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cc, sizeof(*cc));
++
++ A_MEMCPY(cc->ssid, ssid, ssidLength);
++ cc->ssidLength = ssidLength;
++ cc->networkType = netType;
++ cc->dot11AuthMode = dot11AuthMode;
++ cc->authMode = authMode;
++ cc->pairwiseCryptoType = pairwiseCrypto;
++ cc->pairwiseCryptoLen = pairwiseCryptoLen;
++ cc->groupCryptoType = groupCrypto;
++ cc->groupCryptoLen = groupCryptoLen;
++ cc->channel = channel;
++ cc->ctrl_flags = ctrl_flags;
++
++ if (bssid != NULL) {
++ A_MEMCPY(cc->bssid, bssid, ATH_MAC_LEN);
++ }
++ if (wmi_set_keepalive_cmd(wmip, wmip->wmi_keepaliveInterval) != A_OK) {
++ return(A_ERROR);
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_CONNECT_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_reconnect_cmd(struct wmi_t *wmip, A_UINT8 *bssid, A_UINT16 channel)
++{
++ void *osbuf;
++ WMI_RECONNECT_CMD *cc;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(WMI_RECONNECT_CMD));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(WMI_RECONNECT_CMD));
++
++ cc = (WMI_RECONNECT_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cc, sizeof(*cc));
++
++ cc->channel = channel;
++
++ if (bssid != NULL) {
++ A_MEMCPY(cc->bssid, bssid, ATH_MAC_LEN);
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_RECONNECT_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_disconnect_cmd(struct wmi_t *wmip)
++{
++ void *osbuf;
++ A_STATUS status;
++
++ osbuf = A_NETBUF_ALLOC(0); /* no payload */
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ /* Bug fix for 24817(elevator bug) - the disconnect command does not
++ need to do a SYNC before.*/
++ status = (wmi_cmd_send(wmip, osbuf, WMI_DISCONNECT_CMDID,
++ NO_SYNC_WMIFLAG));
++
++ return status;
++}
++
++A_STATUS
++wmi_startscan_cmd(struct wmi_t *wmip, WMI_SCAN_TYPE scanType,
++ A_BOOL forceFgScan, A_BOOL isLegacy,
++ A_UINT32 homeDwellTime, A_UINT32 forceScanInterval)
++{
++ void *osbuf;
++ WMI_START_SCAN_CMD *sc;
++
++ if ((scanType != WMI_LONG_SCAN) && (scanType != WMI_SHORT_SCAN)) {
++ return A_EINVAL;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*sc));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*sc));
++
++ sc = (WMI_START_SCAN_CMD *)(A_NETBUF_DATA(osbuf));
++ sc->scanType = scanType;
++ sc->forceFgScan = forceFgScan;
++ sc->isLegacy = isLegacy;
++ sc->homeDwellTime = homeDwellTime;
++ sc->forceScanInterval = forceScanInterval;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_START_SCAN_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_scanparams_cmd(struct wmi_t *wmip, A_UINT16 fg_start_sec,
++ A_UINT16 fg_end_sec, A_UINT16 bg_sec,
++ A_UINT16 minact_chdw_msec, A_UINT16 maxact_chdw_msec,
++ A_UINT16 pas_chdw_msec,
++ A_UINT8 shScanRatio, A_UINT8 scanCtrlFlags,
++ A_UINT32 max_dfsch_act_time)
++{
++ void *osbuf;
++ WMI_SCAN_PARAMS_CMD *sc;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*sc));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*sc));
++
++ sc = (WMI_SCAN_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(sc, sizeof(*sc));
++ sc->fg_start_period = fg_start_sec;
++ sc->fg_end_period = fg_end_sec;
++ sc->bg_period = bg_sec;
++ sc->minact_chdwell_time = minact_chdw_msec;
++ sc->maxact_chdwell_time = maxact_chdw_msec;
++ sc->pas_chdwell_time = pas_chdw_msec;
++ sc->shortScanRatio = shScanRatio;
++ sc->scanCtrlFlags = scanCtrlFlags;
++ sc->max_dfsch_act_time = max_dfsch_act_time;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_SCAN_PARAMS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_bssfilter_cmd(struct wmi_t *wmip, A_UINT8 filter, A_UINT32 ieMask)
++{
++ void *osbuf;
++ WMI_BSS_FILTER_CMD *cmd;
++
++ if (filter >= LAST_BSS_FILTER) {
++ return A_EINVAL;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_BSS_FILTER_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->bssFilter = filter;
++ cmd->ieMask = ieMask;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_BSS_FILTER_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_probedSsid_cmd(struct wmi_t *wmip, A_UINT8 index, A_UINT8 flag,
++ A_UINT8 ssidLength, A_UCHAR *ssid)
++{
++ void *osbuf;
++ WMI_PROBED_SSID_CMD *cmd;
++
++ if (index > MAX_PROBED_SSID_INDEX) {
++ return A_EINVAL;
++ }
++ if (ssidLength > sizeof(cmd->ssid)) {
++ return A_EINVAL;
++ }
++ if ((flag & (DISABLE_SSID_FLAG | ANY_SSID_FLAG)) && (ssidLength > 0)) {
++ return A_EINVAL;
++ }
++ if ((flag & SPECIFIC_SSID_FLAG) && !ssidLength) {
++ return A_EINVAL;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_PROBED_SSID_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->entryIndex = index;
++ cmd->flag = flag;
++ cmd->ssidLength = ssidLength;
++ A_MEMCPY(cmd->ssid, ssid, ssidLength);
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_PROBED_SSID_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_listeninterval_cmd(struct wmi_t *wmip, A_UINT16 listenInterval, A_UINT16 listenBeacons)
++{
++ void *osbuf;
++ WMI_LISTEN_INT_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_LISTEN_INT_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->listenInterval = listenInterval;
++ cmd->numBeacons = listenBeacons;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_LISTEN_INT_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_bmisstime_cmd(struct wmi_t *wmip, A_UINT16 bmissTime, A_UINT16 bmissBeacons)
++{
++ void *osbuf;
++ WMI_BMISS_TIME_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_BMISS_TIME_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->bmissTime = bmissTime;
++ cmd->numBeacons = bmissBeacons;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_BMISS_TIME_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_associnfo_cmd(struct wmi_t *wmip, A_UINT8 ieType,
++ A_UINT8 ieLen, A_UINT8 *ieInfo)
++{
++ void *osbuf;
++ WMI_SET_ASSOC_INFO_CMD *cmd;
++ A_UINT16 cmdLen;
++
++ cmdLen = sizeof(*cmd) + ieLen - 1;
++ osbuf = A_NETBUF_ALLOC(cmdLen);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, cmdLen);
++
++ cmd = (WMI_SET_ASSOC_INFO_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, cmdLen);
++ cmd->ieType = ieType;
++ cmd->bufferSize = ieLen;
++ A_MEMCPY(cmd->assocInfo, ieInfo, ieLen);
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_ASSOC_INFO_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_powermode_cmd(struct wmi_t *wmip, A_UINT8 powerMode)
++{
++ void *osbuf;
++ WMI_POWER_MODE_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_POWER_MODE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->powerMode = powerMode;
++ wmip->wmi_powerMode = powerMode;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_POWER_MODE_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_ibsspmcaps_cmd(struct wmi_t *wmip, A_UINT8 pmEnable, A_UINT8 ttl,
++ A_UINT16 atim_windows, A_UINT16 timeout_value)
++{
++ void *osbuf;
++ WMI_IBSS_PM_CAPS_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_IBSS_PM_CAPS_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->power_saving = pmEnable;
++ cmd->ttl = ttl;
++ cmd->atim_windows = atim_windows;
++ cmd->timeout_value = timeout_value;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_IBSS_PM_CAPS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_pmparams_cmd(struct wmi_t *wmip, A_UINT16 idlePeriod,
++ A_UINT16 psPollNum, A_UINT16 dtimPolicy)
++{
++ void *osbuf;
++ WMI_POWER_PARAMS_CMD *pm;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*pm));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*pm));
++
++ pm = (WMI_POWER_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(pm, sizeof(*pm));
++ pm->idle_period = idlePeriod;
++ pm->pspoll_number = psPollNum;
++ pm->dtim_policy = dtimPolicy;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_POWER_PARAMS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_disctimeout_cmd(struct wmi_t *wmip, A_UINT8 timeout)
++{
++ void *osbuf;
++ WMI_DISC_TIMEOUT_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_DISC_TIMEOUT_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->disconnectTimeout = timeout;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_DISC_TIMEOUT_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_addKey_cmd(struct wmi_t *wmip, A_UINT8 keyIndex, CRYPTO_TYPE keyType,
++ A_UINT8 keyUsage, A_UINT8 keyLength, A_UINT8 *keyRSC,
++ A_UINT8 *keyMaterial, A_UINT8 key_op_ctrl,
++ WMI_SYNC_FLAG sync_flag)
++{
++ void *osbuf;
++ WMI_ADD_CIPHER_KEY_CMD *cmd;
++
++ if ((keyIndex > WMI_MAX_KEY_INDEX) || (keyLength > WMI_MAX_KEY_LEN) ||
++ (keyMaterial == NULL))
++ {
++ return A_EINVAL;
++ }
++
++ if ((WEP_CRYPT != keyType) && (NULL == keyRSC)) {
++ return A_EINVAL;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_ADD_CIPHER_KEY_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->keyIndex = keyIndex;
++ cmd->keyType = keyType;
++ cmd->keyUsage = keyUsage;
++ cmd->keyLength = keyLength;
++ A_MEMCPY(cmd->key, keyMaterial, keyLength);
++ if (NULL != keyRSC) {
++ A_MEMCPY(cmd->keyRSC, keyRSC, sizeof(cmd->keyRSC));
++ }
++ cmd->key_op_ctrl = key_op_ctrl;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_ADD_CIPHER_KEY_CMDID, sync_flag));
++}
++
++A_STATUS
++wmi_add_krk_cmd(struct wmi_t *wmip, A_UINT8 *krk)
++{
++ void *osbuf;
++ WMI_ADD_KRK_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_ADD_KRK_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ A_MEMCPY(cmd->krk, krk, WMI_KRK_LEN);
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_ADD_KRK_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_delete_krk_cmd(struct wmi_t *wmip)
++{
++ void *osbuf;
++
++ osbuf = A_NETBUF_ALLOC(0);
++
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_DELETE_KRK_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_deleteKey_cmd(struct wmi_t *wmip, A_UINT8 keyIndex)
++{
++ void *osbuf;
++ WMI_DELETE_CIPHER_KEY_CMD *cmd;
++
++ if (keyIndex > WMI_MAX_KEY_INDEX) {
++ return A_EINVAL;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_DELETE_CIPHER_KEY_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->keyIndex = keyIndex;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_DELETE_CIPHER_KEY_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_setPmkid_cmd(struct wmi_t *wmip, A_UINT8 *bssid, A_UINT8 *pmkId,
++ A_BOOL set)
++{
++ void *osbuf;
++ WMI_SET_PMKID_CMD *cmd;
++
++ if (bssid == NULL) {
++ return A_EINVAL;
++ }
++
++ if ((set == TRUE) && (pmkId == NULL)) {
++ return A_EINVAL;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_PMKID_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMCPY(cmd->bssid, bssid, sizeof(cmd->bssid));
++ if (set == TRUE) {
++ A_MEMCPY(cmd->pmkid, pmkId, sizeof(cmd->pmkid));
++ cmd->enable = PMKID_ENABLE;
++ } else {
++ A_MEMZERO(cmd->pmkid, sizeof(cmd->pmkid));
++ cmd->enable = PMKID_DISABLE;
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_PMKID_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_tkip_countermeasures_cmd(struct wmi_t *wmip, A_BOOL en)
++{
++ void *osbuf;
++ WMI_SET_TKIP_COUNTERMEASURES_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_TKIP_COUNTERMEASURES_CMD *)(A_NETBUF_DATA(osbuf));
++ cmd->cm_en = (en == TRUE)? WMI_TKIP_CM_ENABLE : WMI_TKIP_CM_DISABLE;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_TKIP_COUNTERMEASURES_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_akmp_params_cmd(struct wmi_t *wmip,
++ WMI_SET_AKMP_PARAMS_CMD *akmpParams)
++{
++ void *osbuf;
++ WMI_SET_AKMP_PARAMS_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++ cmd = (WMI_SET_AKMP_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
++ cmd->akmpInfo = akmpParams->akmpInfo;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_AKMP_PARAMS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_pmkid_list_cmd(struct wmi_t *wmip,
++ WMI_SET_PMKID_LIST_CMD *pmkInfo)
++{
++ void *osbuf;
++ WMI_SET_PMKID_LIST_CMD *cmd;
++ A_UINT16 cmdLen;
++ A_UINT8 i;
++
++ cmdLen = sizeof(pmkInfo->numPMKID) +
++ pmkInfo->numPMKID * sizeof(WMI_PMKID);
++
++ osbuf = A_NETBUF_ALLOC(cmdLen);
++
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, cmdLen);
++ cmd = (WMI_SET_PMKID_LIST_CMD *)(A_NETBUF_DATA(osbuf));
++ cmd->numPMKID = pmkInfo->numPMKID;
++
++ for (i = 0; i < cmd->numPMKID; i++) {
++ A_MEMCPY(&cmd->pmkidList[i], &pmkInfo->pmkidList[i],
++ WMI_PMKID_LEN);
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_PMKID_LIST_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_get_pmkid_list_cmd(struct wmi_t *wmip)
++{
++ void *osbuf;
++
++ osbuf = A_NETBUF_ALLOC(0); /* no payload */
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_GET_PMKID_LIST_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_dataSync_send(struct wmi_t *wmip, void *osbuf, WMI_PRI_STREAM_ID streamID)
++{
++ WMI_DATA_HDR *dtHdr;
++
++ A_ASSERT(streamID != WMI_CONTROL_PRI);
++ A_ASSERT(osbuf != NULL);
++
++ if (A_NETBUF_PUSH(osbuf, sizeof(WMI_DATA_HDR)) != A_OK) {
++ return A_NO_MEMORY;
++ }
++
++ dtHdr = (WMI_DATA_HDR *)A_NETBUF_DATA(osbuf);
++ dtHdr->info =
++ (SYNC_MSGTYPE & WMI_DATA_HDR_MSG_TYPE_MASK) << WMI_DATA_HDR_MSG_TYPE_SHIFT;
++
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter - streamID %d\n", DBGARG, streamID));
++
++ return (A_WMI_CONTROL_TX(wmip->wmi_devt, osbuf, streamID));
++}
++
++typedef struct _WMI_DATA_SYNC_BUFS {
++ A_UINT8 trafficClass;
++ void *osbuf;
++}WMI_DATA_SYNC_BUFS;
++
++static A_STATUS
++wmi_sync_point(struct wmi_t *wmip)
++{
++ void *cmd_osbuf;
++ WMI_DATA_SYNC_BUFS dataSyncBufs[WMM_NUM_AC];
++ A_UINT8 i,numPriStreams=0;
++ A_STATUS status;
++
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ memset(dataSyncBufs,0,sizeof(dataSyncBufs));
++
++ /* lock out while we walk through the priority list and assemble our local array */
++ LOCK_WMI(wmip);
++
++ for (i=0; i < WMM_NUM_AC ; i++) {
++ if (wmip->wmi_fatPipeExists & (1 << i)) {
++ numPriStreams++;
++ dataSyncBufs[numPriStreams-1].trafficClass = i;
++ }
++ }
++
++ UNLOCK_WMI(wmip);
++
++ /* dataSyncBufs is now filled with entries (starting at index 0) containing valid streamIDs */
++
++ do {
++ /*
++ * We allocate all network buffers needed so we will be able to
++ * send all required frames.
++ */
++ cmd_osbuf = A_NETBUF_ALLOC(0); /* no payload */
++ if (cmd_osbuf == NULL) {
++ status = A_NO_MEMORY;
++ break;
++ }
++
++ for (i=0; i < numPriStreams ; i++) {
++ dataSyncBufs[i].osbuf = A_NETBUF_ALLOC(0);
++ if (dataSyncBufs[i].osbuf == NULL) {
++ status = A_NO_MEMORY;
++ break;
++ }
++ } //end for
++
++ /*
++ * Send sync cmd followed by sync data messages on all endpoints being
++ * used
++ */
++ status = wmi_cmd_send(wmip, cmd_osbuf, WMI_SYNCHRONIZE_CMDID,
++ NO_SYNC_WMIFLAG);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++ /* cmd buffer sent, we no longer own it */
++ cmd_osbuf = NULL;
++
++ for(i=0; i < numPriStreams; i++) {
++ A_ASSERT(dataSyncBufs[i].osbuf != NULL);
++
++ status = wmi_dataSync_send(wmip, dataSyncBufs[i].osbuf,
++ WMI_ACCESSCATEGORY_WMISTREAM(wmip,dataSyncBufs[i].trafficClass));
++
++ if (A_FAILED(status)) {
++ break;
++ }
++ /* we don't own this buffer anymore, NULL it out of the array so it
++ * won't get cleaned up */
++ dataSyncBufs[i].osbuf = NULL;
++ } //end for
++
++ } while(FALSE);
++
++ /* free up any resources left over (possibly due to an error) */
++
++ if (cmd_osbuf != NULL) {
++ A_NETBUF_FREE(cmd_osbuf);
++ }
++
++ for (i = 0; i < numPriStreams; i++) {
++ if (dataSyncBufs[i].osbuf != NULL) {
++ A_NETBUF_FREE(dataSyncBufs[i].osbuf);
++ }
++ }
++
++ return (status);
++}
++
++A_STATUS
++wmi_create_pstream_cmd(struct wmi_t *wmip, WMI_CREATE_PSTREAM_CMD *params)
++{
++ void *osbuf;
++ WMI_CREATE_PSTREAM_CMD *cmd;
++ A_UINT16 activeTsids=0;
++ A_UINT8 fatPipeExistsForAC=0;
++
++ /* Validate all the parameters. */
++ if( !((params->userPriority < 8) &&
++ (params->userPriority <= 0x7) &&
++ (convert_userPriority_to_trafficClass(params->userPriority) == params->trafficClass) &&
++ (params->trafficDirection == UPLINK_TRAFFIC ||
++ params->trafficDirection == DNLINK_TRAFFIC ||
++ params->trafficDirection == BIDIR_TRAFFIC) &&
++ (params->trafficType == TRAFFIC_TYPE_APERIODIC ||
++ params->trafficType == TRAFFIC_TYPE_PERIODIC ) &&
++ (params->voicePSCapability == DISABLE_FOR_THIS_AC ||
++ params->voicePSCapability == ENABLE_FOR_THIS_AC ||
++ params->voicePSCapability == ENABLE_FOR_ALL_AC) &&
++ (params->tsid == WMI_IMPLICIT_PSTREAM || params->tsid <= WMI_MAX_THINSTREAM)) )
++ {
++ return A_EINVAL;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "Sending create_pstream_cmd: ac=%d tsid:%d\n", DBGARG,
++ params->trafficClass, params->tsid));
++
++ cmd = (WMI_CREATE_PSTREAM_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ A_MEMCPY(cmd, params, sizeof(*cmd));
++
++ /* this is an implicitly created Fat pipe */
++ if (params->tsid == WMI_IMPLICIT_PSTREAM) {
++ LOCK_WMI(wmip);
++ fatPipeExistsForAC = (wmip->wmi_fatPipeExists & (1 << params->trafficClass));
++ wmip->wmi_fatPipeExists |= (1<<params->trafficClass);
++ UNLOCK_WMI(wmip);
++ } else {
++ /* this is an explicitly created thin stream within a fat pipe */
++ LOCK_WMI(wmip);
++ fatPipeExistsForAC = (wmip->wmi_fatPipeExists & (1 << params->trafficClass));
++ activeTsids = wmip->wmi_streamExistsForAC[params->trafficClass];
++ wmip->wmi_streamExistsForAC[params->trafficClass] |= (1<<params->tsid);
++ /* if a thinstream becomes active, the fat pipe automatically
++ * becomes active
++ */
++ wmip->wmi_fatPipeExists |= (1<<params->trafficClass);
++ UNLOCK_WMI(wmip);
++ }
++
++ /* Indicate activty change to driver layer only if this is the
++ * first TSID to get created in this AC explicitly or an implicit
++ * fat pipe is getting created.
++ */
++ if (!fatPipeExistsForAC) {
++ A_WMI_STREAM_TX_ACTIVE(wmip->wmi_devt, params->trafficClass);
++ }
++
++ /* mike: should be SYNC_BEFORE_WMIFLAG */
++ return (wmi_cmd_send(wmip, osbuf, WMI_CREATE_PSTREAM_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_delete_pstream_cmd(struct wmi_t *wmip, A_UINT8 trafficClass, A_UINT8 tsid)
++{
++ void *osbuf;
++ WMI_DELETE_PSTREAM_CMD *cmd;
++ A_STATUS status;
++ A_UINT16 activeTsids=0;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_DELETE_PSTREAM_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++
++ cmd->trafficClass = trafficClass;
++ cmd->tsid = tsid;
++
++ LOCK_WMI(wmip);
++ activeTsids = wmip->wmi_streamExistsForAC[trafficClass];
++ UNLOCK_WMI(wmip);
++
++ /* Check if the tsid was created & exists */
++ if (!(activeTsids & (1<<tsid))) {
++
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "TSID %d does'nt exist for trafficClass: %d\n", DBGARG, tsid, trafficClass));
++ /* TODO: return a more appropriate err code */
++ return A_ERROR;
++ }
++
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "Sending delete_pstream_cmd: trafficClass: %d tsid=%d\n", DBGARG, trafficClass, tsid));
++
++ status = (wmi_cmd_send(wmip, osbuf, WMI_DELETE_PSTREAM_CMDID,
++ SYNC_BEFORE_WMIFLAG));
++
++ LOCK_WMI(wmip);
++ wmip->wmi_streamExistsForAC[trafficClass] &= ~(1<<tsid);
++ activeTsids = wmip->wmi_streamExistsForAC[trafficClass];
++ UNLOCK_WMI(wmip);
++
++
++ /* Indicate stream inactivity to driver layer only if all tsids
++ * within this AC are deleted.
++ */
++ if(!activeTsids) {
++ A_WMI_STREAM_TX_INACTIVE(wmip->wmi_devt, trafficClass);
++ wmip->wmi_fatPipeExists &= ~(1<<trafficClass);
++ }
++
++ return status;
++}
++
++/*
++ * used to set the bit rate. rate is in Kbps. If rate == -1
++ * then auto selection is used.
++ */
++A_STATUS
++wmi_set_bitrate_cmd(struct wmi_t *wmip, A_INT32 rate)
++{
++ void *osbuf;
++ WMI_BIT_RATE_CMD *cmd;
++ A_INT8 index;
++
++ if (rate != -1) {
++ index = wmi_validate_bitrate(wmip, rate);
++ if(index == A_EINVAL){
++ return A_EINVAL;
++ }
++ } else {
++ index = -1;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_BIT_RATE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++
++ cmd->rateIndex = index;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_BITRATE_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_get_bitrate_cmd(struct wmi_t *wmip)
++{
++ void *osbuf;
++
++ osbuf = A_NETBUF_ALLOC(0); /* no payload */
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_GET_BITRATE_CMDID, NO_SYNC_WMIFLAG));
++}
++
++/*
++ * Returns TRUE iff the given rate index is legal in the current PHY mode.
++ */
++A_BOOL
++wmi_is_bitrate_index_valid(struct wmi_t *wmip, A_UINT32 rateIndex)
++{
++ WMI_PHY_MODE phyMode = wmip->wmi_phyMode;
++ A_BOOL isValid = TRUE;
++ switch(phyMode) {
++ case WMI_11A_MODE:
++ if ((rateIndex < MODE_A_SUPPORT_RATE_START) || (rateIndex > MODE_A_SUPPORT_RATE_STOP)) {
++ isValid = FALSE;
++ }
++ break;
++
++ case WMI_11B_MODE:
++ if ((rateIndex < MODE_B_SUPPORT_RATE_START) || (rateIndex > MODE_B_SUPPORT_RATE_STOP)) {
++ isValid = FALSE;
++ }
++ break;
++
++ case WMI_11GONLY_MODE:
++ if ((rateIndex < MODE_GONLY_SUPPORT_RATE_START) || (rateIndex > MODE_GONLY_SUPPORT_RATE_STOP)) {
++ isValid = FALSE;
++ }
++ break;
++
++ case WMI_11G_MODE:
++ case WMI_11AG_MODE:
++ if ((rateIndex < MODE_G_SUPPORT_RATE_START) || (rateIndex > MODE_G_SUPPORT_RATE_STOP)) {
++ isValid = FALSE;
++ }
++ break;
++
++ default:
++ A_ASSERT(FALSE);
++ break;
++ }
++
++ return isValid;
++}
++
++A_INT8
++wmi_validate_bitrate(struct wmi_t *wmip, A_INT32 rate)
++{
++ A_INT8 i;
++ if (rate != -1)
++ {
++ for (i=0;;i++)
++ {
++ if (wmi_rateTable[(A_UINT32) i] == 0) {
++ return A_EINVAL;
++ }
++ if (wmi_rateTable[(A_UINT32) i] == rate) {
++ break;
++ }
++ }
++ }
++ else{
++ i = -1;
++ }
++
++ if(wmi_is_bitrate_index_valid(wmip, i) != TRUE) {
++ return A_EINVAL;
++ }
++
++ return i;
++}
++
++A_STATUS
++wmi_set_fixrates_cmd(struct wmi_t *wmip, A_INT16 fixRatesMask)
++{
++ void *osbuf;
++ WMI_FIX_RATES_CMD *cmd;
++ A_UINT32 rateIndex;
++
++ /* Make sure all rates in the mask are valid in the current PHY mode */
++ for(rateIndex = 0; rateIndex < MAX_NUMBER_OF_SUPPORT_RATES; rateIndex++) {
++ if((1 << rateIndex) & (A_UINT32)fixRatesMask) {
++ if(wmi_is_bitrate_index_valid(wmip, rateIndex) != TRUE) {
++ A_DPRINTF(DBG_WMI, (DBGFMT "Set Fix Rates command failed: Given rate is illegal in current PHY mode\n", DBGARG));
++ return A_EINVAL;
++ }
++ }
++ }
++
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_FIX_RATES_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++
++ cmd->fixRateMask = fixRatesMask;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_FIXRATES_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_get_ratemask_cmd(struct wmi_t *wmip)
++{
++ void *osbuf;
++
++ osbuf = A_NETBUF_ALLOC(0); /* no payload */
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_GET_FIXRATES_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_get_channelList_cmd(struct wmi_t *wmip)
++{
++ void *osbuf;
++
++ osbuf = A_NETBUF_ALLOC(0); /* no payload */
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_GET_CHANNEL_LIST_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++/*
++ * used to generate a wmi sey channel Parameters cmd.
++ * mode should always be specified and corresponds to the phy mode of the
++ * wlan.
++ * numChan should alway sbe specified. If zero indicates that all available
++ * channels should be used.
++ * channelList is an array of channel frequencies (in Mhz) which the radio
++ * should limit its operation to. It should be NULL if numChan == 0. Size of
++ * array should correspond to numChan entries.
++ */
++A_STATUS
++wmi_set_channelParams_cmd(struct wmi_t *wmip, A_UINT8 scanParam,
++ WMI_PHY_MODE mode, A_INT8 numChan,
++ A_UINT16 *channelList)
++{
++ void *osbuf;
++ WMI_CHANNEL_PARAMS_CMD *cmd;
++ A_INT8 size;
++
++ size = sizeof (*cmd);
++
++ if (numChan) {
++ if (numChan > WMI_MAX_CHANNELS) {
++ return A_EINVAL;
++ }
++ size += sizeof(A_UINT16) * (numChan - 1);
++ }
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_CHANNEL_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, size);
++
++ wmip->wmi_phyMode = mode;
++ cmd->scanParam = scanParam;
++ cmd->phyMode = mode;
++ cmd->numChannels = numChan;
++ A_MEMCPY(cmd->channelList, channelList, numChan * sizeof(A_UINT16));
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_CHANNEL_PARAMS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_rssi_threshold_params(struct wmi_t *wmip,
++ WMI_RSSI_THRESHOLD_PARAMS_CMD *rssiCmd)
++{
++ void *osbuf;
++ A_INT8 size;
++ WMI_RSSI_THRESHOLD_PARAMS_CMD *cmd;
++ /* These values are in ascending order */
++ if( rssiCmd->thresholdAbove6_Val <= rssiCmd->thresholdAbove5_Val ||
++ rssiCmd->thresholdAbove5_Val <= rssiCmd->thresholdAbove4_Val ||
++ rssiCmd->thresholdAbove4_Val <= rssiCmd->thresholdAbove3_Val ||
++ rssiCmd->thresholdAbove3_Val <= rssiCmd->thresholdAbove2_Val ||
++ rssiCmd->thresholdAbove2_Val <= rssiCmd->thresholdAbove1_Val ||
++ rssiCmd->thresholdBelow6_Val <= rssiCmd->thresholdBelow5_Val ||
++ rssiCmd->thresholdBelow5_Val <= rssiCmd->thresholdBelow4_Val ||
++ rssiCmd->thresholdBelow4_Val <= rssiCmd->thresholdBelow3_Val ||
++ rssiCmd->thresholdBelow3_Val <= rssiCmd->thresholdBelow2_Val ||
++ rssiCmd->thresholdBelow2_Val <= rssiCmd->thresholdBelow1_Val) {
++
++ return A_EINVAL;
++ }
++
++ size = sizeof (*cmd);
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_RSSI_THRESHOLD_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, size);
++ A_MEMCPY(cmd, rssiCmd, sizeof(WMI_RSSI_THRESHOLD_PARAMS_CMD));
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_RSSI_THRESHOLD_PARAMS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_host_sleep_mode_cmd(struct wmi_t *wmip,
++ WMI_SET_HOST_SLEEP_MODE_CMD *hostModeCmd)
++{
++ void *osbuf;
++ A_INT8 size;
++ WMI_SET_HOST_SLEEP_MODE_CMD *cmd;
++
++ if( hostModeCmd->awake == hostModeCmd->asleep) {
++ return A_EINVAL;
++ }
++
++ size = sizeof (*cmd);
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_SET_HOST_SLEEP_MODE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, size);
++ A_MEMCPY(cmd, hostModeCmd, sizeof(WMI_SET_HOST_SLEEP_MODE_CMD));
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_HOST_SLEEP_MODE_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_wow_mode_cmd(struct wmi_t *wmip,
++ WMI_SET_WOW_MODE_CMD *wowModeCmd)
++{
++ void *osbuf;
++ A_INT8 size;
++ WMI_SET_WOW_MODE_CMD *cmd;
++
++ size = sizeof (*cmd);
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_SET_WOW_MODE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, size);
++ A_MEMCPY(cmd, wowModeCmd, sizeof(WMI_SET_WOW_MODE_CMD));
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_WOW_MODE_CMDID,
++ NO_SYNC_WMIFLAG));
++
++}
++
++A_STATUS
++wmi_get_wow_list_cmd(struct wmi_t *wmip,
++ WMI_GET_WOW_LIST_CMD *wowListCmd)
++{
++ void *osbuf;
++ A_INT8 size;
++ WMI_GET_WOW_LIST_CMD *cmd;
++
++ size = sizeof (*cmd);
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_GET_WOW_LIST_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, size);
++ A_MEMCPY(cmd, wowListCmd, sizeof(WMI_GET_WOW_LIST_CMD));
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_GET_WOW_LIST_CMDID,
++ NO_SYNC_WMIFLAG));
++
++}
++
++static A_STATUS
++wmi_get_wow_list_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_GET_WOW_LIST_REPLY *reply;
++
++ if (len < sizeof(WMI_GET_WOW_LIST_REPLY)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_GET_WOW_LIST_REPLY *)datap;
++
++ A_WMI_WOW_LIST_EVENT(wmip->wmi_devt, reply->num_filters,
++ reply);
++
++ return A_OK;
++}
++
++A_STATUS wmi_add_wow_pattern_cmd(struct wmi_t *wmip,
++ WMI_ADD_WOW_PATTERN_CMD *addWowCmd,
++ A_UINT8* pattern, A_UINT8* mask,
++ A_UINT8 pattern_size)
++{
++ void *osbuf;
++ A_INT8 size;
++ WMI_ADD_WOW_PATTERN_CMD *cmd;
++ A_UINT8 *filter_mask = NULL;
++
++ size = sizeof (*cmd);
++
++ size += ((2 * addWowCmd->filter_size)* sizeof(A_UINT8));
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_ADD_WOW_PATTERN_CMD *)(A_NETBUF_DATA(osbuf));
++ cmd->filter_list_id = addWowCmd->filter_list_id;
++ cmd->filter_offset = addWowCmd->filter_offset;
++ cmd->filter_size = addWowCmd->filter_size;
++
++ A_MEMCPY(cmd->filter, pattern, addWowCmd->filter_size);
++
++ filter_mask = (A_UINT8*)(cmd->filter + cmd->filter_size);
++ A_MEMCPY(filter_mask, mask, addWowCmd->filter_size);
++
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_ADD_WOW_PATTERN_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_del_wow_pattern_cmd(struct wmi_t *wmip,
++ WMI_DEL_WOW_PATTERN_CMD *delWowCmd)
++{
++ void *osbuf;
++ A_INT8 size;
++ WMI_DEL_WOW_PATTERN_CMD *cmd;
++
++ size = sizeof (*cmd);
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_DEL_WOW_PATTERN_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, size);
++ A_MEMCPY(cmd, delWowCmd, sizeof(WMI_DEL_WOW_PATTERN_CMD));
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_DEL_WOW_PATTERN_CMDID,
++ NO_SYNC_WMIFLAG));
++
++}
++
++A_STATUS
++wmi_set_snr_threshold_params(struct wmi_t *wmip,
++ WMI_SNR_THRESHOLD_PARAMS_CMD *snrCmd)
++{
++ void *osbuf;
++ A_INT8 size;
++ WMI_SNR_THRESHOLD_PARAMS_CMD *cmd;
++ /* These values are in ascending order */
++ if( snrCmd->thresholdAbove4_Val <= snrCmd->thresholdAbove3_Val ||
++ snrCmd->thresholdAbove3_Val <= snrCmd->thresholdAbove2_Val ||
++ snrCmd->thresholdAbove2_Val <= snrCmd->thresholdAbove1_Val ||
++ snrCmd->thresholdBelow4_Val <= snrCmd->thresholdBelow3_Val ||
++ snrCmd->thresholdBelow3_Val <= snrCmd->thresholdBelow2_Val ||
++ snrCmd->thresholdBelow2_Val <= snrCmd->thresholdBelow1_Val) {
++
++ return A_EINVAL;
++ }
++
++ size = sizeof (*cmd);
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_SNR_THRESHOLD_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, size);
++ A_MEMCPY(cmd, snrCmd, sizeof(WMI_SNR_THRESHOLD_PARAMS_CMD));
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SNR_THRESHOLD_PARAMS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_clr_rssi_snr(struct wmi_t *wmip)
++{
++ void *osbuf;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(int));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_CLR_RSSI_SNR_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_lq_threshold_params(struct wmi_t *wmip,
++ WMI_LQ_THRESHOLD_PARAMS_CMD *lqCmd)
++{
++ void *osbuf;
++ A_INT8 size;
++ WMI_LQ_THRESHOLD_PARAMS_CMD *cmd;
++ /* These values are in ascending order */
++ if( lqCmd->thresholdAbove4_Val <= lqCmd->thresholdAbove3_Val ||
++ lqCmd->thresholdAbove3_Val <= lqCmd->thresholdAbove2_Val ||
++ lqCmd->thresholdAbove2_Val <= lqCmd->thresholdAbove1_Val ||
++ lqCmd->thresholdBelow4_Val <= lqCmd->thresholdBelow3_Val ||
++ lqCmd->thresholdBelow3_Val <= lqCmd->thresholdBelow2_Val ||
++ lqCmd->thresholdBelow2_Val <= lqCmd->thresholdBelow1_Val ) {
++
++ return A_EINVAL;
++ }
++
++ size = sizeof (*cmd);
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_LQ_THRESHOLD_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, size);
++ A_MEMCPY(cmd, lqCmd, sizeof(WMI_LQ_THRESHOLD_PARAMS_CMD));
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_LQ_THRESHOLD_PARAMS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_error_report_bitmask(struct wmi_t *wmip, A_UINT32 mask)
++{
++ void *osbuf;
++ A_INT8 size;
++ WMI_TARGET_ERROR_REPORT_BITMASK *cmd;
++
++ size = sizeof (*cmd);
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_TARGET_ERROR_REPORT_BITMASK *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, size);
++
++ cmd->bitmask = mask;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_TARGET_ERROR_REPORT_BITMASK_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_get_challenge_resp_cmd(struct wmi_t *wmip, A_UINT32 cookie, A_UINT32 source)
++{
++ void *osbuf;
++ WMIX_HB_CHALLENGE_RESP_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMIX_HB_CHALLENGE_RESP_CMD *)(A_NETBUF_DATA(osbuf));
++ cmd->cookie = cookie;
++ cmd->source = source;
++
++ return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_HB_CHALLENGE_RESP_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_config_debug_module_cmd(struct wmi_t *wmip, A_UINT16 mmask,
++ A_UINT16 tsr, A_BOOL rep, A_UINT16 size,
++ A_UINT32 valid)
++{
++ void *osbuf;
++ WMIX_DBGLOG_CFG_MODULE_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMIX_DBGLOG_CFG_MODULE_CMD *)(A_NETBUF_DATA(osbuf));
++ cmd->config.cfgmmask = mmask;
++ cmd->config.cfgtsr = tsr;
++ cmd->config.cfgrep = rep;
++ cmd->config.cfgsize = size;
++ cmd->config.cfgvalid = valid;
++
++ return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_DBGLOG_CFG_MODULE_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_get_stats_cmd(struct wmi_t *wmip)
++{
++ void *osbuf;
++
++ osbuf = A_NETBUF_ALLOC(0); /* no payload */
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_GET_STATISTICS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_addBadAp_cmd(struct wmi_t *wmip, A_UINT8 apIndex, A_UINT8 *bssid)
++{
++ void *osbuf;
++ WMI_ADD_BAD_AP_CMD *cmd;
++
++ if ((bssid == NULL) || (apIndex > WMI_MAX_BAD_AP_INDEX)) {
++ return A_EINVAL;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_ADD_BAD_AP_CMD *)(A_NETBUF_DATA(osbuf));
++ cmd->badApIndex = apIndex;
++ A_MEMCPY(cmd->bssid, bssid, sizeof(cmd->bssid));
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_ADD_BAD_AP_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_deleteBadAp_cmd(struct wmi_t *wmip, A_UINT8 apIndex)
++{
++ void *osbuf;
++ WMI_DELETE_BAD_AP_CMD *cmd;
++
++ if (apIndex > WMI_MAX_BAD_AP_INDEX) {
++ return A_EINVAL;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_DELETE_BAD_AP_CMD *)(A_NETBUF_DATA(osbuf));
++ cmd->badApIndex = apIndex;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_DELETE_BAD_AP_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_txPwr_cmd(struct wmi_t *wmip, A_UINT8 dbM)
++{
++ void *osbuf;
++ WMI_SET_TX_PWR_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_TX_PWR_CMD *)(A_NETBUF_DATA(osbuf));
++ cmd->dbM = dbM;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_TX_PWR_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_get_txPwr_cmd(struct wmi_t *wmip)
++{
++ void *osbuf;
++
++ osbuf = A_NETBUF_ALLOC(0); /* no payload */
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_GET_TX_PWR_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_switch_radio(struct wmi_t *wmip, A_UINT8 on)
++{
++ WMI_SCAN_PARAMS_CMD scParams = {0, 0, 0, 0, 0,
++ WMI_SHORTSCANRATIO_DEFAULT,
++ DEFAULT_SCAN_CTRL_FLAGS,
++ 0};
++
++ if (on) {
++ /* Enable foreground scanning */
++ if (wmi_scanparams_cmd(wmip, scParams.fg_start_period,
++ scParams.fg_end_period,
++ scParams.bg_period,
++ scParams.minact_chdwell_time,
++ scParams.maxact_chdwell_time,
++ scParams.pas_chdwell_time,
++ scParams.shortScanRatio,
++ scParams.scanCtrlFlags,
++ scParams.max_dfsch_act_time) != A_OK) {
++ return -EIO;
++ }
++ } else {
++ wmi_disconnect_cmd(wmip);
++ if (wmi_scanparams_cmd(wmip, 0xFFFF, 0, 0, 0,
++ 0, 0, 0, 0xFF, 0) != A_OK) {
++ return -EIO;
++ }
++ }
++
++ return A_OK;
++}
++
++
++A_UINT16
++wmi_get_mapped_qos_queue(struct wmi_t *wmip, A_UINT8 trafficClass)
++{
++ A_UINT16 activeTsids=0;
++
++ LOCK_WMI(wmip);
++ activeTsids = wmip->wmi_streamExistsForAC[trafficClass];
++ UNLOCK_WMI(wmip);
++
++ return activeTsids;
++}
++
++A_STATUS
++wmi_get_roam_tbl_cmd(struct wmi_t *wmip)
++{
++ void *osbuf;
++
++ osbuf = A_NETBUF_ALLOC(0); /* no payload */
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_GET_ROAM_TBL_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_get_roam_data_cmd(struct wmi_t *wmip, A_UINT8 roamDataType)
++{
++ void *osbuf;
++ A_UINT32 size = sizeof(A_UINT8);
++ WMI_TARGET_ROAM_DATA *cmd;
++
++ osbuf = A_NETBUF_ALLOC(size); /* no payload */
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_TARGET_ROAM_DATA *)(A_NETBUF_DATA(osbuf));
++ cmd->roamDataType = roamDataType;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_GET_ROAM_DATA_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_roam_ctrl_cmd(struct wmi_t *wmip, WMI_SET_ROAM_CTRL_CMD *p,
++ A_UINT8 size)
++{
++ void *osbuf;
++ WMI_SET_ROAM_CTRL_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_SET_ROAM_CTRL_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, size);
++
++ A_MEMCPY(cmd, p, size);
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_ROAM_CTRL_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_powersave_timers_cmd(struct wmi_t *wmip,
++ WMI_POWERSAVE_TIMERS_POLICY_CMD *pCmd,
++ A_UINT8 size)
++{
++ void *osbuf;
++ WMI_POWERSAVE_TIMERS_POLICY_CMD *cmd;
++
++ /* These timers can't be zero */
++ if(!pCmd->psPollTimeout || !pCmd->triggerTimeout ||
++ !(pCmd->apsdTimPolicy == IGNORE_TIM_ALL_QUEUES_APSD ||
++ pCmd->apsdTimPolicy == PROCESS_TIM_ALL_QUEUES_APSD) ||
++ !(pCmd->simulatedAPSDTimPolicy == IGNORE_TIM_SIMULATED_APSD ||
++ pCmd->simulatedAPSDTimPolicy == PROCESS_TIM_SIMULATED_APSD))
++ return A_EINVAL;
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_POWERSAVE_TIMERS_POLICY_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, size);
++
++ A_MEMCPY(cmd, pCmd, size);
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_POWERSAVE_TIMERS_POLICY_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++#ifdef CONFIG_HOST_GPIO_SUPPORT
++/* Send a command to Target to change GPIO output pins. */
++A_STATUS
++wmi_gpio_output_set(struct wmi_t *wmip,
++ A_UINT32 set_mask,
++ A_UINT32 clear_mask,
++ A_UINT32 enable_mask,
++ A_UINT32 disable_mask)
++{
++ void *osbuf;
++ WMIX_GPIO_OUTPUT_SET_CMD *output_set;
++ int size;
++
++ size = sizeof(*output_set);
++
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "Enter - set=0x%x clear=0x%x enb=0x%x dis=0x%x\n", DBGARG,
++ set_mask, clear_mask, enable_mask, disable_mask));
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++ A_NETBUF_PUT(osbuf, size);
++ output_set = (WMIX_GPIO_OUTPUT_SET_CMD *)(A_NETBUF_DATA(osbuf));
++
++ output_set->set_mask = set_mask;
++ output_set->clear_mask = clear_mask;
++ output_set->enable_mask = enable_mask;
++ output_set->disable_mask = disable_mask;
++
++ return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_GPIO_OUTPUT_SET_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++/* Send a command to the Target requesting state of the GPIO input pins */
++A_STATUS
++wmi_gpio_input_get(struct wmi_t *wmip)
++{
++ void *osbuf;
++
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ osbuf = A_NETBUF_ALLOC(0);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_GPIO_INPUT_GET_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++/* Send a command to the Target that changes the value of a GPIO register. */
++A_STATUS
++wmi_gpio_register_set(struct wmi_t *wmip,
++ A_UINT32 gpioreg_id,
++ A_UINT32 value)
++{
++ void *osbuf;
++ WMIX_GPIO_REGISTER_SET_CMD *register_set;
++ int size;
++
++ size = sizeof(*register_set);
++
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "Enter - reg=%d value=0x%x\n", DBGARG, gpioreg_id, value));
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++ A_NETBUF_PUT(osbuf, size);
++ register_set = (WMIX_GPIO_REGISTER_SET_CMD *)(A_NETBUF_DATA(osbuf));
++
++ register_set->gpioreg_id = gpioreg_id;
++ register_set->value = value;
++
++ return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_GPIO_REGISTER_SET_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++/* Send a command to the Target to fetch the value of a GPIO register. */
++A_STATUS
++wmi_gpio_register_get(struct wmi_t *wmip,
++ A_UINT32 gpioreg_id)
++{
++ void *osbuf;
++ WMIX_GPIO_REGISTER_GET_CMD *register_get;
++ int size;
++
++ size = sizeof(*register_get);
++
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter - reg=%d\n", DBGARG, gpioreg_id));
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++ A_NETBUF_PUT(osbuf, size);
++ register_get = (WMIX_GPIO_REGISTER_GET_CMD *)(A_NETBUF_DATA(osbuf));
++
++ register_get->gpioreg_id = gpioreg_id;
++
++ return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_GPIO_REGISTER_GET_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++/* Send a command to the Target acknowledging some GPIO interrupts. */
++A_STATUS
++wmi_gpio_intr_ack(struct wmi_t *wmip,
++ A_UINT32 ack_mask)
++{
++ void *osbuf;
++ WMIX_GPIO_INTR_ACK_CMD *intr_ack;
++ int size;
++
++ size = sizeof(*intr_ack);
++
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter ack_mask=0x%x\n", DBGARG, ack_mask));
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++ A_NETBUF_PUT(osbuf, size);
++ intr_ack = (WMIX_GPIO_INTR_ACK_CMD *)(A_NETBUF_DATA(osbuf));
++
++ intr_ack->ack_mask = ack_mask;
++
++ return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_GPIO_INTR_ACK_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++#endif /* CONFIG_HOST_GPIO_SUPPORT */
++
++A_STATUS
++wmi_set_access_params_cmd(struct wmi_t *wmip, A_UINT16 txop, A_UINT8 eCWmin,
++ A_UINT8 eCWmax, A_UINT8 aifsn)
++{
++ void *osbuf;
++ WMI_SET_ACCESS_PARAMS_CMD *cmd;
++
++ if ((eCWmin > WMI_MAX_CW_ACPARAM) || (eCWmax > WMI_MAX_CW_ACPARAM) ||
++ (aifsn > WMI_MAX_AIFSN_ACPARAM))
++ {
++ return A_EINVAL;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_ACCESS_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
++ cmd->txop = txop;
++ cmd->eCWmin = eCWmin;
++ cmd->eCWmax = eCWmax;
++ cmd->aifsn = aifsn;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_ACCESS_PARAMS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_retry_limits_cmd(struct wmi_t *wmip, A_UINT8 frameType,
++ A_UINT8 trafficClass, A_UINT8 maxRetries,
++ A_UINT8 enableNotify)
++{
++ void *osbuf;
++ WMI_SET_RETRY_LIMITS_CMD *cmd;
++
++ if ((frameType != MGMT_FRAMETYPE) && (frameType != CONTROL_FRAMETYPE) &&
++ (frameType != DATA_FRAMETYPE))
++ {
++ return A_EINVAL;
++ }
++
++ if (maxRetries > WMI_MAX_RETRIES) {
++ return A_EINVAL;
++ }
++
++ if (frameType != DATA_FRAMETYPE) {
++ trafficClass = 0;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_RETRY_LIMITS_CMD *)(A_NETBUF_DATA(osbuf));
++ cmd->frameType = frameType;
++ cmd->trafficClass = trafficClass;
++ cmd->maxRetries = maxRetries;
++ cmd->enableNotify = enableNotify;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_RETRY_LIMITS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++void
++wmi_get_current_bssid(struct wmi_t *wmip, A_UINT8 *bssid)
++{
++ if (bssid != NULL) {
++ A_MEMCPY(bssid, wmip->wmi_bssid, ATH_MAC_LEN);
++ }
++}
++
++A_STATUS
++wmi_set_opt_mode_cmd(struct wmi_t *wmip, A_UINT8 optMode)
++{
++ void *osbuf;
++ WMI_SET_OPT_MODE_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_OPT_MODE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->optMode = optMode;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_OPT_MODE_CMDID,
++ SYNC_BOTH_WMIFLAG));
++}
++
++A_STATUS
++wmi_opt_tx_frame_cmd(struct wmi_t *wmip,
++ A_UINT8 frmType,
++ A_UINT8 *dstMacAddr,
++ A_UINT8 *bssid,
++ A_UINT16 optIEDataLen,
++ A_UINT8 *optIEData)
++{
++ void *osbuf;
++ WMI_OPT_TX_FRAME_CMD *cmd;
++ osbuf = A_NETBUF_ALLOC(optIEDataLen + sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, (optIEDataLen + sizeof(*cmd)));
++
++ cmd = (WMI_OPT_TX_FRAME_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, (optIEDataLen + sizeof(*cmd)-1));
++
++ cmd->frmType = frmType;
++ cmd->optIEDataLen = optIEDataLen;
++ //cmd->optIEData = (A_UINT8 *)((int)cmd + sizeof(*cmd));
++ A_MEMCPY(cmd->bssid, bssid, sizeof(cmd->bssid));
++ A_MEMCPY(cmd->dstAddr, dstMacAddr, sizeof(cmd->dstAddr));
++ A_MEMCPY(&cmd->optIEData[0], optIEData, optIEDataLen);
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_OPT_TX_FRAME_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_adhoc_bconIntvl_cmd(struct wmi_t *wmip, A_UINT16 intvl)
++{
++ void *osbuf;
++ WMI_BEACON_INT_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_BEACON_INT_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->beaconInterval = intvl;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_BEACON_INT_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++
++A_STATUS
++wmi_set_voice_pkt_size_cmd(struct wmi_t *wmip, A_UINT16 voicePktSize)
++{
++ void *osbuf;
++ WMI_SET_VOICE_PKT_SIZE_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_VOICE_PKT_SIZE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->voicePktSize = voicePktSize;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_VOICE_PKT_SIZE_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++
++A_STATUS
++wmi_set_max_sp_len_cmd(struct wmi_t *wmip, A_UINT8 maxSPLen)
++{
++ void *osbuf;
++ WMI_SET_MAX_SP_LEN_CMD *cmd;
++
++ /* maxSPLen is a two-bit value. If user trys to set anything
++ * other than this, then its invalid
++ */
++ if(maxSPLen & ~0x03)
++ return A_EINVAL;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_MAX_SP_LEN_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->maxSPLen = maxSPLen;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_MAX_SP_LEN_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_UINT8
++convert_userPriority_to_trafficClass(A_UINT8 userPriority)
++{
++ return (up_to_ac[userPriority & 0x7]);
++}
++
++A_UINT8
++wmi_get_power_mode_cmd(struct wmi_t *wmip)
++{
++ return wmip->wmi_powerMode;
++}
++
++A_STATUS
++wmi_verify_tspec_params(WMI_CREATE_PSTREAM_CMD *pCmd, A_BOOL tspecCompliance)
++{
++ return A_OK;
++}
++
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++static A_STATUS
++wmi_tcmd_test_report_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_TCMD_RX_REPORT_EVENT(wmip->wmi_devt, datap, len);
++
++ return A_OK;
++}
++
++#endif /* CONFIG_HOST_TCMD_SUPPORT*/
++
++A_STATUS
++wmi_set_authmode_cmd(struct wmi_t *wmip, A_UINT8 mode)
++{
++ void *osbuf;
++ WMI_SET_AUTH_MODE_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_AUTH_MODE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->mode = mode;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_AUTH_MODE_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_reassocmode_cmd(struct wmi_t *wmip, A_UINT8 mode)
++{
++ void *osbuf;
++ WMI_SET_REASSOC_MODE_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_REASSOC_MODE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->mode = mode;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_REASSOC_MODE_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_lpreamble_cmd(struct wmi_t *wmip, A_UINT8 status)
++{
++ void *osbuf;
++ WMI_SET_LPREAMBLE_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_LPREAMBLE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->status = status;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_LPREAMBLE_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_rts_cmd(struct wmi_t *wmip, A_UINT16 threshold)
++{
++ void *osbuf;
++ WMI_SET_RTS_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_RTS_CMD*)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->threshold = threshold;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_RTS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_wmm_cmd(struct wmi_t *wmip, WMI_WMM_STATUS status)
++{
++ void *osbuf;
++ WMI_SET_WMM_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_WMM_CMD*)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->status = status;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_WMM_CMDID,
++ NO_SYNC_WMIFLAG));
++
++}
++
++A_STATUS
++wmi_set_wmm_txop(struct wmi_t *wmip, WMI_TXOP_CFG cfg)
++{
++ void *osbuf;
++ WMI_SET_WMM_TXOP_CMD *cmd;
++
++ if( !((cfg == WMI_TXOP_DISABLED) || (cfg == WMI_TXOP_ENABLED)) )
++ return A_EINVAL;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_WMM_TXOP_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->txopEnable = cfg;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_WMM_TXOP_CMDID,
++ NO_SYNC_WMIFLAG));
++
++}
++
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++/* WMI layer doesn't need to know the data type of the test cmd.
++ This would be beneficial for customers like Qualcomm, who might
++ have different test command requirements from differnt manufacturers
++ */
++A_STATUS
++wmi_test_cmd(struct wmi_t *wmip, A_UINT8 *buf, A_UINT32 len)
++{
++ void *osbuf;
++ char *data;
++
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ osbuf= A_NETBUF_ALLOC(len);
++ if(osbuf == NULL)
++ {
++ return A_NO_MEMORY;
++ }
++ A_NETBUF_PUT(osbuf, len);
++ data = A_NETBUF_DATA(osbuf);
++ A_MEMCPY(data, buf, len);
++
++ return(wmi_cmd_send(wmip, osbuf, WMI_TEST_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++#endif
++
++A_STATUS
++wmi_set_bt_status_cmd(struct wmi_t *wmip, A_UINT8 streamType, A_UINT8 status)
++{
++ void *osbuf;
++ WMI_SET_BT_STATUS_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_BT_STATUS_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->streamType = streamType;
++ cmd->status = status;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_BT_STATUS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_bt_params_cmd(struct wmi_t *wmip, WMI_SET_BT_PARAMS_CMD* cmd)
++{
++ void *osbuf;
++ WMI_SET_BT_PARAMS_CMD* alloc_cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ alloc_cmd = (WMI_SET_BT_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(alloc_cmd, sizeof(*cmd));
++ A_MEMCPY(alloc_cmd, cmd, sizeof(*cmd));
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_BT_PARAMS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_get_keepalive_configured(struct wmi_t *wmip)
++{
++ void *osbuf;
++ WMI_GET_KEEPALIVE_CMD *cmd;
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++ cmd = (WMI_GET_KEEPALIVE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ return (wmi_cmd_send(wmip, osbuf, WMI_GET_KEEPALIVE_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_UINT8
++wmi_get_keepalive_cmd(struct wmi_t *wmip)
++{
++ return wmip->wmi_keepaliveInterval;
++}
++
++A_STATUS
++wmi_set_keepalive_cmd(struct wmi_t *wmip, A_UINT8 keepaliveInterval)
++{
++ void *osbuf;
++ WMI_SET_KEEPALIVE_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_KEEPALIVE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->keepaliveInterval = keepaliveInterval;
++ wmip->wmi_keepaliveInterval = keepaliveInterval;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_KEEPALIVE_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_appie_cmd(struct wmi_t *wmip, A_UINT8 mgmtFrmType, A_UINT8 ieLen,
++ A_UINT8 *ieInfo)
++{
++ void *osbuf;
++ WMI_SET_APPIE_CMD *cmd;
++ A_UINT16 cmdLen;
++
++ if (ieLen > WMI_MAX_IE_LEN) {
++ return A_ERROR;
++ }
++ cmdLen = sizeof(*cmd) + ieLen - 1;
++ osbuf = A_NETBUF_ALLOC(cmdLen);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, cmdLen);
++
++ cmd = (WMI_SET_APPIE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, cmdLen);
++
++ cmd->mgmtFrmType = mgmtFrmType;
++ cmd->ieLen = ieLen;
++ A_MEMCPY(cmd->ieInfo, ieInfo, ieLen);
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_APPIE_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_halparam_cmd(struct wmi_t *wmip, A_UINT8 *cmd, A_UINT16 dataLen)
++{
++ void *osbuf;
++ A_UINT8 *data;
++
++ osbuf = A_NETBUF_ALLOC(dataLen);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, dataLen);
++
++ data = A_NETBUF_DATA(osbuf);
++
++ A_MEMCPY(data, cmd, dataLen);
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_WHALPARAM_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_INT32
++wmi_get_rate(A_INT8 rateindex)
++{
++ if (rateindex == RATE_AUTO) {
++ return 0;
++ } else {
++ return(wmi_rateTable[(A_UINT32) rateindex]);
++ }
++}
++
++void
++wmi_node_return (struct wmi_t *wmip, bss_t *bss)
++{
++ if (NULL != bss)
++ {
++ wlan_node_return (&wmip->wmi_scan_table, bss);
++ }
++}
++
++bss_t *
++wmi_find_Ssidnode (struct wmi_t *wmip, A_UCHAR *pSsid,
++ A_UINT32 ssidLength, A_BOOL bIsWPA2)
++{
++ bss_t *node = NULL;
++ node = wlan_find_Ssidnode (&wmip->wmi_scan_table, pSsid,
++ ssidLength, bIsWPA2);
++ return node;
++}
++
++void
++wmi_free_allnodes(struct wmi_t *wmip)
++{
++ wlan_free_allnodes(&wmip->wmi_scan_table);
++}
++
++bss_t *
++wmi_find_node(struct wmi_t *wmip, const A_UINT8 *macaddr)
++{
++ bss_t *ni=NULL;
++ ni=wlan_find_node(&wmip->wmi_scan_table,macaddr);
++ return ni;
++}
++
++A_STATUS
++wmi_dset_open_reply(struct wmi_t *wmip,
++ A_UINT32 status,
++ A_UINT32 access_cookie,
++ A_UINT32 dset_size,
++ A_UINT32 dset_version,
++ A_UINT32 targ_handle,
++ A_UINT32 targ_reply_fn,
++ A_UINT32 targ_reply_arg)
++{
++ void *osbuf;
++ WMIX_DSETOPEN_REPLY_CMD *open_reply;
++
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter - wmip=0x%x\n", DBGARG, (int)wmip));
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*open_reply));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*open_reply));
++ open_reply = (WMIX_DSETOPEN_REPLY_CMD *)(A_NETBUF_DATA(osbuf));
++
++ open_reply->status = status;
++ open_reply->targ_dset_handle = targ_handle;
++ open_reply->targ_reply_fn = targ_reply_fn;
++ open_reply->targ_reply_arg = targ_reply_arg;
++ open_reply->access_cookie = access_cookie;
++ open_reply->size = dset_size;
++ open_reply->version = dset_version;
++
++ return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_DSETOPEN_REPLY_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++static A_STATUS
++wmi_get_pmkid_list_event_rx(struct wmi_t *wmip, A_UINT8 *datap, A_UINT32 len)
++{
++ WMI_PMKID_LIST_REPLY *reply;
++ A_UINT32 expected_len;
++
++ if (len < sizeof(WMI_PMKID_LIST_REPLY)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_PMKID_LIST_REPLY *)datap;
++ expected_len = sizeof(reply->numPMKID) + reply->numPMKID * WMI_PMKID_LEN;
++
++ if (len < expected_len) {
++ return A_EINVAL;
++ }
++
++ A_WMI_PMKID_LIST_EVENT(wmip->wmi_devt, reply->numPMKID,
++ reply->pmkidList);
++
++ return A_OK;
++}
++
++#ifdef CONFIG_HOST_DSET_SUPPORT
++A_STATUS
++wmi_dset_data_reply(struct wmi_t *wmip,
++ A_UINT32 status,
++ A_UINT8 *user_buf,
++ A_UINT32 length,
++ A_UINT32 targ_buf,
++ A_UINT32 targ_reply_fn,
++ A_UINT32 targ_reply_arg)
++{
++ void *osbuf;
++ WMIX_DSETDATA_REPLY_CMD *data_reply;
++ int size;
++
++ size = sizeof(*data_reply) + length;
++
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "Enter - length=%d status=%d\n", DBGARG, length, status));
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++ A_NETBUF_PUT(osbuf, size);
++ data_reply = (WMIX_DSETDATA_REPLY_CMD *)(A_NETBUF_DATA(osbuf));
++
++ data_reply->status = status;
++ data_reply->targ_buf = targ_buf;
++ data_reply->targ_reply_fn = targ_reply_fn;
++ data_reply->targ_reply_arg = targ_reply_arg;
++ data_reply->length = length;
++
++ if (status == A_OK) {
++ if (a_copy_from_user(data_reply->buf, user_buf, length)) {
++ return A_ERROR;
++ }
++ }
++
++ return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_DSETDATA_REPLY_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++#endif /* CONFIG_HOST_DSET_SUPPORT */
++
++A_STATUS
++wmi_set_wsc_status_cmd(struct wmi_t *wmip, A_UINT32 status)
++{
++ void *osbuf;
++ char *cmd;
++
++ wps_enable = status;
++
++ osbuf = a_netbuf_alloc(sizeof(1));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ a_netbuf_put(osbuf, sizeof(1));
++
++ cmd = (char *)(a_netbuf_to_data(osbuf));
++
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd[0] = (status?1:0);
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_WSC_STATUS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/wmi/wmi_doc.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/wmi/wmi_doc.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/wmi/wmi_doc.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/wmi/wmi_doc.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,4421 @@
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++
++#if 0
++Wireless Module Interface (WMI) Documentaion
++
++ This section describes the format and the usage model for WMI control and
++ data messages between the host and the AR6000-based targets. The header
++ file include/wmi.h contains all command and event manifest constants as
++ well as structure typedefs for each set of command and reply parameters.
++
++Data Frames
++
++ The data payload transmitted and received by the target follows RFC-1042
++ encapsulation and thus starts with an 802.2-style LLC-SNAP header. The
++ WLAN module completes 802.11 encapsulation of the payload, including the
++ MAC header, FCS, and WLAN security related fields. At the interface to the
++ message transport (HTC), a data frame is encapsulated in a WMI message.
++
++WMI Message Structure
++
++ The WMI protocol leverages an 802.3-style Ethernet header in communicating
++ the source and destination information between the host and the AR6000
++ modules using a 14-byte 802.3 header ahead of the 802.2-style payload. In
++ addition, the WMI protocol adds a header to all data messages:
++
++ {
++ INT8 rssi
++ The RSSI of the received packet and its units are shown in db above the
++ noise floor, and the noise floor is shown in dbm.
++ UINT8 info
++ Contains information on message type and user priority. Message type
++ differentiates between a data packet and a synchronization message.
++ } WMI_DATA_HDR
++
++ User priority contains the 802.1d user priority info from host to target. Host
++ software translates the host Ethernet format to 802.3 format prior to Tx and
++ 802.3 format to host format in the Rx direction. The host does not transmit the
++ FCS that follows the data. MsgType differentiates between a regular data
++ packet (msgType=0) and a synchronization message (msgType=1).
++
++Data Endpoints
++
++ The AR6000 chipset provides several data endpoints to support quality of
++ service (QoS) and maintains separate queues and separate DMA engines for
++ each data endpoint. A data endpoint can be bi-directional.
++
++ Best effort (BE) class traffic uses the default data endpoint (2). The host can
++ establish up to two additional data endpoints for other traffic classes. Once
++ such a data endpoint is established, it sends and receives corresponding QoS
++ traffic in a manner similar to the default data endpoint.
++
++ If QoS is desired over the interconnect, host software must classify each data
++ packet and place it on the appropriate data endpoint. The information
++ required to classify data is generally available in-band as an 802.1p/q style
++ tag or as the ToS field in the IP header. The information may also be available
++ out-of-band depending on the host DDI.
++
++Connection States
++
++ Table B-1 describes the AR6000 WLAN connection states:
++
++ Table B-1. AR6000 Connection States
++
++Connection State
++ Description
++
++ DISCONNECTED
++ In this state, the AR6000 device is not connected to a wireless
++ network. The device is in this state after reset when it sends the
++ WIRELESS MODULE “READY” EVENT, after it processes a
++ DISCONNECT command, and when it loses its link with the
++ access point (AP) that it was connected to. The device signals a
++ transition to the DISCONNECTED state with a “DISCONNECT”
++ event.
++
++CONNECTED
++ In this state, the AR6000 device is connected to wireless networks.
++ The device enters this state after successfully processing a
++ CONNECT, which establishes a connection with a wireless
++ network. The device signals a transition to the CONNECTED state
++ with a “CONNECT” event.
++
++
++Message Types
++
++ WMI uses commands, replies, and events for the control and configuration of
++ the AR6000 device. The control protocol is asynchronous. Table B-2 describes
++ AR6000 message types:
++
++Table B-2. AR6000 Message Types
++
++Message Type
++ Description
++
++Commands
++ Control messages that flow from the host to the device
++
++Replies/Events
++ Control messages that flow from the device to the host.
++
++ The device issues a reply to some WMI commands, but not to others.
++ The payload in a reply is command-specific, and some commands do
++ not trigger a reply message at all. Events are control messages issued
++ by the device to signal the occurrence of an asynchronous event.
++
++
++WMI Message Format
++
++ All WMI control commands, replies and events use the header format:
++
++ WMI_CMD_HDR Header Format
++ {
++ UINT16 id
++ This 16-bit constant identifies which WMI command the host is issuing,
++ which command the target is replying to, or which event has occurred.
++ WMI_CMD_HDR
++ }
++
++
++ A variable-size command-, reply-, or event-specific payload follows the
++ header. Over the interconnect, all fields in control messages (including
++ WMI_CMD_HDR and the command specific payload) use 32-bit little Endian
++ byte ordering and fields are packed. The AR6000 device always executes
++ commands in order, and the host may send multiple commands without
++ waiting for previous commands to complete. A majority of commands are
++ processed to completion once received. Other commands trigger a longer
++ duration activity whose completion is signaled to the host through an event.
++
++Command Restrictions
++
++ Some commands may only be issued when the AR6000 device is in a certain
++ state. The host is required to wait for an event signaling a state transition
++ before such a command can be issued. For example, if a command requires
++ the device to be in the CONNECTED state, then the host is required to wait
++ for a “CONNECT” event before it issues that command.
++
++ The device ignores any commands inappropriate for its current state. If the
++ command triggers a reply, the device generates an error reply. Otherwise, the
++ device silently ignores the inappropriate command.
++
++Command and Data Synchronization
++
++ WMI provides a mechanism for a host to advise the device of necessary
++ synchronization between commands and data. The device implements
++ synchronization; no implicit synchronization exists between endpoints.
++
++ The host controls synchronization using the “SYNCHRONIZE” command
++ over the control channel and synchronization messages over data channels.
++ The device stops each data channel upon receiving a synchronization message
++ on that channel, processing all data packets received prior to that message.
++ After the device receives synchronization messages for each data endpoint
++ and the “SYNCHRONIZE” command, it resumes all channels.
++
++ When the host must guarantee a command executes before processing new
++ data packets, it first issues the command, then issues the “SYNCHRONIZE”
++ command and sends synchronization messages on data channels. When the
++ host must guarantee the device has processed all old data packets before a
++ processing a new command, it issues a “SYNCHRONIZE” command and
++ synchronization messages on all data channels, then issues the desired
++ command.
++
++
++
++WMI Commands
++
++ ADD_BAD_AP
++ Cause the AR6000 device to avoid a particular AP
++ ADD_CIPHER_KEY
++ Add or replace any of the four AR6000 encryption keys
++ ADD_WOW_PATTERN
++ Used to add a pattern to the WoW pattern list
++ CLR_RSSI_SNR
++ Clear the current calculated RSSI and SNR value
++ CONNECT_CMD
++ Request that the AR6000 device establish a wireless connection
++ with the specified SSID
++ CREATE_PSTREAM
++ Create prioritized data endpoint between the host and device
++ DELETE_BAD_AP
++ Clear an entry in the bad AP table
++ DELETE_CIPHER_KEY
++ Delete a previously added cipher key
++ DELETE_PSTREAM
++ Delete a prioritized data endpoint
++ DELETE_WOW_PATTERN
++ Remove a pre-specified pattern from the WoW pattern list
++ EXTENSION
++ WMI message interface command
++ GET_BIT_RATE
++ Retrieve rate most recently used by the AR6000
++ GET_CHANNEL_LIST
++ Retrieve list of channels used by the AR6000
++ GET_FIXRATES
++ Retrieves the rate-mask set via the SET_FIXRATES command.
++ GET_PMKID_LIST_CMD
++ Retrieve the firmware list of PMKIDs
++ GET_ROAM_DATA
++ Internal use for data collection; available in special build only
++ GET_ROAM_TBL
++ Retrieve the roaming table maintained on the target
++ GET_TARGET_STATS
++ Request that the target send the statistics it maintains
++ GET_TX_PWR
++ Retrieve the current AR6000 device Tx power levels
++ GET_WOW_LIST
++ Retrieve the current list of WoW patterns
++ LQ_THRESHOLD_PARAMS
++ Set the link quality thresholds
++ OPT_TX_FRAME
++ Send a special frame (special feature)
++ RECONNECT
++ Request a reconnection to a BSS
++ RSSI_THRESHOLD_PARAMS
++ Configure how the AR6000 device monitors and reports signal
++ strength (RSSI) of the connected BSS
++ SCAN_PARAMS
++ Determine dwell time and changes scanned channels
++ SET_ACCESS_PARAMS
++ Set access parameters for the wireless network
++ SET_ADHOC_BSSID
++ Set the BSSID for an ad hoc network
++ SET_AKMP_PARAMS
++ Set multiPMKID mode
++ SET_APPIE
++ Add application-specified IE to a management frame
++ SET_ASSOC_INFO
++ Specify the IEs the device should add to association or
++ reassociation requests
++ SET_AUTH_MODE
++ Set 802.11 authentication mode of reconnection
++ SET_BEACON_INT
++ Set the beacon interval for an ad hoc network
++ SET_BIT_RATE
++ Set the AR6000 to a specific fixed bit rate
++ SET_BMISS_TIME
++ Set the beacon miss time
++ SET_BSS_FILTER
++ Inform the AR6000 of network types about which it wants to
++ receive information using a “BSSINFO” event
++ SET_BT_PARAMS
++ Set the status of a Bluetooth stream (SCO or A2DP) or set
++ Bluetooth coexistence register parameters
++ SET_BT_STATUS
++ Set the status of a Bluetooth stream (SCO or A2DP)
++ SET_CHANNEL_PARAMETERS
++ Configure WLAN channel parameters
++ SET_DISC_TIMEOUT
++ Set the amount of time the AR6000 spends attempting to
++ reestablish a connection
++ SET_FIXRATES
++ Set the device to a specific fixed PHY rate (supported subset)
++ SET_HALPARAM
++ Internal AR6000 command to set certain hardware parameters
++ SET_HOST_SLEEP_MODE
++ Set the host mode to asleep or awake
++ SET_IBSS_PM_CAPS
++ Support a non-standard power management scheme for an
++ ad hoc network
++ SET_LISTEN_INT
++ Request a listen interval
++ SET_LPREAMBLE
++ Override the short preamble capability of the AR6000 device
++ SET_MAX_SP_LEN
++ Set the maximum service period
++ SET_OPT_MODE
++ Set the special mode on/off (special feature)
++ SET_PMKID
++ Set the pairwise master key ID (PMKID)
++ SET_PMKID_LIST_CMD
++ Configure the firmware list of PMKIDs
++ SET_POWER_MODE
++ Set guidelines on trade-off between power utilization
++ SET_POWER_PARAMS
++ Configure power parameters
++ SET_POWERSAVE_PARAMS
++ Set the two AR6000 power save timers
++ SET_PROBED_SSID
++ Provide list of SSIDs the device should seek
++ SET_REASSOC_MODE
++ Specify whether the disassociated frame should be sent upon
++ reassociation
++ SET_RETRY_LIMITS
++ Limit how many times the device tries to send a frame
++ SET_ROAM_CTRL
++ Control roaming behavior
++ SET_RTS
++ Determine when RTS should be sent
++ SET_SCAN_PARAMS
++ Set the AR6000 scan parameters
++ SET_TKIP_COUNTERMEASURES
++ Enable/disable reports of TKIP MIC errors
++ SET_TX_PWR
++ Specify the AR6000 device Tx power levels
++ SET_VOICE_PKT_SIZE
++ Set voice packet size
++ SET_WMM
++ Override the AR6000 WMM capability
++ SET_WMM_TXOP
++ Configure TxOP bursting when sending traffic to a WMM-
++ capable AP
++ SET_WOW_MODE
++ Enable/disable WoW mode
++ SET_WSC_STATUS
++ Enable/disable profile check in cserv when the WPS protocol
++ is in progress
++ SNR_THRESHOLD_PARAMS
++ Configure how the device monitors and reports SNR of BSS
++ START_SCAN
++ Start a long or short channel scan
++ SYNCHRONIZE
++ Force a synchronization point between command and data
++ paths
++ TARGET_REPORT_ERROR_BITMASK
++ Control “ERROR_REPORT” events from the AR6000
++
++
++
++
++Name
++ ADD_BAD_AP
++
++Synopsis
++ The host uses this command to cause the AR6000 to avoid a particular AP. The
++ AR6000 maintain a table with up to two APs to avoid. An ADD_BAD_AP command
++ adds or replaces the specified entry in this bad AP table.
++
++ If the AR6000 are currently connected to the AP specified in this command, they
++ disassociate.
++
++Command
++ wmiconfig eth1 --badap <bssid> <badApIndex>
++
++Command Parameters
++ UINT8 badApIndex Index [0...1] that identifies which entry in the
++ bad AP table to use
++
++
++ UINT8 bssid[6] MAC address of the AP to avoid
++
++Command Values
++ badApIndex = 0, 1 Entry in the bad AP table to use
++
++Reset Value
++ The bad AP table is cleared
++
++Restrictions
++ None
++
++See Also
++ “DELETE_BAD_AP” on page B-13
++
++=====================================================================
++Name
++ ADD_CIPHER_KEY
++
++Synopsis
++ The host uses this command to add/replace any of four encryption keys on the
++ AR6000. The ADD_CIPHER_KEY command is issued after the CONNECT event
++ has been received by the host for all dot11Auth modes except for SHARED_AUTH.
++ When the dot11AuthMode is SHARED_AUTH, then the ADD_CIPHER_KEY
++ command should be issued before the “CONNECT” command.
++
++Command
++ wmiconfig eth1 --cipherkey <keyIndex> <keyType> <keyUsage>
++ <keyLength> <keyopctrl> <keyRSC> <key>
++
++Command Parameters
++ UINT8 keyIndex Index (0...3) of the key to add/replace;
++ uniquely identifies the key
++ UINT8 keyType CRYPTO_TYPE
++ UINT8 keyUsage Specifies usage parameters of the key when
++ keyType = WEP_CRYPT
++ UINT8 keyLength Length of the key in bytes
++ UINT8 keyOpCtrl bit[0] = Initialize TSC (default),
++ bit[1] = Initialize RSC
++ UINT8 keyRSC[8] Key replay sequence counter (RSC) initial
++ value the device should use
++ UINT8 key[32] Key material used for this connection
++ Command Values
++ {
++ NONE_CRYPT = 1
++ WEP_CRYPT = 2
++ TKIP_CRYPT = 3
++ AES_CRYPT = 4
++ KEY_OP_INIT_TSC 0x01
++ KEY_OP_INIT_RSC 0x02
++ KEY_OP_INIT_VAL 0x03
++ Default is to Initialize the TSC
++ KEY_OP_VALID_MASK 0x04
++ Two operations defined
++ } CRYPTO_TYPE
++
++ {
++ PAIRWISE_USAGE = 0 Set if the key is used for unicast traffic only
++ GROUP_USAGE = 1 Set if the key is used to receive multicast
++ traffic (also set for static WEP keys)
++ TX_USAGE = 2 Set for the GROUP key used to transmit frames
++ All others are reserved
++ } KEY_USAGE
++
++Reset Value
++ The four available keys are disabled.
++
++Restrictions
++ The cipher should correspond to the encryption mode specified in the “CONNECT”
++ command.
++
++See Also
++ “DELETE_CIPHER_KEY”
++
++=====================================================================
++
++
++Name
++ ADD_WOW_PATTERN
++
++Synopsis
++ The host uses this command to add a pattern to the WoW pattern list; used for
++ pattern-matching for host wakeups by the WoW module. If the host mode is asleep
++ and WoW is enabled, all packets are matched against the existing WoW patterns. If a
++ packet matches any of the patterns specified, the target will wake up the host. All
++ non-matching packets are discarded by the target without being sent up to the host.
++
++Command
++ wmiconfig –addwowpattern <list-id> <filter-size> <filter-offset>
++ <pattern> <mask>
++
++Command Parameters
++ A_UINT8 filter_list_id ID of the list that is to include the new pattern
++ A_UINT8 filter_size Size of the new pattern
++ A_UINT8 filter_offset Offset at which the pattern matching for this
++ new pattern should begin at
++ A_UINT8 filter[1] Byte stream that contains both the pattern and
++ the mask of the new WoW wake-up pattern
++
++Reply Parameters
++ None
++
++Reset Value
++ None defined (default host mode is awake)
++
++Restrictions
++ None
++
++See Also
++ “DELETE_WOW_PATTERN”
++
++=====================================================================
++
++
++Name
++ CLR_RSSI_SNR
++
++Synopsis
++ Clears the current calculated RSSI and SNR value. RSSI and SNR are reported by
++ running-average value. This command will clear the history and have a fresh start
++ for the running-average mechanism.
++
++Command
++ wmiconfig eth1 --cleanRssiSnr
++
++Command Parameters
++ None
++
++Reply Parameters
++ None
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++=====================================================================
++
++Name
++ CONNECT_CMD
++
++Synopsis
++ New connect control information (connectCtrl) is added, with 32 possible modifiers.
++
++ CONNECT_SEND_REASSOC
++ Valid only for a host-controlled connection to a
++ particular AP. If this bit is set, a reassociation frame is
++ sent. If this bit is clear, an association request frame is
++ sent to the AP.
++
++ CONNECT_IGNORE_WPAx_GROUP_CIPHER
++ No group key is issued in the CONNECT command,
++ so use the group key advertised by the AP. In a target-
++ initiated roaming situation this allows a STA to roam
++ between APs that support different multicast ciphers.
++
++ CONNECT_PROFILE_MATCH_DONE
++ In a host-controlled connection case, it is possible that
++ during connect, firmware may not have the
++ information for a profile match (e.g, when the AP
++ supports hidden SSIDs and the device may not
++ transmit probe requests during connect). By setting
++ this bit in the connection control information, the
++ firmware waits for a beacon from the AP with the
++ BSSID supplied in the CONNECT command. No
++ additional profile checks are done.
++
++ CONNECT_IGNORE_AAC_BEACON
++ Ignore the Admission Capacity information in the
++ beacon of the AP
++
++ CONNECT_ASSOC_POLICY_USER
++ When set, the CONNECT_SEND_REASSOC setting
++ determines if an Assoc or Reassoc is sent to an AP
++
++Command
++ wmiconfig --setconnectctrl <ctrl flags bitmask>
++
++Command Parameters
++ typedef struct{
++ A_UINT8 networktype;
++ A_UINT8 dot11authmode;
++ A_UINT8 authmode;
++ A_UINT8 pairwiseCryptoType; /*CRYPTO_TYPE*/
++ A_UINT8 pairwiseCryptoLen;
++ A_UINT8 groupCryptoType; /*CRYPTO_TYPE*/
++ A_UINT8 groupCryptoLen;
++ A_UINT8 ssidLength;
++ A_UCHAR ssid[WMI_MAX_SSID_LEN];
++ A_UINT16 channel;
++ A_UINT8 bssid[AUTH_MAC_LEN];
++ A_UINT8 ctrl_flags; /*WMI_CONNECT_CTRL_FLAGS_BITS*/
++ } WMI_CONNECT_CMD;
++
++ ctrl flags bitmask
++ = 0x0001 CONNECT_ASSOC_POLICY_USER
++ Assoc frames are sent using the policy specified by
++ the flag
++ = 0x0002 CONNECT_SEND_REASSOC
++ Send Reassoc frame while connecting, otherwise send
++ assoc frames
++ = 0x0004 CONNECT_IGNORE_WPAx_GROUP_CIPHER
++ Ignore WPAx group cipher for WPA/WPA2
++ = 0x0008 CONNECT_PROFILE_MATCH_DONE
++ Ignore any profile check
++ = 0x0010 CONNECT_IGNORE_AAC_BEACON
++ Ignore the admission control information in the
++ beacon
++ ... CONNECT_CMD, continued
++ Command Values
++ typedef enum {
++ INFRA_NETWORK = 0x01,
++ ADHOC_NETWORK = 0x02,
++ ADHOC_CREATOR = 0x04,
++ } NETWORK_TYPE;
++
++ typedef enum {
++ OPEN_AUTH = 0x01,
++ SHARED_AUTH = 0x02,
++ LEAP_AUTH = 0x04,
++ } DOT11_AUTH_MODE;
++ typedef enum {
++ NONE_AUTH = 0x01,
++ WPA_AUTH = 0x02,
++ WPA_PSK_AUTH = 0x03,
++ WPA2_AUTH = 0x04,
++ WPA2_PSK_AUTH = 0x05,
++ WPA_AUTH_CCKM = 0x06,
++ WPA2_AUTH_CCKM = 0x07,
++ } AUTH_MODE;
++ typedef enum {
++ NONE_CRYPT = 0x01,
++ WEP_CRYPT = 0x02,
++ TKIP_CRYPT = 0x03,
++ AES_CRYPT = 0x04,
++ } CRYPTO_TYPE;
++ typedef enum {
++ CONNECT_ASSOC_POLICY_USER = 0x0001,
++ CONNECT_SEND_REASSOC = 0x0002,
++ CONNECT_IGNORE_WPAx_GROUP_CIPHER = 0x0004,
++ CONNECT_PROFILE_MATCH_DONE = 0x0008,
++ CONNECT_IGNORE_AAC_BEACON = 0x0010,
++ } WMI_CONNECT_CTRL_FLAGS_BITS;
++
++ pairwiseCryptoLen and groupCryptoLen are valid when the respective
++ CryptoTypesis WEP_CRYPT, otherwise this value should be 0. This is the length in
++ bytes.
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ CREATE_PSTREAM
++
++Synopsis
++ The host uses this command to create a new prioritized data endpoint between the
++ host and the AR6000 device that carries a prioritized stream of data. If the AP that the
++ device connects to requires TSPEC stream establishment, the device requests the
++ corresponding TSPEC with the AP. The maximum and minimum service interval
++ ranges from 0 – 0x7FFFFFFF (ms), where 0 = disabled. The device does not send a
++ reply event for this command, as it is always assumed the command has succeeded.
++ An AP admission control response comes to the host via a WMI_CAC_INDICATION
++ event, once the response for the ADDTS frame comes.
++
++ Examples of cases where reassociation is generated (when WMM) and cases where
++ ADDTS is generated (when WMM and enabling ACM) are when:
++ Changing UAPSD flags in WMM mode, reassociation is generated
++ Changing the interval of sending auto QoS Null frame in WMM mode;
++ reassociation is not generated
++ Issuing a command with same previous parameters in WMM mode and enabling
++ ACM, an ADDTS request is generated
++ Changing the interval of a QoS null frame sending in WMM mode and enabling
++ ACM, an ADDTS request is generated
++ Issuing the command in disconnected state, reassociation or ADDTS is not
++ generated but the parameters are available after (re)association
++
++Command
++ --createqos <user priority> <direction> <traffic class>
++<trafficType> <voice PS capability> <min service interval> <max
++service interval> <inactivity interval> <suspension interval>
++<service start time> <tsid> <nominal MSDU> <max MSDU> <min data
++rate> <mean data rate> <peak data rate> <max burst size> <delay
++bound> <min phy rate> <sba> <medium time> where:
++
++ <user priority>
++ 802.1D user priority range (0–7)
++ <direction>
++ = 0 Tx (uplink) traffic
++ = 1 Rx (downlink) traffic
++ = 2 Bi-directional traffic
++ <traffic class>
++ = 1 BK
++ = 2 VI
++ = 3 VO
++ <trafficType>
++ = 0 Aperiodic
++ = 1 Periodic
++ <voice PS capability>
++ Specifies whether the voice power save mechanism
++ (APSD if AP supports it or legacy/simulated APSD
++ [using PS-Poll]) should be used
++ = 0 Disable voice power save for traffic class
++ = 1 Enable APSD voice power save for traffic class
++ = 2 Enable voice power save for all traffic classes
++ <min service interval>
++ (In ms)
++ <max service interval>
++ Inactivity interval (in ms) (0 = Infinite)
++ <suspension interval>
++ (In ms)
++ <service start time>
++ Service start time
++ <tsid>
++ TSID range (0–15)
++ <nominal MSDU>
++ Nominal MAC SDU size
++ <max MSDU>
++ Maximum MAC SDU size
++ <min data rate>
++ Minimum data rate (in bps)
++ <mean data rate>
++ Mean data rate (in bps)
++ <peak data rate>
++ Peak data rate (in bps)
++ <max burst size>
++ Maximum burst size (in bps)
++ <delay bound>
++ Delay bound
++ <min phy rate>
++ Minimum PHY rate (in bps)
++ <sba>
++ Surplus bandwidth allowance
++ <medium time>
++ Medium time in TU of 32-ms periods per sec
++ ... CREATE_PSTREAM (continued)
++
++Command Parameters
++ UINT8 trafficClass TRAFFIC_CLASS value
++ UINT8 traffic
++ Direction
++ DIR_TYPE value
++ UINT8 rxQueueNum
++ AR6000 device mailbox index (2 or 3)
++ corresponding to the endpoint the host
++ wishes to use to receive packets for the
++ prioritized stream
++ UINT8 trafficType TRAFFIC_TYPE value
++ UINT8 voicePS
++Capability
++ VOICEPS_CAP_TYPE value
++ UINT8 tsid Traffic stream ID
++ UINT8 userPriority 802.1D user priority
++ UINT16 nominalMSDU Nominal MSDU in octets
++ UINT16 maxMSDU Maximum MSDU in octets
++ UINT32 minServiceInt Minimum service interval: the min.
++ period of traffic specified (in ms)
++ UINT32 maxServiceInt Maximum service interval: the max.
++ period of traffic specified (in ms)
++ UINT32 inactivityInt Indicates how many ms an established
++ stream is inactive before the prioritized
++ data endpoint is taken down and the
++ corresponding T-SPEC deleted
++ UINT32 suspensionInt Suspension interval (in ms)
++ UINT32 service StartTime Service start time
++ UINT32 minDataRate Minimum data rate (in bps)
++ UINT32 meanDataRate Mean data rate (in bps)
++ UINT32 peakDataRate Peak data rate (in bps)
++ UINT32 maxBurstSize
++ UINT32 delayBound
++ UINT32 minPhyRate Minimum PHY rate for TSPEC (in bps)
++ UINT32 sba Surplus bandwidth allowance
++ UINT32 mediumTime Medium TSPEC time (in units of 32 ms)
++Command Values
++ {
++ WMM_AC_BE = 0 Best Effort
++ WMM_AC_BK = 1 Background
++ WMM_AC_VI = 2 Video
++ WMM_AC_VO = 3 Voice
++ All other values reserved
++ } TRAFFIC_CLASS
++ {
++ UPLINK_TRAFFIC = 0 From the AR6000 device to the AP
++ DOWNLINK_TRAFFIC = 1 From the AP to the AR6000 device
++ BIDIR_TRAFFIC = 2 Bi-directional traffic
++ All other values reserved
++ } DIR_TYPE
++ {
++ DISABLE_FOR_THIS_AC = 0
++ ENABLE_FOR_THIS_AC = 1
++ ENABLE_FOR_ALL_AC = 2
++ All other values reserved
++ } VOICEPS_CAP_TYPE
++
++ ... CREATE_PSTREAM (continued)
++
++
++ VI BE BK Supported, Y/N?
++ 0 0 0 0 Y
++ 0 0 0 1 Y
++ 0 0 1 0 N
++ 0 0 1 1 N
++ 0 1 0 0 Y
++ 0 1 0 1 Y
++ 0 1 1 0 N
++ 0 1 1 1 N
++ 1 0 0 0 Y
++ 1 0 0 1 Y
++ 1 0 1 0 N
++ 1 1 0 0 N
++ 1 1 0 1 Y
++ 1 1 0 0 N
++ 1 1 1 0 N
++ 1 1 1 1 Y
++
++Reset Value
++ No pstream is present after reset; each of the BE, BK, VI,VO pstreams must be created
++ (either implicitly by data flow or explicitly by user)
++
++Restrictions
++ This command can only be issued when the device is in the CONNECTED state. If
++ the device receives the command while in DISCONNECTED state, it replies with a
++ failure indication. At most four prioritized data endpoints can be created, one for
++ each AC.
++
++See Also
++ “DELETE_PSTREAM”
++=====================================================================
++
++Name
++ DELETE_BAD_AP
++
++Synopsis
++ The host uses this command to clear a particular entry in the bad AP table
++
++Command
++ wmiconfig eth1 --rmAP [--num=<index>] // used to clear a badAP
++ entry. num is index from 0-3
++
++Command Parameters
++ UINT8 badApIndex Index [0...n] that identifies the entry in the bad
++ AP table to delete
++
++Command Values
++ badApIndex = 0, 1, 2, 3
++ Entry in the bad AP table
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++See Also
++ “ADD_BAD_AP”
++
++=====================================================================
++
++
++Name
++ DELETE_CIPHER_KEY
++
++Synopsis
++ The host uses this command to delete a key that was previously added with the
++ “ADD_CIPHER_KEY” command.
++
++Command
++ TBD
++
++Command Parameters
++ UINT8 keyIndex Index (0...3) of the key to be deleted
++
++Command Values
++ keyIndex = 0, 1,2, 3 Key to delete
++
++Reset Value
++ None
++
++Restrictions
++ The host should not delete a key that is currently in use by the AR6000.
++
++See Also
++ “ADD_CIPHER_KEY”
++
++=====================================================================
++
++Name
++ DELETE_PSTREAM
++
++Synopsis
++ The host uses this command to delete a prioritized data endpoint created by a
++ previous “CREATE_PSTREAM” command
++
++Command
++ --deleteqos <trafficClass> <tsid>, where:
++
++ <traffic class>
++ = 0 BE
++ = 1 BK
++ = 2 VI
++ = 3 VO
++ <tsid>
++ The TSpec ID; use the -qosqueue option
++ to get the active TSpec IDs for each traffic class
++
++Command Parameters
++ A_UINT8 trafficClass Indicate the traffic class of the stream
++ being deleted
++
++Command Values
++ {
++ WMM_AC_BE = 0 Best effort
++ WMM_AC_BK = 1 Background
++ WMM_AC_VI = 2 Video
++ WMM_AC_VO = 3 Voice
++ } TRAFFIC CLASS
++
++ 0-15 for TSID
++
++Reply Values
++ N/A
++
++Restrictions
++ This command should only be issued after a “CREATE_PSTREAM” command has
++ successfully created a prioritized stream
++
++See Also
++ “CREATE_PSTREAM”
++
++=====================================================================
++
++
++Name
++ DELETE_WOW_PATTERN
++
++Synopsis
++ The host uses this command to remove a pre-specified pattern from the
++ WoW pattern list.
++
++Command
++ wmiconfig –delwowpattern <list-id> <pattern-id>
++
++Command Parameters
++ A_UINT8 filter_list_id ID of the list that contains the WoW filter
++ pattern to delete
++ A_UINT8 filter_id ID of the WoW filter pattern to delete
++
++Reply Parameters
++ None
++
++
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++See Also
++ “ADD_WOW_PATTERN”
++
++=====================================================================
++
++
++Name
++ EXTENSION
++
++Synopsis
++ The WMI message interface is used mostly for wireless control messages to a wireless
++ module applicable to wireless module management regardless of the target platform
++ implementation. However, some commands only peripherally related to wireless
++ management are desired during operation. These wireless extension commands may
++ be platform-specific or implementation-dependent.
++
++Command
++ N/A
++
++Command Parameters
++ Command-specific
++
++Command Values
++ Command-specific
++
++Reply Parameters
++ Command-specific
++
++Reset Values
++ None defined
++
++Restrictions
++ None defined
++
++=====================================================================
++
++
++Name
++ GET_BIT_RATE
++
++Synopsis
++ Used by the host to obtain the rate most recently used by the AR6000 device
++
++Command
++ wmiconfig eth1 --getfixrates
++
++Command Parameters
++ None
++
++
++
++Reply Parameters
++ INT8
++ rateIndex
++ See the “SET_BIT_RATE” command
++
++Reset Values
++ None
++
++Restrictions
++ This command should only be used during development/debug; it is not intended
++for use in production. It is only valid when the device is in the CONNECTED state
++
++See Also
++ “SET_BIT_RATE”
++
++=====================================================================
++
++
++Name
++ GET_CHANNEL_LIST
++
++Synopsis
++ Used by the host uses to retrieve the list of channels that can be used by the device
++ while in the current wireless mode and in the current regulatory domain.
++
++Command
++ TBD
++
++Command Parameters
++ None
++
++Reply Parameters
++ UINT8 reserved Reserved
++ UINT8 numberOfChannels Number of channels the reply contains
++ UINT16 channelList[numberOfChannels] Array of channel frequencies (in MHz)
++
++Reset Values
++ None defined
++
++Restrictions
++ The maximum number of channels that can be reported are 32
++
++=====================================================================
++
++
++Name
++ GET_FIXRATES
++
++Synopsis
++ Clears the current calculated RSSI and SNR value. RSSI and SNR are reported by
++ running-average value. This command will clear the history and have a fresh start for
++ the running-average mechanism.
++
++Synopsis
++ This returns rate-mask set via WMI_SET_FIXRATES to retrieve the current fixed rate
++ that the AR6001 or AR6001 is using. See “SET_FIXRATES”.
++
++Command
++ wmiconfig eth1 --getfixrates
++
++Command Parameters
++ A_UINT16 fixRateMask; Note: if this command is used prior to
++ using WMI_SET_FIXRATES, AR6000
++ returns 0xffff as fixRateMask, indicating
++ all the rates are enabled
++
++Reply Parameters
++ None
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++See Also
++ “SET_FIXRATES”
++
++=====================================================================
++
++
++
++Name
++ GET_PMKID_LIST_CMD
++
++Synopsis
++ Retrieves the list of PMKIDs on the firmware. The
++ WMI_GET_PMKID_LIST_EVENT is generated by the firmware.
++
++Command
++ TBD
++
++Command Parameters
++
++Reset Values
++ None
++
++Restrictions
++ None
++
++See Also
++ SET_PMKID_LIST_CMD GET_PMKID_LIST_EVENT
++
++=====================================================================
++
++
++Name
++ GET_ROAM_TBL
++
++Synopsis
++ Retrieve the roaming table maintained on the target. The response is reported
++ asynchronously through the ROAM_TBL_EVENT.
++
++Command
++ wmiconfig --getroamtable <roamctrl> <info>
++
++Command Parameters
++ A_UINT8 roamCtrlType;
++ A_UINT16 roamMode
++ A_UINT16 numEntries
++ WMI_BSS_ROAM_INFO bssRoamInfo[1]
++
++Reply Value
++ Reported asynchronously through the ROAM_TBL_EVENT
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++See Also
++ SET_KEEPALIVE
++
++=====================================================================
++
++
++Name
++ GET_TARGET_STATS
++
++Synopsis
++ The host uses this command to request that the target send the statistics that it
++ maintains. The statistics obtained from the target are accrued in the host every time
++ the GET_TARGET_STATS command is issued. The --clearStats option is added to
++ clear the target statistics maintained in the host.
++
++Command
++ wmiconfig --getTargetStats --clearStats
++
++Command Parameters
++ TARGET_STATS targetStats
++ WMI_TARGET_STATS
++ UINT8 clearStats
++
++
++Reply Value
++ RSSI return value (0–100)
++
++Reset Values
++ All statistics are cleared (zeroed)
++
++Restrictions
++ The --getTargetStats option must be used; the --clearStats option is also available also
++
++
++=====================================================================
++
++Name
++ GET_TX_PWR
++
++Synopsis
++ The host uses this command to retrieve the current Tx power level
++
++Command
++ wmiconfig -i eth1 --getpower
++
++Command Parameters
++ None
++
++Reply Parameters
++ UINT16 dbM The current Tx power level specified in dbM
++
++Reset Values
++ The maximum permitted by the regulatory domain
++
++Restrictions
++ None
++
++See Also
++ “SET_TX_PWR”
++
++=====================================================================
++
++
++Name
++ GET_WOW_LIST
++
++Synopsis
++ The host uses this command to retrieve the current list of WoW patterns.
++
++Command
++ wmiconfig –getwowlist <list-id>
++
++Command Parameters
++ A_UINT8 filter_list_id ID of the list of WoW patterns to retrieve
++
++Reply Value(s)
++ A_UINT16 num_filters Number of WoW patterns contained in the list
++ A_UINT8 wow_mode Current mode of WoW (enabled or disabled)
++ A_UINT8 host_mode Current host mode (asleep or awake)
++ WOW_FILTER wow_filters[1]
++ Contents of the WoW filter pattern list
++ (contains mask, pattern, offset and size
++ information for each of the patterns)
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++See Also
++ “SET_WSC_STATUS”
++
++=====================================================================
++
++
++Name
++ LQ_THRESHOLD_PARAMS
++
++Synopsis
++ Sets Link Quality thresholds, the sampling will happen at every unicast data frame
++ Tx if a certain threshold is met, and the corresponding event will be sent to the host.
++
++Command
++ --lqThreshold <enable> <upper_threshold_1> ...
++ <upper_threshold_4> <lower_threshold_1> ... <lower_threshold_4>
++
++Command Parameters
++ <enable> = 0 Disable link quality sampling
++ = 1 Enable link quality sampling
++ <upper_threshold_x> Above thresholds (value in [0,100]), in
++ ascending order
++ <lower_threshold_x> Below thresholds (value in [0,100]), in
++ ascending order
++
++Command Values
++ See command parameters
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ OPT_TX_FRAME
++
++Synopsis
++ Special feature, sends a special frame.
++
++Command
++ wmiconfig --sendframe <frmType> <dstaddr> <bssid> <optIEDatalen>
++ <optIEData>
++
++Command Parameters
++ {
++ A_UINT16 optIEDataLen;
++ A_UINT8 frmType;
++ A_UINT8 dstAddr[ATH_MAC_LEN];
++ A_UINT8 bssid[ATH_MAC_LEN];
++ A_UINT8 optIEData[1];
++ } WMI_OPT_TX_FRAME_CMD;
++
++Command Values
++ <frmtype> = 1 Probe request frame
++ = 2 Probe response frame
++ = 3 CPPP start
++ = 4 CPPP stop
++
++Reset Value
++ None defined
++
++Restrictions
++ Send a special frame only when special mode is on.
++
++=====================================================================
++
++
++Name
++ RECONNECT
++
++Synopsis
++ This command requests a reconnection to a BSS to which the AR6000 device was
++ formerly connected
++
++Command
++ TBD
++
++Command Parameters
++ UINT16 channel Provides a hint as to which channel was
++ used for a previous connection
++ UINT8 bssid[6] If set, indicates which BSSID to connect to
++
++Command Values
++ None
++
++Reset Values
++ None
++
++Restrictions
++ None
++
++See Also
++ “CONNECT_CMD”
++
++=====================================================================
++
++
++Name
++ RSSI_THRESHOLD_PARAMS
++
++Synopsis
++ Configures how the AR6000 device monitors and reports signal strength (RSSI) of the
++ connected BSS, which is used as a link quality metric. The four RSSI threshold sets (in
++ dbM) of the host specification divide the signal strength range into six segments.
++ When signal strength increases or decreases across one of the boundaries, an
++ RSSI_THRESHOLD event is signaled to the host. The host may then choose to take
++ action (such as influencing roaming).
++
++Command
++ wmiconfig eth1 --rssiThreshold <weight> <pollTime>
++ <above_threshold_val_1> ... <above_threshold_tag_6>
++ <above_threshold_val_6>
++ <below_threshold_tag_1> <below_threshold_val_1> ...
++ <below_threshold_tag_6> <below_threshold_val_6>
++
++Command Parameters
++ UINT8 weight Range in [1, 16] used to calculate average RSSI
++ UINT32 pollTime RSSI (signal strength) sampling frequency in
++ seconds (if pollTime = 0, single strength
++ sampling is disabled)
++ USER_RSS__THOLD tholds[12] Thresholds (6 x 2)
++
++Command Values
++ None defined
++
++Reset Values
++ pollTime is 0, and sampling is disabled
++
++Restrictions
++ Can only be issued if the AR6000 device is connected
++
++
++=====================================================================
++
++Name
++ SCAN_PARAMS
++
++Synopsis
++ The minact parameter determines the minimum active channel dwell time, within
++ which if the STA receives any beacon, it remains on that channel until the maxact
++ channel dwell time. If the STA does not receive a beacon within the minact dwell
++ time, it switches to scan the next channel.
++
++Command
++ wmiconfig -scan -minact=<ms> --maxact=<ms>
++
++Command Parameters
++ UINT16 maxact Channel dwell time (in ms), default = 0
++ UINT16 minact Channel dwell time (in ms), default = 105
++
++Command Values
++ See channel parameters
++
++Reset Values
++ None defined
++
++Restrictions
++ The minact value should be greater than 0; maxact should be between 5–65535 ms
++ and greater than minact
++
++=====================================================================
++
++
++Name
++ SET_ACCESS_PARAMS
++
++Synopsis
++ Allows the host to set access parameters for the wireless network. A thorough
++ understanding of IEEE 802.11 is required to properly manipulate these parameters.
++
++Command
++ wmiconfig eth1 --acparams --txop <limit> --cwmin <0-15>
++ --cwmax <0-15> --aifsn<0-15>
++
++Command Parameters
++ UINT16 txop The maximum time (expressed in units of
++ 32 ms) the device can spend transmitting
++ after acquiring the right to transmit
++ UINT8 eCWmin Minimum contention window
++ UINT8 eCWmax Maximum contention window
++ UINT8 aifsn The arbitration inter-frame space number
++
++Command Values
++ None
++
++Reset Values
++ Reasonable defaults that vary, between endpoints (prioritized streams)
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_ADHOC_BSSID
++
++Synopsis
++ Allows the host to set the BSSID for an ad hoc network. If a network with this BSSID
++ is not found, the target creates an ad hoc network with this BSSID after the connect
++ WMI command is triggered (e.g., by the SIOCSIWESSID IOCTL).
++
++Command
++ wmiconfig eth1 --adhocbssid <bssid>
++
++Command Parameters
++ A_UINT8 bssid[ATH_MAC_LEN] BSSID is specified in xx:xx:xx:xx:xx:xx format
++
++Command Values
++ None
++
++Reset Values
++ None
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_AKMP_PARAMS
++
++Synopsis
++ Enables or disables multi PMKID mode.
++
++Command
++ wmiconfig eth1 --setakmp --multipmkid=<on/off>
++
++Command Parameters
++ typedef struct {
++ A_UINT32 akmpInfo;
++ } WMI_SET_AKMP_PARAMS_CMD;
++
++Command Values
++ akmpInfo;
++ bit[0] = 0
++ MultiPMKID mode is disabled and PMKIDs that
++ were set using the WMI_SET_PMKID_CMD are
++ used in the [Re]AssocRequest frame.
++ bit[0] = 1
++ MultiPMKID mode is enabled and PMKIDs issued
++ by the WMI_SET_PMKID_LIST_CMD are used in
++ the next [Re]AssocRequest sent to the AP.
++
++Reset Values
++ MultiPMKID mode is disabled
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_APPIE
++
++Synopsis
++ Add an application-specified IE to a management frame. The maximum length is
++ 76 bytes. Including the length and the element ID, this translates to 78 bytes.
++
++Command
++ wmiconfig --setappie <frame> <IE>, where:
++
++ frame
++ One of beacon, probe, respon, assoc
++
++ IE
++ A hex string beginning with DD (if = 0, no
++ IE is sent in the management frame)
++
++Command Parameters
++ mgmtFrmType;
++ A WMI_MGMT_FRAME_TYPE
++
++ ieLen;
++ Length of the IE to add to the GMT frame
++
++Command Values
++ None
++
++Reset Value
++ None defined
++
++Restrictions
++ Supported only for the probe request and association request management frame
++types. Also, only one IE can be added per management frame type.
++
++=====================================================================
++
++
++Name
++ SET_ASSOC_INFO
++
++Synopsis
++ The host uses this command to specify any information elements (IEs) it wishes the
++ AR6000 device to add to all future association and reassociation requests. IEs must be
++ correct and are used as is by the device. IEs specified through this command are
++ cleared with a DISCONNECT.
++
++Command
++ wmiconfig eth1 --setAssocIe <IE>
++
++Command Parameters
++ UINT8 ieType Used directly in 802.11 frames
++ UINT8 bufferSize Size of assocInfo (in bytes) ranging from
++ 0–240. If = 0, previously set IEs are cleared.
++ UINT8 assocInfo[bufferSize] Used directly in 802.11 frames
++
++Command Values
++ None
++
++Reset Values
++ IEs are cleared
++
++Restrictions
++ This command can only be issued in the DISCONNECTED state
++
++=====================================================================
++
++
++Name
++ SET_AUTHMODE
++
++Synopsis
++ Sets the 802.11 authentication mode of reconnection
++
++Command
++ wmiconfig eth1 --setauthmode <mode>
++
++Command Parameters
++ UINT8 mode
++
++Command Values
++ mode = 0x00 Proceed with authentication during reconnect
++ = 0x01 Do not proceed with authentication during reconnect
++
++Reset Values
++ Authentication
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_BEACON_INT
++
++Synopsis
++ Sets the beacon interval for an ad hoc network. Beacon interval selection may have an
++ impact on power savings. To some degree, a longer interval reduces power
++ consumption but also decreases throughput. A thorough understanding of IEEE
++ 802.11 ad hoc networks is required to use this command effectively.
++
++Command
++ wmiconfig eth1 --ibssconintv
++
++Command Parameters
++ UINT16 beaconInterval Specifies the beacon interval in TU units (1024 ms)
++
++Command Values
++ None
++
++Reset Values
++ The default beacon interval is 100 TUs (102.4 ms)
++
++Restrictions
++ This command can only be issued before the AR6000 device starts an ad hoc network
++
++See Also
++ “SET_IBSS_PM_CAPS”
++
++=====================================================================
++
++
++Name
++ SET_BIT_RATE
++
++Synopsis
++ The host uses this command to set the AR6000 device to a specific fixed rate.
++
++Command
++ wmiconfig eth1 --setfixrates <rate_0> ... <rate_n>
++
++Command Parameters
++ INT8 rateIndex
++ A WMI_BIT_RATE value
++ {
++ RATE_AUTO = -1
++ RATE_1Mb = 0
++ RATE_2Mb = 1
++ RATE_5_5M = 2
++ RATE_11Mb = 3
++ RATE_6Mb = 4
++ RATE_9Mb = 5
++ RATE_12Mb = 6
++ RATE_18Mb = 7
++ RATE_24Mb = 8
++ RATE_36Mb = 9
++ RATE_48Mb = 10
++ RATE_54Mb = 11
++ } WMI_BIT_RATE
++
++
++Command Values
++ See command parameters
++
++Reset Values
++ The dynamic rate is determined by the AR6000 device
++
++Restrictions
++ This command is intended for use only during development/debug; it is not
++intended for use in production
++
++See Also
++ “GET_BIT_RATE”
++
++=====================================================================
++
++
++Name
++ SET_BMISS_TIME
++
++Synopsis
++ This command sets the beacon miss (BMISS) time, which the AR6000 hardware use
++ to recognize missed beacons. When an excessive number (15) of consecutive beacons
++ are missed, the AR6000 consider switching to a different BSS. The time can be
++ specified in number of beacons or in TUs.
++
++Command(s)
++ wmiconfig eth1 --setbmissbeacons=<val>
++ wmiconfig eth1 --setbmisstime=<val>
++
++Command Parameters
++ UINT16 bmissTime Specifies the beacon miss time
++ [1000...5000] in TUs (1024 ms)
++ UINT16 bmissbeacons Specifies the number of beacons [5...50]
++
++Command Values
++ None
++
++Reset Values
++ bmissTime is 1500 TUs (1536 ms)
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_BSS_FILTER
++
++Synopsis
++ The host uses this to inform the AR6000 device of the types of networks about which
++ it wants to receive information from the “BSSINFO” event. As the device performs
++ either foreground or background scans, it applies the filter and sends “BSSINFO”
++ events only for the networks that pass the filter. If any of the bssFilter or the ieMask
++ filter matches, a BSS Info is sent to the host. The ieMask currently is used as a match
++ for the IEs in the beacons, probe reponses and channel switch action management
++ frame. See also “Scan and Roam” on page C-1.
++
++ The BSS filter command has been enhanced to support IE based filtering. The IEs can
++ be specified as a bitmask through this command using this enum.
++
++Command
++ wmiconfig eth1 –filter = <filter> --ieMask 0x<mask>
++
++Command Parameters
++ UINT8 BssFilter
++
++ Command Values
++ typedef struct {
++ A_UINT8 bssFilter; See WMI_BSS_FILTER
++ A_UINT32 ieMask;
++ } __ATTRIB_PACK WMI_BSS_FILTER_CMD;
++
++ The ieMask can take this combination of values:
++
++ enum {
++ BSS_ELEMID_CHANSWITCH = 0x01
++ BSS_ELEMID_ATHEROS = 0x02,
++ }
++
++Reply Value
++ None
++
++Reset Value
++ BssFilter = NONE_BSS_FILTER (0)
++
++Restrictions
++ None
++
++See Also
++ “CONNECT_CMD”
++
++=====================================================================
++
++
++Name
++ SET_BT_PARAMS
++
++Synopsis
++ This command is used to set the status of a Bluetooth stream or set Bluetooth
++ coexistence register parameters. The stream may be an SCO or an A2DP stream and
++ its status can be started/stopped/suspended/resumed.
++
++Command
++ wmiconfig –setBTparams <paramType> <params>
++
++Command Parameters
++ struct {
++ union {
++ BT_PARAMS_SCO scoParams;
++ BT_PARAMS_A2DP a2dpParams;
++ BT_PARAMS_MISC miscParams;
++ BT_COEX_REGS regs;
++ } info;
++ A_UINT8 paramType;
++ struct {
++ A_UINT8 noSCOPkts; Number of SCO packets between consecutive PS-POLLs
++ A_UINT8 pspollTimeout;
++ A_UINT8 stompbt;
++ } BT_PARAMS_SCO;
++ struct {
++ A2DP BT stream parameters
++ A_UINT32 period;
++ A_UINT32 dutycycle;
++ A_UINT8 stompbt;
++ } BT_PARAMS_A2DP;
++ struct {
++ union {
++ WLAN_PROTECT_POLICY_TYPE protectParams;
++ A_UINT16 wlanCtrlFlags;
++ }info;
++ A_UINT8 paramType;
++ } BT_PARAMS_MISC;
++ struct {
++ BT coexistence registers values
++ A_UINT32 mode; Coexistence mode
++ A_UINT32 scoWghts; WLAN and BT weights
++ A_UINT32 a2dpWghts;
++ A_UINT32 genWghts;
++ A_UINT32 mode2; Coexistence mode2
++ A_UINT8 setVal;
++ } BT_COEX_REGS;
++
++Command Values
++ None defined
++
++Reset Value
++ None
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_BT_STATUS
++
++Synopsis
++ Sets the status of a Bluetooth stream. The stream may be a SCO or an A2DP stream
++ and its status can be started/stopped/suspended/resumed.
++
++Command
++ wmiconfig –setBTstatus <streamType> <status>
++
++Command Parameters
++ {
++ A_UINT8 streamType; Stream type
++ A_UINT8 status; Stream status
++ }WMI_SET_BT_STATUS_CMD;
++
++Command Values
++ {
++ BT_STREAM_UNDEF = 0
++ BT_STREAM_SCO
++ SCO stream
++ BT_STREAM_A2DP
++ A2DP stream
++ BT_STREAM_MAX
++ } BT_STREAM_TYPE;
++
++ {
++ BT_STATUS_UNDEF = 0
++ BT_STATUS_START
++ BT_STATUS_STOP
++ BT_STATUS_RESUME
++ BT_STATUS_SUSPEND
++ BT_STATUS_MAX
++ } BT_STREAM_STATUS;
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_CHANNEL_PARAMETERS
++
++Synopsis
++ Configures various WLAN parameters related to channels, sets the wireless mode,
++ and can restrict the AR6000 device to a subset of available channels. The list of
++ available channels varies depending on the wireless mode and the regulatory
++ domain. The device never operates on a channel outside of its regulatory domain. The
++ device starts to scan the list of channels right after this command.
++
++Command
++ wmiconfig eth1 --wmode <mode> <list>
++
++Command Parameters
++ UINT8 phyMode See Values below.
++ UINT8 numberOfChannels
++ Number of channels in the channel array that
++ follows. If = 0, then the device uses all of the
++ channels permitted by the regulatory domain
++ and by the specified phyMode.
++ UINT16 channel[numberOfChannels]
++ Array listing the subset of channels (expressed
++ as frequencies in MHz) the host wants the
++ device to use. Any channel not permitted by
++ the specified phyMode or by the specified
++ regulatory domain is ignored by the device.
++
++Command Values
++ phyMode = {
++ Wireless mode
++ 11a = 0x01
++ 11g = 0x02
++ 11ag = 0x03
++ 11b = 0x04
++ 11g only = 0x05
++ }
++
++Reset Values
++ phyMode
++ 11ag
++ 802.11a/g modules
++ 11g
++ 802.11g module
++ channels
++ Defaults to all channels permitted by the
++ current regulatory domain.
++
++Restrictions
++ This command, if issued, should be issued soon after reset and prior to the first
++ connection. This command should only be issued in the DISCONNECTED state.
++
++=====================================================================
++
++
++Name
++ SET_DISC_TIMEOUT
++
++Synopsis
++ The host uses this command to configure the amount of time that the AR6000 should
++ spend when it attempts to reestablish a connection after losing link with its current
++ BSS. If this time limit is exceeded, the AR6000 send a “DISCONNECT” event. After
++ sending the “DISCONNECT” event the AR6000 continues to attempt to reestablish a
++ connection, but they do so at the interval corresponding to a foreground scan as
++ established by the “SET_SCAN_PARAMS” command.
++
++ A timeout value of 0 indicates that the AR6000 will disable all autonomous roaming,
++ so that the AR6000 will not perform any scans after sending a “DISCONNECT”
++ event to the host. The state is maintained until a shutdown or host sets different
++ timeout value from 0.
++
++Command
++ wmiconfig eth1 --disc=<timeout in seconds>
++
++Command Parameters
++ UINT8 disconnectTimeout
++ Specifies the time limit (in seconds) after
++ which a failure to reestablish a connection
++ results in a “DISCONNECT” event
++
++Command Values
++ None
++
++Reset Values
++ disconnectTimeout is 10 seconds
++
++Restrictions
++ This command can only be issued while in a DISCONNECTED state
++
++=====================================================================
++
++
++Name
++ SET_FIXRATES
++
++Synopsis
++ By default, the AR6000 device uses all PHY rates based on mode of operation. If the
++ host application requires the device to use subset of supported rates, it can set those
++ rates with this command. In 802.11g mode, the AR6000 device takes the entire
++ 802.11g basic rate set and the rates specified with this command and uses it as the
++ supported rate set.
++
++ This rate set is advertised in the probe request and the assoc/re-assoc request as
++ supported rates. Upon successful association, the device modifies the rate set pool
++ using the: intersection of AP-supported rates with the union of the 802.11g basic rate
++ set and rates set using this command. The device picks transmission rates from this
++ pool based on a rate control algorithm.
++
++Command
++ TBD
++
++Command Parameters
++ A_UINT16 fixRateMask;
++ The individual bit is an index for rate table,
++ and setting the that index to 1 would set that
++ corresponding rate. E.g., fixRateMask = 9
++ (1001) sets 1 Mbps and 11 Mbps.
++
++Command Values
++ None
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++See Also
++ “GET_FIXRATES”
++
++=====================================================================
++
++
++Name
++ SET_WHAL_PARAM
++
++Synopsis
++ An internal AR6000 command that is used to set certain hardware parameters. The
++ description of this command is in $WORKAREA/include/halapi.h.
++
++Command
++ TBD
++
++Command Parameters
++ ATH_HAL_SETCABTO_CMDID
++ Sets the timeout waiting for the multicast
++ traffic after a DTIM beacon (in TUs).
++
++Command Values
++ None
++
++Reset Value
++ Default = 10 TUs
++
++Restrictions
++ This command should be executed before issuing a connect command.
++
++=====================================================================
++
++
++Name
++ SET_HOST_SLEEP_MODE
++
++Synopsis
++ The host uses this command to set the host mode to asleep or awake. All packets are
++ delivered to the host when the host mode is awake. When host mode is asleep, only if
++ WoW is enabled and the incoming packet matches one of the specified WoW
++ patterns, will the packet be delivered to the host. The host will also be woken up by
++ the target for pattern-matching packets and important events.
++
++Command
++ wmiconfig –sethostmode=<asleep/awake>
++
++Command Parameters
++ A_BOOL awake Set the host mode to awake
++ A_BOOL asleep Set the host mode to asleep
++
++Command Values
++ 1 = awake, 0 = asleep
++
++Reset Value
++ None defined (default host mode is awake)
++
++Restrictions
++ None
++
++
++=====================================================================
++
++Name
++ SET_IBSS_PM_CAPS
++
++Synopsis
++ Used to support a non-standard power management scheme for an ad hoc wireless
++ network consisting of up to eight stations (STAs) that support this form of power
++ saving (e.g., Atheros-based STAs). A thorough understanding of IEEE 802.11 ad hoc
++ networks is required to use this command effectively.
++
++Command
++ wmiconfig eth1 --ibsspmcaps --ps=<enable/disable>
++ --aw=<ATIM Windows in ms>
++ --ttl=<Time to live in number of beacon periods>
++ --to=<timeout in ms>
++
++Command Parameters
++ UINT8 power_saving
++ = 0
++ The non-standard power saving scheme is
++ disabled and maximum throughput (with no
++ power saving) is obtained.
++
++ = 1
++ Ad hoc power saving scheme is enabled (but
++ throughput may be decreased)
++
++ UINT16 atim_windows
++ Specifies the length (in ms) of the ad hoc traffic
++ indication message (ATIM) windows used in an ad
++ hoc network. All Atheros-based STAs that join the
++ network use this duration ATIM window.
++
++ The duration is communicated between wireless
++ STAs through an IE in beacons and probe responses.
++
++ The host sets atim_windows to control trade-offs
++ between power use and throughput. The value
++ chosen should be based on the beacon interval (see
++ the “SET_BEACON_INT” command) on the
++ expected number of STAs in the IBSS, and on the
++ amount of traffic and traffic patterns between STAs.
++
++ UINT16 timeout_value
++ Specifies the timeout (in ms). The value is the same
++ for all ad hoc connections, but tracks separately for
++ each.
++
++ Applicable only for a beacon period and used to
++ derive actual timeout values on the Tx and Rx sides.
++ On the Tx side, the value defines a window during
++ which the STA accepts the frame(s) from the host for a
++ particular connection. Until closed, the window
++ restarts with every frame received from the host. On
++ the Rx side, indicates the time until which the STA
++ continues accepting frames from a particular
++ connection. The value resets with every frame
++ received. The value can be used to determine the
++ trade off between throughput and power.
++ Default = 10 ms
++
++ UINT8 ttl
++ Specifies the value in number of beacon periods. The
++ value is used to set a limit on the time until which a
++ frame is kept alive in the AR6001 before being
++ discarded. Default = 5
++
++Command Values
++ None
++
++Reset Values
++ By default, power_saving is enabled with atim_window = 20 ms
++
++Restrictions
++ Can only be issued before the AR6000 starts an ad hoc network
++
++See Also
++ “SET_BEACON_INT”
++
++=====================================================================
++
++
++
++Name
++ SET_LISTEN_INT
++
++Synopsis
++ The host uses this command to request a listen interval, which determines how often
++ the AR6000 device should wake up and listen for traffic. The listen interval can be set
++ by the TUs or by the number of beacons. The device may not be able to comply with
++ the request (e.g., if the beacon interval is greater than the requested listen interval, the
++ device sets the listen interval to the beacon interval). The actual listen interval used
++ by the device is available in the “CONNECT” event.
++
++Command
++ wmiconfig eth1 --listen=<#of TUs, can range from 15 to 3000>
++
++ --listenbeacons=<#of beacons, can range from 1 to 50>
++
++Command Parameters
++ UINT16 listenInterval
++ Specifies the listen interval in Kms
++ (1024 ms), ranging from 100 to 1000
++
++ UINT16 listenbeacons
++ Specifies the listen interval in beacons,
++ ranging from 1 to 50
++
++Command Values
++ None
++
++Reset Values
++ The device sets the listen interval equal to the beacon interval of the AP it associates
++ to.
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_LPREAMBLE
++
++Synopsis
++ Overrides the short preamble capability of the AR6000 device
++
++Command
++ TBD
++
++Command Parameters
++ WMI_LPREAMBLE_DISABLED
++ The device is short-preamble capable
++
++ WMI_LPREAMBLE_ENABLED
++ The device supports only the long-
++ preamble mode
++
++Command Values
++ None
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++
++=====================================================================
++
++Name
++ SET_MAX_SP_LEN
++
++Synopsis
++ Set the maximum service period; indicates the number of packets the AR6001 can
++ receive from the AP when triggered
++
++Command
++ wmiconfig eth1 --setMaxSPLength <maxSPLen>
++
++Command Parameters
++ UINT8 maxSPLen
++ An APSD_SP_LEN_TYPE value
++
++Command Values
++ {
++ DELIVER_ALL_PKT = 0x0
++ DELIVER_2_PKT = 0x1
++ DELIVER_4_PKT = 0x2
++ DELIVER_6_PKT = 0x3
++ }APSD_SP_LEN_TYPE
++
++
++Reset Values
++ maxSPLen is DELIVER_ALL_PKT
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_OPT_MODE
++
++Synopsis
++ Special feature, sets the special mode on/off
++
++Command
++ wmiconfig eth1 --mode <mode>
++ Set the optional mode, where mode is special or off
++
++Command Parameters
++ enum {
++ SPECIAL_OFF
++ SPECIAL_ON
++ } OPT_MODE_TYPE;
++
++Command Values
++
++Reset Value
++ Mode = Off
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_PMKID
++
++Synopsis
++ The host uses this command to enable or disable a pairwise master key ID (PMKID)
++ in the AR6000 PMKID cache. The AR6000 clears its PMKID cache on receipt of a
++ DISCONNECT command from the host. Individual entries in the cache might be
++ deleted as the AR6000 detect new APs and decides to remove old ones.
++
++Command
++ wmiconfig eth1 --setbsspmkid --bssid=<aabbccddeeff>
++ --bsspmkid=<pmkid>
++
++Command Parameters
++ UINT8 bssid[6]
++ The MAC address of the AP that the
++ PMKID corresponds to (6 bytes in hex
++ format)
++
++ UINT8 enable
++ Either PMKID_DISABLE (0) to disable
++ the PMKID or PMKID_ENABLE (1) to
++ enable it (16 bytes in hex format)
++
++ UINT8 pmkid[16]
++ Meaningful only if enable is
++ PMKID_ENABLE, when it is the PMKID
++ that the AR6000 should use on the next
++ reassociation with the specified AP
++
++Command Values
++ enable
++ = 0 (disable), 1 (enable)
++ PKMID enabled/disabled
++
++Reset Values
++ None defined
++
++Restrictions
++ Only supported in infrastructure networks
++
++=====================================================================
++
++
++Name
++ SET_PMKID_LIST_CMD
++
++Synopsis
++ Configures the list of PMKIDs on the firmware.
++
++Command
++ wmiconfig --setpmkidlist --numpmkid=<n> --pmkid=<pmkid_1>
++ ... --pmkid=<pmkid_n>
++
++ Where n is the number of pmkids (maximum = 8) and pmkid_i is the ith pmkid (16
++ bytes in hex format)
++
++Command Parameters
++ {
++ A_UINT8 pmkid[WMI_PMKID_LEN];
++ } __ATTRIB_PACK WMI_PMKID;
++
++ {
++ A_UINT32 numPMKID;
++ WMI_PMKID pmkidList[WMI_MAX_PMKID_CACHE];
++ } __ATTRIB_PACK WMI_SET_PMKID_LIST_CMD;
++
++Command Values
++ None
++
++Reset Values
++ None
++
++Restrictions
++ Supported only in infrastructure modes
++
++=====================================================================
++
++
++Name
++ SET_POWER_MODE
++
++Synopsis
++ The host uses this command to provide the AR6000 device with guidelines on the
++ desired trade-off between power utilization and performance.
++
++ In normal power mode, the device enters a sleep state if they have nothing to do,
++ which conserves power but may cost performance as it can take up to 2 ms to
++ resume operation after leaving sleep state.
++
++ In maximum performance mode, the device never enters sleep state, thus no time
++ is spent waking up, resulting in higher power consumption and better
++ performance.
++
++Command
++ TBD
++
++Command Parameters
++ UINT8 powerMode
++ WMI_POWER_MODE value
++ {
++ REC_POWER = 1
++ (Recommended setting) Tries to conserve
++ power without sacrificing performance
++ MAX_PERF_POWER = 2
++ Setting that maximizes performance at
++ the expense of power
++
++ All other values are reserved
++ } WMI_POWER_MODE
++
++Command Values
++ See command parameters
++
++Reset Values
++ powerMode is REC_POWER
++
++Restrictions
++ This command should only be issued in the DISCONNECTED state for the
++ infrastructure network.
++
++ For a PM-disabled ad hoc network, the power mode should remain in
++ MAX_PERF_POWER.
++
++ For a PM-enabled ad hoc network, the device can have REC_POWER or
++ MAX_PERF_POWER set, but either way it must follow the power save ad hoc
++ protocol. The host can change power modes in the CONNECTED state.
++
++ Host changes to the PS setting when the STA is off the home channel take no effect
++ and cause a TARGET_PM_FAIL event.
++
++=====================================================================
++
++
++Name
++ SET_POWER_PARAMS
++
++Synopsis
++ The host uses this command to configure power parameters
++
++Command
++ wmiconfig eth1 --pmparams --it=<ms> --np=<number of PS POLL>
++ --dp=<DTIM policy: ignore/normal/stick>
++
++Command Parameters
++ UINT16 idle_period
++ Length of time (in ms) the AR6000 device
++ remains awake after frame Rx/Tx before going
++ to SLEEP state
++
++ UINT16 pspoll_number
++ The number of PowerSavePoll (PS-poll)
++ messages the device should send before
++ notifying the AP it is awake
++
++ UINT16 dtim_policy
++ A WMI_POWER_PARAMS_CMD value
++
++ {
++ IGNORE_DTIM =1
++ The device does not listen to any content after
++ beacon (CAB) traffic
++ NORMAL_DTIM = 2
++ DTIM period follows the listen interval (e.g., if
++ the listen interval is 4 and the DTIM period is 2,
++ the device wakes up every fourth beacon)
++ STICK_DTIM = 3
++ Device attempt to receive all CAB traffic (e.g., if
++ the DTIM period is 2 and the listen interval is 4,
++ the device wakes up every second beacon)
++ } WMI_POWER_PARAMS_CMD
++
++Command Parameters
++ See command parameters
++
++Reset Values
++ idle_period
++ 200 ms
++
++ pspoll_number
++ = 1
++
++ dtim_policy
++ = NORMAL_DTIM
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_POWERSAVE_PARAMS
++
++Synopsis
++ Set the two AR6000 power save timers (PS-POLL timer and APSD trigger timer) and
++ the two ASPD TIM policies
++
++Command
++ wmiconfig eth1--psparams --psPollTimer=<psPollTimeout in ms>
++ --triggerTimer=<triggerTimeout in ms> --apsdTimPolicy=<ignore/
++ adhere> --simulatedAPSDTimPolicy=<ignore/adhere>
++
++Command Parameters
++ typedef struct {
++ A_UINT16 psPollTimeout;
++ Timeout (in ms) after sending PS-POLL; the
++ AR6000 device sleeps if it does not receive a
++ data packet from the AP
++
++ A_UINT16 triggerTimeout;
++ Timeout (in ms) after sending a trigger; the
++ device sleeps if it does not receive any data
++ or null frame from the AP
++
++ APSD_TIM_POLICY apsdTimPolicy;
++ TIM behavior with queue APSD enabled
++
++ APSD_TIM_POLICY simulatedAPSD
++
++ TimPolicy;
++ TIM behavior with simulated APSD
++ enabled
++
++ typedef enum {
++ IGNORE_TIM_ALL_QUEUES_APSD = 0,
++ PROCESS_TIM_ALL_QUEUES_APSD = 1,
++ IGNORE_TIM_SIMULATED_APSD = 2,
++ POWERSAVE_TIMERS_POLICY = 3,
++ } APSD_TIM_POLICY;
++
++Command Values
++ None
++
++Reset Values
++ psPollTimeout is 50 ms; triggerTimeout is 10 ms;
++ apsdTimPolicy = IGNORE_TIM_ALL_QUEUES_APSD;
++ simulatedAPSDTimPolicy = POWERSAVE_TIMERS_POLICY
++
++Restrictions
++ When this command is used, all parameters must be set; this command does not
++ allow setting only one parameter.
++
++=====================================================================
++
++
++Name
++ SET_PROBED_SSID
++
++Synopsis
++ The host uses this command to provide a list of up to MAX_PROBED_SSID_INDEX
++ (six) SSIDs that the AR6000 device should actively look for. It lists the active SSID
++ table. By default, the device actively looks for only the SSID specified in the
++ “CONNECT_CMD” command, and only when the regulatory domain allows active
++ probing. With this command, specified SSIDs are probed for, even if they are hidden.
++
++Command
++ wmiconfig eth1 --ssid=<ssid> [--num=<index>]
++
++Command Parameters
++ {
++ A_UINT8 numSsids
++ A number from 0 to
++ MAX_PROBED_SSID_INDEX indicating
++ the active SSID table entry index for this
++ command (if the specified entry index
++ already has an SSID, the SSID specified in
++ this command replaces it)
++
++ WMI_PROBED_SSID_INFO probedSSID[1]
++ } WMI_PROBED_SSID_CMD
++
++ {
++ A_UINT8 flag
++ WMI_SSID_FLAG indicates the current
++ entry in the active SSID table
++ A_UINT8 ssidLength
++ Length of the specified SSID in bytes.
++ If = 0, the entry corresponding to the
++ index is erased
++ A_UINT8 ssid[32]
++ SSID string actively probed for when
++ permitted by the regulatory domain
++ } WMI_PROBED_SSID_INFO
++
++Command Values
++ WMI_SSID_FLAG
++ {
++ DISABLE_SSID_FLAG = 0
++ Disables entry
++ SPECIFIC_SSID_FLAG = 1
++ Probes specified SSID
++ ANY_SSID_FLAG = 2
++ Probes for any SSID
++ } WMI_SSID_FLAG
++
++Reset Value
++ The entries are unused.
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_REASSOC_MODE
++
++Synopsis
++ Specify whether the disassociated frame should be sent or not upon reassociation.
++
++Command
++ wmiconfig eth1 --setreassocmode <mode>
++
++Command Parameters
++ UINT8 mode
++
++Command Values
++ mode
++ = 0x00
++ Send disassoc to a previously connected AP
++ upon reassociation
++ = 0x01
++ Do not send disassoc to previously connected
++ AP upon reassociation
++
++Reset Values
++ None defined
++
++Restrictions
++ None
++
++
++=====================================================================
++
++Name
++ SET_RETRY_LIMITS
++
++Synopsis
++ Allows the host to influence the number of times that the AR6000 device should
++ attempt to send a frame before they give up.
++
++Command
++ wmiconfig --setretrylimits <frameType> <trafficClass> <maxRetries>
++ <enableNotify>
++
++Command Parameters
++ {
++ UINT8 frameType
++ A WMI_FRAMETYPE specifying
++ which type of frame is of interest.
++ UINT8 trafficClass
++ Specifies a traffic class (see
++ “CREATE_PSTREAM”). This
++ parameter is only significant when
++ frameType = DATA_FRAMETYPE.
++ UINT8 maxRetries
++ Maximum number of times the
++ device attempts to retry a frame Tx,
++ ranging from WMI_MIN_RETRIES
++ (2) to WMI_MAX_RETRIES (15). If
++ the special value 0 is used,
++ maxRetries is set to 15.
++ A_UINT8 enableNotify
++ Notify when enabled
++ } WMI_RETRY_LIMIT_INFO
++
++ {
++ A_UINT8 numEntries
++ WMI_RETRY_LIMIT_INFO retryLimitInfo[1]
++ } WMI_SET_RETRY_LIMITS_CMD
++
++Command Values
++ {
++ MGMT_FRAMETYPE = 0 Management frame
++ CONTROL_FRAMETYPE = 1 Control frame
++ DATA_FRAMETYPE = 2 Data frame
++ } WMI_FRAMETYPE
++
++Reset Values
++ Retries are set to 15
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_ROAM_CTRL
++
++Synopsis
++ Affects how the AR6000 device selects a BSS. The host uses this command to set and
++ enable low RSSI scan parameters. The time period of low RSSI background scan is
++ mentioned in scan period. Low RSSI scan is triggered when the current RSSI
++ threshold (75% of current RSSI) is equal to or less than scan threshold.
++
++ Low RSSI roam is triggered when the current RSSI threshold falls below the roam
++ threshold and roams to a better AP by the end of the scan cycle. During Low RSSI
++ roam, if the STA finds a new AP with an RSSI greater than roam RSSI to floor, during
++ scan, it roams immediately to it instead of waiting for the end of the scan cycle. See
++ also “Scan and Roam” on page C-1.
++
++Command
++ wmiconfig --roam <roamctrl> <info>, where info is <scan period>
++ <scan threshold> <roam threshold> <roam rssi floor>
++
++Command Parameters
++ A_UINT8 roamCtrlType;
++
++Command Values
++ WMI_FORCE_ROAM = 1
++ Roam to the specified BSSID
++
++ WMI_SET_ROAM_MODE = 2
++ Default, progd bias, no roam
++
++ WMI_SET_HOST_BIAS = 3
++ Set the host bias
++
++ WMI_SET_LOWRSSI_SCAN_PARAMS = 4
++ Info parameters
++
++ A_UINT8 bssid[ATH_MAC_LEN];
++ WMI_FORCE_ROAM
++
++ A_UINT8 roamMode;
++ WMI_SET_ROAM_MODE
++
++ A_UINT8 bssBiasInfo;
++ WMI_SET_HOST_BIAS
++
++ A_UINT16 lowrssi_scan_period;
++ WMI_SET_LOWRSSI_SCAN_PARAMS
++
++ A_INT16
++ lowrssi_scan_threshold;
++ WMI_SET_LOWRSSI_SCAN_PARAMS
++
++ A_INT16 lowrssi_roam_threshold;
++ WMI_SET_LOWRSSI_SCAN_PARAMS
++
++ A_UINT8 roam_rssi_floor;
++ WMI_SET_LOWRSSI_SCAN_PARAMS
++
++Reset Value
++ None defined (default lowrssi scan is disabled. Enabled only when scan period is set.)
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_RTS
++
++Synopsis
++ Decides when RTS should be sent.
++
++Command
++ wmiconfig eth1 --setRTS <pkt length threshold>
++
++Command Parameters
++ A_UINT16
++ threshold;
++ Command parameter threshold in bytes. An RTS is
++ sent if the data length is more than this threshold.
++ The default is to NOT send RTS.
++
++Command Values
++ None
++
++Reset Value
++ Not to send RTS.
++
++Restrictions
++ None
++
++
++=====================================================================
++
++Name
++ SET_SCAN_PARAMS
++
++Synopsis
++ The host uses this command to set the AR6000 scan parameters, including the duty
++ cycle for both foreground and background scanning. Foreground scanning takes
++ place when the AR6000 device is not connected, and discovers all available wireless
++ networks to find the best BSS to join. Background scanning takes place when the
++ device is already connected to a network and scans for potential roaming candidates
++ and maintains them in order of best to worst. A second priority of background
++ scanning is to find new wireless networks.
++
++ The device initiates a scan when necessary. For example, a foreground scan is always
++ started on receipt of a “CONNECT_CMD” command or when the device cannot find
++ a BSS to connect to. Foreground scanning is disabled by default until receipt of a
++ CONNECT command. Background scanning is enabled by default and occurs every
++ 60 seconds after the device is connected.
++
++ The device implements a binary backoff interval for foreground scanning when it
++ enters the DISCONNECTED state after losing connectivity with an AP or when a
++ CONNECT command is received. The first interval is ForegroundScanStartPeriod,
++ which doubles after each scan until the interval reaches ForegroundScanEndPeriod.
++ If the host terminates a connection with DISCONNECT, the foreground scan period
++ is ForegroundScanEndPeriod. All scan intervals are measured from the time a full
++ scan ends to the time the next full scan starts. The host starts a scan by issuing a
++ “START_SCAN” command. See also “Scan and Roam” on page C-1.
++
++Command
++ wmiconfig eth1 --scan --fgstart=<sec> --fgend=<sec> --bg=<sec> --
++ act=<msec> --pas=<msec> --sr=<short scan ratio> --scanctrlflags
++ <connScan> <scanConnected> <activeScan> <reportBSSINFO>
++
++Command Parameters
++ UINT16 fgStartPeriod
++ First interval used by the device when it
++ disconnects from an AP or receives a
++ CONNECT command, specified in seconds (0–
++ 65535). If = 0, the device uses the reset value.
++ If = 65535, the device disables foreground
++ scanning.
++
++ UINT16 fgEndPeriod
++ The maximum interval the device waits between
++ foreground scans specified in seconds (from
++ ForegroundScanStartPeriod to 65535). If = 0, the
++ device uses the reset value.
++
++ UINT16 bgScanPeriod
++ The period of background scan specified in
++ seconds (0–65535). By default, it is set to the reset
++ value of 60 seconds. If 0 or 65535 is specified, the
++ device disables background scanning.
++
++ UINT16 maxactChDwellTime
++ The period of time the device stays on a
++ particular channel while active scanning. It is
++ specified in ms (10–65535). If the special value of
++ 0 is specified, the device uses the reset value.
++
++ UINT16 PasChDwellTime
++ The period of time the device remains on a
++ particular channel while passive scanning. It is
++ specified in ms (10–65535). If the special value of
++ 0 is specified, the device uses the reset value.
++
++ UINT8 shortScanRatio
++ Number of short scans to perform for each
++ long scan.
++
++ UINT8 scanCtrlFlasgs
++
++ UINT16 minactChDwellTime
++ Specified in ms
++
++ UINT32 maxDFSchActTime
++ The maximum time a DFS channel can stay
++ active before being marked passive, specified in
++ ms.
++
++Command Values
++ None
++
++Reset Values
++ ForegroundScanStart
++Period
++ 1 sec
++
++ ForegroundScanEndPeriod
++ 60 sec
++
++ BackgroundScanPeriod
++ 60 sec
++
++ ActiveChannelDwellTime
++ 105 ms
++
++=====================================================================
++
++
++Name
++ SET_TKIP_COUNTERMEASURES
++
++Synopsis
++ The host issues this command to tell the target whether to enable or disable TKIP
++ countermeasures.
++
++Command
++ TBD
++
++Command Parameters
++ UINT8 WMI_TKIP_CM_ENABLE
++ Enables the countermeasures
++
++
++ UINT8 TKIP_CM_DISABLE
++ Disables the countermeasures
++
++Command Values
++ None
++
++Reset Values
++ By default, TKIP MIC reporting is disabled
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_TX_PWR
++
++Synopsis
++ The host uses this command to specify the Tx power level of the AR6000. Cannot be
++ used to exceed the power limit permitted by the regulatory domain. The maximum
++ output power is limited in the chip to 31.5 dBm; the range is 0 – 31.5 dbm.
++
++Command
++ wmiconfig --power <dbM>
++
++Command Parameters
++ UINT8 dbM
++ The desired Tx power specified in dbM.
++ If = 0, the device chooses the maximum
++ permitted by the regulatory domain.
++
++Command Values
++ None
++
++Reset Values
++ The maximum permitted by the regulatory domain
++
++Restrictions
++ None
++
++See Also
++ “GET_TX_PWR”
++
++
++=====================================================================
++
++Name
++ SET_VOICE_PKT_SIZE
++
++Synopsis
++ If an AP does not support WMM, it has no way to differentiate voice from data.
++ Because the voice packet is typically small, packet in size less than voicePktSize are
++ assumed to be voice, otherwise it is treated as data.
++
++Command
++ wmiconfig eth1 --setVoicePktSize <size-in-bytes>
++
++Command Parameters
++ UINT16 voicePktSize
++ Packet size in octets
++
++Command Values
++ None
++
++Reset Values
++ voicePktSize default is 400 bytes
++
++Restrictions
++ No effect if WMM is unavailable
++
++
++=====================================================================
++
++Name
++ SET_WMM
++
++Synopsis
++ Overrides the AR6000 device WMM capability
++
++Command
++ wmiconfig eth1 --setwmm <enable>
++
++Command Parameters
++ WMI_WMM_ENABLED
++ Enables WMM
++
++ WMI_WMM_DISABLED
++ Disables WMM support
++
++Command Values
++ 0 = disabled
++ 1 = enabled
++
++Reset Value
++ WMM Disabled
++
++Restrictions
++ None
++
++
++=====================================================================
++
++Name
++ SET_WMM_TXOP
++
++Synopsis
++ Configures TxOP Bursting when sending traffic to a WMM capable AP
++
++Command
++ wmiconfig eth1 --txopbursting <burstEnable>
++
++ <burstEnable>
++ = 0
++ Disallow TxOp bursting
++
++ = 1
++ Allow TxOp bursting
++
++Command Parameters
++ txopEnable
++ = WMI_TXOP_DISABLED
++ Disabled
++
++ = WMI_TXOP_ENABLED
++ Enabled
++
++Command Values
++ txopEnable
++ = 0 Disabled
++
++ = 1 Enabled
++
++Reset Value
++ Bursting is off by default
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_WOW_MODE
++
++Synopsis
++ The host uses this command to enable or disable the WoW mode. When WoW mode
++ is enabled and the host is asleep, pattern matching takes place at the target level.
++ Only packets that match any of the pre-specified WoW filter patterns, will be passed
++ up to the host. The host will also be woken up by the target. Packets which do not
++ match any of the WoW patterns are discarded.
++
++Command
++ wmiconfig –setwowmode <enable/disable>
++
++Command Parameters
++ A_BOOL enable_wow
++ Enable or disable WoW:
++
++Command Values
++ = 0
++ Disable WoW
++
++ = 1
++ Enable WoW
++
++Reset Value
++ None defined (default WoW mode is disabled).
++
++Restrictions
++ None
++
++See Also
++ “GET_WOW_LIST”
++
++
++=====================================================================
++
++Name
++ SET_WSC_STATUS
++
++Synopsis
++ The supplicant uses this command to inform the target about the status of the WSC
++ registration protocol. During the WSC registration protocol, a flag is set so the target
++ bypasses some of the checks in the CSERV module. At the end of the registration, this
++ flag is reset.
++
++Command
++ N/A
++
++Command Parameters
++ A_BOOL status
++ = 1 WSC registration in progress
++ = 0 WSC protocol not running
++
++Reply Parameters
++ None
++
++Reset Value
++ None defined (default = 0)
++
++Restrictions
++ None
++
++
++=====================================================================
++
++Name
++ SNR_THRESHOLD_PARAMS
++
++Synopsis
++ Configures how the AR6000 device monitors and reports SNR of the connected BSS,
++ used as a link quality metric.
++
++Command
++ --snrThreshold <weight> <upper_threshold_1> ...
++ <upper_threshold_4> <lower_threshold_1> ... <lower_threshold_4>
++ <pollTimer>
++
++Command Parameters
++ <weight>
++ Share with rssiThreshold. Range in [1, 16], used
++ in the formula to calculate average RSSI
++
++ <upper_threshold_x>
++ Above thresholds expressed in db, in ascending
++ order
++
++ <lower_threshold_x>
++ Below thresholds expressed in db, in ascending
++ order
++
++ <pollTimer>
++ The signal strength sampling frequency in
++ seconds. If polltime = 0, signal strength
++ sampling is disabled
++
++Command Values
++ None
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ START_SCAN
++
++Synopsis
++ The host uses this command to start a long or short channel scan. All future scans are
++ relative to the time the AR6000 device processes this command. The device performs
++ a channel scan on receipt of this command, even if a scan was already in progress.
++ The host uses this command when it wishes to refresh its cached database of wireless
++ networks. The isLegacy field will be removed (0 for now) because it is achieved by
++ setting CONNECT_PROFILE_MATCH_DONE in the CONNECT command. See also
++ “Scan and Roam”
++
++Command
++ wmiconfig eth1 --startscan <scan type> <forcefgscan> 0
++ <homeDwellTime> <forceScanInterval>
++
++Command Parameters
++ UINT8 scanType
++ WMI_SCAN_TYPE
++
++Command Values
++ {
++ WMI_LONG_SCAN =0x0
++ Requests a full scan
++ WMI_SHORT_SCAN =0x1
++ Requests a short scan
++ } WMI_SCAN_TYPE
++
++ A_BOOL forceFgScan
++ forceFgScan
++ = 0
++ Disable the foreground scan
++
++ forceFgScan
++ = 1
++ Forces a foreground scan
++
++ A_UINT32 homeDwellTime
++ Maximum duration in the home
++ channel (in ms)
++
++ A_UINT32 forceScanInterval
++ Time interval between scans (in ms)
++
++ A_UINT32 scanType
++ WMI_SCAN_TYPE
++
++Reset Value
++ Disable forcing foreground scan
++
++Restrictions
++ isLegacy field will no longer be supported (pass as 0 for now)
++
++
++=====================================================================
++
++Name
++ SYNCHRONIZE
++
++Synopsis
++ The host uses this command to force a synchronization point between the command
++ and data paths
++
++Command
++ TBD
++
++Command Parameters
++ None
++
++
++
++Command Values
++ None
++
++
++
++Reset Values
++ None
++
++
++
++Restrictions
++ None
++
++
++=====================================================================
++
++Name
++ TARGET_ERROR_REPORT_BITMASK
++
++Synopsis
++ Allows the host to control “ERROR_REPORT” events from the AR6000 device.
++
++ If error reporting is disabled for an error type, a count of errors of that type is
++ maintained by the device.
++
++ If error reporting is enabled for an error type, an “ERROR_REPORT” event is
++ sent when an error occurs and the error report bit is cleared.
++
++ Error counts for each error type are available through the “GET_TARGET_STATS”
++ command.
++
++Command
++ wmiconfig eth1 --setErrorReportingBitmask
++
++Command Parameters
++ UINT32 bitmask
++ Represents the set of
++ WMI_TARGET_ERROR_VAL error types
++ enabled for reporting
++
++Command Values
++ {
++ WMI_TARGET_PM_ERR_FAIL = 0x00000001
++ Power save fails (only two cases):
++ Retry out of null function/QoS null
++ function to associated AP for PS
++ indication'
++ Host changes the PS setting when
++ STA is off home channel
++
++ WMI_TARGET_KEY_NOT_FOUND = 0x00000002
++ No cipher key
++ WMI_TARGET_DECRYPTION_ERR = 0x00000004
++ Decryption error
++ WMI_TARGET_BMISS = 0x00000008
++ Beacon miss
++ WMI_PSDISABLE_NODE_JOIN = 0x00000010
++ A non-PS-enabled STA joined the
++ PS-enabled network
++ WMI_TARGET_COM_ERR = 0x00000020
++ Host/target communication error
++ WMI_TARGET_FATAL_ERR = 0x00000040
++ Fatal error
++ } WMI_TARGET_ERROR_VAL
++
++Reset Values
++ Bitmask is 0, and all error reporting is disabled
++
++Restrictions
++ None
++
++
++=====================================================================
++WMI Events
++
++Event
++ Description
++ Page
++
++
++BSSINFO
++ Contains information describing BSSs collected during a scan
++
++CAC_EVENTID
++ Indicates signalling events in admission control
++
++CMDERROR
++ The AR6000 device encounters an error while attempting to process
++ a command
++
++CONNECT
++ The device has connected to a wireless network
++
++DISCONNECT
++ The device lost connectivity with a wireless network
++
++ERROR_REPORT
++ An error has occurred for which the host previously requested
++ notification with the command
++ “TARGET_ERROR_REPORT_BITMASK”
++
++EXTENSION
++ WMI extension event
++
++GET_PMKID_LIST_EVENT
++ Created in response to a “GET_PMKID_LIST_CMD” command
++
++GET_WOW_LIST_EVENT
++ Response to the wmiconfig “GET_WOW_LIST” command to
++ retrieve the configured WoW patterns
++
++NEIGHBOR_REPORT
++ Neighbor APs that match the current profile were detected
++
++OPT_RX_FRAME_EVENT
++ (Special feature) informs the host of the reception of a special frame
++
++PSTREAM_TIMEOUT
++ A prioritized stream has been idle for a specified interval
++
++READY
++ The AR6000 device is ready to accept commands
++
++REGDOMAIN
++ The regulatory domain has changed
++
++REPORT_ROAM_DATA_EVENT
++ Reports the roam time calculations made by the device
++ (generated with a special build)
++ —
++
++REPORT_STATISTICS
++ Reply to a “GET_TARGET_STATS” command
++
++ROAM_TBL_EVENT
++ Reports the roam table
++
++RSSI_THRESHOLD
++ Signal strength from the connected AP has crossed the threshold
++ defined in the “RSSI_THRESHOLD_PARAMS” command
++
++SCAN_COMPLETE_EVENT
++ A scan has completed (added status SCAN_ABORTED in release 2.0)
++
++TEST_EVENT
++ Event generated by the TCMD
++
++TKIP_MICERROR
++ TKIP MIC errors were detected
++
++=====================================================================
++
++Name
++ BSSINFO
++
++Synopsis
++ Contains information describing one or more BSSs as collected during a scan.
++ Information includes the BSSID, SSID, RSSI, network type, channel, supported rates,
++ and IEs. BSSINFO events are sent only after the device receives a beacon or probe-
++ response frame that pass the filter specified in the “SET_BSS_FILTER” command.
++ BSSINFO events consist of a small header followed by a copy of the beacon or probe
++ response frame. The 802.11 header is not present. For formats of beacon and probe-
++ response frames please consult the IEEE 802.11 specification.
++
++ The beacons or probe responses containing the IE specified by the
++ WMI_BSS_FILTER_CMD are passed to the host through the
++ WMI_BSSINFO_EVENT. The event carries a 32-bit bitmask that indicates the IEs that
++ were detected in the management frame. The frame type field has been extended to
++ indicate action management frames. This would be helpful to route these frames
++ through the same event mechanism as used by the beacon processing function.
++
++ If the bssFilter in the SET_BSS_FILTER matches, then the ieMask is not relevant
++ because the BSSINFO event is sent to the host. If the bssFilter doesnot match in the
++ beacons/probe respones, then the ieMask match dictates whether the BSSINFO
++ event is sent to the host. In the case of action management frames, the ieMask is the
++ filter that is applied.
++
++Event ID
++ 0x1004
++
++Event Parameters
++ typedef struct {
++ A_UINT16 channel;
++ Specifies the frequency (in MHz) where the
++ frame was received
++ A_UINT8 frameType;
++ A WMI_BI_FTYPE value
++ A_UINT8 snr;
++ A_INT16 rssi;
++ Indicates signal strength
++ A_UINT8 bssid[ATH_MAC_LEN];
++ A_UINT32 ieMask;
++ } _ATTRIB_PACK_WMI_BSS_INFO_HDR;
++
++ Beacon or Probe Response Frame
++
++Event Values
++ {
++ BEACON_FTYPE = 0x1
++ Indicates a beacon frame
++ PROBERESP_FTYPE
++ Indicates a probe response frame
++ ACTION_MGMT_FTYPE
++ } WMI_BI_FTYPE
++
++=====================================================================
++
++Name
++ CAC_EVENTID
++
++Synopsis
++ Indicates signalling events in admission control. Events are generated when
++ admission is accepted, rejected, or deleted by either the host or the AP. If the AP does
++ not respond to an admission request within a timeout of 500 ms, an event is
++ generated to the host.
++
++Event ID
++ 0x1011
++
++Event Parameters
++ UINT8
++ ac
++ Access class pertaining to the
++signalling
++
++ UINT8 cac_indication
++ Type of indication; indications are
++ listed in WMI_CAC_INDICATION
++
++ UINT8 statusCode
++ AP response status code for a
++ request
++
++ UINT8 tspecSuggestion[63]
++ Suggested TSPEC from AP
++
++Event Values
++ {
++ CAC_INDICATION_ADMISSION = 0x00
++ CAC_INDICATION_ADMISSION_RESP = 0x01
++ CAC_INDICATION_DELETE = 0x02
++ CAC_INDICATION_NO_RESP = 0x03
++ } WMI_CAC_INDICATION
++
++
++=====================================================================
++
++
++Name
++ CMDERROR
++
++Synopsis
++ Indicates that the AR6000 device encountered an error while attempting to process a
++ command. This error is fatal and indicates that the device requires a reset.
++
++Event ID
++ 0x1005
++
++Event Parameters
++ UINT16 commandId
++ Corresponds to the command which generated
++ the error
++ UINT8 errorCode
++ A WMI_ERROR_CODE value
++
++Event Values
++ {
++ INVALID_PARAM = 1
++ Invalid parameter
++ ILLEGAL_STATE = 2
++ Illegal state
++ INTERNAL_ERROR = 3
++ Internal Error
++ All other values reserved
++ } WMI_ERROR_CODE
++
++
++=====================================================================
++
++
++Name
++ CONNECT
++
++Synopsis
++ Signals that the AR6000 connected to a wireless network. Connection occurs due to a
++ “CONNECT” command or roaming to a new AP. For infrastructure networks, shows
++ that the AR6000 successfully performed 802.11 authentication and AP association.
++
++Event ID
++ 0x1002
++
++Event Parameters
++ UINT16 channel
++ Channel frequency (in MHz) of the network the
++ AR6000 are connected to
++
++ UINT8 bssid[6]
++ MAC address of the AP the AR6000 are
++ connected to or the BSSID of the ad hoc
++ network
++
++ UINT16 listenInterval
++ Listen interval (in Kms) that the AR6000 are
++ using
++
++ UINT 8 beaconIeLen
++ Length (in bytes) of the beacon IEs
++
++ UINT8 assocInfo
++ Pointer to an array containing beacon IEs,
++ followed first by association request IEs then by
++ association response IEs
++
++ UINT8 assocReqLen
++ Length (in bytes) of the assocReqIEs array
++
++ UINT8 assocRespLen
++ Length (in bytes) of the assocRespIEs array
++
++Event Values
++ None defined
++
++=====================================================================
++
++
++Name
++ DISCONNECT
++
++Synopsis
++ Signals that the AR6000 device lost connectivity with the wireless network.
++ DISCONENCT is generated when the device fails to complete a “CONNECT”
++ command or as a result of a transition from a connected state to disconnected state.
++
++ After sending the “DISCONNECT” event the device continually tries to re-establish
++ a connection. A LOST_LINK occurs when STA cannot receive beacons within the
++ specified time for the SET_BMISS_TIME command.
++
++Event ID
++ 0x1003
++
++Event Parameters
++ UINT8 disconnect
++ Reason
++ A WMI_DISCONNECT_REASON value
++
++ UINT8 bssid[6]
++ Indicates which BSS the device was connected to
++
++ UINT8 assocRespLen
++ Length of the 802.11 association response frame
++ that triggered this event, or 0 if not applicable
++
++ UINT8 assocInfo[assocRespLen]
++ Copy of the 802.11 association response frame
++
++Event Values
++ {
++ NO_NETWORK_AVAIL =0x01
++ Indicates that the device was unable to
++ establish or find the desired network
++ LOST_LINK =0x02
++ Indicates the devices is no longer receiving
++ beacons from the BSS it was previously
++ connected to
++
++ DISCONNECT_CMD =0x03
++ Indicates a “DISCONNECT” command was
++ processed
++ BSS_DISCONNECTED =0x04
++ Indicates the BSS explicitly disconnected the
++ device. Possible mechanisms include the AP
++ sending 802.11 management frames
++ (e.g., disassociate or deauthentication
++ messages).
++ AUTH_FAILED =0x05
++ Indicates that the device failed 802.11
++ authentication with the BSS
++ ASSOC_FAILED =0x06
++ Indicates that the device failed 802.11
++ association with the BSS
++ NO_RESOURCES_AVAIL =0x07
++ Indicates that a connection failed because the
++ AP had insufficient resources to complete the
++ connection
++ CSERV_DISCONNECT =0x08
++ Indicates that the device’s connection services
++ module decided to disconnect from a BSS,
++ which can happen for a variety of reasons (e.g.,
++ the host marks the current connected AP as a
++ bad AP).
++ INVALID_PROFILE =0x0A
++ Indicates that an attempt was made to
++ reconnect to a BSS that no longer matches the
++ current profile
++ All other values are reserved
++ } WMI_DISCONNECT_REASON
++
++
++=====================================================================
++
++
++Name
++ ERROR_REPORT
++
++Synopsis
++ Signals that a type of error has occurred for which the host previously requested
++ notification through the “TARGET_ERROR_REPORT_BITMASK” command.
++
++Event ID
++ 0x100D
++
++Event Parameters
++ UINT32 errorVal
++ WMI_TARGET_ERROR_VAL value. See
++ “TARGET_ERROR_REPORT_BITMASK”.
++
++Event Values
++ errorVal
++ = 0x00000001
++ Power save fails
++
++ = 0x00000002
++ No cipher key
++
++ = 0x00000004
++ Decryption error
++
++ = 0x00000008
++ Beacon miss
++
++ = 0x00000010
++ A non-power save disabled node has joined
++ the PS-enabled network
++
++
++=====================================================================
++
++
++Name
++ EXTENSION
++
++Synopsis
++ The WMI is used mostly for wireless control messages to a wireless module that
++ apply to wireless module management regardless of the target platform
++ implementation. However, some events peripherally related to wireless management
++ are desired during operation. These wireless extension events may be platform-
++ specific or implementation-dependent. See “WMI Extension Commands”
++
++
++Event ID
++ 0x1010
++
++
++=====================================================================
++
++
++Name
++ GET_PMKID_LIST_EVENT
++
++Synopsis
++ Generated by firmware in response to a “GET_PMKID_LIST_CMD” command.
++
++Event Parameters
++ typedef struct {
++ A_UINT32 numPMKID;
++ Contains the number of PMKIDs in the reply
++ WMI_PMKID pmkidList[1];
++ } __ATTRIB_PACK WMI_PMKID_LIST_REPLY;
++
++Event Values
++ None
++
++
++=====================================================================
++
++
++Name
++ GET_WOW_LIST_EVENT
++
++Synopsis
++ Response to the wmiconfig –getwowlist command to retrieve the configured Wake on
++ Wireless patterns
++
++Event ID
++ 0x10018
++
++Event Parameters
++ {
++
++ A_UINT8 num_filters
++ Total number of patterns in the list
++ A_UINT8 this_filter_num
++ The filter number
++ A_UINT8 wow_mode
++ Shows whether WoW is enabled or disabled
++ A_UINT8 host_mode
++ Shows whether the host is asleep or awake
++ WOW_FILTER wow_filters[1]
++ List of WoW filters (pattern and mask data bytes)
++ } WMI_GET_WOW_LIST_REPLY;
++
++ {
++ Each wow_filter_list element shows:
++ A_UINT8 wow_valid_filter
++ Whether the filter is valid
++ A_UINT8 wow_filter_list_id
++ Filter List ID (23 = default)
++ A_UINT8 wow_filter_size
++ Size in bytes of the filter
++ A_UINT8 wow_filter_offset
++ Offset of the pattern to search in the data packet
++ A_UINT8 wow_filter_mask[MASK_SIZE]
++ The mask to be applied to the pattern
++ A_UINT8 wow_filter_pattern[WOW_PATTERN_SIZE]
++ The pattern that to match to wake up the host
++ } WOW_FILTER
++
++Event Values
++ None
++
++=====================================================================
++
++
++
++Name
++ NEIGHBOR_REPORT
++
++Synopsis
++ Indicates the existence of neighbor APs that match the current profile. The host uses
++ this event to populate the PMKID cache on the AR6000 and/or to perform
++ preauthentication. This event is only generated in infrastructure mode.
++
++ A total of numberOfAps pairs of bssid/bssFlags exist, one pair for each AP.
++
++Event ID
++ 0x1008
++
++Event Parameters
++ UINT8 numberOfAps
++ The number of APs reported about in
++ this event
++ {
++ UINT8 bssid[6]
++ MAC address of a neighbor AP
++ UINT8 bssFlags
++ A WMI_BSS_FLAGS value
++ }[numberOfAps]
++
++
++Event Values
++ {
++ WMI_DEFAULT_BSS_FLAGS = 0
++ Logical OR of 1 or more
++ WMI_BSS_FLAGS
++ WMI_PREAUTH_CAPABLE_BSS
++ = 1
++ Indicates that this AP is capable of
++ preauthentication
++ WMI_PMKID_VALID_BSS
++ = 2
++ Indicates that the AR6000 have a
++ valid pairwise master key for this AP
++ } WMI_BSS_FLAGS
++
++
++=====================================================================
++
++
++
++Name
++ OPT_RX_FRAME_EVENT
++
++Synopsis
++ Special feature, informs host of the reception of a special frame.
++
++Event ID
++ 0x100E
++
++Event Parameters
++ {
++ A_UINT16 channel;
++ A_UINT8 frameType;
++ A_INT8 snr;
++ A_UINT8 srcAddr[ATH_MAC_LEN];
++ A_UINT8 bssid[ATH_MAC_LEN];
++ }WMI_OPT_RX_INFO_HDR
++
++Event Values
++ None
++
++=====================================================================
++
++
++
++Name
++ PSTREAM_TIMEOUT
++
++Synopsis
++ Indicates that a priority stream that got created as a result of priority-marked data
++ flow (priority marked in IP TOS) being idle for the default inactivity interval period
++ (specified in the “CREATE_PSTREAM” command) used for priority streams created
++ implicitly by the driver. This event is not indicated for user-created priority streams.
++ User-created priority streams exist until the users delete them explicitly. They do not
++ timeout due to data inactivity.
++
++Event ID
++ 0x1007
++
++Event Parameters
++ A_UINT8
++ trafficClass
++ Indicated the traffic class of priority
++ stream that timed out
++
++Event Values
++ {
++ WMM_AC_BE = 0
++ Best effort
++ WMM_AC_BK = 1
++ Background
++ WMM_AC_VI = 2
++ Video
++ WMM_AC_VO = 3
++ Voice
++ } TRAFFIC CLASS
++
++
++=====================================================================
++
++Name
++ READY
++
++Synopsis
++ Indicates that the AR6000 device is prepared to accept commands. It is sent once after
++ power on or reset. It also indicates the MAC address of the device.
++
++Event ID
++ 0x1001
++
++Event Parameters
++ UINT8 macAddr[6]
++ Device MAC address
++ UINT8 phyCapability
++ A WMI_PHY_CAPABILITY value. Indicates the
++ capabilities of the device wireless module’s radio
++
++Event Values
++ {
++ WMI_11A_CAPABILITY = 1
++ WMI_11G_CAPABILITY = 2
++ WMI_11AG_CAPABILITY = 3
++ } WMI_PHY_CAPABILITY
++
++
++=====================================================================
++
++Name
++ REGDOMAIN
++
++Synopsis
++ Indicates that the regulatory domain has changed. It initially occurs when the
++ AR6000 device reads the board data information. The regulatory domain can also
++ change when the device is a world-mode SKU. In this case, the regulatory domain is
++ based on the country advertised by APs per the IEEE 802.11d specification. A
++ potential side effect of a regulatory domain change is a change in the list of available
++ channels. Any channel restrictions that exist as a result of a previous
++ “SET_CHANNEL_PARAMETERS” command are lifted.
++
++Event ID
++ 0x1006
++
++Event Parameters
++ UINT32 regDomain
++ The range of 0x0000 – 0x00FF
++ corresponds to an ISO country code.
++
++ Other regCodes are reserved for world
++ mode settings and specific regulatory
++ domains.
++
++Event Values
++ None
++
++
++=====================================================================
++
++
++
++Name
++ REPORT_STATISTICS
++
++Synopsis
++ A reply to a “GET_TARGET_STATS” command.
++
++Event ID
++ 0x100B
++
++Event Parameters
++ When the statistics are sent to the host, the AR6001 clear them so that a new set of
++ statistics are collected for the next report.
++
++ UINT32 tx_packets
++ UINT32 tx_bytes
++ UINT32 tx_unicast_pkts
++ UINT32 tx_unicast_bytes
++ UINT32 tx_multicast_pkts
++ UINT32 tx_multicast_bytes
++ UINT32 tx_broadcast_pkts
++ UINT32 tx_broadcast_bytes
++ UINT32 tx_rts_success_cnt
++ UINT32 tx_packet_per_ac[4]
++ Tx packets per AC: [0] = BE, [1] = BK,
++ [2] = VI, [3] = VO
++ UINT32 tx_errors
++ Number of packets which failed Tx, due
++ to all failures
++ ... REPORT_STATISTICS, continued
++ UINT32 tx_failed_cnt
++ Number of data packets that failed Tx
++ UINT32 tx_retry_cnt
++ Number of Tx retries for all packets
++ UINT32 tx_rts_fail_cnt
++ Number of RTS Tx failed count
++ UINT32 rx_packets
++ UINT32 rx_bytes
++ UINT32 rx_unicast_pkts
++ UINT32 rx_unicast_bytes
++ UINT32 rx_multicast_pkts
++ UINT32 rx_multicast_bytes
++ UINT32 rx_broadcast_pkts
++ UINT32 rx_broadcast_bytes
++ UINT32 rx_fragment_pkt
++ Number of fragmented packets received
++ UINT32 rx_errors
++ Number of Rx errors due to all failures
++ UINT32 rx_crcerr
++ Number of Rx errors due to CRC errors
++ UINT32 rx_key_cache_miss
++ Number of Rx errors due to a key not
++ being plumbed
++ UINT32 rx_decrypt_err
++ Number of Rx errors due to decryption
++ failure
++ UINT32 rx_duplicate_frames
++ Number of duplicate frames received
++ UINT32 tkip_local_mic_failure
++ Number of TKIP MIC errors detected
++ UINT32 tkip_counter_measures_invoked
++ Number of times TKIP countermeasures
++ were invoked
++ UINT32 tkip_replays
++ Number of frames that replayed a TKIP
++ encrypted frame received earlier
++ UINT32 tkip_format_errors
++ Number of frames that did not conform
++ to the TKIP frame format
++ UINT32 ccmp_format_errors
++ Number of frames that did not conform
++ to the CCMP frame format
++ UINT32 ccmp_replays
++ Number of frames that replayed a CCMP
++ encrypted frame received earlier
++ UINT32 power_save_failure_cnt
++ Number of failures that occurred when
++ the AR6001 could not go to sleep
++ UINT32 cs_bmiss_cnt
++ Number of BMISS interrupts since
++ connection
++ UINT32 cs_lowRssi_cnt
++ Number of the times the RSSI went below
++ the low RSSI threshold
++ UINT16 cs_connect_cnt
++ Number of connection times
++ UINT16 cs_disconnect_cnt
++ Number of disconnection times
++ UINT8 cs_aveBeacon_rssi
++ The current averaged value of the RSSI
++ from the beacons of the connected BSS
++ UINT8 cs_lastRoam_msec
++ Time that the last roaming took, in ms.
++ This time is the difference between
++ roaming start and actual connection.
++
++Event Values
++ None defined
++
++
++=====================================================================
++
++Name
++ ROAM_TBL_EVENT
++
++Synopsis
++ Reports the roam table, which contains the current roam mode and this information
++ for every BSS:
++
++Event ID
++ 0x100F
++
++Event Parameters
++ A_UINT8 bssid[ATH_MAC_LEN];
++ BSSID
++ A_UINT8 rssi
++ Averaged RSSI
++ A_UINT8 rssidt
++ Change in RSSI
++ A_UINT8 last_rssi
++ Last recorded RSSI
++ A_UINT8 roam_util
++ Utility value used in roaming decision
++ A_UINT8 util
++ Base utility with the BSS
++ A_UINT8 bias
++ Host configured for this BSS
++
++Event Values
++ roamMode
++ Current roam mode
++
++ = 1
++ RSSI based roam
++
++ = 2
++ Host bias-based roam
++
++ = 3
++ Lock to the current BSS
++
++ = 4
++ Autonomous roaming disabled
++
++
++=====================================================================
++
++Name
++ RSSI_THRESHOLD
++
++Synopsis
++ Alerts the host that the signal strength from the connected AP has crossed a
++ interesting threshold as defined in a previous “RSSI_THRESHOLD_PARAMS”
++ command.
++
++Event ID
++ 0x100C
++
++Event Parameters
++ UINT8 range
++ A WMI_RSSI_THRESHOLD_VAL
++ value, which indicates the range of
++ the average signal strength
++
++Event Values
++ {
++ WMI_RSSI_LOWTHRESHOLD_BELOW_LOWERVAL = 1
++ WMI_RSSI_LOWTHRESHOLD_LOWERVAL = 2
++ WMI_RSSI_LOWTHRESHOLD_UPPERVAL = 3
++ WMI_RSSI_HIGHTHRESHOLD_LOWERVAL = 4
++ WMI_RSSI_HIGHTHRESHOLD_HIGHERVAL = 5
++ } WMI_RSSI_THRESHOLD_VAL
++
++
++=====================================================================
++
++Name
++ SCAN_COMPLETE_EVENT
++
++Synopsis
++ Indicates the scan status. if the Scan was not completed, this event is generated with
++ the status A_ECANCELED.
++
++Event ID
++ 0x100A
++
++Event Parameters
++ A_UINT8 scanStatus
++
++Event Values
++ {
++ #define SCAN_ABORTED 16
++ #define SCAN_COMPLETED 0
++ A_UINT8 scanStatus
++ A_OK or A_ECANCELED
++ } WMI_SCAN_COMPLETE_EVENT;
++
++
++=====================================================================
++
++Name
++ TEST_EVENT
++
++Synopsis
++ The TCMD application uses a single WMI event (WMI_TEST_EVENTID) to
++ communicate events from target to host. The events are parsed by the TCMD
++ application and WMI layer is oblivious of it.
++
++Event ID
++ 0x1016
++
++Event Parameters
++ WMI_TEST_EVENTID
++
++
++Event Values
++ None
++
++
++=====================================================================
++
++
++
++Name
++ TKIP_MICERR
++
++Synopsis
++ Indicates that TKIP MIC errors were detected.
++
++Event ID
++ 0x1009
++
++Event Parameters
++ UINT8 keyid
++ Indicates the TKIP key ID
++
++ UINT8 ismcast
++ 0 = Unicast
++ 1 = Multicast
++
++Event Values
++ See event parameters
++
++=====================================================================
++
++WMI Extension Commands
++
++The WMI EXTENSION command is used to multiplex a collection of
++commands that:
++
++ Are not generic wireless commands
++ May be implementation-specific
++ May be target platform-specific
++ May be optional for a host implementation
++
++ An extension command is sent to the AR6000 targets like any other WMI
++command message and uses the WMI_EXTENSION. The first field of the
++payload for this EXTENSION command is another commandId, sometimes
++called the subcommandId, which indicates which extension command is
++being used. A subcommandId-specific payload follows the subcommandId.
++
++All extensions (subcommandIds) are listed in the header file include/wmix.h.
++See also “WMI Extension Events” on page B-58.
++
++
++WMI Extension Commands
++
++
++GPIO_INPUT_GET
++ Read GPIO pins configured for input
++
++GPIO_INTR_ACK
++ Acknowledge and re-arm GPIO interrupts reported earlier
++
++GPIO_OUTPUT_SET
++ Manage output on GPIO pins configured for output
++
++GPIO_REGISTER_GET
++ Read an arbitrary GPIO register
++
++GPIO_REGISTER_SET
++ Dynamically change GPIO configuration
++
++SET_LQTHRESHOLD
++ Set link quality thresholds; the sampling happens at every unicast
++ data frame Tx, if certain thresholds are met, and corresponding
++ events are sent to the host
++
++
++=====================================================================
++
++Name
++ GPIO_INPUT_GET
++
++Synopsis
++ Allows the host to read GPIO pins that are configured for input. The values read are
++ returned through a “GPIO_DATA” extension event.
++
++NOTE: Support for GPIO is optional.
++
++Command
++ N/A
++
++Command Parameters
++ None
++
++
++
++Reply Parameters
++ None
++
++
++Reset Value
++ None
++
++
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ GPIO_INTR_ACK
++
++Synopsis
++ The host uses this command to acknowledge and to re-arm GPIO interrupts reported
++ through an earlier “GPIO_INTR” extension event. A single “GPIO_INTR_ACK”
++ command should be used to acknowledge all GPIO interrupts that the host knows to
++ be outstanding (if pending interrupts are not acknowledged through
++ “GPIO_INTR_ACK”, another “GPIO_INTR” extension event is raised).
++
++NOTE: Support for GPIO is optional.
++
++Command
++ N/A
++
++Command Parameters
++ UINT32 ack_mask
++ A mask of interrupting GPIO pins (e.g., ack_mask
++ bit [3] acknowledges an interrupt from the pin GPIO3).
++
++Command Values
++ None
++
++Reset Value
++ None
++
++Restrictions
++ The host should acknowledge only interrupts about which it was notified.
++
++
++=====================================================================
++
++Name
++ GPIO_OUTPUT_SET
++
++Synopsis
++ Manages output on GPIO pins configured for output.
++
++ Conflicts between set_mask and clear_mask or enable_mask and disable_mask result
++ in undefined behavior.
++
++NOTE: Support for GPIO is optional.
++
++Command
++ N/A
++
++Command Parameters
++ UINT32 set_mask
++ Specifies which pins should drive a 1 out
++ UINT32 clear_mask
++ Specifies which pins should drive a 0 out
++ UINT32 enable_mask
++ Specifies which pins should be enabled for output
++ UINT32 disable_mask
++ Specifies which pins should be disabled for output
++
++Command Values
++ None
++
++
++Reset Value
++ None
++
++
++Restrictions
++ None
++
++
++
++=====================================================================
++
++
++Name
++ GPIO_REGISTER_GET
++
++Synopsis
++ Allows the host to read an arbitrary GPIO register. It is intended for use during
++ bringup/debug. The target responds to this command with a “GPIO_DATA” event.
++
++NOTE: Support for GPIO is optional.
++
++Command
++ N/A
++
++Command Parameters
++ UINT32
++ gpioreg_id
++ Specifies a GPIO register identifier, as defined
++in include/AR6000/AR6000_gpio.h
++
++Reply Parameters
++ None
++
++Reset Value
++ N/A
++
++Restrictions
++ None
++
++
++=====================================================================
++
++Name
++ GPIO_REGISTER_SET
++
++Synopsis
++ Allows the host to dynamically change GPIO configuration (usually handled
++ statically through the GPIO configuration DataSet).
++
++NOTE: Support for GPIO is optional.
++
++Command
++ N/A
++
++Command Parameters
++ UINT32 gpioreg_id
++ Specifies a GPIO register identifier, as defined in
++ include/AR6000/AR6000_gpio.h
++ UINT32 value
++ Specifies a value to write to the specified
++ GPIO register
++
++Command Values
++ None
++
++
++Reset Value
++ Initial hardware configuration is as defined in the AR6001 or AR6002 ROCmTM
++ Single-Chip MAC/BB/Radio for 2.4/5 GHz Embedded WLAN Applications data sheet. This
++ configuration is modified by the GPIO Configuration DataSet, if one exists.
++
++Restrictions
++ None
++
++
++=====================================================================
++
++
++Name
++ SET_LQTHRESHOLD
++
++Synopsis
++ Set link quality thresholds, the sampling happens at every unicast data frame Tx, if
++ certain threshold is met, corresponding event will be sent to host.
++
++Command
++ wmiconfig eth1 --lqThreshold <enable> <upper_threshold_1>...
++ <upper_threshold_4> <lower_threshold_1>... <lower_threshold_4>
++
++Command Parameters
++ A_UINT8 enable;
++ A_UINT8 thresholdAbove1_Val;
++ A_UINT8 thresholdAbove2_Val;
++ A_UINT8 thresholdAbove3_Val;
++ A_UINT8 thresholdAbove4_Val;
++ A_UINT8 thresholdBelow1_Val;
++ A_UINT8 thresholdBelow2_Val;
++ A_UINT8 thresholdBelow3_Val;
++ A_UINT8 thresholdBelow4_Val;
++
++Command Values
++ enable
++ = 0
++ Disable link quality sampling
++
++ = 1
++ Enable link quality sampling
++
++
++ thresholdAbove_Val
++ [1...4]
++ Above thresholds (value in [0,100]), in ascending
++ order threshold
++
++ Below_Val [1...4] = below thresholds (value
++ in [0,100]), in ascending order
++
++Reset Values
++ None
++
++Restrictions
++ None
++
++=====================================================================
++WMI Extension Events
++
++The WMI EXTENSION event is used for a collection of events that:
++
++ Are not generic wireless events
++ May be implementation-specific
++ May be target platform-specific
++ May be optional for a host implementation
++
++ An extension event is sent from the AR6000 device targets to the host just like
++any other WMI event message, using the WMI_EXTENSION_EVENTID. The
++first field of the payload for this “EXTENSION” event is another commandId
++(sometimes called the subcommandId) that indicates which “EXTENSION”
++event is being used. A subcommandId-specific payload follows the
++subcommandId.
++
++All extensions (subcommandIds) are listed in the header file include/wmix.h.
++See also “WMI Extension Commands” on page B-55.
++
++
++WMI Extension Events
++
++
++GPIO_ACK
++ Acknowledges a host set command has been processed by the device
++
++GPIO_DATA
++ Response to a host’s request for data
++
++GPIO_INTR
++ Signals that GPIO interrupts are pending
++
++
++=====================================================================
++
++Name
++ GPIO_ACK
++
++Synopsis
++ Acknowledges that a host set command (either “GPIO_OUTPUT_SET” or
++ “GPIO_REGISTER_SET”) has been processed by the AR6000 device.
++
++NOTE: Support for GPIO is optional.
++
++Event ID
++ N/A
++
++Event Parameters
++ None
++
++
++Event Values
++ None
++
++=====================================================================
++
++
++Name
++ GPIO_DATA
++
++Synopsis
++ The AR6000 device uses this event to respond to the host’s earlier request for data
++ (through either a “GPIO_REGISTER_GET” or a “GPIO_INPUT_GET” command).
++
++NOTE: Support for GPIO is optional.
++
++Event ID
++ N/A
++
++Event Parameters
++ UINT32 value
++ Holds the data of interest, which is either a register value
++ (in the case of “GPIO_REGISTER_GET”) or a mask of
++ pin inputs (in the case of “GPIO_INPUT_GET”).
++ UINT32 reg_id
++ Indicates which register was read (in the case of
++ “GPIO_REGISTER_GET”) or is GPIO_ID_NONE (in the
++ case of “GPIO_INPUT_GET”)
++
++Event Values
++ None
++
++
++=====================================================================
++
++
++
++Name
++ GPIO_INTR
++
++Synopsis
++ The AR6000 device raises this event to signal that GPIO interrupts are pending.
++ These GPIOs may be interrupts that occurred after the last “GPIO_INTR_ACK”
++ command was issued, or may be GPIO interrupts that the host failed to acknowledge
++ in the last “GPIO_INTR_ACK”. The AR6000 will not raise another GPIO_INTR
++ event until this event is acknowledged through a “GPIO_INTR_ACK” command.
++
++NOTE: Support for GPIO is optional.
++
++Event ID
++ N/A
++
++Event Parameters
++ UINT32 intr_mask
++ Indicates which GPIO interrupts are currently pending
++
++ UINT32 input_values
++ A recent copy of the GPIO input values, taken at the
++ time the most recent GPIO interrupt was processed
++
++Event Values
++ None
++
++
++
++=====================================================================
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/ar6000/wmi/wmi_host.h linux-2.6.29-rc3.owrt.om/drivers/ar6000/wmi/wmi_host.h
+--- linux-2.6.29-rc3.owrt/drivers/ar6000/wmi/wmi_host.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/ar6000/wmi/wmi_host.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,71 @@
++#ifndef _WMI_HOST_H_
++#define _WMI_HOST_H_
++/*
++ * Copyright (c) 2004-2006 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * This file contains local definitios for the wmi host module.
++ *
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/wmi/wmi_host.h#1 $
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++struct wmi_stats {
++ A_UINT32 cmd_len_err;
++ A_UINT32 cmd_id_err;
++};
++
++struct wmi_t {
++ A_BOOL wmi_ready;
++ A_BOOL wmi_numQoSStream;
++ A_UINT8 wmi_wmiStream2AcMapping[WMI_PRI_MAX_COUNT];
++ WMI_PRI_STREAM_ID wmi_ac2WmiStreamMapping[WMM_NUM_AC];
++ A_UINT16 wmi_streamExistsForAC[WMM_NUM_AC];
++ A_UINT8 wmi_fatPipeExists;
++ void *wmi_devt;
++ struct wmi_stats wmi_stats;
++ struct ieee80211_node_table wmi_scan_table;
++ A_UINT8 wmi_bssid[ATH_MAC_LEN];
++ A_UINT8 wmi_powerMode;
++ A_UINT8 wmi_phyMode;
++ A_UINT8 wmi_keepaliveInterval;
++ A_MUTEX_T wmi_lock;
++};
++
++#define WMI_INIT_WMISTREAM_AC_MAP(w) \
++{ (w)->wmi_wmiStream2AcMapping[WMI_BEST_EFFORT_PRI] = WMM_AC_BE; \
++ (w)->wmi_wmiStream2AcMapping[WMI_LOW_PRI] = WMM_AC_BK; \
++ (w)->wmi_wmiStream2AcMapping[WMI_HIGH_PRI] = WMM_AC_VI; \
++ (w)->wmi_wmiStream2AcMapping[WMI_HIGHEST_PRI] = WMM_AC_VO; \
++ (w)->wmi_ac2WmiStreamMapping[WMM_AC_BE] = WMI_BEST_EFFORT_PRI; \
++ (w)->wmi_ac2WmiStreamMapping[WMM_AC_BK] = WMI_LOW_PRI; \
++ (w)->wmi_ac2WmiStreamMapping[WMM_AC_VI] = WMI_HIGH_PRI; \
++ (w)->wmi_ac2WmiStreamMapping[WMM_AC_VO] = WMI_HIGHEST_PRI; }
++
++#define WMI_WMISTREAM_ACCESSCATEGORY(w,s) (w)->wmi_wmiStream2AcMapping[s]
++#define WMI_ACCESSCATEGORY_WMISTREAM(w,ac) (w)->wmi_ac2WmiStreamMapping[ac]
++
++#define LOCK_WMI(w) A_MUTEX_LOCK(&(w)->wmi_lock);
++#define UNLOCK_WMI(w) A_MUTEX_UNLOCK(&(w)->wmi_lock);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _WMI_HOST_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/base/bus.c linux-2.6.29-rc3.owrt.om/drivers/base/bus.c
+--- linux-2.6.29-rc3.owrt/drivers/base/bus.c 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/base/bus.c 2009-05-10 22:27:59.000000000 +0200
+@@ -141,6 +141,29 @@
+ }
+ EXPORT_SYMBOL_GPL(bus_remove_file);
+
++int bus_create_device_link(struct bus_type *bus, struct kobject *target,
++ const char *name)
++{
++ int error;
++ if (bus_get(bus)) {
++ error = sysfs_create_link(&bus->p->devices_kset->kobj, target,
++ name);
++ bus_put(bus);
++ } else
++ error = -EINVAL;
++ return error;
++}
++EXPORT_SYMBOL_GPL(bus_create_device_link);
++
++void bus_remove_device_link(struct bus_type *bus, const char *name)
++{
++ if (bus_get(bus)) {
++ sysfs_remove_link(&bus->p->devices_kset->kobj, name);
++ bus_put(bus);
++ }
++}
++EXPORT_SYMBOL_GPL(bus_remove_device_link);
++
+ static struct kobj_type bus_ktype = {
+ .sysfs_ops = &bus_sysfs_ops,
+ };
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/base/core.c linux-2.6.29-rc3.owrt.om/drivers/base/core.c
+--- linux-2.6.29-rc3.owrt/drivers/base/core.c 2009-05-10 22:08:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/base/core.c 2009-05-10 22:27:59.000000000 +0200
+@@ -55,6 +55,11 @@
+ */
+ const char *dev_driver_string(const struct device *dev)
+ {
++ if (!dev) {
++ printk(KERN_ERR"Null dev to dev_driver_string\n");
++ dump_stack();
++ return "*NULL*";
++ }
+ return dev->driver ? dev->driver->name :
+ (dev->bus ? dev->bus->name :
+ (dev->class ? dev->class->name : ""));
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/base/power/main.c linux-2.6.29-rc3.owrt.om/drivers/base/power/main.c
+--- linux-2.6.29-rc3.owrt/drivers/base/power/main.c 2009-05-10 22:08:41.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/base/power/main.c 2009-05-10 22:27:59.000000000 +0200
+@@ -69,9 +69,9 @@
+ */
+ void device_pm_add(struct device *dev)
+ {
+- pr_debug("PM: Adding info for %s:%s\n",
++ /* pr_debug("PM: Adding info for %s:%s\n",
+ dev->bus ? dev->bus->name : "No Bus",
+- kobject_name(&dev->kobj));
++ kobject_name(&dev->kobj)); */
+ mutex_lock(&dpm_list_mtx);
+ if (dev->parent) {
+ if (dev->parent->power.status >= DPM_SUSPENDING)
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/char/Kconfig linux-2.6.29-rc3.owrt.om/drivers/char/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/char/Kconfig 2009-05-10 22:08:42.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/char/Kconfig 2009-05-10 22:27:59.000000000 +0200
+@@ -66,6 +66,18 @@
+
+ If unsure, say Y.
+
++config NR_TTY_DEVICES
++ int "Maximum tty device number"
++ depends on VT
++ default 63
++ ---help---
++ This is the highest numbered device created in /dev. You will actually have
++ NR_TTY_DEVICES+1 devices in /dev. The default is 63, which will result in
++ 64 /dev entries. The lowest number you can set is 11, anything below that,
++ and it will default to 11. 63 is also the upper limit so we don't overrun
++ the serial consoles.
++
++
+ config HW_CONSOLE
+ bool
+ depends on VT && !S390 && !UML
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/gpio/gpiolib.c linux-2.6.29-rc3.owrt.om/drivers/gpio/gpiolib.c
+--- linux-2.6.29-rc3.owrt/drivers/gpio/gpiolib.c 2009-05-10 22:08:42.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/gpio/gpiolib.c 2009-05-10 22:27:59.000000000 +0200
+@@ -6,8 +6,7 @@
+ #include <linux/err.h>
+ #include <linux/debugfs.h>
+ #include <linux/seq_file.h>
+-#include <linux/gpio.h>
+-
++#include <mach/gpio.h>
+
+ /* Optional implementation infrastructure for GPIO interfaces.
+ *
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/i2c/busses/i2c-s3c2410.c linux-2.6.29-rc3.owrt.om/drivers/i2c/busses/i2c-s3c2410.c
+--- linux-2.6.29-rc3.owrt/drivers/i2c/busses/i2c-s3c2410.c 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/i2c/busses/i2c-s3c2410.c 2009-05-10 22:27:59.000000000 +0200
+@@ -34,9 +34,9 @@
+ #include <linux/platform_device.h>
+ #include <linux/clk.h>
+ #include <linux/cpufreq.h>
++#include <linux/io.h>
+
+ #include <asm/irq.h>
+-#include <asm/io.h>
+
+ #include <plat/regs-iic.h>
+ #include <plat/iic.h>
+@@ -135,6 +135,14 @@
+ unsigned long tmp;
+
+ tmp = readl(i2c->regs + S3C2410_IICCON);
++
++/* S3c2442 datasheet
++ *
++ * If the IICCON[5]=0, IICCON[4] does not operate correctly.
++ * So, It is recommended that you should set IICCON[5]=1,
++ * although you does not use the IIC interrupt.
++ */
++
+ writel(tmp & ~S3C2410_IICCON_IRQEN, i2c->regs + S3C2410_IICCON);
+ }
+
+@@ -480,6 +488,15 @@
+ if (i2c->suspended)
+ return -EIO;
+
++ if (i2c->suspended) {
++ dev_err(i2c->dev,
++ "Hey I am still asleep (suspended: %d), retry later\n",
++ i2c->suspended);
++ dump_stack();
++ ret = -EAGAIN;
++ goto out;
++ }
++
+ ret = s3c24xx_i2c_set_master(i2c);
+ if (ret != 0) {
+ dev_err(i2c->dev, "cannot get bus (error %d)\n", ret);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/i2c/busses/Kconfig linux-2.6.29-rc3.owrt.om/drivers/i2c/busses/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/i2c/busses/Kconfig 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/i2c/busses/Kconfig 2009-05-10 22:27:59.000000000 +0200
+@@ -455,11 +455,12 @@
+ I2C bus.
+
+ config I2C_S3C2410
+- tristate "S3C2410 I2C Driver"
+- depends on ARCH_S3C2410
++ tristate "Samsung SoC I2C Driver (S3C24XX and S3C64XX series)"
++ depends on ARCH_S3C2410 || ARCH_S3C64XX
+ help
+ Say Y here to include support for I2C controller in the
+- Samsung S3C2410 based System-on-Chip devices.
++ Samsung S3C based System-on-Chip devices such as the S3C2410,
++ S3C2440, S3C2442, S3C2443 and S3C6410.
+
+ config I2C_SH7760
+ tristate "Renesas SH7760 I2C Controller"
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/i2c/chips/Kconfig linux-2.6.29-rc3.owrt.om/drivers/i2c/chips/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/i2c/chips/Kconfig 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/i2c/chips/Kconfig 2009-05-10 22:27:59.000000000 +0200
+@@ -16,6 +16,53 @@
+ This driver can also be built as a module. If so, the module
+ will be called ds1682.
+
++config AT24
++ tristate "EEPROMs from most vendors"
++ depends on SYSFS && EXPERIMENTAL
++ help
++ Enable this driver to get read/write support to most I2C EEPROMs,
++ after you configure the driver to know about each EEPROM on
++ your target board. Use these generic chip names, instead of
++ vendor-specific ones like at24c64 or 24lc02:
++
++ 24c00, 24c01, 24c02, spd (readonly 24c02), 24c04, 24c08,
++ 24c16, 24c32, 24c64, 24c128, 24c256, 24c512, 24c1024
++
++ Unless you like data loss puzzles, always be sure that any chip
++ you configure as a 24c32 (32 kbit) or larger is NOT really a
++ 24c16 (16 kbit) or smaller, and vice versa. Marking the chip
++ as read-only won't help recover from this. Also, if your chip
++ has any software write-protect mechanism you may want to review the
++ code to make sure this driver won't turn it on by accident.
++
++ If you use this with an SMBus adapter instead of an I2C adapter,
++ full functionality is not available. Only smaller devices are
++ supported (24c16 and below, max 4 kByte).
++
++ This driver can also be built as a module. If so, the module
++ will be called at24.
++
++config SENSORS_EEPROM
++ tristate "EEPROM reader"
++ depends on EXPERIMENTAL
++ help
++ If you say yes here you get read-only access to the EEPROM data
++ available on modern memory DIMMs and Sony Vaio laptops. Such
++ EEPROMs could theoretically be available on other devices as well.
++
++ This driver can also be built as a module. If so, the module
++ will be called eeprom.
++
++config SENSORS_PCF50606
++ tristate "Philips/NXP PCF50606"
++ depends on I2C
++ help
++ If you say yes here you get support for Philips/NXP PCF50606
++ PMU (Power Management Unit) chips.
++
++ This driver can also be built as a module. If so, the module
++ will be called pcf50606.
++
+ config SENSORS_PCF8574
+ tristate "Philips PCF8574 and PCF8574A (DEPRECATED)"
+ depends on EXPERIMENTAL && GPIO_PCF857X = "n"
+@@ -102,4 +149,14 @@
+ This driver can also be built as a module. If so, the module
+ will be called tsl2550.
+
++config PCA9632
++ tristate "Philips/NXP PCA9632 low power LED driver"
++ depends on I2C
++ help
++ If you say yes here you get support for the Philips/NXP PCA9632
++ LED driver.
++
++ This driver can also be built as a module. If so, the module
++ will be called pca9632.
++
+ endmenu
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/i2c/chips/Makefile linux-2.6.29-rc3.owrt.om/drivers/i2c/chips/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/i2c/chips/Makefile 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/i2c/chips/Makefile 2009-05-10 22:27:59.000000000 +0200
+@@ -13,10 +13,12 @@
+ obj-$(CONFIG_DS1682) += ds1682.o
+ obj-$(CONFIG_SENSORS_MAX6875) += max6875.o
+ obj-$(CONFIG_SENSORS_PCA9539) += pca9539.o
++obj-$(CONFIG_SENSORS_PCF50606) += pcf50606.o
+ obj-$(CONFIG_SENSORS_PCF8574) += pcf8574.o
+ obj-$(CONFIG_PCF8575) += pcf8575.o
+ obj-$(CONFIG_SENSORS_PCF8591) += pcf8591.o
+ obj-$(CONFIG_SENSORS_TSL2550) += tsl2550.o
++obj-$(CONFIG_PCA9632) += pca9632.o
+
+ ifeq ($(CONFIG_I2C_DEBUG_CHIP),y)
+ EXTRA_CFLAGS += -DDEBUG
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/i2c/chips/pca9632.c linux-2.6.29-rc3.owrt.om/drivers/i2c/chips/pca9632.c
+--- linux-2.6.29-rc3.owrt/drivers/i2c/chips/pca9632.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/i2c/chips/pca9632.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,551 @@
++/*
++ * Philips/NXP PCA9632 low power LED driver.
++ * Copyright (C) 2008 Matt Hsu <matt_hsu@openmoko.org>
++ *
++ * low_level implementation are based on pcf50606 driver
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; version 2 of the License.
++ *
++ * TODO:
++ * - attach ledclass??
++ * - add platform data
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/i2c.h>
++#include <linux/platform_device.h>
++
++#include "pca9632.h"
++
++/* Addresses to scan */
++static unsigned short normal_i2c[] = { 0x62, I2C_CLIENT_END };
++
++/* Insmod parameters */
++I2C_CLIENT_INSMOD_1(pca9632);
++
++enum pca9632_pwr_state {
++ PCA9632_NORMAL,
++ PCA9632_SLEEP,
++};
++
++enum pca9632_led_output {
++ PCA9632_OFF,
++ PCA9632_ON,
++ PCA9632_CTRL_BY_PWM,
++ PCA9632_CTRL_BY_PWM_GRPPWM,
++};
++
++static const char *led_output_name[] = {
++ [PCA9632_OFF] = "off",
++ [PCA9632_ON] = "fully-on",
++ [PCA9632_CTRL_BY_PWM] = "ctrl-by-pwm",
++ [PCA9632_CTRL_BY_PWM_GRPPWM] = "ctrl-by-pwm-grppwm",
++};
++
++struct pca9632_data {
++ struct i2c_client client;
++ struct mutex lock;
++};
++
++static struct i2c_driver pca9632_driver;
++static struct platform_device *pca9632_pdev;
++
++static int pca9632_attach_adapter(struct i2c_adapter *adapter);
++static int pca9632_detach_client(struct i2c_client *client);
++
++static int __reg_write(struct pca9632_data *pca, u_int8_t reg, u_int8_t val)
++{
++ return i2c_smbus_write_byte_data(&pca->client, reg, val);
++}
++
++static int reg_write(struct pca9632_data *pca, u_int8_t reg, u_int8_t val)
++{
++ int ret;
++
++ mutex_lock(&pca->lock);
++ ret = __reg_write(pca, reg, val);
++ mutex_unlock(&pca->lock);
++
++ return ret;
++}
++
++static int32_t __reg_read(struct pca9632_data *pca, u_int8_t reg)
++{
++ int32_t ret;
++
++ ret = i2c_smbus_read_byte_data(&pca->client, reg);
++
++ return ret;
++}
++
++static u_int8_t reg_read(struct pca9632_data *pca, u_int8_t reg)
++{
++ int32_t ret;
++
++ mutex_lock(&pca->lock);
++ ret = __reg_read(pca, reg);
++ mutex_unlock(&pca->lock);
++
++ return ret & 0xff;
++}
++
++static int reg_set_bit_mask(struct pca9632_data *pca,
++ u_int8_t reg, u_int8_t mask, u_int8_t val)
++{
++ int ret;
++ u_int8_t tmp;
++
++ val &= mask;
++
++ mutex_lock(&pca->lock);
++
++ tmp = __reg_read(pca, reg);
++ tmp &= ~mask;
++ tmp |= val;
++ ret = __reg_write(pca, reg, tmp);
++
++ mutex_unlock(&pca->lock);
++
++ return ret;
++}
++
++static inline int calc_dc(uint8_t idc)
++{
++ return (idc * 100) / 256;
++}
++
++/*
++ * Software reset
++ */
++static int software_rst(struct i2c_adapter *adapter)
++{
++ u8 buf[] = { 0xa5, 0x5a };
++
++ struct i2c_msg msg[] = {
++ {
++ .addr = 0x3,
++ .flags = 0,
++ .buf = &buf,
++ .len = sizeof(buf)
++ }
++ };
++
++ return i2c_transfer(adapter, msg, 1);
++}
++
++/*
++ * Group dmblnk control
++ */
++static void config_group_dmblnk(struct pca9632_data *pca, int group_dmblnk_mode)
++{
++ reg_set_bit_mask(pca, PCA9632_REG_MODE2, 0x20,
++ group_dmblnk_mode << PCA9632_DMBLNK_SHIFT);
++}
++
++static int get_group_dmblnk(struct pca9632_data *pca)
++{
++ return reg_read(pca, PCA9632_REG_MODE2) >> PCA9632_DMBLNK_SHIFT;
++}
++
++static ssize_t show_group_dmblnk(struct device *dev, struct device_attribute
++ *attr, char *buf)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pca9632_data *pca = i2c_get_clientdata(client);
++
++ if (get_group_dmblnk(pca))
++ return sprintf(buf, "blinking\n");
++ else
++ return sprintf(buf, "dimming\n");
++}
++
++static ssize_t set_group_dmblnk(struct device *dev, struct device_attribute
++ *attr, const char *buf, size_t count)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pca9632_data *pca = i2c_get_clientdata(client);
++ unsigned int mode = simple_strtoul(buf, NULL, 10);
++
++ if (mode)
++ dev_info(&pca->client.dev, "blinking\n");
++ else
++ dev_info(&pca->client.dev, "dimming\n");
++
++ config_group_dmblnk(pca, mode);
++
++ return count;
++}
++
++static DEVICE_ATTR(group_dmblnk, S_IRUGO | S_IWUSR, show_group_dmblnk,
++ set_group_dmblnk);
++
++static int reg_id_by_name(const char *name)
++{
++ int reg_id = -1;
++
++ if (!strncmp(name, "led0", 4))
++ reg_id = PCA9632_REG_PWM0;
++ else if (!strncmp(name, "led1", 4))
++ reg_id = PCA9632_REG_PWM1;
++ else if (!strncmp(name, "led2", 4))
++ reg_id = PCA9632_REG_PWM2;
++ else if (!strncmp(name, "led3", 4))
++ reg_id = PCA9632_REG_PWM3;
++
++ return reg_id;
++}
++
++static int get_led_output(struct pca9632_data *pca, int ldrx)
++{
++ u_int8_t led_state;
++
++ ldrx = ldrx - 2;
++ led_state = reg_read(pca, PCA9632_REG_LEDOUT);
++ led_state = (led_state >> (2 * ldrx)) & 0x03;
++
++ return led_state;
++}
++
++static void config_led_output(struct pca9632_data *pca, int ldrx,
++ enum pca9632_led_output led_output)
++{
++ u_int8_t mask;
++ int tmp;
++
++ ldrx = ldrx - 2;
++ mask = 0x03 << (2 * ldrx);
++ tmp = reg_set_bit_mask(pca, PCA9632_REG_LEDOUT,
++ mask, led_output << (2 * ldrx));
++}
++
++/*
++ * Individual brightness control
++ */
++static ssize_t show_brightness(struct device *dev, struct device_attribute
++ *attr, char *buf)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pca9632_data *pca = i2c_get_clientdata(client);
++ int ldrx;
++
++ ldrx = reg_id_by_name(attr->attr.name);
++
++ switch (get_led_output(pca, ldrx)) {
++
++ case PCA9632_OFF:
++ case PCA9632_ON:
++ return sprintf(buf, "%s",
++ led_output_name[get_led_output(pca, ldrx)]);
++
++ case PCA9632_CTRL_BY_PWM:
++ return sprintf(buf, "%d%% \n", calc_dc(reg_read(pca, ldrx)));
++
++ case PCA9632_CTRL_BY_PWM_GRPPWM:
++ /* check group dmblnk */
++ if (get_group_dmblnk(pca))
++ return sprintf(buf, "%d%% \n",
++ calc_dc(reg_read(pca, ldrx)));
++ return sprintf(buf, "%d%% \n",
++ calc_dc((reg_read(pca, ldrx) & 0xfc)));
++ default:
++ break;
++ }
++
++ return sprintf(buf, "invalid argument\n");
++}
++
++static ssize_t set_brightness(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pca9632_data *pca = i2c_get_clientdata(client);
++ unsigned int pwm = simple_strtoul(buf, NULL, 10);
++ int ldrx;
++
++ ldrx = reg_id_by_name(attr->attr.name);
++ reg_set_bit_mask(pca, ldrx, 0xff, pwm);
++
++ return count;
++}
++
++static
++DEVICE_ATTR(led0_pwm, S_IRUGO | S_IWUSR, show_brightness, set_brightness);
++static
++DEVICE_ATTR(led1_pwm, S_IRUGO | S_IWUSR, show_brightness, set_brightness);
++static
++DEVICE_ATTR(led2_pwm, S_IRUGO | S_IWUSR, show_brightness, set_brightness);
++static
++DEVICE_ATTR(led3_pwm, S_IRUGO | S_IWUSR, show_brightness, set_brightness);
++
++/*
++ * Group frequency control
++ */
++static ssize_t show_group_freq(struct device *dev, struct device_attribute
++ *attr, char *buf)
++{
++ uint32_t period;
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pca9632_data *pca = i2c_get_clientdata(client);
++
++ period = ((reg_read(pca, PCA9632_REG_GRPFREQ) + 1) * 1000) / 24;
++
++ return sprintf(buf, "%d ms\n", period);
++}
++
++static ssize_t set_group_freq(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pca9632_data *pca = i2c_get_clientdata(client);
++
++ unsigned int freq = simple_strtoul(buf, NULL, 10);
++ reg_write(pca, PCA9632_REG_GRPFREQ, freq);
++ return count;
++}
++
++static
++DEVICE_ATTR(group_freq, S_IRUGO | S_IWUSR, show_group_freq, set_group_freq);
++
++/*
++ * Group duty cycle tonrol*
++ */
++static ssize_t show_group_dc(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pca9632_data *pca = i2c_get_clientdata(client);
++
++ if (get_group_dmblnk(pca)) {
++
++ if (reg_read(pca, PCA9632_REG_GRPFREQ) <= 0x03)
++ return sprintf(buf, "%d%% \n",
++ calc_dc(reg_read(pca, PCA9632_REG_GRPPWM) & 0xfc));
++
++ return sprintf(buf, "%d%% \n", calc_dc(reg_read(pca,
++ PCA9632_REG_GRPPWM)));
++ }
++
++ return sprintf(buf, "%d%% \n", calc_dc(reg_read(pca,
++ PCA9632_REG_GRPPWM) & 0xf0));
++}
++
++static ssize_t set_group_dc(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pca9632_data *pca = i2c_get_clientdata(client);
++
++ unsigned int dc = simple_strtoul(buf, NULL, 10);
++
++ reg_set_bit_mask(pca, PCA9632_REG_GRPPWM, 0xff, dc);
++
++ return count;
++}
++
++static DEVICE_ATTR(group_dc, S_IRUGO | S_IWUSR, show_group_dc, set_group_dc);
++
++/*
++ * LED driver output
++ */
++static ssize_t show_led_output(struct device *dev, struct device_attribute
++ *attr, char *buf)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pca9632_data *pca = i2c_get_clientdata(client);
++ int ldrx;
++
++ ldrx = reg_id_by_name(attr->attr.name);
++
++ return sprintf(buf, "%s \n",
++ led_output_name[get_led_output(pca, ldrx)]);
++
++}
++static ssize_t set_led_output(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pca9632_data *pca = i2c_get_clientdata(client);
++ enum pca9632_led_output led_output;
++ int ldrx;
++
++ led_output = simple_strtoul(buf, NULL, 10);
++ ldrx = reg_id_by_name(attr->attr.name);
++ config_led_output(pca, ldrx, led_output);
++
++ return count;
++}
++
++static
++DEVICE_ATTR(led0_output, S_IRUGO | S_IWUSR, show_led_output, set_led_output);
++static
++DEVICE_ATTR(led1_output, S_IRUGO | S_IWUSR, show_led_output, set_led_output);
++static
++DEVICE_ATTR(led2_output, S_IRUGO | S_IWUSR, show_led_output, set_led_output);
++static
++DEVICE_ATTR(led3_output, S_IRUGO | S_IWUSR, show_led_output, set_led_output);
++
++static struct attribute *pca_sysfs_entries[] = {
++ &dev_attr_group_dmblnk.attr,
++ &dev_attr_led0_pwm.attr,
++ &dev_attr_led1_pwm.attr,
++ &dev_attr_led2_pwm.attr,
++ &dev_attr_led3_pwm.attr,
++ &dev_attr_group_dc.attr,
++ &dev_attr_group_freq.attr,
++ &dev_attr_led0_output.attr,
++ &dev_attr_led1_output.attr,
++ &dev_attr_led2_output.attr,
++ &dev_attr_led3_output.attr,
++ NULL
++};
++
++static struct attribute_group pca_attr_group = {
++ .name = NULL, /* put in device directory */
++ .attrs = pca_sysfs_entries,
++};
++
++#ifdef CONFIG_PM
++static int pca9632_suspend(struct device *dev, pm_message_t state)
++{
++ /* FIXME: Not implemented */
++ return 0;
++}
++
++static int pca9632_resume(struct device *dev)
++{
++ /* FIXME: Not implemented */
++ return 0;
++}
++#else
++#define pca9632_suspend NULL
++#define pca9632_resume NULL
++#endif
++
++static struct i2c_driver pca9632_driver = {
++ .driver = {
++ .name = "pca9632",
++ .suspend = pca9632_suspend,
++ .resume = pca9632_resume,
++ },
++ .id = I2C_DRIVERID_PCA9632,
++ .attach_adapter = pca9632_attach_adapter,
++ .detach_client = pca9632_detach_client,
++};
++
++static int pca9632_detect(struct i2c_adapter *adapter, int address, int kind)
++{
++ struct i2c_client *new_client;
++ struct pca9632_data *pca;
++ int err;
++
++ pca = kzalloc(sizeof(struct pca9632_data), GFP_KERNEL);
++ if (!pca)
++ return -ENOMEM;
++
++ mutex_init(&pca->lock);
++
++ new_client = &pca->client;
++ i2c_set_clientdata(new_client, pca);
++ new_client->addr = address;
++ new_client->adapter = adapter;
++ new_client->driver = &pca9632_driver;
++ new_client->flags = 0;
++
++ strlcpy(new_client->name, "pca9632", I2C_NAME_SIZE);
++
++ /* register with i2c core */
++ err = i2c_attach_client(new_client);
++ if (err)
++ goto exit_kfree;
++
++ err = sysfs_create_group(&new_client->dev.kobj, &pca_attr_group);
++ if (err)
++ goto exit_detach;
++
++ /* software reset */
++ if (!software_rst(adapter))
++ dev_info(&pca->client.dev, "pca9632 sw-rst done\n");
++
++ /* enter normal mode */
++ reg_set_bit_mask(pca, PCA9632_REG_MODE1, 0x10, PCA9632_NORMAL);
++
++ return 0;
++
++exit_detach:
++ i2c_detach_client(new_client);
++exit_kfree:
++ kfree(pca);
++
++ return err;
++}
++
++static int pca9632_attach_adapter(struct i2c_adapter *adapter)
++{
++ return i2c_probe(adapter, &addr_data, pca9632_detect);
++}
++
++static int pca9632_detach_client(struct i2c_client *client)
++{
++ int err;
++
++ sysfs_remove_group(&client->dev.kobj, &pca_attr_group);
++ err = i2c_detach_client(client);
++
++ if (err)
++ return err;
++
++ kfree(i2c_get_clientdata(client));
++
++ return 0;
++}
++
++static int __init pca9632_plat_probe(struct platform_device *pdev)
++{
++ /* FIXME: platform data should be attached here */
++ pca9632_pdev = pdev;
++
++ return 0;
++}
++
++static int pca9632_plat_remove(struct platform_device *pdev)
++{
++ return 0;
++}
++
++static struct platform_driver pca9632_plat_driver = {
++ .probe = pca9632_plat_probe,
++ .remove = pca9632_plat_remove,
++ .driver = {
++ .owner = THIS_MODULE,
++ .name = "pca9632",
++ },
++};
++
++static int __init pca9632_init(void)
++{
++ int rc;
++
++ rc = platform_driver_register(&pca9632_plat_driver);
++ if (!rc)
++ i2c_add_driver(&pca9632_driver);
++
++ return rc;
++}
++
++static void __exit pca9632_exit(void)
++{
++ i2c_del_driver(&pca9632_driver);
++
++ platform_driver_unregister(&pca9632_plat_driver);
++}
++
++MODULE_AUTHOR("Matt Hsu <matt_hsu@openmoko.org>");
++MODULE_DESCRIPTION("NXP PCA9632 driver");
++MODULE_LICENSE("GPL");
++
++module_init(pca9632_init);
++module_exit(pca9632_exit);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/i2c/chips/pca9632.h linux-2.6.29-rc3.owrt.om/drivers/i2c/chips/pca9632.h
+--- linux-2.6.29-rc3.owrt/drivers/i2c/chips/pca9632.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/i2c/chips/pca9632.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,24 @@
++#ifndef _PCA9632_H
++#define _PCA9632_H
++
++
++enum pca9632_regs{
++
++ PCA9632_REG_MODE1 = 0x00,
++ PCA9632_REG_MODE2 = 0x01,
++ PCA9632_REG_PWM0 = 0x02,
++ PCA9632_REG_PWM1 = 0x03,
++ PCA9632_REG_PWM2 = 0x04,
++ PCA9632_REG_PWM3 = 0x05,
++ PCA9632_REG_GRPPWM = 0x06,
++ PCA9632_REG_GRPFREQ = 0x07,
++ PCA9632_REG_LEDOUT = 0x08,
++ PCA9632_REG_SUBADDR1 = 0x09,
++ PCA9632_REG_SUBADDR2 = 0x0a,
++ PCA9632_REG_SUBADDR3 = 0x0b,
++ PCA9632_REG_ALLCALLADR1 = 0x0c,
++};
++
++#define PCA9632_DMBLNK_SHIFT 5
++
++#endif /* _PCA9632_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/i2c/chips/pcf50606.c linux-2.6.29-rc3.owrt.om/drivers/i2c/chips/pcf50606.c
+--- linux-2.6.29-rc3.owrt/drivers/i2c/chips/pcf50606.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/i2c/chips/pcf50606.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,2193 @@
++/* Philips/NXP PCF50606 Power Management Unit (PMU) driver
++ *
++ * (C) 2006-2007 by Openmoko, Inc.
++ * Authors: Harald Welte <laforge@openmoko.org>,
++ * Matt Hsu <matt@openmoko.org>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ *
++ * This driver is a monster ;) It provides the following features
++ * - voltage control for a dozen different voltage domains
++ * - charging control for main and backup battery
++ * - rtc / alarm
++ * - watchdog
++ * - adc driver (hw_sensors like)
++ * - pwm driver
++ * - backlight
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/i2c.h>
++#include <linux/types.h>
++#include <linux/interrupt.h>
++#include <linux/irq.h>
++#include <linux/workqueue.h>
++#include <linux/delay.h>
++#include <linux/rtc.h>
++#include <linux/bcd.h>
++#include <linux/watchdog.h>
++#include <linux/miscdevice.h>
++#include <linux/input.h>
++#include <linux/fb.h>
++#include <linux/backlight.h>
++#include <linux/sched.h>
++#include <linux/platform_device.h>
++#include <linux/pcf50606.h>
++#include <linux/apm-emulation.h>
++
++#include <asm/mach-types.h>
++#include <mach/gta01.h>
++
++#include "pcf50606.h"
++
++/* we use dev_dbg() throughout the code, but sometimes don't want to
++ * write an entire line of debug related information. This DEBUGPC
++ * macro is a continuation for dev_dbg() */
++#ifdef DEBUG
++#define DEBUGPC(x, args ...) printk(x, ## args)
++#else
++#define DEBUGPC(x, args ...)
++#endif
++
++/***********************************************************************
++ * Static data / structures
++ ***********************************************************************/
++
++static unsigned short normal_i2c[] = { 0x08, I2C_CLIENT_END };
++
++I2C_CLIENT_INSMOD_1(pcf50606);
++
++#define PCF50606_B_CHG_FAST 0 /* Charger Fast allowed */
++#define PCF50606_B_CHG_PRESENT 1 /* Charger present */
++#define PCF50606_B_CHG_FOK 2 /* Fast OK for battery */
++#define PCF50606_B_CHG_ERR 3 /* Charger Error */
++#define PCF50606_B_CHG_PROT 4 /* Charger Protection */
++#define PCF50606_B_CHG_READY 5 /* Charging completed */
++
++#define PCF50606_F_CHG_FAST (1<<PCF50606_B_CHG_FAST)
++#define PCF50606_F_CHG_PRESENT (1<<PCF50606_B_CHG_PRESENT)
++#define PCF50606_F_CHG_FOK (1<<PCF50606_B_CHG_FOK)
++#define PCF50606_F_CHG_ERR (1<<PCF50606_B_CHG_ERR)
++#define PCF50606_F_CHG_PROT (1<<PCF50606_B_CHG_PROT)
++#define PCF50606_F_CHG_READY (1<<PCF50606_B_CHG_READY)
++#define PCF50606_F_CHG_MASK 0x000000fc
++
++#define PCF50606_F_PWR_PRESSED 0x00000100
++#define PCF50606_F_RTC_SECOND 0x00000200
++
++enum close_state {
++ CLOSE_STATE_NOT,
++ CLOSE_STATE_ALLOW = 0x2342,
++};
++
++enum pcf50606_suspend_states {
++ PCF50606_SS_RUNNING,
++ PCF50606_SS_STARTING_SUSPEND,
++ PCF50606_SS_COMPLETED_SUSPEND,
++ PCF50606_SS_RESUMING_BUT_NOT_US_YET,
++ PCF50606_SS_STARTING_RESUME,
++ PCF50606_SS_COMPLETED_RESUME,
++};
++
++struct pcf50606_data {
++ struct i2c_client client;
++ struct pcf50606_platform_data *pdata;
++ struct backlight_device *backlight;
++ struct mutex lock;
++ unsigned int flags;
++ unsigned int working;
++ struct mutex working_lock;
++ struct work_struct work;
++ struct rtc_device *rtc;
++ struct input_dev *input_dev;
++ int allow_close;
++ int onkey_seconds;
++ int irq;
++ int coldplug_done;
++ int suppress_onkey_events;
++ enum pcf50606_suspend_states suspend_state;
++#ifdef CONFIG_PM
++ struct {
++ u_int8_t dcdc1, dcdc2;
++ u_int8_t dcdec1;
++ u_int8_t dcudc1;
++ u_int8_t ioregc;
++ u_int8_t d1regc1;
++ u_int8_t d2regc1;
++ u_int8_t d3regc1;
++ u_int8_t lpregc1;
++ u_int8_t adcc1, adcc2;
++ u_int8_t pwmc1;
++ u_int8_t int1m, int2m, int3m;
++ } standby_regs;
++#endif
++};
++
++static struct i2c_driver pcf50606_driver;
++
++/* This is an ugly construct on how to access the (currently single/global)
++ * pcf50606 handle from other code in the kernel. I didn't really come up with
++ * a more decent method of dynamically resolving this */
++struct pcf50606_data *pcf50606_global;
++EXPORT_SYMBOL_GPL(pcf50606_global);
++
++static struct platform_device *pcf50606_pdev;
++
++/* This is a 10k, B=3370 NTC Thermistor -10..79 centigrade */
++/* Table entries are offset by +0.5C so a properly rounded value is generated */
++static const u_int16_t ntc_table_10k_3370B[] = {
++ /* -10 */
++ 43888, 41819, 39862, 38010, 36257, 34596, 33024, 31534, 30121, 28781,
++ 27510, 26304, 25159, 24071, 23038, 22056, 21122, 20234, 19390, 18586,
++ 17821, 17093, 16399, 15738, 15107, 14506, 13933, 13387, 12865, 12367,
++ 11891, 11437, 11003, 10588, 10192, 9813, 9450, 9103, 8771, 8453,
++ 8149, 7857, 7578, 7310, 7054, 6808, 6572, 6346, 6129, 5920,
++ 5720, 5528, 5344, 5167, 4996, 4833, 4675, 4524, 4379, 4239,
++ 4104, 3975, 3850, 3730, 3614, 3503, 3396, 3292, 3193, 3097,
++ 3004, 2915, 2829, 2745, 2665, 2588, 2513, 2441, 2371, 2304,
++ 2239, 2176, 2116, 2057, 2000, 1945, 1892, 1841, 1791, 1743,
++};
++
++
++/***********************************************************************
++ * Low-Level routines
++ ***********************************************************************/
++
++static inline int __reg_write(struct pcf50606_data *pcf, u_int8_t reg,
++ u_int8_t val)
++{
++ if (pcf->suspend_state == PCF50606_SS_COMPLETED_SUSPEND) {
++ dev_err(&pcf->client.dev, "__reg_write while suspended.\n");
++ dump_stack();
++ }
++ return i2c_smbus_write_byte_data(&pcf->client, reg, val);
++}
++
++static int reg_write(struct pcf50606_data *pcf, u_int8_t reg, u_int8_t val)
++{
++ int ret;
++
++ mutex_lock(&pcf->lock);
++ ret = __reg_write(pcf, reg, val);
++ mutex_unlock(&pcf->lock);
++
++ return ret;
++}
++
++static inline int32_t __reg_read(struct pcf50606_data *pcf, u_int8_t reg)
++{
++ int32_t ret;
++
++ if (pcf->suspend_state == PCF50606_SS_COMPLETED_SUSPEND) {
++ dev_err(&pcf->client.dev, "__reg_read while suspended.\n");
++ dump_stack();
++ }
++ ret = i2c_smbus_read_byte_data(&pcf->client, reg);
++
++ return ret;
++}
++
++static u_int8_t reg_read(struct pcf50606_data *pcf, u_int8_t reg)
++{
++ int32_t ret;
++
++ mutex_lock(&pcf->lock);
++ ret = __reg_read(pcf, reg);
++ mutex_unlock(&pcf->lock);
++
++ return ret & 0xff;
++}
++
++static int reg_set_bit_mask(struct pcf50606_data *pcf,
++ u_int8_t reg, u_int8_t mask, u_int8_t val)
++{
++ int ret;
++ u_int8_t tmp;
++
++ val &= mask;
++
++ mutex_lock(&pcf->lock);
++
++ tmp = __reg_read(pcf, reg);
++ tmp &= ~mask;
++ tmp |= val;
++ ret = __reg_write(pcf, reg, tmp);
++
++ mutex_unlock(&pcf->lock);
++
++ return ret;
++}
++
++static int reg_clear_bits(struct pcf50606_data *pcf, u_int8_t reg, u_int8_t val)
++{
++ int ret;
++ u_int8_t tmp;
++
++ mutex_lock(&pcf->lock);
++
++ tmp = __reg_read(pcf, reg);
++ tmp &= ~val;
++ ret = __reg_write(pcf, reg, tmp);
++
++ mutex_unlock(&pcf->lock);
++
++ return ret;
++}
++
++/* synchronously read one ADC channel (busy-wait for result to be complete) */
++static u_int16_t adc_read(struct pcf50606_data *pcf, int channel,
++ u_int16_t *data2)
++{
++ u_int8_t adcs2, adcs1;
++ u_int16_t ret;
++
++ dev_dbg(&pcf->client.dev, "entering (pcf=%p, channel=%u, data2=%p)\n",
++ pcf, channel, data2);
++
++ channel &= PCF50606_ADCC2_ADCMUX_MASK;
++
++ mutex_lock(&pcf->lock);
++
++ /* start ADC conversion of selected channel */
++ __reg_write(pcf, PCF50606_REG_ADCC2, channel |
++ PCF50606_ADCC2_ADCSTART | PCF50606_ADCC2_RES_10BIT);
++
++ do {
++ adcs2 = __reg_read(pcf, PCF50606_REG_ADCS2);
++ } while (!(adcs2 & PCF50606_ADCS2_ADCRDY));
++
++ adcs1 = __reg_read(pcf, PCF50606_REG_ADCS1);
++ ret = (adcs1 << 2) | (adcs2 & 0x03);
++
++ if (data2) {
++ adcs1 = __reg_read(pcf, PCF50606_REG_ADCS3);
++ *data2 = (adcs1 << 2) | ((adcs2 & 0x0c) >> 2);
++ }
++
++ mutex_unlock(&pcf->lock);
++
++ dev_dbg(&pcf->client.dev, "returning %u %u\n", ret,
++ data2 ? *data2 : 0);
++
++ return ret;
++}
++
++/***********************************************************************
++ * Voltage / ADC
++ ***********************************************************************/
++
++static u_int8_t dcudc_voltage(unsigned int millivolts)
++{
++ if (millivolts < 900)
++ return 0;
++ if (millivolts > 5500)
++ return 0x1f;
++ if (millivolts <= 3300) {
++ millivolts -= 900;
++ return millivolts/300;
++ }
++ if (millivolts < 4000)
++ return 0x0f;
++ else {
++ millivolts -= 4000;
++ return millivolts/100;
++ }
++}
++
++static unsigned int dcudc_2voltage(u_int8_t bits)
++{
++ bits &= 0x1f;
++ if (bits < 0x08)
++ return 900 + bits * 300;
++ else if (bits < 0x10)
++ return 3300;
++ else
++ return 4000 + bits * 100;
++}
++
++static u_int8_t dcdec_voltage(unsigned int millivolts)
++{
++ if (millivolts < 900)
++ return 0;
++ else if (millivolts > 3300)
++ return 0x0f;
++
++ millivolts -= 900;
++ return millivolts/300;
++}
++
++static unsigned int dcdec_2voltage(u_int8_t bits)
++{
++ bits &= 0x0f;
++ return 900 + bits*300;
++}
++
++static u_int8_t dcdc_voltage(unsigned int millivolts)
++{
++ if (millivolts < 900)
++ return 0;
++ else if (millivolts > 3600)
++ return 0x1f;
++
++ if (millivolts < 1500) {
++ millivolts -= 900;
++ return millivolts/25;
++ } else {
++ millivolts -= 1500;
++ return 0x18 + millivolts/300;
++ }
++}
++
++static unsigned int dcdc_2voltage(u_int8_t bits)
++{
++ bits &= 0x1f;
++ if ((bits & 0x18) == 0x18)
++ return 1500 + ((bits & 0x7) * 300);
++ else
++ return 900 + (bits * 25);
++}
++
++static u_int8_t dx_voltage(unsigned int millivolts)
++{
++ if (millivolts < 900)
++ return 0;
++ else if (millivolts > 3300)
++ return 0x18;
++
++ millivolts -= 900;
++ return millivolts/100;
++}
++
++static unsigned int dx_2voltage(u_int8_t bits)
++{
++ bits &= 0x1f;
++ return 900 + (bits * 100);
++}
++
++static const u_int8_t regulator_registers[__NUM_PCF50606_REGULATORS] = {
++ [PCF50606_REGULATOR_DCD] = PCF50606_REG_DCDC1,
++ [PCF50606_REGULATOR_DCDE] = PCF50606_REG_DCDEC1,
++ [PCF50606_REGULATOR_DCUD] = PCF50606_REG_DCUDC1,
++ [PCF50606_REGULATOR_D1REG] = PCF50606_REG_D1REGC1,
++ [PCF50606_REGULATOR_D2REG] = PCF50606_REG_D2REGC1,
++ [PCF50606_REGULATOR_D3REG] = PCF50606_REG_D3REGC1,
++ [PCF50606_REGULATOR_LPREG] = PCF50606_REG_LPREGC1,
++ [PCF50606_REGULATOR_IOREG] = PCF50606_REG_IOREGC,
++};
++
++int pcf50606_onoff_set(struct pcf50606_data *pcf,
++ enum pcf50606_regulator_id reg, int on)
++{
++ u_int8_t addr;
++
++ if (reg >= __NUM_PCF50606_REGULATORS)
++ return -EINVAL;
++
++ /* IOREG cannot be powered off since it powers the PMU I2C */
++ if (reg == PCF50606_REGULATOR_IOREG)
++ return -EIO;
++
++ addr = regulator_registers[reg];
++
++ if (on == 0)
++ reg_set_bit_mask(pcf, addr, 0xe0, 0x00);
++ else
++ reg_set_bit_mask(pcf, addr, 0xe0, 0xe0);
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(pcf50606_onoff_set);
++
++int pcf50606_onoff_get(struct pcf50606_data *pcf,
++ enum pcf50606_regulator_id reg)
++{
++ u_int8_t val, addr;
++
++ if (reg >= __NUM_PCF50606_REGULATORS)
++ return -EINVAL;
++
++ addr = regulator_registers[reg];
++ val = (reg_read(pcf, addr) & 0xe0) >> 5;
++
++ /* PWREN1 = 1, PWREN2 = 1, see table 16 of datasheet */
++ switch (val) {
++ case 0:
++ case 5:
++ return 0;
++ default:
++ return 1;
++ }
++}
++EXPORT_SYMBOL_GPL(pcf50606_onoff_get);
++
++int pcf50606_voltage_set(struct pcf50606_data *pcf,
++ enum pcf50606_regulator_id reg,
++ unsigned int millivolts)
++{
++ u_int8_t volt_bits;
++ u_int8_t regnr;
++ int rc;
++
++ dev_dbg(&pcf->client.dev, "pcf=%p, reg=%d, mvolts=%d\n", pcf, reg,
++ millivolts);
++
++ if (reg >= __NUM_PCF50606_REGULATORS)
++ return -EINVAL;
++
++ if (millivolts > pcf->pdata->rails[reg].voltage.max)
++ return -EINVAL;
++
++ switch (reg) {
++ case PCF50606_REGULATOR_DCD:
++ volt_bits = dcdc_voltage(millivolts);
++ rc = reg_set_bit_mask(pcf, PCF50606_REG_DCDC1, 0x1f,
++ volt_bits);
++ break;
++ case PCF50606_REGULATOR_DCDE:
++ volt_bits = dcdec_voltage(millivolts);
++ rc = reg_set_bit_mask(pcf, PCF50606_REG_DCDEC1, 0x0f,
++ volt_bits);
++ break;
++ case PCF50606_REGULATOR_DCUD:
++ volt_bits = dcudc_voltage(millivolts);
++ rc = reg_set_bit_mask(pcf, PCF50606_REG_DCUDC1, 0x1f,
++ volt_bits);
++ break;
++ case PCF50606_REGULATOR_D1REG:
++ case PCF50606_REGULATOR_D2REG:
++ case PCF50606_REGULATOR_D3REG:
++ regnr = PCF50606_REG_D1REGC1 + (reg - PCF50606_REGULATOR_D1REG);
++ volt_bits = dx_voltage(millivolts);
++ rc = reg_set_bit_mask(pcf, regnr, 0x1f, volt_bits);
++ break;
++ case PCF50606_REGULATOR_LPREG:
++ volt_bits = dx_voltage(millivolts);
++ rc = reg_set_bit_mask(pcf, PCF50606_REG_LPREGC1, 0x1f,
++ volt_bits);
++ break;
++ case PCF50606_REGULATOR_IOREG:
++ if (millivolts < 1800)
++ return -EINVAL;
++ volt_bits = dx_voltage(millivolts);
++ rc = reg_set_bit_mask(pcf, PCF50606_REG_IOREGC, 0x1f,
++ volt_bits);
++ break;
++ default:
++ return -EINVAL;
++ }
++
++ return rc;
++}
++EXPORT_SYMBOL_GPL(pcf50606_voltage_set);
++
++unsigned int pcf50606_voltage_get(struct pcf50606_data *pcf,
++ enum pcf50606_regulator_id reg)
++{
++ u_int8_t volt_bits;
++ u_int8_t regnr;
++ unsigned int rc = 0;
++
++ if (reg >= __NUM_PCF50606_REGULATORS)
++ return -EINVAL;
++
++ switch (reg) {
++ case PCF50606_REGULATOR_DCD:
++ volt_bits = reg_read(pcf, PCF50606_REG_DCDC1) & 0x1f;
++ rc = dcdc_2voltage(volt_bits);
++ break;
++ case PCF50606_REGULATOR_DCDE:
++ volt_bits = reg_read(pcf, PCF50606_REG_DCDEC1) & 0x0f;
++ rc = dcdec_2voltage(volt_bits);
++ break;
++ case PCF50606_REGULATOR_DCUD:
++ volt_bits = reg_read(pcf, PCF50606_REG_DCUDC1) & 0x1f;
++ rc = dcudc_2voltage(volt_bits);
++ break;
++ case PCF50606_REGULATOR_D1REG:
++ case PCF50606_REGULATOR_D2REG:
++ case PCF50606_REGULATOR_D3REG:
++ regnr = PCF50606_REG_D1REGC1 + (reg - PCF50606_REGULATOR_D1REG);
++ volt_bits = reg_read(pcf, regnr) & 0x1f;
++ if (volt_bits > 0x18)
++ volt_bits = 0x18;
++ rc = dx_2voltage(volt_bits);
++ break;
++ case PCF50606_REGULATOR_LPREG:
++ volt_bits = reg_read(pcf, PCF50606_REG_LPREGC1) & 0x1f;
++ if (volt_bits > 0x18)
++ volt_bits = 0x18;
++ rc = dx_2voltage(volt_bits);
++ break;
++ case PCF50606_REGULATOR_IOREG:
++ volt_bits = reg_read(pcf, PCF50606_REG_IOREGC) & 0x1f;
++ if (volt_bits > 0x18)
++ volt_bits = 0x18;
++ rc = dx_2voltage(volt_bits);
++ break;
++ default:
++ return -EINVAL;
++ }
++
++ return rc;
++}
++EXPORT_SYMBOL_GPL(pcf50606_voltage_get);
++
++/* go into 'STANDBY' mode, i.e. power off the main CPU and peripherals */
++void pcf50606_go_standby(void)
++{
++ reg_write(pcf50606_global, PCF50606_REG_OOCC1,
++ PCF50606_OOCC1_GOSTDBY);
++}
++EXPORT_SYMBOL_GPL(pcf50606_go_standby);
++
++void pcf50606_gpo0_set(struct pcf50606_data *pcf, int on)
++{
++ u_int8_t val;
++
++ if (on)
++ val = 0x07;
++ else
++ val = 0x0f;
++
++ reg_set_bit_mask(pcf, PCF50606_REG_GPOC1, 0x0f, val);
++}
++EXPORT_SYMBOL_GPL(pcf50606_gpo0_set);
++
++int pcf50606_gpo0_get(struct pcf50606_data *pcf)
++{
++ u_int8_t reg = reg_read(pcf, PCF50606_REG_GPOC1) & 0x0f;
++
++ if (reg == 0x07 || reg == 0x08)
++ return 1;
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(pcf50606_gpo0_get);
++
++static void pcf50606_work(struct work_struct *work)
++{
++ struct pcf50606_data *pcf =
++ container_of(work, struct pcf50606_data, work);
++ u_int8_t pcfirq[3];
++ int ret;
++
++ mutex_lock(&pcf->working_lock);
++ pcf->working = 1;
++
++ /* sanity */
++ if (!&pcf->client.dev)
++ goto bail;
++
++ /*
++ * if we are presently suspending, we are not in a position to deal
++ * with pcf50606 interrupts at all.
++ *
++ * Because we didn't clear the int pending registers, there will be
++ * no edge / interrupt waiting for us when we wake. But it is OK
++ * because at the end of our resume, we call this workqueue function
++ * gratuitously, clearing the pending register and re-enabling
++ * servicing this interrupt.
++ */
++
++ if ((pcf->suspend_state == PCF50606_SS_STARTING_SUSPEND) ||
++ (pcf->suspend_state == PCF50606_SS_COMPLETED_SUSPEND))
++ goto bail;
++
++ /*
++ * If we are inside suspend -> resume completion time we don't attempt
++ * service until we have fully resumed. Although we could talk to the
++ * device as soon as I2C is up, the regs in the device which we might
++ * choose to modify as part of the service action have not been
++ * reloaded with their pre-suspend states yet. Therefore we will
++ * defer our service if we are called like that until our resume has
++ * completed.
++ *
++ * This shouldn't happen any more because we disable servicing this
++ * interrupt in suspend and don't re-enable it until resume is
++ * completed.
++ */
++
++ if (pcf->suspend_state &&
++ (pcf->suspend_state != PCF50606_SS_COMPLETED_RESUME))
++ goto reschedule;
++
++ /* this is the case early in resume! Sanity check! */
++ if (i2c_get_clientdata(&pcf->client) == NULL)
++ goto reschedule;
++
++ /*
++ * p35 pcf50606 datasheet rev 2.2:
++ * ''The system controller shall read all interrupt registers in
++ * one I2C read action''
++ * because if you don't INT# gets stuck asserted forever after a
++ * while
++ */
++ ret = i2c_smbus_read_i2c_block_data(&pcf->client, PCF50606_REG_INT1,
++ sizeof(pcfirq), pcfirq);
++ if (ret != sizeof(pcfirq)) {
++ DEBUGPC("Oh crap PMU IRQ register read failed %d\n", ret);
++ /*
++ * it shouldn't fail, we no longer attempt to use
++ * I2C while it can be suspended. But we don't have
++ * much option but to retry if if it ever did fail,
++ * because if we don't service the interrupt to clear
++ * it, we will never see another PMU interrupt edge.
++ */
++ goto reschedule;
++ }
++
++ /* hey did we just resume? (because we don't get here unless we are
++ * running normally or the first call after resumption)
++ *
++ * pcf50606 resume is really really over now then.
++ */
++ if (pcf->suspend_state != PCF50606_SS_RUNNING) {
++ pcf->suspend_state = PCF50606_SS_RUNNING;
++
++ /* peek at the IRQ reason, if power button then set a flag
++ * so that we do not signal the event to userspace
++ */
++ if (pcfirq[0] & (PCF50606_INT1_ONKEYF | PCF50606_INT1_ONKEYR)) {
++ pcf->suppress_onkey_events = 1;
++ dev_dbg(&pcf->client.dev,
++ "Wake by ONKEY, suppressing ONKEY events");
++ } else {
++ pcf->suppress_onkey_events = 0;
++ }
++ }
++
++ if (!pcf->coldplug_done) {
++ DEBUGPC("PMU Coldplug init\n");
++
++ /* we used SECOND to kick ourselves started -- turn it off */
++ pcfirq[0] &= ~PCF50606_INT1_SECOND;
++ reg_set_bit_mask(pcf, PCF50606_REG_INT1M, PCF50606_INT1_SECOND,
++ PCF50606_INT1_SECOND);
++
++ /* coldplug the USB if present */
++ if (__reg_read(pcf, PCF50606_REG_OOCS) & PCF50606_OOCS_EXTON) {
++ /* Charger inserted */
++ DEBUGPC("COLD CHGINS ");
++ input_report_key(pcf->input_dev, KEY_BATTERY, 1);
++ apm_queue_event(APM_POWER_STATUS_CHANGE);
++ pcf->flags |= PCF50606_F_CHG_PRESENT;
++ if (pcf->pdata->cb)
++ pcf->pdata->cb(&pcf->client.dev,
++ PCF50606_FEAT_MBC,
++ PMU_EVT_INSERT);
++ }
++
++ pcf->coldplug_done = 1;
++ }
++
++
++ dev_dbg(&pcf->client.dev, "INT1=0x%02x INT2=0x%02x INT3=0x%02x:",
++ pcfirq[0], pcfirq[1], pcfirq[2]);
++
++ if (pcfirq[0] & PCF50606_INT1_ONKEYF) {
++ /* ONKEY falling edge (start of button press) */
++ pcf->flags |= PCF50606_F_PWR_PRESSED;
++ if (!pcf->suppress_onkey_events) {
++ DEBUGPC("ONKEYF ");
++ input_report_key(pcf->input_dev, KEY_POWER, 1);
++ } else {
++ DEBUGPC("ONKEYF(unreported) ");
++ }
++ }
++ if (pcfirq[0] & PCF50606_INT1_ONKEY1S) {
++ /* ONKEY pressed for more than 1 second */
++ pcf->onkey_seconds = 0;
++ DEBUGPC("ONKEY1S ");
++ /* Tell PMU we are taking care of this */
++ reg_set_bit_mask(pcf, PCF50606_REG_OOCC1,
++ PCF50606_OOCC1_TOTRST,
++ PCF50606_OOCC1_TOTRST);
++ /* enable SECOND interrupt (hz tick) */
++ reg_clear_bits(pcf, PCF50606_REG_INT1M, PCF50606_INT1_SECOND);
++ }
++ if (pcfirq[0] & PCF50606_INT1_ONKEYR) {
++ /* ONKEY rising edge (end of button press) */
++ pcf->flags &= ~PCF50606_F_PWR_PRESSED;
++ pcf->onkey_seconds = -1;
++ if (!pcf->suppress_onkey_events) {
++ DEBUGPC("ONKEYR ");
++ input_report_key(pcf->input_dev, KEY_POWER, 0);
++ } else {
++ DEBUGPC("ONKEYR(suppressed) ");
++ /* don't suppress any more power button events */
++ pcf->suppress_onkey_events = 0;
++ }
++ /* disable SECOND interrupt in case RTC didn't
++ * request it */
++ if (!(pcf->flags & PCF50606_F_RTC_SECOND))
++ reg_set_bit_mask(pcf, PCF50606_REG_INT1M,
++ PCF50606_INT1_SECOND,
++ PCF50606_INT1_SECOND);
++ }
++ if (pcfirq[0] & PCF50606_INT1_EXTONR) {
++ DEBUGPC("EXTONR ");
++ input_report_key(pcf->input_dev, KEY_POWER2, 1);
++ }
++ if (pcfirq[0] & PCF50606_INT1_EXTONF) {
++ DEBUGPC("EXTONF ");
++ input_report_key(pcf->input_dev, KEY_POWER2, 0);
++ }
++ if (pcfirq[0] & PCF50606_INT1_SECOND) {
++ DEBUGPC("SECOND ");
++ if (pcf->flags & PCF50606_F_RTC_SECOND)
++ rtc_update_irq(pcf->rtc, 1,
++ RTC_PF | RTC_IRQF);
++
++ if (pcf->onkey_seconds >= 0 &&
++ pcf->flags & PCF50606_F_PWR_PRESSED) {
++ DEBUGPC("ONKEY_SECONDS(%u, OOCC1=0x%02x) ",
++ pcf->onkey_seconds,
++ reg_read(pcf, PCF50606_REG_OOCC1));
++ pcf->onkey_seconds++;
++ if (pcf->onkey_seconds >=
++ pcf->pdata->onkey_seconds_required) {
++ /* Ask init to do 'ctrlaltdel' */
++ /*
++ * currently Linux reacts badly to issuing a
++ * signal to PID #1 before init is started.
++ * What happens is that the next kernel thread
++ * to start, which is the JFFS2 Garbage
++ * collector in our case, gets the signal
++ * instead and proceeds to fail to fork --
++ * which is very bad. Therefore we confirm
++ * PID #1 exists before issuing the signal
++ */
++ if (find_task_by_pid_ns(1, &init_pid_ns)) {
++ kill_pid(task_pid(find_task_by_pid_ns(1,
++ &init_pid_ns)), SIGINT, 1);
++ DEBUGPC("SIGINT(init) ");
++ }
++ /* FIXME: what to do if userspace doesn't
++ * shut down? Do we want to force it? */
++ }
++ }
++ }
++ if (pcfirq[0] & PCF50606_INT1_ALARM) {
++ DEBUGPC("ALARM ");
++ if (pcf->pdata->used_features & PCF50606_FEAT_RTC)
++ rtc_update_irq(pcf->rtc, 1,
++ RTC_AF | RTC_IRQF);
++ }
++
++ if (pcfirq[1] & PCF50606_INT2_CHGINS) {
++ /* Charger inserted */
++ DEBUGPC("CHGINS ");
++ input_report_key(pcf->input_dev, KEY_BATTERY, 1);
++ apm_queue_event(APM_POWER_STATUS_CHANGE);
++ pcf->flags |= PCF50606_F_CHG_PRESENT;
++ if (pcf->pdata->cb)
++ pcf->pdata->cb(&pcf->client.dev,
++ PCF50606_FEAT_MBC, PMU_EVT_INSERT);
++ /* FIXME: how to signal this to userspace */
++ }
++ if (pcfirq[1] & PCF50606_INT2_CHGRM) {
++ /* Charger removed */
++ DEBUGPC("CHGRM ");
++ input_report_key(pcf->input_dev, KEY_BATTERY, 0);
++ apm_queue_event(APM_POWER_STATUS_CHANGE);
++ pcf->flags &= ~(PCF50606_F_CHG_MASK|PCF50606_F_CHG_PRESENT);
++ if (pcf->pdata->cb)
++ pcf->pdata->cb(&pcf->client.dev,
++ PCF50606_FEAT_MBC, PMU_EVT_INSERT);
++ /* FIXME: how signal this to userspace */
++ }
++ if (pcfirq[1] & PCF50606_INT2_CHGFOK) {
++ /* Battery ready for fast charging */
++ DEBUGPC("CHGFOK ");
++ pcf->flags |= PCF50606_F_CHG_FOK;
++ /* FIXME: how to signal this to userspace */
++ }
++ if (pcfirq[1] & PCF50606_INT2_CHGERR) {
++ /* Error in charge mode */
++ DEBUGPC("CHGERR ");
++ pcf->flags |= PCF50606_F_CHG_ERR;
++ pcf->flags &= ~(PCF50606_F_CHG_FOK|PCF50606_F_CHG_READY);
++ /* FIXME: how to signal this to userspace */
++ }
++ if (pcfirq[1] & PCF50606_INT2_CHGFRDY) {
++ /* Fast charge completed */
++ DEBUGPC("CHGFRDY ");
++ pcf->flags |= PCF50606_F_CHG_READY;
++ pcf->flags &= ~PCF50606_F_CHG_FOK;
++ /* FIXME: how to signal this to userspace */
++ }
++ if (pcfirq[1] & PCF50606_INT2_CHGPROT) {
++ /* Charging protection interrupt */
++ DEBUGPC("CHGPROT ");
++ pcf->flags &= ~(PCF50606_F_CHG_FOK|PCF50606_F_CHG_READY);
++ /* FIXME: signal this to userspace */
++ }
++ if (pcfirq[1] & PCF50606_INT2_CHGWD10S) {
++ /* Charger watchdog will expire in 10 seconds */
++ DEBUGPC("CHGWD10S ");
++ reg_set_bit_mask(pcf, PCF50606_REG_OOCC1,
++ PCF50606_OOCC1_WDTRST,
++ PCF50606_OOCC1_WDTRST);
++ }
++ if (pcfirq[1] & PCF50606_INT2_CHGWDEXP) {
++ /* Charger watchdog expires */
++ DEBUGPC("CHGWDEXP ");
++ /* FIXME: how to signal this to userspace */
++ }
++
++ if (pcfirq[2] & PCF50606_INT3_ADCRDY) {
++ /* ADC result ready */
++ DEBUGPC("ADCRDY ");
++ }
++ if (pcfirq[2] & PCF50606_INT3_ACDINS) {
++ /* Accessory insertion detected */
++ DEBUGPC("ACDINS ");
++ if (pcf->pdata->cb)
++ pcf->pdata->cb(&pcf->client.dev,
++ PCF50606_FEAT_ACD, PMU_EVT_INSERT);
++ }
++ if (pcfirq[2] & PCF50606_INT3_ACDREM) {
++ /* Accessory removal detected */
++ DEBUGPC("ACDREM ");
++ if (pcf->pdata->cb)
++ pcf->pdata->cb(&pcf->client.dev,
++ PCF50606_FEAT_ACD, PMU_EVT_REMOVE);
++ }
++ /* FIXME: TSCPRES */
++ if (pcfirq[2] & PCF50606_INT3_LOWBAT) {
++ if (__reg_read(pcf, PCF50606_REG_OOCS) & PCF50606_OOCS_EXTON) {
++ /*
++ * hey no need to freak out, we have some kind of
++ * valid charger power
++ */
++ DEBUGPC("(NO)BAT ");
++ } else {
++ /* Really low battery voltage, we have 8 seconds left */
++ DEBUGPC("LOWBAT ");
++ /*
++ * currently Linux reacts badly to issuing a signal to
++ * PID #1 before init is started. What happens is that
++ * the next kernel thread to start, which is the JFFS2
++ * Garbage collector in our case, gets the signal
++ * instead and proceeds to fail to fork -- which is
++ * very bad. Therefore we confirm PID #1 exists
++ * before issuing SPIGPWR
++ */
++ if (find_task_by_pid_ns(1, &init_pid_ns)) {
++ apm_queue_event(APM_LOW_BATTERY);
++ DEBUGPC("SIGPWR(init) ");
++ kill_pid(task_pid(find_task_by_pid_ns(1, &init_pid_ns)), SIGPWR, 1);
++ } else
++ /*
++ * well, our situation is like this: we do not
++ * have any external power, we have a low
++ * battery and since PID #1 doesn't exist yet,
++ * we are early in the boot, likely before
++ * rootfs mount. We should just call it a day
++ */
++ apm_queue_event(APM_CRITICAL_SUSPEND);
++ }
++ /* Tell PMU we are taking care of this */
++ reg_set_bit_mask(pcf, PCF50606_REG_OOCC1,
++ PCF50606_OOCC1_TOTRST,
++ PCF50606_OOCC1_TOTRST);
++ }
++ if (pcfirq[2] & PCF50606_INT3_HIGHTMP) {
++ /* High temperature */
++ DEBUGPC("HIGHTMP ");
++ apm_queue_event(APM_CRITICAL_SUSPEND);
++ }
++
++ DEBUGPC("\n");
++
++bail:
++ pcf->working = 0;
++ input_sync(pcf->input_dev);
++ put_device(&pcf->client.dev);
++ mutex_unlock(&pcf->working_lock);
++
++ return;
++
++reschedule:
++
++ if ((pcf->suspend_state != PCF50606_SS_STARTING_SUSPEND) &&
++ (pcf->suspend_state != PCF50606_SS_COMPLETED_SUSPEND)) {
++ msleep(10);
++ dev_info(&pcf->client.dev, "rescheduling interrupt service\n");
++ }
++ if (!schedule_work(&pcf->work))
++ dev_err(&pcf->client.dev, "int service reschedule failed\n");
++
++ /* we don't put the device here, hold it for next time */
++ mutex_unlock(&pcf->working_lock);
++}
++
++static irqreturn_t pcf50606_irq(int irq, void *_pcf)
++{
++ struct pcf50606_data *pcf = _pcf;
++
++ dev_dbg(&pcf->client.dev, "entering(irq=%u, pcf=%p): scheduling work\n",
++ irq, _pcf);
++ get_device(&pcf->client.dev);
++ if (!schedule_work(&pcf->work) && !pcf->working)
++ dev_err(&pcf->client.dev, "pcf irq work already queued.\n");
++
++ return IRQ_HANDLED;
++}
++
++static u_int16_t adc_to_batt_millivolts(u_int16_t adc)
++{
++ u_int16_t mvolts;
++
++ mvolts = (adc * 6000) / 1024;
++
++ return mvolts;
++}
++
++#define BATTVOLT_SCALE_START 2800
++#define BATTVOLT_SCALE_END 4200
++#define BATTVOLT_SCALE_DIVIDER ((BATTVOLT_SCALE_END - BATTVOLT_SCALE_START)/100)
++
++static u_int8_t battvolt_scale(u_int16_t battvolt)
++{
++ /* FIXME: this linear scale is completely bogus */
++ u_int16_t battvolt_relative = battvolt - BATTVOLT_SCALE_START;
++ unsigned int percent = battvolt_relative / BATTVOLT_SCALE_DIVIDER;
++
++ return percent;
++}
++
++u_int16_t pcf50606_battvolt(struct pcf50606_data *pcf)
++{
++ u_int16_t adc;
++ adc = adc_read(pcf, PCF50606_ADCMUX_BATVOLT_RES, NULL);
++
++ return adc_to_batt_millivolts(adc);
++}
++EXPORT_SYMBOL_GPL(pcf50606_battvolt);
++
++static ssize_t show_battvolt(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pcf50606_data *pcf = i2c_get_clientdata(client);
++
++ return sprintf(buf, "%u\n", pcf50606_battvolt(pcf));
++}
++static DEVICE_ATTR(battvolt, S_IRUGO | S_IWUSR, show_battvolt, NULL);
++
++static int reg_id_by_name(const char *name)
++{
++ int reg_id;
++
++ if (!strcmp(name, "voltage_dcd"))
++ reg_id = PCF50606_REGULATOR_DCD;
++ else if (!strcmp(name, "voltage_dcde"))
++ reg_id = PCF50606_REGULATOR_DCDE;
++ else if (!strcmp(name, "voltage_dcud"))
++ reg_id = PCF50606_REGULATOR_DCUD;
++ else if (!strcmp(name, "voltage_d1reg"))
++ reg_id = PCF50606_REGULATOR_D1REG;
++ else if (!strcmp(name, "voltage_d2reg"))
++ reg_id = PCF50606_REGULATOR_D2REG;
++ else if (!strcmp(name, "voltage_d3reg"))
++ reg_id = PCF50606_REGULATOR_D3REG;
++ else if (!strcmp(name, "voltage_lpreg"))
++ reg_id = PCF50606_REGULATOR_LPREG;
++ else if (!strcmp(name, "voltage_ioreg"))
++ reg_id = PCF50606_REGULATOR_IOREG;
++ else
++ reg_id = -1;
++
++ return reg_id;
++}
++
++static ssize_t show_vreg(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pcf50606_data *pcf = i2c_get_clientdata(client);
++ unsigned int reg_id;
++
++ reg_id = reg_id_by_name(attr->attr.name);
++ if (reg_id < 0)
++ return 0;
++
++ if (pcf50606_onoff_get(pcf, reg_id) > 0)
++ return sprintf(buf, "%u\n", pcf50606_voltage_get(pcf, reg_id));
++ else
++ return strlcpy(buf, "0\n", PAGE_SIZE);
++}
++
++static ssize_t set_vreg(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pcf50606_data *pcf = i2c_get_clientdata(client);
++ unsigned long mvolts = simple_strtoul(buf, NULL, 10);
++ unsigned int reg_id;
++
++ reg_id = reg_id_by_name(attr->attr.name);
++ if (reg_id < 0)
++ return -EIO;
++
++ dev_dbg(dev, "attempting to set %s(%d) to %lu mvolts\n",
++ attr->attr.name, reg_id, mvolts);
++
++ if (mvolts == 0) {
++ pcf50606_onoff_set(pcf, reg_id, 0);
++ } else {
++ if (pcf50606_voltage_set(pcf, reg_id, mvolts) < 0) {
++ dev_warn(dev, "refusing to set %s(%d) to %lu mvolts "
++ "(max=%u)\n", attr->attr.name, reg_id, mvolts,
++ pcf->pdata->rails[reg_id].voltage.max);
++ return -EINVAL;
++ }
++ pcf50606_onoff_set(pcf, reg_id, 1);
++ }
++
++ return count;
++}
++
++static DEVICE_ATTR(voltage_dcd, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
++static DEVICE_ATTR(voltage_dcde, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
++static DEVICE_ATTR(voltage_dcud, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
++static DEVICE_ATTR(voltage_d1reg, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
++static DEVICE_ATTR(voltage_d2reg, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
++static DEVICE_ATTR(voltage_d3reg, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
++static DEVICE_ATTR(voltage_lpreg, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
++static DEVICE_ATTR(voltage_ioreg, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
++
++/***********************************************************************
++ * Charger Control
++ ***********************************************************************/
++
++/* Enable/disable fast charging (500mA in the GTA01) */
++void pcf50606_charge_fast(struct pcf50606_data *pcf, int on)
++{
++ if (!(pcf->pdata->used_features & PCF50606_FEAT_MBC))
++ return;
++
++ if (on) {
++ /* We can allow PCF to automatically charge
++ * using Ifast */
++ pcf->flags |= PCF50606_F_CHG_FAST;
++ reg_set_bit_mask(pcf, PCF50606_REG_MBCC1,
++ PCF50606_MBCC1_AUTOFST,
++ PCF50606_MBCC1_AUTOFST);
++ } else {
++ pcf->flags &= ~PCF50606_F_CHG_FAST;
++ /* disable automatic fast-charge */
++ reg_clear_bits(pcf, PCF50606_REG_MBCC1,
++ PCF50606_MBCC1_AUTOFST);
++ /* switch to idle mode to abort existing charge
++ * process */
++ reg_set_bit_mask(pcf, PCF50606_REG_MBCC1,
++ PCF50606_MBCC1_CHGMOD_MASK,
++ PCF50606_MBCC1_CHGMOD_IDLE);
++ }
++}
++EXPORT_SYMBOL_GPL(pcf50606_charge_fast);
++
++static inline u_int16_t adc_to_rntc(struct pcf50606_data *pcf, u_int16_t adc)
++{
++ u_int32_t r_ntc = (adc * (u_int32_t)pcf->pdata->r_fix_batt)
++ / (1023 - adc);
++
++ return r_ntc;
++}
++
++static inline int16_t rntc_to_temp(u_int16_t rntc)
++{
++ int i;
++
++ for (i = 0; i < ARRAY_SIZE(ntc_table_10k_3370B); i++) {
++ if (rntc > ntc_table_10k_3370B[i])
++ return i - 10; /* First element is -10 */
++ }
++ return -99; /* Below our range */
++}
++
++static ssize_t show_battemp(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pcf50606_data *pcf = i2c_get_clientdata(client);
++ u_int16_t adc;
++
++ adc = adc_read(pcf, PCF50606_ADCMUX_BATTEMP, NULL);
++
++ return sprintf(buf, "%d\n", rntc_to_temp(adc_to_rntc(pcf, adc)));
++}
++static DEVICE_ATTR(battemp, S_IRUGO | S_IWUSR, show_battemp, NULL);
++
++static inline int16_t adc_to_chg_milliamps(struct pcf50606_data *pcf,
++ u_int16_t adc_adcin1,
++ u_int16_t adc_batvolt)
++{
++ int32_t res = (adc_adcin1 - adc_batvolt) * 2400;
++ return (res * 1000) / (pcf->pdata->r_sense_milli * 1024);
++}
++
++static ssize_t show_chgcur(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pcf50606_data *pcf = i2c_get_clientdata(client);
++ u_int16_t adc_batvolt, adc_adcin1;
++ int16_t ma;
++
++ adc_batvolt = adc_read(pcf, PCF50606_ADCMUX_BATVOLT_ADCIN1,
++ &adc_adcin1);
++ ma = adc_to_chg_milliamps(pcf, adc_adcin1, adc_batvolt);
++
++ return sprintf(buf, "%d\n", ma);
++}
++static DEVICE_ATTR(chgcur, S_IRUGO | S_IWUSR, show_chgcur, NULL);
++
++static const char *chgmode_names[] = {
++ [PCF50606_MBCC1_CHGMOD_QUAL] = "qualification",
++ [PCF50606_MBCC1_CHGMOD_PRE] = "pre",
++ [PCF50606_MBCC1_CHGMOD_TRICKLE] = "trickle",
++ [PCF50606_MBCC1_CHGMOD_FAST_CCCV] = "fast_cccv",
++ [PCF50606_MBCC1_CHGMOD_FAST_NOCC] = "fast_nocc",
++ [PCF50606_MBCC1_CHGMOD_FAST_NOCV] = "fast_nocv",
++ [PCF50606_MBCC1_CHGMOD_FAST_SW] = "fast_switch",
++ [PCF50606_MBCC1_CHGMOD_IDLE] = "idle",
++};
++
++static ssize_t show_chgmode(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pcf50606_data *pcf = i2c_get_clientdata(client);
++ u_int8_t mbcc1 = reg_read(pcf, PCF50606_REG_MBCC1);
++ u_int8_t chgmod = (mbcc1 & PCF50606_MBCC1_CHGMOD_MASK);
++
++ return sprintf(buf, "%s\n", chgmode_names[chgmod]);
++}
++
++static ssize_t set_chgmode(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pcf50606_data *pcf = i2c_get_clientdata(client);
++ u_int8_t mbcc1 = reg_read(pcf, PCF50606_REG_MBCC1);
++
++ mbcc1 &= ~PCF50606_MBCC1_CHGMOD_MASK;
++
++ if (!strcmp(buf, "qualification"))
++ mbcc1 |= PCF50606_MBCC1_CHGMOD_QUAL;
++ else if (!strcmp(buf, "pre"))
++ mbcc1 |= PCF50606_MBCC1_CHGMOD_PRE;
++ else if (!strcmp(buf, "trickle"))
++ mbcc1 |= PCF50606_MBCC1_CHGMOD_TRICKLE;
++ else if (!strcmp(buf, "fast_cccv"))
++ mbcc1 |= PCF50606_MBCC1_CHGMOD_FAST_CCCV;
++ /* We don't allow the other fast modes for security reasons */
++ else if (!strcmp(buf, "idle"))
++ mbcc1 |= PCF50606_MBCC1_CHGMOD_IDLE;
++ else
++ return -EINVAL;
++
++ reg_write(pcf, PCF50606_REG_MBCC1, mbcc1);
++
++ return count;
++}
++
++static DEVICE_ATTR(chgmode, S_IRUGO | S_IWUSR, show_chgmode, set_chgmode);
++
++static const char *chgstate_names[] = {
++ [PCF50606_B_CHG_FAST] = "fast_enabled",
++ [PCF50606_B_CHG_PRESENT] = "present",
++ [PCF50606_B_CHG_FOK] = "fast_ok",
++ [PCF50606_B_CHG_ERR] = "error",
++ [PCF50606_B_CHG_PROT] = "protection",
++ [PCF50606_B_CHG_READY] = "ready",
++};
++
++static ssize_t show_chgstate(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pcf50606_data *pcf = i2c_get_clientdata(client);
++ char *b = buf;
++ int i;
++
++ for (i = 0; i < 32; i++)
++ if (pcf->flags & (1 << i) && i < ARRAY_SIZE(chgstate_names))
++ b += sprintf(b, "%s ", chgstate_names[i]);
++
++ if (b > buf)
++ b += sprintf(b, "\n");
++
++ return b - buf;
++}
++static DEVICE_ATTR(chgstate, S_IRUGO | S_IWUSR, show_chgstate, NULL);
++
++/***********************************************************************
++ * APM emulation
++ ***********************************************************************/
++
++static void pcf50606_get_power_status(struct apm_power_info *info)
++{
++ struct pcf50606_data *pcf = pcf50606_global;
++ u_int8_t mbcc1 = reg_read(pcf, PCF50606_REG_MBCC1);
++ u_int8_t chgmod = mbcc1 & PCF50606_MBCC1_CHGMOD_MASK;
++ u_int16_t battvolt = pcf50606_battvolt(pcf);
++
++ if (reg_read(pcf, PCF50606_REG_OOCS) & PCF50606_OOCS_EXTON)
++ info->ac_line_status = APM_AC_ONLINE;
++ else
++ info->ac_line_status = APM_AC_OFFLINE;
++
++ switch (chgmod) {
++ case PCF50606_MBCC1_CHGMOD_QUAL:
++ case PCF50606_MBCC1_CHGMOD_PRE:
++ case PCF50606_MBCC1_CHGMOD_IDLE:
++ info->battery_life = battvolt_scale(battvolt);
++ break;
++ default:
++ info->battery_status = APM_BATTERY_STATUS_CHARGING;
++ info->battery_flag = APM_BATTERY_FLAG_CHARGING;
++ break;
++ }
++}
++
++/***********************************************************************
++ * RTC
++ ***********************************************************************/
++
++struct pcf50606_time {
++ u_int8_t sec;
++ u_int8_t min;
++ u_int8_t hour;
++ u_int8_t wkday;
++ u_int8_t day;
++ u_int8_t month;
++ u_int8_t year;
++};
++
++static void pcf2rtc_time(struct rtc_time *rtc, struct pcf50606_time *pcf)
++{
++ rtc->tm_sec = bcd2bin(pcf->sec);
++ rtc->tm_min = bcd2bin(pcf->min);
++ rtc->tm_hour = bcd2bin(pcf->hour);
++ rtc->tm_wday = bcd2bin(pcf->wkday);
++ rtc->tm_mday = bcd2bin(pcf->day);
++ rtc->tm_mon = bcd2bin(pcf->month);
++ rtc->tm_year = bcd2bin(pcf->year) + 100;
++}
++
++static void rtc2pcf_time(struct pcf50606_time *pcf, struct rtc_time *rtc)
++{
++ pcf->sec = bin2bcd(rtc->tm_sec);
++ pcf->min = bin2bcd(rtc->tm_min);
++ pcf->hour = bin2bcd(rtc->tm_hour);
++ pcf->wkday = bin2bcd(rtc->tm_wday);
++ pcf->day = bin2bcd(rtc->tm_mday);
++ pcf->month = bin2bcd(rtc->tm_mon);
++ pcf->year = bin2bcd(rtc->tm_year - 100);
++}
++
++static int pcf50606_rtc_ioctl(struct device *dev, unsigned int cmd,
++ unsigned long arg)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pcf50606_data *pcf = i2c_get_clientdata(client);
++
++ switch (cmd) {
++ case RTC_AIE_OFF:
++ /* disable the alarm interrupt */
++ reg_set_bit_mask(pcf, PCF50606_REG_INT1M,
++ PCF50606_INT1_ALARM, PCF50606_INT1_ALARM);
++ return 0;
++ case RTC_AIE_ON:
++ /* enable the alarm interrupt */
++ reg_clear_bits(pcf, PCF50606_REG_INT1M, PCF50606_INT1_ALARM);
++ return 0;
++ case RTC_PIE_OFF:
++ /* disable periodic interrupt (hz tick) */
++ pcf->flags &= ~PCF50606_F_RTC_SECOND;
++ reg_set_bit_mask(pcf, PCF50606_REG_INT1M,
++ PCF50606_INT1_SECOND, PCF50606_INT1_SECOND);
++ return 0;
++ case RTC_PIE_ON:
++ /* ensable periodic interrupt (hz tick) */
++ pcf->flags |= PCF50606_F_RTC_SECOND;
++ reg_clear_bits(pcf, PCF50606_REG_INT1M, PCF50606_INT1_SECOND);
++ return 0;
++ }
++ return -ENOIOCTLCMD;
++}
++
++static int pcf50606_rtc_read_time(struct device *dev, struct rtc_time *tm)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pcf50606_data *pcf = i2c_get_clientdata(client);
++ struct pcf50606_time pcf_tm;
++
++ mutex_lock(&pcf->lock);
++ pcf_tm.sec = __reg_read(pcf, PCF50606_REG_RTCSC);
++ pcf_tm.min = __reg_read(pcf, PCF50606_REG_RTCMN);
++ pcf_tm.hour = __reg_read(pcf, PCF50606_REG_RTCHR);
++ pcf_tm.wkday = __reg_read(pcf, PCF50606_REG_RTCWD);
++ pcf_tm.day = __reg_read(pcf, PCF50606_REG_RTCDT);
++ pcf_tm.month = __reg_read(pcf, PCF50606_REG_RTCMT);
++ pcf_tm.year = __reg_read(pcf, PCF50606_REG_RTCYR);
++ mutex_unlock(&pcf->lock);
++
++ dev_dbg(dev, "PCF_TIME: %02x.%02x.%02x %02x:%02x:%02x\n",
++ pcf_tm.day, pcf_tm.month, pcf_tm.year,
++ pcf_tm.hour, pcf_tm.min, pcf_tm.sec);
++
++ pcf2rtc_time(tm, &pcf_tm);
++
++ dev_dbg(dev, "RTC_TIME: %u.%u.%u %u:%u:%u\n",
++ tm->tm_mday, tm->tm_mon, tm->tm_year,
++ tm->tm_hour, tm->tm_min, tm->tm_sec);
++
++ return 0;
++}
++
++static int pcf50606_rtc_set_time(struct device *dev, struct rtc_time *tm)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pcf50606_data *pcf = i2c_get_clientdata(client);
++ struct pcf50606_time pcf_tm;
++ u_int8_t int1m;
++
++ dev_dbg(dev, "RTC_TIME: %u.%u.%u %u:%u:%u\n",
++ tm->tm_mday, tm->tm_mon, tm->tm_year,
++ tm->tm_hour, tm->tm_min, tm->tm_sec);
++ rtc2pcf_time(&pcf_tm, tm);
++ dev_dbg(dev, "PCF_TIME: %02x.%02x.%02x %02x:%02x:%02x\n",
++ pcf_tm.day, pcf_tm.month, pcf_tm.year,
++ pcf_tm.hour, pcf_tm.min, pcf_tm.sec);
++
++ mutex_lock(&pcf->lock);
++
++ /* disable SECOND interrupt */
++ int1m = __reg_read(pcf, PCF50606_REG_INT1M);
++ __reg_write(pcf, PCF50606_REG_INT1M, int1m | PCF50606_INT1_SECOND);
++
++ __reg_write(pcf, PCF50606_REG_RTCSC, pcf_tm.sec);
++ __reg_write(pcf, PCF50606_REG_RTCMN, pcf_tm.min);
++ __reg_write(pcf, PCF50606_REG_RTCHR, pcf_tm.hour);
++ __reg_write(pcf, PCF50606_REG_RTCWD, pcf_tm.wkday);
++ __reg_write(pcf, PCF50606_REG_RTCDT, pcf_tm.day);
++ __reg_write(pcf, PCF50606_REG_RTCMT, pcf_tm.month);
++ __reg_write(pcf, PCF50606_REG_RTCYR, pcf_tm.year);
++
++ /* restore INT1M, potentially re-enable SECOND interrupt */
++ __reg_write(pcf, PCF50606_REG_INT1M, int1m);
++
++ mutex_unlock(&pcf->lock);
++
++ return 0;
++}
++
++static int pcf50606_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pcf50606_data *pcf = i2c_get_clientdata(client);
++ struct pcf50606_time pcf_tm;
++
++ mutex_lock(&pcf->lock);
++ alrm->enabled =
++ __reg_read(pcf, PCF50606_REG_INT1M) & PCF50606_INT1_ALARM
++ ? 0 : 1;
++ pcf_tm.sec = __reg_read(pcf, PCF50606_REG_RTCSCA);
++ pcf_tm.min = __reg_read(pcf, PCF50606_REG_RTCMNA);
++ pcf_tm.hour = __reg_read(pcf, PCF50606_REG_RTCHRA);
++ pcf_tm.wkday = __reg_read(pcf, PCF50606_REG_RTCWDA);
++ pcf_tm.day = __reg_read(pcf, PCF50606_REG_RTCDTA);
++ pcf_tm.month = __reg_read(pcf, PCF50606_REG_RTCMTA);
++ pcf_tm.year = __reg_read(pcf, PCF50606_REG_RTCYRA);
++ mutex_unlock(&pcf->lock);
++
++ pcf2rtc_time(&alrm->time, &pcf_tm);
++
++ return 0;
++}
++
++static int pcf50606_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pcf50606_data *pcf = i2c_get_clientdata(client);
++ struct pcf50606_time pcf_tm;
++ u_int8_t irqmask;
++
++ rtc2pcf_time(&pcf_tm, &alrm->time);
++
++ mutex_lock(&pcf->lock);
++
++ /* disable alarm interrupt */
++ irqmask = __reg_read(pcf, PCF50606_REG_INT1M);
++ irqmask |= PCF50606_INT1_ALARM;
++ __reg_write(pcf, PCF50606_REG_INT1M, irqmask);
++
++ __reg_write(pcf, PCF50606_REG_RTCSCA, pcf_tm.sec);
++ __reg_write(pcf, PCF50606_REG_RTCMNA, pcf_tm.min);
++ __reg_write(pcf, PCF50606_REG_RTCHRA, pcf_tm.hour);
++ __reg_write(pcf, PCF50606_REG_RTCWDA, pcf_tm.wkday);
++ __reg_write(pcf, PCF50606_REG_RTCDTA, pcf_tm.day);
++ __reg_write(pcf, PCF50606_REG_RTCMTA, pcf_tm.month);
++ __reg_write(pcf, PCF50606_REG_RTCYRA, pcf_tm.year);
++
++ if (alrm->enabled) {
++ /* (re-)enaable alarm interrupt */
++ irqmask = __reg_read(pcf, PCF50606_REG_INT1M);
++ irqmask &= ~PCF50606_INT1_ALARM;
++ __reg_write(pcf, PCF50606_REG_INT1M, irqmask);
++ }
++
++ mutex_unlock(&pcf->lock);
++
++ /* FIXME */
++ return 0;
++}
++
++static struct rtc_class_ops pcf50606_rtc_ops = {
++ .ioctl = pcf50606_rtc_ioctl,
++ .read_time = pcf50606_rtc_read_time,
++ .set_time = pcf50606_rtc_set_time,
++ .read_alarm = pcf50606_rtc_read_alarm,
++ .set_alarm = pcf50606_rtc_set_alarm,
++};
++
++/***********************************************************************
++ * Watchdog
++ ***********************************************************************/
++
++static void pcf50606_wdt_start(struct pcf50606_data *pcf)
++{
++ reg_set_bit_mask(pcf, PCF50606_REG_OOCC1, PCF50606_OOCC1_WDTRST,
++ PCF50606_OOCC1_WDTRST);
++}
++
++static void pcf50606_wdt_stop(struct pcf50606_data *pcf)
++{
++ reg_clear_bits(pcf, PCF50606_REG_OOCS, PCF50606_OOCS_WDTEXP);
++}
++
++static void pcf50606_wdt_keepalive(struct pcf50606_data *pcf)
++{
++ pcf50606_wdt_start(pcf);
++}
++
++static int pcf50606_wdt_open(struct inode *inode, struct file *file)
++{
++ struct pcf50606_data *pcf = pcf50606_global;
++
++ file->private_data = pcf;
++
++ /* start the timer */
++ pcf50606_wdt_start(pcf);
++
++ return nonseekable_open(inode, file);
++}
++
++static int pcf50606_wdt_release(struct inode *inode, struct file *file)
++{
++ struct pcf50606_data *pcf = file->private_data;
++
++ if (pcf->allow_close == CLOSE_STATE_ALLOW)
++ pcf50606_wdt_stop(pcf);
++ else {
++ printk(KERN_CRIT "Unexpected close, not stopping watchdog!\n");
++ pcf50606_wdt_keepalive(pcf);
++ }
++
++ pcf->allow_close = CLOSE_STATE_NOT;
++
++ return 0;
++}
++
++static ssize_t pcf50606_wdt_write(struct file *file, const char __user *data,
++ size_t len, loff_t *ppos)
++{
++ struct pcf50606_data *pcf = file->private_data;
++ if (len) {
++ size_t i;
++
++ for (i = 0; i != len; i++) {
++ char c;
++ if (get_user(c, data + i))
++ return -EFAULT;
++ if (c == 'V')
++ pcf->allow_close = CLOSE_STATE_ALLOW;
++ }
++ pcf50606_wdt_keepalive(pcf);
++ }
++
++ return len;
++}
++
++static struct watchdog_info pcf50606_wdt_ident = {
++ .options = WDIOF_MAGICCLOSE,
++ .firmware_version = 0,
++ .identity = "PCF50606 Watchdog",
++};
++
++static int pcf50606_wdt_ioctl(struct inode *inode, struct file *file,
++ unsigned int cmd, unsigned long arg)
++{
++ struct pcf50606_data *pcf = file->private_data;
++ void __user *argp = (void __user *)arg;
++ int __user *p = argp;
++
++ switch (cmd) {
++ case WDIOC_GETSUPPORT:
++ return copy_to_user(argp, &pcf50606_wdt_ident,
++ sizeof(pcf50606_wdt_ident)) ? -EFAULT : 0;
++ break;
++ case WDIOC_GETSTATUS:
++ case WDIOC_GETBOOTSTATUS:
++ return put_user(0, p);
++ case WDIOC_KEEPALIVE:
++ pcf50606_wdt_keepalive(pcf);
++ return 0;
++ case WDIOC_GETTIMEOUT:
++ return put_user(8, p);
++ default:
++ return -ENOIOCTLCMD;
++ }
++}
++
++static struct file_operations pcf50606_wdt_fops = {
++ .owner = THIS_MODULE,
++ .llseek = no_llseek,
++ .write = &pcf50606_wdt_write,
++ .ioctl = &pcf50606_wdt_ioctl,
++ .open = &pcf50606_wdt_open,
++ .release = &pcf50606_wdt_release,
++};
++
++static struct miscdevice pcf50606_wdt_miscdev = {
++ .minor = WATCHDOG_MINOR,
++ .name = "watchdog",
++ .fops = &pcf50606_wdt_fops,
++};
++
++/***********************************************************************
++ * PWM
++ ***********************************************************************/
++
++static const char *pwm_dc_table[] = {
++ "0/16", "1/16", "2/16", "3/16",
++ "4/16", "5/16", "6/16", "7/16",
++ "8/16", "9/16", "10/16", "11/16",
++ "12/16", "13/16", "14/16", "15/16",
++};
++
++static ssize_t show_pwm_dc(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pcf50606_data *pcf = i2c_get_clientdata(client);
++ u_int8_t val;
++
++ val = reg_read(pcf, PCF50606_REG_PWMC1) >> PCF50606_PWMC1_DC_SHIFT;
++ val &= 0xf;
++
++ return sprintf(buf, "%s\n", pwm_dc_table[val]);
++}
++
++static ssize_t set_pwm_dc(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pcf50606_data *pcf = i2c_get_clientdata(client);
++ u_int8_t i;
++
++ for (i = 0; i < ARRAY_SIZE(pwm_dc_table); i++) {
++ if (!strncmp(buf, pwm_dc_table[i], strlen(pwm_dc_table[i]))) {
++ dev_dbg(dev, "setting pwm dc %s\n\r", pwm_dc_table[i]);
++ reg_set_bit_mask(pcf, PCF50606_REG_PWMC1, 0x1e,
++ (i << PCF50606_PWMC1_DC_SHIFT));
++ }
++ }
++ return count;
++}
++
++static DEVICE_ATTR(pwm_dc, S_IRUGO | S_IWUSR, show_pwm_dc, set_pwm_dc);
++
++static const char *pwm_clk_table[] = {
++ "512", "256", "128", "64",
++ "56300", "28100", "14100", "7000",
++};
++
++static ssize_t show_pwm_clk(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pcf50606_data *pcf = i2c_get_clientdata(client);
++ u_int8_t val;
++
++ val = reg_read(pcf, PCF50606_REG_PWMC1) >> PCF50606_PWMC1_CLK_SHIFT;
++ val &= 0x7;
++
++ return sprintf(buf, "%s\n", pwm_clk_table[val]);
++}
++
++static ssize_t set_pwm_clk(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pcf50606_data *pcf = i2c_get_clientdata(client);
++ u_int8_t i;
++
++ for (i = 0; i < ARRAY_SIZE(pwm_clk_table); i++) {
++ if (!strncmp(buf, pwm_clk_table[i], strlen(pwm_clk_table[i]))) {
++ dev_dbg(dev, "setting pwm clk %s\n\r",
++ pwm_clk_table[i]);
++ reg_set_bit_mask(pcf, PCF50606_REG_PWMC1, 0xe0,
++ (i << PCF50606_PWMC1_CLK_SHIFT));
++ }
++ }
++ return count;
++}
++
++static DEVICE_ATTR(pwm_clk, S_IRUGO | S_IWUSR, show_pwm_clk, set_pwm_clk);
++
++static int pcf50606bl_get_intensity(struct backlight_device *bd)
++{
++ struct pcf50606_data *pcf = bl_get_data(bd);
++ int intensity = reg_read(pcf, PCF50606_REG_PWMC1);
++ intensity = (intensity >> PCF50606_PWMC1_DC_SHIFT);
++
++ return intensity & 0xf;
++}
++
++static int pcf50606bl_set_intensity(struct backlight_device *bd)
++{
++ struct pcf50606_data *pcf = bl_get_data(bd);
++ int intensity = bd->props.brightness;
++
++ if (bd->props.power != FB_BLANK_UNBLANK)
++ intensity = 0;
++ if (bd->props.fb_blank != FB_BLANK_UNBLANK)
++ intensity = 0;
++
++ return reg_set_bit_mask(pcf, PCF50606_REG_PWMC1, 0x1e,
++ (intensity << PCF50606_PWMC1_DC_SHIFT));
++}
++
++static struct backlight_ops pcf50606bl_ops = {
++ .get_brightness = pcf50606bl_get_intensity,
++ .update_status = pcf50606bl_set_intensity,
++};
++
++/***********************************************************************
++ * Driver initialization
++ ***********************************************************************/
++
++#ifdef CONFIG_MACH_NEO1973_GTA01
++/* We currently place those platform devices here to make sure the device
++ * suspend/resume order is correct */
++static struct platform_device gta01_pm_gps_dev = {
++ .name = "neo1973-pm-gps",
++};
++
++static struct platform_device gta01_pm_bt_dev = {
++ .name = "neo1973-pm-bt",
++};
++#endif
++
++static struct attribute *pcf_sysfs_entries[16] = {
++ &dev_attr_voltage_dcd.attr,
++ &dev_attr_voltage_dcde.attr,
++ &dev_attr_voltage_dcud.attr,
++ &dev_attr_voltage_d1reg.attr,
++ &dev_attr_voltage_d2reg.attr,
++ &dev_attr_voltage_d3reg.attr,
++ &dev_attr_voltage_lpreg.attr,
++ &dev_attr_voltage_ioreg.attr,
++ NULL
++};
++
++static struct attribute_group pcf_attr_group = {
++ .name = NULL, /* put in device directory */
++ .attrs = pcf_sysfs_entries,
++};
++
++static void populate_sysfs_group(struct pcf50606_data *pcf)
++{
++ int i = 0;
++ struct attribute **attr;
++
++ for (attr = pcf_sysfs_entries; *attr; attr++)
++ i++;
++
++ if (pcf->pdata->used_features & PCF50606_FEAT_MBC) {
++ pcf_sysfs_entries[i++] = &dev_attr_chgstate.attr;
++ pcf_sysfs_entries[i++] = &dev_attr_chgmode.attr;
++ }
++
++ if (pcf->pdata->used_features & PCF50606_FEAT_CHGCUR)
++ pcf_sysfs_entries[i++] = &dev_attr_chgcur.attr;
++
++ if (pcf->pdata->used_features & PCF50606_FEAT_BATVOLT)
++ pcf_sysfs_entries[i++] = &dev_attr_battvolt.attr;
++
++ if (pcf->pdata->used_features & PCF50606_FEAT_BATTEMP)
++ pcf_sysfs_entries[i++] = &dev_attr_battemp.attr;
++
++ if (pcf->pdata->used_features & PCF50606_FEAT_PWM) {
++ pcf_sysfs_entries[i++] = &dev_attr_pwm_dc.attr;
++ pcf_sysfs_entries[i++] = &dev_attr_pwm_clk.attr;
++ }
++}
++
++static int pcf50606_detect(struct i2c_adapter *adapter, int address, int kind)
++{
++ struct i2c_client *new_client;
++ struct pcf50606_data *data;
++ int err = 0;
++ int irq;
++
++ if (!pcf50606_pdev) {
++ printk(KERN_ERR "pcf50606: driver needs a platform_device!\n");
++ return -EIO;
++ }
++
++ irq = platform_get_irq(pcf50606_pdev, 0);
++ if (irq < 0) {
++ dev_err(&pcf50606_pdev->dev, "no irq in platform resources!\n");
++ return -EIO;
++ }
++
++ /* At the moment, we only support one PCF50606 in a system */
++ if (pcf50606_global) {
++ dev_err(&pcf50606_pdev->dev,
++ "currently only one chip supported\n");
++ return -EBUSY;
++ }
++
++ data = kzalloc(sizeof(*data), GFP_KERNEL);
++ if (!data)
++ return -ENOMEM;
++
++ mutex_init(&data->lock);
++ mutex_init(&data->working_lock);
++ INIT_WORK(&data->work, pcf50606_work);
++ data->irq = irq;
++ data->working = 0;
++ data->suppress_onkey_events = 0;
++ data->onkey_seconds = -1;
++ data->pdata = pcf50606_pdev->dev.platform_data;
++
++ new_client = &data->client;
++ i2c_set_clientdata(new_client, data);
++ new_client->addr = address;
++ new_client->adapter = adapter;
++ new_client->driver = &pcf50606_driver;
++ new_client->flags = 0;
++ strlcpy(new_client->name, "pcf50606", I2C_NAME_SIZE);
++
++ /* now we try to detect the chip */
++
++ /* register with i2c core */
++ err = i2c_attach_client(new_client);
++ if (err) {
++ dev_err(&new_client->dev,
++ "error during i2c_attach_client()\n");
++ goto exit_free;
++ }
++
++ populate_sysfs_group(data);
++
++ err = sysfs_create_group(&new_client->dev.kobj, &pcf_attr_group);
++ if (err) {
++ dev_err(&new_client->dev, "error creating sysfs group\n");
++ goto exit_detach;
++ }
++
++ /* create virtual charger 'device' */
++
++ /* input device registration */
++ data->input_dev = input_allocate_device();
++ if (!data->input_dev)
++ goto exit_sysfs;
++
++ data->input_dev->name = "FIC Neo1973 PMU events";
++ data->input_dev->phys = "I2C";
++ data->input_dev->id.bustype = BUS_I2C;
++
++ data->input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_PWR);
++ set_bit(KEY_POWER, data->input_dev->keybit);
++ set_bit(KEY_POWER2, data->input_dev->keybit);
++ set_bit(KEY_BATTERY, data->input_dev->keybit);
++
++ err = input_register_device(data->input_dev);
++ if (err)
++ goto exit_sysfs;
++
++ /* register power off handler with core power management */
++ pm_power_off = &pcf50606_go_standby;
++
++ /* configure interrupt mask */
++ /* we don't mask SECOND here, because we want one to do coldplug with */
++ reg_write(data, PCF50606_REG_INT1M, 0x00);
++ reg_write(data, PCF50606_REG_INT2M, 0x00);
++ reg_write(data, PCF50606_REG_INT3M, PCF50606_INT3_TSCPRES);
++
++ err = request_irq(irq, pcf50606_irq, IRQF_TRIGGER_FALLING,
++ "pcf50606", data);
++ if (err < 0)
++ goto exit_input;
++
++ if (enable_irq_wake(irq) < 0)
++ dev_err(&new_client->dev, "IRQ %u cannot be enabled as wake-up"
++ "source in this hardware revision!", irq);
++
++ pcf50606_global = data;
++
++ if (data->pdata->used_features & PCF50606_FEAT_RTC) {
++ data->rtc = rtc_device_register("pcf50606", &new_client->dev,
++ &pcf50606_rtc_ops, THIS_MODULE);
++ if (IS_ERR(data->rtc)) {
++ err = PTR_ERR(data->rtc);
++ goto exit_irq;
++ }
++ }
++
++ if (data->pdata->used_features & PCF50606_FEAT_WDT) {
++ err = misc_register(&pcf50606_wdt_miscdev);
++ if (err) {
++ dev_err(&new_client->dev, "cannot register miscdev on "
++ "minor=%d (%d)\n", WATCHDOG_MINOR, err);
++ goto exit_rtc;
++ }
++ }
++
++ if (data->pdata->used_features & PCF50606_FEAT_PWM) {
++ /* enable PWM controller */
++ reg_set_bit_mask(data, PCF50606_REG_PWMC1,
++ PCF50606_PWMC1_ACTSET,
++ PCF50606_PWMC1_ACTSET);
++ }
++
++ if (data->pdata->used_features & PCF50606_FEAT_PWM_BL) {
++ data->backlight = backlight_device_register("pcf50606-bl",
++ &new_client->dev,
++ data,
++ &pcf50606bl_ops);
++ if (!data->backlight)
++ goto exit_misc;
++ data->backlight->props.max_brightness = 16;
++ data->backlight->props.power = FB_BLANK_UNBLANK;
++ data->backlight->props.brightness =
++ data->pdata->init_brightness;
++ backlight_update_status(data->backlight);
++ }
++
++ apm_get_power_status = pcf50606_get_power_status;
++
++#ifdef CONFIG_MACH_NEO1973_GTA01
++ if (machine_is_neo1973_gta01()) {
++ gta01_pm_gps_dev.dev.parent = &new_client->dev;
++ switch (system_rev) {
++ case GTA01Bv2_SYSTEM_REV:
++ case GTA01Bv3_SYSTEM_REV:
++ case GTA01Bv4_SYSTEM_REV:
++ gta01_pm_bt_dev.dev.parent = &new_client->dev;
++ platform_device_register(&gta01_pm_bt_dev);
++ break;
++ }
++ platform_device_register(&gta01_pm_gps_dev);
++ /* a link for gllin compatibility */
++ err = bus_create_device_link(&platform_bus_type,
++ &gta01_pm_gps_dev.dev.kobj, "gta01-pm-gps.0");
++ if (err)
++ printk(KERN_ERR
++ "sysfs_create_link (gta01-pm-gps.0): %d\n", err);
++ }
++#endif
++
++ if (data->pdata->used_features & PCF50606_FEAT_ACD)
++ reg_set_bit_mask(data, PCF50606_REG_ACDC1,
++ PCF50606_ACDC1_ACDAPE, PCF50606_ACDC1_ACDAPE);
++ else
++ reg_clear_bits(data, PCF50606_REG_ACDC1,
++ PCF50606_ACDC1_ACDAPE);
++
++ return 0;
++
++exit_misc:
++ if (data->pdata->used_features & PCF50606_FEAT_WDT)
++ misc_deregister(&pcf50606_wdt_miscdev);
++exit_rtc:
++ if (data->pdata->used_features & PCF50606_FEAT_RTC)
++ rtc_device_unregister(pcf50606_global->rtc);
++exit_irq:
++ free_irq(pcf50606_global->irq, pcf50606_global);
++ pcf50606_global = NULL;
++exit_input:
++ pm_power_off = NULL;
++ input_unregister_device(data->input_dev);
++exit_sysfs:
++ sysfs_remove_group(&new_client->dev.kobj, &pcf_attr_group);
++exit_detach:
++ i2c_detach_client(new_client);
++exit_free:
++ kfree(data);
++ return err;
++}
++
++static int pcf50606_attach_adapter(struct i2c_adapter *adapter)
++{
++ return i2c_probe(adapter, &addr_data, &pcf50606_detect);
++}
++
++static int pcf50606_detach_client(struct i2c_client *client)
++{
++ struct pcf50606_data *pcf = i2c_get_clientdata(client);
++
++ apm_get_power_status = NULL;
++ input_unregister_device(pcf->input_dev);
++
++ if (pcf->pdata->used_features & PCF50606_FEAT_PWM_BL)
++ backlight_device_unregister(pcf->backlight);
++
++ if (pcf->pdata->used_features & PCF50606_FEAT_WDT)
++ misc_deregister(&pcf50606_wdt_miscdev);
++
++ if (pcf->pdata->used_features & PCF50606_FEAT_RTC)
++ rtc_device_unregister(pcf->rtc);
++
++ free_irq(pcf->irq, pcf);
++
++ sysfs_remove_group(&client->dev.kobj, &pcf_attr_group);
++
++ pm_power_off = NULL;
++
++ kfree(pcf);
++
++ return 0;
++}
++
++#ifdef CONFIG_PM
++#define INT1M_RESUMERS (PCF50606_INT1_ALARM | \
++ PCF50606_INT1_ONKEYF | \
++ PCF50606_INT1_EXTONR)
++#define INT2M_RESUMERS (PCF50606_INT2_CHGWD10S | \
++ PCF50606_INT2_CHGPROT | \
++ PCF50606_INT2_CHGERR)
++#define INT3M_RESUMERS (PCF50606_INT3_LOWBAT | \
++ PCF50606_INT3_HIGHTMP | \
++ PCF50606_INT3_ACDINS)
++static int pcf50606_suspend(struct device *dev, pm_message_t state)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pcf50606_data *pcf = i2c_get_clientdata(client);
++ int i;
++
++ /* we suspend once (!) as late as possible in the suspend sequencing */
++
++ if ((state.event != PM_EVENT_SUSPEND) ||
++ (pcf->suspend_state != PCF50606_SS_RUNNING))
++ return -EBUSY;
++
++ /* The general idea is to power down all unused power supplies,
++ * and then mask all PCF50606 interrup sources but EXTONR, ONKEYF
++ * and ALARM */
++
++ mutex_lock(&pcf->lock);
++
++ pcf->suspend_state = PCF50606_SS_STARTING_SUSPEND;
++
++ /* we are not going to service any further interrupts until we
++ * resume. If the IRQ workqueue is still pending in the background,
++ * it will bail when it sees we set suspend state above.
++ */
++
++ disable_irq(pcf->irq);
++
++ /* Save all registers that don't "survive" standby state */
++ pcf->standby_regs.dcdc1 = __reg_read(pcf, PCF50606_REG_DCDC1);
++ pcf->standby_regs.dcdc2 = __reg_read(pcf, PCF50606_REG_DCDC2);
++ pcf->standby_regs.dcdec1 = __reg_read(pcf, PCF50606_REG_DCDEC1);
++ pcf->standby_regs.dcudc1 = __reg_read(pcf, PCF50606_REG_DCUDC1);
++ pcf->standby_regs.ioregc = __reg_read(pcf, PCF50606_REG_IOREGC);
++ pcf->standby_regs.d1regc1 = __reg_read(pcf, PCF50606_REG_D1REGC1);
++ pcf->standby_regs.d2regc1 = __reg_read(pcf, PCF50606_REG_D2REGC1);
++ pcf->standby_regs.d3regc1 = __reg_read(pcf, PCF50606_REG_D3REGC1);
++ pcf->standby_regs.lpregc1 = __reg_read(pcf, PCF50606_REG_LPREGC1);
++ pcf->standby_regs.adcc1 = __reg_read(pcf, PCF50606_REG_ADCC1);
++ pcf->standby_regs.adcc2 = __reg_read(pcf, PCF50606_REG_ADCC2);
++ pcf->standby_regs.pwmc1 = __reg_read(pcf, PCF50606_REG_PWMC1);
++
++ /* switch off power supplies that are not needed during suspend */
++ for (i = 0; i < __NUM_PCF50606_REGULATORS; i++) {
++ if (!(pcf->pdata->rails[i].flags & PMU_VRAIL_F_SUSPEND_ON)) {
++ u_int8_t tmp;
++
++ /* IOREG powers the I@C interface so we cannot switch
++ * it off */
++ if (i == PCF50606_REGULATOR_IOREG)
++ continue;
++
++ dev_dbg(dev, "disabling pcf50606 regulator %u\n", i);
++ /* we cannot use pcf50606_onoff_set() because we're
++ * already under the mutex */
++ tmp = __reg_read(pcf, regulator_registers[i]);
++ tmp &= 0x1f;
++ __reg_write(pcf, regulator_registers[i], tmp);
++ }
++ }
++
++ pcf->standby_regs.int1m = __reg_read(pcf, PCF50606_REG_INT1M);
++ pcf->standby_regs.int2m = __reg_read(pcf, PCF50606_REG_INT2M);
++ pcf->standby_regs.int3m = __reg_read(pcf, PCF50606_REG_INT3M);
++ __reg_write(pcf, PCF50606_REG_INT1M, ~INT1M_RESUMERS & 0xff);
++ __reg_write(pcf, PCF50606_REG_INT2M, ~INT2M_RESUMERS & 0xff);
++ __reg_write(pcf, PCF50606_REG_INT3M, ~INT3M_RESUMERS & 0xff);
++
++ pcf->suspend_state = PCF50606_SS_COMPLETED_SUSPEND;
++
++ mutex_unlock(&pcf->lock);
++
++ return 0;
++}
++
++static int pcf50606_resume(struct device *dev)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pcf50606_data *pcf = i2c_get_clientdata(client);
++
++ mutex_lock(&pcf->lock);
++
++ pcf->suspend_state = PCF50606_SS_STARTING_RESUME;
++
++ /* Resume all saved registers that don't "survive" standby state */
++ __reg_write(pcf, PCF50606_REG_INT1M, pcf->standby_regs.int1m);
++ __reg_write(pcf, PCF50606_REG_INT2M, pcf->standby_regs.int2m);
++ __reg_write(pcf, PCF50606_REG_INT3M, pcf->standby_regs.int3m);
++
++ __reg_write(pcf, PCF50606_REG_DCDC1, pcf->standby_regs.dcdc1);
++ __reg_write(pcf, PCF50606_REG_DCDC2, pcf->standby_regs.dcdc2);
++ __reg_write(pcf, PCF50606_REG_DCDEC1, pcf->standby_regs.dcdec1);
++ __reg_write(pcf, PCF50606_REG_DCUDC1, pcf->standby_regs.dcudc1);
++ __reg_write(pcf, PCF50606_REG_IOREGC, pcf->standby_regs.ioregc);
++ __reg_write(pcf, PCF50606_REG_D1REGC1, pcf->standby_regs.d1regc1);
++ __reg_write(pcf, PCF50606_REG_D2REGC1, pcf->standby_regs.d2regc1);
++ __reg_write(pcf, PCF50606_REG_D3REGC1, pcf->standby_regs.d3regc1);
++ __reg_write(pcf, PCF50606_REG_LPREGC1, pcf->standby_regs.lpregc1);
++ __reg_write(pcf, PCF50606_REG_ADCC1, pcf->standby_regs.adcc1);
++ __reg_write(pcf, PCF50606_REG_ADCC2, pcf->standby_regs.adcc2);
++ __reg_write(pcf, PCF50606_REG_PWMC1, pcf->standby_regs.pwmc1);
++
++ pcf->suspend_state = PCF50606_SS_COMPLETED_RESUME;
++
++ enable_irq(pcf->irq);
++
++ mutex_unlock(&pcf->lock);
++
++ /* Call PCF work function; this fixes an issue on the gta01 where
++ * the power button "goes away" if it is used to wake the device.
++ */
++ get_device(&pcf->client.dev);
++ pcf50606_work(&pcf->work);
++
++ return 0;
++}
++#else
++#define pcf50606_suspend NULL
++#define pcf50606_resume NULL
++#endif
++
++static struct i2c_driver pcf50606_driver = {
++ .driver = {
++ .name = "pcf50606",
++ .suspend = pcf50606_suspend,
++ .resume = pcf50606_resume,
++ },
++ .id = I2C_DRIVERID_PCF50606,
++ .attach_adapter = pcf50606_attach_adapter,
++ .detach_client = pcf50606_detach_client,
++};
++
++/* platform driver, since i2c devices don't have platform_data */
++static int __init pcf50606_plat_probe(struct platform_device *pdev)
++{
++ struct pcf50606_platform_data *pdata = pdev->dev.platform_data;
++
++ if (!pdata)
++ return -ENODEV;
++
++ pcf50606_pdev = pdev;
++
++ return 0;
++}
++
++static int pcf50606_plat_remove(struct platform_device *pdev)
++{
++ return 0;
++}
++
++/* We have this purely to capture an early indication that we are coming out
++ * of suspend, before our device resume got called; async interrupt service is
++ * interested in this.
++ */
++
++static int pcf50606_plat_resume(struct platform_device *pdev)
++{
++ /* i2c_get_clientdata(to_i2c_client(&pdev->dev)) returns NULL at this
++ * early resume time so we have to use pcf50606_global
++ */
++ pcf50606_global->suspend_state = PCF50606_SS_RESUMING_BUT_NOT_US_YET;
++
++ return 0;
++}
++
++static struct platform_driver pcf50606_plat_driver = {
++ .probe = pcf50606_plat_probe,
++ .remove = pcf50606_plat_remove,
++ .resume_early = pcf50606_plat_resume,
++ .driver = {
++ .owner = THIS_MODULE,
++ .name = "pcf50606",
++ },
++};
++
++static int __init pcf50606_init(void)
++{
++ int rc;
++
++ rc = platform_driver_register(&pcf50606_plat_driver);
++ if (!rc)
++ rc = i2c_add_driver(&pcf50606_driver);
++
++ return rc;
++}
++
++static void pcf50606_exit(void)
++{
++ i2c_del_driver(&pcf50606_driver);
++ platform_driver_unregister(&pcf50606_plat_driver);
++}
++
++MODULE_DESCRIPTION("I2C chip driver for NXP PCF50606 power management unit");
++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
++MODULE_LICENSE("GPL");
++
++module_init(pcf50606_init);
++module_exit(pcf50606_exit);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/i2c/chips/pcf50606.h linux-2.6.29-rc3.owrt.om/drivers/i2c/chips/pcf50606.h
+--- linux-2.6.29-rc3.owrt/drivers/i2c/chips/pcf50606.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/i2c/chips/pcf50606.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,302 @@
++#ifndef _PCF50606_H
++#define _PCF50606_H
++
++/* Philips PCF50606 Power Managemnt Unit (PMU) driver
++ * (C) 2006-2007 by Openmoko, Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ *
++ */
++
++enum pfc50606_regs {
++ PCF50606_REG_ID = 0x00,
++ PCF50606_REG_OOCS = 0x01,
++ PCF50606_REG_INT1 = 0x02, /* Interrupt Status */
++ PCF50606_REG_INT2 = 0x03, /* Interrupt Status */
++ PCF50606_REG_INT3 = 0x04, /* Interrupt Status */
++ PCF50606_REG_INT1M = 0x05, /* Interrupt Mask */
++ PCF50606_REG_INT2M = 0x06, /* Interrupt Mask */
++ PCF50606_REG_INT3M = 0x07, /* Interrupt Mask */
++ PCF50606_REG_OOCC1 = 0x08,
++ PCF50606_REG_OOCC2 = 0x09,
++ PCF50606_REG_RTCSC = 0x0a, /* Second */
++ PCF50606_REG_RTCMN = 0x0b, /* Minute */
++ PCF50606_REG_RTCHR = 0x0c, /* Hour */
++ PCF50606_REG_RTCWD = 0x0d, /* Weekday */
++ PCF50606_REG_RTCDT = 0x0e, /* Day */
++ PCF50606_REG_RTCMT = 0x0f, /* Month */
++ PCF50606_REG_RTCYR = 0x10, /* Year */
++ PCF50606_REG_RTCSCA = 0x11, /* Alarm Second */
++ PCF50606_REG_RTCMNA = 0x12, /* Alarm Minute */
++ PCF50606_REG_RTCHRA = 0x13, /* Alarm Hour */
++ PCF50606_REG_RTCWDA = 0x14, /* Alarm Weekday */
++ PCF50606_REG_RTCDTA = 0x15, /* Alarm Day */
++ PCF50606_REG_RTCMTA = 0x16, /* Alarm Month */
++ PCF50606_REG_RTCYRA = 0x17, /* Alarm Year */
++ PCF50606_REG_PSSC = 0x18, /* Power sequencing */
++ PCF50606_REG_PWROKM = 0x19, /* PWROK mask */
++ PCF50606_REG_PWROKS = 0x1a, /* PWROK status */
++ PCF50606_REG_DCDC1 = 0x1b,
++ PCF50606_REG_DCDC2 = 0x1c,
++ PCF50606_REG_DCDC3 = 0x1d,
++ PCF50606_REG_DCDC4 = 0x1e,
++ PCF50606_REG_DCDEC1 = 0x1f,
++ PCF50606_REG_DCDEC2 = 0x20,
++ PCF50606_REG_DCUDC1 = 0x21,
++ PCF50606_REG_DCUDC2 = 0x22,
++ PCF50606_REG_IOREGC = 0x23,
++ PCF50606_REG_D1REGC1 = 0x24,
++ PCF50606_REG_D2REGC1 = 0x25,
++ PCF50606_REG_D3REGC1 = 0x26,
++ PCF50606_REG_LPREGC1 = 0x27,
++ PCF50606_REG_LPREGC2 = 0x28,
++ PCF50606_REG_MBCC1 = 0x29,
++ PCF50606_REG_MBCC2 = 0x2a,
++ PCF50606_REG_MBCC3 = 0x2b,
++ PCF50606_REG_MBCS1 = 0x2c,
++ PCF50606_REG_BBCC = 0x2d,
++ PCF50606_REG_ADCC1 = 0x2e,
++ PCF50606_REG_ADCC2 = 0x2f,
++ PCF50606_REG_ADCS1 = 0x30,
++ PCF50606_REG_ADCS2 = 0x31,
++ PCF50606_REG_ADCS3 = 0x32,
++ PCF50606_REG_ACDC1 = 0x33,
++ PCF50606_REG_BVMC = 0x34,
++ PCF50606_REG_PWMC1 = 0x35,
++ PCF50606_REG_LEDC1 = 0x36,
++ PCF50606_REG_LEDC2 = 0x37,
++ PCF50606_REG_GPOC1 = 0x38,
++ PCF50606_REG_GPOC2 = 0x39,
++ PCF50606_REG_GPOC3 = 0x3a,
++ PCF50606_REG_GPOC4 = 0x3b,
++ PCF50606_REG_GPOC5 = 0x3c,
++ __NUM_PCF50606_REGS
++};
++
++enum pcf50606_reg_oocs {
++ PFC50606_OOCS_ONKEY = 0x01,
++ PCF50606_OOCS_EXTON = 0x02,
++ PCF50606_OOCS_PWROKRST = 0x04,
++ PCF50606_OOCS_BATOK = 0x08,
++ PCF50606_OOCS_BACKOK = 0x10,
++ PCF50606_OOCS_CHGOK = 0x20,
++ PCF50606_OOCS_TEMPOK = 0x40,
++ PCF50606_OOCS_WDTEXP = 0x80,
++};
++
++enum pcf50606_reg_oocc1 {
++ PCF50606_OOCC1_GOSTDBY = 0x01,
++ PCF50606_OOCC1_TOTRST = 0x02,
++ PCF50606_OOCC1_CLK32ON = 0x04,
++ PCF50606_OOCC1_WDTRST = 0x08,
++ PCF50606_OOCC1_RTCWAK = 0x10,
++ PCF50606_OOCC1_CHGWAK = 0x20,
++ PCF50606_OOCC1_EXTONWAK_HIGH = 0x40,
++ PCF50606_OOCC1_EXTONWAK_LOW = 0x80,
++};
++
++enum pcf50606_reg_oocc2 {
++ PCF50606_OOCC2_ONKEYDB_NONE = 0x00,
++ PCF50606_OOCC2_ONKEYDB_14ms = 0x01,
++ PCF50606_OOCC2_ONKEYDB_62ms = 0x02,
++ PCF50606_OOCC2_ONKEYDB_500ms = 0x03,
++ PCF50606_OOCC2_EXTONDB_NONE = 0x00,
++ PCF50606_OOCC2_EXTONDB_14ms = 0x04,
++ PCF50606_OOCC2_EXTONDB_62ms = 0x08,
++ PCF50606_OOCC2_EXTONDB_500ms = 0x0c,
++};
++
++enum pcf50606_reg_int1 {
++ PCF50606_INT1_ONKEYR = 0x01, /* ONKEY rising edge */
++ PCF50606_INT1_ONKEYF = 0x02, /* ONKEY falling edge */
++ PCF50606_INT1_ONKEY1S = 0x04, /* OMKEY at least 1sec low */
++ PCF50606_INT1_EXTONR = 0x08, /* EXTON rising edge */
++ PCF50606_INT1_EXTONF = 0x10, /* EXTON falling edge */
++ PCF50606_INT1_SECOND = 0x40, /* RTC periodic second interrupt */
++ PCF50606_INT1_ALARM = 0x80, /* RTC alarm time is reached */
++};
++
++enum pcf50606_reg_int2 {
++ PCF50606_INT2_CHGINS = 0x01, /* Charger inserted */
++ PCF50606_INT2_CHGRM = 0x02, /* Charger removed */
++ PCF50606_INT2_CHGFOK = 0x04, /* Fast charging OK */
++ PCF50606_INT2_CHGERR = 0x08, /* Error in charging mode */
++ PCF50606_INT2_CHGFRDY = 0x10, /* Fast charge completed */
++ PCF50606_INT2_CHGPROT = 0x20, /* Charging protection interrupt */
++ PCF50606_INT2_CHGWD10S = 0x40, /* Charger watchdig expires in 10s */
++ PCF50606_INT2_CHGWDEXP = 0x80, /* Charger watchdog expires */
++};
++
++enum pcf50606_reg_int3 {
++ PCF50606_INT3_ADCRDY = 0x01, /* ADC conversion finished */
++ PCF50606_INT3_ACDINS = 0x02, /* Accessory inserted */
++ PCF50606_INT3_ACDREM = 0x04, /* Accessory removed */
++ PCF50606_INT3_TSCPRES = 0x08, /* Touch screen pressed */
++ PCF50606_INT3_LOWBAT = 0x40, /* Low battery voltage */
++ PCF50606_INT3_HIGHTMP = 0x80, /* High temperature */
++};
++
++/* used by PSSC, PWROKM, PWROKS, */
++enum pcf50606_regu {
++ PCF50606_REGU_DCD = 0x01, /* DCD in phase 2 */
++ PCF50606_REGU_DCDE = 0x02, /* DCDE in phase 2 */
++ PCF50606_REGU_DCUD = 0x04, /* DCDU in phase 2 */
++ PCF50606_REGU_IO = 0x08, /* IO in phase 2 */
++ PCF50606_REGU_D1 = 0x10, /* D1 in phase 2 */
++ PCF50606_REGU_D2 = 0x20, /* D2 in phase 2 */
++ PCF50606_REGU_D3 = 0x40, /* D3 in phase 2 */
++ PCF50606_REGU_LP = 0x80, /* LP in phase 2 */
++};
++
++enum pcf50606_reg_dcdc4 {
++ PCF50606_DCDC4_MODE_AUTO = 0x00,
++ PCF50606_DCDC4_MODE_PWM = 0x01,
++ PCF50606_DCDC4_MODE_PCF = 0x02,
++ PCF50606_DCDC4_OFF_FLOAT = 0x00,
++ PCF50606_DCDC4_OFF_BYPASS = 0x04,
++ PCF50606_DCDC4_OFF_PULLDOWN = 0x08,
++ PCF50606_DCDC4_CURLIM_500mA = 0x00,
++ PCF50606_DCDC4_CURLIM_750mA = 0x10,
++ PCF50606_DCDC4_CURLIM_1000mA = 0x20,
++ PCF50606_DCDC4_CURLIM_1250mA = 0x30,
++ PCF50606_DCDC4_TOGGLE = 0x40,
++ PCF50606_DCDC4_REGSEL_DCDC2 = 0x80,
++};
++
++enum pcf50606_reg_dcdec2 {
++ PCF50606_DCDEC2_MODE_AUTO = 0x00,
++ PCF50606_DCDEC2_MODE_PWM = 0x01,
++ PCF50606_DCDEC2_MODE_PCF = 0x02,
++ PCF50606_DCDEC2_OFF_FLOAT = 0x00,
++ PCF50606_DCDEC2_OFF_BYPASS = 0x04,
++};
++
++enum pcf50606_reg_dcudc2 {
++ PCF50606_DCUDC2_MODE_AUTO = 0x00,
++ PCF50606_DCUDC2_MODE_PWM = 0x01,
++ PCF50606_DCUDC2_MODE_PCF = 0x02,
++ PCF50606_DCUDC2_OFF_FLOAT = 0x00,
++ PCF50606_DCUDC2_OFF_BYPASS = 0x04,
++};
++
++enum pcf50606_reg_adcc1 {
++ PCF50606_ADCC1_TSCMODACT = 0x01,
++ PCF50606_ADCC1_TSCMODSTB = 0x02,
++ PCF50606_ADCC1_TRATSET = 0x04,
++ PCF50606_ADCC1_NTCSWAPE = 0x08,
++ PCF50606_ADCC1_NTCSWAOFF = 0x10,
++ PCF50606_ADCC1_EXTSYNCBREAK = 0x20,
++ /* reserved */
++ PCF50606_ADCC1_TSCINT = 0x80,
++};
++
++enum pcf50606_reg_adcc2 {
++ PCF50606_ADCC2_ADCSTART = 0x01,
++ /* see enum pcf50606_adcc2_adcmux */
++ PCF50606_ADCC2_SYNC_NONE = 0x00,
++ PCF50606_ADCC2_SYNC_TXON = 0x20,
++ PCF50606_ADCC2_SYNC_PWREN1 = 0x40,
++ PCF50606_ADCC2_SYNC_PWREN2 = 0x60,
++ PCF50606_ADCC2_RES_10BIT = 0x00,
++ PCF50606_ADCC2_RES_8BIT = 0x80,
++};
++
++#define PCF50606_ADCC2_ADCMUX_MASK (0xf << 1)
++
++#define ADCMUX_SHIFT 1
++enum pcf50606_adcc2_adcmux {
++ PCF50606_ADCMUX_BATVOLT_RES = 0x0 << ADCMUX_SHIFT,
++ PCF50606_ADCMUX_BATVOLT_SUBTR = 0x1 << ADCMUX_SHIFT,
++ PCF50606_ADCMUX_ADCIN1_RES = 0x2 << ADCMUX_SHIFT,
++ PCF50606_ADCMUX_ADCIN1_SUBTR = 0x3 << ADCMUX_SHIFT,
++ PCF50606_ADCMUX_BATTEMP = 0x4 << ADCMUX_SHIFT,
++ PCF50606_ADCMUX_ADCIN2 = 0x5 << ADCMUX_SHIFT,
++ PCF50606_ADCMUX_ADCIN3 = 0x6 << ADCMUX_SHIFT,
++ PCF50606_ADCMUX_ADCIN3_RATIO = 0x7 << ADCMUX_SHIFT,
++ PCF50606_ADCMUX_XPOS = 0x8 << ADCMUX_SHIFT,
++ PCF50606_ADCMUX_YPOS = 0x9 << ADCMUX_SHIFT,
++ PCF50606_ADCMUX_P1 = 0xa << ADCMUX_SHIFT,
++ PCF50606_ADCMUX_P2 = 0xb << ADCMUX_SHIFT,
++ PCF50606_ADCMUX_BATVOLT_ADCIN1 = 0xc << ADCMUX_SHIFT,
++ PCF50606_ADCMUX_XY_SEQUENCE = 0xe << ADCMUX_SHIFT,
++ PCF50606_P1_P2_RESISTANCE = 0xf << ADCMUX_SHIFT,
++};
++
++enum pcf50606_adcs2 {
++ PCF50606_ADCS2_ADCRDY = 0x80,
++};
++
++enum pcf50606_reg_mbcc1 {
++ PCF50606_MBCC1_CHGAPE = 0x01,
++ PCF50606_MBCC1_AUTOFST = 0x02,
++#define PCF50606_MBCC1_CHGMOD_MASK 0x1c
++#define PCF50606_MBCC1_CHGMOD_SHIFT 2
++ PCF50606_MBCC1_CHGMOD_QUAL = 0x00,
++ PCF50606_MBCC1_CHGMOD_PRE = 0x04,
++ PCF50606_MBCC1_CHGMOD_TRICKLE = 0x08,
++ PCF50606_MBCC1_CHGMOD_FAST_CCCV = 0x0c,
++ PCF50606_MBCC1_CHGMOD_FAST_NOCC = 0x10,
++ PCF50606_MBCC1_CHGMOD_FAST_NOCV = 0x14,
++ PCF50606_MBCC1_CHGMOD_FAST_SW = 0x18,
++ PCF50606_MBCC1_CHGMOD_IDLE = 0x1c,
++ PCF50606_MBCC1_DETMOD_LOWCHG = 0x20,
++ PCF50606_MBCC1_DETMOD_WDRST = 0x40,
++};
++
++enum pcf50606_reg_acdc1 {
++ PCF50606_ACDC1_ACDDET = 0x01,
++ PCF50606_ACDC1_THRSHLD_1V0 = 0x00,
++ PCF50606_ACDC1_THRSHLD_1V2 = 0x02,
++ PCF50606_ACDC1_THRSHLD_1V4 = 0x04,
++ PCF50606_ACDC1_THRSHLD_1V6 = 0x06,
++ PCF50606_ACDC1_THRSHLD_1V8 = 0x08,
++ PCF50606_ACDC1_THRSHLD_2V0 = 0x0a,
++ PCF50606_ACDC1_THRSHLD_2V2 = 0x0c,
++ PCF50606_ACDC1_THRSHLD_2V4 = 0x0e,
++ PCF50606_ACDC1_DISDB = 0x10,
++ PCF50606_ACDC1_ACDAPE = 0x80,
++};
++
++enum pcf50606_reg_bvmc {
++ PCF50606_BVMC_LOWBAT = 0x01,
++ PCF50606_BVMC_THRSHLD_NULL = 0x00,
++ PCF50606_BVMC_THRSHLD_2V8 = 0x02,
++ PCF50606_BVMC_THRSHLD_2V9 = 0x04,
++ PCF50606_BVMC_THRSHLD_3V = 0x08,
++ PCF50606_BVMC_THRSHLD_3V1 = 0x08,
++ PCF50606_BVMC_THRSHLD_3V2 = 0x0a,
++ PCF50606_BVMC_THRSHLD_3V3 = 0x0c,
++ PCF50606_BVMC_THRSHLD_3V4 = 0x0e,
++ PCF50606_BVMC_DISDB = 0x10,
++};
++
++enum pcf50606_reg_pwmc1 {
++ PCF50606_PWMC1_ACTSET = 0x01,
++ PCF50606_PWMC1_PWMDC_0_16 = 0x00,
++ PCF50606_PWMC1_PWMDC_1_16 = 0x02,
++ PCF50606_PWMC1_PWMDC_2_16 = 0x04,
++ PCF50606_PWMC1_PWMDC_3_16 = 0x06,
++ PCF50606_PWMC1_PWMDC_4_16 = 0x08,
++ PCF50606_PWMC1_PWMDC_5_16 = 0x0a,
++ PCF50606_PWMC1_PWMDC_6_16 = 0x0c,
++ PCF50606_PWMC1_PWMDC_7_16 = 0x0e,
++ PCF50606_PWMC1_PWMDC_8_16 = 0x10,
++ PCF50606_PWMC1_PWMDC_9_16 = 0x12,
++ PCF50606_PWMC1_PWMDC_10_16 = 0x14,
++ PCF50606_PWMC1_PWMDC_11_16 = 0x16,
++ PCF50606_PWMC1_PWMDC_12_16 = 0x18,
++ PCF50606_PWMC1_PWMDC_13_16 = 0x1a,
++ PCF50606_PWMC1_PWMDC_14_16 = 0x1c,
++ PCF50606_PWMC1_PWMDC_15_16 = 0x1e,
++ PCF50606_PWMC1_PRESC_512Hz = 0x20,
++ PCF50606_PWMC1_PRESC_256Hz = 0x40,
++ PCF50606_PWMC1_PRESC_64Hz = 0x60,
++ PCF50606_PWMC1_PRESC_56kHz = 0x80,
++ PCF50606_PWMC1_PRESC_28kHz = 0xa0,
++ PCF50606_PWMC1_PRESC_14kHz = 0xc0,
++ PCF50606_PWMC1_PRESC_7kHz = 0xe0,
++};
++#define PCF50606_PWMC1_CLK_SHIFT 5
++#define PCF50606_PWMC1_DC_SHIFT 1
++
++#endif /* _PCF50606_H */
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/i2c/chips/pcf50633.h linux-2.6.29-rc3.owrt.om/drivers/i2c/chips/pcf50633.h
+--- linux-2.6.29-rc3.owrt/drivers/i2c/chips/pcf50633.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/i2c/chips/pcf50633.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,349 @@
++#ifndef _PCF50633_H
++#define _PCF50633_H
++
++/* Philips PCF50633 Power Managemnt Unit (PMU) driver
++ * (C) 2006-2007 by Openmoko, Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ *
++ */
++
++enum pfc50633_regs {
++ PCF50633_REG_VERSION = 0x00,
++ PCF50633_REG_VARIANT = 0x01,
++ PCF50633_REG_INT1 = 0x02, /* Interrupt Status */
++ PCF50633_REG_INT2 = 0x03, /* Interrupt Status */
++ PCF50633_REG_INT3 = 0x04, /* Interrupt Status */
++ PCF50633_REG_INT4 = 0x05, /* Interrupt Status */
++ PCF50633_REG_INT5 = 0x06, /* Interrupt Status */
++ PCF50633_REG_INT1M = 0x07, /* Interrupt Mask */
++ PCF50633_REG_INT2M = 0x08, /* Interrupt Mask */
++ PCF50633_REG_INT3M = 0x09, /* Interrupt Mask */
++ PCF50633_REG_INT4M = 0x0a, /* Interrupt Mask */
++ PCF50633_REG_INT5M = 0x0b, /* Interrupt Mask */
++ PCF50633_REG_OOCSHDWN = 0x0c,
++ PCF50633_REG_OOCWAKE = 0x0d,
++ PCF50633_REG_OOCTIM1 = 0x0e,
++ PCF50633_REG_OOCTIM2 = 0x0f,
++ PCF50633_REG_OOCMODE = 0x10,
++ PCF50633_REG_OOCCTL = 0x11,
++ PCF50633_REG_OOCSTAT = 0x12,
++ PCF50633_REG_GPIOCTL = 0x13,
++ PCF50633_REG_GPIO1CFG = 0x14,
++ PCF50633_REG_GPIO2CFG = 0x15,
++ PCF50633_REG_GPIO3CFG = 0x16,
++ PCF50633_REG_GPOCFG = 0x17,
++ PCF50633_REG_BVMCTL = 0x18,
++ PCF50633_REG_SVMCTL = 0x19,
++ PCF50633_REG_AUTOOUT = 0x1a,
++ PCF50633_REG_AUTOENA = 0x1b,
++ PCF50633_REG_AUTOCTL = 0x1c,
++ PCF50633_REG_AUTOMXC = 0x1d,
++ PCF50633_REG_DOWN1OUT = 0x1e,
++ PCF50633_REG_DOWN1ENA = 0x1f,
++ PCF50633_REG_DOWN1CTL = 0x20,
++ PCF50633_REG_DOWN1MXC = 0x21,
++ PCF50633_REG_DOWN2OUT = 0x22,
++ PCF50633_REG_DOWN2ENA = 0x23,
++ PCF50633_REG_DOWN2CTL = 0x24,
++ PCF50633_REG_DOWN2MXC = 0x25,
++ PCF50633_REG_MEMLDOOUT = 0x26,
++ PCF50633_REG_MEMLDOENA = 0x27,
++ PCF50633_REG_LEDOUT = 0x28,
++ PCF50633_REG_LEDENA = 0x29,
++ PCF50633_REG_LEDCTL = 0x2a,
++ PCF50633_REG_LEDDIM = 0x2b,
++ /* reserved */
++ PCF50633_REG_LDO1OUT = 0x2d,
++ PCF50633_REG_LDO1ENA = 0x2e,
++ PCF50633_REG_LDO2OUT = 0x2f,
++ PCF50633_REG_LDO2ENA = 0x30,
++ PCF50633_REG_LDO3OUT = 0x31,
++ PCF50633_REG_LDO3ENA = 0x32,
++ PCF50633_REG_LDO4OUT = 0x33,
++ PCF50633_REG_LDO4ENA = 0x34,
++ PCF50633_REG_LDO5OUT = 0x35,
++ PCF50633_REG_LDO5ENA = 0x36,
++ PCF50633_REG_LDO6OUT = 0x37,
++ PCF50633_REG_LDO6ENA = 0x38,
++ PCF50633_REG_HCLDOOUT = 0x39,
++ PCF50633_REG_HCLDOENA = 0x3a,
++ PCF50633_REG_STBYCTL1 = 0x3b,
++ PCF50633_REG_STBYCTL2 = 0x3c,
++ PCF50633_REG_DEBPF1 = 0x3d,
++ PCF50633_REG_DEBPF2 = 0x3e,
++ PCF50633_REG_DEBPF3 = 0x3f,
++ PCF50633_REG_HCLDOOVL = 0x40,
++ PCF50633_REG_DCDCSTAT = 0x41,
++ PCF50633_REG_LDOSTAT = 0x42,
++ PCF50633_REG_MBCC1 = 0x43,
++ PCF50633_REG_MBCC2 = 0x44,
++ PCF50633_REG_MBCC3 = 0x45,
++ PCF50633_REG_MBCC4 = 0x46,
++ PCF50633_REG_MBCC5 = 0x47,
++ PCF50633_REG_MBCC6 = 0x48,
++ PCF50633_REG_MBCC7 = 0x49,
++ PCF50633_REG_MBCC8 = 0x4a,
++ PCF50633_REG_MBCS1 = 0x4b,
++ PCF50633_REG_MBCS2 = 0x4c,
++ PCF50633_REG_MBCS3 = 0x4d,
++ PCF50633_REG_BBCCTL = 0x4e,
++ PCF50633_REG_ALMGAIN = 0x4f,
++ PCF50633_REG_ALMDATA = 0x50,
++ /* reserved */
++ PCF50633_REG_ADCC3 = 0x52,
++ PCF50633_REG_ADCC2 = 0x53,
++ PCF50633_REG_ADCC1 = 0x54,
++ PCF50633_REG_ADCS1 = 0x55,
++ PCF50633_REG_ADCS2 = 0x56,
++ PCF50633_REG_ADCS3 = 0x57,
++ /* reserved */
++ PCF50633_REG_RTCSC = 0x59, /* Second */
++ PCF50633_REG_RTCMN = 0x5a, /* Minute */
++ PCF50633_REG_RTCHR = 0x5b, /* Hour */
++ PCF50633_REG_RTCWD = 0x5c, /* Weekday */
++ PCF50633_REG_RTCDT = 0x5d, /* Day */
++ PCF50633_REG_RTCMT = 0x5e, /* Month */
++ PCF50633_REG_RTCYR = 0x5f, /* Year */
++ PCF50633_REG_RTCSCA = 0x60, /* Alarm Second */
++ PCF50633_REG_RTCMNA = 0x61, /* Alarm Minute */
++ PCF50633_REG_RTCHRA = 0x62, /* Alarm Hour */
++ PCF50633_REG_RTCWDA = 0x63, /* Alarm Weekday */
++ PCF50633_REG_RTCDTA = 0x64, /* Alarm Day */
++ PCF50633_REG_RTCMTA = 0x65, /* Alarm Month */
++ PCF50633_REG_RTCYRA = 0x66, /* Alarm Year */
++
++ PCF50633_REG_MEMBYTE0 = 0x67,
++ PCF50633_REG_MEMBYTE1 = 0x68,
++ PCF50633_REG_MEMBYTE2 = 0x69,
++ PCF50633_REG_MEMBYTE3 = 0x6a,
++ PCF50633_REG_MEMBYTE4 = 0x6b,
++ PCF50633_REG_MEMBYTE5 = 0x6c,
++ PCF50633_REG_MEMBYTE6 = 0x6d,
++ PCF50633_REG_MEMBYTE7 = 0x6e,
++ /* reserved */
++ PCF50633_REG_DCDCPFM = 0x84,
++ __NUM_PCF50633_REGS
++};
++
++
++enum pcf50633_reg_oocshdwn {
++ PCF50633_OOCSHDWN_GOSTDBY = 0x01,
++ PCF50633_OOCSHDWN_TOTRST = 0x04,
++ PCF50633_OOCSHDWN_COLDBOOT = 0x08,
++};
++
++enum pcf50633_reg_oocwake {
++ PCF50633_OOCWAKE_ONKEY = 0x01,
++ PCF50633_OOCWAKE_EXTON1 = 0x02,
++ PCF50633_OOCWAKE_EXTON2 = 0x04,
++ PCF50633_OOCWAKE_EXTON3 = 0x08,
++ PCF50633_OOCWAKE_RTC = 0x10,
++ /* reserved */
++ PCF50633_OOCWAKE_USB = 0x40,
++ PCF50633_OOCWAKE_ADP = 0x80,
++};
++
++enum pcf50633_reg_mbcc1 {
++ PCF50633_MBCC1_CHGENA = 0x01, /* Charger enable */
++ PCF50633_MBCC1_AUTOSTOP = 0x02,
++ PCF50633_MBCC1_AUTORES = 0x04, /* automatic resume */
++ PCF50633_MBCC1_RESUME = 0x08, /* explicit resume cmd */
++ PCF50633_MBCC1_RESTART = 0x10, /* restart charging */
++ PCF50633_MBCC1_PREWDTIME_60M = 0x20, /* max. precharging time */
++ PCF50633_MBCC1_WDTIME_1H = 0x00,
++ PCF50633_MBCC1_WDTIME_2H = 0x40,
++ PCF50633_MBCC1_WDTIME_4H = 0x80,
++ PCF50633_MBCC1_WDTIME_6H = 0xc0,
++};
++#define PCF50633_MBCC1_WDTIME_MASK 0xc0
++
++enum pcf50633_reg_mbcc2 {
++ PCF50633_MBCC2_VBATCOND_2V7 = 0x00,
++ PCF50633_MBCC2_VBATCOND_2V85 = 0x01,
++ PCF50633_MBCC2_VBATCOND_3V0 = 0x02,
++ PCF50633_MBCC2_VBATCOND_3V15 = 0x03,
++ PCF50633_MBCC2_VMAX_4V = 0x00,
++ PCF50633_MBCC2_VMAX_4V20 = 0x28,
++ PCF50633_MBCC2_VRESDEBTIME_64S = 0x80, /* debounce time (32/64sec) */
++};
++#define PCF50633_MBCC2_VBATCOND_MASK 0x03
++#define PCF50633_MBCC2_VMAX_MASK 0x3c
++
++enum pcf50633_reg_adcc1 {
++ PCF50633_ADCC1_ADCSTART = 0x01,
++ PCF50633_ADCC1_RES_10BIT = 0x02,
++ PCF50633_ADCC1_AVERAGE_NO = 0x00,
++ PCF50633_ADCC1_AVERAGE_4 = 0x04,
++ PCF50633_ADCC1_AVERAGE_8 = 0x08,
++ PCF50633_ADCC1_AVERAGE_16 = 0x0c,
++
++ PCF50633_ADCC1_MUX_BATSNS_RES = 0x00,
++ PCF50633_ADCC1_MUX_BATSNS_SUBTR = 0x10,
++ PCF50633_ADCC1_MUX_ADCIN2_RES = 0x20,
++ PCF50633_ADCC1_MUX_ADCIN2_SUBTR = 0x30,
++ PCF50633_ADCC1_MUX_BATTEMP = 0x60,
++ PCF50633_ADCC1_MUX_ADCIN1 = 0x70,
++};
++#define PCF50633_ADCC1_AVERAGE_MASK 0x0c
++#define PCF50633_ADCC1_ADCMUX_MASK 0xf0
++
++enum pcf50633_reg_adcc2 {
++ PCF50633_ADCC2_RATIO_NONE = 0x00,
++ PCF50633_ADCC2_RATIO_BATTEMP = 0x01,
++ PCF50633_ADCC2_RATIO_ADCIN1 = 0x02,
++ PCF50633_ADCC2_RATIO_BOTH = 0x03,
++ PCF50633_ADCC2_RATIOSETTL_100US = 0x04,
++};
++#define PCF50633_ADCC2_RATIO_MASK 0x03
++
++enum pcf50633_reg_adcc3 {
++ PCF50633_ADCC3_ACCSW_EN = 0x01,
++ PCF50633_ADCC3_NTCSW_EN = 0x04,
++ PCF50633_ADCC3_RES_DIV_TWO = 0x10,
++ PCF50633_ADCC3_RES_DIV_THREE = 0x00,
++};
++
++enum pcf50633_reg_adcs3 {
++ PCF50633_ADCS3_REF_NTCSW = 0x00,
++ PCF50633_ADCS3_REF_ACCSW = 0x10,
++ PCF50633_ADCS3_REF_2V0 = 0x20,
++ PCF50633_ADCS3_REF_VISA = 0x30,
++ PCF50633_ADCS3_REF_2V0_2 = 0x70,
++ PCF50633_ADCS3_ADCRDY = 0x80,
++};
++#define PCF50633_ADCS3_ADCDAT1L_MASK 0x03
++#define PCF50633_ADCS3_ADCDAT2L_MASK 0x0c
++#define PCF50633_ADCS3_ADCDAT2L_SHIFT 2
++#define PCF50633_ASCS3_REF_MASK 0x70
++
++enum pcf50633_regulator_enable {
++ PCF50633_REGULATOR_ON = 0x01,
++ PCF50633_REGULATOR_ON_GPIO1 = 0x02,
++ PCF50633_REGULATOR_ON_GPIO2 = 0x04,
++ PCF50633_REGULATOR_ON_GPIO3 = 0x08,
++};
++#define PCF50633_REGULATOR_ON_MASK 0x0f
++
++enum pcf50633_regulator_phase {
++ PCF50633_REGULATOR_ACTPH1 = 0x00,
++ PCF50633_REGULATOR_ACTPH2 = 0x10,
++ PCF50633_REGULATOR_ACTPH3 = 0x20,
++ PCF50633_REGULATOR_ACTPH4 = 0x30,
++};
++#define PCF50633_REGULATOR_ACTPH_MASK 0x30
++
++enum pcf50633_reg_gpocfg {
++ PCF50633_GPOCFG_GPOSEL_0 = 0x00,
++ PCF50633_GPOCFG_GPOSEL_LED_NFET = 0x01,
++ PCF50633_GPOCFG_GPOSEL_SYSxOK = 0x02,
++ PCF50633_GPOCFG_GPOSEL_CLK32K = 0x03,
++ PCF50633_GPOCFG_GPOSEL_ADAPUSB = 0x04,
++ PCF50633_GPOCFG_GPOSEL_USBxOK = 0x05,
++ PCF50633_GPOCFG_GPOSEL_ACTPH4 = 0x06,
++ PCF50633_GPOCFG_GPOSEL_1 = 0x07,
++ PCF50633_GPOCFG_GPOSEL_INVERSE = 0x08,
++};
++#define PCF50633_GPOCFG_GPOSEL_MASK 0x07
++
++#if 0
++enum pcf50633_reg_mbcc1 {
++ PCF50633_MBCC1_CHGENA = 0x01,
++ PCF50633_MBCC1_AUTOSTOP = 0x02,
++ PCF50633_MBCC1_AUTORES = 0x04,
++ PCF50633_MBCC1_RESUME = 0x08,
++ PCF50633_MBCC1_RESTART = 0x10,
++ PCF50633_MBCC1_PREWDTIME_30MIN = 0x00,
++ PCF50633_MBCC1_PREWDTIME_60MIN = 0x20,
++ PCF50633_MBCC1_WDTIME_2HRS = 0x40,
++ PCF50633_MBCC1_WDTIME_4HRS = 0x80,
++ PCF50633_MBCC1_WDTIME_6HRS = 0xc0,
++};
++
++enum pcf50633_reg_mbcc2 {
++ PCF50633_MBCC2_VBATCOND_2V7 = 0x00,
++ PCF50633_MBCC2_VBATCOND_2V85 = 0x01,
++ PCF50633_MBCC2_VBATCOND_3V0 = 0x02,
++ PCF50633_MBCC2_VBATCOND_3V15 = 0x03,
++ PCF50633_MBCC2_VRESDEBTIME_64S = 0x80,
++};
++#define PCF50633_MBCC2_VMAX_MASK 0x3c
++#endif
++
++enum pcf50633_reg_mbcc7 {
++ PCF50633_MBCC7_USB_100mA = 0x00,
++ PCF50633_MBCC7_USB_500mA = 0x01,
++ PCF50633_MBCC7_USB_1000mA = 0x02,
++ PCF50633_MBCC7_USB_SUSPEND = 0x03,
++ PCF50633_MBCC7_BATTEMP_EN = 0x04,
++ PCF50633_MBCC7_BATSYSIMAX_1A6 = 0x00,
++ PCF50633_MBCC7_BATSYSIMAX_1A8 = 0x40,
++ PCF50633_MBCC7_BATSYSIMAX_2A0 = 0x80,
++ PCF50633_MBCC7_BATSYSIMAX_2A2 = 0xc0,
++};
++#define PCF56033_MBCC7_USB_MASK 0x03
++
++enum pcf50633_reg_mbcc8 {
++ PCF50633_MBCC8_USBENASUS = 0x10,
++};
++
++enum pcf50633_reg_mbcs1 {
++ PCF50633_MBCS1_USBPRES = 0x01,
++ PCF50633_MBCS1_USBOK = 0x02,
++ PCF50633_MBCS1_ADAPTPRES = 0x04,
++ PCF50633_MBCS1_ADAPTOK = 0x08,
++ PCF50633_MBCS1_TBAT_OK = 0x00,
++ PCF50633_MBCS1_TBAT_ABOVE = 0x10,
++ PCF50633_MBCS1_TBAT_BELOW = 0x20,
++ PCF50633_MBCS1_TBAT_UNDEF = 0x30,
++ PCF50633_MBCS1_PREWDTEXP = 0x40,
++ PCF50633_MBCS1_WDTEXP = 0x80,
++};
++
++enum pcf50633_reg_mbcs2_mbcmod {
++ PCF50633_MBCS2_MBC_PLAY = 0x00,
++ PCF50633_MBCS2_MBC_USB_PRE = 0x01,
++ PCF50633_MBCS2_MBC_USB_PRE_WAIT = 0x02,
++ PCF50633_MBCS2_MBC_USB_FAST = 0x03,
++ PCF50633_MBCS2_MBC_USB_FAST_WAIT= 0x04,
++ PCF50633_MBCS2_MBC_USB_SUSPEND = 0x05,
++ PCF50633_MBCS2_MBC_ADP_PRE = 0x06,
++ PCF50633_MBCS2_MBC_ADP_PRE_WAIT = 0x07,
++ PCF50633_MBCS2_MBC_ADP_FAST = 0x08,
++ PCF50633_MBCS2_MBC_ADP_FAST_WAIT= 0x09,
++ PCF50633_MBCS2_MBC_BAT_FULL = 0x0a,
++ PCF50633_MBCS2_MBC_HALT = 0x0b,
++};
++#define PCF50633_MBCS2_MBC_MASK 0x0f
++enum pcf50633_reg_mbcs2_chgstat {
++ PCF50633_MBCS2_CHGS_NONE = 0x00,
++ PCF50633_MBCS2_CHGS_ADAPTER = 0x10,
++ PCF50633_MBCS2_CHGS_USB = 0x20,
++ PCF50633_MBCS2_CHGS_BOTH = 0x30,
++};
++#define PCF50633_MBCS2_RESSTAT_AUTO 0x40
++
++enum pcf50633_reg_mbcs3 {
++ PCF50633_MBCS3_USBLIM_PLAY = 0x01,
++ PCF50633_MBCS3_USBLIM_CGH = 0x02,
++ PCF50633_MBCS3_TLIM_PLAY = 0x04,
++ PCF50633_MBCS3_TLIM_CHG = 0x08,
++ PCF50633_MBCS3_ILIM = 0x10, /* 1: Ibat > Icutoff */
++ PCF50633_MBCS3_VLIM = 0x20, /* 1: Vbat == Vmax */
++ PCF50633_MBCS3_VBATSTAT = 0x40, /* 1: Vbat > Vbatcond */
++ PCF50633_MBCS3_VRES = 0x80, /* 1: Vbat > Vth(RES) */
++};
++
++/* this is to be provided by the board implementation */
++extern const u_int8_t pcf50633_initial_regs[__NUM_PCF50633_REGS];
++
++void pcf50633_reg_write(u_int8_t reg, u_int8_t val);
++
++u_int8_t pcf50633_reg_read(u_int8_t reg);
++
++void pcf50633_reg_set_bit_mask(u_int8_t reg, u_int8_t mask, u_int8_t val);
++void pcf50633_reg_clear_bits(u_int8_t reg, u_int8_t bits);
++
++void pcf50633_charge_autofast(int on);
++
++#endif /* _PCF50606_H */
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/i2c/i2c-core.c linux-2.6.29-rc3.owrt.om/drivers/i2c/i2c-core.c
+--- linux-2.6.29-rc3.owrt/drivers/i2c/i2c-core.c 2009-05-10 22:08:42.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/i2c/i2c-core.c 2009-05-10 22:27:59.000000000 +0200
+@@ -1,4 +1,3 @@
+-/* i2c-core.c - a device driver for the iic-bus interface */
+ /* ------------------------------------------------------------------------- */
+ /* Copyright (C) 1995-99 Simon G. Vogl
+
+@@ -158,10 +157,16 @@
+
+ if (!dev->driver)
+ return 0;
++#if 0
+ driver = to_i2c_driver(dev->driver);
+ if (!driver->suspend)
+ return 0;
+ return driver->suspend(to_i2c_client(dev), mesg);
++#else
++ if (!dev->driver->suspend)
++ return 0;
++ return dev->driver->suspend(dev, mesg);
++#endif
+ }
+
+ static int i2c_device_resume(struct device * dev)
+@@ -170,10 +175,16 @@
+
+ if (!dev->driver)
+ return 0;
++#if 0
+ driver = to_i2c_driver(dev->driver);
+ if (!driver->resume)
+ return 0;
+ return driver->resume(to_i2c_client(dev));
++#else
++ if (!dev->driver->resume)
++ return 0;
++ return dev->driver->resume(dev);
++#endif
+ }
+
+ static void i2c_client_release(struct device *dev)
+@@ -1129,11 +1140,11 @@
+ int err;
+
+ /* Make sure the address is valid */
+- if (addr < 0x03 || addr > 0x77) {
++ /*if (addr < 0x03 || addr > 0x77) {
+ dev_warn(&adapter->dev, "Invalid probe address 0x%02x\n",
+ addr);
+ return -EINVAL;
+- }
++ }*/
+
+ /* Skip if already in use */
+ if (i2c_check_addr(adapter, addr))
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/keyboard/gpio_keys.c linux-2.6.29-rc3.owrt.om/drivers/input/keyboard/gpio_keys.c
+--- linux-2.6.29-rc3.owrt/drivers/input/keyboard/gpio_keys.c 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/input/keyboard/gpio_keys.c 2009-05-10 22:27:59.000000000 +0200
+@@ -23,7 +23,7 @@
+ #include <linux/input.h>
+ #include <linux/gpio_keys.h>
+
+-#include <asm/gpio.h>
++#include <mach/gpio.h>
+
+ struct gpio_button_data {
+ struct gpio_keys_button *button;
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/keyboard/Kconfig linux-2.6.29-rc3.owrt.om/drivers/input/keyboard/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/input/keyboard/Kconfig 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/input/keyboard/Kconfig 2009-05-10 22:27:59.000000000 +0200
+@@ -332,4 +332,21 @@
+
+ To compile this driver as a module, choose M here: the
+ module will be called sh_keysc.
++config KEYBOARD_NEO1973
++ tristate "FIC Neo1973 buttons"
++ depends on MACH_NEO1973
++ default y
++ help
++ Say Y here to enable the buttons on the FIC Neo1973
++ GSM phone.
++
++ To compile this driver as a module, choose M here: the
++ module will be called neo1973kbd.
++
++config KEYBOARD_QT2410
++ tristate "QT2410 buttons"
++ depends on MACH_QT2410
++ default y
++
++
+ endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/keyboard/Makefile linux-2.6.29-rc3.owrt.om/drivers/input/keyboard/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/input/keyboard/Makefile 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/input/keyboard/Makefile 2009-05-10 22:27:59.000000000 +0200
+@@ -14,6 +14,8 @@
+ obj-$(CONFIG_KEYBOARD_NEWTON) += newtonkbd.o
+ obj-$(CONFIG_KEYBOARD_STOWAWAY) += stowaway.o
+ obj-$(CONFIG_KEYBOARD_CORGI) += corgikbd.o
++obj-$(CONFIG_KEYBOARD_NEO1973) += neo1973kbd.o
++obj-$(CONFIG_KEYBOARD_QT2410) += qt2410kbd.o
+ obj-$(CONFIG_KEYBOARD_SPITZ) += spitzkbd.o
+ obj-$(CONFIG_KEYBOARD_TOSA) += tosakbd.o
+ obj-$(CONFIG_KEYBOARD_HIL) += hil_kbd.o
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/keyboard/neo1973kbd.c linux-2.6.29-rc3.owrt.om/drivers/input/keyboard/neo1973kbd.c
+--- linux-2.6.29-rc3.owrt/drivers/input/keyboard/neo1973kbd.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/input/keyboard/neo1973kbd.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,467 @@
++/*
++ * Keyboard driver for FIC Neo1973 GSM phone
++ *
++ * (C) 2006-2007 by Openmoko, Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * All rights reserved.
++ *
++ * inspired by corkgbd.c by Richard Purdie
++ *
++ * 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.
++ *
++ */
++
++#include <linux/delay.h>
++#include <linux/platform_device.h>
++#include <linux/init.h>
++#include <linux/input.h>
++#include <linux/interrupt.h>
++#include <linux/jiffies.h>
++#include <linux/module.h>
++#include <linux/slab.h>
++#include <linux/workqueue.h>
++
++#include <mach/gpio.h>
++#include <asm/mach-types.h>
++
++#ifdef CONFIG_PM
++extern int global_inside_suspend;
++#else
++#define global_inside_suspend 0
++#endif
++
++struct neo1973kbd {
++ struct platform_device *pdev;
++ struct input_dev *input;
++ struct device *cdev;
++ struct work_struct work;
++ int aux_state;
++ int work_in_progress;
++ int hp_irq_count_in_work;
++ int hp_irq_count;
++ int jack_irq;
++};
++
++static struct class *neo1973kbd_switch_class;
++
++enum keys {
++ NEO1973_KEY_AUX, /* GTA01 / 02 only */
++ NEO1973_KEY_HOLD,
++ NEO1973_KEY_JACK,
++ NEO1973_KEY_PLUS, /* GTA03 only */
++ NEO1973_KEY_MINUS, /* GTA03 only */
++};
++
++struct neo1973kbd_key {
++ const char * name;
++ irqreturn_t (*isr)(int irq, void *dev_id);
++ int irq;
++ int input_key;
++};
++
++static irqreturn_t neo1973kbd_aux_irq(int irq, void *dev_id);
++static irqreturn_t neo1973kbd_headphone_irq(int irq, void *dev_id);
++static irqreturn_t neo1973kbd_default_key_irq(int irq, void *dev_id);
++
++
++static struct neo1973kbd_key keys[] = {
++ [NEO1973_KEY_AUX] = {
++ .name = "Neo1973 AUX button",
++ .isr = neo1973kbd_aux_irq,
++ .input_key = KEY_PHONE,
++ },
++ [NEO1973_KEY_HOLD] = {
++ .name = "Neo1973 HOLD button",
++ .isr = neo1973kbd_default_key_irq,
++ .input_key = KEY_PAUSE,
++ },
++ [NEO1973_KEY_JACK] = {
++ .name = "Neo1973 Headphone jack",
++ .isr = neo1973kbd_headphone_irq,
++ },
++ [NEO1973_KEY_PLUS] = {
++ .name = "GTA03 PLUS button",
++ .isr = neo1973kbd_default_key_irq,
++ .input_key = KEY_KPPLUS,
++ },
++ [NEO1973_KEY_MINUS] = {
++ .name = "GTA03 MINUS button",
++ .isr = neo1973kbd_default_key_irq,
++ .input_key = KEY_KPMINUS,
++ },
++};
++
++/* This timer section filters AUX button IRQ bouncing */
++
++static void aux_key_timer_f(unsigned long data);
++
++static struct timer_list aux_key_timer =
++ TIMER_INITIALIZER(aux_key_timer_f, 0, 0);
++
++#define AUX_TIMER_TIMEOUT (HZ >> 7)
++#define AUX_TIMER_ALLOWED_NOOP 2
++#define AUX_TIMER_CONSECUTIVE_EVENTS 5
++
++struct neo1973kbd *timer_kbd;
++
++static void aux_key_timer_f(unsigned long data)
++{
++ static int noop_counter;
++ static int last_key = -1;
++ static int last_count;
++ int key_pressed;
++
++ key_pressed =
++ !gpio_get_value(timer_kbd->pdev->resource[NEO1973_KEY_AUX].start);
++ if (machine_is_neo1973_gta02())
++ key_pressed = !key_pressed;
++
++ if (likely(key_pressed == last_key))
++ last_count++;
++ else {
++ last_count = 1;
++ last_key = key_pressed;
++ }
++
++ if (unlikely(last_count >= AUX_TIMER_CONSECUTIVE_EVENTS)) {
++ if (timer_kbd->aux_state != last_key) {
++ input_report_key(timer_kbd->input, KEY_PHONE, last_key);
++ input_sync(timer_kbd->input);
++
++ timer_kbd->aux_state = last_key;
++ noop_counter = 0;
++ }
++ last_count = 0;
++ if (unlikely(++noop_counter > AUX_TIMER_ALLOWED_NOOP)) {
++ noop_counter = 0;
++ return;
++ }
++ }
++
++ mod_timer(&aux_key_timer, jiffies + AUX_TIMER_TIMEOUT);
++}
++
++static irqreturn_t neo1973kbd_aux_irq(int irq, void *dev)
++{
++ mod_timer(&aux_key_timer, jiffies + AUX_TIMER_TIMEOUT);
++
++ return IRQ_HANDLED;
++}
++
++static irqreturn_t neo1973kbd_default_key_irq(int irq, void *dev_id)
++{
++ struct neo1973kbd *kbd = dev_id;
++ int n;
++
++ for (n = 0; n < ARRAY_SIZE(keys); n++) {
++
++ if (irq != keys[n].irq)
++ continue;
++
++ input_report_key(kbd->input, keys[n].input_key,
++ gpio_get_value(kbd->pdev->resource[n].start));
++ input_sync(kbd->input);
++ }
++
++ return IRQ_HANDLED;
++}
++
++
++static const char *event_array_jack[2][4] = {
++ [0] = {
++ "SWITCH_NAME=headset",
++ "SWITCH_STATE=0",
++ "EVENT=remove",
++ NULL
++ },
++ [1] = {
++ "SWITCH_NAME=headset",
++ "SWITCH_STATE=1",
++ "EVENT=insert",
++ NULL
++ },
++};
++
++static void neo1973kbd_jack_event(struct device *dev, int num)
++{
++ kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, (char **)event_array_jack[!!num]);
++}
++
++
++static void neo1973kbd_debounce_jack(struct work_struct *work)
++{
++ struct neo1973kbd *kbd = container_of(work, struct neo1973kbd, work);
++ unsigned long flags;
++ int loop = 0;
++ int level;
++
++ do {
++ /*
++ * we wait out any multiple interrupt
++ * stuttering in 100ms lumps
++ */
++ do {
++ kbd->hp_irq_count_in_work = kbd->hp_irq_count;
++ msleep(100);
++ } while (kbd->hp_irq_count != kbd->hp_irq_count_in_work);
++ /*
++ * no new interrupts on jack for 100ms...
++ * ok we will report it
++ */
++ level = gpio_get_value(kbd->pdev->resource[NEO1973_KEY_JACK].start);
++ input_report_switch(kbd->input, SW_HEADPHONE_INSERT, level);
++ input_sync(kbd->input);
++ neo1973kbd_jack_event(kbd->cdev, level);
++ /*
++ * we go around the outer loop again if we detect that more
++ * interrupts came while we are servicing here. But we have
++ * to sequence it carefully with interrupts off
++ */
++ local_save_flags(flags);
++ /* no interrupts during this work means we can exit the work */
++ loop = !!(kbd->hp_irq_count != kbd->hp_irq_count_in_work);
++ if (!loop)
++ kbd->work_in_progress = 0;
++ local_irq_restore(flags);
++ /*
++ * interrupt that comes here will either queue a new work action
++ * since work_in_progress is cleared now, or be dealt with
++ * when we loop.
++ */
++ } while (loop);
++}
++
++
++static irqreturn_t neo1973kbd_headphone_irq(int irq, void *dev_id)
++{
++ struct neo1973kbd *neo1973kbd_data = dev_id;
++
++ /*
++ * this interrupt is prone to bouncing and userspace doesn't like
++ * to have to deal with that kind of thing. So we do not accept
++ * that a jack interrupt is equal to a jack event. Instead we fire
++ * some work on the first interrupt, and it hangs about in 100ms units
++ * until no more interrupts come. Then it accepts the state it finds
++ * for jack insert and reports it once
++ */
++
++ neo1973kbd_data->hp_irq_count++;
++ /*
++ * the first interrupt we see for a while, we fire the work item
++ * and record the interrupt count when we did that. If more interrupts
++ * come in the meanwhile, we can tell by the difference in that
++ * stored count and hp_irq_count which increments every interrupt
++ */
++ if (!neo1973kbd_data->work_in_progress) {
++ neo1973kbd_data->jack_irq = irq;
++ neo1973kbd_data->hp_irq_count_in_work =
++ neo1973kbd_data->hp_irq_count;
++ if (!schedule_work(&neo1973kbd_data->work))
++ printk(KERN_ERR
++ "Unable to schedule headphone debounce\n");
++ else
++ neo1973kbd_data->work_in_progress = 1;
++ }
++
++ return IRQ_HANDLED;
++}
++
++#ifdef CONFIG_PM
++static int neo1973kbd_suspend(struct platform_device *dev, pm_message_t state)
++{
++ if (machine_is_neo1973_gta02()) {
++ disable_irq(keys[NEO1973_KEY_AUX].irq);
++ del_timer_sync(&aux_key_timer);
++ }
++ return 0;
++}
++
++static int neo1973kbd_resume(struct platform_device *dev)
++{
++ if (machine_is_neo1973_gta02())
++ enable_irq(keys[NEO1973_KEY_AUX].irq);
++
++ return 0;
++}
++#else
++#define neo1973kbd_suspend NULL
++#define neo1973kbd_resume NULL
++#endif
++
++static ssize_t neo1973kbd_switch_name_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ return sprintf(buf, "%s\n", "neo1973 Headset Jack");
++}
++
++static ssize_t neo1973kbd_switch_state_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ struct neo1973kbd *kbd = dev_get_drvdata(dev);
++ return sprintf(buf, "%d\n",
++ gpio_get_value(kbd->pdev->resource[NEO1973_KEY_JACK].start));
++}
++
++static DEVICE_ATTR(name, S_IRUGO , neo1973kbd_switch_name_show, NULL);
++static DEVICE_ATTR(state, S_IRUGO , neo1973kbd_switch_state_show, NULL);
++
++static int neo1973kbd_probe(struct platform_device *pdev)
++{
++ struct neo1973kbd *neo1973kbd;
++ struct input_dev *input_dev;
++ int rc;
++ int irq;
++ int n;
++
++ neo1973kbd = kzalloc(sizeof(struct neo1973kbd), GFP_KERNEL);
++ input_dev = input_allocate_device();
++ if (!neo1973kbd || !input_dev) {
++ kfree(neo1973kbd);
++ input_free_device(input_dev);
++ return -ENOMEM;
++ }
++
++ neo1973kbd->pdev = pdev;
++ timer_kbd = neo1973kbd;
++
++ if (pdev->resource[0].flags != 0)
++ return -EINVAL;
++
++ platform_set_drvdata(pdev, neo1973kbd);
++
++ neo1973kbd->input = input_dev;
++
++ INIT_WORK(&neo1973kbd->work, neo1973kbd_debounce_jack);
++
++ input_dev->name = "Neo1973 Buttons";
++ input_dev->phys = "neo1973kbd/input0";
++ input_dev->id.bustype = BUS_HOST;
++ input_dev->id.vendor = 0x0001;
++ input_dev->id.product = 0x0001;
++ input_dev->id.version = 0x0100;
++ input_dev->dev.parent = &pdev->dev;
++
++ input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_SW);
++ set_bit(SW_HEADPHONE_INSERT, input_dev->swbit);
++ set_bit(KEY_PHONE, input_dev->keybit);
++ set_bit(KEY_PAUSE, input_dev->keybit);
++
++ rc = input_register_device(neo1973kbd->input);
++ if (rc)
++ goto out_register;
++
++ neo1973kbd->cdev = device_create(neo1973kbd_switch_class,
++ &pdev->dev, 0, neo1973kbd, "headset");
++ if (unlikely(IS_ERR(neo1973kbd->cdev))) {
++ rc = PTR_ERR(neo1973kbd->cdev);
++ goto out_device_create;
++ }
++
++ rc = device_create_file(neo1973kbd->cdev, &dev_attr_name);
++ if(rc)
++ goto out_device_create_file;
++
++ rc = device_create_file(neo1973kbd->cdev, &dev_attr_state);
++ if(rc)
++ goto out_device_create_file;
++
++ /* register GPIO IRQs */
++ for(n = 0; n < min(pdev->num_resources, ARRAY_SIZE(keys)); n++) {
++
++ if (!pdev->resource[0].start)
++ continue;
++
++ irq = gpio_to_irq(pdev->resource[n].start);
++ if (irq < 0)
++ continue;
++
++ if (request_irq(irq, keys[n].isr, IRQF_DISABLED |
++ IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
++ keys[n].name, neo1973kbd)) {
++ dev_err(&pdev->dev, "Can't get IRQ %u\n", irq);
++
++ /* unwind any irq registrations and fail */
++
++ while (n > 0) {
++ n--;
++ free_irq(gpio_to_irq(pdev->resource[n].start),
++ neo1973kbd);
++ }
++ goto out_device_create_file;
++ }
++
++ keys[n].irq = irq;
++ }
++
++ /*
++ * GTA01 revisions before Bv4 can't be resumed by the PMU, so we use
++ * resume by AUX.
++ */
++ if (machine_is_neo1973_gta01())
++ enable_irq_wake(keys[NEO1973_KEY_AUX].irq);
++
++ enable_irq_wake(keys[NEO1973_KEY_JACK].irq);
++
++ return 0;
++
++out_device_create_file:
++ device_unregister(neo1973kbd->cdev);
++out_device_create:
++ input_unregister_device(neo1973kbd->input);
++out_register:
++ input_free_device(neo1973kbd->input);
++ platform_set_drvdata(pdev, NULL);
++ kfree(neo1973kbd);
++
++ return -ENODEV;
++}
++
++static int neo1973kbd_remove(struct platform_device *pdev)
++{
++ struct neo1973kbd *neo1973kbd = platform_get_drvdata(pdev);
++
++ free_irq(gpio_to_irq(pdev->resource[2].start), neo1973kbd);
++ free_irq(gpio_to_irq(pdev->resource[1].start), neo1973kbd);
++ free_irq(gpio_to_irq(pdev->resource[0].start), neo1973kbd);
++
++ device_unregister(neo1973kbd->cdev);
++ input_unregister_device(neo1973kbd->input);
++ input_free_device(neo1973kbd->input);
++ platform_set_drvdata(pdev, NULL);
++ kfree(neo1973kbd);
++
++ return 0;
++}
++
++static struct platform_driver neo1973kbd_driver = {
++ .probe = neo1973kbd_probe,
++ .remove = neo1973kbd_remove,
++ .suspend = neo1973kbd_suspend,
++ .resume = neo1973kbd_resume,
++ .driver = {
++ .name = "neo1973-button",
++ },
++};
++
++static int __devinit neo1973kbd_init(void)
++{
++ neo1973kbd_switch_class = class_create(THIS_MODULE, "switch");
++ if (IS_ERR(neo1973kbd_switch_class))
++ return PTR_ERR(neo1973kbd_switch_class);
++ return platform_driver_register(&neo1973kbd_driver);
++}
++
++static void __exit neo1973kbd_exit(void)
++{
++ platform_driver_unregister(&neo1973kbd_driver);
++ class_destroy(neo1973kbd_switch_class);
++}
++
++module_init(neo1973kbd_init);
++module_exit(neo1973kbd_exit);
++
++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
++MODULE_DESCRIPTION("FIC Neo1973 buttons input driver");
++MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/keyboard/qt2410kbd.c linux-2.6.29-rc3.owrt.om/drivers/input/keyboard/qt2410kbd.c
+--- linux-2.6.29-rc3.owrt/drivers/input/keyboard/qt2410kbd.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/input/keyboard/qt2410kbd.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,231 @@
++/*
++ * Keyboard driver for Armzone QT2410
++ *
++ * (C) 2006 by Openmoko, Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * All rights reserved.
++ *
++ * 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.
++ *
++ */
++
++#include <linux/delay.h>
++#include <linux/platform_device.h>
++#include <linux/init.h>
++#include <linux/input.h>
++#include <linux/interrupt.h>
++#include <linux/jiffies.h>
++#include <linux/module.h>
++#include <linux/slab.h>
++
++#include <mach/hardware.h>
++#include <mach/gta01.h>
++
++struct gta01kbd {
++ struct input_dev *input;
++ unsigned int suspended;
++ unsigned long suspend_jiffies;
++};
++
++static irqreturn_t gta01kbd_interrupt(int irq, void *dev_id)
++{
++ struct gta01kbd *gta01kbd_data = dev_id;
++
++ /* FIXME: use GPIO from platform_dev resources */
++ if (s3c2410_gpio_getpin(S3C2410_GPF0))
++ input_report_key(gta01kbd_data->input, KEY_PHONE, 1);
++ else
++ input_report_key(gta01kbd_data->input, KEY_PHONE, 0);
++
++ input_sync(gta01kbd_data->input);
++
++ return IRQ_HANDLED;
++}
++
++
++#ifdef CONFIG_PM
++static int gta01kbd_suspend(struct platform_device *dev, pm_message_t state)
++{
++ struct gta01kbd *gta01kbd = platform_get_drvdata(dev);
++
++ gta01kbd->suspended = 1;
++
++ return 0;
++}
++
++static int gta01kbd_resume(struct platform_device *dev)
++{
++ struct gta01kbd *gta01kbd = platform_get_drvdata(dev);
++
++ gta01kbd->suspended = 0;
++
++ return 0;
++}
++#else
++#define gta01kbd_suspend NULL
++#define gta01kbd_resume NULL
++#endif
++
++static int gta01kbd_probe(struct platform_device *pdev)
++{
++ struct gta01kbd *gta01kbd;
++ struct input_dev *input_dev;
++ int irq_911;
++ int rc = 0;
++
++ gta01kbd = kzalloc(sizeof(struct gta01kbd), GFP_KERNEL);
++ if (!gta01kbd) {
++ rc = -ENOMEM;
++ goto bail;
++ }
++ input_dev = input_allocate_device();
++ if (!gta01kbd || !input_dev) {
++ rc = -ENOMEM;
++ goto bail_free;
++ }
++
++ if (pdev->resource[0].flags != 0) {\
++ rc = -EINVAL;
++ goto bail_free_dev;
++ }
++
++ irq_911 = s3c2410_gpio_getirq(pdev->resource[0].start);
++ if (irq_911 < 0) {
++ rc = -EINVAL;
++ goto bail_free_dev;
++ }
++
++ platform_set_drvdata(pdev, gta01kbd);
++
++ gta01kbd->input = input_dev;
++
++#if 0
++ spin_lock_init(&gta01kbd->lock);
++ /* Init Keyboard rescan timer */
++ init_timer(&corgikbd->timer);
++ corgikbd->timer.function = corgikbd_timer_callback;
++ corgikbd->timer.data = (unsigned long) corgikbd;
++
++ /* Init Hinge Timer */
++ init_timer(&corgikbd->htimer);
++ corgikbd->htimer.function = corgikbd_hinge_timer;
++ corgikbd->htimer.data = (unsigned long) corgikbd;
++
++ corgikbd->suspend_jiffies=jiffies;
++
++ memcpy(corgikbd->keycode, corgikbd_keycode, sizeof(corgikbd->keycode));
++#endif
++
++ input_dev->name = "QT2410 Buttons";
++ input_dev->phys = "qt2410kbd/input0";
++ input_dev->id.bustype = BUS_HOST;
++ input_dev->id.vendor = 0x0001;
++ input_dev->id.product = 0x0001;
++ input_dev->id.version = 0x0100;
++
++ input_dev->evbit[0] = BIT(EV_KEY);
++#if 0
++ input_dev->keycode = gta01kbd->keycode;
++ input_dev->keycodesize = sizeof(unsigned char);
++ input_dev->keycodemax = ARRAY_SIZE(corgikbd_keycode);
++
++ for (i = 0; i < ARRAY_SIZE(corgikbd_keycode); i++)
++ set_bit(corgikbd->keycode[i], input_dev->keybit);
++ clear_bit(0, input_dev->keybit);
++ set_bit(SW_LID, input_dev->swbit);
++ set_bit(SW_TABLET_MODE, input_dev->swbit);
++ set_bit(SW_HEADPHONE_INSERT, input_dev->swbit);
++#endif
++
++ rc = input_register_device(gta01kbd->input);
++ if (rc)
++ goto bail_free_dev;
++
++ s3c2410_gpio_cfgpin(S3C2410_GPF0, S3C2410_GPF0_EINT0);
++ if (request_irq(irq_911, gta01kbd_interrupt,
++ IRQF_DISABLED | IRQF_TRIGGER_RISING |
++ IRQF_TRIGGER_FALLING, "qt2410kbd_eint0", gta01kbd))
++ printk(KERN_WARNING "gta01kbd: Can't get IRQ\n");
++ enable_irq_wake(irq_911);
++
++ /* FIXME: headphone insert */
++
++#if 0
++ mod_timer(&corgikbd->htimer, jiffies + msecs_to_jiffies(HINGE_SCAN_INTERVAL));
++
++ /* Setup sense interrupts - RisingEdge Detect, sense lines as inputs */
++ for (i = 0; i < CORGI_KEY_SENSE_NUM; i++) {
++ pxa_gpio_mode(CORGI_GPIO_KEY_SENSE(i) | GPIO_IN);
++ if (request_irq(CORGI_IRQ_GPIO_KEY_SENSE(i), corgikbd_interrupt,
++ SA_INTERRUPT | SA_TRIGGER_RISING,
++ "corgikbd", corgikbd))
++ printk(KERN_WARNING "corgikbd: Can't get IRQ: %d!\n", i);
++ }
++
++ /* Set Strobe lines as outputs - set high */
++ for (i = 0; i < CORGI_KEY_STROBE_NUM; i++)
++ pxa_gpio_mode(CORGI_GPIO_KEY_STROBE(i) | GPIO_OUT | GPIO_DFLT_HIGH);
++
++ /* Setup the headphone jack as an input */
++ pxa_gpio_mode(CORGI_GPIO_AK_INT | GPIO_IN);
++#endif
++
++ return 0;
++
++bail_free_dev:
++ input_free_device(input_dev);
++bail_free:
++ kfree(gta01kbd);
++bail:
++ return rc;
++}
++
++static int gta01kbd_remove(struct platform_device *pdev)
++{
++ struct gta01kbd *gta01kbd = platform_get_drvdata(pdev);
++
++ free_irq(s3c2410_gpio_getirq(pdev->resource[0].start), gta01kbd);
++#if 0
++ int i;
++
++ for (i = 0; i < CORGI_KEY_SENSE_NUM; i++)
++ free_irq(CORGI_IRQ_GPIO_KEY_SENSE(i), corgikbd);
++
++ del_timer_sync(&corgikbd->htimer);
++ del_timer_sync(&corgikbd->timer);
++#endif
++ input_unregister_device(gta01kbd->input);
++
++ kfree(gta01kbd);
++
++ return 0;
++}
++
++static struct platform_driver gta01kbd_driver = {
++ .probe = gta01kbd_probe,
++ .remove = gta01kbd_remove,
++ .suspend = gta01kbd_suspend,
++ .resume = gta01kbd_resume,
++ .driver = {
++ .name = "qt2410-button",
++ },
++};
++
++static int __devinit gta01kbd_init(void)
++{
++ return platform_driver_register(&gta01kbd_driver);
++}
++
++static void __exit gta01kbd_exit(void)
++{
++ platform_driver_unregister(&gta01kbd_driver);
++}
++
++module_init(gta01kbd_init);
++module_exit(gta01kbd_exit);
++
++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
++MODULE_DESCRIPTION("Armzone QT2410 Buttons Driver");
++MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/misc/Kconfig linux-2.6.29-rc3.owrt.om/drivers/input/misc/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/input/misc/Kconfig 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/input/misc/Kconfig 2009-05-10 22:27:59.000000000 +0200
+@@ -220,12 +220,26 @@
+ Say Y here if you want to support the built-in real time clock
+ of the HP SDC controller.
+
++config INPUT_LIS302DL
++ tristate "STmicro LIS302DL 3-axis accelerometer"
++ depends on SPI_MASTER
++ help
++ SPI driver for the STmicro LIS302DL 3-axis accelerometer.
++
++ The userspece interface is a 3-axis (X/Y/Z) relative movement
++ Linux input device, reporting REL_[XYZ] events.
++
+ config INPUT_PCF50633_PMU
+ tristate "PCF50633 PMU events"
+ depends on MFD_PCF50633
+ help
+- Say Y to include support for delivering PMU events via input
+- layer on NXP PCF50633.
++ Say Y to include support for input events on NXP PCF50633.
++
++config INPUT_PCF50606_PMU
++ tristate "PCF50606 PMU events"
++ depends on MFD_PCF50606
++ help
++ Say Y to include support for input events on NXP PCF50606.
+
+ config INPUT_GPIO_BUTTONS
+ tristate "Polled GPIO buttons interface"
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/misc/lis302dl.c linux-2.6.29-rc3.owrt.om/drivers/input/misc/lis302dl.c
+--- linux-2.6.29-rc3.owrt/drivers/input/misc/lis302dl.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/input/misc/lis302dl.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,958 @@
++/* Linux kernel driver for the ST LIS302D 3-axis accelerometer
++ *
++ * Copyright (C) 2007-2008 by Openmoko, Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * converted to private bitbang by:
++ * Andy Green <andy@openmoko.com>
++ * ability to set acceleration threshold added by:
++ * Simon Kagstrom <simon.kagstrom@gmail.com>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ *
++ * TODO
++ * * statistics for overflow events
++ * * configuration interface (sysfs) for
++ * * enable/disable x/y/z axis data ready
++ * * enable/disable resume from freee fall / click
++ * * free fall / click parameters
++ * * high pass filter parameters
++ */
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/module.h>
++#include <linux/device.h>
++#include <linux/platform_device.h>
++#include <linux/delay.h>
++#include <linux/irq.h>
++#include <linux/interrupt.h>
++#include <linux/sysfs.h>
++#include <linux/spi/spi.h>
++
++#include <linux/lis302dl.h>
++
++/* Utility functions */
++static u8 __reg_read(struct lis302dl_info *lis, u8 reg)
++{
++ struct spi_message msg;
++ struct spi_transfer t;
++ u8 data[2] = {0xc0 | reg};
++ int rc;
++
++ spi_message_init(&msg);
++ memset(&t, 0, sizeof t);
++ t.len = 2;
++ spi_message_add_tail(&t, &msg);
++ t.tx_buf = &data[0];
++ t.rx_buf = &data[0];
++
++ /* Should complete without blocking */
++ rc = spi_non_blocking_transfer(lis->spi, &msg);
++ if (rc < 0) {
++ dev_err(lis->dev, "Error reading register\n");
++ return rc;
++ }
++
++ return data[1];
++}
++
++static void __reg_write(struct lis302dl_info *lis, u8 reg, u8 val)
++{
++ struct spi_message msg;
++ struct spi_transfer t;
++ u8 data[2] = {reg, val};
++
++ spi_message_init(&msg);
++ memset(&t, 0, sizeof t);
++ t.len = 2;
++ spi_message_add_tail(&t, &msg);
++ t.tx_buf = &data[0];
++ t.rx_buf = &data[0];
++
++ /* Completes without blocking */
++ if (spi_non_blocking_transfer(lis->spi, &msg) < 0)
++ dev_err(lis->dev, "Error writing register\n");
++}
++
++static void __reg_set_bit_mask(struct lis302dl_info *lis, u8 reg, u8 mask,
++ u8 val)
++{
++ u_int8_t tmp;
++
++ val &= mask;
++
++ tmp = __reg_read(lis, reg);
++ tmp &= ~mask;
++ tmp |= val;
++ __reg_write(lis, reg, tmp);
++}
++
++static int __ms_to_duration(struct lis302dl_info *lis, int ms)
++{
++ /* If we have 400 ms sampling rate, the stepping is 2.5 ms,
++ * on 100 ms the stepping is 10ms */
++ if (lis->flags & LIS302DL_F_DR)
++ return min((ms * 10) / 25, 637);
++
++ return min(ms / 10, 2550);
++}
++
++static int __duration_to_ms(struct lis302dl_info *lis, int duration)
++{
++ if (lis->flags & LIS302DL_F_DR)
++ return (duration * 25) / 10;
++
++ return duration * 10;
++}
++
++static u8 __mg_to_threshold(struct lis302dl_info *lis, int mg)
++{
++ /* If FS is set each bit is 71mg, otherwise 18mg. The THS register
++ * has 7 bits for the threshold value */
++ if (lis->flags & LIS302DL_F_FS)
++ return min(mg / 71, 127);
++
++ return min(mg / 18, 127);
++}
++
++static int __threshold_to_mg(struct lis302dl_info *lis, u8 threshold)
++{
++ if (lis->flags & LIS302DL_F_FS)
++ return threshold * 71;
++
++ return threshold * 18;
++}
++
++/* interrupt handling related */
++
++enum lis302dl_intmode {
++ LIS302DL_INTMODE_GND = 0x00,
++ LIS302DL_INTMODE_FF_WU_1 = 0x01,
++ LIS302DL_INTMODE_FF_WU_2 = 0x02,
++ LIS302DL_INTMODE_FF_WU_12 = 0x03,
++ LIS302DL_INTMODE_DATA_READY = 0x04,
++ LIS302DL_INTMODE_CLICK = 0x07,
++};
++
++static void __lis302dl_int_mode(struct device *dev, int int_pin,
++ enum lis302dl_intmode mode)
++{
++ struct lis302dl_info *lis = dev_get_drvdata(dev);
++
++ switch (int_pin) {
++ case 1:
++ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL3, 0x07, mode);
++ break;
++ case 2:
++ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL3, 0x38, mode << 3);
++ break;
++ default:
++ BUG();
++ }
++}
++
++static void __enable_wakeup(struct lis302dl_info *lis)
++{
++ __reg_write(lis, LIS302DL_REG_CTRL1, 0);
++
++ /* First zero to get to a known state */
++ __reg_write(lis, LIS302DL_REG_FF_WU_CFG_1, LIS302DL_FFWUCFG_XHIE |
++ LIS302DL_FFWUCFG_YHIE | LIS302DL_FFWUCFG_ZHIE |
++ LIS302DL_FFWUCFG_LIR);
++ __reg_write(lis, LIS302DL_REG_FF_WU_THS_1,
++ __mg_to_threshold(lis, lis->wakeup.threshold));
++ __reg_write(lis, LIS302DL_REG_FF_WU_DURATION_1,
++ __ms_to_duration(lis, lis->wakeup.duration));
++
++ /* Route the interrupt for wakeup */
++ __lis302dl_int_mode(lis->dev, 1,
++ LIS302DL_INTMODE_FF_WU_1);
++
++ __reg_read(lis, LIS302DL_REG_HP_FILTER_RESET);
++ __reg_read(lis, LIS302DL_REG_OUT_X);
++ __reg_read(lis, LIS302DL_REG_OUT_Y);
++ __reg_read(lis, LIS302DL_REG_OUT_Z);
++ __reg_read(lis, LIS302DL_REG_STATUS);
++ __reg_read(lis, LIS302DL_REG_FF_WU_SRC_1);
++ __reg_read(lis, LIS302DL_REG_FF_WU_SRC_2);
++ __reg_write(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_PD | 7);
++}
++
++static void __enable_data_collection(struct lis302dl_info *lis)
++{
++ u_int8_t ctrl1 = LIS302DL_CTRL1_PD | LIS302DL_CTRL1_Xen |
++ LIS302DL_CTRL1_Yen | LIS302DL_CTRL1_Zen;
++
++ /* make sure we're powered up and generate data ready */
++ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, ctrl1, ctrl1);
++
++ /* If the threshold is zero, let the device generated an interrupt
++ * on each datum */
++ if (lis->threshold == 0) {
++ __reg_write(lis, LIS302DL_REG_CTRL2, 0);
++ __lis302dl_int_mode(lis->dev, 1, LIS302DL_INTMODE_DATA_READY);
++ __lis302dl_int_mode(lis->dev, 2, LIS302DL_INTMODE_DATA_READY);
++ } else {
++ __reg_write(lis, LIS302DL_REG_CTRL2,
++ LIS302DL_CTRL2_HPFF1);
++ __reg_write(lis, LIS302DL_REG_FF_WU_THS_1,
++ __mg_to_threshold(lis, lis->threshold));
++ __reg_write(lis, LIS302DL_REG_FF_WU_DURATION_1,
++ __ms_to_duration(lis, lis->duration));
++
++ /* Clear the HP filter "starting point" */
++ __reg_read(lis, LIS302DL_REG_HP_FILTER_RESET);
++ __reg_write(lis, LIS302DL_REG_FF_WU_CFG_1,
++ LIS302DL_FFWUCFG_XHIE | LIS302DL_FFWUCFG_YHIE |
++ LIS302DL_FFWUCFG_ZHIE | LIS302DL_FFWUCFG_LIR);
++ __lis302dl_int_mode(lis->dev, 1, LIS302DL_INTMODE_FF_WU_12);
++ __lis302dl_int_mode(lis->dev, 2, LIS302DL_INTMODE_FF_WU_12);
++ }
++}
++
++#if 0
++static void _report_btn_single(struct input_dev *inp, int btn)
++{
++ input_report_key(inp, btn, 1);
++ input_sync(inp);
++ input_report_key(inp, btn, 0);
++}
++
++static void _report_btn_double(struct input_dev *inp, int btn)
++{
++ input_report_key(inp, btn, 1);
++ input_sync(inp);
++ input_report_key(inp, btn, 0);
++ input_sync(inp);
++ input_report_key(inp, btn, 1);
++ input_sync(inp);
++ input_report_key(inp, btn, 0);
++}
++#endif
++
++
++static void lis302dl_bitbang_read_sample(struct lis302dl_info *lis)
++{
++ u8 data[(LIS302DL_REG_OUT_Z - LIS302DL_REG_STATUS) + 2] = {0xC0 | LIS302DL_REG_STATUS};
++ u8 *read = data + 1;
++ unsigned long flags;
++ int mg_per_sample = __threshold_to_mg(lis, 1);
++ struct spi_message msg;
++ struct spi_transfer t;
++
++ spi_message_init(&msg);
++ memset(&t, 0, sizeof t);
++ t.len = sizeof(data);
++ spi_message_add_tail(&t, &msg);
++ t.tx_buf = &data[0];
++ t.rx_buf = &data[0];
++
++ /* grab the set of register containing status and XYZ data */
++
++ local_irq_save(flags);
++
++ /* Should complete without blocking */
++ if (spi_non_blocking_transfer(lis->spi, &msg) < 0)
++ dev_err(lis->dev, "Error reading registers\n");
++
++ local_irq_restore(flags);
++
++ /*
++ * at the minute the test below fails 50% of the time due to
++ * a problem with level interrupts causing ISRs to get called twice.
++ * This is a workaround for that, but actually this test is still
++ * valid and the information can be used for overrrun stats.
++ */
++
++ /* has any kind of overrun been observed by the lis302dl? */
++ if (read[0] & (LIS302DL_STATUS_XOR |
++ LIS302DL_STATUS_YOR |
++ LIS302DL_STATUS_ZOR))
++ lis->overruns++;
++
++ /* we have a valid sample set? */
++ if (read[0] & LIS302DL_STATUS_XYZDA) {
++ input_report_abs(lis->input_dev, ABS_X, mg_per_sample *
++ (s8)read[LIS302DL_REG_OUT_X - LIS302DL_REG_STATUS]);
++ input_report_abs(lis->input_dev, ABS_Y, mg_per_sample *
++ (s8)read[LIS302DL_REG_OUT_Y - LIS302DL_REG_STATUS]);
++ input_report_abs(lis->input_dev, ABS_Z, mg_per_sample *
++ (s8)read[LIS302DL_REG_OUT_Z - LIS302DL_REG_STATUS]);
++
++ input_sync(lis->input_dev);
++ }
++
++ if (lis->threshold)
++ /* acknowledge the wakeup source */
++ __reg_read(lis, LIS302DL_REG_FF_WU_SRC_1);
++}
++
++static irqreturn_t lis302dl_interrupt(int irq, void *_lis)
++{
++ struct lis302dl_info *lis = _lis;
++
++ lis302dl_bitbang_read_sample(lis);
++ return IRQ_HANDLED;
++}
++
++/* sysfs */
++
++static ssize_t show_overruns(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ struct lis302dl_info *lis = dev_get_drvdata(dev);
++
++ return sprintf(buf, "%u\n", lis->overruns);
++}
++
++static DEVICE_ATTR(overruns, S_IRUGO, show_overruns, NULL);
++
++static ssize_t show_rate(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ struct lis302dl_info *lis = dev_get_drvdata(dev);
++ u8 ctrl1;
++ unsigned long flags;
++
++ local_irq_save(flags);
++ ctrl1 = __reg_read(lis, LIS302DL_REG_CTRL1);
++ local_irq_restore(flags);
++
++ return sprintf(buf, "%d\n", ctrl1 & LIS302DL_CTRL1_DR ? 400 : 100);
++}
++
++static ssize_t set_rate(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct lis302dl_info *lis = dev_get_drvdata(dev);
++ unsigned long flags;
++
++ local_irq_save(flags);
++
++ if (!strcmp(buf, "400\n")) {
++ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_DR,
++ LIS302DL_CTRL1_DR);
++ lis->flags |= LIS302DL_F_DR;
++ } else {
++ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_DR,
++ 0);
++ lis->flags &= ~LIS302DL_F_DR;
++ }
++ local_irq_restore(flags);
++
++ return count;
++}
++
++static DEVICE_ATTR(sample_rate, S_IRUGO | S_IWUSR, show_rate, set_rate);
++
++static ssize_t show_scale(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ struct lis302dl_info *lis = dev_get_drvdata(dev);
++ u_int8_t ctrl1;
++ unsigned long flags;
++
++ local_irq_save(flags);
++ ctrl1 = __reg_read(lis, LIS302DL_REG_CTRL1);
++ local_irq_restore(flags);
++
++ return sprintf(buf, "%s\n", ctrl1 & LIS302DL_CTRL1_FS ? "9.2" : "2.3");
++}
++
++static ssize_t set_scale(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct lis302dl_info *lis = dev_get_drvdata(dev);
++ unsigned long flags;
++
++ local_irq_save(flags);
++
++ if (!strcmp(buf, "9.2\n")) {
++ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_FS,
++ LIS302DL_CTRL1_FS);
++ lis->flags |= LIS302DL_F_FS;
++ } else {
++ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_FS,
++ 0);
++ lis->flags &= ~LIS302DL_F_FS;
++ }
++
++ if (lis->flags & LIS302DL_F_INPUT_OPEN)
++ __enable_data_collection(lis);
++
++ local_irq_restore(flags);
++
++ return count;
++}
++
++static DEVICE_ATTR(full_scale, S_IRUGO | S_IWUSR, show_scale, set_scale);
++
++static ssize_t show_threshold(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ struct lis302dl_info *lis = dev_get_drvdata(dev);
++
++ /* Display the device view of the threshold setting */
++ return sprintf(buf, "%d\n", __threshold_to_mg(lis,
++ __mg_to_threshold(lis, lis->threshold)));
++}
++
++static ssize_t set_threshold(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct lis302dl_info *lis = dev_get_drvdata(dev);
++ unsigned int val;
++
++ if (sscanf(buf, "%u\n", &val) != 1)
++ return -EINVAL;
++ /* 8g is the maximum if FS is 1 */
++ if (val > 8000)
++ return -ERANGE;
++
++ /* Set the threshold and write it out if the device is used */
++ lis->threshold = val;
++
++ if (lis->flags & LIS302DL_F_INPUT_OPEN) {
++ unsigned long flags;
++
++ local_irq_save(flags);
++ __enable_data_collection(lis);
++ local_irq_restore(flags);
++ }
++
++ return count;
++}
++
++static DEVICE_ATTR(threshold, S_IRUGO | S_IWUSR, show_threshold, set_threshold);
++
++static ssize_t show_duration(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ struct lis302dl_info *lis = dev_get_drvdata(dev);
++
++ return sprintf(buf, "%d\n", __duration_to_ms(lis,
++ __ms_to_duration(lis, lis->duration)));
++}
++
++static ssize_t set_duration(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct lis302dl_info *lis = dev_get_drvdata(dev);
++ unsigned int val;
++
++ if (sscanf(buf, "%u\n", &val) != 1)
++ return -EINVAL;
++ if (val > 2550)
++ return -ERANGE;
++
++ lis->duration = val;
++ if (lis->flags & LIS302DL_F_INPUT_OPEN)
++ __reg_write(lis, LIS302DL_REG_FF_WU_DURATION_1,
++ __ms_to_duration(lis, lis->duration));
++
++ return count;
++}
++
++static DEVICE_ATTR(duration, S_IRUGO | S_IWUSR, show_duration, set_duration);
++
++static ssize_t lis302dl_dump(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ struct lis302dl_info *lis = dev_get_drvdata(dev);
++ int n = 0;
++ u8 reg[0x40];
++ char *end = buf;
++ unsigned long flags;
++
++ local_irq_save(flags);
++
++ for (n = 0; n < sizeof(reg); n++)
++ reg[n] = __reg_read(lis, n);
++
++ local_irq_restore(flags);
++
++ for (n = 0; n < sizeof(reg); n += 16) {
++ hex_dump_to_buffer(reg + n, 16, 16, 1, end, 128, 0);
++ end += strlen(end);
++ *end++ = '\n';
++ *end++ = '\0';
++ }
++
++ return end - buf;
++}
++static DEVICE_ATTR(dump, S_IRUGO, lis302dl_dump, NULL);
++
++/* Configure freefall/wakeup interrupts */
++static ssize_t set_wakeup_threshold(struct device *dev,
++ struct device_attribute *attr, const char *buf, size_t count)
++{
++ struct lis302dl_info *lis = dev_get_drvdata(dev);
++ unsigned int threshold;
++
++ if (sscanf(buf, "%u\n", &threshold) != 1)
++ return -EINVAL;
++
++ if (threshold > 8000)
++ return -ERANGE;
++
++ /* Zero turns the feature off */
++ if (threshold == 0) {
++ if (lis->flags & LIS302DL_F_IRQ_WAKE) {
++ disable_irq_wake(lis->pdata->interrupt);
++ lis->flags &= ~LIS302DL_F_IRQ_WAKE;
++ }
++
++ return count;
++ }
++
++ lis->wakeup.threshold = threshold;
++
++ if (!(lis->flags & LIS302DL_F_IRQ_WAKE)) {
++ enable_irq_wake(lis->pdata->interrupt);
++ lis->flags |= LIS302DL_F_IRQ_WAKE;
++ }
++
++ return count;
++}
++
++static ssize_t show_wakeup_threshold(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ struct lis302dl_info *lis = dev_get_drvdata(dev);
++
++ /* All events off? */
++ if (lis->wakeup.threshold == 0)
++ return sprintf(buf, "off\n");
++
++ return sprintf(buf, "%u\n", lis->wakeup.threshold);
++}
++
++static DEVICE_ATTR(wakeup_threshold, S_IRUGO | S_IWUSR, show_wakeup_threshold,
++ set_wakeup_threshold);
++
++static ssize_t set_wakeup_duration(struct device *dev,
++ struct device_attribute *attr, const char *buf, size_t count)
++{
++ struct lis302dl_info *lis = dev_get_drvdata(dev);
++ unsigned int duration;
++
++ if (sscanf(buf, "%u\n", &duration) != 1)
++ return -EINVAL;
++
++ if (duration > 2550)
++ return -ERANGE;
++
++ lis->wakeup.duration = duration;
++
++ return count;
++}
++
++static ssize_t show_wakeup_duration(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ struct lis302dl_info *lis = dev_get_drvdata(dev);
++
++ return sprintf(buf, "%u\n", lis->wakeup.duration);
++}
++
++static DEVICE_ATTR(wakeup_duration, S_IRUGO | S_IWUSR, show_wakeup_duration,
++ set_wakeup_duration);
++
++static struct attribute *lis302dl_sysfs_entries[] = {
++ &dev_attr_sample_rate.attr,
++ &dev_attr_full_scale.attr,
++ &dev_attr_threshold.attr,
++ &dev_attr_duration.attr,
++ &dev_attr_dump.attr,
++ &dev_attr_wakeup_threshold.attr,
++ &dev_attr_wakeup_duration.attr,
++ &dev_attr_overruns.attr,
++ NULL
++};
++
++static struct attribute_group lis302dl_attr_group = {
++ .name = NULL,
++ .attrs = lis302dl_sysfs_entries,
++};
++
++/* input device handling and driver core interaction */
++
++static int lis302dl_input_open(struct input_dev *inp)
++{
++ struct lis302dl_info *lis = input_get_drvdata(inp);
++ unsigned long flags;
++
++ local_irq_save(flags);
++
++ __enable_data_collection(lis);
++ lis->flags |= LIS302DL_F_INPUT_OPEN;
++
++ local_irq_restore(flags);
++
++ return 0;
++}
++
++static void lis302dl_input_close(struct input_dev *inp)
++{
++ struct lis302dl_info *lis = input_get_drvdata(inp);
++ u_int8_t ctrl1 = LIS302DL_CTRL1_Xen | LIS302DL_CTRL1_Yen |
++ LIS302DL_CTRL1_Zen;
++ unsigned long flags;
++
++ local_irq_save(flags);
++
++ /* since the input core already serializes access and makes sure we
++ * only see close() for the close of the last user, we can safely
++ * disable the data ready events */
++ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, ctrl1, 0x00);
++ lis->flags &= ~LIS302DL_F_INPUT_OPEN;
++
++ /* however, don't power down the whole device if still needed */
++ if (!(lis->flags & LIS302DL_F_WUP_FF ||
++ lis->flags & LIS302DL_F_WUP_CLICK)) {
++ __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_PD,
++ 0x00);
++ }
++ local_irq_restore(flags);
++}
++
++/* get the device to reload its coefficients from EEPROM and wait for it
++ * to complete
++ */
++
++static int __lis302dl_reset_device(struct lis302dl_info *lis)
++{
++ int timeout = 10;
++
++ __reg_write(lis, LIS302DL_REG_CTRL2,
++ LIS302DL_CTRL2_BOOT | LIS302DL_CTRL2_FDS);
++
++ while ((__reg_read(lis, LIS302DL_REG_CTRL2)
++ & LIS302DL_CTRL2_BOOT) && (timeout--))
++ mdelay(1);
++
++ return !!(timeout < 0);
++}
++
++static int __devinit lis302dl_probe(struct spi_device *spi)
++{
++ int rc;
++ struct lis302dl_info *lis;
++ u_int8_t wai;
++ unsigned long flags;
++ struct lis302dl_platform_data *pdata = spi->dev.platform_data;
++
++ spi->mode = SPI_MODE_3;
++ rc = spi_setup(spi);
++ if (rc < 0) {
++ dev_err(&spi->dev, "spi_setup failed\n");
++ return rc;
++ }
++
++ lis = kzalloc(sizeof(*lis), GFP_KERNEL);
++ if (!lis)
++ return -ENOMEM;
++
++ lis->dev = &spi->dev;
++ lis->spi = spi;
++
++ dev_set_drvdata(lis->dev, lis);
++
++ lis->pdata = pdata;
++
++ rc = sysfs_create_group(&lis->dev->kobj, &lis302dl_attr_group);
++ if (rc) {
++ dev_err(lis->dev, "error creating sysfs group\n");
++ goto bail_free_lis;
++ }
++
++ /* initialize input layer details */
++ lis->input_dev = input_allocate_device();
++ if (!lis->input_dev) {
++ dev_err(lis->dev, "Unable to allocate input device\n");
++ goto bail_sysfs;
++ }
++
++ input_set_drvdata(lis->input_dev, lis);
++ lis->input_dev->name = pdata->name;
++ /* SPI Bus not defined as a valid bus for input subsystem*/
++ lis->input_dev->id.bustype = BUS_I2C; /* lie about it */
++ lis->input_dev->open = lis302dl_input_open;
++ lis->input_dev->close = lis302dl_input_close;
++
++ rc = input_register_device(lis->input_dev);
++ if (rc) {
++ dev_err(lis->dev, "error %d registering input device\n", rc);
++ goto bail_inp_dev;
++ }
++
++ local_irq_save(flags);
++ /* Configure our IO */
++ (lis->pdata->lis302dl_suspend_io)(lis, 1);
++
++ wai = __reg_read(lis, LIS302DL_REG_WHO_AM_I);
++ if (wai != LIS302DL_WHO_AM_I_MAGIC) {
++ dev_err(lis->dev, "unknown who_am_i signature 0x%02x\n", wai);
++ dev_set_drvdata(lis->dev, NULL);
++ rc = -ENODEV;
++ local_irq_restore(flags);
++ goto bail_inp_reg;
++ }
++
++ set_bit(EV_ABS, lis->input_dev->evbit);
++ input_set_abs_params(lis->input_dev, ABS_X, 0, 0, 0, 0);
++ input_set_abs_params(lis->input_dev, ABS_Y, 0, 0, 0, 0);
++ input_set_abs_params(lis->input_dev, ABS_Z, 0, 0, 0, 0);
++
++
++ lis->threshold = 0;
++ lis->duration = 0;
++ memset(&lis->wakeup, 0, sizeof(lis->wakeup));
++
++ if (__lis302dl_reset_device(lis))
++ dev_err(lis->dev, "device BOOT reload failed\n");
++
++ /* force us powered */
++ __reg_write(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_PD |
++ LIS302DL_CTRL1_Xen |
++ LIS302DL_CTRL1_Yen |
++ LIS302DL_CTRL1_Zen);
++ mdelay(1);
++
++ __reg_write(lis, LIS302DL_REG_CTRL2, 0);
++ __reg_write(lis, LIS302DL_REG_CTRL3,
++ LIS302DL_CTRL3_PP_OD | LIS302DL_CTRL3_IHL);
++ __reg_write(lis, LIS302DL_REG_FF_WU_THS_1, 0x0);
++ __reg_write(lis, LIS302DL_REG_FF_WU_DURATION_1, 0x00);
++ __reg_write(lis, LIS302DL_REG_FF_WU_CFG_1, 0x0);
++
++ /* start off in powered down mode; we power up when someone opens us */
++ __reg_write(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_Xen |
++ LIS302DL_CTRL1_Yen | LIS302DL_CTRL1_Zen);
++
++ if (pdata->open_drain)
++ /* switch interrupt to open collector, active-low */
++ __reg_write(lis, LIS302DL_REG_CTRL3,
++ LIS302DL_CTRL3_PP_OD | LIS302DL_CTRL3_IHL);
++ else
++ /* push-pull, active-low */
++ __reg_write(lis, LIS302DL_REG_CTRL3, LIS302DL_CTRL3_IHL);
++
++ __lis302dl_int_mode(lis->dev, 1, LIS302DL_INTMODE_GND);
++ __lis302dl_int_mode(lis->dev, 2, LIS302DL_INTMODE_GND);
++
++ __reg_read(lis, LIS302DL_REG_STATUS);
++ __reg_read(lis, LIS302DL_REG_FF_WU_SRC_1);
++ __reg_read(lis, LIS302DL_REG_FF_WU_SRC_2);
++ __reg_read(lis, LIS302DL_REG_CLICK_SRC);
++ local_irq_restore(flags);
++
++ dev_info(lis->dev, "Found %s\n", pdata->name);
++
++ lis->pdata = pdata;
++
++ set_irq_handler(lis->pdata->interrupt, handle_level_irq);
++
++ rc = request_irq(lis->pdata->interrupt, lis302dl_interrupt,
++ IRQF_TRIGGER_LOW, "lis302dl", lis);
++
++ if (rc < 0) {
++ dev_err(lis->dev, "error requesting IRQ %d\n",
++ lis->pdata->interrupt);
++ goto bail_inp_reg;
++ }
++ return 0;
++
++bail_inp_reg:
++ input_unregister_device(lis->input_dev);
++bail_inp_dev:
++ input_free_device(lis->input_dev);
++bail_sysfs:
++ sysfs_remove_group(&lis->dev->kobj, &lis302dl_attr_group);
++bail_free_lis:
++ kfree(lis);
++ return rc;
++}
++
++static int __devexit lis302dl_remove(struct spi_device *spi)
++{
++ struct lis302dl_info *lis = dev_get_drvdata(&spi->dev);
++ unsigned long flags;
++
++ /* Disable interrupts */
++ if (lis->flags & LIS302DL_F_IRQ_WAKE)
++ disable_irq_wake(lis->pdata->interrupt);
++ free_irq(lis->pdata->interrupt, lis);
++
++ /* Reset and power down the device */
++ local_irq_save(flags);
++ __reg_write(lis, LIS302DL_REG_CTRL3, 0x00);
++ __reg_write(lis, LIS302DL_REG_CTRL2, 0x00);
++ __reg_write(lis, LIS302DL_REG_CTRL1, 0x00);
++ local_irq_restore(flags);
++
++ /* Cleanup resources */
++ sysfs_remove_group(&spi->dev.kobj, &lis302dl_attr_group);
++ input_unregister_device(lis->input_dev);
++ if (lis->input_dev)
++ input_free_device(lis->input_dev);
++ dev_set_drvdata(lis->dev, NULL);
++ kfree(lis);
++
++ return 0;
++}
++
++#ifdef CONFIG_PM
++
++static u8 regs_to_save[] = {
++ LIS302DL_REG_CTRL1,
++ LIS302DL_REG_CTRL2,
++ LIS302DL_REG_CTRL3,
++ LIS302DL_REG_FF_WU_CFG_1,
++ LIS302DL_REG_FF_WU_THS_1,
++ LIS302DL_REG_FF_WU_DURATION_1,
++ LIS302DL_REG_FF_WU_CFG_2,
++ LIS302DL_REG_FF_WU_THS_2,
++ LIS302DL_REG_FF_WU_DURATION_2,
++ LIS302DL_REG_CLICK_CFG,
++ LIS302DL_REG_CLICK_THSY_X,
++ LIS302DL_REG_CLICK_THSZ,
++ LIS302DL_REG_CLICK_TIME_LIMIT,
++ LIS302DL_REG_CLICK_LATENCY,
++ LIS302DL_REG_CLICK_WINDOW,
++
++};
++
++static int lis302dl_suspend(struct spi_device *spi, pm_message_t state)
++{
++ struct lis302dl_info *lis = dev_get_drvdata(&spi->dev);
++ unsigned long flags;
++ u_int8_t tmp;
++ int n;
++
++ /* determine if we want to wake up from the accel. */
++ if (lis->flags & LIS302DL_F_WUP_CLICK)
++ return 0;
++
++ disable_irq(lis->pdata->interrupt);
++ local_irq_save(flags);
++
++ /*
++ * When we share SPI over multiple sensors, there is a race here
++ * that one or more sensors will lose. In that case, the shared
++ * SPI bus GPIO will be in sleep mode and partially pulled down. So
++ * we explicitly put our IO into "wake" mode here before the final
++ * traffic to the sensor.
++ */
++ (lis->pdata->lis302dl_suspend_io)(lis, 1);
++
++ /* save registers */
++ for (n = 0; n < ARRAY_SIZE(regs_to_save); n++)
++ lis->regs[regs_to_save[n]] =
++ __reg_read(lis, regs_to_save[n]);
++
++ /* power down or enable wakeup */
++
++ if (lis->wakeup.threshold == 0) {
++ tmp = __reg_read(lis, LIS302DL_REG_CTRL1);
++ tmp &= ~LIS302DL_CTRL1_PD;
++ __reg_write(lis, LIS302DL_REG_CTRL1, tmp);
++ } else
++ __enable_wakeup(lis);
++
++ /* place our IO to the device in sleep-compatible states */
++ (lis->pdata->lis302dl_suspend_io)(lis, 0);
++
++ local_irq_restore(flags);
++
++ return 0;
++}
++
++static int lis302dl_resume(struct spi_device *spi)
++{
++ struct lis302dl_info *lis = dev_get_drvdata(&spi->dev);
++ unsigned long flags;
++ int n;
++
++ if (lis->flags & LIS302DL_F_WUP_CLICK)
++ return 0;
++
++ local_irq_save(flags);
++
++ /* get our IO to the device back in operational states */
++ (lis->pdata->lis302dl_suspend_io)(lis, 1);
++
++ /* resume from powerdown first! */
++ __reg_write(lis, LIS302DL_REG_CTRL1,
++ LIS302DL_CTRL1_PD |
++ LIS302DL_CTRL1_Xen |
++ LIS302DL_CTRL1_Yen |
++ LIS302DL_CTRL1_Zen);
++ mdelay(1);
++
++ if (__lis302dl_reset_device(lis))
++ dev_err(&spi->dev, "device BOOT reload failed\n");
++
++ lis->regs[LIS302DL_REG_CTRL1] |= LIS302DL_CTRL1_PD |
++ LIS302DL_CTRL1_Xen |
++ LIS302DL_CTRL1_Yen |
++ LIS302DL_CTRL1_Zen;
++
++ /* restore registers after resume */
++ for (n = 0; n < ARRAY_SIZE(regs_to_save); n++)
++ __reg_write(lis, regs_to_save[n], lis->regs[regs_to_save[n]]);
++
++ /* if someone had us open, reset the non-wake threshold stuff */
++ if (lis->flags & LIS302DL_F_INPUT_OPEN)
++ __enable_data_collection(lis);
++
++ local_irq_restore(flags);
++ enable_irq(lis->pdata->interrupt);
++
++ return 0;
++}
++#else
++#define lis302dl_suspend NULL
++#define lis302dl_resume NULL
++#endif
++
++static struct spi_driver lis302dl_spi_driver = {
++ .driver = {
++ .name = "lis302dl",
++ .owner = THIS_MODULE,
++ },
++
++ .probe = lis302dl_probe,
++ .remove = __devexit_p(lis302dl_remove),
++ .suspend = lis302dl_suspend,
++ .resume = lis302dl_resume,
++};
++
++static int __devinit lis302dl_init(void)
++{
++ return spi_register_driver(&lis302dl_spi_driver);
++}
++
++static void __exit lis302dl_exit(void)
++{
++ spi_unregister_driver(&lis302dl_spi_driver);
++}
++
++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
++MODULE_LICENSE("GPL");
++
++module_init(lis302dl_init);
++module_exit(lis302dl_exit);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/misc/Makefile linux-2.6.29-rc3.owrt.om/drivers/input/misc/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/input/misc/Makefile 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/input/misc/Makefile 2009-05-10 22:29:16.000000000 +0200
+@@ -21,5 +21,7 @@
+ obj-$(CONFIG_INPUT_UINPUT) += uinput.o
+ obj-$(CONFIG_INPUT_APANEL) += apanel.o
+ obj-$(CONFIG_INPUT_SGI_BTNS) += sgi_btns.o
++obj-$(CONFIG_INPUT_LIS302DL) += lis302dl.o
+ obj-$(CONFIG_INPUT_PCF50633_PMU) += pcf50633-input.o
++obj-$(CONFIG_INPUT_PCF50606_PMU) += pcf50606-input.o
+ obj-$(CONFIG_INPUT_GPIO_BUTTONS) += gpio_buttons.o
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/misc/pcf50606-input.c linux-2.6.29-rc3.owrt.om/drivers/input/misc/pcf50606-input.c
+--- linux-2.6.29-rc3.owrt/drivers/input/misc/pcf50606-input.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/input/misc/pcf50606-input.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,140 @@
++/* Philips PCF50606 Input Driver
++ *
++ * (C) 2006-2008 by Openmoko, Inc.
++ * Author: Balaji Rao <balajirrao@openmoko.org>
++ * All rights reserved.
++ *
++ * Broken down from monstrous PCF50606 driver mainly by
++ * Harald Welte, Matt Hsu, Andy Green and Werner Almesberger
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/device.h>
++#include <linux/platform_device.h>
++#include <linux/input.h>
++
++#include <linux/mfd/pcf50606/core.h>
++
++#define PCF50606_OOCS_ONKEY 0x01
++#define PCF50606_OOCS_EXTON 0x02
++
++#define PCF50606_OOCC2_ONKEYDB_NONE 0x00
++#define PCF50606_OOCC2_ONKEYDB_14ms 0x01
++#define PCF50606_OOCC2_ONKEYDB_62ms 0x02
++#define PCF50606_OOCC2_ONKEYDB_500ms 0x03
++#define PCF50606_OOCC2_EXTONDB_NONE 0x00
++#define PCF50606_OOCC2_EXTONDB_14ms 0x04
++#define PCF50606_OOCC2_EXTONDB_62ms 0x08
++#define PCF50606_OOCC2_EXTONDB_500ms 0x0c
++
++#define PCF50606_REG_OOCS 0x01
++
++struct pcf50606_input {
++ struct pcf50606 *pcf;
++ struct input_dev *input_dev;
++};
++
++static void
++pcf50606_input_irq(int irq, void *data)
++{
++ struct pcf50606_input *input;
++ int onkey_released;
++
++ input = data;
++ onkey_released = pcf50606_reg_read(input->pcf, PCF50606_REG_OOCS) &
++ PCF50606_OOCS_ONKEY;
++
++ if (irq == PCF50606_IRQ_ONKEYF && !onkey_released)
++ input_report_key(input->input_dev, KEY_POWER, 1);
++ else if (irq == PCF50606_IRQ_ONKEYR && onkey_released)
++ input_report_key(input->input_dev, KEY_POWER, 0);
++
++ input_sync(input->input_dev);
++}
++
++static int __devinit pcf50606_input_probe(struct platform_device *pdev)
++{
++ struct pcf50606_input *input;
++ struct pcf50606_subdev_pdata *pdata = pdev->dev.platform_data;
++ struct input_dev *input_dev;
++ int ret;
++
++
++ input = kzalloc(sizeof(*input), GFP_KERNEL);
++ if (!input)
++ return -ENOMEM;
++
++ input_dev = input_allocate_device();
++ if (!input_dev) {
++ kfree(input);
++ return -ENOMEM;
++ }
++
++ platform_set_drvdata(pdev, input);
++ input->pcf = pdata->pcf;
++ input->input_dev = input_dev;
++
++ input_dev->name = "PCF50606 PMU events";
++ input_dev->id.bustype = BUS_I2C;
++ input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_PWR);
++ set_bit(KEY_POWER, input_dev->keybit);
++
++ ret = input_register_device(input_dev);
++ if (ret) {
++ input_free_device(input_dev);
++ kfree(input);
++ return ret;
++ }
++ pcf50606_register_irq(pdata->pcf, PCF50606_IRQ_ONKEYR,
++ pcf50606_input_irq, input);
++ pcf50606_register_irq(pdata->pcf, PCF50606_IRQ_ONKEYF,
++ pcf50606_input_irq, input);
++
++ return 0;
++}
++
++static int __devexit pcf50606_input_remove(struct platform_device *pdev)
++{
++ struct pcf50606_input *input = platform_get_drvdata(pdev);
++
++ input_unregister_device(input->input_dev);
++ pcf50606_free_irq(input->pcf, PCF50606_IRQ_ONKEYR);
++ pcf50606_free_irq(input->pcf, PCF50606_IRQ_ONKEYF);
++
++ kfree(input);
++
++ return 0;
++}
++
++static struct platform_driver pcf50606_input_driver = {
++ .driver = {
++ .name = "pcf50606-input",
++ },
++ .probe = pcf50606_input_probe,
++ .remove = __devexit_p(pcf50606_input_remove),
++};
++
++static int __init pcf50606_input_init(void)
++{
++ return platform_driver_register(&pcf50606_input_driver);
++}
++module_init(pcf50606_input_init);
++
++static void __exit pcf50606_input_exit(void)
++{
++ platform_driver_unregister(&pcf50606_input_driver);
++}
++module_exit(pcf50606_input_exit);
++
++MODULE_AUTHOR("Balaji Rao <balajirrao@openmoko.org>");
++MODULE_DESCRIPTION("PCF50606 input driver");
++MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:pcf50606-input");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/mousedev.c linux-2.6.29-rc3.owrt.om/drivers/input/mousedev.c
+--- linux-2.6.29-rc3.owrt/drivers/input/mousedev.c 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/input/mousedev.c 2009-05-10 22:27:59.000000000 +0200
+@@ -1015,6 +1015,7 @@
+ .evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_REL) },
+ .relbit = { BIT_MASK(REL_WHEEL) },
+ }, /* A separate scrollwheel */
++#if 0
+ {
+ .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
+ INPUT_DEVICE_ID_MATCH_KEYBIT |
+@@ -1024,6 +1025,7 @@
+ .absbit = { BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) },
+ }, /* A tablet like device, at least touch detection,
+ two absolute axes */
++#endif
+ {
+ .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
+ INPUT_DEVICE_ID_MATCH_KEYBIT |
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/touchscreen/Kconfig linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/input/touchscreen/Kconfig 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/Kconfig 2009-05-10 22:27:59.000000000 +0200
+@@ -11,6 +11,54 @@
+
+ if INPUT_TOUCHSCREEN
+
++menuconfig TOUCHSCREEN_FILTER
++ boolean "Touchscreen Filtering"
++ depends on INPUT_TOUCHSCREEN
++ select TOUCHSCREEN_FILTER_GROUP
++ select TOUCHSCREEN_FILTER_MEDIAN
++ select TOUCHSCREEN_FILTER_MEAN
++ select TOUCHSCREEN_FILTER_LINEAR
++ help
++ Select this to include kernel touchscreen filter support. The filters
++ can be combined in any order in your machine init and the parameters
++ for them can also be set there.
++
++if TOUCHSCREEN_FILTER
++
++config TOUCHSCREEN_FILTER_GROUP
++ bool "Group Touchscreen Filter"
++ depends on INPUT_TOUCHSCREEN && TOUCHSCREEN_FILTER
++ default Y
++ help
++ Say Y here if you want to use the Group touchscreen filter, it
++ avoids using atypical samples.
++
++config TOUCHSCREEN_FILTER_MEDIAN
++ bool "Median Average Touchscreen Filter"
++ depends on INPUT_TOUCHSCREEN && TOUCHSCREEN_FILTER
++ default Y
++ help
++ Say Y here if you want to use the Median touchscreen filter, it's
++ highly effective if you data is noisy with occasional excursions.
++
++config TOUCHSCREEN_FILTER_MEAN
++ bool "Mean Average Touchscreen Filter"
++ depends on INPUT_TOUCHSCREEN && TOUCHSCREEN_FILTER
++ default Y
++ help
++ Say Y here if you want to use the Mean touchscreen filter, it
++ can further improve decent quality data by removing jitter
++
++config TOUCHSCREEN_FILTER_LINEAR
++ bool "Linear Touchscreen Filter"
++ depends on INPUT_TOUCHSCREEN && TOUCHSCREEN_FILTER
++ default Y
++ help
++ Say Y here if you want to use the Linear touchscreen filter, it
++ enables the use of calibration data for the touchscreen.
++
++endif
++
+ config TOUCHSCREEN_ADS7846
+ tristate "ADS7846/TSC2046 and ADS7843 based touchscreens"
+ depends on SPI_MASTER
+@@ -79,6 +127,24 @@
+ To compile this driver as a module, choose M here: the
+ module will be called fujitsu-ts.
+
++config TOUCHSCREEN_S3C2410
++ tristate "Samsung S3C2410 touchscreen input driver"
++ depends on ARCH_S3C2410 && INPUT && INPUT_TOUCHSCREEN
++ select SERIO
++ help
++ Say Y here if you have the s3c2410 touchscreen.
++
++ If unsure, say N.
++
++ To compile this driver as a module, choose M here: the
++ module will be called s3c2410_ts.
++
++config TOUCHSCREEN_S3C2410_DEBUG
++ boolean "Samsung S3C2410 touchscreen debug messages"
++ depends on TOUCHSCREEN_S3C2410
++ help
++ Select this if you want debug messages
++
+ config TOUCHSCREEN_GUNZE
+ tristate "Gunze AHL-51S touchscreen"
+ select SERIO
+@@ -408,4 +474,15 @@
+ To compile this driver as a module, choose M here: the
+ module will be called tsc2007.
+
++config TOUCHSCREEN_PCAP7200
++ tristate "EETI Projected capacitive touchscreen controller"
++ help
++ Say Y here if you have the EETI PCAP7200 touchscreen
++ controller chip in your system.
++
++ If unsure, say N.
++
++ To compile this driver as a module, choose M here: the
++ module will be called pcap7200.
+ endif
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/touchscreen/Makefile linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/input/touchscreen/Makefile 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/Makefile 2009-05-10 22:27:59.000000000 +0200
+@@ -34,3 +34,10 @@
+ wm97xx-ts-$(CONFIG_TOUCHSCREEN_WM9712) += wm9712.o
+ wm97xx-ts-$(CONFIG_TOUCHSCREEN_WM9713) += wm9713.o
+ obj-$(CONFIG_TOUCHSCREEN_WM97XX_MAINSTONE) += mainstone-wm97xx.o
++obj-$(CONFIG_TOUCHSCREEN_S3C2410) += s3c2410_ts.o
++obj-$(CONFIG_TOUCHSCREEN_FILTER) += ts_filter_chain.o
++obj-$(CONFIG_TOUCHSCREEN_FILTER_GROUP) += ts_filter_group.o
++obj-$(CONFIG_TOUCHSCREEN_FILTER_LINEAR) += ts_filter_linear.o
++obj-$(CONFIG_TOUCHSCREEN_FILTER_MEDIAN) += ts_filter_median.o
++obj-$(CONFIG_TOUCHSCREEN_FILTER_MEAN) += ts_filter_mean.o
++obj-$(CONFIG_TOUCHSCREEN_PCAP7200) += pcap7200_ts.o
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/touchscreen/pcap7200_ts.c linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/pcap7200_ts.c
+--- linux-2.6.29-rc3.owrt/drivers/input/touchscreen/pcap7200_ts.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/pcap7200_ts.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,309 @@
++ /* Projected capacitive touchscreen controller driver.
++ *
++ * Copyright(c) 2008 Openmoko Inc.
++ *
++ * Author: Matt Hsu <matt_hsu@openmoko.org>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * TODO
++ * - apply ts_filter
++ * - add support for gesture event
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/input.h>
++#include <linux/i2c.h>
++#include <linux/platform_device.h>
++#include <linux/interrupt.h>
++#include <linux/workqueue.h>
++#include <linux/input.h>
++#include <linux/device.h>
++
++#include <linux/pcap7200.h>
++#include <../drivers/input/touchscreen/ts_filter.h>
++
++#include <mach/om-3d7k.h>
++
++#define PCAP7200_OP_MODE_REG 0x07
++#define RPT_PKT_SIZE 5
++#define EVENT_UP 0x80
++#define EVENT_DOWN 0x81
++
++
++#define coord_interpret(msb_byte, lsb_byte) \
++ (msb_byte << 7 | lsb_byte)
++
++struct pcap7200_data{
++ struct i2c_client *client;
++ struct input_dev *dev;
++ struct ts_filter **tsf;
++ struct mutex lock;
++ int irq;
++ struct work_struct work;
++};
++
++static void pcap7200_work(struct work_struct *work)
++{
++ struct pcap7200_data *pcap =
++ container_of(work, struct pcap7200_data, work);
++ uint8_t rpt_pkt[RPT_PKT_SIZE], event;
++ int coords[2];
++ int ret;
++
++ mutex_lock(&pcap->lock);
++
++ memset(rpt_pkt, 0, sizeof(rpt_pkt));
++
++ BUG_ON(pcap == NULL);
++
++ ret = i2c_master_recv(pcap->client, rpt_pkt, RPT_PKT_SIZE);
++
++ event = rpt_pkt[0];
++
++ /*
++ * this is annonying. system would receive two consecutive interrupts if we set INT
++ * type as LOW_LEVEL. the data we pull from pcap7200 are invalid which are all
++ * zero in the second interrupt.
++ */
++ if (event != 0) {
++ dev_dbg(&pcap->client->dev, "[%2x][%2x][%2x][%2x][%2x]: %d bytes return \n",
++ rpt_pkt[0], rpt_pkt[1], rpt_pkt[2],
++ rpt_pkt[3], rpt_pkt[4], ret);
++
++ coords[0] = coord_interpret(rpt_pkt[1], rpt_pkt[2]);
++ coords[1] = coord_interpret(rpt_pkt[3], rpt_pkt[4]);
++
++ if (event == EVENT_DOWN) {
++ input_report_abs(pcap->dev, ABS_X, coords[0]);
++ input_report_abs(pcap->dev, ABS_Y, coords[1]);
++ input_report_key(pcap->dev, BTN_TOUCH, 1);
++ input_report_abs(pcap->dev, ABS_PRESSURE, 1);
++ } else if (event == EVENT_UP) {
++ input_report_key(pcap->dev, BTN_TOUCH, 0);
++ input_report_abs(pcap->dev, ABS_PRESSURE, 0);
++ } else {
++ /* FIMXE: gesture events should be reported here. */
++ }
++
++ input_sync(pcap->dev);
++ }
++
++ mutex_unlock(&pcap->lock);
++ enable_irq(pcap->irq);
++}
++
++static const char *op_mode_name[] = {
++ [SLEEP] = "sleep",
++ [WAKEUP] = "wakeup",
++ [SINGLE_TOUCH] = "single_touch",
++ [MULTI_TOUCH] = "multi_touch",
++};
++
++static struct i2c_driver pcap7200_driver;
++
++static int __set_op_mode(struct pcap7200_data *pcap, u_int8_t val)
++{
++ u8 buf[] = { PCAP7200_OP_MODE_REG, val};
++ int ret, i;
++
++ mutex_lock(&pcap->lock);
++
++ val = val & 0x03;
++
++ /* this chip has an issue.
++ * you need to give wakeup call for 3 times if it's
++ * in sleep mode.
++ */
++ if (val == WAKEUP) {
++ for (i = 0; i < 3; i++)
++ ret = i2c_master_send(pcap->client, buf, sizeof(buf));
++ } else
++ ret = i2c_master_send(pcap->client, buf, sizeof(buf));
++
++ mutex_unlock(&pcap->lock);
++ return ret;
++}
++
++static ssize_t set_op_mode(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pcap7200_data *pcap = i2c_get_clientdata(client);
++ u_int8_t i;
++
++ for (i = 0; i < ARRAY_SIZE(op_mode_name); i++) {
++ if (!strncmp(buf, op_mode_name[i], strlen(op_mode_name[i])))
++ __set_op_mode(pcap, i);
++ }
++
++ return count;
++}
++
++static DEVICE_ATTR(op_mode, S_IRUGO | S_IWUSR, NULL, set_op_mode);
++
++static irqreturn_t pcap7200_irq(int irq, void *_pcap)
++{
++ struct pcap7200_data *pcap = _pcap;
++
++ disable_irq(pcap->irq);
++ schedule_work(&pcap->work);
++
++ return IRQ_HANDLED;
++}
++
++static int
++pcap7200_probe(struct i2c_client *client, const struct i2c_device_id *ids)
++{
++ struct pcap7200_data *pcap;
++ struct input_dev *input_dev;
++ int err;
++ struct pcap7200_platform_data *pdata = client->dev.platform_data;
++
++ /* allocate pcap7200 data */
++ pcap = kzalloc(sizeof(struct pcap7200_data), GFP_KERNEL);
++ if (!pcap)
++ return -ENOMEM;
++
++ i2c_set_clientdata(client, pcap);
++ pcap->client = client;
++
++ mutex_init(&pcap->lock);
++
++ /* reset */
++ if (pdata->reset) {
++ pdata->reset();
++ dev_dbg(&client->dev, "hard reset\n");
++ }
++
++ /* operating mode */
++ __set_op_mode(pcap, pdata->mode);
++
++ /* initialize input device */
++ input_dev = input_allocate_device();
++ if (!input_dev) {
++ dev_err(&client->dev, "Unable to allocate the input device\n");
++ err = -ENOMEM;
++ goto exit_kfree;
++ }
++
++ pcap->dev = input_dev;
++ input_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) |
++ BIT_MASK(EV_ABS);
++ input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
++
++ /* configurable resolution 2048x2048 */
++ input_set_abs_params(pcap->dev, ABS_X, 0, 0x7FF, 0, 0);
++ input_set_abs_params(pcap->dev, ABS_Y, 0, 0x7FF, 0, 0);
++ input_set_abs_params(pcap->dev, ABS_PRESSURE, 0, 1, 0, 0);
++
++ input_dev->name = client->name;
++ input_dev->id.bustype = BUS_I2C;
++ input_dev->dev.parent = &client->dev;
++
++ err = input_register_device(input_dev);
++
++ if (err)
++ goto exit_unreg;
++
++ INIT_WORK(&pcap->work, pcap7200_work);
++
++ err = sysfs_create_file(&client->dev.kobj, &dev_attr_op_mode.attr);
++
++ if (err) {
++ dev_err(&client->dev, "Failed to create sysfs\n");
++ goto exit_unreg;
++ }
++
++ /* setup IRQ */
++ if (client->irq < 0) {
++ dev_err(&client->dev,
++ "No irq allocated in client resources!\n");
++ goto exit_rmsysfs;
++ }
++
++ pcap->irq = client->irq;
++ err = request_irq(pcap->irq, pcap7200_irq, IRQF_TRIGGER_LOW, "pcap7200", pcap);
++
++ if (err < 0)
++ goto exit_rmsysfs;
++
++ return 0;
++
++exit_rmsysfs:
++ sysfs_remove_file(&client->dev.kobj, &dev_attr_op_mode.attr);
++exit_unreg:
++ input_unregister_device(input_dev);
++exit_kfree:
++ kfree(pcap);
++ return err;
++}
++
++static int pcap7200_remove(struct i2c_client *client)
++{
++ struct pcap7200_data *pcap = i2c_get_clientdata(client);
++
++ free_irq(pcap->irq, pcap);
++ input_unregister_device(pcap->dev);
++ kfree(pcap);
++ return 0;
++}
++
++#ifdef CONFIG_PM
++static int pcap7200_suspend(struct device *dev, pm_message_t state)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pcap7200_data *pcap = i2c_get_clientdata(client);
++
++ __set_op_mode(pcap, SLEEP);
++ return 0;
++}
++
++static int pcap7200_resume(struct device *dev)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct pcap7200_data *pcap = i2c_get_clientdata(client);
++
++ __set_op_mode(pcap, WAKEUP);
++ return 0;
++}
++#else
++#define pcap7200_suspend NULL
++#define pcap7200_resume NULL
++#endif
++
++static struct i2c_device_id pcap7200_id_table[] = {
++ {"pcap7200", 0x0a},
++};
++
++static struct i2c_driver pcap7200_driver = {
++ .driver = {
++ .name = "pcap7200",
++ .suspend = pcap7200_suspend,
++ .resume = pcap7200_resume,
++ },
++ .id_table = pcap7200_id_table,
++ .probe = pcap7200_probe,
++ .remove = pcap7200_remove,
++};
++
++static int __init pcap7200_init(void)
++{
++ return i2c_add_driver(&pcap7200_driver);
++}
++
++static void pcap7200_exit(void)
++{
++ i2c_del_driver(&pcap7200_driver);
++}
++module_init(pcap7200_init);
++module_exit(pcap7200_exit);
++
++MODULE_AUTHOR("Matt Hsu <matt_hsu@openmoko.org>");
++MODULE_LICENSE("GPLv2");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/touchscreen/s3c2410_ts.c linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/s3c2410_ts.c
+--- linux-2.6.29-rc3.owrt/drivers/input/touchscreen/s3c2410_ts.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/s3c2410_ts.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,593 @@
++/*
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ *
++ * Copyright (c) 2004 Arnaud Patard <arnaud.patard@rtp-net.org>
++ * iPAQ H1940 touchscreen support
++ *
++ * ChangeLog
++ *
++ * 2004-09-05: Herbert Pötzl <herbert@13thfloor.at>
++ * - added clock (de-)allocation code
++ *
++ * 2005-03-06: Arnaud Patard <arnaud.patard@rtp-net.org>
++ * - h1940_ -> s3c2410 (this driver is now also used on the n30
++ * machines :P)
++ * - Debug messages are now enabled with the config option
++ * TOUCHSCREEN_S3C2410_DEBUG
++ * - Changed the way the value are read
++ * - Input subsystem should now work
++ * - Use ioremap and readl/writel
++ *
++ * 2005-03-23: Arnaud Patard <arnaud.patard@rtp-net.org>
++ * - Make use of some undocumented features of the touchscreen
++ * controller
++ *
++ * 2007-05-23: Harald Welte <laforge@openmoko.org>
++ * - Add proper support for S32440
++ *
++ * 2008-06-23: Andy Green <andy@openmoko.com>
++ * - removed averaging system
++ * - added generic Touchscreen filter stuff
++ *
++ * 2008-11-27: Nelson Castillo <arhuaco@freaks-unidos.net>
++ * - improve interrupt handling
++ */
++
++#include <linux/errno.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/slab.h>
++#include <linux/input.h>
++#include <linux/init.h>
++#include <linux/serio.h>
++#include <linux/timer.h>
++#include <linux/kfifo.h>
++#include <linux/delay.h>
++#include <linux/platform_device.h>
++#include <linux/clk.h>
++#include <asm/io.h>
++#include <asm/irq.h>
++
++#include <mach/regs-gpio.h>
++#include <mach/ts.h>
++#include <mach/hardware.h>
++#include <plat/regs-adc.h>
++
++#include "ts_filter_chain.h"
++
++/* For ts.dev.id.version */
++#define S3C2410TSVERSION 0x0101
++
++#define TSC_SLEEP (S3C2410_ADCTSC_PULL_UP_DISABLE | S3C2410_ADCTSC_XY_PST(0))
++
++#define WAIT4INT(x) (((x)<<8) | \
++ S3C2410_ADCTSC_YM_SEN | \
++ S3C2410_ADCTSC_YP_SEN | \
++ S3C2410_ADCTSC_XP_SEN | \
++ S3C2410_ADCTSC_XY_PST(3))
++
++#define AUTOPST (S3C2410_ADCTSC_YM_SEN | \
++ S3C2410_ADCTSC_YP_SEN | \
++ S3C2410_ADCTSC_XP_SEN | \
++ S3C2410_ADCTSC_AUTO_PST | \
++ S3C2410_ADCTSC_XY_PST(0))
++
++#define DEBUG_LVL KERN_DEBUG
++
++MODULE_AUTHOR("Arnaud Patard <arnaud.patard@rtp-net.org>");
++MODULE_DESCRIPTION("s3c2410 touchscreen driver");
++MODULE_LICENSE("GPL");
++
++/*
++ * Definitions & global arrays.
++ */
++
++static char *s3c2410ts_name = "s3c2410 TouchScreen";
++
++#define TS_RELEASE_TIMEOUT (HZ >> 7 ? HZ >> 7 : 1) /* 8ms (5ms if HZ is 200) */
++#define TS_EVENT_FIFO_SIZE (2 << 6) /* must be a power of 2 */
++
++#define TS_STATE_STANDBY 0 /* initial state */
++#define TS_STATE_PRESSED 1
++#define TS_STATE_RELEASE_PENDING 2
++#define TS_STATE_RELEASE 3
++
++/*
++ * Per-touchscreen data.
++ */
++
++struct s3c2410ts {
++ struct input_dev *dev;
++ struct ts_filter_chain *chain;
++ int is_down;
++ int state;
++ struct kfifo *event_fifo;
++};
++
++static struct s3c2410ts ts;
++
++static void __iomem *base_addr;
++
++/*
++ * A few low level functions.
++ */
++
++static inline void s3c2410_ts_connect(void)
++{
++ s3c2410_gpio_cfgpin(S3C2410_GPG12, S3C2410_GPG12_XMON);
++ s3c2410_gpio_cfgpin(S3C2410_GPG13, S3C2410_GPG13_nXPON);
++ s3c2410_gpio_cfgpin(S3C2410_GPG14, S3C2410_GPG14_YMON);
++ s3c2410_gpio_cfgpin(S3C2410_GPG15, S3C2410_GPG15_nYPON);
++}
++
++static void s3c2410_ts_start_adc_conversion(void)
++{
++ writel(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST,
++ base_addr + S3C2410_ADCTSC);
++ writel(readl(base_addr + S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START,
++ base_addr + S3C2410_ADCCON);
++}
++
++/*
++ * Just send the input events.
++ */
++
++enum ts_input_event {IE_DOWN = 0, IE_UP};
++
++static void ts_input_report(int event, int coords[])
++{
++#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
++ static char *s[] = {"down", "up"};
++ struct timeval tv;
++
++ do_gettimeofday(&tv);
++#endif
++
++ if (event == IE_DOWN) {
++ input_report_abs(ts.dev, ABS_X, coords[0]);
++ input_report_abs(ts.dev, ABS_Y, coords[1]);
++ input_report_key(ts.dev, BTN_TOUCH, 1);
++ input_report_abs(ts.dev, ABS_PRESSURE, 1);
++
++#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
++ printk(DEBUG_LVL "T:%06d %6s (X:%03d, Y:%03d)\n",
++ (int)tv.tv_usec, s[event], coords[0], coords[1]);
++#endif
++ } else {
++ input_report_key(ts.dev, BTN_TOUCH, 0);
++ input_report_abs(ts.dev, ABS_PRESSURE, 0);
++
++#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
++ printk(DEBUG_LVL "T:%06d %6s\n",
++ (int)tv.tv_usec, s[event]);
++#endif
++ }
++
++ input_sync(ts.dev);
++}
++
++/*
++ * Manage the state of the touchscreen.
++ */
++
++static void event_send_timer_f(unsigned long data);
++
++static struct timer_list event_send_timer =
++ TIMER_INITIALIZER(event_send_timer_f, 0, 0);
++
++static void event_send_timer_f(unsigned long data)
++{
++ static int noop_counter;
++ int event_type;
++
++ while (__kfifo_get(ts.event_fifo, (unsigned char *)&event_type,
++ sizeof(int))) {
++ int buf[2];
++
++ switch (event_type) {
++ case 'D':
++ if (ts.state == TS_STATE_RELEASE_PENDING)
++ /* Ignore short UP event */
++ ts.state = TS_STATE_PRESSED;
++ break;
++
++ case 'U':
++ ts.state = TS_STATE_RELEASE_PENDING;
++ break;
++
++ case 'P':
++ if (ts.is_down) /* stylus_action needs a conversion */
++ s3c2410_ts_start_adc_conversion();
++
++ if (unlikely(__kfifo_get(ts.event_fifo,
++ (unsigned char *)buf,
++ sizeof(int) * 2)
++ != sizeof(int) * 2))
++ goto ts_exit_error;
++
++ ts_input_report(IE_DOWN, buf);
++ ts.state = TS_STATE_PRESSED;
++ break;
++
++ default:
++ goto ts_exit_error;
++ }
++
++ noop_counter = 0;
++ }
++
++ if (noop_counter++ >= 1) {
++ noop_counter = 0;
++ if (ts.state == TS_STATE_RELEASE_PENDING) {
++ /*
++ * We delay the UP event for a while to avoid jitter.
++ * If we get a DOWN event we do not send it.
++ */
++ ts_input_report(IE_UP, NULL);
++ ts.state = TS_STATE_STANDBY;
++
++ ts_filter_chain_clear(ts.chain);
++ }
++ } else {
++ mod_timer(&event_send_timer, jiffies + TS_RELEASE_TIMEOUT);
++ }
++
++ return;
++
++ts_exit_error: /* should not happen unless we have a bug */
++ printk(KERN_ERR __FILE__ ": event_send_timer_f failed\n");
++}
++
++/*
++ * Manage interrupts.
++ */
++
++static irqreturn_t stylus_updown(int irq, void *dev_id)
++{
++ unsigned long data0;
++ unsigned long data1;
++ int event_type;
++
++ data0 = readl(base_addr+S3C2410_ADCDAT0);
++ data1 = readl(base_addr+S3C2410_ADCDAT1);
++
++ ts.is_down = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) &&
++ (!(data1 & S3C2410_ADCDAT0_UPDOWN));
++
++ event_type = ts.is_down ? 'D' : 'U';
++
++ if (unlikely(__kfifo_put(ts.event_fifo, (unsigned char *)&event_type,
++ sizeof(int)) != sizeof(int))) /* should not happen */
++ printk(KERN_ERR __FILE__": stylus_updown lost event!\n");
++
++ if (ts.is_down)
++ s3c2410_ts_start_adc_conversion();
++ else
++ writel(WAIT4INT(0), base_addr+S3C2410_ADCTSC);
++
++ mod_timer(&event_send_timer, jiffies + 1);
++
++ return IRQ_HANDLED;
++}
++
++static irqreturn_t stylus_action(int irq, void *dev_id)
++{
++ int buf[3];
++
++ /* Grab the ADC results. */
++ buf[1] = readl(base_addr + S3C2410_ADCDAT0) &
++ S3C2410_ADCDAT0_XPDATA_MASK;
++ buf[2] = readl(base_addr + S3C2410_ADCDAT1) &
++ S3C2410_ADCDAT1_YPDATA_MASK;
++
++ switch (ts_filter_chain_feed(ts.chain, &buf[1])) {
++ case 0:
++ /* The filter wants more points. */
++ s3c2410_ts_start_adc_conversion();
++ return IRQ_HANDLED;
++ case 1:
++ /* We have a point from the filters or no filtering enabled. */
++ buf[0] = 'P';
++ break;
++ default:
++ printk(KERN_ERR __FILE__
++ ":%d Invalid ts_filter_chain_feed return value.\n",
++ __LINE__);
++ case -1:
++ /* Error. Ignore the event. */
++ ts_filter_chain_clear(ts.chain);
++ writel(WAIT4INT(1), base_addr + S3C2410_ADCTSC);
++ return IRQ_HANDLED;
++ };
++
++ if (unlikely(__kfifo_put(ts.event_fifo, (unsigned char *)buf,
++ sizeof(int) * 3) != sizeof(int) * 3))
++ printk(KERN_ERR __FILE__":stylus_action bug.\n");
++
++ writel(WAIT4INT(1), base_addr + S3C2410_ADCTSC);
++ mod_timer(&event_send_timer, jiffies + 1);
++
++ return IRQ_HANDLED;
++}
++
++static struct clk *adc_clock;
++
++/*
++ * The functions for inserting/removing us as a module.
++ */
++
++static int __init s3c2410ts_probe(struct platform_device *pdev)
++{
++ int rc;
++ struct s3c2410_ts_mach_info *info;
++ struct input_dev *input_dev;
++ int ret = 0;
++
++ dev_info(&pdev->dev, "Starting\n");
++
++ info = (struct s3c2410_ts_mach_info *)pdev->dev.platform_data;
++
++ if (!info)
++ {
++ dev_err(&pdev->dev, "Hm... too bad: no platform data for ts\n");
++ return -EINVAL;
++ }
++
++#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
++ printk(DEBUG_LVL "Entering s3c2410ts_init\n");
++#endif
++
++ adc_clock = clk_get(NULL, "adc");
++ if (!adc_clock) {
++ dev_err(&pdev->dev, "failed to get adc clock source\n");
++ return -ENOENT;
++ }
++ clk_enable(adc_clock);
++
++#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
++ printk(DEBUG_LVL "got and enabled clock\n");
++#endif
++
++ base_addr = ioremap(S3C2410_PA_ADC,0x20);
++ if (base_addr == NULL) {
++ dev_err(&pdev->dev, "Failed to remap register block\n");
++ ret = -ENOMEM;
++ goto bail0;
++ }
++
++
++ /* If we acutally are a S3C2410: Configure GPIOs */
++ if (!strcmp(pdev->name, "s3c2410-ts"))
++ s3c2410_ts_connect();
++
++ if ((info->presc & 0xff) > 0)
++ writel(S3C2410_ADCCON_PRSCEN |
++ S3C2410_ADCCON_PRSCVL(info->presc&0xFF),
++ base_addr + S3C2410_ADCCON);
++ else
++ writel(0, base_addr+S3C2410_ADCCON);
++
++ /* Initialise registers */
++ if ((info->delay & 0xffff) > 0)
++ writel(info->delay & 0xffff, base_addr + S3C2410_ADCDLY);
++
++ writel(WAIT4INT(0), base_addr + S3C2410_ADCTSC);
++
++ /* Initialise input stuff */
++ memset(&ts, 0, sizeof(struct s3c2410ts));
++ input_dev = input_allocate_device();
++
++ if (!input_dev) {
++ dev_err(&pdev->dev, "Unable to allocate the input device\n");
++ ret = -ENOMEM;
++ goto bail1;
++ }
++
++ ts.dev = input_dev;
++ ts.dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) |
++ BIT_MASK(EV_ABS);
++ ts.dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
++ input_set_abs_params(ts.dev, ABS_X, 0, 0x3FF, 0, 0);
++ input_set_abs_params(ts.dev, ABS_Y, 0, 0x3FF, 0, 0);
++ input_set_abs_params(ts.dev, ABS_PRESSURE, 0, 1, 0, 0);
++
++ ts.dev->name = s3c2410ts_name;
++ ts.dev->id.bustype = BUS_RS232;
++ ts.dev->id.vendor = 0xDEAD;
++ ts.dev->id.product = 0xBEEF;
++ ts.dev->id.version = S3C2410TSVERSION;
++ ts.state = TS_STATE_STANDBY;
++ ts.event_fifo = kfifo_alloc(TS_EVENT_FIFO_SIZE, GFP_KERNEL, NULL);
++ if (IS_ERR(ts.event_fifo)) {
++ ret = -EIO;
++ goto bail2;
++ }
++
++ /* create the filter chain set up for the 2 coordinates we produce */
++ ts.chain = ts_filter_chain_create(pdev, info->filter_config, 2);
++
++ if (IS_ERR(ts.chain))
++ goto bail2;
++
++ ts_filter_chain_clear(ts.chain);
++
++ /* Get irqs */
++ if (request_irq(IRQ_ADC, stylus_action, IRQF_SAMPLE_RANDOM,
++ "s3c2410_action", ts.dev)) {
++ dev_err(&pdev->dev, "Could not allocate ts IRQ_ADC !\n");
++ iounmap(base_addr);
++ ret = -EIO;
++ goto bail3;
++ }
++ if (request_irq(IRQ_TC, stylus_updown, IRQF_SAMPLE_RANDOM,
++ "s3c2410_action", ts.dev)) {
++ dev_err(&pdev->dev, "Could not allocate ts IRQ_TC !\n");
++ free_irq(IRQ_ADC, ts.dev);
++ iounmap(base_addr);
++ ret = -EIO;
++ goto bail4;
++ }
++
++ dev_info(&pdev->dev, "Successfully loaded\n");
++
++ /* All went ok, so register to the input system */
++ rc = input_register_device(ts.dev);
++ if (rc) {
++ ret = -EIO;
++ goto bail5;
++ }
++
++ return 0;
++
++bail5:
++ free_irq(IRQ_TC, ts.dev);
++ free_irq(IRQ_ADC, ts.dev);
++ clk_disable(adc_clock);
++ iounmap(base_addr);
++ disable_irq(IRQ_TC);
++bail4:
++ disable_irq(IRQ_ADC);
++bail3:
++ ts_filter_chain_destroy(ts.chain);
++ kfifo_free(ts.event_fifo);
++bail2:
++ input_unregister_device(ts.dev);
++bail1:
++ iounmap(base_addr);
++bail0:
++
++ return ret;
++}
++
++static int s3c2410ts_remove(struct platform_device *pdev)
++{
++ disable_irq(IRQ_ADC);
++ disable_irq(IRQ_TC);
++ free_irq(IRQ_TC,ts.dev);
++ free_irq(IRQ_ADC,ts.dev);
++
++ if (adc_clock) {
++ clk_disable(adc_clock);
++ clk_put(adc_clock);
++ adc_clock = NULL;
++ }
++
++ input_unregister_device(ts.dev);
++ iounmap(base_addr);
++
++ ts_filter_chain_destroy(ts.chain);
++
++ kfifo_free(ts.event_fifo);
++
++ return 0;
++}
++
++#ifdef CONFIG_PM
++static int s3c2410ts_suspend(struct platform_device *pdev, pm_message_t state)
++{
++ writel(TSC_SLEEP, base_addr+S3C2410_ADCTSC);
++ writel(readl(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_STDBM,
++ base_addr+S3C2410_ADCCON);
++
++ disable_irq(IRQ_ADC);
++ disable_irq(IRQ_TC);
++
++ clk_disable(adc_clock);
++
++ return 0;
++}
++
++static int s3c2410ts_resume(struct platform_device *pdev)
++{
++ struct s3c2410_ts_mach_info *info =
++ ( struct s3c2410_ts_mach_info *)pdev->dev.platform_data;
++
++ clk_enable(adc_clock);
++ mdelay(1);
++
++ ts_filter_chain_clear(ts.chain);
++
++ enable_irq(IRQ_ADC);
++ enable_irq(IRQ_TC);
++
++ if ((info->presc&0xff) > 0)
++ writel(S3C2410_ADCCON_PRSCEN |
++ S3C2410_ADCCON_PRSCVL(info->presc&0xFF),
++ base_addr+S3C2410_ADCCON);
++ else
++ writel(0,base_addr+S3C2410_ADCCON);
++
++ /* Initialise registers */
++ if ((info->delay & 0xffff) > 0)
++ writel(info->delay & 0xffff, base_addr+S3C2410_ADCDLY);
++
++ writel(WAIT4INT(0), base_addr+S3C2410_ADCTSC);
++
++ return 0;
++}
++
++#else
++#define s3c2410ts_suspend NULL
++#define s3c2410ts_resume NULL
++#endif
++
++static struct platform_driver s3c2410ts_driver = {
++ .driver = {
++ .name = "s3c2410-ts",
++ .owner = THIS_MODULE,
++ },
++ .probe = s3c2410ts_probe,
++ .remove = s3c2410ts_remove,
++ .suspend = s3c2410ts_suspend,
++ .resume = s3c2410ts_resume,
++
++};
++
++static struct platform_driver s3c2440ts_driver = {
++ .driver = {
++ .name = "s3c2440-ts",
++ .owner = THIS_MODULE,
++ },
++ .probe = s3c2410ts_probe,
++ .remove = s3c2410ts_remove,
++ .suspend = s3c2410ts_suspend,
++ .resume = s3c2410ts_resume,
++
++};
++
++static int __init s3c2410ts_init(void)
++{
++ int rc;
++
++ rc = platform_driver_register(&s3c2410ts_driver);
++ if (rc < 0)
++ return rc;
++
++ rc = platform_driver_register(&s3c2440ts_driver);
++ if (rc < 0)
++ platform_driver_unregister(&s3c2410ts_driver);
++
++ return rc;
++}
++
++static void __exit s3c2410ts_exit(void)
++{
++ platform_driver_unregister(&s3c2440ts_driver);
++ platform_driver_unregister(&s3c2410ts_driver);
++}
++
++module_init(s3c2410ts_init);
++module_exit(s3c2410ts_exit);
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/touchscreen/ts_filter_chain.c linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/ts_filter_chain.c
+--- linux-2.6.29-rc3.owrt/drivers/input/touchscreen/ts_filter_chain.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/ts_filter_chain.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,183 @@
++/*
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ *
++ * Copyright (c) 2008,2009 Andy Green <andy@openmoko.com>
++ */
++
++#include <linux/kernel.h>
++#include <linux/device.h>
++
++#include "ts_filter_chain.h"
++#include "ts_filter.h"
++
++/*
++ * Tux, would you like the following function in /lib?
++ * It helps us avoid silly code.
++ */
++
++/**
++ * sptrlen - Count how many non-null pointers are in a pointer array
++ * @arr: The array of pointers
++ */
++static int sptrlen(const void *arr)
++{
++ /* All pointers have the same size. */
++ const int **p = (const int **)arr;
++ int len = 0;
++
++ while (*(p++))
++ len++;
++
++ return len;
++}
++
++
++struct ts_filter_chain {
++ /* All of the filters. */
++ struct ts_filter **arr;
++ /* Filters that can propagate values in the chain. */
++ struct ts_filter **pchain;
++ /* Length of the pchain array. */
++ int pchain_len;
++ /* FIXME: Add a spinlock and use it. */
++};
++
++struct ts_filter_chain *ts_filter_chain_create(
++ struct platform_device *pdev,
++ const struct ts_filter_chain_configuration conf[],
++ int count_coords)
++{
++ struct ts_filter_chain *c;
++ int count = 0;
++ int len;
++
++ BUG_ON((count_coords < 1));
++ BUG_ON(count_coords > MAX_TS_FILTER_COORDS);
++
++ c = kzalloc(sizeof(struct ts_filter_chain), GFP_KERNEL);
++ if (!c)
++ goto create_err_1;
++
++ len = (sptrlen(conf) + 1);
++ /* Memory for two null-terminated arrays of filters. */
++ c->arr = kzalloc(2 * sizeof(struct ts_filter *) * len, GFP_KERNEL);
++ if (!c->arr)
++ goto create_err_1;
++ c->pchain = c->arr + len;
++
++ while (conf->api) {
++ /* TODO: Can we get away with only sending pdev->dev? */
++ struct ts_filter *f =
++ (conf->api->create)(pdev, conf->config, count_coords);
++ if (!f) {
++ dev_info(&pdev->dev, "Filter %d creation failed\n",
++ count);
++ goto create_err_2;
++ }
++
++ f->api = conf->api;
++ c->arr[count++] = f;
++
++ if (f->api->haspoint && f->api->getpoint && f->api->process)
++ c->pchain[c->pchain_len++] = f;
++
++ conf++;
++ }
++
++ dev_info(&pdev->dev, "%d filter(s) initialized\n", count);
++
++ return c;
++
++create_err_2:
++ ts_filter_chain_destroy(c); /* Also frees c. */
++create_err_1:
++ dev_info(&pdev->dev, "Error in filter chain initialization\n");
++ /*
++ * FIXME: Individual filters have to return errors this way.
++ * We only have to forward the errors we find.
++ */
++ return ERR_PTR(-ENOMEM);
++}
++EXPORT_SYMBOL_GPL(ts_filter_chain_create);
++
++void ts_filter_chain_destroy(struct ts_filter_chain *c)
++{
++ if (c->arr) {
++ struct ts_filter **a = c->arr;
++ while (*a) {
++ ((*a)->api->destroy)(*a);
++ a++;
++ }
++ kfree(c->arr);
++ }
++ kfree(c);
++}
++EXPORT_SYMBOL_GPL(ts_filter_chain_destroy);
++
++void ts_filter_chain_clear(struct ts_filter_chain *c)
++{
++ struct ts_filter **a = c->arr;
++
++ while (*a) {
++ if ((*a)->api->clear)
++ ((*a)->api->clear)(*a);
++ a++;
++ }
++}
++EXPORT_SYMBOL_GPL(ts_filter_chain_clear);
++
++static void ts_filter_chain_scale(struct ts_filter_chain *c, int *coords)
++{
++ struct ts_filter **a = c->arr;
++ while (*a) {
++ if ((*a)->api->scale)
++ ((*a)->api->scale)(*a, coords);
++ a++;
++ }
++}
++
++int ts_filter_chain_feed(struct ts_filter_chain *c, int *coords)
++{
++ int len = c->pchain_len;
++ int i = len - 1;
++
++ if (!c->pchain[0])
++ return 1; /* Nothing to do. */
++
++ BUG_ON(c->pchain[0]->api->haspoint(c->pchain[0]));
++
++ if (c->pchain[0]->api->process(c->pchain[0], coords))
++ return -1;
++
++ while (i >= 0 && i < len) {
++ if (c->pchain[i]->api->haspoint(c->pchain[i])) {
++ c->pchain[i]->api->getpoint(c->pchain[i], coords);
++ if (++i < len &&
++ c->pchain[i]->api->process(c->pchain[i], coords))
++ return -1; /* Error. */
++ } else {
++ i--;
++ }
++ }
++
++ if (i >= 0) { /* Same as i == len. */
++ ts_filter_chain_scale(c, coords);
++ return 1;
++ }
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(ts_filter_chain_feed);
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/touchscreen/ts_filter_chain.h linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/ts_filter_chain.h
+--- linux-2.6.29-rc3.owrt/drivers/input/touchscreen/ts_filter_chain.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/ts_filter_chain.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,58 @@
++#ifndef __TS_FILTER_CHAIN_H__
++#define __TS_FILTER_CHAIN_H__
++
++/*
++ * Touchscreen filter chains.
++ *
++ * (c) 2008,2009 Andy Green <andy@openmoko.com>
++ */
++
++#include "ts_filter.h"
++
++#include <linux/err.h>
++
++struct ts_filter_chain_configuration {
++ /* API to use. */
++ const struct ts_filter_api *api;
++ /* Generic filter configuration. Different for each filter. */
++ const struct ts_filter_configuration *config;
++};
++
++struct ts_filter_chain;
++
++#ifdef CONFIG_TOUCHSCREEN_FILTER
++
++/*
++ * Create a filter chain. It will allocate an array of
++ * null-terminated pointers to filters. On error it will return
++ * an error you can check with IS_ERR.
++ */
++extern struct ts_filter_chain *ts_filter_chain_create(
++ struct platform_device *pdev,
++ const struct ts_filter_chain_configuration conf[],
++ int count_coords);
++
++/* Destroy the chain. */
++extern void ts_filter_chain_destroy(struct ts_filter_chain *c);
++
++/* Clear the filter chain. */
++extern void ts_filter_chain_clear(struct ts_filter_chain *c);
++
++/*
++ * Try to get one point. Returns 0 if no points are available.
++ * coords will be used as temporal space, thus you supply a point
++ * using coords but you shouldn't rely on its value on return unless
++ * it returns a nonzero value that is not -1.
++ * If one of the filters find an error then this function will
++ * return -1.
++ */
++int ts_filter_chain_feed(struct ts_filter_chain *c, int *coords);
++
++#else /* !CONFIG_TOUCHSCREEN_FILTER */
++#define ts_filter_chain_create(pdev, config, count_coords) (NULL)
++#define ts_filter_chain_destroy(c) do { } while (0)
++#define ts_filter_chain_clear(c) do { } while (0)
++#define ts_filter_chain_feed(c, coords) (1)
++#endif
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/touchscreen/ts_filter_group.c linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/ts_filter_group.c
+--- linux-2.6.29-rc3.owrt/drivers/input/touchscreen/ts_filter_group.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/ts_filter_group.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,296 @@
++/*
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ *
++ * Copyright (C) 2008,2009 by Openmoko, Inc.
++ * Author: Nelson Castillo <arhuaco@freaks-unidos.net>
++ * All rights reserved.
++ *
++ *
++ * This filter is useful to reject samples that are not reliable. We consider
++ * that a sample is not reliable if it deviates form the Majority.
++ *
++ * 1) We collect S samples.
++ *
++ * 2) For each dimension:
++ *
++ * - We sort the points.
++ * - Points that are "close enough" are considered to be in the same set.
++ * - We choose the set with more elements. If more than "threshold"
++ * points are in this set we use the first and the last point of the set
++ * to define the valid range for this dimension [min, max], otherwise we
++ * discard all the points and go to step 1.
++ *
++ * 3) We consider the unsorted S samples and try to feed them to the next
++ * filter in the chain. If one of the points of each sample
++ * is not in the allowed range for its dimension, we discard the sample.
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/slab.h>
++#include <linux/sort.h>
++#include "ts_filter_group.h"
++
++struct ts_filter_group {
++ /* Private filter configuration. */
++ struct ts_filter_group_configuration *config;
++ /* Filter API. */
++ struct ts_filter tsf;
++
++ int N; /* How many samples we have. */
++ int *samples[MAX_TS_FILTER_COORDS]; /* The samples: our input. */
++
++ int *group_size; /* Used for temporal computations. */
++ int *sorted_samples; /* Used for temporal computations. */
++
++ int range_max[MAX_TS_FILTER_COORDS]; /* Max. computed ranges. */
++ int range_min[MAX_TS_FILTER_COORDS]; /* Min. computed ranges. */
++
++ int tries_left; /* We finish if we don't get enough samples. */
++ int ready; /* If we are ready to deliver samples. */
++ int result; /* Index of the point being returned. */
++};
++
++#define ts_filter_to_filter_group(f) \
++ container_of(f, struct ts_filter_group, tsf)
++
++
++static void ts_filter_group_clear_internal(struct ts_filter_group *tsfg,
++ int attempts)
++{
++ tsfg->N = 0;
++ tsfg->tries_left = attempts;
++ tsfg->ready = 0;
++ tsfg->result = 0;
++}
++
++static void ts_filter_group_clear(struct ts_filter *tsf)
++{
++ struct ts_filter_group *tsfg = ts_filter_to_filter_group(tsf);
++
++ ts_filter_group_clear_internal(tsfg, tsfg->config->attempts);
++}
++
++static struct ts_filter *ts_filter_group_create(
++ struct platform_device *pdev,
++ const struct ts_filter_configuration *conf,
++ int count_coords)
++{
++ struct ts_filter_group *tsfg;
++ int i;
++
++ tsfg = kzalloc(sizeof(struct ts_filter_group), GFP_KERNEL);
++ if (!tsfg)
++ return NULL;
++
++ tsfg->config = container_of(conf,
++ struct ts_filter_group_configuration,
++ config);
++ tsfg->tsf.count_coords = count_coords;
++
++ BUG_ON(tsfg->config->attempts <= 0);
++
++ tsfg->samples[0] = kmalloc((2 + count_coords) * sizeof(int) *
++ tsfg->config->length, GFP_KERNEL);
++ if (!tsfg->samples[0]) {
++ kfree(tsfg);
++ return NULL;
++ }
++ for (i = 1; i < count_coords; ++i)
++ tsfg->samples[i] = tsfg->samples[0] + i * tsfg->config->length;
++ tsfg->sorted_samples = tsfg->samples[0] + count_coords *
++ tsfg->config->length;
++ tsfg->group_size = tsfg->samples[0] + (1 + count_coords) *
++ tsfg->config->length;
++
++ ts_filter_group_clear_internal(tsfg, tsfg->config->attempts);
++
++ dev_info(&pdev->dev, "Created Group filter len:%d coords:%d close:%d "
++ "thresh:%d\n", tsfg->config->length, count_coords,
++ tsfg->config->close_enough, tsfg->config->threshold);
++
++ return &tsfg->tsf;
++}
++
++static void ts_filter_group_destroy(struct ts_filter *tsf)
++{
++ struct ts_filter_group *tsfg = ts_filter_to_filter_group(tsf);
++
++ kfree(tsfg->samples[0]); /* first guy has pointer from kmalloc */
++ kfree(tsf);
++}
++
++static int int_cmp(const void *_a, const void *_b)
++{
++ const int *a = _a;
++ const int *b = _b;
++
++ if (*a > *b)
++ return 1;
++ if (*a < *b)
++ return -1;
++ return 0;
++}
++
++static void ts_filter_group_prepare_next(struct ts_filter *tsf);
++
++static int ts_filter_group_process(struct ts_filter *tsf, int *coords)
++{
++ struct ts_filter_group *tsfg = ts_filter_to_filter_group(tsf);
++ int n;
++ int i;
++
++ BUG_ON(tsfg->N >= tsfg->config->length);
++ BUG_ON(tsfg->ready);
++
++ for (n = 0; n < tsf->count_coords; n++)
++ tsfg->samples[n][tsfg->N] = coords[n];
++
++ if (++tsfg->N < tsfg->config->length)
++ return 0; /* We need more samples. */
++
++ for (n = 0; n < tsfg->tsf.count_coords; n++) {
++ int *v = tsfg->sorted_samples;
++ int ngroups = 0;
++ int best_size;
++ int best_idx = 0;
++ int idx = 0;
++
++ memcpy(v, tsfg->samples[n], tsfg->N * sizeof(int));
++ /*
++ * FIXME: Remove this sort call. We already have the
++ * algorithm for this modification. The filter will
++ * need less points (about half) if there is not a
++ * lot of noise. Right now we are doing a constant
++ * amount of work no matter how much noise we are
++ * dealing with.
++ */
++ sort(v, tsfg->N, sizeof(int), int_cmp, NULL);
++
++ tsfg->group_size[0] = 1;
++ for (i = 1; i < tsfg->N; ++i) {
++ if (v[i] - v[i - 1] <= tsfg->config->close_enough)
++ tsfg->group_size[ngroups]++;
++ else
++ tsfg->group_size[++ngroups] = 1;
++ }
++ ngroups++;
++
++ best_size = tsfg->group_size[0];
++ for (i = 1; i < ngroups; i++) {
++ idx += tsfg->group_size[i - 1];
++ if (best_size < tsfg->group_size[i]) {
++ best_size = tsfg->group_size[i];
++ best_idx = idx;
++ }
++ }
++
++ if (best_size < tsfg->config->threshold) {
++ /* This set is not good enough for us. */
++ if (--tsfg->tries_left) {
++ ts_filter_group_clear_internal
++ (tsfg, tsfg->tries_left);
++ /* No errors but we need more samples. */
++ return 0;
++ }
++ return 1; /* We give up: error. */
++ }
++
++ tsfg->range_min[n] = v[best_idx];
++ tsfg->range_max[n] = v[best_idx + best_size - 1];
++ }
++
++ ts_filter_group_prepare_next(tsf);
++
++ return 0;
++}
++
++/*
++ * This private function prepares a point that will be returned
++ * in ts_filter_group_getpoint if it is available. It updates
++ * the priv->ready state also.
++ */
++static void ts_filter_group_prepare_next(struct ts_filter *tsf)
++{
++ struct ts_filter_group *priv = ts_filter_to_filter_group(tsf);
++ int n;
++
++ while (priv->result < priv->N) {
++ for (n = 0; n < priv->tsf.count_coords; ++n) {
++ if (priv->samples[n][priv->result] <
++ priv->range_min[n] ||
++ priv->samples[n][priv->result] > priv->range_max[n])
++ break;
++ }
++
++ if (n == priv->tsf.count_coords) /* Sample is OK. */
++ break;
++
++ priv->result++;
++ }
++
++ if (unlikely(priv->result >= priv->N)) { /* No sample to deliver. */
++ ts_filter_group_clear_internal(priv, priv->config->attempts);
++ priv->ready = 0;
++ } else {
++ priv->ready = 1;
++ }
++}
++
++static int ts_filter_group_haspoint(struct ts_filter *tsf)
++{
++ struct ts_filter_group *priv = ts_filter_to_filter_group(tsf);
++
++ return priv->ready;
++}
++
++static void ts_filter_group_getpoint(struct ts_filter *tsf, int *point)
++{
++ struct ts_filter_group *priv = ts_filter_to_filter_group(tsf);
++ int n;
++
++ BUG_ON(!priv->ready);
++
++ for (n = 0; n < priv->tsf.count_coords; n++)
++ point[n] = priv->samples[n][priv->result];
++
++ priv->result++;
++
++ /* This call will update priv->ready. */
++ ts_filter_group_prepare_next(tsf);
++}
++
++/*
++ * Get ready to process the next batch of points, forget
++ * points we could have delivered.
++ */
++static void ts_filter_group_scale(struct ts_filter *tsf, int *coords)
++{
++ struct ts_filter_group *priv = ts_filter_to_filter_group(tsf);
++
++ ts_filter_group_clear_internal(priv, priv->config->attempts);
++}
++
++const struct ts_filter_api ts_filter_group_api = {
++ .create = ts_filter_group_create,
++ .destroy = ts_filter_group_destroy,
++ .clear = ts_filter_group_clear,
++ .process = ts_filter_group_process,
++ .haspoint = ts_filter_group_haspoint,
++ .getpoint = ts_filter_group_getpoint,
++ .scale = ts_filter_group_scale,
++};
++EXPORT_SYMBOL_GPL(ts_filter_group_api);
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/touchscreen/ts_filter_group.h linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/ts_filter_group.h
+--- linux-2.6.29-rc3.owrt/drivers/input/touchscreen/ts_filter_group.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/ts_filter_group.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,36 @@
++#ifndef __TS_FILTER_GROUP_H__
++#define __TS_FILTER_GROUP_H__
++
++#include "ts_filter.h"
++
++/*
++ * Touchscreen group filter.
++ *
++ * Copyright (C) 2008,2009 by Openmoko, Inc.
++ * Author: Nelson Castillo <arhuaco@freaks-unidos.net>
++ *
++ */
++
++struct ts_filter_group_configuration {
++ /* Size of the filter. */
++ int length;
++ /*
++ * If two points are separated by this distance or less they
++ * are considered to be members of the same group.
++ */
++ int close_enough;
++ /* Minimum allowed size for the biggest group in the sample set. */
++ int threshold;
++ /*
++ * Number of times we try to get a group of points with at least
++ * threshold points.
++ */
++ int attempts;
++
++ /* Generic filter configuration. */
++ struct ts_filter_configuration config;
++};
++
++extern const struct ts_filter_api ts_filter_group_api;
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/touchscreen/ts_filter.h linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/ts_filter.h
+--- linux-2.6.29-rc3.owrt/drivers/input/touchscreen/ts_filter.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/ts_filter.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,74 @@
++#ifndef __TS_FILTER_H__
++#define __TS_FILTER_H__
++
++/*
++ * Touchscreen filter.
++ *
++ * (c) 2008,2009 Andy Green <andy@openmoko.com>
++ */
++
++#include <linux/platform_device.h>
++
++#define MAX_TS_FILTER_COORDS 3 /* X, Y and Z (pressure). */
++
++struct ts_filter;
++struct ts_filter_configuration;
++
++/* Operations that a filter can perform. */
++
++struct ts_filter_api {
++ /* Create the filter - mandatory. */
++ struct ts_filter * (*create)(
++ struct platform_device *pdev,
++ const struct ts_filter_configuration *config,
++ int count_coords);
++ /* Destroy the filter - mandatory. */
++ void (*destroy)(struct ts_filter *filter);
++ /* Clear the filter - optional. */
++ void (*clear)(struct ts_filter *filter);
++
++
++ /*
++ * The next three API functions only make sense if all of them are
++ * set for a filter. If a filter has the next three methods then
++ * it can propagate coordinates in the chain.
++ */
++
++ /*
++ * Process the filter.
++ * It returns non-zero if the filter reaches an error.
++ */
++ int (*process)(struct ts_filter *filter, int *coords);
++ /*
++ * Is the filter ready to return a point?
++ * Please do not code side effects in this function.
++ */
++ int (*haspoint)(struct ts_filter *filter);
++ /*
++ * Get a point.
++ * Do not call unless the filter actually has a point to deliver.
++ */
++ void (*getpoint)(struct ts_filter *filter, int *coords);
++
++ /*
++ * Scale the points - optional.
++ * A filter could only scale coordinates.
++ */
++ void (*scale)(struct ts_filter *filter, int *coords);
++};
++
++/*
++ * Generic filter configuration. Actual configurations have this structure
++ * as a member.
++ */
++struct ts_filter_configuration {
++};
++
++struct ts_filter {
++ /* Operations for this filter. */
++ const struct ts_filter_api *api;
++ /* Number of coordinates to process. */
++ int count_coords;
++};
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/touchscreen/ts_filter_linear.c linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/ts_filter_linear.c
+--- linux-2.6.29-rc3.owrt/drivers/input/touchscreen/ts_filter_linear.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/ts_filter_linear.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,212 @@
++/*
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ *
++ * Copyright (C) 2008,2009 by Openmoko, Inc.
++ * Author: Nelson Castillo <arhuaco@freaks-unidos.net>
++ * All rights reserved.
++ *
++ * Linearly scale touchscreen values.
++ *
++ * Expose the TS_FILTER_LINEAR_NCONSTANTS for the linear transformation
++ * using sysfs.
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/slab.h>
++#include <linux/string.h>
++
++#include "ts_filter_linear.h"
++
++struct ts_filter_linear;
++
++/* Sysfs code. */
++
++struct const_obj {
++ /* The actual private object. */
++ struct ts_filter_linear *tsfl;
++ /* Our kobject. */
++ struct kobject kobj;
++};
++
++#define to_const_obj(x) container_of(x, struct const_obj, kobj)
++
++struct const_attribute {
++ struct attribute attr;
++ ssize_t (*show)(struct const_obj *const, struct const_attribute *attr,
++ char *buf);
++ ssize_t (*store)(struct const_obj *const, struct const_attribute *attr,
++ const char *buf, size_t count);
++};
++
++#define to_const_attr(x) container_of(x, struct const_attribute, attr)
++
++
++/* Private linear filter structure. */
++
++struct ts_filter_linear {
++ /* Private configuration for this filter. */
++ struct ts_filter_linear_configuration *config;
++
++ /* Generic filter API. */
++ struct ts_filter tsf;
++
++ /* Linear constants for the transformation. */
++ int constants[TS_FILTER_LINEAR_NCONSTANTS];
++
++ /* Sysfs. */
++
++ /* Our const_object. */
++ struct const_obj c_obj;
++ /* Our type. We will stick operations to it. */
++ struct kobj_type const_ktype;
++ /* Attrs. of the virtual files. */
++ struct const_attribute kattrs[TS_FILTER_LINEAR_NCONSTANTS];
++ /* Default Attrs. Always NULL for us. */
++ struct attribute *attrs[TS_FILTER_LINEAR_NCONSTANTS + 1];
++ /* Storage for the name of the virtual files. */
++ char attr_names[TS_FILTER_LINEAR_NCONSTANTS][2];
++};
++
++#define ts_filter_to_filter_linear(f) \
++ container_of(f, struct ts_filter_linear, tsf)
++
++/* Sysfs functions. */
++
++static ssize_t const_attr_show(struct kobject *kobj,
++ struct attribute *attr,
++ char *buf)
++{
++ struct const_attribute *a = to_const_attr(attr);
++
++ return a->show(to_const_obj(kobj), a, buf);
++}
++
++static ssize_t const_attr_store(struct kobject *kobj,
++ struct attribute *attr,
++ const char *buf, size_t len)
++{
++ struct const_attribute *a = to_const_attr(attr);
++
++ return a->store(to_const_obj(kobj), a, buf, len);
++}
++
++static struct sysfs_ops const_sysfs_ops = {
++ .show = const_attr_show,
++ .store = const_attr_store,
++};
++
++static void const_release(struct kobject *kobj)
++{
++ kfree(to_const_obj(kobj)->tsfl);
++}
++
++static ssize_t const_show(struct const_obj *obj, struct const_attribute *attr,
++ char *buf)
++{
++ int who;
++
++ sscanf(attr->attr.name, "%d", &who);
++ return sprintf(buf, "%d\n", obj->tsfl->constants[who]);
++}
++
++static ssize_t const_store(struct const_obj *obj, struct const_attribute *attr,
++ const char *buf, size_t count)
++{
++ int who;
++
++ sscanf(attr->attr.name, "%d", &who);
++ sscanf(buf, "%d", &obj->tsfl->constants[who]);
++ return count;
++}
++
++/* Filter functions. */
++
++static struct ts_filter *ts_filter_linear_create(
++ struct platform_device *pdev,
++ const struct ts_filter_configuration *conf,
++ int count_coords)
++{
++ struct ts_filter_linear *tsfl;
++ int i;
++ int ret;
++
++ tsfl = kzalloc(sizeof(struct ts_filter_linear), GFP_KERNEL);
++ if (!tsfl)
++ return NULL;
++
++ tsfl->config = container_of(conf,
++ struct ts_filter_linear_configuration,
++ config);
++
++ tsfl->tsf.count_coords = count_coords;
++
++ for (i = 0; i < TS_FILTER_LINEAR_NCONSTANTS; ++i) {
++ tsfl->constants[i] = tsfl->config->constants[i];
++
++ /* sysfs */
++ sprintf(tsfl->attr_names[i], "%d", i);
++ tsfl->kattrs[i].attr.name = tsfl->attr_names[i];
++ tsfl->kattrs[i].attr.mode = 0666;
++ tsfl->kattrs[i].show = const_show;
++ tsfl->kattrs[i].store = const_store;
++ tsfl->attrs[i] = &tsfl->kattrs[i].attr;
++ }
++ tsfl->attrs[i] = NULL;
++
++ tsfl->const_ktype.sysfs_ops = &const_sysfs_ops;
++ tsfl->const_ktype.release = const_release;
++ tsfl->const_ktype.default_attrs = tsfl->attrs;
++ tsfl->c_obj.tsfl = tsfl; /* kernel frees tsfl in const_release */
++
++ ret = kobject_init_and_add(&tsfl->c_obj.kobj, &tsfl->const_ktype,
++ &pdev->dev.kobj, "calibration");
++ if (ret) {
++ kobject_put(&tsfl->c_obj.kobj);
++ return NULL;
++ }
++
++ dev_info(&pdev->dev, "Created Linear filter coords:%d\n", count_coords);
++
++ return &tsfl->tsf;
++}
++
++static void ts_filter_linear_destroy(struct ts_filter *tsf)
++{
++ struct ts_filter_linear *tsfl = ts_filter_to_filter_linear(tsf);
++
++ /* Kernel frees tsfl in const_release. */
++ kobject_put(&tsfl->c_obj.kobj);
++}
++
++static void ts_filter_linear_scale(struct ts_filter *tsf, int *coords)
++{
++ struct ts_filter_linear *tsfl = ts_filter_to_filter_linear(tsf);
++
++ int *k = tsfl->constants;
++ int c0 = coords[tsfl->config->coord0];
++ int c1 = coords[tsfl->config->coord1];
++
++ coords[tsfl->config->coord0] = (k[2] + k[0] * c0 + k[1] * c1) / k[6];
++ coords[tsfl->config->coord1] = (k[5] + k[3] * c0 + k[4] * c1) / k[6];
++}
++
++const struct ts_filter_api ts_filter_linear_api = {
++ .create = ts_filter_linear_create,
++ .destroy = ts_filter_linear_destroy,
++ .scale = ts_filter_linear_scale,
++};
++EXPORT_SYMBOL_GPL(ts_filter_linear_api);
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/touchscreen/ts_filter_linear.h linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/ts_filter_linear.h
+--- linux-2.6.29-rc3.owrt/drivers/input/touchscreen/ts_filter_linear.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/ts_filter_linear.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,31 @@
++#ifndef __TS_FILTER_LINEAR_H__
++#define __TS_FILTER_LINEAR_H__
++
++#include "ts_filter.h"
++#include <linux/kobject.h>
++
++/*
++ * Touchscreen linear filter.
++ *
++ * Copyright (C) 2008,2009 by Openmoko, Inc.
++ * Author: Nelson Castillo <arhuaco@freaks-unidos.net>
++ *
++ */
++
++#define TS_FILTER_LINEAR_NCONSTANTS 7
++
++struct ts_filter_linear_configuration {
++ /* Calibration constants. */
++ int constants[TS_FILTER_LINEAR_NCONSTANTS];
++ /* First coordinate. */
++ int coord0;
++ /* Second coordinate. */
++ int coord1;
++
++ /* Generic filter configuration. */
++ struct ts_filter_configuration config;
++};
++
++extern const struct ts_filter_api ts_filter_linear_api;
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/touchscreen/ts_filter_mean.c linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/ts_filter_mean.c
+--- linux-2.6.29-rc3.owrt/drivers/input/touchscreen/ts_filter_mean.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/ts_filter_mean.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,174 @@
++/*
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ *
++ * Copyright (c) 2008,2009
++ * Andy Green <andy@openmoko.com>
++ * Nelson Castillo <arhuaco@freaks-unidos.net>
++ *
++ * Simple mean filter.
++ *
++ */
++
++#include <linux/errno.h>
++#include <linux/kernel.h>
++#include <linux/slab.h>
++
++#include "ts_filter_mean.h"
++
++struct ts_filter_mean {
++ /* Copy of the private filter configuration. */
++ struct ts_filter_mean_configuration *config;
++ /* Filter API. */
++ struct ts_filter tsf;
++
++ /* Index on a circular buffer. */
++ int curr;
++ /* Useful to tell if the circular buffer is full(read:ready). */
++ int count;
++ /* Sumation used to compute the mean. */
++ int sum[MAX_TS_FILTER_COORDS];
++ /* Keep point values and decrement them from the sum on time. */
++ int *fifo[MAX_TS_FILTER_COORDS];
++ /* Store the output of this filter. */
++ int ready;
++};
++
++#define ts_filter_to_filter_mean(f) container_of(f, struct ts_filter_mean, tsf)
++
++
++static void ts_filter_mean_clear(struct ts_filter *tsf);
++
++static struct ts_filter *ts_filter_mean_create(
++ struct platform_device *pdev,
++ const struct ts_filter_configuration *conf,
++ int count_coords)
++{
++ struct ts_filter_mean *priv;
++ int *v;
++ int n;
++
++ priv = kzalloc(sizeof(struct ts_filter_mean), GFP_KERNEL);
++ if (!priv)
++ return NULL;
++
++ priv->tsf.count_coords = count_coords;
++ priv->config = container_of(conf,
++ struct ts_filter_mean_configuration,
++ config);
++
++ BUG_ON(priv->config->length <= 0);
++
++ v = kmalloc(priv->config->length * sizeof(int) * count_coords,
++ GFP_KERNEL);
++ if (!v)
++ return NULL;
++
++ for (n = 0; n < count_coords; n++) {
++ priv->fifo[n] = v;
++ v += priv->config->length;
++ }
++
++ ts_filter_mean_clear(&priv->tsf);
++
++ dev_info(&pdev->dev, "Created Mean filter len:%d coords:%d\n",
++ priv->config->length, count_coords);
++
++ return &priv->tsf;
++}
++
++static void ts_filter_mean_destroy(struct ts_filter *tsf)
++{
++ struct ts_filter_mean *priv = ts_filter_to_filter_mean(tsf);
++
++ kfree(priv->fifo[0]); /* first guy has pointer from kmalloc */
++ kfree(tsf);
++}
++
++static void ts_filter_mean_clear(struct ts_filter *tsf)
++{
++ struct ts_filter_mean *priv = ts_filter_to_filter_mean(tsf);
++
++ priv->count = 0;
++ priv->curr = 0;
++ priv->ready = 0;
++ memset(priv->sum, 0, tsf->count_coords * sizeof(int));
++}
++
++static int ts_filter_mean_process(struct ts_filter *tsf, int *coords)
++{
++ struct ts_filter_mean *priv = ts_filter_to_filter_mean(tsf);
++ int n;
++
++ BUG_ON(priv->ready);
++
++ for (n = 0; n < tsf->count_coords; n++) {
++ priv->sum[n] += coords[n];
++ priv->fifo[n][priv->curr] = coords[n];
++ }
++
++ if (priv->count + 1 == priv->config->length)
++ priv->ready = 1;
++ else
++ priv->count++;
++
++ priv->curr = (priv->curr + 1) % priv->config->length;
++
++ return 0; /* No error. */
++}
++
++static int ts_filter_mean_haspoint(struct ts_filter *tsf)
++{
++ struct ts_filter_mean *priv = ts_filter_to_filter_mean(tsf);
++
++ return priv->ready;
++}
++
++static void ts_filter_mean_getpoint(struct ts_filter *tsf, int *point)
++{
++ struct ts_filter_mean *priv = ts_filter_to_filter_mean(tsf);
++ int n;
++
++ BUG_ON(!priv->ready);
++
++ for (n = 0; n < tsf->count_coords; n++) {
++ point[n] = priv->sum[n];
++ priv->sum[n] -= priv->fifo[n][priv->curr];
++ }
++
++ priv->ready = 0;
++}
++
++static void ts_filter_mean_scale(struct ts_filter *tsf, int *coords)
++{
++ int n;
++ struct ts_filter_mean *priv = ts_filter_to_filter_mean(tsf);
++
++ for (n = 0; n < tsf->count_coords; n++) {
++ coords[n] += priv->config->length >> 1; /* Rounding. */
++ coords[n] /= priv->config->length;
++ }
++}
++
++const struct ts_filter_api ts_filter_mean_api = {
++ .create = ts_filter_mean_create,
++ .destroy = ts_filter_mean_destroy,
++ .clear = ts_filter_mean_clear,
++ .process = ts_filter_mean_process,
++ .scale = ts_filter_mean_scale,
++ .haspoint = ts_filter_mean_haspoint,
++ .getpoint = ts_filter_mean_getpoint,
++};
++EXPORT_SYMBOL_GPL(ts_filter_mean_api);
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/touchscreen/ts_filter_mean.h linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/ts_filter_mean.h
+--- linux-2.6.29-rc3.owrt/drivers/input/touchscreen/ts_filter_mean.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/ts_filter_mean.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,28 @@
++#ifndef __TS_FILTER_MEAN_H__
++#define __TS_FILTER_MEAN_H__
++
++#include "ts_filter.h"
++
++/*
++ * Touchscreen filter.
++ *
++ * mean
++ *
++ * (c) 2008,2009
++ * Andy Green <andy@openmoko.com>
++ * Nelson Castillo <arhuaco@freaks-unidos.net>
++ */
++
++/* Configuration for this filter. */
++struct ts_filter_mean_configuration {
++ /* Number of points for the mean. */
++ int length;
++
++ /* Generic filter configuration. */
++ struct ts_filter_configuration config;
++};
++
++/* API functions for the mean filter */
++extern const struct ts_filter_api ts_filter_mean_api;
++
++#endif /* __TS_FILTER_MEAN_H__ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/touchscreen/ts_filter_median.c linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/ts_filter_median.c
+--- linux-2.6.29-rc3.owrt/drivers/input/touchscreen/ts_filter_median.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/ts_filter_median.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,261 @@
++/*
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ *
++ * Copyright (c) 2008 Andy Green <andy@openmoko.com>
++ *
++ *
++ * Median averaging stuff. We sort incoming raw samples into an array of
++ * MEDIAN_SIZE length, discarding the oldest sample each time once we are full.
++ * We then return the sum of the middle three samples for X and Y. It means
++ * the final result must be divided by (3 * scaling factor) to correct for
++ * avoiding the repeated /3.
++ *
++ * This strongly rejects brief excursions away from a central point that is
++ * sticky in time compared to the excursion duration.
++ *
++ * Thanks to Dale Schumacher (who wrote some example code) and Carl-Daniel
++ * Halifinger who pointed out this would be a good method.
++ */
++
++#include <linux/errno.h>
++#include <linux/kernel.h>
++#include <linux/slab.h>
++#include "ts_filter_median.h"
++
++struct ts_filter_median {
++ /* Private configuration. */
++ struct ts_filter_median_configuration *config;
++ /* Generic Filter API. */
++ struct ts_filter tsf;
++
++ /* Count raw samples we get. */
++ int samples_count;
++ /*
++ * Remember the last coordinates we got in order to know if
++ * we are moving slow or fast.
++ */
++ int last_issued[MAX_TS_FILTER_COORDS];
++ /* How many samples in the sort buffer are valid. */
++ int valid;
++ /* Samples taken for median in sorted form. */
++ int *sort[MAX_TS_FILTER_COORDS];
++ /* Samples taken for median. */
++ int *fifo[MAX_TS_FILTER_COORDS];
++ /* Where we are in the fifo sample memory. */
++ int pos;
++ /* Do we have a sample to deliver? */
++ int ready;
++};
++
++#define ts_filter_to_filter_median(f) \
++ container_of(f, struct ts_filter_median, tsf)
++
++
++static void ts_filter_median_insert(int *p, int sample, int count)
++{
++ int n;
++
++ /* Search through what we got so far to find where to put sample. */
++ for (n = 0; n < count; n++)
++ if (sample < p[n]) { /* We met somebody bigger than us? */
++ /* Starting from the end, push bigger guys down one. */
++ for (count--; count >= n; count--)
++ p[count + 1] = p[count];
++ p[n] = sample; /* Put us in place of first bigger. */
++ return;
++ }
++
++ p[count] = sample; /* Nobody was bigger than us, add us on the end. */
++}
++
++static void ts_filter_median_del(int *p, int value, int count)
++{
++ int index;
++
++ for (index = 0; index < count; index++)
++ if (p[index] == value) {
++ for (; index < count; index++)
++ p[index] = p[index + 1];
++ return;
++ }
++}
++
++
++static void ts_filter_median_clear(struct ts_filter *tsf)
++{
++ struct ts_filter_median *tsfm = ts_filter_to_filter_median(tsf);
++
++ tsfm->pos = 0;
++ tsfm->valid = 0;
++ tsfm->ready = 0;
++ memset(&tsfm->last_issued[0], 1, tsf->count_coords * sizeof(int));
++}
++
++static struct ts_filter *ts_filter_median_create(
++ struct platform_device *pdev,
++ const struct ts_filter_configuration *conf,
++ int count_coords)
++{
++ int *p;
++ int n;
++ struct ts_filter_median *tsfm = kzalloc(sizeof(struct ts_filter_median),
++ GFP_KERNEL);
++
++ if (!tsfm)
++ return NULL;
++
++ tsfm->config = container_of(conf,
++ struct ts_filter_median_configuration,
++ config);
++
++ tsfm->tsf.count_coords = count_coords;
++
++ tsfm->config->midpoint = (tsfm->config->extent >> 1) + 1;
++
++ p = kmalloc(2 * count_coords * sizeof(int) * (tsfm->config->extent + 1),
++ GFP_KERNEL);
++ if (!p) {
++ kfree(tsfm);
++ return NULL;
++ }
++
++ for (n = 0; n < count_coords; n++) {
++ tsfm->sort[n] = p;
++ p += tsfm->config->extent + 1;
++ tsfm->fifo[n] = p;
++ p += tsfm->config->extent + 1;
++ }
++
++ ts_filter_median_clear(&tsfm->tsf);
++
++ dev_info(&pdev->dev,
++ "Created Median filter len:%d coords:%d dec_threshold:%d\n",
++ tsfm->config->extent, count_coords,
++ tsfm->config->decimation_threshold);
++
++ return &tsfm->tsf;
++}
++
++static void ts_filter_median_destroy(struct ts_filter *tsf)
++{
++ struct ts_filter_median *tsfm = ts_filter_to_filter_median(tsf);
++
++ kfree(tsfm->sort[0]); /* First guy has pointer from kmalloc. */
++ kfree(tsf);
++}
++
++static void ts_filter_median_scale(struct ts_filter *tsf, int *coords)
++{
++ int n;
++
++ for (n = 0; n < tsf->count_coords; n++)
++ coords[n] = (coords[n] + 2) / 3;
++}
++
++/*
++ * Give us the raw sample data coords, and if we return 1 then you can
++ * get a filtered coordinate from coords. If we return 0 you didn't
++ * fill all the filters with samples yet.
++ */
++
++static int ts_filter_median_process(struct ts_filter *tsf, int *coords)
++{
++ struct ts_filter_median *tsfm = ts_filter_to_filter_median(tsf);
++ int n;
++ int movement = 1;
++
++ for (n = 0; n < tsf->count_coords; n++) {
++ /* Grab copy in insertion order to remove when oldest. */
++ tsfm->fifo[n][tsfm->pos] = coords[n];
++ /* Insert these samples in sorted order in the median arrays. */
++ ts_filter_median_insert(tsfm->sort[n], coords[n], tsfm->valid);
++ }
++ /* Move us on in the fifo. */
++ if (++tsfm->pos == (tsfm->config->extent + 1))
++ tsfm->pos = 0;
++
++ /* Have we finished a median sampling? */
++ if (++tsfm->valid < tsfm->config->extent)
++ goto process_exit; /* No valid sample to use. */
++
++ BUG_ON(tsfm->valid != tsfm->config->extent);
++
++ tsfm->valid--;
++
++ /*
++ * Sum the middle 3 in the median sorted arrays. We don't divide back
++ * down which increases the sum resolution by a factor of 3 until the
++ * scale API function is called.
++ */
++ for (n = 0; n < tsf->count_coords; n++)
++ /* Perform the deletion of the oldest sample. */
++ ts_filter_median_del(tsfm->sort[n], tsfm->fifo[n][tsfm->pos],
++ tsfm->valid);
++
++ tsfm->samples_count--;
++ if (tsfm->samples_count >= 0)
++ goto process_exit;
++
++ for (n = 0; n < tsf->count_coords; n++) {
++ /* Give the coordinate result from summing median 3. */
++ coords[n] = tsfm->sort[n][tsfm->config->midpoint - 1] +
++ tsfm->sort[n][tsfm->config->midpoint] +
++ tsfm->sort[n][tsfm->config->midpoint + 1];
++
++ movement += abs(tsfm->last_issued[n] - coords[n]);
++ }
++
++ if (movement > tsfm->config->decimation_threshold) /* Moving fast. */
++ tsfm->samples_count = tsfm->config->decimation_above;
++ else
++ tsfm->samples_count = tsfm->config->decimation_below;
++
++ memcpy(&tsfm->last_issued[0], coords, tsf->count_coords * sizeof(int));
++
++ tsfm->ready = 1;
++
++process_exit:
++ return 0;
++}
++
++static int ts_filter_median_haspoint(struct ts_filter *tsf)
++{
++ struct ts_filter_median *priv = ts_filter_to_filter_median(tsf);
++
++ return priv->ready;
++}
++
++static void ts_filter_median_getpoint(struct ts_filter *tsf, int *point)
++{
++ struct ts_filter_median *priv = ts_filter_to_filter_median(tsf);
++
++ BUG_ON(!priv->ready);
++
++ memcpy(point, &priv->last_issued[0], tsf->count_coords * sizeof(int));
++
++ priv->ready = 0;
++}
++
++const struct ts_filter_api ts_filter_median_api = {
++ .create = ts_filter_median_create,
++ .destroy = ts_filter_median_destroy,
++ .clear = ts_filter_median_clear,
++ .process = ts_filter_median_process,
++ .scale = ts_filter_median_scale,
++ .haspoint = ts_filter_median_haspoint,
++ .getpoint = ts_filter_median_getpoint,
++};
++EXPORT_SYMBOL_GPL(ts_filter_median_api);
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/input/touchscreen/ts_filter_median.h linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/ts_filter_median.h
+--- linux-2.6.29-rc3.owrt/drivers/input/touchscreen/ts_filter_median.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/input/touchscreen/ts_filter_median.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,32 @@
++#ifndef __TS_FILTER_MEDIAN_H__
++#define __TS_FILTER_MEDIAN_H__
++
++#include "ts_filter.h"
++
++/*
++ * Touchscreen filter.
++ *
++ * median
++ *
++ * (c) 2008 Andy Green <andy@openmoko.com>
++ */
++
++struct ts_filter_median_configuration {
++ /* Size of the filter. */
++ int extent;
++ /* Precomputed midpoint. */
++ int midpoint;
++ /* A reference value for us to check if we are going fast or slow. */
++ int decimation_threshold;
++ /* How many points to replace if we're going fast. */
++ int decimation_above;
++ /* How many points to replace if we're going slow. */
++ int decimation_below;
++
++ /* Generic configuration. */
++ struct ts_filter_configuration config;
++};
++
++extern const struct ts_filter_api ts_filter_median_api;
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/Kconfig linux-2.6.29-rc3.owrt.om/drivers/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/Kconfig 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/Kconfig 2009-05-10 22:27:59.000000000 +0200
+@@ -109,4 +109,5 @@
+ source "drivers/staging/Kconfig"
+
+ source "drivers/platform/Kconfig"
++
+ endmenu
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/leds/Kconfig linux-2.6.29-rc3.owrt.om/drivers/leds/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/leds/Kconfig 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/leds/Kconfig 2009-05-10 22:27:59.000000000 +0200
+@@ -33,7 +33,7 @@
+
+ config LEDS_S3C24XX
+ tristate "LED Support for Samsung S3C24XX GPIO LEDs"
+- depends on LEDS_CLASS && ARCH_S3C2410
++ depends on LEDS_CLASS && ARCH_S3C2410 && S3C2410_PWM
+ help
+ This option enables support for LEDs connected to GPIO lines
+ on Samsung S3C24XX series CPUs, such as the S3C2410 and S3C2440.
+@@ -171,6 +171,25 @@
+ This option enables support for on-chip LED drivers found
+ on Dialog Semiconductor DA9030/DA9034 PMICs.
+
++config LEDS_NEO1973_VIBRATOR
++ tristate "Vibrator Support for the FIC Neo1973 GSM phone"
++ depends on LEDS_CLASS && MACH_NEO1973
++ help
++ This option enables support for the vibrator on the FIC Neo1973.
++
++config LEDS_NEO1973_GTA02
++ tristate "LED Support for the FIC Neo1973 (GTA02)"
++ depends on LEDS_CLASS && MACH_NEO1973_GTA02
++ help
++ This option enables support for the LEDs on the FIC Neo1973.
++
++config LEDS_LP5521
++ tristate "LED Support for LP5521 LED I2C chip"
++ depends on LEDS_CLASS && I2C
++ help
++ If you say yes here you get support for the National Semiconductor
++ LP5521 LED driver.
++
+ comment "LED Triggers"
+
+ config LEDS_TRIGGERS
+@@ -234,4 +253,11 @@
+ This allows LEDs to be controlled by network device activity.
+ If unsure, say Y.
+
++config LEDS_TRIGGER_NETDEV
++ tristate "LED Network Device Trigger"
++ depends on LEDS_TRIGGERS
++ help
++ This allows LEDs to be controlled by Network Device activity.
++ If unsure, say Y.
++
+ endif # NEW_LEDS
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/leds/led-class.c linux-2.6.29-rc3.owrt.om/drivers/leds/led-class.c
+--- linux-2.6.29-rc3.owrt/drivers/leds/led-class.c 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/leds/led-class.c 2009-05-10 22:27:59.000000000 +0200
+@@ -56,8 +56,10 @@
+ if (count == size) {
+ ret = count;
+
++#if 0 /* This is really bad. Don't do it!!!! */
+ if (state == LED_OFF)
+ led_trigger_remove(led_cdev);
++#endif
+ led_set_brightness(led_cdev, state);
+ }
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/leds/leds-lp5521.c linux-2.6.29-rc3.owrt.om/drivers/leds/leds-lp5521.c
+--- linux-2.6.29-rc3.owrt/drivers/leds/leds-lp5521.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/leds/leds-lp5521.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,386 @@
++/* NS LP5521 Programmable LED driver.
++ *
++ * (C) 2009 by Openmoko, Inc.
++ * Author: Matt Hsu <matt_hsu@openmoko.org>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ */
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/i2c.h>
++#include <linux/mutex.h>
++#include <linux/device.h>
++#include <linux/sysfs.h>
++#include <linux/interrupt.h>
++#include <linux/irq.h>
++
++#include <linux/lp5521.h>
++
++#define LP5521_DRIVER_NAME "lp5521"
++
++static int __lp5521_reg_write(struct lp5521 *lp, u8 reg, u8 value)
++{
++ return i2c_smbus_write_byte_data(lp->client, reg, value);
++}
++
++static int reg_write(struct lp5521 *lp, u_int8_t reg, u_int8_t val)
++{
++ int ret;
++
++ mutex_lock(&lp->lock);
++ ret = __lp5521_reg_write(lp, reg, val);
++ mutex_unlock(&lp->lock);
++
++ return ret;
++}
++
++static int __lp5521_reg_read(struct lp5521 *lp, u8 reg)
++{
++ int32_t ret;
++
++ ret = i2c_smbus_read_byte_data(lp->client, reg);
++
++ return ret;
++}
++
++static u_int8_t reg_read(struct lp5521 *lp, u_int8_t reg)
++{
++ int32_t ret;
++
++ mutex_lock(&lp->lock);
++ ret = __lp5521_reg_read(lp, reg);
++ mutex_unlock(&lp->lock);
++
++ return ret & 0xff;
++}
++
++static int reg_set_bit_mask(struct lp5521 *lp,
++ u_int8_t reg, u_int8_t mask, u_int8_t val)
++{
++ int ret;
++ u_int8_t tmp;
++
++ val &= mask;
++
++ mutex_lock(&lp->lock);
++
++ tmp = __lp5521_reg_read(lp, reg);
++ tmp &= ~mask;
++ tmp |= val;
++ ret = __lp5521_reg_write(lp, reg, tmp);
++
++ mutex_unlock(&lp->lock);
++
++ return ret;
++}
++
++static const char *lp5521_ch_name[] = {
++ "blue", "green", "red",
++};
++
++static inline int channel_id_by_name(const char *name)
++{
++ int channel_id = -1;
++
++ if (!strncmp(name, lp5521_ch_name[LP5521_BLUE],
++ strlen(lp5521_ch_name[LP5521_BLUE])))
++ channel_id = LP5521_BLUE;
++ else if (!strncmp(name, lp5521_ch_name[LP5521_GREEN],
++ strlen(lp5521_ch_name[LP5521_GREEN])))
++ channel_id = LP5521_GREEN;
++ else if (!strncmp(name, lp5521_ch_name[LP5521_RED],
++ strlen(lp5521_ch_name[LP5521_RED])))
++ channel_id = LP5521_RED;
++
++ return channel_id;
++}
++
++static const char *lp5521_ch_mode[] = {
++ "disable", "load", "run",
++ "direct",
++};
++
++/*
++ * Individual mode control
++ */
++static ssize_t show_mode(struct device *dev, struct device_attribute
++ *attr, char *buf)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct lp5521 *lp = i2c_get_clientdata(client);
++ int id;
++ uint8_t val;
++
++ id = channel_id_by_name(attr->attr.name);
++ val = reg_read(lp, LP5521_REG_OP_MODE);
++
++ val = val >> (id * 2);
++ val &= 0x3;
++
++ return sprintf(buf, "%s\n", lp5521_ch_mode[val]);
++}
++
++static ssize_t set_mode(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct lp5521 *lp = i2c_get_clientdata(client);
++ int id;
++ uint8_t mask, i;
++
++ id = channel_id_by_name(attr->attr.name);
++
++ mask = (0x3 << (id * 2));
++
++ for (i = LP5521_MODE_DISABLE; i <= LP5521_MODE_DIRECT; i++) {
++ if (!strncmp(buf, lp5521_ch_mode[i], strlen(lp5521_ch_mode[i]))) {
++ reg_set_bit_mask(lp,
++ LP5521_REG_OP_MODE, mask, (i << (id * 2)));
++ }
++ }
++
++ return count;
++}
++
++static DEVICE_ATTR(red_mode, S_IRUGO | S_IWUSR, show_mode, set_mode);
++static DEVICE_ATTR(green_mode, S_IRUGO | S_IWUSR, show_mode, set_mode);
++static DEVICE_ATTR(blue_mode, S_IRUGO | S_IWUSR, show_mode, set_mode);
++
++/*
++ * Individual pwm control
++ */
++static ssize_t show_pwm(struct device *dev, struct device_attribute
++ *attr, char *buf)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct lp5521 *lp = i2c_get_clientdata(client);
++ int id;
++ uint8_t val;
++
++ id = channel_id_by_name(attr->attr.name);
++ val = reg_read(lp, LP5521_REG_B_PWM-id);
++
++ return sprintf(buf, "%d\n", val);
++}
++
++static ssize_t set_pwm(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ int id;
++ struct i2c_client *client = to_i2c_client(dev);
++ struct lp5521 *lp = i2c_get_clientdata(client);
++ unsigned int pwm = simple_strtoul(buf, NULL, 10);
++
++ id = channel_id_by_name(attr->attr.name);
++ reg_write(lp, LP5521_REG_B_PWM-id, pwm);
++
++ return count;
++}
++
++static DEVICE_ATTR(red_pwm, S_IRUGO | S_IWUSR, show_pwm, set_pwm);
++static DEVICE_ATTR(green_pwm, S_IRUGO | S_IWUSR, show_pwm, set_pwm);
++static DEVICE_ATTR(blue_pwm, S_IRUGO | S_IWUSR, show_pwm, set_pwm);
++
++/*
++ * Individual current control
++ */
++static ssize_t show_cur(struct device *dev, struct device_attribute
++ *attr, char *buf)
++{
++ struct i2c_client *client = to_i2c_client(dev);
++ struct lp5521 *lp = i2c_get_clientdata(client);
++ int id;
++ uint8_t val;
++
++ id = channel_id_by_name(attr->attr.name);
++ val = reg_read(lp, LP5521_REG_B_CUR-id);
++
++ return sprintf(buf, "%d (100uA)\n", val);
++}
++
++static ssize_t set_cur(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ int id;
++ struct i2c_client *client = to_i2c_client(dev);
++ struct lp5521 *lp = i2c_get_clientdata(client);
++ unsigned int cur = simple_strtoul(buf, NULL, 10);
++
++ id = channel_id_by_name(attr->attr.name);
++ reg_write(lp, LP5521_REG_B_CUR-id, cur);
++
++ return count;
++}
++
++static DEVICE_ATTR(red_cur, S_IRUGO | S_IWUSR, show_cur, set_cur);
++static DEVICE_ATTR(green_cur, S_IRUGO | S_IWUSR, show_cur, set_cur);
++static DEVICE_ATTR(blue_cur, S_IRUGO | S_IWUSR, show_cur, set_cur);
++
++static struct attribute *lp_sysfs_entries[16];
++
++static struct attribute_group lp_attr_group = {
++ .name = NULL,
++ .attrs = lp_sysfs_entries,
++};
++
++static void populate_sysfs_group(struct lp5521 *lp)
++{
++ int i = 0;
++
++ if (lp->pdata->channels[LP5521_RED] & LP5521_CONNECTED) {
++ lp_sysfs_entries[i++] = &dev_attr_red_mode.attr;
++ lp_sysfs_entries[i++] = &dev_attr_red_pwm.attr;
++ lp_sysfs_entries[i++] = &dev_attr_red_cur.attr;
++ }
++
++ if (lp->pdata->channels[LP5521_GREEN] & LP5521_CONNECTED) {
++ lp_sysfs_entries[i++] = &dev_attr_green_mode.attr;
++ lp_sysfs_entries[i++] = &dev_attr_green_pwm.attr;
++ lp_sysfs_entries[i++] = &dev_attr_green_cur.attr;
++ }
++
++ if (lp->pdata->channels[LP5521_BLUE] & LP5521_CONNECTED) {
++ lp_sysfs_entries[i++] = &dev_attr_blue_mode.attr;
++ lp_sysfs_entries[i++] = &dev_attr_blue_pwm.attr;
++ lp_sysfs_entries[i++] = &dev_attr_blue_cur.attr;
++ }
++}
++
++static struct i2c_driver lp5521_driver;
++
++#ifdef CONFIG_PM
++static int lp5521_suspend(struct device *dev, pm_message_t state)
++{
++ /* FIXME: Not implemented
++ * Here we could upload firmware to perform
++ * any scenarios we want and save registers.
++ */
++ return 0;
++}
++
++static int lp5521_resume(struct device *dev)
++{
++ /* FIXME: Not implemented */
++ return 0;
++}
++#else
++#define lp5521_suspend NULL
++#define lp5521_resume NULL
++#endif
++
++static irqreturn_t lp5521_irq(int irq, void *_lp)
++{
++ struct lp5521 *lp = _lp;
++ dev_info(lp->dev, "lp5521 interrupt\n");
++
++ return IRQ_HANDLED;
++}
++
++static int __devinit
++lp5521_probe(struct i2c_client *client, const struct i2c_device_id *id)
++{
++ struct lp5521 *lp;
++ int ret = 0;
++ struct lp5521_platform_data *pdata = client->dev.platform_data;
++
++ lp = kzalloc(sizeof(*lp), GFP_KERNEL);
++ if (!lp)
++ return -ENOMEM;
++
++ lp->client = client;
++ lp->irq = client->irq;
++ lp->dev = &client->dev;
++ i2c_set_clientdata(client, lp);
++
++ lp->pdata = pdata;
++ mutex_init(&lp->lock);
++
++ /* enter start-up mode */
++ if (pdata->ext_enable)
++ (pdata->ext_enable)(1);
++
++ reg_write(lp, LP5521_REG_ENABLE, 0x40);
++
++ /* charge pump mode and clk src selection */
++ reg_write(lp, LP5521_REG_CONFIG, 0x11);
++
++ /* allocate IRQ resource */
++ if (lp->irq) {
++ ret = request_irq(client->irq, lp5521_irq,
++ IRQF_TRIGGER_LOW, LP5521_DRIVER_NAME, lp);
++ if (ret) {
++ dev_err(lp->dev, "request IRQ failed\n");
++ goto fail;
++ }
++ } else {
++ dev_err(lp->dev, "No IRQ allocated \n");
++ }
++
++ populate_sysfs_group(lp);
++
++ ret = sysfs_create_group(&client->dev.kobj, &lp_attr_group);
++
++ if (ret) {
++ dev_err(lp->dev, "error creating sysfs group\n");
++ goto fail;
++ }
++
++ return ret;
++
++fail:
++ kfree(lp);
++ return ret;
++}
++
++static int __devexit lp5521_remove(struct i2c_client *client)
++{
++ struct lp5521 *lp = i2c_get_clientdata(client);
++
++ kfree(lp);
++
++ return 0;
++}
++
++static struct i2c_device_id lp5521_id[] = {
++ {LP5521_DRIVER_NAME, },
++};
++
++static struct i2c_driver lp5521_driver = {
++ .driver = {
++ .name = LP5521_DRIVER_NAME,
++ .suspend = lp5521_suspend,
++ .resume = lp5521_resume,
++ },
++ .id_table = lp5521_id,
++ .probe = lp5521_probe,
++ .remove = __exit_p(lp5521_remove),
++};
++
++static int __init lp5521_init(void)
++{
++ return i2c_add_driver(&lp5521_driver);
++}
++
++static void __exit lp5521_exit(void)
++{
++ i2c_del_driver(&lp5521_driver);
++}
++
++MODULE_AUTHOR("Matt Hsu <matt_hsu@openmoko.org>");
++MODULE_DESCRIPTION("NS lp5521 LED driver");
++MODULE_LICENSE("GPLv2");
++
++module_init(lp5521_init);
++module_exit(lp5521_exit);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/leds/leds-neo1973-gta02.c linux-2.6.29-rc3.owrt.om/drivers/leds/leds-neo1973-gta02.c
+--- linux-2.6.29-rc3.owrt/drivers/leds/leds-neo1973-gta02.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/leds/leds-neo1973-gta02.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,179 @@
++/*
++ * LED driver for the Openmoko GTA02 GSM phone
++ *
++ * (C) 2006-2008 by Openmoko, Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * All rights reserved.
++ *
++ * 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.
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/platform_device.h>
++#include <linux/leds.h>
++#include <mach/hardware.h>
++#include <asm/mach-types.h>
++#include <mach/gta02.h>
++#include <plat/regs-timer.h>
++#include <asm/plat-s3c24xx/neo1973.h>
++
++#define MAX_LEDS 3
++#define COUNTER 256
++
++struct gta02_led_priv
++{
++ spinlock_t lock;
++ struct led_classdev cdev;
++ unsigned int gpio;
++};
++
++struct gta02_led_bundle
++{
++ int num_leds;
++ struct gta02_led_priv led[MAX_LEDS];
++};
++
++static inline struct gta02_led_priv *to_priv(struct led_classdev *led_cdev)
++{
++ return container_of(led_cdev, struct gta02_led_priv, cdev);
++}
++
++static inline struct gta02_led_bundle *to_bundle(struct led_classdev *led_cdev)
++{
++ return dev_get_drvdata(led_cdev->dev->parent);
++}
++
++static void gta02led_set(struct led_classdev *led_cdev,
++ enum led_brightness value)
++{
++ unsigned long flags;
++ struct gta02_led_priv *lp = to_priv(led_cdev);
++
++ spin_lock_irqsave(&lp->lock, flags);
++ neo1973_gpb_setpin(lp->gpio, value ? 1 : 0);
++ spin_unlock_irqrestore(&lp->lock, flags);
++}
++
++#ifdef CONFIG_PM
++static int gta02led_suspend(struct platform_device *pdev, pm_message_t state)
++{
++ struct gta02_led_bundle *bundle = platform_get_drvdata(pdev);
++ int i;
++
++ for (i = 0; i < bundle->num_leds; i++)
++ led_classdev_suspend(&bundle->led[i].cdev);
++
++ return 0;
++}
++
++static int gta02led_resume(struct platform_device *pdev)
++{
++ struct gta02_led_bundle *bundle = platform_get_drvdata(pdev);
++ int i;
++
++ for (i = 0; i < bundle->num_leds; i++)
++ led_classdev_resume(&bundle->led[i].cdev);
++
++ return 0;
++}
++#endif
++
++static int __init gta02led_probe(struct platform_device *pdev)
++{
++ int i, rc;
++ struct gta02_led_bundle *bundle;
++
++ if (!machine_is_neo1973_gta02())
++ return -EIO;
++
++ bundle = kzalloc(sizeof(struct gta02_led_bundle), GFP_KERNEL);
++ if (!bundle)
++ return -ENOMEM;
++ platform_set_drvdata(pdev, bundle);
++
++ for (i = 0; i < pdev->num_resources; i++) {
++ struct gta02_led_priv *lp;
++ struct resource *r;
++
++ if (i >= MAX_LEDS)
++ break;
++
++ r = platform_get_resource(pdev, 0, i);
++ if (!r || !r->start || !r->name)
++ continue;
++
++ lp = &bundle->led[i];
++
++ lp->gpio = r->start;
++ lp->cdev.name = r->name;
++ lp->cdev.brightness_set = gta02led_set;
++
++ switch (lp->gpio) {
++ case S3C2410_GPB0:
++ case S3C2410_GPB1:
++ case S3C2410_GPB2:
++ s3c2410_gpio_cfgpin(lp->gpio, S3C2410_GPIO_OUTPUT);
++ neo1973_gpb_add_shadow_gpio(lp->gpio);
++ break;
++ default:
++ break;
++ }
++
++ spin_lock_init(&lp->lock);
++ rc = led_classdev_register(&pdev->dev, &lp->cdev);
++ }
++
++ bundle->num_leds = i;
++
++ return 0;
++}
++
++static int gta02led_remove(struct platform_device *pdev)
++{
++ struct gta02_led_bundle *bundle = platform_get_drvdata(pdev);
++ int i;
++
++ for (i = 0; i < bundle->num_leds; i++) {
++ struct gta02_led_priv *lp = &bundle->led[i];
++ gta02led_set(&lp->cdev, 0);
++ led_classdev_unregister(&lp->cdev);
++ }
++
++ platform_set_drvdata(pdev, NULL);
++ kfree(bundle);
++
++ return 0;
++}
++
++static struct platform_driver gta02led_driver = {
++ .probe = gta02led_probe,
++ .remove = gta02led_remove,
++#ifdef CONFIG_PM
++ .suspend = gta02led_suspend,
++ .resume = gta02led_resume,
++#endif
++ .driver = {
++ .name = "gta02-led",
++ },
++};
++
++static int __init gta02led_init(void)
++{
++ return platform_driver_register(&gta02led_driver);
++}
++
++static void __exit gta02led_exit(void)
++{
++ platform_driver_unregister(&gta02led_driver);
++}
++
++module_init(gta02led_init);
++module_exit(gta02led_exit);
++
++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
++MODULE_DESCRIPTION("Openmoko GTA02 LED driver");
++MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/leds/leds-neo1973-vibrator.c linux-2.6.29-rc3.owrt.om/drivers/leds/leds-neo1973-vibrator.c
+--- linux-2.6.29-rc3.owrt/drivers/leds/leds-neo1973-vibrator.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/leds/leds-neo1973-vibrator.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,241 @@
++/*
++ * LED driver for the vibrator of the Openmoko GTA01/GTA02 GSM Phones
++ *
++ * (C) 2006-2008 by Openmoko, Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * All rights reserved.
++ *
++ * 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.
++ *
++ * Javi Roman <javiroman@kernel-labs.org>:
++ * Implement PWM support for GTA01Bv4 and later
++ */
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/platform_device.h>
++#include <linux/leds.h>
++#include <mach/hardware.h>
++#include <asm/mach-types.h>
++#include <plat/pwm.h>
++#include <mach/gta01.h>
++#include <plat/regs-timer.h>
++#include <linux/neo1973_vibrator.h>
++
++#include <asm/plat-s3c24xx/neo1973.h>
++
++#define COUNTER 64
++
++static struct neo1973_vib_priv {
++ struct led_classdev cdev;
++ unsigned int gpio;
++ spinlock_t lock;
++ unsigned int has_pwm;
++ struct s3c2410_pwm pwm;
++
++ unsigned long vib_gpio_pin; /* which pin to meddle with */
++ u8 vib_pwm; /* 0 = OFF -- will ensure GPIO deasserted and stop FIQ */
++ u8 vib_pwm_latched;
++ u32 fiq_count;
++
++ struct neo1973_vib_platform_data *pdata;
++} neo1973_vib_priv;
++
++int neo1973_vibrator_fiq_handler(void)
++{
++ neo1973_vib_priv.fiq_count++;
++
++ if (!neo1973_vib_priv.vib_pwm_latched && !neo1973_vib_priv.vib_pwm)
++ /* idle */
++ return 0;
++
++ if ((u8)neo1973_vib_priv.fiq_count == neo1973_vib_priv.vib_pwm_latched)
++ neo1973_gpb_setpin(neo1973_vib_priv.vib_gpio_pin, 0);
++
++ if ((u8)neo1973_vib_priv.fiq_count)
++ return 1;
++
++ neo1973_vib_priv.vib_pwm_latched = neo1973_vib_priv.vib_pwm;
++ if (neo1973_vib_priv.vib_pwm_latched)
++ neo1973_gpb_setpin(neo1973_vib_priv.vib_gpio_pin, 1);
++
++ return 1;
++}
++
++static void neo1973_vib_vib_set(struct led_classdev *led_cdev,
++ enum led_brightness value)
++{
++ unsigned long flags;
++ struct neo1973_vib_priv *vp = container_of(led_cdev,
++ struct neo1973_vib_priv,
++ cdev);
++
++#ifdef CONFIG_MACH_NEO1973_GTA02
++ if (machine_is_neo1973_gta02()) { /* use FIQ to control GPIO */
++ neo1973_vib_priv.vib_pwm = value; /* set it for FIQ */
++ neo1973_vib_priv.pdata->kick_fiq(); /* start up FIQs if not already going */
++ return;
++ }
++#endif
++ /*
++ * value == 255 -> 99% duty cycle (full power)
++ * value == 128 -> 50% duty cycle (medium power)
++ * value == 0 -> 0% duty cycle (zero power)
++ */
++ spin_lock_irqsave(&vp->lock, flags);
++
++ if (vp->has_pwm)
++ s3c2410_pwm_duty_cycle(value / 4, &vp->pwm);
++ else
++ neo1973_gpb_setpin(vp->gpio, value ? 1 : 0);
++
++ spin_unlock_irqrestore(&vp->lock, flags);
++}
++
++static struct neo1973_vib_priv neo1973_vib_led = {
++ .cdev = {
++ .name = "neo1973:vibrator",
++ .brightness_set = neo1973_vib_vib_set,
++ },
++};
++
++static int neo1973_vib_init_hw(struct neo1973_vib_priv *vp)
++{
++ int rc;
++
++ rc = s3c2410_pwm_init(&vp->pwm);
++ if (rc)
++ return rc;
++
++ vp->pwm.timerid = PWM3;
++ /* use same prescaler as arch/arm/plat-s3c24xx/time.c */
++ vp->pwm.prescaler = (6 - 1) / 2;
++ vp->pwm.divider = S3C2410_TCFG1_MUX3_DIV2;
++ vp->pwm.counter = COUNTER;
++ vp->pwm.comparer = COUNTER;
++
++ rc = s3c2410_pwm_enable(&vp->pwm);
++ if (rc)
++ return rc;
++
++ s3c2410_pwm_start(&vp->pwm);
++
++ return 0;
++}
++
++#ifdef CONFIG_PM
++static int neo1973_vib_suspend(struct platform_device *dev, pm_message_t state)
++{
++ led_classdev_suspend(&neo1973_vib_led.cdev);
++ if (neo1973_vib_priv.pdata)
++ neo1973_vib_priv.pdata->disable_fiq();
++ return 0;
++}
++
++static int neo1973_vib_resume(struct platform_device *dev)
++{
++ struct neo1973_vib_priv *vp = platform_get_drvdata(dev);
++
++ if (vp->has_pwm)
++ neo1973_vib_init_hw(vp);
++
++ led_classdev_resume(&neo1973_vib_led.cdev);
++ if (neo1973_vib_priv.pdata)
++ neo1973_vib_priv.pdata->enable_fiq();
++
++ return 0;
++}
++#endif /* CONFIG_PM */
++
++static int __init neo1973_vib_probe(struct platform_device *pdev)
++{
++ struct resource *r;
++ int rc;
++
++ if (!machine_is_neo1973_gta01() && !machine_is_neo1973_gta02())
++ return -EIO;
++
++ r = platform_get_resource(pdev, 0, 0);
++ if (!r || !r->start)
++ return -EIO;
++
++ neo1973_vib_led.gpio = r->start;
++
++ neo1973_vib_priv.pdata = pdev->dev.platform_data;
++ platform_set_drvdata(pdev, &neo1973_vib_led);
++
++#ifdef CONFIG_MACH_NEO1973_GTA02
++ if (machine_is_neo1973_gta02()) { /* use FIQ to control GPIO */
++ neo1973_gpb_setpin(neo1973_vib_led.gpio, 0); /* off */
++ s3c2410_gpio_cfgpin(neo1973_vib_led.gpio, S3C2410_GPIO_OUTPUT);
++ /* safe, kmalloc'd copy needed for FIQ ISR */
++ neo1973_vib_priv.vib_gpio_pin = neo1973_vib_led.gpio;
++ neo1973_vib_priv.vib_pwm = 0; /* off */
++ goto configured;
++ }
++#endif
++
++ /* TOUT3 */
++ if (neo1973_vib_led.gpio == S3C2410_GPB3) {
++ rc = neo1973_vib_init_hw(&neo1973_vib_led);
++ if (rc)
++ return rc;
++
++ s3c2410_pwm_duty_cycle(0, &neo1973_vib_led.pwm);
++ s3c2410_gpio_cfgpin(neo1973_vib_led.gpio, S3C2410_GPB3_TOUT3);
++ neo1973_vib_led.has_pwm = 1;
++ }
++#ifdef CONFIG_MACH_NEO1973_GTA02
++configured:
++#endif
++ spin_lock_init(&neo1973_vib_led.lock);
++
++ return led_classdev_register(&pdev->dev, &neo1973_vib_led.cdev);
++}
++
++static int neo1973_vib_remove(struct platform_device *pdev)
++{
++#ifdef CONFIG_MACH_NEO1973_GTA02
++ if (machine_is_neo1973_gta02()) /* use FIQ to control GPIO */
++ neo1973_vib_priv.vib_pwm = 0; /* off */
++ /* would only need kick if already off so no kick needed */
++#endif
++
++ if (neo1973_vib_led.has_pwm)
++ s3c2410_pwm_disable(&neo1973_vib_led.pwm);
++
++ led_classdev_unregister(&neo1973_vib_led.cdev);
++
++ return 0;
++}
++
++static struct platform_driver neo1973_vib_driver = {
++ .probe = neo1973_vib_probe,
++ .remove = neo1973_vib_remove,
++#ifdef CONFIG_PM
++ .suspend = neo1973_vib_suspend,
++ .resume = neo1973_vib_resume,
++#endif
++ .driver = {
++ .name = "neo1973-vibrator",
++ },
++};
++
++static int __init neo1973_vib_init(void)
++{
++ return platform_driver_register(&neo1973_vib_driver);
++}
++
++static void __exit neo1973_vib_exit(void)
++{
++ platform_driver_unregister(&neo1973_vib_driver);
++}
++
++module_init(neo1973_vib_init);
++module_exit(neo1973_vib_exit);
++
++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
++MODULE_DESCRIPTION("Openmoko GTA01/GTA02 vibrator driver");
++MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/leds/Makefile linux-2.6.29-rc3.owrt.om/drivers/leds/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/leds/Makefile 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/leds/Makefile 2009-05-10 22:27:59.000000000 +0200
+@@ -24,11 +24,15 @@
+ obj-$(CONFIG_LEDS_PCA955X) += leds-pca955x.o
+ obj-$(CONFIG_LEDS_DA903X) += leds-da903x.o
+ obj-$(CONFIG_LEDS_WM8350) += leds-wm8350.o
++obj-$(CONFIG_LEDS_NEO1973_VIBRATOR) += leds-neo1973-vibrator.o
++obj-$(CONFIG_LEDS_NEO1973_GTA02) += leds-neo1973-gta02.o
++obj-$(CONFIG_LEDS_LP5521) += leds-lp5521.o
+
+ # LED Triggers
+ obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o
+ obj-$(CONFIG_LEDS_TRIGGER_IDE_DISK) += ledtrig-ide-disk.o
+ obj-$(CONFIG_LEDS_TRIGGER_HEARTBEAT) += ledtrig-heartbeat.o
++obj-$(CONFIG_LEDS_TRIGGER_NETDEV) += ledtrig-netdev.o
+ obj-$(CONFIG_LEDS_TRIGGER_BACKLIGHT) += ledtrig-backlight.o
+ obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON) += ledtrig-default-on.o
+ obj-$(CONFIG_LEDS_TRIGGER_MORSE) += ledtrig-morse.o
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/Makefile linux-2.6.29-rc3.owrt.om/drivers/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/Makefile 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/Makefile 2009-05-10 22:27:59.000000000 +0200
+@@ -90,6 +90,7 @@
+ obj-y += idle/
+ obj-$(CONFIG_MMC) += mmc/
+ obj-$(CONFIG_MEMSTICK) += memstick/
++obj-$(CONFIG_AR6000_WLAN) += ar6000/
+ obj-$(CONFIG_NEW_LEDS) += leds/
+ obj-$(CONFIG_INFINIBAND) += infiniband/
+ obj-$(CONFIG_SGI_SN) += sn/
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/media/video/Kconfig linux-2.6.29-rc3.owrt.om/drivers/media/video/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/media/video/Kconfig 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/media/video/Kconfig 2009-05-10 22:27:59.000000000 +0200
+@@ -711,6 +711,25 @@
+ CMOS camera controller. This is the controller found on first-
+ generation OLPC systems.
+
++config VIDEO_SAMSUNG
++ bool "S3C SMDK CAMERA support"
++ depends on VIDEO_V4L2
++
++ default n
++ ---help---
++ TBA
++
++choice
++depends on VIDEO_SAMSUNG
++prompt "Select CIS module type"
++default VIDEO_SAMSUNG_S5K3BA
++
++config VIDEO_SAMSUNG_S5K4BA
++ bool "S5K4BA (2.0M CIS module, 1600x1200)"
++ ---help---
++ TBA
++endchoice
++
+ config SOC_CAMERA
+ tristate "SoC camera support"
+ depends on VIDEO_V4L2 && HAS_DMA
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/media/video/Makefile linux-2.6.29-rc3.owrt.om/drivers/media/video/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/media/video/Makefile 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/media/video/Makefile 2009-05-10 22:27:59.000000000 +0200
+@@ -134,6 +134,8 @@
+ obj-$(CONFIG_VIDEO_VIVI) += vivi.o
+ obj-$(CONFIG_VIDEO_CX23885) += cx23885/
+
++obj-$(CONFIG_VIDEO_SAMSUNG) += s3c_camera_driver.o s3c_camif.o samsung/
++
+ obj-$(CONFIG_VIDEO_PXA27x) += pxa_camera.o
+ obj-$(CONFIG_VIDEO_SH_MOBILE_CEU) += sh_mobile_ceu_camera.o
+ obj-$(CONFIG_VIDEO_OMAP2) += omap2cam.o
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/media/video/s3c_camera_driver.c linux-2.6.29-rc3.owrt.om/drivers/media/video/s3c_camera_driver.c
+--- linux-2.6.29-rc3.owrt/drivers/media/video/s3c_camera_driver.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/media/video/s3c_camera_driver.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,1943 @@
++/* drivers/media/video/s3c_camera_driver.c
++ *
++ * Copyright (c) 2008 Samsung Electronics
++ *
++ * Samsung S3C Camera driver
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ */
++
++#include <linux/version.h>
++#include <linux/module.h>
++#include <linux/delay.h>
++#include <linux/errno.h>
++#include <linux/fs.h>
++#include <linux/kernel.h>
++#include <linux/major.h>
++#include <linux/slab.h>
++#include <linux/poll.h>
++#include <linux/signal.h>
++#include <linux/ioport.h>
++#include <linux/sched.h>
++#include <linux/types.h>
++#include <linux/interrupt.h>
++#include <linux/kmod.h>
++#include <linux/vmalloc.h>
++#include <linux/init.h>
++#include <linux/irq.h>
++#include <linux/mm.h>
++#include <linux/videodev2.h>
++#include <linux/platform_device.h>
++#include <linux/clk.h>
++#include <linux/semaphore.h>
++#include <asm/io.h>
++#include <asm/page.h>
++#include <plat/regs-gpio.h>
++#include <plat/regs-camif.h>
++#include <media/v4l2-dev.h>
++#include <media/v4l2-ioctl.h>
++#include "s3c_camif.h"
++#include "videodev2_s3c.h"
++
++#include <linux/mfd/pcf50633/core.h> /* @@@ hack - WA */
++#include <plat/gpio-bank-f.h>
++#include <plat/gpio-cfg.h>
++#include <mach/gpio.h>
++#include <mach/map.h>
++#include <plat/regs-sys.h>
++#include <plat/regs-syscon-power.h>
++
++
++static struct clk *cam_clock;
++camif_cfg_t s3c_fimc[CAMIF_DEV_NUM];
++extern camif_cis_t msdma_input;
++extern int s3c_camif_do_postprocess(camif_cfg_t *cfg);
++
++/*************************************************************************
++ * Utility part
++ ************************************************************************/
++camif_cfg_t *s3c_camif_get_fimc_object(int nr)
++{
++ camif_cfg_t *ret = NULL;
++
++ switch (nr) {
++ case CODEC_MINOR:
++ ret = &s3c_fimc[FIMC_CODEC_INDEX];
++ break;
++
++ case PREVIEW_MINOR:
++ ret = &s3c_fimc[FIMC_PREVIEW_INDEX];
++ break;
++
++ default:
++ printk(KERN_ERR "Unknown minor number\n");
++ ret = &s3c_fimc[FIMC_PREVIEW_INDEX];
++ }
++
++ return ret;
++}
++
++#if defined(FSM_ON_PREVIEW)
++static int s3c_camif_check_global_status(camif_cfg_t *cfg)
++{
++ int ret = 0;
++
++ if (down_interruptible(&cfg->cis->lock))
++ return -ERESTARTSYS;
++
++ if (cfg->cis->status & CWANT2START) {
++ cfg->cis->status &= ~CWANT2START;
++ cfg->auto_restart = 1;
++ ret = 1;
++ } else {
++ ret = 0; /* There is no codec */
++ cfg->auto_restart = 0; /* Duplicated ..Dummy */
++ }
++
++ up(&cfg->cis->lock);
++
++ return ret;
++}
++#endif
++
++static int s3c_camif_convert_format(int pixfmt, int *fmtptr)
++{
++ int fmt = CAMIF_YCBCR420;
++ int depth = 12;
++
++ switch (pixfmt) {
++ case V4L2_PIX_FMT_RGB565:
++ case V4L2_PIX_FMT_RGB565X:
++ fmt = CAMIF_RGB16;
++ depth = 16;
++ break;
++
++ case V4L2_PIX_FMT_BGR24: /* Not tested */
++ case V4L2_PIX_FMT_RGB24:
++ fmt = CAMIF_RGB24;
++ depth = 24;
++ break;
++
++ case V4L2_PIX_FMT_BGR32:
++ case V4L2_PIX_FMT_RGB32:
++ fmt = CAMIF_RGB24;
++ depth = 32;
++ break;
++
++ case V4L2_PIX_FMT_GREY: /* Not tested */
++ fmt = CAMIF_YCBCR420;
++ depth = 8;
++ break;
++
++ case V4L2_PIX_FMT_YUYV:
++ case V4L2_PIX_FMT_UYVY:
++ fmt = CAMIF_YCBCR422I;
++ depth = 16;
++ break;
++
++ case V4L2_PIX_FMT_YUV422P:
++ fmt = CAMIF_YCBCR422;
++ depth = 16;
++ break;
++
++ case V4L2_PIX_FMT_YUV420:
++ fmt = CAMIF_YCBCR420;
++ depth = 12;
++ break;
++ }
++
++ if (fmtptr)
++ *fmtptr = fmt;
++
++ return depth;
++}
++
++static int s3c_camif_set_fb_info(camif_cfg_t *cfg, int depth, int fourcc)
++{
++ /* To define v4l2_format used currently */
++ cfg->v2.frmbuf.fmt.width = cfg->target_x;
++ cfg->v2.frmbuf.fmt.height = cfg->target_y;
++ cfg->v2.frmbuf.fmt.field = V4L2_FIELD_NONE;
++ cfg->v2.frmbuf.fmt.pixelformat = fourcc;
++ cfg->v2.frmbuf.fmt.bytesperline = cfg->v2.frmbuf.fmt.width * depth >> 3;
++ cfg->v2.frmbuf.fmt.sizeimage =
++ cfg->v2.frmbuf.fmt.height * cfg->v2.frmbuf.fmt.bytesperline;
++
++ return 0;
++}
++
++static int s3c_camif_convert_type(camif_cfg_t *cfg, int f)
++{
++ int pixfmt;
++
++ cfg->target_x = cfg->v2.frmbuf.fmt.width;
++ cfg->target_y = cfg->v2.frmbuf.fmt.height;
++
++ s3c_camif_convert_format(cfg->v2.frmbuf.fmt.pixelformat, &pixfmt);
++
++ cfg->dst_fmt = pixfmt;
++
++ return 0;
++}
++
++/*************************************************************************
++ * Control part
++ ************************************************************************/
++static int s3c_camif_start_capture(camif_cfg_t * cfg)
++{
++ int ret = 0;
++
++ cfg->capture_enable = CAMIF_DMA_ON;
++
++ s3c_camif_start_dma(cfg);
++
++ cfg->status = CAMIF_STARTED;
++
++ if (!(cfg->fsm == CAMIF_SET_LAST_INT ||
++ cfg->fsm == CAMIF_CONTINUOUS_INT)) {
++ cfg->fsm = CAMIF_DUMMY_INT;
++ cfg->perf.frames = 0;
++ }
++
++#if defined(CONFIG_CPU_S3C6400) || defined(CONFIG_CPU_S3C6410)
++ if (cfg->input_channel == MSDMA_FROM_CODEC)
++ s3c_camif_start_codec_msdma(cfg);
++#endif
++ return ret;
++}
++
++ssize_t s3c_camif_start_preview(camif_cfg_t *cfg)
++{
++ cfg->capture_enable = CAMIF_DMA_ON;
++
++ s3c_camif_start_dma(cfg);
++
++ cfg->status = CAMIF_STARTED;
++ cfg->fsm = CAMIF_1st_INT;
++ cfg->perf.frames = 0;
++
++ return 0;
++}
++
++ssize_t s3c_camif_stop_preview(camif_cfg_t *cfg)
++{
++ cfg->capture_enable = CAMIF_DMA_OFF;
++ cfg->status = CAMIF_STOPPED;
++
++ s3c_camif_stop_dma(cfg);
++
++ cfg->perf.frames = 0;
++
++ return 0;
++}
++
++ssize_t s3c_camif_stop_capture(camif_cfg_t *cfg)
++{
++ cfg->capture_enable = CAMIF_DMA_OFF;
++ cfg->status = CAMIF_STOPPED;
++
++ s3c_camif_stop_dma(cfg);
++
++ cfg->perf.frames = 0;
++
++ return 0;
++}
++
++ssize_t s3c_camif_stop_fimc(camif_cfg_t *cfg)
++{
++ cfg->capture_enable = CAMIF_BOTH_DMA_OFF;
++ cfg->fsm = CAMIF_DUMMY_INT;
++ cfg->perf.frames = 0;
++
++ s3c_camif_stop_dma(cfg);
++
++ return 0;
++}
++
++#if defined(FSM_ON_PREVIEW)
++static void s3c_camif_start_preview_with_codec(camif_cfg_t *cfg)
++{
++ camif_cfg_t *other = cfg->other;
++
++ /* Preview Stop */
++ cfg->capture_enable = CAMIF_DMA_OFF;
++ s3c_camif_stop_dma(cfg);
++
++ /* Start Preview and CODEC */
++ cfg->capture_enable =CAMIF_BOTH_DMA_ON;
++
++ s3c_camif_start_dma(cfg);
++ cfg->fsm = CAMIF_1st_INT; /* For Preview */
++
++ if (!other)
++ panic("Unexpected error: other is null\n");
++
++ switch (other->pp_num) {
++ case 4:
++ other->fsm = CAMIF_1st_INT; /* For CODEC */
++ break;
++
++ case 1:
++ other->fsm = CAMIF_Yth_INT;
++ break;
++
++ default:
++ panic("Invalid pingpong number");
++ break;
++ }
++}
++
++static void s3c_camif_auto_restart(camif_cfg_t *cfg)
++{
++ if (cfg->auto_restart)
++ s3c_camif_start_preview_with_codec(cfg);
++}
++#endif
++
++static void s3c_camif_change_mode(camif_cfg_t *cfg, int mode)
++{
++ camif_cis_t *cis = cfg->cis;
++ int res;
++
++ if (mode == SENSOR_MAX) {
++#if defined(CONFIG_VIDEO_SAMSUNG_S5K3AA)
++ res = SENSOR_SXGA;
++#elif defined(CONFIG_VIDEO_SAMSUNG_S5K3BA)
++ res = SENSOR_UXGA;
++
++/* 4BA max is UXGA, but we don't have UXGA control values */
++#elif defined(CONFIG_VIDEO_SAMSUNG_S5K4BA)
++ res = SENSOR_SVGA;
++#endif
++ } else if (mode == SENSOR_DEFAULT) {
++#if defined(CONFIG_VIDEO_SAMSUNG_S5K4BA)
++ res = SENSOR_SVGA;
++#else
++ res = SENSOR_VGA;
++#endif
++ } else
++ res = mode;
++
++ s3c_camif_stop_fimc(cfg);
++
++ switch (res) {
++ case SENSOR_SXGA:
++ printk(KERN_INFO
++ "Resolution changed into SXGA (1280x1024) mode -> 1.3M\n");
++ cis->sensor->driver->command(cis->sensor, SENSOR_SXGA, NULL);
++ cis->source_x = 1280;
++ cis->source_y = 1024;
++ break;
++
++ case SENSOR_UXGA:
++ printk(KERN_INFO
++ "Resolution changed into UXGA (1600x1200) mode -> 2.0M\n");
++ cis->sensor->driver->command(cis->sensor, SENSOR_UXGA, NULL);
++ cis->source_x = 1600;
++ cis->source_y = 1200;
++ break;
++
++ case SENSOR_SVGA:
++ printk(KERN_INFO
++ "Resolution changed back to SVGA (800x600) mode\n");
++ cis->sensor->driver->command(cis->sensor, SENSOR_SVGA, NULL);
++ cis->source_x = 800;
++ cis->source_y = 600;
++ break;
++
++ case SENSOR_VGA:
++ printk(KERN_INFO "Resolution changed back to VGA (640x480) "
++ "mode (default)\n");
++ cis->sensor->driver->command(cis->sensor, SENSOR_VGA, NULL);
++ cis->source_x = 640;
++ cis->source_y = 480;
++ break;
++ }
++
++ cis->win_hor_ofst = cis->win_hor_ofst2 = 0;
++ cis->win_ver_ofst = cis->win_ver_ofst2 = 0;
++
++ s3c_camif_set_source_format(cis);
++}
++
++static int s3c_camif_check_zoom_range(camif_cfg_t *cfg, int type)
++{
++ switch (type) {
++ case V4L2_CID_ZOOMIN:
++ if (((cfg->sc.modified_src_x - (cfg->cis->win_hor_ofst +
++ ZOOM_AT_A_TIME_IN_PIXELS + cfg->cis->win_hor_ofst2 +
++ ZOOM_AT_A_TIME_IN_PIXELS)) / cfg->sc.prehratio) >
++ ZOOM_IN_MAX) {
++ printk(KERN_INFO "Invalid Zoom-in: this zoom-in on "
++ "preview scaler already comes to the maximum\n");
++ return 0;
++ }
++
++ cfg->sc.zoom_in_cnt++;
++ break;
++
++ case V4L2_CID_ZOOMOUT:
++ if (cfg->sc.zoom_in_cnt > 0) {
++ cfg->sc.zoom_in_cnt--;
++ } else {
++ printk(KERN_INFO "Invalid Zoom-out: this zoom-out on "
++ "preview scaler already comes to the minimum\n");
++ return 0;
++ }
++
++ break;
++
++ default:
++ break;
++ }
++
++ return 1;
++}
++
++static int s3c_camif_restart_preview(camif_cfg_t *cfg)
++{
++ int ret = 0;
++
++ s3c_camif_stop_preview(cfg);
++
++ if (s3c_camif_control_fimc(cfg)) {
++ printk(KERN_ERR "S3C fimc control failed\n");
++ ret = -1;
++ }
++
++ s3c_camif_start_preview(cfg);
++
++ return ret;
++}
++
++static int s3c_camif_send_sensor_command(camif_cfg_t *cfg, unsigned int cmd,
++ int arg)
++{
++ cfg->cis->sensor->driver->command(cfg->cis->sensor, cmd, (void *) arg);
++
++ return 0;
++}
++
++/*************************************************************************
++ * V4L2 part
++ ************************************************************************/
++static int s3c_camif_v4l2_querycap(camif_cfg_t *cfg, void *arg)
++{
++ struct v4l2_capability *cap = arg;
++
++ strcpy(cap->driver, "S3C FIMC Camera driver");
++ strlcpy(cap->card, cfg->v->name, sizeof(cap->card));
++ sprintf(cap->bus_info, "FIMC AHB Bus");
++
++ cap->version = 0;
++ cap->capabilities = V4L2_CAP_VIDEO_OVERLAY | V4L2_CAP_VIDEO_CAPTURE |
++ V4L2_CAP_STREAMING;
++
++ return 0;
++}
++
++static int s3c_camif_v4l2_g_fbuf(camif_cfg_t *cfg, void *arg)
++{
++ struct v4l2_framebuffer *fb = arg;
++
++ *fb = cfg->v2.frmbuf;
++
++ fb->base = cfg->v2.frmbuf.base;
++ fb->capability = V4L2_FBUF_CAP_LIST_CLIPPING;
++
++ fb->fmt.pixelformat = cfg->v2.frmbuf.fmt.pixelformat;
++ fb->fmt.width = cfg->v2.frmbuf.fmt.width;
++ fb->fmt.height = cfg->v2.frmbuf.fmt.height;
++ fb->fmt.bytesperline = cfg->v2.frmbuf.fmt.bytesperline;
++
++ return 0;
++}
++
++static int s3c_camif_v4l2_s_fbuf(camif_cfg_t *cfg, void *arg)
++{
++ struct v4l2_framebuffer *fb = arg;
++ int i, depth;
++
++ for (i = 0; i < NUMBER_OF_PREVIEW_FORMATS; i++)
++ if (fimc_preview_formats[i].pixelformat == fb->fmt.pixelformat)
++ break;
++
++ if (i == NUMBER_OF_PREVIEW_FORMATS)
++ return -EINVAL;
++
++ cfg->v2.frmbuf.base = fb->base;
++ cfg->v2.frmbuf.flags = fb->flags;
++ cfg->v2.frmbuf.capability = fb->capability;
++
++ cfg->target_x = fb->fmt.width;
++ cfg->target_y = fb->fmt.height;
++
++ depth = s3c_camif_convert_format(fb->fmt.pixelformat,
++ (int *) &cfg->dst_fmt);
++ s3c_camif_set_fb_info(cfg, depth, fb->fmt.pixelformat);
++
++ return s3c_camif_control_fimc(cfg);
++}
++
++static int s3c_camif_v4l2_g_fmt(camif_cfg_t *cfg, void *arg)
++{
++ struct v4l2_format *f = arg;
++ int size = sizeof(struct v4l2_pix_format);
++ int ret = -1;
++
++ switch (f->type) {
++ case V4L2_BUF_TYPE_VIDEO_CAPTURE:
++ memset(&f->fmt.pix, 0, size);
++ memcpy(&f->fmt.pix, &cfg->v2.frmbuf.fmt, size);
++ ret = 0;
++ break;
++
++ default:
++ break;
++ }
++
++ return ret;
++}
++
++static int s3c_camif_v4l2_s_fmt(camif_cfg_t *cfg, void *arg)
++{
++ struct v4l2_format *f = arg;
++ int ret = -1;
++
++ switch (f->type) {
++ case V4L2_BUF_TYPE_VIDEO_CAPTURE:
++ cfg->v2.frmbuf.fmt = f->fmt.pix;
++ cfg->v2.status |= CAMIF_v4L2_DIRTY;
++ cfg->v2.status &= ~CAMIF_v4L2_DIRTY; /* dummy ? */
++
++ s3c_camif_convert_type(cfg, 1);
++ s3c_camif_control_fimc(cfg);
++ ret = 0;
++ break;
++
++ default:
++ break;
++ }
++
++ return ret;
++}
++
++static int s3c_camif_v4l2_enum_fmt(camif_cfg_t *cfg, void *arg)
++{
++ struct v4l2_fmtdesc *f = arg;
++ int index = f->index;
++
++ if (index >= NUMBER_OF_CODEC_FORMATS)
++ return -EINVAL;
++
++ switch (f->type) {
++ case V4L2_BUF_TYPE_VIDEO_CAPTURE:
++ break;
++
++ case V4L2_BUF_TYPE_VIDEO_OVERLAY:
++ default:
++ return -EINVAL;
++ }
++
++ memset(f, 0, sizeof(*f));
++ memcpy(f, cfg->v2.fmtdesc + index, sizeof(*f));
++
++ return 0;
++}
++
++static int s3c_camif_v4l2_overlay(camif_cfg_t *cfg, void *arg)
++{
++ int on = *(int *) arg;
++
++ if (on)
++ return s3c_camif_start_preview(cfg);
++ else
++ return s3c_camif_stop_preview(cfg);
++}
++
++static int s3c_camif_v4l2_g_ctrl(camif_cfg_t *cfg, void *arg)
++{
++ return 0;
++}
++
++static int s3c_camif_v4l2_s_ctrl(camif_cfg_t *cfg, void *arg)
++{
++ struct v4l2_control *ctrl = arg;
++
++ switch (ctrl->id) {
++ case V4L2_CID_ORIGINAL:
++ case V4L2_CID_ARBITRARY:
++ case V4L2_CID_NEGATIVE:
++ case V4L2_CID_EMBOSSING:
++ case V4L2_CID_ART_FREEZE:
++ case V4L2_CID_SILHOUETTE:
++ cfg->effect = ctrl->value;
++ s3c_camif_change_effect(cfg);
++ break;
++
++ case V4L2_CID_HFLIP:
++ cfg->flip = CAMIF_FLIP_X;
++ s3c_camif_change_flip(cfg);
++ break;
++
++ case V4L2_CID_VFLIP:
++ cfg->flip = CAMIF_FLIP_Y;
++ s3c_camif_change_flip(cfg);
++ break;
++
++ case V4L2_CID_ROTATE_180:
++ cfg->flip = CAMIF_FLIP_MIRROR;
++ s3c_camif_change_flip(cfg);
++ break;
++
++#if defined(CONFIG_CPU_S3C6400) || defined(CONFIG_CPU_S3C6410)
++ case V4L2_CID_ROTATE_90:
++ cfg->flip = CAMIF_ROTATE_90;
++ s3c_camif_change_flip(cfg);
++ break;
++
++ case V4L2_CID_ROTATE_270:
++ cfg->flip = CAMIF_FLIP_ROTATE_270;
++ s3c_camif_change_flip(cfg);
++ break;
++#endif
++
++ case V4L2_CID_ROTATE_BYPASS:
++ cfg->flip = CAMIF_FLIP;
++ s3c_camif_change_flip(cfg);
++ break;
++
++ case V4L2_CID_ZOOMIN:
++ if (!s3c_camif_check_zoom_range(cfg, ctrl->id))
++ break;
++ cfg->cis->win_hor_ofst += ZOOM_AT_A_TIME_IN_PIXELS;
++ cfg->cis->win_ver_ofst += ZOOM_AT_A_TIME_IN_PIXELS;
++ cfg->cis->win_hor_ofst2 += ZOOM_AT_A_TIME_IN_PIXELS;
++ cfg->cis->win_ver_ofst2 += ZOOM_AT_A_TIME_IN_PIXELS;
++
++ s3c_camif_restart_preview(cfg);
++
++ break;
++
++ case V4L2_CID_ZOOMOUT:
++ if (!s3c_camif_check_zoom_range(cfg, ctrl->id))
++ break;
++ cfg->cis->win_hor_ofst -= ZOOM_AT_A_TIME_IN_PIXELS;
++ cfg->cis->win_ver_ofst -= ZOOM_AT_A_TIME_IN_PIXELS;
++ cfg->cis->win_hor_ofst2 -= ZOOM_AT_A_TIME_IN_PIXELS;
++ cfg->cis->win_ver_ofst2 -= ZOOM_AT_A_TIME_IN_PIXELS;
++
++ s3c_camif_restart_preview(cfg);
++
++ break;
++
++ case V4L2_CID_CONTRAST:
++ case V4L2_CID_AUTO_WHITE_BALANCE:
++ s3c_camif_send_sensor_command(cfg, SENSOR_WB,
++ ctrl->value);
++ break;
++
++ default:
++ printk(KERN_ERR "Invalid control id: %d\n", ctrl->id);
++ return -1;
++ }
++
++ return 0;
++}
++
++static int s3c_camif_v4l2_streamon(camif_cfg_t *cfg, void *arg)
++{
++ return s3c_camif_start_capture(cfg);
++}
++
++static int s3c_camif_v4l2_streamoff(camif_cfg_t *cfg, void *arg)
++{
++ cfg->cis->status &= ~C_WORKING;
++
++ s3c_camif_stop_capture(cfg);
++
++ return 0;
++}
++
++static int s3c_camif_v4l2_g_input(camif_cfg_t *cfg, void *arg)
++{
++ unsigned int *index = arg;
++
++ *index = cfg->v2.input->index;
++
++ return 0;
++}
++
++static int s3c_camif_v4l2_s_input(camif_cfg_t *cfg, unsigned int index)
++{
++ int ret = -1;
++
++ if (index >= NUMBER_OF_INPUTS)
++ ret = -1;
++ else {
++ cfg->v2.input = &fimc_inputs[index];
++
++ if (cfg->v2.input->type == V4L2_INPUT_TYPE_MSDMA) {
++ if (cfg->dma_type & CAMIF_PREVIEW) {
++ cfg->input_channel = MSDMA_FROM_PREVIEW;
++ ret = 0;
++ } else if (cfg->dma_type & CAMIF_CODEC) {
++ cfg->input_channel = MSDMA_FROM_CODEC;
++ ret = 0;
++ }
++ } else {
++ cfg->input_channel = CAMERA_INPUT;
++ ret = 0;
++ }
++ }
++
++ return ret;
++}
++
++static int s3c_camif_v4l2_g_output(camif_cfg_t *cfg, void *arg)
++{
++ unsigned int *index = arg;
++
++ *index = cfg->v2.output->index;
++
++ return 0;
++}
++
++static int s3c_camif_v4l2_s_output(camif_cfg_t *cfg, unsigned int index)
++{
++ if (index >= NUMBER_OF_OUTPUTS)
++ return -EINVAL;
++ else {
++ cfg->v2.output = (struct v4l2_output *) &fimc_outputs[index];
++ return 0;
++ }
++}
++
++static int s3c_camif_v4l2_enum_input(camif_cfg_t *cfg, void *arg)
++{
++ struct v4l2_input *i = arg;
++
++ if (i->index >= NUMBER_OF_INPUTS)
++ return -EINVAL;
++
++ memcpy(i, &fimc_inputs[i->index], sizeof(struct v4l2_input));
++
++ return 0;
++}
++
++static int s3c_camif_v4l2_enum_output(camif_cfg_t *cfg, void *arg)
++{
++ struct v4l2_output *i = arg;
++
++ if (i->index >= NUMBER_OF_OUTPUTS)
++ return -EINVAL;
++
++ memcpy(i, &fimc_outputs[i->index], sizeof(struct v4l2_output));
++
++ return 0;
++}
++
++static int s3c_camif_v4l2_reqbufs(camif_cfg_t *cfg, void *arg)
++{
++ struct v4l2_requestbuffers *req = arg;
++
++ if (req->memory != V4L2_MEMORY_MMAP) {
++ printk(KERN_ERR "Only V4L2_MEMORY_MMAP capture is supported\n");
++ return -EINVAL;
++ }
++
++ /* control user input */
++ if (req->count > 2)
++ req->count = 4;
++ else if (req->count > 1)
++ req->count = 2;
++ else
++ req->count = 1;
++
++ return 0;
++}
++
++static int s3c_camif_v4l2_querybuf(camif_cfg_t *cfg, void *arg)
++{
++ struct v4l2_buffer *buf = arg;
++
++ if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
++ buf->memory != V4L2_MEMORY_MMAP)
++ return -1;
++
++ buf->length = cfg->buffer_size;
++ buf->m.offset = buf->length * buf->index;
++
++ return 0;
++}
++
++static int s3c_camif_v4l2_qbuf(camif_cfg_t *cfg, void *arg)
++{
++ return 0;
++}
++
++static int s3c_camif_v4l2_dqbuf(camif_cfg_t *cfg, void *arg)
++{
++ struct v4l2_buffer *buf = arg;
++
++ buf->index = cfg->cur_frame_num % cfg->pp_num;
++
++ return 0;
++}
++
++/*
++ * S3C specific
++ */
++static int s3c_camif_v4l2_s_msdma(camif_cfg_t *cfg, void *arg)
++{
++ struct v4l2_msdma_format *f = arg;
++ int ret;
++
++ switch(f->input_path) {
++ case V4L2_MSDMA_PREVIEW:
++ cfg->cis->user--;
++ /* CIS will be replaced with a CIS for MSDMA */
++
++ cfg->cis = &msdma_input;
++ cfg->cis->user++;
++ cfg->input_channel = MSDMA_FROM_PREVIEW;
++ break;
++
++ case V4L2_MSDMA_CODEC:
++ cfg->cis->user--;
++ /* CIS will be replaced with a CIS for MSDMA */
++
++ cfg->cis = &msdma_input;
++ cfg->cis->user++;
++ cfg->input_channel = MSDMA_FROM_CODEC;
++ break;
++
++ default:
++ cfg->input_channel = CAMERA_INPUT;
++ break;
++ }
++
++ cfg->cis->source_x = f->width;
++ cfg->cis->source_y = f->height;
++
++ s3c_camif_convert_format(f->pixelformat, (int *) &cfg->src_fmt);
++
++ cfg->cis->win_hor_ofst = 0;
++ cfg->cis->win_ver_ofst = 0;
++ cfg->cis->win_hor_ofst2 = 0;
++ cfg->cis->win_ver_ofst2 = 0;
++
++ ret = s3c_camif_control_fimc(cfg);
++
++ switch(f->input_path) {
++ case V4L2_MSDMA_PREVIEW:
++ ret = s3c_camif_start_preview(cfg);
++ break;
++
++ case V4L2_MSDMA_CODEC:
++ ret = s3c_camif_start_capture(cfg);
++ break;
++
++ default:
++ break;
++
++ }
++
++ return ret;
++}
++
++static int s3c_camif_v4l2_msdma_start(camif_cfg_t *cfg, void *arg)
++{
++ if (cfg->input_channel == MSDMA_FROM_PREVIEW) {
++ cfg->msdma_status = 1;
++ s3c_camif_start_preview_msdma(cfg);
++ }
++
++ return 0;
++}
++
++static int s3c_camif_v4l2_msdma_stop(camif_cfg_t *cfg, void *arg)
++{
++ struct v4l2_msdma_format *f = arg;
++ int ret = -1;
++
++ cfg->cis->status &= ~C_WORKING;
++ cfg->msdma_status = 0;
++
++ switch(f->input_path) {
++ case V4L2_MSDMA_PREVIEW:
++ ret = s3c_camif_stop_preview(cfg);
++ break;
++
++ case V4L2_MSDMA_CODEC:
++ ret = s3c_camif_stop_capture(cfg);
++ break;
++
++ default:
++ break;
++ }
++
++ return ret;
++}
++
++static int s3c_camif_v4l2_camera_start(camif_cfg_t *cfg, void *arg)
++{
++ return 0;
++}
++
++static int s3c_camif_v4l2_camera_stop(camif_cfg_t *cfg, void *arg)
++{
++ return 0;
++}
++
++static int s3c_camif_v4l2_cropcap(camif_cfg_t *cfg, void *arg)
++{
++ struct v4l2_cropcap *cap = arg;
++
++ if (cap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
++ cap->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
++ return -EINVAL;
++
++ /* crop limitations */
++ cfg->v2.crop_bounds.left = 0;
++ cfg->v2.crop_bounds.top = 0;
++ cfg->v2.crop_bounds.width = cfg->cis->source_x;
++ cfg->v2.crop_bounds.height = cfg->cis->source_y;
++
++ /* crop default values */
++ cfg->v2.crop_defrect.left =
++ (cfg->cis->source_x - CROP_DEFAULT_WIDTH) / 2;
++ cfg->v2.crop_defrect.top =
++ (cfg->cis->source_y - CROP_DEFAULT_HEIGHT) / 2;
++ cfg->v2.crop_defrect.width = CROP_DEFAULT_WIDTH;
++ cfg->v2.crop_defrect.height = CROP_DEFAULT_HEIGHT;
++
++ cap->bounds = cfg->v2.crop_bounds;
++ cap->defrect = cfg->v2.crop_defrect;
++
++ return 0;
++}
++
++static int s3c_camif_v4l2_g_crop(camif_cfg_t *cfg, void *arg)
++{
++ struct v4l2_crop *crop = arg;
++
++ if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
++ crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
++ return -EINVAL;
++
++ crop->c = cfg->v2.crop_current;
++
++ return 0;
++}
++
++static int s3c_camif_v4l2_s_crop(camif_cfg_t *cfg, void *arg)
++{
++ struct v4l2_crop *crop = arg;
++
++ if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
++ crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
++ return -EINVAL;
++
++ if (crop->c.height < 0)
++ return -EINVAL;
++
++ if (crop->c.width < 0)
++ return -EINVAL;
++
++ if ((crop->c.left + crop->c.width > cfg->cis->source_x) ||
++ (crop->c.top + crop->c.height > cfg->cis->source_y))
++ return -EINVAL;
++
++ cfg->v2.crop_current = crop->c;
++
++ cfg->cis->win_hor_ofst = (cfg->cis->source_x - crop->c.width) / 2;
++ cfg->cis->win_ver_ofst = (cfg->cis->source_y - crop->c.height) / 2;
++
++ cfg->cis->win_hor_ofst2 = cfg->cis->win_hor_ofst;
++ cfg->cis->win_ver_ofst2 = cfg->cis->win_ver_ofst;
++
++ s3c_camif_restart_preview(cfg);
++
++ return 0;
++}
++
++static int s3c_camif_v4l2_s_parm(camif_cfg_t *cfg, void *arg)
++{
++ struct v4l2_streamparm *sp = arg;
++
++ if (sp->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
++ return -EINVAL;
++
++ if (sp->parm.capture.capturemode == V4L2_MODE_HIGHQUALITY) {
++ s3c_camif_change_mode(cfg, SENSOR_MAX);
++ s3c_camif_control_fimc(cfg);
++ } else {
++ s3c_camif_change_mode(cfg, SENSOR_DEFAULT);
++ s3c_camif_control_fimc(cfg);
++ }
++
++ return 0;
++}
++
++/*************************************************************************
++ * Interrupt part
++ ************************************************************************/
++#if defined(FSM_ON_CODEC) && !defined(USE_LAST_IRQ)
++int s3c_camif_do_fsm_codec(camif_cfg_t *cfg)
++{
++ cfg->perf.frames++;
++
++ if (cfg->fsm == CAMIF_DUMMY_INT &&
++ cfg->perf.frames > CAMIF_CAPTURE_SKIP_FRAMES)
++ cfg->fsm = CAMIF_NORMAL_INT;
++
++ switch (cfg->fsm) {
++ case CAMIF_DUMMY_INT:
++ DPRINTK(KERN_INFO "CAMIF_DUMMY_INT: %d\n", cfg->perf.frames);
++ cfg->status = CAMIF_STARTED;
++ cfg->fsm = CAMIF_DUMMY_INT;
++ return INSTANT_SKIP;
++
++ case CAMIF_NORMAL_INT:
++ DPRINTK(KERN_INFO "CAMIF_NORMAL_INT: %d\n", cfg->perf.frames);
++ cfg->status = CAMIF_INT_HAPPEN;
++ cfg->fsm = CAMIF_CONTINUOUS_INT;
++ return INSTANT_GO;
++
++ case CAMIF_CONTINUOUS_INT:
++ DPRINTK(KERN_INFO "CAMIF_CONTINUOS_INT: %d\n",
++ cfg->perf.frames);
++ cfg->status = CAMIF_INT_HAPPEN;
++ cfg->fsm = CAMIF_CONTINUOUS_INT;
++ return INSTANT_GO;
++
++ default:
++ printk(KERN_INFO "Unexpect INT: %d\n", cfg->fsm);
++ return INSTANT_SKIP;
++ }
++}
++#endif
++
++#if defined(FSM_ON_CODEC) && defined(USE_LAST_IRQ)
++int s3c_camif_do_fsm_codec_lastirq(camif_cfg_t *cfg)
++{
++ cfg->perf.frames++;
++
++ if (cfg->fsm == CAMIF_DUMMY_INT &&
++ cfg->perf.frames > CAMIF_CAPTURE_SKIP_FRAMES - 2)
++ cfg->fsm = CAMIF_SET_LAST_INT;
++
++ switch (cfg->fsm) {
++ case CAMIF_DUMMY_INT:
++ DPRINTK(KERN_INFO "CAMIF_DUMMY_INT: %d\n", cfg->perf.frames);
++ cfg->status = CAMIF_STARTED;
++ cfg->fsm = CAMIF_DUMMY_INT;
++ return INSTANT_SKIP;
++
++ case CAMIF_SET_LAST_INT:
++ DPRINTK(KERN_INFO "CAMIF_SET_LAST_INT: %d\n", cfg->perf.frames);
++ s3c_camif_enable_lastirq(cfg);
++
++/* in 64xx, lastirq is not auto cleared. */
++#if defined(CONFIG_CPU_S3C6400) || defined(CONFIG_CPU_S3C6410)
++ s3c_camif_disable_lastirq(cfg);
++#endif
++ cfg->status = CAMIF_INT_HAPPEN;
++ cfg->fsm = CAMIF_STOP_CAPTURE;
++ return INSTANT_SKIP;
++
++ case CAMIF_STOP_CAPTURE:
++ DPRINTK(KERN_INFO "CAMIF_STOP_CAPTURE: %d\n", cfg->perf.frames);
++ cfg->capture_enable = CAMIF_DMA_OFF;
++ s3c_camif_stop_dma(cfg);
++ cfg->fsm = CAMIF_LAST_IRQ;
++ return INSTANT_SKIP;
++
++ case CAMIF_LAST_IRQ:
++ DPRINTK(KERN_INFO "CAMIF_LAST_IRQ: %d\n", cfg->perf.frames);
++ cfg->fsm = CAMIF_SET_LAST_INT;
++ cfg->status = CAMIF_INT_HAPPEN;
++ return INSTANT_GO;
++
++ default:
++ printk(KERN_INFO "Unexpect INT: %d\n", cfg->fsm);
++ return = INSTANT_SKIP;
++ }
++}
++#endif
++
++#if defined(FSM_ON_PREVIEW)
++static int s3c_camif_do_lastirq_preview(camif_cfg_t *cfg)
++{
++ cfg->perf.frames++;
++
++ if (cfg->fsm == CAMIF_NORMAL_INT)
++ if (cfg->perf.frames % CHECK_FREQ == 0)
++ if (s3c_camif_check_global_status(cfg) > 0)
++ cfg->fsm = CAMIF_Xth_INT;
++
++ switch (cfg->fsm) {
++ case CAMIF_1st_INT:
++ DPRINTK(KERN_INFO "CAMIF_1st_INT INT\n");
++ cfg->fsm = CAMIF_NORMAL_INT;
++ return INSTANT_SKIP;
++
++ case CAMIF_NORMAL_INT:
++ DPRINTK(KERN_INFO "CAMIF_NORMAL_INT\n");
++ cfg->status = CAMIF_INT_HAPPEN;
++ cfg->fsm = CAMIF_NORMAL_INT;
++ return INSTANT_GO;
++
++ case CAMIF_Xth_INT:
++ DPRINTK(KERN_INFO "CAMIF_Xth_INT\n");
++ s3c_camif_enable_lastirq(cfg);
++ cfg->status = CAMIF_INT_HAPPEN;
++ cfg->fsm = CAMIF_Yth_INT;
++ return INSTANT_GO;
++
++ case CAMIF_Yth_INT:
++ DPRINTK(KERN_INFO "CAMIF_Yth_INT\n");
++ s3c_camif_disable_lastirq(cfg);
++ cfg->capture_enable = CAMIF_DMA_OFF;
++ cfg->status = CAMIF_INT_HAPPEN;
++ s3c_camif_stop_dma(cfg);
++ cfg->fsm = CAMIF_Zth_INT;
++ return INSTANT_GO;
++
++ case CAMIF_Zth_INT:
++ DPRINTK(KERN_INFO "CAMIF_Zth_INT\n");
++ cfg->fsm = CAMIF_DUMMY_INT;
++ cfg->status = CAMIF_INT_HAPPEN;
++ s3c_camif_auto_restart(cfg);
++ return INSTANT_GO;
++
++ case CAMIF_DUMMY_INT:
++ DPRINTK(KERN_INFO "CAMIF_DUMMY_INT\n");
++ cfg->status = CAMIF_STOPPED;
++ return INSTANT_SKIP;
++
++ default:
++ printk(KERN_INFO "Unexpected INT %d\n", cfg->fsm);
++ return INSTANT_SKIP;
++ }
++}
++#endif
++
++static irqreturn_t s3c_camif_do_irq_codec(int irq, void *dev_id)
++{
++ camif_cfg_t *cfg = (camif_cfg_t *) dev_id;
++
++/* @@@ SMKD ? - WA */
++#if 0 && (defined(CONFIG_CPU_S3C6400) || defined(CONFIG_CPU_S3C6410))
++ s3c_gpio_setpin(S3C_GPN15, 1);
++#endif
++ s3c_camif_clear_irq(irq);
++ s3c_camif_get_fifo_status(cfg);
++ s3c_camif_get_frame_num(cfg);
++
++#if defined(FSM_ON_CODEC) && !defined(USE_LAST_IRQ)
++ if (s3c_camif_do_fsm_codec(cfg) == INSTANT_SKIP)
++ return IRQ_HANDLED;
++#endif
++
++#if defined(FSM_ON_CODEC) && defined(USE_LAST_IRQ)
++ if (s3c_camif_do_fsm_codec_lastirq(cfg) == INSTANT_SKIP)
++ return IRQ_HANDLED;
++#endif
++ wake_up_interruptible(&cfg->waitq);
++
++ return IRQ_HANDLED;
++}
++
++static irqreturn_t s3c_camif_do_irq_preview(int irq, void *dev_id)
++{
++ camif_cfg_t *cfg = (camif_cfg_t *) dev_id;
++
++ s3c_camif_clear_irq(irq);
++ s3c_camif_get_fifo_status(cfg);
++ s3c_camif_get_frame_num(cfg);
++ wake_up_interruptible(&cfg->waitq);
++
++#if defined(FSM_ON_PREVIEW)
++ if (s3c_camif_do_lastirq_preview(cfg) == INSTANT_SKIP)
++ return IRQ_HANDLED;
++
++ wake_up_interruptible(&cfg->waitq);
++#endif
++ cfg->status = CAMIF_INT_HAPPEN;
++
++ return IRQ_HANDLED;
++}
++
++static void s3c_camif_release_irq(camif_cfg_t * cfg)
++{
++ disable_irq(cfg->irq);
++ free_irq(cfg->irq, cfg);
++}
++
++static int s3c_camif_request_irq(camif_cfg_t * cfg)
++{
++ int ret;
++
++ if (cfg->dma_type & CAMIF_CODEC) {
++ ret = request_irq(cfg->irq, s3c_camif_do_irq_codec,
++ IRQF_SHARED, cfg->shortname, cfg);
++ if (ret)
++ printk(KERN_ERR "Request irq (CAM_C) failed\n");
++ else
++ printk(KERN_INFO "Request irq %d for codec\n",
++ cfg->irq);
++ }
++
++ if (cfg->dma_type & CAMIF_PREVIEW) {
++ ret = request_irq(cfg->irq, s3c_camif_do_irq_preview,
++ IRQF_SHARED, cfg->shortname, cfg);
++ if (ret)
++ printk("Request_irq (CAM_P) failed\n");
++ else
++ printk(KERN_INFO "Request irq %d for preview\n",
++ cfg->irq);
++ }
++
++ return 0;
++}
++
++/*************************************************************************
++ * Standard file operations part
++ ************************************************************************/
++long s3c_camif_ioctl(struct file *file, unsigned int cmd, unsigned long _arg)
++{
++ camif_cfg_t *cfg = file->private_data;
++ void *arg = (void *) _arg; /* @@@ - WA */
++
++ switch (cmd) {
++ case VIDIOC_QUERYCAP:
++ return s3c_camif_v4l2_querycap(cfg, arg);
++
++ case VIDIOC_G_FBUF:
++ return s3c_camif_v4l2_g_fbuf(cfg, arg);
++
++ case VIDIOC_S_FBUF:
++ return s3c_camif_v4l2_s_fbuf(cfg, arg);
++
++ case VIDIOC_G_FMT:
++ return s3c_camif_v4l2_g_fmt(cfg, arg);
++
++ case VIDIOC_S_FMT:
++ return s3c_camif_v4l2_s_fmt(cfg, arg);
++
++ case VIDIOC_ENUM_FMT:
++ return s3c_camif_v4l2_enum_fmt(cfg, arg);
++
++ case VIDIOC_OVERLAY:
++ return s3c_camif_v4l2_overlay(cfg, arg);
++
++ case VIDIOC_S_CTRL:
++ return s3c_camif_v4l2_s_ctrl(cfg, arg);
++
++ case VIDIOC_G_CTRL:
++ return s3c_camif_v4l2_g_ctrl(cfg, arg);
++
++ case VIDIOC_STREAMON:
++ return s3c_camif_v4l2_streamon(cfg, arg);
++
++ case VIDIOC_STREAMOFF:
++ return s3c_camif_v4l2_streamoff(cfg, arg);
++
++ case VIDIOC_G_INPUT:
++ return s3c_camif_v4l2_g_input(cfg, arg);
++
++ case VIDIOC_S_INPUT:
++ return s3c_camif_v4l2_s_input(cfg, *((int *) arg));
++
++ case VIDIOC_G_OUTPUT:
++ return s3c_camif_v4l2_g_output(cfg, arg);
++
++ case VIDIOC_S_OUTPUT:
++ return s3c_camif_v4l2_s_output(cfg, *((int *) arg));
++
++ case VIDIOC_ENUMINPUT:
++ return s3c_camif_v4l2_enum_input(cfg, arg);
++
++ case VIDIOC_ENUMOUTPUT:
++ return s3c_camif_v4l2_enum_output(cfg, arg);
++
++ case VIDIOC_REQBUFS:
++ return s3c_camif_v4l2_reqbufs(cfg, arg);
++
++ case VIDIOC_QUERYBUF:
++ return s3c_camif_v4l2_querybuf(cfg, arg);
++
++ case VIDIOC_QBUF:
++ return s3c_camif_v4l2_qbuf(cfg, arg);
++
++ case VIDIOC_DQBUF:
++ return s3c_camif_v4l2_dqbuf(cfg, arg);
++
++ case VIDIOC_S_MSDMA:
++ return s3c_camif_v4l2_s_msdma(cfg, arg);
++
++ case VIDIOC_MSDMA_START:
++ return s3c_camif_v4l2_msdma_start(cfg, arg);
++
++ case VIDIOC_MSDMA_STOP:
++ return s3c_camif_v4l2_msdma_stop(cfg, arg);
++
++ case VIDIOC_S_CAMERA_START:
++ return s3c_camif_v4l2_camera_start(cfg, arg);
++
++ case VIDIOC_S_CAMERA_STOP:
++ return s3c_camif_v4l2_camera_stop(cfg, arg);
++
++ case VIDIOC_CROPCAP:
++ return s3c_camif_v4l2_cropcap(cfg, arg);
++
++ case VIDIOC_G_CROP:
++ return s3c_camif_v4l2_g_crop(cfg, arg);
++
++ case VIDIOC_S_CROP:
++ return s3c_camif_v4l2_s_crop(cfg, arg);
++
++ case VIDIOC_S_PARM:
++ return s3c_camif_v4l2_s_parm(cfg, arg);
++
++ default: /* For v4l compatability */
++ return
++ v4l_compat_translate_ioctl(file, cmd, arg, s3c_camif_ioctl);
++ }
++}
++
++
++void om_3d7k_camera_on(void)
++{
++ extern struct pcf50633 *om_3d7k_pcf;
++ int i;
++
++ gpio_direction_output(S3C64XX_GPF(3), 0);
++
++ /* @@@ hack - WA */
++ pcf50633_reg_write(om_3d7k_pcf, 0x30, 0x21);
++ for (i = 0; !(pcf50633_reg_read(om_3d7k_pcf, 0x42) & 0x02); i++) {
++ if (i == 100) {
++ printk(KERN_ERR "can't bring up LDO2\n");
++ break;
++ }
++ msleep(10);
++ }
++
++ pcf50633_reg_write(om_3d7k_pcf, 0x39, 0x13);
++ pcf50633_reg_write(om_3d7k_pcf, 0x3a, 0x21);
++ for (i = 0; !(pcf50633_reg_read(om_3d7k_pcf, 0x42) & 0x40); i++) {
++ if (i == 100) {
++ printk(KERN_ERR "can't bring up HCLDO\n");
++ break;
++ }
++ msleep(10);
++ }
++
++ msleep(100); /* > 0 ms */
++
++ if (cam_clock)
++ clk_enable(cam_clock);
++
++ msleep(1); /* > 100 cycles */
++ gpio_direction_output(S3C64XX_GPF(3), 1);
++ msleep(25); /* > 1 Mcycles */
++ s3c_gpio_cfgpin(S3C64XX_GPF(3), S3C64XX_GPF3_CAMIF_nRST);
++ msleep(25); /* just to be sure > 1 Mcycles */
++
++ __raw_writel(__raw_readl(S3C64XX_NORMAL_CFG) |
++ S3C64XX_NORMALCFG_DOMAIN_I_ON, S3C64XX_NORMAL_CFG);
++}
++
++void om_3d7k_camera_off(void)
++{
++ extern struct pcf50633 *om_3d7k_pcf;
++
++ gpio_direction_output(S3C64XX_GPF(3), 0);
++
++ msleep(1); /* > 20 cycles */
++
++ if (cam_clock)
++ clk_disable(cam_clock);
++ msleep(1); /* > 0 ms */
++
++ /* @@@ hack - WA */
++ pcf50633_reg_write(om_3d7k_pcf, 0x3a, 0x20); /* 2V8, ... */
++ pcf50633_reg_write(om_3d7k_pcf, 0x30, 0x20); /* ... then 1V5 */
++
++#if 0
++ __raw_writel(__raw_readl(S3C64XX_NORMAL_CFG) &
++ ~S3C64XX_NORMALCFG_DOMAIN_I_ON, S3C64XX_NORMAL_CFG);
++#endif
++}
++
++
++/* @@@ - WA */
++#define s3c_camif_exclusive_open(inode, file) 0
++#define s3c_camif_exclusive_release(inode, file)
++
++int s3c_camif_open(struct file *file)
++{
++ int err;
++ camif_cfg_t *cfg =
++ s3c_camif_get_fimc_object(MINOR(file->f_dentry->d_inode->i_rdev));
++
++ if (!cfg->cis) {
++ printk(KERN_ERR "An object for a CIS is missing\n");
++ printk(KERN_ERR
++ "Using msdma_input as a default CIS data structure\n");
++ cfg->cis = &msdma_input;
++
++ /* global lock for both Codec and Preview */
++ sema_init(&cfg->cis->lock, 1);
++ cfg->cis->status |= P_NOT_WORKING;
++ }
++
++ if (cfg->dma_type & CAMIF_PREVIEW) {
++ if (cfg->dma_type & CAMIF_PREVIEW)
++ cfg->cis->status &= ~P_NOT_WORKING;
++
++ up(&cfg->cis->lock);
++ }
++
++ om_3d7k_camera_on();
++
++ err = s3c_camif_exclusive_open(inode, file);
++ cfg->cis->user++;
++ cfg->status = CAMIF_STOPPED;
++
++ if (err < 0)
++ return err;
++
++ if (file->f_flags & O_NONCAP) {
++ printk(KERN_ERR "Don't support non-capturing open\n");
++ return 0;
++ }
++
++ file->private_data = cfg;
++
++ s3c_camif_init_sensor(cfg);
++
++ return 0;
++}
++
++int s3c_camif_release(struct file *file)
++{
++ camif_cfg_t *cfg =
++ s3c_camif_get_fimc_object(MINOR(file->f_dentry->d_inode->i_rdev));
++
++ if (cfg->dma_type & CAMIF_PREVIEW) {
++ cfg->cis->status &= ~PWANT2START;
++ cfg->cis->status |= P_NOT_WORKING;
++ s3c_camif_stop_preview(cfg);
++ up(&cfg->cis->lock);
++ } else {
++ cfg->cis->status &= ~CWANT2START;
++ s3c_camif_stop_capture(cfg);
++ }
++
++ s3c_camif_exclusive_release(inode, file);
++
++ if (cfg->cis->sensor == NULL)
++ DPRINTK("A CIS sensor for MSDMA has been used\n");
++ else
++ cfg->cis->sensor->driver->command(cfg->cis->sensor, USER_EXIT,
++ NULL);
++
++ cfg->cis->user--;
++ cfg->status = CAMIF_STOPPED;
++
++ om_3d7k_camera_off();
++ cfg->cis->init_sensor = 0;
++
++ return 0;
++}
++
++ssize_t s3c_camif_read(struct file * file, char *buf, size_t count,
++ loff_t *pos)
++{
++ camif_cfg_t *cfg = NULL;
++ size_t end;
++
++ cfg = s3c_camif_get_fimc_object(MINOR(file->f_dentry->d_inode->i_rdev));
++
++#if defined(FSM_ON_PREVIEW)
++ if (cfg->dma_type == CAMIF_PREVIEW) {
++ if (wait_event_interruptible(cfg->waitq,
++ cfg->status == CAMIF_INT_HAPPEN))
++ return -ERESTARTSYS;
++
++ cfg->status = CAMIF_STOPPED;
++ }
++#endif
++
++#if defined(FSM_ON_CODEC)
++ if (cfg->dma_type == CAMIF_CODEC) {
++ if (wait_event_interruptible(cfg->waitq,
++ cfg->status == CAMIF_INT_HAPPEN))
++ return -ERESTARTSYS;
++
++ cfg->status = CAMIF_STOPPED;
++ }
++#endif
++ end = min_t(size_t, cfg->pp_totalsize / cfg->pp_num, count);
++
++ if (copy_to_user(buf, s3c_camif_get_frame(cfg), end))
++ return -EFAULT;
++
++ return end;
++}
++
++ssize_t s3c_camif_write(struct file * f, const char *b, size_t c,
++ loff_t *offset)
++{
++ camif_cfg_t *cfg;
++ int ret = 0;
++
++ cfg = s3c_camif_get_fimc_object(MINOR(f->f_dentry->d_inode->i_rdev));
++
++ switch (*b) {
++ case 'O':
++ if (cfg->dma_type & CAMIF_PREVIEW)
++ s3c_camif_start_preview(cfg);
++ else {
++ ret = s3c_camif_start_capture(cfg);
++
++ if (ret < 0)
++ ret = 1;
++ }
++
++ break;
++
++ case 'X':
++ if (cfg->dma_type & CAMIF_PREVIEW) {
++ s3c_camif_stop_preview(cfg);
++ cfg->cis->status |= P_NOT_WORKING;
++ } else {
++ cfg->cis->status &= ~C_WORKING;
++ s3c_camif_stop_capture(cfg);
++ }
++
++ break;
++
++#if defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2450) || defined(CONFIG_CPU_S3C2416)
++ case 'P':
++ if (cfg->dma_type & CAMIF_PREVIEW) {
++ s3c_camif_start_preview(cfg);
++ s3c_camif_do_postprocess(cfg);
++ return 0;
++ } else
++ return -EFAULT;
++#endif
++ default:
++ panic("s3c_camera_driver.c: s3c_camif_write() - "
++ "Unexpected Parameter\n");
++ }
++
++ return ret;
++}
++
++int s3c_camif_mmap(struct file* filp, struct vm_area_struct *vma)
++{
++ camif_cfg_t *cfg = filp->private_data;
++
++ unsigned long pageFrameNo;
++ unsigned long size = vma->vm_end - vma->vm_start;
++ unsigned long total_size;
++
++ if (cfg->dma_type == CAMIF_PREVIEW)
++ total_size = RGB_MEM;
++ else
++ total_size = YUV_MEM;
++
++ /*
++ * page frame number of the address for a source RGB frame to be stored
++ * at.
++ */
++ pageFrameNo = __phys_to_pfn(cfg->pp_phys_buf);
++
++ if (size > total_size) {
++ printk(KERN_ERR "The size of RGB_MEM mapping is too big\n");
++ return -EINVAL;
++ }
++
++ if ((vma->vm_flags & VM_WRITE) && !(vma->vm_flags & VM_SHARED)) {
++ printk(KERN_ERR "Writable RGB_MEM mapping must be shared\n");
++ return -EINVAL;
++ }
++
++ if (remap_pfn_range(vma, vma->vm_start, pageFrameNo + vma->vm_pgoff,
++ size, vma->vm_page_prot))
++ return -EINVAL;
++
++ return 0;
++}
++
++static unsigned int s3c_camif_poll(struct file *file, poll_table *wait)
++{
++ unsigned int mask = 0;
++ camif_cfg_t *cfg = file->private_data;
++
++ poll_wait(file, &cfg->waitq, wait);
++
++ if (cfg->status == CAMIF_INT_HAPPEN)
++ mask = POLLIN | POLLRDNORM;
++
++ cfg->status = CAMIF_STOPPED;
++
++ return mask;
++}
++
++struct v4l2_file_operations camif_c_fops = {
++ .owner = THIS_MODULE,
++ .open = s3c_camif_open,
++ .release = s3c_camif_release,
++ .ioctl = s3c_camif_ioctl,
++ .read = s3c_camif_read,
++ .write = s3c_camif_write,
++ .mmap = s3c_camif_mmap,
++ .poll = s3c_camif_poll,
++};
++
++struct v4l2_file_operations camif_p_fops = {
++ .owner = THIS_MODULE,
++ .open = s3c_camif_open,
++ .release = s3c_camif_release,
++ .ioctl = s3c_camif_ioctl,
++ .read = s3c_camif_read,
++ .write = s3c_camif_write,
++ .mmap = s3c_camif_mmap,
++ .poll = s3c_camif_poll,
++};
++
++/*************************************************************************
++ * Templates for V4L2
++ ************************************************************************/
++void camif_vdev_release (struct video_device *vdev) {
++ kfree(vdev);
++}
++
++struct video_device codec_template = {
++ .name = CODEC_DEV_NAME,
++#if 0
++ .type = VID_TYPE_OVERLAY | VID_TYPE_CAPTURE | VID_TYPE_CLIPPING | VID_TYPE_SCALES,
++ .type2 = V4L2_CAP_VIDEO_OVERLAY | V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING,
++ .hardware = VID_HARDWARE_SAMSUNG_FIMC3X,
++#endif
++ .fops = &camif_c_fops,
++ .release = camif_vdev_release,
++ .minor = CODEC_MINOR,
++};
++
++struct video_device preview_template = {
++ .name = PREVIEW_DEV_NAME,
++#if 0
++ .type = VID_TYPE_OVERLAY | VID_TYPE_CAPTURE | VID_TYPE_CLIPPING | VID_TYPE_SCALES,
++ .type2 = V4L2_CAP_VIDEO_OVERLAY | V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING,
++ .hardware = VID_HARDWARE_SAMSUNG_FIMC3X,
++#endif
++ .fops = &camif_p_fops,
++ .release = camif_vdev_release,
++ .minor = PREVIEW_MINOR,
++};
++
++/*************************************************************************
++ * Initialize part
++ ************************************************************************/
++void s3c_camif_init_sensor(camif_cfg_t *cfg)
++{
++ camif_cis_t *cis = cfg->cis;
++ camif_cis_t *initialized_cis;
++
++ if (!cis->sensor) {
++ initialized_cis = (camif_cis_t *) get_initialized_cis();
++
++ if (initialized_cis == NULL) {
++ printk(KERN_ERR "An I2C client for CIS sensor isn't registered\n");
++ return;
++ }
++
++ cis = cfg->cis = initialized_cis;
++ cfg->input_channel = 0;
++ cfg->cis->user++;
++ }
++
++ if (!cis->init_sensor) {
++ cis->sensor->driver->command(cis->sensor, SENSOR_INIT, NULL);
++ cis->init_sensor = 1;
++
++#if defined(CONFIG_VIDEO_SAMSUNG_S5K3BA)
++ cis->sensor->driver->command(cis->sensor, SENSOR_VGA, NULL);
++ cis->source_x = 640;
++ cis->source_y = 480;
++#elif defined(CONFIG_VIDEO_SAMSUNG_S5K4BA)
++ cis->sensor->driver->command(cis->sensor, SENSOR_SVGA, NULL);
++ cis->source_x = 800;
++ cis->source_y = 600;
++#endif
++ }
++
++ cis->sensor->driver->command(cis->sensor, USER_ADD, NULL);
++}
++
++static int s3c_camif_init_preview(camif_cfg_t * cfg)
++{
++ cfg->target_x = PREVIEW_DEFAULT_WIDTH;
++ cfg->target_y = PREVIEW_DEFAULT_WIDTH;
++ cfg->pp_num = PREVIEW_DEFAULT_PPNUM;
++ cfg->dma_type = CAMIF_PREVIEW;
++ cfg->input_channel = CAMERA_INPUT;
++ cfg->src_fmt = CAMIF_YCBCR422;
++ cfg->output_channel = CAMIF_OUT_PP;
++ cfg->dst_fmt = CAMIF_RGB16;
++ cfg->flip = CAMIF_FLIP_Y;
++ cfg->v = &preview_template;
++
++ /* @@@ - WA */
++ //init_MUTEX((struct semaphore *) &cfg->v->lock);
++ init_waitqueue_head(&cfg->waitq);
++
++ cfg->status = CAMIF_STOPPED;
++
++ /* To get the handle of CODEC */
++ cfg->other = s3c_camif_get_fimc_object(CODEC_MINOR);
++
++ return cfg->status;
++}
++
++static int s3c_camif_init_codec(camif_cfg_t * cfg)
++{
++ cfg->target_x = CODEC_DEFAULT_WIDTH;
++ cfg->target_y = CODEC_DEFAULT_HEIGHT;
++ cfg->pp_num = CODEC_DEFAULT_PPNUM;
++ cfg->dma_type = CAMIF_CODEC;
++ cfg->src_fmt = CAMIF_YCBCR422;
++ cfg->input_channel = CAMERA_INPUT;
++ cfg->dst_fmt = CAMIF_YCBCR420;
++ cfg->output_channel = CAMIF_OUT_PP;
++ cfg->flip = CAMIF_FLIP_X;
++ cfg->v = &codec_template;
++
++ /* @@@ - WA */
++ //init_MUTEX((struct semaphore *) &cfg->v->lock);
++
++ init_waitqueue_head(&cfg->waitq);
++
++ cfg->status = CAMIF_STOPPED;
++
++ /* To get the handle of PREVIEW */
++ cfg->other = s3c_camif_get_fimc_object(PREVIEW_MINOR);
++
++ return cfg->status;
++}
++
++static int s3c_camif_probe(struct platform_device *pdev)
++{
++ struct resource *res;
++ camif_cfg_t *codec, *preview;
++ struct clk *camif_clock;
++
++ /* Initialize fimc objects */
++ codec = s3c_camif_get_fimc_object(CODEC_MINOR);
++ preview = s3c_camif_get_fimc_object(PREVIEW_MINOR);
++
++ memset(codec, 0, sizeof(camif_cfg_t));
++ memset(preview, 0, sizeof(camif_cfg_t));
++
++ /* Set the fimc name */
++ strcpy(codec->shortname, CODEC_DEV_NAME);
++ strcpy(preview->shortname, PREVIEW_DEV_NAME);
++
++ /* get resource for io memory */
++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++
++ if (!res) {
++ printk("Failed to get io memory region resouce.\n");
++ return -1;
++ }
++
++ /* request mem region */
++ res = request_mem_region(res->start, res->end - res->start + 1,
++ pdev->name);
++
++ if (!res) {
++ printk("Failed to request io memory region.\n");
++ return -1;
++ }
++
++ /* ioremap for register block */
++ codec->regs = preview->regs =
++ ioremap(res->start, res->end - res->start + 1);
++
++ if (codec->regs == NULL) {
++ printk(KERN_ERR "Failed to remap register block\n");
++ return -1;
++ }
++
++ /* ioremap for reserved memory */
++ codec->pp_phys_buf = PHYS_OFFSET + (MEM_SIZE - RESERVED_MEM);
++ codec->pp_virt_buf = ioremap_nocache(codec->pp_phys_buf, YUV_MEM);
++
++ preview->pp_phys_buf =
++ PHYS_OFFSET + (MEM_SIZE - RESERVED_MEM) + YUV_MEM;
++ preview->pp_virt_buf = ioremap_nocache(preview->pp_phys_buf, RGB_MEM);
++
++ camif_clock = clk_get(&pdev->dev, "camif");
++ if (IS_ERR(camif_clock)) {
++ dev_err(&pdev->dev,
++ "Failed to find camera interface clock source\n");
++ return PTR_ERR(cam_clock);
++ }
++ clk_enable(camif_clock);
++
++ /* Device init */
++ s3c_camif_init();
++ s3c_camif_init_codec(codec);
++ s3c_camif_init_preview(preview);
++
++ /* Set irq */
++ codec->irq = platform_get_irq(pdev, FIMC_CODEC_INDEX);
++ preview->irq = platform_get_irq(pdev, FIMC_PREVIEW_INDEX);
++
++ s3c_camif_request_irq(codec);
++ s3c_camif_request_irq(preview);
++
++ /* Register to video device */
++ if (video_register_device(codec->v, VFL_TYPE_GRABBER, CODEC_MINOR) !=
++ 0) {
++ printk(KERN_ERR "Couldn't register this codec driver\n");
++ return -1;
++ }
++
++ if (video_register_device(preview->v, VFL_TYPE_GRABBER, PREVIEW_MINOR)
++ != 0) {
++ printk(KERN_ERR "Couldn't register this preview driver\n");
++ return -1;
++ }
++
++#if defined(CONFIG_CPU_S3C6400) || defined(CONFIG_CPU_S3C6410)
++ cam_clock = clk_get(&pdev->dev, "camera");
++#elif defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2416) || defined(CONFIG_CPU_S3C2450)
++ cam_clock = clk_get(&pdev->dev, "camif-upll");
++#else
++#error cam_clock should be defined
++#endif
++
++ if (IS_ERR(cam_clock)) {
++ printk("Failed to find camera clock source\n");
++ return PTR_ERR(cam_clock);
++ }
++
++ /* Print banner */
++ printk(KERN_INFO "S3C FIMC v%s\n", FIMC_VER);
++
++ return 0;
++}
++
++static int s3c_camif_remove(struct platform_device *pdev)
++{
++ camif_cfg_t *codec, *preview;
++
++ codec = s3c_camif_get_fimc_object(CODEC_MINOR);
++ preview = s3c_camif_get_fimc_object(PREVIEW_MINOR);
++
++ s3c_camif_release_irq(codec);
++ s3c_camif_release_irq(preview);
++
++ iounmap(codec->pp_virt_buf);
++ codec->pp_virt_buf = 0;
++
++ iounmap(preview->pp_virt_buf);
++ preview->pp_virt_buf = 0;
++
++ video_unregister_device(codec->v);
++ video_unregister_device(preview->v);
++
++ s3c_camif_set_priority(0);
++ clk_disable(cam_clock);
++
++ memset(codec, 0, sizeof(camif_cfg_t));
++ memset(preview, 0, sizeof(camif_cfg_t));
++
++ return 0;
++}
++
++static struct platform_driver s3c_camif_driver =
++{
++ .probe = s3c_camif_probe,
++ .remove = s3c_camif_remove,
++ .driver = {
++ .name = "s3c-camif",
++ .owner = THIS_MODULE,
++ },
++};
++
++static int s3c_camif_register(void)
++{
++ platform_driver_register(&s3c_camif_driver);
++
++ return 0;
++}
++
++static void s3c_camif_unregister(void)
++{
++ platform_driver_unregister(&s3c_camif_driver);
++}
++
++void s3c_camif_open_sensor(camif_cis_t *cis)
++{
++ clk_set_rate(cam_clock, cis->camclk);
++ s3c_camif_reset(cis->reset_type, cis->reset_udelay);
++}
++
++void s3c_camif_register_sensor(struct i2c_client *ptr)
++{
++ camif_cfg_t *codec, *preview;
++ camif_cis_t *cis = i2c_get_clientdata(ptr);
++
++ codec = s3c_camif_get_fimc_object(CODEC_MINOR);
++ preview = s3c_camif_get_fimc_object(PREVIEW_MINOR);
++
++ codec->cis = preview->cis = cis;
++
++ sema_init(&codec->cis->lock, 1);
++ sema_init(&preview->cis->lock, 1);
++
++ preview->cis->status |= P_NOT_WORKING; /* Default Value */
++
++ s3c_camif_set_polarity(preview);
++ s3c_camif_set_source_format(cis);
++ s3c_camif_set_priority(1);
++}
++
++void s3c_camif_unregister_sensor(struct i2c_client *ptr)
++{
++ camif_cis_t *cis;
++
++ cis = i2c_get_clientdata(ptr);
++ cis->init_sensor = 0;
++}
++
++module_init(s3c_camif_register);
++module_exit(s3c_camif_unregister);
++
++EXPORT_SYMBOL(s3c_camif_register_sensor);
++EXPORT_SYMBOL(s3c_camif_unregister_sensor);
++
++MODULE_AUTHOR("Jinsung Yang <jsgood.yang@samsung.com>");
++MODULE_DESCRIPTION("S3C Camera Driver for FIMC Interface");
++MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/media/video/s3c_camif.c linux-2.6.29-rc3.owrt.om/drivers/media/video/s3c_camif.c
+--- linux-2.6.29-rc3.owrt/drivers/media/video/s3c_camif.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/media/video/s3c_camif.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,1916 @@
++/* drivers/media/video/s3c_camif.c
++ *
++ * Copyright (c) 2008 Samsung Electronics
++ *
++ * Samsung S3C Camera driver
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/sched.h>
++#include <linux/completion.h>
++#include <linux/delay.h>
++#include <linux/slab.h>
++#include <linux/vmalloc.h>
++#include <linux/wait.h>
++#include <linux/videodev.h>
++#include <asm/io.h>
++#include <mach/hardware.h>
++#include <asm/uaccess.h>
++#include <mach/map.h>
++#include <mach/gpio.h>
++#include <mach/irqs.h>
++#include <plat/gpio-cfg.h>
++#include <plat/regs-camif.h>
++#include <plat/regs-gpio.h>
++#include <plat/gpio-bank-f.h>
++
++#if defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2450) || defined(CONFIG_CPU_S3C2416)
++#include <asm/arch/regs-irq.h>
++#endif
++
++#include "s3c_camif.h"
++
++#define S3C_VIDW00ADD0B0 (S3C24XX_VA_LCD+0xa0)
++#define S3C_VIDW01ADD0B0 (S3C24XX_VA_LCD+0xa8)
++
++static unsigned int irq_old_priority;
++
++/*************************************************************************
++ * Utility part
++ ************************************************************************/
++int s3c_camif_get_frame_num(camif_cfg_t *cfg)
++{
++ int index = 0;
++
++ if (cfg->dma_type & CAMIF_CODEC)
++ index = (readl(cfg->regs + S3C_CICOSTATUS) >> 26) & 0x3;
++ else {
++ assert(cfg->dma_type & CAMIF_PREVIEW);
++ index = (readl(cfg->regs + S3C_CIPRSTATUS) >> 26) & 0x3;
++ }
++
++ cfg->cur_frame_num = (index + 2) % 4; /* When 4 PingPong */
++
++ return 0;
++}
++
++unsigned char* s3c_camif_get_frame(camif_cfg_t *cfg)
++{
++ unsigned char *ret = NULL;
++ int cnt = cfg->cur_frame_num;
++
++ if (cfg->dma_type & CAMIF_PREVIEW)
++ ret = cfg->img_buf[cnt].virt_rgb;
++
++ if (cfg->dma_type & CAMIF_CODEC) {
++ if ((cfg->dst_fmt & CAMIF_RGB16) ||
++ (cfg->dst_fmt & CAMIF_RGB24))
++ ret = cfg->img_buf[cnt].virt_rgb;
++ else
++ ret = cfg->img_buf[cnt].virt_y;
++ }
++
++ return ret;
++}
++
++int s3c_camif_get_fifo_status(camif_cfg_t *cfg)
++{
++ unsigned int reg, val, flag;
++
++ if (cfg->dma_type & CAMIF_CODEC) {
++ flag = S3C_CICOSTATUS_OVFIY_CO | S3C_CICOSTATUS_OVFICB_CO |
++ S3C_CICOSTATUS_OVFICR_CO;
++ reg = readl(cfg->regs + S3C_CICOSTATUS);
++
++ if (reg & flag) {
++ /* FIFO Error Count ++ */
++ val = readl(cfg->regs + S3C_CIWDOFST);
++ val |= S3C_CIWDOFST_CLROVCOFIY |
++ S3C_CIWDOFST_CLROVCOFICB | S3C_CIWDOFST_CLROVCOFICR;
++ writel(val, cfg->regs + S3C_CIWDOFST);
++
++ val = readl(cfg->regs + S3C_CIWDOFST);
++ val &= ~(S3C_CIWDOFST_CLROVCOFIY |
++ S3C_CIWDOFST_CLROVCOFICB |
++ S3C_CIWDOFST_CLROVCOFICR);
++ writel(val, cfg->regs + S3C_CIWDOFST);
++
++ return 1; /* Error */
++ }
++ } else if (cfg->dma_type & CAMIF_PREVIEW) {
++ flag = S3C_CIPRSTATUS_OVFICB_PR | S3C_CIPRSTATUS_OVFICR_PR;
++ reg = readl(cfg->regs + S3C_CIPRSTATUS);
++
++ if (reg & flag) {
++ /* FIFO Error Count ++ */
++ val = readl(cfg->regs + S3C_CIWDOFST);
++ val |= S3C_CIWDOFST_CLROVPRFICB |
++ S3C_CIWDOFST_CLROVPRFICR;
++ writel(val, cfg->regs + S3C_CIWDOFST);
++
++ val = readl(cfg->regs + S3C_CIWDOFST);
++ val &= ~(S3C_CIWDOFST_CLROVPRFIY |
++ S3C_CIWDOFST_CLROVPRFICB |
++ S3C_CIWDOFST_CLROVPRFICR);
++ writel(val, cfg->regs + S3C_CIWDOFST);
++
++ return 1; /* Error */
++ }
++ }
++
++ return 0;
++}
++
++void s3c_camif_set_polarity(camif_cfg_t *cfg)
++{
++ camif_cis_t *cis = cfg->cis;
++ unsigned int val;
++ unsigned int cmd;
++
++ cmd = readl(cfg->regs + S3C_CIGCTRL);
++ cmd &= ~(0x7 << 24);
++
++ if (cis->polarity_pclk)
++ cmd |= S3C_CIGCTRL_INVPOLPCLK;
++
++ if (cis->polarity_vsync)
++ cmd |= S3C_CIGCTRL_INVPOLVSYNC;
++
++ if (cis->polarity_href)
++ cmd |= S3C_CIGCTRL_INVPOLHREF;
++
++ val = readl(cfg->regs + S3C_CIGCTRL);
++ val |= cmd;
++ writel(val, cfg->regs + S3C_CIGCTRL);
++}
++
++/*************************************************************************
++ * Memory part
++ ************************************************************************/
++static int s3c_camif_request_memory(camif_cfg_t *cfg)
++{
++ unsigned int t_size = 0, i = 0;
++ unsigned int area = 0;
++
++ area = cfg->target_x * cfg->target_y;
++
++ if (cfg->dma_type & CAMIF_CODEC) {
++ if (cfg->dst_fmt & CAMIF_YCBCR420)
++ t_size = area * 3 / 2; /* CAMIF_YCBCR420 */
++ else if (cfg->dst_fmt & CAMIF_YCBCR422 ||
++ cfg->dst_fmt & CAMIF_YCBCR422I)
++ t_size = area * 2; /* CAMIF_YCBCR422 */
++ else if (cfg->dst_fmt & CAMIF_RGB16)
++ t_size = area * 2; /* 2 bytes per pixel */
++ else if (cfg->dst_fmt & CAMIF_RGB24)
++ t_size = area * 4; /* 4 bytes per pixel */
++ else
++ printk(KERN_INFO "Invalid target format\n");
++ } else if (cfg->dma_type & CAMIF_PREVIEW) {
++
++ if (cfg->dst_fmt & CAMIF_RGB16)
++ t_size = area * 2; /* 2 bytes per pixel */
++ else if (cfg->dst_fmt & CAMIF_RGB24)
++ t_size = area * 4; /* 4 bytes per pixel */
++ else
++ printk(KERN_ERR "Invalid target format\n");
++
++ } else {
++ return 0;
++ }
++
++ if (t_size % PAGE_SIZE != 0) {
++ i = t_size / PAGE_SIZE;
++ t_size = (i + 1) * PAGE_SIZE;
++ }
++
++ t_size = t_size * cfg->pp_num;
++ cfg->pp_totalsize = t_size;
++
++ printk(KERN_INFO "%s memory required: 0x%08X bytes\n",
++ cfg->dma_type & CAMIF_CODEC ? "Codec" : "Preview", t_size);
++
++ return 0;
++}
++
++static void s3c_camif_calc_burst_length_yuv422i(unsigned int hsize,
++ unsigned int *mburst, unsigned int *rburst)
++{
++ unsigned int tmp, wanted;
++
++ tmp = (hsize / 2) & 0xf;
++
++ switch (tmp) {
++ case 0:
++ wanted = 16;
++ break;
++
++ case 4:
++ wanted = 4;
++ break;
++
++ case 8:
++ wanted = 8;
++ break;
++
++ default:
++ wanted = 4;
++ break;
++ }
++
++ *mburst = wanted / 2;
++ *rburst = wanted / 2;
++}
++
++static void s3c_camif_calc_burst_length(unsigned int hsize,
++ unsigned int *mburst, unsigned int *rburst)
++{
++ unsigned int tmp;
++
++ tmp = (hsize / 4) & 0xf;
++
++ switch (tmp) {
++ case 0:
++ *mburst = 16;
++ *rburst = 16;
++ break;
++
++ case 4:
++ *mburst = 16;
++ *rburst = 4;
++ break;
++
++ case 8:
++ *mburst = 16;
++ *rburst = 8;
++ break;
++
++ default:
++ tmp = (hsize / 4) % 8;
++
++ if (tmp == 0) {
++ *mburst = 8;
++ *rburst = 8;
++ } else if (tmp == 4) {
++ *mburst = 8;
++ *rburst = 4;
++ } else {
++ tmp = (hsize / 4) % 4;
++ *mburst = 4;
++ *rburst = tmp ? tmp : 4;
++ }
++
++ break;
++ }
++}
++
++int s3c_camif_setup_dma(camif_cfg_t *cfg)
++{
++ int width = cfg->target_x;
++ unsigned int val, yburst_m, yburst_r, cburst_m, cburst_r;
++
++ if (cfg->dma_type & CAMIF_CODEC) {
++ if (cfg->dst_fmt == CAMIF_RGB16 ||
++ cfg->dst_fmt == CAMIF_RGB24) {
++ if (cfg->dst_fmt == CAMIF_RGB24) {
++ if (width % 2 != 0)
++ return BURST_ERR;
++
++ s3c_camif_calc_burst_length(width * 4,
++ &yburst_m, &yburst_r);
++ } else {
++ if ((width / 2) % 2 != 0)
++ return BURST_ERR;
++
++ s3c_camif_calc_burst_length(width * 2,
++ &yburst_m, &yburst_r);
++ }
++
++ val = readl(cfg->regs + S3C_CICOCTRL);
++ val &= ~(0xfffff << 4);
++
++ if (cfg->dst_fmt == CAMIF_RGB24) {
++ val = S3C_CICOCTRL_YBURST1_CO(yburst_m / 2) |
++ S3C_CICOCTRL_YBURST2_CO(yburst_r / 4) |
++ (4 << 9) | (2 << 4);
++ } else {
++ val = S3C_CICOCTRL_YBURST1_CO(yburst_m / 2) |
++ S3C_CICOCTRL_YBURST2_CO(yburst_r / 2) |
++ (4 << 9) | (2 << 4);
++ }
++
++ writel(val, cfg->regs + S3C_CICOCTRL);
++ } else {
++ /* CODEC DMA WIDHT is multiple of 16 */
++ if (width % 16 != 0)
++ return BURST_ERR;
++
++ if (cfg->dst_fmt == CAMIF_YCBCR422I) {
++ s3c_camif_calc_burst_length_yuv422i(width,
++ &yburst_m, &yburst_r);
++ cburst_m = yburst_m / 2;
++ cburst_r = yburst_r / 2;
++ } else {
++ s3c_camif_calc_burst_length(width, &yburst_m,
++ &yburst_r);
++ s3c_camif_calc_burst_length(width / 2,
++ &cburst_m, &cburst_r);
++ }
++
++ val = readl(cfg->regs + S3C_CICOCTRL);
++ val &= ~(0xfffff << 4);
++ val |= S3C_CICOCTRL_YBURST1_CO(yburst_m) |
++ S3C_CICOCTRL_CBURST1_CO(cburst_m) |
++ S3C_CICOCTRL_YBURST2_CO(yburst_r) |
++ S3C_CICOCTRL_CBURST2_CO(cburst_r);
++ writel(val, cfg->regs + S3C_CICOCTRL);
++ }
++ } else if (cfg->dma_type & CAMIF_PREVIEW) {
++ if (cfg->dst_fmt == CAMIF_RGB24) {
++ if (width % 2 != 0)
++ return BURST_ERR;
++
++ s3c_camif_calc_burst_length(width * 4, &yburst_m,
++ &yburst_r);
++ } else {
++ if ((width / 2) % 2 != 0)
++ return BURST_ERR;
++
++ s3c_camif_calc_burst_length(width * 2, &yburst_m,
++ &yburst_r);
++ }
++
++ val = readl(cfg->regs + S3C_CIPRCTRL);
++ val &= ~(0x3ff << 14);
++ val |= S3C_CICOCTRL_YBURST1_CO(yburst_m) |
++ S3C_CICOCTRL_YBURST2_CO(yburst_r);
++ writel(val, cfg->regs + S3C_CIPRCTRL);
++ }
++
++ return 0;
++}
++
++/*************************************************************************
++ * Input path part
++ ************************************************************************/
++/*
++ * 2443 MSDMA (Preview Only)
++ */
++#if defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2450) || defined(CONFIG_CPU_S3C2416)
++int s3c_camif_input_msdma_preview(camif_cfg_t * cfg)
++{
++ unsigned int addr_start_Y, addr_start_CB, addr_start_CR;
++ unsigned int addr_end_Y, addr_end_CB, addr_end_CR;
++ unsigned int val, val_width;
++ unsigned area, div;
++
++ val = readl(cfg->regs + S3C_CIMSCTRL);
++ val &= ~(1 << 2);
++ writel(val, cfg->regs + S3C_CIMSCTRL);
++
++ val = readl(cfg->regs + S3C_CIMSCTRL);
++ val |= 1 << 2;
++ writel(val, cfg->regs + S3C_CIMSCTRL);
++
++ switch(cfg->src_fmt) {
++ case CAMIF_YCBCR420:
++ default:
++ val = readl(cfg->regs + S3C_CIMSCTRL);
++ val |= 0x1 << 1;
++ writel(val, cfg->regs + S3C_CIMSCTRL);
++
++ div = 4;
++ break;
++
++ case CAMIF_YCBCR422:
++ case CAMIF_YCBCR422I:
++ val = readl(cfg->regs + S3C_CIMSCTRL);
++ val = (val & ~(0x1 << 5)) | (0x1 << 5); /* Interleave_MS */
++ val &= ~(0x1 << 1);
++ val &= ~(0x3 << 3); /* YCbYCr */
++ writel(val, cfg->regs + S3C_CIMSCTRL);
++
++ div = 2;
++ break;
++ }
++
++ area = cfg->cis->source_x * cfg->cis->source_y;
++
++ addr_start_Y = readl(cfg->regs + S3C_CIMSYSA);
++ addr_start_CB = addr_start_Y + area;
++ addr_start_CR = addr_start_CB + area / div;
++
++ addr_end_Y = addr_start_Y + area;
++ addr_end_CB = addr_start_CB + area / div;
++ addr_end_CR = addr_start_CR + area / div;
++
++ /* MSDMA memory */
++ writel(addr_start_Y, cfg->regs + S3C_CIMSYSA);
++ writel(addr_start_CB, cfg->regs + S3C_CIMSCBSA);
++ writel(addr_start_CR, cfg->regs + S3C_CIMSCRSA);
++
++ writel(addr_end_Y, cfg->regs + S3C_CIMSYEND);
++ writel(addr_end_CB, cfg->regs + S3C_CIMSCBEND);
++ writel(addr_end_CR, cfg->regs + S3C_CIMSCREND);
++
++ /* MSDMA memory offset - default : 0 */
++ writel(0, cfg->regs + S3C_CIMSYOFF);
++ writel(0, cfg->regs + S3C_CIMSCBOFF);
++ writel(0, cfg->regs + S3C_CIMSCROFF);
++
++ /* MSDMA for codec source image width */
++ val_width = cfg->cis->source_x; /* MSCOWIDTH */
++ writel(val_width, cfg->regs + S3C_CIMSWIDTH);
++
++ return 0;
++}
++
++static int s3c_camif_input_msdma(camif_cfg_t *cfg)
++{
++ if (cfg->input_channel == MSDMA_FROM_PREVIEW)
++ s3c_camif_input_msdma_preview(cfg);
++
++ return 0;
++}
++
++/*
++ * 6400 MSDMA (Preview & Codec)
++ */
++#elif defined(CONFIG_CPU_S3C6400) || defined(CONFIG_CPU_S3C6410)
++int s3c_camif_input_msdma_codec(camif_cfg_t * cfg)
++{
++ u32 addr_start_Y, addr_start_CB, addr_start_CR;
++ u32 addr_end_Y, addr_end_CB, addr_end_CR;
++ u32 val, val_width;
++ unsigned area, div;
++
++ /* Codec path input data selection */
++ val = readl(cfg->regs + S3C_MSCOCTRL);
++ val &= ~(1 << 3);
++ writel(val, cfg->regs + S3C_MSCOCTRL);
++
++ val = readl(cfg->regs + S3C_MSCOCTRL);
++ val |= 1 << 3;
++ writel(val, cfg->regs + S3C_MSCOCTRL);
++
++ switch(cfg->src_fmt) {
++ case CAMIF_YCBCR420:
++ default:
++ val = readl(cfg->regs + S3C_MSCOCTRL);
++ val &= ~(0x3 << 1);
++ writel(val, cfg->regs + S3C_MSCOCTRL);
++
++ div = 4;
++ break;
++
++ case CAMIF_YCBCR422:
++ case CAMIF_YCBCR422I:
++ val = readl(cfg->regs + S3C_MSCOCTRL);
++ val = (val & ~(0x3 << 1)) | (0x2 << 1);
++ writel(val, cfg->regs + S3C_MSCOCTRL);
++
++ div = 2;
++ break;
++ }
++
++ area = cfg->cis->source_x * cfg->cis->source_y;
++
++ addr_start_Y = cfg->pp_phys_buf;
++ addr_start_CB = addr_start_Y + area;
++ addr_start_CR = addr_start_CB + area / div;
++
++ addr_end_Y = addr_start_Y + area;
++ addr_end_CB = addr_start_CB + area / div;
++ addr_end_CR = addr_start_CR + area / div;
++
++ /* MSDMA memory */
++ writel(addr_start_Y, cfg->regs + S3C_MSCOY0SA);
++ writel(addr_start_CB, cfg->regs + S3C_MSCOCB0SA);
++ writel(addr_start_CR, cfg->regs + S3C_MSCOCR0SA);
++
++ writel(addr_end_Y, cfg->regs + S3C_MSCOY0END);
++ writel(addr_end_CB, cfg->regs + S3C_MSCOCB0END);
++ writel(addr_end_CR, cfg->regs + S3C_MSCOCR0END);
++
++ /* MSDMA memory offset */
++ writel(0, cfg->regs + S3C_MSCOYOFF);
++ writel(0, cfg->regs + S3C_MSCOCBOFF);
++ writel(0, cfg->regs + S3C_MSCOCROFF);
++
++ /* MSDMA for codec source image width */
++ val_width = readl(cfg->regs + S3C_MSCOWIDTH);
++ val_width &= ~0x0fffffff;
++ val_width |= 0x1 << 31; /* AutoLoadEnable */
++ val_width |= cfg->cis->source_y << 16; /* MSCOHEIGHT */
++ val_width |= cfg->cis->source_x; /* MSCOWIDTH */
++ writel(val_width, cfg->regs + S3C_MSCOWIDTH);
++
++ return 0;
++}
++
++int s3c_camif_input_msdma_preview(camif_cfg_t * cfg)
++{
++ int ret = 0;
++ unsigned int addr_start_Y, addr_start_CB, addr_start_CR;
++ unsigned int addr_end_Y, addr_end_CB, addr_end_CR;
++ unsigned int val, val_width;
++ unsigned area, div;
++
++ val = readl(cfg->regs + S3C_CIMSCTRL);
++ val &= ~(0x1 << 3);
++ writel(val, cfg->regs + S3C_CIMSCTRL);
++
++ val = readl(cfg->regs + S3C_CIMSCTRL);
++ val |= 0x1 << 3;
++ writel(val, cfg->regs + S3C_CIMSCTRL);
++
++ switch(cfg->src_fmt) {
++ case CAMIF_YCBCR420:
++ default:
++ val = readl(cfg->regs + S3C_CIMSCTRL);
++ val &= ~(0x3 << 1);
++ writel(val, cfg->regs + S3C_CIMSCTRL);
++
++ div = 4;
++ break;
++
++ case CAMIF_YCBCR422:
++ case CAMIF_YCBCR422I:
++ val = readl(cfg->regs + S3C_CIMSCTRL);
++ val = (val & ~(0x3 << 1)) | (0x2 << 1); /* YCbCr 422 Interleave */
++ val = (val & ~(0x3 << 4)) | (0x3 << 4); /* YCbYCr */
++ writel(val, cfg->regs + S3C_CIMSCTRL);
++
++ div = 2;
++ break;
++ }
++
++ area = cfg->cis->source_x * cfg->cis->source_y;
++
++ addr_start_Y = readl(cfg->regs + S3C_MSPRY0SA);
++ addr_start_CB = addr_start_Y + area;
++ addr_start_CR = addr_start_CB + area / div;
++
++ addr_end_Y = addr_start_Y + area;
++ addr_end_CB = addr_start_CB + area / div;
++ addr_end_CR = addr_start_CR + area / div;
++
++ /* MSDMA memory */
++ writel(addr_start_Y, cfg->regs + S3C_MSPRY0SA);
++ writel(addr_start_CB, cfg->regs + S3C_MSPRCB0SA);
++ writel(addr_start_CR, cfg->regs + S3C_MSPRCR0SA);
++
++ writel(addr_end_Y, cfg->regs + S3C_MSPRY0END);
++ writel(addr_end_CB, cfg->regs + S3C_MSPRCB0END);
++ writel(addr_end_CR, cfg->regs + S3C_MSPRCR0END);
++
++ /* MSDMA memory offset */
++ writel(0, cfg->regs + S3C_MSPRYOFF);
++ writel(0, cfg->regs + S3C_MSPRCBOFF);
++ writel(0, cfg->regs + S3C_MSPRCROFF);
++
++ /* MSDMA for codec source image width */
++ val_width = readl(cfg->regs + S3C_MSPRWIDTH);
++ val_width &= ~(0x1 << 31); /* AutoLoadEnable */
++ val_width &= ~0x0fffffff;
++ val_width |= cfg->cis->source_y << 16; /* MSCOHEIGHT */
++ val_width |= cfg->cis->source_x; /* MSCOWIDTH */
++ writel(val_width, cfg->regs + S3C_MSPRWIDTH);
++
++ return ret;
++}
++
++static int s3c_camif_input_msdma(camif_cfg_t *cfg)
++{
++ if (cfg->input_channel == MSDMA_FROM_PREVIEW)
++ s3c_camif_input_msdma_preview(cfg);
++ else if (cfg->input_channel == MSDMA_FROM_CODEC)
++ s3c_camif_input_msdma_codec(cfg);
++
++ return 0;
++}
++#endif
++
++static int s3c_camif_input_camera(camif_cfg_t *cfg)
++{
++ unsigned int val;
++
++ s3c_camif_set_offset(cfg->cis);
++
++ if (cfg->dma_type & CAMIF_CODEC) {
++#if defined(CONFIG_CPU_S3C6400) || defined(CONFIG_CPU_S3C6410)
++ val = readl(cfg->regs + S3C_MSCOCTRL);
++ val &= ~(1 << 3);
++ writel(val, cfg->regs + S3C_MSCOCTRL);
++#endif
++ } else if (cfg->dma_type & CAMIF_PREVIEW) {
++#if defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2450)
++ val = readl(cfg->regs + S3C_CIMSCTRL);
++ val &= ~(1 << 2);
++ writel(val, cfg->regs + S3C_CIMSCTRL);
++#elif defined(CONFIG_CPU_S3C6400)
++ val = readl(cfg->regs + S3C_CIMSCTRL);
++ val &= ~(1 << 3);
++ writel(val, cfg->regs + S3C_CIMSCTRL);
++#endif
++ } else
++ printk(KERN_ERR "Invalid DMA type\n");
++
++ return 0;
++}
++
++static int s3c_camif_setup_input_path(camif_cfg_t *cfg)
++{
++ if (cfg->input_channel == CAMERA_INPUT)
++ s3c_camif_input_camera(cfg);
++ else
++ s3c_camif_input_msdma(cfg);
++
++ return 0;
++}
++
++/*************************************************************************
++ * Output path part
++ ************************************************************************/
++static int s3c_camif_output_pp_codec_rgb(camif_cfg_t *cfg)
++{
++ int i;
++ unsigned int val;
++ unsigned int area = cfg->target_x * cfg->target_y;
++
++ if (cfg->dst_fmt & CAMIF_RGB24)
++ area = area * 4;
++ else {
++ assert (cfg->dst_fmt & CAMIF_RGB16);
++ area = area * 2;
++ }
++
++ if ((area % PAGE_SIZE) != 0) {
++ i = area / PAGE_SIZE;
++ area = (i + 1) * PAGE_SIZE;
++ }
++
++ cfg->buffer_size = area;
++
++ if (cfg->input_channel == MSDMA_FROM_CODEC) {
++{
++void __iomem *S3C24XX_VA_LCD = ioremap(S3C64XX_PA_FB, 1024*1024);
++ val = readl(S3C_VIDW00ADD0B0);
++}
++
++ for (i = 0; i < 4; i++)
++ writel(val, cfg->regs + S3C_CICOYSA(i));
++ } else {
++ switch ( cfg->pp_num ) {
++ case 1:
++ for (i = 0; i < 4; i++) {
++ cfg->img_buf[i].virt_rgb = cfg->pp_virt_buf;
++ cfg->img_buf[i].phys_rgb = cfg->pp_phys_buf;
++ writel(cfg->img_buf[i].phys_rgb,
++ cfg->regs + S3C_CICOYSA(i));
++ }
++
++ break;
++
++ case 2:
++ for (i = 0; i < 4; i++) {
++ cfg->img_buf[i].virt_rgb = cfg->pp_virt_buf;
++ cfg->img_buf[i].phys_rgb = cfg->pp_phys_buf;
++ if (i & 1) {
++ cfg->img_buf[i].virt_rgb += area;
++ cfg->img_buf[i].phys_rgb += area;
++ }
++ writel(cfg->img_buf[i].phys_rgb,
++ cfg->regs + S3C_CICOYSA(i));
++ }
++
++ break;
++
++ case 4:
++ for (i = 0; i < 4; i++) {
++ cfg->img_buf[i].virt_rgb =
++ cfg->pp_virt_buf + i * area;
++ cfg->img_buf[i].phys_rgb =
++ cfg->pp_phys_buf + i * area;
++ writel(cfg->img_buf[i].phys_rgb,
++ cfg->regs + S3C_CICOYSA(i));
++ }
++
++ break;
++
++ default:
++ printk(KERN_ERR "Invalid pingpong number %d\n",
++ cfg->pp_num);
++ panic("s3c camif halt\n");
++ }
++ }
++
++ return 0;
++}
++
++static int s3c_camif_output_pp_codec(camif_cfg_t *cfg)
++{
++ unsigned int i, cbcr_size = 0;
++ unsigned int area = cfg->target_x * cfg->target_y;
++ unsigned int one_p_size;
++
++ area = cfg->target_x * cfg->target_y;
++
++ if (cfg->dst_fmt & CAMIF_YCBCR420)
++ cbcr_size = area / 4;
++ else if (cfg->dst_fmt & CAMIF_YCBCR422 ||
++ cfg->dst_fmt & CAMIF_YCBCR422I)
++ cbcr_size = area / 2;
++ else if ((cfg->dst_fmt & CAMIF_RGB16) || (cfg->dst_fmt & CAMIF_RGB24)) {
++ s3c_camif_output_pp_codec_rgb(cfg);
++ return 0;
++ } else
++ printk(KERN_ERR "Invalid target format %d\n", cfg->dst_fmt);
++
++ one_p_size = area + 2 * cbcr_size;
++
++ if ((one_p_size % PAGE_SIZE) != 0) {
++ i = one_p_size / PAGE_SIZE;
++ one_p_size = (i + 1) * PAGE_SIZE;
++ }
++
++ cfg->buffer_size = one_p_size;
++
++ switch (cfg->pp_num) {
++ case 1 :
++ for (i = 0; i < 4; i++) {
++ cfg->img_buf[i].virt_y = cfg->pp_virt_buf;
++ cfg->img_buf[i].phys_y = cfg->pp_phys_buf;
++ cfg->img_buf[i].virt_cb = cfg->pp_virt_buf + area;
++ cfg->img_buf[i].phys_cb = cfg->pp_phys_buf + area;
++ cfg->img_buf[i].virt_cr = cfg->pp_virt_buf + area + cbcr_size;
++ cfg->img_buf[i].phys_cr = cfg->pp_phys_buf + area + cbcr_size;
++ writel(cfg->img_buf[i].phys_y, cfg->regs + S3C_CICOYSA(i));
++ writel(cfg->img_buf[i].phys_cb, cfg->regs + S3C_CICOCBSA(i));
++ writel(cfg->img_buf[i].phys_cr, cfg->regs + S3C_CICOCRSA(i));
++ }
++
++ break;
++
++ case 2:
++ for (i = 0; i < 4; i++) {
++ cfg->img_buf[i].virt_y = cfg->pp_virt_buf;
++ cfg->img_buf[i].phys_y = cfg->pp_phys_buf;
++ cfg->img_buf[i].virt_cb = cfg->pp_virt_buf + area;
++ cfg->img_buf[i].phys_cb = cfg->pp_phys_buf + area;
++ cfg->img_buf[i].virt_cr =
++ cfg->pp_virt_buf + area + cbcr_size;
++ cfg->img_buf[i].phys_cr =
++ cfg->pp_phys_buf + area + cbcr_size;
++
++ if (i & 1) {
++ cfg->img_buf[i].virt_y += one_p_size;
++ cfg->img_buf[i].phys_y += one_p_size;
++ cfg->img_buf[i].virt_cb += one_p_size;
++ cfg->img_buf[i].phys_cb += one_p_size;
++ cfg->img_buf[i].virt_cr += one_p_size;
++ cfg->img_buf[i].phys_cr += one_p_size;
++ }
++
++ writel(cfg->img_buf[i].phys_y,
++ cfg->regs + S3C_CICOYSA(i));
++ writel(cfg->img_buf[i].phys_cb,
++ cfg->regs + S3C_CICOCBSA(i));
++ writel(cfg->img_buf[i].phys_cr,
++ cfg->regs + S3C_CICOCRSA(i));
++ }
++
++ break;
++
++ case 4:
++ for (i = 0; i < 4; i++) {
++ cfg->img_buf[i].virt_y =
++ cfg->pp_virt_buf + i * one_p_size;
++ cfg->img_buf[i].phys_y =
++ cfg->pp_phys_buf + i * one_p_size;
++ cfg->img_buf[i].virt_cb =
++ cfg->pp_virt_buf + area + i * one_p_size;
++ cfg->img_buf[i].phys_cb =
++ cfg->pp_phys_buf + area + i * one_p_size;
++ cfg->img_buf[i].virt_cr = cfg->pp_virt_buf +
++ area + cbcr_size + i * one_p_size;
++ cfg->img_buf[i].phys_cr = cfg->pp_phys_buf +
++ area + cbcr_size + i * one_p_size;
++ writel(cfg->img_buf[i].phys_y,
++ cfg->regs + S3C_CICOYSA(i));
++ writel(cfg->img_buf[i].phys_cb,
++ cfg->regs + S3C_CICOCBSA(i));
++ writel(cfg->img_buf[i].phys_cr,
++ cfg->regs + S3C_CICOCRSA(i));
++ }
++
++ break;
++
++ default:
++ printk(KERN_ERR "Invalid pingpong number %d\n", cfg->pp_num);
++ }
++
++ return 0;
++}
++
++#if defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2450) || defined(CONFIG_CPU_S3C2416)
++static int s3c_camif_io_duplex_preview(camif_cfg_t *cfg)
++{
++ unsigned int cbcr_size = 0;
++ unsigned int area = cfg->cis->source_x * cfg->cis->source_y;
++ unsigned int val;
++ int i;
++
++ val = readl(S3C_VIDW01ADD0);
++
++ if (!((cfg->dst_fmt & CAMIF_RGB16) || (cfg->dst_fmt & CAMIF_RGB24)))
++ printk(KERN_ERR "Invalid target format\n");
++
++ for (i = 0; i < 4; i++)
++ writel(val, cfg->regs + S3C_CIPRYSA(i));
++
++ if (cfg->src_fmt & CAMIF_YCBCR420) {
++ cbcr_size = area / 4;
++ cfg->img_buf[0].virt_cb = cfg->pp_virt_buf + area;
++ cfg->img_buf[0].phys_cb = cfg->pp_phys_buf + area;
++ cfg->img_buf[0].virt_cr = cfg->pp_virt_buf + area + cbcr_size;
++ cfg->img_buf[0].phys_cr = cfg->pp_phys_buf + area + cbcr_size;
++ } else if (cfg->src_fmt & CAMIF_YCBCR422 || cfg->dst_fmt & CAMIF_YCBCR422I) {
++ area = area * 2;
++ cfg->img_buf[0].virt_cb = 0;
++ cfg->img_buf[0].phys_cb = 0;
++ cfg->img_buf[0].virt_cr = 0;
++ cfg->img_buf[0].phys_cr = 0;
++ }
++
++ cfg->img_buf[0].virt_y = cfg->pp_virt_buf;
++ cfg->img_buf[0].phys_y = cfg->pp_phys_buf;
++
++ writel(cfg->img_buf[0].phys_y, cfg->regs + S3C_CIMSYSA);
++ writel(cfg->img_buf[0].phys_y + area, cfg->regs + S3C_CIMSYEND);
++
++ writel(cfg->img_buf[0].phys_cb, cfg->regs + S3C_CIMSCBSA);
++ writel(cfg->img_buf[0].phys_cb + cbcr_size, cfg->regs + S3C_CIMSCBEND);
++
++ writel(cfg->img_buf[0].phys_cr, cfg->regs + S3C_CIMSCRSA);
++ writel(cfg->img_buf[0].phys_cr + cbcr_size, cfg->regs + S3C_CIMSCREND);
++
++ writel(cfg->cis->source_x, cfg->regs + S3C_CIMSWIDTH);
++
++ return 0;
++}
++#elif defined(CONFIG_CPU_S3C6400) || defined(CONFIG_CPU_S3C6410)
++static int s3c_camif_io_duplex_preview(camif_cfg_t *cfg)
++{
++ unsigned int cbcr_size = 0;
++ unsigned int area = cfg->cis->source_x * cfg->cis->source_y;
++ unsigned int val;
++ int i;
++
++{
++void __iomem *S3C24XX_VA_LCD = ioremap(S3C64XX_PA_FB, 1024*1024);
++ val = readl(S3C_VIDW01ADD0B0);
++}
++
++ if (!((cfg->dst_fmt & CAMIF_RGB16) || (cfg->dst_fmt & CAMIF_RGB24)))
++ printk(KERN_ERR "Invalid target format\n");
++
++ for (i = 0; i < 4; i++)
++ writel(val, cfg->regs + S3C_CIPRYSA(i));
++
++ if (cfg->src_fmt & CAMIF_YCBCR420) {
++ cbcr_size = area / 4;
++ cfg->img_buf[0].virt_cb = cfg->pp_virt_buf + area;
++ cfg->img_buf[0].phys_cb = cfg->pp_phys_buf + area;
++ cfg->img_buf[0].virt_cr = cfg->pp_virt_buf + area + cbcr_size;
++ cfg->img_buf[0].phys_cr = cfg->pp_phys_buf + area + cbcr_size;
++ } else if (cfg->src_fmt & CAMIF_YCBCR422 ||
++ cfg->dst_fmt & CAMIF_YCBCR422I) {
++ area = area * 2;
++ cfg->img_buf[0].virt_cb = 0;
++ cfg->img_buf[0].phys_cb = 0;
++ cfg->img_buf[0].virt_cr = 0;
++ cfg->img_buf[0].phys_cr = 0;
++ }
++
++ cfg->img_buf[0].virt_y = cfg->pp_virt_buf;
++ cfg->img_buf[0].phys_y = cfg->pp_phys_buf;
++
++ writel(cfg->img_buf[0].phys_y, cfg->regs + S3C_MSPRY0SA);
++ writel(cfg->img_buf[0].phys_y + area, cfg->regs + S3C_MSPRY0END);
++
++ writel(cfg->img_buf[0].phys_cb, cfg->regs + S3C_MSPRCB0SA);
++ writel(cfg->img_buf[0].phys_cb + cbcr_size, cfg->regs + S3C_MSPRCB0END);
++
++ writel(cfg->img_buf[0].phys_cr, cfg->regs + S3C_MSPRCR0SA);
++ writel(cfg->img_buf[0].phys_cr + cbcr_size, cfg->regs + S3C_MSPRCR0END);
++
++ val = readl(cfg->regs + S3C_MSCOWIDTH);
++ val |= 0x1 << 31;
++ val |= cfg->cis->source_y << 16;
++ val |= cfg->cis->source_x;
++ writel(val, cfg->regs + S3C_MSPRWIDTH);
++
++ return 0;
++}
++#endif
++
++static int s3c_camif_output_pp_preview(camif_cfg_t *cfg)
++{
++ int i;
++ unsigned int cbcr_size = 0;
++ unsigned int area = cfg->target_x * cfg->target_y;
++
++ if (cfg->input_channel) {
++ s3c_camif_io_duplex_preview(cfg);
++ return 0;
++ }
++
++ if (cfg->dst_fmt & CAMIF_YCBCR420)
++ cbcr_size = area / 4;
++ else if (cfg->dst_fmt & CAMIF_YCBCR422 ||
++ cfg->dst_fmt & CAMIF_YCBCR422I)
++ cbcr_size = area / 2;
++ else if (cfg->dst_fmt & CAMIF_RGB24)
++ area = area * 4;
++ else if (cfg->dst_fmt & CAMIF_RGB16)
++ area = area * 2;
++ else
++ printk(KERN_ERR "Invalid target format %d\n", cfg->dst_fmt);
++
++ if ((area % PAGE_SIZE) != 0) {
++ i = area / PAGE_SIZE;
++ area = (i + 1) * PAGE_SIZE;
++ }
++
++ cfg->buffer_size = area;
++
++ switch (cfg->pp_num) {
++ case 1:
++ for (i = 0; i < 4; i++) {
++ cfg->img_buf[i].virt_rgb = cfg->pp_virt_buf;
++ cfg->img_buf[i].phys_rgb = cfg->pp_phys_buf;
++ writel(cfg->img_buf[i].phys_rgb,
++ cfg->regs + S3C_CIPRYSA(i));
++ }
++
++ break;
++
++ case 2:
++ for (i = 0; i < 4; i++) {
++ cfg->img_buf[i].virt_rgb = cfg->pp_virt_buf;
++ cfg->img_buf[i].phys_rgb = cfg->pp_phys_buf;
++ if (i & 1) {
++ cfg->img_buf[i].virt_rgb += area;
++ cfg->img_buf[i].phys_rgb += area;
++ }
++
++ writel(cfg->img_buf[i].phys_rgb,
++ cfg->regs + S3C_CIPRYSA(i));
++ }
++
++ break;
++
++ case 4:
++ for (i = 0; i < 4; i++) {
++ cfg->img_buf[i].virt_rgb = cfg->pp_virt_buf + i * area;
++ cfg->img_buf[i].phys_rgb = cfg->pp_phys_buf + i * area;
++ writel(cfg->img_buf[i].phys_rgb,
++ cfg->regs + S3C_CIPRYSA(i));
++ }
++
++ break;
++
++ default:
++ printk(KERN_ERR "Invalid pingpong number %d\n", cfg->pp_num);
++ }
++
++ return 0;
++}
++
++static int s3c_camif_output_pp(camif_cfg_t *cfg)
++{
++ if (cfg->dma_type & CAMIF_CODEC)
++ s3c_camif_output_pp_codec(cfg);
++ else if (cfg->dma_type & CAMIF_PREVIEW)
++ s3c_camif_output_pp_preview(cfg);
++
++ return 0;
++}
++
++static int s3c_camif_output_lcd(camif_cfg_t *cfg)
++{
++ /* To Be Implemented */
++ return 0;
++}
++
++static int s3c_camif_setup_output_path(camif_cfg_t *cfg)
++{
++ if (cfg->output_channel == CAMIF_OUT_FIFO)
++ s3c_camif_output_lcd(cfg);
++ else
++ s3c_camif_output_pp(cfg);
++
++ return 0;
++}
++
++/*************************************************************************
++ * Scaler part
++ ************************************************************************/
++static int s3c_camif_set_target_area(camif_cfg_t *cfg)
++{
++ unsigned int rect = cfg->target_x * cfg->target_y;
++
++ if (cfg->dma_type & CAMIF_CODEC)
++ writel(rect, cfg->regs + S3C_CICOTAREA);
++ else if (cfg->dma_type & CAMIF_PREVIEW)
++ writel(rect, cfg->regs + S3C_CIPRTAREA);
++
++ return 0;
++}
++
++#if defined(CONFIG_CPU_S3C6400) || defined(CONFIG_CPU_S3C6410)
++static inline int s3c_camif_set_ratio(camif_cfg_t *cfg)
++{
++ unsigned int cmd =
++ S3C_CICOSCCTRL_CSCR2Y_WIDE | S3C_CICOSCCTRL_CSCY2R_WIDE;
++
++ if (cfg->dma_type & CAMIF_CODEC) {
++
++ writel(S3C_CICOSCPRERATIO_SHFACTOR_CO(cfg->sc.shfactor) |
++ S3C_CICOSCPRERATIO_PREHORRATIO_CO(cfg->sc.prehratio) |
++ S3C_CICOSCPRERATIO_PREVERRATIO_CO(cfg->sc.prevratio),
++ cfg->regs + S3C_CICOSCPRERATIO);
++
++ writel(S3C_CICOSCPREDST_PREDSTWIDTH_CO(cfg->sc.predst_x) |
++ S3C_CICOSCPREDST_PREDSTHEIGHT_CO(cfg->sc.predst_y),
++ cfg->regs + S3C_CICOSCPREDST);
++
++ /* Differ from Preview */
++ if (cfg->sc.scalerbypass)
++ cmd |= S3C_CICOSCCTRL_SCALERBYPASS_CO;
++
++ /* Differ from Codec */
++ if (cfg->dst_fmt & CAMIF_RGB24)
++ cmd |= S3C_CICOSCCTRL_OUTRGB_FMT_RGB888;
++ else
++ cmd |= S3C_CICOSCCTRL_OUTRGB_FMT_RGB565;
++
++ if (cfg->sc.scaleup_h & cfg->sc.scaleup_v)
++ cmd |=
++ S3C_CICOSCCTRL_SCALEUP_H | S3C_CICOSCCTRL_SCALEUP_V;
++
++ writel(cmd |
++ S3C_CICOSCCTRL_MAINHORRATIO_CO(cfg->sc.mainhratio) |
++ S3C_CICOSCCTRL_MAINVERRATIO_CO(cfg->sc.mainvratio),
++ cfg->regs + S3C_CICOSCCTRL);
++
++ } else if (cfg->dma_type & CAMIF_PREVIEW) {
++ writel(S3C_CIPRSCPRERATIO_SHFACTOR_PR(cfg->sc.shfactor) |
++ S3C_CIPRSCPRERATIO_PREHORRATIO_PR(cfg->sc.prehratio) |
++ S3C_CIPRSCPRERATIO_PREVERRATIO_PR(cfg->sc.prevratio),
++ cfg->regs + S3C_CIPRSCPRERATIO);
++
++ writel(S3C_CIPRSCPREDST_PREDSTWIDTH_PR(cfg->sc.predst_x) |
++ S3C_CIPRSCPREDST_PREDSTHEIGHT_PR(cfg->sc.predst_y),
++ cfg->regs + S3C_CIPRSCPREDST);
++
++ if (cfg->dst_fmt & CAMIF_RGB24)
++ cmd |= S3C_CIPRSCCTRL_OUTRGB_FMT_PR_RGB888;
++ else
++ cmd |= S3C_CIPRSCCTRL_OUTRGB_FMT_PR_RGB565;
++
++ if (cfg->sc.scaleup_h & cfg->sc.scaleup_v)
++ cmd |= (1 << 30) | (1 << 29);
++
++ writel(cmd |
++ S3C_CIPRSCCTRL_MAINHORRATIO_PR(cfg->sc.mainhratio) |
++ S3C_CIPRSCCTRL_MAINVERRATIO_PR(cfg->sc.mainvratio),
++ cfg->regs + S3C_CIPRSCCTRL);
++
++ } else
++ printk(KERN_ERR "Invalid DMA type\n");
++
++ return 0;
++}
++#elif defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2450) || defined(CONFIG_CPU_S3C2416)
++static inline int s3c_camif_set_ratio(camif_cfg_t *cfg)
++{
++ u32 cmd = 0;
++
++ if (cfg->dma_type & CAMIF_CODEC) {
++
++ writel(S3C_CICOSCPRERATIO_SHFACTOR_CO(cfg->sc.shfactor) |
++ S3C_CICOSCPRERATIO_PREHORRATIO_CO(cfg->sc.prehratio) |
++ S3C_CICOSCPRERATIO_PREVERRATIO_CO(cfg->sc.prevratio),
++ cfg->regs + S3C_CICOSCPRERATIO);
++
++ writel(S3C_CICOSCPREDST_PREDSTWIDTH_CO(cfg->sc.predst_x) |
++ S3C_CICOSCPREDST_PREDSTHEIGHT_CO(cfg->sc.predst_y),
++ cfg->regs + S3C_CICOSCPREDST);
++
++ if (cfg->sc.scalerbypass)
++ cmd |= S3C_CICOSCCTRL_SCALERBYPASS_CO;
++
++ if (cfg->sc.scaleup_h & cfg->sc.scaleup_v)
++ cmd |=
++ S3C_CICOSCCTRL_SCALEUP_H | S3C_CICOSCCTRL_SCALEUP_V;
++
++ writel(cmd |
++ S3C_CICOSCCTRL_MAINHORRATIO_CO(cfg->sc.mainhratio) |
++ S3C_CICOSCCTRL_MAINVERRATIO_CO(cfg->sc.mainvratio),
++ cfg->regs + S3C_CICOSCCTRL);
++
++ } else if (cfg->dma_type & CAMIF_PREVIEW) {
++
++ cmd |= S3C_CIPRSCCTRL_SAMPLE_PR;
++
++ writel(S3C_CIPRSCPRERATIO_SHFACTOR_PR(cfg->sc.shfactor) |
++ S3C_CIPRSCPRERATIO_PREHORRATIO_PR(cfg->sc.prehratio) |
++ S3C_CIPRSCPRERATIO_PREVERRATIO_PR(cfg->sc.prevratio),
++ cfg->regs + S3C_CIPRSCPRERATIO);
++
++ writel(S3C_CIPRSCPREDST_PREDSTWIDTH_PR(cfg->sc.predst_x) |
++ S3C_CIPRSCPREDST_PREDSTHEIGHT_PR(cfg->sc.predst_y),
++ cfg->regs + S3C_CIPRSCPREDST);
++
++ if (cfg->dst_fmt & CAMIF_RGB24)
++ cmd |= S3C_CIPRSCCTRL_RGBFORMAT_24;
++
++ if (cfg->sc.scaleup_h & cfg->sc.scaleup_v)
++ cmd |= (1 << 29) | (1 << 28);
++
++ writel(cmd |
++ S3C_CIPRSCCTRL_MAINHORRATIO_PR(cfg->sc.mainhratio) |
++ S3C_CIPRSCCTRL_MAINVERRATIO_PR(cfg->sc.mainvratio),
++ cfg->regs + S3C_CIPRSCCTRL);
++
++ } else
++ printk(KERN_ERR "Invalid DMA type\n");
++
++ return 0;
++}
++#endif
++
++static int s3c_camif_calc_ratio(unsigned int src_width, unsigned int dst_width,
++ unsigned int *ratio, unsigned int *shift)
++{
++ if (src_width >= 64 * dst_width) {
++ printk(KERN_ERR "Out of pre-scaler range: "
++ "src_width / dst_width = %d (< 64)\n",
++ src_width / dst_width);
++ return 1;
++ }
++ if (src_width >= 32 * dst_width) {
++ *shift = 5;
++ } else if (src_width >= 16 * dst_width) {
++ *shift = 4;
++ } else if (src_width >= 8 * dst_width) {
++ *shift = 3;
++ } else if (src_width >= 4 * dst_width) {
++ *shift = 2;
++ } else if (src_width >= 2 * dst_width) {
++ *shift = 1;
++ } else {
++ *shift = 0;
++ }
++
++ *ratio = 1 << *shift;
++
++ return 0;
++}
++
++static int s3c_camif_setup_scaler(camif_cfg_t *cfg)
++{
++ int tx = cfg->target_x, ty = cfg->target_y;
++ int sx, sy;
++
++ if (tx <= 0 || ty <= 0) {
++ printk(KERN_ERR "Invalid target size\n");
++ return -1;
++ }
++
++ sx = cfg->cis->source_x -
++ (cfg->cis->win_hor_ofst + cfg->cis->win_hor_ofst2);
++ sy = cfg->cis->source_y -
++ (cfg->cis->win_ver_ofst + cfg->cis->win_hor_ofst2);
++
++ if (sx <= 0 || sy <= 0) {
++ printk(KERN_ERR "Invalid source size\n");
++ return -1;
++ }
++
++ cfg->sc.modified_src_x = sx;
++ cfg->sc.modified_src_y = sy;
++
++ /* Pre-scaler control register 1 */
++ s3c_camif_calc_ratio(sx, tx, &cfg->sc.prehratio, &cfg->sc.hfactor);
++ s3c_camif_calc_ratio(sy, ty, &cfg->sc.prevratio, &cfg->sc.vfactor);
++
++ if (cfg->dma_type & CAMIF_PREVIEW) {
++ if (sx / cfg->sc.prehratio > 640) {
++ printk(KERN_INFO "Internal preview line buffer length "
++ "is 640 pixels\n");
++ printk(KERN_INFO "Decrease the resolution or adjust "
++ "window offset values appropriately\n");
++ }
++ }
++
++ cfg->sc.shfactor = 10 - (cfg->sc.hfactor + cfg->sc.vfactor);
++
++ /* Pre-scaler control register 2 */
++ cfg->sc.predst_x = sx / cfg->sc.prehratio;
++ cfg->sc.predst_y = sy / cfg->sc.prevratio;
++
++ /* Main-scaler control register */
++ cfg->sc.mainhratio = (sx << 8) / (tx << cfg->sc.hfactor);
++ cfg->sc.mainvratio = (sy << 8) / (ty << cfg->sc.vfactor);
++
++ cfg->sc.scaleup_h = sx <= tx;
++ cfg->sc.scaleup_v = sy <= ty;
++
++ s3c_camif_set_ratio(cfg);
++ s3c_camif_set_target_area(cfg);
++
++ return 0;
++}
++
++/*************************************************************************
++ * Format part
++ ************************************************************************/
++int s3c_camif_set_source_format(camif_cis_t *cis)
++{
++ camif_cfg_t *cfg = s3c_camif_get_fimc_object(CODEC_MINOR);
++ unsigned int cmd = 0;
++
++ /* Configure CISRCFMT --Source Format */
++ if (cis->itu_fmt & CAMIF_ITU601)
++ cmd = CAMIF_ITU601;
++ else {
++ assert(cis->itu_fmt & CAMIF_ITU656);
++ cmd = CAMIF_ITU656;
++ }
++
++ cmd |= S3C_CISRCFMT_SOURCEHSIZE(cis->source_x) |
++ S3C_CISRCFMT_SOURCEVSIZE(cis->source_y);
++
++ /* Order422 */
++ cmd |= cis->order422;
++ writel(cmd, cfg->regs + S3C_CISRCFMT);
++
++#if defined(CONFIG_CPU_S3C6400) || defined(CONFIG_CPU_S3C6410)
++ cmd = cis->order422 >> 14;
++ writel((readl(cfg->regs + S3C_CICOCTRL) & ~(0x3 << 0)) | cmd,
++ cfg->regs + S3C_CICOCTRL);
++#endif
++
++ return 0;
++}
++
++#if defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2450) || defined(CONFIG_CPU_S3C2416)
++static int s3c_camif_set_target_format(camif_cfg_t *cfg)
++{
++ unsigned int cmd = 0;
++
++ if (cfg->dma_type & CAMIF_CODEC) {
++ cmd |= S3C_CICOTRGFMT_TARGETHSIZE_CO(cfg->target_x) |
++ S3C_CICOTRGFMT_TARGETVSIZE_CO(cfg->target_y);
++
++ if (cfg->dst_fmt & CAMIF_YCBCR420)
++ cmd |= S3C_CICOTRGFMT_OUT422_420 |
++ S3C_CICOTRGFMT_IN422_422;
++ else if (cfg->dst_fmt & CAMIF_YCBCR422)
++ cmd |= (S3C_CICOTRGFMT_OUT422_422 |
++ S3C_CICOTRGFMT_IN422_422);
++ else if ((cfg->dst_fmt & CAMIF_RGB24) ||
++ (cfg->dst_fmt & CAMIF_RGB16))
++ cmd |= (S3C_CICOTRGFMT_OUT422_422 |
++ S3C_CICOTRGFMT_IN422_422) | (1 << 29);
++ else
++ printk(KERN_ERR "Invalid target format\n");
++ writel(cmd, cfg->regs + S3C_CICOTRGFMT);
++ } else {
++ assert(cfg->dma_type & CAMIF_PREVIEW);
++
++ cmd = readl(cfg->regs + S3C_CIPRTRGFMT);
++ cmd &= ~(S3C_CIPRTRGFMT_TARGETHSIZE_PR(0x1fff) |
++ S3C_CIPRTRGFMT_TARGETVSIZE_PR(0x1fff));
++ cmd |= S3C_CIPRTRGFMT_TARGETHSIZE_PR(cfg->target_x) |
++ S3C_CIPRTRGFMT_TARGETVSIZE_PR(cfg->target_y);
++
++ writel(cmd | (2 << 30), cfg->regs + S3C_CIPRTRGFMT);
++ }
++
++ return 0;
++}
++#elif defined(CONFIG_CPU_S3C6400) || defined(CONFIG_CPU_S3C6410)
++static int s3c_camif_set_target_format(camif_cfg_t *cfg)
++{
++ unsigned int cmd = 0;
++
++ if (cfg->dma_type & CAMIF_CODEC) {
++ cmd |= S3C_CICOTRGFMT_TARGETHSIZE_CO(cfg->target_x) |
++ S3C_CICOTRGFMT_TARGETVSIZE_CO(cfg->target_y);
++
++ if (cfg->dst_fmt & CAMIF_YCBCR420)
++ cmd |= S3C_CICOTRGFMT_OUTFORMAT_YCBCR420OUT;
++ else if (cfg->dst_fmt & CAMIF_YCBCR422)
++ cmd |= S3C_CICOTRGFMT_OUTFORMAT_YCBCR422OUT;
++ else if (cfg->dst_fmt & CAMIF_YCBCR422I)
++ cmd |= S3C_CICOTRGFMT_OUTFORMAT_YCBCR422OUTINTERLEAVE;
++ else if ((cfg->dst_fmt & CAMIF_RGB24) ||
++ (cfg->dst_fmt & CAMIF_RGB16))
++ cmd |= S3C_CICOTRGFMT_OUTFORMAT_RGBOUT;
++ else
++ printk(KERN_ERR "Invalid target format\n");
++ writel(cmd, cfg->regs + S3C_CICOTRGFMT);
++ } else {
++ assert(cfg->dma_type & CAMIF_PREVIEW);
++
++ cmd = readl(cfg->regs + S3C_CIPRTRGFMT);
++ cmd &= ~(S3C_CIPRTRGFMT_TARGETHSIZE_PR(0x1fff) |
++ S3C_CIPRTRGFMT_TARGETVSIZE_PR(0x1fff));
++ cmd |= S3C_CIPRTRGFMT_TARGETHSIZE_PR(cfg->target_x) |
++ S3C_CIPRTRGFMT_TARGETVSIZE_PR(cfg->target_y);
++
++ if (cfg->dst_fmt & CAMIF_YCBCR420)
++ cmd |= S3C_CICOTRGFMT_OUTFORMAT_YCBCR420OUT;
++ else if (cfg->dst_fmt & CAMIF_YCBCR422)
++ cmd |= S3C_CICOTRGFMT_OUTFORMAT_YCBCR422OUT;
++ else if (cfg->dst_fmt & CAMIF_YCBCR422I)
++ cmd |= S3C_CICOTRGFMT_OUTFORMAT_YCBCR422OUTINTERLEAVE;
++ else if ((cfg->dst_fmt & CAMIF_RGB24) ||
++ (cfg->dst_fmt & CAMIF_RGB16))
++ cmd |= S3C_CICOTRGFMT_OUTFORMAT_RGBOUT;
++ else
++ printk(KERN_ERR "Invalid target format\n");
++
++ writel(cmd, cfg->regs + S3C_CIPRTRGFMT);
++ }
++
++ return 0;
++}
++#endif
++
++/*************************************************************************
++ * Control part
++ ************************************************************************/
++int s3c_camif_control_fimc(camif_cfg_t *cfg)
++{
++ if (s3c_camif_request_memory(cfg)) {
++ printk(KERN_ERR "Instead of using consistent_alloc(). "
++ "Let me use dedicated mem for DMA\n");
++ return -1;
++ }
++
++ s3c_camif_setup_input_path(cfg);
++
++ if (s3c_camif_setup_scaler(cfg)) {
++ printk(KERN_ERR "Preview scaler fault: "
++ "change WinHorOfset or target size\n");
++ return 1;
++ }
++
++ s3c_camif_set_target_format(cfg);
++
++ if (s3c_camif_setup_dma(cfg)) {
++ printk(KERN_ERR "DMA burst length error\n");
++ return 1;
++ }
++
++ s3c_camif_setup_output_path(cfg);
++
++ return 0;
++}
++
++int s3c_camif_start_dma(camif_cfg_t *cfg)
++{
++ unsigned int n_cmd = readl(cfg->regs + S3C_CIIMGCPT);
++ unsigned int val;
++
++ switch(cfg->capture_enable) {
++ case CAMIF_BOTH_DMA_ON:
++ s3c_camif_reset(CAMIF_RESET, 0); /* Flush Camera Core Buffer */
++
++ /* For Codec */
++ val = readl(cfg->regs + S3C_CICOSCCTRL);
++ val |= S3C_CICOSCCTRL_COSCALERSTART;
++ writel(val, cfg->regs + S3C_CICOSCCTRL);
++
++ /* For Preview */
++ val = readl(cfg->regs + S3C_CIPRSCCTRL);
++ val |= S3C_CIPRSCCTRL_START;
++ writel(val, cfg->regs + S3C_CIPRSCCTRL);
++
++ n_cmd |=
++ S3C_CIIMGCPT_IMGCPTEN_COSC | S3C_CIIMGCPT_IMGCPTEN_PRSC;
++ break;
++
++ case CAMIF_DMA_ON:
++ s3c_camif_reset(CAMIF_RESET, 0); /* Flush Camera Core Buffer */
++
++ if (cfg->dma_type & CAMIF_CODEC) {
++ val = readl(cfg->regs + S3C_CICOSCCTRL);
++ val |= S3C_CICOSCCTRL_COSCALERSTART;
++ writel(val, cfg->regs + S3C_CICOSCCTRL);
++
++ n_cmd |= S3C_CIIMGCPT_IMGCPTEN_COSC;
++
++#if defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2450) || defined(CONFIG_CPU_S3C2416)
++ n_cmd |= (1 << 24);
++#endif
++ } else {
++ val = readl(cfg->regs + S3C_CIPRSCCTRL);
++ val |= S3C_CIPRSCCTRL_START;
++ writel(val, cfg->regs + S3C_CIPRSCCTRL);
++ n_cmd |= S3C_CIIMGCPT_IMGCPTEN_PRSC;
++ }
++
++ /* wait until Sync Time expires */
++ /* First settting, to wait VSYNC fall */
++ /* By VESA spec,in 640x480 @60Hz
++ MAX Delay Time is around 64us which "while" has.*/
++ while (S3C_CICOSTATUS_VSYNC &
++ readl(cfg->regs + S3C_CICOSTATUS));
++ break;
++
++ default:
++ break;
++ }
++
++#if defined(CONFIG_CPU_S3C2443)
++ if (cfg->dma_type & CAMIF_CODEC) {
++ if (cfg->dst_fmt & CAMIF_RGB24)
++ n_cmd |= 3 << 25;
++ else if (cfg->dst_fmt & CAMIF_RGB16)
++ n_cmd |= 1 << 25;
++ else if (cfg->dst_fmt & CAMIF_YCBCR420)
++ n_cmd |= 2 << 25;
++ }
++#endif
++
++ val = readl(cfg->regs + S3C_CIIMGCPT);
++ val &= ~(0x7 << 29);
++ writel(val | n_cmd | S3C_CIIMGCPT_IMGCPTEN, cfg->regs + S3C_CIIMGCPT);
++
++ return 0;
++}
++
++int s3c_camif_stop_dma(camif_cfg_t *cfg)
++{
++ unsigned int n_cmd = readl(cfg->regs + S3C_CIIMGCPT);
++ unsigned int val;
++
++ switch(cfg->capture_enable) {
++ case CAMIF_BOTH_DMA_OFF:
++ val = readl(cfg->regs + S3C_CICOSCCTRL);
++ val &= ~S3C_CICOSCCTRL_COSCALERSTART;
++ writel(val, cfg->regs + S3C_CICOSCCTRL);
++
++ val = readl(cfg->regs + S3C_CIPRSCCTRL);
++ val &= ~S3C_CIPRSCCTRL_START;
++ writel(val, cfg->regs + S3C_CIPRSCCTRL);
++
++ n_cmd = 0;
++ break;
++
++ case CAMIF_DMA_OFF_L_IRQ: /* fall thru */
++ case CAMIF_DMA_OFF:
++ if (cfg->dma_type & CAMIF_CODEC) {
++ val = readl(cfg->regs + S3C_CICOSCCTRL);
++ val &= ~S3C_CICOSCCTRL_COSCALERSTART;
++ writel(val, cfg->regs + S3C_CICOSCCTRL);
++ n_cmd &= ~S3C_CIIMGCPT_IMGCPTEN_COSC;
++
++ if (!(n_cmd & S3C_CIIMGCPT_IMGCPTEN_PRSC))
++ n_cmd = 0;
++ } else {
++ val = readl(cfg->regs + S3C_CIPRSCCTRL);
++ val &= ~S3C_CIPRSCCTRL_START;
++ writel(val, cfg->regs + S3C_CIPRSCCTRL);
++
++ n_cmd &= ~S3C_CIIMGCPT_IMGCPTEN_PRSC;
++
++ if (!(n_cmd & S3C_CIIMGCPT_IMGCPTEN_COSC))
++ n_cmd = 0;
++ }
++
++ break;
++
++ default:
++ printk(KERN_ERR "Unexpected DMA control\n");
++ }
++
++ writel(n_cmd, cfg->regs + S3C_CIIMGCPT);
++
++ if (cfg->capture_enable == CAMIF_DMA_OFF_L_IRQ) { /* Last IRQ */
++ if (cfg->dma_type & CAMIF_CODEC) {
++ val = readl(cfg->regs + S3C_CICOCTRL);
++ val |= S3C_CICOCTRL_LASTIRQEN;
++ writel(val, cfg->regs + S3C_CICOCTRL);
++ } else {
++ val = readl(cfg->regs + S3C_CIPRCTRL);
++ val |= S3C_CIPRCTRL_LASTIRQEN_ENABLE;
++ writel(val, cfg->regs + S3C_CIPRCTRL);
++ }
++ }
++
++ return 0;
++}
++
++#if defined(CONFIG_CPU_S3C6400) || defined(CONFIG_CPU_S3C6410)
++int s3c_camif_start_codec_msdma(camif_cfg_t *cfg)
++{
++ int ret = 0;
++ u32 val;
++
++ val = readl(cfg->regs + S3C_MSCOCTRL);
++ val &= ~(1 << 0);
++ writel(val, cfg->regs + S3C_MSCOCTRL);
++
++ val = readl(cfg->regs + S3C_MSCOCTRL);
++ val |= (1 << 0);
++ writel(val, cfg->regs + S3C_MSCOCTRL);
++
++ return ret;
++}
++#endif
++
++int s3c_camif_start_preview_msdma(camif_cfg_t * cfg)
++{
++ unsigned int val;
++ int ret = 0;
++
++#if !defined(CONFIG_CPU_S3C6400) && !defined(CONFIG_CPU_S3C6410)
++ val = readl(cfg->regs + S3C_CIMSCTRL);
++ val &= ~(1 << 0);
++ writel(val, cfg->regs + S3C_CIMSCTRL);
++#endif
++ val = readl(cfg->regs + S3C_CIMSCTRL);
++ val |= (1 << 0);
++ writel(val, cfg->regs + S3C_CIMSCTRL);
++
++ while(!readl(cfg->regs + S3C_CIMSCTRL) & (1 << 6));
++
++ return ret;
++}
++
++void s3c_camif_change_flip(camif_cfg_t *cfg)
++{
++ unsigned int cmd = 0;
++
++ if (cfg->dma_type & CAMIF_CODEC) {
++ cmd = readl(cfg->regs + S3C_CICOTRGFMT);
++ cmd &= ~((1 << 14) | (1 << 15));
++ cmd |= cfg->flip;
++ writel(cmd, cfg->regs + S3C_CICOTRGFMT);
++ } else {
++ /* if ROT90_Pr == 1, dma burst length must be 4 */
++ if (cfg->flip == CAMIF_ROTATE_90 ||
++ cfg->flip == CAMIF_FLIP_ROTATE_270) {
++ cmd = readl(cfg->regs + S3C_CIPRCTRL);
++ cmd &= ~(0x3ff << 14);
++ cmd |= (S3C_CICOCTRL_YBURST1_CO(4) |
++ S3C_CICOCTRL_YBURST2_CO(4));
++ writel(cmd, cfg->regs + S3C_CIPRCTRL);
++ }
++
++ cmd = readl(cfg->regs + S3C_CIPRTRGFMT);
++ cmd &= ~(0x7 << 13);
++ cmd |= cfg->flip;
++ writel(cmd, cfg->regs + S3C_CIPRTRGFMT);
++ }
++}
++
++void s3c_camif_change_effect(camif_cfg_t *cfg)
++{
++ unsigned int val = readl(cfg->regs + S3C_CIIMGEFF);
++
++ val &= ~((1 << 28) | (1 << 27) | (1 << 26));
++
++#if defined(CONFIG_CPU_S3C6400) || defined(CONFIG_CPU_S3C6410)
++ val |= ((1 << 31) | (1 << 30));
++#endif
++
++ switch(cfg->effect) {
++ case CAMIF_SILHOUETTE:
++ val |= S3C_CIIMGEFF_FIN_SILHOUETTE;
++ break;
++
++ case CAMIF_EMBOSSING:
++ val |= S3C_CIIMGEFF_FIN_EMBOSSING;
++ break;
++
++ case CAMIF_ART_FREEZE:
++ val |= S3C_CIIMGEFF_FIN_ARTFREEZE;
++ break;
++
++ case CAMIF_NEGATIVE:
++ val |= S3C_CIIMGEFF_FIN_NEGATIVE;
++ break;
++
++ case CAMIF_ARBITRARY_CB_CR:
++ val |= S3C_CIIMGEFF_FIN_ARBITRARY;
++ break;
++
++ case CAMIF_BYPASS:
++ default:
++ break;
++ }
++
++ writel(val, cfg->regs + S3C_CIIMGEFF);
++}
++
++int s3c_camif_do_postprocess(camif_cfg_t *cfg)
++{
++ unsigned int val = readl(cfg->regs + S3C_CIMSCTRL);
++
++ if (cfg->dst_fmt & CAMIF_YCBCR420)
++ val |= 1 << 1;
++ else
++ val &= ~(1 << 1);
++
++ val &= ~(1 << 0);
++ writel(val, cfg->regs + S3C_CIMSCTRL);
++
++ val |= 1 << 0;
++ writel(val, cfg->regs + S3C_CIMSCTRL);
++
++ printk(KERN_INFO "Postprocessing started\n");
++
++ while(!readl(cfg->regs + S3C_CIMSCTRL) & (1 << 6));
++
++ printk(KERN_INFO "Postprocessing finished\n");
++
++ return 0;
++}
++
++int s3c_camif_set_offset(camif_cis_t *cis)
++{
++ camif_cfg_t *cfg = s3c_camif_get_fimc_object(CODEC_MINOR);
++ unsigned int h = cis->win_hor_ofst; /* Camera input offset ONLY */
++ unsigned int v = cis->win_ver_ofst; /* Camera input offset ONLY */
++ unsigned int h2 = cis->win_hor_ofst2; /* Camera input offset ONLY */
++ unsigned int v2 = cis->win_ver_ofst2; /* Camera input offset ONLY */
++
++ /*Clear Overflow */
++ writel(S3C_CIWDOFST_CLROVCOFIY | S3C_CIWDOFST_CLROVCOFICB |
++ S3C_CIWDOFST_CLROVCOFICR | S3C_CIWDOFST_CLROVPRFICB |
++ S3C_CIWDOFST_CLROVPRFICR, cfg->regs + S3C_CIWDOFST);
++
++ writel(0, cfg->regs + S3C_CIWDOFST);
++
++ if (!h && !v) {
++ writel(0, cfg->regs + S3C_CIWDOFST);
++ writel(0, cfg->regs + S3C_CIDOWSFT2);
++ return 0;
++ }
++
++ writel(S3C_CIWDOFST_WINOFSEN | S3C_CIWDOFST_WINHOROFST(h) |
++ S3C_CIWDOFST_WINVEROFST(v), cfg->regs + S3C_CIWDOFST);
++ writel(S3C_CIDOWSFT2_WINHOROFST2(h) | S3C_CIDOWSFT2_WINVEROFST2(v),
++ cfg->regs + S3C_CIDOWSFT2);
++ writel(S3C_CIDOWSFT2_WINHOROFST2(h2) | S3C_CIDOWSFT2_WINVEROFST2(v2),
++ cfg->regs + S3C_CIDOWSFT2);
++
++ return 0;
++}
++
++void s3c_camif_set_priority(int flag)
++{
++ unsigned int val;
++
++ if (flag) {
++ irq_old_priority = readl(S3C64XX_PRIORITY);
++ val = irq_old_priority;
++ val &= ~(3 << 7);
++ writel(val, S3C64XX_PRIORITY);
++
++ /* Arbiter 1, REQ2 first */
++ val |= (1 << 7);
++ writel(val, S3C64XX_PRIORITY);
++
++ /* Disable Priority Rotate */
++ val &= ~(1 << 1);
++ writel(val, S3C64XX_PRIORITY);
++ } else
++ writel(irq_old_priority, S3C64XX_PRIORITY);
++}
++
++/*************************************************************************
++ * Interrupt part
++ ************************************************************************/
++void s3c_camif_enable_lastirq(camif_cfg_t *cfg)
++{
++ unsigned int val;
++
++ if (cfg->capture_enable == CAMIF_BOTH_DMA_ON ||
++ (cfg->dma_type & CAMIF_CODEC)) {
++ val = readl(cfg->regs + S3C_CICOCTRL);
++ val |= S3C_CICOCTRL_LASTIRQEN;
++ writel(val, cfg->regs + S3C_CICOCTRL);
++ }
++
++ if (cfg->capture_enable == CAMIF_BOTH_DMA_ON ||
++ !(cfg->dma_type & CAMIF_CODEC)) {
++ val = readl(cfg->regs + S3C_CIPRCTRL);
++ val |= S3C_CIPRCTRL_LASTIRQEN_ENABLE;
++ writel(val, cfg->regs + S3C_CIPRCTRL);
++ }
++}
++
++void s3c_camif_disable_lastirq(camif_cfg_t *cfg)
++{
++ unsigned int val;
++
++ if (cfg->capture_enable == CAMIF_BOTH_DMA_ON ||
++ (cfg->dma_type & CAMIF_CODEC)) {
++ val = readl(cfg->regs + S3C_CICOCTRL);
++ val &= ~S3C_CICOCTRL_LASTIRQEN;
++ writel(val, cfg->regs + S3C_CICOCTRL);
++ }
++
++ if (cfg->capture_enable == CAMIF_BOTH_DMA_ON ||
++ !(cfg->dma_type & CAMIF_CODEC)) {
++ val = readl(cfg->regs + S3C_CIPRCTRL);
++ val &= ~S3C_CIPRCTRL_LASTIRQEN_ENABLE;
++ writel(val, cfg->regs + S3C_CIPRCTRL);
++ }
++}
++
++#if defined(CONFIG_CPU_S3C6400) || defined(CONFIG_CPU_S3C6410)
++void s3c_camif_clear_irq(int irq)
++{
++ camif_cfg_t *cfg = s3c_camif_get_fimc_object(CODEC_MINOR);
++ unsigned int val = 0;
++
++ if (irq == IRQ_CAMIF_C) {
++ val = readl(cfg->regs + S3C_CIGCTRL);
++ val |= (1 << 19);
++ } else if (irq == IRQ_CAMIF_P) {
++ val = readl(cfg->regs + S3C_CIGCTRL);
++ val |= (1 << 18);
++ }
++
++ writel(val, cfg->regs + S3C_CIGCTRL);
++}
++#else
++void s3c_camif_clear_irq(int irq)
++{
++}
++#endif
++
++/*************************************************************************
++ * Initialize part
++ ************************************************************************/
++#if defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2450) || defined(CONFIG_CPU_S3C2416)
++static int s3c_camif_set_gpio(void)
++{
++ s3c2410_gpio_cfgpin(S3C2440_GPJ0, S3C2440_GPJ0_CAMDATA0);
++ s3c2410_gpio_cfgpin(S3C2440_GPJ1, S3C2440_GPJ1_CAMDATA1);
++ s3c2410_gpio_cfgpin(S3C2440_GPJ2, S3C2440_GPJ2_CAMDATA2);
++ s3c2410_gpio_cfgpin(S3C2440_GPJ3, S3C2440_GPJ3_CAMDATA3);
++ s3c2410_gpio_cfgpin(S3C2440_GPJ4, S3C2440_GPJ4_CAMDATA4);
++ s3c2410_gpio_cfgpin(S3C2440_GPJ5, S3C2440_GPJ5_CAMDATA5);
++ s3c2410_gpio_cfgpin(S3C2440_GPJ6, S3C2440_GPJ6_CAMDATA6);
++ s3c2410_gpio_cfgpin(S3C2440_GPJ7, S3C2440_GPJ7_CAMDATA7);
++ s3c2410_gpio_cfgpin(S3C2440_GPJ8, S3C2440_GPJ8_CAMPCLK);
++ s3c2410_gpio_cfgpin(S3C2440_GPJ9, S3C2440_GPJ9_CAMVSYNC);
++ s3c2410_gpio_cfgpin(S3C2440_GPJ10, S3C2440_GPJ10_CAMHREF);
++ s3c2410_gpio_cfgpin(S3C2440_GPJ11, S3C2440_GPJ11_CAMCLKOUT);
++ s3c2410_gpio_cfgpin(S3C2440_GPJ12, S3C2440_GPJ12_CAMRESET);
++
++ writel(0x1fff, S3C2443_GPJDN);
++
++ return 0;
++}
++#elif defined(CONFIG_CPU_S3C6400) || defined(CONFIG_CPU_S3C6410)
++static int s3c_camif_set_gpio(void)
++{
++ s3c_gpio_cfgpin(S3C64XX_GPF(5), S3C64XX_GPF5_CAMIF_YDATA0);
++ s3c_gpio_cfgpin(S3C64XX_GPF(6), S3C64XX_GPF6_CAMIF_YDATA1);
++ s3c_gpio_cfgpin(S3C64XX_GPF(7), S3C64XX_GPF7_CAMIF_YDATA2);
++ s3c_gpio_cfgpin(S3C64XX_GPF(8), S3C64XX_GPF8_CAMIF_YDATA3);
++ s3c_gpio_cfgpin(S3C64XX_GPF(9), S3C64XX_GPF9_CAMIF_YDATA4);
++ s3c_gpio_cfgpin(S3C64XX_GPF(10), S3C64XX_GPF10_CAMIF_YDATA5);
++ s3c_gpio_cfgpin(S3C64XX_GPF(11), S3C64XX_GPF11_CAMIF_YDATA6);
++ s3c_gpio_cfgpin(S3C64XX_GPF(12), S3C64XX_GPF12_CAMIF_YDATA7);
++ s3c_gpio_cfgpin(S3C64XX_GPF(2), S3C64XX_GPF2_CAMIF_PCLK);
++ s3c_gpio_cfgpin(S3C64XX_GPF(4), S3C64XX_GPF4_CAMIF_VSYNC);
++ s3c_gpio_cfgpin(S3C64XX_GPF(1), S3C64XX_GPF1_CAMIF_HREF);
++ s3c_gpio_cfgpin(S3C64XX_GPF(0), S3C64XX_GPF0_CAMIF_CLK);
++ s3c_gpio_cfgpin(S3C64XX_GPF(3), S3C64XX_GPF3_CAMIF_nRST);
++
++ writel(0, S3C64XX_GPFPUD);
++
++ return 0;
++}
++#endif
++
++void s3c_camif_reset(int is, int delay)
++{
++ camif_cfg_t *cfg = s3c_camif_get_fimc_object(CODEC_MINOR);
++ unsigned int val;
++ unsigned int tmp;
++
++ switch (is) {
++ case CAMIF_RESET:
++ tmp = readl(cfg->regs + S3C_CISRCFMT);
++
++ if (tmp &= (1 << 31)) {
++ /* ITU-R BT 601 */
++ val = readl(cfg->regs + S3C_CIGCTRL);
++ val |= S3C_CIGCTRL_SWRST;
++
++#if defined(CONFIG_CPU_S3C6400) || defined(CONFIG_CPU_S3C6410)
++ val |= S3C_CIGCTRL_IRQ_LEVEL;
++#endif
++ writel(val, cfg->regs + S3C_CIGCTRL);
++ mdelay(1);
++
++ val = readl(cfg->regs + S3C_CIGCTRL);
++ val &= ~S3C_CIGCTRL_SWRST;
++ writel(val, cfg->regs + S3C_CIGCTRL);
++ } else {
++ /* ITU-R BT 656 */
++ tmp = readl(cfg->regs + S3C_CISRCFMT);
++ tmp |= (1 << 31);
++ writel(tmp, cfg->regs + S3C_CISRCFMT);
++
++ val = readl(cfg->regs + S3C_CIGCTRL);
++ val |= S3C_CIGCTRL_SWRST;
++
++#if defined(CONFIG_CPU_S3C6400) || defined(CONFIG_CPU_S3C6410)
++ val |= S3C_CIGCTRL_IRQ_LEVEL;
++#endif
++ writel(val, cfg->regs + S3C_CIGCTRL);
++ mdelay(1);
++
++ val = readl(cfg->regs + S3C_CIGCTRL);
++ val &= ~S3C_CIGCTRL_SWRST;
++ writel(val, cfg->regs + S3C_CIGCTRL);
++
++ tmp = readl(cfg->regs + S3C_CISRCFMT);
++ tmp &= ~(1 << 31);
++ writel(tmp, cfg->regs + S3C_CISRCFMT);
++ }
++
++ break;
++
++ case CAMIF_EX_RESET_AH:
++ val = readl(cfg->regs + S3C_CIGCTRL);
++ val |= S3C_CIGCTRL_CAMRST;
++ writel(val, cfg->regs + S3C_CIGCTRL);
++ udelay(200);
++
++ val = readl(cfg->regs + S3C_CIGCTRL);
++ val &= ~S3C_CIGCTRL_CAMRST;
++ writel(val, cfg->regs + S3C_CIGCTRL);
++ udelay(delay);
++
++#if defined(CONFIG_VIDEO_SAMSUNG_S5K3AA)
++ val = readl(cfg->regs + S3C_CIGCTRL);
++ val |= S3C_CIGCTRL_CAMRST;
++ writel(val, cfg->regs + S3C_CIGCTRL);
++ udelay(200);
++#endif
++ break;
++
++ case CAMIF_EX_RESET_AL:
++ val = readl(cfg->regs + S3C_CIGCTRL);
++ val &= ~S3C_CIGCTRL_CAMRST;
++ writel(val, cfg->regs + S3C_CIGCTRL);
++ udelay(200);
++
++ val = readl(cfg->regs + S3C_CIGCTRL);
++ val |= S3C_CIGCTRL_CAMRST;
++ writel(val, cfg->regs + S3C_CIGCTRL);
++ udelay(delay);
++ break;
++
++ default:
++ break;
++ }
++}
++
++void s3c_camif_init(void)
++{
++ s3c_camif_reset(CAMIF_RESET, 0);
++ s3c_camif_set_gpio();
++}
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/media/video/s3c_camif.h linux-2.6.29-rc3.owrt.om/drivers/media/video/s3c_camif.h
+--- linux-2.6.29-rc3.owrt/drivers/media/video/s3c_camif.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/media/video/s3c_camif.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,404 @@
++/* drivers/media/video/s3c_camif.h
++ *
++ * Copyright (c) 2008 Samsung Electronics
++ *
++ * Samsung S3C Camera driver
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ */
++
++#ifndef __S3C_CAMIF_H_
++#define __S3C_CAMIF_H_
++
++#ifdef __KERNEL__
++#include <linux/videodev.h>
++#include <linux/videodev2.h>
++#include <asm/types.h>
++#include <linux/i2c.h>
++#include <linux/video_decoder.h>
++#endif /* __KERNEL__ */
++
++#if !defined(O_NONCAP)
++#define O_NONCAP O_TRUNC
++#endif
++
++#if defined(CAMIF_DEBUG)
++#define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __FUNCTION__ , ## args)
++#else
++#define DPRINTK(fmt, args...)
++#endif
++
++#if defined(CAMIF_DEBUG)
++#define assert(expr) \
++ if(!(expr)) { \
++ printk( "Assertion failed! %s,%s,%s,line=%d\n", \
++ #expr,__FILE__,__FUNCTION__,__LINE__); \
++ }
++#else
++#define assert(expr)
++#endif
++
++#if defined(CONFIG_CPU_S3C6400) || defined(CONFIG_CPU_S3C6410)
++#define MEM_SIZE 0x08000000
++#define FIMC_VER "3.0"
++#elif defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2450) || defined(CONFIG_CPU_S3C2416)
++#define MEM_SIZE 0x04000000
++#define FIMC_VER "2.3"
++#else
++#define MEM_SIZE 0x04000000
++#define FIMC_VER "2.x"
++#endif
++
++#undef FSM_ON_PREVIEW
++#define FSM_ON_CODEC
++
++#undef USE_LAST_IRQ /* turn on if pp count is 1 */
++
++#define CODEC_DEV_NAME "CAMIF_CODEC"
++#define PREVIEW_DEV_NAME "CAMIF_PREVIEW"
++
++#define CAMIF_DEV_NUM 2
++#define FIMC_CODEC_INDEX 0
++#define FIMC_PREVIEW_INDEX 1
++
++#define BURST_ERR 1
++#define RESERVED_MEM (15 * 1024 * 1024)
++#define YUV_MEM (10 * 1024 * 1024)
++#define RGB_MEM (RESERVED_MEM - YUV_MEM)
++
++#define CODEC_DEFAULT_WIDTH 640
++#define CODEC_DEFAULT_HEIGHT 480
++#define PREVIEW_DEFAULT_WIDTH 640
++#define PREVIEW_DEFAULT_HEIGHT 480
++
++#define CROP_DEFAULT_WIDTH 352
++#define CROP_DEFAULT_HEIGHT 272
++
++#define CODEC_DEFAULT_PPNUM 4
++#define PREVIEW_DEFAULT_PPNUM 4
++
++#define CODEC_MINOR 12
++#define PREVIEW_MINOR 13
++
++#define CHECK_FREQ 5
++#define INSTANT_SKIP 0
++#define INSTANT_GO 1
++
++#define VID_HARDWARE_SAMSUNG_FIMC3X 236
++
++#define ZOOM_AT_A_TIME_IN_PIXELS 32
++#define ZOOM_IN_MAX 640
++
++/* Codec or Preview Status */
++#define CAMIF_STARTED (1 << 1)
++#define CAMIF_STOPPED (1 << 2)
++#define CAMIF_INT_HAPPEN (1 << 3)
++
++/* Codec or Preview : Interrupt FSM */
++#define CAMIF_1st_INT (1 << 7)
++#define CAMIF_Xth_INT (1 << 8)
++#define CAMIF_Yth_INT (1 << 9)
++#define CAMIF_Zth_INT (1 << 10)
++#define CAMIF_NORMAL_INT (1 << 11)
++#define CAMIF_DUMMY_INT (1 << 12)
++#define CAMIF_CONTINUOUS_INT (1 << 13)
++#define CAMIF_SET_LAST_INT (1 << 14)
++#define CAMIF_STOP_CAPTURE (1 << 15)
++#define CAMIF_LAST_IRQ (1 << 16)
++#define CAMIF_PENDING_INT 0
++
++#define CAMIF_CAPTURE_SKIP_FRAMES 5
++
++/* CAMIF RESET Definition */
++#define CAMIF_RESET (1 << 0)
++#define CAMIF_EX_RESET_AL (1 << 1) /* Active Low */
++#define CAMIF_EX_RESET_AH (1 << 2) /* Active High */
++
++#define USER_EXIT (1 << 2)
++#define USER_ADD (1 << 1)
++#define SENSOR_INIT (1 << 0)
++
++#define SENSOR_MAX 255
++#define SENSOR_QSVGA (1 << 12)
++#define SENSOR_UXGA (1 << 11)
++#define SENSOR_SVGA (1 << 10)
++#define SENSOR_SXGA (1 << 4)
++#define SENSOR_VGA (1 << 3)
++#define SENSOR_DEFAULT 0
++
++#define SENSOR_WB (1 << 9)
++#define SENSOR_AF (1 << 8)
++#define SENSOR_MIRROR (1 << 7)
++#define SENSOR_ZOOMOUT (1 << 6)
++#define SENSOR_ZOOMIN (1 << 5)
++
++/* Global Status Definition */
++#define PWANT2START (1 << 0)
++#define CWANT2START (1 << 1)
++#define BOTH_STARTED (PWANT2START | CWANT2START)
++#define P_NOT_WORKING (1 << 4)
++#define C_WORKING (1 << 5)
++#define P_WORKING (1 << 6)
++#define C_NOT_WORKING (1 << 7)
++
++#define FORMAT_FLAGS_DITHER 0x01
++#define FORMAT_FLAGS_PACKED 0x02
++#define FORMAT_FLAGS_PLANAR 0x04
++#define FORMAT_FLAGS_RAW 0x08
++#define FORMAT_FLAGS_CrCb 0x10
++
++enum camif_itu_fmt {
++ CAMIF_ITU601 = (1 << 31),
++ CAMIF_ITU656 = 0,
++};
++
++/* It is possbie to use two device simultaneously */
++enum camif_dma_type {
++ CAMIF_PREVIEW = (1 << 0),
++ CAMIF_CODEC = (1 << 1),
++};
++
++enum camif_order422 {
++ CAMIF_YCBYCR = 0,
++ CAMIF_YCRYCB = (1 << 14),
++ CAMIF_CBYCRY = (1 << 15),
++ CAMIF_CRYCBY = (1 << 15) | (1 << 14),
++};
++
++enum flip_mode {
++ CAMIF_FLIP = 0,
++ CAMIF_ROTATE_90 = (1 << 13),
++ CAMIF_FLIP_X = (1 << 14),
++ CAMIF_FLIP_Y = (1 << 15),
++ CAMIF_FLIP_MIRROR = (1 << 15) | (1 << 14),
++ CAMIF_FLIP_ROTATE_270 = (1 << 15) | (1 << 14) | (1 << 13),
++};
++
++enum camif_fmt {
++ CAMIF_YCBCR420 = (1 << 0),
++ CAMIF_YCBCR422 = (1 << 1),
++ CAMIF_YCBCR422I = (1 << 2),
++ CAMIF_RGB16 = (1 << 3),
++ CAMIF_RGB24 = (1 << 4),
++ CAMIF_RGB32 = (1 << 5),
++};
++
++enum camif_capturing {
++ CAMIF_BOTH_DMA_ON = (1 << 4),
++ CAMIF_DMA_ON = (1 << 3),
++ CAMIF_BOTH_DMA_OFF = (1 << 1),
++ CAMIF_DMA_OFF = (1 << 0),
++ CAMIF_DMA_OFF_L_IRQ = (1 << 5),
++};
++
++enum image_effect {
++ CAMIF_BYPASS,
++ CAMIF_ARBITRARY_CB_CR,
++ CAMIF_NEGATIVE,
++ CAMIF_ART_FREEZE,
++ CAMIF_EMBOSSING ,
++ CAMIF_SILHOUETTE,
++};
++
++enum input_channel{
++ CAMERA_INPUT,
++ MSDMA_FROM_CODEC,
++ MSDMA_FROM_PREVIEW,
++};
++
++enum output_channel{
++ CAMIF_OUT_PP,
++ CAMIF_OUT_FIFO,
++};
++
++typedef struct camif_performance
++{
++ int frames;
++ int framesdropped;
++ __u64 bytesin;
++ __u64 bytesout;
++ __u32 reserved[4];
++} camif_perf_t;
++
++typedef struct {
++ dma_addr_t phys_y;
++ dma_addr_t phys_cb;
++ dma_addr_t phys_cr;
++ u8 *virt_y;
++ u8 *virt_cb;
++ u8 *virt_cr;
++ dma_addr_t phys_rgb;
++ u8 *virt_rgb;
++} img_buf_t;
++
++/* this structure convers the CIWDOFFST, prescaler, mainscaler */
++typedef struct {
++ u32 modified_src_x; /* After windows applyed to source_x */
++ u32 modified_src_y;
++ u32 hfactor;
++ u32 vfactor;
++ u32 shfactor; /* SHfactor = 10 - ( hfactor + vfactor ) */
++ u32 prehratio;
++ u32 prevratio;
++ u32 predst_x;
++ u32 predst_y;
++ u32 scaleup_h;
++ u32 scaleup_v;
++ u32 mainhratio;
++ u32 mainvratio;
++ u32 scalerbypass; /* only codec */
++ u32 zoom_in_cnt;
++} scaler_t;
++
++enum v4l2_status {
++ CAMIF_V4L2_INIT = (1 << 0),
++ CAMIF_v4L2_DIRTY = (1 << 1),
++};
++
++typedef struct {
++ struct semaphore lock;
++ enum camif_itu_fmt itu_fmt;
++ enum camif_order422 order422;
++ struct i2c_client *sensor;
++ u32 win_hor_ofst;
++ u32 win_ver_ofst;
++ u32 win_hor_ofst2;
++ u32 win_ver_ofst2;
++ u32 camclk; /* External Image Sensor Camera Clock */
++ u32 source_x;
++ u32 source_y;
++ u32 polarity_pclk;
++ u32 polarity_vsync;
++ u32 polarity_href;
++ u32 user; /* MAX 2 (codec, preview) */
++ u32 irq_old_priority; /* BUS PRIORITY register */
++ u32 status;
++ u32 init_sensor; /* initializing sensor */
++ u32 reset_type; /* External Sensor Reset Type */
++ u32 reset_udelay;
++ u32 zoom_in_cnt;
++} camif_cis_t;
++
++/* when App want to change v4l2 parameter,
++ * we instantly store it into v4l2_t v2
++ * and then reflect it to hardware
++ */
++typedef struct v4l2 {
++ struct v4l2_fmtdesc *fmtdesc;
++ struct v4l2_framebuffer frmbuf; /* current frame buffer */
++ struct v4l2_input *input;
++ struct v4l2_output *output;
++ enum v4l2_status status;
++
++ /* crop */
++ struct v4l2_rect crop_bounds;
++ struct v4l2_rect crop_defrect;
++ struct v4l2_rect crop_current;
++
++} v4l2_t;
++
++
++typedef struct camif_c_t {
++ struct video_device *v;
++
++ /* V4L2 param only for v4l2 driver */
++ v4l2_t v2;
++ camif_cis_t *cis; /* Common between Codec and Preview */
++
++ /* logical parameter */
++ wait_queue_head_t waitq;
++ u32 status; /* Start/Stop */
++ u32 fsm; /* Start/Stop */
++ u32 open_count; /* duplicated */
++ int irq;
++ char shortname[16];
++ u32 target_x;
++ u32 target_y;
++ scaler_t sc;
++ enum flip_mode flip;
++ enum image_effect effect;
++ enum camif_dma_type dma_type;
++
++ /* 4 pingpong Frame memory */
++ u8 *pp_virt_buf;
++ dma_addr_t pp_phys_buf;
++ u32 pp_totalsize;
++ u32 pp_num; /* used pingpong memory number */
++ img_buf_t img_buf[4];
++ enum camif_fmt src_fmt;
++ enum camif_fmt dst_fmt;
++ enum camif_capturing capture_enable;
++ camif_perf_t perf;
++ u32 cur_frame_num;
++ u32 auto_restart; /* Only For Preview */
++ int input_channel;
++ int output_channel;
++ int buffer_size;
++ void *other; /* other camif_cfg_t */
++ u32 msdma_status; /* 0 : stop, 1 : start */
++ void __iomem *regs;
++} camif_cfg_t;
++
++/* Test Application Usage */
++typedef struct {
++ int src_x;
++ int src_y;
++ int dst_x;
++ int dst_y;
++ int src_fmt;
++ int dst_fmt;
++ int flip;
++ int awb;
++ int effect;
++ int input_channel;
++ int output_channel;
++ unsigned int h_offset;
++ unsigned int v_offset;
++ unsigned int h_offset2;
++ unsigned int v_offset2;
++} camif_param_t;
++
++/* Externs */
++extern camif_cfg_t* s3c_camif_get_fimc_object(int);
++extern int s3c_camif_start_dma(camif_cfg_t *);
++extern int s3c_camif_stop_dma(camif_cfg_t *);
++extern int s3c_camif_get_frame_num(camif_cfg_t *);
++extern unsigned char* s3c_camif_get_frame(camif_cfg_t *);
++extern int s3c_camif_control_fimc(camif_cfg_t *);
++extern void s3c_camif_reset(int, int);
++extern void s3c_camif_init(void);
++extern int s3c_camif_get_fifo_status(camif_cfg_t *);
++extern void s3c_camif_enable_lastirq(camif_cfg_t *);
++extern void s3c_camif_disable_lastirq(camif_cfg_t *);
++extern void s3c_camif_change_flip(camif_cfg_t *);
++extern void s3c_camif_change_effect(camif_cfg_t *);
++extern int s3c_camif_start_codec_msdma(camif_cfg_t *);
++extern int s3c_camif_set_clock(unsigned int camclk);
++extern void s3c_camif_disable_clock(void);
++extern int s3c_camif_start_preview_msdma(camif_cfg_t *);
++extern camif_cis_t* get_initialized_cis(void);
++extern void s3c_camif_clear_irq(int);
++extern int s3c_camif_set_source_format(camif_cis_t *);
++extern void s3c_camif_register_sensor(struct i2c_client *);
++extern void s3c_camif_unregister_sensor(struct i2c_client*);
++extern int s3c_camif_setup_dma(camif_cfg_t *);
++extern void s3c_camif_init_sensor(camif_cfg_t *);
++extern int s3c_camif_set_offset(camif_cis_t *);
++extern void s3c_camif_set_priority(int);
++extern void s3c_camif_open_sensor(camif_cis_t *);
++extern void s3c_camif_set_polarity(camif_cfg_t *cfg);
++
++#endif
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/media/video/samsung/4xa_sensor.c linux-2.6.29-rc3.owrt.om/drivers/media/video/samsung/4xa_sensor.c
+--- linux-2.6.29-rc3.owrt/drivers/media/video/samsung/4xa_sensor.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/media/video/samsung/4xa_sensor.c 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,384 @@
++/*
++ * Copyright (C) 2004 Samsung Electronics
++ * SW.LEE <hitchcar@samsung.com>
++ * - based on Russell King : pcf8583.c
++ * - added smdk24a0, smdk2440
++ * - added poseidon (s3c24a0+wavecom)
++ *
++ * 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.
++ *
++ * Driver for FIMC2.x Camera Decoder
++ *
++ */
++
++//#include <linux/config.h>
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/i2c.h>
++#include <linux/i2c-id.h>
++#include <linux/slab.h>
++#include <linux/string.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++
++//#define CAMIF_DEBUG
++
++#include "../s3c_camif.h"
++#include "4xa_sensor.h"
++
++
++/*
++ * Samsung's original code:
++ * .camclk = 44000000, / * for 20 fps: 44MHz, for 12 fps (more
++ * stable): 26MHz * /
++ *
++ * Experimenting with the controls yielded the following:
++ *
++ * PLL_CLK gets divided according to TCMD.Div8_r (1,00h) and then by
++ * SEL_MAIN.Half_PCLK_Enable (5,8Fh) until it finally becomes PCLK.
++ *
++ * Div8_r = 0: 1/4, 1: 1/2 (default)
++ * Half_PCLK_Enable = 0: 1/1 (default), 1: 1/2
++ *
++ * Thus our 26.6 MHz MCLK becomes an 87.78 MHz PLL_CLK and eventually a PCLK
++ * of 43.89 MHz.
++ */
++
++#define CAMCLK 26600000 /* 26.6 MHz */
++
++
++static struct i2c_driver sensor_driver;
++
++/* This is an abstract CIS sensor for MSDMA input. */
++
++camif_cis_t msdma_input = {
++ .itu_fmt = CAMIF_ITU601,
++ .order422 = CAMIF_CBYCRY, /* another case: YCRYCB */
++ .camclk = CAMCLK,
++ .source_x = 800,
++ .source_y = 600,
++ .win_hor_ofst = 0,
++ .win_ver_ofst = 0,
++ .win_hor_ofst2 = 0,
++ .win_ver_ofst2 = 0,
++ .polarity_pclk = 0,
++ .polarity_vsync = 1,
++ .polarity_href = 0,
++ .reset_type = CAMIF_EX_RESET_AL,
++ .reset_udelay = 5000,
++};
++
++camif_cis_t interlace_input = {
++ .itu_fmt = CAMIF_ITU601,
++ .order422 = CAMIF_CBYCRY, /* another case: YCRYCB */
++ .camclk = CAMCLK,
++ .source_x = 800,
++ .source_y = 600,
++ .win_hor_ofst = 0,
++ .win_ver_ofst = 0,
++ .win_hor_ofst2 = 0,
++ .win_ver_ofst2 = 0,
++ .polarity_pclk = 0,
++ .polarity_vsync = 1,
++ .polarity_href = 0,
++ .reset_type = CAMIF_EX_RESET_AL,
++ .reset_udelay = 5000,
++};
++
++#if defined(CONFIG_VIDEO_SAMSUNG_S5K4BA)
++static camif_cis_t data = {
++ .itu_fmt = CAMIF_ITU601,
++ .order422 = CAMIF_YCBYCR,
++ .camclk = CAMCLK,
++ .source_x = 800,
++ .source_y = 600,
++ .win_hor_ofst = 0,
++ .win_ver_ofst = 0,
++ .win_hor_ofst2 = 0,
++ .win_ver_ofst2 = 0,
++ .polarity_pclk = 0,
++ .polarity_vsync = 1,
++ .polarity_href = 0,
++ .reset_type = CAMIF_EX_RESET_AL,
++ .reset_udelay = 5000,
++};
++
++s5k4xa_t s5k4ba_regs_mirror[S5K4BA_REGS];
++#else
++#error No samsung CIS moudule here !
++#endif
++
++camif_cis_t* get_initialized_cis(void)
++{
++ if (data.init_sensor == 0)
++ return NULL;
++
++ return &data;
++}
++
++#define CAM_ID 0x5a
++
++static unsigned short ignore[] = { I2C_CLIENT_END };
++static unsigned short normal_addr[] = { CAM_ID >> 1, I2C_CLIENT_END };
++static const unsigned short *forces[] = { NULL };
++
++static struct i2c_client_address_data addr_data = {
++ .normal_i2c = normal_addr,
++ .probe = ignore,
++ .ignore = ignore,
++ .forces = forces,
++};
++
++
++static unsigned char sensor_read(struct i2c_client *client,
++ unsigned char subaddr)
++{
++ unsigned char buf = subaddr;
++ struct i2c_msg msg = {
++ .addr = client->addr,
++ .flags = 0,
++ .len = 1,
++ .buf = &buf,
++ };
++
++ if (i2c_transfer(client->adapter, &msg, 1) != 1) {
++ printk(" I2C write Error\n");
++ return -EIO;
++ }
++
++ msg.flags = I2C_M_RD;
++ if (i2c_transfer(client->adapter, &msg, 1) != 1) {
++ printk(" I2C read Error\n");
++ return -EIO;
++ }
++
++ return buf;
++}
++
++static int
++sensor_write(struct i2c_client *client,
++ unsigned char subaddr, unsigned char val)
++{
++ unsigned char buf[2];
++ struct i2c_msg msg = {
++ .addr = client->addr,
++ .flags = 0,
++ .len = 2,
++ .buf = buf,
++ };
++
++ buf[0] = subaddr;
++ buf[1] = val;
++
++ return i2c_transfer(client->adapter, &msg, 1) == 1 ? 0 : -EIO;
++}
++
++#if defined(CONFIG_VIDEO_SAMSUNG_S5K4BA)
++void inline sensor_init(struct i2c_client *sam_client)
++{
++ int i;
++
++ i = ARRAY_SIZE(s5k4ba_reg);
++ for (i = 0; i < S5K4BA_INIT_REGS; i++)
++ sensor_write(sam_client,
++ s5k4ba_reg[i].subaddr, s5k4ba_reg[i].value);
++}
++#else
++#error No samsung CIS moudule !
++#endif
++
++static int
++s5k4xa_attach(struct i2c_adapter *adap, int addr, int kind)
++{
++ struct i2c_client *c;
++
++ c = kmalloc(sizeof(*c), GFP_KERNEL);
++ if (!c)
++ return -ENOMEM;
++
++ memset(c, 0, sizeof(struct i2c_client));
++
++ strcpy(c->name, "S5K4XA");
++ c->addr = addr;
++ c->adapter = adap;
++ c->driver = &sensor_driver;
++ i2c_set_clientdata(c, &data);
++ data.sensor = c;
++
++ s3c_camif_register_sensor(c);
++
++ return i2c_attach_client(c);
++}
++
++static int sensor_attach_adapter(struct i2c_adapter *adap)
++{
++ extern void om_3d7k_camera_on(void);
++ extern void om_3d7k_camera_off(void);
++ int ret;
++
++ s3c_camif_open_sensor(&data);
++
++ om_3d7k_camera_on();
++ ret = i2c_probe(adap, &addr_data, s5k4xa_attach);
++ om_3d7k_camera_off();
++ return ret;
++}
++
++static int sensor_detach(struct i2c_client *client)
++{
++ i2c_detach_client(client);
++ s3c_camif_unregister_sensor(client);
++ return 0;
++}
++
++/*
++ * Purpose:
++ * This function only for SVGA Camera : 4BA
++ */
++
++static int change_sensor_size(struct i2c_client *client, int size)
++{
++ int i;
++
++ switch (size) {
++#if defined(CONFIG_VIDEO_SAMSUNG_S5K4BA)
++ case SENSOR_QSVGA:
++ for (i = 0; i < S5K4BA_QSVGA_REGS; i++)
++ sensor_write(client, s5k4ba_reg_qsvga[i].subaddr,
++ s5k4ba_reg_qsvga[i].value);
++ break;
++
++ case SENSOR_SVGA:
++ for (i = 0; i < S5K4BA_SVGA_REGS; i++)
++ sensor_write(client, s5k4ba_reg_svga[i].subaddr,
++ s5k4ba_reg_svga[i].value);
++ break;
++#else
++#error No samsung CIS moudule !
++#endif
++ default:
++ panic("4xa_sensor.c: unexpect value\n");
++ }
++
++ return 0;
++}
++
++static int change_sensor_wb(struct i2c_client *client, int type)
++{
++ printk("[ *** Page 0, 4XA Sensor White Balance Mode ***]\n");
++
++#if defined(CONFIG_VIDEO_SAMSUNG_S5K4BA)
++ sensor_write(client, 0xFC, 0x0);
++ sensor_write(client, 0x30, type);
++#endif
++
++ switch(type){
++ case 0:
++ default:
++ printk(" -> AWB auto mode ]\n");
++ break;
++ case 1:
++ printk(" -> Indoor 3100 mode ]\n");
++ break;
++ case 2:
++ printk(" -> Outdoor 5100 mode ]\n");
++ break;
++ case 3:
++ printk(" -> Indoor 2000 mode ]\n");
++ break;
++ case 4:
++ printk(" -> AE/AWB halt ]\n");
++ break;
++ case 5:
++ printk(" -> Cloudy(6000) mode ]\n");
++ break;
++ case 6:
++ printk(" -> Sunny(8000) mode ]\n");
++ break;
++ }
++
++ return 0;
++}
++
++static int
++sensor_command(struct i2c_client *client, unsigned int cmd, void *arg)
++{
++ switch (cmd) {
++ case SENSOR_INIT:
++ sensor_init(client);
++ printk(KERN_INFO "External Camera initialized\n");
++ break;
++
++ case USER_ADD:
++ break;
++
++ case USER_EXIT:
++ break;
++
++ case SENSOR_QSVGA:
++ change_sensor_size(client, SENSOR_QSVGA);
++ break;
++
++ case SENSOR_VGA:
++ change_sensor_size(client, SENSOR_VGA);
++ break;
++
++ case SENSOR_SVGA:
++ change_sensor_size(client, SENSOR_SVGA);
++ break;
++
++ case SENSOR_SXGA:
++ change_sensor_size(client, SENSOR_SXGA);
++ break;
++
++ case SENSOR_UXGA:
++ change_sensor_size(client, SENSOR_UXGA);
++ break;
++/* Todo
++ case SENSOR_BRIGHTNESS:
++ change_sensor_setting();
++ break;
++*/
++ case SENSOR_WB:
++ printk("[ *** 4XA Sensor White Balance , No mode ***]\n");
++ change_sensor_wb(client, (int) arg);
++ break;
++
++ default:
++ panic("4xa_sensor.c: Unexpected Sensor Command\n");
++ break;
++ }
++
++ return 0;
++}
++
++static struct i2c_driver sensor_driver = {
++ .driver = {
++ .name = "s5k4xa",
++ },
++ .id = I2C_DRIVERID_S5K_4XA,
++ .attach_adapter = sensor_attach_adapter,
++ .detach_client = sensor_detach,
++ .command = sensor_command
++};
++
++static __init int camif_sensor_init(void)
++{
++ return i2c_add_driver(&sensor_driver);
++}
++
++
++static __init void camif_sensor_exit(void)
++{
++ i2c_del_driver(&sensor_driver);
++}
++
++module_init(camif_sensor_init)
++module_exit(camif_sensor_exit)
++
++MODULE_AUTHOR("Jinsung, Yang <jsgood.yang@samsung.com>");
++MODULE_DESCRIPTION("I2C Client Driver For FIMC V4L2 Driver");
++MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/media/video/samsung/4xa_sensor.h linux-2.6.29-rc3.owrt.om/drivers/media/video/samsung/4xa_sensor.h
+--- linux-2.6.29-rc3.owrt/drivers/media/video/samsung/4xa_sensor.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/media/video/samsung/4xa_sensor.h 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,2412 @@
++#ifndef _SAMSUNG_SXGA_H_
++#define _SAMSUNG_SXGA_H_
++
++/******************************************************************************
++ * Display resolution standards
++ *
++ * QCIF: 176 x 144
++ * CIF: 352 x 288
++ * QVGA: 320 x 240
++ * VGA: 640 x 480
++ * SVGA: 800 x 600
++ * XGA: 1024 x 768
++ * WXGA: 1280 x 800
++ * QVGA: 1280 x 960
++ * SXGA: 1280 x 1024
++ * SXGA+: 1400 x 1050
++ * WSXGA+: 1680 x 1050
++ * UXGA: 1600 x 1200
++ * WUXGA: 1920 x 1200
++ * QXGA: 2048 x 1536
++ *****************************************************************************/
++
++//#include "../bits.h"
++
++/*
++ * Camera information
++ * FPC Label : Samsung MEGA Pixel Camera : V4220 REV06
++ * Modified by charles -Initial function of '3AA' test routine
++ * Modified and tested by YongHwui.Kim <yonghwui.kim@samsung.com> for S5K3AAEX
++ * Camera
++ */
++
++#define CHIP_DELAY 0xFF
++
++typedef struct samsung_t{
++ unsigned char subaddr;
++ unsigned char value;
++ unsigned char page;
++} s5k4xa_t;
++
++#ifdef CONFIG_CPU_S3C24A0A
++#define TRY_HIGH_CLOCK 1
++#endif
++
++/***************************************************
++ * name: S5K3AAEX EVT2 setfile
++ * ver: v2.61
++ * history:
++ * v0.0 start from 040908 setfile
++ * v1.0 arange register
++ * v1.01 change MCLK(25Mhz) and Frame rate(7fps)
++ * v2.0 adjust register setting for 3AA EVT2
++ * - color correction, RGB shading off, hsync start position,
++ * Mirror, fps
++ * - Color Tuning, YGRPDLY
++ * v2.1 change Frame rate(7.5fps) and Total gain to x4
++ * (because of reducing visual noise at low illumination)
++ * - change BPRM AGC Max and FrameAE start
++ * improve AE speed
++ * v2.2 modify AWB G gain and solve 50hz flicker detection fail in
++ * 25MHz 7.5fps
++ * v2.3 Adjust gamma, Dark Slice, white point, Hue gain,
++ * White Balance B control, Y gain On, Digital Clamp On
++ * lower AWB G gain
++ * v2.4 Adjust AE window weight, Y Gamma, WhitePoint, Shading and BPR
++ * Max Thres.
++ * v2.41 Adjust AE/AWB window and AWB internal window boundary to
++ * decrease skin color tracking
++ * v2.411 special version for PSCDS
++ * v2.412 RGB shading off
++ * v2.5 Lens change STW to Sekonix
++ * adjust White point and Y shading Coef (RGB shading off)
++ * v2.6 New Tuning because of Full YC off and YCbCr Coef change
++ * Gamma, Dark Slice, color matrix (not use), Color suppress
++ * R Gain and DBPR agc MIN/MAX
++ * v2.61 VCK inversion(data rising)
++ ****************************************************/
++
++#if defined(CONFIG_VIDEO_SAMSUNG_S5K4BA)
++
++/* For SVGA (800 x 600) */
++#if 1 /* from han */
++s5k4xa_t s5k4ba_reg[] =
++{
++ {0xfc,0x07},
++ {0x66,0x01}, /* Watch Dog Time On */
++ {0xfc,0x00},
++ {0x00,0xAA}, /* For EDS Check */
++ {0x21,0x03}, /* peter */
++ {0xfc,0x01},
++ {0x04,0x01}, /* ARM Clock Divider */
++
++ {0xfc,0x02},
++ {0x30,0x90}, /* Analog offset */
++ {0x37,0x0d}, /* Global Gain */
++ {0x2d,0x48}, /* Double Shutter */
++ {0x60,0x00}, /* Blank_Adrs */
++
++ {0x45,0x1e}, /* 0e - CDS Timing for Average Sub_Sampling */
++ {0x47,0x2f},
++ {0x02,0x0e}, /* ADC Resolution */
++ {0x3d,0x06}, /* Frame ADLC */
++ {0x4d,0x08}, /* Doubler Volatage */
++ {0x54,0x02}, /* Double Shutter */
++ {0x55,0x1e}, /* Line ADLC */
++ {0x56,0x30},
++ {0x59,0x00}, /* LineADLC offset */
++ {0x5b,0x08}, /* R_Ref_Ctrl */
++ {0x44,0x63}, /* CLP_EN */
++ {0x4A,0x10}, /* Clamp Control */
++ {0x42,0x02},
++ {0x43,0xef},
++
++ /*
++ * Table Set for Sub-Sampling
++ */
++
++ {0xfc,0x03},
++ {0x2c,0x00}, /* crcb_sel for Sub-Sampling Table */
++ {0x05,0x46}, /* Output Image Size Set for Capture */
++ {0x07,0xb6},
++ {0x0e,0x04},
++ {0x12,0x03},
++
++ {0xfc,0x04},
++ {0x32,0x04},
++ {0x33,0xbc},
++
++ {0xfc,0x04},
++ {0xc5,0x26}, /* Output Image Size Set for Preview */
++ {0xc7,0x5e},
++ {0xce,0x04},
++ {0xd2,0x04},
++
++ {0xec,0x06}, /* CrCb sel = YCBYCR(0x06) by jsgood */
++ {0xc0,0x06},
++ {0xc1,0x70},
++ {0xc2,0x02},
++ {0xc3,0x87},
++
++ {0xfc,0x07},
++ {0x05,0x00},
++ {0x06,0x00},
++ {0x07,0x8b},
++ {0x08,0xf5},
++ {0x09,0x00},
++ {0x0a,0xb4},
++ {0x0b,0x00},
++ {0x0c,0xea},
++ {0x0d,0x00},
++ {0x0e,0x40},
++
++ {0xfc,0x00},
++ {0x70,0x02},
++
++ /* Jeongyun added still shot cbcr_sel */
++ {0xfc,0x03},
++ {0x2c,0x00},
++ {0x5c,0x00},
++ {0x8c,0x00},
++ {0xbc,0x00},
++ {0xfc,0x04},
++ {0x5c,0x00},
++
++ /*
++ * COMMAND SET
++ */
++
++ {0xfc,0x00},
++ {0x73,0x21}, /* Frame AE Enable peter */
++ {0x20,0x02}, /* Change AWB Mode */
++
++ {0xfc,0x00},
++ {0x6c,0xb0}, /* AE target */
++ {0x6d,0x00},
++
++ {0xfc,0x20},
++ {0x16,0x5a}, /* for Prevating AE Hunting */
++
++ {0xfc,0x00},
++ {0x78,0x6a}, /* AGC Max */
++ {0xfc,0x20},
++ {0x16,0x60}, /* Frame AE Start */
++
++ {0xfc,0x20},
++ {0x57,0x18}, /* Stable_Frame_AE */
++ {0x2C,0x30}, /* For Forbidden Area */
++ {0x2E,0x00}, /* For Forbidden Area */
++ {0x14,0x70},
++ {0x01,0x00}, /* Stepless_Off */
++
++ {0xfc,0x07},
++ {0x11,0x02}, /* AWB G Gain offset */
++
++ {0xfc,0x07},
++ {0x3e,0x0a}, /* AWB Cut R max */
++
++ {0xfc,0x01},
++ {0xc8,0xd0}, /* AWB Y Max */
++ {0xfc,0x00},
++ {0x3e,0x20}, /* 30 - AWB Y_min */
++ {0x3d,0x10}, /* AWB Y_min Low */
++ {0xfc,0x22},
++ {0x8c,0x04}, /* AWB Min Y Weight AWB */
++ {0x8d,0x16}, /* AWB Max Y Weight */
++
++ {0xfc,0x00},
++ {0x32,0x04}, /* AWB moving average 8 frame */
++ {0x81,0x10}, /* AWB G gain suppress Disable */
++ {0xbc,0xf0},
++
++ {0x29,0x04}, /* Y level H */
++ {0x2a,0x00}, /* Y level L */
++ {0x2b,0x03}, /* color level H */
++ {0x2c,0xc8}, /* color level L */
++
++ {0xfc,0x07},
++ {0x37,0x00}, /* Flicker Add for 32 MHz */
++ {0xfc,0x00},
++ {0x72,0xa0}, /* Flicker for 32 MHz */
++ {0x74,0x08}, /* flicker 60 Hz Fix */
++
++ {0xfc,0x20},
++ {0x02,0x02}, /* Flicker Dgain Mode */
++
++ {0xfc,0x00},
++ //{0x23,0x40}, /* Mirror Option */
++ {0x62,0x0a}, /* Mirror Option */
++
++ {0xfc,0x02},
++ {0x4e,0x1b}, /* Enable SDA and SCL pull-up; drive 8 mA */
++ {0x4f,0xf0}, /* PCLK and YC: 8 mA, AF and ZM (AZ): 2 mA */
++
++ {0xfc,0x01},
++ {0x0c,0x03}, /* Full YC Enable */
++ //{0x0c,03}, /* Full YC Enable */
++ //{0x02,02}, /* crcb_sel */
++ //{0x02,02}, /* crcb_sel peter */
++ //{0x01,01}, /* pclk peter */
++ //{0x01,01},
++
++ /*
++ * COLOR MATRIX
++ */
++
++ {0xfc,0x01}, /* color matrix */
++ {0x51,0x0A},
++ {0x52,0x42},
++ {0x53,0xF9},
++ {0x54,0x80},
++ {0x55,0x00},
++ {0x56,0x3D},
++
++ {0x57,0xFE},
++ {0x58,0x0B},
++ {0x59,0x06},
++ {0x5A,0x9C},
++ {0x5B,0xFF},
++ {0x5C,0x59},
++
++ {0x5D,0xFF},
++ {0x5E,0xD8},
++ {0x5F,0xFC},
++ {0x60,0x2E},
++ {0x61,0x07},
++ {0x62,0xFA},
++
++ /*
++ * EDGE ENHANCEMENT
++ */
++
++ {0xfc,0x00},
++ {0x89,0x03}, /* Edge Suppress On */
++ {0xfc,0x0b},
++ {0x42,0x50}, /* Edge AGC MIN */
++ {0x43,0x60}, /* Edge AGC MAX */
++ {0x45,0x18}, /* positive gain AGC MIN */
++ {0x49,0x0a}, /* positive gain AGC MAX */
++ {0x4d,0x18}, /* negative gain AGC MIN */
++ {0x51,0x0a}, /* negative gain AGC MAX */
++
++ {0xfc,0x05},
++ {0x34,0x20}, /* APTCLP */
++ {0x35,0x09}, /* APTSC */
++ {0x36,0x0b}, /* ENHANCE */
++ {0x3f,0x00}, /* NON-LIN */
++ {0x42,0x10}, /* EGFALL */
++ {0x43,0x00}, /* HLFALL */
++ {0x45,0xa0}, /* EGREF */
++ {0x46,0x7a}, /* HLREF */
++ {0x47,0x40}, /* LLREF */
++ {0x48,0x0c},
++ {0x49,0x31}, /* CSSEL EGSEL CS_DLY */
++
++ {0x40,0x41}, /* Y delay */
++
++ /*
++ * GAMMA
++ */
++
++ {0xfc,0x01},
++
++ {0x6F,0x0A}, /* R */
++ {0x70,0x1A},
++ {0x71,0x7A},
++ {0x72,0xF8},
++ {0x73,0x00},
++
++ {0x74,0xA0},
++ {0x75,0x18},
++ {0x76,0x65},
++ {0x77,0xAD},
++ {0x78,0x6A},
++
++ {0x79,0xE2},
++ {0x7A,0x12},
++ {0x7B,0x3D},
++ {0x7C,0x5A},
++ {0x7D,0xBF},
++
++ {0x7E,0x72},
++ {0x7F,0x88},
++ {0x80,0x9D},
++ {0x81,0xB0},
++ {0x82,0xFF},
++
++ {0x83,0xC0},
++ {0x84,0xCF},
++ {0x85,0xDA},
++ {0x86,0xFC},
++
++ {0x87,0x08}, /* G */
++ {0x88,0x12},
++ {0x89,0x42},
++ {0x8A,0xBA},
++ {0x8B,0x00},
++
++ {0x8C,0x75},
++ {0x8D,0xED},
++ {0x8E,0x42},
++ {0x8F,0x80},
++ {0x90,0x5A},
++
++ {0x91,0xB5},
++ {0x92,0xE5},
++ {0x93,0x10},
++ {0x94,0x35},
++ {0x95,0xAF},
++
++ {0x96,0x55},
++ {0x97,0x70},
++ {0x98,0x88},
++ {0x99,0x9D},
++ {0x9A,0xFF},
++
++ {0x9B,0xB1},
++ {0x9C,0xC4},
++ {0x9D,0xD5},
++ {0x9E,0xFC},
++
++ {0x9F,0x05}, /* B */
++ {0xA0,0x18},
++ {0xA1,0x42},
++ {0xA2,0xd7},
++ {0xA3,0x00},
++
++ {0xA4,0xB6},
++ {0xA5,0x3b},
++ {0xA6,0x88},
++ {0xA7,0xC8},
++ {0xA8,0x6A},
++
++ {0xA9,0x00},
++ {0xAA,0x30},
++ {0xAB,0x58},
++ {0xAC,0x78},
++ {0xAD,0xFF},
++
++ {0xAE,0x90},
++ {0xAF,0xA5},
++ {0xB0,0xB6},
++ {0xB1,0xC5},
++ {0xB2,0xFF},
++
++ {0xB3,0xD0},
++ {0xB4,0xD6},
++ {0xB5,0xDA},
++ {0xB6,0xFC},
++
++ /*
++ * HUE CONTROL
++ */
++
++ {0xfc,0x00},
++ {0x48,0x34}, /* 2000K */
++ {0x49,0x34},
++ {0x4a,0xf4},
++ {0x4b,0x00},
++ {0x4c,0x44},
++ {0x4d,0x3c},
++ {0x4e,0xf0},
++ {0x4f,0x0c},
++
++ {0x50,0x34}, /* 3000K */
++ {0x51,0x34},
++ {0x52,0xf4},
++ {0x53,0x00},
++ {0x54,0x44},
++ {0x55,0x3c},
++ {0x56,0xf0},
++ {0x57,0x0c},
++
++ {0x58,0x34}, /* 5100K */
++ {0x59,0x30},
++ {0x5a,0x00},
++ {0x5b,0x04},
++ {0x5c,0x40},
++ {0x5d,0x2c},
++ {0x5e,0xfc},
++ {0x5f,0x04},
++
++ /*
++ * UPPRE0x0x FUNCTION
++ */
++
++ {0xfc,0x00},
++ {0x7e,0xf4},
++
++ /*
++ * BPR
++ */
++
++ {0xfc,0x01},
++ {0x3d,0x10},
++
++ {0xfc,0x0b},
++ {0x0b,0x00}, /* ISP BPR On start */
++ {0x0c,0x20}, /* Th13 AGC Min */
++ {0x0d,0x40}, /* Th13 AGC Max */
++ {0x0e,0x00}, /* Th1 Max H for AGCMIN */
++ {0x0f,0x20}, /* Th1 Max L for AGCMIN */
++ {0x10,0x00}, /* Th1 Min H for AGCMAX */
++ {0x11,0x10}, /* Th1 Min L for AGCMAX */
++ {0x12,0x00}, /* Th3 Max H for AGCMIN */
++ {0x13,0x00}, /* Th3 Max L for AGCMIN */
++ {0x14,0xff}, /* Th3 Min H for AGCMAX */
++ {0x15,0xff}, /* Th3 Min L for AGCMAX */
++ {0x16,0x20}, /* Th57 AGC Min */
++ {0x17,0x40}, /* Th57 AGC Max */
++ {0x18,0x00}, /* Th5 Max H for AGCMIN */
++ {0x19,0x00}, /* Th5 Max L for AGCMIN */
++ {0x1a,0x00}, /* Th5 Min H for AGCMAX */
++ {0x1b,0x20}, /* Th5 Min L for AGCMAX */
++ {0x1c,0x00}, /* Th7 Max H for AGCMIN */
++ {0x1d,0x00}, /* Th7 Max L for AGCMIN */
++ {0x1e,0x00}, /* Th7 Min H for AGCMAX */
++ {0x1f,0x20}, /* Th7 Min L for AGCMAX */
++
++ /*
++ * GR/GB CORRECTION
++ */
++
++ {0xfc,0x01},
++ {0x45,0x0c},
++
++ {0xfc,0x0b},
++ {0x21,0x00}, /* start AGC */
++ {0x22,0x18}, /* AGCMIN */
++ {0x23,0x58}, /* AGCMAX */
++ {0x24,0x0d}, /* G Th AGCMIN */
++ {0x25,0x30}, /* G Th AGCMAX */
++ {0x26,0x0d}, /* RB Th AGCMIN */
++ {0x27,0x30}, /* RB Th AGCMAX */
++
++ /*
++ * NR
++ */
++
++ {0xfc,0x01},
++ {0x4C,0x01}, /* NR Enable */
++ {0x49,0x15}, /* Sig_Th Mult */
++ {0x4B,0x0A}, /* Pre_Th Mult */
++
++ {0xfc,0x0b},
++ {0x28,0x00}, /* NR start AGC */
++ {0x29,0x00}, /* SIG Th AGCMIN H */
++ {0x2a,0x14}, /* SIG Th AGCMIN L */
++ {0x2b,0x00}, /* SIG Th AGCMAX H */
++ {0x2c,0x14}, /* SIG Th AGCMAX L */
++ {0x2d,0x00}, /* PRE Th AGCMIN H */
++ {0x2e,0x90}, /* PRE Th AGCMIN L */
++ {0x2f,0x01}, /* PRE Th AGCMAX H */
++ {0x30,0x00}, /* PRE Th AGCMAX L */
++ {0x31,0x00}, /* POST Th AGCMIN H */
++ {0x32,0xa0}, /* POST Th AGCMIN L */
++ {0x33,0x01}, /* POST Th AGCMAX H */
++ {0x34,0x10}, /* POST Th AGCMAX L */
++
++ /*
++ * 1D-Y/C-SIGMA-LPF
++ */
++
++ {0xfc,0x01},
++ {0x05,0xc0},
++
++ {0xfc,0x0b},
++ {0x35,0x00}, /* YLPF start AGC */
++ {0x36,0x40}, /* YLPF01 AGCMIN */
++ {0x37,0x60}, /* YLPF01 AGCMAX */
++ {0x38,0x00}, /* YLPF SIG01 Th AGCMINH */
++ {0x39,0x18}, /* YLPF SIG01 Th AGCMINL */
++ {0x3a,0x00}, /* YLPF SIG01 Th AGCMAXH */
++ {0x3b,0x40}, /* YLPF SIG01 Th AGCMAXH */
++ {0x3c,0x50}, /* YLPF02 AGCMIN */
++ {0x3d,0x60}, /* YLPF02 AGCMAX */
++ {0x3e,0x00}, /* YLPF SIG02 Th AGCMINH */
++ {0x3f,0x30}, /* YLPF SIG02 Th AGCMINL */
++ {0x40,0x00}, /* YLPF SIG02 Th AGCMAXH */
++ {0x41,0x40}, /* YLPF SIG02 Th AGCMAXH */
++ {0xd4,0x40}, /* CLPF AGCMIN */
++ {0xd5,0x60}, /* CLPF AGCMAX */
++ {0xd6,0xb0}, /* CLPF SIG01 Th AGCMIN */
++ {0xd7,0xf0}, /* CLPF SIG01 Th AGCMAX */
++ {0xd8,0xb0}, /* CLPF SIG02 Th AGCMIN */
++ {0xd9,0xf0}, /* CLPF SIG02 Th AGCMAX */
++
++ /*
++ * COLOR SUPPRESS
++ */
++
++ {0xfc,0x0b},
++ {0x08,0x58}, /* Color suppress AGC MIN */
++ {0x09,0x03}, /* Color suppress MIN H */
++ {0x0a,0x80}, /* Color suppress MIN L */
++
++ /*
++ * SHADING
++ */
++
++ {0xfc,0x09},
++ //Shading file for 3BAFX
++ //s90000// shading off
++ // DSP9_SH_WIDTH_H
++ {0x01,0x06},
++ {0x02,0x40},
++ // DSP9_SH_HEIGHT_H
++ {0x03,0x04},
++ {0x04,0xB0},
++ // DSP9_SH_XCH_R
++ {0x05,0x03},
++ {0x06,0x1A},
++ {0x07,0x02},
++ {0x08,0x4E},
++ // DSP9_SH_XCH_G
++ {0x09,0x03},
++ {0x0A,0x27},
++ {0x0B,0x02},
++ {0x0C,0x11},
++ // DSP9_SH_XCH_B
++ {0x0D,0x03},
++ {0x0E,0x15},
++ {0x0F,0x01},
++ {0x10,0xE3},
++ // DSP9_SH_Del_eH_R
++ {0x1D,0x85},
++ {0x1E,0x55},
++ {0x1F,0x77},
++ {0x20,0x9E},
++ {0x23,0x7F},
++ {0x24,0xE6},
++ {0x21,0x7F},
++ {0x22,0xE6},
++ // DSP9_SH_Del_eH_G
++ {0x25,0x82},
++ {0x26,0x9A},
++ {0x27,0x78},
++ {0x28,0xC0},
++ {0x2B,0x76},
++ {0x2C,0x07},
++ {0x29,0x86},
++ {0x2A,0x09},
++ // DSP9_SH_Del_eH_B
++ {0x2D,0x85},
++ {0x2E,0x55},
++ {0x2F,0x75},
++ {0x30,0x6D},
++ {0x33,0x74},
++ {0x34,0xA2},
++ {0x31,0x84},
++ {0x32,0xA2},
++ // DSP9_SH_VAL_R0H
++ {0x35,0x01},
++ {0x36,0x01},
++ {0x37,0x01},
++ {0x38,0x14},
++ {0x39,0x01},
++ {0x3A,0x45},
++ {0x3B,0x01},
++ {0x3C,0x8A},
++ {0x3D,0x01},
++ {0x3E,0xA3},
++ {0x3F,0x01},
++ {0x40,0xB9},
++ {0x41,0x01},
++ {0x42,0xD9},
++ {0x43,0x01},
++ {0x44,0xF6},
++ // DSP9_SH_VAL_G0H
++ {0x45,0x01},
++ {0x46,0x00},
++ {0x47,0x01},
++ {0x48,0x0E},
++ {0x49,0x01},
++ {0x4A,0x34},
++ {0x4B,0x01},
++ {0x4C,0x68},
++ {0x4D,0x01},
++ {0x4E,0x76},
++ {0x4F,0x01},
++ {0x50,0x94},
++ {0x51,0x01},
++ {0x52,0xAB},
++ {0x53,0x01},
++ {0x54,0xC3},
++ // DSP9_SH_VAL_B0H
++ {0x55,0x01},
++ {0x56,0x00},
++ {0x57,0x01},
++ {0x58,0x0C},
++ {0x59,0x01},
++ {0x5A,0x2B},
++ {0x5B,0x01},
++ {0x5C,0x5D},
++ {0x5D,0x01},
++ {0x5E,0x70},
++ {0x5F,0x01},
++ {0x60,0x8A},
++ {0x61,0x01},
++ {0x62,0xA1},
++ {0x63,0x01},
++ {0x64,0xB3},
++ // DSP9_SH_M_R2_R1H
++ {0x65,0x00},
++ {0x66,0x98},
++ {0x67,0x2C},
++ {0x68,0x02},
++ {0x69,0x60},
++ {0x6A,0xB0},
++ {0x6B,0x05},
++ {0x6C,0x59},
++ {0x6D,0x8C},
++ {0x6E,0x07},
++ {0x6F,0x48},
++ {0x70,0x1B},
++ {0x71,0x09},
++ {0x72,0x82},
++ {0x73,0xC0},
++ {0x74,0x0C},
++ {0x75,0x09},
++ {0x76,0x7B},
++ {0x77,0x0E},
++ {0x78,0xDC},
++ {0x79,0x4D},
++ // DSP9_SH_M_R2_G1H
++ {0x7A,0x00},
++ {0x7B,0xAD},
++ {0x7C,0x76},
++ {0x7D,0x02},
++ {0x7E,0xB5},
++ {0x7F,0xD7},
++ {0x80,0x06},
++ {0x81,0x19},
++ {0x82,0x23},
++ {0x83,0x08},
++ {0x84,0x4C},
++ {0x85,0xE2},
++ {0x86,0x0A},
++ {0x87,0xD7},
++ {0x88,0x5C},
++ {0x89,0x0D},
++ {0x8A,0xB8},
++ {0x8B,0x90},
++ {0x8C,0x10},
++ {0x8D,0xF0},
++ {0x8E,0x7F},
++ // DSP9_SH_M_R2_B1H
++ {0x8F,0x00},
++ {0x90,0xC1},
++ {0x91,0xD0},
++ {0x92,0x03},
++ {0x93,0x07},
++ {0x94,0x3F},
++ {0x95,0x06},
++ {0x96,0xD0},
++ {0x97,0x4F},
++ {0x98,0x09},
++ {0x99,0x46},
++ {0x9A,0x32},
++ {0x9B,0x0C},
++ {0x9C,0x1C},
++ {0x9D,0xFE},
++ {0x9E,0x0F},
++ {0x9F,0x54},
++ {0xA0,0xB1},
++ {0xA1,0x12},
++ {0xA2,0xED},
++ {0xA3,0x4C},
++ // DSP9_SH_SUB_RR0H
++ {0xA4,0x6B},
++ {0xA5,0xAA},
++ {0xA6,0x23},
++ {0xA7,0xE3},
++ {0xA8,0x15},
++ {0xA9,0x88},
++ {0xAA,0x21},
++ {0xAB,0x20},
++ {0xAC,0x1C},
++ {0xAD,0xB6},
++ {0xAE,0x19},
++ {0xAF,0x55},
++ {0xB0,0x16},
++ {0xB1,0xAA},
++ // DSP9_SH_SUB_RG0H
++ {0xB2,0x5E},
++ {0xB3,0x74},
++ {0xB4,0x1F},
++ {0xB5,0x7C},
++ {0xB6,0x12},
++ {0xB7,0xE4},
++ {0xB8,0x1D},
++ {0xB9,0x10},
++ {0xBA,0x19},
++ {0xBB,0x30},
++ {0xBC,0x16},
++ {0xBD,0x39},
++ {0xBE,0x13},
++ {0xBF,0xE2},
++ // DSP9_SH_SUB_RB0H
++ {0xC0,0x54},
++ {0xC1,0x89},
++ {0xC2,0x1C},
++ {0xC3,0x2D},
++ {0xC4,0x10},
++ {0xC5,0xE8},
++ {0xC6,0x1A},
++ {0xC7,0x02},
++ {0xC8,0x16},
++ {0xC9,0x8A},
++ {0xCA,0x13},
++ {0xCB,0xE4},
++ {0xCC,0x11},
++ {0xCD,0xCC},
++
++ {0x00,0x02}, // Shading on
++
++ //==========================================================
++ // X-SHADING
++ //==========================================================
++ {0xfc,0x1B},
++ {0x80,0x01},
++ {0x81,0x00},
++ {0x82,0x4C},
++ {0x83,0x00},
++ {0x84,0x86},
++ {0x85,0x03},
++ {0x86,0x5E},
++ {0x87,0x00},
++ {0x88,0x07},
++ {0x89,0xA4},
++ {0x90,0x00},
++ {0x91,0x12},
++ {0x92,0x00},
++ {0x93,0x12},
++ {0x94,0x00},
++ {0x95,0x12},
++ {0x96,0x00},
++ {0x97,0x12},
++ {0x98,0x00},
++ {0x99,0x12},
++ {0x9A,0x00},
++ {0x9B,0x12},
++ {0x9C,0x00},
++ {0x9D,0x12},
++ {0x9E,0x00},
++ {0x9F,0x12},
++ {0xA0,0x00},
++ {0xA1,0x12},
++ {0xA2,0x00},
++ {0xA3,0x12},
++ {0xA4,0x00},
++ {0xA5,0x12},
++ {0xA6,0x00},
++ {0xA7,0x12},
++ {0xA8,0x00},
++ {0xA9,0x12},
++ {0xAA,0x00},
++ {0xAB,0x12},
++ {0xAC,0x00},
++ {0xAD,0x12},
++ {0xAE,0x00},
++ {0xAF,0x12},
++ {0xB0,0x00},
++ {0xB1,0x12},
++ {0xB2,0x00},
++ {0xB3,0x12},
++ {0xB4,0x00},
++ {0xB5,0x12},
++ {0xB6,0x00},
++ {0xB7,0x15},
++ {0xB8,0x00},
++ {0xB9,0x12},
++ {0xBA,0x00},
++ {0xBB,0x12},
++ {0xBC,0x00},
++ {0xBD,0x12},
++ {0xBE,0x00},
++ {0xBF,0x12},
++ {0xC0,0x00},
++ {0xC1,0x12},
++ {0xC2,0x00},
++ {0xC3,0x12},
++ {0xC4,0x00},
++ {0xC5,0x12},
++ {0xC6,0x00},
++ {0xC7,0x12},
++ {0xC8,0x00},
++ {0xC9,0x12},
++ {0xCA,0x00},
++ {0xCB,0x12},
++ {0xCC,0x00},
++ {0xCD,0x12},
++ {0xCE,0x00},
++ {0xCF,0x12},
++ {0xD0,0x00},
++ {0xD1,0x12},
++ {0xD2,0x00},
++ {0xD3,0x12},
++ {0xD4,0x00},
++ {0xD5,0x12},
++ // x-shading temp. correlation factor
++ {0xfc,0x0b},
++ {0xda,0x00}, // t0(3100K)
++ {0xdb,0xac},
++ {0xdc,0x01}, // tc(5100K)
++ {0xdd,0x30}, // default eeh
++
++ {0xfc,0x00},
++ {0x81,0x10}, // xshading tem
++
++ {0xfc,0x1b},
++ {0x80,0x01}, // X-Shading On
++
++ //==========================================================
++ // AE WINDOW WEIGHT
++ //==========================================================
++ {0xfc,0x00},
++ {0x03,0x4b}, // AE Suppress On
++
++ {0xfc,0x06},
++ {0x01,0x35}, // UXGA AE Window
++ {0x03,0xc2},
++ {0x05,0x48},
++ {0x07,0xb8},
++ {0x31,0x2a}, // Subsampling AE Window
++ {0x33,0x61},
++ {0x35,0x28},
++ {0x37,0x5c},
++ {0x39,0x28},
++ {0x3B,0x5A},
++ {0x3D,0x10}, // 1c
++ {0x3F,0x44},
++
++ {0xfc,0x20},
++ {0x60,0x11},
++ {0x61,0x11},
++ {0x62,0x11},
++ {0x63,0x11},
++ {0x64,0x11},
++ {0x65,0x22},
++ {0x66,0x22},
++ {0x67,0x11},
++ {0x68,0x11},
++ {0x69,0x33},
++ {0x6a,0x33},
++ {0x6b,0x11},
++ {0x6c,0x12},
++ {0x6d,0x55},
++ {0x6e,0x55},
++ {0x6f,0x21},
++ {0x70,0x13},
++ {0x71,0x55},
++ {0x72,0x55},
++ {0x73,0x31},
++ {0x74,0x33},
++ {0x75,0x33},
++ {0x76,0x33},
++ {0x77,0x33},
++
++ //==========================================================
++ // SAIT AWB
++ //==========================================================
++ //=================================
++ // White Point
++ //=================================
++ {0xfc,0x22}, // White Point (For Hue Control & MWB)
++ {0x01,0xD0}, // D65
++ {0x03,0x9B},
++ {0x05,0xC0}, // 5000K
++ {0x07,0xB8},
++ {0x09,0xA7}, // CWF
++ {0x0b,0xDC},
++ {0x0d,0x98}, // 3000K
++ {0x0f,0xE0},
++ {0x11,0x85}, // A
++ {0x12,0x00},
++ {0x13,0xF6},
++ {0x15,0x80}, // 2000K
++ {0x16,0x01},
++ {0x17,0x00},
++
++ //=================================
++ // Basic Setting
++ //=================================
++ {0xfc,0x22},
++ {0xA0,0x01},
++ {0xA1,0x3F},
++ {0xA2,0x0E},
++ {0xA3,0x65},
++ {0xA4,0x07},
++ {0xA5,0xF4},
++ {0xA6,0x11},
++ {0xA7,0xC8},
++ {0xA9,0x02},
++ {0xAA,0x43},
++ {0xAB,0x26},
++ {0xAC,0x1F},
++ {0xAD,0x02},
++ {0xAE,0x2C},
++ {0xAF,0x19},
++ {0xB0,0x0F},
++
++ {0x94,0x3C},
++ {0x95,0xCC},
++ {0x96,0x5C},
++ {0x97,0x4D},
++ {0xD0,0xA8},
++ {0xD1,0x29},
++ {0xD2,0x39},
++ {0xD3,0x22},
++ {0xD4,0x30},
++ {0xDB,0x29},
++ {0xDC,0x7E},
++ {0xDD,0x22},
++
++ {0xE7,0x00},
++ {0xE8,0xca},
++ {0xE9,0x00},
++ {0xEA,0x62},
++ {0xEB,0x00},
++ {0xEC,0x00},
++ {0xEE,0x97},
++
++ //=================================
++ // Pixel Filter Setting
++ //=================================
++ {0xFC,0x07},
++ {0x95,0x8F},
++
++ {0xfc,0x01},
++ {0xD3,0x4B},
++ {0xD4,0x00},
++ {0xD5,0x38},
++ {0xD6,0x00},
++ {0xD7,0x60},
++ {0xD8,0x00},
++ {0xD9,0x4E},
++ {0xDA,0x00},
++ {0xDB,0x27},
++ {0xDC,0x15},
++ {0xDD,0x23},
++ {0xDE,0xAD},
++ {0xDF,0x24},
++ {0xE0,0x01},
++ {0xE1,0x17},
++ {0xE2,0x4A},
++ {0xE3,0x36},
++ {0xE4,0x40},
++ {0xE5,0x40},
++ {0xE6,0x40},
++ {0xE7,0x40},
++ {0xE8,0x30},
++ {0xE9,0x3D},
++ {0xEA,0x17},
++ {0xEB,0x01},
++
++ //=================================
++ // Polygon AWB Region Tune
++ //=================================
++ {0xfc,0x22},
++ {0x18,0x00}, // 1
++ {0x19,0x5a},
++ {0x1a,0xf8},
++ {0x1b,0x00}, // 2
++ {0x1c,0x59},
++ {0x1d,0xCC},
++ {0x1e,0x00}, // 3
++ {0x1f,0x74},
++ {0x20,0xB3},
++ {0x21,0x00}, // 4
++ {0x22,0x86},
++ {0x23,0xA2},
++ {0x24,0x00}, // 5
++ {0x25,0x94},
++ {0x26,0x89},
++ {0x27,0x00}, // 6
++ {0x28,0xA6},
++ {0x29,0x76},
++ {0x2A,0x00}, // 7
++ {0x2B,0xd0},
++ {0x2C,0x5e},
++ {0x2D,0x00}, // 8
++ {0x2E,0xfa},
++ {0x2F,0x47},
++ {0x30,0x00}, // 9
++ {0x31,0xfD},
++ {0x32,0x5D},
++ {0x33,0x00}, // 10
++ {0x34,0xBB},
++ {0x35,0x7c},
++ {0x36,0x00}, // 11
++ {0x37,0xAD},
++ {0x38,0x88},
++ {0x39,0x00}, // 12
++ {0x3A,0x9A},
++ {0x3B,0xA3},
++ {0x3C,0x00}, // 13
++ {0x3D,0x7C},
++ {0x3E,0xDD},
++ {0x3F,0x00}, // 14
++ {0x40,0x00},
++ {0x41,0x00},
++
++ //=================================
++ // Moving Equation Weight
++ //=================================
++ {0xfc,0x22},
++ {0x98,0x07},
++
++ //=================================
++ // EIT Threshold
++ //=================================
++ {0xfc,0x22},
++ {0xb1,0x00}, // {0xunny
++ {0xb2,0x03},
++ {0xb3,0x00},
++ {0xb4,0xc1},
++
++ {0xb5,0x00}, // Cloudy
++ {0xb6,0x05},
++ {0xb7,0xc9},
++ {0xb9,0x81},
++
++ {0xd7,0x00}, // Shade
++ {0xd8,0x35},
++ {0xd9,0x20},
++ {0xda,0x81},
++
++ //=================================
++ // Gain Offset
++ //=================================
++ {0xfc,0x00},
++ {0x79,0xF9},
++ {0x7A,0x02}, // Global AWB gain off{0xet
++
++ {0xfc,0x22},
++ {0x58,0xf6}, // D65 R Off{0xet
++ {0x59,0xff}, // D65 B Off{0xet
++ {0x5A,0xfa}, // 5000K R Off{0xet
++ {0x5B,0xFe}, // 5000K B Off{0xet
++ {0x5C,0xfb}, // CWF R Off{0xet
++ {0x5D,0xFe}, // CWF B Off{0xet
++ {0x5E,0xfb}, // 3000K R Off{0xet
++ {0x5F,0xFb}, // 3000K B Off{0xet
++ {0x60,0xfb}, // A R Off0xet
++ {0x61,0xfb}, // A B Off0xet
++ {0x62,0xfb}, // 2000K R Off0xet
++ {0x63,0xfb}, // 2000K B Off0xet
++
++ {0xde,0x00}, // LARGE OBJECT BUG FIX
++ {0xf0,0x6a}, // RB Ratio
++ //=================================
++ // Green Stablity Enhance
++ //=================================
++ {0xfc,0x22},
++ {0xb9,0x00},
++ {0xba,0x00},
++ {0xbb,0x00},
++ {0xbc,0x00},
++ {0xe5,0x01},
++ {0xe6,0xff},
++
++ {0xbd,0x90},
++
++ //==========================================================
++ // Special Effect
++ //==========================================================
++ {0xfc,0x07}, // Special Effect
++ {0x30,0xc0},
++ {0x31,0x20},
++ {0x32,0x40},
++ {0x33,0xc0},
++ {0x34,0x00},
++ {0x35,0xb0},
++
++ {0xfc,0x00},
++ {0x73,0x21}, // Frame AE Enable, peter
++
++ {0xfc,0x04},
++ {0xc0,0x06},
++ {0xc1,0x70},
++ {0xFF,0xFF} // REGISTER END
++};
++#else
++s5k4xa_t s5k4ba_reg[] =
++{
++//==========================================================
++// CAMERA INITIAL (Analog & Clock Setting)
++//==========================================================
++ {0xfc, 0x07},
++ {0x66, 0x01},// WDT
++ {0xfc, 0x00},
++ {0x00, 0xaa},// For EDS Check
++ {0x21, 0x03},// peter0223 added
++
++ {0xfc, 0x01},
++ {0x04, 0x01},// ARM Clock Divider
++
++ {0xfc, 0x02},// Analog setting
++ {0x55, 0x1e},// LineADLC on(s551a), off(s550a)
++ {0x56, 0x10},// BPR 16code
++ {0x30, 0x82},// Analog offset (capture =?h)
++ {0x37, 0x25},// Global Gain (default:31)
++
++ {0x57, 0x80},// // LineADLC Roffset
++ {0x58, 0x80},//89 //90 // LineADLC Goffset
++ {0x59, 0x80},//90 // LineADLC offset don't care
++
++ {0x44, 0x64},//clamp en[6]=1 on
++ {0x4a, 0x30},//clamp level 0011h [7]~[4]
++
++ {0x2d, 0x48},// double shutter (default:00)
++ {0x4d, 0x08},// Voltage doubler (default:04)
++ {0x4e, 0x00},// IO current 8mA set
++ {0x4f, 0x8a},// IO current 48mA set
++
++ {0x66, 0x41},// 1st comp current 2uA
++ {0x43, 0xef},// ec_comp
++ {0x62, 0x60},// LD control , CFPN_EN off
++
++//==========================================================
++// Table Set for Sub-Sampling
++//==========================================================
++ {0xfc, 0x03},
++ {0x01, 0x60},
++ //{0x2e, 0x00},
++ {0x2e, 0x03},//DHL
++ {0x05, 0x46},// Output Image Size Set for Capture
++ {0x07, 0xb6},
++ {0x0e, 0x04},
++ {0x12, 0x03},
++
++ {0xfc, 0x04},
++ {0xc5, 0x26},// Output Image Size Set for Preview
++ {0xc7, 0x5e},
++ {0xce, 0x04},
++ {0xd2, 0x04},
++ //{0xee, 0x00},//DHL
++ {0xee, 0x01},
++ {0xc0, 0x06},
++ {0xc1, 0x60},//frame_H
++ {0xc2, 0x02},
++ {0xc3, 0x8d},//frame_V
++
++ {0xfc, 0x07},
++ {0x05, 0x00},
++ {0x06, 0x00},
++ {0x07, 0x8b},
++ {0x08, 0xf5},
++ {0x09, 0x00},
++ {0x0a, 0xb4},
++ {0x0b, 0x00},
++ {0x0c, 0xea},
++ {0x0d, 0x00},
++ {0x0e, 0x40},
++
++#if 1
++//==========================================================
++// COMMAND SET
++//==========================================================
++ {0xfc, 0x00},
++ {0x70, 0x02},
++
++ {0xfc, 0x00},
++ {0x73, 0x11},//21 Frmae AE Enable, peter0223
++ {0x20, 0x02},// Change AWB Mode
++
++ {0xfc, 0x00},
++ {0x78, 0x6a},// AGC Max
++
++ {0xfc, 0x00},
++ {0x6c, 0xa0},// AE target
++ {0x6d, 0x00},
++
++ {0xfc, 0x20},
++ {0x16, 0x5a},// AGC frame AE start _for Prevating AE Hunting
++ {0x57, 0x18},// Stable_Frame_AE
++
++ {0xfc, 0x00},
++ {0x83, 0x06},//low condition shutter off // Double shutter off
++
++ {0xfc, 0x0b},
++ {0x5c, 0x69},//70 //AGC value to start shutter on/off suppress
++ {0x5d, 0x65},//60 //AGC value to start double shutter on/off suppress
++
++ {0xfc, 0x20},
++ {0x25, 0x00},// CINTR Min
++ {0x2a, 0x01},// forbidden
++ {0x2b, 0x02},// For Forbidden Area
++ {0x2c, 0x0a},
++ {0x2d, 0x00},// For Forbidden Area
++ {0x2e, 0x00},
++ {0x2f, 0x05},// forbidden
++ {0x14, 0x78},//70
++ {0x01, 0x00},// Stepless_Off
++
++ {0xfc, 0x00},
++ {0x29, 0x04},// Y level
++ {0x2a, 0x00},
++ {0x2b, 0x03},// C level
++ {0x2c, 0x80},//60
++
++ {0xfc, 0x07},
++ {0x37, 0x00},// Flicker
++
++ {0xfc, 0x00},
++ {0x72, 0xa0},// Flicker for 32MHz
++ {0x74, 0x08},// flicker 60Hz fix
++ {0xfc, 0x20},
++ {0x02, 0x12},//02 Flicker Dgain Mode
++ {0xfc, 0x00},
++ {0x62, 0x02},// Hue Control Enable
++
++ {0xfc, 0x01},
++ //{0x0c, 0x02},// Full YC Enable
++ {0x0C, 0x03},//Donghoon
++
++
++//==========================================================
++// COLOR MATRIX
++//==========================================================
++ {0xfc, 0x01}, //DL gain 60
++ {0x51, 0x08}, //06 //08 07
++ {0x52, 0xe8}, //df //9B E7
++ {0x53, 0xfc}, //fd //FC FB
++ {0x54, 0x33}, //09 //07 B9
++ {0x55, 0xfe}, //00 //FF 00
++ {0x56, 0xe6}, //17 //5E 5F
++ {0x57, 0xfe}, //fe //FD FD
++ {0x58, 0x3d}, //4f //0E 46
++ {0x59, 0x08}, //06 //07 05
++ {0x5a, 0x21}, //9b //EE E6
++ {0x5b, 0xfd}, //ff //FF 00
++ {0x5c, 0xa3}, //17 //05 D3
++ {0x5d, 0xff}, //ff //FF FF
++ {0x5e, 0xbc}, //81 //7A 53
++ {0x5f, 0xfc}, //fd //FC FB
++ {0x60, 0x96}, //5b //23 B1
++ {0x61, 0x07}, //07 //08 08
++ {0x62, 0xaf}, //24 //64 FD
++
++//==========================================================
++// EDGE ENHANCEMENT
++//==========================================================
++ {0xfc, 0x05},
++ {0x12, 0x3d},
++ {0x13, 0x3b},
++ {0x14, 0x38},
++ {0x15, 0x3b},
++ {0x16, 0x3d},
++
++ {0x17, 0x3b},
++ {0x18, 0x05},
++ {0x19, 0x09},
++ {0x1a, 0x05},
++ {0x1b, 0x3b},
++
++ {0x1c, 0x38},
++ {0x1d, 0x09},
++ {0x1e, 0x1c},
++ {0x1f, 0x09},
++ {0x20, 0x38},
++
++ {0x21, 0x3b},
++ {0x22, 0x05},
++ {0x23, 0x09},
++ {0x24, 0x05},
++ {0x25, 0x3b},
++
++ {0x26, 0x3d},
++ {0x27, 0x3b},
++ {0x28, 0x38},
++ {0x29, 0x3b},
++ {0x2a, 0x3d},
++
++ {0xfc, 0x00},
++ {0x89, 0x00},// Edge Suppress On
++ {0xfc, 0x0b},
++ {0x42, 0x50},// Edge AGC MIN
++ {0x43, 0x60},// Edge AGC MAX
++ {0x45, 0x18},// positive gain AGC MIN
++ {0x49, 0x06},// positive gain AGC MAX
++ {0x4d, 0x18},// negative gain AGC MIN
++ {0x51, 0x06},// negative gain AGC MAX
++
++ {0xfc, 0x05},
++ {0x34, 0x28},// APTCLP
++ {0x35, 0x03},// APTSC
++ {0x36, 0x0b},// ENHANCE
++ {0x3f, 0x00},// NON-LIN
++ {0x42, 0x10},// EGFALL
++ {0x43, 0x00},// HLFALL
++ {0x45, 0xa0},// EGREF
++ {0x46, 0x7a},// HLREF
++ {0x47, 0x40},// LLREF
++ {0x48, 0x0c},
++ {0x49, 0x31},// CSSEL EGSEL CS_DLY
++
++ {0x40, 0x41},// Y delay
++
++ // New Wide Luma Edge
++ {0xfc, 0x1d},
++ {0x86, 0x00},
++ {0x87, 0x60},
++ {0x88, 0x01},
++ {0x89, 0x20},
++ {0x8a, 0x00},
++ {0x8b, 0x00},
++ {0x8c, 0x00},
++ {0x8d, 0x00},
++ {0x8e, 0x00},
++ {0x8f, 0x20},
++ {0x90, 0x00},
++ {0x91, 0x00},
++ {0x92, 0x00},
++ {0x93, 0x0a},
++ {0x94, 0x00},
++ {0x95, 0x00},
++ {0x96, 0x00},
++ {0x97, 0x20},
++ {0x98, 0x00},
++ {0x99, 0x00},
++ {0x9a, 0xff},
++ {0x9b, 0xea},
++ {0x9c, 0xaa},
++ {0x9d, 0xab},
++ {0x9e, 0xff},
++ {0x9f, 0xf1},
++ {0xa0, 0x55},
++ {0xa1, 0x56},
++ {0xa2, 0x07},
++
++ {0x85, 0x01},
++
++/*
++ * GAMMA
++ */
++
++ {0xfc, 0x1d},
++ {0x00, 0x0b},
++ {0x01, 0x18},
++ {0x02, 0x3d},
++ {0x03, 0x9c},
++ {0x04, 0x00},
++ {0x05, 0x0c},
++ {0x06, 0x76},
++ {0x07, 0xc2},
++ {0x08, 0x00},
++ {0x09, 0x56},
++ {0x0a, 0x34},
++ {0x0b, 0x60},
++ {0x0c, 0x85},
++ {0x0d, 0xa7},
++ {0x0e, 0xaa},
++ {0x0f, 0xc6},
++ {0x10, 0xe2},
++ {0x11, 0xfc},
++ {0x12, 0x13},
++ {0x13, 0xab},
++ {0x14, 0x29},
++ {0x15, 0x3c},
++ {0x16, 0x4b},
++ {0x17, 0x5a},
++ {0x18, 0xff},
++ {0x19, 0x69},
++ {0x1a, 0x78},
++ {0x1b, 0x84},
++ {0x1c, 0x91},
++ {0x1d, 0xff},
++ {0x1e, 0x9c},
++ {0x1f, 0xa7},
++ {0x20, 0xb2},
++ {0x21, 0xbd},
++ {0x22, 0xff},
++ {0x23, 0xc7},
++ {0x24, 0xd2},
++ {0x25, 0xdb},
++ {0x26, 0xe4},
++ {0x27, 0xff},
++ {0x28, 0xec},
++ {0x29, 0xf5},
++ {0x2a, 0xf0},
++ {0x2b, 0x0b},
++ {0x2c, 0x18},
++ {0x2d, 0x3d},
++ {0x2e, 0x9c},
++ {0x2f, 0x00},
++ {0x30, 0x0c},
++ {0x31, 0x76},
++ {0x32, 0xc2},
++ {0x33, 0x00},
++ {0x34, 0x56},
++ {0x35, 0x34},
++ {0x36, 0x60},
++ {0x37, 0x85},
++ {0x38, 0xa7},
++ {0x39, 0xaa},
++ {0x3a, 0xc6},
++ {0x3b, 0xe2},
++ {0x3c, 0xfc},
++ {0x3d, 0x13},
++ {0x3e, 0xab},
++ {0x3f, 0x29},
++ {0x40, 0x3c},
++ {0x41, 0x4b},
++ {0x42, 0x5a},
++ {0x43, 0xff},
++ {0x44, 0x69},
++ {0x45, 0x78},
++ {0x46, 0x84},
++ {0x47, 0x91},
++ {0x48, 0xff},
++ {0x49, 0x9c},
++ {0x4a, 0xa7},
++ {0x4b, 0xb2},
++ {0x4c, 0xbd},
++ {0x4d, 0xff},
++ {0x4e, 0xc7},
++ {0x4f, 0xd2},
++ {0x50, 0xdb},
++ {0x51, 0xe4},
++ {0x52, 0xff},
++ {0x53, 0xec},
++ {0x54, 0xf5},
++ {0x55, 0xf0},
++ {0x56, 0x0b},
++ {0x57, 0x18},
++ {0x58, 0x3d},
++ {0x59, 0x9c},
++ {0x5a, 0x00},
++ {0x5b, 0x0c},
++ {0x5c, 0x76},
++ {0x5d, 0xc2},
++ {0x5e, 0x00},
++ {0x5f, 0x56},
++ {0x60, 0x34},
++ {0x61, 0x60},
++ {0x62, 0x85},
++ {0x63, 0xa7},
++ {0x64, 0xaa},
++ {0x65, 0xc6},
++ {0x66, 0xe2},
++ {0x67, 0xfc},
++ {0x68, 0x13},
++ {0x69, 0xab},
++ {0x6a, 0x29},
++ {0x6b, 0x3c},
++ {0x6c, 0x4b},
++ {0x6d, 0x5a},
++ {0x6e, 0xff},
++ {0x6f, 0x69},
++ {0x70, 0x78},
++ {0x71, 0x84},
++ {0x72, 0x91},
++ {0x73, 0xff},
++ {0x74, 0x9c},
++ {0x75, 0xa7},
++ {0x76, 0xb2},
++ {0x77, 0xbd},
++ {0x78, 0xff},
++ {0x79, 0xc7},
++ {0x7a, 0xd2},
++ {0x7b, 0xdb},
++ {0x7c, 0xe4},
++ {0x7d, 0xff},
++ {0x7e, 0xec},
++ {0x7f, 0xf5},
++ {0x80, 0xf0},
++
++/*
++ * HUE CONTROL
++ */
++
++ {0xfc, 0x00},
++ {0x48, 0x40}, /* 2000K */
++ {0x49, 0x30},
++ {0x4a, 0x00},
++ {0x4b, 0x00},
++ {0x4c, 0x30},
++ {0x4d, 0x38},
++ {0x4e, 0x00},
++ {0x4f, 0x00},
++
++ {0x50, 0x40}, /* 3000K */
++ {0x51, 0x30},
++ {0x52, 0x00},
++ {0x53, 0x00},
++ {0x54, 0x30},
++ {0x55, 0x38},
++ {0x56, 0x00},
++ {0x57, 0x00},
++
++ {0x58, 0x3c}, /* 40 - 5100K */
++ {0x59, 0x30}, /* 4a, 40 */
++ {0x5a, 0x00}, /* 0c, 00 */
++ {0x5b, 0x00}, /* 00 */
++ {0x5c, 0x30}, /* 4a */
++ {0x5d, 0x38}, /* 40 */
++ {0x5e, 0x00}, /* f6, 15 */
++ {0x5f, 0xfc}, /* 00 */
++
++/*
++ * SUPPRESS FUNCTION
++ */
++
++ {0xfc, 0x00},
++ {0x7e, 0xf4},
++
++/*
++ * BPR
++ */
++
++ {0xfc, 0x0b},
++ {0x3d, 0x10},
++
++ {0xfc, 0x0b},
++ {0x0b, 0x00},
++ {0x0c, 0x40},
++ {0x0d, 0x5a},
++ {0x0e, 0x00},
++ {0x0f, 0x20},
++ {0x10, 0x00},
++ {0x11, 0x10},
++ {0x12, 0x00},
++ {0x13, 0x7f},
++ {0x14, 0x03},
++ {0x15, 0xff},
++ {0x16, 0x48},
++ {0x17, 0x60},
++ {0x18, 0x00},
++ {0x19, 0x00},
++ {0x1a, 0x00},
++ {0x1b, 0x20},
++ {0x1c, 0x00},
++ {0x1d, 0x00},
++ {0x1e, 0x00},
++ {0x1f, 0x20},
++
++/*
++ * GR/GB CORRECTION
++ */
++
++ {0xfc, 0x01},
++ {0x45, 0x0c},
++ {0xfc, 0x0b},
++ {0x21, 0x00},
++ {0x22, 0x40},
++ {0x23, 0x60},
++ {0x24, 0x0d},
++ {0x25, 0x20},
++ {0x26, 0x0d},
++ {0x27, 0x20},
++
++/*
++ * NR
++ */
++
++ {0xfc, 0x01},
++ {0x4c, 0x01},
++ {0x49, 0x15},
++ {0x4b, 0x0a},
++
++ {0xfc, 0x0b},
++ {0x28, 0x00},
++ {0x29, 0x00},
++ {0x2a, 0x14},
++ {0x2b, 0x00},
++ {0x2c, 0x14},
++ {0x2d, 0x00},
++ {0x2e, 0xD0},
++ {0x2f, 0x02},
++ {0x30, 0x00},
++ {0x31, 0x00},
++ {0x32, 0xa0},
++ {0x33, 0x00},
++ {0x34, 0xe0},
++
++/*
++ * 1D-Y/C-SIGMA-LPF
++ */
++
++ {0xfc, 0x01},
++ {0x05, 0xC0},
++
++ {0xfc, 0x0b},
++ {0x35, 0x00},
++ {0x36, 0x40},
++ {0x37, 0x60},
++ {0x38, 0x00},
++ {0x39, 0x18},
++ {0x3a, 0x00},
++ {0x3b, 0x40},
++ {0x3c, 0x50},
++ {0x3d, 0x60},
++ {0x3e, 0x00},
++ {0x3f, 0x30},
++ {0x40, 0x00},
++ {0x41, 0x40},
++ {0xd4, 0x40},
++ {0xd5, 0x60},
++ {0xd6, 0xb0},
++ {0xd7, 0xf0},
++ {0xd8, 0xb0},
++ {0xd9, 0xf0},
++
++/*
++ * COLOR SUPPRESS
++ */
++
++ {0xfc, 0x0b},
++ {0x08, 0x58},
++ {0x09, 0x03},
++ {0x0a, 0x00},
++
++/*
++ * SHADING
++ */
++
++ {0xfc, 0x09},
++
++ {0x01, 0x06},
++ {0x02, 0x40},
++
++ {0x03, 0x04},
++ {0x04, 0xB0},
++
++ {0x05, 0x03},
++ {0x06, 0x20},
++ {0x07, 0x02},
++ {0x08, 0x91},
++
++ {0x09, 0x03},
++ {0x0A, 0x25},
++ {0x0B, 0x02},
++ {0x0C, 0x64},
++
++ {0x0D, 0x03},
++ {0x0E, 0x0F},
++ {0x0F, 0x02},
++ {0x10, 0x4E},
++
++ {0x1D, 0x80},
++ {0x1E, 0x00},
++ {0x1F, 0x80},
++ {0x20, 0x00},
++ {0x23, 0x85},
++ {0x24, 0x52},
++ {0x21, 0x79},
++ {0x22, 0xE6},
++
++ {0x25, 0x80},
++ {0x26, 0x00},
++ {0x27, 0x80},
++ {0x28, 0x00},
++ {0x2B, 0x81},
++ {0x2C, 0x48},
++ {0x29, 0x81},
++ {0x2A, 0x48},
++
++ {0x2D, 0x80},
++ {0x2E, 0x00},
++ {0x2F, 0x80},
++ {0x30, 0x00},
++ {0x33, 0x7C},
++ {0x34, 0x45},
++ {0x31, 0x7D},
++ {0x32, 0x7D},
++
++ {0x35, 0x01},
++ {0x36, 0x00},
++ {0x37, 0x01},
++ {0x38, 0x11},
++ {0x39, 0x01},
++ {0x3A, 0x4E},
++ {0x3B, 0x01},
++ {0x3C, 0xAB},
++ {0x3D, 0x01},
++ {0x3E, 0xDC},
++ {0x3F, 0x02},
++ {0x40, 0x1A},
++ {0x41, 0x02},
++ {0x42, 0x6A},
++ {0x43, 0x02},
++ {0x44, 0xD3},
++
++ {0x45, 0x01},
++ {0x46, 0x00},
++ {0x47, 0x01},
++ {0x48, 0x0E},
++ {0x49, 0x01},
++ {0x4A, 0x40},
++ {0x4B, 0x01},
++ {0x4C, 0x8A},
++ {0x4D, 0x01},
++ {0x4E, 0xB5},
++ {0x4F, 0x01},
++ {0x50, 0xE8},
++ {0x51, 0x02},
++ {0x52, 0x27},
++ {0x53, 0x02},
++ {0x54, 0x84},
++
++ {0x55, 0x01},
++ {0x56, 0x00},
++ {0x57, 0x01},
++ {0x58, 0x0C},
++ {0x59, 0x01},
++ {0x5A, 0x37},
++ {0x5B, 0x01},
++ {0x5C, 0x74},
++ {0x5D, 0x01},
++ {0x5E, 0x96},
++ {0x5F, 0x01},
++ {0x60, 0xC9},
++ {0x61, 0x02},
++ {0x62, 0x04},
++ {0x63, 0x02},
++ {0x64, 0x4B},
++
++ {0x65, 0x00},
++ {0x66, 0x9A},
++ {0x67, 0x2D},
++ {0x68, 0x02},
++ {0x69, 0x68},
++ {0x6A, 0xB6},
++ {0x6B, 0x05},
++ {0x6C, 0x6B},
++ {0x6D, 0x99},
++ {0x6E, 0x07},
++ {0x6F, 0x60},
++ {0x70, 0xAD},
++ {0x71, 0x09},
++ {0x72, 0xA2},
++ {0x73, 0xD7},
++ {0x74, 0x0C},
++ {0x75, 0x32},
++ {0x76, 0x19},
++ {0x77, 0x0F},
++ {0x78, 0x0E},
++ {0x79, 0x70},
++
++ {0x7A, 0x00},
++ {0x7B, 0x9C},
++ {0x7C, 0x9F},
++ {0x7D, 0x02},
++ {0x7E, 0x72},
++ {0x7F, 0x7A},
++ {0x80, 0x05},
++ {0x81, 0x81},
++ {0x82, 0x94},
++ {0x83, 0x07},
++ {0x84, 0x7E},
++ {0x85, 0x97},
++ {0x86, 0x09},
++ {0x87, 0xC9},
++ {0x88, 0xEA},
++ {0x89, 0x0C},
++ {0x8A, 0x63},
++ {0x8B, 0x8C},
++ {0x8C, 0x0F},
++ {0x8D, 0x4B},
++ {0x8E, 0x7E},
++
++ {0x8F, 0x00},
++ {0x90, 0x9E},
++ {0x91, 0xBD},
++ {0x92, 0x02},
++ {0x93, 0x7A},
++ {0x94, 0xF5},
++ {0x95, 0x05},
++ {0x96, 0x94},
++ {0x97, 0xA8},
++ {0x98, 0x07},
++ {0x99, 0x98},
++ {0x9A, 0x8F},
++ {0x9B, 0x09},
++ {0x9C, 0xEB},
++ {0x9D, 0xD5},
++ {0x9E, 0x0C},
++ {0x9F, 0x8E},
++ {0xA0, 0x7A},
++ {0xA1, 0x0F},
++ {0xA2, 0x80},
++ {0xA3, 0x7D},
++
++ {0xA4, 0x6A},
++ {0xA5, 0x44},
++ {0xA6, 0x23},
++ {0xA7, 0x6C},
++ {0xA8, 0x15},
++ {0xA9, 0x40},
++ {0xAA, 0x20},
++ {0xAB, 0xB2},
++ {0xAC, 0x1C},
++ {0xAD, 0x56},
++ {0xAE, 0x19},
++ {0xAF, 0x01},
++ {0xB0, 0x16},
++ {0xB1, 0x5F},
++
++ {0xB2, 0x68},
++ {0xB3, 0x9C},
++ {0xB4, 0x22},
++ {0xB5, 0xDE},
++ {0xB6, 0x14},
++ {0xB7, 0xEC},
++ {0xB8, 0x20},
++ {0xB9, 0x30},
++ {0xBA, 0x1B},
++ {0xBB, 0xE5},
++ {0xBC, 0x18},
++ {0xBD, 0x9D},
++ {0xBE, 0x16},
++ {0xBF, 0x05},
++
++ {0xC0, 0x67},
++ {0xC1, 0x36},
++ {0xC2, 0x22},
++ {0xC3, 0x67},
++ {0xC4, 0x14},
++ {0xC5, 0xA4},
++ {0xC6, 0x1F},
++ {0xC7, 0xC2},
++ {0xC8, 0x1B},
++ {0xC9, 0x86},
++ {0xCA, 0x18},
++ {0xCB, 0x49},
++ {0xCC, 0x15},
++ {0xCD, 0xBA},
++
++ {0x00, 0x02}, /* shading on */
++
++/*
++ * X-SHADING
++ */
++
++ {0xfc, 0x1B},
++ {0x80, 0x01},
++ {0x81, 0x00},
++ {0x82, 0x4C},
++ {0x83, 0x00},
++ {0x84, 0x86},
++ {0x85, 0x03},
++ {0x86, 0x5E},
++ {0x87, 0x00},
++ {0x88, 0x07},
++ {0x89, 0xA4},
++ {0x90, 0x00},
++ {0x91, 0x88},
++ {0x92, 0x00},
++ {0x93, 0xC1},
++ {0x94, 0x00},
++ {0x95, 0xF7},
++ {0x96, 0x01},
++ {0x97, 0x21},
++ {0x98, 0x01},
++ {0x99, 0x37},
++ {0x9A, 0x01},
++ {0x9B, 0x0C},
++ {0x9C, 0x00},
++ {0x9D, 0xCE},
++ {0x9E, 0x00},
++ {0x9F, 0x3B},
++ {0xA0, 0x00},
++ {0xA1, 0x5B},
++ {0xA2, 0x00},
++ {0xA3, 0x7A},
++ {0xA4, 0x00},
++ {0xA5, 0x92},
++ {0xA6, 0x00},
++ {0xA7, 0x91},
++ {0xA8, 0x00},
++ {0xA9, 0x81},
++ {0xAA, 0x00},
++ {0xAB, 0x60},
++ {0xAC, 0x07},
++ {0xAD, 0xCB},
++ {0xAE, 0x07},
++ {0xAF, 0xC5},
++ {0xB0, 0x07},
++ {0xB1, 0xBB},
++ {0xB2, 0x07},
++ {0xB3, 0xAA},
++ {0xB4, 0x07},
++ {0xB5, 0xA9},
++ {0xB6, 0x07},
++ {0xB7, 0xB2},
++ {0xB8, 0x07},
++ {0xB9, 0xBF},
++ {0xBA, 0x07},
++ {0xBB, 0x5E},
++ {0xBC, 0x07},
++ {0xBD, 0x3C},
++ {0xBE, 0x06},
++ {0xBF, 0xF9},
++ {0xC0, 0x06},
++ {0xC1, 0xBD},
++ {0xC2, 0x06},
++ {0xC3, 0xB8},
++ {0xC4, 0x06},
++ {0xC5, 0xE2},
++ {0xC6, 0x07},
++ {0xC7, 0x1A},
++ {0xC8, 0x07},
++ {0xC9, 0x15},
++ {0xCA, 0x06},
++ {0xCB, 0xDE},
++ {0xCC, 0x06},
++ {0xCD, 0x9C},
++ {0xCE, 0x06},
++ {0xCF, 0x6F},
++ {0xD0, 0x06},
++ {0xD1, 0x5E},
++ {0xD2, 0x06},
++ {0xD3, 0x84},
++ {0xD4, 0x06},
++ {0xD5, 0xCA},
++
++ {0xfc, 0x0b},
++ {0xda, 0x00},
++ {0xdb, 0x9c},
++ {0xdc, 0x00},
++ {0xdd, 0xd1},
++
++ {0xfc, 0x1b},
++ {0x80, 0x01},
++
++/*
++ * AE WINDOW WEIGHT
++ */
++
++ {0xfc, 0x00},
++ {0x03, 0x4b},
++ {0xfc, 0x06},
++ {0x01, 0x35},
++ {0x03, 0xc2},
++ {0x05, 0x48},
++ {0x07, 0xb8},
++ {0x31, 0x2a},
++ {0x33, 0x61},
++ {0x35, 0x28},
++ {0x37, 0x5c},
++
++ {0xfc, 0x20},
++ {0x60, 0x11},
++ {0x61, 0x11},
++ {0x62, 0x11},
++ {0x63, 0x11},
++ {0x64, 0x11},
++ {0x65, 0x22},
++ {0x66, 0x22},
++ {0x67, 0x11},
++ {0x68, 0x11},
++ {0x69, 0x33},
++ {0x6a, 0x33},
++ {0x6b, 0x11},
++ {0x6c, 0x12},
++ {0x6d, 0x55},
++ {0x6e, 0x55},
++ {0x6f, 0x21},
++ {0x70, 0x13},
++ {0x71, 0x55},
++ {0x72, 0x55},
++ {0x73, 0x31},
++ {0x74, 0x33},
++ {0x75, 0x33},
++ {0x76, 0x33},
++ {0x77, 0x33},
++
++/*
++ * SAIT AWB
++ */
++
++ {0xfc, 0x00},
++ {0x7b, 0x00},
++
++ {0xfc, 0x07},
++ {0x3c, 0x10},
++ {0x3d, 0x10},
++ {0x3e, 0x10},
++ {0x3f, 0x10},
++
++ {0xfc, 0x01},
++ {0xc8, 0xe0},
++ {0xfc, 0x00},
++ {0x3e, 0x10},
++
++ {0xfc, 0x00},
++ {0x3e, 0x10},
++ {0x3d, 0x04},
++ {0x32, 0x02},
++ {0x81, 0x10},
++ {0xbc, 0xf0},
++ {0xfc, 0x22},
++ {0x8c, 0x04},
++ {0x8d, 0x06},
++
++ {0xfc, 0x07},
++ {0x97, 0x00},
++
++/*
++ * White Point
++ */
++
++ {0xfc, 0x22},
++ {0x01, 0xD8},
++ {0x03, 0xA1},
++ {0x05, 0xCA},
++ {0x07, 0xC8},
++ {0x09, 0xB3},
++ {0x0b, 0xE2},
++ {0x0d, 0xA0},
++ {0x0f, 0xF0},
++ {0x11, 0x94},
++ {0x12, 0x00},
++ {0x13, 0xFD},
++ {0x15, 0x88},
++ {0x16, 0x01},
++ {0x17, 0x10},
++
++/*
++ * Basic Setting
++ */
++
++ {0xfc, 0x22},
++ {0xA8, 0xFF},
++
++ {0xA0, 0x01},
++ {0xA1, 0x38},
++ {0xA2, 0x0E},
++ {0xA3, 0x6D},
++ {0xA4, 0x07},
++ {0xA5, 0xF5},
++ {0xA6, 0x11},
++ {0xA7, 0xBE},
++ {0xA9, 0x02},
++ {0xAA, 0xD2},
++ {0xAB, 0x00},
++ {0xAC, 0x00},
++ {0xAD, 0x02},
++ {0xAE, 0x3F},
++ {0xAF, 0x19},
++ {0xB0, 0x91},
++ {0x94, 0x3D},
++ {0x95, 0x00},
++ {0x96, 0x58},
++ {0x97, 0x80},
++ {0xD0, 0xA2},
++ {0xD1, 0x2E},
++ {0xD2, 0x4D},
++ {0xD3, 0x28},
++ {0xD4, 0x90},
++ {0xDB, 0x2E},
++ {0xDC, 0x7A},
++ {0xDD, 0x28},
++ {0xE7, 0x00},
++ {0xE8, 0xc7},
++ {0xE9, 0x00},
++ {0xEA, 0x62},
++ {0xEB, 0xD2},
++ {0xEC, 0xD9},
++ {0xEE, 0xA6},
++
++ {0xfc, 0x00},
++ {0x8a, 0x02},
++
++/*
++ * Pixel Filter Setting
++ */
++
++ {0xFC, 0x07},
++ {0x95, 0xCF},
++
++ {0xfc, 0x01},
++ {0xd3, 0x4f},
++ {0xd4, 0x00},
++ {0xd5, 0x3c},
++ {0xd6, 0x80},
++ {0xd7, 0x61},
++ {0xd8, 0x00},
++ {0xd9, 0x49},
++ {0xda, 0x00},
++ {0xdb, 0x24},
++ {0xdc, 0x4b},
++ {0xdd, 0x23},
++ {0xde, 0xf2},
++ {0xdf, 0x20},
++ {0xe0, 0x73},
++ {0xe1, 0x18},
++ {0xe2, 0x69},
++ {0xe3, 0x31},
++ {0xe4, 0x40},
++ {0xe5, 0x34},
++ {0xe6, 0x40},
++ {0xe7, 0x40},
++ {0xe8, 0x32},
++ {0xe9, 0x40},
++ {0xea, 0x1c},
++ {0xeb, 0x00},
++
++/*
++ * Polygon AWB Region Tune
++ */
++
++ /* AWB3 - Polygon Region */
++ {0xfc, 0x22},
++ {0x18, 0x00},
++ {0x19, 0x4b},
++ {0x1a, 0xfd},
++ {0x1b, 0x00},
++ {0x1c, 0x41},
++ {0x1d, 0xd9},
++ {0x1e, 0x00},
++ {0x1f, 0x66},
++ {0x20, 0xa9},
++ {0x21, 0x00},
++ {0x22, 0x8b},
++ {0x23, 0x82},
++ {0x24, 0x00},
++ {0x25, 0xa4},
++ {0x26, 0x6c},
++ {0x27, 0x00},
++ {0x28, 0xbd},
++ {0x29, 0x5d},
++ {0x2a, 0x00},
++ {0x2b, 0xdc},
++ {0x2c, 0x4d},
++ {0x2d, 0x00},
++ {0x2e, 0xdc},
++ {0x2f, 0x63},
++ {0x30, 0x00},
++ {0x31, 0xc1},
++ {0x32, 0x72},
++ {0x33, 0x00},
++ {0x34, 0xab},
++ {0x35, 0x84},
++ {0x36, 0x00},
++ {0x37, 0x99},
++ {0x38, 0xa0},
++ {0x39, 0x00},
++ {0x3a, 0x81},
++ {0x3b, 0xe9},
++ {0x3c, 0x00},
++ {0x3d, 0x00},
++ {0x3e, 0x00},
++ {0x3f, 0x00},
++ {0x40, 0x00},
++ {0x41, 0x00},
++
++/*
++ * Moving Equation Weight
++ */
++
++ {0xfc, 0x22},
++ {0x98, 0x07},
++
++/*
++ * EIT Threshold
++ */
++
++ {0xfc, 0x22},
++ {0xb1, 0x00},
++ {0xb2, 0x02},
++ {0xb3, 0x00},
++ {0xb4, 0xC1},
++
++ {0xb5, 0x00},
++ {0xb6, 0x02},
++ {0xb7, 0x00},
++ {0xb9, 0xc2},
++
++ {0xd7, 0x00},
++ {0xd8, 0x35},
++ {0xd9, 0x20},
++ {0xda, 0x81},
++
++/*
++ * Gain Offset
++ */
++
++ {0xfc, 0x00},
++ {0x79, 0xf8},
++ {0x7a, 0x08},
++
++ {0xfc, 0x07},
++ {0x11, 0x01},
++
++ {0xfc, 0x22},
++ {0x58, 0xf8},
++ {0x59, 0x00},
++ {0x5A, 0xfc},
++ {0x5B, 0x00},
++ {0x5C, 0x00},
++ {0x5D, 0x00},
++ {0x5E, 0x00},
++ {0x5F, 0x00},
++ {0x60, 0x00},
++ {0x61, 0xf8},
++ {0x62, 0x00},
++ {0x63, 0xf0},
++
++ {0xde, 0x00},
++ {0xf0, 0x6a},
++
++/*
++ * Green Stablity Enhance
++ */
++
++ {0xfc, 0x22},
++ {0xb9, 0x00},
++ {0xba, 0x00},
++ {0xbb, 0x00},
++ {0xbc, 0x00},
++ {0xe5, 0x01},
++ {0xe6, 0xff},
++ {0xbd, 0x8c},
++
++/*
++ * Special Effect
++ */
++
++ {0xfc, 0x07},
++ {0x30, 0xc0},
++ {0x31, 0x20},
++ {0x32, 0x40},
++ {0x33, 0xc0},
++ {0x34, 0x00},
++ {0x35, 0xb0},
++#endif
++
++/*
++ * ETC
++ */
++
++ {0xfc, 0x01},
++ {0x01, 0x01},
++ {0x00, 0x90},
++ {0xfc, 0x02},
++ {0x03, 0x20},
++
++ {0xfc, 0x20},
++ {0x0f, 0x00},
++
++ {0xfc, 0x00},
++ {0x02, 0x09},
++
++ {0xfc, 0x01},
++ //{0x02, 0x00},
++ {0x02, 0x02},//Donghoon
++};
++#endif
++#else
++#error No samsung CIS moudule !
++#endif
++
++
++/* For VGA ( 640 x 480) on 4BA module */
++
++s5k4xa_t s5k4ba_reg_vga[] =
++{
++ // To do.
++};
++
++/* For SVGA ( 800 x 600) on 4BA module */
++
++s5k4xa_t s5k4ba_reg_svga[] =
++{
++ {0xfc,0x02},
++ {0x2d,0x48},
++ {0x44,0x63},
++
++ {0xfc,0x03},
++ {0x02,0x04},
++ {0xfc,0x20},
++ {0x14,0x70},
++
++ {0xfc,0x00},
++ {0x03,0x4b}, /* AE/AWB On */
++ {0x7e,0xf4}, /* Suppress On */
++ {0x89,0x03}, /* Edge Suppress On */
++
++ {0xfc,0x02},
++ {0x02,0x0e}, /* sensor BPRoff */
++
++ {0xfc,0x20},
++ {0x16,0x60}, /* Frame AE Start */
++
++ {0xfc,0x02},
++ {0x30,0x90}, /* Analog offset */
++ {0x37,0x0d}, /* Global Gain */
++ {0x60,0x00}, /* Blank_Adrs */
++ {0x45,0x0e}, /* CDS Timing for Average Sub_Sampling */
++ {0x47,0x2f},
++
++ {0xfc,0x01},
++ {0x9F,0x05}, /* B */
++ {0xA0,0x18},
++ {0xA1,0x42},
++ {0xA2,0xd7},
++ {0xA3,0x00},
++
++ {0xA4,0xB6},
++ {0xA5,0x3b},
++ {0xA6,0x88},
++ {0xA7,0xC8},
++ {0xA8,0x6A},
++
++ {0xfc,0x05},
++ {0x34,0x20}, /* APTCLP */
++ {0x35,0x08}, /* 9 - APTSC */
++
++ {0xfc,0x00}, /* flash 0821 */
++ {0x32,0x04}, /* AWB moving average 8 frame */
++
++ {0xfc,0x01},
++ {0x01,0x01}, /* Pclk inversion */
++
++ {0xfc,0x00},
++ {0x02,0x09}, /* 800 x 600 */
++
++
++ {0xFF,0xFF} /* REGISTER END */
++};
++
++/* For SXGA (1280 x 1024 = 1.3M) on 4BA module */
++
++s5k4xa_t s5k4ba_reg_sxga[] =
++{
++ // To do.
++};
++
++
++/* For UXGA (1600 x 1200 = 2M) on 4BA module */
++
++s5k4xa_t s5k4ba_reg_uxga[] =
++{
++ // To do.
++};
++
++
++/* For SQVGA on 4BA module */
++
++s5k4xa_t s5k4ba_reg_qsvga[] =
++{
++ /* Pclk inversion */
++ {0xfc,0x01},
++ {0x01,0x01},
++
++ /* To setting CbCr selection on Table 14h */
++ {0xfc, 0x14},
++ {0x5c, 0x00},
++
++ /* To load table_11 H4V4 */
++ {0xfc, 0x00},
++ {0x02, 0x0B}
++};
++
++#define S5K4BA_INIT_REGS ARRAY_SIZE(s5k4ba_reg)
++#define S5K4BA_UXGA_REGS ARRAY_SIZE(s5k4ba_reg_uxga)
++#define S5K4BA_SVGA_REGS ARRAY_SIZE(s5k4ba_reg_svga)
++#define S5K4BA_VGA_REGS ARRAY_SIZE(s5k4ba_reg_vga)
++#define S5K4BA_QSVGA_REGS ARRAY_SIZE(s5k4ba_reg_qsvga)
++
++
++#define S5K4BA_RISC_REGS 0xEB
++#define S5K4BA_ISP_REGS 0xFB /* S5C7323X */
++#define S5K4BA_CIS_REGS 0x2F /* S5K437LA03 */
++
++
++#define S5K4BA_REGS (0x1000)
++
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/media/video/samsung/Makefile linux-2.6.29-rc3.owrt.om/drivers/media/video/samsung/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/media/video/samsung/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/media/video/samsung/Makefile 2009-05-10 22:27:59.000000000 +0200
+@@ -0,0 +1,4 @@
++#
++# Samsung CIS camera module
++#
++obj-$(CONFIG_VIDEO_SAMSUNG_S5K4BA) += 4xa_sensor.o
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/media/video/videodev2_s3c.h linux-2.6.29-rc3.owrt.om/drivers/media/video/videodev2_s3c.h
+--- linux-2.6.29-rc3.owrt/drivers/media/video/videodev2_s3c.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/media/video/videodev2_s3c.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,210 @@
++#ifndef __VIDEODEV2_S3C_H_
++#define __VIDEODEV2_S3C_H_
++
++#include <linux/videodev2.h>
++
++#define V4L2_INPUT_TYPE_MSDMA 3
++#define V4L2_INPUT_TYPE_INTERLACE 4
++
++/****************************************************************
++* struct v4l2_control
++* Control IDs defined by S3C
++*****************************************************************/
++/* Image Effect */
++#define V4L2_CID_ORIGINAL (V4L2_CID_PRIVATE_BASE + 0)
++#define V4L2_CID_ARBITRARY (V4L2_CID_PRIVATE_BASE + 1)
++#define V4L2_CID_NEGATIVE (V4L2_CID_PRIVATE_BASE + 2)
++#define V4L2_CID_ART_FREEZE (V4L2_CID_PRIVATE_BASE + 3)
++#define V4L2_CID_EMBOSSING (V4L2_CID_PRIVATE_BASE + 4)
++#define V4L2_CID_SILHOUETTE (V4L2_CID_PRIVATE_BASE + 5)
++
++/* Image Rotate */
++#define V4L2_CID_ROTATE_90 (V4L2_CID_PRIVATE_BASE + 6)
++#define V4L2_CID_ROTATE_180 (V4L2_CID_PRIVATE_BASE + 7)
++#define V4L2_CID_ROTATE_270 (V4L2_CID_PRIVATE_BASE + 8)
++#define V4L2_CID_ROTATE_BYPASS (V4L2_CID_PRIVATE_BASE + 9)
++
++/* Zoom-in, Zoom-out */
++#define V4L2_CID_ZOOMIN (V4L2_CID_PRIVATE_BASE + 10)
++#define V4L2_CID_ZOOMOUT (V4L2_CID_PRIVATE_BASE + 11)
++
++/****************************************************************
++* I O C T L C O D E S F O R V I D E O D E V I C E S
++* It's only for S3C
++*****************************************************************/
++#define VIDIOC_S_CAMERA_START _IO ('V', BASE_VIDIOC_PRIVATE + 0)
++#define VIDIOC_S_CAMERA_STOP _IO ('V', BASE_VIDIOC_PRIVATE + 1)
++#define VIDIOC_MSDMA_START _IOW ('V', BASE_VIDIOC_PRIVATE + 2, struct v4l2_msdma_format)
++#define VIDIOC_MSDMA_STOP _IOW ('V', BASE_VIDIOC_PRIVATE + 3, struct v4l2_msdma_format)
++#define VIDIOC_S_MSDMA _IOW ('V', BASE_VIDIOC_PRIVATE + 4, struct v4l2_msdma_format)
++#define VIDIOC_S_INTERLACE_MODE _IOW ('V', BASE_VIDIOC_PRIVATE + 5, struct v4l2_interlace_format)
++
++/*
++ * INTERLACE MODE
++ */
++#define S3C_VIDEO_DECODER_PAL 1 /* can decode PAL signal */
++#define S3C_VIDEO_DECODER_NTSC 2 /* can decode NTSC */
++#define S3C_VIDEO_DECODER_SECAM 4 /* can decode SECAM */
++#define S3C_VIDEO_DECODER_AUTO 8 /* can autosense norm */
++#define S3C_VIDEO_DECODER_CCIR 16 /* CCIR-601 pixel rate (720 pixels per line) instead of square pixel rate */
++
++#define S3C_DECODER_INIT _IOW ('V', BASE_VIDIOC_PRIVATE + 14, struct s3c_video_decoder_init) /* init internal registers at once */
++#define S3C_DECODER_GET_CAPABILITIES _IOR ('V', BASE_VIDIOC_PRIVATE + 6, struct s3c_video_decoder_capability)
++#define S3C_DECODER_GET_STATUS _IOR ('V', BASE_VIDIOC_PRIVATE + 7, int)
++#define S3C_DECODER_SET_NORM _IOW ('V', BASE_VIDIOC_PRIVATE + 8, int)
++#define S3C_DECODER_SET_INPUT _IOW ('V', BASE_VIDIOC_PRIVATE + 9, int) /* 0 <= input < #inputs */
++#define S3C_DECODER_SET_OUTPUT _IOW ('V', BASE_VIDIOC_PRIVATE + 10, int) /* 0 <= output < #outputs */
++#define S3C_DECODER_ENABLE_OUTPUT _IOW ('V', BASE_VIDIOC_PRIVATE + 11, int) /* boolean output enable control */
++#define S3C_DECODER_SET_PICTURE _IOW ('V', BASE_VIDIOC_PRIVATE + 12, struct video_picture)
++#define S3C_DECODER_SET_GPIO _IOW ('V', BASE_VIDIOC_PRIVATE + 13, int) /* switch general purpose pin */
++#define S3C_DECODER_SET_VBI_BYPASS _IOW ('V', BASE_VIDIOC_PRIVATE + 15, int) /* switch vbi bypass */
++#define S3C_DECODER_DUMP _IO ('V', BASE_VIDIOC_PRIVATE + 16) /* debug hook */
++
++enum v4l2_msdma_input {
++ V4L2_MSDMA_CODEC = 1,
++ V4L2_MSDMA_PREVIEW = 2,
++};
++
++struct v4l2_msdma_format
++{
++ __u32 width; /* MSDMA INPUT : Source X size */
++ __u32 height; /* MSDMA INPUT : Source Y size */
++ __u32 pixelformat;
++ enum v4l2_msdma_input input_path;
++};
++
++struct v4l2_interlace_format
++{
++ __u32 width; /* INTERLACE INPUT : Source X size */
++ __u32 height; /* INTERLACE INPUT : Source Y size */
++};
++
++struct s3c_video_decoder_init {
++ unsigned char len;
++ const unsigned char *data;
++};
++
++struct s3c_video_decoder_capability { /* this name is too long */
++ __u32 flags;
++ int inputs; /* number of inputs */
++ int outputs; /* number of outputs */
++};
++
++static struct v4l2_input fimc_inputs[] = {
++ {
++ .index = 0,
++ .name = "S3C FIMC External Camera Input",
++ .type = V4L2_INPUT_TYPE_CAMERA,
++ .audioset = 1,
++ .tuner = 0,
++ .std = V4L2_STD_PAL_BG | V4L2_STD_NTSC_M,
++ .status = 0,
++ },
++ {
++ .index = 1,
++ .name = "Memory Input (MSDMA)",
++ .type = V4L2_INPUT_TYPE_MSDMA,
++ .audioset = 2,
++ .tuner = 0,
++ .std = V4L2_STD_PAL_BG | V4L2_STD_NTSC_M,
++ .status = 0,
++ }
++};
++
++static struct v4l2_output fimc_outputs[] = {
++ {
++ .index = 0,
++ .name = "Pingpong Memory Output",
++ .type = 0,
++ .audioset = 0,
++ .modulator = 0,
++ .std = 0,
++ },
++ {
++ .index = 1,
++ .name = "LCD FIFO Output",
++ .type = 0,
++ .audioset = 0,
++ .modulator = 0,
++ .std = 0,
++ }
++};
++
++const struct v4l2_fmtdesc fimc_codec_formats[] = {
++ {
++ .index = 0,
++ .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
++ .flags = FORMAT_FLAGS_PACKED,
++ .description = "16 bpp RGB, le",
++ .pixelformat = V4L2_PIX_FMT_RGB565,
++ },
++ {
++ .index = 1,
++ .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
++ .flags = FORMAT_FLAGS_PACKED,
++ .description = "32 bpp RGB, le",
++ .pixelformat = V4L2_PIX_FMT_BGR32,
++ },
++ {
++ .index = 2,
++ .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
++ .flags = FORMAT_FLAGS_PLANAR,
++ .description = "4:2:2, planar, Y-Cb-Cr",
++ .pixelformat = V4L2_PIX_FMT_YUV422P,
++
++ },
++ {
++ .index = 3,
++ .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
++ .flags = FORMAT_FLAGS_PLANAR,
++ .description = "4:2:0, planar, Y-Cb-Cr",
++ .pixelformat = V4L2_PIX_FMT_YUV420,
++ }
++};
++
++const struct v4l2_fmtdesc fimc_preview_formats[] = {
++ {
++ .index = 0,
++ .type = V4L2_BUF_TYPE_VIDEO_OVERLAY,
++ .flags = FORMAT_FLAGS_PACKED,
++ .description = "16 bpp RGB, le",
++ .pixelformat = V4L2_PIX_FMT_RGB565,
++ },
++ {
++ .index = 1,
++ .type = V4L2_BUF_TYPE_VIDEO_OVERLAY,
++ .flags = FORMAT_FLAGS_PACKED,
++ .description = "24 bpp RGB, le",
++ .pixelformat = V4L2_PIX_FMT_RGB24,
++ },
++ {
++ .index = 2,
++ .type = V4L2_BUF_TYPE_VIDEO_OVERLAY,
++ .flags = FORMAT_FLAGS_PACKED,
++ .description = "32 bpp RGB, le",
++ .pixelformat = V4L2_PIX_FMT_BGR32,
++ },
++ {
++ .index = 3,
++ .type = V4L2_BUF_TYPE_VIDEO_OVERLAY,
++ .flags = FORMAT_FLAGS_PLANAR,
++ .description = "4:2:2, planar, Y-Cb-Cr",
++ .pixelformat = V4L2_PIX_FMT_YUV422P,
++
++ },
++ {
++ .index = 4,
++ .type = V4L2_BUF_TYPE_VIDEO_OVERLAY,
++ .flags = FORMAT_FLAGS_PLANAR,
++ .description = "4:2:0, planar, Y-Cb-Cr",
++ .pixelformat = V4L2_PIX_FMT_YUV420,
++ }
++};
++
++#define NUMBER_OF_PREVIEW_FORMATS ARRAY_SIZE(fimc_preview_formats)
++#define NUMBER_OF_CODEC_FORMATS ARRAY_SIZE(fimc_codec_formats)
++#define NUMBER_OF_INPUTS ARRAY_SIZE(fimc_inputs)
++#define NUMBER_OF_OUTPUTS ARRAY_SIZE(fimc_outputs)
++
++#endif
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mfd/glamo/glamo-core.c linux-2.6.29-rc3.owrt.om/drivers/mfd/glamo/glamo-core.c
+--- linux-2.6.29-rc3.owrt/drivers/mfd/glamo/glamo-core.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/mfd/glamo/glamo-core.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,1457 @@
++/* Smedia Glamo 336x/337x driver
++ *
++ * (C) 2007 by Openmoko, Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/errno.h>
++#include <linux/string.h>
++#include <linux/mm.h>
++#include <linux/tty.h>
++#include <linux/slab.h>
++#include <linux/delay.h>
++#include <linux/fb.h>
++#include <linux/init.h>
++#include <linux/irq.h>
++#include <linux/interrupt.h>
++#include <linux/workqueue.h>
++#include <linux/wait.h>
++#include <linux/platform_device.h>
++#include <linux/kernel_stat.h>
++#include <linux/spinlock.h>
++#include <linux/glamofb.h>
++#include <linux/mmc/mmc.h>
++#include <linux/mmc/host.h>
++
++#include <asm/io.h>
++#include <asm/uaccess.h>
++#include <asm/div64.h>
++
++//#include <mach/regs-irq.h>
++
++#ifdef CONFIG_PM
++#include <linux/pm.h>
++#endif
++
++#include "glamo-regs.h"
++#include "glamo-core.h"
++
++#define RESSIZE(ressource) (((ressource)->end - (ressource)->start)+1)
++
++#define GLAMO_MEM_REFRESH_COUNT 0x100
++
++
++/*
++ * Glamo internal settings
++ *
++ * We run the memory interface from the faster PLLB on 2.6.28 kernels and
++ * above. Couple of GTA02 users report trouble with memory bus when they
++ * upgraded from 2.6.24. So this parameter allows reversion to 2.6.24
++ * scheme if their Glamo chip needs it.
++ *
++ * you can override the faster default on kernel commandline using
++ *
++ * glamo3362.slow_memory=1
++ *
++ * for example
++ */
++
++static int slow_memory = 0;
++module_param(slow_memory, int, 0644);
++
++struct reg_range {
++ int start;
++ int count;
++ char *name;
++ char dump;
++};
++struct reg_range reg_range[] = {
++ { 0x0000, 0x76, "General", 1 },
++ { 0x0200, 0x16, "Host Bus", 1 },
++ { 0x0300, 0x38, "Memory", 1 },
++/* { 0x0400, 0x100, "Sensor", 0 }, */
++/* { 0x0500, 0x300, "ISP", 0 }, */
++/* { 0x0800, 0x400, "JPEG", 0 }, */
++/* { 0x0c00, 0xcc, "MPEG", 0 }, */
++ { 0x1100, 0xb2, "LCD 1", 1 },
++ { 0x1200, 0x64, "LCD 2", 1 },
++ { 0x1400, 0x40, "MMC", 1 },
++/* { 0x1500, 0x080, "MPU 0", 0 },
++ { 0x1580, 0x080, "MPU 1", 0 },
++ { 0x1600, 0x080, "Cmd Queue", 0 },
++ { 0x1680, 0x080, "RISC CPU", 0 },
++ { 0x1700, 0x400, "2D Unit", 0 },
++ { 0x1b00, 0x900, "3D Unit", 0 }, */
++};
++
++static struct glamo_core *glamo_handle;
++
++static inline void __reg_write(struct glamo_core *glamo,
++ u_int16_t reg, u_int16_t val)
++{
++ writew(val, glamo->base + reg);
++}
++
++static inline u_int16_t __reg_read(struct glamo_core *glamo,
++ u_int16_t reg)
++{
++ return readw(glamo->base + reg);
++}
++
++static void __reg_set_bit_mask(struct glamo_core *glamo,
++ u_int16_t reg, u_int16_t mask,
++ u_int16_t val)
++{
++ u_int16_t tmp;
++
++ val &= mask;
++
++ tmp = __reg_read(glamo, reg);
++ tmp &= ~mask;
++ tmp |= val;
++ __reg_write(glamo, reg, tmp);
++}
++
++static void reg_set_bit_mask(struct glamo_core *glamo,
++ u_int16_t reg, u_int16_t mask,
++ u_int16_t val)
++{
++ spin_lock(&glamo->lock);
++ __reg_set_bit_mask(glamo, reg, mask, val);
++ spin_unlock(&glamo->lock);
++}
++
++static inline void __reg_set_bit(struct glamo_core *glamo,
++ u_int16_t reg, u_int16_t bit)
++{
++ __reg_set_bit_mask(glamo, reg, bit, 0xffff);
++}
++
++static inline void __reg_clear_bit(struct glamo_core *glamo,
++ u_int16_t reg, u_int16_t bit)
++{
++ __reg_set_bit_mask(glamo, reg, bit, 0);
++}
++
++static inline void glamo_vmem_write(struct glamo_core *glamo, u_int32_t addr,
++ u_int16_t *src, int len)
++{
++ if (addr & 0x0001 || (unsigned long)src & 0x0001 || len & 0x0001) {
++ dev_err(&glamo->pdev->dev, "unaligned write(0x%08x, 0x%p, "
++ "0x%x)!!\n", addr, src, len);
++ }
++
++}
++
++static inline void glamo_vmem_read(struct glamo_core *glamo, u_int16_t *buf,
++ u_int32_t addr, int len)
++{
++ if (addr & 0x0001 || (unsigned long) buf & 0x0001 || len & 0x0001) {
++ dev_err(&glamo->pdev->dev, "unaligned read(0x%p, 0x08%x, "
++ "0x%x)!!\n", buf, addr, len);
++ }
++
++
++}
++
++/***********************************************************************
++ * resources of sibling devices
++ ***********************************************************************/
++
++#if 0
++static struct resource glamo_core_resources[] = {
++ {
++ .start = GLAMO_REGOFS_GENERIC,
++ .end = GLAMO_REGOFS_GENERIC + 0x400,
++ .flags = IORESOURCE_MEM,
++ }, {
++ .start = 0,
++ .end = 0,
++ .flags = IORESOURCE_IRQ,
++ },
++};
++
++static struct platform_device glamo_core_dev = {
++ .name = "glamo-core",
++ .resource = &glamo_core_resources,
++ .num_resources = ARRAY_SIZE(glamo_core_resources),
++};
++#endif
++
++static struct resource glamo_jpeg_resources[] = {
++ {
++ .start = GLAMO_REGOFS_JPEG,
++ .end = GLAMO_REGOFS_MPEG - 1,
++ .flags = IORESOURCE_MEM,
++ }, {
++ .start = IRQ_GLAMO_JPEG,
++ .end = IRQ_GLAMO_JPEG,
++ .flags = IORESOURCE_IRQ,
++ },
++};
++
++static struct platform_device glamo_jpeg_dev = {
++ .name = "glamo-jpeg",
++ .resource = glamo_jpeg_resources,
++ .num_resources = ARRAY_SIZE(glamo_jpeg_resources),
++};
++
++static struct resource glamo_mpeg_resources[] = {
++ {
++ .start = GLAMO_REGOFS_MPEG,
++ .end = GLAMO_REGOFS_LCD - 1,
++ .flags = IORESOURCE_MEM,
++ }, {
++ .start = IRQ_GLAMO_MPEG,
++ .end = IRQ_GLAMO_MPEG,
++ .flags = IORESOURCE_IRQ,
++ },
++};
++
++static struct platform_device glamo_mpeg_dev = {
++ .name = "glamo-mpeg",
++ .resource = glamo_mpeg_resources,
++ .num_resources = ARRAY_SIZE(glamo_mpeg_resources),
++};
++
++static struct resource glamo_2d_resources[] = {
++ {
++ .start = GLAMO_REGOFS_2D,
++ .end = GLAMO_REGOFS_3D - 1,
++ .flags = IORESOURCE_MEM,
++ }, {
++ .start = IRQ_GLAMO_2D,
++ .end = IRQ_GLAMO_2D,
++ .flags = IORESOURCE_IRQ,
++ },
++};
++
++static struct platform_device glamo_2d_dev = {
++ .name = "glamo-2d",
++ .resource = glamo_2d_resources,
++ .num_resources = ARRAY_SIZE(glamo_2d_resources),
++};
++
++static struct resource glamo_3d_resources[] = {
++ {
++ .start = GLAMO_REGOFS_3D,
++ .end = GLAMO_REGOFS_END - 1,
++ .flags = IORESOURCE_MEM,
++ },
++};
++
++static struct platform_device glamo_3d_dev = {
++ .name = "glamo-3d",
++ .resource = glamo_3d_resources,
++ .num_resources = ARRAY_SIZE(glamo_3d_resources),
++};
++
++static struct platform_device glamo_spigpio_dev = {
++ .name = "glamo-spi-gpio",
++};
++
++static struct resource glamo_fb_resources[] = {
++ /* FIXME: those need to be incremented by parent base */
++ {
++ .name = "glamo-fb-regs",
++ .start = GLAMO_REGOFS_LCD,
++ .end = GLAMO_REGOFS_MMC - 1,
++ .flags = IORESOURCE_MEM,
++ }, {
++ .name = "glamo-fb-mem",
++ .start = GLAMO_OFFSET_FB,
++ .end = GLAMO_OFFSET_FB + GLAMO_FB_SIZE - 1,
++ .flags = IORESOURCE_MEM,
++ },
++};
++
++static struct platform_device glamo_fb_dev = {
++ .name = "glamo-fb",
++ .resource = glamo_fb_resources,
++ .num_resources = ARRAY_SIZE(glamo_fb_resources),
++};
++
++static struct resource glamo_mmc_resources[] = {
++ {
++ /* FIXME: those need to be incremented by parent base */
++ .start = GLAMO_REGOFS_MMC,
++ .end = GLAMO_REGOFS_MPROC0 - 1,
++ .flags = IORESOURCE_MEM
++ }, {
++ .start = IRQ_GLAMO_MMC,
++ .end = IRQ_GLAMO_MMC,
++ .flags = IORESOURCE_IRQ,
++ }, { /* our data buffer for MMC transfers */
++ .start = GLAMO_OFFSET_FB + GLAMO_FB_SIZE,
++ .end = GLAMO_OFFSET_FB + GLAMO_FB_SIZE +
++ GLAMO_MMC_BUFFER_SIZE - 1,
++ .flags = IORESOURCE_MEM
++ },
++};
++
++struct glamo_mci_pdata glamo_mci_def_pdata = {
++ .gpio_detect = 0,
++ .glamo_can_set_mci_power = NULL, /* filled in from MFD platform data */
++ .ocr_avail = MMC_VDD_20_21 |
++ MMC_VDD_21_22 |
++ MMC_VDD_22_23 |
++ MMC_VDD_23_24 |
++ MMC_VDD_24_25 |
++ MMC_VDD_25_26 |
++ MMC_VDD_26_27 |
++ MMC_VDD_27_28 |
++ MMC_VDD_28_29 |
++ MMC_VDD_29_30 |
++ MMC_VDD_30_31 |
++ MMC_VDD_32_33,
++ .glamo_irq_is_wired = NULL, /* filled in from MFD platform data */
++ .mci_suspending = NULL, /* filled in from MFD platform data */
++ .mci_all_dependencies_resumed = NULL, /* filled in from MFD platform data */
++};
++EXPORT_SYMBOL_GPL(glamo_mci_def_pdata);
++
++
++
++static void mangle_mem_resources(struct resource *res, int num_res,
++ struct resource *parent)
++{
++ int i;
++
++ for (i = 0; i < num_res; i++) {
++ if (res[i].flags != IORESOURCE_MEM)
++ continue;
++ res[i].start += parent->start;
++ res[i].end += parent->start;
++ res[i].parent = parent;
++ }
++}
++
++/***********************************************************************
++ * IRQ demultiplexer
++ ***********************************************************************/
++#define irq2glamo(x) (x - IRQ_GLAMO(0))
++
++static void glamo_ack_irq(unsigned int irq)
++{
++ /* clear interrupt source */
++ __reg_write(glamo_handle, GLAMO_REG_IRQ_CLEAR,
++ 1 << irq2glamo(irq));
++}
++
++static void glamo_mask_irq(unsigned int irq)
++{
++ u_int16_t tmp;
++
++ /* clear bit in enable register */
++ tmp = __reg_read(glamo_handle, GLAMO_REG_IRQ_ENABLE);
++ tmp &= ~(1 << irq2glamo(irq));
++ __reg_write(glamo_handle, GLAMO_REG_IRQ_ENABLE, tmp);
++}
++
++static void glamo_unmask_irq(unsigned int irq)
++{
++ u_int16_t tmp;
++
++ /* set bit in enable register */
++ tmp = __reg_read(glamo_handle, GLAMO_REG_IRQ_ENABLE);
++ tmp |= (1 << irq2glamo(irq));
++ __reg_write(glamo_handle, GLAMO_REG_IRQ_ENABLE, tmp);
++}
++
++static struct irq_chip glamo_irq_chip = {
++ .ack = glamo_ack_irq,
++ .mask = glamo_mask_irq,
++ .unmask = glamo_unmask_irq,
++};
++
++static void glamo_irq_demux_handler(unsigned int irq, struct irq_desc *desc)
++{
++ const unsigned int cpu = smp_processor_id();
++
++ desc->status &= ~(IRQ_REPLAY | IRQ_WAITING);
++
++ if (unlikely(desc->status & IRQ_INPROGRESS)) {
++ desc->status |= (IRQ_PENDING | IRQ_MASKED);
++ desc->chip->mask(irq);
++ desc->chip->ack(irq);
++ return;
++ }
++
++ kstat_cpu(cpu).irqs[irq]++;
++ desc->chip->ack(irq);
++ desc->status |= IRQ_INPROGRESS;
++
++ do {
++ u_int16_t irqstatus;
++ int i;
++
++ if (unlikely((desc->status &
++ (IRQ_PENDING | IRQ_MASKED | IRQ_DISABLED)) ==
++ (IRQ_PENDING | IRQ_MASKED))) {
++ /* dealing with pending IRQ, unmasking */
++ desc->chip->unmask(irq);
++ desc->status &= ~IRQ_MASKED;
++ }
++
++ desc->status &= ~IRQ_PENDING;
++
++ /* read IRQ status register */
++ irqstatus = __reg_read(glamo_handle, GLAMO_REG_IRQ_STATUS);
++ for (i = 0; i < 9; i++)
++ if (irqstatus & (1 << i))
++ desc_handle_irq(IRQ_GLAMO(i),
++ irq_desc+IRQ_GLAMO(i));
++
++ } while ((desc->status & (IRQ_PENDING | IRQ_DISABLED)) == IRQ_PENDING);
++
++ desc->status &= ~IRQ_INPROGRESS;
++}
++
++
++static ssize_t regs_write(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ unsigned long reg = simple_strtoul(buf, NULL, 10);
++ struct glamo_core *glamo = dev_get_drvdata(dev);
++
++ while (*buf && (*buf != ' '))
++ buf++;
++ if (*buf != ' ')
++ return -EINVAL;
++ while (*buf && (*buf == ' '))
++ buf++;
++ if (!*buf)
++ return -EINVAL;
++
++ printk(KERN_INFO"reg 0x%02lX <-- 0x%04lX\n",
++ reg, simple_strtoul(buf, NULL, 10));
++
++ __reg_write(glamo, reg, simple_strtoul(buf, NULL, 10));
++
++ return count;
++}
++
++static ssize_t regs_read(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ struct glamo_core *glamo = dev_get_drvdata(dev);
++ int n, n1 = 0, r;
++ char * end = buf;
++
++ spin_lock(&glamo->lock);
++
++ for (r = 0; r < ARRAY_SIZE(reg_range); r++) {
++ if (!reg_range[r].dump)
++ continue;
++ n1 = 0;
++ end += sprintf(end, "\n%s\n", reg_range[r].name);
++ for (n = reg_range[r].start;
++ n < reg_range[r].start + reg_range[r].count; n += 2) {
++ if (((n1++) & 7) == 0)
++ end += sprintf(end, "\n%04X: ", n);
++ end += sprintf(end, "%04x ", __reg_read(glamo, n));
++ }
++ end += sprintf(end, "\n");
++ if (!attr) {
++ printk("%s", buf);
++ end = buf;
++ }
++ }
++ spin_unlock(&glamo->lock);
++
++ return end - buf;
++}
++
++static DEVICE_ATTR(regs, 0644, regs_read, regs_write);
++static struct attribute *glamo_sysfs_entries[] = {
++ &dev_attr_regs.attr,
++ NULL
++};
++static struct attribute_group glamo_attr_group = {
++ .name = NULL,
++ .attrs = glamo_sysfs_entries,
++};
++
++
++
++/***********************************************************************
++ * 'engine' support
++ ***********************************************************************/
++
++int __glamo_engine_enable(struct glamo_core *glamo, enum glamo_engine engine)
++{
++ switch (engine) {
++ case GLAMO_ENGINE_LCD:
++ __reg_set_bit_mask(glamo, GLAMO_REG_HOSTBUS(2),
++ GLAMO_HOSTBUS2_MMIO_EN_LCD,
++ GLAMO_HOSTBUS2_MMIO_EN_LCD);
++ __reg_write(glamo, GLAMO_REG_CLOCK_LCD,
++ GLAMO_CLOCK_LCD_EN_M5CLK |
++ GLAMO_CLOCK_LCD_EN_DHCLK |
++ GLAMO_CLOCK_LCD_EN_DMCLK |
++ GLAMO_CLOCK_LCD_EN_DCLK |
++ GLAMO_CLOCK_LCD_DG_M5CLK |
++ GLAMO_CLOCK_LCD_DG_DMCLK);
++ __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_GEN5_1,
++ GLAMO_CLOCK_GEN51_EN_DIV_DHCLK |
++ GLAMO_CLOCK_GEN51_EN_DIV_DMCLK |
++ GLAMO_CLOCK_GEN51_EN_DIV_DCLK, 0xffff);
++ break;
++ case GLAMO_ENGINE_MMC:
++ __reg_set_bit_mask(glamo, GLAMO_REG_HOSTBUS(2),
++ GLAMO_HOSTBUS2_MMIO_EN_MMC,
++ GLAMO_HOSTBUS2_MMIO_EN_MMC);
++ __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_MMC,
++ GLAMO_CLOCK_MMC_EN_M9CLK |
++ GLAMO_CLOCK_MMC_EN_TCLK |
++ GLAMO_CLOCK_MMC_DG_M9CLK |
++ GLAMO_CLOCK_MMC_DG_TCLK, 0xffff);
++ /* enable the TCLK divider clk input */
++ __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_GEN5_1,
++ GLAMO_CLOCK_GEN51_EN_DIV_TCLK,
++ GLAMO_CLOCK_GEN51_EN_DIV_TCLK);
++ break;
++ case GLAMO_ENGINE_2D:
++ __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_2D,
++ GLAMO_CLOCK_2D_EN_M7CLK |
++ GLAMO_CLOCK_2D_EN_GCLK |
++ GLAMO_CLOCK_2D_DG_M7CLK |
++ GLAMO_CLOCK_2D_DG_GCLK, 0xffff);
++ __reg_set_bit_mask(glamo, GLAMO_REG_HOSTBUS(2),
++ GLAMO_HOSTBUS2_MMIO_EN_2D,
++ GLAMO_HOSTBUS2_MMIO_EN_2D);
++ break;
++ case GLAMO_ENGINE_CMDQ:
++ __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_2D,
++ GLAMO_CLOCK_2D_EN_M6CLK, 0xffff);
++ __reg_set_bit_mask(glamo, GLAMO_REG_HOSTBUS(2),
++ GLAMO_HOSTBUS2_MMIO_EN_CQ,
++ GLAMO_HOSTBUS2_MMIO_EN_CQ);
++ break;
++ /* FIXME: Implementation */
++ default:
++ break;
++ }
++
++ glamo->engine_enabled_bitfield |= 1 << engine;
++
++ return 0;
++}
++
++int glamo_engine_enable(struct glamo_core *glamo, enum glamo_engine engine)
++{
++ int ret;
++
++ spin_lock(&glamo->lock);
++
++ ret = __glamo_engine_enable(glamo, engine);
++
++ spin_unlock(&glamo->lock);
++
++ return ret;
++}
++EXPORT_SYMBOL_GPL(glamo_engine_enable);
++
++int __glamo_engine_disable(struct glamo_core *glamo, enum glamo_engine engine)
++{
++ switch (engine) {
++ case GLAMO_ENGINE_LCD:
++ /* remove pixel clock to LCM */
++ __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_LCD,
++ GLAMO_CLOCK_LCD_EN_DCLK, 0);
++ __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_LCD,
++ GLAMO_CLOCK_LCD_EN_DHCLK |
++ GLAMO_CLOCK_LCD_EN_DMCLK, 0);
++ /* kill memory clock */
++ __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_LCD,
++ GLAMO_CLOCK_LCD_EN_M5CLK, 0);
++ /* stop dividing the clocks */
++ __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_GEN5_1,
++ GLAMO_CLOCK_GEN51_EN_DIV_DHCLK |
++ GLAMO_CLOCK_GEN51_EN_DIV_DMCLK |
++ GLAMO_CLOCK_GEN51_EN_DIV_DCLK, 0);
++ break;
++
++ case GLAMO_ENGINE_MMC:
++// __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_MMC,
++// GLAMO_CLOCK_MMC_EN_M9CLK |
++// GLAMO_CLOCK_MMC_EN_TCLK |
++// GLAMO_CLOCK_MMC_DG_M9CLK |
++// GLAMO_CLOCK_MMC_DG_TCLK, 0);
++ /* disable the TCLK divider clk input */
++// __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_GEN5_1,
++// GLAMO_CLOCK_GEN51_EN_DIV_TCLK, 0);
++
++ default:
++ break;
++ }
++
++ glamo->engine_enabled_bitfield &= ~(1 << engine);
++
++ return 0;
++}
++int glamo_engine_disable(struct glamo_core *glamo, enum glamo_engine engine)
++{
++ int ret;
++
++ spin_lock(&glamo->lock);
++
++ ret = __glamo_engine_disable(glamo, engine);
++
++ spin_unlock(&glamo->lock);
++
++ return ret;
++}
++EXPORT_SYMBOL_GPL(glamo_engine_disable);
++
++static const u_int16_t engine_clock_regs[__NUM_GLAMO_ENGINES] = {
++ [GLAMO_ENGINE_LCD] = GLAMO_REG_CLOCK_LCD,
++ [GLAMO_ENGINE_MMC] = GLAMO_REG_CLOCK_MMC,
++ [GLAMO_ENGINE_ISP] = GLAMO_REG_CLOCK_ISP,
++ [GLAMO_ENGINE_JPEG] = GLAMO_REG_CLOCK_JPEG,
++ [GLAMO_ENGINE_3D] = GLAMO_REG_CLOCK_3D,
++ [GLAMO_ENGINE_2D] = GLAMO_REG_CLOCK_2D,
++ [GLAMO_ENGINE_MPEG_ENC] = GLAMO_REG_CLOCK_MPEG,
++ [GLAMO_ENGINE_MPEG_DEC] = GLAMO_REG_CLOCK_MPEG,
++};
++
++void glamo_engine_clkreg_set(struct glamo_core *glamo,
++ enum glamo_engine engine,
++ u_int16_t mask, u_int16_t val)
++{
++ reg_set_bit_mask(glamo, engine_clock_regs[engine], mask, val);
++}
++EXPORT_SYMBOL_GPL(glamo_engine_clkreg_set);
++
++u_int16_t glamo_engine_clkreg_get(struct glamo_core *glamo,
++ enum glamo_engine engine)
++{
++ u_int16_t val;
++
++ spin_lock(&glamo->lock);
++ val = __reg_read(glamo, engine_clock_regs[engine]);
++ spin_unlock(&glamo->lock);
++
++ return val;
++}
++EXPORT_SYMBOL_GPL(glamo_engine_clkreg_get);
++
++struct glamo_script reset_regs[] = {
++ [GLAMO_ENGINE_LCD] = {
++ GLAMO_REG_CLOCK_LCD, GLAMO_CLOCK_LCD_RESET
++ },
++#if 0
++ [GLAMO_ENGINE_HOST] = {
++ GLAMO_REG_CLOCK_HOST, GLAMO_CLOCK_HOST_RESET
++ },
++ [GLAMO_ENGINE_MEM] = {
++ GLAMO_REG_CLOCK_MEM, GLAMO_CLOCK_MEM_RESET
++ },
++#endif
++ [GLAMO_ENGINE_MMC] = {
++ GLAMO_REG_CLOCK_MMC, GLAMO_CLOCK_MMC_RESET
++ },
++ [GLAMO_ENGINE_2D] = {
++ GLAMO_REG_CLOCK_2D, GLAMO_CLOCK_2D_RESET
++ },
++ [GLAMO_ENGINE_JPEG] = {
++ GLAMO_REG_CLOCK_JPEG, GLAMO_CLOCK_JPEG_RESET
++ },
++};
++
++void glamo_engine_reset(struct glamo_core *glamo, enum glamo_engine engine)
++{
++ struct glamo_script *rst;
++
++ if (engine >= ARRAY_SIZE(reset_regs)) {
++ dev_warn(&glamo->pdev->dev, "unknown engine %u ", engine);
++ return;
++ }
++
++ rst = &reset_regs[engine];
++
++ spin_lock(&glamo->lock);
++ __reg_set_bit(glamo, rst->reg, rst->val);
++ __reg_clear_bit(glamo, rst->reg, rst->val);
++ spin_unlock(&glamo->lock);
++}
++EXPORT_SYMBOL_GPL(glamo_engine_reset);
++
++void glamo_lcm_reset(int level)
++{
++ if (!glamo_handle)
++ return;
++
++ glamo_gpio_setpin(glamo_handle, GLAMO_GPIO4, level);
++ glamo_gpio_cfgpin(glamo_handle, GLAMO_GPIO4_OUTPUT);
++
++}
++EXPORT_SYMBOL_GPL(glamo_lcm_reset);
++
++enum glamo_pll {
++ GLAMO_PLL1,
++ GLAMO_PLL2,
++};
++
++static int glamo_pll_rate(struct glamo_core *glamo,
++ enum glamo_pll pll)
++{
++ u_int16_t reg;
++ unsigned int div = 512;
++ /* FIXME: move osci into platform_data */
++ unsigned int osci = 32768;
++
++ if (osci == 32768)
++ div = 1;
++
++ switch (pll) {
++ case GLAMO_PLL1:
++ reg = __reg_read(glamo, GLAMO_REG_PLL_GEN1);
++ break;
++ case GLAMO_PLL2:
++ reg = __reg_read(glamo, GLAMO_REG_PLL_GEN3);
++ break;
++ default:
++ return -EINVAL;
++ }
++ return (osci/div)*reg;
++}
++
++int glamo_engine_reclock(struct glamo_core *glamo,
++ enum glamo_engine engine,
++ int ps)
++{
++ int pll, khz;
++ u_int16_t reg, mask, val = 0;
++
++ if (!ps)
++ return 0;
++
++ switch (engine) {
++ case GLAMO_ENGINE_LCD:
++ pll = GLAMO_PLL1;
++ reg = GLAMO_REG_CLOCK_GEN7;
++ mask = 0xff;
++ break;
++ default:
++ dev_warn(&glamo->pdev->dev,
++ "reclock of engine 0x%x not supported\n", engine);
++ return -EINVAL;
++ break;
++ }
++
++ pll = glamo_pll_rate(glamo, pll);
++ khz = 1000000000UL / ps;
++
++ if (khz)
++ val = (pll / khz) / 1000;
++
++ dev_dbg(&glamo->pdev->dev,
++ "PLL %d, kHZ %d, div %d\n", pll, khz, val);
++
++ if (val) {
++ val--;
++ reg_set_bit_mask(glamo, reg, mask, val);
++ mdelay(5); /* wait some time to stabilize */
++
++ return 0;
++ } else {
++ return -EINVAL;
++ }
++}
++EXPORT_SYMBOL_GPL(glamo_engine_reclock);
++
++/***********************************************************************
++ * script support
++ ***********************************************************************/
++
++int glamo_run_script(struct glamo_core *glamo, struct glamo_script *script,
++ int len, int may_sleep)
++{
++ int i;
++
++ for (i = 0; i < len; i++) {
++ struct glamo_script *line = &script[i];
++
++ switch (line->reg) {
++ case 0xffff:
++ return 0;
++ case 0xfffe:
++ if (may_sleep)
++ msleep(line->val);
++ else
++ mdelay(line->val * 4);
++ break;
++ case 0xfffd:
++ /* spin until PLLs lock */
++ while ((__reg_read(glamo, GLAMO_REG_PLL_GEN5) & 3) != 3)
++ ;
++ break;
++
++ /*
++ * couple of people reported artefacts with 2.6.28 changes, this
++ * allows reversion to 2.6.24 settings
++ */
++
++ case 0x200:
++ switch (slow_memory) {
++ /* choice 1 is the most conservative */
++ case 1: /* 3 waits on Async BB R & W, Use PLL 1 for mem bus */
++ __reg_write(glamo, script[i].reg, 0xef0);
++ break;
++ case 2: /* 2 waits on Async BB R & W, Use PLL 1 for mem bus */
++ __reg_write(glamo, script[i].reg, 0xea0);
++ break;
++ case 3: /* 1 waits on Async BB R & W, Use PLL 1 for mem bus */
++ __reg_write(glamo, script[i].reg, 0xe50);
++ break;
++ case 4: /* 0 waits on Async BB R & W, Use PLL 1 for mem bus */
++ __reg_write(glamo, script[i].reg, 0xe00);
++ break;
++
++ /* using PLL2 for memory bus increases CPU bandwidth significantly */
++ case 5: /* 3 waits on Async BB R & W, Use PLL 2 for mem bus */
++ __reg_write(glamo, script[i].reg, 0xef3);
++ break;
++ case 6: /* 2 waits on Async BB R & W, Use PLL 2 for mem bus */
++ __reg_write(glamo, script[i].reg, 0xea3);
++ break;
++ case 7: /* 1 waits on Async BB R & W, Use PLL 2 for mem bus */
++ __reg_write(glamo, script[i].reg, 0xe53);
++ break;
++ /* default of 0 or >7 is fastest */
++ default: /* 0 waits on Async BB R & W, Use PLL 2 for mem bus */
++ __reg_write(glamo, script[i].reg, 0xe03);
++ break;
++ }
++ break;
++
++ default:
++ __reg_write(glamo, script[i].reg, script[i].val);
++ break;
++ }
++ }
++
++ return 0;
++}
++EXPORT_SYMBOL(glamo_run_script);
++
++static struct glamo_script glamo_init_script[] = {
++ { GLAMO_REG_CLOCK_HOST, 0x1000 },
++ { 0xfffe, 2 },
++ { GLAMO_REG_CLOCK_MEMORY, 0x1000 },
++ { GLAMO_REG_CLOCK_MEMORY, 0x2000 },
++ { GLAMO_REG_CLOCK_LCD, 0x1000 },
++ { GLAMO_REG_CLOCK_MMC, 0x1000 },
++ { GLAMO_REG_CLOCK_ISP, 0x1000 },
++ { GLAMO_REG_CLOCK_ISP, 0x3000 },
++ { GLAMO_REG_CLOCK_JPEG, 0x1000 },
++ { GLAMO_REG_CLOCK_3D, 0x1000 },
++ { GLAMO_REG_CLOCK_3D, 0x3000 },
++ { GLAMO_REG_CLOCK_2D, 0x1000 },
++ { GLAMO_REG_CLOCK_2D, 0x3000 },
++ { GLAMO_REG_CLOCK_RISC1, 0x1000 },
++ { GLAMO_REG_CLOCK_MPEG, 0x3000 },
++ { GLAMO_REG_CLOCK_MPEG, 0x3000 },
++ { GLAMO_REG_CLOCK_MPROC, 0x1000 /*0x100f*/ },
++ { 0xfffe, 2 },
++ { GLAMO_REG_CLOCK_HOST, 0x0000 },
++ { GLAMO_REG_CLOCK_MEMORY, 0x0000 },
++ { GLAMO_REG_CLOCK_LCD, 0x0000 },
++ { GLAMO_REG_CLOCK_MMC, 0x0000 },
++#if 0
++/* unused engines must be left in reset to stop MMC block read "blackouts" */
++ { GLAMO_REG_CLOCK_ISP, 0x0000 },
++ { GLAMO_REG_CLOCK_ISP, 0x0000 },
++ { GLAMO_REG_CLOCK_JPEG, 0x0000 },
++ { GLAMO_REG_CLOCK_3D, 0x0000 },
++ { GLAMO_REG_CLOCK_3D, 0x0000 },
++ { GLAMO_REG_CLOCK_2D, 0x0000 },
++ { GLAMO_REG_CLOCK_2D, 0x0000 },
++ { GLAMO_REG_CLOCK_RISC1, 0x0000 },
++ { GLAMO_REG_CLOCK_MPEG, 0x0000 },
++ { GLAMO_REG_CLOCK_MPEG, 0x0000 },
++#endif
++ { GLAMO_REG_PLL_GEN1, 0x05db }, /* 48MHz */
++ { GLAMO_REG_PLL_GEN3, 0x0aba }, /* 90MHz */
++ { 0xfffd, 0 },
++ /*
++ * b9 of this register MUST be zero to get any interrupts on INT#
++ * the other set bits enable all the engine interrupt sources
++ */
++ { GLAMO_REG_IRQ_ENABLE, 0x01ff },
++ { GLAMO_REG_CLOCK_GEN6, 0x2000 },
++ { GLAMO_REG_CLOCK_GEN7, 0x0101 },
++ { GLAMO_REG_CLOCK_GEN8, 0x0100 },
++ { GLAMO_REG_CLOCK_HOST, 0x000d },
++ /*
++ * b7..b4 = 0 = no wait states on read or write
++ * b0 = 1 select PLL2 for Host interface, b1 = enable it
++ */
++ { 0x200, 0x0e03 /* this is replaced by script parser */ },
++ { 0x202, 0x07ff },
++ { 0x212, 0x0000 },
++ { 0x214, 0x4000 },
++ { 0x216, 0xf00e },
++
++ /* S-Media recommended "set tiling mode to 512 mode for memory access
++ * more efficiency when 640x480" */
++ { GLAMO_REG_MEM_TYPE, 0x0c74 }, /* 8MB, 16 word pg wr+rd */
++ { GLAMO_REG_MEM_GEN, 0xafaf }, /* 63 grants min + max */
++
++ { GLAMO_REGOFS_HOSTBUS + 2, 0xffff }, /* enable on MMIO*/
++
++ { GLAMO_REG_MEM_TIMING1, 0x0108 },
++ { GLAMO_REG_MEM_TIMING2, 0x0010 }, /* Taa = 3 MCLK */
++ { GLAMO_REG_MEM_TIMING3, 0x0000 },
++ { GLAMO_REG_MEM_TIMING4, 0x0000 }, /* CE1# delay fall/rise */
++ { GLAMO_REG_MEM_TIMING5, 0x0000 }, /* UB# LB# */
++ { GLAMO_REG_MEM_TIMING6, 0x0000 }, /* OE# */
++ { GLAMO_REG_MEM_TIMING7, 0x0000 }, /* WE# */
++ { GLAMO_REG_MEM_TIMING8, 0x1002 }, /* MCLK delay, was 0x1000 */
++ { GLAMO_REG_MEM_TIMING9, 0x6006 },
++ { GLAMO_REG_MEM_TIMING10, 0x00ff },
++ { GLAMO_REG_MEM_TIMING11, 0x0001 },
++ { GLAMO_REG_MEM_POWER1, 0x0020 },
++ { GLAMO_REG_MEM_POWER2, 0x0000 },
++ { GLAMO_REG_MEM_DRAM1, 0x0000 },
++ { 0xfffe, 1 },
++ { GLAMO_REG_MEM_DRAM1, 0xc100 },
++ { 0xfffe, 1 },
++ { GLAMO_REG_MEM_DRAM1, 0xe100 },
++ { GLAMO_REG_MEM_DRAM2, 0x01d6 },
++ { GLAMO_REG_CLOCK_MEMORY, 0x000b },
++ { GLAMO_REG_GPIO_GEN1, 0x000f },
++ { GLAMO_REG_GPIO_GEN2, 0x111e },
++ { GLAMO_REG_GPIO_GEN3, 0xccc3 },
++ { GLAMO_REG_GPIO_GEN4, 0x111e },
++ { GLAMO_REG_GPIO_GEN5, 0x000f },
++};
++#if 0
++static struct glamo_script glamo_resume_script[] = {
++
++ { GLAMO_REG_PLL_GEN1, 0x05db }, /* 48MHz */
++ { GLAMO_REG_PLL_GEN3, 0x0aba }, /* 90MHz */
++ { GLAMO_REG_DFT_GEN6, 1 },
++ { 0xfffe, 100 },
++ { 0xfffd, 0 },
++ { 0x200, 0x0e03 },
++
++ /*
++ * b9 of this register MUST be zero to get any interrupts on INT#
++ * the other set bits enable all the engine interrupt sources
++ */
++ { GLAMO_REG_IRQ_ENABLE, 0x01ff },
++ { GLAMO_REG_CLOCK_HOST, 0x0018 },
++ { GLAMO_REG_CLOCK_GEN5_1, 0x18b1 },
++
++ { GLAMO_REG_MEM_DRAM1, 0x0000 },
++ { 0xfffe, 1 },
++ { GLAMO_REG_MEM_DRAM1, 0xc100 },
++ { 0xfffe, 1 },
++ { GLAMO_REG_MEM_DRAM1, 0xe100 },
++ { GLAMO_REG_MEM_DRAM2, 0x01d6 },
++ { GLAMO_REG_CLOCK_MEMORY, 0x000b },
++};
++#endif
++
++enum glamo_power {
++ GLAMO_POWER_ON,
++ GLAMO_POWER_SUSPEND,
++};
++
++static void glamo_power(struct glamo_core *glamo,
++ enum glamo_power new_state)
++{
++ int n;
++ unsigned long flags;
++
++ spin_lock_irqsave(&glamo->lock, flags);
++
++ dev_info(&glamo->pdev->dev, "***** glamo_power -> %d\n", new_state);
++
++ /*
++Power management
++static const REG_VALUE_MASK_TYPE reg_powerOn[] =
++{
++ { REG_GEN_DFT6, REG_BIT_ALL, REG_DATA(1u << 0) },
++ { REG_GEN_PLL3, 0u, REG_DATA(1u << 13) },
++ { REG_GEN_MEM_CLK, REG_BIT_ALL, REG_BIT_EN_MOCACLK },
++ { REG_MEM_DRAM2, 0u, REG_BIT_EN_DEEP_POWER_DOWN },
++ { REG_MEM_DRAM1, 0u, REG_BIT_SELF_REFRESH }
++};
++
++static const REG_VALUE_MASK_TYPE reg_powerStandby[] =
++{
++ { REG_MEM_DRAM1, REG_BIT_ALL, REG_BIT_SELF_REFRESH },
++ { REG_GEN_MEM_CLK, 0u, REG_BIT_EN_MOCACLK },
++ { REG_GEN_PLL3, REG_BIT_ALL, REG_DATA(1u << 13) },
++ { REG_GEN_DFT5, REG_BIT_ALL, REG_DATA(1u << 0) }
++};
++
++static const REG_VALUE_MASK_TYPE reg_powerSuspend[] =
++{
++ { REG_MEM_DRAM2, REG_BIT_ALL, REG_BIT_EN_DEEP_POWER_DOWN },
++ { REG_GEN_MEM_CLK, 0u, REG_BIT_EN_MOCACLK },
++ { REG_GEN_PLL3, REG_BIT_ALL, REG_DATA(1u << 13) },
++ { REG_GEN_DFT5, REG_BIT_ALL, REG_DATA(1u << 0) }
++};
++*/
++
++ switch (new_state) {
++ case GLAMO_POWER_ON:
++
++ /*
++ * glamo state on resume is nondeterministic in some
++ * fundamental way, it has also been observed that the
++ * Glamo reset pin can get asserted by, eg, touching it with
++ * a scope probe. So the only answer is to roll with it and
++ * force an external reset on the Glamo during resume.
++ */
++
++ (glamo->pdata->glamo_external_reset)(0);
++ udelay(10);
++ (glamo->pdata->glamo_external_reset)(1);
++ mdelay(5);
++
++ glamo_run_script(glamo, glamo_init_script,
++ ARRAY_SIZE(glamo_init_script), 0);
++
++ break;
++
++ case GLAMO_POWER_SUSPEND:
++
++ /* nuke interrupts */
++ __reg_write(glamo, GLAMO_REG_IRQ_ENABLE, 0x200);
++
++ /* stash a copy of which engines were running */
++ glamo->engine_enabled_bitfield_suspend =
++ glamo->engine_enabled_bitfield;
++
++ /* take down each engine before we kill mem and pll */
++ for (n = 0; n < __NUM_GLAMO_ENGINES; n++)
++ if (glamo->engine_enabled_bitfield & (1 << n))
++ __glamo_engine_disable(glamo, n);
++
++ /* enable self-refresh */
++
++ __reg_write(glamo, GLAMO_REG_MEM_DRAM1,
++ GLAMO_MEM_DRAM1_EN_DRAM_REFRESH |
++ GLAMO_MEM_DRAM1_EN_GATE_CKE |
++ GLAMO_MEM_DRAM1_SELF_REFRESH |
++ GLAMO_MEM_REFRESH_COUNT);
++ __reg_write(glamo, GLAMO_REG_MEM_DRAM1,
++ GLAMO_MEM_DRAM1_EN_MODEREG_SET |
++ GLAMO_MEM_DRAM1_EN_DRAM_REFRESH |
++ GLAMO_MEM_DRAM1_EN_GATE_CKE |
++ GLAMO_MEM_DRAM1_SELF_REFRESH |
++ GLAMO_MEM_REFRESH_COUNT);
++
++ /* force RAM into deep powerdown */
++
++ __reg_write(glamo, GLAMO_REG_MEM_DRAM2,
++ GLAMO_MEM_DRAM2_DEEP_PWRDOWN |
++ (7 << 6) | /* tRC */
++ (1 << 4) | /* tRP */
++ (1 << 2) | /* tRCD */
++ 2); /* CAS latency */
++
++ /* disable clocks to memory */
++ __reg_write(glamo, GLAMO_REG_CLOCK_MEMORY, 0);
++
++ /* all dividers from OSCI */
++ __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_GEN5_1, 0x400, 0x400);
++
++ /* PLL2 into bypass */
++ __reg_set_bit_mask(glamo, GLAMO_REG_PLL_GEN3, 1 << 12, 1 << 12);
++
++ __reg_write(glamo, 0x200, 0x0e00);
++
++
++ /* kill PLLS 1 then 2 */
++ __reg_write(glamo, GLAMO_REG_DFT_GEN5, 0x0001);
++ __reg_set_bit_mask(glamo, GLAMO_REG_PLL_GEN3, 1 << 13, 1 << 13);
++
++ break;
++ }
++
++ spin_unlock_irqrestore(&glamo->lock, flags);
++}
++
++#if 0
++#define MEMDETECT_RETRY 6
++static unsigned int detect_memsize(struct glamo_core *glamo)
++{
++ int i;
++
++ /*static const u_int16_t pattern[] = {
++ 0x1111, 0x8a8a, 0x2222, 0x7a7a,
++ 0x3333, 0x6a6a, 0x4444, 0x5a5a,
++ 0x5555, 0x4a4a, 0x6666, 0x3a3a,
++ 0x7777, 0x2a2a, 0x8888, 0x1a1a
++ }; */
++
++ for (i = 0; i < MEMDETECT_RETRY; i++) {
++ switch (glamo->type) {
++ case 3600:
++ __reg_write(glamo, GLAMO_REG_MEM_TYPE, 0x0072);
++ __reg_write(glamo, GLAMO_REG_MEM_DRAM1, 0xc100);
++ break;
++ case 3650:
++ switch (glamo->revision) {
++ case GLAMO_CORE_REV_A0:
++ if (i & 1)
++ __reg_write(glamo, GLAMO_REG_MEM_TYPE,
++ 0x097a);
++ else
++ __reg_write(glamo, GLAMO_REG_MEM_TYPE,
++ 0x0173);
++
++ __reg_write(glamo, GLAMO_REG_MEM_DRAM1, 0x0000);
++ msleep(1);
++ __reg_write(glamo, GLAMO_REG_MEM_DRAM1, 0xc100);
++ break;
++ default:
++ if (i & 1)
++ __reg_write(glamo, GLAMO_REG_MEM_TYPE,
++ 0x0972);
++ else
++ __reg_write(glamo, GLAMO_REG_MEM_TYPE,
++ 0x0872);
++
++ __reg_write(glamo, GLAMO_REG_MEM_DRAM1, 0x0000);
++ msleep(1);
++ __reg_write(glamo, GLAMO_REG_MEM_DRAM1, 0xe100);
++ break;
++ }
++ break;
++ case 3700:
++ /* FIXME */
++ default:
++ break;
++ }
++
++#if 0
++ /* FIXME: finish implementation */
++ for (j = 0; j < 8; j++) {
++ __
++#endif
++ }
++
++ return 0;
++}
++#endif
++
++/* Find out if we can support this version of the Glamo chip */
++static int glamo_supported(struct glamo_core *glamo)
++{
++ u_int16_t dev_id, rev_id; /*, memsize; */
++
++ dev_id = __reg_read(glamo, GLAMO_REG_DEVICE_ID);
++ rev_id = __reg_read(glamo, GLAMO_REG_REVISION_ID);
++
++ switch (dev_id) {
++ case 0x3650:
++ switch (rev_id) {
++ case GLAMO_CORE_REV_A2:
++ break;
++ case GLAMO_CORE_REV_A0:
++ case GLAMO_CORE_REV_A1:
++ case GLAMO_CORE_REV_A3:
++ dev_warn(&glamo->pdev->dev, "untested core revision "
++ "%04x, your mileage may vary\n", rev_id);
++ break;
++ default:
++ dev_warn(&glamo->pdev->dev, "unknown glamo revision "
++ "%04x, your mileage may vary\n", rev_id);
++ /* maybe should abort ? */
++ }
++ break;
++ case 0x3600:
++ case 0x3700:
++ default:
++ dev_err(&glamo->pdev->dev, "unsupported Glamo device %04x\n",
++ dev_id);
++ return 0;
++ }
++
++ dev_dbg(&glamo->pdev->dev, "Detected Glamo core %04x Revision %04x "
++ "(%uHz CPU / %uHz Memory)\n", dev_id, rev_id,
++ glamo_pll_rate(glamo, GLAMO_PLL1),
++ glamo_pll_rate(glamo, GLAMO_PLL2));
++
++ return 1;
++}
++
++static int __init glamo_probe(struct platform_device *pdev)
++{
++ int rc = 0, irq;
++ struct glamo_core *glamo;
++ struct platform_device *glamo_mmc_dev;
++
++ if (glamo_handle) {
++ dev_err(&pdev->dev,
++ "This driver supports only one instance\n");
++ return -EBUSY;
++ }
++
++ glamo = kmalloc(GFP_KERNEL, sizeof(*glamo));
++ if (!glamo)
++ return -ENOMEM;
++
++ spin_lock_init(&glamo->lock);
++ glamo_handle = glamo;
++ glamo->pdev = pdev;
++ glamo->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ glamo->irq = platform_get_irq(pdev, 0);
++ glamo->pdata = pdev->dev.platform_data;
++ if (!glamo->mem || !glamo->pdata) {
++ dev_err(&pdev->dev, "platform device with no MEM/PDATA ?\n");
++ rc = -ENOENT;
++ goto bail_free;
++ }
++
++ /* register a number of sibling devices whoise IOMEM resources
++ * are siblings of pdev's IOMEM resource */
++#if 0
++ glamo_core_dev.dev.parent = &pdev.dev;
++ mangle_mem_resources(glamo_core_dev.resources,
++ glamo_core_dev.num_resources, glamo->mem);
++ glamo_core_dev.resources[1].start = glamo->irq;
++ glamo_core_dev.resources[1].end = glamo->irq;
++ platform_device_register(&glamo_core_dev);
++#endif
++ /* only remap the generic, hostbus and memory controller registers */
++ glamo->base = ioremap(glamo->mem->start, 0x4000 /*GLAMO_REGOFS_VIDCAP*/);
++ if (!glamo->base) {
++ dev_err(&pdev->dev, "failed to ioremap() memory region\n");
++ goto bail_free;
++ }
++
++ platform_set_drvdata(pdev, glamo);
++
++ (glamo->pdata->glamo_external_reset)(0);
++ udelay(10);
++ (glamo->pdata->glamo_external_reset)(1);
++ mdelay(10);
++
++ /*
++ * finally set the mfd interrupts up
++ * can't do them earlier or sibling probes blow up
++ */
++
++ for (irq = IRQ_GLAMO(0); irq <= IRQ_GLAMO(8); irq++) {
++ set_irq_chip(irq, &glamo_irq_chip);
++ set_irq_handler(irq, handle_level_irq);
++ set_irq_flags(irq, IRQF_VALID);
++ }
++
++ if (glamo->pdata->glamo_irq_is_wired &&
++ !glamo->pdata->glamo_irq_is_wired()) {
++ set_irq_chained_handler(glamo->irq, glamo_irq_demux_handler);
++ set_irq_type(glamo->irq, IRQ_TYPE_EDGE_FALLING);
++ dev_info(&pdev->dev, "Glamo interrupt registered\n");
++ glamo->irq_works = 1;
++ } else {
++ dev_err(&pdev->dev, "Glamo interrupt not used\n");
++ glamo->irq_works = 0;
++ }
++
++
++ /* confirm it isn't insane version */
++ if (!glamo_supported(glamo)) {
++ dev_err(&pdev->dev, "This Glamo is not supported\n");
++ goto bail_irq;
++ }
++
++ /* sysfs */
++ rc = sysfs_create_group(&pdev->dev.kobj, &glamo_attr_group);
++ if (rc < 0) {
++ dev_err(&pdev->dev, "cannot create sysfs group\n");
++ goto bail_irq;
++ }
++
++ /* init the chip with canned register set */
++
++ dev_dbg(&glamo->pdev->dev, "running init script\n");
++ glamo_run_script(glamo, glamo_init_script,
++ ARRAY_SIZE(glamo_init_script), 1);
++
++ dev_info(&glamo->pdev->dev, "Glamo core PLL1: %uHz, PLL2: %uHz\n",
++ glamo_pll_rate(glamo, GLAMO_PLL1),
++ glamo_pll_rate(glamo, GLAMO_PLL2));
++
++ /* bring MCI specific stuff over from our MFD platform data */
++ glamo_mci_def_pdata.glamo_can_set_mci_power =
++ glamo->pdata->glamo_can_set_mci_power;
++ glamo_mci_def_pdata.glamo_mci_use_slow =
++ glamo->pdata->glamo_mci_use_slow;
++ glamo_mci_def_pdata.glamo_irq_is_wired =
++ glamo->pdata->glamo_irq_is_wired;
++
++ /* start creating the siblings */
++
++ glamo_2d_dev.dev.parent = &pdev->dev;
++ mangle_mem_resources(glamo_2d_dev.resource,
++ glamo_2d_dev.num_resources, glamo->mem);
++ platform_device_register(&glamo_2d_dev);
++
++ glamo_3d_dev.dev.parent = &pdev->dev;
++ mangle_mem_resources(glamo_3d_dev.resource,
++ glamo_3d_dev.num_resources, glamo->mem);
++ platform_device_register(&glamo_3d_dev);
++
++ glamo_jpeg_dev.dev.parent = &pdev->dev;
++ mangle_mem_resources(glamo_jpeg_dev.resource,
++ glamo_jpeg_dev.num_resources, glamo->mem);
++ platform_device_register(&glamo_jpeg_dev);
++
++ glamo_mpeg_dev.dev.parent = &pdev->dev;
++ mangle_mem_resources(glamo_mpeg_dev.resource,
++ glamo_mpeg_dev.num_resources, glamo->mem);
++ platform_device_register(&glamo_mpeg_dev);
++
++ glamo->pdata->glamo = glamo;
++ glamo_fb_dev.dev.parent = &pdev->dev;
++ glamo_fb_dev.dev.platform_data = glamo->pdata;
++ mangle_mem_resources(glamo_fb_dev.resource,
++ glamo_fb_dev.num_resources, glamo->mem);
++ platform_device_register(&glamo_fb_dev);
++
++ glamo->pdata->spigpio_info->glamo = glamo;
++ glamo_spigpio_dev.dev.parent = &pdev->dev;
++ glamo_spigpio_dev.dev.platform_data = glamo->pdata->spigpio_info;
++ platform_device_register(&glamo_spigpio_dev);
++
++ glamo_mmc_dev = glamo->pdata->mmc_dev;
++ glamo_mmc_dev->name = "glamo-mci";
++ glamo_mmc_dev->dev.parent = &pdev->dev;
++ glamo_mmc_dev->resource = glamo_mmc_resources;
++ glamo_mmc_dev->num_resources = ARRAY_SIZE(glamo_mmc_resources);
++
++ /* we need it later to give to the engine enable and disable */
++ glamo_mci_def_pdata.pglamo = glamo;
++ mangle_mem_resources(glamo_mmc_dev->resource,
++ glamo_mmc_dev->num_resources, glamo->mem);
++ platform_device_register(glamo_mmc_dev);
++
++ /* only request the generic, hostbus and memory controller MMIO */
++ glamo->mem = request_mem_region(glamo->mem->start,
++ GLAMO_REGOFS_VIDCAP, "glamo-core");
++ if (!glamo->mem) {
++ dev_err(&pdev->dev, "failed to request memory region\n");
++ goto bail_irq;
++ }
++
++ return 0;
++
++bail_irq:
++ disable_irq(glamo->irq);
++ set_irq_chained_handler(glamo->irq, NULL);
++
++ for (irq = IRQ_GLAMO(0); irq <= IRQ_GLAMO(8); irq++) {
++ set_irq_flags(irq, 0);
++ set_irq_chip(irq, NULL);
++ }
++
++ iounmap(glamo->base);
++bail_free:
++ platform_set_drvdata(pdev, NULL);
++ glamo_handle = NULL;
++ kfree(glamo);
++
++ return rc;
++}
++
++static int glamo_remove(struct platform_device *pdev)
++{
++ struct glamo_core *glamo = platform_get_drvdata(pdev);
++ int irq;
++
++ disable_irq(glamo->irq);
++ set_irq_chained_handler(glamo->irq, NULL);
++
++ for (irq = IRQ_GLAMO(0); irq <= IRQ_GLAMO(8); irq++) {
++ set_irq_flags(irq, 0);
++ set_irq_chip(irq, NULL);
++ }
++
++ platform_set_drvdata(pdev, NULL);
++ platform_device_unregister(&glamo_fb_dev);
++ platform_device_unregister(glamo->pdata->mmc_dev);
++ iounmap(glamo->base);
++ release_mem_region(glamo->mem->start, GLAMO_REGOFS_VIDCAP);
++ glamo_handle = NULL;
++ kfree(glamo);
++
++ return 0;
++}
++
++#ifdef CONFIG_PM
++
++static int glamo_suspend(struct platform_device *pdev, pm_message_t state)
++{
++ glamo_handle->suspending = 1;
++ glamo_power(glamo_handle, GLAMO_POWER_SUSPEND);
++
++ return 0;
++}
++
++static int glamo_resume(struct platform_device *pdev)
++{
++ glamo_power(glamo_handle, GLAMO_POWER_ON);
++ glamo_handle->suspending = 0;
++
++ return 0;
++}
++
++#else
++#define glamo_suspend NULL
++#define glamo_resume NULL
++#endif
++
++static struct platform_driver glamo_driver = {
++ .probe = glamo_probe,
++ .remove = glamo_remove,
++ .suspend = glamo_suspend,
++ .resume = glamo_resume,
++ .driver = {
++ .name = "glamo3362",
++ .owner = THIS_MODULE,
++ },
++};
++
++static int __devinit glamo_init(void)
++{
++ return platform_driver_register(&glamo_driver);
++}
++
++static void __exit glamo_cleanup(void)
++{
++ platform_driver_unregister(&glamo_driver);
++}
++
++module_init(glamo_init);
++module_exit(glamo_cleanup);
++
++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
++MODULE_DESCRIPTION("Smedia Glamo 336x/337x core/resource driver");
++MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mfd/glamo/glamo-core.h linux-2.6.29-rc3.owrt.om/drivers/mfd/glamo/glamo-core.h
+--- linux-2.6.29-rc3.owrt/drivers/mfd/glamo/glamo-core.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/mfd/glamo/glamo-core.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,92 @@
++#ifndef __GLAMO_CORE_H
++#define __GLAMO_CORE_H
++
++#include <asm/system.h>
++
++/* for the time being, we put the on-screen framebuffer into the lowest
++ * VRAM space. This should make the code easily compatible with the various
++ * 2MB/4MB/8MB variants of the Smedia chips */
++#define GLAMO_OFFSET_VRAM 0x800000
++#define GLAMO_OFFSET_FB (GLAMO_OFFSET_VRAM)
++
++/* we only allocate the minimum possible size for the framebuffer to make
++ * sure we have sufficient memory for other functions of the chip */
++//#define GLAMO_FB_SIZE (640*480*4) /* == 0x12c000 */
++#define GLAMO_INTERNAL_RAM_SIZE 0x800000
++#define GLAMO_MMC_BUFFER_SIZE (64 * 1024)
++#define GLAMO_FB_SIZE (GLAMO_INTERNAL_RAM_SIZE - GLAMO_MMC_BUFFER_SIZE)
++
++struct glamo_core {
++ int irq;
++ int irq_works; /* 0 means PCB does not support Glamo IRQ */
++ struct resource *mem;
++ struct resource *mem_core;
++ void __iomem *base;
++ struct platform_device *pdev;
++ struct glamofb_platform_data *pdata;
++ u_int16_t type;
++ u_int16_t revision;
++ spinlock_t lock;
++ u32 engine_enabled_bitfield;
++ u32 engine_enabled_bitfield_suspend;
++ int suspending;
++};
++
++struct glamo_script {
++ u_int16_t reg;
++ u_int16_t val;
++};
++
++int glamo_run_script(struct glamo_core *glamo,
++ struct glamo_script *script, int len, int may_sleep);
++
++enum glamo_engine {
++ GLAMO_ENGINE_CAPTURE,
++ GLAMO_ENGINE_ISP,
++ GLAMO_ENGINE_JPEG,
++ GLAMO_ENGINE_MPEG_ENC,
++ GLAMO_ENGINE_MPEG_DEC,
++ GLAMO_ENGINE_LCD,
++ GLAMO_ENGINE_CMDQ,
++ GLAMO_ENGINE_2D,
++ GLAMO_ENGINE_3D,
++ GLAMO_ENGINE_MMC,
++ GLAMO_ENGINE_MICROP0,
++ GLAMO_ENGINE_RISC,
++ GLAMO_ENGINE_MICROP1_MPEG_ENC,
++ GLAMO_ENGINE_MICROP1_MPEG_DEC,
++#if 0
++ GLAMO_ENGINE_H264_DEC,
++ GLAMO_ENGINE_RISC1,
++ GLAMO_ENGINE_SPI,
++#endif
++ __NUM_GLAMO_ENGINES
++};
++
++struct glamo_mci_pdata {
++ struct glamo_core * pglamo;
++ unsigned int gpio_detect;
++ unsigned int gpio_wprotect;
++ unsigned long ocr_avail;
++ int (*glamo_can_set_mci_power)(void);
++ /* glamo-mci asking if it should use the slow clock to card */
++ int (*glamo_mci_use_slow)(void);
++ int (*glamo_irq_is_wired)(void);
++ void (*mci_suspending)(struct platform_device *dev);
++ int (*mci_all_dependencies_resumed)(struct platform_device *dev);
++
++};
++
++int glamo_engine_enable(struct glamo_core *glamo, enum glamo_engine engine);
++int glamo_engine_disable(struct glamo_core *glamo, enum glamo_engine engine);
++void glamo_engine_reset(struct glamo_core *glamo, enum glamo_engine engine);
++int glamo_engine_reclock(struct glamo_core *glamo,
++ enum glamo_engine engine, int ps);
++
++void glamo_engine_clkreg_set(struct glamo_core *glamo,
++ enum glamo_engine engine,
++ u_int16_t mask, u_int16_t val);
++
++u_int16_t glamo_engine_clkreg_get(struct glamo_core *glamo,
++ enum glamo_engine engine);
++#endif /* __GLAMO_CORE_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mfd/glamo/glamo-fb.c linux-2.6.29-rc3.owrt.om/drivers/mfd/glamo/glamo-fb.c
+--- linux-2.6.29-rc3.owrt/drivers/mfd/glamo/glamo-fb.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/mfd/glamo/glamo-fb.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,1193 @@
++/* Smedia Glamo 336x/337x driver
++ *
++ * (C) 2007-2008 by Openmoko, Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/errno.h>
++#include <linux/string.h>
++#include <linux/mm.h>
++#include <linux/slab.h>
++#include <linux/delay.h>
++#include <linux/fb.h>
++#include <linux/init.h>
++#include <linux/vmalloc.h>
++#include <linux/dma-mapping.h>
++#include <linux/interrupt.h>
++#include <linux/workqueue.h>
++#include <linux/wait.h>
++#include <linux/platform_device.h>
++#include <linux/clk.h>
++#include <linux/spinlock.h>
++#include <linux/io.h>
++#include <linux/uaccess.h>
++
++#include <asm/div64.h>
++
++#ifdef CONFIG_PM
++#include <linux/pm.h>
++#endif
++
++#include <linux/glamofb.h>
++
++#include "glamo-regs.h"
++#include "glamo-core.h"
++
++#ifndef DEBUG
++#define GLAMO_LOG(...)
++#else
++#define GLAMO_LOG(...) \
++do { \
++ printk(KERN_DEBUG "in %s:%s:%d", __FILE__, __func__, __LINE__); \
++ printk(KERN_DEBUG __VA_ARGS__); \
++} while (0);
++#endif
++
++
++#define RESSIZE(ressource) (((ressource)->end - (ressource)->start)+1)
++
++struct glamofb_handle {
++ struct fb_info *fb;
++ struct device *dev;
++ struct resource *reg;
++ struct resource *fb_res;
++ char __iomem *base;
++ struct glamofb_platform_data *mach_info;
++ char __iomem *cursor_addr;
++ int cursor_on;
++ u_int32_t pseudo_pal[16];
++ spinlock_t lock_cmd;
++ int angle; /* Current rotation angle */
++ int blank_mode;
++};
++
++/* 'sibling' spi device for lcm init */
++static struct platform_device glamo_spi_dev = {
++ .name = "glamo-lcm-spi",
++};
++
++
++static int reg_read(struct glamofb_handle *glamo,
++ u_int16_t reg)
++{
++ int i = 0;
++
++ for (i = 0; i != 2; i++)
++ nop();
++
++ return readw(glamo->base + reg);
++}
++
++static void reg_write(struct glamofb_handle *glamo,
++ u_int16_t reg, u_int16_t val)
++{
++ int i = 0;
++
++ for (i = 0; i != 2; i++)
++ nop();
++
++ writew(val, glamo->base + reg);
++}
++
++static struct glamo_script glamo_regs[] = {
++ { GLAMO_REG_LCD_MODE1, 0x0020 },
++ /* no display rotation, no hardware cursor, no dither, no gamma,
++ * no retrace flip, vsync low-active, hsync low active,
++ * no TVCLK, no partial display, hw dest color from fb,
++ * no partial display mode, LCD1, software flip, */
++ { GLAMO_REG_LCD_MODE2, 0x9020 },
++ /* video flip, no ptr, no ptr, dhclk off,
++ * normal mode, no cpuif,
++ * res, serial msb first, single fb, no fr ctrl,
++ * cpu if bits all zero, no crc
++ * 0000 0000 0010 0000 */
++ { GLAMO_REG_LCD_MODE3, 0x0b40 },
++ /* src data rgb565, res, 18bit rgb666
++ * 000 01 011 0100 0000 */
++ { GLAMO_REG_LCD_POLARITY, 0x440c },
++ /* DE high active, no cpu/lcd if, cs0 force low, a0 low active,
++ * np cpu if, 9bit serial data, sclk rising edge latch data
++ * 01 00 0 100 0 000 01 0 0 */
++ /* The following values assume 640*480@16bpp */
++ { GLAMO_REG_LCD_A_BASE1, 0x0000 }, /* display A base address 15:0 */
++ { GLAMO_REG_LCD_A_BASE2, 0x0000 }, /* display A base address 22:16 */
++ { GLAMO_REG_LCD_B_BASE1, 0x6000 }, /* display B base address 15:0 */
++ { GLAMO_REG_LCD_B_BASE2, 0x0009 }, /* display B base address 22:16 */
++ { GLAMO_REG_LCD_CURSOR_BASE1, 0xC000 }, /* cursor base address 15:0 */
++ { GLAMO_REG_LCD_CURSOR_BASE2, 0x0012 }, /* cursor base address 22:16 */
++ { GLAMO_REG_LCD_COMMAND2, 0x0000 }, /* display page A */
++};
++
++static int glamofb_run_script(struct glamofb_handle *glamo,
++ struct glamo_script *script, int len)
++{
++ int i;
++
++ if (glamo->mach_info->glamo->suspending) {
++ dev_err(&glamo->mach_info->glamo->pdev->dev,
++ "IGNORING glamofb_run_script while "
++ "suspended\n");
++ return -EBUSY;
++ }
++
++ for (i = 0; i < len; i++) {
++ struct glamo_script *line = &script[i];
++
++ if (line->reg == 0xffff)
++ return 0;
++ else if (line->reg == 0xfffe)
++ msleep(line->val);
++ else
++ reg_write(glamo, script[i].reg, script[i].val);
++ }
++
++ return 0;
++}
++
++static int glamofb_check_var(struct fb_var_screeninfo *var,
++ struct fb_info *info)
++{
++ struct glamofb_handle *glamo = info->par;
++
++ if (glamo->mach_info->glamo->suspending) {
++ dev_err(&glamo->mach_info->glamo->pdev->dev,
++ "IGNORING glamofb_check_var while "
++ "suspended\n");
++ return -EBUSY;
++ }
++
++ if (var->yres > glamo->mach_info->yres.max)
++ var->yres = glamo->mach_info->yres.max;
++ else if (var->yres < glamo->mach_info->yres.min)
++ var->yres = glamo->mach_info->yres.min;
++
++ if (var->xres > glamo->mach_info->xres.max)
++ var->xres = glamo->mach_info->xres.max;
++ else if (var->xres < glamo->mach_info->xres.min)
++ var->xres = glamo->mach_info->xres.min;
++
++ if (var->bits_per_pixel > glamo->mach_info->bpp.max)
++ var->bits_per_pixel = glamo->mach_info->bpp.max;
++ else if (var->bits_per_pixel < glamo->mach_info->bpp.min)
++ var->bits_per_pixel = glamo->mach_info->bpp.min;
++
++ /* FIXME: set rgb positions */
++ switch (var->bits_per_pixel) {
++ case 16:
++ switch (reg_read(glamo, GLAMO_REG_LCD_MODE3) & 0xc000) {
++ case GLAMO_LCD_SRC_RGB565:
++ var->red.offset = 11;
++ var->green.offset = 5;
++ var->blue.offset = 0;
++ var->red.length = 5;
++ var->green.length = 6;
++ var->blue.length = 5;
++ var->transp.length = 0;
++ break;
++ case GLAMO_LCD_SRC_ARGB1555:
++ var->transp.offset = 15;
++ var->red.offset = 10;
++ var->green.offset = 5;
++ var->blue.offset = 0;
++ var->transp.length = 1;
++ var->red.length = 5;
++ var->green.length = 5;
++ var->blue.length = 5;
++ break;
++ case GLAMO_LCD_SRC_ARGB4444:
++ var->transp.offset = 12;
++ var->red.offset = 8;
++ var->green.offset = 4;
++ var->blue.offset = 0;
++ var->transp.length = 4;
++ var->red.length = 4;
++ var->green.length = 4;
++ var->blue.length = 4;
++ break;
++ }
++ break;
++ case 24:
++ case 32:
++ default:
++ /* The Smedia Glamo doesn't support anything but 16bit color */
++ printk(KERN_ERR
++ "Smedia driver does not [yet?] support 24/32bpp\n");
++ return -EINVAL;
++ }
++
++ return 0;
++}
++
++static void reg_set_bit_mask(struct glamofb_handle *glamo,
++ u_int16_t reg, u_int16_t mask,
++ u_int16_t val)
++{
++ u_int16_t tmp;
++
++ val &= mask;
++
++ tmp = reg_read(glamo, reg);
++ tmp &= ~mask;
++ tmp |= val;
++ reg_write(glamo, reg, tmp);
++}
++
++#define GLAMO_LCD_WIDTH_MASK 0x03FF
++#define GLAMO_LCD_HEIGHT_MASK 0x03FF
++#define GLAMO_LCD_PITCH_MASK 0x07FE
++#define GLAMO_LCD_HV_TOTAL_MASK 0x03FF
++#define GLAMO_LCD_HV_RETR_START_MASK 0x03FF
++#define GLAMO_LCD_HV_RETR_END_MASK 0x03FF
++#define GLAMO_LCD_HV_RETR_DISP_START_MASK 0x03FF
++#define GLAMO_LCD_HV_RETR_DISP_END_MASK 0x03FF
++
++enum orientation {ORIENTATION_PORTRAIT, ORIENTATION_LANDSCAPE};
++
++/* the caller has to enxure lock_cmd is held and we are in cmd mode */
++static void __rotate_lcd(struct glamofb_handle *glamo, __u32 rotation)
++{
++ int glamo_rot;
++
++ if (glamo->mach_info->glamo->suspending) {
++ dev_err(&glamo->mach_info->glamo->pdev->dev,
++ "IGNORING rotate_lcd while "
++ "suspended\n");
++ return;
++ }
++
++ switch (rotation) {
++ case FB_ROTATE_UR:
++ glamo_rot = GLAMO_LCD_ROT_MODE_0;
++ glamo->angle = 0;
++ break;
++ case FB_ROTATE_CW:
++ glamo_rot = GLAMO_LCD_ROT_MODE_90;
++ glamo->angle = 90;
++ break;
++ case FB_ROTATE_UD:
++ glamo_rot = GLAMO_LCD_ROT_MODE_180;
++ glamo->angle = 180;
++ break;
++ case FB_ROTATE_CCW:
++ glamo_rot = GLAMO_LCD_ROT_MODE_270;
++ glamo->angle = 270;
++ break;
++ default:
++ glamo->angle = 0;
++ glamo_rot = GLAMO_LCD_ROT_MODE_0;
++ break;
++ }
++
++ reg_set_bit_mask(glamo,
++ GLAMO_REG_LCD_WIDTH,
++ GLAMO_LCD_ROT_MODE_MASK,
++ glamo_rot);
++ reg_set_bit_mask(glamo,
++ GLAMO_REG_LCD_MODE1,
++ GLAMO_LCD_MODE1_ROTATE_EN,
++ (glamo_rot != GLAMO_LCD_ROT_MODE_0) ?
++ GLAMO_LCD_MODE1_ROTATE_EN : 0);
++}
++
++static enum orientation get_orientation(struct fb_var_screeninfo *var)
++{
++ if (var->xres <= var->yres)
++ return ORIENTATION_PORTRAIT;
++
++ return ORIENTATION_LANDSCAPE;
++}
++
++static int will_orientation_change(struct fb_var_screeninfo *var)
++{
++ enum orientation orient = get_orientation(var);
++
++ switch (orient) {
++ case ORIENTATION_LANDSCAPE:
++ if (var->rotate == FB_ROTATE_UR || var->rotate == FB_ROTATE_UD)
++ return 1;
++ break;
++ case ORIENTATION_PORTRAIT:
++ if (var->rotate == FB_ROTATE_CW || var->rotate == FB_ROTATE_CCW)
++ return 1;
++ break;
++ }
++ return 0;
++}
++
++#ifdef CONFIG_MFD_GLAMO_FB_XGLAMO_WORKAROUND
++
++/*
++ * See https://docs.openmoko.org/trac/ticket/2255
++ * We have a hack for some Xglamo bugs in kernel code.
++ * If someone fixes xglamo we can remove this hack.
++ * We might make xglamo_hack_enabled 0 by default in the future.
++ */
++
++static unsigned xglamo_hack_enabled = 1;
++
++static ssize_t xglamo_hack_read(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ return sprintf(buf, "%d\n", xglamo_hack_enabled);
++}
++
++static ssize_t xglamo_hack_write(struct device *dev,
++ struct device_attribute *attr, const char *buf,
++ size_t count)
++{
++ unsigned long val;
++
++ if (!strict_strtoul(buf, 10, &val))
++ xglamo_hack_enabled = !!val;
++
++ return count;
++}
++
++static DEVICE_ATTR(xglamo_hack, S_IWUSR | S_IRUGO, xglamo_hack_read,
++ xglamo_hack_write);
++
++static struct attribute *glamo_fb_sysfs_entries[] = {
++ &dev_attr_xglamo_hack.attr,
++ NULL
++};
++
++static struct attribute_group glamo_fb_attr_group = {
++ .name = NULL,
++ .attrs = glamo_fb_sysfs_entries,
++};
++
++/* This function implements the actual Xglamo hack. */
++
++static void glamofb_update_lcd_controller_hack(struct glamofb_handle *glamo,
++ struct fb_var_screeninfo *var,
++ int *xres, int *yres, int *pitch)
++{
++ int width, height;
++
++ if (glamo->angle == 90 || glamo->angle == 270) {
++ /*
++ * But if we are going back to portrait mode from here,
++ * we get inverted values from Xglamo
++ */
++ if (!(var->rotate == FB_ROTATE_UR ||
++ var->rotate == FB_ROTATE_UD)) {
++ width = var->yres;
++ height = var->xres;
++ } else {
++ width = var->xres;
++ height = var->yres;
++ }
++
++ } else {
++ width = var->xres;
++ height = var->yres;
++ }
++
++ /* Portrait ? */
++ if (var->rotate == FB_ROTATE_UR || var->rotate == FB_ROTATE_UD) {
++ /* We don't need to set xres and yres in this particular case
++ * because Xglamo does it for us */
++ if (!(glamo->angle == 90 || glamo->angle == 270)) {
++ var->xres = width;
++ var->yres = height;
++ }
++
++ var->xres_virtual = width;
++ var->yres_virtual = height * 2;
++ *pitch = width * var->bits_per_pixel / 8;
++ } else {
++ var->xres = height;
++ var->yres = width;
++ var->xres_virtual = height * 2;
++ var->yres_virtual = width;
++ *pitch = height * var->bits_per_pixel / 8;
++ }
++
++ *xres = width;
++ *yres = height;
++}
++#else
++#define xglamo_hack_enabled 0
++static void glamofb_update_lcd_controller_hack(struct glamofb_handle *glamo,
++ struct fb_var_screeninfo *var,
++ int *xres, int *yres, int *pitch)
++{
++}
++#endif
++
++static void glamofb_update_lcd_controller(struct glamofb_handle *glamo,
++ struct fb_var_screeninfo *var)
++{
++ int sync, bp, disp, fp, total, xres, yres, pitch;
++ int uninitialized_var(orientation_changing);
++ unsigned long flags;
++
++ if (!glamo || !var)
++ return;
++
++ if (glamo->mach_info->glamo->suspending) {
++ dev_err(&glamo->mach_info->glamo->pdev->dev,
++ "IGNORING glamofb_update_lcd_controller while "
++ "suspended\n");
++ return;
++ }
++
++ dev_dbg(&glamo->mach_info->glamo->pdev->dev,
++ "glamofb_update_lcd_controller spin_lock_irqsave\n");
++ spin_lock_irqsave(&glamo->lock_cmd, flags);
++
++ if (glamofb_cmd_mode(glamo, 1))
++ goto out_unlock;
++
++ if (var->pixclock)
++ glamo_engine_reclock(glamo->mach_info->glamo,
++ GLAMO_ENGINE_LCD,
++ var->pixclock);
++
++ if (xglamo_hack_enabled) {
++ glamofb_update_lcd_controller_hack(glamo, var, &xres, &yres,
++ &pitch);
++ } else {
++ xres = var->xres;
++ yres = var->yres;
++
++ orientation_changing = will_orientation_change(var);
++ /* Adjust the pitch according to new orientation to come. */
++ if (orientation_changing)
++ pitch = var->yres * var->bits_per_pixel / 8;
++ else
++ pitch = var->xres * var->bits_per_pixel / 8;
++ }
++
++ reg_set_bit_mask(glamo,
++ GLAMO_REG_LCD_WIDTH,
++ GLAMO_LCD_WIDTH_MASK,
++ xres);
++ reg_set_bit_mask(glamo,
++ GLAMO_REG_LCD_HEIGHT,
++ GLAMO_LCD_HEIGHT_MASK,
++ yres);
++ reg_set_bit_mask(glamo,
++ GLAMO_REG_LCD_PITCH,
++ GLAMO_LCD_PITCH_MASK,
++ pitch);
++
++ /* honour the rotation request */
++ __rotate_lcd(glamo, var->rotate);
++
++ if (!xglamo_hack_enabled) {
++ /* update the reported geometry of the framebuffer. */
++ if (orientation_changing) {
++ var->xres_virtual = yres;
++ var->xres = yres;
++ var->xres_virtual *= 2;
++ var->yres_virtual = xres;
++ var->yres = xres;
++ } else {
++ var->xres_virtual = xres;
++ var->yres_virtual = yres;
++ var->yres_virtual *= 2;
++ }
++ }
++
++ /* update scannout timings */
++ sync = 0;
++ bp = sync + var->hsync_len;
++ disp = bp + var->left_margin;
++ fp = disp + xres;
++ total = fp + var->right_margin;
++
++ reg_set_bit_mask(glamo, GLAMO_REG_LCD_HORIZ_TOTAL,
++ GLAMO_LCD_HV_TOTAL_MASK, total);
++ reg_set_bit_mask(glamo, GLAMO_REG_LCD_HORIZ_RETR_START,
++ GLAMO_LCD_HV_RETR_START_MASK, sync);
++ reg_set_bit_mask(glamo, GLAMO_REG_LCD_HORIZ_RETR_END,
++ GLAMO_LCD_HV_RETR_END_MASK, bp);
++ reg_set_bit_mask(glamo, GLAMO_REG_LCD_HORIZ_DISP_START,
++ GLAMO_LCD_HV_RETR_DISP_START_MASK, disp);
++ reg_set_bit_mask(glamo, GLAMO_REG_LCD_HORIZ_DISP_END,
++ GLAMO_LCD_HV_RETR_DISP_END_MASK, fp);
++
++ sync = 0;
++ bp = sync + var->vsync_len;
++ disp = bp + var->upper_margin;
++ fp = disp + yres;
++ total = fp + var->lower_margin;
++
++ reg_set_bit_mask(glamo, GLAMO_REG_LCD_VERT_TOTAL,
++ GLAMO_LCD_HV_TOTAL_MASK, total);
++ reg_set_bit_mask(glamo, GLAMO_REG_LCD_VERT_RETR_START,
++ GLAMO_LCD_HV_RETR_START_MASK, sync);
++ reg_set_bit_mask(glamo, GLAMO_REG_LCD_VERT_RETR_END,
++ GLAMO_LCD_HV_RETR_END_MASK, bp);
++ reg_set_bit_mask(glamo, GLAMO_REG_LCD_VERT_DISP_START,
++ GLAMO_LCD_HV_RETR_DISP_START_MASK, disp);
++ reg_set_bit_mask(glamo, GLAMO_REG_LCD_VERT_DISP_END,
++ GLAMO_LCD_HV_RETR_DISP_END_MASK, fp);
++
++ glamofb_cmd_mode(glamo, 0);
++
++out_unlock:
++ dev_dbg(&glamo->mach_info->glamo->pdev->dev,
++ "glamofb_update_lcd_controller spin_unlock_irqrestore\n");
++ spin_unlock_irqrestore(&glamo->lock_cmd, flags);
++}
++
++static int glamofb_pan_display(struct fb_var_screeninfo *var,
++ struct fb_info *info)
++{
++ struct glamofb_handle *glamo = info->par;
++ u_int16_t page = var->yoffset / glamo->mach_info->yres.defval;
++ reg_write(glamo, GLAMO_REG_LCD_COMMAND2, page);
++
++ return 0;
++}
++
++static int glamofb_set_par(struct fb_info *info)
++{
++ struct glamofb_handle *glamo = info->par;
++ struct fb_var_screeninfo *var = &info->var;
++
++ if (glamo->mach_info->glamo->suspending) {
++ dev_err(&glamo->mach_info->glamo->pdev->dev,
++ "IGNORING glamofb_set_par while "
++ "suspended\n");
++ return -EBUSY;
++ }
++
++ switch (var->bits_per_pixel) {
++ case 16:
++ info->fix.visual = FB_VISUAL_TRUECOLOR;
++ break;
++ default:
++ printk("Smedia driver doesn't support != 16bpp\n");
++ return -EINVAL;
++ }
++
++ info->fix.line_length = (var->xres * var->bits_per_pixel) / 8;
++
++ glamofb_update_lcd_controller(glamo, var);
++
++ return 0;
++}
++
++
++static void notify_blank(struct fb_info *info, int blank_mode)
++{
++ struct fb_event event;
++
++ event.info = info;
++ event.data = &blank_mode;
++ fb_notifier_call_chain(FB_EVENT_CONBLANK, &event);
++}
++
++
++static int glamofb_blank(int blank_mode, struct fb_info *info)
++{
++ struct glamofb_handle *gfb = info->par;
++ struct glamo_core *gcore = gfb->mach_info->glamo;
++
++ dev_dbg(gfb->dev, "glamofb_blank(%u)\n", blank_mode);
++
++ switch (blank_mode) {
++ case FB_BLANK_VSYNC_SUSPEND:
++ case FB_BLANK_HSYNC_SUSPEND:
++ /* FIXME: add pdata hook/flag to indicate whether
++ * we should already switch off pixel clock here */
++ break;
++ case FB_BLANK_POWERDOWN:
++ /* Simulating FB_BLANK_NORMAL allow turning off backlight */
++ if (gfb->blank_mode != FB_BLANK_NORMAL)
++ notify_blank(info, FB_BLANK_NORMAL);
++
++ /* LCM need notification before pixel clock is stopped */
++ notify_blank(info, blank_mode);
++
++ /* disable the pixel clock */
++ glamo_engine_clkreg_set(gcore, GLAMO_ENGINE_LCD,
++ GLAMO_CLOCK_LCD_EN_DCLK, 0);
++ gfb->blank_mode = blank_mode;
++ break;
++ case FB_BLANK_UNBLANK:
++ case FB_BLANK_NORMAL:
++ /* enable the pixel clock if off */
++ if (gfb->blank_mode == FB_BLANK_POWERDOWN)
++ glamo_engine_clkreg_set(gcore,
++ GLAMO_ENGINE_LCD,
++ GLAMO_CLOCK_LCD_EN_DCLK,
++ GLAMO_CLOCK_LCD_EN_DCLK);
++
++ notify_blank(info, blank_mode);
++ gfb->blank_mode = blank_mode;
++ break;
++ }
++
++ /* FIXME: once we have proper clock management in glamo-core,
++ * we can determine if other units need MCLK1 or the PLL, and
++ * disable it if not used. */
++ return 0;
++}
++
++static inline unsigned int chan_to_field(unsigned int chan,
++ struct fb_bitfield *bf)
++{
++ chan &= 0xffff;
++ chan >>= 16 - bf->length;
++ return chan << bf->offset;
++}
++
++static int glamofb_setcolreg(unsigned regno,
++ unsigned red, unsigned green, unsigned blue,
++ unsigned transp, struct fb_info *info)
++{
++ struct glamofb_handle *glamo = info->par;
++ unsigned int val;
++
++ if (glamo->mach_info->glamo->suspending) {
++ dev_err(&glamo->mach_info->glamo->pdev->dev,
++ "IGNORING glamofb_set_par while "
++ "suspended\n");
++ return -EBUSY;
++ }
++
++ switch (glamo->fb->fix.visual) {
++ case FB_VISUAL_TRUECOLOR:
++ case FB_VISUAL_DIRECTCOLOR:
++ /* true-colour, use pseuo-palette */
++
++ if (regno < 16) {
++ u32 *pal = glamo->fb->pseudo_palette;
++
++ val = chan_to_field(red, &glamo->fb->var.red);
++ val |= chan_to_field(green, &glamo->fb->var.green);
++ val |= chan_to_field(blue, &glamo->fb->var.blue);
++
++ pal[regno] = val;
++ };
++ break;
++ default:
++ return 1; /* unknown type */
++ }
++
++ return 0;
++}
++
++#ifdef CONFIG_MFD_GLAMO_HWACCEL
++static inline void glamofb_vsync_wait(struct glamofb_handle *glamo,
++ int line, int size, int range)
++{
++ int count[2];
++
++ do {
++ count[0] = reg_read(glamo, GLAMO_REG_LCD_STATUS2) & 0x3ff;
++ count[1] = reg_read(glamo, GLAMO_REG_LCD_STATUS2) & 0x3ff;
++ } while (count[0] != count[1] ||
++ (line < count[0] + range &&
++ size > count[0] - range) ||
++ count[0] < range * 2);
++}
++
++/*
++ * Enable/disable the hardware cursor mode altogether
++ * (for blinking and such, use glamofb_cursor()).
++ */
++static void glamofb_cursor_onoff(struct glamofb_handle *glamo, int on)
++{
++ int y, size;
++
++ if (glamo->cursor_on) {
++ y = reg_read(glamo, GLAMO_REG_LCD_CURSOR_Y_POS);
++ size = reg_read(glamo, GLAMO_REG_LCD_CURSOR_Y_SIZE);
++
++ glamofb_vsync_wait(glamo, y, size, 30);
++ }
++
++ reg_set_bit_mask(glamo, GLAMO_REG_LCD_MODE1,
++ GLAMO_LCD_MODE1_CURSOR_EN,
++ on ? GLAMO_LCD_MODE1_CURSOR_EN : 0);
++ glamo->cursor_on = on;
++
++ /* Hide the cursor by default */
++ reg_write(glamo, GLAMO_REG_LCD_CURSOR_X_SIZE, 0);
++}
++
++static int glamofb_cursor(struct fb_info *info, struct fb_cursor *cursor)
++{
++ struct glamofb_handle *glamo = info->par;
++ unsigned long flags;
++
++ spin_lock_irqsave(&glamo->lock_cmd, flags);
++
++ reg_write(glamo, GLAMO_REG_LCD_CURSOR_X_SIZE,
++ cursor->enable ? cursor->image.width : 0);
++
++ if (cursor->set & FB_CUR_SETPOS) {
++ reg_write(glamo, GLAMO_REG_LCD_CURSOR_X_POS,
++ cursor->image.dx);
++ reg_write(glamo, GLAMO_REG_LCD_CURSOR_Y_POS,
++ cursor->image.dy);
++ }
++
++ if (cursor->set & FB_CUR_SETCMAP) {
++ uint16_t fg = glamo->pseudo_pal[cursor->image.fg_color];
++ uint16_t bg = glamo->pseudo_pal[cursor->image.bg_color];
++
++ reg_write(glamo, GLAMO_REG_LCD_CURSOR_FG_COLOR, fg);
++ reg_write(glamo, GLAMO_REG_LCD_CURSOR_BG_COLOR, bg);
++ reg_write(glamo, GLAMO_REG_LCD_CURSOR_DST_COLOR, fg);
++ }
++
++ if (cursor->set & FB_CUR_SETHOT)
++ reg_write(glamo, GLAMO_REG_LCD_CURSOR_PRESET,
++ (cursor->hot.x << 8) | cursor->hot.y);
++
++ if ((cursor->set & FB_CUR_SETSIZE) ||
++ (cursor->set & (FB_CUR_SETIMAGE | FB_CUR_SETSHAPE))) {
++ int x, y, pitch, op;
++ const uint8_t *pcol = cursor->image.data;
++ const uint8_t *pmsk = cursor->mask;
++ uint8_t __iomem *dst = glamo->cursor_addr;
++ uint8_t dcol = 0;
++ uint8_t dmsk = 0;
++ uint8_t byte = 0;
++
++ if (cursor->image.depth > 1) {
++ spin_unlock_irqrestore(&glamo->lock_cmd, flags);
++ return -EINVAL;
++ }
++
++ pitch = ((cursor->image.width + 7) >> 2) & ~1;
++ reg_write(glamo, GLAMO_REG_LCD_CURSOR_PITCH,
++ pitch);
++ reg_write(glamo, GLAMO_REG_LCD_CURSOR_Y_SIZE,
++ cursor->image.height);
++
++ for (y = 0; y < cursor->image.height; y++) {
++ byte = 0;
++ for (x = 0; x < cursor->image.width; x++) {
++ if ((x % 8) == 0) {
++ dcol = *pcol++;
++ dmsk = *pmsk++;
++ } else {
++ dcol >>= 1;
++ dmsk >>= 1;
++ }
++
++ if (cursor->rop == ROP_COPY)
++ op = (dmsk & 1) ?
++ (dcol & 1) ? 1 : 3 : 0;
++ else
++ op = ((dmsk & 1) << 1) |
++ ((dcol & 1) << 0);
++ byte |= op << ((x & 3) << 1);
++
++ if (x % 4 == 3) {
++ writeb(byte, dst + x / 4);
++ byte = 0;
++ }
++ }
++ if (x % 4) {
++ writeb(byte, dst + x / 4);
++ byte = 0;
++ }
++
++ dst += pitch;
++ }
++ }
++
++ spin_unlock_irqrestore(&glamo->lock_cmd, flags);
++
++ return 0;
++}
++#endif
++
++static inline int glamofb_cmdq_empty(struct glamofb_handle *gfb)
++{
++ /* DGCMdQempty -- 1 == command queue is empty */
++ return reg_read(gfb, GLAMO_REG_LCD_STATUS1) & (1 << 15);
++}
++
++/* call holding gfb->lock_cmd when locking, until you unlock */
++int glamofb_cmd_mode(struct glamofb_handle *gfb, int on)
++{
++ int timeout = 2000000;
++
++ if (gfb->mach_info->glamo->suspending) {
++ dev_err(&gfb->mach_info->glamo->pdev->dev,
++ "IGNORING glamofb_cmd_mode while "
++ "suspended\n");
++ return -EBUSY;
++ }
++
++ dev_dbg(gfb->dev, "glamofb_cmd_mode(gfb=%p, on=%d)\n", gfb, on);
++ if (on) {
++ dev_dbg(gfb->dev, "%s: waiting for cmdq empty: ",
++ __func__);
++ while ((!glamofb_cmdq_empty(gfb)) && (timeout--))
++ /* yield() */;
++ if (timeout < 0) {
++ printk(KERN_ERR"*************"
++ "glamofb cmd_queue never got empty"
++ "*************\n");
++ return -EIO;
++ }
++ dev_dbg(gfb->dev, "empty!\n");
++
++ /* display the entire frame then switch to command */
++ reg_write(gfb, GLAMO_REG_LCD_COMMAND1,
++ GLAMO_LCD_CMD_TYPE_DISP |
++ GLAMO_LCD_CMD_DATA_FIRE_VSYNC);
++
++ /* wait until lcd idle */
++ dev_dbg(gfb->dev, "waiting for lcd idle: ");
++ timeout = 2000000;
++ while ((!reg_read(gfb, GLAMO_REG_LCD_STATUS2) & (1 << 12)) &&
++ (timeout--))
++ /* yield() */;
++ if (timeout < 0) {
++ printk(KERN_ERR"*************"
++ "glamofb lcd never idle"
++ "*************\n");
++ return -EIO;
++ }
++
++ mdelay(100);
++
++ dev_dbg(gfb->dev, "cmd mode entered\n");
++
++ } else {
++ /* RGB interface needs vsync/hsync */
++ if (reg_read(gfb, GLAMO_REG_LCD_MODE3) & GLAMO_LCD_MODE3_RGB)
++ reg_write(gfb, GLAMO_REG_LCD_COMMAND1,
++ GLAMO_LCD_CMD_TYPE_DISP |
++ GLAMO_LCD_CMD_DATA_DISP_SYNC);
++
++ reg_write(gfb, GLAMO_REG_LCD_COMMAND1,
++ GLAMO_LCD_CMD_TYPE_DISP |
++ GLAMO_LCD_CMD_DATA_DISP_FIRE);
++ }
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(glamofb_cmd_mode);
++
++
++int glamofb_cmd_write(struct glamofb_handle *gfb, u_int16_t val)
++{
++ int timeout = 200000;
++
++ if (gfb->mach_info->glamo->suspending) {
++ dev_err(&gfb->mach_info->glamo->pdev->dev,
++ "IGNORING glamofb_cmd_write while "
++ "suspended\n");
++ return -EBUSY;
++ }
++
++ dev_dbg(gfb->dev, "%s: waiting for cmdq empty\n", __func__);
++ while ((!glamofb_cmdq_empty(gfb)) && (timeout--))
++ yield();
++ if (timeout < 0) {
++ printk(KERN_ERR"*************"
++ "glamofb cmd_queue never got empty"
++ "*************\n");
++ return 1;
++ }
++ dev_dbg(gfb->dev, "idle, writing 0x%04x\n", val);
++
++ reg_write(gfb, GLAMO_REG_LCD_COMMAND1, val);
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(glamofb_cmd_write);
++
++static struct fb_ops glamofb_ops = {
++ .owner = THIS_MODULE,
++ .fb_check_var = glamofb_check_var,
++ .fb_pan_display = glamofb_pan_display,
++ .fb_set_par = glamofb_set_par,
++ .fb_blank = glamofb_blank,
++ .fb_setcolreg = glamofb_setcolreg,
++#ifdef CONFIG_MFD_GLAMO_HWACCEL
++ .fb_cursor = glamofb_cursor,
++#endif
++ .fb_fillrect = cfb_fillrect,
++ .fb_copyarea = cfb_copyarea,
++ .fb_imageblit = cfb_imageblit,
++};
++
++static int glamofb_init_regs(struct glamofb_handle *glamo)
++{
++ struct fb_info *info = glamo->fb;
++
++ glamofb_check_var(&info->var, info);
++ glamofb_run_script(glamo, glamo_regs, ARRAY_SIZE(glamo_regs));
++ glamofb_set_par(info);
++
++ return 0;
++}
++
++static int __init glamofb_probe(struct platform_device *pdev)
++{
++ int rc = -EIO;
++ struct fb_info *fbinfo;
++ struct glamofb_handle *glamofb;
++ struct glamofb_platform_data *mach_info = pdev->dev.platform_data;
++
++ printk(KERN_INFO "SMEDIA Glamo frame buffer driver (C) 2007 "
++ "Openmoko, Inc.\n");
++
++ fbinfo = framebuffer_alloc(sizeof(struct glamofb_handle), &pdev->dev);
++ if (!fbinfo)
++ return -ENOMEM;
++
++ glamofb = fbinfo->par;
++ glamofb->fb = fbinfo;
++ glamofb->dev = &pdev->dev;
++
++ glamofb->angle = 0;
++ glamofb->blank_mode = FB_BLANK_POWERDOWN;
++
++ strcpy(fbinfo->fix.id, "SMedia Glamo");
++
++ glamofb->reg = platform_get_resource_byname(pdev, IORESOURCE_MEM,
++ "glamo-fb-regs");
++ if (!glamofb->reg) {
++ dev_err(&pdev->dev, "platform device with no registers?\n");
++ rc = -ENOENT;
++ goto out_free;
++ }
++
++ glamofb->fb_res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
++ "glamo-fb-mem");
++ if (!glamofb->fb_res) {
++ dev_err(&pdev->dev, "platform device with no memory ?\n");
++ rc = -ENOENT;
++ goto out_free;
++ }
++
++ glamofb->reg = request_mem_region(glamofb->reg->start,
++ RESSIZE(glamofb->reg), pdev->name);
++ if (!glamofb->reg) {
++ dev_err(&pdev->dev, "failed to request mmio region\n");
++ goto out_free;
++ }
++
++ glamofb->fb_res = request_mem_region(glamofb->fb_res->start,
++ mach_info->fb_mem_size,
++ pdev->name);
++ if (!glamofb->fb_res) {
++ dev_err(&pdev->dev, "failed to request vram region\n");
++ goto out_release_reg;
++ }
++
++ /* we want to remap only the registers required for this core
++ * driver. */
++ glamofb->base = ioremap(glamofb->reg->start, RESSIZE(glamofb->reg));
++ if (!glamofb->base) {
++ dev_err(&pdev->dev, "failed to ioremap() mmio memory\n");
++ goto out_release_fb;
++ }
++ fbinfo->fix.smem_start = (unsigned long) glamofb->fb_res->start;
++ fbinfo->fix.smem_len = mach_info->fb_mem_size;
++
++ fbinfo->screen_base = ioremap(glamofb->fb_res->start,
++ RESSIZE(glamofb->fb_res));
++ if (!fbinfo->screen_base) {
++ dev_err(&pdev->dev, "failed to ioremap() vram memory\n");
++ goto out_release_fb;
++ }
++ glamofb->cursor_addr = fbinfo->screen_base + 0x12C000;
++
++ platform_set_drvdata(pdev, glamofb);
++
++ glamofb->mach_info = pdev->dev.platform_data;
++
++ fbinfo->fix.visual = FB_VISUAL_TRUECOLOR;
++ fbinfo->fix.type = FB_TYPE_PACKED_PIXELS;
++ fbinfo->fix.type_aux = 0;
++ fbinfo->fix.xpanstep = 0;
++ fbinfo->fix.ypanstep = mach_info->yres.defval;
++ fbinfo->fix.ywrapstep = 0;
++ fbinfo->fix.accel = FB_ACCEL_GLAMO;
++
++ fbinfo->var.nonstd = 0;
++ fbinfo->var.activate = FB_ACTIVATE_NOW;
++ fbinfo->var.height = mach_info->height;
++ fbinfo->var.width = mach_info->width;
++ fbinfo->var.accel_flags = 0; /* FIXME */
++ fbinfo->var.vmode = FB_VMODE_NONINTERLACED;
++
++ fbinfo->fbops = &glamofb_ops;
++ fbinfo->flags = FBINFO_FLAG_DEFAULT;
++ fbinfo->pseudo_palette = &glamofb->pseudo_pal;
++
++ fbinfo->var.xres = mach_info->xres.defval;
++ fbinfo->var.xres_virtual = mach_info->xres.defval;
++ fbinfo->var.yres = mach_info->yres.defval;
++ fbinfo->var.yres_virtual = mach_info->yres.defval * 2;
++ fbinfo->var.bits_per_pixel = mach_info->bpp.defval;
++
++ fbinfo->var.pixclock = mach_info->pixclock;
++ fbinfo->var.left_margin = mach_info->left_margin;
++ fbinfo->var.right_margin = mach_info->right_margin;
++ fbinfo->var.upper_margin = mach_info->upper_margin;
++ fbinfo->var.lower_margin = mach_info->lower_margin;
++ fbinfo->var.hsync_len = mach_info->hsync_len;
++ fbinfo->var.vsync_len = mach_info->vsync_len;
++
++ memset(fbinfo->screen_base, 0,
++ mach_info->xres.max *
++ mach_info->yres.max *
++ mach_info->bpp.max / 8);
++
++ glamo_engine_enable(mach_info->glamo, GLAMO_ENGINE_LCD);
++ glamo_engine_reset(mach_info->glamo, GLAMO_ENGINE_LCD);
++
++ dev_info(&pdev->dev, "spin_lock_init\n");
++ spin_lock_init(&glamofb->lock_cmd);
++ glamofb_init_regs(glamofb);
++#ifdef CONFIG_MFD_GLAMO_HWACCEL
++ glamofb_cursor_onoff(glamofb, 1);
++#endif
++
++#ifdef CONFIG_MFD_GLAMO_FB_XGLAMO_WORKAROUND
++ /* sysfs */
++ rc = sysfs_create_group(&pdev->dev.kobj, &glamo_fb_attr_group);
++ if (rc < 0) {
++ dev_err(&pdev->dev, "cannot create sysfs group\n");
++ goto out_unmap_fb;
++ }
++#endif
++
++ rc = register_framebuffer(fbinfo);
++ if (rc < 0) {
++ dev_err(&pdev->dev, "failed to register framebuffer\n");
++ goto out_unmap_fb;
++ }
++
++ if (mach_info->spi_info) {
++ /* register the sibling spi device */
++ mach_info->spi_info->glamofb_handle = glamofb;
++ glamo_spi_dev.dev.parent = &pdev->dev;
++ glamo_spi_dev.dev.platform_data = mach_info->spi_info;
++ platform_device_register(&glamo_spi_dev);
++ }
++
++ printk(KERN_INFO "fb%d: %s frame buffer device\n",
++ fbinfo->node, fbinfo->fix.id);
++
++ return 0;
++
++out_unmap_fb:
++ iounmap(fbinfo->screen_base);
++ iounmap(glamofb->base);
++out_release_fb:
++ release_mem_region(glamofb->fb_res->start, RESSIZE(glamofb->fb_res));
++out_release_reg:
++ release_mem_region(glamofb->reg->start, RESSIZE(glamofb->reg));
++out_free:
++ framebuffer_release(fbinfo);
++ return rc;
++}
++
++static int glamofb_remove(struct platform_device *pdev)
++{
++ struct glamofb_handle *glamofb = platform_get_drvdata(pdev);
++
++ platform_set_drvdata(pdev, NULL);
++ iounmap(glamofb->base);
++ release_mem_region(glamofb->reg->start, RESSIZE(glamofb->reg));
++ kfree(glamofb);
++
++ return 0;
++}
++
++#ifdef CONFIG_PM
++
++static int glamofb_suspend(struct platform_device *pdev, pm_message_t state)
++{
++ struct glamofb_handle *gfb = platform_get_drvdata(pdev);
++
++ /* we need to stop anything touching our framebuffer */
++ fb_set_suspend(gfb->fb, 1);
++
++ /* seriously -- nobody is allowed to touch glamo memory when we
++ * are suspended or we lock on nWAIT
++ */
++ /* iounmap(gfb->fb->screen_base); */
++
++ return 0;
++}
++
++static int glamofb_resume(struct platform_device *pdev)
++{
++ struct glamofb_handle *gfb = platform_get_drvdata(pdev);
++ struct glamofb_platform_data *mach_info = pdev->dev.platform_data;
++
++ /* OK let's allow framebuffer ops again */
++ /* gfb->fb->screen_base = ioremap(gfb->fb_res->start,
++ RESSIZE(gfb->fb_res)); */
++ glamo_engine_enable(mach_info->glamo, GLAMO_ENGINE_LCD);
++ glamo_engine_reset(mach_info->glamo, GLAMO_ENGINE_LCD);
++
++ printk(KERN_ERR"spin_lock_init\n");
++ spin_lock_init(&gfb->lock_cmd);
++ glamofb_init_regs(gfb);
++#ifdef CONFIG_MFD_GLAMO_HWACCEL
++ glamofb_cursor_onoff(gfb, 1);
++#endif
++
++ fb_set_suspend(gfb->fb, 0);
++
++ return 0;
++}
++#else
++#define glamofb_suspend NULL
++#define glamofb_resume NULL
++#endif
++
++static struct platform_driver glamofb_driver = {
++ .probe = glamofb_probe,
++ .remove = glamofb_remove,
++ .suspend = glamofb_suspend,
++ .resume = glamofb_resume,
++ .driver = {
++ .name = "glamo-fb",
++ .owner = THIS_MODULE,
++ },
++};
++
++static int __devinit glamofb_init(void)
++{
++ return platform_driver_register(&glamofb_driver);
++}
++
++static void __exit glamofb_cleanup(void)
++{
++ platform_driver_unregister(&glamofb_driver);
++}
++
++module_init(glamofb_init);
++module_exit(glamofb_cleanup);
++
++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
++MODULE_DESCRIPTION("Smedia Glamo 336x/337x framebuffer driver");
++MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mfd/glamo/glamo-gpio.c linux-2.6.29-rc3.owrt.om/drivers/mfd/glamo/glamo-gpio.c
+--- linux-2.6.29-rc3.owrt/drivers/mfd/glamo/glamo-gpio.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/mfd/glamo/glamo-gpio.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,62 @@
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/spinlock.h>
++#include <linux/io.h>
++
++#include <linux/glamo-gpio.h>
++
++#include "glamo-core.h"
++#include "glamo-regs.h"
++
++void glamo_gpio_setpin(struct glamo_core *glamo, unsigned int pin,
++ unsigned int value)
++{
++ unsigned int reg = REG_OF_GPIO(pin);
++ u_int16_t tmp;
++
++ spin_lock(&glamo->lock);
++ tmp = readw(glamo->base + reg);
++ if (value)
++ tmp |= OUTPUT_BIT(pin);
++ else
++ tmp &= ~OUTPUT_BIT(pin);
++ writew(tmp, glamo->base + reg);
++ spin_unlock(&glamo->lock);
++}
++EXPORT_SYMBOL(glamo_gpio_setpin);
++
++int glamo_gpio_getpin(struct glamo_core *glamo, unsigned int pin)
++{
++ return readw(REG_OF_GPIO(pin)) & INPUT_BIT(pin) ? 1 : 0;
++}
++EXPORT_SYMBOL(glamo_gpio_getpin);
++
++void glamo_gpio_cfgpin(struct glamo_core *glamo, unsigned int pinfunc)
++{
++ unsigned int reg = REG_OF_GPIO(pinfunc);
++ u_int16_t tmp;
++
++ spin_lock(&glamo->lock);
++ tmp = readw(glamo->base + reg);
++
++ if ((pinfunc & 0x00f0) == GLAMO_GPIO_F_FUNC) {
++ /* pin is a function pin: clear gpio bit */
++ tmp &= ~FUNC_BIT(pinfunc);
++ } else {
++ /* pin is gpio: set gpio bit */
++ tmp |= FUNC_BIT(pinfunc);
++
++ if (pinfunc & GLAMO_GPIO_F_IN) {
++ /* gpio input: set bit to disable output mode */
++ tmp |= GPIO_OUT_BIT(pinfunc);
++ } else if (pinfunc & GLAMO_GPIO_F_OUT) {
++ /* gpio output: clear bit to enable output mode */
++ tmp &= ~GPIO_OUT_BIT(pinfunc);
++ }
++ }
++ writew(tmp, glamo->base + reg);
++ spin_unlock(&glamo->lock);
++}
++EXPORT_SYMBOL(glamo_gpio_cfgpin);
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mfd/glamo/glamo-lcm-spi.c linux-2.6.29-rc3.owrt.om/drivers/mfd/glamo/glamo-lcm-spi.c
+--- linux-2.6.29-rc3.owrt/drivers/mfd/glamo/glamo-lcm-spi.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/mfd/glamo/glamo-lcm-spi.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,240 @@
++/*
++ * Copyright (C) 2007 Openmoko, Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ *
++ * Smedia Glamo GPIO based SPI driver
++ *
++ * 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.
++ *
++ * This driver currently only implements a minimum subset of the hardware
++ * features, esp. those features that are required to drive the jbt6k74
++ * LCM controller asic in the TD028TTEC1 LCM.
++ *
++*/
++
++#define DEBUG
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++#include <linux/device.h>
++#include <linux/spinlock.h>
++#include <linux/workqueue.h>
++#include <linux/platform_device.h>
++
++#include <linux/spi/spi.h>
++#include <linux/spi/spi_bitbang.h>
++#include <linux/spi/glamo.h>
++
++#include <linux/glamofb.h>
++
++#include <mach/hardware.h>
++
++#include "glamo-core.h"
++#include "glamo-regs.h"
++
++struct glamo_spi {
++ struct spi_bitbang bitbang;
++ struct spi_master *master;
++ struct glamo_spi_info *info;
++ struct device *dev;
++};
++
++static inline struct glamo_spi *to_gs(struct spi_device *spi)
++{
++ return spi->controller_data;
++}
++
++static int glamo_spi_setupxfer(struct spi_device *spi, struct spi_transfer *t)
++{
++ unsigned int bpw;
++
++ bpw = t ? t->bits_per_word : spi->bits_per_word;
++
++ if (bpw != 9 && bpw != 8) {
++ dev_err(&spi->dev, "invalid bits-per-word (%d)\n", bpw);
++ return -EINVAL;
++ }
++
++ return 0;
++}
++
++static void glamo_spi_chipsel(struct spi_device *spi, int value)
++{
++#if 0
++ struct glamo_spi *gs = to_gs(spi);
++
++ dev_dbg(&spi->dev, "chipsel %d: spi=%p, gs=%p, info=%p, handle=%p\n",
++ value, spi, gs, gs->info, gs->info->glamofb_handle);
++
++ glamofb_cmd_mode(gs->info->glamofb_handle, value);
++#endif
++}
++
++static int glamo_spi_txrx(struct spi_device *spi, struct spi_transfer *t)
++{
++ struct glamo_spi *gs = to_gs(spi);
++ const u_int16_t *ui16 = (const u_int16_t *) t->tx_buf;
++ u_int16_t nine_bits;
++ int i;
++
++ dev_dbg(&spi->dev, "txrx: tx %p, rx %p, bpw %d, len %d\n",
++ t->tx_buf, t->rx_buf, t->bits_per_word, t->len);
++
++ if (spi->bits_per_word == 9)
++ nine_bits = (1 << 9);
++ else
++ nine_bits = 0;
++
++ if (t->len > 3 * sizeof(u_int16_t)) {
++ dev_err(&spi->dev, "this driver doesn't support "
++ "%u sized xfers\n", t->len);
++ return -EINVAL;
++ }
++
++ for (i = 0; i < t->len/sizeof(u_int16_t); i++) {
++ /* actually transfer the data */
++#if 1
++ glamofb_cmd_write(gs->info->glamofb_handle,
++ GLAMO_LCD_CMD_TYPE_SERIAL | nine_bits |
++ (1 << 10) | (1 << 11) | (ui16[i] & 0x1ff));
++#endif
++ /* FIXME: fire ?!? */
++ if (i == 0 && (ui16[i] & 0x1ff) == 0x29) {
++ dev_dbg(&spi->dev, "leaving command mode\n");
++ glamofb_cmd_mode(gs->info->glamofb_handle, 0);
++ }
++ }
++
++ return t->len;
++}
++
++static int glamo_spi_setup(struct spi_device *spi)
++{
++ int ret;
++
++ if (!spi->bits_per_word)
++ spi->bits_per_word = 9;
++
++ /* FIXME: hardware can do this */
++ if (spi->mode & SPI_LSB_FIRST)
++ return -EINVAL;
++
++ ret = glamo_spi_setupxfer(spi, NULL);
++ if (ret < 0) {
++ dev_err(&spi->dev, "setupxfer returned %d\n", ret);
++ return ret;
++ }
++
++ dev_dbg(&spi->dev, "%s: mode %d, %u bpw\n",
++ __FUNCTION__, spi->mode, spi->bits_per_word);
++
++ return 0;
++}
++
++static int glamo_spi_probe(struct platform_device *pdev)
++{
++ struct spi_master *master;
++ struct glamo_spi *sp;
++ int ret;
++ int i;
++
++ master = spi_alloc_master(&pdev->dev, sizeof(struct glamo_spi));
++ if (master == NULL) {
++ dev_err(&pdev->dev, "failed to allocate spi master\n");
++ ret = -ENOMEM;
++ goto err;
++ }
++
++ sp = spi_master_get_devdata(master);
++ memset(sp, 0, sizeof(struct glamo_spi));
++
++ sp->master = spi_master_get(master);
++ sp->info = pdev->dev.platform_data;
++ if (!sp->info) {
++ dev_err(&pdev->dev, "can't operate without platform data\n");
++ ret = -EIO;
++ goto err_no_pdev;
++ }
++ dev_dbg(&pdev->dev, "sp->info(pdata) = %p\n", sp->info);
++
++ sp->dev = &pdev->dev;
++
++ platform_set_drvdata(pdev, sp);
++
++ sp->bitbang.master = sp->master;
++ sp->bitbang.setup_transfer = glamo_spi_setupxfer;
++ sp->bitbang.chipselect = glamo_spi_chipsel;
++ sp->bitbang.txrx_bufs = glamo_spi_txrx;
++ sp->bitbang.master->setup = glamo_spi_setup;
++
++ ret = spi_bitbang_start(&sp->bitbang);
++ if (ret)
++ goto err_no_bitbang;
++
++ /* register the chips to go with the board */
++
++ glamofb_cmd_mode(sp->info->glamofb_handle, 1);
++
++ for (i = 0; i < sp->info->board_size; i++) {
++ dev_info(&pdev->dev, "registering %p: %s\n",
++ &sp->info->board_info[i],
++ sp->info->board_info[i].modalias);
++
++ sp->info->board_info[i].controller_data = sp;
++ spi_new_device(master, sp->info->board_info + i);
++ }
++
++ return 0;
++
++err_no_bitbang:
++ platform_set_drvdata(pdev, NULL);
++err_no_pdev:
++ spi_master_put(sp->bitbang.master);
++err:
++ return ret;
++
++}
++
++static int glamo_spi_remove(struct platform_device *pdev)
++{
++ struct glamo_spi *sp = platform_get_drvdata(pdev);
++
++ spi_bitbang_stop(&sp->bitbang);
++ spi_master_put(sp->bitbang.master);
++
++ return 0;
++}
++
++#define glamo_spi_suspend NULL
++#define glamo_spi_resume NULL
++
++static struct platform_driver glamo_spi_drv = {
++ .probe = glamo_spi_probe,
++ .remove = glamo_spi_remove,
++ .suspend = glamo_spi_suspend,
++ .resume = glamo_spi_resume,
++ .driver = {
++ .name = "glamo-lcm-spi",
++ .owner = THIS_MODULE,
++ },
++};
++
++static int __init glamo_spi_init(void)
++{
++ return platform_driver_register(&glamo_spi_drv);
++}
++
++static void __exit glamo_spi_exit(void)
++{
++ platform_driver_unregister(&glamo_spi_drv);
++}
++
++module_init(glamo_spi_init);
++module_exit(glamo_spi_exit);
++
++MODULE_DESCRIPTION("Smedia Glamo 336x/337x LCM serial command SPI Driver");
++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>")
++MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mfd/glamo/glamo-mci.c linux-2.6.29-rc3.owrt.om/drivers/mfd/glamo/glamo-mci.c
+--- linux-2.6.29-rc3.owrt/drivers/mfd/glamo/glamo-mci.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/mfd/glamo/glamo-mci.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,1168 @@
++/*
++ * linux/drivers/mmc/host/glamo-mmc.c - Glamo MMC driver
++ *
++ * Copyright (C) 2007 Openmoko, Inc, Andy Green <andy@openmoko.com>
++ * Based on S3C MMC driver that was:
++ * Copyright (C) 2004-2006 maintech GmbH, Thomas Kleffel <tk@maintech.de>
++ *
++ * 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.
++ */
++
++#include <linux/module.h>
++#include <linux/dma-mapping.h>
++#include <linux/clk.h>
++#include <linux/mmc/mmc.h>
++#include <linux/mmc/host.h>
++#include <linux/platform_device.h>
++#include <linux/irq.h>
++#include <linux/pcf50633.h>
++#include <linux/delay.h>
++#include <linux/interrupt.h>
++#include <linux/spinlock.h>
++#include <linux/workqueue.h>
++
++#include <asm/dma.h>
++#include <asm/dma-mapping.h>
++#include <asm/io.h>
++
++#include "glamo-mci.h"
++#include "glamo-core.h"
++#include "glamo-regs.h"
++
++/* from glamo-core.c */
++extern struct glamo_mci_pdata glamo_mci_def_pdata;
++
++static spinlock_t clock_lock;
++
++#define DRIVER_NAME "glamo-mci"
++#define RESSIZE(ressource) (((ressource)->end - (ressource)->start) + 1)
++
++static void glamo_mci_send_request(struct mmc_host *mmc);
++
++/*
++ * Max SD clock rate
++ *
++ * held at /(3 + 1) due to concerns of 100R recommended series resistor
++ * allows 16MHz @ 4-bit --> 8MBytes/sec raw
++ *
++ * you can override this on kernel commandline using
++ *
++ * glamo_mci.sd_max_clk=10000000
++ *
++ * for example
++ */
++
++static int sd_max_clk = 50000000 / 3;
++module_param(sd_max_clk, int, 0644);
++
++/*
++ * Slow SD clock rate
++ *
++ * you can override this on kernel commandline using
++ *
++ * glamo_mci.sd_slow_ratio=8
++ *
++ * for example
++ *
++ * platform callback is used to decide effective clock rate, if not
++ * defined then max is used, if defined and returns nonzero, rate is
++ * divided by this factor
++ */
++
++static int sd_slow_ratio = 8;
++module_param(sd_slow_ratio, int, 0644);
++
++/*
++ * Post-power SD clock rate
++ *
++ * you can override this on kernel commandline using
++ *
++ * glamo_mci.sd_post_power_clock=1000000
++ *
++ * for example
++ *
++ * After changing power to card, clock is held at this rate until first bulk
++ * transfer completes
++ */
++
++static int sd_post_power_clock = 1000000;
++module_param(sd_post_power_clock, int, 0644);
++
++
++/*
++ * SD Signal drive strength
++ *
++ * you can override this on kernel commandline using
++ *
++ * glamo_mci.sd_drive=0
++ *
++ * for example
++ */
++
++static int sd_drive;
++module_param(sd_drive, int, 0644);
++
++/*
++ * SD allow SD clock to run while idle
++ *
++ * you can override this on kernel commandline using
++ *
++ * glamo_mci.sd_idleclk=0
++ *
++ * for example
++ */
++
++static int sd_idleclk = 0; /* disallow idle clock by default */
++module_param(sd_idleclk, int, 0644);
++
++/* used to stash real idleclk state in suspend: we force it to run in there */
++static int suspend_sd_idleclk;
++
++
++unsigned char CRC7(u8 * pu8, int cnt)
++{
++ u8 crc = 0;
++
++ while (cnt--) {
++ int n;
++ u8 d = *pu8++;
++ for (n = 0; n < 8; n++) {
++ crc <<= 1;
++ if ((d & 0x80) ^ (crc & 0x80))
++ crc ^= 0x09;
++ d <<= 1;
++ }
++ }
++ return (crc << 1) | 1;
++}
++
++static int get_data_buffer(struct glamo_mci_host *host,
++ volatile u32 *words, volatile u16 **pointer)
++{
++ struct scatterlist *sg;
++
++ *words = 0;
++ *pointer = NULL;
++
++ if (host->pio_active == XFER_NONE)
++ return -EINVAL;
++
++ if ((!host->mrq) || (!host->mrq->data))
++ return -EINVAL;
++
++ if (host->pio_sgptr >= host->mrq->data->sg_len) {
++ dev_dbg(&host->pdev->dev, "no more buffers (%i/%i)\n",
++ host->pio_sgptr, host->mrq->data->sg_len);
++ return -EBUSY;
++ }
++ sg = &host->mrq->data->sg[host->pio_sgptr];
++
++ *words = sg->length >> 1; /* we are working with a 16-bit data bus */
++ *pointer = page_address(sg_page(sg)) + sg->offset;
++
++ BUG_ON(((long)(*pointer)) & 1);
++
++ host->pio_sgptr++;
++
++ /* dev_info(&host->pdev->dev, "new buffer (%i/%i)\n",
++ host->pio_sgptr, host->mrq->data->sg_len); */
++ return 0;
++}
++
++static void do_pio_read(struct glamo_mci_host *host)
++{
++ int res;
++ u16 __iomem *from_ptr = host->base_data + (RESSIZE(host->mem_data) /
++ sizeof(u16) / 2);
++#ifdef DEBUG
++ u16 * block;
++#endif
++
++ while (1) {
++ res = get_data_buffer(host, &host->pio_words, &host->pio_ptr);
++ if (res) {
++ host->pio_active = XFER_NONE;
++ host->complete_what = COMPLETION_FINALIZE;
++
++ dev_dbg(&host->pdev->dev, "pio_read(): "
++ "complete (no more data).\n");
++ return;
++ }
++
++ dev_dbg(&host->pdev->dev, "pio_read(): host->pio_words: %d\n",
++ host->pio_words);
++
++ host->pio_count += host->pio_words << 1;
++
++#ifdef DEBUG
++ block = (u16 *)host->pio_ptr;
++ res = host->pio_words << 1;
++#endif
++#if 0
++ /* u16-centric memcpy */
++ while (host->pio_words--)
++ *host->pio_ptr++ = *from_ptr++;
++#else
++ /* memcpy can be faster? */
++ memcpy((void *)host->pio_ptr, from_ptr, host->pio_words << 1);
++ host->pio_ptr += host->pio_words;
++#endif
++
++#ifdef DEBUG
++ print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 16, 1,
++ (void *)block, res, 1);
++#endif
++ }
++}
++
++static int do_pio_write(struct glamo_mci_host *host)
++{
++ int res = 0;
++ volatile u16 __iomem *to_ptr = host->base_data;
++ int err = 0;
++
++ dev_dbg(&host->pdev->dev, "pio_write():\n");
++ while (!res) {
++ res = get_data_buffer(host, &host->pio_words, &host->pio_ptr);
++ if (res)
++ continue;
++
++ dev_dbg(&host->pdev->dev, "pio_write():new source: [%i]@[%p]\n",
++ host->pio_words, host->pio_ptr);
++
++ host->pio_count += host->pio_words << 1;
++ while (host->pio_words--)
++ writew(*host->pio_ptr++, to_ptr++);
++ }
++
++ dev_dbg(&host->pdev->dev, "pio_write(): complete\n");
++ host->pio_active = XFER_NONE;
++ return err;
++}
++
++static void __glamo_mci_fix_card_div(struct glamo_mci_host *host, int div)
++{
++ unsigned long flags;
++
++ spin_lock_irqsave(&clock_lock, flags);
++
++ if (div < 0) {
++ /* stop clock - remove clock from divider input */
++ writew(readw(glamo_mci_def_pdata.pglamo->base +
++ GLAMO_REG_CLOCK_GEN5_1) & (~GLAMO_CLOCK_GEN51_EN_DIV_TCLK),
++ glamo_mci_def_pdata.pglamo->base + GLAMO_REG_CLOCK_GEN5_1);
++
++ goto done;
++ } else {
++ /* set the nearest prescaler factor
++ *
++ * register shared with SCLK divisor -- no chance of race because
++ * we don't use sensor interface
++ */
++ writew((readw(glamo_mci_def_pdata.pglamo->base +
++ GLAMO_REG_CLOCK_GEN8) & 0xff00) | div,
++ glamo_mci_def_pdata.pglamo->base + GLAMO_REG_CLOCK_GEN8);
++ /* enable clock to divider input */
++ writew(readw(glamo_mci_def_pdata.pglamo->base +
++ GLAMO_REG_CLOCK_GEN5_1) | GLAMO_CLOCK_GEN51_EN_DIV_TCLK,
++ glamo_mci_def_pdata.pglamo->base + GLAMO_REG_CLOCK_GEN5_1);
++ }
++
++ if (host->force_slow_during_powerup)
++ div = host->clk_rate / sd_post_power_clock;
++ else
++ if (host->pdata->glamo_mci_use_slow)
++ if ((host->pdata->glamo_mci_use_slow)())
++ div = div * sd_slow_ratio;
++
++ if (div > 255)
++ div = 255;
++
++ /*
++ * set the nearest prescaler factor
++ *
++ * register shared with SCLK divisor -- no chance of race because
++ * we don't use sensor interface
++ */
++ writew((readw(glamo_mci_def_pdata.pglamo->base +
++ GLAMO_REG_CLOCK_GEN8) & 0xff00) | div,
++ glamo_mci_def_pdata.pglamo->base + GLAMO_REG_CLOCK_GEN8);
++ /* enable clock to divider input */
++ writew(readw(glamo_mci_def_pdata.pglamo->base +
++ GLAMO_REG_CLOCK_GEN5_1) | GLAMO_CLOCK_GEN51_EN_DIV_TCLK,
++ glamo_mci_def_pdata.pglamo->base + GLAMO_REG_CLOCK_GEN5_1);
++
++done:
++ spin_unlock_irqrestore(&clock_lock, flags);
++}
++
++static int __glamo_mci_set_card_clock(struct glamo_mci_host *host, int freq,
++ int *division)
++{
++ int div = 0;
++ int real_rate = 0;
++
++ if (freq) {
++ /* Set clock */
++ for (div = 0; div < 256; div++) {
++ real_rate = host->clk_rate / (div + 1);
++ if (real_rate <= freq)
++ break;
++ }
++ if (div > 255)
++ div = 255;
++
++ if (division)
++ *division = div;
++
++ __glamo_mci_fix_card_div(host, div);
++
++ } else {
++ /* stop clock */
++ if (division)
++ *division = 0xff;
++
++ if (!sd_idleclk && !host->force_slow_during_powerup)
++ /* clock off */
++ __glamo_mci_fix_card_div(host, -1);
++ }
++
++ return real_rate;
++}
++
++
++static void glamo_mci_irq_worker(struct work_struct *work)
++{
++ struct glamo_mci_host *host =
++ container_of(work, struct glamo_mci_host, irq_work);
++ struct mmc_command *cmd = host->mrq->cmd;
++
++ if (host->pio_active == XFER_READ)
++ do_pio_read(host);
++
++ host->mrq->data->bytes_xfered = host->pio_count;
++ dev_dbg(&host->pdev->dev, "count=%d\n", host->pio_count);
++
++ /* issue STOP if we have been given one to use */
++ if (host->mrq->stop) {
++ host->cmd_is_stop = 1;
++ glamo_mci_send_request(host->mmc);
++ host->cmd_is_stop = 0;
++ }
++
++ if (!sd_idleclk && !host->force_slow_during_powerup)
++ /* clock off */
++ __glamo_mci_fix_card_div(host, -1);
++
++ host->complete_what = COMPLETION_NONE;
++ host->mrq = NULL;
++ mmc_request_done(host->mmc, cmd->mrq);
++}
++
++static void glamo_mci_irq_host(struct glamo_mci_host *host)
++{
++ u16 status;
++ struct mmc_command *cmd;
++ unsigned long iflags;
++
++ if (host->suspending) { /* bad news, dangerous time */
++ dev_err(&host->pdev->dev, "****glamo_mci_irq before resumed\n");
++ return;
++ }
++
++ if (!host->mrq)
++ return;
++ cmd = host->mrq->cmd;
++ if (!cmd)
++ return;
++
++ spin_lock_irqsave(&host->complete_lock, iflags);
++
++ status = readw(host->base + GLAMO_REG_MMC_RB_STAT1);
++ dev_dbg(&host->pdev->dev, "status = 0x%04x\n", status);
++
++ /* ack this interrupt source */
++ writew(GLAMO_IRQ_MMC,
++ glamo_mci_def_pdata.pglamo->base + GLAMO_REG_IRQ_CLEAR);
++
++ /* we ignore a data timeout report if we are also told the data came */
++ if (status & GLAMO_STAT1_MMC_RB_DRDY)
++ status &= ~GLAMO_STAT1_MMC_DTOUT;
++
++ if (status & (GLAMO_STAT1_MMC_RTOUT |
++ GLAMO_STAT1_MMC_DTOUT))
++ cmd->error = -ETIMEDOUT;
++ if (status & (GLAMO_STAT1_MMC_BWERR |
++ GLAMO_STAT1_MMC_BRERR))
++ cmd->error = -EILSEQ;
++ if (cmd->error) {
++ dev_info(&host->pdev->dev, "Error after cmd: 0x%x\n", status);
++ goto done;
++ }
++
++ /*
++ * disable the initial slow start after first bulk transfer
++ */
++ if (host->force_slow_during_powerup)
++ host->force_slow_during_powerup--;
++
++ /*
++ * we perform the memcpy out of Glamo memory outside of IRQ context
++ * so we don't block other interrupts
++ */
++ schedule_work(&host->irq_work);
++
++ goto leave;
++
++done:
++ host->complete_what = COMPLETION_NONE;
++ host->mrq = NULL;
++ mmc_request_done(host->mmc, cmd->mrq);
++leave:
++ spin_unlock_irqrestore(&host->complete_lock, iflags);
++}
++
++static void glamo_mci_irq(unsigned int irq, struct irq_desc *desc)
++{
++ struct glamo_mci_host *host = (struct glamo_mci_host *)
++ desc->handler_data;
++
++ if (host)
++ glamo_mci_irq_host(host);
++
++}
++
++static int glamo_mci_send_command(struct glamo_mci_host *host,
++ struct mmc_command *cmd)
++{
++ u8 u8a[6];
++ u16 fire = 0;
++
++ /* if we can't do it, reject as busy */
++ if (!readw(host->base + GLAMO_REG_MMC_RB_STAT1) &
++ GLAMO_STAT1_MMC_IDLE) {
++ host->mrq = NULL;
++ cmd->error = -EBUSY;
++ mmc_request_done(host->mmc, host->mrq);
++ return -EBUSY;
++ }
++
++ /* create an array in wire order for CRC computation */
++ u8a[0] = 0x40 | (cmd->opcode & 0x3f);
++ u8a[1] = (u8)(cmd->arg >> 24);
++ u8a[2] = (u8)(cmd->arg >> 16);
++ u8a[3] = (u8)(cmd->arg >> 8);
++ u8a[4] = (u8)cmd->arg;
++ u8a[5] = CRC7(&u8a[0], 5); /* CRC7 on first 5 bytes of packet */
++
++ /* issue the wire-order array including CRC in register order */
++ writew((u8a[4] << 8) | u8a[5], host->base + GLAMO_REG_MMC_CMD_REG1);
++ writew((u8a[2] << 8) | u8a[3], host->base + GLAMO_REG_MMC_CMD_REG2);
++ writew((u8a[0] << 8) | u8a[1], host->base + GLAMO_REG_MMC_CMD_REG3);
++
++ /* command index toggle */
++ fire |= (host->ccnt & 1) << 12;
++
++ /* set type of command */
++ switch (mmc_cmd_type(cmd)) {
++ case MMC_CMD_BC:
++ fire |= GLAMO_FIRE_MMC_CMDT_BNR;
++ break;
++ case MMC_CMD_BCR:
++ fire |= GLAMO_FIRE_MMC_CMDT_BR;
++ break;
++ case MMC_CMD_AC:
++ fire |= GLAMO_FIRE_MMC_CMDT_AND;
++ break;
++ case MMC_CMD_ADTC:
++ fire |= GLAMO_FIRE_MMC_CMDT_AD;
++ break;
++ }
++ /*
++ * if it expects a response, set the type expected
++ *
++ * R1, Length : 48bit, Normal response
++ * R1b, Length : 48bit, same R1, but added card busy status
++ * R2, Length : 136bit (really 128 bits with CRC snipped)
++ * R3, Length : 48bit (OCR register value)
++ * R4, Length : 48bit, SDIO_OP_CONDITION, Reverse SDIO Card
++ * R5, Length : 48bit, IO_RW_DIRECTION, Reverse SDIO Card
++ * R6, Length : 48bit (RCA register)
++ * R7, Length : 48bit (interface condition, VHS(voltage supplied),
++ * check pattern, CRC7)
++ */
++ switch (mmc_resp_type(cmd)) {
++ case MMC_RSP_R6: /* same index as R7 and R1 */
++ fire |= GLAMO_FIRE_MMC_RSPT_R1;
++ break;
++ case MMC_RSP_R1B:
++ fire |= GLAMO_FIRE_MMC_RSPT_R1b;
++ break;
++ case MMC_RSP_R2:
++ fire |= GLAMO_FIRE_MMC_RSPT_R2;
++ break;
++ case MMC_RSP_R3:
++ fire |= GLAMO_FIRE_MMC_RSPT_R3;
++ break;
++ /* R4 and R5 supported by chip not defined in linux/mmc/core.h (sdio) */
++ }
++ /*
++ * From the command index, set up the command class in the host ctrllr
++ *
++ * missing guys present on chip but couldn't figure out how to use yet:
++ * 0x0 "stream read"
++ * 0x9 "cancel running command"
++ */
++ switch (cmd->opcode) {
++ case MMC_READ_SINGLE_BLOCK:
++ fire |= GLAMO_FIRE_MMC_CC_SBR; /* single block read */
++ break;
++ case MMC_SWITCH: /* 64 byte payload */
++ case 0x33: /* observed issued by MCI */
++ case MMC_READ_MULTIPLE_BLOCK:
++ /* we will get an interrupt off this */
++ if (!cmd->mrq->stop)
++ /* multiblock no stop */
++ fire |= GLAMO_FIRE_MMC_CC_MBRNS;
++ else
++ /* multiblock with stop */
++ fire |= GLAMO_FIRE_MMC_CC_MBRS;
++ break;
++ case MMC_WRITE_BLOCK:
++ fire |= GLAMO_FIRE_MMC_CC_SBW; /* single block write */
++ break;
++ case MMC_WRITE_MULTIPLE_BLOCK:
++ if (cmd->mrq->stop)
++ /* multiblock with stop */
++ fire |= GLAMO_FIRE_MMC_CC_MBWS;
++ else
++// /* multiblock NO stop-- 'RESERVED'? */
++ fire |= GLAMO_FIRE_MMC_CC_MBWNS;
++ break;
++ case MMC_STOP_TRANSMISSION:
++ fire |= GLAMO_FIRE_MMC_CC_STOP; /* STOP */
++ break;
++ default:
++ fire |= GLAMO_FIRE_MMC_CC_BASIC; /* "basic command" */
++ break;
++ }
++
++ /* always largest timeout */
++ writew(0xfff, host->base + GLAMO_REG_MMC_TIMEOUT);
++
++ /* Generate interrupt on txfer */
++ writew((readw(host->base + GLAMO_REG_MMC_BASIC) & 0x3e) |
++ 0x0800 | GLAMO_BASIC_MMC_NO_CLK_RD_WAIT |
++ GLAMO_BASIC_MMC_EN_COMPL_INT | (sd_drive << 6),
++ host->base + GLAMO_REG_MMC_BASIC);
++
++ /* send the command out on the wire */
++ /* dev_info(&host->pdev->dev, "Using FIRE %04X\n", fire); */
++ writew(fire, host->base + GLAMO_REG_MMC_CMD_FIRE);
++ cmd->error = 0;
++ return 0;
++}
++
++static int glamo_mci_prepare_pio(struct glamo_mci_host *host,
++ struct mmc_data *data)
++{
++ /*
++ * the S-Media-internal RAM offset for our MMC buffer
++ * Read is halfway up the buffer and write is at the start
++ */
++ if (data->flags & MMC_DATA_READ) {
++ writew((u16)(GLAMO_FB_SIZE + (RESSIZE(host->mem_data) / 2)),
++ host->base + GLAMO_REG_MMC_WDATADS1);
++ writew((u16)((GLAMO_FB_SIZE +
++ (RESSIZE(host->mem_data) / 2)) >> 16),
++ host->base + GLAMO_REG_MMC_WDATADS2);
++ } else {
++ writew((u16)GLAMO_FB_SIZE, host->base +
++ GLAMO_REG_MMC_RDATADS1);
++ writew((u16)(GLAMO_FB_SIZE >> 16), host->base +
++ GLAMO_REG_MMC_RDATADS2);
++ }
++
++ /* set up the block info */
++ writew(data->blksz, host->base + GLAMO_REG_MMC_DATBLKLEN);
++ writew(data->blocks, host->base + GLAMO_REG_MMC_DATBLKCNT);
++ dev_dbg(&host->pdev->dev, "(blksz=%d, count=%d)\n",
++ data->blksz, data->blocks);
++ host->pio_sgptr = 0;
++ host->pio_words = 0;
++ host->pio_count = 0;
++ host->pio_active = 0;
++ /* if write, prep the write into the shared RAM before the command */
++ if (data->flags & MMC_DATA_WRITE) {
++ host->pio_active = XFER_WRITE;
++ return do_pio_write(host);
++ }
++ host->pio_active = XFER_READ;
++ return 0;
++}
++
++static void glamo_mci_send_request(struct mmc_host *mmc)
++{
++ struct glamo_mci_host *host = mmc_priv(mmc);
++ struct mmc_request *mrq = host->mrq;
++ struct mmc_command *cmd = host->cmd_is_stop ? mrq->stop : mrq->cmd;
++ u16 * pu16 = (u16 *)&cmd->resp[0];
++ u16 * reg_resp = (u16 *)(host->base + GLAMO_REG_MMC_CMD_RSP1);
++ u16 status;
++ int n;
++ int timeout = 1000000;
++ int insanity_timeout = 1000000;
++
++ if (host->suspending) {
++ dev_err(&host->pdev->dev, "IGNORING glamo_mci_send_request while "
++ "suspended\n");
++ cmd->error = -EIO;
++ if (cmd->data)
++ cmd->data->error = -EIO;
++ mmc_request_done(mmc, mrq);
++ return;
++ }
++
++ host->ccnt++;
++ /*
++ * somehow 2.6.24 MCI manages to issue MMC_WRITE_BLOCK *without* the
++ * MMC_DATA_WRITE flag, WTF? Work around the madness.
++ */
++ if (cmd->opcode == MMC_WRITE_BLOCK)
++ if (mrq->data)
++ mrq->data->flags |= MMC_DATA_WRITE;
++
++ /* this guy has data to read/write? */
++ if ((!host->cmd_is_stop) && cmd->data) {
++ int res;
++ host->dcnt++;
++ res = glamo_mci_prepare_pio(host, cmd->data);
++ if (res) {
++ cmd->error = -EIO;
++ cmd->data->error = -EIO;
++ mmc_request_done(mmc, mrq);
++ return;
++ }
++ }
++
++ dev_dbg(&host->pdev->dev,"cmd 0x%x, "
++ "arg 0x%x data=%p mrq->stop=%p flags 0x%x\n",
++ cmd->opcode, cmd->arg, cmd->data, cmd->mrq->stop,
++ cmd->flags);
++
++ /* resume requested clock rate
++ * scale it down by sd_slow_ratio if platform requests it
++ */
++ __glamo_mci_fix_card_div(host, host->clk_div);
++
++ if (glamo_mci_send_command(host, cmd))
++ goto bail;
++
++ /* we are deselecting card? because it isn't going to ack then... */
++ if ((cmd->opcode == 7) && (cmd->arg == 0))
++ goto done;
++
++ /*
++ * we must spin until response is ready or timed out
++ * -- we don't get interrupts unless there is a bulk rx
++ */
++ do
++ status = readw(host->base + GLAMO_REG_MMC_RB_STAT1);
++ while (((((status >> 15) & 1) != (host->ccnt & 1)) ||
++ (!(status & (GLAMO_STAT1_MMC_RB_RRDY |
++ GLAMO_STAT1_MMC_RTOUT |
++ GLAMO_STAT1_MMC_DTOUT |
++ GLAMO_STAT1_MMC_BWERR |
++ GLAMO_STAT1_MMC_BRERR)))) && (insanity_timeout--));
++
++ if (insanity_timeout < 0)
++ dev_info(&host->pdev->dev, "command timeout, continuing\n");
++
++ if (status & (GLAMO_STAT1_MMC_RTOUT |
++ GLAMO_STAT1_MMC_DTOUT))
++ cmd->error = -ETIMEDOUT;
++ if (status & (GLAMO_STAT1_MMC_BWERR |
++ GLAMO_STAT1_MMC_BRERR))
++ cmd->error = -EILSEQ;
++
++ if (host->cmd_is_stop)
++ goto bail;
++
++ if (cmd->error) {
++ dev_info(&host->pdev->dev, "Error after cmd: 0x%x\n", status);
++ goto done;
++ }
++ /*
++ * mangle the response registers in two different exciting
++ * undocumented ways discovered by trial and error
++ */
++ if (mmc_resp_type(cmd) == MMC_RSP_R2)
++ /* grab the response */
++ for (n = 0; n < 8; n++) /* super mangle power 1 */
++ pu16[n ^ 6] = readw(&reg_resp[n]);
++ else
++ for (n = 0; n < 3; n++) /* super mangle power 2 */
++ pu16[n] = (readw(&reg_resp[n]) >> 8) |
++ (readw(&reg_resp[n + 1]) << 8);
++ /*
++ * if we don't have bulk data to take care of, we're done
++ */
++ if (!cmd->data)
++ goto done;
++ if (!(cmd->data->flags & (MMC_DATA_READ | MMC_DATA_WRITE)))
++ goto done;
++
++ /*
++ * Otherwise can can use the interrupt as async completion --
++ * if there is read data coming, or we wait for write data to complete,
++ * exit without mmc_request_done() as the payload interrupt
++ * will service it
++ */
++ dev_dbg(&host->pdev->dev, "Waiting for payload data\n");
++ /*
++ * if the glamo INT# line isn't wired (*cough* it can happen)
++ * I'm afraid we have to spin on the IRQ status bit and "be
++ * our own INT# line"
++ */
++ if (!glamo_mci_def_pdata.pglamo->irq_works) {
++ /*
++ * we have faith we will get an "interrupt"...
++ * but something insane like suspend problems can mean
++ * we spin here forever, so we timeout after a LONG time
++ */
++ while ((!(readw(glamo_mci_def_pdata.pglamo->base +
++ GLAMO_REG_IRQ_STATUS) & GLAMO_IRQ_MMC)) &&
++ (timeout--))
++ ;
++
++ if (timeout < 0) {
++ if (cmd->data->error)
++ cmd->data->error = -ETIMEDOUT;
++ dev_err(&host->pdev->dev, "Payload timeout\n");
++ goto bail;
++ }
++
++ /* yay we are an interrupt controller! -- call the ISR
++ * it will stop clock to card
++ */
++ glamo_mci_irq_host(host);
++ }
++ return;
++
++done:
++ host->complete_what = COMPLETION_NONE;
++ host->mrq = NULL;
++ mmc_request_done(host->mmc, cmd->mrq);
++bail:
++ if (!sd_idleclk && !host->force_slow_during_powerup)
++ /* stop the clock to card */
++ __glamo_mci_fix_card_div(host, -1);
++}
++
++static void glamo_mci_request(struct mmc_host *mmc, struct mmc_request *mrq)
++{
++ struct glamo_mci_host *host = mmc_priv(mmc);
++
++ host->cmd_is_stop = 0;
++ host->mrq = mrq;
++ glamo_mci_send_request(mmc);
++}
++
++#if 1
++static void glamo_mci_reset(struct glamo_mci_host *host)
++{
++ if (host->suspending) {
++ dev_err(&host->pdev->dev, "IGNORING glamo_mci_reset while "
++ "suspended\n");
++ return;
++ }
++ dev_dbg(&host->pdev->dev, "******* glamo_mci_reset\n");
++ /* reset MMC controller */
++ writew(GLAMO_CLOCK_MMC_RESET | GLAMO_CLOCK_MMC_DG_TCLK |
++ GLAMO_CLOCK_MMC_EN_TCLK | GLAMO_CLOCK_MMC_DG_M9CLK |
++ GLAMO_CLOCK_MMC_EN_M9CLK,
++ glamo_mci_def_pdata.pglamo->base + GLAMO_REG_CLOCK_MMC);
++ udelay(10);
++ /* and disable reset */
++ writew(GLAMO_CLOCK_MMC_DG_TCLK |
++ GLAMO_CLOCK_MMC_EN_TCLK | GLAMO_CLOCK_MMC_DG_M9CLK |
++ GLAMO_CLOCK_MMC_EN_M9CLK,
++ glamo_mci_def_pdata.pglamo->base + GLAMO_REG_CLOCK_MMC);
++}
++#endif
++static inline int glamo_mci_get_mv(int vdd)
++{
++ int mv = 1650;
++
++ if (vdd > 7)
++ mv += 350 + 100 * (vdd - 8);
++
++ return mv;
++}
++
++static void glamo_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
++{
++ struct glamo_mci_host *host = mmc_priv(mmc);
++ struct regulator *regulator;
++ int n = 0;
++ int div;
++ int powering = 0;
++ int mv;
++
++ if (host->suspending) {
++ dev_err(&host->pdev->dev, "IGNORING glamo_mci_set_ios while "
++ "suspended\n");
++ return;
++ }
++
++ regulator = host->regulator;
++
++ /* Set power */
++ switch(ios->power_mode) {
++ case MMC_POWER_UP:
++ if (host->pdata->glamo_can_set_mci_power()) {
++ mv = glamo_mci_get_mv(ios->vdd);
++ regulator_set_voltage(regulator, mv * 1000, mv * 1000);
++ regulator_enable(regulator);
++ }
++ break;
++ case MMC_POWER_ON:
++ /*
++ * we should use very slow clock until first bulk
++ * transfer completes OK
++ */
++ host->force_slow_during_powerup = 1;
++
++ if (host->vdd_current != ios->vdd) {
++ if (host->pdata->glamo_can_set_mci_power()) {
++ mv = glamo_mci_get_mv(ios->vdd);
++ regulator_set_voltage(regulator, mv * 1000, mv * 1000);
++ printk(KERN_INFO "SD power -> %dmV\n", mv);
++ }
++ host->vdd_current = ios->vdd;
++ }
++ if (host->power_mode_current == MMC_POWER_OFF) {
++ glamo_engine_enable(glamo_mci_def_pdata.pglamo,
++ GLAMO_ENGINE_MMC);
++ powering = 1;
++ }
++ break;
++
++ case MMC_POWER_OFF:
++ default:
++ if (host->power_mode_current == MMC_POWER_OFF)
++ break;
++ /* never want clocking with dead card */
++ __glamo_mci_fix_card_div(host, -1);
++
++ glamo_engine_disable(glamo_mci_def_pdata.pglamo,
++ GLAMO_ENGINE_MMC);
++ regulator_disable(regulator);
++ host->vdd_current = -1;
++ break;
++ }
++ host->power_mode_current = ios->power_mode;
++
++ host->real_rate = __glamo_mci_set_card_clock(host, ios->clock, &div);
++ host->clk_div = div;
++
++ /* after power-up, we are meant to give it >= 74 clocks so it can
++ * initialize itself. Doubt any modern cards need it but anyway...
++ */
++ if (powering)
++ mdelay(1);
++
++ if (!sd_idleclk && !host->force_slow_during_powerup)
++ /* stop the clock to card, because we are idle until transfer */
++ __glamo_mci_fix_card_div(host, -1);
++
++ if ((ios->power_mode == MMC_POWER_ON) ||
++ (ios->power_mode == MMC_POWER_UP)) {
++ dev_info(&host->pdev->dev,
++ "powered (vdd = %d) clk: %lukHz div=%d (req: %ukHz). "
++ "Bus width=%d\n",(int)ios->vdd,
++ host->real_rate / 1000, (int)host->clk_div,
++ ios->clock / 1000, (int)ios->bus_width);
++ } else
++ dev_info(&host->pdev->dev, "glamo_mci_set_ios: power down.\n");
++
++ /* set bus width */
++ host->bus_width = ios->bus_width;
++ if (host->bus_width == MMC_BUS_WIDTH_4)
++ n = GLAMO_BASIC_MMC_EN_4BIT_DATA;
++ writew((readw(host->base + GLAMO_REG_MMC_BASIC) &
++ (~(GLAMO_BASIC_MMC_EN_4BIT_DATA |
++ GLAMO_BASIC_MMC_EN_DR_STR0 |
++ GLAMO_BASIC_MMC_EN_DR_STR1))) | n |
++ sd_drive << 6, host->base + GLAMO_REG_MMC_BASIC);
++}
++
++
++/*
++ * no physical write protect supported by us
++ */
++static int glamo_mci_get_ro(struct mmc_host *mmc)
++{
++ return 0;
++}
++
++static struct mmc_host_ops glamo_mci_ops = {
++ .request = glamo_mci_request,
++ .set_ios = glamo_mci_set_ios,
++ .get_ro = glamo_mci_get_ro,
++};
++
++static int glamo_mci_probe(struct platform_device *pdev)
++{
++ struct mmc_host *mmc;
++ struct glamo_mci_host *host;
++ int ret;
++
++ dev_info(&pdev->dev, "glamo_mci driver (C)2007 Openmoko, Inc\n");
++
++ mmc = mmc_alloc_host(sizeof(struct glamo_mci_host), &pdev->dev);
++ if (!mmc) {
++ ret = -ENOMEM;
++ goto probe_out;
++ }
++
++ host = mmc_priv(mmc);
++ host->mmc = mmc;
++ host->pdev = pdev;
++ host->pdata = &glamo_mci_def_pdata;
++ host->power_mode_current = MMC_POWER_OFF;
++
++ host->complete_what = COMPLETION_NONE;
++ host->pio_active = XFER_NONE;
++
++ spin_lock_init(&host->complete_lock);
++ INIT_WORK(&host->irq_work, glamo_mci_irq_worker);
++
++ host->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ if (!host->mem) {
++ dev_err(&pdev->dev,
++ "failed to get io memory region resouce.\n");
++
++ ret = -ENOENT;
++ goto probe_free_host;
++ }
++
++ host->mem = request_mem_region(host->mem->start,
++ RESSIZE(host->mem), pdev->name);
++
++ if (!host->mem) {
++ dev_err(&pdev->dev, "failed to request io memory region.\n");
++ ret = -ENOENT;
++ goto probe_free_host;
++ }
++
++ host->base = ioremap(host->mem->start, RESSIZE(host->mem));
++ if (!host->base) {
++ dev_err(&pdev->dev, "failed to ioremap() io memory region.\n");
++ ret = -EINVAL;
++ goto probe_free_mem_region;
++ }
++
++ host->regulator = regulator_get(&pdev->dev, "SD_3V3");
++ if (!host->regulator) {
++ dev_err(&pdev->dev, "Cannot proceed without regulator.\n");
++ return -ENODEV;
++ }
++
++ /* set the handler for our bit of the shared chip irq register */
++ set_irq_handler(IRQ_GLAMO(GLAMO_IRQIDX_MMC), glamo_mci_irq);
++ /* stash host as our handler's private data */
++ set_irq_data(IRQ_GLAMO(GLAMO_IRQIDX_MMC), host);
++
++ /* Get ahold of our data buffer we use for data in and out on MMC */
++ host->mem_data = platform_get_resource(pdev, IORESOURCE_MEM, 1);
++ if (!host->mem_data) {
++ dev_err(&pdev->dev,
++ "failed to get io memory region resource.\n");
++ ret = -ENOENT;
++ goto probe_iounmap;
++ }
++
++ host->mem_data = request_mem_region(host->mem_data->start,
++ RESSIZE(host->mem_data), pdev->name);
++
++ if (!host->mem_data) {
++ dev_err(&pdev->dev, "failed to request io memory region.\n");
++ ret = -ENOENT;
++ goto probe_iounmap;
++ }
++ host->base_data = ioremap(host->mem_data->start,
++ RESSIZE(host->mem_data));
++ host->data_max_size = RESSIZE(host->mem_data);
++
++ if (host->base_data == 0) {
++ dev_err(&pdev->dev, "failed to ioremap() io memory region.\n");
++ ret = -EINVAL;
++ goto probe_free_mem_region_data;
++ }
++
++ host->vdd_current = 0;
++ host->clk_rate = 50000000; /* really it's 49152000 */
++ host->clk_div = 16;
++
++ /* explain our host controller capabilities */
++ mmc->ops = &glamo_mci_ops;
++ mmc->ocr_avail = host->pdata->ocr_avail;
++ mmc->caps = MMC_CAP_4_BIT_DATA |
++ MMC_CAP_MMC_HIGHSPEED |
++ MMC_CAP_SD_HIGHSPEED;
++ mmc->f_min = host->clk_rate / 256;
++ mmc->f_max = sd_max_clk;
++
++ mmc->max_blk_count = (1 << 16) - 1; /* GLAMO_REG_MMC_RB_BLKCNT */
++ mmc->max_blk_size = (1 << 12) - 1; /* GLAMO_REG_MMC_RB_BLKLEN */
++ mmc->max_req_size = RESSIZE(host->mem_data) / 2;
++ mmc->max_seg_size = mmc->max_req_size;
++ mmc->max_phys_segs = 1; /* hw doesn't talk about segs??? */
++ mmc->max_hw_segs = 1;
++
++ dev_info(&host->pdev->dev, "probe: mapped mci_base:%p irq:%u.\n",
++ host->base, host->irq);
++
++ platform_set_drvdata(pdev, mmc);
++
++ glamo_engine_enable(glamo_mci_def_pdata.pglamo, GLAMO_ENGINE_MMC);
++ glamo_mci_reset(host);
++
++ if ((ret = mmc_add_host(mmc))) {
++ dev_err(&pdev->dev, "failed to add mmc host.\n");
++ goto probe_free_mem_region_data;
++ }
++
++ dev_info(&pdev->dev,"initialisation done.\n");
++ return 0;
++
++ probe_free_mem_region_data:
++ release_mem_region(host->mem_data->start, RESSIZE(host->mem_data));
++
++ probe_iounmap:
++ iounmap(host->base);
++
++ probe_free_mem_region:
++ release_mem_region(host->mem->start, RESSIZE(host->mem));
++
++ probe_free_host:
++ mmc_free_host(mmc);
++ probe_out:
++ return ret;
++}
++
++static int glamo_mci_remove(struct platform_device *pdev)
++{
++ struct mmc_host *mmc = platform_get_drvdata(pdev);
++ struct glamo_mci_host *host = mmc_priv(mmc);
++ struct regulator *regulator;
++
++ mmc_remove_host(mmc);
++ /* stop using our handler, revert it to default */
++ set_irq_handler(IRQ_GLAMO(GLAMO_IRQIDX_MMC), handle_level_irq);
++ iounmap(host->base);
++ iounmap(host->base_data);
++ release_mem_region(host->mem->start, RESSIZE(host->mem));
++ release_mem_region(host->mem_data->start, RESSIZE(host->mem_data));
++
++ regulator = host->regulator;
++ regulator_put(regulator);
++
++ mmc_free_host(mmc);
++
++ glamo_engine_disable(glamo_mci_def_pdata.pglamo, GLAMO_ENGINE_MMC);
++ return 0;
++}
++
++
++#ifdef CONFIG_PM
++
++static int glamo_mci_suspend(struct platform_device *dev, pm_message_t state)
++{
++ struct mmc_host *mmc = platform_get_drvdata(dev);
++ struct glamo_mci_host *host = mmc_priv(mmc);
++ int ret;
++
++ cancel_work_sync(&host->irq_work);
++
++ /*
++ * possible workaround for SD corruption during suspend - resume
++ * make sure the clock was running during suspend and consequently
++ * resume
++ */
++ __glamo_mci_fix_card_div(host, host->clk_div);
++
++ /* we are going to do more commands to override this in
++ * mmc_suspend_host(), so we need to change sd_idleclk for the
++ * duration as well
++ */
++ suspend_sd_idleclk = sd_idleclk;
++ sd_idleclk = 1;
++
++ ret = mmc_suspend_host(mmc, state);
++
++ host->suspending++;
++ /* so that when we resume, we use any modified max rate */
++ mmc->f_max = sd_max_clk;
++
++ return ret;
++}
++
++int glamo_mci_resume(struct platform_device *dev)
++{
++ struct mmc_host *mmc = platform_get_drvdata(dev);
++ struct glamo_mci_host *host = mmc_priv(mmc);
++ int ret;
++
++ sd_idleclk = 1;
++
++ glamo_engine_enable(host->pdata->pglamo, GLAMO_ENGINE_MMC);
++ glamo_mci_reset(host);
++
++ host->suspending--;
++
++ ret = mmc_resume_host(mmc);
++
++ /* put sd_idleclk back to pre-suspend state */
++ sd_idleclk = suspend_sd_idleclk;
++
++ return ret;
++}
++EXPORT_SYMBOL_GPL(glamo_mci_resume);
++
++#else /* CONFIG_PM */
++#define glamo_mci_suspend NULL
++#define glamo_mci_resume NULL
++#endif /* CONFIG_PM */
++
++
++static struct platform_driver glamo_mci_driver =
++{
++ .driver.name = "glamo-mci",
++ .probe = glamo_mci_probe,
++ .remove = glamo_mci_remove,
++ .suspend = glamo_mci_suspend,
++ .resume = glamo_mci_resume,
++};
++
++static int __init glamo_mci_init(void)
++{
++ spin_lock_init(&clock_lock);
++ platform_driver_register(&glamo_mci_driver);
++ return 0;
++}
++
++static void __exit glamo_mci_exit(void)
++{
++ platform_driver_unregister(&glamo_mci_driver);
++}
++
++module_init(glamo_mci_init);
++module_exit(glamo_mci_exit);
++
++MODULE_DESCRIPTION("Glamo MMC/SD Card Interface driver");
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Andy Green <andy@openmoko.com>");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mfd/glamo/glamo-mci.h linux-2.6.29-rc3.owrt.om/drivers/mfd/glamo/glamo-mci.h
+--- linux-2.6.29-rc3.owrt/drivers/mfd/glamo/glamo-mci.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/mfd/glamo/glamo-mci.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,84 @@
++/*
++ * linux/drivers/mmc/host/glamo-mmc.h - GLAMO MCI driver
++ *
++ * Copyright (C) 2007-2008 Openmoko, Inc, Andy Green <andy@openmoko.com>
++ * based on S3C MMC driver -->
++ * Copyright (C) 2004-2006 Thomas Kleffel, All Rights Reserved.
++ *
++ * 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.
++ */
++
++#include <linux/regulator/consumer.h>
++
++enum glamo_mci_waitfor {
++ COMPLETION_NONE,
++ COMPLETION_FINALIZE,
++ COMPLETION_CMDSENT,
++ COMPLETION_RSPFIN,
++ COMPLETION_XFERFINISH,
++ COMPLETION_XFERFINISH_RSPFIN,
++};
++
++struct glamo_mci_host {
++ struct platform_device *pdev;
++ struct glamo_mci_pdata *pdata;
++ struct mmc_host *mmc;
++ struct resource *mem;
++ struct resource *mem_data;
++ struct clk *clk;
++ void __iomem *base;
++ u16 __iomem *base_data;
++ int irq;
++ int irq_cd;
++ int dma;
++ int data_max_size;
++
++ int suspending;
++
++ int power_mode_current;
++ unsigned int vdd_current;
++
++ unsigned long clk_rate;
++ unsigned long clk_div;
++ unsigned long real_rate;
++ u8 prescaler;
++
++ int force_slow_during_powerup;
++
++ unsigned sdiimsk;
++ int dodma;
++
++ volatile int dmatogo;
++
++ struct mmc_request *mrq;
++ int cmd_is_stop;
++ struct work_struct irq_work;
++
++ spinlock_t complete_lock;
++ volatile enum glamo_mci_waitfor
++ complete_what;
++
++ volatile int dma_complete;
++
++ volatile u32 pio_sgptr;
++ volatile u32 pio_words;
++ volatile u32 pio_count;
++ volatile u16 *pio_ptr;
++#define XFER_NONE 0
++#define XFER_READ 1
++#define XFER_WRITE 2
++ volatile u32 pio_active;
++
++ int bus_width;
++
++ char dbgmsg_cmd[301];
++ char dbgmsg_dat[301];
++ volatile char *status;
++
++ unsigned int ccnt, dcnt;
++ struct tasklet_struct pio_tasklet;
++
++ struct regulator *regulator;
++};
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mfd/glamo/glamo-regs.h linux-2.6.29-rc3.owrt.om/drivers/mfd/glamo/glamo-regs.h
+--- linux-2.6.29-rc3.owrt/drivers/mfd/glamo/glamo-regs.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/mfd/glamo/glamo-regs.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,632 @@
++#ifndef _GLAMO_REGS_H
++#define _GLAMO_REGS_H
++
++/* Smedia Glamo 336x/337x driver
++ *
++ * (C) 2007 by Openmoko, Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ */
++
++enum glamo_regster_offsets {
++ GLAMO_REGOFS_GENERIC = 0x0000,
++ GLAMO_REGOFS_HOSTBUS = 0x0200,
++ GLAMO_REGOFS_MEMORY = 0x0300,
++ GLAMO_REGOFS_VIDCAP = 0x0400,
++ GLAMO_REGOFS_ISP = 0x0500,
++ GLAMO_REGOFS_JPEG = 0x0800,
++ GLAMO_REGOFS_MPEG = 0x0c00,
++ GLAMO_REGOFS_LCD = 0x1100,
++ GLAMO_REGOFS_MMC = 0x1400,
++ GLAMO_REGOFS_MPROC0 = 0x1500,
++ GLAMO_REGOFS_MPROC1 = 0x1580,
++ GLAMO_REGOFS_CMDQUEUE = 0x1600,
++ GLAMO_REGOFS_RISC = 0x1680,
++ GLAMO_REGOFS_2D = 0x1700,
++ GLAMO_REGOFS_3D = 0x1b00,
++ GLAMO_REGOFS_END = 0x2400,
++};
++
++
++enum glamo_register_generic {
++ GLAMO_REG_GCONF1 = 0x0000,
++ GLAMO_REG_GCONF2 = 0x0002,
++#define GLAMO_REG_DEVICE_ID GLAMO_REG_GCONF2
++ GLAMO_REG_GCONF3 = 0x0004,
++#define GLAMO_REG_REVISION_ID GLAMO_REG_GCONF3
++ GLAMO_REG_IRQ_GEN1 = 0x0006,
++#define GLAMO_REG_IRQ_ENABLE GLAMO_REG_IRQ_GEN1
++ GLAMO_REG_IRQ_GEN2 = 0x0008,
++#define GLAMO_REG_IRQ_SET GLAMO_REG_IRQ_GEN2
++ GLAMO_REG_IRQ_GEN3 = 0x000a,
++#define GLAMO_REG_IRQ_CLEAR GLAMO_REG_IRQ_GEN3
++ GLAMO_REG_IRQ_GEN4 = 0x000c,
++#define GLAMO_REG_IRQ_STATUS GLAMO_REG_IRQ_GEN4
++ GLAMO_REG_CLOCK_HOST = 0x0010,
++ GLAMO_REG_CLOCK_MEMORY = 0x0012,
++ GLAMO_REG_CLOCK_LCD = 0x0014,
++ GLAMO_REG_CLOCK_MMC = 0x0016,
++ GLAMO_REG_CLOCK_ISP = 0x0018,
++ GLAMO_REG_CLOCK_JPEG = 0x001a,
++ GLAMO_REG_CLOCK_3D = 0x001c,
++ GLAMO_REG_CLOCK_2D = 0x001e,
++ GLAMO_REG_CLOCK_RISC1 = 0x0020, /* 3365 only? */
++ GLAMO_REG_CLOCK_RISC2 = 0x0022, /* 3365 only? */
++ GLAMO_REG_CLOCK_MPEG = 0x0024,
++ GLAMO_REG_CLOCK_MPROC = 0x0026,
++
++ GLAMO_REG_CLOCK_GEN5_1 = 0x0030,
++ GLAMO_REG_CLOCK_GEN5_2 = 0x0032,
++ GLAMO_REG_CLOCK_GEN6 = 0x0034,
++ GLAMO_REG_CLOCK_GEN7 = 0x0036,
++ GLAMO_REG_CLOCK_GEN8 = 0x0038,
++ GLAMO_REG_CLOCK_GEN9 = 0x003a,
++ GLAMO_REG_CLOCK_GEN10 = 0x003c,
++ GLAMO_REG_CLOCK_GEN11 = 0x003e,
++ GLAMO_REG_PLL_GEN1 = 0x0040,
++ GLAMO_REG_PLL_GEN2 = 0x0042,
++ GLAMO_REG_PLL_GEN3 = 0x0044,
++ GLAMO_REG_PLL_GEN4 = 0x0046,
++ GLAMO_REG_PLL_GEN5 = 0x0048,
++ GLAMO_REG_GPIO_GEN1 = 0x0050,
++ GLAMO_REG_GPIO_GEN2 = 0x0052,
++ GLAMO_REG_GPIO_GEN3 = 0x0054,
++ GLAMO_REG_GPIO_GEN4 = 0x0056,
++ GLAMO_REG_GPIO_GEN5 = 0x0058,
++ GLAMO_REG_GPIO_GEN6 = 0x005a,
++ GLAMO_REG_GPIO_GEN7 = 0x005c,
++ GLAMO_REG_GPIO_GEN8 = 0x005e,
++ GLAMO_REG_GPIO_GEN9 = 0x0060,
++ GLAMO_REG_GPIO_GEN10 = 0x0062,
++ GLAMO_REG_DFT_GEN1 = 0x0070,
++ GLAMO_REG_DFT_GEN2 = 0x0072,
++ GLAMO_REG_DFT_GEN3 = 0x0074,
++ GLAMO_REG_DFT_GEN4 = 0x0076,
++
++ GLAMO_REG_DFT_GEN5 = 0x01e0,
++ GLAMO_REG_DFT_GEN6 = 0x01f0,
++};
++
++#define GLAMO_REG_HOSTBUS(x) (GLAMO_REGOFS_HOSTBUS-2+(x*2))
++
++#define REG_MEM(x) (GLAMO_REGOFS_MEMORY+(x))
++#define GLAMO_REG_MEM_TIMING(x) (GLAMO_REG_MEM_TIMING1-2+(x*2))
++
++enum glamo_register_mem {
++ GLAMO_REG_MEM_TYPE = REG_MEM(0x00),
++ GLAMO_REG_MEM_GEN = REG_MEM(0x02),
++ GLAMO_REG_MEM_TIMING1 = REG_MEM(0x04),
++ GLAMO_REG_MEM_TIMING2 = REG_MEM(0x06),
++ GLAMO_REG_MEM_TIMING3 = REG_MEM(0x08),
++ GLAMO_REG_MEM_TIMING4 = REG_MEM(0x0a),
++ GLAMO_REG_MEM_TIMING5 = REG_MEM(0x0c),
++ GLAMO_REG_MEM_TIMING6 = REG_MEM(0x0e),
++ GLAMO_REG_MEM_TIMING7 = REG_MEM(0x10),
++ GLAMO_REG_MEM_TIMING8 = REG_MEM(0x12),
++ GLAMO_REG_MEM_TIMING9 = REG_MEM(0x14),
++ GLAMO_REG_MEM_TIMING10 = REG_MEM(0x16),
++ GLAMO_REG_MEM_TIMING11 = REG_MEM(0x18),
++ GLAMO_REG_MEM_POWER1 = REG_MEM(0x1a),
++ GLAMO_REG_MEM_POWER2 = REG_MEM(0x1c),
++ GLAMO_REG_MEM_LCD_BUF1 = REG_MEM(0x1e),
++ GLAMO_REG_MEM_LCD_BUF2 = REG_MEM(0x20),
++ GLAMO_REG_MEM_LCD_BUF3 = REG_MEM(0x22),
++ GLAMO_REG_MEM_LCD_BUF4 = REG_MEM(0x24),
++ GLAMO_REG_MEM_BIST1 = REG_MEM(0x26),
++ GLAMO_REG_MEM_BIST2 = REG_MEM(0x28),
++ GLAMO_REG_MEM_BIST3 = REG_MEM(0x2a),
++ GLAMO_REG_MEM_BIST4 = REG_MEM(0x2c),
++ GLAMO_REG_MEM_BIST5 = REG_MEM(0x2e),
++ GLAMO_REG_MEM_MAH1 = REG_MEM(0x30),
++ GLAMO_REG_MEM_MAH2 = REG_MEM(0x32),
++ GLAMO_REG_MEM_DRAM1 = REG_MEM(0x34),
++ GLAMO_REG_MEM_DRAM2 = REG_MEM(0x36),
++ GLAMO_REG_MEM_CRC = REG_MEM(0x38),
++};
++
++#define GLAMO_MEM_TYPE_MASK 0x03
++
++enum glamo_reg_mem_dram1 {
++ /* b0 - b10 == refresh period, 1 -> 2048 clocks */
++ GLAMO_MEM_DRAM1_EN_GATE_CLK = (1 << 11),
++ GLAMO_MEM_DRAM1_SELF_REFRESH = (1 << 12),
++ GLAMO_MEM_DRAM1_EN_GATE_CKE = (1 << 13),
++ GLAMO_MEM_DRAM1_EN_DRAM_REFRESH = (1 << 14),
++ GLAMO_MEM_DRAM1_EN_MODEREG_SET = (1 << 15),
++};
++
++enum glamo_reg_mem_dram2 {
++ GLAMO_MEM_DRAM2_DEEP_PWRDOWN = (1 << 12),
++};
++
++enum glamo_irq_index {
++ GLAMO_IRQIDX_HOSTBUS = 0,
++ GLAMO_IRQIDX_JPEG = 1,
++ GLAMO_IRQIDX_MPEG = 2,
++ GLAMO_IRQIDX_MPROC1 = 3,
++ GLAMO_IRQIDX_MPROC0 = 4,
++ GLAMO_IRQIDX_CMDQUEUE = 5,
++ GLAMO_IRQIDX_2D = 6,
++ GLAMO_IRQIDX_MMC = 7,
++ GLAMO_IRQIDX_RISC = 8,
++};
++
++enum glamo_irq {
++ GLAMO_IRQ_HOSTBUS = (1 << GLAMO_IRQIDX_HOSTBUS),
++ GLAMO_IRQ_JPEG = (1 << GLAMO_IRQIDX_JPEG),
++ GLAMO_IRQ_MPEG = (1 << GLAMO_IRQIDX_MPEG),
++ GLAMO_IRQ_MPROC1 = (1 << GLAMO_IRQIDX_MPROC1),
++ GLAMO_IRQ_MPROC0 = (1 << GLAMO_IRQIDX_MPROC0),
++ GLAMO_IRQ_CMDQUEUE = (1 << GLAMO_IRQIDX_CMDQUEUE),
++ GLAMO_IRQ_2D = (1 << GLAMO_IRQIDX_2D),
++ GLAMO_IRQ_MMC = (1 << GLAMO_IRQIDX_MMC),
++ GLAMO_IRQ_RISC = (1 << GLAMO_IRQIDX_RISC),
++};
++
++enum glamo_reg_clock_host {
++ GLAMO_CLOCK_HOST_DG_BCLK = 0x0001,
++ GLAMO_CLOCK_HOST_DG_M0CLK = 0x0004,
++ GLAMO_CLOCK_HOST_RESET = 0x1000,
++};
++
++enum glamo_reg_clock_mem {
++ GLAMO_CLOCK_MEM_DG_M1CLK = 0x0001,
++ GLAMO_CLOCK_MEM_EN_M1CLK = 0x0002,
++ GLAMO_CLOCK_MEM_DG_MOCACLK = 0x0004,
++ GLAMO_CLOCK_MEM_EN_MOCACLK = 0x0008,
++ GLAMO_CLOCK_MEM_RESET = 0x1000,
++ GLAMO_CLOCK_MOCA_RESET = 0x2000,
++};
++
++enum glamo_reg_clock_lcd {
++ GLAMO_CLOCK_LCD_DG_DCLK = 0x0001,
++ GLAMO_CLOCK_LCD_EN_DCLK = 0x0002,
++ GLAMO_CLOCK_LCD_DG_DMCLK = 0x0004,
++ GLAMO_CLOCK_LCD_EN_DMCLK = 0x0008,
++ //
++ GLAMO_CLOCK_LCD_EN_DHCLK = 0x0020,
++ GLAMO_CLOCK_LCD_DG_M5CLK = 0x0040,
++ GLAMO_CLOCK_LCD_EN_M5CLK = 0x0080,
++ GLAMO_CLOCK_LCD_RESET = 0x1000,
++};
++
++enum glamo_reg_clock_mmc {
++ GLAMO_CLOCK_MMC_DG_TCLK = 0x0001,
++ GLAMO_CLOCK_MMC_EN_TCLK = 0x0002,
++ GLAMO_CLOCK_MMC_DG_M9CLK = 0x0004,
++ GLAMO_CLOCK_MMC_EN_M9CLK = 0x0008,
++ GLAMO_CLOCK_MMC_RESET = 0x1000,
++};
++
++enum glamo_reg_basic_mmc {
++ /* set to disable CRC error rejection */
++ GLAMO_BASIC_MMC_DISABLE_CRC = 0x0001,
++ /* enable completion interrupt */
++ GLAMO_BASIC_MMC_EN_COMPL_INT = 0x0002,
++ /* stop MMC clock while enforced idle waiting for data from card */
++ GLAMO_BASIC_MMC_NO_CLK_RD_WAIT = 0x0004,
++ /* 0 = 1-bit bus to card, 1 = use 4-bit bus (has to be negotiated) */
++ GLAMO_BASIC_MMC_EN_4BIT_DATA = 0x0008,
++ /* enable 75K pullups on D3..D0 */
++ GLAMO_BASIC_MMC_EN_DATA_PUPS = 0x0010,
++ /* enable 75K pullup on CMD */
++ GLAMO_BASIC_MMC_EN_CMD_PUP = 0x0020,
++ /* IO drive strength 00=weak -> 11=strongest */
++ GLAMO_BASIC_MMC_EN_DR_STR0 = 0x0040,
++ GLAMO_BASIC_MMC_EN_DR_STR1 = 0x0080,
++ /* TCLK delay stage A, 0000 = 500ps --> 1111 = 8ns */
++ GLAMO_BASIC_MMC_EN_TCLK_DLYA0 = 0x0100,
++ GLAMO_BASIC_MMC_EN_TCLK_DLYA1 = 0x0200,
++ GLAMO_BASIC_MMC_EN_TCLK_DLYA2 = 0x0400,
++ GLAMO_BASIC_MMC_EN_TCLK_DLYA3 = 0x0800,
++ /* TCLK delay stage B (cumulative), 0000 = 500ps --> 1111 = 8ns */
++ GLAMO_BASIC_MMC_EN_TCLK_DLYB0 = 0x1000,
++ GLAMO_BASIC_MMC_EN_TCLK_DLYB1 = 0x2000,
++ GLAMO_BASIC_MMC_EN_TCLK_DLYB2 = 0x4000,
++ GLAMO_BASIC_MMC_EN_TCLK_DLYB3 = 0x8000,
++};
++
++enum glamo_reg_stat1_mmc {
++ /* command "counter" (really: toggle) */
++ GLAMO_STAT1_MMC_CMD_CTR = 0x8000,
++ /* engine is idle */
++ GLAMO_STAT1_MMC_IDLE = 0x4000,
++ /* readback response is ready */
++ GLAMO_STAT1_MMC_RB_RRDY = 0x0200,
++ /* readback data is ready */
++ GLAMO_STAT1_MMC_RB_DRDY = 0x0100,
++ /* no response timeout */
++ GLAMO_STAT1_MMC_RTOUT = 0x0020,
++ /* no data timeout */
++ GLAMO_STAT1_MMC_DTOUT = 0x0010,
++ /* CRC error on block write */
++ GLAMO_STAT1_MMC_BWERR = 0x0004,
++ /* CRC error on block read */
++ GLAMO_STAT1_MMC_BRERR = 0x0002
++};
++
++enum glamo_reg_fire_mmc {
++ /* command "counter" (really: toggle)
++ * the STAT1 register reflects this so you can ensure you don't look
++ * at status for previous command
++ */
++ GLAMO_FIRE_MMC_CMD_CTR = 0x8000,
++ /* sets kind of response expected */
++ GLAMO_FIRE_MMC_RES_MASK = 0x0700,
++ /* sets command type */
++ GLAMO_FIRE_MMC_TYP_MASK = 0x00C0,
++ /* sets command class */
++ GLAMO_FIRE_MMC_CLS_MASK = 0x000F,
++};
++
++enum glamo_fire_mmc_response_types {
++ GLAMO_FIRE_MMC_RSPT_R1 = 0x0000,
++ GLAMO_FIRE_MMC_RSPT_R1b = 0x0100,
++ GLAMO_FIRE_MMC_RSPT_R2 = 0x0200,
++ GLAMO_FIRE_MMC_RSPT_R3 = 0x0300,
++ GLAMO_FIRE_MMC_RSPT_R4 = 0x0400,
++ GLAMO_FIRE_MMC_RSPT_R5 = 0x0500,
++};
++
++enum glamo_fire_mmc_command_types {
++ /* broadcast, no response */
++ GLAMO_FIRE_MMC_CMDT_BNR = 0x0000,
++ /* broadcast, with response */
++ GLAMO_FIRE_MMC_CMDT_BR = 0x0040,
++ /* addressed, no data */
++ GLAMO_FIRE_MMC_CMDT_AND = 0x0080,
++ /* addressed, with data */
++ GLAMO_FIRE_MMC_CMDT_AD = 0x00C0,
++};
++
++enum glamo_fire_mmc_command_class {
++ /* "Stream Read" */
++ GLAMO_FIRE_MMC_CC_STRR = 0x0000,
++ /* Single Block Read */
++ GLAMO_FIRE_MMC_CC_SBR = 0x0001,
++ /* Multiple Block Read With Stop */
++ GLAMO_FIRE_MMC_CC_MBRS = 0x0002,
++ /* Multiple Block Read No Stop */
++ GLAMO_FIRE_MMC_CC_MBRNS = 0x0003,
++ /* RESERVED for "Stream Write" */
++ GLAMO_FIRE_MMC_CC_STRW = 0x0004,
++ /* "Stream Write" */
++ GLAMO_FIRE_MMC_CC_SBW = 0x0005,
++ /* RESERVED for Multiple Block Write With Stop */
++ GLAMO_FIRE_MMC_CC_MBWS = 0x0006,
++ /* Multiple Block Write No Stop */
++ GLAMO_FIRE_MMC_CC_MBWNS = 0x0007,
++ /* STOP command */
++ GLAMO_FIRE_MMC_CC_STOP = 0x0008,
++ /* Cancel on Running Command */
++ GLAMO_FIRE_MMC_CC_CANCL = 0x0009,
++ /* "Basic Command" */
++ GLAMO_FIRE_MMC_CC_BASIC = 0x000a,
++};
++
++/* these are offsets from the start of the MMC register region */
++enum glamo_register_mmc {
++ /* MMC command, b15..8 = cmd arg b7..0; b7..1 = CRC; b0 = end bit */
++ GLAMO_REG_MMC_CMD_REG1 = 0x00,
++ /* MMC command, b15..0 = cmd arg b23 .. 8 */
++ GLAMO_REG_MMC_CMD_REG2 = 0x02,
++ /* MMC command, b15=start, b14=transmission,
++ * b13..8=cmd idx, b7..0=cmd arg b31..24
++ */
++ GLAMO_REG_MMC_CMD_REG3 = 0x04,
++ GLAMO_REG_MMC_CMD_FIRE = 0x06,
++ GLAMO_REG_MMC_CMD_RSP1 = 0x10,
++ GLAMO_REG_MMC_CMD_RSP2 = 0x12,
++ GLAMO_REG_MMC_CMD_RSP3 = 0x14,
++ GLAMO_REG_MMC_CMD_RSP4 = 0x16,
++ GLAMO_REG_MMC_CMD_RSP5 = 0x18,
++ GLAMO_REG_MMC_CMD_RSP6 = 0x1a,
++ GLAMO_REG_MMC_CMD_RSP7 = 0x1c,
++ GLAMO_REG_MMC_CMD_RSP8 = 0x1e,
++ GLAMO_REG_MMC_RB_STAT1 = 0x20,
++ GLAMO_REG_MMC_RB_BLKCNT = 0x22,
++ GLAMO_REG_MMC_RB_BLKLEN = 0x24,
++ GLAMO_REG_MMC_BASIC = 0x30,
++ GLAMO_REG_MMC_RDATADS1 = 0x34,
++ GLAMO_REG_MMC_RDATADS2 = 0x36,
++ GLAMO_REG_MMC_WDATADS1 = 0x38,
++ GLAMO_REG_MMC_WDATADS2 = 0x3a,
++ GLAMO_REG_MMC_DATBLKCNT = 0x3c,
++ GLAMO_REG_MMC_DATBLKLEN = 0x3e,
++ GLAMO_REG_MMC_TIMEOUT = 0x40,
++
++};
++
++enum glamo_reg_clock_isp {
++ GLAMO_CLOCK_ISP_DG_I1CLK = 0x0001,
++ GLAMO_CLOCK_ISP_EN_I1CLK = 0x0002,
++ GLAMO_CLOCK_ISP_DG_CCLK = 0x0004,
++ GLAMO_CLOCK_ISP_EN_CCLK = 0x0008,
++ //
++ GLAMO_CLOCK_ISP_EN_SCLK = 0x0020,
++ GLAMO_CLOCK_ISP_DG_M2CLK = 0x0040,
++ GLAMO_CLOCK_ISP_EN_M2CLK = 0x0080,
++ GLAMO_CLOCK_ISP_DG_M15CLK = 0x0100,
++ GLAMO_CLOCK_ISP_EN_M15CLK = 0x0200,
++ GLAMO_CLOCK_ISP1_RESET = 0x1000,
++ GLAMO_CLOCK_ISP2_RESET = 0x2000,
++};
++
++enum glamo_reg_clock_jpeg {
++ GLAMO_CLOCK_JPEG_DG_JCLK = 0x0001,
++ GLAMO_CLOCK_JPEG_EN_JCLK = 0x0002,
++ GLAMO_CLOCK_JPEG_DG_M3CLK = 0x0004,
++ GLAMO_CLOCK_JPEG_EN_M3CLK = 0x0008,
++ GLAMO_CLOCK_JPEG_RESET = 0x1000,
++};
++
++enum glamo_reg_clock_2d {
++ GLAMO_CLOCK_2D_DG_GCLK = 0x0001,
++ GLAMO_CLOCK_2D_EN_GCLK = 0x0002,
++ GLAMO_CLOCK_2D_DG_M7CLK = 0x0004,
++ GLAMO_CLOCK_2D_EN_M7CLK = 0x0008,
++ GLAMO_CLOCK_2D_DG_M6CLK = 0x0010,
++ GLAMO_CLOCK_2D_EN_M6CLK = 0x0020,
++ GLAMO_CLOCK_2D_RESET = 0x1000,
++ GLAMO_CLOCK_2D_CQ_RESET = 0x2000,
++};
++
++enum glamo_reg_clock_3d {
++ GLAMO_CLOCK_3D_DG_ECLK = 0x0001,
++ GLAMO_CLOCK_3D_EN_ECLK = 0x0002,
++ GLAMO_CLOCK_3D_DG_RCLK = 0x0004,
++ GLAMO_CLOCK_3D_EN_RCLK = 0x0008,
++ GLAMO_CLOCK_3D_DG_M8CLK = 0x0010,
++ GLAMO_CLOCK_3D_EN_M8CLK = 0x0020,
++ GLAMO_CLOCK_3D_BACK_RESET = 0x1000,
++ GLAMO_CLOCK_3D_FRONT_RESET = 0x2000,
++};
++
++enum glamo_reg_clock_mpeg {
++ GLAMO_CLOCK_MPEG_DG_X0CLK = 0x0001,
++ GLAMO_CLOCK_MPEG_EN_X0CLK = 0x0002,
++ GLAMO_CLOCK_MPEG_DG_X1CLK = 0x0004,
++ GLAMO_CLOCK_MPEG_EN_X1CLK = 0x0008,
++ GLAMO_CLOCK_MPEG_DG_X2CLK = 0x0010,
++ GLAMO_CLOCK_MPEG_EN_X2CLK = 0x0020,
++ GLAMO_CLOCK_MPEG_DG_X3CLK = 0x0040,
++ GLAMO_CLOCK_MPEG_EN_X3CLK = 0x0080,
++ GLAMO_CLOCK_MPEG_DG_X4CLK = 0x0100,
++ GLAMO_CLOCK_MPEG_EN_X4CLK = 0x0200,
++ GLAMO_CLOCK_MPEG_DG_X6CLK = 0x0400,
++ GLAMO_CLOCK_MPEG_EN_X6CLK = 0x0800,
++ GLAMO_CLOCK_MPEG_ENC_RESET = 0x1000,
++ GLAMO_CLOCK_MPEG_DEC_RESET = 0x2000,
++};
++
++enum glamo_reg_clock51 {
++ GLAMO_CLOCK_GEN51_EN_DIV_MCLK = 0x0001,
++ GLAMO_CLOCK_GEN51_EN_DIV_SCLK = 0x0002,
++ GLAMO_CLOCK_GEN51_EN_DIV_JCLK = 0x0004,
++ GLAMO_CLOCK_GEN51_EN_DIV_DCLK = 0x0008,
++ GLAMO_CLOCK_GEN51_EN_DIV_DMCLK = 0x0010,
++ GLAMO_CLOCK_GEN51_EN_DIV_DHCLK = 0x0020,
++ GLAMO_CLOCK_GEN51_EN_DIV_GCLK = 0x0040,
++ GLAMO_CLOCK_GEN51_EN_DIV_TCLK = 0x0080,
++ /* FIXME: higher bits */
++};
++
++enum glamo_reg_hostbus2 {
++ GLAMO_HOSTBUS2_MMIO_EN_ISP = 0x0001,
++ GLAMO_HOSTBUS2_MMIO_EN_JPEG = 0x0002,
++ GLAMO_HOSTBUS2_MMIO_EN_MPEG = 0x0004,
++ GLAMO_HOSTBUS2_MMIO_EN_LCD = 0x0008,
++ GLAMO_HOSTBUS2_MMIO_EN_MMC = 0x0010,
++ GLAMO_HOSTBUS2_MMIO_EN_MICROP0 = 0x0020,
++ GLAMO_HOSTBUS2_MMIO_EN_MICROP1 = 0x0040,
++ GLAMO_HOSTBUS2_MMIO_EN_CQ = 0x0080,
++ GLAMO_HOSTBUS2_MMIO_EN_RISC = 0x0100,
++ GLAMO_HOSTBUS2_MMIO_EN_2D = 0x0200,
++ GLAMO_HOSTBUS2_MMIO_EN_3D = 0x0400,
++};
++
++/* LCD Controller */
++
++#define REG_LCD(x) (x)
++enum glamo_reg_lcd {
++ GLAMO_REG_LCD_MODE1 = REG_LCD(0x00),
++ GLAMO_REG_LCD_MODE2 = REG_LCD(0x02),
++ GLAMO_REG_LCD_MODE3 = REG_LCD(0x04),
++ GLAMO_REG_LCD_WIDTH = REG_LCD(0x06),
++ GLAMO_REG_LCD_HEIGHT = REG_LCD(0x08),
++ GLAMO_REG_LCD_POLARITY = REG_LCD(0x0a),
++ GLAMO_REG_LCD_A_BASE1 = REG_LCD(0x0c),
++ GLAMO_REG_LCD_A_BASE2 = REG_LCD(0x0e),
++ GLAMO_REG_LCD_B_BASE1 = REG_LCD(0x10),
++ GLAMO_REG_LCD_B_BASE2 = REG_LCD(0x12),
++ GLAMO_REG_LCD_C_BASE1 = REG_LCD(0x14),
++ GLAMO_REG_LCD_C_BASE2 = REG_LCD(0x16),
++ GLAMO_REG_LCD_PITCH = REG_LCD(0x18),
++ /* RES */
++ GLAMO_REG_LCD_HORIZ_TOTAL = REG_LCD(0x1c),
++ /* RES */
++ GLAMO_REG_LCD_HORIZ_RETR_START = REG_LCD(0x20),
++ /* RES */
++ GLAMO_REG_LCD_HORIZ_RETR_END = REG_LCD(0x24),
++ /* RES */
++ GLAMO_REG_LCD_HORIZ_DISP_START = REG_LCD(0x28),
++ /* RES */
++ GLAMO_REG_LCD_HORIZ_DISP_END = REG_LCD(0x2c),
++ /* RES */
++ GLAMO_REG_LCD_VERT_TOTAL = REG_LCD(0x30),
++ /* RES */
++ GLAMO_REG_LCD_VERT_RETR_START = REG_LCD(0x34),
++ /* RES */
++ GLAMO_REG_LCD_VERT_RETR_END = REG_LCD(0x38),
++ /* RES */
++ GLAMO_REG_LCD_VERT_DISP_START = REG_LCD(0x3c),
++ /* RES */
++ GLAMO_REG_LCD_VERT_DISP_END = REG_LCD(0x40),
++ /* RES */
++ GLAMO_REG_LCD_POL = REG_LCD(0x44),
++ GLAMO_REG_LCD_DATA_START = REG_LCD(0x46),
++ GLAMO_REG_LCD_FRATE_CONTRO = REG_LCD(0x48),
++ GLAMO_REG_LCD_DATA_CMD_HDR = REG_LCD(0x4a),
++ GLAMO_REG_LCD_SP_START = REG_LCD(0x4c),
++ GLAMO_REG_LCD_SP_END = REG_LCD(0x4e),
++ GLAMO_REG_LCD_CURSOR_BASE1 = REG_LCD(0x50),
++ GLAMO_REG_LCD_CURSOR_BASE2 = REG_LCD(0x52),
++ GLAMO_REG_LCD_CURSOR_PITCH = REG_LCD(0x54),
++ GLAMO_REG_LCD_CURSOR_X_SIZE = REG_LCD(0x56),
++ GLAMO_REG_LCD_CURSOR_Y_SIZE = REG_LCD(0x58),
++ GLAMO_REG_LCD_CURSOR_X_POS = REG_LCD(0x5a),
++ GLAMO_REG_LCD_CURSOR_Y_POS = REG_LCD(0x5c),
++ GLAMO_REG_LCD_CURSOR_PRESET = REG_LCD(0x5e),
++ GLAMO_REG_LCD_CURSOR_FG_COLOR = REG_LCD(0x60),
++ /* RES */
++ GLAMO_REG_LCD_CURSOR_BG_COLOR = REG_LCD(0x64),
++ /* RES */
++ GLAMO_REG_LCD_CURSOR_DST_COLOR = REG_LCD(0x68),
++ /* RES */
++ GLAMO_REG_LCD_STATUS1 = REG_LCD(0x80),
++ GLAMO_REG_LCD_STATUS2 = REG_LCD(0x82),
++ GLAMO_REG_LCD_STATUS3 = REG_LCD(0x84),
++ GLAMO_REG_LCD_STATUS4 = REG_LCD(0x86),
++ /* RES */
++ GLAMO_REG_LCD_COMMAND1 = REG_LCD(0xa0),
++ GLAMO_REG_LCD_COMMAND2 = REG_LCD(0xa2),
++ /* RES */
++ GLAMO_REG_LCD_WFORM_DELAY1 = REG_LCD(0xb0),
++ GLAMO_REG_LCD_WFORM_DELAY2 = REG_LCD(0xb2),
++ /* RES */
++ GLAMO_REG_LCD_GAMMA_CORR = REG_LCD(0x100),
++ /* RES */
++ GLAMO_REG_LCD_GAMMA_R_ENTRY01 = REG_LCD(0x110),
++ GLAMO_REG_LCD_GAMMA_R_ENTRY23 = REG_LCD(0x112),
++ GLAMO_REG_LCD_GAMMA_R_ENTRY45 = REG_LCD(0x114),
++ GLAMO_REG_LCD_GAMMA_R_ENTRY67 = REG_LCD(0x116),
++ GLAMO_REG_LCD_GAMMA_R_ENTRY8 = REG_LCD(0x118),
++ /* RES */
++ GLAMO_REG_LCD_GAMMA_G_ENTRY01 = REG_LCD(0x130),
++ GLAMO_REG_LCD_GAMMA_G_ENTRY23 = REG_LCD(0x132),
++ GLAMO_REG_LCD_GAMMA_G_ENTRY45 = REG_LCD(0x134),
++ GLAMO_REG_LCD_GAMMA_G_ENTRY67 = REG_LCD(0x136),
++ GLAMO_REG_LCD_GAMMA_G_ENTRY8 = REG_LCD(0x138),
++ /* RES */
++ GLAMO_REG_LCD_GAMMA_B_ENTRY01 = REG_LCD(0x150),
++ GLAMO_REG_LCD_GAMMA_B_ENTRY23 = REG_LCD(0x152),
++ GLAMO_REG_LCD_GAMMA_B_ENTRY45 = REG_LCD(0x154),
++ GLAMO_REG_LCD_GAMMA_B_ENTRY67 = REG_LCD(0x156),
++ GLAMO_REG_LCD_GAMMA_B_ENTRY8 = REG_LCD(0x158),
++ /* RES */
++ GLAMO_REG_LCD_SRAM_DRIVING1 = REG_LCD(0x160),
++ GLAMO_REG_LCD_SRAM_DRIVING2 = REG_LCD(0x162),
++ GLAMO_REG_LCD_SRAM_DRIVING3 = REG_LCD(0x164),
++};
++
++enum glamo_reg_lcd_mode1 {
++ GLAMO_LCD_MODE1_PWRSAVE = 0x0001,
++ GLAMO_LCD_MODE1_PARTIAL_PRT = 0x0002,
++ GLAMO_LCD_MODE1_HWFLIP = 0x0004,
++ GLAMO_LCD_MODE1_LCD2 = 0x0008,
++ /* RES */
++ GLAMO_LCD_MODE1_PARTIAL_MODE = 0x0020,
++ GLAMO_LCD_MODE1_CURSOR_DSTCOLOR = 0x0040,
++ GLAMO_LCD_MODE1_PARTIAL_ENABLE = 0x0080,
++ GLAMO_LCD_MODE1_TVCLK_IN_ENABLE = 0x0100,
++ GLAMO_LCD_MODE1_HSYNC_HIGH_ACT = 0x0200,
++ GLAMO_LCD_MODE1_VSYNC_HIGH_ACT = 0x0400,
++ GLAMO_LCD_MODE1_HSYNC_FLIP = 0x0800,
++ GLAMO_LCD_MODE1_GAMMA_COR_EN = 0x1000,
++ GLAMO_LCD_MODE1_DITHER_EN = 0x2000,
++ GLAMO_LCD_MODE1_CURSOR_EN = 0x4000,
++ GLAMO_LCD_MODE1_ROTATE_EN = 0x8000,
++};
++
++enum glamo_reg_lcd_mode2 {
++ GLAMO_LCD_MODE2_CRC_CHECK_EN = 0x0001,
++ GLAMO_LCD_MODE2_DCMD_PER_LINE = 0x0002,
++ GLAMO_LCD_MODE2_NOUSE_BDEF = 0x0004,
++ GLAMO_LCD_MODE2_OUT_POS_MODE = 0x0008,
++ GLAMO_LCD_MODE2_FRATE_CTRL_EN = 0x0010,
++ GLAMO_LCD_MODE2_SINGLE_BUFFER = 0x0020,
++ GLAMO_LCD_MODE2_SER_LSB_TO_MSB = 0x0040,
++ /* FIXME */
++};
++
++enum glamo_reg_lcd_mode3 {
++ /* LCD color source data format */
++ GLAMO_LCD_SRC_RGB565 = 0x0000,
++ GLAMO_LCD_SRC_ARGB1555 = 0x4000,
++ GLAMO_LCD_SRC_ARGB4444 = 0x8000,
++ /* interface type */
++ GLAMO_LCD_MODE3_LCD = 0x1000,
++ GLAMO_LCD_MODE3_RGB = 0x0800,
++ GLAMO_LCD_MODE3_CPU = 0x0000,
++ /* mode */
++ GLAMO_LCD_MODE3_RGB332 = 0x0000,
++ GLAMO_LCD_MODE3_RGB444 = 0x0100,
++ GLAMO_LCD_MODE3_RGB565 = 0x0200,
++ GLAMO_LCD_MODE3_RGB666 = 0x0300,
++ /* depth */
++ GLAMO_LCD_MODE3_6BITS = 0x0000,
++ GLAMO_LCD_MODE3_8BITS = 0x0010,
++ GLAMO_LCD_MODE3_9BITS = 0x0020,
++ GLAMO_LCD_MODE3_16BITS = 0x0030,
++ GLAMO_LCD_MODE3_18BITS = 0x0040,
++};
++
++enum glamo_lcd_rot_mode {
++ GLAMO_LCD_ROT_MODE_0 = 0x0000,
++ GLAMO_LCD_ROT_MODE_180 = 0x2000,
++ GLAMO_LCD_ROT_MODE_MIRROR = 0x4000,
++ GLAMO_LCD_ROT_MODE_FLIP = 0x6000,
++ GLAMO_LCD_ROT_MODE_90 = 0x8000,
++ GLAMO_LCD_ROT_MODE_270 = 0xa000,
++};
++#define GLAMO_LCD_ROT_MODE_MASK 0xe000
++
++enum glamo_lcd_cmd_type {
++ GLAMO_LCD_CMD_TYPE_DISP = 0x0000,
++ GLAMO_LCD_CMD_TYPE_PARALLEL = 0x4000,
++ GLAMO_LCD_CMD_TYPE_SERIAL = 0x8000,
++ GLAMO_LCD_CMD_TYPE_SERIAL_DIRECT= 0xc000,
++};
++#define GLAMO_LCD_CMD_TYPE_MASK 0xc000
++
++enum glamo_lcd_cmds {
++ GLAMO_LCD_CMD_DATA_DISP_FIRE = 0x00,
++ GLAMO_LCD_CMD_DATA_DISP_SYNC = 0x01, /* RGB only */
++ /* switch to command mode, no display */
++ GLAMO_LCD_CMD_DATA_FIRE_NO_DISP = 0x02,
++ /* display until VSYNC, switch to command */
++ GLAMO_LCD_CMD_DATA_FIRE_VSYNC = 0x11,
++ /* display until HSYNC, switch to command */
++ GLAMO_LCD_CMD_DATA_FIRE_HSYNC = 0x12,
++ /* display until VSYNC, 1 black frame, VSYNC, switch to command */
++ GLAMO_LCD_CMD_DATA_FIRE_VSYNC_B = 0x13,
++ /* don't care about display and switch to command */
++ GLAMO_LCD_CMD_DATA_FIRE_FREE = 0x14, /* RGB only */
++ /* don't care about display, keep data display but disable data,
++ * and switch to command */
++ GLAMO_LCD_CMD_DATA_FIRE_FREE_D = 0x15, /* RGB only */
++};
++
++enum glamo_core_revisions {
++ GLAMO_CORE_REV_A0 = 0x0000,
++ GLAMO_CORE_REV_A1 = 0x0001,
++ GLAMO_CORE_REV_A2 = 0x0002,
++ GLAMO_CORE_REV_A3 = 0x0003,
++};
++
++#endif /* _GLAMO_REGS_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mfd/glamo/glamo-spi-gpio.c linux-2.6.29-rc3.owrt.om/drivers/mfd/glamo/glamo-spi-gpio.c
+--- linux-2.6.29-rc3.owrt/drivers/mfd/glamo/glamo-spi-gpio.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/mfd/glamo/glamo-spi-gpio.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,278 @@
++/*
++ * Copyright (C) 2007 Openmoko, Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ *
++ * Smedia Glamo GPIO based SPI driver
++ *
++ * 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.
++ *
++ * This driver currently only implements a minimum subset of the hardware
++ * features, esp. those features that are required to drive the jbt6k74
++ * LCM controller asic in the TD028TTEC1 LCM.
++ *
++*/
++
++#define DEBUG
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++#include <linux/device.h>
++#include <linux/spinlock.h>
++#include <linux/workqueue.h>
++#include <linux/platform_device.h>
++
++#include <linux/spi/spi.h>
++#include <linux/spi/spi_bitbang.h>
++#include <linux/spi/glamo.h>
++
++#include <linux/glamofb.h>
++
++#include <mach/hardware.h>
++
++#include "glamo-core.h"
++#include "glamo-regs.h"
++
++struct glamo_spigpio {
++ struct spi_bitbang bitbang;
++ struct spi_master *master;
++ struct glamo_spigpio_info *info;
++ struct glamo_core *glamo;
++};
++
++static inline struct glamo_spigpio *to_sg(struct spi_device *spi)
++{
++ return dev_get_drvdata(&spi->master->dev);
++}
++
++static inline void setsck(struct spi_device *dev, int on)
++{
++ struct glamo_spigpio *sg = to_sg(dev);
++ glamo_gpio_setpin(sg->glamo, sg->info->pin_clk, on ? 1 : 0);
++}
++
++static inline void setmosi(struct spi_device *dev, int on)
++{
++ struct glamo_spigpio *sg = to_sg(dev);
++ glamo_gpio_setpin(sg->glamo, sg->info->pin_mosi, on ? 1 : 0);
++}
++
++static inline u32 getmiso(struct spi_device *dev)
++{
++ struct glamo_spigpio *sg = to_sg(dev);
++ if (sg->info->pin_miso)
++ return glamo_gpio_getpin(sg->glamo, sg->info->pin_miso) ? 1 : 0;
++ else
++ return 0;
++}
++
++#define spidelay(x) ndelay(x)
++
++#define EXPAND_BITBANG_TXRX
++#include <linux/spi/spi_bitbang.h>
++
++static u32 glamo_spigpio_txrx_mode0(struct spi_device *spi,
++ unsigned nsecs, u32 word, u8 bits)
++{
++ return bitbang_txrx_be_cpha0(spi, nsecs, 0, word, bits);
++}
++
++static u32 glamo_spigpio_txrx_mode1(struct spi_device *spi,
++ unsigned nsecs, u32 word, u8 bits)
++{
++ return bitbang_txrx_be_cpha1(spi, nsecs, 0, word, bits);
++}
++
++static u32 glamo_spigpio_txrx_mode2(struct spi_device *spi,
++ unsigned nsecs, u32 word, u8 bits)
++{
++ return bitbang_txrx_be_cpha0(spi, nsecs, 1, word, bits);
++}
++
++static u32 glamo_spigpio_txrx_mode3(struct spi_device *spi,
++ unsigned nsecs, u32 word, u8 bits)
++{
++ return bitbang_txrx_be_cpha1(spi, nsecs, 1, word, bits);
++}
++
++
++#if 0
++static int glamo_spigpio_setupxfer(struct spi_device *spi,
++ struct spi_transfer *t)
++{
++ struct glamo_spi *gs = to_sg(spi);
++ unsigned int bpw;
++
++ bpw = t ? t->bits_per_word : spi->bits_per_word;
++
++ if (bpw != 9 && bpw != 8) {
++ dev_err(&spi->dev, "invalid bits-per-word (%d)\n", bpw);
++ return -EINVAL;
++ }
++
++ return 0;
++}
++#endif
++
++static void glamo_spigpio_chipsel(struct spi_device *spi, int value)
++{
++ struct glamo_spigpio *gs = to_sg(spi);
++#if 0
++ dev_dbg(&spi->dev, "chipsel %d: spi=%p, gs=%p, info=%p, handle=%p\n",
++ value, spi, gs, gs->info, gs->info->glamo);
++#endif
++ glamo_gpio_setpin(gs->glamo, gs->info->pin_cs, value ? 0 : 1);
++}
++
++
++static int glamo_spigpio_probe(struct platform_device *pdev)
++{
++ struct spi_master *master;
++ struct glamo_spigpio *sp;
++ int ret;
++
++ master = spi_alloc_master(&pdev->dev, sizeof(struct glamo_spigpio));
++ if (master == NULL) {
++ dev_err(&pdev->dev, "failed to allocate spi master\n");
++ ret = -ENOMEM;
++ goto err;
++ }
++
++ sp = spi_master_get_devdata(master);
++ platform_set_drvdata(pdev, sp);
++ sp->info = pdev->dev.platform_data;
++ if (!sp->info) {
++ dev_err(&pdev->dev, "can't operate without platform data\n");
++ ret = -EIO;
++ goto err_no_pdev;
++ }
++
++ master->num_chipselect = 1;
++ master->bus_num = 2; /* FIXME: use dynamic number */
++
++ sp->master = spi_master_get(master);
++ sp->glamo = sp->info->glamo;
++
++ sp->bitbang.master = sp->master;
++ sp->bitbang.chipselect = glamo_spigpio_chipsel;
++ sp->bitbang.txrx_word[SPI_MODE_0] = glamo_spigpio_txrx_mode0;
++ sp->bitbang.txrx_word[SPI_MODE_1] = glamo_spigpio_txrx_mode1;
++ sp->bitbang.txrx_word[SPI_MODE_2] = glamo_spigpio_txrx_mode2;
++ sp->bitbang.txrx_word[SPI_MODE_3] = glamo_spigpio_txrx_mode3;
++
++ /* set state of spi pins */
++ glamo_gpio_setpin(sp->glamo, sp->info->pin_clk, 0);
++ glamo_gpio_setpin(sp->glamo, sp->info->pin_mosi, 0);
++ glamo_gpio_setpin(sp->glamo, sp->info->pin_cs, 1);
++
++ glamo_gpio_cfgpin(sp->glamo, sp->info->pin_clk);
++ glamo_gpio_cfgpin(sp->glamo, sp->info->pin_mosi);
++ glamo_gpio_cfgpin(sp->glamo, sp->info->pin_cs);
++ if (sp->info->pin_miso)
++ glamo_gpio_cfgpin(sp->glamo, sp->info->pin_miso);
++
++ /* bring the LCM panel out of reset if it isn't already */
++
++ glamo_gpio_setpin(sp->glamo, GLAMO_GPIO4, 1);
++ glamo_gpio_cfgpin(sp->glamo, GLAMO_GPIO4_OUTPUT);
++ msleep(90);
++
++#if 0
++ sp->dev = &pdev->dev;
++
++ sp->bitbang.setup_transfer = glamo_spi_setupxfer;
++ sp->bitbang.txrx_bufs = glamo_spi_txrx;
++ sp->bitbang.master->setup = glamo_spi_setup;
++#endif
++
++ dev_set_drvdata(&sp->master->dev, sp);
++
++ ret = spi_bitbang_start(&sp->bitbang);
++ if (ret)
++ goto err_no_bitbang;
++
++ return 0;
++
++err_no_bitbang:
++ platform_set_drvdata(pdev, NULL);
++err_no_pdev:
++ spi_master_put(sp->bitbang.master);
++err:
++ return ret;
++
++}
++
++static int glamo_spigpio_remove(struct platform_device *pdev)
++{
++ struct glamo_spigpio *sp = platform_get_drvdata(pdev);
++
++ spi_bitbang_stop(&sp->bitbang);
++ spi_master_put(sp->bitbang.master);
++
++ return 0;
++}
++
++/*#define glamo_spigpio_suspend NULL
++#define glamo_spigpio_resume NULL
++*/
++
++
++#ifdef CONFIG_PM
++static int glamo_spigpio_suspend(struct platform_device *pdev, pm_message_t state)
++{
++ return 0;
++}
++
++static int glamo_spigpio_resume(struct platform_device *pdev)
++{
++ struct glamo_spigpio *sp = platform_get_drvdata(pdev);
++
++ if (!sp)
++ return 0;
++
++ /* set state of spi pins */
++ glamo_gpio_setpin(sp->glamo, sp->info->pin_clk, 0);
++ glamo_gpio_setpin(sp->glamo, sp->info->pin_mosi, 0);
++ glamo_gpio_setpin(sp->glamo, sp->info->pin_cs, 1);
++
++ glamo_gpio_cfgpin(sp->glamo, sp->info->pin_clk);
++ glamo_gpio_cfgpin(sp->glamo, sp->info->pin_mosi);
++ glamo_gpio_cfgpin(sp->glamo, sp->info->pin_cs);
++ if (sp->info->pin_miso)
++ glamo_gpio_cfgpin(sp->glamo, sp->info->pin_miso);
++
++ return 0;
++}
++#endif
++
++static struct platform_driver glamo_spi_drv = {
++ .probe = glamo_spigpio_probe,
++ .remove = glamo_spigpio_remove,
++#ifdef CONFIG_PM
++ .suspend_late = glamo_spigpio_suspend,
++ .resume_early = glamo_spigpio_resume,
++#endif
++ .driver = {
++ .name = "glamo-spi-gpio",
++ .owner = THIS_MODULE,
++ },
++};
++
++static int __init glamo_spi_init(void)
++{
++ return platform_driver_register(&glamo_spi_drv);
++}
++
++static void __exit glamo_spi_exit(void)
++{
++ platform_driver_unregister(&glamo_spi_drv);
++}
++
++module_init(glamo_spi_init);
++module_exit(glamo_spi_exit);
++
++MODULE_DESCRIPTION("Smedia Glamo 336x/337x LCM serial command SPI Driver");
++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>")
++MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mfd/glamo/Kconfig linux-2.6.29-rc3.owrt.om/drivers/mfd/glamo/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/mfd/glamo/Kconfig 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/mfd/glamo/Kconfig 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,57 @@
++config MFD_GLAMO
++ bool "Smedia Glamo 336x/337x support"
++ help
++ This enables the core driver for the Smedia Glamo 336x/337x
++ multi-function device. It includes irq_chip demultiplex as
++ well as clock / power management and GPIO support.
++
++config MFD_GLAMO_FB
++ tristate "Smedia Glamo 336x/337x framebuffer support"
++ depends on FB && MFD_GLAMO
++ select FB_CFB_FILLRECT
++ select FB_CFB_COPYAREA
++ select FB_CFB_IMAGEBLIT
++ help
++ Frame buffer driver for the LCD controller in the Smedia Glamo
++ 336x/337x.
++
++ This driver is also available as a module ( = code which can be
++ inserted and removed from the running kernel whenever you want). The
++ module will be called glamofb. If you want to compile it as a module,
++ say M here and read <file:Documentation/modules.txt>.
++
++ If unsure, say N.
++
++config MFD_GLAMO_FB_XGLAMO_WORKAROUND
++ bool "Smedia Glamo 336x/337x Xglamo rotation workaround"
++ depends on MFD_GLAMO_FB
++ help
++ This is a workaround for a Xglamo bug. This should be fixed
++ in Xglamo and not in kernel space.
++
++ If unsure, say N.
++
++
++config MFD_GLAMO_SPI_GPIO
++ tristate "Glamo GPIO SPI bitbang support"
++ depends on MFD_GLAMO
++ help
++ Enable a bitbanging SPI adapter driver for the Smedia Glamo.
++
++config MFD_GLAMO_SPI_FB
++ tristate "Glamo LCM control channel SPI support"
++ depends on MFD_GLAMO_FB
++ help
++ Enable a bitbanging SPI adapter driver for the Smedia Glamo LCM
++ control channel. This SPI interface is frequently used to
++ interconnect the LCM control interface.
++
++config MFD_GLAMO_MCI
++ tristate "Glamo S3C SD/MMC Card Interface support"
++ depends on MFD_GLAMO && MMC
++ help
++ This selects a driver for the MCI interface found in
++ the S-Media GLAMO chip, as used in Openmoko
++ neo1973 GTA-02.
++
++ If unsure, say N.
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mfd/glamo/Makefile linux-2.6.29-rc3.owrt.om/drivers/mfd/glamo/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/mfd/glamo/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/mfd/glamo/Makefile 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,12 @@
++#
++# Makefile for the Smedia Glamo framebuffer driver
++#
++
++obj-$(CONFIG_MFD_GLAMO) += glamo-core.o glamo-gpio.o
++obj-$(CONFIG_MFD_GLAMO_SPI) += glamo-spi.o
++obj-$(CONFIG_MFD_GLAMO_SPI_GPIO) += glamo-spi-gpio.o
++
++obj-$(CONFIG_MFD_GLAMO_FB) += glamo-fb.o
++obj-$(CONFIG_MFD_GLAMO_SPI_FB) += glamo-lcm-spi.o
++obj-$(CONFIG_MFD_GLAMO_MCI) += glamo-mci.o
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mfd/Kconfig linux-2.6.29-rc3.owrt.om/drivers/mfd/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/mfd/Kconfig 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/mfd/Kconfig 2009-05-10 22:28:00.000000000 +0200
+@@ -240,6 +240,33 @@
+ Say yes here if you want to include support GPIO for pins on
+ the PCF50633 chip.
+
++
++config MFD_PCF50606
++ tristate "Support for NXP PCF50606"
++ depends on I2C
++ help
++ Say yes here if you have NXP PCF50606 chip on your board.
++ This core driver provides register access and IRQ handling
++ facilities, and registers devices for the various functions
++ so that function-specific drivers can bind to them.
++
++config PCF50606_ADC
++ tristate "Support for NXP PCF50606 ADC"
++ depends on MFD_PCF50606
++ help
++ Say yes here if you want to include support for ADC in the
++ NXP PCF50606 chip.
++
++config PCF50606_GPO
++ tristate "Support for NXP PCF50606 GPO"
++ depends on MFD_PCF50606
++ help
++ Say yes here if you want to include support GPO for pins on
++ the PCF50606 chip.
++
++
++source "drivers/mfd/glamo/Kconfig"
++
+ endmenu
+
+ menu "Multimedia Capabilities Port drivers"
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mfd/Makefile linux-2.6.29-rc3.owrt.om/drivers/mfd/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/mfd/Makefile 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/mfd/Makefile 2009-05-10 22:28:00.000000000 +0200
+@@ -4,6 +4,7 @@
+
+ obj-$(CONFIG_MFD_SM501) += sm501.o
+ obj-$(CONFIG_MFD_ASIC3) += asic3.o
++obj-$(CONFIG_MFD_GLAMO) += glamo/
+
+ obj-$(CONFIG_HTC_EGPIO) += htc-egpio.o
+ obj-$(CONFIG_HTC_PASIC3) += htc-pasic3.o
+@@ -40,4 +41,8 @@
+
+ obj-$(CONFIG_MFD_PCF50633) += pcf50633-core.o
+ obj-$(CONFIG_PCF50633_ADC) += pcf50633-adc.o
+-obj-$(CONFIG_PCF50633_GPIO) += pcf50633-gpio.o
+\ No newline at end of file
++obj-$(CONFIG_PCF50633_GPIO) += pcf50633-gpio.o
++
++obj-$(CONFIG_MFD_PCF50606) += pcf50606-core.o
++obj-$(CONFIG_PCF50606_ADC) += pcf50606-adc.o
++obj-$(CONFIG_PCF50606_GPO) += pcf50606-gpo.o
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mfd/pcf50606-adc.c linux-2.6.29-rc3.owrt.om/drivers/mfd/pcf50606-adc.c
+--- linux-2.6.29-rc3.owrt/drivers/mfd/pcf50606-adc.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/mfd/pcf50606-adc.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,279 @@
++/* Philips PCF50606 ADC Driver
++ *
++ * (C) 2006-2008 by Openmoko, Inc.
++ * Author: Balaji Rao <balajirrao@openmoko.org>
++ * All rights reserved.
++ *
++ * Broken down from monstrous PCF50606 driver mainly by
++ * Harald Welte, Andy Green, Werner Almesberger and Matt Hsu
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ *
++ * NOTE: This driver does not yet support subtractive ADC mode, which means
++ * you can do only one measurement per read request.
++ */
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/device.h>
++#include <linux/platform_device.h>
++#include <linux/completion.h>
++
++#include <linux/mfd/pcf50606/core.h>
++#include <linux/mfd/pcf50606/adc.h>
++
++struct pcf50606_adc_request {
++ int mux;
++ int result;
++ void (*callback)(struct pcf50606 *, void *, int);
++ void *callback_param;
++
++ /* Used in case of sync requests */
++ struct completion completion;
++
++};
++
++#define PCF50606_MAX_ADC_FIFO_DEPTH 8
++
++struct pcf50606_adc {
++ struct pcf50606 *pcf;
++
++ /* Private stuff */
++ struct pcf50606_adc_request *queue[PCF50606_MAX_ADC_FIFO_DEPTH];
++ int queue_head;
++ int queue_tail;
++ struct mutex queue_mutex;
++};
++
++static inline struct pcf50606_adc *__to_adc(struct pcf50606 *pcf)
++{
++ return platform_get_drvdata(pcf->adc_pdev);
++}
++
++static void adc_setup(struct pcf50606 *pcf, int channel)
++{
++ channel &= PCF50606_ADCC2_ADCMUX_MASK;
++
++ /* start ADC conversion of selected channel */
++ pcf50606_reg_write(pcf, PCF50606_REG_ADCC2, channel |
++ PCF50606_ADCC2_ADCSTART | PCF50606_ADCC2_RES_10BIT);
++
++}
++
++static void trigger_next_adc_job_if_any(struct pcf50606 *pcf)
++{
++ struct pcf50606_adc *adc = __to_adc(pcf);
++ int head, tail;
++
++ mutex_lock(&adc->queue_mutex);
++
++ head = adc->queue_head;
++ tail = adc->queue_tail;
++
++ if (!adc->queue[head])
++ goto out;
++
++ adc_setup(pcf, adc->queue[head]->mux);
++out:
++ mutex_unlock(&adc->queue_mutex);
++}
++
++static int
++adc_enqueue_request(struct pcf50606 *pcf, struct pcf50606_adc_request *req)
++{
++ struct pcf50606_adc *adc = __to_adc(pcf);
++ int head, tail;
++
++ mutex_lock(&adc->queue_mutex);
++ head = adc->queue_head;
++ tail = adc->queue_tail;
++
++ if (adc->queue[tail]) {
++ mutex_unlock(&adc->queue_mutex);
++ return -EBUSY;
++ }
++
++ adc->queue[tail] = req;
++
++ adc->queue_tail =
++ (tail + 1) & (PCF50606_MAX_ADC_FIFO_DEPTH - 1);
++
++ mutex_unlock(&adc->queue_mutex);
++
++ trigger_next_adc_job_if_any(pcf);
++
++ return 0;
++}
++
++static void
++pcf50606_adc_sync_read_callback(struct pcf50606 *pcf, void *param, int result)
++{
++ struct pcf50606_adc_request *req;
++
++ /*We know here that the passed param is an adc_request object */
++ req = (struct pcf50606_adc_request *)param;
++
++ req->result = result;
++ complete(&req->completion);
++}
++
++int pcf50606_adc_sync_read(struct pcf50606 *pcf, int mux)
++{
++
++ struct pcf50606_adc_request *req;
++ int result;
++
++ /* req is freed when the result is ready, in irq handler*/
++ req = kzalloc(sizeof(*req), GFP_KERNEL);
++ if (!req)
++ return -ENOMEM;
++
++ req->mux = mux;
++ req->callback = pcf50606_adc_sync_read_callback;
++ req->callback_param = req;
++ init_completion(&req->completion);
++
++ adc_enqueue_request(pcf, req);
++
++ if (wait_for_completion_timeout(&req->completion, 5 * HZ) == 5 * HZ) {
++ dev_err(pcf->dev, "ADC read timed out \n");
++ }
++
++ result = req->result;
++
++ return result;
++}
++EXPORT_SYMBOL_GPL(pcf50606_adc_sync_read);
++
++int pcf50606_adc_async_read(struct pcf50606 *pcf, int mux,
++ void (*callback)(struct pcf50606 *, void *, int),
++ void *callback_param)
++{
++ struct pcf50606_adc_request *req;
++
++ /* req is freed when the result is ready, in pcf50606_work*/
++ req = kmalloc(sizeof(*req), GFP_KERNEL);
++ if (!req)
++ return -ENOMEM;
++
++ req->mux = mux;
++ req->callback = callback;
++ req->callback_param = callback_param;
++
++ adc_enqueue_request(pcf, req);
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(pcf50606_adc_async_read);
++
++static int adc_result(struct pcf50606 *pcf)
++{
++ u16 ret = (pcf50606_reg_read(pcf, PCF50606_REG_ADCS1) << 2) |
++ (pcf50606_reg_read(pcf, PCF50606_REG_ADCS2) & 0x03);
++
++ dev_dbg(pcf->dev, "adc result = %d\n", ret);
++
++ return ret;
++}
++
++static void pcf50606_adc_irq(int irq, void *data)
++{
++ struct pcf50606_adc *adc = data;
++ struct pcf50606 *pcf = adc->pcf;
++ struct pcf50606_adc_request *req;
++ int head;
++
++ mutex_lock(&adc->queue_mutex);
++ head = adc->queue_head;
++
++ req = adc->queue[head];
++ if (WARN_ON(!req)) {
++ dev_err(pcf->dev, "pcf50606-adc irq: ADC queue empty!\n");
++ mutex_unlock(&adc->queue_mutex);
++ return;
++ }
++
++ adc->queue[head] = NULL;
++ adc->queue_head = (head + 1) &
++ (PCF50606_MAX_ADC_FIFO_DEPTH - 1);
++
++ mutex_unlock(&adc->queue_mutex);
++
++ req->callback(pcf, req->callback_param, adc_result(pcf));
++ kfree(req);
++
++ trigger_next_adc_job_if_any(pcf);
++}
++
++static int __devinit pcf50606_adc_probe(struct platform_device *pdev)
++{
++ struct pcf50606_subdev_pdata *pdata = pdev->dev.platform_data;
++ struct pcf50606_adc *adc;
++
++ adc = kzalloc(sizeof(*adc), GFP_KERNEL);
++ if (!adc)
++ return -ENOMEM;
++
++ adc->pcf = pdata->pcf;
++ platform_set_drvdata(pdev, adc);
++
++ pcf50606_register_irq(pdata->pcf, PCF50606_IRQ_ADCRDY,
++ pcf50606_adc_irq, adc);
++
++ mutex_init(&adc->queue_mutex);
++
++ return 0;
++}
++
++static int __devexit pcf50606_adc_remove(struct platform_device *pdev)
++{
++ struct pcf50606_adc *adc = platform_get_drvdata(pdev);
++ int i, head;
++
++ pcf50606_free_irq(adc->pcf, PCF50606_IRQ_ADCRDY);
++
++ mutex_lock(&adc->queue_mutex);
++ head = adc->queue_head;
++
++ if (WARN_ON(adc->queue[head]))
++ dev_err(adc->pcf->dev,
++ "adc driver removed with request pending\n");
++
++ for (i = 0; i < PCF50606_MAX_ADC_FIFO_DEPTH; i++)
++ kfree(adc->queue[i]);
++
++ mutex_unlock(&adc->queue_mutex);
++ kfree(adc);
++
++ return 0;
++}
++
++struct platform_driver pcf50606_adc_driver = {
++ .driver = {
++ .name = "pcf50606-adc",
++ },
++ .probe = pcf50606_adc_probe,
++ .remove = __devexit_p(pcf50606_adc_remove),
++};
++
++static int __init pcf50606_adc_init(void)
++{
++ return platform_driver_register(&pcf50606_adc_driver);
++}
++module_init(pcf50606_adc_init);
++
++static void __exit pcf50606_adc_exit(void)
++{
++ platform_driver_unregister(&pcf50606_adc_driver);
++}
++module_exit(pcf50606_adc_exit);
++
++MODULE_AUTHOR("Balaji Rao <balajirrao@openmoko.org>");
++MODULE_DESCRIPTION("PCF50606 adc driver");
++MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:pcf50606-adc");
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mfd/pcf50606-core.c linux-2.6.29-rc3.owrt.om/drivers/mfd/pcf50606-core.c
+--- linux-2.6.29-rc3.owrt/drivers/mfd/pcf50606-core.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/mfd/pcf50606-core.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,680 @@
++/* Philips PCF50606 Power Management Unit (PMU) driver
++ *
++ * (C) 2006-2008 by Openmoko, Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * Matt Hsu <matt@openmoko.org>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ */
++#include <linux/kernel.h>
++#include <linux/device.h>
++#include <linux/sysfs.h>
++#include <linux/device.h>
++#include <linux/module.h>
++#include <linux/types.h>
++#include <linux/interrupt.h>
++#include <linux/workqueue.h>
++#include <linux/platform_device.h>
++#include <linux/i2c.h>
++#include <linux/irq.h>
++#include <linux/device.h>
++#include <linux/module.h>
++
++#include <linux/mfd/pcf50606/core.h>
++
++static int __pcf50606_read(struct pcf50606 *pcf, u8 reg, int num, u8 *data)
++{
++ int ret;
++
++ ret = i2c_smbus_read_i2c_block_data(pcf->i2c_client, reg,
++ num, data);
++ if (ret < 0)
++ dev_err(pcf->dev, "Error reading %d regs at %d\n", num, reg);
++
++ return ret;
++}
++
++static int __pcf50606_write(struct pcf50606 *pcf, u8 reg, int num, u8 *data)
++{
++ int ret;
++
++ ret = i2c_smbus_write_i2c_block_data(pcf->i2c_client, reg,
++ num, data);
++ if (ret < 0)
++ dev_err(pcf->dev, "Error writing %d regs at %d\n", num, reg);
++
++ return ret;
++
++}
++
++/* Read a block of upto 32 regs */
++int pcf50606_read_block(struct pcf50606 *pcf, u8 reg,
++ int nr_regs, u8 *data)
++{
++ int ret;
++
++ mutex_lock(&pcf->lock);
++ ret = __pcf50606_read(pcf, reg, nr_regs, data);
++ mutex_unlock(&pcf->lock);
++
++ return ret;
++}
++EXPORT_SYMBOL_GPL(pcf50606_read_block);
++
++/* Write a block of upto 32 regs */
++int pcf50606_write_block(struct pcf50606 *pcf , u8 reg,
++ int nr_regs, u8 *data)
++{
++ int ret;
++
++ mutex_lock(&pcf->lock);
++ ret = __pcf50606_write(pcf, reg, nr_regs, data);
++ mutex_unlock(&pcf->lock);
++
++ return ret;
++}
++EXPORT_SYMBOL_GPL(pcf50606_write_block);
++
++u8 pcf50606_reg_read(struct pcf50606 *pcf, u8 reg)
++{
++ u8 val;
++
++ mutex_lock(&pcf->lock);
++ __pcf50606_read(pcf, reg, 1, &val);
++ mutex_unlock(&pcf->lock);
++
++ return val;
++}
++EXPORT_SYMBOL_GPL(pcf50606_reg_read);
++
++int pcf50606_reg_write(struct pcf50606 *pcf, u8 reg, u8 val)
++{
++ int ret;
++
++ mutex_lock(&pcf->lock);
++ ret = __pcf50606_write(pcf, reg, 1, &val);
++ mutex_unlock(&pcf->lock);
++
++ return ret;
++}
++EXPORT_SYMBOL_GPL(pcf50606_reg_write);
++
++int pcf50606_reg_set_bit_mask(struct pcf50606 *pcf, u8 reg, u8 mask, u8 val)
++{
++ int ret;
++ u8 tmp;
++
++ val &= mask;
++
++ mutex_lock(&pcf->lock);
++ ret = __pcf50606_read(pcf, reg, 1, &tmp);
++ if (ret < 0)
++ goto out;
++
++ tmp &= ~mask;
++ tmp |= val;
++ ret = __pcf50606_write(pcf, reg, 1, &tmp);
++
++out:
++ mutex_unlock(&pcf->lock);
++
++ return ret;
++}
++EXPORT_SYMBOL_GPL(pcf50606_reg_set_bit_mask);
++
++int pcf50606_reg_clear_bits(struct pcf50606 *pcf, u8 reg, u8 val)
++{
++ int ret;
++ u8 tmp;
++
++ mutex_lock(&pcf->lock);
++ ret = __pcf50606_read(pcf, reg, 1, &tmp);
++ if (ret < 0)
++ goto out;
++
++ tmp &= ~val;
++ ret = __pcf50606_write(pcf, reg, 1, &tmp);
++
++out:
++ mutex_unlock(&pcf->lock);
++
++ return ret;
++}
++EXPORT_SYMBOL_GPL(pcf50606_reg_clear_bits);
++
++/* sysfs attributes */
++static ssize_t show_dump_regs(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ struct pcf50606 *pcf = dev_get_drvdata(dev);
++ u8 dump[16];
++ int n, n1, idx = 0;
++ char *buf1 = buf;
++ static u8 address_no_read[] = { /* must be ascending */
++ PCF50606_REG_INT1,
++ PCF50606_REG_INT2,
++ PCF50606_REG_INT3,
++ 0 /* terminator */
++ };
++
++ for (n = 0; n < 256; n += sizeof(dump)) {
++ for (n1 = 0; n1 < sizeof(dump); n1++)
++ if (n == address_no_read[idx]) {
++ idx++;
++ dump[n1] = 0x00;
++ } else
++ dump[n1] = pcf50606_reg_read(pcf, n + n1);
++
++ hex_dump_to_buffer(dump, sizeof(dump), 16, 1, buf1, 128, 0);
++ buf1 += strlen(buf1);
++ *buf1++ = '\n';
++ *buf1 = '\0';
++ }
++
++ return buf1 - buf;
++}
++static DEVICE_ATTR(dump_regs, 0400, show_dump_regs, NULL);
++
++static ssize_t show_resume_reason(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ struct pcf50606 *pcf = dev_get_drvdata(dev);
++ int n;
++
++ n = sprintf(buf, "%02x%02x%02x\n",
++ pcf->resume_reason[0],
++ pcf->resume_reason[1],
++ pcf->resume_reason[2]);
++
++ return n;
++}
++static DEVICE_ATTR(resume_reason, 0400, show_resume_reason, NULL);
++
++static struct attribute *pcf_sysfs_entries[] = {
++ &dev_attr_dump_regs.attr,
++ &dev_attr_resume_reason.attr,
++ NULL,
++};
++
++static struct attribute_group pcf_attr_group = {
++ .name = NULL, /* put in device directory */
++ .attrs = pcf_sysfs_entries,
++};
++
++int pcf50606_register_irq(struct pcf50606 *pcf, int irq,
++ void (*handler) (int, void *), void *data)
++{
++ if (irq < 0 || irq > PCF50606_NUM_IRQ || !handler)
++ return -EINVAL;
++
++ if (WARN_ON(pcf->irq_handler[irq].handler))
++ return -EBUSY;
++
++ mutex_lock(&pcf->lock);
++ pcf->irq_handler[irq].handler = handler;
++ pcf->irq_handler[irq].data = data;
++ mutex_unlock(&pcf->lock);
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(pcf50606_register_irq);
++
++int pcf50606_free_irq(struct pcf50606 *pcf, int irq)
++{
++ if (irq < 0 || irq > PCF50606_NUM_IRQ)
++ return -EINVAL;
++
++ mutex_lock(&pcf->lock);
++ pcf->irq_handler[irq].handler = NULL;
++ mutex_unlock(&pcf->lock);
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(pcf50606_free_irq);
++
++static int __pcf50606_irq_mask_set(struct pcf50606 *pcf, int irq, u8 mask)
++{
++ u8 reg, bits, tmp;
++ int ret = 0, idx;
++
++ idx = irq >> 3;
++ reg = PCF50606_REG_INT1M + idx;
++ bits = 1 << (irq & 0x07);
++
++ mutex_lock(&pcf->lock);
++
++ if (mask) {
++ ret = __pcf50606_read(pcf, reg, 1, &tmp);
++ if (ret < 0)
++ goto out;
++
++ tmp |= bits;
++
++ ret = __pcf50606_write(pcf, reg, 1, &tmp);
++ if (ret < 0)
++ goto out;
++
++ pcf->mask_regs[idx] &= ~bits;
++ pcf->mask_regs[idx] |= bits;
++ } else {
++ ret = __pcf50606_read(pcf, reg, 1, &tmp);
++ if (ret < 0)
++ goto out;
++
++ tmp &= ~bits;
++
++ ret = __pcf50606_write(pcf, reg, 1, &tmp);
++ if (ret < 0)
++ goto out;
++
++ pcf->mask_regs[idx] &= ~bits;
++ }
++out:
++ mutex_unlock(&pcf->lock);
++
++ return ret;
++}
++
++int pcf50606_irq_mask(struct pcf50606 *pcf, int irq)
++{
++ dev_info(pcf->dev, "Masking IRQ %d\n", irq);
++
++ return __pcf50606_irq_mask_set(pcf, irq, 1);
++}
++EXPORT_SYMBOL_GPL(pcf50606_irq_mask);
++
++int pcf50606_irq_unmask(struct pcf50606 *pcf, int irq)
++{
++ dev_info(pcf->dev, "Unmasking IRQ %d\n", irq);
++
++ return __pcf50606_irq_mask_set(pcf, irq, 0);
++}
++EXPORT_SYMBOL_GPL(pcf50606_irq_unmask);
++
++int pcf50606_irq_mask_get(struct pcf50606 *pcf, int irq)
++{
++ u8 reg, bits;
++
++ reg = (irq / 8);
++ bits = (1 << (irq % 8));
++
++ return pcf->mask_regs[reg] & bits;
++}
++EXPORT_SYMBOL_GPL(pcf50606_irq_mask_get);
++
++static void pcf50606_irq_call_handler(struct pcf50606 *pcf,
++ int irq)
++{
++ if (pcf->irq_handler[irq].handler)
++ pcf->irq_handler[irq].handler(irq, pcf->irq_handler[irq].data);
++}
++
++#define PCF50606_ONKEY1S_TIMEOUT 8
++
++#define PCF50606_REG_MBCS1 0x2c
++
++static void pcf50606_irq_worker(struct work_struct *work)
++{
++ struct pcf50606 *pcf;
++ int ret, i, j;
++ u8 pcf_int[3], chgstat;
++
++ pcf = container_of(work, struct pcf50606, irq_work);
++
++ /* Read the 3 INT regs in one transaction */
++ ret = pcf50606_read_block(pcf, PCF50606_REG_INT1,
++ ARRAY_SIZE(pcf_int), pcf_int);
++ if (ret != ARRAY_SIZE(pcf_int)) {
++ dev_info(pcf->dev, "Error reading INT registers\n");
++
++ /*
++ * If this doesn't ACK the interrupt to the chip, we'll be
++ * called once again as we're level triggered.
++ */
++ goto out;
++ }
++
++ /* We immediately read the charger status. We thus make sure
++ * only of CHGINS/CHGRM interrupt handlers are called */
++ if (pcf_int[1] & (PCF50606_INT2_CHGINS | PCF50606_INT2_CHGRM)) {
++ chgstat = pcf50606_reg_read(pcf, PCF50606_REG_MBCS1);
++ if (chgstat & (0x1 << 4))
++ pcf_int[1] &= ~(1 << PCF50606_INT2_CHGRM);
++ else
++ pcf_int[1] &= ~(1 << PCF50606_INT2_CHGINS);
++ }
++
++ dev_dbg(pcf->dev, "INT1=0x%02x INT2=0x%02x INT3=0x%02x\n",
++ pcf_int[0], pcf_int[1], pcf_int[2]);
++
++ /* Some revisions of the chip don't have a 8s standby mode on
++ * ONKEY1S press. We try to manually do it in such cases. */
++ if (pcf_int[0] & PCF50606_INT1_SECOND && pcf->onkey1s_held) {
++ dev_info(pcf->dev, "ONKEY1S held for %d secs\n",
++ pcf->onkey1s_held);
++ if (pcf->onkey1s_held++ == PCF50606_ONKEY1S_TIMEOUT)
++ if (pcf->pdata->force_shutdown)
++ pcf->pdata->force_shutdown(pcf);
++ }
++
++ if (pcf_int[0] & PCF50606_INT1_ONKEY1S) {
++ dev_info(pcf->dev, "ONKEY1S held\n");
++ pcf->onkey1s_held = 1 ;
++
++ /* Unmask IRQ_SECOND */
++ pcf50606_reg_clear_bits(pcf, PCF50606_REG_INT1M,
++ PCF50606_INT1_SECOND);
++
++ /* Unmask IRQ_ONKEYF */
++ pcf50606_reg_clear_bits(pcf, PCF50606_REG_INT1M,
++ PCF50606_INT1_ONKEYF);
++ }
++
++ if ((pcf_int[0] & PCF50606_INT1_ONKEYR) && pcf->onkey1s_held) {
++ pcf->onkey1s_held = 0;
++
++ /* Mask SECOND and ONKEYF interrupts */
++ if (pcf->mask_regs[0] & PCF50606_INT1_SECOND)
++ pcf50606_reg_set_bit_mask(pcf,
++ PCF50606_REG_INT1M,
++ PCF50606_INT1_SECOND,
++ PCF50606_INT1_SECOND);
++
++ if (pcf->mask_regs[0] & PCF50606_INT1_ONKEYF)
++ pcf50606_reg_set_bit_mask(pcf,
++ PCF50606_REG_INT1M,
++ PCF50606_INT1_ONKEYF,
++ PCF50606_INT1_ONKEYF);
++ }
++
++ /* Have we just resumed ? */
++ if (pcf->is_suspended) {
++
++ pcf->is_suspended = 0;
++
++ /* Set the resume reason filtering out non resumers */
++ for (i = 0; i < ARRAY_SIZE(pcf_int); i++)
++ pcf->resume_reason[i] = pcf_int[i] &
++ pcf->pdata->resumers[i];
++
++ /* Make sure we don't pass on ONKEY events to
++ * userspace now */
++ pcf_int[1] &= ~(PCF50606_INT1_ONKEYR | PCF50606_INT1_ONKEYF);
++ }
++
++ for (i = 0; i < ARRAY_SIZE(pcf_int); i++) {
++ /* Unset masked interrupts */
++ pcf_int[i] &= ~pcf->mask_regs[i];
++
++ for (j = 0; j < 8 ; j++)
++ if (pcf_int[i] & (1 << j))
++ pcf50606_irq_call_handler(pcf, (i * 8) + j);
++ }
++
++out:
++ put_device(pcf->dev);
++ enable_irq(pcf->irq);
++}
++
++static irqreturn_t pcf50606_irq(int irq, void *data)
++{
++ struct pcf50606 *pcf = data;
++
++ get_device(pcf->dev);
++ disable_irq(pcf->irq);
++ schedule_work(&pcf->irq_work);
++
++ return IRQ_HANDLED;
++}
++
++static void
++pcf50606_client_dev_register(struct pcf50606 *pcf, const char *name,
++ struct platform_device **pdev)
++{
++ struct pcf50606_subdev_pdata subdev_pdata;
++ int ret;
++
++ *pdev = platform_device_alloc(name, -1);
++ if (!*pdev) {
++ dev_err(pcf->dev, "Falied to allocate %s\n", name);
++ return;
++ }
++
++ subdev_pdata.pcf = pcf;
++ platform_device_add_data(*pdev, &subdev_pdata, sizeof(subdev_pdata));
++
++ (*pdev)->dev.parent = pcf->dev;
++
++ ret = platform_device_add(*pdev);
++ if (ret) {
++ dev_err(pcf->dev, "Failed to register %s: %d\n", name, ret);
++ platform_device_put(*pdev);
++ *pdev = NULL;
++ }
++}
++
++#ifdef CONFIG_PM
++static int pcf50606_suspend(struct device *dev, pm_message_t state)
++{
++ struct pcf50606 *pcf;
++ int ret, i;
++ u8 res[3];
++
++ pcf = dev_get_drvdata(dev);
++
++ /* Make sure our interrupt handlers are not called
++ * henceforth */
++ disable_irq(pcf->irq);
++
++ /* Make sure that any running IRQ worker has quit */
++ cancel_work_sync(&pcf->irq_work);
++
++ /* Save the masks */
++ ret = pcf50606_read_block(pcf, PCF50606_REG_INT1M,
++ ARRAY_SIZE(pcf->suspend_irq_masks),
++ pcf->suspend_irq_masks);
++ if (ret < 0) {
++ dev_err(pcf->dev, "error saving irq masks\n");
++ goto out;
++ }
++
++ /* Write wakeup irq masks */
++ for (i = 0; i < ARRAY_SIZE(res); i++)
++ res[i] = ~pcf->pdata->resumers[i];
++
++ ret = pcf50606_write_block(pcf, PCF50606_REG_INT1M,
++ ARRAY_SIZE(res), &res[0]);
++ if (ret < 0) {
++ dev_err(pcf->dev, "error writing wakeup irq masks\n");
++ goto out;
++ }
++
++ pcf->is_suspended = 1;
++
++out:
++ return ret;
++}
++
++static int pcf50606_resume(struct device *dev)
++{
++ struct pcf50606 *pcf;
++ int ret;
++
++ pcf = dev_get_drvdata(dev);
++
++ /* Write the saved mask registers */
++ ret = pcf50606_write_block(pcf, PCF50606_REG_INT1M,
++ ARRAY_SIZE(pcf->suspend_irq_masks),
++ pcf->suspend_irq_masks);
++ if (ret < 0)
++ dev_err(pcf->dev, "Error restoring saved suspend masks\n");
++
++ get_device(pcf->dev);
++
++ /*
++ * Clear any pending interrupts and set resume reason if any.
++ * This will leave with enable_irq()
++ */
++ pcf50606_irq_worker(&pcf->irq_work);
++
++ return 0;
++}
++#else
++#define pcf50606_suspend NULL
++#define pcf50606_resume NULL
++#endif
++
++static int pcf50606_probe(struct i2c_client *client,
++ const struct i2c_device_id *ids)
++{
++ struct pcf50606 *pcf;
++ struct pcf50606_platform_data *pdata = client->dev.platform_data;
++ int i, ret = 0;
++ int version, variant;
++
++ pcf = kzalloc(sizeof(*pcf), GFP_KERNEL);
++ if (!pcf)
++ return -ENOMEM;
++
++ pcf->pdata = pdata;
++
++ mutex_init(&pcf->lock);
++
++ i2c_set_clientdata(client, pcf);
++ pcf->dev = &client->dev;
++ pcf->i2c_client = client;
++ pcf->irq = client->irq;
++
++ INIT_WORK(&pcf->irq_work, pcf50606_irq_worker);
++
++ version = pcf50606_reg_read(pcf, 0);
++ variant = pcf50606_reg_read(pcf, 1);
++ if (version < 0 || variant < 0) {
++ dev_err(pcf->dev, "Unable to probe pcf50606\n");
++ ret = -ENODEV;
++ goto err;
++ }
++
++ dev_info(pcf->dev, "Probed device version %d variant %d\n",
++ version, variant);
++ /* Enable all inteerupts except RTC SECOND */
++ pcf->mask_regs[0] = 0x40;
++ pcf50606_reg_write(pcf, PCF50606_REG_INT1M, pcf->mask_regs[0]);
++ pcf50606_reg_write(pcf, PCF50606_REG_INT2M, 0x00);
++ pcf50606_reg_write(pcf, PCF50606_REG_INT3M, 0x00);
++
++ pcf50606_client_dev_register(pcf, "pcf50606-input",
++ &pcf->input_pdev);
++ pcf50606_client_dev_register(pcf, "pcf50606-rtc",
++ &pcf->rtc_pdev);
++ pcf50606_client_dev_register(pcf, "pcf50606-mbc",
++ &pcf->mbc_pdev);
++ pcf50606_client_dev_register(pcf, "pcf50606-adc",
++ &pcf->adc_pdev);
++ pcf50606_client_dev_register(pcf, "pcf50606-wdt",
++ &pcf->wdt_pdev);
++ for (i = 0; i < PCF50606_NUM_REGULATORS; i++) {
++ struct platform_device *pdev;
++
++ pdev = platform_device_alloc("pcf50606-regltr", i);
++ if (!pdev) {
++ dev_err(pcf->dev, "Cannot create regulator\n");
++ continue;
++ }
++
++ pdev->dev.parent = pcf->dev;
++ pdev->dev.platform_data = &pdata->reg_init_data[i];
++ pdev->dev.driver_data = pcf;
++ pcf->regulator_pdev[i] = pdev;
++
++ platform_device_add(pdev);
++ }
++
++ if (client->irq) {
++ set_irq_handler(client->irq, handle_level_irq);
++ ret = request_irq(client->irq, pcf50606_irq,
++ IRQF_TRIGGER_LOW, "pcf50606", pcf);
++
++ if (ret) {
++ dev_err(pcf->dev, "Failed to request IRQ %d\n", ret);
++ goto err;
++ }
++ } else {
++ dev_err(pcf->dev, "No IRQ configured\n");
++ goto err;
++ }
++
++ if (enable_irq_wake(client->irq) < 0)
++ dev_err(pcf->dev, "IRQ %u cannot be enabled as wake-up source"
++ "in this hardware revision", client->irq);
++
++ ret = sysfs_create_group(&client->dev.kobj, &pcf_attr_group);
++ if (ret)
++ dev_err(pcf->dev, "error creating sysfs entries\n");
++
++ if (pdata->probe_done)
++ pdata->probe_done(pcf);
++
++ return 0;
++
++err:
++ kfree(pcf);
++ return ret;
++}
++
++static int pcf50606_remove(struct i2c_client *client)
++{
++ struct pcf50606 *pcf = i2c_get_clientdata(client);
++ int i;
++
++ free_irq(pcf->irq, pcf);
++
++ platform_device_unregister(pcf->input_pdev);
++ platform_device_unregister(pcf->rtc_pdev);
++ platform_device_unregister(pcf->mbc_pdev);
++ platform_device_unregister(pcf->adc_pdev);
++
++ for (i = 0; i < PCF50606_NUM_REGULATORS; i++)
++ platform_device_unregister(pcf->regulator_pdev[i]);
++
++ kfree(pcf);
++
++ return 0;
++}
++
++static struct i2c_device_id pcf50606_id_table[] = {
++ {"pcf50606", 0x08},
++};
++
++static struct i2c_driver pcf50606_driver = {
++ .driver = {
++ .name = "pcf50606",
++ .suspend = pcf50606_suspend,
++ .resume = pcf50606_resume,
++ },
++ .id_table = pcf50606_id_table,
++ .probe = pcf50606_probe,
++ .remove = pcf50606_remove,
++};
++
++static int __init pcf50606_init(void)
++{
++ return i2c_add_driver(&pcf50606_driver);
++}
++
++static void pcf50606_exit(void)
++{
++ i2c_del_driver(&pcf50606_driver);
++}
++
++MODULE_DESCRIPTION("I2C chip driver for NXP PCF50606 PMU");
++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
++MODULE_LICENSE("GPL");
++
++module_init(pcf50606_init);
++module_exit(pcf50606_exit);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mfd/pcf50606-gpo.c linux-2.6.29-rc3.owrt.om/drivers/mfd/pcf50606-gpo.c
+--- linux-2.6.29-rc3.owrt/drivers/mfd/pcf50606-gpo.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/mfd/pcf50606-gpo.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,119 @@
++/* Philips PCF50606 GPO Driver
++ *
++ * (C) 2006-2008 by Openmoko, Inc.
++ * Author: Balaji Rao <balajirrao@openmoko.org>
++ * All rights reserved.
++ *
++ * Broken down from monstrous PCF50606 driver mainly by
++ * Harald Welte, Andy Green Werner Almesberger and Matt Hsu
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ */
++
++#include <linux/kernel.h>
++
++#include <linux/mfd/pcf50606/core.h>
++#include <linux/mfd/pcf50606/gpo.h>
++
++void pcf50606_gpo_set_active(struct pcf50606 *pcf, int gpo, int val)
++{
++ u8 reg, value, mask;
++
++ reg = gpo;
++ value = val;
++ mask = 0x07;
++
++ if (gpo == PCF50606_GPO2) {
++ value = val << 4;
++ mask = 0x07 << 4;
++ }
++ pcf50606_reg_set_bit_mask(pcf, reg, mask, value);
++}
++EXPORT_SYMBOL_GPL(pcf50606_gpo_set_active);
++
++int pcf50606_gpo_get_active(struct pcf50606 *pcf, int gpo)
++{
++ u8 reg, value, shift = 0;
++
++ reg = gpo;
++ if (gpo == PCF50606_GPO2)
++ shift = 4;
++
++ value = pcf50606_reg_read(pcf, reg);
++
++ return (value >> shift) & 0x07;
++}
++EXPORT_SYMBOL_GPL(pcf50606_gpo_get_active);
++
++void pcf50606_gpo_set_standby(struct pcf50606 *pcf, int gpo, int val)
++{
++ u8 reg;
++
++ if (gpo == PCF50606_GPO1 || gpo == PCF50606_GPO2) {
++ dev_err(pcf->dev, "Can't set standby settings for GPO[12]n");
++ return;
++ }
++
++ reg = gpo;
++
++ pcf50606_reg_set_bit_mask(pcf, gpo, 0x07 << 3, val);
++}
++EXPORT_SYMBOL_GPL(pcf50606_gpo_set_standby);
++
++int pcf50606_gpo_get_standby(struct pcf50606 *pcf, int gpo)
++{
++ u8 reg, value;
++
++ if (gpo == PCF50606_GPO1 || gpo == PCF50606_GPO2) {
++ dev_err(pcf->dev, "Can't get standby settings for GPO[12]n");
++ return -EINVAL;
++ }
++
++ reg = gpo;
++ value = pcf50606_reg_read(pcf, reg);
++
++ return (value >> 3) & 0x07;
++}
++EXPORT_SYMBOL_GPL(pcf50606_gpo_get_standby);
++
++void pcf50606_gpo_invert_set(struct pcf50606 *pcf, int gpo, int invert)
++{
++ u8 reg, value, mask;
++
++ reg = gpo;
++ value = !!invert << 6;
++ mask = 0x01 << 6;
++
++ if (gpo == PCF50606_GPO1) {
++ mask = 0x01 << 4;
++ value = !!invert << 4;
++ }
++ else if (gpo == PCF50606_GPO2) {
++ mask = 0x01 << 7;
++ value = !!invert << 7;
++ }
++
++ pcf50606_reg_set_bit_mask(pcf, reg, mask, value);
++}
++EXPORT_SYMBOL_GPL(pcf50606_gpo_invert_set);
++
++int pcf50606_gpo_invert_get(struct pcf50606 *pcf, int gpo)
++{
++ u8 reg, value, shift;
++
++ reg = gpo;
++ shift = 6;
++
++ if (gpo == PCF50606_GPO1)
++ shift = 4;
++ else if (gpo == PCF50606_GPO2)
++ shift = 7;
++
++ value = pcf50606_reg_read(pcf, reg);
++
++ return (value >> shift) & 0x01;
++}
++EXPORT_SYMBOL_GPL(pcf50606_gpo_invert_get);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mfd/pcf50633-core.c linux-2.6.29-rc3.owrt.om/drivers/mfd/pcf50633-core.c
+--- linux-2.6.29-rc3.owrt/drivers/mfd/pcf50633-core.c 2009-05-10 22:08:43.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/mfd/pcf50633-core.c 2009-05-10 22:28:00.000000000 +0200
+@@ -346,6 +346,8 @@
+ goto out;
+ }
+
++ pcf50633_reg_write(pcf, PCF50633_REG_OOCSHDWN, 0x04 ); /* defeat 8s death from lowsys on A5 */
++
+ /* We immediately read the usb and adapter status. We thus make sure
+ * only of USBINS/USBREM IRQ handlers are called */
+ if (pcf_int[0] & (PCF50633_INT1_USBINS | PCF50633_INT1_USBREM)) {
+@@ -445,6 +447,7 @@
+
+ get_device(pcf->dev);
+ disable_irq(pcf->irq);
++
+ schedule_work(&pcf->irq_work);
+
+ return IRQ_HANDLED;
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/misc/Kconfig linux-2.6.29-rc3.owrt.om/drivers/misc/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/misc/Kconfig 2009-05-10 22:08:43.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/misc/Kconfig 2009-05-10 22:28:00.000000000 +0200
+@@ -225,4 +225,10 @@
+ source "drivers/misc/c2port/Kconfig"
+ source "drivers/misc/eeprom/Kconfig"
+
++config MACH_NEO1973
++ bool
++ help
++ Common machine code for Openmoko GTAxx hardware
++
+ endif # MISC_DEVICES
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/misc/Makefile linux-2.6.29-rc3.owrt.om/drivers/misc/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/misc/Makefile 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/misc/Makefile 2009-05-10 22:28:00.000000000 +0200
+@@ -20,3 +20,8 @@
+ obj-$(CONFIG_HP_ILO) += hpilo.o
+ obj-$(CONFIG_C2PORT) += c2port/
+ obj-y += eeprom/
++obj-$(CONFIG_MACH_SMDK6410) += smdk6410-sleeptest.o
++obj-$(CONFIG_MACH_NEO1973) += neo1973_version.o \
++ neo1973_pm_host.o \
++ neo1973_pm_resume_reason.o
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/misc/neo1973_pm_charging_led.c linux-2.6.29-rc3.owrt.om/drivers/misc/neo1973_pm_charging_led.c
+--- linux-2.6.29-rc3.owrt/drivers/misc/neo1973_pm_charging_led.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/misc/neo1973_pm_charging_led.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,106 @@
++/*
++ * Charging LED sysfs for the FIC Neo1973 GSM Phone
++ * (currently only implemented in GTA02 but ready for GTA01 implementation)
++ *
++ * (C) 2008 by Openmoko Inc.
++ * Author: Andy Green <andy@openmoko.com>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License charging_led 2 as
++ * published by the Free Software Foundation
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/platform_device.h>
++
++#include <asm/hardware.h>
++#include <asm/mach-types.h>
++
++#ifdef CONFIG_MACH_NEO1973_GTA02
++#include <asm/arch/gta02.h>
++
++static enum neo1973_charging_led_modes charging_mode;
++
++static char *charging_led_mode_names[] = {
++ "Disabled",
++ "Aux LED",
++ "Power LED"
++};
++
++static ssize_t charging_led_read(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ return sprintf(buf, "0x%03X\n", gta02_get_pcb_revision());
++}
++
++static ssize_t charging_led_read(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ return sprintf(buf, "0x%03X\n", gta02_get_pcb_revision());
++}
++
++
++static DEVICE_ATTR(pcb, 0644, charging_led_read, charging_led_write);
++
++static struct attribute *neo1973_charging_led_sysfs_entries[] = {
++ &dev_attr_pcb.attr,
++ NULL
++};
++
++static struct attribute_group neo1973_charging_led_attr_group = {
++ .name = NULL,
++ .attrs = neo1973_charging_led_sysfs_entries,
++};
++
++static int __init neo1973_charging_led_probe(struct platform_device *pdev)
++{
++ dev_info(&pdev->dev, "starting\n");
++
++ switch (machine_arch_type) {
++#ifdef CONFIG_MACH_NEO1973_GTA01
++ case MACH_TYPE_NEO1973_GTA01:
++ return -EINVAL;
++#endif /* CONFIG_MACH_NEO1973_GTA01 */
++ default:
++ break;
++ }
++
++ return sysfs_create_group(&pdev->dev.kobj,
++ &neo1973_charging_led_attr_group);
++}
++
++static int neo1973_charging_led_remove(struct platform_device *pdev)
++{
++ sysfs_remove_group(&pdev->dev.kobj, &neo1973_charging_led_attr_group);
++ return 0;
++}
++
++static struct platform_driver neo1973_charging_led_driver = {
++ .probe = neo1973_charging_led_probe,
++ .remove = neo1973_charging_led_remove,
++ .driver = {
++ .name = "neo1973-charging-led",
++ },
++};
++
++static int __devinit neo1973_charging_led_init(void)
++{
++ return platform_driver_register(&neo1973_charging_led_driver);
++}
++
++static void neo1973_charging_led_exit(void)
++{
++ platform_driver_unregister(&neo1973_charging_led_driver);
++}
++
++module_init(neo1973_charging_led_init);
++module_exit(neo1973_charging_led_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Andy Green <andy@openmoko.com>");
++MODULE_DESCRIPTION("Neo1973 PCB charging_led");
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/misc/neo1973_pm_host.c linux-2.6.29-rc3.owrt.om/drivers/misc/neo1973_pm_host.c
+--- linux-2.6.29-rc3.owrt/drivers/misc/neo1973_pm_host.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/misc/neo1973_pm_host.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,109 @@
++/*
++ * Bluetooth PM code for the FIC Neo1973 GSM Phone
++ *
++ * (C) 2007 by Openmoko Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * All rights reserved.
++ *
++ * 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
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/platform_device.h>
++
++#include <mach/hardware.h>
++#include <asm/mach-types.h>
++
++#ifdef CONFIG_MACH_NEO1973_GTA02
++#include <mach/gta02.h>
++#include <linux/mfd/pcf50633/gpio.h>
++
++static ssize_t pm_host_read(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ return sprintf(buf, "%d\n",
++ pcf50633_gpio_get(gta02_pcf, PCF50633_GPO)
++ == PCF50633_GPOCFG_GPOSEL_1);
++}
++
++static ssize_t pm_host_write(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ unsigned long on = simple_strtoul(buf, NULL, 10);
++ u8 val;
++
++ if (on)
++ val = PCF50633_GPOCFG_GPOSEL_1;
++ else
++ val = PCF50633_GPOCFG_GPOSEL_0;
++
++
++ pcf50633_gpio_set(gta02_pcf, PCF50633_GPO, val);
++
++ return count;
++}
++
++static DEVICE_ATTR(hostmode, 0644, pm_host_read, pm_host_write);
++
++static struct attribute *neo1973_pm_host_sysfs_entries[] = {
++ &dev_attr_hostmode.attr,
++ NULL
++};
++
++static struct attribute_group neo1973_pm_host_attr_group = {
++ .name = NULL,
++ .attrs = neo1973_pm_host_sysfs_entries,
++};
++
++static int __init neo1973_pm_host_probe(struct platform_device *pdev)
++{
++ dev_info(&pdev->dev, "starting\n");
++
++ switch (machine_arch_type) {
++#ifdef CONFIG_MACH_NEO1973_GTA01
++ case MACH_TYPE_NEO1973_GTA01:
++ return -EINVAL;
++#endif /* CONFIG_MACH_NEO1973_GTA01 */
++ default:
++ break;
++ }
++
++ return sysfs_create_group(&pdev->dev.kobj, &neo1973_pm_host_attr_group);
++}
++
++static int neo1973_pm_host_remove(struct platform_device *pdev)
++{
++ sysfs_remove_group(&pdev->dev.kobj, &neo1973_pm_host_attr_group);
++ return 0;
++}
++
++static struct platform_driver neo1973_pm_host_driver = {
++ .probe = neo1973_pm_host_probe,
++ .remove = neo1973_pm_host_remove,
++ .driver = {
++ .name = "neo1973-pm-host",
++ },
++};
++
++static int __devinit neo1973_pm_host_init(void)
++{
++ return platform_driver_register(&neo1973_pm_host_driver);
++}
++
++static void neo1973_pm_host_exit(void)
++{
++ platform_driver_unregister(&neo1973_pm_host_driver);
++}
++
++module_init(neo1973_pm_host_init);
++module_exit(neo1973_pm_host_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Andy Green <andy@openmoko.com>");
++MODULE_DESCRIPTION("Neo1973 USB Host Power Management");
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/misc/neo1973_pm_resume_reason.c linux-2.6.29-rc3.owrt.om/drivers/misc/neo1973_pm_resume_reason.c
+--- linux-2.6.29-rc3.owrt/drivers/misc/neo1973_pm_resume_reason.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/misc/neo1973_pm_resume_reason.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,147 @@
++/*
++ * Resume reason sysfs for the FIC Neo1973 GSM Phone
++ *
++ * (C) 2008 by Openmoko Inc.
++ * Author: Andy Green <andy@openmoko.com>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License resume_reason 2 as
++ * published by the Free Software Foundation
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/platform_device.h>
++#include <linux/io.h>
++
++#include <mach/hardware.h>
++#include <asm/mach-types.h>
++
++#ifdef CONFIG_MACH_NEO1973_GTA02
++#include <mach/gta02.h>
++#include <linux/mfd/pcf50633/core.h>
++#endif
++
++static unsigned int *gstatus4_mapped;
++static char *resume_reasons[][17] = { { /* GTA01 */
++ "EINT00_NULL",
++ "EINT01_GSM",
++ "EINT02_NULL",
++ "EINT03_NULL",
++ "EINT04_JACK",
++ "EINT05_SDCARD",
++ "EINT06_AUXKEY",
++ "EINT07_HOLDKEY",
++ "EINT08_NULL",
++ "EINT09_NULL",
++ "EINT10_NULL",
++ "EINT11_NULL",
++ "EINT12_NULL",
++ "EINT13_NULL",
++ "EINT14_NULL",
++ "EINT15_NULL",
++ NULL
++}, { /* GTA02 */
++ "EINT00_ACCEL1",
++ "EINT01_GSM",
++ "EINT02_BLUETOOTH",
++ "EINT03_DEBUGBRD",
++ "EINT04_JACK",
++ "EINT05_WLAN",
++ "EINT06_AUXKEY",
++ "EINT07_HOLDKEY",
++ "EINT08_ACCEL2",
++ "EINT09_PMU",
++ "EINT10_NULL",
++ "EINT11_NULL",
++ "EINT12_GLAMO",
++ "EINT13_NULL",
++ "EINT14_NULL",
++ "EINT15_NULL",
++ NULL
++} };
++
++static ssize_t resume_reason_read(struct device *dev,
++ struct device_attribute *attr,
++ char *buf)
++{
++ int bit = 0;
++ char *end = buf;
++ int gta = !!machine_is_neo1973_gta02();
++
++ for (bit = 0; resume_reasons[gta][bit]; bit++) {
++ if ((*gstatus4_mapped) & (1 << bit))
++ end += sprintf(end, "* %s\n", resume_reasons[gta][bit]);
++ else
++ end += sprintf(end, " %s\n", resume_reasons[gta][bit]);
++
++#ifdef CONFIG_MACH_NEO1973_GTA02
++ if ((gta) && (bit == 9)); /* PMU */
++// end += pcf50633_report_resumers(gta02_pcf_pdata.pcf, end);
++#endif
++ }
++
++ return end - buf;
++}
++
++
++static DEVICE_ATTR(resume_reason, 0644, resume_reason_read, NULL);
++
++static struct attribute *neo1973_resume_reason_sysfs_entries[] = {
++ &dev_attr_resume_reason.attr,
++ NULL
++};
++
++static struct attribute_group neo1973_resume_reason_attr_group = {
++ .name = NULL,
++ .attrs = neo1973_resume_reason_sysfs_entries,
++};
++
++static int __init neo1973_resume_reason_probe(struct platform_device *pdev)
++{
++ dev_info(&pdev->dev, "starting\n");
++
++ gstatus4_mapped = ioremap(0x560000BC /* GSTATUS4 */, 0x4);
++ if (!gstatus4_mapped) {
++ dev_err(&pdev->dev, "failed to ioremap() memory region\n");
++ return -EINVAL;
++ }
++
++ return sysfs_create_group(&pdev->dev.kobj,
++ &neo1973_resume_reason_attr_group);
++}
++
++static int neo1973_resume_reason_remove(struct platform_device *pdev)
++{
++ sysfs_remove_group(&pdev->dev.kobj, &neo1973_resume_reason_attr_group);
++ iounmap(gstatus4_mapped);
++ return 0;
++}
++
++static struct platform_driver neo1973_resume_reason_driver = {
++ .probe = neo1973_resume_reason_probe,
++ .remove = neo1973_resume_reason_remove,
++ .driver = {
++ .name = "neo1973-resume",
++ },
++};
++
++static int __devinit neo1973_resume_reason_init(void)
++{
++ return platform_driver_register(&neo1973_resume_reason_driver);
++}
++
++static void neo1973_resume_reason_exit(void)
++{
++ platform_driver_unregister(&neo1973_resume_reason_driver);
++}
++
++module_init(neo1973_resume_reason_init);
++module_exit(neo1973_resume_reason_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Andy Green <andy@openmoko.com>");
++MODULE_DESCRIPTION("Neo1973 resume_reason");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/misc/neo1973_pm_usbhost.c linux-2.6.29-rc3.owrt.om/drivers/misc/neo1973_pm_usbhost.c
+--- linux-2.6.29-rc3.owrt/drivers/misc/neo1973_pm_usbhost.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/misc/neo1973_pm_usbhost.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,132 @@
++/*
++ * Bluetooth PM code for the FIC Neo1973 GSM Phone
++ *
++ * (C) 2007 by OpenMoko Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * All rights reserved.
++ *
++ * 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
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/platform_device.h>
++
++#include <asm/hardware.h>
++#include <asm/mach-types.h>
++
++#ifdef CONFIG_MACH_NEO1973_GTA02
++#include <asm/arch/gta02.h>
++#include <linux/pcf50633.h>
++#endif
++
++static ssize_t pm_usbhost_read(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ return sprintf(buf, "%d\n",
++ pcf50633_gpio_get(pcf50633_global, PCF50633_GPO));
++}
++
++static ssize_t pm_usbhost_write(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ unsigned long on = simple_strtoul(buf, NULL, 10);
++
++ pcf50633_gpio_set(pcf50633_global, PCF50633_GPO, on);
++
++ return count;
++}
++
++static DEVICE_ATTR(hostmode, 0644, pm_usbhost_read, pm_usbhost_write);
++
++#ifdef CONFIG_PM
++static int neo1973_usbhost_suspend(struct platform_device *pdev, pm_message_t state)
++{
++ dev_dbg(&pdev->dev, "suspending\n");
++ /* FIXME: The PMU should save the PMU status, and the GPIO code should
++ * preserve the GPIO level, so there shouldn't be anything left to do
++ * for us, should there? */
++
++ return 0;
++}
++
++static int neo1973_usbhost_resume(struct platform_device *pdev)
++{
++ dev_dbg(&pdev->dev, "resuming\n");
++
++ return 0;
++}
++#else
++#define neo1973_usbhost_suspend NULL
++#define neo1973_usbhost_resume NULL
++#endif
++
++static struct attribute *neo1973_usbhost_sysfs_entries[] = {
++ &dev_attr_hostmode.attr,
++ NULL
++};
++
++static struct attribute_group neo1973_usbhost_attr_group = {
++ .name = NULL,
++ .attrs = neo1973_usbhost_sysfs_entries,
++};
++
++static int __init neo1973_usbhost_probe(struct platform_device *pdev)
++{
++ dev_info(&pdev->dev, "starting\n");
++
++ switch (machine_arch_type) {
++
++#ifdef CONFIG_MACH_NEO1973_GTA01
++ case MACH_TYPE_NEO1973_GTA01:
++ return -EINVAL;
++#endif /* CONFIG_MACH_NEO1973_GTA01 */
++
++#ifdef CONFIG_MACH_NEO1973_GTA02
++ case MACH_TYPE_NEO1973_GTA02:
++/* race */
++/* pcf50633_gpio_set(pcf50633_global, PCF50633_GPO, 0); */
++ break;
++#endif /* CONFIG_MACH_NEO1973_GTA02 */
++ }
++
++ return sysfs_create_group(&pdev->dev.kobj, &neo1973_usbhost_attr_group);
++}
++
++static int neo1973_usbhost_remove(struct platform_device *pdev)
++{
++ sysfs_remove_group(&pdev->dev.kobj, &neo1973_usbhost_attr_group);
++
++ return 0;
++}
++
++static struct platform_driver neo1973_usbhost_driver = {
++ .probe = neo1973_usbhost_probe,
++ .remove = neo1973_usbhost_remove,
++ .suspend = neo1973_usbhost_suspend,
++ .resume = neo1973_usbhost_resume,
++ .driver = {
++ .name = "neo1973-pm-host",
++ },
++};
++
++static int __devinit neo1973_usbhost_init(void)
++{
++ return platform_driver_register(&neo1973_usbhost_driver);
++}
++
++static void neo1973_usbhost_exit(void)
++{
++ platform_driver_unregister(&neo1973_usbhost_driver);
++}
++
++module_init(neo1973_usbhost_init);
++module_exit(neo1973_usbhost_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Andy Green <andy@openmoko.com>");
++MODULE_DESCRIPTION("Neo1973 USB Host Power Management");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/misc/neo1973_version.c linux-2.6.29-rc3.owrt.om/drivers/misc/neo1973_version.c
+--- linux-2.6.29-rc3.owrt/drivers/misc/neo1973_version.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/misc/neo1973_version.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,90 @@
++/*
++ * PCB version sysfs for the FIC Neo1973 GSM Phone
++ *
++ * (C) 2007 by Openmoko Inc.
++ * Author: Andy Green <andy@openmoko.com>
++ * All rights reserved.
++ *
++ * 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
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/platform_device.h>
++
++#include <mach/hardware.h>
++#include <asm/mach-types.h>
++
++#ifdef CONFIG_MACH_NEO1973_GTA02
++#include <mach/gta02.h>
++
++static ssize_t version_read(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ return sprintf(buf, "0x%03X\n", gta02_get_pcb_revision());
++}
++
++
++static DEVICE_ATTR(pcb, 0644, version_read, NULL);
++
++static struct attribute *neo1973_version_sysfs_entries[] = {
++ &dev_attr_pcb.attr,
++ NULL
++};
++
++static struct attribute_group neo1973_version_attr_group = {
++ .name = NULL,
++ .attrs = neo1973_version_sysfs_entries,
++};
++
++static int __init neo1973_version_probe(struct platform_device *pdev)
++{
++ dev_info(&pdev->dev, "starting\n");
++
++ switch (machine_arch_type) {
++#ifdef CONFIG_MACH_NEO1973_GTA01
++ case MACH_TYPE_NEO1973_GTA01:
++ return -EINVAL;
++#endif /* CONFIG_MACH_NEO1973_GTA01 */
++ default:
++ break;
++ }
++
++ return sysfs_create_group(&pdev->dev.kobj, &neo1973_version_attr_group);
++}
++
++static int neo1973_version_remove(struct platform_device *pdev)
++{
++ sysfs_remove_group(&pdev->dev.kobj, &neo1973_version_attr_group);
++ return 0;
++}
++
++static struct platform_driver neo1973_version_driver = {
++ .probe = neo1973_version_probe,
++ .remove = neo1973_version_remove,
++ .driver = {
++ .name = "neo1973-version",
++ },
++};
++
++static int __devinit neo1973_version_init(void)
++{
++ return platform_driver_register(&neo1973_version_driver);
++}
++
++static void neo1973_version_exit(void)
++{
++ platform_driver_unregister(&neo1973_version_driver);
++}
++
++module_init(neo1973_version_init);
++module_exit(neo1973_version_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Andy Green <andy@openmoko.com>");
++MODULE_DESCRIPTION("Neo1973 PCB version");
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/misc/smdk6410-sleeptest.c linux-2.6.29-rc3.owrt.om/drivers/misc/smdk6410-sleeptest.c
+--- linux-2.6.29-rc3.owrt/drivers/misc/smdk6410-sleeptest.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/misc/smdk6410-sleeptest.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,65 @@
++/* linux/drivers/misc/smdk6410-sleeptest.c
++ *
++ * Copyright 2008 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ * http://armlinux.simtec.co.uk/
++ *
++ * 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.
++*/
++
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/gpio.h>
++#include <linux/err.h>
++#include <linux/interrupt.h>
++
++#include <plat/gpio-cfg.h>
++
++static irqreturn_t sleep_action(int irq, void *pw)
++{
++ printk(KERN_INFO "%s: irq %d\n", __func__, irq);
++ return IRQ_HANDLED;
++}
++
++static void sleep_setup(unsigned int irq, unsigned int gpio)
++{
++ int ret;
++
++ WARN_ON(s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)) < 0);
++ WARN_ON(s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP) < 0);
++
++ ret = request_irq(irq, sleep_action, IRQF_TRIGGER_FALLING,
++ "sleep", NULL);
++ if (ret < 0)
++ printk(KERN_ERR "%s: request_irq() failed\n", __func__);
++
++ ret = set_irq_wake(irq, 1);
++ if (ret < 0)
++ printk(KERN_ERR "%s: set_irq_wake() failed\n", __func__);
++}
++
++static void sleep_led(unsigned int gpio)
++{
++// gpio_request(gpio, "sleep led");
++// gpio_direction_output(gpio, 0);
++}
++
++static __init int smdk6410_sleeptest_init(void)
++{
++ sleep_setup(IRQ_EINT(10), S3C64XX_GPN(10));
++// sleep_led(S3C64XX_GPN(15));
++// sleep_led(S3C64XX_GPN(14));
++// sleep_led(S3C64XX_GPN(13));
++// sleep_led(S3C64XX_GPN(12));
++
++ return 0;
++}
++
++module_init(smdk6410_sleeptest_init);
++
++MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>");
++MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mmc/core/core.c linux-2.6.29-rc3.owrt.om/drivers/mmc/core/core.c
+--- linux-2.6.29-rc3.owrt/drivers/mmc/core/core.c 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/mmc/core/core.c 2009-05-10 22:28:00.000000000 +0200
+@@ -58,10 +58,11 @@
+ /*
+ * Internal function. Flush all scheduled work from the MMC work queue.
+ */
+-static void mmc_flush_scheduled_work(void)
++void mmc_flush_scheduled_work(void)
+ {
+ flush_workqueue(workqueue);
+ }
++EXPORT_SYMBOL_GPL(mmc_flush_scheduled_work);
+
+ /**
+ * mmc_request_done - finish processing an MMC request
+@@ -572,7 +573,13 @@
+ */
+ static void mmc_power_up(struct mmc_host *host)
+ {
+- int bit = fls(host->ocr_avail) - 1;
++ int bit;
++
++ /* If ocr is set, we use it */
++ if (host->ocr)
++ bit = ffs(host->ocr) - 1;
++ else
++ bit = fls(host->ocr_avail) - 1;
+
+ host->ios.vdd = bit;
+ if (mmc_host_is_spi(host)) {
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mmc/host/Kconfig linux-2.6.29-rc3.owrt.om/drivers/mmc/host/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/mmc/host/Kconfig 2009-05-10 22:08:43.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/mmc/host/Kconfig 2009-05-10 22:28:00.000000000 +0200
+@@ -48,6 +48,18 @@
+
+ If unsure, say N.
+
++config MMC_SDHCI_S3C
++ tristate "SDHCI support on Samsung S3C SoC"
++ depends on MMC_SDHCI && (PLAT_S3C24XX || PLAT_S3C64XX)
++ help
++ This selects the Secure Digital Host Controller Interface (SDHCI)
++ often referrered to as the HSMMC block in some of the Samsung S3C
++ range of SoC.
++
++ If you have a controller with this interface, say Y or M here.
++
++ If unsure, say N.
++
+ config MMC_RICOH_MMC
+ tristate "Ricoh MMC Controller Disabler (EXPERIMENTAL)"
+ depends on MMC_SDHCI_PCI
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mmc/host/Makefile linux-2.6.29-rc3.owrt.om/drivers/mmc/host/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/mmc/host/Makefile 2009-05-10 22:08:43.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/mmc/host/Makefile 2009-05-10 22:28:00.000000000 +0200
+@@ -11,6 +11,7 @@
+ obj-$(CONFIG_MMC_IMX) += imxmmc.o
+ obj-$(CONFIG_MMC_SDHCI) += sdhci.o
+ obj-$(CONFIG_MMC_SDHCI_PCI) += sdhci-pci.o
++obj-$(CONFIG_MMC_SDHCI_S3C) += sdhci-s3c.o
+ obj-$(CONFIG_MMC_RICOH_MMC) += ricoh_mmc.o
+ obj-$(CONFIG_MMC_WBSD) += wbsd.o
+ obj-$(CONFIG_MMC_AU1X) += au1xmmc.o
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mmc/host/s3cmci.c linux-2.6.29-rc3.owrt.om/drivers/mmc/host/s3cmci.c
+--- linux-2.6.29-rc3.owrt/drivers/mmc/host/s3cmci.c 2009-05-10 22:08:43.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/mmc/host/s3cmci.c 2009-05-10 22:28:00.000000000 +0200
+@@ -2,6 +2,7 @@
+ * linux/drivers/mmc/s3cmci.h - Samsung S3C MCI driver
+ *
+ * Copyright (C) 2004-2006 maintech GmbH, Thomas Kleffel <tk@maintech.de>
++ * Copyright (C) 2007 Harald Welte <laforge@gnumonks.org>
+ *
+ * Current driver maintained by Ben Dooks and Simtec Electronics
+ * Copyright (C) 2008 Simtec Electronics <ben-linux@fluff.org>
+@@ -24,9 +25,18 @@
+
+ #include <mach/regs-sdi.h>
+ #include <mach/regs-gpio.h>
++#include <mach/hardware.h>
+
+ #include <plat/mci.h>
+
++#include <asm/dma.h>
++#include <asm/dma-mapping.h>
++
++#include <asm/io.h>
++#include <mach/regs-gpio.h>
++#include <mach/mci.h>
++#include <mach/dma.h>
++
+ #include "s3cmci.h"
+
+ #define DRIVER_NAME "s3c-mci"
+@@ -47,6 +57,9 @@
+ static const int dbgmap_info = dbg_info | dbg_conf;
+ static const int dbgmap_debug = dbg_err | dbg_debug;
+
++static int f_max = -1; /* override maximum frequency limit */
++static int persist; /* keep interface alive across suspend/resume */
++
+ #define dbg(host, channels, args...) \
+ do { \
+ if (dbgmap_err & channels) \
+@@ -280,8 +293,11 @@
+ * an even multiple of 4. */
+ if (fifo >= host->pio_bytes)
+ fifo = host->pio_bytes;
+- else
++ else {
+ fifo -= fifo & 3;
++ if (!fifo)
++ break;
++ }
+
+ host->pio_bytes -= fifo;
+ host->pio_count += fifo;
+@@ -353,8 +369,11 @@
+ * words, so round down to an even multiple of 4. */
+ if (fifo >= host->pio_bytes)
+ fifo = host->pio_bytes;
+- else
++ else {
+ fifo -= fifo & 3;
++ if (!fifo)
++ break;
++ }
+
+ host->pio_bytes -= fifo;
+ host->pio_count += fifo;
+@@ -373,7 +392,6 @@
+ {
+ struct s3cmci_host *host = (struct s3cmci_host *) data;
+
+-
+ disable_irq(host->irq);
+
+ if (host->pio_active == XFER_WRITE)
+@@ -614,7 +632,6 @@
+
+ spin_unlock_irqrestore(&host->complete_lock, iflags);
+ return IRQ_HANDLED;
+-
+ }
+
+ /*
+@@ -789,12 +806,11 @@
+
+ last_source = source;
+
+- s3c2410_dma_devconfig(host->dma, source, 3,
++ s3c2410_dma_devconfig(host->dma, source,
+ host->mem->start + host->sdidata);
+
+ if (!setup_ok) {
+- s3c2410_dma_config(host->dma, 4,
+- (S3C2410_DCON_HWTRIG | S3C2410_DCON_CH0_SDI));
++ s3c2410_dma_config(host->dma, 4);
+ s3c2410_dma_set_buffdone_fn(host->dma,
+ s3cmci_dma_done_callback);
+ s3c2410_dma_setflags(host->dma, S3C2410_DMAF_AUTOSTART);
+@@ -1027,6 +1043,7 @@
+ dbg(host, dbg_err, "data prepare error %d\n", res);
+ cmd->error = res;
+ cmd->data->error = res;
++ cmd->data->error = -EIO;
+
+ mmc_request_done(mmc, mrq);
+ return;
+@@ -1264,10 +1281,8 @@
+ host->is2440 = is2440;
+
+ host->pdata = pdev->dev.platform_data;
+- if (!host->pdata) {
+- pdev->dev.platform_data = &s3cmci_def_pdata;
++ if (!host->pdata)
+ host->pdata = &s3cmci_def_pdata;
+- }
+
+ spin_lock_init(&host->complete_lock);
+ tasklet_init(&host->pio_tasklet, pio_tasklet, (unsigned long) host);
+@@ -1380,6 +1395,18 @@
+ mmc->f_min = host->clk_rate / (host->clk_div * 256);
+ mmc->f_max = host->clk_rate / host->clk_div;
+
++ if (f_max >= 0) {
++ unsigned f = f_max;
++
++ if (f < mmc->f_min)
++ f = mmc->f_min;
++ if (mmc->f_max > f) {
++ dev_info(&pdev->dev, "f_max lowered from %u to %u Hz\n",
++ mmc->f_max, f);
++ mmc->f_max = f;
++ }
++ }
++
+ if (host->pdata->ocr_avail)
+ mmc->ocr_avail = host->pdata->ocr_avail;
+
+@@ -1492,18 +1519,60 @@
+
+ #ifdef CONFIG_PM
+
++static int save_regs(struct mmc_host *mmc)
++{
++ struct s3cmci_host *host = mmc_priv(mmc);
++ unsigned long flags;
++ unsigned from;
++ u32 *to = host->saved;
++
++ mmc_flush_scheduled_work();
++
++ local_irq_save(flags);
++ for (from = S3C2410_SDICON; from != S3C2410_SDIIMSK+4; from += 4)
++ if (from != host->sdidata)
++ *to++ = readl(host->base + from);
++ BUG_ON(to-host->saved != ARRAY_SIZE(host->saved));
++ local_irq_restore(flags);
++
++ return 0;
++}
++
++static int restore_regs(struct mmc_host *mmc)
++{
++ struct s3cmci_host *host = mmc_priv(mmc);
++ unsigned long flags;
++ unsigned to;
++ u32 *from = host->saved;
++
++ /*
++ * Before we begin with the necromancy, make sure we don't
++ * inadvertently start something we'll regret microseconds later.
++ */
++ from[S3C2410_SDICMDCON - S3C2410_SDICON] = 0;
++
++ local_irq_save(flags);
++ for (to = S3C2410_SDICON; to != S3C2410_SDIIMSK+4; to += 4)
++ if (to != host->sdidata)
++ writel(*from++, host->base + to);
++ BUG_ON(from-host->saved != ARRAY_SIZE(host->saved));
++ local_irq_restore(flags);
++
++ return 0;
++}
++
+ static int s3cmci_suspend(struct platform_device *dev, pm_message_t state)
+ {
+ struct mmc_host *mmc = platform_get_drvdata(dev);
+
+- return mmc_suspend_host(mmc, state);
++ return persist ? save_regs(mmc) : mmc_suspend_host(mmc, state);
+ }
+
+ static int s3cmci_resume(struct platform_device *dev)
+ {
+ struct mmc_host *mmc = platform_get_drvdata(dev);
+
+- return mmc_resume_host(mmc);
++ return persist ? restore_regs(mmc) : mmc_resume_host(mmc);
+ }
+
+ #else /* CONFIG_PM */
+@@ -1561,9 +1630,13 @@
+ module_init(s3cmci_init);
+ module_exit(s3cmci_exit);
+
++module_param(f_max, int, 0644);
++module_param(persist, int, 0644);
++
+ MODULE_DESCRIPTION("Samsung S3C MMC/SD Card Interface driver");
+ MODULE_LICENSE("GPL v2");
+ MODULE_AUTHOR("Thomas Kleffel <tk@maintech.de>, Ben Dooks <ben-linux@fluff.org>");
+ MODULE_ALIAS("platform:s3c2410-sdi");
+ MODULE_ALIAS("platform:s3c2412-sdi");
+ MODULE_ALIAS("platform:s3c2440-sdi");
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mmc/host/s3cmci.h linux-2.6.29-rc3.owrt.om/drivers/mmc/host/s3cmci.h
+--- linux-2.6.29-rc3.owrt/drivers/mmc/host/s3cmci.h 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/mmc/host/s3cmci.h 2009-05-10 22:28:00.000000000 +0200
+@@ -8,6 +8,10 @@
+ * published by the Free Software Foundation.
+ */
+
++
++#include <mach/regs-sdi.h>
++#include <linux/regulator/consumer.h>
++
+ /* FIXME: DMA Resource management ?! */
+ #define S3CMCI_DMA 0
+
+@@ -68,7 +72,16 @@
+ unsigned int ccnt, dcnt;
+ struct tasklet_struct pio_tasklet;
+
++ /*
++ * Here's where we save the registers during suspend. Note that we skip
++ * SDIDATA, which is at different positions on 2410 and 2440, so
++ * there's no "+1" in the array size.
++ */
++ u32 saved[(S3C2410_SDIIMSK-S3C2410_SDICON)/4];
++
+ #ifdef CONFIG_CPU_FREQ
+ struct notifier_block freq_transition;
+ #endif
++
++ struct regulator *regulator;
+ };
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mmc/host/sdhci.c linux-2.6.29-rc3.owrt.om/drivers/mmc/host/sdhci.c
+--- linux-2.6.29-rc3.owrt/drivers/mmc/host/sdhci.c 2009-05-10 22:08:43.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/mmc/host/sdhci.c 2009-05-10 22:28:00.000000000 +0200
+@@ -78,6 +78,11 @@
+ readl(host->ioaddr + SDHCI_CAPABILITIES),
+ readl(host->ioaddr + SDHCI_MAX_CURRENT));
+
++ if (host->flags & SDHCI_USE_ADMA)
++ printk(KERN_DEBUG DRIVER_NAME ": ADMA Err: 0x%08x | ADMA Ptr: 0x%08x\n",
++ readl(host->ioaddr + SDHCI_ADMA_ERROR),
++ readl(host->ioaddr + SDHCI_ADMA_ADDRESS));
++
+ printk(KERN_DEBUG DRIVER_NAME ": ===========================================\n");
+ }
+
+@@ -736,6 +741,23 @@
+ writew(mode, host->ioaddr + SDHCI_TRANSFER_MODE);
+ }
+
++static void shdci_check_dma_overrun(struct sdhci_host *host, struct mmc_data *data)
++{
++ u32 dma_pos = readl(host->ioaddr + SDHCI_DMA_ADDRESS);
++ u32 dma_start = sg_dma_address(data->sg);
++ u32 dma_end = dma_start + data->sg->length;
++
++ /* Test whether we ended up moving more data than
++ * was originally requested. */
++
++ if (dma_pos <= dma_end)
++ return;
++
++ printk(KERN_ERR "%s: dma overrun, dma %08x, req %08x..%08x\n",
++ mmc_hostname(host->mmc), dma_pos,
++ dma_start, dma_end);
++}
++
+ static void sdhci_finish_data(struct sdhci_host *host)
+ {
+ struct mmc_data *data;
+@@ -749,6 +771,8 @@
+ if (host->flags & SDHCI_USE_ADMA)
+ sdhci_adma_table_post(host, data);
+ else {
++ shdci_check_dma_overrun(host, data);
++
+ dma_unmap_sg(mmc_dev(host->mmc), data->sg,
+ data->sg_len, (data->flags & MMC_DATA_READ) ?
+ DMA_FROM_DEVICE : DMA_TO_DEVICE);
+@@ -888,13 +912,18 @@
+
+ static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
+ {
++ if (clock == host->clock)
++ return;
++
++ host->ops->change_clock(host, clock);
++}
++
++void sdhci_change_clock(struct sdhci_host *host, unsigned int clock)
++{
+ int div;
+ u16 clk;
+ unsigned long timeout;
+
+- if (clock == host->clock)
+- return;
+-
+ writew(0, host->ioaddr + SDHCI_CLOCK_CONTROL);
+
+ if (clock == 0)
+@@ -931,6 +960,8 @@
+ host->clock = clock;
+ }
+
++EXPORT_SYMBOL_GPL(sdhci_set_clock);
++
+ static void sdhci_set_power(struct sdhci_host *host, unsigned short power)
+ {
+ u8 pwr;
+@@ -1004,12 +1035,13 @@
+ #endif
+
+ host->mrq = mrq;
+-
++/*
+ if (!(readl(host->ioaddr + SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT)
+ || (host->flags & SDHCI_DEVICE_DEAD)) {
+ host->mrq->cmd->error = -ENOMEDIUM;
+ tasklet_schedule(&host->finish_tasklet);
+ } else
++*/
+ sdhci_send_command(host, mrq->cmd);
+
+ mmiowb();
+@@ -1038,6 +1070,9 @@
+ sdhci_init(host);
+ }
+
++ if (host->ops->set_ios)
++ host->ops->set_ios(host, ios);
++
+ sdhci_set_clock(host, ios->clock);
+
+ if (ios->power_mode == MMC_POWER_OFF)
+@@ -1141,7 +1176,7 @@
+ host = (struct sdhci_host*)param;
+
+ spin_lock_irqsave(&host->lock, flags);
+-
++/*
+ if (!(readl(host->ioaddr + SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT)) {
+ if (host->mrq) {
+ printk(KERN_ERR "%s: Card removed during transfer!\n",
+@@ -1156,7 +1191,7 @@
+ tasklet_schedule(&host->finish_tasklet);
+ }
+ }
+-
++*/
+ spin_unlock_irqrestore(&host->lock, flags);
+
+ mmc_detect_change(host->mmc, msecs_to_jiffies(200));
+@@ -1288,11 +1323,24 @@
+ * controllers.
+ */
+ if (host->cmd->flags & MMC_RSP_BUSY) {
++ u32 present;
++
+ if (host->cmd->data)
+ DBG("Cannot wait for busy signal when also "
+ "doing a data transfer");
+- else
++ else if (!(host->quirks & SDHCI_QUIRK_NO_TCIRQ_ON_NOT_BUSY))
+ return;
++
++ /* The Samsung SDHCI does not seem to provide an INT_DATA_END
++ * when the system goes non-busy, so check the state of the
++ * transfer by reading SDHCI_PRESENT_STATE to see if the
++ * controller is ready
++ */
++
++ present = readl(host->ioaddr + SDHCI_PRESENT_STATE);
++ DBG("busy? present %08x, intstat %08x\n", present, intmask);
++
++ /* fall through and take the SDHCI_INT_RESPONSE */
+ }
+
+ if (intmask & SDHCI_INT_RESPONSE)
+@@ -1609,17 +1657,23 @@
+ mmc_dev(host->mmc)->dma_mask = &host->dma_mask;
+ }
+
+- host->max_clk =
+- (caps & SDHCI_CLOCK_BASE_MASK) >> SDHCI_CLOCK_BASE_SHIFT;
++ if (host->ops->get_max_clock)
++ host->max_clk = host->ops->get_max_clock(host);
++ else {
++ host->max_clk = (caps & SDHCI_CLOCK_BASE_MASK) >> SDHCI_CLOCK_BASE_SHIFT;
++ host->max_clk *= 1000000;
++ }
+ if (host->max_clk == 0) {
+ printk(KERN_ERR "%s: Hardware doesn't specify base clock "
+ "frequency.\n", mmc_hostname(mmc));
+ return -ENODEV;
+ }
+- host->max_clk *= 1000000;
+
+- host->timeout_clk =
+- (caps & SDHCI_TIMEOUT_CLK_MASK) >> SDHCI_TIMEOUT_CLK_SHIFT;
++ if (host->ops->get_timeout_clock)
++ host->timeout_clk = host->ops->get_timeout_clock(host);
++ else
++ host->timeout_clk =
++ (caps & SDHCI_TIMEOUT_CLK_MASK) >> SDHCI_TIMEOUT_CLK_SHIFT;
+ if (host->timeout_clk == 0) {
+ printk(KERN_ERR "%s: Hardware doesn't specify timeout clock "
+ "frequency.\n", mmc_hostname(mmc));
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mmc/host/sdhci.h linux-2.6.29-rc3.owrt.om/drivers/mmc/host/sdhci.h
+--- linux-2.6.29-rc3.owrt/drivers/mmc/host/sdhci.h 2009-05-10 22:08:43.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/mmc/host/sdhci.h 2009-05-10 22:28:00.000000000 +0200
+@@ -57,6 +57,7 @@
+ #define SDHCI_DATA_AVAILABLE 0x00000800
+ #define SDHCI_CARD_PRESENT 0x00010000
+ #define SDHCI_WRITE_PROTECT 0x00080000
++#define SDHCI_DATA_BIT(x) (1 << ((x) + 20))
+
+ #define SDHCI_HOST_CONTROL 0x28
+ #define SDHCI_CTRL_LED 0x01
+@@ -210,6 +211,8 @@
+ #define SDHCI_QUIRK_BROKEN_SMALL_PIO (1<<13)
+ /* Controller supports high speed but doesn't have the caps bit set */
+ #define SDHCI_QUIRK_FORCE_HIGHSPEED (1<<14)
++/* Controller does not provide transfer-complete interrupt when not busy */
++#define SDHCI_QUIRK_NO_TCIRQ_ON_NOT_BUSY (1<<15)
+
+ int irq; /* Device IRQ */
+ void __iomem * ioaddr; /* Mapped address */
+@@ -267,6 +270,14 @@
+
+ struct sdhci_ops {
+ int (*enable_dma)(struct sdhci_host *host);
++ unsigned int (*get_max_clock)(struct sdhci_host *host);
++ unsigned int (*get_timeout_clock)(struct sdhci_host *host);
++
++ void (*change_clock)(struct sdhci_host *host,
++ unsigned int clock);
++
++ void (*set_ios)(struct sdhci_host *host,
++ struct mmc_ios *ios);
+ };
+
+
+@@ -274,6 +285,8 @@
+ size_t priv_size);
+ extern void sdhci_free_host(struct sdhci_host *host);
+
++extern void sdhci_change_clock(struct sdhci_host *host, unsigned int clock);
++
+ static inline void *sdhci_priv(struct sdhci_host *host)
+ {
+ return (void *)host->private;
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mmc/host/sdhci-pci.c linux-2.6.29-rc3.owrt.om/drivers/mmc/host/sdhci-pci.c
+--- linux-2.6.29-rc3.owrt/drivers/mmc/host/sdhci-pci.c 2009-05-10 22:08:43.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/mmc/host/sdhci-pci.c 2009-05-10 22:28:00.000000000 +0200
+@@ -391,6 +391,7 @@
+
+ static struct sdhci_ops sdhci_pci_ops = {
+ .enable_dma = sdhci_pci_enable_dma,
++ .change_clock = sdhci_change_clock,
+ };
+
+ /*****************************************************************************\
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mmc/host/sdhci-s3c.c linux-2.6.29-rc3.owrt.om/drivers/mmc/host/sdhci-s3c.c
+--- linux-2.6.29-rc3.owrt/drivers/mmc/host/sdhci-s3c.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/mmc/host/sdhci-s3c.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,419 @@
++/* linux/drivers/mmc/host/sdhci-s3c.c
++ *
++ * Copyright 2008 Openmoko Inc.
++ * Copyright 2008 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ * http://armlinux.simtec.co.uk/
++ *
++ * SDHCI (HSMMC) support for Samsung SoC
++ *
++ * 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.
++ */
++
++#include <linux/delay.h>
++#include <linux/dma-mapping.h>
++#include <linux/platform_device.h>
++#include <linux/clk.h>
++#include <linux/io.h>
++
++#include <linux/mmc/host.h>
++
++#include <plat/regs-sdhci.h>
++#include <plat/sdhci.h>
++
++#include "sdhci.h"
++
++#define MAX_BUS_CLK (4)
++
++struct sdhci_s3c {
++ struct sdhci_host *host;
++ struct platform_device *pdev;
++ struct resource *ioarea;
++ struct s3c_sdhci_platdata *pdata;
++ unsigned int cur_clk;
++
++ struct clk *clk_io; /* clock for io bus */
++ struct clk *clk_bus[MAX_BUS_CLK];
++};
++
++static inline struct sdhci_s3c *to_s3c(struct sdhci_host *host)
++{
++ return sdhci_priv(host);
++}
++
++static u32 get_curclk(u32 ctrl2)
++{
++ ctrl2 &= S3C_SDHCI_CTRL2_SELBASECLK_MASK;
++ ctrl2 >>= S3C_SDHCI_CTRL2_SELBASECLK_SHIFT;
++
++ return ctrl2;
++}
++
++static void sdhci_s3c_check_sclk(struct sdhci_host *host)
++{
++ struct sdhci_s3c *ourhost = to_s3c(host);
++ u32 tmp = readl(host->ioaddr + S3C_SDHCI_CONTROL2);
++
++ if (get_curclk(tmp) != ourhost->cur_clk) {
++ dev_dbg(&ourhost->pdev->dev, "restored ctrl2 clock setting\n");
++
++ tmp &= ~S3C_SDHCI_CTRL2_SELBASECLK_MASK;
++ tmp |= ourhost->cur_clk << S3C_SDHCI_CTRL2_SELBASECLK_SHIFT;
++ writel(tmp, host->ioaddr + 0x80);
++ }
++}
++
++static unsigned int sdhci_s3c_get_max_clk(struct sdhci_host *host)
++{
++ struct sdhci_s3c *ourhost = to_s3c(host);
++ struct clk *busclk;
++ unsigned int rate, max;
++ int clk;
++
++ /* note, a reset will reset the clock source */
++
++ sdhci_s3c_check_sclk(host);
++
++ for (max = 0, clk = 0; clk < MAX_BUS_CLK; clk++) {
++ busclk = ourhost->clk_bus[clk];
++ if (!busclk)
++ continue;
++
++ rate = clk_get_rate(busclk);
++ if (rate > max)
++ max = rate;
++ }
++
++ return max;
++}
++
++static unsigned int sdhci_s3c_get_timeout_clk(struct sdhci_host *host)
++{
++ return sdhci_s3c_get_max_clk(host) / 1000000;
++}
++
++static void sdhci_s3c_set_ios(struct sdhci_host *host,
++ struct mmc_ios *ios)
++{
++ struct sdhci_s3c *ourhost = to_s3c(host);
++ struct s3c_sdhci_platdata *pdata = ourhost->pdata;
++ int width;
++
++ sdhci_s3c_check_sclk(host);
++
++ if (ios->power_mode != MMC_POWER_OFF) {
++ switch (ios->bus_width) {
++ case MMC_BUS_WIDTH_4:
++ width = 4;
++ break;
++ case MMC_BUS_WIDTH_1:
++ width = 1;
++ break;
++ default:
++ BUG();
++ }
++
++ if (pdata->cfg_gpio)
++ pdata->cfg_gpio(ourhost->pdev, width);
++ }
++
++ if (pdata->cfg_card)
++ pdata->cfg_card(ourhost->pdev, host->ioaddr,
++ ios, host->mmc->card);
++}
++
++static unsigned int sdhci_s3c_consider_clock(struct sdhci_s3c *ourhost,
++ unsigned int src,
++ unsigned int wanted)
++{
++ unsigned long rate;
++ struct clk *clksrc = ourhost->clk_bus[src];
++ int div;
++
++ if (!clksrc)
++ return UINT_MAX;
++
++ rate = clk_get_rate(clksrc);
++
++ for (div = 1; div < 256; div *= 2) {
++ if ((rate / div) <= wanted)
++ break;
++ }
++
++ dev_dbg(&ourhost->pdev->dev, "clk %d: rate %ld, want %d, got %ld\n",
++ src, rate, wanted, rate / div);
++
++ return (wanted - (rate / div));
++}
++
++static void sdhci_s3c_change_clock(struct sdhci_host *host, unsigned int clock)
++{
++ struct sdhci_s3c *ourhost = to_s3c(host);
++ unsigned int best = UINT_MAX;
++ unsigned int delta;
++ int best_src = 0;
++ int src;
++ u32 ctrl;
++
++ for (src = 0; src < MAX_BUS_CLK; src++) {
++ delta = sdhci_s3c_consider_clock(ourhost, src, clock);
++ if (delta < best) {
++ best = delta;
++ best_src = src;
++ }
++ }
++
++ dev_dbg(&ourhost->pdev->dev,
++ "selected source %d, clock %d, delta %d\n",
++ best_src, clock, best);
++
++ /* turn clock off to card before changing clock source */
++ writew(0, host->ioaddr + SDHCI_CLOCK_CONTROL);
++
++ /* select the new clock source */
++
++ if (ourhost->cur_clk != best_src) {
++ struct clk *clk = ourhost->clk_bus[best_src];
++
++ ourhost->cur_clk = best_src;
++ host->max_clk = clk_get_rate(clk);
++ host->timeout_clk = host->max_clk / 1000000;
++
++ ctrl = readl(host->ioaddr + S3C_SDHCI_CONTROL2);
++ ctrl &= ~S3C_SDHCI_CTRL2_SELBASECLK_MASK;
++ ctrl |= best_src << S3C_SDHCI_CTRL2_SELBASECLK_SHIFT;
++ writel(ctrl, host->ioaddr + S3C_SDHCI_CONTROL2);
++ }
++
++ sdhci_change_clock(host, clock);
++}
++
++static struct sdhci_ops sdhci_s3c_ops = {
++ .get_max_clock = sdhci_s3c_get_max_clk,
++ .get_timeout_clock = sdhci_s3c_get_timeout_clk,
++ .change_clock = sdhci_s3c_change_clock,
++ .set_ios = sdhci_s3c_set_ios,
++};
++
++/*
++ * call this when you need sd stack to recognize insertion or removal of card
++ * that can't be told by SDHCI regs
++ */
++
++void sdhci_s3c_force_presence_change(struct platform_device *pdev)
++{
++ struct s3c_sdhci_platdata *pdata = pdev->dev.platform_data;
++
++ dev_info(&pdev->dev, "sdhci_s3c_force_presence_change called\n");
++ mmc_detect_change(pdata->sdhci_host->mmc, msecs_to_jiffies(200));
++}
++EXPORT_SYMBOL_GPL(sdhci_s3c_force_presence_change);
++
++
++static int __devinit sdhci_s3c_probe(struct platform_device *pdev)
++{
++ struct s3c_sdhci_platdata *pdata = pdev->dev.platform_data;
++ struct device *dev = &pdev->dev;
++ struct sdhci_host *host;
++ struct sdhci_s3c *sc;
++ struct resource *res;
++ int ret, irq, ptr, clks;
++
++ if (!pdata) {
++ dev_err(dev, "no device data specified\n");
++ return -ENOENT;
++ }
++
++ irq = platform_get_irq(pdev, 0);
++ if (irq < 0) {
++ dev_err(dev, "no irq specified\n");
++ return irq;
++ }
++
++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ if (!res) {
++ dev_err(dev, "no memory specified\n");
++ return -ENOENT;
++ }
++
++ host = sdhci_alloc_host(dev, sizeof(struct sdhci_s3c));
++ if (IS_ERR(host)) {
++ dev_err(dev, "sdhci_alloc_host() failed\n");
++ return PTR_ERR(host);
++ }
++
++ pdata->sdhci_host = host;
++
++ sc = sdhci_priv(host);
++
++ sc->host = host;
++ sc->pdev = pdev;
++ sc->pdata = pdata;
++
++ platform_set_drvdata(pdev, host);
++
++ sc->clk_io = clk_get(dev, "hsmmc");
++ if (IS_ERR(sc->clk_io)) {
++ dev_err(dev, "failed to get io clock\n");
++ ret = PTR_ERR(sc->clk_io);
++ goto err_io_clk;
++ }
++
++ /* enable the local io clock and keep it running for the moment. */
++ clk_enable(sc->clk_io);
++
++ for (clks = 0, ptr = 0; ptr < MAX_BUS_CLK; ptr++) {
++ struct clk *clk;
++ char *name = pdata->clocks[ptr];
++
++ if (name == NULL)
++ continue;
++
++ clk = clk_get(dev, name);
++ if (IS_ERR(clk)) {
++ dev_err(dev, "failed to get clock %s\n", name);
++ continue;
++ }
++
++ clks++;
++ sc->clk_bus[ptr] = clk;
++ clk_enable(clk);
++
++ dev_info(dev, "clock source %d: %s (%ld Hz)\n",
++ ptr, name, clk_get_rate(clk));
++ }
++
++ if (clks == 0) {
++ dev_err(dev, "failed to find any bus clocks\n");
++ ret = -ENOENT;
++ goto err_no_busclks;
++ }
++
++ sc->ioarea = request_mem_region(res->start, resource_size(res),
++ mmc_hostname(host->mmc));
++ if (!sc->ioarea) {
++ dev_err(dev, "failed to reserve register area\n");
++ ret = -ENXIO;
++ goto err_req_regs;
++ }
++
++ host->ioaddr = ioremap_nocache(res->start, resource_size(res));
++ if (!host->ioaddr) {
++ dev_err(dev, "failed to map registers\n");
++ ret = -ENXIO;
++ goto err_req_regs;
++ }
++
++ /* Ensure we have minimal gpio selected CMD/CLK/Detect */
++ if (pdata->cfg_gpio)
++ pdata->cfg_gpio(pdev, 0);
++
++ sdhci_s3c_check_sclk(host);
++
++ host->hw_name = "samsung-hsmmc";
++ host->ops = &sdhci_s3c_ops;
++ host->quirks = 0;
++ host->irq = irq;
++
++ /* Setup quirks for the controller */
++
++ /* Currently with ADMA enabled we are getting some length
++ * interrupts that are not being dealt with, do disable
++ * ADMA until this is sorted out. */
++ host->quirks |= SDHCI_QUIRK_BROKEN_ADMA;
++ host->quirks |= SDHCI_QUIRK_32BIT_ADMA_SIZE;
++
++ /* It seems we do not get an DATA transfer complete on non-busy
++ * transfers, not sure if this is a problem with this specific
++ * SDHCI block, or a missing configuration that needs to be set. */
++ host->quirks |= SDHCI_QUIRK_NO_TCIRQ_ON_NOT_BUSY;
++
++ host->quirks |= (SDHCI_QUIRK_32BIT_DMA_ADDR |
++ SDHCI_QUIRK_32BIT_DMA_SIZE);
++
++ ret = sdhci_add_host(host);
++ if (ret) {
++ dev_err(dev, "sdhci_add_host() failed\n");
++ goto err_add_host;
++ }
++
++ return 0;
++
++ err_add_host:
++ release_resource(sc->ioarea);
++ kfree(sc->ioarea);
++
++ err_req_regs:
++ for (ptr = 0; ptr < MAX_BUS_CLK; ptr++) {
++ clk_disable(sc->clk_bus[ptr]);
++ clk_put(sc->clk_bus[ptr]);
++ }
++
++ err_no_busclks:
++ clk_disable(sc->clk_io);
++ clk_put(sc->clk_io);
++
++ err_io_clk:
++ sdhci_free_host(host);
++
++ return ret;
++}
++
++static int __devexit sdhci_s3c_remove(struct platform_device *pdev)
++{
++ return 0;
++}
++
++#ifdef CONFIG_PM
++
++static int sdhci_s3c_suspend(struct platform_device *dev, pm_message_t pm)
++{
++ struct sdhci_host *host = platform_get_drvdata(dev);
++
++ sdhci_suspend_host(host, pm);
++ return 0;
++}
++
++static int sdhci_s3c_resume(struct platform_device *dev)
++{
++ struct sdhci_host *host = platform_get_drvdata(dev);
++
++ sdhci_resume_host(host);
++ return 0;
++}
++
++#else
++#define sdhci_s3c_suspend NULL
++#define sdhci_s3c_resume NULL
++#endif
++
++static struct platform_driver sdhci_s3c_driver = {
++ .probe = sdhci_s3c_probe,
++ .remove = __devexit_p(sdhci_s3c_remove),
++ .suspend = sdhci_s3c_suspend,
++ .resume = sdhci_s3c_resume,
++ .driver = {
++ .owner = THIS_MODULE,
++ .name = "s3c-sdhci",
++ },
++};
++
++static int __init sdhci_s3c_init(void)
++{
++ return platform_driver_register(&sdhci_s3c_driver);
++}
++
++static void __exit sdhci_s3c_exit(void)
++{
++ platform_driver_unregister(&sdhci_s3c_driver);
++}
++
++module_init(sdhci_s3c_init);
++module_exit(sdhci_s3c_exit);
++
++MODULE_DESCRIPTION("Samsung SDHCI (HSMMC) glue");
++MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>");
++MODULE_LICENSE("GPL v2");
++MODULE_ALIAS("platform:s3c-sdhci");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/mtd/nand/s3c2410.c linux-2.6.29-rc3.owrt.om/drivers/mtd/nand/s3c2410.c
+--- linux-2.6.29-rc3.owrt/drivers/mtd/nand/s3c2410.c 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/mtd/nand/s3c2410.c 2009-05-10 22:28:00.000000000 +0200
+@@ -231,8 +231,6 @@
+ BUG();
+ }
+
+- dev_dbg(info->device, "NF_CONF is 0x%lx\n", cfg);
+-
+ local_irq_save(flags);
+
+ cfg = readl(info->regs + S3C2410_NFCONF);
+@@ -240,6 +238,8 @@
+ cfg |= set;
+ writel(cfg, info->regs + S3C2410_NFCONF);
+
++ dev_dbg(info->device, "NF_CONF is 0x%lx\n", cfg);
++
+ local_irq_restore(flags);
+
+ return 0;
+@@ -438,7 +438,7 @@
+ if ((diff0 & ~(1<<fls(diff0))) == 0)
+ return 1;
+
+- return -1;
++ return -EBADMSG;
+ }
+
+ /* ECC functions
+@@ -530,7 +530,12 @@
+ static void s3c2440_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
+ {
+ struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd);
++ u8 *ptr = buf + (len & ~3);
++ int i;
++
+ readsl(info->regs + S3C2440_NFDATA, buf, len / 4);
++ for (i = 0; i != (len & 3); i++)
++ ptr[i] = readb(info->regs + S3C2440_NFDATA);
+ }
+
+ static void s3c2410_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len)
+@@ -645,17 +650,31 @@
+ }
+
+ #ifdef CONFIG_MTD_PARTITIONS
++const char *part_probes[] = { "cmdlinepart", NULL };
+ static int s3c2410_nand_add_partition(struct s3c2410_nand_info *info,
+ struct s3c2410_nand_mtd *mtd,
+ struct s3c2410_nand_set *set)
+ {
++ struct mtd_partition *part_info;
++ int nr_part = 0;
++
+ if (set == NULL)
+ return add_mtd_device(&mtd->mtd);
+
+- if (set->nr_partitions > 0 && set->partitions != NULL) {
+- return add_mtd_partitions(&mtd->mtd, set->partitions, set->nr_partitions);
++ if (set->nr_partitions == 0) {
++ mtd->mtd.name = set->name;
++ nr_part = parse_mtd_partitions(&mtd->mtd, part_probes,
++ &part_info, 0);
++ } else {
++ if (set->nr_partitions > 0 && set->partitions != NULL) {
++ nr_part = set->nr_partitions;
++ part_info = set->partitions;
++ }
+ }
+
++ if (nr_part > 0 && part_info)
++ return add_mtd_partitions(&mtd->mtd, part_info, nr_part);
++
+ return add_mtd_device(&mtd->mtd);
+ }
+ #else
+@@ -684,9 +703,13 @@
+ chip->select_chip = s3c2410_nand_select_chip;
+ chip->chip_delay = 50;
+ chip->priv = nmtd;
+- chip->options = 0;
+ chip->controller = &info->controller;
+
++ if (set->flags & S3C2410_NAND_BBT)
++ chip->options = NAND_USE_FLASH_BBT;
++ else
++ chip->options = 0;
++
+ switch (info->cpu_type) {
+ case TYPE_S3C2410:
+ chip->IO_ADDR_W = regs + S3C2410_NFDATA;
+@@ -726,7 +749,7 @@
+ nmtd->mtd.owner = THIS_MODULE;
+ nmtd->set = set;
+
+- if (hardware_ecc) {
++ if (!info->platform->software_ecc && hardware_ecc) {
+ chip->ecc.calculate = s3c2410_nand_calculate_ecc;
+ chip->ecc.correct = s3c2410_nand_correct_data;
+ chip->ecc.mode = NAND_ECC_HW;
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/net/ppp_deflate.c linux-2.6.29-rc3.owrt.om/drivers/net/ppp_deflate.c
+--- linux-2.6.29-rc3.owrt/drivers/net/ppp_deflate.c 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/net/ppp_deflate.c 2009-05-10 22:28:00.000000000 +0200
+@@ -306,7 +306,7 @@
+
+ if (state) {
+ zlib_inflateEnd(&state->strm);
+- kfree(state->strm.workspace);
++ vfree(state->strm.workspace);
+ kfree(state);
+ }
+ }
+@@ -346,8 +346,7 @@
+
+ state->w_size = w_size;
+ state->strm.next_out = NULL;
+- state->strm.workspace = kmalloc(zlib_inflate_workspacesize(),
+- GFP_KERNEL|__GFP_REPEAT);
++ state->strm.workspace = vmalloc(zlib_inflate_workspacesize());
+ if (state->strm.workspace == NULL)
+ goto out_free;
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/if_sdio.c linux-2.6.29-rc3.owrt.om/drivers/net/wireless/libertas/if_sdio.c
+--- linux-2.6.29-rc3.owrt/drivers/net/wireless/libertas/if_sdio.c 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/net/wireless/libertas/if_sdio.c 2009-05-10 22:28:00.000000000 +0200
+@@ -49,6 +49,7 @@
+
+ static const struct sdio_device_id if_sdio_ids[] = {
+ { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_LIBERTAS) },
++ { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_88W8688) },
+ { /* end: all zeroes */ },
+ };
+
+@@ -73,7 +74,12 @@
+ .helper = "sd8686_helper.bin",
+ .firmware = "sd8686.bin",
+ },
+-};
++ {
++ /* 8688 */
++ .model = 0x10,
++ .helper = "sd8688_helper.bin",
++ .firmware = "sd8688.bin",
++ },};
+
+ struct if_sdio_packet {
+ struct if_sdio_packet *next;
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/pnp/Kconfig linux-2.6.29-rc3.owrt.om/drivers/pnp/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/pnp/Kconfig 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/pnp/Kconfig 2009-05-10 22:28:00.000000000 +0200
+@@ -5,7 +5,7 @@
+ menuconfig PNP
+ bool "Plug and Play support"
+ depends on HAS_IOMEM
+- depends on ISA || ACPI
++ depends on ISA || ACPI || SDIO
+ ---help---
+ Plug and Play (PnP) is a standard for peripherals which allows those
+ peripherals to be configured by software, e.g. assign IRQ's or other
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/pnp/resource.c linux-2.6.29-rc3.owrt.om/drivers/pnp/resource.c
+--- linux-2.6.29-rc3.owrt/drivers/pnp/resource.c 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/pnp/resource.c 2009-05-10 22:28:00.000000000 +0200
+@@ -436,6 +436,7 @@
+ }
+ }
+
++#if 0
+ /* check if the resource is already in use, skip if the
+ * device is active because it itself may be in use */
+ if (!dev->active) {
+@@ -443,6 +444,7 @@
+ return 0;
+ free_dma(*dma);
+ }
++#endif
+
+ /* check for conflicts with other pnp devices */
+ pnp_for_each_dev(tdev) {
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/power/bq27000_battery.c linux-2.6.29-rc3.owrt.om/drivers/power/bq27000_battery.c
+--- linux-2.6.29-rc3.owrt/drivers/power/bq27000_battery.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/power/bq27000_battery.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,474 @@
++/*
++ * Driver for batteries with bq27000 chips inside via HDQ
++ *
++ * Copyright 2008 Openmoko, Inc
++ * Andy Green <andy@openmoko.com>
++ *
++ * based on ds2760 driver, original copyright notice for that --->
++ *
++ * Copyright © 2007 Anton Vorontsov
++ * 2004-2007 Matt Reimer
++ * 2004 Szabolcs Gyurko
++ *
++ * Use consistent with the GNU GPL is permitted,
++ * provided that this copyright notice is
++ * preserved in its entirety in all copies and derived works.
++ *
++ * Author: Anton Vorontsov <cbou@mail.ru>
++ * February 2007
++ *
++ * Matt Reimer <mreimer@vpop.net>
++ * April 2004, 2005, 2007
++ *
++ * Szabolcs Gyurko <szabolcs.gyurko@tlt.hu>
++ * September 2004
++ */
++
++#include <linux/module.h>
++#include <linux/param.h>
++#include <linux/jiffies.h>
++#include <linux/delay.h>
++#include <linux/pm.h>
++#include <linux/workqueue.h>
++#include <linux/platform_device.h>
++#include <linux/power_supply.h>
++#include <linux/bq27000_battery.h>
++
++enum bq27000_regs {
++ /* RAM regs */
++ /* read-write after this */
++ BQ27000_CTRL = 0, /* Device Control Register */
++ BQ27000_MODE, /* Device Mode Register */
++ BQ27000_AR_L, /* At-Rate H L */
++ BQ27000_AR_H,
++ /* read-only after this */
++ BQ27000_ARTTE_L, /* At-Rate Time To Empty H L */
++ BQ27000_ARTTE_H,
++ BQ27000_TEMP_L, /* Reported Temperature H L */
++ BQ27000_TEMP_H,
++ BQ27000_VOLT_L, /* Reported Voltage H L */
++ BQ27000_VOLT_H,
++ BQ27000_FLAGS, /* Status Flags */
++ BQ27000_RSOC, /* Relative State of Charge */
++ BQ27000_NAC_L, /* Nominal Available Capacity H L */
++ BQ27000_NAC_H,
++ BQ27000_CACD_L, /* Discharge Compensated H L */
++ BQ27000_CACD_H,
++ BQ27000_CACT_L, /* Temperature Compensated H L */
++ BQ27000_CACT_H,
++ BQ27000_LMD_L, /* Last measured discharge H L */
++ BQ27000_LMD_H,
++ BQ27000_AI_L, /* Average Current H L */
++ BQ27000_AI_H,
++ BQ27000_TTE_L, /* Time to Empty H L */
++ BQ27000_TTE_H,
++ BQ27000_TTF_L, /* Time to Full H L */
++ BQ27000_TTF_H,
++ BQ27000_SI_L, /* Standby Current H L */
++ BQ27000_SI_H,
++ BQ27000_STTE_L, /* Standby Time To Empty H L */
++ BQ27000_STTE_H,
++ BQ27000_MLI_L, /* Max Load Current H L */
++ BQ27000_MLI_H,
++ BQ27000_MLTTE_L, /* Max Load Time To Empty H L */
++ BQ27000_MLTTE_H,
++ BQ27000_SAE_L, /* Available Energy H L */
++ BQ27000_SAE_H,
++ BQ27000_AP_L, /* Available Power H L */
++ BQ27000_AP_H,
++ BQ27000_TTECP_L, /* Time to Empty at Constant Power H L */
++ BQ27000_TTECP_H,
++ BQ27000_CYCL_L, /* Cycle count since learning cycle H L */
++ BQ27000_CYCL_H,
++ BQ27000_CYCT_L, /* Cycle Count Total H L */
++ BQ27000_CYCT_H,
++ BQ27000_CSOC, /* Compensated State Of Charge */
++ /* EEPROM regs */
++ /* read-write after this */
++ BQ27000_EE_EE_EN = 0x6e, /* EEPROM Program Enable */
++ BQ27000_EE_ILMD = 0x76, /* Initial Last Measured Discharge High Byte */
++ BQ27000_EE_SEDVF, /* Scaled EDVF Threshold */
++ BQ27000_EE_SEDV1, /* Scaled EDV1 Threshold */
++ BQ27000_EE_ISLC, /* Initial Standby Load Current */
++ BQ27000_EE_DMFSD, /* Digital Magnitude Filter and Self Discharge */
++ BQ27000_EE_TAPER, /* Aging Estimate Enable, Charge Termination Taper */
++ BQ27000_EE_PKCFG, /* Pack Configuration Values */
++ BQ27000_EE_IMLC, /* Initial Max Load Current or ID #3 */
++ BQ27000_EE_DCOMP, /* Discharge rate compensation constants or ID #2 */
++ BQ27000_EE_TCOMP, /* Temperature Compensation constants or ID #1 */
++};
++
++enum bq27000_status_flags {
++ BQ27000_STATUS_CHGS = 0x80, /* 1 = being charged */
++ BQ27000_STATUS_NOACT = 0x40, /* 1 = no activity */
++ BQ27000_STATUS_IMIN = 0x20, /* 1 = Lion taper current mode */
++ BQ27000_STATUS_CI = 0x10, /* 1 = capacity likely innacurate */
++ BQ27000_STATUS_CALIP = 0x08, /* 1 = calibration in progress */
++ BQ27000_STATUS_VDQ = 0x04, /* 1 = capacity should be accurate */
++ BQ27000_STATUS_EDV1 = 0x02, /* 1 = end of discharge.. <6% left */
++ BQ27000_STATUS_EDVF = 0x01, /* 1 = no, it's really empty now */
++};
++
++#define NANOVOLTS_UNIT 3750
++
++struct bq27000_bat_regs {
++ int ai;
++ int flags;
++ int lmd;
++ int rsoc;
++ int temp;
++ int tte;
++ int ttf;
++ int volt;
++};
++
++struct bq27000_device_info {
++ struct device *dev;
++ struct power_supply bat;
++ struct power_supply ac;
++ struct power_supply usb;
++ struct delayed_work work;
++ struct bq27000_platform_data *pdata;
++
++ struct bq27000_bat_regs regs;
++};
++
++static unsigned int cache_time = 5000;
++module_param(cache_time, uint, 0644);
++MODULE_PARM_DESC(cache_time, "cache time in milliseconds");
++
++/*
++ * reading 16 bit values over HDQ has a special hazard where the
++ * hdq device firmware can update the 16-bit register during the time we
++ * read the two halves. TI document SLUS556D recommends the algorithm here
++ * to avoid trouble
++ */
++
++static int hdq_read16(struct bq27000_device_info *di, int address)
++{
++ int acc;
++ int high;
++ int retries = 3;
++
++ while (retries--) {
++
++ high = (di->pdata->hdq_read)(address + 1); /* high part */
++
++ if (high < 0)
++ return high;
++ acc = (di->pdata->hdq_read)(address);
++ if (acc < 0)
++ return acc;
++
++ /* confirm high didn't change between reading it and low */
++ if (high == (di->pdata->hdq_read)(address + 1))
++ return (high << 8) | acc;
++ }
++
++ return -ETIME;
++}
++
++static void bq27000_battery_external_power_changed(struct power_supply *psy)
++{
++ struct bq27000_device_info *di = container_of(psy, struct bq27000_device_info, bat);
++
++ dev_dbg(di->dev, "%s\n", __FUNCTION__);
++ schedule_delayed_work(&di->work, 0);
++}
++
++static int bq27000_battery_get_property(struct power_supply *psy,
++ enum power_supply_property psp,
++ union power_supply_propval *val)
++{
++ int n;
++ struct bq27000_device_info *di = container_of(psy, struct bq27000_device_info, bat);
++
++ switch (psp) {
++ case POWER_SUPPLY_PROP_STATUS:
++ val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
++
++ if (!di->pdata->get_charger_online_status)
++ goto use_bat;
++ if ((di->pdata->get_charger_online_status)()) {
++ /*
++ * charger is definitively present
++ * we report our state in terms of what it says it
++ * is doing
++ */
++ if (!di->pdata->get_charger_active_status)
++ goto use_bat;
++
++ if ((di->pdata->get_charger_active_status)()) {
++ val->intval = POWER_SUPPLY_STATUS_CHARGING;
++ break;
++ }
++ val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
++ break;
++ }
++
++ /*
++ * platform provided definite indication of charger presence,
++ * and it is telling us it isn't there... but we are on so we
++ * must be running from battery --->
++ */
++
++ val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
++ break;
++
++use_bat:
++ /*
++ * either the charger is not connected, or the
++ * platform doesn't give info about charger, use battery state
++ * but... battery state can be out of date by 4 seconds or
++ * so... use the platform callbacks if possible.
++ */
++
++ /* no real activity on the battery */
++ if (di->regs.ai < 2) {
++ if (!di->regs.ttf)
++ val->intval = POWER_SUPPLY_STATUS_FULL;
++ else
++ val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
++ break;
++ }
++ /* power is actually going in or out... */
++ if (di->regs.flags < 0)
++ return di->regs.flags;
++ if (di->regs.flags & BQ27000_STATUS_CHGS)
++ val->intval = POWER_SUPPLY_STATUS_CHARGING;
++ else
++ val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
++ break;
++ case POWER_SUPPLY_PROP_HEALTH:
++ val->intval = POWER_SUPPLY_HEALTH_UNKNOWN;
++ /* Do we have accurate readings... */
++ if (di->regs.flags < 0)
++ return di->regs.flags;
++ if (di->regs.flags & BQ27000_STATUS_VDQ)
++ val->intval = POWER_SUPPLY_HEALTH_GOOD;
++ break;
++ case POWER_SUPPLY_PROP_VOLTAGE_NOW:
++ if (di->regs.volt < 0)
++ return di->regs.volt;
++ /* mV -> uV */
++ val->intval = di->regs.volt * 1000;
++ break;
++ case POWER_SUPPLY_PROP_CURRENT_NOW:
++ if (di->regs.flags < 0)
++ return di->regs.flags;
++ if (di->regs.flags & BQ27000_STATUS_CHGS)
++ n = -NANOVOLTS_UNIT;
++ else
++ n = NANOVOLTS_UNIT;
++ if (di->regs.ai < 0)
++ return di->regs.ai;
++ val->intval = (di->regs.ai * n) / di->pdata->rsense_mohms;
++ break;
++ case POWER_SUPPLY_PROP_CHARGE_FULL:
++ if (di->regs.lmd < 0)
++ return di->regs.lmd;
++ val->intval = (di->regs.lmd * 3570) / di->pdata->rsense_mohms;
++ break;
++ case POWER_SUPPLY_PROP_TEMP:
++ if (di->regs.temp < 0)
++ return di->regs.temp;
++ /* K (in 0.25K units) is 273.15 up from C (in 0.1C)*/
++ /* 10926 = 27315 * 4 / 10 */
++ val->intval = (((long)di->regs.temp * 10l) - 10926) / 4;
++ break;
++ case POWER_SUPPLY_PROP_TECHNOLOGY:
++ val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
++ break;
++ case POWER_SUPPLY_PROP_CAPACITY:
++ val->intval = di->regs.rsoc;
++ if (val->intval < 0)
++ return val->intval;
++ break;
++ case POWER_SUPPLY_PROP_PRESENT:
++ val->intval = !(di->regs.rsoc < 0);
++ break;
++ case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW:
++ if (di->regs.tte < 0)
++ return di->regs.tte;
++ val->intval = 60 * di->regs.tte;
++ break;
++ case POWER_SUPPLY_PROP_TIME_TO_FULL_NOW:
++ if (di->regs.ttf < 0)
++ return di->regs.ttf;
++ val->intval = 60 * di->regs.ttf;
++ break;
++ case POWER_SUPPLY_PROP_ONLINE:
++ if (di->pdata->get_charger_online_status)
++ val->intval = (di->pdata->get_charger_online_status)();
++ else
++ return -EINVAL;
++ break;
++ default:
++ return -EINVAL;
++ }
++
++ return 0;
++}
++
++static void bq27000_battery_work(struct work_struct *work)
++{
++ struct bq27000_device_info *di =
++ container_of(work, struct bq27000_device_info, work.work);
++
++ if ((di->pdata->hdq_initialized)()) {
++ struct bq27000_bat_regs regs;
++
++ regs.ai = hdq_read16(di, BQ27000_AI_L);
++ regs.flags = (di->pdata->hdq_read)(BQ27000_FLAGS);
++ regs.lmd = hdq_read16(di, BQ27000_LMD_L);
++ regs.rsoc = (di->pdata->hdq_read)(BQ27000_RSOC);
++ regs.temp = hdq_read16(di, BQ27000_TEMP_L);
++ regs.tte = hdq_read16(di, BQ27000_TTE_L);
++ regs.ttf = hdq_read16(di, BQ27000_TTF_L);
++ regs.volt = hdq_read16(di, BQ27000_VOLT_L);
++
++ if (memcmp (&regs, &di->regs, sizeof(regs)) != 0) {
++ di->regs = regs;
++ power_supply_changed(&di->bat);
++ }
++ }
++
++ if (!schedule_delayed_work(&di->work, cache_time))
++ dev_err(di->dev, "battery service reschedule failed\n");
++}
++
++static enum power_supply_property bq27000_battery_props[] = {
++ POWER_SUPPLY_PROP_STATUS,
++ POWER_SUPPLY_PROP_HEALTH,
++ POWER_SUPPLY_PROP_VOLTAGE_NOW,
++ POWER_SUPPLY_PROP_CURRENT_NOW,
++ POWER_SUPPLY_PROP_CHARGE_FULL,
++ POWER_SUPPLY_PROP_TEMP,
++ POWER_SUPPLY_PROP_TECHNOLOGY,
++ POWER_SUPPLY_PROP_PRESENT,
++ POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
++ POWER_SUPPLY_PROP_TIME_TO_FULL_NOW,
++ POWER_SUPPLY_PROP_CAPACITY,
++ POWER_SUPPLY_PROP_ONLINE
++};
++
++static int bq27000_battery_probe(struct platform_device *pdev)
++{
++ int retval = 0;
++ struct bq27000_device_info *di;
++ struct bq27000_platform_data *pdata;
++
++ dev_info(&pdev->dev, "BQ27000 Battery Driver (C) 2008 Openmoko, Inc\n");
++
++ di = kzalloc(sizeof(*di), GFP_KERNEL);
++ if (!di) {
++ retval = -ENOMEM;
++ goto di_alloc_failed;
++ }
++
++ platform_set_drvdata(pdev, di);
++
++ pdata = pdev->dev.platform_data;
++ di->dev = &pdev->dev;
++ /* di->w1_dev = pdev->dev.parent; */
++ di->bat.name = pdata->name;
++ di->bat.type = POWER_SUPPLY_TYPE_BATTERY;
++ di->bat.properties = bq27000_battery_props;
++ di->bat.num_properties = ARRAY_SIZE(bq27000_battery_props);
++ di->bat.get_property = bq27000_battery_get_property;
++ di->bat.external_power_changed =
++ bq27000_battery_external_power_changed;
++ di->bat.use_for_apm = 1;
++ di->pdata = pdata;
++
++ retval = power_supply_register(&pdev->dev, &di->bat);
++ if (retval) {
++ dev_err(di->dev, "failed to register battery\n");
++ goto batt_failed;
++ }
++
++ INIT_DELAYED_WORK(&di->work, bq27000_battery_work);
++
++ if (!schedule_delayed_work(&di->work, 0))
++ dev_err(di->dev, "failed to schedule bq27000_battery_work\n");
++
++ return 0;
++
++batt_failed:
++ kfree(di);
++di_alloc_failed:
++ return retval;
++}
++
++static int bq27000_battery_remove(struct platform_device *pdev)
++{
++ struct bq27000_device_info *di = platform_get_drvdata(pdev);
++
++ cancel_delayed_work(&di->work);
++
++ power_supply_unregister(&di->bat);
++
++ return 0;
++}
++
++void bq27000_charging_state_change(struct platform_device *pdev)
++{
++ struct bq27000_device_info *di = platform_get_drvdata(pdev);
++
++ if (!di)
++ return;
++}
++EXPORT_SYMBOL_GPL(bq27000_charging_state_change);
++
++#ifdef CONFIG_PM
++
++static int bq27000_battery_suspend(struct platform_device *pdev,
++ pm_message_t state)
++{
++ struct bq27000_device_info *di = platform_get_drvdata(pdev);
++
++ cancel_delayed_work(&di->work);
++ return 0;
++}
++
++static int bq27000_battery_resume(struct platform_device *pdev)
++{
++ struct bq27000_device_info *di = platform_get_drvdata(pdev);
++
++ schedule_delayed_work(&di->work, 0);
++ return 0;
++}
++
++#else
++
++#define bq27000_battery_suspend NULL
++#define bq27000_battery_resume NULL
++
++#endif /* CONFIG_PM */
++
++static struct platform_driver bq27000_battery_driver = {
++ .driver = {
++ .name = "bq27000-battery",
++ },
++ .probe = bq27000_battery_probe,
++ .remove = bq27000_battery_remove,
++ .suspend = bq27000_battery_suspend,
++ .resume = bq27000_battery_resume,
++};
++
++static int __init bq27000_battery_init(void)
++{
++ return platform_driver_register(&bq27000_battery_driver);
++}
++
++static void __exit bq27000_battery_exit(void)
++{
++ platform_driver_unregister(&bq27000_battery_driver);
++}
++
++module_init(bq27000_battery_init);
++module_exit(bq27000_battery_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Andy Green <andy@openmoko.com>");
++MODULE_DESCRIPTION("bq27000 battery driver");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/power/gta01_battery.c linux-2.6.29-rc3.owrt.om/drivers/power/gta01_battery.c
+--- linux-2.6.29-rc3.owrt/drivers/power/gta01_battery.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/power/gta01_battery.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,117 @@
++/*
++ * Dumb driver for gta01 battery
++ *
++ * Copyright 2009 Openmoko, Inc
++ * Balaji Rao <balajirrao@openmoko.org>
++ */
++
++#include <linux/module.h>
++#include <linux/param.h>
++#include <linux/delay.h>
++#include <linux/workqueue.h>
++#include <linux/platform_device.h>
++#include <linux/power_supply.h>
++#include <linux/gta01_battery.h>
++
++struct gta01_battery {
++ struct power_supply psy;
++ struct gta01_bat_platform_data *pdata;
++};
++
++static enum power_supply_property gta01_bat_props[] = {
++ POWER_SUPPLY_PROP_PRESENT,
++ POWER_SUPPLY_PROP_STATUS,
++ POWER_SUPPLY_PROP_VOLTAGE_NOW,
++ POWER_SUPPLY_PROP_CURRENT_NOW,
++};
++
++static int gta01_bat_get_property(struct power_supply *psy,
++ enum power_supply_property psp,
++ union power_supply_propval *val)
++{
++ struct gta01_battery *bat = container_of(psy, struct gta01_battery, psy);
++
++ switch(psp) {
++ case POWER_SUPPLY_PROP_STATUS:
++ if (bat->pdata->get_charging_status())
++ val->intval = POWER_SUPPLY_STATUS_CHARGING;
++ else
++ val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
++ break;
++ case POWER_SUPPLY_PROP_VOLTAGE_NOW:
++ val->intval = bat->pdata->get_voltage();
++ break;
++ case POWER_SUPPLY_PROP_CURRENT_NOW:
++ val->intval = bat->pdata->get_current();
++ break;
++ case POWER_SUPPLY_PROP_PRESENT:
++ val->intval = 1; /* You must never run GTA01 without battery. */
++ break;
++ default:
++ return -EINVAL;
++ }
++
++ return 0;
++}
++
++static void gta01_bat_ext_changed(struct power_supply *psy)
++{
++ struct gta01_battery *bat = container_of(psy, struct gta01_battery, psy);
++ power_supply_changed(&bat->psy);
++}
++
++static int gta01_battery_probe(struct platform_device *pdev)
++{
++ struct gta01_battery *gta01_bat;
++
++ gta01_bat = kzalloc(sizeof(*gta01_bat), GFP_KERNEL);
++ if (!gta01_bat)
++ return -ENOMEM;
++
++ gta01_bat->psy.name = "battery";
++ gta01_bat->psy.type = POWER_SUPPLY_TYPE_BATTERY;
++ gta01_bat->psy.properties = gta01_bat_props;
++ gta01_bat->psy.num_properties = ARRAY_SIZE(gta01_bat_props);
++ gta01_bat->psy.get_property = gta01_bat_get_property;
++ gta01_bat->psy.external_power_changed = gta01_bat_ext_changed;
++
++ gta01_bat->pdata = pdev->dev.platform_data;
++ power_supply_register(&pdev->dev, &gta01_bat->psy);
++
++ return 0;
++}
++
++static int gta01_battery_remove(struct platform_device *pdev)
++{
++ struct gta01_battery *bat = platform_get_drvdata(pdev);
++
++ power_supply_unregister(&bat->psy);
++ kfree(bat);
++
++ return 0;
++}
++
++static struct platform_driver gta01_battery_driver = {
++ .driver = {
++ .name = "gta01_battery",
++ },
++ .probe = gta01_battery_probe,
++ .remove = gta01_battery_remove,
++};
++
++static int __init gta01_battery_init(void)
++{
++ return platform_driver_register(&gta01_battery_driver);
++}
++
++static void __exit gta01_battery_exit(void)
++{
++ platform_driver_unregister(&gta01_battery_driver);
++}
++
++module_init(gta01_battery_init);
++module_exit(gta01_battery_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Balaji Rao <balajirrao@openmoko.org>");
++MODULE_DESCRIPTION("gta01 battery driver");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/power/hdq.c linux-2.6.29-rc3.owrt.om/drivers/power/hdq.c
+--- linux-2.6.29-rc3.owrt/drivers/power/hdq.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/power/hdq.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,515 @@
++/*
++ * HDQ generic GPIO bitbang driver using FIQ
++ *
++ * (C) 2006-2007 by Openmoko, Inc.
++ * Author: Andy Green <andy@openmoko.com>
++ * All rights reserved.
++ *
++ * 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.
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++#include <linux/platform_device.h>
++#include <linux/hdq.h>
++
++#define HDQ_READ 0
++#define HDQ_WRITE 0x80
++
++enum hdq_bitbang_states {
++ HDQB_IDLE = 0,
++ HDQB_TX_BREAK,
++ HDQB_TX_BREAK_RECOVERY,
++ HDQB_ADS_CALC,
++ HDQB_ADS_LOW,
++ HDQB_ADS_HIGH,
++ HDQB_WAIT_RX,
++ HDQB_DATA_RX_LOW,
++ HDQB_DATA_RX_HIGH,
++ HDQB_WAIT_TX,
++};
++
++static struct hdq_priv {
++ u8 hdq_probed; /* nonzero after HDQ driver probed */
++ struct mutex hdq_lock; /* if you want to use hdq, you have to take lock */
++ unsigned long hdq_gpio_pin; /* GTA02 = GPD14 which pin to meddle with */
++ u8 hdq_ads; /* b7..b6 = register address, b0 = r/w */
++ u8 hdq_tx_data; /* data to tx for write action */
++ u8 hdq_rx_data; /* data received in read action */
++ u8 hdq_request_ctr; /* incremented by "user" to request a transfer */
++ u8 hdq_transaction_ctr; /* incremented after each transfer */
++ u8 hdq_error; /* 0 = no error */
++ u8 hdq_ctr;
++ u8 hdq_ctr2;
++ u8 hdq_bit;
++ u8 hdq_shifter;
++ u8 hdq_tx_data_done;
++ enum hdq_bitbang_states hdq_state;
++ int reported_error;
++
++ struct hdq_platform_data *pdata;
++} hdq_priv;
++
++
++static void hdq_bad(void)
++{
++ if (!hdq_priv.reported_error)
++ printk(KERN_ERR "HDQ error: %d\n", hdq_priv.hdq_error);
++ hdq_priv.reported_error = 1;
++}
++
++static void hdq_good(void)
++{
++ if (hdq_priv.reported_error)
++ printk(KERN_INFO "HDQ responds again\n");
++ hdq_priv.reported_error = 0;
++}
++
++int hdq_fiq_handler(void)
++{
++ if (!hdq_priv.hdq_probed)
++ return 0;
++
++ switch (hdq_priv.hdq_state) {
++ case HDQB_IDLE:
++ if (hdq_priv.hdq_request_ctr == hdq_priv.hdq_transaction_ctr)
++ break;
++ hdq_priv.hdq_ctr = 250 / HDQ_SAMPLE_PERIOD_US;
++ hdq_priv.pdata->gpio_set(0);
++ hdq_priv.pdata->gpio_dir_out();
++ hdq_priv.hdq_tx_data_done = 0;
++ hdq_priv.hdq_state = HDQB_TX_BREAK;
++ break;
++
++ case HDQB_TX_BREAK: /* issue low for > 190us */
++ if (--hdq_priv.hdq_ctr == 0) {
++ hdq_priv.hdq_ctr = 60 / HDQ_SAMPLE_PERIOD_US;
++ hdq_priv.hdq_state = HDQB_TX_BREAK_RECOVERY;
++ hdq_priv.pdata->gpio_set(1);
++ }
++ break;
++
++ case HDQB_TX_BREAK_RECOVERY: /* issue low for > 40us */
++ if (--hdq_priv.hdq_ctr)
++ break;
++ hdq_priv.hdq_shifter = hdq_priv.hdq_ads;
++ hdq_priv.hdq_bit = 8; /* 8 bits of ads / rw */
++ hdq_priv.hdq_tx_data_done = 0; /* doing ads */
++ /* fallthru on last one */
++ case HDQB_ADS_CALC:
++ if (hdq_priv.hdq_shifter & 1)
++ hdq_priv.hdq_ctr = 50 / HDQ_SAMPLE_PERIOD_US;
++ else
++ hdq_priv.hdq_ctr = 120 / HDQ_SAMPLE_PERIOD_US;
++ /* carefully precompute the other phase length */
++ hdq_priv.hdq_ctr2 = (210 - (hdq_priv.hdq_ctr * HDQ_SAMPLE_PERIOD_US)) /
++ HDQ_SAMPLE_PERIOD_US;
++ hdq_priv.hdq_state = HDQB_ADS_LOW;
++ hdq_priv.hdq_shifter >>= 1;
++ hdq_priv.hdq_bit--;
++ hdq_priv.pdata->gpio_set(0);
++ break;
++
++ case HDQB_ADS_LOW:
++ if (--hdq_priv.hdq_ctr)
++ break;
++ hdq_priv.pdata->gpio_set(1);
++ hdq_priv.hdq_state = HDQB_ADS_HIGH;
++ break;
++
++ case HDQB_ADS_HIGH:
++ if (--hdq_priv.hdq_ctr2 > 1) /* account for HDQB_ADS_CALC */
++ break;
++ if (hdq_priv.hdq_bit) { /* more bits to do */
++ hdq_priv.hdq_state = HDQB_ADS_CALC;
++ break;
++ }
++ /* no more bits, wait it out until hdq_priv.hdq_ctr2 exhausted */
++ if (hdq_priv.hdq_ctr2)
++ break;
++ /* ok no more bits and very last state */
++ hdq_priv.hdq_ctr = 60 / HDQ_SAMPLE_PERIOD_US;
++ /* FIXME 0 = read */
++ if (hdq_priv.hdq_ads & 0x80) { /* write the byte out */
++ /* set delay before payload */
++ hdq_priv.hdq_ctr = 300 / HDQ_SAMPLE_PERIOD_US;
++ /* already high, no need to write */
++ hdq_priv.hdq_state = HDQB_WAIT_TX;
++ break;
++ }
++ /* read the next byte */
++ hdq_priv.hdq_bit = 8; /* 8 bits of data */
++ hdq_priv.hdq_ctr = 2500 / HDQ_SAMPLE_PERIOD_US;
++ hdq_priv.hdq_state = HDQB_WAIT_RX;
++ hdq_priv.pdata->gpio_dir_in();
++ break;
++
++ case HDQB_WAIT_TX: /* issue low for > 40us */
++ if (--hdq_priv.hdq_ctr)
++ break;
++ if (!hdq_priv.hdq_tx_data_done) { /* was that the data sent? */
++ hdq_priv.hdq_tx_data_done++;
++ hdq_priv.hdq_shifter = hdq_priv.hdq_tx_data;
++ hdq_priv.hdq_bit = 8; /* 8 bits of data */
++ hdq_priv.hdq_state = HDQB_ADS_CALC; /* start sending */
++ break;
++ }
++ hdq_priv.hdq_error = 0;
++ hdq_priv.hdq_transaction_ctr = hdq_priv.hdq_request_ctr;
++ hdq_priv.hdq_state = HDQB_IDLE; /* all tx is done */
++ /* idle in input mode, it's pulled up by 10K */
++ hdq_priv.pdata->gpio_dir_in();
++ break;
++
++ case HDQB_WAIT_RX: /* wait for battery to talk to us */
++ if (hdq_priv.pdata->gpio_get() == 0) {
++ /* it talks to us! */
++ hdq_priv.hdq_ctr2 = 1;
++ hdq_priv.hdq_bit = 8; /* 8 bits of data */
++ /* timeout */
++ hdq_priv.hdq_ctr = 500 / HDQ_SAMPLE_PERIOD_US;
++ hdq_priv.hdq_state = HDQB_DATA_RX_LOW;
++ break;
++ }
++ if (--hdq_priv.hdq_ctr == 0) { /* timed out, error */
++ hdq_priv.hdq_error = 1;
++ hdq_priv.hdq_transaction_ctr = hdq_priv.hdq_request_ctr;
++ hdq_priv.hdq_state = HDQB_IDLE; /* abort */
++ }
++ break;
++
++ /*
++ * HDQ basically works by measuring the low time of the bit cell
++ * 32-50us --> '1', 80 - 145us --> '0'
++ */
++
++ case HDQB_DATA_RX_LOW:
++ if (hdq_priv.pdata->gpio_get()) {
++ hdq_priv.hdq_rx_data >>= 1;
++ if (hdq_priv.hdq_ctr2 <= (65 / HDQ_SAMPLE_PERIOD_US))
++ hdq_priv.hdq_rx_data |= 0x80;
++
++ if (--hdq_priv.hdq_bit == 0) {
++ hdq_priv.hdq_error = 0;
++ hdq_priv.hdq_transaction_ctr =
++ hdq_priv.hdq_request_ctr;
++
++ hdq_priv.hdq_state = HDQB_IDLE;
++ } else
++ hdq_priv.hdq_state = HDQB_DATA_RX_HIGH;
++ /* timeout */
++ hdq_priv.hdq_ctr = 1000 / HDQ_SAMPLE_PERIOD_US;
++ hdq_priv.hdq_ctr2 = 1;
++ break;
++ }
++ hdq_priv.hdq_ctr2++;
++ if (--hdq_priv.hdq_ctr)
++ break;
++ /* timed out, error */
++ hdq_priv.hdq_error = 2;
++ hdq_priv.hdq_transaction_ctr = hdq_priv.hdq_request_ctr;
++ hdq_priv.hdq_state = HDQB_IDLE; /* abort */
++ break;
++
++ case HDQB_DATA_RX_HIGH:
++ if (!hdq_priv.pdata->gpio_get()) {
++ /* it talks to us! */
++ hdq_priv.hdq_ctr2 = 1;
++ /* timeout */
++ hdq_priv.hdq_ctr = 400 / HDQ_SAMPLE_PERIOD_US;
++ hdq_priv.hdq_state = HDQB_DATA_RX_LOW;
++ break;
++ }
++ if (--hdq_priv.hdq_ctr)
++ break;
++ /* timed out, error */
++ hdq_priv.hdq_error = 3;
++ hdq_priv.hdq_transaction_ctr = hdq_priv.hdq_request_ctr;
++
++ /* we're in input mode already */
++ hdq_priv.hdq_state = HDQB_IDLE; /* abort */
++ break;
++ }
++
++ /* Are we interested in keeping the FIQ source alive ? */
++ if (hdq_priv.hdq_state != HDQB_IDLE)
++ return 1;
++ else
++ return 0;
++}
++static int fiq_busy(void)
++{
++ int request = (volatile u8)hdq_priv.hdq_request_ctr;
++ int transact = (volatile u8)hdq_priv.hdq_transaction_ctr;
++
++
++ return (request != transact);
++}
++
++int hdq_initialized(void)
++{
++ return hdq_priv.hdq_probed;
++}
++EXPORT_SYMBOL_GPL(hdq_initialized);
++
++int hdq_read(int address)
++{
++ int count_sleeps = 5;
++ int ret = -ETIME;
++
++ if (!hdq_priv.hdq_probed)
++ return -EINVAL;
++
++ mutex_lock(&hdq_priv.hdq_lock);
++
++ hdq_priv.hdq_error = 0;
++ hdq_priv.hdq_ads = address | HDQ_READ;
++ hdq_priv.hdq_request_ctr++;
++ hdq_priv.pdata->kick_fiq();
++ /*
++ * FIQ takes care of it while we block our calling process
++ * But we're not spinning -- other processes run normally while
++ * we wait for the result
++ */
++ while (count_sleeps--) {
++ msleep(10); /* valid transaction always completes in < 10ms */
++
++ if (fiq_busy())
++ continue;
++
++ if (hdq_priv.hdq_error) {
++ hdq_bad();
++ goto done; /* didn't see a response in good time */
++ }
++ hdq_good();
++
++ ret = hdq_priv.hdq_rx_data;
++ goto done;
++ }
++
++done:
++ mutex_unlock(&hdq_priv.hdq_lock);
++ return ret;
++}
++EXPORT_SYMBOL_GPL(hdq_read);
++
++int hdq_write(int address, u8 data)
++{
++ int count_sleeps = 5;
++ int ret = -ETIME;
++
++ if (!hdq_priv.hdq_probed)
++ return -EINVAL;
++
++ mutex_lock(&hdq_priv.hdq_lock);
++
++ hdq_priv.hdq_error = 0;
++ hdq_priv.hdq_ads = address | HDQ_WRITE;
++ hdq_priv.hdq_tx_data = data;
++ hdq_priv.hdq_request_ctr++;
++ hdq_priv.pdata->kick_fiq();
++ /*
++ * FIQ takes care of it while we block our calling process
++ * But we're not spinning -- other processes run normally while
++ * we wait for the result
++ */
++ while (count_sleeps--) {
++ msleep(10); /* valid transaction always completes in < 10ms */
++
++ if (fiq_busy())
++ continue; /* something bad with FIQ */
++
++ if (hdq_priv.hdq_error) {
++ hdq_bad();
++ goto done; /* didn't see a response in good time */
++ }
++ hdq_good();
++
++ ret = 0;
++ goto done;
++ }
++
++done:
++ mutex_unlock(&hdq_priv.hdq_lock);
++ return ret;
++}
++EXPORT_SYMBOL_GPL(hdq_write);
++
++/* sysfs */
++
++static ssize_t hdq_sysfs_dump(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ int n;
++ int v;
++ u8 u8a[128]; /* whole address space for HDQ */
++ char *end = buf;
++
++ if (!hdq_priv.hdq_probed)
++ return -EINVAL;
++
++ /* the dump does not take care about 16 bit regs, because at this
++ * bus level we don't know about the chip details
++ */
++ for (n = 0; n < sizeof(u8a); n++) {
++ v = hdq_read(n);
++ if (v < 0)
++ goto bail;
++ u8a[n] = v;
++ }
++
++ for (n = 0; n < sizeof(u8a); n += 16) {
++ hex_dump_to_buffer(u8a + n, sizeof(u8a), 16, 1, end, 4096, 0);
++ end += strlen(end);
++ *end++ = '\n';
++ *end = '\0';
++ }
++ return (end - buf);
++
++bail:
++ return sprintf(buf, "ERROR %d\n", v);
++}
++
++/* you write by <address> <data>, eg, "34 128" */
++
++#define atoi(str) simple_strtoul(((str != NULL) ? str : ""), NULL, 0)
++
++static ssize_t hdq_sysfs_write(struct device *dev,
++ struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ const char *end = buf + count;
++ int address = atoi(buf);
++
++ if (!hdq_priv.hdq_probed)
++ return -EINVAL;
++
++ while ((buf != end) && (*buf != ' '))
++ buf++;
++ if (buf >= end)
++ return 0;
++ while ((buf < end) && (*buf == ' '))
++ buf++;
++ if (buf >= end)
++ return 0;
++
++ hdq_write(address, atoi(buf));
++
++ return count;
++}
++
++static DEVICE_ATTR(dump, 0400, hdq_sysfs_dump, NULL);
++static DEVICE_ATTR(write, 0600, NULL, hdq_sysfs_write);
++
++static struct attribute *hdq_sysfs_entries[] = {
++ &dev_attr_dump.attr,
++ &dev_attr_write.attr,
++ NULL
++};
++
++static struct attribute_group hdq_attr_group = {
++ .name = "hdq",
++ .attrs = hdq_sysfs_entries,
++};
++
++
++#ifdef CONFIG_PM
++static int hdq_suspend(struct platform_device *pdev, pm_message_t state)
++{
++ /* after 18s of this, the battery monitor will also go to sleep */
++ hdq_priv.pdata->gpio_dir_in();
++ hdq_priv.pdata->disable_fiq();
++ return 0;
++}
++
++static int hdq_resume(struct platform_device *pdev)
++{
++ hdq_priv.pdata->gpio_set(1);
++ hdq_priv.pdata->gpio_dir_out();
++ hdq_priv.pdata->enable_fiq();
++ return 0;
++}
++#endif
++
++static int __init hdq_probe(struct platform_device *pdev)
++{
++ struct resource *r = platform_get_resource(pdev, 0, 0);
++ int ret;
++ struct hdq_platform_data *pdata = pdev->dev.platform_data;
++
++ if (!r || !pdata)
++ return -EINVAL;
++
++ platform_set_drvdata(pdev, NULL);
++
++ mutex_init(&hdq_priv.hdq_lock);
++
++ /* set our HDQ comms pin from the platform data */
++ hdq_priv.hdq_gpio_pin = r->start;
++ hdq_priv.pdata = pdata;
++
++ hdq_priv.pdata->gpio_set(1);
++ hdq_priv.pdata->gpio_dir_out();
++
++ /* Initialize FIQ */
++ if (hdq_priv.pdata->enable_fiq() < 0) {
++ dev_err(&pdev->dev, "Could not enable FIQ source\n");
++ return -EINVAL;
++ }
++
++ ret = sysfs_create_group(&pdev->dev.kobj, &hdq_attr_group);
++ if (ret)
++ return ret;
++
++ hdq_priv.hdq_probed = 1; /* we are ready to do stuff now */
++
++ /*
++ * if wanted, users can defer registration of devices
++ * that depend on HDQ until after we register, and can use our
++ * device as parent so suspend-resume ordering is correct
++ */
++ if (pdata->attach_child_devices)
++ (pdata->attach_child_devices)(&pdev->dev);
++
++ hdq_priv.pdata = pdata;
++
++ return 0;
++}
++
++static int hdq_remove(struct platform_device *pdev)
++{
++ sysfs_remove_group(&pdev->dev.kobj, &hdq_attr_group);
++ return 0;
++}
++
++static struct platform_driver hdq_driver = {
++ .probe = hdq_probe,
++ .remove = hdq_remove,
++#ifdef CONFIG_PM
++ .suspend = hdq_suspend,
++ .resume = hdq_resume,
++#endif
++ .driver = {
++ .name = "hdq",
++ },
++};
++
++static int __init hdq_init(void)
++{
++ return platform_driver_register(&hdq_driver);
++}
++
++static void __exit hdq_exit(void)
++{
++ platform_driver_unregister(&hdq_driver);
++}
++
++module_init(hdq_init);
++module_exit(hdq_exit);
++
++MODULE_AUTHOR("Andy Green <andy@openmoko.com>");
++MODULE_DESCRIPTION("HDQ driver");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/power/Kconfig linux-2.6.29-rc3.owrt.om/drivers/power/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/power/Kconfig 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/power/Kconfig 2009-05-10 22:28:00.000000000 +0200
+@@ -88,4 +88,27 @@
+ help
+ Say Y to include support for NXP PCF50633 Main Battery Charger.
+
++config BATTERY_BQ27000_HDQ
++ tristate "BQ27000 HDQ battery monitor driver"
++ help
++ Say Y to enable support for the battery on the Neo Freerunner
++
++config HDQ_GPIO_BITBANG
++ bool "Generic gpio based HDQ bitbang"
++ help
++ Say Y to enable supoort for generic gpio based HDQ bitbang driver.
++ This can not be built as a module.
++
++config CHARGER_PCF50606
++ tristate "Support for NXP PCF50606 MBC"
++ depends on MFD_PCF50606
++ help
++ Say Y to include support for NXP PCF50606 Battery Charger.
++
++config BATTERY_GTA01
++ tristate "GTA01 battery driver"
++ help
++ Say Y here to enable this dumb driver for dumb gta01 batteries
++
+ endif # POWER_SUPPLY
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/power/Makefile linux-2.6.29-rc3.owrt.om/drivers/power/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/power/Makefile 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/power/Makefile 2009-05-10 22:28:00.000000000 +0200
+@@ -25,4 +25,10 @@
+ obj-$(CONFIG_BATTERY_WM97XX) += wm97xx_battery.o
+ obj-$(CONFIG_BATTERY_BQ27x00) += bq27x00_battery.o
+ obj-$(CONFIG_BATTERY_DA9030) += da9030_battery.o
+-obj-$(CONFIG_CHARGER_PCF50633) += pcf50633-charger.o
+\ No newline at end of file
++obj-$(CONFIG_CHARGER_PCF50633) += pcf50633-charger.o
++obj-$(CONFIG_CHARGER_PCF50606) += pcf50606-charger.o
++obj-$(CONFIG_BATTERY_PALMTX) += palmtx_battery.o
++obj-$(CONFIG_BATTERY_BQ27000_HDQ) += bq27000_battery.o
++obj-$(CONFIG_BATTERY_GTA01) += gta01_battery.o
++
++obj-$(CONFIG_HDQ_GPIO_BITBANG) += hdq.o
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/power/pcf50606-charger.c linux-2.6.29-rc3.owrt.om/drivers/power/pcf50606-charger.c
+--- linux-2.6.29-rc3.owrt/drivers/power/pcf50606-charger.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/power/pcf50606-charger.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,244 @@
++/* NXP PCF50606 Main Battery Charger Driver
++ *
++ * (C) 2006-2008 by Openmoko, Inc.
++ * Author: Balaji Rao <balajirrao@openmoko.org>
++ * All rights reserved.
++ *
++ * Broken down from monstrous PCF50606 driver mainly by
++ * Harald Welte, Andy Green and Werner Almesberger
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/types.h>
++#include <linux/device.h>
++#include <linux/sysfs.h>
++#include <linux/platform_device.h>
++#include <linux/power_supply.h>
++
++#include <linux/mfd/pcf50606/core.h>
++#include <linux/mfd/pcf50606/mbc.h>
++
++struct pcf50606_mbc {
++ struct pcf50606 *pcf;
++
++ int charger_online;
++ struct power_supply charger;
++};
++
++void pcf50606_charge_fast(struct pcf50606 *pcf, int on)
++{
++ struct pcf50606_mbc *mbc = platform_get_drvdata(pcf->mbc_pdev);
++
++ /*
++ * This is a fix to work around boot-time ordering problems if
++ * the s3c2410_udc is initialized before the pcf50606 mbc is
++ * ready.
++ */
++ if (!mbc)
++ return;
++
++ if (on) {
++ pcf50606_reg_set_bit_mask(pcf, PCF50606_REG_MBCC1,
++ PCF50606_MBCC1_AUTOFST,
++ PCF50606_MBCC1_AUTOFST);\
++ mbc->charger_online = 1;
++ } else {
++ /* disable automatic fast-charge */
++ pcf50606_reg_clear_bits(pcf, PCF50606_REG_MBCC1,
++ PCF50606_MBCC1_AUTOFST);
++ /* switch to idle mode to abort existing charge process */
++ pcf50606_reg_set_bit_mask(pcf, PCF50606_REG_MBCC1,
++ PCF50606_MBCC1_CHGMOD_MASK,
++ PCF50606_MBCC1_CHGMOD_IDLE);
++ mbc->charger_online = 0;
++ }
++}
++EXPORT_SYMBOL_GPL(pcf50606_charge_fast);
++
++static ssize_t
++show_chgmode(struct device *dev, struct device_attribute *attr, char *buf)
++{
++ struct pcf50606_mbc *mbc = dev_get_drvdata(dev);
++
++ u8 mbcc1 = pcf50606_reg_read(mbc->pcf, PCF50606_REG_MBCC1);
++ u8 chgmod = (mbcc1 & PCF50606_MBCC1_CHGMOD_MASK);
++
++ return sprintf(buf, "%d\n", chgmod);
++}
++
++static ssize_t set_chgmode(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct pcf50606_mbc *mbc = dev_get_drvdata(dev);
++ u_int8_t mbcc1 = pcf50606_reg_read(mbc->pcf, PCF50606_REG_MBCC1);
++
++ mbcc1 &= ~PCF50606_MBCC1_CHGMOD_MASK;
++
++ if (!strcmp(buf, "qualification"))
++ mbcc1 |= PCF50606_MBCC1_CHGMOD_QUAL;
++ else if (!strcmp(buf, "pre"))
++ mbcc1 |= PCF50606_MBCC1_CHGMOD_PRE;
++ else if (!strcmp(buf, "trickle"))
++ mbcc1 |= PCF50606_MBCC1_CHGMOD_TRICKLE;
++ else if (!strcmp(buf, "fast_cccv"))
++ mbcc1 |= PCF50606_MBCC1_CHGMOD_FAST_CCCV;
++ /* We don't allow the other fast modes for security reasons */
++ else if (!strcmp(buf, "idle"))
++ mbcc1 |= PCF50606_MBCC1_CHGMOD_IDLE;
++ else
++ return -EINVAL;
++
++ pcf50606_reg_write(mbc->pcf, PCF50606_REG_MBCC1, mbcc1);
++
++ return count;
++}
++
++static DEVICE_ATTR(chgmode, S_IRUGO, show_chgmode, set_chgmode);
++
++
++static struct attribute *pcf50606_mbc_sysfs_entries[] = {
++ &dev_attr_chgmode.attr,
++ NULL,
++};
++
++static struct attribute_group mbc_attr_group = {
++ .name = NULL, /* put in device directory */
++ .attrs = pcf50606_mbc_sysfs_entries,
++};
++
++static void
++pcf50606_mbc_irq_handler(int irq, void *data)
++{
++ struct pcf50606_mbc *mbc = data;
++
++ power_supply_changed(&mbc->charger);
++
++ if (mbc->pcf->pdata->mbc_event_callback)
++ mbc->pcf->pdata->mbc_event_callback(mbc->pcf, irq);
++}
++
++static int charger_get_property(struct power_supply *psy,
++ enum power_supply_property psp,
++ union power_supply_propval *val)
++{
++ struct pcf50606_mbc *mbc = container_of(psy, struct pcf50606_mbc, charger);
++ int ret = 0;
++
++ switch (psp) {
++ case POWER_SUPPLY_PROP_ONLINE:
++ val->intval = mbc->charger_online;
++ break;
++ default:
++ ret = -EINVAL;
++ break;
++ }
++ return ret;
++}
++
++static enum power_supply_property power_props[] = {
++ POWER_SUPPLY_PROP_ONLINE,
++};
++
++static const u8 mbc_irq_handlers[] = {
++ PCF50606_IRQ_CHGINS,
++ PCF50606_IRQ_CHGRM,
++ PCF50606_IRQ_CHGFOK,
++ PCF50606_IRQ_CHGERR,
++ PCF50606_IRQ_CHGFRDY,
++ PCF50606_IRQ_CHGPROT,
++};
++
++static int __devinit pcf50606_mbc_probe(struct platform_device *pdev)
++{
++ struct pcf50606_mbc *mbc;
++ struct pcf50606_subdev_pdata *pdata = pdev->dev.platform_data;
++ int ret;
++ int i;
++ u8 oocs;
++
++ mbc = kzalloc(sizeof(*mbc), GFP_KERNEL);
++ if (!mbc)
++ return -ENOMEM;
++
++ platform_set_drvdata(pdev, mbc);
++ mbc->pcf = pdata->pcf;
++
++ /* Set up IRQ handlers */
++ for (i = 0; i < ARRAY_SIZE(mbc_irq_handlers); i++)
++ pcf50606_register_irq(mbc->pcf, mbc_irq_handlers[i],
++ pcf50606_mbc_irq_handler, mbc);
++
++ mbc->charger.name = "charger";
++ mbc->charger.type = POWER_SUPPLY_TYPE_MAINS;
++ mbc->charger.properties = power_props;
++ mbc->charger.num_properties = ARRAY_SIZE(power_props);
++ mbc->charger.get_property = &charger_get_property;
++ mbc->charger.supplied_to = mbc->pcf->pdata->batteries;
++ mbc->charger.num_supplicants = mbc->pcf->pdata->num_batteries;
++
++ ret = power_supply_register(&pdev->dev, &mbc->charger);
++ if (ret) {
++ dev_err(mbc->pcf->dev, "failed to register charger\n");
++ kfree(mbc);
++ return ret;
++ }
++
++ ret = sysfs_create_group(&pdev->dev.kobj, &mbc_attr_group);
++ if (ret)
++ dev_err(mbc->pcf->dev, "failed to create sysfs entries\n");
++
++ oocs = pcf50606_reg_read(mbc->pcf, PCF50606_REG_OOCS);
++ if (oocs & PCF50606_OOCS_CHGOK)
++ pcf50606_mbc_irq_handler(PCF50606_IRQ_CHGINS, mbc);
++
++ return 0;
++}
++
++static int __devexit pcf50606_mbc_remove(struct platform_device *pdev)
++{
++ struct pcf50606_mbc *mbc = platform_get_drvdata(pdev);
++ int i;
++
++ /* Remove IRQ handlers */
++ for (i = 0; i < ARRAY_SIZE(mbc_irq_handlers); i++)
++ pcf50606_free_irq(mbc->pcf, mbc_irq_handlers[i]);
++
++ power_supply_unregister(&mbc->charger);
++
++ kfree(mbc);
++
++ return 0;
++}
++
++static struct platform_driver pcf50606_mbc_driver = {
++ .driver = {
++ .name = "pcf50606-mbc",
++ },
++ .probe = pcf50606_mbc_probe,
++ .remove = __devexit_p(pcf50606_mbc_remove),
++};
++
++static int __init pcf50606_mbc_init(void)
++{
++ return platform_driver_register(&pcf50606_mbc_driver);
++}
++module_init(pcf50606_mbc_init);
++
++static void __exit pcf50606_mbc_exit(void)
++{
++ platform_driver_unregister(&pcf50606_mbc_driver);
++}
++module_exit(pcf50606_mbc_exit);
++
++MODULE_AUTHOR("Balaji Rao <balajirrao@openmoko.org>");
++MODULE_DESCRIPTION("PCF50606 mbc driver");
++MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:pcf50606-mbc");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/power/pcf50633-charger.c linux-2.6.29-rc3.owrt.om/drivers/power/pcf50633-charger.c
+--- linux-2.6.29-rc3.owrt/drivers/power/pcf50633-charger.c 2009-05-10 22:08:44.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/power/pcf50633-charger.c 2009-05-10 22:28:00.000000000 +0200
+@@ -36,6 +36,9 @@
+
+ struct power_supply usb;
+ struct power_supply adapter;
++ struct power_supply ac;
++
++ struct delayed_work charging_restart_work;
+ };
+
+ int pcf50633_mbc_usb_curlim_set(struct pcf50633 *pcf, int ma)
+@@ -43,15 +46,24 @@
+ struct pcf50633_mbc *mbc = platform_get_drvdata(pcf->mbc_pdev);
+ int ret = 0;
+ u8 bits;
++ int charging_start = 1;
++ u8 mbcs2, chgmod;
++ unsigned int mbcc5;
+
+- if (ma >= 1000)
++ if (ma >= 1000) {
+ bits = PCF50633_MBCC7_USB_1000mA;
+- else if (ma >= 500)
++ ma = 1000;
++ } else if (ma >= 500) {
+ bits = PCF50633_MBCC7_USB_500mA;
+- else if (ma >= 100)
++ ma = 500;
++ } else if (ma >= 100) {
+ bits = PCF50633_MBCC7_USB_100mA;
+- else
++ ma = 100;
++ } else {
+ bits = PCF50633_MBCC7_USB_SUSPEND;
++ charging_start = 0;
++ ma = 0;
++ }
+
+ ret = pcf50633_reg_set_bit_mask(pcf, PCF50633_REG_MBCC7,
+ PCF50633_MBCC7_USB_MASK, bits);
+@@ -60,6 +72,37 @@
+ else
+ dev_info(pcf->dev, "usb curlim to %d mA\n", ma);
+
++ /*
++ * We limit the charging current to be the USB current limit.
++ * The reason is that on pcf50633, when it enters PMU Standby mode,
++ * which it does when the device goes "off", the USB current limit
++ * reverts to the variant default. In at least one common case, that
++ * default is 500mA. By setting the charging current to be the same
++ * as the USB limit we set here before PMU standby, we enforce it only
++ * using the correct amount of current even when the USB current limit
++ * gets reset to the wrong thing
++ */
++
++ mbcc5 = (ma << 8) / mbc->pcf->pdata->chg_ref_current_ma;
++ if (mbcc5 > 255)
++ mbcc5 = 255;
++ pcf50633_reg_write(mbc->pcf, PCF50633_REG_MBCC5, mbcc5);
++
++ mbcs2 = pcf50633_reg_read(pcf, PCF50633_REG_MBCS2);
++ chgmod = (mbcs2 & PCF50633_MBCS2_MBC_MASK);
++
++ /* If chgmod == BATFULL, setting chgena has no effect.
++ * We need to set resume instead.
++ */
++ if (chgmod != PCF50633_MBCS2_MBC_BAT_FULL)
++ pcf50633_reg_set_bit_mask(pcf, PCF50633_REG_MBCC1,
++ PCF50633_MBCC1_CHGENA, PCF50633_MBCC1_CHGENA);
++ else
++ pcf50633_reg_set_bit_mask(pcf, PCF50633_REG_MBCC1,
++ PCF50633_MBCC1_RESUME, PCF50633_MBCC1_RESUME);
++
++ mbc->usb_active = charging_start;
++
+ power_supply_changed(&mbc->usb);
+
+ return ret;
+@@ -84,21 +127,6 @@
+ }
+ EXPORT_SYMBOL_GPL(pcf50633_mbc_get_status);
+
+-void pcf50633_mbc_set_status(struct pcf50633 *pcf, int what, int status)
+-{
+- struct pcf50633_mbc *mbc = platform_get_drvdata(pcf->mbc_pdev);
+-
+- if (what & PCF50633_MBC_USB_ONLINE)
+- mbc->usb_online = !!status;
+- if (what & PCF50633_MBC_USB_ACTIVE)
+- mbc->usb_active = !!status;
+- if (what & PCF50633_MBC_ADAPTER_ONLINE)
+- mbc->adapter_online = !!status;
+- if (what & PCF50633_MBC_ADAPTER_ACTIVE)
+- mbc->adapter_active = !!status;
+-}
+-EXPORT_SYMBOL_GPL(pcf50633_mbc_set_status);
+-
+ static ssize_t
+ show_chgmode(struct device *dev, struct device_attribute *attr, char *buf)
+ {
+@@ -149,9 +177,44 @@
+
+ static DEVICE_ATTR(usb_curlim, S_IRUGO | S_IWUSR, show_usblim, set_usblim);
+
++static ssize_t
++show_chglim(struct device *dev, struct device_attribute *attr, char *buf)
++{
++ struct pcf50633_mbc *mbc = dev_get_drvdata(dev);
++ u8 mbcc5 = pcf50633_reg_read(mbc->pcf, PCF50633_REG_MBCC5);
++ unsigned int ma;
++
++ ma = (mbc->pcf->pdata->chg_ref_current_ma * mbcc5) >> 8;
++
++ return sprintf(buf, "%u\n", ma);
++}
++
++static ssize_t set_chglim(struct device *dev,
++ struct device_attribute *attr, const char *buf, size_t count)
++{
++ struct pcf50633_mbc *mbc = dev_get_drvdata(dev);
++ unsigned long ma;
++ unsigned int mbcc5;
++ int ret;
++
++ ret = strict_strtoul(buf, 10, &ma);
++ if (ret)
++ return -EINVAL;
++
++ mbcc5 = (ma << 8) / mbc->pcf->pdata->chg_ref_current_ma;
++ if (mbcc5 > 255)
++ mbcc5 = 255;
++ pcf50633_reg_write(mbc->pcf, PCF50633_REG_MBCC5, mbcc5);
++
++ return count;
++}
++
++static DEVICE_ATTR(chg_curlim, S_IRUGO | S_IWUSR, show_chglim, set_chglim);
++
+ static struct attribute *pcf50633_mbc_sysfs_entries[] = {
+ &dev_attr_chgmode.attr,
+ &dev_attr_usb_curlim.attr,
++ &dev_attr_chg_curlim.attr,
+ NULL,
+ };
+
+@@ -160,10 +223,44 @@
+ .attrs = pcf50633_mbc_sysfs_entries,
+ };
+
++/* MBC state machine switches into charging mode when the battery voltage
++ * falls below 96% of a battery float voltage. But the voltage drop in Li-ion
++ * batteries is marginal(1~2 %) till about 80% of its capacity - which means,
++ * after a BATFULL, charging won't be restarted until 80%.
++ *
++ * This work_struct function restarts charging every few seconds and makes
++ * sure we don't discharge too much
++ */
++
++static void pcf50633_mbc_charging_restart(struct work_struct *work)
++{
++ struct pcf50633_mbc *mbc;
++ u8 mbcs2, chgmod;
++
++ mbc = container_of(work, struct pcf50633_mbc,
++ charging_restart_work.work);
++
++ mbcs2 = pcf50633_reg_read(mbc->pcf, PCF50633_REG_MBCS2);
++ chgmod = (mbcs2 & PCF50633_MBCS2_MBC_MASK);
++
++ if (chgmod != PCF50633_MBCS2_MBC_BAT_FULL)
++ return;
++
++ /* Restart charging */
++ pcf50633_reg_set_bit_mask(mbc->pcf, PCF50633_REG_MBCC1,
++ PCF50633_MBCC1_RESUME, PCF50633_MBCC1_RESUME);
++ mbc->usb_active = 1;
++ power_supply_changed(&mbc->usb);
++
++ dev_info(mbc->pcf->dev, "Charging restarted\n");
++}
++
+ static void
+ pcf50633_mbc_irq_handler(int irq, void *data)
+ {
+ struct pcf50633_mbc *mbc = data;
++ int chg_restart_interval =
++ mbc->pcf->pdata->charging_restart_interval;
+
+ /* USB */
+ if (irq == PCF50633_IRQ_USBINS) {
+@@ -171,7 +268,8 @@
+ } else if (irq == PCF50633_IRQ_USBREM) {
+ mbc->usb_online = 0;
+ mbc->usb_active = 0;
+- pcf50633_mbc_usb_curlim_set(mbc->pcf, 0);
++ pcf50633_mbc_usb_curlim_set(mbc->pcf, 0);
++ cancel_delayed_work_sync(&mbc->charging_restart_work);
+ }
+
+ /* Adapter */
+@@ -186,10 +284,18 @@
+ if (irq == PCF50633_IRQ_BATFULL) {
+ mbc->usb_active = 0;
+ mbc->adapter_active = 0;
+- }
++
++ if (chg_restart_interval > 0)
++ schedule_delayed_work(&mbc->charging_restart_work,
++ chg_restart_interval);
++ } else if (irq == PCF50633_IRQ_USBLIMON)
++ mbc->usb_active = 0;
++ else if (irq == PCF50633_IRQ_USBLIMOFF)
++ mbc->usb_active = 1;
+
+ power_supply_changed(&mbc->usb);
+ power_supply_changed(&mbc->adapter);
++ power_supply_changed(&mbc->ac);
+
+ if (mbc->pcf->pdata->mbc_event_callback)
+ mbc->pcf->pdata->mbc_event_callback(mbc->pcf, irq);
+@@ -199,7 +305,7 @@
+ enum power_supply_property psp,
+ union power_supply_propval *val)
+ {
+- struct pcf50633_mbc *mbc = container_of(psy, struct pcf50633_mbc, usb);
++ struct pcf50633_mbc *mbc = container_of(psy, struct pcf50633_mbc, adapter);
+ int ret = 0;
+
+ switch (psp) {
+@@ -219,10 +325,34 @@
+ {
+ struct pcf50633_mbc *mbc = container_of(psy, struct pcf50633_mbc, usb);
+ int ret = 0;
++ u8 usblim = pcf50633_reg_read(mbc->pcf, PCF50633_REG_MBCC7) &
++ PCF50633_MBCC7_USB_MASK;
++
++ switch (psp) {
++ case POWER_SUPPLY_PROP_ONLINE:
++ val->intval = mbc->usb_online &&
++ (usblim <= PCF50633_MBCC7_USB_500mA);
++ break;
++ default:
++ ret = -EINVAL;
++ break;
++ }
++ return ret;
++}
++
++static int ac_get_property(struct power_supply *psy,
++ enum power_supply_property psp,
++ union power_supply_propval *val)
++{
++ struct pcf50633_mbc *mbc = container_of(psy, struct pcf50633_mbc, ac);
++ int ret = 0;
++ u8 usblim = pcf50633_reg_read(mbc->pcf, PCF50633_REG_MBCC7) &
++ PCF50633_MBCC7_USB_MASK;
+
+ switch (psp) {
+ case POWER_SUPPLY_PROP_ONLINE:
+- val->intval = mbc->usb_online;
++ val->intval = mbc->usb_online &&
++ (usblim == PCF50633_MBCC7_USB_1000mA);
+ break;
+ default:
+ ret = -EINVAL;
+@@ -287,6 +417,17 @@
+ mbc->usb.supplied_to = mbc->pcf->pdata->batteries;
+ mbc->usb.num_supplicants = mbc->pcf->pdata->num_batteries;
+
++ mbc->ac.name = "ac";
++ mbc->ac.type = POWER_SUPPLY_TYPE_MAINS;
++ mbc->ac.properties = power_props;
++ mbc->ac.num_properties = ARRAY_SIZE(power_props);
++ mbc->ac.get_property = ac_get_property;
++ mbc->ac.supplied_to = mbc->pcf->pdata->batteries;
++ mbc->ac.num_supplicants = mbc->pcf->pdata->num_batteries;
++
++ INIT_DELAYED_WORK(&mbc->charging_restart_work,
++ pcf50633_mbc_charging_restart);
++
+ ret = power_supply_register(&pdev->dev, &mbc->adapter);
+ if (ret) {
+ dev_err(mbc->pcf->dev, "failed to register adapter\n");
+@@ -302,6 +443,15 @@
+ return ret;
+ }
+
++ ret = power_supply_register(&pdev->dev, &mbc->ac);
++ if (ret) {
++ dev_err(mbc->pcf->dev, "failed to register ac\n");
++ power_supply_unregister(&mbc->adapter);
++ power_supply_unregister(&mbc->usb);
++ kfree(mbc);
++ return ret;
++ }
++
+ ret = sysfs_create_group(&pdev->dev.kobj, &mbc_attr_group);
+ if (ret)
+ dev_err(mbc->pcf->dev, "failed to create sysfs entries\n");
+@@ -327,6 +477,8 @@
+ power_supply_unregister(&mbc->usb);
+ power_supply_unregister(&mbc->adapter);
+
++ cancel_delayed_work_sync(&mbc->charging_restart_work);
++
+ kfree(mbc);
+
+ return 0;
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/regulator/core.c linux-2.6.29-rc3.owrt.om/drivers/regulator/core.c
+--- linux-2.6.29-rc3.owrt/drivers/regulator/core.c 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/regulator/core.c 2009-05-10 22:28:00.000000000 +0200
+@@ -1102,18 +1102,19 @@
+ struct regulator_dev *rdev = regulator->rdev;
+ int ret = 0;
+
+- mutex_lock(&rdev->mutex);
+- if (regulator->enabled == 1) {
+- ret = _regulator_disable(rdev);
+- if (ret == 0)
+- regulator->uA_load = 0;
+- } else if (WARN(regulator->enabled <= 0,
+- "unbalanced disables for supply %s\n",
+- regulator->supply_name))
+- ret = -EIO;
+- if (ret == 0)
+- regulator->enabled--;
+- mutex_unlock(&rdev->mutex);
++ if (!regulator->enabled) {
++ printk(KERN_ERR "%s: not in use by this consumer\n",
++ __func__);
++ WARN_ON(1);
++ return 0;
++ }
++
++ mutex_lock(&regulator->rdev->mutex);
++ regulator->enabled = 0;
++ regulator->uA_load = 0;
++ ret = _regulator_disable(regulator->rdev);
++ mutex_unlock(&regulator->rdev->mutex);
++
+ return ret;
+ }
+ EXPORT_SYMBOL_GPL(regulator_disable);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/regulator/Kconfig linux-2.6.29-rc3.owrt.om/drivers/regulator/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/regulator/Kconfig 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/regulator/Kconfig 2009-05-10 22:28:00.000000000 +0200
+@@ -80,4 +80,10 @@
+ Say Y here to support the voltage regulators and convertors
+ on PCF50633
+
++config REGULATOR_PCF50606
++ bool "PCF50606 regulator driver"
++ depends on MFD_PCF50606
++ help
++ Say Y here to support the voltage regulators and convertors
++ on PCF50606
+ endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/regulator/Makefile linux-2.6.29-rc3.owrt.om/drivers/regulator/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/regulator/Makefile 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/regulator/Makefile 2009-05-10 22:28:00.000000000 +0200
+@@ -12,5 +12,6 @@
+ obj-$(CONFIG_REGULATOR_WM8400) += wm8400-regulator.o
+ obj-$(CONFIG_REGULATOR_DA903X) += da903x.o
+ obj-$(CONFIG_REGULATOR_PCF50633) += pcf50633-regulator.o
++obj-$(CONFIG_REGULATOR_PCF50606) += pcf50606-regulator.o
+
+ ccflags-$(CONFIG_REGULATOR_DEBUG) += -DDEBUG
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/regulator/pcf50606-regulator.c linux-2.6.29-rc3.owrt.om/drivers/regulator/pcf50606-regulator.c
+--- linux-2.6.29-rc3.owrt/drivers/regulator/pcf50606-regulator.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/regulator/pcf50606-regulator.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,380 @@
++/* NXP PCF50606 PMIC Driver
++ *
++ * (C) 2006-2008 by Openmoko, Inc.
++ * Author: Balaji Rao <balajirrao@openmoko.org>
++ * All rights reserved.
++ *
++ * Broken down from monstrous PCF50606 driver mainly by
++ * Harald Welte and Andy Green and Werner Almesberger
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/device.h>
++#include <linux/err.h>
++#include <linux/platform_device.h>
++
++#include <linux/mfd/pcf50606/core.h>
++#include <linux/mfd/pcf50606/pmic.h>
++
++#define PCF50606_REGULATOR(_name, _id) \
++ { \
++ .name = _name, \
++ .id = _id, \
++ .ops = &pcf50606_regulator_ops, \
++ .type = REGULATOR_VOLTAGE, \
++ .owner = THIS_MODULE, \
++ }
++
++static const u8 pcf50606_regulator_registers[PCF50606_NUM_REGULATORS] = {
++ [PCF50606_REGULATOR_DCD] = PCF50606_REG_DCDC1,
++ [PCF50606_REGULATOR_DCDE] = PCF50606_REG_DCDEC1,
++ [PCF50606_REGULATOR_DCUD] = PCF50606_REG_DCUDC1,
++ [PCF50606_REGULATOR_D1REG] = PCF50606_REG_D1REGC1,
++ [PCF50606_REGULATOR_D2REG] = PCF50606_REG_D2REGC1,
++ [PCF50606_REGULATOR_D3REG] = PCF50606_REG_D3REGC1,
++ [PCF50606_REGULATOR_LPREG] = PCF50606_REG_LPREGC1,
++ [PCF50606_REGULATOR_IOREG] = PCF50606_REG_IOREGC,
++};
++
++static u8 dcudc_voltage(unsigned int millivolts)
++{
++ if (millivolts < 900)
++ return 0;
++ if (millivolts > 5500)
++ return 0x1f;
++ if (millivolts <= 3300) {
++ millivolts -= 900;
++ return millivolts/300;
++ }
++ if (millivolts < 4000)
++ return 0x0f;
++ else {
++ millivolts -= 4000;
++ return millivolts/100;
++ }
++}
++
++static unsigned int dcudc_2voltage(u8 bits)
++{
++ bits &= 0x1f;
++ if (bits < 0x08)
++ return 900 + bits * 300;
++ else if (bits < 0x10)
++ return 3300;
++ else
++ return 4000 + bits * 100;
++}
++
++static u8 dcdec_voltage(unsigned int millivolts)
++{
++ if (millivolts < 900)
++ return 0;
++ else if (millivolts > 3300)
++ return 0x0f;
++
++ millivolts -= 900;
++ return millivolts/300;
++}
++
++static unsigned int dcdec_2voltage(u8 bits)
++{
++ bits &= 0x0f;
++ return 900 + bits*300;
++}
++
++static u8 dcdc_voltage(unsigned int millivolts)
++{
++ if (millivolts < 900)
++ return 0;
++ else if (millivolts > 3600)
++ return 0x1f;
++
++ if (millivolts < 1500) {
++ millivolts -= 900;
++ return millivolts/25;
++ } else {
++ millivolts -= 1500;
++ return 0x18 + millivolts/300;
++ }
++}
++
++static unsigned int dcdc_2voltage(u8 bits)
++{
++ bits &= 0x1f;
++ if ((bits & 0x18) == 0x18)
++ return 1500 + ((bits & 0x7) * 300);
++ else
++ return 900 + (bits * 25);
++}
++
++static u8 dx_voltage(unsigned int millivolts)
++{
++ if (millivolts < 900)
++ return 0;
++ else if (millivolts > 3300)
++ return 0x18;
++
++ millivolts -= 900;
++ return millivolts/100;
++}
++
++static unsigned int dx_2voltage(u8 bits)
++{
++ bits &= 0x1f;
++ return 900 + (bits * 100);
++}
++
++static int pcf50606_regulator_set_voltage(struct regulator_dev *rdev,
++ int min_uV, int max_uV)
++{
++ struct pcf50606 *pcf;
++ int regulator_id, millivolts, rc;
++ u8 volt_bits, regnr;
++
++ pcf = rdev_get_drvdata(rdev);
++
++ regulator_id = rdev_get_id(rdev);
++ if (regulator_id >= PCF50606_NUM_REGULATORS)
++ return -EINVAL;
++
++ millivolts = min_uV / 1000;
++
++ switch (regulator_id) {
++ case PCF50606_REGULATOR_DCD:
++ volt_bits = dcdc_voltage(millivolts);
++ rc = pcf50606_reg_set_bit_mask(pcf, PCF50606_REG_DCDC1, 0x1f,
++ volt_bits);
++ break;
++ case PCF50606_REGULATOR_DCDE:
++ volt_bits = dcdec_voltage(millivolts);
++ rc = pcf50606_reg_set_bit_mask(pcf, PCF50606_REG_DCDEC1, 0x0f,
++ volt_bits);
++ break;
++ case PCF50606_REGULATOR_DCUD:
++ volt_bits = dcudc_voltage(millivolts);
++ rc = pcf50606_reg_set_bit_mask(pcf, PCF50606_REG_DCUDC1, 0x1f,
++ volt_bits);
++ break;
++ case PCF50606_REGULATOR_D1REG:
++ case PCF50606_REGULATOR_D2REG:
++ case PCF50606_REGULATOR_D3REG:
++ regnr = PCF50606_REG_D1REGC1 +
++ (regulator_id - PCF50606_REGULATOR_D1REG);
++ volt_bits = dx_voltage(millivolts);
++ rc = pcf50606_reg_set_bit_mask(pcf, regnr, 0x1f, volt_bits);
++ break;
++ case PCF50606_REGULATOR_LPREG:
++ volt_bits = dx_voltage(millivolts);
++ rc = pcf50606_reg_set_bit_mask(pcf, PCF50606_REG_LPREGC1, 0x1f,
++ volt_bits);
++ break;
++ case PCF50606_REGULATOR_IOREG:
++ if (millivolts < 1800)
++ return -EINVAL;
++ volt_bits = dx_voltage(millivolts);
++ rc = pcf50606_reg_set_bit_mask(pcf, PCF50606_REG_IOREGC, 0x1f,
++ volt_bits);
++ break;
++ default:
++ return -EINVAL;
++ }
++
++ return rc;
++}
++
++static int pcf50606_regulator_get_voltage(struct regulator_dev *rdev)
++{
++ struct pcf50606 *pcf;
++ u8 volt_bits, regnr;
++ int rc = 0, regulator_id;
++
++
++ pcf = rdev_get_drvdata(rdev);
++
++ regulator_id = rdev_get_id(rdev);
++ if (regulator_id >= PCF50606_NUM_REGULATORS)
++ return -EINVAL;
++
++ switch (regulator_id) {
++ case PCF50606_REGULATOR_DCD:
++ volt_bits = pcf50606_reg_read(pcf, PCF50606_REG_DCDC1) & 0x1f;
++ rc = dcdc_2voltage(volt_bits);
++ break;
++ case PCF50606_REGULATOR_DCDE:
++ volt_bits = pcf50606_reg_read(pcf, PCF50606_REG_DCDEC1) & 0x0f;
++ rc = dcdec_2voltage(volt_bits);
++ break;
++ case PCF50606_REGULATOR_DCUD:
++ volt_bits = pcf50606_reg_read(pcf, PCF50606_REG_DCUDC1) & 0x1f;
++ rc = dcudc_2voltage(volt_bits);
++ break;
++ case PCF50606_REGULATOR_D1REG:
++ case PCF50606_REGULATOR_D2REG:
++ case PCF50606_REGULATOR_D3REG:
++ regnr = PCF50606_REG_D1REGC1 + (regulator_id - PCF50606_REGULATOR_D1REG);
++ volt_bits = pcf50606_reg_read(pcf, regnr) & 0x1f;
++ if (volt_bits > 0x18)
++ volt_bits = 0x18;
++ rc = dx_2voltage(volt_bits);
++ break;
++ case PCF50606_REGULATOR_LPREG:
++ volt_bits = pcf50606_reg_read(pcf, PCF50606_REG_LPREGC1) & 0x1f;
++ if (volt_bits > 0x18)
++ volt_bits = 0x18;
++ rc = dx_2voltage(volt_bits);
++ break;
++ case PCF50606_REGULATOR_IOREG:
++ volt_bits = pcf50606_reg_read(pcf, PCF50606_REG_IOREGC) & 0x1f;
++ if (volt_bits > 0x18)
++ volt_bits = 0x18;
++ rc = dx_2voltage(volt_bits);
++ break;
++ default:
++ return -EINVAL;
++ }
++
++ return rc * 1000;
++
++}
++
++static int pcf50606_regulator_enable(struct regulator_dev *rdev)
++{
++ struct pcf50606 *pcf = rdev_get_drvdata(rdev);
++ int regulator_id;
++ u8 regnr;
++
++ regulator_id = rdev_get_id(rdev);
++ if (regulator_id >= PCF50606_NUM_REGULATORS)
++ return -EINVAL;
++
++ regnr = pcf50606_regulator_registers[regulator_id];
++
++ return pcf50606_reg_set_bit_mask(pcf, regnr, 0xe0, 0xe0);
++}
++
++static int pcf50606_regulator_disable(struct regulator_dev *rdev)
++{
++ struct pcf50606 *pcf = rdev_get_drvdata(rdev);
++ int regulator_id;
++ u8 regnr;
++
++ regulator_id = rdev_get_id(rdev);
++ if (regulator_id >= PCF50606_NUM_REGULATORS)
++ return -EINVAL;
++
++ /* IOREG cannot be powered off since it powers the PMU I2C */
++ if (regulator_id == PCF50606_REGULATOR_IOREG)
++ return -EINVAL;
++
++ regnr = pcf50606_regulator_registers[regulator_id];
++
++ return pcf50606_reg_set_bit_mask(pcf, regnr, 0xe0, 0);
++}
++
++static int pcf50606_regulator_is_enabled(struct regulator_dev *rdev)
++{
++ struct pcf50606 *pcf = rdev_get_drvdata(rdev);
++ int regulator_id = rdev_get_id(rdev);
++ u8 regnr, val;
++
++ regulator_id = rdev_get_id(rdev);
++ if (regulator_id >= PCF50606_NUM_REGULATORS)
++ return -EINVAL;
++
++ /* the *ENA register is always one after the *OUT register */
++ regnr = pcf50606_regulator_registers[regulator_id];
++ val = (pcf50606_reg_read(pcf, regnr) & 0xe0) >> 5;
++
++ /* PWREN1 = 1, PWREN2 = 1, see table 16 of datasheet */
++ if (val == 0 || val == 5)
++ return 0;
++
++ return 1;
++}
++
++static struct regulator_ops pcf50606_regulator_ops = {
++ .set_voltage = pcf50606_regulator_set_voltage,
++ .get_voltage = pcf50606_regulator_get_voltage,
++ .enable = pcf50606_regulator_enable,
++ .disable = pcf50606_regulator_disable,
++ .is_enabled = pcf50606_regulator_is_enabled,
++};
++
++static struct regulator_desc regulators[] = {
++ [PCF50606_REGULATOR_DCD] =
++ PCF50606_REGULATOR("dcd", PCF50606_REGULATOR_DCD),
++ [PCF50606_REGULATOR_DCDE] =
++ PCF50606_REGULATOR("dcde", PCF50606_REGULATOR_DCDE),
++ [PCF50606_REGULATOR_DCUD] =
++ PCF50606_REGULATOR("dcud", PCF50606_REGULATOR_DCUD),
++ [PCF50606_REGULATOR_D1REG] =
++ PCF50606_REGULATOR("d1reg", PCF50606_REGULATOR_D1REG),
++ [PCF50606_REGULATOR_D2REG] =
++ PCF50606_REGULATOR("d2reg", PCF50606_REGULATOR_D2REG),
++ [PCF50606_REGULATOR_D3REG] =
++ PCF50606_REGULATOR("d3reg", PCF50606_REGULATOR_D3REG),
++ [PCF50606_REGULATOR_LPREG] =
++ PCF50606_REGULATOR("lpreg", PCF50606_REGULATOR_LPREG),
++ [PCF50606_REGULATOR_IOREG] =
++ PCF50606_REGULATOR("ioreg", PCF50606_REGULATOR_IOREG),
++};
++
++static int __devinit pcf50606_regulator_probe(struct platform_device *pdev)
++{
++ struct regulator_dev *rdev;
++ struct pcf50606 *pcf;
++
++ /* Already set by core driver */
++ pcf = platform_get_drvdata(pdev);
++
++ rdev = regulator_register(&regulators[pdev->id], &pdev->dev, pcf);
++ if (IS_ERR(rdev))
++ return PTR_ERR(rdev);
++
++ if (pcf->pdata->regulator_registered)
++ pcf->pdata->regulator_registered(pcf, pdev->id);
++
++ return 0;
++}
++
++static int __devexit pcf50606_regulator_remove(struct platform_device *pdev)
++{
++ struct regulator_dev *rdev = platform_get_drvdata(pdev);
++
++ regulator_unregister(rdev);
++
++ return 0;
++}
++
++static struct platform_driver pcf50606_regulator_driver = {
++ .driver = {
++ .name = "pcf50606-regltr",
++ },
++ .probe = pcf50606_regulator_probe,
++ .remove = __devexit_p(pcf50606_regulator_remove),
++};
++
++static int __init pcf50606_regulator_init(void)
++{
++ return platform_driver_register(&pcf50606_regulator_driver);
++}
++module_init(pcf50606_regulator_init);
++
++static void __exit pcf50606_regulator_exit(void)
++{
++ platform_driver_unregister(&pcf50606_regulator_driver);
++}
++module_exit(pcf50606_regulator_exit);
++
++MODULE_AUTHOR("Balaji Rao <balajirrao@openmoko.org>");
++MODULE_DESCRIPTION("PCF50606 regulator driver");
++MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:pcf50606-regulator");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/rtc/Kconfig linux-2.6.29-rc3.owrt.om/drivers/rtc/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/rtc/Kconfig 2009-05-10 22:08:44.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/rtc/Kconfig 2009-05-10 22:28:00.000000000 +0200
+@@ -223,6 +223,13 @@
+ This driver can also be built as a module. If so, the module
+ will be called rtc-pcf8583.
+
++config RTC_DRV_PCF50606
++ depends on MFD_PCF50606
++ tristate "Philips PCF50606"
++ help
++ If you say yes here you get support for the Philips PCF50606
++ PMU's RTC.
++
+ config RTC_DRV_M41T80
+ tristate "ST M41T65/M41T80/81/82/83/84/85/87"
+ help
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/rtc/Makefile linux-2.6.29-rc3.owrt.om/drivers/rtc/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/rtc/Makefile 2009-05-10 22:08:44.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/rtc/Makefile 2009-05-10 22:28:00.000000000 +0200
+@@ -76,3 +76,4 @@
+ obj-$(CONFIG_RTC_DRV_WM8350) += rtc-wm8350.o
+ obj-$(CONFIG_RTC_DRV_X1205) += rtc-x1205.o
+ obj-$(CONFIG_RTC_DRV_PCF50633) += rtc-pcf50633.o
++obj-$(CONFIG_RTC_DRV_PCF50606) += rtc-pcf50606.o
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/rtc/rtc-pcf50606.c linux-2.6.29-rc3.owrt.om/drivers/rtc/rtc-pcf50606.c
+--- linux-2.6.29-rc3.owrt/drivers/rtc/rtc-pcf50606.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/rtc/rtc-pcf50606.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,335 @@
++/* NXP PCF50606 RTC Driver
++ *
++ * (C) 2006-2008 by Openmoko, Inc.
++ * Author: Balaji Rao <balajirrao@openmoko.org>
++ * All rights reserved.
++ *
++ * Broken down from monstrous PCF50606 driver mainly by
++ * Harald Welte, Andy Green and Werner Almesberger
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/device.h>
++#include <linux/platform_device.h>
++#include <linux/rtc.h>
++#include <linux/bcd.h>
++#include <linux/err.h>
++
++#include <linux/mfd/pcf50606/core.h>
++
++#define PCF50606_REG_RTCSC 0x0a /* Second */
++#define PCF50606_REG_RTCMN 0x0b /* Minute */
++#define PCF50606_REG_RTCHR 0x0c /* Hour */
++#define PCF50606_REG_RTCWD 0x0d /* Weekday */
++#define PCF50606_REG_RTCDT 0x0e /* Day */
++#define PCF50606_REG_RTCMT 0x0f /* Month */
++#define PCF50606_REG_RTCYR 0x10 /* Year */
++#define PCF50606_REG_RTCSCA 0x11 /* Alarm Second */
++#define PCF50606_REG_RTCMNA 0x12 /* Alarm Minute */
++#define PCF50606_REG_RTCHRA 0x13 /* Alarm Hour */
++#define PCF50606_REG_RTCWDA 0x14 /* Alarm Weekday */
++#define PCF50606_REG_RTCDTA 0x15 /* Alarm Day */
++#define PCF50606_REG_RTCMTA 0x16 /* Alarm Month */
++#define PCF50606_REG_RTCYRA 0x17 /* Alarm Year */
++
++enum pcf50606_time_indexes {
++ PCF50606_TI_SEC,
++ PCF50606_TI_MIN,
++ PCF50606_TI_HOUR,
++ PCF50606_TI_WKDAY,
++ PCF50606_TI_DAY,
++ PCF50606_TI_MONTH,
++ PCF50606_TI_YEAR,
++ PCF50606_TI_EXTENT /* always last */
++};
++
++struct pcf50606_time {
++ u_int8_t time[PCF50606_TI_EXTENT];
++};
++
++struct pcf50606_rtc {
++ int alarm_enabled;
++ int second_enabled;
++
++ struct pcf50606 *pcf;
++ struct rtc_device *rtc_dev;
++};
++
++static void pcf2rtc_time(struct rtc_time *rtc, struct pcf50606_time *pcf)
++{
++ rtc->tm_sec = bcd2bin(pcf->time[PCF50606_TI_SEC]);
++ rtc->tm_min = bcd2bin(pcf->time[PCF50606_TI_MIN]);
++ rtc->tm_hour = bcd2bin(pcf->time[PCF50606_TI_HOUR]);
++ rtc->tm_wday = bcd2bin(pcf->time[PCF50606_TI_WKDAY]);
++ rtc->tm_mday = bcd2bin(pcf->time[PCF50606_TI_DAY]);
++ rtc->tm_mon = bcd2bin(pcf->time[PCF50606_TI_MONTH]) - 1;
++ rtc->tm_year = bcd2bin(pcf->time[PCF50606_TI_YEAR]) + 100;
++}
++
++static void rtc2pcf_time(struct pcf50606_time *pcf, struct rtc_time *rtc)
++{
++ pcf->time[PCF50606_TI_SEC] = bin2bcd(rtc->tm_sec);
++ pcf->time[PCF50606_TI_MIN] = bin2bcd(rtc->tm_min);
++ pcf->time[PCF50606_TI_HOUR] = bin2bcd(rtc->tm_hour);
++ pcf->time[PCF50606_TI_WKDAY] = bin2bcd(rtc->tm_wday);
++ pcf->time[PCF50606_TI_DAY] = bin2bcd(rtc->tm_mday);
++ pcf->time[PCF50606_TI_MONTH] = bin2bcd(rtc->tm_mon + 1);
++ pcf->time[PCF50606_TI_YEAR] = bin2bcd(rtc->tm_year % 100);
++}
++
++static int
++pcf50606_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
++{
++ struct pcf50606_rtc *rtc = dev_get_drvdata(dev);
++
++ switch (cmd) {
++ case RTC_AIE_OFF:
++ rtc->alarm_enabled = 0;
++ pcf50606_irq_mask(rtc->pcf, PCF50606_IRQ_ALARM);
++ return 0;
++ case RTC_AIE_ON:
++ rtc->alarm_enabled = 1;
++ pcf50606_irq_unmask(rtc->pcf, PCF50606_IRQ_ALARM);
++ return 0;
++ case RTC_UIE_OFF:
++ rtc->second_enabled = 0;
++ pcf50606_irq_mask(rtc->pcf, PCF50606_IRQ_SECOND);
++ return 0;
++ case RTC_UIE_ON:
++ rtc->second_enabled = 1;
++ pcf50606_irq_unmask(rtc->pcf, PCF50606_IRQ_SECOND);
++ return 0;
++ }
++
++ return -ENOIOCTLCMD;
++}
++
++static int pcf50606_rtc_read_time(struct device *dev, struct rtc_time *tm)
++{
++ struct pcf50606_rtc *rtc;
++ struct pcf50606_time pcf_tm;
++ int ret;
++
++ rtc = dev_get_drvdata(dev);
++
++ ret = pcf50606_read_block(rtc->pcf, PCF50606_REG_RTCSC,
++ PCF50606_TI_EXTENT,
++ &pcf_tm.time[0]);
++ if (ret != PCF50606_TI_EXTENT) {
++ dev_err(dev, "Failed to read time\n");
++ return -EIO;
++ }
++
++ dev_dbg(dev, "PCF_TIME: %02x.%02x.%02x %02x:%02x:%02x\n",
++ pcf_tm.time[PCF50606_TI_DAY],
++ pcf_tm.time[PCF50606_TI_MONTH],
++ pcf_tm.time[PCF50606_TI_YEAR],
++ pcf_tm.time[PCF50606_TI_HOUR],
++ pcf_tm.time[PCF50606_TI_MIN],
++ pcf_tm.time[PCF50606_TI_SEC]);
++
++ pcf2rtc_time(tm, &pcf_tm);
++
++ dev_dbg(dev, "RTC_TIME: %u.%u.%u %u:%u:%u\n",
++ tm->tm_mday, tm->tm_mon, tm->tm_year,
++ tm->tm_hour, tm->tm_min, tm->tm_sec);
++
++ return rtc_valid_tm(tm);
++}
++
++static int pcf50606_rtc_set_time(struct device *dev, struct rtc_time *tm)
++{
++ struct pcf50606_rtc *rtc;
++ struct pcf50606_time pcf_tm;
++ int second_masked, alarm_masked, ret = 0;
++
++ rtc = dev_get_drvdata(dev);
++
++ dev_dbg(dev, "RTC_TIME: %u.%u.%u %u:%u:%u\n",
++ tm->tm_mday, tm->tm_mon, tm->tm_year,
++ tm->tm_hour, tm->tm_min, tm->tm_sec);
++
++ rtc2pcf_time(&pcf_tm, tm);
++
++ dev_dbg(dev, "PCF_TIME: %02x.%02x.%02x %02x:%02x:%02x\n",
++ pcf_tm.time[PCF50606_TI_DAY],
++ pcf_tm.time[PCF50606_TI_MONTH],
++ pcf_tm.time[PCF50606_TI_YEAR],
++ pcf_tm.time[PCF50606_TI_HOUR],
++ pcf_tm.time[PCF50606_TI_MIN],
++ pcf_tm.time[PCF50606_TI_SEC]);
++
++
++ second_masked = pcf50606_irq_mask_get(rtc->pcf, PCF50606_IRQ_SECOND);
++ alarm_masked = pcf50606_irq_mask_get(rtc->pcf, PCF50606_IRQ_ALARM);
++
++ if (!second_masked)
++ pcf50606_irq_mask(rtc->pcf, PCF50606_IRQ_SECOND);
++ if (!alarm_masked)
++ pcf50606_irq_mask(rtc->pcf, PCF50606_IRQ_ALARM);
++
++ /* Returns 0 on success */
++ ret = pcf50606_write_block(rtc->pcf, PCF50606_REG_RTCSC,
++ PCF50606_TI_EXTENT,
++ &pcf_tm.time[0]);
++
++ if (!second_masked)
++ pcf50606_irq_unmask(rtc->pcf, PCF50606_IRQ_SECOND);
++ if (!alarm_masked)
++ pcf50606_irq_unmask(rtc->pcf, PCF50606_IRQ_ALARM);
++
++ return ret;
++}
++
++static int pcf50606_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
++{
++ struct pcf50606_rtc *rtc;
++ struct pcf50606_time pcf_tm;
++ int ret = 0;
++
++ rtc = dev_get_drvdata(dev);
++
++ alrm->enabled = rtc->alarm_enabled;
++
++ ret = pcf50606_read_block(rtc->pcf, PCF50606_REG_RTCSCA,
++ PCF50606_TI_EXTENT, &pcf_tm.time[0]);
++ if (ret != PCF50606_TI_EXTENT) {
++ dev_err(dev, "Failed to read time\n");
++ return -EIO;
++ }
++
++ pcf2rtc_time(&alrm->time, &pcf_tm);
++
++ return rtc_valid_tm(&alrm->time);
++}
++
++static int pcf50606_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
++{
++ struct pcf50606_rtc *rtc;
++ struct pcf50606_time pcf_tm;
++ int alarm_masked, ret = 0;
++
++ rtc = dev_get_drvdata(dev);
++
++ rtc2pcf_time(&pcf_tm, &alrm->time);
++
++ /* do like mktime does and ignore tm_wday */
++ pcf_tm.time[PCF50606_TI_WKDAY] = 7;
++
++ alarm_masked = pcf50606_irq_mask_get(rtc->pcf, PCF50606_IRQ_ALARM);
++
++ /* disable alarm interrupt */
++ if (!alarm_masked)
++ pcf50606_irq_mask(rtc->pcf, PCF50606_IRQ_ALARM);
++
++ /* Returns 0 on success */
++ ret = pcf50606_write_block(rtc->pcf, PCF50606_REG_RTCSCA,
++ PCF50606_TI_EXTENT, &pcf_tm.time[0]);
++
++ if (!alarm_masked)
++ pcf50606_irq_unmask(rtc->pcf, PCF50606_IRQ_ALARM);
++
++ return ret;
++}
++
++static struct rtc_class_ops pcf50606_rtc_ops = {
++ .ioctl = pcf50606_rtc_ioctl,
++ .read_time = pcf50606_rtc_read_time,
++ .set_time = pcf50606_rtc_set_time,
++ .read_alarm = pcf50606_rtc_read_alarm,
++ .set_alarm = pcf50606_rtc_set_alarm,
++};
++
++static void pcf50606_rtc_irq(int irq, void *data)
++{
++ struct pcf50606_rtc *rtc = data;
++
++ switch (irq) {
++ case PCF50606_IRQ_ALARM:
++ rtc_update_irq(rtc->rtc_dev, 1, RTC_AF | RTC_IRQF);
++ break;
++ case PCF50606_IRQ_SECOND:
++ rtc_update_irq(rtc->rtc_dev, 1, RTC_UF | RTC_IRQF);
++ break;
++ }
++}
++
++static int __devinit pcf50606_rtc_probe(struct platform_device *pdev)
++{
++ struct pcf50606_subdev_pdata *pdata;
++ struct pcf50606_rtc *rtc;
++
++
++ rtc = kzalloc(sizeof(*rtc), GFP_KERNEL);
++ if (!rtc)
++ return -ENOMEM;
++
++ pdata = pdev->dev.platform_data;
++ rtc->pcf = pdata->pcf;
++ platform_set_drvdata(pdev, rtc);
++ rtc->rtc_dev = rtc_device_register("pcf50606-rtc", &pdev->dev,
++ &pcf50606_rtc_ops, THIS_MODULE);
++
++ if (IS_ERR(rtc->rtc_dev)) {
++ kfree(rtc);
++ return PTR_ERR(rtc->rtc_dev);
++ }
++
++ pcf50606_register_irq(rtc->pcf, PCF50606_IRQ_ALARM,
++ pcf50606_rtc_irq, rtc);
++ pcf50606_register_irq(rtc->pcf, PCF50606_IRQ_SECOND,
++ pcf50606_rtc_irq, rtc);
++
++ return 0;
++}
++
++
++static int __devexit pcf50606_rtc_remove(struct platform_device *pdev)
++{
++ struct pcf50606_rtc *rtc;
++
++ rtc = platform_get_drvdata(pdev);
++
++ pcf50606_free_irq(rtc->pcf, PCF50606_IRQ_ALARM);
++ pcf50606_free_irq(rtc->pcf, PCF50606_IRQ_SECOND);
++
++ rtc_device_unregister(rtc->rtc_dev);
++
++ kfree(rtc);
++
++ return 0;
++}
++
++
++static struct platform_driver pcf50606_rtc_driver = {
++ .driver = {
++ .name = "pcf50606-rtc",
++ },
++ .probe = pcf50606_rtc_probe,
++ .remove = __devexit_p(pcf50606_rtc_remove),
++};
++
++static int __init pcf50606_rtc_init(void)
++{
++ return platform_driver_register(&pcf50606_rtc_driver);
++}
++module_init(pcf50606_rtc_init);
++
++static void __exit pcf50606_rtc_exit(void)
++{
++ platform_driver_unregister(&pcf50606_rtc_driver);
++}
++module_exit(pcf50606_rtc_exit);
++
++MODULE_DESCRIPTION("PCF50606 RTC driver");
++MODULE_AUTHOR("Balaji Rao <balajirrao@openmoko.org>");
++MODULE_LICENSE("GPL");
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/rtc/rtc-pcf50633.c linux-2.6.29-rc3.owrt.om/drivers/rtc/rtc-pcf50633.c
+--- linux-2.6.29-rc3.owrt/drivers/rtc/rtc-pcf50633.c 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/rtc/rtc-pcf50633.c 2009-05-10 22:28:00.000000000 +0200
+@@ -58,6 +58,7 @@
+ struct pcf50633_rtc {
+ int alarm_enabled;
+ int second_enabled;
++ int alarm_pending;
+
+ struct pcf50633 *pcf;
+ struct rtc_device *rtc_dev;
+@@ -70,7 +71,7 @@
+ rtc->tm_hour = bcd2bin(pcf->time[PCF50633_TI_HOUR]);
+ rtc->tm_wday = bcd2bin(pcf->time[PCF50633_TI_WKDAY]);
+ rtc->tm_mday = bcd2bin(pcf->time[PCF50633_TI_DAY]);
+- rtc->tm_mon = bcd2bin(pcf->time[PCF50633_TI_MONTH]);
++ rtc->tm_mon = bcd2bin(pcf->time[PCF50633_TI_MONTH]) - 1;
+ rtc->tm_year = bcd2bin(pcf->time[PCF50633_TI_YEAR]) + 100;
+ }
+
+@@ -81,7 +82,7 @@
+ pcf->time[PCF50633_TI_HOUR] = bin2bcd(rtc->tm_hour);
+ pcf->time[PCF50633_TI_WKDAY] = bin2bcd(rtc->tm_wday);
+ pcf->time[PCF50633_TI_DAY] = bin2bcd(rtc->tm_mday);
+- pcf->time[PCF50633_TI_MONTH] = bin2bcd(rtc->tm_mon);
++ pcf->time[PCF50633_TI_MONTH] = bin2bcd(rtc->tm_mon + 1);
+ pcf->time[PCF50633_TI_YEAR] = bin2bcd(rtc->tm_year % 100);
+ }
+
+@@ -209,6 +210,7 @@
+ rtc = dev_get_drvdata(dev);
+
+ alrm->enabled = rtc->alarm_enabled;
++ alrm->pending = rtc->alarm_pending;
+
+ ret = pcf50633_read_block(rtc->pcf, PCF50633_REG_RTCSCA,
+ PCF50633_TI_EXTENT, &pcf_tm.time[0]);
+@@ -244,9 +246,12 @@
+ /* Returns 0 on success */
+ ret = pcf50633_write_block(rtc->pcf, PCF50633_REG_RTCSCA,
+ PCF50633_TI_EXTENT, &pcf_tm.time[0]);
++ if (!alrm->enabled)
++ rtc->alarm_pending = 0;
+
+- if (!alarm_masked)
++ if (!alarm_masked || alrm->enabled)
+ pcf50633_irq_unmask(rtc->pcf, PCF50633_IRQ_ALARM);
++ rtc->alarm_enabled = alrm->enabled;
+
+ return ret;
+ }
+@@ -267,6 +272,7 @@
+ switch (irq) {
+ case PCF50633_IRQ_ALARM:
+ rtc_update_irq(rtc->rtc_dev, 1, RTC_AF | RTC_IRQF);
++ rtc->alarm_pending = 1;
+ break;
+ case PCF50633_IRQ_SECOND:
+ rtc_update_irq(rtc->rtc_dev, 1, RTC_UF | RTC_IRQF);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/serial/s3c2410.c linux-2.6.29-rc3.owrt.om/drivers/serial/s3c2410.c
+--- linux-2.6.29-rc3.owrt/drivers/serial/s3c2410.c 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/serial/s3c2410.c 2009-05-10 22:28:00.000000000 +0200
+@@ -19,6 +19,7 @@
+ #include <linux/serial.h>
+
+ #include <asm/irq.h>
++
+ #include <mach/hardware.h>
+
+ #include <plat/regs-serial.h>
+@@ -85,6 +86,7 @@
+
+ static int s3c2410_serial_probe(struct platform_device *dev)
+ {
++ dbg("s3c2410_serial_probe: dev=%p\n", dev);
+ return s3c24xx_serial_probe(dev, &s3c2410_uart_inf);
+ }
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/serial/s3c6400.c linux-2.6.29-rc3.owrt.om/drivers/serial/s3c6400.c
+--- linux-2.6.29-rc3.owrt/drivers/serial/s3c6400.c 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/serial/s3c6400.c 2009-05-10 22:28:00.000000000 +0200
+@@ -102,6 +102,7 @@
+ .name = "Samsung S3C6400 UART",
+ .type = PORT_S3C6400,
+ .fifosize = 64,
++ .has_divslot = 1,
+ .rx_fifomask = S3C2440_UFSTAT_RXMASK,
+ .rx_fifoshift = S3C2440_UFSTAT_RXSHIFT,
+ .rx_fifofull = S3C2440_UFSTAT_RXFULL,
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/serial/samsung.c linux-2.6.29-rc3.owrt.om/drivers/serial/samsung.c
+--- linux-2.6.29-rc3.owrt/drivers/serial/samsung.c 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/serial/samsung.c 2009-05-10 22:28:00.000000000 +0200
+@@ -50,6 +50,10 @@
+ #include <mach/map.h>
+
+ #include <plat/regs-serial.h>
++#if defined(CONFIG_MACH_NEO1973) && !defined(CONFIG_CPU_S3C6410)
++#include <mach/regs-gpio.h>
++#include <mach/regs-clock.h>
++#endif
+
+ #include "samsung.h"
+
+@@ -235,8 +239,8 @@
+ port->icount.rx++;
+
+ if (unlikely(uerstat & S3C2410_UERSTAT_ANY)) {
+- dbg("rxerr: port ch=0x%02x, rxs=0x%08x\n",
+- ch, uerstat);
++ printk(KERN_DEBUG "rxerr: port=%d ch=0x%02x, rxs=0x%08x\n",
++ port->line, ch, uerstat);
+
+ /* check for break */
+ if (uerstat & S3C2410_UERSTAT_BREAK) {
+@@ -265,8 +269,8 @@
+ if (uart_handle_sysrq_char(port, ch))
+ goto ignore_char;
+
+- uart_insert_char(port, uerstat, S3C2410_UERSTAT_OVERRUN,
+- ch, flag);
++ if ((uerstat & port->ignore_status_mask & ~S3C2410_UERSTAT_OVERRUN) == 0)
++ tty_insert_flip_char(tty, ch, flag);
+
+ ignore_char:
+ continue;
+@@ -508,6 +512,7 @@
+ struct baud_calc {
+ struct s3c24xx_uart_clksrc *clksrc;
+ unsigned int calc;
++ unsigned int divslot;
+ unsigned int quot;
+ struct clk *src;
+ };
+@@ -517,6 +522,7 @@
+ struct s3c24xx_uart_clksrc *clksrc,
+ unsigned int baud)
+ {
++ struct s3c24xx_uart_port *ourport = to_ourport(port);
+ unsigned long rate;
+
+ calc->src = clk_get(port->dev, clksrc->name);
+@@ -527,8 +533,24 @@
+ rate /= clksrc->divisor;
+
+ calc->clksrc = clksrc;
+- calc->quot = (rate + (8 * baud)) / (16 * baud);
+- calc->calc = (rate / (calc->quot * 16));
++
++ if (ourport->info->has_divslot) {
++ unsigned long div = rate / baud;
++
++ /* The UDIVSLOT register on the newer UARTs allows us to
++ * get a divisor adjustment of 1/16th on the baud clock.
++ *
++ * We don't keep the UDIVSLOT value (the 16ths we calculated
++ * by not multiplying the baud by 16) as it is easy enough
++ * to recalculate.
++ */
++
++ calc->quot = div / 16;
++ calc->calc = rate / div;
++ } else {
++ calc->quot = (rate + (8 * baud)) / (16 * baud);
++ calc->calc = (rate / (calc->quot * 16));
++ }
+
+ calc->quot--;
+ return 1;
+@@ -611,6 +633,30 @@
+ return best->quot;
+ }
+
++/* udivslot_table[]
++ *
++ * This table takes the fractional value of the baud divisor and gives
++ * the recommended setting for the UDIVSLOT register.
++ */
++static u16 udivslot_table[16] = {
++ [0] = 0x0000,
++ [1] = 0x0080,
++ [2] = 0x0808,
++ [3] = 0x0888,
++ [4] = 0x2222,
++ [5] = 0x4924,
++ [6] = 0x4A52,
++ [7] = 0x54AA,
++ [8] = 0x5555,
++ [9] = 0xD555,
++ [10] = 0xD5D5,
++ [11] = 0xDDD5,
++ [12] = 0xDDDD,
++ [13] = 0xDFDD,
++ [14] = 0xDFDF,
++ [15] = 0xFFDF,
++};
++
+ static void s3c24xx_serial_set_termios(struct uart_port *port,
+ struct ktermios *termios,
+ struct ktermios *old)
+@@ -623,6 +669,7 @@
+ unsigned int baud, quot;
+ unsigned int ulcon;
+ unsigned int umcon;
++ unsigned int udivslot = 0;
+
+ /*
+ * We don't support modem control lines.
+@@ -644,6 +691,7 @@
+ /* check to see if we need to change clock source */
+
+ if (ourport->clksrc != clksrc || ourport->baudclk != clk) {
++ dbg("selecting clock %p\n", clk);
+ s3c24xx_serial_setsource(port, clksrc);
+
+ if (ourport->baudclk != NULL && !IS_ERR(ourport->baudclk)) {
+@@ -658,6 +706,13 @@
+ ourport->baudclk_rate = clk ? clk_get_rate(clk) : 0;
+ }
+
++ if (ourport->info->has_divslot) {
++ unsigned int div = ourport->baudclk_rate / baud;
++
++ udivslot = udivslot_table[div & 15];
++ dbg("udivslot = %04x (div %d)\n", udivslot, div & 15);
++ }
++
+ switch (termios->c_cflag & CSIZE) {
+ case CS5:
+ dbg("config: 5bits/char\n");
+@@ -697,12 +752,16 @@
+
+ spin_lock_irqsave(&port->lock, flags);
+
+- dbg("setting ulcon to %08x, brddiv to %d\n", ulcon, quot);
++ dbg("setting ulcon to %08x, brddiv to %d, udivslot %08x\n",
++ ulcon, quot, udivslot);
+
+ wr_regl(port, S3C2410_ULCON, ulcon);
+ wr_regl(port, S3C2410_UBRDIV, quot);
+ wr_regl(port, S3C2410_UMCON, umcon);
+
++ if (ourport->info->has_divslot)
++ wr_regl(port, S3C2443_DIVSLOT, udivslot);
++
+ dbg("uart: ulcon = 0x%08x, ucon = 0x%08x, ufcon = 0x%08x\n",
+ rd_regl(port, S3C2410_ULCON),
+ rd_regl(port, S3C2410_UCON),
+@@ -887,6 +946,70 @@
+ #endif
+ };
+
++#ifdef CONFIG_MACH_NEO1973_GTA02
++static void s3c24xx_serial_force_debug_port_up(void)
++{
++ struct s3c24xx_uart_port *ourport = &s3c24xx_serial_ports[
++ CONFIG_DEBUG_S3C_UART];
++ struct s3c24xx_uart_clksrc *clksrc = NULL;
++ struct clk *clk = NULL;
++ unsigned long tmp;
++
++ s3c24xx_serial_getclk(&ourport->port, &clksrc, &clk, 115200);
++
++ tmp = __raw_readl(S3C2410_CLKCON);
++
++ /* re-start uart clocks */
++ tmp |= S3C2410_CLKCON_UART0;
++ tmp |= S3C2410_CLKCON_UART1;
++ tmp |= S3C2410_CLKCON_UART2;
++
++ __raw_writel(tmp, S3C2410_CLKCON);
++ udelay(10);
++
++ s3c24xx_serial_setsource(&ourport->port, clksrc);
++
++ if (ourport->baudclk != NULL && !IS_ERR(ourport->baudclk)) {
++ clk_disable(ourport->baudclk);
++ ourport->baudclk = NULL;
++ }
++
++ clk_enable(clk);
++
++ ourport->clksrc = clksrc;
++ ourport->baudclk = clk;
++}
++
++static void s3c2410_printascii(const char *sz)
++{
++ struct s3c24xx_uart_port *ourport = &s3c24xx_serial_ports[
++ CONFIG_DEBUG_S3C_UART];
++ struct uart_port *port = &ourport->port;
++
++ /* 8 N 1 */
++ wr_regl(port, S3C2410_ULCON, (rd_regl(port, S3C2410_ULCON)) | 3);
++ /* polling mode */
++ wr_regl(port, S3C2410_UCON, (rd_regl(port, S3C2410_UCON) & ~0xc0f) | 5);
++ /* disable FIFO */
++ wr_regl(port, S3C2410_UFCON, (rd_regl(port, S3C2410_UFCON) & ~0x01));
++ /* fix baud rate */
++ wr_regl(port, S3C2410_UBRDIV, 26);
++
++ while (*sz) {
++ int timeout = 10000000;
++
++ /* spin on it being busy */
++ while ((!(rd_regl(port, S3C2410_UTRSTAT) & 2)) && timeout--)
++ ;
++
++ /* transmit register */
++ wr_regl(port, S3C2410_UTXH, *sz);
++
++ sz++;
++ }
++}
++#endif
++
+ /* s3c24xx_serial_resetport
+ *
+ * wrapper to call the specific reset for this port (reset the fifos
+@@ -937,13 +1060,17 @@
+ struct ktermios *termios;
+ struct tty_struct *tty;
+
+- if (uport->info == NULL)
++ if (uport->info == NULL) {
++ printk(KERN_WARNING "%s: info NULL\n", __func__);
+ goto exit;
++ }
+
+ tty = uport->info->port.tty;
+
+- if (tty == NULL)
++ if (tty == NULL) {
++ printk(KERN_WARNING "%s: tty is NULL\n", __func__);
+ goto exit;
++ }
+
+ termios = tty->termios;
+
+@@ -1092,6 +1219,7 @@
+
+ ourport = &s3c24xx_serial_ports[probe_index];
+ probe_index++;
++ init_resume_dependency_list(&ourport->resume_dependency);
+
+ dbg("%s: initialising port %p...\n", __func__, ourport);
+
+@@ -1148,6 +1276,16 @@
+ return 0;
+ }
+
++void s3c24xx_serial_register_resume_dependency(struct resume_dependency *
++ resume_dependency, int uart_index)
++{
++ struct s3c24xx_uart_port *ourport = &s3c24xx_serial_ports[uart_index];
++
++ register_resume_dependency(&ourport->resume_dependency,
++ resume_dependency);
++}
++EXPORT_SYMBOL(s3c24xx_serial_register_resume_dependency);
++
+ static int s3c24xx_serial_resume(struct platform_device *dev)
+ {
+ struct uart_port *port = s3c24xx_dev_to_port(&dev->dev);
+@@ -1159,6 +1297,9 @@
+ clk_disable(ourport->clk);
+
+ uart_resume_port(&s3c24xx_uart_drv, port);
++
++ callback_all_resume_dependencies(&ourport->resume_dependency);
++
+ }
+
+ return 0;
+@@ -1169,6 +1310,12 @@
+ struct s3c24xx_uart_info *info)
+ {
+ dbg("s3c24xx_serial_init(%p,%p)\n", drv, info);
++#ifdef CONFIG_MACH_NEO1973_GTA02
++ /* set up the emergency debug UART functions */
++
++ printk_emergency_debug_spew_init = s3c24xx_serial_force_debug_port_up;
++ printk_emergency_debug_spew_send_string = s3c2410_printascii;
++#endif
+
+ #ifdef CONFIG_PM
+ drv->suspend = s3c24xx_serial_suspend;
+@@ -1208,6 +1355,13 @@
+ #ifdef CONFIG_SERIAL_SAMSUNG_CONSOLE
+
+ static struct uart_port *cons_uart;
++static int cons_silenced;
++
++void s3c24xx_serial_console_set_silence(int silenced)
++{
++ cons_silenced = silenced;
++}
++EXPORT_SYMBOL(s3c24xx_serial_console_set_silence);
+
+ static int
+ s3c24xx_serial_console_txrdy(struct uart_port *port, unsigned int ufcon)
+@@ -1232,9 +1386,21 @@
+ s3c24xx_serial_console_putchar(struct uart_port *port, int ch)
+ {
+ unsigned int ufcon = rd_regl(cons_uart, S3C2410_UFCON);
++ unsigned int umcon = rd_regl(cons_uart, S3C2410_UMCON);
++
++ if (cons_silenced)
++ return;
++
++ /* If auto HW flow control enabled, temporarily turn it off */
++ if (umcon & S3C2410_UMCOM_AFC)
++ wr_regl(port, S3C2410_UMCON, (umcon & !S3C2410_UMCOM_AFC));
++
+ while (!s3c24xx_serial_console_txrdy(port, ufcon))
+ barrier();
+ wr_regb(cons_uart, S3C2410_UTXH, ch);
++
++ if (umcon & S3C2410_UMCOM_AFC)
++ wr_regl(port, S3C2410_UMCON, umcon);
+ }
+
+ static void
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/serial/samsung.h linux-2.6.29-rc3.owrt.om/drivers/serial/samsung.h
+--- linux-2.6.29-rc3.owrt/drivers/serial/samsung.h 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/serial/samsung.h 2009-05-10 22:28:00.000000000 +0200
+@@ -10,6 +10,8 @@
+ * published by the Free Software Foundation.
+ */
+
++#include <linux/resume-dependency.h>
++
+ struct s3c24xx_uart_info {
+ char *name;
+ unsigned int type;
+@@ -21,6 +23,10 @@
+ unsigned long tx_fifoshift;
+ unsigned long tx_fifofull;
+
++ /* uart port features */
++
++ unsigned int has_divslot:1;
++
+ /* clock source control */
+
+ int (*get_clksrc)(struct uart_port *, struct s3c24xx_uart_clksrc *clk);
+@@ -48,6 +54,8 @@
+ #ifdef CONFIG_CPU_FREQ
+ struct notifier_block freq_transition;
+ #endif
++
++ struct resume_dependency resume_dependency;
+ };
+
+ /* conversion functions */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/spi/Kconfig linux-2.6.29-rc3.owrt.om/drivers/spi/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/spi/Kconfig 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/spi/Kconfig 2009-05-10 22:28:00.000000000 +0200
+@@ -257,6 +257,15 @@
+ sysfs interface, with each line presented as a kind of GPIO
+ exposing both switch control and diagnostic feedback.
+
++config SPI_S3C64XX_GPIO
++ tristate "Samsung S3C64XX series SPI by GPIO"
++ depends on ARCH_S3C64XX && EXPERIMENTAL
++ select SPI_BITBANG
++ help
++ SPI driver for Samsung S3C64XX series ARM SoCs using
++ GPIO lines to provide the SPI bus. This can be used where
++ the inbuilt hardware cannot provide the transfer mode, or
++ where the board is using non hardware connected pins.
+ #
+ # Add new SPI protocol masters in alphabetical order above this line
+ #
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/spi/Makefile linux-2.6.29-rc3.owrt.om/drivers/spi/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/spi/Makefile 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/spi/Makefile 2009-05-10 22:28:00.000000000 +0200
+@@ -31,6 +31,7 @@
+ obj-$(CONFIG_SPI_TXX9) += spi_txx9.o
+ obj-$(CONFIG_SPI_XILINX) += xilinx_spi.o
+ obj-$(CONFIG_SPI_SH_SCI) += spi_sh_sci.o
++obj-$(CONFIG_SPI_S3C64XX_GPIO) += spi_s3c64xx_gpio.o
+ # ... add above this line ...
+
+ # SPI protocol drivers (device/link on bus)
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/spi/spi_bitbang.c linux-2.6.29-rc3.owrt.om/drivers/spi/spi_bitbang.c
+--- linux-2.6.29-rc3.owrt/drivers/spi/spi_bitbang.c 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/spi/spi_bitbang.c 2009-05-10 22:28:00.000000000 +0200
+@@ -264,6 +264,123 @@
+ * Drivers can provide word-at-a-time i/o primitives, or provide
+ * transfer-at-a-time ones to leverage dma or fifo hardware.
+ */
++
++/* Synchronous non blocking transfer */
++int
++spi_bitbang_transfer_sync(struct spi_device *spi, struct spi_message *m)
++{
++ struct spi_bitbang *bitbang = spi_master_get_devdata(spi->master);
++ struct spi_transfer *t;
++ unsigned long flags;
++ int cs_change = 1;
++ int status;
++ int nsecs;
++ int (*setup_transfer)(struct spi_device *, struct spi_transfer *);
++
++ /* FIXME this is made-up ... the correct value is known to
++ * word-at-a-time bitbang code, and presumably chipselect()
++ * should enforce these requirements too?
++ */
++ nsecs = 100;
++ cs_change = 1;
++ status = 0;
++ setup_transfer = NULL;
++
++ local_irq_save(flags);
++ list_for_each_entry (t, &m->transfers, transfer_list) {
++ /* override or restore speed and wordsize */
++ if (t->speed_hz || t->bits_per_word) {
++ setup_transfer = bitbang->setup_transfer;
++ if (!setup_transfer) {
++ status = -ENOPROTOOPT;
++ break;
++ }
++ }
++ if (setup_transfer) {
++ status = setup_transfer(spi, t);
++ if (status < 0)
++ break;
++ }
++
++ /* set up default clock polarity, and activate chip;
++ * this implicitly updates clock and spi modes as
++ * previously recorded for this device via setup().
++ * (and also deselects any other chip that might be
++ * selected ...)
++ */
++
++ if (cs_change) {
++ bitbang->chipselect(spi, BITBANG_CS_ACTIVE);
++ ndelay(nsecs);
++ }
++
++ cs_change = t->cs_change;
++ if (!t->tx_buf && !t->rx_buf && t->len) {
++ status = -EINVAL;
++ break;
++ }
++
++ /* transfer data. the lower level code handles any
++ * new dma mappings it needs. our caller always gave
++ * us dma-safe buffers.
++ */
++ if (t->len) {
++ /* REVISIT dma API still needs a designated
++ * DMA_ADDR_INVALID; ~0 might be better.
++ */
++ if (!m->is_dma_mapped)
++ t->rx_dma = t->tx_dma = 0;
++ status = bitbang->txrx_bufs(spi, t);
++ }
++
++ if (status > 0)
++ m->actual_length += status;
++ if (status != t->len) {
++ /* always report some kind of error */
++ if (status >= 0)
++ status = -EREMOTEIO;
++ break;
++ }
++ status = 0;
++ /* protocol tweaks before next transfer */
++ if (t->delay_usecs)
++ udelay(t->delay_usecs);
++ if (!cs_change)
++ continue;
++ if (t->transfer_list.next == &m->transfers)
++ break;
++ /* sometimes a short mid-message deselect of the chip
++ * may be needed to terminate a mode or command
++ */
++ ndelay(nsecs);
++ bitbang->chipselect(spi, BITBANG_CS_INACTIVE);
++ ndelay(nsecs);
++ }
++
++ m->status = status;
++ if (m->complete)
++ m->complete(m->context);
++
++ /* restore speed and wordsize */
++ if (setup_transfer)
++ setup_transfer(spi, NULL);
++
++ /* normally deactivate chipselect ... unless no error and
++ * cs_change has hinted that the next message will probably
++ * be for this chip too.
++ */
++ if (!(status == 0 && cs_change)) {
++ ndelay(nsecs);
++ bitbang->chipselect(spi, BITBANG_CS_INACTIVE);
++ ndelay(nsecs);
++ }
++
++ local_irq_restore(flags);
++
++ return status;
++}
++EXPORT_SYMBOL_GPL(spi_bitbang_transfer_sync);
++
+ static void bitbang_work(struct work_struct *work)
+ {
+ struct spi_bitbang *bitbang =
+@@ -274,120 +391,13 @@
+ bitbang->busy = 1;
+ while (!list_empty(&bitbang->queue)) {
+ struct spi_message *m;
+- struct spi_device *spi;
+- unsigned nsecs;
+- struct spi_transfer *t = NULL;
+- unsigned tmp;
+- unsigned cs_change;
+- int status;
+- int (*setup_transfer)(struct spi_device *,
+- struct spi_transfer *);
+
+ m = container_of(bitbang->queue.next, struct spi_message,
+ queue);
+ list_del_init(&m->queue);
+- spin_unlock_irqrestore(&bitbang->lock, flags);
+-
+- /* FIXME this is made-up ... the correct value is known to
+- * word-at-a-time bitbang code, and presumably chipselect()
+- * should enforce these requirements too?
+- */
+- nsecs = 100;
+-
+- spi = m->spi;
+- tmp = 0;
+- cs_change = 1;
+- status = 0;
+- setup_transfer = NULL;
+-
+- list_for_each_entry (t, &m->transfers, transfer_list) {
+-
+- /* override or restore speed and wordsize */
+- if (t->speed_hz || t->bits_per_word) {
+- setup_transfer = bitbang->setup_transfer;
+- if (!setup_transfer) {
+- status = -ENOPROTOOPT;
+- break;
+- }
+- }
+- if (setup_transfer) {
+- status = setup_transfer(spi, t);
+- if (status < 0)
+- break;
+- }
+-
+- /* set up default clock polarity, and activate chip;
+- * this implicitly updates clock and spi modes as
+- * previously recorded for this device via setup().
+- * (and also deselects any other chip that might be
+- * selected ...)
+- */
+- if (cs_change) {
+- bitbang->chipselect(spi, BITBANG_CS_ACTIVE);
+- ndelay(nsecs);
+- }
+- cs_change = t->cs_change;
+- if (!t->tx_buf && !t->rx_buf && t->len) {
+- status = -EINVAL;
+- break;
+- }
+-
+- /* transfer data. the lower level code handles any
+- * new dma mappings it needs. our caller always gave
+- * us dma-safe buffers.
+- */
+- if (t->len) {
+- /* REVISIT dma API still needs a designated
+- * DMA_ADDR_INVALID; ~0 might be better.
+- */
+- if (!m->is_dma_mapped)
+- t->rx_dma = t->tx_dma = 0;
+- status = bitbang->txrx_bufs(spi, t);
+- }
+- if (status > 0)
+- m->actual_length += status;
+- if (status != t->len) {
+- /* always report some kind of error */
+- if (status >= 0)
+- status = -EREMOTEIO;
+- break;
+- }
+- status = 0;
+-
+- /* protocol tweaks before next transfer */
+- if (t->delay_usecs)
+- udelay(t->delay_usecs);
+-
+- if (!cs_change)
+- continue;
+- if (t->transfer_list.next == &m->transfers)
+- break;
+-
+- /* sometimes a short mid-message deselect of the chip
+- * may be needed to terminate a mode or command
+- */
+- ndelay(nsecs);
+- bitbang->chipselect(spi, BITBANG_CS_INACTIVE);
+- ndelay(nsecs);
+- }
+-
+- m->status = status;
+- m->complete(m->context);
+-
+- /* restore speed and wordsize */
+- if (setup_transfer)
+- setup_transfer(spi, NULL);
+-
+- /* normally deactivate chipselect ... unless no error and
+- * cs_change has hinted that the next message will probably
+- * be for this chip too.
+- */
+- if (!(status == 0 && cs_change)) {
+- ndelay(nsecs);
+- bitbang->chipselect(spi, BITBANG_CS_INACTIVE);
+- ndelay(nsecs);
+- }
+
++ spin_unlock_irqrestore(&bitbang->lock, flags);
++ spi_bitbang_transfer_sync(m->spi, m);
+ spin_lock_irqsave(&bitbang->lock, flags);
+ }
+ bitbang->busy = 0;
+@@ -459,6 +469,9 @@
+
+ if (!bitbang->master->transfer)
+ bitbang->master->transfer = spi_bitbang_transfer;
++ if (!bitbang->master->transfer_sync && bitbang->non_blocking_transfer)
++ bitbang->master->transfer_sync = spi_bitbang_transfer_sync;
++
+ if (!bitbang->txrx_bufs) {
+ bitbang->use_dma = 0;
+ bitbang->txrx_bufs = spi_bitbang_bufs;
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/spi/spi_s3c24xx_gpio.c linux-2.6.29-rc3.owrt.om/drivers/spi/spi_s3c24xx_gpio.c
+--- linux-2.6.29-rc3.owrt/drivers/spi/spi_s3c24xx_gpio.c 2009-05-10 22:04:49.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/spi/spi_s3c24xx_gpio.c 2009-05-10 22:28:00.000000000 +0200
+@@ -91,7 +91,7 @@
+ struct s3c2410_spigpio *sg = spidev_to_sg(dev);
+
+ if (sg->info && sg->info->chip_select)
+- (sg->info->chip_select)(sg->info, value);
++ (sg->info->chip_select)(sg->info, dev->chip_select, value);
+ }
+
+ static int s3c2410_spigpio_probe(struct platform_device *dev)
+@@ -112,14 +112,17 @@
+
+ platform_set_drvdata(dev, sp);
+
+- /* copy in the plkatform data */
++ /* copy in the platform data */
+ info = sp->info = dev->dev.platform_data;
+
++ master->num_chipselect = info->num_chipselect;
++
+ /* setup spi bitbang adaptor */
+ sp->bitbang.master = spi_master_get(master);
+ sp->bitbang.master->bus_num = info->bus_num;
+ sp->bitbang.master->num_chipselect = info->num_chipselect;
+ sp->bitbang.chipselect = s3c2410_spigpio_chipselect;
++ sp->bitbang.non_blocking_transfer = info->non_blocking_transfer;
+
+ sp->bitbang.txrx_word[SPI_MODE_0] = s3c2410_spigpio_txrx_mode0;
+ sp->bitbang.txrx_word[SPI_MODE_1] = s3c2410_spigpio_txrx_mode1;
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/spi/spi_s3c64xx_gpio.c linux-2.6.29-rc3.owrt.om/drivers/spi/spi_s3c64xx_gpio.c
+--- linux-2.6.29-rc3.owrt/drivers/spi/spi_s3c64xx_gpio.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/spi/spi_s3c64xx_gpio.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,187 @@
++/* linux/drivers/spi/spi_s3c64xx_gpio.c
++ *
++ * Copyright (c) 2009 Openmoko Inc.
++ * Author: Matt Hsu <matt_hsu@openmoko.org>
++ *
++ * S3C64XX GPIO-SPI driver.
++ * This driver is based on spi_s3c24xx_gpio.c
++ *
++ * Copyright (c) 2006 Ben Dooks
++ * Copyright (c) 2006 Simtec Electronics
++ *
++ * 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.
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++#include <linux/spinlock.h>
++#include <linux/workqueue.h>
++#include <linux/platform_device.h>
++#include <linux/gpio.h>
++
++#include <linux/spi/spi.h>
++#include <linux/spi/spi_bitbang.h>
++
++#include <plat/gpio-cfg.h>
++#include <mach/spi-gpio.h>
++
++struct s3c64xx_spigpio {
++ struct spi_bitbang bitbang;
++ struct s3c64xx_spigpio_info *info;
++ struct platform_device *dev;
++};
++
++static inline struct s3c64xx_spigpio *spidev_to_sg(struct spi_device *spi)
++{
++ return dev_get_drvdata(&spi->master->dev);
++}
++
++static inline void setsck(struct spi_device *dev, int on)
++{
++ struct s3c64xx_spigpio *sg = spidev_to_sg(dev);
++ gpio_direction_output(sg->info->pin_clk, on ? 1 : 0);
++}
++
++static inline void setmosi(struct spi_device *dev, int on)
++{
++ struct s3c64xx_spigpio *sg = spidev_to_sg(dev);
++ gpio_direction_output(sg->info->pin_mosi, on ? 1 : 0);
++}
++
++static inline u32 getmiso(struct spi_device *dev)
++{
++ struct s3c64xx_spigpio *sg = spidev_to_sg(dev);
++ return gpio_direction_input(sg->info->pin_miso) ? 1 : 0;
++}
++
++#define spidelay(x) ndelay(x)
++
++#define EXPAND_BITBANG_TXRX
++#include <linux/spi/spi_bitbang.h>
++
++static u32 s3c64xx_spigpio_txrx_mode0(struct spi_device *spi,
++ unsigned nsecs, u32 word, u8 bits)
++{
++ return bitbang_txrx_be_cpha0(spi, nsecs, 0, word, bits);
++}
++
++static u32 s3c64xx_spigpio_txrx_mode1(struct spi_device *spi,
++ unsigned nsecs, u32 word, u8 bits)
++{
++ return bitbang_txrx_be_cpha1(spi, nsecs, 0, word, bits);
++}
++
++static u32 s3c64xx_spigpio_txrx_mode2(struct spi_device *spi,
++ unsigned nsecs, u32 word, u8 bits)
++{
++ return bitbang_txrx_be_cpha0(spi, nsecs, 1, word, bits);
++}
++
++static u32 s3c64xx_spigpio_txrx_mode3(struct spi_device *spi,
++ unsigned nsecs, u32 word, u8 bits)
++{
++ return bitbang_txrx_be_cpha1(spi, nsecs, 1, word, bits);
++}
++static void s3c64xx_spigpio_chipselect(struct spi_device *dev, int value)
++{
++ struct s3c64xx_spigpio *sg = spidev_to_sg(dev);
++
++ if (sg && sg->info && sg->info->chip_select)
++ (sg->info->chip_select)(sg->info, dev->chip_select, value);
++}
++
++static int s3c64xx_spigpio_probe(struct platform_device *dev)
++{
++ struct s3c64xx_spigpio_info *info;
++ struct spi_master *master;
++ struct s3c64xx_spigpio *spi;
++
++ int ret;
++
++ master = spi_alloc_master(&dev->dev, sizeof(struct s3c64xx_spigpio));
++ if (master == NULL) {
++ dev_err(&dev->dev, "failed to allocate spi master\n");
++ ret = -ENOMEM;
++ goto err;
++ }
++
++ spi = spi_master_get_devdata(master);
++
++ /* copy in the platform data */
++ info = spi->info = dev->dev.platform_data;
++
++ master->num_chipselect = info->num_chipselect;
++
++ /* setup spi bitbang adaptor */
++ spi->bitbang.master = spi_master_get(master);
++ spi->bitbang.master->bus_num = info->bus_num;
++
++ spi->bitbang.chipselect = s3c64xx_spigpio_chipselect;
++
++ spi->bitbang.txrx_word[SPI_MODE_0] = s3c64xx_spigpio_txrx_mode0;
++ spi->bitbang.txrx_word[SPI_MODE_1] = s3c64xx_spigpio_txrx_mode1;
++ spi->bitbang.txrx_word[SPI_MODE_2] = s3c64xx_spigpio_txrx_mode2;
++ spi->bitbang.txrx_word[SPI_MODE_3] = s3c64xx_spigpio_txrx_mode3;
++
++ /* set state of spi pins. */
++ gpio_direction_output(info->pin_clk, 0);
++ s3c_gpio_cfgpin(info->pin_clk, S3C_GPIO_OUTPUT);
++
++ dev_set_drvdata(&master->dev, spi);
++
++ ret = spi_bitbang_start(&spi->bitbang);
++ if (ret)
++ goto err_no_bitbang;
++
++ return 0;
++
++ err_no_bitbang:
++ spi_master_put(spi->bitbang.master);
++ err:
++ return ret;
++}
++
++static int s3c64xx_spigpio_remove(struct platform_device *dev)
++{
++ struct s3c64xx_spigpio *sp = platform_get_drvdata(dev);
++
++ spi_bitbang_stop(&sp->bitbang);
++ spi_master_put(sp->bitbang.master);
++
++ return 0;
++}
++
++#define s3c64xx_spigpio_suspend NULL
++#define s3c64xx_spigpio_resume NULL
++
++static struct platform_driver s3c64xx_spigpio_drv = {
++ .probe = s3c64xx_spigpio_probe,
++ .remove = s3c64xx_spigpio_remove,
++ .suspend = s3c64xx_spigpio_suspend,
++ .resume = s3c64xx_spigpio_resume,
++ .driver = {
++ .name = "spi_s3c64xx_gpio",
++ .owner = THIS_MODULE,
++ },
++};
++
++static int __init s3c64xx_spigpio_init(void)
++{
++ return platform_driver_register(&s3c64xx_spigpio_drv);
++}
++
++static void __exit s3c64xx_spigpio_exit(void)
++{
++ platform_driver_unregister(&s3c64xx_spigpio_drv);
++}
++
++module_init(s3c64xx_spigpio_init);
++module_exit(s3c64xx_spigpio_exit);
++
++MODULE_DESCRIPTION("S3C64XX GPIO-SPI Driver");
++MODULE_AUTHOR("Matt Hsu, <matt_hsu@openmoko.org>");
++MODULE_LICENSE("GPLv2");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/staging/android/alarm.c linux-2.6.29-rc3.owrt.om/drivers/staging/android/alarm.c
+--- linux-2.6.29-rc3.owrt/drivers/staging/android/alarm.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/staging/android/alarm.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,567 @@
++/* drivers/rtc/alarm.c
++ *
++ * Copyright (C) 2007 Google, Inc.
++ *
++ * This software is licensed under the terms of the GNU General Public
++ * License version 2, as published by the Free Software Foundation, and
++ * may be copied, distributed, and modified under those terms.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ */
++
++#include <asm/mach/time.h>
++#include <linux/android_alarm.h>
++#include <linux/device.h>
++#include <linux/miscdevice.h>
++#include <linux/platform_device.h>
++#include <linux/rtc.h>
++#include <linux/spinlock.h>
++#include <linux/sysdev.h>
++#include <linux/wakelock.h>
++
++#define ANDROID_ALARM_PRINT_ERRORS (1U << 0)
++#define ANDROID_ALARM_PRINT_INIT_STATUS (1U << 1)
++#define ANDROID_ALARM_PRINT_INFO (1U << 2)
++#define ANDROID_ALARM_PRINT_IO (1U << 3)
++#define ANDROID_ALARM_PRINT_INT (1U << 4)
++#define ANDROID_ALARM_PRINT_FLOW (1U << 5)
++
++#if 0
++#define ANDROID_ALARM_DPRINTF_MASK (~0)
++#define ANDROID_ALARM_DPRINTF(debug_level_mask, args...) \
++ do { \
++ if (ANDROID_ALARM_DPRINTF_MASK & debug_level_mask) { \
++ printk(args); \
++ } \
++ } while (0)
++#else
++#define ANDROID_ALARM_DPRINTF(args...)
++#endif
++
++#define ANDROID_ALARM_WAKEUP_MASK ( \
++ ANDROID_ALARM_RTC_WAKEUP_MASK | \
++ ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP_MASK)
++
++/* support old usespace code */
++#define ANDROID_ALARM_SET_OLD _IOW('a', 2, time_t) /* set alarm */
++#define ANDROID_ALARM_SET_AND_WAIT_OLD _IOW('a', 3, time_t)
++
++static struct rtc_device *alarm_rtc_dev;
++static int alarm_opened;
++static DEFINE_SPINLOCK(alarm_slock);
++static DEFINE_MUTEX(alarm_setrtc_mutex);
++static struct wake_lock alarm_wake_lock;
++static struct wake_lock alarm_rtc_wake_lock;
++static DECLARE_WAIT_QUEUE_HEAD(alarm_wait_queue);
++static uint32_t alarm_pending;
++static uint32_t alarm_enabled;
++static uint32_t wait_pending;
++static struct platform_device *alarm_platform_dev;
++static struct hrtimer alarm_timer[ANDROID_ALARM_TYPE_COUNT];
++static struct timespec alarm_time[ANDROID_ALARM_TYPE_COUNT];
++static struct timespec elapsed_rtc_delta;
++
++static void alarm_start_hrtimer(enum android_alarm_type alarm_type)
++{
++ struct timespec hr_alarm_time;
++ if (!(alarm_enabled & (1U << alarm_type)))
++ return;
++ hr_alarm_time = alarm_time[alarm_type];
++ if (alarm_type == ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP ||
++ alarm_type == ANDROID_ALARM_ELAPSED_REALTIME)
++ set_normalized_timespec(&hr_alarm_time,
++ hr_alarm_time.tv_sec + elapsed_rtc_delta.tv_sec,
++ hr_alarm_time.tv_nsec + elapsed_rtc_delta.tv_nsec);
++ ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_FLOW,
++ "alarm start hrtimer %d at %ld.%09ld\n",
++ alarm_type, hr_alarm_time.tv_sec, hr_alarm_time.tv_nsec);
++ hrtimer_start(&alarm_timer[alarm_type],
++ timespec_to_ktime(hr_alarm_time), HRTIMER_MODE_ABS);
++}
++
++static long alarm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
++{
++ int rv = 0;
++ unsigned long flags;
++ int i;
++ struct timespec new_alarm_time;
++ struct timespec new_rtc_time;
++ struct timespec tmp_time;
++ struct rtc_time rtc_new_rtc_time;
++ enum android_alarm_type alarm_type = ANDROID_ALARM_IOCTL_TO_TYPE(cmd);
++ uint32_t alarm_type_mask = 1U << alarm_type;
++
++ if (alarm_type >= ANDROID_ALARM_TYPE_COUNT)
++ return -EINVAL;
++
++ if (ANDROID_ALARM_BASE_CMD(cmd) != ANDROID_ALARM_GET_TIME(0)) {
++ if ((file->f_flags & O_ACCMODE) == O_RDONLY)
++ return -EPERM;
++ if (file->private_data == NULL &&
++ cmd != ANDROID_ALARM_SET_RTC) {
++ spin_lock_irqsave(&alarm_slock, flags);
++ if (alarm_opened) {
++ spin_unlock_irqrestore(&alarm_slock, flags);
++ return -EBUSY;
++ }
++ alarm_opened = 1;
++ file->private_data = (void *)1;
++ spin_unlock_irqrestore(&alarm_slock, flags);
++ }
++ }
++
++ switch (ANDROID_ALARM_BASE_CMD(cmd)) {
++ case ANDROID_ALARM_CLEAR(0):
++ spin_lock_irqsave(&alarm_slock, flags);
++ ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_IO,
++ "alarm %d clear\n", alarm_type);
++ hrtimer_try_to_cancel(&alarm_timer[alarm_type]);
++ if (alarm_pending) {
++ alarm_pending &= ~alarm_type_mask;
++ if (!alarm_pending && !wait_pending)
++ wake_unlock(&alarm_wake_lock);
++ }
++ alarm_enabled &= ~alarm_type_mask;
++ spin_unlock_irqrestore(&alarm_slock, flags);
++ break;
++
++ case ANDROID_ALARM_SET_OLD:
++ case ANDROID_ALARM_SET_AND_WAIT_OLD:
++ if (get_user(new_alarm_time.tv_sec, (int __user *)arg)) {
++ rv = -EFAULT;
++ goto err1;
++ }
++ new_alarm_time.tv_nsec = 0;
++ goto from_old_alarm_set;
++
++ case ANDROID_ALARM_SET_AND_WAIT(0):
++ case ANDROID_ALARM_SET(0):
++ if (copy_from_user(&new_alarm_time, (void __user *)arg,
++ sizeof(new_alarm_time))) {
++ rv = -EFAULT;
++ goto err1;
++ }
++from_old_alarm_set:
++ spin_lock_irqsave(&alarm_slock, flags);
++ ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_IO,
++ "alarm %d set %ld.%09ld\n", alarm_type,
++ new_alarm_time.tv_sec, new_alarm_time.tv_nsec);
++ alarm_time[alarm_type] = new_alarm_time;
++ alarm_enabled |= alarm_type_mask;
++ alarm_start_hrtimer(alarm_type);
++ spin_unlock_irqrestore(&alarm_slock, flags);
++ if (ANDROID_ALARM_BASE_CMD(cmd) != ANDROID_ALARM_SET_AND_WAIT(0)
++ && cmd != ANDROID_ALARM_SET_AND_WAIT_OLD)
++ break;
++ /* fall though */
++ case ANDROID_ALARM_WAIT:
++ spin_lock_irqsave(&alarm_slock, flags);
++ ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_IO, "alarm wait\n");
++ if (!alarm_pending && wait_pending) {
++ wake_unlock(&alarm_wake_lock);
++ wait_pending = 0;
++ }
++ spin_unlock_irqrestore(&alarm_slock, flags);
++ rv = wait_event_interruptible(alarm_wait_queue, alarm_pending);
++ if (rv)
++ goto err1;
++ spin_lock_irqsave(&alarm_slock, flags);
++ rv = alarm_pending;
++ wait_pending = 1;
++ alarm_pending = 0;
++ if (rv & ANDROID_ALARM_WAKEUP_MASK)
++ wake_unlock(&alarm_rtc_wake_lock);
++ spin_unlock_irqrestore(&alarm_slock, flags);
++ break;
++ case ANDROID_ALARM_SET_RTC:
++ if (copy_from_user(&new_rtc_time, (void __user *)arg,
++ sizeof(new_rtc_time))) {
++ rv = -EFAULT;
++ goto err1;
++ }
++ rtc_time_to_tm(new_rtc_time.tv_sec, &rtc_new_rtc_time);
++
++ ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_IO,
++ "set rtc %ld %ld - rtc %02d:%02d:%02d %02d/%02d/%04d\n",
++ new_rtc_time.tv_sec, new_rtc_time.tv_nsec,
++ rtc_new_rtc_time.tm_hour, rtc_new_rtc_time.tm_min,
++ rtc_new_rtc_time.tm_sec, rtc_new_rtc_time.tm_mon + 1,
++ rtc_new_rtc_time.tm_mday,
++ rtc_new_rtc_time.tm_year + 1900);
++
++ mutex_lock(&alarm_setrtc_mutex);
++ spin_lock_irqsave(&alarm_slock, flags);
++ for (i = 0; i < ANDROID_ALARM_SYSTEMTIME; i++)
++ hrtimer_try_to_cancel(&alarm_timer[i]);
++ getnstimeofday(&tmp_time);
++ elapsed_rtc_delta = timespec_sub(elapsed_rtc_delta,
++ timespec_sub(tmp_time, new_rtc_time));
++ spin_unlock_irqrestore(&alarm_slock, flags);
++ rv = do_settimeofday(&new_rtc_time);
++ spin_lock_irqsave(&alarm_slock, flags);
++ for (i = 0; i < ANDROID_ALARM_SYSTEMTIME; i++)
++ alarm_start_hrtimer(i);
++ spin_unlock_irqrestore(&alarm_slock, flags);
++ if (rv < 0) {
++ ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_ERRORS,
++ "Failed to set time\n");
++ mutex_unlock(&alarm_setrtc_mutex);
++ goto err1;
++ }
++ rv = rtc_set_time(alarm_rtc_dev, &rtc_new_rtc_time);
++ spin_lock_irqsave(&alarm_slock, flags);
++ alarm_pending |= ANDROID_ALARM_TIME_CHANGE_MASK;
++ wake_up(&alarm_wait_queue);
++ spin_unlock_irqrestore(&alarm_slock, flags);
++ mutex_unlock(&alarm_setrtc_mutex);
++ if (rv < 0) {
++ ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_ERRORS,
++ "Failed to set RTC, time will be lost on reboot\n");
++ goto err1;
++ }
++ break;
++ case ANDROID_ALARM_GET_TIME(0):
++ mutex_lock(&alarm_setrtc_mutex);
++ spin_lock_irqsave(&alarm_slock, flags);
++ if (alarm_type != ANDROID_ALARM_SYSTEMTIME) {
++ getnstimeofday(&tmp_time);
++ if (alarm_type >= ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP)
++ tmp_time = timespec_sub(tmp_time,
++ elapsed_rtc_delta);
++ } else
++ ktime_get_ts(&tmp_time);
++ spin_unlock_irqrestore(&alarm_slock, flags);
++ mutex_unlock(&alarm_setrtc_mutex);
++ if (copy_to_user((void __user *)arg, &tmp_time,
++ sizeof(tmp_time))) {
++ rv = -EFAULT;
++ goto err1;
++ }
++ break;
++
++ default:
++ rv = -EINVAL;
++ goto err1;
++ }
++err1:
++ return rv;
++}
++
++static int alarm_open(struct inode *inode, struct file *file)
++{
++ file->private_data = NULL;
++ return 0;
++}
++
++static int alarm_release(struct inode *inode, struct file *file)
++{
++ int i;
++ unsigned long flags;
++
++ spin_lock_irqsave(&alarm_slock, flags);
++ if (file->private_data != 0) {
++ for (i = 0; i < ANDROID_ALARM_TYPE_COUNT; i++) {
++ uint32_t alarm_type_mask = 1U << i;
++ if (alarm_enabled & alarm_type_mask) {
++ ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_INFO,
++ "alarm_release: clear alarm, "
++ "pending %d\n",
++ !!(alarm_pending & alarm_type_mask));
++ alarm_enabled &= ~alarm_type_mask;
++ }
++ spin_unlock_irqrestore(&alarm_slock, flags);
++ hrtimer_cancel(&alarm_timer[i]);
++ spin_lock_irqsave(&alarm_slock, flags);
++ }
++ if (alarm_pending | wait_pending) {
++ if (alarm_pending)
++ ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_INFO,
++ "alarm_release: clear pending alarms "
++ "%x\n", alarm_pending);
++ wake_unlock(&alarm_wake_lock);
++ wait_pending = 0;
++ alarm_pending = 0;
++ }
++ alarm_opened = 0;
++ }
++ spin_unlock_irqrestore(&alarm_slock, flags);
++ return 0;
++}
++
++static enum hrtimer_restart alarm_timer_triggered(struct hrtimer *timer)
++{
++ unsigned long flags;
++ enum android_alarm_type alarm_type = (timer - alarm_timer);
++ uint32_t alarm_type_mask = 1U << alarm_type;
++
++
++ ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_INT,
++ "alarm_timer_triggered type %d\n", alarm_type);
++ spin_lock_irqsave(&alarm_slock, flags);
++ if (alarm_enabled & alarm_type_mask) {
++ wake_lock_timeout(&alarm_wake_lock, 5 * HZ);
++ alarm_enabled &= ~alarm_type_mask;
++ alarm_pending |= alarm_type_mask;
++ wake_up(&alarm_wait_queue);
++ }
++ spin_unlock_irqrestore(&alarm_slock, flags);
++ return HRTIMER_NORESTART;
++}
++
++static void alarm_triggered_func(void *p)
++{
++ struct rtc_device *rtc = alarm_rtc_dev;
++ if (!(rtc->irq_data & RTC_AF))
++ return;
++ ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_INT, "rtc alarm triggered\n");
++ wake_lock_timeout(&alarm_rtc_wake_lock, 1 * HZ);
++}
++
++int alarm_suspend(struct platform_device *pdev, pm_message_t state)
++{
++ int err = 0;
++ unsigned long flags;
++ struct rtc_wkalrm rtc_alarm;
++ struct rtc_time rtc_current_rtc_time;
++ unsigned long rtc_current_time;
++ unsigned long rtc_alarm_time;
++ struct timespec rtc_current_timespec;
++ struct timespec rtc_delta;
++ struct timespec elapsed_realtime_alarm_time;
++
++ ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_FLOW,
++ "alarm_suspend(%p, %d)\n", pdev, state.event);
++ spin_lock_irqsave(&alarm_slock, flags);
++ if (alarm_pending && !wake_lock_active(&alarm_wake_lock)) {
++ ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_INFO,
++ "alarm pending\n");
++ err = -EBUSY;
++ goto err1;
++ }
++ if (alarm_enabled & ANDROID_ALARM_WAKEUP_MASK) {
++ spin_unlock_irqrestore(&alarm_slock, flags);
++ if (alarm_enabled & ANDROID_ALARM_RTC_WAKEUP_MASK)
++ hrtimer_cancel(&alarm_timer[ANDROID_ALARM_RTC_WAKEUP]);
++ if (alarm_enabled & ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP_MASK)
++ hrtimer_cancel(&alarm_timer[
++ ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP]);
++
++ rtc_read_time(alarm_rtc_dev, &rtc_current_rtc_time);
++ rtc_current_timespec.tv_nsec = 0;
++ rtc_tm_to_time(&rtc_current_rtc_time,
++ &rtc_current_timespec.tv_sec);
++ save_time_delta(&rtc_delta, &rtc_current_timespec);
++ set_normalized_timespec(&elapsed_realtime_alarm_time,
++ alarm_time[ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP]
++ .tv_sec + elapsed_rtc_delta.tv_sec,
++ alarm_time[ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP]
++ .tv_nsec + elapsed_rtc_delta.tv_nsec);
++ if ((alarm_enabled & ANDROID_ALARM_RTC_WAKEUP_MASK) &&
++ (!(alarm_enabled &
++ ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP_MASK) ||
++ timespec_compare(&alarm_time[ANDROID_ALARM_RTC_WAKEUP],
++ &elapsed_realtime_alarm_time) < 0))
++ rtc_alarm_time = timespec_sub(
++ alarm_time[ANDROID_ALARM_RTC_WAKEUP],
++ rtc_delta).tv_sec;
++ else
++ rtc_alarm_time = timespec_sub(
++ elapsed_realtime_alarm_time, rtc_delta).tv_sec;
++ rtc_time_to_tm(rtc_alarm_time, &rtc_alarm.time);
++ rtc_alarm.enabled = 1;
++ rtc_set_alarm(alarm_rtc_dev, &rtc_alarm);
++ rtc_read_time(alarm_rtc_dev, &rtc_current_rtc_time);
++ rtc_tm_to_time(&rtc_current_rtc_time, &rtc_current_time);
++ ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_INFO,
++ "rtc alarm set at %ld, now %ld, rtc delta %ld.%09ld\n",
++ rtc_alarm_time, rtc_current_time,
++ rtc_delta.tv_sec, rtc_delta.tv_nsec);
++ if (rtc_current_time + 1 >= rtc_alarm_time) {
++ ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_INFO,
++ "alarm about to go off\n");
++ memset(&rtc_alarm, 0, sizeof(rtc_alarm));
++ rtc_alarm.enabled = 0;
++ rtc_set_alarm(alarm_rtc_dev, &rtc_alarm);
++
++ spin_lock_irqsave(&alarm_slock, flags);
++ wake_lock_timeout(&alarm_rtc_wake_lock, 2 * HZ);
++ alarm_start_hrtimer(ANDROID_ALARM_RTC_WAKEUP);
++ alarm_start_hrtimer(
++ ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP);
++ err = -EBUSY;
++ spin_unlock_irqrestore(&alarm_slock, flags);
++ }
++ } else {
++err1:
++ spin_unlock_irqrestore(&alarm_slock, flags);
++ }
++ return err;
++}
++
++int alarm_resume(struct platform_device *pdev)
++{
++ struct rtc_wkalrm alarm;
++ ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_FLOW,
++ "alarm_resume(%p)\n", pdev);
++ if (alarm_enabled & ANDROID_ALARM_WAKEUP_MASK) {
++ memset(&alarm, 0, sizeof(alarm));
++ alarm.enabled = 0;
++ rtc_set_alarm(alarm_rtc_dev, &alarm);
++ alarm_start_hrtimer(ANDROID_ALARM_RTC_WAKEUP);
++ alarm_start_hrtimer(ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP);
++ }
++ return 0;
++}
++
++static struct rtc_task alarm_rtc_task = {
++ .func = alarm_triggered_func
++};
++
++static struct file_operations alarm_fops = {
++ .owner = THIS_MODULE,
++ .unlocked_ioctl = alarm_ioctl,
++ .open = alarm_open,
++ .release = alarm_release,
++};
++
++static struct miscdevice alarm_device = {
++ .minor = MISC_DYNAMIC_MINOR,
++ .name = "alarm",
++ .fops = &alarm_fops,
++};
++
++static int rtc_alarm_add_device(struct device *dev,
++ struct class_interface *class_intf)
++{
++ int err;
++ struct rtc_device *rtc = to_rtc_device(dev);
++
++ mutex_lock(&alarm_setrtc_mutex);
++
++ if (alarm_rtc_dev) {
++ err = -EBUSY;
++ goto err1;
++ }
++
++ err = misc_register(&alarm_device);
++ if (err)
++ goto err1;
++ alarm_platform_dev =
++ platform_device_register_simple("alarm", -1, NULL, 0);
++ if (IS_ERR(alarm_platform_dev)) {
++ err = PTR_ERR(alarm_platform_dev);
++ goto err2;
++ }
++ err = rtc_irq_register(rtc, &alarm_rtc_task);
++ if (err)
++ goto err3;
++ alarm_rtc_dev = rtc;
++ mutex_unlock(&alarm_setrtc_mutex);
++
++ ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_INFO, "alarm: parent %p\n",
++ alarm_platform_dev->dev.power.pm_parent);
++ return 0;
++
++err3:
++ platform_device_unregister(alarm_platform_dev);
++err2:
++ misc_deregister(&alarm_device);
++err1:
++ mutex_unlock(&alarm_setrtc_mutex);
++ return err;
++}
++
++static void rtc_alarm_remove_device(struct device *dev,
++ struct class_interface *class_intf)
++{
++ if (dev == &alarm_rtc_dev->dev) {
++ rtc_irq_unregister(alarm_rtc_dev, &alarm_rtc_task);
++ platform_device_unregister(alarm_platform_dev);
++ misc_deregister(&alarm_device);
++ alarm_rtc_dev = NULL;
++ }
++}
++
++static struct class_interface rtc_alarm_interface = {
++ .add_dev = &rtc_alarm_add_device,
++ .remove_dev = &rtc_alarm_remove_device,
++};
++
++static struct platform_driver alarm_driver = {
++ .suspend = alarm_suspend,
++ .resume = alarm_resume,
++ .driver = {
++ .name = "alarm"
++ }
++};
++
++static int __init alarm_late_init(void)
++{
++ unsigned long flags;
++ struct timespec system_time;
++
++ /* this needs to run after the rtc is read at boot */
++ spin_lock_irqsave(&alarm_slock, flags);
++ /* We read the current rtc and system time so we can later calulate
++ * elasped realtime to be (boot_systemtime + rtc - boot_rtc) ==
++ * (rtc - (boot_rtc - boot_systemtime))
++ */
++ getnstimeofday(&elapsed_rtc_delta);
++ ktime_get_ts(&system_time);
++ elapsed_rtc_delta = timespec_sub(elapsed_rtc_delta, system_time);
++ spin_unlock_irqrestore(&alarm_slock, flags);
++
++ ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_INFO,
++ "alarm_late_init: rtc to elapsed realtime delta %ld.%09ld\n",
++ elapsed_rtc_delta.tv_sec, elapsed_rtc_delta.tv_nsec);
++ return 0;
++}
++
++static int __init alarm_init(void)
++{
++ int err;
++ int i;
++
++ for (i = 0; i < ANDROID_ALARM_SYSTEMTIME; i++) {
++ hrtimer_init(&alarm_timer[i], CLOCK_REALTIME, HRTIMER_MODE_ABS);
++ alarm_timer[i].function = alarm_timer_triggered;
++ }
++ hrtimer_init(&alarm_timer[ANDROID_ALARM_SYSTEMTIME],
++ CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
++ alarm_timer[ANDROID_ALARM_SYSTEMTIME].function = alarm_timer_triggered;
++ err = platform_driver_register(&alarm_driver);
++ if (err < 0)
++ goto err1;
++ wake_lock_init(&alarm_wake_lock, WAKE_LOCK_SUSPEND, "alarm");
++ wake_lock_init(&alarm_rtc_wake_lock, WAKE_LOCK_SUSPEND, "alarm_rtc");
++ rtc_alarm_interface.class = rtc_class;
++ err = class_interface_register(&rtc_alarm_interface);
++ if (err < 0)
++ goto err2;
++
++ return 0;
++
++err2:
++ wake_lock_destroy(&alarm_rtc_wake_lock);
++ wake_lock_destroy(&alarm_wake_lock);
++ platform_driver_unregister(&alarm_driver);
++err1:
++ return err;
++}
++
++static void __exit alarm_exit(void)
++{
++ class_interface_unregister(&rtc_alarm_interface);
++ wake_lock_destroy(&alarm_rtc_wake_lock);
++ wake_lock_destroy(&alarm_wake_lock);
++ platform_driver_unregister(&alarm_driver);
++}
++
++late_initcall(alarm_late_init);
++module_init(alarm_init);
++module_exit(alarm_exit);
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/staging/android/binder.c linux-2.6.29-rc3.owrt.om/drivers/staging/android/binder.c
+--- linux-2.6.29-rc3.owrt/drivers/staging/android/binder.c 2009-05-10 22:08:44.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/staging/android/binder.c 2009-05-10 22:28:00.000000000 +0200
+@@ -54,7 +54,7 @@
+ #define SZ_4M 0x400000
+ #endif
+
+-#ifndef __i386__
++#if !defined(__i386__) && !defined(__arm__)
+ #define FORBIDDEN_MMAP_FLAGS (VM_WRITE | VM_EXEC)
+ #else
+ #define FORBIDDEN_MMAP_FLAGS (VM_WRITE)
+@@ -2649,14 +2649,14 @@
+ {
+ struct binder_proc *proc = vma->vm_private_data;
+ if (binder_debug_mask & BINDER_DEBUG_OPEN_CLOSE)
+- printk(KERN_INFO "binder: %d open vm area %lx-%lx (%ld K) vma %lx pagep %lx\n", proc->pid, vma->vm_start, vma->vm_end, (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags, vma->vm_page_prot.pgprot);
++ printk(KERN_INFO "binder: %d open vm area %lx-%lx (%ld K) vma %lx pagep %lx\n", proc->pid, vma->vm_start, vma->vm_end, (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags, vma->vm_page_prot);
+ dump_stack();
+ }
+ static void binder_vma_close(struct vm_area_struct *vma)
+ {
+ struct binder_proc *proc = vma->vm_private_data;
+ if (binder_debug_mask & BINDER_DEBUG_OPEN_CLOSE)
+- printk(KERN_INFO "binder: %d close vm area %lx-%lx (%ld K) vma %lx pagep %lx\n", proc->pid, vma->vm_start, vma->vm_end, (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags, vma->vm_page_prot.pgprot);
++ printk(KERN_INFO "binder: %d close vm area %lx-%lx (%ld K) vma %lx pagep %lx\n", proc->pid, vma->vm_start, vma->vm_end, (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags, vma->vm_page_prot);
+ proc->vma = NULL;
+ }
+
+@@ -2677,7 +2677,7 @@
+ vma->vm_end = vma->vm_start + SZ_4M;
+
+ if (binder_debug_mask & BINDER_DEBUG_OPEN_CLOSE)
+- printk(KERN_INFO "binder_mmap: %d %lx-%lx (%ld K) vma %lx pagep %lx\n", proc->pid, vma->vm_start, vma->vm_end, (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags, vma->vm_page_prot.pgprot);
++ printk(KERN_INFO "binder_mmap: %d %lx-%lx (%ld K) vma %lx pagep %lx\n", proc->pid, vma->vm_start, vma->vm_end, (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags, vma->vm_page_prot);
+
+ if (vma->vm_flags & FORBIDDEN_MMAP_FLAGS) {
+ ret = -EPERM;
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/staging/android/consoleearlysuspend.c linux-2.6.29-rc3.owrt.om/drivers/staging/android/consoleearlysuspend.c
+--- linux-2.6.29-rc3.owrt/drivers/staging/android/consoleearlysuspend.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/staging/android/consoleearlysuspend.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,78 @@
++/* kernel/power/consoleearlysuspend.c
++ *
++ * Copyright (C) 2005-2008 Google, Inc.
++ *
++ * This software is licensed under the terms of the GNU General Public
++ * License version 2, as published by the Free Software Foundation, and
++ * may be copied, distributed, and modified under those terms.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ */
++
++#include <linux/console.h>
++#include <linux/earlysuspend.h>
++#include <linux/kbd_kern.h>
++#include <linux/module.h>
++#include <linux/vt_kern.h>
++#include <linux/wait.h>
++
++#define EARLY_SUSPEND_CONSOLE (MAX_NR_CONSOLES-1)
++
++static int orig_fgconsole;
++static void console_early_suspend(struct early_suspend *h)
++{
++ acquire_console_sem();
++ orig_fgconsole = fg_console;
++ if (vc_allocate(EARLY_SUSPEND_CONSOLE))
++ goto err;
++ if (set_console(EARLY_SUSPEND_CONSOLE))
++ goto err;
++ release_console_sem();
++
++ if (vt_waitactive(EARLY_SUSPEND_CONSOLE))
++ pr_warning("console_early_suspend: Can't switch VCs.\n");
++ return;
++err:
++ pr_warning("console_early_suspend: Can't set console\n");
++ release_console_sem();
++}
++
++static void console_late_resume(struct early_suspend *h)
++{
++ int ret;
++ acquire_console_sem();
++ ret = set_console(orig_fgconsole);
++ release_console_sem();
++ if (ret) {
++ pr_warning("console_late_resume: Can't set console.\n");
++ return;
++ }
++
++ if (vt_waitactive(orig_fgconsole))
++ pr_warning("console_late_resume: Can't switch VCs.\n");
++}
++
++static struct early_suspend console_early_suspend_desc = {
++ .level = EARLY_SUSPEND_LEVEL_STOP_DRAWING,
++ .suspend = console_early_suspend,
++ .resume = console_late_resume,
++};
++
++static int __init console_early_suspend_init(void)
++{
++ register_early_suspend(&console_early_suspend_desc);
++ return 0;
++}
++
++static void __exit console_early_suspend_exit(void)
++{
++ unregister_early_suspend(&console_early_suspend_desc);
++}
++
++module_init(console_early_suspend_init);
++module_exit(console_early_suspend_exit);
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/staging/android/earlysuspend.c linux-2.6.29-rc3.owrt.om/drivers/staging/android/earlysuspend.c
+--- linux-2.6.29-rc3.owrt/drivers/staging/android/earlysuspend.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/staging/android/earlysuspend.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,178 @@
++/* kernel/power/earlysuspend.c
++ *
++ * Copyright (C) 2005-2008 Google, Inc.
++ *
++ * This software is licensed under the terms of the GNU General Public
++ * License version 2, as published by the Free Software Foundation, and
++ * may be copied, distributed, and modified under those terms.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ */
++
++#include <linux/earlysuspend.h>
++#include <linux/module.h>
++#include <linux/mutex.h>
++#include <linux/rtc.h>
++#include <linux/syscalls.h> /* sys_sync */
++#include <linux/wakelock.h>
++#include <linux/workqueue.h>
++
++#include "power.h"
++
++enum {
++ DEBUG_USER_STATE = 1U << 0,
++ DEBUG_SUSPEND = 1U << 2,
++};
++static int debug_mask = DEBUG_USER_STATE;
++module_param_named(debug_mask, debug_mask, int, S_IRUGO | S_IWUSR | S_IWGRP);
++
++static DEFINE_MUTEX(early_suspend_lock);
++static LIST_HEAD(early_suspend_handlers);
++static void early_suspend(struct work_struct *work);
++static void late_resume(struct work_struct *work);
++static DECLARE_WORK(early_suspend_work, early_suspend);
++static DECLARE_WORK(late_resume_work, late_resume);
++static DEFINE_SPINLOCK(state_lock);
++enum {
++ SUSPEND_REQUESTED = 0x1,
++ SUSPENDED = 0x2,
++ SUSPEND_REQUESTED_AND_SUSPENDED = SUSPEND_REQUESTED | SUSPENDED,
++};
++static int state;
++
++void register_early_suspend(struct early_suspend *handler)
++{
++ struct list_head *pos;
++
++ mutex_lock(&early_suspend_lock);
++ list_for_each(pos, &early_suspend_handlers) {
++ struct early_suspend *e;
++ e = list_entry(pos, struct early_suspend, link);
++ if (e->level > handler->level)
++ break;
++ }
++ list_add_tail(&handler->link, pos);
++ if ((state & SUSPENDED) && handler->suspend)
++ handler->suspend(handler);
++ mutex_unlock(&early_suspend_lock);
++}
++EXPORT_SYMBOL(register_early_suspend);
++
++void unregister_early_suspend(struct early_suspend *handler)
++{
++ mutex_lock(&early_suspend_lock);
++ list_del(&handler->link);
++ mutex_unlock(&early_suspend_lock);
++}
++EXPORT_SYMBOL(unregister_early_suspend);
++
++static void early_suspend(struct work_struct *work)
++{
++ struct early_suspend *pos;
++ unsigned long irqflags;
++ int abort = 0;
++
++ mutex_lock(&early_suspend_lock);
++ spin_lock_irqsave(&state_lock, irqflags);
++ if (state == SUSPEND_REQUESTED)
++ state |= SUSPENDED;
++ else
++ abort = 1;
++ spin_unlock_irqrestore(&state_lock, irqflags);
++
++ if (abort) {
++ if (debug_mask & DEBUG_SUSPEND)
++ pr_info("early_suspend: abort, state %d\n", state);
++ mutex_unlock(&early_suspend_lock);
++ goto abort;
++ }
++
++ if (debug_mask & DEBUG_SUSPEND)
++ pr_info("early_suspend: call handlers\n");
++ list_for_each_entry(pos, &early_suspend_handlers, link) {
++ if (pos->suspend != NULL)
++ pos->suspend(pos);
++ }
++ mutex_unlock(&early_suspend_lock);
++
++ if (debug_mask & DEBUG_SUSPEND)
++ pr_info("early_suspend: sync\n");
++
++ sys_sync();
++abort:
++ spin_lock_irqsave(&state_lock, irqflags);
++ if (state == SUSPEND_REQUESTED_AND_SUSPENDED)
++ wake_unlock(&main_wake_lock);
++ spin_unlock_irqrestore(&state_lock, irqflags);
++}
++
++static void late_resume(struct work_struct *work)
++{
++ struct early_suspend *pos;
++ unsigned long irqflags;
++ int abort = 0;
++
++ mutex_lock(&early_suspend_lock);
++ spin_lock_irqsave(&state_lock, irqflags);
++ if (state == SUSPENDED)
++ state &= ~SUSPENDED;
++ else
++ abort = 1;
++ spin_unlock_irqrestore(&state_lock, irqflags);
++
++ if (abort) {
++ if (debug_mask & DEBUG_SUSPEND)
++ pr_info("late_resume: abort, state %d\n", state);
++ goto abort;
++ }
++ if (debug_mask & DEBUG_SUSPEND)
++ pr_info("late_resume: call handlers\n");
++ list_for_each_entry_reverse(pos, &early_suspend_handlers, link)
++ if (pos->resume != NULL)
++ pos->resume(pos);
++ if (debug_mask & DEBUG_SUSPEND)
++ pr_info("late_resume: done\n");
++abort:
++ mutex_unlock(&early_suspend_lock);
++}
++
++void request_suspend_state(suspend_state_t new_state)
++{
++ unsigned long irqflags;
++ int old_sleep;
++
++ spin_lock_irqsave(&state_lock, irqflags);
++ old_sleep = state & SUSPEND_REQUESTED;
++ if (debug_mask & DEBUG_USER_STATE) {
++ struct timespec ts;
++ struct rtc_time tm;
++ getnstimeofday(&ts);
++ rtc_time_to_tm(ts.tv_sec, &tm);
++ pr_info("request_suspend_state: %s (%d->%d) at %lld "
++ "(%d-%02d-%02d %02d:%02d:%02d.%09lu UTC)\n",
++ new_state != PM_SUSPEND_ON ? "sleep" : "wakeup",
++ requested_suspend_state, new_state,
++ ktime_to_ns(ktime_get()),
++ tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
++ tm.tm_hour, tm.tm_min, tm.tm_sec, ts.tv_nsec);
++ }
++ if (!old_sleep && new_state != PM_SUSPEND_ON) {
++ state |= SUSPEND_REQUESTED;
++ queue_work(suspend_work_queue, &early_suspend_work);
++ } else if (old_sleep && new_state == PM_SUSPEND_ON) {
++ state &= ~SUSPEND_REQUESTED;
++ wake_lock(&main_wake_lock);
++ queue_work(suspend_work_queue, &late_resume_work);
++ }
++ requested_suspend_state = new_state;
++ spin_unlock_irqrestore(&state_lock, irqflags);
++}
++
++suspend_state_t get_suspend_state(void)
++{
++ return requested_suspend_state;
++}
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/staging/android/fbearlysuspend.c linux-2.6.29-rc3.owrt.om/drivers/staging/android/fbearlysuspend.c
+--- linux-2.6.29-rc3.owrt/drivers/staging/android/fbearlysuspend.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/staging/android/fbearlysuspend.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,153 @@
++/* kernel/power/fbearlysuspend.c
++ *
++ * Copyright (C) 2005-2008 Google, Inc.
++ *
++ * This software is licensed under the terms of the GNU General Public
++ * License version 2, as published by the Free Software Foundation, and
++ * may be copied, distributed, and modified under those terms.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ */
++
++#include <linux/earlysuspend.h>
++#include <linux/module.h>
++#include <linux/wait.h>
++
++#include "power.h"
++
++static wait_queue_head_t fb_state_wq;
++static DEFINE_SPINLOCK(fb_state_lock);
++static enum {
++ FB_STATE_STOPPED_DRAWING,
++ FB_STATE_REQUEST_STOP_DRAWING,
++ FB_STATE_DRAWING_OK,
++} fb_state;
++
++/* tell userspace to stop drawing, wait for it to stop */
++static void stop_drawing_early_suspend(struct early_suspend *h)
++{
++ int ret;
++ unsigned long irq_flags;
++
++ spin_lock_irqsave(&fb_state_lock, irq_flags);
++ fb_state = FB_STATE_REQUEST_STOP_DRAWING;
++ spin_unlock_irqrestore(&fb_state_lock, irq_flags);
++
++ wake_up_all(&fb_state_wq);
++ ret = wait_event_timeout(fb_state_wq,
++ fb_state == FB_STATE_STOPPED_DRAWING,
++ HZ);
++ if (unlikely(fb_state != FB_STATE_STOPPED_DRAWING))
++ pr_warning("stop_drawing_early_suspend: timeout waiting for "
++ "userspace to stop drawing\n");
++}
++
++/* tell userspace to start drawing */
++static void start_drawing_late_resume(struct early_suspend *h)
++{
++ unsigned long irq_flags;
++
++ spin_lock_irqsave(&fb_state_lock, irq_flags);
++ fb_state = FB_STATE_DRAWING_OK;
++ spin_unlock_irqrestore(&fb_state_lock, irq_flags);
++ wake_up(&fb_state_wq);
++}
++
++static struct early_suspend stop_drawing_early_suspend_desc = {
++ .level = EARLY_SUSPEND_LEVEL_STOP_DRAWING,
++ .suspend = stop_drawing_early_suspend,
++ .resume = start_drawing_late_resume,
++};
++
++static ssize_t wait_for_fb_sleep_show(struct kobject *kobj,
++ struct kobj_attribute *attr, char *buf)
++{
++ char *s = buf;
++ int ret;
++
++ ret = wait_event_interruptible(fb_state_wq,
++ fb_state != FB_STATE_DRAWING_OK);
++ if (ret && fb_state == FB_STATE_DRAWING_OK)
++ return ret;
++ else
++ s += sprintf(buf, "sleeping");
++ return s - buf;
++}
++
++static ssize_t wait_for_fb_wake_show(struct kobject *kobj,
++ struct kobj_attribute *attr, char *buf)
++{
++ char *s = buf;
++ int ret;
++ unsigned long irq_flags;
++
++ spin_lock_irqsave(&fb_state_lock, irq_flags);
++ if (fb_state == FB_STATE_REQUEST_STOP_DRAWING) {
++ fb_state = FB_STATE_STOPPED_DRAWING;
++ wake_up(&fb_state_wq);
++ }
++ spin_unlock_irqrestore(&fb_state_lock, irq_flags);
++
++ ret = wait_event_interruptible(fb_state_wq,
++ fb_state == FB_STATE_DRAWING_OK);
++ if (ret && fb_state != FB_STATE_DRAWING_OK)
++ return ret;
++ else
++ s += sprintf(buf, "awake");
++
++ return s - buf;
++}
++
++#define power_ro_attr(_name) \
++static struct kobj_attribute _name##_attr = { \
++ .attr = { \
++ .name = __stringify(_name), \
++ .mode = 0444, \
++ }, \
++ .show = _name##_show, \
++ .store = NULL, \
++}
++
++power_ro_attr(wait_for_fb_sleep);
++power_ro_attr(wait_for_fb_wake);
++
++static struct attribute *g[] = {
++ &wait_for_fb_sleep_attr.attr,
++ &wait_for_fb_wake_attr.attr,
++ NULL,
++};
++
++static struct attribute_group attr_group = {
++ .attrs = g,
++};
++
++static int __init android_power_init(void)
++{
++ int ret;
++
++ init_waitqueue_head(&fb_state_wq);
++ fb_state = FB_STATE_DRAWING_OK;
++
++ ret = sysfs_create_group(power_kobj, &attr_group);
++ if (ret) {
++ pr_err("android_power_init: sysfs_create_group failed\n");
++ return ret;
++ }
++
++ register_early_suspend(&stop_drawing_early_suspend_desc);
++ return 0;
++}
++
++static void __exit android_power_exit(void)
++{
++ unregister_early_suspend(&stop_drawing_early_suspend_desc);
++ sysfs_remove_group(power_kobj, &attr_group);
++}
++
++module_init(android_power_init);
++module_exit(android_power_exit);
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/staging/android/Kconfig linux-2.6.29-rc3.owrt.om/drivers/staging/android/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/staging/android/Kconfig 2009-05-10 22:08:44.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/staging/android/Kconfig 2009-05-10 22:28:00.000000000 +0200
+@@ -83,4 +83,80 @@
+ ---help---
+ Register processes to be killed when memory is low
+
++config ANDROID_HAS_WAKELOCK
++ bool
++
++config ANDROID_HAS_EARLYSUSPEND
++ bool
++
++config ANDROID_WAKELOCK
++ bool "Wake lock"
++ depends on PM && RTC_CLASS
++ default n
++ select ANDROID_HAS_WAKELOCK
++ ---help---
++ Enable wakelocks. When user space request a sleep state the
++ sleep request will be delayed until no wake locks are held.
++
++config ANDROID_WAKELOCK_STAT
++ bool "Wake lock stats"
++ depends on WAKELOCK
++ default y
++ ---help---
++ Report wake lock stats in /proc/wakelocks
++
++config ANDROID_USER_WAKELOCK
++ bool "Userspace wake locks"
++ depends on ANDROID_WAKELOCK
++ default y
++ ---help---
++ User-space wake lock api. Write "lockname" or "lockname timeout"
++ to /sys/power/wake_lock lock and if needed create a wake lock.
++ Write "lockname" to /sys/power/wake_unlock to unlock a user wake
++ lock.
++
++config ANDROID_EARLYSUSPEND
++ bool "Early suspend"
++ depends on ANDROID_WAKELOCK
++ default y
++ select ANDROID_HAS_EARLYSUSPEND
++ ---help---
++ Call early suspend handlers when the user requested sleep state
++ changes.
++
++choice
++ prompt "User-space screen access"
++ default ANDROID_FB_EARLYSUSPEND if !FRAMEBUFFER_CONSOLE
++ default ANDROID_CONSOLE_EARLYSUSPEND
++ depends on ANDROID_HAS_EARLYSUSPEND
++
++ config NO_USER_SPACE_SCREEN_ACCESS_CONTROL
++ bool "None"
++
++ config ANDROID_CONSOLE_EARLYSUSPEND
++ bool "Console switch on early-suspend"
++ depends on ANDROID_HAS_EARLYSUSPEND && VT
++ ---help---
++ Register early suspend handler to perform a console switch to
++ when user-space should stop drawing to the screen and a switch
++ back when it should resume.
++
++ config ANDROID_FB_EARLYSUSPEND
++ bool "Sysfs interface"
++ depends on ANDROID_HAS_EARLYSUSPEND
++ ---help---
++ Register early suspend handler that notifies and waits for
++ user-space through sysfs when user-space should stop drawing
++ to the screen and notifies user-space when it should resume.
++endchoice
++
++config ANDROID_POWER_ALARM
++ bool "Android alarm driver"
++ depends on ANDROID_WAKELOCK
++ default y
++
++config ANDROID_PARANOID_NETWORK
++ bool "Only allow certain groups to create sockets"
++ default y
++
+ endmenu
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/staging/android/Makefile linux-2.6.29-rc3.owrt.om/drivers/staging/android/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/staging/android/Makefile 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/staging/android/Makefile 2009-05-10 22:28:00.000000000 +0200
+@@ -3,3 +3,9 @@
+ obj-$(CONFIG_ANDROID_RAM_CONSOLE) += ram_console.o
+ obj-$(CONFIG_ANDROID_TIMED_GPIO) += timed_gpio.o
+ obj-$(CONFIG_ANDROID_LOW_MEMORY_KILLER) += lowmemorykiller.o
++obj-$(CONFIG_ANDROID_POWER_ALARM) += alarm.o
++obj-$(CONFIG_ANDROID_WAKELOCK) += wakelock.o
++obj-$(CONFIG_ANDROID_USER_WAKELOCK) += userwakelock.o
++obj-$(CONFIG_ANDROID_EARLYSUSPEND) += earlysuspend.o
++obj-$(CONFIG_ANDROID_CONSOLE_EARLYSUSPEND) += consoleearlysuspend.o
++obj-$(CONFIG_ANDROID_FB_EARLYSUSPEND) += fbearlysuspend.o
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/staging/android/power.h linux-2.6.29-rc3.owrt.om/drivers/staging/android/power.h
+--- linux-2.6.29-rc3.owrt/drivers/staging/android/power.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/staging/android/power.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1 @@
++#include "../../../kernel/power/power.h"
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/staging/android/timed_gpio.c linux-2.6.29-rc3.owrt.om/drivers/staging/android/timed_gpio.c
+--- linux-2.6.29-rc3.owrt/drivers/staging/android/timed_gpio.c 2009-05-10 22:08:44.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/staging/android/timed_gpio.c 2009-05-10 22:28:00.000000000 +0200
+@@ -18,7 +18,7 @@
+ #include <linux/platform_device.h>
+ #include <linux/hrtimer.h>
+ #include <linux/err.h>
+-#include <asm/arch/gpio.h>
++#include <linux/gpio.h>
+
+ #include "timed_gpio.h"
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/staging/android/userwakelock.c linux-2.6.29-rc3.owrt.om/drivers/staging/android/userwakelock.c
+--- linux-2.6.29-rc3.owrt/drivers/staging/android/userwakelock.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/staging/android/userwakelock.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,245 @@
++/* kernel/power/userwakelock.c
++ *
++ * Copyright (C) 2005-2008 Google, Inc.
++ *
++ * This software is licensed under the terms of the GNU General Public
++ * License version 2, as published by the Free Software Foundation, and
++ * may be copied, distributed, and modified under those terms.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ */
++
++#include <linux/ctype.h>
++#include <linux/module.h>
++#include <linux/wakelock.h>
++
++#include "power.h"
++
++enum {
++ DEBUG_FAILURE = BIT(0),
++ DEBUG_ERROR = BIT(1),
++ DEBUG_NEW = BIT(2),
++ DEBUG_ACCESS = BIT(3),
++ DEBUG_LOOKUP = BIT(4),
++};
++static int debug_mask = DEBUG_FAILURE;
++module_param_named(debug_mask, debug_mask, int, S_IRUGO | S_IWUSR | S_IWGRP);
++
++static DEFINE_MUTEX(tree_lock);
++
++struct user_wake_lock {
++ struct rb_node node;
++ struct wake_lock wake_lock;
++ char name[0];
++};
++struct rb_root user_wake_locks;
++
++static struct user_wake_lock *lookup_wake_lock_name(
++ const char *buf, int allocate, long *timeoutptr)
++{
++ struct rb_node **p = &user_wake_locks.rb_node;
++ struct rb_node *parent = NULL;
++ struct user_wake_lock *l;
++ int diff;
++ u64 timeout;
++ int name_len;
++ const char *arg;
++
++ /* Find length of lock name and start of optional timeout string */
++ arg = buf;
++ while (*arg && !isspace(*arg))
++ arg++;
++ name_len = arg - buf;
++ if (!name_len)
++ goto bad_arg;
++ while (isspace(*arg))
++ arg++;
++
++ /* Process timeout string */
++ if (timeoutptr && *arg) {
++ timeout = simple_strtoull(arg, (char **)&arg, 0);
++ while (isspace(*arg))
++ arg++;
++ if (*arg)
++ goto bad_arg;
++ /* convert timeout from nanoseconds to jiffies > 0 */
++ timeout += (NSEC_PER_SEC / HZ) - 1;
++ do_div(timeout, (NSEC_PER_SEC / HZ));
++ if (timeout <= 0)
++ timeout = 1;
++ *timeoutptr = timeout;
++ } else if (*arg)
++ goto bad_arg;
++ else if (timeoutptr)
++ *timeoutptr = 0;
++
++ /* Lookup wake lock in rbtree */
++ while (*p) {
++ parent = *p;
++ l = rb_entry(parent, struct user_wake_lock, node);
++ diff = strncmp(buf, l->name, name_len);
++ if (!diff && l->name[name_len])
++ diff = -1;
++ if (debug_mask & DEBUG_ERROR)
++ pr_info("lookup_wake_lock_name: compare %.*s %s %d\n",
++ name_len, buf, l->name, diff);
++
++ if (diff < 0)
++ p = &(*p)->rb_left;
++ else if (diff > 0)
++ p = &(*p)->rb_right;
++ else
++ return l;
++ }
++
++ /* Allocate and add new wakelock to rbtree */
++ if (!allocate) {
++ if (debug_mask & DEBUG_ERROR)
++ pr_info("lookup_wake_lock_name: %.*s not found\n",
++ name_len, buf);
++ return ERR_PTR(-EINVAL);
++ }
++ l = kzalloc(sizeof(*l) + name_len + 1, GFP_KERNEL);
++ if (l == NULL) {
++ if (debug_mask & DEBUG_FAILURE)
++ pr_err("lookup_wake_lock_name: failed to allocate "
++ "memory for %.*s\n", name_len, buf);
++ return ERR_PTR(-ENOMEM);
++ }
++ memcpy(l->name, buf, name_len);
++ if (debug_mask & DEBUG_NEW)
++ pr_info("lookup_wake_lock_name: new wake lock %s\n", l->name);
++ wake_lock_init(&l->wake_lock, WAKE_LOCK_SUSPEND, l->name);
++ rb_link_node(&l->node, parent, p);
++ rb_insert_color(&l->node, &user_wake_locks);
++ return l;
++
++bad_arg:
++ if (debug_mask & DEBUG_ERROR)
++ pr_info("lookup_wake_lock_name: wake lock, %.*s, bad arg, %s\n",
++ name_len, buf, arg);
++ return ERR_PTR(-EINVAL);
++}
++
++ssize_t wake_lock_show(
++ struct kobject *kobj, struct kobj_attribute *attr, char *buf)
++{
++ char *s = buf;
++ char *end = buf + PAGE_SIZE;
++ struct rb_node *n;
++ struct user_wake_lock *l;
++
++ mutex_lock(&tree_lock);
++
++ for (n = rb_first(&user_wake_locks); n != NULL; n = rb_next(n)) {
++ l = rb_entry(n, struct user_wake_lock, node);
++ if (wake_lock_active(&l->wake_lock))
++ s += scnprintf(s, end - s, "%s ", l->name);
++ }
++ s += scnprintf(s, end - s, "\n");
++
++ mutex_unlock(&tree_lock);
++ return (s - buf);
++}
++
++ssize_t wake_full_lock_store(
++ struct kobject *kobj, struct kobj_attribute *attr,
++ const char *buf, size_t n)
++{
++ long timeout;
++ struct user_wake_lock *l;
++
++ mutex_lock(&tree_lock);
++ l = lookup_wake_lock_name(buf, 1, &timeout);
++ if (IS_ERR(l)) {
++ n = PTR_ERR(l);
++ goto bad_name;
++ }
++
++ if (debug_mask & DEBUG_ACCESS)
++ pr_info("wake_full_lock_store: %s, timeout %ld\n", l->name, timeout);
++
++ if (timeout == 0)
++ timeout = INT_MAX;
++
++ if (timeout)
++ wake_lock_timeout(&l->wake_lock, timeout);
++bad_name:
++ mutex_unlock(&tree_lock);
++ return n;
++}
++
++ssize_t wake_lock_store(
++ struct kobject *kobj, struct kobj_attribute *attr,
++ const char *buf, size_t n)
++{
++ long timeout;
++ struct user_wake_lock *l;
++
++ mutex_lock(&tree_lock);
++ l = lookup_wake_lock_name(buf, 1, &timeout);
++ if (IS_ERR(l)) {
++ n = PTR_ERR(l);
++ goto bad_name;
++ }
++
++ if (debug_mask & DEBUG_ACCESS)
++ pr_info("wake_lock_store: %s, timeout %ld\n", l->name, timeout);
++
++ if (timeout)
++ wake_lock_timeout(&l->wake_lock, timeout);
++ else
++ wake_lock(&l->wake_lock);
++bad_name:
++ mutex_unlock(&tree_lock);
++ return n;
++}
++
++
++ssize_t wake_unlock_show(
++ struct kobject *kobj, struct kobj_attribute *attr, char *buf)
++{
++ char *s = buf;
++ char *end = buf + PAGE_SIZE;
++ struct rb_node *n;
++ struct user_wake_lock *l;
++
++ mutex_lock(&tree_lock);
++
++ for (n = rb_first(&user_wake_locks); n != NULL; n = rb_next(n)) {
++ l = rb_entry(n, struct user_wake_lock, node);
++ if (!wake_lock_active(&l->wake_lock))
++ s += scnprintf(s, end - s, "%s ", l->name);
++ }
++ s += scnprintf(s, end - s, "\n");
++
++ mutex_unlock(&tree_lock);
++ return (s - buf);
++}
++
++ssize_t wake_unlock_store(
++ struct kobject *kobj, struct kobj_attribute *attr,
++ const char *buf, size_t n)
++{
++ struct user_wake_lock *l;
++
++ mutex_lock(&tree_lock);
++ l = lookup_wake_lock_name(buf, 0, NULL);
++ if (IS_ERR(l)) {
++ n = PTR_ERR(l);
++ goto not_found;
++ }
++
++ if (debug_mask & DEBUG_ACCESS)
++ pr_info("wake_unlock_store: %s\n", l->name);
++
++ wake_unlock(&l->wake_lock);
++not_found:
++ mutex_unlock(&tree_lock);
++ return n;
++}
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/staging/android/wakelock.c linux-2.6.29-rc3.owrt.om/drivers/staging/android/wakelock.c
+--- linux-2.6.29-rc3.owrt/drivers/staging/android/wakelock.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/staging/android/wakelock.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,605 @@
++/* kernel/power/wakelock.c
++ *
++ * Copyright (C) 2005-2008 Google, Inc.
++ *
++ * This software is licensed under the terms of the GNU General Public
++ * License version 2, as published by the Free Software Foundation, and
++ * may be copied, distributed, and modified under those terms.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/platform_device.h>
++#include <linux/rtc.h>
++#include <linux/suspend.h>
++#include <linux/syscalls.h> /* sys_sync */
++#include <linux/wakelock.h>
++#ifdef CONFIG_ANDROID_WAKELOCK_STAT
++#include <linux/proc_fs.h>
++#endif
++#include "power.h"
++
++enum {
++ DEBUG_EXIT_SUSPEND = 1U << 0,
++ DEBUG_WAKEUP = 1U << 1,
++ DEBUG_SUSPEND = 1U << 2,
++ DEBUG_EXPIRE = 1U << 3,
++ DEBUG_WAKE_LOCK = 1U << 4,
++};
++static int debug_mask = DEBUG_EXIT_SUSPEND | DEBUG_WAKEUP;
++
++module_param_named(debug_mask, debug_mask, int, S_IRUGO | S_IWUSR | S_IWGRP);
++
++#define WAKE_LOCK_TYPE_MASK (0x0f)
++#define WAKE_LOCK_INITIALIZED (1U << 8)
++#define WAKE_LOCK_ACTIVE (1U << 9)
++#define WAKE_LOCK_AUTO_EXPIRE (1U << 10)
++#define WAKE_LOCK_PREVENTING_SUSPEND (1U << 11)
++
++static DEFINE_SPINLOCK(list_lock);
++static LIST_HEAD(inactive_locks);
++static struct list_head active_wake_locks[WAKE_LOCK_TYPE_COUNT];
++static int current_event_num;
++struct workqueue_struct *suspend_work_queue;
++struct wake_lock main_wake_lock;
++suspend_state_t requested_suspend_state = PM_SUSPEND_MEM;
++static struct wake_lock unknown_wakeup;
++
++#ifdef CONFIG_ANDROID_WAKELOCK_STAT
++static struct wake_lock deleted_wake_locks;
++static ktime_t last_sleep_time_update;
++static int wait_for_wakeup;
++
++int get_expired_time(struct wake_lock *lock, ktime_t *expire_time)
++{
++ struct timespec ts;
++ struct timespec kt;
++ struct timespec tomono;
++ struct timespec delta;
++ unsigned long seq;
++ long timeout;
++
++ if (!(lock->flags & WAKE_LOCK_AUTO_EXPIRE))
++ return 0;
++ do {
++ seq = read_seqbegin(&xtime_lock);
++ timeout = lock->expires - jiffies;
++ if (timeout > 0)
++ return 0;
++ kt = current_kernel_time();
++ tomono = wall_to_monotonic;
++ } while (read_seqretry(&xtime_lock, seq));
++ jiffies_to_timespec(-timeout, &delta);
++ set_normalized_timespec(&ts, kt.tv_sec + tomono.tv_sec - delta.tv_sec,
++ kt.tv_nsec + tomono.tv_nsec - delta.tv_nsec);
++ *expire_time = timespec_to_ktime(ts);
++ return 1;
++}
++
++
++static int print_lock_stat(char *buf, struct wake_lock *lock)
++{
++ int lock_count = lock->stat.count;
++ int expire_count = lock->stat.expire_count;
++ ktime_t active_time = ktime_set(0, 0);
++ ktime_t total_time = lock->stat.total_time;
++ ktime_t max_time = lock->stat.max_time;
++ ktime_t prevent_suspend_time = lock->stat.prevent_suspend_time;
++ if (lock->flags & WAKE_LOCK_ACTIVE) {
++ ktime_t now, add_time;
++ int expired = get_expired_time(lock, &now);
++ if (!expired)
++ now = ktime_get();
++ add_time = ktime_sub(now, lock->stat.last_time);
++ lock_count++;
++ if (!expired)
++ active_time = add_time;
++ else
++ expire_count++;
++ total_time = ktime_add(total_time, add_time);
++ if (lock->flags & WAKE_LOCK_PREVENTING_SUSPEND)
++ prevent_suspend_time = ktime_add(prevent_suspend_time,
++ ktime_sub(now, last_sleep_time_update));
++ if (add_time.tv64 > max_time.tv64)
++ max_time = add_time;
++ }
++
++ return sprintf(buf, "\"%s\"\t%d\t%d\t%d\t%lld\t%lld\t%lld\t%lld\t"
++ "%lld\n", lock->name, lock_count, expire_count,
++ lock->stat.wakeup_count, ktime_to_ns(active_time),
++ ktime_to_ns(total_time),
++ ktime_to_ns(prevent_suspend_time), ktime_to_ns(max_time),
++ ktime_to_ns(lock->stat.last_time));
++}
++
++
++static int wakelocks_read_proc(char *page, char **start, off_t off,
++ int count, int *eof, void *data)
++{
++ unsigned long irqflags;
++ struct wake_lock *lock;
++ int len = 0;
++ char *p = page;
++ int type;
++
++ spin_lock_irqsave(&list_lock, irqflags);
++
++ p += sprintf(p, "name\tcount\texpire_count\twake_count\tactive_since"
++ "\ttotal_time\tsleep_time\tmax_time\tlast_change\n");
++ list_for_each_entry(lock, &inactive_locks, link) {
++ p += print_lock_stat(p, lock);
++ }
++ for (type = 0; type < WAKE_LOCK_TYPE_COUNT; type++) {
++ list_for_each_entry(lock, &active_wake_locks[type], link)
++ p += print_lock_stat(p, lock);
++ }
++ spin_unlock_irqrestore(&list_lock, irqflags);
++
++ *start = page + off;
++
++ len = p - page;
++ if (len > off)
++ len -= off;
++ else
++ len = 0;
++
++ return len < count ? len : count;
++}
++
++static void wake_unlock_stat_locked(struct wake_lock *lock, int expired)
++{
++ ktime_t duration;
++ ktime_t now;
++ if (!(lock->flags & WAKE_LOCK_ACTIVE))
++ return;
++ if (get_expired_time(lock, &now))
++ expired = 1;
++ else
++ now = ktime_get();
++ lock->stat.count++;
++ if (expired)
++ lock->stat.expire_count++;
++ duration = ktime_sub(now, lock->stat.last_time);
++ lock->stat.total_time = ktime_add(lock->stat.total_time, duration);
++ if (ktime_to_ns(duration) > ktime_to_ns(lock->stat.max_time))
++ lock->stat.max_time = duration;
++ lock->stat.last_time = ktime_get();
++ if (lock->flags & WAKE_LOCK_PREVENTING_SUSPEND) {
++ duration = ktime_sub(now, last_sleep_time_update);
++ lock->stat.prevent_suspend_time = ktime_add(
++ lock->stat.prevent_suspend_time, duration);
++ lock->flags &= ~WAKE_LOCK_PREVENTING_SUSPEND;
++ }
++}
++
++static void update_sleep_wait_stats_locked(int done)
++{
++ struct wake_lock *lock;
++ ktime_t now, etime, elapsed, add;
++ int expired;
++
++ now = ktime_get();
++ elapsed = ktime_sub(now, last_sleep_time_update);
++ list_for_each_entry(lock, &active_wake_locks[WAKE_LOCK_SUSPEND], link) {
++ expired = get_expired_time(lock, &etime);
++ if (lock->flags & WAKE_LOCK_PREVENTING_SUSPEND) {
++ if (expired)
++ add = ktime_sub(etime, last_sleep_time_update);
++ else
++ add = elapsed;
++ lock->stat.prevent_suspend_time = ktime_add(
++ lock->stat.prevent_suspend_time, add);
++ }
++ if (done || expired)
++ lock->flags &= ~WAKE_LOCK_PREVENTING_SUSPEND;
++ else
++ lock->flags |= WAKE_LOCK_PREVENTING_SUSPEND;
++ }
++ last_sleep_time_update = now;
++}
++#endif
++
++
++static void expire_wake_lock(struct wake_lock *lock)
++{
++#ifdef CONFIG_ANDROID_WAKELOCK_STAT
++ wake_unlock_stat_locked(lock, 1);
++#endif
++ lock->flags &= ~(WAKE_LOCK_ACTIVE | WAKE_LOCK_AUTO_EXPIRE);
++ list_del(&lock->link);
++ list_add(&lock->link, &inactive_locks);
++ if (debug_mask & (DEBUG_WAKE_LOCK | DEBUG_EXPIRE))
++ pr_info("expired wake lock %s\n", lock->name);
++}
++
++static void print_active_locks(int type)
++{
++ unsigned long irqflags;
++ struct wake_lock *lock;
++
++ BUG_ON(type >= WAKE_LOCK_TYPE_COUNT);
++ spin_lock_irqsave(&list_lock, irqflags);
++ list_for_each_entry(lock, &active_wake_locks[type], link) {
++ if (lock->flags & WAKE_LOCK_AUTO_EXPIRE) {
++ long timeout = lock->expires - jiffies;
++ if (timeout <= 0)
++ pr_info("wake lock %s, expired\n", lock->name);
++ else
++ pr_info("active wake lock %s, time left %ld\n",
++ lock->name, timeout);
++ } else
++ pr_info("active wake lock %s\n", lock->name);
++ }
++ spin_unlock_irqrestore(&list_lock, irqflags);
++}
++
++static long has_wake_lock_locked(int type)
++{
++ struct wake_lock *lock, *n;
++ long max_timeout = 0;
++
++ BUG_ON(type >= WAKE_LOCK_TYPE_COUNT);
++ list_for_each_entry_safe(lock, n, &active_wake_locks[type], link) {
++ if (lock->flags & WAKE_LOCK_AUTO_EXPIRE) {
++ long timeout = lock->expires - jiffies;
++ if (timeout <= 0)
++ expire_wake_lock(lock);
++ else if (timeout > max_timeout)
++ max_timeout = timeout;
++ } else
++ return -1;
++ }
++ return max_timeout;
++}
++
++long has_wake_lock(int type)
++{
++ long ret;
++ unsigned long irqflags;
++ spin_lock_irqsave(&list_lock, irqflags);
++ ret = has_wake_lock_locked(type);
++ spin_unlock_irqrestore(&list_lock, irqflags);
++ return ret;
++}
++
++static void suspend(struct work_struct *work)
++{
++ int ret;
++ int entry_event_num;
++
++ if (has_wake_lock(WAKE_LOCK_SUSPEND)) {
++ if (debug_mask & DEBUG_SUSPEND)
++ pr_info("suspend: abort suspend\n");
++ return;
++ }
++
++ entry_event_num = current_event_num;
++ sys_sync();
++ if (debug_mask & DEBUG_SUSPEND)
++ pr_info("suspend: enter suspend\n");
++ ret = pm_suspend(requested_suspend_state);
++ if (debug_mask & DEBUG_EXIT_SUSPEND) {
++ struct timespec ts;
++ struct rtc_time tm;
++ getnstimeofday(&ts);
++ rtc_time_to_tm(ts.tv_sec, &tm);
++ pr_info("suspend: exit suspend, ret = %d "
++ "(%d-%02d-%02d %02d:%02d:%02d.%09lu UTC)\n", ret,
++ tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
++ tm.tm_hour, tm.tm_min, tm.tm_sec, ts.tv_nsec);
++ }
++ /* Openmoko needs more times to resume and a timeout is necessary
++ * in any case */
++ if (current_event_num == entry_event_num) {
++ if (debug_mask & DEBUG_SUSPEND)
++ pr_info("suspend: pm_suspend returned with no event\n");
++ wake_lock_timeout(&unknown_wakeup, HZ / 2);
++ } else {
++ /* create a temp lock to avoid autosuspend */
++ wake_lock_timeout(&unknown_wakeup, 5 * HZ);
++ }
++}
++
++static DECLARE_WORK(suspend_work, suspend);
++
++static void expire_wake_locks(unsigned long data)
++{
++ long has_lock;
++ unsigned long irqflags;
++ if (debug_mask & DEBUG_EXPIRE)
++ pr_info("expire_wake_locks: start\n");
++ if (debug_mask & DEBUG_SUSPEND)
++ print_active_locks(WAKE_LOCK_SUSPEND);
++ spin_lock_irqsave(&list_lock, irqflags);
++ has_lock = has_wake_lock_locked(WAKE_LOCK_SUSPEND);
++ if (debug_mask & DEBUG_EXPIRE)
++ pr_info("expire_wake_locks: done, has_lock %ld\n", has_lock);
++ if (has_lock == 0)
++ queue_work(suspend_work_queue, &suspend_work);
++ spin_unlock_irqrestore(&list_lock, irqflags);
++}
++static DEFINE_TIMER(expire_timer, expire_wake_locks, 0, 0);
++
++static int power_suspend_late(struct platform_device *pdev, pm_message_t state)
++{
++ int ret = has_wake_lock(WAKE_LOCK_SUSPEND) ? -EAGAIN : 0;
++#ifdef CONFIG_ANDROID_WAKELOCK_STAT
++ wait_for_wakeup = 1;
++#endif
++ if (debug_mask & DEBUG_SUSPEND)
++ pr_info("power_suspend_late return %d\n", ret);
++ return ret;
++}
++
++static struct platform_driver power_driver = {
++ .driver.name = "power",
++ .suspend_late = power_suspend_late,
++};
++static struct platform_device power_device = {
++ .name = "power",
++};
++
++void wake_lock_init(struct wake_lock *lock, int type, const char *name)
++{
++ unsigned long irqflags = 0;
++
++ if (name)
++ lock->name = name;
++ BUG_ON(!lock->name);
++
++ if (debug_mask & DEBUG_WAKE_LOCK)
++ pr_info("wake_lock_init name=%s\n", lock->name);
++#ifdef CONFIG_ANDROID_WAKELOCK_STAT
++ lock->stat.count = 0;
++ lock->stat.expire_count = 0;
++ lock->stat.wakeup_count = 0;
++ lock->stat.total_time = ktime_set(0, 0);
++ lock->stat.prevent_suspend_time = ktime_set(0, 0);
++ lock->stat.max_time = ktime_set(0, 0);
++ lock->stat.last_time = ktime_set(0, 0);
++#endif
++ lock->flags = (type & WAKE_LOCK_TYPE_MASK) | WAKE_LOCK_INITIALIZED;
++
++ INIT_LIST_HEAD(&lock->link);
++ spin_lock_irqsave(&list_lock, irqflags);
++ list_add(&lock->link, &inactive_locks);
++ spin_unlock_irqrestore(&list_lock, irqflags);
++}
++EXPORT_SYMBOL(wake_lock_init);
++
++void wake_lock_destroy(struct wake_lock *lock)
++{
++ unsigned long irqflags;
++ if (debug_mask & DEBUG_WAKE_LOCK)
++ pr_info("wake_lock_destroy name=%s\n", lock->name);
++ spin_lock_irqsave(&list_lock, irqflags);
++ lock->flags &= ~WAKE_LOCK_INITIALIZED;
++#ifdef CONFIG_ANDROID_WAKELOCK_STAT
++ if (lock->stat.count) {
++ deleted_wake_locks.stat.count += lock->stat.count;
++ deleted_wake_locks.stat.expire_count += lock->stat.expire_count;
++ deleted_wake_locks.stat.total_time =
++ ktime_add(deleted_wake_locks.stat.total_time,
++ lock->stat.total_time);
++ deleted_wake_locks.stat.prevent_suspend_time =
++ ktime_add(deleted_wake_locks.stat.prevent_suspend_time,
++ lock->stat.prevent_suspend_time);
++ deleted_wake_locks.stat.max_time =
++ ktime_add(deleted_wake_locks.stat.max_time,
++ lock->stat.max_time);
++ }
++#endif
++ list_del(&lock->link);
++ spin_unlock_irqrestore(&list_lock, irqflags);
++}
++EXPORT_SYMBOL(wake_lock_destroy);
++
++static void wake_lock_internal(
++ struct wake_lock *lock, long timeout, int has_timeout)
++{
++ int type;
++ unsigned long irqflags;
++ long expire_in;
++
++ spin_lock_irqsave(&list_lock, irqflags);
++ type = lock->flags & WAKE_LOCK_TYPE_MASK;
++ BUG_ON(type >= WAKE_LOCK_TYPE_COUNT);
++ BUG_ON(!(lock->flags & WAKE_LOCK_INITIALIZED));
++#ifdef CONFIG_ANDROID_WAKELOCK_STAT
++ if (type == WAKE_LOCK_SUSPEND && wait_for_wakeup) {
++ if (debug_mask & DEBUG_WAKEUP)
++ pr_info("wakeup wake lock: %s\n", lock->name);
++ wait_for_wakeup = 0;
++ lock->stat.wakeup_count++;
++ }
++ if ((lock->flags & WAKE_LOCK_AUTO_EXPIRE) &&
++ (long)(lock->expires - jiffies) <= 0) {
++ wake_unlock_stat_locked(lock, 0);
++ lock->stat.last_time = ktime_get();
++ }
++#endif
++ if (!(lock->flags & WAKE_LOCK_ACTIVE)) {
++ lock->flags |= WAKE_LOCK_ACTIVE;
++#ifdef CONFIG_ANDROID_WAKELOCK_STAT
++ lock->stat.last_time = ktime_get();
++#endif
++ }
++ list_del(&lock->link);
++ if (has_timeout) {
++ if (debug_mask & DEBUG_WAKE_LOCK)
++ pr_info("wake_lock: %s, type %d, timeout %ld.%03lu\n",
++ lock->name, type, timeout / HZ,
++ (timeout % HZ) * MSEC_PER_SEC / HZ);
++ lock->expires = jiffies + timeout;
++ lock->flags |= WAKE_LOCK_AUTO_EXPIRE;
++ list_add_tail(&lock->link, &active_wake_locks[type]);
++ } else {
++ if (debug_mask & DEBUG_WAKE_LOCK)
++ pr_info("wake_lock: %s, type %d\n", lock->name, type);
++ lock->expires = LONG_MAX;
++ lock->flags &= ~WAKE_LOCK_AUTO_EXPIRE;
++ list_add(&lock->link, &active_wake_locks[type]);
++ }
++ if (type == WAKE_LOCK_SUSPEND) {
++ current_event_num++;
++#ifdef CONFIG_ANDROID_WAKELOCK_STAT
++ if (lock == &main_wake_lock)
++ update_sleep_wait_stats_locked(1);
++ else if (!wake_lock_active(&main_wake_lock))
++ update_sleep_wait_stats_locked(0);
++#endif
++ if (has_timeout)
++ expire_in = has_wake_lock_locked(type);
++ else
++ expire_in = -1;
++ if (expire_in > 0) {
++ if (debug_mask & DEBUG_EXPIRE)
++ pr_info("wake_lock: %s, start expire timer, "
++ "%ld\n", lock->name, expire_in);
++ mod_timer(&expire_timer, jiffies + expire_in);
++ } else {
++ if (del_timer(&expire_timer))
++ if (debug_mask & DEBUG_EXPIRE)
++ pr_info("wake_lock: %s, stop expire timer\n",
++ lock->name);
++ if (expire_in == 0)
++ queue_work(suspend_work_queue, &suspend_work);
++ }
++ }
++ spin_unlock_irqrestore(&list_lock, irqflags);
++}
++
++void wake_lock(struct wake_lock *lock)
++{
++ wake_lock_internal(lock, 0, 0);
++}
++EXPORT_SYMBOL(wake_lock);
++
++void wake_lock_timeout(struct wake_lock *lock, long timeout)
++{
++ wake_lock_internal(lock, timeout, 1);
++}
++EXPORT_SYMBOL(wake_lock_timeout);
++
++void wake_unlock(struct wake_lock *lock)
++{
++ int type;
++ unsigned long irqflags;
++ spin_lock_irqsave(&list_lock, irqflags);
++ type = lock->flags & WAKE_LOCK_TYPE_MASK;
++#ifdef CONFIG_ANDROID_WAKELOCK_STAT
++ wake_unlock_stat_locked(lock, 0);
++#endif
++ if (debug_mask & DEBUG_WAKE_LOCK)
++ pr_info("wake_unlock: %s\n", lock->name);
++ lock->flags &= ~(WAKE_LOCK_ACTIVE | WAKE_LOCK_AUTO_EXPIRE);
++ list_del(&lock->link);
++ list_add(&lock->link, &inactive_locks);
++ if (type == WAKE_LOCK_SUSPEND) {
++ long has_lock = has_wake_lock_locked(type);
++ if (has_lock > 0) {
++ if (debug_mask & DEBUG_EXPIRE)
++ pr_info("wake_unlock: %s, start expire timer, "
++ "%ld\n", lock->name, has_lock);
++ mod_timer(&expire_timer, jiffies + has_lock);
++ } else {
++ if (del_timer(&expire_timer))
++ if (debug_mask & DEBUG_EXPIRE)
++ pr_info("wake_unlock: %s, stop expire "
++ "timer\n", lock->name);
++ if (has_lock == 0)
++ queue_work(suspend_work_queue, &suspend_work);
++ }
++ if (lock == &main_wake_lock) {
++ if (debug_mask & DEBUG_SUSPEND)
++ print_active_locks(WAKE_LOCK_SUSPEND);
++#ifdef CONFIG_ANDROID_WAKELOCK_STAT
++ update_sleep_wait_stats_locked(0);
++#endif
++ }
++ }
++ spin_unlock_irqrestore(&list_lock, irqflags);
++}
++EXPORT_SYMBOL(wake_unlock);
++
++int wake_lock_active(struct wake_lock *lock)
++{
++ return !!(lock->flags & WAKE_LOCK_ACTIVE);
++}
++EXPORT_SYMBOL(wake_lock_active);
++
++static int __init wakelocks_init(void)
++{
++ int ret;
++ int i;
++
++ for (i = 0; i < ARRAY_SIZE(active_wake_locks); i++)
++ INIT_LIST_HEAD(&active_wake_locks[i]);
++
++#ifdef CONFIG_ANDROID_WAKELOCK_STAT
++ wake_lock_init(&deleted_wake_locks, WAKE_LOCK_SUSPEND,
++ "deleted_wake_locks");
++#endif
++ wake_lock_init(&main_wake_lock, WAKE_LOCK_SUSPEND, "main");
++ wake_lock(&main_wake_lock);
++ wake_lock_init(&unknown_wakeup, WAKE_LOCK_SUSPEND, "unknown_wakeups");
++
++ ret = platform_device_register(&power_device);
++ if (ret) {
++ pr_err("wakelocks_init: platform_device_register failed\n");
++ goto err_platform_device_register;
++ }
++ ret = platform_driver_register(&power_driver);
++ if (ret) {
++ pr_err("wakelocks_init: platform_driver_register failed\n");
++ goto err_platform_driver_register;
++ }
++
++ suspend_work_queue = create_singlethread_workqueue("suspend");
++ if (suspend_work_queue == NULL) {
++ ret = -ENOMEM;
++ goto err_suspend_work_queue;
++ }
++
++#ifdef CONFIG_ANDROID_WAKELOCK_STAT
++ create_proc_read_entry("wakelocks", S_IRUGO, NULL,
++ wakelocks_read_proc, NULL);
++#endif
++
++ return 0;
++
++err_suspend_work_queue:
++ platform_driver_unregister(&power_driver);
++err_platform_driver_register:
++ platform_device_unregister(&power_device);
++err_platform_device_register:
++ wake_lock_destroy(&unknown_wakeup);
++ wake_lock_destroy(&main_wake_lock);
++#ifdef CONFIG_ANDROID_WAKELOCK_STAT
++ wake_lock_destroy(&deleted_wake_locks);
++#endif
++ return ret;
++}
++
++static void __exit wakelocks_exit(void)
++{
++#ifdef CONFIG_ANDROID_WAKELOCK_STAT
++ remove_proc_entry("wakelocks", NULL);
++#endif
++ destroy_workqueue(suspend_work_queue);
++ platform_driver_unregister(&power_driver);
++ platform_device_unregister(&power_device);
++ wake_lock_destroy(&unknown_wakeup);
++ wake_lock_destroy(&main_wake_lock);
++#ifdef CONFIG_ANDROID_WAKELOCK_STAT
++ wake_lock_destroy(&deleted_wake_locks);
++#endif
++}
++
++core_initcall(wakelocks_init);
++module_exit(wakelocks_exit);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/usb/gadget/composite.c linux-2.6.29-rc3.owrt.om/drivers/usb/gadget/composite.c
+--- linux-2.6.29-rc3.owrt/drivers/usb/gadget/composite.c 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/usb/gadget/composite.c 2009-05-10 22:28:00.000000000 +0200
+@@ -1046,7 +1046,11 @@
+ /*-------------------------------------------------------------------------*/
+
+ static struct usb_gadget_driver composite_driver = {
++#ifdef CONFIG_USB_GADGET_DUALSPEED
+ .speed = USB_SPEED_HIGH,
++#else
++ .speed = USB_SPEED_FULL,
++#endif
+
+ .bind = composite_bind,
+ .unbind = __exit_p(composite_unbind),
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/usb/gadget/epautoconf.c linux-2.6.29-rc3.owrt.om/drivers/usb/gadget/epautoconf.c
+--- linux-2.6.29-rc3.owrt/drivers/usb/gadget/epautoconf.c 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/usb/gadget/epautoconf.c 2009-05-10 22:28:00.000000000 +0200
+@@ -275,6 +275,18 @@
+ ep = find_ep (gadget, "ep1-bulk");
+ if (ep && ep_matches (gadget, ep, desc))
+ return ep;
++ } else if (gadget_is_s3c64xx(gadget)) {
++ if (USB_ENDPOINT_XFER_INT == type) {
++ /* single buffering is enough */
++ ep = find_ep(gadget, "ep3-int");
++ if (ep && ep_matches(gadget, ep, desc))
++ return ep;
++ } else if (USB_ENDPOINT_XFER_BULK == type
++ && (USB_DIR_IN & desc->bEndpointAddress)) {
++ ep = find_ep(gadget, "ep2-bulk");
++ if (ep && ep_matches(gadget, ep, desc))
++ return ep;
++ }
+ }
+
+ /* Second, look at endpoints until an unclaimed one looks usable */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/usb/gadget/ether.c linux-2.6.29-rc3.owrt.om/drivers/usb/gadget/ether.c
+--- linux-2.6.29-rc3.owrt/drivers/usb/gadget/ether.c 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/usb/gadget/ether.c 2009-05-10 22:28:00.000000000 +0200
+@@ -122,11 +122,16 @@
+ * Instead: allocate your own, using normal USB-IF procedures.
+ */
+
++#if 0
+ /* Thanks to NetChip Technologies for donating this product ID.
+ * It's for devices with only CDC Ethernet configurations.
+ */
+ #define CDC_VENDOR_NUM 0x0525 /* NetChip */
+ #define CDC_PRODUCT_NUM 0xa4a1 /* Linux-USB Ethernet Gadget */
++#else
++#define CDC_VENDOR_NUM 0x1457 /* First International Computer */
++#define CDC_PRODUCT_NUM 0x5117 /* Linux-USB Ethernet Gadget */
++#endif
+
+ /* For hardware that can't talk CDC, we use the same vendor ID that
+ * ARM Linux has used for ethernet-over-usb, both with sa1100 and
+@@ -147,8 +152,8 @@
+ * used with CDC Ethernet, Linux 2.4 hosts will need updates to choose
+ * the non-RNDIS configuration.
+ */
+-#define RNDIS_VENDOR_NUM 0x0525 /* NetChip */
+-#define RNDIS_PRODUCT_NUM 0xa4a2 /* Ethernet/RNDIS Gadget */
++#define RNDIS_VENDOR_NUM 0x1457 /* NetChip */
++#define RNDIS_PRODUCT_NUM 0x5122 /* Ethernet/RNDIS Gadget */
+
+ /*-------------------------------------------------------------------------*/
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/usb/gadget/f_rndis.c linux-2.6.29-rc3.owrt.om/drivers/usb/gadget/f_rndis.c
+--- linux-2.6.29-rc3.owrt/drivers/usb/gadget/f_rndis.c 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/usb/gadget/f_rndis.c 2009-05-10 22:28:00.000000000 +0200
+@@ -437,7 +437,8 @@
+ DBG(cdev, "rndis req%02x.%02x v%04x i%04x l%d\n",
+ ctrl->bRequestType, ctrl->bRequest,
+ w_value, w_index, w_length);
+- req->zero = 0;
++ req->zero = value < w_length
++ && (value % cdev->gadget->ep0->maxpacket) == 0;
+ req->length = value;
+ value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
+ if (value < 0)
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/usb/gadget/gadget_chips.h linux-2.6.29-rc3.owrt.om/drivers/usb/gadget/gadget_chips.h
+--- linux-2.6.29-rc3.owrt/drivers/usb/gadget/gadget_chips.h 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/usb/gadget/gadget_chips.h 2009-05-10 22:28:00.000000000 +0200
+@@ -104,6 +104,12 @@
+ #define gadget_is_s3c2410(g) 0
+ #endif
+
++#ifdef CONFIG_USB_GADGET_S3C_OTGD_HS
++#define gadget_is_s3c64xx(g) !strcmp("s3c-otg-device", (g)->name)
++#else
++#define gadget_is_s3c64xx(g) 0
++#endif
++
+ #ifdef CONFIG_USB_GADGET_AT91
+ #define gadget_is_at91(g) !strcmp("at91_udc", (g)->name)
+ #else
+@@ -231,6 +237,8 @@
+ return 0x22;
+ else if (gadget_is_ci13xxx(gadget))
+ return 0x23;
++ else if (gadget_is_s3c64xx(gadget))
++ return 0x24;
+ return -ENOENT;
+ }
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/usb/gadget/Kconfig linux-2.6.29-rc3.owrt.om/drivers/usb/gadget/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/usb/gadget/Kconfig 2009-05-10 22:08:45.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/usb/gadget/Kconfig 2009-05-10 22:28:00.000000000 +0200
+@@ -291,6 +291,22 @@
+ boolean "S3C2410 udc debug messages"
+ depends on USB_GADGET_S3C2410
+
++config USB_GADGET_S3C_OTGD_HS
++ boolean "S3C high speed(2.0, dual-speed) USB OTG device"
++ depends on (CPU_S3C6400 || CPU_S3C6410)
++ select USB_GADGET_SELECTED
++ select USB_GADGET_DUALSPEED
++ help
++ Say "y" to link the driver statically, or "m" to build a
++ dynamically linked module called "s3c_udc_hs" and force all
++ gadget drivers to also be dynamically linked.
++
++config USB_S3C
++ tristate
++ depends on USB_GADGET_S3C_FS && USB_GADGET_S3C_HS && USB_GADGET_S3C_OTGD_HS
++ default USB_GADGET
++ select USB_GADGET_SELECTED
++
+ #
+ # Controllers available in both integrated and discrete versions
+ #
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/usb/gadget/Makefile linux-2.6.29-rc3.owrt.om/drivers/usb/gadget/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/usb/gadget/Makefile 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/usb/gadget/Makefile 2009-05-10 22:28:00.000000000 +0200
+@@ -19,6 +19,7 @@
+ obj-$(CONFIG_USB_ATMEL_USBA) += atmel_usba_udc.o
+ obj-$(CONFIG_USB_FSL_USB2) += fsl_usb2_udc.o
+ obj-$(CONFIG_USB_M66592) += m66592-udc.o
++obj-$(CONFIG_USB_GADGET_S3C_OTGD_HS) += s3c_hs_otg.o
+ obj-$(CONFIG_USB_FSL_QE) += fsl_qe_udc.o
+ obj-$(CONFIG_USB_CI13XXX) += ci13xxx_udc.o
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/usb/gadget/s3c2410_udc.c linux-2.6.29-rc3.owrt.om/drivers/usb/gadget/s3c2410_udc.c
+--- linux-2.6.29-rc3.owrt/drivers/usb/gadget/s3c2410_udc.c 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/usb/gadget/s3c2410_udc.c 2009-05-10 22:28:00.000000000 +0200
+@@ -134,6 +134,8 @@
+ return 0;
+ }
+ #endif
++
++#ifdef CONFIG_USB_GADGET_DEBUG_FS
+ static int s3c2410_udc_debugfs_seq_show(struct seq_file *m, void *p)
+ {
+ u32 addr_reg,pwr_reg,ep_int_reg,usb_int_reg;
+@@ -197,6 +199,7 @@
+ .release = single_release,
+ .owner = THIS_MODULE,
+ };
++#endif
+
+ /* io macros */
+
+@@ -843,6 +846,7 @@
+ u32 ep_csr1;
+ u32 idx;
+
++handle_ep_again:
+ if (likely (!list_empty(&ep->queue)))
+ req = list_entry(ep->queue.next,
+ struct s3c2410_request, queue);
+@@ -882,6 +886,8 @@
+
+ if ((ep_csr1 & S3C2410_UDC_OCSR1_PKTRDY) && req) {
+ s3c2410_udc_read_fifo(ep,req);
++ if (s3c2410_udc_fifo_count_out())
++ goto handle_ep_again;
+ }
+ }
+ }
+@@ -1707,6 +1713,7 @@
+ if (driver->disconnect)
+ driver->disconnect(&udc->gadget);
+
++ driver->unbind(&udc->gadget);
+ device_del(&udc->gadget.dev);
+ udc->driver = NULL;
+
+@@ -1897,6 +1904,7 @@
+ udc->vbus = 1;
+ }
+
++#ifdef CONFIG_USB_GADGET_DEBUG_FS
+ if (s3c2410_udc_debugfs_root) {
+ udc->regs_info = debugfs_create_file("registers", S_IRUGO,
+ s3c2410_udc_debugfs_root,
+@@ -1904,6 +1912,7 @@
+ if (!udc->regs_info)
+ dev_warn(dev, "debugfs file creation failed\n");
+ }
++#endif
+
+ dev_dbg(dev, "probe ok\n");
+
+@@ -2013,12 +2022,14 @@
+
+ dprintk(DEBUG_NORMAL, "%s: version %s\n", gadget_name, DRIVER_VERSION);
+
++#ifdef CONFIG_USB_GADGET_DEBUG_FS
+ s3c2410_udc_debugfs_root = debugfs_create_dir(gadget_name, NULL);
+ if (IS_ERR(s3c2410_udc_debugfs_root)) {
+ printk(KERN_ERR "%s: debugfs dir creation failed %ld\n",
+ gadget_name, PTR_ERR(s3c2410_udc_debugfs_root));
+ s3c2410_udc_debugfs_root = NULL;
+ }
++#endif
+
+ retval = platform_driver_register(&udc_driver_2410);
+ if (retval)
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/usb/gadget/s3c_hs_otg.c linux-2.6.29-rc3.owrt.om/drivers/usb/gadget/s3c_hs_otg.c
+--- linux-2.6.29-rc3.owrt/drivers/usb/gadget/s3c_hs_otg.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/usb/gadget/s3c_hs_otg.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,1874 @@
++/*
++ * drivers/usb/gadget/s3c_hs_otg.c
++ * Samsung S3C on-chip full/high speed USB OTG 2.0 device controllers
++ *
++ * Copyright (C) 2008 Samsung Electronics
++ * Minkyu Kang <mk7.kang@samsung.com>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ *
++ */
++
++#include "s3c-udc.h"
++#include <linux/platform_device.h>
++#include <linux/clk.h>
++#include <mach/map.h>
++#include <plat/regs-clock.h>
++#include <plat/regs-usb-hs-otg.h>
++#include <plat/regs-sys.h>
++#include <plat/devs.h>
++
++static char *state_names[] = {
++ "WAIT_FOR_SETUP",
++ "DATA_STATE_XMIT",
++ "DATA_STATE_NEED_ZLP",
++ "WAIT_FOR_OUT_STATUS",
++ "DATA_STATE_RECV"
++};
++
++#define S3C_USB_DBG_LEVEL 0
++
++#define DBG(level, fmt, args...) do { \
++ if (level >= S3C_USB_DBG_LEVEL) { \
++ printk(KERN_INFO "[%s] " fmt, \
++ __func__, ##args); \
++ } } while (0)
++
++
++#define DRIVER_DESC "Samsung Dual-speed USB 2.0 OTG Device Controller"
++#define DRIVER_AUTHOR "Samsung Electronics"
++#define DRIVER_VERSION "04 Dec 2008"
++
++
++struct s3c_udc *the_controller;
++
++static const char driver_name[] = "s3c-otg-device";
++static const char driver_desc[] = DRIVER_DESC;
++static const char ep0name[] = "ep0-control";
++
++static u32 tx_ep_num = 2;
++
++static u32 ep0_fifo_size = EP0_FIFO_SIZE;
++static u32 ep_fifo_size = EP_FIFO_SIZE;
++static u32 ep_fifo_size2 = EP_FIFO_SIZE2;
++
++struct usb_ctrlrequest ctrl;
++static int reset_available = 1;
++
++#ifdef CONFIG_USB_GADGET_DEBUG_FILES
++
++static const char proc_node_name[] = "driver/otg";
++
++static int
++udc_proc_read(char *page, char **start, off_t off, int count,
++ int *eof, void *_dev)
++{
++ char *buf = page;
++ struct s3c_udc *dev = _dev;
++ char *next = buf;
++ unsigned size = count;
++ unsigned long flags;
++ int t;
++
++ if (off != 0)
++ return 0;
++
++ local_irq_save(flags);
++
++ /* basic device status */
++ t = scnprintf(next, size,
++ DRIVER_DESC "\n"
++ "%s version: %s\n"
++ "Gadget driver: %s\n"
++ "\n",
++ driver_name, DRIVER_VERSION,
++ dev->driver ? dev->driver->driver.name : "(none)");
++ size -= t;
++ next += t;
++
++ local_irq_restore(flags);
++ *eof = 1;
++ return count - size;
++}
++
++#define create_proc_files() \
++ create_proc_read_entry(proc_node_name, 0, NULL, udc_proc_read, dev)
++#define remove_proc_files() \
++ remove_proc_entry(proc_node_name, NULL)
++
++#else /* !CONFIG_USB_GADGET_DEBUG_FILES */
++
++#define create_proc_files() do {} while (0)
++#define remove_proc_files() do {} while (0)
++
++#endif /* CONFIG_USB_GADGET_DEBUG_FILES */
++
++
++static u32 s3c_otg_readl(struct s3c_udc *dev, u32 reg)
++{
++ return __raw_readl((u32)dev->reg_base + reg);
++}
++
++static void s3c_otg_writel(struct s3c_udc *dev, u32 val, u32 reg)
++{
++ __raw_writel(val, ((u32)dev->reg_base) + reg);
++}
++
++static void s3c_otg_orl(struct s3c_udc *dev, u32 val, u32 reg)
++{
++ u32 temp = __raw_readl(((u32)dev->reg_base) + reg);
++
++ __raw_writel(val|temp, ((u32)dev->reg_base) + reg);
++}
++
++/*
++ * retire a request
++ */
++static void s3c_otg_done(struct s3c_ep *ep, struct s3c_request *req, int status)
++{
++ unsigned int stopped = ep->stopped;
++
++ DBG(1, "%s %p, stopped = %d\n", ep->ep.name, ep, stopped);
++ list_del_init(&req->queue);
++
++ if (req->req.status == -EINPROGRESS)
++ req->req.status = status;
++ else
++ status = req->req.status;
++
++ if (status && (status != -ESHUTDOWN))
++ DBG(2, "complete %s stat %d len %u/%u\n",
++ ep->ep.name, status, req->req.actual, req->req.length);
++
++ /* don't modify queue heads during completion callback */
++ ep->stopped = 1;
++
++ spin_unlock(&ep->dev->lock);
++ req->req.complete(&ep->ep, &req->req);
++ spin_lock(&ep->dev->lock);
++
++ ep->stopped = stopped;
++}
++
++/*
++ * dequeue ALL requests
++ */
++void s3c_otg_nuke(struct s3c_ep *ep, int status)
++{
++ struct s3c_request *req;
++
++ DBG(1, "%s %p\n", ep->ep.name, ep);
++
++ /* called with irqs blocked */
++ while (!list_empty(&ep->queue)) {
++ req = list_entry(ep->queue.next, struct s3c_request, queue);
++ s3c_otg_done(ep, req, status);
++ }
++}
++
++static void s3c_otg_ep_control(int ep, int dir, u32 val, int update)
++{
++ u32 epctrl;
++
++ switch (ep) {
++ case 0:
++ if (dir)
++ epctrl = (u32)S3C_UDC_OTG_DIEPCTL0;
++ else
++ epctrl = (u32)S3C_UDC_OTG_DOEPCTL0;
++ break;
++ case 1:
++ if (dir)
++ epctrl = -EOPNOTSUPP;
++ else
++ epctrl = (u32)S3C_UDC_OTG_DOEPCTL1;
++ break;
++ case 2:
++ if (dir)
++ epctrl = (u32)S3C_UDC_OTG_DIEPCTL2;
++ else
++ epctrl = -EOPNOTSUPP;
++ break;
++ case 3:
++ if (dir)
++ epctrl = (u32)S3C_UDC_OTG_DIEPCTL3;
++ else
++ epctrl = -EOPNOTSUPP;
++ break;
++ default:
++ DBG(3, "ep%d is unused Endpoint", ep);
++ return;
++ }
++
++ if (epctrl < 0) {
++ DBG(3, "ep%d - %s is invalid direction\n",
++ ep, dir ? "IN" : "OUT");
++ return;
++ }
++
++ if (update)
++ s3c_otg_orl(the_controller, val, epctrl);
++ else
++ s3c_otg_writel(the_controller, val, epctrl);
++}
++
++static int s3c_otg_write_packet(struct s3c_ep *ep,
++ struct s3c_request *req, int max)
++{
++ u32 *buf;
++ int length;
++ int count;
++ u32 fifo = ep->fifo;
++ u32 epsize;
++
++ buf = req->req.buf + req->req.actual;
++ prefetch(buf);
++
++ length = req->req.length - req->req.actual;
++ length = min(length, max);
++ req->req.actual += length;
++
++ DBG(1, "%s: %d/%d, fifo=0x%x\n", ep->ep.name, length, max, fifo);
++
++ switch (ep_index(ep)) {
++ case 0:
++ epsize = (u32)S3C_UDC_OTG_DIEPTSIZ0;
++ break;
++ case 2:
++ epsize = (u32)S3C_UDC_OTG_DIEPTSIZ2;
++ break;
++ case 3:
++ epsize = (u32)S3C_UDC_OTG_DIEPTSIZ3;
++ break;
++ default:
++ DBG(3, "ep%d is unused Endpoint", ep_index(ep));
++ return 0;
++ }
++
++ s3c_otg_writel(ep->dev, PKT_CNT(0x1)|XFERSIZE(length), epsize);
++ s3c_otg_ep_control(ep_index(ep), USB_DIR_IN,
++ DEPCTL_EPENA|DEPCTL_CNAK, 1);
++
++ for (count = 0; count < length; count += 4)
++ s3c_otg_writel(ep->dev, *buf++, fifo);
++
++ return length;
++}
++
++static int s3c_otg_write_fifo_ep0(struct s3c_ep *ep, struct s3c_request *req)
++{
++ u32 max;
++ unsigned count;
++ int is_last;
++
++ max = ep_maxpacket(ep);
++ count = s3c_otg_write_packet(ep, req, max);
++
++ /* last packet is usually short (or a zlp) */
++ if (count != max) {
++ is_last = 1;
++ } else {
++ if ((req->req.length != req->req.actual) || req->req.zero)
++ is_last = 0;
++ else
++ is_last = 1;
++ }
++
++ DBG(2, "wrote %s %d bytes%s %d left %p\n",
++ ep->ep.name, count, is_last ? "/L" : "",
++ req->req.length - req->req.actual, req);
++
++ /* requests complete when all IN data is in the FIFO */
++ return is_last;
++}
++
++static int s3c_otg_read_fifo_ep0(struct s3c_ep *ep, struct s3c_request *req)
++{
++ u32 csr;
++ u32 *buf;
++ unsigned bufferspace;
++ unsigned count;
++ unsigned is_short;
++ unsigned bytes;
++ u32 fifo = ep->fifo;
++
++ csr = s3c_otg_readl(ep->dev, S3C_UDC_OTG_GRXSTSP);
++ bytes = BYTE_COUNT(csr);
++
++ buf = req->req.buf + req->req.actual;
++ prefetchw(buf);
++ bufferspace = req->req.length - req->req.actual;
++
++ /* read all bytes from this packet */
++ if (EP_NUM(csr) == 0) {
++ count = bytes / 4 + (bytes % 4 ? 1 : 0);
++ req->req.actual += min(bytes, bufferspace);
++ } else {
++ count = 0;
++ bytes = 0;
++ }
++
++ is_short = (bytes < ep->ep.maxpacket);
++
++ DBG(2, "read %s %d bytes%s %d/%d\n",
++ ep->ep.name, bytes, is_short ? "/S" : "",
++ req->req.actual, req->req.length);
++
++ while (count--) {
++ u32 byte = s3c_otg_readl(ep->dev, fifo);
++
++ if (unlikely(bufferspace == 0)) {
++ /* this happens when the driver's buffer
++ * is smaller than what the host sent.
++ * discard the extra data.
++ */
++ if (req->req.status != -EOVERFLOW)
++ DBG(3, "%s overflow %d\n", ep->ep.name, count);
++ req->req.status = -EOVERFLOW;
++ } else {
++ *buf++ = byte;
++ bufferspace -= 4;
++ }
++ }
++
++ /* completion */
++ if (is_short || req->req.actual == req->req.length)
++ return 1;
++
++ return 0;
++}
++
++static int s3c_otg_write_ep0(struct s3c_udc *dev)
++{
++ struct s3c_request *req;
++ struct s3c_ep *ep = &dev->ep[0];
++ int ret;
++ int need_zlp = 0;
++
++ if (list_empty(&ep->queue))
++ req = NULL;
++ else
++ req = list_entry(ep->queue.next, struct s3c_request, queue);
++
++ if (!req) {
++ DBG(2, "NULL REQ\n");
++ return 0;
++ }
++
++ DBG(2, "length = 0x%x, actual = 0x%x\n",
++ req->req.length, req->req.actual);
++
++ if (req->req.length == 0) {
++ dev->ep0state = WAIT_FOR_SETUP;
++ s3c_otg_done(ep, req, 0);
++ return 1;
++ }
++
++ /* Next write will end with the packet size, */
++ /* so we need Zero-length-packet */
++ if (req->req.length - req->req.actual == ep0_fifo_size)
++ need_zlp = 1;
++
++ ret = s3c_otg_write_fifo_ep0(ep, req);
++
++ if ((ret == 1) && !need_zlp) {
++ /* Last packet */
++ DBG(1, "finished, waiting for status\n");
++ dev->ep0state = WAIT_FOR_SETUP;
++ }
++
++ if (need_zlp) {
++ DBG(1, "Need ZLP!\n");
++ dev->ep0state = DATA_STATE_NEED_ZLP;
++ }
++
++ if (ret)
++ s3c_otg_done(ep, req, 0);
++
++ return ret;
++}
++
++static int first_time = 1;
++
++static int s3c_otg_read_ep0(struct s3c_udc *dev)
++{
++ struct s3c_request *req;
++ struct s3c_ep *ep = &dev->ep[0];
++ int ret;
++
++ if (!list_empty(&ep->queue))
++ req = list_entry(ep->queue.next, struct s3c_request, queue);
++ else {
++ DBG(3, "---> BUG\n");
++ BUG();
++ return 0;
++ }
++
++ DBG(2, "length = 0x%x, actual = 0x%x\n",
++ req->req.length, req->req.actual);
++
++ if (req->req.length == 0) {
++ dev->ep0state = WAIT_FOR_SETUP;
++ first_time = 1;
++ s3c_otg_done(ep, req, 0);
++ return 1;
++ }
++
++ if (!req->req.actual && first_time) {
++ first_time = 0;
++ return 1;
++ }
++
++ ret = s3c_otg_read_fifo_ep0(ep, req);
++
++ if (ret)
++ s3c_otg_done(ep, req, 0);
++
++ dev->ep0state = WAIT_FOR_SETUP;
++ first_time = 1;
++
++ return ret;
++}
++
++static void s3c_otg_kick_ep0(struct s3c_udc *dev, struct s3c_ep *ep)
++{
++ int res = 0;
++
++ DBG(1, "ep_is_in = %d\n", ep_is_in(ep));
++
++ if (ep_is_in(ep)) {
++ dev->ep0state = DATA_STATE_XMIT;
++ while (!res)
++ res = s3c_otg_write_ep0(dev);
++ } else {
++ dev->ep0state = DATA_STATE_RECV;
++ s3c_otg_read_ep0(dev);
++ }
++}
++
++/*
++ * Write request to FIFO
++ */
++static int s3c_otg_write_fifo(struct s3c_ep *ep, struct s3c_request *req)
++{
++ u32 max;
++ u32 gintmsk;
++ unsigned count;
++ int is_last = 0;
++ int is_short = 0;
++
++ gintmsk = s3c_otg_readl(ep->dev, S3C_UDC_OTG_GINTMSK);
++
++ max = le16_to_cpu(ep->desc->wMaxPacketSize);
++ count = s3c_otg_write_packet(ep, req, max);
++
++ /* last packet is usually short (or a zlp) */
++ if (count != max) {
++ is_last = 1;
++ is_short = 1;
++ } else {
++ if ((req->req.length != req->req.actual) || req->req.zero)
++ is_last = 0;
++ else
++ is_last = 1;
++
++ /* interrupt/iso maxpacket may not fill the fifo */
++ is_short = (max < ep_maxpacket(ep));
++ }
++
++ DBG(2, "wrote %s %d bytes%s%s %d/%d\n",
++ ep->ep.name, count,
++ is_last ? "/L" : "", is_short ? "/S" : "",
++ req->req.actual, req->req.length);
++
++ /* requests complete when all IN data is in the FIFO */
++ if (is_last) {
++ if (ep_index(ep) == 0) {
++ DBG(3, "--> EP0 must not come here!\n");
++ BUG();
++ }
++
++ s3c_otg_writel(ep->dev, gintmsk & (~INT_TX_FIFO_EMPTY),
++ (u32)S3C_UDC_OTG_GINTMSK);
++ s3c_otg_done(ep, req, 0);
++
++ return 1;
++ }
++
++ s3c_otg_writel(ep->dev, gintmsk|INT_TX_FIFO_EMPTY,
++ (u32)S3C_UDC_OTG_GINTMSK);
++
++ return 0;
++}
++
++/*
++ * Read to request from FIFO (max read == bytes in fifo)
++ */
++static int s3c_otg_read_fifo(struct s3c_ep *ep, struct s3c_request *req)
++{
++ u32 csr;
++ u32 gintmsk;
++ u32 *buf;
++ unsigned bufferspace;
++ unsigned count;
++ unsigned is_short = 0;
++ unsigned bytes;
++ u32 fifo = ep->fifo;
++
++ csr = s3c_otg_readl(ep->dev, S3C_UDC_OTG_GRXSTSP);
++ bytes = BYTE_COUNT(csr);
++ gintmsk = readl(S3C_UDC_OTG_GINTMSK);
++
++ if (!bytes) {
++ DBG(2, "%d bytes\n", bytes);
++ s3c_otg_orl(ep->dev, INT_RX_FIFO_NOT_EMPTY,
++ (u32)S3C_UDC_OTG_GINTMSK);
++ return 0;
++ }
++
++ buf = req->req.buf + req->req.actual;
++ prefetchw(buf);
++ bufferspace = req->req.length - req->req.actual;
++
++ count = bytes / 4 + (bytes % 4 ? 1 : 0);
++ req->req.actual += min(bytes, bufferspace);
++
++ is_short = (bytes < ep->ep.maxpacket);
++
++ DBG(2, "read %s %d bytes%s %d/%d\n",
++ ep->ep.name, bytes, is_short ? "/S" : "",
++ req->req.actual, req->req.length);
++
++ while (count--) {
++ u32 byte = s3c_otg_readl(ep->dev, fifo);
++
++ if (unlikely(bufferspace == 0)) {
++ /* this happens when the driver's buffer
++ * is smaller than what the host sent.
++ * discard the extra data.
++ */
++ if (req->req.status != -EOVERFLOW)
++ DBG(3, "%s overflow %d\n", ep->ep.name, count);
++ req->req.status = -EOVERFLOW;
++ } else {
++ *buf++ = byte;
++ bufferspace -= 4;
++ }
++ }
++
++ s3c_otg_writel(ep->dev, gintmsk|INT_RX_FIFO_NOT_EMPTY,
++ (u32)S3C_UDC_OTG_GINTMSK);
++
++ /* completion */
++ if (is_short || req->req.actual == req->req.length) {
++ s3c_otg_done(ep, req, 0);
++ return 1;
++ }
++
++ /* finished that packet. the next one may be waiting... */
++ return 0;
++}
++
++static struct usb_request *s3c_otg_alloc_request(
++ struct usb_ep *ep, gfp_t gfp_flags)
++{
++ struct s3c_request *req;
++
++ if (!ep)
++ return NULL;
++
++ DBG(1, "%s %p\n", ep->name, ep);
++
++ req = kzalloc(sizeof *req, gfp_flags);
++ if (!req)
++ return NULL;
++
++ INIT_LIST_HEAD(&req->queue);
++
++ return &req->req;
++}
++
++static void s3c_otg_free_request(struct usb_ep *ep, struct usb_request *_req)
++{
++ struct s3c_request *req;
++
++ if (!ep)
++ return;
++
++ DBG(1, "%s %p\n", ep->name, ep);
++
++ if (!_req)
++ return;
++
++ req = container_of(_req, struct s3c_request, req);
++
++ WARN_ON(!list_empty(&req->queue));
++ kfree(req);
++}
++
++/*
++ * Queue one request
++ * Kickstart transfer if needed
++ */
++static int s3c_otg_queue(struct usb_ep *_ep,
++ struct usb_request *_req, gfp_t gfp_flags)
++{
++ struct s3c_request *req;
++ struct s3c_ep *ep;
++ struct s3c_udc *dev;
++ unsigned long flags;
++ u32 csr;
++
++ req = container_of(_req, struct s3c_request, req);
++ if (!_req || !_req->complete || !_req->buf
++ || !list_empty(&req->queue)) {
++ DBG(3, "bad params\n");
++ return -EINVAL;
++ }
++
++ ep = container_of(_ep, struct s3c_ep, ep);
++ if (!_ep || (!ep->desc && ep->ep.name != ep0name)) {
++ DBG(3, "bad ep\n");
++ return -EINVAL;
++ }
++
++ dev = ep->dev;
++ if (!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN) {
++ DBG(3, "bogus device state %p\n", dev->driver);
++ return -ESHUTDOWN;
++ }
++
++ DBG(2, "%s queue req %p, len %d buf %p\n",
++ _ep->name, _req, _req->length, _req->buf);
++
++ spin_lock_irqsave(&dev->lock, flags);
++
++ _req->status = -EINPROGRESS;
++ _req->actual = 0;
++
++ DBG(2, "ep=%d, Q empty=%d, stopped=%d\n",
++ ep_index(ep), list_empty(&ep->queue), ep->stopped);
++
++ /* kickstart this i/o queue? */
++ if (list_empty(&ep->queue) && !ep->stopped) {
++ if (ep_index(ep) == 0) {
++ list_add_tail(&req->queue, &ep->queue);
++ s3c_otg_kick_ep0(dev, ep);
++ req = NULL;
++ } else if (ep_is_in(ep)) {
++ csr = s3c_otg_readl(ep->dev, S3C_UDC_OTG_GINTSTS);
++
++ if ((csr & INT_TX_FIFO_EMPTY) &&
++ (s3c_otg_write_fifo(ep, req) == 1))
++ req = NULL;
++ else
++ tx_ep_num = ep_index(ep);
++ } else {
++ csr = s3c_otg_readl(ep->dev, S3C_UDC_OTG_GINTSTS);
++
++ if ((csr & INT_RX_FIFO_NOT_EMPTY) &&
++ (s3c_otg_read_fifo(ep, req) == 1))
++ req = NULL;
++ }
++ }
++
++ /* pio or dma irq handler advances the queue. */
++ if (req)
++ list_add_tail(&req->queue, &ep->queue);
++
++ spin_unlock_irqrestore(&dev->lock, flags);
++
++ return 0;
++}
++
++/*
++ * dequeue JUST ONE request
++ */
++static int s3c_otg_dequeue(struct usb_ep *_ep, struct usb_request *_req)
++{
++ struct s3c_ep *ep;
++ struct s3c_request *req;
++ unsigned long flags;
++
++ ep = container_of(_ep, struct s3c_ep, ep);
++ if (!_ep || ep->ep.name == ep0name)
++ return -EINVAL;
++
++ spin_lock_irqsave(&ep->dev->lock, flags);
++
++ /* make sure it's actually queued on this endpoint */
++ list_for_each_entry(req, &ep->queue, queue) {
++ if (&req->req == _req)
++ break;
++ }
++
++ if (&req->req != _req) {
++ spin_unlock_irqrestore(&ep->dev->lock, flags);
++ return -EINVAL;
++ }
++
++ s3c_otg_done(ep, req, -ECONNRESET);
++
++ spin_unlock_irqrestore(&ep->dev->lock, flags);
++
++ return 0;
++}
++
++static int s3c_otg_set_halt(struct usb_ep *_ep, int value)
++{
++ return 0;
++}
++
++static int s3c_otg_fifo_status(struct usb_ep *_ep)
++{
++ int count = 0;
++ struct s3c_ep *ep;
++
++ ep = container_of(_ep, struct s3c_ep, ep);
++ if (!_ep) {
++ DBG(3, "bad ep\n");
++ return -ENODEV;
++ }
++
++ /* LPD can't report unclaimed bytes from IN fifos */
++ if (ep_is_in(ep))
++ return -EOPNOTSUPP;
++
++ return count;
++}
++
++static void s3c_otg_fifo_flush(struct usb_ep *_ep)
++{
++ struct s3c_ep *ep;
++
++ ep = container_of(_ep, struct s3c_ep, ep);
++ if (unlikely(!_ep || (!ep->desc && ep->ep.name != ep0name))) {
++ DBG(3, "bad ep\n");
++ return;
++ }
++}
++
++static int s3c_otg_ep_enable(struct usb_ep *_ep,
++ const struct usb_endpoint_descriptor *desc)
++{
++ struct s3c_ep *ep;
++ struct s3c_udc *dev;
++ unsigned long flags;
++
++ ep = container_of(_ep, struct s3c_ep, ep);
++ if (!_ep || !desc || ep->desc || _ep->name == ep0name
++ || desc->bDescriptorType != USB_DT_ENDPOINT
++ || ep->bEndpointAddress != desc->bEndpointAddress
++ || ep_maxpacket(ep) < le16_to_cpu(desc->wMaxPacketSize)) {
++ DBG(3, "bad ep or descriptor\n");
++ return -EINVAL;
++ }
++
++ /* xfer types must match, except that interrupt ~= bulk */
++ if (ep->bmAttributes != desc->bmAttributes
++ && ep->bmAttributes != USB_ENDPOINT_XFER_BULK
++ && desc->bmAttributes != USB_ENDPOINT_XFER_INT) {
++ DBG(3, "%s type mismatch\n", _ep->name);
++ return -EINVAL;
++ }
++
++ /* hardware _could_ do smaller, but driver doesn't */
++ if ((desc->bmAttributes == USB_ENDPOINT_XFER_BULK
++ && le16_to_cpu(desc->wMaxPacketSize)
++ != ep_maxpacket(ep))
++ || !desc->wMaxPacketSize) {
++ DBG(3, "bad %s maxpacket\n", _ep->name);
++ return -ERANGE;
++ }
++
++ dev = ep->dev;
++ if (!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN) {
++ DBG(3, "bogus device state\n");
++ return -ESHUTDOWN;
++ }
++
++ spin_lock_irqsave(&ep->dev->lock, flags);
++
++ ep->stopped = 0;
++ ep->desc = desc;
++ ep->pio_irqs = 0;
++ ep->ep.maxpacket = le16_to_cpu(desc->wMaxPacketSize);
++
++ /* Reset halt state */
++ s3c_otg_set_halt(_ep, 0);
++
++ spin_unlock_irqrestore(&ep->dev->lock, flags);
++
++ DBG(2, "enabled %s, stopped = %d, maxpacket = %d\n",
++ _ep->name, ep->stopped, ep->ep.maxpacket);
++ return 0;
++}
++
++static int s3c_otg_ep_disable(struct usb_ep *_ep)
++{
++ struct s3c_ep *ep;
++ unsigned long flags;
++
++ ep = container_of(_ep, struct s3c_ep, ep);
++ if (!_ep || !ep->desc) {
++ DBG(3, "%s not enabled\n", _ep ? ep->ep.name : NULL);
++ return -EINVAL;
++ }
++
++ spin_lock_irqsave(&ep->dev->lock, flags);
++
++ /* Nuke all pending requests */
++ s3c_otg_nuke(ep, -ESHUTDOWN);
++
++ ep->desc = 0;
++ ep->stopped = 1;
++
++ spin_unlock_irqrestore(&ep->dev->lock, flags);
++
++ DBG(2, "disabled %s\n", _ep->name);
++ return 0;
++}
++
++static struct usb_ep_ops s3c_ep_ops = {
++ .enable = s3c_otg_ep_enable,
++ .disable = s3c_otg_ep_disable,
++
++ .alloc_request = s3c_otg_alloc_request,
++ .free_request = s3c_otg_free_request,
++
++ .queue = s3c_otg_queue,
++ .dequeue = s3c_otg_dequeue,
++
++ .set_halt = s3c_otg_set_halt,
++ .fifo_status = s3c_otg_fifo_status,
++ .fifo_flush = s3c_otg_fifo_flush,
++};
++
++void s3c_otg_set_ep(struct s3c_udc *dev, enum usb_device_speed speed)
++{
++ u32 ep0_mps = DEPCTL0_MPS_64;
++
++ if (speed == USB_SPEED_FULL) {
++ ep0_fifo_size = 8;
++ ep_fifo_size = 64;
++ ep_fifo_size2 = 64;
++
++ ep0_mps = DEPCTL0_MPS_8;
++ }
++
++ dev->gadget.speed = speed;
++
++ dev->ep[0].ep.maxpacket = ep0_fifo_size;
++ dev->ep[1].ep.maxpacket = ep_fifo_size;
++ dev->ep[2].ep.maxpacket = ep_fifo_size;
++ dev->ep[3].ep.maxpacket = ep_fifo_size;
++ dev->ep[4].ep.maxpacket = ep_fifo_size;
++ dev->ep[5].ep.maxpacket = ep_fifo_size2;
++ dev->ep[6].ep.maxpacket = ep_fifo_size2;
++ dev->ep[7].ep.maxpacket = ep_fifo_size2;
++ dev->ep[8].ep.maxpacket = ep_fifo_size2;
++
++ /* EP0 - Control */
++ s3c_otg_ep_control(0, USB_DIR_OUT, ep0_mps, 1);
++ s3c_otg_ep_control(0, USB_DIR_IN, ep0_mps, 1);
++
++ /* EP1 - Bulk Data OUT */
++ s3c_otg_ep_control(1, USB_DIR_OUT, ep_fifo_size, 1);
++
++ /* EP2 - Bulk Data IN */
++ s3c_otg_ep_control(2, USB_DIR_IN, ep_fifo_size, 1);
++
++ /* EP3 - INTR Data IN */
++ s3c_otg_ep_control(3, USB_DIR_IN, ep_fifo_size, 1);
++
++ DBG(2, "%s Speed Detection\n",
++ speed == USB_SPEED_HIGH ? "High" : "Full");
++}
++
++/*
++ * set the USB address for this device
++ *
++ * Called from control endpoint function
++ * after it decodes a set address setup packet.
++ */
++static void s3c_otg_set_address(struct s3c_udc *dev, unsigned char addr)
++{
++ s3c_otg_orl(dev, DEVICE_ADDR(addr), S3C_UDC_OTG_DCFG);
++ s3c_otg_ep_control(0, USB_DIR_IN, DEPCTL_EPENA|DEPCTL_CNAK, 1);
++
++ DBG(2, "USB OTG 2.0 Device Address=%d\n", addr);
++
++ dev->usb_address = addr;
++}
++
++static inline int s3c_otg_read_setup(struct s3c_ep *ep, u32 *ctrl, int max)
++{
++ int bytes;
++ int count;
++ u32 csr = s3c_otg_readl(ep->dev, S3C_UDC_OTG_GRXSTSP);
++
++ bytes = BYTE_COUNT(csr);
++
++ /* 32 bits interface */
++ count = bytes / 4;
++
++ while (count--)
++ *ctrl++ = s3c_otg_readl(ep->dev, S3C_UDC_OTG_EP0_FIFO);
++
++ return bytes;
++}
++
++static void s3c_otg_setup(struct s3c_udc *dev)
++{
++ struct s3c_ep *ep = &dev->ep[0];
++ int bytes;
++ int is_in;
++ int ret;
++
++ /* Nuke all previous transfers */
++ s3c_otg_nuke(ep, -EPROTO);
++
++ /* read control req from fifo (8 bytes) */
++ bytes = s3c_otg_read_setup(ep, (u32 *)&ctrl, 8);
++
++ DBG(2, "SETUP REQ %02x %02x %04x %04x %d\n",
++ ctrl.bRequestType, ctrl.bRequest,
++ ctrl.wValue, ctrl.wIndex, ctrl.wLength);
++
++ /* Set direction of EP0 */
++ if (ctrl.bRequestType & USB_DIR_IN) {
++ ep->bEndpointAddress |= USB_DIR_IN;
++ is_in = 1;
++ } else {
++ ep->bEndpointAddress &= ~USB_DIR_IN;
++ is_in = 0;
++ }
++
++ dev->req_pending = 1;
++
++ /* Handle some SETUP packets ourselves */
++ switch (ctrl.bRequest) {
++ case USB_REQ_SET_ADDRESS:
++ if (ctrl.bRequestType != (USB_TYPE_STANDARD|USB_RECIP_DEVICE))
++ break;
++
++ s3c_otg_set_address(dev, ctrl.wValue);
++ return;
++
++ case USB_REQ_SET_INTERFACE:
++ DBG(2, "USB_REQ_SET_INTERFACE (%d)\n", ctrl.wValue);
++ /* FALLTHROUGH */
++
++ case USB_REQ_SET_CONFIGURATION:
++ DBG(2, "USB_REQ_SET_CONFIGURATION (%d)\n", ctrl.wValue);
++
++ s3c_otg_ep_control(0, USB_DIR_IN,
++ DEPCTL_EPENA|DEPCTL_CNAK, 1);
++ s3c_otg_ep_control(1, USB_DIR_OUT,
++ DEPCTL_EPDIS|DEPCTL_CNAK|
++ DEPCTL_BULK_TYPE|DEPCTL_USBACTEP, 1);
++ s3c_otg_ep_control(2, USB_DIR_IN,
++ DEPCTL_BULK_TYPE|DEPCTL_USBACTEP, 1);
++ s3c_otg_ep_control(3, USB_DIR_IN,
++ DEPCTL_BULK_TYPE|DEPCTL_USBACTEP, 1);
++
++ reset_available = 1;
++ dev->req_config = 1;
++ break;
++
++ case USB_REQ_GET_DESCRIPTOR:
++ DBG(2, "USB_REQ_GET_DESCRIPTOR\n");
++ break;
++
++ case USB_REQ_GET_CONFIGURATION:
++ DBG(2, "USB_REQ_GET_CONFIGURATION\n");
++ break;
++
++ case USB_REQ_GET_STATUS:
++ DBG(2, "USB_REQ_GET_STATUS\n");
++ s3c_otg_ep_control(0, USB_DIR_IN, DEPCTL_EPENA|DEPCTL_CNAK, 1);
++ break;
++
++ case USB_REQ_CLEAR_FEATURE:
++ DBG(2, "USB_REQ_CLEAR_FEATURE\n");
++ break;
++
++ case USB_REQ_SET_FEATURE:
++ DBG(2, "USB_REQ_SET_FEATURE\n");
++ break;
++
++ default:
++ DBG(3, "Default of ctrl.bRequest=0x%x\n", ctrl.bRequest);
++ break;
++ }
++
++ if (dev->driver) {
++ /* device-2-host (IN) or no data setup command,
++ * process immediately */
++ spin_unlock(&dev->lock);
++
++ DBG(1, "usb_ctrlrequest will be passed to fsg_setup()\n");
++
++ ret = dev->driver->setup(&dev->gadget, &ctrl);
++ spin_lock(&dev->lock);
++
++ if (ret < 0) {
++ /* setup processing failed, force stall */
++ DBG(3, "gadget setup FAILED (stalling) - %d\n", ret);
++ dev->ep0state = WAIT_FOR_SETUP;
++ }
++ }
++}
++
++/*
++ * handle ep0 interrupt
++ */
++static void s3c_otg_handle_ep0(struct s3c_udc *dev)
++{
++ if (dev->ep0state == WAIT_FOR_SETUP)
++ s3c_otg_setup(dev);
++ else
++ DBG(3, "strange state!! - %s\n", state_names[dev->ep0state]);
++}
++
++static void s3c_otg_handle_ep_out(struct s3c_udc *dev, u32 ep_num)
++{
++ struct s3c_ep *ep = &dev->ep[ep_num];
++ struct s3c_request *req;
++
++ if (unlikely(!(ep->desc))) {
++ /* Throw packet away.. */
++ DBG(3, "No descriptor?!?\n");
++ return;
++ }
++
++ if (list_empty(&ep->queue))
++ req = 0;
++ else
++ req = list_entry(ep->queue.next, struct s3c_request, queue);
++
++ if (unlikely(!req))
++ DBG(2, "NULL REQ on OUT EP-%d\n", ep_num);
++ else
++ s3c_otg_read_fifo(ep, req);
++}
++
++static void s3c_otg_handle_ep_in(struct s3c_udc *dev, u32 ep_num)
++{
++ struct s3c_ep *ep = &dev->ep[ep_num];
++ struct s3c_request *req;
++
++ if (list_empty(&ep->queue))
++ req = 0;
++ else
++ req = list_entry(ep->queue.next, struct s3c_request, queue);
++
++ if (unlikely(!req)) {
++ DBG(2, "NULL REQ on IN EP-%d\n", ep_num);
++ return;
++ } else
++ s3c_otg_write_fifo(ep, req);
++}
++
++static void s3c_otg_handle_ep(struct s3c_udc *dev, u32 gintmsk)
++{
++ u32 csr;
++ u32 packet_status;
++ u32 ep_num;
++ u32 bytes = 0;
++
++ gintmsk &= ~INT_RX_FIFO_NOT_EMPTY;
++ s3c_otg_writel(dev, gintmsk, S3C_UDC_OTG_GINTMSK);
++
++ csr = s3c_otg_readl(dev, S3C_UDC_OTG_GRXSTSR);
++
++ packet_status = PKT_STS(csr);
++ bytes = BYTE_COUNT(csr);
++ ep_num = EP_NUM(csr);
++
++ switch (packet_status) {
++ case SETUP_PKT_RECEIVED:
++ DBG(2, "SETUP received : %d bytes\n", bytes);
++ if (!bytes)
++ break;
++
++ s3c_otg_handle_ep0(dev);
++ gintmsk |= INT_RX_FIFO_NOT_EMPTY;
++ break;
++
++ case OUT_PKT_RECEIVED:
++ if (!bytes)
++ break;
++
++ if (ep_num == 0) {
++ DBG(2, "CONTROL OUT received : %d bytes\n", bytes);
++
++ dev->ep0state = DATA_STATE_RECV;
++ s3c_otg_read_ep0(dev);
++
++ gintmsk |= INT_RX_FIFO_NOT_EMPTY;
++ } else if (ep_num == 1) {
++ DBG(2, " Bulk OUT received : %d bytes\n", bytes);
++
++ s3c_otg_handle_ep_out(dev, 1);
++ gintmsk = s3c_otg_readl(dev,S3C_UDC_OTG_GINTMSK);
++
++ s3c_otg_ep_control(1, USB_DIR_OUT, DEPCTL_CNAK, 1);
++ } else
++ DBG(2, "Unused EP%d: %d bytes\n", ep_num, bytes);
++ break;
++
++ case SETUP_COMPLETED:
++ DBG(2, "SETUP_COMPLETED\n");
++ s3c_otg_ep_control(0, USB_DIR_OUT, DEPCTL_CNAK, 1);
++ break;
++
++ case OUT_COMPLELTED:
++ DBG(2, "OUT_COMPLELTED - ep%d\n", ep_num);
++ s3c_otg_ep_control(ep_num, USB_DIR_OUT, DEPCTL_CNAK, 1);
++ break;
++
++ default:
++ gintmsk |= INT_RX_FIFO_NOT_EMPTY;
++ s3c_otg_ep_control(0, USB_DIR_OUT, DEPCTL_CNAK, 1);
++ DBG(1, "reserved packet received : scr=0x%08X bytes\n", csr);
++ break;
++ }
++
++ if (!bytes) {
++ csr = s3c_otg_readl(dev, S3C_UDC_OTG_GRXSTSP);
++ gintmsk |= INT_RX_FIFO_NOT_EMPTY;
++ }
++
++ s3c_otg_writel(dev, gintmsk, S3C_UDC_OTG_GINTMSK);
++}
++
++/*
++ * disable USB device controller
++ */
++static void s3c_otg_disable(struct s3c_udc *dev)
++{
++ s3c_otg_set_address(dev, 0);
++
++ dev->ep0state = WAIT_FOR_SETUP;
++ dev->gadget.speed = USB_SPEED_UNKNOWN;
++ dev->usb_address = 0;
++
++ s3c_otg_orl(dev, ANALOG_PWR_DOWN, S3C_USBOTG_PHYPWR);
++}
++
++/*
++ * initialize software state
++ */
++static void s3c_otg_reinit(struct s3c_udc *dev)
++{
++ u32 i;
++
++ /* device/ep0 records init */
++ INIT_LIST_HEAD(&dev->gadget.ep_list);
++ INIT_LIST_HEAD(&dev->gadget.ep0->ep_list);
++ dev->ep0state = WAIT_FOR_SETUP;
++
++ /* basic endpoint records init */
++ for (i = 0; i < S3C_MAX_ENDPOINTS; i++) {
++ struct s3c_ep *ep = &dev->ep[i];
++
++ if (i != 0)
++ list_add_tail(&ep->ep.ep_list, &dev->gadget.ep_list);
++
++ ep->desc = 0;
++ ep->stopped = 0;
++ INIT_LIST_HEAD(&ep->queue);
++ ep->pio_irqs = 0;
++ }
++}
++
++#define GUSBCFG_INIT (PHY_CLK_480M|TXFIFO_RE_EN| \
++ TURN_AROUND|HNP_DISABLE|SRP_DISABLE|ULPI_DDR| \
++ HS_UTMI|INTERF_UTMI|PHY_INTERF_16|TIME_OUT_CAL)
++
++#define GINTMSK_INIT (INT_RESUME|INT_ENUMDONE| \
++ INT_RESET|INT_SUSPEND|INT_RX_FIFO_NOT_EMPTY)
++
++#define DOEPMSK_INIT (AHB_ERROR)
++
++#define DIEPMSK_INIT (IN_EP_TIMEOUT|AHB_ERROR)
++
++#define GAHBCFG_INIT (PTXFE_HALF|NPTXFE_HALF| \
++ MODE_SLAVE|BURST_INCR16|GBL_INT_UNMASK)
++
++static void s3c_otg_config(struct s3c_udc *dev)
++{
++ u32 reg;
++
++ /* OTG USB configuration */
++ s3c_otg_writel(dev, GUSBCFG_INIT, S3C_UDC_OTG_GUSBCFG);
++
++ /* Soft-reset OTG Core and then unreset again */
++ s3c_otg_writel(dev, CORE_SOFT_RESET, S3C_UDC_OTG_GRSTCTL);
++
++ /* Put the OTG device core in the disconnected state */
++ s3c_otg_orl(dev, SOFT_DISCONNECT, S3C_UDC_OTG_DCTL);
++
++ udelay(20);
++
++ /* Make the OTG device core exit from the disconnected state */
++ reg = s3c_otg_readl(dev, S3C_UDC_OTG_DCTL);
++ s3c_otg_writel(dev, reg & ~SOFT_DISCONNECT, S3C_UDC_OTG_DCTL);
++
++ /* Configure OTG Core to initial settings of device mode */
++ s3c_otg_orl(dev, EP_MIS_CNT(0x1)|SPEED_2_HIGH, S3C_UDC_OTG_DCFG);
++
++ udelay(1000);
++
++ /* Unmask the core interrupts */
++ s3c_otg_writel(dev, GINTMSK_INIT, S3C_UDC_OTG_GINTMSK);
++
++ /* Set NAK bit of EP0, EP1, EP2 */
++ s3c_otg_ep_control(0, USB_DIR_OUT,
++ DEPCTL_EPDIS|DEPCTL_SNAK|DEPCTL0_MPS_64, 0);
++ s3c_otg_ep_control(0, USB_DIR_IN,
++ DEPCTL_EPDIS|DEPCTL_SNAK|DEPCTL0_MPS_64, 0);
++ s3c_otg_ep_control(1, USB_DIR_OUT,
++ DEPCTL_EPDIS|DEPCTL_SNAK|DEPCTL_BULK_TYPE, 0);
++ s3c_otg_ep_control(2, USB_DIR_IN,
++ DEPCTL_EPDIS|DEPCTL_SNAK|DEPCTL_BULK_TYPE, 0);
++ s3c_otg_ep_control(3, USB_DIR_IN,
++ DEPCTL_EPDIS|DEPCTL_SNAK|DEPCTL_BULK_TYPE, 0);
++
++ /* Unmask EP interrupts */
++ s3c_otg_writel(dev, S3C_UDC_INT_IN_EP0
++ |S3C_UDC_INT_IN_EP2
++ |S3C_UDC_INT_IN_EP3
++ |S3C_UDC_INT_OUT_EP0
++ |S3C_UDC_INT_OUT_EP1,
++ S3C_UDC_OTG_DAINTMSK);
++
++ /* Unmask device OUT EP common interrupts */
++ s3c_otg_writel(dev, DOEPMSK_INIT, S3C_UDC_OTG_DOEPMSK);
++
++ /* Unmask device IN EP common interrupts */
++ s3c_otg_writel(dev, DIEPMSK_INIT, S3C_UDC_OTG_DIEPMSK);
++
++ /* Set Rx FIFO Size */
++ s3c_otg_writel(dev, RX_FIFO_SIZE, S3C_UDC_OTG_GRXFSIZ);
++
++ /* Set Non Periodic Tx FIFO Size */
++ s3c_otg_writel(dev, NPTX_FIFO_SIZE|NPTX_FIFO_START_ADDR,
++ (u32)S3C_UDC_OTG_GNPTXFSIZ);
++
++ /* Clear NAK bit of EP0 For Slave mode */
++ s3c_otg_ep_control(0, USB_DIR_OUT, DEPCTL_EPDIS|DEPCTL_CNAK, 0);
++
++ /* Initialize OTG Link Core */
++ s3c_otg_writel(dev, GAHBCFG_INIT, S3C_UDC_OTG_GAHBCFG);
++}
++
++static int s3c_otg_enable(struct s3c_udc *dev)
++{
++ /* USB_SIG_MASK */
++ __raw_writel(S3C64XX_OTHERS_USBMASK | __raw_readl(S3C64XX_OTHERS),
++ S3C64XX_OTHERS);
++
++ /* Initializes OTG Phy. */
++ s3c_otg_writel(dev, SUSPEND_DISABLE, S3C_USBOTG_PHYPWR);
++
++ s3c_otg_writel(dev, dev->phyclk, S3C_USBOTG_PHYCLK);
++
++ s3c_otg_writel(dev, SW_RST_ON, S3C_USBOTG_RSTCON);
++ udelay(50);
++
++ s3c_otg_writel(dev, SW_RST_OFF, S3C_USBOTG_RSTCON);
++ udelay(50);
++
++ s3c_otg_config(dev);
++
++ DBG(2, "S3C USB 2.0 OTG Controller Core Initialized\n");
++
++ dev->gadget.speed = USB_SPEED_UNKNOWN;
++
++ return 0;
++}
++
++/*
++ * usb client interrupt handler.
++ */
++static irqreturn_t s3c_otg_irq(int irq, void *_dev)
++{
++ struct s3c_udc *dev = _dev;
++ u32 intr_status;
++ u32 usb_status;
++ u32 gintmsk;
++
++ spin_lock(&dev->lock);
++
++ intr_status = s3c_otg_readl(dev, S3C_UDC_OTG_GINTSTS);
++ gintmsk = s3c_otg_readl(dev, S3C_UDC_OTG_GINTMSK);
++
++ DBG(1, "GINTSTS=0x%x(on state %s), GINTMSK : 0x%x\n",
++ intr_status, state_names[dev->ep0state], gintmsk);
++
++ if (!intr_status) {
++ spin_unlock(&dev->lock);
++ return IRQ_HANDLED;
++ }
++
++ if (intr_status & INT_ENUMDONE) {
++ DBG(2, "Speed Detection interrupt\n");
++ s3c_otg_writel(dev, INT_ENUMDONE, S3C_UDC_OTG_GINTSTS);
++
++ usb_status = ENUM_SPEED(s3c_otg_readl(dev, S3C_UDC_OTG_DSTS));
++
++ if (usb_status & (USB_FULL_30_60MHZ | USB_FULL_48MHZ))
++ s3c_otg_set_ep(dev, USB_SPEED_FULL);
++ else
++ s3c_otg_set_ep(dev, USB_SPEED_HIGH);
++ }
++
++ if (intr_status & INT_EARLY_SUSPEND) {
++ DBG(2, "Early suspend interrupt\n");
++ s3c_otg_writel(dev, INT_EARLY_SUSPEND, S3C_UDC_OTG_GINTSTS);
++ }
++
++ if (intr_status & INT_SUSPEND) {
++ DBG(2, "Suspend interrupt\n");
++ s3c_otg_writel(dev, INT_SUSPEND, S3C_UDC_OTG_GINTSTS);
++
++ if (dev->gadget.speed != USB_SPEED_UNKNOWN
++ && dev->driver
++ && dev->driver->suspend) {
++ dev->driver->suspend(&dev->gadget);
++ }
++ }
++
++ if (intr_status & INT_RESUME) {
++ DBG(2, "Resume interrupt\n");
++ s3c_otg_writel(dev, INT_RESUME, S3C_UDC_OTG_GINTSTS);
++
++ if (dev->gadget.speed != USB_SPEED_UNKNOWN
++ && dev->driver
++ && dev->driver->resume) {
++ dev->driver->resume(&dev->gadget);
++ }
++ }
++
++ if (intr_status & INT_RESET) {
++ DBG(2, "Reset interrupt\n");
++ s3c_otg_writel(dev, INT_RESET, S3C_UDC_OTG_GINTSTS);
++
++ usb_status = s3c_otg_readl(dev, S3C_UDC_OTG_GOTGCTL);
++
++ if (usb_status | (A_SESSION_VALID|B_SESSION_VALID)) {
++ if (reset_available) {
++ s3c_otg_config(dev);
++ dev->ep0state = WAIT_FOR_SETUP;
++ reset_available = 0;
++ }
++ } else {
++ reset_available = 1;
++ DBG(2, "RESET handling skipped\n");
++ }
++ }
++
++ if (intr_status & INT_RX_FIFO_NOT_EMPTY) {
++ s3c_otg_handle_ep(dev, gintmsk);
++ spin_unlock(&dev->lock);
++
++ return IRQ_HANDLED;
++ }
++
++
++ if (intr_status & INT_TX_FIFO_EMPTY) {
++ DBG(2, "INT_TX_FIFO_EMPTY ep_num=%d\n", tx_ep_num);
++ s3c_otg_handle_ep_in(dev, tx_ep_num);
++ }
++
++ spin_unlock(&dev->lock);
++
++ return IRQ_HANDLED;
++}
++
++static void s3c_otg_stop_activity(struct s3c_udc *dev,
++ struct usb_gadget_driver *driver)
++{
++ int i;
++
++ /* don't disconnect drivers more than once */
++ if (dev->gadget.speed == USB_SPEED_UNKNOWN)
++ driver = 0;
++ dev->gadget.speed = USB_SPEED_UNKNOWN;
++
++ /* prevent new request submissions, kill any outstanding requests */
++ for (i = 0; i < S3C_MAX_ENDPOINTS; i++) {
++ struct s3c_ep *ep = &dev->ep[i];
++ ep->stopped = 1;
++ s3c_otg_nuke(ep, -ESHUTDOWN);
++ }
++
++ /* report disconnect; the driver is already quiesced */
++ if (driver) {
++ spin_unlock(&dev->lock);
++ driver->disconnect(&dev->gadget);
++ spin_lock(&dev->lock);
++ }
++
++ /* re-init driver-visible data structures */
++ s3c_otg_reinit(dev);
++}
++
++/*
++ * Register the gadget driver. Used by gadget drivers when
++ * registering themselves with the controller.
++ */
++int usb_gadget_register_driver(struct usb_gadget_driver *driver)
++{
++ struct s3c_udc *dev = the_controller;
++ int retval;
++
++ if (!driver
++ || driver->speed != USB_SPEED_HIGH
++ || !driver->bind
++ || !driver->setup)
++ return -EINVAL;
++
++ if (!dev) {
++ DBG(3, "No device\n");
++ return -ENODEV;
++ }
++
++ if (dev->driver) {
++ DBG(3, "Already bound to %s\n", driver->driver.name);
++ return -EBUSY;
++ }
++
++ /* first hook up the driver ... */
++ dev->driver = driver;
++ dev->gadget.dev.driver = &driver->driver;
++ retval = device_add(&dev->gadget.dev);
++
++ if (retval) { /* TODO */
++ DBG(3, "target device_add failed, error %d\n", retval);
++ return retval;
++ }
++
++ retval = driver->bind(&dev->gadget);
++ if (retval) {
++ DBG(3, "%s: bind to driver %s --> error %d\n",
++ dev->gadget.name, driver->driver.name, retval);
++ device_del(&dev->gadget.dev);
++
++ dev->driver = 0;
++ dev->gadget.dev.driver = 0;
++ return retval;
++ }
++
++ dev_info(&dev->gadget.dev, "Registered gadget driver '%s'\n",
++ driver->driver.name);
++ s3c_otg_enable(dev);
++
++ enable_irq(IRQ_OTG);
++
++ return 0;
++}
++EXPORT_SYMBOL(usb_gadget_register_driver);
++
++/*
++ Unregister entry point for the peripheral controller driver.
++*/
++int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
++{
++ struct s3c_udc *dev = the_controller;
++ unsigned long flags;
++
++ if (!dev)
++ return -ENODEV;
++
++ if (!driver || driver != dev->driver)
++ return -EINVAL;
++
++ spin_lock_irqsave(&dev->lock, flags);
++
++ dev->driver = 0;
++ s3c_otg_stop_activity(dev, driver);
++
++ spin_unlock_irqrestore(&dev->lock, flags);
++
++ if (driver->unbind)
++ driver->unbind(&dev->gadget);
++
++ device_del(&dev->gadget.dev);
++
++ disable_irq(IRQ_OTG);
++
++ dev_info(&dev->gadget.dev, "Unregistered gadget driver '%s'\n",
++ driver->driver.name);
++
++ s3c_otg_disable(dev);
++
++ return 0;
++}
++EXPORT_SYMBOL(usb_gadget_unregister_driver);
++
++/*
++ * device-scoped parts of the api to the usb controller hardware
++ */
++static int s3c_otg_get_frame(struct usb_gadget *gadget)
++{
++ u32 frame = s3c_otg_readl(the_controller, S3C_UDC_OTG_DSTS);
++ return FRAME_CNT(frame);
++}
++
++static int s3c_otg_wakeup(struct usb_gadget *gadget)
++{
++ return -EOPNOTSUPP;
++}
++
++static int s3c_otg_set_selfpowered(
++ struct usb_gadget *gadget, int is_selfpowered)
++{
++ return -EOPNOTSUPP;
++}
++
++static int s3c_otg_pullup(struct usb_gadget *gadget, int is_on)
++{
++ return -EOPNOTSUPP;
++}
++
++static int s3c_otg_vbus_session(struct usb_gadget *gadget, int is_active)
++{
++ return -EOPNOTSUPP;
++}
++
++static int s3c_otg_vbus_draw(struct usb_gadget *gadget, unsigned mA)
++{
++ return -EOPNOTSUPP;
++}
++
++static const struct usb_gadget_ops s3c_udc_ops = {
++ .get_frame = s3c_otg_get_frame,
++ .wakeup = s3c_otg_wakeup,
++ .set_selfpowered = s3c_otg_set_selfpowered,
++ .vbus_session = s3c_otg_vbus_session,
++ .vbus_draw = s3c_otg_vbus_draw,
++ .pullup = s3c_otg_pullup,
++};
++
++static void nop_release(struct device *dev)
++{
++ DBG(2, "%s\n", dev->bus_id);
++}
++
++static struct s3c_udc memory = {
++ .usb_address = 0,
++ .gadget = {
++ .ops = &s3c_udc_ops,
++ .ep0 = &memory.ep[0].ep,
++ .name = driver_name,
++ .dev = {
++ .bus_id = "gadget",
++ .release = nop_release,
++ },
++ },
++ .ep[0] = {
++ .ep = {
++ .name = ep0name,
++ .ops = &s3c_ep_ops,
++ .maxpacket = EP0_FIFO_SIZE,
++ },
++ .dev = &memory,
++
++ .bEndpointAddress = 0,
++ .bmAttributes = 0,
++
++ .ep_type = ep_control,
++ .fifo = (u32) S3C_UDC_OTG_EP0_FIFO,
++ },
++ .ep[1] = {
++ .ep = {
++ .name = "ep1-bulk",
++ .ops = &s3c_ep_ops,
++ .maxpacket = EP_FIFO_SIZE,
++ },
++ .dev = &memory,
++
++ .bEndpointAddress = 1,
++ .bmAttributes = USB_ENDPOINT_XFER_BULK,
++
++ .ep_type = ep_bulk_out,
++ .fifo = (u32) S3C_UDC_OTG_EP1_FIFO,
++ },
++ .ep[2] = {
++ .ep = {
++ .name = "ep2-bulk",
++ .ops = &s3c_ep_ops,
++ .maxpacket = EP_FIFO_SIZE,
++ },
++ .dev = &memory,
++
++ .bEndpointAddress = USB_DIR_IN | 2,
++ .bmAttributes = USB_ENDPOINT_XFER_BULK,
++
++ .ep_type = ep_bulk_in,
++ .fifo = (u32) S3C_UDC_OTG_EP2_FIFO,
++ },
++
++ .ep[3] = {
++ .ep = {
++ .name = "ep3-int",
++ .ops = &s3c_ep_ops,
++ .maxpacket = EP_FIFO_SIZE,
++ },
++ .dev = &memory,
++
++ .bEndpointAddress = USB_DIR_IN | 3,
++ .bmAttributes = USB_ENDPOINT_XFER_INT,
++
++ .ep_type = ep_interrupt,
++ .fifo = (u32) S3C_UDC_OTG_EP3_FIFO,
++ },
++ .ep[4] = {
++ .ep = {
++ .name = "ep4-int",
++ .ops = &s3c_ep_ops,
++ .maxpacket = EP_FIFO_SIZE,
++ },
++ .dev = &memory,
++
++ .bEndpointAddress = USB_DIR_IN | 4,
++ .bmAttributes = USB_ENDPOINT_XFER_INT,
++
++ .ep_type = ep_interrupt,
++ .fifo = (u32) S3C_UDC_OTG_EP4_FIFO,
++ },
++ .ep[5] = {
++ .ep = {
++ .name = "ep5-int",
++ .ops = &s3c_ep_ops,
++ .maxpacket = EP_FIFO_SIZE2,
++ },
++ .dev = &memory,
++
++ .bEndpointAddress = USB_DIR_IN | 5,
++ .bmAttributes = USB_ENDPOINT_XFER_INT,
++
++ .ep_type = ep_interrupt,
++ .fifo = (u32) S3C_UDC_OTG_EP5_FIFO,
++ },
++ .ep[6] = {
++ .ep = {
++ .name = "ep6-int",
++ .ops = &s3c_ep_ops,
++ .maxpacket = EP_FIFO_SIZE2,
++ },
++ .dev = &memory,
++
++ .bEndpointAddress = USB_DIR_IN | 6,
++ .bmAttributes = USB_ENDPOINT_XFER_INT,
++
++ .ep_type = ep_interrupt,
++ .fifo = (u32) S3C_UDC_OTG_EP6_FIFO,
++ },
++ .ep[7] = {
++ .ep = {
++ .name = "ep7-int",
++ .ops = &s3c_ep_ops,
++ .maxpacket = EP_FIFO_SIZE2,
++ },
++ .dev = &memory,
++
++ .bEndpointAddress = USB_DIR_IN | 7,
++ .bmAttributes = USB_ENDPOINT_XFER_INT,
++
++ .ep_type = ep_interrupt,
++ .fifo = (u32) S3C_UDC_OTG_EP7_FIFO,
++ },
++ .ep[8] = {
++ .ep = {
++ .name = "ep8-int",
++ .ops = &s3c_ep_ops,
++ .maxpacket = EP_FIFO_SIZE2,
++ },
++ .dev = &memory,
++
++ .bEndpointAddress = USB_DIR_IN | 8,
++ .bmAttributes = USB_ENDPOINT_XFER_INT,
++
++ .ep_type = ep_interrupt,
++ .fifo = (u32) S3C_UDC_OTG_EP8_FIFO,
++ },
++};
++
++static struct clk *otg_clock;
++
++/*
++ * binds to the platform device
++ */
++static int s3c_otg_probe(struct platform_device *pdev)
++{
++ struct s3c_udc *dev = &memory;
++ struct s3c_plat_otg_data *pdata = pdev->dev.platform_data;
++ int retval;
++
++ dev->reg_base = ioremap(pdev->resource[0].start,
++ pdev->resource[0].end - pdev->resource[0].start);
++ if (dev->reg_base == NULL) {
++ dev_err(&pdev->dev, "Unable to map USB OTG physical regs\n");
++ return -ENOMEM;
++ }
++
++
++ DBG(2, "%p\n", pdev);
++
++ spin_lock_init(&dev->lock);
++ dev->dev = pdev;
++
++ device_initialize(&dev->gadget.dev);
++ dev->gadget.dev.parent = &pdev->dev;
++
++ dev->gadget.is_dualspeed = 1;
++ dev->gadget.is_otg = 0;
++ dev->gadget.is_a_peripheral = 0;
++ dev->gadget.b_hnp_enable = 0;
++ dev->gadget.a_hnp_support = 0;
++ dev->gadget.a_alt_hnp_support = 0;
++
++ dev->phyclk = pdata->phyclk;
++
++ the_controller = dev;
++ platform_set_drvdata(pdev, dev);
++
++ otg_clock = clk_get(&pdev->dev, "otg");
++ if (otg_clock == NULL) {
++ DBG(3, "failed to find otg clock source\n");
++ return -ENOENT;
++ }
++ clk_enable(otg_clock);
++
++ s3c_otg_reinit(dev);
++
++ local_irq_disable();
++
++ /* irq setup after old hardware state is cleaned up */
++ retval = request_irq(pdev->resource[1].start, s3c_otg_irq,
++ IRQF_DISABLED, driver_name, dev);
++
++ if (retval != 0) {
++ DBG(3, "%s: can't get irq %i - %d\n",
++ driver_name, IRQ_OTG, retval);
++ return -EBUSY;
++ }
++
++ disable_irq(IRQ_OTG);
++ local_irq_enable();
++ create_proc_files();
++
++ return retval;
++}
++
++static int s3c_otg_remove(struct platform_device *pdev)
++{
++ struct s3c_udc *dev = platform_get_drvdata(pdev);
++
++ if (otg_clock != NULL) {
++ clk_disable(otg_clock);
++ clk_put(otg_clock);
++ otg_clock = NULL;
++ }
++
++ remove_proc_files();
++ usb_gadget_unregister_driver(dev->driver);
++
++ free_irq(IRQ_OTG, dev);
++
++ platform_set_drvdata(pdev, 0);
++
++ the_controller = 0;
++
++ if (dev->reg_base)
++ iounmap(dev->reg_base);
++
++ return 0;
++}
++
++#ifdef CONFIG_PM
++static int s3c_otg_suspend(struct platform_device *pdev, pm_message_t state)
++{
++ struct s3c_udc *dev = the_controller;
++
++ if (dev->driver) {
++ disable_irq(IRQ_OTG);
++ s3c_otg_disable(dev);
++ clk_disable(otg_clock);
++ }
++
++ return 0;
++}
++
++static int s3c_otg_resume(struct platform_device *pdev)
++{
++ struct s3c_udc *dev = the_controller;
++
++ if (dev->driver) {
++ clk_enable(otg_clock);
++ s3c_otg_enable(dev);
++ s3c_otg_reinit(dev);
++ enable_irq(IRQ_OTG);
++ }
++
++ return 0;
++}
++#else
++#define s3c_otg_suspend NULL
++#define s3c_otg_resume NULL
++#endif
++
++/*-------------------------------------------------------------------------*/
++static struct platform_driver s3c_otg_driver = {
++ .probe = s3c_otg_probe,
++ .remove = s3c_otg_remove,
++ .suspend = s3c_otg_suspend,
++ .resume = s3c_otg_resume,
++ .driver = {
++ .owner = THIS_MODULE,
++ .name = "s3c-otg-usbgadget",
++ },
++};
++
++static int __init otg_init(void)
++{
++ int ret;
++
++ ret = platform_driver_register(&s3c_otg_driver);
++ if (!ret)
++ printk(KERN_INFO "Loaded %s version %s %s\n",
++ driver_name, DRIVER_VERSION, "(Slave Mode)");
++
++ return ret;
++}
++
++static void __exit otg_exit(void)
++{
++ platform_driver_unregister(&s3c_otg_driver);
++ printk(KERN_INFO "Unloaded %s version %s\n",
++ driver_name, DRIVER_VERSION);
++}
++
++module_init(otg_init);
++module_exit(otg_exit);
++
++MODULE_AUTHOR(DRIVER_AUTHOR);
++MODULE_DESCRIPTION(DRIVER_DESC);
++MODULE_VERSION(DRIVER_VERSION);
++MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/usb/gadget/s3c-udc.h linux-2.6.29-rc3.owrt.om/drivers/usb/gadget/s3c-udc.h
+--- linux-2.6.29-rc3.owrt/drivers/usb/gadget/s3c-udc.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/usb/gadget/s3c-udc.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,132 @@
++/*
++ * drivers/usb/gadget/s3c-udc.h
++ * Samsung S3C on-chip full/high speed USB device controllers
++ *
++ * Copyright (C) 2008 Samsung Electronics
++ * Minkyu Kang <mk7.kang@samsung.com>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ *
++ */
++
++#ifndef __S3C_UDC_H
++#define __S3C_UDC_H
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/ioport.h>
++#include <linux/types.h>
++#include <linux/version.h>
++#include <linux/errno.h>
++#include <linux/delay.h>
++#include <linux/sched.h>
++#include <linux/slab.h>
++#include <linux/init.h>
++#include <linux/timer.h>
++#include <linux/list.h>
++#include <linux/interrupt.h>
++#include <linux/proc_fs.h>
++#include <linux/mm.h>
++#include <linux/device.h>
++#include <linux/dma-mapping.h>
++#include <asm/byteorder.h>
++#include <linux/io.h>
++#include <asm/dma.h>
++#include <asm/irq.h>
++#include <asm/system.h>
++#include <asm/unaligned.h>
++#include <mach/hardware.h>
++
++#include <linux/usb/ch9.h>
++#include <linux/usb/gadget.h>
++
++/* Max packet size */
++#if defined(CONFIG_USB_GADGET_S3C_FS)
++#define EP0_FIFO_SIZE 8
++#define EP_FIFO_SIZE 64
++#define S3C_MAX_ENDPOINTS 5
++#elif defined(CONFIG_USB_GADGET_S3C_HS)
++#define EP0_FIFO_SIZE 64
++#define EP_FIFO_SIZE 512
++#define EP_FIFO_SIZE2 1024
++#define S3C_MAX_ENDPOINTS 9
++#else
++#define EP0_FIFO_SIZE 64
++#define EP_FIFO_SIZE 512
++#define EP_FIFO_SIZE2 1024
++#define S3C_MAX_ENDPOINTS 16
++#endif
++
++#define WAIT_FOR_SETUP 0
++#define DATA_STATE_XMIT 1
++#define DATA_STATE_NEED_ZLP 2
++#define WAIT_FOR_OUT_STATUS 3
++#define DATA_STATE_RECV 4
++
++enum ep_type {
++ ep_control, ep_bulk_in, ep_bulk_out, ep_interrupt
++};
++
++struct s3c_ep {
++ struct usb_ep ep;
++ struct s3c_udc *dev;
++
++ const struct usb_endpoint_descriptor *desc;
++ struct list_head queue;
++ unsigned long pio_irqs;
++
++ u8 stopped;
++ u8 bEndpointAddress;
++ u8 bmAttributes;
++
++ u32 ep_type;
++ u32 fifo;
++#ifdef CONFIG_USB_GADGET_S3C_FS
++ u32 csr1;
++ u32 csr2;
++#endif
++};
++
++struct s3c_request {
++ struct usb_request req;
++ struct list_head queue;
++};
++
++struct s3c_udc {
++ struct usb_gadget gadget;
++ struct usb_gadget_driver *driver;
++ struct platform_device *dev;
++ spinlock_t lock;
++ u32 * reg_base;
++
++ int phyclk;
++ int ep0state;
++ struct s3c_ep ep[S3C_MAX_ENDPOINTS];
++
++ unsigned char usb_address;
++
++ unsigned req_pending:1;
++ unsigned req_std:1;
++ unsigned req_config:1;
++};
++
++extern struct s3c_udc *the_controller;
++
++#define ep_is_in(EP) (((EP)->bEndpointAddress & USB_DIR_IN) \
++ == USB_DIR_IN)
++#define ep_index(EP) ((EP)->bEndpointAddress & 0xF)
++#define ep_maxpacket(EP) ((EP)->ep.maxpacket)
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/usb/host/ohci-hcd.c linux-2.6.29-rc3.owrt.om/drivers/usb/host/ohci-hcd.c
+--- linux-2.6.29-rc3.owrt/drivers/usb/host/ohci-hcd.c 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/usb/host/ohci-hcd.c 2009-05-10 22:28:00.000000000 +0200
+@@ -997,7 +997,7 @@
+ #define SA1111_DRIVER ohci_hcd_sa1111_driver
+ #endif
+
+-#ifdef CONFIG_ARCH_S3C2410
++#ifdef CONFIG_PLAT_S3C
+ #include "ohci-s3c2410.c"
+ #define PLATFORM_DRIVER ohci_hcd_s3c2410_driver
+ #endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/usb/host/ohci-s3c2410.c linux-2.6.29-rc3.owrt.om/drivers/usb/host/ohci-s3c2410.c
+--- linux-2.6.29-rc3.owrt/drivers/usb/host/ohci-s3c2410.c 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/usb/host/ohci-s3c2410.c 2009-05-10 22:28:00.000000000 +0200
+@@ -21,9 +21,9 @@
+
+ #include <linux/platform_device.h>
+ #include <linux/clk.h>
+-
+ #include <mach/hardware.h>
+-#include <mach/usb-control.h>
++#include <mach/regs-gpio.h>
++#include <plat/usb-control.h>
+
+ #define valid_port(idx) ((idx) == 1 || (idx) == 2)
+
+@@ -58,9 +58,8 @@
+ info->hcd = hcd;
+ info->report_oc = s3c2410_hcd_oc;
+
+- if (info->enable_oc != NULL) {
++ if (info->enable_oc != NULL)
+ (info->enable_oc)(info, 1);
+- }
+ }
+ }
+
+@@ -74,9 +73,8 @@
+ info->report_oc = NULL;
+ info->hcd = NULL;
+
+- if (info->enable_oc != NULL) {
++ if (info->enable_oc != NULL)
+ (info->enable_oc)(info, 0);
+- }
+ }
+
+ clk_disable(clk);
+@@ -90,14 +88,14 @@
+ */
+
+ static int
+-ohci_s3c2410_hub_status_data (struct usb_hcd *hcd, char *buf)
++ohci_s3c2410_hub_status_data(struct usb_hcd *hcd, char *buf)
+ {
+ struct s3c2410_hcd_info *info = to_s3c2410_info(hcd);
+ struct s3c2410_hcd_port *port;
+ int orig;
+ int portno;
+
+- orig = ohci_hub_status_data (hcd, buf);
++ orig = ohci_hub_status_data(hcd, buf);
+
+ if (info == NULL)
+ return orig;
+@@ -147,7 +145,7 @@
+ * request.
+ */
+
+-static int ohci_s3c2410_hub_control (
++static int ohci_s3c2410_hub_control(
+ struct usb_hcd *hcd,
+ u16 typeReq,
+ u16 wValue,
+@@ -201,9 +199,8 @@
+ dev_dbg(hcd->self.controller,
+ "ClearPortFeature: OVER_CURRENT\n");
+
+- if (valid_port(wIndex)) {
++ if (valid_port(wIndex))
+ info->port[wIndex-1].oc_status = 0;
+- }
+
+ goto out;
+
+@@ -244,28 +241,28 @@
+ desc->wHubCharacteristics |= cpu_to_le16(0x0001);
+
+ if (info->enable_oc) {
+- desc->wHubCharacteristics &= ~cpu_to_le16(HUB_CHAR_OCPM);
+- desc->wHubCharacteristics |= cpu_to_le16(0x0008|0x0001);
++ desc->wHubCharacteristics &=
++ ~cpu_to_le16(HUB_CHAR_OCPM);
++ desc->wHubCharacteristics |=
++ cpu_to_le16(0x0008|0x0001);
+ }
+
+- dev_dbg(hcd->self.controller, "wHubCharacteristics after 0x%04x\n",
++ dev_dbg(hcd->self.controller,
++ "wHubCharacteristics after 0x%04x\n",
+ desc->wHubCharacteristics);
+
+ return ret;
+
+ case GetPortStatus:
+ /* check port status */
+-
+ dev_dbg(hcd->self.controller, "GetPortStatus(%d)\n", wIndex);
+
+ if (valid_port(wIndex)) {
+- if (info->port[wIndex-1].oc_changed) {
++ if (info->port[wIndex-1].oc_changed)
+ *data |= cpu_to_le32(RH_PS_OCIC);
+- }
+
+- if (info->port[wIndex-1].oc_status) {
++ if (info->port[wIndex-1].oc_status)
+ *data |= cpu_to_le32(RH_PS_POCI);
+- }
+ }
+ }
+
+@@ -308,6 +305,42 @@
+ local_irq_restore(flags);
+ }
+
++/* switching of USB pads */
++static ssize_t show_usb_mode(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ if (__raw_readl(S3C24XX_MISCCR) & S3C2410_MISCCR_USBHOST)
++ return sprintf(buf, "host\n");
++
++ return sprintf(buf, "device\n");
++}
++
++static ssize_t set_usb_mode(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ if (!strncmp(buf, "host", 4)) {
++ printk(KERN_WARNING "s3c2410: changing usb to host\n");
++ s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST,
++ S3C2410_MISCCR_USBHOST);
++ /* FIXME:
++ * - call machine-specific disable-pullup function i
++ * - enable +Vbus (if hardware supports it)
++ */
++ s3c2410_gpio_setpin(S3C2410_GPB9, 0);
++ } else if (!strncmp(buf, "device", 6)) {
++ printk(KERN_WARNING "s3c2410: changing usb to device\n");
++ s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST, 0);
++ s3c2410_gpio_setpin(S3C2410_GPB9, 1);
++ } else {
++ printk(KERN_WARNING "s3c2410: unknown mode\n");
++ return -EINVAL;
++ }
++
++ return count;
++}
++
++static DEVICE_ATTR(usb_mode, S_IRUGO | S_IWUSR, show_usb_mode, set_usb_mode);
++
+ /* may be called without controller electrically present */
+ /* may be called with controller, bus, and devices active */
+
+@@ -323,8 +356,9 @@
+ */
+
+ static void
+-usb_hcd_s3c2410_remove (struct usb_hcd *hcd, struct platform_device *dev)
++usb_hcd_s3c2410_remove(struct usb_hcd *hcd, struct platform_device *dev)
+ {
++ device_remove_file(&dev->dev, &dev_attr_usb_mode);
+ usb_remove_hcd(hcd);
+ s3c2410_stop_hc(dev);
+ iounmap(hcd->regs);
+@@ -341,8 +375,8 @@
+ * through the hotplug entry's driver_data.
+ *
+ */
+-static int usb_hcd_s3c2410_probe (const struct hc_driver *driver,
+- struct platform_device *dev)
++static int usb_hcd_s3c2410_probe(const struct hc_driver *driver,
++ struct platform_device *dev)
+ {
+ struct usb_hcd *hcd = NULL;
+ int retval;
+@@ -392,9 +426,16 @@
+ if (retval != 0)
+ goto err_ioremap;
+
++ retval = device_create_file(&dev->dev, &dev_attr_usb_mode);
++ if (retval != 0)
++ goto err_hcd;
++
+ return 0;
+
+- err_ioremap:
++err_hcd:
++ usb_remove_hcd(hcd);
++
++err_ioremap:
+ s3c2410_stop_hc(dev);
+ iounmap(hcd->regs);
+ clk_put(usb_clk);
+@@ -413,17 +454,19 @@
+ /*-------------------------------------------------------------------------*/
+
+ static int
+-ohci_s3c2410_start (struct usb_hcd *hcd)
++ohci_s3c2410_start(struct usb_hcd *hcd)
+ {
+- struct ohci_hcd *ohci = hcd_to_ohci (hcd);
++ struct ohci_hcd *ohci = hcd_to_ohci(hcd);
+ int ret;
+
+- if ((ret = ohci_init(ohci)) < 0)
++ ret = ohci_init(ohci);
++ if (ret < 0)
+ return ret;
+
+- if ((ret = ohci_run (ohci)) < 0) {
+- err ("can't start %s", hcd->self.bus_name);
+- ohci_stop (hcd);
++ ret = ohci_run(ohci);
++ if (ret < 0) {
++ err("can't start %s", hcd->self.bus_name);
++ ohci_stop(hcd);
+ return ret;
+ }
+
+@@ -488,15 +531,23 @@
+ return 0;
+ }
+
++static int ohci_hcd_s3c2410_drv_resume(struct platform_device *pdev)
++{
++ struct usb_hcd *hcd = platform_get_drvdata(pdev);
++
++ ohci_finish_controller_resume(hcd);
++ return 0;
++}
++
+ static struct platform_driver ohci_hcd_s3c2410_driver = {
+ .probe = ohci_hcd_s3c2410_drv_probe,
+ .remove = ohci_hcd_s3c2410_drv_remove,
+ .shutdown = usb_hcd_platform_shutdown,
+ /*.suspend = ohci_hcd_s3c2410_drv_suspend, */
+- /*.resume = ohci_hcd_s3c2410_drv_resume, */
++ .resume = ohci_hcd_s3c2410_drv_resume,
+ .driver = {
+ .owner = THIS_MODULE,
+- .name = "s3c2410-ohci",
++ .name = "s3c-ohci",
+ },
+ };
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/usb/Kconfig linux-2.6.29-rc3.owrt.om/drivers/usb/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/usb/Kconfig 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/usb/Kconfig 2009-05-10 22:28:00.000000000 +0200
+@@ -31,7 +31,7 @@
+ default y if SA1111
+ default y if ARCH_OMAP
+ default y if ARCH_LH7A404
+- default y if ARCH_S3C2410
++ default y if PLAT_S3C
+ default y if PXA27x
+ default y if PXA3xx
+ default y if ARCH_EP93XX
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/video/backlight/gta01_bl.c linux-2.6.29-rc3.owrt.om/drivers/video/backlight/gta01_bl.c
+--- linux-2.6.29-rc3.owrt/drivers/video/backlight/gta01_bl.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/video/backlight/gta01_bl.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,269 @@
++/*
++ * Backlight Driver for FIC GTA01 (Neo1973) GSM Phone
++ *
++ * Copyright (C) 2006-2007 by Openmoko, Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * All rights reserved.
++ *
++ * based on corgi_cl.c, Copyright (c) 2004-2006 Richard Purdie
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation, version 2.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ *
++ * Javi Roman <javiroman@kernel-labs.org>:
++ * implement PWM, instead of simple on/off switching
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/platform_device.h>
++#include <linux/mutex.h>
++#include <linux/fb.h>
++#include <linux/backlight.h>
++#include <linux/clk.h>
++
++#include <mach/hardware.h>
++#include <mach/gta01.h>
++#include <plat/pwm.h>
++
++#include <plat/regs-timer.h>
++#include <asm/plat-s3c24xx/neo1973.h>
++
++static struct backlight_properties gta01bl_prop;
++static struct backlight_device *gta01_backlight_device;
++static struct gta01bl_machinfo *bl_machinfo;
++
++static unsigned long gta01bl_flags;
++
++struct gta01bl_data {
++ int intensity;
++ struct mutex mutex;
++ struct clk *clk;
++ struct s3c2410_pwm pwm;
++};
++
++static struct gta01bl_data gta01bl;
++
++static int gta01bl_defer_resume_backlight;
++
++#define GTA01BL_SUSPENDED 0x01
++#define GTA01BL_BATTLOW 0x02
++
++/* On the GTA01 / Neo1973, we use a 50 or 66MHz PCLK, which gives
++ * us a 6.25..8.25MHz DIV8 clock, which is further divided by a
++ * prescaler of 4, resulting in a 1.56..2.06MHz tick. This results in a
++ * minimum frequency of 24..31Hz. At 400Hz, we need to set the count
++ * to something like 3906..5156, providing us a way sufficient resolution
++ * for display brightness adjustment. */
++#define GTA01BL_COUNTER 5156
++
++static int gta01bl_send_intensity(struct backlight_device *bd)
++{
++ int intensity = bd->props.brightness;
++
++ if (bd->props.power != FB_BLANK_UNBLANK)
++ intensity = 0;
++ if (bd->props.fb_blank != FB_BLANK_UNBLANK)
++ intensity = 0;
++ if (gta01bl_flags & GTA01BL_SUSPENDED)
++ intensity = 0;
++ if (gta01bl_flags & GTA01BL_BATTLOW)
++ intensity &= bl_machinfo->limit_mask;
++
++ mutex_lock(&gta01bl.mutex);
++#ifdef GTA01_BACKLIGHT_ONOFF_ONLY
++ if (intensity)
++ neo1973_gpb_setpin(GTA01_GPIO_BACKLIGHT, 1);
++ else
++ neo1973_gpb_setpin(GTA01_GPIO_BACKLIGHT, 0);
++#else
++ if (intensity == bd->props.max_brightness) {
++ neo1973_gpb_setpin(GTA01_GPIO_BACKLIGHT, 1);
++ s3c2410_gpio_cfgpin(GTA01_GPIO_BACKLIGHT, S3C2410_GPIO_OUTPUT);
++ } else {
++ s3c2410_pwm_duty_cycle(intensity & 0xffff, &gta01bl.pwm);
++ s3c2410_gpio_cfgpin(GTA01_GPIO_BACKLIGHT, S3C2410_GPB0_TOUT0);
++ }
++#endif
++ mutex_unlock(&gta01bl.mutex);
++
++ gta01bl.intensity = intensity;
++ return 0;
++}
++
++static int gta01bl_init_hw(void)
++{
++ int rc;
++
++ rc = s3c2410_pwm_init(&gta01bl.pwm);
++ if (rc)
++ return rc;
++
++ gta01bl.pwm.timerid = PWM0;
++ gta01bl.pwm.prescaler = (4 - 1);
++ gta01bl.pwm.divider = S3C2410_TCFG1_MUX0_DIV8;
++ gta01bl.pwm.counter = GTA01BL_COUNTER;
++ gta01bl.pwm.comparer = gta01bl.pwm.counter;
++
++ rc = s3c2410_pwm_enable(&gta01bl.pwm);
++ if (rc)
++ return rc;
++
++ s3c2410_pwm_start(&gta01bl.pwm);
++
++ gta01bl_prop.max_brightness = gta01bl.pwm.counter;
++
++ return 0;
++}
++
++#ifdef CONFIG_PM
++static int gta01bl_suspend(struct platform_device *dev, pm_message_t state)
++{
++ gta01bl_flags |= GTA01BL_SUSPENDED;
++ gta01bl_send_intensity(gta01_backlight_device);
++ neo1973_gpb_setpin(GTA01_GPIO_BACKLIGHT, 0);
++ s3c2410_gpio_cfgpin(GTA01_GPIO_BACKLIGHT, S3C2410_GPIO_OUTPUT);
++ return 0;
++}
++
++void gta01bl_deferred_resume(void)
++{
++ mutex_lock(&gta01bl.mutex);
++ gta01bl_init_hw();
++ mutex_unlock(&gta01bl.mutex);
++
++ gta01bl_flags &= ~GTA01BL_SUSPENDED;
++ gta01bl_send_intensity(gta01_backlight_device);
++}
++EXPORT_SYMBOL_GPL(gta01bl_deferred_resume);
++
++static int gta01bl_resume(struct platform_device *dev)
++{
++ if (!gta01bl_defer_resume_backlight)
++ gta01bl_deferred_resume();
++ return 0;
++}
++#else
++#define gta01bl_suspend NULL
++#define gta01bl_resume NULL
++#endif
++
++static int gta01bl_get_intensity(struct backlight_device *bd)
++{
++ return gta01bl.intensity;
++}
++
++static int gta01bl_set_intensity(struct backlight_device *bd)
++{
++ gta01bl_send_intensity(gta01_backlight_device);
++ return 0;
++}
++
++/*
++ * Called when the battery is low to limit the backlight intensity.
++ * If limit==0 clear any limit, otherwise limit the intensity
++ */
++void gta01bl_limit_intensity(int limit)
++{
++ if (limit)
++ gta01bl_flags |= GTA01BL_BATTLOW;
++ else
++ gta01bl_flags &= ~GTA01BL_BATTLOW;
++ gta01bl_send_intensity(gta01_backlight_device);
++}
++EXPORT_SYMBOL_GPL(gta01bl_limit_intensity);
++
++
++static struct backlight_ops gta01bl_ops = {
++ .get_brightness = gta01bl_get_intensity,
++ .update_status = gta01bl_set_intensity,
++};
++
++static int __init gta01bl_probe(struct platform_device *pdev)
++{
++ struct gta01bl_machinfo *machinfo = pdev->dev.platform_data;
++ int rc;
++
++#ifdef GTA01_BACKLIGHT_ONOFF_ONLY
++ s3c2410_gpio_cfgpin(GTA01_GPIO_BACKLIGHT, S3C2410_GPIO_OUTPUT);
++ gta01bl_prop.max_brightness = 1;
++#else
++ rc = gta01bl_init_hw();
++ if (rc < 0)
++ return rc;
++#endif
++ mutex_init(&gta01bl.mutex);
++
++ if (!machinfo->limit_mask)
++ machinfo->limit_mask = -1;
++
++ gta01bl_defer_resume_backlight = machinfo->defer_resume_backlight;
++
++ gta01_backlight_device = backlight_device_register("gta01-bl",
++ &pdev->dev, NULL,
++ &gta01bl_ops);
++ if (IS_ERR(gta01_backlight_device))
++ return PTR_ERR(gta01_backlight_device);
++
++ gta01bl_prop.power = FB_BLANK_UNBLANK;
++ gta01bl_prop.brightness = gta01bl_prop.max_brightness;
++ memcpy(&gta01_backlight_device->props,
++ &gta01bl_prop, sizeof(gta01bl_prop));
++ gta01bl_send_intensity(gta01_backlight_device);
++
++ return 0;
++}
++
++static int gta01bl_remove(struct platform_device *dev)
++{
++#ifndef GTA01_BACKLIGHT_ONOFF_ONLY
++ s3c2410_pwm_disable(&gta01bl.pwm);
++#endif
++ backlight_device_unregister(gta01_backlight_device);
++ mutex_destroy(&gta01bl.mutex);
++
++ s3c2410_gpio_cfgpin(GTA01_GPIO_BACKLIGHT, S3C2410_GPIO_OUTPUT);
++ neo1973_gpb_setpin(GTA01_GPIO_BACKLIGHT, 1);
++
++ return 0;
++}
++
++static struct platform_driver gta01bl_driver = {
++ .probe = gta01bl_probe,
++ .remove = gta01bl_remove,
++ .suspend = gta01bl_suspend,
++ .resume = gta01bl_resume,
++ .driver = {
++ .name = "gta01-bl",
++ },
++};
++
++static int __init gta01bl_init(void)
++{
++ return platform_driver_register(&gta01bl_driver);
++}
++
++static void __exit gta01bl_exit(void)
++{
++ platform_driver_unregister(&gta01bl_driver);
++}
++
++module_init(gta01bl_init);
++module_exit(gta01bl_exit);
++
++MODULE_DESCRIPTION("FIC GTA01 (Neo1973) Backlight Driver");
++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
++MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/video/backlight/Kconfig linux-2.6.29-rc3.owrt.om/drivers/video/backlight/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/video/backlight/Kconfig 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/video/backlight/Kconfig 2009-05-10 22:28:00.000000000 +0200
+@@ -149,6 +149,13 @@
+ the PWL module of OMAP1 processors. Say Y if your board
+ uses this hardware.
+
++config BACKLIGHT_GTA01
++ tristate "FIC Neo1973 GTA01 Backlight Driver"
++ depends on BACKLIGHT_CLASS_DEVICE && MACH_NEO1973_GTA01
++ default y
++ help
++ If you have a FIC Neo1973 GTA01, say y to enable the backlight driver.
++
+ config BACKLIGHT_HP680
+ tristate "HP Jornada 680 Backlight Driver"
+ depends on BACKLIGHT_CLASS_DEVICE && SH_HP6XX
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/video/backlight/Makefile linux-2.6.29-rc3.owrt.om/drivers/video/backlight/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/video/backlight/Makefile 2009-05-10 22:08:45.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/video/backlight/Makefile 2009-05-10 22:28:00.000000000 +0200
+@@ -12,6 +12,8 @@
+ obj-$(CONFIG_BACKLIGHT_CLASS_DEVICE) += backlight.o
+ obj-$(CONFIG_BACKLIGHT_ATMEL_PWM) += atmel-pwm-bl.o
+ obj-$(CONFIG_BACKLIGHT_GENERIC) += generic_bl.o
++obj-$(CONFIG_BACKLIGHT_CORGI) += corgi_bl.o
++obj-$(CONFIG_BACKLIGHT_GTA01) += gta01_bl.o
+ obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o
+ obj-$(CONFIG_BACKLIGHT_LOCOMO) += locomolcd.o
+ obj-$(CONFIG_BACKLIGHT_OMAP1) += omap1_bl.o
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/video/console/fbcon.c linux-2.6.29-rc3.owrt.om/drivers/video/console/fbcon.c
+--- linux-2.6.29-rc3.owrt/drivers/video/console/fbcon.c 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/video/console/fbcon.c 2009-05-10 22:28:00.000000000 +0200
+@@ -373,6 +373,9 @@
+ int c;
+ int mode;
+
++ if (info->state != FBINFO_STATE_RUNNING)
++ return;
++
+ acquire_console_sem();
+ if (ops && ops->currcon != -1)
+ vc = vc_cons[ops->currcon].d;
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/video/display/jbt6k74.c linux-2.6.29-rc3.owrt.om/drivers/video/display/jbt6k74.c
+--- linux-2.6.29-rc3.owrt/drivers/video/display/jbt6k74.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/video/display/jbt6k74.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,768 @@
++/* Linux kernel driver for the tpo JBT6K74-AS LCM ASIC
++ *
++ * Copyright (C) 2006-2007 by Openmoko, Inc.
++ * Author: Harald Welte <laforge@openmoko.org>,
++ * Stefan Schmidt <stefan@openmoko.org>
++ * Copyright (C) 2008 by Harald Welte <laforge@openmoko.org>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/module.h>
++#include <linux/device.h>
++#include <linux/platform_device.h>
++#include <linux/delay.h>
++#include <linux/jbt6k74.h>
++#include <linux/fb.h>
++#include <linux/time.h>
++
++enum jbt_register {
++ JBT_REG_SLEEP_IN = 0x10,
++ JBT_REG_SLEEP_OUT = 0x11,
++
++ JBT_REG_DISPLAY_OFF = 0x28,
++ JBT_REG_DISPLAY_ON = 0x29,
++
++ JBT_REG_RGB_FORMAT = 0x3a,
++ JBT_REG_QUAD_RATE = 0x3b,
++
++ JBT_REG_POWER_ON_OFF = 0xb0,
++ JBT_REG_BOOSTER_OP = 0xb1,
++ JBT_REG_BOOSTER_MODE = 0xb2,
++ JBT_REG_BOOSTER_FREQ = 0xb3,
++ JBT_REG_OPAMP_SYSCLK = 0xb4,
++ JBT_REG_VSC_VOLTAGE = 0xb5,
++ JBT_REG_VCOM_VOLTAGE = 0xb6,
++ JBT_REG_EXT_DISPL = 0xb7,
++ JBT_REG_OUTPUT_CONTROL = 0xb8,
++ JBT_REG_DCCLK_DCEV = 0xb9,
++ JBT_REG_DISPLAY_MODE1 = 0xba,
++ JBT_REG_DISPLAY_MODE2 = 0xbb,
++ JBT_REG_DISPLAY_MODE = 0xbc,
++ JBT_REG_ASW_SLEW = 0xbd,
++ JBT_REG_DUMMY_DISPLAY = 0xbe,
++ JBT_REG_DRIVE_SYSTEM = 0xbf,
++
++ JBT_REG_SLEEP_OUT_FR_A = 0xc0,
++ JBT_REG_SLEEP_OUT_FR_B = 0xc1,
++ JBT_REG_SLEEP_OUT_FR_C = 0xc2,
++ JBT_REG_SLEEP_IN_LCCNT_D = 0xc3,
++ JBT_REG_SLEEP_IN_LCCNT_E = 0xc4,
++ JBT_REG_SLEEP_IN_LCCNT_F = 0xc5,
++ JBT_REG_SLEEP_IN_LCCNT_G = 0xc6,
++
++ JBT_REG_GAMMA1_FINE_1 = 0xc7,
++ JBT_REG_GAMMA1_FINE_2 = 0xc8,
++ JBT_REG_GAMMA1_INCLINATION = 0xc9,
++ JBT_REG_GAMMA1_BLUE_OFFSET = 0xca,
++
++ /* VGA */
++ JBT_REG_BLANK_CONTROL = 0xcf,
++ JBT_REG_BLANK_TH_TV = 0xd0,
++ JBT_REG_CKV_ON_OFF = 0xd1,
++ JBT_REG_CKV_1_2 = 0xd2,
++ JBT_REG_OEV_TIMING = 0xd3,
++ JBT_REG_ASW_TIMING_1 = 0xd4,
++ JBT_REG_ASW_TIMING_2 = 0xd5,
++
++ /* QVGA */
++ JBT_REG_BLANK_CONTROL_QVGA = 0xd6,
++ JBT_REG_BLANK_TH_TV_QVGA = 0xd7,
++ JBT_REG_CKV_ON_OFF_QVGA = 0xd8,
++ JBT_REG_CKV_1_2_QVGA = 0xd9,
++ JBT_REG_OEV_TIMING_QVGA = 0xde,
++ JBT_REG_ASW_TIMING_1_QVGA = 0xdf,
++ JBT_REG_ASW_TIMING_2_QVGA = 0xe0,
++
++
++ JBT_REG_HCLOCK_VGA = 0xec,
++ JBT_REG_HCLOCK_QVGA = 0xed,
++
++};
++
++enum jbt_state {
++ JBT_STATE_DEEP_STANDBY,
++ JBT_STATE_SLEEP,
++ JBT_STATE_NORMAL,
++ JBT_STATE_QVGA_NORMAL,
++};
++
++static const char *jbt_state_names[] = {
++ [JBT_STATE_DEEP_STANDBY] = "deep-standby",
++ [JBT_STATE_SLEEP] = "sleep",
++ [JBT_STATE_NORMAL] = "normal",
++ [JBT_STATE_QVGA_NORMAL] = "qvga-normal",
++};
++
++struct jbt_info {
++ enum jbt_state state, normal_state;
++ struct spi_device *spi_dev;
++ struct mutex lock; /* protects tx_buf and reg_cache */
++ struct notifier_block fb_notif;
++ u16 tx_buf[8];
++ u16 reg_cache[0xEE];
++ struct timespec last_sleep;
++};
++
++#define JBT_COMMAND 0x000
++#define JBT_DATA 0x100
++
++static inline unsigned int timespec_sub_ms(struct timespec lhs,
++ struct timespec rhs)
++{
++ struct timespec ts = timespec_sub(lhs, rhs);
++ return (ts.tv_sec * MSEC_PER_SEC) + (ts.tv_nsec / NSEC_PER_MSEC);
++}
++
++static int jbt_reg_write_nodata(struct jbt_info *jbt, u8 reg)
++{
++ int rc;
++
++ jbt->tx_buf[0] = JBT_COMMAND | reg;
++ rc = spi_write(jbt->spi_dev, (u8 *)jbt->tx_buf,
++ 1*sizeof(u16));
++ if (rc == 0)
++ jbt->reg_cache[reg] = 0;
++ else
++ printk(KERN_ERR"jbt_reg_write_nodata spi_write ret %d\n",
++ rc);
++
++ return rc;
++}
++
++
++static int jbt_reg_write(struct jbt_info *jbt, u8 reg, u8 data)
++{
++ int rc;
++
++ jbt->tx_buf[0] = JBT_COMMAND | reg;
++ jbt->tx_buf[1] = JBT_DATA | data;
++ rc = spi_write(jbt->spi_dev, (u8 *)jbt->tx_buf,
++ 2*sizeof(u16));
++ if (rc == 0)
++ jbt->reg_cache[reg] = data;
++ else
++ printk(KERN_ERR"jbt_reg_write spi_write ret %d\n", rc);
++
++ return rc;
++}
++
++static int jbt_reg_write16(struct jbt_info *jbt, u8 reg, u16 data)
++{
++ int rc;
++
++ jbt->tx_buf[0] = JBT_COMMAND | reg;
++ jbt->tx_buf[1] = JBT_DATA | (data >> 8);
++ jbt->tx_buf[2] = JBT_DATA | (data & 0xff);
++
++ rc = spi_write(jbt->spi_dev, (u8 *)jbt->tx_buf,
++ 3*sizeof(u16));
++ if (rc == 0)
++ jbt->reg_cache[reg] = data;
++ else
++ printk(KERN_ERR"jbt_reg_write16 spi_write ret %d\n", rc);
++
++ return rc;
++}
++
++static int jbt_init_regs(struct jbt_info *jbt)
++{
++ int rc;
++
++ dev_dbg(&jbt->spi_dev->dev, "entering %cVGA mode\n",
++ jbt->normal_state == JBT_STATE_QVGA_NORMAL ? 'Q' : ' ');
++
++ rc = jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE1, 0x01);
++ rc |= jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE2, 0x00);
++ rc |= jbt_reg_write(jbt, JBT_REG_RGB_FORMAT, 0x60);
++ rc |= jbt_reg_write(jbt, JBT_REG_DRIVE_SYSTEM, 0x10);
++ rc |= jbt_reg_write(jbt, JBT_REG_BOOSTER_OP, 0x56);
++ rc |= jbt_reg_write(jbt, JBT_REG_BOOSTER_MODE, 0x33);
++ rc |= jbt_reg_write(jbt, JBT_REG_BOOSTER_FREQ, 0x11);
++ rc |= jbt_reg_write(jbt, JBT_REG_OPAMP_SYSCLK, 0x02);
++ rc |= jbt_reg_write(jbt, JBT_REG_VSC_VOLTAGE, 0x2b);
++ rc |= jbt_reg_write(jbt, JBT_REG_VCOM_VOLTAGE, 0x40);
++ rc |= jbt_reg_write(jbt, JBT_REG_EXT_DISPL, 0x03);
++ rc |= jbt_reg_write(jbt, JBT_REG_DCCLK_DCEV, 0x04);
++ /*
++ * default of 0x02 in JBT_REG_ASW_SLEW responsible for 72Hz requirement
++ * to avoid red / blue flicker
++ */
++ rc |= jbt_reg_write(jbt, JBT_REG_ASW_SLEW, 0x04);
++ rc |= jbt_reg_write(jbt, JBT_REG_DUMMY_DISPLAY, 0x00);
++
++ rc |= jbt_reg_write(jbt, JBT_REG_SLEEP_OUT_FR_A, 0x11);
++ rc |= jbt_reg_write(jbt, JBT_REG_SLEEP_OUT_FR_B, 0x11);
++ rc |= jbt_reg_write(jbt, JBT_REG_SLEEP_OUT_FR_C, 0x11);
++ rc |= jbt_reg_write16(jbt, JBT_REG_SLEEP_IN_LCCNT_D, 0x2040);
++ rc |= jbt_reg_write16(jbt, JBT_REG_SLEEP_IN_LCCNT_E, 0x60c0);
++ rc |= jbt_reg_write16(jbt, JBT_REG_SLEEP_IN_LCCNT_F, 0x1020);
++ rc |= jbt_reg_write16(jbt, JBT_REG_SLEEP_IN_LCCNT_G, 0x60c0);
++
++ rc |= jbt_reg_write16(jbt, JBT_REG_GAMMA1_FINE_1, 0x5533);
++ rc |= jbt_reg_write(jbt, JBT_REG_GAMMA1_FINE_2, 0x00);
++ rc |= jbt_reg_write(jbt, JBT_REG_GAMMA1_INCLINATION, 0x00);
++ rc |= jbt_reg_write(jbt, JBT_REG_GAMMA1_BLUE_OFFSET, 0x00);
++
++ if (jbt->normal_state != JBT_STATE_QVGA_NORMAL) {
++ rc |= jbt_reg_write16(jbt, JBT_REG_HCLOCK_VGA, 0x1f0);
++ rc |= jbt_reg_write(jbt, JBT_REG_BLANK_CONTROL, 0x02);
++ rc |= jbt_reg_write16(jbt, JBT_REG_BLANK_TH_TV, 0x0804);
++
++ rc |= jbt_reg_write(jbt, JBT_REG_CKV_ON_OFF, 0x01);
++ rc |= jbt_reg_write16(jbt, JBT_REG_CKV_1_2, 0x0000);
++
++ rc |= jbt_reg_write16(jbt, JBT_REG_OEV_TIMING, 0x0d0e);
++ rc |= jbt_reg_write16(jbt, JBT_REG_ASW_TIMING_1, 0x11a4);
++ rc |= jbt_reg_write(jbt, JBT_REG_ASW_TIMING_2, 0x0e);
++ } else {
++ rc |= jbt_reg_write16(jbt, JBT_REG_HCLOCK_QVGA, 0x00ff);
++ rc |= jbt_reg_write(jbt, JBT_REG_BLANK_CONTROL_QVGA, 0x02);
++ rc |= jbt_reg_write16(jbt, JBT_REG_BLANK_TH_TV_QVGA, 0x0804);
++
++ rc |= jbt_reg_write(jbt, JBT_REG_CKV_ON_OFF_QVGA, 0x01);
++ rc |= jbt_reg_write16(jbt, JBT_REG_CKV_1_2_QVGA, 0x0008);
++
++ rc |= jbt_reg_write16(jbt, JBT_REG_OEV_TIMING_QVGA, 0x050a);
++ rc |= jbt_reg_write16(jbt, JBT_REG_ASW_TIMING_1_QVGA, 0x0a19);
++ rc |= jbt_reg_write(jbt, JBT_REG_ASW_TIMING_2_QVGA, 0x0a);
++ }
++
++ return rc ? -EIO : 0;
++}
++
++static int standby_to_sleep(struct jbt_info *jbt)
++{
++ int rc;
++
++ /* three times command zero */
++ rc = jbt_reg_write_nodata(jbt, 0x00);
++ mdelay(1);
++ rc |= jbt_reg_write_nodata(jbt, 0x00);
++ mdelay(1);
++ rc |= jbt_reg_write_nodata(jbt, 0x00);
++ mdelay(1);
++
++ /* deep standby out */
++ rc |= jbt_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x11);
++ mdelay(1);
++ rc = jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x28);
++
++ /* (re)initialize register set */
++ rc |= jbt_init_regs(jbt);
++
++ return rc ? -EIO : 0;
++}
++
++static int sleep_to_normal(struct jbt_info *jbt)
++{
++ int rc;
++
++ /* Make sure we are 120 ms after SLEEP_OUT */
++ unsigned int sleep_time = timespec_sub_ms(current_kernel_time(),
++ jbt->last_sleep);
++ if (sleep_time < 120)
++ mdelay(120 - sleep_time);
++
++ if (jbt->normal_state == JBT_STATE_NORMAL) {
++ /* RGB I/F on, RAM wirte off, QVGA through, SIGCON enable */
++ rc = jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x80);
++
++ /* Quad mode off */
++ rc |= jbt_reg_write(jbt, JBT_REG_QUAD_RATE, 0x00);
++ } else {
++ /* RGB I/F on, RAM wirte off, QVGA through, SIGCON enable */
++ rc = jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x81);
++
++ /* Quad mode on */
++ rc |= jbt_reg_write(jbt, JBT_REG_QUAD_RATE, 0x22);
++ }
++
++ /* AVDD on, XVDD on */
++ rc |= jbt_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x16);
++
++ /* Output control */
++ rc |= jbt_reg_write16(jbt, JBT_REG_OUTPUT_CONTROL, 0xfff9);
++
++ /* Turn on display */
++ rc |= jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_ON);
++
++ /* Sleep mode off */
++ rc |= jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_OUT);
++ jbt->last_sleep = current_kernel_time();
++
++ /* Allow the booster and display controller to restart stably */
++ mdelay(5);
++
++ return rc ? -EIO : 0;
++}
++
++static int normal_to_sleep(struct jbt_info *jbt)
++{
++ int rc;
++
++ /* Make sure we are 120 ms after SLEEP_OUT */
++ unsigned int sleep_time = timespec_sub_ms(current_kernel_time(),
++ jbt->last_sleep);
++ if (sleep_time < 120)
++ mdelay(120 - sleep_time);
++
++ rc = jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_OFF);
++ rc |= jbt_reg_write16(jbt, JBT_REG_OUTPUT_CONTROL, 0x8002);
++ rc |= jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_IN);
++ jbt->last_sleep = current_kernel_time();
++
++ /* Allow the internal circuits to stop automatically */
++ mdelay(5);
++
++ return rc ? -EIO : 0;
++}
++
++static int sleep_to_standby(struct jbt_info *jbt)
++{
++ return jbt_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x00);
++}
++
++/* frontend function */
++int jbt6k74_enter_state(struct jbt_info *jbt, enum jbt_state new_state)
++{
++ int rc = -EINVAL;
++
++ dev_dbg(&jbt->spi_dev->dev, "entering (old_state=%s, new_state=%s)\n",
++ jbt_state_names[jbt->state],
++ jbt_state_names[new_state]);
++
++ mutex_lock(&jbt->lock);
++
++ if (new_state == JBT_STATE_NORMAL ||
++ new_state == JBT_STATE_QVGA_NORMAL)
++ jbt->normal_state = new_state;
++
++ switch (jbt->state) {
++ case JBT_STATE_DEEP_STANDBY:
++ switch (new_state) {
++ case JBT_STATE_DEEP_STANDBY:
++ rc = 0;
++ break;
++ case JBT_STATE_SLEEP:
++ rc = standby_to_sleep(jbt);
++ break;
++ case JBT_STATE_NORMAL:
++ /* first transition into sleep */
++ rc = standby_to_sleep(jbt);
++ /* then transition into normal */
++ rc |= sleep_to_normal(jbt);
++ break;
++ case JBT_STATE_QVGA_NORMAL:
++ /* first transition into sleep */
++ rc = standby_to_sleep(jbt);
++ /* then transition into normal */
++ rc |= sleep_to_normal(jbt);
++ break;
++ }
++ break;
++ case JBT_STATE_SLEEP:
++ switch (new_state) {
++ case JBT_STATE_SLEEP:
++ rc = 0;
++ break;
++ case JBT_STATE_DEEP_STANDBY:
++ rc = sleep_to_standby(jbt);
++ break;
++ case JBT_STATE_NORMAL:
++ case JBT_STATE_QVGA_NORMAL:
++ rc = sleep_to_normal(jbt);
++ break;
++ }
++ break;
++ case JBT_STATE_NORMAL:
++ switch (new_state) {
++ case JBT_STATE_NORMAL:
++ rc = 0;
++ break;
++ case JBT_STATE_DEEP_STANDBY:
++ /* first transition into sleep */
++ rc = normal_to_sleep(jbt);
++ /* then transition into deep standby */
++ rc |= sleep_to_standby(jbt);
++ break;
++ case JBT_STATE_SLEEP:
++ rc = normal_to_sleep(jbt);
++ break;
++ case JBT_STATE_QVGA_NORMAL:
++ /* first transition into sleep */
++ rc = normal_to_sleep(jbt);
++ /* second transition into deep standby */
++ rc |= sleep_to_standby(jbt);
++ /* third transition into sleep */
++ rc |= standby_to_sleep(jbt);
++ /* fourth transition into normal */
++ rc |= sleep_to_normal(jbt);
++ break;
++ }
++ break;
++ case JBT_STATE_QVGA_NORMAL:
++ switch (new_state) {
++ case JBT_STATE_QVGA_NORMAL:
++ rc = 0;
++ break;
++ case JBT_STATE_DEEP_STANDBY:
++ /* first transition into sleep */
++ rc = normal_to_sleep(jbt);
++ /* then transition into deep standby */
++ rc |= sleep_to_standby(jbt);
++ break;
++ case JBT_STATE_SLEEP:
++ rc = normal_to_sleep(jbt);
++ break;
++ case JBT_STATE_NORMAL:
++ /* first transition into sleep */
++ rc = normal_to_sleep(jbt);
++ /* second transition into deep standby */
++ rc |= sleep_to_standby(jbt);
++ /* third transition into sleep */
++ rc |= standby_to_sleep(jbt);
++ /* fourth transition into normal */
++ rc |= sleep_to_normal(jbt);
++ break;
++ }
++ break;
++ }
++
++ if (rc == 0)
++ jbt->state = new_state;
++ else
++ dev_err(&jbt->spi_dev->dev, "Failed enter state '%s')\n",
++ jbt_state_names[new_state]);
++
++ mutex_unlock(&jbt->lock);
++
++ return rc;
++}
++EXPORT_SYMBOL_GPL(jbt6k74_enter_state);
++
++static ssize_t state_read(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ struct jbt_info *jbt = dev_get_drvdata(dev);
++
++ if (jbt->state >= ARRAY_SIZE(jbt_state_names))
++ return -EIO;
++
++ return sprintf(buf, "%s\n", jbt_state_names[jbt->state]);
++}
++
++static ssize_t state_write(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct jbt_info *jbt = dev_get_drvdata(dev);
++ int i, rc;
++
++ for (i = 0; i < ARRAY_SIZE(jbt_state_names); i++) {
++ if (!strncmp(buf, jbt_state_names[i],
++ strlen(jbt_state_names[i]))) {
++ rc = jbt6k74_enter_state(jbt, i);
++ if (rc)
++ return rc;
++ return count;
++ }
++ }
++
++ return -EINVAL;
++}
++
++static DEVICE_ATTR(state, 0644, state_read, state_write);
++
++static int reg_by_string(const char *name)
++{
++ if (!strcmp(name, "gamma_fine1"))
++ return JBT_REG_GAMMA1_FINE_1;
++ else if (!strcmp(name, "gamma_fine2"))
++ return JBT_REG_GAMMA1_FINE_2;
++ else if (!strcmp(name, "gamma_inclination"))
++ return JBT_REG_GAMMA1_INCLINATION;
++ else
++ return JBT_REG_GAMMA1_BLUE_OFFSET;
++}
++
++static ssize_t gamma_read(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ struct jbt_info *jbt = dev_get_drvdata(dev);
++ int reg = reg_by_string(attr->attr.name);
++ u16 val;
++
++ mutex_lock(&jbt->lock);
++ val = jbt->reg_cache[reg];
++ mutex_unlock(&jbt->lock);
++
++ return sprintf(buf, "0x%04x\n", val);
++}
++
++static ssize_t gamma_write(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct jbt_info *jbt = dev_get_drvdata(dev);
++ int reg = reg_by_string(attr->attr.name);
++ unsigned long val = simple_strtoul(buf, NULL, 10);
++
++ dev_info(dev, "writing gama %lu\n", val & 0xff);
++
++ mutex_lock(&jbt->lock);
++ jbt_reg_write(jbt, reg, val & 0xff);
++ mutex_unlock(&jbt->lock);
++
++ return count;
++}
++
++static ssize_t reset_write(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ int rc;
++ struct jbt_info *jbt = dev_get_drvdata(dev);
++ struct jbt6k74_platform_data *pdata = jbt->spi_dev->dev.platform_data;
++
++ dev_info(dev, "reset\n");
++
++ mutex_lock(&jbt->lock);
++
++ jbt->state = JBT_STATE_DEEP_STANDBY;
++
++ /* hard reset the jbt6k74 */
++ (pdata->reset)(0, 0);
++ mdelay(1);
++ (pdata->reset)(0, 1);
++ mdelay(120);
++
++ rc = jbt_reg_write_nodata(jbt, 0x01);
++ if (rc < 0)
++ dev_err(&jbt->spi_dev->dev, "cannot soft reset\n");
++ mdelay(120);
++
++ mutex_unlock(&jbt->lock);
++
++ jbt6k74_enter_state(jbt, jbt->normal_state);
++
++ return count;
++}
++
++static DEVICE_ATTR(gamma_fine1, 0644, gamma_read, gamma_write);
++static DEVICE_ATTR(gamma_fine2, 0644, gamma_read, gamma_write);
++static DEVICE_ATTR(gamma_inclination, 0644, gamma_read, gamma_write);
++static DEVICE_ATTR(gamma_blue_offset, 0644, gamma_read, gamma_write);
++static DEVICE_ATTR(reset, 0600, NULL, reset_write);
++
++static struct attribute *jbt_sysfs_entries[] = {
++ &dev_attr_state.attr,
++ &dev_attr_gamma_fine1.attr,
++ &dev_attr_gamma_fine2.attr,
++ &dev_attr_gamma_inclination.attr,
++ &dev_attr_gamma_blue_offset.attr,
++ &dev_attr_reset.attr,
++ NULL,
++};
++
++static struct attribute_group jbt_attr_group = {
++ .name = NULL,
++ .attrs = jbt_sysfs_entries,
++};
++
++static int fb_notifier_callback(struct notifier_block *self,
++ unsigned long event, void *data)
++{
++ struct jbt_info *jbt;
++ struct fb_event *evdata = data;
++ int fb_blank;
++
++ jbt = container_of(self, struct jbt_info, fb_notif);
++
++ dev_dbg(&jbt->spi_dev->dev, "event=%lu\n", event);
++
++ if (event != FB_EVENT_BLANK && event != FB_EVENT_CONBLANK)
++ return 0;
++
++ fb_blank = *(int *)evdata->data;
++ switch (fb_blank) {
++ case FB_BLANK_UNBLANK:
++ dev_dbg(&jbt->spi_dev->dev, "unblank\n");
++ jbt6k74_enter_state(jbt, jbt->normal_state);
++ break;
++ case FB_BLANK_NORMAL:
++ dev_dbg(&jbt->spi_dev->dev, "blank\n");
++ break;
++ case FB_BLANK_VSYNC_SUSPEND:
++ dev_dbg(&jbt->spi_dev->dev, "vsync suspend\n");
++ break;
++ case FB_BLANK_HSYNC_SUSPEND:
++ dev_dbg(&jbt->spi_dev->dev, "hsync suspend\n");
++ break;
++ case FB_BLANK_POWERDOWN:
++ dev_dbg(&jbt->spi_dev->dev, "powerdown\n");
++ jbt6k74_enter_state(jbt, JBT_STATE_SLEEP);
++ break;
++ }
++
++ return 0;
++}
++
++/* linux device model infrastructure */
++
++static int __devinit jbt_probe(struct spi_device *spi)
++{
++ int rc;
++ struct jbt_info *jbt;
++ struct jbt6k74_platform_data *pdata = spi->dev.platform_data;
++
++ /* the controller doesn't have a MISO pin; we can't do detection */
++
++ spi->mode = SPI_CPOL | SPI_CPHA;
++ spi->bits_per_word = 9;
++
++ rc = spi_setup(spi);
++ if (rc < 0) {
++ dev_err(&spi->dev,
++ "error during spi_setup of jbt6k74 driver\n");
++ return rc;
++ }
++
++ jbt = kzalloc(sizeof(*jbt), GFP_KERNEL);
++ if (!jbt)
++ return -ENOMEM;
++
++ jbt->spi_dev = spi;
++ jbt->normal_state = JBT_STATE_NORMAL;
++ jbt->state = JBT_STATE_DEEP_STANDBY;
++ jbt->last_sleep = current_kernel_time();
++ mutex_init(&jbt->lock);
++
++ dev_set_drvdata(&spi->dev, jbt);
++
++ rc = jbt6k74_enter_state(jbt, JBT_STATE_NORMAL);
++ if (rc < 0) {
++ dev_err(&spi->dev, "cannot enter NORMAL state\n");
++ goto err_free_drvdata;
++ }
++
++ rc = sysfs_create_group(&spi->dev.kobj, &jbt_attr_group);
++ if (rc < 0) {
++ dev_err(&spi->dev, "cannot create sysfs group\n");
++ goto err_standby;
++ }
++
++ jbt->fb_notif.notifier_call = fb_notifier_callback;
++ rc = fb_register_client(&jbt->fb_notif);
++ if (rc < 0) {
++ dev_err(&spi->dev, "cannot register notifier\n");
++ goto err_sysfs;
++ }
++
++ if (pdata->probe_completed)
++ (pdata->probe_completed)(&spi->dev);
++
++ return 0;
++
++err_sysfs:
++ sysfs_remove_group(&spi->dev.kobj, &jbt_attr_group);
++err_standby:
++ jbt6k74_enter_state(jbt, JBT_STATE_DEEP_STANDBY);
++err_free_drvdata:
++ dev_set_drvdata(&spi->dev, NULL);
++ kfree(jbt);
++
++ return rc;
++}
++
++static int __devexit jbt_remove(struct spi_device *spi)
++{
++ struct jbt_info *jbt = dev_get_drvdata(&spi->dev);
++
++ /* We don't want to switch off the display in case the user
++ * accidentially onloads the module (whose use count normally is 0) */
++ jbt6k74_enter_state(jbt, jbt->normal_state);
++
++ fb_unregister_client(&jbt->fb_notif);
++ sysfs_remove_group(&spi->dev.kobj, &jbt_attr_group);
++ dev_set_drvdata(&spi->dev, NULL);
++ kfree(jbt);
++
++ return 0;
++}
++
++#ifdef CONFIG_PM
++static int jbt_suspend(struct spi_device *spi, pm_message_t state)
++{
++ struct jbt_info *jbt = dev_get_drvdata(&spi->dev);
++
++ jbt6k74_enter_state(jbt, JBT_STATE_DEEP_STANDBY);
++
++ dev_info(&spi->dev, "suspended\n");
++
++ return 0;
++}
++
++int jbt6k74_resume(struct spi_device *spi)
++{
++ struct jbt_info *jbt = dev_get_drvdata(&spi->dev);
++ struct jbt6k74_platform_data *pdata = spi->dev.platform_data;
++
++ jbt6k74_enter_state(jbt, jbt->normal_state);
++
++ if (pdata->resuming)
++ (pdata->resuming)(0);
++
++ dev_info(&spi->dev, "resumed\n");
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(jbt6k74_resume);
++
++#else
++#define jbt_suspend NULL
++#define jbt6k74_resume NULL
++#endif
++
++static struct spi_driver jbt6k74_driver = {
++ .driver = {
++ .name = "jbt6k74",
++ .owner = THIS_MODULE,
++ },
++
++ .probe = jbt_probe,
++ .remove = __devexit_p(jbt_remove),
++ .suspend = jbt_suspend,
++ .resume = jbt6k74_resume,
++};
++
++static int __init jbt_init(void)
++{
++ return spi_register_driver(&jbt6k74_driver);
++}
++
++static void __exit jbt_exit(void)
++{
++ spi_unregister_driver(&jbt6k74_driver);
++}
++
++MODULE_DESCRIPTION("SPI driver for tpo JBT6K74-AS LCM control interface");
++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
++MODULE_LICENSE("GPL");
++
++module_init(jbt_init);
++module_exit(jbt_exit);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/video/display/Kconfig linux-2.6.29-rc3.owrt.om/drivers/video/display/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/video/display/Kconfig 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/video/display/Kconfig 2009-05-10 22:28:00.000000000 +0200
+@@ -21,4 +21,23 @@
+ comment "Display hardware drivers"
+ depends on DISPLAY_SUPPORT
+
++config DISPLAY_JBT6K74
++ tristate "TPO JBT6K74-AS TFT display ASIC control interface"
++ depends on SPI_MASTER && SYSFS
++ help
++ SPI driver for the control interface of TFT panels containing
++ the TPO JBT6K74-AS controller ASIC, such as the TPO TD028TTEC1
++ TFT diplay module used in the FIC/Openmoko Neo1973 GSM phones.
++
++ The control interface is required for display operation, as it
++ controls power management, display timing and gamma calibration.
++
++config DISPLAY_L1K002
++ tristate "TP0 L1K0-02 TFT ASIC control interface"
++ depends on SPI_MASTER && SYSFS
++ help
++ The control interface of this LTPS TFT panel is based on SPI bitbang driver.
++ It controls display timing and gamma calibration. TP0 LPJ028T007A LCM uses this IC
++ as its controller in the Openmoko GTA03 GSM phone.
++
+ endmenu
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/video/display/l1k002.c linux-2.6.29-rc3.owrt.om/drivers/video/display/l1k002.c
+--- linux-2.6.29-rc3.owrt/drivers/video/display/l1k002.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/video/display/l1k002.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,278 @@
++/*
++ * Copyright (C) 2009 Openmoko, Inc.
++ *
++ * Author: Matt Hsu <matt_hsu@openmoko.org>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or (at
++ * your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License along
++ * with this program; if not, write to the Free Software Foundation, Inc.,
++ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
++ *
++*/
++
++#include <linux/kernel.h>
++#include <linux/device.h>
++#include <linux/module.h>
++#include <linux/platform_device.h>
++#include <linux/spi/spi.h>
++
++#include <linux/l1k002.h>
++
++struct l1k002_data {
++ struct spi_device *spi;
++ struct mutex lock;
++ u8 mosi_buf[2];
++ u8 reg_cache[0x40];
++};
++
++enum l1k002_regs_table {
++
++ L1K002_REG_SYNCP_SEL = 0x02,
++ L1K002_REG_VSTS = 0x03,
++ L1K002_REG_HSTS = 0x04,
++ L1K002_REG_MISC = 0x07,
++ L1K002_REG_CMDR = 0x08,
++ L1K002_REG_IN_DATA_TIMING = 0x09,
++ L1K002_REG_ENGR_OTP = 0x0b,
++ L1K002_REG_VGLS = 0x0c,
++ L1K002_REG_DISP_8_9 = 0x0d,
++ L1K002_REG_DISP_0_7 = 0x0e,
++ L1K002_REG_HTOTAL_8_10 = 0x0f,
++ L1K002_REG_HTOTAL_0_7 = 0x10,
++ L1K002_REG_WCKH = 0x20,
++ L1K002_REG_GCKH = 0x21,
++ L1K002_REG_DCKH = 0x22,
++ L1K002_REG_WENBV = 0x23,
++ L1K002_REG_DCKV = 0x25,
++ L1K002_REG_WCKV = 0x27,
++ L1K002_REG_DA_VCOM = 0x2a,
++ L1K002_REG_PVH = 0x2b,
++ L1K002_REG_NVH_NVL = 0x2c,
++ L1K002_REG_GC1 = 0x2d,
++ L1K002_REG_GC2 = 0x2e,
++ L1K002_REG_GC3 = 0x2f,
++ L1K002_REG_GC4 = 0x30,
++ L1K002_REG_GC5 = 0x31,
++ L1K002_REG_GC6 = 0x32,
++ L1K002_REG_GC7 = 0x33,
++ L1K002_REG_GC8 = 0x34,
++ L1K002_REG_GC9 = 0x35,
++ L1K002_REG_GC10 = 0x36,
++ L1K002_REG_GC11 = 0x37,
++ L1K002_REG_GC12 = 0x38,
++ L1K002_REG_GC13 = 0x39,
++ L1K002_REG_GC14 = 0x3a,
++ L1K002_REG_GC15 = 0x3b,
++};
++
++static int l1k002_reg_write(struct l1k002_data *l1k002, u8 reg, u8 data)
++{
++ int ret;
++
++ mutex_lock(&l1k002->lock);
++
++ l1k002->mosi_buf[0] = reg;
++ l1k002->mosi_buf[1] = data;
++
++ ret = spi_write(l1k002->spi, (u8 *)l1k002->mosi_buf, 2*sizeof(u8));
++ if (ret == 0)
++ l1k002->reg_cache[reg] = data;
++ else
++ dev_err(&l1k002->spi->dev, "reg spi_write ret: %d\n", ret);
++
++ mutex_unlock(&l1k002->lock);
++ return ret;
++}
++
++static int l1k002_init_reg(struct l1k002_data *l1k002)
++{
++ int ret;
++
++ /* software reset */
++ ret = l1k002_reg_write(l1k002, L1K002_REG_CMDR, 0x01);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_CMDR, 0x00);
++
++ /* setup color mode and direction */
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_MISC, 0xd9);
++
++ /* dclk initial */
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_SYNCP_SEL, 0x00);
++
++ /* start vertical data */
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_VSTS, 0x04);
++
++ /* start horizonal data */
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_HSTS, 0x14);
++
++ /* setup hsnc, vsnc, data_enable */
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_IN_DATA_TIMING, 0x03);
++ /* enable engineering mode and OTP */
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_ENGR_OTP, 0x18);
++
++ /* display area */
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_VGLS, 0x41);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_DISP_8_9, 0x02);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_DISP_0_7, 0x80);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_HTOTAL_8_10, 0x02);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_HTOTAL_0_7, 0x08);
++
++ /* CKH pulse config */
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_WCKH, 0x3c);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_GCKH, 0x0c);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_DCKH, 0x10);
++
++ /* ENBV config */
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_WENBV, 0x38);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_DCKV, 0x3c);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_WCKV, 0xdb);
++
++ /* driving voltage */
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_DA_VCOM, 0x66);
++
++ /* gamma output voltage level */
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_PVH, 0x70);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_NVH_NVL, 0x70);
++
++ /* gamma correction */
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_GC1, 0x15);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_GC2, 0xaa);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_GC3, 0xbf);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_GC4, 0x86);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_GC5, 0x11);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_GC6, 0x5e);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_GC7, 0xb6);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_GC8, 0x16);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_GC9, 0x4e);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_GC10, 0x78);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_GC11, 0xbf);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_GC12, 0xec);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_GC13, 0x10);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_GC14, 0x30);
++ ret |= l1k002_reg_write(l1k002, L1K002_REG_GC15, 0xff);
++
++ ret |= l1k002_reg_write(l1k002, 0x07, 0xc9);
++
++ if (ret == 0)
++ dev_info(&l1k002->spi->dev, "initialize OK \n");
++ else
++ dev_err(&l1k002->spi->dev, "initialize failed ret: %d\n", ret);
++ return ret;
++}
++
++static int l1k002_probe(struct spi_device *spi)
++{
++ int ret;
++ struct l1k002_data *l1k002;
++ struct l1k002_platform_data *l1k002_pdata = spi->dev.platform_data;
++
++ if (l1k002_pdata == NULL) {
++ dev_err(&spi->dev,
++ "no platform data available \n");
++ return -EINVAL;
++ }
++
++ spi->mode = SPI_CPOL | SPI_CPHA;
++ spi->bits_per_word = 8;
++
++ ret = spi_setup(spi);
++ if (ret < 0) {
++ dev_err(&spi->dev,
++ "error during spi_setup of l1k002 driver\n");
++ return ret;
++ }
++
++ l1k002 = kzalloc(sizeof(*l1k002), GFP_KERNEL);
++ if (!l1k002)
++ return -ENOMEM;
++
++ l1k002->spi = spi;
++ dev_set_drvdata(&spi->dev, l1k002);
++
++ mutex_init(&l1k002->lock);
++
++ /* hard reset l1k002 */
++ (l1k002_pdata->pwr_onoff)(1);
++
++ ret = l1k002_init_reg(l1k002);
++ if (ret)
++ goto err_free;
++
++ /* FIXME: sysfs should be added here */
++
++ return 0;
++
++err_free:
++ kfree(l1k002);
++ return ret;
++}
++
++static int __devexit l1k002_remove(struct spi_device *spi)
++{
++ struct l1k002 *l1k002 = dev_get_drvdata(&spi->dev);
++
++ dev_set_drvdata(&spi->dev, NULL);
++ kfree(l1k002);
++ return 0;
++}
++
++#ifdef CONFIG_PM
++static int l1k002_suspend(struct spi_device *spi, pm_message_t state)
++{
++ struct l1k002_platform_data *l1k002_pdata = spi->dev.platform_data;
++
++ /* l1k002 doesn't have sleep mode
++ * it should be powered down as entering suspend state
++ */
++ (l1k002_pdata->pwr_onoff)(0);
++ return 0;
++}
++
++static int l1k002_resume(struct spi_device *spi)
++{
++ struct l1k002_platform_data *l1k002_pdata = spi->dev.platform_data;
++ struct l1k002_data *l1k002 = dev_get_drvdata(&spi->dev);
++
++ (l1k002_pdata->pwr_onoff)(1);
++ return l1k002_init_reg(l1k002);
++}
++#else
++#define l1k002_suspend NULL
++#define l1k002_resume NULL
++#endif
++
++static struct spi_driver l1k002_driver = {
++ .driver = {
++ .name = "l1k002",
++ .owner = THIS_MODULE,
++ },
++
++ .probe = l1k002_probe,
++ .remove = __devexit_p(l1k002_remove),
++ .suspend = l1k002_suspend,
++ .resume = l1k002_resume,
++};
++
++static int __init l1k002_init(void)
++{
++ return spi_register_driver(&l1k002_driver);
++}
++
++static void __exit l1k002_exit(void)
++{
++ spi_unregister_driver(&l1k002_driver);
++}
++
++MODULE_AUTHOR("Matt Hsu <matt_hsu@openmoko.org>");
++MODULE_LICENSE("GPL v2");
++
++module_init(l1k002_init);
++module_exit(l1k002_exit);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/video/display/Makefile linux-2.6.29-rc3.owrt.om/drivers/video/display/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/video/display/Makefile 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/video/display/Makefile 2009-05-10 22:28:00.000000000 +0200
+@@ -3,4 +3,6 @@
+ display-objs := display-sysfs.o
+
+ obj-$(CONFIG_DISPLAY_SUPPORT) += display.o
++obj-$(CONFIG_DISPLAY_JBT6K74) += jbt6k74.o
++obj-$(CONFIG_DISPLAY_L1K002) += l1k002.o
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/video/Kconfig linux-2.6.29-rc3.owrt.om/drivers/video/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/video/Kconfig 2009-05-10 22:08:45.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/video/Kconfig 2009-05-10 22:28:00.000000000 +0200
+@@ -1924,6 +1924,30 @@
+ depends on FB_TMIO
+ default y
+
++config FB_S3C
++ tristate "Samsung S3C framebuffer support"
++ depends on FB && ARCH_S3C64XX
++ select FB_CFB_FILLRECT
++ select FB_CFB_COPYAREA
++ select FB_CFB_IMAGEBLIT
++ ---help---
++ Frame buffer driver for the built-in FB controller in the Samsung
++ SoC line from the S3C2443 onwards, including the S3C2416, S3C2450,
++ and the S3C64XX series such as the S3C6400 and S3C6410.
++
++ These chips all have the same basic framebuffer design with the
++ actual capabilities depending on the chip. For instance the S3C6400
++ and S3C6410 support 4 hardware windows whereas the S3C24XX series
++ currently only have two.
++
++ Currently the support is only for the S3C6400 and S3C6410 SoCs.
++
++config FB_S3C_DEBUG_REGWRITE
++ bool "Debug register writes"
++ depends on FB_S3C
++ ---help---
++ Show all register writes via printk(KERN_DEBUG)
++
+ config FB_S3C2410
+ tristate "S3C2410 LCD framebuffer support"
+ depends on FB && ARCH_S3C2410
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/video/logo/Kconfig linux-2.6.29-rc3.owrt.om/drivers/video/logo/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/video/logo/Kconfig 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/video/logo/Kconfig 2009-05-10 22:28:00.000000000 +0200
+@@ -77,6 +77,11 @@
+ depends on SUPERH
+ default y
+
++config LOGO_OPENMOKO_CLUT224
++ bool "224-color Openmoko Linux logo"
++ depends on MACH_NEO1973_GTA01 || MACH_NEO1973_GTA02
++ default y
++
+ config LOGO_M32R_CLUT224
+ bool "224-color M32R Linux logo"
+ depends on M32R
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/video/logo/logo.c linux-2.6.29-rc3.owrt.om/drivers/video/logo/logo.c
+--- linux-2.6.29-rc3.owrt/drivers/video/logo/logo.c 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/video/logo/logo.c 2009-05-10 22:28:00.000000000 +0200
+@@ -35,6 +35,7 @@
+ extern const struct linux_logo logo_superh_vga16;
+ extern const struct linux_logo logo_superh_clut224;
+ extern const struct linux_logo logo_m32r_clut224;
++extern const struct linux_logo logo_openmoko_clut224;
+
+ static int nologo;
+ module_param(nologo, bool, 0);
+@@ -115,6 +116,10 @@
+ /* M32R Linux logo */
+ logo = &logo_m32r_clut224;
+ #endif
++#ifdef CONFIG_LOGO_OPENMOKO_CLUT224
++ /* Openmoko Linux logo */
++ logo = &logo_openmoko_clut224;
++#endif
+ }
+ return logo;
+ }
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/video/logo/Makefile linux-2.6.29-rc3.owrt.om/drivers/video/logo/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/video/logo/Makefile 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/video/logo/Makefile 2009-05-10 22:28:00.000000000 +0200
+@@ -15,6 +15,7 @@
+ obj-$(CONFIG_LOGO_SUPERH_VGA16) += logo_superh_vga16.o
+ obj-$(CONFIG_LOGO_SUPERH_CLUT224) += logo_superh_clut224.o
+ obj-$(CONFIG_LOGO_M32R_CLUT224) += logo_m32r_clut224.o
++obj-$(CONFIG_LOGO_OPENMOKO_CLUT224) += logo_openmoko_clut224.o
+
+ obj-$(CONFIG_SPU_BASE) += logo_spe_clut224.o
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/video/Makefile linux-2.6.29-rc3.owrt.om/drivers/video/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/video/Makefile 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/video/Makefile 2009-05-10 22:28:00.000000000 +0200
+@@ -109,6 +109,7 @@
+ obj-$(CONFIG_FB_S1D13XXX) += s1d13xxxfb.o
+ obj-$(CONFIG_FB_SH7760) += sh7760fb.o
+ obj-$(CONFIG_FB_IMX) += imxfb.o
++obj-$(CONFIG_FB_S3C) += s3c-fb.o
+ obj-$(CONFIG_FB_S3C2410) += s3c2410fb.o
+ obj-$(CONFIG_FB_FSL_DIU) += fsl-diu-fb.o
+ obj-$(CONFIG_FB_COBALT) += cobalt_lcdfb.o
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/video/s3c2410fb.c linux-2.6.29-rc3.owrt.om/drivers/video/s3c2410fb.c
+--- linux-2.6.29-rc3.owrt/drivers/video/s3c2410fb.c 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/video/s3c2410fb.c 2009-05-10 22:28:00.000000000 +0200
+@@ -1017,6 +1017,8 @@
+
+ s3c2410fb_init_registers(fbinfo);
+
++ s3c2410fb_set_par(fbinfo);
++
+ return 0;
+ }
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/video/s3c-fb.c linux-2.6.29-rc3.owrt.om/drivers/video/s3c-fb.c
+--- linux-2.6.29-rc3.owrt/drivers/video/s3c-fb.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/video/s3c-fb.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,1036 @@
++/* linux/drivers/video/s3c-fb.c
++ *
++ * Copyright 2008 Openmoko Inc.
++ * Copyright 2008 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ * http://armlinux.simtec.co.uk/
++ *
++ * Samsung SoC Framebuffer driver
++ *
++ * 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.
++*/
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/platform_device.h>
++#include <linux/dma-mapping.h>
++#include <linux/init.h>
++#include <linux/gfp.h>
++#include <linux/clk.h>
++#include <linux/fb.h>
++#include <linux/io.h>
++
++#include <mach/map.h>
++#include <mach/regs-fb.h>
++#include <plat/fb.h>
++
++/* This driver will export a number of framebuffer interfaces depending
++ * on the configuration passed in via the platform data. Each fb instance
++ * maps to a hardware window. Currently there is no support for runtime
++ * setting of the alpha-blending functions that each window has, so only
++ * window 0 is actually useful.
++ *
++ * Window 0 is treated specially, it is used for the basis of the LCD
++ * output timings and as the control for the output power-down state.
++*/
++
++/* note, some of the functions that get called are derived from including
++ * <mach/regs-fb.h> as they are specific to the architecture that the code
++ * is being built for.
++*/
++
++#ifdef CONFIG_FB_S3C_DEBUG_REGWRITE
++#undef writel
++#define writel(v, r) do { \
++ printk(KERN_DEBUG "%s: %08x => %p\n", __func__, (unsigned int)v, r); \
++ __raw_writel(v, r); } while(0)
++#endif /* FB_S3C_DEBUG_REGWRITE */
++
++struct s3c_fb;
++
++/**
++ * struct s3c_fb_win - per window private data for each framebuffer.
++ * @windata: The platform data supplied for the window configuration.
++ * @parent: The hardware that this window is part of.
++ * @fbinfo: Pointer pack to the framebuffer info for this window.
++ * @palette_buffer: Buffer/cache to hold palette entries.
++ * @pseudo_palette: For use in TRUECOLOUR modes for entries 0..15/
++ * @index: The window number of this window.
++ * @palette: The bitfields for changing r/g/b into a hardware palette entry.
++ */
++struct s3c_fb_win {
++ struct s3c_fb_pd_win *windata;
++ struct s3c_fb *parent;
++ struct fb_info *fbinfo;
++ struct s3c_fb_palette palette;
++
++ u32 *palette_buffer;
++ u32 pseudo_palette[16];
++ unsigned int index;
++};
++
++/**
++ * struct s3c_fb - overall hardware state of the hardware
++ * @dev: The device that we bound to, for printing, etc.
++ * @regs_res: The resource we claimed for the IO registers.
++ * @bus_clk: The clk (hclk) feeding our interface and possibly pixclk.
++ * @regs: The mapped hardware registers.
++ * @enabled: A bitmask of enabled hardware windows.
++ * @pdata: The platform configuration data passed with the device.
++ * @windows: The hardware windows that have been claimed.
++ */
++struct s3c_fb {
++ struct device *dev;
++ struct resource *regs_res;
++ struct clk *bus_clk;
++ void __iomem *regs;
++
++ unsigned char enabled;
++
++ struct s3c_fb_platdata *pdata;
++ struct s3c_fb_win *windows[S3C_FB_MAX_WIN];
++};
++
++/**
++ * s3c_fb_win_has_palette() - determine if a mode has a palette
++ * @win: The window number being queried.
++ * @bpp: The number of bits per pixel to test.
++ *
++ * Work out if the given window supports palletised data at the specified bpp.
++ */
++static int s3c_fb_win_has_palette(unsigned int win, unsigned int bpp)
++{
++ return s3c_fb_win_pal_size(win) <= (1 << bpp);
++}
++
++/**
++ * s3c_fb_check_var() - framebuffer layer request to verify a given mode.
++ * @var: The screen information to verify.
++ * @info: The framebuffer device.
++ *
++ * Framebuffer layer call to verify the given information and allow us to
++ * update various information depending on the hardware capabilities.
++ */
++static int s3c_fb_check_var(struct fb_var_screeninfo *var,
++ struct fb_info *info)
++{
++ struct s3c_fb_win *win = info->par;
++ struct s3c_fb_pd_win *windata = win->windata;
++ struct s3c_fb *sfb = win->parent;
++
++ dev_dbg(sfb->dev, "checking parameters\n");
++
++ var->xres_virtual = max((unsigned int)windata->virtual_x, var->xres);
++ var->yres_virtual = max((unsigned int)windata->virtual_y, var->yres);
++
++ if (!s3c_fb_validate_win_bpp(win->index, var->bits_per_pixel)) {
++ dev_dbg(sfb->dev, "win %d: unsupported bpp %d\n",
++ win->index, var->bits_per_pixel);
++ return -EINVAL;
++ }
++
++ /* always ensure these are zero, for drop through cases below */
++ var->transp.offset = 0;
++ var->transp.length = 0;
++
++ switch (var->bits_per_pixel) {
++ case 1:
++ case 2:
++ case 4:
++ case 8:
++ if (!s3c_fb_win_has_palette(win->index, var->bits_per_pixel)) {
++ /* non palletised, A:1,R:2,G:3,B:2 mode */
++ var->red.offset = 4;
++ var->green.offset = 2;
++ var->blue.offset = 0;
++ var->red.length = 5;
++ var->green.length = 3;
++ var->blue.length = 2;
++ var->transp.offset = 7;
++ var->transp.length = 1;
++ } else {
++ var->red.offset = 0;
++ var->red.length = var->bits_per_pixel;
++ var->green = var->red;
++ var->blue = var->red;
++ }
++ break;
++
++ case 19:
++ /* 666 with one bit alpha/transparency */
++ var->transp.offset = 18;
++ var->transp.length = 1;
++ case 18:
++ var->bits_per_pixel = 32;
++
++ /* 666 format */
++ var->red.offset = 12;
++ var->green.offset = 6;
++ var->blue.offset = 0;
++ var->red.length = 6;
++ var->green.length = 6;
++ var->blue.length = 6;
++ break;
++
++ case 16:
++ /* 16 bpp, 565 format */
++ var->red.offset = 11;
++ var->green.offset = 5;
++ var->blue.offset = 0;
++ var->red.length = 5;
++ var->green.length = 6;
++ var->blue.length = 5;
++ break;
++
++ case 28:
++ case 25:
++ var->transp.length = var->bits_per_pixel - 24;
++ var->transp.offset = 24;
++ /* drop through */
++ case 24:
++ /* our 24bpp is unpacked, so 32bpp */
++ var->bits_per_pixel = 32;
++ case 32:
++ var->red.offset = 16;
++ var->red.length = 8;
++ var->green.offset = 8;
++ var->green.length = 8;
++ var->blue.offset = 0;
++ var->blue.length = 8;
++ break;
++
++ default:
++ dev_err(sfb->dev, "invalid bpp\n");
++ }
++
++ dev_dbg(sfb->dev, "%s: verified parameters\n", __func__);
++ return 0;
++}
++
++/**
++ * s3c_fb_calc_pixclk() - calculate the divider to create the pixel clock.
++ * @sfb: The hardware state.
++ * @pixclock: The pixel clock wanted, in picoseconds.
++ *
++ * Given the specified pixel clock, work out the necessary divider to get
++ * close to the output frequency.
++ */
++static int s3c_fb_calc_pixclk(struct s3c_fb *sfb, unsigned int pixclk)
++{
++ unsigned long clk = clk_get_rate(sfb->bus_clk);
++ unsigned long long tmp;
++ unsigned int result;
++
++ tmp = (unsigned long long)clk;
++ tmp *= pixclk;
++
++ do_div(tmp, 1000000000UL);
++ result = (unsigned int)tmp / 1000;
++
++ dev_dbg(sfb->dev, "pixclk=%u, clk=%lu, div=%d (%lu)\n",
++ pixclk, clk, result, clk / result);
++
++ return result;
++}
++
++/**
++ * s3c_fb_align_word() - align pixel count to word boundary
++ * @bpp: The number of bits per pixel
++ * @pix: The value to be aligned.
++ *
++ * Align the given pixel count so that it will start on an 32bit word
++ * boundary.
++ */
++static int s3c_fb_align_word(unsigned int bpp, unsigned int pix)
++{
++ int pix_per_word;
++
++ if (bpp > 16)
++ return pix;
++
++ pix_per_word = (8 * 32) / bpp;
++ return ALIGN(pix, pix_per_word);
++}
++
++/**
++ * s3c_fb_set_par() - framebuffer request to set new framebuffer state.
++ * @info: The framebuffer to change.
++ *
++ * Framebuffer layer request to set a new mode for the specified framebuffer
++ */
++static int s3c_fb_set_par(struct fb_info *info)
++{
++ struct fb_var_screeninfo *var = &info->var;
++ struct s3c_fb_win *win = info->par;
++ struct s3c_fb *sfb = win->parent;
++ void __iomem *regs = sfb->regs;
++ int win_no = win->index;
++ u32 data;
++ u32 pagewidth;
++ int clkdiv;
++
++ dev_dbg(sfb->dev, "setting framebuffer parameters\n");
++
++ switch (var->bits_per_pixel) {
++ case 32:
++ case 24:
++ case 16:
++ case 12:
++ info->fix.visual = FB_VISUAL_TRUECOLOR;
++ break;
++ case 8:
++ if (s3c_fb_win_has_palette(win_no, 8))
++ info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
++ else
++ info->fix.visual = FB_VISUAL_TRUECOLOR;
++ break;
++ case 1:
++ info->fix.visual = FB_VISUAL_MONO01;
++ break;
++ default:
++ info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
++ break;
++ }
++
++ info->fix.line_length = (var->xres_virtual * var->bits_per_pixel) / 8;
++
++ /* disable the window whilst we update it */
++ writel(0, regs + WINCON(win_no));
++
++ /* use window 0 as the basis for the lcd output timings */
++
++ if (win_no == 0) {
++ clkdiv = s3c_fb_calc_pixclk(sfb, var->pixclock);
++
++ data = sfb->pdata->vidcon0;
++ data &= ~(VIDCON0_CLKVAL_F_MASK | VIDCON0_CLKDIR);
++
++ if (clkdiv > 1)
++ data |= VIDCON0_CLKVAL_F(clkdiv-1) | VIDCON0_CLKDIR;
++ else
++ data &= ~VIDCON0_CLKDIR; /* 1:1 clock */
++
++ /* write the timing data to the panel */
++
++ data |= VIDCON0_ENVID | VIDCON0_ENVID_F;
++ writel(data, regs + VIDCON0);
++
++ data = VIDTCON0_VBPD(var->upper_margin - 1) |
++ VIDTCON0_VFPD(var->lower_margin - 1) |
++ VIDTCON0_VSPW(var->vsync_len - 1);
++
++ writel(data, regs + VIDTCON0);
++
++ data = VIDTCON1_HBPD(var->left_margin - 1) |
++ VIDTCON1_HFPD(var->right_margin - 1) |
++ VIDTCON1_HSPW(var->hsync_len - 1);
++
++ writel(data, regs + VIDTCON1);
++
++ data = VIDTCON2_LINEVAL(var->yres - 1) |
++ VIDTCON2_HOZVAL(var->xres - 1);
++ writel(data, regs + VIDTCON2);
++ }
++
++ /* write the buffer address */
++
++ writel(info->fix.smem_start, regs + VIDW_BUF_START(win_no));
++
++ data = info->fix.smem_start + info->fix.line_length * var->yres;
++ writel(data, regs + VIDW_BUF_END(win_no));
++
++ pagewidth = (var->xres * var->bits_per_pixel) >> 3;
++ data = VIDW_BUF_SIZE_OFFSET(info->fix.line_length - pagewidth) |
++ VIDW_BUF_SIZE_PAGEWIDTH(pagewidth);
++ writel(data, regs + VIDW_BUF_SIZE(win_no));
++
++ /* write 'OSD' registers to control position of framebuffer */
++
++ data = VIDOSDxA_TOPLEFT_X(0) | VIDOSDxA_TOPLEFT_Y(0);
++ writel(data, regs + VIDOSD_A(win_no));
++
++ data = VIDOSDxB_BOTRIGHT_X(s3c_fb_align_word(var->bits_per_pixel,
++ var->xres - 1)) |
++ VIDOSDxB_BOTRIGHT_Y(var->yres - 1);
++
++ writel(data, regs + VIDOSD_B(win_no));
++
++ data = var->xres * var->yres;
++ if (s3c_fb_has_osd_d(win_no)) {
++ writel(data, regs + VIDOSD_D(win_no));
++ writel(0, regs + VIDOSD_C(win_no));
++ } else
++ writel(data, regs + VIDOSD_C(win_no));
++
++ data = WINCONx_ENWIN;
++
++ /* note, since we have to round up the bits-per-pixel, we end up
++ * relying on the bitfield information for r/g/b/a to work out
++ * exactly which mode of operation is intended. */
++
++ switch (var->bits_per_pixel) {
++ case 1:
++ data |= WINCON0_BPPMODE_1BPP;
++ data |= WINCONx_BITSWP;
++ data |= WINCONx_BURSTLEN_4WORD;
++ break;
++ case 2:
++ data |= WINCON0_BPPMODE_2BPP;
++ data |= WINCONx_BITSWP;
++ data |= WINCONx_BURSTLEN_8WORD;
++ break;
++ case 4:
++ data |= WINCON0_BPPMODE_4BPP;
++ data |= WINCONx_BITSWP;
++ data |= WINCONx_BURSTLEN_8WORD;
++ break;
++ case 8:
++ if (var->transp.length != 0)
++ data |= WINCON1_BPPMODE_8BPP_1232;
++ else
++ data |= WINCON0_BPPMODE_8BPP_PALETTE;
++ data |= WINCONx_BURSTLEN_8WORD;
++ data |= WINCONx_BYTSWP;
++ break;
++ case 16:
++ if (var->transp.length != 0)
++ data |= WINCON1_BPPMODE_16BPP_A1555;
++ else
++ data |= WINCON0_BPPMODE_16BPP_565;
++ data |= WINCONx_HAWSWP;
++ data |= WINCONx_BURSTLEN_16WORD;
++ break;
++ case 24:
++ case 32:
++ if (var->red.length == 6) {
++ if (var->transp.length != 0)
++ data |= WINCON1_BPPMODE_19BPP_A1666;
++ else
++ data |= WINCON1_BPPMODE_18BPP_666;
++ } else if (var->transp.length != 0)
++ data |= WINCON1_BPPMODE_25BPP_A1888;
++ else
++ data |= WINCON0_BPPMODE_24BPP_888;
++
++ data |= WINCONx_BURSTLEN_16WORD;
++ break;
++ }
++
++ writel(data, regs + WINCON(win_no));
++ writel(0x0, regs + WINxMAP(win_no));
++
++ return 0;
++}
++
++/**
++ * s3c_fb_update_palette() - set or schedule a palette update.
++ * @sfb: The hardware information.
++ * @win: The window being updated.
++ * @reg: The palette index being changed.
++ * @value: The computed palette value.
++ *
++ * Change the value of a palette register, either by directly writing to
++ * the palette (this requires the palette RAM to be disconnected from the
++ * hardware whilst this is in progress) or schedule the update for later.
++ *
++ * At the moment, since we have no VSYNC interrupt support, we simply set
++ * the palette entry directly.
++ */
++static void s3c_fb_update_palette(struct s3c_fb *sfb,
++ struct s3c_fb_win *win,
++ unsigned int reg,
++ u32 value)
++{
++ void __iomem *palreg;
++ u32 palcon;
++
++ palreg = sfb->regs + s3c_fb_pal_reg(win->index, reg);
++
++ dev_dbg(sfb->dev, "%s: win %d, reg %d (%p): %08x\n",
++ __func__, win->index, reg, palreg, value);
++
++ win->palette_buffer[reg] = value;
++
++ palcon = readl(sfb->regs + WPALCON);
++ writel(palcon | WPALCON_PAL_UPDATE, sfb->regs + WPALCON);
++
++ if (s3c_fb_pal_is16(win->index))
++ writew(value, palreg);
++ else
++ writel(value, palreg);
++
++ writel(palcon, sfb->regs + WPALCON);
++}
++
++static inline unsigned int chan_to_field(unsigned int chan,
++ struct fb_bitfield *bf)
++{
++ chan &= 0xffff;
++ chan >>= 16 - bf->length;
++ return chan << bf->offset;
++}
++
++/**
++ * s3c_fb_setcolreg() - framebuffer layer request to change palette.
++ * @regno: The palette index to change.
++ * @red: The red field for the palette data.
++ * @green: The green field for the palette data.
++ * @blue: The blue field for the palette data.
++ * @trans: The transparency (alpha) field for the palette data.
++ * @info: The framebuffer being changed.
++ */
++static int s3c_fb_setcolreg(unsigned regno,
++ unsigned red, unsigned green, unsigned blue,
++ unsigned transp, struct fb_info *info)
++{
++ struct s3c_fb_win *win = info->par;
++ struct s3c_fb *sfb = win->parent;
++ unsigned int val;
++
++ dev_dbg(sfb->dev, "%s: win %d: %d => rgb=%d/%d/%d\n",
++ __func__, win->index, regno, red, green, blue);
++
++ switch (info->fix.visual) {
++ case FB_VISUAL_TRUECOLOR:
++ /* true-colour, use pseudo-palette */
++
++ if (regno < 16) {
++ u32 *pal = info->pseudo_palette;
++
++ val = chan_to_field(red, &info->var.red);
++ val |= chan_to_field(green, &info->var.green);
++ val |= chan_to_field(blue, &info->var.blue);
++
++ pal[regno] = val;
++ }
++ break;
++
++ case FB_VISUAL_PSEUDOCOLOR:
++ if (regno < s3c_fb_win_pal_size(win->index)) {
++ val = chan_to_field(red, &win->palette.r);
++ val |= chan_to_field(green, &win->palette.g);
++ val |= chan_to_field(blue, &win->palette.b);
++
++ s3c_fb_update_palette(sfb, win, regno, val);
++ }
++
++ break;
++
++ default:
++ return 1; /* unknown type */
++ }
++
++ return 0;
++}
++
++/**
++ * s3c_fb_enable() - Set the state of the main LCD output
++ * @sfb: The main framebuffer state.
++ * @enable: The state to set.
++ */
++static void s3c_fb_enable(struct s3c_fb *sfb, int enable)
++{
++ u32 vidcon0 = readl(sfb->regs + VIDCON0);
++
++ if (enable)
++ vidcon0 |= VIDCON0_ENVID | VIDCON0_ENVID_F;
++ else {
++ /* see the note in the framebuffer datasheet about
++ * why you cannot take both of these bits down at the
++ * same time. */
++
++ if (!(vidcon0 & VIDCON0_ENVID))
++ return;
++
++ vidcon0 |= VIDCON0_ENVID;
++ vidcon0 &= ~VIDCON0_ENVID_F;
++ }
++
++ writel(vidcon0, sfb->regs + VIDCON0);
++}
++
++/**
++ * s3c_fb_blank() - blank or unblank the given window
++ * @blank_mode: The blank state from FB_BLANK_*
++ * @info: The framebuffer to blank.
++ *
++ * Framebuffer layer request to change the power state.
++ */
++static int s3c_fb_blank(int blank_mode, struct fb_info *info)
++{
++ struct s3c_fb_win *win = info->par;
++ struct s3c_fb *sfb = win->parent;
++ unsigned int index = win->index;
++ u32 wincon;
++
++ dev_dbg(sfb->dev, "blank mode %d\n", blank_mode);
++
++ wincon = readl(sfb->regs + WINCON(index));
++
++ switch (blank_mode) {
++ case FB_BLANK_POWERDOWN:
++ wincon &= ~WINCONx_ENWIN;
++ sfb->enabled &= ~(1 << index);
++ /* fall through to FB_BLANK_NORMAL */
++
++ case FB_BLANK_NORMAL:
++ /* disable the DMA and display 0x0 (black) */
++ writel(WINxMAP_MAP | WINxMAP_MAP_COLOUR(0x0),
++ sfb->regs + WINxMAP(index));
++ break;
++
++ case FB_BLANK_UNBLANK:
++ writel(0x0, sfb->regs + WINxMAP(index));
++ wincon |= WINCONx_ENWIN;
++ sfb->enabled |= (1 << index);
++ break;
++
++ case FB_BLANK_VSYNC_SUSPEND:
++ case FB_BLANK_HSYNC_SUSPEND:
++ default:
++ return 1;
++ }
++
++ writel(wincon, sfb->regs + WINCON(index));
++
++ /* Check the enabled state to see if we need to be running the
++ * main LCD interface, as if there are no active windows then
++ * it is highly likely that we also do not need to output
++ * anything.
++ */
++
++ /* We could do something like the following code, but the current
++ * system of using framebuffer events means that we cannot make
++ * the distinction between just window 0 being inactive and all
++ * the windows being down.
++ *
++ * s3c_fb_enable(sfb, sfb->enabled ? 1 : 0);
++ */
++
++ /* we're stuck with this until we can do something about overriding
++ * the power control using the blanking event for a single fb.
++ */
++ if (index == 0)
++ s3c_fb_enable(sfb, blank_mode != FB_BLANK_POWERDOWN ? 1 : 0);
++
++ return 0;
++}
++
++static struct fb_ops s3c_fb_ops = {
++ .owner = THIS_MODULE,
++ .fb_check_var = s3c_fb_check_var,
++ .fb_set_par = s3c_fb_set_par,
++ .fb_blank = s3c_fb_blank,
++ .fb_setcolreg = s3c_fb_setcolreg,
++ .fb_fillrect = cfb_fillrect,
++ .fb_copyarea = cfb_copyarea,
++ .fb_imageblit = cfb_imageblit,
++};
++
++/**
++ * s3c_fb_alloc_memory() - allocate display memory for framebuffer window
++ * @sfb: The base resources for the hardware.
++ * @win: The window to initialise memory for.
++ *
++ * Allocate memory for the given framebuffer.
++ */
++static int __devinit s3c_fb_alloc_memory(struct s3c_fb *sfb,
++ struct s3c_fb_win *win)
++{
++ struct s3c_fb_pd_win *windata = win->windata;
++ unsigned int real_size, virt_size, size;
++ struct fb_info *fbi = win->fbinfo;
++ dma_addr_t map_dma;
++
++ dev_dbg(sfb->dev, "allocating memory for display\n");
++
++ real_size = windata->win_mode.xres * windata->win_mode.yres;
++ virt_size = windata->virtual_x * windata->virtual_y;
++
++ dev_dbg(sfb->dev, "real_size=%u (%u.%u), virt_size=%u (%u.%u)\n",
++ real_size, windata->win_mode.xres, windata->win_mode.yres,
++ virt_size, windata->virtual_x, windata->virtual_y);
++
++ size = (real_size > virt_size) ? real_size : virt_size;
++ size *= (windata->max_bpp > 16) ? 32 : windata->max_bpp;
++ size /= 8;
++
++ fbi->fix.smem_len = size;
++ size = PAGE_ALIGN(size);
++
++ dev_dbg(sfb->dev, "want %u bytes for window\n", size);
++
++ fbi->screen_base = dma_alloc_writecombine(sfb->dev, size,
++ &map_dma, GFP_KERNEL);
++ if (!fbi->screen_base)
++ return -ENOMEM;
++
++ dev_dbg(sfb->dev, "mapped %x to %p\n",
++ (unsigned int)map_dma, fbi->screen_base);
++
++ memset(fbi->screen_base, 0x0, size);
++ fbi->fix.smem_start = map_dma;
++
++ return 0;
++}
++
++/**
++ * s3c_fb_free_memory() - free the display memory for the given window
++ * @sfb: The base resources for the hardware.
++ * @win: The window to free the display memory for.
++ *
++ * Free the display memory allocated by s3c_fb_alloc_memory().
++ */
++static void s3c_fb_free_memory(struct s3c_fb *sfb, struct s3c_fb_win *win)
++{
++ struct fb_info *fbi = win->fbinfo;
++
++ dma_free_writecombine(sfb->dev, PAGE_ALIGN(fbi->fix.smem_len),
++ fbi->screen_base, fbi->fix.smem_start);
++}
++
++/**
++ * s3c_fb_release_win() - release resources for a framebuffer window.
++ * @win: The window to cleanup the resources for.
++ *
++ * Release the resources that where claimed for the hardware window,
++ * such as the framebuffer instance and any memory claimed for it.
++ */
++static void s3c_fb_release_win(struct s3c_fb *sfb, struct s3c_fb_win *win)
++{
++ fb_dealloc_cmap(&win->fbinfo->cmap);
++ unregister_framebuffer(win->fbinfo);
++ s3c_fb_free_memory(sfb, win);
++}
++
++/**
++ * s3c_fb_probe_win() - register an hardware window
++ * @sfb: The base resources for the hardware
++ * @res: Pointer to where to place the resultant window.
++ *
++ * Allocate and do the basic initialisation for one of the hardware's graphics
++ * windows.
++ */
++static int __devinit s3c_fb_probe_win(struct s3c_fb *sfb, unsigned int win_no,
++ struct s3c_fb_win **res)
++{
++ struct fb_var_screeninfo *var;
++ struct fb_videomode *initmode;
++ struct s3c_fb_pd_win *windata;
++ struct s3c_fb_win *win;
++ struct fb_info *fbinfo;
++ int palette_size;
++ int ret;
++
++ dev_dbg(sfb->dev, "probing window %d\n", win_no);
++
++ palette_size = s3c_fb_win_pal_size(win_no);
++
++ fbinfo = framebuffer_alloc(sizeof(struct s3c_fb_win) +
++ palette_size * sizeof(u32), sfb->dev);
++ if (!fbinfo) {
++ dev_err(sfb->dev, "failed to allocate framebuffer\n");
++ return -ENOENT;
++ }
++
++ windata = sfb->pdata->win[win_no];
++ initmode = &windata->win_mode;
++
++ WARN_ON(windata->max_bpp == 0);
++ WARN_ON(windata->win_mode.xres == 0);
++ WARN_ON(windata->win_mode.yres == 0);
++
++ win = fbinfo->par;
++ var = &fbinfo->var;
++ win->fbinfo = fbinfo;
++ win->parent = sfb;
++ win->windata = windata;
++ win->index = win_no;
++ win->palette_buffer = (u32 *)(win + 1);
++
++ ret = s3c_fb_alloc_memory(sfb, win);
++ if (ret) {
++ dev_err(sfb->dev, "failed to allocate display memory\n");
++ goto err_framebuffer;
++ }
++
++ /* setup the r/b/g positions for the window's palette */
++ s3c_fb_init_palette(win_no, &win->palette);
++
++ /* setup the initial video mode from the window */
++ fb_videomode_to_var(&fbinfo->var, initmode);
++
++ fbinfo->fix.type = FB_TYPE_PACKED_PIXELS;
++ fbinfo->fix.accel = FB_ACCEL_NONE;
++ fbinfo->var.activate = FB_ACTIVATE_NOW;
++ fbinfo->var.vmode = FB_VMODE_NONINTERLACED;
++ fbinfo->var.bits_per_pixel = windata->default_bpp;
++ fbinfo->fbops = &s3c_fb_ops;
++ fbinfo->flags = FBINFO_FLAG_DEFAULT;
++ fbinfo->pseudo_palette = &win->pseudo_palette;
++
++ /* prepare to actually start the framebuffer */
++
++ ret = s3c_fb_check_var(&fbinfo->var, fbinfo);
++ if (ret < 0) {
++ dev_err(sfb->dev, "check_var failed on initial video params\n");
++ goto err_alloc_mem;
++ }
++
++ /* create initial colour map */
++
++ ret = fb_alloc_cmap(&fbinfo->cmap, s3c_fb_win_pal_size(win_no), 1);
++ if (ret == 0)
++ fb_set_cmap(&fbinfo->cmap, fbinfo);
++ else
++ dev_err(sfb->dev, "failed to allocate fb cmap\n");
++
++ s3c_fb_set_par(fbinfo);
++
++ dev_dbg(sfb->dev, "about to register framebuffer\n");
++
++ /* run the check_var and set_par on our configuration. */
++
++ ret = register_framebuffer(fbinfo);
++ if (ret < 0) {
++ dev_err(sfb->dev, "failed to register framebuffer\n");
++ goto err_alloc_mem;
++ }
++
++ *res = win;
++ dev_info(sfb->dev, "window %d: fb %s\n", win_no, fbinfo->fix.id);
++
++ return 0;
++
++err_alloc_mem:
++ s3c_fb_free_memory(sfb, win);
++
++err_framebuffer:
++ unregister_framebuffer(fbinfo);
++ return ret;
++}
++
++/**
++ * s3c_fb_clear_win() - clear hardware window registers.
++ * @sfb: The base resources for the hardware.
++ * @win: The window to process.
++ *
++ * Reset the specific window registers to a known state.
++ */
++static void s3c_fb_clear_win(struct s3c_fb *sfb, int win)
++{
++ void __iomem *regs = sfb->regs;
++
++ writel(0, regs + WINCON(win));
++ writel(0xffffff, regs + WxKEYCONy(win, 0));
++ writel(0xffffff, regs + WxKEYCONy(win, 1));
++
++ writel(0, regs + VIDOSD_A(win));
++ writel(0, regs + VIDOSD_B(win));
++ writel(0, regs + VIDOSD_C(win));
++}
++
++static int __devinit s3c_fb_probe(struct platform_device *pdev)
++{
++ struct device *dev = &pdev->dev;
++ struct s3c_fb_platdata *pd;
++ struct s3c_fb *sfb;
++ struct resource *res;
++ int win;
++ int ret = 0;
++
++ pd = pdev->dev.platform_data;
++ if (!pd) {
++ dev_err(dev, "no platform data specified\n");
++ return -EINVAL;
++ }
++
++ sfb = kzalloc(sizeof(struct s3c_fb), GFP_KERNEL);
++ if (!sfb) {
++ dev_err(dev, "no memory for framebuffers\n");
++ return -ENOMEM;
++ }
++
++ sfb->dev = dev;
++ sfb->pdata = pd;
++
++ sfb->bus_clk = clk_get(dev, "lcd");
++ if (IS_ERR(sfb->bus_clk)) {
++ dev_err(dev, "failed to get bus clock\n");
++ goto err_sfb;
++ }
++
++ clk_enable(sfb->bus_clk);
++
++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ if (!res) {
++ dev_err(dev, "failed to find registers\n");
++ ret = -ENOENT;
++ goto err_clk;
++ }
++
++ sfb->regs_res = request_mem_region(res->start, resource_size(res),
++ dev_name(dev));
++ if (!sfb->regs_res) {
++ dev_err(dev, "failed to claim register region\n");
++ ret = -ENOENT;
++ goto err_clk;
++ }
++
++ sfb->regs = ioremap(res->start, resource_size(res));
++ if (!sfb->regs) {
++ dev_err(dev, "failed to map registers\n");
++ ret = -ENXIO;
++ goto err_req_region;
++ }
++
++ dev_dbg(dev, "got resources (regs %p), probing windows\n", sfb->regs);
++
++ /* setup gpio and output polarity controls */
++
++ pd->setup_gpio();
++
++ writel(pd->vidcon1, sfb->regs + VIDCON1);
++
++ /* zero all windows before we do anything */
++
++ for (win = 0; win < S3C_FB_MAX_WIN; win++)
++ s3c_fb_clear_win(sfb, win);
++
++ /* we have the register setup, start allocating framebuffers */
++
++ for (win = 0; win < S3C_FB_MAX_WIN; win++) {
++ if (!pd->win[win])
++ continue;
++
++ ret = s3c_fb_probe_win(sfb, win, &sfb->windows[win]);
++ if (ret < 0) {
++ dev_err(dev, "failed to create window %d\n", win);
++ for (; win >= 0; win--)
++ s3c_fb_release_win(sfb, sfb->windows[win]);
++ goto err_ioremap;
++ }
++ }
++
++ platform_set_drvdata(pdev, sfb);
++
++ return 0;
++
++err_ioremap:
++ iounmap(sfb->regs);
++
++err_req_region:
++ release_resource(sfb->regs_res);
++ kfree(sfb->regs_res);
++
++err_clk:
++ clk_disable(sfb->bus_clk);
++ clk_put(sfb->bus_clk);
++
++err_sfb:
++ kfree(sfb);
++ return ret;
++}
++
++/**
++ * s3c_fb_remove() - Cleanup on module finalisation
++ * @pdev: The platform device we are bound to.
++ *
++ * Shutdown and then release all the resources that the driver allocated
++ * on initialisation.
++ */
++static int __devexit s3c_fb_remove(struct platform_device *pdev)
++{
++ struct s3c_fb *sfb = platform_get_drvdata(pdev);
++ int win;
++
++ for (win = 0; win <= S3C_FB_MAX_WIN; win++)
++ s3c_fb_release_win(sfb, sfb->windows[win]);
++
++ iounmap(sfb->regs);
++
++ clk_disable(sfb->bus_clk);
++ clk_put(sfb->bus_clk);
++
++ release_resource(sfb->regs_res);
++ kfree(sfb->regs_res);
++
++ kfree(sfb);
++
++ return 0;
++}
++
++#ifdef CONFIG_PM
++static int s3c_fb_suspend(struct platform_device *pdev, pm_message_t state)
++{
++ struct s3c_fb *sfb = platform_get_drvdata(pdev);
++ struct s3c_fb_win *win;
++ int win_no;
++
++ for (win_no = S3C_FB_MAX_WIN; win_no >= 0; win_no--) {
++ win = sfb->windows[win_no];
++ if (!win)
++ continue;
++
++ /* use the blank function to push into power-down */
++ s3c_fb_blank(FB_BLANK_POWERDOWN, win->fbinfo);
++ }
++
++ clk_disable(sfb->bus_clk);
++ return 0;
++}
++
++static int s3c_fb_resume(struct platform_device *pdev)
++{
++ struct s3c_fb *sfb = platform_get_drvdata(pdev);
++ struct s3c_fb_win *win;
++ int win_no;
++
++ clk_enable(sfb->bus_clk);
++
++ for (win_no = 0; win_no < S3C_FB_MAX_WIN; win_no++) {
++ win = sfb->windows[win_no];
++ if (!win)
++ continue;
++
++ dev_dbg(&pdev->dev, "resuming window %d\n", win_no);
++ s3c_fb_set_par(win->fbinfo);
++ }
++
++ return 0;
++}
++#else
++#define s3c_fb_suspend NULL
++#define s3c_fb_resume NULL
++#endif
++
++static struct platform_driver s3c_fb_driver = {
++ .probe = s3c_fb_probe,
++ .remove = s3c_fb_remove,
++ .suspend = s3c_fb_suspend,
++ .resume = s3c_fb_resume,
++ .driver = {
++ .name = "s3c-fb",
++ .owner = THIS_MODULE,
++ },
++};
++
++static int __init s3c_fb_init(void)
++{
++ return platform_driver_register(&s3c_fb_driver);
++}
++
++static void __exit s3c_fb_cleanup(void)
++{
++ platform_driver_unregister(&s3c_fb_driver);
++}
++
++module_init(s3c_fb_init);
++module_exit(s3c_fb_cleanup);
++
++MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>");
++MODULE_DESCRIPTION("Samsung S3C SoC Framebuffer driver");
++MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:s3c-fb");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/watchdog/Kconfig linux-2.6.29-rc3.owrt.om/drivers/watchdog/Kconfig
+--- linux-2.6.29-rc3.owrt/drivers/watchdog/Kconfig 2009-05-10 22:08:45.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/watchdog/Kconfig 2009-05-10 22:28:00.000000000 +0200
+@@ -154,6 +154,13 @@
+ The driver can be built as a module by choosing M, and will
+ be called s3c2410_wdt
+
++config PCF50606_WATCHDOG
++ depends on MFD_PCF50606
++ tristate "Philips PCF50606 watchdog"
++ help
++ If you say yes here you get support for the Philips PCF50606
++ PMU's watchdog.
++
+ config SA1100_WATCHDOG
+ tristate "SA1100/PXA2xx watchdog"
+ depends on ARCH_SA1100 || ARCH_PXA
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/watchdog/Makefile linux-2.6.29-rc3.owrt.om/drivers/watchdog/Makefile
+--- linux-2.6.29-rc3.owrt/drivers/watchdog/Makefile 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/drivers/watchdog/Makefile 2009-05-10 22:28:00.000000000 +0200
+@@ -34,6 +34,7 @@
+ obj-$(CONFIG_IXP4XX_WATCHDOG) += ixp4xx_wdt.o
+ obj-$(CONFIG_KS8695_WATCHDOG) += ks8695_wdt.o
+ obj-$(CONFIG_S3C2410_WATCHDOG) += s3c2410_wdt.o
++obj-$(CONFIG_PCF50606_WATCHDOG) += pcf50606_wdt.o
+ obj-$(CONFIG_SA1100_WATCHDOG) += sa1100_wdt.o
+ obj-$(CONFIG_MPCORE_WATCHDOG) += mpcore_wdt.o
+ obj-$(CONFIG_EP93XX_WATCHDOG) += ep93xx_wdt.o
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/drivers/watchdog/pcf50606_wdt.c linux-2.6.29-rc3.owrt.om/drivers/watchdog/pcf50606_wdt.c
+--- linux-2.6.29-rc3.owrt/drivers/watchdog/pcf50606_wdt.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/drivers/watchdog/pcf50606_wdt.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,223 @@
++/* Philips PCF50606 Watchdog Timer Driver
++ *
++ * (C) 2006-2008 by Openmoko, Inc.
++ * Author: Balaji Rao <balajirrao@openmoko.org>
++ * All rights reserved.
++ *
++ * Broken down from monstrous PCF50606 driver mainly by
++ * Harald Welte, Matt Hsu, Andy Green and Werner Almesberger
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ */
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/device.h>
++#include <linux/rtc.h>
++#include <linux/bcd.h>
++#include <linux/err.h>
++#include <linux/miscdevice.h>
++#include <linux/watchdog.h>
++#include <linux/platform_device.h>
++
++#include <linux/mfd/pcf50606/core.h>
++
++static struct pcf50606 *pcf = NULL;
++static unsigned long wdt_status;
++
++#define WDT_IN_USE 0
++#define WDT_OK_TO_CLOSE 1
++#define WDT_REGION_INITED 2
++#define WDT_DEVICE_INITED 3
++
++static int allow_close;
++#define CLOSE_STATE_NOT 0x0000
++#define CLOSE_STATE_ALLOW 0x2342
++
++#define PCF50606_REG_OOCC1 0x08
++#define PCF50606_REG_OOCS 0x01
++
++#define PCF50606_OOCS_WDTEXP 0x80
++#define PCF50606_OOCC1_WDTRST 0x08
++
++static void pcf50606_wdt_start(void)
++{
++ pcf50606_reg_set_bit_mask(pcf, PCF50606_REG_OOCC1, PCF50606_OOCC1_WDTRST,
++ PCF50606_OOCC1_WDTRST);
++}
++
++static void pcf50606_wdt_stop(void)
++{
++ pcf50606_reg_clear_bits(pcf, PCF50606_REG_OOCS, PCF50606_OOCS_WDTEXP);
++}
++
++static void pcf50606_wdt_keepalive(void)
++{
++ pcf50606_wdt_start();
++}
++
++static int pcf50606_wdt_open(struct inode *inode, struct file *file)
++{
++ if (test_and_set_bit(WDT_IN_USE, &wdt_status))
++ return -EBUSY;
++
++ pcf50606_wdt_start();
++
++ return nonseekable_open(inode, file);
++}
++
++static int pcf50606_wdt_release(struct inode *inode, struct file *file)
++{
++ if (allow_close == CLOSE_STATE_ALLOW)
++ pcf50606_wdt_stop();
++ else {
++ printk(KERN_CRIT "Unexpected close, not stopping watchdog!\n");
++ pcf50606_wdt_keepalive();
++ }
++
++ allow_close = CLOSE_STATE_NOT;
++ clear_bit(WDT_IN_USE, &wdt_status);
++
++ return 0;
++}
++
++static ssize_t pcf50606_wdt_write(struct file *file, const char __user *data,
++ size_t len, loff_t *ppos)
++{
++ if (len) {
++ size_t i;
++
++ for (i = 0; i != len; i++) {
++ char c;
++ if (get_user(c, data + i))
++ return -EFAULT;
++ if (c == 'V')
++ allow_close = CLOSE_STATE_ALLOW;
++ }
++ pcf50606_wdt_keepalive();
++ }
++
++ return len;
++}
++
++static struct watchdog_info pcf50606_wdt_ident = {
++ .options = WDIOF_MAGICCLOSE,
++ .firmware_version = 0,
++ .identity = "PCF50606 Watchdog",
++};
++
++static int pcf50606_wdt_ioctl(struct inode *inode, struct file *file,
++ unsigned int cmd, unsigned long arg)
++{
++ void __user *argp = (void __user *)arg;
++ int __user *p = argp;
++
++ switch (cmd) {
++ case WDIOC_GETSUPPORT:
++ return copy_to_user(argp, &pcf50606_wdt_ident,
++ sizeof(pcf50606_wdt_ident)) ? -EFAULT : 0;
++ break;
++ case WDIOC_GETSTATUS:
++ case WDIOC_GETBOOTSTATUS:
++ return put_user(0, p);
++ case WDIOC_KEEPALIVE:
++ pcf50606_wdt_keepalive();
++ return 0;
++ case WDIOC_GETTIMEOUT:
++ return put_user(8, p);
++ default:
++ return -ENOIOCTLCMD;
++ }
++}
++
++static struct file_operations pcf50606_wdt_fops = {
++ .owner = THIS_MODULE,
++ .llseek = no_llseek,
++ .write = &pcf50606_wdt_write,
++ .ioctl = &pcf50606_wdt_ioctl,
++ .open = &pcf50606_wdt_open,
++ .release = &pcf50606_wdt_release,
++};
++
++static struct miscdevice pcf50606_wdt_miscdev = {
++ .minor = WATCHDOG_MINOR,
++ .name = "watchdog",
++ .fops = &pcf50606_wdt_fops,
++};
++
++static void pcf50606_wdt_irq(int irq, void *unused)
++{
++ pcf50606_reg_set_bit_mask(pcf, PCF50606_REG_OOCC1,
++ PCF50606_OOCC1_WDTRST,
++ PCF50606_OOCC1_WDTRST);
++}
++
++int __init pcf50606_wdt_probe(struct platform_device *pdev)
++{
++ struct pcf50606_subdev_pdata *pdata;
++ int err;
++
++ if (pcf) {
++ dev_err(pcf->dev, "Only one instance of WDT supported\n");
++ return -ENODEV;
++ }
++
++ pdata = pdev->dev.platform_data;
++ if (!pdata) {
++ dev_err(&pdev->dev, "No platform data available\n");
++ return -EINVAL;
++ }
++
++ pcf = pdata->pcf;
++
++ err = misc_register(&pcf50606_wdt_miscdev);
++ if (err) {
++ dev_err(&pdev->dev, "cannot register miscdev on "
++ "minor=%d (%d)\n", WATCHDOG_MINOR, err);
++ return err;
++ }
++ set_bit(WDT_DEVICE_INITED, &wdt_status);
++
++ pcf50606_register_irq(pcf, PCF50606_IRQ_CHGWD10S, pcf50606_wdt_irq, NULL);
++
++ return 0;
++}
++
++static int __devexit pcf50606_wdt_remove(struct platform_device *pdev)
++{
++ pcf50606_free_irq(pcf, PCF50606_IRQ_CHGWD10S);
++ misc_deregister(&pcf50606_wdt_miscdev);
++ pcf = NULL;
++
++ return 0;
++}
++
++struct platform_driver pcf50606_wdt_driver = {
++ .driver = {
++ .name = "pcf50606-wdt",
++ },
++ .probe = pcf50606_wdt_probe,
++ .remove = __devexit_p(pcf50606_wdt_remove),
++};
++
++static int __init pcf50606_wdt_init(void)
++{
++ return platform_driver_register(&pcf50606_wdt_driver);
++}
++module_init(pcf50606_wdt_init);
++
++static void __exit pcf50606_wdt_exit(void)
++{
++ platform_driver_unregister(&pcf50606_wdt_driver);
++}
++module_exit(pcf50606_wdt_exit);
++
++MODULE_AUTHOR("Balaji Rao <balajirrao@openmoko.org>");
++MODULE_DESCRIPTION("PCF50606 wdt driver");
++MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:pcf50606-wdt");
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/fs/jffs2/background.c linux-2.6.29-rc3.owrt.om/fs/jffs2/background.c
+--- linux-2.6.29-rc3.owrt/fs/jffs2/background.c 2009-05-10 22:08:58.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/fs/jffs2/background.c 2009-05-10 22:28:00.000000000 +0200
+@@ -95,13 +95,17 @@
+ spin_unlock(&c->erase_completion_lock);
+
+
+- /* This thread is purely an optimisation. But if it runs when
+- other things could be running, it actually makes things a
+- lot worse. Use yield() and put it at the back of the runqueue
+- every time. Especially during boot, pulling an inode in
+- with read_inode() is much preferable to having the GC thread
+- get there first. */
+- yield();
++ /* Problem - immediately after bootup, the GCD spends a lot
++ * of time in places like jffs2_kill_fragtree(); so much so
++ * that userspace processes (like gdm and X) are starved
++ * despite plenty of cond_resched()s and renicing. Yield()
++ * doesn't help, either (presumably because userspace and GCD
++ * are generally competing for a higher latency resource -
++ * disk).
++ * This forces the GCD to slow the hell down. Pulling an
++ * inode in with read_inode() is much preferable to having
++ * the GC thread get there first. */
++ schedule_timeout_interruptible(msecs_to_jiffies(50));
+
+ /* Put_super will send a SIGKILL and then wait on the sem.
+ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/asm-arm/plat-s3c24xx/neo1973.h linux-2.6.29-rc3.owrt.om/include/asm-arm/plat-s3c24xx/neo1973.h
+--- linux-2.6.29-rc3.owrt/include/asm-arm/plat-s3c24xx/neo1973.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/asm-arm/plat-s3c24xx/neo1973.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,33 @@
++/*
++ * include/asm-arm/plat-s3c24xx/neo1973.h
++ *
++ * Common utility code for GTA01 and GTA02
++ *
++ * Copyright (C) 2008 by Openmoko, Inc.
++ * Author: Holger Hans Peter Freyther <freyther@openmoko.org>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ *
++ */
++
++#ifndef NEO1973_H
++#define NEO1973_H
++
++void neo1973_gpb_add_shadow_gpio(unsigned int gpio);
++void neo1973_gpb_setpin(unsigned int pin, unsigned to);
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/asm-arm/plat-s3c24xx/regs-iis.h linux-2.6.29-rc3.owrt.om/include/asm-arm/plat-s3c24xx/regs-iis.h
+--- linux-2.6.29-rc3.owrt/include/asm-arm/plat-s3c24xx/regs-iis.h 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/include/asm-arm/plat-s3c24xx/regs-iis.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,77 +0,0 @@
+-/* arch/arm/mach-s3c2410/include/mach/regs-iis.h
+- *
+- * Copyright (c) 2003 Simtec Electronics <linux@simtec.co.uk>
+- * http://www.simtec.co.uk/products/SWLINUX/
+- *
+- * 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.
+- *
+- * S3C2410 IIS register definition
+-*/
+-
+-#ifndef __ASM_ARCH_REGS_IIS_H
+-#define __ASM_ARCH_REGS_IIS_H
+-
+-#define S3C2410_IISCON (0x00)
+-
+-#define S3C2410_IISCON_LRINDEX (1<<8)
+-#define S3C2410_IISCON_TXFIFORDY (1<<7)
+-#define S3C2410_IISCON_RXFIFORDY (1<<6)
+-#define S3C2410_IISCON_TXDMAEN (1<<5)
+-#define S3C2410_IISCON_RXDMAEN (1<<4)
+-#define S3C2410_IISCON_TXIDLE (1<<3)
+-#define S3C2410_IISCON_RXIDLE (1<<2)
+-#define S3C2410_IISCON_PSCEN (1<<1)
+-#define S3C2410_IISCON_IISEN (1<<0)
+-
+-#define S3C2410_IISMOD (0x04)
+-
+-#define S3C2440_IISMOD_MPLL (1<<9)
+-#define S3C2410_IISMOD_SLAVE (1<<8)
+-#define S3C2410_IISMOD_NOXFER (0<<6)
+-#define S3C2410_IISMOD_RXMODE (1<<6)
+-#define S3C2410_IISMOD_TXMODE (2<<6)
+-#define S3C2410_IISMOD_TXRXMODE (3<<6)
+-#define S3C2410_IISMOD_LR_LLOW (0<<5)
+-#define S3C2410_IISMOD_LR_RLOW (1<<5)
+-#define S3C2410_IISMOD_IIS (0<<4)
+-#define S3C2410_IISMOD_MSB (1<<4)
+-#define S3C2410_IISMOD_8BIT (0<<3)
+-#define S3C2410_IISMOD_16BIT (1<<3)
+-#define S3C2410_IISMOD_BITMASK (1<<3)
+-#define S3C2410_IISMOD_256FS (0<<2)
+-#define S3C2410_IISMOD_384FS (1<<2)
+-#define S3C2410_IISMOD_16FS (0<<0)
+-#define S3C2410_IISMOD_32FS (1<<0)
+-#define S3C2410_IISMOD_48FS (2<<0)
+-#define S3C2410_IISMOD_FS_MASK (3<<0)
+-
+-#define S3C2410_IISPSR (0x08)
+-#define S3C2410_IISPSR_INTMASK (31<<5)
+-#define S3C2410_IISPSR_INTSHIFT (5)
+-#define S3C2410_IISPSR_EXTMASK (31<<0)
+-#define S3C2410_IISPSR_EXTSHFIT (0)
+-
+-#define S3C2410_IISFCON (0x0c)
+-
+-#define S3C2410_IISFCON_TXDMA (1<<15)
+-#define S3C2410_IISFCON_RXDMA (1<<14)
+-#define S3C2410_IISFCON_TXENABLE (1<<13)
+-#define S3C2410_IISFCON_RXENABLE (1<<12)
+-#define S3C2410_IISFCON_TXMASK (0x3f << 6)
+-#define S3C2410_IISFCON_TXSHIFT (6)
+-#define S3C2410_IISFCON_RXMASK (0x3f)
+-#define S3C2410_IISFCON_RXSHIFT (0)
+-
+-#define S3C2400_IISFCON_TXDMA (1<<11)
+-#define S3C2400_IISFCON_RXDMA (1<<10)
+-#define S3C2400_IISFCON_TXENABLE (1<<9)
+-#define S3C2400_IISFCON_RXENABLE (1<<8)
+-#define S3C2400_IISFCON_TXMASK (0x07 << 4)
+-#define S3C2400_IISFCON_TXSHIFT (4)
+-#define S3C2400_IISFCON_RXMASK (0x07)
+-#define S3C2400_IISFCON_RXSHIFT (0)
+-
+-#define S3C2410_IISFIFO (0x10)
+-#endif /* __ASM_ARCH_REGS_IIS_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/asm-arm/plat-s3c24xx/regs-s3c2412-iis.h linux-2.6.29-rc3.owrt.om/include/asm-arm/plat-s3c24xx/regs-s3c2412-iis.h
+--- linux-2.6.29-rc3.owrt/include/asm-arm/plat-s3c24xx/regs-s3c2412-iis.h 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/include/asm-arm/plat-s3c24xx/regs-s3c2412-iis.h 1970-01-01 01:00:00.000000000 +0100
+@@ -1,72 +0,0 @@
+-/* linux/include/asm-arm/plat-s3c24xx/regs-s3c2412-iis.h
+- *
+- * Copyright 2007 Simtec Electronics <linux@simtec.co.uk>
+- * http://armlinux.simtec.co.uk/
+- *
+- * 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.
+- *
+- * S3C2412 IIS register definition
+-*/
+-
+-#ifndef __ASM_ARCH_REGS_S3C2412_IIS_H
+-#define __ASM_ARCH_REGS_S3C2412_IIS_H
+-
+-#define S3C2412_IISCON (0x00)
+-#define S3C2412_IISMOD (0x04)
+-#define S3C2412_IISFIC (0x08)
+-#define S3C2412_IISPSR (0x0C)
+-#define S3C2412_IISTXD (0x10)
+-#define S3C2412_IISRXD (0x14)
+-
+-#define S3C2412_IISCON_LRINDEX (1 << 11)
+-#define S3C2412_IISCON_TXFIFO_EMPTY (1 << 10)
+-#define S3C2412_IISCON_RXFIFO_EMPTY (1 << 9)
+-#define S3C2412_IISCON_TXFIFO_FULL (1 << 8)
+-#define S3C2412_IISCON_RXFIFO_FULL (1 << 7)
+-#define S3C2412_IISCON_TXDMA_PAUSE (1 << 6)
+-#define S3C2412_IISCON_RXDMA_PAUSE (1 << 5)
+-#define S3C2412_IISCON_TXCH_PAUSE (1 << 4)
+-#define S3C2412_IISCON_RXCH_PAUSE (1 << 3)
+-#define S3C2412_IISCON_TXDMA_ACTIVE (1 << 2)
+-#define S3C2412_IISCON_RXDMA_ACTIVE (1 << 1)
+-#define S3C2412_IISCON_IIS_ACTIVE (1 << 0)
+-
+-#define S3C2412_IISMOD_MASTER_INTERNAL (0 << 10)
+-#define S3C2412_IISMOD_MASTER_EXTERNAL (1 << 10)
+-#define S3C2412_IISMOD_SLAVE (2 << 10)
+-#define S3C2412_IISMOD_MASTER_MASK (3 << 10)
+-#define S3C2412_IISMOD_MODE_TXONLY (0 << 8)
+-#define S3C2412_IISMOD_MODE_RXONLY (1 << 8)
+-#define S3C2412_IISMOD_MODE_TXRX (2 << 8)
+-#define S3C2412_IISMOD_MODE_MASK (3 << 8)
+-#define S3C2412_IISMOD_LR_LLOW (0 << 7)
+-#define S3C2412_IISMOD_LR_RLOW (1 << 7)
+-#define S3C2412_IISMOD_SDF_IIS (0 << 5)
+-#define S3C2412_IISMOD_SDF_MSB (0 << 5)
+-#define S3C2412_IISMOD_SDF_LSB (0 << 5)
+-#define S3C2412_IISMOD_SDF_MASK (3 << 5)
+-#define S3C2412_IISMOD_RCLK_256FS (0 << 3)
+-#define S3C2412_IISMOD_RCLK_512FS (1 << 3)
+-#define S3C2412_IISMOD_RCLK_384FS (2 << 3)
+-#define S3C2412_IISMOD_RCLK_768FS (3 << 3)
+-#define S3C2412_IISMOD_RCLK_MASK (3 << 3)
+-#define S3C2412_IISMOD_BCLK_32FS (0 << 1)
+-#define S3C2412_IISMOD_BCLK_48FS (1 << 1)
+-#define S3C2412_IISMOD_BCLK_16FS (2 << 1)
+-#define S3C2412_IISMOD_BCLK_24FS (3 << 1)
+-#define S3C2412_IISMOD_BCLK_MASK (3 << 1)
+-#define S3C2412_IISMOD_8BIT (1 << 0)
+-
+-#define S3C2412_IISPSR_PSREN (1 << 15)
+-
+-#define S3C2412_IISFIC_TXFLUSH (1 << 15)
+-#define S3C2412_IISFIC_RXFLUSH (1 << 7)
+-#define S3C2412_IISFIC_TXCOUNT(x) (((x) >> 8) & 0xf)
+-#define S3C2412_IISFIC_RXCOUNT(x) (((x) >> 0) & 0xf)
+-
+-
+-
+-#endif /* __ASM_ARCH_REGS_S3C2412_IIS_H */
+-
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/android_aid.h linux-2.6.29-rc3.owrt.om/include/linux/android_aid.h
+--- linux-2.6.29-rc3.owrt/include/linux/android_aid.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/android_aid.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,25 @@
++/* include/linux/android_aid.h
++ *
++ * Copyright (C) 2008 Google, Inc.
++ *
++ * This software is licensed under the terms of the GNU General Public
++ * License version 2, as published by the Free Software Foundation, and
++ * may be copied, distributed, and modified under those terms.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ */
++
++#ifndef _LINUX_ANDROID_AID_H
++#define _LINUX_ANDROID_AID_H
++
++/* AIDs that the kernel treats differently */
++#define AID_NET_BT_ADMIN 3001
++#define AID_NET_BT 3002
++#define AID_INET 3003
++#define AID_NET_RAW 3004
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/android_alarm.h linux-2.6.29-rc3.owrt.om/include/linux/android_alarm.h
+--- linux-2.6.29-rc3.owrt/include/linux/android_alarm.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/android_alarm.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,62 @@
++/* include/linux/android_alarm.h
++ *
++ * Copyright (C) 2006-2007 Google, Inc.
++ *
++ * This software is licensed under the terms of the GNU General Public
++ * License version 2, as published by the Free Software Foundation, and
++ * may be copied, distributed, and modified under those terms.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ */
++
++#ifndef _LINUX_ANDROID_ALARM_H
++#define _LINUX_ANDROID_ALARM_H
++
++#include <linux/ioctl.h>
++#include <linux/time.h>
++
++enum android_alarm_type {
++ /* return code bit numbers or set alarm arg */
++ ANDROID_ALARM_RTC_WAKEUP,
++ ANDROID_ALARM_RTC,
++ ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP,
++ ANDROID_ALARM_ELAPSED_REALTIME,
++ ANDROID_ALARM_SYSTEMTIME,
++
++ ANDROID_ALARM_TYPE_COUNT,
++
++ /* return code bit numbers */
++ /* ANDROID_ALARM_TIME_CHANGE = 16 */
++};
++
++enum android_alarm_return_flags {
++ ANDROID_ALARM_RTC_WAKEUP_MASK = 1U << ANDROID_ALARM_RTC_WAKEUP,
++ ANDROID_ALARM_RTC_MASK = 1U << ANDROID_ALARM_RTC,
++ ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP_MASK =
++ 1U << ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP,
++ ANDROID_ALARM_ELAPSED_REALTIME_MASK =
++ 1U << ANDROID_ALARM_ELAPSED_REALTIME,
++ ANDROID_ALARM_SYSTEMTIME_MASK = 1U << ANDROID_ALARM_SYSTEMTIME,
++ ANDROID_ALARM_TIME_CHANGE_MASK = 1U << 16
++};
++
++/* Disable alarm */
++#define ANDROID_ALARM_CLEAR(type) _IO('a', 0 | ((type) << 4))
++
++/* Ack last alarm and wait for next */
++#define ANDROID_ALARM_WAIT _IO('a', 1)
++
++#define ALARM_IOW(c, type, size) _IOW('a', (c) | ((type) << 4), size)
++/* Set alarm */
++#define ANDROID_ALARM_SET(type) ALARM_IOW(2, type, struct timespec)
++#define ANDROID_ALARM_SET_AND_WAIT(type) ALARM_IOW(3, type, struct timespec)
++#define ANDROID_ALARM_GET_TIME(type) ALARM_IOW(4, type, struct timespec)
++#define ANDROID_ALARM_SET_RTC _IOW('a', 5, struct timespec)
++#define ANDROID_ALARM_BASE_CMD(cmd) (cmd & ~(_IOC(0, 0, 0xf0, 0)))
++#define ANDROID_ALARM_IOCTL_TO_TYPE(cmd) (_IOC_NR(cmd) >> 4)
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/ashmem.h linux-2.6.29-rc3.owrt.om/include/linux/ashmem.h
+--- linux-2.6.29-rc3.owrt/include/linux/ashmem.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/ashmem.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,48 @@
++/*
++ * include/linux/ashmem.h
++ *
++ * Copyright 2008 Google Inc.
++ * Author: Robert Love
++ *
++ * This file is dual licensed. It may be redistributed and/or modified
++ * under the terms of the Apache 2.0 License OR version 2 of the GNU
++ * General Public License.
++ */
++
++#ifndef _LINUX_ASHMEM_H
++#define _LINUX_ASHMEM_H
++
++#include <linux/limits.h>
++#include <linux/ioctl.h>
++
++#define ASHMEM_NAME_LEN 256
++
++#define ASHMEM_NAME_DEF "dev/ashmem"
++
++/* Return values from ASHMEM_PIN: Was the mapping purged while unpinned? */
++#define ASHMEM_NOT_PURGED 0
++#define ASHMEM_WAS_PURGED 1
++
++/* Return values from ASHMEM_GET_PIN_STATUS: Is the mapping pinned? */
++#define ASHMEM_IS_UNPINNED 0
++#define ASHMEM_IS_PINNED 1
++
++struct ashmem_pin {
++ __u32 offset; /* offset into region, in bytes, page-aligned */
++ __u32 len; /* length forward from offset, in bytes, page-aligned */
++};
++
++#define __ASHMEMIOC 0x77
++
++#define ASHMEM_SET_NAME _IOW(__ASHMEMIOC, 1, char[ASHMEM_NAME_LEN])
++#define ASHMEM_GET_NAME _IOR(__ASHMEMIOC, 2, char[ASHMEM_NAME_LEN])
++#define ASHMEM_SET_SIZE _IOW(__ASHMEMIOC, 3, size_t)
++#define ASHMEM_GET_SIZE _IO(__ASHMEMIOC, 4)
++#define ASHMEM_SET_PROT_MASK _IOW(__ASHMEMIOC, 5, unsigned long)
++#define ASHMEM_GET_PROT_MASK _IO(__ASHMEMIOC, 6)
++#define ASHMEM_PIN _IOW(__ASHMEMIOC, 7, struct ashmem_pin)
++#define ASHMEM_UNPIN _IOW(__ASHMEMIOC, 8, struct ashmem_pin)
++#define ASHMEM_GET_PIN_STATUS _IO(__ASHMEMIOC, 9)
++#define ASHMEM_PURGE_ALL_CACHES _IO(__ASHMEMIOC, 10)
++
++#endif /* _LINUX_ASHMEM_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/bq27000_battery.h linux-2.6.29-rc3.owrt.om/include/linux/bq27000_battery.h
+--- linux-2.6.29-rc3.owrt/include/linux/bq27000_battery.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/bq27000_battery.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,16 @@
++#ifndef __BQ27000_BATTERY_H__
++#define __BQ27000_BATTERY_H__
++
++void bq27000_charging_state_change(struct platform_device *pdev);
++
++struct bq27000_platform_data {
++ const char *name;
++ int rsense_mohms;
++ int (*hdq_read)(int);
++ int (*hdq_write)(int, u8);
++ int (*hdq_initialized)(void);
++ int (*get_charger_online_status)(void);
++ int (*get_charger_active_status)(void);
++};
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/device.h linux-2.6.29-rc3.owrt.om/include/linux/device.h
+--- linux-2.6.29-rc3.owrt/include/linux/device.h 2009-05-10 22:09:07.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/include/linux/device.h 2009-05-10 22:28:00.000000000 +0200
+@@ -48,6 +48,11 @@
+ struct bus_attribute *);
+ extern void bus_remove_file(struct bus_type *, struct bus_attribute *);
+
++extern int __must_check bus_create_device_link(struct bus_type *bus,
++ struct kobject *target,
++ const char *name);
++extern void bus_remove_device_link(struct bus_type *bus, const char *name);
++
+ struct bus_type {
+ const char *name;
+ struct bus_attribute *bus_attrs;
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/earlysuspend.h linux-2.6.29-rc3.owrt.om/include/linux/earlysuspend.h
+--- linux-2.6.29-rc3.owrt/include/linux/earlysuspend.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/earlysuspend.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,56 @@
++/* include/linux/earlysuspend.h
++ *
++ * Copyright (C) 2007-2008 Google, Inc.
++ *
++ * This software is licensed under the terms of the GNU General Public
++ * License version 2, as published by the Free Software Foundation, and
++ * may be copied, distributed, and modified under those terms.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ */
++
++#ifndef _LINUX_EARLYSUSPEND_H
++#define _LINUX_EARLYSUSPEND_H
++
++#ifdef CONFIG_ANDROID_HAS_EARLYSUSPEND
++#include <linux/list.h>
++#endif
++
++/* The early_suspend structure defines suspend and resume hooks to be called
++ * when the user visible sleep state of the system changes, and a level to
++ * control the order. They can be used to turn off the screen and input
++ * devices that are not used for wakeup.
++ * Suspend handlers are called in low to high level order, resume handlers are
++ * called in the opposite order. If, when calling register_early_suspend,
++ * the suspend handlers have already been called without a matching call to the
++ * resume handlers, the suspend handler will be called directly from
++ * register_early_suspend. This direct call can violate the normal level order.
++ */
++enum {
++ EARLY_SUSPEND_LEVEL_BLANK_SCREEN = 50,
++ EARLY_SUSPEND_LEVEL_STOP_DRAWING = 100,
++ EARLY_SUSPEND_LEVEL_DISABLE_FB = 150,
++};
++struct early_suspend {
++#ifdef CONFIG_ANDROID_HAS_EARLYSUSPEND
++ struct list_head link;
++ int level;
++ void (*suspend)(struct early_suspend *h);
++ void (*resume)(struct early_suspend *h);
++#endif
++};
++
++#ifdef CONFIG_ANDROID_HAS_EARLYSUSPEND
++void register_early_suspend(struct early_suspend *handler);
++void unregister_early_suspend(struct early_suspend *handler);
++#else
++#define register_early_suspend(handler) do { } while (0)
++#define unregister_early_suspend(handler) do { } while (0)
++#endif
++
++#endif
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/fb.h linux-2.6.29-rc3.owrt.om/include/linux/fb.h
+--- linux-2.6.29-rc3.owrt/include/linux/fb.h 2009-05-10 22:09:07.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/include/linux/fb.h 2009-05-10 22:28:00.000000000 +0200
+@@ -123,6 +123,7 @@
+ #define FB_ACCEL_TRIDENT_3DIMAGE 51 /* Trident 3DImage */
+ #define FB_ACCEL_TRIDENT_BLADE3D 52 /* Trident Blade3D */
+ #define FB_ACCEL_TRIDENT_BLADEXP 53 /* Trident BladeXP */
++#define FB_ACCEL_GLAMO 50 /* SMedia Glamo */
+ #define FB_ACCEL_NEOMAGIC_NM2070 90 /* NeoMagic NM2070 */
+ #define FB_ACCEL_NEOMAGIC_NM2090 91 /* NeoMagic NM2090 */
+ #define FB_ACCEL_NEOMAGIC_NM2093 92 /* NeoMagic NM2093 */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/glamofb.h linux-2.6.29-rc3.owrt.om/include/linux/glamofb.h
+--- linux-2.6.29-rc3.owrt/include/linux/glamofb.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/glamofb.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,50 @@
++#ifndef _LINUX_GLAMOFB_H
++#define _LINUX_GLAMOFB_H
++
++#include <linux/spi/glamo.h>
++
++struct glamofb_val {
++ unsigned int defval;
++ unsigned int min;
++ unsigned int max;
++};
++
++struct glamo_core;
++
++struct glamofb_platform_data {
++ int width, height;
++ int pixclock;
++ int left_margin, right_margin;
++ int upper_margin, lower_margin;
++ int hsync_len, vsync_len;
++ int fb_mem_size;
++
++ struct glamofb_val xres;
++ struct glamofb_val yres;
++ struct glamofb_val bpp;
++
++ struct glamo_spi_info *spi_info;
++ struct glamo_spigpio_info *spigpio_info;
++ struct glamo_core *glamo;
++
++ struct platform_device *mmc_dev;
++
++ /* glamo mmc platform specific info */
++ int (*glamo_can_set_mci_power)(void);
++
++ /* glamo-mci asking if it should use the slow clock to card */
++ int (*glamo_mci_use_slow)(void);
++ int (*glamo_irq_is_wired)(void);
++ void (*glamo_external_reset)(int);
++};
++
++int glamofb_cmd_mode(struct glamofb_handle *gfb, int on);
++int glamofb_cmd_write(struct glamofb_handle *gfb, u_int16_t val);
++
++#ifdef CONFIG_MFD_GLAMO
++void glamo_lcm_reset(int level);
++#else
++#define glamo_lcm_reset(...) do {} while (0)
++#endif
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/glamo-gpio.h linux-2.6.29-rc3.owrt.om/include/linux/glamo-gpio.h
+--- linux-2.6.29-rc3.owrt/include/linux/glamo-gpio.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/glamo-gpio.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,99 @@
++#ifndef __GLAMO_GPIO_H
++#define __GLAMO_GPIO_H
++
++struct glamo_core;
++
++#define GLAMO_GPIO_BANKA 0x0000
++#define GLAMO_GPIO_BANKB 0x1000
++#define GLAMO_GPIO_BANKC 0x2000
++#define GLAMO_GPIO_BANKD 0x3000
++
++#define GLAMO_GPIONO(bank, pin) ((bank & 0xf000) | ((pin & 0xf) << 8))
++
++#define GLAMO_GPIO_F_IN 0x0010
++#define GLAMO_GPIO_F_OUT 0x0020
++#define GLAMO_GPIO_F_FUNC 0x0030
++
++#define GLAMO_GPIO0 GLAMO_GPIONO(GLAMO_GPIO_BANKA, 0)
++#define GLAMO_GPIO0_INPUT (GLAMO_GPIO0 | GLAMO_GPIO_F_IN)
++#define GLAMO_GPIO0_OUTPUT (GLAMO_GPIO0 | GLAMO_GPIO_F_OUT)
++#define GLAMO_GPIO0_HA20 (GLAMO_GPIO0 | GLAMO_GPIO_F_FUNC)
++
++#define GLAMO_GPIO1 GLAMO_GPIONO(GLAMO_GPIO_BANKA, 1)
++#define GLAMO_GPIO1_INPUT (GLAMO_GPIO1 | GLAMO_GPIO_F_IN)
++#define GLAMO_GPIO1_OUTPUT (GLAMO_GPIO1 | GLAMO_GPIO_F_OUT)
++#define GLAMO_GPIO1_HA21 (GLAMO_GPIO1 | GLAMO_GPIO_F_FUNC)
++
++#define GLAMO_GPIO2 GLAMO_GPIONO(GLAMO_GPIO_BANKA, 2)
++#define GLAMO_GPIO2_INPUT (GLAMO_GPIO2 | GLAMO_GPIO_F_IN)
++#define GLAMO_GPIO2_OUTPUT (GLAMO_GPIO2 | GLAMO_GPIO_F_OUT)
++#define GLAMO_GPIO2_HA22 (GLAMO_GPIO2 | GLAMO_GPIO_F_FUNC)
++
++#define GLAMO_GPIO3 GLAMO_GPIONO(GLAMO_GPIO_BANKA, 3)
++#define GLAMO_GPIO3_INPUT (GLAMO_GPIO3 | GLAMO_GPIO_F_IN)
++#define GLAMO_GPIO3_OUTPUT (GLAMO_GPIO3 | GLAMO_GPIO_F_OUT)
++#define GLAMO_GPIO3_HA23 (GLAMO_GPIO3 | GLAMO_GPIO_F_FUNC)
++
++#define GLAMO_GPIO4 GLAMO_GPIONO(GLAMO_GPIO_BANKB, 0)
++#define GLAMO_GPIO4_INPUT (GLAMO_GPIO4 | GLAMO_GPIO_F_IN)
++#define GLAMO_GPIO4_OUTPUT (GLAMO_GPIO4 | GLAMO_GPIO_F_OUT)
++#define GLAMO_GPIO4_nLCS0 (GLAMO_GPIO4 | GLAMO_GPIO_F_FUNC)
++
++#define GLAMO_GPIO5 GLAMO_GPIONO(GLAMO_GPIO_BANKB, 1)
++#define GLAMO_GPIO5_INPUT (GLAMO_GPIO5 | GLAMO_GPIO_F_IN)
++#define GLAMO_GPIO5_OUTPUT (GLAMO_GPIO5 | GLAMO_GPIO_F_OUT)
++#define GLAMO_GPIO5_nLCS1 (GLAMO_GPIO5 | GLAMO_GPIO_F_FUNC)
++
++#define GLAMO_GPIO6 GLAMO_GPIONO(GLAMO_GPIO_BANKB, 2)
++#define GLAMO_GPIO6_INPUT (GLAMO_GPIO6 | GLAMO_GPIO_F_IN)
++#define GLAMO_GPIO6_OUTPUT (GLAMO_GPIO6 | GLAMO_GPIO_F_OUT)
++#define GLAMO_GPIO6_LDCLK (GLAMO_GPIO6 | GLAMO_GPIO_F_FUNC)
++
++#define GLAMO_GPIO7 GLAMO_GPIONO(GLAMO_GPIO_BANKB, 3)
++#define GLAMO_GPIO7_INPUT (GLAMO_GPIO7 | GLAMO_GPIO_F_IN)
++#define GLAMO_GPIO7_OUTPUT (GLAMO_GPIO7 | GLAMO_GPIO_F_OUT)
++#define GLAMO_GPIO7_nLDE (GLAMO_GPIO7 | GLAMO_GPIO_F_FUNC)
++
++#define GLAMO_GPIO8 GLAMO_GPIONO(GLAMO_GPIO_BANKC, 0)
++#define GLAMO_GPIO8_INPUT (GLAMO_GPIO8 | GLAMO_GPIO_F_IN)
++#define GLAMO_GPIO8_OUTPUT (GLAMO_GPIO8 | GLAMO_GPIO_F_OUT)
++#define GLAMO_GPIO8_LD16 (GLAMO_GPIO8 | GLAMO_GPIO_F_FUNC)
++
++#define GLAMO_GPIO9 GLAMO_GPIONO(GLAMO_GPIO_BANKC, 1)
++#define GLAMO_GPIO9_INPUT (GLAMO_GPIO9 | GLAMO_GPIO_F_IN)
++#define GLAMO_GPIO9_OUTPUT (GLAMO_GPIO9 | GLAMO_GPIO_F_OUT)
++#define GLAMO_GPIO9_LD17 (GLAMO_GPIO9 | GLAMO_GPIO_F_FUNC)
++
++#define GLAMO_GPIO10 GLAMO_GPIONO(GLAMO_GPIO_BANKC, 2)
++#define GLAMO_GPIO10_INPUT (GLAMO_GPIO10 | GLAMO_GPIO_F_IN)
++#define GLAMO_GPIO10_OUTPUT (GLAMO_GPIO10 | GLAMO_GPIO_F_OUT)
++#define GLAMO_GPIO10_LSCK (GLAMO_GPIO10 | GLAMO_GPIO_F_FUNC)
++
++#define GLAMO_GPIO11 GLAMO_GPIONO(GLAMO_GPIO_BANKC, 3)
++#define GLAMO_GPIO11_INPUT (GLAMO_GPIO11 | GLAMO_GPIO_F_IN)
++#define GLAMO_GPIO11_OUTPUT (GLAMO_GPIO11 | GLAMO_GPIO_F_OUT)
++#define GLAMO_GPIO11_LSDA (GLAMO_GPIO11 | GLAMO_GPIO_F_FUNC)
++
++#define GLAMO_GPIO12 GLAMO_GPIONO(GLAMO_GPIO_BANKD, 0)
++#define GLAMO_GPIO12_INPUT (GLAMO_GPIO12 | GLAMO_GPIO_F_IN)
++#define GLAMO_GPIO12_OUTPUT (GLAMO_GPIO12 | GLAMO_GPIO_F_OUT)
++#define GLAMO_GPIO12_LSA0 (GLAMO_GPIO12 | GLAMO_GPIO_F_FUNC)
++
++
++#define REG_OF_GPIO(gpio) (((gpio & 0xf000) >> 12)*2 \
++ + GLAMO_REG_GPIO_GEN1)
++#define NUM_OF_GPIO(gpio) ((gpio & 0x0f00) >> 8)
++#define GPIO_OUT_BIT(gpio) (1 << (NUM_OF_GPIO(gpio) + 0))
++#define OUTPUT_BIT(gpio) (1 << (NUM_OF_GPIO(gpio) + 4))
++#define INPUT_BIT(gpio) (1 << (NUM_OF_GPIO(gpio) + 8))
++#define FUNC_BIT(gpio) (1 << (NUM_OF_GPIO(gpio) + 12))
++
++void glamo_gpio_setpin(struct glamo_core *glamo, unsigned int pin,
++ unsigned int value);
++
++int glamo_gpio_getpin(struct glamo_core *glamo, unsigned int pin);
++
++void glamo_gpio_cfgpin(struct glamo_core *glamo, unsigned int pinfunc);
++
++
++#endif /* _GLAMO_GPIO */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/gta01_battery.h linux-2.6.29-rc3.owrt.om/include/linux/gta01_battery.h
+--- linux-2.6.29-rc3.owrt/include/linux/gta01_battery.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/gta01_battery.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,10 @@
++#ifndef __GTA01_BATTERY_H__
++#define __GTA01_BATTERY_H__
++
++struct gta01_bat_platform_data {
++ int (*get_charging_status)(void);
++ int (*get_voltage)(void);
++ int (*get_current)(void);
++};
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/gta02_hdq.h linux-2.6.29-rc3.owrt.om/include/linux/gta02_hdq.h
+--- linux-2.6.29-rc3.owrt/include/linux/gta02_hdq.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/gta02_hdq.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,18 @@
++#ifndef __GTA02HDQ_H__
++#define __GTA02HDQ_H__
++
++/* platform data */
++
++struct gta02_hdq_platform_data {
++ /*
++ * give an opportunity to use us as parent for
++ * devices that depend on us
++ */
++ void (*attach_child_devices)(struct device *parent_device);
++};
++
++int gta02hdq_read(int address);
++int gta02hdq_write(int address, u8 data);
++int gta02hdq_initialized(void);
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/hdq.h linux-2.6.29-rc3.owrt.om/include/linux/hdq.h
+--- linux-2.6.29-rc3.owrt/include/linux/hdq.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/hdq.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,32 @@
++#ifndef __LINUX_HDQ_H__
++#define __LINUX_HDQ_H__
++
++#include <linux/device.h>
++
++#define HDQ_SAMPLE_PERIOD_US 10
++
++/* platform data */
++
++struct hdq_platform_data {
++ /*
++ * give an opportunity to use us as parent for
++ * devices that depend on us
++ */
++ void (*attach_child_devices)(struct device *parent_device);
++
++ void (*gpio_dir_out)(void);
++ void (*gpio_dir_in)(void);
++ void (*gpio_set)(int);
++ int (*gpio_get)(void);
++
++ int (*enable_fiq)(void);
++ void (*disable_fiq)(void);
++ void (*kick_fiq)(void);
++
++};
++
++int hdq_read(int address);
++int hdq_write(int address, u8 data);
++int hdq_initialized(void);
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/i2c-id.h linux-2.6.29-rc3.owrt.om/include/linux/i2c-id.h
+--- linux-2.6.29-rc3.owrt/include/linux/i2c-id.h 2009-05-10 22:04:47.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/include/linux/i2c-id.h 2009-05-10 22:28:00.000000000 +0200
+@@ -73,6 +73,15 @@
+ #define I2C_DRIVERID_CS5345 96 /* cs5345 audio processor */
+
+ #define I2C_DRIVERID_OV7670 1048 /* Omnivision 7670 camera */
++#define I2C_DRIVERID_PCF50606 1049
++#define I2C_DRIVERID_PCF50633 1051
++#define I2C_DRIVERID_PCA9632 1052
++
++#define I2C_DRIVERID_S5K_3XA 1500 /* Samsung MobileAP I2C adapter */
++#define I2C_DRIVERID_S5K_53BEA 1501 /* Samsung MobileAP I2C adapter */
++#define I2C_DRIVERID_S5K_532 1502 /* Samsung MobileAP I2C adapter */
++#define I2C_DRIVERID_S5K_3BA 1503 /* Samsung MobileAP I2C adapter */
++#define I2C_DRIVERID_S5K_4XA 1504 /* Samsung MobileAP I2C adapter */
+
+ /*
+ * ---- Adapter types ----------------------------------------------------
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/jbt6k74.h linux-2.6.29-rc3.owrt.om/include/linux/jbt6k74.h
+--- linux-2.6.29-rc3.owrt/include/linux/jbt6k74.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/jbt6k74.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,12 @@
++#ifndef __JBT6K74_H__
++#define __JBT6K74_H__
++
++#include <linux/spi/spi.h>
++
++struct jbt6k74_platform_data {
++ void (*reset)(int devindex, int level);
++ void (*resuming)(int devindex); /* called when LCM is resumed */
++ void (*probe_completed)(struct device *dev);
++};
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/kernel.h linux-2.6.29-rc3.owrt.om/include/linux/kernel.h
+--- linux-2.6.29-rc3.owrt/include/linux/kernel.h 2009-05-10 22:09:07.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/include/linux/kernel.h 2009-05-10 22:28:00.000000000 +0200
+@@ -242,6 +242,8 @@
+ extern int printk_ratelimit(void);
+ extern bool printk_timed_ratelimit(unsigned long *caller_jiffies,
+ unsigned int interval_msec);
++extern void (*printk_emergency_debug_spew_init)(void);
++extern void (*printk_emergency_debug_spew_send_string)(const char *);
+ #else
+ static inline int vprintk(const char *s, va_list args)
+ __attribute__ ((format (printf, 1, 0)));
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/kexec.h linux-2.6.29-rc3.owrt.om/include/linux/kexec.h
+--- linux-2.6.29-rc3.owrt/include/linux/kexec.h 2009-05-10 22:04:47.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/include/linux/kexec.h 2009-05-10 22:28:00.000000000 +0200
+@@ -1,7 +1,6 @@
+ #ifndef LINUX_KEXEC_H
+ #define LINUX_KEXEC_H
+
+-#ifdef CONFIG_KEXEC
+ #include <linux/types.h>
+ #include <linux/list.h>
+ #include <linux/linkage.h>
+@@ -11,6 +10,8 @@
+ #include <linux/elf.h>
+ #include <asm/kexec.h>
+
++#ifdef CONFIG_KEXEC
++
+ /* Verify architecture specific macros are defined */
+
+ #ifndef KEXEC_SOURCE_MEMORY_LIMIT
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/l1k002.h linux-2.6.29-rc3.owrt.om/include/linux/l1k002.h
+--- linux-2.6.29-rc3.owrt/include/linux/l1k002.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/l1k002.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,8 @@
++#ifndef __LINUX_L1K002_H_
++#define __LINUX_L1K002_H_
++
++struct l1k002_platform_data {
++ void (*pwr_onoff)(int level);
++};
++
++#endif /* __LINUX_L1K002_H_ */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/lis302dl.h linux-2.6.29-rc3.owrt.om/include/linux/lis302dl.h
+--- linux-2.6.29-rc3.owrt/include/linux/lis302dl.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/lis302dl.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,152 @@
++#ifndef _LINUX_LIS302DL_H
++#define _LINUX_LIS302DL_H
++
++#include <linux/types.h>
++#include <linux/spi/spi.h>
++#include <linux/input.h>
++#include <linux/workqueue.h>
++
++struct lis302dl_info;
++
++struct lis302dl_platform_data {
++ char *name;
++ unsigned long pin_chip_select;
++ unsigned long pin_clk;
++ unsigned long pin_mosi;
++ unsigned long pin_miso;
++ int open_drain;
++ int interrupt;
++ void (*lis302dl_suspend_io)(struct lis302dl_info *, int resuming);
++};
++
++struct lis302dl_info {
++ struct lis302dl_platform_data *pdata;
++ struct device *dev;
++ struct input_dev *input_dev;
++ unsigned int flags;
++ unsigned int threshold;
++ unsigned int duration;
++ u32 overruns;
++ struct {
++ unsigned int threshold; /* mg */
++ unsigned int duration; /* ms */
++ } wakeup;
++
++ struct spi_device *spi;
++ u_int8_t regs[0x40];
++};
++
++enum lis302dl_reg {
++ LIS302DL_REG_WHO_AM_I = 0x0f,
++ LIS302DL_REG_CTRL1 = 0x20,
++ LIS302DL_REG_CTRL2 = 0x21,
++ LIS302DL_REG_CTRL3 = 0x22,
++ LIS302DL_REG_HP_FILTER_RESET = 0x23,
++ LIS302DL_REG_STATUS = 0x27,
++ LIS302DL_REG_OUT_X = 0x29,
++ LIS302DL_REG_OUT_Y = 0x2b,
++ LIS302DL_REG_OUT_Z = 0x2d,
++ LIS302DL_REG_FF_WU_CFG_1 = 0x30,
++ LIS302DL_REG_FF_WU_SRC_1 = 0x31,
++ LIS302DL_REG_FF_WU_THS_1 = 0x32,
++ LIS302DL_REG_FF_WU_DURATION_1 = 0x33,
++ LIS302DL_REG_FF_WU_CFG_2 = 0x34,
++ LIS302DL_REG_FF_WU_SRC_2 = 0x35,
++ LIS302DL_REG_FF_WU_THS_2 = 0x36,
++ LIS302DL_REG_FF_WU_DURATION_2 = 0x37,
++ LIS302DL_REG_CLICK_CFG = 0x38,
++ LIS302DL_REG_CLICK_SRC = 0x39,
++ LIS302DL_REG_CLICK_THSY_X = 0x3b,
++ LIS302DL_REG_CLICK_THSZ = 0x3c,
++ LIS302DL_REG_CLICK_TIME_LIMIT = 0x3d,
++ LIS302DL_REG_CLICK_LATENCY = 0x3e,
++ LIS302DL_REG_CLICK_WINDOW = 0x3f,
++};
++
++enum lis302dl_reg_ctrl1 {
++ LIS302DL_CTRL1_Xen = 0x01,
++ LIS302DL_CTRL1_Yen = 0x02,
++ LIS302DL_CTRL1_Zen = 0x04,
++ LIS302DL_CTRL1_STM = 0x08,
++ LIS302DL_CTRL1_STP = 0x10,
++ LIS302DL_CTRL1_FS = 0x20,
++ LIS302DL_CTRL1_PD = 0x40,
++ LIS302DL_CTRL1_DR = 0x80,
++};
++
++enum lis302dl_reg_ctrl2 {
++ LIS302DL_CTRL2_HPC1 = 0x01,
++ LIS302DL_CTRL2_HPC2 = 0x02,
++ LIS302DL_CTRL2_HPFF1 = 0x04,
++ LIS302DL_CTRL2_HPFF2 = 0x08,
++ LIS302DL_CTRL2_FDS = 0x10,
++ LIS302DL_CTRL2_BOOT = 0x40,
++ LIS302DL_CTRL2_SIM = 0x80,
++};
++enum lis302dl_reg_ctrl3 {
++ LIS302DL_CTRL3_PP_OD = 0x40,
++ LIS302DL_CTRL3_IHL = 0x80,
++};
++
++enum lis302dl_reg_status {
++ LIS302DL_STATUS_XDA = 0x01,
++ LIS302DL_STATUS_YDA = 0x02,
++ LIS302DL_STATUS_ZDA = 0x04,
++ LIS302DL_STATUS_XYZDA = 0x08,
++ LIS302DL_STATUS_XOR = 0x10,
++ LIS302DL_STATUS_YOR = 0x20,
++ LIS302DL_STATUS_ZOR = 0x40,
++ LIS302DL_STATUS_XYZOR = 0x80,
++};
++
++/* Wakeup/freefall interrupt defs */
++enum lis302dl_reg_ffwucfg {
++ LIS302DL_FFWUCFG_XLIE = 0x01,
++ LIS302DL_FFWUCFG_XHIE = 0x02,
++ LIS302DL_FFWUCFG_YLIE = 0x04,
++ LIS302DL_FFWUCFG_YHIE = 0x08,
++ LIS302DL_FFWUCFG_ZLIE = 0x10,
++ LIS302DL_FFWUCFG_ZHIE = 0x20,
++ LIS302DL_FFWUCFG_LIR = 0x40,
++ LIS302DL_FFWUCFG_AOI = 0x80,
++};
++
++enum lis302dl_reg_ffwuths {
++ LIS302DL_FFWUTHS_DCRM = 0x80,
++};
++
++enum lis302dl_reg_ffwusrc {
++ LIS302DL_FFWUSRC_XL = 0x01,
++ LIS302DL_FFWUSRC_XH = 0x02,
++ LIS302DL_FFWUSRC_YL = 0x04,
++ LIS302DL_FFWUSRC_YH = 0x08,
++ LIS302DL_FFWUSRC_ZL = 0x10,
++ LIS302DL_FFWUSRC_ZH = 0x20,
++ LIS302DL_FFWUSRC_IA = 0x40,
++};
++
++enum lis302dl_reg_cloik_src {
++ LIS302DL_CLICKSRC_SINGLE_X = 0x01,
++ LIS302DL_CLICKSRC_DOUBLE_X = 0x02,
++ LIS302DL_CLICKSRC_SINGLE_Y = 0x04,
++ LIS302DL_CLICKSRC_DOUBLE_Y = 0x08,
++ LIS302DL_CLICKSRC_SINGLE_Z = 0x10,
++ LIS302DL_CLICKSRC_DOUBLE_Z = 0x20,
++ LIS302DL_CLICKSRC_IA = 0x40,
++};
++
++#define LIS302DL_WHO_AM_I_MAGIC 0x3b
++
++#define LIS302DL_F_WUP_FF_1 0x0001 /* wake up from free fall */
++#define LIS302DL_F_WUP_FF_2 0x0002
++#define LIS302DL_F_WUP_FF 0x0003
++#define LIS302DL_F_WUP_CLICK 0x0004
++#define LIS302DL_F_POWER 0x0010
++#define LIS302DL_F_FS 0x0020 /* ADC full scale */
++#define LIS302DL_F_INPUT_OPEN 0x0040 /* Set if input device is opened */
++#define LIS302DL_F_IRQ_WAKE 0x0080 /* IRQ is setup in wake mode */
++#define LIS302DL_F_DR 0x0100 /* Data rate, 400Hz/100Hz */
++
++
++#endif /* _LINUX_LIS302DL_H */
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/lp5521.h linux-2.6.29-rc3.owrt.om/include/linux/lp5521.h
+--- linux-2.6.29-rc3.owrt/include/linux/lp5521.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/lp5521.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,75 @@
++#ifndef _LINUX_LP5521_H_
++#define _LINUX_LP5521_H_
++
++#define LP5521_REG_ENABLE 0x00
++#define LP5521_REG_OP_MODE 0x01
++
++#define LP5521_REG_R_PWM 0x02
++#define LP5521_REG_G_PWM 0x03
++#define LP5521_REG_B_PWM 0x04
++
++#define LP5521_REG_R_CUR 0x05
++#define LP5521_REG_G_CUR 0x06
++#define LP5521_REG_B_CUR 0x07
++
++#define LP5521_REG_CONFIG 0x08
++
++#define LP5521_REG_R_PC 0x09
++#define LP5521_REG_G_PC 0x0a
++#define LP5521_REG_B_PC 0x0b
++
++#define LP5521_REG_STATUS 0x0c
++#define LP5521_REG_RESET 0x0d
++#define LP5521_REG_GPO 0x0e
++
++enum {
++ LP5521_NC,
++ LP5521_CONNECTED,
++};
++
++enum {
++ LP5521_BLUE,
++ LP5521_GREEN,
++ LP5521_RED,
++ LP5521_NUM_CH,
++};
++
++enum {
++ LP5521_MODE_DISABLE,
++ LP5521_MODE_LOAD,
++ LP5521_MODE_RUN,
++ LP5521_MODE_DIRECT,
++};
++
++enum CP_MODE {
++ LP5521_CPM_OFF,
++ LP5521_CPM_BY_PASS,
++ LP5521_CPM_1_5X,
++ LP5521_CPM_AUTO,
++};
++
++enum CLK_SRC {
++ LP5521_EXT_CLK,
++ LP5521_INT_CLK,
++ LP5521_AUTO_CLK,
++};
++
++#define LP5521_FEAT_TRIG 0x00000001
++#define LP5521_FEAT_GPO 0x00000002
++
++
++struct lp5521_platform_data {
++ int channels[LP5521_NUM_CH];
++ /* chip enable */
++ void (*ext_enable)(int level);
++};
++
++struct lp5521 {
++ struct device *dev;
++ struct i2c_client *client;
++ struct mutex lock;
++ int irq;
++
++ struct lp5521_platform_data *pdata;
++};
++#endif /* LINUX_LP5521_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/mfd/pcf50606/adc.h linux-2.6.29-rc3.owrt.om/include/linux/mfd/pcf50606/adc.h
+--- linux-2.6.29-rc3.owrt/include/linux/mfd/pcf50606/adc.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/mfd/pcf50606/adc.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,72 @@
++/*
++ * adc.h -- Driver for NXP PCF50606 ADC
++ *
++ * (C) 2006-2008 by Openmoko, Inc.
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++
++#ifndef __LINUX_MFD_PCF50606_ADC_H
++#define __LINUX_MFD_PCF50606_ADC_H
++
++#include <linux/mfd/pcf50633/core.h>
++#include <linux/platform_device.h>
++
++/* ADC Registers */
++#define PCF50606_REG_ADCC1 0x2e
++#define PCF50606_REG_ADCC2 0x2f
++#define PCF50606_REG_ADCS1 0x30
++#define PCF50606_REG_ADCS2 0x31
++#define PCF50606_REG_ADCS3 0x32
++
++#define PCF50606_ADCC1_TSCMODACT 0x01
++#define PCF50606_ADCC1_TSCMODSTB 0x02
++#define PCF50606_ADCC1_TRATSET 0x04
++#define PCF50606_ADCC1_NTCSWAPE 0x08
++#define PCF50606_ADCC1_NTCSWAOFF 0x10
++#define PCF50606_ADCC1_EXTSYNCBREAK 0x20
++ /* reserved */
++#define PCF50606_ADCC1_TSCINT 0x80
++
++#define PCF50606_ADCC2_ADCSTART 0x01
++ /* see enum pcf50606_adcc2_adcmux */
++#define PCF50606_ADCC2_SYNC_NONE 0x00
++#define PCF50606_ADCC2_SYNC_TXON 0x20
++#define PCF50606_ADCC2_SYNC_PWREN1 0x40
++#define PCF50606_ADCC2_SYNC_PWREN2 0x60
++#define PCF50606_ADCC2_RES_10BIT 0x00
++#define PCF50606_ADCC2_RES_8BIT 0x80
++
++#define PCF50606_ADCC2_ADCMUX_MASK (0xf << 1)
++
++#define ADCMUX_SHIFT 1
++#define PCF50606_ADCMUX_BATVOLT_RES (0x0 << ADCMUX_SHIFT)
++#define PCF50606_ADCMUX_BATVOLT_SUBTR (0x1 << ADCMUX_SHIFT)
++#define PCF50606_ADCMUX_ADCIN1_RES (0x2 << ADCMUX_SHIFT)
++#define PCF50606_ADCMUX_ADCIN1_SUBTR (0x3 << ADCMUX_SHIFT)
++#define PCF50606_ADCMUX_BATTEMP (0x4 << ADCMUX_SHIFT)
++#define PCF50606_ADCMUX_ADCIN2 (0x5 << ADCMUX_SHIFT)
++#define PCF50606_ADCMUX_ADCIN3 (0x6 << ADCMUX_SHIFT)
++#define PCF50606_ADCMUX_ADCIN3_RATIO (0x7 << ADCMUX_SHIFT)
++#define PCF50606_ADCMUX_XPOS (0x8 << ADCMUX_SHIFT)
++#define PCF50606_ADCMUX_YPOS (0x9 << ADCMUX_SHIFT)
++#define PCF50606_ADCMUX_P1 (0xa << ADCMUX_SHIFT)
++#define PCF50606_ADCMUX_P2 (0xb << ADCMUX_SHIFT)
++#define PCF50606_ADCMUX_BATVOLT_ADCIN1 (0xc << ADCMUX_SHIFT)
++#define PCF50606_ADCMUX_XY_SEQUENCE (0xe << ADCMUX_SHIFT)
++#define PCF50606_P1_P2_RESISTANCE (0xf << ADCMUX_SHIFT)
++
++#define PCF50606_ADCS2_ADCRDY 0x80
++
++extern int
++pcf50606_adc_async_read(struct pcf50606 *pcf, int mux,
++ void (*callback)(struct pcf50606 *, void *, int),
++ void *callback_param);
++extern int
++pcf50606_adc_sync_read(struct pcf50606 *pcf, int mux);
++
++#endif /* __LINUX_PCF50606_ADC_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/mfd/pcf50606/core.h linux-2.6.29-rc3.owrt.om/include/linux/mfd/pcf50606/core.h
+--- linux-2.6.29-rc3.owrt/include/linux/mfd/pcf50606/core.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/mfd/pcf50606/core.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,170 @@
++/*
++ * core.h -- Core driver for NXP PCF50606
++ *
++ * (C) 2006-2008 by Openmoko, Inc.
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++
++#ifndef __LINUX_MFD_PCF50606_CORE_H
++#define __LINUX_MFD_PCF50606_CORE_H
++
++#include <linux/i2c.h>
++#include <linux/workqueue.h>
++#include <linux/regulator/driver.h>
++#include <linux/regulator/machine.h>
++#include <linux/power_supply.h>
++
++struct pcf50606;
++
++#define PCF50606_NUM_REGULATORS 8
++
++struct pcf50606_platform_data {
++ struct regulator_init_data reg_init_data[PCF50606_NUM_REGULATORS];
++
++ char **batteries;
++ int num_batteries;
++
++ /* Callbacks */
++ void (*probe_done)(struct pcf50606 *);
++ void (*mbc_event_callback)(struct pcf50606 *, int);
++ void (*regulator_registered)(struct pcf50606 *, int);
++ void (*force_shutdown)(struct pcf50606 *);
++
++ u8 resumers[3];
++};
++
++struct pcf50606_subdev_pdata {
++ struct pcf50606 *pcf;
++};
++
++struct pcf50606_irq {
++ void (*handler)(int, void *);
++ void *data;
++};
++
++int pcf50606_register_irq(struct pcf50606 *pcf, int irq,
++ void (*handler) (int, void *), void *data);
++int pcf50606_free_irq(struct pcf50606 *pcf, int irq);
++
++int pcf50606_irq_mask(struct pcf50606 *pcf, int irq);
++int pcf50606_irq_unmask(struct pcf50606 *pcf, int irq);
++int pcf50606_irq_mask_get(struct pcf50606 *pcf, int irq);
++
++int pcf50606_read_block(struct pcf50606 *, u8 reg,
++ int nr_regs, u8 *data);
++int pcf50606_write_block(struct pcf50606 *pcf, u8 reg,
++ int nr_regs, u8 *data);
++u8 pcf50606_reg_read(struct pcf50606 *, u8 reg);
++int pcf50606_reg_write(struct pcf50606 *pcf, u8 reg, u8 val);
++
++int pcf50606_reg_set_bit_mask(struct pcf50606 *pcf, u8 reg, u8 mask, u8 val);
++int pcf50606_reg_clear_bits(struct pcf50606 *pcf, u8 reg, u8 bits);
++
++/* Interrupt registers */
++
++#define PCF50606_REG_INT1 0x02
++#define PCF50606_REG_INT2 0x03
++#define PCF50606_REG_INT3 0x04
++
++#define PCF50606_REG_INT1M 0x05
++#define PCF50606_REG_INT2M 0x06
++#define PCF50606_REG_INT3M 0x07
++
++enum {
++ /* Chip IRQs */
++ PCF50606_IRQ_ONKEYR,
++ PCF50606_IRQ_ONKEYF,
++ PCF50606_IRQ_ONKEY1S,
++ PCF50606_IRQ_EXTONR,
++ PCF50606_IRQ_EXTONF,
++ PCF50606_IRQ_RESERVED_1,
++ PCF50606_IRQ_SECOND,
++ PCF50606_IRQ_ALARM,
++ PCF50606_IRQ_CHGINS,
++ PCF50606_IRQ_CHGRM,
++ PCF50606_IRQ_CHGFOK,
++ PCF50606_IRQ_CHGERR,
++ PCF50606_IRQ_CHGFRDY,
++ PCF50606_IRQ_CHGPROT,
++ PCF50606_IRQ_CHGWD10S,
++ PCF50606_IRQ_CHGWDEXP,
++ PCF50606_IRQ_ADCRDY,
++ PCF50606_IRQ_ACDINS,
++ PCF50606_IRQ_ACDREM,
++ PCF50606_IRQ_TSCPRES,
++ PCF50606_IRQ_RESERVED_2,
++ PCF50606_IRQ_RESERVED_3,
++ PCF50606_IRQ_LOWBAT,
++ PCF50606_IRQ_HIGHTMP,
++
++ /* Always last */
++ PCF50606_NUM_IRQ,
++};
++
++struct pcf50606 {
++ struct device *dev;
++ struct i2c_client *i2c_client;
++
++ struct pcf50606_platform_data *pdata;
++ int irq;
++ struct pcf50606_irq irq_handler[PCF50606_NUM_IRQ];
++ struct work_struct irq_work;
++ struct mutex lock;
++
++ u8 mask_regs[3];
++
++ u8 suspend_irq_masks[3];
++ u8 resume_reason[3];
++ int is_suspended;
++
++ int onkey1s_held;
++
++ struct platform_device *rtc_pdev;
++ struct platform_device *mbc_pdev;
++ struct platform_device *adc_pdev;
++ struct platform_device *input_pdev;
++ struct platform_device *wdt_pdev;
++ struct platform_device *regulator_pdev[PCF50606_NUM_REGULATORS];
++};
++
++enum pcf50606_reg_int1 {
++ PCF50606_INT1_ONKEYR = 0x01, /* ONKEY rising edge */
++ PCF50606_INT1_ONKEYF = 0x02, /* ONKEY falling edge */
++ PCF50606_INT1_ONKEY1S = 0x04, /* OMKEY at least 1sec low */
++ PCF50606_INT1_EXTONR = 0x08, /* EXTON rising edge */
++ PCF50606_INT1_EXTONF = 0x10, /* EXTON falling edge */
++ PCF50606_INT1_SECOND = 0x40, /* RTC periodic second interrupt */
++ PCF50606_INT1_ALARM = 0x80, /* RTC alarm time is reached */
++};
++
++enum pcf50606_reg_int2 {
++ PCF50606_INT2_CHGINS = 0x01, /* Charger inserted */
++ PCF50606_INT2_CHGRM = 0x02, /* Charger removed */
++ PCF50606_INT2_CHGFOK = 0x04, /* Fast charging OK */
++ PCF50606_INT2_CHGERR = 0x08, /* Error in charging mode */
++ PCF50606_INT2_CHGFRDY = 0x10, /* Fast charge completed */
++ PCF50606_INT2_CHGPROT = 0x20, /* Charging protection interrupt */
++ PCF50606_INT2_CHGWD10S = 0x40, /* Charger watchdig expires in 10s */
++ PCF50606_INT2_CHGWDEXP = 0x80, /* Charger watchdog expires */
++};
++
++enum pcf50606_reg_int3 {
++ PCF50606_INT3_ADCRDY = 0x01, /* ADC conversion finished */
++ PCF50606_INT3_ACDINS = 0x02, /* Accessory inserted */
++ PCF50606_INT3_ACDREM = 0x04, /* Accessory removed */
++ PCF50606_INT3_TSCPRES = 0x08, /* Touch screen pressed */
++ PCF50606_INT3_LOWBAT = 0x40, /* Low battery voltage */
++ PCF50606_INT3_HIGHTMP = 0x80, /* High temperature */
++};
++
++/* Misc regs */
++
++#define PCF50606_REG_OOCC1 0x08
++#define PCF50606_OOCC1_GOSTDBY 0x01
++#endif
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/mfd/pcf50606/gpo.h linux-2.6.29-rc3.owrt.om/include/linux/mfd/pcf50606/gpo.h
+--- linux-2.6.29-rc3.owrt/include/linux/mfd/pcf50606/gpo.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/mfd/pcf50606/gpo.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,42 @@
++/*
++ * gpo.h -- GPO driver for NXP PCF50606
++ *
++ * (C) 2006-2008 by Openmoko, Inc.
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++
++#ifndef __LINUX_MFD_PCF50606_GPO_H
++#define __LINUX_MFD_PCF50606_GPO_H
++
++#include <linux/mfd/pcf50633/core.h>
++
++#define PCF50606_REG_GPOC1 0x38
++#define PCF50606_REG_GPOC2 0x39
++#define PCF50606_REG_GPOC3 0x3a
++#define PCF50606_REG_GPOC4 0x3b
++#define PCF50606_REG_GPOC5 0x3c
++
++#define PCF50606_GPO1 PCF50606_REG_GPOC1
++#define PCF50606_GPO2 PCF50606_REG_GPOC1
++#define PCF50606_GPOOD1 PCF50606_REG_GPOC2
++#define PCF50606_GPOOD2 PCF50606_REG_GPOC3
++#define PCF50606_GPOOD3 PCF50606_REG_GPOC4
++#define PCF50606_GPOOD4 PCF50606_REG_GPOC5
++
++#define PCF50606_GPOCFG_GPOSEL_MASK 0x07
++
++void pcf50606_gpo_set_active(struct pcf50606 *pcf, int gpo, int value);
++int pcf50606_gpo_get_active(struct pcf50606 *pcf, int gpo);
++void pcf50606_gpo_set_standby(struct pcf50606 *pcf, int gpo, int value);
++int pcf50606_gpo_get_standby(struct pcf50606 *pcf, int gpo);
++
++void pcf50606_gpo_invert_set(struct pcf50606 *, int gpo, int invert);
++int pcf50606_gpo_invert_get(struct pcf50606 *pcf, int gpo);
++
++#endif /* __LINUX_MFD_PCF50606_GPIO_H */
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/mfd/pcf50606/mbc.h linux-2.6.29-rc3.owrt.om/include/linux/mfd/pcf50606/mbc.h
+--- linux-2.6.29-rc3.owrt/include/linux/mfd/pcf50606/mbc.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/mfd/pcf50606/mbc.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,52 @@
++/*
++ * mbc.h -- Driver for NXP PCF50606 Main Battery Charger
++ *
++ * (C) 2006-2008 by Openmoko, Inc.
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++
++#ifndef __LINUX_MFD_PCF50606_MBC_H
++#define __LINUX_MFD_PCF50606_MBC_H
++
++#include <linux/mfd/pcf50606/core.h>
++#include <linux/platform_device.h>
++
++#define PCF50606_REG_OOCS 0x01
++
++/* Charger OK */
++#define PCF50606_OOCS_CHGOK 0x20
++
++#define PCF50606_REG_MBCC1 0x29
++#define PCF50606_REG_MBCC2 0x2a
++#define PCF50606_REG_MBCC3 0x2b
++#define PCF50606_REG_MBCS1 0x2c
++
++#define PCF50606_MBCC1_CHGAPE 0x01
++#define PCF50606_MBCC1_AUTOFST 0x02
++#define PCF50606_MBCC1_CHGMOD_MASK 0x1c
++#define PCF50606_MBCC1_CHGMOD_QUAL 0x00
++#define PCF50606_MBCC1_CHGMOD_PRE 0x04
++#define PCF50606_MBCC1_CHGMOD_TRICKLE 0x08
++#define PCF50606_MBCC1_CHGMOD_FAST_CCCV 0x0c
++#define PCF50606_MBCC1_CHGMOD_FAST_NOCC 0x10
++#define PCF50606_MBCC1_CHGMOD_FAST_NOCV 0x14
++#define PCF50606_MBCC1_CHGMOD_FAST_SW 0x18
++#define PCF50606_MBCC1_CHGMOD_IDLE 0x1c
++#define PCF50606_MBCC1_DETMOD_LOWCHG 0x20
++#define PCF50606_MBCC1_DETMOD_WDRST 0x40
++
++#define PCF50606_MBCC1_CHGMOD_SHIFT 2
++
++/* Charger status */
++#define PCF50606_MBC_CHARGER_ONLINE 0x01
++#define PCF50606_MBC_CHARGER_ACTIVE 0x02
++
++void pcf50606_charge_fast(struct pcf50606 *pcf, int on);
++
++#endif
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/mfd/pcf50606/pmic.h linux-2.6.29-rc3.owrt.om/include/linux/mfd/pcf50606/pmic.h
+--- linux-2.6.29-rc3.owrt/include/linux/mfd/pcf50606/pmic.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/mfd/pcf50606/pmic.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,73 @@
++#ifndef __LINUX_MFD_PCF50606_PMIC_H
++#define __LINUX_MFD_PCF50606_PMIC_H
++
++#define PCF50606_REG_DCDC1 0x1b
++#define PCF50606_REG_DCDC2 0x1c
++#define PCF50606_REG_DCDC3 0x1d
++#define PCF50606_REG_DCDC4 0x1e
++#define PCF50606_REG_DCDEC1 0x1f
++#define PCF50606_REG_DCDEC2 0x20
++#define PCF50606_REG_DCUDC1 0x21
++#define PCF50606_REG_DCUDC2 0x22
++#define PCF50606_REG_IOREGC 0x23
++#define PCF50606_REG_D1REGC1 0x24
++#define PCF50606_REG_D2REGC1 0x25
++#define PCF50606_REG_D3REGC1 0x26
++#define PCF50606_REG_LPREGC1 0x27
++#define PCF50606_REG_LPREGC2 0x28
++
++/* used by PSSC, PWROKM, PWROKS, */
++enum pcf50606_regu {
++ PCF50606_REGU_DCD = 0x01, /* DCD in phase 2 */
++ PCF50606_REGU_DCDE = 0x02, /* DCDE in phase 2 */
++ PCF50606_REGU_DCUD = 0x04, /* DCDU in phase 2 */
++ PCF50606_REGU_IO = 0x08, /* IO in phase 2 */
++ PCF50606_REGU_D1 = 0x10, /* D1 in phase 2 */
++ PCF50606_REGU_D2 = 0x20, /* D2 in phase 2 */
++ PCF50606_REGU_D3 = 0x40, /* D3 in phase 2 */
++ PCF50606_REGU_LP = 0x80, /* LP in phase 2 */
++};
++
++enum pcf50606_reg_dcdc4 {
++ PCF50606_DCDC4_MODE_AUTO = 0x00,
++ PCF50606_DCDC4_MODE_PWM = 0x01,
++ PCF50606_DCDC4_MODE_PCF = 0x02,
++ PCF50606_DCDC4_OFF_FLOAT = 0x00,
++ PCF50606_DCDC4_OFF_BYPASS = 0x04,
++ PCF50606_DCDC4_OFF_PULLDOWN = 0x08,
++ PCF50606_DCDC4_CURLIM_500mA = 0x00,
++ PCF50606_DCDC4_CURLIM_750mA = 0x10,
++ PCF50606_DCDC4_CURLIM_1000mA = 0x20,
++ PCF50606_DCDC4_CURLIM_1250mA = 0x30,
++ PCF50606_DCDC4_TOGGLE = 0x40,
++ PCF50606_DCDC4_REGSEL_DCDC2 = 0x80,
++};
++
++enum pcf50606_reg_dcdec2 {
++ PCF50606_DCDEC2_MODE_AUTO = 0x00,
++ PCF50606_DCDEC2_MODE_PWM = 0x01,
++ PCF50606_DCDEC2_MODE_PCF = 0x02,
++ PCF50606_DCDEC2_OFF_FLOAT = 0x00,
++ PCF50606_DCDEC2_OFF_BYPASS = 0x04,
++};
++
++enum pcf50606_reg_dcudc2 {
++ PCF50606_DCUDC2_MODE_AUTO = 0x00,
++ PCF50606_DCUDC2_MODE_PWM = 0x01,
++ PCF50606_DCUDC2_MODE_PCF = 0x02,
++ PCF50606_DCUDC2_OFF_FLOAT = 0x00,
++ PCF50606_DCUDC2_OFF_BYPASS = 0x04,
++};
++
++enum pcf50606_regulator_id {
++ PCF50606_REGULATOR_DCD,
++ PCF50606_REGULATOR_DCDE,
++ PCF50606_REGULATOR_DCUD,
++ PCF50606_REGULATOR_D1REG,
++ PCF50606_REGULATOR_D2REG,
++ PCF50606_REGULATOR_D3REG,
++ PCF50606_REGULATOR_LPREG,
++ PCF50606_REGULATOR_IOREG,
++};
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/mfd/pcf50633/core.h linux-2.6.29-rc3.owrt.om/include/linux/mfd/pcf50633/core.h
+--- linux-2.6.29-rc3.owrt/include/linux/mfd/pcf50633/core.h 2009-05-10 22:04:47.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/include/linux/mfd/pcf50633/core.h 2009-05-10 22:28:00.000000000 +0200
+@@ -29,6 +29,10 @@
+ char **batteries;
+ int num_batteries;
+
++ int charging_restart_interval;
++
++ int chg_ref_current_ma;
++
+ /* Callbacks */
+ void (*probe_done)(struct pcf50633 *);
+ void (*mbc_event_callback)(struct pcf50633 *, int);
+@@ -206,7 +210,8 @@
+ };
+
+ /* misc. registers */
+-#define PCF50633_REG_OOCSHDWN 0x0c
++#define PCF50633_REG_OOCSHDWN 0x0c
++#define PCF50633_OOCSHDWN_GOSTDBY 0x01
+
+ /* LED registers */
+ #define PCF50633_REG_LEDOUT 0x28
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/mfd/pcf50633/mbc.h linux-2.6.29-rc3.owrt.om/include/linux/mfd/pcf50633/mbc.h
+--- linux-2.6.29-rc3.owrt/include/linux/mfd/pcf50633/mbc.h 2009-05-10 22:04:47.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/include/linux/mfd/pcf50633/mbc.h 2009-05-10 22:28:00.000000000 +0200
+@@ -128,7 +128,5 @@
+ int pcf50633_mbc_usb_curlim_set(struct pcf50633 *pcf, int ma);
+
+ int pcf50633_mbc_get_status(struct pcf50633 *);
+-void pcf50633_mbc_set_status(struct pcf50633 *, int what, int status);
+-
+ #endif
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/mmc/core.h linux-2.6.29-rc3.owrt.om/include/linux/mmc/core.h
+--- linux-2.6.29-rc3.owrt/include/linux/mmc/core.h 2009-05-10 22:04:47.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/include/linux/mmc/core.h 2009-05-10 22:28:00.000000000 +0200
+@@ -129,6 +129,8 @@
+ struct mmc_host;
+ struct mmc_card;
+
++extern void mmc_flush_scheduled_work(void);
++
+ extern void mmc_wait_for_req(struct mmc_host *, struct mmc_request *);
+ extern int mmc_wait_for_cmd(struct mmc_host *, struct mmc_command *, int);
+ extern int mmc_wait_for_app_cmd(struct mmc_host *, struct mmc_card *,
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/mmc/sdio_ids.h linux-2.6.29-rc3.owrt.om/include/linux/mmc/sdio_ids.h
+--- linux-2.6.29-rc3.owrt/include/linux/mmc/sdio_ids.h 2009-05-10 22:04:47.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/include/linux/mmc/sdio_ids.h 2009-05-10 22:28:00.000000000 +0200
+@@ -25,5 +25,9 @@
+
+ #define SDIO_VENDOR_ID_MARVELL 0x02df
+ #define SDIO_DEVICE_ID_MARVELL_LIBERTAS 0x9103
++#define SDIO_DEVICE_ID_MARVELL_88W8688 0x9104
++#define SDIO_VENDOR_ID_ATHEROS 0x0271
++#define SDIO_DEVICE_ID_ATHEROS_AR6001 0x0100
++#define SDIO_DEVICE_ID_ATHEROS_AR6002 0x0200
+
+ #endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/mm.h linux-2.6.29-rc3.owrt.om/include/linux/mm.h
+--- linux-2.6.29-rc3.owrt/include/linux/mm.h 2009-05-10 22:09:07.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/include/linux/mm.h 2009-05-10 22:28:00.000000000 +0200
+@@ -725,7 +725,7 @@
+ }
+ #endif
+ struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags);
+-
++void shmem_set_file(struct vm_area_struct *, struct file *);
+ int shmem_zero_setup(struct vm_area_struct *);
+
+ #ifndef CONFIG_MMU
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/neo1973_vibrator.h linux-2.6.29-rc3.owrt.om/include/linux/neo1973_vibrator.h
+--- linux-2.6.29-rc3.owrt/include/linux/neo1973_vibrator.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/neo1973_vibrator.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,5 @@
++struct neo1973_vib_platform_data {
++ int (* enable_fiq)(void);
++ void (*disable_fiq)(void);
++ void (*kick_fiq)(void);
++};
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/pcap7200.h linux-2.6.29-rc3.owrt.om/include/linux/pcap7200.h
+--- linux-2.6.29-rc3.owrt/include/linux/pcap7200.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/pcap7200.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,25 @@
++#ifndef _LINUX_PCPA7200_H
++#define _LINUX_PCPA7200_H
++
++enum op_mode {
++ SLEEP,
++ WAKEUP,
++ SINGLE_TOUCH,
++ MULTI_TOUCH,
++};
++
++enum gesture {
++ ZOOM,
++ FST_ZOOM,
++ SND_ZOOM,
++ ROTATE,
++ FST_SLIDE,
++ SND_SLIDE,
++};
++
++struct pcap7200_platform_data {
++ enum op_mode mode;
++ void (*reset)(void);
++};
++
++#endif /* _LINUX_PCPA7200_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/pcf50606.h linux-2.6.29-rc3.owrt.om/include/linux/pcf50606.h
+--- linux-2.6.29-rc3.owrt/include/linux/pcf50606.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/pcf50606.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,91 @@
++#ifndef _LINUX_PCF50606_H
++#define _LINUX_PCF50606_H
++
++#include <linux/pcf506xx.h>
++
++
++/* public in-kernel pcf50606 api */
++enum pcf50606_regulator_id {
++ PCF50606_REGULATOR_DCD,
++ PCF50606_REGULATOR_DCDE,
++ PCF50606_REGULATOR_DCUD,
++ PCF50606_REGULATOR_D1REG,
++ PCF50606_REGULATOR_D2REG,
++ PCF50606_REGULATOR_D3REG,
++ PCF50606_REGULATOR_LPREG,
++ PCF50606_REGULATOR_IOREG,
++ __NUM_PCF50606_REGULATORS
++};
++
++struct pcf50606_data;
++
++/* This is an ugly construct on how to access the (currently single/global)
++ * pcf50606 handle from other code in the kernel. I didn't really come up with
++ * a more decent method of dynamically resolving this */
++extern struct pcf50606_data *pcf50606_global;
++
++extern void
++pcf50606_go_standby(void);
++
++extern void
++pcf50606_gpo0_set(struct pcf50606_data *pcf, int on);
++
++extern int
++pcf50606_gpo0_get(struct pcf50606_data *pcf);
++
++extern int
++pcf50606_voltage_set(struct pcf50606_data *pcf,
++ enum pcf50606_regulator_id reg,
++ unsigned int millivolts);
++extern unsigned int
++pcf50606_voltage_get(struct pcf50606_data *pcf,
++ enum pcf50606_regulator_id reg);
++extern int
++pcf50606_onoff_get(struct pcf50606_data *pcf,
++ enum pcf50606_regulator_id reg);
++
++extern int
++pcf50606_onoff_set(struct pcf50606_data *pcf,
++ enum pcf50606_regulator_id reg, int on);
++
++extern void
++pcf50606_charge_fast(struct pcf50606_data *pcf, int on);
++
++
++#define PCF50606_FEAT_EXTON 0x00000001 /* not yet supported */
++#define PCF50606_FEAT_MBC 0x00000002
++#define PCF50606_FEAT_BBC 0x00000004 /* not yet supported */
++#define PCF50606_FEAT_TSC 0x00000008 /* not yet supported */
++#define PCF50606_FEAT_WDT 0x00000010
++#define PCF50606_FEAT_ACD 0x00000020
++#define PCF50606_FEAT_RTC 0x00000040
++#define PCF50606_FEAT_PWM 0x00000080
++#define PCF50606_FEAT_CHGCUR 0x00000100
++#define PCF50606_FEAT_BATVOLT 0x00000200
++#define PCF50606_FEAT_BATTEMP 0x00000400
++#define PCF50606_FEAT_PWM_BL 0x00000800
++
++struct pcf50606_platform_data {
++ /* general */
++ unsigned int used_features;
++ unsigned int onkey_seconds_required;
++
++ /* voltage regulator related */
++ struct pmu_voltage_rail rails[__NUM_PCF50606_REGULATORS];
++ unsigned int used_regulators;
++
++ /* charger related */
++ unsigned int r_fix_batt;
++ unsigned int r_fix_batt_par;
++ unsigned int r_sense_milli;
++
++ /* backlight related */
++ unsigned int init_brightness;
++
++ struct {
++ u_int8_t mbcc3; /* charger voltage / current */
++ } charger;
++ pmu_cb cb;
++};
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/pcf50633.h linux-2.6.29-rc3.owrt.om/include/linux/pcf50633.h
+--- linux-2.6.29-rc3.owrt/include/linux/pcf50633.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/pcf50633.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,176 @@
++#ifndef _LINUX_PCF50633_H
++#define _LINUX_PCF50633_H
++
++#include <linux/pcf506xx.h>
++#include <linux/regulator/machine.h>
++
++
++/* public in-kernel pcf50633 api */
++enum pcf50633_regulator_id {
++ PCF50633_REGULATOR_AUTO,
++ PCF50633_REGULATOR_DOWN1,
++ PCF50633_REGULATOR_DOWN2,
++ PCF50633_REGULATOR_MEMLDO,
++ PCF50633_REGULATOR_LDO1,
++ PCF50633_REGULATOR_LDO2,
++ PCF50633_REGULATOR_LDO3,
++ PCF50633_REGULATOR_LDO4,
++ PCF50633_REGULATOR_LDO5,
++ PCF50633_REGULATOR_LDO6,
++ PCF50633_REGULATOR_HCLDO,
++ __NUM_PCF50633_REGULATORS
++};
++
++enum pcf50633_reg_int1 {
++ PCF50633_INT1_ADPINS = 0x01, /* Adapter inserted */
++ PCF50633_INT1_ADPREM = 0x02, /* Adapter removed */
++ PCF50633_INT1_USBINS = 0x04, /* USB inserted */
++ PCF50633_INT1_USBREM = 0x08, /* USB removed */
++ /* reserved */
++ PCF50633_INT1_ALARM = 0x40, /* RTC alarm time is reached */
++ PCF50633_INT1_SECOND = 0x80, /* RTC periodic second interrupt */
++};
++
++enum pcf50633_reg_int2 {
++ PCF50633_INT2_ONKEYR = 0x01, /* ONKEY rising edge */
++ PCF50633_INT2_ONKEYF = 0x02, /* ONKEY falling edge */
++ PCF50633_INT2_EXTON1R = 0x04, /* EXTON1 rising edge */
++ PCF50633_INT2_EXTON1F = 0x08, /* EXTON1 falling edge */
++ PCF50633_INT2_EXTON2R = 0x10, /* EXTON2 rising edge */
++ PCF50633_INT2_EXTON2F = 0x20, /* EXTON2 falling edge */
++ PCF50633_INT2_EXTON3R = 0x40, /* EXTON3 rising edge */
++ PCF50633_INT2_EXTON3F = 0x80, /* EXTON3 falling edge */
++};
++
++enum pcf50633_reg_int3 {
++ PCF50633_INT3_BATFULL = 0x01, /* Battery full */
++ PCF50633_INT3_CHGHALT = 0x02, /* Charger halt */
++ PCF50633_INT3_THLIMON = 0x04,
++ PCF50633_INT3_THLIMOFF = 0x08,
++ PCF50633_INT3_USBLIMON = 0x10,
++ PCF50633_INT3_USBLIMOFF = 0x20,
++ PCF50633_INT3_ADCRDY = 0x40, /* ADC conversion finished */
++ PCF50633_INT3_ONKEY1S = 0x80, /* ONKEY pressed 1 second */
++};
++
++enum pcf50633_reg_int4 {
++ PCF50633_INT4_LOWSYS = 0x01,
++ PCF50633_INT4_LOWBAT = 0x02,
++ PCF50633_INT4_HIGHTMP = 0x04,
++ PCF50633_INT4_AUTOPWRFAIL = 0x08,
++ PCF50633_INT4_DWN1PWRFAIL = 0x10,
++ PCF50633_INT4_DWN2PWRFAIL = 0x20,
++ PCF50633_INT4_LEDPWRFAIL = 0x40,
++ PCF50633_INT4_LEDOVP = 0x80,
++};
++
++enum pcf50633_reg_int5 {
++ PCF50633_INT5_LDO1PWRFAIL = 0x01,
++ PCF50633_INT5_LDO2PWRFAIL = 0x02,
++ PCF50633_INT5_LDO3PWRFAIL = 0x04,
++ PCF50633_INT5_LDO4PWRFAIL = 0x08,
++ PCF50633_INT5_LDO5PWRFAIL = 0x10,
++ PCF50633_INT5_LDO6PWRFAIL = 0x20,
++ PCF50633_INT5_HCLDOPWRFAIL = 0x40,
++ PCF50633_INT5_HCLDOOVL = 0x80,
++};
++
++struct pcf50633_data;
++extern struct pcf50633_data *pcf50633_global;
++
++extern void
++pcf50633_go_standby(void);
++
++enum pcf50633_gpio {
++ PCF50633_GPIO1 = 1,
++ PCF50633_GPIO2 = 2,
++ PCF50633_GPIO3 = 3,
++ PCF50633_GPO = 4,
++};
++
++extern void
++pcf50633_gpio_set(struct pcf50633_data *pcf, enum pcf50633_gpio gpio, int on);
++
++extern int
++pcf50633_gpio_get(struct pcf50633_data *pcf, enum pcf50633_gpio gpio);
++
++extern int
++pcf50633_voltage_set(struct pcf50633_data *pcf,
++ enum pcf50633_regulator_id reg,
++ unsigned int millivolts);
++extern unsigned int
++pcf50633_voltage_get(struct pcf50633_data *pcf,
++ enum pcf50633_regulator_id reg);
++
++extern int
++pcf50633_onoff_get(struct pcf50633_data *pcf,
++ enum pcf50633_regulator_id reg);
++
++extern int
++pcf50633_onoff_set(struct pcf50633_data *pcf,
++ enum pcf50633_regulator_id reg, int on);
++
++extern void
++pcf50633_backlight_resume(struct pcf50633_data *pcf);
++
++extern u_int16_t
++pcf50633_battvolt(struct pcf50633_data *pcf);
++
++extern int
++pcf50633_report_resumers(struct pcf50633_data *pcf, char *buf);
++
++extern int
++pcf50633_notify_usb_current_limit_change(struct pcf50633_data *pcf,
++ unsigned int ma);
++extern int
++pcf50633_wait_for_ready(struct pcf50633_data *pcf, int timeout_ms,
++ char *name);
++
++/* 0 = initialized and resumed and ready to roll, !=0 = either not
++ * initialized or not resumed yet
++ */
++extern int
++pcf50633_ready(struct pcf50633_data *pcf);
++
++#define PCF50633_FEAT_EXTON 0x00000001 /* not yet supported */
++#define PCF50633_FEAT_MBC 0x00000002
++#define PCF50633_FEAT_BBC 0x00000004 /* not yet supported */
++#define PCF50633_FEAT_RTC 0x00000040
++#define PCF50633_FEAT_CHGCUR 0x00000100
++#define PCF50633_FEAT_BATVOLT 0x00000200
++#define PCF50633_FEAT_BATTEMP 0x00000400
++#define PCF50633_FEAT_PWM_BL 0x00000800
++
++struct pcf50633_platform_data {
++ /* general */
++ unsigned int used_features;
++ unsigned int onkey_seconds_sig_init;
++ unsigned int onkey_seconds_shutdown;
++
++ /* callback to attach platform children (to enforce suspend / resume
++ * ordering */
++ void (*attach_child_devices)(struct device *parent_device);
++
++ /* voltage regulator related */
++ struct pmu_voltage_rail rails[__NUM_PCF50633_REGULATORS];
++ unsigned int used_regulators;
++
++ /* charger related */
++ unsigned int r_fix_batt;
++ unsigned int r_fix_batt_par;
++ unsigned int r_sense_milli;
++ int flag_use_apm_emulation;
++
++ unsigned char resumers[5];
++
++ struct {
++ u_int8_t mbcc3; /* charger voltage / current */
++ } charger;
++ pmu_cb cb;
++
++ /* post-resume backlight bringup */
++ int defer_resume_backlight;
++ u8 resume_backlight_ramp_speed;
++};
++
++#endif /* _PCF50633_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/pcf506xx.h linux-2.6.29-rc3.owrt.om/include/linux/pcf506xx.h
+--- linux-2.6.29-rc3.owrt/include/linux/pcf506xx.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/pcf506xx.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,34 @@
++#ifndef _LINUX_PCF506XX_H
++#define _LINUX_PCF506XX_H
++
++
++#define PMU_VRAIL_F_SUSPEND_ON 0x00000001 /* Remains on during suspend */
++#define PMU_VRAIL_F_UNUSED 0x00000002 /* This rail is not used */
++struct pmu_voltage_rail {
++ char *name;
++ unsigned int flags;
++ struct {
++ unsigned int init;
++ unsigned int max;
++ } voltage;
++};
++
++enum pmu_event {
++ PMU_EVT_NONE,
++ PMU_EVT_INSERT,
++ PMU_EVT_REMOVE,
++#ifdef CONFIG_SENSORS_PCF50633
++ PMU_EVT_USB_INSERT,
++ PMU_EVT_USB_REMOVE,
++#endif
++ PMU_EVT_CHARGER_ACTIVE,
++ PMU_EVT_CHARGER_IDLE,
++ PMU_EVT_CHARGER_CHANGE,
++ __NUM_PMU_EVTS
++};
++
++typedef int (*pmu_cb)(struct device *dev, unsigned int feature,
++ enum pmu_event event);
++
++
++#endif /* !_LINUX_PCF506XX_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/resume-dependency.h linux-2.6.29-rc3.owrt.om/include/linux/resume-dependency.h
+--- linux-2.6.29-rc3.owrt/include/linux/resume-dependency.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/resume-dependency.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,114 @@
++#ifndef __RESUME_DEPENDENCY_H__
++#define __RESUME_DEPENDENCY_H__
++
++/* Resume dependency framework
++ *
++ * (C) 2008 Openmoko, Inc.
++ * Author: Andy Green <andy@openmoko.com>
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; version 2.1.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ *
++ */
++
++#include <linux/list.h>
++
++struct resume_dependency {
++ struct list_head list;
++
++ void (*callback)(void *); /* called with context as arg */
++ void * context;
++ int called_flag; /* set to 1 after called, use for multi dep */
++};
++
++/* if you are a driver accept to have other drivers as dependencies, you need to
++ * instantiate a struct resume_dependency above, then initialize it by invoking
++ * init_resume_dependency_list() on it
++ */
++
++#define init_resume_dependency_list(_head) \
++ printk(KERN_INFO "##### init_resume_dependency_list(head=%p)\n", (_head)); \
++ INIT_LIST_HEAD(&(_head)->list);
++
++
++/* if your resume function depends on something else being resumed first, you
++ * can register the dependency by calling this in your suspend function with
++ * head being the list held by the thing you are dependent on, and dep being
++ * your struct resume_dependency
++ */
++
++#define register_resume_dependency(_head, _dep) { \
++ struct list_head *_pos, *_q; \
++ struct resume_dependency *_d; \
++\
++ printk(KERN_ERR "##### register_resume_dependency(head=%p, dep=%p)\n", (_head), (_dep)); \
++ (_dep)->called_flag = 1; \
++ list_for_each_safe(_pos, _q, &((_head)->list)) { \
++ _d = list_entry(_pos, struct resume_dependency, list); \
++ if (_d == (_dep)) { \
++ list_del(_pos); \
++ printk(KERN_ERR "##### duplicate dependency removed first\n"); \
++ } \
++ } \
++ list_add(&(_dep)->list, &(_head)->list); \
++}
++
++/* In the resume function that things can be dependent on, at the end you
++ * invoke this macro. This calls back the dependent resumes now it is safe to
++ * use the resumed thing they were dependent on.
++ */
++
++#define callback_all_resume_dependencies(_head) { \
++ struct list_head *_pos, *_q; \
++ struct resume_dependency *_dep; \
++\
++ printk(KERN_ERR "##### callback_all_resume_dependencies(head=%p)\n", (_head)); \
++ list_for_each_safe(_pos, _q, &((_head)->list)) { \
++ _dep = list_entry(_pos, struct resume_dependency, list); \
++ printk(KERN_ERR "##### callback list entry (head=%p, dep=%p)\n", (_head), (_dep)); \
++ _dep->called_flag = 1; \
++ printk(KERN_ERR "##### callback=%p(context=%p))\n", (_dep->callback),(_dep->context)); \
++ (_dep->callback)(_dep->context); \
++ list_del(_pos); \
++ } \
++}
++
++/* When a dependency is added, it is not actually active; the dependent resume
++ * handler will function as normal. The dependency is activated by the suspend
++ * handler for the driver that will be doing the callbacks. This ensures that
++ * if the suspend is aborted for any reason (error, driver busy, etc), that all
++ * suspended drivers will resume, even if the driver upon which they are dependent
++ * did not suspend, and hence will not resume, and thus would be unable to perform
++ * the callbacks.
++ */
++
++#define activate_all_resume_dependencies(_head) { \
++ struct list_head *_pos, *_q; \
++ struct resume_dependency *_dep; \
++\
++ printk(KERN_ERR "##### activate_all_resume_dependencies(head=%p)\n", (_head)); \
++ list_for_each_safe(_pos, _q, &((_head)->list)) { \
++ _dep = list_entry(_pos, struct resume_dependency, list); \
++ printk(KERN_ERR "##### activating callback list entry (head=%p, dep=%p)\n", (_head), (_dep)); \
++ _dep->called_flag = 0; \
++ } \
++}
++
++/* if your resume action is dependent on multiple drivers being resumed already,
++ * register the same callback with each driver you are dependent on, and check
++ * .called_flag for all of the struct resume_dependency. When they are all 1
++ * you know it is the last callback and you can resume, otherwise just return
++ */
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/rtc/pcf50633.h linux-2.6.29-rc3.owrt.om/include/linux/rtc/pcf50633.h
+--- linux-2.6.29-rc3.owrt/include/linux/rtc/pcf50633.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/rtc/pcf50633.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,9 @@
++enum pcf50633_rtc_event {
++ PCF50633_RTC_EVENT_ALARM,
++ PCF50633_RTC_EVENT_SECOND,
++};
++
++extern void pcf50633_rtc_handle_event(struct pcf50633_data *pcf,
++ enum pcf50633_rtc_event evt);
++
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/spi/glamo.h linux-2.6.29-rc3.owrt.om/include/linux/spi/glamo.h
+--- linux-2.6.29-rc3.owrt/include/linux/spi/glamo.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/spi/glamo.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,27 @@
++#ifndef __GLAMO_SPI_H
++#define __GLAMO_SPI_H
++
++#include <linux/glamo-gpio.h>
++
++struct spi_board_info;
++struct glamofb_handle;
++struct glamo_core;
++
++struct glamo_spi_info {
++ unsigned long board_size;
++ struct spi_board_info *board_info;
++ struct glamofb_handle *glamofb_handle;
++};
++
++struct glamo_spigpio_info {
++ unsigned int pin_clk;
++ unsigned int pin_mosi;
++ unsigned int pin_miso;
++ unsigned int pin_cs;
++ int bus_num;
++
++ struct glamo_core *glamo;
++};
++
++
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/spi/spi_bitbang.h linux-2.6.29-rc3.owrt.om/include/linux/spi/spi_bitbang.h
+--- linux-2.6.29-rc3.owrt/include/linux/spi/spi_bitbang.h 2009-05-10 22:09:08.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/include/linux/spi/spi_bitbang.h 2009-05-10 22:28:00.000000000 +0200
+@@ -31,6 +31,9 @@
+ u8 use_dma;
+ u8 flags; /* extra spi->mode support */
+
++ /* Support for synchronous non blocking transfers */
++ int non_blocking_transfer;
++
+ struct spi_master *master;
+
+ /* setup_transfer() changes clock and/or wordsize to match settings
+@@ -62,6 +65,8 @@
+ extern int spi_bitbang_transfer(struct spi_device *spi, struct spi_message *m);
+ extern int spi_bitbang_setup_transfer(struct spi_device *spi,
+ struct spi_transfer *t);
++extern int spi_bitbang_transfer_sync(struct spi_device *spi,
++ struct spi_message *m);
+
+ /* start or stop queue processing */
+ extern int spi_bitbang_start(struct spi_bitbang *spi);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/spi/spi.h linux-2.6.29-rc3.owrt.om/include/linux/spi/spi.h
+--- linux-2.6.29-rc3.owrt/include/linux/spi/spi.h 2009-05-10 22:04:47.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/include/linux/spi/spi.h 2009-05-10 22:28:00.000000000 +0200
+@@ -264,6 +264,13 @@
+ int (*transfer)(struct spi_device *spi,
+ struct spi_message *mesg);
+
++ /*
++ * Synchronous non blocking transfer function. Should guarantee
++ * data availability when it returns
++ */
++ int (*transfer_sync)(struct spi_device *spi,
++ struct spi_message *mesg);
++
+ /* called on release() to free memory provided by spi_master */
+ void (*cleanup)(struct spi_device *spi);
+ };
+@@ -573,6 +580,29 @@
+ return spi->master->transfer(spi, message);
+ }
+
++/**
++ * spi_non_blocking_transfer - Synchronous, non blocking transfer
++ * @spi: device with which data will be exchanged
++ * @message: describes the data transfers with optional completion handlers
++ * Context: any (irqs may be blocked, etc)
++ *
++ * Data is guaranteed to be written or read when this function returns.
++ *
++ * Note : This may not be supported by all spi masters.
++ */
++
++static inline int
++spi_non_blocking_transfer(struct spi_device *spi, struct spi_message *message)
++{
++ if (unlikely(!spi->master->transfer_sync)) {
++ dev_err(&spi->master->dev,
++ "non-blocking transfers not supported\n");
++ return -EIO;
++ }
++
++ return spi->master->transfer_sync(spi, message);
++}
++
+ /*---------------------------------------------------------------------------*/
+
+ /* All these synchronous SPI transfer routines are utilities layered
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/suspend.h linux-2.6.29-rc3.owrt.om/include/linux/suspend.h
+--- linux-2.6.29-rc3.owrt/include/linux/suspend.h 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/include/linux/suspend.h 2009-05-10 22:28:00.000000000 +0200
+@@ -146,6 +146,12 @@
+ struct pbe *next;
+ };
+
++/**
++ * global indication we are somewhere between start of suspend and end of
++ * resume, nonzero is true
++ */
++extern int global_inside_suspend;
++
+ /* mm/page_alloc.c */
+ extern void mark_free_pages(struct zone *zone);
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/vt.h linux-2.6.29-rc3.owrt.om/include/linux/vt.h
+--- linux-2.6.29-rc3.owrt/include/linux/vt.h 2009-05-10 22:04:47.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/include/linux/vt.h 2009-05-10 22:28:00.000000000 +0200
+@@ -18,8 +18,19 @@
+ * resizing).
+ */
+ #define MIN_NR_CONSOLES 1 /* must be at least 1 */
++#if (CONFIG_NR_TTY_DEVICES < 4)
++/* Lower Limit */
++#define MAX_NR_CONSOLES 4 /* serial lines start at 64 */
++#define MAX_NR_USER_CONSOLES 4 /* must be root to allocate above this */
++#elif (CONFIG_NR_TTY_DEVICES > 63)
++/* Upper Limit */
+ #define MAX_NR_CONSOLES 63 /* serial lines start at 64 */
+ #define MAX_NR_USER_CONSOLES 63 /* must be root to allocate above this */
++#else
++/* They chose a sensible number */
++#define MAX_NR_CONSOLES CONFIG_NR_TTY_DEVICES
++#define MAX_NR_USER_CONSOLES CONFIG_NR_TTY_DEVICES
++#endif
+ /* Note: the ioctl VT_GETSTATE does not work for
+ consoles 16 and higher (since it returns a short) */
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/linux/wakelock.h linux-2.6.29-rc3.owrt.om/include/linux/wakelock.h
+--- linux-2.6.29-rc3.owrt/include/linux/wakelock.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/include/linux/wakelock.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,91 @@
++/* include/linux/wakelock.h
++ *
++ * Copyright (C) 2007-2008 Google, Inc.
++ *
++ * This software is licensed under the terms of the GNU General Public
++ * License version 2, as published by the Free Software Foundation, and
++ * may be copied, distributed, and modified under those terms.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ */
++
++#ifndef _LINUX_WAKELOCK_H
++#define _LINUX_WAKELOCK_H
++
++#include <linux/list.h>
++#include <linux/ktime.h>
++
++/* A wake_lock prevents the system from entering suspend or other low power
++ * states when active. If the type is set to WAKE_LOCK_SUSPEND, the wake_lock
++ * prevents a full system suspend. If the type is WAKE_LOCK_IDLE, low power
++ * states that cause large interrupt latencies or that disable a set of
++ * interrupts will not entered from idle until the wake_locks are released.
++ */
++
++enum {
++ WAKE_LOCK_SUSPEND, /* Prevent suspend */
++ WAKE_LOCK_IDLE, /* Prevent low power idle */
++ WAKE_LOCK_TYPE_COUNT
++};
++
++struct wake_lock {
++#ifdef CONFIG_ANDROID_HAS_WAKELOCK
++ struct list_head link;
++ int flags;
++ const char *name;
++ unsigned long expires;
++#ifdef CONFIG_ANDROID_WAKELOCK_STAT
++ struct {
++ int count;
++ int expire_count;
++ int wakeup_count;
++ ktime_t total_time;
++ ktime_t prevent_suspend_time;
++ ktime_t max_time;
++ ktime_t last_time;
++ } stat;
++#endif
++#endif
++};
++
++#ifdef CONFIG_ANDROID_HAS_WAKELOCK
++
++void wake_lock_init(struct wake_lock *lock, int type, const char *name);
++void wake_lock_destroy(struct wake_lock *lock);
++void wake_lock(struct wake_lock *lock);
++void wake_lock_timeout(struct wake_lock *lock, long timeout);
++void wake_unlock(struct wake_lock *lock);
++
++/* wake_lock_active returns a non-zero value if the wake_lock is currently
++ * locked. If the wake_lock has a timeout, it does not check the timeout
++ * but if the timeout had aready been checked it will return 0.
++ */
++int wake_lock_active(struct wake_lock *lock);
++
++/* has_wake_lock returns 0 if no wake locks of the specified type are active,
++ * and non-zero if one or more wake locks are held. Specifically it returns
++ * -1 if one or more wake locks with no timeout are active or the
++ * number of jiffies until all active wake locks time out.
++ */
++long has_wake_lock(int type);
++
++#else
++
++static inline void wake_lock_init(struct wake_lock *lock, int type,
++ const char *name) {}
++static inline void wake_lock_destroy(struct wake_lock *lock) {}
++static inline void wake_lock(struct wake_lock *lock) {}
++static inline void wake_lock_timeout(struct wake_lock *lock, long timeout) {}
++static inline void wake_unlock(struct wake_lock *lock) {}
++
++static inline int wake_lock_active(struct wake_lock *lock) { return 0; }
++static inline long has_wake_lock(int type) { return 0; }
++
++#endif
++
++#endif
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/include/sound/soc-dapm.h linux-2.6.29-rc3.owrt.om/include/sound/soc-dapm.h
+--- linux-2.6.29-rc3.owrt/include/sound/soc-dapm.h 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/include/sound/soc-dapm.h 2009-05-10 22:28:00.000000000 +0200
+@@ -182,6 +182,15 @@
+ .get = snd_soc_dapm_get_value_enum_double, \
+ .put = snd_soc_dapm_put_value_enum_double, \
+ .private_value = (unsigned long)&xenum }
++/* NOTE: Openmoko-specific "DAPM " prefix added to controls for
++ * backwards compatibility.
++ */
++#define SOC_DAPM_PIN_SWITCH(xname) \
++{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "DAPM " xname " Switch", \
++ .info = snd_soc_dapm_info_pin_switch, \
++ .get = snd_soc_dapm_get_pin_switch, \
++ .put = snd_soc_dapm_put_pin_switch, \
++ .private_value = (unsigned long)xname }
+
+ /* dapm stream operations */
+ #define SND_SOC_DAPM_STREAM_NOP 0x0
+@@ -228,6 +237,12 @@
+ struct snd_ctl_elem_value *ucontrol);
+ int snd_soc_dapm_put_value_enum_double(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol);
++int snd_soc_dapm_info_pin_switch(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_info *uinfo);
++int snd_soc_dapm_get_pin_switch(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *uncontrol);
++int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *uncontrol);
+ int snd_soc_dapm_new_control(struct snd_soc_codec *codec,
+ const struct snd_soc_dapm_widget *widget);
+ int snd_soc_dapm_new_controls(struct snd_soc_codec *codec,
+@@ -250,12 +265,19 @@
+ int snd_soc_dapm_sys_add(struct device *dev);
+
+ /* dapm audio pin control and status */
+-int snd_soc_dapm_enable_pin(struct snd_soc_codec *codec, char *pin);
+-int snd_soc_dapm_disable_pin(struct snd_soc_codec *codec, char *pin);
+-int snd_soc_dapm_nc_pin(struct snd_soc_codec *codec, char *pin);
+-int snd_soc_dapm_get_pin_status(struct snd_soc_codec *codec, char *pin);
++int snd_soc_dapm_enable_pin(struct snd_soc_codec *codec, const char *pin);
++int snd_soc_dapm_disable_pin(struct snd_soc_codec *codec, const char *pin);
++int snd_soc_dapm_nc_pin(struct snd_soc_codec *codec, const char *pin);
++int snd_soc_dapm_get_pin_status(struct snd_soc_codec *codec, const char *pin);
+ int snd_soc_dapm_sync(struct snd_soc_codec *codec);
+
++/* dapm audio endpoint control */
++int snd_soc_dapm_set_endpoint(struct snd_soc_codec *codec,
++ char *pin, int status);
++int snd_soc_dapm_get_endpoint(struct snd_soc_codec *codec,
++ char *pin);
++int snd_soc_dapm_sync_endpoints(struct snd_soc_codec *codec);
++
+ /* dapm widget types */
+ enum snd_soc_dapm_type {
+ snd_soc_dapm_input = 0, /* input pin */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/init/Kconfig linux-2.6.29-rc3.owrt.om/init/Kconfig
+--- linux-2.6.29-rc3.owrt/init/Kconfig 2009-05-10 22:09:09.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/init/Kconfig 2009-05-10 22:28:00.000000000 +0200
+@@ -869,6 +869,15 @@
+ by some high performance threaded applications. Disabling
+ this option saves about 7k.
+
++config ASHMEM
++ bool "Enable Android's Shared Memory Subsystem"
++ default n
++ depends on SHMEM || TINY_SHMEM
++ help
++ The ashmem subsystem is a new shared memory allocator, similar to
++ POSIX SHM but with different behavior and sporting a simpler
++ file-based API.
++
+ config VM_EVENT_COUNTERS
+ default y
+ bool "Enable VM event counters for /proc/vmstat" if EMBEDDED
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/kernel/irq/chip.c linux-2.6.29-rc3.owrt.om/kernel/irq/chip.c
+--- linux-2.6.29-rc3.owrt/kernel/irq/chip.c 2009-05-10 22:09:09.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/kernel/irq/chip.c 2009-05-10 22:28:00.000000000 +0200
+@@ -383,6 +383,7 @@
+ out_unlock:
+ spin_unlock(&desc->lock);
+ }
++EXPORT_SYMBOL(handle_level_irq);
+
+ /**
+ * handle_fasteoi_irq - irq handler for transparent controllers
+@@ -593,6 +594,7 @@
+ }
+ spin_unlock_irqrestore(&desc->lock, flags);
+ }
++EXPORT_SYMBOL(__set_irq_handler);
+
+ void
+ set_irq_chip_and_handler(unsigned int irq, struct irq_chip *chip,
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/kernel/power/main.c linux-2.6.29-rc3.owrt.om/kernel/power/main.c
+--- linux-2.6.29-rc3.owrt/kernel/power/main.c 2009-05-10 22:09:09.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/kernel/power/main.c 2009-05-10 22:28:00.000000000 +0200
+@@ -131,6 +131,9 @@
+
+ #endif /* CONFIG_PM_SLEEP */
+
++int global_inside_suspend;
++EXPORT_SYMBOL(global_inside_suspend);
++
+ #ifdef CONFIG_SUSPEND
+
+ #ifdef CONFIG_PM_TEST_SUSPEND
+@@ -321,6 +324,8 @@
+ if (!suspend_ops)
+ return -ENOSYS;
+
++ global_inside_suspend = 1;
++
+ if (suspend_ops->begin) {
+ error = suspend_ops->begin(state);
+ if (error)
+@@ -362,6 +367,8 @@
+ Close:
+ if (suspend_ops->end)
+ suspend_ops->end();
++ global_inside_suspend = 0;
++
+ return error;
+
+ Recover_platform:
+@@ -388,6 +395,9 @@
+
+
+ static const char * const pm_states[PM_SUSPEND_MAX] = {
++#ifdef CONFIG_ANDROID_EARLYSUSPEND
++ [PM_SUSPEND_ON] = "on",
++#endif
+ [PM_SUSPEND_STANDBY] = "standby",
+ [PM_SUSPEND_MEM] = "mem",
+ };
+@@ -424,6 +434,8 @@
+ return -EBUSY;
+
+ printk(KERN_INFO "PM: Syncing filesystems ... ");
++ global_inside_suspend = 1;
++
+ sys_sync();
+ printk("done.\n");
+
+@@ -505,7 +517,11 @@
+ const char *buf, size_t n)
+ {
+ #ifdef CONFIG_SUSPEND
++#ifdef CONFIG_ANDROID_EARLYSUSPEND
++ suspend_state_t state = PM_SUSPEND_ON;
++#else
+ suspend_state_t state = PM_SUSPEND_STANDBY;
++#endif
+ const char * const *s;
+ #endif
+ char *p;
+@@ -527,8 +543,15 @@
+ break;
+ }
+ if (state < PM_SUSPEND_MAX && *s)
++#ifdef CONFIG_ANDROID_EARLYSUSPEND
++ if (state == PM_SUSPEND_ON || valid_state(state)) {
++ error = 0;
++ request_suspend_state(state);
++ }
++#else
+ error = enter_state(state);
+ #endif
++#endif
+
+ Exit:
+ return error ? error : n;
+@@ -561,6 +584,12 @@
+ power_attr(pm_trace);
+ #endif /* CONFIG_PM_TRACE */
+
++#ifdef CONFIG_ANDROID_USER_WAKELOCK
++power_attr(wake_lock);
++power_attr(wake_full_lock);
++power_attr(wake_unlock);
++#endif
++
+ static struct attribute * g[] = {
+ &state_attr.attr,
+ #ifdef CONFIG_PM_TRACE
+@@ -569,6 +598,11 @@
+ #if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PM_DEBUG)
+ &pm_test_attr.attr,
+ #endif
++#ifdef CONFIG_ANDROID_USER_WAKELOCK
++ &wake_lock_attr.attr,
++ &wake_unlock_attr.attr,
++ &wake_full_lock_attr.attr,
++#endif
+ NULL,
+ };
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/kernel/power/power.h linux-2.6.29-rc3.owrt.om/kernel/power/power.h
+--- linux-2.6.29-rc3.owrt/kernel/power/power.h 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/kernel/power/power.h 2009-05-10 22:28:00.000000000 +0200
+@@ -223,3 +223,32 @@
+ {
+ }
+ #endif
++
++#ifdef CONFIG_ANDROID_WAKELOCK
++/* kernel/power/wakelock.c */
++extern struct workqueue_struct *suspend_work_queue;
++extern struct wake_lock main_wake_lock;
++extern suspend_state_t requested_suspend_state;
++#endif
++
++#ifdef CONFIG_ANDROID_USER_WAKELOCK
++ssize_t wake_lock_show(struct kobject *kobj, struct kobj_attribute *attr,
++ char *buf);
++ssize_t wake_lock_store(struct kobject *kobj, struct kobj_attribute *attr,
++ const char *buf, size_t n);
++ssize_t wake_full_lock_store(struct kobject *kobj, struct kobj_attribute *attr,
++ const char *buf, size_t n);
++
++#define wake_full_lock_show wake_lock_show
++
++ssize_t wake_unlock_show(struct kobject *kobj, struct kobj_attribute *attr,
++ char *buf);
++ssize_t wake_unlock_store(struct kobject *kobj, struct kobj_attribute *attr,
++ const char *buf, size_t n);
++#endif
++
++#ifdef CONFIG_ANDROID_EARLYSUSPEND
++/* kernel/power/earlysuspend.c */
++void request_suspend_state(suspend_state_t state);
++suspend_state_t get_suspend_state(void);
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/kernel/power/process.c linux-2.6.29-rc3.owrt.om/kernel/power/process.c
+--- linux-2.6.29-rc3.owrt/kernel/power/process.c 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/kernel/power/process.c 2009-05-10 22:28:00.000000000 +0200
+@@ -13,6 +13,7 @@
+ #include <linux/module.h>
+ #include <linux/syscalls.h>
+ #include <linux/freezer.h>
++#include <linux/wakelock.h>
+
+ /*
+ * Timeout for stopping processes
+@@ -36,6 +37,7 @@
+ struct timeval start, end;
+ u64 elapsed_csecs64;
+ unsigned int elapsed_csecs;
++ unsigned int wakeup = 0;
+
+ do_gettimeofday(&start);
+
+@@ -62,6 +64,10 @@
+ } while_each_thread(g, p);
+ read_unlock(&tasklist_lock);
+ yield(); /* Yield is okay here */
++ if (todo && has_wake_lock(WAKE_LOCK_SUSPEND)) {
++ wakeup = 1;
++ break;
++ }
+ if (time_after(jiffies, end_time))
+ break;
+ } while (todo);
+@@ -77,11 +83,17 @@
+ * and caller must call thaw_processes() if something fails),
+ * but it cleans up leftover PF_FREEZE requests.
+ */
+- printk("\n");
+- printk(KERN_ERR "Freezing of tasks failed after %d.%02d seconds "
++ if (wakeup) {
++ printk("\n");
++ printk(KERN_ERR "Freezing of %s aborted\n",
++ sig_only ? "user space " : "tasks ");
++ } else {
++ printk("\n");
++ printk(KERN_ERR "Freezing of tasks failed after %d.%02d seconds "
+ "(%d tasks refusing to freeze):\n",
+ elapsed_csecs / 100, elapsed_csecs % 100, todo);
+- show_state();
++ show_state();
++ }
+ read_lock(&tasklist_lock);
+ do_each_thread(g, p) {
+ task_lock(p);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/kernel/printk.c linux-2.6.29-rc3.owrt.om/kernel/printk.c
+--- linux-2.6.29-rc3.owrt/kernel/printk.c 2009-05-10 22:09:09.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/kernel/printk.c 2009-05-10 22:28:00.000000000 +0200
+@@ -32,8 +32,11 @@
+ #include <linux/security.h>
+ #include <linux/bootmem.h>
+ #include <linux/syscalls.h>
++#include <linux/jiffies.h>
++#include <linux/suspend.h>
+
+ #include <asm/uaccess.h>
++#include <asm/plat-s3c24xx/neo1973.h>
+
+ /*
+ * Architectures can override it:
+@@ -67,13 +70,21 @@
+ int oops_in_progress;
+ EXPORT_SYMBOL(oops_in_progress);
+
++void (*printk_emergency_debug_spew_init)(void) = NULL;
++EXPORT_SYMBOL(printk_emergency_debug_spew_init);
++
++void (*printk_emergency_debug_spew_send_string)(const char *) = NULL;
++EXPORT_SYMBOL(printk_emergency_debug_spew_send_string);
++
+ /*
+ * console_sem protects the console_drivers list, and also
+ * provides serialisation for access to the entire console
+ * driver system.
+ */
+ static DECLARE_MUTEX(console_sem);
++#ifndef CONFIG_ANDROID_CONSOLE_EARLYSUSPEND
+ static DECLARE_MUTEX(secondary_console_sem);
++#endif
+ struct console *console_drivers;
+ EXPORT_SYMBOL_GPL(console_drivers);
+
+@@ -667,8 +678,39 @@
+ /* Emit the output into the temporary buffer */
+ printed_len += vscnprintf(printk_buf + printed_len,
+ sizeof(printk_buf) - printed_len, fmt, args);
+-
+-
++#if defined(CONFIG_MACH_NEO1973_GTA02) && defined(CONFIG_PM)
++ /* if you're debugging resume, the normal methods can change resume
++ * ordering behaviours because their debugging output is synchronous
++ * (ie, CONFIG_DEBUG_LL). If your problem is an OOPS, this code
++ * will not affect the speed and duration and ordering of resume
++ * actions, but will give you a chance to read the full undumped
++ * syslog AND the OOPS data when it happens
++ *
++ * if you support it, your debug device init can override the exported
++ * emergency_debug_spew_init and emergency_debug_spew_send_string to
++ * usually force polling or bitbanging on your debug console device
++ */
++ if (oops_in_progress && global_inside_suspend &&
++ printk_emergency_debug_spew_init &&
++ printk_emergency_debug_spew_send_string) {
++ unsigned long cur_index;
++ char ch[2];
++
++ if (global_inside_suspend == 1) {
++ (printk_emergency_debug_spew_init)();
++
++ ch[1] = '\0';
++ cur_index = con_start;
++ while (cur_index != log_end) {
++ ch[0] = LOG_BUF(cur_index);
++ (printk_emergency_debug_spew_send_string)(ch);
++ cur_index++;
++ }
++ global_inside_suspend++; /* only once */
++ }
++ (printk_emergency_debug_spew_send_string)(printk_buf);
++ }
++#endif
+ /*
+ * Copy the output into log_buf. If the caller didn't provide
+ * appropriate log level tags, we insert them here
+@@ -891,12 +933,18 @@
+ printk("Suspending console(s) (use no_console_suspend to debug)\n");
+ acquire_console_sem();
+ console_suspended = 1;
++#ifdef CONFIG_ANDROID_CONSOLE_EARLYSUSPEND
++ up(&console_sem);
++#endif
+ }
+
+ void resume_console(void)
+ {
+ if (!console_suspend_enabled)
+ return;
++#ifdef CONFIG_ANDROID_CONSOLE_EARLYSUSPEND
++ down(&console_sem);
++#endif
+ console_suspended = 0;
+ release_console_sem();
+ }
+@@ -912,11 +960,17 @@
+ void acquire_console_sem(void)
+ {
+ BUG_ON(in_interrupt());
++#ifndef CONFIG_ANDROID_CONSOLE_EARLYSUSPEND
+ if (console_suspended) {
+ down(&secondary_console_sem);
+ return;
+ }
++#endif
+ down(&console_sem);
++#ifdef CONFIG_ANDROID_CONSOLE_EARLYSUSPEND
++ if (console_suspended)
++ return;
++#endif
+ console_locked = 1;
+ console_may_schedule = 1;
+ }
+@@ -926,6 +980,12 @@
+ {
+ if (down_trylock(&console_sem))
+ return -1;
++#ifdef CONFIG_ANDROID_CONSOLE_EARLYSUSPEND
++ if (console_suspended) {
++ up(&console_sem);
++ return -1;
++ }
++#endif
+ console_locked = 1;
+ console_may_schedule = 0;
+ return 0;
+@@ -979,7 +1039,11 @@
+ unsigned wake_klogd = 0;
+
+ if (console_suspended) {
++#ifdef CONFIG_ANDROID_CONSOLE_EARLYSUSPEND
++ up(&console_sem);
++#else
+ up(&secondary_console_sem);
++#endif
+ return;
+ }
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/kernel/timer.c linux-2.6.29-rc3.owrt.om/kernel/timer.c
+--- linux-2.6.29-rc3.owrt/kernel/timer.c 2009-05-10 22:05:04.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/kernel/timer.c 2009-05-10 22:28:00.000000000 +0200
+@@ -813,7 +813,6 @@
+ * don't have to detach them individually.
+ */
+ list_for_each_entry_safe(timer, tmp, &tv_list, entry) {
+- BUG_ON(tbase_get_base(timer->base) != base);
+ internal_add_timer(base, timer);
+ }
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/lib/Kconfig.debug linux-2.6.29-rc3.owrt.om/lib/Kconfig.debug
+--- linux-2.6.29-rc3.owrt/lib/Kconfig.debug 2009-05-10 22:09:09.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/lib/Kconfig.debug 2009-05-10 22:28:00.000000000 +0200
+@@ -847,6 +847,13 @@
+
+ Say N if you are unsure.
+
++config FIND_IRQ_BLOCKERS
++ bool "IRQ Blocker statistics"
++ depends on ARM
++ ---help---
++ Enables tracking of IRQ dead-time because something has
++ disabled interrupts
++
+ config DYNAMIC_PRINTK_DEBUG
+ bool "Enable dynamic printk() call support"
+ default n
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/MAINTAINERS linux-2.6.29-rc3.owrt.om/MAINTAINERS
+--- linux-2.6.29-rc3.owrt/MAINTAINERS 2009-05-10 22:09:09.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/MAINTAINERS 2009-05-10 22:28:00.000000000 +0200
+@@ -1711,6 +1711,20 @@
+ P: Matthew Wilcox
+ M: matthew@wil.cx
+ L: linux-fsdevel@vger.kernel.org
++
++FIC/OPENMOKO NEO1973 GSM PHONE
++P: Harald Welte
++M: laforge@openmoko.org
++L: openmoko-kernel@lists.openmoko.org
++W: http://wiki.openmoko.org/wiki/Kernel
++W: http://wiki.openmoko.org/wiki/Neo1973
++S: Maintained
++
++FRAMEBUFFER LAYER
++P: Antonino Daplas
++M: adaplas@gmail.com
++L: linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers)
++W: http://linux-fbdev.sourceforge.net/
+ S: Maintained
+
+ FILESYSTEMS (VFS and infrastructure)
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/makerecovery linux-2.6.29-rc3.owrt.om/makerecovery
+--- linux-2.6.29-rc3.owrt/makerecovery 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/makerecovery 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,17 @@
++#!/bin/sh
++#
++# make 6MB recovery image from two moredrivers type kernels
++# placed at start and at +4MBytes
++
++if [ -z "$1" ] ; then
++ echo "Usage: $0 uImage-moredrivers-..."
++ exit 1
++fi
++cat $1 > recovery-$1
++SIZE=`ls -l $1 | tr -s ' ' ' ' | cut -d' ' -f5`
++SPACE=$(( 4 * 1024 * 1024 - $SIZE ))
++dd if=/dev/zero of=_spacer bs=1 count=$SPACE
++cat _spacer >> recovery-$1
++rm -f _spacer
++cat $1 >> recovery-$1
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/mm/ashmem.c linux-2.6.29-rc3.owrt.om/mm/ashmem.c
+--- linux-2.6.29-rc3.owrt/mm/ashmem.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/mm/ashmem.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,657 @@
++/* drivers/android/ashmem.c
++**
++** Android / Anonymous Shared Memory Subsystem, ashmem
++**
++** Copyright (C) 2008 Google, Inc.
++**
++** Robert Love <rlove@google.com>
++**
++** This software is licensed under the terms of the GNU General Public
++** License version 2, as published by the Free Software Foundation, and
++** may be copied, distributed, and modified under those terms.
++**
++** This program is distributed in the hope that it will be useful,
++** but WITHOUT ANY WARRANTY; without even the implied warranty of
++** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++** GNU General Public License for more details.
++*/
++
++#include <linux/module.h>
++#include <linux/file.h>
++#include <linux/fs.h>
++#include <linux/miscdevice.h>
++#include <linux/security.h>
++#include <linux/mm.h>
++#include <linux/mman.h>
++#include <linux/uaccess.h>
++#include <linux/personality.h>
++#include <linux/bitops.h>
++#include <linux/mutex.h>
++#include <linux/shmem_fs.h>
++#include <linux/ashmem.h>
++
++/*
++ * ashmem_area - android shared memory area
++ * Lifecycle: From our parent file's open() until its release()
++ * Locking: Protected by `ashmem_mutex'
++ * Big Note: Mappings do NOT pin this structure; it dies on close()
++ */
++struct ashmem_area {
++ char name[ASHMEM_NAME_LEN]; /* optional name for /proc/pid/maps */
++ struct list_head unpinned_list; /* list of all ashmem areas */
++ struct file *file; /* the shmem-based backing file */
++ size_t size; /* size of the mapping, in bytes */
++ unsigned long prot_mask; /* allowed prot bits, as vm_flags */
++};
++
++/*
++ * ashmem_range - represents an interval of unpinned (evictable) pages
++ * Lifecycle: From unpin to pin
++ * Locking: Protected by `ashmem_mutex'
++ */
++struct ashmem_range {
++ struct list_head lru; /* entry in LRU list */
++ struct list_head unpinned; /* entry in its area's unpinned list */
++ struct ashmem_area *asma; /* associated area */
++ size_t pgstart; /* starting page, inclusive */
++ size_t pgend; /* ending page, inclusive */
++ unsigned int purged; /* ASHMEM_NOT or ASHMEM_WAS_PURGED */
++};
++
++/* LRU list of unpinned pages, protected by ashmem_mutex */
++static LIST_HEAD(ashmem_lru_list);
++
++/* Count of pages on our LRU list, protected by ashmem_mutex */
++static unsigned long lru_count;
++
++/*
++ * ashmem_mutex - protects the list of and each individual ashmem_area
++ *
++ * Lock Ordering: ashmex_mutex -> i_mutex -> i_alloc_sem
++ */
++static DEFINE_MUTEX(ashmem_mutex);
++
++static struct kmem_cache *ashmem_area_cachep __read_mostly;
++static struct kmem_cache *ashmem_range_cachep __read_mostly;
++
++#define range_size(range) \
++ ((range)->pgend - (range)->pgstart + 1)
++
++#define range_on_lru(range) \
++ ((range)->purged == ASHMEM_NOT_PURGED)
++
++#define page_range_subsumes_range(range, start, end) \
++ (((range)->pgstart >= (start)) && ((range)->pgend <= (end)))
++
++#define page_range_subsumed_by_range(range, start, end) \
++ (((range)->pgstart <= (start)) && ((range)->pgend >= (end)))
++
++#define page_in_range(range, page) \
++ (((range)->pgstart <= (page)) && ((range)->pgend >= (page)))
++
++#define page_range_in_range(range, start, end) \
++ (page_in_range(range, start) || page_in_range(range, end) || \
++ page_range_subsumes_range(range, start, end))
++
++#define range_before_page(range, page) \
++ ((range)->pgend < (page))
++
++#define PROT_MASK (PROT_EXEC | PROT_READ | PROT_WRITE)
++
++static inline void lru_add(struct ashmem_range *range)
++{
++ list_add_tail(&range->lru, &ashmem_lru_list);
++ lru_count += range_size(range);
++}
++
++static inline void lru_del(struct ashmem_range *range)
++{
++ list_del(&range->lru);
++ lru_count -= range_size(range);
++}
++
++/*
++ * range_alloc - allocate and initialize a new ashmem_range structure
++ *
++ * 'asma' - associated ashmem_area
++ * 'prev_range' - the previous ashmem_range in the sorted asma->unpinned list
++ * 'purged' - initial purge value (ASMEM_NOT_PURGED or ASHMEM_WAS_PURGED)
++ * 'start' - starting page, inclusive
++ * 'end' - ending page, inclusive
++ *
++ * Caller must hold ashmem_mutex.
++ */
++static int range_alloc(struct ashmem_area *asma,
++ struct ashmem_range *prev_range, unsigned int purged,
++ size_t start, size_t end)
++{
++ struct ashmem_range *range;
++
++ range = kmem_cache_zalloc(ashmem_range_cachep, GFP_KERNEL);
++ if (unlikely(!range))
++ return -ENOMEM;
++
++ range->asma = asma;
++ range->pgstart = start;
++ range->pgend = end;
++ range->purged = purged;
++
++ list_add_tail(&range->unpinned, &prev_range->unpinned);
++
++ if (range_on_lru(range))
++ lru_add(range);
++
++ return 0;
++}
++
++static void range_del(struct ashmem_range *range)
++{
++ list_del(&range->unpinned);
++ if (range_on_lru(range))
++ lru_del(range);
++ kmem_cache_free(ashmem_range_cachep, range);
++}
++
++/*
++ * range_shrink - shrinks a range
++ *
++ * Caller must hold ashmem_mutex.
++ */
++static inline void range_shrink(struct ashmem_range *range,
++ size_t start, size_t end)
++{
++ size_t pre = range_size(range);
++
++ range->pgstart = start;
++ range->pgend = end;
++
++ if (range_on_lru(range))
++ lru_count -= pre - range_size(range);
++}
++
++static int ashmem_open(struct inode *inode, struct file *file)
++{
++ struct ashmem_area *asma;
++ int ret;
++
++ ret = nonseekable_open(inode, file);
++ if (unlikely(ret))
++ return ret;
++
++ asma = kmem_cache_zalloc(ashmem_area_cachep, GFP_KERNEL);
++ if (unlikely(!asma))
++ return -ENOMEM;
++
++ INIT_LIST_HEAD(&asma->unpinned_list);
++ asma->prot_mask = PROT_MASK;
++ file->private_data = asma;
++
++ return 0;
++}
++
++static int ashmem_release(struct inode *ignored, struct file *file)
++{
++ struct ashmem_area *asma = file->private_data;
++ struct ashmem_range *range, *next;
++
++ mutex_lock(&ashmem_mutex);
++ list_for_each_entry_safe(range, next, &asma->unpinned_list, unpinned)
++ range_del(range);
++ mutex_unlock(&ashmem_mutex);
++
++ if (asma->file)
++ fput(asma->file);
++ kmem_cache_free(ashmem_area_cachep, asma);
++
++ return 0;
++}
++
++static int ashmem_mmap(struct file *file, struct vm_area_struct *vma)
++{
++ struct ashmem_area *asma = file->private_data;
++ int ret = 0;
++
++ mutex_lock(&ashmem_mutex);
++
++ /* user needs to SET_SIZE before mapping */
++ if (unlikely(!asma->size)) {
++ ret = -EINVAL;
++ goto out;
++ }
++
++ /* requested protection bits must match our allowed protection mask */
++ if (unlikely((vma->vm_flags & ~asma->prot_mask) & PROT_MASK)) {
++ ret = -EPERM;
++ goto out;
++ }
++
++ if (!asma->file) {
++ char *name = ASHMEM_NAME_DEF;
++ struct file *vmfile;
++
++ if (asma->name[0] != '\0')
++ name = asma->name;
++
++ /* ... and allocate the backing shmem file */
++ vmfile = shmem_file_setup(name, asma->size, vma->vm_flags);
++ if (unlikely(IS_ERR(vmfile))) {
++ ret = PTR_ERR(vmfile);
++ goto out;
++ }
++ asma->file = vmfile;
++ }
++ get_file(asma->file);
++
++ shmem_set_file(vma, asma->file);
++ vma->vm_flags |= VM_CAN_NONLINEAR;
++
++out:
++ mutex_unlock(&ashmem_mutex);
++ return ret;
++}
++
++/*
++ * ashmem_shrink - our cache shrinker, called from mm/vmscan.c :: shrink_slab
++ *
++ * 'nr_to_scan' is the number of objects (pages) to prune, or 0 to query how
++ * many objects (pages) we have in total.
++ *
++ * 'gfp_mask' is the mask of the allocation that got us into this mess.
++ *
++ * Return value is the number of objects (pages) remaining, or -1 if we cannot
++ * proceed without risk of deadlock (due to gfp_mask).
++ *
++ * We approximate LRU via least-recently-unpinned, jettisoning unpinned partial
++ * chunks of ashmem regions LRU-wise one-at-a-time until we hit 'nr_to_scan'
++ * pages freed.
++ */
++static int ashmem_shrink(int nr_to_scan, gfp_t gfp_mask)
++{
++ struct ashmem_range *range, *next;
++
++ /* We might recurse into filesystem code, so bail out if necessary */
++ if (nr_to_scan && !(gfp_mask & __GFP_FS))
++ return -1;
++ if (!nr_to_scan)
++ return lru_count;
++
++ mutex_lock(&ashmem_mutex);
++ list_for_each_entry_safe(range, next, &ashmem_lru_list, lru) {
++ struct inode *inode = range->asma->file->f_dentry->d_inode;
++ loff_t start = range->pgstart * PAGE_SIZE;
++ loff_t end = (range->pgend + 1) * PAGE_SIZE - 1;
++
++ vmtruncate_range(inode, start, end);
++ range->purged = ASHMEM_WAS_PURGED;
++ lru_del(range);
++
++ nr_to_scan -= range_size(range);
++ if (nr_to_scan <= 0)
++ break;
++ }
++ mutex_unlock(&ashmem_mutex);
++
++ return lru_count;
++}
++
++static struct shrinker ashmem_shrinker = {
++ .shrink = ashmem_shrink,
++ .seeks = DEFAULT_SEEKS * 4,
++};
++
++static int set_prot_mask(struct ashmem_area *asma, unsigned long prot)
++{
++ int ret = 0;
++
++ mutex_lock(&ashmem_mutex);
++
++ /* the user can only remove, not add, protection bits */
++ if (unlikely((asma->prot_mask & prot) != prot)) {
++ ret = -EINVAL;
++ goto out;
++ }
++
++ /* does the application expect PROT_READ to imply PROT_EXEC? */
++ if ((prot & PROT_READ) && (current->personality & READ_IMPLIES_EXEC))
++ prot |= PROT_EXEC;
++
++ asma->prot_mask = prot;
++
++out:
++ mutex_unlock(&ashmem_mutex);
++ return ret;
++}
++
++static int set_name(struct ashmem_area *asma, void __user *name)
++{
++ int ret = 0;
++
++ mutex_lock(&ashmem_mutex);
++
++ /* cannot change an existing mapping's name */
++ if (unlikely(asma->file)) {
++ ret = -EINVAL;
++ goto out;
++ }
++
++ if (unlikely(copy_from_user(asma->name, name, ASHMEM_NAME_LEN)))
++ ret = -EFAULT;
++ asma->name[ASHMEM_NAME_LEN-1] = '\0';
++
++out:
++ mutex_unlock(&ashmem_mutex);
++
++ return ret;
++}
++
++static int get_name(struct ashmem_area *asma, void __user *name)
++{
++ int ret = 0;
++
++ mutex_lock(&ashmem_mutex);
++ if (asma->name[0] != '\0') {
++ size_t len;
++
++ /*
++ * Copying only `len', instead of ASHMEM_NAME_LEN, bytes
++ * prevents us from revealing one user's stack to another.
++ */
++ len = strlen(asma->name) + 1;
++ if (unlikely(copy_to_user(name, asma->name, len)))
++ ret = -EFAULT;
++ } else {
++ if (unlikely(copy_to_user(name, ASHMEM_NAME_DEF,
++ sizeof(ASHMEM_NAME_DEF))))
++ ret = -EFAULT;
++ }
++ mutex_unlock(&ashmem_mutex);
++
++ return ret;
++}
++
++/*
++ * ashmem_pin - pin the given ashmem region, returning whether it was
++ * previously purged (ASHMEM_WAS_PURGED) or not (ASHMEM_NOT_PURGED).
++ *
++ * Caller must hold ashmem_mutex.
++ */
++static int ashmem_pin(struct ashmem_area *asma, size_t pgstart, size_t pgend)
++{
++ struct ashmem_range *range, *next;
++ int ret = ASHMEM_NOT_PURGED;
++
++ list_for_each_entry_safe(range, next, &asma->unpinned_list, unpinned) {
++ /* moved past last applicable page; we can short circuit */
++ if (range_before_page(range, pgstart))
++ break;
++
++ /*
++ * The user can ask us to pin pages that span multiple ranges,
++ * or to pin pages that aren't even unpinned, so this is messy.
++ *
++ * Four cases:
++ * 1. The requested range subsumes an existing range, so we
++ * just remove the entire matching range.
++ * 2. The requested range overlaps the start of an existing
++ * range, so we just update that range.
++ * 3. The requested range overlaps the end of an existing
++ * range, so we just update that range.
++ * 4. The requested range punches a hole in an existing range,
++ * so we have to update one side of the range and then
++ * create a new range for the other side.
++ */
++ if (page_range_in_range(range, pgstart, pgend)) {
++ ret |= range->purged;
++
++ /* Case #1: Easy. Just nuke the whole thing. */
++ if (page_range_subsumes_range(range, pgstart, pgend)) {
++ range_del(range);
++ continue;
++ }
++
++ /* Case #2: We overlap from the start, so adjust it */
++ if (range->pgstart >= pgstart) {
++ range_shrink(range, pgend + 1, range->pgend);
++ continue;
++ }
++
++ /* Case #3: We overlap from the rear, so adjust it */
++ if (range->pgend <= pgend) {
++ range_shrink(range, range->pgstart, pgstart-1);
++ continue;
++ }
++
++ /*
++ * Case #4: We eat a chunk out of the middle. A bit
++ * more complicated, we allocate a new range for the
++ * second half and adjust the first chunk's endpoint.
++ */
++ range_alloc(asma, range, range->purged,
++ pgend + 1, range->pgend);
++ range_shrink(range, range->pgstart, pgstart - 1);
++ break;
++ }
++ }
++
++ return ret;
++}
++
++/*
++ * ashmem_unpin - unpin the given range of pages. Returns zero on success.
++ *
++ * Caller must hold ashmem_mutex.
++ */
++static int ashmem_unpin(struct ashmem_area *asma, size_t pgstart, size_t pgend)
++{
++ struct ashmem_range *range, *next;
++ unsigned int purged = ASHMEM_NOT_PURGED;
++
++restart:
++ list_for_each_entry_safe(range, next, &asma->unpinned_list, unpinned) {
++ /* short circuit: this is our insertion point */
++ if (range_before_page(range, pgstart))
++ break;
++
++ /*
++ * The user can ask us to unpin pages that are already entirely
++ * or partially pinned. We handle those two cases here.
++ */
++ if (page_range_subsumed_by_range(range, pgstart, pgend))
++ return 0;
++ if (page_range_in_range(range, pgstart, pgend)) {
++ pgstart = min_t(size_t, range->pgstart, pgstart),
++ pgend = max_t(size_t, range->pgend, pgend);
++ purged |= range->purged;
++ range_del(range);
++ goto restart;
++ }
++ }
++
++ return range_alloc(asma, range, purged, pgstart, pgend);
++}
++
++/*
++ * ashmem_get_pin_status - Returns ASHMEM_IS_UNPINNED if _any_ pages in the
++ * given interval are unpinned and ASHMEM_IS_PINNED otherwise.
++ *
++ * Caller must hold ashmem_mutex.
++ */
++static int ashmem_get_pin_status(struct ashmem_area *asma, size_t pgstart,
++ size_t pgend)
++{
++ struct ashmem_range *range;
++ int ret = ASHMEM_IS_PINNED;
++
++ list_for_each_entry(range, &asma->unpinned_list, unpinned) {
++ if (range_before_page(range, pgstart))
++ break;
++ if (page_range_in_range(range, pgstart, pgend)) {
++ ret = ASHMEM_IS_UNPINNED;
++ break;
++ }
++ }
++
++ return ret;
++}
++
++static int ashmem_pin_unpin(struct ashmem_area *asma, unsigned long cmd,
++ void __user *p)
++{
++ struct ashmem_pin pin;
++ size_t pgstart, pgend;
++ int ret = -EINVAL;
++
++ if (unlikely(!asma->file))
++ return -EINVAL;
++
++ if (unlikely(copy_from_user(&pin, p, sizeof(pin))))
++ return -EFAULT;
++
++ /* per custom, you can pass zero for len to mean "everything onward" */
++ if (!pin.len)
++ pin.len = asma->size - pin.offset;
++
++ if (unlikely((pin.offset | pin.len) & ~PAGE_MASK))
++ return -EINVAL;
++
++ if (unlikely(((__u32) -1) - pin.offset < pin.len))
++ return -EINVAL;
++
++ if (unlikely(asma->size < pin.offset + pin.len))
++ return -EINVAL;
++
++ pgstart = pin.offset / PAGE_SIZE;
++ pgend = pgstart + (pin.len / PAGE_SIZE) - 1;
++
++ mutex_lock(&ashmem_mutex);
++
++ switch (cmd) {
++ case ASHMEM_PIN:
++ ret = ashmem_pin(asma, pgstart, pgend);
++ break;
++ case ASHMEM_UNPIN:
++ ret = ashmem_unpin(asma, pgstart, pgend);
++ break;
++ case ASHMEM_GET_PIN_STATUS:
++ ret = ashmem_get_pin_status(asma, pgstart, pgend);
++ break;
++ }
++
++ mutex_unlock(&ashmem_mutex);
++
++ return ret;
++}
++
++static long ashmem_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
++{
++ struct ashmem_area *asma = file->private_data;
++ long ret = -ENOTTY;
++
++ switch (cmd) {
++ case ASHMEM_SET_NAME:
++ ret = set_name(asma, (void __user *) arg);
++ break;
++ case ASHMEM_GET_NAME:
++ ret = get_name(asma, (void __user *) arg);
++ break;
++ case ASHMEM_SET_SIZE:
++ ret = -EINVAL;
++ if (!asma->file && !(arg & ~PAGE_MASK)) {
++ ret = 0;
++ asma->size = (size_t) arg;
++ }
++ break;
++ case ASHMEM_GET_SIZE:
++ ret = asma->size;
++ break;
++ case ASHMEM_SET_PROT_MASK:
++ ret = set_prot_mask(asma, arg);
++ break;
++ case ASHMEM_GET_PROT_MASK:
++ ret = asma->prot_mask;
++ break;
++ case ASHMEM_PIN:
++ case ASHMEM_UNPIN:
++ case ASHMEM_GET_PIN_STATUS:
++ ret = ashmem_pin_unpin(asma, cmd, (void __user *) arg);
++ break;
++ case ASHMEM_PURGE_ALL_CACHES:
++ ret = -EPERM;
++ if (capable(CAP_SYS_ADMIN)) {
++ ret = ashmem_shrink(0, GFP_KERNEL);
++ ashmem_shrink(ret, GFP_KERNEL);
++ }
++ break;
++ }
++
++ return ret;
++}
++
++static struct file_operations ashmem_fops = {
++ .owner = THIS_MODULE,
++ .open = ashmem_open,
++ .release = ashmem_release,
++ .mmap = ashmem_mmap,
++ .unlocked_ioctl = ashmem_ioctl,
++ .compat_ioctl = ashmem_ioctl,
++};
++
++static struct miscdevice ashmem_misc = {
++ .minor = MISC_DYNAMIC_MINOR,
++ .name = "ashmem",
++ .fops = &ashmem_fops,
++};
++
++static int __init ashmem_init(void)
++{
++ int ret;
++
++ ashmem_area_cachep = kmem_cache_create("ashmem_area_cache",
++ sizeof(struct ashmem_area),
++ 0, 0, NULL);
++ if (unlikely(!ashmem_area_cachep)) {
++ printk(KERN_ERR "ashmem: failed to create slab cache\n");
++ return -ENOMEM;
++ }
++
++ ashmem_range_cachep = kmem_cache_create("ashmem_range_cache",
++ sizeof(struct ashmem_range),
++ 0, 0, NULL);
++ if (unlikely(!ashmem_range_cachep)) {
++ printk(KERN_ERR "ashmem: failed to create slab cache\n");
++ return -ENOMEM;
++ }
++
++ ret = misc_register(&ashmem_misc);
++ if (unlikely(ret)) {
++ printk(KERN_ERR "ashmem: failed to register misc device!\n");
++ return ret;
++ }
++
++ register_shrinker(&ashmem_shrinker);
++
++ printk(KERN_INFO "ashmem: initialized\n");
++
++ return 0;
++}
++
++static void __exit ashmem_exit(void)
++{
++ int ret;
++
++ unregister_shrinker(&ashmem_shrinker);
++
++ ret = misc_deregister(&ashmem_misc);
++ if (unlikely(ret))
++ printk(KERN_ERR "ashmem: failed to unregister misc device!\n");
++
++ kmem_cache_destroy(ashmem_range_cachep);
++ kmem_cache_destroy(ashmem_area_cachep);
++
++ printk(KERN_INFO "ashmem: unloaded\n");
++}
++
++module_init(ashmem_init);
++module_exit(ashmem_exit);
++
++MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/mm/Makefile linux-2.6.29-rc3.owrt.om/mm/Makefile
+--- linux-2.6.29-rc3.owrt/mm/Makefile 2009-05-10 22:04:53.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/mm/Makefile 2009-05-10 22:28:00.000000000 +0200
+@@ -21,6 +21,8 @@
+ obj-$(CONFIG_NUMA) += mempolicy.o
+ obj-$(CONFIG_SPARSEMEM) += sparse.o
+ obj-$(CONFIG_SPARSEMEM_VMEMMAP) += sparse-vmemmap.o
++obj-$(CONFIG_SHMEM) += shmem.o
++obj-$(CONFIG_ASHMEM) += ashmem.o
+ obj-$(CONFIG_TMPFS_POSIX_ACL) += shmem_acl.o
+ obj-$(CONFIG_SLOB) += slob.o
+ obj-$(CONFIG_MMU_NOTIFIER) += mmu_notifier.o
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/mm/tiny-shmem.c linux-2.6.29-rc3.owrt.om/mm/tiny-shmem.c
+--- linux-2.6.29-rc3.owrt/mm/tiny-shmem.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/mm/tiny-shmem.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,148 @@
++/*
++ * tiny-shmem.c: simple shmemfs and tmpfs using ramfs code
++ *
++ * Matt Mackall <mpm@selenic.com> January, 2004
++ * derived from mm/shmem.c and fs/ramfs/inode.c
++ *
++ * This is intended for small system where the benefits of the full
++ * shmem code (swap-backed and resource-limited) are outweighed by
++ * their complexity. On systems without swap this code should be
++ * effectively equivalent, but much lighter weight.
++ */
++
++#include <linux/fs.h>
++#include <linux/init.h>
++#include <linux/vfs.h>
++#include <linux/mount.h>
++#include <linux/file.h>
++#include <linux/mm.h>
++#include <linux/module.h>
++#include <linux/swap.h>
++#include <linux/ramfs.h>
++
++static struct file_system_type tmpfs_fs_type = {
++ .name = "tmpfs",
++ .get_sb = ramfs_get_sb,
++ .kill_sb = kill_litter_super,
++};
++
++static struct vfsmount *shm_mnt;
++
++static int __init init_tmpfs(void)
++{
++ BUG_ON(register_filesystem(&tmpfs_fs_type) != 0);
++
++ shm_mnt = kern_mount(&tmpfs_fs_type);
++ BUG_ON(IS_ERR(shm_mnt));
++
++ return 0;
++}
++module_init(init_tmpfs)
++
++/**
++ * shmem_file_setup - get an unlinked file living in tmpfs
++ * @name: name for dentry (to be seen in /proc/<pid>/maps
++ * @size: size to be set for the file
++ * @flags: vm_flags
++ */
++struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags)
++{
++ int error;
++ struct file *file;
++ struct inode *inode;
++ struct dentry *dentry, *root;
++ struct qstr this;
++
++ if (IS_ERR(shm_mnt))
++ return (void *)shm_mnt;
++
++ error = -ENOMEM;
++ this.name = name;
++ this.len = strlen(name);
++ this.hash = 0; /* will go */
++ root = shm_mnt->mnt_root;
++ dentry = d_alloc(root, &this);
++ if (!dentry)
++ goto put_memory;
++
++ error = -ENFILE;
++ file = get_empty_filp();
++ if (!file)
++ goto put_dentry;
++
++ error = -ENOSPC;
++ inode = ramfs_get_inode(root->d_sb, S_IFREG | S_IRWXUGO, 0);
++ if (!inode)
++ goto close_file;
++
++ d_instantiate(dentry, inode);
++ inode->i_size = size;
++ inode->i_nlink = 0; /* It is unlinked */
++ init_file(file, shm_mnt, dentry, FMODE_WRITE | FMODE_READ,
++ &ramfs_file_operations);
++
++#ifndef CONFIG_MMU
++ error = ramfs_nommu_expand_for_mapping(inode, size);
++ if (error)
++ goto close_file;
++#endif
++ return file;
++
++close_file:
++ put_filp(file);
++put_dentry:
++ dput(dentry);
++put_memory:
++ return ERR_PTR(error);
++}
++EXPORT_SYMBOL_GPL(shmem_file_setup);
++
++void shmem_set_file(struct vm_area_struct *vma, struct file *file)
++{
++ if (vma->vm_file)
++ fput(vma->vm_file);
++ vma->vm_file = file;
++ vma->vm_ops = &generic_file_vm_ops;
++}
++
++void shmem_set_file(struct vm_area_struct *vma, struct file *file)
++{
++ if (vma->vm_file)
++ fput(vma->vm_file);
++ vma->vm_file = file;
++ vma->vm_ops = &generic_file_vm_ops;
++}
++
++/**
++ * shmem_zero_setup - setup a shared anonymous mapping
++ * @vma: the vma to be mmapped is prepared by do_mmap_pgoff
++ */
++int shmem_zero_setup(struct vm_area_struct *vma)
++{
++ struct file *file;
++ loff_t size = vma->vm_end - vma->vm_start;
++
++ file = shmem_file_setup("dev/zero", size, vma->vm_flags);
++ if (IS_ERR(file))
++ return PTR_ERR(file);
++
++ shmem_set_file(vma, file);
++
++ return 0;
++}
++
++int shmem_unuse(swp_entry_t entry, struct page *page)
++{
++ return 0;
++}
++
++#ifndef CONFIG_MMU
++unsigned long shmem_get_unmapped_area(struct file *file,
++ unsigned long addr,
++ unsigned long len,
++ unsigned long pgoff,
++ unsigned long flags)
++{
++ return ramfs_nommu_get_unmapped_area(file, addr, len, pgoff, flags);
++}
++#endif
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/remote_install_sdcard linux-2.6.29-rc3.owrt.om/remote_install_sdcard
+--- linux-2.6.29-rc3.owrt/remote_install_sdcard 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/remote_install_sdcard 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,18 @@
++#!/bin/sh
++
++# automatic kernel updater and reboot - Andy Green <andy@openmoko.com>
++
++GTA_DEVICE_IP=192.168.0.202
++
++# you should set up key-based auth on dropbear if you want
++# to play this game.
++#
++# 1) mkdir /home/root/.ssh
++# 2) chown root:root / /home /home/root
++# 3) chmod 700 /home/root /home/root/.ssh
++# 4) copy your id_*.pub into /home/root/.ssh/authorized_keys
++# 5) chmod 600 /home/root/.ssh/*
++
++scp uImage.bin root@$GTA_DEVICE_IP:/boot
++ssh root@$GTA_DEVICE_IP "mount /dev/mmcblk0p1 / -oremount,ro ; reboot -if &"
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/scripts/mkuboot.sh linux-2.6.29-rc3.owrt.om/scripts/mkuboot.sh
+--- linux-2.6.29-rc3.owrt/scripts/mkuboot.sh 2009-05-10 22:04:48.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/scripts/mkuboot.sh 2009-05-10 22:28:00.000000000 +0200
+@@ -11,7 +11,7 @@
+ if [ -z "${MKIMAGE}" ]; then
+ # Doesn't exist
+ echo '"mkimage" command not found - U-Boot images will not be built' >&2
+- exit 0;
++ exit 1;
+ fi
+ fi
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/sound/soc/codecs/wm8731.c linux-2.6.29-rc3.owrt.om/sound/soc/codecs/wm8731.c
+--- linux-2.6.29-rc3.owrt/sound/soc/codecs/wm8731.c 2009-05-10 22:05:01.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/sound/soc/codecs/wm8731.c 2009-05-10 22:28:00.000000000 +0200
+@@ -73,6 +73,8 @@
+ u16 *cache = codec->reg_cache;
+ if (reg >= WM8731_CACHEREGNUM)
+ return;
++
++ printk(KERN_INFO "%s: reg %d, val %04x\n", __func__, reg, value);
+ cache[reg] = value;
+ }
+
+@@ -84,6 +86,8 @@
+ {
+ u8 data[2];
+
++ printk(KERN_INFO "%s: reg %d val %04x\n", __func__, reg, value);
++
+ /* data is
+ * D15..D9 WM8731 register offset
+ * D8...D0 register data
+@@ -521,7 +525,11 @@
+ if (codec->reg_cache == NULL)
+ return -ENOMEM;
+
+- wm8731_reset(codec);
++ ret = wm8731_reset(codec);
++ if (ret < 0) {
++ printk(KERN_ERR "wm8731: failed to send reset\n");
++ return -EIO;
++ }
+
+ /* register pcms */
+ ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/sound/soc/codecs/wm8753.c linux-2.6.29-rc3.owrt.om/sound/soc/codecs/wm8753.c
+--- linux-2.6.29-rc3.owrt/sound/soc/codecs/wm8753.c 2009-05-10 22:09:10.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/sound/soc/codecs/wm8753.c 2009-05-10 22:28:00.000000000 +0200
+@@ -51,8 +51,6 @@
+
+ #include "wm8753.h"
+
+-#define WM8753_VERSION "0.16"
+-
+ static int caps_charge = 2000;
+ module_param(caps_charge, int, 0);
+ MODULE_PARM_DESC(caps_charge, "WM8753 cap charge time (msecs)");
+@@ -60,12 +58,6 @@
+ static void wm8753_set_dai_mode(struct snd_soc_codec *codec,
+ unsigned int mode);
+
+-/* codec private data */
+-struct wm8753_priv {
+- unsigned int sysclk;
+- unsigned int pcmclk;
+-};
+-
+ /*
+ * wm8753 register cache
+ * We can't read the WM8753 register space when we
+@@ -90,6 +82,14 @@
+ 0x0000, 0x0000
+ };
+
++/* codec private data */
++struct wm8753_priv {
++ unsigned int sysclk;
++ unsigned int pcmclk;
++ struct snd_soc_codec codec;
++ u16 reg_cache[ARRAY_SIZE(wm8753_reg)];
++};
++
+ /*
+ * read wm8753 register cache
+ */
+@@ -1451,7 +1451,15 @@
+ },
+ };
+
+-struct snd_soc_dai wm8753_dai[2];
++struct snd_soc_dai wm8753_dai[2] = {
++ {
++ .name = "dummy1"
++ },
++ {
++ .name = "dummy2"
++ },
++};
++
+ EXPORT_SYMBOL_GPL(wm8753_dai);
+
+ static void wm8753_set_dai_mode(struct snd_soc_codec *codec, unsigned int mode)
+@@ -1459,30 +1467,35 @@
+ if (mode < 4) {
+ int playback_active, capture_active, codec_active, pop_wait;
+ void *private_data;
++ struct list_head list;
+
+ playback_active = wm8753_dai[0].playback.active;
+ capture_active = wm8753_dai[0].capture.active;
+ codec_active = wm8753_dai[0].active;
+ private_data = wm8753_dai[0].private_data;
+ pop_wait = wm8753_dai[0].pop_wait;
++ list = wm8753_dai[0].list;
+ wm8753_dai[0] = wm8753_all_dai[mode << 1];
+ wm8753_dai[0].playback.active = playback_active;
+ wm8753_dai[0].capture.active = capture_active;
+ wm8753_dai[0].active = codec_active;
+ wm8753_dai[0].private_data = private_data;
+ wm8753_dai[0].pop_wait = pop_wait;
++ wm8753_dai[0].list = list;
+
+ playback_active = wm8753_dai[1].playback.active;
+ capture_active = wm8753_dai[1].capture.active;
+ codec_active = wm8753_dai[1].active;
+ private_data = wm8753_dai[1].private_data;
+ pop_wait = wm8753_dai[1].pop_wait;
++ list = wm8753_dai[1].list;
+ wm8753_dai[1] = wm8753_all_dai[(mode << 1) + 1];
+ wm8753_dai[1].playback.active = playback_active;
+ wm8753_dai[1].capture.active = capture_active;
+ wm8753_dai[1].active = codec_active;
+ wm8753_dai[1].private_data = private_data;
+ wm8753_dai[1].pop_wait = pop_wait;
++ wm8753_dai[1].list = list;
+ }
+ wm8753_dai[0].codec = codec;
+ wm8753_dai[1].codec = codec;
+@@ -1524,6 +1537,11 @@
+ for (i = 0; i < ARRAY_SIZE(wm8753_reg); i++) {
+ if (i + 1 == WM8753_RESET)
+ continue;
++
++ /* No point in writing hardware default values back */
++ if (cache[i] == wm8753_reg[i])
++ continue;
++
+ data[0] = ((i + 1) << 1) | ((cache[i] >> 8) & 0x0001);
+ data[1] = cache[i] & 0x00ff;
+ codec->hw_write(codec->control_data, data, 2);
+@@ -1542,44 +1560,133 @@
+ return 0;
+ }
+
++static struct snd_soc_codec *wm8753_codec;
++
++static int wm8753_probe(struct platform_device *pdev)
++{
++ struct snd_soc_device *socdev = platform_get_drvdata(pdev);
++ struct snd_soc_codec *codec;
++ int ret = 0;
++
++ if (!wm8753_codec) {
++ dev_err(&pdev->dev, "WM8753 codec not yet registered\n");
++ return -EINVAL;
++ }
++
++ socdev->codec = wm8753_codec;
++ codec = wm8753_codec;
++
++ wm8753_set_dai_mode(codec, 0);
++
++ /* register pcms */
++ ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
++ if (ret < 0) {
++ printk(KERN_ERR "wm8753: failed to create pcms\n");
++ goto pcm_err;
++ }
++
++ wm8753_add_controls(codec);
++ wm8753_add_widgets(codec);
++ ret = snd_soc_init_card(socdev);
++ if (ret < 0) {
++ printk(KERN_ERR "wm8753: failed to register card\n");
++ goto card_err;
++ }
++
++ return 0;
++
++card_err:
++ snd_soc_free_pcms(socdev);
++ snd_soc_dapm_free(socdev);
++
++pcm_err:
++ return ret;
++}
++
+ /*
+- * initialise the WM8753 driver
+- * register the mixer and dsp interfaces with the kernel
++ * This function forces any delayed work to be queued and run.
+ */
+-static int wm8753_init(struct snd_soc_device *socdev)
++static int run_delayed_work(struct delayed_work *dwork)
+ {
+- struct snd_soc_codec *codec = socdev->codec;
+- int reg, ret = 0;
++ int ret;
++
++ /* cancel any work waiting to be queued. */
++ ret = cancel_delayed_work(dwork);
++
++ /* if there was any work waiting then we run it now and
++ * wait for it's completion */
++ if (ret) {
++ schedule_delayed_work(dwork, 0);
++ flush_scheduled_work();
++ }
++ return ret;
++}
++
++/* power down chip */
++static int wm8753_remove(struct platform_device *pdev)
++{
++ struct snd_soc_device *socdev = platform_get_drvdata(pdev);
++
++ snd_soc_free_pcms(socdev);
++ snd_soc_dapm_free(socdev);
++
++ return 0;
++}
++
++struct snd_soc_codec_device soc_codec_dev_wm8753 = {
++ .probe = wm8753_probe,
++ .remove = wm8753_remove,
++ .suspend = wm8753_suspend,
++ .resume = wm8753_resume,
++};
++EXPORT_SYMBOL_GPL(soc_codec_dev_wm8753);
++
++static int wm8753_register(struct wm8753_priv *wm8753)
++{
++ int ret, i;
++ struct snd_soc_codec *codec = &wm8753->codec;
++ u16 reg;
++
++ if (wm8753_codec) {
++ dev_err(codec->dev, "Multiple WM8753 devices not supported\n");
++ ret = -EINVAL;
++ goto err;
++ }
++
++ mutex_init(&codec->mutex);
++ INIT_LIST_HEAD(&codec->dapm_widgets);
++ INIT_LIST_HEAD(&codec->dapm_paths);
+
+ codec->name = "WM8753";
+ codec->owner = THIS_MODULE;
+ codec->read = wm8753_read_reg_cache;
+ codec->write = wm8753_write;
++ codec->bias_level = SND_SOC_BIAS_STANDBY;
+ codec->set_bias_level = wm8753_set_bias_level;
+ codec->dai = wm8753_dai;
+ codec->num_dai = 2;
+- codec->reg_cache_size = ARRAY_SIZE(wm8753_reg);
+- codec->reg_cache = kmemdup(wm8753_reg, sizeof(wm8753_reg), GFP_KERNEL);
+-
+- if (codec->reg_cache == NULL)
+- return -ENOMEM;
+-
+- wm8753_set_dai_mode(codec, 0);
++ codec->reg_cache_size = ARRAY_SIZE(wm8753->reg_cache);
++ codec->reg_cache = &wm8753->reg_cache;
++ codec->private_data = wm8753;
+
+- wm8753_reset(codec);
++ memcpy(codec->reg_cache, wm8753_reg, sizeof(codec->reg_cache));
++ INIT_DELAYED_WORK(&codec->delayed_work, wm8753_work);
+
+- /* register pcms */
+- ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
++ ret = wm8753_reset(codec);
+ if (ret < 0) {
+- printk(KERN_ERR "wm8753: failed to create pcms\n");
+- goto pcm_err;
++ dev_err(codec->dev, "Failed to issue reset\n");
++ goto err;
+ }
+
+ /* charge output caps */
+ wm8753_set_bias_level(codec, SND_SOC_BIAS_PREPARE);
+- codec->bias_level = SND_SOC_BIAS_STANDBY;
+ schedule_delayed_work(&codec->delayed_work,
+- msecs_to_jiffies(caps_charge));
++ msecs_to_jiffies(caps_charge));
++
++ /* OpenMoko specific bodge for
++ * http://bugzilla.openmoko.org/cgi-bin/bugzilla/show_bug.cgi?id=1172
++ */
++ wm8753_write(codec, WM8753_ADCTL2, 0x0000);
+
+ /* set the update bits */
+ reg = wm8753_read_reg_cache(codec, WM8753_LDAC);
+@@ -1603,58 +1710,69 @@
+ reg = wm8753_read_reg_cache(codec, WM8753_RINVOL);
+ wm8753_write(codec, WM8753_RINVOL, reg | 0x0100);
+
+- wm8753_add_controls(codec);
+- wm8753_add_widgets(codec);
+- ret = snd_soc_init_card(socdev);
+- if (ret < 0) {
+- printk(KERN_ERR "wm8753: failed to register card\n");
+- goto card_err;
++ wm8753_codec = codec;
++
++ for (i = 0; i < ARRAY_SIZE(wm8753_dai); i++)
++ wm8753_dai[i].dev = codec->dev;
++
++ ret = snd_soc_register_codec(codec);
++ if (ret != 0) {
++ dev_err(codec->dev, "Failed to register codec: %d\n", ret);
++ goto err;
+ }
+
+- return ret;
++ ret = snd_soc_register_dais(&wm8753_dai[0], ARRAY_SIZE(wm8753_dai));
++ if (ret != 0) {
++ dev_err(codec->dev, "Failed to register DAIs: %d\n", ret);
++ goto err_codec;
++ }
+
+-card_err:
+- snd_soc_free_pcms(socdev);
+- snd_soc_dapm_free(socdev);
+-pcm_err:
+- kfree(codec->reg_cache);
++ return 0;
++
++err_codec:
++ run_delayed_work(&codec->delayed_work);
++ snd_soc_unregister_codec(codec);
++err:
++ kfree(wm8753);
+ return ret;
+ }
+
+-/* If the i2c layer weren't so broken, we could pass this kind of data
+- around */
+-static struct snd_soc_device *wm8753_socdev;
++static void wm8753_unregister(struct wm8753_priv *wm8753)
++{
++ wm8753_set_bias_level(&wm8753->codec, SND_SOC_BIAS_OFF);
++ run_delayed_work(&wm8753->codec.delayed_work);
++ snd_soc_unregister_dais(&wm8753_dai[0], ARRAY_SIZE(wm8753_dai));
++ snd_soc_unregister_codec(&wm8753->codec);
++ kfree(wm8753);
++ wm8753_codec = NULL;
++}
+
+ #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+
+-/*
+- * WM8753 2 wire address is determined by GPIO5
+- * state during powerup.
+- * low = 0x1a
+- * high = 0x1b
+- */
+-
+ static int wm8753_i2c_probe(struct i2c_client *i2c,
+ const struct i2c_device_id *id)
+ {
+- struct snd_soc_device *socdev = wm8753_socdev;
+- struct snd_soc_codec *codec = socdev->codec;
+- int ret;
++ struct snd_soc_codec *codec;
++ struct wm8753_priv *wm8753;
+
+- i2c_set_clientdata(i2c, codec);
++ wm8753 = kzalloc(sizeof(struct wm8753_priv), GFP_KERNEL);
++ if (wm8753 == NULL)
++ return -ENOMEM;
++
++ codec = &wm8753->codec;
++ codec->hw_write = (hw_write_t)i2c_master_send;
+ codec->control_data = i2c;
++ i2c_set_clientdata(i2c, wm8753);
+
+- ret = wm8753_init(socdev);
+- if (ret < 0)
+- pr_err("failed to initialise WM8753\n");
++ codec->dev = &i2c->dev;
+
+- return ret;
++ return wm8753_register(wm8753);
+ }
+
+ static int wm8753_i2c_remove(struct i2c_client *client)
+ {
+- struct snd_soc_codec *codec = i2c_get_clientdata(client);
+- kfree(codec->reg_cache);
++ struct wm8753_priv *wm8753 = i2c_get_clientdata(client);
++ wm8753_unregister(wm8753);
+ return 0;
+ }
+
+@@ -1666,86 +1784,16 @@
+
+ static struct i2c_driver wm8753_i2c_driver = {
+ .driver = {
+- .name = "WM8753 I2C Codec",
++ .name = "wm8753",
+ .owner = THIS_MODULE,
+ },
+ .probe = wm8753_i2c_probe,
+ .remove = wm8753_i2c_remove,
+ .id_table = wm8753_i2c_id,
+ };
+-
+-static int wm8753_add_i2c_device(struct platform_device *pdev,
+- const struct wm8753_setup_data *setup)
+-{
+- struct i2c_board_info info;
+- struct i2c_adapter *adapter;
+- struct i2c_client *client;
+- int ret;
+-
+- ret = i2c_add_driver(&wm8753_i2c_driver);
+- if (ret != 0) {
+- dev_err(&pdev->dev, "can't add i2c driver\n");
+- return ret;
+- }
+-
+- memset(&info, 0, sizeof(struct i2c_board_info));
+- info.addr = setup->i2c_address;
+- strlcpy(info.type, "wm8753", I2C_NAME_SIZE);
+-
+- adapter = i2c_get_adapter(setup->i2c_bus);
+- if (!adapter) {
+- dev_err(&pdev->dev, "can't get i2c adapter %d\n",
+- setup->i2c_bus);
+- goto err_driver;
+- }
+-
+- client = i2c_new_device(adapter, &info);
+- i2c_put_adapter(adapter);
+- if (!client) {
+- dev_err(&pdev->dev, "can't add i2c device at 0x%x\n",
+- (unsigned int)info.addr);
+- goto err_driver;
+- }
+-
+- return 0;
+-
+-err_driver:
+- i2c_del_driver(&wm8753_i2c_driver);
+- return -ENODEV;
+-}
+ #endif
+
+ #if defined(CONFIG_SPI_MASTER)
+-static int __devinit wm8753_spi_probe(struct spi_device *spi)
+-{
+- struct snd_soc_device *socdev = wm8753_socdev;
+- struct snd_soc_codec *codec = socdev->codec;
+- int ret;
+-
+- codec->control_data = spi;
+-
+- ret = wm8753_init(socdev);
+- if (ret < 0)
+- dev_err(&spi->dev, "failed to initialise WM8753\n");
+-
+- return ret;
+-}
+-
+-static int __devexit wm8753_spi_remove(struct spi_device *spi)
+-{
+- return 0;
+-}
+-
+-static struct spi_driver wm8753_spi_driver = {
+- .driver = {
+- .name = "wm8753",
+- .bus = &spi_bus_type,
+- .owner = THIS_MODULE,
+- },
+- .probe = wm8753_spi_probe,
+- .remove = __devexit_p(wm8753_spi_remove),
+-};
+-
+ static int wm8753_spi_write(struct spi_device *spi, const char *data, int len)
+ {
+ struct spi_transfer t;
+@@ -1769,120 +1817,69 @@
+
+ return len;
+ }
+-#endif
+-
+
+-static int wm8753_probe(struct platform_device *pdev)
++static int __devinit wm8753_spi_probe(struct spi_device *spi)
+ {
+- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
+- struct wm8753_setup_data *setup;
+ struct snd_soc_codec *codec;
+ struct wm8753_priv *wm8753;
+- int ret = 0;
+-
+- pr_info("WM8753 Audio Codec %s", WM8753_VERSION);
+-
+- setup = socdev->codec_data;
+- codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
+- if (codec == NULL)
+- return -ENOMEM;
+
+ wm8753 = kzalloc(sizeof(struct wm8753_priv), GFP_KERNEL);
+- if (wm8753 == NULL) {
+- kfree(codec);
++ if (wm8753 == NULL)
+ return -ENOMEM;
+- }
+
+- codec->private_data = wm8753;
+- socdev->codec = codec;
+- mutex_init(&codec->mutex);
+- INIT_LIST_HEAD(&codec->dapm_widgets);
+- INIT_LIST_HEAD(&codec->dapm_paths);
+- wm8753_socdev = socdev;
+- INIT_DELAYED_WORK(&codec->delayed_work, wm8753_work);
++ codec = &wm8753->codec;
++ codec->control_data = spi;
++ codec->hw_write = (hw_write_t)wm8753_spi_write;
++ codec->dev = &spi->dev;
+
+-#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+- if (setup->i2c_address) {
+- codec->hw_write = (hw_write_t)i2c_master_send;
+- ret = wm8753_add_i2c_device(pdev, setup);
+- }
+-#endif
+-#if defined(CONFIG_SPI_MASTER)
+- if (setup->spi) {
+- codec->hw_write = (hw_write_t)wm8753_spi_write;
+- ret = spi_register_driver(&wm8753_spi_driver);
+- if (ret != 0)
+- printk(KERN_ERR "can't add spi driver");
+- }
+-#endif
++ spi->dev.driver_data = wm8753;
+
+- if (ret != 0) {
+- kfree(codec->private_data);
+- kfree(codec);
+- }
+- return ret;
++ return wm8753_register(wm8753);
+ }
+
+-/*
+- * This function forces any delayed work to be queued and run.
+- */
+-static int run_delayed_work(struct delayed_work *dwork)
++static int __devexit wm8753_spi_remove(struct spi_device *spi)
+ {
+- int ret;
+-
+- /* cancel any work waiting to be queued. */
+- ret = cancel_delayed_work(dwork);
+-
+- /* if there was any work waiting then we run it now and
+- * wait for it's completion */
+- if (ret) {
+- schedule_delayed_work(dwork, 0);
+- flush_scheduled_work();
+- }
+- return ret;
++ struct wm8753_priv *wm8753 = spi->dev.driver_data;
++ wm8753_unregister(wm8753);
++ return 0;
+ }
+
+-/* power down chip */
+-static int wm8753_remove(struct platform_device *pdev)
+-{
+- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
+- struct snd_soc_codec *codec = socdev->codec;
++static struct spi_driver wm8753_spi_driver = {
++ .driver = {
++ .name = "wm8753",
++ .bus = &spi_bus_type,
++ .owner = THIS_MODULE,
++ },
++ .probe = wm8753_spi_probe,
++ .remove = __devexit_p(wm8753_spi_remove),
++};
++#endif
+
+- if (codec->control_data)
+- wm8753_set_bias_level(codec, SND_SOC_BIAS_OFF);
+- run_delayed_work(&codec->delayed_work);
+- snd_soc_free_pcms(socdev);
+- snd_soc_dapm_free(socdev);
++static int __init wm8753_modinit(void)
++{
++ int ret;
+ #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+- i2c_unregister_device(codec->control_data);
+- i2c_del_driver(&wm8753_i2c_driver);
++ ret = i2c_add_driver(&wm8753_i2c_driver);
++ if (ret != 0)
++ pr_err("Failed to register WM8753 I2C driver: %d\n", ret);
+ #endif
+ #if defined(CONFIG_SPI_MASTER)
+- spi_unregister_driver(&wm8753_spi_driver);
++ ret = spi_register_driver(&wm8753_spi_driver);
++ if (ret != 0)
++ pr_err("Failed to register WM8753 SPI driver: %d\n", ret);
+ #endif
+- kfree(codec->private_data);
+- kfree(codec);
+-
+ return 0;
+ }
+-
+-struct snd_soc_codec_device soc_codec_dev_wm8753 = {
+- .probe = wm8753_probe,
+- .remove = wm8753_remove,
+- .suspend = wm8753_suspend,
+- .resume = wm8753_resume,
+-};
+-EXPORT_SYMBOL_GPL(soc_codec_dev_wm8753);
+-
+-static int __init wm8753_modinit(void)
+-{
+- return snd_soc_register_dais(wm8753_dai, ARRAY_SIZE(wm8753_dai));
+-}
+ module_init(wm8753_modinit);
+
+ static void __exit wm8753_exit(void)
+ {
+- snd_soc_unregister_dais(wm8753_dai, ARRAY_SIZE(wm8753_dai));
++#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
++ i2c_del_driver(&wm8753_i2c_driver);
++#endif
++#if defined(CONFIG_SPI_MASTER)
++ spi_unregister_driver(&wm8753_spi_driver);
++#endif
+ }
+ module_exit(wm8753_exit);
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/sound/soc/codecs/wm8753.h linux-2.6.29-rc3.owrt.om/sound/soc/codecs/wm8753.h
+--- linux-2.6.29-rc3.owrt/sound/soc/codecs/wm8753.h 2009-05-10 22:05:01.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/sound/soc/codecs/wm8753.h 2009-05-10 22:28:00.000000000 +0200
+@@ -77,12 +77,6 @@
+ #define WM8753_BIASCTL 0x3d
+ #define WM8753_ADCTL2 0x3f
+
+-struct wm8753_setup_data {
+- int spi;
+- int i2c_bus;
+- unsigned short i2c_address;
+-};
+-
+ #define WM8753_PLL1 0
+ #define WM8753_PLL2 1
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/jive_wm8750.c linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/jive_wm8750.c
+--- linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/jive_wm8750.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/jive_wm8750.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,216 @@
++/* sound/soc/s3c24xx/jive_wm8750.c
++ *
++ * Copyright 2007,2008 Simtec Electronics
++ *
++ * Based on sound/soc/pxa/spitz.c
++ * Copyright 2005 Wolfson Microelectronics PLC.
++ * Copyright 2005 Openedhand Ltd.
++ *
++ * 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.
++*/
++
++#include <linux/module.h>
++#include <linux/moduleparam.h>
++#include <linux/timer.h>
++#include <linux/interrupt.h>
++#include <linux/platform_device.h>
++#include <linux/clk.h>
++
++#include <sound/core.h>
++#include <sound/pcm.h>
++#include <sound/soc.h>
++#include <sound/soc-dapm.h>
++
++#include <asm/mach-types.h>
++
++#include "s3c24xx-pcm.h"
++#include "s3c2412-i2s.h"
++
++#include "../codecs/wm8750.h"
++
++static const struct snd_soc_dapm_route audio_map[] = {
++ { "Headphone Jack", NULL, "LOUT1" },
++ { "Headphone Jack", NULL, "ROUT1" },
++ { "Internal Speaker", NULL, "LOUT2" },
++ { "Internal Speaker", NULL, "ROUT2" },
++ { "LINPUT1", NULL, "Line Input" },
++ { "RINPUT1", NULL, "Line Input" },
++};
++
++static const struct snd_soc_dapm_widget wm8750_dapm_widgets[] = {
++ SND_SOC_DAPM_HP("Headphone Jack", NULL),
++ SND_SOC_DAPM_SPK("Internal Speaker", NULL),
++ SND_SOC_DAPM_LINE("Line In", NULL),
++};
++
++static int jive_startup(struct snd_pcm_substream *substream)
++{
++ struct snd_soc_pcm_runtime *rtd = substream->private_data;
++ struct snd_soc_codec *codec = rtd->socdev->codec;
++
++ snd_soc_dapm_enable_pin(codec, "Headphone Jack");
++ snd_soc_dapm_enable_pin(codec, "Internal Speaker");
++ snd_soc_dapm_enable_pin(codec, "Line In");
++
++ snd_soc_dapm_sync(codec);
++
++ return 0;
++}
++
++static int jive_hw_params(struct snd_pcm_substream *substream,
++ struct snd_pcm_hw_params *params)
++{
++ struct snd_soc_pcm_runtime *rtd = substream->private_data;
++ struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
++ struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
++ struct s3c_i2sv2_rate_calc div;
++ unsigned int clk = 0;
++ int ret = 0;
++
++ switch (params_rate(params)) {
++ case 8000:
++ case 16000:
++ case 48000:
++ case 96000:
++ clk = 12288000;
++ break;
++ case 11025:
++ case 22050:
++ case 44100:
++ clk = 11289600;
++ break;
++ }
++
++ s3c_i2sv2_calc_rate(&div, NULL, params_rate(params),
++ s3c2412_get_iisclk());
++
++ /* set codec DAI configuration */
++ ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S |
++ SND_SOC_DAIFMT_NB_NF |
++ SND_SOC_DAIFMT_CBS_CFS);
++ if (ret < 0)
++ return ret;
++
++ /* set cpu DAI configuration */
++ ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S |
++ SND_SOC_DAIFMT_NB_NF |
++ SND_SOC_DAIFMT_CBS_CFS);
++ if (ret < 0)
++ return ret;
++
++ /* set the codec system clock for DAC and ADC */
++ ret = snd_soc_dai_set_sysclk(codec_dai, WM8750_SYSCLK, clk,
++ SND_SOC_CLOCK_IN);
++ if (ret < 0)
++ return ret;
++
++ ret = snd_soc_dai_set_clkdiv(cpu_dai, S3C2412_DIV_RCLK, div.fs_div);
++ if (ret < 0)
++ return ret;
++
++ ret = snd_soc_dai_set_clkdiv(cpu_dai, S3C2412_DIV_PRESCALER,
++ div.clk_div - 1);
++ if (ret < 0)
++ return ret;
++
++ return 0;
++}
++
++static struct snd_soc_ops jive_ops = {
++ .startup = jive_startup,
++ .hw_params = jive_hw_params,
++};
++
++static int jive_wm8750_init(struct snd_soc_codec *codec)
++{
++ int err;
++
++ /* These endpoints are not being used. */
++ snd_soc_dapm_disable_pin(codec, "LINPUT2");
++ snd_soc_dapm_disable_pin(codec, "RINPUT2");
++ snd_soc_dapm_disable_pin(codec, "LINPUT3");
++ snd_soc_dapm_disable_pin(codec, "RINPUT3");
++ snd_soc_dapm_disable_pin(codec, "OUT3");
++ snd_soc_dapm_disable_pin(codec, "MONO");
++
++ /* Add jive specific widgets */
++ err = snd_soc_dapm_new_controls(codec, wm8750_dapm_widgets,
++ ARRAY_SIZE(wm8750_dapm_widgets));
++ if (err) {
++ printk(KERN_ERR "%s: failed to add widgets (%d)\n",
++ __func__, err);
++ return err;
++ }
++
++ snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map));
++ snd_soc_dapm_sync(codec);
++
++ return 0;
++}
++
++static struct snd_soc_dai_link jive_dai = {
++ .name = "wm8750",
++ .stream_name = "WM8750",
++ .cpu_dai = &s3c2412_i2s_dai,
++ .codec_dai = &wm8750_dai,
++ .init = jive_wm8750_init,
++ .ops = &jive_ops,
++};
++
++/* jive audio machine driver */
++static struct snd_soc_machine snd_soc_machine_jive = {
++ .name = "Jive",
++ .dai_link = &jive_dai,
++ .num_links = 1,
++};
++
++/* jive audio private data */
++static struct wm8750_setup_data jive_wm8750_setup = {
++};
++
++/* jive audio subsystem */
++static struct snd_soc_device jive_snd_devdata = {
++ .machine = &snd_soc_machine_jive,
++ .platform = &s3c24xx_soc_platform,
++ .codec_dev = &soc_codec_dev_wm8750_spi,
++ .codec_data = &jive_wm8750_setup,
++};
++
++static struct platform_device *jive_snd_device;
++
++static int __init jive_init(void)
++{
++ int ret;
++
++ if (!machine_is_jive())
++ return 0;
++
++ printk("JIVE WM8750 Audio support\n");
++
++ jive_snd_device = platform_device_alloc("soc-audio", -1);
++ if (!jive_snd_device)
++ return -ENOMEM;
++
++ platform_set_drvdata(jive_snd_device, &jive_snd_devdata);
++ jive_snd_devdata.dev = &jive_snd_device->dev;
++ ret = platform_device_add(jive_snd_device);
++
++ if (ret)
++ platform_device_put(jive_snd_device);
++
++ return ret;
++}
++
++static void __exit jive_exit(void)
++{
++ platform_device_unregister(jive_snd_device);
++}
++
++module_init(jive_init);
++module_exit(jive_exit);
++
++MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>");
++MODULE_DESCRIPTION("ALSA SoC Jive Audio support");
++MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/Kconfig linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/Kconfig
+--- linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/Kconfig 2009-05-10 22:05:01.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/Kconfig 2009-05-10 22:28:00.000000000 +0200
+@@ -1,6 +1,6 @@
+ config SND_S3C24XX_SOC
+ tristate "SoC Audio for the Samsung S3C24XX chips"
+- depends on ARCH_S3C2410
++ depends on ARCH_S3C2410 || ARCH_S3C64XX
+ help
+ Say Y or M if you want to add support for codecs attached to
+ the S3C24XX AC97, I2S or SSP interface. You will also need
+@@ -9,8 +9,16 @@
+ config SND_S3C24XX_SOC_I2S
+ tristate
+
++config SND_S3C_I2SV2_SOC
++ tristate
++
+ config SND_S3C2412_SOC_I2S
+ tristate
++ select SND_S3C_I2SV2_SOC
++
++config SND_S3C64XX_SOC_I2S
++ tristate
++ select SND_S3C_I2SV2_SOC
+
+ config SND_S3C2443_SOC_AC97
+ tristate
+@@ -26,6 +34,33 @@
+ Say Y if you want to add support for SoC audio on smdk2440
+ with the WM8753.
+
++config SND_S3C24XX_SOC_JIVE_WM8750
++ tristate "SoC I2S Audio support for Jive"
++ depends on SND_S3C24XX_SOC && MACH_JIVE
++ select SND_SOC_WM8750
++ select SND_SOC_WM8750_SPI
++ select SND_S3C2412_SOC_I2S
++ help
++ Sat Y if you want to add support for SoC audio on the Jive.
++
++config SND_S3C24XX_SOC_NEO1973_GTA02_WM8753
++ tristate "SoC I2S Audio support for NEO1973 GTA02 - WM8753"
++ depends on SND_S3C24XX_SOC && MACH_NEO1973_GTA02
++ select SND_S3C24XX_SOC_I2S
++ select SND_SOC_WM8753
++ help
++ Say Y if you want to add support for SoC audio on neo1973 gta02
++ with the WM8753 codec
++
++config SND_S3C24XX_SOC_OM_3D7K_WM8753
++ tristate "SoC I2S Audio support for OM 3D7K - WM8753"
++ depends on SND_S3C24XX_SOC && MACH_OM_3D7K
++ select SND_S3C64XX_SOC_I2S
++ select SND_SOC_WM8753
++ help
++ Say Y if you want support for SoC audio on Openmoko 3D7K
++ with the WM8753 codec.
++
+ config SND_S3C24XX_SOC_SMDK2443_WM9710
+ tristate "SoC AC97 Audio support for SMDK2443 - WM9710"
+ depends on SND_S3C24XX_SOC && MACH_SMDK2443
+@@ -49,3 +84,11 @@
+ depends on SND_S3C24XX_SOC
+ select SND_S3C24XX_SOC_I2S
+ select SND_SOC_UDA134X
++
++config SND_S3C64XX_SOC_SMDK6410_WM8731
++ tristate "SoC I2S Audio support for WM8731 added to an SMDK6410"
++ depends on SND_S3C24XX_SOC
++ select SND_S3C64XX_SOC_I2S
++ select SND_SOC_WM8731
++ help
++ Support for an WM8731 add-on board on I2S channel 0 on an SMDK6410
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/Makefile linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/Makefile
+--- linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/Makefile 2009-05-10 22:05:01.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/Makefile 2009-05-10 22:28:00.000000000 +0200
+@@ -2,20 +2,32 @@
+ snd-soc-s3c24xx-objs := s3c24xx-pcm.o
+ snd-soc-s3c24xx-i2s-objs := s3c24xx-i2s.o
+ snd-soc-s3c2412-i2s-objs := s3c2412-i2s.o
++snd-soc-s3c64xx-i2s-objs := s3c64xx-i2s.o
+ snd-soc-s3c2443-ac97-objs := s3c2443-ac97.o
++snd-soc-s3c-i2s-v2-objs := s3c-i2s-v2.o
+
+ obj-$(CONFIG_SND_S3C24XX_SOC) += snd-soc-s3c24xx.o
+ obj-$(CONFIG_SND_S3C24XX_SOC_I2S) += snd-soc-s3c24xx-i2s.o
+ obj-$(CONFIG_SND_S3C2443_SOC_AC97) += snd-soc-s3c2443-ac97.o
+ obj-$(CONFIG_SND_S3C2412_SOC_I2S) += snd-soc-s3c2412-i2s.o
++obj-$(CONFIG_SND_S3C64XX_SOC_I2S) += snd-soc-s3c64xx-i2s.o
++obj-$(CONFIG_SND_S3C_I2SV2_SOC) += snd-soc-s3c-i2s-v2.o
+
+ # S3C24XX Machine Support
++snd-soc-jive-wm8750-objs := jive_wm8750.o
+ snd-soc-neo1973-wm8753-objs := neo1973_wm8753.o
+ snd-soc-smdk2443-wm9710-objs := smdk2443_wm9710.o
+ snd-soc-ln2440sbc-alc650-objs := ln2440sbc_alc650.o
+ snd-soc-s3c24xx-uda134x-objs := s3c24xx_uda134x.o
++snd-soc-neo1973-gta02-wm8753-objs := neo1973_gta02_wm8753.o
++snd-soc-om-3d7k-wm8753-objs := om_3d7k_wm8753.o
++snd-soc-smdk6410-wm8731-objs := smdk6410-wm8731.o
+
++obj-$(CONFIG_SND_S3C24XX_SOC_JIVE_WM8750) += snd-soc-jive-wm8750.o
+ obj-$(CONFIG_SND_S3C24XX_SOC_NEO1973_WM8753) += snd-soc-neo1973-wm8753.o
+ obj-$(CONFIG_SND_S3C24XX_SOC_SMDK2443_WM9710) += snd-soc-smdk2443-wm9710.o
+ obj-$(CONFIG_SND_S3C24XX_SOC_LN2440SBC_ALC650) += snd-soc-ln2440sbc-alc650.o
+ obj-$(CONFIG_SND_S3C24XX_SOC_S3C24XX_UDA134X) += snd-soc-s3c24xx-uda134x.o
++obj-$(CONFIG_SND_S3C24XX_SOC_NEO1973_GTA02_WM8753) += snd-soc-neo1973-gta02-wm8753.o
++obj-$(CONFIG_SND_S3C24XX_SOC_OM_3D7K_WM8753) += snd-soc-om-3d7k-wm8753.o
++obj-$(CONFIG_SND_S3C64XX_SOC_SMDK6410_WM8731) += snd-soc-smdk6410-wm8731.o
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/neo1973_gta02_wm8753.c linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/neo1973_gta02_wm8753.c
+--- linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/neo1973_gta02_wm8753.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/neo1973_gta02_wm8753.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,481 @@
++/*
++ * neo1973_gta02_wm8753.c -- SoC audio for Neo1973
++ *
++ * Copyright 2007 Openmoko Inc
++ * Author: Graeme Gregory <graeme@openmoko.org>
++ * Copyright 2007 Wolfson Microelectronics PLC.
++ * Author: Graeme Gregory <linux@wolfsonmicro.com>
++ * Copyright 2009 Wolfson Microelectronics
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++
++#include <linux/module.h>
++#include <linux/moduleparam.h>
++#include <linux/timer.h>
++#include <linux/interrupt.h>
++#include <linux/platform_device.h>
++#include <sound/core.h>
++#include <sound/pcm.h>
++#include <sound/soc.h>
++#include <sound/soc-dapm.h>
++
++#include <asm/mach-types.h>
++
++#include <plat/regs-iis.h>
++
++#include <mach/regs-clock.h>
++#include <mach/regs-gpio.h>
++#include <mach/hardware.h>
++#include <asm/io.h>
++#include <mach/regs-gpioj.h>
++#include <mach/gta02.h>
++#include "../codecs/wm8753.h"
++#include "s3c24xx-pcm.h"
++#include "s3c24xx-i2s.h"
++
++static struct snd_soc_card neo1973_gta02;
++
++static int neo1973_gta02_hifi_hw_params(struct snd_pcm_substream *substream,
++ struct snd_pcm_hw_params *params)
++{
++ struct snd_soc_pcm_runtime *rtd = substream->private_data;
++ struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
++ struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
++ unsigned int pll_out = 0, bclk = 0;
++ int ret = 0;
++ unsigned long iis_clkrate;
++
++ iis_clkrate = s3c24xx_i2s_get_clockrate();
++
++ switch (params_rate(params)) {
++ case 8000:
++ case 16000:
++ pll_out = 12288000;
++ break;
++ case 48000:
++ bclk = WM8753_BCLK_DIV_4;
++ pll_out = 12288000;
++ break;
++ case 96000:
++ bclk = WM8753_BCLK_DIV_2;
++ pll_out = 12288000;
++ break;
++ case 11025:
++ bclk = WM8753_BCLK_DIV_16;
++ pll_out = 11289600;
++ break;
++ case 22050:
++ bclk = WM8753_BCLK_DIV_8;
++ pll_out = 11289600;
++ break;
++ case 44100:
++ bclk = WM8753_BCLK_DIV_4;
++ pll_out = 11289600;
++ break;
++ case 88200:
++ bclk = WM8753_BCLK_DIV_2;
++ pll_out = 11289600;
++ break;
++ }
++
++ /* set codec DAI configuration */
++ ret = snd_soc_dai_set_fmt(codec_dai,
++ SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
++ SND_SOC_DAIFMT_CBM_CFM);
++ if (ret < 0)
++ return ret;
++
++ /* set cpu DAI configuration */
++ ret = snd_soc_dai_set_fmt(cpu_dai,
++ SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
++ SND_SOC_DAIFMT_CBM_CFM);
++ if (ret < 0)
++ return ret;
++
++ /* set the codec system clock for DAC and ADC */
++ ret = snd_soc_dai_set_sysclk(codec_dai, WM8753_MCLK, pll_out,
++ SND_SOC_CLOCK_IN);
++ if (ret < 0)
++ return ret;
++
++ /* set MCLK division for sample rate */
++ ret = snd_soc_dai_set_clkdiv(cpu_dai, S3C24XX_DIV_MCLK,
++ S3C2410_IISMOD_32FS);
++ if (ret < 0)
++ return ret;
++
++ /* set codec BCLK division for sample rate */
++ ret = snd_soc_dai_set_clkdiv(codec_dai,
++ WM8753_BCLKDIV, bclk);
++ if (ret < 0)
++ return ret;
++
++ /* set prescaler division for sample rate */
++ ret = snd_soc_dai_set_clkdiv(cpu_dai, S3C24XX_DIV_PRESCALER,
++ S3C24XX_PRESCALE(4, 4));
++ if (ret < 0)
++ return ret;
++
++ /* codec PLL input is PCLK/4 */
++ ret = snd_soc_dai_set_pll(codec_dai, WM8753_PLL1,
++ iis_clkrate / 4, pll_out);
++ if (ret < 0)
++ return ret;
++
++ return 0;
++}
++
++static int neo1973_gta02_hifi_hw_free(struct snd_pcm_substream *substream)
++{
++ struct snd_soc_pcm_runtime *rtd = substream->private_data;
++ struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
++
++ /* disable the PLL */
++ return snd_soc_dai_set_pll(codec_dai, WM8753_PLL1, 0, 0);
++}
++
++/*
++ * Neo1973 WM8753 HiFi DAI opserations.
++ */
++static struct snd_soc_ops neo1973_gta02_hifi_ops = {
++ .hw_params = neo1973_gta02_hifi_hw_params,
++ .hw_free = neo1973_gta02_hifi_hw_free,
++};
++
++static int neo1973_gta02_voice_hw_params(
++ struct snd_pcm_substream *substream,
++ struct snd_pcm_hw_params *params)
++{
++ struct snd_soc_pcm_runtime *rtd = substream->private_data;
++ struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
++ unsigned int pcmdiv = 0;
++ int ret = 0;
++ unsigned long iis_clkrate;
++
++ iis_clkrate = s3c24xx_i2s_get_clockrate();
++
++ if (params_rate(params) != 8000)
++ return -EINVAL;
++ if (params_channels(params) != 1)
++ return -EINVAL;
++
++ pcmdiv = WM8753_PCM_DIV_6; /* 2.048 MHz */
++
++ /* todo: gg check mode (DSP_B) against CSR datasheet */
++ /* set codec DAI configuration */
++ ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_DSP_B |
++ SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS);
++ if (ret < 0)
++ return ret;
++
++ /* set the codec system clock for DAC and ADC */
++ ret = snd_soc_dai_set_sysclk(codec_dai, WM8753_PCMCLK,
++ 12288000, SND_SOC_CLOCK_IN);
++ if (ret < 0)
++ return ret;
++
++ /* set codec PCM division for sample rate */
++ ret = snd_soc_dai_set_clkdiv(codec_dai, WM8753_PCMDIV,
++ pcmdiv);
++ if (ret < 0)
++ return ret;
++
++ /* configue and enable PLL for 12.288MHz output */
++ ret = snd_soc_dai_set_pll(codec_dai, WM8753_PLL2,
++ iis_clkrate / 4, 12288000);
++ if (ret < 0)
++ return ret;
++
++ return 0;
++}
++
++static int neo1973_gta02_voice_hw_free(struct snd_pcm_substream *substream)
++{
++ struct snd_soc_pcm_runtime *rtd = substream->private_data;
++ struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
++
++ /* disable the PLL */
++ return snd_soc_dai_set_pll(codec_dai, WM8753_PLL2, 0, 0);
++}
++
++static struct snd_soc_ops neo1973_gta02_voice_ops = {
++ .hw_params = neo1973_gta02_voice_hw_params,
++ .hw_free = neo1973_gta02_voice_hw_free,
++};
++
++#define LM4853_AMP 1
++#define LM4853_SPK 2
++
++static u8 lm4853_state;
++
++/* This has no effect, it exists only to maintain compatibility with
++ * existing ALSA state files.
++ */
++static int lm4853_set_state(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ int val = ucontrol->value.integer.value[0];
++
++ if (val)
++ lm4853_state |= LM4853_AMP;
++ else
++ lm4853_state &= ~LM4853_AMP;
++
++ return 0;
++}
++
++static int lm4853_get_state(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ ucontrol->value.integer.value[0] = lm4853_state & LM4853_AMP;
++
++ return 0;
++}
++
++static int lm4853_set_spk(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ int val = ucontrol->value.integer.value[0];
++
++ if (val) {
++ lm4853_state |= LM4853_SPK;
++ s3c2410_gpio_setpin(GTA02_GPIO_HP_IN, 0);
++ } else {
++ lm4853_state &= ~LM4853_SPK;
++ s3c2410_gpio_setpin(GTA02_GPIO_HP_IN, 1);
++ }
++
++ return 0;
++}
++
++static int lm4853_get_spk(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ ucontrol->value.integer.value[0] = (lm4853_state & LM4853_SPK) >> 1;
++
++ return 0;
++}
++
++static int lm4853_event(struct snd_soc_dapm_widget *w,
++ struct snd_kcontrol *k,
++ int event)
++{
++ if (SND_SOC_DAPM_EVENT_ON(event))
++ s3c2410_gpio_setpin(GTA02_GPIO_AMP_SHUT, 0);
++
++ if (SND_SOC_DAPM_EVENT_OFF(event))
++ s3c2410_gpio_setpin(GTA02_GPIO_AMP_SHUT, 1);
++
++ return 0;
++}
++
++static const struct snd_soc_dapm_widget wm8753_dapm_widgets[] = {
++ SND_SOC_DAPM_SPK("Stereo Out", lm4853_event),
++ SND_SOC_DAPM_LINE("GSM Line Out", NULL),
++ SND_SOC_DAPM_LINE("GSM Line In", NULL),
++ SND_SOC_DAPM_MIC("Headset Mic", NULL),
++ SND_SOC_DAPM_MIC("Handset Mic", NULL),
++ SND_SOC_DAPM_SPK("Handset Spk", NULL),
++};
++
++
++/* example machine audio_mapnections */
++static const struct snd_soc_dapm_route audio_map[] = {
++
++ /* Connections to the lm4853 amp */
++ {"Stereo Out", NULL, "LOUT1"},
++ {"Stereo Out", NULL, "ROUT1"},
++
++ /* Connections to the GSM Module */
++ {"GSM Line Out", NULL, "MONO1"},
++ {"GSM Line Out", NULL, "MONO2"},
++ {"RXP", NULL, "GSM Line In"},
++ {"RXN", NULL, "GSM Line In"},
++
++ /* Connections to Headset */
++ {"MIC1", NULL, "Mic Bias"},
++ {"Mic Bias", NULL, "Headset Mic"},
++
++ /* Call Mic */
++ {"MIC2", NULL, "Mic Bias"},
++ {"MIC2N", NULL, "Mic Bias"},
++ {"Mic Bias", NULL, "Handset Mic"},
++
++ /* Call Speaker */
++ {"Handset Spk", NULL, "LOUT2"},
++ {"Handset Spk", NULL, "ROUT2"},
++
++ /* Connect the ALC pins */
++ {"ACIN", NULL, "ACOP"},
++};
++
++static const struct snd_kcontrol_new wm8753_neo1973_gta02_controls[] = {
++ SOC_DAPM_PIN_SWITCH("Stereo Out"),
++ SOC_DAPM_PIN_SWITCH("GSM Line Out"),
++ SOC_DAPM_PIN_SWITCH("GSM Line In"),
++ SOC_DAPM_PIN_SWITCH("Headset Mic"),
++ SOC_DAPM_PIN_SWITCH("Handset Mic"),
++ SOC_DAPM_PIN_SWITCH("Handset Spk"),
++
++ /* This has no effect, it exists only to maintain compatibility with
++ * existing ALSA state files.
++ */
++ SOC_SINGLE_EXT("Amp State Switch", 6, 0, 1, 0,
++ lm4853_get_state,
++ lm4853_set_state),
++ SOC_SINGLE_EXT("Amp Spk Switch", 7, 0, 1, 0,
++ lm4853_get_spk,
++ lm4853_set_spk),
++};
++
++/*
++ * This is an example machine initialisation for a wm8753 connected to a
++ * neo1973 GTA02.
++ */
++static int neo1973_gta02_wm8753_init(struct snd_soc_codec *codec)
++{
++ int i, err;
++
++ /* set up NC codec pins */
++ snd_soc_dapm_nc_pin(codec, "OUT3");
++ snd_soc_dapm_nc_pin(codec, "OUT4");
++ snd_soc_dapm_nc_pin(codec, "LINE1");
++ snd_soc_dapm_nc_pin(codec, "LINE2");
++
++ /* Add neo1973 gta02 specific widgets */
++ snd_soc_dapm_new_controls(codec, wm8753_dapm_widgets,
++ ARRAY_SIZE(wm8753_dapm_widgets));
++
++ /* add neo1973 gta02 specific controls */
++ for (i = 0; i < ARRAY_SIZE(wm8753_neo1973_gta02_controls); i++) {
++ err = snd_ctl_add(codec->card,
++ snd_soc_cnew(&wm8753_neo1973_gta02_controls[i],
++ codec, NULL));
++ if (err < 0)
++ return err;
++ }
++
++ /* set up neo1973 gta02 specific audio path audio_map */
++ snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map));
++
++ /* set endpoints to default off mode */
++ snd_soc_dapm_disable_pin(codec, "Stereo Out");
++ snd_soc_dapm_disable_pin(codec, "GSM Line Out");
++ snd_soc_dapm_disable_pin(codec, "GSM Line In");
++ snd_soc_dapm_disable_pin(codec, "Headset Mic");
++ snd_soc_dapm_disable_pin(codec, "Handset Mic");
++ snd_soc_dapm_disable_pin(codec, "Handset Spk");
++
++ snd_soc_dapm_sync(codec);
++
++ return 0;
++}
++
++/*
++ * BT Codec DAI
++ */
++static struct snd_soc_dai bt_dai = {
++ .name = "Bluetooth",
++ .id = 0,
++ .playback = {
++ .channels_min = 1,
++ .channels_max = 1,
++ .rates = SNDRV_PCM_RATE_8000,
++ .formats = SNDRV_PCM_FMTBIT_S16_LE,},
++ .capture = {
++ .channels_min = 1,
++ .channels_max = 1,
++ .rates = SNDRV_PCM_RATE_8000,
++ .formats = SNDRV_PCM_FMTBIT_S16_LE,},
++};
++
++static struct snd_soc_dai_link neo1973_gta02_dai[] = {
++{ /* Hifi Playback - for similatious use with voice below */
++ .name = "WM8753",
++ .stream_name = "WM8753 HiFi",
++ .cpu_dai = &s3c24xx_i2s_dai,
++ .codec_dai = &wm8753_dai[WM8753_DAI_HIFI],
++ .init = neo1973_gta02_wm8753_init,
++ .ops = &neo1973_gta02_hifi_ops,
++},
++{ /* Voice via BT */
++ .name = "Bluetooth",
++ .stream_name = "Voice",
++ .cpu_dai = &bt_dai,
++ .codec_dai = &wm8753_dai[WM8753_DAI_VOICE],
++ .ops = &neo1973_gta02_voice_ops,
++},
++};
++
++static struct snd_soc_card neo1973_gta02 = {
++ .name = "neo1973-gta02",
++ .platform = &s3c24xx_soc_platform,
++ .dai_link = neo1973_gta02_dai,
++ .num_links = ARRAY_SIZE(neo1973_gta02_dai),
++};
++
++static struct snd_soc_device neo1973_gta02_snd_devdata = {
++ .card = &neo1973_gta02,
++ .codec_dev = &soc_codec_dev_wm8753,
++};
++
++static struct platform_device *neo1973_gta02_snd_device;
++
++static int __init neo1973_gta02_init(void)
++{
++ int ret;
++
++ if (!machine_is_neo1973_gta02()) {
++ printk(KERN_INFO
++ "Only GTA02 is supported by this ASoC driver\n");
++ return -ENODEV;
++ }
++
++ /* register bluetooth DAI here */
++ ret = snd_soc_register_dai(&bt_dai);
++ if (ret)
++ return ret;
++
++ neo1973_gta02_snd_device = platform_device_alloc("soc-audio", -1);
++ if (!neo1973_gta02_snd_device)
++ return -ENOMEM;
++
++ platform_set_drvdata(neo1973_gta02_snd_device,
++ &neo1973_gta02_snd_devdata);
++ neo1973_gta02_snd_devdata.dev = &neo1973_gta02_snd_device->dev;
++ ret = platform_device_add(neo1973_gta02_snd_device);
++
++ if (ret) {
++ platform_device_put(neo1973_gta02_snd_device);
++ return ret;
++ }
++
++ /* Initialise GPIOs used by amp */
++ s3c2410_gpio_cfgpin(GTA02_GPIO_HP_IN, S3C2410_GPIO_OUTPUT);
++ s3c2410_gpio_cfgpin(GTA02_GPIO_AMP_SHUT, S3C2410_GPIO_OUTPUT);
++
++ /* Amp off by default */
++ s3c2410_gpio_setpin(GTA02_GPIO_AMP_SHUT, 1);
++
++ /* Speaker off by default */
++ s3c2410_gpio_setpin(GTA02_GPIO_HP_IN, 1);
++
++ return ret;
++}
++module_init(neo1973_gta02_init);
++
++static void __exit neo1973_gta02_exit(void)
++{
++ snd_soc_unregister_dai(&bt_dai);
++ platform_device_unregister(neo1973_gta02_snd_device);
++}
++module_exit(neo1973_gta02_exit);
++
++/* Module information */
++MODULE_AUTHOR("Graeme Gregory, graeme@openmoko.org");
++MODULE_DESCRIPTION("ALSA SoC WM8753 Neo1973 GTA02");
++MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/neo1973_wm8753.c linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/neo1973_wm8753.c
+--- linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/neo1973_wm8753.c 2009-05-10 22:05:01.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/neo1973_wm8753.c 2009-05-10 22:28:00.000000000 +0200
+@@ -29,11 +29,11 @@
+ #include <mach/regs-clock.h>
+ #include <mach/regs-gpio.h>
+ #include <mach/hardware.h>
+-#include <mach/audio.h>
++#include <plat/audio.h>
+ #include <linux/io.h>
+ #include <mach/spi-gpio.h>
+
+-#include <asm/plat-s3c24xx/regs-iis.h>
++#include <plat/regs-iis.h>
+
+ #include "../codecs/wm8753.h"
+ #include "lm4857.h"
+@@ -585,15 +585,9 @@
+ .num_links = ARRAY_SIZE(neo1973_dai),
+ };
+
+-static struct wm8753_setup_data neo1973_wm8753_setup = {
+- .i2c_bus = 0,
+- .i2c_address = 0x1a,
+-};
+-
+ static struct snd_soc_device neo1973_snd_devdata = {
+ .card = &neo1973,
+ .codec_dev = &soc_codec_dev_wm8753,
+- .codec_data = &neo1973_wm8753_setup,
+ };
+
+ static int lm4857_i2c_probe(struct i2c_client *client,
+@@ -652,13 +646,13 @@
+ }
+
+ static const struct i2c_device_id lm4857_i2c_id[] = {
+- { "neo1973_lm4857", 0 },
++ { "lm4857", 0 },
+ { }
+ };
+
+ static struct i2c_driver lm4857_i2c_driver = {
+ .driver = {
+- .name = "LM4857 I2C Amp",
++ .name = "lm4857",
+ .owner = THIS_MODULE,
+ },
+ .suspend = lm4857_suspend,
+@@ -675,7 +669,7 @@
+ {
+ int ret;
+
+- DBG("Entered %s\n", __func__);
++ printk(KERN_DEBUG "Entered %s\n", __func__);
+
+ if (!machine_is_neo1973_gta01()) {
+ printk(KERN_INFO
+@@ -683,6 +677,11 @@
+ return -ENODEV;
+ }
+
++ /* register bluetooth DAI here */
++ ret = snd_soc_register_dai(&bt_dai);
++ if (ret)
++ return ret;
++
+ neo1973_snd_device = platform_device_alloc("soc-audio", -1);
+ if (!neo1973_snd_device)
+ return -ENOMEM;
+@@ -708,6 +707,7 @@
+ {
+ DBG("Entered %s\n", __func__);
+
++ snd_soc_unregister_dai(&bt_dai);
+ i2c_del_driver(&lm4857_i2c_driver);
+ platform_device_unregister(neo1973_snd_device);
+ }
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/om_3d7k_wm8753.c linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/om_3d7k_wm8753.c
+--- linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/om_3d7k_wm8753.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/om_3d7k_wm8753.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,600 @@
++/*
++ * om_3d7k_wm8753.c -- SoC audio for 3D7K
++ *
++ * Based on neo1973_gta02_wm8753
++ *
++ * Copyright 2009 Openmoko Inc
++ * Author: Ben Dooks <ben@simtec.co.uk>
++ * Copyright 2007 Openmoko Inc
++ * Author: Graeme Gregory <graeme@openmoko.org>
++ * Copyright 2007 Wolfson Microelectronics PLC.
++ * Author: Graeme Gregory <linux@wolfsonmicro.com>
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++
++#include <linux/module.h>
++#include <linux/moduleparam.h>
++#include <linux/timer.h>
++#include <linux/interrupt.h>
++#include <linux/platform_device.h>
++#include <linux/i2c.h>
++#include <sound/core.h>
++#include <sound/pcm.h>
++#include <sound/soc.h>
++#include <sound/soc-dapm.h>
++
++#include <asm/mach-types.h>
++#include <asm/hardware/scoop.h>
++
++#include <plat/regs-s3c2412-iis.h>
++
++#include "../codecs/wm8753.h"
++#include "s3c24xx-pcm.h"
++#include "s3c64xx-i2s.h"
++
++/* define the scenarios */
++#define NEO_AUDIO_OFF 0
++#define NEO_GSM_CALL_AUDIO_HANDSET 1
++#define NEO_GSM_CALL_AUDIO_HEADSET 2
++#define NEO_GSM_CALL_AUDIO_BLUETOOTH 3
++#define NEO_STEREO_TO_SPEAKERS 4
++#define NEO_STEREO_TO_HEADPHONES 5
++#define NEO_CAPTURE_HANDSET 6
++#define NEO_CAPTURE_HEADSET 7
++#define NEO_CAPTURE_BLUETOOTH 8
++#define NEO_STEREO_TO_HANDSET_SPK 9
++
++static struct snd_soc_card om_3d7k;
++
++static int om_3d7k_hifi_hw_params(struct snd_pcm_substream *substream,
++ struct snd_pcm_hw_params *params)
++{
++ struct snd_soc_pcm_runtime *rtd = substream->private_data;
++ struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
++ struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
++ unsigned int pll_out = 0, bclk = 0;
++ int ret = 0;
++ unsigned long iis_clkrate;
++
++ iis_clkrate = s3c64xx_i2s_get_clockrate(cpu_dai);
++
++ switch (params_rate(params)) {
++ case 8000:
++ case 16000:
++ pll_out = 12288000;
++ break;
++ case 48000:
++ bclk = WM8753_BCLK_DIV_4;
++ pll_out = 12288000;
++ break;
++ case 96000:
++ bclk = WM8753_BCLK_DIV_2;
++ pll_out = 12288000;
++ break;
++ case 11025:
++ bclk = WM8753_BCLK_DIV_16;
++ pll_out = 11289600;
++ break;
++ case 22050:
++ bclk = WM8753_BCLK_DIV_8;
++ pll_out = 11289600;
++ break;
++ case 44100:
++ bclk = WM8753_BCLK_DIV_4;
++ pll_out = 11289600;
++ break;
++ case 88200:
++ bclk = WM8753_BCLK_DIV_2;
++ pll_out = 11289600;
++ break;
++ }
++
++ ret = snd_soc_dai_set_sysclk(cpu_dai, S3C64XX_CLKSRC_MUX, 0,
++ SND_SOC_CLOCK_OUT);
++ if (ret < 0)
++ goto err;
++
++ /* set codec DAI configuration */
++ ret = snd_soc_dai_set_fmt(codec_dai,
++ SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF |
++ SND_SOC_DAIFMT_CBM_CFM);
++ if (ret < 0)
++ goto err;
++
++ /* set cpu DAI configuration */
++ ret = snd_soc_dai_set_fmt(cpu_dai,
++ SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
++ SND_SOC_DAIFMT_CBM_CFM);
++ if (ret < 0)
++ goto err;
++
++ /* set the codec system clock for DAC and ADC */
++ ret = snd_soc_dai_set_sysclk(codec_dai, WM8753_MCLK, pll_out,
++ SND_SOC_CLOCK_IN);
++ if (ret < 0)
++ goto err;
++
++#if 0
++ /* do not think we need to set this if the cpu is not the bitclk
++ * master */
++ /* set MCLK division for sample rate */
++ ret = snd_soc_dai_set_clkdiv(cpu_dai, S3C24XX_DIV_MCLK,
++ S3C2410_IISMOD_32FS);
++ if (ret < 0)
++ return ret;
++#endif
++
++ /* set codec BCLK division for sample rate */
++ ret = snd_soc_dai_set_clkdiv(codec_dai, WM8753_BCLKDIV, bclk);
++ if (ret < 0)
++ goto err;
++
++ /* set prescaler division for sample rate */
++ ret = snd_soc_dai_set_clkdiv(cpu_dai, S3C64XX_DIV_PRESCALER, 2-1);
++ if (ret < 0)
++ goto err;
++
++ /* codec PLL input is ACLK/2 */
++ ret = snd_soc_dai_set_pll(codec_dai, WM8753_PLL1,
++ iis_clkrate / 2, pll_out);
++ if (ret < 0)
++ goto err;
++
++ return 0;
++
++err:
++ printk(KERN_ERR "%s: failed %d\n", __func__, ret);
++ return ret;
++}
++
++static int om_3d7k_hifi_hw_free(struct snd_pcm_substream *substream)
++{
++ struct snd_soc_pcm_runtime *rtd = substream->private_data;
++ struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
++
++ /* disable the PLL */
++ return snd_soc_dai_set_pll(codec_dai, WM8753_PLL1, 0, 0);
++}
++
++/*
++ * 3D7K WM8753 HiFi DAI opserations.
++ */
++static struct snd_soc_ops om_3d7k_hifi_ops = {
++ .hw_params = om_3d7k_hifi_hw_params,
++ .hw_free = om_3d7k_hifi_hw_free,
++};
++
++static int om_3d7k_voice_hw_params(struct snd_pcm_substream *substream,
++ struct snd_pcm_hw_params *params)
++{
++ struct snd_soc_pcm_runtime *rtd = substream->private_data;
++ struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
++ unsigned int pcmdiv = 0;
++ int ret = 0;
++ unsigned long iis_clkrate;
++
++ iis_clkrate = s3c64xx_i2s_get_clockrate(rtd->dai->cpu_dai);
++
++ if (params_rate(params) != 8000)
++ return -EINVAL;
++ if (params_channels(params) != 1)
++ return -EINVAL;
++
++ pcmdiv = WM8753_PCM_DIV_6; /* 2.048 MHz */
++
++ /* todo: gg check mode (DSP_B) against CSR datasheet */
++ /* set codec DAI configuration */
++ ret = snd_soc_dai_set_fmt(codec_dai, (SND_SOC_DAIFMT_DSP_B |
++ SND_SOC_DAIFMT_NB_NF |
++ SND_SOC_DAIFMT_CBS_CFS));
++ if (ret < 0)
++ return ret;
++
++ /* set the codec system clock for DAC and ADC */
++ ret = snd_soc_dai_set_sysclk(codec_dai, WM8753_PCMCLK,
++ 12288000, SND_SOC_CLOCK_IN);
++ if (ret < 0)
++ return ret;
++
++ /* set codec PCM division for sample rate */
++ ret = snd_soc_dai_set_clkdiv(codec_dai, WM8753_PCMDIV, pcmdiv);
++ if (ret < 0)
++ return ret;
++
++ /* configue and enable PLL for 12.288MHz output */
++ ret = snd_soc_dai_set_pll(codec_dai, WM8753_PLL2,
++ iis_clkrate / 2, 12288000);
++ if (ret < 0)
++ return ret;
++
++ return 0;
++}
++
++static int om_3d7k_voice_hw_free(struct snd_pcm_substream *substream)
++{
++ struct snd_soc_pcm_runtime *rtd = substream->private_data;
++ struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
++
++ /* disable the PLL */
++ return snd_soc_dai_set_pll(codec_dai, WM8753_PLL2, 0, 0);
++}
++
++static struct snd_soc_ops om_3d7k_voice_ops = {
++ .hw_params = om_3d7k_voice_hw_params,
++ .hw_free = om_3d7k_voice_hw_free,
++};
++
++static int om_3d7k_set_stereo_out(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
++ int val = ucontrol->value.integer.value[0];
++
++ snd_soc_dapm_set_endpoint(codec, "Stereo Out", val);
++ snd_soc_dapm_sync(codec);
++
++ return 0;
++}
++
++static int om_3d7k_get_stereo_out(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
++
++ ucontrol->value.integer.value[0] =
++ snd_soc_dapm_get_endpoint(codec, "Stereo Out");
++
++ return 0;
++}
++
++
++static int om_3d7k_set_gsm_out(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
++ int val = ucontrol->value.integer.value[0];
++
++ snd_soc_dapm_set_endpoint(codec, "GSM Line Out", val);
++ snd_soc_dapm_sync(codec);
++
++ return 0;
++}
++
++static int om_3d7k_get_gsm_out(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
++
++ ucontrol->value.integer.value[0] =
++ snd_soc_dapm_get_endpoint(codec, "GSM Line Out");
++
++ return 0;
++}
++
++static int om_3d7k_set_gsm_in(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
++ int val = ucontrol->value.integer.value[0];
++
++ snd_soc_dapm_set_endpoint(codec, "GSM Line In", val);
++ snd_soc_dapm_sync(codec);
++
++ return 0;
++}
++
++static int om_3d7k_get_gsm_in(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
++
++ ucontrol->value.integer.value[0] =
++ snd_soc_dapm_get_endpoint(codec, "GSM Line In");
++
++ return 0;
++}
++
++static int om_3d7k_set_headset_mic(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
++ int val = ucontrol->value.integer.value[0];
++
++ snd_soc_dapm_set_endpoint(codec, "Headset Mic", val);
++ snd_soc_dapm_sync(codec);
++
++ return 0;
++}
++
++static int om_3d7k_get_headset_mic(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
++
++ ucontrol->value.integer.value[0] =
++ snd_soc_dapm_get_endpoint(codec, "Headset Mic");
++
++ return 0;
++}
++
++static int om_3d7k_set_handset_mic(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
++ int val = ucontrol->value.integer.value[0];
++
++ snd_soc_dapm_set_endpoint(codec, "Handset Mic", val);
++
++ snd_soc_dapm_sync(codec);
++
++ return 0;
++}
++
++static int om_3d7k_get_handset_mic(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
++
++ ucontrol->value.integer.value[0] =
++ snd_soc_dapm_get_endpoint(codec, "Handset Mic");
++
++ return 0;
++}
++
++static int om_3d7k_set_handset_spk(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
++ int val = ucontrol->value.integer.value[0];
++
++ snd_soc_dapm_set_endpoint(codec, "Handset Spk", val);
++
++ snd_soc_dapm_sync(codec);
++
++ return 0;
++}
++
++static int om_3d7k_get_handset_spk(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
++
++ ucontrol->value.integer.value[0] =
++ snd_soc_dapm_get_endpoint(codec, "Handset Spk");
++
++ return 0;
++}
++
++static int om_3d7k_set_headset_spk(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
++ int val = ucontrol->value.integer.value[0];
++
++ snd_soc_dapm_set_endpoint(codec, "Headset Spk", val);
++
++ snd_soc_dapm_sync(codec);
++
++ return 0;
++}
++
++static int om_3d7k_get_headset_spk(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
++
++ ucontrol->value.integer.value[0] =
++ snd_soc_dapm_get_endpoint(codec, "Headset Spk");
++
++ return 0;
++}
++
++static const struct snd_soc_dapm_widget wm8753_dapm_widgets[] = {
++ SND_SOC_DAPM_LINE("Stereo Out", NULL),
++ SND_SOC_DAPM_LINE("GSM Line Out", NULL),
++ SND_SOC_DAPM_LINE("GSM Line In", NULL),
++ SND_SOC_DAPM_MIC("Headset Mic", NULL),
++ SND_SOC_DAPM_MIC("Handset Mic", NULL),
++ SND_SOC_DAPM_SPK("Handset Spk", NULL),
++ SND_SOC_DAPM_SPK("Headset Spk", NULL),
++};
++
++
++/* example machine audio_mapnections */
++static const struct snd_soc_dapm_route audio_map[] = {
++
++ {"Stereo Out", NULL, "LOUT2"},
++ {"Stereo Out", NULL, "ROUT2"},
++
++ /* Connections to the GSM Module */
++ {"GSM Line Out", NULL, "MONO1"},
++ {"GSM Line Out", NULL, "MONO2"},
++ {"RXP", NULL, "GSM Line In"},
++ {"RXN", NULL, "GSM Line In"},
++
++ /* Connections to Headset */
++ {"MIC1", NULL, "Mic Bias"},
++ {"Mic Bias", NULL, "Headset Mic"},
++
++ /* Call Mic */
++ {"MIC2", NULL, "Mic Bias"},
++ {"MIC2N", NULL, "Mic Bias"},
++ {"Mic Bias", NULL, "Handset Mic"},
++
++ /* Call Speaker */
++ {"Handset Spk", NULL, "OUT3"},
++ {"Handset Spk", NULL, "LOUT1"},
++
++ {"Headset Spk", NULL, "ROUT1"},
++ {"Headset Spk", NULL, "LOUT1"},
++
++ /* Connect the ALC pins */
++ {"ACIN", NULL, "ACOP"},
++};
++
++static const struct snd_kcontrol_new wm8753_om_3d7k_controls[] = {
++ SOC_SINGLE_EXT("DAPM Stereo Out Switch", 0, 0, 1, 0,
++ om_3d7k_get_stereo_out,
++ om_3d7k_set_stereo_out),
++ SOC_SINGLE_EXT("DAPM GSM Line Out Switch", 1, 0, 1, 0,
++ om_3d7k_get_gsm_out,
++ om_3d7k_set_gsm_out),
++ SOC_SINGLE_EXT("DAPM GSM Line In Switch", 2, 0, 1, 0,
++ om_3d7k_get_gsm_in,
++ om_3d7k_set_gsm_in),
++ SOC_SINGLE_EXT("DAPM Headset Mic Switch", 3, 0, 1, 0,
++ om_3d7k_get_headset_mic,
++ om_3d7k_set_headset_mic),
++ SOC_SINGLE_EXT("DAPM Handset Mic Switch", 4, 0, 1, 0,
++ om_3d7k_get_handset_mic,
++ om_3d7k_set_handset_mic),
++ SOC_SINGLE_EXT("DAPM Handset Spk Switch", 5, 0, 1, 0,
++ om_3d7k_get_handset_spk,
++ om_3d7k_set_handset_spk),
++ SOC_SINGLE_EXT("DAPM Headset Spk Switch", 6, 0, 1, 0,
++ om_3d7k_get_headset_spk,
++ om_3d7k_set_headset_spk),
++};
++
++/*
++ * This is an example machine initialisation for a wm8753 connected to a
++ * neo1973 GTA02.
++ */
++static int om_3d7k_wm8753_init(struct snd_soc_codec *codec)
++{
++ int i, err;
++
++ /* set up NC codec pins */
++ snd_soc_dapm_set_endpoint(codec, "OUT4", 0);
++ snd_soc_dapm_set_endpoint(codec, "LINE1", 0);
++ snd_soc_dapm_set_endpoint(codec, "LINE2", 0);
++
++
++ /* Add neo1973 gta02 specific widgets */
++ snd_soc_dapm_new_controls(codec, wm8753_dapm_widgets,
++ ARRAY_SIZE(wm8753_dapm_widgets));
++
++ /* add neo1973 gta02 specific controls */
++ for (i = 0; i < ARRAY_SIZE(wm8753_om_3d7k_controls); i++) {
++ err = snd_ctl_add(codec->card,
++ snd_soc_cnew(&wm8753_om_3d7k_controls[i],
++ codec, NULL));
++ if (err < 0)
++ return err;
++ }
++
++ /* set up neo1973 gta02 specific audio path audio_mapnects */
++ snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map));
++
++ /* set endpoints to default off mode */
++ snd_soc_dapm_set_endpoint(codec, "Stereo Out", 0);
++ snd_soc_dapm_set_endpoint(codec, "GSM Line Out",0);
++ snd_soc_dapm_set_endpoint(codec, "GSM Line In", 0);
++ snd_soc_dapm_set_endpoint(codec, "Headset Mic", 0);
++ snd_soc_dapm_set_endpoint(codec, "Handset Mic", 0);
++ snd_soc_dapm_set_endpoint(codec, "Handset Spk", 0);
++ snd_soc_dapm_set_endpoint(codec, "Headset Spk", 0);
++
++ snd_soc_dapm_sync(codec);
++
++ return 0;
++}
++
++/*
++ * BT Codec DAI
++ */
++static struct snd_soc_dai bt_dai =
++{ .name = "Bluetooth",
++ .id = 0,
++ .playback = {
++ .channels_min = 1,
++ .channels_max = 1,
++ .rates = SNDRV_PCM_RATE_8000,
++ .formats = SNDRV_PCM_FMTBIT_S16_LE,
++ },
++ .capture = {
++ .channels_min = 1,
++ .channels_max = 1,
++ .rates = SNDRV_PCM_RATE_8000,
++ .formats = SNDRV_PCM_FMTBIT_S16_LE,
++ },
++};
++
++static struct snd_soc_dai_link om_3d7k_dai[] = {
++ { /* Hifi Playback - for similatious use with voice below */
++ .name = "WM8753",
++ .stream_name = "WM8753 HiFi",
++ .cpu_dai = &s3c64xx_i2s_dai,
++ .codec_dai = &wm8753_dai[WM8753_DAI_HIFI],
++ .init = om_3d7k_wm8753_init,
++ .ops = &om_3d7k_hifi_ops,
++ },
++ { /* Voice via BT */
++ .name = "Bluetooth",
++ .stream_name = "Voice",
++ .cpu_dai = &bt_dai,
++ .codec_dai = &wm8753_dai[WM8753_DAI_VOICE],
++ .ops = &om_3d7k_voice_ops,
++ },
++};
++
++static struct snd_soc_card om_3d7k = {
++ .name = "om-3d7k",
++ .platform = &s3c24xx_soc_platform,
++ .dai_link = om_3d7k_dai,
++ .num_links = ARRAY_SIZE(om_3d7k_dai),
++};
++
++static struct snd_soc_device om_3d7k_snd_devdata = {
++ .card = &om_3d7k,
++ .codec_dev = &soc_codec_dev_wm8753,
++};
++
++static struct platform_device *om_3d7k_snd_device;
++
++static int __init om_3d7k_init(void)
++{
++ int ret;
++
++ if (!machine_is_om_3d7k()) {
++ printk(KERN_INFO "Only 3D7K supported by ASoC driver\n");
++ return -ENODEV;
++ }
++
++ /* register bluetooth DAI here */
++ ret = snd_soc_register_dai(&bt_dai);
++ if (ret)
++ return ret;
++
++ om_3d7k_snd_device = platform_device_alloc("soc-audio", 1);
++ if (!om_3d7k_snd_device)
++ return -ENOMEM;
++
++ platform_set_drvdata(om_3d7k_snd_device, &om_3d7k_snd_devdata);
++ om_3d7k_snd_devdata.dev = &om_3d7k_snd_device->dev;
++ ret = platform_device_add(om_3d7k_snd_device);
++
++ if (ret) {
++ platform_device_put(om_3d7k_snd_device);
++ return ret;
++ }
++
++ return ret;
++}
++
++static void __exit om_3d7k_exit(void)
++{
++ platform_device_unregister(om_3d7k_snd_device);
++}
++
++module_init(om_3d7k_init);
++module_exit(om_3d7k_exit);
++
++/* Module information */
++MODULE_AUTHOR("Graeme Gregory, graeme@openmoko.org; Ben Dooks <ben@simtec.co.uk>");
++MODULE_DESCRIPTION("ALSA SoC WM8753 OM 3D7K");
++MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/s3c2412-i2s.c linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/s3c2412-i2s.c
+--- linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/s3c2412-i2s.c 2009-05-10 22:05:01.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/s3c2412-i2s.c 2009-05-10 22:28:00.000000000 +0200
+@@ -22,6 +22,7 @@
+ #include <linux/delay.h>
+ #include <linux/clk.h>
+ #include <linux/kernel.h>
++#include <linux/io.h>
+
+ #include <sound/core.h>
+ #include <sound/pcm.h>
+@@ -30,20 +31,16 @@
+ #include <sound/soc.h>
+ #include <mach/hardware.h>
+
+-#include <linux/io.h>
+-#include <asm/dma.h>
+-
+-#include <asm/plat-s3c24xx/regs-s3c2412-iis.h>
++#include <plat/regs-s3c2412-iis.h>
+
+-#include <mach/regs-gpio.h>
+-#include <mach/audio.h>
++#include <plat/regs-gpio.h>
++#include <plat/audio.h>
+ #include <mach/dma.h>
+
+ #include "s3c24xx-pcm.h"
+ #include "s3c2412-i2s.h"
+
+ #define S3C2412_I2S_DEBUG 0
+-#define S3C2412_I2S_DEBUG_CON 0
+
+ #if S3C2412_I2S_DEBUG
+ #define DBG(x...) printk(KERN_INFO x)
+@@ -73,431 +70,7 @@
+ .dma_size = 4,
+ };
+
+-struct s3c2412_i2s_info {
+- struct device *dev;
+- void __iomem *regs;
+- struct clk *iis_clk;
+- struct clk *iis_pclk;
+- struct clk *iis_cclk;
+-
+- u32 suspend_iismod;
+- u32 suspend_iiscon;
+- u32 suspend_iispsr;
+-};
+-
+-static struct s3c2412_i2s_info s3c2412_i2s;
+-
+-#define bit_set(v, b) (((v) & (b)) ? 1 : 0)
+-
+-#if S3C2412_I2S_DEBUG_CON
+-static void dbg_showcon(const char *fn, u32 con)
+-{
+- printk(KERN_DEBUG "%s: LRI=%d, TXFEMPT=%d, RXFEMPT=%d, TXFFULL=%d, RXFFULL=%d\n", fn,
+- bit_set(con, S3C2412_IISCON_LRINDEX),
+- bit_set(con, S3C2412_IISCON_TXFIFO_EMPTY),
+- bit_set(con, S3C2412_IISCON_RXFIFO_EMPTY),
+- bit_set(con, S3C2412_IISCON_TXFIFO_FULL),
+- bit_set(con, S3C2412_IISCON_RXFIFO_FULL));
+-
+- printk(KERN_DEBUG "%s: PAUSE: TXDMA=%d, RXDMA=%d, TXCH=%d, RXCH=%d\n",
+- fn,
+- bit_set(con, S3C2412_IISCON_TXDMA_PAUSE),
+- bit_set(con, S3C2412_IISCON_RXDMA_PAUSE),
+- bit_set(con, S3C2412_IISCON_TXCH_PAUSE),
+- bit_set(con, S3C2412_IISCON_RXCH_PAUSE));
+- printk(KERN_DEBUG "%s: ACTIVE: TXDMA=%d, RXDMA=%d, IIS=%d\n", fn,
+- bit_set(con, S3C2412_IISCON_TXDMA_ACTIVE),
+- bit_set(con, S3C2412_IISCON_RXDMA_ACTIVE),
+- bit_set(con, S3C2412_IISCON_IIS_ACTIVE));
+-}
+-#else
+-static inline void dbg_showcon(const char *fn, u32 con)
+-{
+-}
+-#endif
+-
+-/* Turn on or off the transmission path. */
+-static void s3c2412_snd_txctrl(int on)
+-{
+- struct s3c2412_i2s_info *i2s = &s3c2412_i2s;
+- void __iomem *regs = i2s->regs;
+- u32 fic, con, mod;
+-
+- DBG("%s(%d)\n", __func__, on);
+-
+- fic = readl(regs + S3C2412_IISFIC);
+- con = readl(regs + S3C2412_IISCON);
+- mod = readl(regs + S3C2412_IISMOD);
+-
+- DBG("%s: IIS: CON=%x MOD=%x FIC=%x\n", __func__, con, mod, fic);
+-
+- if (on) {
+- con |= S3C2412_IISCON_TXDMA_ACTIVE | S3C2412_IISCON_IIS_ACTIVE;
+- con &= ~S3C2412_IISCON_TXDMA_PAUSE;
+- con &= ~S3C2412_IISCON_TXCH_PAUSE;
+-
+- switch (mod & S3C2412_IISMOD_MODE_MASK) {
+- case S3C2412_IISMOD_MODE_TXONLY:
+- case S3C2412_IISMOD_MODE_TXRX:
+- /* do nothing, we are in the right mode */
+- break;
+-
+- case S3C2412_IISMOD_MODE_RXONLY:
+- mod &= ~S3C2412_IISMOD_MODE_MASK;
+- mod |= S3C2412_IISMOD_MODE_TXRX;
+- break;
+-
+- default:
+- dev_err(i2s->dev, "TXEN: Invalid MODE in IISMOD\n");
+- }
+-
+- writel(con, regs + S3C2412_IISCON);
+- writel(mod, regs + S3C2412_IISMOD);
+- } else {
+- /* Note, we do not have any indication that the FIFO problems
+- * tha the S3C2410/2440 had apply here, so we should be able
+- * to disable the DMA and TX without resetting the FIFOS.
+- */
+-
+- con |= S3C2412_IISCON_TXDMA_PAUSE;
+- con |= S3C2412_IISCON_TXCH_PAUSE;
+- con &= ~S3C2412_IISCON_TXDMA_ACTIVE;
+-
+- switch (mod & S3C2412_IISMOD_MODE_MASK) {
+- case S3C2412_IISMOD_MODE_TXRX:
+- mod &= ~S3C2412_IISMOD_MODE_MASK;
+- mod |= S3C2412_IISMOD_MODE_RXONLY;
+- break;
+-
+- case S3C2412_IISMOD_MODE_TXONLY:
+- mod &= ~S3C2412_IISMOD_MODE_MASK;
+- con &= ~S3C2412_IISCON_IIS_ACTIVE;
+- break;
+-
+- default:
+- dev_err(i2s->dev, "TXDIS: Invalid MODE in IISMOD\n");
+- }
+-
+- writel(mod, regs + S3C2412_IISMOD);
+- writel(con, regs + S3C2412_IISCON);
+- }
+-
+- fic = readl(regs + S3C2412_IISFIC);
+- dbg_showcon(__func__, con);
+- DBG("%s: IIS: CON=%x MOD=%x FIC=%x\n", __func__, con, mod, fic);
+-}
+-
+-static void s3c2412_snd_rxctrl(int on)
+-{
+- struct s3c2412_i2s_info *i2s = &s3c2412_i2s;
+- void __iomem *regs = i2s->regs;
+- u32 fic, con, mod;
+-
+- DBG("%s(%d)\n", __func__, on);
+-
+- fic = readl(regs + S3C2412_IISFIC);
+- con = readl(regs + S3C2412_IISCON);
+- mod = readl(regs + S3C2412_IISMOD);
+-
+- DBG("%s: IIS: CON=%x MOD=%x FIC=%x\n", __func__, con, mod, fic);
+-
+- if (on) {
+- con |= S3C2412_IISCON_RXDMA_ACTIVE | S3C2412_IISCON_IIS_ACTIVE;
+- con &= ~S3C2412_IISCON_RXDMA_PAUSE;
+- con &= ~S3C2412_IISCON_RXCH_PAUSE;
+-
+- switch (mod & S3C2412_IISMOD_MODE_MASK) {
+- case S3C2412_IISMOD_MODE_TXRX:
+- case S3C2412_IISMOD_MODE_RXONLY:
+- /* do nothing, we are in the right mode */
+- break;
+-
+- case S3C2412_IISMOD_MODE_TXONLY:
+- mod &= ~S3C2412_IISMOD_MODE_MASK;
+- mod |= S3C2412_IISMOD_MODE_TXRX;
+- break;
+-
+- default:
+- dev_err(i2s->dev, "RXEN: Invalid MODE in IISMOD\n");
+- }
+-
+- writel(mod, regs + S3C2412_IISMOD);
+- writel(con, regs + S3C2412_IISCON);
+- } else {
+- /* See txctrl notes on FIFOs. */
+-
+- con &= ~S3C2412_IISCON_RXDMA_ACTIVE;
+- con |= S3C2412_IISCON_RXDMA_PAUSE;
+- con |= S3C2412_IISCON_RXCH_PAUSE;
+-
+- switch (mod & S3C2412_IISMOD_MODE_MASK) {
+- case S3C2412_IISMOD_MODE_RXONLY:
+- con &= ~S3C2412_IISCON_IIS_ACTIVE;
+- mod &= ~S3C2412_IISMOD_MODE_MASK;
+- break;
+-
+- case S3C2412_IISMOD_MODE_TXRX:
+- mod &= ~S3C2412_IISMOD_MODE_MASK;
+- mod |= S3C2412_IISMOD_MODE_TXONLY;
+- break;
+-
+- default:
+- dev_err(i2s->dev, "RXEN: Invalid MODE in IISMOD\n");
+- }
+-
+- writel(con, regs + S3C2412_IISCON);
+- writel(mod, regs + S3C2412_IISMOD);
+- }
+-
+- fic = readl(regs + S3C2412_IISFIC);
+- DBG("%s: IIS: CON=%x MOD=%x FIC=%x\n", __func__, con, mod, fic);
+-}
+-
+-
+-/*
+- * Wait for the LR signal to allow synchronisation to the L/R clock
+- * from the codec. May only be needed for slave mode.
+- */
+-static int s3c2412_snd_lrsync(void)
+-{
+- u32 iiscon;
+- unsigned long timeout = jiffies + msecs_to_jiffies(5);
+-
+- DBG("Entered %s\n", __func__);
+-
+- while (1) {
+- iiscon = readl(s3c2412_i2s.regs + S3C2412_IISCON);
+- if (iiscon & S3C2412_IISCON_LRINDEX)
+- break;
+-
+- if (timeout < jiffies) {
+- printk(KERN_ERR "%s: timeout\n", __func__);
+- return -ETIMEDOUT;
+- }
+- }
+-
+- return 0;
+-}
+-
+-/*
+- * Check whether CPU is the master or slave
+- */
+-static inline int s3c2412_snd_is_clkmaster(void)
+-{
+- u32 iismod = readl(s3c2412_i2s.regs + S3C2412_IISMOD);
+-
+- DBG("Entered %s\n", __func__);
+-
+- iismod &= S3C2412_IISMOD_MASTER_MASK;
+- return !(iismod == S3C2412_IISMOD_SLAVE);
+-}
+-
+-/*
+- * Set S3C2412 I2S DAI format
+- */
+-static int s3c2412_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
+- unsigned int fmt)
+-{
+- u32 iismod;
+-
+-
+- DBG("Entered %s\n", __func__);
+-
+- iismod = readl(s3c2412_i2s.regs + S3C2412_IISMOD);
+- DBG("hw_params r: IISMOD: %x \n", iismod);
+-
+- switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
+- case SND_SOC_DAIFMT_CBM_CFM:
+- iismod &= ~S3C2412_IISMOD_MASTER_MASK;
+- iismod |= S3C2412_IISMOD_SLAVE;
+- break;
+- case SND_SOC_DAIFMT_CBS_CFS:
+- iismod &= ~S3C2412_IISMOD_MASTER_MASK;
+- iismod |= S3C2412_IISMOD_MASTER_INTERNAL;
+- break;
+- default:
+- DBG("unknwon master/slave format\n");
+- return -EINVAL;
+- }
+-
+- iismod &= ~S3C2412_IISMOD_SDF_MASK;
+-
+- switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
+- case SND_SOC_DAIFMT_RIGHT_J:
+- iismod |= S3C2412_IISMOD_SDF_MSB;
+- break;
+- case SND_SOC_DAIFMT_LEFT_J:
+- iismod |= S3C2412_IISMOD_SDF_LSB;
+- break;
+- case SND_SOC_DAIFMT_I2S:
+- iismod |= S3C2412_IISMOD_SDF_IIS;
+- break;
+- default:
+- DBG("Unknown data format\n");
+- return -EINVAL;
+- }
+-
+- writel(iismod, s3c2412_i2s.regs + S3C2412_IISMOD);
+- DBG("hw_params w: IISMOD: %x \n", iismod);
+- return 0;
+-}
+-
+-static int s3c2412_i2s_hw_params(struct snd_pcm_substream *substream,
+- struct snd_pcm_hw_params *params,
+- struct snd_soc_dai *dai)
+-{
+- struct snd_soc_pcm_runtime *rtd = substream->private_data;
+- u32 iismod;
+-
+- DBG("Entered %s\n", __func__);
+-
+- if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+- rtd->dai->cpu_dai->dma_data = &s3c2412_i2s_pcm_stereo_out;
+- else
+- rtd->dai->cpu_dai->dma_data = &s3c2412_i2s_pcm_stereo_in;
+-
+- /* Working copies of register */
+- iismod = readl(s3c2412_i2s.regs + S3C2412_IISMOD);
+- DBG("%s: r: IISMOD: %x\n", __func__, iismod);
+-
+- switch (params_format(params)) {
+- case SNDRV_PCM_FORMAT_S8:
+- iismod |= S3C2412_IISMOD_8BIT;
+- break;
+- case SNDRV_PCM_FORMAT_S16_LE:
+- iismod &= ~S3C2412_IISMOD_8BIT;
+- break;
+- }
+-
+- writel(iismod, s3c2412_i2s.regs + S3C2412_IISMOD);
+- DBG("%s: w: IISMOD: %x\n", __func__, iismod);
+- return 0;
+-}
+-
+-static int s3c2412_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
+- struct snd_soc_dai *dai)
+-{
+- int capture = (substream->stream == SNDRV_PCM_STREAM_CAPTURE);
+- unsigned long irqs;
+- int ret = 0;
+-
+- DBG("Entered %s\n", __func__);
+-
+- switch (cmd) {
+- case SNDRV_PCM_TRIGGER_START:
+- /* On start, ensure that the FIFOs are cleared and reset. */
+-
+- writel(capture ? S3C2412_IISFIC_RXFLUSH : S3C2412_IISFIC_TXFLUSH,
+- s3c2412_i2s.regs + S3C2412_IISFIC);
+-
+- /* clear again, just in case */
+- writel(0x0, s3c2412_i2s.regs + S3C2412_IISFIC);
+-
+- case SNDRV_PCM_TRIGGER_RESUME:
+- case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+- if (!s3c2412_snd_is_clkmaster()) {
+- ret = s3c2412_snd_lrsync();
+- if (ret)
+- goto exit_err;
+- }
+-
+- local_irq_save(irqs);
+-
+- if (capture)
+- s3c2412_snd_rxctrl(1);
+- else
+- s3c2412_snd_txctrl(1);
+-
+- local_irq_restore(irqs);
+- break;
+-
+- case SNDRV_PCM_TRIGGER_STOP:
+- case SNDRV_PCM_TRIGGER_SUSPEND:
+- case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
+- local_irq_save(irqs);
+-
+- if (capture)
+- s3c2412_snd_rxctrl(0);
+- else
+- s3c2412_snd_txctrl(0);
+-
+- local_irq_restore(irqs);
+- break;
+- default:
+- ret = -EINVAL;
+- break;
+- }
+-
+-exit_err:
+- return ret;
+-}
+-
+-/* default table of all avaialable root fs divisors */
+-static unsigned int s3c2412_iis_fs[] = { 256, 512, 384, 768, 0 };
+-
+-int s3c2412_iis_calc_rate(struct s3c2412_rate_calc *info,
+- unsigned int *fstab,
+- unsigned int rate, struct clk *clk)
+-{
+- unsigned long clkrate = clk_get_rate(clk);
+- unsigned int div;
+- unsigned int fsclk;
+- unsigned int actual;
+- unsigned int fs;
+- unsigned int fsdiv;
+- signed int deviation = 0;
+- unsigned int best_fs = 0;
+- unsigned int best_div = 0;
+- unsigned int best_rate = 0;
+- unsigned int best_deviation = INT_MAX;
+-
+-
+- if (fstab == NULL)
+- fstab = s3c2412_iis_fs;
+-
+- for (fs = 0;; fs++) {
+- fsdiv = s3c2412_iis_fs[fs];
+-
+- if (fsdiv == 0)
+- break;
+-
+- fsclk = clkrate / fsdiv;
+- div = fsclk / rate;
+-
+- if ((fsclk % rate) > (rate / 2))
+- div++;
+-
+- if (div <= 1)
+- continue;
+-
+- actual = clkrate / (fsdiv * div);
+- deviation = actual - rate;
+-
+- printk(KERN_DEBUG "%dfs: div %d => result %d, deviation %d\n",
+- fsdiv, div, actual, deviation);
+-
+- deviation = abs(deviation);
+-
+- if (deviation < best_deviation) {
+- best_fs = fsdiv;
+- best_div = div;
+- best_rate = actual;
+- best_deviation = deviation;
+- }
+-
+- if (deviation == 0)
+- break;
+- }
+-
+- printk(KERN_DEBUG "best: fs=%d, div=%d, rate=%d\n",
+- best_fs, best_div, best_rate);
+-
+- info->fs_div = best_fs;
+- info->clk_div = best_div;
+-
+- return 0;
+-}
+-EXPORT_SYMBOL_GPL(s3c2412_iis_calc_rate);
++static struct s3c_i2sv2_info s3c2412_i2s;
+
+ /*
+ * Set S3C2412 Clock source
+@@ -512,10 +85,12 @@
+
+ switch (clk_id) {
+ case S3C2412_CLKSRC_PCLK:
++ s3c2412_i2s.master = 1;
+ iismod &= ~S3C2412_IISMOD_MASTER_MASK;
+ iismod |= S3C2412_IISMOD_MASTER_INTERNAL;
+ break;
+ case S3C2412_CLKSRC_I2SCLK:
++ s3c2412_i2s.master = 0;
+ iismod &= ~S3C2412_IISMOD_MASTER_MASK;
+ iismod |= S3C2412_IISMOD_MASTER_EXTERNAL;
+ break;
+@@ -527,74 +102,6 @@
+ return 0;
+ }
+
+-/*
+- * Set S3C2412 Clock dividers
+- */
+-static int s3c2412_i2s_set_clkdiv(struct snd_soc_dai *cpu_dai,
+- int div_id, int div)
+-{
+- struct s3c2412_i2s_info *i2s = &s3c2412_i2s;
+- u32 reg;
+-
+- DBG("%s(%p, %d, %d)\n", __func__, cpu_dai, div_id, div);
+-
+- switch (div_id) {
+- case S3C2412_DIV_BCLK:
+- reg = readl(i2s->regs + S3C2412_IISMOD);
+- reg &= ~S3C2412_IISMOD_BCLK_MASK;
+- writel(reg | div, i2s->regs + S3C2412_IISMOD);
+-
+- DBG("%s: MOD=%08x\n", __func__, readl(i2s->regs + S3C2412_IISMOD));
+- break;
+-
+- case S3C2412_DIV_RCLK:
+- if (div > 3) {
+- /* convert value to bit field */
+-
+- switch (div) {
+- case 256:
+- div = S3C2412_IISMOD_RCLK_256FS;
+- break;
+-
+- case 384:
+- div = S3C2412_IISMOD_RCLK_384FS;
+- break;
+-
+- case 512:
+- div = S3C2412_IISMOD_RCLK_512FS;
+- break;
+-
+- case 768:
+- div = S3C2412_IISMOD_RCLK_768FS;
+- break;
+-
+- default:
+- return -EINVAL;
+- }
+- }
+-
+- reg = readl(s3c2412_i2s.regs + S3C2412_IISMOD);
+- reg &= ~S3C2412_IISMOD_RCLK_MASK;
+- writel(reg | div, i2s->regs + S3C2412_IISMOD);
+- DBG("%s: MOD=%08x\n", __func__, readl(i2s->regs + S3C2412_IISMOD));
+- break;
+-
+- case S3C2412_DIV_PRESCALER:
+- if (div >= 0) {
+- writel((div << 8) | S3C2412_IISPSR_PSREN,
+- i2s->regs + S3C2412_IISPSR);
+- } else {
+- writel(0x0, i2s->regs + S3C2412_IISPSR);
+- }
+- DBG("%s: PSR=%08x\n", __func__, readl(i2s->regs + S3C2412_IISPSR));
+- break;
+-
+- default:
+- return -EINVAL;
+- }
+-
+- return 0;
+-}
+
+ struct clk *s3c2412_get_iisclk(void)
+ {
+@@ -606,20 +113,16 @@
+ static int s3c2412_i2s_probe(struct platform_device *pdev,
+ struct snd_soc_dai *dai)
+ {
++ int ret;
++
+ DBG("Entered %s\n", __func__);
+
+- s3c2412_i2s.dev = &pdev->dev;
++ ret = s3c_i2sv2_probe(pdev, dai, &s3c2412_i2s, S3C2410_PA_IIS);
++ if (ret)
++ return ret;
+
+- s3c2412_i2s.regs = ioremap(S3C2410_PA_IIS, 0x100);
+- if (s3c2412_i2s.regs == NULL)
+- return -ENXIO;
+-
+- s3c2412_i2s.iis_pclk = clk_get(&pdev->dev, "iis");
+- if (s3c2412_i2s.iis_pclk == NULL) {
+- DBG("failed to get iis_clock\n");
+- iounmap(s3c2412_i2s.regs);
+- return -ENODEV;
+- }
++ s3c2412_i2s.dma_capture = &s3c2412_i2s_pcm_stereo_in;
++ s3c2412_i2s.dma_playback = &s3c2412_i2s_pcm_stereo_out;
+
+ s3c2412_i2s.iis_cclk = clk_get(&pdev->dev, "i2sclk");
+ if (s3c2412_i2s.iis_cclk == NULL) {
+@@ -628,12 +131,12 @@
+ return -ENODEV;
+ }
+
+- clk_set_parent(s3c2412_i2s.iis_cclk, clk_get(NULL, "mpll"));
++ /* Set MPLL as the source for IIS CLK */
+
+- clk_enable(s3c2412_i2s.iis_pclk);
++ clk_set_parent(s3c2412_i2s.iis_cclk, clk_get(NULL, "mpll"));
+ clk_enable(s3c2412_i2s.iis_cclk);
+
+- s3c2412_i2s.iis_clk = s3c2412_i2s.iis_pclk;
++ s3c2412_i2s.iis_cclk = s3c2412_i2s.iis_pclk;
+
+ /* Configure the I2S pins in correct mode */
+ s3c2410_gpio_cfgpin(S3C2410_GPE0, S3C2410_GPE0_I2SLRCK);
+@@ -642,66 +145,8 @@
+ s3c2410_gpio_cfgpin(S3C2410_GPE3, S3C2410_GPE3_I2SSDI);
+ s3c2410_gpio_cfgpin(S3C2410_GPE4, S3C2410_GPE4_I2SSDO);
+
+- s3c2412_snd_txctrl(0);
+- s3c2412_snd_rxctrl(0);
+-
+- return 0;
+-}
+-
+-#ifdef CONFIG_PM
+-static int s3c2412_i2s_suspend(struct snd_soc_dai *dai)
+-{
+- struct s3c2412_i2s_info *i2s = &s3c2412_i2s;
+- u32 iismod;
+-
+- if (dai->active) {
+- i2s->suspend_iismod = readl(i2s->regs + S3C2412_IISMOD);
+- i2s->suspend_iiscon = readl(i2s->regs + S3C2412_IISCON);
+- i2s->suspend_iispsr = readl(i2s->regs + S3C2412_IISPSR);
+-
+- /* some basic suspend checks */
+-
+- iismod = readl(i2s->regs + S3C2412_IISMOD);
+-
+- if (iismod & S3C2412_IISCON_RXDMA_ACTIVE)
+- pr_warning("%s: RXDMA active?\n", __func__);
+-
+- if (iismod & S3C2412_IISCON_TXDMA_ACTIVE)
+- pr_warning("%s: TXDMA active?\n", __func__);
+-
+- if (iismod & S3C2412_IISCON_IIS_ACTIVE)
+- pr_warning("%s: IIS active\n", __func__);
+- }
+-
+- return 0;
+-}
+-
+-static int s3c2412_i2s_resume(struct snd_soc_dai *dai)
+-{
+- struct s3c2412_i2s_info *i2s = &s3c2412_i2s;
+-
+- pr_info("dai_active %d, IISMOD %08x, IISCON %08x\n",
+- dai->active, i2s->suspend_iismod, i2s->suspend_iiscon);
+-
+- if (dai->active) {
+- writel(i2s->suspend_iiscon, i2s->regs + S3C2412_IISCON);
+- writel(i2s->suspend_iismod, i2s->regs + S3C2412_IISMOD);
+- writel(i2s->suspend_iispsr, i2s->regs + S3C2412_IISPSR);
+-
+- writel(S3C2412_IISFIC_RXFLUSH | S3C2412_IISFIC_TXFLUSH,
+- i2s->regs + S3C2412_IISFIC);
+-
+- ndelay(250);
+- writel(0x0, i2s->regs + S3C2412_IISFIC);
+-
+- }
+-
+ return 0;
+ }
+-#else
+-#define s3c2412_i2s_suspend NULL
+-#define s3c2412_i2s_resume NULL
+-#endif /* CONFIG_PM */
+
+ #define S3C2412_I2S_RATES \
+ (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
+@@ -709,11 +154,9 @@
+ SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
+
+ struct snd_soc_dai s3c2412_i2s_dai = {
+- .name = "s3c2412-i2s",
+- .id = 0,
+- .probe = s3c2412_i2s_probe,
+- .suspend = s3c2412_i2s_suspend,
+- .resume = s3c2412_i2s_resume,
++ .name = "s3c2412-i2s",
++ .id = 0,
++ .probe = s3c2412_i2s_probe,
+ .playback = {
+ .channels_min = 2,
+ .channels_max = 2,
+@@ -727,10 +170,6 @@
+ .formats = SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE,
+ },
+ .ops = {
+- .trigger = s3c2412_i2s_trigger,
+- .hw_params = s3c2412_i2s_hw_params,
+- .set_fmt = s3c2412_i2s_set_fmt,
+- .set_clkdiv = s3c2412_i2s_set_clkdiv,
+ .set_sysclk = s3c2412_i2s_set_sysclk,
+ },
+ };
+@@ -738,7 +177,7 @@
+
+ static int __init s3c2412_i2s_init(void)
+ {
+- return snd_soc_register_dai(&s3c2412_i2s_dai);
++ return s3c_i2sv2_register_dai(&s3c2412_i2s_dai);
+ }
+ module_init(s3c2412_i2s_init);
+
+@@ -748,7 +187,6 @@
+ }
+ module_exit(s3c2412_i2s_exit);
+
+-
+ /* Module information */
+ MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>");
+ MODULE_DESCRIPTION("S3C2412 I2S SoC Interface");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/s3c2412-i2s.h linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/s3c2412-i2s.h
+--- linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/s3c2412-i2s.h 2009-05-10 22:05:01.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/s3c2412-i2s.h 2009-05-10 22:28:00.000000000 +0200
+@@ -15,9 +15,11 @@
+ #ifndef __SND_SOC_S3C24XX_S3C2412_I2S_H
+ #define __SND_SOC_S3C24XX_S3C2412_I2S_H __FILE__
+
+-#define S3C2412_DIV_BCLK (1)
+-#define S3C2412_DIV_RCLK (2)
+-#define S3C2412_DIV_PRESCALER (3)
++#include "s3c-i2s-v2.h"
++
++#define S3C2412_DIV_BCLK S3C_I2SV2_DIV_BCLK
++#define S3C2412_DIV_RCLK S3C_I2SV2_DIV_RCLK
++#define S3C2412_DIV_PRESCALER S3C_I2SV2_DIV_PRESCALER
+
+ #define S3C2412_CLKSRC_PCLK (0)
+ #define S3C2412_CLKSRC_I2SCLK (1)
+@@ -26,13 +28,4 @@
+
+ extern struct snd_soc_dai s3c2412_i2s_dai;
+
+-struct s3c2412_rate_calc {
+- unsigned int clk_div; /* for prescaler */
+- unsigned int fs_div; /* for root frame clock */
+-};
+-
+-extern int s3c2412_iis_calc_rate(struct s3c2412_rate_calc *info,
+- unsigned int *fstab,
+- unsigned int rate, struct clk *clk);
+-
+ #endif /* __SND_SOC_S3C24XX_S3C2412_I2S_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/s3c2443-ac97.c linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/s3c2443-ac97.c
+--- linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/s3c2443-ac97.c 2009-05-10 22:05:01.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/s3c2443-ac97.c 2009-05-10 22:28:00.000000000 +0200
+@@ -31,7 +31,7 @@
+ #include <plat/regs-ac97.h>
+ #include <mach/regs-gpio.h>
+ #include <mach/regs-clock.h>
+-#include <mach/audio.h>
++#include <plat/audio.h>
+ #include <asm/dma.h>
+ #include <mach/dma.h>
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/s3c24xx-i2s.c linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/s3c24xx-i2s.c
+--- linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/s3c24xx-i2s.c 2009-05-10 22:05:01.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/s3c24xx-i2s.c 2009-05-10 22:28:00.000000000 +0200
+@@ -4,7 +4,7 @@
+ * (c) 2006 Wolfson Microelectronics PLC.
+ * Graeme Gregory graeme.gregory@wolfsonmicro.com or linux@wolfsonmicro.com
+ *
+- * (c) 2004-2005 Simtec Electronics
++ * Copyright 2004-2005 Simtec Electronics
+ * http://armlinux.simtec.co.uk/
+ * Ben Dooks <ben@simtec.co.uk>
+ *
+@@ -30,11 +30,11 @@
+ #include <mach/hardware.h>
+ #include <mach/regs-gpio.h>
+ #include <mach/regs-clock.h>
+-#include <mach/audio.h>
++#include <plat/audio.h>
+ #include <asm/dma.h>
+ #include <mach/dma.h>
+
+-#include <asm/plat-s3c24xx/regs-iis.h>
++#include <plat/regs-iis.h>
+
+ #include "s3c24xx-pcm.h"
+ #include "s3c24xx-i2s.h"
+@@ -175,7 +175,7 @@
+ static int s3c24xx_snd_lrsync(void)
+ {
+ u32 iiscon;
+- int timeout = 50; /* 5ms */
++ int timeout = 5; /* 500us, 125 should be enough at 8kHz */
+
+ DBG("Entered %s\n", __func__);
+
+@@ -291,11 +291,14 @@
+ case SNDRV_PCM_TRIGGER_START:
+ case SNDRV_PCM_TRIGGER_RESUME:
+ case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+- if (!s3c24xx_snd_is_clkmaster()) {
+- ret = s3c24xx_snd_lrsync();
+- if (ret)
+- goto exit_err;
+- }
++ if (!s3c24xx_snd_is_clkmaster())
++ /* we ignore the return code, if it sync'd then fine,
++ * if it didn't sync, which happens after resume the
++ * first time when there was a live stream at suspend,
++ * just let it timeout, the stream picks up OK after
++ * that and LRCK is evidently working again.
++ */
++ s3c24xx_snd_lrsync();
+
+ if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
+ s3c24xx_snd_rxctrl(1);
+@@ -315,7 +318,6 @@
+ break;
+ }
+
+-exit_err:
+ return ret;
+ }
+
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/s3c24xx-pcm.c linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/s3c24xx-pcm.c
+--- linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/s3c24xx-pcm.c 2009-05-10 22:05:01.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/s3c24xx-pcm.c 2009-05-10 22:28:00.000000000 +0200
+@@ -4,7 +4,7 @@
+ * (c) 2006 Wolfson Microelectronics PLC.
+ * Graeme Gregory graeme.gregory@wolfsonmicro.com or linux@wolfsonmicro.com
+ *
+- * (c) 2004-2005 Simtec Electronics
++ * Copyright 2004-2005 Simtec Electronics
+ * http://armlinux.simtec.co.uk/
+ * Ben Dooks <ben@simtec.co.uk>
+ *
+@@ -29,7 +29,7 @@
+ #include <asm/dma.h>
+ #include <mach/hardware.h>
+ #include <mach/dma.h>
+-#include <mach/audio.h>
++#include <plat/audio.h>
+
+ #include "s3c24xx-pcm.h"
+
+@@ -82,11 +82,19 @@
+ {
+ struct s3c24xx_runtime_data *prtd = substream->runtime->private_data;
+ dma_addr_t pos = prtd->dma_pos;
++ unsigned int limit;
+ int ret;
+
+ DBG("Entered %s\n", __func__);
+
+- while (prtd->dma_loaded < prtd->dma_limit) {
++ if (s3c_dma_has_circular()) {
++ limit = (prtd->dma_end - prtd->dma_start) / prtd->dma_period;
++ } else
++ limit = prtd->dma_limit;
++
++ DBG("%s: loaded %d, limit %d\n", __func__, prtd->dma_loaded, limit);
++
++ while (prtd->dma_loaded < limit) {
+ unsigned long len = prtd->dma_period;
+
+ DBG("dma_loaded: %d\n", prtd->dma_loaded);
+@@ -130,7 +138,7 @@
+ snd_pcm_period_elapsed(substream);
+
+ spin_lock(&prtd->lock);
+- if (prtd->state & ST_RUNNING) {
++ if (prtd->state & ST_RUNNING && !s3c_dma_has_circular()) {
+ prtd->dma_loaded--;
+ s3c24xx_pcm_enqueue(substream);
+ }
+@@ -168,9 +176,14 @@
+ prtd->params->client, NULL);
+
+ if (ret < 0) {
+- DBG(KERN_ERR "failed to get dma channel\n");
++ DBG(KERN_ERR "failed to get dma channel: %d\n", ret);
+ return ret;
+ }
++
++ /* use the circular buffering if we have it available. */
++ if (s3c_dma_has_circular())
++ s3c2410_dma_setflags(prtd->params->channel,
++ S3C2410_DMAF_CIRCULAR);
+ }
+
+ s3c2410_dma_set_buffdone_fn(prtd->params->channel,
+@@ -225,23 +238,16 @@
+ * sync to pclk, half-word transfers to the IIS-FIFO. */
+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+ s3c2410_dma_devconfig(prtd->params->channel,
+- S3C2410_DMASRC_MEM, S3C2410_DISRCC_INC |
+- S3C2410_DISRCC_APB, prtd->params->dma_addr);
+-
+- s3c2410_dma_config(prtd->params->channel,
+- prtd->params->dma_size,
+- S3C2410_DCON_SYNC_PCLK |
+- S3C2410_DCON_HANDSHAKE);
++ S3C2410_DMASRC_MEM,
++ prtd->params->dma_addr);
+ } else {
+- s3c2410_dma_config(prtd->params->channel,
+- prtd->params->dma_size,
+- S3C2410_DCON_HANDSHAKE |
+- S3C2410_DCON_SYNC_PCLK);
+-
+ s3c2410_dma_devconfig(prtd->params->channel,
+- S3C2410_DMASRC_HW, 0x3,
+- prtd->params->dma_addr);
++ S3C2410_DMASRC_HW,
++ prtd->params->dma_addr);
+ }
++
++ s3c2410_dma_config(prtd->params->channel,
++ prtd->params->dma_size);
+
+ /* flush the DMA channel */
+ s3c2410_dma_ctrl(prtd->params->channel, S3C2410_DMAOP_FLUSH);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/s3c24xx_uda134x.c linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/s3c24xx_uda134x.c
+--- linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/s3c24xx_uda134x.c 2009-05-10 22:05:01.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/s3c24xx_uda134x.c 2009-05-10 22:28:00.000000000 +0200
+@@ -22,7 +22,7 @@
+ #include <sound/s3c24xx_uda134x.h>
+ #include <sound/uda134x.h>
+
+-#include <asm/plat-s3c24xx/regs-iis.h>
++#include <plat/regs-iis.h>
+
+ #include "s3c24xx-pcm.h"
+ #include "s3c24xx-i2s.h"
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/s3c64xx-i2s.c linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/s3c64xx-i2s.c
+--- linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/s3c64xx-i2s.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/s3c64xx-i2s.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,219 @@
++/* sound/soc/s3c24xx/s3c64xx-i2s.c
++ *
++ * ALSA SoC Audio Layer - S3C64XX I2S driver
++ *
++ * Copyright 2008 Openmoko, Inc.
++ * Copyright 2008 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ * http://armlinux.simtec.co.uk/
++ *
++ * 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.
++ */
++
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/device.h>
++#include <linux/delay.h>
++#include <linux/clk.h>
++#include <linux/kernel.h>
++#include <linux/gpio.h>
++#include <linux/io.h>
++
++#include <sound/core.h>
++#include <sound/pcm.h>
++#include <sound/pcm_params.h>
++#include <sound/initval.h>
++#include <sound/soc.h>
++
++#include <plat/regs-s3c2412-iis.h>
++#include <plat/gpio-bank-d.h>
++#include <plat/gpio-bank-e.h>
++#include <plat/gpio-cfg.h>
++#include <plat/audio.h>
++
++#include <mach/map.h>
++#include <mach/dma.h>
++
++#include "s3c24xx-pcm.h"
++#include "s3c64xx-i2s.h"
++
++static struct s3c2410_dma_client s3c64xx_dma_client_out = {
++ .name = "I2S PCM Stereo out"
++};
++
++static struct s3c2410_dma_client s3c64xx_dma_client_in = {
++ .name = "I2S PCM Stereo in"
++};
++
++static struct s3c24xx_pcm_dma_params s3c64xx_i2s_pcm_stereo_out[2] = {
++ [0] = {
++ .channel = DMACH_I2S0_OUT,
++ .client = &s3c64xx_dma_client_out,
++ .dma_addr = S3C64XX_PA_IIS0 + S3C2412_IISTXD,
++ .dma_size = 4,
++ },
++ [1] = {
++ .channel = DMACH_I2S1_OUT,
++ .client = &s3c64xx_dma_client_out,
++ .dma_addr = S3C64XX_PA_IIS1 + S3C2412_IISTXD,
++ .dma_size = 4,
++ },
++};
++
++static struct s3c24xx_pcm_dma_params s3c64xx_i2s_pcm_stereo_in[2] = {
++ [0] = {
++ .channel = DMACH_I2S0_IN,
++ .client = &s3c64xx_dma_client_in,
++ .dma_addr = S3C64XX_PA_IIS0 + S3C2412_IISRXD,
++ .dma_size = 4,
++ },
++ [1] = {
++ .channel = DMACH_I2S1_IN,
++ .client = &s3c64xx_dma_client_in,
++ .dma_addr = S3C64XX_PA_IIS1 + S3C2412_IISRXD,
++ .dma_size = 4,
++ },
++};
++
++static struct s3c_i2sv2_info s3c64xx_i2s[2];
++
++static inline struct s3c_i2sv2_info *to_info(struct snd_soc_dai *cpu_dai)
++{
++ return cpu_dai->private_data;
++}
++
++static int s3c64xx_i2s_set_sysclk(struct snd_soc_dai *cpu_dai,
++ int clk_id, unsigned int freq, int dir)
++{
++ struct s3c_i2sv2_info *i2s = to_info(cpu_dai);
++ u32 iismod = readl(i2s->regs + S3C2412_IISMOD);
++
++ switch (clk_id) {
++ case S3C64XX_CLKSRC_PCLK:
++ iismod &= ~S3C64XX_IISMOD_IMS_SYSMUX;
++ break;
++
++ case S3C64XX_CLKSRC_MUX:
++ iismod |= S3C64XX_IISMOD_IMS_SYSMUX;
++ break;
++
++ default:
++ return -EINVAL;
++ }
++
++ writel(iismod, i2s->regs + S3C2412_IISMOD);
++
++ return 0;
++}
++
++unsigned long s3c64xx_i2s_get_clockrate(struct snd_soc_dai *dai)
++{
++ struct s3c_i2sv2_info *i2s = to_info(dai);
++
++ return clk_get_rate(i2s->iis_cclk);
++}
++EXPORT_SYMBOL_GPL(s3c64xx_i2s_get_clockrate);
++
++static int s3c64xx_i2s_probe(struct platform_device *pdev,
++ struct snd_soc_dai *dai)
++{
++ struct device *dev = &pdev->dev;
++ struct s3c_i2sv2_info *i2s;
++ int ret;
++
++ dev_dbg(dev, "%s: probing dai %d\n", __func__, pdev->id);
++
++ if (pdev->id < 0 || pdev->id > ARRAY_SIZE(s3c64xx_i2s)) {
++ dev_err(dev, "id %d out of range\n", pdev->id);
++ return -EINVAL;
++ }
++
++ i2s = &s3c64xx_i2s[pdev->id];
++
++ ret = s3c_i2sv2_probe(pdev, dai, i2s,
++ pdev->id ? S3C64XX_PA_IIS1 : S3C64XX_PA_IIS0);
++ if (ret)
++ return ret;
++
++ i2s->dma_capture = &s3c64xx_i2s_pcm_stereo_in[pdev->id];
++ i2s->dma_playback = &s3c64xx_i2s_pcm_stereo_out[pdev->id];
++
++ i2s->iis_cclk = clk_get(dev, "audio-bus");
++ if (IS_ERR(i2s->iis_cclk)) {
++ dev_err(dev, "failed to get audio-bus");
++ iounmap(i2s->regs);
++ return -ENODEV;
++ }
++
++ /* configure GPIO for i2s port */
++ switch (pdev->id) {
++ case 0:
++ s3c_gpio_cfgpin(S3C64XX_GPD(0), S3C64XX_GPD0_I2S0_CLK);
++ s3c_gpio_cfgpin(S3C64XX_GPD(1), S3C64XX_GPD1_I2S0_CDCLK);
++ s3c_gpio_cfgpin(S3C64XX_GPD(2), S3C64XX_GPD2_I2S0_LRCLK);
++ s3c_gpio_cfgpin(S3C64XX_GPD(3), S3C64XX_GPD3_I2S0_DI);
++ s3c_gpio_cfgpin(S3C64XX_GPD(4), S3C64XX_GPD4_I2S0_D0);
++ break;
++ case 1:
++ s3c_gpio_cfgpin(S3C64XX_GPE(0), S3C64XX_GPE0_I2S1_CLK);
++ s3c_gpio_cfgpin(S3C64XX_GPE(1), S3C64XX_GPE1_I2S1_CDCLK);
++ s3c_gpio_cfgpin(S3C64XX_GPE(2), S3C64XX_GPE2_I2S1_LRCLK);
++ s3c_gpio_cfgpin(S3C64XX_GPE(3), S3C64XX_GPE3_I2S1_DI);
++ s3c_gpio_cfgpin(S3C64XX_GPE(4), S3C64XX_GPE4_I2S1_D0);
++ }
++
++ return 0;
++}
++
++
++#define S3C64XX_I2S_RATES \
++ (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
++ SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
++ SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
++
++#define S3C64XX_I2S_FMTS \
++ (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE)
++
++struct snd_soc_dai s3c64xx_i2s_dai = {
++ .name = "s3c64xx-i2s",
++ .id = 0,
++ .probe = s3c64xx_i2s_probe,
++ .playback = {
++ .channels_min = 2,
++ .channels_max = 2,
++ .rates = S3C64XX_I2S_RATES,
++ .formats = S3C64XX_I2S_FMTS,
++ },
++ .capture = {
++ .channels_min = 2,
++ .channels_max = 2,
++ .rates = S3C64XX_I2S_RATES,
++ .formats = S3C64XX_I2S_FMTS,
++ },
++ .ops = {
++ .set_sysclk = s3c64xx_i2s_set_sysclk,
++ },
++};
++EXPORT_SYMBOL_GPL(s3c64xx_i2s_dai);
++
++static int __init s3c64xx_i2s_init(void)
++{
++ return s3c_i2sv2_register_dai(&s3c64xx_i2s_dai);
++}
++module_init(s3c64xx_i2s_init);
++
++static void __exit s3c64xx_i2s_exit(void)
++{
++ snd_soc_unregister_dai(&s3c64xx_i2s_dai);
++}
++module_exit(s3c64xx_i2s_exit);
++
++/* Module information */
++MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>");
++MODULE_DESCRIPTION("S3C64XX I2S SoC Interface");
++MODULE_LICENSE("GPL");
++
++
++
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/s3c64xx-i2s.h linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/s3c64xx-i2s.h
+--- linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/s3c64xx-i2s.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/s3c64xx-i2s.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,31 @@
++/* sound/soc/s3c24xx/s3c64xx-i2s.h
++ *
++ * ALSA SoC Audio Layer - S3C64XX I2S driver
++ *
++ * Copyright 2008 Openmoko, Inc.
++ * Copyright 2008 Simtec Electronics
++ * Ben Dooks <ben@simtec.co.uk>
++ * http://armlinux.simtec.co.uk/
++ *
++ * 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.
++ */
++
++#ifndef __SND_SOC_S3C24XX_S3C64XX_I2S_H
++#define __SND_SOC_S3C24XX_S3C64XX_I2S_H __FILE__
++
++#include "s3c-i2s-v2.h"
++
++#define S3C64XX_DIV_BCLK S3C_I2SV2_DIV_BCLK
++#define S3C64XX_DIV_RCLK S3C_I2SV2_DIV_RCLK
++#define S3C64XX_DIV_PRESCALER S3C_I2SV2_DIV_PRESCALER
++
++#define S3C64XX_CLKSRC_PCLK (0)
++#define S3C64XX_CLKSRC_MUX (1)
++
++extern struct snd_soc_dai s3c64xx_i2s_dai;
++
++extern unsigned long s3c64xx_i2s_get_clockrate(struct snd_soc_dai *cpu_dai);
++
++#endif /* __SND_SOC_S3C24XX_S3C64XX_I2S_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/s3c-i2s-v2.c linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/s3c-i2s-v2.c
+--- linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/s3c-i2s-v2.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/s3c-i2s-v2.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,645 @@
++/* sound/soc/s3c24xx/s3c-i2c-v2.c
++ *
++ * ALSA Soc Audio Layer - I2S core for newer Samsung SoCs.
++ *
++ * Copyright (c) 2006 Wolfson Microelectronics PLC.
++ * Graeme Gregory graeme.gregory@wolfsonmicro.com
++ * linux@wolfsonmicro.com
++ *
++ * Copyright (c) 2008, 2007, 2004-2005 Simtec Electronics
++ * http://armlinux.simtec.co.uk/
++ * Ben Dooks <ben@simtec.co.uk>
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ */
++
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/device.h>
++#include <linux/delay.h>
++#include <linux/clk.h>
++#include <linux/kernel.h>
++#include <linux/io.h>
++
++#include <sound/core.h>
++#include <sound/pcm.h>
++#include <sound/pcm_params.h>
++#include <sound/initval.h>
++#include <sound/soc.h>
++
++#include <plat/regs-s3c2412-iis.h>
++
++#include <plat/audio.h>
++#include <mach/dma.h>
++
++#include "s3c-i2s-v2.h"
++
++#define S3C2412_I2S_DEBUG_CON 0
++#define S3C2412_I2S_DEBUG 0
++
++#if S3C2412_I2S_DEBUG
++#define DBG(x...) printk(KERN_INFO x)
++#else
++#define DBG(x...) do { } while (0)
++#endif
++
++static inline struct s3c_i2sv2_info *to_info(struct snd_soc_dai *cpu_dai)
++{
++ return cpu_dai->private_data;
++}
++
++#define bit_set(v, b) (((v) & (b)) ? 1 : 0)
++
++#if S3C2412_I2S_DEBUG_CON
++static void dbg_showcon(const char *fn, u32 con)
++{
++ printk(KERN_DEBUG "%s: LRI=%d, TXFEMPT=%d, RXFEMPT=%d, TXFFULL=%d, RXFFULL=%d\n", fn,
++ bit_set(con, S3C2412_IISCON_LRINDEX),
++ bit_set(con, S3C2412_IISCON_TXFIFO_EMPTY),
++ bit_set(con, S3C2412_IISCON_RXFIFO_EMPTY),
++ bit_set(con, S3C2412_IISCON_TXFIFO_FULL),
++ bit_set(con, S3C2412_IISCON_RXFIFO_FULL));
++
++ printk(KERN_DEBUG "%s: PAUSE: TXDMA=%d, RXDMA=%d, TXCH=%d, RXCH=%d\n",
++ fn,
++ bit_set(con, S3C2412_IISCON_TXDMA_PAUSE),
++ bit_set(con, S3C2412_IISCON_RXDMA_PAUSE),
++ bit_set(con, S3C2412_IISCON_TXCH_PAUSE),
++ bit_set(con, S3C2412_IISCON_RXCH_PAUSE));
++ printk(KERN_DEBUG "%s: ACTIVE: TXDMA=%d, RXDMA=%d, IIS=%d\n", fn,
++ bit_set(con, S3C2412_IISCON_TXDMA_ACTIVE),
++ bit_set(con, S3C2412_IISCON_RXDMA_ACTIVE),
++ bit_set(con, S3C2412_IISCON_IIS_ACTIVE));
++}
++#else
++static inline void dbg_showcon(const char *fn, u32 con)
++{
++}
++#endif
++
++
++/* Turn on or off the transmission path. */
++void s3c2412_snd_txctrl(struct s3c_i2sv2_info *i2s, int on)
++{
++ void __iomem *regs = i2s->regs;
++ u32 fic, con, mod;
++
++ DBG("%s(%d)\n", __func__, on);
++
++ fic = readl(regs + S3C2412_IISFIC);
++ con = readl(regs + S3C2412_IISCON);
++ mod = readl(regs + S3C2412_IISMOD);
++
++ DBG("%s: IIS: CON=%x MOD=%x FIC=%x\n", __func__, con, mod, fic);
++
++ if (on) {
++ con |= S3C2412_IISCON_TXDMA_ACTIVE | S3C2412_IISCON_IIS_ACTIVE;
++ con &= ~S3C2412_IISCON_TXDMA_PAUSE;
++ con &= ~S3C2412_IISCON_TXCH_PAUSE;
++
++ switch (mod & S3C2412_IISMOD_MODE_MASK) {
++ case S3C2412_IISMOD_MODE_TXONLY:
++ case S3C2412_IISMOD_MODE_TXRX:
++ /* do nothing, we are in the right mode */
++ break;
++
++ case S3C2412_IISMOD_MODE_RXONLY:
++ mod &= ~S3C2412_IISMOD_MODE_MASK;
++ mod |= S3C2412_IISMOD_MODE_TXRX;
++ break;
++
++ default:
++ dev_err(i2s->dev, "TXEN: Invalid MODE in IISMOD\n");
++ }
++
++ writel(con, regs + S3C2412_IISCON);
++ writel(mod, regs + S3C2412_IISMOD);
++ } else {
++ /* Note, we do not have any indication that the FIFO problems
++ * tha the S3C2410/2440 had apply here, so we should be able
++ * to disable the DMA and TX without resetting the FIFOS.
++ */
++
++ con |= S3C2412_IISCON_TXDMA_PAUSE;
++ con |= S3C2412_IISCON_TXCH_PAUSE;
++ con &= ~S3C2412_IISCON_TXDMA_ACTIVE;
++
++ switch (mod & S3C2412_IISMOD_MODE_MASK) {
++ case S3C2412_IISMOD_MODE_TXRX:
++ mod &= ~S3C2412_IISMOD_MODE_MASK;
++ mod |= S3C2412_IISMOD_MODE_RXONLY;
++ break;
++
++ case S3C2412_IISMOD_MODE_TXONLY:
++ mod &= ~S3C2412_IISMOD_MODE_MASK;
++ con &= ~S3C2412_IISCON_IIS_ACTIVE;
++ break;
++
++ default:
++ dev_err(i2s->dev, "TXDIS: Invalid MODE in IISMOD\n");
++ }
++
++ writel(mod, regs + S3C2412_IISMOD);
++ writel(con, regs + S3C2412_IISCON);
++ }
++
++ fic = readl(regs + S3C2412_IISFIC);
++ dbg_showcon(__func__, con);
++ DBG("%s: IIS: CON=%x MOD=%x FIC=%x\n", __func__, con, mod, fic);
++}
++EXPORT_SYMBOL_GPL(s3c2412_snd_txctrl);
++
++void s3c2412_snd_rxctrl(struct s3c_i2sv2_info *i2s, int on)
++{
++ void __iomem *regs = i2s->regs;
++ u32 fic, con, mod;
++
++ DBG("%s(%d)\n", __func__, on);
++
++ fic = readl(regs + S3C2412_IISFIC);
++ con = readl(regs + S3C2412_IISCON);
++ mod = readl(regs + S3C2412_IISMOD);
++
++ DBG("%s: IIS: CON=%x MOD=%x FIC=%x\n", __func__, con, mod, fic);
++
++ if (on) {
++ con |= S3C2412_IISCON_RXDMA_ACTIVE | S3C2412_IISCON_IIS_ACTIVE;
++ con &= ~S3C2412_IISCON_RXDMA_PAUSE;
++ con &= ~S3C2412_IISCON_RXCH_PAUSE;
++
++ switch (mod & S3C2412_IISMOD_MODE_MASK) {
++ case S3C2412_IISMOD_MODE_TXRX:
++ case S3C2412_IISMOD_MODE_RXONLY:
++ /* do nothing, we are in the right mode */
++ break;
++
++ case S3C2412_IISMOD_MODE_TXONLY:
++ mod &= ~S3C2412_IISMOD_MODE_MASK;
++ mod |= S3C2412_IISMOD_MODE_TXRX;
++ break;
++
++ default:
++ dev_err(i2s->dev, "RXEN: Invalid MODE in IISMOD\n");
++ }
++
++ writel(mod, regs + S3C2412_IISMOD);
++ writel(con, regs + S3C2412_IISCON);
++ } else {
++ /* See txctrl notes on FIFOs. */
++
++ con &= ~S3C2412_IISCON_RXDMA_ACTIVE;
++ con |= S3C2412_IISCON_RXDMA_PAUSE;
++ con |= S3C2412_IISCON_RXCH_PAUSE;
++
++ switch (mod & S3C2412_IISMOD_MODE_MASK) {
++ case S3C2412_IISMOD_MODE_RXONLY:
++ con &= ~S3C2412_IISCON_IIS_ACTIVE;
++ mod &= ~S3C2412_IISMOD_MODE_MASK;
++ break;
++
++ case S3C2412_IISMOD_MODE_TXRX:
++ mod &= ~S3C2412_IISMOD_MODE_MASK;
++ mod |= S3C2412_IISMOD_MODE_TXONLY;
++ break;
++
++ default:
++ dev_err(i2s->dev, "RXEN: Invalid MODE in IISMOD\n");
++ }
++
++ writel(con, regs + S3C2412_IISCON);
++ writel(mod, regs + S3C2412_IISMOD);
++ }
++
++ fic = readl(regs + S3C2412_IISFIC);
++ DBG("%s: IIS: CON=%x MOD=%x FIC=%x\n", __func__, con, mod, fic);
++}
++EXPORT_SYMBOL_GPL(s3c2412_snd_rxctrl);
++
++/*
++ * Wait for the LR signal to allow synchronisation to the L/R clock
++ * from the codec. May only be needed for slave mode.
++ */
++static int s3c2412_snd_lrsync(struct s3c_i2sv2_info *i2s)
++{
++ u32 iiscon;
++ unsigned long timeout = jiffies + msecs_to_jiffies(5);
++
++ DBG("Entered %s\n", __func__);
++
++ while (1) {
++ iiscon = readl(i2s->regs + S3C2412_IISCON);
++ if (iiscon & S3C2412_IISCON_LRINDEX)
++ break;
++
++ if (timeout < jiffies) {
++ printk(KERN_ERR "%s: timeout\n", __func__);
++ return -ETIMEDOUT;
++ }
++ }
++
++ return 0;
++}
++
++/*
++ * Set S3C2412 I2S DAI format
++ */
++static int s3c2412_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
++ unsigned int fmt)
++{
++ struct s3c_i2sv2_info *i2s = to_info(cpu_dai);
++ u32 iismod;
++
++ DBG("Entered %s\n", __func__);
++
++ iismod = readl(i2s->regs + S3C2412_IISMOD);
++ DBG("hw_params r: IISMOD: %x \n", iismod);
++
++#if defined(CONFIG_CPU_S3C2412) || defined(CONFIG_CPU_S3C2413)
++#define IISMOD_MASTER_MASK S3C2412_IISMOD_MASTER_MASK
++#define IISMOD_SLAVE S3C2412_IISMOD_SLAVE
++#define IISMOD_MASTER S3C2412_IISMOD_MASTER_INTERNAL
++#endif
++
++#if defined(CONFIG_PLAT_S3C64XX)
++/* From Rev1.1 datasheet, we have two master and two slave modes:
++ * IMS[11:10]:
++ * 00 = master mode, fed from PCLK
++ * 01 = master mode, fed from CLKAUDIO
++ * 10 = slave mode, using PCLK
++ * 11 = slave mode, using I2SCLK
++ */
++#define IISMOD_MASTER_MASK (1 << 11)
++#define IISMOD_SLAVE (1 << 11)
++#define IISMOD_MASTER (0x0)
++#endif
++
++ switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
++ case SND_SOC_DAIFMT_CBM_CFM:
++ i2s->master = 0;
++ iismod &= ~IISMOD_MASTER_MASK;
++ iismod |= IISMOD_SLAVE;
++ break;
++ case SND_SOC_DAIFMT_CBS_CFS:
++ i2s->master = 1;
++ iismod &= ~IISMOD_MASTER_MASK;
++ iismod |= IISMOD_MASTER;
++ break;
++ default:
++ DBG("unknwon master/slave format\n");
++ return -EINVAL;
++ }
++
++ iismod &= ~S3C2412_IISMOD_SDF_MASK;
++
++ switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
++ case SND_SOC_DAIFMT_RIGHT_J:
++ iismod |= S3C2412_IISMOD_SDF_MSB;
++ break;
++ case SND_SOC_DAIFMT_LEFT_J:
++ iismod |= S3C2412_IISMOD_SDF_LSB;
++ break;
++ case SND_SOC_DAIFMT_I2S:
++ iismod |= S3C2412_IISMOD_SDF_IIS;
++ break;
++ default:
++ DBG("Unknown data format\n");
++ return -EINVAL;
++ }
++
++ writel(iismod, i2s->regs + S3C2412_IISMOD);
++ DBG("hw_params w: IISMOD: %x \n", iismod);
++ return 0;
++}
++
++static int s3c2412_i2s_hw_params(struct snd_pcm_substream *substream,
++ struct snd_pcm_hw_params *params,
++ struct snd_soc_dai *socdai)
++{
++ struct snd_soc_pcm_runtime *rtd = substream->private_data;
++ struct snd_soc_dai_link *dai = rtd->dai;
++ struct s3c_i2sv2_info *i2s = to_info(dai->cpu_dai);
++ u32 iismod;
++
++ DBG("Entered %s\n", __func__);
++
++ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
++ dai->cpu_dai->dma_data = i2s->dma_playback;
++ else
++ dai->cpu_dai->dma_data = i2s->dma_capture;
++
++ /* Working copies of register */
++ iismod = readl(i2s->regs + S3C2412_IISMOD);
++ DBG("%s: r: IISMOD: %x\n", __func__, iismod);
++
++ switch (params_format(params)) {
++ case SNDRV_PCM_FORMAT_S8:
++ iismod |= S3C2412_IISMOD_8BIT;
++ break;
++ case SNDRV_PCM_FORMAT_S16_LE:
++ iismod &= ~S3C2412_IISMOD_8BIT;
++ break;
++ }
++
++ writel(iismod, i2s->regs + S3C2412_IISMOD);
++ DBG("%s: w: IISMOD: %x\n", __func__, iismod);
++ return 0;
++}
++
++static int s3c2412_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
++ struct snd_soc_dai *dai)
++{
++ struct snd_soc_pcm_runtime *rtd = substream->private_data;
++ struct s3c_i2sv2_info *i2s = to_info(rtd->dai->cpu_dai);
++ int capture = (substream->stream == SNDRV_PCM_STREAM_CAPTURE);
++ unsigned long irqs;
++ int ret = 0;
++
++ DBG("Entered %s\n", __func__);
++
++ switch (cmd) {
++ case SNDRV_PCM_TRIGGER_START:
++ /* On start, ensure that the FIFOs are cleared and reset. */
++
++ writel(capture ? S3C2412_IISFIC_RXFLUSH : S3C2412_IISFIC_TXFLUSH,
++ i2s->regs + S3C2412_IISFIC);
++
++ /* clear again, just in case */
++ writel(0x0, i2s->regs + S3C2412_IISFIC);
++
++ case SNDRV_PCM_TRIGGER_RESUME:
++ case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
++ if (!i2s->master) {
++ ret = s3c2412_snd_lrsync(i2s);
++ if (ret)
++ goto exit_err;
++ }
++
++ local_irq_save(irqs);
++
++ if (capture)
++ s3c2412_snd_rxctrl(i2s, 1);
++ else
++ s3c2412_snd_txctrl(i2s, 1);
++
++ local_irq_restore(irqs);
++ break;
++
++ case SNDRV_PCM_TRIGGER_STOP:
++ case SNDRV_PCM_TRIGGER_SUSPEND:
++ case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
++ local_irq_save(irqs);
++
++ if (capture)
++ s3c2412_snd_rxctrl(i2s, 0);
++ else
++ s3c2412_snd_txctrl(i2s, 0);
++
++ local_irq_restore(irqs);
++ break;
++ default:
++ ret = -EINVAL;
++ break;
++ }
++
++exit_err:
++ return ret;
++}
++
++/*
++ * Set S3C2412 Clock dividers
++ */
++static int s3c2412_i2s_set_clkdiv(struct snd_soc_dai *cpu_dai,
++ int div_id, int div)
++{
++ struct s3c_i2sv2_info *i2s = to_info(cpu_dai);
++ u32 reg;
++
++ DBG("%s(%p, %d, %d)\n", __func__, cpu_dai, div_id, div);
++
++ switch (div_id) {
++ case S3C_I2SV2_DIV_BCLK:
++ reg = readl(i2s->regs + S3C2412_IISMOD);
++ reg &= ~S3C2412_IISMOD_BCLK_MASK;
++ writel(reg | div, i2s->regs + S3C2412_IISMOD);
++
++ DBG("%s: MOD=%08x\n", __func__, readl(i2s->regs + S3C2412_IISMOD));
++ break;
++
++ case S3C_I2SV2_DIV_RCLK:
++ if (div > 3) {
++ /* convert value to bit field */
++
++ switch (div) {
++ case 256:
++ div = S3C2412_IISMOD_RCLK_256FS;
++ break;
++
++ case 384:
++ div = S3C2412_IISMOD_RCLK_384FS;
++ break;
++
++ case 512:
++ div = S3C2412_IISMOD_RCLK_512FS;
++ break;
++
++ case 768:
++ div = S3C2412_IISMOD_RCLK_768FS;
++ break;
++
++ default:
++ return -EINVAL;
++ }
++ }
++
++ reg = readl(i2s->regs + S3C2412_IISMOD);
++ reg &= ~S3C2412_IISMOD_RCLK_MASK;
++ writel(reg | div, i2s->regs + S3C2412_IISMOD);
++ DBG("%s: MOD=%08x\n", __func__, readl(i2s->regs + S3C2412_IISMOD));
++ break;
++
++ case S3C_I2SV2_DIV_PRESCALER:
++ if (div >= 0) {
++ writel((div << 8) | S3C2412_IISPSR_PSREN,
++ i2s->regs + S3C2412_IISPSR);
++ } else {
++ writel(0x0, i2s->regs + S3C2412_IISPSR);
++ }
++ DBG("%s: PSR=%08x\n", __func__, readl(i2s->regs + S3C2412_IISPSR));
++ break;
++
++ default:
++ return -EINVAL;
++ }
++
++ return 0;
++}
++
++/* default table of all avaialable root fs divisors */
++static unsigned int iis_fs_tab[] = { 256, 512, 384, 768 };
++
++int s3c2412_iis_calc_rate(struct s3c_i2sv2_rate_calc *info,
++ unsigned int *fstab,
++ unsigned int rate, struct clk *clk)
++{
++ unsigned long clkrate = clk_get_rate(clk);
++ unsigned int div;
++ unsigned int fsclk;
++ unsigned int actual;
++ unsigned int fs;
++ unsigned int fsdiv;
++ signed int deviation = 0;
++ unsigned int best_fs = 0;
++ unsigned int best_div = 0;
++ unsigned int best_rate = 0;
++ unsigned int best_deviation = INT_MAX;
++
++ if (fstab == NULL)
++ fstab = iis_fs_tab;
++
++ for (fs = 0; fs < ARRAY_SIZE(iis_fs_tab); fs++) {
++ fsdiv = iis_fs_tab[fs];
++
++ fsclk = clkrate / fsdiv;
++ div = fsclk / rate;
++
++ if ((fsclk % rate) > (rate / 2))
++ div++;
++
++ if (div <= 1)
++ continue;
++
++ actual = clkrate / (fsdiv * div);
++ deviation = actual - rate;
++
++ printk(KERN_DEBUG "%dfs: div %d => result %d, deviation %d\n",
++ fsdiv, div, actual, deviation);
++
++ deviation = abs(deviation);
++
++ if (deviation < best_deviation) {
++ best_fs = fsdiv;
++ best_div = div;
++ best_rate = actual;
++ best_deviation = deviation;
++ }
++
++ if (deviation == 0)
++ break;
++ }
++
++ printk(KERN_DEBUG "best: fs=%d, div=%d, rate=%d\n",
++ best_fs, best_div, best_rate);
++
++ info->fs_div = best_fs;
++ info->clk_div = best_div;
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(s3c2412_iis_calc_rate);
++
++int s3c_i2sv2_probe(struct platform_device *pdev,
++ struct snd_soc_dai *dai,
++ struct s3c_i2sv2_info *i2s,
++ unsigned long base)
++{
++ struct device *dev = &pdev->dev;
++
++ i2s->dev = dev;
++
++ /* record our i2s structure for later use in the callbacks */
++ dai->private_data = i2s;
++
++ i2s->regs = ioremap(base, 0x100);
++ if (i2s->regs == NULL) {
++ dev_err(dev, "cannot ioremap registers\n");
++ return -ENXIO;
++ }
++
++ i2s->iis_pclk = clk_get(dev, "iis");
++ if (i2s->iis_pclk == NULL) {
++ DBG("failed to get iis_clock\n");
++ iounmap(i2s->regs);
++ return -ENOENT;
++ }
++
++ clk_enable(i2s->iis_pclk);
++
++ s3c2412_snd_txctrl(i2s, 0);
++ s3c2412_snd_rxctrl(i2s, 0);
++
++ return 0;
++}
++
++EXPORT_SYMBOL_GPL(s3c_i2sv2_probe);
++
++#ifdef CONFIG_PM
++static int s3c2412_i2s_suspend(struct snd_soc_dai *dai)
++{
++ struct s3c_i2sv2_info *i2s = to_info(dai);
++ u32 iismod;
++
++ if (dai->active) {
++ i2s->suspend_iismod = readl(i2s->regs + S3C2412_IISMOD);
++ i2s->suspend_iiscon = readl(i2s->regs + S3C2412_IISCON);
++ i2s->suspend_iispsr = readl(i2s->regs + S3C2412_IISPSR);
++
++ /* some basic suspend checks */
++
++ iismod = readl(i2s->regs + S3C2412_IISMOD);
++
++ if (iismod & S3C2412_IISCON_RXDMA_ACTIVE)
++ pr_warning("%s: RXDMA active?\n", __func__);
++
++ if (iismod & S3C2412_IISCON_TXDMA_ACTIVE)
++ pr_warning("%s: TXDMA active?\n", __func__);
++
++ if (iismod & S3C2412_IISCON_IIS_ACTIVE)
++ pr_warning("%s: IIS active\n", __func__);
++ }
++
++ return 0;
++}
++
++static int s3c2412_i2s_resume(struct snd_soc_dai *dai)
++{
++ struct s3c_i2sv2_info *i2s = to_info(dai);
++
++ pr_info("dai_active %d, IISMOD %08x, IISCON %08x\n",
++ dai->active, i2s->suspend_iismod, i2s->suspend_iiscon);
++
++ if (dai->active) {
++ writel(i2s->suspend_iiscon, i2s->regs + S3C2412_IISCON);
++ writel(i2s->suspend_iismod, i2s->regs + S3C2412_IISMOD);
++ writel(i2s->suspend_iispsr, i2s->regs + S3C2412_IISPSR);
++
++ writel(S3C2412_IISFIC_RXFLUSH | S3C2412_IISFIC_TXFLUSH,
++ i2s->regs + S3C2412_IISFIC);
++
++ ndelay(250);
++ writel(0x0, i2s->regs + S3C2412_IISFIC);
++ }
++
++ return 0;
++}
++#else
++#define s3c2412_i2s_suspend NULL
++#define s3c2412_i2s_resume NULL
++#endif
++
++int s3c_i2sv2_register_dai(struct snd_soc_dai *dai)
++{
++ dai->ops.trigger = s3c2412_i2s_trigger;
++ dai->ops.hw_params = s3c2412_i2s_hw_params;
++ dai->ops.set_fmt = s3c2412_i2s_set_fmt;
++ dai->ops.set_clkdiv = s3c2412_i2s_set_clkdiv;
++
++ dai->suspend = s3c2412_i2s_suspend;
++ dai->resume = s3c2412_i2s_resume;
++
++ return snd_soc_register_dai(dai);
++}
++
++EXPORT_SYMBOL_GPL(s3c_i2sv2_register_dai);
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/s3c-i2s-v2.h linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/s3c-i2s-v2.h
+--- linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/s3c-i2s-v2.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/s3c-i2s-v2.h 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,90 @@
++/* sound/soc/s3c24xx/s3c-i2s-v2.h
++ *
++ * ALSA Soc Audio Layer - S3C_I2SV2 I2S driver
++ *
++ * Copyright (c) 2007 Simtec Electronics
++ * http://armlinux.simtec.co.uk/
++ * Ben Dooks <ben@simtec.co.uk>
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++*/
++
++/* This code is the core support for the I2S block found in a number of
++ * Samsung SoC devices which is unofficially named I2S-V2. Currently the
++ * S3C2412 and the S3C64XX series use this block to provide 1 or 2 I2S
++ * channels via configurable GPIO.
++ */
++
++#ifndef __SND_SOC_S3C24XX_S3C_I2SV2_I2S_H
++#define __SND_SOC_S3C24XX_S3C_I2SV2_I2S_H __FILE__
++
++#define S3C_I2SV2_DIV_BCLK (1)
++#define S3C_I2SV2_DIV_RCLK (2)
++#define S3C_I2SV2_DIV_PRESCALER (3)
++
++/**
++ * struct s3c_i2sv2_info - S3C I2S-V2 information
++ * @dev: The parent device passed to use from the probe.
++ * @regs: The pointer to the device registe block.
++ * @master: True if the I2S core is the I2S bit clock master.
++ * @dma_playback: DMA information for playback channel.
++ * @dma_capture: DMA information for capture channel.
++ * @suspend_iismod: PM save for the IISMOD register.
++ * @suspend_iiscon: PM save for the IISCON register.
++ * @suspend_iispsr: PM save for the IISPSR register.
++ *
++ * This is the private codec state for the hardware associated with an
++ * I2S channel such as the register mappings and clock sources.
++ */
++struct s3c_i2sv2_info {
++ struct device *dev;
++ void __iomem *regs;
++
++ struct clk *iis_pclk;
++ struct clk *iis_cclk;
++ struct clk *iis_clk;
++
++ unsigned char master;
++
++ struct s3c24xx_pcm_dma_params *dma_playback;
++ struct s3c24xx_pcm_dma_params *dma_capture;
++
++ u32 suspend_iismod;
++ u32 suspend_iiscon;
++ u32 suspend_iispsr;
++};
++
++struct s3c_i2sv2_rate_calc {
++ unsigned int clk_div; /* for prescaler */
++ unsigned int fs_div; /* for root frame clock */
++};
++
++extern int s3c_i2sv2_iis_calc_rate(struct s3c_i2sv2_rate_calc *info,
++ unsigned int *fstab,
++ unsigned int rate, struct clk *clk);
++
++/**
++ * s3c_i2sv2_probe - probe for i2s device helper
++ * @pdev: The platform device supplied to the original probe.
++ * @dai: The ASoC DAI structure supplied to the original probe.
++ * @i2s: Our local i2s structure to fill in.
++ * @base: The base address for the registers.
++ */
++extern int s3c_i2sv2_probe(struct platform_device *pdev,
++ struct snd_soc_dai *dai,
++ struct s3c_i2sv2_info *i2s,
++ unsigned long base);
++
++/**
++ * s3c_i2sv2_register_dai - register dai with soc core
++ * @dai: The snd_soc_dai structure to register
++ *
++ * Fill in any missing fields and then register the given dai with the
++ * soc core.
++ */
++extern int s3c_i2sv2_register_dai(struct snd_soc_dai *dai);
++
++#endif /* __SND_SOC_S3C24XX_S3C_I2SV2_I2S_H */
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/smdk6410-wm8731.c linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/smdk6410-wm8731.c
+--- linux-2.6.29-rc3.owrt/sound/soc/s3c24xx/smdk6410-wm8731.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.29-rc3.owrt.om/sound/soc/s3c24xx/smdk6410-wm8731.c 2009-05-10 22:28:00.000000000 +0200
+@@ -0,0 +1,227 @@
++
++
++#include <linux/module.h>
++#include <linux/moduleparam.h>
++#include <linux/kernel.h>
++#include <linux/clk.h>
++#include <linux/timer.h>
++#include <linux/interrupt.h>
++#include <linux/platform_device.h>
++
++#include <sound/core.h>
++#include <sound/pcm.h>
++#include <sound/pcm_params.h>
++#include <sound/soc.h>
++#include <sound/soc-dapm.h>
++
++#include <asm/mach-types.h>
++
++#include "../codecs/wm8731.h"
++#include "s3c64xx-i2s.h"
++
++static struct platform_device *socdev;
++
++
++
++static void wm_shutdown(struct snd_pcm_substream *substream)
++{
++ printk(KERN_INFO "%s: substream %p\n", __func__, substream);
++}
++
++static int wm_hw_params(struct snd_pcm_substream *substream,
++ struct snd_pcm_hw_params *params)
++{
++ struct snd_soc_pcm_runtime *rtd = substream->private_data;
++ struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
++ struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
++ unsigned int fmt;
++ int ret;
++
++ printk(KERN_INFO "%s: (%p,%p)\n", __func__, substream, params);
++ printk(KERN_INFO "%s: dai: cpu %p, codec %p\n", __func__, cpu_dai, codec_dai);
++
++ //fmt = SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS;
++ fmt = SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM;
++ fmt |= SND_SOC_DAIFMT_I2S;
++
++ ret = snd_soc_dai_set_fmt(codec_dai, fmt);
++ if (ret < 0)
++ return ret;
++
++ /* set cpu DAI configuration */
++ ret = snd_soc_dai_set_fmt(cpu_dai, fmt);
++ if (ret < 0)
++ return ret;
++
++ if (fmt == (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM)) {
++ unsigned long iis_clkrate;
++
++ ret = snd_soc_dai_set_sysclk(cpu_dai, S3C64XX_CLKSRC_MUX, 0,
++ SND_SOC_CLOCK_OUT);
++ if (ret < 0) {
++ printk(KERN_ERR "%s: cpu set_sysclk err\n", __func__);
++ return ret;
++ }
++
++ /* set prescaler division for sample rate */
++ ret = snd_soc_dai_set_clkdiv(cpu_dai, S3C64XX_DIV_PRESCALER, 1);
++ if (ret < 0) {
++ printk(KERN_ERR "%s: codec clkdiv err\n", __func__);
++ return ret;
++ }
++
++ iis_clkrate = s3c64xx_i2s_get_clockrate(cpu_dai) / 2;
++ printk(KERN_INFO "%s: clockrate %ld\n", __func__, iis_clkrate);
++
++ iis_clkrate = 12000000; //tmphack//
++
++ /* set the codec system clock for DAC and ADC */
++ ret = snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK,
++ iis_clkrate,
++ SND_SOC_CLOCK_IN);
++ if (ret < 0) {
++ printk(KERN_ERR "%s: codec sysclk err\n", __func__);
++ return ret;
++ }
++
++ } else {
++ /* TODO */
++ BUG();
++ }
++
++ return 0;
++}
++
++static int wm_startup(struct snd_pcm_substream *substream)
++{
++ struct snd_soc_pcm_runtime *rtd = snd_pcm_substream_chip(substream);
++ struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
++ struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
++ int ret;
++
++ ret = snd_soc_dai_set_sysclk(cpu_dai, S3C64XX_CLKSRC_MUX, 0,
++ SND_SOC_CLOCK_OUT);
++ if (ret < 0) {
++ printk(KERN_ERR "%s: cpu set_sysclk err\n", __func__);
++ return ret;
++ }
++
++ ret = snd_soc_dai_set_clkdiv(cpu_dai, S3C64XX_DIV_PRESCALER, 1);
++ if (ret < 0) {
++ printk(KERN_ERR "%s: cpu set_clkdiv err\n", __func__);
++ return ret;
++ }
++
++ ret = snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK,
++ 12000000, SND_SOC_CLOCK_IN);
++ if (ret < 0) {
++ printk(KERN_ERR "%s: codec sysclk err\n", __func__);
++ return ret;
++ }
++
++ return 0;
++}
++
++static struct snd_soc_ops wm_ops = {
++ .startup = wm_startup,
++ .hw_params = wm_hw_params,
++ .shutdown = wm_shutdown,
++};
++
++static const struct snd_soc_dapm_widget widgets[] = {
++ SND_SOC_DAPM_LINE("Line Out", NULL),
++ SND_SOC_DAPM_HP("Headphone Jack", NULL),
++ SND_SOC_DAPM_INPUT("Line In"),
++};
++
++static const struct snd_soc_dapm_route intercon[] = {
++ /* headphone connected to LHPOUT1, RHPOUT1 */
++ {"Headphone Jack", NULL, "LHPOUT"},
++ {"Headphone Jack", NULL, "RHPOUT"},
++
++ {"Line Out", NULL, "LOUT" },
++ {"Line Out", NULL, "ROUT" },
++
++ {"LLINEIN", NULL, "Line In" },
++ {"RLINEIN", NULL, "Line In" },
++};
++
++static int wm_init(struct snd_soc_codec *codec)
++{
++ printk(KERN_DEBUG "%s: codec %p\n", __func__, codec);
++
++ snd_soc_dapm_new_controls(codec, widgets, ARRAY_SIZE(widgets));
++ snd_soc_dapm_add_routes(codec, intercon, ARRAY_SIZE(intercon));
++
++ snd_soc_dapm_sync(codec);
++
++ return 0;
++}
++
++#include "s3c24xx-pcm.h"
++
++static struct snd_soc_dai_link wm_dai_link = {
++ .name = "WM8731",
++ .stream_name = "WM8731",
++ .cpu_dai = &s3c64xx_i2s_dai,
++ .codec_dai = &wm8731_dai,
++ .init = wm_init,
++ .ops = &wm_ops,
++};
++
++static struct snd_soc_card wm_card = {
++ .name = "SMDK6410-WM8731",
++ .dai_link = &wm_dai_link,
++ .platform = &s3c24xx_soc_platform,
++ .num_links = 1,
++};
++
++struct wm8731_setup_data wm_setup = {
++ .i2c_bus = 0,
++ .i2c_address = 0x1a,
++};
++
++static struct snd_soc_device wm_snd_devdata = {
++ .card = &wm_card,
++ .codec_dev = &soc_codec_dev_wm8731,
++ .codec_data = &wm_setup,
++};
++
++static int __init smdk6410_wm8731_init(void)
++{
++ int ret;
++
++ printk(KERN_INFO "%s: welcome\n", __func__);
++
++ if (!machine_is_smdk6410()) {
++ printk(KERN_INFO "%s: for SMDK6410s\n", __func__);
++ return -ENOENT;
++ }
++
++ socdev = platform_device_alloc("soc-audio", 0);
++ if (!socdev) {
++ printk(KERN_ERR "%s: no device\n", __func__);
++ return -ENOMEM;
++ }
++
++ platform_set_drvdata(socdev, &wm_snd_devdata);
++
++ wm_snd_devdata.dev = &socdev->dev;
++
++ ret = platform_device_add(socdev);
++ if (ret) {
++ printk(KERN_ERR "%s: failed to add\n", __func__);
++ goto err_dev;
++ }
++
++ printk(KERN_INFO "%s: succesfull\n", __func__);
++ return 0;
++
++err_dev:
++ platform_device_put(socdev);
++ return ret;
++}
++
++module_init(smdk6410_wm8731_init);
++MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>");
++MODULE_LICENSE("GPL");
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/sound/soc/soc-core.c linux-2.6.29-rc3.owrt.om/sound/soc/soc-core.c
+--- linux-2.6.29-rc3.owrt/sound/soc/soc-core.c 2009-05-10 22:09:10.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/sound/soc/soc-core.c 2009-05-10 22:28:00.000000000 +0200
+@@ -1190,6 +1190,7 @@
+ }
+ #endif
+
++
+ /**
+ * snd_soc_new_ac97_codec - initailise AC97 device
+ * @codec: audio codec
+diff -ruN --exclude='*.orig' --exclude='*.rej' linux-2.6.29-rc3.owrt/sound/soc/soc-dapm.c linux-2.6.29-rc3.owrt.om/sound/soc/soc-dapm.c
+--- linux-2.6.29-rc3.owrt/sound/soc/soc-dapm.c 2009-05-10 22:05:01.000000000 +0200
++++ linux-2.6.29-rc3.owrt.om/sound/soc/soc-dapm.c 2009-05-10 22:28:00.000000000 +0200
+@@ -332,6 +332,24 @@
+
+ snprintf(path->long_name, name_len, "%s %s",
+ w->name, w->kcontrols[i].name);
++
++ /*
++ * This is an ugly Openmoko revert for name
++ * changes in alsa configuration. This is mergeable
++ * with the future Linux version.
++ * We force the truncation again for now because we
++ * can't cope with mass breakage on alsa state files
++ * that are spread all over the different distros.
++ * FIXME: Remember to revert this change.
++ */
++
++ if (name_len > 32) {
++ printk(KERN_WARNING __FILE__ ":%d mixer name "
++ "'%s' truncated to 31 characters.\n",
++ __LINE__, path->long_name);
++ name_len = 32;
++ }
++
+ path->long_name[name_len - 1] = '\0';
+
+ path->kcontrol = snd_soc_cnew(&w->kcontrols[i], w,
+@@ -876,7 +894,7 @@
+ }
+
+ static int snd_soc_dapm_set_pin(struct snd_soc_codec *codec,
+- char *pin, int status)
++ const char *pin, int status)
+ {
+ struct snd_soc_dapm_widget *w;
+
+@@ -1396,6 +1414,76 @@
+ EXPORT_SYMBOL_GPL(snd_soc_dapm_put_value_enum_double);
+
+ /**
++ * snd_soc_dapm_info_pin_switch - Info for a pin switch
++ *
++ * @kcontrol: mixer control
++ * @uinfo: control element information
++ *
++ * Callback to provide information about a pin switch control.
++ */
++int snd_soc_dapm_info_pin_switch(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_info *uinfo)
++{
++ uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
++ uinfo->count = 1;
++ uinfo->value.integer.min = 0;
++ uinfo->value.integer.max = 1;
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(snd_soc_dapm_info_pin_switch);
++
++/**
++ * snd_soc_dapm_get_pin_switch - Get information for a pin switch
++ *
++ * @kcontrol: mixer control
++ * @ucontrol: Value
++ */
++int snd_soc_dapm_get_pin_switch(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
++ const char *pin = (const char *)kcontrol->private_value;
++
++ mutex_lock(&codec->mutex);
++
++ ucontrol->value.integer.value[0] =
++ snd_soc_dapm_get_pin_status(codec, pin);
++
++ mutex_unlock(&codec->mutex);
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(snd_soc_dapm_get_pin_switch);
++
++/**
++ * snd_soc_dapm_put_pin_switch - Set information for a pin switch
++ *
++ * @kcontrol: mixer control
++ * @ucontrol: Value
++ */
++int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
++ const char *pin = (const char *)kcontrol->private_value;
++
++ mutex_lock(&codec->mutex);
++
++ if (ucontrol->value.integer.value[0])
++ snd_soc_dapm_enable_pin(codec, pin);
++ else
++ snd_soc_dapm_disable_pin(codec, pin);
++
++ snd_soc_dapm_sync(codec);
++
++ mutex_unlock(&codec->mutex);
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(snd_soc_dapm_put_pin_switch);
++
++/**
+ * snd_soc_dapm_new_control - create new dapm control
+ * @codec: audio codec
+ * @widget: widget template
+@@ -1549,7 +1637,7 @@
+ * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
+ * do any widget power switching.
+ */
+-int snd_soc_dapm_enable_pin(struct snd_soc_codec *codec, char *pin)
++int snd_soc_dapm_enable_pin(struct snd_soc_codec *codec, const char *pin)
+ {
+ return snd_soc_dapm_set_pin(codec, pin, 1);
+ }
+@@ -1564,7 +1652,7 @@
+ * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
+ * do any widget power switching.
+ */
+-int snd_soc_dapm_disable_pin(struct snd_soc_codec *codec, char *pin)
++int snd_soc_dapm_disable_pin(struct snd_soc_codec *codec, const char *pin)
+ {
+ return snd_soc_dapm_set_pin(codec, pin, 0);
+ }
+@@ -1584,7 +1672,7 @@
+ * NOTE: snd_soc_dapm_sync() needs to be called after this for DAPM to
+ * do any widget power switching.
+ */
+-int snd_soc_dapm_nc_pin(struct snd_soc_codec *codec, char *pin)
++int snd_soc_dapm_nc_pin(struct snd_soc_codec *codec, const char *pin)
+ {
+ return snd_soc_dapm_set_pin(codec, pin, 0);
+ }
+@@ -1599,7 +1687,7 @@
+ *
+ * Returns 1 for connected otherwise 0.
+ */
+-int snd_soc_dapm_get_pin_status(struct snd_soc_codec *codec, char *pin)
++int snd_soc_dapm_get_pin_status(struct snd_soc_codec *codec, const char *pin)
+ {
+ struct snd_soc_dapm_widget *w;
+
+@@ -1613,6 +1701,56 @@
+ EXPORT_SYMBOL_GPL(snd_soc_dapm_get_pin_status);
+
+ /**
++ * snd_soc_dapm_get_endpoint - get audio endpoint status
++ * @codec: audio codec
++ * @endpoint: audio signal endpoint (or start point)
++ *
++ * Get audio endpoint status - connected or disconnected.
++ *
++ * Returns status
++ */
++int snd_soc_dapm_get_endpoint(struct snd_soc_codec *codec,
++ char *endpoint)
++{
++ struct snd_soc_dapm_widget *w;
++
++ list_for_each_entry(w, &codec->dapm_widgets, list) {
++ if (!strcmp(w->name, endpoint)) {
++ return w->connected;
++ }
++ }
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(snd_soc_dapm_get_endpoint);
++
++/**
++ * snd_soc_dapm_set_endpoint - set audio endpoint status
++ * @codec: audio codec
++ * @endpoint: audio signal endpoint (or start point)
++ * @status: point status
++ *
++ * Set audio endpoint status - connected or disconnected.
++ *
++ * Returns 0 for success else error.
++ */
++int snd_soc_dapm_set_endpoint(struct snd_soc_codec *codec,
++ char *endpoint, int status)
++{
++ struct snd_soc_dapm_widget *w;
++
++ list_for_each_entry(w, &codec->dapm_widgets, list) {
++ if (!strcmp(w->name, endpoint)) {
++ w->connected = status;
++ return 0;
++ }
++ }
++
++ return -ENODEV;
++}
++EXPORT_SYMBOL_GPL(snd_soc_dapm_set_endpoint);
++
++/**
+ * snd_soc_dapm_free - free dapm resources
+ * @socdev: SoC device
+ *
diff --git a/target/linux/s3c24xx/patches-2.6.29/002-call-preinit-instead-of-init.patch b/target/linux/s3c24xx/patches-2.6.29/002-call-preinit-instead-of-init.patch
new file mode 100644
index 0000000000..8ab3a5ce32
--- /dev/null
+++ b/target/linux/s3c24xx/patches-2.6.29/002-call-preinit-instead-of-init.patch
@@ -0,0 +1,10 @@
+--- a/init/main.c
++++ b/init/main.c
+@@ -825,6 +825,7 @@ static int noinline init_post(void)
+ printk(KERN_WARNING "Failed to execute %s. Attempting "
+ "defaults...\n", execute_command);
+ }
++ run_init_process("/etc/preinit");
+ run_init_process("/sbin/init");
+ run_init_process("/etc/init");
+ run_init_process("/bin/init");